@talrace/ngx-noder 0.0.6 → 0.0.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 (645) hide show
  1. package/README.md +5 -4
  2. package/esm2022/lib/apart-components/add-link-dialog/add-link-dialog.component.mjs +61 -0
  3. package/esm2022/lib/apart-components/add-link-dialog/validation.helper.mjs +7 -0
  4. package/esm2022/lib/apart-components/add-link-mobile/add-link-mobile.component.mjs +47 -0
  5. package/esm2022/lib/apart-components/confirm-dialog/confirm-dialog.component.mjs +32 -0
  6. package/esm2022/lib/apart-components/editor-search/editor-search-dialog.component.mjs +64 -0
  7. package/esm2022/lib/apart-components/editor-title/editor-title.component.mjs +89 -0
  8. package/esm2022/lib/apart-components/editor-title-mobile/editor-title-mobile.component.mjs +22 -0
  9. package/esm2022/lib/apart-components/editor-toolbar/components/base-toolbar.component.mjs +111 -0
  10. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/color-picker/color-picker.component.mjs +37 -0
  11. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/font/font.component.mjs +49 -0
  12. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/font-size/font-size.component.mjs +90 -0
  13. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/font-style/font-style.component.mjs +81 -0
  14. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/format/format.component.mjs +28 -0
  15. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/heading/heading.component.mjs +22 -0
  16. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/numbering/numbering.component.mjs +53 -0
  17. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/print/print.component.mjs +18 -0
  18. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/undo-redo/undo-redo.component.mjs +27 -0
  19. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/zoom/zoom.component.mjs +71 -0
  20. package/esm2022/lib/apart-components/editor-toolbar/components/menu-dropdowns/menu-dropdowns.component.mjs +94 -0
  21. package/esm2022/lib/apart-components/editor-toolbar/components/menu-dropdowns-mobile/menu-dropdowns-mobile.component.mjs +24 -0
  22. package/esm2022/lib/apart-components/editor-toolbar/components/toolbar-actions/toolbar-actions.component.mjs +65 -0
  23. package/esm2022/lib/apart-components/editor-toolbar/editor-mobile-toolbar/editor-mobile-toolbar.component.mjs +84 -0
  24. package/esm2022/lib/apart-components/editor-toolbar/editor-toolbar/editor-toolbar.component.mjs +90 -0
  25. package/esm2022/lib/apart-components/editor-toolbar/editor-toolbar.module.mjs +117 -0
  26. package/esm2022/lib/apart-components/editor-toolbar/shared/constants/editor-toolbar-modes.const.mjs +8 -0
  27. package/esm2022/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/shared}/constants/numbering-templates.const.mjs +6 -6
  28. package/esm2022/lib/apart-components/editor-toolbar/shared/constants/svg-icons.const.mjs +157 -0
  29. package/esm2022/lib/apart-components/editor-toolbar/shared/enums/alignment.enum.mjs +8 -0
  30. package/esm2022/lib/apart-components/editor-toolbar/shared/enums/editor-toolbar-mode.enum.mjs +11 -0
  31. package/esm2022/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/shared}/enums/numbering-template-type.enum.mjs +1 -1
  32. package/esm2022/lib/apart-components/editor-toolbar/shared/enums/numbering-type.enum.mjs +6 -0
  33. package/esm2022/lib/apart-components/editor-toolbar/shared/services/custom-icon.service.mjs +34 -0
  34. package/esm2022/lib/apart-components/editor-toolbar/shared/services/editor-toolbar.service.mjs +26 -0
  35. package/esm2022/lib/apart-components/editor-toolbar/shared/services/toolbar-core.service.mjs +60 -0
  36. package/esm2022/lib/apart-components/editor-toolbar/shared/toolbar-styles.helper.mjs +55 -0
  37. package/esm2022/lib/apart-components/insert-table/insert-table.component.mjs +54 -0
  38. package/esm2022/lib/apart-components/insert-table-mobile/insert-table-mobile.component.mjs +84 -0
  39. package/esm2022/lib/apart-components/text-format-mobile/text-format-mobile.component.mjs +123 -0
  40. package/esm2022/lib/editor/components/edges/edge-element.model.mjs +9 -0
  41. package/esm2022/lib/editor/components/edges/edge-type.enum.mjs +6 -0
  42. package/esm2022/lib/editor/components/edges/edge.component.mjs +99 -0
  43. package/esm2022/lib/editor/components/edges/edges.mjs +108 -0
  44. package/esm2022/lib/editor/components/edges/page-type.enum.mjs +7 -0
  45. package/esm2022/lib/editor/components/editor.component.mjs +112 -0
  46. package/esm2022/lib/editor/components/external-element/external-element.service.mjs +6 -0
  47. package/esm2022/lib/editor/components/external-element/external-elements.const.mjs +4 -0
  48. package/esm2022/lib/editor/components/external-element/external-sidenav.interface.mjs +2 -0
  49. package/esm2022/lib/editor/components/external-element/external.component.mjs +41 -0
  50. package/esm2022/lib/editor/components/external-element/models/element-data.model.mjs +9 -0
  51. package/esm2022/lib/editor/components/external-element/models/external-element.model.mjs +11 -0
  52. package/esm2022/lib/editor/components/external-element/models/external-sidenav.model.mjs +15 -0
  53. package/esm2022/lib/editor/components/image/components/image.component.mjs +88 -0
  54. package/esm2022/lib/editor/components/image/image-api.service.mjs +36 -0
  55. package/esm2022/lib/editor/components/image/input-handler/image-input.handler.mjs +38 -0
  56. package/esm2022/lib/editor/components/image/resizer/coordinate.mjs +2 -0
  57. package/esm2022/lib/editor/components/image/resizer/direction-wrapper.mjs +19 -0
  58. package/esm2022/lib/editor/components/image/resizer/direction.enum.mjs +12 -0
  59. package/esm2022/lib/editor/components/image/resizer/resizer.component.mjs +106 -0
  60. package/esm2022/lib/editor/components/image/resizer/size-delta.mjs +2 -0
  61. package/esm2022/lib/editor/components/image/resizer/size-wrapper.mjs +52 -0
  62. package/esm2022/lib/editor/components/image/size.mjs +2 -0
  63. package/esm2022/lib/editor/components/shared/abstract/base.component.mjs +59 -0
  64. package/esm2022/lib/editor/components/shared/abstract/destroy.component.mjs +18 -0
  65. package/esm2022/lib/editor/components/shared/custom-component.hepler.mjs +43 -0
  66. package/esm2022/lib/editor/components/shared/custom-components.interface.mjs +2 -0
  67. package/esm2022/lib/editor/components/shared/custom-content-markers.const.mjs +3 -0
  68. package/esm2022/lib/editor/components/shared/custom-content.mjs +2 -0
  69. package/esm2022/lib/editor/components/shared/services/component.service.mjs +64 -0
  70. package/esm2022/lib/editor/components/shared/services/custom-content.service.mjs +163 -0
  71. package/esm2022/lib/editor/components/shared/services/overlay.service.mjs +55 -0
  72. package/esm2022/lib/editor/components/tab/tab.component.mjs +44 -0
  73. package/esm2022/lib/editor/components/tab/tab.helper.mjs +6 -0
  74. package/esm2022/lib/editor/components/table/cell-resizer/cell-resizer.mjs +118 -0
  75. package/esm2022/lib/editor/components/table/components/table-cell.component.mjs +97 -0
  76. package/esm2022/lib/editor/components/table/components/table.component.mjs +401 -0
  77. package/esm2022/lib/{+shared/editor/core → editor/components/table}/enums/hrule.enum.mjs +1 -1
  78. package/esm2022/lib/editor/components/table/enums/reisizer-side.enum.mjs +8 -0
  79. package/esm2022/lib/editor/components/table/enums/vertical-merge.enum.mjs +6 -0
  80. package/esm2022/lib/editor/components/table/models/cell-data.model.mjs +18 -0
  81. package/esm2022/lib/editor/components/table/models/cell-resizer-parameters.model.mjs +9 -0
  82. package/esm2022/lib/editor/components/table/models/row-data.model.mjs +8 -0
  83. package/esm2022/lib/editor/components/table/models/selection-range.model.mjs +7 -0
  84. package/esm2022/lib/editor/components/table/overlay-menu/overlay-menu.component.mjs +74 -0
  85. package/esm2022/lib/editor/components/table/selection/table-selection.mjs +366 -0
  86. package/esm2022/lib/editor/content/constants/display-values.const.mjs +8 -0
  87. package/esm2022/lib/editor/content/constants/document-info.const.mjs +13 -0
  88. package/esm2022/lib/editor/content/constants/editor.const.mjs +62 -0
  89. package/esm2022/lib/editor/content/contents.interface.mjs +2 -0
  90. package/esm2022/lib/editor/content/display-data/display-token.model.mjs +12 -0
  91. package/esm2022/lib/editor/content/display-data/document.mjs +134 -0
  92. package/esm2022/lib/editor/content/display-data/format-ext.model.mjs +10 -0
  93. package/esm2022/lib/editor/content/display-data/general-properties.model.mjs +11 -0
  94. package/esm2022/lib/editor/content/display-data/indent.model.mjs +9 -0
  95. package/esm2022/lib/editor/content/display-data/line-info.model.mjs +9 -0
  96. package/esm2022/lib/editor/content/display-data/lines.mjs +96 -0
  97. package/esm2022/lib/editor/content/display-data/pages.wrap.mjs +226 -0
  98. package/esm2022/lib/editor/content/display-data/paragraph-info.interface.mjs +2 -0
  99. package/esm2022/lib/editor/content/display-data/paragraph.mjs +52 -0
  100. package/esm2022/lib/editor/content/display-data/text-line-info.mjs +34 -0
  101. package/esm2022/lib/editor/content/display-data/toolbar-styles.interface.mjs +2 -0
  102. package/esm2022/lib/editor/content/helpers/content-style.helper.mjs +96 -0
  103. package/esm2022/lib/{+shared/editor → editor/content}/helpers/format.helper.mjs +1 -1
  104. package/esm2022/lib/{+shared/editor → editor/content}/helpers/indexed-element.helper.mjs +1 -1
  105. package/esm2022/lib/editor/content/helpers/scaling.helper.mjs +9 -0
  106. package/esm2022/lib/editor/content/margin.model.mjs +16 -0
  107. package/esm2022/lib/editor/content/page-vertical-data.model.mjs +9 -0
  108. package/esm2022/lib/{+shared/editor/core/enums → editor/content}/vertical-alignment.enum.mjs +1 -1
  109. package/esm2022/lib/editor/core/event-emitting.mjs +56 -0
  110. package/esm2022/lib/editor/display/cell.interface.mjs +2 -0
  111. package/esm2022/lib/editor/display/event.helper.mjs +18 -0
  112. package/esm2022/lib/editor/display/layers/cursor.layer.mjs +101 -0
  113. package/esm2022/lib/editor/display/layers/layer.config.mjs +2 -0
  114. package/esm2022/lib/editor/display/layers/pages.layer.mjs +97 -0
  115. package/esm2022/lib/editor/display/layers/print.pages.layer.mjs +7 -0
  116. package/esm2022/lib/editor/display/layers/print.text.layer.mjs +7 -0
  117. package/esm2022/lib/editor/display/layers/selection.layer.mjs +113 -0
  118. package/esm2022/lib/editor/display/layers/text.layer.mjs +203 -0
  119. package/esm2022/lib/editor/display/print/print.helper.mjs +40 -0
  120. package/esm2022/lib/editor/display/print/print.renderer.mjs +67 -0
  121. package/esm2022/lib/editor/display/print/print.rendering.helper.mjs +7 -0
  122. package/esm2022/lib/editor/display/render-changes.interface.mjs +2 -0
  123. package/esm2022/lib/editor/display/render-changes.model.mjs +25 -0
  124. package/esm2022/lib/editor/display/renderer.mjs +206 -0
  125. package/esm2022/lib/editor/display/rendering.helper.mjs +187 -0
  126. package/esm2022/lib/editor/display/renderloop.mjs +26 -0
  127. package/esm2022/lib/editor/display/virtual.renderer.mjs +317 -0
  128. package/esm2022/lib/editor/display/visible-range.interface.mjs +2 -0
  129. package/esm2022/lib/editor/editor.module.mjs +67 -0
  130. package/esm2022/lib/editor/execution/distance.model.mjs +10 -0
  131. package/esm2022/lib/editor/execution/edit.session.mjs +1117 -0
  132. package/esm2022/lib/editor/execution/editor.mjs +1346 -0
  133. package/esm2022/lib/editor/execution/helpers/delta.helper.mjs +18 -0
  134. package/esm2022/lib/editor/execution/helpers/dom.helper.mjs +42 -0
  135. package/esm2022/lib/editor/execution/helpers/format-style.helper.mjs +64 -0
  136. package/esm2022/lib/editor/execution/helpers/page.helper.mjs +12 -0
  137. package/esm2022/lib/editor/execution/helpers/paragraph-style.helper.mjs +41 -0
  138. package/esm2022/lib/editor/execution/helpers/paragraph.helper.mjs +169 -0
  139. package/esm2022/lib/editor/execution/regulator.service.mjs +198 -0
  140. package/esm2022/lib/editor/execution/targeting/cell-session-source.model.mjs +19 -0
  141. package/esm2022/lib/editor/execution/targeting/edge-session-source.model.mjs +15 -0
  142. package/esm2022/lib/editor/execution/targeting/main-session-source.model.mjs +8 -0
  143. package/esm2022/lib/editor/execution/targeting/session-source.model.mjs +3 -0
  144. package/esm2022/lib/editor/execution/targeting/session.model.mjs +10 -0
  145. package/esm2022/lib/editor/gadgets/font-metrics/editor-version.const.mjs +2 -0
  146. package/esm2022/lib/editor/gadgets/font-metrics/font-metric-size.interface.mjs +2 -0
  147. package/esm2022/lib/editor/gadgets/font-metrics/font-metrics.helper.mjs +88 -0
  148. package/esm2022/lib/editor/gadgets/history/operation-history.mjs +206 -0
  149. package/esm2022/lib/editor/gadgets/history/operation.type.mjs +2 -0
  150. package/esm2022/lib/editor/gadgets/history/operations-history-info.model.mjs +7 -0
  151. package/esm2022/lib/editor/gadgets/numbering/numbering-data.model.mjs +9 -0
  152. package/esm2022/lib/{+shared/editor/core/enums → editor/gadgets/numbering}/numbering-marker-type.enum.mjs +1 -1
  153. package/esm2022/lib/editor/gadgets/numbering/numbering.helper.mjs +82 -0
  154. package/esm2022/lib/editor/gadgets/page-break/break-types.enum.mjs +7 -0
  155. package/esm2022/lib/editor/gadgets/page-break/break.helper.mjs +18 -0
  156. package/esm2022/lib/editor/gadgets/scrollbar.mjs +81 -0
  157. package/esm2022/lib/editor/gadgets/search/replace.interface.mjs +2 -0
  158. package/esm2022/lib/editor/gadgets/search/search-iteration.interface.mjs +2 -0
  159. package/esm2022/lib/editor/gadgets/search/search.mjs +231 -0
  160. package/esm2022/lib/editor/gadgets/unicode/unicode-chars.const.mjs +5 -0
  161. package/esm2022/lib/editor/gadgets/unicode/unicode.helper.mjs +20 -0
  162. package/esm2022/lib/editor/interaction/base.handler.mjs +19 -0
  163. package/esm2022/lib/editor/interaction/document.handler.mjs +27 -0
  164. package/esm2022/lib/editor/interaction/editor.service.mjs +325 -0
  165. package/esm2022/lib/editor/interaction/input.handler.mjs +149 -0
  166. package/esm2022/lib/{+shared/enums → editor/interaction}/mode.enum.mjs +1 -1
  167. package/esm2022/lib/editor/interaction/mouse-button.enum.mjs +7 -0
  168. package/esm2022/lib/editor/interaction/mouse.handler.mjs +49 -0
  169. package/esm2022/lib/editor/interaction/text-input.mjs +53 -0
  170. package/esm2022/lib/editor/operations/commands.service.mjs +20 -0
  171. package/esm2022/lib/editor/operations/enums/command-type.enum.mjs +32 -0
  172. package/esm2022/lib/editor/operations/enums/target-type.enum.mjs +7 -0
  173. package/esm2022/lib/editor/operations/helpers/break-operations.helper.mjs +9 -0
  174. package/esm2022/lib/editor/operations/helpers/content-operations.helper.mjs +15 -0
  175. package/esm2022/lib/editor/operations/helpers/format-operations.helper.mjs +55 -0
  176. package/esm2022/lib/editor/operations/helpers/image-operations.helper.mjs +19 -0
  177. package/esm2022/lib/editor/operations/helpers/indexed-element-operations.helper.mjs +43 -0
  178. package/esm2022/lib/editor/operations/helpers/link-operations.helper.mjs +28 -0
  179. package/esm2022/lib/editor/operations/helpers/numbering-operations.helper.mjs +55 -0
  180. package/esm2022/lib/editor/operations/helpers/paragraph-operations.helper.mjs +114 -0
  181. package/esm2022/lib/editor/operations/helpers/tab-operations.helper.mjs +16 -0
  182. package/esm2022/lib/editor/operations/helpers/table-operations.helper.mjs +374 -0
  183. package/esm2022/lib/editor/operations/operations-helper.helper.mjs +432 -0
  184. package/esm2022/lib/editor/operations/save-commands.helper.mjs +127 -0
  185. package/esm2022/lib/editor/operations/target-operations.helper.mjs +23 -0
  186. package/esm2022/lib/editor/positioning/alignments.const.mjs +8 -0
  187. package/esm2022/lib/editor/positioning/content.helper.mjs +36 -0
  188. package/esm2022/lib/editor/positioning/cursor-paragraph.mjs +13 -0
  189. package/esm2022/lib/editor/positioning/cursor-position.interface.mjs +2 -0
  190. package/esm2022/lib/editor/positioning/insert-index.interface.mjs +2 -0
  191. package/esm2022/lib/editor/positioning/line-width.helper.mjs +13 -0
  192. package/esm2022/lib/editor/positioning/position.helper.mjs +194 -0
  193. package/esm2022/lib/editor/positioning/range.mjs +94 -0
  194. package/esm2022/lib/editor/positioning/selection.mjs +307 -0
  195. package/esm2022/lib/editor/revision.helper.mjs +91 -0
  196. package/esm2022/lib/models/generated/command.model.mjs +5 -1
  197. package/esm2022/lib/models/generated/insert-paragraph.model.mjs +20 -0
  198. package/esm2022/lib/models/generated/replace.model.mjs +5 -1
  199. package/esm2022/public-api.mjs +36 -33
  200. package/fesm2022/talrace-ngx-noder.mjs +3583 -3278
  201. package/fesm2022/talrace-ngx-noder.mjs.map +1 -1
  202. package/lib/{+shared → apart-components}/add-link-dialog/add-link-dialog.component.d.ts +1 -1
  203. package/lib/apart-components/add-link-mobile/add-link-mobile.component.d.ts +19 -0
  204. package/lib/{+shared → apart-components}/confirm-dialog/confirm-dialog.component.d.ts +1 -1
  205. package/lib/{+shared → apart-components}/editor-search/editor-search-dialog.component.d.ts +6 -7
  206. package/lib/{+shared → apart-components}/editor-title/editor-title.component.d.ts +4 -3
  207. package/lib/apart-components/editor-title-mobile/editor-title-mobile.component.d.ts +6 -0
  208. package/lib/apart-components/editor-toolbar/components/base-toolbar.component.d.ts +49 -0
  209. package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/color-picker/color-picker.component.d.ts +1 -1
  210. package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/font/font.component.d.ts +2 -2
  211. package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/font-size/font-size.component.d.ts +1 -1
  212. package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/font-style/font-style.component.d.ts +1 -1
  213. package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/format/format.component.d.ts +2 -2
  214. package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/heading/heading.component.d.ts +1 -1
  215. package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/numbering/numbering.component.d.ts +3 -3
  216. package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/print/print.component.d.ts +1 -1
  217. package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/undo-redo/undo-redo.component.d.ts +1 -1
  218. package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/zoom/zoom.component.d.ts +1 -1
  219. package/lib/apart-components/editor-toolbar/components/menu-dropdowns/menu-dropdowns.component.d.ts +36 -0
  220. package/lib/apart-components/editor-toolbar/components/menu-dropdowns-mobile/menu-dropdowns-mobile.component.d.ts +14 -0
  221. package/lib/apart-components/editor-toolbar/components/toolbar-actions/toolbar-actions.component.d.ts +23 -0
  222. package/lib/apart-components/editor-toolbar/editor-mobile-toolbar/editor-mobile-toolbar.component.d.ts +26 -0
  223. package/lib/apart-components/editor-toolbar/editor-toolbar/editor-toolbar.component.d.ts +40 -0
  224. package/lib/apart-components/editor-toolbar/editor-toolbar.module.d.ts +32 -0
  225. package/lib/apart-components/editor-toolbar/shared/constants/editor-toolbar-modes.const.d.ts +2 -0
  226. package/lib/apart-components/editor-toolbar/shared/constants/numbering-templates.const.d.ts +6 -0
  227. package/lib/apart-components/editor-toolbar/shared/enums/editor-toolbar-mode.enum.d.ts +9 -0
  228. package/lib/apart-components/editor-toolbar/shared/services/editor-toolbar.service.d.ts +14 -0
  229. package/lib/apart-components/editor-toolbar/shared/services/toolbar-core.service.d.ts +38 -0
  230. package/lib/{+shared/editor-toolbar/helpers → apart-components/editor-toolbar/shared}/toolbar-styles.helper.d.ts +2 -2
  231. package/lib/{+shared → apart-components}/insert-table/insert-table.component.d.ts +1 -1
  232. package/lib/apart-components/insert-table-mobile/insert-table-mobile.component.d.ts +30 -0
  233. package/lib/apart-components/text-format-mobile/text-format-mobile.component.d.ts +35 -0
  234. package/lib/{+shared/editor/core/models → editor/components/edges}/edge-element.model.d.ts +1 -1
  235. package/lib/editor/components/edges/edge.component.d.ts +44 -0
  236. package/lib/{+shared/editor/core → editor}/components/edges/edges.d.ts +7 -7
  237. package/lib/{+shared/editor → editor/components}/editor.component.d.ts +10 -7
  238. package/lib/{+shared/editor/custom-components → editor/components}/external-element/external-sidenav.interface.d.ts +1 -1
  239. package/lib/{+shared/editor/custom-components → editor/components}/external-element/external.component.d.ts +4 -4
  240. package/lib/{+shared/editor/custom-components → editor/components}/image/components/image.component.d.ts +4 -4
  241. package/lib/editor/components/image/image-api.service.d.ts +17 -0
  242. package/lib/{+shared/editor/custom-components → editor/components}/image/resizer/resizer.component.d.ts +2 -2
  243. package/lib/{+shared/editor/custom-components → editor/components}/image/resizer/size-wrapper.d.ts +1 -1
  244. package/lib/{+shared/editor/custom-components → editor/components}/shared/abstract/base.component.d.ts +4 -4
  245. package/lib/editor/components/shared/abstract/destroy.component.d.ts +9 -0
  246. package/lib/{+shared/editor/custom-components/shared/helpers → editor/components/shared}/custom-component.hepler.d.ts +3 -3
  247. package/lib/editor/components/shared/custom-components.interface.d.ts +13 -0
  248. package/lib/editor/components/shared/custom-content.d.ts +5 -0
  249. package/lib/{+shared/editor/custom-components/shared/services/component → editor/components/shared/services}/component.service.d.ts +1 -1
  250. package/lib/{+shared/editor/custom-components/shared/services/custom-content → editor/components/shared/services}/custom-content.service.d.ts +14 -12
  251. package/lib/{+shared/editor/custom-components → editor/components}/tab/tab.component.d.ts +2 -2
  252. package/lib/{+shared/editor/custom-components → editor/components}/table/cell-resizer/cell-resizer.d.ts +1 -1
  253. package/lib/{+shared/editor/custom-components → editor/components}/table/components/table-cell.component.d.ts +10 -10
  254. package/lib/{+shared/editor/custom-components → editor/components}/table/components/table.component.d.ts +8 -8
  255. package/lib/{+shared/editor/custom-components → editor/components}/table/overlay-menu/overlay-menu.component.d.ts +2 -2
  256. package/lib/{+shared/editor/custom-components → editor/components}/table/selection/table-selection.d.ts +3 -3
  257. package/lib/{+shared/editor/core → editor/content}/constants/editor.const.d.ts +3 -3
  258. package/lib/editor/content/contents.interface.d.ts +22 -0
  259. package/lib/{+shared/editor/core/models → editor/content/display-data}/display-token.model.d.ts +1 -1
  260. package/lib/{+shared/editor/core → editor/content/display-data}/document.d.ts +9 -9
  261. package/lib/{+shared/editor/core/models → editor/content/display-data}/format-ext.model.d.ts +1 -1
  262. package/lib/{+shared/editor/execution/models → editor/content/display-data}/general-properties.model.d.ts +1 -1
  263. package/lib/{+shared/editor/core/layers → editor/content/display-data}/lines.d.ts +1 -1
  264. package/lib/{+shared/editor/core/paging → editor/content/display-data}/pages.wrap.d.ts +13 -13
  265. package/lib/{+shared/editor/core/paging → editor/content/display-data}/paragraph.d.ts +4 -4
  266. package/lib/{+shared/editor/core/paging → editor/content/display-data}/text-line-info.d.ts +2 -2
  267. package/lib/editor/content/helpers/content-style.helper.d.ts +11 -0
  268. package/lib/{+shared/editor → editor/content}/helpers/indexed-element.helper.d.ts +1 -1
  269. package/lib/{+shared/editor/core/paging → editor/content}/page-vertical-data.model.d.ts +1 -1
  270. package/lib/{+shared/editor/core/base → editor/core}/event-emitting.d.ts +0 -5
  271. package/lib/{+shared/editor/core → editor/display}/layers/cursor.layer.d.ts +7 -8
  272. package/lib/{+shared/editor/core/interfaces → editor/display/layers}/layer.config.d.ts +2 -2
  273. package/lib/{+shared/editor/core → editor/display}/layers/pages.layer.d.ts +5 -6
  274. package/lib/editor/display/layers/print.text.layer.d.ts +4 -0
  275. package/lib/{+shared/editor/core → editor/display}/layers/selection.layer.d.ts +5 -6
  276. package/lib/editor/display/layers/text.layer.d.ts +34 -0
  277. package/lib/{+shared/helpers → editor/display/print}/print.helper.d.ts +3 -3
  278. package/lib/editor/display/print/print.renderer.d.ts +23 -0
  279. package/lib/{+shared/editor/core/helpers → editor/display/print}/print.rendering.helper.d.ts +2 -2
  280. package/lib/{+shared/editor/core/models → editor/display}/render-changes.model.d.ts +1 -1
  281. package/lib/{+shared/editor/core → editor/display}/renderer.d.ts +10 -13
  282. package/lib/{+shared/editor/core/helpers → editor/display}/rendering.helper.d.ts +7 -7
  283. package/lib/{+shared/editor/core/layers → editor/display}/renderloop.d.ts +2 -2
  284. package/lib/{+shared/editor/core → editor/display}/virtual.renderer.d.ts +14 -29
  285. package/lib/{+shared/editor → editor}/editor.module.d.ts +12 -10
  286. package/lib/{+shared/editor/core → editor/execution}/edit.session.d.ts +65 -63
  287. package/lib/{+shared/editor/core → editor/execution}/editor.d.ts +48 -43
  288. package/lib/editor/execution/helpers/delta.helper.d.ts +6 -0
  289. package/lib/{+shared/editor/core → editor/execution}/helpers/format-style.helper.d.ts +3 -5
  290. package/lib/{+shared/editor/core → editor/execution}/helpers/page.helper.d.ts +1 -1
  291. package/lib/{+shared/editor/core → editor/execution}/helpers/paragraph-style.helper.d.ts +1 -1
  292. package/lib/{+shared/editor/core → editor/execution}/helpers/paragraph.helper.d.ts +11 -8
  293. package/lib/{+shared/editor → editor}/execution/regulator.service.d.ts +15 -14
  294. package/lib/{+shared/editor/execution/models → editor/execution/targeting}/cell-session-source.model.d.ts +3 -3
  295. package/lib/{+shared/editor/execution/models → editor/execution/targeting}/edge-session-source.model.d.ts +3 -3
  296. package/lib/{+shared/editor/execution/models → editor/execution/targeting}/main-session-source.model.d.ts +1 -1
  297. package/lib/{+shared/editor/execution/models → editor/execution/targeting}/session-source.model.d.ts +1 -1
  298. package/lib/{+shared/editor/execution/models → editor/execution/targeting}/session.model.d.ts +3 -3
  299. package/lib/{+shared/editor/core/helpers → editor/gadgets/font-metrics}/font-metrics.helper.d.ts +1 -1
  300. package/lib/{+shared/editor/operation-history → editor/gadgets/history}/operation-history.d.ts +9 -7
  301. package/lib/{+shared/editor/operation-history → editor/gadgets/history}/operation.type.d.ts +2 -1
  302. package/lib/{+shared/editor/core/models → editor/gadgets/numbering}/numbering-data.model.d.ts +1 -1
  303. package/lib/{+shared/editor/core/helpers → editor/gadgets/numbering}/numbering.helper.d.ts +8 -8
  304. package/lib/{+shared/editor/helpers → editor/gadgets/page-break}/break.helper.d.ts +2 -2
  305. package/lib/{+shared/editor/core/layers → editor/gadgets}/scrollbar.d.ts +9 -18
  306. package/lib/{+shared/editor/core → editor/gadgets/search}/search.d.ts +4 -4
  307. package/lib/editor/interaction/base.handler.d.ts +9 -0
  308. package/lib/editor/interaction/document.handler.d.ts +10 -0
  309. package/lib/{+shared/editor → editor}/interaction/editor.service.d.ts +24 -18
  310. package/lib/{+shared/editor → editor}/interaction/input.handler.d.ts +4 -5
  311. package/lib/{+shared/editor → editor}/interaction/mouse.handler.d.ts +1 -1
  312. package/lib/{+shared/editor → editor}/operations/enums/command-type.enum.d.ts +11 -10
  313. package/lib/{+shared/editor → editor}/operations/helpers/break-operations.helper.d.ts +2 -2
  314. package/lib/{+shared/editor → editor}/operations/helpers/format-operations.helper.d.ts +2 -2
  315. package/lib/editor/operations/helpers/image-operations.helper.d.ts +7 -0
  316. package/lib/{+shared/editor → editor}/operations/helpers/indexed-element-operations.helper.d.ts +1 -1
  317. package/lib/{+shared/editor → editor}/operations/helpers/link-operations.helper.d.ts +1 -1
  318. package/lib/{+shared/editor → editor}/operations/helpers/numbering-operations.helper.d.ts +3 -3
  319. package/lib/{+shared/editor → editor}/operations/helpers/paragraph-operations.helper.d.ts +3 -2
  320. package/lib/{+shared/editor → editor}/operations/helpers/tab-operations.helper.d.ts +1 -1
  321. package/lib/{+shared/editor → editor}/operations/helpers/table-operations.helper.d.ts +6 -6
  322. package/lib/{+shared/editor/operations/helpers → editor/operations}/operations-helper.helper.d.ts +21 -19
  323. package/lib/{+shared/editor/operations/helpers → editor/operations}/save-commands.helper.d.ts +28 -22
  324. package/lib/editor/operations/target-operations.helper.d.ts +6 -0
  325. package/lib/{+shared/editor/helpers → editor/positioning}/content.helper.d.ts +10 -5
  326. package/lib/editor/positioning/cursor-paragraph.d.ts +7 -0
  327. package/lib/{+shared/editor/core/interfaces → editor/positioning}/cursor-position.interface.d.ts +1 -1
  328. package/lib/{+shared/editor/core/helpers → editor/positioning}/line-width.helper.d.ts +2 -2
  329. package/lib/{+shared/editor/core/helpers → editor/positioning}/position.helper.d.ts +9 -9
  330. package/lib/{+shared/editor/core → editor/positioning}/range.d.ts +12 -12
  331. package/lib/{+shared/editor → editor}/positioning/selection.d.ts +10 -10
  332. package/lib/editor/revision.helper.d.ts +15 -0
  333. package/lib/models/generated/command.model.d.ts +2 -0
  334. package/lib/models/generated/insert-paragraph.model.d.ts +10 -0
  335. package/lib/models/generated/replace.model.d.ts +2 -0
  336. package/package.json +1 -1
  337. package/public-api.d.ts +35 -32
  338. package/src/_ngx-noder.theme.scss +14 -9
  339. package/src/assets/fonts/nc-iconfont.css +112 -106
  340. package/src/assets/fonts/nc-iconfont.eot +0 -0
  341. package/src/assets/fonts/nc-iconfont.svg +4 -1
  342. package/src/assets/fonts/nc-iconfont.ttf +0 -0
  343. package/src/assets/fonts/nc-iconfont.woff +0 -0
  344. package/src/lib/{+shared → apart-components}/add-link-dialog/_add-link-dialog.theme.scss +1 -1
  345. package/src/lib/apart-components/add-link-mobile/_add-link-mobile.theme.scss +25 -0
  346. package/src/lib/{+shared → apart-components}/confirm-dialog/_theme.scss +1 -1
  347. package/src/lib/{+shared → apart-components}/editor-title/_editor-title.theme.scss +1 -1
  348. package/src/lib/apart-components/editor-title-mobile/_editor-title-mobile.theme.scss +42 -0
  349. package/src/lib/apart-components/editor-toolbar/_editor-toolbar.theme.scss +27 -0
  350. package/src/lib/apart-components/editor-toolbar/_theme.scss +25 -0
  351. package/src/lib/apart-components/editor-toolbar/components/buttons/color-picker/_color-picker.theme.scss +12 -0
  352. package/src/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/font/_font.theme.scss +1 -1
  353. package/src/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/font-size/_font-size.theme.scss +1 -1
  354. package/src/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/font-style/_font-style.theme.scss +1 -1
  355. package/src/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/format/_format.theme.scss +1 -1
  356. package/src/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/numbering/_numbering.theme.scss +1 -1
  357. package/src/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/undo-redo/_undo-redo.theme.scss +1 -1
  358. package/src/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components}/menu-dropdowns/_menu-dropdowns.theme.scss +1 -1
  359. package/src/lib/apart-components/editor-toolbar/components/menu-dropdowns-mobile/_menu-dropdowns-mobile.theme.scss +33 -0
  360. package/src/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components}/toolbar-actions/_toolbar-actions.theme.scss +2 -1
  361. package/src/lib/{+shared → apart-components}/insert-table/_insert-table.theme.scss +1 -1
  362. package/src/lib/apart-components/insert-table-mobile/_insert-table-mobile.theme.scss +54 -0
  363. package/src/lib/apart-components/text-format-mobile/_text-format-mobile.theme.scss +86 -0
  364. package/src/lib/{+shared/editor → editor}/_theme.scss +1 -1
  365. package/src/lib/{+shared/editor → editor/components}/_editor.theme.scss +10 -2
  366. package/src/scss/base-editor.scss +329 -0
  367. package/src/styles.scss +3 -58
  368. package/esm2022/lib/+shared/abstract/base-api.service.mjs +0 -99
  369. package/esm2022/lib/+shared/abstract/observer.component.mjs +0 -24
  370. package/esm2022/lib/+shared/add-link-dialog/add-link-dialog.component.mjs +0 -71
  371. package/esm2022/lib/+shared/confirm-dialog/confirm-dialog.component.mjs +0 -32
  372. package/esm2022/lib/+shared/constants/default-file-name.const.mjs +0 -2
  373. package/esm2022/lib/+shared/constants/paginator-sizes.const.mjs +0 -3
  374. package/esm2022/lib/+shared/editor/core/base/event-emitting.mjs +0 -71
  375. package/esm2022/lib/+shared/editor/core/components/edges/edge-type.enum.mjs +0 -6
  376. package/esm2022/lib/+shared/editor/core/components/edges/edge.component.mjs +0 -100
  377. package/esm2022/lib/+shared/editor/core/components/edges/edges.mjs +0 -104
  378. package/esm2022/lib/+shared/editor/core/constants/alignments.const.mjs +0 -8
  379. package/esm2022/lib/+shared/editor/core/constants/clipboardEventTypes.const.mjs +0 -6
  380. package/esm2022/lib/+shared/editor/core/constants/content-style-change.const.mjs +0 -15
  381. package/esm2022/lib/+shared/editor/core/constants/display-values.const.mjs +0 -8
  382. package/esm2022/lib/+shared/editor/core/constants/document-info.const.mjs +0 -13
  383. package/esm2022/lib/+shared/editor/core/constants/editor-version.const.mjs +0 -2
  384. package/esm2022/lib/+shared/editor/core/constants/editor.const.mjs +0 -62
  385. package/esm2022/lib/+shared/editor/core/constants/unicode-chars.const.mjs +0 -5
  386. package/esm2022/lib/+shared/editor/core/document.mjs +0 -134
  387. package/esm2022/lib/+shared/editor/core/edit.session.mjs +0 -1099
  388. package/esm2022/lib/+shared/editor/core/editor.mjs +0 -1274
  389. package/esm2022/lib/+shared/editor/core/enums/break-types.enum.mjs +0 -7
  390. package/esm2022/lib/+shared/editor/core/enums/mouse-button.enum.mjs +0 -7
  391. package/esm2022/lib/+shared/editor/core/enums/page-type.enum.mjs +0 -7
  392. package/esm2022/lib/+shared/editor/core/helpers/content-style.helper.mjs +0 -156
  393. package/esm2022/lib/+shared/editor/core/helpers/delta.helper.mjs +0 -18
  394. package/esm2022/lib/+shared/editor/core/helpers/dom.helper.mjs +0 -42
  395. package/esm2022/lib/+shared/editor/core/helpers/event.helper.mjs +0 -18
  396. package/esm2022/lib/+shared/editor/core/helpers/font-metrics.helper.mjs +0 -88
  397. package/esm2022/lib/+shared/editor/core/helpers/format-style.helper.mjs +0 -72
  398. package/esm2022/lib/+shared/editor/core/helpers/line-width.helper.mjs +0 -13
  399. package/esm2022/lib/+shared/editor/core/helpers/numbering.helper.mjs +0 -83
  400. package/esm2022/lib/+shared/editor/core/helpers/page.helper.mjs +0 -12
  401. package/esm2022/lib/+shared/editor/core/helpers/paragraph-style.helper.mjs +0 -41
  402. package/esm2022/lib/+shared/editor/core/helpers/paragraph.helper.mjs +0 -169
  403. package/esm2022/lib/+shared/editor/core/helpers/position.helper.mjs +0 -194
  404. package/esm2022/lib/+shared/editor/core/helpers/print.rendering.helper.mjs +0 -7
  405. package/esm2022/lib/+shared/editor/core/helpers/rendering.helper.mjs +0 -187
  406. package/esm2022/lib/+shared/editor/core/helpers/unicode.helper.mjs +0 -20
  407. package/esm2022/lib/+shared/editor/core/interfaces/cell.interface.mjs +0 -2
  408. package/esm2022/lib/+shared/editor/core/interfaces/cursor-position.interface.mjs +0 -2
  409. package/esm2022/lib/+shared/editor/core/interfaces/font-metric-size.interface.mjs +0 -2
  410. package/esm2022/lib/+shared/editor/core/interfaces/layer.config.mjs +0 -2
  411. package/esm2022/lib/+shared/editor/core/interfaces/paragraph-info.interface.mjs +0 -2
  412. package/esm2022/lib/+shared/editor/core/interfaces/render-changes.interface.mjs +0 -2
  413. package/esm2022/lib/+shared/editor/core/interfaces/replace.interface.mjs +0 -2
  414. package/esm2022/lib/+shared/editor/core/interfaces/search-iteration.interface.mjs +0 -2
  415. package/esm2022/lib/+shared/editor/core/interfaces/toolbar-styles.interface.mjs +0 -2
  416. package/esm2022/lib/+shared/editor/core/interfaces/visible-line-info.interface.mjs +0 -2
  417. package/esm2022/lib/+shared/editor/core/interfaces/visible-range.interface.mjs +0 -2
  418. package/esm2022/lib/+shared/editor/core/keyboard/text-input.mjs +0 -53
  419. package/esm2022/lib/+shared/editor/core/layers/cursor.layer.mjs +0 -103
  420. package/esm2022/lib/+shared/editor/core/layers/edges.layer.mjs +0 -99
  421. package/esm2022/lib/+shared/editor/core/layers/lines.mjs +0 -96
  422. package/esm2022/lib/+shared/editor/core/layers/pages.layer.mjs +0 -106
  423. package/esm2022/lib/+shared/editor/core/layers/print.edges.layer.mjs +0 -7
  424. package/esm2022/lib/+shared/editor/core/layers/print.pages.layer.mjs +0 -7
  425. package/esm2022/lib/+shared/editor/core/layers/print.text.layer.mjs +0 -7
  426. package/esm2022/lib/+shared/editor/core/layers/renderloop.mjs +0 -26
  427. package/esm2022/lib/+shared/editor/core/layers/scrollbar.mjs +0 -100
  428. package/esm2022/lib/+shared/editor/core/layers/selection.layer.mjs +0 -115
  429. package/esm2022/lib/+shared/editor/core/layers/text.layer.mjs +0 -124
  430. package/esm2022/lib/+shared/editor/core/models/display-token.model.mjs +0 -12
  431. package/esm2022/lib/+shared/editor/core/models/distance.model.mjs +0 -10
  432. package/esm2022/lib/+shared/editor/core/models/edge-element.model.mjs +0 -9
  433. package/esm2022/lib/+shared/editor/core/models/format-ext.model.mjs +0 -10
  434. package/esm2022/lib/+shared/editor/core/models/indent.model.mjs +0 -9
  435. package/esm2022/lib/+shared/editor/core/models/line-info.model.mjs +0 -9
  436. package/esm2022/lib/+shared/editor/core/models/margin.model.mjs +0 -16
  437. package/esm2022/lib/+shared/editor/core/models/numbering-data.model.mjs +0 -9
  438. package/esm2022/lib/+shared/editor/core/models/render-changes.model.mjs +0 -25
  439. package/esm2022/lib/+shared/editor/core/paging/page-vertical-data.model.mjs +0 -9
  440. package/esm2022/lib/+shared/editor/core/paging/pages.wrap.mjs +0 -226
  441. package/esm2022/lib/+shared/editor/core/paging/paragraph.mjs +0 -52
  442. package/esm2022/lib/+shared/editor/core/paging/text-line-info.mjs +0 -34
  443. package/esm2022/lib/+shared/editor/core/point.mjs +0 -13
  444. package/esm2022/lib/+shared/editor/core/print.renderer.mjs +0 -72
  445. package/esm2022/lib/+shared/editor/core/range.mjs +0 -94
  446. package/esm2022/lib/+shared/editor/core/renderer.mjs +0 -217
  447. package/esm2022/lib/+shared/editor/core/search.mjs +0 -231
  448. package/esm2022/lib/+shared/editor/core/virtual.renderer.mjs +0 -356
  449. package/esm2022/lib/+shared/editor/custom-components/external-element/external-element.service.mjs +0 -6
  450. package/esm2022/lib/+shared/editor/custom-components/external-element/external-elements.const.mjs +0 -4
  451. package/esm2022/lib/+shared/editor/custom-components/external-element/external-sidenav.interface.mjs +0 -2
  452. package/esm2022/lib/+shared/editor/custom-components/external-element/external.component.mjs +0 -41
  453. package/esm2022/lib/+shared/editor/custom-components/external-element/models/element-data.model.mjs +0 -9
  454. package/esm2022/lib/+shared/editor/custom-components/external-element/models/external-element.model.mjs +0 -11
  455. package/esm2022/lib/+shared/editor/custom-components/external-element/models/external-sidenav.model.mjs +0 -15
  456. package/esm2022/lib/+shared/editor/custom-components/image/components/image.component.mjs +0 -88
  457. package/esm2022/lib/+shared/editor/custom-components/image/input-handler/image-input.handler.mjs +0 -38
  458. package/esm2022/lib/+shared/editor/custom-components/image/interfaces/size.mjs +0 -2
  459. package/esm2022/lib/+shared/editor/custom-components/image/resizer/coordinate.mjs +0 -2
  460. package/esm2022/lib/+shared/editor/custom-components/image/resizer/direction-wrapper.mjs +0 -19
  461. package/esm2022/lib/+shared/editor/custom-components/image/resizer/direction.enum.mjs +0 -12
  462. package/esm2022/lib/+shared/editor/custom-components/image/resizer/resizer.component.mjs +0 -106
  463. package/esm2022/lib/+shared/editor/custom-components/image/resizer/size-delta.mjs +0 -2
  464. package/esm2022/lib/+shared/editor/custom-components/image/resizer/size-wrapper.mjs +0 -52
  465. package/esm2022/lib/+shared/editor/custom-components/image/services/image-api.service.mjs +0 -14
  466. package/esm2022/lib/+shared/editor/custom-components/shared/abstract/base.component.mjs +0 -59
  467. package/esm2022/lib/+shared/editor/custom-components/shared/constants/custom-content-markers.const.mjs +0 -3
  468. package/esm2022/lib/+shared/editor/custom-components/shared/helpers/custom-component.hepler.mjs +0 -43
  469. package/esm2022/lib/+shared/editor/custom-components/shared/interfaces/custom-components.interface.mjs +0 -2
  470. package/esm2022/lib/+shared/editor/custom-components/shared/services/component/component.service.mjs +0 -64
  471. package/esm2022/lib/+shared/editor/custom-components/shared/services/custom-content/custom-content.service.mjs +0 -115
  472. package/esm2022/lib/+shared/editor/custom-components/shared/services/overlay/overlay.service.mjs +0 -55
  473. package/esm2022/lib/+shared/editor/custom-components/shared/types/custom-content.mjs +0 -2
  474. package/esm2022/lib/+shared/editor/custom-components/tab/tab.component.mjs +0 -44
  475. package/esm2022/lib/+shared/editor/custom-components/table/cell-resizer/cell-resizer.mjs +0 -118
  476. package/esm2022/lib/+shared/editor/custom-components/table/components/table-cell.component.mjs +0 -97
  477. package/esm2022/lib/+shared/editor/custom-components/table/components/table.component.mjs +0 -401
  478. package/esm2022/lib/+shared/editor/custom-components/table/enums/reisizer-side.enum.mjs +0 -8
  479. package/esm2022/lib/+shared/editor/custom-components/table/enums/vertical-merge.enum.mjs +0 -6
  480. package/esm2022/lib/+shared/editor/custom-components/table/models/cell-data.model.mjs +0 -18
  481. package/esm2022/lib/+shared/editor/custom-components/table/models/cell-resizer-parameters.model.mjs +0 -9
  482. package/esm2022/lib/+shared/editor/custom-components/table/models/row-data.model.mjs +0 -8
  483. package/esm2022/lib/+shared/editor/custom-components/table/models/selection-range.model.mjs +0 -7
  484. package/esm2022/lib/+shared/editor/custom-components/table/overlay-menu/overlay-menu.component.mjs +0 -74
  485. package/esm2022/lib/+shared/editor/custom-components/table/selection/table-selection.mjs +0 -364
  486. package/esm2022/lib/+shared/editor/editor.component.mjs +0 -98
  487. package/esm2022/lib/+shared/editor/editor.module.mjs +0 -82
  488. package/esm2022/lib/+shared/editor/execution/models/cell-session-source.model.mjs +0 -19
  489. package/esm2022/lib/+shared/editor/execution/models/edge-session-source.model.mjs +0 -15
  490. package/esm2022/lib/+shared/editor/execution/models/general-properties.model.mjs +0 -11
  491. package/esm2022/lib/+shared/editor/execution/models/main-session-source.model.mjs +0 -8
  492. package/esm2022/lib/+shared/editor/execution/models/session-source.model.mjs +0 -3
  493. package/esm2022/lib/+shared/editor/execution/models/session.model.mjs +0 -10
  494. package/esm2022/lib/+shared/editor/execution/regulator.service.mjs +0 -203
  495. package/esm2022/lib/+shared/editor/helpers/break.helper.mjs +0 -18
  496. package/esm2022/lib/+shared/editor/helpers/content.helper.mjs +0 -30
  497. package/esm2022/lib/+shared/editor/helpers/tab.helper.mjs +0 -6
  498. package/esm2022/lib/+shared/editor/interaction/editor.service.mjs +0 -309
  499. package/esm2022/lib/+shared/editor/interaction/input.handler.mjs +0 -160
  500. package/esm2022/lib/+shared/editor/interaction/mouse.handler.mjs +0 -49
  501. package/esm2022/lib/+shared/editor/interfaces/contents.interface.mjs +0 -2
  502. package/esm2022/lib/+shared/editor/interfaces/insert-index.interface.mjs +0 -2
  503. package/esm2022/lib/+shared/editor/operation-history/operation-history.mjs +0 -184
  504. package/esm2022/lib/+shared/editor/operation-history/operation.type.mjs +0 -2
  505. package/esm2022/lib/+shared/editor/operation-history/operations-history-info.model.mjs +0 -7
  506. package/esm2022/lib/+shared/editor/operations/enums/command-type.enum.mjs +0 -31
  507. package/esm2022/lib/+shared/editor/operations/enums/target-type.enum.mjs +0 -7
  508. package/esm2022/lib/+shared/editor/operations/helpers/break-operations.helper.mjs +0 -9
  509. package/esm2022/lib/+shared/editor/operations/helpers/content-operations.helper.mjs +0 -15
  510. package/esm2022/lib/+shared/editor/operations/helpers/format-operations.helper.mjs +0 -56
  511. package/esm2022/lib/+shared/editor/operations/helpers/image-operations.helper.mjs +0 -19
  512. package/esm2022/lib/+shared/editor/operations/helpers/indexed-element-operations.helper.mjs +0 -43
  513. package/esm2022/lib/+shared/editor/operations/helpers/link-operations.helper.mjs +0 -28
  514. package/esm2022/lib/+shared/editor/operations/helpers/numbering-operations.helper.mjs +0 -55
  515. package/esm2022/lib/+shared/editor/operations/helpers/operations-helper.helper.mjs +0 -394
  516. package/esm2022/lib/+shared/editor/operations/helpers/paragraph-operations.helper.mjs +0 -83
  517. package/esm2022/lib/+shared/editor/operations/helpers/save-commands.helper.mjs +0 -118
  518. package/esm2022/lib/+shared/editor/operations/helpers/tab-operations.helper.mjs +0 -16
  519. package/esm2022/lib/+shared/editor/operations/helpers/table-operations.helper.mjs +0 -374
  520. package/esm2022/lib/+shared/editor/operations/helpers/target-operations.helper.mjs +0 -23
  521. package/esm2022/lib/+shared/editor/positioning/selection.mjs +0 -307
  522. package/esm2022/lib/+shared/editor/store/editor.actions.mjs +0 -13
  523. package/esm2022/lib/+shared/editor-search/editor-search-dialog.component.mjs +0 -71
  524. package/esm2022/lib/+shared/editor-title/editor-title.component.mjs +0 -83
  525. package/esm2022/lib/+shared/editor-toolbar/color-picker/color-picker.component.mjs +0 -32
  526. package/esm2022/lib/+shared/editor-toolbar/constants/svg-icons.const.mjs +0 -157
  527. package/esm2022/lib/+shared/editor-toolbar/editor-toolbar.component.mjs +0 -101
  528. package/esm2022/lib/+shared/editor-toolbar/editor-toolbar.module.mjs +0 -117
  529. package/esm2022/lib/+shared/editor-toolbar/enums/alignment.enum.mjs +0 -8
  530. package/esm2022/lib/+shared/editor-toolbar/enums/numbering-type.enum.mjs +0 -6
  531. package/esm2022/lib/+shared/editor-toolbar/font/font.component.mjs +0 -45
  532. package/esm2022/lib/+shared/editor-toolbar/font-size/font-size.component.mjs +0 -85
  533. package/esm2022/lib/+shared/editor-toolbar/font-style/font-style.component.mjs +0 -80
  534. package/esm2022/lib/+shared/editor-toolbar/format/format.component.mjs +0 -28
  535. package/esm2022/lib/+shared/editor-toolbar/heading/heading.component.mjs +0 -23
  536. package/esm2022/lib/+shared/editor-toolbar/helpers/toolbar-styles.helper.mjs +0 -55
  537. package/esm2022/lib/+shared/editor-toolbar/menu-dropdowns/menu-dropdowns.component.mjs +0 -194
  538. package/esm2022/lib/+shared/editor-toolbar/numbering/numbering.component.mjs +0 -53
  539. package/esm2022/lib/+shared/editor-toolbar/print/print.component.mjs +0 -18
  540. package/esm2022/lib/+shared/editor-toolbar/toolbar-actions/toolbar-actions.component.mjs +0 -126
  541. package/esm2022/lib/+shared/editor-toolbar/undo-redo/undo-redo.component.mjs +0 -27
  542. package/esm2022/lib/+shared/editor-toolbar/zoom/zoom.component.mjs +0 -74
  543. package/esm2022/lib/+shared/helpers/print.helper.mjs +0 -40
  544. package/esm2022/lib/+shared/helpers/revision.helper.mjs +0 -91
  545. package/esm2022/lib/+shared/helpers/scaling.helper.mjs +0 -9
  546. package/esm2022/lib/+shared/helpers/validation.helper.mjs +0 -7
  547. package/esm2022/lib/+shared/insert-table/insert-table.component.mjs +0 -54
  548. package/esm2022/lib/+shared/services/commands.service.mjs +0 -20
  549. package/esm2022/lib/+shared/services/custom-icon.service.mjs +0 -34
  550. package/lib/+shared/abstract/base-api.service.d.ts +0 -23
  551. package/lib/+shared/abstract/observer.component.d.ts +0 -10
  552. package/lib/+shared/constants/default-file-name.const.d.ts +0 -1
  553. package/lib/+shared/constants/paginator-sizes.const.d.ts +0 -2
  554. package/lib/+shared/editor/core/components/edges/edge.component.d.ts +0 -45
  555. package/lib/+shared/editor/core/constants/clipboardEventTypes.const.d.ts +0 -5
  556. package/lib/+shared/editor/core/constants/content-style-change.const.d.ts +0 -14
  557. package/lib/+shared/editor/core/helpers/content-style.helper.d.ts +0 -16
  558. package/lib/+shared/editor/core/helpers/delta.helper.d.ts +0 -6
  559. package/lib/+shared/editor/core/interfaces/visible-line-info.interface.d.ts +0 -5
  560. package/lib/+shared/editor/core/layers/edges.layer.d.ts +0 -24
  561. package/lib/+shared/editor/core/layers/print.edges.layer.d.ts +0 -4
  562. package/lib/+shared/editor/core/layers/print.text.layer.d.ts +0 -5
  563. package/lib/+shared/editor/core/layers/text.layer.d.ts +0 -22
  564. package/lib/+shared/editor/core/point.d.ts +0 -7
  565. package/lib/+shared/editor/core/print.renderer.d.ts +0 -25
  566. package/lib/+shared/editor/custom-components/image/services/image-api.service.d.ts +0 -8
  567. package/lib/+shared/editor/custom-components/shared/interfaces/custom-components.interface.d.ts +0 -13
  568. package/lib/+shared/editor/custom-components/shared/types/custom-content.d.ts +0 -5
  569. package/lib/+shared/editor/interfaces/contents.interface.d.ts +0 -22
  570. package/lib/+shared/editor/operations/helpers/image-operations.helper.d.ts +0 -7
  571. package/lib/+shared/editor/operations/helpers/target-operations.helper.d.ts +0 -6
  572. package/lib/+shared/editor/store/editor.actions.d.ts +0 -11
  573. package/lib/+shared/editor-toolbar/constants/numbering-templates.const.d.ts +0 -6
  574. package/lib/+shared/editor-toolbar/editor-toolbar.component.d.ts +0 -45
  575. package/lib/+shared/editor-toolbar/editor-toolbar.module.d.ts +0 -31
  576. package/lib/+shared/editor-toolbar/menu-dropdowns/menu-dropdowns.component.d.ts +0 -73
  577. package/lib/+shared/editor-toolbar/toolbar-actions/toolbar-actions.component.d.ts +0 -49
  578. package/lib/+shared/helpers/revision.helper.d.ts +0 -15
  579. package/src/lib/+shared/editor-toolbar/_editor-toolbar.theme.scss +0 -10
  580. package/src/lib/+shared/editor-toolbar/_theme.scss +0 -21
  581. package/src/scss/_mixins.scss +0 -14
  582. package/src/scss/_variables.scss +0 -1
  583. /package/lib/{+shared/helpers → apart-components/add-link-dialog}/validation.helper.d.ts +0 -0
  584. /package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/shared}/constants/svg-icons.const.d.ts +0 -0
  585. /package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/shared}/enums/alignment.enum.d.ts +0 -0
  586. /package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/shared}/enums/numbering-template-type.enum.d.ts +0 -0
  587. /package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/shared}/enums/numbering-type.enum.d.ts +0 -0
  588. /package/lib/{+shared → apart-components/editor-toolbar/shared}/services/custom-icon.service.d.ts +0 -0
  589. /package/lib/{+shared/editor/core → editor}/components/edges/edge-type.enum.d.ts +0 -0
  590. /package/lib/{+shared/editor/core/enums → editor/components/edges}/page-type.enum.d.ts +0 -0
  591. /package/lib/{+shared/editor/custom-components → editor/components}/external-element/external-element.service.d.ts +0 -0
  592. /package/lib/{+shared/editor/custom-components → editor/components}/external-element/external-elements.const.d.ts +0 -0
  593. /package/lib/{+shared/editor/custom-components → editor/components}/external-element/models/element-data.model.d.ts +0 -0
  594. /package/lib/{+shared/editor/custom-components → editor/components}/external-element/models/external-element.model.d.ts +0 -0
  595. /package/lib/{+shared/editor/custom-components → editor/components}/external-element/models/external-sidenav.model.d.ts +0 -0
  596. /package/lib/{+shared/editor/custom-components → editor/components}/image/input-handler/image-input.handler.d.ts +0 -0
  597. /package/lib/{+shared/editor/custom-components → editor/components}/image/resizer/coordinate.d.ts +0 -0
  598. /package/lib/{+shared/editor/custom-components → editor/components}/image/resizer/direction-wrapper.d.ts +0 -0
  599. /package/lib/{+shared/editor/custom-components → editor/components}/image/resizer/direction.enum.d.ts +0 -0
  600. /package/lib/{+shared/editor/custom-components → editor/components}/image/resizer/size-delta.d.ts +0 -0
  601. /package/lib/{+shared/editor/custom-components/image/interfaces → editor/components/image}/size.d.ts +0 -0
  602. /package/lib/{+shared/editor/custom-components/shared/constants → editor/components/shared}/custom-content-markers.const.d.ts +0 -0
  603. /package/lib/{+shared/editor/custom-components/shared/services/overlay → editor/components/shared/services}/overlay.service.d.ts +0 -0
  604. /package/lib/{+shared/editor/helpers → editor/components/tab}/tab.helper.d.ts +0 -0
  605. /package/lib/{+shared/editor/core → editor/components/table}/enums/hrule.enum.d.ts +0 -0
  606. /package/lib/{+shared/editor/custom-components → editor/components}/table/enums/reisizer-side.enum.d.ts +0 -0
  607. /package/lib/{+shared/editor/custom-components → editor/components}/table/enums/vertical-merge.enum.d.ts +0 -0
  608. /package/lib/{+shared/editor/custom-components → editor/components}/table/models/cell-data.model.d.ts +0 -0
  609. /package/lib/{+shared/editor/custom-components → editor/components}/table/models/cell-resizer-parameters.model.d.ts +0 -0
  610. /package/lib/{+shared/editor/custom-components → editor/components}/table/models/row-data.model.d.ts +0 -0
  611. /package/lib/{+shared/editor/custom-components → editor/components}/table/models/selection-range.model.d.ts +0 -0
  612. /package/lib/{+shared/editor/core → editor/content}/constants/display-values.const.d.ts +0 -0
  613. /package/lib/{+shared/editor/core → editor/content}/constants/document-info.const.d.ts +0 -0
  614. /package/lib/{+shared/editor/core/models → editor/content/display-data}/indent.model.d.ts +0 -0
  615. /package/lib/{+shared/editor/core/models → editor/content/display-data}/line-info.model.d.ts +0 -0
  616. /package/lib/{+shared/editor/core/interfaces → editor/content/display-data}/paragraph-info.interface.d.ts +0 -0
  617. /package/lib/{+shared/editor/core/interfaces → editor/content/display-data}/toolbar-styles.interface.d.ts +0 -0
  618. /package/lib/{+shared/editor → editor/content}/helpers/format.helper.d.ts +0 -0
  619. /package/lib/{+shared → editor/content}/helpers/scaling.helper.d.ts +0 -0
  620. /package/lib/{+shared/editor/core/models → editor/content}/margin.model.d.ts +0 -0
  621. /package/lib/{+shared/editor/core/enums → editor/content}/vertical-alignment.enum.d.ts +0 -0
  622. /package/lib/{+shared/editor/core/interfaces → editor/display}/cell.interface.d.ts +0 -0
  623. /package/lib/{+shared/editor/core/helpers → editor/display}/event.helper.d.ts +0 -0
  624. /package/lib/{+shared/editor/core → editor/display}/layers/print.pages.layer.d.ts +0 -0
  625. /package/lib/{+shared/editor/core/interfaces → editor/display}/render-changes.interface.d.ts +0 -0
  626. /package/lib/{+shared/editor/core/interfaces → editor/display}/visible-range.interface.d.ts +0 -0
  627. /package/lib/{+shared/editor/core/models → editor/execution}/distance.model.d.ts +0 -0
  628. /package/lib/{+shared/editor/core → editor/execution}/helpers/dom.helper.d.ts +0 -0
  629. /package/lib/{+shared/editor/core/constants → editor/gadgets/font-metrics}/editor-version.const.d.ts +0 -0
  630. /package/lib/{+shared/editor/core/interfaces → editor/gadgets/font-metrics}/font-metric-size.interface.d.ts +0 -0
  631. /package/lib/{+shared/editor/operation-history → editor/gadgets/history}/operations-history-info.model.d.ts +0 -0
  632. /package/lib/{+shared/editor/core/enums → editor/gadgets/numbering}/numbering-marker-type.enum.d.ts +0 -0
  633. /package/lib/{+shared/editor/core/enums → editor/gadgets/page-break}/break-types.enum.d.ts +0 -0
  634. /package/lib/{+shared/editor/core/interfaces → editor/gadgets/search}/replace.interface.d.ts +0 -0
  635. /package/lib/{+shared/editor/core/interfaces → editor/gadgets/search}/search-iteration.interface.d.ts +0 -0
  636. /package/lib/{+shared/editor/core/constants → editor/gadgets/unicode}/unicode-chars.const.d.ts +0 -0
  637. /package/lib/{+shared/editor/core/helpers → editor/gadgets/unicode}/unicode.helper.d.ts +0 -0
  638. /package/lib/{+shared/enums → editor/interaction}/mode.enum.d.ts +0 -0
  639. /package/lib/{+shared/editor/core/enums → editor/interaction}/mouse-button.enum.d.ts +0 -0
  640. /package/lib/{+shared/editor/core/keyboard → editor/interaction}/text-input.d.ts +0 -0
  641. /package/lib/{+shared/services → editor/operations}/commands.service.d.ts +0 -0
  642. /package/lib/{+shared/editor → editor}/operations/enums/target-type.enum.d.ts +0 -0
  643. /package/lib/{+shared/editor → editor}/operations/helpers/content-operations.helper.d.ts +0 -0
  644. /package/lib/{+shared/editor/core/constants → editor/positioning}/alignments.const.d.ts +0 -0
  645. /package/lib/{+shared/editor/interfaces → editor/positioning}/insert-index.interface.d.ts +0 -0
