@worktile/theia 3.0.9 → 3.1.0-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (705) 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 -65
  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 -18
  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 +98 -98
  55. package/esm2020/components/color-select/color-select.component.mjs +109 -0
  56. package/esm2020/components/column-resize/column-resize-notifier.mjs +31 -0
  57. package/{esm2015/components/column-resize/column-resize.directive.js → esm2020/components/column-resize/column-resize.directive.mjs} +99 -99
  58. package/esm2020/components/column-resize/column-resize.module.mjs +33 -0
  59. package/{esm2015/components/column-resize/event-dispatcher.js → esm2020/components/column-resize/event-dispatcher.mjs} +56 -56
  60. package/{esm2015/components/column-resize/overlay-handle.component.js → esm2020/components/column-resize/overlay-handle.component.mjs} +140 -140
  61. package/{esm2015/components/column-resize/resize-ref.js → esm2020/components/column-resize/resize-ref.mjs} +25 -25
  62. package/{esm2015/components/column-resize/resizing.store.js → esm2020/components/column-resize/resizing.store.mjs} +155 -155
  63. package/{esm2015/components/column-resize/selectors.js → esm2020/components/column-resize/selectors.mjs} +4 -4
  64. package/esm2020/components/contextmenu/contextmenu.component.mjs +61 -0
  65. package/esm2020/components/conversion-hint/conversion-hint.component.mjs +54 -0
  66. package/esm2020/components/element/element.component.mjs +23 -0
  67. package/esm2020/components/inline-toolbar/inline-toolbar.component.mjs +138 -0
  68. package/{esm2015/components/nav-split-line/nav-split-line.component.js → esm2020/components/nav-split-line/nav-split-line.component.mjs} +37 -37
  69. package/esm2020/components/table-select/table-select.component.mjs +50 -0
  70. package/esm2020/components/template/template.component.mjs +62 -0
  71. package/{esm2015/components/text/text.component.js → esm2020/components/text/text.component.mjs} +58 -58
  72. package/esm2020/components/toolbar/toolbar.component.mjs +241 -0
  73. package/esm2020/components/toolbar-dropdown/toolbar-dropdown.component.mjs +129 -0
  74. package/esm2020/components/toolbar-group/toolbar-group.component.mjs +110 -0
  75. package/esm2020/components/toolbar-item/toolbar-item.component.mjs +101 -0
  76. package/{esm2015/constants/auto-format-rules.js → esm2020/constants/auto-format-rules.mjs} +166 -166
  77. package/{esm2015/constants/code.js → esm2020/constants/code.mjs} +88 -88
  78. package/{esm2015/constants/color-select.js → esm2020/constants/color-select.mjs} +61 -61
  79. package/{esm2015/constants/default.js → esm2020/constants/default.mjs} +9 -9
  80. package/{esm2015/constants/error.js → esm2020/constants/error.mjs} +7 -7
  81. package/{esm2015/constants/index.js → esm2020/constants/index.mjs} +5 -5
  82. package/{esm2015/constants/node-types.js → esm2020/constants/node-types.mjs} +132 -132
  83. package/{esm2015/constants/selector.js → esm2020/constants/selector.mjs} +3 -3
  84. package/{esm2015/constants/toolbar.js → esm2020/constants/toolbar.mjs} +69 -69
  85. package/{esm2015/core/create-plugin.js → esm2020/core/create-plugin.mjs} +4 -4
  86. package/esm2020/core/create-toolbar.mjs +56 -0
  87. package/{esm2015/core/index.js → esm2020/core/index.mjs} +4 -4
  88. package/esm2020/core/toolbar-item/base-toolbar-item.mjs +90 -0
  89. package/{esm2015/core/utils/combine-plugins.js → esm2020/core/utils/combine-plugins.mjs} +9 -9
  90. package/{esm2015/core/utils/flatten-deep-plugins.js → esm2020/core/utils/flatten-deep-plugins.mjs} +18 -18
  91. package/esm2020/core/utils/get-plugin-options.mjs +3 -0
  92. package/{esm2015/core/utils/get-plugin.js → esm2020/core/utils/get-plugin.mjs} +1 -1
  93. package/esm2020/core/utils/get-plugins.mjs +4 -0
  94. package/{esm2015/core/utils/index.js → esm2020/core/utils/index.mjs} +10 -10
  95. package/esm2020/core/utils/merge-array.mjs +18 -0
  96. package/{esm2015/core/utils/merge-deep-plugins.js → esm2020/core/utils/merge-deep-plugins.mjs} +13 -13
  97. package/{esm2015/core/utils/merge-options.js → esm2020/core/utils/merge-options.mjs} +19 -19
  98. package/{esm2015/core/utils/nested-structure-by-key.js → esm2020/core/utils/nested-structure-by-key.mjs} +10 -10
  99. package/{esm2015/core/utils/plugins-by-key.js → esm2020/core/utils/plugins-by-key.mjs} +9 -9
  100. package/{esm2015/core/with-theia.js → esm2020/core/with-theia.mjs} +22 -22
  101. package/{esm2015/custom-types.js → esm2020/custom-types.mjs} +1 -1
  102. package/esm2020/editor.component.mjs +431 -0
  103. package/{esm2015/editor.module.js → esm2020/editor.module.mjs} +201 -202
  104. package/{esm2015/interfaces/auto-format.js → esm2020/interfaces/auto-format.mjs} +1 -1
  105. package/esm2020/interfaces/editor.mjs +25 -0
  106. package/{esm2015/interfaces/element.js → esm2020/interfaces/element.mjs} +1 -1
  107. package/{esm2015/interfaces/image.js → esm2020/interfaces/image.mjs} +2 -2
  108. package/{esm2015/interfaces/index.js → esm2020/interfaces/index.mjs} +8 -8
  109. package/{esm2015/interfaces/plugins/index.js → esm2020/interfaces/plugins/index.mjs} +4 -4
  110. package/{esm2015/interfaces/plugins/no-infer.js → esm2020/interfaces/plugins/no-infer.mjs} +1 -1
  111. package/{esm2015/interfaces/plugins/plugin-key.js → esm2020/interfaces/plugins/plugin-key.mjs} +39 -39
  112. package/{esm2015/interfaces/plugins/plugins.js → esm2020/interfaces/plugins/plugins.mjs} +1 -1
  113. package/{esm2015/interfaces/plugins/with-override.js → esm2020/interfaces/plugins/with-override.mjs} +1 -1
  114. package/esm2020/interfaces/reset-block-type-plugin-options.mjs +2 -0
  115. package/{esm2015/interfaces/toolbar.js → esm2020/interfaces/toolbar.mjs} +11 -11
  116. package/esm2020/interfaces/upload.mjs +2 -0
  117. package/{esm2015/interfaces/utility/index.js → esm2020/interfaces/utility/index.mjs} +3 -3
  118. package/{esm2015/interfaces/utility/nested-structure-by-key.js → esm2020/interfaces/utility/nested-structure-by-key.mjs} +1 -1
  119. package/{esm2015/interfaces/utility/override-by-key.js → esm2020/interfaces/utility/override-by-key.mjs} +1 -1
  120. package/{esm2015/interfaces/utility/types.js → esm2020/interfaces/utility/types.mjs} +1 -1
  121. package/{esm2015/interfaces/valid-children-types.js → esm2020/interfaces/valid-children-types.mjs} +35 -35
  122. package/{esm2015/interfaces/view-base.js → esm2020/interfaces/view-base.mjs} +21 -21
  123. package/{esm2015/pipes.js → esm2020/pipes.mjs} +42 -42
  124. package/esm2020/plugins/align/align.editor.mjs +47 -0
  125. package/{esm2015/plugins/align/align.plugin.js → esm2020/plugins/align/align.plugin.mjs} +63 -63
  126. package/esm2020/plugins/autoformat/autoformat.plugin.mjs +109 -0
  127. package/{esm2015/plugins/autoformat/transforms/auto-format-block.js → esm2020/plugins/autoformat/transforms/auto-format-block.mjs} +14 -14
  128. package/{esm2015/plugins/autoformat/transforms/auto-format-inline.js → esm2020/plugins/autoformat/transforms/auto-format-inline.mjs} +77 -77
  129. package/{esm2015/plugins/blockquote/blockquote.component.js → esm2020/plugins/blockquote/blockquote.component.mjs} +21 -21
  130. package/esm2020/plugins/blockquote/blockquote.editor.mjs +20 -0
  131. package/{esm2015/plugins/blockquote/blockquote.plugin.js → esm2020/plugins/blockquote/blockquote.plugin.mjs} +70 -70
  132. package/esm2020/plugins/code/code.component.mjs +241 -0
  133. package/{esm2015/plugins/code/code.editor.js → esm2020/plugins/code/code.editor.mjs} +47 -47
  134. package/{esm2015/plugins/code/code.plugin.js → esm2020/plugins/code/code.plugin.mjs} +41 -41
  135. package/esm2020/plugins/color/color.editor.mjs +44 -0
  136. package/{esm2015/plugins/color/color.plugin.js → esm2020/plugins/color/color.plugin.mjs} +27 -27
  137. package/esm2020/plugins/color/toolbar-item.component.mjs +123 -0
  138. package/esm2020/plugins/common/auto-insert-data..mjs +77 -0
  139. package/{esm2015/plugins/common/block-card.plugin.js → esm2020/plugins/common/block-card.plugin.mjs} +287 -287
  140. package/esm2020/plugins/common/get-fragment.plugin.mjs +24 -0
  141. package/{esm2015/plugins/common/history.plugin.js → esm2020/plugins/common/history.plugin.mjs} +30 -30
  142. package/{esm2015/plugins/common/move-selection.plugin.js → esm2020/plugins/common/move-selection.plugin.mjs} +89 -89
  143. package/{esm2015/plugins/common/remove-empty.plugin.js → esm2020/plugins/common/remove-empty.plugin.mjs} +59 -59
  144. package/{esm2015/plugins/common/remove-void.plugin.js → esm2020/plugins/common/remove-void.plugin.mjs} +56 -56
  145. package/{esm2015/plugins/common/reset-type.plugin.js → esm2020/plugins/common/reset-type.plugin.mjs} +34 -34
  146. package/{esm2015/plugins/common/transforms.plugin.js → esm2020/plugins/common/transforms.plugin.mjs} +17 -17
  147. package/{esm2015/plugins/deserializers/deserialize-html.plugin.js → esm2020/plugins/deserializers/deserialize-html.plugin.mjs} +38 -38
  148. package/{esm2015/plugins/deserializers/deserialize-md.plugin.js → esm2020/plugins/deserializers/deserialize-md.plugin.mjs} +121 -121
  149. package/esm2020/plugins/font-size/font-size.editor.mjs +98 -0
  150. package/{esm2015/plugins/heading/heading.editor.js → esm2020/plugins/heading/heading.editor.mjs} +53 -53
  151. package/{esm2015/plugins/heading/heading.plugin.js → esm2020/plugins/heading/heading.plugin.mjs} +84 -84
  152. package/{esm2015/plugins/hr/hr.component.js → esm2020/plugins/hr/hr.component.mjs} +40 -40
  153. package/{esm2015/plugins/hr/hr.editor.js → esm2020/plugins/hr/hr.editor.mjs} +7 -7
  154. package/{esm2015/plugins/hr/hr.plugin.js → esm2020/plugins/hr/hr.plugin.mjs} +41 -41
  155. package/esm2020/plugins/image/image.component.mjs +365 -0
  156. package/{esm2015/plugins/image/image.editor.js → esm2020/plugins/image/image.editor.mjs} +57 -57
  157. package/esm2020/plugins/image/image.plugin.mjs +57 -0
  158. package/esm2020/plugins/indent/indent.editor.mjs +71 -0
  159. package/esm2020/plugins/indent/indent.plugin.mjs +58 -0
  160. package/{esm2015/plugins/indent/on-keydown-indent.js → esm2020/plugins/indent/on-keydown-indent.mjs} +53 -53
  161. package/{esm2015/plugins/index.js → esm2020/plugins/index.mjs} +70 -70
  162. package/{esm2015/plugins/inline-code/inline-code.component.js → esm2020/plugins/inline-code/inline-code.component.mjs} +23 -23
  163. package/{esm2015/plugins/inline-code/inline-code.editor.js → esm2020/plugins/inline-code/inline-code.editor.mjs} +48 -49
  164. package/{esm2015/plugins/inline-code/inline-code.plugin.js → esm2020/plugins/inline-code/inline-code.plugin.mjs} +65 -65
  165. package/esm2020/plugins/link/edit/link-edit.component.mjs +105 -0
  166. package/esm2020/plugins/link/hover/link-hover.component.mjs +36 -0
  167. package/{esm2015/plugins/link/link.component.js → esm2020/plugins/link/link.component.mjs} +164 -164
  168. package/{esm2015/plugins/link/link.editor.js → esm2020/plugins/link/link.editor.mjs} +66 -66
  169. package/{esm2015/plugins/link/link.plugin.js → esm2020/plugins/link/link.plugin.mjs} +58 -58
  170. package/{esm2015/plugins/link/link.types.js → esm2020/plugins/link/link.types.mjs} +12 -12
  171. package/esm2020/plugins/list/components/bulleted-list.component.mjs +33 -0
  172. package/esm2020/plugins/list/components/list-item.component.mjs +93 -0
  173. package/esm2020/plugins/list/components/numbered-list.component.mjs +39 -0
  174. package/{esm2015/plugins/list/list.editor.js → esm2020/plugins/list/list.editor.mjs} +125 -125
  175. package/esm2020/plugins/list/list.plugin.mjs +286 -0
  176. package/{esm2015/plugins/list/normalizers/get-list-normalizer.js → esm2020/plugins/list/normalizers/get-list-normalizer.mjs} +39 -39
  177. package/esm2020/plugins/list/normalizers/normalize-list-item.mjs +18 -0
  178. package/{esm2015/plugins/list/normalizers/normalize-no.js → esm2020/plugins/list/normalizers/normalize-no.mjs} +42 -42
  179. package/{esm2015/plugins/list/on-key-down-list.js → esm2020/plugins/list/on-key-down-list.mjs} +32 -32
  180. package/{esm2015/plugins/list/queries/get-list-item-entry.js → esm2020/plugins/list/queries/get-list-item-entry.mjs} +27 -27
  181. package/{esm2015/plugins/list/queries/get-list-item-sublist.js → esm2020/plugins/list/queries/get-list-item-sublist.mjs} +12 -12
  182. package/{esm2015/plugins/list/queries/get-list-types.js → esm2020/plugins/list/queries/get-list-types.mjs} +5 -5
  183. package/{esm2015/plugins/list/queries/get-start-list-item.js → esm2020/plugins/list/queries/get-start-list-item.mjs} +26 -26
  184. package/{esm2015/plugins/list/queries/has-list-in-list-item.js → esm2020/plugins/list/queries/has-list-in-list-item.mjs} +27 -27
  185. package/{esm2015/plugins/list/queries/is-in-list.js → esm2020/plugins/list/queries/is-in-list.mjs} +5 -5
  186. package/{esm2015/plugins/list/queries/is-list-nested.js → esm2020/plugins/list/queries/is-list-nested.mjs} +10 -10
  187. package/{esm2015/plugins/list/queries/is-list.js → esm2020/plugins/list/queries/is-list.mjs} +5 -5
  188. package/{esm2015/plugins/list/queries/is-node-type-list.js → esm2020/plugins/list/queries/is-node-type-list.mjs} +4 -4
  189. package/{esm2015/plugins/list/queries/is-selection-at-list-item-start.js → esm2020/plugins/list/queries/is-selection-at-list-item-start.mjs} +12 -12
  190. package/{esm2015/plugins/list/queries/is-selection-in-same-list-item.js → esm2020/plugins/list/queries/is-selection-in-same-list-item.mjs} +16 -16
  191. package/{esm2015/plugins/list/queries/is-single-list-item.js → esm2020/plugins/list/queries/is-single-list-item.mjs} +9 -9
  192. package/{esm2015/plugins/list/transforms/insert-list-data.js → esm2020/plugins/list/transforms/insert-list-data.mjs} +71 -71
  193. package/{esm2015/plugins/list/transforms/insert-list-item.js → esm2020/plugins/list/transforms/insert-list-item.mjs} +72 -72
  194. package/{esm2015/plugins/list/transforms/move-list-item-down.js → esm2020/plugins/list/transforms/move-list-item-down.mjs} +41 -41
  195. package/{esm2015/plugins/list/transforms/move-list-item-sublist-items-to-list-item-sublist.js → esm2020/plugins/list/transforms/move-list-item-sublist-items-to-list-item-sublist.mjs} +42 -42
  196. package/{esm2015/plugins/list/transforms/move-list-item-sublist-items-to-list.js → esm2020/plugins/list/transforms/move-list-item-sublist-items-to-list.mjs} +29 -29
  197. package/{esm2015/plugins/list/transforms/move-list-item-up.js → esm2020/plugins/list/transforms/move-list-item-up.mjs} +77 -77
  198. package/{esm2015/plugins/list/transforms/unwrap-list.js → esm2020/plugins/list/transforms/unwrap-list.mjs} +9 -9
  199. package/esm2020/plugins/list/types.mjs +2 -0
  200. package/esm2020/plugins/mark/mark.editor.mjs +28 -0
  201. package/esm2020/plugins/mark/mark.plugin.mjs +105 -0
  202. package/esm2020/plugins/node-id/node-id.plugin.mjs +78 -0
  203. package/esm2020/plugins/normalizers/insert-paragraph-nodes.mjs +28 -0
  204. package/{esm2015/plugins/normalizers/remove-empty-nodes.js → esm2020/plugins/normalizers/remove-empty-nodes.mjs} +17 -17
  205. package/esm2020/plugins/normalizers/trailing-node.plugin.mjs +33 -0
  206. package/{esm2015/plugins/paint-format/paint-format.editor.js → esm2020/plugins/paint-format/paint-format.editor.mjs} +122 -122
  207. package/{esm2015/plugins/public-api.js → esm2020/plugins/public-api.mjs} +15 -15
  208. package/esm2020/plugins/quick-insert/components/quick-insert.component.mjs +96 -0
  209. package/esm2020/plugins/quick-insert/components/quick-toolbar/quick-toolbar.component.mjs +80 -0
  210. package/{esm2015/plugins/quick-insert/quick-insert.editor.js → esm2020/plugins/quick-insert/quick-insert.editor.mjs} +52 -52
  211. package/esm2020/plugins/quick-insert/quick-insert.plugin.mjs +74 -0
  212. package/esm2020/plugins/soft-break/soft-break.plugin.mjs +36 -0
  213. package/{esm2015/plugins/soft-break/soft-break.types.js → esm2020/plugins/soft-break/soft-break.types.mjs} +1 -1
  214. package/esm2020/plugins/table/components/insert-mark/insert-mark.component.mjs +100 -0
  215. package/{esm2015/plugins/table/components/row/row.component.js → esm2020/plugins/table/components/row/row.component.mjs} +47 -47
  216. package/esm2020/plugins/table/components/table.component.mjs +461 -0
  217. package/esm2020/plugins/table/components/td/td.component.mjs +696 -0
  218. package/{esm2015/plugins/table/components/toolbar/table-options.component.js → esm2020/plugins/table/components/toolbar/table-options.component.mjs} +72 -69
  219. package/esm2020/plugins/table/components/toolbar/table-toolbar.component.mjs +159 -0
  220. package/{esm2015/plugins/table/table.editor.js → esm2020/plugins/table/table.editor.mjs} +182 -182
  221. package/esm2020/plugins/table/table.plugin.mjs +427 -0
  222. package/{esm2015/plugins/table/table.service.js → esm2020/plugins/table/table.service.mjs} +103 -103
  223. package/esm2020/plugins/table/table.store.mjs +484 -0
  224. package/{esm2015/plugins/table/table.types.js → esm2020/plugins/table/table.types.mjs} +33 -33
  225. package/esm2020/plugins/table/toolbar-item.component.mjs +85 -0
  226. package/esm2020/plugins/table/transforms/clear-cell.mjs +14 -0
  227. package/{esm2015/plugins/table/transforms/clear-table-node.js → esm2020/plugins/table/transforms/clear-table-node.mjs} +27 -27
  228. package/{esm2015/plugins/table/transforms/insert-column.js → esm2020/plugins/table/transforms/insert-column.mjs} +57 -57
  229. package/{esm2015/plugins/table/transforms/insert-row.js → esm2020/plugins/table/transforms/insert-row.mjs} +42 -42
  230. package/esm2020/plugins/table/transforms/insert-table.mjs +15 -0
  231. package/{esm2015/plugins/table/transforms/remove-column.js → esm2020/plugins/table/transforms/remove-column.mjs} +51 -51
  232. package/{esm2015/plugins/table/transforms/remove-row.js → esm2020/plugins/table/transforms/remove-row.mjs} +50 -50
  233. package/{esm2015/plugins/table/transforms/remove-table.js → esm2020/plugins/table/transforms/remove-table.mjs} +49 -49
  234. package/{esm2015/plugins/table/utils/add-columns.js → esm2020/plugins/table/utils/add-columns.mjs} +28 -28
  235. package/{esm2015/plugins/table/utils/calc-anchor-position.js → esm2020/plugins/table/utils/calc-anchor-position.mjs} +24 -24
  236. package/{esm2015/plugins/table/utils/calc-span.js → esm2020/plugins/table/utils/calc-span.mjs} +72 -72
  237. package/{esm2015/plugins/table/utils/create-cell.js → esm2020/plugins/table/utils/create-cell.mjs} +19 -19
  238. package/{esm2015/plugins/table/utils/create-row.js → esm2020/plugins/table/utils/create-row.mjs} +12 -12
  239. package/{esm2015/plugins/table/utils/create-table.js → esm2020/plugins/table/utils/create-table.mjs} +13 -13
  240. package/{esm2015/plugins/table/utils/get-base-height.js → esm2020/plugins/table/utils/get-base-height.mjs} +22 -22
  241. package/{esm2015/plugins/table/utils/get-select-cell-node.js → esm2020/plugins/table/utils/get-select-cell-node.mjs} +19 -16
  242. package/{esm2015/plugins/table/utils/index.js → esm2020/plugins/table/utils/index.mjs} +8 -8
  243. package/{esm2015/plugins/table/utils/is-range-in-table.js → esm2020/plugins/table/utils/is-range-in-table.mjs} +16 -16
  244. package/{esm2015/plugins/table/utils/is-selection-in-table.js → esm2020/plugins/table/utils/is-selection-in-table.mjs} +11 -11
  245. package/{esm2015/plugins/table/utils/is-virtual-key.js → esm2020/plugins/table/utils/is-virtual-key.mjs} +13 -13
  246. package/{esm2015/plugins/table/utils/merge-cell.js → esm2020/plugins/table/utils/merge-cell.mjs} +90 -90
  247. package/{esm2015/plugins/table/utils/next-path.js → esm2020/plugins/table/utils/next-path.mjs} +5 -5
  248. package/{esm2015/plugins/table/utils/normalize-table.js → esm2020/plugins/table/utils/normalize-table.mjs} +30 -30
  249. package/{esm2015/plugins/table/utils/remove-columns.js → esm2020/plugins/table/utils/remove-columns.mjs} +23 -23
  250. package/{esm2015/plugins/table/utils/set-menu-cell-invisibility.js → esm2020/plugins/table/utils/set-menu-cell-invisibility.mjs} +15 -15
  251. package/{esm2015/plugins/table/utils/split-cell.js → esm2020/plugins/table/utils/split-cell.mjs} +31 -31
  252. package/{esm2015/plugins/table/utils/table-position.js → esm2020/plugins/table/utils/table-position.mjs} +242 -242
  253. package/esm2020/plugins/todo-item/todo-item.component.mjs +64 -0
  254. package/{esm2015/plugins/todo-item/todo-item.editor.js → esm2020/plugins/todo-item/todo-item.editor.mjs} +31 -31
  255. package/{esm2015/plugins/todo-item/todo-item.plugin.js → esm2020/plugins/todo-item/todo-item.plugin.mjs} +78 -78
  256. package/esm2020/plugins/vertical-align/toolbar-item.component.mjs +83 -0
  257. package/{esm2015/plugins/vertical-align/vertical-align.editor.js → esm2020/plugins/vertical-align/vertical-align.editor.mjs} +54 -54
  258. package/{esm2015/public-api.js → esm2020/public-api.mjs} +23 -23
  259. package/{esm2015/queries/anchor-block-entry.js → esm2020/queries/anchor-block-entry.mjs} +13 -13
  260. package/{esm2015/queries/anchor-block.js → esm2020/queries/anchor-block.mjs} +6 -6
  261. package/{esm2015/queries/anchor-inline-entry.js → esm2020/queries/anchor-inline-entry.mjs} +10 -10
  262. package/{esm2015/queries/find-descendant.js → esm2020/queries/find-descendant.mjs} +47 -47
  263. package/{esm2015/queries/find-node.js → esm2020/queries/find-node.mjs} +45 -45
  264. package/{esm2015/queries/find-path.js → esm2020/queries/find-path.mjs} +28 -28
  265. package/esm2020/queries/get-above-by-type.mjs +14 -0
  266. package/{esm2015/queries/get-above.js → esm2020/queries/get-above.mjs} +9 -9
  267. package/{esm2015/queries/get-anchor-block-entry.js → esm2020/queries/get-anchor-block-entry.mjs} +8 -8
  268. package/esm2020/queries/get-block-above.mjs +10 -0
  269. package/esm2020/queries/get-block-card-above.mjs +10 -0
  270. package/{esm2015/queries/get-block-card-cursor.js → esm2020/queries/get-block-card-cursor.mjs} +5 -5
  271. package/{esm2015/queries/get-container-blocks.js → esm2020/queries/get-container-blocks.mjs} +11 -11
  272. package/{esm2015/queries/get-directly-parent.js → esm2020/queries/get-directly-parent.mjs} +11 -11
  273. package/{esm2015/queries/get-insert-elements-path.js → esm2020/queries/get-insert-elements-path.mjs} +43 -43
  274. package/{esm2015/queries/get-last-child-path.js → esm2020/queries/get-last-child-path.mjs} +9 -9
  275. package/{esm2015/queries/get-last-node.js → esm2020/queries/get-last-node.mjs} +17 -17
  276. package/{esm2015/queries/get-next-sibling-nodes.js → esm2020/queries/get-next-sibling-nodes.mjs} +17 -17
  277. package/{esm2015/queries/get-node.js → esm2020/queries/get-node.mjs} +10 -10
  278. package/esm2020/queries/get-nodes-by-type.mjs +15 -0
  279. package/{esm2015/queries/get-nodes.js → esm2020/queries/get-nodes.mjs} +7 -7
  280. package/{esm2015/queries/get-parent.js → esm2020/queries/get-parent.mjs} +12 -12
  281. package/esm2020/queries/get-plain-text.mjs +16 -0
  282. package/{esm2015/queries/get-plugin-by-toolbar.js → esm2020/queries/get-plugin-by-toolbar.mjs} +12 -12
  283. package/{esm2015/queries/get-point-before.js → esm2020/queries/get-point-before.mjs} +62 -62
  284. package/{esm2015/queries/get-point-from-location.js → esm2020/queries/get-point-from-location.mjs} +15 -15
  285. package/{esm2015/queries/get-previous-path.js → esm2020/queries/get-previous-path.mjs} +9 -9
  286. package/{esm2015/queries/get-rang-from-block-start.js → esm2020/queries/get-rang-from-block-start.mjs} +16 -16
  287. package/{esm2015/queries/get-range-before.js → esm2020/queries/get-range-before.mjs} +17 -17
  288. package/esm2020/queries/get-selection-marks.mjs +18 -0
  289. package/{esm2015/queries/get-selection-nodes-by-type.js → esm2020/queries/get-selection-nodes-by-type.mjs} +29 -29
  290. package/{esm2015/queries/get-text.js → esm2020/queries/get-text.mjs} +9 -9
  291. package/esm2020/queries/get-toolbar-disabled.mjs +13 -0
  292. package/{esm2015/queries/index.js → esm2020/queries/index.mjs} +58 -58
  293. package/{esm2015/queries/is-across-blocks.js → esm2020/queries/is-across-blocks.mjs} +7 -7
  294. package/{esm2015/queries/is-ancestor-empty.js → esm2020/queries/is-ancestor-empty.mjs} +6 -6
  295. package/{esm2015/queries/is-ancestor.js → esm2020/queries/is-ancestor.mjs} +3 -3
  296. package/{esm2015/queries/is-block-above-empty.js → esm2020/queries/is-block-above-empty.mjs} +11 -11
  297. package/{esm2015/queries/is-block-active.js → esm2020/queries/is-block-active.mjs} +7 -7
  298. package/{esm2015/queries/is-block-card-cursor.js → esm2020/queries/is-block-card-cursor.mjs} +4 -4
  299. package/{esm2015/queries/is-block-text-empty-after-selection.js → esm2020/queries/is-block-text-empty-after-selection.mjs} +31 -31
  300. package/{esm2015/queries/is-collapsed.js → esm2020/queries/is-collapsed.mjs} +7 -7
  301. package/{esm2015/queries/is-contain-nested-type.js → esm2020/queries/is-contain-nested-type.mjs} +28 -28
  302. package/{esm2015/queries/is-container-type.js → esm2020/queries/is-container-type.mjs} +2 -2
  303. package/{esm2015/queries/is-descendant.js → esm2020/queries/is-descendant.mjs} +3 -3
  304. package/{esm2015/queries/is-empty-content.js → esm2020/queries/is-empty-content.mjs} +14 -14
  305. package/{esm2015/queries/is-empty-paragraph-by-path.js → esm2020/queries/is-empty-paragraph-by-path.mjs} +7 -7
  306. package/{esm2015/queries/is-empty-paragraph.js → esm2020/queries/is-empty-paragraph.mjs} +11 -11
  307. package/{esm2015/queries/is-first-child.js → esm2020/queries/is-first-child.mjs} +5 -5
  308. package/{esm2015/queries/is-include-types.js → esm2020/queries/is-include-types.mjs} +11 -11
  309. package/{esm2015/queries/is-node-type-in.js → esm2020/queries/is-node-type-in.mjs} +9 -9
  310. package/{esm2015/queries/is-node-type.js → esm2020/queries/is-node-type.mjs} +15 -15
  311. package/{esm2015/queries/is-paragraph.js → esm2020/queries/is-paragraph.mjs} +9 -9
  312. package/{esm2015/queries/is-point-at-root.js → esm2020/queries/is-point-at-root.mjs} +2 -2
  313. package/esm2020/queries/is-range-across-blocks.mjs +22 -0
  314. package/{esm2015/queries/is-range-at-root.js → esm2020/queries/is-range-at-root.mjs} +3 -3
  315. package/{esm2015/queries/is-start.js → esm2020/queries/is-start.mjs} +6 -6
  316. package/{esm2015/queries/some-node.js → esm2020/queries/some-node.mjs} +9 -9
  317. package/{esm2015/services/color-select.service.js → esm2020/services/color-select.service.mjs} +50 -50
  318. package/esm2020/services/context.service.mjs +59 -0
  319. package/{esm2015/services/table-contextmenu.service.js → esm2020/services/table-contextmenu.service.mjs} +190 -190
  320. package/esm2020/services/toolbar.service.mjs +48 -0
  321. package/{esm2015/shortcuts/index.js → esm2020/shortcuts/index.mjs} +5 -5
  322. package/{esm2015/shortcuts/mark.js → esm2020/shortcuts/mark.mjs} +24 -24
  323. package/{esm2015/transforms/apply-deep-to-nodes.js → esm2020/transforms/apply-deep-to-nodes.mjs} +21 -21
  324. package/{esm2015/transforms/clear-marks.js → esm2020/transforms/clear-marks.mjs} +23 -23
  325. package/{esm2015/transforms/close-conversion-hint.js → esm2020/transforms/close-conversion-hint.mjs} +8 -8
  326. package/{esm2015/transforms/delete-element.js → esm2020/transforms/delete-element.mjs} +11 -11
  327. package/{esm2015/transforms/handle-continual-delete-backward.js → esm2020/transforms/handle-continual-delete-backward.mjs} +17 -17
  328. package/{esm2015/transforms/handle-continual-insert-break.js → esm2020/transforms/handle-continual-insert-break.mjs} +19 -19
  329. package/{esm2015/transforms/index.js → esm2020/transforms/index.mjs} +18 -18
  330. package/esm2020/transforms/insert-elements.mjs +34 -0
  331. package/{esm2015/transforms/insert-paragraph.js → esm2020/transforms/insert-paragraph.mjs} +6 -6
  332. package/esm2020/transforms/merge-deep-to-nodes.mjs +9 -0
  333. package/{esm2015/transforms/move-children.js → esm2020/transforms/move-children.mjs} +21 -21
  334. package/{esm2015/transforms/on-keydown-reset-block-type.js → esm2020/transforms/on-keydown-reset-block-type.mjs} +22 -22
  335. package/{esm2015/transforms/set-end-selection.js → esm2020/transforms/set-end-selection.mjs} +10 -10
  336. package/{esm2015/transforms/set-marks.js → esm2020/transforms/set-marks.mjs} +9 -9
  337. package/{esm2015/transforms/set-node.js → esm2020/transforms/set-node.mjs} +5 -5
  338. package/{esm2015/transforms/split-node.js → esm2020/transforms/split-node.mjs} +31 -31
  339. package/{esm2015/transforms/un-hang-range.js → esm2020/transforms/un-hang-range.mjs} +11 -11
  340. package/{esm2015/transforms/un-wrap.js → esm2020/transforms/un-wrap.mjs} +11 -11
  341. package/esm2020/transforms/unwrap-nodes-by-type.mjs +14 -0
  342. package/{esm2015/utils/auto-focus.js → esm2020/utils/auto-focus.mjs} +13 -13
  343. package/{esm2015/utils/auto-scroll-view.js → esm2020/utils/auto-scroll-view.mjs} +24 -24
  344. package/{esm2015/utils/cast-array.js → esm2020/utils/cast-array.mjs} +7 -7
  345. package/{esm2015/utils/common.js → esm2020/utils/common.mjs} +2 -2
  346. package/{esm2015/utils/create-empty-paragraph.js → esm2020/utils/create-empty-paragraph.mjs} +14 -14
  347. package/{esm2015/utils/data-transform.js → esm2020/utils/data-transform.mjs} +48 -48
  348. package/{esm2015/utils/dom.js → esm2020/utils/dom.mjs} +46 -46
  349. package/{esm2015/utils/editor-uuid.js → esm2020/utils/editor-uuid.mjs} +8 -8
  350. package/{esm2015/utils/fragment.js → esm2020/utils/fragment.mjs} +65 -65
  351. package/{esm2015/utils/get-editable-element-height.js → esm2020/utils/get-editable-element-height.mjs} +6 -6
  352. package/{esm2015/utils/get-toolbar-class.js → esm2020/utils/get-toolbar-class.mjs} +6 -6
  353. package/{esm2015/utils/id-creator.js → esm2020/utils/id-creator.mjs} +11 -11
  354. package/{esm2015/utils/index.js → esm2020/utils/index.mjs} +13 -13
  355. package/{esm2015/utils/is-clean-empty-paragraph.js → esm2020/utils/is-clean-empty-paragraph.mjs} +36 -36
  356. package/esm2020/utils/is-inline.mjs +9 -0
  357. package/{esm2015/utils/lodash.js → esm2020/utils/lodash.mjs} +3 -3
  358. package/esm2020/utils/match.mjs +32 -0
  359. package/{esm2015/utils/merge-element-options.js → esm2020/utils/merge-element-options.mjs} +19 -19
  360. package/{esm2015/utils/weak-maps.js → esm2020/utils/weak-maps.mjs} +3 -3
  361. package/{esm2015/worktile-theia.js → esm2020/worktile-theia.mjs} +4 -4
  362. package/fesm2015/{worktile-theia.js → worktile-theia.mjs} +13096 -13169
  363. package/fesm2015/worktile-theia.mjs.map +1 -0
  364. package/fesm2020/worktile-theia.mjs +13739 -0
  365. package/fesm2020/worktile-theia.mjs.map +1 -0
  366. package/interfaces/auto-format.d.ts +64 -64
  367. package/interfaces/editor.d.ts +146 -146
  368. package/interfaces/element.d.ts +9 -9
  369. package/interfaces/image.d.ts +25 -25
  370. package/interfaces/index.d.ts +8 -8
  371. package/interfaces/plugins/index.d.ts +4 -4
  372. package/interfaces/plugins/no-infer.d.ts +1 -1
  373. package/interfaces/plugins/plugin-key.d.ts +48 -48
  374. package/interfaces/plugins/plugins.d.ts +45 -45
  375. package/interfaces/plugins/with-override.d.ts +7 -7
  376. package/interfaces/reset-block-type-plugin-options.d.ts +23 -23
  377. package/interfaces/toolbar.d.ts +64 -64
  378. package/interfaces/upload.d.ts +11 -11
  379. package/interfaces/utility/index.d.ts +3 -3
  380. package/interfaces/utility/nested-structure-by-key.d.ts +3 -3
  381. package/interfaces/utility/override-by-key.d.ts +3 -3
  382. package/interfaces/utility/types.d.ts +1 -1
  383. package/interfaces/valid-children-types.d.ts +9 -9
  384. package/interfaces/view-base.d.ts +9 -9
  385. package/package.json +19 -6
  386. package/pipes.d.ts +16 -16
  387. package/plugins/align/align.editor.d.ts +7 -7
  388. package/plugins/align/align.plugin.d.ts +2 -2
  389. package/plugins/autoformat/autoformat.plugin.d.ts +6 -6
  390. package/plugins/autoformat/transforms/auto-format-block.d.ts +5 -5
  391. package/plugins/autoformat/transforms/auto-format-inline.d.ts +9 -9
  392. package/plugins/blockquote/blockquote.component.d.ts +11 -11
  393. package/plugins/blockquote/blockquote.editor.d.ts +4 -4
  394. package/plugins/blockquote/blockquote.plugin.d.ts +2 -2
  395. package/plugins/code/code.component.d.ts +65 -65
  396. package/plugins/code/code.editor.d.ts +8 -8
  397. package/plugins/code/code.plugin.d.ts +2 -2
  398. package/plugins/color/color.editor.d.ts +8 -8
  399. package/plugins/color/color.plugin.d.ts +1 -1
  400. package/plugins/color/toolbar-item.component.d.ts +16 -16
  401. package/plugins/common/auto-insert-data..d.ts +2 -2
  402. package/plugins/common/block-card.plugin.d.ts +2 -2
  403. package/plugins/common/get-fragment.plugin.d.ts +6 -6
  404. package/plugins/common/history.plugin.d.ts +9 -9
  405. package/plugins/common/move-selection.plugin.d.ts +2 -2
  406. package/plugins/common/remove-empty.plugin.d.ts +2 -2
  407. package/plugins/common/remove-void.plugin.d.ts +2 -2
  408. package/plugins/common/reset-type.plugin.d.ts +2 -2
  409. package/plugins/common/transforms.plugin.d.ts +8 -8
  410. package/plugins/deserializers/deserialize-html.plugin.d.ts +2 -2
  411. package/plugins/deserializers/deserialize-md.plugin.d.ts +2 -2
  412. package/plugins/font-size/font-size.editor.d.ts +10 -10
  413. package/plugins/heading/heading.editor.d.ts +9 -9
  414. package/plugins/heading/heading.plugin.d.ts +7 -7
  415. package/plugins/hr/hr.component.d.ts +12 -12
  416. package/plugins/hr/hr.editor.d.ts +4 -4
  417. package/plugins/hr/hr.plugin.d.ts +2 -2
  418. package/plugins/image/image.component.d.ts +74 -74
  419. package/plugins/image/image.editor.d.ts +12 -12
  420. package/plugins/image/image.plugin.d.ts +7 -7
  421. package/plugins/indent/indent.editor.d.ts +10 -10
  422. package/plugins/indent/indent.plugin.d.ts +8 -8
  423. package/plugins/indent/on-keydown-indent.d.ts +3 -3
  424. package/plugins/index.d.ts +1 -1
  425. package/plugins/inline-code/inline-code.component.d.ts +9 -9
  426. package/plugins/inline-code/inline-code.editor.d.ts +7 -7
  427. package/plugins/inline-code/inline-code.plugin.d.ts +2 -2
  428. package/plugins/link/edit/link-edit.component.d.ts +36 -36
  429. package/plugins/link/hover/link-hover.component.d.ts +15 -15
  430. package/plugins/link/link.component.d.ts +39 -39
  431. package/plugins/link/link.editor.d.ts +7 -7
  432. package/plugins/link/link.plugin.d.ts +2 -2
  433. package/plugins/link/link.types.d.ts +9 -9
  434. package/plugins/list/components/bulleted-list.component.d.ts +15 -15
  435. package/plugins/list/components/list-item.component.d.ts +20 -20
  436. package/plugins/list/components/numbered-list.component.d.ts +16 -16
  437. package/plugins/list/list.editor.d.ts +12 -12
  438. package/plugins/list/list.plugin.d.ts +3 -3
  439. package/plugins/list/normalizers/get-list-normalizer.d.ts +6 -6
  440. package/plugins/list/normalizers/normalize-list-item.d.ts +5 -5
  441. package/plugins/list/normalizers/normalize-no.d.ts +2 -2
  442. package/plugins/list/on-key-down-list.d.ts +2 -2
  443. package/plugins/list/queries/get-list-item-entry.d.ts +10 -10
  444. package/plugins/list/queries/get-list-item-sublist.d.ts +6 -6
  445. package/plugins/list/queries/get-list-types.d.ts +2 -2
  446. package/plugins/list/queries/get-start-list-item.d.ts +8 -8
  447. package/plugins/list/queries/has-list-in-list-item.d.ts +15 -15
  448. package/plugins/list/queries/is-in-list.d.ts +2 -2
  449. package/plugins/list/queries/is-list-nested.d.ts +5 -5
  450. package/plugins/list/queries/is-list.d.ts +2 -2
  451. package/plugins/list/queries/is-node-type-list.d.ts +2 -2
  452. package/plugins/list/queries/is-selection-at-list-item-start.d.ts +5 -5
  453. package/plugins/list/queries/is-selection-in-same-list-item.d.ts +5 -5
  454. package/plugins/list/queries/is-single-list-item.d.ts +5 -5
  455. package/plugins/list/transforms/insert-list-data.d.ts +12 -12
  456. package/plugins/list/transforms/insert-list-item.d.ts +5 -5
  457. package/plugins/list/transforms/move-list-item-down.d.ts +6 -6
  458. package/plugins/list/transforms/move-list-item-sublist-items-to-list-item-sublist.d.ts +20 -20
  459. package/plugins/list/transforms/move-list-item-sublist-items-to-list.d.ts +19 -19
  460. package/plugins/list/transforms/move-list-item-up.d.ts +10 -10
  461. package/plugins/list/transforms/unwrap-list.d.ts +2 -2
  462. package/plugins/list/types.d.ts +7 -7
  463. package/plugins/mark/mark.editor.d.ts +8 -8
  464. package/plugins/mark/mark.plugin.d.ts +3 -3
  465. package/plugins/node-id/node-id.plugin.d.ts +8 -8
  466. package/plugins/normalizers/insert-paragraph-nodes.d.ts +7 -7
  467. package/plugins/normalizers/remove-empty-nodes.d.ts +7 -7
  468. package/plugins/normalizers/trailing-node.plugin.d.ts +9 -9
  469. package/plugins/paint-format/paint-format.editor.d.ts +8 -8
  470. package/plugins/public-api.d.ts +15 -15
  471. package/plugins/quick-insert/components/quick-insert.component.d.ts +28 -28
  472. package/plugins/quick-insert/components/quick-toolbar/quick-toolbar.component.d.ts +28 -28
  473. package/plugins/quick-insert/quick-insert.editor.d.ts +7 -7
  474. package/plugins/quick-insert/quick-insert.plugin.d.ts +10 -10
  475. package/plugins/soft-break/soft-break.plugin.d.ts +5 -5
  476. package/plugins/soft-break/soft-break.types.d.ts +8 -8
  477. package/plugins/table/components/insert-mark/insert-mark.component.d.ts +24 -24
  478. package/plugins/table/components/row/row.component.d.ts +14 -14
  479. package/plugins/table/components/table.component.d.ts +79 -79
  480. package/plugins/table/components/td/td.component.d.ts +95 -95
  481. package/plugins/table/components/toolbar/table-options.component.d.ts +20 -20
  482. package/plugins/table/components/toolbar/table-toolbar.component.d.ts +38 -38
  483. package/plugins/table/table.editor.d.ts +25 -25
  484. package/plugins/table/table.plugin.d.ts +3 -3
  485. package/plugins/table/table.service.d.ts +30 -30
  486. package/plugins/table/table.store.d.ts +71 -71
  487. package/plugins/table/table.types.d.ts +67 -67
  488. package/plugins/table/toolbar-item.component.d.ts +17 -17
  489. package/plugins/table/transforms/clear-cell.d.ts +6 -6
  490. package/plugins/table/transforms/clear-table-node.d.ts +6 -6
  491. package/plugins/table/transforms/insert-column.d.ts +12 -12
  492. package/plugins/table/transforms/insert-row.d.ts +6 -6
  493. package/plugins/table/transforms/insert-table.d.ts +6 -6
  494. package/plugins/table/transforms/remove-column.d.ts +3 -3
  495. package/plugins/table/transforms/remove-row.d.ts +3 -3
  496. package/plugins/table/transforms/remove-table.d.ts +3 -3
  497. package/plugins/table/utils/add-columns.d.ts +2 -2
  498. package/plugins/table/utils/calc-anchor-position.d.ts +6 -6
  499. package/plugins/table/utils/calc-span.d.ts +11 -11
  500. package/plugins/table/utils/create-cell.d.ts +16 -16
  501. package/plugins/table/utils/create-row.d.ts +7 -7
  502. package/plugins/table/utils/create-table.d.ts +7 -7
  503. package/plugins/table/utils/get-base-height.d.ts +9 -9
  504. package/plugins/table/utils/get-select-cell-node.d.ts +7 -7
  505. package/plugins/table/utils/index.d.ts +7 -7
  506. package/plugins/table/utils/is-range-in-table.d.ts +6 -6
  507. package/plugins/table/utils/is-selection-in-table.d.ts +6 -6
  508. package/plugins/table/utils/is-virtual-key.d.ts +1 -1
  509. package/plugins/table/utils/merge-cell.d.ts +21 -21
  510. package/plugins/table/utils/next-path.d.ts +2 -2
  511. package/plugins/table/utils/normalize-table.d.ts +2 -2
  512. package/plugins/table/utils/remove-columns.d.ts +2 -2
  513. package/plugins/table/utils/set-menu-cell-invisibility.d.ts +3 -3
  514. package/plugins/table/utils/split-cell.d.ts +4 -4
  515. package/plugins/table/utils/table-position.d.ts +97 -97
  516. package/plugins/todo-item/todo-item.component.d.ts +21 -21
  517. package/plugins/todo-item/todo-item.editor.d.ts +5 -5
  518. package/plugins/todo-item/todo-item.plugin.d.ts +5 -5
  519. package/plugins/vertical-align/toolbar-item.component.d.ts +25 -25
  520. package/plugins/vertical-align/vertical-align.editor.d.ts +7 -7
  521. package/public-api.d.ts +20 -20
  522. package/queries/anchor-block-entry.d.ts +2 -2
  523. package/queries/anchor-block.d.ts +2 -2
  524. package/queries/anchor-inline-entry.d.ts +2 -2
  525. package/queries/find-descendant.d.ts +10 -10
  526. package/queries/find-node.d.ts +15 -15
  527. package/queries/find-path.d.ts +6 -6
  528. package/queries/get-above-by-type.d.ts +6 -6
  529. package/queries/get-above.d.ts +6 -6
  530. package/queries/get-anchor-block-entry.d.ts +2 -2
  531. package/queries/get-block-above.d.ts +7 -7
  532. package/queries/get-block-card-above.d.ts +7 -7
  533. package/queries/get-block-card-cursor.d.ts +2 -2
  534. package/queries/get-container-blocks.d.ts +2 -2
  535. package/queries/get-directly-parent.d.ts +2 -2
  536. package/queries/get-insert-elements-path.d.ts +7 -7
  537. package/queries/get-last-child-path.d.ts +6 -6
  538. package/queries/get-last-node.d.ts +2 -2
  539. package/queries/get-next-sibling-nodes.d.ts +7 -7
  540. package/queries/get-node.d.ts +2 -2
  541. package/queries/get-nodes-by-type.d.ts +6 -6
  542. package/queries/get-nodes.d.ts +4 -4
  543. package/queries/get-parent.d.ts +7 -7
  544. package/queries/get-plain-text.d.ts +6 -6
  545. package/queries/get-plugin-by-toolbar.d.ts +3 -3
  546. package/queries/get-point-before.d.ts +38 -38
  547. package/queries/get-point-from-location.d.ts +5 -5
  548. package/queries/get-previous-path.d.ts +2 -2
  549. package/queries/get-rang-from-block-start.d.ts +9 -9
  550. package/queries/get-range-before.d.ts +7 -7
  551. package/queries/get-selection-marks.d.ts +12 -12
  552. package/queries/get-selection-nodes-by-type.d.ts +3 -3
  553. package/queries/get-text.d.ts +6 -6
  554. package/queries/get-toolbar-disabled.d.ts +4 -4
  555. package/queries/index.d.ts +58 -58
  556. package/queries/is-across-blocks.d.ts +2 -2
  557. package/queries/is-ancestor-empty.d.ts +5 -5
  558. package/queries/is-ancestor.d.ts +2 -2
  559. package/queries/is-block-above-empty.d.ts +5 -5
  560. package/queries/is-block-active.d.ts +3 -3
  561. package/queries/is-block-card-cursor.d.ts +2 -2
  562. package/queries/is-block-text-empty-after-selection.d.ts +7 -7
  563. package/queries/is-collapsed.d.ts +6 -6
  564. package/queries/is-contain-nested-type.d.ts +2 -2
  565. package/queries/is-container-type.d.ts +2 -2
  566. package/queries/is-descendant.d.ts +2 -2
  567. package/queries/is-empty-content.d.ts +2 -2
  568. package/queries/is-empty-paragraph-by-path.d.ts +2 -2
  569. package/queries/is-empty-paragraph.d.ts +2 -2
  570. package/queries/is-first-child.d.ts +5 -5
  571. package/queries/is-include-types.d.ts +3 -3
  572. package/queries/is-node-type-in.d.ts +6 -6
  573. package/queries/is-node-type.d.ts +6 -6
  574. package/queries/is-paragraph.d.ts +2 -2
  575. package/queries/is-point-at-root.d.ts +2 -2
  576. package/queries/is-range-across-blocks.d.ts +8 -8
  577. package/queries/is-range-at-root.d.ts +2 -2
  578. package/queries/is-start.d.ts +5 -5
  579. package/queries/some-node.d.ts +7 -7
  580. package/services/color-select.service.d.ts +20 -20
  581. package/services/context.service.d.ts +49 -49
  582. package/services/table-contextmenu.service.d.ts +25 -25
  583. package/services/toolbar.service.d.ts +9 -9
  584. package/shortcuts/index.d.ts +2 -2
  585. package/shortcuts/mark.d.ts +2 -2
  586. package/transforms/apply-deep-to-nodes.d.ts +12 -12
  587. package/transforms/clear-marks.d.ts +2 -2
  588. package/transforms/close-conversion-hint.d.ts +2 -2
  589. package/transforms/delete-element.d.ts +2 -2
  590. package/transforms/handle-continual-delete-backward.d.ts +3 -3
  591. package/transforms/handle-continual-insert-break.d.ts +3 -3
  592. package/transforms/index.d.ts +18 -18
  593. package/transforms/insert-elements.d.ts +2 -2
  594. package/transforms/insert-paragraph.d.ts +2 -2
  595. package/transforms/merge-deep-to-nodes.d.ts +5 -5
  596. package/transforms/move-children.d.ts +24 -24
  597. package/transforms/on-keydown-reset-block-type.d.ts +3 -3
  598. package/transforms/set-end-selection.d.ts +2 -2
  599. package/transforms/set-marks.d.ts +12 -12
  600. package/transforms/set-node.d.ts +2 -2
  601. package/transforms/split-node.d.ts +3 -3
  602. package/transforms/un-hang-range.d.ts +10 -10
  603. package/transforms/un-wrap.d.ts +3 -3
  604. package/transforms/unwrap-nodes-by-type.d.ts +6 -6
  605. package/utils/auto-focus.d.ts +2 -2
  606. package/utils/auto-scroll-view.d.ts +6 -6
  607. package/utils/cast-array.d.ts +1 -1
  608. package/utils/common.d.ts +2 -2
  609. package/utils/create-empty-paragraph.d.ts +2 -2
  610. package/utils/data-transform.d.ts +6 -6
  611. package/utils/dom.d.ts +10 -10
  612. package/utils/editor-uuid.d.ts +3 -3
  613. package/utils/fragment.d.ts +10 -10
  614. package/utils/get-editable-element-height.d.ts +2 -2
  615. package/utils/get-toolbar-class.d.ts +2 -2
  616. package/utils/id-creator.d.ts +1 -1
  617. package/utils/index.d.ts +13 -13
  618. package/utils/is-clean-empty-paragraph.d.ts +9 -9
  619. package/utils/is-inline.d.ts +2 -2
  620. package/utils/lodash.d.ts +1 -1
  621. package/utils/match.d.ts +18 -18
  622. package/utils/merge-element-options.d.ts +2 -2
  623. package/utils/weak-maps.d.ts +5 -5
  624. package/worktile-theia.d.ts +5 -5
  625. package/bundles/worktile-theia.umd.js +0 -14919
  626. package/bundles/worktile-theia.umd.js.map +0 -1
  627. package/esm2015/components/color-select/color-select.component.js +0 -113
  628. package/esm2015/components/column-resize/column-resize-notifier.js +0 -31
  629. package/esm2015/components/column-resize/column-resize.module.js +0 -34
  630. package/esm2015/components/contextmenu/contextmenu.component.js +0 -64
  631. package/esm2015/components/conversion-hint/conversion-hint.component.js +0 -59
  632. package/esm2015/components/element/element.component.js +0 -24
  633. package/esm2015/components/inline-toolbar/inline-toolbar.component.js +0 -139
  634. package/esm2015/components/table-select/table-select.component.js +0 -53
  635. package/esm2015/components/template/template.component.js +0 -66
  636. package/esm2015/components/toolbar/toolbar.component.js +0 -250
  637. package/esm2015/components/toolbar-dropdown/toolbar-dropdown.component.js +0 -133
  638. package/esm2015/components/toolbar-group/toolbar-group.component.js +0 -116
  639. package/esm2015/components/toolbar-item/toolbar-item.component.js +0 -105
  640. package/esm2015/core/create-toolbar.js +0 -57
  641. package/esm2015/core/toolbar-item/base-toolbar-item.js +0 -92
  642. package/esm2015/core/utils/get-plugin-options.js +0 -3
  643. package/esm2015/core/utils/get-plugins.js +0 -5
  644. package/esm2015/core/utils/merge-array.js +0 -18
  645. package/esm2015/editor.component.js +0 -440
  646. package/esm2015/interfaces/editor.js +0 -23
  647. package/esm2015/interfaces/reset-block-type-plugin-options.js +0 -2
  648. package/esm2015/interfaces/upload.js +0 -2
  649. package/esm2015/plugins/align/align.editor.js +0 -48
  650. package/esm2015/plugins/autoformat/autoformat.plugin.js +0 -110
  651. package/esm2015/plugins/blockquote/blockquote.editor.js +0 -21
  652. package/esm2015/plugins/code/code.component.js +0 -245
  653. package/esm2015/plugins/color/color.editor.js +0 -45
  654. package/esm2015/plugins/color/toolbar-item.component.js +0 -124
  655. package/esm2015/plugins/common/auto-insert-data..js +0 -78
  656. package/esm2015/plugins/common/get-fragment.plugin.js +0 -25
  657. package/esm2015/plugins/font-size/font-size.editor.js +0 -98
  658. package/esm2015/plugins/image/image.component.js +0 -370
  659. package/esm2015/plugins/image/image.plugin.js +0 -58
  660. package/esm2015/plugins/indent/indent.editor.js +0 -73
  661. package/esm2015/plugins/indent/indent.plugin.js +0 -60
  662. package/esm2015/plugins/link/edit/link-edit.component.js +0 -108
  663. package/esm2015/plugins/link/hover/link-hover.component.js +0 -39
  664. package/esm2015/plugins/list/components/bulleted-list.component.js +0 -34
  665. package/esm2015/plugins/list/components/list-item.component.js +0 -95
  666. package/esm2015/plugins/list/components/numbered-list.component.js +0 -40
  667. package/esm2015/plugins/list/list.plugin.js +0 -281
  668. package/esm2015/plugins/list/normalizers/normalize-list-item.js +0 -19
  669. package/esm2015/plugins/list/types.js +0 -2
  670. package/esm2015/plugins/mark/mark.editor.js +0 -29
  671. package/esm2015/plugins/mark/mark.plugin.js +0 -102
  672. package/esm2015/plugins/node-id/node-id.plugin.js +0 -69
  673. package/esm2015/plugins/normalizers/insert-paragraph-nodes.js +0 -29
  674. package/esm2015/plugins/normalizers/trailing-node.plugin.js +0 -34
  675. package/esm2015/plugins/quick-insert/components/quick-insert.component.js +0 -102
  676. package/esm2015/plugins/quick-insert/components/quick-toolbar/quick-toolbar.component.js +0 -84
  677. package/esm2015/plugins/quick-insert/quick-insert.plugin.js +0 -75
  678. package/esm2015/plugins/soft-break/soft-break.plugin.js +0 -37
  679. package/esm2015/plugins/table/components/insert-mark/insert-mark.component.js +0 -103
  680. package/esm2015/plugins/table/components/table.component.js +0 -470
  681. package/esm2015/plugins/table/components/td/td.component.js +0 -698
  682. package/esm2015/plugins/table/components/toolbar/table-toolbar.component.js +0 -162
  683. package/esm2015/plugins/table/table.plugin.js +0 -424
  684. package/esm2015/plugins/table/table.store.js +0 -480
  685. package/esm2015/plugins/table/toolbar-item.component.js +0 -86
  686. package/esm2015/plugins/table/transforms/clear-cell.js +0 -11
  687. package/esm2015/plugins/table/transforms/insert-table.js +0 -15
  688. package/esm2015/plugins/todo-item/todo-item.component.js +0 -66
  689. package/esm2015/plugins/vertical-align/toolbar-item.component.js +0 -90
  690. package/esm2015/queries/get-above-by-type.js +0 -11
  691. package/esm2015/queries/get-block-above.js +0 -7
  692. package/esm2015/queries/get-block-card-above.js +0 -7
  693. package/esm2015/queries/get-nodes-by-type.js +0 -12
  694. package/esm2015/queries/get-plain-text.js +0 -16
  695. package/esm2015/queries/get-selection-marks.js +0 -19
  696. package/esm2015/queries/get-toolbar-disabled.js +0 -14
  697. package/esm2015/queries/is-range-across-blocks.js +0 -18
  698. package/esm2015/services/context.service.js +0 -60
  699. package/esm2015/services/toolbar.service.js +0 -48
  700. package/esm2015/transforms/insert-elements.js +0 -35
  701. package/esm2015/transforms/merge-deep-to-nodes.js +0 -9
  702. package/esm2015/transforms/unwrap-nodes-by-type.js +0 -11
  703. package/esm2015/utils/is-inline.js +0 -10
  704. package/esm2015/utils/match.js +0 -29
  705. package/fesm2015/worktile-theia.js.map +0 -1
@@ -1,424 +0,0 @@
1
- import { Transforms, Node, Range, Editor, Element, Path, Operation } from 'slate';
2
- import { AngularEditor, ELEMENT_TO_COMPONENT, hotkeys } from 'slate-angular';
3
- import { TableOptions } from './table.types';
4
- import { isRangeInTable, isSelectionInTable, TablePosition } from './utils';
5
- import { PluginKeys, TheEditor } from '../../interfaces';
6
- import { ElementKinds } from '../../constants/node-types';
7
- import { TheTableComponent } from './components/table.component';
8
- import { TableEditor } from './table.editor';
9
- import { clearTableNode } from './transforms/clear-table-node';
10
- import { isVirtualKey } from './utils/is-virtual-key';
11
- import { insertColumnAtRow } from './transforms/insert-column';
12
- import { calculateAnchorPositionInCell } from './utils/calc-anchor-position';
13
- import { CLIPBOARD_FORMAT_KEY } from '../../constants/default';
14
- import { getOriginCell } from './utils/calc-span';
15
- import { resetTableCell } from './utils/split-cell';
16
- import { removeColumns } from './utils/remove-columns';
17
- import { addColumns } from './utils/add-columns';
18
- import { TheTableRowComponent } from './components/row/row.component';
19
- import { TheTdComponent } from './components/td/td.component';
20
- import { extractFragment } from '../../utils/fragment';
21
- import * as TheQueries from '../../queries';
22
- import { normalizeTable } from './utils/normalize-table';
23
- import { _ } from '../../utils/lodash';
24
- import { createPluginFactory } from '../../core';
25
- import { TheTableToolbarItemComponent } from './toolbar-item.component';
26
- export const withTable = (editor) => {
27
- const { deleteBackward, deleteForward, onKeydown, setFragmentData, insertData, normalizeNode, isBlockCard, renderElement, deleteCutData, isContainer, onChange } = editor;
28
- editor.deleteBackward = unit => {
29
- const opts = new TableOptions();
30
- if (!isSelectionInTable(opts, editor)) {
31
- deleteBackward(unit);
32
- return;
33
- }
34
- const { selection } = editor;
35
- const [, startBlockPath] = Editor.above(editor, {
36
- match: n => Editor.isBlock(editor, n)
37
- });
38
- const startPosition = TablePosition.create(opts, editor, selection.anchor.path);
39
- if (startBlockPath.length <= startPosition.cellEntry[1].length + 1 &&
40
- startBlockPath.pop() === 0 &&
41
- selection.anchor.offset === 0 &&
42
- TheQueries.isStart(editor, selection.anchor, startBlockPath) &&
43
- !Editor.isVoid(editor, TheQueries.anchorBlock(editor))) {
44
- return;
45
- }
46
- deleteBackward(unit);
47
- };
48
- editor.deleteForward = unit => {
49
- const opts = new TableOptions();
50
- const afterPoint = Editor.after(editor, editor.selection);
51
- if (afterPoint && isRangeInTable(opts, editor, { anchor: afterPoint, focus: afterPoint })) {
52
- const beforePosition = TablePosition.create(opts, editor, editor.selection.anchor.path);
53
- const afterPosition = TablePosition.create(opts, editor, afterPoint.path);
54
- if (beforePosition.cell && beforePosition.cell !== afterPosition.cell) {
55
- return;
56
- }
57
- }
58
- deleteForward(unit);
59
- };
60
- editor.onKeydown = (event) => {
61
- const opts = new TableOptions();
62
- const isMoveUp = hotkeys.isMoveUp(event);
63
- const isMoveDown = hotkeys.isMoveDown(event);
64
- const isMoveBackward = hotkeys.isMoveBackward(event);
65
- const isMoveForward = hotkeys.isMoveForward(event);
66
- const { selection } = editor;
67
- if (!selection || !selection.anchor || !selection.focus) {
68
- onKeydown(event);
69
- return;
70
- }
71
- const startPosition = TablePosition.create(opts, editor, selection.anchor.path);
72
- const endPosition = TablePosition.create(opts, editor, selection.focus.path);
73
- const isCollapsed = Range.isCollapsed(selection);
74
- if (startPosition && endPosition && endPosition.isInTable()) {
75
- // for keyboard up and down key in the table
76
- if (isMoveUp || isMoveDown) {
77
- const cellPath = endPosition.cellEntry[1];
78
- const startPath = Editor.start(editor, cellPath).path;
79
- const endPath = Editor.end(editor, cellPath).path;
80
- const { isFirstLine, isLastLine } = calculateAnchorPositionInCell(editor);
81
- startPath.pop();
82
- endPath.pop();
83
- if ((TheQueries.anchorBlockEntry(editor)[1].toString() !== startPath.toString() || !isFirstLine) && isMoveUp) {
84
- onKeydown(event);
85
- return;
86
- }
87
- if ((TheQueries.anchorBlockEntry(editor)[1].toString() !== endPath.toString() || !isLastLine) && isMoveDown) {
88
- onKeydown(event);
89
- return;
90
- }
91
- event.preventDefault();
92
- let at;
93
- if (isMoveUp) {
94
- const aboveRow = startPosition.table.children[startPosition.getRowIndex() - 1];
95
- const aboveCell = aboveRow && aboveRow.children[startPosition.getColumnIndex()];
96
- if (aboveCell) {
97
- if (aboveCell.hidden) {
98
- TableEditor.selectOriginCell(editor, startPosition.table, startPosition.getRowIndex() - 1, startPosition.getColumnIndex(), false);
99
- return;
100
- }
101
- else {
102
- at = Editor.end(editor, TheEditor.findPath(editor, aboveCell));
103
- }
104
- }
105
- else {
106
- const previousNodeEntry = Editor.previous(editor, { at: startPosition.tableEntry[1] });
107
- const beforePoint = Editor.before(editor, startPosition.tableEntry[1]);
108
- Editor.next(editor, { at: startPosition.tableEntry[1] });
109
- if (previousNodeEntry) {
110
- at = Editor.end(editor, previousNodeEntry[1]);
111
- }
112
- if (!previousNodeEntry && beforePoint) {
113
- at = Editor.end(editor, beforePoint.path);
114
- }
115
- if (!previousNodeEntry && !beforePoint) {
116
- AngularEditor.moveBlockCard(editor, startPosition.tableEntry[0], { direction: 'left' });
117
- return;
118
- }
119
- }
120
- Transforms.select(editor, at);
121
- }
122
- else {
123
- let belowRowIndex = startPosition.getRowIndex() + 1;
124
- if (startPosition.cell.rowspan > 1) {
125
- belowRowIndex = startPosition.getRowIndex() + startPosition.cell.rowspan;
126
- }
127
- const belowRow = startPosition.table.children[belowRowIndex];
128
- const belowCell = belowRow && belowRow.children[startPosition.getColumnIndex()];
129
- if (belowCell) {
130
- if (belowCell.hidden) {
131
- TableEditor.selectOriginCell(editor, startPosition.table, startPosition.getRowIndex() + 1, startPosition.getColumnIndex(), true);
132
- return;
133
- }
134
- else {
135
- at = Editor.start(editor, TheEditor.findPath(editor, belowCell));
136
- }
137
- }
138
- else {
139
- const nextNodeEntry = Editor.next(editor, { at: startPosition.tableEntry[1] });
140
- const movePath = nextNodeEntry ? nextNodeEntry[1] : Editor.after(editor, startPosition.tableEntry[1]).path;
141
- at = Editor.start(editor, movePath);
142
- }
143
- Transforms.select(editor, at);
144
- }
145
- return;
146
- }
147
- if (isMoveBackward) {
148
- const beforePoint = Editor.before(editor, editor.selection);
149
- const beforePosition = beforePoint && TablePosition.create(opts, editor, beforePoint.path);
150
- if (beforePosition && beforePosition.cell && beforePosition.cell.hidden) {
151
- event.preventDefault();
152
- const at = Editor.end(editor, TheEditor.findPath(editor, beforePosition.findPrevious()));
153
- Transforms.select(editor, at);
154
- }
155
- }
156
- if (isMoveForward) {
157
- const afterPoint = Editor.after(editor, editor.selection);
158
- const afterPosition = afterPoint && TablePosition.create(opts, editor, afterPoint.path);
159
- if (afterPosition.cell && afterPosition.cell.hidden) {
160
- event.preventDefault();
161
- const nextCell = afterPosition.findNext();
162
- if (nextCell) {
163
- const at = Editor.start(editor, TheEditor.findPath(editor, afterPosition.findNext()));
164
- Transforms.select(editor, at);
165
- event.preventDefault();
166
- }
167
- else {
168
- AngularEditor.moveBlockCard(editor, startPosition.tableEntry[0], { direction: 'right' });
169
- event.preventDefault();
170
- }
171
- return;
172
- }
173
- }
174
- // Prevent deleting cells in the table
175
- if (!isCollapsed && !startPosition.isInTable() && !isVirtualKey(event)) {
176
- event.preventDefault();
177
- let tableOutPath;
178
- Editor.withoutNormalizing(editor, () => {
179
- if (Range.isForward(selection)) {
180
- tableOutPath = Editor.end(editor, [selection.focus.path[0] - 1]);
181
- clearTableNode(opts, editor, true);
182
- }
183
- else {
184
- tableOutPath = Editor.start(editor, [selection.focus.path[0] + 1]);
185
- clearTableNode(opts, editor);
186
- }
187
- const tableOutRange = Editor.range(editor, selection.anchor, tableOutPath);
188
- Transforms.delete(editor, { at: tableOutRange });
189
- });
190
- // new range
191
- const cellRange = Editor.range(editor, editor.selection.focus.path.slice(0, 3));
192
- const focusRange = Range.intersection(editor.selection, cellRange);
193
- Transforms.select(editor, focusRange);
194
- Editor.deleteFragment(editor);
195
- return;
196
- }
197
- }
198
- onKeydown(event);
199
- return;
200
- };
201
- editor.setFragmentData = unit => {
202
- const opts = new TableOptions();
203
- if (!isSelectionInTable(opts, editor)) {
204
- setFragmentData(unit);
205
- return;
206
- }
207
- const { selection } = editor;
208
- const tablePosition = TablePosition.create(opts, editor, selection.anchor.path);
209
- const tableComponent = ELEMENT_TO_COMPONENT.get(tablePosition.table);
210
- const cells = tableComponent.tableStore.selectedCells;
211
- let tableFragment = null;
212
- if (tableComponent.tableStore.selectedRowsIndex.length > 0) {
213
- const rows = tablePosition.table.children.slice(tableComponent.tableStore.selectedRowsIndex[0], tableComponent.tableStore.selectedRowsIndex[tableComponent.tableStore.selectedRowsIndex.length - 1] + 1);
214
- tableFragment = Object.assign(Object.assign({}, tablePosition.table), { children: rows });
215
- }
216
- else if (cells.length > 0) {
217
- const tempRows = {};
218
- for (const cell of cells) {
219
- const { row, col } = cell;
220
- const cellPath = [...tablePosition.tableEntry[1], row, col];
221
- const cellNode = Node.get(editor, cellPath);
222
- if (!tempRows[row]) {
223
- tempRows[row] = [];
224
- }
225
- tempRows[row].push(cellNode);
226
- }
227
- const rows = Object.values(tempRows).map((item) => {
228
- return {
229
- type: ElementKinds.tableRow,
230
- children: item
231
- };
232
- });
233
- tableFragment = {
234
- type: ElementKinds.table,
235
- children: rows
236
- };
237
- }
238
- if (tableFragment) {
239
- tableFragment = normalizeTable(_.cloneDeep(tableFragment));
240
- const plainText = Node.string(tableFragment);
241
- tableFragment = [tableFragment];
242
- const stringObj = JSON.stringify(tableFragment);
243
- const encoded = window.btoa(encodeURIComponent(stringObj));
244
- unit.setData(`application/${CLIPBOARD_FORMAT_KEY}`, encoded);
245
- unit.setData('text/plain', plainText);
246
- return;
247
- }
248
- setFragmentData(unit);
249
- };
250
- editor.insertData = data => {
251
- const fragment = extractFragment(data);
252
- if (fragment) {
253
- const opts = new TableOptions();
254
- const { selection } = editor;
255
- if (isSelectionInTable(opts, editor) &&
256
- fragment.length === 1 &&
257
- Element.isElement(fragment[0]) &&
258
- fragment[0].type === ElementKinds.table) {
259
- const tablePosition = TablePosition.create(opts, editor, selection.anchor.path);
260
- const clipboardTable = fragment[0].children;
261
- const clipboardRow = clipboardTable[0].children;
262
- const selectRowIndex = tablePosition.getRowIndex();
263
- const selectColIndex = tablePosition.getColumnIndex();
264
- const lastRowIndex = selectRowIndex + clipboardTable.length - 1;
265
- const lastColIndex = selectColIndex + clipboardRow.length - 1;
266
- for (let i = selectRowIndex; i <= lastRowIndex; i++) {
267
- for (let j = selectColIndex; j <= lastColIndex; j++) {
268
- const row = tablePosition.table.children[i];
269
- if (row && row.children[j]) {
270
- const originCell = getOriginCell(tablePosition.table, i, j);
271
- if (originCell && (originCell.colspan || originCell.rowspan)) {
272
- const path = TheEditor.findPath(editor, originCell).slice(-2);
273
- resetTableCell(editor, tablePosition.table, originCell, path[0], path[1]);
274
- }
275
- }
276
- }
277
- }
278
- Editor.withoutNormalizing(editor, () => {
279
- if (lastColIndex > tablePosition.getWidth() - 1) {
280
- const addColCount = lastColIndex - (tablePosition.getWidth() - 1);
281
- TableEditor.insertColumn(editor, addColCount, tablePosition.getWidth());
282
- }
283
- if (lastRowIndex > tablePosition.getHeight() - 1) {
284
- const addRowCount = lastRowIndex - (tablePosition.getHeight() - 1);
285
- TableEditor.insertRow(editor, addRowCount, tablePosition.getHeight());
286
- }
287
- clipboardTable.forEach((row, i) => {
288
- row.children.forEach((col, j) => {
289
- const at = [...tablePosition.tableEntry[1], selectRowIndex + i, selectColIndex + j];
290
- Transforms.removeNodes(editor, { at });
291
- Transforms.insertNodes(editor, col, { at });
292
- });
293
- });
294
- });
295
- const target = Editor.start(editor, [...tablePosition.tableEntry[1], selectRowIndex, selectColIndex]);
296
- Transforms.select(editor, target);
297
- return;
298
- }
299
- }
300
- insertData(data);
301
- };
302
- editor.normalizeNode = (entry) => {
303
- if (Element.isElement(entry[0]) && entry[0].type === ElementKinds.table) {
304
- const table = entry[0];
305
- const maxWidth = Math.max(...table.children.map(row => row.children.length));
306
- const invalidRows = table.children.filter(row => row.children.length < maxWidth);
307
- if (invalidRows.length > 0) {
308
- const opts = new TableOptions();
309
- Editor.withoutNormalizing(editor, () => {
310
- table.children.map((row, rowIndex) => {
311
- row.children.map((cell, cellIndex) => {
312
- if (cell.hidden || cell.colspan || cell.rowspan) {
313
- Transforms.setNodes(editor, { hidden: null, colspan: null, rowspan: null }, { at: [...entry[1], rowIndex, cellIndex] });
314
- }
315
- });
316
- });
317
- invalidRows.forEach(row => {
318
- const count = maxWidth - row.children.length;
319
- insertColumnAtRow(opts, editor, count, entry, table.children.indexOf(row), row.children.length);
320
- });
321
- });
322
- }
323
- if (table.columns && table.columns.length !== maxWidth) {
324
- const columns = table.columns.length > maxWidth ? removeColumns(table, maxWidth) : addColumns(table, maxWidth);
325
- Transforms.setNodes(editor, { columns }, { at: entry[1] });
326
- }
327
- }
328
- // adjust selection when selection is in hidden cell
329
- if (Element.isElement(entry[0]) && entry[0].type === ElementKinds.tableCell && entry[0].hidden) {
330
- if (editor.selection && Range.isCollapsed(editor.selection) && Path.isAncestor(entry[1], editor.selection.anchor.path)) {
331
- setTimeout(() => {
332
- const opts = new TableOptions();
333
- const tablePosition = TablePosition.create(opts, editor, editor.selection.anchor.path);
334
- const origin = getOriginCell(tablePosition.table, tablePosition.getRowIndex(), tablePosition.getColumnIndex());
335
- if (origin) {
336
- const path = AngularEditor.findPath(editor, origin);
337
- Transforms.select(editor, Editor.end(editor, path));
338
- }
339
- }, 0);
340
- return;
341
- }
342
- }
343
- normalizeNode(entry);
344
- };
345
- editor.isBlockCard = (element) => {
346
- if (element && element.type === ElementKinds.table) {
347
- return true;
348
- }
349
- return isBlockCard(element);
350
- };
351
- editor.renderElement = (element) => {
352
- if (element.type === ElementKinds.table) {
353
- return TheTableComponent;
354
- }
355
- if (element.type === ElementKinds.tableRow) {
356
- return TheTableRowComponent;
357
- }
358
- if (element.type === ElementKinds.tableCell) {
359
- return TheTdComponent;
360
- }
361
- return renderElement(element);
362
- };
363
- editor.deleteCutData = () => {
364
- const opts = new TableOptions();
365
- if (!isSelectionInTable(opts, editor)) {
366
- deleteCutData();
367
- return;
368
- }
369
- const { selection } = editor;
370
- const element = TablePosition.create(opts, editor, selection.anchor.path);
371
- const tableComponent = ELEMENT_TO_COMPONENT.get(element.table);
372
- const cells = tableComponent.tableStore.selectedCells;
373
- if (cells.length > 0) {
374
- Editor.withoutNormalizing(editor, () => {
375
- if (tableComponent.tableStore.isSelectedTable) {
376
- TableEditor.removeTable(editor);
377
- }
378
- else {
379
- tableComponent.tableStore.clearSelectedCellsContent();
380
- }
381
- tableComponent.tableService.closeToolbar();
382
- });
383
- return;
384
- }
385
- deleteCutData();
386
- };
387
- editor.isContainer = (element) => {
388
- return element.type === ElementKinds.tableCell ? true : isContainer(element);
389
- };
390
- editor.onChange = () => {
391
- onChange();
392
- // adujst selection when selection is in hidden cell
393
- // just hook set_selection
394
- const isCollapsed = editor.selection && Range.isCollapsed(editor.selection);
395
- const isSelectionOperation = editor.operations.every(op => Operation.isSelectionOperation(op));
396
- if (isCollapsed && isSelectionOperation) {
397
- const opts = new TableOptions();
398
- const tablePosition = TablePosition.create(opts, editor, editor.selection.anchor.path);
399
- if (tablePosition.isInTable() && tablePosition.cell.hidden) {
400
- TableEditor.selectOriginCell(editor, tablePosition.table, tablePosition.getRowIndex(), tablePosition.getColumnIndex(), false);
401
- }
402
- }
403
- };
404
- return editor;
405
- };
406
- export const createTablePlugin = createPluginFactory({
407
- key: PluginKeys.table,
408
- withOverrides: withTable,
409
- nestedStructureByKey: {
410
- [ElementKinds.table]: ElementKinds.tableRow,
411
- [ElementKinds.tableRow]: ElementKinds.tableCell
412
- },
413
- toolbarItems: [
414
- {
415
- key: ElementKinds.table,
416
- icon: 'table-border-all',
417
- name: '表格',
418
- iconComponent: TheTableToolbarItemComponent,
419
- execute: editor => TableEditor.insertTable(editor),
420
- active: editor => TableEditor.isActive(editor)
421
- }
422
- ]
423
- });
424
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUucGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvc3JjL3BsdWdpbnMvdGFibGUvdGFibGUucGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQVMsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQWEsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDcEcsT0FBTyxFQUFFLGFBQWEsRUFBRSxvQkFBb0IsRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3QyxPQUFPLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM3RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFv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WUFBWSxDQUFDLFNBQVM7S0FDbEQ7SUFDRCxZQUFZLEVBQUU7UUFDVjtZQUNJLEdBQUcsRUFBRSxZQUFZLENBQUMsS0FBSztZQUN2QixJQUFJLEVBQUUsa0JBQWtCO1lBQ3hCLElBQUksRUFBRSxJQUFJO1lBQ1YsYUFBYSxFQUFFLDRCQUE0QjtZQUMzQyxPQUFPLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztZQUNsRCxNQUFNLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztTQUNqRDtLQUNKO0NBQ0osQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHJhbnNmb3JtcywgUG9pbnQsIE5vZGUsIFJhbmdlLCBFZGl0b3IsIE5vZGVFbnRyeSwgRWxlbWVudCwgUGF0aCwgT3BlcmF0aW9uIH0gZnJvbSAnc2xhdGUnO1xuaW1wb3J0IHsgQW5ndWxhckVkaXRvciwgRUxFTUVOVF9UT19DT01QT05FTlQsIGhvdGtleXMgfSBmcm9tICdzbGF0ZS1hbmd1bGFyJztcbmltcG9ydCB7IFRhYmxlT3B0aW9ucyB9IGZyb20gJy4vdGFibGUudHlwZXMnO1xuaW1wb3J0IHsgaXNSYW5nZUluVGFibGUsIGlzU2VsZWN0aW9uSW5UYWJsZSwgVGFibGVQb3NpdGlvbiB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgUGx1Z2luS2V5cywgVGhlRWRpdG9yIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBFbGVtZW50S2luZHMgfSBmcm9tICcuLi8uLi9jb25zdGFudHMvbm9kZS10eXBlcyc7XG5pbXBvcnQgeyBUYWJsZUNlbGxFbGVtZW50LCBUYWJsZUVsZW1lbnQsIFRhYmxlUm93RWxlbWVudCB9IGZyb20gJy4uLy4uL2N1c3RvbS10eXBlcyc7XG5pbXBvcnQgeyBUaGVUYWJsZUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy90YWJsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGFibGVFZGl0b3IgfSBmcm9tICcuL3RhYmxlLmVkaXRvcic7XG5pbXBvcnQgeyBjbGVhclRhYmxlTm9kZSB9IGZyb20gJy4vdHJhbnNmb3Jtcy9jbGVhci10YWJsZS1ub2RlJztcbmltcG9ydCB7IGlzVmlydHVhbEtleSB9IGZyb20gJy4vdXRpbHMvaXMtdmlydHVhbC1rZXknO1xuaW1wb3J0IHsgaW5zZXJ0Q29sdW1uQXRSb3cgfSBmcm9tICcuL3RyYW5zZm9ybXMvaW5zZXJ0LWNvbHVtbic7XG5pbXBvcnQgeyBjYWxjdWxhdGVBbmNob3JQb3NpdGlvbkluQ2VsbCB9IGZyb20gJy4vdXRpbHMvY2FsYy1hbmNob3ItcG9zaXRpb24nO1xuaW1wb3J0IHsgQ0xJUEJPQVJEX0ZPUk1BVF9LRVkgfSBmcm9tICcuLi8uLi9jb25zdGFudHMvZGVmYXVsdCc7XG5pbXBvcnQgeyBnZXRPcmlnaW5DZWxsIH0gZnJvbSAnLi91dGlscy9jYWxjLXNwYW4nO1xuaW1wb3J0IHsgcmVzZXRUYWJsZUNlbGwgfSBmcm9tICcuL3V0aWxzL3NwbGl0LWNlbGwnO1xuaW1wb3J0IHsgcmVtb3ZlQ29sdW1ucyB9IGZyb20gJy4vdXRpbHMvcmVtb3ZlLWNvbHVtbnMnO1xuaW1wb3J0IHsgYWRkQ29sdW1ucyB9IGZyb20gJy4vdXRpbHMvYWRkLWNvbHVtbnMnO1xuaW1wb3J0IHsgVGhlVGFibGVSb3dDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvcm93L3Jvdy5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGhlVGRDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdGQvdGQuY29tcG9uZW50JztcbmltcG9ydCB7IGV4dHJhY3RGcmFnbWVudCB9IGZyb20gJy4uLy4uL3V0aWxzL2ZyYWdtZW50JztcbmltcG9ydCAqIGFzIFRoZVF1ZXJpZXMgZnJvbSAnLi4vLi4vcXVlcmllcyc7XG5pbXBvcnQgeyBub3JtYWxpemVUYWJsZSB9IGZyb20gJy4vdXRpbHMvbm9ybWFsaXplLXRhYmxlJztcbmltcG9ydCB7IF8gfSBmcm9tICcuLi8uLi91dGlscy9sb2Rhc2gnO1xuaW1wb3J0IHsgY3JlYXRlUGx1Z2luRmFjdG9yeSB9IGZyb20gJy4uLy4uL2NvcmUnO1xuaW1wb3J0IHsgVGhlVGFibGVUb29sYmFySXRlbUNvbXBvbmVudCB9IGZyb20gJy4vdG9vbGJhci1pdGVtLmNvbXBvbmVudCc7XG5cbmV4cG9ydCBjb25zdCB3aXRoVGFibGUgPSA8VCBleHRlbmRzIEVkaXRvcj4oZWRpdG9yOiBUKTogVCA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgICBkZWxldGVCYWNrd2FyZCxcbiAgICAgICAgZGVsZXRlRm9yd2FyZCxcbiAgICAgICAgb25LZXlkb3duLFxuICAgICAgICBzZXRGcmFnbWVudERhdGEsXG4gICAgICAgIGluc2VydERhdGEsXG4gICAgICAgIG5vcm1hbGl6ZU5vZGUsXG4gICAgICAgIGlzQmxvY2tDYXJkLFxuICAgICAgICByZW5kZXJFbGVtZW50LFxuICAgICAgICBkZWxldGVDdXREYXRhLFxuICAgICAgICBpc0NvbnRhaW5lcixcbiAgICAgICAgb25DaGFuZ2VcbiAgICB9ID0gZWRpdG9yO1xuXG4gICAgZWRpdG9yLmRlbGV0ZUJhY2t3YXJkID0gdW5pdCA9PiB7XG4gICAgICAgIGNvbnN0IG9wdHMgPSBuZXcgVGFibGVPcHRpb25zKCk7XG4gICAgICAgIGlmICghaXNTZWxlY3Rpb25JblRhYmxlKG9wdHMsIGVkaXRvcikpIHtcbiAgICAgICAgICAgIGRlbGV0ZUJhY2t3YXJkKHVuaXQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgc2VsZWN0aW9uIH0gPSBlZGl0b3I7XG5cbiAgICAgICAgY29uc3QgWywgc3RhcnRCbG9ja1BhdGhdID0gRWRpdG9yLmFib3ZlPEVsZW1lbnQ+KGVkaXRvciwge1xuICAgICAgICAgICAgbWF0Y2g6IG4gPT4gRWRpdG9yLmlzQmxvY2soZWRpdG9yLCBuKVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgc3RhcnRQb3NpdGlvbiA9IFRhYmxlUG9zaXRpb24uY3JlYXRlKG9wdHMsIGVkaXRvciwgc2VsZWN0aW9uLmFuY2hvci5wYXRoKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgc3RhcnRCbG9ja1BhdGgubGVuZ3RoIDw9IHN0YXJ0UG9zaXRpb24uY2VsbEVudHJ5WzFdLmxlbmd0aCArIDEgJiZcbiAgICAgICAgICAgIHN0YXJ0QmxvY2tQYXRoLnBvcCgpID09PSAwICYmXG4gICAgICAgICAgICBzZWxlY3Rpb24uYW5jaG9yLm9mZnNldCA9PT0gMCAmJlxuICAgICAgICAgICAgVGhlUXVlcmllcy5pc1N0YXJ0KGVkaXRvciwgc2VsZWN0aW9uLmFuY2hvciwgc3RhcnRCbG9ja1BhdGgpICYmXG4gICAgICAgICAgICAhRWRpdG9yLmlzVm9pZChlZGl0b3IsIFRoZVF1ZXJpZXMuYW5jaG9yQmxvY2soZWRpdG9yKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlQmFja3dhcmQodW5pdCk7XG4gICAgfTtcblxuICAgIGVkaXRvci5kZWxldGVGb3J3YXJkID0gdW5pdCA9PiB7XG4gICAgICAgIGNvbnN0IG9wdHMgPSBuZXcgVGFibGVPcHRpb25zKCk7XG4gICAgICAgIGNvbnN0IGFmdGVyUG9pbnQgPSBFZGl0b3IuYWZ0ZXIoZWRpdG9yLCBlZGl0b3Iuc2VsZWN0aW9uKTtcbiAgICAgICAgaWYgKGFmdGVyUG9pbnQgJiYgaXNSYW5nZUluVGFibGUob3B0cywgZWRpdG9yLCB7IGFuY2hvcjogYWZ0ZXJQb2ludCwgZm9jdXM6IGFmdGVyUG9pbnQgfSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGJlZm9yZVBvc2l0aW9uID0gVGFibGVQb3NpdGlvbi5jcmVhdGUob3B0cywgZWRpdG9yLCBlZGl0b3Iuc2VsZWN0aW9uLmFuY2hvci5wYXRoKTtcbiAgICAgICAgICAgIGNvbnN0IGFmdGVyUG9zaXRpb24gPSBUYWJsZVBvc2l0aW9uLmNyZWF0ZShvcHRzLCBlZGl0b3IsIGFmdGVyUG9pbnQucGF0aCk7XG4gICAgICAgICAgICBpZiAoYmVmb3JlUG9zaXRpb24uY2VsbCAmJiBiZWZvcmVQb3NpdGlvbi5jZWxsICE9PSBhZnRlclBvc2l0aW9uLmNlbGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlRm9yd2FyZCh1bml0KTtcbiAgICB9O1xuXG4gICAgZWRpdG9yLm9uS2V5ZG93biA9IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCBvcHRzID0gbmV3IFRhYmxlT3B0aW9ucygpO1xuICAgICAgICBjb25zdCBpc01vdmVVcCA9IGhvdGtleXMuaXNNb3ZlVXAoZXZlbnQpO1xuICAgICAgICBjb25zdCBpc01vdmVEb3duID0gaG90a2V5cy5pc01vdmVEb3duKGV2ZW50KTtcbiAgICAgICAgY29uc3QgaXNNb3ZlQmFja3dhcmQgPSBob3RrZXlzLmlzTW92ZUJhY2t3YXJkKGV2ZW50KTtcbiAgICAgICAgY29uc3QgaXNNb3ZlRm9yd2FyZCA9IGhvdGtleXMuaXNNb3ZlRm9yd2FyZChldmVudCk7XG4gICAgICAgIGNvbnN0IHsgc2VsZWN0aW9uIH0gPSBlZGl0b3I7XG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8ICFzZWxlY3Rpb24uYW5jaG9yIHx8ICFzZWxlY3Rpb24uZm9jdXMpIHtcbiAgICAgICAgICAgIG9uS2V5ZG93bihldmVudCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhcnRQb3NpdGlvbiA9IFRhYmxlUG9zaXRpb24uY3JlYXRlKG9wdHMsIGVkaXRvciwgc2VsZWN0aW9uLmFuY2hvci5wYXRoKTtcbiAgICAgICAgY29uc3QgZW5kUG9zaXRpb24gPSBUYWJsZVBvc2l0aW9uLmNyZWF0ZShvcHRzLCBlZGl0b3IsIHNlbGVjdGlvbi5mb2N1cy5wYXRoKTtcbiAgICAgICAgY29uc3QgaXNDb2xsYXBzZWQgPSBSYW5nZS5pc0NvbGxhcHNlZChzZWxlY3Rpb24pO1xuICAgICAgICBpZiAoc3RhcnRQb3NpdGlvbiAmJiBlbmRQb3NpdGlvbiAmJiBlbmRQb3NpdGlvbi5pc0luVGFibGUoKSkge1xuICAgICAgICAgICAgLy8gZm9yIGtleWJvYXJkIHVwIGFuZCBkb3duIGtleSBpbiB0aGUgdGFibGVcbiAgICAgICAgICAgIGlmIChpc01vdmVVcCB8fCBpc01vdmVEb3duKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2VsbFBhdGggPSBlbmRQb3NpdGlvbi5jZWxsRW50cnlbMV07XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRQYXRoID0gRWRpdG9yLnN0YXJ0KGVkaXRvciwgY2VsbFBhdGgpLnBhdGg7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5kUGF0aCA9IEVkaXRvci5lbmQoZWRpdG9yLCBjZWxsUGF0aCkucGF0aDtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGlzRmlyc3RMaW5lLCBpc0xhc3RMaW5lIH0gPSBjYWxjdWxhdGVBbmNob3JQb3NpdGlvbkluQ2VsbChlZGl0b3IpO1xuICAgICAgICAgICAgICAgIHN0YXJ0UGF0aC5wb3AoKTtcbiAgICAgICAgICAgICAgICBlbmRQYXRoLnBvcCgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKChUaGVRdWVyaWVzLmFuY2hvckJsb2NrRW50cnkoZWRpdG9yKVsxXS50b1N0cmluZygpICE9PSBzdGFydFBhdGgudG9TdHJpbmcoKSB8fCAhaXNGaXJzdExpbmUpICYmIGlzTW92ZVVwKSB7XG4gICAgICAgICAgICAgICAgICAgIG9uS2V5ZG93bihldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoKFRoZVF1ZXJpZXMuYW5jaG9yQmxvY2tFbnRyeShlZGl0b3IpWzFdLnRvU3RyaW5nKCkgIT09IGVuZFBhdGgudG9TdHJpbmcoKSB8fCAhaXNMYXN0TGluZSkgJiYgaXNNb3ZlRG93bikge1xuICAgICAgICAgICAgICAgICAgICBvbktleWRvd24oZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBsZXQgYXQ6IFBvaW50O1xuICAgICAgICAgICAgICAgIGlmIChpc01vdmVVcCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhYm92ZVJvdyA9IHN0YXJ0UG9zaXRpb24udGFibGUuY2hpbGRyZW5bc3RhcnRQb3NpdGlvbi5nZXRSb3dJbmRleCgpIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFib3ZlQ2VsbCA9IGFib3ZlUm93ICYmIGFib3ZlUm93LmNoaWxkcmVuW3N0YXJ0UG9zaXRpb24uZ2V0Q29sdW1uSW5kZXgoKV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChhYm92ZUNlbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhYm92ZUNlbGwuaGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVFZGl0b3Iuc2VsZWN0T3JpZ2luQ2VsbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFBvc2l0aW9uLnRhYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFBvc2l0aW9uLmdldFJvd0luZGV4KCkgLSAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFBvc2l0aW9uLmdldENvbHVtbkluZGV4KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0ID0gRWRpdG9yLmVuZChlZGl0b3IsIFRoZUVkaXRvci5maW5kUGF0aChlZGl0b3IsIGFib3ZlQ2VsbCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNOb2RlRW50cnkgPSBFZGl0b3IucHJldmlvdXMoZWRpdG9yLCB7IGF0OiBzdGFydFBvc2l0aW9uLnRhYmxlRW50cnlbMV0gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiZWZvcmVQb2ludCA9IEVkaXRvci5iZWZvcmUoZWRpdG9yLCBzdGFydFBvc2l0aW9uLnRhYmxlRW50cnlbMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgRWRpdG9yLm5leHQoZWRpdG9yLCB7IGF0OiBzdGFydFBvc2l0aW9uLnRhYmxlRW50cnlbMV0gfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c05vZGVFbnRyeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0ID0gRWRpdG9yLmVuZChlZGl0b3IsIHByZXZpb3VzTm9kZUVudHJ5WzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmV2aW91c05vZGVFbnRyeSAmJiBiZWZvcmVQb2ludCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0ID0gRWRpdG9yLmVuZChlZGl0b3IsIGJlZm9yZVBvaW50LnBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByZXZpb3VzTm9kZUVudHJ5ICYmICFiZWZvcmVQb2ludCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZ3VsYXJFZGl0b3IubW92ZUJsb2NrQ2FyZChlZGl0b3IsIHN0YXJ0UG9zaXRpb24udGFibGVFbnRyeVswXSwgeyBkaXJlY3Rpb246ICdsZWZ0JyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5zZWxlY3QoZWRpdG9yLCBhdCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJlbG93Um93SW5kZXggPSBzdGFydFBvc2l0aW9uLmdldFJvd0luZGV4KCkgKyAxO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRQb3NpdGlvbi5jZWxsLnJvd3NwYW4gPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiZWxvd1Jvd0luZGV4ID0gc3RhcnRQb3NpdGlvbi5nZXRSb3dJbmRleCgpICsgc3RhcnRQb3NpdGlvbi5jZWxsLnJvd3NwYW47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmVsb3dSb3cgPSBzdGFydFBvc2l0aW9uLnRhYmxlLmNoaWxkcmVuW2JlbG93Um93SW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBiZWxvd0NlbGwgPSBiZWxvd1JvdyAmJiBiZWxvd1Jvdy5jaGlsZHJlbltzdGFydFBvc2l0aW9uLmdldENvbHVtbkluZGV4KCldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYmVsb3dDZWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmVsb3dDZWxsLmhpZGRlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlRWRpdG9yLnNlbGVjdE9yaWdpbkNlbGwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQb3NpdGlvbi50YWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQb3NpdGlvbi5nZXRSb3dJbmRleCgpICsgMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQb3NpdGlvbi5nZXRDb2x1bW5JbmRleCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0ID0gRWRpdG9yLnN0YXJ0KGVkaXRvciwgVGhlRWRpdG9yLmZpbmRQYXRoKGVkaXRvciwgYmVsb3dDZWxsKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0Tm9kZUVudHJ5ID0gRWRpdG9yLm5leHQoZWRpdG9yLCB7IGF0OiBzdGFydFBvc2l0aW9uLnRhYmxlRW50cnlbMV0gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtb3ZlUGF0aCA9IG5leHROb2RlRW50cnkgPyBuZXh0Tm9kZUVudHJ5WzFdIDogRWRpdG9yLmFmdGVyKGVkaXRvciwgc3RhcnRQb3NpdGlvbi50YWJsZUVudHJ5WzFdKS5wYXRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXQgPSBFZGl0b3Iuc3RhcnQoZWRpdG9yLCBtb3ZlUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5zZWxlY3QoZWRpdG9yLCBhdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzTW92ZUJhY2t3YXJkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmVmb3JlUG9pbnQgPSBFZGl0b3IuYmVmb3JlKGVkaXRvciwgZWRpdG9yLnNlbGVjdGlvbik7XG4gICAgICAgICAgICAgICAgY29uc3QgYmVmb3JlUG9zaXRpb24gPSBiZWZvcmVQb2ludCAmJiBUYWJsZVBvc2l0aW9uLmNyZWF0ZShvcHRzLCBlZGl0b3IsIGJlZm9yZVBvaW50LnBhdGgpO1xuICAgICAgICAgICAgICAgIGlmIChiZWZvcmVQb3NpdGlvbiAmJiBiZWZvcmVQb3NpdGlvbi5jZWxsICYmIGJlZm9yZVBvc2l0aW9uLmNlbGwuaGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF0ID0gRWRpdG9yLmVuZChlZGl0b3IsIFRoZUVkaXRvci5maW5kUGF0aChlZGl0b3IsIGJlZm9yZVBvc2l0aW9uLmZpbmRQcmV2aW91cygpKSk7XG4gICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMuc2VsZWN0KGVkaXRvciwgYXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzTW92ZUZvcndhcmQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhZnRlclBvaW50ID0gRWRpdG9yLmFmdGVyKGVkaXRvciwgZWRpdG9yLnNlbGVjdGlvbik7XG4gICAgICAgICAgICAgICAgY29uc3QgYWZ0ZXJQb3NpdGlvbiA9IGFmdGVyUG9pbnQgJiYgVGFibGVQb3NpdGlvbi5jcmVhdGUob3B0cywgZWRpdG9yLCBhZnRlclBvaW50LnBhdGgpO1xuICAgICAgICAgICAgICAgIGlmIChhZnRlclBvc2l0aW9uLmNlbGwgJiYgYWZ0ZXJQb3NpdGlvbi5jZWxsLmhpZGRlbikge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0Q2VsbCA9IGFmdGVyUG9zaXRpb24uZmluZE5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRDZWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdCA9IEVkaXRvci5zdGFydChlZGl0b3IsIFRoZUVkaXRvci5maW5kUGF0aChlZGl0b3IsIGFmdGVyUG9zaXRpb24uZmluZE5leHQoKSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5zZWxlY3QoZWRpdG9yLCBhdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgQW5ndWxhckVkaXRvci5tb3ZlQmxvY2tDYXJkKGVkaXRvciwgc3RhcnRQb3NpdGlvbi50YWJsZUVudHJ5WzBdLCB7IGRpcmVjdGlvbjogJ3JpZ2h0JyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUHJldmVudCBkZWxldGluZyBjZWxscyBpbiB0aGUgdGFibGVcbiAgICAgICAgICAgIGlmICghaXNDb2xsYXBzZWQgJiYgIXN0YXJ0UG9zaXRpb24uaXNJblRhYmxlKCkgJiYgIWlzVmlydHVhbEtleShldmVudCkpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGxldCB0YWJsZU91dFBhdGg6IFBvaW50O1xuICAgICAgICAgICAgICAgIEVkaXRvci53aXRob3V0Tm9ybWFsaXppbmcoZWRpdG9yLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChSYW5nZS5pc0ZvcndhcmQoc2VsZWN0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVPdXRQYXRoID0gRWRpdG9yLmVuZChlZGl0b3IsIFtzZWxlY3Rpb24uZm9jdXMucGF0aFswXSAtIDFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGFibGVOb2RlKG9wdHMsIGVkaXRvciwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZU91dFBhdGggPSBFZGl0b3Iuc3RhcnQoZWRpdG9yLCBbc2VsZWN0aW9uLmZvY3VzLnBhdGhbMF0gKyAxXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRhYmxlTm9kZShvcHRzLCBlZGl0b3IpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhYmxlT3V0UmFuZ2UgPSBFZGl0b3IucmFuZ2UoZWRpdG9yLCBzZWxlY3Rpb24uYW5jaG9yLCB0YWJsZU91dFBhdGgpO1xuICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1zLmRlbGV0ZShlZGl0b3IsIHsgYXQ6IHRhYmxlT3V0UmFuZ2UgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gbmV3IHJhbmdlXG4gICAgICAgICAgICAgICAgY29uc3QgY2VsbFJhbmdlID0gRWRpdG9yLnJhbmdlKGVkaXRvciwgZWRpdG9yLnNlbGVjdGlvbi5mb2N1cy5wYXRoLnNsaWNlKDAsIDMpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmb2N1c1JhbmdlID0gUmFuZ2UuaW50ZXJzZWN0aW9uKGVkaXRvci5zZWxlY3Rpb24sIGNlbGxSYW5nZSk7XG4gICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5zZWxlY3QoZWRpdG9yLCBmb2N1c1JhbmdlKTtcbiAgICAgICAgICAgICAgICBFZGl0b3IuZGVsZXRlRnJhZ21lbnQoZWRpdG9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgb25LZXlkb3duKGV2ZW50KTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH07XG5cbiAgICBlZGl0b3Iuc2V0RnJhZ21lbnREYXRhID0gdW5pdCA9PiB7XG4gICAgICAgIGNvbnN0IG9wdHMgPSBuZXcgVGFibGVPcHRpb25zKCk7XG4gICAgICAgIGlmICghaXNTZWxlY3Rpb25JblRhYmxlKG9wdHMsIGVkaXRvcikpIHtcbiAgICAgICAgICAgIHNldEZyYWdtZW50RGF0YSh1bml0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHNlbGVjdGlvbiB9ID0gZWRpdG9yO1xuICAgICAgICBjb25zdCB0YWJsZVBvc2l0aW9uID0gVGFibGVQb3NpdGlvbi5jcmVhdGUob3B0cywgZWRpdG9yLCBzZWxlY3Rpb24uYW5jaG9yLnBhdGgpO1xuICAgICAgICBjb25zdCB0YWJsZUNvbXBvbmVudCA9IEVMRU1FTlRfVE9fQ09NUE9ORU5ULmdldCh0YWJsZVBvc2l0aW9uLnRhYmxlKSBhcyBUaGVUYWJsZUNvbXBvbmVudDtcbiAgICAgICAgY29uc3QgY2VsbHMgPSB0YWJsZUNvbXBvbmVudC50YWJsZVN0b3JlLnNlbGVjdGVkQ2VsbHM7XG4gICAgICAgIGxldCB0YWJsZUZyYWdtZW50ID0gbnVsbDtcbiAgICAgICAgaWYgKHRhYmxlQ29tcG9uZW50LnRhYmxlU3RvcmUuc2VsZWN0ZWRSb3dzSW5kZXgubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3Qgcm93cyA9IHRhYmxlUG9zaXRpb24udGFibGUuY2hpbGRyZW4uc2xpY2UoXG4gICAgICAgICAgICAgICAgdGFibGVDb21wb25lbnQudGFibGVTdG9yZS5zZWxlY3RlZFJvd3NJbmRleFswXSxcbiAgICAgICAgICAgICAgICB0YWJsZUNvbXBvbmVudC50YWJsZVN0b3JlLnNlbGVjdGVkUm93c0luZGV4W3RhYmxlQ29tcG9uZW50LnRhYmxlU3RvcmUuc2VsZWN0ZWRSb3dzSW5kZXgubGVuZ3RoIC0gMV0gKyAxXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGFibGVGcmFnbWVudCA9IHtcbiAgICAgICAgICAgICAgICAuLi50YWJsZVBvc2l0aW9uLnRhYmxlLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiByb3dzXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKGNlbGxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHRlbXBSb3dzID0ge307XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNlbGwgb2YgY2VsbHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHJvdywgY29sIH0gPSBjZWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxQYXRoID0gWy4uLnRhYmxlUG9zaXRpb24udGFibGVFbnRyeVsxXSwgcm93LCBjb2xdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxOb2RlID0gTm9kZS5nZXQoZWRpdG9yLCBjZWxsUGF0aCkgYXMgVGFibGVDZWxsRWxlbWVudDtcbiAgICAgICAgICAgICAgICBpZiAoIXRlbXBSb3dzW3Jvd10pIHtcbiAgICAgICAgICAgICAgICAgICAgdGVtcFJvd3Nbcm93XSA9IFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0ZW1wUm93c1tyb3ddLnB1c2goY2VsbE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgcm93czogVGFibGVSb3dFbGVtZW50W10gPSBPYmplY3QudmFsdWVzKHRlbXBSb3dzKS5tYXAoKGl0ZW06IFRhYmxlQ2VsbEVsZW1lbnRbXSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IEVsZW1lbnRLaW5kcy50YWJsZVJvdyxcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IGl0ZW1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0YWJsZUZyYWdtZW50ID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6IEVsZW1lbnRLaW5kcy50YWJsZSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogcm93c1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGFibGVGcmFnbWVudCkge1xuICAgICAgICAgICAgdGFibGVGcmFnbWVudCA9IG5vcm1hbGl6ZVRhYmxlKF8uY2xvbmVEZWVwKHRhYmxlRnJhZ21lbnQpKTtcbiAgICAgICAgICAgIGNvbnN0IHBsYWluVGV4dCA9IE5vZGUuc3RyaW5nKHRhYmxlRnJhZ21lbnQpO1xuICAgICAgICAgICAgdGFibGVGcmFnbWVudCA9IFt0YWJsZUZyYWdtZW50XTtcbiAgICAgICAgICAgIGNvbnN0IHN0cmluZ09iaiA9IEpTT04uc3RyaW5naWZ5KHRhYmxlRnJhZ21lbnQpO1xuICAgICAgICAgICAgY29uc3QgZW5jb2RlZCA9IHdpbmRvdy5idG9hKGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdPYmopKTtcbiAgICAgICAgICAgIHVuaXQuc2V0RGF0YShgYXBwbGljYXRpb24vJHtDTElQQk9BUkRfRk9STUFUX0tFWX1gLCBlbmNvZGVkKTtcbiAgICAgICAgICAgIHVuaXQuc2V0RGF0YSgndGV4dC9wbGFpbicsIHBsYWluVGV4dCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2V0RnJhZ21lbnREYXRhKHVuaXQpO1xuICAgIH07XG5cbiAgICBlZGl0b3IuaW5zZXJ0RGF0YSA9IGRhdGEgPT4ge1xuICAgICAgICBjb25zdCBmcmFnbWVudCA9IGV4dHJhY3RGcmFnbWVudChkYXRhKTtcbiAgICAgICAgaWYgKGZyYWdtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBvcHRzID0gbmV3IFRhYmxlT3B0aW9ucygpO1xuICAgICAgICAgICAgY29uc3QgeyBzZWxlY3Rpb24gfSA9IGVkaXRvcjtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBpc1NlbGVjdGlvbkluVGFibGUob3B0cywgZWRpdG9yKSAmJlxuICAgICAgICAgICAgICAgIGZyYWdtZW50Lmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgIEVsZW1lbnQuaXNFbGVtZW50KGZyYWdtZW50WzBdKSAmJlxuICAgICAgICAgICAgICAgIGZyYWdtZW50WzBdLnR5cGUgPT09IEVsZW1lbnRLaW5kcy50YWJsZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFibGVQb3NpdGlvbiA9IFRhYmxlUG9zaXRpb24uY3JlYXRlKG9wdHMsIGVkaXRvciwgc2VsZWN0aW9uLmFuY2hvci5wYXRoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjbGlwYm9hcmRUYWJsZSA9IGZyYWdtZW50WzBdLmNoaWxkcmVuIGFzIE5vZGVbXTtcbiAgICAgICAgICAgICAgICBjb25zdCBjbGlwYm9hcmRSb3cgPSAoY2xpcGJvYXJkVGFibGVbMF0gYXMgRWxlbWVudCkuY2hpbGRyZW47XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0Um93SW5kZXggPSB0YWJsZVBvc2l0aW9uLmdldFJvd0luZGV4KCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0Q29sSW5kZXggPSB0YWJsZVBvc2l0aW9uLmdldENvbHVtbkluZGV4KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdFJvd0luZGV4ID0gc2VsZWN0Um93SW5kZXggKyBjbGlwYm9hcmRUYWJsZS5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RDb2xJbmRleCA9IHNlbGVjdENvbEluZGV4ICsgY2xpcGJvYXJkUm93Lmxlbmd0aCAtIDE7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gc2VsZWN0Um93SW5kZXg7IGkgPD0gbGFzdFJvd0luZGV4OyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IHNlbGVjdENvbEluZGV4OyBqIDw9IGxhc3RDb2xJbmRleDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByb3cgPSB0YWJsZVBvc2l0aW9uLnRhYmxlLmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdyAmJiByb3cuY2hpbGRyZW5bal0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5DZWxsID0gZ2V0T3JpZ2luQ2VsbCh0YWJsZVBvc2l0aW9uLnRhYmxlLCBpLCBqKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luQ2VsbCAmJiAob3JpZ2luQ2VsbC5jb2xzcGFuIHx8IG9yaWdpbkNlbGwucm93c3BhbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF0aCA9IFRoZUVkaXRvci5maW5kUGF0aChlZGl0b3IsIG9yaWdpbkNlbGwpLnNsaWNlKC0yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXRUYWJsZUNlbGwoZWRpdG9yLCB0YWJsZVBvc2l0aW9uLnRhYmxlLCBvcmlnaW5DZWxsLCBwYXRoWzBdLCBwYXRoWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBFZGl0b3Iud2l0aG91dE5vcm1hbGl6aW5nKGVkaXRvciwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobGFzdENvbEluZGV4ID4gdGFibGVQb3NpdGlvbi5nZXRXaWR0aCgpIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWRkQ29sQ291bnQgPSBsYXN0Q29sSW5kZXggLSAodGFibGVQb3NpdGlvbi5nZXRXaWR0aCgpIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBUYWJsZUVkaXRvci5pbnNlcnRDb2x1bW4oZWRpdG9yLCBhZGRDb2xDb3VudCwgdGFibGVQb3NpdGlvbi5nZXRXaWR0aCgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFJvd0luZGV4ID4gdGFibGVQb3NpdGlvbi5nZXRIZWlnaHQoKSAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFkZFJvd0NvdW50ID0gbGFzdFJvd0luZGV4IC0gKHRhYmxlUG9zaXRpb24uZ2V0SGVpZ2h0KCkgLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlRWRpdG9yLmluc2VydFJvdyhlZGl0b3IsIGFkZFJvd0NvdW50LCB0YWJsZVBvc2l0aW9uLmdldEhlaWdodCgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjbGlwYm9hcmRUYWJsZS5mb3JFYWNoKChyb3c6IFRhYmxlRWxlbWVudCwgaTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByb3cuY2hpbGRyZW4uZm9yRWFjaCgoY29sOiBOb2RlLCBqOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdCA9IFsuLi50YWJsZVBvc2l0aW9uLnRhYmxlRW50cnlbMV0sIHNlbGVjdFJvd0luZGV4ICsgaSwgc2VsZWN0Q29sSW5kZXggKyBqXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1zLnJlbW92ZU5vZGVzKGVkaXRvciwgeyBhdCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1zLmluc2VydE5vZGVzKGVkaXRvciwgY29sLCB7IGF0IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IEVkaXRvci5zdGFydChlZGl0b3IsIFsuLi50YWJsZVBvc2l0aW9uLnRhYmxlRW50cnlbMV0sIHNlbGVjdFJvd0luZGV4LCBzZWxlY3RDb2xJbmRleF0pO1xuICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMuc2VsZWN0KGVkaXRvciwgdGFyZ2V0KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaW5zZXJ0RGF0YShkYXRhKTtcbiAgICB9O1xuXG4gICAgZWRpdG9yLm5vcm1hbGl6ZU5vZGUgPSAoZW50cnk6IE5vZGVFbnRyeTxOb2RlPikgPT4ge1xuICAgICAgICBpZiAoRWxlbWVudC5pc0VsZW1lbnQoZW50cnlbMF0pICYmIGVudHJ5WzBdLnR5cGUgPT09IEVsZW1lbnRLaW5kcy50YWJsZSkge1xuICAgICAgICAgICAgY29uc3QgdGFibGUgPSBlbnRyeVswXSBhcyBUYWJsZUVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCBtYXhXaWR0aCA9IE1hdGgubWF4KC4uLnRhYmxlLmNoaWxkcmVuLm1hcChyb3cgPT4gcm93LmNoaWxkcmVuLmxlbmd0aCkpO1xuICAgICAgICAgICAgY29uc3QgaW52YWxpZFJvd3MgPSB0YWJsZS5jaGlsZHJlbi5maWx0ZXIocm93ID0+IHJvdy5jaGlsZHJlbi5sZW5ndGggPCBtYXhXaWR0aCk7XG4gICAgICAgICAgICBpZiAoaW52YWxpZFJvd3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wdHMgPSBuZXcgVGFibGVPcHRpb25zKCk7XG4gICAgICAgICAgICAgICAgRWRpdG9yLndpdGhvdXROb3JtYWxpemluZyhlZGl0b3IsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGFibGUuY2hpbGRyZW4ubWFwKChyb3csIHJvd0luZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByb3cuY2hpbGRyZW4ubWFwKChjZWxsLCBjZWxsSW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbC5oaWRkZW4gfHwgY2VsbC5jb2xzcGFuIHx8IGNlbGwucm93c3Bhbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1zLnNldE5vZGVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBoaWRkZW46IG51bGwsIGNvbHNwYW46IG51bGwsIHJvd3NwYW46IG51bGwgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgYXQ6IFsuLi5lbnRyeVsxXSwgcm93SW5kZXgsIGNlbGxJbmRleF0gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaW52YWxpZFJvd3MuZm9yRWFjaChyb3cgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY291bnQgPSBtYXhXaWR0aCAtIHJvdy5jaGlsZHJlbi5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRDb2x1bW5BdFJvdyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSBhcyBOb2RlRW50cnk8VGFibGVFbGVtZW50PixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5jaGlsZHJlbi5pbmRleE9mKHJvdyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93LmNoaWxkcmVuLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGFibGUuY29sdW1ucyAmJiB0YWJsZS5jb2x1bW5zLmxlbmd0aCAhPT0gbWF4V2lkdGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW5zID0gdGFibGUuY29sdW1ucy5sZW5ndGggPiBtYXhXaWR0aCA/IHJlbW92ZUNvbHVtbnModGFibGUsIG1heFdpZHRoKSA6IGFkZENvbHVtbnModGFibGUsIG1heFdpZHRoKTtcbiAgICAgICAgICAgICAgICBUcmFuc2Zvcm1zLnNldE5vZGVzKGVkaXRvciwgeyBjb2x1bW5zIH0sIHsgYXQ6IGVudHJ5WzFdIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGFkanVzdCBzZWxlY3Rpb24gd2hlbiBzZWxlY3Rpb24gaXMgaW4gaGlkZGVuIGNlbGxcbiAgICAgICAgaWYgKEVsZW1lbnQuaXNFbGVtZW50KGVudHJ5WzBdKSAmJiBlbnRyeVswXS50eXBlID09PSBFbGVtZW50S2luZHMudGFibGVDZWxsICYmIGVudHJ5WzBdLmhpZGRlbikge1xuICAgICAgICAgICAgaWYgKGVkaXRvci5zZWxlY3Rpb24gJiYgUmFuZ2UuaXNDb2xsYXBzZWQoZWRpdG9yLnNlbGVjdGlvbikgJiYgUGF0aC5pc0FuY2VzdG9yKGVudHJ5WzFdLCBlZGl0b3Iuc2VsZWN0aW9uLmFuY2hvci5wYXRoKSkge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcHRzID0gbmV3IFRhYmxlT3B0aW9ucygpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWJsZVBvc2l0aW9uID0gVGFibGVQb3NpdGlvbi5jcmVhdGUob3B0cywgZWRpdG9yLCBlZGl0b3Iuc2VsZWN0aW9uLmFuY2hvci5wYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luID0gZ2V0T3JpZ2luQ2VsbCh0YWJsZVBvc2l0aW9uLnRhYmxlLCB0YWJsZVBvc2l0aW9uLmdldFJvd0luZGV4KCksIHRhYmxlUG9zaXRpb24uZ2V0Q29sdW1uSW5kZXgoKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSBBbmd1bGFyRWRpdG9yLmZpbmRQYXRoKGVkaXRvciwgb3JpZ2luKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMuc2VsZWN0KGVkaXRvciwgRWRpdG9yLmVuZChlZGl0b3IsIHBhdGgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBub3JtYWxpemVOb2RlKGVudHJ5KTtcbiAgICB9O1xuXG4gICAgZWRpdG9yLmlzQmxvY2tDYXJkID0gKGVsZW1lbnQ6IEVsZW1lbnQpID0+IHtcbiAgICAgICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC50eXBlID09PSBFbGVtZW50S2luZHMudGFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0Jsb2NrQ2FyZChlbGVtZW50KTtcbiAgICB9O1xuXG4gICAgZWRpdG9yLnJlbmRlckVsZW1lbnQgPSAoZWxlbWVudDogRWxlbWVudCkgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudC50eXBlID09PSBFbGVtZW50S2luZHMudGFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiBUaGVUYWJsZUNvbXBvbmVudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbWVudC50eXBlID09PSBFbGVtZW50S2luZHMudGFibGVSb3cpIHtcbiAgICAgICAgICAgIHJldHVybiBUaGVUYWJsZVJvd0NvbXBvbmVudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbWVudC50eXBlID09PSBFbGVtZW50S2luZHMudGFibGVDZWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gVGhlVGRDb21wb25lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlbmRlckVsZW1lbnQoZWxlbWVudCk7XG4gICAgfTtcblxuICAgIGVkaXRvci5kZWxldGVDdXREYXRhID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBvcHRzID0gbmV3IFRhYmxlT3B0aW9ucygpO1xuICAgICAgICBpZiAoIWlzU2VsZWN0aW9uSW5UYWJsZShvcHRzLCBlZGl0b3IpKSB7XG4gICAgICAgICAgICBkZWxldGVDdXREYXRhKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBzZWxlY3Rpb24gfSA9IGVkaXRvcjtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IFRhYmxlUG9zaXRpb24uY3JlYXRlKG9wdHMsIGVkaXRvciwgc2VsZWN0aW9uLmFuY2hvci5wYXRoKTtcbiAgICAgICAgY29uc3QgdGFibGVDb21wb25lbnQgPSBFTEVNRU5UX1RPX0NPTVBPTkVOVC5nZXQoZWxlbWVudC50YWJsZSkgYXMgVGhlVGFibGVDb21wb25lbnQ7XG4gICAgICAgIGNvbnN0IGNlbGxzID0gdGFibGVDb21wb25lbnQudGFibGVTdG9yZS5zZWxlY3RlZENlbGxzO1xuICAgICAgICBpZiAoY2VsbHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgRWRpdG9yLndpdGhvdXROb3JtYWxpemluZyhlZGl0b3IsICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGFibGVDb21wb25lbnQudGFibGVTdG9yZS5pc1NlbGVjdGVkVGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgVGFibGVFZGl0b3IucmVtb3ZlVGFibGUoZWRpdG9yKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbXBvbmVudC50YWJsZVN0b3JlLmNsZWFyU2VsZWN0ZWRDZWxsc0NvbnRlbnQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGFibGVDb21wb25lbnQudGFibGVTZXJ2aWNlLmNsb3NlVG9vbGJhcigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlQ3V0RGF0YSgpO1xuICAgIH07XG5cbiAgICBlZGl0b3IuaXNDb250YWluZXIgPSAoZWxlbWVudDogRWxlbWVudCkgPT4ge1xuICAgICAgICByZXR1cm4gZWxlbWVudC50eXBlID09PSBFbGVtZW50S2luZHMudGFibGVDZWxsID8gdHJ1ZSA6IGlzQ29udGFpbmVyKGVsZW1lbnQpO1xuICAgIH07XG5cbiAgICBlZGl0b3Iub25DaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgIG9uQ2hhbmdlKCk7XG4gICAgICAgIC8vIGFkdWpzdCBzZWxlY3Rpb24gd2hlbiBzZWxlY3Rpb24gaXMgaW4gaGlkZGVuIGNlbGxcbiAgICAgICAgLy8ganVzdCBob29rIHNldF9zZWxlY3Rpb25cbiAgICAgICAgY29uc3QgaXNDb2xsYXBzZWQgPSBlZGl0b3Iuc2VsZWN0aW9uICYmIFJhbmdlLmlzQ29sbGFwc2VkKGVkaXRvci5zZWxlY3Rpb24pO1xuICAgICAgICBjb25zdCBpc1NlbGVjdGlvbk9wZXJhdGlvbiA9IGVkaXRvci5vcGVyYXRpb25zLmV2ZXJ5KG9wID0+IE9wZXJhdGlvbi5pc1NlbGVjdGlvbk9wZXJhdGlvbihvcCkpO1xuICAgICAgICBpZiAoaXNDb2xsYXBzZWQgJiYgaXNTZWxlY3Rpb25PcGVyYXRpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdHMgPSBuZXcgVGFibGVPcHRpb25zKCk7XG4gICAgICAgICAgICBjb25zdCB0YWJsZVBvc2l0aW9uID0gVGFibGVQb3NpdGlvbi5jcmVhdGUob3B0cywgZWRpdG9yLCBlZGl0b3Iuc2VsZWN0aW9uLmFuY2hvci5wYXRoKTtcbiAgICAgICAgICAgIGlmICh0YWJsZVBvc2l0aW9uLmlzSW5UYWJsZSgpICYmIHRhYmxlUG9zaXRpb24uY2VsbC5oaWRkZW4pIHtcbiAgICAgICAgICAgICAgICBUYWJsZUVkaXRvci5zZWxlY3RPcmlnaW5DZWxsKFxuICAgICAgICAgICAgICAgICAgICBlZGl0b3IsXG4gICAgICAgICAgICAgICAgICAgIHRhYmxlUG9zaXRpb24udGFibGUsXG4gICAgICAgICAgICAgICAgICAgIHRhYmxlUG9zaXRpb24uZ2V0Um93SW5kZXgoKSxcbiAgICAgICAgICAgICAgICAgICAgdGFibGVQb3NpdGlvbi5nZXRDb2x1bW5JbmRleCgpLFxuICAgICAgICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIGVkaXRvcjtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVUYWJsZVBsdWdpbiA9IGNyZWF0ZVBsdWdpbkZhY3Rvcnkoe1xuICAgIGtleTogUGx1Z2luS2V5cy50YWJsZSxcbiAgICB3aXRoT3ZlcnJpZGVzOiB3aXRoVGFibGUsXG4gICAgbmVzdGVkU3RydWN0dXJlQnlLZXk6IHtcbiAgICAgICAgW0VsZW1lbnRLaW5kcy50YWJsZV06IEVsZW1lbnRLaW5kcy50YWJsZVJvdyxcbiAgICAgICAgW0VsZW1lbnRLaW5kcy50YWJsZVJvd106IEVsZW1lbnRLaW5kcy50YWJsZUNlbGxcbiAgICB9LFxuICAgIHRvb2xiYXJJdGVtczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBrZXk6IEVsZW1lbnRLaW5kcy50YWJsZSxcbiAgICAgICAgICAgIGljb246ICd0YWJsZS1ib3JkZXItYWxsJyxcbiAgICAgICAgICAgIG5hbWU6ICfooajmoLwnLFxuICAgICAgICAgICAgaWNvbkNvbXBvbmVudDogVGhlVGFibGVUb29sYmFySXRlbUNvbXBvbmVudCxcbiAgICAgICAgICAgIGV4ZWN1dGU6IGVkaXRvciA9PiBUYWJsZUVkaXRvci5pbnNlcnRUYWJsZShlZGl0b3IpLFxuICAgICAgICAgICAgYWN0aXZlOiBlZGl0b3IgPT4gVGFibGVFZGl0b3IuaXNBY3RpdmUoZWRpdG9yKVxuICAgICAgICB9XG4gICAgXVxufSk7XG4iXX0=