@talrace/ngx-noder 0.0.18 → 0.0.19

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,839 +0,0 @@
1
- import { BreakHelper } from '../../gadgets/page-break/break.helper';
2
- import { BreakTypes } from '../../gadgets/page-break/break-types.enum';
3
- import { ContentStyleHelper } from '../helpers/content-style.helper';
4
- import { CursorParagraph } from '../../positioning/cursor-paragraph';
5
- import { DEFAULT_FONT_SIZE, DEFAULT_PARAGRAPH_STYLE, NEW_LINE_MARKUP } from '../constants/editor.const';
6
- import { DisplayToken } from './display-token.model';
7
- import { DisplayTokenHelper } from '../helpers/display-token.helper';
8
- import { DisplayValue } from '../constants/display-values.const';
9
- import { EdgeType } from '../../components/edges/edge-type.enum';
10
- import { EventEmitting } from '../../core/event-emitting';
11
- import { FontMetrics } from '../../gadgets/font-metrics/font-metrics.helper';
12
- import { FormatStyleHelper } from '../../execution/helpers/format-style.helper';
13
- import { IndentModel } from './indent.model';
14
- import { LineInfoModel } from './line-info.model';
15
- import { NoderTableComponent } from '../../components/table/components/table.component';
16
- import { NumberingHelper } from '../../gadgets/numbering/numbering.helper';
17
- import { PageHelper } from '../../execution/helpers/page.helper';
18
- import { PageType } from '../../components/edges/page-type.enum';
19
- import { PageVerticalDataModel } from '../page-vertical-data.model';
20
- import { Paragraph } from './paragraph';
21
- import { ParagraphHelper } from '../../execution/helpers/paragraph.helper';
22
- import { ParagraphInfoModel } from './models/paragraph-info.model';
23
- import { ParagraphStyleHelper } from '../../execution/helpers/paragraph-style.helper';
24
- import { Range } from '../../positioning/range';
25
- import { TabHelper } from '../../components/tab/tab.helper';
26
- export class DisplayData extends EventEmitting {
27
- get defaultVerticalData() {
28
- return this.pagesVerticalData.find(x => x.pageType === PageType.Default);
29
- }
30
- constructor(model, generalProperties, sessionId, pageMargin, pagesSpace, pageWidth, pageHeight, customComponents, customContentService, editorService) {
31
- super();
32
- this.model = model;
33
- this.generalProperties = generalProperties;
34
- this.sessionId = sessionId;
35
- this.pageMargin = pageMargin;
36
- this.pagesSpace = pagesSpace;
37
- this.pageWidth = pageWidth;
38
- this.pageHeight = pageHeight;
39
- this.customComponents = customComponents;
40
- this.customContentService = customContentService;
41
- this.editorService = editorService;
42
- this.paragraphs = [];
43
- this.allPagesHeight = 0;
44
- this.minHeight = 0;
45
- this.tabTokens = [];
46
- this.paragraphs = this.splitByParagraphs(this.model.content).map(x => new ParagraphInfoModel({ content: x }));
47
- this.minHeight = this.pageHeight + 2 * this.pagesSpace;
48
- this.contentWidth = this.pageWidth - this.pageMargin.left - this.pageMargin.right;
49
- this.initPagesVerticalData();
50
- this.processTextLinesProperties = !this.pageHeight
51
- ? ParagraphHelper.processTextLinesPropertiesForSinglePage
52
- : ParagraphHelper.processTextLinesProperties;
53
- }
54
- insertText(position, text) {
55
- const endPoint = this.insertTextAndReturnEndCursorPosition(text, position);
56
- return endPoint;
57
- }
58
- removeRange(range) {
59
- const paragraphText = this.paragraphs[range.start.row].content.slice(0, range.start.column) +
60
- this.paragraphs[range.end.row].content.slice(range.end.column);
61
- const paragraphSettings = this.getParagraphSettings(range.start.row);
62
- this.paragraphs.splice(range.start.row, range.end.row - range.start.row + 1, new ParagraphInfoModel({ content: paragraphText }));
63
- this.paragraphs[range.start.row].paragraphSettings = paragraphSettings;
64
- }
65
- getParagraphContent(index) {
66
- return this.paragraphs[index]?.content || '';
67
- }
68
- getAllParagraphsContent() {
69
- return this.paragraphs.map(x => x.content);
70
- }
71
- getParagraphSettings(index) {
72
- return this.paragraphs[index]?.paragraphSettings || null;
73
- }
74
- getParagraphsContentForRange(range) {
75
- if (range.isSingleLine) {
76
- const line = this.getParagraphContent(range.start.row);
77
- const linePartInRange = line.slice(range.start.column, range.end.column);
78
- return [linePartInRange];
79
- }
80
- const paragraphsContent = this.paragraphs.slice(range.start.row, range.end.row + 1).map(x => x.content);
81
- paragraphsContent[0] = (paragraphsContent[0] || '').slice(range.start.column);
82
- const lastIndex = paragraphsContent.length - 1;
83
- paragraphsContent[lastIndex] = paragraphsContent[lastIndex].slice(0, range.end.column);
84
- return paragraphsContent;
85
- }
86
- getTextRange(range) {
87
- return this.getParagraphsContentForRange(range).join(NEW_LINE_MARKUP);
88
- }
89
- positionToIndex(position, startRow = 0) {
90
- let index = 0;
91
- const endRow = Math.min(position.row, this.paragraphs.length);
92
- for (let i = startRow || 0; i < endRow; i++) {
93
- index += this.paragraphs[i].content.length + 1;
94
- }
95
- return index + position.column;
96
- }
97
- indexToPosition(positionIndex, startRow) {
98
- const newlineLength = NEW_LINE_MARKUP.length;
99
- for (let lineIndex = startRow || 0; lineIndex < this.paragraphs.length; lineIndex++) {
100
- positionIndex -= this.paragraphs[lineIndex].content.length + newlineLength;
101
- if (positionIndex < 0) {
102
- const column = positionIndex + this.paragraphs[lineIndex].content.length + newlineLength;
103
- return new CursorParagraph(lineIndex, column);
104
- }
105
- }
106
- const column = positionIndex + this.paragraphs[this.paragraphs.length - 1].content.length + newlineLength;
107
- return new CursorParagraph(this.paragraphs.length - 1, column);
108
- }
109
- indexesToRange(startIndex, endIndex) {
110
- const startPoint = this.indexToPosition(startIndex, 0);
111
- const endPoint = this.indexToPosition(endIndex, 0);
112
- return new Range(startPoint, endPoint);
113
- }
114
- isNewLineSymbol(index) {
115
- const text = this.paragraphs.map(x => x.content).join(NEW_LINE_MARKUP);
116
- return !text || !text[index] || text[index] === NEW_LINE_MARKUP;
117
- }
118
- getSelectedParagraphsByRange(range) {
119
- const newlineLength = NEW_LINE_MARKUP.length;
120
- let start = 0;
121
- let end = 0;
122
- let i;
123
- const row = Math.min(range.end.row, this.paragraphs.length - 1);
124
- for (i = 0; i < row; i++) {
125
- if (i < range.start.row) {
126
- start += this.paragraphs[i].content.length + newlineLength;
127
- }
128
- end += this.paragraphs[i].content.length + newlineLength;
129
- }
130
- if (i < this.paragraphs.length) {
131
- end += this.paragraphs[i].content.length;
132
- }
133
- return { start, end };
134
- }
135
- getPositionAfterBreak(position, breakType) {
136
- if (breakType === BreakTypes.TextWrapping) {
137
- return position;
138
- }
139
- const isLastColumn = position.column === this.paragraphs[position.row].content.length;
140
- const isLastParagraph = position.row === this.paragraphs.length - 1;
141
- return isLastColumn && !isLastParagraph ? new CursorParagraph(position.row + 1, 0) : position;
142
- }
143
- getDistanceFromTop(index) {
144
- return this.paragraphs[index]?.paragraphSettings ? this.paragraphs[index].paragraphSettings.distanceFromTop : 0;
145
- }
146
- getDistanceFromTopForPrint(index) {
147
- if (!this.paragraphs[index]?.paragraphSettings) {
148
- return 0;
149
- }
150
- const paragraph = this.paragraphs[index].paragraphSettings;
151
- const pageNumber = paragraph.pageNumbers[0];
152
- let pageBreakHeight = 0;
153
- paragraph.textLinesInfo.forEach(linesInfo => {
154
- if (linesInfo.isAfterPageBreak) {
155
- pageBreakHeight = linesInfo.height;
156
- }
157
- });
158
- return paragraph.distanceFromTop - pageNumber * this.pagesSpace - pageBreakHeight;
159
- }
160
- setParagraphSettings(row, lineInfos, numberingData) {
161
- if (!this.paragraphs[row].paragraphSettings) {
162
- this.paragraphs[row].paragraphSettings = new Paragraph(numberingData, lineInfos[0].offsetBefore, this.processTextLinesProperties);
163
- }
164
- this.paragraphs[row].paragraphSettings.numberingData = numberingData;
165
- this.paragraphs[row].paragraphSettings.width = this.contentWidth;
166
- this.paragraphs[row].paragraphSettings.setTextLinesInfo(lineInfos);
167
- }
168
- getParagraphHeight(index) {
169
- return this.paragraphs[index]?.paragraphSettings ? this.paragraphs[index].paragraphSettings.height : 0;
170
- }
171
- getVisibleRange(offsetTop, scrollerHeight) {
172
- let start = this.paragraphs.findIndex(x => offsetTop <= x.paragraphSettings?.distanceFromTop + x.paragraphSettings?.height);
173
- if (start < 0) {
174
- start = 0;
175
- }
176
- let startLineInfo = null;
177
- const startParagraph = this.paragraphs[start];
178
- if (startParagraph) {
179
- const startParagraphOffsetTop = offsetTop - startParagraph.paragraphSettings.distanceFromTop;
180
- startLineInfo = ParagraphHelper.getVisibleLineInfo(startParagraph?.paragraphSettings.textLinesInfo, startParagraphOffsetTop, 1);
181
- }
182
- if (!startLineInfo) {
183
- return {
184
- startParagraph: 0,
185
- startLine: 0,
186
- startScreenLine: 0,
187
- startScreenFullLine: 0,
188
- endParagraph: 0,
189
- endLine: 0,
190
- endScreenLine: 0,
191
- endScreenFullLine: 0,
192
- pages: [1]
193
- };
194
- }
195
- let end = this.paragraphs.findIndex(x => offsetTop + scrollerHeight <= x.paragraphSettings.distanceFromTop + x.paragraphSettings.height);
196
- if (end < 0) {
197
- end = this.paragraphs.length - 1;
198
- }
199
- let endLineInfo = null;
200
- const endParagraph = this.paragraphs[end];
201
- if (endParagraph) {
202
- const endParagraphOffsetTop = offsetTop + scrollerHeight - endParagraph.paragraphSettings.distanceFromTop;
203
- endLineInfo = ParagraphHelper.getVisibleLineInfo(endParagraph.paragraphSettings?.textLinesInfo, endParagraphOffsetTop, -1);
204
- }
205
- const visiblePages = this.getVisiblePages(offsetTop, scrollerHeight);
206
- return {
207
- startParagraph: start,
208
- startLine: startLineInfo.index,
209
- startScreenLine: startLineInfo.screenIndex,
210
- startScreenFullLine: startLineInfo.visibleScreenIndex,
211
- endParagraph: end,
212
- endLine: endLineInfo.index,
213
- endScreenLine: endLineInfo.screenIndex,
214
- endScreenFullLine: endLineInfo.visibleScreenIndex,
215
- pages: visiblePages
216
- };
217
- }
218
- processParagraphsProperties(startParagraphIndex) {
219
- this.setParagraphIndexes();
220
- const pagesInfo = { pagesVerticalData: this.pagesVerticalData, pagesSpace: this.pagesSpace };
221
- let currentPage = startParagraphIndex === 0 ? 1 : this.paragraphs[startParagraphIndex - 1].paragraphSettings.lastPageNumber;
222
- let pageVerticalData = PageHelper.getVerticalData(currentPage, this.pagesVerticalData);
223
- for (let i = startParagraphIndex; i < this.paragraphs.length; i++) {
224
- const prevParagraphInfo = this.getPreviousParagraphInfo(i);
225
- const paragraphSettings = this.paragraphs[i].paragraphSettings;
226
- paragraphSettings.processParagraphProperties(prevParagraphInfo, pagesInfo, this.customComponents.tables);
227
- if (paragraphSettings.firstPageNumber !== currentPage) {
228
- currentPage = paragraphSettings.firstPageNumber;
229
- pageVerticalData = PageHelper.getVerticalData(paragraphSettings.firstPageNumber, this.pagesVerticalData);
230
- }
231
- paragraphSettings.calculateDistanceFromTop(this.pageHeight, this.pagesSpace, pageVerticalData.marginTop);
232
- }
233
- let pageHeight = this.pageHeight;
234
- if (!pageHeight) {
235
- pageHeight = this.getAllParagraphsHeight() + this.pageMargin.top + this.pageMargin.bottom;
236
- this.minHeight = pageHeight + 2 * this.pagesSpace;
237
- this.defaultVerticalData.contentHeight = pageHeight;
238
- }
239
- const lastPageNumber = this.paragraphs[this.paragraphs.length - 1].paragraphSettings.lastPageNumber;
240
- this.allPagesHeight = lastPageNumber * (pageHeight + this.pagesSpace) + this.pagesSpace;
241
- this.emit('pagesCountChanged', { pagesCount: lastPageNumber, pageHeight: pageHeight + 2 * this.pagesSpace });
242
- }
243
- getAllParagraphsHeight() {
244
- return this.paragraphs.reduce((sum, x) => sum + x.paragraphSettings.height, 0);
245
- }
246
- destroy() {
247
- this.removeAllListeners('pagesCountChanged');
248
- }
249
- updatePageVerticalData(edgeType, pageType) {
250
- const pageVerticalData = this.pagesVerticalData.find(x => x.pageType === pageType);
251
- const componentHeight = this.customComponents.edges.getComponentHeightByType(pageType, edgeType);
252
- if (edgeType === EdgeType.Header) {
253
- pageVerticalData.marginTop = componentHeight > this.pageMargin.top ? componentHeight : this.pageMargin.top;
254
- }
255
- else {
256
- pageVerticalData.marginBottom = componentHeight > this.pageMargin.bottom ? componentHeight : this.pageMargin.bottom;
257
- }
258
- const newContentHeight = this.pageHeight - pageVerticalData.marginTop - pageVerticalData.marginBottom;
259
- if (newContentHeight === pageVerticalData.contentHeight) {
260
- return;
261
- }
262
- pageVerticalData.contentHeight = newContentHeight;
263
- this.processParagraphsProperties(0);
264
- }
265
- updateParagraphLineNumber(first) {
266
- const count = this.paragraphs.length;
267
- if (first === 0) {
268
- this.paragraphs[first].lineNumber = 0;
269
- first++;
270
- }
271
- for (let i = first; i < count; i++) {
272
- this.paragraphs[i].lineNumber = this.paragraphs[i - 1].lineNumber + this.paragraphs[i - 1].nextLineIndexes.length + 1;
273
- }
274
- }
275
- updateParagraphStartIndex(first) {
276
- if (first === 0) {
277
- this.paragraphs[first].startIndex = 0;
278
- first++;
279
- }
280
- for (let i = first; i < this.paragraphs.length; i++) {
281
- this.paragraphs[i].startIndex = this.paragraphs[i - 1].startIndex + this.getParagraphContent(i - 1).length + 1;
282
- }
283
- }
284
- updateParagraphSettingsNumberingData(index) {
285
- const paragraphSettings = this.getParagraphSettings(index);
286
- if (paragraphSettings.numberingData.numberingId !== this.model.paragraphs[index].paragraphStyle.numberingId) {
287
- paragraphSettings.numberingData = NumberingHelper.createDataModel(this.generalProperties.numberings, this.model.paragraphs, index, this.generalProperties.numberingInfo);
288
- }
289
- if (paragraphSettings.numberingData.numberingId !== null) {
290
- const paragraphFormat = FormatStyleHelper.getFormatAtIndex(this.model.formats, this.model.paragraphs[index].insertIndex);
291
- NumberingHelper.updateMarkerData(this.generalProperties, paragraphSettings, paragraphFormat.textStyle, this.model.paragraphs[index].paragraphStyle);
292
- }
293
- }
294
- updateNextLineIndexes(firstParagraph, lastParagraph) {
295
- this.updateParagraphStartIndex(firstParagraph);
296
- let indexOfParagraphAfterPageBreak = this.getParagraphSettings(firstParagraph - 1)?.isEndedByPageBreak ? firstParagraph : -1;
297
- let firstUsedTabIndex = this.model.tabs.findIndex(x => x.insertIndex >= this.paragraphs[firstParagraph].startIndex);
298
- for (let i = firstParagraph; i <= lastParagraph; i++) {
299
- if (!this.paragraphs[i]) {
300
- continue;
301
- }
302
- this.tabTokens = [];
303
- NumberingHelper.calculateNumberingInfo(this.model.paragraphs[i].paragraphStyle.numberingId, this.model.paragraphs[i].paragraphStyle.numberingLevel, this.getParagraphSettings(i)?.numberingData.marker, this.generalProperties.numberingInfo, this.generalProperties.numberings);
304
- const numberingData = NumberingHelper.createDataModel(this.generalProperties.numberings, this.model.paragraphs, i, this.generalProperties.numberingInfo);
305
- const { splits, rowInfos } = this.getSplits(this.model, i);
306
- this.paragraphs[i].nextLineIndexes = splits;
307
- if (indexOfParagraphAfterPageBreak === i) {
308
- rowInfos[0].isAfterPageBreak = true;
309
- }
310
- indexOfParagraphAfterPageBreak = rowInfos[rowInfos.length - 1].isEndedByPageBreak ? i + 1 : -1;
311
- this.setParagraphSettings(i, rowInfos, numberingData);
312
- this.updateParagraphSettingsNumberingData(i);
313
- firstUsedTabIndex = this.updateParagraphTabs(firstUsedTabIndex, i);
314
- }
315
- this.getParagraphSettings(lastParagraph + 1)?.setIsAfterPageBreak(indexOfParagraphAfterPageBreak > -1);
316
- this.updateParagraphLineNumber(firstParagraph);
317
- this.processParagraphsProperties(firstParagraph);
318
- }
319
- updateNumberingsDataOnChange(index) {
320
- for (let i = index; i < this.paragraphs.length; i++) {
321
- const paragraphStyle = this.model.paragraphs[i].paragraphStyle;
322
- const paragraphSettings = this.getParagraphSettings(i);
323
- if (this.model.paragraphs[i].paragraphStyle.numberingId !== null) {
324
- NumberingHelper.calculateNumberingInfo(paragraphStyle.numberingId, paragraphStyle.numberingLevel, paragraphSettings.numberingData.marker, this.generalProperties.numberingInfo, this.generalProperties.numberings);
325
- paragraphSettings.numberingData = NumberingHelper.createDataModel(this.generalProperties.numberings, this.model.paragraphs, i, this.generalProperties.numberingInfo);
326
- const paragraphFormat = FormatStyleHelper.getFormatAtIndex(this.model.formats, this.model.paragraphs[i].insertIndex);
327
- NumberingHelper.updateMarkerData(this.generalProperties, paragraphSettings, paragraphFormat.textStyle, paragraphStyle);
328
- }
329
- const table = this.customContentService.findComponent(this.customComponents.tables, paragraphSettings.startInsertIndex);
330
- if (table) {
331
- table.instance.updateCells();
332
- }
333
- }
334
- if ('pageType' in this.model) {
335
- this.editorService.updateEdges(this.sessionId);
336
- }
337
- }
338
- resetAllNumberingInfo(paragraphIndex) {
339
- for (let i = paragraphIndex; i < this.model.paragraphs.length; i++) {
340
- const { numberingId, numberingLevel } = this.model.paragraphs[i].paragraphStyle;
341
- if (numberingId !== null &&
342
- this.generalProperties.numberingInfo[numberingId] &&
343
- this.generalProperties.numberingInfo[numberingId][numberingLevel]) {
344
- this.generalProperties.numberingInfo[numberingId][numberingLevel].visited = false;
345
- }
346
- }
347
- }
348
- resetNumberingInfoByTableCell(table) {
349
- for (let i = 0; i < table.instance.rowMatrix.length; i++) {
350
- for (let cell of table.instance.rowMatrix[i].cells) {
351
- const { marker, numberingId } = cell.componentRef.instance.session.displayData.paragraphs[0].paragraphSettings.numberingData;
352
- if (marker && numberingId) {
353
- NumberingHelper.updateNumberingInfo(this.generalProperties.numberingInfo, marker, numberingId);
354
- this.resetAllNumberingInfo(0);
355
- return;
356
- }
357
- }
358
- }
359
- }
360
- updateParagraphTabs(tabIndex, paragraphIndex) {
361
- const paragraphContentLength = this.getParagraphContent(paragraphIndex).length;
362
- const paragraphLastIndex = this.paragraphs[paragraphIndex].startIndex + paragraphContentLength;
363
- if (tabIndex === -1 ||
364
- tabIndex >= this.customComponents.tabs.length ||
365
- this.customComponents.tabs[tabIndex].instance.insertIndex > paragraphLastIndex) {
366
- return tabIndex;
367
- }
368
- const startIndex = tabIndex;
369
- while (this.customComponents.tabs[tabIndex] && this.customComponents.tabs[tabIndex].instance.insertIndex <= paragraphLastIndex) {
370
- this.customComponents.tabs[tabIndex].instance.width = this.tabTokens[tabIndex - startIndex].width;
371
- this.customComponents.tabs[tabIndex].instance.height = this.tabTokens[tabIndex - startIndex].font;
372
- tabIndex++;
373
- }
374
- return tabIndex;
375
- }
376
- getSplits(model, paragraphIndex) {
377
- const paragraphContent = this.getParagraphContent(paragraphIndex);
378
- const strTokens = this.getDisplayTokens(model, paragraphContent, this.paragraphs[paragraphIndex].startIndex);
379
- if (!strTokens.length) {
380
- const defaultRowInfo = new LineInfoModel({
381
- height: (DEFAULT_FONT_SIZE * 4) / 3,
382
- width: 0,
383
- align: DEFAULT_PARAGRAPH_STYLE.alignment,
384
- indent: new IndentModel(DEFAULT_PARAGRAPH_STYLE.indentFirstLine, DEFAULT_PARAGRAPH_STYLE.indentHanging, DEFAULT_PARAGRAPH_STYLE.indentLeft, DEFAULT_PARAGRAPH_STYLE.indentRight),
385
- offsetAfter: DEFAULT_PARAGRAPH_STYLE.spaceAfter,
386
- offsetBefore: DEFAULT_PARAGRAPH_STYLE.spaceBefore,
387
- lineSpacing: DEFAULT_PARAGRAPH_STYLE.lineSpacing,
388
- isAfterPageBreak: false,
389
- isEndedByPageBreak: false,
390
- backgroundColor: DEFAULT_PARAGRAPH_STYLE.backgroundColor
391
- });
392
- return { splits: [], rowInfos: [defaultRowInfo] };
393
- }
394
- const splits = [];
395
- const rowInfos = [];
396
- let prevToken;
397
- let index = -1;
398
- let initial = paragraphContent;
399
- while (index) {
400
- initial = initial.slice(index > 0 ? index : 0);
401
- const tokens = strTokens.slice(paragraphContent.length - initial.length);
402
- if (!tokens.length) {
403
- tokens.push(...this.getEmptyDisplayTokens(model, this.paragraphs[paragraphIndex].startIndex + index));
404
- }
405
- let wrapLimit = this.computeWrapIndex(tokens, this.contentWidth, this.generalProperties.defaultTabWidth);
406
- if (tokens[tokens.length - 1].isPageBreak && wrapLimit === tokens.length && this.paragraphs.length > paragraphIndex + 1) {
407
- wrapLimit = 0;
408
- }
409
- const wrapSplit = tokens[wrapLimit - 1]?.breaksLine || tokens[wrapLimit - 1]?.isTable ? wrapLimit : this.computeWrapSplit(tokens, wrapLimit);
410
- const wrapTokens = tokens.slice(0, wrapSplit || undefined);
411
- if (wrapTokens.length) {
412
- prevToken = wrapTokens[wrapTokens.length - 1];
413
- }
414
- const isAfterPageBreak = !rowInfos.length ? false : rowInfos[rowInfos.length - 1].isEndedByPageBreak;
415
- const lineInfo = DisplayTokenHelper.getLineInfoFromToken(prevToken, wrapTokens[0], wrapTokens, isAfterPageBreak);
416
- lineInfo.backgroundColor = model.paragraphs[paragraphIndex].paragraphStyle.backgroundColor;
417
- rowInfos.push(lineInfo);
418
- if (!wrapLimit) {
419
- break;
420
- }
421
- index = wrapSplit;
422
- const splitsLength = splits.length;
423
- const splitIndex = splitsLength ? index + splits[splitsLength - 1] : index;
424
- splits.push(splitIndex);
425
- }
426
- this.tabTokens.push(...strTokens.filter(x => x.isTab));
427
- ParagraphHelper.applyParagraphIndentsToLines(rowInfos, paragraphIndex, model.paragraphs);
428
- return { splits, rowInfos };
429
- }
430
- /**
431
- * Given a string, returns an array of the display characters, including tabs and spaces and custom components.
432
- */
433
- getDisplayTokens(model, str, startIndex) {
434
- if (!str.length) {
435
- return this.getEmptyDisplayTokens(model, startIndex);
436
- }
437
- return this.fillLineTokens(startIndex, str, model);
438
- }
439
- fillLineTokens(startIndex, line, model) {
440
- const lineInfo = this.getLineInfoByBreakModifier(model, startIndex + line.length);
441
- const tokens = [];
442
- let characters = [];
443
- let format = FormatStyleHelper.getFormatAtIndex(model.formats, startIndex);
444
- let prevFormat = null;
445
- let prevCharCode = null;
446
- let prevFontString = null;
447
- let prevChar = null;
448
- let fontString = ContentStyleHelper.getFontStylesString(format?.textStyle);
449
- let symbolChange = false;
450
- for (let i = 0; i < line.length; i++) {
451
- const char = line[i];
452
- const size = FontMetrics.measureCharSize(char, fontString);
453
- const customComponent = this.getOrGenerateComponent(startIndex, char);
454
- const breakType = BreakHelper.getBreakType(model, char, startIndex);
455
- if (customComponent && !breakType) {
456
- const token = this.customContentService.getTokenFromComponent(customComponent, lineInfo, DisplayValue.customContent, i === 0, size);
457
- tokens.push(token);
458
- prevCharCode = -1;
459
- prevChar = '';
460
- characters = [];
461
- }
462
- else {
463
- const charCode = char.charCodeAt(0);
464
- const displayValue = DisplayTokenHelper.getDisplayValue(charCode);
465
- const isFirstCharacter = i === 0;
466
- const token = new DisplayToken({
467
- ...size,
468
- displayValue,
469
- align: lineInfo.align,
470
- indentFirstLine: isFirstCharacter ? lineInfo.indent.firstLine : DEFAULT_PARAGRAPH_STYLE.indentFirstLine,
471
- indentHanging: isFirstCharacter ? lineInfo.indent.hanging : DEFAULT_PARAGRAPH_STYLE.indentHanging,
472
- indentLeft: lineInfo.indent.left,
473
- indentRight: lineInfo.indent.right,
474
- indentBefore: lineInfo.offsetBefore,
475
- indentAfter: lineInfo.offsetAfter,
476
- lineSpacing: lineInfo.lineSpacing,
477
- isPageBreak: breakType === BreakTypes.Page,
478
- isLineBreak: breakType === BreakTypes.TextWrapping,
479
- isTab: false
480
- });
481
- tokens.push(token);
482
- if (charCode !== prevCharCode ||
483
- !prevFormat ||
484
- !ContentStyleHelper.areSameTextStyles(format?.textStyle, prevFormat?.textStyle)) {
485
- symbolChange = true;
486
- }
487
- else if (i === line.length - 1) {
488
- characters.push(token);
489
- symbolChange = true;
490
- }
491
- else {
492
- characters.push(token);
493
- }
494
- if (characters.length > 1 && symbolChange) {
495
- this.processCharSizes(prevChar, prevFontString, characters);
496
- characters = [token];
497
- symbolChange = false;
498
- }
499
- else if (symbolChange) {
500
- characters = [token];
501
- }
502
- prevCharCode = charCode;
503
- prevChar = char;
504
- }
505
- prevFormat = format;
506
- prevFontString = fontString;
507
- startIndex++;
508
- if (startIndex > format?.endIndex) {
509
- format = FormatStyleHelper.getFormatAtIndex(model.formats, startIndex);
510
- fontString = ContentStyleHelper.getFontStylesString(format?.textStyle);
511
- }
512
- }
513
- return tokens;
514
- }
515
- getOrGenerateComponent(charIndex, char) {
516
- if (!this.customContentService.isSpecialMarker(char)) {
517
- return null;
518
- }
519
- const existingComponent = this.customContentService.getComponent(this.customComponents, char, charIndex);
520
- if (existingComponent) {
521
- if (existingComponent.instance instanceof NoderTableComponent) {
522
- existingComponent.instance.updateCells();
523
- }
524
- return existingComponent;
525
- }
526
- return this.customContentService.generateComponent(this.model, this.customComponents, this.sessionId, this.generalProperties, this.contentWidth, charIndex);
527
- }
528
- processCharSizes(prevChar, prevFontString, characters) {
529
- const newSize = FontMetrics.measureCharSize(prevChar, prevFontString);
530
- for (let item of characters) {
531
- Object.assign(item, newSize);
532
- }
533
- }
534
- getLineTokens(model, line, startIndex) {
535
- const lineInfo = this.getLineInfoFromTextLine(startIndex + line.length);
536
- if (!line.length) {
537
- return this.getEmptyLineTokens(model, startIndex, lineInfo);
538
- }
539
- const tokens = [];
540
- let characters = [];
541
- let format = FormatStyleHelper.getFormatAtIndex(model.formats, startIndex);
542
- let prevFormat = null;
543
- let prevCharCode = null;
544
- let prevFontString = null;
545
- let prevChar = null;
546
- let fontString = ContentStyleHelper.getFontStylesString(format?.textStyle);
547
- let symbolChange = false;
548
- for (let i = 0; i < line.length; i++) {
549
- const char = line[i];
550
- const size = FontMetrics.measureCharSize(char, fontString);
551
- const customComponent = this.customContentService.getComponent(this.customComponents, char, startIndex);
552
- const breakType = BreakHelper.getBreakType(model, char, startIndex);
553
- if (customComponent && !breakType) {
554
- const token = this.customContentService.getTokenFromComponent(customComponent, lineInfo, DisplayValue.customContent, i === 0, size);
555
- tokens.push(token);
556
- prevCharCode = -1;
557
- prevChar = '';
558
- characters = [];
559
- }
560
- else {
561
- const charCode = char.charCodeAt(0);
562
- const displayValue = DisplayTokenHelper.getDisplayValue(charCode);
563
- const isFirstCharacter = i === 0;
564
- const token = new DisplayToken({
565
- ...size,
566
- displayValue,
567
- align: lineInfo.align,
568
- indentFirstLine: isFirstCharacter ? lineInfo.indent.firstLine : DEFAULT_PARAGRAPH_STYLE.indentFirstLine,
569
- indentHanging: isFirstCharacter ? lineInfo.indent.hanging : DEFAULT_PARAGRAPH_STYLE.indentHanging,
570
- indentLeft: lineInfo.indent.left,
571
- indentRight: lineInfo.indent.right,
572
- indentBefore: lineInfo.offsetBefore,
573
- indentAfter: lineInfo.offsetAfter,
574
- lineSpacing: lineInfo.lineSpacing,
575
- isPageBreak: breakType === BreakTypes.Page,
576
- isLineBreak: breakType === BreakTypes.TextWrapping,
577
- isTab: false
578
- });
579
- tokens.push(token);
580
- if (charCode !== prevCharCode ||
581
- !prevFormat ||
582
- !ContentStyleHelper.areSameTextStyles(format?.textStyle, prevFormat?.textStyle)) {
583
- symbolChange = true;
584
- }
585
- else if (i === line.length - 1) {
586
- characters.push(token);
587
- symbolChange = true;
588
- }
589
- else {
590
- characters.push(token);
591
- }
592
- if (characters.length > 1 && symbolChange) {
593
- this.processCharSizes(prevChar, prevFontString, characters);
594
- characters = [token];
595
- symbolChange = false;
596
- }
597
- else if (symbolChange) {
598
- characters = [token];
599
- }
600
- prevCharCode = charCode;
601
- prevChar = char;
602
- }
603
- prevFormat = format;
604
- prevFontString = fontString;
605
- startIndex++;
606
- if (startIndex > format?.endIndex) {
607
- format = FormatStyleHelper.getFormatAtIndex(model.formats, startIndex);
608
- fontString = ContentStyleHelper.getFontStylesString(format?.textStyle);
609
- }
610
- }
611
- return tokens;
612
- }
613
- getEmptyDisplayTokens(model, startIndex) {
614
- const lineInfo = this.getLineInfoByBreakModifier(model, startIndex);
615
- return this.getEmptyLineTokens(model, startIndex, lineInfo);
616
- }
617
- getEmptyLineTokens(model, startIndex, lineInfo) {
618
- const storedFormat = FormatStyleHelper.getFormatAtIndex(model.formats, startIndex);
619
- if (!storedFormat) {
620
- return [];
621
- }
622
- const size = FontMetrics.measureCharSize('EMPTY_LINE', ContentStyleHelper.getFontStylesString(storedFormat.textStyle));
623
- size.width = 3;
624
- return [
625
- new DisplayToken({
626
- ...size,
627
- displayValue: DisplayValue.emptyLine,
628
- align: lineInfo.align,
629
- indentFirstLine: lineInfo.indent.firstLine,
630
- indentHanging: lineInfo.indent.hanging,
631
- indentLeft: lineInfo.indent.left,
632
- indentRight: lineInfo.indent.right,
633
- indentBefore: lineInfo.offsetBefore,
634
- indentAfter: lineInfo.offsetAfter,
635
- isPageBreak: false,
636
- isLineBreak: false,
637
- isTab: false,
638
- lineSpacing: lineInfo.lineSpacing
639
- })
640
- ];
641
- }
642
- getLineInfoByBreakModifier(model, index) {
643
- const paragraph = ParagraphStyleHelper.getParagraphAtIndex(model.paragraphs, index);
644
- if (!paragraph) {
645
- return new LineInfoModel({
646
- align: DEFAULT_PARAGRAPH_STYLE.alignment,
647
- indent: new IndentModel(DEFAULT_PARAGRAPH_STYLE.indentFirstLine, DEFAULT_PARAGRAPH_STYLE.indentHanging, DEFAULT_PARAGRAPH_STYLE.indentLeft, DEFAULT_PARAGRAPH_STYLE.indentRight),
648
- offsetBefore: DEFAULT_PARAGRAPH_STYLE.spaceBefore,
649
- offsetAfter: DEFAULT_PARAGRAPH_STYLE.spaceAfter,
650
- lineSpacing: DEFAULT_PARAGRAPH_STYLE.lineSpacing
651
- });
652
- }
653
- const indentLeft = this.getParagraphIndentLeft(model, paragraph);
654
- return this.getLineInfoModel(paragraph, indentLeft);
655
- }
656
- getParagraphIndentLeft(model, paragraph) {
657
- const numberingId = paragraph.paragraphStyle.numberingId;
658
- if (numberingId === null) {
659
- return paragraph.paragraphStyle.indentLeft;
660
- }
661
- const level = paragraph.paragraphStyle.numberingLevel;
662
- const paragraphIndex = model.paragraphs.indexOf(paragraph);
663
- const levelModel = NumberingHelper.find(this.generalProperties.numberings, numberingId, level);
664
- const paragraphFormat = FormatStyleHelper.getFormatAtIndex(model.formats, paragraph.insertIndex);
665
- const markerTextStyle = ContentStyleHelper.combineTextStyles(levelModel.markerStyle, paragraphFormat.textStyle);
666
- const paragraphSettings = this.getParagraphSettings(paragraphIndex);
667
- let markerWidth = paragraphSettings?.numberingData?.width;
668
- const marker = NumberingHelper.getMarker(levelModel, numberingId, model.paragraphs, paragraphIndex, this.generalProperties.numberingInfo);
669
- const markerSizes = NumberingHelper.getMarkerSizes(marker, markerTextStyle);
670
- markerWidth = markerSizes.width;
671
- const hangingIndent = paragraph.paragraphStyle.indentHanging ? paragraph.paragraphStyle.indentHanging : levelModel.indentHanging;
672
- let paragraphIndent = levelModel.indentLeft;
673
- if (markerWidth >= hangingIndent) {
674
- const markerOverflow = markerWidth - hangingIndent;
675
- const additionalMarkerIndent = TabHelper.calculateTabWidth(levelModel.indentLeft + markerOverflow, this.generalProperties.defaultTabWidth);
676
- paragraphIndent += markerOverflow + additionalMarkerIndent;
677
- }
678
- return paragraphIndent;
679
- }
680
- getLineInfoFromTextLine(index) {
681
- const paragraph = ParagraphStyleHelper.getParagraphAtIndex(this.model.paragraphs, index);
682
- const indentLeft = this.getIndentLeftFromTextLine(index);
683
- return this.getLineInfoModel(paragraph, indentLeft);
684
- }
685
- getLineInfoModel(paragraph, indentLeft) {
686
- const indentHanging = paragraph.paragraphStyle.numberingId === null ? paragraph.paragraphStyle.indentHanging : 0;
687
- return new LineInfoModel({
688
- align: paragraph.paragraphStyle.alignment ?? DEFAULT_PARAGRAPH_STYLE.alignment,
689
- 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),
690
- offsetBefore: DEFAULT_PARAGRAPH_STYLE.spaceBefore,
691
- offsetAfter: DEFAULT_PARAGRAPH_STYLE.spaceAfter,
692
- lineSpacing: paragraph.paragraphStyle.lineSpacing ?? DEFAULT_PARAGRAPH_STYLE.lineSpacing
693
- });
694
- }
695
- getIndentLeftFromTextLine(insertIndex) {
696
- let startIndex = 0;
697
- let endIndex = this.paragraphs.length - 1;
698
- while (startIndex <= endIndex) {
699
- const middleIndex = Math.round((startIndex + endIndex) / 2);
700
- const paragraphInfo = this.paragraphs[middleIndex];
701
- if (paragraphInfo.startIndex > insertIndex) {
702
- startIndex = middleIndex + 1;
703
- }
704
- else {
705
- endIndex = middleIndex - 1;
706
- }
707
- }
708
- const textLinesInfo = this.paragraphs[startIndex]?.paragraphSettings.textLinesInfo;
709
- return textLinesInfo ? Math.max(...textLinesInfo.map(x => x.indentLeft)) : null;
710
- }
711
- computeWrapSplit(tokens, wrapLimit) {
712
- if (!tokens.length || tokens.length <= wrapLimit) {
713
- return null;
714
- }
715
- // If there is a space or tab at this split position, then making
716
- // a split is simple.
717
- if (wrapLimit === 0 ||
718
- tokens[wrapLimit].displayValue === DisplayValue.customContent ||
719
- (this.isWhiteSpace(tokens[wrapLimit - 1]) && this.isWhiteSpace(tokens[wrapLimit]))) {
720
- return wrapLimit;
721
- }
722
- return this.calculateSplit(wrapLimit, tokens);
723
- }
724
- calculateSplit(index, tokens) {
725
- for (let i = index; i >= 0; i--) {
726
- if (this.isWhiteSpace(tokens[i]) || tokens[i].displayValue === DisplayValue.customContent) {
727
- return i + 1;
728
- }
729
- }
730
- return index;
731
- }
732
- isWhiteSpace(token) {
733
- return [DisplayValue.space, DisplayValue.emptyLine].includes(token.displayValue);
734
- }
735
- /**
736
- * Computes wrap index based on max row width
737
- */
738
- computeWrapIndex(displayTokens, contentWidth, defaultTabWidth) {
739
- if (!displayTokens[0]) {
740
- return 0;
741
- }
742
- if (displayTokens[0].isTable || (displayTokens[0].breaksLine && displayTokens.length === 1)) {
743
- return 1;
744
- }
745
- const indent = displayTokens[0].indentLeft +
746
- displayTokens[0].indentRight +
747
- displayTokens[0].indentFirstLine -
748
- displayTokens[0].indentHanging || 0;
749
- const maxRowWidth = contentWidth - indent;
750
- let sum = 0;
751
- for (let i = 0; i < displayTokens.length; i++) {
752
- if (displayTokens[i].isTab) {
753
- displayTokens[i].width = TabHelper.calculateTabWidth(sum, defaultTabWidth);
754
- }
755
- sum += displayTokens[i].width;
756
- if ((i > 0 && (sum >= maxRowWidth || displayTokens[i - 1].breaksLine)) || displayTokens[i].isTable) {
757
- return i;
758
- }
759
- if (displayTokens[i].isLineBreak || (i === displayTokens.length - 1 && displayTokens[i].isPageBreak)) {
760
- return i + 1;
761
- }
762
- }
763
- return 0;
764
- }
765
- getPreviousParagraphInfo(row) {
766
- if (!row || !this.paragraphs.length) {
767
- return { lastPage: 1, paragraphHeight: 0, paragraphLastLine: -1 };
768
- }
769
- const prevParagraph = this.paragraphs[row - 1].paragraphSettings;
770
- return prevParagraph.getParagraphData();
771
- }
772
- getVisiblePages(offsetTop, containerHeight) {
773
- const visiblePages = [];
774
- let firstVisiblePage = offsetTop / (this.pageHeight + this.pagesSpace);
775
- if (firstVisiblePage % 1 === 0) {
776
- firstVisiblePage++;
777
- }
778
- let visiblePagesCount = containerHeight / (this.pageHeight + this.pagesSpace);
779
- const partialPageOnScreenPercent = Math.trunc(((visiblePagesCount % 1) + (firstVisiblePage % 1)) * 100);
780
- const pageSpaceHeightPercent = Math.trunc((this.pagesSpace / containerHeight) * 100);
781
- if (partialPageOnScreenPercent - pageSpaceHeightPercent > 100) {
782
- visiblePagesCount++;
783
- }
784
- visiblePagesCount = Math.ceil(visiblePagesCount);
785
- firstVisiblePage = Math.ceil(firstVisiblePage);
786
- const documentPagesCount = this.paragraphs[this.paragraphs.length - 1].paragraphSettings.lastPageNumber;
787
- if (firstVisiblePage + visiblePagesCount - 1 > documentPagesCount) {
788
- visiblePagesCount = documentPagesCount - firstVisiblePage + 1;
789
- }
790
- for (let i = 0; i < visiblePagesCount; i++) {
791
- visiblePages.push(firstVisiblePage + i);
792
- }
793
- return visiblePages;
794
- }
795
- insertTextAndReturnEndCursorPosition(text, position) {
796
- const left = this.paragraphs[position.row].content.slice(0, position.column);
797
- const right = this.paragraphs[position.row].content.slice(position.column);
798
- const insertParagraphs = this.splitByParagraphs(`${left}${text}${right}`).map(x => new ParagraphInfoModel({ content: x, nextLineIndexes: [] }));
799
- insertParagraphs[0].paragraphSettings = this.getParagraphSettings(position.row);
800
- this.paragraphs.splice(position.row, 1, ...insertParagraphs);
801
- return new CursorParagraph(position.row + insertParagraphs.length - 1, insertParagraphs[insertParagraphs.length - 1].content.length - right.length);
802
- }
803
- splitByParagraphs(text) {
804
- return text.split(/\r\n|\r|\n/);
805
- }
806
- setParagraphIndexes() {
807
- for (let paragraph of this.paragraphs) {
808
- paragraph.paragraphSettings.startInsertIndex = paragraph.startIndex;
809
- }
810
- }
811
- initPagesVerticalData() {
812
- if (!this.customComponents.edges ||
813
- (!this.customComponents.edges.headersComponents.length && !this.customComponents.edges.footersComponents.length)) {
814
- this.pagesVerticalData = [
815
- new PageVerticalDataModel({
816
- marginTop: this.pageMargin.top,
817
- marginBottom: this.pageMargin.bottom,
818
- contentHeight: this.pageHeight - this.pageMargin.top - this.pageMargin.bottom,
819
- pageType: PageType.Default
820
- })
821
- ];
822
- return;
823
- }
824
- const pageTypes = this.customComponents.edges.getUniquePageTypes();
825
- this.pagesVerticalData = pageTypes.map(pageType => {
826
- const headerHeight = this.customComponents.edges.getComponentHeightByPageType(pageType, EdgeType.Header);
827
- const footerHeight = this.customComponents.edges.getComponentHeightByPageType(pageType, EdgeType.Footer);
828
- const marginTop = Math.max(headerHeight, this.pageMargin.top);
829
- const marginBottom = Math.max(footerHeight, this.pageMargin.bottom);
830
- return new PageVerticalDataModel({
831
- marginTop,
832
- marginBottom,
833
- contentHeight: this.pageHeight - marginTop - marginBottom,
834
- pageType
835
- });
836
- });
837
- }
838
- }
839
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzcGxheS1kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW5vZGVyL3NyYy9saWIvZWRpdG9yL2NvbnRlbnQvZGlzcGxheS1kYXRhL2Rpc3BsYXktZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDcEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBRXZFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUVyRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsdUJBQXVCLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDeEcsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNqRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFakUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzFELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUU3RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUdoRixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWxELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBRXhGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQ0FBMEMsQ0FB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QUFNLENBQUMsQ0FBQztZQUVwRSxPQUFPLElBQUkscUJBQXFCLENBQUM7Z0JBQzdCLFNBQVM7Z0JBQ1QsWUFBWTtnQkFDWixhQUFhLEVBQUUsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLEdBQUcsWUFBWTtnQkFDekQsUUFBUTthQUNYLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEJhc2VOb2RlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvc2hhcmVkL2Fic3RyYWN0L2Jhc2UuY29tcG9uZW50JztcbmltcG9ydCB7IEJyZWFrSGVscGVyIH0gZnJvbSAnLi4vLi4vZ2FkZ2V0cy9wYWdlLWJyZWFrL2JyZWFrLmhlbHBlcic7XG5pbXBvcnQgeyBCcmVha1R5cGVzIH0gZnJvbSAnLi4vLi4vZ2FkZ2V0cy9wYWdlLWJyZWFrL2JyZWFrLXR5cGVzLmVudW0nO1xuaW1wb3J0IHsgQ29udGVudHNJbnRlcmZhY2UgfSBmcm9tICcuLi9jb250ZW50cy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ29udGVudFN0eWxlSGVscGVyIH0gZnJvbSAnLi4vaGVscGVycy9jb250ZW50LXN0eWxlLmhlbHBlcic7XG5pbXBvcnQgeyBDdXJzb3JQYXJhZ3JhcGggfSBmcm9tICcuLi8uLi9wb3NpdGlvbmluZy9jdXJzb3ItcGFyYWdyYXBoJztcbmltcG9ydCB7IEN1c3RvbUNvbnRlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9zaGFyZWQvc2VydmljZXMvY3VzdG9tLWNvbnRlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBERUZBVUxUX0ZPTlRfU0laRSwgREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUsIE5FV19MSU5FX01BUktVUCB9IGZyb20gJy4uL2NvbnN0YW50cy9lZGl0b3IuY29uc3QnO1xuaW1wb3J0IHsgRGlzcGxheVRva2VuIH0gZnJvbSAnLi9kaXNwbGF5LXRva2VuLm1vZGVsJztcbmltcG9ydCB7IERpc3BsYXlUb2tlbkhlbHBlciB9IGZyb20gJy4uL2hlbHBlcnMvZGlzcGxheS10b2tlbi5oZWxwZXInO1xuaW1wb3J0IHsgRGlzcGxheVZhbHVlIH0gZnJvbSAnLi4vY29uc3RhbnRzL2Rpc3BsYXktdmFsdWVzLmNvbnN0JztcbmltcG9ydCB7IEVkZ2VUeXBlIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9lZGdlcy9lZGdlLXR5cGUuZW51bSc7XG5pbXBvcnQgeyBFZGl0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vaW50ZXJhY3Rpb24vZWRpdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGluZyB9IGZyb20gJy4uLy4uL2NvcmUvZXZlbnQtZW1pdHRpbmcnO1xuaW1wb3J0IHsgRm9udE1ldHJpY3MgfSBmcm9tICcuLi8uLi9nYWRnZXRzL2ZvbnQtbWV0cmljcy9mb250LW1ldHJpY3MuaGVscGVyJztcbmltcG9ydCB7IEZvcm1hdE1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9mb3JtYXQubW9kZWwnO1xuaW1wb3J0IHsgRm9ybWF0U3R5bGVIZWxwZXIgfSBmcm9tICcuLi8uLi9leGVjdXRpb24vaGVscGVycy9mb3JtYXQtc3R5bGUuaGVscGVyJztcbmltcG9ydCB7IEdlbmVyYWxQcm9wZXJ0aWVzTW9kZWwgfSBmcm9tICcuL2dlbmVyYWwtcHJvcGVydGllcy5tb2RlbCc7XG5pbXBvcnQgeyBJQ3VzdG9tQ29tcG9uZW50cyB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvc2hhcmVkL2N1c3RvbS1jb21wb25lbnRzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJbmRlbnRNb2RlbCB9IGZyb20gJy4vaW5kZW50Lm1vZGVsJztcbmltcG9ydCB7IExpbmVJbmZvTW9kZWwgfSBmcm9tICcuL2xpbmUtaW5mby5tb2RlbCc7XG5pbXBvcnQgeyBNYXJnaW5Nb2RlbCB9IGZyb20gJy4uL21hcmdpbi5tb2RlbCc7XG5pbXBvcnQgeyBOb2RlclRhYmxlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy90YWJsZS9jb21wb25lbnRzL3RhYmxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOdW1iZXJpbmdEYXRhTW9kZWwgfSBmcm9tICcuLy4uLy4uL2dhZGdldHMvbnVtYmVyaW5nL251bWJlcmluZy1kYXRhLm1vZGVsJztcbmltcG9ydCB7IE51bWJlcmluZ0hlbHBlciB9IGZyb20gJy4uLy4uL2dhZGdldHMvbnVtYmVyaW5nL251bWJlcmluZy5oZWxwZXInO1xuaW1wb3J0IHsgUGFnZUhlbHBlciB9IGZyb20gJy4uLy4uL2V4ZWN1dGlvbi9oZWxwZXJzL3BhZ2UuaGVscGVyJztcbmltcG9ydCB7IFBhZ2VUeXBlIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9lZGdlcy9wYWdlLXR5cGUuZW51bSc7XG5pbXBvcnQgeyBQYWdlVmVydGljYWxEYXRhTW9kZWwgfSBmcm9tICcuLi9wYWdlLXZlcnRpY2FsLWRhdGEubW9kZWwnO1xuaW1wb3J0IHsgUGFyYWdyYXBoIH0gZnJvbSAnLi9wYXJhZ3JhcGgnO1xuaW1wb3J0IHsgUGFyYWdyYXBoSGVscGVyIH0gZnJvbSAnLi4vLi4vZXhlY3V0aW9uL2hlbHBlcnMvcGFyYWdyYXBoLmhlbHBlcic7XG5pbXBvcnQgeyBQYXJhZ3JhcGhJbmZvTW9kZWwgfSBmcm9tICcuL21vZGVscy9wYXJhZ3JhcGgtaW5mby5tb2RlbCc7XG5pbXBvcnQgeyBQYXJhZ3JhcGhNb2RlbCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvcGFyYWdyYXBoLm1vZGVsJztcbmltcG9ydCB7IFBhcmFncmFwaFN0eWxlSGVscGVyIH0gZnJvbSAnLi4vLi4vZXhlY3V0aW9uL2hlbHBlcnMvcGFyYWdyYXBoLXN0eWxlLmhlbHBlcic7XG5pbXBvcnQgeyBSYW5nZSB9IGZyb20gJy4uLy4uL3Bvc2l0aW9uaW5nL3JhbmdlJztcbmltcG9ydCB7IFRhYkhlbHBlciB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvdGFiL3RhYi5oZWxwZXInO1xuaW1wb3J0IHsgVmlzaWJsZVJhbmdlIH0gZnJvbSAnLi4vLi4vZGlzcGxheS92aXNpYmxlLXJhbmdlLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBEaXNwbGF5RGF0YSBleHRlbmRzIEV2ZW50RW1pdHRpbmcge1xuICAgIHBhcmFncmFwaHM6IFBhcmFncmFwaEluZm9Nb2RlbFtdID0gW107XG5cbiAgICBjb250ZW50V2lkdGg6IG51bWJlcjtcblxuICAgIGFsbFBhZ2VzSGVpZ2h0ID0gMDtcblxuICAgIG1pbkhlaWdodCA9IDA7XG5cbiAgICB0YWJUb2tlbnM6IERpc3BsYXlUb2tlbltdID0gW107XG5cbiAgICBwYWdlc1ZlcnRpY2FsRGF0YTogUGFnZVZlcnRpY2FsRGF0YU1vZGVsW107XG5cbiAgICBnZXQgZGVmYXVsdFZlcnRpY2FsRGF0YSgpOiBQYWdlVmVydGljYWxEYXRhTW9kZWwge1xuICAgICAgICByZXR1cm4gdGhpcy5wYWdlc1ZlcnRpY2FsRGF0YS5maW5kKHggPT4geC5wYWdlVHlwZSA9PT0gUGFnZVR5cGUuRGVmYXVsdCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcm9jZXNzVGV4dExpbmVzUHJvcGVydGllczogKFxuICAgICAgICBjdXJyZW50UGFyYWdyYXBoOiBQYXJhZ3JhcGgsXG4gICAgICAgIHByZXZQYXJhZ3JhcGhJbmZvOiB7IGxhc3RQYWdlOiBudW1iZXI7IHBhcmFncmFwaEhlaWdodDogbnVtYmVyOyBwYXJhZ3JhcGhMYXN0TGluZTogbnVtYmVyIH0sXG4gICAgICAgIHBhZ2VzSW5mbzogeyBwYWdlc1ZlcnRpY2FsRGF0YTogUGFnZVZlcnRpY2FsRGF0YU1vZGVsW107IHBhZ2VzU3BhY2U6IG51bWJlciB9LFxuICAgICAgICB0YWJsZXM6IENvbXBvbmVudFJlZjxOb2RlclRhYmxlQ29tcG9uZW50PltdXG4gICAgKSA9PiB2b2lkO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgbW9kZWw6IENvbnRlbnRzSW50ZXJmYWNlLFxuICAgICAgICBwcml2YXRlIGdlbmVyYWxQcm9wZXJ0aWVzOiBHZW5lcmFsUHJvcGVydGllc01vZGVsLFxuICAgICAgICBwcml2YXRlIHNlc3Npb25JZDogbnVtYmVyLFxuICAgICAgICBwdWJsaWMgcGFnZU1hcmdpbjogTWFyZ2luTW9kZWwsXG4gICAgICAgIHB1YmxpYyBwYWdlc1NwYWNlOiBudW1iZXIsXG4gICAgICAgIHB1YmxpYyBwYWdlV2lkdGg6IG51bWJlcixcbiAgICAgICAgcHVibGljIHBhZ2VIZWlnaHQ6IG51bWJlcixcbiAgICAgICAgcHVibGljIGN1c3RvbUNvbXBvbmVudHM6IElDdXN0b21Db21wb25lbnRzLFxuICAgICAgICBwdWJsaWMgY3VzdG9tQ29udGVudFNlcnZpY2U6IEN1c3RvbUNvbnRlbnRTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgZWRpdG9yU2VydmljZTogRWRpdG9yU2VydmljZVxuICAgICkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnBhcmFncmFwaHMgPSB0aGlzLnNwbGl0QnlQYXJhZ3JhcGhzKHRoaXMubW9kZWwuY29udGVudCkubWFwKHggPT4gbmV3IFBhcmFncmFwaEluZm9Nb2RlbCh7IGNvbnRlbnQ6IHggfSkpO1xuICAgICAgICB0aGlzLm1pbkhlaWdodCA9IHRoaXMucGFnZUhlaWdodCArIDIgKiB0aGlzLnBhZ2VzU3BhY2U7XG4gICAgICAgIHRoaXMuY29udGVudFdpZHRoID0gdGhpcy5wYWdlV2lkdGggLSB0aGlzLnBhZ2VNYXJnaW4ubGVmdCAtIHRoaXMucGFnZU1hcmdpbi5yaWdodDtcbiAgICAgICAgdGhpcy5pbml0UGFnZXNWZXJ0aWNhbERhdGEoKTtcbiAgICAgICAgdGhpcy5wcm9jZXNzVGV4dExpbmVzUHJvcGVydGllcyA9ICF0aGlzLnBhZ2VIZWlnaHRcbiAgICAgICAgICAgID8gUGFyYWdyYXBoSGVscGVyLnByb2Nlc3NUZXh0TGluZXNQcm9wZXJ0aWVzRm9yU2luZ2xlUGFnZVxuICAgICAgICAgICAgOiBQYXJhZ3JhcGhIZWxwZXIucHJvY2Vzc1RleHRMaW5lc1Byb3BlcnRpZXM7XG4gICAgfVxuXG4gICAgaW5zZXJ0VGV4dChwb3NpdGlvbjogQ3Vyc29yUGFyYWdyYXBoLCB0ZXh0OiBzdHJpbmcpOiBDdXJzb3JQYXJhZ3JhcGgge1xuICAgICAgICBjb25zdCBlbmRQb2ludCA9IHRoaXMuaW5zZXJ0VGV4dEFuZFJldHVybkVuZEN1cnNvclBvc2l0aW9uKHRleHQsIHBvc2l0aW9uKTtcbiAgICAgICAgcmV0dXJuIGVuZFBvaW50O1xuICAgIH1cblxuICAgIHJlbW92ZVJhbmdlKHJhbmdlOiBSYW5nZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBwYXJhZ3JhcGhUZXh0ID1cbiAgICAgICAgICAgIHRoaXMucGFyYWdyYXBoc1tyYW5nZS5zdGFydC5yb3ddLmNvbnRlbnQuc2xpY2UoMCwgcmFuZ2Uuc3RhcnQuY29sdW1uKSArXG4gICAgICAgICAgICB0aGlzLnBhcmFncmFwaHNbcmFuZ2UuZW5kLnJvd10uY29udGVudC5zbGljZShyYW5nZS5lbmQuY29sdW1uKTtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoU2V0dGluZ3MgPSB0aGlzLmdldFBhcmFncmFwaFNldHRpbmdzKHJhbmdlLnN0YXJ0LnJvdyk7XG4gICAgICAgIHRoaXMucGFyYWdyYXBocy5zcGxpY2UocmFuZ2Uuc3RhcnQucm93LCByYW5nZS5lbmQucm93IC0gcmFuZ2Uuc3RhcnQucm93ICsgMSwgbmV3IFBhcmFncmFwaEluZm9Nb2RlbCh7IGNvbnRlbnQ6IHBhcmFncmFwaFRleHQgfSkpO1xuICAgICAgICB0aGlzLnBhcmFncmFwaHNbcmFuZ2Uuc3RhcnQucm93XS5wYXJhZ3JhcGhTZXR0aW5ncyA9IHBhcmFncmFwaFNldHRpbmdzO1xuICAgIH1cblxuICAgIGdldFBhcmFncmFwaENvbnRlbnQoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmFncmFwaHNbaW5kZXhdPy5jb250ZW50IHx8ICcnO1xuICAgIH1cblxuICAgIGdldEFsbFBhcmFncmFwaHNDb250ZW50KCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyYWdyYXBocy5tYXAoeCA9PiB4LmNvbnRlbnQpO1xuICAgIH1cblxuICAgIGdldFBhcmFncmFwaFNldHRpbmdzKGluZGV4OiBudW1iZXIpOiBQYXJhZ3JhcGggfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyYWdyYXBoc1tpbmRleF0/LnBhcmFncmFwaFNldHRpbmdzIHx8IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0UGFyYWdyYXBoc0NvbnRlbnRGb3JSYW5nZShyYW5nZTogUmFuZ2UpOiBzdHJpbmdbXSB7XG4gICAgICAgIGlmIChyYW5nZS5pc1NpbmdsZUxpbmUpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmUgPSB0aGlzLmdldFBhcmFncmFwaENvbnRlbnQocmFuZ2Uuc3RhcnQucm93KTtcbiAgICAgICAgICAgIGNvbnN0IGxpbmVQYXJ0SW5SYW5nZSA9IGxpbmUuc2xpY2UocmFuZ2Uuc3RhcnQuY29sdW1uLCByYW5nZS5lbmQuY29sdW1uKTtcblxuICAgICAgICAgICAgcmV0dXJuIFtsaW5lUGFydEluUmFuZ2VdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcmFncmFwaHNDb250ZW50ID0gdGhpcy5wYXJhZ3JhcGhzLnNsaWNlKHJhbmdlLnN0YXJ0LnJvdywgcmFuZ2UuZW5kLnJvdyArIDEpLm1hcCh4ID0+IHguY29udGVudCk7XG4gICAgICAgIHBhcmFncmFwaHNDb250ZW50WzBdID0gKHBhcmFncmFwaHNDb250ZW50WzBdIHx8ICcnKS5zbGljZShyYW5nZS5zdGFydC5jb2x1bW4pO1xuICAgICAgICBjb25zdCBsYXN0SW5kZXggPSBwYXJhZ3JhcGhzQ29udGVudC5sZW5ndGggLSAxO1xuICAgICAgICBwYXJhZ3JhcGhzQ29udGVudFtsYXN0SW5kZXhdID0gcGFyYWdyYXBoc0NvbnRlbnRbbGFzdEluZGV4XS5zbGljZSgwLCByYW5nZS5lbmQuY29sdW1uKTtcblxuICAgICAgICByZXR1cm4gcGFyYWdyYXBoc0NvbnRlbnQ7XG4gICAgfVxuXG4gICAgZ2V0VGV4dFJhbmdlKHJhbmdlOiBSYW5nZSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmFncmFwaHNDb250ZW50Rm9yUmFuZ2UocmFuZ2UpLmpvaW4oTkVXX0xJTkVfTUFSS1VQKTtcbiAgICB9XG5cbiAgICBwb3NpdGlvblRvSW5kZXgocG9zaXRpb246IEN1cnNvclBhcmFncmFwaCwgc3RhcnRSb3cgPSAwKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgICAgY29uc3QgZW5kUm93ID0gTWF0aC5taW4ocG9zaXRpb24ucm93LCB0aGlzLnBhcmFncmFwaHMubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0Um93IHx8IDA7IGkgPCBlbmRSb3c7IGkrKykge1xuICAgICAgICAgICAgaW5kZXggKz0gdGhpcy5wYXJhZ3JhcGhzW2ldLmNvbnRlbnQubGVuZ3RoICsgMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpbmRleCArIHBvc2l0aW9uLmNvbHVtbjtcbiAgICB9XG5cbiAgICBpbmRleFRvUG9zaXRpb24ocG9zaXRpb25JbmRleDogbnVtYmVyLCBzdGFydFJvdzogbnVtYmVyKTogQ3Vyc29yUGFyYWdyYXBoIHtcbiAgICAgICAgY29uc3QgbmV3bGluZUxlbmd0aCA9IE5FV19MSU5FX01BUktVUC5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGxpbmVJbmRleCA9IHN0YXJ0Um93IHx8IDA7IGxpbmVJbmRleCA8IHRoaXMucGFyYWdyYXBocy5sZW5ndGg7IGxpbmVJbmRleCsrKSB7XG4gICAgICAgICAgICBwb3NpdGlvbkluZGV4IC09IHRoaXMucGFyYWdyYXBoc1tsaW5lSW5kZXhdLmNvbnRlbnQubGVuZ3RoICsgbmV3bGluZUxlbmd0aDtcbiAgICAgICAgICAgIGlmIChwb3NpdGlvbkluZGV4IDwgMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHBvc2l0aW9uSW5kZXggKyB0aGlzLnBhcmFncmFwaHNbbGluZUluZGV4XS5jb250ZW50Lmxlbmd0aCArIG5ld2xpbmVMZW5ndGg7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEN1cnNvclBhcmFncmFwaChsaW5lSW5kZXgsIGNvbHVtbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb2x1bW4gPSBwb3NpdGlvbkluZGV4ICsgdGhpcy5wYXJhZ3JhcGhzW3RoaXMucGFyYWdyYXBocy5sZW5ndGggLSAxXS5jb250ZW50Lmxlbmd0aCArIG5ld2xpbmVMZW5ndGg7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBDdXJzb3JQYXJhZ3JhcGgodGhpcy5wYXJhZ3JhcGhzLmxlbmd0aCAtIDEsIGNvbHVtbik7XG4gICAgfVxuXG4gICAgaW5kZXhlc1RvUmFuZ2Uoc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyKTogUmFuZ2Uge1xuICAgICAgICBjb25zdCBzdGFydFBvaW50ID0gdGhpcy5pbmRleFRvUG9zaXRpb24oc3RhcnRJbmRleCwgMCk7XG4gICAgICAgIGNvbnN0IGVuZFBvaW50ID0gdGhpcy5pbmRleFRvUG9zaXRpb24oZW5kSW5kZXgsIDApO1xuXG4gICAgICAgIHJldHVybiBuZXcgUmFuZ2Uoc3RhcnRQb2ludCwgZW5kUG9pbnQpO1xuICAgIH1cblxuICAgIGlzTmV3TGluZVN5bWJvbChpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHRleHQgPSB0aGlzLnBhcmFncmFwaHMubWFwKHggPT4geC5jb250ZW50KS5qb2luKE5FV19MSU5FX01BUktVUCk7XG5cbiAgICAgICAgcmV0dXJuICF0ZXh0IHx8ICF0ZXh0W2luZGV4XSB8fCB0ZXh0W2luZGV4XSA9PT0gTkVXX0xJTkVfTUFSS1VQO1xuICAgIH1cblxuICAgIGdldFNlbGVjdGVkUGFyYWdyYXBoc0J5UmFuZ2UocmFuZ2U6IFJhbmdlKTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9IHtcbiAgICAgICAgY29uc3QgbmV3bGluZUxlbmd0aCA9IE5FV19MSU5FX01BUktVUC5sZW5ndGg7XG4gICAgICAgIGxldCBzdGFydCA9IDA7XG4gICAgICAgIGxldCBlbmQgPSAwO1xuICAgICAgICBsZXQgaTtcbiAgICAgICAgY29uc3Qgcm93ID0gTWF0aC5taW4ocmFuZ2UuZW5kLnJvdywgdGhpcy5wYXJhZ3JhcGhzLmxlbmd0aCAtIDEpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93OyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpIDwgcmFuZ2Uuc3RhcnQucm93KSB7XG4gICAgICAgICAgICAgICAgc3RhcnQgKz0gdGhpcy5wYXJhZ3JhcGhzW2ldLmNvbnRlbnQubGVuZ3RoICsgbmV3bGluZUxlbmd0aDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZW5kICs9IHRoaXMucGFyYWdyYXBoc1tpXS5jb250ZW50Lmxlbmd0aCArIG5ld2xpbmVMZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaSA8IHRoaXMucGFyYWdyYXBocy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGVuZCArPSB0aGlzLnBhcmFncmFwaHNbaV0uY29udGVudC5sZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gICAgfVxuXG4gICAgZ2V0UG9zaXRpb25BZnRlckJyZWFrKHBvc2l0aW9uOiBDdXJzb3JQYXJhZ3JhcGgsIGJyZWFrVHlwZTogQnJlYWtUeXBlcyk6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIGlmIChicmVha1R5cGUgPT09IEJyZWFrVHlwZXMuVGV4dFdyYXBwaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gcG9zaXRpb247XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc0xhc3RDb2x1bW4gPSBwb3NpdGlvbi5jb2x1bW4gPT09IHRoaXMucGFyYWdyYXBoc1twb3NpdGlvbi5yb3ddLmNvbnRlbnQubGVuZ3RoO1xuICAgICAgICBjb25zdCBpc0xhc3RQYXJhZ3JhcGggPSBwb3NpdGlvbi5yb3cgPT09IHRoaXMucGFyYWdyYXBocy5sZW5ndGggLSAxO1xuICAgICAgICByZXR1cm4gaXNMYXN0Q29sdW1uICYmICFpc0xhc3RQYXJhZ3JhcGggPyBuZXcgQ3Vyc29yUGFyYWdyYXBoKHBvc2l0aW9uLnJvdyArIDEsIDApIDogcG9zaXRpb247XG4gICAgfVxuXG4gICAgZ2V0RGlzdGFuY2VGcm9tVG9wKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJhZ3JhcGhzW2luZGV4XT8ucGFyYWdyYXBoU2V0dGluZ3MgPyB0aGlzLnBhcmFncmFwaHNbaW5kZXhdLnBhcmFncmFwaFNldHRpbmdzLmRpc3RhbmNlRnJvbVRvcCA6IDA7XG4gICAgfVxuXG4gICAgZ2V0RGlzdGFuY2VGcm9tVG9wRm9yUHJpbnQoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGlmICghdGhpcy5wYXJhZ3JhcGhzW2luZGV4XT8ucGFyYWdyYXBoU2V0dGluZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcmFncmFwaCA9IHRoaXMucGFyYWdyYXBoc1tpbmRleF0ucGFyYWdyYXBoU2V0dGluZ3M7XG4gICAgICAgIGNvbnN0IHBhZ2VOdW1iZXIgPSBwYXJhZ3JhcGgucGFnZU51bWJlcnNbMF07XG4gICAgICAgIGxldCBwYWdlQnJlYWtIZWlnaHQgPSAwO1xuICAgICAgICBwYXJhZ3JhcGgudGV4dExpbmVzSW5mby5mb3JFYWNoKGxpbmVzSW5mbyA9PiB7XG4gICAgICAgICAgICBpZiAobGluZXNJbmZvLmlzQWZ0ZXJQYWdlQnJlYWspIHtcbiAgICAgICAgICAgICAgICBwYWdlQnJlYWtIZWlnaHQgPSBsaW5lc0luZm8uaGVpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBhcmFncmFwaC5kaXN0YW5jZUZyb21Ub3AgLSBwYWdlTnVtYmVyICogdGhpcy5wYWdlc1NwYWNlIC0gcGFnZUJyZWFrSGVpZ2h0O1xuICAgIH1cblxuICAgIHNldFBhcmFncmFwaFNldHRpbmdzKHJvdzogbnVtYmVyLCBsaW5lSW5mb3M6IExpbmVJbmZvTW9kZWxbXSwgbnVtYmVyaW5nRGF0YTogTnVtYmVyaW5nRGF0YU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5wYXJhZ3JhcGhzW3Jvd10ucGFyYWdyYXBoU2V0dGluZ3MpIHtcbiAgICAgICAgICAgIHRoaXMucGFyYWdyYXBoc1tyb3ddLnBhcmFncmFwaFNldHRpbmdzID0gbmV3IFBhcmFncmFwaChcbiAgICAgICAgICAgICAgICBudW1iZXJpbmdEYXRhLFxuICAgICAgICAgICAgICAgIGxpbmVJbmZvc1swXS5vZmZzZXRCZWZvcmUsXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzVGV4dExpbmVzUHJvcGVydGllc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGFyYWdyYXBoc1tyb3ddLnBhcmFncmFwaFNldHRpbmdzLm51bWJlcmluZ0RhdGEgPSBudW1iZXJpbmdEYXRhO1xuICAgICAgICB0aGlzLnBhcmFncmFwaHNbcm93XS5wYXJhZ3JhcGhTZXR0aW5ncy53aWR0aCA9IHRoaXMuY29udGVudFdpZHRoO1xuICAgICAgICB0aGlzLnBhcmFncmFwaHNbcm93XS5wYXJhZ3JhcGhTZXR0aW5ncy5zZXRUZXh0TGluZXNJbmZvKGxpbmVJbmZvcyk7XG4gICAgfVxuXG4gICAgZ2V0UGFyYWdyYXBoSGVpZ2h0KGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJhZ3JhcGhzW2luZGV4XT8ucGFyYWdyYXBoU2V0dGluZ3MgPyB0aGlzLnBhcmFncmFwaHNbaW5kZXhdLnBhcmFncmFwaFNldHRpbmdzLmhlaWdodCA6IDA7XG4gICAgfVxuXG4gICAgZ2V0VmlzaWJsZVJhbmdlKG9mZnNldFRvcDogbnVtYmVyLCBzY3JvbGxlckhlaWdodDogbnVtYmVyKTogVmlzaWJsZVJhbmdlIHtcbiAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5wYXJhZ3JhcGhzLmZpbmRJbmRleCh4ID0+IG9mZnNldFRvcCA8PSB4LnBhcmFncmFwaFNldHRpbmdzPy5kaXN0YW5jZUZyb21Ub3AgKyB4LnBhcmFncmFwaFNldHRpbmdzPy5oZWlnaHQpO1xuICAgICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgICAgICBzdGFydCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc3RhcnRMaW5lSW5mbyA9IG51bGw7XG4gICAgICAgIGNvbnN0IHN0YXJ0UGFyYWdyYXBoID0gdGhpcy5wYXJhZ3JhcGhzW3N0YXJ0XTtcbiAgICAgICAgaWYgKHN0YXJ0UGFyYWdyYXBoKSB7XG4gICAgICAgICAgICBjb25zdCBzdGFydFBhcmFncmFwaE9mZnNldFRvcCA9IG9mZnNldFRvcCAtIHN0YXJ0UGFyYWdyYXBoLnBhcmFncmFwaFNldHRpbmdzLmRpc3RhbmNlRnJvbVRvcDtcbiAgICAgICAgICAgIHN0YXJ0TGluZUluZm8gPSBQYXJhZ3JhcGhIZWxwZXIuZ2V0VmlzaWJsZUxpbmVJbmZvKHN0YXJ0UGFyYWdyYXBoPy5wYXJhZ3JhcGhTZXR0aW5ncy50ZXh0TGluZXNJbmZvLCBzdGFydFBhcmFncmFwaE9mZnNldFRvcCwgMSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXN0YXJ0TGluZUluZm8pIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3RhcnRQYXJhZ3JhcGg6IDAsXG4gICAgICAgICAgICAgICAgc3RhcnRMaW5lOiAwLFxuICAgICAgICAgICAgICAgIHN0YXJ0U2NyZWVuTGluZTogMCxcbiAgICAgICAgICAgICAgICBzdGFydFNjcmVlbkZ1bGxMaW5lOiAwLFxuICAgICAgICAgICAgICAgIGVuZFBhcmFncmFwaDogMCxcbiAgICAgICAgICAgICAgICBlbmRMaW5lOiAwLFxuICAgICAgICAgICAgICAgIGVuZFNjcmVlbkxpbmU6IDAsXG4gICAgICAgICAgICAgICAgZW5kU2NyZWVuRnVsbExpbmU6IDAsXG4gICAgICAgICAgICAgICAgcGFnZXM6IFsxXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBlbmQgPSB0aGlzLnBhcmFncmFwaHMuZmluZEluZGV4KFxuICAgICAgICAgICAgeCA9PiBvZmZzZXRUb3AgKyBzY3JvbGxlckhlaWdodCA8PSB4LnBhcmFncmFwaFNldHRpbmdzLmRpc3RhbmNlRnJvbVRvcCArIHgucGFyYWdyYXBoU2V0dGluZ3MuaGVpZ2h0XG4gICAgICAgICk7XG4gICAgICAgIGlmIChlbmQgPCAwKSB7XG4gICAgICAgICAgICBlbmQgPSB0aGlzLnBhcmFncmFwaHMubGVuZ3RoIC0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBlbmRMaW5lSW5mbyA9IG51bGw7XG4gICAgICAgIGNvbnN0IGVuZFBhcmFncmFwaCA9IHRoaXMucGFyYWdyYXBoc1tlbmRdO1xuICAgICAgICBpZiAoZW5kUGFyYWdyYXBoKSB7XG4gICAgICAgICAgICBjb25zdCBlbmRQYXJhZ3JhcGhPZmZzZXRUb3AgPSBvZmZzZXRUb3AgKyBzY3JvbGxlckhlaWdodCAtIGVuZFBhcmFncmFwaC5wYXJhZ3JhcGhTZXR0aW5ncy5kaXN0YW5jZUZyb21Ub3A7XG4gICAgICAgICAgICBlbmRMaW5lSW5mbyA9IFBhcmFncmFwaEhlbHBlci5nZXRWaXNpYmxlTGluZUluZm8oZW5kUGFyYWdyYXBoLnBhcmFncmFwaFNldHRpbmdzPy50ZXh0TGluZXNJbmZvLCBlbmRQYXJhZ3JhcGhPZmZzZXRUb3AsIC0xKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZpc2libGVQYWdlcyA9IHRoaXMuZ2V0VmlzaWJsZVBhZ2VzKG9mZnNldFRvcCwgc2Nyb2xsZXJIZWlnaHQpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdGFydFBhcmFncmFwaDogc3RhcnQsXG4gICAgICAgICAgICBzdGFydExpbmU6IHN0YXJ0TGluZUluZm8uaW5kZXgsXG4gICAgICAgICAgICBzdGFydFNjcmVlbkxpbmU6IHN0YXJ0TGluZUluZm8uc2NyZWVuSW5kZXgsXG4gICAgICAgICAgICBzdGFydFNjcmVlbkZ1bGxMaW5lOiBzdGFydExpbmVJbmZvLnZpc2libGVTY3JlZW5JbmRleCxcbiAgICAgICAgICAgIGVuZFBhcmFncmFwaDogZW5kLFxuICAgICAgICAgICAgZW5kTGluZTogZW5kTGluZUluZm8uaW5kZXgsXG4gICAgICAgICAgICBlbmRTY3JlZW5MaW5lOiBlbmRMaW5lSW5mby5zY3JlZW5JbmRleCxcbiAgICAgICAgICAgIGVuZFNjcmVlbkZ1bGxMaW5lOiBlbmRMaW5lSW5mby52aXNpYmxlU2NyZWVuSW5kZXgsXG4gICAgICAgICAgICBwYWdlczogdmlzaWJsZVBhZ2VzXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJvY2Vzc1BhcmFncmFwaHNQcm9wZXJ0aWVzKHN0YXJ0UGFyYWdyYXBoSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnNldFBhcmFncmFwaEluZGV4ZXMoKTtcbiAgICAgICAgY29uc3QgcGFnZXNJbmZvID0geyBwYWdlc1ZlcnRpY2FsRGF0YTogdGhpcy5wYWdlc1ZlcnRpY2FsRGF0YSwgcGFnZXNTcGFjZTogdGhpcy5wYWdlc1NwYWNlIH07XG4gICAgICAgIGxldCBjdXJyZW50UGFnZSA9IHN0YXJ0UGFyYWdyYXBoSW5kZXggPT09IDAgPyAxIDogdGhpcy5wYXJhZ3JhcGhzW3N0YXJ0UGFyYWdyYXBoSW5kZXggLSAxXS5wYXJhZ3JhcGhTZXR0aW5ncy5sYXN0UGFnZU51bWJlcjtcbiAgICAgICAgbGV0IHBhZ2VWZXJ0aWNhbERhdGEgPSBQYWdlSGVscGVyLmdldFZlcnRpY2FsRGF0YShjdXJyZW50UGFnZSwgdGhpcy5wYWdlc1ZlcnRpY2FsRGF0YSk7XG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydFBhcmFncmFwaEluZGV4OyBpIDwgdGhpcy5wYXJhZ3JhcGhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBwcmV2UGFyYWdyYXBoSW5mbyA9IHRoaXMuZ2V0UHJldmlvdXNQYXJhZ3JhcGhJbmZvKGkpO1xuICAgICAgICAgICAgY29uc3QgcGFyYWdyYXBoU2V0dGluZ3MgPSB0aGlzLnBhcmFncmFwaHNbaV0ucGFyYWdyYXBoU2V0dGluZ3M7XG4gICAgICAgICAgICBwYXJhZ3JhcGhTZXR0aW5ncy5wcm9jZXNzUGFyYWdyYXBoUHJvcGVydGllcyhwcmV2UGFyYWdyYXBoSW5mbywgcGFnZXNJbmZvLCB0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFibGVzKTtcbiAgICAgICAgICAgIGlmIChwYXJhZ3JhcGhTZXR0aW5ncy5maXJzdFBhZ2VOdW1iZXIgIT09IGN1cnJlbnRQYWdlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFBhZ2UgPSBwYXJhZ3JhcGhTZXR0aW5ncy5maXJzdFBhZ2VOdW1iZXI7XG4gICAgICAgICAgICAgICAgcGFnZVZlcnRpY2FsRGF0YSA9IFBhZ2VIZWxwZXIuZ2V0VmVydGljYWxEYXRhKHBhcmFncmFwaFNldHRpbmdzLmZpcnN0UGFnZU51bWJlciwgdGhpcy5wYWdlc1ZlcnRpY2FsRGF0YSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBhcmFncmFwaFNldHRpbmdzLmNhbGN1bGF0ZURpc3RhbmNlRnJvbVRvcCh0aGlzLnBhZ2VIZWlnaHQsIHRoaXMucGFnZXNTcGFjZSwgcGFnZVZlcnRpY2FsRGF0YS5tYXJnaW5Ub3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhZ2VIZWlnaHQgPSB0aGlzLnBhZ2VIZWlnaHQ7XG4gICAgICAgIGlmICghcGFnZUhlaWdodCkge1xuICAgICAgICAgICAgcGFnZUhlaWdodCA9IHRoaXMuZ2V0QWxsUGFyYWdyYXBoc0hlaWdodCgpICsgdGhpcy5wYWdlTWFyZ2luLnRvcCArIHRoaXMucGFnZU1hcmdpbi5ib3R0b207XG4gICAgICAgICAgICB0aGlzLm1pbkhlaWdodCA9IHBhZ2VIZWlnaHQgKyAyICogdGhpcy5wYWdlc1NwYWNlO1xuICAgICAgICAgICAgdGhpcy5kZWZhdWx0VmVydGljYWxEYXRhLmNvbnRlbnRIZWlnaHQgPSBwYWdlSGVpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGFzdFBhZ2VOdW1iZXIgPSB0aGlzLnBhcmFncmFwaHNbdGhpcy5wYXJhZ3JhcGhzLmxlbmd0aCAtIDFdLnBhcmFncmFwaFNldHRpbmdzLmxhc3RQYWdlTnVtYmVyO1xuICAgICAgICB0aGlzLmFsbFBhZ2VzSGVpZ2h0ID0gbGFzdFBhZ2VOdW1iZXIgKiAocGFnZUhlaWdodCArIHRoaXMucGFnZXNTcGFjZSkgKyB0aGlzLnBhZ2VzU3BhY2U7XG4gICAgICAgIHRoaXMuZW1pdCgncGFnZXNDb3VudENoYW5nZWQnLCB7IHBhZ2VzQ291bnQ6IGxhc3RQYWdlTnVtYmVyLCBwYWdlSGVpZ2h0OiBwYWdlSGVpZ2h0ICsgMiAqIHRoaXMucGFnZXNTcGFjZSB9KTtcbiAgICB9XG5cbiAgICBnZXRBbGxQYXJhZ3JhcGhzSGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmFncmFwaHMucmVkdWNlKChzdW0sIHgpID0+IHN1bSArIHgucGFyYWdyYXBoU2V0dGluZ3MuaGVpZ2h0LCAwKTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygncGFnZXNDb3VudENoYW5nZWQnKTtcbiAgICB9XG5cbiAgICB1cGRhdGVQYWdlVmVydGljYWxEYXRhKGVkZ2VUeXBlOiBFZGdlVHlwZSwgcGFnZVR5cGU6IFBhZ2VUeXBlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBhZ2VWZXJ0aWNhbERhdGEgPSB0aGlzLnBhZ2VzVmVydGljYWxEYXRhLmZpbmQoeCA9PiB4LnBhZ2VUeXBlID09PSBwYWdlVHlwZSk7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudEhlaWdodCA9IHRoaXMuY3VzdG9tQ29tcG9uZW50cy5lZGdlcy5nZXRDb21wb25lbnRIZWlnaHRCeVR5cGUocGFnZVR5cGUsIGVkZ2VUeXBlKTtcbiAgICAgICAgaWYgKGVkZ2VUeXBlID09PSBFZGdlVHlwZS5IZWFkZXIpIHtcbiAgICAgICAgICAgIHBhZ2VWZXJ0aWNhbERhdGEubWFyZ2luVG9wID0gY29tcG9uZW50SGVpZ2h0ID4gdGhpcy5wYWdlTWFyZ2luLnRvcCA/IGNvbXBvbmVudEhlaWdodCA6IHRoaXMucGFnZU1hcmdpbi50b3A7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYWdlVmVydGljYWxEYXRhLm1hcmdpbkJvdHRvbSA9IGNvbXBvbmVudEhlaWdodCA+IHRoaXMucGFnZU1hcmdpbi5ib3R0b20gPyBjb21wb25lbnRIZWlnaHQgOiB0aGlzLnBhZ2VNYXJnaW4uYm90dG9tO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV3Q29udGVudEhlaWdodCA9IHRoaXMucGFnZUhlaWdodCAtIHBhZ2VWZXJ0aWNhbERhdGEubWFyZ2luVG9wIC0gcGFnZVZlcnRpY2FsRGF0YS5tYXJnaW5Cb3R0b207XG4gICAgICAgIGlmIChuZXdDb250ZW50SGVpZ2h0ID09PSBwYWdlVmVydGljYWxEYXRhLmNvbnRlbnRIZWlnaHQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHBhZ2VWZXJ0aWNhbERhdGEuY29udGVudEhlaWdodCA9IG5ld0NvbnRlbnRIZWlnaHQ7XG4gICAgICAgIHRoaXMucHJvY2Vzc1BhcmFncmFwaHNQcm9wZXJ0aWVzKDApO1xuICAgIH1cblxuICAgIHVwZGF0ZVBhcmFncmFwaExpbmVOdW1iZXIoZmlyc3Q6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBjb3VudCA9IHRoaXMucGFyYWdyYXBocy5sZW5ndGg7XG4gICAgICAgIGlmIChmaXJzdCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5wYXJhZ3JhcGhzW2ZpcnN0XS5saW5lTnVtYmVyID0gMDtcbiAgICAgICAgICAgIGZpcnN0Kys7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gZmlyc3Q7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLnBhcmFncmFwaHNbaV0ubGluZU51bWJlciA9IHRoaXMucGFyYWdyYXBoc1tpIC0gMV0ubGluZU51bWJlciArIHRoaXMucGFyYWdyYXBoc1tpIC0gMV0ubmV4dExpbmVJbmRleGVzLmxlbmd0aCArIDE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVQYXJhZ3JhcGhTdGFydEluZGV4KGZpcnN0OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKGZpcnN0ID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnBhcmFncmFwaHNbZmlyc3RdLnN0YXJ0SW5kZXggPSAwO1xuICAgICAgICAgICAgZmlyc3QrKztcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gZmlyc3Q7IGkgPCB0aGlzLnBhcmFncmFwaHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMucGFyYWdyYXBoc1tpXS5zdGFydEluZGV4ID0gdGhpcy5wYXJhZ3JhcGhzW2kgLSAxXS5zdGFydEluZGV4ICsgdGhpcy5nZXRQYXJhZ3JhcGhDb250ZW50KGkgLSAxKS5sZW5ndGggKyAxO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlUGFyYWdyYXBoU2V0dGluZ3NOdW1iZXJpbmdEYXRhKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoU2V0dGluZ3MgPSB0aGlzLmdldFBhcmFncmFwaFNldHRpbmdzKGluZGV4KTtcbiAgICAgICAgaWYgKHBhcmFncmFwaFNldHRpbmdzLm51bWJlcmluZ0RhdGEubnVtYmVyaW5nSWQgIT09IHRoaXMubW9kZWwucGFyYWdyYXBoc1tpbmRleF0ucGFyYWdyYXBoU3R5bGUubnVtYmVyaW5nSWQpIHtcbiAgICAgICAgICAgIHBhcmFncmFwaFNldHRpbmdzLm51bWJlcmluZ0RhdGEgPSBOdW1iZXJpbmdIZWxwZXIuY3JlYXRlRGF0YU1vZGVsKFxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhbFByb3BlcnRpZXMubnVtYmVyaW5ncyxcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnBhcmFncmFwaHMsXG4gICAgICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmFsUHJvcGVydGllcy5udW1iZXJpbmdJbmZvXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcmFncmFwaFNldHRpbmdzLm51bWJlcmluZ0RhdGEubnVtYmVyaW5nSWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFncmFwaEZvcm1hdCA9IEZvcm1hdFN0eWxlSGVscGVyLmdldEZvcm1hdEF0SW5kZXgodGhpcy5tb2RlbC5mb3JtYXRzLCB0aGlzLm1vZGVsLnBhcmFncmFwaHNbaW5kZXhdLmluc2VydEluZGV4KTtcbiAgICAgICAgICAgIE51bWJlcmluZ0hlbHBlci51cGRhdGVNYXJrZXJEYXRhKFxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhbFByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgcGFyYWdyYXBoU2V0dGluZ3MsXG4gICAgICAgICAgICAgICAgcGFyYWdyYXBoRm9ybWF0LnRleHRTdHlsZSxcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnBhcmFncmFwaHNbaW5kZXhdLnBhcmFncmFwaFN0eWxlXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlTmV4dExpbmVJbmRleGVzKGZpcnN0UGFyYWdyYXBoOiBudW1iZXIsIGxhc3RQYXJhZ3JhcGg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnVwZGF0ZVBhcmFncmFwaFN0YXJ0SW5kZXgoZmlyc3RQYXJhZ3JhcGgpO1xuICAgICAgICBsZXQgaW5kZXhPZlBhcmFncmFwaEFmdGVyUGFnZUJyZWFrID0gdGhpcy5nZXRQYXJhZ3JhcGhTZXR0aW5ncyhmaXJzdFBhcmFncmFwaCAtIDEpPy5pc0VuZGVkQnlQYWdlQnJlYWsgPyBmaXJzdFBhcmFncmFwaCA6IC0xO1xuICAgICAgICBsZXQgZmlyc3RVc2VkVGFiSW5kZXggPSB0aGlzLm1vZGVsLnRhYnMuZmluZEluZGV4KHggPT4geC5pbnNlcnRJbmRleCA+PSB0aGlzLnBhcmFncmFwaHNbZmlyc3RQYXJhZ3JhcGhdLnN0YXJ0SW5kZXgpO1xuICAgICAgICBmb3IgKGxldCBpID0gZmlyc3RQYXJhZ3JhcGg7IGkgPD0gbGFzdFBhcmFncmFwaDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMucGFyYWdyYXBoc1tpXSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnRhYlRva2VucyA9IFtdO1xuICAgICAgICAgICAgTnVtYmVyaW5nSGVscGVyLmNhbGN1bGF0ZU51bWJlcmluZ0luZm8oXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5wYXJhZ3JhcGhzW2ldLnBhcmFncmFwaFN0eWxlLm51bWJlcmluZ0lkLFxuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwucGFyYWdyYXBoc1tpXS5wYXJhZ3JhcGhTdHlsZS5udW1iZXJpbmdMZXZlbCxcbiAgICAgICAgICAgICAgICB0aGlzLmdldFBhcmFncmFwaFNldHRpbmdzKGkpPy5udW1iZXJpbmdEYXRhLm1hcmtlcixcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzLm51bWJlcmluZ0luZm8sXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmFsUHJvcGVydGllcy5udW1iZXJpbmdzXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgbnVtYmVyaW5nRGF0YSA9IE51bWJlcmluZ0hlbHBlci5jcmVhdGVEYXRhTW9kZWwoXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmFsUHJvcGVydGllcy5udW1iZXJpbmdzLFxuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwucGFyYWdyYXBocyxcbiAgICAgICAgICAgICAgICBpLFxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhbFByb3BlcnRpZXMubnVtYmVyaW5nSW5mb1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHsgc3BsaXRzLCByb3dJbmZvcyB9ID0gdGhpcy5nZXRTcGxpdHModGhpcy5tb2RlbCwgaSk7XG4gICAgICAgICAgICB0aGlzLnBhcmFncmFwaHNbaV0ubmV4dExpbmVJbmRleGVzID0gc3BsaXRzO1xuICAgICAgICAgICAgaWYgKGluZGV4T2ZQYXJhZ3JhcGhBZnRlclBhZ2VCcmVhayA9PT0gaSkge1xuICAgICAgICAgICAgICAgIHJvd0luZm9zWzBdLmlzQWZ0ZXJQYWdlQnJlYWsgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5kZXhPZlBhcmFncmFwaEFmdGVyUGFnZUJyZWFrID0gcm93SW5mb3Nbcm93SW5mb3MubGVuZ3RoIC0gMV0uaXNFbmRlZEJ5UGFnZUJyZWFrID8gaSArIDEgOiAtMTtcbiAgICAgICAgICAgIHRoaXMuc2V0UGFyYWdyYXBoU2V0dGluZ3MoaSwgcm93SW5mb3MsIG51bWJlcmluZ0RhdGEpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVQYXJhZ3JhcGhTZXR0aW5nc051bWJlcmluZ0RhdGEoaSk7XG4gICAgICAgICAgICBmaXJzdFVzZWRUYWJJbmRleCA9IHRoaXMudXBkYXRlUGFyYWdyYXBoVGFicyhmaXJzdFVzZWRUYWJJbmRleCwgaSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmdldFBhcmFncmFwaFNldHRpbmdzKGxhc3RQYXJhZ3JhcGggKyAxKT8uc2V0SXNBZnRlclBhZ2VCcmVhayhpbmRleE9mUGFyYWdyYXBoQWZ0ZXJQYWdlQnJlYWsgPiAtMSk7XG4gICAgICAgIHRoaXMudXBkYXRlUGFyYWdyYXBoTGluZU51bWJlcihmaXJzdFBhcmFncmFwaCk7XG4gICAgICAgIHRoaXMucHJvY2Vzc1BhcmFncmFwaHNQcm9wZXJ0aWVzKGZpcnN0UGFyYWdyYXBoKTtcbiAgICB9XG5cbiAgICB1cGRhdGVOdW1iZXJpbmdzRGF0YU9uQ2hhbmdlKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IGluZGV4OyBpIDwgdGhpcy5wYXJhZ3JhcGhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJhZ3JhcGhTdHlsZSA9IHRoaXMubW9kZWwucGFyYWdyYXBoc1tpXS5wYXJhZ3JhcGhTdHlsZTtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFncmFwaFNldHRpbmdzID0gdGhpcy5nZXRQYXJhZ3JhcGhTZXR0aW5ncyhpKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm1vZGVsLnBhcmFncmFwaHNbaV0ucGFyYWdyYXBoU3R5bGUubnVtYmVyaW5nSWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBOdW1iZXJpbmdIZWxwZXIuY2FsY3VsYXRlTnVtYmVyaW5nSW5mbyhcbiAgICAgICAgICAgICAgICAgICAgcGFyYWdyYXBoU3R5bGUubnVtYmVyaW5nSWQsXG4gICAgICAgICAgICAgICAgICAgIHBhcmFncmFwaFN0eWxlLm51bWJlcmluZ0xldmVsLFxuICAgICAgICAgICAgICAgICAgICBwYXJhZ3JhcGhTZXR0aW5ncy5udW1iZXJpbmdEYXRhLm1hcmtlcixcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmFsUHJvcGVydGllcy5udW1iZXJpbmdJbmZvLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzLm51bWJlcmluZ3NcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHBhcmFncmFwaFNldHRpbmdzLm51bWJlcmluZ0RhdGEgPSBOdW1iZXJpbmdIZWxwZXIuY3JlYXRlRGF0YU1vZGVsKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzLm51bWJlcmluZ3MsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwucGFyYWdyYXBocyxcbiAgICAgICAgICAgICAgICAgICAgaSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmFsUHJvcGVydGllcy5udW1iZXJpbmdJbmZvXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhZ3JhcGhGb3JtYXQgPSBGb3JtYXRTdHlsZUhlbHBlci5nZXRGb3JtYXRBdEluZGV4KHRoaXMubW9kZWwuZm9ybWF0cywgdGhpcy5tb2RlbC5wYXJhZ3JhcGhzW2ldLmluc2VydEluZGV4KTtcbiAgICAgICAgICAgICAgICBOdW1iZXJpbmdIZWxwZXIudXBkYXRlTWFya2VyRGF0YSh0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzLCBwYXJhZ3JhcGhTZXR0aW5ncywgcGFyYWdyYXBoRm9ybWF0LnRleHRTdHlsZSwgcGFyYWdyYXBoU3R5bGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0YWJsZSA9IHRoaXMuY3VzdG9tQ29udGVudFNlcnZpY2UuZmluZENvbXBvbmVudCh0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFibGVzLCBwYXJhZ3JhcGhTZXR0aW5ncy5zdGFydEluc2VydEluZGV4KTtcbiAgICAgICAgICAgIGlmICh0YWJsZSkge1xuICAgICAgICAgICAgICAgIHRhYmxlLmluc3RhbmNlLnVwZGF0ZUNlbGxzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoJ3BhZ2VUeXBlJyBpbiB0aGlzLm1vZGVsKSB7XG4gICAgICAgICAgICB0aGlzLmVkaXRvclNlcnZpY2UudXBkYXRlRWRnZXModGhpcy5zZXNzaW9uSWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzZXRBbGxOdW1iZXJpbmdJbmZvKHBhcmFncmFwaEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHBhcmFncmFwaEluZGV4OyBpIDwgdGhpcy5tb2RlbC5wYXJhZ3JhcGhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB7IG51bWJlcmluZ0lkLCBudW1iZXJpbmdMZXZlbCB9ID0gdGhpcy5tb2RlbC5wYXJhZ3JhcGhzW2ldLnBhcmFncmFwaFN0eWxlO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIG51bWJlcmluZ0lkICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmFsUHJvcGVydGllcy5udW1iZXJpbmdJbmZvW251bWJlcmluZ0lkXSAmJlxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhbFByb3BlcnRpZXMubnVtYmVyaW5nSW5mb1tudW1iZXJpbmdJZF1bbnVtYmVyaW5nTGV2ZWxdXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzLm51bWJlcmluZ0luZm9bbnVtYmVyaW5nSWRdW251bWJlcmluZ0xldmVsXS52aXNpdGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXNldE51bWJlcmluZ0luZm9CeVRhYmxlQ2VsbCh0YWJsZTogQ29tcG9uZW50UmVmPE5vZGVyVGFibGVDb21wb25lbnQ+KTogdm9pZCB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFibGUuaW5zdGFuY2Uucm93TWF0cml4Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBjZWxsIG9mIHRhYmxlLmluc3RhbmNlLnJvd01hdHJpeFtpXS5jZWxscykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgbWFya2VyLCBudW1iZXJpbmdJZCB9ID1cbiAgICAgICAgICAgICAgICAgICAgY2VsbC5jb21wb25lbnRSZWYuaW5zdGFuY2Uuc2Vzc2lvbi5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzWzBdLnBhcmFncmFwaFNldHRpbmdzLm51bWJlcmluZ0RhdGE7XG4gICAgICAgICAgICAgICAgaWYgKG1hcmtlciAmJiBudW1iZXJpbmdJZCkge1xuICAgICAgICAgICAgICAgICAgICBOdW1iZXJpbmdIZWxwZXIudXBkYXRlTnVtYmVyaW5nSW5mbyh0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzLm51bWJlcmluZ0luZm8sIG1hcmtlciwgbnVtYmVyaW5nSWQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2V0QWxsTnVtYmVyaW5nSW5mbygwKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlUGFyYWdyYXBoVGFicyh0YWJJbmRleDogbnVtYmVyLCBwYXJhZ3JhcGhJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoQ29udGVudExlbmd0aCA9IHRoaXMuZ2V0UGFyYWdyYXBoQ29udGVudChwYXJhZ3JhcGhJbmRleCkubGVuZ3RoO1xuICAgICAgICBjb25zdCBwYXJhZ3JhcGhMYXN0SW5kZXggPSB0aGlzLnBhcmFncmFwaHNbcGFyYWdyYXBoSW5kZXhdLnN0YXJ0SW5kZXggKyBwYXJhZ3JhcGhDb250ZW50TGVuZ3RoO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0YWJJbmRleCA9PT0gLTEgfHxcbiAgICAgICAgICAgIHRhYkluZGV4ID49IHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJzLmxlbmd0aCB8fFxuICAgICAgICAgICAgdGhpcy5jdXN0b21Db21wb25lbnRzLnRhYnNbdGFiSW5kZXhdLmluc3RhbmNlLmluc2VydEluZGV4ID4gcGFyYWdyYXBoTGFzdEluZGV4XG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHRhYkluZGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IHRhYkluZGV4O1xuICAgICAgICB3aGlsZSAodGhpcy5jdXN0b21Db21wb25lbnRzLnRhYnNbdGFiSW5kZXhdICYmIHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJzW3RhYkluZGV4XS5pbnN0YW5jZS5pbnNlcnRJbmRleCA8PSBwYXJhZ3JhcGhMYXN0SW5kZXgpIHtcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJzW3RhYkluZGV4XS5pbnN0YW5jZS53aWR0aCA9IHRoaXMudGFiVG9rZW5zW3RhYkluZGV4IC0gc3RhcnRJbmRleF0ud2lkdGg7XG4gICAgICAgICAgICB0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFic1t0YWJJbmRleF0uaW5zdGFuY2UuaGVpZ2h0ID0gdGhpcy50YWJUb2tlbnNbdGFiSW5kZXggLSBzdGFydEluZGV4XS5mb250O1xuICAgICAgICAgICAgdGFiSW5kZXgrKztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0YWJJbmRleDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFNwbGl0cyhtb2RlbDogQ29udGVudHNJbnRlcmZhY2UsIHBhcmFncmFwaEluZGV4OiBudW1iZXIpOiB7IHNwbGl0czogbnVtYmVyW107IHJvd0luZm9zOiBMaW5lSW5mb01vZGVsW10gfSB7XG4gICAgICAgIGNvbnN0IHBhcmFncmFwaENvbnRlbnQgPSB0aGlzLmdldFBhcmFncmFwaENvbnRlbnQocGFyYWdyYXBoSW5kZXgpO1xuICAgICAgICBjb25zdCBzdHJUb2tlbnMgPSB0aGlzLmdldERpc3BsYXlUb2tlbnMobW9kZWwsIHBhcmFncmFwaENvbnRlbnQsIHRoaXMucGFyYWdyYXBoc1twYXJhZ3JhcGhJbmRleF0uc3RhcnRJbmRleCk7XG4gICAgICAgIGlmICghc3RyVG9rZW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgZGVmYXVsdFJvd0luZm8gPSBuZXcgTGluZUluZm9Nb2RlbCh7XG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAoREVGQVVMVF9GT05UX1NJWkUgKiA0KSAvIDMsXG4gICAgICAgICAgICAgICAgd2lkdGg6IDAsXG4gICAgICAgICAgICAgICAgYWxpZ246IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmFsaWdubWVudCxcbiAgICAgICAgICAgICAgICBpbmRlbnQ6IG5ldyBJbmRlbnRNb2RlbChcbiAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUuaW5kZW50Rmlyc3RMaW5lLFxuICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5pbmRlbnRIYW5naW5nLFxuICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5pbmRlbnRMZWZ0LFxuICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5pbmRlbnRSaWdodFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgb2Zmc2V0QWZ0ZXI6IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLnNwYWNlQWZ0ZXIsXG4gICAgICAgICAgICAgICAgb2Zmc2V0QmVmb3JlOiBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5zcGFjZUJlZm9yZSxcbiAgICAgICAgICAgICAgICBsaW5lU3BhY2luZzogREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUubGluZVNwYWNpbmcsXG4gICAgICAgICAgICAgICAgaXNBZnRlclBhZ2VCcmVhazogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNFbmRlZEJ5UGFnZUJyZWFrOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmJhY2tncm91bmRDb2xvclxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiB7IHNwbGl0czogW10sIHJvd0luZm9zOiBbZGVmYXVsdFJvd0luZm9dIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzcGxpdHM6IG51bWJlcltdID0gW107XG4gICAgICAgIGNvbnN0IHJvd0luZm9zOiBMaW5lSW5mb01vZGVsW10gPSBbXTtcblxuICAgICAgICBsZXQgcHJldlRva2VuOiBEaXNwbGF5VG9rZW47XG4gICAgICAgIGxldCBpbmRleCA9IC0xO1xuICAgICAgICBsZXQgaW5pdGlhbCA9IHBhcmFncmFwaENvbnRlbnQ7XG4gICAgICAgIHdoaWxlIChpbmRleCkge1xuICAgICAgICAgICAgaW5pdGlhbCA9IGluaXRpYWwuc2xpY2UoaW5kZXggPiAwID8gaW5kZXggOiAwKTtcbiAgICAgICAgICAgIGNvbnN0IHRva2VucyA9IHN0clRva2Vucy5zbGljZShwYXJhZ3JhcGhDb250ZW50Lmxlbmd0aCAtIGluaXRpYWwubGVuZ3RoKTtcbiAgICAgICAgICAgIGlmICghdG9rZW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKC4uLnRoaXMuZ2V0RW1wdHlEaXNwbGF5VG9rZW5zKG1vZGVsLCB0aGlzLnBhcmFncmFwaHNbcGFyYWdyYXBoSW5kZXhdLnN0YXJ0SW5kZXggKyBpbmRleCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgd3JhcExpbWl0ID0gdGhpcy5jb21wdXRlV3JhcEluZGV4KHRva2VucywgdGhpcy5jb250ZW50V2lkdGgsIHRoaXMuZ2VuZXJhbFByb3BlcnRpZXMuZGVmYXVsdFRhYldpZHRoKTtcbiAgICAgICAgICAgIGlmICh0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdLmlzUGFnZUJyZWFrICYmIHdyYXBMaW1pdCA9PT0gdG9rZW5zLmxlbmd0aCAmJiB0aGlzLnBhcmFncmFwaHMubGVuZ3RoID4gcGFyYWdyYXBoSW5kZXggKyAxKSB7XG4gICAgICAgICAgICAgICAgd3JhcExpbWl0ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHdyYXBTcGxpdCA9XG4gICAgICAgICAgICAgICAgdG9rZW5zW3dyYXBMaW1pdCAtIDFdPy5icmVha3NMaW5lIHx8IHRva2Vuc1t3cmFwTGltaXQgLSAxXT8uaXNUYWJsZSA/IHdyYXBMaW1pdCA6IHRoaXMuY29tcHV0ZVdyYXBTcGxpdCh0b2tlbnMsIHdyYXBMaW1pdCk7XG4gICAgICAgICAgICBjb25zdCB3cmFwVG9rZW5zID0gdG9rZW5zLnNsaWNlKDAsIHdyYXBTcGxpdCB8fCB1bmRlZmluZWQpO1xuXG4gICAgICAgICAgICBpZiAod3JhcFRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBwcmV2VG9rZW4gPSB3cmFwVG9rZW5zW3dyYXBUb2tlbnMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGlzQWZ0ZXJQYWdlQnJlYWsgPSAhcm93SW5mb3MubGVuZ3RoID8gZmFsc2UgOiByb3dJbmZvc1tyb3dJbmZvcy5sZW5ndGggLSAxXS5pc0VuZGVkQnlQYWdlQnJlYWs7XG4gICAgICAgICAgICBjb25zdCBsaW5lSW5mbyA9IERpc3BsYXlUb2tlbkhlbHBlci5nZXRMaW5lSW5mb0Zyb21Ub2tlbihwcmV2VG9rZW4sIHdyYXBUb2tlbnNbMF0sIHdyYXBUb2tlbnMsIGlzQWZ0ZXJQYWdlQnJlYWspO1xuICAgICAgICAgICAgbGluZUluZm8uYmFja2dyb3VuZENvbG9yID0gbW9kZWwucGFyYWdyYXBoc1twYXJhZ3JhcGhJbmRleF0ucGFyYWdyYXBoU3R5bGUuYmFja2dyb3VuZENvbG9yO1xuICAgICAgICAgICAgcm93SW5mb3MucHVzaChsaW5lSW5mbyk7XG5cbiAgICAgICAgICAgIGlmICghd3JhcExpbWl0KSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGluZGV4ID0gd3JhcFNwbGl0O1xuICAgICAgICAgICAgY29uc3Qgc3BsaXRzTGVuZ3RoID0gc3BsaXRzLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IHNwbGl0SW5kZXggPSBzcGxpdHNMZW5ndGggPyBpbmRleCArIHNwbGl0c1tzcGxpdHNMZW5ndGggLSAxXSA6IGluZGV4O1xuICAgICAgICAgICAgc3BsaXRzLnB1c2goc3BsaXRJbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRhYlRva2Vucy5wdXNoKC4uLnN0clRva2Vucy5maWx0ZXIoeCA9PiB4LmlzVGFiKSk7XG5cbiAgICAgICAgUGFyYWdyYXBoSGVscGVyLmFwcGx5UGFyYWdyYXBoSW5kZW50c1RvTGluZXMocm93SW5mb3MsIHBhcmFncmFwaEluZGV4LCBtb2RlbC5wYXJhZ3JhcGhzKTtcbiAgICAgICAgcmV0dXJuIHsgc3BsaXRzLCByb3dJbmZvcyB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdpdmVuIGEgc3RyaW5nLCByZXR1cm5zIGFuIGFycmF5IG9mIHRoZSBkaXNwbGF5IGNoYXJhY3RlcnMsIGluY2x1ZGluZyB0YWJzIGFuZCBzcGFjZXMgYW5kIGN1c3RvbSBjb21wb25lbnRzLlxuICAgICAqL1xuICAgIGdldERpc3BsYXlUb2tlbnMobW9kZWw6IENvbnRlbnRzSW50ZXJmYWNlLCBzdHI6IHN0cmluZywgc3RhcnRJbmRleDogbnVtYmVyKTogRGlzcGxheVRva2VuW10ge1xuICAgICAgICBpZiAoIXN0ci5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEVtcHR5RGlzcGxheVRva2Vucyhtb2RlbCwgc3RhcnRJbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5maWxsTGluZVRva2VucyhzdGFydEluZGV4LCBzdHIsIG1vZGVsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbGxMaW5lVG9rZW5zKHN0YXJ0SW5kZXg6IG51bWJlciwgbGluZTogc3RyaW5nLCBtb2RlbDogQ29udGVudHNJbnRlcmZhY2UpOiBEaXNwbGF5VG9rZW5bXSB7XG4gICAgICAgIGNvbnN0IGxpbmVJbmZvID0gdGhpcy5nZXRMaW5lSW5mb0J5QnJlYWtNb2RpZmllcihtb2RlbCwgc3RhcnRJbmRleCArIGxpbmUubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgdG9rZW5zOiBEaXNwbGF5VG9rZW5bXSA9IFtdO1xuICAgICAgICBsZXQgY2hhcmFjdGVyczogRGlzcGxheVRva2VuW10gPSBbXTtcbiAgICAgICAgbGV0IGZvcm1hdCA9IEZvcm1hdFN0eWxlSGVscGVyLmdldEZvcm1hdEF0SW5kZXgobW9kZWwuZm9ybWF0cywgc3RhcnRJbmRleCk7XG4gICAgICAgIGxldCBwcmV2Rm9ybWF0OiBGb3JtYXRNb2RlbCA9IG51bGw7XG4gICAgICAgIGxldCBwcmV2Q2hhckNvZGU6IG51bWJlciA9IG51bGw7XG4gICAgICAgIGxldCBwcmV2Rm9udFN0cmluZzogc3RyaW5nID0gbnVsbDtcbiAgICAgICAgbGV0IHByZXZDaGFyOiBzdHJpbmcgPSBudWxsO1xuICAgICAgICBsZXQgZm9udFN0cmluZyA9IENvbnRlbnRTdHlsZUhlbHBlci5nZXRGb250U3R5bGVzU3RyaW5nKGZvcm1hdD8udGV4dFN0eWxlKTtcbiAgICAgICAgbGV0IHN5bWJvbENoYW5nZSA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNoYXIgPSBsaW5lW2ldO1xuICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IEZvbnRNZXRyaWNzLm1lYXN1cmVDaGFyU2l6ZShjaGFyLCBmb250U3RyaW5nKTtcbiAgICAgICAgICAgIGNvbnN0IGN1c3RvbUNvbXBvbmVudCA9IHRoaXMuZ2V0T3JHZW5lcmF0ZUNvbXBvbmVudChzdGFydEluZGV4LCBjaGFyKTtcbiAgICAgICAgICAgIGNvbnN0IGJyZWFrVHlwZSA9IEJyZWFrSGVscGVyLmdldEJyZWFrVHlwZShtb2RlbCwgY2hhciwgc3RhcnRJbmRleCk7XG5cbiAgICAgICAgICAgIGlmIChjdXN0b21Db21wb25lbnQgJiYgIWJyZWFrVHlwZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5jdXN0b21Db250ZW50U2VydmljZS5nZXRUb2tlbkZyb21Db21wb25lbnQoXG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbUNvbXBvbmVudCxcbiAgICAgICAgICAgICAgICAgICAgbGluZUluZm8sXG4gICAgICAgICAgICAgICAgICAgIERpc3BsYXlWYWx1ZS5jdXN0b21Db250ZW50LFxuICAgICAgICAgICAgICAgICAgICBpID09PSAwLFxuICAgICAgICAgICAgICAgICAgICBzaXplXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG5cbiAgICAgICAgICAgICAgICBwcmV2Q2hhckNvZGUgPSAtMTtcbiAgICAgICAgICAgICAgICBwcmV2Q2hhciA9ICcnO1xuICAgICAgICAgICAgICAgIGNoYXJhY3RlcnMgPSBbXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hhckNvZGUgPSBjaGFyLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGlzcGxheVZhbHVlID0gRGlzcGxheVRva2VuSGVscGVyLmdldERpc3BsYXlWYWx1ZShjaGFyQ29kZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNGaXJzdENoYXJhY3RlciA9IGkgPT09IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9rZW4gPSBuZXcgRGlzcGxheVRva2VuKHtcbiAgICAgICAgICAgICAgICAgICAgLi4uc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheVZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBhbGlnbjogbGluZUluZm8uYWxpZ24sXG4gICAgICAgICAgICAgICAgICAgIGluZGVudEZpcnN0TGluZTogaXNGaXJzdENoYXJhY3RlciA/IGxpbmVJbmZvLmluZGVudC5maXJzdExpbmUgOiBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5pbmRlbnRGaXJzdExpbmUsXG4gICAgICAgICAgICAgICAgICAgIGluZGVudEhhbmdpbmc6IGlzRmlyc3RDaGFyYWN0ZXIgPyBsaW5lSW5mby5pbmRlbnQuaGFuZ2luZyA6IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmluZGVudEhhbmdpbmcsXG4gICAgICAgICAgICAgICAgICAgIGluZGVudExlZnQ6IGxpbmVJbmZvLmluZGVudC5sZWZ0LFxuICAgICAgICAgICAgICAgICAgICBpbmRlbnRSaWdodDogbGluZUluZm8uaW5kZW50LnJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICBpbmRlbnRCZWZvcmU6IGxpbmVJbmZvLm9mZnNldEJlZm9yZSxcbiAgICAgICAgICAgICAgICAgICAgaW5kZW50QWZ0ZXI6IGxpbmVJbmZvLm9mZnNldEFmdGVyLFxuICAgICAgICAgICAgICAgICAgICBsaW5lU3BhY2luZzogbGluZUluZm8ubGluZVNwYWNpbmcsXG4gICAgICAgICAgICAgICAgICAgIGlzUGFnZUJyZWFrOiBicmVha1R5cGUgPT09IEJyZWFrVHlwZXMuUGFnZSxcbiAgICAgICAgICAgICAgICAgICAgaXNMaW5lQnJlYWs6IGJyZWFrVHlwZSA9PT0gQnJlYWtUeXBlcy5UZXh0V3JhcHBpbmcsXG4gICAgICAgICAgICAgICAgICAgIGlzVGFiOiBmYWxzZVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBjaGFyQ29kZSAhPT0gcHJldkNoYXJDb2RlIHx8XG4gICAgICAgICAgICAgICAgICAgICFwcmV2Rm9ybWF0IHx8XG4gICAgICAgICAgICAgICAgICAgICFDb250ZW50U3R5bGVIZWxwZXIuYXJlU2FtZVRleHRTdHlsZXMoZm9ybWF0Py50ZXh0U3R5bGUsIHByZXZGb3JtYXQ/LnRleHRTdHlsZSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgc3ltYm9sQ2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPT09IGxpbmUubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICBzeW1ib2xDaGFuZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGNoYXJhY3RlcnMubGVuZ3RoID4gMSAmJiBzeW1ib2xDaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzQ2hhclNpemVzKHByZXZDaGFyLCBwcmV2Rm9udFN0cmluZywgY2hhcmFjdGVycyk7XG4gICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnMgPSBbdG9rZW5dO1xuICAgICAgICAgICAgICAgICAgICBzeW1ib2xDaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN5bWJvbENoYW5nZSkge1xuICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzID0gW3Rva2VuXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBwcmV2Q2hhckNvZGUgPSBjaGFyQ29kZTtcbiAgICAgICAgICAgICAgICBwcmV2Q2hhciA9IGNoYXI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHByZXZGb3JtYXQgPSBmb3JtYXQ7XG4gICAgICAgICAgICBwcmV2Rm9udFN0cmluZyA9IGZvbnRTdHJpbmc7XG4gICAgICAgICAgICBzdGFydEluZGV4Kys7XG5cbiAgICAgICAgICAgIGlmIChzdGFydEluZGV4ID4gZm9ybWF0Py5lbmRJbmRleCkge1xuICAgICAgICAgICAgICAgIGZvcm1hdCA9IEZvcm1hdFN0eWxlSGVscGVyLmdldEZvcm1hdEF0SW5kZXgobW9kZWwuZm9ybWF0cywgc3RhcnRJbmRleCk7XG4gICAgICAgICAgICAgICAgZm9udFN0cmluZyA9IENvbnRlbnRTdHlsZUhlbHBlci5nZXRGb250U3R5bGVzU3RyaW5nKGZvcm1hdD8udGV4dFN0eWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0b2tlbnM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRPckdlbmVyYXRlQ29tcG9uZW50KGNoYXJJbmRleDogbnVtYmVyLCBjaGFyOiBzdHJpbmcpOiBDb21wb25lbnRSZWY8QmFzZU5vZGVyQ29tcG9uZW50PiB8IG51bGwge1xuICAgICAgICBpZiAoIXRoaXMuY3VzdG9tQ29udGVudFNlcnZpY2UuaXNTcGVjaWFsTWFya2VyKGNoYXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nQ29tcG9uZW50ID0gdGhpcy5jdXN0b21Db250ZW50U2VydmljZS5nZXRDb21wb25lbnQodGhpcy5jdXN0b21Db21wb25lbnRzLCBjaGFyLCBjaGFySW5kZXgpO1xuICAgICAgICBpZiAoZXhpc3RpbmdDb21wb25lbnQpIHtcbiAgICAgICAgICAgIGlmIChleGlzdGluZ0NvbXBvbmVudC5pbnN0YW5jZSBpbnN0YW5jZW9mIE5vZGVyVGFibGVDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICBleGlzdGluZ0NvbXBvbmVudC5pbnN0YW5jZS51cGRhdGVDZWxscygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nQ29tcG9uZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY3VzdG9tQ29udGVudFNlcnZpY2UuZ2VuZXJhdGVDb21wb25lbnQoXG4gICAgICAgICAgICB0aGlzLm1vZGVsLFxuICAgICAgICAgICAgdGhpcy5jdXN0b21Db21wb25lbnRzLFxuICAgICAgICAgICAgdGhpcy5zZXNzaW9uSWQsXG4gICAgICAgICAgICB0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzLFxuICAgICAgICAgICAgdGhpcy5jb250ZW50V2lkdGgsXG4gICAgICAgICAgICBjaGFySW5kZXhcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHByb2Nlc3NDaGFyU2l6ZXMocHJldkNoYXI6IHN0cmluZywgcHJldkZvbnRTdHJpbmc6IHN0cmluZywgY2hhcmFjdGVyczogRGlzcGxheVRva2VuW10pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbmV3U2l6ZSA9IEZvbnRNZXRyaWNzLm1lYXN1cmVDaGFyU2l6ZShwcmV2Q2hhciwgcHJldkZvbnRTdHJpbmcpO1xuICAgICAgICBmb3IgKGxldCBpdGVtIG9mIGNoYXJhY3RlcnMpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaXRlbSwgbmV3U2l6ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRMaW5lVG9rZW5zKG1vZGVsOiBDb250ZW50c0ludGVyZmFjZSwgbGluZTogc3RyaW5nLCBzdGFydEluZGV4OiBudW1iZXIpOiBEaXNwbGF5VG9rZW5bXSB7XG4gICAgICAgIGNvbnN0IGxpbmVJbmZvID0gdGhpcy5nZXRMaW5lSW5mb0Zyb21UZXh0TGluZShzdGFydEluZGV4ICsgbGluZS5sZW5ndGgpO1xuICAgICAgICBpZiAoIWxpbmUubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRFbXB0eUxpbmVUb2tlbnMobW9kZWwsIHN0YXJ0SW5kZXgsIGxpbmVJbmZvKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRva2VuczogRGlzcGxheVRva2VuW10gPSBbXTtcbiAgICAgICAgbGV0IGNoYXJhY3RlcnM6IERpc3BsYXlUb2tlbltdID0gW107XG4gICAgICAgIGxldCBmb3JtYXQgPSBGb3JtYXRTdHlsZUhlbHBlci5nZXRGb3JtYXRBdEluZGV4KG1vZGVsLmZvcm1hdHMsIHN0YXJ0SW5kZXgpO1xuICAgICAgICBsZXQgcHJldkZvcm1hdDogRm9ybWF0TW9kZWwgPSBudWxsO1xuICAgICAgICBsZXQgcHJldkNoYXJDb2RlOiBudW1iZXIgPSBudWxsO1xuICAgICAgICBsZXQgcHJldkZvbnRTdHJpbmc6IHN0cmluZyA9IG51bGw7XG4gICAgICAgIGxldCBwcmV2Q2hhcjogc3RyaW5nID0gbnVsbDtcbiAgICAgICAgbGV0IGZvbnRTdHJpbmcgPSBDb250ZW50U3R5bGVIZWxwZXIuZ2V0Rm9udFN0eWxlc1N0cmluZyhmb3JtYXQ/LnRleHRTdHlsZSk7XG4gICAgICAgIGxldCBzeW1ib2xDaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjaGFyID0gbGluZVtpXTtcbiAgICAgICAgICAgIGNvbnN0IHNpemUgPSBGb250TWV0cmljcy5tZWFzdXJlQ2hhclNpemUoY2hhciwgZm9udFN0cmluZyk7XG4gICAgICAgICAgICBjb25zdCBjdXN0b21Db21wb25lbnQgPSB0aGlzLmN1c3RvbUNvbnRlbnRTZXJ2aWNlLmdldENvbXBvbmVudCh0aGlzLmN1c3RvbUNvbXBvbmVudHMsIGNoYXIsIHN0YXJ0SW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgYnJlYWtUeXBlID0gQnJlYWtIZWxwZXIuZ2V0QnJlYWtUeXBlKG1vZGVsLCBjaGFyLCBzdGFydEluZGV4KTtcblxuICAgICAgICAgICAgaWYgKGN1c3RvbUNvbXBvbmVudCAmJiAhYnJlYWtUeXBlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLmN1c3RvbUNvbnRlbnRTZXJ2aWNlLmdldFRva2VuRnJvbUNvbXBvbmVudChcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tQ29tcG9uZW50LFxuICAgICAgICAgICAgICAgICAgICBsaW5lSW5mbyxcbiAgICAgICAgICAgICAgICAgICAgRGlzcGxheVZhbHVlLmN1c3RvbUNvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgIGkgPT09IDAsXG4gICAgICAgICAgICAgICAgICAgIHNpemVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcblxuICAgICAgICAgICAgICAgIHByZXZDaGFyQ29kZSA9IC0xO1xuICAgICAgICAgICAgICAgIHByZXZDaGFyID0gJyc7XG4gICAgICAgICAgICAgICAgY2hhcmFjdGVycyA9IFtdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGFyQ29kZSA9IGNoYXIuY2hhckNvZGVBdCgwKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXNwbGF5VmFsdWUgPSBEaXNwbGF5VG9rZW5IZWxwZXIuZ2V0RGlzcGxheVZhbHVlKGNoYXJDb2RlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpc0ZpcnN0Q2hhcmFjdGVyID0gaSA9PT0gMDtcbiAgICAgICAgICAgICAgICBjb25zdCB0b2tlbiA9IG5ldyBEaXNwbGF5VG9rZW4oe1xuICAgICAgICAgICAgICAgICAgICAuLi5zaXplLFxuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5VmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGFsaWduOiBsaW5lSW5mby5hbGlnbixcbiAgICAgICAgICAgICAgICAgICAgaW5kZW50Rmlyc3RMaW5lOiBpc0ZpcnN0Q2hhcmFjdGVyID8gbGluZUluZm8uaW5kZW50LmZpcnN0TGluZSA6IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmluZGVudEZpcnN0TGluZSxcbiAgICAgICAgICAgICAgICAgICAgaW5kZW50SGFuZ2luZzogaXNGaXJzdENoYXJhY3RlciA/IGxpbmVJbmZvLmluZGVudC5oYW5naW5nIDogREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUuaW5kZW50SGFuZ2luZyxcbiAgICAgICAgICAgICAgICAgICAgaW5kZW50TGVmdDogbGluZUluZm8uaW5kZW50LmxlZnQsXG4gICAgICAgICAgICAgICAgICAgIGluZGVudFJpZ2h0OiBsaW5lSW5mby5pbmRlbnQucmlnaHQsXG4gICAgICAgICAgICAgICAgICAgIGluZGVudEJlZm9yZTogbGluZUluZm8ub2Zmc2V0QmVmb3JlLFxuICAgICAgICAgICAgICAgICAgICBpbmRlbnRBZnRlcjogbGluZUluZm8ub2Zmc2V0QWZ0ZXIsXG4gICAgICAgICAgICAgICAgICAgIGxpbmVTcGFjaW5nOiBsaW5lSW5mby5saW5lU3BhY2luZyxcbiAgICAgICAgICAgICAgICAgICAgaXNQYWdlQnJlYWs6IGJyZWFrVHlwZSA9PT0gQnJlYWtUeXBlcy5QYWdlLFxuICAgICAgICAgICAgICAgICAgICBpc0xpbmVCcmVhazogYnJlYWtUeXBlID09PSBCcmVha1R5cGVzLlRleHRXcmFwcGluZyxcbiAgICAgICAgICAgICAgICAgICAgaXNUYWI6IGZhbHNlXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG5cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGNoYXJDb2RlICE9PSBwcmV2Q2hhckNvZGUgfHxcbiAgICAgICAgICAgICAgICAgICAgIXByZXZGb3JtYXQgfHxcbiAgICAgICAgICAgICAgICAgICAgIUNvbnRlbnRTdHlsZUhlbHBlci5hcmVTYW1lVGV4dFN0eWxlcyhmb3JtYXQ/LnRleHRTdHlsZSwgcHJldkZvcm1hdD8udGV4dFN0eWxlKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBzeW1ib2xDaGFuZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PT0gbGluZS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICAgICAgICAgIHN5bWJvbENoYW5nZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVycy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY2hhcmFjdGVycy5sZW5ndGggPiAxICYmIHN5bWJvbENoYW5nZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NDaGFyU2l6ZXMocHJldkNoYXIsIHByZXZGb250U3RyaW5nLCBjaGFyYWN0ZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVycyA9IFt0b2tlbl07XG4gICAgICAgICAgICAgICAgICAgIHN5bWJvbENoYW5nZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ltYm9sQ2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnMgPSBbdG9rZW5dO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHByZXZDaGFyQ29kZSA9IGNoYXJDb2RlO1xuICAgICAgICAgICAgICAgIHByZXZDaGFyID0gY2hhcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHJldkZvcm1hdCA9IGZvcm1hdDtcbiAgICAgICAgICAgIHByZXZGb250U3RyaW5nID0gZm9udFN0cmluZztcbiAgICAgICAgICAgIHN0YXJ0SW5kZXgrKztcblxuICAgICAgICAgICAgaWYgKHN0YXJ0SW5kZXggPiBmb3JtYXQ/LmVuZEluZGV4KSB7XG4gICAgICAgICAgICAgICAgZm9ybWF0ID0gRm9ybWF0U3R5bGVIZWxwZXIuZ2V0Rm9ybWF0QXRJbmRleChtb2RlbC5mb3JtYXRzLCBzdGFydEluZGV4KTtcbiAgICAgICAgICAgICAgICBmb250U3RyaW5nID0gQ29udGVudFN0eWxlSGVscGVyLmdldEZvbnRTdHlsZXNTdHJpbmcoZm9ybWF0Py50ZXh0U3R5bGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRva2VucztcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEVtcHR5RGlzcGxheVRva2Vucyhtb2RlbDogQ29udGVudHNJbnRlcmZhY2UsIHN0YXJ0SW5kZXg6IG51bWJlcik6IERpc3BsYXlUb2tlbltdIHtcbiAgICAgICAgY29uc3QgbGluZUluZm8gPSB0aGlzLmdldExpbmVJbmZvQnlCcmVha01vZGlmaWVyKG1vZGVsLCBzdGFydEluZGV4KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RW1wdHlMaW5lVG9rZW5zKG1vZGVsLCBzdGFydEluZGV4LCBsaW5lSW5mbyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRFbXB0eUxpbmVUb2tlbnMobW9kZWw6IENvbnRlbnRzSW50ZXJmYWNlLCBzdGFydEluZGV4OiBudW1iZXIsIGxpbmVJbmZvOiBMaW5lSW5mb01vZGVsKTogRGlzcGxheVRva2VuW10ge1xuICAgICAgICBjb25zdCBzdG9yZWRGb3JtYXQgPSBGb3JtYXRTdHlsZUhlbHBlci5nZXRGb3JtYXRBdEluZGV4KG1vZGVsLmZvcm1hdHMsIHN0YXJ0SW5kZXgpO1xuICAgICAgICBpZiAoIXN0b3JlZEZvcm1hdCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2l6ZSA9IEZvbnRNZXRyaWNzLm1lYXN1cmVDaGFyU2l6ZSgnRU1QVFlfTElORScsIENvbnRlbnRTdHlsZUhlbHBlci5nZXRGb250U3R5bGVzU3RyaW5nKHN0b3JlZEZvcm1hdC50ZXh0U3R5bGUpKTtcbiAgICAgICAgc2l6ZS53aWR0aCA9IDM7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBuZXcgRGlzcGxheVRva2VuKHtcbiAgICAgICAgICAgICAgICAuLi5zaXplLFxuICAgICAgICAgICAgICAgIGRpc3BsYXlWYWx1ZTogRGlzcGxheVZhbHVlLmVtcHR5TGluZSxcbiAgICAgICAgICAgICAgICBhbGlnbjogbGluZUluZm8uYWxpZ24sXG4gICAgICAgICAgICAgICAgaW5kZW50Rmlyc3RMaW5lOiBsaW5lSW5mby5pbmRlbnQuZmlyc3RMaW5lLFxuICAgICAgICAgICAgICAgIGluZGVudEhhbmdpbmc6IGxpbmVJbmZvLmluZGVudC5oYW5naW5nLFxuICAgICAgICAgICAgICAgIGluZGVudExlZnQ6IGxpbmVJbmZvLmluZGVudC5sZWZ0LFxuICAgICAgICAgICAgICAgIGluZGVudFJpZ2h0OiBsaW5lSW5mby5pbmRlbnQucmlnaHQsXG4gICAgICAgICAgICAgICAgaW5kZW50QmVmb3JlOiBsaW5lSW5mby5vZmZzZXRCZWZvcmUsXG4gICAgICAgICAgICAgICAgaW5kZW50QWZ0ZXI6IGxpbmVJbmZvLm9mZnNldEFmdGVyLFxuICAgICAgICAgICAgICAgIGlzUGFnZUJyZWFrOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc0xpbmVCcmVhazogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNUYWI6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGxpbmVTcGFjaW5nOiBsaW5lSW5mby5saW5lU3BhY2luZ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldExpbmVJbmZvQnlCcmVha01vZGlmaWVyKG1vZGVsOiBDb250ZW50c0ludGVyZmFjZSwgaW5kZXg6IG51bWJlcik6IExpbmVJbmZvTW9kZWwge1xuICAgICAgICBjb25zdCBwYXJhZ3JhcGggPSBQYXJhZ3JhcGhTdHlsZUhlbHBlci5nZXRQYXJhZ3JhcGhBdEluZGV4KG1vZGVsLnBhcmFncmFwaHMsIGluZGV4KTtcbiAgICAgICAgaWYgKCFwYXJhZ3JhcGgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTGluZUluZm9Nb2RlbCh7XG4gICAgICAgICAgICAgICAgYWxpZ246IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmFsaWdubWVudCxcbiAgICAgICAgICAgICAgICBpbmRlbnQ6IG5ldyBJbmRlbnRNb2RlbChcbiAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUuaW5kZW50Rmlyc3RMaW5lLFxuICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5pbmRlbnRIYW5naW5nLFxuICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5pbmRlbnRMZWZ0LFxuICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5pbmRlbnRSaWdodFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgb2Zmc2V0QmVmb3JlOiBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5zcGFjZUJlZm9yZSxcbiAgICAgICAgICAgICAgICBvZmZzZXRBZnRlcjogREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUuc3BhY2VBZnRlcixcbiAgICAgICAgICAgICAgICBsaW5lU3BhY2luZzogREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUubGluZVNwYWNpbmdcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5kZW50TGVmdCA9IHRoaXMuZ2V0UGFyYWdyYXBoSW5kZW50TGVmdChtb2RlbCwgcGFyYWdyYXBoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGluZUluZm9Nb2RlbChwYXJhZ3JhcGgsIGluZGVudExlZnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UGFyYWdyYXBoSW5kZW50TGVmdChtb2RlbDogQ29udGVudHNJbnRlcmZhY2UsIHBhcmFncmFwaDogUGFyYWdyYXBoTW9kZWwpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBudW1iZXJpbmdJZCA9IHBhcmFncmFwaC5wYXJhZ3JhcGhTdHlsZS5udW1iZXJpbmdJZDtcbiAgICAgICAgaWYgKG51bWJlcmluZ0lkID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyYWdyYXBoLnBhcmFncmFwaFN0eWxlLmluZGVudExlZnQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsZXZlbCA9IHBhcmFncmFwaC5wYXJhZ3JhcGhTdHlsZS5udW1iZXJpbmdMZXZlbDtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoSW5kZXggPSBtb2RlbC5wYXJhZ3JhcGhzLmluZGV4T2YocGFyYWdyYXBoKTtcbiAgICAgICAgY29uc3QgbGV2ZWxNb2RlbCA9IE51bWJlcmluZ0hlbHBlci5maW5kKHRoaXMuZ2VuZXJhbFByb3BlcnRpZXMubnVtYmVyaW5ncywgbnVtYmVyaW5nSWQsIGxldmVsKTtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoRm9ybWF0ID0gRm9ybWF0U3R5bGVIZWxwZXIuZ2V0Rm9ybWF0QXRJbmRleChtb2RlbC5mb3JtYXRzLCBwYXJhZ3JhcGguaW5zZXJ0SW5kZXgpO1xuICAgICAgICBjb25zdCBtYXJrZXJUZXh0U3R5bGUgPSBDb250ZW50U3R5bGVIZWxwZXIuY29tYmluZVRleHRTdHlsZXMobGV2ZWxNb2RlbC5tYXJrZXJTdHlsZSwgcGFyYWdyYXBoRm9ybWF0LnRleHRTdHlsZSk7XG4gICAgICAgIGNvbnN0IHBhcmFncmFwaFNldHRpbmdzID0gdGhpcy5nZXRQYXJhZ3JhcGhTZXR0aW5ncyhwYXJhZ3JhcGhJbmRleCk7XG4gICAgICAgIGxldCBtYXJrZXJXaWR0aCA9IHBhcmFncmFwaFNldHRpbmdzPy5udW1iZXJpbmdEYXRhPy53aWR0aDtcbiAgICAgICAgY29uc3QgbWFya2VyID0gTnVtYmVyaW5nSGVscGVyLmdldE1hcmtlcihcbiAgICAgICAgICAgIGxldmVsTW9kZWwsXG4gICAgICAgICAgICBudW1iZXJpbmdJZCxcbiAgICAgICAgICAgIG1vZGVsLnBhcmFncmFwaHMsXG4gICAgICAgICAgICBwYXJhZ3JhcGhJbmRleCxcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhbFByb3BlcnRpZXMubnVtYmVyaW5nSW5mb1xuICAgICAgICApO1xuICAgICAgICBjb25zdCBtYXJrZXJTaXplcyA9IE51bWJlcmluZ0hlbHBlci5nZXRNYXJrZXJTaXplcyhtYXJrZXIsIG1hcmtlclRleHRTdHlsZSk7XG4gICAgICAgIG1hcmtlcldpZHRoID0gbWFya2VyU2l6ZXMud2lkdGg7XG5cbiAgICAgICAgY29uc3QgaGFuZ2luZ0luZGVudCA9IHBhcmFncmFwaC5wYXJhZ3JhcGhTdHlsZS5pbmRlbnRIYW5naW5nID8gcGFyYWdyYXBoLnBhcmFncmFwaFN0eWxlLmluZGVudEhhbmdpbmcgOiBsZXZlbE1vZGVsLmluZGVudEhhbmdpbmc7XG4gICAgICAgIGxldCBwYXJhZ3JhcGhJbmRlbnQgPSBsZXZlbE1vZGVsLmluZGVudExlZnQ7XG4gICAgICAgIGlmIChtYXJrZXJXaWR0aCA+PSBoYW5naW5nSW5kZW50KSB7XG4gICAgICAgICAgICBjb25zdCBtYXJrZXJPdmVyZmxvdyA9IG1hcmtlcldpZHRoIC0gaGFuZ2luZ0luZGVudDtcbiAgICAgICAgICAgIGNvbnN0IGFkZGl0aW9uYWxNYXJrZXJJbmRlbnQgPSBUYWJIZWxwZXIuY2FsY3VsYXRlVGFiV2lkdGgoXG4gICAgICAgICAgICAgICAgbGV2ZWxNb2RlbC5pbmRlbnRMZWZ0ICsgbWFya2VyT3ZlcmZsb3csXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmFsUHJvcGVydGllcy5kZWZhdWx0VGFiV2lkdGhcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBwYXJhZ3JhcGhJbmRlbnQgKz0gbWFya2VyT3ZlcmZsb3cgKyBhZGRpdGlvbmFsTWFya2VySW5kZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhcmFncmFwaEluZGVudDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldExpbmVJbmZvRnJvbVRleHRMaW5lKGluZGV4OiBudW1iZXIpOiBMaW5lSW5mb01vZGVsIHtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoID0gUGFyYWdyYXBoU3R5bGVIZWxwZXIuZ2V0UGFyYWdyYXBoQXRJbmRleCh0aGlzLm1vZGVsLnBhcmFncmFwaHMsIGluZGV4KTtcbiAgICAgICAgY29uc3QgaW5kZW50TGVmdCA9IHRoaXMuZ2V0SW5kZW50TGVmdEZyb21UZXh0TGluZShpbmRleCk7XG4gICAgICAgIHJldHVybiB0aGlzLmdldExpbmVJbmZvTW9kZWwocGFyYWdyYXBoLCBpbmRlbnRMZWZ0KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldExpbmVJbmZvTW9kZWwocGFyYWdyYXBoOiBQYXJhZ3JhcGhNb2RlbCwgaW5kZW50TGVmdDogbnVtYmVyKTogTGluZUluZm9Nb2RlbCB7XG4gICAgICAgIGNvbnN0IGluZGVudEhhbmdpbmcgPSBwYXJhZ3JhcGgucGFyYWdyYXBoU3R5bGUubnVtYmVyaW5nSWQgPT09IG51bGwgPyBwYXJhZ3JhcGgucGFyYWdyYXBoU3R5bGUuaW5kZW50SGFuZ2luZyA6IDA7XG4gICAgICAgIHJldHVybiBuZXcgTGluZUluZm9Nb2RlbCh7XG4gICAgICAgICAgICBhbGlnbjogcGFyYWdyYXBoLnBhcmFncmFwaFN0eWxlLmFsaWdubWVudCA/PyBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5hbGlnbm1lbnQsXG4gICAgICAgICAgICBpbmRlbnQ6IG5ldyBJbmRlbnRNb2RlbChcbiAgICAgICAgICAgICAgICBwYXJhZ3JhcGgucGFyYWdyYXBoU3R5bGUuaW5kZW50Rmlyc3RMaW5lID8/IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmluZGVudEZpcnN0TGluZSxcbiAgICAgICAgICAgICAgICBpbmRlbnRIYW5naW5nID8/IERFRkFVTFRfUEFSQUdSQVBIX1NUWUxFLmluZGVudEhhbmdpbmcsXG4gICAgICAgICAgICAgICAgaW5kZW50TGVmdCA/PyBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5pbmRlbnRMZWZ0LFxuICAgICAgICAgICAgICAgIHBhcmFncmFwaC5wYXJhZ3JhcGhTdHlsZS5pbmRlbnRSaWdodCA/PyBERUZBVUxUX1BBUkFHUkFQSF9TVFlMRS5pbmRlbnRSaWdodFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIG9mZnNldEJlZm9yZTogREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUuc3BhY2VCZWZvcmUsXG4gICAgICAgICAgICBvZmZzZXRBZnRlcjogREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUuc3BhY2VBZnRlcixcbiAgICAgICAgICAgIGxpbmVTcGFjaW5nOiBwYXJhZ3JhcGgucGFyYWdyYXBoU3R5bGUubGluZVNwYWNpbmcgPz8gREVGQVVMVF9QQVJBR1JBUEhfU1RZTEUubGluZVNwYWNpbmdcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRJbmRlbnRMZWZ0RnJvbVRleHRMaW5lKGluc2VydEluZGV4OiBudW1iZXIpOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSAwO1xuICAgICAgICBsZXQgZW5kSW5kZXggPSB0aGlzLnBhcmFncmFwaHMubGVuZ3RoIC0gMTtcbiAgICAgICAgd2hpbGUgKHN0YXJ0SW5kZXggPD0gZW5kSW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IG1pZGRsZUluZGV4ID0gTWF0aC5yb3VuZCgoc3RhcnRJbmRleCArIGVuZEluZGV4KSAvIDIpO1xuICAgICAgICAgICAgY29uc3QgcGFyYWdyYXBoSW5mbyA9IHRoaXMucGFyYWdyYXBoc1ttaWRkbGVJbmRleF07XG4gICAgICAgICAgICBpZiAocGFyYWdyYXBoSW5mby5zdGFydEluZGV4ID4gaW5zZXJ0SW5kZXgpIHtcbiAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gbWlkZGxlSW5kZXggKyAxO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbmRJbmRleCA9IG1pZGRsZUluZGV4IC0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRleHRMaW5lc0luZm8gPSB0aGlzLnBhcmFncmFwaHNbc3RhcnRJbmRleF0/LnBhcmFncmFwaFNldHRpbmdzLnRleHRMaW5lc0luZm87XG4gICAgICAgIHJldHVybiB0ZXh0TGluZXNJbmZvID8gTWF0aC5tYXgoLi4udGV4dExpbmVzSW5mby5tYXAoeCA9PiB4LmluZGVudExlZnQpKSA6IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb21wdXRlV3JhcFNwbGl0KHRva2VuczogRGlzcGxheVRva2VuW10sIHdyYXBMaW1pdDogbnVtYmVyKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgICAgIGlmICghdG9rZW5zLmxlbmd0aCB8fCB0b2tlbnMubGVuZ3RoIDw9IHdyYXBMaW1pdCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIHNwYWNlIG9yIHRhYiBhdCB0aGlzIHNwbGl0IHBvc2l0aW9uLCB0aGVuIG1ha2luZ1xuICAgICAgICAvLyBhIHNwbGl0IGlzIHNpbXBsZS5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgd3JhcExpbWl0ID09PSAwIHx8XG4gICAgICAgICAgICB0b2tlbnNbd3JhcExpbWl0XS5kaXNwbGF5VmFsdWUgPT09IERpc3BsYXlWYWx1ZS5jdXN0b21Db250ZW50IHx8XG4gICAgICAgICAgICAodGhpcy5pc1doaXRlU3BhY2UodG9rZW5zW3dyYXBMaW1pdCAtIDFdKSAmJiB0aGlzLmlzV2hpdGVTcGFjZSh0b2tlbnNbd3JhcExpbWl0XSkpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHdyYXBMaW1pdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNhbGN1bGF0ZVNwbGl0KHdyYXBMaW1pdCwgdG9rZW5zKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNhbGN1bGF0ZVNwbGl0KGluZGV4OiBudW1iZXIsIHRva2VuczogRGlzcGxheVRva2VuW10pOiBudW1iZXIge1xuICAgICAgICBmb3IgKGxldCBpID0gaW5kZXg7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1doaXRlU3BhY2UodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0uZGlzcGxheVZhbHVlID09PSBEaXNwbGF5VmFsdWUuY3VzdG9tQ29udGVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1doaXRlU3BhY2UodG9rZW46IERpc3BsYXlUb2tlbik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gW0Rpc3BsYXlWYWx1ZS5zcGFjZSwgRGlzcGxheVZhbHVlLmVtcHR5TGluZV0uaW5jbHVkZXModG9rZW4uZGlzcGxheVZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB3cmFwIGluZGV4IGJhc2VkIG9uIG1heCByb3cgd2lkdGhcbiAgICAgKi9cbiAgICBwcml2YXRlIGNvbXB1dGVXcmFwSW5kZXgoZGlzcGxheVRva2VuczogRGlzcGxheVRva2VuW10sIGNvbnRlbnRXaWR0aDogbnVtYmVyLCBkZWZhdWx0VGFiV2lkdGg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGlmICghZGlzcGxheVRva2Vuc1swXSkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGlzcGxheVRva2Vuc1swXS5pc1RhYmxlIHx8IChkaXNwbGF5VG9rZW5zWzBdLmJyZWFrc0xpbmUgJiYgZGlzcGxheVRva2Vucy5sZW5ndGggPT09IDEpKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluZGVudCA9XG4gICAgICAgICAgICBkaXNwbGF5VG9rZW5zWzBdLmluZGVudExlZnQgK1xuICAgICAgICAgICAgICAgIGRpc3BsYXlUb2tlbnNbMF0uaW5kZW50UmlnaHQgK1xuICAgICAgICAgICAgICAgIGRpc3BsYXlUb2tlbnNbMF0uaW5kZW50Rmlyc3RMaW5lIC1cbiAgICAgICAgICAgICAgICBkaXNwbGF5VG9rZW5zWzBdLmluZGVudEhhbmdpbmcgfHwgMDtcbiAgICAgICAgY29uc3QgbWF4Um93V2lkdGggPSBjb250ZW50V2lkdGggLSBpbmRlbnQ7XG4gICAgICAgIGxldCBzdW0gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpc3BsYXlUb2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChkaXNwbGF5VG9rZW5zW2ldLmlzVGFiKSB7XG4gICAgICAgICAgICAgICAgZGlzcGxheVRva2Vuc1tpXS53aWR0aCA9IFRhYkhlbHBlci5jYWxjdWxhdGVUYWJXaWR0aChzdW0sIGRlZmF1bHRUYWJXaWR0aCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN1bSArPSBkaXNwbGF5VG9rZW5zW2ldLndpZHRoO1xuICAgICAgICAgICAgaWYgKChpID4gMCAmJiAoc3VtID49IG1heFJvd1dpZHRoIHx8IGRpc3BsYXlUb2tlbnNbaSAtIDFdLmJyZWFrc0xpbmUpKSB8fCBkaXNwbGF5VG9rZW5zW2ldLmlzVGFibGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGRpc3BsYXlUb2tlbnNbaV0uaXNMaW5lQnJlYWsgfHwgKGkgPT09IGRpc3BsYXlUb2tlbnMubGVuZ3RoIC0gMSAmJiBkaXNwbGF5VG9rZW5zW2ldLmlzUGFnZUJyZWFrKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UHJldmlvdXNQYXJhZ3JhcGhJbmZvKHJvdzogbnVtYmVyKTogeyBsYXN0UGFnZTogbnVtYmVyOyBwYXJhZ3JhcGhIZWlnaHQ6IG51bWJlcjsgcGFyYWdyYXBoTGFzdExpbmU6IG51bWJlciB9IHtcbiAgICAgICAgaWYgKCFyb3cgfHwgIXRoaXMucGFyYWdyYXBocy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGxhc3RQYWdlOiAxLCBwYXJhZ3JhcGhIZWlnaHQ6IDAsIHBhcmFncmFwaExhc3RMaW5lOiAtMSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJldlBhcmFncmFwaCA9IHRoaXMucGFyYWdyYXBoc1tyb3cgLSAxXS5wYXJhZ3JhcGhTZXR0aW5ncztcbiAgICAgICAgcmV0dXJuIHByZXZQYXJhZ3JhcGguZ2V0UGFyYWdyYXBoRGF0YSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VmlzaWJsZVBhZ2VzKG9mZnNldFRvcDogbnVtYmVyLCBjb250YWluZXJIZWlnaHQ6IG51bWJlcik6IG51bWJlcltdIHtcbiAgICAgICAgY29uc3QgdmlzaWJsZVBhZ2VzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgICAgIGxldCBmaXJzdFZpc2libGVQYWdlID0gb2Zmc2V0VG9wIC8gKHRoaXMucGFnZUhlaWdodCArIHRoaXMucGFnZXNTcGFjZSk7XG4gICAgICAgIGlmIChmaXJzdFZpc2libGVQYWdlICUgMSA9PT0gMCkge1xuICAgICAgICAgICAgZmlyc3RWaXNpYmxlUGFnZSsrO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHZpc2libGVQYWdlc0NvdW50ID0gY29udGFpbmVySGVpZ2h0IC8gKHRoaXMucGFnZUhlaWdodCArIHRoaXMucGFnZXNTcGFjZSk7XG4gICAgICAgIGNvbnN0IHBhcnRpYWxQYWdlT25TY3JlZW5QZXJjZW50ID0gTWF0aC50cnVuYygoKHZpc2libGVQYWdlc0NvdW50ICUgMSkgKyAoZmlyc3RWaXNpYmxlUGFnZSAlIDEpKSAqIDEwMCk7XG4gICAgICAgIGNvbnN0IHBhZ2VTcGFjZUhlaWdodFBlcmNlbnQgPSBNYXRoLnRydW5jKCh0aGlzLnBhZ2VzU3BhY2UgLyBjb250YWluZXJIZWlnaHQpICogMTAwKTtcbiAgICAgICAgaWYgKHBhcnRpYWxQYWdlT25TY3JlZW5QZXJjZW50IC0gcGFnZVNwYWNlSGVpZ2h0UGVyY2VudCA+IDEwMCkge1xuICAgICAgICAgICAgdmlzaWJsZVBhZ2VzQ291bnQrKztcbiAgICAgICAgfVxuXG4gICAgICAgIHZpc2libGVQYWdlc0NvdW50ID0gTWF0aC5jZWlsKHZpc2libGVQYWdlc0NvdW50KTtcbiAgICAgICAgZmlyc3RWaXNpYmxlUGFnZSA9IE1hdGguY2VpbChmaXJzdFZpc2libGVQYWdlKTtcbiAgICAgICAgY29uc3QgZG9jdW1lbnRQYWdlc0NvdW50ID0gdGhpcy5wYXJhZ3JhcGhzW3RoaXMucGFyYWdyYXBocy5sZW5ndGggLSAxXS5wYXJhZ3JhcGhTZXR0aW5ncy5sYXN0UGFnZU51bWJlcjtcbiAgICAgICAgaWYgKGZpcnN0VmlzaWJsZVBhZ2UgKyB2aXNpYmxlUGFnZXNDb3VudCAtIDEgPiBkb2N1bWVudFBhZ2VzQ291bnQpIHtcbiAgICAgICAgICAgIHZpc2libGVQYWdlc0NvdW50ID0gZG9jdW1lbnRQYWdlc0NvdW50IC0gZmlyc3RWaXNpYmxlUGFnZSArIDE7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZpc2libGVQYWdlc0NvdW50OyBpKyspIHtcbiAgICAgICAgICAgIHZpc2libGVQYWdlcy5wdXNoKGZpcnN0VmlzaWJsZVBhZ2UgKyBpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2aXNpYmxlUGFnZXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbnNlcnRUZXh0QW5kUmV0dXJuRW5kQ3Vyc29yUG9zaXRpb24odGV4dDogc3RyaW5nLCBwb3NpdGlvbjogQ3Vyc29yUGFyYWdyYXBoKTogQ3Vyc29yUGFyYWdyYXBoIHtcbiAgICAgICAgY29uc3QgbGVmdCA9IHRoaXMucGFyYWdyYXBoc1twb3NpdGlvbi5yb3ddLmNvbnRlbnQuc2xpY2UoMCwgcG9zaXRpb24uY29sdW1uKTtcbiAgICAgICAgY29uc3QgcmlnaHQgPSB0aGlzLnBhcmFncmFwaHNbcG9zaXRpb24ucm93XS5jb250ZW50LnNsaWNlKHBvc2l0aW9uLmNvbHVtbik7XG4gICAgICAgIGNvbnN0IGluc2VydFBhcmFncmFwaHMgPSB0aGlzLnNwbGl0QnlQYXJhZ3JhcGhzKGAke2xlZnR9JHt0ZXh0fSR7cmlnaHR9YCkubWFwKFxuICAgICAgICAgICAgeCA9PiBuZXcgUGFyYWdyYXBoSW5mb01vZGVsKHsgY29udGVudDogeCwgbmV4dExpbmVJbmRleGVzOiBbXSB9KVxuICAgICAgICApO1xuICAgICAgICBpbnNlcnRQYXJhZ3JhcGhzWzBdLnBhcmFncmFwaFNldHRpbmdzID0gdGhpcy5nZXRQYXJhZ3JhcGhTZXR0aW5ncyhwb3NpdGlvbi5yb3cpO1xuICAgICAgICB0aGlzLnBhcmFncmFwaHMuc3BsaWNlKHBvc2l0aW9uLnJvdywgMSwgLi4uaW5zZXJ0UGFyYWdyYXBocyk7XG4gICAgICAgIHJldHVybiBuZXcgQ3Vyc29yUGFyYWdyYXBoKFxuICAgICAgICAgICAgcG9zaXRpb24ucm93ICsgaW5zZXJ0UGFyYWdyYXBocy5sZW5ndGggLSAxLFxuICAgICAgICAgICAgaW5zZXJ0UGFyYWdyYXBoc1tpbnNlcnRQYXJhZ3JhcGhzLmxlbmd0aCAtIDFdLmNvbnRlbnQubGVuZ3RoIC0gcmlnaHQubGVuZ3RoXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzcGxpdEJ5UGFyYWdyYXBocyh0ZXh0OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0ZXh0LnNwbGl0KC9cXHJcXG58XFxyfFxcbi8pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0UGFyYWdyYXBoSW5kZXhlcygpOiB2b2lkIHtcbiAgICAgICAgZm9yIChsZXQgcGFyYWdyYXBoIG9mIHRoaXMucGFyYWdyYXBocykge1xuICAgICAgICAgICAgcGFyYWdyYXBoLnBhcmFncmFwaFNldHRpbmdzLnN0YXJ0SW5zZXJ0SW5kZXggPSBwYXJhZ3JhcGguc3RhcnRJbmRleDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdFBhZ2VzVmVydGljYWxEYXRhKCk6IHZvaWQge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICAhdGhpcy5jdXN0b21Db21wb25lbnRzLmVkZ2VzIHx8XG4gICAgICAgICAgICAoIXRoaXMuY3VzdG9tQ29tcG9uZW50cy5lZGdlcy5oZWFkZXJzQ29tcG9uZW50cy5sZW5ndGggJiYgIXRoaXMuY3VzdG9tQ29tcG9uZW50cy5lZGdlcy5mb290ZXJzQ29tcG9uZW50cy5sZW5ndGgpXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5wYWdlc1ZlcnRpY2FsRGF0YSA9IFtcbiAgICAgICAgICAgICAgICBuZXcgUGFnZVZlcnRpY2FsRGF0YU1vZGVsKHtcbiAgICAgICAgICAgICAgICAgICAgbWFyZ2luVG9wOiB0aGlzLnBhZ2VNYXJnaW4udG9wLFxuICAgICAgICAgICAgICAgICAgICBtYXJnaW5Cb3R0b206IHRoaXMucGFnZU1hcmdpbi5ib3R0b20sXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRIZWlnaHQ6IHRoaXMucGFnZUhlaWdodCAtIHRoaXMucGFnZU1hcmdpbi50b3AgLSB0aGlzLnBhZ2VNYXJnaW4uYm90dG9tLFxuICAgICAgICAgICAgICAgICAgICBwYWdlVHlwZTogUGFnZVR5cGUuRGVmYXVsdFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFnZVR5cGVzID0gdGhpcy5jdXN0b21Db21wb25lbnRzLmVkZ2VzLmdldFVuaXF1ZVBhZ2VUeXBlcygpO1xuICAgICAgICB0aGlzLnBhZ2VzVmVydGljYWxEYXRhID0gcGFnZVR5cGVzLm1hcChwYWdlVHlwZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoZWFkZXJIZWlnaHQgPSB0aGlzLmN1c3RvbUNvbXBvbmVudHMuZWRnZXMuZ2V0Q29tcG9uZW50SGVpZ2h0QnlQYWdlVHlwZShwYWdlVHlwZSwgRWRnZVR5cGUuSGVhZGVyKTtcbiAgICAgICAgICAgIGNvbnN0IGZvb3RlckhlaWdodCA9IHRoaXMuY3VzdG9tQ29tcG9uZW50cy5lZGdlcy5nZXRDb21wb25lbnRIZWlnaHRCeVBhZ2VUeXBlKHBhZ2VUeXBlLCBFZGdlVHlwZS5Gb290ZXIpO1xuICAgICAgICAgICAgY29uc3QgbWFyZ2luVG9wID0gTWF0aC5tYXgoaGVhZGVySGVpZ2h0LCB0aGlzLnBhZ2VNYXJnaW4udG9wKTtcbiAgICAgICAgICAgIGNvbnN0IG1hcmdpbkJvdHRvbSA9IE1hdGgubWF4KGZvb3RlckhlaWdodCwgdGhpcy5wYWdlTWFyZ2luLmJvdHRvbSk7XG5cbiAgICAgICAgICAgIHJldHVybiBuZXcgUGFnZVZlcnRpY2FsRGF0YU1vZGVsKHtcbiAgICAgICAgICAgICAgICBtYXJnaW5Ub3AsXG4gICAgICAgICAgICAgICAgbWFyZ2luQm90dG9tLFxuICAgICAgICAgICAgICAgIGNvbnRlbnRIZWlnaHQ6IHRoaXMucGFnZUhlaWdodCAtIG1hcmdpblRvcCAtIG1hcmdpbkJvdHRvbSxcbiAgICAgICAgICAgICAgICBwYWdlVHlwZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdfQ==