@plait/core 0.53.0 → 0.55.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/board/board.component.d.ts +5 -2
  2. package/constants/index.d.ts +2 -0
  3. package/constants/selection.d.ts +1 -0
  4. package/core/element/context.d.ts +6 -2
  5. package/core/element/plugin-element.d.ts +13 -4
  6. package/core/list-render.d.ts +16 -0
  7. package/esm2022/board/board.component.mjs +28 -23
  8. package/esm2022/constants/index.mjs +3 -1
  9. package/esm2022/constants/selection.mjs +2 -1
  10. package/esm2022/core/element/context.mjs +1 -1
  11. package/esm2022/core/element/plugin-element.mjs +79 -12
  12. package/esm2022/core/list-render.mjs +209 -0
  13. package/esm2022/interfaces/board.mjs +6 -2
  14. package/esm2022/interfaces/element.mjs +28 -2
  15. package/esm2022/interfaces/node.mjs +18 -1
  16. package/esm2022/interfaces/path.mjs +56 -57
  17. package/esm2022/interfaces/rectangle-client.mjs +4 -1
  18. package/esm2022/interfaces/selection.mjs +2 -2
  19. package/esm2022/plugins/create-board.mjs +15 -13
  20. package/esm2022/plugins/with-hotkey.mjs +33 -4
  21. package/esm2022/plugins/with-moving.mjs +15 -14
  22. package/esm2022/plugins/with-related-fragment.mjs +5 -5
  23. package/esm2022/plugins/with-selection.mjs +7 -5
  24. package/esm2022/public-api.mjs +1 -3
  25. package/esm2022/transforms/element.mjs +2 -2
  26. package/esm2022/transforms/group.mjs +23 -6
  27. package/esm2022/transforms/index.mjs +6 -3
  28. package/esm2022/transforms/z-index.mjs +20 -0
  29. package/esm2022/utils/angle.mjs +56 -3
  30. package/esm2022/utils/clipboard/clipboard.mjs +5 -5
  31. package/esm2022/utils/clipboard/common.mjs +5 -5
  32. package/esm2022/utils/clipboard/types.mjs +1 -1
  33. package/esm2022/utils/common.mjs +29 -2
  34. package/esm2022/utils/debug.mjs +16 -1
  35. package/esm2022/utils/element.mjs +3 -3
  36. package/esm2022/utils/fragment.mjs +24 -0
  37. package/esm2022/utils/group.mjs +37 -5
  38. package/esm2022/utils/helper.mjs +37 -1
  39. package/esm2022/utils/index.mjs +5 -1
  40. package/esm2022/utils/math.mjs +37 -1
  41. package/esm2022/utils/position.mjs +3 -3
  42. package/esm2022/utils/selection.mjs +2 -3
  43. package/esm2022/utils/snap/snap-moving.mjs +199 -0
  44. package/esm2022/utils/snap/snap.mjs +208 -0
  45. package/esm2022/utils/to-image.mjs +2 -2
  46. package/esm2022/utils/weak-maps.mjs +4 -1
  47. package/esm2022/utils/z-index.mjs +166 -0
  48. package/fesm2022/plait-core.mjs +2110 -1458
  49. package/fesm2022/plait-core.mjs.map +1 -1
  50. package/interfaces/board.d.ts +9 -7
  51. package/interfaces/element.d.ts +5 -0
  52. package/interfaces/node.d.ts +1 -0
  53. package/interfaces/rectangle-client.d.ts +1 -0
  54. package/interfaces/selection.d.ts +1 -1
  55. package/package.json +1 -1
  56. package/public-api.d.ts +0 -2
  57. package/styles/styles.scss +9 -0
  58. package/transforms/group.d.ts +4 -0
  59. package/transforms/index.d.ts +3 -2
  60. package/transforms/z-index.d.ts +13 -0
  61. package/utils/angle.d.ts +8 -1
  62. package/utils/clipboard/common.d.ts +1 -1
  63. package/utils/clipboard/types.d.ts +1 -1
  64. package/utils/common.d.ts +8 -0
  65. package/utils/debug.d.ts +1 -0
  66. package/utils/fragment.d.ts +4 -0
  67. package/utils/group.d.ts +4 -2
  68. package/utils/helper.d.ts +4 -1
  69. package/utils/index.d.ts +4 -0
  70. package/utils/math.d.ts +1 -0
  71. package/utils/position.d.ts +1 -1
  72. package/utils/selection.d.ts +1 -1
  73. package/utils/snap/snap-moving.d.ts +5 -0
  74. package/utils/snap/snap.d.ts +31 -0
  75. package/utils/weak-maps.d.ts +3 -0
  76. package/utils/z-index.d.ts +5 -0
  77. package/core/children/children.component.d.ts +0 -17
  78. package/core/children/effect.d.ts +0 -2
  79. package/core/element/element.component.d.ts +0 -30
  80. package/esm2022/core/children/children.component.mjs +0 -60
  81. package/esm2022/core/children/effect.mjs +0 -2
  82. package/esm2022/core/element/element.component.mjs +0 -105
  83. package/esm2022/utils/reaction-manager.mjs +0 -371
  84. package/utils/reaction-manager.d.ts +0 -41
@@ -3,12 +3,15 @@ export const IS_BOARD_CACHE = new WeakMap();
3
3
  export const FLUSHING = new WeakMap();
4
4
  export const NODE_TO_INDEX = new WeakMap();
5
5
  export const NODE_TO_PARENT = new WeakMap();
6
+ export const NODE_TO_G = new WeakMap();
7
+ export const NODE_TO_CONTAINER_G = new WeakMap();
6
8
  export const IS_TEXT_EDITABLE = new WeakMap();
7
9
  export const BOARD_TO_ON_CHANGE = new WeakMap();
8
10
  export const BOARD_TO_AFTER_CHANGE = new WeakMap();
9
11
  export const BOARD_TO_COMPONENT = new WeakMap();
10
12
  export const BOARD_TO_ROUGH_SVG = new WeakMap();
11
13
  export const BOARD_TO_HOST = new WeakMap();
14
+ export const IS_BOARD_ALIVE = new WeakMap();
12
15
  export const BOARD_TO_ELEMENT_HOST = new WeakMap();
13
16
  export const BOARD_TO_SELECTED_ELEMENT = new WeakMap();
14
17
  export const BOARD_TO_MOVING_POINT_IN_BOARD = new WeakMap();
@@ -19,4 +22,4 @@ export const BOARD_TO_IS_SELECTION_MOVING = new WeakMap();
19
22
  export const BOARD_TO_TEMPORARY_ELEMENTS = new WeakMap();
