@plait/mind 0.2.0-next.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 (125) hide show
  1. package/README.md +24 -0
  2. package/constants/default.d.ts +12 -0
  3. package/constants/index.d.ts +2 -0
  4. package/constants/node.d.ts +17 -0
  5. package/draw/abstract.d.ts +4 -0
  6. package/draw/indented-link.d.ts +3 -0
  7. package/draw/link/abstract-link.d.ts +3 -0
  8. package/draw/link/logic-link.d.ts +3 -0
  9. package/draw/link.d.ts +3 -0
  10. package/draw/richtext.d.ts +14 -0
  11. package/draw/shape.d.ts +3 -0
  12. package/esm2020/constants/default.mjs +13 -0
  13. package/esm2020/constants/index.mjs +3 -0
  14. package/esm2020/constants/node.mjs +19 -0
  15. package/esm2020/draw/abstract.mjs +48 -0
  16. package/esm2020/draw/indented-link.mjs +44 -0
  17. package/esm2020/draw/link/abstract-link.mjs +42 -0
  18. package/esm2020/draw/link/logic-link.mjs +51 -0
  19. package/esm2020/draw/link.mjs +158 -0
  20. package/esm2020/draw/richtext.mjs +35 -0
  21. package/esm2020/draw/shape.mjs +18 -0
  22. package/esm2020/interfaces/abstract.mjs +6 -0
  23. package/esm2020/interfaces/element-data.mjs +2 -0
  24. package/esm2020/interfaces/element.mjs +59 -0
  25. package/esm2020/interfaces/index.mjs +6 -0
  26. package/esm2020/interfaces/layout.mjs +19 -0
  27. package/esm2020/interfaces/node.mjs +23 -0
  28. package/esm2020/interfaces/types.mjs +13 -0
  29. package/esm2020/layout-option.mjs +72 -0
  30. package/esm2020/mind.component.mjs +50 -0
  31. package/esm2020/mind.module.mjs +21 -0
  32. package/esm2020/node.component.mjs +742 -0
  33. package/esm2020/plait-mind.mjs +5 -0
  34. package/esm2020/plugins/emoji/emoji-base.component.mjs +21 -0
  35. package/esm2020/plugins/emoji/emoji.drawer.mjs +79 -0
  36. package/esm2020/plugins/emoji/emoji.mjs +15 -0
  37. package/esm2020/plugins/emoji/index.mjs +4 -0
  38. package/esm2020/plugins/emoji/with-mind-emoji.mjs +8 -0
  39. package/esm2020/plugins/with-abstract.mjs +92 -0
  40. package/esm2020/plugins/with-dnd.mjs +276 -0
  41. package/esm2020/plugins/with-mind.mjs +183 -0
  42. package/esm2020/public-api.mjs +14 -0
  43. package/esm2020/queries/get-available-sublayouts-by-element.mjs +29 -0
  44. package/esm2020/queries/get-branch-mindmap-layouts-by-element.mjs +18 -0
  45. package/esm2020/queries/get-correct-layout-by-element.mjs +50 -0
  46. package/esm2020/queries/get-layout-by-element.mjs +16 -0
  47. package/esm2020/queries/get-layout-parent-by-element.mjs +17 -0
  48. package/esm2020/queries/index.mjs +13 -0
  49. package/esm2020/transforms/index.mjs +10 -0
  50. package/esm2020/transforms/layout.mjs +23 -0
  51. package/esm2020/transforms/node.mjs +44 -0
  52. package/esm2020/utils/abstract/common.mjs +25 -0
  53. package/esm2020/utils/abstract/resize.mjs +169 -0
  54. package/esm2020/utils/clipboard.mjs +71 -0
  55. package/esm2020/utils/colors.mjs +41 -0
  56. package/esm2020/utils/direction-corrector.mjs +54 -0
  57. package/esm2020/utils/direction-detector.mjs +56 -0
  58. package/esm2020/utils/draw-placeholder.mjs +311 -0
  59. package/esm2020/utils/drop-target-corrector.mjs +86 -0
  60. package/esm2020/utils/graph.mjs +24 -0
  61. package/esm2020/utils/index.mjs +14 -0
  62. package/esm2020/utils/is-virtual-key.mjs +13 -0
  63. package/esm2020/utils/layout.mjs +105 -0
  64. package/esm2020/utils/mindmap.mjs +295 -0
  65. package/esm2020/utils/node-space.mjs +72 -0
  66. package/esm2020/utils/node.mjs +6 -0
  67. package/esm2020/utils/path.mjs +11 -0
  68. package/esm2020/utils/point-placement.mjs +99 -0
  69. package/esm2020/utils/shape.mjs +17 -0
  70. package/esm2020/utils/weak-maps.mjs +3 -0
  71. package/fesm2015/plait-mind.mjs +3583 -0
  72. package/fesm2015/plait-mind.mjs.map +1 -0
  73. package/fesm2020/plait-mind.mjs +3595 -0
  74. package/fesm2020/plait-mind.mjs.map +1 -0
  75. package/index.d.ts +5 -0
  76. package/interfaces/abstract.d.ts +4 -0
  77. package/interfaces/element-data.d.ts +11 -0
  78. package/interfaces/element.d.ts +39 -0
  79. package/interfaces/index.d.ts +5 -0
  80. package/interfaces/layout.d.ts +10 -0
  81. package/interfaces/node.d.ts +33 -0
  82. package/interfaces/types.d.ts +11 -0
  83. package/layout-option.d.ts +2 -0
  84. package/mind.component.d.ts +16 -0
  85. package/mind.module.d.ts +11 -0
  86. package/node.component.d.ts +60 -0
  87. package/package.json +31 -0
  88. package/plugins/emoji/emoji-base.component.d.ts +12 -0
  89. package/plugins/emoji/emoji.d.ts +6 -0
  90. package/plugins/emoji/emoji.drawer.d.ts +22 -0
  91. package/plugins/emoji/index.d.ts +3 -0
  92. package/plugins/emoji/with-mind-emoji.d.ts +8 -0
  93. package/plugins/with-abstract.d.ts +2 -0
  94. package/plugins/with-dnd.d.ts +11 -0
  95. package/plugins/with-mind.d.ts +2 -0
  96. package/public-api.d.ts +10 -0
  97. package/queries/get-available-sublayouts-by-element.d.ts +8 -0
  98. package/queries/get-branch-mindmap-layouts-by-element.d.ts +3 -0
  99. package/queries/get-correct-layout-by-element.d.ts +9 -0
  100. package/queries/get-layout-by-element.d.ts +3 -0
  101. package/queries/get-layout-parent-by-element.d.ts +8 -0
  102. package/queries/index.d.ts +7 -0
  103. package/styles/styles.scss +99 -0
  104. package/transforms/index.d.ts +7 -0
  105. package/transforms/layout.d.ts +3 -0
  106. package/transforms/node.d.ts +8 -0
  107. package/utils/abstract/common.d.ts +5 -0
  108. package/utils/abstract/resize.d.ts +21 -0
  109. package/utils/clipboard.d.ts +7 -0
  110. package/utils/colors.d.ts +4 -0
  111. package/utils/direction-corrector.d.ts +3 -0
  112. package/utils/direction-detector.d.ts +9 -0
  113. package/utils/draw-placeholder.d.ts +42 -0
  114. package/utils/drop-target-corrector.d.ts +8 -0
  115. package/utils/graph.d.ts +5 -0
  116. package/utils/index.d.ts +13 -0
  117. package/utils/is-virtual-key.d.ts +1 -0
  118. package/utils/layout.d.ts +12 -0
  119. package/utils/mindmap.d.ts +33 -0
  120. package/utils/node-space.d.ts +9 -0
  121. package/utils/node.d.ts +2 -0
  122. package/utils/path.d.ts +4 -0
  123. package/utils/point-placement.d.ts +8 -0
  124. package/utils/shape.d.ts +3 -0
  125. package/utils/weak-maps.d.ts +5 -0
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhaXQtbWluZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3BhY2thZ2VzL21pbmQvc3JjL3BsYWl0LW1pbmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -0,0 +1,21 @@
1
+ import { Directive, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class MindEmojiBaseComponent {
4
+ get nativeElement() {
5
+ return this.elementRef.nativeElement;
6
+ }
7
+ constructor(elementRef) {
8
+ this.elementRef = elementRef;
9
+ this.fontSize = 14;
10
+ }
11
+ }
12
+ MindEmojiBaseComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: MindEmojiBaseComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
13
+ MindEmojiBaseComponent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.5", type: MindEmojiBaseComponent, inputs: { fontSize: "fontSize", emojiItem: "emojiItem" }, ngImport: i0 });
14
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: MindEmojiBaseComponent, decorators: [{
15
+ type: Directive
16
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { fontSize: [{
17
+ type: Input
18
+ }], emojiItem: [{
19
+ type: Input
20
+ }] } });
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1vamktYmFzZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9taW5kL3NyYy9wbHVnaW5zL2Vtb2ppL2Vtb2ppLWJhc2UuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUk3RCxNQUFNLE9BQU8sc0JBQXNCO0lBTy9CLElBQUksYUFBYTtRQUNiLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7SUFDekMsQ0FBQztJQUVELFlBQXNCLFVBQW1DO1FBQW5DLGVBQVUsR0FBVixVQUFVLENBQXlCO1FBVHpELGFBQVEsR0FBVyxFQUFFLENBQUM7SUFTc0MsQ0FBQzs7bUhBWHBELHNCQUFzQjt1R0FBdEIsc0JBQXNCOzJGQUF0QixzQkFBc0I7a0JBRGxDLFNBQVM7aUdBR04sUUFBUTtzQkFEUCxLQUFLO2dCQUlOLFNBQVM7c0JBRFIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEVtb2ppSXRlbSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZWxlbWVudC1kYXRhJztcblxuQERpcmVjdGl2ZSgpXG5leHBvcnQgY2xhc3MgTWluZEVtb2ppQmFzZUNvbXBvbmVudCB7XG4gICAgQElucHV0KClcbiAgICBmb250U2l6ZTogbnVtYmVyID0gMTQ7XG5cbiAgICBASW5wdXQoKVxuICAgIGVtb2ppSXRlbSE6IEVtb2ppSXRlbTtcblxuICAgIGdldCBuYXRpdmVFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KSB7fVxufVxuIl19
@@ -0,0 +1,79 @@
1
+ import { MindElement, PlaitMind } from '../../interfaces';
2
+ import { createForeignObject } from '@plait/richtext';
3
+ import { createG } from '@plait/core';
4
+ import { getRectangleByNode } from '../../utils/graph';
5
+ import { getEmojiFontSize, getEmojisRectangle } from './emoji';
6
+ import { NodeSpace } from '../../utils/node-space';
7
+ export class EmojiDrawer {
8
+ constructor(board, viewContainerRef) {
9
+ this.board = board;
10
+ this.viewContainerRef = viewContainerRef;
11
+ this.componentRef = null;
12
+ }
13
+ draw(emoji, element) {
14
+ this.destroy();
15
+ const componentType = this.board.drawEmoji(emoji, element);
16
+ this.componentRef = this.viewContainerRef.createComponent(componentType);
17
+ this.componentRef.instance.emojiItem = emoji;
18
+ const fontSize = PlaitMind.isMind(element) ? 18 : 14;
19
+ this.componentRef.instance.fontSize = fontSize;
20
+ }
21
+ get nativeElement() {
22
+ if (this.componentRef) {
23
+ return this.componentRef.instance.nativeElement;
24
+ }
25
+ else {
26
+ return null;
27
+ }
28
+ }
29
+ destroy() {
30
+ if (this.componentRef) {
31
+ this.componentRef.destroy();
32
+ this.componentRef = null;
33
+ }
34
+ }
35
+ }
36
+ export class EmojisDrawer {
37
+ constructor(board, viewContainerRef) {
38
+ this.board = board;
39
+ this.viewContainerRef = viewContainerRef;
40
+ this.emojiDrawers = [];
41
+ }
42
+ drawEmojis(element) {
43
+ this.destroy();
44
+ if (MindElement.hasEmojis(element)) {
45
+ const node = MindElement.getNode(element);
46
+ this.g = createG();
47
+ this.g.classList.add('emojis');
48
+ let { x, y } = getRectangleByNode(MindElement.getNode(element));
49
+ x = x + NodeSpace.getEmojiHorizontalSpace(element);
50
+ y = y + NodeSpace.getEmojiVerticalSpace(element);
51
+ const { width, height } = getEmojisRectangle(element);
52
+ const fontSize = getEmojiFontSize(element);
53
+ const foreignObject = createForeignObject(x, y, width, height);
54
+ this.g.append(foreignObject);
55
+ const container = document.createElement('div');
56
+ container.classList.add('node-emojis-container');
57
+ container.classList.add(`emoji-font-size-${fontSize}`);
58
+ foreignObject.append(container);
59
+ this.emojiDrawers = element.data.emojis.map(emojiItem => {
60
+ const drawer = new EmojiDrawer(this.board, this.viewContainerRef);
61
+ drawer.draw(emojiItem, element);
62
+ return drawer;
63
+ });
64
+ this.emojiDrawers.forEach(drawer => {
65
+ container.append(drawer.nativeElement);
66
+ });
67
+ return this.g;
68
+ }
69
+ return undefined;
70
+ }
71
+ destroy() {
72
+ if (this.g) {
73
+ this.g.remove();
74
+ }
75
+ this.emojiDrawers.forEach(drawer => drawer.destroy());
76
+ this.emojiDrawers = [];
77
+ }
78
+ }
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1vamkuZHJhd2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbWluZC9zcmMvcGx1Z2lucy9lbW9qaS9lbW9qaS5kcmF3ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFhLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUdyRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUMvRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFbkQsTUFBTSxPQUFPLFdBQVc7SUFHcEIsWUFBb0IsS0FBMEIsRUFBVSxnQkFBa0M7UUFBdEUsVUFBSyxHQUFMLEtBQUssQ0FBcUI7UUFBVSxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBRjFGLGlCQUFZLEdBQWdELElBQUksQ0FBQztJQUU0QixDQUFDO0lBRTlGLElBQUksQ0FBQyxLQUFnQixFQUFFLE9BQW9CO1FBQ3ZDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNmLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUM3QyxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FB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LE1BQU0sQ0FBQyxNQUFNLENBQUMsYUFBYyxDQUFDLENBQUM7WUFDNUMsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDakI7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0lBRUQsT0FBTztRQUNILElBQUksSUFBSSxDQUFDLENBQUMsRUFBRTtZQUNSLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDbkI7UUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO0lBQzNCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudFJlZiwgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRW1vamlJdGVtLCBNaW5kRWxlbWVudCwgUGxhaXRNaW5kIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBNaW5kRW1vamlCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi9lbW9qaS1iYXNlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQbGFpdE1pbmRFbW9qaUJvYXJkIH0gZnJvbSAnLi93aXRoLW1pbmQtZW1vamknO1xuaW1wb3J0IHsgY3JlYXRlRm9yZWlnbk9iamVjdCB9IGZyb20gJ0BwbGFpdC9yaWNodGV4dCc7XG5pbXBvcnQgeyBjcmVhdGVHIH0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuaW1wb3J0IHsgZ2V0UmVjdGFuZ2xlQnlOb2RlIH0gZnJvbSAnLi4vLi4vdXRpbHMvZ3JhcGgnO1xuaW1wb3J0IHsgZ2V0RW1vamlGb250U2l6ZSwgZ2V0RW1vamlzUmVjdGFuZ2xlIH0gZnJvbSAnLi9lbW9qaSc7XG5pbXBvcnQgeyBOb2RlU3BhY2UgfSBmcm9tICcuLi8uLi91dGlscy9ub2RlLXNwYWNlJztcblxuZXhwb3J0IGNsYXNzIEVtb2ppRHJhd2VyIHtcbiAgICBjb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxNaW5kRW1vamlCYXNlQ29tcG9uZW50PiB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBib2FyZDogUGxhaXRNaW5kRW1vamlCb2FyZCwgcHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmKSB7fVxuXG4gICAgZHJhdyhlbW9qaTogRW1vamlJdGVtLCBlbGVtZW50OiBNaW5kRWxlbWVudCkge1xuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50VHlwZSA9IHRoaXMuYm9hcmQuZHJhd0Vtb2ppKGVtb2ppLCBlbGVtZW50KTtcbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWYgPSB0aGlzLnZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudFR5cGUpO1xuICAgICAgICB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5lbW9qaUl0ZW0gPSBlbW9qaTtcbiAgICAgICAgY29uc3QgZm9udFNpemUgPSBQbGFpdE1pbmQuaXNNaW5kKGVsZW1lbnQpID8gMTggOiAxNDtcbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UuZm9udFNpemUgPSBmb250U2l6ZTtcbiAgICB9XG5cbiAgICBnZXQgbmF0aXZlRWxlbWVudCgpIHtcbiAgICAgICAgaWYgKHRoaXMuY29tcG9uZW50UmVmKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UubmF0aXZlRWxlbWVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuY29tcG9uZW50UmVmKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudFJlZi5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudFJlZiA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFbW9qaXNEcmF3ZXIge1xuICAgIGVtb2ppRHJhd2VyczogRW1vamlEcmF3ZXJbXSA9IFtdO1xuXG4gICAgZz86IFNWR0dFbGVtZW50O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBib2FyZDogUGxhaXRNaW5kRW1vamlCb2FyZCwgcHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmKSB7fVxuXG4gICAgZHJhd0Vtb2ppcyhlbGVtZW50OiBNaW5kRWxlbWVudCkge1xuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgaWYgKE1pbmRFbGVtZW50Lmhhc0Vtb2ppcyhlbGVtZW50KSkge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IE1pbmRFbGVtZW50LmdldE5vZGUoZWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzLmcgPSBjcmVhdGVHKCk7XG4gICAgICAgICAgICB0aGlzLmcuY2xhc3NMaXN0LmFkZCgnZW1vamlzJyk7XG4gICAgICAgICAgICBsZXQgeyB4LCB5IH0gPSBnZXRSZWN0YW5nbGVCeU5vZGUoTWluZEVsZW1lbnQuZ2V0Tm9kZShlbGVtZW50KSk7XG4gICAgICAgICAgICB4ID0geCArIE5vZGVTcGFjZS5nZXRFbW9qaUhvcml6b250YWxTcGFjZShlbGVtZW50KTtcbiAgICAgICAgICAgIHkgPSB5ICsgTm9kZVNwYWNlLmdldEVtb2ppVmVydGljYWxTcGFjZShlbGVtZW50KTtcbiAgICAgICAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gZ2V0RW1vamlzUmVjdGFuZ2xlKGVsZW1lbnQpO1xuICAgICAgICAgICAgY29uc3QgZm9udFNpemUgPSBnZXRFbW9qaUZvbnRTaXplKGVsZW1lbnQpO1xuICAgICAgICAgICAgY29uc3QgZm9yZWlnbk9iamVjdCA9IGNyZWF0ZUZvcmVpZ25PYmplY3QoeCwgeSwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgICAgICB0aGlzLmcuYXBwZW5kKGZvcmVpZ25PYmplY3QpO1xuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbm9kZS1lbW9qaXMtY29udGFpbmVyJyk7XG4gICAgICAgICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZChgZW1vamktZm9udC1zaXplLSR7Zm9udFNpemV9YCk7XG4gICAgICAgICAgICBmb3JlaWduT2JqZWN0LmFwcGVuZChjb250YWluZXIpO1xuICAgICAgICAgICAgdGhpcy5lbW9qaURyYXdlcnMgPSBlbGVtZW50LmRhdGEuZW1vamlzLm1hcChlbW9qaUl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRyYXdlciA9IG5ldyBFbW9qaURyYXdlcih0aGlzLmJvYXJkLCB0aGlzLnZpZXdDb250YWluZXJSZWYpO1xuICAgICAgICAgICAgICAgIGRyYXdlci5kcmF3KGVtb2ppSXRlbSwgZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRyYXdlcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5lbW9qaURyYXdlcnMuZm9yRWFjaChkcmF3ZXIgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmQoZHJhd2VyLm5hdGl2ZUVsZW1lbnQhKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLmcpIHtcbiAgICAgICAgICAgIHRoaXMuZy5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVtb2ppRHJhd2Vycy5mb3JFYWNoKGRyYXdlciA9PiBkcmF3ZXIuZGVzdHJveSgpKTtcbiAgICAgICAgdGhpcy5lbW9qaURyYXdlcnMgPSBbXTtcbiAgICB9XG59XG4iXX0=
@@ -0,0 +1,15 @@
1
+ import { PlaitMind } from '../../interfaces';
2
+ export function getEmojisRectangle(element) {
3
+ const count = element.data.emojis.length;
4
+ const fontSize = getEmojiFontSize(element);
5
+ return { width: fontSize * count, height: fontSize * 1.5 };
6
+ }
7
+ export function getEmojiFontSize(element) {
8
+ if (PlaitMind.isMind(element)) {
9
+ return 18;
10
+ }
11
+ else {
12
+ return 14;
13
+ }
14
+ }
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1vamkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9taW5kL3NyYy9wbHVnaW5zL2Vtb2ppL2Vtb2ppLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBMEIsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFckUsTUFBTSxVQUFVLGtCQUFrQixDQUFDLE9BQStCO0lBQzlELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUN6QyxNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMzQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsR0FBRyxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUMvRCxDQUFDO0FBRUQsTUFBTSxVQUFVLGdCQUFnQixDQUFDLE9BQStCO0lBQzVELElBQUksU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUMzQixPQUFPLEVBQUUsQ0FBQztLQUNiO1NBQU07UUFDSCxPQUFPLEVBQUUsQ0FBQztLQUNiO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVtb2ppRGF0YSwgTWluZEVsZW1lbnQsIFBsYWl0TWluZCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW1vamlzUmVjdGFuZ2xlKGVsZW1lbnQ6IE1pbmRFbGVtZW50PEVtb2ppRGF0YT4pIHtcbiAgICBjb25zdCBjb3VudCA9IGVsZW1lbnQuZGF0YS5lbW9qaXMubGVuZ3RoO1xuICAgIGNvbnN0IGZvbnRTaXplID0gZ2V0RW1vamlGb250U2l6ZShlbGVtZW50KTtcbiAgICByZXR1cm4geyB3aWR0aDogZm9udFNpemUgKiBjb3VudCwgaGVpZ2h0OiBmb250U2l6ZSAqIDEuNSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW1vamlGb250U2l6ZShlbGVtZW50OiBNaW5kRWxlbWVudDxFbW9qaURhdGE+KSB7XG4gICAgaWYgKFBsYWl0TWluZC5pc01pbmQoZWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuIDE4O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAxNDtcbiAgICB9XG59XG4iXX0=
@@ -0,0 +1,4 @@
1
+ export * from './with-mind-emoji';
2
+ export * from './emoji';
3
+ export * from './emoji-base.component';
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9taW5kL3NyYy9wbHVnaW5zL2Vtb2ppL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxTQUFTLENBQUM7QUFDeEIsY0FBYyx3QkFBd0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vd2l0aC1taW5kLWVtb2ppJztcbmV4cG9ydCAqIGZyb20gJy4vZW1vamknO1xuZXhwb3J0ICogZnJvbSAnLi9lbW9qaS1iYXNlLmNvbXBvbmVudCc7Il19
@@ -0,0 +1,8 @@
1
+ export const withEmoji = (board) => {
2
+ const newBoard = board;
3
+ newBoard.drawEmoji = (emoji, element) => {
4
+ throw new Error('Not implement drawEmoji method error.');
5
+ };
6
+ return newBoard;
7
+ };
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1taW5kLWVtb2ppLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbWluZC9zcmMvcGx1Z2lucy9lbW9qaS93aXRoLW1pbmQtZW1vamkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBU0EsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLENBQUMsS0FBaUIsRUFBRSxFQUFFO0lBQzNDLE1BQU0sUUFBUSxHQUFHLEtBQXlDLENBQUM7SUFFM0QsUUFBUSxDQUFDLFNBQVMsR0FBRyxDQUFDLEtBQWdCLEVBQUUsT0FBb0IsRUFBRSxFQUFFO1FBQzVELE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQztJQUM3RCxDQUFDLENBQUE7SUFFRCxPQUFPLFFBQVEsQ0FBQztBQUNwQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnRUeXBlLCBQbGFpdEJvYXJkLCBQbGFpdFBsdWdpbiB9IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7IE1pbmRFbGVtZW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9lbGVtZW50JztcbmltcG9ydCB7IEVtb2ppSXRlbSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZWxlbWVudC1kYXRhJztcbmltcG9ydCB7IE1pbmRFbW9qaUJhc2VDb21wb25lbnQgfSBmcm9tICcuL2Vtb2ppLWJhc2UuY29tcG9uZW50JztcblxuZXhwb3J0IGludGVyZmFjZSBQbGFpdE1pbmRFbW9qaUJvYXJkIGV4dGVuZHMgUGxhaXRCb2FyZCB7XG4gICAgZHJhd0Vtb2ppOiAoZW1vamk6IEVtb2ppSXRlbSwgZWxlbWVudDogTWluZEVsZW1lbnQpID0+IENvbXBvbmVudFR5cGU8TWluZEVtb2ppQmFzZUNvbXBvbmVudD47XG59XG5cbmV4cG9ydCBjb25zdCB3aXRoRW1vamkgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQpID0+IHtcbiAgICBjb25zdCBuZXdCb2FyZCA9IGJvYXJkIGFzIFBsYWl0Qm9hcmQgJiBQbGFpdE1pbmRFbW9qaUJvYXJkO1xuXG4gICAgbmV3Qm9hcmQuZHJhd0Vtb2ppID0gKGVtb2ppOiBFbW9qaUl0ZW0sIGVsZW1lbnQ6IE1pbmRFbGVtZW50KSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudCBkcmF3RW1vamkgbWV0aG9kIGVycm9yLicpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXdCb2FyZDtcbn07Il19
@@ -0,0 +1,92 @@
1
+ import { BOARD_TO_HOST, PlaitBoard, PlaitElement, Transforms, getSelectedElements, toPoint, transformPoint } from '@plait/core';
2
+ import { AbstractNode, isHorizontalLayout, isStandardLayout } from '@plait/layouts';
3
+ import { AbstractHandlePosition, MindElement } from '../interfaces';
4
+ import { MindmapQueries } from '../public-api';
5
+ import { findLocationLeftIndex, getHitAbstractHandle, getLocationScope } from '../utils/abstract/resize';
6
+ import { separateChildren } from '../utils/abstract/common';
7
+ export const withAbstract = (board) => {
8
+ const { mousedown, mousemove, mouseup } = board;
9
+ let activeAbstractElement;
10
+ let abstractHandlePosition;
11
+ let startPoint;
12
+ let newProperty;
13
+ board.mousedown = (event) => {
14
+ const activeAbstractElements = getSelectedElements(board).filter(element => AbstractNode.isAbstract(element));
15
+ const host = BOARD_TO_HOST.get(board);
16
+ const point = transformPoint(board, toPoint(event.x, event.y, host));
17
+ activeAbstractElement = activeAbstractElements.find(element => {
18
+ abstractHandlePosition = getHitAbstractHandle(board, element, point);
19
+ return abstractHandlePosition;
20
+ });
21
+ if (activeAbstractElement) {
22
+ startPoint = point;
23
+ return;
24
+ }
25
+ mousedown(event);
26
+ };
27
+ board.mousemove = (event) => {
28
+ getSelectedElements(board);
29
+ const host = BOARD_TO_HOST.get(board);
30
+ const endPoint = transformPoint(board, toPoint(event.x, event.y, host));
31
+ if (abstractHandlePosition && activeAbstractElement) {
32
+ const abstractComponent = PlaitElement.getComponent(activeAbstractElement);
33
+ const element = abstractComponent.element;
34
+ const nodeLayout = MindmapQueries.getCorrectLayoutByElement(activeAbstractElement);
35
+ const isHorizontal = isHorizontalLayout(nodeLayout);
36
+ const parentElement = MindElement.getParent(element);
37
+ let children = parentElement.children;
38
+ const parentLayout = MindmapQueries.getLayoutByElement(parentElement);
39
+ if (isStandardLayout(parentLayout)) {
40
+ const rightNodeCount = parentElement.rightNodeCount;
41
+ const { leftChildren, rightChildren } = separateChildren(parentElement);
42
+ if (activeAbstractElement.end < rightNodeCount) {
43
+ children = rightChildren;
44
+ }
45
+ if (activeAbstractElement.start >= rightNodeCount) {
46
+ children = leftChildren;
47
+ }
48
+ }
49
+ const resizingLocation = isHorizontal ? endPoint[1] : endPoint[0];
50
+ const parent = MindElement.getNode(parentElement);
51
+ const scope = getLocationScope(board, abstractHandlePosition, children, element, parent, isHorizontal);
52
+ const location = Math.min(scope.max, Math.max(scope.min, resizingLocation));
53
+ let locationIndex = findLocationLeftIndex(board, children, location, isHorizontal);
54
+ const isPropertyUnchanged = (abstractHandlePosition === AbstractHandlePosition.start &&
55
+ locationIndex + 1 === activeAbstractElement.start) ||
56
+ (abstractHandlePosition === AbstractHandlePosition.end && locationIndex === activeAbstractElement.end);
57
+ if (isPropertyUnchanged) {
58
+ newProperty = undefined;
59
+ }
60
+ else {
61
+ if (isStandardLayout(parent.layout)) {
62
+ const rightNodeCount = parent.origin.rightNodeCount;
63
+ let start = element.start;
64
+ if (start >= rightNodeCount) {
65
+ locationIndex += rightNodeCount;
66
+ }
67
+ }
68
+ newProperty =
69
+ abstractHandlePosition === AbstractHandlePosition.start ? { start: locationIndex + 1 } : { end: locationIndex };
70
+ }
71
+ abstractComponent.updateAbstractIncludedOutline(location, abstractHandlePosition);
72
+ }
73
+ mousemove(event);
74
+ };
75
+ board.mouseup = (event) => {
76
+ startPoint = undefined;
77
+ abstractHandlePosition = null;
78
+ if (activeAbstractElement) {
79
+ if (newProperty) {
80
+ const path = PlaitBoard.findPath(board, activeAbstractElement);
81
+ Transforms.setNode(board, newProperty, path);
82
+ }
83
+ else {
84
+ const abstractComponent = PlaitElement.getComponent(activeAbstractElement);
85
+ abstractComponent.updateAbstractIncludedOutline();
86
+ }
87
+ }
88
+ mouseup(event);
89
+ };
90
+ return board;
91
+ };
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1hYnN0cmFjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL21pbmQvc3JjL3BsdWdpbnMvd2l0aC1hYnN0cmFjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsYUFBYSxFQUNiLFVBQVUsRUFDVixZQUFZLEVBR1osVUFBVSxFQUNWLG1CQUFtQixFQUNuQixPQUFPLEVBQ1AsY0FBYyxFQUNqQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsWUFBWSxFQUFpQyxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ILE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEUsT0FBTyxFQUFxQixjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLG9CQUFvQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDekcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFNUQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFnQixDQUFDLEtBQWlCLEVBQUUsRUFBRTtJQUMzRCxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsR0FBRyxLQUFLLENBQUM7SUFDaEQsSUFBSSxxQkFBK0MsQ0FBQztJQUNwRCxJQUFJLHNCQUFxRCxDQUFDO0lBQzFELElBQUksVUFBNkIsQ0FBQztJQUNsQyxJQUFJLFdBQTRELENBQUM7SUFFakUsS0FBSyxDQUFDLFNBQVMsR0FBRyxDQUFDLEtBQWlCLEVBQUUsRUFBRTtRQUNwQyxNQUFNLHNCQUFzQixHQUFHLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztR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QUU7WUFDdkIsSUFBSSxXQUFXLEVBQUU7Z0JBQ2IsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUscUJBQXFCLENBQUMsQ0FBQztnQkFDL0QsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQ2hEO2lCQUFNO2dCQUNILE1BQU0saUJBQWlCLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsQ0FBc0IsQ0FBQztnQkFDaEcsaUJBQWtCLENBQUMsNkJBQTZCLEVBQUUsQ0FBQzthQUN0RDtTQUNKO1FBQ0QsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25CLENBQUMsQ0FBQztJQUNGLE9BQU8sS0FBSyxDQUFDO0FBQ2pCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQk9BUkRfVE9fSE9TVCxcbiAgICBQbGFpdEJvYXJkLFxuICAgIFBsYWl0RWxlbWVudCxcbiAgICBQbGFpdFBsdWdpbixcbiAgICBQb2ludCxcbiAgICBUcmFuc2Zvcm1zLFxuICAgIGdldFNlbGVjdGVkRWxlbWVudHMsXG4gICAgdG9Qb2ludCxcbiAgICB0cmFuc2Zvcm1Qb2ludFxufSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdE5vZGUsIExheW91dE5vZGUsIE1pbmRtYXBMYXlvdXRUeXBlLCBpc0hvcml6b250YWxMYXlvdXQsIGlzU3RhbmRhcmRMYXlvdXQgfSBmcm9tICdAcGxhaXQvbGF5b3V0cyc7XG5pbXBvcnQgeyBBYnN0cmFjdEhhbmRsZVBvc2l0aW9uLCBNaW5kRWxlbWVudCB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTWluZE5vZGVDb21wb25lbnQsIE1pbmRtYXBRdWVyaWVzIH0gZnJvbSAnLi4vcHVibGljLWFwaSc7XG5pbXBvcnQgeyBmaW5kTG9jYXRpb25MZWZ0SW5kZXgsIGdldEhpdEFic3RyYWN0SGFuZGxlLCBnZXRMb2NhdGlvblNjb3BlIH0gZnJvbSAnLi4vdXRpbHMvYWJzdHJhY3QvcmVzaXplJztcbmltcG9ydCB7IHNlcGFyYXRlQ2hpbGRyZW4gfSBmcm9tICcuLi91dGlscy9hYnN0cmFjdC9jb21tb24nO1xuXG5leHBvcnQgY29uc3Qgd2l0aEFic3RyYWN0OiBQbGFpdFBsdWdpbiA9IChib2FyZDogUGxhaXRCb2FyZCkgPT4ge1xuICAgIGNvbnN0IHsgbW91c2Vkb3duLCBtb3VzZW1vdmUsIG1vdXNldXAgfSA9IGJvYXJkO1xuICAgIGxldCBhY3RpdmVBYnN0cmFjdEVsZW1lbnQ6IFBsYWl0RWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICBsZXQgYWJzdHJhY3RIYW5kbGVQb3NpdGlvbjogQWJzdHJhY3RIYW5kbGVQb3NpdGlvbiB8IG51bGw7XG4gICAgbGV0IHN0YXJ0UG9pbnQ6IFBvaW50IHwgdW5kZWZpbmVkO1xuICAgIGxldCBuZXdQcm9wZXJ0eTogeyBlbmQ6IG51bWJlciB9IHwgeyBzdGFydDogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG5cbiAgICBib2FyZC5tb3VzZWRvd24gPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgYWN0aXZlQWJzdHJhY3RFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoYm9hcmQpLmZpbHRlcihlbGVtZW50ID0+IEFic3RyYWN0Tm9kZS5pc0Fic3RyYWN0KGVsZW1lbnQpKTtcbiAgICAgICAgY29uc3QgaG9zdCA9IEJPQVJEX1RPX0hPU1QuZ2V0KGJvYXJkKTtcbiAgICAgICAgY29uc3QgcG9pbnQgPSB0cmFuc2Zvcm1Qb2ludChib2FyZCwgdG9Qb2ludChldmVudC54LCBldmVudC55LCBob3N0ISkpO1xuXG4gICAgICAgIGFjdGl2ZUFic3RyYWN0RWxlbWVudCA9IGFjdGl2ZUFic3RyYWN0RWxlbWVudHMuZmluZChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgIGFic3RyYWN0SGFuZGxlUG9zaXRpb24gPSBnZXRIaXRBYnN0cmFjdEhhbmRsZShib2FyZCwgZWxlbWVudCBhcyBNaW5kRWxlbWVudCwgcG9pbnQpO1xuICAgICAgICAgICAgcmV0dXJuIGFic3RyYWN0SGFuZGxlUG9zaXRpb247XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChhY3RpdmVBYnN0cmFjdEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHN0YXJ0UG9pbnQgPSBwb2ludDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG1vdXNlZG93bihldmVudCk7XG4gICAgfTtcblxuICAgIGJvYXJkLm1vdXNlbW92ZSA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICBnZXRTZWxlY3RlZEVsZW1lbnRzKGJvYXJkKTtcbiAgICAgICAgY29uc3QgaG9zdCA9IEJPQVJEX1RPX0hPU1QuZ2V0KGJvYXJkKTtcbiAgICAgICAgY29uc3QgZW5kUG9pbnQgPSB0cmFuc2Zvcm1Qb2ludChib2FyZCwgdG9Qb2ludChldmVudC54LCBldmVudC55LCBob3N0ISkpO1xuXG4gICAgICAgIGlmIChhYnN0cmFjdEhhbmRsZVBvc2l0aW9uICYmIGFjdGl2ZUFic3RyYWN0RWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgYWJzdHJhY3RDb21wb25lbnQgPSBQbGFpdEVsZW1lbnQuZ2V0Q29tcG9uZW50KGFjdGl2ZUFic3RyYWN0RWxlbWVudCkgYXMgTWluZE5vZGVDb21wb25lbnQ7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gYWJzdHJhY3RDb21wb25lbnQuZWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IG5vZGVMYXlvdXQgPSBNaW5kbWFwUXVlcmllcy5nZXRDb3JyZWN0TGF5b3V0QnlFbGVtZW50KGFjdGl2ZUFic3RyYWN0RWxlbWVudCBhcyBNaW5kRWxlbWVudCkgYXMgTWluZG1hcExheW91dFR5cGU7XG4gICAgICAgICAgICBjb25zdCBpc0hvcml6b250YWwgPSBpc0hvcml6b250YWxMYXlvdXQobm9kZUxheW91dCk7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRFbGVtZW50ID0gTWluZEVsZW1lbnQuZ2V0UGFyZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgICBsZXQgY2hpbGRyZW4gPSBwYXJlbnRFbGVtZW50LmNoaWxkcmVuO1xuXG4gICAgICAgICAgICBjb25zdCBwYXJlbnRMYXlvdXQgPSBNaW5kbWFwUXVlcmllcy5nZXRMYXlvdXRCeUVsZW1lbnQocGFyZW50RWxlbWVudCk7XG4gICAgICAgICAgICBpZiAoaXNTdGFuZGFyZExheW91dChwYXJlbnRMYXlvdXQpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmlnaHROb2RlQ291bnQgPSBwYXJlbnRFbGVtZW50LnJpZ2h0Tm9kZUNvdW50ITtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGxlZnRDaGlsZHJlbiwgcmlnaHRDaGlsZHJlbiB9ID0gc2VwYXJhdGVDaGlsZHJlbihwYXJlbnRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAoKGFjdGl2ZUFic3RyYWN0RWxlbWVudCBhcyBNaW5kRWxlbWVudCkuZW5kISA8IHJpZ2h0Tm9kZUNvdW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gcmlnaHRDaGlsZHJlbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKChhY3RpdmVBYnN0cmFjdEVsZW1lbnQgYXMgTWluZEVsZW1lbnQpLnN0YXJ0ISA+PSByaWdodE5vZGVDb3VudCkge1xuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGxlZnRDaGlsZHJlbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc2l6aW5nTG9jYXRpb24gPSBpc0hvcml6b250YWwgPyBlbmRQb2ludFsxXSA6IGVuZFBvaW50WzBdO1xuICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gKE1pbmRFbGVtZW50LmdldE5vZGUocGFyZW50RWxlbWVudCkgYXMgdW5rbm93bikgYXMgTGF5b3V0Tm9kZTtcbiAgICAgICAgICAgIGNvbnN0IHNjb3BlID0gZ2V0TG9jYXRpb25TY29wZShib2FyZCwgYWJzdHJhY3RIYW5kbGVQb3NpdGlvbiwgY2hpbGRyZW4sIGVsZW1lbnQsIHBhcmVudCwgaXNIb3Jpem9udGFsKTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2F0aW9uID0gTWF0aC5taW4oc2NvcGUubWF4LCBNYXRoLm1heChzY29wZS5taW4sIHJlc2l6aW5nTG9jYXRpb24pKTtcblxuICAgICAgICAgICAgbGV0IGxvY2F0aW9uSW5kZXggPSBmaW5kTG9jYXRpb25MZWZ0SW5kZXgoYm9hcmQsIGNoaWxkcmVuLCBsb2NhdGlvbiwgaXNIb3Jpem9udGFsKTtcblxuICAgICAgICAgICAgY29uc3QgaXNQcm9wZXJ0eVVuY2hhbmdlZCA9XG4gICAgICAgICAgICAgICAgKGFic3RyYWN0SGFuZGxlUG9zaXRpb24gPT09IEFic3RyYWN0SGFuZGxlUG9zaXRpb24uc3RhcnQgJiZcbiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25JbmRleCArIDEgPT09IChhY3RpdmVBYnN0cmFjdEVsZW1lbnQgYXMgTWluZEVsZW1lbnQpLnN0YXJ0ISkgfHxcbiAgICAgICAgICAgICAgICAoYWJzdHJhY3RIYW5kbGVQb3NpdGlvbiA9PT0gQWJzdHJhY3RIYW5kbGVQb3NpdGlvbi5lbmQgJiYgbG9jYXRpb25JbmRleCA9PT0gKGFjdGl2ZUFic3RyYWN0RWxlbWVudCBhcyBNaW5kRWxlbWVudCkuZW5kISk7XG5cbiAgICAgICAgICAgIGlmIChpc1Byb3BlcnR5VW5jaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgbmV3UHJvcGVydHkgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChpc1N0YW5kYXJkTGF5b3V0KHBhcmVudC5sYXlvdXQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJpZ2h0Tm9kZUNvdW50ID0gcGFyZW50Lm9yaWdpbi5yaWdodE5vZGVDb3VudDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXJ0ID0gZWxlbWVudC5zdGFydCE7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFydCA+PSByaWdodE5vZGVDb3VudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25JbmRleCArPSByaWdodE5vZGVDb3VudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIG5ld1Byb3BlcnR5ID1cbiAgICAgICAgICAgICAgICAgICAgYWJzdHJhY3RIYW5kbGVQb3NpdGlvbiA9PT0gQWJzdHJhY3RIYW5kbGVQb3NpdGlvbi5zdGFydCA/IHsgc3RhcnQ6IGxvY2F0aW9uSW5kZXggKyAxIH0gOiB7IGVuZDogbG9jYXRpb25JbmRleCB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhYnN0cmFjdENvbXBvbmVudCEudXBkYXRlQWJzdHJhY3RJbmNsdWRlZE91dGxpbmUobG9jYXRpb24sIGFic3RyYWN0SGFuZGxlUG9zaXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIG1vdXNlbW92ZShldmVudCk7XG4gICAgfTtcblxuICAgIGJvYXJkLm1vdXNldXAgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgc3RhcnRQb2ludCA9IHVuZGVmaW5lZDtcbiAgICAgICAgYWJzdHJhY3RIYW5kbGVQb3NpdGlvbiA9IG51bGw7XG4gICAgICAgIGlmIChhY3RpdmVBYnN0cmFjdEVsZW1lbnQpIHtcbiAgICAgICAgICAgIGlmIChuZXdQcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSBQbGFpdEJvYXJkLmZpbmRQYXRoKGJvYXJkLCBhY3RpdmVBYnN0cmFjdEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMuc2V0Tm9kZShib2FyZCwgbmV3UHJvcGVydHksIHBhdGgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhYnN0cmFjdENvbXBvbmVudCA9IFBsYWl0RWxlbWVudC5nZXRDb21wb25lbnQoYWN0aXZlQWJzdHJhY3RFbGVtZW50KSBhcyBNaW5kTm9kZUNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICBhYnN0cmFjdENvbXBvbmVudCEudXBkYXRlQWJzdHJhY3RJbmNsdWRlZE91dGxpbmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBtb3VzZXVwKGV2ZW50KTtcbiAgICB9O1xuICAgIHJldHVybiBib2FyZDtcbn07XG4iXX0=
@@ -0,0 +1,276 @@
1
+ import { createG, distanceBetweenPointAndPoint, IS_TEXT_EDITABLE, Path, PlaitBoard, toPoint, transformPoint, Transforms, ELEMENT_TO_COMPONENT, getSelectedElements } from '@plait/core';
2
+ import { isBottomLayout, isHorizontalLogicLayout, isIndentedLayout, isLeftLayout, isRightLayout, isStandardLayout, isTopLayout, isVerticalLogicLayout } from '@plait/layouts';
3
+ import { updateForeignObject } from '@plait/richtext';
4
+ import { BASE } from '../constants';
5
+ import { getRichtextRectangleByNode } from '../draw/richtext';
6
+ import { drawRectangleNode } from '../draw/shape';
7
+ import { PlaitMind } from '../interfaces/element';
8
+ import { directionCorrector, directionDetector, drawPlaceholderDropNodeG, findUpElement, isChildElement, readjustmentDropTarget } from '../utils';
9
+ import { getRectangleByNode, hitMindmapElement } from '../utils/graph';
10
+ import { MINDMAP_ELEMENT_TO_COMPONENT } from '../utils/weak-maps';
11
+ import { MindmapQueries } from '../queries';
12
+ const DRAG_MOVE_BUFFER = 5;
13
+ export const withDnd = (board) => {
14
+ const { mousedown, mousemove, globalMouseup, keydown } = board;
15
+ let activeElement;
16
+ let startPoint;
17
+ let fakeDragNodeG;
18
+ let fakeDropNodeG;
19
+ let dropTarget = null;
20
+ board.mousedown = (event) => {
21
+ if (board.options.readonly || IS_TEXT_EDITABLE.get(board) || event.button === 2) {
22
+ mousedown(event);
23
+ return;
24
+ }
25
+ // 确认是否 hit 节点
26
+ const point = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));
27
+ const selectedElements = getSelectedElements(board);
28
+ board.children.forEach((value) => {
29
+ if (activeElement) {
30
+ return;
31
+ }
32
+ if (PlaitMind.isMind(value)) {
33
+ const mindmapComponent = ELEMENT_TO_COMPONENT.get(value);
34
+ const root = mindmapComponent?.root;
35
+ root.eachNode((node) => {
36
+ if (activeElement) {
37
+ return;
38
+ }
39
+ if (hitMindmapElement(board, point, node.origin) && !node.origin.isRoot && selectedElements.length <= 1) {
40
+ activeElement = node.origin;
41
+ startPoint = point;
42
+ }
43
+ });
44
+ }
45
+ });
46
+ if (activeElement) {
47
+ event.preventDefault();
48
+ }
49
+ mousedown(event);
50
+ };
51
+ board.mousemove = (event) => {
52
+ if (!board.options.readonly && activeElement && startPoint) {
53
+ const endPoint = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));
54
+ const distance = distanceBetweenPointAndPoint(startPoint[0], startPoint[1], endPoint[0], endPoint[1]);
55
+ if (distance < DRAG_MOVE_BUFFER) {
56
+ return;
57
+ }
58
+ if (!isDragging(board)) {
59
+ setIsDragging(board, true);
60
+ fakeDragNodeG = createG();
61
+ fakeDragNodeG.classList.add('dragging', 'fake-node', 'plait-board-attached');
62
+ fakeDropNodeG = createG();
63
+ addActiveOnDragOrigin(activeElement);
64
+ PlaitBoard.getHost(board).appendChild(fakeDropNodeG);
65
+ PlaitBoard.getHost(board).appendChild(fakeDragNodeG);
66
+ }
67
+ else {
68
+ fakeDragNodeG?.childNodes.forEach(node => {
69
+ node.remove();
70
+ });
71
+ fakeDropNodeG?.childNodes.forEach(node => {
72
+ node.remove();
73
+ });
74
+ }
75
+ // fake dragging origin node
76
+ const offsetX = endPoint[0] - startPoint[0];
77
+ const offsetY = endPoint[1] - startPoint[1];
78
+ const activeComponent = MINDMAP_ELEMENT_TO_COMPONENT.get(activeElement);
79
+ const roughSVG = PlaitBoard.getRoughSVG(board);
80
+ const fakeDraggingNode = {
81
+ ...activeComponent.node,
82
+ children: [],
83
+ x: activeComponent.node.x + offsetX,
84
+ y: activeComponent.node.y + offsetY
85
+ };
86
+ const textRectangle = getRichtextRectangleByNode(activeComponent.node);
87
+ const fakeNodeG = drawRectangleNode(board, fakeDraggingNode);
88
+ const richtextG = activeComponent.richtextG?.cloneNode(true);
89
+ updateForeignObject(richtextG, textRectangle.width + BASE * 10, textRectangle.height, textRectangle.x + offsetX, textRectangle.y + offsetY);
90
+ fakeDragNodeG?.append(fakeNodeG);
91
+ fakeDragNodeG?.append(richtextG);
92
+ // drop position detect
93
+ const { x, y } = getRectangleByNode(fakeDraggingNode);
94
+ const detectCenterPoint = [x + textRectangle.width / 2, y + textRectangle.height / 2];
95
+ let detectResult = null;
96
+ board.children.forEach((value) => {
97
+ if (detectResult) {
98
+ return;
99
+ }
100
+ if (PlaitMind.isMind(value)) {
101
+ const mindmapComponent = ELEMENT_TO_COMPONENT.get(value);
102
+ const root = mindmapComponent?.root;
103
+ root.eachNode((node) => {
104
+ if (detectResult) {
105
+ return;
106
+ }
107
+ const directions = directionDetector(node, detectCenterPoint);
108
+ if (directions) {
109
+ detectResult = directionCorrector(node, directions);
110
+ }
111
+ dropTarget = null;
112
+ if (detectResult && isValidTarget(activeComponent.node.origin, node.origin)) {
113
+ dropTarget = { target: node.origin, detectResult: detectResult[0] };
114
+ }
115
+ });
116
+ }
117
+ });
118
+ if (dropTarget?.target) {
119
+ dropTarget = readjustmentDropTarget(dropTarget);
120
+ drawPlaceholderDropNodeG(dropTarget, roughSVG, fakeDropNodeG);
121
+ }
122
+ }
123
+ mousemove(event);
124
+ };
125
+ board.globalMouseup = (event) => {
126
+ if (!board.options.readonly && activeElement) {
127
+ if (dropTarget?.target) {
128
+ const activeComponent = MINDMAP_ELEMENT_TO_COMPONENT.get(activeElement);
129
+ const targetComponent = MINDMAP_ELEMENT_TO_COMPONENT.get(dropTarget.target);
130
+ let targetPath = PlaitBoard.findPath(board, targetComponent.element);
131
+ const mindmapElement = findUpElement(dropTarget.target).root;
132
+ const mindmapComponent = ELEMENT_TO_COMPONENT.get(mindmapElement);
133
+ const layout = MindmapQueries.getCorrectLayoutByElement(mindmapComponent?.root.origin);
134
+ targetPath = updatePathByLayoutAndDropTarget(targetPath, layout, dropTarget);
135
+ const originPath = PlaitBoard.findPath(board, activeComponent.element);
136
+ let newElement = { isCollapsed: false }, rightTargetPath = PlaitBoard.findPath(board, targetComponent.element);
137
+ if (isStandardLayout(layout)) {
138
+ updateRightNodeCount(board, activeComponent, targetComponent, dropTarget.detectResult);
139
+ }
140
+ if (dropTarget.detectResult === 'right') {
141
+ if (targetComponent.node.origin.isRoot) {
142
+ targetPath = PlaitBoard.findPath(board, targetComponent.element);
143
+ targetPath.push(0);
144
+ const rightNodeCount = targetComponent.node.origin.rightNodeCount + 1;
145
+ newElement = { isCollapsed: false, rightNodeCount };
146
+ }
147
+ Transforms.setNode(board, newElement, rightTargetPath);
148
+ }
149
+ Transforms.moveNode(board, originPath, targetPath);
150
+ }
151
+ if (isDragging(board)) {
152
+ removeActiveOnDragOrigin(activeElement);
153
+ }
154
+ setIsDragging(board, false);
155
+ activeElement = null;
156
+ fakeDragNodeG?.remove();
157
+ fakeDragNodeG = undefined;
158
+ fakeDropNodeG?.remove();
159
+ fakeDropNodeG = undefined;
160
+ dropTarget = null;
161
+ }
162
+ globalMouseup(event);
163
+ };
164
+ board.keydown = (event) => {
165
+ keydown(event);
166
+ };
167
+ return board;
168
+ };
169
+ export const isValidTarget = (origin, target) => {
170
+ return origin !== target && !isChildElement(origin, target);
171
+ };
172
+ export const addActiveOnDragOrigin = (activeElement, isOrigin = true) => {
173
+ const activeComponent = MINDMAP_ELEMENT_TO_COMPONENT.get(activeElement);
174
+ if (isOrigin) {
175
+ activeComponent.g.classList.add('dragging-origin');
176
+ }
177
+ else {
178
+ activeComponent.g.classList.add('dragging-child');
179
+ }
180
+ !activeElement.isCollapsed &&
181
+ activeElement.children.forEach(child => {
182
+ addActiveOnDragOrigin(child, false);
183
+ });
184
+ };
185
+ export const removeActiveOnDragOrigin = (activeElement, isOrigin = true) => {
186
+ const activeComponent = MINDMAP_ELEMENT_TO_COMPONENT.get(activeElement);
187
+ if (isOrigin) {
188
+ activeComponent.g.classList.remove('dragging-origin');
189
+ }
190
+ else {
191
+ activeComponent.g.classList.remove('dragging-child');
192
+ }
193
+ !activeElement.isCollapsed &&
194
+ activeElement.children.forEach(child => {
195
+ removeActiveOnDragOrigin(child, false);
196
+ });
197
+ };
198
+ const updatePathByLayoutAndDropTarget = (targetPath, layout, dropTarget) => {
199
+ // 上下布局:左右是兄弟节点,上下是子节点
200
+ if (isVerticalLogicLayout(layout)) {
201
+ if (isTopLayout(layout) && dropTarget.detectResult === 'top') {
202
+ targetPath.push(dropTarget.target.children.length);
203
+ }
204
+ if (isBottomLayout(layout) && dropTarget.detectResult === 'bottom') {
205
+ targetPath.push(dropTarget.target.children.length);
206
+ }
207
+ // 如果是左,位置不变,右则插入到下一个兄弟节点
208
+ if (dropTarget.detectResult === 'right') {
209
+ targetPath = Path.next(targetPath);
210
+ }
211
+ }
212
+ // 水平布局/标准布局:上下是兄弟节点,左右是子节点
213
+ if (isHorizontalLogicLayout(layout)) {
214
+ if (dropTarget.detectResult === 'right') {
215
+ targetPath.push(dropTarget.target.children.length);
216
+ }
217
+ if (dropTarget.detectResult === 'left') {
218
+ targetPath.push(dropTarget.target.children.length);
219
+ }
220
+ // 如果是上,位置不变,下插入到下一个兄弟节点
221
+ if (dropTarget.detectResult === 'bottom') {
222
+ targetPath = Path.next(targetPath);
223
+ }
224
+ }
225
+ // 缩进布局:上下是兄弟节点,左右是子节点,但上(左上/右上),探测到上是子节点,下则位置不变,反之同理。
226
+ if (isIndentedLayout(layout)) {
227
+ if (isTopLayout(layout) && dropTarget.detectResult === 'top') {
228
+ targetPath = Path.next(targetPath);
229
+ }
230
+ if (isBottomLayout(layout) && dropTarget.detectResult === 'bottom') {
231
+ targetPath = Path.next(targetPath);
232
+ }
233
+ if (isLeftLayout(layout) && dropTarget.detectResult === 'left') {
234
+ targetPath.push(dropTarget.target.children.length);
235
+ }
236
+ if (isRightLayout(layout) && dropTarget.detectResult === 'right') {
237
+ targetPath.push(dropTarget.target.children.length);
238
+ }
239
+ }
240
+ return targetPath;
241
+ };
242
+ export const updateRightNodeCount = (board, activeComponent, targetComponent, detectResult) => {
243
+ let rightNodeCount;
244
+ const mindmapElement = findUpElement(targetComponent.node.origin).root;
245
+ const mindmapComponent = ELEMENT_TO_COMPONENT.get(mindmapElement);
246
+ const activeIndex = mindmapComponent?.root.children.indexOf(activeComponent.node);
247
+ const targetIndex = mindmapComponent?.root.children.indexOf(targetComponent.node);
248
+ const isActiveOnRight = activeIndex !== -1 && activeIndex <= activeComponent.parent.origin.rightNodeCount - 1;
249
+ const isTargetOnRight = targetComponent.parent && targetIndex !== -1 && targetIndex <= targetComponent.parent.origin.rightNodeCount - 1;
250
+ const isBothOnRight = isActiveOnRight && isTargetOnRight;
251
+ const rootChildCount = mindmapComponent.root.children?.length;
252
+ const rootRightNodeCount = mindmapComponent?.root.origin.rightNodeCount;
253
+ if (!isBothOnRight) {
254
+ if (isActiveOnRight) {
255
+ rightNodeCount = rootChildCount < rootRightNodeCount ? rootChildCount - 1 : rootRightNodeCount - 1;
256
+ Transforms.setNode(board, { rightNodeCount }, PlaitBoard.findPath(board, activeComponent.parent.origin));
257
+ }
258
+ if (isTargetOnRight && detectResult !== 'right') {
259
+ rightNodeCount = rootChildCount < rootRightNodeCount ? rootRightNodeCount : rootRightNodeCount + 1;
260
+ Transforms.setNode(board, { rightNodeCount }, PlaitBoard.findPath(board, targetComponent.parent.origin));
261
+ }
262
+ //二级子节点拖动到根节点左侧
263
+ if (targetComponent.node.origin.isRoot && detectResult === 'left' && activeIndex === -1) {
264
+ rightNodeCount = rootChildCount;
265
+ Transforms.setNode(board, { rightNodeCount }, PlaitBoard.findPath(board, targetComponent.element));
266
+ }
267
+ }
268
+ };
269
+ const IS_DRAGGING = new WeakMap();
270
+ export const isDragging = (board) => {
271
+ return !!IS_DRAGGING.get(board);
272
+ };
273
+ export const setIsDragging = (board, state) => {
274
+ IS_DRAGGING.set(board, state);
275
+ };
276
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1kbmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9taW5kL3NyYy9wbHVnaW5zL3dpdGgtZG5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxPQUFPLEVBQ1AsNEJBQTRCLEVBQzVCLGdCQUFnQixFQUNoQixJQUFJLEVBQ0osVUFBVSxFQUlWLE9BQU8sRUFDUCxjQUFjLEVBQ2QsVUFBVSxFQUNWLG9CQUFvQixFQUNwQixtQkFBbUIsRUFDdEIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUNILGNBQWMsRUFDZCx1QkFBdUIsRUFDdkIsZ0JBQWdCLEVBQ2hCLFlBQVksRUFDWixhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2hCLFdBQVcsRUFDWCxxQkFBcUIsRUFFeEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0RCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQWUsU0FBUyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHL0QsT0FBTyxFQUNILGtCQUFrQixFQUNsQixpQkFBaUIsRUFDakIsd0JBQXdCLEVBQ3hCLGFBQWEsRUFDYixjQUFjLEVBQ2Qsc0JBQXNCLEVBQ3pCLE1BQU0sVUFBVSxDQUFDO0FBQ2xCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFHNUMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7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Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBjcmVhdGVHLFxuICAgIGRpc3RhbmNlQmV0d2VlblBvaW50QW5kUG9pbnQsXG4gICAgSVNfVEVYVF9FRElUQUJMRSxcbiAgICBQYXRoLFxuICAgIFBsYWl0Qm9hcmQsXG4gICAgUGxhaXRFbGVtZW50LFxuICAgIFBsYWl0UGx1Z2luLFxuICAgIFBvaW50LFxuICAgIHRvUG9pbnQsXG4gICAgdHJhbnNmb3JtUG9pbnQsXG4gICAgVHJhbnNmb3JtcyxcbiAgICBFTEVNRU5UX1RPX0NPTVBPTkVOVCxcbiAgICBnZXRTZWxlY3RlZEVsZW1lbnRzXG59IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7XG4gICAgaXNCb3R0b21MYXlvdXQsXG4gICAgaXNIb3Jpem9udGFsTG9naWNMYXlvdXQsXG4gICAgaXNJbmRlbnRlZExheW91dCxcbiAgICBpc0xlZnRMYXlvdXQsXG4gICAgaXNSaWdodExheW91dCxcbiAgICBpc1N0YW5kYXJkTGF5b3V0LFxuICAgIGlzVG9wTGF5b3V0LFxuICAgIGlzVmVydGljYWxMb2dpY0xheW91dCxcbiAgICBNaW5kbWFwTGF5b3V0VHlwZVxufSBmcm9tICdAcGxhaXQvbGF5b3V0cyc7XG5pbXBvcnQgeyB1cGRhdGVGb3JlaWduT2JqZWN0IH0gZnJvbSAnQHBsYWl0L3JpY2h0ZXh0JztcbmltcG9ydCB7IFJvdWdoU1ZHIH0gZnJvbSAncm91Z2hqcy9iaW4vc3ZnJztcbmltcG9ydCB7IEJBU0UgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgZ2V0UmljaHRleHRSZWN0YW5nbGVCeU5vZGUgfSBmcm9tICcuLi9kcmF3L3JpY2h0ZXh0JztcbmltcG9ydCB7IGRyYXdSZWN0YW5nbGVOb2RlIH0gZnJvbSAnLi4vZHJhdy9zaGFwZSc7XG5pbXBvcnQgeyBNaW5kRWxlbWVudCwgUGxhaXRNaW5kIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9lbGVtZW50JztcbmltcG9ydCB7IERldGVjdFJlc3VsdCwgTWluZG1hcE5vZGUgfSBmcm9tICcuLi9pbnRlcmZhY2VzL25vZGUnO1xuaW1wb3J0IHsgTWluZE5vZGVDb21wb25lbnQgfSBmcm9tICcuLi9ub2RlLmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICAgIGRpcmVjdGlvbkNvcnJlY3RvcixcbiAgICBkaXJlY3Rpb25EZXRlY3RvcixcbiAgICBkcmF3UGxhY2Vob2xkZXJEcm9wTm9kZUcsXG4gICAgZmluZFVwRWxlbWVudCxcbiAgICBpc0NoaWxkRWxlbWVudCxcbiAgICByZWFkanVzdG1lbnREcm9wVGFyZ2V0XG59IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IGdldFJlY3RhbmdsZUJ5Tm9kZSwgaGl0TWluZG1hcEVsZW1lbnQgfSBmcm9tICcuLi91dGlscy9ncmFwaCc7XG5pbXBvcnQgeyBNSU5ETUFQX0VMRU1FTlRfVE9fQ09NUE9ORU5UIH0gZnJvbSAnLi4vdXRpbHMvd2Vhay1tYXBzJztcbmltcG9ydCB7IE1pbmRtYXBRdWVyaWVzIH0gZnJvbSAnLi4vcXVlcmllcyc7XG5pbXBvcnQgeyBQbGFpdE1pbmRDb21wb25lbnQgfSBmcm9tICcuLi9taW5kLmNvbXBvbmVudCc7XG5cbmNvbnN0IERSQUdfTU9WRV9CVUZGRVIgPSA1O1xuXG5leHBvcnQgY29uc3Qgd2l0aERuZCA9IChib2FyZDogUGxhaXRCb2FyZCkgPT4ge1xuICAgIGNvbnN0IHsgbW91c2Vkb3duLCBtb3VzZW1vdmUsIGdsb2JhbE1vdXNldXAsIGtleWRvd24gfSA9IGJvYXJkO1xuXG4gICAgbGV0IGFjdGl2ZUVsZW1lbnQ6IE1pbmRFbGVtZW50IHwgbnVsbDtcbiAgICBsZXQgc3RhcnRQb2ludDogUG9pbnQ7XG4gICAgbGV0IGZha2VEcmFnTm9kZUc6IFNWR0dFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgIGxldCBmYWtlRHJvcE5vZGVHOiBTVkdHRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZHJvcFRhcmdldDogeyB0YXJnZXQ6IE1pbmRFbGVtZW50OyBkZXRlY3RSZXN1bHQ6IERldGVjdFJlc3VsdCB9IHwgbnVsbCA9IG51bGw7XG5cbiAgICBib2FyZC5tb3VzZWRvd24gPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGJvYXJkLm9wdGlvbnMucmVhZG9ubHkgfHwgSVNfVEVYVF9FRElUQUJMRS5nZXQoYm9hcmQpIHx8IGV2ZW50LmJ1dHRvbiA9PT0gMikge1xuICAgICAgICAgICAgbW91c2Vkb3duKGV2ZW50KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOehruiupOaYr+WQpiBoaXQg6IqC54K5XG4gICAgICAgIGNvbnN0IHBvaW50ID0gdHJhbnNmb3JtUG9pbnQoYm9hcmQsIHRvUG9pbnQoZXZlbnQueCwgZXZlbnQueSwgUGxhaXRCb2FyZC5nZXRIb3N0KGJvYXJkKSkpO1xuICAgICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhib2FyZCk7XG4gICAgICAgIGJvYXJkLmNoaWxkcmVuLmZvckVhY2goKHZhbHVlOiBQbGFpdEVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChhY3RpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFBsYWl0TWluZC5pc01pbmQodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWluZG1hcENvbXBvbmVudCA9IEVMRU1FTlRfVE9fQ09NUE9ORU5ULmdldCh2YWx1ZSkgYXMgUGxhaXRNaW5kQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvb3QgPSBtaW5kbWFwQ29tcG9uZW50Py5yb290O1xuICAgICAgICAgICAgICAgIChyb290IGFzIGFueSkuZWFjaE5vZGUoKG5vZGU6IE1pbmRtYXBOb2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGhpdE1pbmRtYXBFbGVtZW50KGJvYXJkLCBwb2ludCwgbm9kZS5vcmlnaW4pICYmICFub2RlLm9yaWdpbi5pc1Jvb3QgJiYgc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPD0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlRWxlbWVudCA9IG5vZGUub3JpZ2luO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQb2ludCA9IHBvaW50O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChhY3RpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbW91c2Vkb3duKGV2ZW50KTtcbiAgICB9O1xuXG4gICAgYm9hcmQubW91c2Vtb3ZlID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICghYm9hcmQub3B0aW9ucy5yZWFkb25seSAmJiBhY3RpdmVFbGVtZW50ICYmIHN0YXJ0UG9pbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVuZFBvaW50ID0gdHJhbnNmb3JtUG9pbnQoYm9hcmQsIHRvUG9pbnQoZXZlbnQueCwgZXZlbnQueSwgUGxhaXRCb2FyZC5nZXRIb3N0KGJvYXJkKSkpO1xuICAgICAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBkaXN0YW5jZUJldHdlZW5Qb2ludEFuZFBvaW50KHN0YXJ0UG9pbnRbMF0sIHN0YXJ0UG9pbnRbMV0sIGVuZFBvaW50WzBdLCBlbmRQb2ludFsxXSk7XG4gICAgICAgICAgICBpZiAoZGlzdGFuY2UgPCBEUkFHX01PVkVfQlVGRkVSKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWlzRHJhZ2dpbmcoYm9hcmQpKSB7XG4gICAgICAgICAgICAgICAgc2V0SXNEcmFnZ2luZyhib2FyZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgZmFrZURyYWdOb2RlRyA9IGNyZWF0ZUcoKTtcbiAgICAgICAgICAgICAgICBmYWtlRHJhZ05vZGVHLmNsYXNzTGlzdC5hZGQoJ2RyYWdnaW5nJywgJ2Zha2Utbm9kZScsICdwbGFpdC1ib2FyZC1hdHRhY2hlZCcpO1xuICAgICAgICAgICAgICAgIGZha2VEcm9wTm9kZUcgPSBjcmVhdGVHKCk7XG4gICAgICAgICAgICAgICAgYWRkQWN0aXZlT25EcmFnT3JpZ2luKGFjdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIFBsYWl0Qm9hcmQuZ2V0SG9zdChib2FyZCkuYXBwZW5kQ2hpbGQoZmFrZURyb3BOb2RlRyk7XG4gICAgICAgICAgICAgICAgUGxhaXRCb2FyZC5nZXRIb3N0KGJvYXJkKS5hcHBlbmRDaGlsZChmYWtlRHJhZ05vZGVHKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZmFrZURyYWdOb2RlRz8uY2hpbGROb2Rlcy5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBub2RlLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGZha2VEcm9wTm9kZUc/LmNoaWxkTm9kZXMuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZmFrZSBkcmFnZ2luZyBvcmlnaW4gbm9kZVxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0WCA9IGVuZFBvaW50WzBdIC0gc3RhcnRQb2ludFswXTtcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldFkgPSBlbmRQb2ludFsxXSAtIHN0YXJ0UG9pbnRbMV07XG4gICAgICAgICAgICBjb25zdCBhY3RpdmVDb21wb25lbnQgPSBNSU5ETUFQX0VMRU1FTlRfVE9fQ09NUE9ORU5ULmdldChhY3RpdmVFbGVtZW50KSBhcyBNaW5kTm9kZUNvbXBvbmVudDtcbiAgICAgICAgICAgIGNvbnN0IHJvdWdoU1ZHID0gUGxhaXRCb2FyZC5nZXRSb3VnaFNWRyhib2FyZCk7XG4gICAgICAgICAgICBjb25zdCBmYWtlRHJhZ2dpbmdOb2RlOiBNaW5kbWFwTm9kZSA9IHtcbiAgICAgICAgICAgICAgICAuLi5hY3RpdmVDb21wb25lbnQubm9kZSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgICAgICAgICAgeDogYWN0aXZlQ29tcG9uZW50Lm5vZGUueCArIG9mZnNldFgsXG4gICAgICAgICAgICAgICAgeTogYWN0aXZlQ29tcG9uZW50Lm5vZGUueSArIG9mZnNldFlcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCB0ZXh0UmVjdGFuZ2xlID0gZ2V0UmljaHRleHRSZWN0YW5nbGVCeU5vZGUoYWN0aXZlQ29tcG9uZW50Lm5vZGUpO1xuICAgICAgICAgICAgY29uc3QgZmFrZU5vZGVHID0gZHJhd1JlY3RhbmdsZU5vZGUoYm9hcmQsIGZha2VEcmFnZ2luZ05vZGUpO1xuICAgICAgICAgICAgY29uc3QgcmljaHRleHRHID0gYWN0aXZlQ29tcG9uZW50LnJpY2h0ZXh0Rz8uY2xvbmVOb2RlKHRydWUpIGFzIFNWR0dFbGVtZW50O1xuICAgICAgICAgICAgdXBkYXRlRm9yZWlnbk9iamVjdChyaWNodGV4dEcsIHRleHRSZWN0YW5nbGUud2lkdGggKyBCQVNFICogMTAsIHRleHRSZWN0YW5nbGUuaGVpZ2h0LCB0ZXh0UmVjdGFuZ2xlLnggKyBvZmZzZXRYLCB0ZXh0UmVjdGFuZ2xlLnkgKyBvZmZzZXRZKTtcbiAgICAgICAgICAgIGZha2VEcmFnTm9kZUc/LmFwcGVuZChmYWtlTm9kZUcpO1xuICAgICAgICAgICAgZmFrZURyYWdOb2RlRz8uYXBwZW5kKHJpY2h0ZXh0Ryk7XG5cbiAgICAgICAgICAgIC8vIGRyb3AgcG9zaXRpb24gZGV0ZWN0XG4gICAgICAgICAgICBjb25zdCB7IHgsIHkgfSA9IGdldFJlY3RhbmdsZUJ5Tm9kZShmYWtlRHJhZ2dpbmdOb2RlKTtcbiAgICAgICAgICAgIGNvbnN0IGRldGVjdENlbnRlclBvaW50ID0gW3ggKyB0ZXh0UmVjdGFuZ2xlLndpZHRoIC8gMiwgeSArIHRleHRSZWN0YW5nbGUuaGVpZ2h0IC8gMl0gYXMgUG9pbnQ7XG5cbiAgICAgICAgICAgIGxldCBkZXRlY3RSZXN1bHQ6IERldGVjdFJlc3VsdFtdIHwgbnVsbCA9IG51bGw7XG4gICAgICAgICAgICBib2FyZC5jaGlsZHJlbi5mb3JFYWNoKCh2YWx1ZTogUGxhaXRFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGRldGVjdFJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChQbGFpdE1pbmQuaXNNaW5kKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtaW5kbWFwQ29tcG9uZW50ID0gRUxFTUVOVF9UT19DT01QT05FTlQuZ2V0KHZhbHVlKSBhcyBQbGFpdE1pbmRDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvb3QgPSBtaW5kbWFwQ29tcG9uZW50Py5yb290O1xuXG4gICAgICAgICAgICAgICAgICAgIChyb290IGFzIGFueSkuZWFjaE5vZGUoKG5vZGU6IE1pbmRtYXBOb2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGV0ZWN0UmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlyZWN0aW9ucyA9IGRpcmVjdGlvbkRldGVjdG9yKG5vZGUsIGRldGVjdENlbnRlclBvaW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXJlY3Rpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZWN0UmVzdWx0ID0gZGlyZWN0aW9uQ29ycmVjdG9yKG5vZGUsIGRpcmVjdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZHJvcFRhcmdldCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGV0ZWN0UmVzdWx0ICYmIGlzVmFsaWRUYXJnZXQoYWN0aXZlQ29tcG9uZW50Lm5vZGUub3JpZ2luLCBub2RlLm9yaWdpbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm9wVGFyZ2V0ID0geyB0YXJnZXQ6IG5vZGUub3JpZ2luLCBkZXRlY3RSZXN1bHQ6IGRldGVjdFJlc3VsdFswXSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGRyb3BUYXJnZXQ/LnRhcmdldCkge1xuICAgICAgICAgICAgICAgIGRyb3BUYXJnZXQgPSByZWFkanVzdG1lbnREcm9wVGFyZ2V0KGRyb3BUYXJnZXQpO1xuICAgICAgICAgICAgICAgIGRyYXdQbGFjZWhvbGRlckRyb3BOb2RlRyhkcm9wVGFyZ2V0LCByb3VnaFNWRywgZmFrZURyb3BOb2RlRyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBtb3VzZW1vdmUoZXZlbnQpO1xuICAgIH07XG5cbiAgICBib2FyZC5nbG9iYWxNb3VzZXVwID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICghYm9hcmQub3B0aW9ucy5yZWFkb25seSAmJiBhY3RpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICBpZiAoZHJvcFRhcmdldD8udGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWN0aXZlQ29tcG9uZW50ID0gTUlORE1BUF9FTEVNRU5UX1RPX0NPTVBPTkVOVC5nZXQoYWN0aXZlRWxlbWVudCkgYXMgTWluZE5vZGVDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0Q29tcG9uZW50ID0gTUlORE1BUF9FTEVNRU5UX1RPX0NPTVBPTkVOVC5nZXQoZHJvcFRhcmdldC50YXJnZXQpIGFzIE1pbmROb2RlQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIGxldCB0YXJnZXRQYXRoID0gUGxhaXRCb2FyZC5maW5kUGF0aChib2FyZCwgdGFyZ2V0Q29tcG9uZW50LmVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1pbmRtYXBFbGVtZW50ID0gZmluZFVwRWxlbWVudChkcm9wVGFyZ2V0LnRhcmdldCkucm9vdDtcbiAgICAgICAgICAgICAgICBjb25zdCBtaW5kbWFwQ29tcG9uZW50ID0gRUxFTUVOVF9UT19DT01QT05FTlQuZ2V0KG1pbmRtYXBFbGVtZW50IGFzIFBsYWl0TWluZCkgYXMgUGxhaXRNaW5kQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIGNvbnN0IGxheW91dCA9IE1pbmRtYXBRdWVyaWVzLmdldENvcnJlY3RMYXlvdXRCeUVsZW1lbnQobWluZG1hcENvbXBvbmVudD8ucm9vdC5vcmlnaW4gYXMgTWluZEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIHRhcmdldFBhdGggPSB1cGRhdGVQYXRoQnlMYXlvdXRBbmREcm9wVGFyZ2V0KHRhcmdldFBhdGgsIGxheW91dCwgZHJvcFRhcmdldCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luUGF0aCA9IFBsYWl0Qm9hcmQuZmluZFBhdGgoYm9hcmQsIGFjdGl2ZUNvbXBvbmVudC5lbGVtZW50KTtcbiAgICAgICAgICAgICAgICBsZXQgbmV3RWxlbWVudDogUGFydGlhbDxNaW5kRWxlbWVudD4gPSB7IGlzQ29sbGFwc2VkOiBmYWxzZSB9LFxuICAgICAgICAgICAgICAgICAgICByaWdodFRhcmdldFBhdGggPSBQbGFpdEJvYXJkLmZpbmRQYXRoKGJvYXJkLCB0YXJnZXRDb21wb25lbnQuZWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoaXNTdGFuZGFyZExheW91dChsYXlvdXQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVJpZ2h0Tm9kZUNvdW50KGJvYXJkLCBhY3RpdmVDb21wb25lbnQsIHRhcmdldENvbXBvbmVudCwgZHJvcFRhcmdldC5kZXRlY3RSZXN1bHQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChkcm9wVGFyZ2V0LmRldGVjdFJlc3VsdCA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0Q29tcG9uZW50Lm5vZGUub3JpZ2luLmlzUm9vdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UGF0aCA9IFBsYWl0Qm9hcmQuZmluZFBhdGgoYm9hcmQsIHRhcmdldENvbXBvbmVudC5lbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFBhdGgucHVzaCgwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJpZ2h0Tm9kZUNvdW50ID0gKHRhcmdldENvbXBvbmVudC5ub2RlLm9yaWdpbi5yaWdodE5vZGVDb3VudCBhcyBudW1iZXIpICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQgPSB7IGlzQ29sbGFwc2VkOiBmYWxzZSwgcmlnaHROb2RlQ291bnQgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1zLnNldE5vZGUoYm9hcmQsIG5ld0VsZW1lbnQsIHJpZ2h0VGFyZ2V0UGF0aCBhcyBQYXRoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBUcmFuc2Zvcm1zLm1vdmVOb2RlKGJvYXJkLCBvcmlnaW5QYXRoLCB0YXJnZXRQYXRoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzRHJhZ2dpbmcoYm9hcmQpKSB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlQWN0aXZlT25EcmFnT3JpZ2luKGFjdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0SXNEcmFnZ2luZyhib2FyZCwgZmFsc2UpO1xuICAgICAgICAgICAgYWN0aXZlRWxlbWVudCA9IG51bGw7XG4gICAgICAgICAgICBmYWtlRHJhZ05vZGVHPy5yZW1vdmUoKTtcbiAgICAgICAgICAgIGZha2VEcmFnTm9kZUcgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBmYWtlRHJvcE5vZGVHPy5yZW1vdmUoKTtcbiAgICAgICAgICAgIGZha2VEcm9wTm9kZUcgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBkcm9wVGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBnbG9iYWxNb3VzZXVwKGV2ZW50KTtcbiAgICB9O1xuXG4gICAgYm9hcmQua2V5ZG93biA9IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgICBrZXlkb3duKGV2ZW50KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGJvYXJkO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzVmFsaWRUYXJnZXQgPSAob3JpZ2luOiBNaW5kRWxlbWVudCwgdGFyZ2V0OiBNaW5kRWxlbWVudCkgPT4ge1xuICAgIHJldHVybiBvcmlnaW4gIT09IHRhcmdldCAmJiAhaXNDaGlsZEVsZW1lbnQob3JpZ2luLCB0YXJnZXQpO1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZEFjdGl2ZU9uRHJhZ09yaWdpbiA9IChhY3RpdmVFbGVtZW50OiBNaW5kRWxlbWVudCwgaXNPcmlnaW4gPSB0cnVlKSA9PiB7XG4gICAgY29uc3QgYWN0aXZlQ29tcG9uZW50ID0gTUlORE1BUF9FTEVNRU5UX1RPX0NPTVBPTkVOVC5nZXQoYWN0aXZlRWxlbWVudCkgYXMgTWluZE5vZGVDb21wb25lbnQ7XG4gICAgaWYgKGlzT3JpZ2luKSB7XG4gICAgICAgIGFjdGl2ZUNvbXBvbmVudC5nLmNsYXNzTGlzdC5hZGQoJ2RyYWdnaW5nLW9yaWdpbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGFjdGl2ZUNvbXBvbmVudC5nLmNsYXNzTGlzdC5hZGQoJ2RyYWdnaW5nLWNoaWxkJyk7XG4gICAgfVxuICAgICFhY3RpdmVFbGVtZW50LmlzQ29sbGFwc2VkICYmXG4gICAgICAgIGFjdGl2ZUVsZW1lbnQuY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICAgICAgICBhZGRBY3RpdmVPbkRyYWdPcmlnaW4oY2hpbGQsIGZhbHNlKTtcbiAgICAgICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgcmVtb3ZlQWN0aXZlT25EcmFnT3JpZ2luID0gKGFjdGl2ZUVsZW1lbnQ6IE1pbmRFbGVtZW50LCBpc09yaWdpbiA9IHRydWUpID0+IHtcbiAgICBjb25zdCBhY3RpdmVDb21wb25lbnQgPSBNSU5ETUFQX0VMRU1FTlRfVE9fQ09NUE9ORU5ULmdldChhY3RpdmVFbGVtZW50KSBhcyBNaW5kTm9kZUNvbXBvbmVudDtcbiAgICBpZiAoaXNPcmlnaW4pIHtcbiAgICAgICAgYWN0aXZlQ29tcG9uZW50LmcuY2xhc3NMaXN0LnJlbW92ZSgnZHJhZ2dpbmctb3JpZ2luJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYWN0aXZlQ29tcG9uZW50LmcuY2xhc3NMaXN0LnJlbW92ZSgnZHJhZ2dpbmctY2hpbGQnKTtcbiAgICB9XG4gICAgIWFjdGl2ZUVsZW1lbnQuaXNDb2xsYXBzZWQgJiZcbiAgICAgICAgYWN0aXZlRWxlbWVudC5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgICAgICAgIHJlbW92ZUFjdGl2ZU9uRHJhZ09yaWdpbihjaGlsZCwgZmFsc2UpO1xuICAgICAgICB9KTtcbn07XG5cbmNvbnN0IHVwZGF0ZVBhdGhCeUxheW91dEFuZERyb3BUYXJnZXQgPSAoXG4gICAgdGFyZ2V0UGF0aDogUGF0aCxcbiAgICBsYXlvdXQ6IE1pbmRtYXBMYXlvdXRUeXBlLFxuICAgIGRyb3BUYXJnZXQ6IHsgdGFyZ2V0OiBNaW5kRWxlbWVudDsgZGV0ZWN0UmVzdWx0OiBEZXRlY3RSZXN1bHQgfVxuKSA9PiB7XG4gICAgLy8g5LiK5LiL5biD5bGA77ya5bem5Y+z5piv5YWE5byf6IqC54K577yM5LiK5LiL5piv5a2Q6IqC54K5XG4gICAgaWYgKGlzVmVydGljYWxMb2dpY0xheW91dChsYXlvdXQpKSB7XG4gICAgICAgIGlmIChpc1RvcExheW91dChsYXlvdXQpICYmIGRyb3BUYXJnZXQuZGV0ZWN0UmVzdWx0ID09PSAndG9wJykge1xuICAgICAgICAgICAgdGFyZ2V0UGF0aC5wdXNoKGRyb3BUYXJnZXQudGFyZ2V0LmNoaWxkcmVuLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQm90dG9tTGF5b3V0KGxheW91dCkgJiYgZHJvcFRhcmdldC5kZXRlY3RSZXN1bHQgPT09ICdib3R0b20nKSB7XG4gICAgICAgICAgICB0YXJnZXRQYXRoLnB1c2goZHJvcFRhcmdldC50YXJnZXQuY2hpbGRyZW4ubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyDlpoLmnpzmmK/lt6bvvIzkvY3nva7kuI3lj5jvvIzlj7PliJnmj5LlhaXliLDkuIvkuIDkuKrlhYTlvJ/oioLngrlcbiAgICAgICAgaWYgKGRyb3BUYXJnZXQuZGV0ZWN0UmVzdWx0ID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgICB0YXJnZXRQYXRoID0gUGF0aC5uZXh0KHRhcmdldFBhdGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIOawtOW5s+W4g+WxgC/moIflh4bluIPlsYDvvJrkuIrkuIvmmK/lhYTlvJ/oioLngrnvvIzlt6blj7PmmK/lrZDoioLngrlcbiAgICBpZiAoaXNIb3Jpem9udGFsTG9naWNMYXlvdXQobGF5b3V0KSkge1xuICAgICAgICBpZiAoZHJvcFRhcmdldC5kZXRlY3RSZXN1bHQgPT09ICdyaWdodCcpIHtcbiAgICAgICAgICAgIHRhcmdldFBhdGgucHVzaChkcm9wVGFyZ2V0LnRhcmdldC5jaGlsZHJlbi5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkcm9wVGFyZ2V0LmRldGVjdFJlc3VsdCA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgICB0YXJnZXRQYXRoLnB1c2goZHJvcFRhcmdldC50YXJnZXQuY2hpbGRyZW4ubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyDlpoLmnpzmmK/kuIrvvIzkvY3nva7kuI3lj5jvvIzkuIvmj5LlhaXliLDkuIvkuIDkuKrlhYTlvJ/oioLngrlcbiAgICAgICAgaWYgKGRyb3BUYXJnZXQuZGV0ZWN0UmVzdWx0ID09PSAnYm90dG9tJykge1xuICAgICAgICAgICAgdGFyZ2V0UGF0aCA9IFBhdGgubmV4dCh0YXJnZXRQYXRoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyDnvKnov5vluIPlsYDvvJrkuIrkuIvmmK/lhYTlvJ/oioLngrnvvIzlt6blj7PmmK/lrZDoioLngrnvvIzkvYbkuIrvvIjlt6bkuIov5Y+z5LiK77yJ77yM5o6i5rWL5Yiw5LiK5piv5a2Q6IqC54K577yM5LiL5YiZ5L2N572u5LiN5Y+Y77yM5Y+N5LmL5ZCM55CG44CCXG4gICAgaWYgKGlzSW5kZW50ZWRMYXlvdXQobGF5b3V0KSkge1xuICAgICAgICBpZiAoaXNUb3BMYXlvdXQobGF5b3V0KSAmJiBkcm9wVGFyZ2V0LmRldGVjdFJlc3VsdCA9PT0gJ3RvcCcpIHtcbiAgICAgICAgICAgIHRhcmdldFBhdGggPSBQYXRoLm5leHQodGFyZ2V0UGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQm90dG9tTGF5b3V0KGxheW91dCkgJiYgZHJvcFRhcmdldC5kZXRlY3RSZXN1bHQgPT09ICdib3R0b20nKSB7XG4gICAgICAgICAgICB0YXJnZXRQYXRoID0gUGF0aC5uZXh0KHRhcmdldFBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0xlZnRMYXlvdXQobGF5b3V0KSAmJiBkcm9wVGFyZ2V0LmRldGVjdFJlc3VsdCA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgICB0YXJnZXRQYXRoLnB1c2goZHJvcFRhcmdldC50YXJnZXQuY2hpbGRyZW4ubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNSaWdodExheW91dChsYXlvdXQpICYmIGRyb3BUYXJnZXQuZGV0ZWN0UmVzdWx0ID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgICB0YXJnZXRQYXRoLnB1c2goZHJvcFRhcmdldC50YXJnZXQuY2hpbGRyZW4ubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0UGF0aDtcbn07XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVSaWdodE5vZGVDb3VudCA9IChcbiAgICBib2FyZDogUGxhaXRCb2FyZCxcbiAgICBhY3RpdmVDb21wb25lbnQ6IE1pbmROb2RlQ29tcG9uZW50LFxuICAgIHRhcmdldENvbXBvbmVudDogTWluZE5vZGVDb21wb25lbnQsXG4gICAgZGV0ZWN0UmVzdWx0OiBEZXRlY3RSZXN1bHRcbikgPT4ge1xuICAgIGxldCByaWdodE5vZGVDb3VudDtcbiAgICBjb25zdCBtaW5kbWFwRWxlbWVudCA9IGZpbmRVcEVsZW1lbnQodGFyZ2V0Q29tcG9uZW50Lm5vZGUub3JpZ2luKS5yb290O1xuICAgIGNvbnN0IG1pbmRtYXBDb21wb25lbnQgPSBFTEVNRU5UX1RPX0NPTVBPTkVOVC5nZXQobWluZG1hcEVsZW1lbnQgYXMgUGxhaXRNaW5kKSBhcyBQbGFpdE1pbmRDb21wb25lbnQ7XG4gICAgY29uc3QgYWN0aXZlSW5kZXggPSBtaW5kbWFwQ29tcG9uZW50Py5yb290LmNoaWxkcmVuLmluZGV4T2YoYWN0aXZlQ29tcG9uZW50Lm5vZGUpIGFzIG51bWJlcjtcbiAgICBjb25zdCB0YXJnZXRJbmRleCA9IG1pbmRtYXBDb21wb25lbnQ/LnJvb3QuY2hpbGRyZW4uaW5kZXhPZih0YXJnZXRDb21wb25lbnQubm9kZSkgYXMgbnVtYmVyO1xuICAgIGNvbnN0IGlzQWN0aXZlT25SaWdodCA9IGFjdGl2ZUluZGV4ICE9PSAtMSAmJiBhY3RpdmVJbmRleCA8PSAoYWN0aXZlQ29tcG9uZW50LnBhcmVudC5vcmlnaW4ucmlnaHROb2RlQ291bnQgYXMgbnVtYmVyKSAtIDE7XG4gICAgY29uc3QgaXNUYXJnZXRPblJpZ2h0ID1cbiAgICAgICAgdGFyZ2V0Q29tcG9uZW50LnBhcmVudCAmJiB0YXJnZXRJbmRleCAhPT0gLTEgJiYgdGFyZ2V0SW5kZXggPD0gKHRhcmdldENvbXBvbmVudC5wYXJlbnQub3JpZ2luLnJpZ2h0Tm9kZUNvdW50IGFzIG51bWJlcikgLSAxO1xuICAgIGNvbnN0IGlzQm90aE9uUmlnaHQgPSBpc0FjdGl2ZU9uUmlnaHQgJiYgaXNUYXJnZXRPblJpZ2h0O1xuICAgIGNvbnN0IHJvb3RDaGlsZENvdW50ID0gbWluZG1hcENvbXBvbmVudC5yb290LmNoaWxkcmVuPy5sZW5ndGggYXMgbnVtYmVyO1xuICAgIGNvbnN0IHJvb3RSaWdodE5vZGVDb3VudCA9IG1pbmRtYXBDb21wb25lbnQ/LnJvb3Qub3JpZ2luLnJpZ2h0Tm9kZUNvdW50IGFzIG51bWJlcjtcblxuICAgIGlmICghaXNCb3RoT25SaWdodCkge1xuICAgICAgICBpZiAoaXNBY3RpdmVPblJpZ2h0KSB7XG4gICAgICAgICAgICByaWdodE5vZGVDb3VudCA9IHJvb3RDaGlsZENvdW50IDwgcm9vdFJpZ2h0Tm9kZUNvdW50ID8gcm9vdENoaWxkQ291bnQgLSAxIDogcm9vdFJpZ2h0Tm9kZUNvdW50IC0gMTtcbiAgICAgICAgICAgIFRyYW5zZm9ybXMuc2V0Tm9kZShib2FyZCwgeyByaWdodE5vZGVDb3VudCB9LCBQbGFpdEJvYXJkLmZpbmRQYXRoKGJvYXJkLCBhY3RpdmVDb21wb25lbnQucGFyZW50Lm9yaWdpbikpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzVGFyZ2V0T25SaWdodCAmJiBkZXRlY3RSZXN1bHQgIT09ICdyaWdodCcpIHtcbiAgICAgICAgICAgIHJpZ2h0Tm9kZUNvdW50ID0gcm9vdENoaWxkQ291bnQgPCByb290UmlnaHROb2RlQ291bnQgPyByb290UmlnaHROb2RlQ291bnQgOiByb290UmlnaHROb2RlQ291bnQgKyAxO1xuICAgICAgICAgICAgVHJhbnNmb3Jtcy5zZXROb2RlKGJvYXJkLCB7IHJpZ2h0Tm9kZUNvdW50IH0sIFBsYWl0Qm9hcmQuZmluZFBhdGgoYm9hcmQsIHRhcmdldENvbXBvbmVudC5wYXJlbnQub3JpZ2luKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvL+S6jOe6p+WtkOiKgueCueaLluWKqOWIsOagueiKgueCueW3puS+p1xuICAgICAgICBpZiAodGFyZ2V0Q29tcG9uZW50Lm5vZGUub3JpZ2luLmlzUm9vdCAmJiBkZXRlY3RSZXN1bHQgPT09ICdsZWZ0JyAmJiBhY3RpdmVJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJpZ2h0Tm9kZUNvdW50ID0gcm9vdENoaWxkQ291bnQ7XG4gICAgICAgICAgICBUcmFuc2Zvcm1zLnNldE5vZGUoYm9hcmQsIHsgcmlnaHROb2RlQ291bnQgfSwgUGxhaXRCb2FyZC5maW5kUGF0aChib2FyZCwgdGFyZ2V0Q29tcG9uZW50LmVsZW1lbnQpKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbmNvbnN0IElTX0RSQUdHSU5HID0gbmV3IFdlYWtNYXA8UGxhaXRCb2FyZCwgYm9vbGVhbj4oKTtcblxuZXhwb3J0IGNvbnN0IGlzRHJhZ2dpbmcgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQpID0+IHtcbiAgICByZXR1cm4gISFJU19EUkFHR0lORy5nZXQoYm9hcmQpO1xufTtcblxuZXhwb3J0IGNvbnN0IHNldElzRHJhZ2dpbmcgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIHN0YXRlOiBib29sZWFuKSA9PiB7XG4gICAgSVNfRFJBR0dJTkcuc2V0KGJvYXJkLCBzdGF0ZSk7XG59O1xuIl19