@@ -1,1099 +0,0 @@
1
- import { Alignment } from './constants/alignments.const';
2
- import { BreakHelper } from '../helpers/break.helper';
3
- import { BreakTypes } from './enums/break-types.enum';
4
- import { ContentHelper } from '../helpers/content.helper';
5
- import { ContentStyleHelper } from './helpers/content-style.helper';
6
- import { CUSTOM_ELEMENT_MARKER } from '../custom-components/shared/constants/custom-content-markers.const';
7
- import { CustomComponentHelper } from '../custom-components/shared/helpers/custom-component.hepler';
8
- import { DEFAULT_BACKGROUND_COLOR, DEFAULT_FONT_COLOR, DEFAULT_FONT_FAMILY, DEFAULT_FONT_SIZE, DEFAULT_PARAGRAPH_STYLE, HYPERLINK_HEADING_STYLE_ID, NEW_LINE_MARKUP } from './constants/editor.const';
9
- import { DisplayToken } from './models/display-token.model';
10
- import { DisplayValue } from './constants/display-values.const';
11
- import { ElementModel } from '../../../models/generated/element.model';
12
- import { EventEmitting } from './base/event-emitting';
13
- import { FontMetrics } from './helpers/font-metrics.helper';
14
- import { FormatStyleHelper } from './helpers/format-style.helper';
15
- import { ImageDataModel } from '../../../models/generated/image-data.model';
16
- import { IndentModel } from './models/indent.model';
17
- import { InsertElementModel } from '../../../models/generated/insert-element.model';
18
- import { LineInfoModel } from './models/line-info.model';
19
- import { NoderImageComponent } from '../custom-components/image/components/image.component';
20
- import { NoderTabComponent } from '../custom-components/tab/tab.component';
21
- import { NoderTableComponent } from '../custom-components/table/components/table.component';
22
- import { NumberingHelper } from './helpers/numbering.helper';
23
- import { NumberingMarkerType } from './enums/numbering-marker-type.enum';
24
- import { OperationsHelper } from '../operations/helpers/operations-helper.helper';
25
- import { PagesWrap } from './paging/pages.wrap';
26
- import { ParagraphHelper } from './helpers/paragraph.helper';
27
- import { ParagraphStyleHelper } from './helpers/paragraph-style.helper';
28
- import { Point } from './point';
29
- import { Range } from './range';
30
- import { TabHelper } from '../helpers/tab.helper';
31
- import { TextStyleModel } from '../../../models/generated/text-style.model';
32
- import { UnicodeHelper } from './helpers/unicode.helper';
33
- export class EditSession extends EventEmitting {
34
- set styles(styles) {
35
- for (let key of Object.keys(styles)) {
36
- if (styles[key].length === 0) {
37
- this._stylesMap[key] = ContentStyleHelper.getDefaultStyleValueByKey(key);
38
- continue;
39
- }
40
- else if (styles[key].length > 1 && !styles[key].every(x => x === styles[key][0])) {
41
- this._stylesMap[key] = typeof styles[key][0] === 'boolean' && key !== 'isBulletMarker' ? false : null;
42
- continue;
43
- }
44
- this._stylesMap[key] = styles[key][0];
45
- }
46
- this.signal('setStyles', this._stylesMap);
47
- }
48
- get stylesMap() {
49
- return this._stylesMap;
50
- }
51
- set contentWidth(value) {
52
- if (!value) {
53
- return;
54
- }
55
- this._contentWidth = value;
56
- this.updateWrapData(0, this.document.lines.length - 1);
57
- }
58
- get contentWidth() {
59
- return this._contentWidth;
60
- }
61
- set cursorStyle(model) {
62
- if (!model) {
63
- return;
64
- }
65
- if (!this._cursorStyle) {
66
- this._cursorStyle = model;
67
- this.emit('cursorStylesChanged', this._cursorStyle);
68
- return;
69
- }
70
- const changes = ContentStyleHelper.getTextStyleChanges(this._cursorStyle, model);
71
- if (!changes) {
72
- return;
73
- }
74
- ContentStyleHelper.applyTextStyleChanges(this._cursorStyle, model, changes);
75
- this.emit('cursorStylesChanged', this._cursorStyle);
76
- }
77
- get cursorStyle() {
78
- return this._cursorStyle;
79
- }
80
- constructor(document, sessionId, customContentService, model, selection, properties) {
81
- super();
82
- this.document = document;
83
- this.sessionId = sessionId;
84
- this.customContentService = customContentService;
85
- this.model = model;
86
- this.selection = selection;
87
- this.properties = properties;
88
- this.tokenRe = new RegExp('^[' + UnicodeHelper.wordChars + '\\$_]+', 'g');
89
- this.nonTokenRe = new RegExp('^(?:[^' + UnicodeHelper.wordChars + '\\$_]|\\s])+', 'g');
90
- this.wrapData = [[]]; // Wrap indexes for document rows
91
- this.wrapParagraphLine = []; // line numbers that begin the paragraphs
92
- this.wrapParagraphIndex = []; // symbol indexes that begin the paragraphs
93
- this.scrollTop = 0;
94
- this._stylesMap = {
95
- fontFamily: DEFAULT_FONT_FAMILY,
96
- fontSize: DEFAULT_FONT_SIZE,
97
- fontColor: DEFAULT_FONT_COLOR,
98
- alignment: Alignment.left,
99
- backgroundColor: DEFAULT_BACKGROUND_COLOR,
100
- highlightColor: DEFAULT_BACKGROUND_COLOR
101
- };
102
- this.customComponents = this.customContentService.generateComponents(this.model, this.sessionId, this.properties, this.document);
103
- this.setDocument();
104
- }
105
- destroy() {
106
- this.pagesWrap.destroy();
107
- }
108
- setScrollTop(value) {
109
- if (this.scrollTop === value || isNaN(value)) {
110
- return;
111
- }
112
- this.scrollTop = value;
113
- this.signal('changeScrollTop', value);
114
- }
115
- getRowLength(row) {
116
- if (!this.wrapData[row]) {
117
- return 1;
118
- }
119
- return this.wrapData[row].length + 1;
120
- }
121
- updateWrapParagraphIndex(first) {
122
- const count = this.document.lines.length;
123
- if (first === 0) {
124
- this.wrapParagraphIndex[first] = 0;
125
- first++;
126
- }
127
- for (let i = first; i < count; i++) {
128
- this.wrapParagraphIndex[i] = this.wrapParagraphIndex[i - 1] + this.document.lines[i - 1].length + 1;
129
- }
130
- this.wrapParagraphIndex.splice(count);
131
- }
132
- updateWrapParagraphLine(first) {
133
- const count = this.document.lines.length;
134
- if (first === 0) {
135
- this.wrapParagraphLine[first] = 0;
136
- }
137
- else {
138
- this.wrapParagraphLine[first] = this.wrapParagraphLine[first - 1] + this.wrapData[first - 1].length + 1;
139
- }
140
- for (let i = first + 1; i < count; i++) {
141
- this.wrapParagraphLine[i] = this.wrapParagraphLine[i - 1] + this.wrapData[i - 1].length + 1;
142
- }
143
- this.wrapParagraphLine.splice(count);
144
- }
145
- updateParagraphNumberingData(index) {
146
- if (this.pagesWrap.paragraphs[index].numberingData.numberingId !== this.model.paragraphs[index].paragraphStyle.numberingId) {
147
- this.pagesWrap.paragraphs[index].numberingData = NumberingHelper.createDataModel(this.properties.numberings, this.model.paragraphs, index);
148
- }
149
- if (this.pagesWrap.paragraphs[index].numberingData.numberingId !== null) {
150
- const paragraphFormat = FormatStyleHelper.getFormatAtIndex(this.model.formats, this.model.paragraphs[index].insertIndex);
151
- NumberingHelper.updateMarkerData(this.properties, this.pagesWrap.paragraphs[index], paragraphFormat.textStyle, this.model.paragraphs[index].paragraphStyle);
152
- }
153
- }
154
- updateWrapData(firstParagraph, lastParagraph) {
155
- this.updateWrapParagraphIndex(firstParagraph);
156
- let indexOfParagraphAfterPageBreak = this.pagesWrap.paragraphs[firstParagraph - 1]?.isEndedByPageBreak ? firstParagraph : -1;
157
- let firstUsedTabIndex = this.customComponents.tabs.findIndex(x => x.instance.insertIndex >= this.wrapParagraphIndex[firstParagraph]);
158
- for (let i = firstParagraph; i <= lastParagraph; i++) {
159
- this.pagesWrap.tabTokens = [];
160
- const currentLine = this.document.getLine(this.document.lines, i);
161
- const isNextLineExists = this.document.lines.length > i + 1;
162
- const { splits, rowInfos } = this.getSplits(this.model, currentLine, this.wrapParagraphIndex[i], this.customComponents, i, isNextLineExists);
163
- this.wrapData[i] = splits;
164
- if (indexOfParagraphAfterPageBreak === i) {
165
- rowInfos[0].isAfterPageBreak = true;
166
- }
167
- indexOfParagraphAfterPageBreak = rowInfos[rowInfos.length - 1].isEndedByPageBreak ? i + 1 : -1;
168
- this.pagesWrap.set(i, rowInfos, this.properties.numberings, this.model.paragraphs);
169
- this.updateParagraphNumberingData(i);
170
- firstUsedTabIndex = this.updateParagraphTabs(firstUsedTabIndex, i, currentLine.length);
171
- }
172
- this.pagesWrap.paragraphs[lastParagraph + 1]?.setIsAfterPageBreak(indexOfParagraphAfterPageBreak > -1);
173
- const count = this.document.lines.length;
174
- this.pagesWrap.paragraphs.splice(count);
175
- this.wrapData.splice(count);
176
- this.updateWrapParagraphLine(firstParagraph);
177
- this.pagesWrap.processParagraphsProperties(firstParagraph, this.wrapParagraphIndex);
178
- }
179
- /**
180
- * Given a string, returns an array of the display characters, including tabs and spaces.
181
- */
182
- getDisplayTokens(model, str, startIndex, customComponents) {
183
- if (!str.length) {
184
- return this.getEmptyLineTokens(startIndex);
185
- }
186
- return this.getFilledLineTokens(startIndex, str, model, customComponents);
187
- }
188
- getRowCacheIndex(cacheArray, value) {
189
- let start = 0;
190
- let end = cacheArray.length - 1;
191
- while (start <= end) {
192
- const mid = (start + end) >> 1;
193
- const center = cacheArray[mid];
194
- if (value > center) {
195
- start = mid + 1;
196
- }
197
- else if (value < center) {
198
- end = mid - 1;
199
- }
200
- else {
201
- return mid;
202
- }
203
- }
204
- return start - 1;
205
- }
206
- /**
207
- * Calculates the width of the string `str` on the screen while assuming that the string starts at the first column on the screen.
208
- * The first position indicates the number of columns for `str` on screen.
209
- * The second value contains the position of the document column that this function read until.
210
- */
211
- getStringScreenWidth(str, maxScreenColumn) {
212
- let screenColumn = 0;
213
- let column;
214
- for (column = 0; column < str.length; column++) {
215
- screenColumn += 1;
216
- if (screenColumn > maxScreenColumn) {
217
- break;
218
- }
219
- }
220
- return [screenColumn, column];
221
- }
222
- /**
223
- * Given a starting row and column, this method returns the `Range` of the first word boundary it finds.
224
- */
225
- getWordRange(row, column) {
226
- const line = this.document.getLine(this.document.lines, row);
227
- let inToken = false;
228
- if (column > 0) {
229
- inToken = !!line.charAt(column - 1).match(this.tokenRe);
230
- }
231
- if (!inToken) {
232
- inToken = !!line.charAt(column).match(this.tokenRe);
233
- }
234
- let regexp;
235
- if (inToken) {
236
- regexp = this.tokenRe;
237
- }
238
- else if (/^\s+$/.test(line.slice(column - 1, column + 1))) {
239
- regexp = /\s/;
240
- }
241
- else {
242
- regexp = this.nonTokenRe;
243
- }
244
- let start = column;
245
- if (start > 0) {
246
- do {
247
- start--;
248
- } while (start >= 0 && line.charAt(start).match(regexp));
249
- start++;
250
- }
251
- let end = column;
252
- while (end < line.length && line.charAt(end).match(regexp)) {
253
- end++;
254
- }
255
- return new Range(new Point(row, start), new Point(row, end));
256
- }
257
- getDisplayLine(row, endColumn, startColumn) {
258
- const line = this.document.getLine(this.document.lines, row);
259
- return line.substring(startColumn || 0, endColumn || line.length);
260
- }
261
- removeByDocumentIndexes(startIndex, endIndex) {
262
- const startParagraphPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, startIndex);
263
- const endParagraphPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, endIndex);
264
- this.remove(new Range(startParagraphPosition, endParagraphPosition));
265
- }
266
- insertTextByDocumentIndex(index, text, style) {
267
- const paragraphPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, index);
268
- return this.insertText(paragraphPosition, text, style);
269
- }
270
- insertElementByDocumentIndex(insertElement) {
271
- const elementPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, insertElement.element.insertIndex);
272
- return this.insertElement(elementPosition, insertElement.element);
273
- }
274
- insertBreakByDocumentIndex(insertElement) {
275
- const elementPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, insertElement.insertIndex);
276
- return this.insertBreak(elementPosition, insertElement.breakType);
277
- }
278
- insertTabByDocumentIndex(insertElement) {
279
- const elementPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, insertElement.insertIndex);
280
- return this.insertTab(elementPosition);
281
- }
282
- insertImageByDocumentIndex(insertElement) {
283
- const elementPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, insertElement.insertIndex);
284
- return this.insertImage(elementPosition, insertElement.imageData);
285
- }
286
- insertTableByDocumentIndex(insertElement) {
287
- const elementPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, insertElement.insertIndex);
288
- return this.insertTable(elementPosition, insertElement);
289
- }
290
- applyTextStyle(startIndex, endIndex, textStyle) {
291
- this.cursorStyle = new TextStyleModel(textStyle);
292
- const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, startIndex).row;
293
- const endParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, endIndex).row;
294
- OperationsHelper.applyTextStyle(this.model, startIndex, endIndex, textStyle);
295
- this.updateWrapData(startParagraph, endParagraph);
296
- this.setStyle(textStyle);
297
- }
298
- applyParagraphStyle(startIndex, endIndex, paragraphStyle) {
299
- const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, startIndex).row;
300
- const endParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, endIndex).row;
301
- OperationsHelper.applyParagraphStyle(this.model, startIndex, endIndex, paragraphStyle);
302
- this.updateWrapData(startParagraph, endParagraph);
303
- this.setStyle(paragraphStyle);
304
- }
305
- applyElementStyle(model) {
306
- OperationsHelper.applyElementStyle(this.model, model);
307
- const imageComponentRef = this.customComponents.customElements.find(x => x.instance.insertIndex === model.insertIndex);
308
- imageComponentRef.instance.initialize();
309
- const paragraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, model.insertIndex).row;
310
- this.updateWrapData(paragraph, paragraph);
311
- }
312
- addNumbering(levels, startIndex, endIndex) {
313
- const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, startIndex).row;
314
- const endParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, endIndex).row;
315
- OperationsHelper.addNumbering(this.model, this.properties.numberings, startIndex, endIndex, levels);
316
- for (let i = startParagraph; i <= endParagraph; i++) {
317
- if (this.pagesWrap.paragraphs[i].numberingData.numberingId !== null) {
318
- this.updateNumberingsDataOnChange(endParagraph);
319
- break;
320
- }
321
- }
322
- this.updateWrapData(startParagraph, endParagraph);
323
- this.setNumberingStyle(startIndex, endIndex);
324
- }
325
- removeNumberings(startIndex, endIndex) {
326
- const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, startIndex).row;
327
- const endParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, endIndex).row;
328
- OperationsHelper.removeNumberings(this.model, this.properties.numberings, startIndex, endIndex);
329
- for (let i = startParagraph; i <= endParagraph; i++) {
330
- if (this.pagesWrap.paragraphs[i].numberingData.numberingId !== null) {
331
- this.updateNumberingsDataOnChange(endParagraph);
332
- break;
333
- }
334
- }
335
- this.updateWrapData(startParagraph, endParagraph);
336
- this.setNumberingStyle(startIndex, endIndex);
337
- }
338
- restoreNumberings(paragraphs, numberings) {
339
- const startIndex = paragraphs[0].insertIndex;
340
- const endIndex = paragraphs[paragraphs.length - 1].insertIndex;
341
- const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, startIndex).row;
342
- const endPosition = ContentHelper.documentIndexToParagraphWithOffset(this.wrapParagraphIndex, this.document.lines, endIndex);
343
- OperationsHelper.restoreNumberings(this.model, this.properties.numberings, paragraphs, numberings);
344
- for (const paragraph of paragraphs) {
345
- if (paragraph.paragraphStyle.numberingId !== null) {
346
- this.updateNumberingsDataOnChange(endPosition.row);
347
- break;
348
- }
349
- }
350
- this.updateWrapData(startParagraph, endPosition.row);
351
- this.selection.placeCursor(endPosition);
352
- this.setNumberingStyle(startIndex, endIndex);
353
- }
354
- applyImageStyle(applyImage) {
355
- const imageComponentRef = this.customComponents.images.find(x => x.instance.insertIndex === applyImage.insertIndex);
356
- imageComponentRef.instance.resize({ width: applyImage.width, height: applyImage.height });
357
- OperationsHelper.applyImageStyle(this.model, applyImage);
358
- const start = this.document.indexToPosition(applyImage.insertIndex, 0);
359
- this.updateWrapData(start.row, this.document.lines.length - 1);
360
- }
361
- restoreTextStyles(formats) {
362
- const startIndex = formats[0].startIndex;
363
- const endIndex = formats[formats.length - 1].endIndex;
364
- const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, startIndex).row;
365
- const endPosition = ContentHelper.documentIndexToParagraphWithOffset(this.wrapParagraphIndex, this.document.lines, endIndex);
366
- OperationsHelper.restoreTextStyles(this.model, formats);
367
- this.updateWrapData(startParagraph, endPosition.row);
368
- this.selection.placeCursor(endPosition);
369
- this.processSelectionStyles();
370
- }
371
- restoreParagraphStyles(paragraphs) {
372
- const startIndex = paragraphs[0].insertIndex;
373
- const endIndex = paragraphs[paragraphs.length - 1].insertIndex;
374
- const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, startIndex).row;
375
- const endPosition = ContentHelper.documentIndexToParagraphWithOffset(this.wrapParagraphIndex, this.document.lines, endIndex);
376
- OperationsHelper.restoreParagraphStyles(this.model, paragraphs);
377
- this.updateWrapData(startParagraph, endPosition.row);
378
- this.selection.placeCursor(endPosition);
379
- this.processSelectionStyles();
380
- }
381
- setTextStyle(textStyle) {
382
- this.cursorStyle = new TextStyleModel(textStyle);
383
- this.setStyle(textStyle);
384
- }
385
- /**
386
- * Removes the `range` from the document.
387
- * If `range` is empty, this function returns the unmodified value of `range.start`.
388
- */
389
- remove(range) {
390
- const startIndex = ContentHelper.paragraphPositionToDocumentIndex(this.wrapParagraphIndex, range.start);
391
- const endIndex = ContentHelper.paragraphPositionToDocumentIndex(this.wrapParagraphIndex, range.end) - 1;
392
- this.document.removeRange(range);
393
- CustomComponentHelper.applyRemovingComponents(this.customComponents.tables, startIndex, endIndex);
394
- CustomComponentHelper.applyRemovingComponents(this.customComponents.images, startIndex, endIndex);
395
- CustomComponentHelper.applyRemovingComponents(this.customComponents.customElements, startIndex, endIndex);
396
- CustomComponentHelper.applyRemovingComponents(this.customComponents.tabs, startIndex, endIndex);
397
- OperationsHelper.delete(this.model, startIndex, endIndex);
398
- this.selection.placeCursor(range.start);
399
- this.updateInternalDataOnDeleteText(range.start.row, range.end.row);
400
- this.processSelectionStyles();
401
- }
402
- replace(model) {
403
- this.removeByDocumentIndexes(model.delete.startIndex, model.delete.endIndex + 1);
404
- let endPoint;
405
- if (model.insertText) {
406
- endPoint = this.insertTextByDocumentIndex(model.insertText.insertIndex, model.insertText.text);
407
- }
408
- else if (model.insertElement) {
409
- endPoint = this.insertElementByDocumentIndex(model.insertElement);
410
- }
411
- else if (model.insertBreak) {
412
- endPoint = this.insertBreakByDocumentIndex(model.insertBreak);
413
- }
414
- else if (model.insertTab) {
415
- endPoint = this.insertTabByDocumentIndex(model.insertTab);
416
- }
417
- else if (model.insertImage) {
418
- endPoint = this.insertImageByDocumentIndex(model.insertImage);
419
- }
420
- else if (model.insertTable) {
421
- endPoint = this.insertTableByDocumentIndex(model.insertTable);
422
- }
423
- return endPoint;
424
- }
425
- insertText(position, text, cursorStyle) {
426
- const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.wrapParagraphIndex, position);
427
- if (cursorStyle) {
428
- OperationsHelper.insertStyledText(this.model, text, insertIndex, cursorStyle);
429
- }
430
- else {
431
- OperationsHelper.insertText(this.model, text, insertIndex);
432
- }
433
- const endPoint = this.document.insertText(position, text);
434
- this.updateInternalDataOnInsertText(position.row, endPoint.row);
435
- this.selection.placeCursor(endPoint);
436
- return endPoint;
437
- }
438
- insertElement(position, element) {
439
- const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.wrapParagraphIndex, position);
440
- const insertElement = new InsertElementModel({ element: new ElementModel({ insertIndex, ...element }) });
441
- OperationsHelper.insertElement(this.model, insertElement);
442
- const model = this.model.elements.find(x => x.insertIndex === insertIndex);
443
- const type = this.customContentService.findComponentType(model.type);
444
- this.addComponent(this.customComponents.customElements, model, type);
445
- const endPoint = this.document.insertText(position, CUSTOM_ELEMENT_MARKER);
446
- this.updateWrapData(position.row, endPoint.row);
447
- this.selection.placeCursor(endPoint);
448
- return endPoint;
449
- }
450
- insertBreak(position, breakType) {
451
- const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.wrapParagraphIndex, position);
452
- const isOnNewParagraph = breakType === BreakTypes.Page &&
453
- BreakHelper.getBreakType(this.model, CUSTOM_ELEMENT_MARKER, insertIndex - 1) !== BreakTypes.Page;
454
- const text = isOnNewParagraph ? `${NEW_LINE_MARKUP}${CUSTOM_ELEMENT_MARKER}` : CUSTOM_ELEMENT_MARKER;
455
- OperationsHelper.insertBreak(this.model, text, insertIndex, breakType);
456
- const endPoint = this.document.insertText(position, text);
457
- if (isOnNewParagraph) {
458
- this.updateInternalDataOnInsertText(position.row, endPoint.row);
459
- }
460
- this.updateWrapData(position.row, endPoint.row);
461
- const point = this.document.getPositionAfterBreak(endPoint, breakType);
462
- this.selection.placeCursor(point);
463
- return endPoint;
464
- }
465
- insertTab(position) {
466
- const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.wrapParagraphIndex, position);
467
- OperationsHelper.insertTab(this.model, insertIndex);
468
- const model = this.model.tabs.find(x => x.insertIndex === insertIndex);
469
- this.addComponent(this.customComponents.tabs, model, NoderTabComponent);
470
- const endPoint = this.document.insertText(position, CUSTOM_ELEMENT_MARKER);
471
- this.updateWrapData(position.row, position.row);
472
- this.selection.placeCursor(endPoint);
473
- return endPoint;
474
- }
475
- insertImage(position, imageData) {
476
- const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.wrapParagraphIndex, position);
477
- const adjustedImage = this.getImageWithAllowedSize(imageData, this.contentWidth);
478
- OperationsHelper.insertImage(this.model, insertIndex, adjustedImage);
479
- const model = this.model.images.find(x => x.insertIndex === insertIndex);
480
- this.addComponent(this.customComponents.images, model, NoderImageComponent);
481
- const endPoint = this.document.insertText(position, CUSTOM_ELEMENT_MARKER);
482
- this.updateWrapData(position.row, position.row);
483
- this.selection.placeCursor(endPoint);
484
- return endPoint;
485
- }
486
- insertLink(position, linkData) {
487
- const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.wrapParagraphIndex, position);
488
- const linkStyle = new TextStyleModel({ headingStyleId: HYPERLINK_HEADING_STYLE_ID, underline: true });
489
- OperationsHelper.insertLink(this.model, linkData.text, linkData.link, insertIndex, linkStyle);
490
- const endPoint = this.document.insertText(position, linkData.text);
491
- this.updateWrapData(position.row, position.row);
492
- this.selection.placeCursor(endPoint);
493
- return endPoint;
494
- }
495
- insertTable(position, tableModel) {
496
- const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.wrapParagraphIndex, position);
497
- OperationsHelper.insertTable(this.model, insertIndex, tableModel, this.pagesWrap.contentWidth);
498
- const model = this.model.tables.find(x => x.insertIndex === tableModel.insertTableIndex);
499
- this.addComponent(this.customComponents.tables, model, NoderTableComponent);
500
- const endPoint = this.document.insertText(position, tableModel.content);
501
- this.updateInternalDataOnInsertText(position.row, endPoint.row);
502
- this.selection.placeCursor(endPoint);
503
- return endPoint;
504
- }
505
- addComponent(customElements, model, componentType) {
506
- const customElement = this.customContentService.componentService.generateComponent(componentType, {
507
- content: model,
508
- sessionId: this.sessionId,
509
- properties: this.properties,
510
- contentWidth: this.contentWidth
511
- });
512
- const newElementPosition = customElements.findIndex(x => x.instance.insertIndex > model.insertIndex);
513
- if (newElementPosition >= 0) {
514
- customElements.splice(newElementPosition, 0, customElement);
515
- }
516
- else {
517
- customElements.push(customElement);
518
- }
519
- }
520
- setStyle(style) {
521
- for (const key of Object.keys(style)) {
522
- this._stylesMap[key] = style[key];
523
- }
524
- this.signal('setStyles', this._stylesMap);
525
- }
526
- setNumberingStyle(startIndex, endIndex) {
527
- const styles = {
528
- alignment: [this._stylesMap.alignment],
529
- backgroundColor: [this._stylesMap.backgroundColor],
530
- highlightColor: [this._stylesMap.highlightColor],
531
- fontColor: [this._stylesMap.fontColor],
532
- fontFamily: [this._stylesMap.fontFamily],
533
- fontSize: [this._stylesMap.fontSize],
534
- italic: [this._stylesMap.italic],
535
- bold: [this._stylesMap.bold],
536
- strikethrough: [this._stylesMap.strikethrough],
537
- underline: [this._stylesMap.underline],
538
- spaceBefore: [this._stylesMap.spaceBefore],
539
- spaceAfter: [this._stylesMap.spaceAfter],
540
- indentLeft: [this._stylesMap.indentLeft],
541
- indentRight: [this._stylesMap.indentRight],
542
- isBulletMarker: [],
543
- numberingLevelsStyles: []
544
- };
545
- this.updateNumberingStyles(styles, startIndex, endIndex);
546
- this.styles = styles;
547
- }
548
- restore(model) {
549
- const paragraphPosition = ContentHelper.documentIndexToParagraphIndex(this.wrapParagraphIndex, model.startIndex);
550
- if (model.startIndex !== model.endIndex) {
551
- this.removeByDocumentIndexes(model.startIndex, model.endIndex);
552
- }
553
- OperationsHelper.restore(this.model, model);
554
- const restoreEndIndex = model.startIndex + model.text.length;
555
- this.restoreComponents(this.model.tables, this.customComponents.tables, NoderTableComponent, model.startIndex, restoreEndIndex);
556
- this.restoreComponents(this.model.images, this.customComponents.images, NoderImageComponent, model.startIndex, restoreEndIndex);
557
- this.restoreComponents(this.model.tabs, this.customComponents.tabs, NoderTabComponent, model.startIndex, restoreEndIndex);
558
- this.restoreElementComponents(this.model.elements, model.startIndex, restoreEndIndex);
559
- const endPoint = this.document.insertText(paragraphPosition, model.text);
560
- this.updateInternalDataOnInsertText(paragraphPosition.row, endPoint.row);
561
- this.selection.placeCursor(endPoint);
562
- this.processSelectionStyles();
563
- }
564
- restoreComponents(models, components, componentType, restoreIndex, restoreEndIndex) {
565
- for (const model of models) {
566
- if (model.insertIndex < restoreIndex) {
567
- continue;
568
- }
569
- else if (model.insertIndex >= restoreEndIndex) {
570
- break;
571
- }
572
- this.addComponent(components, model, componentType);
573
- }
574
- }
575
- restoreElementComponents(elements, restoreIndex, restoreEndIndex) {
576
- for (const model of elements) {
577
- if (model.insertIndex < restoreIndex) {
578
- continue;
579
- }
580
- else if (model.insertIndex >= restoreEndIndex) {
581
- break;
582
- }
583
- const type = this.customContentService.findComponentType(model.type);
584
- this.addComponent(this.customComponents.customElements, model, type);
585
- }
586
- }
587
- processSelectionStyles() {
588
- const { startIndex, endIndex } = this.getRangeIndexes(this.selection.range);
589
- const styles = {
590
- alignment: [],
591
- backgroundColor: [],
592
- highlightColor: [],
593
- fontColor: [],
594
- fontFamily: [],
595
- fontSize: [],
596
- italic: [],
597
- bold: [],
598
- strikethrough: [],
599
- underline: [],
600
- spaceBefore: [],
601
- spaceAfter: [],
602
- indentLeft: [],
603
- indentRight: [],
604
- isBulletMarker: [],
605
- numberingLevelsStyles: []
606
- };
607
- this.updateParagraphStyles(styles, startIndex, endIndex);
608
- this.updateNumberingStyles(styles, startIndex, endIndex);
609
- const format = this.updateTextStyles(styles, startIndex, endIndex);
610
- this.styles = styles;
611
- if (format) {
612
- const newTextStyle = Object.assign({}, format.textStyle, this.cursorStyle);
613
- this.cursorStyle = new TextStyleModel(newTextStyle);
614
- this.setStyle(this.cursorStyle);
615
- }
616
- else {
617
- this.clearCursorStyle();
618
- }
619
- }
620
- getLinkModel(cursor) {
621
- const { startIndex, endIndex } = this.getRangeIndexes(new Range(cursor, cursor));
622
- return this.model.links.find(x => x.insertIndex <= startIndex + 1 && x.endIndex > endIndex);
623
- }
624
- insertTableRows(insertIndex, rowsCount, targetIndex, inheritIndex) {
625
- OperationsHelper.insertTableRows(this.model, insertIndex, rowsCount, targetIndex, inheritIndex);
626
- const tableComponent = this.customComponents.tables.find(x => x.instance.insertIndex === insertIndex);
627
- tableComponent.instance.updateTable();
628
- }
629
- insertTableColumns(insertIndex, columnsCount, targetIndex, inheritIndex) {
630
- OperationsHelper.insertTableColumns(this.model, insertIndex, columnsCount, targetIndex, inheritIndex, this.pagesWrap.contentWidth);
631
- const tableComponent = this.customComponents.tables.find(x => x.instance.insertIndex === insertIndex);
632
- tableComponent.instance.updateTable();
633
- }
634
- removeTableRows(insertIndex, startIndex, endIndex) {
635
- OperationsHelper.removeTableRows(this.model, insertIndex, startIndex, endIndex);
636
- const tableComponent = this.customComponents.tables.find(x => x.instance.insertIndex === insertIndex);
637
- tableComponent.instance.updateTable();
638
- }
639
- removeTableColumns(insertIndex, startIndex, endIndex) {
640
- OperationsHelper.removeTableColumns(this.model, insertIndex, startIndex, endIndex, this.pagesWrap.contentWidth);
641
- const tableComponent = this.customComponents.tables.find(x => x.instance.insertIndex === insertIndex);
642
- tableComponent.instance.updateTable();
643
- }
644
- resizeTableColumns(resizeTableColumns) {
645
- OperationsHelper.resizeTableColumns(this.model, resizeTableColumns);
646
- const tableComponent = this.customComponents.tables.find(x => x.instance.insertIndex === resizeTableColumns.insertIndex);
647
- tableComponent.instance.updateTable();
648
- }
649
- restoreTable(insertIndex, table) {
650
- const oldTable = JSON.parse(JSON.stringify(table));
651
- OperationsHelper.restoreTable(this.model, insertIndex, oldTable);
652
- const tableComponent = this.customComponents.tables.find(x => x.instance.insertIndex === insertIndex);
653
- tableComponent.instance.updateTable();
654
- }
655
- updateParagraphTabs(tabIndex, paragraphIndex, length) {
656
- const paragraphLastIndex = this.wrapParagraphIndex[paragraphIndex] + length;
657
- if (tabIndex === -1 ||
658
- tabIndex >= this.customComponents.tabs.length ||
659
- this.customComponents.tabs[tabIndex].instance.insertIndex > paragraphLastIndex) {
660
- return tabIndex;
661
- }
662
- const startIndex = tabIndex;
663
- while (this.customComponents.tabs[tabIndex] && this.customComponents.tabs[tabIndex].instance.insertIndex <= paragraphLastIndex) {
664
- this.customComponents.tabs[tabIndex].instance.width = this.pagesWrap.tabTokens[tabIndex - startIndex].width;
665
- this.customComponents.tabs[tabIndex].instance.height = this.pagesWrap.tabTokens[tabIndex - startIndex].font;
666
- tabIndex++;
667
- }
668
- return tabIndex;
669
- }
670
- getRangeIndexes(range) {
671
- let startIndex = ContentHelper.paragraphPositionToDocumentIndex(this.wrapParagraphIndex, range.start);
672
- let endIndex = ContentHelper.paragraphPositionToDocumentIndex(this.wrapParagraphIndex, range.end);
673
- const prevNewLineSymbol = this.document.isNewLineSymbol(endIndex - 1);
674
- if (!prevNewLineSymbol) {
675
- if (endIndex > startIndex) {
676
- endIndex--;
677
- }
678
- else if (startIndex === endIndex && startIndex > 0) {
679
- startIndex--;
680
- endIndex--;
681
- }
682
- }
683
- return { startIndex, endIndex };
684
- }
685
- updateInternalDataOnInsertText(startRow, endRow) {
686
- const length = endRow - startRow;
687
- const newParagraphs = Array(length);
688
- const newWrapData = Array(length);
689
- for (let i = 0; i < length; i++) {
690
- newWrapData[i] = [];
691
- }
692
- this.wrapData.splice(startRow, 0, ...newWrapData);
693
- this.pagesWrap.paragraphs.splice(startRow, 0, ...newParagraphs);
694
- if (length) {
695
- this.updateNumberingsDataOnChange(endRow);
696
- }
697
- this.updateWrapData(startRow, endRow);
698
- }
699
- updateInternalDataOnDeleteText(startRow, endRow) {
700
- const length = endRow - startRow;
701
- this.wrapData.splice(startRow, length);
702
- this.pagesWrap.remove(startRow, length);
703
- if (length) {
704
- this.updateNumberingsDataOnChange(startRow);
705
- }
706
- this.updateWrapData(startRow, startRow);
707
- }
708
- updateNumberingsDataOnChange(index) {
709
- for (let i = index; i < this.pagesWrap.paragraphs.length; i++) {
710
- if (this.model.paragraphs[i].paragraphStyle.numberingId !== null) {
711
- this.pagesWrap.paragraphs[i].numberingData = NumberingHelper.createDataModel(this.properties.numberings, this.model.paragraphs, i);
712
- const paragraphFormat = FormatStyleHelper.getFormatAtIndex(this.model.formats, this.model.paragraphs[i].insertIndex);
713
- NumberingHelper.updateMarkerData(this.properties, this.pagesWrap.paragraphs[i], paragraphFormat.textStyle, this.model.paragraphs[i].paragraphStyle);
714
- }
715
- }
716
- }
717
- /**
718
- * Computes wrap index based on max row width
719
- */
720
- computeWrapIndex(displayTokens) {
721
- if (!displayTokens[0]) {
722
- return 0;
723
- }
724
- if (displayTokens[0].isTable || (displayTokens[0].breaksLine && displayTokens.length === 1)) {
725
- return 1;
726
- }
727
- const indent = displayTokens[0].indentLeft +
728
- displayTokens[0].indentRight +
729
- displayTokens[0].indentFirstLine -
730
- displayTokens[0].indentHanging || 0;
731
- const maxRowWidth = (this.pagesWrap.contentWidth || this.contentWidth) - indent;
732
- let sum = 0;
733
- for (let i = 0; i < displayTokens.length; i++) {
734
- if (displayTokens[i].isTab) {
735
- displayTokens[i].width = TabHelper.calculateTabWidth(sum, this.properties.defaultTabWidth);
736
- }
737
- sum += displayTokens[i].width;
738
- if ((i > 0 && (sum >= maxRowWidth || displayTokens[i - 1].breaksLine)) || displayTokens[i].isTable) {
739
- return i;
740
- }
741
- if (displayTokens[i].isLineBreak || (i === displayTokens.length - 1 && displayTokens[i].isPageBreak)) {
742
- return i + 1;
743
- }
744
- }
745
- return 0;
746
- }
747
- computeWrapSplit(tokens, wrapLimit) {
748
- if (!tokens.length || tokens.length <= wrapLimit) {
749
- return null;
750
- }
751
- // If there is a space or tab at this split position, then making
752
- // a split is simple.
753
- if (wrapLimit === 0 ||
754
- tokens[wrapLimit].displayValue === DisplayValue.customContent ||
755
- (this.isWhiteSpace(tokens[wrapLimit - 1]) && this.isWhiteSpace(tokens[wrapLimit]))) {
756
- return wrapLimit;
757
- }
758
- return this.calculateSplit(wrapLimit, tokens);
759
- }
760
- getSplits(model, line, startIndex, customComponents, paragraphIndex, isNextLineExists) {
761
- const strTokens = this.getDisplayTokens(model, line, startIndex, customComponents);
762
- if (!strTokens.length) {
763
- const defaultRowInfo = new LineInfoModel({
764
- height: (this.stylesMap.fontSize * 4) / 3,
765
- width: 0,
766
- align: DEFAULT_PARAGRAPH_STYLE.alignment,
767
- indent: new IndentModel(DEFAULT_PARAGRAPH_STYLE.indentFirstLine, DEFAULT_PARAGRAPH_STYLE.indentHanging, DEFAULT_PARAGRAPH_STYLE.indentLeft, DEFAULT_PARAGRAPH_STYLE.indentRight),
768
- offsetAfter: DEFAULT_PARAGRAPH_STYLE.spaceAfter,
769
- offsetBefore: DEFAULT_PARAGRAPH_STYLE.spaceBefore,
770
- lineSpacing: DEFAULT_PARAGRAPH_STYLE.lineSpacing,
771
- isAfterPageBreak: false,
772
- isEndedByPageBreak: false,
773
- backgroundColor: DEFAULT_PARAGRAPH_STYLE.backgroundColor
774
- });
775
- return { splits: [], rowInfos: [defaultRowInfo] };
776
- }
777
- const splits = [];
778
- const rowInfos = [];
779
- let prevToken;
780
- let index = -1;
781
- let initial = line;
782
- while (index) {
783
- initial = initial.slice(index > 0 ? index : 0);
784
- const tokens = strTokens.slice(line.length - initial.length);
785
- if (!tokens.length) {
786
- tokens.push(...this.getEmptyLineTokens(startIndex + index));
787
- }
788
- let wrapLimit = this.computeWrapIndex(tokens);
789
- if (tokens[tokens.length - 1].isPageBreak && wrapLimit === tokens.length && isNextLineExists) {
790
- wrapLimit = 0;
791
- }
792
- const wrapSplit = tokens[wrapLimit - 1]?.breaksLine || tokens[wrapLimit - 1]?.isTable ? wrapLimit : this.computeWrapSplit(tokens, wrapLimit);
793
- const wrapTokens = tokens.slice(0, wrapSplit || undefined);
794
- if (wrapTokens.length) {
795
- prevToken = wrapTokens[wrapTokens.length - 1];
796
- }
797
- const isAfterPageBreak = !rowInfos.length ? false : rowInfos[rowInfos.length - 1].isEndedByPageBreak;
798
- const lineInfo = this.getLineInfoFromToken(prevToken, wrapTokens[0], wrapTokens, isAfterPageBreak);
799
- lineInfo.backgroundColor = model.paragraphs[paragraphIndex].paragraphStyle.backgroundColor;
800
- rowInfos.push(lineInfo);
801
- if (!wrapLimit) {
802
- break;
803
- }
804
- index = wrapSplit;
805
- const splitsLength = splits.length;
806
- const splitIndex = splitsLength ? index + splits[splitsLength - 1] : index;
807
- splits.push(splitIndex);
808
- }
809
- this.pagesWrap.tabTokens.push(...strTokens.filter(x => x.isTab));
810
- ParagraphHelper.applyParagraphIndentsToLines(rowInfos, paragraphIndex, model.paragraphs);
811
- return { splits, rowInfos };
812
- }
813
- setDocument() {
814
- const pageMargin = this.document.pageMargin;
815
- this.pagesWrap = new PagesWrap(this.document.pagesSpace, pageMargin, this.document.pageWidth, this.document.pageHeight, this.customComponents);
816
- }
817
- clearCursorStyle() {
818
- this._cursorStyle = null;
819
- }
820
- getEmptyLineTokens(startIndex) {
821
- const storedFormat = FormatStyleHelper.getFormatAtIndex(this.model.formats, startIndex);
822
- if (!storedFormat) {
823
- return [];
824
- }
825
- const lineInfo = this.getLineInfoByBreakModifier(startIndex);
826
- const size = FontMetrics.measureCharSize('EMPTY_LINE', ContentStyleHelper.getFontStylesString(storedFormat.textStyle));
827
- size.width = 3;
828
- return [
829
- new DisplayToken({
830
- ...size,
831
- displayValue: DisplayValue.emptyLine,
832
- align: lineInfo.align,
833
- indentFirstLine: lineInfo.indent.firstLine,
834
- indentHanging: lineInfo.indent.hanging,
835
- indentLeft: lineInfo.indent.left,
836
- indentRight: lineInfo.indent.right,
837
- indentBefore: lineInfo.offsetBefore,
838
- indentAfter: lineInfo.offsetAfter,
839
- isPageBreak: false,
840
- isLineBreak: false,
841
- isTab: false,
842
- lineSpacing: lineInfo.lineSpacing
843
- })
844
- ];
845
- }
846
- getFilledLineTokens(startIndex, line, model, customComponents) {
847
- const lineInfo = this.getLineInfoByBreakModifier(startIndex + line.length);
848
- const tokens = [];
849
- let characters = [];
850
- let format = FormatStyleHelper.getFormatAtIndex(model.formats, startIndex);
851
- let prevFormat = null;
852
- let prevCharCode = null;
853
- let prevFontString = null;
854
- let prevChar = null;
855
- let fontString = ContentStyleHelper.getFontStylesString(format?.textStyle);
856
- let symbolChange = false;
857
- for (let i = 0; i < line.length; i++) {
858
- const char = line[i];
859
- const size = FontMetrics.measureCharSize(char, fontString);
860
- const customComponent = this.customContentService.getComponent(customComponents, char, startIndex);
861
- const breakType = BreakHelper.getBreakType(model, char, startIndex);
862
- if (customComponent && !breakType) {
863
- const token = this.customContentService.getTokenFromComponent(customComponent, lineInfo, DisplayValue.customContent, i === 0, size);
864
- tokens.push(token);
865
- prevCharCode = -1;
866
- prevChar = '';
867
- characters = [];
868
- }
869
- else {
870
- const charCode = char.charCodeAt(0);
871
- const displayValue = this.getDisplayValue(charCode);
872
- const isFirstCharacter = i === 0;
873
- const token = new DisplayToken({
874
- ...size,
875
- displayValue,
876
- align: lineInfo.align,
877
- indentFirstLine: isFirstCharacter ? lineInfo.indent.firstLine : DEFAULT_PARAGRAPH_STYLE.indentFirstLine,
878
- indentHanging: isFirstCharacter ? lineInfo.indent.hanging : DEFAULT_PARAGRAPH_STYLE.indentHanging,
879
- indentLeft: lineInfo.indent.left,
880
- indentRight: lineInfo.indent.right,
881
- indentBefore: lineInfo.offsetBefore,
882
- indentAfter: lineInfo.offsetAfter,
883
- lineSpacing: lineInfo.lineSpacing,
884
- isPageBreak: breakType === BreakTypes.Page,
885
- isLineBreak: breakType === BreakTypes.TextWrapping,
886
- isTab: false
887
- });
888
- tokens.push(token);
889
- if (charCode !== prevCharCode ||
890
- !prevFormat ||
891
- !FormatStyleHelper.areSameTextStyles(format?.textStyle, prevFormat?.textStyle)) {
892
- symbolChange = true;
893
- }
894
- else if (i === line.length - 1) {
895
- characters.push(token);
896
- symbolChange = true;
897
- }
898
- else {
899
- characters.push(token);
900
- }
901
- if (characters.length > 1 && symbolChange) {
902
- this.processCharSizes(prevChar, prevFontString, characters);
903
- characters = [token];
904
- symbolChange = false;
905
- }
906
- else if (symbolChange) {
907
- characters = [token];
908
- }
909
- prevCharCode = charCode;
910
- prevChar = char;
911
- }
912
- prevFormat = format;
913
- prevFontString = fontString;
914
- startIndex++;
915
- if (startIndex > format?.endIndex) {
916
- format = FormatStyleHelper.getFormatAtIndex(model.formats, startIndex);
917
- fontString = ContentStyleHelper.getFontStylesString(format?.textStyle);
918
- }
919
- }
920
- return tokens;
921
- }
922
- processCharSizes(prevChar, prevFontString, characters) {
923
- const newSize = FontMetrics.measureCharSize(prevChar, prevFontString);
924
- for (let item of characters) {
925
- Object.assign(item, newSize);
926
- }
927
- }
928
- calculateSplit(index, tokens) {
929
- for (let i = index; i >= 0; i--) {
930
- if (this.isWhiteSpace(tokens[i]) || tokens[i].displayValue === DisplayValue.customContent) {
931
- return i + 1;
932
- }
933
- }
934
- return index;
935
- }
936
- isWhiteSpace(token) {
937
- return [DisplayValue.space, DisplayValue.emptyLine].includes(token.displayValue);
938
- }
939
- getLineInfoFromToken(prevToken, firstWrapToken, wrapTokens, isAfterPageBreak) {
940
- const info = new LineInfoModel({
941
- width: 0,
942
- height: 0,
943
- align: prevToken.align,
944
- indent: new IndentModel(prevToken.indentFirstLine, prevToken.indentHanging, prevToken.indentLeft, prevToken.indentRight),
945
- offsetBefore: prevToken.indentBefore,
946
- offsetAfter: prevToken.indentAfter,
947
- lineSpacing: prevToken.lineSpacing,
948
- isAfterPageBreak,
949
- isEndedByPageBreak: prevToken.isPageBreak
950
- });
951
- if (firstWrapToken) {
952
- info.align = firstWrapToken.align;
953
- info.indent.firstLine = firstWrapToken.indentFirstLine;
954
- info.indent.hanging = firstWrapToken.indentHanging;
955
- info.indent.left = firstWrapToken.indentLeft;
956
- info.indent.right = firstWrapToken.indentRight;
957
- info.offsetBefore = firstWrapToken.indentBefore;
958
- info.offsetAfter = firstWrapToken.indentAfter;
959
- info.lineSpacing = firstWrapToken.lineSpacing;
960
- info.hasTable = firstWrapToken.isTable;
961
- }
962
- let fontSize = 0;
963
- let ascent = 0;
964
- let descent = 0;
965
- const tokens = isAfterPageBreak && !wrapTokens.length ? [prevToken] : wrapTokens;
966
- for (const wrapToken of tokens) {
967
- if (info.height < wrapToken.height) {
968
- info.height = wrapToken.height;
969
- }
970
- if (fontSize < wrapToken.font && wrapToken.displayValue !== DisplayValue.customContent) {
971
- fontSize = wrapToken.font;
972
- ascent = wrapToken.ascent;
973
- descent = wrapToken.descent;
974
- }
975
- info.width += wrapToken.width;
976
- }
977
- info.height = info.height || 18;
978
- if (info.lineSpacing > 1) {
979
- info.offsetAfter = (ascent + descent) * (info.lineSpacing - 1);
980
- }
981
- else if (ascent + descent === info.height) {
982
- info.height = info.height * info.lineSpacing;
983
- }
984
- return info;
985
- }
986
- getDisplayValue(charCode) {
987
- if (charCode === 32) {
988
- return DisplayValue.space;
989
- }
990
- if ((charCode > 39 && charCode < 48) || (charCode > 57 && charCode < 64)) {
991
- return DisplayValue.punctuation;
992
- }
993
- return DisplayValue.char;
994
- }
995
- getLineInfoByBreakModifier(index) {
996
- const paragraph = ParagraphStyleHelper.getParagraphAtIndex(this.model.paragraphs, index);
997
- if (!paragraph) {
998
- return new LineInfoModel({
999
- align: DEFAULT_PARAGRAPH_STYLE.alignment,
1000
- indent: new IndentModel(DEFAULT_PARAGRAPH_STYLE.indentFirstLine, DEFAULT_PARAGRAPH_STYLE.indentHanging, DEFAULT_PARAGRAPH_STYLE.indentLeft, DEFAULT_PARAGRAPH_STYLE.indentRight),
1001
- offsetBefore: DEFAULT_PARAGRAPH_STYLE.spaceBefore,
1002
- offsetAfter: DEFAULT_PARAGRAPH_STYLE.spaceAfter,
1003
- lineSpacing: DEFAULT_PARAGRAPH_STYLE.lineSpacing
1004
- });
1005
- }
1006
- const indentLeft = this.getParagraphIndentLeft(paragraph);
1007
- const indentHanging = paragraph.paragraphStyle.numberingId === null ? paragraph.paragraphStyle.indentHanging : 0;
1008
- return new LineInfoModel({
1009
- align: paragraph.paragraphStyle.alignment ?? DEFAULT_PARAGRAPH_STYLE.alignment,
1010
- indent: new IndentModel(paragraph.paragraphStyle.indentFirstLine ?? DEFAULT_PARAGRAPH_STYLE.indentFirstLine, indentHanging ?? DEFAULT_PARAGRAPH_STYLE.indentHanging, indentLeft ?? DEFAULT_PARAGRAPH_STYLE.indentLeft, paragraph.paragraphStyle.indentRight ?? DEFAULT_PARAGRAPH_STYLE.indentRight),
1011
- offsetBefore: DEFAULT_PARAGRAPH_STYLE.spaceBefore,
1012
- offsetAfter: DEFAULT_PARAGRAPH_STYLE.spaceAfter,
1013
- lineSpacing: paragraph.paragraphStyle.lineSpacing ?? DEFAULT_PARAGRAPH_STYLE.lineSpacing
1014
- });
1015
- }
1016
- getParagraphIndentLeft(paragraph) {
1017
- let paragraphIndent = paragraph.paragraphStyle.indentLeft;
1018
- const numberingId = paragraph.paragraphStyle.numberingId;
1019
- if (numberingId !== null) {
1020
- const level = paragraph.paragraphStyle.numberingLevel;
1021
- const paragraphIndex = this.model.paragraphs.indexOf(paragraph);
1022
- const levelModel = NumberingHelper.find(this.properties.numberings, numberingId, level);
1023
- const paragraphFormat = FormatStyleHelper.getFormatAtIndex(this.model.formats, paragraph.insertIndex);
1024
- const markerTextStyle = FormatStyleHelper.combineTextStyles(levelModel.markerStyle, paragraphFormat.textStyle);
1025
- let markerWidth = this.pagesWrap.paragraphs[paragraphIndex]?.numberingData?.width;
1026
- if (!this.pagesWrap.paragraphs[paragraphIndex]?.numberingData.markerTextStyle ||
1027
- !FormatStyleHelper.areSameTextStyles(markerTextStyle, this.pagesWrap.paragraphs[paragraphIndex].numberingData.markerTextStyle) ||
1028
- this.pagesWrap.paragraphs[paragraphIndex].numberingData.numberingId !== numberingId) {
1029
- const marker = NumberingHelper.getMarker(levelModel, numberingId, this.model.paragraphs, paragraphIndex);
1030
- const markerSizes = NumberingHelper.getMarkerSizes(marker, markerTextStyle);
1031
- markerWidth = markerSizes.width;
1032
- }
1033
- const hangingIndent = paragraph.paragraphStyle.indentHanging
1034
- ? paragraph.paragraphStyle.indentHanging
1035
- : levelModel.indentHanging;
1036
- paragraphIndent = levelModel.indentLeft;
1037
- if (markerWidth >= hangingIndent) {
1038
- const markerOverflow = markerWidth - hangingIndent;
1039
- const additionalMarkerIndent = TabHelper.calculateTabWidth(levelModel.indentLeft + markerOverflow, this.properties.defaultTabWidth);
1040
- paragraphIndent += markerOverflow + additionalMarkerIndent;
1041
- }
1042
- }
1043
- return paragraphIndent;
1044
- }
1045
- updateTextStyles(styles, startIndex, endIndex) {
1046
- let textStyles = FormatStyleHelper.getFormatsAtRange(this.model.formats, startIndex, endIndex).map(format => format.textStyle);
1047
- let prevFormat;
1048
- if (!textStyles.length) {
1049
- prevFormat = FormatStyleHelper.getPrevFormatAtIndex(this.model.formats, startIndex);
1050
- if (prevFormat) {
1051
- textStyles = [prevFormat.textStyle];
1052
- }
1053
- }
1054
- for (const textStyle of textStyles) {
1055
- for (const key of Object.keys(textStyle)) {
1056
- if (styles[key]) {
1057
- styles[key].push(textStyle[key]);
1058
- }
1059
- }
1060
- }
1061
- return prevFormat;
1062
- }
1063
- updateParagraphStyles(styles, startIndex, endIndex) {
1064
- const paragraphStyles = ParagraphStyleHelper.getParagraphsAtRange(this.model.paragraphs, startIndex, endIndex).map(paragraph => paragraph.paragraphStyle);
1065
- for (const paragraphStyle of paragraphStyles) {
1066
- for (const key of Object.keys(paragraphStyle)) {
1067
- if (styles[key]) {
1068
- styles[key].push(paragraphStyle[key]);
1069
- }
1070
- }
1071
- }
1072
- }
1073
- updateNumberingStyles(styles, startIndex, endIndex) {
1074
- const paragraphStyles = ParagraphStyleHelper.getParagraphsAtRange(this.model.paragraphs, startIndex, endIndex).map(paragraph => paragraph.paragraphStyle);
1075
- for (const paragraphStyle of paragraphStyles) {
1076
- if (paragraphStyle.numberingId !== null) {
1077
- const numberingLevels = this.properties.numberings.find(x => x.numberingId === paragraphStyle.numberingId).levels;
1078
- const levelsMarkerStyles = numberingLevels.reduce((prev, next) => `${prev}${next.marker}${next.markerType}`, '');
1079
- const level = numberingLevels.find(x => x.level === paragraphStyle.numberingLevel);
1080
- const isBulletMarker = level.markerType === NumberingMarkerType.Bullet;
1081
- styles['isBulletMarker'].push(isBulletMarker);
1082
- styles['numberingLevelsStyles'].push(levelsMarkerStyles);
1083
- }
1084
- else {
1085
- styles['isBulletMarker'].push(null);
1086
- styles['numberingLevelsStyles'].push('');
1087
- }
1088
- }
1089
- }
1090
- getImageWithAllowedSize(imageData, maxWidth) {
1091
- if (imageData.width <= maxWidth) {
1092
- return imageData;
1093
- }
1094
- const aspectRatio = imageData.width / imageData.height;
1095
- const height = maxWidth / aspectRatio;
1096
- return new ImageDataModel({ width: Math.round(maxWidth), height: Math.round(height), content: imageData.content });
1097
- }
1098
- }
1099
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdC5zZXNzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW5vZGVyL3NyYy9saWIvK3NoYXJlZC9lZGl0b3IvY29yZS9lZGl0LnNlc3Npb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBSXpELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTFELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9FQUFvRSxDQUFDO0FBQzNHLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDZEQUE2RCxDQUFDO0FBR3BHLE9BQU8sRUFDSCx3QkFBd0IsRUFDeEIsa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsdUJBQXVCLEVBQ3ZCLDBCQUEwQixFQUMxQixlQUFlLEVBQ2xCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzVELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUdoRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDdkUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUU1RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUdsRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNENBQTRD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SSxTQUFTLENBQUMsS0FBSyxJQUFJLFFBQVEsRUFBRTtZQUM3QixPQUFPLFNBQVMsQ0FBQztTQUNwQjtRQUVELE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztRQUN2RCxNQUFNLE1BQU0sR0FBRyxRQUFRLEdBQUcsV0FBVyxDQUFDO1FBQ3RDLE9BQU8sSUFBSSxjQUFjLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDdkgsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50UmVmLCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEFsaWdubWVudCB9IGZyb20gJy4vY29uc3RhbnRzL2FsaWdubWVudHMuY29uc3QnO1xuaW1wb3J0IHsgQXBwbHlFbGVtZW50U3R5bGVNb2RlbCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvYXBwbHktZWxlbWVudC1zdHlsZS5tb2RlbCc7XG5pbXBvcnQgeyBBcHBseUltYWdlU3R5bGVNb2RlbCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvYXBwbHktaW1hZ2Utc3R5bGUubW9kZWwnO1xuaW1wb3J0IHsgQmFzZU5vZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vY3VzdG9tLWNvbXBvbmVudHMvc2hhcmVkL2Fic3RyYWN0L2Jhc2UuY29tcG9uZW50JztcbmltcG9ydCB7IEJyZWFrSGVscGVyIH0gZnJvbSAnLi4vaGVscGVycy9icmVhay5oZWxwZXInO1xuaW1wb3J0IHsgQnJlYWtUeXBlcyB9IGZyb20gJy4vZW51bXMvYnJlYWstdHlwZXMuZW51bSc7XG5pbXBvcnQgeyBDb250ZW50SGVscGVyIH0gZnJvbSAnLi4vaGVscGVycy9jb250ZW50LmhlbHBlcic7XG5pbXBvcnQgeyBDb250ZW50c0ludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvY29udGVudHMuaW50ZXJmYWNlJztcbmltcG9ydCB7IENvbnRlbnRTdHlsZUhlbHBlciB9IGZyb20gJy4vaGVscGVycy9jb250ZW50LXN0eWxlLmhlbHBlcic7XG5pbXBvcnQgeyBDVVNUT01fRUxFTUVOVF9NQVJLRVIgfSBmcm9tICcuLi9jdXN0b20tY29tcG9uZW50cy9zaGFyZWQvY29uc3RhbnRzL2N1c3RvbS1jb250ZW50LW1hcmtlcnMuY29uc3QnO1xuaW1wb3J0IHsgQ3VzdG9tQ29tcG9uZW50SGVscGVyIH0gZnJvbSAnLi4vY3VzdG9tLWNvbXBvbmVudHMvc2hhcmVkL2hlbHBlcnMvY3VzdG9tLWNvbXBvbmVudC5oZXBsZXInO1xuaW1wb3J0IHsgQ3VzdG9tQ29udGVudCB9IGZyb20gJy4uL2N1c3RvbS1jb21wb25lbnRzL3NoYXJlZC90eXBlcy9jdXN0b20tY29udGVudCc7XG5pbXBvcnQgeyBDdXN0b21Db250ZW50U2VydmljZSB9IGZyb20gJy4uL2N1c3RvbS1jb21wb25lbnRzL3NoYXJlZC9zZXJ2aWNlcy9jdXN0b20tY29udGVudC9jdXN0b20tY29udGVudC5zZXJ2aWNlJztcbmltcG9ydCB7XG4gICAgREVGQVVMVF9CQUNLR1JPVU5EX0NPTE9SLFxuICAgIERFRkFVTFRfRk9OVF9DT0xPUixcbiAgICBERUZBVUxUX0ZPTlRfRkFNSUxZLFxuICAgIERFRkFVTFRfRk9OVF9TSVpFLFxuICAgIERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLFxuICAgIEhZUEVSTElOS19IRUFESU5HX1NUWUxFX0lELFxuICAgIE5FV19MSU5FX01BUktVUFxufSBmcm9tICcuL2NvbnN0YW50cy9lZGl0b3IuY29uc3QnO1xuaW1wb3J0IHsgRGlzcGxheVRva2VuIH0gZnJvbSAnLi9tb2RlbHMvZGlzcGxheS10b2tlbi5tb2RlbCc7XG5pbXBvcnQgeyBEaXNwbGF5VmFsdWUgfSBmcm9tICcuL2NvbnN0YW50cy9kaXNwbGF5LXZhbHVlcy5jb25zdCc7XG5pbXBvcnQgeyBEb2N1bWVudCB9IGZyb20gJy4vZG9jdW1lbnQnO1xuaW1wb3J0IHsgRWxlbWVudERhdGFNb2RlbCB9IGZyb20gJy4uL2N1c3RvbS1jb21wb25lbnRzL2V4dGVybmFsLWVsZW1lbnQvbW9kZWxzL2VsZW1lbnQtZGF0YS5tb2RlbCc7XG5pbXBvcnQgeyBFbGVtZW50TW9kZWwgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2VsZW1lbnQubW9kZWwnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGluZyB9IGZyb20gJy4vYmFzZS9ldmVudC1lbWl0dGluZyc7XG5pbXBvcnQgeyBGb250TWV0cmljcyB9IGZyb20gJy4vaGVscGVycy9mb250LW1ldHJpY3MuaGVscGVyJztcbmltcG9ydCB7IEZvcm1hdE1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9mb3JtYXQubW9kZWwnO1xuaW1wb3J0IHsgRm9ybWF0U3R5bGVIZWxwZXIgfSBmcm9tICcuL2hlbHBlcnMvZm9ybWF0LXN0eWxlLmhlbHBlcic7XG5pbXBvcnQgeyBHZW5lcmFsUHJvcGVydGllc01vZGVsIH0gZnJvbSAnLi4vZXhlY3V0aW9uL21vZGVscy9nZW5lcmFsLXByb3BlcnRpZXMubW9kZWwnO1xuaW1wb3J0IHsgSUN1c3RvbUNvbXBvbmVudHMgfSBmcm9tICcuLi9jdXN0b20tY29tcG9uZW50cy9zaGFyZWQvaW50ZXJmYWNlcy9jdXN0b20tY29tcG9uZW50cy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSW1hZ2VEYXRhTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2ltYWdlLWRhdGEubW9kZWwnO1xuaW1wb3J0IHsgSW5kZW50TW9kZWwgfSBmcm9tICcuL21vZGVscy9pbmRlbnQubW9kZWwnO1xuaW1wb3J0IHsgSW5zZXJ0QnJlYWtNb2RlbCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvaW5zZXJ0LWJyZWFrLm1vZGVsJztcbmltcG9ydCB7IEluc2VydEVsZW1lbnRNb2RlbCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvaW5zZXJ0LWVsZW1lbnQubW9kZWwnO1xuaW1wb3J0IHsgSW5zZXJ0SW1hZ2VNb2RlbCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvaW5zZXJ0LWltYWdlLm1vZGVsJztcbmltcG9ydCB7IEluc2VydFRhYmxlTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2luc2VydC10YWJsZS5tb2RlbCc7XG5pbXBvcnQgeyBJbnNlcnRUYWJNb2RlbCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvaW5zZXJ0LXRhYi5tb2RlbCc7XG5pbXBvcnQgeyBJVG9vbGJhclN0eWxlcyB9IGZyb20gJy4vaW50ZXJmYWNlcy90b29sYmFyLXN0eWxlcy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTGluZUluZm9Nb2RlbCB9IGZyb20gJy4vbW9kZWxzL2xpbmUtaW5mby5tb2RlbCc7XG5pbXBvcnQgeyBMaW5rRGF0YU1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9saW5rLWRhdGEubW9kZWwnO1xuaW1wb3J0IHsgTGlua01vZGVsIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9saW5rLm1vZGVsJztcbmltcG9ydCB7IE5vZGVySW1hZ2VDb21wb25lbnQgfSBmcm9tICcuLi9jdXN0b20tY29tcG9uZW50cy9pbWFnZS9jb21wb25lbnRzL2ltYWdlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOb2RlclRhYkNvbXBvbmVudCB9IGZyb20gJy4uL2N1c3RvbS1jb21wb25lbnRzL3RhYi90YWIuY29tcG9uZW50JztcbmltcG9ydCB7IE5vZGVyVGFibGVDb21wb25lbnQgfSBmcm9tICcuLi9jdXN0b20tY29tcG9uZW50cy90YWJsZS9jb21wb25lbnRzL3RhYmxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOdW1iZXJpbmdIZWxwZXIgfSBmcm9tICcuL2hlbHBlcnMvbnVtYmVyaW5nLmhlbHBlcic7XG5pbXBvcnQgeyBOdW1iZXJpbmdMZXZlbE1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9udW1iZXJpbmctbGV2ZWwubW9kZWwnO1xuaW1wb3J0IHsgTnVtYmVyaW5nTWFya2VyVHlwZSB9IGZyb20gJy4vZW51bXMvbnVtYmVyaW5nLW1hcmtlci10eXBlLmVudW0nO1xuaW1wb3J0IHsgTnVtYmVyaW5nTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL251bWJlcmluZy5tb2RlbCc7XG5pbXBvcnQgeyBPcGVyYXRpb25zSGVscGVyIH0gZnJvbSAnLi4vb3BlcmF0aW9ucy9oZWxwZXJzL29wZXJhdGlvbnMtaGVscGVyLmhlbHBlcic7XG5pbXBvcnQgeyBQYWdlc1dyYXAgfSBmcm9tICcuL3BhZ2luZy9wYWdlcy53cmFwJztcbmltcG9ydCB7IFBhcmFncmFwaCB9IGZyb20gJy4vcGFnaW5nL3BhcmFncmFwaCc7XG5pbXBvcnQgeyBQYXJhZ3JhcGhIZWxwZXIgfSBmcm9tICcuL2hlbHBlcnMvcGFyYWdyYXBoLmhlbHBlcic7XG5pbXBvcnQgeyBQYXJhZ3JhcGhNb2RlbCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvcGFyYWdyYXBoLm1vZGVsJztcbmltcG9ydCB7IFBhcmFncmFwaFN0eWxlSGVscGVyIH0gZnJvbSAnLi9oZWxwZXJzL3BhcmFncmFwaC1zdHlsZS5oZWxwZXInO1xuaW1wb3J0IHsgUGFyYWdyYXBoU3R5bGVNb2RlbCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvcGFyYWdyYXBoLXN0eWxlLm1vZGVsJztcbmltcG9ydCB7IFBvaW50IH0gZnJvbSAnLi9wb2ludCc7XG5pbXBvcnQgeyBSYW5nZSB9IGZyb20gJy4vcmFuZ2UnO1xuaW1wb3J0IHsgUmVwbGFjZU1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9yZXBsYWNlLm1vZGVsJztcbmltcG9ydCB7IFJlc2l6ZVRhYmxlQ29sdW1uc01vZGVsIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9yZXNpemUtdGFibGUtY29sdW1ucy5tb2RlbCc7XG5pbXBvcnQgeyBSZXN0b3JlTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL3Jlc3RvcmUubW9kZWwnO1xuaW1wb3J0IHsgU2VsZWN0aW9uIH0gZnJvbSAnLi4vcG9zaXRpb25pbmcvc2VsZWN0aW9uJztcbmltcG9ydCB7IFRhYkhlbHBlciB9IGZyb20gJy4uL2hlbHBlcnMvdGFiLmhlbHBlcic7XG5pbXBvcnQgeyBUYWJsZU1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC90YWJsZS5tb2RlbCc7XG5pbXBvcnQgeyBUZXh0U3R5bGVNb2RlbCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvdGV4dC1zdHlsZS5tb2RlbCc7XG5pbXBvcnQgeyBVbmljb2RlSGVscGVyIH0gZnJvbSAnLi9oZWxwZXJzL3VuaWNvZGUuaGVscGVyJztcblxuZXhwb3J0IGNsYXNzIEVkaXRTZXNzaW9uIGV4dGVuZHMgRXZlbnRFbWl0dGluZyB7XG4gICAgcmVhZG9ubHkgY3VzdG9tQ29tcG9uZW50czogSUN1c3RvbUNvbXBvbmVudHM7XG5cbiAgICB0b2tlblJlID0gbmV3IFJlZ0V4cCgnXlsnICsgVW5pY29kZUhlbHBlci53b3JkQ2hhcnMgKyAnXFxcXCRfXSsnLCAnZycpO1xuXG4gICAgbm9uVG9rZW5SZSA9IG5ldyBSZWdFeHAoJ14oPzpbXicgKyBVbmljb2RlSGVscGVyLndvcmRDaGFycyArICdcXFxcJF9dfFxcXFxzXSkrJywgJ2cnKTtcblxuICAgIHBhZ2VzV3JhcDogUGFnZXNXcmFwO1xuXG4gICAgd3JhcERhdGE6IG51bWJlcltdW10gPSBbW11dOyAvLyBXcmFwIGluZGV4ZXMgZm9yIGRvY3VtZW50IHJvd3NcblxuICAgIHdyYXBQYXJhZ3JhcGhMaW5lOiBudW1iZXJbXSA9IFtdOyAvLyBsaW5lIG51bWJlcnMgdGhhdCBiZWdpbiB0aGUgcGFyYWdyYXBoc1xuXG4gICAgd3JhcFBhcmFncmFwaEluZGV4OiBudW1iZXJbXSA9IFtdOyAvLyBzeW1ib2wgaW5kZXhlcyB0aGF0IGJlZ2luIHRoZSBwYXJhZ3JhcGhzXG5cbiAgICBzY3JvbGxUb3AgPSAwO1xuXG4gICAgc2V0IHN0eWxlcyhzdHlsZXM6IHsgW2tleTogc3RyaW5nXTogYW55W10gfSkge1xuICAgICAgICBmb3IgKGxldCBrZXkgb2YgT2JqZWN0LmtleXMoc3R5bGVzKSkge1xuICAgICAgICAgICAgaWYgKHN0eWxlc1trZXldLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0eWxlc01hcFtrZXldID0gQ29udGVudFN0eWxlSGVscGVyLmdldERlZmF1bHRTdHlsZVZhbHVlQnlLZXkoa2V5KTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3R5bGVzW2tleV0ubGVuZ3RoID4gMSAmJiAhc3R5bGVzW2tleV0uZXZlcnkoeCA9PiB4ID09PSBzdHlsZXNba2V5XVswXSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdHlsZXNNYXBba2V5XSA9IHR5cGVvZiBzdHlsZXNba2V5XVswXSA9PT0gJ2Jvb2xlYW4nICYmIGtleSAhPT0gJ2lzQnVsbGV0TWFya2VyJyA/IGZhbHNlIDogbnVsbDtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fc3R5bGVzTWFwW2tleV0gPSBzdHlsZXNba2V5XVswXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2lnbmFsKCdzZXRTdHlsZXMnLCB0aGlzLl9zdHlsZXNNYXApO1xuICAgIH1cblxuICAgIGdldCBzdHlsZXNNYXAoKTogSVRvb2xiYXJTdHlsZXMge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3R5bGVzTWFwO1xuICAgIH1cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9zdHlsZXNNYXA6IElUb29sYmFyU3R5bGVzID0ge1xuICAgICAgICBmb250RmFtaWx5OiBERUZBVUxUX0ZPTlRfRkFNSUxZLFxuICAgICAgICBmb250U2l6ZTogREVGQVVMVF9GT05UX1NJWkUsXG4gICAgICAgIGZvbnRDb2xvcjogREVGQVVMVF9GT05UX0NPTE9SLFxuICAgICAgICBhbGlnbm1lbnQ6IEFsaWdubWVudC5sZWZ0LFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IERFRkFVTFRfQkFDS0dST1VORF9DT0xPUixcbiAgICAgICAgaGlnaGxpZ2h0Q29sb3I6IERFRkFVTFRfQkFDS0dST1VORF9DT0xPUlxuICAgIH07XG5cbiAgICBzZXQgY29udGVudFdpZHRoKHZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY29udGVudFdpZHRoID0gdmFsdWU7XG4gICAgICAgIHRoaXMudXBkYXRlV3JhcERhdGEoMCwgdGhpcy5kb2N1bWVudC5saW5lcy5sZW5ndGggLSAxKTtcbiAgICB9XG4gICAgZ2V0IGNvbnRlbnRXaWR0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudFdpZHRoO1xuICAgIH1cbiAgICBwcml2YXRlIF9jb250ZW50V2lkdGg6IG51bWJlcjtcblxuICAgIHNldCBjdXJzb3JTdHlsZShtb2RlbDogVGV4dFN0eWxlTW9kZWwpIHtcbiAgICAgICAgaWYgKCFtb2RlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl9jdXJzb3JTdHlsZSkge1xuICAgICAgICAgICAgdGhpcy5fY3Vyc29yU3R5bGUgPSBtb2RlbDtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnY3Vyc29yU3R5bGVzQ2hhbmdlZCcsIHRoaXMuX2N1cnNvclN0eWxlKTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2hhbmdlcyA9IENvbnRlbnRTdHlsZUhlbHBlci5nZXRUZXh0U3R5bGVDaGFuZ2VzKHRoaXMuX2N1cnNvclN0eWxlLCBtb2RlbCk7XG4gICAgICAgIGlmICghY2hhbmdlcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgQ29udGVudFN0eWxlSGVscGVyLmFwcGx5VGV4dFN0eWxlQ2hhbmdlcyh0aGlzLl9jdXJzb3JTdHlsZSwgbW9kZWwsIGNoYW5nZXMpO1xuICAgICAgICB0aGlzLmVtaXQoJ2N1cnNvclN0eWxlc0NoYW5nZWQnLCB0aGlzLl9jdXJzb3JTdHlsZSk7XG4gICAgfVxuICAgIGdldCBjdXJzb3JTdHlsZSgpOiBUZXh0U3R5bGVNb2RlbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jdXJzb3JTdHlsZTtcbiAgICB9XG4gICAgcHJpdmF0ZSBfY3Vyc29yU3R5bGU6IFRleHRTdHlsZU1vZGVsO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBkb2N1bWVudDogRG9jdW1lbnQsXG4gICAgICAgIHB1YmxpYyBzZXNzaW9uSWQ6IG51bWJlcixcbiAgICAgICAgcHVibGljIGN1c3RvbUNvbnRlbnRTZXJ2aWNlOiBDdXN0b21Db250ZW50U2VydmljZSxcbiAgICAgICAgcHVibGljIG1vZGVsOiBDb250ZW50c0ludGVyZmFjZSxcbiAgICAgICAgcHVibGljIHNlbGVjdGlvbjogU2VsZWN0aW9uLFxuICAgICAgICBwdWJsaWMgcHJvcGVydGllczogR2VuZXJhbFByb3BlcnRpZXNNb2RlbFxuICAgICkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmN1c3RvbUNvbXBvbmVudHMgPSB0aGlzLmN1c3RvbUNvbnRlbnRTZXJ2aWNlLmdlbmVyYXRlQ29tcG9uZW50cyh0aGlzLm1vZGVsLCB0aGlzLnNlc3Npb25JZCwgdGhpcy5wcm9wZXJ0aWVzLCB0aGlzLmRvY3VtZW50KTtcbiAgICAgICAgdGhpcy5zZXREb2N1bWVudCgpO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGFnZXNXcmFwLmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICBzZXRTY3JvbGxUb3AodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zY3JvbGxUb3AgPT09IHZhbHVlIHx8IGlzTmFOKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zY3JvbGxUb3AgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5zaWduYWwoJ2NoYW5nZVNjcm9sbFRvcCcsIHZhbHVlKTtcbiAgICB9XG5cbiAgICBnZXRSb3dMZW5ndGgocm93OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBpZiAoIXRoaXMud3JhcERhdGFbcm93XSkge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy53cmFwRGF0YVtyb3ddLmxlbmd0aCArIDE7XG4gICAgfVxuXG4gICAgdXBkYXRlV3JhcFBhcmFncmFwaEluZGV4KGZpcnN0OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY291bnQgPSB0aGlzLmRvY3VtZW50LmxpbmVzLmxlbmd0aDtcbiAgICAgICAgaWYgKGZpcnN0ID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLndyYXBQYXJhZ3JhcGhJbmRleFtmaXJzdF0gPSAwO1xuICAgICAgICAgICAgZmlyc3QrKztcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gZmlyc3Q7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLndyYXBQYXJhZ3JhcGhJbmRleFtpXSA9IHRoaXMud3JhcFBhcmFncmFwaEluZGV4W2kgLSAxXSArIHRoaXMuZG9jdW1lbnQubGluZXNbaSAtIDFdLmxlbmd0aCArIDE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy53cmFwUGFyYWdyYXBoSW5kZXguc3BsaWNlKGNvdW50KTtcbiAgICB9XG5cbiAgICB1cGRhdGVXcmFwUGFyYWdyYXBoTGluZShmaXJzdDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gdGhpcy5kb2N1bWVudC5saW5lcy5sZW5ndGg7XG4gICAgICAgIGlmIChmaXJzdCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy53cmFwUGFyYWdyYXBoTGluZVtmaXJzdF0gPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy53cmFwUGFyYWdyYXBoTGluZVtmaXJzdF0gPSB0aGlzLndyYXBQYXJhZ3JhcGhMaW5lW2ZpcnN0IC0gMV0gKyB0aGlzLndyYXBEYXRhW2ZpcnN0IC0gMV0ubGVuZ3RoICsgMTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gZmlyc3QgKyAxOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICAgICAgdGhpcy53cmFwUGFyYWdyYXBoTGluZVtpXSA9IHRoaXMud3JhcFBhcmFncmFwaExpbmVbaSAtIDFdICsgdGhpcy53cmFwRGF0YVtpIC0gMV0ubGVuZ3RoICsgMTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndyYXBQYXJhZ3JhcGhMaW5lLnNwbGljZShjb3VudCk7XG4gICAgfVxuXG4gICAgdXBkYXRlUGFyYWdyYXBoTnVtYmVyaW5nRGF0YShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnBhZ2VzV3JhcC5wYXJhZ3JhcGhzW2luZGV4XS5udW1iZXJpbmdEYXRhLm51bWJlcmluZ0lkICE9PSB0aGlzLm1vZGVsLnBhcmFncmFwaHNbaW5kZXhdLnBhcmFncmFwaFN0eWxlLm51bWJlcmluZ0lkKSB7XG4gICAgICAgICAgICB0aGlzLnBhZ2VzV3JhcC5wYXJhZ3JhcGhzW2luZGV4XS5udW1iZXJpbmdEYXRhID0gTnVtYmVyaW5nSGVscGVyLmNyZWF0ZURhdGFNb2RlbChcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BlcnRpZXMubnVtYmVyaW5ncyxcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnBhcmFncmFwaHMsXG4gICAgICAgICAgICAgICAgaW5kZXhcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wYWdlc1dyYXAucGFyYWdyYXBoc1tpbmRleF0ubnVtYmVyaW5nRGF0YS5udW1iZXJpbmdJZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgcGFyYWdyYXBoRm9ybWF0ID0gRm9ybWF0U3R5bGVIZWxwZXIuZ2V0Rm9ybWF0QXRJbmRleCh0aGlzLm1vZGVsLmZvcm1hdHMsIHRoaXMubW9kZWwucGFyYWdyYXBoc1tpbmRleF0uaW5zZXJ0SW5kZXgpO1xuICAgICAgICAgICAgTnVtYmVyaW5nSGVscGVyLnVwZGF0ZU1hcmtlckRhdGEoXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgIHRoaXMucGFnZXNXcmFwLnBhcmFncmFwaHNbaW5kZXhdLFxuICAgICAgICAgICAgICAgIHBhcmFncmFwaEZvcm1hdC50ZXh0U3R5bGUsXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5wYXJhZ3JhcGhzW2luZGV4XS5wYXJhZ3JhcGhTdHlsZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZVdyYXBEYXRhKGZpcnN0UGFyYWdyYXBoOiBudW1iZXIsIGxhc3RQYXJhZ3JhcGg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnVwZGF0ZVdyYXBQYXJhZ3JhcGhJbmRleChmaXJzdFBhcmFncmFwaCk7XG4gICAgICAgIGxldCBpbmRleE9mUGFyYWdyYXBoQWZ0ZXJQYWdlQnJlYWsgPSB0aGlzLnBhZ2VzV3JhcC5wYXJhZ3JhcGhzW2ZpcnN0UGFyYWdyYXBoIC0gMV0/LmlzRW5kZWRCeVBhZ2VCcmVhayA/IGZpcnN0UGFyYWdyYXBoIDogLTE7XG4gICAgICAgIGxldCBmaXJzdFVzZWRUYWJJbmRleCA9IHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJzLmZpbmRJbmRleChcbiAgICAgICAgICAgIHggPT4geC5pbnN0YW5jZS5pbnNlcnRJbmRleCA+PSB0aGlzLndyYXBQYXJhZ3JhcGhJbmRleFtmaXJzdFBhcmFncmFwaF1cbiAgICAgICAgKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGZpcnN0UGFyYWdyYXBoOyBpIDw9IGxhc3RQYXJhZ3JhcGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5wYWdlc1dyYXAudGFiVG9rZW5zID0gW107XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50TGluZSA9IHRoaXMuZG9jdW1lbnQuZ2V0TGluZSh0aGlzLmRvY3VtZW50LmxpbmVzLCBpKTtcbiAgICAgICAgICAgIGNvbnN0IGlzTmV4dExpbmVFeGlzdHMgPSB0aGlzLmRvY3VtZW50LmxpbmVzLmxlbmd0aCA+IGkgKyAxO1xuICAgICAgICAgICAgY29uc3QgeyBzcGxpdHMsIHJvd0luZm9zIH0gPSB0aGlzLmdldFNwbGl0cyhcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRMaW5lLFxuICAgICAgICAgICAgICAgIHRoaXMud3JhcFBhcmFncmFwaEluZGV4W2ldLFxuICAgICAgICAgICAgICAgIHRoaXMuY3VzdG9tQ29tcG9uZW50cyxcbiAgICAgICAgICAgICAgICBpLFxuICAgICAgICAgICAgICAgIGlzTmV4dExpbmVFeGlzdHNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLndyYXBEYXRhW2ldID0gc3BsaXRzO1xuICAgICAgICAgICAgaWYgKGluZGV4T2ZQYXJhZ3JhcGhBZnRlclBhZ2VCcmVhayA9PT0gaSkge1xuICAgICAgICAgICAgICAgIHJvd0luZm9zWzBdLmlzQWZ0ZXJQYWdlQnJlYWsgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5kZXhPZlBhcmFncmFwaEFmdGVyUGFnZUJyZWFrID0gcm93SW5mb3Nbcm93SW5mb3MubGVuZ3RoIC0gMV0uaXNFbmRlZEJ5UGFnZUJyZWFrID8gaSArIDEgOiAtMTtcbiAgICAgICAgICAgIHRoaXMucGFnZXNXcmFwLnNldChpLCByb3dJbmZvcywgdGhpcy5wcm9wZXJ0aWVzLm51bWJlcmluZ3MsIHRoaXMubW9kZWwucGFyYWdyYXBocyk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVBhcmFncmFwaE51bWJlcmluZ0RhdGEoaSk7XG4gICAgICAgICAgICBmaXJzdFVzZWRUYWJJbmRleCA9IHRoaXMudXBkYXRlUGFyYWdyYXBoVGFicyhmaXJzdFVzZWRUYWJJbmRleCwgaSwgY3VycmVudExpbmUubGVuZ3RoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGFnZXNXcmFwLnBhcmFncmFwaHNbbGFzdFBhcmFncmFwaCArIDFdPy5zZXRJc0FmdGVyUGFnZUJyZWFrKGluZGV4T2ZQYXJhZ3JhcGhBZnRlclBhZ2VCcmVhayA+IC0xKTtcbiAgICAgICAgY29uc3QgY291bnQgPSB0aGlzLmRvY3VtZW50LmxpbmVzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5wYWdlc1dyYXAucGFyYWdyYXBocy5zcGxpY2UoY291bnQpO1xuICAgICAgICB0aGlzLndyYXBEYXRhLnNwbGljZShjb3VudCk7XG4gICAgICAgIHRoaXMudXBkYXRlV3JhcFBhcmFncmFwaExpbmUoZmlyc3RQYXJhZ3JhcGgpO1xuICAgICAgICB0aGlzLnBhZ2VzV3JhcC5wcm9jZXNzUGFyYWdyYXBoc1Byb3BlcnRpZXMoZmlyc3RQYXJhZ3JhcGgsIHRoaXMud3JhcFBhcmFncmFwaEluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIHN0cmluZywgcmV0dXJucyBhbiBhcnJheSBvZiB0aGUgZGlzcGxheSBjaGFyYWN0ZXJzLCBpbmNsdWRpbmcgdGFicyBhbmQgc3BhY2VzLlxuICAgICAqL1xuICAgIGdldERpc3BsYXlUb2tlbnMobW9kZWw6IENvbnRlbnRzSW50ZXJmYWNlLCBzdHI6IHN0cmluZywgc3RhcnRJbmRleDogbnVtYmVyLCBjdXN0b21Db21wb25lbnRzOiBJQ3VzdG9tQ29tcG9uZW50cyk6IERpc3BsYXlUb2tlbltdIHtcbiAgICAgICAgaWYgKCFzdHIubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRFbXB0eUxpbmVUb2tlbnMoc3RhcnRJbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5nZXRGaWxsZWRMaW5lVG9rZW5zKHN0YXJ0SW5kZXgsIHN0ciwgbW9kZWwsIGN1c3RvbUNvbXBvbmVudHMpO1xuICAgIH1cblxuICAgIGdldFJvd0NhY2hlSW5kZXgoY2FjaGVBcnJheTogbnVtYmVyW10sIHZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBsZXQgc3RhcnQgPSAwO1xuICAgICAgICBsZXQgZW5kID0gY2FjaGVBcnJheS5sZW5ndGggLSAxO1xuICAgICAgICB3aGlsZSAoc3RhcnQgPD0gZW5kKSB7XG4gICAgICAgICAgICBjb25zdCBtaWQgPSAoc3RhcnQgKyBlbmQpID4+IDE7XG4gICAgICAgICAgICBjb25zdCBjZW50ZXIgPSBjYWNoZUFycmF5W21pZF07XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZSA+IGNlbnRlcikge1xuICAgICAgICAgICAgICAgIHN0YXJ0ID0gbWlkICsgMTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPCBjZW50ZXIpIHtcbiAgICAgICAgICAgICAgICBlbmQgPSBtaWQgLSAxO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWlkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN0YXJ0IC0gMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSB3aWR0aCBvZiB0aGUgc3RyaW5nIGBzdHJgIG9uIHRoZSBzY3JlZW4gd2hpbGUgYXNzdW1pbmcgdGhhdCB0aGUgc3RyaW5nIHN0YXJ0cyBhdCB0aGUgZmlyc3QgY29sdW1uIG9uIHRoZSBzY3JlZW4uXG4gICAgICogVGhlIGZpcnN0IHBvc2l0aW9uIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgZm9yIGBzdHJgIG9uIHNjcmVlbi5cbiAgICAgKiBUaGUgc2Vjb25kIHZhbHVlIGNvbnRhaW5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgZG9jdW1lbnQgY29sdW1uIHRoYXQgdGhpcyBmdW5jdGlvbiByZWFkIHVudGlsLlxuICAgICAqL1xuICAgIGdldFN0cmluZ1NjcmVlbldpZHRoKHN0cjogc3RyaW5nLCBtYXhTY3JlZW5Db2x1bW4/OiBudW1iZXIpOiBudW1iZXJbXSB7XG4gICAgICAgIGxldCBzY3JlZW5Db2x1bW4gPSAwO1xuICAgICAgICBsZXQgY29sdW1uOiBudW1iZXI7XG4gICAgICAgIGZvciAoY29sdW1uID0gMDsgY29sdW1uIDwgc3RyLmxlbmd0aDsgY29sdW1uKyspIHtcbiAgICAgICAgICAgIHNjcmVlbkNvbHVtbiArPSAxO1xuXG4gICAgICAgICAgICBpZiAoc2NyZWVuQ29sdW1uID4gbWF4U2NyZWVuQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW3NjcmVlbkNvbHVtbiwgY29sdW1uXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIHN0YXJ0aW5nIHJvdyBhbmQgY29sdW1uLCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBgUmFuZ2VgIG9mIHRoZSBmaXJzdCB3b3JkIGJvdW5kYXJ5IGl0IGZpbmRzLlxuICAgICAqL1xuICAgIGdldFdvcmRSYW5nZShyb3c6IG51bWJlciwgY29sdW1uOiBudW1iZXIpOiBSYW5nZSB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSB0aGlzLmRvY3VtZW50LmdldExpbmUodGhpcy5kb2N1bWVudC5saW5lcywgcm93KTtcbiAgICAgICAgbGV0IGluVG9rZW4gPSBmYWxzZTtcbiAgICAgICAgaWYgKGNvbHVtbiA+IDApIHtcbiAgICAgICAgICAgIGluVG9rZW4gPSAhIWxpbmUuY2hhckF0KGNvbHVtbiAtIDEpLm1hdGNoKHRoaXMudG9rZW5SZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWluVG9rZW4pIHtcbiAgICAgICAgICAgIGluVG9rZW4gPSAhIWxpbmUuY2hhckF0KGNvbHVtbikubWF0Y2godGhpcy50b2tlblJlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZWdleHA6IFJlZ0V4cDtcbiAgICAgICAgaWYgKGluVG9rZW4pIHtcbiAgICAgICAgICAgIHJlZ2V4cCA9IHRoaXMudG9rZW5SZTtcbiAgICAgICAgfSBlbHNlIGlmICgvXlxccyskLy50ZXN0KGxpbmUuc2xpY2UoY29sdW1uIC0gMSwgY29sdW1uICsgMSkpKSB7XG4gICAgICAgICAgICByZWdleHAgPSAvXFxzLztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlZ2V4cCA9IHRoaXMubm9uVG9rZW5SZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzdGFydCA9IGNvbHVtbjtcbiAgICAgICAgaWYgKHN0YXJ0ID4gMCkge1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIHN0YXJ0LS07XG4gICAgICAgICAgICB9IHdoaWxlIChzdGFydCA+PSAwICYmIGxpbmUuY2hhckF0KHN0YXJ0KS5tYXRjaChyZWdleHApKTtcblxuICAgICAgICAgICAgc3RhcnQrKztcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBlbmQgPSBjb2x1bW47XG4gICAgICAgIHdoaWxlIChlbmQgPCBsaW5lLmxlbmd0aCAmJiBsaW5lLmNoYXJBdChlbmQpLm1hdGNoKHJlZ2V4cCkpIHtcbiAgICAgICAgICAgIGVuZCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBSYW5nZShuZXcgUG9pbnQocm93LCBzdGFydCksIG5ldyBQb2ludChyb3csIGVuZCkpO1xuICAgIH1cblxuICAgIGdldERpc3BsYXlMaW5lKHJvdzogbnVtYmVyLCBlbmRDb2x1bW46IG51bWJlciwgc3RhcnRDb2x1bW4/OiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBsaW5lID0gdGhpcy5kb2N1bWVudC5nZXRMaW5lKHRoaXMuZG9jdW1lbnQubGluZXMsIHJvdyk7XG5cbiAgICAgICAgcmV0dXJuIGxpbmUuc3Vic3RyaW5nKHN0YXJ0Q29sdW1uIHx8IDAsIGVuZENvbHVtbiB8fCBsaW5lLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlQnlEb2N1bWVudEluZGV4ZXMoc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0UGFyYWdyYXBoUG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBzdGFydEluZGV4KTtcbiAgICAgICAgY29uc3QgZW5kUGFyYWdyYXBoUG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgIHRoaXMucmVtb3ZlKG5ldyBSYW5nZShzdGFydFBhcmFncmFwaFBvc2l0aW9uLCBlbmRQYXJhZ3JhcGhQb3NpdGlvbikpO1xuICAgIH1cblxuICAgIGluc2VydFRleHRCeURvY3VtZW50SW5kZXgoaW5kZXg6IG51bWJlciwgdGV4dDogc3RyaW5nLCBzdHlsZT86IFRleHRTdHlsZU1vZGVsKTogUG9pbnQge1xuICAgICAgICBjb25zdCBwYXJhZ3JhcGhQb3NpdGlvbiA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIGluZGV4KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0VGV4dChwYXJhZ3JhcGhQb3NpdGlvbiwgdGV4dCwgc3R5bGUpO1xuICAgIH1cblxuICAgIGluc2VydEVsZW1lbnRCeURvY3VtZW50SW5kZXgoaW5zZXJ0RWxlbWVudDogSW5zZXJ0RWxlbWVudE1vZGVsKTogUG9pbnQge1xuICAgICAgICBjb25zdCBlbGVtZW50UG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBpbnNlcnRFbGVtZW50LmVsZW1lbnQuaW5zZXJ0SW5kZXgpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnNlcnRFbGVtZW50KGVsZW1lbnRQb3NpdGlvbiwgaW5zZXJ0RWxlbWVudC5lbGVtZW50KTtcbiAgICB9XG5cbiAgICBpbnNlcnRCcmVha0J5RG9jdW1lbnRJbmRleChpbnNlcnRFbGVtZW50OiBJbnNlcnRCcmVha01vZGVsKTogUG9pbnQge1xuICAgICAgICBjb25zdCBlbGVtZW50UG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBpbnNlcnRFbGVtZW50Lmluc2VydEluZGV4KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0QnJlYWsoZWxlbWVudFBvc2l0aW9uLCBpbnNlcnRFbGVtZW50LmJyZWFrVHlwZSBhcyBCcmVha1R5cGVzKTtcbiAgICB9XG5cbiAgICBpbnNlcnRUYWJCeURvY3VtZW50SW5kZXgoaW5zZXJ0RWxlbWVudDogSW5zZXJ0VGFiTW9kZWwpOiBQb2ludCB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRQb3NpdGlvbiA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIGluc2VydEVsZW1lbnQuaW5zZXJ0SW5kZXgpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnNlcnRUYWIoZWxlbWVudFBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBpbnNlcnRJbWFnZUJ5RG9jdW1lbnRJbmRleChpbnNlcnRFbGVtZW50OiBJbnNlcnRJbWFnZU1vZGVsKTogUG9pbnQge1xuICAgICAgICBjb25zdCBlbGVtZW50UG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBpbnNlcnRFbGVtZW50Lmluc2VydEluZGV4KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0SW1hZ2UoZWxlbWVudFBvc2l0aW9uLCBpbnNlcnRFbGVtZW50LmltYWdlRGF0YSk7XG4gICAgfVxuXG4gICAgaW5zZXJ0VGFibGVCeURvY3VtZW50SW5kZXgoaW5zZXJ0RWxlbWVudDogSW5zZXJ0VGFibGVNb2RlbCk6IFBvaW50IHtcbiAgICAgICAgY29uc3QgZWxlbWVudFBvc2l0aW9uID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLndyYXBQYXJhZ3JhcGhJbmRleCwgaW5zZXJ0RWxlbWVudC5pbnNlcnRJbmRleCk7XG4gICAgICAgIHJldHVybiB0aGlzLmluc2VydFRhYmxlKGVsZW1lbnRQb3NpdGlvbiwgaW5zZXJ0RWxlbWVudCk7XG4gICAgfVxuXG4gICAgYXBwbHlUZXh0U3R5bGUoc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyLCB0ZXh0U3R5bGU6IFRleHRTdHlsZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY3Vyc29yU3R5bGUgPSBuZXcgVGV4dFN0eWxlTW9kZWwodGV4dFN0eWxlKTtcbiAgICAgICAgY29uc3Qgc3RhcnRQYXJhZ3JhcGggPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBzdGFydEluZGV4KS5yb3c7XG4gICAgICAgIGNvbnN0IGVuZFBhcmFncmFwaCA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIGVuZEluZGV4KS5yb3c7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIuYXBwbHlUZXh0U3R5bGUodGhpcy5tb2RlbCwgc3RhcnRJbmRleCwgZW5kSW5kZXgsIHRleHRTdHlsZSk7XG4gICAgICAgIHRoaXMudXBkYXRlV3JhcERhdGEoc3RhcnRQYXJhZ3JhcGgsIGVuZFBhcmFncmFwaCk7XG4gICAgICAgIHRoaXMuc2V0U3R5bGUodGV4dFN0eWxlKTtcbiAgICB9XG5cbiAgICBhcHBseVBhcmFncmFwaFN0eWxlKHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlciwgcGFyYWdyYXBoU3R5bGU6IFBhcmFncmFwaFN0eWxlTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RhcnRQYXJhZ3JhcGggPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBzdGFydEluZGV4KS5yb3c7XG4gICAgICAgIGNvbnN0IGVuZFBhcmFncmFwaCA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIGVuZEluZGV4KS5yb3c7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIuYXBwbHlQYXJhZ3JhcGhTdHlsZSh0aGlzLm1vZGVsLCBzdGFydEluZGV4LCBlbmRJbmRleCwgcGFyYWdyYXBoU3R5bGUpO1xuICAgICAgICB0aGlzLnVwZGF0ZVdyYXBEYXRhKHN0YXJ0UGFyYWdyYXBoLCBlbmRQYXJhZ3JhcGgpO1xuICAgICAgICB0aGlzLnNldFN0eWxlKHBhcmFncmFwaFN0eWxlKTtcbiAgICB9XG5cbiAgICBhcHBseUVsZW1lbnRTdHlsZShtb2RlbDogQXBwbHlFbGVtZW50U3R5bGVNb2RlbCk6IHZvaWQge1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmFwcGx5RWxlbWVudFN0eWxlKHRoaXMubW9kZWwsIG1vZGVsKTtcbiAgICAgICAgY29uc3QgaW1hZ2VDb21wb25lbnRSZWYgPSB0aGlzLmN1c3RvbUNvbXBvbmVudHMuY3VzdG9tRWxlbWVudHMuZmluZCh4ID0+IHguaW5zdGFuY2UuaW5zZXJ0SW5kZXggPT09IG1vZGVsLmluc2VydEluZGV4KTtcbiAgICAgICAgaW1hZ2VDb21wb25lbnRSZWYuaW5zdGFuY2UuaW5pdGlhbGl6ZSgpO1xuICAgICAgICBjb25zdCBwYXJhZ3JhcGggPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBtb2RlbC5pbnNlcnRJbmRleCkucm93O1xuICAgICAgICB0aGlzLnVwZGF0ZVdyYXBEYXRhKHBhcmFncmFwaCwgcGFyYWdyYXBoKTtcbiAgICB9XG5cbiAgICBhZGROdW1iZXJpbmcobGV2ZWxzOiBOdW1iZXJpbmdMZXZlbE1vZGVsW10sIHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBzdGFydFBhcmFncmFwaCA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIHN0YXJ0SW5kZXgpLnJvdztcbiAgICAgICAgY29uc3QgZW5kUGFyYWdyYXBoID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLndyYXBQYXJhZ3JhcGhJbmRleCwgZW5kSW5kZXgpLnJvdztcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5hZGROdW1iZXJpbmcodGhpcy5tb2RlbCwgdGhpcy5wcm9wZXJ0aWVzLm51bWJlcmluZ3MsIHN0YXJ0SW5kZXgsIGVuZEluZGV4LCBsZXZlbHMpO1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnRQYXJhZ3JhcGg7IGkgPD0gZW5kUGFyYWdyYXBoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhZ2VzV3JhcC5wYXJhZ3JhcGhzW2ldLm51bWJlcmluZ0RhdGEubnVtYmVyaW5nSWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU51bWJlcmluZ3NEYXRhT25DaGFuZ2UoZW5kUGFyYWdyYXBoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlV3JhcERhdGEoc3RhcnRQYXJhZ3JhcGgsIGVuZFBhcmFncmFwaCk7XG4gICAgICAgIHRoaXMuc2V0TnVtYmVyaW5nU3R5bGUoc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgIH1cblxuICAgIHJlbW92ZU51bWJlcmluZ3Moc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0UGFyYWdyYXBoID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLndyYXBQYXJhZ3JhcGhJbmRleCwgc3RhcnRJbmRleCkucm93O1xuICAgICAgICBjb25zdCBlbmRQYXJhZ3JhcGggPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBlbmRJbmRleCkucm93O1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLnJlbW92ZU51bWJlcmluZ3ModGhpcy5tb2RlbCwgdGhpcy5wcm9wZXJ0aWVzLm51bWJlcmluZ3MsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0UGFyYWdyYXBoOyBpIDw9IGVuZFBhcmFncmFwaDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wYWdlc1dyYXAucGFyYWdyYXBoc1tpXS5udW1iZXJpbmdEYXRhLm51bWJlcmluZ0lkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVOdW1iZXJpbmdzRGF0YU9uQ2hhbmdlKGVuZFBhcmFncmFwaCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZVdyYXBEYXRhKHN0YXJ0UGFyYWdyYXBoLCBlbmRQYXJhZ3JhcGgpO1xuICAgICAgICB0aGlzLnNldE51bWJlcmluZ1N0eWxlKHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgICB9XG5cbiAgICByZXN0b3JlTnVtYmVyaW5ncyhwYXJhZ3JhcGhzOiBQYXJhZ3JhcGhNb2RlbFtdLCBudW1iZXJpbmdzOiBOdW1iZXJpbmdNb2RlbFtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBwYXJhZ3JhcGhzWzBdLmluc2VydEluZGV4O1xuICAgICAgICBjb25zdCBlbmRJbmRleCA9IHBhcmFncmFwaHNbcGFyYWdyYXBocy5sZW5ndGggLSAxXS5pbnNlcnRJbmRleDtcbiAgICAgICAgY29uc3Qgc3RhcnRQYXJhZ3JhcGggPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBzdGFydEluZGV4KS5yb3c7XG4gICAgICAgIGNvbnN0IGVuZFBvc2l0aW9uID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhXaXRoT2Zmc2V0KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCB0aGlzLmRvY3VtZW50LmxpbmVzLCBlbmRJbmRleCk7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIucmVzdG9yZU51bWJlcmluZ3ModGhpcy5tb2RlbCwgdGhpcy5wcm9wZXJ0aWVzLm51bWJlcmluZ3MsIHBhcmFncmFwaHMsIG51bWJlcmluZ3MpO1xuICAgICAgICBmb3IgKGNvbnN0IHBhcmFncmFwaCBvZiBwYXJhZ3JhcGhzKSB7XG4gICAgICAgICAgICBpZiAocGFyYWdyYXBoLnBhcmFncmFwaFN0eWxlLm51bWJlcmluZ0lkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVOdW1iZXJpbmdzRGF0YU9uQ2hhbmdlKGVuZFBvc2l0aW9uLnJvdyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZVdyYXBEYXRhKHN0YXJ0UGFyYWdyYXBoLCBlbmRQb3NpdGlvbi5yb3cpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihlbmRQb3NpdGlvbik7XG4gICAgICAgIHRoaXMuc2V0TnVtYmVyaW5nU3R5bGUoc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgIH1cblxuICAgIGFwcGx5SW1hZ2VTdHlsZShhcHBseUltYWdlOiBBcHBseUltYWdlU3R5bGVNb2RlbCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbWFnZUNvbXBvbmVudFJlZiA9IHRoaXMuY3VzdG9tQ29tcG9uZW50cy5pbWFnZXMuZmluZCh4ID0+IHguaW5zdGFuY2UuaW5zZXJ0SW5kZXggPT09IGFwcGx5SW1hZ2UuaW5zZXJ0SW5kZXgpO1xuICAgICAgICBpbWFnZUNvbXBvbmVudFJlZi5pbnN0YW5jZS5yZXNpemUoeyB3aWR0aDogYXBwbHlJbWFnZS53aWR0aCwgaGVpZ2h0OiBhcHBseUltYWdlLmhlaWdodCB9KTtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5hcHBseUltYWdlU3R5bGUodGhpcy5tb2RlbCwgYXBwbHlJbWFnZSk7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5kb2N1bWVudC5pbmRleFRvUG9zaXRpb24oYXBwbHlJbWFnZS5pbnNlcnRJbmRleCwgMCk7XG4gICAgICAgIHRoaXMudXBkYXRlV3JhcERhdGEoc3RhcnQucm93LCB0aGlzLmRvY3VtZW50LmxpbmVzLmxlbmd0aCAtIDEpO1xuICAgIH1cblxuICAgIHJlc3RvcmVUZXh0U3R5bGVzKGZvcm1hdHM6IEZvcm1hdE1vZGVsW10pOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IGZvcm1hdHNbMF0uc3RhcnRJbmRleDtcbiAgICAgICAgY29uc3QgZW5kSW5kZXggPSBmb3JtYXRzW2Zvcm1hdHMubGVuZ3RoIC0gMV0uZW5kSW5kZXg7XG4gICAgICAgIGNvbnN0IHN0YXJ0UGFyYWdyYXBoID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLndyYXBQYXJhZ3JhcGhJbmRleCwgc3RhcnRJbmRleCkucm93O1xuICAgICAgICBjb25zdCBlbmRQb3NpdGlvbiA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoV2l0aE9mZnNldCh0aGlzLndyYXBQYXJhZ3JhcGhJbmRleCwgdGhpcy5kb2N1bWVudC5saW5lcywgZW5kSW5kZXgpO1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLnJlc3RvcmVUZXh0U3R5bGVzKHRoaXMubW9kZWwsIGZvcm1hdHMpO1xuICAgICAgICB0aGlzLnVwZGF0ZVdyYXBEYXRhKHN0YXJ0UGFyYWdyYXBoLCBlbmRQb3NpdGlvbi5yb3cpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihlbmRQb3NpdGlvbik7XG4gICAgICAgIHRoaXMucHJvY2Vzc1NlbGVjdGlvblN0eWxlcygpO1xuICAgIH1cblxuICAgIHJlc3RvcmVQYXJhZ3JhcGhTdHlsZXMocGFyYWdyYXBoczogUGFyYWdyYXBoTW9kZWxbXSk6IHZvaWQge1xuICAgICAgICBjb25zdCBzdGFydEluZGV4ID0gcGFyYWdyYXBoc1swXS5pbnNlcnRJbmRleDtcbiAgICAgICAgY29uc3QgZW5kSW5kZXggPSBwYXJhZ3JhcGhzW3BhcmFncmFwaHMubGVuZ3RoIC0gMV0uaW5zZXJ0SW5kZXg7XG4gICAgICAgIGNvbnN0IHN0YXJ0UGFyYWdyYXBoID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLndyYXBQYXJhZ3JhcGhJbmRleCwgc3RhcnRJbmRleCkucm93O1xuICAgICAgICBjb25zdCBlbmRQb3NpdGlvbiA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoV2l0aE9mZnNldCh0aGlzLndyYXBQYXJhZ3JhcGhJbmRleCwgdGhpcy5kb2N1bWVudC5saW5lcywgZW5kSW5kZXgpO1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLnJlc3RvcmVQYXJhZ3JhcGhTdHlsZXModGhpcy5tb2RlbCwgcGFyYWdyYXBocyk7XG4gICAgICAgIHRoaXMudXBkYXRlV3JhcERhdGEoc3RhcnRQYXJhZ3JhcGgsIGVuZFBvc2l0aW9uLnJvdyk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKGVuZFBvc2l0aW9uKTtcbiAgICAgICAgdGhpcy5wcm9jZXNzU2VsZWN0aW9uU3R5bGVzKCk7XG4gICAgfVxuXG4gICAgc2V0VGV4dFN0eWxlKHRleHRTdHlsZTogVGV4dFN0eWxlTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jdXJzb3JTdHlsZSA9IG5ldyBUZXh0U3R5bGVNb2RlbCh0ZXh0U3R5bGUpO1xuICAgICAgICB0aGlzLnNldFN0eWxlKHRleHRTdHlsZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgYHJhbmdlYCBmcm9tIHRoZSBkb2N1bWVudC5cbiAgICAgKiBJZiBgcmFuZ2VgIGlzIGVtcHR5LCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHVubW9kaWZpZWQgdmFsdWUgb2YgYHJhbmdlLnN0YXJ0YC5cbiAgICAgKi9cbiAgICByZW1vdmUocmFuZ2U6IFJhbmdlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBDb250ZW50SGVscGVyLnBhcmFncmFwaFBvc2l0aW9uVG9Eb2N1bWVudEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCByYW5nZS5zdGFydCk7XG4gICAgICAgIGNvbnN0IGVuZEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhQb3NpdGlvblRvRG9jdW1lbnRJbmRleCh0aGlzLndyYXBQYXJhZ3JhcGhJbmRleCwgcmFuZ2UuZW5kKSAtIDE7XG5cbiAgICAgICAgdGhpcy5kb2N1bWVudC5yZW1vdmVSYW5nZShyYW5nZSk7XG5cbiAgICAgICAgQ3VzdG9tQ29tcG9uZW50SGVscGVyLmFwcGx5UmVtb3ZpbmdDb21wb25lbnRzKHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJsZXMsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgICAgICAgQ3VzdG9tQ29tcG9uZW50SGVscGVyLmFwcGx5UmVtb3ZpbmdDb21wb25lbnRzKHRoaXMuY3VzdG9tQ29tcG9uZW50cy5pbWFnZXMsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgICAgICAgQ3VzdG9tQ29tcG9uZW50SGVscGVyLmFwcGx5UmVtb3ZpbmdDb21wb25lbnRzKHRoaXMuY3VzdG9tQ29tcG9uZW50cy5jdXN0b21FbGVtZW50cywgc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgICAgICBDdXN0b21Db21wb25lbnRIZWxwZXIuYXBwbHlSZW1vdmluZ0NvbXBvbmVudHModGhpcy5jdXN0b21Db21wb25lbnRzLnRhYnMsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcblxuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmRlbGV0ZSh0aGlzLm1vZGVsLCBzdGFydEluZGV4LCBlbmRJbmRleCk7XG5cbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IocmFuZ2Uuc3RhcnQpO1xuICAgICAgICB0aGlzLnVwZGF0ZUludGVybmFsRGF0YU9uRGVsZXRlVGV4dChyYW5nZS5zdGFydC5yb3csIHJhbmdlLmVuZC5yb3cpO1xuXG4gICAgICAgIHRoaXMucHJvY2Vzc1NlbGVjdGlvblN0eWxlcygpO1xuICAgIH1cblxuICAgIHJlcGxhY2UobW9kZWw6IFJlcGxhY2VNb2RlbCk6IFBvaW50IHtcbiAgICAgICAgdGhpcy5yZW1vdmVCeURvY3VtZW50SW5kZXhlcyhtb2RlbC5kZWxldGUuc3RhcnRJbmRleCwgbW9kZWwuZGVsZXRlLmVuZEluZGV4ICsgMSk7XG4gICAgICAgIGxldCBlbmRQb2ludDogUG9pbnQ7XG4gICAgICAgIGlmIChtb2RlbC5pbnNlcnRUZXh0KSB7XG4gICAgICAgICAgICBlbmRQb2ludCA9IHRoaXMuaW5zZXJ0VGV4dEJ5RG9jdW1lbnRJbmRleChtb2RlbC5pbnNlcnRUZXh0Lmluc2VydEluZGV4LCBtb2RlbC5pbnNlcnRUZXh0LnRleHQpO1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGVsLmluc2VydEVsZW1lbnQpIHtcbiAgICAgICAgICAgIGVuZFBvaW50ID0gdGhpcy5pbnNlcnRFbGVtZW50QnlEb2N1bWVudEluZGV4KG1vZGVsLmluc2VydEVsZW1lbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGVsLmluc2VydEJyZWFrKSB7XG4gICAgICAgICAgICBlbmRQb2ludCA9IHRoaXMuaW5zZXJ0QnJlYWtCeURvY3VtZW50SW5kZXgobW9kZWwuaW5zZXJ0QnJlYWspO1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGVsLmluc2VydFRhYikge1xuICAgICAgICAgICAgZW5kUG9pbnQgPSB0aGlzLmluc2VydFRhYkJ5RG9jdW1lbnRJbmRleChtb2RlbC5pbnNlcnRUYWIpO1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGVsLmluc2VydEltYWdlKSB7XG4gICAgICAgICAgICBlbmRQb2ludCA9IHRoaXMuaW5zZXJ0SW1hZ2VCeURvY3VtZW50SW5kZXgobW9kZWwuaW5zZXJ0SW1hZ2UpO1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGVsLmluc2VydFRhYmxlKSB7XG4gICAgICAgICAgICBlbmRQb2ludCA9IHRoaXMuaW5zZXJ0VGFibGVCeURvY3VtZW50SW5kZXgobW9kZWwuaW5zZXJ0VGFibGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVuZFBvaW50O1xuICAgIH1cblxuICAgIGluc2VydFRleHQocG9zaXRpb246IFBvaW50LCB0ZXh0OiBzdHJpbmcsIGN1cnNvclN0eWxlPzogVGV4dFN0eWxlTW9kZWwpOiBQb2ludCB7XG4gICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhQb3NpdGlvblRvRG9jdW1lbnRJbmRleCh0aGlzLndyYXBQYXJhZ3JhcGhJbmRleCwgcG9zaXRpb24pO1xuICAgICAgICBpZiAoY3Vyc29yU3R5bGUpIHtcbiAgICAgICAgICAgIE9wZXJhdGlvbnNIZWxwZXIuaW5zZXJ0U3R5bGVkVGV4dCh0aGlzLm1vZGVsLCB0ZXh0LCBpbnNlcnRJbmRleCwgY3Vyc29yU3R5bGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5pbnNlcnRUZXh0KHRoaXMubW9kZWwsIHRleHQsIGluc2VydEluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVuZFBvaW50ID0gdGhpcy5kb2N1bWVudC5pbnNlcnRUZXh0KHBvc2l0aW9uLCB0ZXh0KTtcbiAgICAgICAgdGhpcy51cGRhdGVJbnRlcm5hbERhdGFPbkluc2VydFRleHQocG9zaXRpb24ucm93LCBlbmRQb2ludC5yb3cpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihlbmRQb2ludCk7XG4gICAgICAgIHJldHVybiBlbmRQb2ludDtcbiAgICB9XG5cbiAgICBpbnNlcnRFbGVtZW50KHBvc2l0aW9uOiBQb2ludCwgZWxlbWVudDogRWxlbWVudERhdGFNb2RlbCk6IFBvaW50IHtcbiAgICAgICAgY29uc3QgaW5zZXJ0SW5kZXggPSBDb250ZW50SGVscGVyLnBhcmFncmFwaFBvc2l0aW9uVG9Eb2N1bWVudEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBwb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IGluc2VydEVsZW1lbnQgPSBuZXcgSW5zZXJ0RWxlbWVudE1vZGVsKHsgZWxlbWVudDogbmV3IEVsZW1lbnRNb2RlbCh7IGluc2VydEluZGV4LCAuLi5lbGVtZW50IH0pIH0pO1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmluc2VydEVsZW1lbnQodGhpcy5tb2RlbCwgaW5zZXJ0RWxlbWVudCk7XG5cbiAgICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLm1vZGVsLmVsZW1lbnRzLmZpbmQoeCA9PiB4Lmluc2VydEluZGV4ID09PSBpbnNlcnRJbmRleCk7XG4gICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLmN1c3RvbUNvbnRlbnRTZXJ2aWNlLmZpbmRDb21wb25lbnRUeXBlKG1vZGVsLnR5cGUpO1xuICAgICAgICB0aGlzLmFkZENvbXBvbmVudCh0aGlzLmN1c3RvbUNvbXBvbmVudHMuY3VzdG9tRWxlbWVudHMsIG1vZGVsLCB0eXBlKTtcblxuICAgICAgICBjb25zdCBlbmRQb2ludCA9IHRoaXMuZG9jdW1lbnQuaW5zZXJ0VGV4dChwb3NpdGlvbiwgQ1VTVE9NX0VMRU1FTlRfTUFSS0VSKTtcbiAgICAgICAgdGhpcy51cGRhdGVXcmFwRGF0YShwb3NpdGlvbi5yb3csIGVuZFBvaW50LnJvdyk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKGVuZFBvaW50KTtcbiAgICAgICAgcmV0dXJuIGVuZFBvaW50O1xuICAgIH1cblxuICAgIGluc2VydEJyZWFrKHBvc2l0aW9uOiBQb2ludCwgYnJlYWtUeXBlOiBCcmVha1R5cGVzKTogUG9pbnQge1xuICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoUG9zaXRpb25Ub0RvY3VtZW50SW5kZXgodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIHBvc2l0aW9uKTtcbiAgICAgICAgY29uc3QgaXNPbk5ld1BhcmFncmFwaCA9XG4gICAgICAgICAgICBicmVha1R5cGUgPT09IEJyZWFrVHlwZXMuUGFnZSAmJlxuICAgICAgICAgICAgQnJlYWtIZWxwZXIuZ2V0QnJlYWtUeXBlKHRoaXMubW9kZWwsIENVU1RPTV9FTEVNRU5UX01BUktFUiwgaW5zZXJ0SW5kZXggLSAxKSAhPT0gQnJlYWtUeXBlcy5QYWdlO1xuICAgICAgICBjb25zdCB0ZXh0ID0gaXNPbk5ld1BhcmFncmFwaCA/IGAke05FV19MSU5FX01BUktVUH0ke0NVU1RPTV9FTEVNRU5UX01BUktFUn1gIDogQ1VTVE9NX0VMRU1FTlRfTUFSS0VSO1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmluc2VydEJyZWFrKHRoaXMubW9kZWwsIHRleHQsIGluc2VydEluZGV4LCBicmVha1R5cGUpO1xuXG4gICAgICAgIGNvbnN0IGVuZFBvaW50ID0gdGhpcy5kb2N1bWVudC5pbnNlcnRUZXh0KHBvc2l0aW9uLCB0ZXh0KTtcbiAgICAgICAgaWYgKGlzT25OZXdQYXJhZ3JhcGgpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlSW50ZXJuYWxEYXRhT25JbnNlcnRUZXh0KHBvc2l0aW9uLnJvdywgZW5kUG9pbnQucm93KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZVdyYXBEYXRhKHBvc2l0aW9uLnJvdywgZW5kUG9pbnQucm93KTtcbiAgICAgICAgY29uc3QgcG9pbnQgPSB0aGlzLmRvY3VtZW50LmdldFBvc2l0aW9uQWZ0ZXJCcmVhayhlbmRQb2ludCwgYnJlYWtUeXBlKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IocG9pbnQpO1xuXG4gICAgICAgIHJldHVybiBlbmRQb2ludDtcbiAgICB9XG5cbiAgICBpbnNlcnRUYWIocG9zaXRpb246IFBvaW50KTogUG9pbnQge1xuICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoUG9zaXRpb25Ub0RvY3VtZW50SW5kZXgodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIHBvc2l0aW9uKTtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5pbnNlcnRUYWIodGhpcy5tb2RlbCwgaW5zZXJ0SW5kZXgpO1xuXG4gICAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5tb2RlbC50YWJzLmZpbmQoeCA9PiB4Lmluc2VydEluZGV4ID09PSBpbnNlcnRJbmRleCk7XG4gICAgICAgIHRoaXMuYWRkQ29tcG9uZW50KHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJzLCBtb2RlbCwgTm9kZXJUYWJDb21wb25lbnQpO1xuXG4gICAgICAgIGNvbnN0IGVuZFBvaW50ID0gdGhpcy5kb2N1bWVudC5pbnNlcnRUZXh0KHBvc2l0aW9uLCBDVVNUT01fRUxFTUVOVF9NQVJLRVIpO1xuICAgICAgICB0aGlzLnVwZGF0ZVdyYXBEYXRhKHBvc2l0aW9uLnJvdywgcG9zaXRpb24ucm93KTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IoZW5kUG9pbnQpO1xuICAgICAgICByZXR1cm4gZW5kUG9pbnQ7XG4gICAgfVxuXG4gICAgaW5zZXJ0SW1hZ2UocG9zaXRpb246IFBvaW50LCBpbWFnZURhdGE6IEltYWdlRGF0YU1vZGVsKTogUG9pbnQge1xuICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoUG9zaXRpb25Ub0RvY3VtZW50SW5kZXgodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIHBvc2l0aW9uKTtcbiAgICAgICAgY29uc3QgYWRqdXN0ZWRJbWFnZSA9IHRoaXMuZ2V0SW1hZ2VXaXRoQWxsb3dlZFNpemUoaW1hZ2VEYXRhLCB0aGlzLmNvbnRlbnRXaWR0aCk7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIuaW5zZXJ0SW1hZ2UodGhpcy5tb2RlbCwgaW5zZXJ0SW5kZXgsIGFkanVzdGVkSW1hZ2UpO1xuXG4gICAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5tb2RlbC5pbWFnZXMuZmluZCh4ID0+IHguaW5zZXJ0SW5kZXggPT09IGluc2VydEluZGV4KTtcbiAgICAgICAgdGhpcy5hZGRDb21wb25lbnQodGhpcy5jdXN0b21Db21wb25lbnRzLmltYWdlcywgbW9kZWwsIE5vZGVySW1hZ2VDb21wb25lbnQpO1xuXG4gICAgICAgIGNvbnN0IGVuZFBvaW50ID0gdGhpcy5kb2N1bWVudC5pbnNlcnRUZXh0KHBvc2l0aW9uLCBDVVNUT01fRUxFTUVOVF9NQVJLRVIpO1xuICAgICAgICB0aGlzLnVwZGF0ZVdyYXBEYXRhKHBvc2l0aW9uLnJvdywgcG9zaXRpb24ucm93KTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IoZW5kUG9pbnQpO1xuXG4gICAgICAgIHJldHVybiBlbmRQb2ludDtcbiAgICB9XG5cbiAgICBpbnNlcnRMaW5rKHBvc2l0aW9uOiBQb2ludCwgbGlua0RhdGE6IExpbmtEYXRhTW9kZWwpOiBQb2ludCB7XG4gICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhQb3NpdGlvblRvRG9jdW1lbnRJbmRleCh0aGlzLndyYXBQYXJhZ3JhcGhJbmRleCwgcG9zaXRpb24pO1xuICAgICAgICBjb25zdCBsaW5rU3R5bGUgPSBuZXcgVGV4dFN0eWxlTW9kZWwoeyBoZWFkaW5nU3R5bGVJZDogSFlQRVJMSU5LX0hFQURJTkdfU1RZTEVfSUQsIHVuZGVybGluZTogdHJ1ZSB9KTtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5pbnNlcnRMaW5rKHRoaXMubW9kZWwsIGxpbmtEYXRhLnRleHQsIGxpbmtEYXRhLmxpbmssIGluc2VydEluZGV4LCBsaW5rU3R5bGUpO1xuXG4gICAgICAgIGNvbnN0IGVuZFBvaW50ID0gdGhpcy5kb2N1bWVudC5pbnNlcnRUZXh0KHBvc2l0aW9uLCBsaW5rRGF0YS50ZXh0KTtcbiAgICAgICAgdGhpcy51cGRhdGVXcmFwRGF0YShwb3NpdGlvbi5yb3csIHBvc2l0aW9uLnJvdyk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKGVuZFBvaW50KTtcbiAgICAgICAgcmV0dXJuIGVuZFBvaW50O1xuICAgIH1cblxuICAgIGluc2VydFRhYmxlKHBvc2l0aW9uOiBQb2ludCwgdGFibGVNb2RlbDogSW5zZXJ0VGFibGVNb2RlbCk6IFBvaW50IHtcbiAgICAgICAgY29uc3QgaW5zZXJ0SW5kZXggPSBDb250ZW50SGVscGVyLnBhcmFncmFwaFBvc2l0aW9uVG9Eb2N1bWVudEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBwb3NpdGlvbik7XG5cbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5pbnNlcnRUYWJsZSh0aGlzLm1vZGVsLCBpbnNlcnRJbmRleCwgdGFibGVNb2RlbCwgdGhpcy5wYWdlc1dyYXAuY29udGVudFdpZHRoKTtcblxuICAgICAgICBjb25zdCBtb2RlbCA9IHRoaXMubW9kZWwudGFibGVzLmZpbmQoeCA9PiB4Lmluc2VydEluZGV4ID09PSB0YWJsZU1vZGVsLmluc2VydFRhYmxlSW5kZXgpO1xuICAgICAgICB0aGlzLmFkZENvbXBvbmVudCh0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFibGVzLCBtb2RlbCwgTm9kZXJUYWJsZUNvbXBvbmVudCk7XG5cbiAgICAgICAgY29uc3QgZW5kUG9pbnQgPSB0aGlzLmRvY3VtZW50Lmluc2VydFRleHQocG9zaXRpb24sIHRhYmxlTW9kZWwuY29udGVudCk7XG4gICAgICAgIHRoaXMudXBkYXRlSW50ZXJuYWxEYXRhT25JbnNlcnRUZXh0KHBvc2l0aW9uLnJvdywgZW5kUG9pbnQucm93KTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IoZW5kUG9pbnQpO1xuXG4gICAgICAgIHJldHVybiBlbmRQb2ludDtcbiAgICB9XG5cbiAgICBhZGRDb21wb25lbnQ8VCBleHRlbmRzIEJhc2VOb2RlckNvbXBvbmVudD4oY3VzdG9tRWxlbWVudHM6IENvbXBvbmVudFJlZjxUPltdLCBtb2RlbDogQ3VzdG9tQ29udGVudCwgY29tcG9uZW50VHlwZTogVHlwZTxUPikge1xuICAgICAgICBjb25zdCBjdXN0b21FbGVtZW50ID0gdGhpcy5jdXN0b21Db250ZW50U2VydmljZS5jb21wb25lbnRTZXJ2aWNlLmdlbmVyYXRlQ29tcG9uZW50KGNvbXBvbmVudFR5cGUsIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IG1vZGVsLFxuICAgICAgICAgICAgc2Vzc2lvbklkOiB0aGlzLnNlc3Npb25JZCxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHRoaXMucHJvcGVydGllcyxcbiAgICAgICAgICAgIGNvbnRlbnRXaWR0aDogdGhpcy5jb250ZW50V2lkdGhcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG5ld0VsZW1lbnRQb3NpdGlvbiA9IGN1c3RvbUVsZW1lbnRzLmZpbmRJbmRleCh4ID0+IHguaW5zdGFuY2UuaW5zZXJ0SW5kZXggPiBtb2RlbC5pbnNlcnRJbmRleCk7XG4gICAgICAgIGlmIChuZXdFbGVtZW50UG9zaXRpb24gPj0gMCkge1xuICAgICAgICAgICAgY3VzdG9tRWxlbWVudHMuc3BsaWNlKG5ld0VsZW1lbnRQb3NpdGlvbiwgMCwgY3VzdG9tRWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdXN0b21FbGVtZW50cy5wdXNoKGN1c3RvbUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0U3R5bGUoc3R5bGU6IFRleHRTdHlsZU1vZGVsIHwgUGFyYWdyYXBoU3R5bGVNb2RlbCk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzdHlsZSkpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0eWxlc01hcFtrZXldID0gc3R5bGVba2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2lnbmFsKCdzZXRTdHlsZXMnLCB0aGlzLl9zdHlsZXNNYXApO1xuICAgIH1cblxuICAgIHNldE51bWJlcmluZ1N0eWxlKHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBzdHlsZXMgPSB7XG4gICAgICAgICAgICBhbGlnbm1lbnQ6IFt0aGlzLl9zdHlsZXNNYXAuYWxpZ25tZW50XSxcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogW3RoaXMuX3N0eWxlc01hcC5iYWNrZ3JvdW5kQ29sb3JdLFxuICAgICAgICAgICAgaGlnaGxpZ2h0Q29sb3I6IFt0aGlzLl9zdHlsZXNNYXAuaGlnaGxpZ2h0Q29sb3JdLFxuICAgICAgICAgICAgZm9udENvbG9yOiBbdGhpcy5fc3R5bGVzTWFwLmZvbnRDb2xvcl0sXG4gICAgICAgICAgICBmb250RmFtaWx5OiBbdGhpcy5fc3R5bGVzTWFwLmZvbnRGYW1pbHldLFxuICAgICAgICAgICAgZm9udFNpemU6IFt0aGlzLl9zdHlsZXNNYXAuZm9udFNpemVdLFxuICAgICAgICAgICAgaXRhbGljOiBbdGhpcy5fc3R5bGVzTWFwLml0YWxpY10sXG4gICAgICAgICAgICBib2xkOiBbdGhpcy5fc3R5bGVzTWFwLmJvbGRdLFxuICAgICAgICAgICAgc3RyaWtldGhyb3VnaDogW3RoaXMuX3N0eWxlc01hcC5zdHJpa2V0aHJvdWdoXSxcbiAgICAgICAgICAgIHVuZGVybGluZTogW3RoaXMuX3N0eWxlc01hcC51bmRlcmxpbmVdLFxuICAgICAgICAgICAgc3BhY2VCZWZvcmU6IFt0aGlzLl9zdHlsZXNNYXAuc3BhY2VCZWZvcmVdLFxuICAgICAgICAgICAgc3BhY2VBZnRlcjogW3RoaXMuX3N0eWxlc01hcC5zcGFjZUFmdGVyXSxcbiAgICAgICAgICAgIGluZGVudExlZnQ6IFt0aGlzLl9zdHlsZXNNYXAuaW5kZW50TGVmdF0sXG4gICAgICAgICAgICBpbmRlbnRSaWdodDogW3RoaXMuX3N0eWxlc01hcC5pbmRlbnRSaWdodF0sXG4gICAgICAgICAgICBpc0J1bGxldE1hcmtlcjogW10sXG4gICAgICAgICAgICBudW1iZXJpbmdMZXZlbHNTdHlsZXM6IFtdXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMudXBkYXRlTnVtYmVyaW5nU3R5bGVzKHN0eWxlcywgc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgICAgICB0aGlzLnN0eWxlcyA9IHN0eWxlcztcbiAgICB9XG5cbiAgICByZXN0b3JlKG1vZGVsOiBSZXN0b3JlTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoUG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCBtb2RlbC5zdGFydEluZGV4KTtcbiAgICAgICAgaWYgKG1vZGVsLnN0YXJ0SW5kZXggIT09IG1vZGVsLmVuZEluZGV4KSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUJ5RG9jdW1lbnRJbmRleGVzKG1vZGVsLnN0YXJ0SW5kZXgsIG1vZGVsLmVuZEluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIucmVzdG9yZSh0aGlzLm1vZGVsLCBtb2RlbCk7XG5cbiAgICAgICAgY29uc3QgcmVzdG9yZUVuZEluZGV4ID0gbW9kZWwuc3RhcnRJbmRleCArIG1vZGVsLnRleHQubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc3RvcmVDb21wb25lbnRzKHRoaXMubW9kZWwudGFibGVzLCB0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFibGVzLCBOb2RlclRhYmxlQ29tcG9uZW50LCBtb2RlbC5zdGFydEluZGV4LCByZXN0b3JlRW5kSW5kZXgpO1xuICAgICAgICB0aGlzLnJlc3RvcmVDb21wb25lbnRzKHRoaXMubW9kZWwuaW1hZ2VzLCB0aGlzLmN1c3RvbUNvbXBvbmVudHMuaW1hZ2VzLCBOb2RlckltYWdlQ29tcG9uZW50LCBtb2RlbC5zdGFydEluZGV4LCByZXN0b3JlRW5kSW5kZXgpO1xuICAgICAgICB0aGlzLnJlc3RvcmVDb21wb25lbnRzKHRoaXMubW9kZWwudGFicywgdGhpcy5jdXN0b21Db21wb25lbnRzLnRhYnMsIE5vZGVyVGFiQ29tcG9uZW50LCBtb2RlbC5zdGFydEluZGV4LCByZXN0b3JlRW5kSW5kZXgpO1xuICAgICAgICB0aGlzLnJlc3RvcmVFbGVtZW50Q29tcG9uZW50cyh0aGlzLm1vZGVsLmVsZW1lbnRzLCBtb2RlbC5zdGFydEluZGV4LCByZXN0b3JlRW5kSW5kZXgpO1xuXG4gICAgICAgIGNvbnN0IGVuZFBvaW50ID0gdGhpcy5kb2N1bWVudC5pbnNlcnRUZXh0KHBhcmFncmFwaFBvc2l0aW9uLCBtb2RlbC50ZXh0KTtcbiAgICAgICAgdGhpcy51cGRhdGVJbnRlcm5hbERhdGFPbkluc2VydFRleHQocGFyYWdyYXBoUG9zaXRpb24ucm93LCBlbmRQb2ludC5yb3cpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihlbmRQb2ludCk7XG4gICAgICAgIHRoaXMucHJvY2Vzc1NlbGVjdGlvblN0eWxlcygpO1xuICAgIH1cblxuICAgIHJlc3RvcmVDb21wb25lbnRzPFQgZXh0ZW5kcyBCYXNlTm9kZXJDb21wb25lbnQ+KFxuICAgICAgICBtb2RlbHM6IEN1c3RvbUNvbnRlbnRbXSxcbiAgICAgICAgY29tcG9uZW50czogQ29tcG9uZW50UmVmPEJhc2VOb2RlckNvbXBvbmVudD5bXSxcbiAgICAgICAgY29tcG9uZW50VHlwZTogVHlwZTxUPixcbiAgICAgICAgcmVzdG9yZUluZGV4OiBudW1iZXIsXG4gICAgICAgIHJlc3RvcmVFbmRJbmRleDogbnVtYmVyXG4gICAgKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgbW9kZWwgb2YgbW9kZWxzKSB7XG4gICAgICAgICAgICBpZiAobW9kZWwuaW5zZXJ0SW5kZXggPCByZXN0b3JlSW5kZXgpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobW9kZWwuaW5zZXJ0SW5kZXggPj0gcmVzdG9yZUVuZEluZGV4KSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFkZENvbXBvbmVudChjb21wb25lbnRzLCBtb2RlbCwgY29tcG9uZW50VHlwZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXN0b3JlRWxlbWVudENvbXBvbmVudHMoZWxlbWVudHM6IEVsZW1lbnRNb2RlbFtdLCByZXN0b3JlSW5kZXg6IG51bWJlciwgcmVzdG9yZUVuZEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBtb2RlbCBvZiBlbGVtZW50cykge1xuICAgICAgICAgICAgaWYgKG1vZGVsLmluc2VydEluZGV4IDwgcmVzdG9yZUluZGV4KSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1vZGVsLmluc2VydEluZGV4ID49IHJlc3RvcmVFbmRJbmRleCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMuY3VzdG9tQ29udGVudFNlcnZpY2UuZmluZENvbXBvbmVudFR5cGUobW9kZWwudHlwZSk7XG4gICAgICAgICAgICB0aGlzLmFkZENvbXBvbmVudCh0aGlzLmN1c3RvbUNvbXBvbmVudHMuY3VzdG9tRWxlbWVudHMsIG1vZGVsLCB0eXBlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb2Nlc3NTZWxlY3Rpb25TdHlsZXMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHsgc3RhcnRJbmRleCwgZW5kSW5kZXggfSA9IHRoaXMuZ2V0UmFuZ2VJbmRleGVzKHRoaXMuc2VsZWN0aW9uLnJhbmdlKTtcblxuICAgICAgICBjb25zdCBzdHlsZXMgPSB7XG4gICAgICAgICAgICBhbGlnbm1lbnQ6IFtdLFxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBbXSxcbiAgICAgICAgICAgIGhpZ2hsaWdodENvbG9yOiBbXSxcbiAgICAgICAgICAgIGZvbnRDb2xvcjogW10sXG4gICAgICAgICAgICBmb250RmFtaWx5OiBbXSxcbiAgICAgICAgICAgIGZvbnRTaXplOiBbXSxcbiAgICAgICAgICAgIGl0YWxpYzogW10sXG4gICAgICAgICAgICBib2xkOiBbXSxcbiAgICAgICAgICAgIHN0cmlrZXRocm91Z2g6IFtdLFxuICAgICAgICAgICAgdW5kZXJsaW5lOiBbXSxcbiAgICAgICAgICAgIHNwYWNlQmVmb3JlOiBbXSxcbiAgICAgICAgICAgIHNwYWNlQWZ0ZXI6IFtdLFxuICAgICAgICAgICAgaW5kZW50TGVmdDogW10sXG4gICAgICAgICAgICBpbmRlbnRSaWdodDogW10sXG4gICAgICAgICAgICBpc0J1bGxldE1hcmtlcjogW10sXG4gICAgICAgICAgICBudW1iZXJpbmdMZXZlbHNTdHlsZXM6IFtdXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMudXBkYXRlUGFyYWdyYXBoU3R5bGVzKHN0eWxlcywgc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgICAgICB0aGlzLnVwZGF0ZU51bWJlcmluZ1N0eWxlcyhzdHlsZXMsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgICAgICAgY29uc3QgZm9ybWF0ID0gdGhpcy51cGRhdGVUZXh0U3R5bGVzKHN0eWxlcywgc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgICAgICB0aGlzLnN0eWxlcyA9IHN0eWxlcztcblxuICAgICAgICBpZiAoZm9ybWF0KSB7XG4gICAgICAgICAgICBjb25zdCBuZXdUZXh0U3R5bGUgPSBPYmplY3QuYXNzaWduKHt9LCBmb3JtYXQudGV4dFN0eWxlLCB0aGlzLmN1cnNvclN0eWxlKTtcbiAgICAgICAgICAgIHRoaXMuY3Vyc29yU3R5bGUgPSBuZXcgVGV4dFN0eWxlTW9kZWwobmV3VGV4dFN0eWxlKTtcbiAgICAgICAgICAgIHRoaXMuc2V0U3R5bGUodGhpcy5jdXJzb3JTdHlsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyQ3Vyc29yU3R5bGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldExpbmtNb2RlbChjdXJzb3I6IFBvaW50KTogTGlua01vZGVsIHtcbiAgICAgICAgY29uc3QgeyBzdGFydEluZGV4LCBlbmRJbmRleCB9ID0gdGhpcy5nZXRSYW5nZUluZGV4ZXMobmV3IFJhbmdlKGN1cnNvciwgY3Vyc29yKSk7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZGVsLmxpbmtzLmZpbmQoeCA9PiB4Lmluc2VydEluZGV4IDw9IHN0YXJ0SW5kZXggKyAxICYmIHguZW5kSW5kZXggPiBlbmRJbmRleCk7XG4gICAgfVxuXG4gICAgaW5zZXJ0VGFibGVSb3dzKGluc2VydEluZGV4OiBudW1iZXIsIHJvd3NDb3VudDogbnVtYmVyLCB0YXJnZXRJbmRleDogbnVtYmVyLCBpbmhlcml0SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmluc2VydFRhYmxlUm93cyh0aGlzLm1vZGVsLCBpbnNlcnRJbmRleCwgcm93c0NvdW50LCB0YXJnZXRJbmRleCwgaW5oZXJpdEluZGV4KTtcbiAgICAgICAgY29uc3QgdGFibGVDb21wb25lbnQgPSB0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFibGVzLmZpbmQoeCA9PiB4Lmluc3RhbmNlLmluc2VydEluZGV4ID09PSBpbnNlcnRJbmRleCk7XG4gICAgICAgIHRhYmxlQ29tcG9uZW50Lmluc3RhbmNlLnVwZGF0ZVRhYmxlKCk7XG4gICAgfVxuXG4gICAgaW5zZXJ0VGFibGVDb2x1bW5zKGluc2VydEluZGV4OiBudW1iZXIsIGNvbHVtbnNDb3VudDogbnVtYmVyLCB0YXJnZXRJbmRleDogbnVtYmVyLCBpbmhlcml0SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmluc2VydFRhYmxlQ29sdW1ucyh0aGlzLm1vZGVsLCBpbnNlcnRJbmRleCwgY29sdW1uc0NvdW50LCB0YXJnZXRJbmRleCwgaW5oZXJpdEluZGV4LCB0aGlzLnBhZ2VzV3JhcC5jb250ZW50V2lkdGgpO1xuICAgICAgICBjb25zdCB0YWJsZUNvbXBvbmVudCA9IHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJsZXMuZmluZCh4ID0+IHguaW5zdGFuY2UuaW5zZXJ0SW5kZXggPT09IGluc2VydEluZGV4KTtcbiAgICAgICAgdGFibGVDb21wb25lbnQuaW5zdGFuY2UudXBkYXRlVGFibGUoKTtcbiAgICB9XG5cbiAgICByZW1vdmVUYWJsZVJvd3MoaW5zZXJ0SW5kZXg6IG51bWJlciwgc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIucmVtb3ZlVGFibGVSb3dzKHRoaXMubW9kZWwsIGluc2VydEluZGV4LCBzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgIGNvbnN0IHRhYmxlQ29tcG9uZW50ID0gdGhpcy5jdXN0b21Db21wb25lbnRzLnRhYmxlcy5maW5kKHggPT4geC5pbnN0YW5jZS5pbnNlcnRJbmRleCA9PT0gaW5zZXJ0SW5kZXgpO1xuICAgICAgICB0YWJsZUNvbXBvbmVudC5pbnN0YW5jZS51cGRhdGVUYWJsZSgpO1xuICAgIH1cblxuICAgIHJlbW92ZVRhYmxlQ29sdW1ucyhpbnNlcnRJbmRleDogbnVtYmVyLCBzdGFydEluZGV4OiBudW1iZXIsIGVuZEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5yZW1vdmVUYWJsZUNvbHVtbnModGhpcy5tb2RlbCwgaW5zZXJ0SW5kZXgsIHN0YXJ0SW5kZXgsIGVuZEluZGV4LCB0aGlzLnBhZ2VzV3JhcC5jb250ZW50V2lkdGgpO1xuICAgICAgICBjb25zdCB0YWJsZUNvbXBvbmVudCA9IHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJsZXMuZmluZCh4ID0+IHguaW5zdGFuY2UuaW5zZXJ0SW5kZXggPT09IGluc2VydEluZGV4KTtcbiAgICAgICAgdGFibGVDb21wb25lbnQuaW5zdGFuY2UudXBkYXRlVGFibGUoKTtcbiAgICB9XG5cbiAgICByZXNpemVUYWJsZUNvbHVtbnMocmVzaXplVGFibGVDb2x1bW5zOiBSZXNpemVUYWJsZUNvbHVtbnNNb2RlbCk6IHZvaWQge1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLnJlc2l6ZVRhYmxlQ29sdW1ucyh0aGlzLm1vZGVsLCByZXNpemVUYWJsZUNvbHVtbnMpO1xuICAgICAgICBjb25zdCB0YWJsZUNvbXBvbmVudCA9IHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJsZXMuZmluZCh4ID0+IHguaW5zdGFuY2UuaW5zZXJ0SW5kZXggPT09IHJlc2l6ZVRhYmxlQ29sdW1ucy5pbnNlcnRJbmRleCk7XG4gICAgICAgIHRhYmxlQ29tcG9uZW50Lmluc3RhbmNlLnVwZGF0ZVRhYmxlKCk7XG4gICAgfVxuXG4gICAgcmVzdG9yZVRhYmxlKGluc2VydEluZGV4OiBudW1iZXIsIHRhYmxlOiBUYWJsZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG9sZFRhYmxlID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0YWJsZSkpIGFzIFRhYmxlTW9kZWw7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIucmVzdG9yZVRhYmxlKHRoaXMubW9kZWwsIGluc2VydEluZGV4LCBvbGRUYWJsZSk7XG4gICAgICAgIGNvbnN0IHRhYmxlQ29tcG9uZW50ID0gdGhpcy5jdXN0b21Db21wb25lbnRzLnRhYmxlcy5maW5kKHggPT4geC5pbnN0YW5jZS5pbnNlcnRJbmRleCA9PT0gaW5zZXJ0SW5kZXgpO1xuICAgICAgICB0YWJsZUNvbXBvbmVudC5pbnN0YW5jZS51cGRhdGVUYWJsZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlUGFyYWdyYXBoVGFicyh0YWJJbmRleDogbnVtYmVyLCBwYXJhZ3JhcGhJbmRleDogbnVtYmVyLCBsZW5ndGg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHBhcmFncmFwaExhc3RJbmRleCA9IHRoaXMud3JhcFBhcmFncmFwaEluZGV4W3BhcmFncmFwaEluZGV4XSArIGxlbmd0aDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGFiSW5kZXggPT09IC0xIHx8XG4gICAgICAgICAgICB0YWJJbmRleCA+PSB0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFicy5sZW5ndGggfHxcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJzW3RhYkluZGV4XS5pbnN0YW5jZS5pbnNlcnRJbmRleCA+IHBhcmFncmFwaExhc3RJbmRleFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiB0YWJJbmRleDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSB0YWJJbmRleDtcbiAgICAgICAgd2hpbGUgKHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJzW3RhYkluZGV4XSAmJiB0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFic1t0YWJJbmRleF0uaW5zdGFuY2UuaW5zZXJ0SW5kZXggPD0gcGFyYWdyYXBoTGFzdEluZGV4KSB7XG4gICAgICAgICAgICB0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFic1t0YWJJbmRleF0uaW5zdGFuY2Uud2lkdGggPSB0aGlzLnBhZ2VzV3JhcC50YWJUb2tlbnNbdGFiSW5kZXggLSBzdGFydEluZGV4XS53aWR0aDtcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJzW3RhYkluZGV4XS5pbnN0YW5jZS5oZWlnaHQgPSB0aGlzLnBhZ2VzV3JhcC50YWJUb2tlbnNbdGFiSW5kZXggLSBzdGFydEluZGV4XS5mb250O1xuICAgICAgICAgICAgdGFiSW5kZXgrKztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0YWJJbmRleDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFJhbmdlSW5kZXhlcyhyYW5nZTogUmFuZ2UpOiB7IHN0YXJ0SW5kZXg6IG51bWJlcjsgZW5kSW5kZXg6IG51bWJlciB9IHtcbiAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSBDb250ZW50SGVscGVyLnBhcmFncmFwaFBvc2l0aW9uVG9Eb2N1bWVudEluZGV4KHRoaXMud3JhcFBhcmFncmFwaEluZGV4LCByYW5nZS5zdGFydCk7XG4gICAgICAgIGxldCBlbmRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoUG9zaXRpb25Ub0RvY3VtZW50SW5kZXgodGhpcy53cmFwUGFyYWdyYXBoSW5kZXgsIHJhbmdlLmVuZCk7XG4gICAgICAgIGNvbnN0IHByZXZOZXdMaW5lU3ltYm9sID0gdGhpcy5kb2N1bWVudC5pc05ld0xpbmVTeW1ib2woZW5kSW5kZXggLSAxKTtcbiAgICAgICAgaWYgKCFwcmV2TmV3TGluZVN5bWJvbCkge1xuICAgICAgICAgICAgaWYgKGVuZEluZGV4ID4gc3RhcnRJbmRleCkge1xuICAgICAgICAgICAgICAgIGVuZEluZGV4LS07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0SW5kZXggPT09IGVuZEluZGV4ICYmIHN0YXJ0SW5kZXggPiAwKSB7XG4gICAgICAgICAgICAgICAgc3RhcnRJbmRleC0tO1xuICAgICAgICAgICAgICAgIGVuZEluZGV4LS07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBzdGFydEluZGV4LCBlbmRJbmRleCB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlSW50ZXJuYWxEYXRhT25JbnNlcnRUZXh0KHN0YXJ0Um93OiBudW1iZXIsIGVuZFJvdzogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IGVuZFJvdyAtIHN0YXJ0Um93O1xuICAgICAgICBjb25zdCBuZXdQYXJhZ3JhcGhzOiBQYXJhZ3JhcGhbXSA9IEFycmF5KGxlbmd0aCk7XG4gICAgICAgIGNvbnN0IG5ld1dyYXBEYXRhOiBudW1iZXJbXVtdID0gQXJyYXkobGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbmV3V3JhcERhdGFbaV0gPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMud3JhcERhdGEuc3BsaWNlKHN0YXJ0Um93LCAwLCAuLi5uZXdXcmFwRGF0YSk7XG4gICAgICAgIHRoaXMucGFnZXNXcmFwLnBhcmFncmFwaHMuc3BsaWNlKHN0YXJ0Um93LCAwLCAuLi5uZXdQYXJhZ3JhcGhzKTtcbiAgICAgICAgaWYgKGxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVOdW1iZXJpbmdzRGF0YU9uQ2hhbmdlKGVuZFJvdyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZVdyYXBEYXRhKHN0YXJ0Um93LCBlbmRSb3cpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlSW50ZXJuYWxEYXRhT25EZWxldGVUZXh0KHN0YXJ0Um93OiBudW1iZXIsIGVuZFJvdzogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IGVuZFJvdyAtIHN0YXJ0Um93O1xuXG4gICAgICAgIHRoaXMud3JhcERhdGEuc3BsaWNlKHN0YXJ0Um93LCBsZW5ndGgpO1xuICAgICAgICB0aGlzLnBhZ2VzV3JhcC5yZW1vdmUoc3RhcnRSb3csIGxlbmd0aCk7XG4gICAgICAgIGlmIChsZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTnVtYmVyaW5nc0RhdGFPbkNoYW5nZShzdGFydFJvdyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZVdyYXBEYXRhKHN0YXJ0Um93LCBzdGFydFJvdyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVOdW1iZXJpbmdzRGF0YU9uQ2hhbmdlKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IGluZGV4OyBpIDwgdGhpcy5wYWdlc1dyYXAucGFyYWdyYXBocy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMubW9kZWwucGFyYWdyYXBoc1tpXS5wYXJhZ3JhcGhTdHlsZS5udW1iZXJpbmdJZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMucGFnZXNXcmFwLnBhcmFncmFwaHNbaV0ubnVtYmVyaW5nRGF0YSA9IE51bWJlcmluZ0hlbHBlci5jcmVhdGVEYXRhTW9kZWwoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcGVydGllcy5udW1iZXJpbmdzLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnBhcmFncmFwaHMsXG4gICAgICAgICAgICAgICAgICAgIGlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFncmFwaEZvcm1hdCA9IEZvcm1hdFN0eWxlSGVscGVyLmdldEZvcm1hdEF0SW5kZXgodGhpcy5tb2RlbC5mb3JtYXRzLCB0aGlzLm1vZGVsLnBhcmFncmFwaHNbaV0uaW5zZXJ0SW5kZXgpO1xuICAgICAgICAgICAgICAgIE51bWJlcmluZ0hlbHBlci51cGRhdGVNYXJrZXJEYXRhKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFnZXNXcmFwLnBhcmFncmFwaHNbaV0sXG4gICAgICAgICAgICAgICAgICAgIHBhcmFncmFwaEZvcm1hdC50ZXh0U3R5bGUsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwucGFyYWdyYXBoc1tpXS5wYXJhZ3JhcGhTdHlsZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB3cmFwIGluZGV4IGJhc2VkIG9uIG1heCByb3cgd2lkdGhcbiAgICAgKi9cbiAgICBwcml2YXRlIGNvbXB1dGVXcmFwSW5kZXgoZGlzcGxheVRva2VuczogRGlzcGxheVRva2VuW10pOiBudW1iZXIge1xuICAgICAgICBpZiAoIWRpc3BsYXlUb2tlbnNbMF0pIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRpc3BsYXlUb2tlbnNbMF0uaXNUYWJsZSB8fCAoZGlzcGxheVRva2Vuc1swXS5icmVha3NMaW5lICYmIGRpc3BsYXlUb2tlbnMubGVuZ3RoID09PSAxKSkge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbmRlbnQgPVxuICAgICAgICAgICAgZGlzcGxheVRva2Vuc1swXS5pbmRlbnRMZWZ0ICtcbiAgICAgICAgICAgICAgICBkaXNwbGF5VG9rZW5zWzBdLmluZGVudFJpZ2h0ICtcbiAgICAgICAgICAgICAgICBkaXNwbGF5VG9rZW5zWzBdLmluZGVudEZpcnN0TGluZSAtXG4gICAgICAgICAgICAgICAgZGlzcGxheVRva2Vuc1swXS5pbmRlbnRIYW5naW5nIHx8IDA7XG4gICAgICAgIGNvbnN0IG1heFJvd1dpZHRoID0gKHRoaXMucGFnZXNXcmFwLmNvbnRlbnRXaWR0aCB8fCB0aGlzLmNvbnRlbnRXaWR0aCkgLSBpbmRlbnQ7XG4gICAgICAgIGxldCBzdW0gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpc3BsYXlUb2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChkaXNwbGF5VG9rZW5zW2ldLmlzVGFiKSB7XG4gICAgICAgICAgICAgICAgZGlzcGxheVRva2Vuc1tpXS53aWR0aCA9IFRhYkhlbHBlci5jYWxjdWxhdGVUYWJXaWR0aChzdW0sIHRoaXMucHJvcGVydGllcy5kZWZhdWx0VGFiV2lkdGgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdW0gKz0gZGlzcGxheVRva2Vuc1tpXS53aWR0aDtcbiAgICAgICAgICAgIGlmICgoaSA+IDAgJiYgKHN1bSA+PSBtYXhSb3dXaWR0aCB8fCBkaXNwbGF5VG9rZW5zW2kgLSAxXS5icmVha3NMaW5lKSkgfHwgZGlzcGxheVRva2Vuc1tpXS5pc1RhYmxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkaXNwbGF5VG9rZW5zW2ldLmlzTGluZUJyZWFrIHx8IChpID09PSBkaXNwbGF5VG9rZW5zLmxlbmd0aCAtIDEgJiYgZGlzcGxheVRva2Vuc1tpXS5pc1BhZ2VCcmVhaykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaSArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbXB1dGVXcmFwU3BsaXQodG9rZW5zOiBEaXNwbGF5VG9rZW5bXSwgd3JhcExpbWl0OiBudW1iZXIpOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgaWYgKCF0b2tlbnMubGVuZ3RoIHx8IHRva2Vucy5sZW5ndGggPD0gd3JhcExpbWl0KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZXJlIGlzIGEgc3BhY2Ugb3IgdGFiIGF0IHRoaXMgc3BsaXQgcG9zaXRpb24sIHRoZW4gbWFraW5nXG4gICAgICAgIC8vIGEgc3BsaXQgaXMgc2ltcGxlLlxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB3cmFwTGltaXQgPT09IDAgfHxcbiAgICAgICAgICAgIHRva2Vuc1t3cmFwTGltaXRdLmRpc3BsYXlWYWx1ZSA9PT0gRGlzcGxheVZhbHVlLmN1c3RvbUNvbnRlbnQgfHxcbiAgICAgICAgICAgICh0aGlzLmlzV2hpdGVTcGFjZSh0b2tlbnNbd3JhcExpbWl0IC0gMV0pICYmIHRoaXMuaXNXaGl0ZVNwYWNlKHRva2Vuc1t3cmFwTGltaXRdKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gd3JhcExpbWl0O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsY3VsYXRlU3BsaXQod3JhcExpbWl0LCB0b2tlbnMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U3BsaXRzKFxuICAgICAgICBtb2RlbDogQ29udGVudHNJbnRlcmZhY2UsXG4gICAgICAgIGxpbmU6IHN0cmluZyxcbiAgICAgICAgc3RhcnRJbmRleDogbnVtYmVyLFxuICAgICAgICBjdXN0b21Db21wb25lbnRzOiBJQ3VzdG9tQ29tcG9uZW50cyxcbiAgICAgICAgcGFyYWdyYXBoSW5kZXg6IG51bWJlcixcbiAgICAgICAgaXNOZXh0TGluZUV4aXN0czogYm9vbGVhblxuICAgICk6IHsgc3BsaXRzOiBudW1iZXJbXTsgcm93SW5mb3M6IExpbmVJbmZvTW9kZWxbXSB9IHtcbiAgICAgICAgY29uc3Qgc3RyVG9rZW5zID0gdGhpcy5nZXREaXNwbGF5VG9rZW5zKG1vZGVsLCBsaW5lLCBzdGFydEluZGV4LCBjdXN0b21Db21wb25lbnRzKTtcbiAgICAgICAgaWYgKCFzdHJUb2tlbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0Um93SW5mbyA9IG5ldyBMaW5lSW5mb01vZGVsKHtcbiAgICAgICAgICAgICAgICBoZWlnaHQ6ICh0aGlzLnN0eWxlc01hcC5mb250U2l6ZSAqIDQpIC8gMyxcbiAgICAgICAgICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgICAgICAgICBhbGlnbjogREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUuYWxpZ25tZW50LFxuICAgICAgICAgICAgICAgIGluZGVudDogbmV3IEluZGVudE1vZGVsKFxuICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5pbmRlbnRGaXJzdExpbmUsXG4gICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmluZGVudEhhbmdpbmcsXG4gICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmluZGVudExlZnQsXG4gICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmluZGVudFJpZ2h0XG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBvZmZzZXRBZnRlcjogREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUuc3BhY2VBZnRlcixcbiAgICAgICAgICAgICAgICBvZmZzZXRCZWZvcmU6IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLnNwYWNlQmVmb3JlLFxuICAgICAgICAgICAgICAgIGxpbmVTcGFjaW5nOiBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5saW5lU3BhY2luZyxcbiAgICAgICAgICAgICAgICBpc0FmdGVyUGFnZUJyZWFrOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc0VuZGVkQnlQYWdlQnJlYWs6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUuYmFja2dyb3VuZENvbG9yXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHsgc3BsaXRzOiBbXSwgcm93SW5mb3M6IFtkZWZhdWx0Um93SW5mb10gfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNwbGl0czogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgY29uc3Qgcm93SW5mb3M6IExpbmVJbmZvTW9kZWxbXSA9IFtdO1xuXG4gICAgICAgIGxldCBwcmV2VG9rZW46IERpc3BsYXlUb2tlbjtcbiAgICAgICAgbGV0IGluZGV4ID0gLTE7XG4gICAgICAgIGxldCBpbml0aWFsID0gbGluZTtcbiAgICAgICAgd2hpbGUgKGluZGV4KSB7XG4gICAgICAgICAgICBpbml0aWFsID0gaW5pdGlhbC5zbGljZShpbmRleCA+IDAgPyBpbmRleCA6IDApO1xuICAgICAgICAgICAgY29uc3QgdG9rZW5zID0gc3RyVG9rZW5zLnNsaWNlKGxpbmUubGVuZ3RoIC0gaW5pdGlhbC5sZW5ndGgpO1xuICAgICAgICAgICAgaWYgKCF0b2tlbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdG9rZW5zLnB1c2goLi4udGhpcy5nZXRFbXB0eUxpbmVUb2tlbnMoc3RhcnRJbmRleCArIGluZGV4KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB3cmFwTGltaXQgPSB0aGlzLmNvbXB1dGVXcmFwSW5kZXgodG9rZW5zKTtcbiAgICAgICAgICAgIGlmICh0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdLmlzUGFnZUJyZWFrICYmIHdyYXBMaW1pdCA9PT0gdG9rZW5zLmxlbmd0aCAmJiBpc05leHRMaW5lRXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgd3JhcExpbWl0ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHdyYXBTcGxpdCA9XG4gICAgICAgICAgICAgICAgdG9rZW5zW3dyYXBMaW1pdCAtIDFdPy5icmVha3NMaW5lIHx8IHRva2Vuc1t3cmFwTGltaXQgLSAxXT8uaXNUYWJsZSA/IHdyYXBMaW1pdCA6IHRoaXMuY29tcHV0ZVdyYXBTcGxpdCh0b2tlbnMsIHdyYXBMaW1pdCk7XG4gICAgICAgICAgICBjb25zdCB3cmFwVG9rZW5zID0gdG9rZW5zLnNsaWNlKDAsIHdyYXBTcGxpdCB8fCB1bmRlZmluZWQpO1xuXG4gICAgICAgICAgICBpZiAod3JhcFRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBwcmV2VG9rZW4gPSB3cmFwVG9rZW5zW3dyYXBUb2tlbnMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGlzQWZ0ZXJQYWdlQnJlYWsgPSAhcm93SW5mb3MubGVuZ3RoID8gZmFsc2UgOiByb3dJbmZvc1tyb3dJbmZvcy5sZW5ndGggLSAxXS5pc0VuZGVkQnlQYWdlQnJlYWs7XG4gICAgICAgICAgICBjb25zdCBsaW5lSW5mbyA9IHRoaXMuZ2V0TGluZUluZm9Gcm9tVG9rZW4ocHJldlRva2VuLCB3cmFwVG9rZW5zWzBdLCB3cmFwVG9rZW5zLCBpc0FmdGVyUGFnZUJyZWFrKTtcbiAgICAgICAgICAgIGxpbmVJbmZvLmJhY2tncm91bmRDb2xvciA9IG1vZGVsLnBhcmFncmFwaHNbcGFyYWdyYXBoSW5kZXhdLnBhcmFncmFwaFN0eWxlLmJhY2tncm91bmRDb2xvcjtcbiAgICAgICAgICAgIHJvd0luZm9zLnB1c2gobGluZUluZm8pO1xuXG4gICAgICAgICAgICBpZiAoIXdyYXBMaW1pdCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbmRleCA9IHdyYXBTcGxpdDtcbiAgICAgICAgICAgIGNvbnN0IHNwbGl0c0xlbmd0aCA9IHNwbGl0cy5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBzcGxpdEluZGV4ID0gc3BsaXRzTGVuZ3RoID8gaW5kZXggKyBzcGxpdHNbc3BsaXRzTGVuZ3RoIC0gMV0gOiBpbmRleDtcbiAgICAgICAgICAgIHNwbGl0cy5wdXNoKHNwbGl0SW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wYWdlc1dyYXAudGFiVG9rZW5zLnB1c2goLi4uc3RyVG9rZW5zLmZpbHRlcih4ID0+IHguaXNUYWIpKTtcblxuICAgICAgICBQYXJhZ3JhcGhIZWxwZXIuYXBwbHlQYXJhZ3JhcGhJbmRlbnRzVG9MaW5lcyhyb3dJbmZvcywgcGFyYWdyYXBoSW5kZXgsIG1vZGVsLnBhcmFncmFwaHMpO1xuICAgICAgICByZXR1cm4geyBzcGxpdHMsIHJvd0luZm9zIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXREb2N1bWVudCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcGFnZU1hcmdpbiA9IHRoaXMuZG9jdW1lbnQucGFnZU1hcmdpbjtcblxuICAgICAgICB0aGlzLnBhZ2VzV3JhcCA9IG5ldyBQYWdlc1dyYXAoXG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50LnBhZ2VzU3BhY2UsXG4gICAgICAgICAgICBwYWdlTWFyZ2luLFxuICAgICAgICAgICAgdGhpcy5kb2N1bWVudC5wYWdlV2lkdGgsXG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50LnBhZ2VIZWlnaHQsXG4gICAgICAgICAgICB0aGlzLmN1c3RvbUNvbXBvbmVudHNcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNsZWFyQ3Vyc29yU3R5bGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2N1cnNvclN0eWxlID0gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEVtcHR5TGluZVRva2VucyhzdGFydEluZGV4OiBudW1iZXIpOiBEaXNwbGF5VG9rZW5bXSB7XG4gICAgICAgIGNvbnN0IHN0b3JlZEZvcm1hdCA9IEZvcm1hdFN0eWxlSGVscGVyLmdldEZvcm1hdEF0SW5kZXgodGhpcy5tb2RlbC5mb3JtYXRzLCBzdGFydEluZGV4KTtcbiAgICAgICAgaWYgKCFzdG9yZWRGb3JtYXQpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxpbmVJbmZvID0gdGhpcy5nZXRMaW5lSW5mb0J5QnJlYWtNb2RpZmllcihzdGFydEluZGV4KTtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IEZvbnRNZXRyaWNzLm1lYXN1cmVDaGFyU2l6ZSgnRU1QVFlfTElORScsIENvbnRlbnRTdHlsZUhlbHBlci5nZXRGb250U3R5bGVzU3RyaW5nKHN0b3JlZEZvcm1hdC50ZXh0U3R5bGUpKTtcbiAgICAgICAgc2l6ZS53aWR0aCA9IDM7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBuZXcgRGlzcGxheVRva2VuKHtcbiAgICAgICAgICAgICAgICAuLi5zaXplLFxuICAgICAgICAgICAgICAgIGRpc3BsYXlWYWx1ZTogRGlzcGxheVZhbHVlLmVtcHR5TGluZSxcbiAgICAgICAgICAgICAgICBhbGlnbjogbGluZUluZm8uYWxpZ24sXG4gICAgICAgICAgICAgICAgaW5kZW50Rmlyc3RMaW5lOiBsaW5lSW5mby5pbmRlbnQuZmlyc3RMaW5lLFxuICAgICAgICAgICAgICAgIGluZGVudEhhbmdpbmc6IGxpbmVJbmZvLmluZGVudC5oYW5naW5nLFxuICAgICAgICAgICAgICAgIGluZGVudExlZnQ6IGxpbmVJbmZvLmluZGVudC5sZWZ0LFxuICAgICAgICAgICAgICAgIGluZGVudFJpZ2h0OiBsaW5lSW5mby5pbmRlbnQucmlnaHQsXG4gICAgICAgICAgICAgICAgaW5kZW50QmVmb3JlOiBsaW5lSW5mby5vZmZzZXRCZWZvcmUsXG4gICAgICAgICAgICAgICAgaW5kZW50QWZ0ZXI6IGxpbmVJbmZvLm9mZnNldEFmdGVyLFxuICAgICAgICAgICAgICAgIGlzUGFnZUJyZWFrOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc0xpbmVCcmVhazogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNUYWI6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGxpbmVTcGFjaW5nOiBsaW5lSW5mby5saW5lU3BhY2luZ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEZpbGxlZExpbmVUb2tlbnMoXG4gICAgICAgIHN0YXJ0SW5kZXg6IG51bWJlcixcbiAgICAgICAgbGluZTogc3RyaW5nLFxuICAgICAgICBtb2RlbDogQ29udGVudHNJbnRlcmZhY2UsXG4gICAgICAgIGN1c3RvbUNvbXBvbmVudHM6IElDdXN0b21Db21wb25lbnRzXG4gICAgKTogRGlzcGxheVRva2VuW10ge1xuICAgICAgICBjb25zdCBsaW5lSW5mbyA9IHRoaXMuZ2V0TGluZUluZm9CeUJyZWFrTW9kaWZpZXIoc3RhcnRJbmRleCArIGxpbmUubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgdG9rZW5zOiBEaXNwbGF5VG9rZW5bXSA9IFtdO1xuICAgICAgICBsZXQgY2hhcmFjdGVyczogRGlzcGxheVRva2VuW10gPSBbXTtcbiAgICAgICAgbGV0IGZvcm1hdCA9IEZvcm1hdFN0eWxlSGVscGVyLmdldEZvcm1hdEF0SW5kZXgobW9kZWwuZm9ybWF0cywgc3RhcnRJbmRleCk7XG4gICAgICAgIGxldCBwcmV2Rm9ybWF0OiBGb3JtYXRNb2RlbCA9IG51bGw7XG4gICAgICAgIGxldCBwcmV2Q2hhckNvZGU6IG51bWJlciA9IG51bGw7XG4gICAgICAgIGxldCBwcmV2Rm9udFN0cmluZzogc3RyaW5nID0gbnVsbDtcbiAgICAgICAgbGV0IHByZXZDaGFyOiBzdHJpbmcgPSBudWxsO1xuICAgICAgICBsZXQgZm9udFN0cmluZyA9IENvbnRlbnRTdHlsZUhlbHBlci5nZXRGb250U3R5bGVzU3RyaW5nKGZvcm1hdD8udGV4dFN0eWxlKTtcbiAgICAgICAgbGV0IHN5bWJvbENoYW5nZSA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNoYXIgPSBsaW5lW2ldO1xuICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IEZvbnRNZXRyaWNzLm1lYXN1cmVDaGFyU2l6ZShjaGFyLCBmb250U3RyaW5nKTtcbiAgICAgICAgICAgIGNvbnN0IGN1c3RvbUNvbXBvbmVudCA9IHRoaXMuY3VzdG9tQ29udGVudFNlcnZpY2UuZ2V0Q29tcG9uZW50KGN1c3RvbUNvbXBvbmVudHMsIGNoYXIsIHN0YXJ0SW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgYnJlYWtUeXBlID0gQnJlYWtIZWxwZXIuZ2V0QnJlYWtUeXBlKG1vZGVsLCBjaGFyLCBzdGFydEluZGV4KTtcblxuICAgICAgICAgICAgaWYgKGN1c3RvbUNvbXBvbmVudCAmJiAhYnJlYWtUeXBlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLmN1c3RvbUNvbnRlbnRTZXJ2aWNlLmdldFRva2VuRnJvbUNvbXBvbmVudChcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tQ29tcG9uZW50LFxuICAgICAgICAgICAgICAgICAgICBsaW5lSW5mbyxcbiAgICAgICAgICAgICAgICAgICAgRGlzcGxheVZhbHVlLmN1c3RvbUNvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgIGkgPT09IDAsXG4gICAgICAgICAgICAgICAgICAgIHNpemVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcblxuICAgICAgICAgICAgICAgIHByZXZDaGFyQ29kZSA9IC0xO1xuICAgICAgICAgICAgICAgIHByZXZDaGFyID0gJyc7XG4gICAgICAgICAgICAgICAgY2hhcmFjdGVycyA9IFtdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGFyQ29kZSA9IGNoYXIuY2hhckNvZGVBdCgwKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXNwbGF5VmFsdWUgPSB0aGlzLmdldERpc3BsYXlWYWx1ZShjaGFyQ29kZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNGaXJzdENoYXJhY3RlciA9IGkgPT09IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9rZW4gPSBuZXcgRGlzcGxheVRva2VuKHtcbiAgICAgICAgICAgICAgICAgICAgLi4uc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheVZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBhbGlnbjogbGluZUluZm8uYWxpZ24sXG4gICAgICAgICAgICAgICAgICAgIGluZGVudEZpcnN0TGluZTogaXNGaXJzdENoYXJhY3RlciA/IGxpbmVJbmZvLmluZGVudC5maXJzdExpbmUgOiBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5pbmRlbnRGaXJzdExpbmUsXG4gICAgICAgICAgICAgICAgICAgIGluZGVudEhhbmdpbmc6IGlzRmlyc3RDaGFyYWN0ZXIgPyBsaW5lSW5mby5pbmRlbnQuaGFuZ2luZyA6IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmluZGVudEhhbmdpbmcsXG4gICAgICAgICAgICAgICAgICAgIGluZGVudExlZnQ6IGxpbmVJbmZvLmluZGVudC5sZWZ0LFxuICAgICAgICAgICAgICAgICAgICBpbmRlbnRSaWdodDogbGluZUluZm8uaW5kZW50LnJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICBpbmRlbnRCZWZvcmU6IGxpbmVJbmZvLm9mZnNldEJlZm9yZSxcbiAgICAgICAgICAgICAgICAgICAgaW5kZW50QWZ0ZXI6IGxpbmVJbmZvLm9mZnNldEFmdGVyLFxuICAgICAgICAgICAgICAgICAgICBsaW5lU3BhY2luZzogbGluZUluZm8ubGluZVNwYWNpbmcsXG4gICAgICAgICAgICAgICAgICAgIGlzUGFnZUJyZWFrOiBicmVha1R5cGUgPT09IEJyZWFrVHlwZXMuUGFnZSxcbiAgICAgICAgICAgICAgICAgICAgaXNMaW5lQnJlYWs6IGJyZWFrVHlwZSA9PT0gQnJlYWtUeXBlcy5UZXh0V3JhcHBpbmcsXG4gICAgICAgICAgICAgICAgICAgIGlzVGFiOiBmYWxzZVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBjaGFyQ29kZSAhPT0gcHJldkNoYXJDb2RlIHx8XG4gICAgICAgICAgICAgICAgICAgICFwcmV2Rm9ybWF0IHx8XG4gICAgICAgICAgICAgICAgICAgICFGb3JtYXRTdHlsZUhlbHBlci5hcmVTYW1lVGV4dFN0eWxlcyhmb3JtYXQ/LnRleHRTdHlsZSwgcHJldkZvcm1hdD8udGV4dFN0eWxlKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBzeW1ib2xDaGFuZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PT0gbGluZS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICAgICAgICAgIHN5bWJvbENoYW5nZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVycy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY2hhcmFjdGVycy5sZW5ndGggPiAxICYmIHN5bWJvbENoYW5nZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NDaGFyU2l6ZXMocHJldkNoYXIsIHByZXZGb250U3RyaW5nLCBjaGFyYWN0ZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVycyA9IFt0b2tlbl07XG4gICAgICAgICAgICAgICAgICAgIHN5bWJvbENoYW5nZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ltYm9sQ2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnMgPSBbdG9rZW5dO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHByZXZDaGFyQ29kZSA9IGNoYXJDb2RlO1xuICAgICAgICAgICAgICAgIHByZXZDaGFyID0gY2hhcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHJldkZvcm1hdCA9IGZvcm1hdDtcbiAgICAgICAgICAgIHByZXZGb250U3RyaW5nID0gZm9udFN0cmluZztcbiAgICAgICAgICAgIHN0YXJ0SW5kZXgrKztcblxuICAgICAgICAgICAgaWYgKHN0YXJ0SW5kZXggPiBmb3JtYXQ/LmVuZEluZGV4KSB7XG4gICAgICAgICAgICAgICAgZm9ybWF0ID0gRm9ybWF0U3R5bGVIZWxwZXIuZ2V0Rm9ybWF0QXRJbmRleChtb2RlbC5mb3JtYXRzLCBzdGFydEluZGV4KTtcbiAgICAgICAgICAgICAgICBmb250U3RyaW5nID0gQ29udGVudFN0eWxlSGVscGVyLmdldEZvbnRTdHlsZXNTdHJpbmcoZm9ybWF0Py50ZXh0U3R5bGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRva2VucztcbiAgICB9XG5cbiAgICBwcml2YXRlIHByb2Nlc3NDaGFyU2l6ZXMocHJldkNoYXI6IHN0cmluZywgcHJldkZvbnRTdHJpbmc6IHN0cmluZywgY2hhcmFjdGVyczogRGlzcGxheVRva2VuW10pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbmV3U2l6ZSA9IEZvbnRNZXRyaWNzLm1lYXN1cmVDaGFyU2l6ZShwcmV2Q2hhciwgcHJldkZvbnRTdHJpbmcpO1xuICAgICAgICBmb3IgKGxldCBpdGVtIG9mIGNoYXJhY3RlcnMpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaXRlbSwgbmV3U2l6ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNhbGN1bGF0ZVNwbGl0KGluZGV4OiBudW1iZXIsIHRva2VuczogRGlzcGxheVRva2VuW10pOiBudW1iZXIge1xuICAgICAgICBmb3IgKGxldCBpID0gaW5kZXg7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1doaXRlU3BhY2UodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0uZGlzcGxheVZhbHVlID09PSBEaXNwbGF5VmFsdWUuY3VzdG9tQ29udGVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1doaXRlU3BhY2UodG9rZW46IERpc3BsYXlUb2tlbik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gW0Rpc3BsYXlWYWx1ZS5zcGFjZSwgRGlzcGxheVZhbHVlLmVtcHR5TGluZV0uaW5jbHVkZXModG9rZW4uZGlzcGxheVZhbHVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldExpbmVJbmZvRnJvbVRva2VuKFxuICAgICAgICBwcmV2VG9rZW46IERpc3BsYXlUb2tlbixcbiAgICAgICAgZmlyc3RXcmFwVG9rZW46IERpc3BsYXlUb2tlbixcbiAgICAgICAgd3JhcFRva2VuczogRGlzcGxheVRva2VuW10sXG4gICAgICAgIGlzQWZ0ZXJQYWdlQnJlYWs6IGJvb2xlYW5cbiAgICApOiBMaW5lSW5mb01vZGVsIHtcbiAgICAgICAgY29uc3QgaW5mbyA9IG5ldyBMaW5lSW5mb01vZGVsKHtcbiAgICAgICAgICAgIHdpZHRoOiAwLFxuICAgICAgICAgICAgaGVpZ2h0OiAwLFxuICAgICAgICAgICAgYWxpZ246IHByZXZUb2tlbi5hbGlnbixcbiAgICAgICAgICAgIGluZGVudDogbmV3IEluZGVudE1vZGVsKHByZXZUb2tlbi5pbmRlbnRGaXJzdExpbmUsIHByZXZUb2tlbi5pbmRlbnRIYW5naW5nLCBwcmV2VG9rZW4uaW5kZW50TGVmdCwgcHJldlRva2VuLmluZGVudFJpZ2h0KSxcbiAgICAgICAgICAgIG9mZnNldEJlZm9yZTogcHJldlRva2VuLmluZGVudEJlZm9yZSxcbiAgICAgICAgICAgIG9mZnNldEFmdGVyOiBwcmV2VG9rZW4uaW5kZW50QWZ0ZXIsXG4gICAgICAgICAgICBsaW5lU3BhY2luZzogcHJldlRva2VuLmxpbmVTcGFjaW5nLFxuICAgICAgICAgICAgaXNBZnRlclBhZ2VCcmVhayxcbiAgICAgICAgICAgIGlzRW5kZWRCeVBhZ2VCcmVhazogcHJldlRva2VuLmlzUGFnZUJyZWFrXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChmaXJzdFdyYXBUb2tlbikge1xuICAgICAgICAgICAgaW5mby5hbGlnbiA9IGZpcnN0V3JhcFRva2VuLmFsaWduO1xuICAgICAgICAgICAgaW5mby5pbmRlbnQuZmlyc3RMaW5lID0gZmlyc3RXcmFwVG9rZW4uaW5kZW50Rmlyc3RMaW5lO1xuICAgICAgICAgICAgaW5mby5pbmRlbnQuaGFuZ2luZyA9IGZpcnN0V3JhcFRva2VuLmluZGVudEhhbmdpbmc7XG4gICAgICAgICAgICBpbmZvLmluZGVudC5sZWZ0ID0gZmlyc3RXcmFwVG9rZW4uaW5kZW50TGVmdDtcbiAgICAgICAgICAgIGluZm8uaW5kZW50LnJpZ2h0ID0gZmlyc3RXcmFwVG9rZW4uaW5kZW50UmlnaHQ7XG4gICAgICAgICAgICBpbmZvLm9mZnNldEJlZm9yZSA9IGZpcnN0V3JhcFRva2VuLmluZGVudEJlZm9yZTtcbiAgICAgICAgICAgIGluZm8ub2Zmc2V0QWZ0ZXIgPSBmaXJzdFdyYXBUb2tlbi5pbmRlbnRBZnRlcjtcbiAgICAgICAgICAgIGluZm8ubGluZVNwYWNpbmcgPSBmaXJzdFdyYXBUb2tlbi5saW5lU3BhY2luZztcbiAgICAgICAgICAgIGluZm8uaGFzVGFibGUgPSBmaXJzdFdyYXBUb2tlbi5pc1RhYmxlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGZvbnRTaXplID0gMDtcbiAgICAgICAgbGV0IGFzY2VudCA9IDA7XG4gICAgICAgIGxldCBkZXNjZW50ID0gMDtcbiAgICAgICAgY29uc3QgdG9rZW5zID0gaXNBZnRlclBhZ2VCcmVhayAmJiAhd3JhcFRva2Vucy5sZW5ndGggPyBbcHJldlRva2VuXSA6IHdyYXBUb2tlbnM7XG4gICAgICAgIGZvciAoY29uc3Qgd3JhcFRva2VuIG9mIHRva2Vucykge1xuICAgICAgICAgICAgaWYgKGluZm8uaGVpZ2h0IDwgd3JhcFRva2VuLmhlaWdodCkge1xuICAgICAgICAgICAgICAgIGluZm8uaGVpZ2h0ID0gd3JhcFRva2VuLmhlaWdodDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGZvbnRTaXplIDwgd3JhcFRva2VuLmZvbnQgJiYgd3JhcFRva2VuLmRpc3BsYXlWYWx1ZSAhPT0gRGlzcGxheVZhbHVlLmN1c3RvbUNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICBmb250U2l6ZSA9IHdyYXBUb2tlbi5mb250O1xuICAgICAgICAgICAgICAgIGFzY2VudCA9IHdyYXBUb2tlbi5hc2NlbnQ7XG4gICAgICAgICAgICAgICAgZGVzY2VudCA9IHdyYXBUb2tlbi5kZXNjZW50O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbmZvLndpZHRoICs9IHdyYXBUb2tlbi53aWR0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGluZm8uaGVpZ2h0ID0gaW5mby5oZWlnaHQgfHwgMTg7XG4gICAgICAgIGlmIChpbmZvLmxpbmVTcGFjaW5nID4gMSkge1xuICAgICAgICAgICAgaW5mby5vZmZzZXRBZnRlciA9IChhc2NlbnQgKyBkZXNjZW50KSAqIChpbmZvLmxpbmVTcGFjaW5nIC0gMSk7XG4gICAgICAgIH0gZWxzZSBpZiAoYXNjZW50ICsgZGVzY2VudCA9PT0gaW5mby5oZWlnaHQpIHtcbiAgICAgICAgICAgIGluZm8uaGVpZ2h0ID0gaW5mby5oZWlnaHQgKiBpbmZvLmxpbmVTcGFjaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXREaXNwbGF5VmFsdWUoY2hhckNvZGU6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGlmIChjaGFyQ29kZSA9PT0gMzIpIHtcbiAgICAgICAgICAgIHJldHVybiBEaXNwbGF5VmFsdWUuc3BhY2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKGNoYXJDb2RlID4gMzkgJiYgY2hhckNvZGUgPCA0OCkgfHwgKGNoYXJDb2RlID4gNTcgJiYgY2hhckNvZGUgPCA2NCkpIHtcbiAgICAgICAgICAgIHJldHVybiBEaXNwbGF5VmFsdWUucHVuY3R1YXRpb247XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gRGlzcGxheVZhbHVlLmNoYXI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRMaW5lSW5mb0J5QnJlYWtNb2RpZmllcihpbmRleDogbnVtYmVyKTogTGluZUluZm9Nb2RlbCB7XG4gICAgICAgIGNvbnN0IHBhcmFncmFwaCA9IFBhcmFncmFwaFN0eWxlSGVscGVyLmdldFBhcmFncmFwaEF0SW5kZXgodGhpcy5tb2RlbC5wYXJhZ3JhcGhzLCBpbmRleCk7XG4gICAgICAgIGlmICghcGFyYWdyYXBoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IExpbmVJbmZvTW9kZWwoe1xuICAgICAgICAgICAgICAgIGFsaWduOiBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5hbGlnbm1lbnQsXG4gICAgICAgICAgICAgICAgaW5kZW50OiBuZXcgSW5kZW50TW9kZWwoXG4gICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmluZGVudEZpcnN0TGluZSxcbiAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUuaW5kZW50SGFuZ2luZyxcbiAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUuaW5kZW50TGVmdCxcbiAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUuaW5kZW50UmlnaHRcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIG9mZnNldEJlZm9yZTogREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUuc3BhY2VCZWZvcmUsXG4gICAgICAgICAgICAgICAgb2Zmc2V0QWZ0ZXI6IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLnNwYWNlQWZ0ZXIsXG4gICAgICAgICAgICAgICAgbGluZVNwYWNpbmc6IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmxpbmVTcGFjaW5nXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluZGVudExlZnQgPSB0aGlzLmdldFBhcmFncmFwaEluZGVudExlZnQocGFyYWdyYXBoKTtcbiAgICAgICAgY29uc3QgaW5kZW50SGFuZ2luZyA9IHBhcmFncmFwaC5wYXJhZ3JhcGhTdHlsZS5udW1iZXJpbmdJZCA9PT0gbnVsbCA/IHBhcmFncmFwaC5wYXJhZ3JhcGhTdHlsZS5pbmRlbnRIYW5naW5nIDogMDtcblxuICAgICAgICByZXR1cm4gbmV3IExpbmVJbmZvTW9kZWwoe1xuICAgICAgICAgICAgYWxpZ246IHBhcmFncmFwaC5wYXJhZ3JhcGhTdHlsZS5hbGlnbm1lbnQgPz8gREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUuYWxpZ25tZW50LFxuICAgICAgICAgICAgaW5kZW50OiBuZXcgSW5kZW50TW9kZWwoXG4gICAgICAgICAgICAgICAgcGFyYWdyYXBoLnBhcmFncmFwaFN0eWxlLmluZGVudEZpcnN0TGluZSA/PyBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5pbmRlbnRGaXJzdExpbmUsXG4gICAgICAgICAgICAgICAgaW5kZW50SGFuZ2luZyA/PyBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5pbmRlbnRIYW5naW5nLFxuICAgICAgICAgICAgICAgIGluZGVudExlZnQgPz8gREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUuaW5kZW50TGVmdCxcbiAgICAgICAgICAgICAgICBwYXJhZ3JhcGgucGFyYWdyYXBoU3R5bGUuaW5kZW50UmlnaHQgPz8gREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUuaW5kZW50UmlnaHRcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBvZmZzZXRCZWZvcmU6IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLnNwYWNlQmVmb3JlLFxuICAgICAgICAgICAgb2Zmc2V0QWZ0ZXI6IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLnNwYWNlQWZ0ZXIsXG4gICAgICAgICAgICBsaW5lU3BhY2luZzogcGFyYWdyYXBoLnBhcmFncmFwaFN0eWxlLmxpbmVTcGFjaW5nID8/IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmxpbmVTcGFjaW5nXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UGFyYWdyYXBoSW5kZW50TGVmdChwYXJhZ3JhcGg6IFBhcmFncmFwaE1vZGVsKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IHBhcmFncmFwaEluZGVudCA9IHBhcmFncmFwaC5wYXJhZ3JhcGhTdHlsZS5pbmRlbnRMZWZ0O1xuICAgICAgICBjb25zdCBudW1iZXJpbmdJZCA9IHBhcmFncmFwaC5wYXJhZ3JhcGhTdHlsZS5udW1iZXJpbmdJZDtcbiAgICAgICAgaWYgKG51bWJlcmluZ0lkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBsZXZlbCA9IHBhcmFncmFwaC5wYXJhZ3JhcGhTdHlsZS5udW1iZXJpbmdMZXZlbDtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFncmFwaEluZGV4ID0gdGhpcy5tb2RlbC5wYXJhZ3JhcGhzLmluZGV4T2YocGFyYWdyYXBoKTtcbiAgICAgICAgICAgIGNvbnN0IGxldmVsTW9kZWwgPSBOdW1iZXJpbmdIZWxwZXIuZmluZCh0aGlzLnByb3BlcnRpZXMubnVtYmVyaW5ncywgbnVtYmVyaW5nSWQsIGxldmVsKTtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFncmFwaEZvcm1hdCA9IEZvcm1hdFN0eWxlSGVscGVyLmdldEZvcm1hdEF0SW5kZXgodGhpcy5tb2RlbC5mb3JtYXRzLCBwYXJhZ3JhcGguaW5zZXJ0SW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgbWFya2VyVGV4dFN0eWxlID0gRm9ybWF0U3R5bGVIZWxwZXIuY29tYmluZVRleHRTdHlsZXMobGV2ZWxNb2RlbC5tYXJrZXJTdHlsZSwgcGFyYWdyYXBoRm9ybWF0LnRleHRTdHlsZSk7XG4gICAgICAgICAgICBsZXQgbWFya2VyV2lkdGggPSB0aGlzLnBhZ2VzV3JhcC5wYXJhZ3JhcGhzW3BhcmFncmFwaEluZGV4XT8ubnVtYmVyaW5nRGF0YT8ud2lkdGg7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIXRoaXMucGFnZXNXcmFwLnBhcmFncmFwaHNbcGFyYWdyYXBoSW5kZXhdPy5udW1iZXJpbmdEYXRhLm1hcmtlclRleHRTdHlsZSB8fFxuICAgICAgICAgICAgICAgICFGb3JtYXRTdHlsZUhlbHBlci5hcmVTYW1lVGV4dFN0eWxlcyhcbiAgICAgICAgICAgICAgICAgICAgbWFya2VyVGV4dFN0eWxlLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2VzV3JhcC5wYXJhZ3JhcGhzW3BhcmFncmFwaEluZGV4XS5udW1iZXJpbmdEYXRhLm1hcmtlclRleHRTdHlsZVxuICAgICAgICAgICAgICAgICkgfHxcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2VzV3JhcC5wYXJhZ3JhcGhzW3BhcmFncmFwaEluZGV4XS5udW1iZXJpbmdEYXRhLm51bWJlcmluZ0lkICE9PSBudW1iZXJpbmdJZFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFya2VyID0gTnVtYmVyaW5nSGVscGVyLmdldE1hcmtlcihsZXZlbE1vZGVsLCBudW1iZXJpbmdJZCwgdGhpcy5tb2RlbC5wYXJhZ3JhcGhzLCBwYXJhZ3JhcGhJbmRleCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFya2VyU2l6ZXMgPSBOdW1iZXJpbmdIZWxwZXIuZ2V0TWFya2VyU2l6ZXMobWFya2VyLCBtYXJrZXJUZXh0U3R5bGUpO1xuICAgICAgICAgICAgICAgIG1hcmtlcldpZHRoID0gbWFya2VyU2l6ZXMud2lkdGg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGhhbmdpbmdJbmRlbnQgPSBwYXJhZ3JhcGgucGFyYWdyYXBoU3R5bGUuaW5kZW50SGFuZ2luZ1xuICAgICAgICAgICAgICAgID8gcGFyYWdyYXBoLnBhcmFncmFwaFN0eWxlLmluZGVudEhhbmdpbmdcbiAgICAgICAgICAgICAgICA6IGxldmVsTW9kZWwuaW5kZW50SGFuZ2luZztcbiAgICAgICAgICAgIHBhcmFncmFwaEluZGVudCA9IGxldmVsTW9kZWwuaW5kZW50TGVmdDtcbiAgICAgICAgICAgIGlmIChtYXJrZXJXaWR0aCA+PSBoYW5naW5nSW5kZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFya2VyT3ZlcmZsb3cgPSBtYXJrZXJXaWR0aCAtIGhhbmdpbmdJbmRlbnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgYWRkaXRpb25hbE1hcmtlckluZGVudCA9IFRhYkhlbHBlci5jYWxjdWxhdGVUYWJXaWR0aChcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWxNb2RlbC5pbmRlbnRMZWZ0ICsgbWFya2VyT3ZlcmZsb3csXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcGVydGllcy5kZWZhdWx0VGFiV2lkdGhcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHBhcmFncmFwaEluZGVudCArPSBtYXJrZXJPdmVyZmxvdyArIGFkZGl0aW9uYWxNYXJrZXJJbmRlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGFyYWdyYXBoSW5kZW50O1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlVGV4dFN0eWxlcyhzdHlsZXM6IHsgW2tleTogc3RyaW5nXTogYW55W10gfSwgc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyKTogRm9ybWF0TW9kZWwge1xuICAgICAgICBsZXQgdGV4dFN0eWxlcyA9IEZvcm1hdFN0eWxlSGVscGVyLmdldEZvcm1hdHNBdFJhbmdlKHRoaXMubW9kZWwuZm9ybWF0cywgc3RhcnRJbmRleCwgZW5kSW5kZXgpLm1hcChmb3JtYXQgPT4gZm9ybWF0LnRleHRTdHlsZSk7XG4gICAgICAgIGxldCBwcmV2Rm9ybWF0OiBGb3JtYXRNb2RlbDtcbiAgICAgICAgaWYgKCF0ZXh0U3R5bGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgcHJldkZvcm1hdCA9IEZvcm1hdFN0eWxlSGVscGVyLmdldFByZXZGb3JtYXRBdEluZGV4KHRoaXMubW9kZWwuZm9ybWF0cywgc3RhcnRJbmRleCk7XG5cbiAgICAgICAgICAgIGlmIChwcmV2Rm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgdGV4dFN0eWxlcyA9IFtwcmV2Rm9ybWF0LnRleHRTdHlsZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHRleHRTdHlsZSBvZiB0ZXh0U3R5bGVzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0ZXh0U3R5bGUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlc1trZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlc1trZXldLnB1c2godGV4dFN0eWxlW2tleV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcmV2Rm9ybWF0O1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlUGFyYWdyYXBoU3R5bGVzKHN0eWxlczogeyBba2V5OiBzdHJpbmddOiBhbnlbXSB9LCBzdGFydEluZGV4OiBudW1iZXIsIGVuZEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoU3R5bGVzID0gUGFyYWdyYXBoU3R5bGVIZWxwZXIuZ2V0UGFyYWdyYXBoc0F0UmFuZ2UodGhpcy5tb2RlbC5wYXJhZ3JhcGhzLCBzdGFydEluZGV4LCBlbmRJbmRleCkubWFwKFxuICAgICAgICAgICAgcGFyYWdyYXBoID0+IHBhcmFncmFwaC5wYXJhZ3JhcGhTdHlsZVxuICAgICAgICApO1xuICAgICAgICBmb3IgKGNvbnN0IHBhcmFncmFwaFN0eWxlIG9mIHBhcmFncmFwaFN0eWxlcykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocGFyYWdyYXBoU3R5bGUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlc1trZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlc1trZXldLnB1c2gocGFyYWdyYXBoU3R5bGVba2V5XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVOdW1iZXJpbmdTdHlsZXMoc3R5bGVzOiB7IFtrZXk6IHN0cmluZ106IGFueVtdIH0sIHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBwYXJhZ3JhcGhTdHlsZXMgPSBQYXJhZ3JhcGhTdHlsZUhlbHBlci5nZXRQYXJhZ3JhcGhzQXRSYW5nZSh0aGlzLm1vZGVsLnBhcmFncmFwaHMsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KS5tYXAoXG4gICAgICAgICAgICBwYXJhZ3JhcGggPT4gcGFyYWdyYXBoLnBhcmFncmFwaFN0eWxlXG4gICAgICAgICk7XG4gICAgICAgIGZvciAoY29uc3QgcGFyYWdyYXBoU3R5bGUgb2YgcGFyYWdyYXBoU3R5bGVzKSB7XG4gICAgICAgICAgICBpZiAocGFyYWdyYXBoU3R5bGUubnVtYmVyaW5nSWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBudW1iZXJpbmdMZXZlbHMgPSB0aGlzLnByb3BlcnRpZXMubnVtYmVyaW5ncy5maW5kKHggPT4geC5udW1iZXJpbmdJZCA9PT0gcGFyYWdyYXBoU3R5bGUubnVtYmVyaW5nSWQpLmxldmVscztcbiAgICAgICAgICAgICAgICBjb25zdCBsZXZlbHNNYXJrZXJTdHlsZXMgPSBudW1iZXJpbmdMZXZlbHMucmVkdWNlKChwcmV2LCBuZXh0KSA9PiBgJHtwcmV2fSR7bmV4dC5tYXJrZXJ9JHtuZXh0Lm1hcmtlclR5cGV9YCwgJycpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxldmVsID0gbnVtYmVyaW5nTGV2ZWxzLmZpbmQoeCA9PiB4LmxldmVsID09PSBwYXJhZ3JhcGhTdHlsZS5udW1iZXJpbmdMZXZlbCk7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNCdWxsZXRNYXJrZXIgPSBsZXZlbC5tYXJrZXJUeXBlID09PSBOdW1iZXJpbmdNYXJrZXJUeXBlLkJ1bGxldDtcbiAgICAgICAgICAgICAgICBzdHlsZXNbJ2lzQnVsbGV0TWFya2VyJ10ucHVzaChpc0J1bGxldE1hcmtlcik7XG4gICAgICAgICAgICAgICAgc3R5bGVzWydudW1iZXJpbmdMZXZlbHNTdHlsZXMnXS5wdXNoKGxldmVsc01hcmtlclN0eWxlcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0eWxlc1snaXNCdWxsZXRNYXJrZXInXS5wdXNoKG51bGwpO1xuICAgICAgICAgICAgICAgIHN0eWxlc1snbnVtYmVyaW5nTGV2ZWxzU3R5bGVzJ10ucHVzaCgnJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEltYWdlV2l0aEFsbG93ZWRTaXplKGltYWdlRGF0YTogSW1hZ2VEYXRhTW9kZWwsIG1heFdpZHRoOiBudW1iZXIpOiBJbWFnZURhdGFNb2RlbCB7XG4gICAgICAgIGlmIChpbWFnZURhdGEud2lkdGggPD0gbWF4V2lkdGgpIHtcbiAgICAgICAgICAgIHJldHVybiBpbWFnZURhdGE7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhc3BlY3RSYXRpbyA9IGltYWdlRGF0YS53aWR0aCAvIGltYWdlRGF0YS5oZWlnaHQ7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IG1heFdpZHRoIC8gYXNwZWN0UmF0aW87XG4gICAgICAgIHJldHVybiBuZXcgSW1hZ2VEYXRhTW9kZWwoeyB3aWR0aDogTWF0aC5yb3VuZChtYXhXaWR0aCksIGhlaWdodDogTWF0aC5yb3VuZChoZWlnaHQpLCBjb250ZW50OiBpbWFnZURhdGEuY29udGVudCB9KTtcbiAgICB9XG59XG4iXX0=