@talrace/ngx-noder 0.0.18 → 0.0.20

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 (288) hide show
  1. package/fesm2022/talrace-ngx-noder.mjs +181 -181
  2. package/fesm2022/talrace-ngx-noder.mjs.map +1 -1
  3. package/lib/apart-components/editor-toolbar/components/base-toolbar.component.d.ts +1 -1
  4. package/lib/editor/components/external-element/external.component.d.ts +1 -1
  5. package/lib/editor/components/shared/abstract/base.component.d.ts +1 -1
  6. package/lib/editor/components/shared/abstract/destroy.component.d.ts +1 -1
  7. package/package.json +1 -3
  8. package/src/lib/apart-components/add-link-dialog/_add-link-dialog.theme.scss +3 -6
  9. package/src/lib/apart-components/add-link-mobile/_add-link-mobile.theme.scss +4 -7
  10. package/src/lib/apart-components/confirm-dialog/_theme.scss +6 -9
  11. package/src/lib/apart-components/editor-title/_editor-title.theme.scss +6 -9
  12. package/src/lib/apart-components/editor-title-mobile/_editor-title-mobile.theme.scss +9 -12
  13. package/src/lib/apart-components/editor-toolbar/_editor-toolbar.theme.scss +5 -8
  14. package/src/lib/apart-components/editor-toolbar/components/buttons/color-picker/_color-picker.theme.scss +1 -3
  15. package/src/lib/apart-components/editor-toolbar/components/buttons/font/_font.theme.scss +1 -3
  16. package/src/lib/apart-components/editor-toolbar/components/buttons/font-size/_font-size.theme.scss +2 -5
  17. package/src/lib/apart-components/editor-toolbar/components/buttons/font-style/_font-style.theme.scss +3 -6
  18. package/src/lib/apart-components/editor-toolbar/components/buttons/format/_format.theme.scss +3 -6
  19. package/src/lib/apart-components/editor-toolbar/components/buttons/numbering/_numbering.theme.scss +15 -18
  20. package/src/lib/apart-components/editor-toolbar/components/buttons/undo-redo/_undo-redo.theme.scss +2 -4
  21. package/src/lib/apart-components/editor-toolbar/components/menu-dropdowns/_menu-dropdowns.theme.scss +5 -8
  22. package/src/lib/apart-components/editor-toolbar/components/menu-dropdowns-mobile/_menu-dropdowns-mobile.theme.scss +6 -9
  23. package/src/lib/apart-components/editor-toolbar/components/toolbar-actions/_toolbar-actions.theme.scss +3 -6
  24. package/src/lib/apart-components/insert-table/_insert-table.theme.scss +6 -9
  25. package/src/lib/apart-components/insert-table-mobile/_insert-table-mobile.theme.scss +12 -15
  26. package/src/lib/apart-components/text-format-mobile/_text-format-mobile.theme.scss +22 -25
  27. package/src/lib/editor/components/_editor.theme.scss +25 -28
  28. package/esm2022/lib/apart-components/add-link-dialog/add-link-dialog.component.mjs +0 -73
  29. package/esm2022/lib/apart-components/add-link-dialog/validation.helper.mjs +0 -7
  30. package/esm2022/lib/apart-components/add-link-mobile/add-link-mobile.component.mjs +0 -49
  31. package/esm2022/lib/apart-components/confirm-dialog/confirm-dialog.component.mjs +0 -34
  32. package/esm2022/lib/apart-components/editor-search/editor-search-dialog.component.mjs +0 -75
  33. package/esm2022/lib/apart-components/editor-title/editor-title.component.mjs +0 -95
  34. package/esm2022/lib/apart-components/editor-title-mobile/editor-title-mobile.component.mjs +0 -24
  35. package/esm2022/lib/apart-components/editor-toolbar/components/base-toolbar.component.mjs +0 -117
  36. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/color-picker/color-picker.component.mjs +0 -37
  37. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/font/font.component.mjs +0 -49
  38. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/font-size/font-size.component.mjs +0 -90
  39. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/font-style/font-style.component.mjs +0 -81
  40. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/format/format.component.mjs +0 -28
  41. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/numbering/numbering.component.mjs +0 -53
  42. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/print/print.component.mjs +0 -18
  43. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/undo-redo/undo-redo.component.mjs +0 -27
  44. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/zoom/zoom.component.mjs +0 -71
  45. package/esm2022/lib/apart-components/editor-toolbar/components/menu-dropdowns/menu-dropdowns.component.mjs +0 -107
  46. package/esm2022/lib/apart-components/editor-toolbar/components/menu-dropdowns-mobile/menu-dropdowns-mobile.component.mjs +0 -25
  47. package/esm2022/lib/apart-components/editor-toolbar/components/toolbar-actions/toolbar-actions.component.mjs +0 -65
  48. package/esm2022/lib/apart-components/editor-toolbar/editor-mobile-toolbar/editor-mobile-toolbar.component.mjs +0 -86
  49. package/esm2022/lib/apart-components/editor-toolbar/editor-toolbar/editor-toolbar.component.mjs +0 -90
  50. package/esm2022/lib/apart-components/editor-toolbar/editor-toolbar.module.mjs +0 -122
  51. package/esm2022/lib/apart-components/editor-toolbar/shared/constants/editor-toolbar-modes.const.mjs +0 -8
  52. package/esm2022/lib/apart-components/editor-toolbar/shared/constants/numbering-templates.const.mjs +0 -1148
  53. package/esm2022/lib/apart-components/editor-toolbar/shared/constants/svg-icons.const.mjs +0 -157
  54. package/esm2022/lib/apart-components/editor-toolbar/shared/enums/alignment.enum.mjs +0 -8
  55. package/esm2022/lib/apart-components/editor-toolbar/shared/enums/editor-toolbar-mode.enum.mjs +0 -11
  56. package/esm2022/lib/apart-components/editor-toolbar/shared/enums/numbering-template-type.enum.mjs +0 -16
  57. package/esm2022/lib/apart-components/editor-toolbar/shared/enums/numbering-type.enum.mjs +0 -6
  58. package/esm2022/lib/apart-components/editor-toolbar/shared/services/custom-icon.service.mjs +0 -34
  59. package/esm2022/lib/apart-components/editor-toolbar/shared/services/editor-toolbar.service.mjs +0 -26
  60. package/esm2022/lib/apart-components/editor-toolbar/shared/services/toolbar-core.service.mjs +0 -60
  61. package/esm2022/lib/apart-components/editor-toolbar/shared/toolbar-styles.helper.mjs +0 -48
  62. package/esm2022/lib/apart-components/insert-table/insert-table.component.mjs +0 -54
  63. package/esm2022/lib/apart-components/insert-table-mobile/insert-table-mobile.component.mjs +0 -86
  64. package/esm2022/lib/apart-components/text-format-mobile/text-format-mobile.component.mjs +0 -134
  65. package/esm2022/lib/editor/components/edges/edge-element.model.mjs +0 -38
  66. package/esm2022/lib/editor/components/edges/edge-type.enum.mjs +0 -6
  67. package/esm2022/lib/editor/components/edges/edge.component.mjs +0 -141
  68. package/esm2022/lib/editor/components/edges/edges.mjs +0 -120
  69. package/esm2022/lib/editor/components/edges/page-type.enum.mjs +0 -7
  70. package/esm2022/lib/editor/components/editor.component.mjs +0 -112
  71. package/esm2022/lib/editor/components/external-element/external-element.service.mjs +0 -6
  72. package/esm2022/lib/editor/components/external-element/external-elements.const.mjs +0 -4
  73. package/esm2022/lib/editor/components/external-element/external-sidenav.interface.mjs +0 -2
  74. package/esm2022/lib/editor/components/external-element/external.component.mjs +0 -41
  75. package/esm2022/lib/editor/components/external-element/models/element-data.model.mjs +0 -9
  76. package/esm2022/lib/editor/components/external-element/models/external-element.model.mjs +0 -11
  77. package/esm2022/lib/editor/components/external-element/models/external-sidenav.model.mjs +0 -15
  78. package/esm2022/lib/editor/components/image/components/image.component.mjs +0 -88
  79. package/esm2022/lib/editor/components/image/image-api.service.mjs +0 -36
  80. package/esm2022/lib/editor/components/image/input-handler/image-input.handler.mjs +0 -46
  81. package/esm2022/lib/editor/components/image/resizer/coordinate.mjs +0 -2
  82. package/esm2022/lib/editor/components/image/resizer/direction-wrapper.mjs +0 -19
  83. package/esm2022/lib/editor/components/image/resizer/direction.enum.mjs +0 -12
  84. package/esm2022/lib/editor/components/image/resizer/resizer.component.mjs +0 -106
  85. package/esm2022/lib/editor/components/image/resizer/size-delta.mjs +0 -2
  86. package/esm2022/lib/editor/components/image/resizer/size-wrapper.mjs +0 -52
  87. package/esm2022/lib/editor/components/image/size.mjs +0 -2
  88. package/esm2022/lib/editor/components/shared/abstract/base.component.mjs +0 -60
  89. package/esm2022/lib/editor/components/shared/abstract/destroy.component.mjs +0 -18
  90. package/esm2022/lib/editor/components/shared/custom-component.hepler.mjs +0 -43
  91. package/esm2022/lib/editor/components/shared/custom-components.interface.mjs +0 -2
  92. package/esm2022/lib/editor/components/shared/custom-content-markers.const.mjs +0 -3
  93. package/esm2022/lib/editor/components/shared/custom-content.mjs +0 -2
  94. package/esm2022/lib/editor/components/shared/services/component.service.mjs +0 -52
  95. package/esm2022/lib/editor/components/shared/services/custom-content.service.mjs +0 -123
  96. package/esm2022/lib/editor/components/shared/services/overlay.service.mjs +0 -55
  97. package/esm2022/lib/editor/components/tab/tab.component.mjs +0 -44
  98. package/esm2022/lib/editor/components/tab/tab.helper.mjs +0 -6
  99. package/esm2022/lib/editor/components/table/cell-resizer/cell-resizer.mjs +0 -118
  100. package/esm2022/lib/editor/components/table/components/table-cell.component.mjs +0 -99
  101. package/esm2022/lib/editor/components/table/components/table.component.mjs +0 -412
  102. package/esm2022/lib/editor/components/table/enums/hrule.enum.mjs +0 -7
  103. package/esm2022/lib/editor/components/table/enums/reisizer-side.enum.mjs +0 -8
  104. package/esm2022/lib/editor/components/table/enums/vertical-merge.enum.mjs +0 -6
  105. package/esm2022/lib/editor/components/table/models/cell-data.model.mjs +0 -17
  106. package/esm2022/lib/editor/components/table/models/cell-resizer-parameters.model.mjs +0 -9
  107. package/esm2022/lib/editor/components/table/models/row-data.model.mjs +0 -8
  108. package/esm2022/lib/editor/components/table/models/selection-range.model.mjs +0 -7
  109. package/esm2022/lib/editor/components/table/overlay-menu/overlay-menu.component.mjs +0 -84
  110. package/esm2022/lib/editor/components/table/selection/table-selection.mjs +0 -383
  111. package/esm2022/lib/editor/content/constants/display-values.const.mjs +0 -8
  112. package/esm2022/lib/editor/content/constants/document-info.const.mjs +0 -13
  113. package/esm2022/lib/editor/content/constants/editor.const.mjs +0 -70
  114. package/esm2022/lib/editor/content/contents.interface.mjs +0 -2
  115. package/esm2022/lib/editor/content/display-data/display-data.mjs +0 -839
  116. package/esm2022/lib/editor/content/display-data/display-token.model.mjs +0 -12
  117. package/esm2022/lib/editor/content/display-data/format-ext.model.mjs +0 -10
  118. package/esm2022/lib/editor/content/display-data/general-properties.model.mjs +0 -11
  119. package/esm2022/lib/editor/content/display-data/indent.model.mjs +0 -9
  120. package/esm2022/lib/editor/content/display-data/line-info.model.mjs +0 -9
  121. package/esm2022/lib/editor/content/display-data/lines.mjs +0 -96
  122. package/esm2022/lib/editor/content/display-data/models/paragraph-info.model.mjs +0 -8
  123. package/esm2022/lib/editor/content/display-data/paragraph-info.interface.mjs +0 -2
  124. package/esm2022/lib/editor/content/display-data/paragraph.mjs +0 -56
  125. package/esm2022/lib/editor/content/display-data/text-line-info.mjs +0 -35
  126. package/esm2022/lib/editor/content/display-data/toolbar-styles.interface.mjs +0 -2
  127. package/esm2022/lib/editor/content/helpers/content-style.helper.mjs +0 -78
  128. package/esm2022/lib/editor/content/helpers/display-token.helper.mjs +0 -62
  129. package/esm2022/lib/editor/content/helpers/format.helper.mjs +0 -23
  130. package/esm2022/lib/editor/content/helpers/indexed-element.helper.mjs +0 -6
  131. package/esm2022/lib/editor/content/helpers/link.helper.mjs +0 -42
  132. package/esm2022/lib/editor/content/helpers/scaling.helper.mjs +0 -9
  133. package/esm2022/lib/editor/content/margin.model.mjs +0 -16
  134. package/esm2022/lib/editor/content/page-vertical-data.model.mjs +0 -9
  135. package/esm2022/lib/editor/content/vertical-alignment.enum.mjs +0 -11
  136. package/esm2022/lib/editor/core/event-emitting.mjs +0 -56
  137. package/esm2022/lib/editor/display/cell.interface.mjs +0 -2
  138. package/esm2022/lib/editor/display/event.helper.mjs +0 -18
  139. package/esm2022/lib/editor/display/layers/cursor.layer.mjs +0 -102
  140. package/esm2022/lib/editor/display/layers/layer.config.mjs +0 -2
  141. package/esm2022/lib/editor/display/layers/pages.layer.mjs +0 -109
  142. package/esm2022/lib/editor/display/layers/print.pages.layer.mjs +0 -7
  143. package/esm2022/lib/editor/display/layers/print.text.layer.mjs +0 -7
  144. package/esm2022/lib/editor/display/layers/selection.layer.mjs +0 -119
  145. package/esm2022/lib/editor/display/layers/text.layer.mjs +0 -226
  146. package/esm2022/lib/editor/display/print/print.helper.mjs +0 -40
  147. package/esm2022/lib/editor/display/print/print.renderer.mjs +0 -67
  148. package/esm2022/lib/editor/display/print/print.rendering.helper.mjs +0 -7
  149. package/esm2022/lib/editor/display/render-changes.interface.mjs +0 -2
  150. package/esm2022/lib/editor/display/render-changes.model.mjs +0 -25
  151. package/esm2022/lib/editor/display/renderer.mjs +0 -204
  152. package/esm2022/lib/editor/display/rendering.helper.mjs +0 -185
  153. package/esm2022/lib/editor/display/renderloop.mjs +0 -26
  154. package/esm2022/lib/editor/display/virtual.renderer.mjs +0 -284
  155. package/esm2022/lib/editor/display/visible-range.interface.mjs +0 -2
  156. package/esm2022/lib/editor/editor.module.mjs +0 -91
  157. package/esm2022/lib/editor/execution/distance.model.mjs +0 -10
  158. package/esm2022/lib/editor/execution/edit.session.mjs +0 -602
  159. package/esm2022/lib/editor/execution/editor.mjs +0 -1368
  160. package/esm2022/lib/editor/execution/helpers/dom.helper.mjs +0 -42
  161. package/esm2022/lib/editor/execution/helpers/format-style.helper.mjs +0 -73
  162. package/esm2022/lib/editor/execution/helpers/image.helpet.mjs +0 -12
  163. package/esm2022/lib/editor/execution/helpers/page.helper.mjs +0 -12
  164. package/esm2022/lib/editor/execution/helpers/paragraph-style.helper.mjs +0 -41
  165. package/esm2022/lib/editor/execution/helpers/paragraph.helper.mjs +0 -177
  166. package/esm2022/lib/editor/execution/regulator.service.mjs +0 -212
  167. package/esm2022/lib/editor/execution/targeting/cell-session-source.model.mjs +0 -18
  168. package/esm2022/lib/editor/execution/targeting/edge-session-source.model.mjs +0 -14
  169. package/esm2022/lib/editor/execution/targeting/main-session-source.model.mjs +0 -8
  170. package/esm2022/lib/editor/execution/targeting/session-source.model.mjs +0 -3
  171. package/esm2022/lib/editor/execution/targeting/session.model.mjs +0 -10
  172. package/esm2022/lib/editor/gadgets/font-metrics/editor-version.const.mjs +0 -2
  173. package/esm2022/lib/editor/gadgets/font-metrics/font-metric-size.interface.mjs +0 -2
  174. package/esm2022/lib/editor/gadgets/font-metrics/font-metrics.helper.mjs +0 -88
  175. package/esm2022/lib/editor/gadgets/history/operation-history.mjs +0 -208
  176. package/esm2022/lib/editor/gadgets/history/operation.type.mjs +0 -2
  177. package/esm2022/lib/editor/gadgets/history/operations-history-info.model.mjs +0 -7
  178. package/esm2022/lib/editor/gadgets/numbering/numbering-data.model.mjs +0 -9
  179. package/esm2022/lib/editor/gadgets/numbering/numbering-marker-type.enum.mjs +0 -12
  180. package/esm2022/lib/editor/gadgets/numbering/numbering-paragraph-style.model.mjs +0 -13
  181. package/esm2022/lib/editor/gadgets/numbering/numbering.helper.mjs +0 -149
  182. package/esm2022/lib/editor/gadgets/page-break/break-types.enum.mjs +0 -7
  183. package/esm2022/lib/editor/gadgets/page-break/break.helper.mjs +0 -18
  184. package/esm2022/lib/editor/gadgets/scrollbar.mjs +0 -86
  185. package/esm2022/lib/editor/gadgets/search/replace.interface.mjs +0 -2
  186. package/esm2022/lib/editor/gadgets/search/search-iteration.interface.mjs +0 -2
  187. package/esm2022/lib/editor/gadgets/search/search.mjs +0 -231
  188. package/esm2022/lib/editor/gadgets/unicode/unicode-chars.const.mjs +0 -5
  189. package/esm2022/lib/editor/gadgets/unicode/unicode.helper.mjs +0 -20
  190. package/esm2022/lib/editor/interaction/base.handler.mjs +0 -19
  191. package/esm2022/lib/editor/interaction/document.handler.mjs +0 -27
  192. package/esm2022/lib/editor/interaction/editor.service.mjs +0 -386
  193. package/esm2022/lib/editor/interaction/input.handler.mjs +0 -152
  194. package/esm2022/lib/editor/interaction/mode.enum.mjs +0 -7
  195. package/esm2022/lib/editor/interaction/mouse-button.enum.mjs +0 -7
  196. package/esm2022/lib/editor/interaction/mouse.handler.mjs +0 -50
  197. package/esm2022/lib/editor/interaction/text-input.mjs +0 -53
  198. package/esm2022/lib/editor/operations/commands.service.mjs +0 -20
  199. package/esm2022/lib/editor/operations/enums/command-type.enum.mjs +0 -32
  200. package/esm2022/lib/editor/operations/enums/target-type.enum.mjs +0 -7
  201. package/esm2022/lib/editor/operations/helpers/break-operations.helper.mjs +0 -9
  202. package/esm2022/lib/editor/operations/helpers/content-operations.helper.mjs +0 -15
  203. package/esm2022/lib/editor/operations/helpers/format-operations.helper.mjs +0 -85
  204. package/esm2022/lib/editor/operations/helpers/image-operations.helper.mjs +0 -19
  205. package/esm2022/lib/editor/operations/helpers/indexed-element-operations.helper.mjs +0 -43
  206. package/esm2022/lib/editor/operations/helpers/link-operations.helper.mjs +0 -136
  207. package/esm2022/lib/editor/operations/helpers/numbering-operations.helper.mjs +0 -55
  208. package/esm2022/lib/editor/operations/helpers/paragraph-operations.helper.mjs +0 -114
  209. package/esm2022/lib/editor/operations/helpers/tab-operations.helper.mjs +0 -16
  210. package/esm2022/lib/editor/operations/helpers/table-operations.helper.mjs +0 -374
  211. package/esm2022/lib/editor/operations/operations-helper.helper.mjs +0 -438
  212. package/esm2022/lib/editor/operations/save-commands.helper.mjs +0 -128
  213. package/esm2022/lib/editor/operations/target-operations.helper.mjs +0 -23
  214. package/esm2022/lib/editor/positioning/alignments.const.mjs +0 -8
  215. package/esm2022/lib/editor/positioning/content.helper.mjs +0 -45
  216. package/esm2022/lib/editor/positioning/cursor-paragraph.mjs +0 -13
  217. package/esm2022/lib/editor/positioning/cursor-position.interface.mjs +0 -2
  218. package/esm2022/lib/editor/positioning/insert-index.interface.mjs +0 -2
  219. package/esm2022/lib/editor/positioning/line-width.helper.mjs +0 -13
  220. package/esm2022/lib/editor/positioning/position.helper.mjs +0 -210
  221. package/esm2022/lib/editor/positioning/range.mjs +0 -94
  222. package/esm2022/lib/editor/positioning/selection.mjs +0 -351
  223. package/esm2022/lib/editor/revision.helper.mjs +0 -94
  224. package/esm2022/lib/models/generated/add-numbering.model.mjs +0 -8
  225. package/esm2022/lib/models/generated/apply-element-style.model.mjs +0 -8
  226. package/esm2022/lib/models/generated/apply-image-style.model.mjs +0 -8
  227. package/esm2022/lib/models/generated/apply-paragraph-style.model.mjs +0 -12
  228. package/esm2022/lib/models/generated/apply-text-style.model.mjs +0 -12
  229. package/esm2022/lib/models/generated/borders-style.model.mjs +0 -8
  230. package/esm2022/lib/models/generated/break.model.mjs +0 -8
  231. package/esm2022/lib/models/generated/cell.model.mjs +0 -12
  232. package/esm2022/lib/models/generated/column-section.model.mjs +0 -8
  233. package/esm2022/lib/models/generated/column.model.mjs +0 -8
  234. package/esm2022/lib/models/generated/command.model.mjs +0 -120
  235. package/esm2022/lib/models/generated/delete.model.mjs +0 -8
  236. package/esm2022/lib/models/generated/document-name.model.mjs +0 -8
  237. package/esm2022/lib/models/generated/document.model.mjs +0 -8
  238. package/esm2022/lib/models/generated/docx.model.mjs +0 -12
  239. package/esm2022/lib/models/generated/edge-target.model.mjs +0 -8
  240. package/esm2022/lib/models/generated/edge.model.mjs +0 -8
  241. package/esm2022/lib/models/generated/element.model.mjs +0 -8
  242. package/esm2022/lib/models/generated/file-source.model.mjs +0 -8
  243. package/esm2022/lib/models/generated/format.model.mjs +0 -12
  244. package/esm2022/lib/models/generated/heading.model.mjs +0 -16
  245. package/esm2022/lib/models/generated/image-data.model.mjs +0 -8
  246. package/esm2022/lib/models/generated/image.model.mjs +0 -12
  247. package/esm2022/lib/models/generated/insert-break.model.mjs +0 -8
  248. package/esm2022/lib/models/generated/insert-element.model.mjs +0 -12
  249. package/esm2022/lib/models/generated/insert-image.model.mjs +0 -12
  250. package/esm2022/lib/models/generated/insert-link.model.mjs +0 -12
  251. package/esm2022/lib/models/generated/insert-paragraph.model.mjs +0 -20
  252. package/esm2022/lib/models/generated/insert-styled-text.model.mjs +0 -12
  253. package/esm2022/lib/models/generated/insert-tab.model.mjs +0 -8
  254. package/esm2022/lib/models/generated/insert-table-columns.model.mjs +0 -8
  255. package/esm2022/lib/models/generated/insert-table-rows.model.mjs +0 -8
  256. package/esm2022/lib/models/generated/insert-table.model.mjs +0 -8
  257. package/esm2022/lib/models/generated/insert-text.model.mjs +0 -8
  258. package/esm2022/lib/models/generated/last-document-revision.model.mjs +0 -12
  259. package/esm2022/lib/models/generated/link-data.model.mjs +0 -8
  260. package/esm2022/lib/models/generated/link.model.mjs +0 -8
  261. package/esm2022/lib/models/generated/margins.model.mjs +0 -8
  262. package/esm2022/lib/models/generated/numbering-level.model.mjs +0 -12
  263. package/esm2022/lib/models/generated/numbering.model.mjs +0 -8
  264. package/esm2022/lib/models/generated/operation.model.mjs +0 -12
  265. package/esm2022/lib/models/generated/page-numbers.model.mjs +0 -8
  266. package/esm2022/lib/models/generated/paragraph-style.model.mjs +0 -8
  267. package/esm2022/lib/models/generated/paragraph.model.mjs +0 -12
  268. package/esm2022/lib/models/generated/remove-numberings.model.mjs +0 -8
  269. package/esm2022/lib/models/generated/remove-table-columns.model.mjs +0 -8
  270. package/esm2022/lib/models/generated/remove-table-rows.model.mjs +0 -8
  271. package/esm2022/lib/models/generated/replace-by-text.model.mjs +0 -8
  272. package/esm2022/lib/models/generated/replace.model.mjs +0 -44
  273. package/esm2022/lib/models/generated/resize-table-columns.model.mjs +0 -8
  274. package/esm2022/lib/models/generated/restore-numberings.model.mjs +0 -8
  275. package/esm2022/lib/models/generated/restore-paragraph-styles.model.mjs +0 -8
  276. package/esm2022/lib/models/generated/restore-table.model.mjs +0 -12
  277. package/esm2022/lib/models/generated/restore-text-styles.model.mjs +0 -8
  278. package/esm2022/lib/models/generated/restore.model.mjs +0 -8
  279. package/esm2022/lib/models/generated/revision.model.mjs +0 -12
  280. package/esm2022/lib/models/generated/row.model.mjs +0 -8
  281. package/esm2022/lib/models/generated/tab.model.mjs +0 -8
  282. package/esm2022/lib/models/generated/table-cell.model.mjs +0 -8
  283. package/esm2022/lib/models/generated/table.model.mjs +0 -12
  284. package/esm2022/lib/models/generated/target.model.mjs +0 -16
  285. package/esm2022/lib/models/generated/text-style.model.mjs +0 -8
  286. package/esm2022/lib/translate/noder-translate.loader.mjs +0 -22
  287. package/esm2022/public-api.mjs +0 -54
  288. package/esm2022/talrace-ngx-noder.mjs +0 -5
