@worktile/theia 15.3.2 → 16.0.0

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