@worktile/theia 16.1.6 → 16.1.8

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 (379) hide show
  1. package/components/contextmenu/contextmenu.component.d.ts +1 -1
  2. package/components/conversion-hint/conversion-hint.component.d.ts +1 -1
  3. package/components/inline-toolbar/inline-toolbar.component.d.ts +1 -1
  4. package/components/listbox/listbox.d.ts +3 -3
  5. package/components/plugin-menu/plugin-menu.component.d.ts +5 -4
  6. package/components/table-select/table-select.component.d.ts +1 -1
  7. package/components/toolbar/toolbar.component.d.ts +1 -1
  8. package/components/toolbar-group/toolbar-group.component.d.ts +1 -1
  9. package/core/toolbar-item/base-toolbar-item.d.ts +2 -2
  10. package/custom-types.d.ts +1 -0
  11. package/editor.component.d.ts +1 -1
  12. package/{esm2020 → esm2022}/components/action/prevent-default.mjs +4 -4
  13. package/{esm2020 → esm2022}/components/column-resize/column-resize-notifier.mjs +4 -4
  14. package/{esm2020 → esm2022}/components/column-resize/column-resize.directive.mjs +4 -4
  15. package/{esm2020 → esm2022}/components/column-resize/column-resize.module.mjs +9 -9
  16. package/{esm2020 → esm2022}/components/column-resize/event-dispatcher.mjs +4 -4
  17. package/{esm2020 → esm2022}/components/column-resize/overlay-handle.component.mjs +4 -4
  18. package/{esm2020 → esm2022}/components/column-resize/resizing.store.mjs +4 -4
  19. package/{esm2020 → esm2022}/components/contextmenu/contextmenu.component.mjs +4 -4
  20. package/{esm2020 → esm2022}/components/conversion-hint/conversion-hint.component.mjs +4 -4
  21. package/{esm2020 → esm2022}/components/element/element.component.mjs +4 -4
  22. package/{esm2020 → esm2022}/components/inline-toolbar/inline-toolbar.component.mjs +6 -6
  23. package/esm2022/components/listbox/listbox.mjs +375 -0
  24. package/esm2022/components/plugin-menu/plugin-menu.component.mjs +205 -0
  25. package/{esm2020 → esm2022}/components/table-select/table-select.component.mjs +4 -4
  26. package/{esm2020 → esm2022}/components/template/template.component.mjs +4 -4
  27. package/{esm2020 → esm2022}/components/text/text.component.mjs +4 -4
  28. package/{esm2020 → esm2022}/components/toolbar/toolbar.component.mjs +4 -4
  29. package/{esm2020 → esm2022}/components/toolbar-dropdown/toolbar-dropdown.component.mjs +4 -4
  30. package/{esm2020 → esm2022}/components/toolbar-group/toolbar-group.component.mjs +4 -4
  31. package/{esm2020 → esm2022}/components/toolbar-item/toolbar-item.component.mjs +6 -6
  32. package/{esm2020 → esm2022}/core/toolbar-item/base-toolbar-item.mjs +7 -7
  33. package/esm2022/custom-types.mjs +2 -0
  34. package/{esm2020 → esm2022}/editor.component.mjs +11 -11
  35. package/esm2022/editor.module.mjs +254 -0
  36. package/esm2022/interfaces/image.mjs +3 -0
  37. package/{esm2020 → esm2022}/interfaces/view-base.mjs +4 -4
  38. package/{esm2020 → esm2022}/pipes.mjs +10 -10
  39. package/{esm2020 → esm2022}/plugins/autoformat/transforms/auto-format-block.mjs +1 -1
  40. package/{esm2020 → esm2022}/plugins/blockquote/blockquote.component.mjs +4 -4
  41. package/{esm2020 → esm2022}/plugins/code/code.component.mjs +4 -4
  42. package/{esm2020 → esm2022}/plugins/color/toolbar-item.component.mjs +4 -4
  43. package/esm2022/plugins/deserialize/deserialize-html.plugin.mjs +59 -0
  44. package/esm2022/plugins/deserialize/deserialize-md.plugin.mjs +136 -0
  45. package/{esm2020 → esm2022}/plugins/hr/hr.component.mjs +6 -6
  46. package/esm2022/plugins/image/image.component.mjs +460 -0
  47. package/esm2022/plugins/image/image.editor.mjs +96 -0
  48. package/{esm2020 → esm2022}/plugins/inline-code/inline-code.component.mjs +6 -6
  49. package/{esm2020 → esm2022}/plugins/link/edit/link-edit.component.mjs +4 -4
  50. package/{esm2020 → esm2022}/plugins/link/hover/link-hover.component.mjs +4 -4
  51. package/{esm2020 → esm2022}/plugins/link/link.component.mjs +9 -9
  52. package/{esm2020 → esm2022}/plugins/list/components/bulleted-list.component.mjs +4 -4
  53. package/{esm2020 → esm2022}/plugins/list/components/list-item.component.mjs +4 -4
  54. package/{esm2020 → esm2022}/plugins/list/components/numbered-list.component.mjs +4 -4
  55. package/{esm2020 → esm2022}/plugins/mention/suggestion.component.mjs +4 -4
  56. package/esm2022/plugins/quick-insert/components/quick-insert.component.mjs +126 -0
  57. package/{esm2020 → esm2022}/plugins/table/components/insert-mark/insert-mark.component.mjs +4 -4
  58. package/{esm2020 → esm2022}/plugins/table/components/row/row.component.mjs +6 -6
  59. package/esm2022/plugins/table/components/table.component.mjs +834 -0
  60. package/{esm2020 → esm2022}/plugins/table/components/td/td.component.mjs +4 -4
  61. package/{esm2020 → esm2022}/plugins/table/components/toolbar/table-options.component.mjs +6 -6
  62. package/{esm2020 → esm2022}/plugins/table/components/toolbar/table-toolbar.component.mjs +4 -4
  63. package/{esm2020 → esm2022}/plugins/table/table.pipe.mjs +7 -7
  64. package/{esm2020 → esm2022}/plugins/table/table.service.mjs +4 -4
  65. package/{esm2020 → esm2022}/plugins/table/table.store.mjs +4 -4
  66. package/{esm2020 → esm2022}/plugins/table/toolbar-item.component.mjs +6 -6
  67. package/{esm2020 → esm2022}/plugins/todo-item/todo-item.component.mjs +6 -6
  68. package/{esm2020 → esm2022}/plugins/vertical-align/toolbar-item.component.mjs +4 -4
  69. package/{esm2020 → esm2022}/services/context.service.mjs +4 -4
  70. package/{esm2020 → esm2022}/services/table-contextmenu.service.mjs +4 -4
  71. package/{esm2020 → esm2022}/services/toolbar.service.mjs +4 -4
  72. package/{esm2020 → esm2022}/transforms/on-keydown-reset-block-type.mjs +1 -1
  73. package/{fesm2020 → fesm2022}/worktile-theia.mjs +449 -406
  74. package/fesm2022/worktile-theia.mjs.map +1 -0
  75. package/interfaces/editor.d.ts +5 -3
  76. package/interfaces/image.d.ts +5 -4
  77. package/package.json +6 -15
  78. package/plugins/image/image.component.d.ts +5 -3
  79. package/plugins/image/image.editor.d.ts +7 -0
  80. package/plugins/link/edit/link-edit.component.d.ts +1 -1
  81. package/plugins/link/hover/link-hover.component.d.ts +1 -1
  82. package/plugins/mention/suggestion.component.d.ts +1 -1
  83. package/plugins/quick-insert/components/quick-insert.component.d.ts +2 -3
  84. package/plugins/table/components/insert-mark/insert-mark.component.d.ts +1 -1
  85. package/plugins/table/components/table.component.d.ts +7 -7
  86. package/plugins/table/components/toolbar/table-options.component.d.ts +1 -1
  87. package/plugins/table/components/toolbar/table-toolbar.component.d.ts +1 -1
  88. package/queries/is-range-across-blocks.d.ts +1 -1
  89. package/esm2020/components/listbox/listbox.mjs +0 -375
  90. package/esm2020/components/plugin-menu/plugin-menu.component.mjs +0 -204
  91. package/esm2020/custom-types.mjs +0 -2
  92. package/esm2020/editor.module.mjs +0 -254
  93. package/esm2020/interfaces/image.mjs +0 -3
  94. package/esm2020/plugins/deserialize/deserialize-html.plugin.mjs +0 -53
  95. package/esm2020/plugins/deserialize/deserialize-md.plugin.mjs +0 -130
  96. package/esm2020/plugins/image/image.component.mjs +0 -440
  97. package/esm2020/plugins/image/image.editor.mjs +0 -81
  98. package/esm2020/plugins/quick-insert/components/quick-insert.component.mjs +0 -130
  99. package/esm2020/plugins/table/components/table.component.mjs +0 -834
  100. package/fesm2015/worktile-theia.mjs +0 -16715
  101. package/fesm2015/worktile-theia.mjs.map +0 -1
  102. package/fesm2020/worktile-theia.mjs.map +0 -1
  103. /package/{esm2020 → esm2022}/components/column-resize/resize-ref.mjs +0 -0
  104. /package/{esm2020 → esm2022}/components/column-resize/selectors.mjs +0 -0
  105. /package/{esm2020 → esm2022}/components/index.mjs +0 -0
  106. /package/{esm2020 → esm2022}/components/listbox/listbox.type.mjs +0 -0
  107. /package/{esm2020 → esm2022}/constants/auto-format-rules.mjs +0 -0
  108. /package/{esm2020 → esm2022}/constants/code.mjs +0 -0
  109. /package/{esm2020 → esm2022}/constants/color-select.mjs +0 -0
  110. /package/{esm2020 → esm2022}/constants/default.mjs +0 -0
  111. /package/{esm2020 → esm2022}/constants/error.mjs +0 -0
  112. /package/{esm2020 → esm2022}/constants/index.mjs +0 -0
  113. /package/{esm2020 → esm2022}/constants/node-types.mjs +0 -0
  114. /package/{esm2020 → esm2022}/constants/plugin-menu.mjs +0 -0
  115. /package/{esm2020 → esm2022}/constants/selector.mjs +0 -0
  116. /package/{esm2020 → esm2022}/constants/toolbar.mjs +0 -0
  117. /package/{esm2020 → esm2022}/core/create-plugin.mjs +0 -0
  118. /package/{esm2020 → esm2022}/core/create-toolbar.mjs +0 -0
  119. /package/{esm2020 → esm2022}/core/index.mjs +0 -0
  120. /package/{esm2020 → esm2022}/core/utils/combine-plugins.mjs +0 -0
  121. /package/{esm2020 → esm2022}/core/utils/flatten-deep-plugins.mjs +0 -0
  122. /package/{esm2020 → esm2022}/core/utils/get-plugin-options.mjs +0 -0
  123. /package/{esm2020 → esm2022}/core/utils/get-plugin.mjs +0 -0
  124. /package/{esm2020 → esm2022}/core/utils/get-plugins.mjs +0 -0
  125. /package/{esm2020 → esm2022}/core/utils/index.mjs +0 -0
  126. /package/{esm2020 → esm2022}/core/utils/merge-array.mjs +0 -0
  127. /package/{esm2020 → esm2022}/core/utils/merge-deep-plugins.mjs +0 -0
  128. /package/{esm2020 → esm2022}/core/utils/merge-options.mjs +0 -0
  129. /package/{esm2020 → esm2022}/core/utils/nested-structure-by-key.mjs +0 -0
  130. /package/{esm2020 → esm2022}/core/utils/plugin-menu.mjs +0 -0
  131. /package/{esm2020 → esm2022}/core/utils/plugins-by-key.mjs +0 -0
  132. /package/{esm2020 → esm2022}/core/with-theia.mjs +0 -0
  133. /package/{esm2020 → esm2022}/interfaces/auto-format.mjs +0 -0
  134. /package/{esm2020 → esm2022}/interfaces/editor.mjs +0 -0
  135. /package/{esm2020 → esm2022}/interfaces/element.mjs +0 -0
  136. /package/{esm2020 → esm2022}/interfaces/index.mjs +0 -0
  137. /package/{esm2020 → esm2022}/interfaces/plugins/index.mjs +0 -0
  138. /package/{esm2020 → esm2022}/interfaces/plugins/no-infer.mjs +0 -0
  139. /package/{esm2020 → esm2022}/interfaces/plugins/plugin-key.mjs +0 -0
  140. /package/{esm2020 → esm2022}/interfaces/plugins/plugin-menu.mjs +0 -0
  141. /package/{esm2020 → esm2022}/interfaces/plugins/plugins.mjs +0 -0
  142. /package/{esm2020 → esm2022}/interfaces/plugins/with-override.mjs +0 -0
  143. /package/{esm2020 → esm2022}/interfaces/reset-block-type-plugin-options.mjs +0 -0
  144. /package/{esm2020 → esm2022}/interfaces/toolbar.mjs +0 -0
  145. /package/{esm2020 → esm2022}/interfaces/upload.mjs +0 -0
  146. /package/{esm2020 → esm2022}/interfaces/utility/index.mjs +0 -0
  147. /package/{esm2020 → esm2022}/interfaces/utility/nested-structure-by-key.mjs +0 -0
  148. /package/{esm2020 → esm2022}/interfaces/utility/override-by-key.mjs +0 -0
  149. /package/{esm2020 → esm2022}/interfaces/utility/types.mjs +0 -0
  150. /package/{esm2020 → esm2022}/interfaces/valid-children-types.mjs +0 -0
  151. /package/{esm2020 → esm2022}/plugins/align/align.editor.mjs +0 -0
  152. /package/{esm2020 → esm2022}/plugins/align/align.plugin.mjs +0 -0
  153. /package/{esm2020 → esm2022}/plugins/autoformat/autoformat.plugin.mjs +0 -0
  154. /package/{esm2020 → esm2022}/plugins/autoformat/transforms/auto-format-inline.mjs +0 -0
  155. /package/{esm2020 → esm2022}/plugins/blockquote/blockquote.editor.mjs +0 -0
  156. /package/{esm2020 → esm2022}/plugins/blockquote/blockquote.plugin.mjs +0 -0
  157. /package/{esm2020 → esm2022}/plugins/code/code.editor.mjs +0 -0
  158. /package/{esm2020 → esm2022}/plugins/code/code.plugin.mjs +0 -0
  159. /package/{esm2020 → esm2022}/plugins/color/color.editor.mjs +0 -0
  160. /package/{esm2020 → esm2022}/plugins/color/color.plugin.mjs +0 -0
  161. /package/{esm2020 → esm2022}/plugins/common/block-card.plugin.mjs +0 -0
  162. /package/{esm2020 → esm2022}/plugins/common/common.plugin.mjs +0 -0
  163. /package/{esm2020 → esm2022}/plugins/common/get-fragment.plugin.mjs +0 -0
  164. /package/{esm2020 → esm2022}/plugins/common/history.plugin.mjs +0 -0
  165. /package/{esm2020 → esm2022}/plugins/common/insert-data-by-invalid-type.mjs +0 -0
  166. /package/{esm2020 → esm2022}/plugins/common/move-selection.plugin.mjs +0 -0
  167. /package/{esm2020 → esm2022}/plugins/common/remove-empty.plugin.mjs +0 -0
  168. /package/{esm2020 → esm2022}/plugins/common/remove-void.plugin.mjs +0 -0
  169. /package/{esm2020 → esm2022}/plugins/common/reset-type.plugin.mjs +0 -0
  170. /package/{esm2020 → esm2022}/plugins/common/transforms.plugin.mjs +0 -0
  171. /package/{esm2020 → esm2022}/plugins/font-size/font-size.editor.mjs +0 -0
  172. /package/{esm2020 → esm2022}/plugins/heading/heading.editor.mjs +0 -0
  173. /package/{esm2020 → esm2022}/plugins/heading/heading.plugin.mjs +0 -0
  174. /package/{esm2020 → esm2022}/plugins/hr/hr.editor.mjs +0 -0
  175. /package/{esm2020 → esm2022}/plugins/hr/hr.plugin.mjs +0 -0
  176. /package/{esm2020 → esm2022}/plugins/image/image.plugin.mjs +0 -0
  177. /package/{esm2020 → esm2022}/plugins/indent/indent.editor.mjs +0 -0
  178. /package/{esm2020 → esm2022}/plugins/indent/indent.plugin.mjs +0 -0
  179. /package/{esm2020 → esm2022}/plugins/indent/on-keydown-indent.mjs +0 -0
  180. /package/{esm2020 → esm2022}/plugins/index.mjs +0 -0
  181. /package/{esm2020 → esm2022}/plugins/inline-code/inline-code.editor.mjs +0 -0
  182. /package/{esm2020 → esm2022}/plugins/inline-code/inline-code.plugin.mjs +0 -0
  183. /package/{esm2020 → esm2022}/plugins/link/link.editor.mjs +0 -0
  184. /package/{esm2020 → esm2022}/plugins/link/link.plugin.mjs +0 -0
  185. /package/{esm2020 → esm2022}/plugins/link/link.types.mjs +0 -0
  186. /package/{esm2020 → esm2022}/plugins/list/list.editor.mjs +0 -0
  187. /package/{esm2020 → esm2022}/plugins/list/list.plugin.mjs +0 -0
  188. /package/{esm2020 → esm2022}/plugins/list/normalizers/get-list-normalizer.mjs +0 -0
  189. /package/{esm2020 → esm2022}/plugins/list/normalizers/normalize-list-item.mjs +0 -0
  190. /package/{esm2020 → esm2022}/plugins/list/normalizers/normalize-no.mjs +0 -0
  191. /package/{esm2020 → esm2022}/plugins/list/on-key-down-list.mjs +0 -0
  192. /package/{esm2020 → esm2022}/plugins/list/queries/get-list-item-entry.mjs +0 -0
  193. /package/{esm2020 → esm2022}/plugins/list/queries/get-list-item-sublist.mjs +0 -0
  194. /package/{esm2020 → esm2022}/plugins/list/queries/get-list-types.mjs +0 -0
  195. /package/{esm2020 → esm2022}/plugins/list/queries/get-start-list-item.mjs +0 -0
  196. /package/{esm2020 → esm2022}/plugins/list/queries/has-list-in-list-item.mjs +0 -0
  197. /package/{esm2020 → esm2022}/plugins/list/queries/is-in-list.mjs +0 -0
  198. /package/{esm2020 → esm2022}/plugins/list/queries/is-list-nested.mjs +0 -0
  199. /package/{esm2020 → esm2022}/plugins/list/queries/is-list.mjs +0 -0
  200. /package/{esm2020 → esm2022}/plugins/list/queries/is-node-type-list.mjs +0 -0
  201. /package/{esm2020 → esm2022}/plugins/list/queries/is-selection-at-list-item-start.mjs +0 -0
  202. /package/{esm2020 → esm2022}/plugins/list/queries/is-selection-in-same-list-item.mjs +0 -0
  203. /package/{esm2020 → esm2022}/plugins/list/queries/is-single-list-item.mjs +0 -0
  204. /package/{esm2020 → esm2022}/plugins/list/transforms/insert-list-data.mjs +0 -0
  205. /package/{esm2020 → esm2022}/plugins/list/transforms/insert-list-item.mjs +0 -0
  206. /package/{esm2020 → esm2022}/plugins/list/transforms/move-list-item-down.mjs +0 -0
  207. /package/{esm2020 → esm2022}/plugins/list/transforms/move-list-item-sublist-items-to-list-item-sublist.mjs +0 -0
  208. /package/{esm2020 → esm2022}/plugins/list/transforms/move-list-item-sublist-items-to-list.mjs +0 -0
  209. /package/{esm2020 → esm2022}/plugins/list/transforms/move-list-item-up.mjs +0 -0
  210. /package/{esm2020 → esm2022}/plugins/list/transforms/unwrap-list.mjs +0 -0
  211. /package/{esm2020 → esm2022}/plugins/list/types.mjs +0 -0
  212. /package/{esm2020 → esm2022}/plugins/mark/mark.editor.mjs +0 -0
  213. /package/{esm2020 → esm2022}/plugins/mark/mark.plugin.mjs +0 -0
  214. /package/{esm2020 → esm2022}/plugins/mention/index.mjs +0 -0
  215. /package/{esm2020 → esm2022}/plugins/mention/mention.editor.mjs +0 -0
  216. /package/{esm2020 → esm2022}/plugins/mention/mention.plugin.mjs +0 -0
  217. /package/{esm2020 → esm2022}/plugins/mention/mention.type.mjs +0 -0
  218. /package/{esm2020 → esm2022}/plugins/node-id/node-id.plugin.mjs +0 -0
  219. /package/{esm2020 → esm2022}/plugins/normalizers/insert-paragraph-nodes.mjs +0 -0
  220. /package/{esm2020 → esm2022}/plugins/normalizers/remove-empty-nodes.mjs +0 -0
  221. /package/{esm2020 → esm2022}/plugins/normalizers/trailing-node.plugin.mjs +0 -0
  222. /package/{esm2020 → esm2022}/plugins/paint-format/paint-format.editor.mjs +0 -0
  223. /package/{esm2020 → esm2022}/plugins/public-api.mjs +0 -0
  224. /package/{esm2020 → esm2022}/plugins/quick-insert/quick-insert.editor.mjs +0 -0
  225. /package/{esm2020 → esm2022}/plugins/quick-insert/quick-insert.plugin.mjs +0 -0
  226. /package/{esm2020 → esm2022}/plugins/soft-break/soft-break.plugin.mjs +0 -0
  227. /package/{esm2020 → esm2022}/plugins/soft-break/soft-break.types.mjs +0 -0
  228. /package/{esm2020 → esm2022}/plugins/table/table.editor.mjs +0 -0
  229. /package/{esm2020 → esm2022}/plugins/table/table.plugin.mjs +0 -0
  230. /package/{esm2020 → esm2022}/plugins/table/table.types.mjs +0 -0
  231. /package/{esm2020 → esm2022}/plugins/table/transforms/clear-cell.mjs +0 -0
  232. /package/{esm2020 → esm2022}/plugins/table/transforms/clear-table-node.mjs +0 -0
  233. /package/{esm2020 → esm2022}/plugins/table/transforms/index.mjs +0 -0
  234. /package/{esm2020 → esm2022}/plugins/table/transforms/insert-column.mjs +0 -0
  235. /package/{esm2020 → esm2022}/plugins/table/transforms/insert-row.mjs +0 -0
  236. /package/{esm2020 → esm2022}/plugins/table/transforms/insert-table.mjs +0 -0
  237. /package/{esm2020 → esm2022}/plugins/table/transforms/remove-column.mjs +0 -0
  238. /package/{esm2020 → esm2022}/plugins/table/transforms/remove-row.mjs +0 -0
  239. /package/{esm2020 → esm2022}/plugins/table/transforms/remove-table.mjs +0 -0
  240. /package/{esm2020 → esm2022}/plugins/table/utils/add-columns.mjs +0 -0
  241. /package/{esm2020 → esm2022}/plugins/table/utils/calc-anchor-position.mjs +0 -0
  242. /package/{esm2020 → esm2022}/plugins/table/utils/calc-span.mjs +0 -0
  243. /package/{esm2020 → esm2022}/plugins/table/utils/calculate-table.mjs +0 -0
  244. /package/{esm2020 → esm2022}/plugins/table/utils/cell-position.mjs +0 -0
  245. /package/{esm2020 → esm2022}/plugins/table/utils/create-cell.mjs +0 -0
  246. /package/{esm2020 → esm2022}/plugins/table/utils/create-row.mjs +0 -0
  247. /package/{esm2020 → esm2022}/plugins/table/utils/create-table-position.mjs +0 -0
  248. /package/{esm2020 → esm2022}/plugins/table/utils/create-table.mjs +0 -0
  249. /package/{esm2020 → esm2022}/plugins/table/utils/get-grid-columns.mjs +0 -0
  250. /package/{esm2020 → esm2022}/plugins/table/utils/get-min-max-cell-index.mjs +0 -0
  251. /package/{esm2020 → esm2022}/plugins/table/utils/get-select-cell-node.mjs +0 -0
  252. /package/{esm2020 → esm2022}/plugins/table/utils/handle-cell.mjs +0 -0
  253. /package/{esm2020 → esm2022}/plugins/table/utils/index.mjs +0 -0
  254. /package/{esm2020 → esm2022}/plugins/table/utils/is-header-row.mjs +0 -0
  255. /package/{esm2020 → esm2022}/plugins/table/utils/is-legal-table.mjs +0 -0
  256. /package/{esm2020 → esm2022}/plugins/table/utils/is-range-in-table.mjs +0 -0
  257. /package/{esm2020 → esm2022}/plugins/table/utils/is-selection-in-table.mjs +0 -0
  258. /package/{esm2020 → esm2022}/plugins/table/utils/is-virtual-key.mjs +0 -0
  259. /package/{esm2020 → esm2022}/plugins/table/utils/merge-cell.mjs +0 -0
  260. /package/{esm2020 → esm2022}/plugins/table/utils/next-path.mjs +0 -0
  261. /package/{esm2020 → esm2022}/plugins/table/utils/normalize-table.mjs +0 -0
  262. /package/{esm2020 → esm2022}/plugins/table/utils/remove-columns.mjs +0 -0
  263. /package/{esm2020 → esm2022}/plugins/table/utils/remove-row-column.mjs +0 -0
  264. /package/{esm2020 → esm2022}/plugins/table/utils/set-cells-background-color.mjs +0 -0
  265. /package/{esm2020 → esm2022}/plugins/table/utils/set-menu-cell-invisibility.mjs +0 -0
  266. /package/{esm2020 → esm2022}/plugins/table/utils/set-node-options.mjs +0 -0
  267. /package/{esm2020 → esm2022}/plugins/table/utils/split-cell.mjs +0 -0
  268. /package/{esm2020 → esm2022}/plugins/table/utils/table-entry.mjs +0 -0
  269. /package/{esm2020 → esm2022}/plugins/table/utils/table-position.mjs +0 -0
  270. /package/{esm2020 → esm2022}/plugins/todo-item/todo-item.editor.mjs +0 -0
  271. /package/{esm2020 → esm2022}/plugins/todo-item/todo-item.plugin.mjs +0 -0
  272. /package/{esm2020 → esm2022}/plugins/vertical-align/vertical-align.editor.mjs +0 -0
  273. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
  274. /package/{esm2020 → esm2022}/queries/anchor-block-entry.mjs +0 -0
  275. /package/{esm2020 → esm2022}/queries/anchor-block.mjs +0 -0
  276. /package/{esm2020 → esm2022}/queries/anchor-inline-entry.mjs +0 -0
  277. /package/{esm2020 → esm2022}/queries/find-descendant.mjs +0 -0
  278. /package/{esm2020 → esm2022}/queries/find-node.mjs +0 -0
  279. /package/{esm2020 → esm2022}/queries/find-path.mjs +0 -0
  280. /package/{esm2020 → esm2022}/queries/get-above-by-type.mjs +0 -0
  281. /package/{esm2020 → esm2022}/queries/get-above.mjs +0 -0
  282. /package/{esm2020 → esm2022}/queries/get-anchor-block-entry.mjs +0 -0
  283. /package/{esm2020 → esm2022}/queries/get-block-above.mjs +0 -0
  284. /package/{esm2020 → esm2022}/queries/get-block-card-above.mjs +0 -0
  285. /package/{esm2020 → esm2022}/queries/get-block-card-cursor.mjs +0 -0
  286. /package/{esm2020 → esm2022}/queries/get-container-blocks.mjs +0 -0
  287. /package/{esm2020 → esm2022}/queries/get-directly-parent.mjs +0 -0
  288. /package/{esm2020 → esm2022}/queries/get-insert-elements-path.mjs +0 -0
  289. /package/{esm2020 → esm2022}/queries/get-last-child-path.mjs +0 -0
  290. /package/{esm2020 → esm2022}/queries/get-last-node.mjs +0 -0
  291. /package/{esm2020 → esm2022}/queries/get-next-sibling-nodes.mjs +0 -0
  292. /package/{esm2020 → esm2022}/queries/get-node.mjs +0 -0
  293. /package/{esm2020 → esm2022}/queries/get-nodes-by-type.mjs +0 -0
  294. /package/{esm2020 → esm2022}/queries/get-nodes.mjs +0 -0
  295. /package/{esm2020 → esm2022}/queries/get-parent.mjs +0 -0
  296. /package/{esm2020 → esm2022}/queries/get-plain-text.mjs +0 -0
  297. /package/{esm2020 → esm2022}/queries/get-plugin-by-toolbar.mjs +0 -0
  298. /package/{esm2020 → esm2022}/queries/get-point-before.mjs +0 -0
  299. /package/{esm2020 → esm2022}/queries/get-point-from-location.mjs +0 -0
  300. /package/{esm2020 → esm2022}/queries/get-previous-path.mjs +0 -0
  301. /package/{esm2020 → esm2022}/queries/get-rang-from-block-start.mjs +0 -0
  302. /package/{esm2020 → esm2022}/queries/get-range-before.mjs +0 -0
  303. /package/{esm2020 → esm2022}/queries/get-selection-marks.mjs +0 -0
  304. /package/{esm2020 → esm2022}/queries/get-selection-nodes-by-type.mjs +0 -0
  305. /package/{esm2020 → esm2022}/queries/get-text.mjs +0 -0
  306. /package/{esm2020 → esm2022}/queries/get-toolbar-disabled.mjs +0 -0
  307. /package/{esm2020 → esm2022}/queries/index.mjs +0 -0
  308. /package/{esm2020 → esm2022}/queries/is-across-blocks.mjs +0 -0
  309. /package/{esm2020 → esm2022}/queries/is-ancestor-empty.mjs +0 -0
  310. /package/{esm2020 → esm2022}/queries/is-ancestor.mjs +0 -0
  311. /package/{esm2020 → esm2022}/queries/is-block-above-empty.mjs +0 -0
  312. /package/{esm2020 → esm2022}/queries/is-block-active.mjs +0 -0
  313. /package/{esm2020 → esm2022}/queries/is-block-card-cursor.mjs +0 -0
  314. /package/{esm2020 → esm2022}/queries/is-block-text-empty-after-selection.mjs +0 -0
  315. /package/{esm2020 → esm2022}/queries/is-collapsed.mjs +0 -0
  316. /package/{esm2020 → esm2022}/queries/is-contain-nested-type.mjs +0 -0
  317. /package/{esm2020 → esm2022}/queries/is-container-type.mjs +0 -0
  318. /package/{esm2020 → esm2022}/queries/is-descendant.mjs +0 -0
  319. /package/{esm2020 → esm2022}/queries/is-empty-content-filter.mjs +0 -0
  320. /package/{esm2020 → esm2022}/queries/is-empty-content.mjs +0 -0
  321. /package/{esm2020 → esm2022}/queries/is-empty-paragraph-by-path.mjs +0 -0
  322. /package/{esm2020 → esm2022}/queries/is-empty-paragraph.mjs +0 -0
  323. /package/{esm2020 → esm2022}/queries/is-first-child.mjs +0 -0
  324. /package/{esm2020 → esm2022}/queries/is-global-collapsed.mjs +0 -0
  325. /package/{esm2020 → esm2022}/queries/is-include-types.mjs +0 -0
  326. /package/{esm2020 → esm2022}/queries/is-node-type-in.mjs +0 -0
  327. /package/{esm2020 → esm2022}/queries/is-node-type.mjs +0 -0
  328. /package/{esm2020 → esm2022}/queries/is-paragraph.mjs +0 -0
  329. /package/{esm2020 → esm2022}/queries/is-point-at-root.mjs +0 -0
  330. /package/{esm2020 → esm2022}/queries/is-range-across-blocks.mjs +0 -0
  331. /package/{esm2020 → esm2022}/queries/is-range-at-root.mjs +0 -0
  332. /package/{esm2020 → esm2022}/queries/is-start.mjs +0 -0
  333. /package/{esm2020 → esm2022}/queries/some-node.mjs +0 -0
  334. /package/{esm2020 → esm2022}/shortcuts/index.mjs +0 -0
  335. /package/{esm2020 → esm2022}/shortcuts/mark.mjs +0 -0
  336. /package/{esm2020 → esm2022}/test/index.mjs +0 -0
  337. /package/{esm2020 → esm2022}/test/utils/with-plugin.mjs +0 -0
  338. /package/{esm2020 → esm2022}/transforms/apply-deep-to-nodes.mjs +0 -0
  339. /package/{esm2020 → esm2022}/transforms/clear-marks.mjs +0 -0
  340. /package/{esm2020 → esm2022}/transforms/close-conversion-hint.mjs +0 -0
  341. /package/{esm2020 → esm2022}/transforms/delete-element.mjs +0 -0
  342. /package/{esm2020 → esm2022}/transforms/handle-continual-delete-backward.mjs +0 -0
  343. /package/{esm2020 → esm2022}/transforms/handle-continual-insert-break.mjs +0 -0
  344. /package/{esm2020 → esm2022}/transforms/index.mjs +0 -0
  345. /package/{esm2020 → esm2022}/transforms/insert-elements.mjs +0 -0
  346. /package/{esm2020 → esm2022}/transforms/insert-paragraph.mjs +0 -0
  347. /package/{esm2020 → esm2022}/transforms/merge-deep-to-nodes.mjs +0 -0
  348. /package/{esm2020 → esm2022}/transforms/move-children.mjs +0 -0
  349. /package/{esm2020 → esm2022}/transforms/set-end-selection.mjs +0 -0
  350. /package/{esm2020 → esm2022}/transforms/set-marks.mjs +0 -0
  351. /package/{esm2020 → esm2022}/transforms/set-node.mjs +0 -0
  352. /package/{esm2020 → esm2022}/transforms/un-hang-range.mjs +0 -0
  353. /package/{esm2020 → esm2022}/transforms/un-wrap.mjs +0 -0
  354. /package/{esm2020 → esm2022}/transforms/unwrap-nodes-by-type.mjs +0 -0
  355. /package/{esm2020 → esm2022}/utils/auto-focus.mjs +0 -0
  356. /package/{esm2020 → esm2022}/utils/blob.mjs +0 -0
  357. /package/{esm2020 → esm2022}/utils/cast-array.mjs +0 -0
  358. /package/{esm2020 → esm2022}/utils/color-picker.mjs +0 -0
  359. /package/{esm2020 → esm2022}/utils/common.mjs +0 -0
  360. /package/{esm2020 → esm2022}/utils/copy-node.mjs +0 -0
  361. /package/{esm2020 → esm2022}/utils/create-empty-paragraph.mjs +0 -0
  362. /package/{esm2020 → esm2022}/utils/data-transform.mjs +0 -0
  363. /package/{esm2020 → esm2022}/utils/dom.mjs +0 -0
  364. /package/{esm2020 → esm2022}/utils/editor-uuid.mjs +0 -0
  365. /package/{esm2020 → esm2022}/utils/fragment.mjs +0 -0
  366. /package/{esm2020 → esm2022}/utils/get-editable-element-height.mjs +0 -0
  367. /package/{esm2020 → esm2022}/utils/get-toolbar-class.mjs +0 -0
  368. /package/{esm2020 → esm2022}/utils/id-creator.mjs +0 -0
  369. /package/{esm2020 → esm2022}/utils/index.mjs +0 -0
  370. /package/{esm2020 → esm2022}/utils/insert-data-by-invalid-type.mjs +0 -0
  371. /package/{esm2020 → esm2022}/utils/is-clean-empty-paragraph.mjs +0 -0
  372. /package/{esm2020 → esm2022}/utils/is-inline.mjs +0 -0
  373. /package/{esm2020 → esm2022}/utils/lodash.mjs +0 -0
  374. /package/{esm2020 → esm2022}/utils/match.mjs +0 -0
  375. /package/{esm2020 → esm2022}/utils/merge-element-options.mjs +0 -0
  376. /package/{esm2020 → esm2022}/utils/refocus.mjs +0 -0
  377. /package/{esm2020 → esm2022}/utils/scroll-into-view.mjs +0 -0
  378. /package/{esm2020 → esm2022}/utils/weak-maps.mjs +0 -0
  379. /package/{esm2020 → esm2022}/worktile-theia.mjs +0 -0