20
23
  export const BOARD_TO_MOVING_ELEMENT = new WeakMap();
21
24
  export const PATH_REFS = new WeakMap();
22
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vhay1tYXBzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvdXRpbHMvd2Vhay1tYXBzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVFBLDhCQUE4QjtBQUM5QixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxPQUFPLEVBQW1CLENBQUM7QUFFN0QsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLElBQUksT0FBTyxFQUF1QixDQUFDO0FBRTNELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxJQUFJLE9BQU8sRUFBcUIsQ0FBQztBQUU5RCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxPQUFPLEVBQXVCLENBQUM7QUFFakUsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxPQUFPLEVBQXVCLENBQUM7QUFFbkUsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxPQUFPLEVBQTBCLENBQUM7QUFFeEUsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxPQUFPLEVBQTBCLENBQUM7QUFFM0UsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxPQUFPLEVBQXVDLENBQUM7QUFFckYsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxPQUFPLEVBQXdCLENBQUM7QUFFdEUsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLElBQUksT0FBTyxFQUE2QixDQUFDO0FBRXRFLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLElBQUksT0FBTyxFQVM3QyxDQUFDO0FBRUosTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsSUFBSSxPQUFPLEVBQThCLENBQUM7QUFFbkYsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQUcsSUFBSSxPQUFPLEVBQXFCLENBQUM7QUFFL0UsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxPQUFPLEVBQXFCLENBQUM7QUFFdEUsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQUcsSUFBSSxPQUFPLEVBQXFCLENBQUM7QUFFOUUsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsSUFBSSxPQUFPLEVBQXVCLENBQUM7QUFFL0UscUNBQXFDO0FBQ3JDLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLElBQUksT0FBTyxFQUE0RCxDQUFDO0FBRW5ILE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLElBQUksT0FBTyxFQUE4QixDQUFDO0FBRWpGLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBc0MsSUFBSSxPQUFPLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJvdWdoU1ZHIH0gZnJvbSAncm91Z2hqcy9iaW4vc3ZnJztcbmltcG9ydCB7IEJvYXJkQ29tcG9uZW50SW50ZXJmYWNlIH0gZnJvbSAnLi4vYm9hcmQvYm9hcmQuY29tcG9uZW50LmludGVyZmFjZSc7XG5pbXBvcnQgeyBQbGFpdEVsZW1lbnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2VsZW1lbnQnO1xuaW1wb3J0IHsgUGxhaXRCb2FyZCB9IGZyb20gJy4uL2ludGVyZmFjZXMvYm9hcmQnO1xuaW1wb3J0IHsgUG9pbnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3BvaW50JztcbmltcG9ydCB7IEFuY2VzdG9yLCBQbGFpdE5vZGUgfSBmcm9tICcuLi9pbnRlcmZhY2VzL25vZGUnO1xuaW1wb3J0IHsgUGF0aFJlZiB9IGZyb20gJy4uL2ludGVyZmFjZXMvcGF0aC1yZWYnO1xuXG4vLyByZWNvcmQgcmljaHRleHQgdHlwZSBzdGF0dXNcbmV4cG9ydCBjb25zdCBJU19CT0FSRF9DQUNIRSA9IG5ldyBXZWFrTWFwPE9iamVjdCwgYm9vbGVhbj4oKTtcblxuZXhwb3J0IGNvbnN0IEZMVVNISU5HID0gbmV3IFdlYWtNYXA8UGxhaXRCb2FyZCwgYm9vbGVhbj4oKTtcblxuZXhwb3J0IGNvbnN0IE5PREVfVE9fSU5ERVggPSBuZXcgV2Vha01hcDxQbGFpdE5vZGUsIG51bWJlcj4oKTtcblxuZXhwb3J0IGNvbnN0IE5PREVfVE9fUEFSRU5UID0gbmV3IFdlYWtNYXA8UGxhaXROb2RlLCBBbmNlc3Rvcj4oKTtcblxuZXhwb3J0IGNvbnN0IElTX1RFWFRfRURJVEFCTEUgPSBuZXcgV2Vha01hcDxQbGFpdEJvYXJkLCBib29sZWFuPigpO1xuXG5leHBvcnQgY29uc3QgQk9BUkRfVE9fT05fQ0hBTkdFID0gbmV3IFdlYWtNYXA8UGxhaXRCb2FyZCwgKCkgPT4gdm9pZD4oKTtcblxuZXhwb3J0IGNvbnN0IEJPQVJEX1RPX0FGVEVSX0NIQU5HRSA9IG5ldyBXZWFrTWFwPFBsYWl0Qm9hcmQsICgpID0+IHZvaWQ+KCk7XG5cbmV4cG9ydCBjb25zdCBCT0FSRF9UT19DT01QT05FTlQgPSBuZXcgV2Vha01hcDxQbGFpdEJvYXJkLCBCb2FyZENvbXBvbmVudEludGVyZmFjZT4oKTtcblxuZXhwb3J0IGNvbnN0IEJPQVJEX1RPX1JPVUdIX1NWRyA9IG5ldyBXZWFrTWFwPFBsYWl0Qm9hcmQsIFJvdWdoU1ZHPigpO1xuXG5leHBvcnQgY29uc3QgQk9BUkRfVE9fSE9TVCA9IG5ldyBXZWFrTWFwPFBsYWl0Qm9hcmQsIFNWR1NWR0VsZW1lbnQ+KCk7XG5cbmV4cG9ydCBjb25zdCBCT0FSRF9UT19FTEVNRU5UX0hPU1QgPSBuZXcgV2Vha01hcDxcbiAgICBQbGFpdEJvYXJkLFxuICAgIHtcbiAgICAgICAgaG9zdDogU1ZHR0VsZW1lbnQ7XG4gICAgICAgIHVwcGVySG9zdDogU1ZHR0VsZW1lbnQ7XG4gICAgICAgIGFjdGl2ZUhvc3Q6IFNWR0dFbGVtZW50O1xuICAgICAgICBjb250YWluZXI6IEhUTUxFbGVtZW50O1xuICAgICAgICB2aWV3cG9ydENvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gICAgfVxuPigpO1xuXG5leHBvcnQgY29uc3QgQk9BUkRfVE9fU0VMRUNURURfRUxFTUVOVCA9IG5ldyBXZWFrTWFwPFBsYWl0Qm9hcmQsIFBsYWl0RWxlbWVudFtdPigpO1xuXG5leHBvcnQgY29uc3QgQk9BUkRfVE9fTU9WSU5HX1BPSU5UX0lOX0JPQVJEID0gbmV3IFdlYWtNYXA8UGxhaXRCb2FyZCwgUG9pbnQ+KCk7XG5cbmV4cG9ydCBjb25zdCBCT0FSRF9UT19NT1ZJTkdfUE9JTlQgPSBuZXcgV2Vha01hcDxQbGFpdEJvYXJkLCBQb2ludD4oKTtcblxuZXhwb3J0IGNvbnN0IEJPQVJEX1RPX1ZJRVdQT1JUX09SSUdJTkFUSU9OID0gbmV3IFdlYWtNYXA8UGxhaXRCb2FyZCwgUG9pbnQ+KCk7XG5cbmV4cG9ydCBjb25zdCBCT0FSRF9UT19JU19TRUxFQ1RJT05fTU9WSU5HID0gbmV3IFdlYWtNYXA8UGxhaXRCb2FyZCwgYm9vbGVhbj4oKTtcblxuLy8gc2F2ZSBubyBzdGFuZGFyZCBzZWxlY3RlZCBlbGVtZW50c1xuZXhwb3J0IGNvbnN0IEJPQVJEX1RPX1RFTVBPUkFSWV9FTEVNRU5UUyA9IG5ldyBXZWFrTWFwPFBsYWl0Qm9hcmQsIHsgZWxlbWVudHM6IFBsYWl0RWxlbWVudFtdOyB0aW1lb3V0SWQ6IGFueSB9PigpO1xuXG5leHBvcnQgY29uc3QgQk9BUkRfVE9fTU9WSU5HX0VMRU1FTlQgPSBuZXcgV2Vha01hcDxQbGFpdEJvYXJkLCBQbGFpdEVsZW1lbnRbXT4oKTtcblxuZXhwb3J0IGNvbnN0IFBBVEhfUkVGUzogV2Vha01hcDxQbGFpdEJvYXJkLCBTZXQ8UGF0aFJlZj4+ID0gbmV3IFdlYWtNYXAoKTtcbiJdfQ==
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vhay1tYXBzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvdXRpbHMvd2Vhay1tYXBzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVFBLDhCQUE4QjtBQUM5QixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxPQUFPLEVBQW1CLENBQUM7QUFFN0QsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLElBQUksT0FBTyxFQUF1QixDQUFDO0FBRTNELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxJQUFJLE9BQU8sRUFBcUIsQ0FBQztBQUU5RCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxPQUFPLEVBQXVCLENBQUM7QUFFakUsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLElBQUksT0FBTyxFQUEwQixDQUFDO0FBRS9ELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLElBQUksT0FBTyxFQUEwQixDQUFDO0FBRXpFLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLElBQUksT0FBTyxFQUF1QixDQUFDO0FBRW5FLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLElBQUksT0FBTyxFQUEwQixDQUFDO0FBRXhFLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLElBQUksT0FBTyxFQUEwQixDQUFDO0FBRTNFLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLElBQUksT0FBTyxFQUF1QyxDQUFDO0FBRXJGLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLElBQUksT0FBTyxFQUF3QixDQUFDO0FBRXRFLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxJQUFJLE9BQU8sRUFBNkIsQ0FBQztBQUV0RSxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxPQUFPLEVBQXVCLENBQUM7QUFFakUsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxPQUFPLEVBUzdDLENBQUM7QUFFSixNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLE9BQU8sRUFBOEIsQ0FBQztBQUVuRixNQUFNLENBQUMsTUFBTSw4QkFBOEIsR0FBRyxJQUFJLE9BQU8sRUFBcUIsQ0FBQztBQUUvRSxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLE9BQU8sRUFBcUIsQ0FBQztBQUV0RSxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBRyxJQUFJLE9BQU8sRUFBcUIsQ0FBQztBQUU5RSxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyxJQUFJLE9BQU8sRUFBdUIsQ0FBQztBQUUvRSxxQ0FBcUM7QUFDckMsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsSUFBSSxPQUFPLEVBQTRELENBQUM7QUFFbkgsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxPQUFPLEVBQThCLENBQUM7QUFFakYsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFzQyxJQUFJLE9BQU8sRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUm91Z2hTVkcgfSBmcm9tICdyb3VnaGpzL2Jpbi9zdmcnO1xuaW1wb3J0IHsgQm9hcmRDb21wb25lbnRJbnRlcmZhY2UgfSBmcm9tICcuLi9ib2FyZC9ib2FyZC5jb21wb25lbnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IFBsYWl0RWxlbWVudCB9IGZyb20gJy4uL2ludGVyZmFjZXMvZWxlbWVudCc7XG5pbXBvcnQgeyBQbGFpdEJvYXJkIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9ib2FyZCc7XG5pbXBvcnQgeyBQb2ludCB9IGZyb20gJy4uL2ludGVyZmFjZXMvcG9pbnQnO1xuaW1wb3J0IHsgQW5jZXN0b3IsIFBsYWl0Tm9kZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvbm9kZSc7XG5pbXBvcnQgeyBQYXRoUmVmIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9wYXRoLXJlZic7XG5cbi8vIHJlY29yZCByaWNodGV4dCB0eXBlIHN0YXR1c1xuZXhwb3J0IGNvbnN0IElTX0JPQVJEX0NBQ0hFID0gbmV3IFdlYWtNYXA8T2JqZWN0LCBib29sZWFuPigpO1xuXG5leHBvcnQgY29uc3QgRkxVU0hJTkcgPSBuZXcgV2Vha01hcDxQbGFpdEJvYXJkLCBib29sZWFuPigpO1xuXG5leHBvcnQgY29uc3QgTk9ERV9UT19JTkRFWCA9IG5ldyBXZWFrTWFwPFBsYWl0Tm9kZSwgbnVtYmVyPigpO1xuXG5leHBvcnQgY29uc3QgTk9ERV9UT19QQVJFTlQgPSBuZXcgV2Vha01hcDxQbGFpdE5vZGUsIEFuY2VzdG9yPigpO1xuXG5leHBvcnQgY29uc3QgTk9ERV9UT19HID0gbmV3IFdlYWtNYXA8UGxhaXROb2RlLCBTVkdHRWxlbWVudD4oKTtcblxuZXhwb3J0IGNvbnN0IE5PREVfVE9fQ09OVEFJTkVSX0cgPSBuZXcgV2Vha01hcDxQbGFpdE5vZGUsIFNWR0dFbGVtZW50PigpO1xuXG5leHBvcnQgY29uc3QgSVNfVEVYVF9FRElUQUJMRSA9IG5ldyBXZWFrTWFwPFBsYWl0Qm9hcmQsIGJvb2xlYW4+KCk7XG5cbmV4cG9ydCBjb25zdCBCT0FSRF9UT19PTl9DSEFOR0UgPSBuZXcgV2Vha01hcDxQbGFpdEJvYXJkLCAoKSA9PiB2b2lkPigpO1xuXG5leHBvcnQgY29uc3QgQk9BUkRfVE9fQUZURVJfQ0hBTkdFID0gbmV3IFdlYWtNYXA8UGxhaXRCb2FyZCwgKCkgPT4gdm9pZD4oKTtcblxuZXhwb3J0IGNvbnN0IEJPQVJEX1RPX0NPTVBPTkVOVCA9IG5ldyBXZWFrTWFwPFBsYWl0Qm9hcmQsIEJvYXJkQ29tcG9uZW50SW50ZXJmYWNlPigpO1xuXG5leHBvcnQgY29uc3QgQk9BUkRfVE9fUk9VR0hfU1ZHID0gbmV3IFdlYWtNYXA8UGxhaXRCb2FyZCwgUm91Z2hTVkc+KCk7XG5cbmV4cG9ydCBjb25zdCBCT0FSRF9UT19IT1NUID0gbmV3IFdlYWtNYXA8UGxhaXRCb2FyZCwgU1ZHU1ZHRWxlbWVudD4oKTtcblxuZXhwb3J0IGNvbnN0IElTX0JPQVJEX0FMSVZFID0gbmV3IFdlYWtNYXA8UGxhaXRCb2FyZCwgYm9vbGVhbj4oKTtcblxuZXhwb3J0IGNvbnN0IEJPQVJEX1RPX0VMRU1FTlRfSE9TVCA9IG5ldyBXZWFrTWFwPFxuICAgIFBsYWl0Qm9hcmQsXG4gICAge1xuICAgICAgICBob3N0OiBTVkdHRWxlbWVudDtcbiAgICAgICAgdXBwZXJIb3N0OiBTVkdHRWxlbWVudDtcbiAgICAgICAgYWN0aXZlSG9zdDogU1ZHR0VsZW1lbnQ7XG4gICAgICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gICAgICAgIHZpZXdwb3J0Q29udGFpbmVyOiBIVE1MRWxlbWVudDtcbiAgICB9XG4+KCk7XG5cbmV4cG9ydCBjb25zdCBCT0FSRF9UT19TRUxFQ1RFRF9FTEVNRU5UID0gbmV3IFdlYWtNYXA8UGxhaXRCb2FyZCwgUGxhaXRFbGVtZW50W10+KCk7XG5cbmV4cG9ydCBjb25zdCBCT0FSRF9UT19NT1ZJTkdfUE9JTlRfSU5fQk9BUkQgPSBuZXcgV2Vha01hcDxQbGFpdEJvYXJkLCBQb2ludD4oKTtcblxuZXhwb3J0IGNvbnN0IEJPQVJEX1RPX01PVklOR19QT0lOVCA9IG5ldyBXZWFrTWFwPFBsYWl0Qm9hcmQsIFBvaW50PigpO1xuXG5leHBvcnQgY29uc3QgQk9BUkRfVE9fVklFV1BPUlRfT1JJR0lOQVRJT04gPSBuZXcgV2Vha01hcDxQbGFpdEJvYXJkLCBQb2ludD4oKTtcblxuZXhwb3J0IGNvbnN0IEJPQVJEX1RPX0lTX1NFTEVDVElPTl9NT1ZJTkcgPSBuZXcgV2Vha01hcDxQbGFpdEJvYXJkLCBib29sZWFuPigpO1xuXG4vLyBzYXZlIG5vIHN0YW5kYXJkIHNlbGVjdGVkIGVsZW1lbnRzXG5leHBvcnQgY29uc3QgQk9BUkRfVE9fVEVNUE9SQVJZX0VMRU1FTlRTID0gbmV3IFdlYWtNYXA8UGxhaXRCb2FyZCwgeyBlbGVtZW50czogUGxhaXRFbGVtZW50W107IHRpbWVvdXRJZDogYW55IH0+KCk7XG5cbmV4cG9ydCBjb25zdCBCT0FSRF9UT19NT1ZJTkdfRUxFTUVOVCA9IG5ldyBXZWFrTWFwPFBsYWl0Qm9hcmQsIFBsYWl0RWxlbWVudFtdPigpO1xuXG5leHBvcnQgY29uc3QgUEFUSF9SRUZTOiBXZWFrTWFwPFBsYWl0Qm9hcmQsIFNldDxQYXRoUmVmPj4gPSBuZXcgV2Vha01hcCgpO1xuIl19
@@ -0,0 +1,166 @@
1
+ import { PlaitGroupElement } from '../interfaces';
2
+ import { getElementsIndices } from './common';
3
+ import { getEditingGroup, getElementsInGroup, getGroupByElement, getHighestGroup, isSelectedAllElementsInGroup } from './group';
4
+ import { findIndex, findLastIndex } from './helper';
5
+ import { sortElements } from './position';
6
+ import { getSelectedElements } from './selected-element';
7
+ export const getOneMoveOptions = (board, direction) => {
8
+ const indicesToMove = getElementsIndices(board, getSelectedElements(board));
9
+ let groupedIndices = toContiguousGroups(board, indicesToMove);
10
+ if (direction === 'up') {
11
+ groupedIndices = groupedIndices.reverse();
12
+ }
13
+ let moveContents = [];
14
+ groupedIndices.forEach((indices, i) => {
15
+ const leadingIndex = indices[0];
16
+ const trailingIndex = indices[indices.length - 1];
17
+ const boundaryIndex = direction === 'down' ? leadingIndex : trailingIndex;
18
+ const targetIndex = getTargetIndex(board, boundaryIndex, direction);
19
+ if (targetIndex === -1 || boundaryIndex === targetIndex) {
20
+ return;
21
+ }
22
+ if (direction === 'down') {
23
+ indices = indices.reverse();
24
+ }
25
+ moveContents.push(...indices.map(path => {
26
+ return {
27
+ element: board.children[path],
28
+ newPath: [targetIndex]
29
+ };
30
+ }));
31
+ });
32
+ return moveContents;
33
+ };
34
+ export const getAllMoveOptions = (board, direction) => {
35
+ const indicesToMove = getElementsIndices(board, getSelectedElements(board));
36
+ let groupedIndices = toContiguousGroups(board, indicesToMove);
37
+ let moveContents = [];
38
+ if (direction === 'down') {
39
+ groupedIndices = groupedIndices.reverse();
40
+ }
41
+ groupedIndices.forEach(indices => {
42
+ const leadingIndex = indices[0];
43
+ const trailingIndex = indices[indices.length - 1];
44
+ const boundaryIndex = direction === 'down' ? leadingIndex : trailingIndex;
45
+ const sourceElement = board.children[boundaryIndex];
46
+ const editingGroup = getEditingGroup(board, sourceElement);
47
+ let targetIndex = direction === 'down' ? 0 : board.children.length - 1;
48
+ if (editingGroup) {
49
+ const elementsInGroup = sortElements(board, getElementsInGroup(board, editingGroup, true, true));
50
+ targetIndex =
51
+ direction === 'down'
52
+ ? board.children.indexOf(elementsInGroup[0])
53
+ : board.children.indexOf(elementsInGroup[elementsInGroup.length - 1]);
54
+ }
55
+ if (direction === 'down') {
56
+ indices = indices.reverse();
57
+ }
58
+ moveContents.push(...indices.map(path => {
59
+ return {
60
+ element: board.children[path],
61
+ newPath: [targetIndex]
62
+ };
63
+ }));
64
+ });
65
+ return moveContents;
66
+ };
67
+ export const canSetZIndex = (board) => {
68
+ const selectedElements = getSelectedElements(board).filter(item => board.canSetZIndex(item));
69
+ return selectedElements.length > 0;
70
+ };
71
+ const toContiguousGroups = (board, array) => {
72
+ let cursor = 0;
73
+ return array.reduce((acc, value, index) => {
74
+ if (index > 0) {
75
+ const currentElement = board.children[value];
76
+ const previousElement = board.children[array[index - 1]];
77
+ const isContiguous = value - 1 === array[index - 1]
78
+ ? true
79
+ : board.children.every((item, childIndex) => {
80
+ if (childIndex > array[index - 1] && childIndex <= value - 1) {
81
+ return PlaitGroupElement.isGroup(item);
82
+ }
83
+ return true;
84
+ });
85
+ let isPartialSelectGroupElement = false;
86
+ if (previousElement.groupId || (currentElement.groupId && previousElement.groupId !== currentElement.groupId)) {
87
+ let isPartialSelectPreviousGroup = false;
88
+ let isPartialSelectCurrentElement = false;
89
+ if (previousElement.groupId) {
90
+ const highestGroup = getHighestGroup(board, previousElement);
91
+ isPartialSelectPreviousGroup = !isSelectedAllElementsInGroup(board, highestGroup);
92
+ }
93
+ if (currentElement.groupId) {
94
+ const highestGroup = getHighestGroup(board, currentElement);
95
+ isPartialSelectCurrentElement = !isSelectedAllElementsInGroup(board, highestGroup);
96
+ }
97
+ isPartialSelectGroupElement = isPartialSelectPreviousGroup || isPartialSelectCurrentElement;
98
+ }
99
+ if (!isContiguous || isPartialSelectGroupElement) {
100
+ cursor = ++cursor;
101
+ }
102
+ }
103
+ (acc[cursor] || (acc[cursor] = [])).push(value);
104
+ return acc;
105
+ }, []);
106
+ };
107
+ /**
108
+ * Returns next candidate index that's available to be moved to. Currently that
109
+ * is a non-deleted element, and not inside a group (unless we're editing it).
110
+ */
111
+ const getTargetIndex = (board, boundaryIndex, direction) => {
112
+ if ((boundaryIndex === 0 && direction === 'down') || (boundaryIndex === board.children.length - 1 && direction === 'up')) {
113
+ return -1;
114
+ }
115
+ const indexFilter = (element) => {
116
+ if (element.isDeleted || PlaitGroupElement.isGroup(element)) {
117
+ return false;
118
+ }
119
+ return true;
120
+ };
121
+ const candidateIndex = direction === 'down'
122
+ ? findLastIndex(board.children, el => indexFilter(el), Math.max(0, boundaryIndex - 1))
123
+ : findIndex(board.children, el => indexFilter(el), boundaryIndex + 1);
124
+ const nextElement = board.children[candidateIndex];
125
+ if (!nextElement) {
126
+ return -1;
127
+ }
128
+ const elements = [...board.children];
129
+ const sourceElement = elements[boundaryIndex];
130
+ const editingGroup = getEditingGroup(board, sourceElement);
131
+ const nextElementGroups = (getGroupByElement(board, nextElement, true) || []);
132
+ // candidate element is a sibling in current editing group → return
133
+ if (editingGroup && sourceElement?.groupId !== nextElement?.groupId) {
134
+ // candidate element is outside current editing group → prevent
135
+ if (!nextElementGroups.find(item => item.id === editingGroup.id)) {
136
+ return -1;
137
+ }
138
+ }
139
+ if (!nextElement.groupId) {
140
+ return candidateIndex;
141
+ }
142
+ let siblingGroup;
143
+ if (editingGroup) {
144
+ siblingGroup = nextElementGroups[nextElementGroups.indexOf(editingGroup) - 1];
145
+ }
146
+ else {
147
+ siblingGroup = nextElementGroups[nextElementGroups.length - 1];
148
+ }
149
+ if (siblingGroup) {
150
+ let elementsInSiblingGroup = getElementsInGroup(board, siblingGroup, true, false);
151
+ if (elementsInSiblingGroup.length) {
152
+ elementsInSiblingGroup.sort((a, b) => {
153
+ const indexA = board.children.findIndex(child => child.id === a.id);
154
+ const indexB = board.children.findIndex(child => child.id === b.id);
155
+ return indexA - indexB;
156
+ });
157
+ // assumes getElementsInGroup() returned elements are sorted
158
+ // by zIndex (ascending)
159
+ return direction === 'down'
160
+ ? elements.indexOf(elementsInSiblingGroup[0])
161
+ : elements.indexOf(elementsInSiblingGroup[elementsInSiblingGroup.length - 1]);
162
+ }
163
+ }
164
+ return candidateIndex;
165
+ };
166
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiei1pbmRleC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvcmUvc3JjL3V0aWxzL3otaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUE0QixpQkFBaUIsRUFBYyxNQUFNLGVBQWUsQ0FBQztBQUN4RixPQUFPLEVBQWtCLGtCQUFrQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzlELE9BQU8sRUFBRSxlQUFlLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLDRCQUE0QixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2hJLE9BQU8sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDMUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFekQsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxLQUFpQixFQUFFLFNBQXdCLEVBQW9CLEVBQUU7SUFDL0YsTUFBTSxhQUFhLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxFQUFFLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDNUUsSUFBSSxjQUFjLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQzlELElBQUksU0FBUyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3JCLGNBQWMsR0FBRyxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDOUMsQ0FBQztJQUNELElBQUksWUFBWSxHQUFxQixFQUFFLENBQUM7SUFDeEMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNsQyxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEMsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLE9BQU8s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SixZQUFZLEdBQUcsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFDRCxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2YsSUFBSSxzQkFBc0IsR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNsRixJQUFJLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDakMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDcEUsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDcEUsT0FBTyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQzNCLENBQUMsQ0FBQyxDQUFDO1lBQ0gsNERBQTREO1lBQzVELHdCQUF3QjtZQUN4QixPQUFPLFNBQVMsS0FBSyxNQUFNO2dCQUN2QixDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDN0MsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsc0JBQXNCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEYsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPLGNBQWMsQ0FBQztBQUMxQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQbGFpdEJvYXJkLCBQbGFpdEVsZW1lbnQsIFBsYWl0R3JvdXBFbGVtZW50LCBQbGFpdEdyb3VwIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBNb3ZlTm9kZU9wdGlvbiwgZ2V0RWxlbWVudHNJbmRpY2VzIH0gZnJvbSAnLi9jb21tb24nO1xuaW1wb3J0IHsgZ2V0RWRpdGluZ0dyb3VwLCBnZXRFbGVtZW50c0luR3JvdXAsIGdldEdyb3VwQnlFbGVtZW50LCBnZXRIaWdoZXN0R3JvdXAsIGlzU2VsZWN0ZWRBbGxFbGVtZW50c0luR3JvdXAgfSBmcm9tICcuL2dyb3VwJztcbmltcG9ydCB7IGZpbmRJbmRleCwgZmluZExhc3RJbmRleCB9IGZyb20gJy4vaGVscGVyJztcbmltcG9ydCB7IHNvcnRFbGVtZW50cyB9IGZyb20gJy4vcG9zaXRpb24nO1xuaW1wb3J0IHsgZ2V0U2VsZWN0ZWRFbGVtZW50cyB9IGZyb20gJy4vc2VsZWN0ZWQtZWxlbWVudCc7XG5cbmV4cG9ydCBjb25zdCBnZXRPbmVNb3ZlT3B0aW9ucyA9IChib2FyZDogUGxhaXRCb2FyZCwgZGlyZWN0aW9uOiAnZG93bicgfCAndXAnKTogTW92ZU5vZGVPcHRpb25bXSA9PiB7XG4gICAgY29uc3QgaW5kaWNlc1RvTW92ZSA9IGdldEVsZW1lbnRzSW5kaWNlcyhib2FyZCwgZ2V0U2VsZWN0ZWRFbGVtZW50cyhib2FyZCkpO1xuICAgIGxldCBncm91cGVkSW5kaWNlcyA9IHRvQ29udGlndW91c0dyb3Vwcyhib2FyZCwgaW5kaWNlc1RvTW92ZSk7XG4gICAgaWYgKGRpcmVjdGlvbiA9PT0gJ3VwJykge1xuICAgICAgICBncm91cGVkSW5kaWNlcyA9IGdyb3VwZWRJbmRpY2VzLnJldmVyc2UoKTtcbiAgICB9XG4gICAgbGV0IG1vdmVDb250ZW50czogTW92ZU5vZGVPcHRpb25bXSA9IFtdO1xuICAgIGdyb3VwZWRJbmRpY2VzLmZvckVhY2goKGluZGljZXMsIGkpID0+IHtcbiAgICAgICAgY29uc3QgbGVhZGluZ0luZGV4ID0gaW5kaWNlc1swXTtcbiAgICAgICAgY29uc3QgdHJhaWxpbmdJbmRleCA9IGluZGljZXNbaW5kaWNlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgY29uc3QgYm91bmRhcnlJbmRleCA9IGRpcmVjdGlvbiA9PT0gJ2Rvd24nID8gbGVhZGluZ0luZGV4IDogdHJhaWxpbmdJbmRleDtcbiAgICAgICAgY29uc3QgdGFyZ2V0SW5kZXggPSBnZXRUYXJnZXRJbmRleChib2FyZCwgYm91bmRhcnlJbmRleCwgZGlyZWN0aW9uKTtcbiAgICAgICAgaWYgKHRhcmdldEluZGV4ID09PSAtMSB8fCBib3VuZGFyeUluZGV4ID09PSB0YXJnZXRJbmRleCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaXJlY3Rpb24gPT09ICdkb3duJykge1xuICAgICAgICAgICAgaW5kaWNlcyA9IGluZGljZXMucmV2ZXJzZSgpO1xuICAgICAgICB9XG4gICAgICAgIG1vdmVDb250ZW50cy5wdXNoKFxuICAgICAgICAgICAgLi4uaW5kaWNlcy5tYXAocGF0aCA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudDogYm9hcmQuY2hpbGRyZW5bcGF0aF0sXG4gICAgICAgICAgICAgICAgICAgIG5ld1BhdGg6IFt0YXJnZXRJbmRleF1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBtb3ZlQ29udGVudHM7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QWxsTW92ZU9wdGlvbnMgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGRpcmVjdGlvbjogJ2Rvd24nIHwgJ3VwJyk6IE1vdmVOb2RlT3B0aW9uW10gPT4ge1xuICAgIGNvbnN0IGluZGljZXNUb01vdmUgPSBnZXRFbGVtZW50c0luZGljZXMoYm9hcmQsIGdldFNlbGVjdGVkRWxlbWVudHMoYm9hcmQpKTtcbiAgICBsZXQgZ3JvdXBlZEluZGljZXMgPSB0b0NvbnRpZ3VvdXNHcm91cHMoYm9hcmQsIGluZGljZXNUb01vdmUpO1xuICAgIGxldCBtb3ZlQ29udGVudHM6IE1vdmVOb2RlT3B0aW9uW10gPSBbXTtcbiAgICBpZiAoZGlyZWN0aW9uID09PSAnZG93bicpIHtcbiAgICAgICAgZ3JvdXBlZEluZGljZXMgPSBncm91cGVkSW5kaWNlcy5yZXZlcnNlKCk7XG4gICAgfVxuICAgIGdyb3VwZWRJbmRpY2VzLmZvckVhY2goaW5kaWNlcyA9PiB7XG4gICAgICAgIGNvbnN0IGxlYWRpbmdJbmRleCA9IGluZGljZXNbMF07XG4gICAgICAgIGNvbnN0IHRyYWlsaW5nSW5kZXggPSBpbmRpY2VzW2luZGljZXMubGVuZ3RoIC0gMV07XG4gICAgICAgIGNvbnN0IGJvdW5kYXJ5SW5kZXggPSBkaXJlY3Rpb24gPT09ICdkb3duJyA/IGxlYWRpbmdJbmRleCA6IHRyYWlsaW5nSW5kZXg7XG4gICAgICAgIGNvbnN0IHNvdXJjZUVsZW1lbnQgPSBib2FyZC5jaGlsZHJlbltib3VuZGFyeUluZGV4XTtcbiAgICAgICAgY29uc3QgZWRpdGluZ0dyb3VwID0gZ2V0RWRpdGluZ0dyb3VwKGJvYXJkLCBzb3VyY2VFbGVtZW50KTtcbiAgICAgICAgbGV0IHRhcmdldEluZGV4ID0gZGlyZWN0aW9uID09PSAnZG93bicgPyAwIDogYm9hcmQuY2hpbGRyZW4ubGVuZ3RoIC0gMTtcbiAgICAgICAgaWYgKGVkaXRpbmdHcm91cCkge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudHNJbkdyb3VwID0gc29ydEVsZW1lbnRzKGJvYXJkLCBnZXRFbGVtZW50c0luR3JvdXAoYm9hcmQsIGVkaXRpbmdHcm91cCwgdHJ1ZSwgdHJ1ZSkpO1xuICAgICAgICAgICAgdGFyZ2V0SW5kZXggPVxuICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9PT0gJ2Rvd24nXG4gICAgICAgICAgICAgICAgICAgID8gYm9hcmQuY2hpbGRyZW4uaW5kZXhPZihlbGVtZW50c0luR3JvdXBbMF0pXG4gICAgICAgICAgICAgICAgICAgIDogYm9hcmQuY2hpbGRyZW4uaW5kZXhPZihlbGVtZW50c0luR3JvdXBbZWxlbWVudHNJbkdyb3VwLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlyZWN0aW9uID09PSAnZG93bicpIHtcbiAgICAgICAgICAgIGluZGljZXMgPSBpbmRpY2VzLnJldmVyc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBtb3ZlQ29udGVudHMucHVzaChcbiAgICAgICAgICAgIC4uLmluZGljZXMubWFwKHBhdGggPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IGJvYXJkLmNoaWxkcmVuW3BhdGhdLFxuICAgICAgICAgICAgICAgICAgICBuZXdQYXRoOiBbdGFyZ2V0SW5kZXhdXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbW92ZUNvbnRlbnRzO1xufTtcblxuZXhwb3J0IGNvbnN0IGNhblNldFpJbmRleCA9IChib2FyZDogUGxhaXRCb2FyZCkgPT4ge1xuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKGJvYXJkKS5maWx0ZXIoaXRlbSA9PiBib2FyZC5jYW5TZXRaSW5kZXgoaXRlbSkpO1xuICAgIHJldHVybiBzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA+IDA7XG59O1xuXG5jb25zdCB0b0NvbnRpZ3VvdXNHcm91cHMgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGFycmF5OiBudW1iZXJbXSkgPT4ge1xuICAgIGxldCBjdXJzb3IgPSAwO1xuICAgIHJldHVybiBhcnJheS5yZWR1Y2UoKGFjYywgdmFsdWUsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChpbmRleCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRFbGVtZW50ID0gYm9hcmQuY2hpbGRyZW5bdmFsdWVdO1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXNFbGVtZW50ID0gYm9hcmQuY2hpbGRyZW5bYXJyYXlbaW5kZXggLSAxXV07XG4gICAgICAgICAgICBjb25zdCBpc0NvbnRpZ3VvdXMgPVxuICAgICAgICAgICAgICAgIHZhbHVlIC0gMSA9PT0gYXJyYXlbaW5kZXggLSAxXVxuICAgICAgICAgICAgICAgICAgICA/IHRydWVcbiAgICAgICAgICAgICAgICAgICAgOiBib2FyZC5jaGlsZHJlbi5ldmVyeSgoaXRlbSwgY2hpbGRJbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRJbmRleCA+IGFycmF5W2luZGV4IC0gMV0gJiYgY2hpbGRJbmRleCA8PSB2YWx1ZSAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQbGFpdEdyb3VwRWxlbWVudC5pc0dyb3VwKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGV0IGlzUGFydGlhbFNlbGVjdEdyb3VwRWxlbWVudCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHByZXZpb3VzRWxlbWVudC5ncm91cElkIHx8IChjdXJyZW50RWxlbWVudC5ncm91cElkICYmIHByZXZpb3VzRWxlbWVudC5ncm91cElkICE9PSBjdXJyZW50RWxlbWVudC5ncm91cElkKSkge1xuICAgICAgICAgICAgICAgIGxldCBpc1BhcnRpYWxTZWxlY3RQcmV2aW91c0dyb3VwID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgbGV0IGlzUGFydGlhbFNlbGVjdEN1cnJlbnRFbGVtZW50ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzRWxlbWVudC5ncm91cElkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZ2hlc3RHcm91cCA9IGdldEhpZ2hlc3RHcm91cChib2FyZCwgcHJldmlvdXNFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgaXNQYXJ0aWFsU2VsZWN0UHJldmlvdXNHcm91cCA9ICFpc1NlbGVjdGVkQWxsRWxlbWVudHNJbkdyb3VwKGJvYXJkLCBoaWdoZXN0R3JvdXAhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50Lmdyb3VwSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlnaGVzdEdyb3VwID0gZ2V0SGlnaGVzdEdyb3VwKGJvYXJkLCBjdXJyZW50RWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGlzUGFydGlhbFNlbGVjdEN1cnJlbnRFbGVtZW50ID0gIWlzU2VsZWN0ZWRBbGxFbGVtZW50c0luR3JvdXAoYm9hcmQsIGhpZ2hlc3RHcm91cCEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpc1BhcnRpYWxTZWxlY3RHcm91cEVsZW1lbnQgPSBpc1BhcnRpYWxTZWxlY3RQcmV2aW91c0dyb3VwIHx8IGlzUGFydGlhbFNlbGVjdEN1cnJlbnRFbGVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc0NvbnRpZ3VvdXMgfHwgaXNQYXJ0aWFsU2VsZWN0R3JvdXBFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgY3Vyc29yID0gKytjdXJzb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgKGFjY1tjdXJzb3JdIHx8IChhY2NbY3Vyc29yXSA9IFtdKSkucHVzaCh2YWx1ZSk7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgW10gYXMgbnVtYmVyW11bXSk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgbmV4dCBjYW5kaWRhdGUgaW5kZXggdGhhdCdzIGF2YWlsYWJsZSB0byBiZSBtb3ZlZCB0by4gQ3VycmVudGx5IHRoYXRcbiAqICBpcyBhIG5vbi1kZWxldGVkIGVsZW1lbnQsIGFuZCBub3QgaW5zaWRlIGEgZ3JvdXAgKHVubGVzcyB3ZSdyZSBlZGl0aW5nIGl0KS5cbiAqL1xuY29uc3QgZ2V0VGFyZ2V0SW5kZXggPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGJvdW5kYXJ5SW5kZXg6IG51bWJlciwgZGlyZWN0aW9uOiAnZG93bicgfCAndXAnKSA9PiB7XG4gICAgaWYgKChib3VuZGFyeUluZGV4ID09PSAwICYmIGRpcmVjdGlvbiA9PT0gJ2Rvd24nKSB8fCAoYm91bmRhcnlJbmRleCA9PT0gYm9hcmQuY2hpbGRyZW4ubGVuZ3RoIC0gMSAmJiBkaXJlY3Rpb24gPT09ICd1cCcpKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgY29uc3QgaW5kZXhGaWx0ZXIgPSAoZWxlbWVudDogUGxhaXRFbGVtZW50KSA9PiB7XG4gICAgICAgIGlmIChlbGVtZW50LmlzRGVsZXRlZCB8fCBQbGFpdEdyb3VwRWxlbWVudC5pc0dyb3VwKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICBjb25zdCBjYW5kaWRhdGVJbmRleCA9XG4gICAgICAgIGRpcmVjdGlvbiA9PT0gJ2Rvd24nXG4gICAgICAgICAgICA/IGZpbmRMYXN0SW5kZXgoYm9hcmQuY2hpbGRyZW4sIGVsID0+IGluZGV4RmlsdGVyKGVsKSwgTWF0aC5tYXgoMCwgYm91bmRhcnlJbmRleCAtIDEpKVxuICAgICAgICAgICAgOiBmaW5kSW5kZXgoYm9hcmQuY2hpbGRyZW4sIGVsID0+IGluZGV4RmlsdGVyKGVsKSwgYm91bmRhcnlJbmRleCArIDEpO1xuXG4gICAgY29uc3QgbmV4dEVsZW1lbnQgPSBib2FyZC5jaGlsZHJlbltjYW5kaWRhdGVJbmRleF07XG4gICAgaWYgKCFuZXh0RWxlbWVudCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudHMgPSBbLi4uYm9hcmQuY2hpbGRyZW5dO1xuICAgIGNvbnN0IHNvdXJjZUVsZW1lbnQgPSBlbGVtZW50c1tib3VuZGFyeUluZGV4XTtcbiAgICBjb25zdCBlZGl0aW5nR3JvdXAgPSBnZXRFZGl0aW5nR3JvdXAoYm9hcmQsIHNvdXJjZUVsZW1lbnQpO1xuICAgIGNvbnN0IG5leHRFbGVtZW50R3JvdXBzID0gKGdldEdyb3VwQnlFbGVtZW50KGJvYXJkLCBuZXh0RWxlbWVudCwgdHJ1ZSkgfHwgW10pIGFzIFBsYWl0R3JvdXBbXTtcbiAgICAvLyBjYW5kaWRhdGUgZWxlbWVudCBpcyBhIHNpYmxpbmcgaW4gY3VycmVudCBlZGl0aW5nIGdyb3VwIOKGkiByZXR1cm5cbiAgICBpZiAoZWRpdGluZ0dyb3VwICYmIHNvdXJjZUVsZW1lbnQ/Lmdyb3VwSWQgIT09IG5leHRFbGVtZW50Py5ncm91cElkKSB7XG4gICAgICAgIC8vIGNhbmRpZGF0ZSBlbGVtZW50IGlzIG91dHNpZGUgY3VycmVudCBlZGl0aW5nIGdyb3VwIOKGkiBwcmV2ZW50XG4gICAgICAgIGlmICghKG5leHRFbGVtZW50R3JvdXBzIGFzIFBsYWl0R3JvdXBbXSkuZmluZChpdGVtID0+IGl0ZW0uaWQgPT09IGVkaXRpbmdHcm91cC5pZCkpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICghbmV4dEVsZW1lbnQuZ3JvdXBJZCkge1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlSW5kZXg7XG4gICAgfVxuXG4gICAgbGV0IHNpYmxpbmdHcm91cDogUGxhaXRHcm91cDtcbiAgICBpZiAoZWRpdGluZ0dyb3VwKSB7XG4gICAgICAgIHNpYmxpbmdHcm91cCA9IG5leHRFbGVtZW50R3JvdXBzW25leHRFbGVtZW50R3JvdXBzLmluZGV4T2YoZWRpdGluZ0dyb3VwKSAtIDFdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHNpYmxpbmdHcm91cCA9IG5leHRFbGVtZW50R3JvdXBzW25leHRFbGVtZW50R3JvdXBzLmxlbmd0aCAtIDFdO1xuICAgIH1cbiAgICBpZiAoc2libGluZ0dyb3VwKSB7XG4gICAgICAgIGxldCBlbGVtZW50c0luU2libGluZ0dyb3VwID0gZ2V0RWxlbWVudHNJbkdyb3VwKGJvYXJkLCBzaWJsaW5nR3JvdXAsIHRydWUsIGZhbHNlKTtcbiAgICAgICAgaWYgKGVsZW1lbnRzSW5TaWJsaW5nR3JvdXAubGVuZ3RoKSB7XG4gICAgICAgICAgICBlbGVtZW50c0luU2libGluZ0dyb3VwLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleEEgPSBib2FyZC5jaGlsZHJlbi5maW5kSW5kZXgoY2hpbGQgPT4gY2hpbGQuaWQgPT09IGEuaWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4QiA9IGJvYXJkLmNoaWxkcmVuLmZpbmRJbmRleChjaGlsZCA9PiBjaGlsZC5pZCA9PT0gYi5pZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4QSAtIGluZGV4QjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gYXNzdW1lcyBnZXRFbGVtZW50c0luR3JvdXAoKSByZXR1cm5lZCBlbGVtZW50cyBhcmUgc29ydGVkXG4gICAgICAgICAgICAvLyBieSB6SW5kZXggKGFzY2VuZGluZylcbiAgICAgICAgICAgIHJldHVybiBkaXJlY3Rpb24gPT09ICdkb3duJ1xuICAgICAgICAgICAgICAgID8gZWxlbWVudHMuaW5kZXhPZihlbGVtZW50c0luU2libGluZ0dyb3VwWzBdKVxuICAgICAgICAgICAgICAgIDogZWxlbWVudHMuaW5kZXhPZihlbGVtZW50c0luU2libGluZ0dyb3VwW2VsZW1lbnRzSW5TaWJsaW5nR3JvdXAubGVuZ3RoIC0gMV0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNhbmRpZGF0ZUluZGV4O1xufTtcbiJdfQ==