@@ -1,99 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, HostBinding, Input, ViewChild } from '@angular/core';
2
- import { CellResizerParametersModel } from '../../../components/table/models/cell-resizer-parameters.model';
3
- import { MarginModel } from '../../../content/margin.model';
4
- import { ResizerSide } from '../../../components/table/enums/reisizer-side.enum';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "../../../interaction/editor.service";
7
- import * as i2 from "../../../execution/regulator.service";
8
- import * as i3 from "@angular/common";
9
- export class NoderTableCellComponent {
10
- get session() {
11
- return this.cellSession.session;
12
- }
13
- get renderer() {
14
- return this.cellSession.renderer;
15
- }
16
- constructor(editorService, regulatorService) {
17
- this.editorService = editorService;
18
- this.regulatorService = regulatorService;
19
- this.isHighlighted = false;
20
- this.resizerBorder = ResizerSide;
21
- this.pagesCountChangedHandler = (event) => {
22
- if (this._allParagraphsHeight === event.pageHeight) {
23
- return;
24
- }
25
- this._allParagraphsHeight = event.pageHeight;
26
- this.heightChanged(this.rowIndex, this.cellIndex, event.pageHeight);
27
- };
28
- }
29
- ngOnDestroy() {
30
- this.session?.displayData.removeEventListener('pagesCountChanged', this.pagesCountChangedHandler);
31
- this.regulatorService.removeSession(this.sessionId);
32
- }
33
- initialize() {
34
- const marginModel = new MarginModel({
35
- left: 7,
36
- right: 7,
37
- top: 0,
38
- bottom: 0,
39
- header: 0,
40
- footer: 0
41
- });
42
- this.cellSession = this.regulatorService.addCellSession(this.table, marginModel, this, this.generalProperties);
43
- this.sessionId = this.cellSession.sessionId;
44
- this.addEventListeners();
45
- }
46
- getCellContentHeight() {
47
- this._allParagraphsHeight = this.session.displayData.getAllParagraphsHeight();
48
- return this._allParagraphsHeight;
49
- }
50
- disableEditorSelection() {
51
- this.editorService.disableSelection();
52
- }
53
- onStartResizing(event, border) {
54
- if (this.session.isWithinEdge() && !this.regulatorService.mainSession.session.customComponents.edges.isEdit) {
55
- return;
56
- }
57
- event.stopPropagation();
58
- this.startResizing(new CellResizerParametersModel(this.columnIndex, this.rowIndex, this.cellIndex, border));
59
- }
60
- addEventListeners() {
61
- this.session.displayData.addEventListener('pagesCountChanged', this.pagesCountChangedHandler);
62
- }
63
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NoderTableCellComponent, deps: [{ token: i1.EditorService }, { token: i2.RegulatorService }], target: i0.ɵɵFactoryTarget.Component }); }
64
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: NoderTableCellComponent, selector: "app-nod-table-cell", inputs: { table: "table", cell: "cell", rowIndex: "rowIndex", cellIndex: "cellIndex", columnIndex: "columnIndex", width: "width", parentSessionId: "parentSessionId", generalProperties: "generalProperties", heightChanged: "heightChanged", startResizing: "startResizing" }, host: { properties: { "class.highlighted": "this.isHighlighted", "attr.data-session-id": "this.sessionId" } }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, static: true }], ngImport: i0, template: "<div\n *ngIf=\"cellIndex === 0\"\n class=\"resizer left-border\"\n (mousedown)=\"onStartResizing($event, resizerBorder.Left)\"></div>\n<div\n #container\n class=\"edit-container\"></div>\n<div class=\"highlight-container\"></div>\n<div\n class=\"resizer right-border\"\n (mousedown)=\"onStartResizing($event, resizerBorder.Right)\"></div>\n", styles: [".highlight-container{visibility:hidden;position:absolute;width:100%;height:100%;background-color:#5ea8f766;pointer-events:none;overflow:hidden}:host{display:flex;position:relative;min-height:19px;height:100%;background:transparent}:host.highlighted .highlight-container{visibility:visible}.edit-container{min-height:1px;overflow:hidden}.left-border{left:-6px}.resizer{cursor:col-resize;width:11px;height:100%;position:absolute;z-index:1}.right-border{right:-6px}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
65
- }
66
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NoderTableCellComponent, decorators: [{
67
- type: Component,
68
- args: [{ selector: 'app-nod-table-cell', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n *ngIf=\"cellIndex === 0\"\n class=\"resizer left-border\"\n (mousedown)=\"onStartResizing($event, resizerBorder.Left)\"></div>\n<div\n #container\n class=\"edit-container\"></div>\n<div class=\"highlight-container\"></div>\n<div\n class=\"resizer right-border\"\n (mousedown)=\"onStartResizing($event, resizerBorder.Right)\"></div>\n", styles: [".highlight-container{visibility:hidden;position:absolute;width:100%;height:100%;background-color:#5ea8f766;pointer-events:none;overflow:hidden}:host{display:flex;position:relative;min-height:19px;height:100%;background:transparent}:host.highlighted .highlight-container{visibility:visible}.edit-container{min-height:1px;overflow:hidden}.left-border{left:-6px}.resizer{cursor:col-resize;width:11px;height:100%;position:absolute;z-index:1}.right-border{right:-6px}\n"] }]
69
- }], ctorParameters: () => [{ type: i1.EditorService }, { type: i2.RegulatorService }], propDecorators: { table: [{
70
- type: Input
71
- }], cell: [{
72
- type: Input
73
- }], rowIndex: [{
74
- type: Input
75
- }], cellIndex: [{
76
- type: Input
77
- }], columnIndex: [{
78
- type: Input
79
- }], width: [{
80
- type: Input
81
- }], parentSessionId: [{
82
- type: Input
83
- }], generalProperties: [{
84
- type: Input
85
- }], heightChanged: [{
86
- type: Input
87
- }], startResizing: [{
88
- type: Input
89
- }], isHighlighted: [{
90
- type: HostBinding,
91
- args: ['class.highlighted']
92
- }], sessionId: [{
93
- type: HostBinding,
94
- args: ['attr.data-session-id']
95
- }], container: [{
96
- type: ViewChild,
97
- args: ['container', { static: true }]
98
- }] } });
99
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtY2VsbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbm9kZXIvc3JjL2xpYi9lZGl0b3IvY29tcG9uZW50cy90YWJsZS9jb21wb25lbnRzL3RhYmxlLWNlbGwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW5vZGVyL3NyYy9saWIvZWRpdG9yL2NvbXBvbmVudHMvdGFibGUvY29tcG9uZW50cy90YWJsZS1jZWxsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQWMsV0FBVyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHOUcsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sZ0VBQWdFLENBQUM7QUFJNUcsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRzVELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvREFBb0QsQ0FBQzs7Ozs7QUFXakYsTUFBTSxPQUFPLHVCQUF1QjtJQTZCaEMsSUFBSSxPQUFPO1FBQ1AsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQztJQUNwQyxDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQztJQUNyQyxDQUFDO0lBUUQsWUFBb0IsYUFBNEIsRUFBVSxnQkFBa0M7UUFBeEUsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFBVSxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBckI1RixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQWlCYixrQkFBYSxHQUFHLFdBQVcsQ0FBQztRQStDN0IsNkJBQXdCLEdBQUcsQ0FBQyxLQUE2QixFQUFRLEVBQUU7WUFDdkUsSUFBSSxJQUFJLENBQUMs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QUFtQjtnQkFJaEMsU0FBUztzQkFEUixXQUFXO3VCQUFDLHNCQUFzQjtnQkFhTyxTQUFTO3NCQUFsRCxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBIb3N0QmluZGluZywgSW5wdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBDZWxsTW9kZWwgfSBmcm9tICcuLi8uLi8uLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2NlbGwubW9kZWwnO1xuaW1wb3J0IHsgQ2VsbFJlc2l6ZXJQYXJhbWV0ZXJzTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL3RhYmxlL21vZGVscy9jZWxsLXJlc2l6ZXItcGFyYW1ldGVycy5tb2RlbCc7XG5pbXBvcnQgeyBFZGl0U2Vzc2lvbiB9IGZyb20gJy4uLy4uLy4uL2V4ZWN1dGlvbi9lZGl0LnNlc3Npb24nO1xuaW1wb3J0IHsgRWRpdG9yU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2ludGVyYWN0aW9uL2VkaXRvci5zZXJ2aWNlJztcbmltcG9ydCB7IEdlbmVyYWxQcm9wZXJ0aWVzTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9jb250ZW50L2Rpc3BsYXktZGF0YS9nZW5lcmFsLXByb3BlcnRpZXMubW9kZWwnO1xuaW1wb3J0IHsgTWFyZ2luTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9jb250ZW50L21hcmdpbi5tb2RlbCc7XG5pbXBvcnQgeyBSZWd1bGF0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vZXhlY3V0aW9uL3JlZ3VsYXRvci5zZXJ2aWNlJztcbmltcG9ydCB7IFJlbmRlcmVyIH0gZnJvbSAnLi4vLi4vLi4vZGlzcGxheS9yZW5kZXJlcic7XG5pbXBvcnQgeyBSZXNpemVyU2lkZSB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvdGFibGUvZW51bXMvcmVpc2l6ZXItc2lkZS5lbnVtJztcbmltcG9ydCB7IFNlc3Npb25Nb2RlbCB9IGZyb20gJy4uLy4uLy4uL2V4ZWN1dGlvbi90YXJnZXRpbmcvc2Vzc2lvbi5tb2RlbCc7XG5pbXBvcnQgeyBUYWJsZU1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC90YWJsZS5tb2RlbCc7XG5pbXBvcnQgeyBWaXJ0dWFsUmVuZGVyZXIgfSBmcm9tICcuLi8uLi8uLi9kaXNwbGF5L3ZpcnR1YWwucmVuZGVyZXInO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC1ub2QtdGFibGUtY2VsbCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLWNlbGwuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3RhYmxlLWNlbGwuY29tcG9uZW50LnNjc3MnXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBOb2RlclRhYmxlQ2VsbENvbXBvbmVudCB7XG4gICAgQElucHV0KCkgdGFibGU6IFRhYmxlTW9kZWw7XG5cbiAgICBASW5wdXQoKSBjZWxsOiBDZWxsTW9kZWw7XG5cbiAgICBASW5wdXQoKSByb3dJbmRleDogbnVtYmVyO1xuXG4gICAgQElucHV0KCkgY2VsbEluZGV4OiBudW1iZXI7XG5cbiAgICBASW5wdXQoKSBjb2x1bW5JbmRleDogbnVtYmVyO1xuXG4gICAgQElucHV0KCkgd2lkdGg6IG51bWJlcjtcblxuICAgIEBJbnB1dCgpIHBhcmVudFNlc3Npb25JZDogbnVtYmVyO1xuXG4gICAgQElucHV0KCkgZ2VuZXJhbFByb3BlcnRpZXM6IEdlbmVyYWxQcm9wZXJ0aWVzTW9kZWw7XG5cbiAgICBASW5wdXQoKSBoZWlnaHRDaGFuZ2VkOiAocm93SW5kZXg6IG51bWJlciwgY2VsbEluZGV4OiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSA9PiB2b2lkO1xuXG4gICAgQElucHV0KCkgc3RhcnRSZXNpemluZzogKGNlbGxSZXNpemVyUGFyYW1ldGVyczogQ2VsbFJlc2l6ZXJQYXJhbWV0ZXJzTW9kZWwpID0+IHZvaWQ7XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmhpZ2hsaWdodGVkJylcbiAgICBpc0hpZ2hsaWdodGVkID0gZmFsc2U7XG5cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuZGF0YS1zZXNzaW9uLWlkJylcbiAgICBzZXNzaW9uSWQ6IG51bWJlcjtcblxuICAgIGNlbGxTZXNzaW9uOiBTZXNzaW9uTW9kZWw7XG5cbiAgICBnZXQgc2Vzc2lvbigpOiBFZGl0U2Vzc2lvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNlbGxTZXNzaW9uLnNlc3Npb247XG4gICAgfVxuXG4gICAgZ2V0IHJlbmRlcmVyKCk6IFJlbmRlcmVyIHwgVmlydHVhbFJlbmRlcmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2VsbFNlc3Npb24ucmVuZGVyZXI7XG4gICAgfVxuXG4gICAgQFZpZXdDaGlsZCgnY29udGFpbmVyJywgeyBzdGF0aWM6IHRydWUgfSkgY29udGFpbmVyOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAgIHJlYWRvbmx5IHJlc2l6ZXJCb3JkZXIgPSBSZXNpemVyU2lkZTtcblxuICAgIHByaXZhdGUgX2FsbFBhcmFncmFwaHNIZWlnaHQ6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZWRpdG9yU2VydmljZTogRWRpdG9yU2VydmljZSwgcHJpdmF0ZSByZWd1bGF0b3JTZXJ2aWNlOiBSZWd1bGF0b3JTZXJ2aWNlKSB7fVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2Vzc2lvbj8uZGlzcGxheURhdGEucmVtb3ZlRXZlbnRMaXN0ZW5lcigncGFnZXNDb3VudENoYW5nZWQnLCB0aGlzLnBhZ2VzQ291bnRDaGFuZ2VkSGFuZGxlcik7XG4gICAgICAgIHRoaXMucmVndWxhdG9yU2VydmljZS5yZW1vdmVTZXNzaW9uKHRoaXMuc2Vzc2lvbklkKTtcbiAgICB9XG5cbiAgICBpbml0aWFsaXplKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBtYXJnaW5Nb2RlbCA9IG5ldyBNYXJnaW5Nb2RlbCh7XG4gICAgICAgICAgICBsZWZ0OiA3LFxuICAgICAgICAgICAgcmlnaHQ6IDcsXG4gICAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgICBib3R0b206IDAsXG4gICAgICAgICAgICBoZWFkZXI6IDAsXG4gICAgICAgICAgICBmb290ZXI6IDBcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY2VsbFNlc3Npb24gPSB0aGlzLnJlZ3VsYXRvclNlcnZpY2UuYWRkQ2VsbFNlc3Npb24odGhpcy50YWJsZSwgbWFyZ2luTW9kZWwsIHRoaXMsIHRoaXMuZ2VuZXJhbFByb3BlcnRpZXMpO1xuICAgICAgICB0aGlzLnNlc3Npb25JZCA9IHRoaXMuY2VsbFNlc3Npb24uc2Vzc2lvbklkO1xuICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgZ2V0Q2VsbENvbnRlbnRIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgdGhpcy5fYWxsUGFyYWdyYXBoc0hlaWdodCA9IHRoaXMuc2Vzc2lvbi5kaXNwbGF5RGF0YS5nZXRBbGxQYXJhZ3JhcGhzSGVpZ2h0KCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9hbGxQYXJhZ3JhcGhzSGVpZ2h0O1xuICAgIH1cblxuICAgIGRpc2FibGVFZGl0b3JTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZWRpdG9yU2VydmljZS5kaXNhYmxlU2VsZWN0aW9uKCk7XG4gICAgfVxuXG4gICAgb25TdGFydFJlc2l6aW5nKGV2ZW50OiBNb3VzZUV2ZW50LCBib3JkZXI6IFJlc2l6ZXJTaWRlKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNlc3Npb24uaXNXaXRoaW5FZGdlKCkgJiYgIXRoaXMucmVndWxhdG9yU2VydmljZS5tYWluU2Vzc2lvbi5zZXNzaW9uLmN1c3RvbUNvbXBvbmVudHMuZWRnZXMuaXNFZGl0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgdGhpcy5zdGFydFJlc2l6aW5nKG5ldyBDZWxsUmVzaXplclBhcmFtZXRlcnNNb2RlbCh0aGlzLmNvbHVtbkluZGV4LCB0aGlzLnJvd0luZGV4LCB0aGlzLmNlbGxJbmRleCwgYm9yZGVyKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRFdmVudExpc3RlbmVycygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXNzaW9uLmRpc3BsYXlEYXRhLmFkZEV2ZW50TGlzdGVuZXIoJ3BhZ2VzQ291bnRDaGFuZ2VkJywgdGhpcy5wYWdlc0NvdW50Q2hhbmdlZEhhbmRsZXIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcGFnZXNDb3VudENoYW5nZWRIYW5kbGVyID0gKGV2ZW50OiB7IHBhZ2VIZWlnaHQ6IG51bWJlciB9KTogdm9pZCA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9hbGxQYXJhZ3JhcGhzSGVpZ2h0ID09PSBldmVudC5wYWdlSGVpZ2h0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9hbGxQYXJhZ3JhcGhzSGVpZ2h0ID0gZXZlbnQucGFnZUhlaWdodDtcbiAgICAgICAgdGhpcy5oZWlnaHRDaGFuZ2VkKHRoaXMucm93SW5kZXgsIHRoaXMuY2VsbEluZGV4LCBldmVudC5wYWdlSGVpZ2h0KTtcbiAgICB9O1xufVxuIiwiPGRpdlxuICAgICpuZ0lmPVwiY2VsbEluZGV4ID09PSAwXCJcbiAgICBjbGFzcz1cInJlc2l6ZXIgbGVmdC1ib3JkZXJcIlxuICAgIChtb3VzZWRvd24pPVwib25TdGFydFJlc2l6aW5nKCRldmVudCwgcmVzaXplckJvcmRlci5MZWZ0KVwiPjwvZGl2PlxuPGRpdlxuICAgICNjb250YWluZXJcbiAgICBjbGFzcz1cImVkaXQtY29udGFpbmVyXCI+PC9kaXY+XG48ZGl2IGNsYXNzPVwiaGlnaGxpZ2h0LWNvbnRhaW5lclwiPjwvZGl2PlxuPGRpdlxuICAgIGNsYXNzPVwicmVzaXplciByaWdodC1ib3JkZXJcIlxuICAgIChtb3VzZWRvd24pPVwib25TdGFydFJlc2l6aW5nKCRldmVudCwgcmVzaXplckJvcmRlci5SaWdodClcIj48L2Rpdj5cbiJdfQ==
@@ -1,412 +0,0 @@
1
- import { ChangeDetectionStrategy, Component } from '@angular/core';
2
- import { BaseNoderComponent } from '../../shared/abstract/base.component';
3
- import { CellDataModel } from '../models/cell-data.model';
4
- import { CellResizer } from '../cell-resizer/cell-resizer';
5
- import { HRule } from '../enums/hrule.enum';
6
- import { NoderTableCellComponent } from './table-cell.component';
7
- import { RowDataModel } from '../models/row-data.model';
8
- import { ScalingHelper } from '../../../content/helpers/scaling.helper';
9
- import { TableSelection } from '../selection/table-selection';
10
- import { VerticalMerge } from '../enums/vertical-merge.enum';
11
- import * as i0 from "@angular/core";
12
- import * as i1 from "../../shared/services/component.service";
13
- import * as i2 from "../../../interaction/editor.service";
14
- import * as i3 from "../../shared/services/overlay.service";
15
- import * as i4 from "../../../execution/regulator.service";
16
- export class NoderTableComponent extends BaseNoderComponent {
17
- get table() {
18
- return this.content;
19
- }
20
- set table(val) {
21
- this.content = val;
22
- }
23
- constructor(componentService, editorService, el, overlayService, regulatorService) {
24
- super();
25
- this.componentService = componentService;
26
- this.editorService = editorService;
27
- this.el = el;
28
- this.overlayService = overlayService;
29
- this.regulatorService = regulatorService;
30
- this.rowMatrix = [];
31
- this.splits = [];
32
- this.minRowHeight = 19;
33
- this.borderSize = 1;
34
- this.startResizing = (cellResizerParameters) => {
35
- const splitRowIndex = this.getSplitRowIndex(cellResizerParameters.rowIndex);
36
- this.resizer.resizerHeight = this.getRowsHeightBetweenSplits(splitRowIndex);
37
- this.resizer.startY = this.getRowsHeightBefore(splitRowIndex);
38
- this.resizer.splitRowIndex = splitRowIndex;
39
- this.resizer.tableInsertIndex = this.insertIndex;
40
- this.resizer.onStartResizing(cellResizerParameters);
41
- };
42
- this.cellHeightChanged = (rowIndex, cellIndex, height) => {
43
- const tableRow = this.table.rows[rowIndex];
44
- this.rowMatrix[rowIndex].cells[cellIndex].cellContentHeight = height < this.minRowHeight ? this.minRowHeight : height;
45
- if (tableRow.hRule === HRule.Exact) {
46
- return;
47
- }
48
- const rowIndexWithSplit = this.getIndexIncludingSplitRows(this.rowMatrix[rowIndex].row);
49
- const row = this.tableEl.rows[rowIndexWithSplit];
50
- const currentHeight = row.offsetHeight;
51
- const cellHeights = this.rowMatrix[rowIndex].cells.map(x => x.cellContentHeight);
52
- const maxCellContentHeigh = Math.max(...cellHeights, height);
53
- if (maxCellContentHeigh > currentHeight ||
54
- (maxCellContentHeigh < currentHeight && (!tableRow.height || tableRow.height <= maxCellContentHeigh))) {
55
- row.style.height = `${maxCellContentHeigh}px`;
56
- this.rowMatrix[rowIndex].height = maxCellContentHeigh;
57
- this.setTableHeight();
58
- this.editorService.changedTableSize(this.insertIndex, this.sessionId);
59
- }
60
- };
61
- }
62
- ngOnDestroy() {
63
- super.ngOnDestroy();
64
- this.tableSelection?.destroy();
65
- }
66
- initialize() {
67
- this.createTable();
68
- this.calculateProperties();
69
- this.createResizer();
70
- this.el.nativeElement.appendChild(this.resizerEl);
71
- this.el.nativeElement.appendChild(this.tableEl);
72
- this.tableSelection = new TableSelection(this.editorService, this.overlayService, this.regulatorService, this.rowMatrix, this.table, this.tableEl, this.regulatorService.getSession(this.sessionId));
73
- }
74
- getCellSession(row, column) {
75
- return this.rowMatrix[row].cells[column].componentRef.instance.session;
76
- }
77
- getCellWidth(tableRow, cellIndex, absoluteCellIndex) {
78
- if (tableRow.cells[cellIndex].width) {
79
- return tableRow.cells[cellIndex].width;
80
- }
81
- let width = 0;
82
- let i = absoluteCellIndex;
83
- const cellSpanCount = absoluteCellIndex + tableRow.cells[cellIndex].horizontalMerge;
84
- do {
85
- width += this.table.columns[i].width;
86
- i++;
87
- } while (i < cellSpanCount);
88
- return width;
89
- }
90
- getAdjustedWidth(tableRow, cellIndex, absoluteCellIndex) {
91
- const cellWidth = this.getCellWidth(tableRow, cellIndex, absoluteCellIndex);
92
- if (tableRow.cells[cellIndex].widthType === 'pct') {
93
- tableRow.cells[cellIndex].widthType = 'dxa';
94
- return (cellWidth * this._width) / 5000; // 5000 is equal to 100% in docx units of measurement
95
- }
96
- return ScalingHelper.scale(cellWidth, this.generalProperties.scalingRatio);
97
- }
98
- createResizer() {
99
- this.resizerEl = document.createElement('div');
100
- this.resizerEl.className = 'resizer-border';
101
- this.resizerEl.setAttribute('style', `display:none;`);
102
- this.resizer = new CellResizer(this.table, this.tableEl, this.editorService, this.resizerEl);
103
- this.resizer.sessionId = this.sessionId;
104
- }
105
- createTable() {
106
- this.tableEl = document.createElement('table');
107
- this.setColgroup();
108
- this.insertRows(this.table.rows.length, 0);
109
- this.fillTableCells();
110
- }
111
- updateTable() {
112
- const cellRefs = new Set(this.rowMatrix.flatMap(row => row.cells).map(cell => cell.componentRef));
113
- cellRefs.forEach(cellRef => this.componentService.removeComponent(cellRef));
114
- this.tableSelection.destroy();
115
- this.rowMatrix = [];
116
- this.tableEl.remove();
117
- this.initialize();
118
- }
119
- insertRows(rowsCount, targetIndex) {
120
- this._width = this.getTableWidth();
121
- let rowIndex = 0;
122
- while (rowIndex < rowsCount) {
123
- const targetRowIndex = targetIndex + rowIndex;
124
- const row = this.tableEl.insertRow(targetRowIndex);
125
- this.rowMatrix.splice(targetRowIndex, 0, new RowDataModel(row, 0, []));
126
- this.insertCells(targetRowIndex, this.table.rows[targetRowIndex].cells.length, 0);
127
- rowIndex++;
128
- }
129
- this.fillTableRow();
130
- }
131
- insertCells(rowIndex, cellsCount, targetIndex) {
132
- let modelTargetIndex = this.getModelTargetIndex(rowIndex, targetIndex);
133
- this.addCells(rowIndex, cellsCount, targetIndex, modelTargetIndex);
134
- }
135
- getModelTargetIndex(rowIndex, targetIndex) {
136
- let absoluteModelCellCount = 0;
137
- let modelTargetIndex = 0;
138
- while (absoluteModelCellCount < targetIndex) {
139
- absoluteModelCellCount += this.table.rows[rowIndex].cells[modelTargetIndex].horizontalMerge ?? 1;
140
- if (absoluteModelCellCount > targetIndex) {
141
- break;
142
- }
143
- modelTargetIndex++;
144
- }
145
- return modelTargetIndex;
146
- }
147
- addCells(rowIndex, cellsCount, targetIndex, modelTargetIndex) {
148
- let i = 0;
149
- let currentTargetIndex = targetIndex;
150
- while (i < cellsCount) {
151
- const modelCellIndex = modelTargetIndex + i;
152
- if (this.table.rows[rowIndex].cells[modelCellIndex].verticalMerge === VerticalMerge.Merge) {
153
- const inheritCellData = this.rowMatrix[rowIndex - 1].cells[currentTargetIndex];
154
- const count = this.table.rows[rowIndex].cells[modelCellIndex].horizontalMerge ?? 1;
155
- this.addAdditionalCells(rowIndex, currentTargetIndex, count, inheritCellData);
156
- currentTargetIndex += count;
157
- i++;
158
- continue;
159
- }
160
- const cell = this.tableEl.rows[rowIndex].insertCell(currentTargetIndex);
161
- const componentRef = this.componentService.generateAndAttachComponent(cell, NoderTableCellComponent, {
162
- table: this.table,
163
- cell: this.table.rows[rowIndex].cells[modelCellIndex],
164
- parentSessionId: this.sessionId,
165
- rowIndex,
166
- cellIndex: modelCellIndex,
167
- columnIndex: currentTargetIndex,
168
- width: this.getAdjustedWidth(this.table.rows[rowIndex], modelCellIndex, currentTargetIndex),
169
- generalProperties: this.generalProperties,
170
- heightChanged: this.cellHeightChanged,
171
- startResizing: this.startResizing
172
- });
173
- const cellContentHeight = componentRef.instance.getCellContentHeight();
174
- const cellData = new CellDataModel(cell, cellContentHeight, componentRef);
175
- this.rowMatrix[rowIndex].cells.splice(currentTargetIndex, 0, cellData);
176
- currentTargetIndex++;
177
- if (this.table.rows[rowIndex].cells[modelCellIndex].horizontalMerge > 1) {
178
- const count = this.table.rows[rowIndex].cells[modelCellIndex].horizontalMerge - 1;
179
- this.addAdditionalCells(rowIndex, currentTargetIndex, count, cellData);
180
- currentTargetIndex += count;
181
- }
182
- i++;
183
- }
184
- }
185
- addAdditionalCells(rowIndex, cellIndex, cellsCount, originalCellData) {
186
- for (let j = 0; j < cellsCount; j++) {
187
- const additionalCell = this.tableEl.rows[rowIndex].insertCell(cellIndex);
188
- additionalCell.classList.add('hidden-cell');
189
- const cellData = new CellDataModel(originalCellData.cell, originalCellData.cellContentHeight, originalCellData.componentRef);
190
- this.rowMatrix[rowIndex].cells.splice(cellIndex, 0, cellData);
191
- }
192
- }
193
- setColgroup() {
194
- const oldColGroups = this.tableEl.getElementsByTagName('colgroup');
195
- if (oldColGroups.length) {
196
- this.tableEl.removeChild(oldColGroups[0]);
197
- }
198
- const colgroup = document.createElement('colgroup');
199
- let i = 0;
200
- while (i < this.table.columns.length) {
201
- const col = document.createElement('col');
202
- const scaledWidth = ScalingHelper.scale(this.table.columns[i].width, this.generalProperties.scalingRatio);
203
- col.style.width = `${scaledWidth}px`;
204
- colgroup.appendChild(col);
205
- i++;
206
- }
207
- this.tableEl.insertAdjacentElement('afterbegin', colgroup);
208
- }
209
- fillTableRow() {
210
- for (let i = 0; i < this.table.rows.length; i++) {
211
- switch (this.table.rows[i].hRule) {
212
- case HRule.AtLeast: {
213
- const rowHeight = this.getRowHeight(i);
214
- this.tableEl.rows[i].style.minHeight = `${this.table.rows[i].height}px`;
215
- this.tableEl.rows[i].style.height = `${rowHeight}px`;
216
- this.rowMatrix[i].height = rowHeight;
217
- break;
218
- }
219
- case HRule.Exact:
220
- this.tableEl.rows[i].style.height = `${this.table.rows[i].height}px`;
221
- this.rowMatrix[i].height = this.table.rows[i].height;
222
- break;
223
- default: {
224
- const rowHeight = this.getRowHeight(i);
225
- const minRowHeight = this.table.rows[i].height ?? this.minRowHeight;
226
- const resultHeight = minRowHeight > rowHeight ? minRowHeight : rowHeight;
227
- this.tableEl.rows[i].style.height = `${resultHeight}px`;
228
- this.rowMatrix[i].height = resultHeight;
229
- break;
230
- }
231
- }
232
- }
233
- }
234
- getRowHeight(rowIndex) {
235
- const cellHeights = this.rowMatrix[rowIndex].cells.map((x, index) => {
236
- if (x.componentRef.instance.cell.verticalMerge === VerticalMerge.Restart) {
237
- const isLastVerticalMergedCell = x.cell !== this.rowMatrix[rowIndex + 1]?.cells[index].cell;
238
- if (isLastVerticalMergedCell) {
239
- let i = rowIndex - 1;
240
- let currentHeight = x.cellContentHeight;
241
- while (x.cell === this.rowMatrix[i]?.cells[index].cell) {
242
- currentHeight -= this.rowMatrix[i].height;
243
- i--;
244
- }
245
- return currentHeight;
246
- }
247
- return 0;
248
- }
249
- return x.cellContentHeight;
250
- });
251
- return Math.max(...cellHeights);
252
- }
253
- fillTableCells() {
254
- for (let i = 0; i < this.rowMatrix.length; i++) {
255
- for (let j = 0; j < this.rowMatrix[i].cells.length; j++) {
256
- if (this.rowMatrix[i - 1]?.cells[j]?.cell === this.rowMatrix[i].cells[j].cell ||
257
- this.rowMatrix[i].cells[j].cell === this.rowMatrix[i].cells[j - 1]?.cell ||
258
- this.rowMatrix[i].cells[j].componentRef.instance.cell.verticalMerge === VerticalMerge.Merge) {
259
- continue;
260
- }
261
- this.rowMatrix[i].cells[j].cell.colSpan = this.rowMatrix[i].cells[j].componentRef.instance.cell.horizontalMerge;
262
- this.rowMatrix[i].cells[j].cell.style.backgroundColor =
263
- this.rowMatrix[i].cells[j].componentRef.instance.cell.backgroundColor;
264
- this.setCellRowSpan(i, j);
265
- }
266
- }
267
- }
268
- setCellRowSpan(rowIndex, absoluteCellIndex) {
269
- this.rowMatrix[rowIndex].cells[absoluteCellIndex].cell.rowSpan = 1;
270
- if (this.rowMatrix[rowIndex].cells[absoluteCellIndex].componentRef.instance.cell.verticalMerge !==
271
- VerticalMerge.Restart) {
272
- return;
273
- }
274
- for (let i = rowIndex + 1; i < this.rowMatrix.length; i++) {
275
- if (this.rowMatrix[i].cells[absoluteCellIndex].cell === this.rowMatrix[rowIndex].cells[absoluteCellIndex].cell) {
276
- this.rowMatrix[rowIndex].cells[absoluteCellIndex].cell.rowSpan++;
277
- }
278
- else {
279
- break;
280
- }
281
- }
282
- }
283
- setTableHeight() {
284
- let bordersHeight = 0;
285
- let rowsHeight = 1;
286
- for (let row of this.rowMatrix) {
287
- rowsHeight += row.height;
288
- if (row.cells.some(x => !x.componentRef.instance.cell.verticalMerge)) {
289
- bordersHeight += this.borderSize;
290
- }
291
- }
292
- this._height = rowsHeight + bordersHeight;
293
- }
294
- processSplit(leftSpaceOnPage, spaceBetweenPagesContent, contentHeight) {
295
- this.removeSplits();
296
- if (leftSpaceOnPage >= this.height) {
297
- return { splitsCount: 0, tableHeight: this.height, leftHeight: 0 };
298
- }
299
- if (leftSpaceOnPage < this.rowMatrix[0].height) {
300
- return { splitsCount: 1, tableHeight: this.height, leftHeight: this.height };
301
- }
302
- return this.splitTable(leftSpaceOnPage, spaceBetweenPagesContent, contentHeight);
303
- }
304
- splitTable(leftSpaceOnPage, spaceBetweenPagesContent, contentHeight) {
305
- let leftHeight = 0, tableHeightWithSplits = this.height, rowIndex = 0;
306
- while (rowIndex < this.rowMatrix.length) {
307
- let { index, rowsHeight } = this.getRowIndexByHeight(rowIndex, leftSpaceOnPage);
308
- rowIndex = index;
309
- if (index === this.rowMatrix.length) {
310
- break;
311
- }
312
- leftHeight = this.rowMatrix
313
- .slice(index)
314
- .map(x => x.height)
315
- .reduce((partialSum, curr) => partialSum + curr + this.borderSize);
316
- const splitRowHeight = spaceBetweenPagesContent + leftSpaceOnPage - rowsHeight;
317
- this.createSplitRow(index + this.splits.length, splitRowHeight);
318
- this.splits.push(index + this.splits.length);
319
- tableHeightWithSplits += splitRowHeight;
320
- leftSpaceOnPage = contentHeight;
321
- }
322
- return {
323
- splitsCount: this.splits.length,
324
- tableHeight: tableHeightWithSplits,
325
- leftHeight
326
- };
327
- }
328
- getRowIndexByHeight(startIndex, height) {
329
- if (startIndex >= this.rowMatrix.length) {
330
- return { index: this.rowMatrix.length, rowsHeight: 0 };
331
- }
332
- let tableHeight = this.rowMatrix[startIndex].height + this.borderSize, i = startIndex;
333
- while (tableHeight < height) {
334
- tableHeight += this.rowMatrix[i + 1]?.height + this.borderSize;
335
- i++;
336
- }
337
- return { index: i, rowsHeight: tableHeight - this.rowMatrix[i]?.height };
338
- }
339
- createSplitRow(index, height) {
340
- this.tableEl.insertRow(index);
341
- this.tableEl.rows[index].style.height = `${height}px`;
342
- this.tableEl.rows[index].classList.add('split-row');
343
- }
344
- removeSplits() {
345
- this.splits = [];
346
- while (this.tableEl.querySelector('.split-row')) {
347
- const el = this.tableEl.querySelector('.split-row');
348
- el.remove();
349
- }
350
- }
351
- calculateProperties() {
352
- if (!this.tableEl) {
353
- return;
354
- }
355
- this.setTableHeight();
356
- }
357
- getTableWidth() {
358
- return this.table.columns.reduce((prev, next) => prev + next.width + this.borderSize, 1);
359
- }
360
- getSplitRowIndex(rowIndex) {
361
- return this.getIndexIncludingSplitRows(this.rowMatrix[rowIndex].row);
362
- }
363
- getIndexIncludingSplitRows(row) {
364
- return Array.from(this.tableEl.rows).indexOf(row);
365
- }
366
- getRowsHeightBefore(rowIndex) {
367
- let index = 0;
368
- for (const element of this.splits) {
369
- if (rowIndex < element) {
370
- break;
371
- }
372
- index = element + 1;
373
- }
374
- return this.getRowsHeight(0, index);
375
- }
376
- getRowsHeightBetweenSplits(rowIndex) {
377
- let startIndex = 0;
378
- let endIndex = this.tableEl.rows.length;
379
- for (const element of this.splits) {
380
- if (rowIndex < element) {
381
- endIndex = element;
382
- break;
383
- }
384
- startIndex = element + 1;
385
- }
386
- return this.getRowsHeight(startIndex, endIndex);
387
- }
388
- getRowsHeight(start, end) {
389
- let sum = 0;
390
- for (let i = start; i < end; i++) {
391
- sum += this.tableEl.rows[i].offsetHeight;
392
- }
393
- return sum;
394
- }
395
- updateCells() {
396
- const rows = this.rowMatrix.length;
397
- const cols = rows > 0 ? this.rowMatrix[0].cells.length : 0;
398
- for (let i = 0; i < rows; i++) {
399
- for (let j = 0; j < cols; j++) {
400
- const cell = this.rowMatrix[i].cells[j];
401
- cell.componentRef.instance.session.displayData.updateNextLineIndexes(0, cell.componentRef.instance.session.displayData.paragraphs.length - 1);
402
- }
403
- }
404
- }
405
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NoderTableComponent, deps: [{ token: i1.ComponentService }, { token: i2.EditorService }, { token: i0.ElementRef }, { token: i3.OverlayService }, { token: i4.RegulatorService }], target: i0.ɵɵFactoryTarget.Component }); }
406
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: NoderTableComponent, selector: "app-nod-table", usesInheritance: true, ngImport: i0, template: '', isInline: true, styles: [":host{position:relative}:host::ng-deep table{position:relative;border-collapse:collapse;background:transparent;empty-cells:show;border-spacing:0;overflow:visible;table-layout:fixed}:host::ng-deep td{position:relative;vertical-align:top;border:1px solid #000;margin:0;padding:0;height:inherit}:host::ng-deep .hidden-cell{display:none;cursor:not-allowed}:host::ng-deep .resizer-border{position:absolute;border:solid .5px blue;z-index:1}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
407
- }
408
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NoderTableComponent, decorators: [{
409
- type: Component,
410
- args: [{ selector: 'app-nod-table', template: '', changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{position:relative}:host::ng-deep table{position:relative;border-collapse:collapse;background:transparent;empty-cells:show;border-spacing:0;overflow:visible;table-layout:fixed}:host::ng-deep td{position:relative;vertical-align:top;border:1px solid #000;margin:0;padding:0;height:inherit}:host::ng-deep .hidden-cell{display:none;cursor:not-allowed}:host::ng-deep .resizer-border{position:absolute;border:solid .5px blue;z-index:1}\n"] }]
411
- }], ctorParameters: () => [{ type: i1.ComponentService }, { type: i2.EditorService }, { type: i0.ElementRef }, { type: i3.OverlayService }, { type: i4.RegulatorService }] });
412
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW5vZGVyL3NyYy9saWIvZWRpdG9yL2NvbXBvbmVudHMvdGFibGUvY29tcG9uZW50cy90YWJsZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBYyxNQUFNLGVBQWUsQ0FBQztBQUUvRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMxRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBSzNELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUdqRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFeEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBRXhFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7Ozs7OztBQVE3RCxNQUFNLE9BQU8sbUJBQW9CLFNBQVEsa0JBQWtCO0lBQ3ZELElBQUksS0FBSztRQUNMLE9BQU8sSUFBSSxDQUFDLE9BQXFCLENBQUM7SUFDdEMsQ0FBQztJQUNELElBQUksS0FBSyxDQUFDLEdBQWU7UUFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7SUFDdkIsQ0FBQztJQWtCRCxZQUNZLGdCQUFrQyxFQUNsQyxhQUE0QixFQUM1QixFQUFjLEVBQ2QsY0FBOEIsRUFDOUIsZ0JBQWtDO1FBRTFDLEtBQUssRUFBRSxDQUFDO1FB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QyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMscUJBQXFCLENBQ2hFLENBQUMsRUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUN2RSxDQUFDO2FBQ0w7U0FDSjtJQUNMLENBQUM7K0dBbGdCUSxtQkFBbUI7bUdBQW5CLG1CQUFtQiw0RUFKbEIsRUFBRTs7NEZBSUgsbUJBQW1CO2tCQU4vQixTQUFTOytCQUNJLGVBQWUsWUFDZixFQUFFLG1CQUVLLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEJhc2VOb2RlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3NoYXJlZC9hYnN0cmFjdC9iYXNlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDZWxsRGF0YU1vZGVsIH0gZnJvbSAnLi4vbW9kZWxzL2NlbGwtZGF0YS5tb2RlbCc7XG5pbXBvcnQgeyBDZWxsUmVzaXplciB9IGZyb20gJy4uL2NlbGwtcmVzaXplci9jZWxsLXJlc2l6ZXInO1xuaW1wb3J0IHsgQ2VsbFJlc2l6ZXJQYXJhbWV0ZXJzTW9kZWwgfSBmcm9tICcuLi9tb2RlbHMvY2VsbC1yZXNpemVyLXBhcmFtZXRlcnMubW9kZWwnO1xuaW1wb3J0IHsgQ29tcG9uZW50U2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9jb21wb25lbnQuc2VydmljZSc7XG5pbXBvcnQgeyBFZGl0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJhY3Rpb24vZWRpdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgRWRpdFNlc3Npb24gfSBmcm9tICcuLi8uLi8uLi9leGVjdXRpb24vZWRpdC5zZXNzaW9uJztcbmltcG9ydCB7IEhSdWxlIH0gZnJvbSAnLi4vZW51bXMvaHJ1bGUuZW51bSc7XG5pbXBvcnQgeyBOb2RlclRhYmxlQ2VsbENvbXBvbmVudCB9IGZyb20gJy4vdGFibGUtY2VsbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgT3ZlcmxheVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvb3ZlcmxheS5zZXJ2aWNlJztcbmltcG9ydCB7IFJlZ3VsYXRvclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9leGVjdXRpb24vcmVndWxhdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgUm93RGF0YU1vZGVsIH0gZnJvbSAnLi4vbW9kZWxzL3Jvdy1kYXRhLm1vZGVsJztcbmltcG9ydCB7IFJvd01vZGVsIH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9yb3cubW9kZWwnO1xuaW1wb3J0IHsgU2NhbGluZ0hlbHBlciB9IGZyb20gJy4uLy4uLy4uL2NvbnRlbnQvaGVscGVycy9zY2FsaW5nLmhlbHBlcic7XG5pbXBvcnQgeyBUYWJsZU1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC90YWJsZS5tb2RlbCc7XG5pbXBvcnQgeyBUYWJsZVNlbGVjdGlvbiB9IGZyb20gJy4uL3NlbGVjdGlvbi90YWJsZS1zZWxlY3Rpb24nO1xuaW1wb3J0IHsgVmVydGljYWxNZXJnZSB9IGZyb20gJy4uL2VudW1zL3ZlcnRpY2FsLW1lcmdlLmVudW0nO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC1ub2QtdGFibGUnLFxuICAgIHRlbXBsYXRlOiAnJyxcbiAgICBzdHlsZVVybHM6IFsnLi90YWJsZS5jb21wb25lbnQuc2NzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIE5vZGVyVGFibGVDb21wb25lbnQgZXh0ZW5kcyBCYXNlTm9kZXJDb21wb25lbnQge1xuICAgIGdldCB0YWJsZSgpOiBUYWJsZU1vZGVsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudCBhcyBUYWJsZU1vZGVsO1xuICAgIH1cbiAgICBzZXQgdGFibGUodmFsOiBUYWJsZU1vZGVsKSB7XG4gICAgICAgIHRoaXMuY29udGVudCA9IHZhbDtcbiAgICB9XG5cbiAgICB0YWJsZVNlbGVjdGlvbjogVGFibGVTZWxlY3Rpb247XG5cbiAgICB0YWJsZUVsOiBIVE1MVGFibGVFbGVtZW50O1xuXG4gICAgcmVzaXplcjogQ2VsbFJlc2l6ZXI7XG5cbiAgICByZXNpemVyRWw6IEhUTUxEaXZFbGVtZW50O1xuXG4gICAgcm93TWF0cml4OiBSb3dEYXRhTW9kZWxbXSA9IFtdO1xuXG4gICAgc3BsaXRzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgcmVhZG9ubHkgbWluUm93SGVpZ2h0ID0gMTk7XG5cbiAgICByZWFkb25seSBib3JkZXJTaXplID0gMTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGNvbXBvbmVudFNlcnZpY2U6IENvbXBvbmVudFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgZWRpdG9yU2VydmljZTogRWRpdG9yU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixcbiAgICAgICAgcHJpdmF0ZSBvdmVybGF5U2VydmljZTogT3ZlcmxheVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVndWxhdG9yU2VydmljZTogUmVndWxhdG9yU2VydmljZVxuICAgICkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgICAgICB0aGlzLnRhYmxlU2VsZWN0aW9uPy5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jcmVhdGVUYWJsZSgpO1xuICAgICAgICB0aGlzLmNhbGN1bGF0ZVByb3BlcnRpZXMoKTtcbiAgICAgICAgdGhpcy5jcmVhdGVSZXNpemVyKCk7XG4gICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnJlc2l6ZXJFbCk7XG4gICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnRhYmxlRWwpO1xuICAgICAgICB0aGlzLnRhYmxlU2VsZWN0aW9uID0gbmV3IFRhYmxlU2VsZWN0aW9uKFxuICAgICAgICAgICAgdGhpcy5lZGl0b3JTZXJ2aWNlLFxuICAgICAgICAgICAgdGhpcy5vdmVybGF5U2VydmljZSxcbiAgICAgICAgICAgIHRoaXMucmVndWxhdG9yU2VydmljZSxcbiAgICAgICAgICAgIHRoaXMucm93TWF0cml4LFxuICAgICAgICAgICAgdGhpcy50YWJsZSxcbiAgICAgICAgICAgIHRoaXMudGFibGVFbCxcbiAgICAgICAgICAgIHRoaXMucmVndWxhdG9yU2VydmljZS5nZXRTZXNzaW9uKHRoaXMuc2Vzc2lvbklkKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGdldENlbGxTZXNzaW9uKHJvdzogbnVtYmVyLCBjb2x1bW46IG51bWJlcik6IEVkaXRTZXNzaW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm93TWF0cml4W3Jvd10uY2VsbHNbY29sdW1uXS5jb21wb25lbnRSZWYuaW5zdGFuY2Uuc2Vzc2lvbjtcbiAgICB9XG5cbiAgICBnZXRDZWxsV2lkdGgodGFibGVSb3c6IFJvd01vZGVsLCBjZWxsSW5kZXg6IG51bWJlciwgYWJzb2x1dGVDZWxsSW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGlmICh0YWJsZVJvdy5jZWxsc1tjZWxsSW5kZXhdLndpZHRoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGFibGVSb3cuY2VsbHNbY2VsbEluZGV4XS53aWR0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB3aWR0aCA9IDA7XG4gICAgICAgIGxldCBpID0gYWJzb2x1dGVDZWxsSW5kZXg7XG4gICAgICAgIGNvbnN0IGNlbGxTcGFuQ291bnQgPSBhYnNvbHV0ZUNlbGxJbmRleCArIHRhYmxlUm93LmNlbGxzW2NlbGxJbmRleF0uaG9yaXpvbnRhbE1lcmdlO1xuXG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIHdpZHRoICs9IHRoaXMudGFibGUuY29sdW1uc1tpXS53aWR0aDtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfSB3aGlsZSAoaSA8IGNlbGxTcGFuQ291bnQpO1xuXG4gICAgICAgIHJldHVybiB3aWR0aDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEFkanVzdGVkV2lkdGgodGFibGVSb3c6IFJvd01vZGVsLCBjZWxsSW5kZXg6IG51bWJlciwgYWJzb2x1dGVDZWxsSW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGNlbGxXaWR0aCA9IHRoaXMuZ2V0Q2VsbFdpZHRoKHRhYmxlUm93LCBjZWxsSW5kZXgsIGFic29sdXRlQ2VsbEluZGV4KTtcblxuICAgICAgICBpZiAodGFibGVSb3cuY2VsbHNbY2VsbEluZGV4XS53aWR0aFR5cGUgPT09ICdwY3QnKSB7XG4gICAgICAgICAgICB0YWJsZVJvdy5jZWxsc1tjZWxsSW5kZXhdLndpZHRoVHlwZSA9ICdkeGEnO1xuICAgICAgICAgICAgcmV0dXJuIChjZWxsV2lkdGggKiB0aGlzLl93aWR0aCkgLyA1MDAwOyAvLyA1MDAwIGlzIGVxdWFsIHRvIDEwMCUgaW4gZG9jeCB1bml0cyBvZiBtZWFzdXJlbWVudFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFNjYWxpbmdIZWxwZXIuc2NhbGUoY2VsbFdpZHRoLCB0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzLnNjYWxpbmdSYXRpbyk7XG4gICAgfVxuXG4gICAgY3JlYXRlUmVzaXplcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZXNpemVyRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgdGhpcy5yZXNpemVyRWwuY2xhc3NOYW1lID0gJ3Jlc2l6ZXItYm9yZGVyJztcbiAgICAgICAgdGhpcy5yZXNpemVyRWwuc2V0QXR0cmlidXRlKCdzdHlsZScsIGBkaXNwbGF5Om5vbmU7YCk7XG4gICAgICAgIHRoaXMucmVzaXplciA9IG5ldyBDZWxsUmVzaXplcih0aGlzLnRhYmxlLCB0aGlzLnRhYmxlRWwsIHRoaXMuZWRpdG9yU2VydmljZSwgdGhpcy5yZXNpemVyRWwpO1xuICAgICAgICB0aGlzLnJlc2l6ZXIuc2Vzc2lvbklkID0gdGhpcy5zZXNzaW9uSWQ7XG4gICAgfVxuXG4gICAgY3JlYXRlVGFibGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudGFibGVFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RhYmxlJyk7XG4gICAgICAgIHRoaXMuc2V0Q29sZ3JvdXAoKTtcbiAgICAgICAgdGhpcy5pbnNlcnRSb3dzKHRoaXMudGFibGUucm93cy5sZW5ndGgsIDApO1xuICAgICAgICB0aGlzLmZpbGxUYWJsZUNlbGxzKCk7XG4gICAgfVxuXG4gICAgdXBkYXRlVGFibGUoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNlbGxSZWZzID0gbmV3IFNldCh0aGlzLnJvd01hdHJpeC5mbGF0TWFwKHJvdyA9PiByb3cuY2VsbHMpLm1hcChjZWxsID0+IGNlbGwuY29tcG9uZW50UmVmKSk7XG4gICAgICAgIGNlbGxSZWZzLmZvckVhY2goY2VsbFJlZiA9PiB0aGlzLmNvbXBvbmVudFNlcnZpY2UucmVtb3ZlQ29tcG9uZW50KGNlbGxSZWYpKTtcbiAgICAgICAgdGhpcy50YWJsZVNlbGVjdGlvbi5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMucm93TWF0cml4ID0gW107XG4gICAgICAgIHRoaXMudGFibGVFbC5yZW1vdmUoKTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplKCk7XG4gICAgfVxuXG4gICAgaW5zZXJ0Um93cyhyb3dzQ291bnQ6IG51bWJlciwgdGFyZ2V0SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLl93aWR0aCA9IHRoaXMuZ2V0VGFibGVXaWR0aCgpO1xuICAgICAgICBsZXQgcm93SW5kZXggPSAwO1xuXG4gICAgICAgIHdoaWxlIChyb3dJbmRleCA8IHJvd3NDb3VudCkge1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0Um93SW5kZXggPSB0YXJnZXRJbmRleCArIHJvd0luZGV4O1xuICAgICAgICAgICAgY29uc3Qgcm93ID0gdGhpcy50YWJsZUVsLmluc2VydFJvdyh0YXJnZXRSb3dJbmRleCk7XG4gICAgICAgICAgICB0aGlzLnJvd01hdHJpeC5zcGxpY2UodGFyZ2V0Um93SW5kZXgsIDAsIG5ldyBSb3dEYXRhTW9kZWwocm93LCAwLCBbXSkpO1xuICAgICAgICAgICAgdGhpcy5pbnNlcnRDZWxscyh0YXJnZXRSb3dJbmRleCwgdGhpcy50YWJsZS5yb3dzW3RhcmdldFJvd0luZGV4XS5jZWxscy5sZW5ndGgsIDApO1xuICAgICAgICAgICAgcm93SW5kZXgrKztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlsbFRhYmxlUm93KCk7XG4gICAgfVxuXG4gICAgaW5zZXJ0Q2VsbHMocm93SW5kZXg6IG51bWJlciwgY2VsbHNDb3VudDogbnVtYmVyLCB0YXJnZXRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGxldCBtb2RlbFRhcmdldEluZGV4ID0gdGhpcy5nZXRNb2RlbFRhcmdldEluZGV4KHJvd0luZGV4LCB0YXJnZXRJbmRleCk7XG4gICAgICAgIHRoaXMuYWRkQ2VsbHMocm93SW5kZXgsIGNlbGxzQ291bnQsIHRhcmdldEluZGV4LCBtb2RlbFRhcmdldEluZGV4KTtcbiAgICB9XG5cbiAgICBnZXRNb2RlbFRhcmdldEluZGV4KHJvd0luZGV4OiBudW1iZXIsIHRhcmdldEluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBsZXQgYWJzb2x1dGVNb2RlbENlbGxDb3VudCA9IDA7XG4gICAgICAgIGxldCBtb2RlbFRhcmdldEluZGV4ID0gMDtcblxuICAgICAgICB3aGlsZSAoYWJzb2x1dGVNb2RlbENlbGxDb3VudCA8IHRhcmdldEluZGV4KSB7XG4gICAgICAgICAgICBhYnNvbHV0ZU1vZGVsQ2VsbENvdW50ICs9IHRoaXMudGFibGUucm93c1tyb3dJbmRleF0uY2VsbHNbbW9kZWxUYXJnZXRJbmRleF0uaG9yaXpvbnRhbE1lcmdlID8/IDE7XG5cbiAgICAgICAgICAgIGlmIChhYnNvbHV0ZU1vZGVsQ2VsbENvdW50ID4gdGFyZ2V0SW5kZXgpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbW9kZWxUYXJnZXRJbmRleCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1vZGVsVGFyZ2V0SW5kZXg7XG4gICAgfVxuXG4gICAgYWRkQ2VsbHMocm93SW5kZXg6IG51bWJlciwgY2VsbHNDb3VudDogbnVtYmVyLCB0YXJnZXRJbmRleDogbnVtYmVyLCBtb2RlbFRhcmdldEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBsZXQgY3VycmVudFRhcmdldEluZGV4ID0gdGFyZ2V0SW5kZXg7XG5cbiAgICAgICAgd2hpbGUgKGkgPCBjZWxsc0NvdW50KSB7XG4gICAgICAgICAgICBjb25zdCBtb2RlbENlbGxJbmRleCA9IG1vZGVsVGFyZ2V0SW5kZXggKyBpO1xuXG4gICAgICAgICAgICBpZiAoKHRoaXMudGFibGUucm93c1tyb3dJbmRleF0uY2VsbHNbbW9kZWxDZWxsSW5kZXhdLnZlcnRpY2FsTWVyZ2UgYXMgVmVydGljYWxNZXJnZSkgPT09IFZlcnRpY2FsTWVyZ2UuTWVyZ2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmhlcml0Q2VsbERhdGEgPSB0aGlzLnJvd01hdHJpeFtyb3dJbmRleCAtIDFdLmNlbGxzW2N1cnJlbnRUYXJnZXRJbmRleF07XG4gICAgICAgICAgICAgICAgY29uc3QgY291bnQgPSB0aGlzLnRhYmxlLnJvd3Nbcm93SW5kZXhdLmNlbGxzW21vZGVsQ2VsbEluZGV4XS5ob3Jpem9udGFsTWVyZ2UgPz8gMTtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEFkZGl0aW9uYWxDZWxscyhyb3dJbmRleCwgY3VycmVudFRhcmdldEluZGV4LCBjb3VudCwgaW5oZXJpdENlbGxEYXRhKTtcbiAgICAgICAgICAgICAgICBjdXJyZW50VGFyZ2V0SW5kZXggKz0gY291bnQ7XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjZWxsID0gdGhpcy50YWJsZUVsLnJvd3Nbcm93SW5kZXhdLmluc2VydENlbGwoY3VycmVudFRhcmdldEluZGV4KTtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHRoaXMuY29tcG9uZW50U2VydmljZS5nZW5lcmF0ZUFuZEF0dGFjaENvbXBvbmVudChjZWxsLCBOb2RlclRhYmxlQ2VsbENvbXBvbmVudCwge1xuICAgICAgICAgICAgICAgIHRhYmxlOiB0aGlzLnRhYmxlLFxuICAgICAgICAgICAgICAgIGNlbGw6IHRoaXMudGFibGUucm93c1tyb3dJbmRleF0uY2VsbHNbbW9kZWxDZWxsSW5kZXhdLFxuICAgICAgICAgICAgICAgIHBhcmVudFNlc3Npb25JZDogdGhpcy5zZXNzaW9uSWQsXG4gICAgICAgICAgICAgICAgcm93SW5kZXgsXG4gICAgICAgICAgICAgICAgY2VsbEluZGV4OiBtb2RlbENlbGxJbmRleCxcbiAgICAgICAgICAgICAgICBjb2x1bW5JbmRleDogY3VycmVudFRhcmdldEluZGV4LFxuICAgICAgICAgICAgICAgIHdpZHRoOiB0aGlzLmdldEFkanVzdGVkV2lkdGgodGhpcy50YWJsZS5yb3dzW3Jvd0luZGV4XSwgbW9kZWxDZWxsSW5kZXgsIGN1cnJlbnRUYXJnZXRJbmRleCksXG4gICAgICAgICAgICAgICAgZ2VuZXJhbFByb3BlcnRpZXM6IHRoaXMuZ2VuZXJhbFByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgaGVpZ2h0Q2hhbmdlZDogdGhpcy5jZWxsSGVpZ2h0Q2hhbmdlZCxcbiAgICAgICAgICAgICAgICBzdGFydFJlc2l6aW5nOiB0aGlzLnN0YXJ0UmVzaXppbmdcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgY2VsbENvbnRlbnRIZWlnaHQgPSBjb21wb25lbnRSZWYuaW5zdGFuY2UuZ2V0Q2VsbENvbnRlbnRIZWlnaHQoKTtcbiAgICAgICAgICAgIGNvbnN0IGNlbGxEYXRhID0gbmV3IENlbGxEYXRhTW9kZWwoY2VsbCwgY2VsbENvbnRlbnRIZWlnaHQsIGNvbXBvbmVudFJlZik7XG4gICAgICAgICAgICB0aGlzLnJvd01hdHJpeFtyb3dJbmRleF0uY2VsbHMuc3BsaWNlKGN1cnJlbnRUYXJnZXRJbmRleCwgMCwgY2VsbERhdGEpO1xuICAgICAgICAgICAgY3VycmVudFRhcmdldEluZGV4Kys7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnRhYmxlLnJvd3Nbcm93SW5kZXhdLmNlbGxzW21vZGVsQ2VsbEluZGV4XS5ob3Jpem9udGFsTWVyZ2UgPiAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY291bnQgPSB0aGlzLnRhYmxlLnJvd3Nbcm93SW5kZXhdLmNlbGxzW21vZGVsQ2VsbEluZGV4XS5ob3Jpem9udGFsTWVyZ2UgLSAxO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkQWRkaXRpb25hbENlbGxzKHJvd0luZGV4LCBjdXJyZW50VGFyZ2V0SW5kZXgsIGNvdW50LCBjZWxsRGF0YSk7XG4gICAgICAgICAgICAgICAgY3VycmVudFRhcmdldEluZGV4ICs9IGNvdW50O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGRBZGRpdGlvbmFsQ2VsbHMocm93SW5kZXg6IG51bWJlciwgY2VsbEluZGV4OiBudW1iZXIsIGNlbGxzQ291bnQ6IG51bWJlciwgb3JpZ2luYWxDZWxsRGF0YTogQ2VsbERhdGFNb2RlbCk6IHZvaWQge1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNlbGxzQ291bnQ7IGorKykge1xuICAgICAgICAgICAgY29uc3QgYWRkaXRpb25hbENlbGwgPSB0aGlzLnRhYmxlRWwucm93c1tyb3dJbmRleF0uaW5zZXJ0Q2VsbChjZWxsSW5kZXgpO1xuICAgICAgICAgICAgYWRkaXRpb25hbENlbGwuY2xhc3NMaXN0LmFkZCgnaGlkZGVuLWNlbGwnKTtcbiAgICAgICAgICAgIGNvbnN0IGNlbGxEYXRhID0gbmV3IENlbGxEYXRhTW9kZWwob3JpZ2luYWxDZWxsRGF0YS5jZWxsLCBvcmlnaW5hbENlbGxEYXRhLmNlbGxDb250ZW50SGVpZ2h0LCBvcmlnaW5hbENlbGxEYXRhLmNvbXBvbmVudFJlZik7XG4gICAgICAgICAgICB0aGlzLnJvd01hdHJpeFtyb3dJbmRleF0uY2VsbHMuc3BsaWNlKGNlbGxJbmRleCwgMCwgY2VsbERhdGEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0Q29sZ3JvdXAoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG9sZENvbEdyb3VwcyA9IHRoaXMudGFibGVFbC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnY29sZ3JvdXAnKTtcblxuICAgICAgICBpZiAob2xkQ29sR3JvdXBzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy50YWJsZUVsLnJlbW92ZUNoaWxkKG9sZENvbEdyb3Vwc1swXSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb2xncm91cCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NvbGdyb3VwJyk7XG4gICAgICAgIGxldCBpID0gMDtcblxuICAgICAgICB3aGlsZSAoaSA8IHRoaXMudGFibGUuY29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NvbCcpO1xuICAgICAgICAgICAgY29uc3Qgc2NhbGVkV2lkdGggPSBTY2FsaW5nSGVscGVyLnNjYWxlKHRoaXMudGFibGUuY29sdW1uc1tpXS53aWR0aCwgdGhpcy5nZW5lcmFsUHJvcGVydGllcy5zY2FsaW5nUmF0aW8pO1xuICAgICAgICAgICAgY29sLnN0eWxlLndpZHRoID0gYCR7c2NhbGVkV2lkdGh9cHhgO1xuICAgICAgICAgICAgY29sZ3JvdXAuYXBwZW5kQ2hpbGQoY29sKTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGFibGVFbC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyYmVnaW4nLCBjb2xncm91cCk7XG4gICAgfVxuXG4gICAgZmlsbFRhYmxlUm93KCk6IHZvaWQge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudGFibGUucm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgc3dpdGNoICh0aGlzLnRhYmxlLnJvd3NbaV0uaFJ1bGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEhSdWxlLkF0TGVhc3Q6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm93SGVpZ2h0ID0gdGhpcy5nZXRSb3dIZWlnaHQoaSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVFbC5yb3dzW2ldLnN0eWxlLm1pbkhlaWdodCA9IGAke3RoaXMudGFibGUucm93c1tpXS5oZWlnaHR9cHhgO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlRWwucm93c1tpXS5zdHlsZS5oZWlnaHQgPSBgJHtyb3dIZWlnaHR9cHhgO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvd01hdHJpeFtpXS5oZWlnaHQgPSByb3dIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIEhSdWxlLkV4YWN0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlRWwucm93c1tpXS5zdHlsZS5oZWlnaHQgPSBgJHt0aGlzLnRhYmxlLnJvd3NbaV0uaGVpZ2h0fXB4YDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3dNYXRyaXhbaV0uaGVpZ2h0ID0gdGhpcy50YWJsZS5yb3dzW2ldLmhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByb3dIZWlnaHQgPSB0aGlzLmdldFJvd0hlaWdodChpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWluUm93SGVpZ2h0ID0gdGhpcy50YWJsZS5yb3dzW2ldLmhlaWdodCA/PyB0aGlzLm1pblJvd0hlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0SGVpZ2h0ID0gbWluUm93SGVpZ2h0ID4gcm93SGVpZ2h0ID8gbWluUm93SGVpZ2h0IDogcm93SGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlRWwucm93c1tpXS5zdHlsZS5oZWlnaHQgPSBgJHtyZXN1bHRIZWlnaHR9cHhgO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvd01hdHJpeFtpXS5oZWlnaHQgPSByZXN1bHRIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFJvd0hlaWdodChyb3dJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgY2VsbEhlaWdodHMgPSB0aGlzLnJvd01hdHJpeFtyb3dJbmRleF0uY2VsbHMubWFwKCh4LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKCh4LmNvbXBvbmVudFJlZi5pbnN0YW5jZS5jZWxsLnZlcnRpY2FsTWVyZ2UgYXMgVmVydGljYWxNZXJnZSkgPT09IFZlcnRpY2FsTWVyZ2UuUmVzdGFydCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzTGFzdFZlcnRpY2FsTWVyZ2VkQ2VsbCA9IHguY2VsbCAhPT0gdGhpcy5yb3dNYXRyaXhbcm93SW5kZXggKyAxXT8uY2VsbHNbaW5kZXhdLmNlbGw7XG5cbiAgICAgICAgICAgICAgICBpZiAoaXNMYXN0VmVydGljYWxNZXJnZWRDZWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpID0gcm93SW5kZXggLSAxO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY3VycmVudEhlaWdodCA9IHguY2VsbENvbnRlbnRIZWlnaHQ7XG5cbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHguY2VsbCA9PT0gdGhpcy5yb3dNYXRyaXhbaV0/LmNlbGxzW2luZGV4XS5jZWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SGVpZ2h0IC09IHRoaXMucm93TWF0cml4W2ldLmhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGktLTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50SGVpZ2h0O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4geC5jZWxsQ29udGVudEhlaWdodDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KC4uLmNlbGxIZWlnaHRzKTtcbiAgICB9XG5cbiAgICBmaWxsVGFibGVDZWxscygpOiB2b2lkIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJvd01hdHJpeC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLnJvd01hdHJpeFtpXS5jZWxscy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3dNYXRyaXhbaSAtIDFdPy5jZWxsc1tqXT8uY2VsbCA9PT0gdGhpcy5yb3dNYXRyaXhbaV0uY2VsbHNbal0uY2VsbCB8fFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvd01hdHJpeFtpXS5jZWxsc1tqXS5jZWxsID09PSB0aGlzLnJvd01hdHJpeFtpXS5jZWxsc1tqIC0gMV0/LmNlbGwgfHxcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMucm93TWF0cml4W2ldLmNlbGxzW2pdLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5jZWxsLnZlcnRpY2FsTWVyZ2UgYXMgVmVydGljYWxNZXJnZSkgPT09IFZlcnRpY2FsTWVyZ2UuTWVyZ2VcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5yb3dNYXRyaXhbaV0uY2VsbHNbal0uY2VsbC5jb2xTcGFuID0gdGhpcy5yb3dNYXRyaXhbaV0uY2VsbHNbal0uY29tcG9uZW50UmVmLmluc3RhbmNlLmNlbGwuaG9yaXpvbnRhbE1lcmdlO1xuICAgICAgICAgICAgICAgIHRoaXMucm93TWF0cml4W2ldLmNlbGxzW2pdLmNlbGwuc3R5bGUuYmFja2dyb3VuZENvbG9yID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3dNYXRyaXhbaV0uY2VsbHNbal0uY29tcG9uZW50UmVmLmluc3RhbmNlLmNlbGwuYmFja2dyb3VuZENvbG9yO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2VsbFJvd1NwYW4oaSwgaik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRDZWxsUm93U3Bhbihyb3dJbmRleDogbnVtYmVyLCBhYnNvbHV0ZUNlbGxJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMucm93TWF0cml4W3Jvd0luZGV4XS5jZWxsc1thYnNvbHV0ZUNlbGxJbmRleF0uY2VsbC5yb3dTcGFuID0gMTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAodGhpcy5yb3dNYXRyaXhbcm93SW5kZXhdLmNlbGxzW2Fic29sdXRlQ2VsbEluZGV4XS5jb21wb25lbnRSZWYuaW5zdGFuY2UuY2VsbC52ZXJ0aWNhbE1lcmdlIGFzIFZlcnRpY2FsTWVyZ2UpICE9PVxuICAgICAgICAgICAgVmVydGljYWxNZXJnZS5SZXN0YXJ0XG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IHJvd0luZGV4ICsgMTsgaSA8IHRoaXMucm93TWF0cml4Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5yb3dNYXRyaXhbaV0uY2VsbHNbYWJzb2x1dGVDZWxsSW5kZXhdLmNlbGwgPT09IHRoaXMucm93TWF0cml4W3Jvd0luZGV4XS5jZWxsc1thYnNvbHV0ZUNlbGxJbmRleF0uY2VsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMucm93TWF0cml4W3Jvd0luZGV4XS5jZWxsc1thYnNvbHV0ZUNlbGxJbmRleF0uY2VsbC5yb3dTcGFuKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0VGFibGVIZWlnaHQoKTogdm9pZCB7XG4gICAgICAgIGxldCBib3JkZXJzSGVpZ2h0ID0gMDtcbiAgICAgICAgbGV0IHJvd3NIZWlnaHQgPSAxO1xuXG4gICAgICAgIGZvciAobGV0IHJvdyBvZiB0aGlzLnJvd01hdHJpeCkge1xuICAgICAgICAgICAgcm93c0hlaWdodCArPSByb3cuaGVpZ2h0O1xuXG4gICAgICAgICAgICBpZiAocm93LmNlbGxzLnNvbWUoeCA9PiAheC5jb21wb25lbnRSZWYuaW5zdGFuY2UuY2VsbC52ZXJ0aWNhbE1lcmdlKSkge1xuICAgICAgICAgICAgICAgIGJvcmRlcnNIZWlnaHQgKz0gdGhpcy5ib3JkZXJTaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5faGVpZ2h0ID0gcm93c0hlaWdodCArIGJvcmRlcnNIZWlnaHQ7XG4gICAgfVxuXG4gICAgc3RhcnRSZXNpemluZyA9IChjZWxsUmVzaXplclBhcmFtZXRlcnM6IENlbGxSZXNpemVyUGFyYW1ldGVyc01vZGVsKTogdm9pZCA9PiB7XG4gICAgICAgIGNvbnN0IHNwbGl0Um93SW5kZXggPSB0aGlzLmdldFNwbGl0Um93SW5kZXgoY2VsbFJlc2l6ZXJQYXJhbWV0ZXJzLnJvd0luZGV4KTtcbiAgICAgICAgdGhpcy5yZXNpemVyLnJlc2l6ZXJIZWlnaHQgPSB0aGlzLmdldFJvd3NIZWlnaHRCZXR3ZWVuU3BsaXRzKHNwbGl0Um93SW5kZXgpO1xuICAgICAgICB0aGlzLnJlc2l6ZXIuc3RhcnRZID0gdGhpcy5nZXRSb3dzSGVpZ2h0QmVmb3JlKHNwbGl0Um93SW5kZXgpO1xuICAgICAgICB0aGlzLnJlc2l6ZXIuc3BsaXRSb3dJbmRleCA9IHNwbGl0Um93SW5kZXg7XG4gICAgICAgIHRoaXMucmVzaXplci50YWJsZUluc2VydEluZGV4ID0gdGhpcy5pbnNlcnRJbmRleDtcbiAgICAgICAgdGhpcy5yZXNpemVyLm9uU3RhcnRSZXNpemluZyhjZWxsUmVzaXplclBhcmFtZXRlcnMpO1xuICAgIH07XG5cbiAgICBwcm9jZXNzU3BsaXQoXG4gICAgICAgIGxlZnRTcGFjZU9uUGFnZTogbnVtYmVyLFxuICAgICAgICBzcGFjZUJldHdlZW5QYWdlc0NvbnRlbnQ6IG51bWJlcixcbiAgICAgICAgY29udGVudEhlaWdodDogbnVtYmVyXG4gICAgKTogeyBzcGxpdHNDb3VudDogbnVtYmVyOyB0YWJsZUhlaWdodDogbnVtYmVyOyBsZWZ0SGVpZ2h0OiBudW1iZXIgfSB7XG4gICAgICAgIHRoaXMucmVtb3ZlU3BsaXRzKCk7XG5cbiAgICAgICAgaWYgKGxlZnRTcGFjZU9uUGFnZSA+PSB0aGlzLmhlaWdodCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgc3BsaXRzQ291bnQ6IDAsIHRhYmxlSGVpZ2h0OiB0aGlzLmhlaWdodCwgbGVmdEhlaWdodDogMCB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxlZnRTcGFjZU9uUGFnZSA8IHRoaXMucm93TWF0cml4WzBdLmhlaWdodCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgc3BsaXRzQ291bnQ6IDEsIHRhYmxlSGVpZ2h0OiB0aGlzLmhlaWdodCwgbGVmdEhlaWdodDogdGhpcy5oZWlnaHQgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnNwbGl0VGFibGUobGVmdFNwYWNlT25QYWdlLCBzcGFjZUJldHdlZW5QYWdlc0NvbnRlbnQsIGNvbnRlbnRIZWlnaHQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3BsaXRUYWJsZShcbiAgICAgICAgbGVmdFNwYWNlT25QYWdlOiBudW1iZXIsXG4gICAgICAgIHNwYWNlQmV0d2VlblBhZ2VzQ29udGVudDogbnVtYmVyLFxuICAgICAgICBjb250ZW50SGVpZ2h0OiBudW1iZXJcbiAgICApOiB7IHNwbGl0c0NvdW50OiBudW1iZXI7IHRhYmxlSGVpZ2h0OiBudW1iZXI7IGxlZnRIZWlnaHQ6IG51bWJlciB9IHtcbiAgICAgICAgbGV0IGxlZnRIZWlnaHQgPSAwLFxuICAgICAgICAgICAgdGFibGVIZWlnaHRXaXRoU3BsaXRzID0gdGhpcy5oZWlnaHQsXG4gICAgICAgICAgICByb3dJbmRleCA9IDA7XG4gICAgICAgIHdoaWxlIChyb3dJbmRleCA8IHRoaXMucm93TWF0cml4Lmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IHsgaW5kZXgsIHJvd3NIZWlnaHQgfSA9IHRoaXMuZ2V0Um93SW5kZXhCeUhlaWdodChyb3dJbmRleCwgbGVmdFNwYWNlT25QYWdlKTtcbiAgICAgICAgICAgIHJvd0luZGV4ID0gaW5kZXg7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IHRoaXMucm93TWF0cml4Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZWZ0SGVpZ2h0ID0gdGhpcy5yb3dNYXRyaXhcbiAgICAgICAgICAgICAgICAuc2xpY2UoaW5kZXgpXG4gICAgICAgICAgICAgICAgLm1hcCh4ID0+IHguaGVpZ2h0KVxuICAgICAgICAgICAgICAgIC5yZWR1Y2UoKHBhcnRpYWxTdW0sIGN1cnIpID0+IHBhcnRpYWxTdW0gKyBjdXJyICsgdGhpcy5ib3JkZXJTaXplKTtcblxuICAgICAgICAgICAgY29uc3Qgc3BsaXRSb3dIZWlnaHQgPSBzcGFjZUJldHdlZW5QYWdlc0NvbnRlbnQgKyBsZWZ0U3BhY2VPblBhZ2UgLSByb3dzSGVpZ2h0O1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVTcGxpdFJvdyhpbmRleCArIHRoaXMuc3BsaXRzLmxlbmd0aCwgc3BsaXRSb3dIZWlnaHQpO1xuICAgICAgICAgICAgdGhpcy5zcGxpdHMucHVzaChpbmRleCArIHRoaXMuc3BsaXRzLmxlbmd0aCk7XG4gICAgICAgICAgICB0YWJsZUhlaWdodFdpdGhTcGxpdHMgKz0gc3BsaXRSb3dIZWlnaHQ7XG4gICAgICAgICAgICBsZWZ0U3BhY2VPblBhZ2UgPSBjb250ZW50SGVpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNwbGl0c0NvdW50OiB0aGlzLnNwbGl0cy5sZW5ndGgsXG4gICAgICAgICAgICB0YWJsZUhlaWdodDogdGFibGVIZWlnaHRXaXRoU3BsaXRzLFxuICAgICAgICAgICAgbGVmdEhlaWdodFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Um93SW5kZXhCeUhlaWdodChzdGFydEluZGV4OiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogeyBpbmRleDogbnVtYmVyOyByb3dzSGVpZ2h0OiBudW1iZXIgfSB7XG4gICAgICAgIGlmIChzdGFydEluZGV4ID49IHRoaXMucm93TWF0cml4Lmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgaW5kZXg6IHRoaXMucm93TWF0cml4Lmxlbmd0aCwgcm93c0hlaWdodDogMCB9O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHRhYmxlSGVpZ2h0ID0gdGhpcy5yb3dNYXRyaXhbc3RhcnRJbmRleF0uaGVpZ2h0ICsgdGhpcy5ib3JkZXJTaXplLFxuICAgICAgICAgICAgaSA9IHN0YXJ0SW5kZXg7XG5cbiAgICAgICAgd2hpbGUgKHRhYmxlSGVpZ2h0IDwgaGVpZ2h0KSB7XG4gICAgICAgICAgICB0YWJsZUhlaWdodCArPSB0aGlzLnJvd01hdHJpeFtpICsgMV0/LmhlaWdodCArIHRoaXMuYm9yZGVyU2l6ZTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGluZGV4OiBpLCByb3dzSGVpZ2h0OiB0YWJsZUhlaWdodCAtIHRoaXMucm93TWF0cml4W2ldPy5oZWlnaHQgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZVNwbGl0Um93KGluZGV4OiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMudGFibGVFbC5pbnNlcnRSb3coaW5kZXgpO1xuICAgICAgICB0aGlzLnRhYmxlRWwucm93c1tpbmRleF0uc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDtcbiAgICAgICAgdGhpcy50YWJsZUVsLnJvd3NbaW5kZXhdLmNsYXNzTGlzdC5hZGQoJ3NwbGl0LXJvdycpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVtb3ZlU3BsaXRzKCkge1xuICAgICAgICB0aGlzLnNwbGl0cyA9IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy50YWJsZUVsLnF1ZXJ5U2VsZWN0b3IoJy5zcGxpdC1yb3cnKSkge1xuICAgICAgICAgICAgY29uc3QgZWwgPSB0aGlzLnRhYmxlRWwucXVlcnlTZWxlY3RvcignLnNwbGl0LXJvdycpO1xuICAgICAgICAgICAgZWwucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY2FsY3VsYXRlUHJvcGVydGllcygpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnRhYmxlRWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0VGFibGVIZWlnaHQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFRhYmxlV2lkdGgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFibGUuY29sdW1ucy5yZWR1Y2UoKHByZXYsIG5leHQpID0+IHByZXYgKyBuZXh0LndpZHRoICsgdGhpcy5ib3JkZXJTaXplLCAxKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNlbGxIZWlnaHRDaGFuZ2VkID0gKHJvd0luZGV4OiBudW1iZXIsIGNlbGxJbmRleDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCB0YWJsZVJvdyA9IHRoaXMudGFibGUucm93c1tyb3dJbmRleF07XG4gICAgICAgIHRoaXMucm93TWF0cml4W3Jvd0luZGV4XS5jZWxsc1tjZWxsSW5kZXhdLmNlbGxDb250ZW50SGVpZ2h0ID0gaGVpZ2h0IDwgdGhpcy5taW5Sb3dIZWlnaHQgPyB0aGlzLm1pblJvd0hlaWdodCA6IGhlaWdodDtcblxuICAgICAgICBpZiAodGFibGVSb3cuaFJ1bGUgPT09IEhSdWxlLkV4YWN0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByb3dJbmRleFdpdGhTcGxpdCA9IHRoaXMuZ2V0SW5kZXhJbmNsdWRpbmdTcGxpdFJvd3ModGhpcy5yb3dNYXRyaXhbcm93SW5kZXhdLnJvdyk7XG5cbiAgICAgICAgY29uc3Qgcm93ID0gdGhpcy50YWJsZUVsLnJvd3Nbcm93SW5kZXhXaXRoU3BsaXRdO1xuICAgICAgICBjb25zdCBjdXJyZW50SGVpZ2h0ID0gcm93Lm9mZnNldEhlaWdodDtcbiAgICAgICAgY29uc3QgY2VsbEhlaWdodHMgPSB0aGlzLnJvd01hdHJpeFtyb3dJbmRleF0uY2VsbHMubWFwKHggPT4geC5jZWxsQ29udGVudEhlaWdodCk7XG4gICAgICAgIGNvbnN0IG1heENlbGxDb250ZW50SGVpZ2ggPSBNYXRoLm1heCguLi5jZWxsSGVpZ2h0cywgaGVpZ2h0KTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBtYXhDZWxsQ29udGVudEhlaWdoID4gY3VycmVudEhlaWdodCB8fFxuICAgICAgICAgICAgKG1heENlbGxDb250ZW50SGVpZ2ggPCBjdXJyZW50SGVpZ2h0ICYmICghdGFibGVSb3cuaGVpZ2h0IHx8IHRhYmxlUm93LmhlaWdodCA8PSBtYXhDZWxsQ29udGVudEhlaWdoKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByb3cuc3R5bGUuaGVpZ2h0ID0gYCR7bWF4Q2VsbENvbnRlbnRIZWlnaH1weGA7XG4gICAgICAgICAgICB0aGlzLnJvd01hdHJpeFtyb3dJbmRleF0uaGVpZ2h0ID0gbWF4Q2VsbENvbnRlbnRIZWlnaDtcbiAgICAgICAgICAgIHRoaXMuc2V0VGFibGVIZWlnaHQoKTtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yU2VydmljZS5jaGFuZ2VkVGFibGVTaXplKHRoaXMuaW5zZXJ0SW5kZXgsIHRoaXMuc2Vzc2lvbklkKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwcml2YXRlIGdldFNwbGl0Um93SW5kZXgocm93SW5kZXg6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRJbmRleEluY2x1ZGluZ1NwbGl0Um93cyh0aGlzLnJvd01hdHJpeFtyb3dJbmRleF0ucm93KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEluZGV4SW5jbHVkaW5nU3BsaXRSb3dzKHJvdzogSFRNTFRhYmxlUm93RWxlbWVudCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMudGFibGVFbC5yb3dzKS5pbmRleE9mKHJvdyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRSb3dzSGVpZ2h0QmVmb3JlKHJvd0luZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdGhpcy5zcGxpdHMpIHtcbiAgICAgICAgICAgIGlmIChyb3dJbmRleCA8IGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW5kZXggPSBlbGVtZW50ICsgMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmdldFJvd3NIZWlnaHQoMCwgaW5kZXgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Um93c0hlaWdodEJldHdlZW5TcGxpdHMocm93SW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGxldCBzdGFydEluZGV4ID0gMDtcbiAgICAgICAgbGV0IGVuZEluZGV4ID0gdGhpcy50YWJsZUVsLnJvd3MubGVuZ3RoO1xuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdGhpcy5zcGxpdHMpIHtcbiAgICAgICAgICAgIGlmIChyb3dJbmRleCA8IGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBlbmRJbmRleCA9IGVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN0YXJ0SW5kZXggPSBlbGVtZW50ICsgMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmdldFJvd3NIZWlnaHQoc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Um93c0hlaWdodChzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGxldCBzdW0gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgICAgICAgc3VtICs9IHRoaXMudGFibGVFbC5yb3dzW2ldLm9mZnNldEhlaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdW07XG4gICAgfVxuXG4gICAgdXBkYXRlQ2VsbHMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJvd3MgPSB0aGlzLnJvd01hdHJpeC5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGNvbHMgPSByb3dzID4gMCA/IHRoaXMucm93TWF0cml4WzBdLmNlbGxzLmxlbmd0aCA6IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93czsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbHM7IGorKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNlbGwgPSB0aGlzLnJvd01hdHJpeFtpXS5jZWxsc1tqXTtcbiAgICAgICAgICAgICAgICBjZWxsLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5zZXNzaW9uLmRpc3BsYXlEYXRhLnVwZGF0ZU5leHRMaW5lSW5kZXhlcyhcbiAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgY2VsbC5jb21wb25lbnRSZWYuaW5zdGFuY2Uuc2Vzc2lvbi5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLmxlbmd0aCAtIDFcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIl19