@worktile/theia 13.0.0-next.1 → 13.0.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 (626) hide show
  1. package/README.md +11 -11
  2. package/components/color-select/color-select.component.d.ts +32 -32
  3. package/components/color-select/color-select.component.scss +107 -107
  4. package/components/column-resize/column-resize-notifier.d.ts +35 -35
  5. package/components/column-resize/column-resize.directive.d.ts +26 -26
  6. package/components/column-resize/column-resize.module.d.ts +14 -14
  7. package/components/column-resize/event-dispatcher.d.ts +31 -31
  8. package/components/column-resize/overlay-handle.component.d.ts +33 -33
  9. package/components/column-resize/resize-ref.d.ts +25 -25
  10. package/components/column-resize/resizing.store.d.ts +28 -28
  11. package/components/column-resize/selectors.d.ts +3 -3
  12. package/components/contextmenu/contextmenu.component.d.ts +22 -22
  13. package/components/conversion-hint/conversion-hint.component.d.ts +18 -18
  14. package/components/conversion-hint/conversion-hint.component.scss +11 -11
  15. package/components/element/element.component.d.ts +7 -7
  16. package/components/inline-toolbar/inline-toolbar.component.d.ts +26 -26
  17. package/components/nav-split-line/nav-split-line.component.d.ts +13 -13
  18. package/components/table-select/table-select.component.d.ts +20 -20
  19. package/components/table-select/table-select.component.scss +35 -35
  20. package/components/template/template.component.d.ts +15 -15
  21. package/components/text/text.component.d.ts +14 -14
  22. package/components/toolbar/toolbar.component.d.ts +64 -64
  23. package/components/toolbar-dropdown/toolbar-dropdown.component.d.ts +33 -33
  24. package/components/toolbar-group/toolbar-group.component.d.ts +33 -33
  25. package/components/toolbar-group/toolbar-group.component.scss +17 -17
  26. package/components/toolbar-item/toolbar-item.component.d.ts +17 -17
  27. package/constants/auto-format-rules.d.ts +2 -2
  28. package/constants/code.d.ts +9 -9
  29. package/constants/color-select.d.ts +14 -14
  30. package/constants/default.d.ts +9 -9
  31. package/constants/error.d.ts +5 -5
  32. package/constants/index.d.ts +5 -5
  33. package/constants/node-types.d.ts +99 -99
  34. package/constants/selector.d.ts +2 -2
  35. package/constants/toolbar.d.ts +17 -17
  36. package/core/create-plugin.d.ts +2 -2
  37. package/core/create-toolbar.d.ts +5 -5
  38. package/core/index.d.ts +4 -4
  39. package/core/toolbar-item/base-toolbar-item.d.ts +29 -29
  40. package/core/utils/combine-plugins.d.ts +2 -2
  41. package/core/utils/flatten-deep-plugins.d.ts +6 -6
  42. package/core/utils/get-plugin-options.d.ts +2 -2
  43. package/core/utils/get-plugin.d.ts +2 -2
  44. package/core/utils/get-plugins.d.ts +2 -2
  45. package/core/utils/index.d.ts +10 -10
  46. package/core/utils/merge-array.d.ts +1 -1
  47. package/core/utils/merge-deep-plugins.d.ts +2 -2
  48. package/core/utils/merge-options.d.ts +2 -2
  49. package/core/utils/nested-structure-by-key.d.ts +2 -2
  50. package/core/utils/plugins-by-key.d.ts +2 -2
  51. package/core/with-theia.d.ts +4 -4
  52. package/custom-types.d.ts +131 -131
  53. package/editor.component.d.ts +92 -92
  54. package/editor.module.d.ts +100 -98
  55. package/esm2020/components/color-select/color-select.component.mjs +108 -108
  56. package/esm2020/components/column-resize/column-resize-notifier.mjs +31 -31
  57. package/esm2020/components/column-resize/column-resize.directive.mjs +98 -98
  58. package/esm2020/components/column-resize/column-resize.module.mjs +32 -32
  59. package/esm2020/components/column-resize/event-dispatcher.mjs +55 -55
  60. package/esm2020/components/column-resize/overlay-handle.component.mjs +139 -139
  61. package/esm2020/components/column-resize/resize-ref.mjs +25 -25
  62. package/esm2020/components/column-resize/resizing.store.mjs +154 -154
  63. package/esm2020/components/column-resize/selectors.mjs +4 -4
  64. package/esm2020/components/contextmenu/contextmenu.component.mjs +61 -61
  65. package/esm2020/components/conversion-hint/conversion-hint.component.mjs +54 -54
  66. package/esm2020/components/element/element.component.mjs +22 -22
  67. package/esm2020/components/inline-toolbar/inline-toolbar.component.mjs +125 -125
  68. package/esm2020/components/nav-split-line/nav-split-line.component.mjs +36 -36
  69. package/esm2020/components/table-select/table-select.component.mjs +49 -49
  70. package/esm2020/components/template/template.component.mjs +62 -62
  71. package/esm2020/components/text/text.component.mjs +57 -57
  72. package/esm2020/components/toolbar/toolbar.component.mjs +241 -241
  73. package/esm2020/components/toolbar-dropdown/toolbar-dropdown.component.mjs +128 -128
  74. package/esm2020/components/toolbar-group/toolbar-group.component.mjs +110 -110
  75. package/esm2020/components/toolbar-item/toolbar-item.component.mjs +60 -60
  76. package/esm2020/constants/auto-format-rules.mjs +166 -166
  77. package/esm2020/constants/code.mjs +88 -88
  78. package/esm2020/constants/color-select.mjs +61 -61
  79. package/esm2020/constants/default.mjs +9 -9
  80. package/esm2020/constants/error.mjs +7 -7
  81. package/esm2020/constants/index.mjs +5 -5
  82. package/esm2020/constants/node-types.mjs +132 -132
  83. package/esm2020/constants/selector.mjs +3 -3
  84. package/esm2020/constants/toolbar.mjs +69 -69
  85. package/esm2020/core/create-plugin.mjs +4 -4
  86. package/esm2020/core/create-toolbar.mjs +55 -55
  87. package/esm2020/core/index.mjs +4 -4
  88. package/esm2020/core/toolbar-item/base-toolbar-item.mjs +89 -89
  89. package/esm2020/core/utils/combine-plugins.mjs +9 -9
  90. package/esm2020/core/utils/flatten-deep-plugins.mjs +18 -18
  91. package/esm2020/core/utils/get-plugin-options.mjs +2 -2
  92. package/esm2020/core/utils/get-plugin.mjs +1 -1
  93. package/esm2020/core/utils/get-plugins.mjs +3 -3
  94. package/esm2020/core/utils/index.mjs +10 -10
  95. package/esm2020/core/utils/merge-array.mjs +17 -17
  96. package/esm2020/core/utils/merge-deep-plugins.mjs +13 -13
  97. package/esm2020/core/utils/merge-options.mjs +19 -19
  98. package/esm2020/core/utils/nested-structure-by-key.mjs +10 -10
  99. package/esm2020/core/utils/plugins-by-key.mjs +9 -9
  100. package/esm2020/core/with-theia.mjs +22 -22
  101. package/esm2020/custom-types.mjs +1 -1
  102. package/esm2020/editor.component.mjs +430 -430
  103. package/esm2020/editor.module.mjs +207 -201
  104. package/esm2020/interfaces/auto-format.mjs +1 -1
  105. package/esm2020/interfaces/editor.mjs +24 -24
  106. package/esm2020/interfaces/element.mjs +1 -1
  107. package/esm2020/interfaces/image.mjs +2 -2
  108. package/esm2020/interfaces/index.mjs +8 -8
  109. package/esm2020/interfaces/plugins/index.mjs +4 -4
  110. package/esm2020/interfaces/plugins/no-infer.mjs +1 -1
  111. package/esm2020/interfaces/plugins/plugin-key.mjs +39 -39
  112. package/esm2020/interfaces/plugins/plugins.mjs +1 -1
  113. package/esm2020/interfaces/plugins/with-override.mjs +1 -1
  114. package/esm2020/interfaces/reset-block-type-plugin-options.mjs +2 -2
  115. package/esm2020/interfaces/toolbar.mjs +11 -11
  116. package/esm2020/interfaces/upload.mjs +1 -1
  117. package/esm2020/interfaces/utility/index.mjs +3 -3
  118. package/esm2020/interfaces/utility/nested-structure-by-key.mjs +1 -1
  119. package/esm2020/interfaces/utility/override-by-key.mjs +1 -1
  120. package/esm2020/interfaces/utility/types.mjs +1 -1
  121. package/esm2020/interfaces/valid-children-types.mjs +35 -35
  122. package/esm2020/interfaces/view-base.mjs +21 -21
  123. package/esm2020/pipes.mjs +42 -42
  124. package/esm2020/plugins/align/align.editor.mjs +46 -46
  125. package/esm2020/plugins/align/align.plugin.mjs +63 -63
  126. package/esm2020/plugins/autoformat/autoformat.plugin.mjs +108 -108
  127. package/esm2020/plugins/autoformat/transforms/auto-format-block.mjs +14 -14
  128. package/esm2020/plugins/autoformat/transforms/auto-format-inline.mjs +77 -77
  129. package/esm2020/plugins/blockquote/blockquote.component.mjs +21 -21
  130. package/esm2020/plugins/blockquote/blockquote.editor.mjs +19 -19
  131. package/esm2020/plugins/blockquote/blockquote.plugin.mjs +70 -70
  132. package/esm2020/plugins/code/code.component.mjs +240 -240
  133. package/esm2020/plugins/code/code.editor.mjs +47 -47
  134. package/esm2020/plugins/code/code.plugin.mjs +41 -41
  135. package/esm2020/plugins/color/color.editor.mjs +43 -43
  136. package/esm2020/plugins/color/color.plugin.mjs +27 -27
  137. package/esm2020/plugins/color/toolbar-item.component.mjs +78 -78
  138. package/esm2020/plugins/common/auto-insert-data..mjs +76 -76
  139. package/esm2020/plugins/common/block-card.plugin.mjs +286 -286
  140. package/esm2020/plugins/common/get-fragment.plugin.mjs +23 -23
  141. package/esm2020/plugins/common/history.plugin.mjs +30 -30
  142. package/esm2020/plugins/common/move-selection.plugin.mjs +89 -89
  143. package/esm2020/plugins/common/remove-empty.plugin.mjs +59 -59
  144. package/esm2020/plugins/common/remove-void.plugin.mjs +56 -56
  145. package/esm2020/plugins/common/reset-type.plugin.mjs +34 -34
  146. package/esm2020/plugins/common/transforms.plugin.mjs +17 -17
  147. package/esm2020/plugins/deserializers/deserialize-html.plugin.mjs +38 -38
  148. package/esm2020/plugins/deserializers/deserialize-md.plugin.mjs +121 -121
  149. package/esm2020/plugins/font-size/font-size.editor.mjs +97 -97
  150. package/esm2020/plugins/heading/heading.editor.mjs +53 -53
  151. package/esm2020/plugins/heading/heading.plugin.mjs +84 -84
  152. package/esm2020/plugins/hr/hr.component.mjs +40 -40
  153. package/esm2020/plugins/hr/hr.editor.mjs +7 -7
  154. package/esm2020/plugins/hr/hr.plugin.mjs +41 -41
  155. package/esm2020/plugins/image/image.component.mjs +385 -365
  156. package/esm2020/plugins/image/image.editor.mjs +57 -57
  157. package/esm2020/plugins/image/image.plugin.mjs +56 -56
  158. package/esm2020/plugins/indent/indent.editor.mjs +70 -70
  159. package/esm2020/plugins/indent/indent.plugin.mjs +57 -57
  160. package/esm2020/plugins/indent/on-keydown-indent.mjs +53 -53
  161. package/esm2020/plugins/index.mjs +70 -70
  162. package/esm2020/plugins/inline-code/inline-code.component.mjs +21 -21
  163. package/esm2020/plugins/inline-code/inline-code.editor.mjs +47 -47
  164. package/esm2020/plugins/inline-code/inline-code.plugin.mjs +65 -65
  165. package/esm2020/plugins/link/edit/link-edit.component.mjs +105 -105
  166. package/esm2020/plugins/link/hover/link-hover.component.mjs +36 -36
  167. package/esm2020/plugins/link/link.component.mjs +162 -162
  168. package/esm2020/plugins/link/link.editor.mjs +66 -66
  169. package/esm2020/plugins/link/link.plugin.mjs +58 -58
  170. package/esm2020/plugins/link/link.types.mjs +12 -12
  171. package/esm2020/plugins/list/components/bulleted-list.component.mjs +32 -32
  172. package/esm2020/plugins/list/components/list-item.component.mjs +92 -92
  173. package/esm2020/plugins/list/components/numbered-list.component.mjs +38 -38
  174. package/esm2020/plugins/list/list.editor.mjs +125 -125
  175. package/esm2020/plugins/list/list.plugin.mjs +285 -285
  176. package/esm2020/plugins/list/normalizers/get-list-normalizer.mjs +39 -39
  177. package/esm2020/plugins/list/normalizers/normalize-list-item.mjs +18 -18
  178. package/esm2020/plugins/list/normalizers/normalize-no.mjs +42 -42
  179. package/esm2020/plugins/list/on-key-down-list.mjs +32 -32
  180. package/esm2020/plugins/list/queries/get-list-item-entry.mjs +27 -27
  181. package/esm2020/plugins/list/queries/get-list-item-sublist.mjs +12 -12
  182. package/esm2020/plugins/list/queries/get-list-types.mjs +5 -5
  183. package/esm2020/plugins/list/queries/get-start-list-item.mjs +26 -26
  184. package/esm2020/plugins/list/queries/has-list-in-list-item.mjs +27 -27
  185. package/esm2020/plugins/list/queries/is-in-list.mjs +5 -5
  186. package/esm2020/plugins/list/queries/is-list-nested.mjs +10 -10
  187. package/esm2020/plugins/list/queries/is-list.mjs +5 -5
  188. package/esm2020/plugins/list/queries/is-node-type-list.mjs +4 -4
  189. package/esm2020/plugins/list/queries/is-selection-at-list-item-start.mjs +12 -12
  190. package/esm2020/plugins/list/queries/is-selection-in-same-list-item.mjs +16 -16
  191. package/esm2020/plugins/list/queries/is-single-list-item.mjs +9 -9
  192. package/esm2020/plugins/list/transforms/insert-list-data.mjs +71 -71
  193. package/esm2020/plugins/list/transforms/insert-list-item.mjs +72 -72
  194. package/esm2020/plugins/list/transforms/move-list-item-down.mjs +41 -41
  195. package/esm2020/plugins/list/transforms/move-list-item-sublist-items-to-list-item-sublist.mjs +42 -42
  196. package/esm2020/plugins/list/transforms/move-list-item-sublist-items-to-list.mjs +29 -29
  197. package/esm2020/plugins/list/transforms/move-list-item-up.mjs +77 -77
  198. package/esm2020/plugins/list/transforms/unwrap-list.mjs +9 -9
  199. package/esm2020/plugins/list/types.mjs +2 -2
  200. package/esm2020/plugins/mark/mark.editor.mjs +27 -27
  201. package/esm2020/plugins/mark/mark.plugin.mjs +104 -104
  202. package/esm2020/plugins/node-id/node-id.plugin.mjs +77 -77
  203. package/esm2020/plugins/normalizers/insert-paragraph-nodes.mjs +27 -27
  204. package/esm2020/plugins/normalizers/remove-empty-nodes.mjs +17 -17
  205. package/esm2020/plugins/normalizers/trailing-node.plugin.mjs +32 -32
  206. package/esm2020/plugins/paint-format/paint-format.editor.mjs +122 -122
  207. package/esm2020/plugins/public-api.mjs +15 -15
  208. package/esm2020/plugins/quick-insert/components/quick-insert.component.mjs +95 -95
  209. package/esm2020/plugins/quick-insert/components/quick-toolbar/quick-toolbar.component.mjs +79 -79
  210. package/esm2020/plugins/quick-insert/quick-insert.editor.mjs +52 -52
  211. package/esm2020/plugins/quick-insert/quick-insert.plugin.mjs +73 -73
  212. package/esm2020/plugins/soft-break/soft-break.plugin.mjs +35 -35
  213. package/esm2020/plugins/soft-break/soft-break.types.mjs +1 -1
  214. package/esm2020/plugins/table/components/insert-mark/insert-mark.component.mjs +99 -99
  215. package/esm2020/plugins/table/components/row/row.component.mjs +46 -46
  216. package/esm2020/plugins/table/components/table.component.mjs +460 -460
  217. package/esm2020/plugins/table/components/td/td.component.mjs +696 -696
  218. package/esm2020/plugins/table/components/toolbar/table-options.component.mjs +70 -70
  219. package/esm2020/plugins/table/components/toolbar/table-toolbar.component.mjs +158 -158
  220. package/esm2020/plugins/table/table.editor.mjs +182 -182
  221. package/esm2020/plugins/table/table.plugin.mjs +426 -426
  222. package/esm2020/plugins/table/table.service.mjs +102 -102
  223. package/esm2020/plugins/table/table.store.mjs +483 -483
  224. package/esm2020/plugins/table/table.types.mjs +33 -33
  225. package/esm2020/plugins/table/toolbar-item.component.mjs +60 -60
  226. package/esm2020/plugins/table/transforms/clear-cell.mjs +14 -14
  227. package/esm2020/plugins/table/transforms/clear-table-node.mjs +27 -27
  228. package/esm2020/plugins/table/transforms/insert-column.mjs +57 -57
  229. package/esm2020/plugins/table/transforms/insert-row.mjs +42 -42
  230. package/esm2020/plugins/table/transforms/insert-table.mjs +14 -14
  231. package/esm2020/plugins/table/transforms/remove-column.mjs +51 -51
  232. package/esm2020/plugins/table/transforms/remove-row.mjs +50 -50
  233. package/esm2020/plugins/table/transforms/remove-table.mjs +49 -49
  234. package/esm2020/plugins/table/utils/add-columns.mjs +28 -28
  235. package/esm2020/plugins/table/utils/calc-anchor-position.mjs +24 -24
  236. package/esm2020/plugins/table/utils/calc-span.mjs +72 -72
  237. package/esm2020/plugins/table/utils/create-cell.mjs +19 -19
  238. package/esm2020/plugins/table/utils/create-row.mjs +12 -12
  239. package/esm2020/plugins/table/utils/create-table.mjs +13 -13
  240. package/esm2020/plugins/table/utils/get-base-height.mjs +22 -22
  241. package/esm2020/plugins/table/utils/get-select-cell-node.mjs +19 -19
  242. package/esm2020/plugins/table/utils/index.mjs +8 -8
  243. package/esm2020/plugins/table/utils/is-range-in-table.mjs +16 -16
  244. package/esm2020/plugins/table/utils/is-selection-in-table.mjs +11 -11
  245. package/esm2020/plugins/table/utils/is-virtual-key.mjs +12 -12
  246. package/esm2020/plugins/table/utils/merge-cell.mjs +90 -90
  247. package/esm2020/plugins/table/utils/next-path.mjs +5 -5
  248. package/esm2020/plugins/table/utils/normalize-table.mjs +30 -30
  249. package/esm2020/plugins/table/utils/remove-columns.mjs +23 -23
  250. package/esm2020/plugins/table/utils/set-menu-cell-invisibility.mjs +15 -15
  251. package/esm2020/plugins/table/utils/split-cell.mjs +31 -31
  252. package/esm2020/plugins/table/utils/table-position.mjs +242 -242
  253. package/esm2020/plugins/todo-item/todo-item.component.mjs +53 -53
  254. package/esm2020/plugins/todo-item/todo-item.editor.mjs +31 -31
  255. package/esm2020/plugins/todo-item/todo-item.plugin.mjs +78 -78
  256. package/esm2020/plugins/vertical-align/toolbar-item.component.mjs +82 -82
  257. package/esm2020/plugins/vertical-align/vertical-align.editor.mjs +54 -54
  258. package/esm2020/public-api.mjs +23 -23
  259. package/esm2020/queries/anchor-block-entry.mjs +13 -13
  260. package/esm2020/queries/anchor-block.mjs +6 -6
  261. package/esm2020/queries/anchor-inline-entry.mjs +10 -10
  262. package/esm2020/queries/find-descendant.mjs +47 -47
  263. package/esm2020/queries/find-node.mjs +45 -45
  264. package/esm2020/queries/find-path.mjs +28 -28
  265. package/esm2020/queries/get-above-by-type.mjs +13 -13
  266. package/esm2020/queries/get-above.mjs +9 -9
  267. package/esm2020/queries/get-anchor-block-entry.mjs +8 -8
  268. package/esm2020/queries/get-block-above.mjs +10 -10
  269. package/esm2020/queries/get-block-card-above.mjs +10 -10
  270. package/esm2020/queries/get-block-card-cursor.mjs +5 -5
  271. package/esm2020/queries/get-container-blocks.mjs +11 -11
  272. package/esm2020/queries/get-directly-parent.mjs +11 -11
  273. package/esm2020/queries/get-insert-elements-path.mjs +43 -43
  274. package/esm2020/queries/get-last-child-path.mjs +9 -9
  275. package/esm2020/queries/get-last-node.mjs +17 -17
  276. package/esm2020/queries/get-next-sibling-nodes.mjs +17 -17
  277. package/esm2020/queries/get-node.mjs +10 -10
  278. package/esm2020/queries/get-nodes-by-type.mjs +15 -15
  279. package/esm2020/queries/get-nodes.mjs +7 -7
  280. package/esm2020/queries/get-parent.mjs +12 -12
  281. package/esm2020/queries/get-plain-text.mjs +16 -16
  282. package/esm2020/queries/get-plugin-by-toolbar.mjs +12 -12
  283. package/esm2020/queries/get-point-before.mjs +61 -61
  284. package/esm2020/queries/get-point-from-location.mjs +15 -15
  285. package/esm2020/queries/get-previous-path.mjs +9 -9
  286. package/esm2020/queries/get-rang-from-block-start.mjs +16 -16
  287. package/esm2020/queries/get-range-before.mjs +17 -17
  288. package/esm2020/queries/get-selection-marks.mjs +18 -18
  289. package/esm2020/queries/get-selection-nodes-by-type.mjs +29 -29
  290. package/esm2020/queries/get-text.mjs +9 -9
  291. package/esm2020/queries/get-toolbar-disabled.mjs +12 -12
  292. package/esm2020/queries/index.mjs +58 -58
  293. package/esm2020/queries/is-across-blocks.mjs +7 -7
  294. package/esm2020/queries/is-ancestor-empty.mjs +6 -6
  295. package/esm2020/queries/is-ancestor.mjs +3 -3
  296. package/esm2020/queries/is-block-above-empty.mjs +11 -11
  297. package/esm2020/queries/is-block-active.mjs +7 -7
  298. package/esm2020/queries/is-block-card-cursor.mjs +4 -4
  299. package/esm2020/queries/is-block-text-empty-after-selection.mjs +31 -31
  300. package/esm2020/queries/is-collapsed.mjs +7 -7
  301. package/esm2020/queries/is-contain-nested-type.mjs +28 -28
  302. package/esm2020/queries/is-container-type.mjs +2 -2
  303. package/esm2020/queries/is-descendant.mjs +3 -3
  304. package/esm2020/queries/is-empty-content.mjs +14 -14
  305. package/esm2020/queries/is-empty-paragraph-by-path.mjs +7 -7
  306. package/esm2020/queries/is-empty-paragraph.mjs +11 -11
  307. package/esm2020/queries/is-first-child.mjs +5 -5
  308. package/esm2020/queries/is-include-types.mjs +11 -11
  309. package/esm2020/queries/is-node-type-in.mjs +9 -9
  310. package/esm2020/queries/is-node-type.mjs +15 -15
  311. package/esm2020/queries/is-paragraph.mjs +9 -9
  312. package/esm2020/queries/is-point-at-root.mjs +2 -2
  313. package/esm2020/queries/is-range-across-blocks.mjs +22 -22
  314. package/esm2020/queries/is-range-at-root.mjs +3 -3
  315. package/esm2020/queries/is-start.mjs +6 -6
  316. package/esm2020/queries/some-node.mjs +9 -9
  317. package/esm2020/services/color-select.service.mjs +49 -49
  318. package/esm2020/services/context.service.mjs +58 -58
  319. package/esm2020/services/table-contextmenu.service.mjs +189 -189
  320. package/esm2020/services/toolbar.service.mjs +47 -47
  321. package/esm2020/shortcuts/index.mjs +5 -5
  322. package/esm2020/shortcuts/mark.mjs +24 -24
  323. package/esm2020/transforms/apply-deep-to-nodes.mjs +21 -21
  324. package/esm2020/transforms/clear-marks.mjs +23 -23
  325. package/esm2020/transforms/close-conversion-hint.mjs +8 -8
  326. package/esm2020/transforms/delete-element.mjs +11 -11
  327. package/esm2020/transforms/handle-continual-delete-backward.mjs +17 -17
  328. package/esm2020/transforms/handle-continual-insert-break.mjs +19 -19
  329. package/esm2020/transforms/index.mjs +18 -18
  330. package/esm2020/transforms/insert-elements.mjs +33 -33
  331. package/esm2020/transforms/insert-paragraph.mjs +6 -6
  332. package/esm2020/transforms/merge-deep-to-nodes.mjs +8 -8
  333. package/esm2020/transforms/move-children.mjs +21 -21
  334. package/esm2020/transforms/on-keydown-reset-block-type.mjs +22 -22
  335. package/esm2020/transforms/set-end-selection.mjs +10 -10
  336. package/esm2020/transforms/set-marks.mjs +9 -9
  337. package/esm2020/transforms/set-node.mjs +5 -5
  338. package/esm2020/transforms/split-node.mjs +31 -31
  339. package/esm2020/transforms/un-hang-range.mjs +11 -11
  340. package/esm2020/transforms/un-wrap.mjs +11 -11
  341. package/esm2020/transforms/unwrap-nodes-by-type.mjs +14 -14
  342. package/esm2020/utils/auto-focus.mjs +13 -13
  343. package/esm2020/utils/auto-scroll-view.mjs +24 -24
  344. package/esm2020/utils/cast-array.mjs +7 -7
  345. package/esm2020/utils/common.mjs +2 -2
  346. package/esm2020/utils/create-empty-paragraph.mjs +14 -14
  347. package/esm2020/utils/data-transform.mjs +48 -48
  348. package/esm2020/utils/dom.mjs +46 -46
  349. package/esm2020/utils/editor-uuid.mjs +8 -8
  350. package/esm2020/utils/fragment.mjs +65 -65
  351. package/esm2020/utils/get-all-nodes-by-type.mjs +5 -0
  352. package/esm2020/utils/get-editable-element-height.mjs +6 -6
  353. package/esm2020/utils/get-toolbar-class.mjs +6 -6
  354. package/esm2020/utils/id-creator.mjs +11 -11
  355. package/esm2020/utils/index.mjs +13 -13
  356. package/esm2020/utils/is-clean-empty-paragraph.mjs +36 -36
  357. package/esm2020/utils/is-inline.mjs +8 -8
  358. package/esm2020/utils/lodash.mjs +2 -2
  359. package/esm2020/utils/match.mjs +32 -32
  360. package/esm2020/utils/merge-element-options.mjs +19 -19
  361. package/esm2020/utils/weak-maps.mjs +3 -3
  362. package/esm2020/worktile-theia.mjs +4 -4
  363. package/fesm2015/worktile-theia.mjs +13131 -13097
  364. package/fesm2015/worktile-theia.mjs.map +1 -1
  365. package/fesm2020/worktile-theia.mjs +13150 -13120
  366. package/fesm2020/worktile-theia.mjs.map +1 -1
  367. package/interfaces/auto-format.d.ts +64 -64
  368. package/interfaces/editor.d.ts +146 -146
  369. package/interfaces/element.d.ts +9 -9
  370. package/interfaces/image.d.ts +25 -25
  371. package/interfaces/index.d.ts +8 -8
  372. package/interfaces/plugins/index.d.ts +4 -4
  373. package/interfaces/plugins/no-infer.d.ts +1 -1
  374. package/interfaces/plugins/plugin-key.d.ts +48 -48
  375. package/interfaces/plugins/plugins.d.ts +45 -45
  376. package/interfaces/plugins/with-override.d.ts +7 -7
  377. package/interfaces/reset-block-type-plugin-options.d.ts +23 -23
  378. package/interfaces/toolbar.d.ts +64 -64
  379. package/interfaces/upload.d.ts +11 -11
  380. package/interfaces/utility/index.d.ts +3 -3
  381. package/interfaces/utility/nested-structure-by-key.d.ts +3 -3
  382. package/interfaces/utility/override-by-key.d.ts +3 -3
  383. package/interfaces/utility/types.d.ts +1 -1
  384. package/interfaces/valid-children-types.d.ts +9 -9
  385. package/interfaces/view-base.d.ts +9 -9
  386. package/package.json +5 -4
  387. package/pipes.d.ts +16 -16
  388. package/plugins/align/align.editor.d.ts +7 -7
  389. package/plugins/align/align.plugin.d.ts +2 -2
  390. package/plugins/autoformat/autoformat.plugin.d.ts +6 -6
  391. package/plugins/autoformat/transforms/auto-format-block.d.ts +5 -5
  392. package/plugins/autoformat/transforms/auto-format-inline.d.ts +9 -9
  393. package/plugins/blockquote/blockquote.component.d.ts +11 -11
  394. package/plugins/blockquote/blockquote.editor.d.ts +4 -4
  395. package/plugins/blockquote/blockquote.plugin.d.ts +2 -2
  396. package/plugins/code/code.component.d.ts +65 -65
  397. package/plugins/code/code.editor.d.ts +8 -8
  398. package/plugins/code/code.plugin.d.ts +2 -2
  399. package/plugins/color/color.editor.d.ts +8 -8
  400. package/plugins/color/color.plugin.d.ts +1 -1
  401. package/plugins/color/toolbar-item.component.d.ts +16 -16
  402. package/plugins/common/auto-insert-data..d.ts +2 -2
  403. package/plugins/common/block-card.plugin.d.ts +2 -2
  404. package/plugins/common/get-fragment.plugin.d.ts +6 -6
  405. package/plugins/common/history.plugin.d.ts +9 -9
  406. package/plugins/common/move-selection.plugin.d.ts +2 -2
  407. package/plugins/common/remove-empty.plugin.d.ts +2 -2
  408. package/plugins/common/remove-void.plugin.d.ts +2 -2
  409. package/plugins/common/reset-type.plugin.d.ts +2 -2
  410. package/plugins/common/transforms.plugin.d.ts +8 -8
  411. package/plugins/deserializers/deserialize-html.plugin.d.ts +2 -2
  412. package/plugins/deserializers/deserialize-md.plugin.d.ts +2 -2
  413. package/plugins/font-size/font-size.editor.d.ts +10 -10
  414. package/plugins/heading/heading.editor.d.ts +9 -9
  415. package/plugins/heading/heading.plugin.d.ts +7 -7
  416. package/plugins/hr/hr.component.d.ts +12 -12
  417. package/plugins/hr/hr.editor.d.ts +4 -4
  418. package/plugins/hr/hr.plugin.d.ts +2 -2
  419. package/plugins/image/image.component.d.ts +77 -74
  420. package/plugins/image/image.editor.d.ts +12 -12
  421. package/plugins/image/image.plugin.d.ts +7 -7
  422. package/plugins/indent/indent.editor.d.ts +10 -10
  423. package/plugins/indent/indent.plugin.d.ts +8 -8
  424. package/plugins/indent/on-keydown-indent.d.ts +3 -3
  425. package/plugins/index.d.ts +1 -1
  426. package/plugins/inline-code/inline-code.component.d.ts +9 -9
  427. package/plugins/inline-code/inline-code.editor.d.ts +7 -7
  428. package/plugins/inline-code/inline-code.plugin.d.ts +2 -2
  429. package/plugins/link/edit/link-edit.component.d.ts +36 -36
  430. package/plugins/link/hover/link-hover.component.d.ts +15 -15
  431. package/plugins/link/link.component.d.ts +39 -39
  432. package/plugins/link/link.editor.d.ts +7 -7
  433. package/plugins/link/link.plugin.d.ts +2 -2
  434. package/plugins/link/link.types.d.ts +9 -9
  435. package/plugins/list/components/bulleted-list.component.d.ts +15 -15
  436. package/plugins/list/components/list-item.component.d.ts +20 -20
  437. package/plugins/list/components/numbered-list.component.d.ts +16 -16
  438. package/plugins/list/list.editor.d.ts +12 -12
  439. package/plugins/list/list.plugin.d.ts +3 -3
  440. package/plugins/list/normalizers/get-list-normalizer.d.ts +6 -6
  441. package/plugins/list/normalizers/normalize-list-item.d.ts +5 -5
  442. package/plugins/list/normalizers/normalize-no.d.ts +2 -2
  443. package/plugins/list/on-key-down-list.d.ts +2 -2
  444. package/plugins/list/queries/get-list-item-entry.d.ts +10 -10
  445. package/plugins/list/queries/get-list-item-sublist.d.ts +6 -6
  446. package/plugins/list/queries/get-list-types.d.ts +2 -2
  447. package/plugins/list/queries/get-start-list-item.d.ts +8 -8
  448. package/plugins/list/queries/has-list-in-list-item.d.ts +15 -15
  449. package/plugins/list/queries/is-in-list.d.ts +2 -2
  450. package/plugins/list/queries/is-list-nested.d.ts +5 -5
  451. package/plugins/list/queries/is-list.d.ts +2 -2
  452. package/plugins/list/queries/is-node-type-list.d.ts +2 -2
  453. package/plugins/list/queries/is-selection-at-list-item-start.d.ts +5 -5
  454. package/plugins/list/queries/is-selection-in-same-list-item.d.ts +5 -5
  455. package/plugins/list/queries/is-single-list-item.d.ts +5 -5
  456. package/plugins/list/transforms/insert-list-data.d.ts +12 -12
  457. package/plugins/list/transforms/insert-list-item.d.ts +5 -5
  458. package/plugins/list/transforms/move-list-item-down.d.ts +6 -6
  459. package/plugins/list/transforms/move-list-item-sublist-items-to-list-item-sublist.d.ts +20 -20
  460. package/plugins/list/transforms/move-list-item-sublist-items-to-list.d.ts +19 -19
  461. package/plugins/list/transforms/move-list-item-up.d.ts +10 -10
  462. package/plugins/list/transforms/unwrap-list.d.ts +2 -2
  463. package/plugins/list/types.d.ts +7 -7
  464. package/plugins/mark/mark.editor.d.ts +8 -8
  465. package/plugins/mark/mark.plugin.d.ts +3 -3
  466. package/plugins/node-id/node-id.plugin.d.ts +8 -8
  467. package/plugins/normalizers/insert-paragraph-nodes.d.ts +7 -7
  468. package/plugins/normalizers/remove-empty-nodes.d.ts +7 -7
  469. package/plugins/normalizers/trailing-node.plugin.d.ts +9 -9
  470. package/plugins/paint-format/paint-format.editor.d.ts +8 -8
  471. package/plugins/public-api.d.ts +15 -15
  472. package/plugins/quick-insert/components/quick-insert.component.d.ts +28 -28
  473. package/plugins/quick-insert/components/quick-toolbar/quick-toolbar.component.d.ts +28 -28
  474. package/plugins/quick-insert/quick-insert.editor.d.ts +7 -7
  475. package/plugins/quick-insert/quick-insert.plugin.d.ts +10 -10
  476. package/plugins/soft-break/soft-break.plugin.d.ts +5 -5
  477. package/plugins/soft-break/soft-break.types.d.ts +8 -8
  478. package/plugins/table/components/insert-mark/insert-mark.component.d.ts +24 -24
  479. package/plugins/table/components/row/row.component.d.ts +14 -14
  480. package/plugins/table/components/table.component.d.ts +79 -79
  481. package/plugins/table/components/td/td.component.d.ts +95 -95
  482. package/plugins/table/components/toolbar/table-options.component.d.ts +20 -20
  483. package/plugins/table/components/toolbar/table-toolbar.component.d.ts +38 -38
  484. package/plugins/table/table.editor.d.ts +25 -25
  485. package/plugins/table/table.plugin.d.ts +3 -3
  486. package/plugins/table/table.service.d.ts +30 -30
  487. package/plugins/table/table.store.d.ts +71 -71
  488. package/plugins/table/table.types.d.ts +67 -67
  489. package/plugins/table/toolbar-item.component.d.ts +17 -17
  490. package/plugins/table/transforms/clear-cell.d.ts +6 -6
  491. package/plugins/table/transforms/clear-table-node.d.ts +6 -6
  492. package/plugins/table/transforms/insert-column.d.ts +12 -12
  493. package/plugins/table/transforms/insert-row.d.ts +6 -6
  494. package/plugins/table/transforms/insert-table.d.ts +6 -6
  495. package/plugins/table/transforms/remove-column.d.ts +3 -3
  496. package/plugins/table/transforms/remove-row.d.ts +3 -3
  497. package/plugins/table/transforms/remove-table.d.ts +3 -3
  498. package/plugins/table/utils/add-columns.d.ts +2 -2
  499. package/plugins/table/utils/calc-anchor-position.d.ts +6 -6
  500. package/plugins/table/utils/calc-span.d.ts +11 -11
  501. package/plugins/table/utils/create-cell.d.ts +16 -16
  502. package/plugins/table/utils/create-row.d.ts +7 -7
  503. package/plugins/table/utils/create-table.d.ts +7 -7
  504. package/plugins/table/utils/get-base-height.d.ts +9 -9
  505. package/plugins/table/utils/get-select-cell-node.d.ts +7 -7
  506. package/plugins/table/utils/index.d.ts +7 -7
  507. package/plugins/table/utils/is-range-in-table.d.ts +6 -6
  508. package/plugins/table/utils/is-selection-in-table.d.ts +6 -6
  509. package/plugins/table/utils/is-virtual-key.d.ts +1 -1
  510. package/plugins/table/utils/merge-cell.d.ts +21 -21
  511. package/plugins/table/utils/next-path.d.ts +2 -2
  512. package/plugins/table/utils/normalize-table.d.ts +2 -2
  513. package/plugins/table/utils/remove-columns.d.ts +2 -2
  514. package/plugins/table/utils/set-menu-cell-invisibility.d.ts +3 -3
  515. package/plugins/table/utils/split-cell.d.ts +4 -4
  516. package/plugins/table/utils/table-position.d.ts +97 -97
  517. package/plugins/todo-item/todo-item.component.d.ts +21 -21
  518. package/plugins/todo-item/todo-item.editor.d.ts +5 -5
  519. package/plugins/todo-item/todo-item.plugin.d.ts +5 -5
  520. package/plugins/vertical-align/toolbar-item.component.d.ts +25 -25
  521. package/plugins/vertical-align/vertical-align.editor.d.ts +7 -7
  522. package/public-api.d.ts +20 -20
  523. package/queries/anchor-block-entry.d.ts +2 -2
  524. package/queries/anchor-block.d.ts +2 -2
  525. package/queries/anchor-inline-entry.d.ts +2 -2
  526. package/queries/find-descendant.d.ts +10 -10
  527. package/queries/find-node.d.ts +15 -15
  528. package/queries/find-path.d.ts +6 -6
  529. package/queries/get-above-by-type.d.ts +6 -6
  530. package/queries/get-above.d.ts +6 -6
  531. package/queries/get-anchor-block-entry.d.ts +2 -2
  532. package/queries/get-block-above.d.ts +7 -7
  533. package/queries/get-block-card-above.d.ts +7 -7
  534. package/queries/get-block-card-cursor.d.ts +2 -2
  535. package/queries/get-container-blocks.d.ts +2 -2
  536. package/queries/get-directly-parent.d.ts +2 -2
  537. package/queries/get-insert-elements-path.d.ts +7 -7
  538. package/queries/get-last-child-path.d.ts +6 -6
  539. package/queries/get-last-node.d.ts +2 -2
  540. package/queries/get-next-sibling-nodes.d.ts +7 -7
  541. package/queries/get-node.d.ts +2 -2
  542. package/queries/get-nodes-by-type.d.ts +6 -6
  543. package/queries/get-nodes.d.ts +4 -4
  544. package/queries/get-parent.d.ts +7 -7
  545. package/queries/get-plain-text.d.ts +6 -6
  546. package/queries/get-plugin-by-toolbar.d.ts +3 -3
  547. package/queries/get-point-before.d.ts +38 -38
  548. package/queries/get-point-from-location.d.ts +5 -5
  549. package/queries/get-previous-path.d.ts +2 -2
  550. package/queries/get-rang-from-block-start.d.ts +9 -9
  551. package/queries/get-range-before.d.ts +7 -7
  552. package/queries/get-selection-marks.d.ts +12 -12
  553. package/queries/get-selection-nodes-by-type.d.ts +3 -3
  554. package/queries/get-text.d.ts +6 -6
  555. package/queries/get-toolbar-disabled.d.ts +4 -4
  556. package/queries/index.d.ts +58 -58
  557. package/queries/is-across-blocks.d.ts +2 -2
  558. package/queries/is-ancestor-empty.d.ts +5 -5
  559. package/queries/is-ancestor.d.ts +2 -2
  560. package/queries/is-block-above-empty.d.ts +5 -5
  561. package/queries/is-block-active.d.ts +3 -3
  562. package/queries/is-block-card-cursor.d.ts +2 -2
  563. package/queries/is-block-text-empty-after-selection.d.ts +7 -7
  564. package/queries/is-collapsed.d.ts +6 -6
  565. package/queries/is-contain-nested-type.d.ts +2 -2
  566. package/queries/is-container-type.d.ts +2 -2
  567. package/queries/is-descendant.d.ts +2 -2
  568. package/queries/is-empty-content.d.ts +2 -2
  569. package/queries/is-empty-paragraph-by-path.d.ts +2 -2
  570. package/queries/is-empty-paragraph.d.ts +2 -2
  571. package/queries/is-first-child.d.ts +5 -5
  572. package/queries/is-include-types.d.ts +3 -3
  573. package/queries/is-node-type-in.d.ts +6 -6
  574. package/queries/is-node-type.d.ts +6 -6
  575. package/queries/is-paragraph.d.ts +2 -2
  576. package/queries/is-point-at-root.d.ts +2 -2
  577. package/queries/is-range-across-blocks.d.ts +8 -8
  578. package/queries/is-range-at-root.d.ts +2 -2
  579. package/queries/is-start.d.ts +5 -5
  580. package/queries/some-node.d.ts +7 -7
  581. package/services/color-select.service.d.ts +20 -20
  582. package/services/context.service.d.ts +49 -49
  583. package/services/table-contextmenu.service.d.ts +25 -25
  584. package/services/toolbar.service.d.ts +9 -9
  585. package/shortcuts/index.d.ts +2 -2
  586. package/shortcuts/mark.d.ts +2 -2
  587. package/transforms/apply-deep-to-nodes.d.ts +12 -12
  588. package/transforms/clear-marks.d.ts +2 -2
  589. package/transforms/close-conversion-hint.d.ts +2 -2
  590. package/transforms/delete-element.d.ts +2 -2
  591. package/transforms/handle-continual-delete-backward.d.ts +3 -3
  592. package/transforms/handle-continual-insert-break.d.ts +3 -3
  593. package/transforms/index.d.ts +18 -18
  594. package/transforms/insert-elements.d.ts +2 -2
  595. package/transforms/insert-paragraph.d.ts +2 -2
  596. package/transforms/merge-deep-to-nodes.d.ts +5 -5
  597. package/transforms/move-children.d.ts +24 -24
  598. package/transforms/on-keydown-reset-block-type.d.ts +3 -3
  599. package/transforms/set-end-selection.d.ts +2 -2
  600. package/transforms/set-marks.d.ts +12 -12
  601. package/transforms/set-node.d.ts +2 -2
  602. package/transforms/split-node.d.ts +3 -3
  603. package/transforms/un-hang-range.d.ts +10 -10
  604. package/transforms/un-wrap.d.ts +3 -3
  605. package/transforms/unwrap-nodes-by-type.d.ts +6 -6
  606. package/utils/auto-focus.d.ts +2 -2
  607. package/utils/auto-scroll-view.d.ts +6 -6
  608. package/utils/cast-array.d.ts +1 -1
  609. package/utils/common.d.ts +2 -2
  610. package/utils/create-empty-paragraph.d.ts +2 -2
  611. package/utils/data-transform.d.ts +6 -6
  612. package/utils/dom.d.ts +10 -10
  613. package/utils/editor-uuid.d.ts +3 -3
  614. package/utils/fragment.d.ts +10 -10
  615. package/utils/get-all-nodes-by-type.d.ts +3 -0
  616. package/utils/get-editable-element-height.d.ts +2 -2
  617. package/utils/get-toolbar-class.d.ts +2 -2
  618. package/utils/id-creator.d.ts +1 -1
  619. package/utils/index.d.ts +13 -13
  620. package/utils/is-clean-empty-paragraph.d.ts +9 -9
  621. package/utils/is-inline.d.ts +2 -2
  622. package/utils/lodash.d.ts +2 -2
  623. package/utils/match.d.ts +18 -18
  624. package/utils/merge-element-options.d.ts +2 -2
  625. package/utils/weak-maps.d.ts +5 -5
  626. package/worktile-theia.d.ts +5 -5
@@ -1,286 +1,286 @@
1
- import { Transforms, Node, Editor, Path } from 'slate';
2
- import { AngularEditor, getPlainText } from 'slate-angular';
3
- import { CLIPBOARD_FORMAT_KEY, ElementKinds } from '../../constants';
4
- import * as TheQueries from '../../queries';
5
- import * as TheTransforms from '../../transforms';
6
- import { isList } from './queries/is-list';
7
- import { isInList } from './queries/is-in-list';
8
- import { isListNested } from './queries/is-list-nested';
9
- import { getListTypes } from './queries/get-list-types';
10
- import { getStartListItem } from './queries/get-start-list-item';
11
- import { isSingleListItem } from './queries/is-single-list-item';
12
- import { getListItemEntry } from './queries/get-list-item-entry';
13
- import { hasListInListItem, hasStableListInListItem, hasStableListItem } from './queries/has-list-in-list-item';
14
- import { isSelectionAtListItemStart } from './queries/is-selection-at-list-item-start';
15
- import { insertListData } from './transforms/insert-list-data';
16
- import { moveListItemUp } from './transforms/move-list-item-up';
17
- import { insertListItem } from './transforms/insert-list-item';
18
- import { unwrapList } from './transforms/unwrap-list';
19
- import { moveListItemSublistItemsToListItemSublist } from './transforms/move-list-item-sublist-items-to-list-item-sublist';
20
- import { getListNormalizer } from './normalizers/get-list-normalizer';
21
- import { onKeyDownList } from './on-key-down-list';
22
- import { TheNumberedListComponent } from './components/numbered-list.component';
23
- import { TheBulletedListComponent } from './components/bulleted-list.component';
24
- import { TheListItemComponent } from './components/list-item.component';
25
- import { extractFragment } from '../../utils/fragment';
26
- import { isSelectionInSameListItem } from './queries/is-selection-in-same-list-item';
27
- import { createPluginFactory, getPluginOptions } from '../../core';
28
- import { PluginKeys } from '../../interfaces';
29
- import { ListEditor } from './list.editor';
30
- export const withList = (editor) => {
31
- const { insertBreak, deleteBackward, onKeydown, insertData, setFragmentData, renderElement } = editor;
32
- const validLiChildrenTypes = getPluginOptions(editor, PluginKeys.list)?.validLiChildrenTypes ?? [];
33
- const resetBlockTypesListRule = {
34
- types: [ElementKinds.listItem],
35
- defaultType: ElementKinds.paragraph,
36
- onReset: (_editor) => unwrapList(_editor)
37
- };
38
- editor.insertBreak = () => {
39
- const node = TheQueries.anchorBlock(editor);
40
- if (!node) {
41
- insertBreak();
42
- return;
43
- }
44
- const isVoid = Editor.isVoid(editor, node);
45
- if (isVoid) {
46
- insertBreak();
47
- return;
48
- }
49
- const listEntry = getListItemEntry(editor, {});
50
- if (listEntry) {
51
- let moved;
52
- const { list, listItem } = listEntry;
53
- const [listItemNode, listItemPath] = listItem;
54
- const cursor = editor.selection.focus;
55
- const isStart = Editor.isStart(editor, cursor, listItemPath);
56
- // deprecated
57
- // 如果有子级
58
- if (hasListInListItem(listItemNode)) {
59
- /**
60
- * If selection is at the end of li,
61
- * insert below li where children will be moved.
62
- */
63
- if (Editor.isEnd(editor, cursor, listItemPath)) {
64
- return Transforms.insertNodes(editor, {
65
- type: ElementKinds.listItem,
66
- children: [{ type: ElementKinds.paragraph, children: [{ text: '' }] }]
67
- }, { at: Path.next(listItemPath), select: true });
68
- }
69
- /**
70
- * 如果选区是在listItem的开头,则在listItem上方插入
71
- */
72
- if (isStart) {
73
- return Transforms.insertNodes(editor, {
74
- type: ElementKinds.listItem,
75
- children: [{ type: ElementKinds.paragraph, children: [{ text: '' }] }]
76
- }, { at: listItemPath });
77
- }
78
- }
79
- // 如果选择的listItem为空则将其向上移动
80
- if (isStart && TheQueries.isBlockAboveEmpty(editor)) {
81
- moved = moveListItemUp(editor, { list, listItem });
82
- if (moved)
83
- return;
84
- }
85
- const didReset = TheTransforms.onKeyDownResetBlockType({
86
- rules: [
87
- {
88
- ...resetBlockTypesListRule,
89
- predicate: () => !moved && isStart && TheQueries.isBlockAboveEmpty(editor)
90
- }
91
- ]
92
- })(null, editor);
93
- if (didReset) {
94
- return;
95
- }
96
- /**
97
- * Add a new list item if selection is in a LIST_ITEM > p.type.
98
- */
99
- if (!moved) {
100
- const inserted = insertListItem(editor);
101
- if (inserted) {
102
- return;
103
- }
104
- }
105
- }
106
- insertBreak();
107
- };
108
- editor.setFragmentData = unit => {
109
- const { selection } = editor;
110
- const [start] = Editor.edges(editor, selection);
111
- if (isInList(editor, start)) {
112
- const fragmentData = editor.getFragment();
113
- const fragmentElement = fragmentData[0];
114
- if (getListTypes().includes(fragmentElement.type)) {
115
- const startNodes = getStartListItem([fragmentElement.children[0]]);
116
- const children = startNodes.concat(fragmentElement.children.slice(1));
117
- let fragmentNodes = [
118
- {
119
- ...fragmentElement,
120
- children
121
- }
122
- ];
123
- if (isSelectionInSameListItem(editor)) {
124
- // 仅仅复制列表中的内容
125
- fragmentNodes = children[0].children;
126
- }
127
- const fragment = fragmentNodes.concat(fragmentData.slice(1));
128
- const domRange = AngularEditor.toDOMRange(editor, selection);
129
- const contents = domRange.cloneContents();
130
- const stringObj = JSON.stringify(fragment);
131
- const encoded = window.btoa(encodeURIComponent(stringObj));
132
- unit.setData(`application/${CLIPBOARD_FORMAT_KEY}`, encoded);
133
- const div = document.createElement('div');
134
- div.appendChild(contents);
135
- div.setAttribute('hidden', 'true');
136
- document.body.appendChild(div);
137
- unit.setData('text/html', div.innerHTML);
138
- unit.setData('text/plain', getPlainText(div));
139
- document.body.removeChild(div);
140
- return;
141
- }
142
- }
143
- setFragmentData(unit);
144
- };
145
- editor.deleteBackward = unit => {
146
- const res = getListItemEntry(editor, {});
147
- if (res && isSelectionAtListItemStart(editor)) {
148
- const { list, listItem } = res;
149
- const [, listPath] = list;
150
- const [listItemNode, listItemPath] = listItem;
151
- const previousListItemPath = TheQueries.getPreviousPath(listItemPath);
152
- if (previousListItemPath) {
153
- const beforePoint = Editor.before(editor, listItemPath);
154
- const parentPath = Path.parent(beforePoint.path);
155
- const parentNode = Node.get(editor, parentPath);
156
- if (Editor.isVoid(editor, parentNode)) {
157
- Editor.withoutNormalizing(editor, () => {
158
- TheTransforms.unwrapNodesByType(editor, [ElementKinds.bulletedList, ElementKinds.numberedList], {
159
- split: true
160
- });
161
- TheTransforms.unwrapNodesByType(editor, ElementKinds.listItem);
162
- });
163
- return;
164
- }
165
- }
166
- if (previousListItemPath && hasStableListInListItem(listItemNode)) {
167
- Editor.withoutNormalizing(editor, () => {
168
- deleteBackward(unit);
169
- const [previousListItemNode] = Editor.node(editor, previousListItemPath);
170
- moveListItemSublistItemsToListItemSublist(editor, {
171
- fromListItem: listItem,
172
- toListItem: [previousListItemNode, previousListItemPath],
173
- start: false
174
- }, {});
175
- });
176
- return;
177
- }
178
- // move listItem children to before listItem
179
- if (listItemNode.children.length > 1) {
180
- Editor.withoutNormalizing(editor, () => {
181
- const beforePathRef = Editor.pathRef(editor, listItemPath);
182
- const beforePoint = Editor.before(editor, listItemPath);
183
- const startPoint = Editor.start(editor, listItemPath);
184
- const endPoint = Editor.end(editor, listItemPath);
185
- const isInFirstChild = !isListNested(editor, listPath) && TheQueries.isFirstChild(listItemPath);
186
- const to = isInFirstChild ? listPath : Path.next(Path.parent(beforePoint.path));
187
- Transforms.moveNodes(editor, {
188
- at: Editor.range(editor, startPoint, endPoint),
189
- to,
190
- match: node => listItemNode.children.includes(node)
191
- });
192
- Transforms.delete(editor, { at: beforePathRef.unref() });
193
- if (!isInFirstChild) {
194
- deleteBackward(unit);
195
- }
196
- });
197
- return;
198
- }
199
- // deprecated
200
- if (!isListNested(editor, listPath) && TheQueries.isFirstChild(listItemPath)) {
201
- unwrapList(editor);
202
- return;
203
- }
204
- }
205
- deleteBackward(unit);
206
- };
207
- editor.insertData = (data) => {
208
- const text = data.getData('text/plain');
209
- const fragment = extractFragment(data);
210
- const aboveEntry = Editor.above(editor, {
211
- match: n => Editor.isBlock(editor, n) && n.type === ElementKinds.listItem
212
- });
213
- if (fragment) {
214
- const res = getListItemEntry(editor, {});
215
- if (fragment.length === 1 &&
216
- isList(fragment[0]) &&
217
- aboveEntry &&
218
- !isSingleListItem(fragment[0]) &&
219
- hasStableListItem(res.listItem[0])) {
220
- insertListData(editor, { fromList: fragment[0], toListItemEntry: aboveEntry });
221
- return;
222
- }
223
- }
224
- insertData(data);
225
- };
226
- editor.onKeydown = (event) => {
227
- const isContinue = !onKeyDownList(event, editor);
228
- if (isContinue) {
229
- onKeydown(event);
230
- }
231
- };
232
- editor.normalizeNode = getListNormalizer(editor, { validLiChildrenTypes: validLiChildrenTypes });
233
- editor.renderElement = (element) => {
234
- if (element.type === ElementKinds.numberedList) {
235
- return TheNumberedListComponent;
236
- }
237
- if (element.type === ElementKinds.bulletedList) {
238
- return TheBulletedListComponent;
239
- }
240
- if (element.type === ElementKinds.listItem) {
241
- return TheListItemComponent;
242
- }
243
- return renderElement(element);
244
- };
245
- return editor;
246
- };
247
- const listOptions = {
248
- validLiChildrenTypes: [ElementKinds.image],
249
- allowParentTypes: [ElementKinds.listItem, ElementKinds.tableCell, ElementKinds.blockquote]
250
- };
251
- export const createListPlugin = createPluginFactory({
252
- key: PluginKeys.list,
253
- withOverrides: withList,
254
- plugins: [
255
- {
256
- key: PluginKeys.numberedList,
257
- options: listOptions
258
- },
259
- {
260
- key: PluginKeys.bulletedList,
261
- options: listOptions
262
- }
263
- ],
264
- nestedStructureByKey: {
265
- [ElementKinds.bulletedList]: ElementKinds.listItem,
266
- [ElementKinds.numberedList]: ElementKinds.listItem
267
- },
268
- toolbarItems: [
269
- {
270
- key: ElementKinds.numberedList,
271
- icon: 'list-ordered',
272
- name: '有序列表',
273
- execute: editor => ListEditor.toggleList(editor, ElementKinds.numberedList),
274
- active: editor => ListEditor.isActive(editor, ElementKinds.numberedList)
275
- },
276
- {
277
- key: ElementKinds.bulletedList,
278
- icon: 'list-bullet',
279
- name: '无序列表',
280
- execute: editor => ListEditor.toggleList(editor, ElementKinds.bulletedList),
281
- active: editor => ListEditor.isActive(editor, ElementKinds.bulletedList)
282
- }
283
- ],
284
- options: listOptions
285
- });
1
+ import { Transforms, Node, Editor, Path } from 'slate';
2
+ import { AngularEditor, getPlainText } from 'slate-angular';
3
+ import { CLIPBOARD_FORMAT_KEY, ElementKinds } from '../../constants';
4
+ import * as TheQueries from '../../queries';
5
+ import * as TheTransforms from '../../transforms';
6
+ import { isList } from './queries/is-list';
7
+ import { isInList } from './queries/is-in-list';
8
+ import { isListNested } from './queries/is-list-nested';
9
+ import { getListTypes } from './queries/get-list-types';
10
+ import { getStartListItem } from './queries/get-start-list-item';
11
+ import { isSingleListItem } from './queries/is-single-list-item';
12
+ import { getListItemEntry } from './queries/get-list-item-entry';
13
+ import { hasListInListItem, hasStableListInListItem, hasStableListItem } from './queries/has-list-in-list-item';
14
+ import { isSelectionAtListItemStart } from './queries/is-selection-at-list-item-start';
15
+ import { insertListData } from './transforms/insert-list-data';
16
+ import { moveListItemUp } from './transforms/move-list-item-up';
17
+ import { insertListItem } from './transforms/insert-list-item';
18
+ import { unwrapList } from './transforms/unwrap-list';
19
+ import { moveListItemSublistItemsToListItemSublist } from './transforms/move-list-item-sublist-items-to-list-item-sublist';
20
+ import { getListNormalizer } from './normalizers/get-list-normalizer';
21
+ import { onKeyDownList } from './on-key-down-list';
22
+ import { TheNumberedListComponent } from './components/numbered-list.component';
23
+ import { TheBulletedListComponent } from './components/bulleted-list.component';
24
+ import { TheListItemComponent } from './components/list-item.component';
25
+ import { extractFragment } from '../../utils/fragment';
26
+ import { isSelectionInSameListItem } from './queries/is-selection-in-same-list-item';
27
+ import { createPluginFactory, getPluginOptions } from '../../core';
28
+ import { PluginKeys } from '../../interfaces';
29
+ import { ListEditor } from './list.editor';
30
+ export const withList = (editor) => {
31
+ const { insertBreak, deleteBackward, onKeydown, insertData, setFragmentData, renderElement } = editor;
32
+ const validLiChildrenTypes = getPluginOptions(editor, PluginKeys.list)?.validLiChildrenTypes ?? [];
33
+ const resetBlockTypesListRule = {
34
+ types: [ElementKinds.listItem],
35
+ defaultType: ElementKinds.paragraph,
36
+ onReset: (_editor) => unwrapList(_editor)
37
+ };
38
+ editor.insertBreak = () => {
39
+ const node = TheQueries.anchorBlock(editor);
40
+ if (!node) {
41
+ insertBreak();
42
+ return;
43
+ }
44
+ const isVoid = Editor.isVoid(editor, node);
45
+ if (isVoid) {
46
+ insertBreak();
47
+ return;
48
+ }
49
+ const listEntry = getListItemEntry(editor, {});
50
+ if (listEntry) {
51
+ let moved;
52
+ const { list, listItem } = listEntry;
53
+ const [listItemNode, listItemPath] = listItem;
54
+ const cursor = editor.selection.focus;
55
+ const isStart = Editor.isStart(editor, cursor, listItemPath);
56
+ // deprecated
57
+ // 如果有子级
58
+ if (hasListInListItem(listItemNode)) {
59
+ /**
60
+ * If selection is at the end of li,
61
+ * insert below li where children will be moved.
62
+ */
63
+ if (Editor.isEnd(editor, cursor, listItemPath)) {
64
+ return Transforms.insertNodes(editor, {
65
+ type: ElementKinds.listItem,
66
+ children: [{ type: ElementKinds.paragraph, children: [{ text: '' }] }]
67
+ }, { at: Path.next(listItemPath), select: true });
68
+ }
69
+ /**
70
+ * 如果选区是在listItem的开头,则在listItem上方插入
71
+ */
72
+ if (isStart) {
73
+ return Transforms.insertNodes(editor, {
74
+ type: ElementKinds.listItem,
75
+ children: [{ type: ElementKinds.paragraph, children: [{ text: '' }] }]
76
+ }, { at: listItemPath });
77
+ }
78
+ }
79
+ // 如果选择的listItem为空则将其向上移动
80
+ if (isStart && TheQueries.isBlockAboveEmpty(editor)) {
81
+ moved = moveListItemUp(editor, { list, listItem });
82
+ if (moved)
83
+ return;
84
+ }
85
+ const didReset = TheTransforms.onKeyDownResetBlockType({
86
+ rules: [
87
+ {
88
+ ...resetBlockTypesListRule,
89
+ predicate: () => !moved && isStart && TheQueries.isBlockAboveEmpty(editor)
90
+ }
91
+ ]
92
+ })(null, editor);
93
+ if (didReset) {
94
+ return;
95
+ }
96
+ /**
97
+ * Add a new list item if selection is in a LIST_ITEM > p.type.
98
+ */
99
+ if (!moved) {
100
+ const inserted = insertListItem(editor);
101
+ if (inserted) {
102
+ return;
103
+ }
104
+ }
105
+ }
106
+ insertBreak();
107
+ };
108
+ editor.setFragmentData = unit => {
109
+ const { selection } = editor;
110
+ const [start] = Editor.edges(editor, selection);
111
+ if (isInList(editor, start)) {
112
+ const fragmentData = editor.getFragment();
113
+ const fragmentElement = fragmentData[0];
114
+ if (getListTypes().includes(fragmentElement.type)) {
115
+ const startNodes = getStartListItem([fragmentElement.children[0]]);
116
+ const children = startNodes.concat(fragmentElement.children.slice(1));
117
+ let fragmentNodes = [
118
+ {
119
+ ...fragmentElement,
120
+ children
121
+ }
122
+ ];
123
+ if (isSelectionInSameListItem(editor)) {
124
+ // 仅仅复制列表中的内容
125
+ fragmentNodes = children[0].children;
126
+ }
127
+ const fragment = fragmentNodes.concat(fragmentData.slice(1));
128
+ const domRange = AngularEditor.toDOMRange(editor, selection);
129
+ const contents = domRange.cloneContents();
130
+ const stringObj = JSON.stringify(fragment);
131
+ const encoded = window.btoa(encodeURIComponent(stringObj));
132
+ unit.setData(`application/${CLIPBOARD_FORMAT_KEY}`, encoded);
133
+ const div = document.createElement('div');
134
+ div.appendChild(contents);
135
+ div.setAttribute('hidden', 'true');
136
+ document.body.appendChild(div);
137
+ unit.setData('text/html', div.innerHTML);
138
+ unit.setData('text/plain', getPlainText(div));
139
+ document.body.removeChild(div);
140
+ return;
141
+ }
142
+ }
143
+ setFragmentData(unit);
144
+ };
145
+ editor.deleteBackward = unit => {
146
+ const res = getListItemEntry(editor, {});
147
+ if (res && isSelectionAtListItemStart(editor)) {
148
+ const { list, listItem } = res;
149
+ const [, listPath] = list;
150
+ const [listItemNode, listItemPath] = listItem;
151
+ const previousListItemPath = TheQueries.getPreviousPath(listItemPath);
152
+ if (previousListItemPath) {
153
+ const beforePoint = Editor.before(editor, listItemPath);
154
+ const parentPath = Path.parent(beforePoint.path);
155
+ const parentNode = Node.get(editor, parentPath);
156
+ if (Editor.isVoid(editor, parentNode)) {
157
+ Editor.withoutNormalizing(editor, () => {
158
+ TheTransforms.unwrapNodesByType(editor, [ElementKinds.bulletedList, ElementKinds.numberedList], {
159
+ split: true
160
+ });
161
+ TheTransforms.unwrapNodesByType(editor, ElementKinds.listItem);
162
+ });
163
+ return;
164
+ }
165
+ }
166
+ if (previousListItemPath && hasStableListInListItem(listItemNode)) {
167
+ Editor.withoutNormalizing(editor, () => {
168
+ deleteBackward(unit);
169
+ const [previousListItemNode] = Editor.node(editor, previousListItemPath);
170
+ moveListItemSublistItemsToListItemSublist(editor, {
171
+ fromListItem: listItem,
172
+ toListItem: [previousListItemNode, previousListItemPath],
173
+ start: false
174
+ }, {});
175
+ });
176
+ return;
177
+ }
178
+ // move listItem children to before listItem
179
+ if (listItemNode.children.length > 1) {
180
+ Editor.withoutNormalizing(editor, () => {
181
+ const beforePathRef = Editor.pathRef(editor, listItemPath);
182
+ const beforePoint = Editor.before(editor, listItemPath);
183
+ const startPoint = Editor.start(editor, listItemPath);
184
+ const endPoint = Editor.end(editor, listItemPath);
185
+ const isInFirstChild = !isListNested(editor, listPath) && TheQueries.isFirstChild(listItemPath);
186
+ const to = isInFirstChild ? listPath : Path.next(Path.parent(beforePoint.path));
187
+ Transforms.moveNodes(editor, {
188
+ at: Editor.range(editor, startPoint, endPoint),
189
+ to,
190
+ match: node => listItemNode.children.includes(node)
191
+ });
192
+ Transforms.delete(editor, { at: beforePathRef.unref() });
193
+ if (!isInFirstChild) {
194
+ deleteBackward(unit);
195
+ }
196
+ });
197
+ return;
198
+ }
199
+ // deprecated
200
+ if (!isListNested(editor, listPath) && TheQueries.isFirstChild(listItemPath)) {
201
+ unwrapList(editor);
202
+ return;
203
+ }
204
+ }
205
+ deleteBackward(unit);
206
+ };
207
+ editor.insertData = (data) => {
208
+ const text = data.getData('text/plain');
209
+ const fragment = extractFragment(data);
210
+ const aboveEntry = Editor.above(editor, {
211
+ match: n => Editor.isBlock(editor, n) && n.type === ElementKinds.listItem
212
+ });
213
+ if (fragment) {
214
+ const res = getListItemEntry(editor, {});
215
+ if (fragment.length === 1 &&
216
+ isList(fragment[0]) &&
217
+ aboveEntry &&
218
+ !isSingleListItem(fragment[0]) &&
219
+ hasStableListItem(res.listItem[0])) {
220
+ insertListData(editor, { fromList: fragment[0], toListItemEntry: aboveEntry });
221
+ return;
222
+ }
223
+ }
224
+ insertData(data);
225
+ };
226
+ editor.onKeydown = (event) => {
227
+ const isContinue = !onKeyDownList(event, editor);
228
+ if (isContinue) {
229
+ onKeydown(event);
230
+ }
231
+ };
232
+ editor.normalizeNode = getListNormalizer(editor, { validLiChildrenTypes: validLiChildrenTypes });
233
+ editor.renderElement = (element) => {
234
+ if (element.type === ElementKinds.numberedList) {
235
+ return TheNumberedListComponent;
236
+ }
237
+ if (element.type === ElementKinds.bulletedList) {
238
+ return TheBulletedListComponent;
239
+ }
240
+ if (element.type === ElementKinds.listItem) {
241
+ return TheListItemComponent;
242
+ }
243
+ return renderElement(element);
244
+ };
245
+ return editor;
246
+ };
247
+ const listOptions = {
248
+ validLiChildrenTypes: [ElementKinds.image],
249
+ allowParentTypes: [ElementKinds.listItem, ElementKinds.tableCell, ElementKinds.blockquote]
250
+ };
251
+ export const createListPlugin = createPluginFactory({
252
+ key: PluginKeys.list,
253
+ withOverrides: withList,
254
+ plugins: [
255
+ {
256
+ key: PluginKeys.numberedList,
257
+ options: listOptions
258
+ },
259
+ {
260
+ key: PluginKeys.bulletedList,
261
+ options: listOptions
262
+ }
263
+ ],
264
+ nestedStructureByKey: {
265
+ [ElementKinds.bulletedList]: ElementKinds.listItem,
266
+ [ElementKinds.numberedList]: ElementKinds.listItem
267
+ },
268
+ toolbarItems: [
269
+ {
270
+ key: ElementKinds.numberedList,
271
+ icon: 'list-ordered',
272
+ name: '有序列表',
273
+ execute: editor => ListEditor.toggleList(editor, ElementKinds.numberedList),
274
+ active: editor => ListEditor.isActive(editor, ElementKinds.numberedList)
275
+ },
276
+ {
277
+ key: ElementKinds.bulletedList,
278
+ icon: 'list-bullet',
279
+ name: '无序列表',
280
+ execute: editor => ListEditor.toggleList(editor, ElementKinds.bulletedList),
281
+ active: editor => ListEditor.isActive(editor, ElementKinds.bulletedList)
282
+ }
283
+ ],
284
+ options: listOptions
285
+ });
286
286
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5wbHVnaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9zcmMvcGx1Z2lucy9saXN0L2xpc3QucGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQXFCLE1BQU0sT0FBTyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRSxPQUFPLEtBQUssVUFBVSxNQUFNLGVBQWUsQ0FBQztBQUM1QyxPQUFPLEtBQUssYUFBYSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNoSCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUN2RixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxD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RSxNQUFNLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxZQUFZLENBQUM7WUFDM0UsTUFBTSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLFlBQVksQ0FBQztTQUMzRTtRQUNEO1lBQ0ksR0FBRyxFQUFFLFlBQVksQ0FBQyxZQUFZO1lBQzlCLElBQUksRUFBRSxhQUFhO1lBQ25CLElBQUksRUFBRSxNQUFNO1lBQ1osT0FBTyxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLFlBQVksQ0FBQztZQUMzRSxNQUFNLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsWUFBWSxDQUFDO1NBQzNFO0tBQ0o7SUFDRCxPQUFPLEVBQUUsV0FBVztDQUN2QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUcmFuc2Zvcm1zLCBOb2RlLCBFZGl0b3IsIFBhdGgsIEFuY2VzdG9yLCBFbGVtZW50IH0gZnJvbSAnc2xhdGUnO1xuaW1wb3J0IHsgQW5ndWxhckVkaXRvciwgZ2V0UGxhaW5UZXh0IH0gZnJvbSAnc2xhdGUtYW5ndWxhcic7XG5pbXBvcnQgeyBDTElQQk9BUkRfRk9STUFUX0tFWSwgRWxlbWVudEtpbmRzIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcbmltcG9ydCAqIGFzIFRoZVF1ZXJpZXMgZnJvbSAnLi4vLi4vcXVlcmllcyc7XG5pbXBvcnQgKiBhcyBUaGVUcmFuc2Zvcm1zIGZyb20gJy4uLy4uL3RyYW5zZm9ybXMnO1xuaW1wb3J0IHsgaXNMaXN0IH0gZnJvbSAnLi9xdWVyaWVzL2lzLWxpc3QnO1xuaW1wb3J0IHsgaXNJbkxpc3QgfSBmcm9tICcuL3F1ZXJpZXMvaXMtaW4tbGlzdCc7XG5pbXBvcnQgeyBpc0xpc3ROZXN0ZWQgfSBmcm9tICcuL3F1ZXJpZXMvaXMtbGlzdC1uZXN0ZWQnO1xuaW1wb3J0IHsgZ2V0TGlzdFR5cGVzIH0gZnJvbSAnLi9xdWVyaWVzL2dldC1saXN0LXR5cGVzJztcbmltcG9ydCB7IGdldFN0YXJ0TGlzdEl0ZW0gfSBmcm9tICcuL3F1ZXJpZXMvZ2V0LXN0YXJ0LWxpc3QtaXRlbSc7XG5pbXBvcnQgeyBpc1NpbmdsZUxpc3RJdGVtIH0gZnJvbSAnLi9xdWVyaWVzL2lzLXNpbmdsZS1saXN0LWl0ZW0nO1xuaW1wb3J0IHsgZ2V0TGlzdEl0ZW1FbnRyeSB9IGZyb20gJy4vcXVlcmllcy9nZXQtbGlzdC1pdGVtLWVudHJ5JztcbmltcG9ydCB7IGhhc0xpc3RJbkxpc3RJdGVtLCBoYXNTdGFibGVMaXN0SW5MaXN0SXRlbSwgaGFzU3RhYmxlTGlzdEl0ZW0gfSBmcm9tICcuL3F1ZXJpZXMvaGFzLWxpc3QtaW4tbGlzdC1pdGVtJztcbmltcG9ydCB7IGlzU2VsZWN0aW9uQXRMaXN0SXRlbVN0YXJ0IH0gZnJvbSAnLi9xdWVyaWVzL2lzLXNlbGVjdGlvbi1hdC1saXN0LWl0ZW0tc3RhcnQnO1xuaW1wb3J0IHsgaW5zZXJ0TGlzdERhdGEgfSBmcm9tICcuL3RyYW5zZm9ybXMvaW5zZXJ0LWxpc3QtZGF0YSc7XG5pbXBvcnQgeyBtb3ZlTGlzdEl0ZW1VcCB9IGZyb20gJy4vdHJhbnNmb3Jtcy9tb3ZlLWxpc3QtaXRlbS11cCc7XG5pbXBvcnQgeyBpbnNlcnRMaXN0SXRlbSB9IGZyb20gJy4vdHJhbnNmb3Jtcy9pbnNlcnQtbGlzdC1pdGVtJztcbmltcG9ydCB7IHVud3JhcExpc3QgfSBmcm9tICcuL3RyYW5zZm9ybXMvdW53cmFwLWxpc3QnO1xuaW1wb3J0IHsgbW92ZUxpc3RJdGVtU3VibGlzdEl0ZW1zVG9MaXN0SXRlbVN1Ymxpc3QgfSBmcm9tICcuL3RyYW5zZm9ybXMvbW92ZS1saXN0LWl0ZW0tc3VibGlzdC1pdGVtcy10by1saXN0LWl0ZW0tc3VibGlzdCc7XG5pbXBvcnQgeyBnZXRMaXN0Tm9ybWFsaXplciB9IGZyb20gJy4vbm9ybWFsaXplcnMvZ2V0LWxpc3Qtbm9ybWFsaXplcic7XG5pbXBvcnQgeyBvbktleURvd25MaXN0IH0gZnJvbSAnLi9vbi1rZXktZG93bi1saXN0JztcbmltcG9ydCB7IFdpdGhMaXN0T3B0aW9ucyB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgVGhlTnVtYmVyZWRMaXN0Q29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL251bWJlcmVkLWxpc3QuY29tcG9uZW50JztcbmltcG9ydCB7IFRoZUJ1bGxldGVkTGlzdENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9idWxsZXRlZC1saXN0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUaGVMaXN0SXRlbUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9saXN0LWl0ZW0uY29tcG9uZW50JztcbmltcG9ydCB7IGV4dHJhY3RGcmFnbWVudCB9IGZyb20gJy4uLy4uL3V0aWxzL2ZyYWdtZW50JztcbmltcG9ydCB7IGlzU2VsZWN0aW9uSW5TYW1lTGlzdEl0ZW0gfSBmcm9tICcuL3F1ZXJpZXMvaXMtc2VsZWN0aW9uLWluLXNhbWUtbGlzdC1pdGVtJztcbmltcG9ydCB7IGNyZWF0ZVBsdWdpbkZhY3RvcnksIGdldFBsdWdpbk9wdGlvbnMgfSBmcm9tICcuLi8uLi9jb3JlJztcbmltcG9ydCB7IFBsdWdpbktleXMgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IExpc3RFZGl0b3IgfSBmcm9tICcuL2xpc3QuZWRpdG9yJztcblxuZXhwb3J0IGNvbnN0IHdpdGhMaXN0ID0gPFQgZXh0ZW5kcyBFZGl0b3I+KGVkaXRvcjogVCk6IFQgPT4ge1xuICAgIGNvbnN0IHsgaW5zZXJ0QnJlYWssIGRlbGV0ZUJhY2t3YXJkLCBvbktleWRvd24sIGluc2VydERhdGEsIHNldEZyYWdtZW50RGF0YSwgcmVuZGVyRWxlbWVudCB9ID0gZWRpdG9yO1xuXG4gICAgY29uc3QgdmFsaWRMaUNoaWxkcmVuVHlwZXMgPSBnZXRQbHVnaW5PcHRpb25zPFdpdGhMaXN0T3B0aW9ucz4oZWRpdG9yLCBQbHVnaW5LZXlzLmxpc3QpPy52YWxpZExpQ2hpbGRyZW5UeXBlcyA/PyBbXTtcblxuICAgIGNvbnN0IHJlc2V0QmxvY2tUeXBlc0xpc3RSdWxlID0ge1xuICAgICAgICB0eXBlczogW0VsZW1lbnRLaW5kcy5saXN0SXRlbV0sXG4gICAgICAgIGRlZmF1bHRUeXBlOiBFbGVtZW50S2luZHMucGFyYWdyYXBoLFxuICAgICAgICBvblJlc2V0OiAoX2VkaXRvcjogRWRpdG9yKSA9PiB1bndyYXBMaXN0KF9lZGl0b3IpXG4gICAgfTtcblxuICAgIGVkaXRvci5pbnNlcnRCcmVhayA9ICgpID0+IHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IFRoZVF1ZXJpZXMuYW5jaG9yQmxvY2soZWRpdG9yKTtcblxuICAgICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgICAgIGluc2VydEJyZWFrKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc1ZvaWQgPSBFZGl0b3IuaXNWb2lkKGVkaXRvciwgbm9kZSk7XG4gICAgICAgIGlmIChpc1ZvaWQpIHtcbiAgICAgICAgICAgIGluc2VydEJyZWFrKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGlzdEVudHJ5ID0gZ2V0TGlzdEl0ZW1FbnRyeShlZGl0b3IsIHt9KTtcbiAgICAgICAgaWYgKGxpc3RFbnRyeSkge1xuICAgICAgICAgICAgbGV0IG1vdmVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgeyBsaXN0LCBsaXN0SXRlbSB9ID0gbGlzdEVudHJ5O1xuICAgICAgICAgICAgY29uc3QgW2xpc3RJdGVtTm9kZSwgbGlzdEl0ZW1QYXRoXSA9IGxpc3RJdGVtO1xuICAgICAgICAgICAgY29uc3QgY3Vyc29yID0gZWRpdG9yLnNlbGVjdGlvbi5mb2N1cztcbiAgICAgICAgICAgIGNvbnN0IGlzU3RhcnQgPSBFZGl0b3IuaXNTdGFydChlZGl0b3IsIGN1cnNvciwgbGlzdEl0ZW1QYXRoKTtcblxuICAgICAgICAgICAgLy8gZGVwcmVjYXRlZFxuICAgICAgICAgICAgLy8g5aaC5p6c5pyJ5a2Q57qnXG4gICAgICAgICAgICBpZiAoaGFzTGlzdEluTGlzdEl0ZW0obGlzdEl0ZW1Ob2RlKSkge1xuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIElmIHNlbGVjdGlvbiBpcyBhdCB0aGUgZW5kIG9mIGxpLFxuICAgICAgICAgICAgICAgICAqIGluc2VydCBiZWxvdyBsaSB3aGVyZSBjaGlsZHJlbiB3aWxsIGJlIG1vdmVkLlxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGlmIChFZGl0b3IuaXNFbmQoZWRpdG9yLCBjdXJzb3IsIGxpc3RJdGVtUGF0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRyYW5zZm9ybXMuaW5zZXJ0Tm9kZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogRWxlbWVudEtpbmRzLmxpc3RJdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbeyB0eXBlOiBFbGVtZW50S2luZHMucGFyYWdyYXBoLCBjaGlsZHJlbjogW3sgdGV4dDogJycgfV0gfV1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7IGF0OiBQYXRoLm5leHQobGlzdEl0ZW1QYXRoKSwgc2VsZWN0OiB0cnVlIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiDlpoLmnpzpgInljLrmmK/lnKhsaXN0SXRlbeeahOW8gOWktO+8jOWImeWcqGxpc3RJdGVt5LiK5pa55o+S5YWlXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgaWYgKGlzU3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRyYW5zZm9ybXMuaW5zZXJ0Tm9kZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogRWxlbWVudEtpbmRzLmxpc3RJdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbeyB0eXBlOiBFbGVtZW50S2luZHMucGFyYWdyYXBoLCBjaGlsZHJlbjogW3sgdGV4dDogJycgfV0gfV1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7IGF0OiBsaXN0SXRlbVBhdGggfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8g5aaC5p6c6YCJ5oup55qEbGlzdEl0ZW3kuLrnqbrliJnlsIblhbblkJHkuIrnp7vliqhcbiAgICAgICAgICAgIGlmIChpc1N0YXJ0ICYmIFRoZVF1ZXJpZXMuaXNCbG9ja0Fib3ZlRW1wdHkoZWRpdG9yKSkge1xuICAgICAgICAgICAgICAgIG1vdmVkID0gbW92ZUxpc3RJdGVtVXAoZWRpdG9yLCB7IGxpc3QsIGxpc3RJdGVtIH0pO1xuICAgICAgICAgICAgICAgIGlmIChtb3ZlZCkgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBkaWRSZXNldCA9IFRoZVRyYW5zZm9ybXMub25LZXlEb3duUmVzZXRCbG9ja1R5cGUoe1xuICAgICAgICAgICAgICAgIHJ1bGVzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJlc2V0QmxvY2tUeXBlc0xpc3RSdWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljYXRlOiAoKSA9PiAhbW92ZWQgJiYgaXNTdGFydCAmJiBUaGVRdWVyaWVzLmlzQmxvY2tBYm92ZUVtcHR5KGVkaXRvcilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0pKG51bGwsIGVkaXRvcik7XG4gICAgICAgICAgICBpZiAoZGlkUmVzZXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQWRkIGEgbmV3IGxpc3QgaXRlbSBpZiBzZWxlY3Rpb24gaXMgaW4gYSBMSVNUX0lURU0gPiBwLnR5cGUuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGlmICghbW92ZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnNlcnRlZCA9IGluc2VydExpc3RJdGVtKGVkaXRvcik7XG4gICAgICAgICAgICAgICAgaWYgKGluc2VydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpbnNlcnRCcmVhaygpO1xuICAgIH07XG5cbiAgICBlZGl0b3Iuc2V0RnJhZ21lbnREYXRhID0gdW5pdCA9PiB7XG4gICAgICAgIGNvbnN0IHsgc2VsZWN0aW9uIH0gPSBlZGl0b3I7XG4gICAgICAgIGNvbnN0IFtzdGFydF0gPSBFZGl0b3IuZWRnZXMoZWRpdG9yLCBzZWxlY3Rpb24pO1xuICAgICAgICBpZiAoaXNJbkxpc3QoZWRpdG9yLCBzdGFydCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGZyYWdtZW50RGF0YSA9IGVkaXRvci5nZXRGcmFnbWVudCgpO1xuICAgICAgICAgICAgY29uc3QgZnJhZ21lbnRFbGVtZW50ID0gZnJhZ21lbnREYXRhWzBdIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICBpZiAoZ2V0TGlzdFR5cGVzKCkuaW5jbHVkZXMoZnJhZ21lbnRFbGVtZW50LnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnROb2RlcyA9IGdldFN0YXJ0TGlzdEl0ZW0oW2ZyYWdtZW50RWxlbWVudC5jaGlsZHJlblswXV0gYXMgRWxlbWVudFtdKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHN0YXJ0Tm9kZXMuY29uY2F0KChmcmFnbWVudEVsZW1lbnQuY2hpbGRyZW4gYXMgRWxlbWVudFtdKS5zbGljZSgxKSk7XG4gICAgICAgICAgICAgICAgbGV0IGZyYWdtZW50Tm9kZXMgPSBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmZyYWdtZW50RWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdIGFzIE5vZGVbXTtcbiAgICAgICAgICAgICAgICBpZiAoaXNTZWxlY3Rpb25JblNhbWVMaXN0SXRlbShlZGl0b3IpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIOS7heS7heWkjeWItuWIl+ihqOS4reeahOWGheWuuVxuICAgICAgICAgICAgICAgICAgICBmcmFnbWVudE5vZGVzID0gY2hpbGRyZW5bMF0uY2hpbGRyZW47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGZyYWdtZW50ID0gZnJhZ21lbnROb2Rlcy5jb25jYXQoZnJhZ21lbnREYXRhLnNsaWNlKDEpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkb21SYW5nZSA9IEFuZ3VsYXJFZGl0b3IudG9ET01SYW5nZShlZGl0b3IsIHNlbGVjdGlvbik7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudHMgPSBkb21SYW5nZS5jbG9uZUNvbnRlbnRzKCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nT2JqID0gSlNPTi5zdHJpbmdpZnkoZnJhZ21lbnQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVuY29kZWQgPSB3aW5kb3cuYnRvYShlbmNvZGVVUklDb21wb25lbnQoc3RyaW5nT2JqKSk7XG4gICAgICAgICAgICAgICAgdW5pdC5zZXREYXRhKGBhcHBsaWNhdGlvbi8ke0NMSVBCT0FSRF9GT1JNQVRfS0VZfWAsIGVuY29kZWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgICAgIGRpdi5hcHBlbmRDaGlsZChjb250ZW50cyk7XG4gICAgICAgICAgICAgICAgZGl2LnNldEF0dHJpYnV0ZSgnaGlkZGVuJywgJ3RydWUnKTtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpdik7XG4gICAgICAgICAgICAgICAgdW5pdC5zZXREYXRhKCd0ZXh0L2h0bWwnLCBkaXYuaW5uZXJIVE1MKTtcbiAgICAgICAgICAgICAgICB1bml0LnNldERhdGEoJ3RleHQvcGxhaW4nLCBnZXRQbGFpblRleHQoZGl2KSk7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChkaXYpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRGcmFnbWVudERhdGEodW5pdCk7XG4gICAgfTtcblxuICAgIGVkaXRvci5kZWxldGVCYWNrd2FyZCA9IHVuaXQgPT4ge1xuICAgICAgICBjb25zdCByZXMgPSBnZXRMaXN0SXRlbUVudHJ5KGVkaXRvciwge30pO1xuXG4gICAgICAgIGlmIChyZXMgJiYgaXNTZWxlY3Rpb25BdExpc3RJdGVtU3RhcnQoZWRpdG9yKSkge1xuICAgICAgICAgICAgY29uc3QgeyBsaXN0LCBsaXN0SXRlbSB9ID0gcmVzO1xuICAgICAgICAgICAgY29uc3QgWywgbGlzdFBhdGhdID0gbGlzdDtcbiAgICAgICAgICAgIGNvbnN0IFtsaXN0SXRlbU5vZGUsIGxpc3RJdGVtUGF0aF0gPSBsaXN0SXRlbTtcblxuICAgICAgICAgICAgY29uc3QgcHJldmlvdXNMaXN0SXRlbVBhdGggPSBUaGVRdWVyaWVzLmdldFByZXZpb3VzUGF0aChsaXN0SXRlbVBhdGgpO1xuXG4gICAgICAgICAgICBpZiAocHJldmlvdXNMaXN0SXRlbVBhdGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBiZWZvcmVQb2ludCA9IEVkaXRvci5iZWZvcmUoZWRpdG9yLCBsaXN0SXRlbVBhdGgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudFBhdGggPSBQYXRoLnBhcmVudChiZWZvcmVQb2ludC5wYXRoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gTm9kZS5nZXQoZWRpdG9yLCBwYXJlbnRQYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoRWRpdG9yLmlzVm9pZChlZGl0b3IsIHBhcmVudE5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIEVkaXRvci53aXRob3V0Tm9ybWFsaXppbmcoZWRpdG9yLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBUaGVUcmFuc2Zvcm1zLnVud3JhcE5vZGVzQnlUeXBlKGVkaXRvciwgW0VsZW1lbnRLaW5kcy5idWxsZXRlZExpc3QsIEVsZW1lbnRLaW5kcy5udW1iZXJlZExpc3RdLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BsaXQ6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgVGhlVHJhbnNmb3Jtcy51bndyYXBOb2Rlc0J5VHlwZShlZGl0b3IsIEVsZW1lbnRLaW5kcy5saXN0SXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJldmlvdXNMaXN0SXRlbVBhdGggJiYgaGFzU3RhYmxlTGlzdEluTGlzdEl0ZW0obGlzdEl0ZW1Ob2RlKSkge1xuICAgICAgICAgICAgICAgIEVkaXRvci53aXRob3V0Tm9ybWFsaXppbmcoZWRpdG9yLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZUJhY2t3YXJkKHVuaXQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBbcHJldmlvdXNMaXN0SXRlbU5vZGVdID0gRWRpdG9yLm5vZGUoZWRpdG9yLCBwcmV2aW91c0xpc3RJdGVtUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIG1vdmVMaXN0SXRlbVN1Ymxpc3RJdGVtc1RvTGlzdEl0ZW1TdWJsaXN0KFxuICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21MaXN0SXRlbTogbGlzdEl0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9MaXN0SXRlbTogW3ByZXZpb3VzTGlzdEl0ZW1Ob2RlIGFzIEFuY2VzdG9yLCBwcmV2aW91c0xpc3RJdGVtUGF0aF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge31cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIG1vdmUgbGlzdEl0ZW0gY2hpbGRyZW4gdG8gYmVmb3JlIGxpc3RJdGVtXG4gICAgICAgICAgICBpZiAobGlzdEl0ZW1Ob2RlLmNoaWxkcmVuLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICBFZGl0b3Iud2l0aG91dE5vcm1hbGl6aW5nKGVkaXRvciwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBiZWZvcmVQYXRoUmVmID0gRWRpdG9yLnBhdGhSZWYoZWRpdG9yLCBsaXN0SXRlbVBhdGgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBiZWZvcmVQb2ludCA9IEVkaXRvci5iZWZvcmUoZWRpdG9yLCBsaXN0SXRlbVBhdGgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydFBvaW50ID0gRWRpdG9yLnN0YXJ0KGVkaXRvciwgbGlzdEl0ZW1QYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kUG9pbnQgPSBFZGl0b3IuZW5kKGVkaXRvciwgbGlzdEl0ZW1QYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNJbkZpcnN0Q2hpbGQgPSAhaXNMaXN0TmVzdGVkKGVkaXRvciwgbGlzdFBhdGgpICYmIFRoZVF1ZXJpZXMuaXNGaXJzdENoaWxkKGxpc3RJdGVtUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvID0gaXNJbkZpcnN0Q2hpbGQgPyBsaXN0UGF0aCA6IFBhdGgubmV4dChQYXRoLnBhcmVudChiZWZvcmVQb2ludC5wYXRoKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5tb3ZlTm9kZXMoZWRpdG9yLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdDogRWRpdG9yLnJhbmdlKGVkaXRvciwgc3RhcnRQb2ludCwgZW5kUG9pbnQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdG8sXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaDogbm9kZSA9PiBsaXN0SXRlbU5vZGUuY2hpbGRyZW4uaW5jbHVkZXMobm9kZSBhcyBhbnkpXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1zLmRlbGV0ZShlZGl0b3IsIHsgYXQ6IGJlZm9yZVBhdGhSZWYudW5yZWYoKSB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzSW5GaXJzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVCYWNrd2FyZCh1bml0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZGVwcmVjYXRlZFxuICAgICAgICAgICAgaWYgKCFpc0xpc3ROZXN0ZWQoZWRpdG9yLCBsaXN0UGF0aCkgJiYgVGhlUXVlcmllcy5pc0ZpcnN0Q2hpbGQobGlzdEl0ZW1QYXRoKSkge1xuICAgICAgICAgICAgICAgIHVud3JhcExpc3QoZWRpdG9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBkZWxldGVCYWNrd2FyZCh1bml0KTtcbiAgICB9O1xuXG4gICAgZWRpdG9yLmluc2VydERhdGEgPSAoZGF0YTogRGF0YVRyYW5zZmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IHRleHQgPSBkYXRhLmdldERhdGEoJ3RleHQvcGxhaW4nKTtcbiAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBleHRyYWN0RnJhZ21lbnQoZGF0YSk7XG4gICAgICAgIGNvbnN0IGFib3ZlRW50cnkgPSBFZGl0b3IuYWJvdmUoZWRpdG9yLCB7XG4gICAgICAgICAgICBtYXRjaDogbiA9PiBFZGl0b3IuaXNCbG9jayhlZGl0b3IsIG4pICYmIG4udHlwZSA9PT0gRWxlbWVudEtpbmRzLmxpc3RJdGVtXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoZnJhZ21lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGdldExpc3RJdGVtRW50cnkoZWRpdG9yLCB7fSk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZnJhZ21lbnQubGVuZ3RoID09PSAxICYmXG4gICAgICAgICAgICAgICAgaXNMaXN0KGZyYWdtZW50WzBdIGFzIEVsZW1lbnQpICYmXG4gICAgICAgICAgICAgICAgYWJvdmVFbnRyeSAmJlxuICAgICAgICAgICAgICAgICFpc1NpbmdsZUxpc3RJdGVtKGZyYWdtZW50WzBdKSAmJlxuICAgICAgICAgICAgICAgIGhhc1N0YWJsZUxpc3RJdGVtKHJlcy5saXN0SXRlbVswXSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGluc2VydExpc3REYXRhKGVkaXRvciwgeyBmcm9tTGlzdDogZnJhZ21lbnRbMF0gYXMgRWxlbWVudCwgdG9MaXN0SXRlbUVudHJ5OiBhYm92ZUVudHJ5IH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGluc2VydERhdGEoZGF0YSk7XG4gICAgfTtcblxuICAgIGVkaXRvci5vbktleWRvd24gPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgaXNDb250aW51ZSA9ICFvbktleURvd25MaXN0KGV2ZW50LCBlZGl0b3IpO1xuICAgICAgICBpZiAoaXNDb250aW51ZSkge1xuICAgICAgICAgICAgb25LZXlkb3duKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBlZGl0b3Iubm9ybWFsaXplTm9kZSA9IGdldExpc3ROb3JtYWxpemVyKGVkaXRvciwgeyB2YWxpZExpQ2hpbGRyZW5UeXBlczogdmFsaWRMaUNoaWxkcmVuVHlwZXMgfSk7XG5cbiAgICBlZGl0b3IucmVuZGVyRWxlbWVudCA9IChlbGVtZW50OiBFbGVtZW50KSA9PiB7XG4gICAgICAgIGlmIChlbGVtZW50LnR5cGUgPT09IEVsZW1lbnRLaW5kcy5udW1iZXJlZExpc3QpIHtcbiAgICAgICAgICAgIHJldHVybiBUaGVOdW1iZXJlZExpc3RDb21wb25lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gRWxlbWVudEtpbmRzLmJ1bGxldGVkTGlzdCkge1xuICAgICAgICAgICAgcmV0dXJuIFRoZUJ1bGxldGVkTGlzdENvbXBvbmVudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbWVudC50eXBlID09PSBFbGVtZW50S2luZHMubGlzdEl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiBUaGVMaXN0SXRlbUNvbXBvbmVudDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVuZGVyRWxlbWVudChlbGVtZW50KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGVkaXRvcjtcbn07XG5cbmNvbnN0IGxpc3RPcHRpb25zID0ge1xuICAgIHZhbGlkTGlDaGlsZHJlblR5cGVzOiBbRWxlbWVudEtpbmRzLmltYWdlXSxcbiAgICBhbGxvd1BhcmVudFR5cGVzOiBbRWxlbWVudEtpbmRzLmxpc3RJdGVtLCBFbGVtZW50S2luZHMudGFibGVDZWxsLCBFbGVtZW50S2luZHMuYmxvY2txdW90ZV1cbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVMaXN0UGx1Z2luID0gY3JlYXRlUGx1Z2luRmFjdG9yeTxXaXRoTGlzdE9wdGlvbnM+KHtcbiAgICBrZXk6IFBsdWdpbktleXMubGlzdCxcbiAgICB3aXRoT3ZlcnJpZGVzOiB3aXRoTGlzdCxcbiAgICBwbHVnaW5zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIGtleTogUGx1Z2luS2V5cy5udW1iZXJlZExpc3QsXG4gICAgICAgICAgICBvcHRpb25zOiBsaXN0T3B0aW9uc1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBrZXk6IFBsdWdpbktleXMuYnVsbGV0ZWRMaXN0LFxuICAgICAgICAgICAgb3B0aW9uczogbGlzdE9wdGlvbnNcbiAgICAgICAgfVxuICAgIF0sXG4gICAgbmVzdGVkU3RydWN0dXJlQnlLZXk6IHtcbiAgICAgICAgW0VsZW1lbnRLaW5kcy5idWxsZXRlZExpc3RdOiBFbGVtZW50S2luZHMubGlzdEl0ZW0sXG4gICAgICAgIFtFbGVtZW50S2luZHMubnVtYmVyZWRMaXN0XTogRWxlbWVudEtpbmRzLmxpc3RJdGVtXG4gICAgfSxcbiAgICB0b29sYmFySXRlbXM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAga2V5OiBFbGVtZW50S2luZHMubnVtYmVyZWRMaXN0LFxuICAgICAgICAgICAgaWNvbjogJ2xpc3Qtb3JkZXJlZCcsXG4gICAgICAgICAgICBuYW1lOiAn5pyJ5bqP5YiX6KGoJyxcbiAgICAgICAgICAgIGV4ZWN1dGU6IGVkaXRvciA9PiBMaXN0RWRpdG9yLnRvZ2dsZUxpc3QoZWRpdG9yLCBFbGVtZW50S2luZHMubnVtYmVyZWRMaXN0KSxcbiAgICAgICAgICAgIGFjdGl2ZTogZWRpdG9yID0+IExpc3RFZGl0b3IuaXNBY3RpdmUoZWRpdG9yLCBFbGVtZW50S2luZHMubnVtYmVyZWRMaXN0KVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBrZXk6IEVsZW1lbnRLaW5kcy5idWxsZXRlZExpc3QsXG4gICAgICAgICAgICBpY29uOiAnbGlzdC1idWxsZXQnLFxuICAgICAgICAgICAgbmFtZTogJ+aXoOW6j+WIl+ihqCcsXG4gICAgICAgICAgICBleGVjdXRlOiBlZGl0b3IgPT4gTGlzdEVkaXRvci50b2dnbGVMaXN0KGVkaXRvciwgRWxlbWVudEtpbmRzLmJ1bGxldGVkTGlzdCksXG4gICAgICAgICAgICBhY3RpdmU6IGVkaXRvciA9PiBMaXN0RWRpdG9yLmlzQWN0aXZlKGVkaXRvciwgRWxlbWVudEtpbmRzLmJ1bGxldGVkTGlzdClcbiAgICAgICAgfVxuICAgIF0sXG4gICAgb3B0aW9uczogbGlzdE9wdGlvbnNcbn0pO1xuIl19