@worktile/theia 3.0.9 → 3.1.0-next.2

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 +20 -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
@@ -0,0 +1,461 @@
1
+ import { Component, ElementRef, ViewChild, HostListener } from '@angular/core';
2
+ import { fromEvent, Subject } from 'rxjs';
3
+ import { take, takeUntil, debounceTime } from 'rxjs/operators';
4
+ import { Transforms } from 'slate';
5
+ import { AngularEditor } from 'slate-angular';
6
+ import { TablePosition } from '../utils';
7
+ import { ColumnResizeNotifierSource } from '../../../components/column-resize/column-resize-notifier';
8
+ import { TableCellEventDispatcher } from '../../../components/column-resize/event-dispatcher';
9
+ import { TableStore } from '../table.store';
10
+ import { getElementHeight, getElementWidth } from '../../../utils/dom';
11
+ import { TableService } from '../table.service';
12
+ import { TheTableContextMenuService } from '../../../services/table-contextmenu.service';
13
+ import { TheBaseElementComponent } from '../../../interfaces/view-base';
14
+ import { TableOptions, TheTableToken } from '../table.types';
15
+ import { TheEditor } from '../../../interfaces/editor';
16
+ import { SLA_TABLE_CELL_SELECTOR } from '../../../constants/selector';
17
+ import * as TheTransforms from '../../../transforms';
18
+ import * as i0 from "@angular/core";
19
+ import * as i1 from "../../../components/column-resize/event-dispatcher";
20
+ import * as i2 from "../../../components/column-resize/column-resize-notifier";
21
+ import * as i3 from "../table.store";
22
+ import * as i4 from "../table.service";
23
+ import * as i5 from "../../../services/context.service";
24
+ import * as i6 from "../../../services/table-contextmenu.service";
25
+ import * as i7 from "./insert-mark/insert-mark.component";
26
+ import * as i8 from "slate-angular";
27
+ import * as i9 from "../../../components/column-resize/column-resize.directive";
28
+ import * as i10 from "@angular/common";
29
+ export class TheTableComponent extends TheBaseElementComponent {
30
+ constructor(elementRef, eventDispatcher, resizeNotifier, tableStore, cdr, ngZone, tableService, theContextService, theTableContextMenuService) {
31
+ super(elementRef, cdr);
32
+ this.eventDispatcher = eventDispatcher;
33
+ this.resizeNotifier = resizeNotifier;
34
+ this.tableStore = tableStore;
35
+ this.cdr = cdr;
36
+ this.ngZone = ngZone;
37
+ this.tableService = tableService;
38
+ this.theContextService = theContextService;
39
+ this.theTableContextMenuService = theTableContextMenuService;
40
+ this.destroy$ = new Subject();
41
+ this.rowControls = [];
42
+ this.colControls = [];
43
+ }
44
+ get columns() {
45
+ return this.normalizedColumns || (this.element && this.element.columns);
46
+ }
47
+ get nativeElement() {
48
+ return this.elementRef.nativeElement;
49
+ }
50
+ get tbodyNativeElement() {
51
+ return this.tbodyElement?.nativeElement;
52
+ }
53
+ get isSelectedAllCell() {
54
+ return (this.tableStore.selectedRowsIndex.length === this.rowControls.length &&
55
+ this.tableStore.selectedColumnsIndex.length === this.colControls.length);
56
+ }
57
+ handleMousedown(event) {
58
+ if (event.target instanceof Element && this.tbodyNativeElement.contains(event.target)) {
59
+ return;
60
+ }
61
+ if (!TheEditor.isFocused(this.editor)) {
62
+ TheEditor.focus(this.editor);
63
+ }
64
+ AngularEditor.moveBlockCard(this.editor, this.element, { direction: 'left' });
65
+ event.preventDefault();
66
+ }
67
+ onContextChange() {
68
+ super.onContextChange();
69
+ if (this.initialized) {
70
+ Promise.resolve().then(() => {
71
+ this.tableStore.emitTableChange();
72
+ this.useRowControls();
73
+ this.cdr.markForCheck();
74
+ });
75
+ this.getIsInTable();
76
+ this.getColControls();
77
+ if (this.normalizedColumns) {
78
+ this.normalizeShowColumns();
79
+ }
80
+ }
81
+ }
82
+ ngOnInit() {
83
+ super.ngOnInit();
84
+ this.getColControls();
85
+ this.getIsInTable();
86
+ }
87
+ ngAfterViewInit() {
88
+ this.ngZone.onStable.pipe(take(1)).subscribe(async () => {
89
+ const blockCardElement = this.nativeElement.closest('slate-block-card');
90
+ if (blockCardElement) {
91
+ blockCardElement.classList.add(`slate-block-card-${this.element.type}`);
92
+ }
93
+ this.tableStore.initEditor(this.editor);
94
+ this.subscribeCellsChange();
95
+ this.subscribeCellPositionChange();
96
+ this.listenTableContextMenuEvent();
97
+ this.useTableWrapperWidth();
98
+ if (this.element.options?.numberedColumn) {
99
+ const loadImageDone = await this.resolveImage();
100
+ // 等待序号列表格内图片加载完成后再去渲染表格行高度
101
+ if (loadImageDone) {
102
+ this.useRowControls();
103
+ this.cdr.detectChanges();
104
+ }
105
+ }
106
+ else {
107
+ this.useRowControls();
108
+ this.cdr.markForCheck();
109
+ }
110
+ });
111
+ }
112
+ subscribeCellPositionChange() {
113
+ this.tableStore
114
+ .cellsPositionChange()
115
+ .pipe(debounceTime(100), takeUntil(this.destroy$))
116
+ .subscribe(x => {
117
+ this.cdr.detectChanges();
118
+ });
119
+ }
120
+ useTableWrapperWidth() {
121
+ const rootWidth = this.theContextService.getOptions().width;
122
+ const tablePath = TheEditor.findPath(this.editor, this.element);
123
+ if (tablePath.length > 1) {
124
+ // 解决table不在顶层时,拖动单元格宽度计算问题
125
+ this.theTableWrapperWidth = this.tableWrapper.nativeElement.offsetWidth;
126
+ }
127
+ else {
128
+ this.theTableWrapperWidth = rootWidth;
129
+ }
130
+ }
131
+ subscribeCellsChange() {
132
+ this.tableStore
133
+ .dangerousOrSelectedCellsChange()
134
+ .pipe(takeUntil(this.destroy$))
135
+ .subscribe(() => {
136
+ this.cdr.detectChanges();
137
+ });
138
+ }
139
+ useRowControls() {
140
+ if (this.selection || this.element.options?.numberedColumn) {
141
+ this.rowControls = this.calculateRowControls();
142
+ }
143
+ }
144
+ detectChanges() {
145
+ this.cdr.detectChanges();
146
+ }
147
+ calculateMinRowSpanCellForRows() {
148
+ const table = this.element;
149
+ const cells = table.children.map((row, index) => {
150
+ const noHiddenCells = row.children.filter(cell => !cell.hidden);
151
+ if (noHiddenCells.length > 0) {
152
+ const minRowspan = Math.min.apply(Math, noHiddenCells.map(cell => {
153
+ return cell.rowspan || 1;
154
+ }));
155
+ const cell = row.children.find(item => !item.hidden && (item.rowspan || 1) === minRowspan);
156
+ return {
157
+ cell,
158
+ rowIndex: index
159
+ };
160
+ }
161
+ else {
162
+ return {
163
+ rowIndex: index
164
+ };
165
+ }
166
+ });
167
+ return cells;
168
+ }
169
+ calculateRowControls() {
170
+ const minRowSpanCellForRows = this.calculateMinRowSpanCellForRows();
171
+ const rowControls = [];
172
+ let previousRowIndex = 0;
173
+ let previousCombineRowIndex = 0;
174
+ minRowSpanCellForRows.forEach((cellInfo, index) => {
175
+ if (!cellInfo.cell) {
176
+ rowControls.push({
177
+ height: 0,
178
+ rowIndex: index
179
+ });
180
+ previousCombineRowIndex = index;
181
+ if (index === minRowSpanCellForRows.length - 1) {
182
+ this.calculateRowControlsAvgHeight(previousCombineRowIndex, previousRowIndex, rowControls);
183
+ }
184
+ return;
185
+ }
186
+ // calculate combine row height
187
+ if (previousCombineRowIndex > previousRowIndex) {
188
+ this.calculateRowControlsAvgHeight(previousCombineRowIndex, previousRowIndex, rowControls);
189
+ previousCombineRowIndex = 0;
190
+ }
191
+ const cellDom = AngularEditor.toDOMNode(this.editor, cellInfo.cell);
192
+ let height = getElementHeight(cellDom);
193
+ // 当cell为合并的单元格(rowspan > 1),计算其实际高度(当前单元格的高度 - 下方合并单元格的高度)
194
+ if (cellInfo.cell.rowspan > 1) {
195
+ const calcHeight = height - this.getBelowRowHeight(minRowSpanCellForRows, index, cellInfo.rowIndex, cellInfo.cell.rowspan);
196
+ rowControls.push({
197
+ height: calcHeight,
198
+ rowIndex: cellInfo.rowIndex
199
+ });
200
+ }
201
+ else {
202
+ rowControls.push({
203
+ height,
204
+ rowIndex: cellInfo.rowIndex
205
+ });
206
+ }
207
+ previousRowIndex = index;
208
+ });
209
+ return rowControls;
210
+ }
211
+ calculateRowControlsAvgHeight(previousCombineRowIndex, previousRowIndex, rowControls) {
212
+ const rowControl = rowControls[previousRowIndex];
213
+ const count = previousCombineRowIndex - previousRowIndex;
214
+ const avgHeight = Math.floor(rowControl.height / (count + 1));
215
+ const firstHeight = rowControl.height - avgHeight * count;
216
+ rowControl.height = firstHeight;
217
+ rowControls
218
+ .filter((item, _index) => _index > previousRowIndex && _index <= previousCombineRowIndex)
219
+ .forEach(rowControl => {
220
+ rowControl.height = avgHeight;
221
+ });
222
+ }
223
+ getBelowRowHeight(cells, index, rowIndex, rowspan) {
224
+ let belowRowlHeight = 0;
225
+ cells.slice(index + 1, cells.length).map(item => {
226
+ if (!item.cell) {
227
+ return;
228
+ }
229
+ if (rowIndex + rowspan > item.rowIndex) {
230
+ const cellDom = AngularEditor.toDOMNode(this.editor, item.cell);
231
+ if (item.cell.rowspan > 1) {
232
+ // 如果下方单元格的rowspan > 1,递归计算
233
+ const height = this.getBelowRowHeight(cells, cells.findIndex(cell => cell.rowIndex === item.rowIndex), item.rowIndex, item.cell.rowspan);
234
+ belowRowlHeight += getElementHeight(cellDom) - height;
235
+ }
236
+ else {
237
+ belowRowlHeight += getElementHeight(cellDom);
238
+ }
239
+ }
240
+ });
241
+ return belowRowlHeight;
242
+ }
243
+ resolveImage() {
244
+ const imageElements = this.nativeElement.querySelectorAll('img');
245
+ if (imageElements.length) {
246
+ const imageResolves = [];
247
+ imageElements.forEach(item => {
248
+ const image = new Image();
249
+ const imageLoad = new Promise(resolve => {
250
+ image.onload = () => {
251
+ resolve(true);
252
+ };
253
+ image.onerror = () => {
254
+ resolve(true);
255
+ };
256
+ image.src = item.getAttribute('src');
257
+ });
258
+ imageResolves.push(imageLoad);
259
+ });
260
+ return Promise.all(imageResolves);
261
+ }
262
+ return Promise.resolve(true);
263
+ }
264
+ getColControls() {
265
+ this.colControls = this.element?.children[0]?.children || [];
266
+ }
267
+ onColMouseDown(event, index) {
268
+ event.stopPropagation();
269
+ event.preventDefault();
270
+ if (!!this.selection && this.isInTable) {
271
+ this.tableStore.clearDangerousCells();
272
+ this.tableStore.selectColumn(this.editor, index);
273
+ this.tableService.openToolbar(event.target, true);
274
+ }
275
+ }
276
+ getIsInTable() {
277
+ if (this.selection) {
278
+ const opts = new TableOptions();
279
+ const selection = this.editor.selection;
280
+ const startPosition = TablePosition.create(opts, this.editor, selection.anchor.path);
281
+ const endPosition = TablePosition.create(opts, this.editor, selection.focus.path);
282
+ this.isInTable = startPosition.isInTable() && endPosition.isInTable();
283
+ }
284
+ else {
285
+ this.isInTable = false;
286
+ }
287
+ }
288
+ normalizeShowColumns() {
289
+ const table = this.element;
290
+ const tr = table.children[0];
291
+ if (this.element.columns) {
292
+ let isGood = true;
293
+ this.normalizedColumns = table.columns.map(item => {
294
+ return { ...item };
295
+ });
296
+ if (this.element.columns.length !== tr.children.length) {
297
+ this.normalizedColumns = tr.children.map((item, i) => this.columns[i] || { width: 200 });
298
+ isGood = false;
299
+ }
300
+ const totalWidth = this.normalizedColumns.reduce((pre, cur) => {
301
+ return pre + cur.width;
302
+ }, 0);
303
+ if (totalWidth < this.theTableWrapperWidth) {
304
+ const lastColumnWidth = this.theTableWrapperWidth - totalWidth + this.normalizedColumns[this.normalizedColumns.length - 1].width;
305
+ this.normalizedColumns[this.normalizedColumns.length - 1] = { width: lastColumnWidth };
306
+ isGood = false;
307
+ }
308
+ if (isGood) {
309
+ this.normalizedColumns = null;
310
+ }
311
+ }
312
+ }
313
+ initializeColumns() {
314
+ if (!this.element.columns) {
315
+ const tr = this.element.children[0];
316
+ const tableWidth = AngularEditor.toDOMNode(this.editor, tr).offsetWidth;
317
+ const columns = tr.children.map(cell => {
318
+ return { width: Math.round(tableWidth / tr.children.length) - tr.children.length };
319
+ });
320
+ TheTransforms.setNode(this.editor, { columns }, this.element);
321
+ }
322
+ }
323
+ initializeRows() {
324
+ this.element.children.map(row => {
325
+ if (!row.height) {
326
+ const element = TheEditor.toDOMNode(this.editor, row);
327
+ TheTransforms.setNode(this.editor, { height: getElementHeight(element) }, row);
328
+ }
329
+ });
330
+ }
331
+ transformRowHeight() {
332
+ const rowElements = this.nativeElement.querySelector('tbody').children;
333
+ if (rowElements) {
334
+ [...rowElements].map((row, index) => {
335
+ const height = getElementHeight(row);
336
+ TheTransforms.setNode(this.editor, { height }, this.element.children[index]);
337
+ });
338
+ }
339
+ }
340
+ transformColumnsWidth() {
341
+ const cols = [...this.nativeElement.querySelector('colgroup').children];
342
+ const columns = cols.map(col => {
343
+ return { width: getElementWidth(col) };
344
+ });
345
+ TheTransforms.setNode(this.editor, { columns }, this.element);
346
+ }
347
+ onRowMouseDown(event, index) {
348
+ if (this.readonly)
349
+ return;
350
+ event.stopPropagation();
351
+ event.preventDefault();
352
+ if (!this.isInTable) {
353
+ const path = TheEditor.findPath(this.editor, this.element);
354
+ Transforms.select(this.editor, path);
355
+ }
356
+ this.tableStore.selectRow(this.editor, index);
357
+ this.tableService.openToolbar(event.target, true);
358
+ }
359
+ onSelectTable(event) {
360
+ event.stopPropagation();
361
+ event.preventDefault();
362
+ this.tableStore.selectTable(this.editor);
363
+ this.tableService.openToolbar(event.target);
364
+ }
365
+ listenTableContextMenuEvent() {
366
+ this.ngZone.runOutsideAngular(() => {
367
+ fromEvent(this.theTableElement.nativeElement, 'contextmenu')
368
+ .pipe(takeUntil(this.destroy$))
369
+ .subscribe(event => {
370
+ if (this.readonly) {
371
+ return;
372
+ }
373
+ event.preventDefault();
374
+ this.tableStore.isRightClicking = true;
375
+ const cell = event.target.closest(SLA_TABLE_CELL_SELECTOR);
376
+ if (!cell) {
377
+ return;
378
+ }
379
+ else {
380
+ if (!cell.classList.contains('selected-cell')) {
381
+ this.tableStore.selectCell(cell, this.editor);
382
+ }
383
+ }
384
+ if (this.theTableContextMenuService.isOpened) {
385
+ this.theTableContextMenuService
386
+ .closeContextMenu()
387
+ .pipe(take(1))
388
+ .subscribe(() => {
389
+ this.theTableContextMenuService.openMenuList(event);
390
+ });
391
+ }
392
+ else if (this.tableService.isOpened) {
393
+ this.tableService
394
+ .closeToolbar()
395
+ .pipe(take(1))
396
+ .subscribe(() => {
397
+ this.theTableContextMenuService.openMenuList(event);
398
+ });
399
+ }
400
+ else {
401
+ this.cdr.markForCheck();
402
+ this.theTableContextMenuService.openMenuList(event);
403
+ }
404
+ // patch for right click select next cell
405
+ setTimeout(() => {
406
+ Transforms.select(this.editor, this.editor.selection.anchor.path);
407
+ });
408
+ });
409
+ });
410
+ }
411
+ trackByFnRowControls(index) {
412
+ return index;
413
+ }
414
+ trackByFnColControls(index) {
415
+ return index;
416
+ }
417
+ ngOnDestroy() {
418
+ super.ngOnDestroy();
419
+ this.destroy$.next();
420
+ this.destroy$.complete();
421
+ }
422
+ }
423
+ TheTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: TheTableComponent, deps: [{ token: i0.ElementRef }, { token: i1.TableCellEventDispatcher }, { token: i2.ColumnResizeNotifierSource }, { token: i3.TableStore }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i4.TableService }, { token: i5.TheContextService }, { token: i6.TheTableContextMenuService }], target: i0.ɵɵFactoryTarget.Component });
424
+ TheTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.8", type: TheTableComponent, selector: "the-table, [theTable]", host: { listeners: { "mousedown": "handleMousedown($event)" } }, providers: [
425
+ TableStore,
426
+ TableService,
427
+ TheTableContextMenuService,
428
+ TableCellEventDispatcher,
429
+ ColumnResizeNotifierSource,
430
+ {
431
+ provide: TheTableToken,
432
+ useExisting: TheTableComponent
433
+ }
434
+ ], viewQueries: [{ propertyName: "tableWrapper", first: true, predicate: ["tableWrapper"], descendants: true, read: ElementRef, static: true }, { propertyName: "theTableElement", first: true, predicate: ["theTable"], descendants: true, read: ElementRef, static: true }, { propertyName: "tbodyElement", first: true, predicate: ["tbody"], descendants: true, read: ElementRef, static: true }], usesInheritance: true, ngImport: i0, template: "<!-- \u7C7B\u540D the-temp-*: \u4E34\u65F6\u89E3\u51B3\u56E0\u53D7portal\u5F71\u54CD\u8868\u683C\u6837\u5F0F\u95EE\u9898\uFF0C\u540E\u671F\u6539\u56DEthe-* -->\n<div\n class=\"the-temp-table-container\"\n theColumnResize\n [ngClass]=\"{\n 'the-temp-table-with-controls': isInTable,\n 'the-temp-numbered-column-container': element?.options?.numberedColumn,\n 'the-temp-table-selection-hide': tableStore.isCellSelecting || tableStore.isRightClicking\n }\"\n>\n <div\n class=\"the-temp-table-row-controls-wrapper\"\n [ngClass]=\"{\n 'the-temp-table-focus': isInTable\n }\"\n >\n <div\n class=\"the-temp-table-corner-controls\"\n [ngClass]=\"{\n visible: !readonly && isInTable,\n active: isSelectedAllCell,\n dangerous: tableStore.isSelectedTable && tableStore.dangerousCells.length > 0\n }\"\n >\n <div class=\"the-temp-table-corner-button\" (mousedown)=\"onSelectTable($event)\"></div>\n <div class=\"the-temp-table-corner-controls-insert-row-marker\">\n <the-table-insert-mark type=\"row\" [at]=\"0\" [tableStore]=\"tableStore\"></the-table-insert-mark>\n </div>\n <div class=\"the-temp-table-corner-controls-insert-column-marker\">\n <the-table-insert-mark type=\"column\" [at]=\"0\" [tableStore]=\"tableStore\"></the-table-insert-mark>\n </div>\n </div>\n <div class=\"the-temp-table-row-controls\">\n <div class=\"the-temp-table-row-controls-inner\">\n <div\n class=\"the-temp-table-row-controls-button-wrap\"\n *ngFor=\"let control of rowControls; let i = index; trackBy: trackByFnRowControls\"\n [ngClass]=\"{\n active: tableStore.selectedRowsIndex.includes(control.rowIndex),\n dangerous: tableStore.dangerousRowsIndex.includes(control.rowIndex) && tableStore.dangerousCells.length > 0\n }\"\n >\n <ng-container *ngIf=\"!readonly && isInTable && !element?.options?.numberedColumn\">\n <button\n (mousedown)=\"onRowMouseDown($event, control.rowIndex)\"\n type=\"button\"\n [ngStyle]=\"{ height: control.height + 1 + 'px' }\"\n class=\"the-temp-table-row-controls-button the-temp-table-controls-button\"\n ></button>\n </ng-container>\n <ng-container *ngIf=\"element?.options?.numberedColumn\">\n <div\n [contentEditable]=\"false\"\n contenteditable=\"false\"\n (mousedown)=\"onRowMouseDown($event, control.rowIndex)\"\n class=\"the-temp-table-numbered-controls-button\"\n [ngStyle]=\"{ height: control.height + 1 + 'px' }\"\n >\n <p class=\"row-number d-flex align-items-center\">{{ i + 1 }}</p>\n </div>\n </ng-container>\n <the-table-insert-mark type=\"row\" [at]=\"control.rowIndex + 1\" [tableStore]=\"tableStore\"> </the-table-insert-mark>\n </div>\n </div>\n </div>\n </div>\n <div class=\"the-temp-table-wrapper\" #tableWrapper [ngClass]=\"{ 'the-temp-table-numbered': element?.options?.numberedColumn }\">\n <table class=\"the-temp-table\" #theTable [ngClass]=\"{ 'the-temp-table-with-controls': isInTable }\">\n <colgroup *ngIf=\"columns\">\n <col *ngFor=\"let col of columns\" [ngStyle]=\"{ width: col.width + 'px' }\" />\n </colgroup>\n <thead>\n <tr class=\"the-temp-table-col-controls-wrapper\">\n <th\n class=\"the-temp-table-col-controls\"\n [ngClass]=\"{\n active: tableStore.selectedColumnsIndex.includes(i),\n dangerous: tableStore.dangerousColumnsIndex.includes(i) && tableStore.dangerousCells.length > 0\n }\"\n (mousedown)=\"onColMouseDown($event, i)\"\n *ngFor=\"let control of colControls; let i = index; trackBy: trackByFnColControls\"\n >\n <the-table-insert-mark *ngIf=\"isInTable\" type=\"column\" [at]=\"i + 1\" [tableStore]=\"tableStore\">\n </the-table-insert-mark>\n </th>\n </tr>\n </thead>\n <tbody #tbody>\n <slate-children [children]=\"children\" [context]=\"childrenContext\" [viewContext]=\"viewContext\"> </slate-children>\n </tbody>\n </table>\n </div>\n</div>\n", components: [{ type: i7.TheInsertMarkComponent, selector: "the-table-insert-mark", inputs: ["type", "at", "tableStore"] }, { type: i8.SlateChildrenComponent, selector: "slate-children", inputs: ["children", "context", "viewContext"] }], directives: [{ type: i9.TheColumnResizeDirective, selector: "div[theColumnResize]" }, { type: i10.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
435
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: TheTableComponent, decorators: [{
436
+ type: Component,
437
+ args: [{ selector: 'the-table, [theTable]', providers: [
438
+ TableStore,
439
+ TableService,
440
+ TheTableContextMenuService,
441
+ TableCellEventDispatcher,
442
+ ColumnResizeNotifierSource,
443
+ {
444
+ provide: TheTableToken,
445
+ useExisting: TheTableComponent
446
+ }
447
+ ], template: "<!-- \u7C7B\u540D the-temp-*: \u4E34\u65F6\u89E3\u51B3\u56E0\u53D7portal\u5F71\u54CD\u8868\u683C\u6837\u5F0F\u95EE\u9898\uFF0C\u540E\u671F\u6539\u56DEthe-* -->\n<div\n class=\"the-temp-table-container\"\n theColumnResize\n [ngClass]=\"{\n 'the-temp-table-with-controls': isInTable,\n 'the-temp-numbered-column-container': element?.options?.numberedColumn,\n 'the-temp-table-selection-hide': tableStore.isCellSelecting || tableStore.isRightClicking\n }\"\n>\n <div\n class=\"the-temp-table-row-controls-wrapper\"\n [ngClass]=\"{\n 'the-temp-table-focus': isInTable\n }\"\n >\n <div\n class=\"the-temp-table-corner-controls\"\n [ngClass]=\"{\n visible: !readonly && isInTable,\n active: isSelectedAllCell,\n dangerous: tableStore.isSelectedTable && tableStore.dangerousCells.length > 0\n }\"\n >\n <div class=\"the-temp-table-corner-button\" (mousedown)=\"onSelectTable($event)\"></div>\n <div class=\"the-temp-table-corner-controls-insert-row-marker\">\n <the-table-insert-mark type=\"row\" [at]=\"0\" [tableStore]=\"tableStore\"></the-table-insert-mark>\n </div>\n <div class=\"the-temp-table-corner-controls-insert-column-marker\">\n <the-table-insert-mark type=\"column\" [at]=\"0\" [tableStore]=\"tableStore\"></the-table-insert-mark>\n </div>\n </div>\n <div class=\"the-temp-table-row-controls\">\n <div class=\"the-temp-table-row-controls-inner\">\n <div\n class=\"the-temp-table-row-controls-button-wrap\"\n *ngFor=\"let control of rowControls; let i = index; trackBy: trackByFnRowControls\"\n [ngClass]=\"{\n active: tableStore.selectedRowsIndex.includes(control.rowIndex),\n dangerous: tableStore.dangerousRowsIndex.includes(control.rowIndex) && tableStore.dangerousCells.length > 0\n }\"\n >\n <ng-container *ngIf=\"!readonly && isInTable && !element?.options?.numberedColumn\">\n <button\n (mousedown)=\"onRowMouseDown($event, control.rowIndex)\"\n type=\"button\"\n [ngStyle]=\"{ height: control.height + 1 + 'px' }\"\n class=\"the-temp-table-row-controls-button the-temp-table-controls-button\"\n ></button>\n </ng-container>\n <ng-container *ngIf=\"element?.options?.numberedColumn\">\n <div\n [contentEditable]=\"false\"\n contenteditable=\"false\"\n (mousedown)=\"onRowMouseDown($event, control.rowIndex)\"\n class=\"the-temp-table-numbered-controls-button\"\n [ngStyle]=\"{ height: control.height + 1 + 'px' }\"\n >\n <p class=\"row-number d-flex align-items-center\">{{ i + 1 }}</p>\n </div>\n </ng-container>\n <the-table-insert-mark type=\"row\" [at]=\"control.rowIndex + 1\" [tableStore]=\"tableStore\"> </the-table-insert-mark>\n </div>\n </div>\n </div>\n </div>\n <div class=\"the-temp-table-wrapper\" #tableWrapper [ngClass]=\"{ 'the-temp-table-numbered': element?.options?.numberedColumn }\">\n <table class=\"the-temp-table\" #theTable [ngClass]=\"{ 'the-temp-table-with-controls': isInTable }\">\n <colgroup *ngIf=\"columns\">\n <col *ngFor=\"let col of columns\" [ngStyle]=\"{ width: col.width + 'px' }\" />\n </colgroup>\n <thead>\n <tr class=\"the-temp-table-col-controls-wrapper\">\n <th\n class=\"the-temp-table-col-controls\"\n [ngClass]=\"{\n active: tableStore.selectedColumnsIndex.includes(i),\n dangerous: tableStore.dangerousColumnsIndex.includes(i) && tableStore.dangerousCells.length > 0\n }\"\n (mousedown)=\"onColMouseDown($event, i)\"\n *ngFor=\"let control of colControls; let i = index; trackBy: trackByFnColControls\"\n >\n <the-table-insert-mark *ngIf=\"isInTable\" type=\"column\" [at]=\"i + 1\" [tableStore]=\"tableStore\">\n </the-table-insert-mark>\n </th>\n </tr>\n </thead>\n <tbody #tbody>\n <slate-children [children]=\"children\" [context]=\"childrenContext\" [viewContext]=\"viewContext\"> </slate-children>\n </tbody>\n </table>\n </div>\n</div>\n" }]
448
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.TableCellEventDispatcher }, { type: i2.ColumnResizeNotifierSource }, { type: i3.TableStore }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i4.TableService }, { type: i5.TheContextService }, { type: i6.TheTableContextMenuService }]; }, propDecorators: { tableWrapper: [{
449
+ type: ViewChild,
450
+ args: ['tableWrapper', { read: ElementRef, static: true }]
451
+ }], theTableElement: [{
452
+ type: ViewChild,
453
+ args: ['theTable', { read: ElementRef, static: true }]
454
+ }], tbodyElement: [{
455
+ type: ViewChild,
456
+ args: ['tbody', { read: ElementRef, static: true }]
457
+ }], handleMousedown: [{
458
+ type: HostListener,
459
+ args: ['mousedown', ['$event']]
460
+ }] } });
461
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvc3JjL3BsdWdpbnMvdGFibGUvY29tcG9uZW50cy90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9zcmMvcGx1Z2lucy90YWJsZS9jb21wb25lbnRzL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsVUFBVSxFQUF1RCxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVJLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9ELE9BQU8sRUFBVSxVQUFVLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDM0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDBEQUEwRCxDQUFDO0FBQ3RHLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG9EQUFvRCxDQUFDO0FBQzlGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDdkUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBRXpGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRXhFLE9BQU8sRUFBRSxZQUFZLEVB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QUFFLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFJekQsWUFBWTtzQkFEWCxTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFJdEQsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBFbGVtZW50UmVmLCBPbkRlc3Ryb3ksIENoYW5nZURldGVjdG9yUmVmLCBOZ1pvbmUsIEFmdGVyVmlld0luaXQsIFZpZXdDaGlsZCwgSG9zdExpc3RlbmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBmcm9tRXZlbnQsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2UsIHRha2VVbnRpbCwgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRWRpdG9yLCBUcmFuc2Zvcm1zIH0gZnJvbSAnc2xhdGUnO1xuaW1wb3J0IHsgQW5ndWxhckVkaXRvciB9IGZyb20gJ3NsYXRlLWFuZ3VsYXInO1xuaW1wb3J0IHsgVGFibGVQb3NpdGlvbiB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IENvbHVtblJlc2l6ZU5vdGlmaWVyU291cmNlIH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cy9jb2x1bW4tcmVzaXplL2NvbHVtbi1yZXNpemUtbm90aWZpZXInO1xuaW1wb3J0IHsgVGFibGVDZWxsRXZlbnREaXNwYXRjaGVyIH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cy9jb2x1bW4tcmVzaXplL2V2ZW50LWRpc3BhdGNoZXInO1xuaW1wb3J0IHsgVGFibGVTdG9yZSB9IGZyb20gJy4uL3RhYmxlLnN0b3JlJztcbmltcG9ydCB7IGdldEVsZW1lbnRIZWlnaHQsIGdldEVsZW1lbnRXaWR0aCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2RvbSc7XG5pbXBvcnQgeyBUYWJsZVNlcnZpY2UgfSBmcm9tICcuLi90YWJsZS5zZXJ2aWNlJztcbmltcG9ydCB7IFRoZVRhYmxlQ29udGV4dE1lbnVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdGFibGUtY29udGV4dG1lbnUuc2VydmljZSc7XG5pbXBvcnQgeyBUaGVDb250ZXh0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NvbnRleHQuc2VydmljZSc7XG5pbXBvcnQgeyBUaGVCYXNlRWxlbWVudENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMvdmlldy1iYXNlJztcbmltcG9ydCB7IFRhYmxlQ2VsbEVsZW1lbnQsIFRhYmxlRWxlbWVudCwgVGFibGVSb3dFbGVtZW50IH0gZnJvbSAnLi4vLi4vLi4vY3VzdG9tLXR5cGVzJztcbmltcG9ydCB7IFRhYmxlT3B0aW9ucywgVGhlVGFibGVDb2x1bW4sIFRoZVRhYmxlVG9rZW4gfSBmcm9tICcuLi90YWJsZS50eXBlcyc7XG5pbXBvcnQgeyBUaGVFZGl0b3IgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzL2VkaXRvcic7XG5pbXBvcnQgeyBTTEFfVEFCTEVfQ0VMTF9TRUxFQ1RPUiB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy9zZWxlY3Rvcic7XG5pbXBvcnQgKiBhcyBUaGVUcmFuc2Zvcm1zIGZyb20gJy4uLy4uLy4uL3RyYW5zZm9ybXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3RoZS10YWJsZSwgW3RoZVRhYmxlXScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgVGFibGVTdG9yZSxcbiAgICAgICAgVGFibGVTZXJ2aWNlLFxuICAgICAgICBUaGVUYWJsZUNvbnRleHRNZW51U2VydmljZSxcbiAgICAgICAgVGFibGVDZWxsRXZlbnREaXNwYXRjaGVyLFxuICAgICAgICBDb2x1bW5SZXNpemVOb3RpZmllclNvdXJjZSxcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogVGhlVGFibGVUb2tlbixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBUaGVUYWJsZUNvbXBvbmVudFxuICAgICAgICB9XG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBUaGVUYWJsZUNvbXBvbmVudCBleHRlbmRzIFRoZUJhc2VFbGVtZW50Q29tcG9uZW50PFRhYmxlRWxlbWVudCwgRWRpdG9yPiBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgICBkZXN0cm95JDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3QoKTtcbiAgICB0aGVUYWJsZVdyYXBwZXJXaWR0aDogbnVtYmVyO1xuXG4gICAgcm93Q29udHJvbHM6IHsgaGVpZ2h0OiBudW1iZXI7IHJvd0luZGV4OiBudW1iZXIgfVtdID0gW107XG5cbiAgICBjb2xDb250cm9scyA9IFtdO1xuXG4gICAgbm9ybWFsaXplZENvbHVtbnM6IFRoZVRhYmxlQ29sdW1uW107XG5cbiAgICBpc0luVGFibGU6IGJvb2xlYW47XG5cbiAgICBnZXQgY29sdW1ucygpOiBUaGVUYWJsZUNvbHVtbltdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9ybWFsaXplZENvbHVtbnMgfHwgKHRoaXMuZWxlbWVudCAmJiB0aGlzLmVsZW1lbnQuY29sdW1ucyk7XG4gICAgfVxuXG4gICAgZ2V0IG5hdGl2ZUVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgZ2V0IHRib2R5TmF0aXZlRWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLnRib2R5RWxlbWVudD8ubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICBnZXQgaXNTZWxlY3RlZEFsbENlbGwoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuc2VsZWN0ZWRSb3dzSW5kZXgubGVuZ3RoID09PSB0aGlzLnJvd0NvbnRyb2xzLmxlbmd0aCAmJlxuICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLnNlbGVjdGVkQ29sdW1uc0luZGV4Lmxlbmd0aCA9PT0gdGhpcy5jb2xDb250cm9scy5sZW5ndGhcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBAVmlld0NoaWxkKCd0YWJsZVdyYXBwZXInLCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHRhYmxlV3JhcHBlcjogRWxlbWVudFJlZjtcblxuICAgIEBWaWV3Q2hpbGQoJ3RoZVRhYmxlJywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICB0aGVUYWJsZUVsZW1lbnQ6IEVsZW1lbnRSZWY7XG5cbiAgICBAVmlld0NoaWxkKCd0Ym9keScsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgdGJvZHlFbGVtZW50OiBFbGVtZW50UmVmO1xuXG4gICAgQEhvc3RMaXN0ZW5lcignbW91c2Vkb3duJywgWyckZXZlbnQnXSlcbiAgICBoYW5kbGVNb3VzZWRvd24oZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgdGhpcy50Ym9keU5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghVGhlRWRpdG9yLmlzRm9jdXNlZCh0aGlzLmVkaXRvcikpIHtcbiAgICAgICAgICAgIFRoZUVkaXRvci5mb2N1cyh0aGlzLmVkaXRvcik7XG4gICAgICAgIH1cbiAgICAgICAgQW5ndWxhckVkaXRvci5tb3ZlQmxvY2tDYXJkKHRoaXMuZWRpdG9yLCB0aGlzLmVsZW1lbnQsIHsgZGlyZWN0aW9uOiAnbGVmdCcgfSk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgb25Db250ZXh0Q2hhbmdlKCkge1xuICAgICAgICBzdXBlci5vbkNvbnRleHRDaGFuZ2UoKTtcbiAgICAgICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5lbWl0VGFibGVDaGFuZ2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZVJvd0NvbnRyb2xzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZ2V0SXNJblRhYmxlKCk7XG4gICAgICAgICAgICB0aGlzLmdldENvbENvbnRyb2xzKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5ub3JtYWxpemVkQ29sdW1ucykge1xuICAgICAgICAgICAgICAgIHRoaXMubm9ybWFsaXplU2hvd0NvbHVtbnMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBwdWJsaWMgZXZlbnREaXNwYXRjaGVyOiBUYWJsZUNlbGxFdmVudERpc3BhdGNoZXIsXG4gICAgICAgIHB1YmxpYyByZXNpemVOb3RpZmllcjogQ29sdW1uUmVzaXplTm90aWZpZXJTb3VyY2UsXG4gICAgICAgIHB1YmxpYyB0YWJsZVN0b3JlOiBUYWJsZVN0b3JlLFxuICAgICAgICBwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHVibGljIG5nWm9uZTogTmdab25lLFxuICAgICAgICBwdWJsaWMgdGFibGVTZXJ2aWNlOiBUYWJsZVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgdGhlQ29udGV4dFNlcnZpY2U6IFRoZUNvbnRleHRTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHRoZVRhYmxlQ29udGV4dE1lbnVTZXJ2aWNlOiBUaGVUYWJsZUNvbnRleHRNZW51U2VydmljZVxuICAgICkge1xuICAgICAgICBzdXBlcihlbGVtZW50UmVmLCBjZHIpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xuICAgICAgICB0aGlzLmdldENvbENvbnRyb2xzKCk7XG4gICAgICAgIHRoaXMuZ2V0SXNJblRhYmxlKCk7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLm5nWm9uZS5vblN0YWJsZS5waXBlKHRha2UoMSkpLnN1YnNjcmliZShhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBibG9ja0NhcmRFbGVtZW50ID0gdGhpcy5uYXRpdmVFbGVtZW50LmNsb3Nlc3QoJ3NsYXRlLWJsb2NrLWNhcmQnKTtcbiAgICAgICAgICAgIGlmIChibG9ja0NhcmRFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgYmxvY2tDYXJkRWxlbWVudC5jbGFzc0xpc3QuYWRkKGBzbGF0ZS1ibG9jay1jYXJkLSR7dGhpcy5lbGVtZW50LnR5cGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuaW5pdEVkaXRvcih0aGlzLmVkaXRvcik7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmliZUNlbGxzQ2hhbmdlKCk7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmliZUNlbGxQb3NpdGlvbkNoYW5nZSgpO1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5UYWJsZUNvbnRleHRNZW51RXZlbnQoKTtcbiAgICAgICAgICAgIHRoaXMudXNlVGFibGVXcmFwcGVyV2lkdGgoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmVsZW1lbnQub3B0aW9ucz8ubnVtYmVyZWRDb2x1bW4pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb2FkSW1hZ2VEb25lID0gYXdhaXQgdGhpcy5yZXNvbHZlSW1hZ2UoKTtcbiAgICAgICAgICAgICAgICAvLyDnrYnlvoXluo/lj7fliJfooajmoLzlhoXlm77niYfliqDovb3lrozmiJDlkI7lho3ljrvmuLLmn5PooajmoLzooYzpq5jluqZcbiAgICAgICAgICAgICAgICBpZiAobG9hZEltYWdlRG9uZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVzZVJvd0NvbnRyb2xzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudXNlUm93Q29udHJvbHMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3Vic2NyaWJlQ2VsbFBvc2l0aW9uQ2hhbmdlKCkge1xuICAgICAgICB0aGlzLnRhYmxlU3RvcmVcbiAgICAgICAgICAgIC5jZWxsc1Bvc2l0aW9uQ2hhbmdlKClcbiAgICAgICAgICAgIC5waXBlKGRlYm91bmNlVGltZSgxMDApLCB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHggPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHVzZVRhYmxlV3JhcHBlcldpZHRoKCkge1xuICAgICAgICBjb25zdCByb290V2lkdGggPSB0aGlzLnRoZUNvbnRleHRTZXJ2aWNlLmdldE9wdGlvbnMoKS53aWR0aDtcbiAgICAgICAgY29uc3QgdGFibGVQYXRoID0gVGhlRWRpdG9yLmZpbmRQYXRoKHRoaXMuZWRpdG9yLCB0aGlzLmVsZW1lbnQpO1xuICAgICAgICBpZiAodGFibGVQYXRoLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIC8vIOino+WGs3RhYmxl5LiN5Zyo6aG25bGC5pe277yM5ouW5Yqo5Y2V5YWD5qC85a695bqm6K6h566X6Zeu6aKYXG4gICAgICAgICAgICB0aGlzLnRoZVRhYmxlV3JhcHBlcldpZHRoID0gdGhpcy50YWJsZVdyYXBwZXIubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudGhlVGFibGVXcmFwcGVyV2lkdGggPSByb290V2lkdGg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdWJzY3JpYmVDZWxsc0NoYW5nZSgpIHtcbiAgICAgICAgdGhpcy50YWJsZVN0b3JlXG4gICAgICAgICAgICAuZGFuZ2Vyb3VzT3JTZWxlY3RlZENlbGxzQ2hhbmdlKClcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHVzZVJvd0NvbnRyb2xzKCkge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24gfHwgdGhpcy5lbGVtZW50Lm9wdGlvbnM/Lm51bWJlcmVkQ29sdW1uKSB7XG4gICAgICAgICAgICB0aGlzLnJvd0NvbnRyb2xzID0gdGhpcy5jYWxjdWxhdGVSb3dDb250cm9scygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGV0ZWN0Q2hhbmdlcygpIHtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIGNhbGN1bGF0ZU1pblJvd1NwYW5DZWxsRm9yUm93cygpOiB7IGNlbGw/OiBUYWJsZUNlbGxFbGVtZW50OyByb3dJbmRleDogbnVtYmVyIH1bXSB7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy5lbGVtZW50O1xuICAgICAgICBjb25zdCBjZWxscyA9IHRhYmxlLmNoaWxkcmVuLm1hcCgocm93LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgbm9IaWRkZW5DZWxscyA9IHJvdy5jaGlsZHJlbi5maWx0ZXIoY2VsbCA9PiAhY2VsbC5oaWRkZW4pO1xuICAgICAgICAgICAgaWYgKG5vSGlkZGVuQ2VsbHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1pblJvd3NwYW4gPSBNYXRoLm1pbi5hcHBseShcbiAgICAgICAgICAgICAgICAgICAgTWF0aCxcbiAgICAgICAgICAgICAgICAgICAgbm9IaWRkZW5DZWxscy5tYXAoY2VsbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2VsbC5yb3dzcGFuIHx8IDE7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGNlbGwgPSByb3cuY2hpbGRyZW4uZmluZChpdGVtID0+ICFpdGVtLmhpZGRlbiAmJiAoaXRlbS5yb3dzcGFuIHx8IDEpID09PSBtaW5Sb3dzcGFuKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBjZWxsLFxuICAgICAgICAgICAgICAgICAgICByb3dJbmRleDogaW5kZXhcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICByb3dJbmRleDogaW5kZXhcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNlbGxzO1xuICAgIH1cblxuICAgIGNhbGN1bGF0ZVJvd0NvbnRyb2xzKCkge1xuICAgICAgICBjb25zdCBtaW5Sb3dTcGFuQ2VsbEZvclJvd3MgPSB0aGlzLmNhbGN1bGF0ZU1pblJvd1NwYW5DZWxsRm9yUm93cygpO1xuXG4gICAgICAgIGNvbnN0IHJvd0NvbnRyb2xzID0gW107XG4gICAgICAgIGxldCBwcmV2aW91c1Jvd0luZGV4ID0gMDtcbiAgICAgICAgbGV0IHByZXZpb3VzQ29tYmluZVJvd0luZGV4ID0gMDtcbiAgICAgICAgbWluUm93U3BhbkNlbGxGb3JSb3dzLmZvckVhY2goKGNlbGxJbmZvLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFjZWxsSW5mby5jZWxsKSB7XG4gICAgICAgICAgICAgICAgcm93Q29udHJvbHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogMCxcbiAgICAgICAgICAgICAgICAgICAgcm93SW5kZXg6IGluZGV4XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcHJldmlvdXNDb21iaW5lUm93SW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IG1pblJvd1NwYW5DZWxsRm9yUm93cy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUm93Q29udHJvbHNBdmdIZWlnaHQocHJldmlvdXNDb21iaW5lUm93SW5kZXgsIHByZXZpb3VzUm93SW5kZXgsIHJvd0NvbnRyb2xzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjYWxjdWxhdGUgY29tYmluZSByb3cgaGVpZ2h0XG4gICAgICAgICAgICBpZiAocHJldmlvdXNDb21iaW5lUm93SW5kZXggPiBwcmV2aW91c1Jvd0luZGV4KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVSb3dDb250cm9sc0F2Z0hlaWdodChwcmV2aW91c0NvbWJpbmVSb3dJbmRleCwgcHJldmlvdXNSb3dJbmRleCwgcm93Q29udHJvbHMpO1xuICAgICAgICAgICAgICAgIHByZXZpb3VzQ29tYmluZVJvd0luZGV4ID0gMDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgY2VsbERvbSA9IEFuZ3VsYXJFZGl0b3IudG9ET01Ob2RlKHRoaXMuZWRpdG9yLCBjZWxsSW5mby5jZWxsKTtcbiAgICAgICAgICAgIGxldCBoZWlnaHQgPSBnZXRFbGVtZW50SGVpZ2h0KGNlbGxEb20pO1xuICAgICAgICAgICAgLy8g5b2TY2VsbOS4uuWQiOW5tueahOWNleWFg+agvChyb3dzcGFuID4gMSnvvIzorqHnrpflhbblrp7pmYXpq5jluqbvvIjlvZPliY3ljZXlhYPmoLznmoTpq5jluqYgLSDkuIvmlrnlkIjlubbljZXlhYPmoLznmoTpq5jluqbvvIlcbiAgICAgICAgICAgIGlmIChjZWxsSW5mby5jZWxsLnJvd3NwYW4gPiAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FsY0hlaWdodCA9IGhlaWdodCAtIHRoaXMuZ2V0QmVsb3dSb3dIZWlnaHQobWluUm93U3BhbkNlbGxGb3JSb3dzLCBpbmRleCwgY2VsbEluZm8ucm93SW5kZXgsIGNlbGxJbmZvLmNlbGwucm93c3Bhbik7XG4gICAgICAgICAgICAgICAgcm93Q29udHJvbHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogY2FsY0hlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgcm93SW5kZXg6IGNlbGxJbmZvLnJvd0luZGV4XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJvd0NvbnRyb2xzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgIHJvd0luZGV4OiBjZWxsSW5mby5yb3dJbmRleFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJldmlvdXNSb3dJbmRleCA9IGluZGV4O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJvd0NvbnRyb2xzO1xuICAgIH1cblxuICAgIGNhbGN1bGF0ZVJvd0NvbnRyb2xzQXZnSGVpZ2h0KFxuICAgICAgICBwcmV2aW91c0NvbWJpbmVSb3dJbmRleDogbnVtYmVyLFxuICAgICAgICBwcmV2aW91c1Jvd0luZGV4OiBudW1iZXIsXG4gICAgICAgIHJvd0NvbnRyb2xzOiB7IGhlaWdodDogbnVtYmVyOyByb3dJbmRleDogbnVtYmVyIH1bXVxuICAgICkge1xuICAgICAgICBjb25zdCByb3dDb250cm9sID0gcm93Q29udHJvbHNbcHJldmlvdXNSb3dJbmRleF07XG4gICAgICAgIGNvbnN0IGNvdW50ID0gcHJldmlvdXNDb21iaW5lUm93SW5kZXggLSBwcmV2aW91c1Jvd0luZGV4O1xuICAgICAgICBjb25zdCBhdmdIZWlnaHQgPSBNYXRoLmZsb29yKHJvd0NvbnRyb2wuaGVpZ2h0IC8gKGNvdW50ICsgMSkpO1xuICAgICAgICBjb25zdCBmaXJzdEhlaWdodCA9IHJvd0NvbnRyb2wuaGVpZ2h0IC0gYXZnSGVpZ2h0ICogY291bnQ7XG4gICAgICAgIHJvd0NvbnRyb2wuaGVpZ2h0ID0gZmlyc3RIZWlnaHQ7XG4gICAgICAgIHJvd0NvbnRyb2xzXG4gICAgICAgICAgICAuZmlsdGVyKChpdGVtLCBfaW5kZXgpID0+IF9pbmRleCA+IHByZXZpb3VzUm93SW5kZXggJiYgX2luZGV4IDw9IHByZXZpb3VzQ29tYmluZVJvd0luZGV4KVxuICAgICAgICAgICAgLmZvckVhY2gocm93Q29udHJvbCA9PiB7XG4gICAgICAgICAgICAgICAgcm93Q29udHJvbC5oZWlnaHQgPSBhdmdIZWlnaHQ7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRCZWxvd1Jvd0hlaWdodChcbiAgICAgICAgY2VsbHM6IHtcbiAgICAgICAgICAgIGNlbGw/OiBUYWJsZUNlbGxFbGVtZW50O1xuICAgICAgICAgICAgcm93SW5kZXg6IG51bWJlcjtcbiAgICAgICAgfVtdLFxuICAgICAgICBpbmRleDogbnVtYmVyLFxuICAgICAgICByb3dJbmRleDogbnVtYmVyLFxuICAgICAgICByb3dzcGFuOiBudW1iZXJcbiAgICApIHtcbiAgICAgICAgbGV0IGJlbG93Um93bEhlaWdodCA9IDA7XG4gICAgICAgIGNlbGxzLnNsaWNlKGluZGV4ICsgMSwgY2VsbHMubGVuZ3RoKS5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICBpZiAoIWl0ZW0uY2VsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyb3dJbmRleCArIHJvd3NwYW4gPiBpdGVtLnJvd0luZGV4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2VsbERvbSA9IEFuZ3VsYXJFZGl0b3IudG9ET01Ob2RlKHRoaXMuZWRpdG9yLCBpdGVtLmNlbGwpO1xuICAgICAgICAgICAgICAgIGlmIChpdGVtLmNlbGwucm93c3BhbiA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8g5aaC5p6c5LiL5pa55Y2V5YWD5qC855qEcm93c3BhbiA+IDHvvIzpgJLlvZLorqHnrpdcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5nZXRCZWxvd1Jvd0hlaWdodChcbiAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxzLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2VsbHMuZmluZEluZGV4KGNlbGwgPT4gY2VsbC5yb3dJbmRleCA9PT0gaXRlbS5yb3dJbmRleCksXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnJvd0luZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5jZWxsLnJvd3NwYW5cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgYmVsb3dSb3dsSGVpZ2h0ICs9IGdldEVsZW1lbnRIZWlnaHQoY2VsbERvbSkgLSBoZWlnaHQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYmVsb3dSb3dsSGVpZ2h0ICs9IGdldEVsZW1lbnRIZWlnaHQoY2VsbERvbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGJlbG93Um93bEhlaWdodDtcbiAgICB9XG5cbiAgICByZXNvbHZlSW1hZ2UoKSB7XG4gICAgICAgIGNvbnN0IGltYWdlRWxlbWVudHMgPSB0aGlzLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW1nJyk7XG4gICAgICAgIGlmIChpbWFnZUVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgaW1hZ2VSZXNvbHZlczogUHJvbWlzZTxhbnk+W10gPSBbXTtcbiAgICAgICAgICAgIGltYWdlRWxlbWVudHMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbWFnZSA9IG5ldyBJbWFnZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGltYWdlTG9hZCA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpbWFnZS5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpbWFnZS5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2Uuc3JjID0gaXRlbS5nZXRBdHRyaWJ1dGUoJ3NyYycpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGltYWdlUmVzb2x2ZXMucHVzaChpbWFnZUxvYWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoaW1hZ2VSZXNvbHZlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcbiAgICB9XG5cbiAgICBnZXRDb2xDb250cm9scygpIHtcbiAgICAgICAgdGhpcy5jb2xDb250cm9scyA9IHRoaXMuZWxlbWVudD8uY2hpbGRyZW5bMF0/LmNoaWxkcmVuIHx8IFtdO1xuICAgIH1cblxuICAgIG9uQ29sTW91c2VEb3duKGV2ZW50OiBNb3VzZUV2ZW50LCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAoISF0aGlzLnNlbGVjdGlvbiAmJiB0aGlzLmlzSW5UYWJsZSkge1xuICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLmNsZWFyRGFuZ2Vyb3VzQ2VsbHMoKTtcbiAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5zZWxlY3RDb2x1bW4odGhpcy5lZGl0b3IsIGluZGV4KTtcbiAgICAgICAgICAgIHRoaXMudGFibGVTZXJ2aWNlLm9wZW5Ub29sYmFyKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRJc0luVGFibGUoKSB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgY29uc3Qgb3B0cyA9IG5ldyBUYWJsZU9wdGlvbnMoKTtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuZWRpdG9yLnNlbGVjdGlvbjtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0UG9zaXRpb24gPSBUYWJsZVBvc2l0aW9uLmNyZWF0ZShvcHRzLCB0aGlzLmVkaXRvciwgc2VsZWN0aW9uLmFuY2hvci5wYXRoKTtcbiAgICAgICAgICAgIGNvbnN0IGVuZFBvc2l0aW9uID0gVGFibGVQb3NpdGlvbi5jcmVhdGUob3B0cywgdGhpcy5lZGl0b3IsIHNlbGVjdGlvbi5mb2N1cy5wYXRoKTtcbiAgICAgICAgICAgIHRoaXMuaXNJblRhYmxlID0gc3RhcnRQb3NpdGlvbi5pc0luVGFibGUoKSAmJiBlbmRQb3NpdGlvbi5pc0luVGFibGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaXNJblRhYmxlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBub3JtYWxpemVTaG93Q29sdW1ucygpIHtcbiAgICAgICAgY29uc3QgdGFibGUgPSB0aGlzLmVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHRyID0gdGFibGUuY2hpbGRyZW5bMF07XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuY29sdW1ucykge1xuICAgICAgICAgICAgbGV0IGlzR29vZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZWRDb2x1bW5zID0gdGFibGUuY29sdW1ucy5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uaXRlbSB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAodGhpcy5lbGVtZW50LmNvbHVtbnMubGVuZ3RoICE9PSB0ci5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZWRDb2x1bW5zID0gdHIuY2hpbGRyZW4ubWFwKChpdGVtLCBpKSA9PiB0aGlzLmNvbHVtbnNbaV0gfHwgeyB3aWR0aDogMjAwIH0pO1xuICAgICAgICAgICAgICAgIGlzR29vZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdG90YWxXaWR0aCA9IHRoaXMubm9ybWFsaXplZENvbHVtbnMucmVkdWNlKChwcmUsIGN1cikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcmUgKyBjdXIud2lkdGg7XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgIGlmICh0b3RhbFdpZHRoIDwgdGhpcy50aGVUYWJsZVdyYXBwZXJXaWR0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RDb2x1bW5XaWR0aCA9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGhlVGFibGVXcmFwcGVyV2lkdGggLSB0b3RhbFdpZHRoICsgdGhpcy5ub3JtYWxpemVkQ29sdW1uc1t0aGlzLm5vcm1hbGl6ZWRDb2x1bW5zLmxlbmd0aCAtIDFdLndpZHRoO1xuICAgICAgICAgICAgICAgIHRoaXMubm9ybWFsaXplZENvbHVtbnNbdGhpcy5ub3JtYWxpemVkQ29sdW1ucy5sZW5ndGggLSAxXSA9IHsgd2lkdGg6IGxhc3RDb2x1bW5XaWR0aCB9O1xuICAgICAgICAgICAgICAgIGlzR29vZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzR29vZCkge1xuICAgICAgICAgICAgICAgIHRoaXMubm9ybWFsaXplZENvbHVtbnMgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW5pdGlhbGl6ZUNvbHVtbnMoKSB7XG4gICAgICAgIGlmICghdGhpcy5lbGVtZW50LmNvbHVtbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHRyID0gdGhpcy5lbGVtZW50LmNoaWxkcmVuWzBdIGFzIFRhYmxlUm93RWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlV2lkdGggPSBBbmd1bGFyRWRpdG9yLnRvRE9NTm9kZSh0aGlzLmVkaXRvciwgdHIpLm9mZnNldFdpZHRoO1xuICAgICAgICAgICAgY29uc3QgY29sdW1ucyA9IHRyLmNoaWxkcmVuLm1hcChjZWxsID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB3aWR0aDogTWF0aC5yb3VuZCh0YWJsZVdpZHRoIC8gdHIuY2hpbGRyZW4ubGVuZ3RoKSAtIHRyLmNoaWxkcmVuLmxlbmd0aCB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBUaGVUcmFuc2Zvcm1zLnNldE5vZGUodGhpcy5lZGl0b3IsIHsgY29sdW1ucyB9LCB0aGlzLmVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW5pdGlhbGl6ZVJvd3MoKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudC5jaGlsZHJlbi5tYXAocm93ID0+IHtcbiAgICAgICAgICAgIGlmICghcm93LmhlaWdodCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBUaGVFZGl0b3IudG9ET01Ob2RlKHRoaXMuZWRpdG9yLCByb3cpO1xuICAgICAgICAgICAgICAgIFRoZVRyYW5zZm9ybXMuc2V0Tm9kZSh0aGlzLmVkaXRvciwgeyBoZWlnaHQ6IGdldEVsZW1lbnRIZWlnaHQoZWxlbWVudCkgfSwgcm93KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdHJhbnNmb3JtUm93SGVpZ2h0KCkge1xuICAgICAgICBjb25zdCByb3dFbGVtZW50cyA9IHRoaXMubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCd0Ym9keScpLmNoaWxkcmVuO1xuICAgICAgICBpZiAocm93RWxlbWVudHMpIHtcbiAgICAgICAgICAgIChbLi4ucm93RWxlbWVudHNdIGFzIEhUTUxUYWJsZVJvd0VsZW1lbnRbXSkubWFwKChyb3csIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gZ2V0RWxlbWVudEhlaWdodChyb3cpO1xuICAgICAgICAgICAgICAgIFRoZVRyYW5zZm9ybXMuc2V0Tm9kZSh0aGlzLmVkaXRvciwgeyBoZWlnaHQgfSwgdGhpcy5lbGVtZW50LmNoaWxkcmVuW2luZGV4XSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRyYW5zZm9ybUNvbHVtbnNXaWR0aCgpIHtcbiAgICAgICAgY29uc3QgY29scyA9IFsuLi50aGlzLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignY29sZ3JvdXAnKS5jaGlsZHJlbl0gYXMgSFRNTFRhYmxlQ29sRWxlbWVudFtdO1xuICAgICAgICBjb25zdCBjb2x1bW5zOiBUaGVUYWJsZUNvbHVtbltdID0gY29scy5tYXAoY29sID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7IHdpZHRoOiBnZXRFbGVtZW50V2lkdGgoY29sKSB9O1xuICAgICAgICB9KTtcbiAgICAgICAgVGhlVHJhbnNmb3Jtcy5zZXROb2RlKHRoaXMuZWRpdG9yLCB7IGNvbHVtbnMgfSwgdGhpcy5lbGVtZW50KTtcbiAgICB9XG5cbiAgICBvblJvd01vdXNlRG93bihldmVudDogTW91c2VFdmVudCwgaW5kZXg6IG51bWJlcikge1xuICAgICAgICBpZiAodGhpcy5yZWFkb25seSkgcmV0dXJuO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5UYWJsZSkge1xuICAgICAgICAgICAgY29uc3QgcGF0aCA9IFRoZUVkaXRvci5maW5kUGF0aCh0aGlzLmVkaXRvciwgdGhpcy5lbGVtZW50KTtcbiAgICAgICAgICAgIFRyYW5zZm9ybXMuc2VsZWN0KHRoaXMuZWRpdG9yLCBwYXRoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRhYmxlU3RvcmUuc2VsZWN0Um93KHRoaXMuZWRpdG9yLCBpbmRleCk7XG4gICAgICAgIHRoaXMudGFibGVTZXJ2aWNlLm9wZW5Ub29sYmFyKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgb25TZWxlY3RUYWJsZShldmVudDogTW91c2VFdmVudCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy50YWJsZVN0b3JlLnNlbGVjdFRhYmxlKHRoaXMuZWRpdG9yKTtcbiAgICAgICAgdGhpcy50YWJsZVNlcnZpY2Uub3BlblRvb2xiYXIoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbiAgICB9XG5cbiAgICBsaXN0ZW5UYWJsZUNvbnRleHRNZW51RXZlbnQoKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIGZyb21FdmVudDxNb3VzZUV2ZW50Pih0aGlzLnRoZVRhYmxlRWxlbWVudC5uYXRpdmVFbGVtZW50LCAnY29udGV4dG1lbnUnKVxuICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZG9ubHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuaXNSaWdodENsaWNraW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2VsbCA9IChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoU0xBX1RBQkxFX0NFTExfU0VMRUNUT1IpIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNlbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2VsbC5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkLWNlbGwnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5zZWxlY3RDZWxsKGNlbGwsIHRoaXMuZWRpdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50aGVUYWJsZUNvbnRleHRNZW51U2VydmljZS5pc09wZW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aGVUYWJsZUNvbnRleHRNZW51U2VydmljZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jbG9zZUNvbnRleHRNZW51KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRoZVRhYmxlQ29udGV4dE1lbnVTZXJ2aWNlLm9wZW5NZW51TGlzdChldmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy50YWJsZVNlcnZpY2UuaXNPcGVuZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVTZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNsb3NlVG9vbGJhcigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aGVUYWJsZUNvbnRleHRNZW51U2VydmljZS5vcGVuTWVudUxpc3QoZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRoZVRhYmxlQ29udGV4dE1lbnVTZXJ2aWNlLm9wZW5NZW51TGlzdChldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBwYXRjaCBmb3IgcmlnaHQgY2xpY2sgc2VsZWN0IG5leHQgY2VsbFxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMuc2VsZWN0KHRoaXMuZWRpdG9yLCB0aGlzLmVkaXRvci5zZWxlY3Rpb24uYW5jaG9yLnBhdGgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdHJhY2tCeUZuUm93Q29udHJvbHMoaW5kZXg6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuXG4gICAgdHJhY2tCeUZuQ29sQ29udHJvbHMoaW5kZXg6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgfVxufVxuIiwiPCEtLSDnsbvlkI0gdGhlLXRlbXAtKjog5Li05pe26Kej5Yaz5Zug5Y+XcG9ydGFs5b2x5ZON6KGo5qC85qC35byP6Zeu6aKY77yM5ZCO5pyf5pS55ZuedGhlLSogLS0+XG48ZGl2XG4gICAgY2xhc3M9XCJ0aGUtdGVtcC10YWJsZS1jb250YWluZXJcIlxuICAgIHRoZUNvbHVtblJlc2l6ZVxuICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgJ3RoZS10ZW1wLXRhYmxlLXdpdGgtY29udHJvbHMnOiBpc0luVGFibGUsXG4gICAgICAgICd0aGUtdGVtcC1udW1iZXJlZC1jb2x1bW4tY29udGFpbmVyJzogZWxlbWVudD8ub3B0aW9ucz8ubnVtYmVyZWRDb2x1bW4sXG4gICAgICAgICd0aGUtdGVtcC10YWJsZS1zZWxlY3Rpb24taGlkZSc6IHRhYmxlU3RvcmUuaXNDZWxsU2VsZWN0aW5nIHx8IHRhYmxlU3RvcmUuaXNSaWdodENsaWNraW5nXG4gICAgfVwiXG4+XG4gICAgPGRpdlxuICAgICAgICBjbGFzcz1cInRoZS10ZW1wLXRhYmxlLXJvdy1jb250cm9scy13cmFwcGVyXCJcbiAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgJ3RoZS10ZW1wLXRhYmxlLWZvY3VzJzogaXNJblRhYmxlXG4gICAgICAgIH1cIlxuICAgID5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJ0aGUtdGVtcC10YWJsZS1jb3JuZXItY29udHJvbHNcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgIHZpc2libGU6ICFyZWFkb25seSAmJiBpc0luVGFibGUsXG4gICAgICAgICAgICAgICAgYWN0aXZlOiBpc1NlbGVjdGVkQWxsQ2VsbCxcbiAgICAgICAgICAgICAgICBkYW5nZXJvdXM6IHRhYmxlU3RvcmUuaXNTZWxlY3RlZFRhYmxlICYmIHRhYmxlU3RvcmUuZGFuZ2Vyb3VzQ2VsbHMubGVuZ3RoID4gMFxuICAgICAgICAgICAgfVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aGUtdGVtcC10YWJsZS1jb3JuZXItYnV0dG9uXCIgKG1vdXNlZG93bik9XCJvblNlbGVjdFRhYmxlKCRldmVudClcIj48L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aGUtdGVtcC10YWJsZS1jb3JuZXItY29udHJvbHMtaW5zZXJ0LXJvdy1tYXJrZXJcIj5cbiAgICAgICAgICAgICAgICA8dGhlLXRhYmxlLWluc2VydC1tYXJrIHR5cGU9XCJyb3dcIiBbYXRdPVwiMFwiIFt0YWJsZVN0b3JlXT1cInRhYmxlU3RvcmVcIj48L3RoZS10YWJsZS1pbnNlcnQtbWFyaz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRoZS10ZW1wLXRhYmxlLWNvcm5lci1jb250cm9scy1pbnNlcnQtY29sdW1uLW1hcmtlclwiPlxuICAgICAgICAgICAgICAgIDx0aGUtdGFibGUtaW5zZXJ0LW1hcmsgdHlwZT1cImNvbHVtblwiIFthdF09XCIwXCIgW3RhYmxlU3RvcmVdPVwidGFibGVTdG9yZVwiPjwvdGhlLXRhYmxlLWluc2VydC1tYXJrPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGhlLXRlbXAtdGFibGUtcm93LWNvbnRyb2xzXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGhlLXRlbXAtdGFibGUtcm93LWNvbnRyb2xzLWlubmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRoZS10ZW1wLXRhYmxlLXJvdy1jb250cm9scy1idXR0b24td3JhcFwiXG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb250cm9sIG9mIHJvd0NvbnRyb2xzOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5Rm5Sb3dDb250cm9sc1wiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogdGFibGVTdG9yZS5zZWxlY3RlZFJvd3NJbmRleC5pbmNsdWRlcyhjb250cm9sLnJvd0luZGV4KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhbmdlcm91czogdGFibGVTdG9yZS5kYW5nZXJvdXNSb3dzSW5kZXguaW5jbHVkZXMoY29udHJvbC5yb3dJbmRleCkgJiYgdGFibGVTdG9yZS5kYW5nZXJvdXNDZWxscy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFyZWFkb25seSAmJiBpc0luVGFibGUgJiYgIWVsZW1lbnQ/Lm9wdGlvbnM/Lm51bWJlcmVkQ29sdW1uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvblJvd01vdXNlRG93bigkZXZlbnQsIGNvbnRyb2wucm93SW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7IGhlaWdodDogY29udHJvbC5oZWlnaHQgKyAxICsgJ3B4JyB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRoZS10ZW1wLXRhYmxlLXJvdy1jb250cm9scy1idXR0b24gdGhlLXRlbXAtdGFibGUtY29udHJvbHMtYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlbGVtZW50Py5vcHRpb25zPy5udW1iZXJlZENvbHVtblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb250ZW50RWRpdGFibGVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRlZGl0YWJsZT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2Vkb3duKT1cIm9uUm93TW91c2VEb3duKCRldmVudCwgY29udHJvbC5yb3dJbmRleClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGhlLXRlbXAtdGFibGUtbnVtYmVyZWQtY29udHJvbHMtYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7IGhlaWdodDogY29udHJvbC5oZWlnaHQgKyAxICsgJ3B4JyB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInJvdy1udW1iZXIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPnt7IGkgKyAxIH19PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8dGhlLXRhYmxlLWluc2VydC1tYXJrIHR5cGU9XCJyb3dcIiBbYXRdPVwiY29udHJvbC5yb3dJbmRleCArIDFcIiBbdGFibGVTdG9yZV09XCJ0YWJsZVN0b3JlXCI+IDwvdGhlLXRhYmxlLWluc2VydC1tYXJrPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJ0aGUtdGVtcC10YWJsZS13cmFwcGVyXCIgI3RhYmxlV3JhcHBlciBbbmdDbGFzc109XCJ7ICd0aGUtdGVtcC10YWJsZS1udW1iZXJlZCc6IGVsZW1lbnQ/Lm9wdGlvbnM/Lm51bWJlcmVkQ29sdW1uIH1cIj5cbiAgICAgICAgPHRhYmxlIGNsYXNzPVwidGhlLXRlbXAtdGFibGVcIiAjdGhlVGFibGUgW25nQ2xhc3NdPVwieyAndGhlLXRlbXAtdGFibGUtd2l0aC1jb250cm9scyc6IGlzSW5UYWJsZSB9XCI+XG4gICAgICAgICAgICA8Y29sZ3JvdXAgKm5nSWY9XCJjb2x1bW5zXCI+XG4gICAgICAgICAgICAgICAgPGNvbCAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIiBbbmdTdHlsZV09XCJ7IHdpZHRoOiBjb2wud2lkdGggKyAncHgnIH1cIiAvPlxuICAgICAgICAgICAgPC9jb2xncm91cD5cbiAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJ0aGUtdGVtcC10YWJsZS1jb2wtY29udHJvbHMtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGhlLXRlbXAtdGFibGUtY29sLWNvbnRyb2xzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmU6IHRhYmxlU3RvcmUuc2VsZWN0ZWRDb2x1bW5zSW5kZXguaW5jbHVkZXMoaSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFuZ2Vyb3VzOiB0YWJsZVN0b3JlLmRhbmdlcm91c0NvbHVtbnNJbmRleC5pbmNsdWRlcyhpKSAmJiB0YWJsZVN0b3JlLmRhbmdlcm91c0NlbGxzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvbkNvbE1vdXNlRG93bigkZXZlbnQsIGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb250cm9sIG9mIGNvbENvbnRyb2xzOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5Rm5Db2xDb250cm9sc1wiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aGUtdGFibGUtaW5zZXJ0LW1hcmsgKm5nSWY9XCJpc0luVGFibGVcIiB0eXBlPVwiY29sdW1uXCIgW2F0XT1cImkgKyAxXCIgW3RhYmxlU3RvcmVdPVwidGFibGVTdG9yZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aGUtdGFibGUtaW5zZXJ0LW1hcms+XG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICA8dGJvZHkgI3Rib2R5PlxuICAgICAgICAgICAgICAgIDxzbGF0ZS1jaGlsZHJlbiBbY2hpbGRyZW5dPVwiY2hpbGRyZW5cIiBbY29udGV4dF09XCJjaGlsZHJlbkNvbnRleHRcIiBbdmlld0NvbnRleHRdPVwidmlld0NvbnRleHRcIj4gPC9zbGF0ZS1jaGlsZHJlbj5cbiAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgIDwvdGFibGU+XG4gICAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==