@@ -1,440 +0,0 @@
1
- import { Component, Inject, ViewChild } from '@angular/core';
2
- import { ThyUploadStatus } from 'ngx-tethys/upload';
3
- import { map } from 'rxjs/operators';
4
- import { Transforms } from 'slate';
5
- import { AngularEditor } from 'slate-angular';
6
- import { HistoryEditor } from 'slate-history';
7
- import { Alignment, ElementKinds, LayoutTypes, ToolbarActionTypes } from '../../constants/node-types';
8
- import { PluginKeys, TheBaseElementComponent } from '../../interfaces';
9
- import { THE_UPLOAD_SERVICE_TOKEN } from '../../interfaces/image';
10
- import * as TheQueries from '../../queries';
11
- import * as TheTransforms from '../../transforms';
12
- import { ImageEditor } from './image.editor';
13
- import { getPluginOptions } from '../../core/utils';
14
- import { ThyImageDirective } from 'ngx-tethys/image';
15
- import * as i0 from "@angular/core";
16
- import * as i1 from "../../services/context.service";
17
- import * as i2 from "ngx-tethys/popover";
18
- import * as i3 from "@angular/cdk/overlay";
19
- import * as i4 from "ngx-tethys/image";
20
- import * as i5 from "@angular/common";
21
- import * as i6 from "slate-angular";
22
- import * as i7 from "ngx-tethys/icon";
23
- import * as i8 from "ngx-tethys/tooltip";
24
- import * as i9 from "ngx-tethys/progress";
25
- import * as i10 from "ngx-tethys/action";
26
- import * as i11 from "ngx-tethys/divider";
27
- export class TheImageComponent extends TheBaseElementComponent {
28
- get isOpen() {
29
- return this.layoutToolbarRef && this.layoutToolbarRef.getOverlayRef() && this.layoutToolbarRef.getOverlayRef().hasAttached();
30
- }
31
- get imageBindingWidth() {
32
- const currentWidth = this.imageEntry?.width || this.naturalWidth;
33
- return this.imageEntry?.layout && currentWidth > this.layoutDefaultWidth && !this.imageEntry?.reSized
34
- ? this.layoutDefaultWidth
35
- : this.imageEntry.width;
36
- }
37
- constructor(elementRef, imageUploaderService, cdr, theContextService, thyPopover, overlay, viewContainerRef, imageGroupComponent) {
38
- super(elementRef, cdr);
39
- this.elementRef = elementRef;
40
- this.imageUploaderService = imageUploaderService;
41
- this.cdr = cdr;
42
- this.theContextService = theContextService;
43
- this.thyPopover = thyPopover;
44
- this.overlay = overlay;
45
- this.viewContainerRef = viewContainerRef;
46
- this.imageGroupComponent = imageGroupComponent;
47
- this.naturalWidth = 0;
48
- this.naturalHeight = 0;
49
- this.imageEntry = {};
50
- this.uploading = false;
51
- this.percentage = 0;
52
- this.layoutDefaultWidth = 368;
53
- this.disablePreview = false;
54
- this.loadImageError = false;
55
- this.layoutOptions = [
56
- {
57
- key: Alignment.left,
58
- icon: 'image-left',
59
- name: '左对齐',
60
- handle: (e, key) => this.setImageNode(e, { align: key, layout: undefined })
61
- },
62
- {
63
- key: Alignment.center,
64
- icon: 'image-center',
65
- name: '居中',
66
- handle: (e, key) => this.setImageNode(e, { align: key, layout: undefined })
67
- },
68
- {
69
- key: Alignment.right,
70
- icon: 'image-right',
71
- name: '右对齐',
72
- handle: (e, key) => this.setImageNode(e, { align: key, layout: undefined })
73
- },
74
- {
75
- key: ToolbarActionTypes.split
76
- },
77
- {
78
- key: LayoutTypes.wrapLeft,
79
- icon: 'wrap-left',
80
- name: '图片居左',
81
- handle: (e, key) => this.setImageNode(e, { layout: key })
82
- },
83
- {
84
- key: LayoutTypes.wrapRight,
85
- icon: 'wrap-right',
86
- name: '图片居右',
87
- handle: (e, key) => this.setImageNode(e, { layout: key })
88
- },
89
- {
90
- key: 'remove',
91
- icon: 'trash',
92
- name: '删除',
93
- handle: (e) => this.onDelete(e)
94
- }
95
- ];
96
- this.dragable = false;
97
- this.beforeContextChange = (value) => {
98
- if (value.element !== this.element && value.element.thumbUrl) {
99
- let thumbUrl = value.element.thumbUrl;
100
- let originUrl = value.element.originUrl;
101
- const baseUrl = this.imageUploaderService.getBaseUrl?.() || '';
102
- if (baseUrl && thumbUrl.startsWith('http')) {
103
- const slice = '/files/public/';
104
- thumbUrl = `${baseUrl}${slice}${thumbUrl.slice(thumbUrl.indexOf(slice) + slice.length, thumbUrl.length)}`;
105
- originUrl = `${baseUrl}${slice}${originUrl.slice(originUrl.indexOf(slice) + slice.length, originUrl.length)}`;
106
- }
107
- this.imageEntry = {
108
- // name: value.element.name,
109
- name: undefined,
110
- width: value.element.width,
111
- height: value.element.height,
112
- thumbUrl,
113
- originUrl,
114
- align: value.element.align || Alignment.left,
115
- layout: value.element.layout,
116
- reSized: value.element.reSized || false,
117
- size: value.element.size
118
- };
119
- this.setBlockCardLayoutAttr();
120
- }
121
- };
122
- }
123
- ngOnInit() {
124
- this.fileItem = this.theContextService.uploadingFiles.find(item => item.url === this.element.url);
125
- if (this.fileItem?.file && this.fileItem.file instanceof File) {
126
- this.uploadImage(this.fileItem.file);
127
- }
128
- super.ngOnInit();
129
- this.imagePluginOptions = getPluginOptions(this.editor, PluginKeys.image);
130
- if (this.imagePluginOptions.disablePreview && typeof this.imagePluginOptions.disablePreview === 'function') {
131
- this.disablePreview = this.imagePluginOptions.disablePreview(this.editor);
132
- }
133
- else {
134
- this.disablePreview = this.imagePluginOptions.disablePreview;
135
- }
136
- }
137
- imageClick() {
138
- const index = this.imageGroupComponent.images.findIndex(item => item === this.imageDirective);
139
- const imageGroup = this.imageGroupComponent.images.map(item => {
140
- return {
141
- originUrl: item.thyOriginSrc,
142
- thumbUrl: item.thyPreviewSrc,
143
- name: item.thyImageMeta.name,
144
- size: item.thyImageMeta.size
145
- };
146
- });
147
- const { originUrl, thumbUrl, name, size } = this.element;
148
- if (this.imagePluginOptions.preview) {
149
- this.imagePluginOptions.preview({
150
- editor: this.editor,
151
- previewImageInfo: {
152
- image: {
153
- originUrl,
154
- thumbUrl,
155
- name,
156
- size
157
- },
158
- imageGroup,
159
- index
160
- }
161
- });
162
- }
163
- }
164
- onContextChange() {
165
- super.onContextChange();
166
- if (this.initialized) {
167
- if (this.isShouldOpen()) {
168
- this.openLayoutToolbar();
169
- }
170
- if (this.isShouldClose()) {
171
- this.closeLayoutToolbar();
172
- }
173
- }
174
- }
175
- ngOnDestroy() {
176
- this.uploadingSubscription.unsubscribe();
177
- this.mouseUpSubscription.unsubscribe();
178
- this.theContextService.removeUploadFile(this.fileItem);
179
- if (this.uploading) {
180
- this.theContextService.uploadingStatus$.next(false);
181
- }
182
- super.ngOnDestroy();
183
- }
184
- ngAfterViewInit() {
185
- this.mouseUpSubscription = this.theContextService.onMouseUp$.subscribe(e => this.endDrag(e));
186
- this.uploadingSubscription = this.imageUploaderService
187
- .getUploadingItems$()
188
- .pipe(map(fileUploadingItem => this.fileItem?.file && fileUploadingItem.find(item => item.file === this.fileItem?.file)))
189
- .subscribe(uploadingItem => {
190
- if (!uploadingItem || !uploadingItem.result) {
191
- return;
192
- }
193
- this.percentage = uploadingItem.result.uploadFile.progress.percentage;
194
- const { status } = uploadingItem.result;
195
- // 成功和失败都要上传结束
196
- if (status === ThyUploadStatus.done) {
197
- this.uploadingSubscription.unsubscribe();
198
- this.uploading = false;
199
- this.theContextService.removeUploadFile(this.fileItem);
200
- setTimeout(() => this.theContextService.uploadingStatus$.next(false), 0);
201
- }
202
- this.cdr.detectChanges();
203
- });
204
- }
205
- setImageNodes(imageInfo) {
206
- const path = AngularEditor.findPath(this.editor, this.element);
207
- const data = { type: ElementKinds.image, url: null, ...imageInfo };
208
- HistoryEditor.withoutSaving(this.editor, () => Transforms.setNodes(this.editor, data, { at: path }));
209
- }
210
- async uploadImage(file) {
211
- this.imageEntry = {
212
- align: this.imageEntry.align || Alignment.center,
213
- thumbUrl: URL.createObjectURL(file)
214
- };
215
- this.uploading = true;
216
- this.theContextService.uploadingStatus$.next(true);
217
- const [uploadFileEntity] = await this.imageUploaderService.uploadFileHandle([file]).toPromise();
218
- const { thumbUrl, originUrl } = uploadFileEntity;
219
- const imageInfo = {
220
- name: file.name,
221
- thumbUrl,
222
- originUrl,
223
- align: this.imageEntry.align || Alignment.center,
224
- size: file.size
225
- };
226
- this.setImageNodes(imageInfo);
227
- }
228
- startDrag(event, axis) {
229
- if (this.loadImageError || !this.img) {
230
- return;
231
- }
232
- event.preventDefault();
233
- this.dragable = true;
234
- const imgElement = this.img.nativeElement;
235
- const options = {
236
- axis,
237
- printerPositionX: event.pageX,
238
- printerPositionY: event.pageY,
239
- internalWidth: imgElement.width || this.imageEntry.width,
240
- internalHeight: imgElement.height || this.imageEntry.height,
241
- maxWidth: this.theContextService.getFirstElementChild().clientWidth
242
- };
243
- this.mouseMoveSubscription = this.theContextService.onMouseMove$.subscribe(e => this.mouseMoveHandle(e, options));
244
- }
245
- mouseMoveHandle(event, options) {
246
- if (this.dragable) {
247
- const { axis, printerPositionX, printerPositionY, internalWidth, internalHeight, maxWidth } = options;
248
- const isReversal = axis.includes('-');
249
- let offsetX = event.pageX - printerPositionX;
250
- let offsetY = event.pageY - printerPositionY;
251
- let { width, height } = this.element;
252
- if (isReversal) {
253
- offsetX = -offsetX;
254
- offsetY = -offsetY;
255
- }
256
- if (this.element.align === 'center') {
257
- offsetX = offsetX * 2;
258
- }
259
- if (axis.includes('x')) {
260
- width = offsetX + internalWidth;
261
- if (width >= maxWidth) {
262
- width = maxWidth;
263
- // clear `layout` when the image is adjusted to the maximum value under rich media
264
- if (this.imageEntry?.layout) {
265
- const path = TheQueries.findPath(this.editor, this.element);
266
- ImageEditor.setImageNode(this.editor, path, { layout: undefined });
267
- }
268
- }
269
- if (width <= 100) {
270
- width = 100;
271
- }
272
- if (axis.includes('l')) {
273
- const ratio = internalWidth / width;
274
- height = internalHeight / ratio;
275
- }
276
- }
277
- else if (axis.includes('y')) {
278
- height = offsetY + internalHeight;
279
- if (height >= 1000) {
280
- height = 1000;
281
- }
282
- if (height <= 100) {
283
- height = 100;
284
- }
285
- if (axis.includes('l')) {
286
- const ratio = internalHeight / height;
287
- width = internalWidth / ratio;
288
- }
289
- }
290
- if (!this.imageEntry.reSized && this.imageEntry.width !== width) {
291
- this.imageEntry.reSized = true;
292
- }
293
- this.img.nativeElement.style.width = width + 'px';
294
- this.imageEntry.width = width;
295
- this.imageEntry.height = height;
296
- }
297
- }
298
- endDrag(event) {
299
- if (this.dragable) {
300
- this.dragable = false;
301
- this.mouseMoveSubscription.unsubscribe();
302
- if (this.imageEntry.width === this.theContextService.getOptions().width &&
303
- this.imageEntry.width <= this.naturalWidth &&
304
- this.element.width) {
305
- this.imageEntry.width = null;
306
- this.imageEntry.height = null;
307
- }
308
- Transforms.setNodes(this.editor, {
309
- type: ElementKinds.image,
310
- ...this.imageEntry
311
- }, { at: this.selection });
312
- }
313
- }
314
- cancelUpload(event) {
315
- Transforms.removeNodes(this.editor, { at: this.selection });
316
- }
317
- isShouldOpen() {
318
- const { theOptions: { richMedia } } = this.theContextService.getOptions();
319
- return (!this?.readonly &&
320
- richMedia &&
321
- this.isCollapsedAndNonReadonly &&
322
- TheQueries.isGlobalCollapsed(this.editor) &&
323
- !this.uploading &&
324
- !this.isOpen);
325
- }
326
- isShouldClose() {
327
- return (this.isOpen &&
328
- (this?.readonly || !this.isCollapsedAndNonReadonly || !TheQueries.isGlobalCollapsed(this.editor) || this.uploading));
329
- }
330
- openLayoutToolbar() {
331
- if (!this.img) {
332
- return;
333
- }
334
- this.layoutToolbarRef = this.thyPopover.open(this.layoutToolbar, {
335
- origin: this.imageContent,
336
- panelClass: 'the-plugin-toolbar-popover',
337
- insideClosable: false,
338
- backdropClosable: true,
339
- hasBackdrop: false,
340
- minWidth: 0,
341
- viewContainerRef: this.viewContainerRef,
342
- scrollStrategy: this.overlay.scrollStrategies.reposition()
343
- });
344
- this.layoutToolbarRef?.getOverlayRef().updatePositionStrategy(this.createPositionStrategy());
345
- setTimeout(() => {
346
- this.layoutToolbarRef?.getOverlayRef().updatePosition();
347
- }, 150);
348
- }
349
- closeLayoutToolbar() {
350
- this.layoutToolbarRef?.close();
351
- }
352
- layoutActive(key) {
353
- const { layout, align } = this.imageEntry;
354
- return key && ((key === align && !layout) || key === layout);
355
- }
356
- setImageNode(e, partial) {
357
- e.preventDefault();
358
- const path = TheQueries.findPath(this.editor, this.element);
359
- ImageEditor.setImageNode(this.editor, path, partial);
360
- }
361
- setBlockCardLayoutAttr() {
362
- Promise.resolve().then(() => {
363
- const currentElement = AngularEditor.toDOMNode(this.editor, this.element);
364
- const blockCard = currentElement.closest('.slate-block-card');
365
- const { layout } = this.element;
366
- if (blockCard && layout) {
367
- blockCard.setAttribute('layout', layout);
368
- }
369
- else if (blockCard && !layout) {
370
- blockCard.removeAttribute('layout');
371
- }
372
- this.layoutToolbarRef?.getOverlayRef().updatePosition();
373
- });
374
- }
375
- onDelete(event) {
376
- event.preventDefault();
377
- TheTransforms.deleteElement(this.editor, this.element);
378
- }
379
- createPositionStrategy() {
380
- const bottomPosition = {
381
- originX: 'center',
382
- originY: 'bottom',
383
- overlayX: 'center',
384
- overlayY: 'top',
385
- offsetX: 0,
386
- offsetY: 4
387
- };
388
- return this.overlay
389
- .position()
390
- .flexibleConnectedTo(this.imageContent)
391
- .withFlexibleDimensions(false)
392
- .withGrowAfterOpen(false)
393
- .withPush(false)
394
- .withPositions([bottomPosition]);
395
- }
396
- imageLoaded(event) {
397
- const img = event.target;
398
- this.naturalWidth = img.naturalWidth;
399
- this.naturalHeight = img.naturalHeight;
400
- }
401
- imageError(event) {
402
- const img = event.target;
403
- const errorImageUrl = this.imagePluginOptions?.errorImageUrl;
404
- if (errorImageUrl) {
405
- const url = typeof errorImageUrl === 'function' ? errorImageUrl(this.editor) : errorImageUrl;
406
- this.loadImageError = true;
407
- this.disablePreview = true;
408
- this.imageContent.nativeElement.classList.add('the-image-error');
409
- img.src = url;
410
- }
411
- img.onerror = null;
412
- }
413
- // 组件库 dialog 弹出时,会记录当前的焦点。阻止 mousedown 默认行为,使得图片原本的 click 事件能获取到正确的焦点。
414
- preventDefault(event) {
415
- event.preventDefault();
416
- event.stopPropagation();
417
- }
418
- }
419
- TheImageComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: TheImageComponent, deps: [{ token: i0.ElementRef }, { token: THE_UPLOAD_SERVICE_TOKEN }, { token: i0.ChangeDetectorRef }, { token: i1.TheContextService }, { token: i2.ThyPopover }, { token: i3.Overlay }, { token: i0.ViewContainerRef }, { token: i4.ThyImageGroupComponent }], target: i0.ɵɵFactoryTarget.Component });
420
- TheImageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: TheImageComponent, selector: "the-image, [theImage]", viewQueries: [{ propertyName: "imageContent", first: true, predicate: ["imageContent"], descendants: true }, { propertyName: "img", first: true, predicate: ["img"], descendants: true }, { propertyName: "layoutToolbar", first: true, predicate: ["layoutToolbar"], descendants: true, static: true }, { propertyName: "imageDirective", first: true, predicate: ThyImageDirective, descendants: true }], usesInheritance: true, ngImport: i0, template: "<slate-children [children]=\"children\" [context]=\"childrenContext\" [viewContext]=\"viewContext\"></slate-children>\n\n<div class=\"image-container\" contenteditable=\"false\" [style.textAlign]=\"imageEntry.align\">\n <div #imageContent *ngIf=\"imageEntry.thumbUrl\" class=\"image-content\" [class.cursor-pointer]=\"!selection\">\n <img\n #img\n thyImage\n class=\"main-image\"\n [class.image-collapsed]=\"selection && !uploading\"\n [ngStyle]=\"{ 'width.px': imageBindingWidth }\"\n [alt]=\"imageEntry.name\"\n [thySrc]=\"imageEntry.thumbUrl\"\n [thyPreviewSrc]=\"imageEntry.thumbUrl\"\n [thyOriginSrc]=\"imageEntry.originUrl\"\n [thyDisablePreview]=\"disablePreview\"\n [thyImageMeta]=\"{ name: imageEntry.name, size: imageEntry.size }\"\n (load)=\"imageLoaded($event)\"\n (mousedown)=\"preventDefault($event)\"\n (error)=\"imageError($event)\"\n (click)=\"imageClick($event)\"\n />\n <div *ngIf=\"isCollapsedAndNonReadonly\" class=\"image-profile\" [class.outline]=\"selection\">\n <ng-container *ngIf=\"!loadImageError\">\n <span (mousedown)=\"startDrag($event, '-xl')\" class=\"image-pointer left top\"></span>\n <span (mousedown)=\"startDrag($event, 'xl')\" class=\"image-pointer right top\"></span>\n <span (mousedown)=\"startDrag($event, 'xl')\" class=\"image-pointer right bottom\"></span>\n <span (mousedown)=\"startDrag($event, '-xl')\" class=\"image-pointer left bottom\"></span>\n </ng-container>\n </div>\n <div *ngIf=\"uploading\" class=\"uploading\">\n <div class=\"uploading-percentage\">\n <thy-progress thyType=\"primary\" [thyValue]=\"percentage\" thySize=\"sm\"></thy-progress>\n <thy-icon (click)=\"cancelUpload($event)\" thyIconName=\"close-circle-bold-fill\" thyIconLegging=\"true\"> </thy-icon>\n </div>\n </div>\n <div *ngIf=\"!uploading\" class=\"layer\" [class.readonly]=\"readonly\"></div>\n </div>\n <div *ngIf=\"!imageEntry.thumbUrl\" class=\"image-loading cursor-pointer\" contenteditable=\"false\">\n <thy-icon thyIconName=\"image\"></thy-icon>\n </div>\n</div>\n\n<ng-template #layoutToolbar>\n <thy-actions thySize=\"xxs\">\n <ng-container *ngFor=\"let item of layoutOptions\">\n <a\n *ngIf=\"item.key !== 'split'\"\n href=\"javascript:;\"\n thyAction\n [thyType]=\"item.key === 'remove' ? 'danger' : 'primary'\"\n [thyActionIcon]=\"item.icon\"\n [thyActionActive]=\"layoutActive(item.key)\"\n [thyTooltip]=\"item.name\"\n thyTooltipPlacement=\"top\"\n (mousedown)=\"item?.handle($event, item.key)\"\n ></a>\n <thy-divider *ngIf=\"item.key === 'split'\" class=\"mr-2 ml-1 align-self-center\" [thyVertical]=\"true\"></thy-divider>\n </ng-container>\n </thy-actions>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i6.SlateChildrenComponent, selector: "slate-children", inputs: ["children", "context", "viewContext"] }, { kind: "component", type: i7.ThyIconComponent, selector: "thy-icon, [thy-icon]", inputs: ["thyIconType", "thyTwotoneColor", "thyIconName", "thyIconRotate", "thyIconSet", "thyIconLegging", "thyIconLinearGradient"] }, { kind: "directive", type: i8.ThyTooltipDirective, selector: "[thyTooltip],[thy-tooltip]", inputs: ["thyTooltip", "thyTooltipPlacement", "thyTooltipClass", "thyTooltipShowDelay", "thyTooltipHideDelay", "thyTooltipTrigger", "thyTooltipDisabled", "thyTooltipTemplateContext", "thyTooltipOffset", "thyTooltipPin"], exportAs: ["thyTooltip"] }, { kind: "component", type: i9.ThyProgressComponent, selector: "thy-progress", inputs: ["thyType", "thySize", "thyValue", "thyMax", "thyTips", "thyShape", "thyGapDegree", "thyGapPosition", "thyStrokeWidth"] }, { kind: "directive", type: i4.ThyImageDirective, selector: "img[thyImage]", inputs: ["thySrc", "thyPreviewSrc", "thyOriginSrc", "thyImageMeta", "thyDisablePreview", "thyResolveSize"], exportAs: ["thyImage"] }, { kind: "component", type: i10.ThyActionComponent, selector: "thy-action, [thyAction]", inputs: ["thyType", "thyIcon", "thyActionIcon", "thyActive", "thyActionActive", "thyTheme", "thyHoverIcon", "thyDisabled"] }, { kind: "component", type: i10.ThyActionsComponent, selector: "thy-actions", inputs: ["thySize"] }, { kind: "component", type: i11.ThyDividerComponent, selector: "thy-divider", inputs: ["thyVertical", "thyStyle", "thyColor", "thyText", "thyTextDirection", "thyDeeper"] }] });
421
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: TheImageComponent, decorators: [{
422
- type: Component,
423
- args: [{ selector: 'the-image, [theImage]', template: "<slate-children [children]=\"children\" [context]=\"childrenContext\" [viewContext]=\"viewContext\"></slate-children>\n\n<div class=\"image-container\" contenteditable=\"false\" [style.textAlign]=\"imageEntry.align\">\n <div #imageContent *ngIf=\"imageEntry.thumbUrl\" class=\"image-content\" [class.cursor-pointer]=\"!selection\">\n <img\n #img\n thyImage\n class=\"main-image\"\n [class.image-collapsed]=\"selection && !uploading\"\n [ngStyle]=\"{ 'width.px': imageBindingWidth }\"\n [alt]=\"imageEntry.name\"\n [thySrc]=\"imageEntry.thumbUrl\"\n [thyPreviewSrc]=\"imageEntry.thumbUrl\"\n [thyOriginSrc]=\"imageEntry.originUrl\"\n [thyDisablePreview]=\"disablePreview\"\n [thyImageMeta]=\"{ name: imageEntry.name, size: imageEntry.size }\"\n (load)=\"imageLoaded($event)\"\n (mousedown)=\"preventDefault($event)\"\n (error)=\"imageError($event)\"\n (click)=\"imageClick($event)\"\n />\n <div *ngIf=\"isCollapsedAndNonReadonly\" class=\"image-profile\" [class.outline]=\"selection\">\n <ng-container *ngIf=\"!loadImageError\">\n <span (mousedown)=\"startDrag($event, '-xl')\" class=\"image-pointer left top\"></span>\n <span (mousedown)=\"startDrag($event, 'xl')\" class=\"image-pointer right top\"></span>\n <span (mousedown)=\"startDrag($event, 'xl')\" class=\"image-pointer right bottom\"></span>\n <span (mousedown)=\"startDrag($event, '-xl')\" class=\"image-pointer left bottom\"></span>\n </ng-container>\n </div>\n <div *ngIf=\"uploading\" class=\"uploading\">\n <div class=\"uploading-percentage\">\n <thy-progress thyType=\"primary\" [thyValue]=\"percentage\" thySize=\"sm\"></thy-progress>\n <thy-icon (click)=\"cancelUpload($event)\" thyIconName=\"close-circle-bold-fill\" thyIconLegging=\"true\"> </thy-icon>\n </div>\n </div>\n <div *ngIf=\"!uploading\" class=\"layer\" [class.readonly]=\"readonly\"></div>\n </div>\n <div *ngIf=\"!imageEntry.thumbUrl\" class=\"image-loading cursor-pointer\" contenteditable=\"false\">\n <thy-icon thyIconName=\"image\"></thy-icon>\n </div>\n</div>\n\n<ng-template #layoutToolbar>\n <thy-actions thySize=\"xxs\">\n <ng-container *ngFor=\"let item of layoutOptions\">\n <a\n *ngIf=\"item.key !== 'split'\"\n href=\"javascript:;\"\n thyAction\n [thyType]=\"item.key === 'remove' ? 'danger' : 'primary'\"\n [thyActionIcon]=\"item.icon\"\n [thyActionActive]=\"layoutActive(item.key)\"\n [thyTooltip]=\"item.name\"\n thyTooltipPlacement=\"top\"\n (mousedown)=\"item?.handle($event, item.key)\"\n ></a>\n <thy-divider *ngIf=\"item.key === 'split'\" class=\"mr-2 ml-1 align-self-center\" [thyVertical]=\"true\"></thy-divider>\n </ng-container>\n </thy-actions>\n</ng-template>\n" }]
424
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: undefined, decorators: [{
425
- type: Inject,
426
- args: [THE_UPLOAD_SERVICE_TOKEN]
427
- }] }, { type: i0.ChangeDetectorRef }, { type: i1.TheContextService }, { type: i2.ThyPopover }, { type: i3.Overlay }, { type: i0.ViewContainerRef }, { type: i4.ThyImageGroupComponent }]; }, propDecorators: { imageContent: [{
428
- type: ViewChild,
429
- args: ['imageContent']
430
- }], img: [{
431
- type: ViewChild,
432
- args: ['img', { static: false }]
433
- }], layoutToolbar: [{
434
- type: ViewChild,
435
- args: ['layoutToolbar', { static: true }]
436
- }], imageDirective: [{
437
- type: ViewChild,
438
- args: [ThyImageDirective]
439
- }] } });
440
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvc3JjL3BsdWdpbnMvaW1hZ2UvaW1hZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvc3JjL3BsdWdpbnMvaW1hZ2UvaW1hZ2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUdILFNBQVMsRUFFVCxNQUFNLEVBSU4sU0FBUyxFQUVaLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVwRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxFQUFVLFVBQVUsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUMzQyxPQUFPLEVBQUUsYUFBYSxFQUE0QyxNQUFNLGVBQWUsQ0FBQztBQUN4RixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXRHLE9BQU8sRUFBRSxVQUFVLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN2RSxPQUFPLEVBSUgsd0JBQXdCLEVBRzNCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxLQUFLLFVBQVUsTUFBTSxlQUFlLENBQUM7QUFFNUMsT0FBTyxLQUFLLGFBQWEsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGlCQUFpQixFQUEwQixNQUFNLGtCQUFrQixDQUFDOzs7Ozs7Ozs7Ozs7O0FBUTdFLE1BQU0sT0FB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TUFBTSxHQUFHLEdBQUcsT0FBTyxhQUFhLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7WUFDN0YsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7WUFDM0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7WUFDM0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ2pFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1NBQ2pCO1FBQ0QsR0FBRyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFDdkIsQ0FBQztJQUVELHVFQUF1RTtJQUN2RSxjQUFjLENBQUMsS0FBWTtRQUN2QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzVCLENBQUM7OzhHQWhlUSxpQkFBaUIsNENBb0dkLHdCQUF3QjtrR0FwRzNCLGlCQUFpQix3WUFnR2YsaUJBQWlCLHVFQzVJaEMsd3pGQTREQTsyRkRoQmEsaUJBQWlCO2tCQUo3QixTQUFTOytCQUNJLHVCQUF1Qjs7MEJBdUc1QixNQUFNOzJCQUFDLHdCQUF3QjsrTkFacEMsWUFBWTtzQkFEWCxTQUFTO3VCQUFDLGNBQWM7Z0JBSXpCLEdBQUc7c0JBREYsU0FBUzt1QkFBQyxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUluQyxhQUFhO3NCQURaLFNBQVM7dUJBQUMsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFHZCxjQUFjO3NCQUEzQyxTQUFTO3VCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbm5lY3RlZFBvc2l0aW9uLCBPdmVybGF5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEluamVjdCxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3Q29udGFpbmVyUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVGh5UG9wb3ZlciwgVGh5UG9wb3ZlclJlZiB9IGZyb20gJ25neC10ZXRoeXMvcG9wb3Zlcic7XG5pbXBvcnQgeyBUaHlVcGxvYWRTdGF0dXMgfSBmcm9tICduZ3gtdGV0aHlzL3VwbG9hZCc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzL2ludGVybmFsL1N1YnNjcmlwdGlvbic7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBFZGl0b3IsIFRyYW5zZm9ybXMgfSBmcm9tICdzbGF0ZSc7XG5pbXBvcnQgeyBBbmd1bGFyRWRpdG9yLCBCZWZvcmVDb250ZXh0Q2hhbmdlLCBTbGF0ZUVsZW1lbnRDb250ZXh0IH0gZnJvbSAnc2xhdGUtYW5ndWxhcic7XG5pbXBvcnQgeyBIaXN0b3J5RWRpdG9yIH0gZnJvbSAnc2xhdGUtaGlzdG9yeSc7XG5pbXBvcnQgeyBBbGlnbm1lbnQsIEVsZW1lbnRLaW5kcywgTGF5b3V0VHlwZXMsIFRvb2xiYXJBY3Rpb25UeXBlcyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9ub2RlLXR5cGVzJztcbmltcG9ydCB7IEltYWdlRWxlbWVudCB9IGZyb20gJy4uLy4uL2N1c3RvbS10eXBlcyc7XG5pbXBvcnQgeyBQbHVnaW5LZXlzLCBUaGVCYXNlRWxlbWVudENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHtcbiAgICBJbWFnZUVudHJ5LFxuICAgIExheW91dE9wdGlvbixcbiAgICBUaGVJbWFnZVVwbG9hZGVyU2VydmljZSxcbiAgICBUSEVfVVBMT0FEX1NFUlZJQ0VfVE9LRU4sXG4gICAgSW1hZ2VQbHVnaW5PcHRpb25zLFxuICAgIEltYWdlSW5mb1xufSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2ltYWdlJztcbmltcG9ydCAqIGFzIFRoZVF1ZXJpZXMgZnJvbSAnLi4vLi4vcXVlcmllcyc7XG5pbXBvcnQgeyBUaGVDb250ZXh0U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NvbnRleHQuc2VydmljZSc7XG5pbXBvcnQgKiBhcyBUaGVUcmFuc2Zvcm1zIGZyb20gJy4uLy4uL3RyYW5zZm9ybXMnO1xuaW1wb3J0IHsgSW1hZ2VFZGl0b3IgfSBmcm9tICcuL2ltYWdlLmVkaXRvcic7XG5pbXBvcnQgeyBnZXRQbHVnaW5PcHRpb25zIH0gZnJvbSAnLi4vLi4vY29yZS91dGlscyc7XG5pbXBvcnQgeyBUaHlJbWFnZURpcmVjdGl2ZSwgVGh5SW1hZ2VHcm91cENvbXBvbmVudCB9IGZyb20gJ25neC10ZXRoeXMvaW1hZ2UnO1xuXG5kZWNsYXJlIGNvbnN0ICQ6IGFueTtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd0aGUtaW1hZ2UsIFt0aGVJbWFnZV0nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9pbWFnZS5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgVGhlSW1hZ2VDb21wb25lbnRcbiAgICBleHRlbmRzIFRoZUJhc2VFbGVtZW50Q29tcG9uZW50PEltYWdlRWxlbWVudCwgRWRpdG9yPlxuICAgIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQsIEJlZm9yZUNvbnRleHRDaGFuZ2U8U2xhdGVFbGVtZW50Q29udGV4dD5cbntcbiAgICBuYXR1cmFsV2lkdGggPSAwO1xuXG4gICAgbmF0dXJhbEhlaWdodCA9IDA7XG5cbiAgICBpbWFnZUVudHJ5OiBJbWFnZUVudHJ5ID0ge307XG5cbiAgICB1cGxvYWRpbmcgPSBmYWxzZTtcblxuICAgIHBlcmNlbnRhZ2UgPSAwO1xuXG4gICAgZmlsZUl0ZW06IHsgdXJsOiBzdHJpbmc7IGZpbGU6IEZpbGUgfTtcblxuICAgIGxheW91dERlZmF1bHRXaWR0aCA9IDM2ODtcblxuICAgIGRpc2FibGVQcmV2aWV3ID0gZmFsc2U7XG5cbiAgICBsb2FkSW1hZ2VFcnJvciA9IGZhbHNlO1xuXG4gICAgbGF5b3V0T3B0aW9uczogTGF5b3V0T3B0aW9uW10gPSBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIGtleTogQWxpZ25tZW50LmxlZnQsXG4gICAgICAgICAgICBpY29uOiAnaW1hZ2UtbGVmdCcsXG4gICAgICAgICAgICBuYW1lOiAn5bem5a+56b2QJyxcbiAgICAgICAgICAgIGhhbmRsZTogKGU6IE1vdXNlRXZlbnQsIGtleTogQWxpZ25tZW50KSA9PiB0aGlzLnNldEltYWdlTm9kZShlLCB7IGFsaWduOiBrZXksIGxheW91dDogdW5kZWZpbmVkIH0pXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGtleTogQWxpZ25tZW50LmNlbnRlcixcbiAgICAgICAgICAgIGljb246ICdpbWFnZS1jZW50ZXInLFxuICAgICAgICAgICAgbmFtZTogJ+WxheS4rScsXG4gICAgICAgICAgICBoYW5kbGU6IChlOiBNb3VzZUV2ZW50LCBrZXk6IEFsaWdubWVudCkgPT4gdGhpcy5zZXRJbWFnZU5vZGUoZSwgeyBhbGlnbjoga2V5LCBsYXlvdXQ6IHVuZGVmaW5lZCB9KVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBrZXk6IEFsaWdubWVudC5yaWdodCxcbiAgICAgICAgICAgIGljb246ICdpbWFnZS1yaWdodCcsXG4gICAgICAgICAgICBuYW1lOiAn5Y+z5a+56b2QJyxcbiAgICAgICAgICAgIGhhbmRsZTogKGU6IE1vdXNlRXZlbnQsIGtleTogQWxpZ25tZW50KSA9PiB0aGlzLnNldEltYWdlTm9kZShlLCB7IGFsaWduOiBrZXksIGxheW91dDogdW5kZWZpbmVkIH0pXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGtleTogVG9vbGJhckFjdGlvblR5cGVzLnNwbGl0XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGtleTogTGF5b3V0VHlwZXMud3JhcExlZnQsXG4gICAgICAgICAgICBpY29uOiAnd3JhcC1sZWZ0JyxcbiAgICAgICAgICAgIG5hbWU6ICflm77niYflsYXlt6YnLFxuICAgICAgICAgICAgaGFuZGxlOiAoZTogTW91c2VFdmVudCwga2V5OiBMYXlvdXRUeXBlcykgPT4gdGhpcy5zZXRJbWFnZU5vZGUoZSwgeyBsYXlvdXQ6IGtleSB9KVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBrZXk6IExheW91dFR5cGVzLndyYXBSaWdodCxcbiAgICAgICAgICAgIGljb246ICd3cmFwLXJpZ2h0JyxcbiAgICAgICAgICAgIG5hbWU6ICflm77niYflsYXlj7MnLFxuICAgICAgICAgICAgaGFuZGxlOiAoZTogTW91c2VFdmVudCwga2V5OiBMYXlvdXRUeXBlcykgPT4gdGhpcy5zZXRJbWFnZU5vZGUoZSwgeyBsYXlvdXQ6IGtleSB9KVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBrZXk6ICdyZW1vdmUnLFxuICAgICAgICAgICAgaWNvbjogJ3RyYXNoJyxcbiAgICAgICAgICAgIG5hbWU6ICfliKDpmaQnLFxuICAgICAgICAgICAgaGFuZGxlOiAoZTogTW91c2VFdmVudCkgPT4gdGhpcy5vbkRlbGV0ZShlKVxuICAgICAgICB9XG4gICAgXTtcblxuICAgIHByaXZhdGUgdXBsb2FkaW5nU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgICBwcml2YXRlIG1vdXNlTW92ZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gICAgcHJpdmF0ZSBtb3VzZVVwU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgICBwcml2YXRlIGRyYWdhYmxlID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIGxheW91dFRvb2xiYXJSZWY6IFRoeVBvcG92ZXJSZWY8YW55PjtcblxuICAgIHByaXZhdGUgaW1hZ2VQbHVnaW5PcHRpb25zOiBJbWFnZVBsdWdpbk9wdGlvbnM7XG5cbiAgICBnZXQgaXNPcGVuKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXlvdXRUb29sYmFyUmVmICYmIHRoaXMubGF5b3V0VG9vbGJhclJlZi5nZXRPdmVybGF5UmVmKCkgJiYgdGhpcy5sYXlvdXRUb29sYmFyUmVmLmdldE92ZXJsYXlSZWYoKS5oYXNBdHRhY2hlZCgpO1xuICAgIH1cblxuICAgIGdldCBpbWFnZUJpbmRpbmdXaWR0aCgpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFdpZHRoID0gdGhpcy5pbWFnZUVudHJ5Py53aWR0aCB8fCB0aGlzLm5hdHVyYWxXaWR0aDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2VFbnRyeT8ubGF5b3V0ICYmIGN1cnJlbnRXaWR0aCA+IHRoaXMubGF5b3V0RGVmYXVsdFdpZHRoICYmICF0aGlzLmltYWdlRW50cnk/LnJlU2l6ZWRcbiAgICAgICAgICAgID8gdGhpcy5sYXlvdXREZWZhdWx0V2lkdGhcbiAgICAgICAgICAgIDogdGhpcy5pbWFnZUVudHJ5LndpZHRoO1xuICAgIH1cblxuICAgIEBWaWV3Q2hpbGQoJ2ltYWdlQ29udGVudCcpXG4gICAgaW1hZ2VDb250ZW50OiBFbGVtZW50UmVmO1xuXG4gICAgQFZpZXdDaGlsZCgnaW1nJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gICAgaW1nOiBFbGVtZW50UmVmO1xuXG4gICAgQFZpZXdDaGlsZCgnbGF5b3V0VG9vbGJhcicsIHsgc3RhdGljOiB0cnVlIH0pXG4gICAgbGF5b3V0VG9vbGJhcjogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIEBWaWV3Q2hpbGQoVGh5SW1hZ2VEaXJlY3RpdmUpIGltYWdlRGlyZWN0aXZlOiBUaHlJbWFnZURpcmVjdGl2ZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICAgICAgQEluamVjdChUSEVfVVBMT0FEX1NFUlZJQ0VfVE9LRU4pXG4gICAgICAgIHByaXZhdGUgaW1hZ2VVcGxvYWRlclNlcnZpY2U6IFRoZUltYWdlVXBsb2FkZXJTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJpdmF0ZSB0aGVDb250ZXh0U2VydmljZTogVGhlQ29udGV4dFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgdGh5UG9wb3ZlcjogVGh5UG9wb3ZlcixcbiAgICAgICAgcHJpdmF0ZSBvdmVybGF5OiBPdmVybGF5LFxuICAgICAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgICAgIHB1YmxpYyBpbWFnZUdyb3VwQ29tcG9uZW50OiBUaHlJbWFnZUdyb3VwQ29tcG9uZW50XG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGVsZW1lbnRSZWYsIGNkcik7XG4gICAgfVxuXG4gICAgYmVmb3JlQ29udGV4dENoYW5nZSA9ICh2YWx1ZTogU2xhdGVFbGVtZW50Q29udGV4dDxJbWFnZUVsZW1lbnQ+KSA9PiB7XG4gICAgICAgIGlmICh2YWx1ZS5lbGVtZW50ICE9PSB0aGlzLmVsZW1lbnQgJiYgdmFsdWUuZWxlbWVudC50aHVtYlVybCkge1xuICAgICAgICAgICAgbGV0IHRodW1iVXJsID0gdmFsdWUuZWxlbWVudC50aHVtYlVybDtcbiAgICAgICAgICAgIGxldCBvcmlnaW5VcmwgPSB2YWx1ZS5lbGVtZW50Lm9yaWdpblVybDtcbiAgICAgICAgICAgIGNvbnN0IGJhc2VVcmwgPSB0aGlzLmltYWdlVXBsb2FkZXJTZXJ2aWNlLmdldEJhc2VVcmw/LigpIHx8ICcnO1xuICAgICAgICAgICAgaWYgKGJhc2VVcmwgJiYgdGh1bWJVcmwuc3RhcnRzV2l0aCgnaHR0cCcpKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2xpY2UgPSAnL2ZpbGVzL3B1YmxpYy8nO1xuICAgICAgICAgICAgICAgIHRodW1iVXJsID0gYCR7YmFzZVVybH0ke3NsaWNlfSR7dGh1bWJVcmwuc2xpY2UodGh1bWJVcmwuaW5kZXhPZihzbGljZSkgKyBzbGljZS5sZW5ndGgsIHRodW1iVXJsLmxlbmd0aCl9YDtcbiAgICAgICAgICAgICAgICBvcmlnaW5VcmwgPSBgJHtiYXNlVXJsfSR7c2xpY2V9JHtvcmlnaW5Vcmwuc2xpY2Uob3JpZ2luVXJsLmluZGV4T2Yoc2xpY2UpICsgc2xpY2UubGVuZ3RoLCBvcmlnaW5VcmwubGVuZ3RoKX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5pbWFnZUVudHJ5ID0ge1xuICAgICAgICAgICAgICAgIC8vIG5hbWU6IHZhbHVlLmVsZW1lbnQubmFtZSxcbiAgICAgICAgICAgICAgICBuYW1lOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgd2lkdGg6IHZhbHVlLmVsZW1lbnQud2lkdGgsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiB2YWx1ZS5lbGVtZW50LmhlaWdodCxcbiAgICAgICAgICAgICAgICB0aHVtYlVybCxcbiAgICAgICAgICAgICAgICBvcmlnaW5VcmwsXG4gICAgICAgICAgICAgICAgYWxpZ246IHZhbHVlLmVsZW1lbnQuYWxpZ24gfHwgQWxpZ25tZW50LmxlZnQsXG4gICAgICAgICAgICAgICAgbGF5b3V0OiB2YWx1ZS5lbGVtZW50LmxheW91dCxcbiAgICAgICAgICAgICAgICByZVNpemVkOiB2YWx1ZS5lbGVtZW50LnJlU2l6ZWQgfHwgZmFsc2UsXG4gICAgICAgICAgICAgICAgc2l6ZTogdmFsdWUuZWxlbWVudC5zaXplXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5zZXRCbG9ja0NhcmRMYXlvdXRBdHRyKCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuZmlsZUl0ZW0gPSB0aGlzLnRoZUNvbnRleHRTZXJ2aWNlLnVwbG9hZGluZ0ZpbGVzLmZpbmQoaXRlbSA9PiBpdGVtLnVybCA9PT0gdGhpcy5lbGVtZW50LnVybCk7XG4gICAgICAgIGlmICh0aGlzLmZpbGVJdGVtPy5maWxlICYmIHRoaXMuZmlsZUl0ZW0uZmlsZSBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICAgICAgICAgIHRoaXMudXBsb2FkSW1hZ2UodGhpcy5maWxlSXRlbS5maWxlKTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xuICAgICAgICB0aGlzLmltYWdlUGx1Z2luT3B0aW9ucyA9IGdldFBsdWdpbk9wdGlvbnM8SW1hZ2VQbHVnaW5PcHRpb25zPih0aGlzLmVkaXRvciwgUGx1Z2luS2V5cy5pbWFnZSk7XG4gICAgICAgIGlmICh0aGlzLmltYWdlUGx1Z2luT3B0aW9ucy5kaXNhYmxlUHJldmlldyAmJiB0eXBlb2YgdGhpcy5pbWFnZVBsdWdpbk9wdGlvbnMuZGlzYWJsZVByZXZpZXcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZVByZXZpZXcgPSB0aGlzLmltYWdlUGx1Z2luT3B0aW9ucy5kaXNhYmxlUHJldmlldyh0aGlzLmVkaXRvcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRpc2FibGVQcmV2aWV3ID0gdGhpcy5pbWFnZVBsdWdpbk9wdGlvbnMuZGlzYWJsZVByZXZpZXcgYXMgYm9vbGVhbjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGltYWdlQ2xpY2soKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pbWFnZUdyb3VwQ29tcG9uZW50LmltYWdlcy5maW5kSW5kZXgoaXRlbSA9PiBpdGVtID09PSB0aGlzLmltYWdlRGlyZWN0aXZlKTtcbiAgICAgICAgY29uc3QgaW1hZ2VHcm91cCA9IHRoaXMuaW1hZ2VHcm91cENvbXBvbmVudC5pbWFnZXMubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBvcmlnaW5Vcmw6IGl0ZW0udGh5T3JpZ2luU3JjLFxuICAgICAgICAgICAgICAgIHRodW1iVXJsOiBpdGVtLnRoeVByZXZpZXdTcmMsXG4gICAgICAgICAgICAgICAgbmFtZTogaXRlbS50aHlJbWFnZU1ldGEubmFtZSxcbiAgICAgICAgICAgICAgICBzaXplOiBpdGVtLnRoeUltYWdlTWV0YS5zaXplXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KSBhcyBJbWFnZUluZm9bXTtcbiAgICAgICAgY29uc3QgeyBvcmlnaW5VcmwsIHRodW1iVXJsLCBuYW1lLCBzaXplIH0gPSB0aGlzLmVsZW1lbnQ7XG4gICAgICAgIGlmICh0aGlzLmltYWdlUGx1Z2luT3B0aW9ucy5wcmV2aWV3KSB7XG4gICAgICAgICAgICB0aGlzLmltYWdlUGx1Z2luT3B0aW9ucy5wcmV2aWV3KHtcbiAgICAgICAgICAgICAgICBlZGl0b3I6IHRoaXMuZWRpdG9yLFxuICAgICAgICAgICAgICAgIHByZXZpZXdJbWFnZUluZm86IHtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2U6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpblVybCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRodW1iVXJsLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemVcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VHcm91cCxcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uQ29udGV4dENoYW5nZSgpIHtcbiAgICAgICAgc3VwZXIub25Db250ZXh0Q2hhbmdlKCk7XG4gICAgICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1Nob3VsZE9wZW4oKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3BlbkxheW91dFRvb2xiYXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmlzU2hvdWxkQ2xvc2UoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VMYXlvdXRUb29sYmFyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy51cGxvYWRpbmdTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5tb3VzZVVwU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMudGhlQ29udGV4dFNlcnZpY2UucmVtb3ZlVXBsb2FkRmlsZSh0aGlzLmZpbGVJdGVtKTtcbiAgICAgICAgaWYgKHRoaXMudXBsb2FkaW5nKSB7XG4gICAgICAgICAgICB0aGlzLnRoZUNvbnRleHRTZXJ2aWNlLnVwbG9hZGluZ1N0YXR1cyQubmV4dChmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMubW91c2VVcFN1YnNjcmlwdGlvbiA9IHRoaXMudGhlQ29udGV4dFNlcnZpY2Uub25Nb3VzZVVwJC5zdWJzY3JpYmUoZSA9PiB0aGlzLmVuZERyYWcoZSkpO1xuICAgICAgICB0aGlzLnVwbG9hZGluZ1N1YnNjcmlwdGlvbiA9IHRoaXMuaW1hZ2VVcGxvYWRlclNlcnZpY2VcbiAgICAgICAgICAgIC5nZXRVcGxvYWRpbmdJdGVtcyQoKVxuICAgICAgICAgICAgLnBpcGUobWFwKGZpbGVVcGxvYWRpbmdJdGVtID0+IHRoaXMuZmlsZUl0ZW0/LmZpbGUgJiYgZmlsZVVwbG9hZGluZ0l0ZW0uZmluZChpdGVtID0+IGl0ZW0uZmlsZSA9PT0gdGhpcy5maWxlSXRlbT8uZmlsZSkpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSh1cGxvYWRpbmdJdGVtID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXVwbG9hZGluZ0l0ZW0gfHwgIXVwbG9hZGluZ0l0ZW0ucmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5wZXJjZW50YWdlID0gdXBsb2FkaW5nSXRlbS5yZXN1bHQudXBsb2FkRmlsZS5wcm9ncmVzcy5wZXJjZW50YWdlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgc3RhdHVzIH0gPSB1cGxvYWRpbmdJdGVtLnJlc3VsdDtcbiAgICAgICAgICAgICAgICAvLyDmiJDlip/lkozlpLHotKXpg73opoHkuIrkvKDnu5PmnZ9cbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09PSBUaHlVcGxvYWRTdGF0dXMuZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZGluZ1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRoZUNvbnRleHRTZXJ2aWNlLnJlbW92ZVVwbG9hZEZpbGUodGhpcy5maWxlSXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy50aGVDb250ZXh0U2VydmljZS51cGxvYWRpbmdTdGF0dXMkLm5leHQoZmFsc2UpLCAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0SW1hZ2VOb2RlcyhpbWFnZUluZm86IEltYWdlRW50cnkpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IEFuZ3VsYXJFZGl0b3IuZmluZFBhdGgodGhpcy5lZGl0b3IsIHRoaXMuZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB7IHR5cGU6IEVsZW1lbnRLaW5kcy5pbWFnZSwgdXJsOiBudWxsLCAuLi5pbWFnZUluZm8gfTtcbiAgICAgICAgSGlzdG9yeUVkaXRvci53aXRob3V0U2F2aW5nKHRoaXMuZWRpdG9yLCAoKSA9PiBUcmFuc2Zvcm1zLnNldE5vZGVzKHRoaXMuZWRpdG9yLCBkYXRhLCB7IGF0OiBwYXRoIH0pKTtcbiAgICB9XG5cbiAgICBhc3luYyB1cGxvYWRJbWFnZShmaWxlOiBGaWxlKSB7XG4gICAgICAgIHRoaXMuaW1hZ2VFbnRyeSA9IHtcbiAgICAgICAgICAgIGFsaWduOiB0aGlzLmltYWdlRW50cnkuYWxpZ24gfHwgQWxpZ25tZW50LmNlbnRlcixcbiAgICAgICAgICAgIHRodW1iVXJsOiBVUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUpXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMudXBsb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50aGVDb250ZXh0U2VydmljZS51cGxvYWRpbmdTdGF0dXMkLm5leHQodHJ1ZSk7XG4gICAgICAgIGNvbnN0IFt1cGxvYWRGaWxlRW50aXR5XSA9IGF3YWl0IHRoaXMuaW1hZ2VVcGxvYWRlclNlcnZpY2UudXBsb2FkRmlsZUhhbmRsZShbZmlsZV0pLnRvUHJvbWlzZSgpO1xuICAgICAgICBjb25zdCB7IHRodW1iVXJsLCBvcmlnaW5VcmwgfSA9IHVwbG9hZEZpbGVFbnRpdHk7XG4gICAgICAgIGNvbnN0IGltYWdlSW5mbzogSW1hZ2VFbnRyeSA9IHtcbiAgICAgICAgICAgIG5hbWU6IGZpbGUubmFtZSxcbiAgICAgICAgICAgIHRodW1iVXJsLFxuICAgICAgICAgICAgb3JpZ2luVXJsLFxuICAgICAgICAgICAgYWxpZ246IHRoaXMuaW1hZ2VFbnRyeS5hbGlnbiB8fCBBbGlnbm1lbnQuY2VudGVyLFxuICAgICAgICAgICAgc2l6ZTogZmlsZS5zaXplXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc2V0SW1hZ2VOb2RlcyhpbWFnZUluZm8pO1xuICAgIH1cblxuICAgIHN0YXJ0RHJhZyhldmVudDogTW91c2VFdmVudCwgYXhpczogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLmxvYWRJbWFnZUVycm9yIHx8ICF0aGlzLmltZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuZHJhZ2FibGUgPSB0cnVlO1xuICAgICAgICBjb25zdCBpbWdFbGVtZW50ID0gdGhpcy5pbWcubmF0aXZlRWxlbWVudCBhcyBIVE1MSW1hZ2VFbGVtZW50O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgYXhpcyxcbiAgICAgICAgICAgIHByaW50ZXJQb3NpdGlvblg6IGV2ZW50LnBhZ2VYLFxuICAgICAgICAgICAgcHJpbnRlclBvc2l0aW9uWTogZXZlbnQucGFnZVksXG4gICAgICAgICAgICBpbnRlcm5hbFdpZHRoOiBpbWdFbGVtZW50LndpZHRoIHx8IHRoaXMuaW1hZ2VFbnRyeS53aWR0aCxcbiAgICAgICAgICAgIGludGVybmFsSGVpZ2h0OiBpbWdFbGVtZW50LmhlaWdodCB8fCB0aGlzLmltYWdlRW50cnkuaGVpZ2h0LFxuICAgICAgICAgICAgbWF4V2lkdGg6IHRoaXMudGhlQ29udGV4dFNlcnZpY2UuZ2V0Rmlyc3RFbGVtZW50Q2hpbGQoKS5jbGllbnRXaWR0aFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLm1vdXNlTW92ZVN1YnNjcmlwdGlvbiA9IHRoaXMudGhlQ29udGV4dFNlcnZpY2Uub25Nb3VzZU1vdmUkLnN1YnNjcmliZShlID0+IHRoaXMubW91c2VNb3ZlSGFuZGxlKGUsIG9wdGlvbnMpKTtcbiAgICB9XG5cbiAgICBtb3VzZU1vdmVIYW5kbGUoXG4gICAgICAgIGV2ZW50OiBNb3VzZUV2ZW50LFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBheGlzOiBzdHJpbmc7XG4gICAgICAgICAgICBwcmludGVyUG9zaXRpb25YOiBudW1iZXI7XG4gICAgICAgICAgICBwcmludGVyUG9zaXRpb25ZOiBudW1iZXI7XG4gICAgICAgICAgICBpbnRlcm5hbFdpZHRoOiBudW1iZXI7XG4gICAgICAgICAgICBpbnRlcm5hbEhlaWdodDogbnVtYmVyO1xuICAgICAgICAgICAgbWF4V2lkdGg6IG51bWJlcjtcbiAgICAgICAgfVxuICAgICkge1xuICAgICAgICBpZiAodGhpcy5kcmFnYWJsZSkge1xuICAgICAgICAgICAgY29uc3QgeyBheGlzLCBwcmludGVyUG9zaXRpb25YLCBwcmludGVyUG9zaXRpb25ZLCBpbnRlcm5hbFdpZHRoLCBpbnRlcm5hbEhlaWdodCwgbWF4V2lkdGggfSA9IG9wdGlvbnM7XG4gICAgICAgICAgICBjb25zdCBpc1JldmVyc2FsID0gYXhpcy5pbmNsdWRlcygnLScpO1xuXG4gICAgICAgICAgICBsZXQgb2Zmc2V0WCA9IGV2ZW50LnBhZ2VYIC0gcHJpbnRlclBvc2l0aW9uWDtcbiAgICAgICAgICAgIGxldCBvZmZzZXRZID0gZXZlbnQucGFnZVkgLSBwcmludGVyUG9zaXRpb25ZO1xuICAgICAgICAgICAgbGV0IHsgd2lkdGgsIGhlaWdodCB9ID0gdGhpcy5lbGVtZW50O1xuXG4gICAgICAgICAgICBpZiAoaXNSZXZlcnNhbCkge1xuICAgICAgICAgICAgICAgIG9mZnNldFggPSAtb2Zmc2V0WDtcbiAgICAgICAgICAgICAgICBvZmZzZXRZID0gLW9mZnNldFk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5lbGVtZW50LmFsaWduID09PSAnY2VudGVyJykge1xuICAgICAgICAgICAgICAgIG9mZnNldFggPSBvZmZzZXRYICogMjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGF4aXMuaW5jbHVkZXMoJ3gnKSkge1xuICAgICAgICAgICAgICAgIHdpZHRoID0gb2Zmc2V0WCArIGludGVybmFsV2lkdGg7XG4gICAgICAgICAgICAgICAgaWYgKHdpZHRoID49IG1heFdpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIHdpZHRoID0gbWF4V2lkdGg7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgYGxheW91dGAgd2hlbiB0aGUgaW1hZ2UgaXMgYWRqdXN0ZWQgdG8gdGhlIG1heGltdW0gdmFsdWUgdW5kZXIgcmljaCBtZWRpYVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pbWFnZUVudHJ5Py5sYXlvdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSBUaGVRdWVyaWVzLmZpbmRQYXRoKHRoaXMuZWRpdG9yLCB0aGlzLmVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgSW1hZ2VFZGl0b3Iuc2V0SW1hZ2VOb2RlKHRoaXMuZWRpdG9yLCBwYXRoLCB7IGxheW91dDogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh3aWR0aCA8PSAxMDApIHtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAxMDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChheGlzLmluY2x1ZGVzKCdsJykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF0aW8gPSBpbnRlcm5hbFdpZHRoIC8gd2lkdGg7XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IGludGVybmFsSGVpZ2h0IC8gcmF0aW87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChheGlzLmluY2x1ZGVzKCd5JykpIHtcbiAgICAgICAgICAgICAgICBoZWlnaHQgPSBvZmZzZXRZICsgaW50ZXJuYWxIZWlnaHQ7XG4gICAgICAgICAgICAgICAgaWYgKGhlaWdodCA+PSAxMDAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IDEwMDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChoZWlnaHQgPD0gMTAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IDEwMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGF4aXMuaW5jbHVkZXMoJ2wnKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByYXRpbyA9IGludGVybmFsSGVpZ2h0IC8gaGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IGludGVybmFsV2lkdGggLyByYXRpbztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5pbWFnZUVudHJ5LnJlU2l6ZWQgJiYgdGhpcy5pbWFnZUVudHJ5LndpZHRoICE9PSB3aWR0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW1hZ2VFbnRyeS5yZVNpemVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaW1nLm5hdGl2ZUVsZW1lbnQuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7XG4gICAgICAgICAgICB0aGlzLmltYWdlRW50cnkud2lkdGggPSB3aWR0aDtcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VFbnRyeS5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBlbmREcmFnKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLmRyYWdhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLmRyYWdhYmxlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLm1vdXNlTW92ZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuaW1hZ2VFbnRyeS53aWR0aCA9PT0gdGhpcy50aGVDb250ZXh0U2VydmljZS5nZXRPcHRpb25zKCkud2lkdGggJiZcbiAgICAgICAgICAgICAgICB0aGlzLmltYWdlRW50cnkud2lkdGggPD0gdGhpcy5uYXR1cmFsV2lkdGggJiZcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQud2lkdGhcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW1hZ2VFbnRyeS53aWR0aCA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5pbWFnZUVudHJ5LmhlaWdodCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBUcmFuc2Zvcm1zLnNldE5vZGVzKFxuICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogRWxlbWVudEtpbmRzLmltYWdlLFxuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmltYWdlRW50cnlcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHsgYXQ6IHRoaXMuc2VsZWN0aW9uIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjYW5jZWxVcGxvYWQoZXZlbnQpIHtcbiAgICAgICAgVHJhbnNmb3Jtcy5yZW1vdmVOb2Rlcyh0aGlzLmVkaXRvciwgeyBhdDogdGhpcy5zZWxlY3Rpb24gfSk7XG4gICAgfVxuXG4gICAgaXNTaG91bGRPcGVuKCkge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICB0aGVPcHRpb25zOiB7IHJpY2hNZWRpYSB9XG4gICAgICAgIH0gPSB0aGlzLnRoZUNvbnRleHRTZXJ2aWNlLmdldE9wdGlvbnMoKTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICF0aGlzPy5yZWFkb25seSAmJlxuICAgICAgICAgICAgcmljaE1lZGlhICYmXG4gICAgICAgICAgICB0aGlzLmlzQ29sbGFwc2VkQW5kTm9uUmVhZG9ubHkgJiZcbiAgICAgICAgICAgIFRoZVF1ZXJpZXMuaXNHbG9iYWxDb2xsYXBzZWQodGhpcy5lZGl0b3IpICYmXG4gICAgICAgICAgICAhdGhpcy51cGxvYWRpbmcgJiZcbiAgICAgICAgICAgICF0aGlzLmlzT3BlblxuICAgICAgICApO1xuICAgIH1cblxuICAgIGlzU2hvdWxkQ2xvc2UoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLmlzT3BlbiAmJlxuICAgICAgICAgICAgKHRoaXM/LnJlYWRvbmx5IHx8ICF0aGlzLmlzQ29sbGFwc2VkQW5kTm9uUmVhZG9ubHkgfHwgIVRoZVF1ZXJpZXMuaXNHbG9iYWxDb2xsYXBzZWQodGhpcy5lZGl0b3IpIHx8IHRoaXMudXBsb2FkaW5nKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIG9wZW5MYXlvdXRUb29sYmFyKCkge1xuICAgICAgICBpZiAoIXRoaXMuaW1nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sYXlvdXRUb29sYmFyUmVmID0gdGhpcy50aHlQb3BvdmVyLm9wZW4odGhpcy5sYXlvdXRUb29sYmFyLCB7XG4gICAgICAgICAgICBvcmlnaW46IHRoaXMuaW1hZ2VDb250ZW50LFxuICAgICAgICAgICAgcGFuZWxDbGFzczogJ3RoZS1wbHVnaW4tdG9vbGJhci1wb3BvdmVyJyxcbiAgICAgICAgICAgIGluc2lkZUNsb3NhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGJhY2tkcm9wQ2xvc2FibGU6IHRydWUsXG4gICAgICAgICAgICBoYXNCYWNrZHJvcDogZmFsc2UsXG4gICAgICAgICAgICBtaW5XaWR0aDogMCxcbiAgICAgICAgICAgIHZpZXdDb250YWluZXJSZWY6IHRoaXMudmlld0NvbnRhaW5lclJlZixcbiAgICAgICAgICAgIHNjcm9sbFN0cmF0ZWd5OiB0aGlzLm92ZXJsYXkuc2Nyb2xsU3RyYXRlZ2llcy5yZXBvc2l0aW9uKClcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubGF5b3V0VG9vbGJhclJlZj8uZ2V0T3ZlcmxheVJlZigpLnVwZGF0ZVBvc2l0aW9uU3RyYXRlZ3kodGhpcy5jcmVhdGVQb3NpdGlvblN0cmF0ZWd5KCkpO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sYXlvdXRUb29sYmFyUmVmPy5nZXRPdmVybGF5UmVmKCkudXBkYXRlUG9zaXRpb24oKTtcbiAgICAgICAgfSwgMTUwKTtcbiAgICB9XG5cbiAgICBjbG9zZUxheW91dFRvb2xiYXIoKSB7XG4gICAgICAgIHRoaXMubGF5b3V0VG9vbGJhclJlZj8uY2xvc2UoKTtcbiAgICB9XG5cbiAgICBsYXlvdXRBY3RpdmUoa2V5OiBBbGlnbm1lbnQgfCBMYXlvdXRUeXBlcykge1xuICAgICAgICBjb25zdCB7IGxheW91dCwgYWxpZ24gfSA9IHRoaXMuaW1hZ2VFbnRyeTtcbiAgICAgICAgcmV0dXJuIGtleSAmJiAoKGtleSA9PT0gYWxpZ24gJiYgIWxheW91dCkgfHwga2V5ID09PSBsYXlvdXQpO1xuICAgIH1cblxuICAgIHNldEltYWdlTm9kZShlOiBNb3VzZUV2ZW50LCBwYXJ0aWFsOiB7IGxheW91dD86IExheW91dFR5cGVzOyBhbGlnbj86IEFsaWdubWVudCB9KSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgcGF0aCA9IFRoZVF1ZXJpZXMuZmluZFBhdGgodGhpcy5lZGl0b3IsIHRoaXMuZWxlbWVudCk7XG4gICAgICAgIEltYWdlRWRpdG9yLnNldEltYWdlTm9kZSh0aGlzLmVkaXRvciwgcGF0aCwgcGFydGlhbCk7XG4gICAgfVxuXG4gICAgc2V0QmxvY2tDYXJkTGF5b3V0QXR0cigpIHtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RWxlbWVudCA9IEFuZ3VsYXJFZGl0b3IudG9ET01Ob2RlKHRoaXMuZWRpdG9yLCB0aGlzLmVsZW1lbnQpO1xuICAgICAgICAgICAgY29uc3QgYmxvY2tDYXJkID0gY3VycmVudEVsZW1lbnQuY2xvc2VzdCgnLnNsYXRlLWJsb2NrLWNhcmQnKTtcbiAgICAgICAgICAgIGNvbnN0IHsgbGF5b3V0IH0gPSB0aGlzLmVsZW1lbnQ7XG5cbiAgICAgICAgICAgIGlmIChibG9ja0NhcmQgJiYgbGF5b3V0KSB7XG4gICAgICAgICAgICAgICAgYmxvY2tDYXJkLnNldEF0dHJpYnV0ZSgnbGF5b3V0JywgbGF5b3V0KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYmxvY2tDYXJkICYmICFsYXlvdXQpIHtcbiAgICAgICAgICAgICAgICBibG9ja0NhcmQucmVtb3ZlQXR0cmlidXRlKCdsYXlvdXQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubGF5b3V0VG9vbGJhclJlZj8uZ2V0T3ZlcmxheVJlZigpLnVwZGF0ZVBvc2l0aW9uKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uRGVsZXRlKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIFRoZVRyYW5zZm9ybXMuZGVsZXRlRWxlbWVudCh0aGlzLmVkaXRvciwgdGhpcy5lbGVtZW50KTtcbiAgICB9XG5cbiAgICBjcmVhdGVQb3NpdGlvblN0cmF0ZWd5KCkge1xuICAgICAgICBjb25zdCBib3R0b21Qb3NpdGlvbjogQ29ubmVjdGVkUG9zaXRpb24gPSB7XG4gICAgICAgICAgICBvcmlnaW5YOiAnY2VudGVyJyxcbiAgICAgICAgICAgIG9yaWdpblk6ICdib3R0b20nLFxuICAgICAgICAgICAgb3ZlcmxheVg6ICdjZW50ZXInLFxuICAgICAgICAgICAgb3ZlcmxheVk6ICd0b3AnLFxuICAgICAgICAgICAgb2Zmc2V0WDogMCxcbiAgICAgICAgICAgIG9mZnNldFk6IDRcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMub3ZlcmxheVxuICAgICAgICAgICAgLnBvc2l0aW9uKClcbiAgICAgICAgICAgIC5mbGV4aWJsZUNvbm5lY3RlZFRvKHRoaXMuaW1hZ2VDb250ZW50KVxuICAgICAgICAgICAgLndpdGhGbGV4aWJsZURpbWVuc2lvbnMoZmFsc2UpXG4gICAgICAgICAgICAud2l0aEdyb3dBZnRlck9wZW4oZmFsc2UpXG4gICAgICAgICAgICAud2l0aFB1c2goZmFsc2UpXG4gICAgICAgICAgICAud2l0aFBvc2l0aW9ucyhbYm90dG9tUG9zaXRpb25dKTtcbiAgICB9XG5cbiAgICBpbWFnZUxvYWRlZChldmVudDogRXZlbnQpIHtcbiAgICAgICAgY29uc3QgaW1nID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbWFnZUVsZW1lbnQ7XG4gICAgICAgIHRoaXMubmF0dXJhbFdpZHRoID0gaW1nLm5hdHVyYWxXaWR0aDtcbiAgICAgICAgdGhpcy5uYXR1cmFsSGVpZ2h0ID0gaW1nLm5hdHVyYWxIZWlnaHQ7XG4gICAgfVxuXG4gICAgaW1hZ2VFcnJvcihldmVudDogRXZlbnQpIHtcbiAgICAgICAgY29uc3QgaW1nID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbWFnZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGVycm9ySW1hZ2VVcmwgPSB0aGlzLmltYWdlUGx1Z2luT3B0aW9ucz8uZXJyb3JJbWFnZVVybDtcbiAgICAgICAgaWYgKGVycm9ySW1hZ2VVcmwpIHtcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IHR5cGVvZiBlcnJvckltYWdlVXJsID09PSAnZnVuY3Rpb24nID8gZXJyb3JJbWFnZVVybCh0aGlzLmVkaXRvcikgOiBlcnJvckltYWdlVXJsO1xuICAgICAgICAgICAgdGhpcy5sb2FkSW1hZ2VFcnJvciA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmRpc2FibGVQcmV2aWV3ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VDb250ZW50Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndGhlLWltYWdlLWVycm9yJyk7XG4gICAgICAgICAgICBpbWcuc3JjID0gdXJsO1xuICAgICAgICB9XG4gICAgICAgIGltZy5vbmVycm9yID0gbnVsbDtcbiAgICB9XG5cbiAgICAvLyDnu4Tku7blupMgZGlhbG9nIOW8ueWHuuaXtu+8jOS8muiusOW9leW9k+WJjeeahOeEpueCueOAgumYu+atoiBtb3VzZWRvd24g6buY6K6k6KGM5Li677yM5L2/5b6X5Zu+54mH5Y6f5pys55qEIGNsaWNrIOS6i+S7tuiDveiOt+WPluWIsOato+ehrueahOeEpueCueOAglxuICAgIHByZXZlbnREZWZhdWx0KGV2ZW50OiBFdmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG59XG4iLCI8c2xhdGUtY2hpbGRyZW4gW2NoaWxkcmVuXT1cImNoaWxkcmVuXCIgW2NvbnRleHRdPVwiY2hpbGRyZW5Db250ZXh0XCIgW3ZpZXdDb250ZXh0XT1cInZpZXdDb250ZXh0XCI+PC9zbGF0ZS1jaGlsZHJlbj5cblxuPGRpdiBjbGFzcz1cImltYWdlLWNvbnRhaW5lclwiIGNvbnRlbnRlZGl0YWJsZT1cImZhbHNlXCIgW3N0eWxlLnRleHRBbGlnbl09XCJpbWFnZUVudHJ5LmFsaWduXCI+XG4gIDxkaXYgI2ltYWdlQ29udGVudCAqbmdJZj1cImltYWdlRW50cnkudGh1bWJVcmxcIiBjbGFzcz1cImltYWdlLWNvbnRlbnRcIiBbY2xhc3MuY3Vyc29yLXBvaW50ZXJdPVwiIXNlbGVjdGlvblwiPlxuICAgIDxpbWdcbiAgICAgICNpbWdcbiAgICAgIHRoeUltYWdlXG4gICAgICBjbGFzcz1cIm1haW4taW1hZ2VcIlxuICAgICAgW2NsYXNzLmltYWdlLWNvbGxhcHNlZF09XCJzZWxlY3Rpb24gJiYgIXVwbG9hZGluZ1wiXG4gICAgICBbbmdTdHlsZV09XCJ7ICd3aWR0aC5weCc6IGltYWdlQmluZGluZ1dpZHRoIH1cIlxuICAgICAgW2FsdF09XCJpbWFnZUVudHJ5Lm5hbWVcIlxuICAgICAgW3RoeVNyY109XCJpbWFnZUVudHJ5LnRodW1iVXJsXCJcbiAgICAgIFt0aHlQcmV2aWV3U3JjXT1cImltYWdlRW50cnkudGh1bWJVcmxcIlxuICAgICAgW3RoeU9yaWdpblNyY109XCJpbWFnZUVudHJ5Lm9yaWdpblVybFwiXG4gICAgICBbdGh5RGlzYWJsZVByZXZpZXddPVwiZGlzYWJsZVByZXZpZXdcIlxuICAgICAgW3RoeUltYWdlTWV0YV09XCJ7IG5hbWU6IGltYWdlRW50cnkubmFtZSwgc2l6ZTogaW1hZ2VFbnRyeS5zaXplIH1cIlxuICAgICAgKGxvYWQpPVwiaW1hZ2VMb2FkZWQoJGV2ZW50KVwiXG4gICAgICAobW91c2Vkb3duKT1cInByZXZlbnREZWZhdWx0KCRldmVudClcIlxuICAgICAgKGVycm9yKT1cImltYWdlRXJyb3IoJGV2ZW50KVwiXG4gICAgICAoY2xpY2spPVwiaW1hZ2VDbGljaygkZXZlbnQpXCJcbiAgICAvPlxuICAgIDxkaXYgKm5nSWY9XCJpc0NvbGxhcHNlZEFuZE5vblJlYWRvbmx5XCIgY2xhc3M9XCJpbWFnZS1wcm9maWxlXCIgW2NsYXNzLm91dGxpbmVdPVwic2VsZWN0aW9uXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxvYWRJbWFnZUVycm9yXCI+XG4gICAgICAgIDxzcGFuIChtb3VzZWRvd24pPVwic3RhcnREcmFnKCRldmVudCwgJy14bCcpXCIgY2xhc3M9XCJpbWFnZS1wb2ludGVyIGxlZnQgdG9wXCI+PC9zcGFuPlxuICAgICAgICA8c3BhbiAobW91c2Vkb3duKT1cInN0YXJ0RHJhZygkZXZlbnQsICd4bCcpXCIgY2xhc3M9XCJpbWFnZS1wb2ludGVyIHJpZ2h0IHRvcFwiPjwvc3Bhbj5cbiAgICAgICAgPHNwYW4gKG1vdXNlZG93bik9XCJzdGFydERyYWcoJGV2ZW50LCAneGwnKVwiIGNsYXNzPVwiaW1hZ2UtcG9pbnRlciByaWdodCBib3R0b21cIj48L3NwYW4+XG4gICAgICAgIDxzcGFuIChtb3VzZWRvd24pPVwic3RhcnREcmFnKCRldmVudCwgJy14bCcpXCIgY2xhc3M9XCJpbWFnZS1wb2ludGVyIGxlZnQgYm90dG9tXCI+PC9zcGFuPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cInVwbG9hZGluZ1wiIGNsYXNzPVwidXBsb2FkaW5nXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwidXBsb2FkaW5nLXBlcmNlbnRhZ2VcIj5cbiAgICAgICAgPHRoeS1wcm9ncmVzcyB0aHlUeXBlPVwicHJpbWFyeVwiIFt0aHlWYWx1ZV09XCJwZXJjZW50YWdlXCIgdGh5U2l6ZT1cInNtXCI+PC90aHktcHJvZ3Jlc3M+XG4gICAgICAgIDx0aHktaWNvbiAoY2xpY2spPVwiY2FuY2VsVXBsb2FkKCRldmVudClcIiB0aHlJY29uTmFtZT1cImNsb3NlLWNpcmNsZS1ib2xkLWZpbGxcIiB0aHlJY29uTGVnZ2luZz1cInRydWVcIj4gPC90aHktaWNvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCIhdXBsb2FkaW5nXCIgY2xhc3M9XCJsYXllclwiIFtjbGFzcy5yZWFkb25seV09XCJyZWFkb25seVwiPjwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiAqbmdJZj1cIiFpbWFnZUVudHJ5LnRodW1iVXJsXCIgY2xhc3M9XCJpbWFnZS1sb2FkaW5nIGN1cnNvci1wb2ludGVyXCIgY29udGVudGVkaXRhYmxlPVwiZmFsc2VcIj5cbiAgICA8dGh5LWljb24gdGh5SWNvbk5hbWU9XCJpbWFnZVwiPjwvdGh5LWljb24+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjbGF5b3V0VG9vbGJhcj5cbiAgPHRoeS1hY3Rpb25zIHRoeVNpemU9XCJ4eHNcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGxheW91dE9wdGlvbnNcIj5cbiAgICAgIDxhXG4gICAgICAgICpuZ0lmPVwiaXRlbS5rZXkgIT09ICdzcGxpdCdcIlxuICAgICAgICBocmVmPVwiamF2YXNjcmlwdDo7XCJcbiAgICAgICAgdGh5QWN0aW9uXG4gICAgICAgIFt0aHlUeXBlXT1cIml0ZW0ua2V5ID09PSAncmVtb3ZlJyA/ICdkYW5nZXInIDogJ3ByaW1hcnknXCJcbiAgICAgICAgW3RoeUFjdGlvbkljb25dPVwiaXRlbS5pY29uXCJcbiAgICAgICAgW3RoeUFjdGlvbkFjdGl2ZV09XCJsYXlvdXRBY3RpdmUoaXRlbS5rZXkpXCJcbiAgICAgICAgW3RoeVRvb2x0aXBdPVwiaXRlbS5uYW1lXCJcbiAgICAgICAgdGh5VG9vbHRpcFBsYWNlbWVudD1cInRvcFwiXG4gICAgICAgIChtb3VzZWRvd24pPVwiaXRlbT8uaGFuZGxlKCRldmVudCwgaXRlbS5rZXkpXCJcbiAgICAgID48L2E+XG4gICAgICA8dGh5LWRpdmlkZXIgKm5nSWY9XCJpdGVtLmtleSA9PT0gJ3NwbGl0J1wiIGNsYXNzPVwibXItMiBtbC0xIGFsaWduLXNlbGYtY2VudGVyXCIgW3RoeVZlcnRpY2FsXT1cInRydWVcIj48L3RoeS1kaXZpZGVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L3RoeS1hY3Rpb25zPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==