obsidian-dev-utils 88.7.0 → 89.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (679) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/demo-vault-helper/main.js +20 -23
  3. package/dist/integration-test-plugin/main.js +2218 -1734
  4. package/dist/lib/cjs/__merged.cjs +57 -35
  5. package/dist/lib/cjs/__merged.d.cts +12 -10
  6. package/dist/lib/cjs/abort-controller.cjs +15 -22
  7. package/dist/lib/cjs/array.cjs +27 -26
  8. package/dist/lib/cjs/array.d.cts +25 -7
  9. package/dist/lib/cjs/async-events.cjs +87 -91
  10. package/dist/lib/cjs/async-events.d.cts +50 -50
  11. package/dist/lib/cjs/async.cjs +80 -80
  12. package/dist/lib/cjs/async.d.cts +23 -23
  13. package/dist/lib/cjs/beeper.cjs +11 -15
  14. package/dist/lib/cjs/blob.cjs +14 -25
  15. package/dist/lib/cjs/codemirror/index.cjs +11 -15
  16. package/dist/lib/cjs/codemirror/state-field-spec.cjs +11 -15
  17. package/dist/lib/cjs/debug-controller.cjs +11 -15
  18. package/dist/lib/cjs/debug.cjs +24 -32
  19. package/dist/lib/cjs/debug.d.cts +1 -1
  20. package/dist/lib/cjs/disposable.cjs +59 -43
  21. package/dist/lib/cjs/disposable.d.cts +27 -8
  22. package/dist/lib/cjs/enum.cjs +11 -15
  23. package/dist/lib/cjs/error.cjs +28 -33
  24. package/dist/lib/cjs/function.cjs +30 -34
  25. package/dist/lib/cjs/function.d.cts +26 -26
  26. package/dist/lib/cjs/generated-during-build.cjs +12 -16
  27. package/dist/lib/cjs/html-element.cjs +84 -89
  28. package/dist/lib/cjs/html-element.d.cts +15 -15
  29. package/dist/lib/cjs/index.cjs +11 -15
  30. package/dist/lib/cjs/integration-test-setup.cjs +11 -15
  31. package/dist/lib/cjs/integration-test-vitest-global-setup.cjs +11 -15
  32. package/dist/lib/cjs/jest-setup.cjs +11 -15
  33. package/dist/lib/cjs/library.cjs +11 -15
  34. package/dist/lib/cjs/object-utils.cjs +120 -117
  35. package/dist/lib/cjs/object-utils.d.cts +27 -27
  36. package/dist/lib/cjs/obsidian/@types/dataview/data-model/value.d.cts +1 -1
  37. package/dist/lib/cjs/obsidian/@types/dataview/expression/field.d.cts +1 -1
  38. package/dist/lib/cjs/obsidian/@types/dataview/expression/functions.d.cts +4 -4
  39. package/dist/lib/cjs/obsidian/active-file-provider.cjs +11 -15
  40. package/dist/lib/cjs/obsidian/app.cjs +11 -15
  41. package/dist/lib/cjs/obsidian/async-with-notice.cjs +28 -32
  42. package/dist/lib/cjs/obsidian/async-with-notice.d.cts +2 -2
  43. package/dist/lib/cjs/obsidian/attachment-path.cjs +20 -24
  44. package/dist/lib/cjs/obsidian/attachment-path.d.cts +5 -5
  45. package/dist/lib/cjs/obsidian/backlink.cjs +12 -16
  46. package/dist/lib/cjs/obsidian/bases-view-registrar.cjs +11 -15
  47. package/dist/lib/cjs/obsidian/callout.cjs +27 -26
  48. package/dist/lib/cjs/obsidian/callout.d.cts +9 -3
  49. package/dist/lib/cjs/obsidian/canvas.cjs +13 -16
  50. package/dist/lib/cjs/obsidian/case-insensitive-file-index.cjs +18 -20
  51. package/dist/lib/cjs/obsidian/code-block-markdown-information.cjs +11 -15
  52. package/dist/lib/cjs/obsidian/code-block-markdown-information.d.cts +2 -2
  53. package/dist/lib/cjs/obsidian/code-block-reg-exp.cjs +11 -15
  54. package/dist/lib/cjs/obsidian/command-handlers/abstract-file-command-handler.cjs +18 -16
  55. package/dist/lib/cjs/obsidian/command-handlers/abstract-file-command-handler.d.cts +5 -0
  56. package/dist/lib/cjs/obsidian/command-handlers/command-handler-component.cjs +56 -31
  57. package/dist/lib/cjs/obsidian/command-handlers/command-handler-component.d.cts +42 -8
  58. package/dist/lib/cjs/obsidian/command-handlers/command-handler.cjs +11 -15
  59. package/dist/lib/cjs/obsidian/command-handlers/command-handler.d.cts +10 -0
  60. package/dist/lib/cjs/obsidian/command-handlers/editor-command-handler.cjs +26 -30
  61. package/dist/lib/cjs/obsidian/command-handlers/editor-command-handler.d.cts +8 -8
  62. package/dist/lib/cjs/obsidian/command-handlers/file-command-handler.cjs +12 -16
  63. package/dist/lib/cjs/obsidian/command-handlers/folder-command-handler.cjs +12 -16
  64. package/dist/lib/cjs/obsidian/command-handlers/global-command-handler.cjs +13 -17
  65. package/dist/lib/cjs/obsidian/command-handlers/index.cjs +11 -15
  66. package/dist/lib/cjs/obsidian/command-handlers/open-demo-vault-command-handler.cjs +11 -15
  67. package/dist/lib/cjs/obsidian/command-handlers/open-settings-command-handler.cjs +11 -15
  68. package/dist/lib/cjs/obsidian/command-handlers/unlock-active-note-command-handler.cjs +11 -15
  69. package/dist/lib/cjs/obsidian/command-registrar.cjs +11 -15
  70. package/dist/lib/cjs/obsidian/community-plugins.cjs +28 -25
  71. package/dist/lib/cjs/obsidian/community-plugins.d.cts +19 -5
  72. package/dist/lib/cjs/obsidian/components/abort-signal-component.cjs +11 -15
  73. package/dist/lib/cjs/obsidian/components/all-windows-event-component.cjs +11 -15
  74. package/dist/lib/cjs/obsidian/components/all-windows-event-component.d.cts +4 -4
  75. package/dist/lib/cjs/obsidian/components/async-error-handler-component.cjs +13 -16
  76. package/dist/lib/cjs/obsidian/components/async-events-component.cjs +11 -15
  77. package/dist/lib/cjs/obsidian/components/case-insensitive-file-index-component.cjs +11 -15
  78. package/dist/lib/cjs/obsidian/components/component-ex.cjs +26 -28
  79. package/dist/lib/cjs/obsidian/components/component-ex.d.cts +3 -3
  80. package/dist/lib/cjs/obsidian/components/console-debug-component.cjs +14 -18
  81. package/dist/lib/cjs/obsidian/components/console-debug-component.d.cts +2 -2
  82. package/dist/lib/cjs/obsidian/components/disposable-component.cjs +11 -15
  83. package/dist/lib/cjs/obsidian/components/embed-extensions-component.cjs +11 -15
  84. package/dist/lib/cjs/obsidian/components/generate-markdown-link-default-params-component.cjs +11 -15
  85. package/dist/lib/cjs/obsidian/components/index.cjs +14 -15
  86. package/dist/lib/cjs/obsidian/components/index.d.cts +1 -0
  87. package/dist/lib/cjs/obsidian/components/layout-ready-component.cjs +11 -15
  88. package/dist/lib/cjs/obsidian/components/menu-event-registrar-component.cjs +11 -15
  89. package/dist/lib/cjs/obsidian/components/monkey-around-component.cjs +29 -33
  90. package/dist/lib/cjs/obsidian/components/monkey-around-component.d.cts +55 -55
  91. package/dist/lib/cjs/obsidian/components/notebook-navigator-menu-event-registrar-component.cjs +297 -0
  92. package/dist/lib/cjs/obsidian/components/notebook-navigator-menu-event-registrar-component.d.cts +139 -0
  93. package/dist/lib/cjs/obsidian/components/plugin-context-component.cjs +11 -15
  94. package/dist/lib/cjs/obsidian/components/plugin-notice-component.cjs +28 -31
  95. package/dist/lib/cjs/obsidian/components/plugin-settings-component.cjs +26 -30
  96. package/dist/lib/cjs/obsidian/components/plugin-settings-component.d.cts +8 -8
  97. package/dist/lib/cjs/obsidian/components/plugin-settings-tab-component.cjs +11 -15
  98. package/dist/lib/cjs/obsidian/components/pointer-position-component.cjs +13 -17
  99. package/dist/lib/cjs/obsidian/components/registry-component.cjs +11 -15
  100. package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +72 -62
  101. package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.d.cts +12 -1
  102. package/dist/lib/cjs/obsidian/components/syntax-highlighting-component.cjs +16 -20
  103. package/dist/lib/cjs/obsidian/components/syntax-highlighting-component.d.cts +8 -8
  104. package/dist/lib/cjs/obsidian/constructors/get-dom-events-handlers-constructor.cjs +14 -18
  105. package/dist/lib/cjs/obsidian/constructors/index.cjs +11 -15
  106. package/dist/lib/cjs/obsidian/css-class.cjs +11 -15
  107. package/dist/lib/cjs/obsidian/data-handler.cjs +11 -15
  108. package/dist/lib/cjs/obsidian/dataview-link.cjs +13 -17
  109. package/dist/lib/cjs/obsidian/dataview.cjs +35 -41
  110. package/dist/lib/cjs/obsidian/dataview.d.cts +2 -2
  111. package/dist/lib/cjs/obsidian/demo-vault-helper.cjs +13 -17
  112. package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.cjs +22 -26
  113. package/dist/lib/cjs/obsidian/desktop-trusted-input.cjs +23 -21
  114. package/dist/lib/cjs/obsidian/editor-extension-registrar.cjs +11 -15
  115. package/dist/lib/cjs/obsidian/editor-suggest-registrar.cjs +11 -15
  116. package/dist/lib/cjs/obsidian/editor.cjs +17 -19
  117. package/dist/lib/cjs/obsidian/events.cjs +12 -16
  118. package/dist/lib/cjs/obsidian/events.d.cts +2 -2
  119. package/dist/lib/cjs/obsidian/extensions-registrar.cjs +11 -15
  120. package/dist/lib/cjs/obsidian/file-change.cjs +76 -80
  121. package/dist/lib/cjs/obsidian/file-change.d.cts +3 -3
  122. package/dist/lib/cjs/obsidian/file-manager.cjs +33 -22
  123. package/dist/lib/cjs/obsidian/file-manager.d.cts +20 -1
  124. package/dist/lib/cjs/obsidian/file-system.cjs +15 -19
  125. package/dist/lib/cjs/obsidian/file-system.d.cts +3 -3
  126. package/dist/lib/cjs/obsidian/frontmatter-link-cache-with-offsets.cjs +11 -15
  127. package/dist/lib/cjs/obsidian/frontmatter.cjs +15 -19
  128. package/dist/lib/cjs/obsidian/hover-link-source-registrar.cjs +11 -15
  129. package/dist/lib/cjs/obsidian/html-element.cjs +13 -17
  130. package/dist/lib/cjs/obsidian/html-element.d.cts +2 -2
  131. package/dist/lib/cjs/obsidian/i18n/custom-type-options.cjs +11 -15
  132. package/dist/lib/cjs/obsidian/i18n/default-translations.cjs +11 -15
  133. package/dist/lib/cjs/obsidian/i18n/i18n.cjs +13 -16
  134. package/dist/lib/cjs/obsidian/i18n/i18n.d.cts +7 -0
  135. package/dist/lib/cjs/obsidian/i18n/index.cjs +11 -15
  136. package/dist/lib/cjs/obsidian/i18n/locales/en.cjs +11 -15
  137. package/dist/lib/cjs/obsidian/i18n/locales/index.cjs +11 -15
  138. package/dist/lib/cjs/obsidian/i18n/locales/translations-map.cjs +11 -15
  139. package/dist/lib/cjs/obsidian/index.cjs +14 -15
  140. package/dist/lib/cjs/obsidian/index.d.cts +1 -0
  141. package/dist/lib/cjs/obsidian/is-in-obsidian.cjs +11 -15
  142. package/dist/lib/cjs/obsidian/link-update-progress.cjs +11 -15
  143. package/dist/lib/cjs/obsidian/link.cjs +91 -81
  144. package/dist/lib/cjs/obsidian/link.d.cts +22 -22
  145. package/dist/lib/cjs/obsidian/logger.cjs +21 -25
  146. package/dist/lib/cjs/obsidian/logger.d.cts +5 -5
  147. package/dist/lib/cjs/obsidian/loop.cjs +14 -18
  148. package/dist/lib/cjs/obsidian/loop.d.cts +1 -1
  149. package/dist/lib/cjs/obsidian/markdown-code-block-processor-registrar.cjs +12 -16
  150. package/dist/lib/cjs/obsidian/markdown-code-block-processor-registrar.d.cts +3 -3
  151. package/dist/lib/cjs/obsidian/markdown-code-block-processor.cjs +35 -40
  152. package/dist/lib/cjs/obsidian/markdown-code-block-processor.d.cts +3 -3
  153. package/dist/lib/cjs/obsidian/markdown-post-processor-registrar.cjs +12 -16
  154. package/dist/lib/cjs/obsidian/markdown-post-processor-registrar.d.cts +3 -3
  155. package/dist/lib/cjs/obsidian/markdown-view.cjs +11 -15
  156. package/dist/lib/cjs/obsidian/markdown.cjs +22 -24
  157. package/dist/lib/cjs/obsidian/menu-event-registrar.cjs +11 -15
  158. package/dist/lib/cjs/obsidian/menu-event-registrar.d.cts +1 -1
  159. package/dist/lib/cjs/obsidian/metadata-cache.cjs +16 -20
  160. package/dist/lib/cjs/obsidian/metadata-cache.d.cts +2 -2
  161. package/dist/lib/cjs/obsidian/modals/alert.cjs +11 -15
  162. package/dist/lib/cjs/obsidian/modals/confirm.cjs +11 -15
  163. package/dist/lib/cjs/obsidian/modals/index.cjs +11 -15
  164. package/dist/lib/cjs/obsidian/modals/minimizable-modal.cjs +28 -32
  165. package/dist/lib/cjs/obsidian/modals/modal.cjs +11 -15
  166. package/dist/lib/cjs/obsidian/modals/prompt.cjs +11 -15
  167. package/dist/lib/cjs/obsidian/modals/select-item.cjs +16 -20
  168. package/dist/lib/cjs/obsidian/modals/select-item.d.cts +1 -1
  169. package/dist/lib/cjs/obsidian/modals/select-option.cjs +11 -15
  170. package/dist/lib/cjs/obsidian/modals/suggest-modal-command-builder.cjs +26 -28
  171. package/dist/lib/cjs/obsidian/modals/suggest-modal-command-builder.d.cts +5 -5
  172. package/dist/lib/cjs/obsidian/notebook-navigator.cjs +155 -0
  173. package/dist/lib/cjs/obsidian/notebook-navigator.d.cts +132 -0
  174. package/dist/lib/cjs/obsidian/obsidian-protocol-handler-registrar.cjs +11 -15
  175. package/dist/lib/cjs/obsidian/obsidian-settings.cjs +11 -15
  176. package/dist/lib/cjs/obsidian/parse-link.cjs +61 -62
  177. package/dist/lib/cjs/obsidian/parse-link.d.cts +4 -4
  178. package/dist/lib/cjs/obsidian/path-settings.cjs +27 -25
  179. package/dist/lib/cjs/obsidian/pdf.cjs +13 -17
  180. package/dist/lib/cjs/obsidian/pdf.d.cts +2 -2
  181. package/dist/lib/cjs/obsidian/plugin/index.cjs +11 -15
  182. package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.cjs +11 -15
  183. package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.d.cts +156 -52
  184. package/dist/lib/cjs/obsidian/plugin/plugin-context.cjs +17 -21
  185. package/dist/lib/cjs/obsidian/plugin/plugin-context.d.cts +2 -2
  186. package/dist/lib/cjs/obsidian/plugin/plugin-event-source.cjs +20 -24
  187. package/dist/lib/cjs/obsidian/plugin/plugin-event-source.d.cts +11 -9
  188. package/dist/lib/cjs/obsidian/plugin/plugin-settings-tab.cjs +29 -33
  189. package/dist/lib/cjs/obsidian/plugin/plugin.cjs +33 -16
  190. package/dist/lib/cjs/obsidian/plugin/plugin.d.cts +11 -1
  191. package/dist/lib/cjs/obsidian/plugin-cli-handler-registrar.cjs +11 -15
  192. package/dist/lib/cjs/obsidian/popovers/field-popover.cjs +11 -15
  193. package/dist/lib/cjs/obsidian/popovers/index.cjs +11 -15
  194. package/dist/lib/cjs/obsidian/popovers/popover-anchor.cjs +14 -18
  195. package/dist/lib/cjs/obsidian/popovers/popover-anchor.d.cts +2 -2
  196. package/dist/lib/cjs/obsidian/popovers/popover.cjs +19 -23
  197. package/dist/lib/cjs/obsidian/queue.cjs +16 -20
  198. package/dist/lib/cjs/obsidian/queue.d.cts +2 -2
  199. package/dist/lib/cjs/obsidian/react/app-context.cjs +11 -15
  200. package/dist/lib/cjs/obsidian/react/index.cjs +11 -15
  201. package/dist/lib/cjs/obsidian/reference.cjs +11 -15
  202. package/dist/lib/cjs/obsidian/resource-lock.cjs +157 -78
  203. package/dist/lib/cjs/obsidian/resource-lock.d.cts +5 -0
  204. package/dist/lib/cjs/obsidian/resource-url.cjs +12 -16
  205. package/dist/lib/cjs/obsidian/ribbon-icon-registrar.cjs +11 -15
  206. package/dist/lib/cjs/obsidian/ribbon-icon-registrar.d.cts +2 -2
  207. package/dist/lib/cjs/obsidian/setting-components/checkbox-component.cjs +18 -22
  208. package/dist/lib/cjs/obsidian/setting-components/checkbox-component.d.cts +5 -5
  209. package/dist/lib/cjs/obsidian/setting-components/code-highlighter-component.cjs +28 -31
  210. package/dist/lib/cjs/obsidian/setting-components/code-highlighter-component.d.cts +2 -2
  211. package/dist/lib/cjs/obsidian/setting-components/date-component.cjs +14 -18
  212. package/dist/lib/cjs/obsidian/setting-components/date-component.d.cts +2 -2
  213. package/dist/lib/cjs/obsidian/setting-components/date-time-component.cjs +14 -18
  214. package/dist/lib/cjs/obsidian/setting-components/date-time-component.d.cts +2 -2
  215. package/dist/lib/cjs/obsidian/setting-components/email-component.cjs +14 -18
  216. package/dist/lib/cjs/obsidian/setting-components/email-component.d.cts +2 -2
  217. package/dist/lib/cjs/obsidian/setting-components/file-component.cjs +11 -15
  218. package/dist/lib/cjs/obsidian/setting-components/index.cjs +11 -15
  219. package/dist/lib/cjs/obsidian/setting-components/month-component.cjs +14 -18
  220. package/dist/lib/cjs/obsidian/setting-components/month-component.d.cts +2 -2
  221. package/dist/lib/cjs/obsidian/setting-components/multiple-dropdown-component.cjs +17 -21
  222. package/dist/lib/cjs/obsidian/setting-components/multiple-dropdown-component.d.cts +2 -2
  223. package/dist/lib/cjs/obsidian/setting-components/multiple-email-component.cjs +14 -18
  224. package/dist/lib/cjs/obsidian/setting-components/multiple-email-component.d.cts +2 -2
  225. package/dist/lib/cjs/obsidian/setting-components/multiple-file-component.cjs +12 -16
  226. package/dist/lib/cjs/obsidian/setting-components/multiple-text-component.cjs +15 -19
  227. package/dist/lib/cjs/obsidian/setting-components/multiple-text-component.d.cts +2 -2
  228. package/dist/lib/cjs/obsidian/setting-components/number-component.cjs +14 -18
  229. package/dist/lib/cjs/obsidian/setting-components/number-component.d.cts +2 -2
  230. package/dist/lib/cjs/obsidian/setting-components/password-component.cjs +14 -18
  231. package/dist/lib/cjs/obsidian/setting-components/password-component.d.cts +2 -2
  232. package/dist/lib/cjs/obsidian/setting-components/setting-component-wrapper.cjs +16 -20
  233. package/dist/lib/cjs/obsidian/setting-components/setting-component-wrapper.d.cts +2 -2
  234. package/dist/lib/cjs/obsidian/setting-components/telephone-component.cjs +14 -18
  235. package/dist/lib/cjs/obsidian/setting-components/telephone-component.d.cts +2 -2
  236. package/dist/lib/cjs/obsidian/setting-components/text-based-component.cjs +16 -20
  237. package/dist/lib/cjs/obsidian/setting-components/text-based-component.d.cts +2 -2
  238. package/dist/lib/cjs/obsidian/setting-components/time-component.cjs +14 -18
  239. package/dist/lib/cjs/obsidian/setting-components/time-component.d.cts +2 -2
  240. package/dist/lib/cjs/obsidian/setting-components/tri-state-checkbox-component.cjs +15 -19
  241. package/dist/lib/cjs/obsidian/setting-components/tri-state-checkbox-component.d.cts +2 -2
  242. package/dist/lib/cjs/obsidian/setting-components/typed-dropdown-component.cjs +16 -20
  243. package/dist/lib/cjs/obsidian/setting-components/typed-dropdown-component.d.cts +2 -2
  244. package/dist/lib/cjs/obsidian/setting-components/typed-multiple-dropdown-component.cjs +18 -22
  245. package/dist/lib/cjs/obsidian/setting-components/typed-multiple-dropdown-component.d.cts +2 -2
  246. package/dist/lib/cjs/obsidian/setting-components/typed-range-text-component.cjs +11 -15
  247. package/dist/lib/cjs/obsidian/setting-components/typed-text-component.cjs +16 -19
  248. package/dist/lib/cjs/obsidian/setting-components/typed-text-component.d.cts +4 -4
  249. package/dist/lib/cjs/obsidian/setting-components/url-component.cjs +14 -18
  250. package/dist/lib/cjs/obsidian/setting-components/url-component.d.cts +2 -2
  251. package/dist/lib/cjs/obsidian/setting-components/validator-component.cjs +45 -49
  252. package/dist/lib/cjs/obsidian/setting-components/validator-component.d.cts +2 -2
  253. package/dist/lib/cjs/obsidian/setting-components/value-component-with-change-tracking.cjs +11 -15
  254. package/dist/lib/cjs/obsidian/setting-components/week-component.cjs +14 -18
  255. package/dist/lib/cjs/obsidian/setting-components/week-component.d.cts +2 -2
  256. package/dist/lib/cjs/obsidian/setting-ex.cjs +76 -80
  257. package/dist/lib/cjs/obsidian/setting-ex.d.cts +42 -42
  258. package/dist/lib/cjs/obsidian/setting-group-ex.cjs +14 -18
  259. package/dist/lib/cjs/obsidian/setting-group-ex.d.cts +2 -2
  260. package/dist/lib/cjs/obsidian/status-bar-item-registrar.cjs +11 -15
  261. package/dist/lib/cjs/obsidian/validation.cjs +11 -15
  262. package/dist/lib/cjs/obsidian/vault-delete.cjs +23 -20
  263. package/dist/lib/cjs/obsidian/vault-delete.d.cts +16 -2
  264. package/dist/lib/cjs/obsidian/vault-transaction.cjs +17 -18
  265. package/dist/lib/cjs/obsidian/vault.cjs +81 -63
  266. package/dist/lib/cjs/obsidian/vault.d.cts +32 -11
  267. package/dist/lib/cjs/obsidian/view-registrar.cjs +11 -15
  268. package/dist/lib/cjs/obsidian/workspace.cjs +12 -16
  269. package/dist/lib/cjs/obsidian-dev-utils-state.cjs +11 -15
  270. package/dist/lib/cjs/path.cjs +18 -22
  271. package/dist/lib/cjs/path.d.cts +1 -1
  272. package/dist/lib/cjs/reg-exp.cjs +38 -35
  273. package/dist/lib/cjs/reg-exp.d.cts +4 -4
  274. package/dist/lib/cjs/script-utils/build.cjs +21 -25
  275. package/dist/lib/cjs/script-utils/build.d.cts +1 -1
  276. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/change-extension-plugin.cjs +24 -28
  277. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.cjs +36 -34
  278. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/custom-esbuild-options-plugin.cjs +11 -15
  279. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/dependency.cjs +20 -24
  280. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/fix-esm-plugin.cjs +13 -17
  281. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/fix-source-maps-plugin.cjs +16 -20
  282. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/index.cjs +11 -15
  283. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.cjs +11 -15
  284. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.d.cts +6 -2
  285. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/preprocess-plugin.cjs +32 -36
  286. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/rename-css-plugin.cjs +11 -15
  287. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/svelte-wrapper-plugin.cjs +11 -15
  288. package/dist/lib/cjs/script-utils/bundlers/esbuild.cjs +11 -15
  289. package/dist/lib/cjs/script-utils/bundlers/index.cjs +11 -15
  290. package/dist/lib/cjs/script-utils/check-project-types.cjs +13 -17
  291. package/dist/lib/cjs/script-utils/check-project-types.d.cts +12 -4
  292. package/dist/lib/cjs/script-utils/cli-utils.cjs +39 -47
  293. package/dist/lib/cjs/script-utils/cli-utils.d.cts +6 -6
  294. package/dist/lib/cjs/script-utils/code-generator.cjs +11 -15
  295. package/dist/lib/cjs/script-utils/commitlint-config.cjs +11 -15
  296. package/dist/lib/cjs/script-utils/demo-vault-coverage.cjs +22 -23
  297. package/dist/lib/cjs/script-utils/demo-vault.cjs +11 -15
  298. package/dist/lib/cjs/script-utils/env-toggle.cjs +13 -17
  299. package/dist/lib/cjs/script-utils/exec.cjs +40 -44
  300. package/dist/lib/cjs/script-utils/exec.d.cts +4 -4
  301. package/dist/lib/cjs/script-utils/formatters/dprint.cjs +12 -16
  302. package/dist/lib/cjs/script-utils/formatters/index.cjs +11 -15
  303. package/dist/lib/cjs/script-utils/fs.cjs +13 -17
  304. package/dist/lib/cjs/script-utils/git.cjs +11 -15
  305. package/dist/lib/cjs/script-utils/index.cjs +11 -15
  306. package/dist/lib/cjs/script-utils/json.cjs +15 -19
  307. package/dist/lib/cjs/script-utils/json.d.cts +2 -2
  308. package/dist/lib/cjs/script-utils/linters/cspell.cjs +12 -16
  309. package/dist/lib/cjs/script-utils/linters/eslint-agnostic-core-boundary.cjs +11 -15
  310. package/dist/lib/cjs/script-utils/linters/eslint-config.cjs +402 -16
  311. package/dist/lib/cjs/script-utils/linters/eslint-no-restricted-syntax.cjs +11 -15
  312. package/dist/lib/cjs/script-utils/linters/eslint-rules/index.cjs +11 -15
  313. package/dist/lib/cjs/script-utils/linters/eslint-rules/no-async-callback-to-unsafe-return.cjs +27 -31
  314. package/dist/lib/cjs/script-utils/linters/eslint-rules/no-async-callback-to-unsafe-return.d.cts +3 -1
  315. package/dist/lib/cjs/script-utils/linters/eslint-rules/no-unused-params-members.cjs +27 -31
  316. package/dist/lib/cjs/script-utils/linters/eslint-rules/no-unused-params-members.d.cts +3 -1
  317. package/dist/lib/cjs/script-utils/linters/eslint-rules/no-used-underscore-variables.cjs +21 -25
  318. package/dist/lib/cjs/script-utils/linters/eslint-rules/no-used-underscore-variables.d.cts +3 -1
  319. package/dist/lib/cjs/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.cjs +11 -15
  320. package/dist/lib/cjs/script-utils/linters/eslint-rules/params-options-name-match.cjs +109 -113
  321. package/dist/lib/cjs/script-utils/linters/eslint-rules/params-options-name-match.d.cts +3 -1
  322. package/dist/lib/cjs/script-utils/linters/eslint-rules/prefer-noop-async.cjs +13 -17
  323. package/dist/lib/cjs/script-utils/linters/eslint-rules/prefer-noop-async.d.cts +3 -1
  324. package/dist/lib/cjs/script-utils/linters/eslint-rules/readonly-params-options-result-members.cjs +21 -25
  325. package/dist/lib/cjs/script-utils/linters/eslint-rules/readonly-params-options-result-members.d.cts +3 -1
  326. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-component-suffix.cjs +51 -55
  327. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-component-suffix.d.cts +9 -3
  328. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-method-template.cjs +25 -27
  329. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-method-template.d.cts +6 -2
  330. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-super-call.cjs +33 -37
  331. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-super-call.d.cts +3 -1
  332. package/dist/lib/cjs/script-utils/linters/eslint-rules/rule-tester-helper.cjs +11 -15
  333. package/dist/lib/cjs/script-utils/linters/eslint.cjs +14 -18
  334. package/dist/lib/cjs/script-utils/linters/index.cjs +14 -15
  335. package/dist/lib/cjs/script-utils/linters/index.d.cts +1 -0
  336. package/dist/lib/cjs/script-utils/linters/markdownlint-cli2-config.cjs +18 -17
  337. package/dist/lib/cjs/script-utils/linters/markdownlint-cli2-config.d.cts +2 -2
  338. package/dist/lib/cjs/script-utils/linters/markdownlint-ignores.cjs +138 -0
  339. package/dist/lib/cjs/script-utils/linters/markdownlint-ignores.d.cts +35 -0
  340. package/dist/lib/cjs/script-utils/linters/markdownlint.cjs +20 -23
  341. package/dist/lib/cjs/script-utils/linters/over-exposure.cjs +18 -22
  342. package/dist/lib/cjs/script-utils/linters/over-exposure.d.cts +54 -18
  343. package/dist/lib/cjs/script-utils/nano-staged-config.cjs +11 -15
  344. package/dist/lib/cjs/script-utils/npm-publish.cjs +11 -15
  345. package/dist/lib/cjs/script-utils/npm-run.cjs +20 -17
  346. package/dist/lib/cjs/script-utils/npm-run.d.cts +16 -2
  347. package/dist/lib/cjs/script-utils/npm.cjs +21 -25
  348. package/dist/lib/cjs/script-utils/npm.d.cts +11 -11
  349. package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.cjs +11 -15
  350. package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.d.cts +165 -55
  351. package/dist/lib/cjs/script-utils/root.cjs +11 -15
  352. package/dist/lib/cjs/script-utils/test-runners/index.cjs +16 -17
  353. package/dist/lib/cjs/script-utils/test-runners/index.d.cts +1 -0
  354. package/dist/lib/cjs/script-utils/test-runners/integration-test-plugin.cjs +11 -15
  355. package/dist/lib/cjs/script-utils/test-runners/vitest-config.cjs +325 -0
  356. package/dist/lib/cjs/script-utils/test-runners/vitest-config.d.cts +118 -0
  357. package/dist/lib/cjs/script-utils/test-runners/vitest.cjs +11 -15
  358. package/dist/lib/cjs/script-utils/validate-declarations.cjs +11 -15
  359. package/dist/lib/cjs/script-utils/version.cjs +62 -63
  360. package/dist/lib/cjs/script-utils/version.d.cts +21 -21
  361. package/dist/lib/cjs/script-utils/warnings-as-errors.cjs +11 -15
  362. package/dist/lib/cjs/setup.cjs +11 -15
  363. package/dist/lib/cjs/setup.d.cts +1 -1
  364. package/dist/lib/cjs/strict-proxy.cjs +30 -34
  365. package/dist/lib/cjs/strict-proxy.d.cts +2 -2
  366. package/dist/lib/cjs/string.cjs +90 -93
  367. package/dist/lib/cjs/string.d.cts +60 -60
  368. package/dist/lib/cjs/transformers/date-transformer.cjs +11 -15
  369. package/dist/lib/cjs/transformers/duration-transformer.cjs +11 -15
  370. package/dist/lib/cjs/transformers/group-transformer.cjs +11 -15
  371. package/dist/lib/cjs/transformers/index.cjs +11 -15
  372. package/dist/lib/cjs/transformers/map-transformer.cjs +12 -16
  373. package/dist/lib/cjs/transformers/set-transformer.cjs +12 -16
  374. package/dist/lib/cjs/transformers/skip-private-property-transformer.cjs +11 -15
  375. package/dist/lib/cjs/transformers/transformer.cjs +11 -15
  376. package/dist/lib/cjs/transformers/two-way-map-transformer.cjs +12 -16
  377. package/dist/lib/cjs/transformers/typed-transformer.cjs +11 -15
  378. package/dist/lib/cjs/two-way-map.cjs +11 -15
  379. package/dist/lib/cjs/type-guards.cjs +16 -20
  380. package/dist/lib/cjs/type-guards.d.cts +6 -6
  381. package/dist/lib/cjs/type.cjs +13 -17
  382. package/dist/lib/cjs/type.d.cts +2 -2
  383. package/dist/lib/cjs/url.cjs +18 -22
  384. package/dist/lib/cjs/url.d.cts +4 -4
  385. package/dist/lib/cjs/value-provider.cjs +15 -19
  386. package/dist/lib/cjs/value-provider.d.cts +6 -6
  387. package/dist/lib/cjs/value-wrapper.cjs +11 -15
  388. package/dist/lib/cjs/vitest-setup.cjs +11 -15
  389. package/dist/lib/esm/__merged.d.mts +12 -10
  390. package/dist/lib/esm/__merged.mjs +51 -23
  391. package/dist/lib/esm/abort-controller.mjs +5 -8
  392. package/dist/lib/esm/array.d.mts +25 -7
  393. package/dist/lib/esm/array.mjs +16 -12
  394. package/dist/lib/esm/async-events.d.mts +50 -50
  395. package/dist/lib/esm/async-events.mjs +81 -78
  396. package/dist/lib/esm/async.d.mts +23 -23
  397. package/dist/lib/esm/async.mjs +70 -66
  398. package/dist/lib/esm/blob.mjs +4 -11
  399. package/dist/lib/esm/debug.d.mts +1 -1
  400. package/dist/lib/esm/debug.mjs +14 -18
  401. package/dist/lib/esm/disposable.d.mts +27 -8
  402. package/dist/lib/esm/disposable.mjs +47 -29
  403. package/dist/lib/esm/error.mjs +18 -19
  404. package/dist/lib/esm/function.d.mts +26 -26
  405. package/dist/lib/esm/function.mjs +20 -20
  406. package/dist/lib/esm/generated-during-build.mjs +1 -1
  407. package/dist/lib/esm/html-element.d.mts +15 -15
  408. package/dist/lib/esm/html-element.mjs +74 -75
  409. package/dist/lib/esm/object-utils.d.mts +27 -27
  410. package/dist/lib/esm/object-utils.mjs +109 -102
  411. package/dist/lib/esm/obsidian/@types/dataview/data-model/value.d.mts +1 -1
  412. package/dist/lib/esm/obsidian/@types/dataview/expression/field.d.mts +1 -1
  413. package/dist/lib/esm/obsidian/@types/dataview/expression/functions.d.mts +4 -4
  414. package/dist/lib/esm/obsidian/app.mjs +1 -1
  415. package/dist/lib/esm/obsidian/async-with-notice.d.mts +2 -2
  416. package/dist/lib/esm/obsidian/async-with-notice.mjs +18 -18
  417. package/dist/lib/esm/obsidian/attachment-path.d.mts +5 -5
  418. package/dist/lib/esm/obsidian/attachment-path.mjs +10 -10
  419. package/dist/lib/esm/obsidian/backlink.mjs +2 -2
  420. package/dist/lib/esm/obsidian/callout.d.mts +9 -3
  421. package/dist/lib/esm/obsidian/callout.mjs +17 -12
  422. package/dist/lib/esm/obsidian/canvas.mjs +3 -2
  423. package/dist/lib/esm/obsidian/case-insensitive-file-index.mjs +8 -6
  424. package/dist/lib/esm/obsidian/code-block-markdown-information.d.mts +2 -2
  425. package/dist/lib/esm/obsidian/command-handlers/abstract-file-command-handler.d.mts +5 -0
  426. package/dist/lib/esm/obsidian/command-handlers/abstract-file-command-handler.mjs +8 -2
  427. package/dist/lib/esm/obsidian/command-handlers/command-handler-component.d.mts +42 -8
  428. package/dist/lib/esm/obsidian/command-handlers/command-handler-component.mjs +46 -17
  429. package/dist/lib/esm/obsidian/command-handlers/command-handler.d.mts +10 -0
  430. package/dist/lib/esm/obsidian/command-handlers/command-handler.mjs +1 -1
  431. package/dist/lib/esm/obsidian/command-handlers/editor-command-handler.d.mts +8 -8
  432. package/dist/lib/esm/obsidian/command-handlers/editor-command-handler.mjs +16 -16
  433. package/dist/lib/esm/obsidian/command-handlers/file-command-handler.mjs +2 -2
  434. package/dist/lib/esm/obsidian/command-handlers/folder-command-handler.mjs +2 -2
  435. package/dist/lib/esm/obsidian/command-handlers/global-command-handler.mjs +3 -3
  436. package/dist/lib/esm/obsidian/community-plugins.d.mts +19 -5
  437. package/dist/lib/esm/obsidian/community-plugins.mjs +17 -11
  438. package/dist/lib/esm/obsidian/components/all-windows-event-component.d.mts +4 -4
  439. package/dist/lib/esm/obsidian/components/all-windows-event-component.mjs +1 -1
  440. package/dist/lib/esm/obsidian/components/async-error-handler-component.mjs +3 -2
  441. package/dist/lib/esm/obsidian/components/component-ex.d.mts +3 -3
  442. package/dist/lib/esm/obsidian/components/component-ex.mjs +16 -14
  443. package/dist/lib/esm/obsidian/components/console-debug-component.d.mts +2 -2
  444. package/dist/lib/esm/obsidian/components/console-debug-component.mjs +4 -4
  445. package/dist/lib/esm/obsidian/components/index.d.mts +1 -0
  446. package/dist/lib/esm/obsidian/components/index.mjs +3 -1
  447. package/dist/lib/esm/obsidian/components/menu-event-registrar-component.mjs +5 -5
  448. package/dist/lib/esm/obsidian/components/monkey-around-component.d.mts +55 -55
  449. package/dist/lib/esm/obsidian/components/monkey-around-component.mjs +19 -19
  450. package/dist/lib/esm/obsidian/components/notebook-navigator-menu-event-registrar-component.d.mts +139 -0
  451. package/dist/lib/esm/obsidian/components/notebook-navigator-menu-event-registrar-component.mjs +196 -0
  452. package/dist/lib/esm/obsidian/components/plugin-notice-component.mjs +18 -17
  453. package/dist/lib/esm/obsidian/components/plugin-settings-component.d.mts +8 -8
  454. package/dist/lib/esm/obsidian/components/plugin-settings-component.mjs +18 -18
  455. package/dist/lib/esm/obsidian/components/pointer-position-component.mjs +3 -3
  456. package/dist/lib/esm/obsidian/components/rename-delete-handler-component.d.mts +12 -1
  457. package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +62 -48
  458. package/dist/lib/esm/obsidian/components/syntax-highlighting-component.d.mts +8 -8
  459. package/dist/lib/esm/obsidian/components/syntax-highlighting-component.mjs +6 -6
  460. package/dist/lib/esm/obsidian/constructors/get-dom-events-handlers-constructor.mjs +4 -4
  461. package/dist/lib/esm/obsidian/data-handler.mjs +1 -1
  462. package/dist/lib/esm/obsidian/dataview-link.mjs +3 -3
  463. package/dist/lib/esm/obsidian/dataview.d.mts +2 -2
  464. package/dist/lib/esm/obsidian/dataview.mjs +25 -27
  465. package/dist/lib/esm/obsidian/demo-vault-helper.mjs +4 -3
  466. package/dist/lib/esm/obsidian/desktop-demo-vault-opener.mjs +12 -12
  467. package/dist/lib/esm/obsidian/desktop-trusted-input.mjs +13 -7
  468. package/dist/lib/esm/obsidian/editor.mjs +7 -5
  469. package/dist/lib/esm/obsidian/events.d.mts +2 -2
  470. package/dist/lib/esm/obsidian/events.mjs +2 -2
  471. package/dist/lib/esm/obsidian/file-change.d.mts +3 -3
  472. package/dist/lib/esm/obsidian/file-change.mjs +67 -67
  473. package/dist/lib/esm/obsidian/file-manager.d.mts +20 -1
  474. package/dist/lib/esm/obsidian/file-manager.mjs +22 -8
  475. package/dist/lib/esm/obsidian/file-system.d.mts +3 -3
  476. package/dist/lib/esm/obsidian/file-system.mjs +4 -4
  477. package/dist/lib/esm/obsidian/frontmatter.mjs +5 -5
  478. package/dist/lib/esm/obsidian/html-element.d.mts +2 -2
  479. package/dist/lib/esm/obsidian/html-element.mjs +3 -3
  480. package/dist/lib/esm/obsidian/i18n/i18n.d.mts +7 -0
  481. package/dist/lib/esm/obsidian/i18n/i18n.mjs +3 -2
  482. package/dist/lib/esm/obsidian/index.d.mts +1 -0
  483. package/dist/lib/esm/obsidian/index.mjs +3 -1
  484. package/dist/lib/esm/obsidian/link.d.mts +22 -22
  485. package/dist/lib/esm/obsidian/link.mjs +76 -62
  486. package/dist/lib/esm/obsidian/logger.d.mts +5 -5
  487. package/dist/lib/esm/obsidian/logger.mjs +11 -11
  488. package/dist/lib/esm/obsidian/loop.d.mts +1 -1
  489. package/dist/lib/esm/obsidian/loop.mjs +4 -4
  490. package/dist/lib/esm/obsidian/markdown-code-block-processor-registrar.d.mts +3 -3
  491. package/dist/lib/esm/obsidian/markdown-code-block-processor-registrar.mjs +2 -2
  492. package/dist/lib/esm/obsidian/markdown-code-block-processor.d.mts +3 -3
  493. package/dist/lib/esm/obsidian/markdown-code-block-processor.mjs +25 -26
  494. package/dist/lib/esm/obsidian/markdown-post-processor-registrar.d.mts +3 -3
  495. package/dist/lib/esm/obsidian/markdown-post-processor-registrar.mjs +2 -2
  496. package/dist/lib/esm/obsidian/markdown.mjs +12 -10
  497. package/dist/lib/esm/obsidian/menu-event-registrar.d.mts +1 -1
  498. package/dist/lib/esm/obsidian/metadata-cache.d.mts +2 -2
  499. package/dist/lib/esm/obsidian/metadata-cache.mjs +6 -6
  500. package/dist/lib/esm/obsidian/modals/confirm.mjs +1 -1
  501. package/dist/lib/esm/obsidian/modals/minimizable-modal.mjs +18 -18
  502. package/dist/lib/esm/obsidian/modals/select-item.d.mts +1 -1
  503. package/dist/lib/esm/obsidian/modals/select-item.mjs +6 -6
  504. package/dist/lib/esm/obsidian/modals/suggest-modal-command-builder.d.mts +5 -5
  505. package/dist/lib/esm/obsidian/modals/suggest-modal-command-builder.mjs +16 -14
  506. package/dist/lib/esm/obsidian/notebook-navigator.d.mts +132 -0
  507. package/dist/lib/esm/obsidian/notebook-navigator.mjs +49 -0
  508. package/dist/lib/esm/obsidian/parse-link.d.mts +4 -4
  509. package/dist/lib/esm/obsidian/parse-link.mjs +51 -48
  510. package/dist/lib/esm/obsidian/path-settings.mjs +17 -11
  511. package/dist/lib/esm/obsidian/pdf.d.mts +2 -2
  512. package/dist/lib/esm/obsidian/pdf.mjs +3 -3
  513. package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.d.mts +156 -52
  514. package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.mjs +1 -1
  515. package/dist/lib/esm/obsidian/plugin/plugin-context.d.mts +2 -2
  516. package/dist/lib/esm/obsidian/plugin/plugin-context.mjs +7 -7
  517. package/dist/lib/esm/obsidian/plugin/plugin-event-source.d.mts +11 -9
  518. package/dist/lib/esm/obsidian/plugin/plugin-event-source.mjs +10 -10
  519. package/dist/lib/esm/obsidian/plugin/plugin-settings-tab.mjs +20 -20
  520. package/dist/lib/esm/obsidian/plugin/plugin.d.mts +11 -1
  521. package/dist/lib/esm/obsidian/plugin/plugin.mjs +23 -2
  522. package/dist/lib/esm/obsidian/popovers/popover-anchor.d.mts +2 -2
  523. package/dist/lib/esm/obsidian/popovers/popover-anchor.mjs +4 -4
  524. package/dist/lib/esm/obsidian/popovers/popover.mjs +9 -9
  525. package/dist/lib/esm/obsidian/queue.d.mts +2 -2
  526. package/dist/lib/esm/obsidian/queue.mjs +6 -6
  527. package/dist/lib/esm/obsidian/resource-lock.d.mts +5 -0
  528. package/dist/lib/esm/obsidian/resource-lock.mjs +147 -64
  529. package/dist/lib/esm/obsidian/resource-url.mjs +2 -2
  530. package/dist/lib/esm/obsidian/ribbon-icon-registrar.d.mts +2 -2
  531. package/dist/lib/esm/obsidian/ribbon-icon-registrar.mjs +1 -1
  532. package/dist/lib/esm/obsidian/setting-components/checkbox-component.d.mts +5 -5
  533. package/dist/lib/esm/obsidian/setting-components/checkbox-component.mjs +8 -8
  534. package/dist/lib/esm/obsidian/setting-components/code-highlighter-component.d.mts +2 -2
  535. package/dist/lib/esm/obsidian/setting-components/code-highlighter-component.mjs +18 -17
  536. package/dist/lib/esm/obsidian/setting-components/date-component.d.mts +2 -2
  537. package/dist/lib/esm/obsidian/setting-components/date-component.mjs +4 -4
  538. package/dist/lib/esm/obsidian/setting-components/date-time-component.d.mts +2 -2
  539. package/dist/lib/esm/obsidian/setting-components/date-time-component.mjs +4 -4
  540. package/dist/lib/esm/obsidian/setting-components/email-component.d.mts +2 -2
  541. package/dist/lib/esm/obsidian/setting-components/email-component.mjs +4 -4
  542. package/dist/lib/esm/obsidian/setting-components/month-component.d.mts +2 -2
  543. package/dist/lib/esm/obsidian/setting-components/month-component.mjs +4 -4
  544. package/dist/lib/esm/obsidian/setting-components/multiple-dropdown-component.d.mts +2 -2
  545. package/dist/lib/esm/obsidian/setting-components/multiple-dropdown-component.mjs +7 -7
  546. package/dist/lib/esm/obsidian/setting-components/multiple-email-component.d.mts +2 -2
  547. package/dist/lib/esm/obsidian/setting-components/multiple-email-component.mjs +4 -4
  548. package/dist/lib/esm/obsidian/setting-components/multiple-file-component.mjs +2 -2
  549. package/dist/lib/esm/obsidian/setting-components/multiple-text-component.d.mts +2 -2
  550. package/dist/lib/esm/obsidian/setting-components/multiple-text-component.mjs +5 -5
  551. package/dist/lib/esm/obsidian/setting-components/number-component.d.mts +2 -2
  552. package/dist/lib/esm/obsidian/setting-components/number-component.mjs +4 -4
  553. package/dist/lib/esm/obsidian/setting-components/password-component.d.mts +2 -2
  554. package/dist/lib/esm/obsidian/setting-components/password-component.mjs +4 -4
  555. package/dist/lib/esm/obsidian/setting-components/setting-component-wrapper.d.mts +2 -2
  556. package/dist/lib/esm/obsidian/setting-components/setting-component-wrapper.mjs +6 -6
  557. package/dist/lib/esm/obsidian/setting-components/telephone-component.d.mts +2 -2
  558. package/dist/lib/esm/obsidian/setting-components/telephone-component.mjs +4 -4
  559. package/dist/lib/esm/obsidian/setting-components/text-based-component.d.mts +2 -2
  560. package/dist/lib/esm/obsidian/setting-components/text-based-component.mjs +6 -6
  561. package/dist/lib/esm/obsidian/setting-components/time-component.d.mts +2 -2
  562. package/dist/lib/esm/obsidian/setting-components/time-component.mjs +4 -4
  563. package/dist/lib/esm/obsidian/setting-components/tri-state-checkbox-component.d.mts +2 -2
  564. package/dist/lib/esm/obsidian/setting-components/tri-state-checkbox-component.mjs +5 -5
  565. package/dist/lib/esm/obsidian/setting-components/typed-dropdown-component.d.mts +2 -2
  566. package/dist/lib/esm/obsidian/setting-components/typed-dropdown-component.mjs +6 -6
  567. package/dist/lib/esm/obsidian/setting-components/typed-multiple-dropdown-component.d.mts +2 -2
  568. package/dist/lib/esm/obsidian/setting-components/typed-multiple-dropdown-component.mjs +8 -8
  569. package/dist/lib/esm/obsidian/setting-components/typed-text-component.d.mts +4 -4
  570. package/dist/lib/esm/obsidian/setting-components/typed-text-component.mjs +6 -5
  571. package/dist/lib/esm/obsidian/setting-components/url-component.d.mts +2 -2
  572. package/dist/lib/esm/obsidian/setting-components/url-component.mjs +4 -4
  573. package/dist/lib/esm/obsidian/setting-components/validator-component.d.mts +2 -2
  574. package/dist/lib/esm/obsidian/setting-components/validator-component.mjs +35 -35
  575. package/dist/lib/esm/obsidian/setting-components/week-component.d.mts +2 -2
  576. package/dist/lib/esm/obsidian/setting-components/week-component.mjs +4 -4
  577. package/dist/lib/esm/obsidian/setting-ex.d.mts +42 -42
  578. package/dist/lib/esm/obsidian/setting-ex.mjs +66 -66
  579. package/dist/lib/esm/obsidian/setting-group-ex.d.mts +2 -2
  580. package/dist/lib/esm/obsidian/setting-group-ex.mjs +4 -4
  581. package/dist/lib/esm/obsidian/vault-delete.d.mts +16 -2
  582. package/dist/lib/esm/obsidian/vault-delete.mjs +12 -6
  583. package/dist/lib/esm/obsidian/vault-transaction.mjs +8 -4
  584. package/dist/lib/esm/obsidian/vault.d.mts +32 -11
  585. package/dist/lib/esm/obsidian/vault.mjs +67 -47
  586. package/dist/lib/esm/obsidian/view-registrar.mjs +1 -1
  587. package/dist/lib/esm/obsidian/workspace.mjs +2 -2
  588. package/dist/lib/esm/path.d.mts +1 -1
  589. package/dist/lib/esm/path.mjs +7 -7
  590. package/dist/lib/esm/reg-exp.d.mts +4 -4
  591. package/dist/lib/esm/reg-exp.mjs +28 -21
  592. package/dist/lib/esm/script-utils/build.d.mts +1 -1
  593. package/dist/lib/esm/script-utils/build.mjs +15 -12
  594. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/change-extension-plugin.mjs +14 -14
  595. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.mjs +26 -20
  596. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/dependency.mjs +10 -10
  597. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/fix-esm-plugin.mjs +3 -3
  598. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/fix-source-maps-plugin.mjs +6 -6
  599. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.d.mts +6 -2
  600. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.mjs +1 -1
  601. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/preprocess-plugin.mjs +20 -20
  602. package/dist/lib/esm/script-utils/check-project-types.d.mts +12 -4
  603. package/dist/lib/esm/script-utils/check-project-types.mjs +3 -3
  604. package/dist/lib/esm/script-utils/cli-utils.d.mts +6 -6
  605. package/dist/lib/esm/script-utils/cli-utils.mjs +29 -33
  606. package/dist/lib/esm/script-utils/demo-vault-coverage.mjs +12 -9
  607. package/dist/lib/esm/script-utils/env-toggle.mjs +3 -3
  608. package/dist/lib/esm/script-utils/exec.d.mts +4 -4
  609. package/dist/lib/esm/script-utils/exec.mjs +32 -32
  610. package/dist/lib/esm/script-utils/formatters/dprint.mjs +2 -2
  611. package/dist/lib/esm/script-utils/fs.mjs +3 -3
  612. package/dist/lib/esm/script-utils/json.d.mts +2 -2
  613. package/dist/lib/esm/script-utils/json.mjs +5 -5
  614. package/dist/lib/esm/script-utils/linters/cspell.mjs +2 -2
  615. package/dist/lib/esm/script-utils/linters/eslint-config.mjs +392 -2
  616. package/dist/lib/esm/script-utils/linters/eslint-rules/no-async-callback-to-unsafe-return.d.mts +3 -1
  617. package/dist/lib/esm/script-utils/linters/eslint-rules/no-async-callback-to-unsafe-return.mjs +17 -17
  618. package/dist/lib/esm/script-utils/linters/eslint-rules/no-unused-params-members.d.mts +3 -1
  619. package/dist/lib/esm/script-utils/linters/eslint-rules/no-unused-params-members.mjs +17 -17
  620. package/dist/lib/esm/script-utils/linters/eslint-rules/no-used-underscore-variables.d.mts +3 -1
  621. package/dist/lib/esm/script-utils/linters/eslint-rules/no-used-underscore-variables.mjs +11 -11
  622. package/dist/lib/esm/script-utils/linters/eslint-rules/params-options-name-match.d.mts +3 -1
  623. package/dist/lib/esm/script-utils/linters/eslint-rules/params-options-name-match.mjs +99 -99
  624. package/dist/lib/esm/script-utils/linters/eslint-rules/prefer-noop-async.d.mts +3 -1
  625. package/dist/lib/esm/script-utils/linters/eslint-rules/prefer-noop-async.mjs +3 -3
  626. package/dist/lib/esm/script-utils/linters/eslint-rules/readonly-params-options-result-members.d.mts +3 -1
  627. package/dist/lib/esm/script-utils/linters/eslint-rules/readonly-params-options-result-members.mjs +11 -11
  628. package/dist/lib/esm/script-utils/linters/eslint-rules/require-component-suffix.d.mts +9 -3
  629. package/dist/lib/esm/script-utils/linters/eslint-rules/require-component-suffix.mjs +41 -41
  630. package/dist/lib/esm/script-utils/linters/eslint-rules/require-method-template.d.mts +6 -2
  631. package/dist/lib/esm/script-utils/linters/eslint-rules/require-method-template.mjs +15 -13
  632. package/dist/lib/esm/script-utils/linters/eslint-rules/require-super-call.d.mts +3 -1
  633. package/dist/lib/esm/script-utils/linters/eslint-rules/require-super-call.mjs +23 -23
  634. package/dist/lib/esm/script-utils/linters/eslint.mjs +4 -4
  635. package/dist/lib/esm/script-utils/linters/index.d.mts +1 -0
  636. package/dist/lib/esm/script-utils/linters/index.mjs +3 -1
  637. package/dist/lib/esm/script-utils/linters/markdownlint-cli2-config.d.mts +2 -2
  638. package/dist/lib/esm/script-utils/linters/markdownlint-cli2-config.mjs +8 -3
  639. package/dist/lib/esm/script-utils/linters/markdownlint-ignores.d.mts +35 -0
  640. package/dist/lib/esm/script-utils/linters/markdownlint-ignores.mjs +33 -0
  641. package/dist/lib/esm/script-utils/linters/markdownlint.mjs +13 -9
  642. package/dist/lib/esm/script-utils/linters/over-exposure.d.mts +54 -18
  643. package/dist/lib/esm/script-utils/linters/over-exposure.mjs +8 -8
  644. package/dist/lib/esm/script-utils/npm-run.d.mts +16 -2
  645. package/dist/lib/esm/script-utils/npm-run.mjs +9 -3
  646. package/dist/lib/esm/script-utils/npm.d.mts +11 -11
  647. package/dist/lib/esm/script-utils/npm.mjs +11 -11
  648. package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.d.mts +165 -55
  649. package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.mjs +1 -1
  650. package/dist/lib/esm/script-utils/test-runners/index.d.mts +1 -0
  651. package/dist/lib/esm/script-utils/test-runners/index.mjs +4 -2
  652. package/dist/lib/esm/script-utils/test-runners/vitest-config.d.mts +118 -0
  653. package/dist/lib/esm/script-utils/test-runners/vitest-config.mjs +210 -0
  654. package/dist/lib/esm/script-utils/validate-declarations.mjs +1 -1
  655. package/dist/lib/esm/script-utils/version.d.mts +21 -21
  656. package/dist/lib/esm/script-utils/version.mjs +48 -45
  657. package/dist/lib/esm/setup.d.mts +1 -1
  658. package/dist/lib/esm/setup.mjs +1 -1
  659. package/dist/lib/esm/strict-proxy.d.mts +2 -2
  660. package/dist/lib/esm/strict-proxy.mjs +20 -20
  661. package/dist/lib/esm/string.d.mts +60 -60
  662. package/dist/lib/esm/string.mjs +80 -79
  663. package/dist/lib/esm/transformers/map-transformer.mjs +2 -2
  664. package/dist/lib/esm/transformers/set-transformer.mjs +2 -2
  665. package/dist/lib/esm/transformers/two-way-map-transformer.mjs +2 -2
  666. package/dist/lib/esm/type-guards.d.mts +6 -6
  667. package/dist/lib/esm/type-guards.mjs +6 -6
  668. package/dist/lib/esm/type.d.mts +2 -2
  669. package/dist/lib/esm/type.mjs +3 -3
  670. package/dist/lib/esm/url.d.mts +4 -4
  671. package/dist/lib/esm/url.mjs +8 -8
  672. package/dist/lib/esm/value-provider.d.mts +6 -6
  673. package/dist/lib/esm/value-provider.mjs +5 -5
  674. package/dist/templates/scripts/vitest-config.ts +2 -88
  675. package/obsidian/components/notebook-navigator-menu-event-registrar-component/package.json +6 -0
  676. package/obsidian/notebook-navigator/package.json +6 -0
  677. package/package.json +17 -33
  678. package/script-utils/linters/markdownlint-ignores/package.json +6 -0
  679. package/script-utils/test-runners/vitest-config/package.json +6 -0
@@ -40,16 +40,11 @@ if you want to view the source, please visit the github repository of this plugi
40
40
  globalThisRecord[key] ??= newFuncs[key]?.();
41
41
  }
42
42
 
43
- function name(obj) {
44
- return obj;
45
- }
46
-
47
43
  function extractDefault(module) {
48
44
  return module && module.__esModule && 'default' in module ? module.default : module;
49
45
  }
50
46
 
51
- const OBSIDIAN_BUILT_IN_MODULE_NAMES = [
52
- 'obsidian',
47
+ const OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
53
48
  '@codemirror/autocomplete',
54
49
  '@codemirror/collab',
55
50
  '@codemirror/commands',
@@ -60,11 +55,12 @@ if you want to view the source, please visit the github repository of this plugi
60
55
  '@codemirror/text',
61
56
  '@codemirror/view',
62
57
  '@lezer/common',
58
+ '@lezer/highlight',
63
59
  '@lezer/lr',
64
- '@lezer/highlight'];
60
+ 'obsidian']
61
+ );
65
62
 
66
-
67
- const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = [
63
+ const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
68
64
  '@codemirror/closebrackets',
69
65
  '@codemirror/comment',
70
66
  '@codemirror/fold',
@@ -76,11 +72,11 @@ if you want to view the source, please visit the github repository of this plugi
76
72
  '@codemirror/rangeset',
77
73
  '@codemirror/rectangular-selection',
78
74
  '@codemirror/stream-parser',
79
- '@codemirror/tooltip'];
80
-
75
+ '@codemirror/tooltip']
76
+ );
81
77
 
82
78
  function requirePatched(id) {
83
- if (OBSIDIAN_BUILT_IN_MODULE_NAMES.includes(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.includes(id)) {
79
+ if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
84
80
  return originalRequire?.(id);
85
81
  }
86
82
 
@@ -89,8 +85,8 @@ if you want to view the source, please visit the github repository of this plugi
89
85
  if (id === 'process' || id === 'node:process') {
90
86
  // eslint-disable-next-line no-console -- Valid usage.
91
87
  console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
92
- // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
93
- return globalThis.process;
88
+
89
+ return process;
94
90
  }
95
91
  } else {
96
92
  const module = originalRequire?.(id);
@@ -146,7 +142,7 @@ var import_frontmatter_link_cache_with_offsets = require('./frontmatter-link-cac
146
142
  var import_frontmatter = require('./frontmatter.cjs');
147
143
  var import_reference = require('./reference.cjs');
148
144
  var import_vault = require('./vault.cjs');
149
- const ESCAPED_WIKILINK_DIVIDER = "\\|";
145
+ const ESCAPED_WIKILINK_DIVIDER = String.raw`\|`;
150
146
  const UNESCAPED_WIKILINK_DIVIDER_REGEXP = /(?<!\\)\|/g;
151
147
  async function applyContentChanges(params) {
152
148
  const {
@@ -163,7 +159,7 @@ async function applyContentChanges(params) {
163
159
  return null;
164
160
  }
165
161
  const { frontmatter, hasFrontmatterError } = parseFrontmatterSafely({ content, path });
166
- if (!validateChanges({ changes, content, frontmatter, path })) {
162
+ if (!areChangesValid({ changes, content, frontmatter, path })) {
167
163
  return shouldRetryOnInvalidChanges ? null : content;
168
164
  }
169
165
  changes = sortAndFilterChanges(changes);
@@ -294,7 +290,7 @@ async function applyCanvasChanges(params) {
294
290
  canvasTextChangesForNode.push(change);
295
291
  }
296
292
  }
297
- for (const [nodeIndex, canvasTextChangesForNode] of canvasTextChanges.entries()) {
293
+ for (const [nodeIndex, canvasTextChangesForNode] of canvasTextChanges) {
298
294
  const node = canvasData.nodes[nodeIndex];
299
295
  if (!node) {
300
296
  const message = "Node not found";
@@ -313,7 +309,7 @@ async function applyCanvasChanges(params) {
313
309
  return null;
314
310
  }
315
311
  const contentChanges = canvasTextChangesForNode.map((change) => {
316
- const newContent = change.reference.originalReference.original.includes(ESCAPED_WIKILINK_DIVIDER) ? change.newContent.replaceAll(UNESCAPED_WIKILINK_DIVIDER_REGEXP, ESCAPED_WIKILINK_DIVIDER) : change.newContent;
312
+ const newContent = change.reference.originalReference.original.includes(ESCAPED_WIKILINK_DIVIDER) ? change.newContent.replaceAll(UNESCAPED_WIKILINK_DIVIDER_REGEXP, () => ESCAPED_WIKILINK_DIVIDER) : change.newContent;
317
313
  return (0, import_reference.referenceToFileChange)(change.reference.originalReference, newContent);
318
314
  });
319
315
  node.text = await applyContentChanges({
@@ -389,7 +385,7 @@ async function applyFrontmatterChangesWithOffsets(params) {
389
385
  frontmatterChangesWithOffsetMap,
390
386
  path
391
387
  } = params;
392
- for (const [key, frontmatterChangesWithOffsets] of frontmatterChangesWithOffsetMap.entries()) {
388
+ for (const [key, frontmatterChangesWithOffsets] of frontmatterChangesWithOffsetMap) {
393
389
  const propertyValue = (0, import_object_utils.getNestedPropertyValue)(frontmatter, key);
394
390
  if (typeof propertyValue !== "string") {
395
391
  return;
@@ -424,71 +420,13 @@ async function applyFrontmatterChangesWithOffsets(params) {
424
420
  return;
425
421
  }
426
422
  (0, import_object_utils.setNestedPropertyValue)({
427
- obj: frontmatter,
423
+ $object: frontmatter,
428
424
  path: key,
429
425
  value: newPropertyValue
430
426
  });
431
427
  }
432
428
  }
433
- function buildFinalContent(params) {
434
- const {
435
- frontmatter,
436
- frontmatterChanged,
437
- newContent
438
- } = params;
439
- if (frontmatterChanged.size > 0) {
440
- return (0, import_frontmatter.setFrontmatter)(newContent, frontmatter);
441
- }
442
- return newContent;
443
- }
444
- function parseFrontmatterSafely(params) {
445
- const { content, path } = params;
446
- let frontmatter = {};
447
- let hasFrontmatterError = false;
448
- try {
449
- frontmatter = (0, import_frontmatter.parseFrontmatter)(content);
450
- } catch (error) {
451
- (0, import_error.printError)(new Error(`Frontmatter parsing failed in ${path}`, { cause: error }));
452
- hasFrontmatterError = true;
453
- }
454
- return { frontmatter, hasFrontmatterError };
455
- }
456
- function parseJsonSafe(content) {
457
- let parsed;
458
- try {
459
- parsed = JSON.parse(content);
460
- } catch {
461
- parsed = null;
462
- }
463
- if (parsed === null || typeof parsed !== "object") {
464
- parsed = {};
465
- }
466
- return parsed;
467
- }
468
- function sortAndFilterChanges(changes) {
469
- changes.sort((a, b) => {
470
- if (isContentChange(a) && isContentChange(b)) {
471
- return a.reference.position.start.offset - b.reference.position.start.offset;
472
- }
473
- if (isFrontmatterChangeWithOffsets(a) && isFrontmatterChangeWithOffsets(b)) {
474
- return a.reference.key.localeCompare(b.reference.key) || a.reference.startOffset - b.reference.startOffset;
475
- }
476
- if (isFrontmatterChange(a) && isFrontmatterChange(b)) {
477
- return a.reference.key.localeCompare(b.reference.key);
478
- }
479
- return isContentChange(a) ? -1 : 1;
480
- });
481
- return changes.filter((change, index) => {
482
- if (change.oldContent === change.newContent) {
483
- return false;
484
- }
485
- if (index === 0) {
486
- return true;
487
- }
488
- return !(0, import_object_utils.deepEqual)(change, changes[index - 1]);
489
- });
490
- }
491
- function validateChanges(params) {
429
+ function areChangesValid(params) {
492
430
  const {
493
431
  changes,
494
432
  content,
@@ -547,6 +485,64 @@ function validateChanges(params) {
547
485
  }
548
486
  return true;
549
487
  }
488
+ function buildFinalContent(params) {
489
+ const {
490
+ frontmatter,
491
+ frontmatterChanged,
492
+ newContent
493
+ } = params;
494
+ if (frontmatterChanged.size > 0) {
495
+ return (0, import_frontmatter.setFrontmatter)(newContent, frontmatter);
496
+ }
497
+ return newContent;
498
+ }
499
+ function parseFrontmatterSafely(params) {
500
+ const { content, path } = params;
501
+ let frontmatter = {};
502
+ let hasFrontmatterError = false;
503
+ try {
504
+ frontmatter = (0, import_frontmatter.parseFrontmatter)(content);
505
+ } catch (error) {
506
+ (0, import_error.printError)(new Error(`Frontmatter parsing failed in ${path}`, { cause: error }));
507
+ hasFrontmatterError = true;
508
+ }
509
+ return { frontmatter, hasFrontmatterError };
510
+ }
511
+ function parseJsonSafe(content) {
512
+ let parsed;
513
+ try {
514
+ parsed = JSON.parse(content);
515
+ } catch {
516
+ parsed = null;
517
+ }
518
+ if (parsed === null || typeof parsed !== "object") {
519
+ parsed = {};
520
+ }
521
+ return parsed;
522
+ }
523
+ function sortAndFilterChanges(changes) {
524
+ changes.sort((a, b) => {
525
+ if (isContentChange(a) && isContentChange(b)) {
526
+ return a.reference.position.start.offset - b.reference.position.start.offset;
527
+ }
528
+ if (isFrontmatterChangeWithOffsets(a) && isFrontmatterChangeWithOffsets(b)) {
529
+ return a.reference.key.localeCompare(b.reference.key) || a.reference.startOffset - b.reference.startOffset;
530
+ }
531
+ if (isFrontmatterChange(a) && isFrontmatterChange(b)) {
532
+ return a.reference.key.localeCompare(b.reference.key);
533
+ }
534
+ return isContentChange(a) ? -1 : 1;
535
+ });
536
+ return changes.filter((change, index) => {
537
+ if (change.oldContent === change.newContent) {
538
+ return false;
539
+ }
540
+ if (index === 0) {
541
+ return true;
542
+ }
543
+ return !(0, import_object_utils.isDeepEqual)(change, changes[index - 1]);
544
+ });
545
+ }
550
546
  // Annotate the CommonJS export names for ESM import in node:
551
547
  0 && (module.exports = {
552
548
  applyContentChanges,
@@ -559,4 +555,4 @@ function validateChanges(params) {
559
555
  isFrontmatterChangeWithOffsets,
560
556
  toFrontmatterChangeWithOffsets
561
557
  });
562
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2ZpbGUtY2hhbmdlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29udGFpbnMgdXRpbGl0eSB0eXBlcyBhbmQgZnVuY3Rpb25zIGZvciBoYW5kbGluZyBmaWxlIGNoYW5nZXMgaW4gT2JzaWRpYW4uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIEZyb250bWF0dGVyTGlua0NhY2hlLFxuICBSZWZlcmVuY2UsXG4gIFJlZmVyZW5jZUNhY2hlXG59IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgQ2FudmFzRGF0YSB9IGZyb20gJ29ic2lkaWFuL2NhbnZhcy5kLnRzJztcblxuaW1wb3J0IHtcbiAgaXNGcm9udG1hdHRlckxpbmtDYWNoZSxcbiAgaXNSZWZlcmVuY2VDYWNoZVxufSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0L2ltcGxlbWVudGF0aW9ucyc7XG5cbmltcG9ydCB0eXBlIHsgR2VuZXJpY09iamVjdCB9IGZyb20gJy4uL3R5cGUtZ3VhcmRzLnRzJztcbmltcG9ydCB0eXBlIHsgVmFsdWVQcm92aWRlciB9IGZyb20gJy4uL3ZhbHVlLXByb3ZpZGVyLnRzJztcbmltcG9ydCB0eXBlIHsgUGF0aE9yRmlsZSB9IGZyb20gJy4vZmlsZS1zeXN0ZW0udHMnO1xuaW1wb3J0IHR5cGUgeyBGcm9udG1hdHRlckxpbmtDYWNoZVdpdGhPZmZzZXRzIH0gZnJvbSAnLi9mcm9udG1hdHRlci1saW5rLWNhY2hlLXdpdGgtb2Zmc2V0cy50cyc7XG5pbXBvcnQgdHlwZSB7IENvbWJpbmVkRnJvbnRtYXR0ZXIgfSBmcm9tICcuL2Zyb250bWF0dGVyLnRzJztcbmltcG9ydCB0eXBlIHtcbiAgQ2FudmFzRmlsZU5vZGVSZWZlcmVuY2UsXG4gIENhbnZhc1JlZmVyZW5jZSxcbiAgQ2FudmFzVGV4dE5vZGVSZWZlcmVuY2Vcbn0gZnJvbSAnLi9yZWZlcmVuY2UudHMnO1xuaW1wb3J0IHR5cGUge1xuICBDb250ZW50QXJncyxcbiAgUHJvY2Vzc09wdGlvbnMsXG4gIFByb2Nlc3NQYXJhbXNcbn0gZnJvbSAnLi92YXVsdC50cyc7XG5cbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnLi4vZGVidWcudHMnO1xuaW1wb3J0IHsgcHJpbnRFcnJvciB9IGZyb20gJy4uL2Vycm9yLnRzJztcbmltcG9ydCB7XG4gIGRlZXBFcXVhbCxcbiAgZ2V0TmVzdGVkUHJvcGVydHlWYWx1ZSxcbiAgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzLFxuICBzZXROZXN0ZWRQcm9wZXJ0eVZhbHVlXG59IGZyb20gJy4uL29iamVjdC11dGlscy50cyc7XG5pbXBvcnQgeyByZXNvbHZlVmFsdWUgfSBmcm9tICcuLi92YWx1ZS1wcm92aWRlci50cyc7XG5pbXBvcnQge1xuICBnZXRQYXRoLFxuICBpc0NhbnZhc0ZpbGVcbn0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQge1xuICBpc0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHMsXG4gIHRvRnJvbnRtYXR0ZXJMaW5rQ2FjaGVXaXRoT2Zmc2V0c1xufSBmcm9tICcuL2Zyb250bWF0dGVyLWxpbmstY2FjaGUtd2l0aC1vZmZzZXRzLnRzJztcbmltcG9ydCB7XG4gIHBhcnNlRnJvbnRtYXR0ZXIsXG4gIHNldEZyb250bWF0dGVyXG59IGZyb20gJy4vZnJvbnRtYXR0ZXIudHMnO1xuaW1wb3J0IHtcbiAgaXNDYW52YXNSZWZlcmVuY2UsXG4gIHJlZmVyZW5jZVRvRmlsZUNoYW5nZVxufSBmcm9tICcuL3JlZmVyZW5jZS50cyc7XG5pbXBvcnQgeyBwcm9jZXNzIH0gZnJvbSAnLi92YXVsdC50cyc7XG5cbmNvbnN0IEVTQ0FQRURfV0lLSUxJTktfRElWSURFUiA9ICdcXFxcfCc7XG5jb25zdCBVTkVTQ0FQRURfV0lLSUxJTktfRElWSURFUl9SRUdFWFAgPSAvKD88IVxcXFwpXFx8L2c7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGFwcGx5Q29udGVudENoYW5nZXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcGx5Q29udGVudENoYW5nZXNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFib3J0IHNpZ25hbCB0byBjb250cm9sIHRoZSBleGVjdXRpb24gb2YgdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuXG4gIC8qKlxuICAgKiBBIHByb3ZpZGVyIHRoYXQgcmV0dXJucyBhbiBhcnJheSBvZiBjb250ZW50IGNoYW5nZXMgdG8gYXBwbHkuXG4gICAqL1xuICByZWFkb25seSBjaGFuZ2VzUHJvdmlkZXI6IFZhbHVlUHJvdmlkZXI8RmlsZUNoYW5nZVtdIHwgbnVsbCwgQ29udGVudEFyZ3M+O1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGVudCB0byB3aGljaCB0aGUgY2hhbmdlcyBzaG91bGQgYmUgYXBwbGllZC5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gd2hpY2ggdGhlIGNoYW5nZXMgc2hvdWxkIGJlIGFwcGxpZWQuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmV0cnkgdGhlIG9wZXJhdGlvbiBpZiB0aGUgY2hhbmdlcyBhcmUgaW52YWxpZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRSZXRyeU9uSW52YWxpZENoYW5nZXM/OiBib29sZWFuO1xufVxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgYXBwbHlGaWxlQ2hhbmdlc30uXG4gKi9cbmV4cG9ydCB0eXBlIEFwcGx5RmlsZUNoYW5nZXNPcHRpb25zID0gUHJvY2Vzc09wdGlvbnM7XG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBhcHBseUZpbGVDaGFuZ2VzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcHBseUZpbGVDaGFuZ2VzUGFyYW1zIGV4dGVuZHMgQXBwbHlGaWxlQ2hhbmdlc09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlIHdoZXJlIHRoZSBmaWxlIGNoYW5nZXMgd2lsbCBiZSBhcHBsaWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgcHJvdmlkZXIgdGhhdCByZXR1cm5zIGFuIGFycmF5IG9mIGZpbGUgY2hhbmdlcyB0byBhcHBseS5cbiAgICovXG4gIHJlYWRvbmx5IGNoYW5nZXNQcm92aWRlcjogVmFsdWVQcm92aWRlcjxGaWxlQ2hhbmdlW10gfCBudWxsLCBDb250ZW50QXJncz47XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgdG8gd2hpY2ggdGhlIGNoYW5nZXMgc2hvdWxkIGJlIGFwcGxpZWQuXG4gICAqL1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJldHJ5IHRoZSBvcGVyYXRpb24gaWYgdGhlIGNoYW5nZXMgYXJlIGludmFsaWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUmV0cnlPbkludmFsaWRDaGFuZ2VzPzogYm9vbGVhbjtcbn1cbi8qKlxuICogQSBmaWxlIGNoYW5nZSBpbiB0aGUgdmF1bHQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZUNoYW5nZSB7XG4gIC8qKlxuICAgKiBBIG5ldyBjb250ZW50IHRvIHJlcGxhY2UgdGhlIG9sZCBjb250ZW50LlxuICAgKi9cbiAgbmV3Q29udGVudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgY29udGVudCB0aGF0IHdpbGwgYmUgcmVwbGFjZWQuXG4gICAqL1xuICBvbGRDb250ZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgcmVmZXJlbmNlIHRoYXQgY2F1c2VkIHRoZSBjaGFuZ2UuXG4gICAqL1xuICByZWZlcmVuY2U6IFJlZmVyZW5jZTtcbn1cbmludGVyZmFjZSBBcHBseUNhbnZhc0NoYW5nZXNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFib3J0IHNpZ25hbCB0byBjb250cm9sIHRoZSBleGVjdXRpb24gb2YgdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuXG4gIC8qKlxuICAgKiBBIHByb3ZpZGVyIHRoYXQgcmV0dXJucyBhbiBhcnJheSBvZiBmaWxlIGNoYW5nZXMgdG8gYXBwbHkuXG4gICAqL1xuICByZWFkb25seSBjaGFuZ2VzUHJvdmlkZXI6IFZhbHVlUHJvdmlkZXI8RmlsZUNoYW5nZVtdIHwgbnVsbCwgQ29udGVudEFyZ3M+O1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGVudCB0byB3aGljaCB0aGUgY2hhbmdlcyBzaG91bGQgYmUgYXBwbGllZC5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gd2hpY2ggdGhlIGNoYW5nZXMgc2hvdWxkIGJlIGFwcGxpZWQuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmV0cnkgdGhlIG9wZXJhdGlvbiBpZiB0aGUgY2hhbmdlcyBhcmUgaW52YWxpZC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFJldHJ5T25JbnZhbGlkQ2hhbmdlcz86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBBcHBseUNvbnRlbnRDaGFuZ2VzVG9UZXh0UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IGNoYW5nZXMgdG8gYXBwbHkuXG4gICAqL1xuICByZWFkb25seSBjaGFuZ2VzOiBGaWxlQ2hhbmdlW107XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IHRvIHdoaWNoIHRoZSBjaGFuZ2VzIHNob3VsZCBiZSBhcHBsaWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHBhcnNpbmcgdGhlIGZyb250bWF0dGVyIGZhaWxlZC5cbiAgICovXG4gIHJlYWRvbmx5IGhhc0Zyb250bWF0dGVyRXJyb3I6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIHdoaWNoIHRoZSBjaGFuZ2VzIHNob3VsZCBiZSBhcHBsaWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQXBwbHlDb250ZW50Q2hhbmdlc1RvVGV4dFJlc3VsdCB7XG4gIHJlYWRvbmx5IGZyb250bWF0dGVyQ2hhbmdlZDogTWFwPHN0cmluZywgRnJvbnRtYXR0ZXJDaGFuZ2VXaXRoT2Zmc2V0c1tdPjtcbiAgcmVhZG9ubHkgbmV3Q29udGVudDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQXBwbHlGcm9udG1hdHRlckNoYW5nZXNXaXRoT2Zmc2V0c1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYWJvcnQgc2lnbmFsIHRvIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG5cbiAgLyoqXG4gICAqIFRoZSBmcm9udG1hdHRlciB0byB3aGljaCB0aGUgY2hhbmdlcyBzaG91bGQgYmUgYXBwbGllZC5cbiAgICovXG4gIHJlYWRvbmx5IGZyb250bWF0dGVyOiBDb21iaW5lZEZyb250bWF0dGVyPHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBBIG1hcCBvZiBmcm9udG1hdHRlciBrZXlzIHRvIHRoZSBmcm9udG1hdHRlciBjaGFuZ2VzIHdpdGggb2Zmc2V0cyB0byBhcHBseS5cbiAgICovXG4gIHJlYWRvbmx5IGZyb250bWF0dGVyQ2hhbmdlc1dpdGhPZmZzZXRNYXA6IE1hcDxzdHJpbmcsIEZyb250bWF0dGVyQ2hhbmdlV2l0aE9mZnNldHNbXT47XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIHdoaWNoIHRoZSBjaGFuZ2VzIHNob3VsZCBiZSBhcHBsaWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQnVpbGRGaW5hbENvbnRlbnRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGZyb250bWF0dGVyIHRvIHdyaXRlIGludG8gdGhlIGZpbmFsIGNvbnRlbnQuXG4gICAqL1xuICByZWFkb25seSBmcm9udG1hdHRlcjogQ29tYmluZWRGcm9udG1hdHRlcjx1bmtub3duPjtcblxuICAvKipcbiAgICogQSBtYXAgb2YgZnJvbnRtYXR0ZXIga2V5cyB0byB0aGUgZnJvbnRtYXR0ZXIgY2hhbmdlcyB3aXRoIG9mZnNldHMgdGhhdCB3ZXJlIGFwcGxpZWQuXG4gICAqL1xuICByZWFkb25seSBmcm9udG1hdHRlckNoYW5nZWQ6IE1hcDxzdHJpbmcsIEZyb250bWF0dGVyQ2hhbmdlV2l0aE9mZnNldHNbXT47XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IHRvIHdoaWNoIHRoZSBmcm9udG1hdHRlciBzaG91bGQgYmUgYXBwbGllZC5cbiAgICovXG4gIHJlYWRvbmx5IG5ld0NvbnRlbnQ6IHN0cmluZztcbn1cblxudHlwZSBDYW52YXNDaGFuZ2UgPSBGaWxlQ2hhbmdlICYgV2l0aFJlZmVyZW5jZTxDYW52YXNSZWZlcmVuY2U+O1xudHlwZSBDYW52YXNGaWxlTm9kZUNoYW5nZSA9IEZpbGVDaGFuZ2UgJiBXaXRoUmVmZXJlbmNlPENhbnZhc0ZpbGVOb2RlUmVmZXJlbmNlPjtcbnR5cGUgQ2FudmFzVGV4dE5vZGVDaGFuZ2UgPSBGaWxlQ2hhbmdlICYgV2l0aFJlZmVyZW5jZTxDYW52YXNUZXh0Tm9kZVJlZmVyZW5jZT47XG50eXBlIENvbnRlbnRDaGFuZ2UgPSBGaWxlQ2hhbmdlICYgV2l0aFJlZmVyZW5jZTxSZWZlcmVuY2VDYWNoZT47XG50eXBlIEZyb250bWF0dGVyQ2hhbmdlID0gRmlsZUNoYW5nZSAmIFdpdGhSZWZlcmVuY2U8RnJvbnRtYXR0ZXJMaW5rQ2FjaGU+O1xuXG50eXBlIEZyb250bWF0dGVyQ2hhbmdlV2l0aE9mZnNldHMgPSBGaWxlQ2hhbmdlICYgV2l0aFJlZmVyZW5jZTxGcm9udG1hdHRlckxpbmtDYWNoZVdpdGhPZmZzZXRzPjtcblxuaW50ZXJmYWNlIFBhcnNlRnJvbnRtYXR0ZXJTYWZlbHlQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNvbnRlbnQgdG8gcGFyc2UgdGhlIGZyb250bWF0dGVyIGZyb20uXG4gICAqL1xuICByZWFkb25seSBjb250ZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRoZSBjb250ZW50IGJlbG9uZ3MgdG8uXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBQYXJzZUZyb250bWF0dGVyU2FmZWx5UmVzdWx0IHtcbiAgcmVhZG9ubHkgZnJvbnRtYXR0ZXI6IENvbWJpbmVkRnJvbnRtYXR0ZXI8dW5rbm93bj47XG4gIHJlYWRvbmx5IGhhc0Zyb250bWF0dGVyRXJyb3I6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBWYWxpZGF0ZUNoYW5nZXNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNvbnRlbnQgY2hhbmdlcyB0byB2YWxpZGF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGNoYW5nZXM6IEZpbGVDaGFuZ2VbXTtcblxuICAvKipcbiAgICogVGhlIGNvbnRlbnQgdGhlIGNoYW5nZXMgc2hvdWxkIGJlIHZhbGlkYXRlZCBhZ2FpbnN0LlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZnJvbnRtYXR0ZXIgdGhlIGNoYW5nZXMgc2hvdWxkIGJlIHZhbGlkYXRlZCBhZ2FpbnN0LlxuICAgKi9cbiAgcmVhZG9ubHkgZnJvbnRtYXR0ZXI6IENvbWJpbmVkRnJvbnRtYXR0ZXI8dW5rbm93bj47XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRoZSBjaGFuZ2VzIHNob3VsZCBiZSB2YWxpZGF0ZWQgYWdhaW5zdC5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFdpdGhSZWZlcmVuY2U8UiBleHRlbmRzIFJlZmVyZW5jZT4ge1xuICByZWZlcmVuY2U6IFI7XG59XG5cbi8qKlxuICogQXBwbGllcyBhIHNlcmllcyBvZiBjb250ZW50IGNoYW5nZXMgdG8gdGhlIHNwZWNpZmllZCBjb250ZW50LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgYXBwbHlpbmcgdGhlIGNvbnRlbnQgY2hhbmdlcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHVwZGF0ZWQgY29udGVudCBvciB0byBgbnVsbGAgaWYgdXBkYXRlIGRpZG4ndCBzdWNjZWVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXBwbHlDb250ZW50Q2hhbmdlcyhwYXJhbXM6IEFwcGx5Q29udGVudENoYW5nZXNQYXJhbXMpOiBQcm9taXNlPG51bGwgfCBzdHJpbmc+IHtcbiAgY29uc3Qge1xuICAgIGFib3J0U2lnbmFsLFxuICAgIGNoYW5nZXNQcm92aWRlcixcbiAgICBjb250ZW50LFxuICAgIHBhdGgsXG4gICAgc2hvdWxkUmV0cnlPbkludmFsaWRDaGFuZ2VzID0gdHJ1ZVxuICB9ID0gcGFyYW1zO1xuICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICBsZXQgY2hhbmdlcyA9IGF3YWl0IHJlc29sdmVWYWx1ZShjaGFuZ2VzUHJvdmlkZXIsIHsgYWJvcnRTaWduYWwsIGNvbnRlbnQgfSk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gIGlmIChjaGFuZ2VzID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCB7IGZyb250bWF0dGVyLCBoYXNGcm9udG1hdHRlckVycm9yIH0gPSBwYXJzZUZyb250bWF0dGVyU2FmZWx5KHsgY29udGVudCwgcGF0aCB9KTtcblxuICBpZiAoIXZhbGlkYXRlQ2hhbmdlcyh7IGNoYW5nZXMsIGNvbnRlbnQsIGZyb250bWF0dGVyLCBwYXRoIH0pKSB7XG4gICAgcmV0dXJuIHNob3VsZFJldHJ5T25JbnZhbGlkQ2hhbmdlcyA/IG51bGwgOiBjb250ZW50O1xuICB9XG5cbiAgY2hhbmdlcyA9IHNvcnRBbmRGaWx0ZXJDaGFuZ2VzKGNoYW5nZXMpO1xuXG4gIGNvbnN0IHsgZnJvbnRtYXR0ZXJDaGFuZ2VkLCBuZXdDb250ZW50IH0gPSBhcHBseUNvbnRlbnRDaGFuZ2VzVG9UZXh0KHsgY2hhbmdlcywgY29udGVudCwgaGFzRnJvbnRtYXR0ZXJFcnJvciwgcGF0aCB9KTtcblxuICBhd2FpdCBhcHBseUZyb250bWF0dGVyQ2hhbmdlc1dpdGhPZmZzZXRzKHtcbiAgICBhYm9ydFNpZ25hbCxcbiAgICBmcm9udG1hdHRlcixcbiAgICBmcm9udG1hdHRlckNoYW5nZXNXaXRoT2Zmc2V0TWFwOiBmcm9udG1hdHRlckNoYW5nZWQsXG4gICAgcGF0aFxuICB9KTtcbiAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICByZXR1cm4gYnVpbGRGaW5hbENvbnRlbnQoeyBmcm9udG1hdHRlciwgZnJvbnRtYXR0ZXJDaGFuZ2VkLCBuZXdDb250ZW50IH0pO1xufVxuXG4vKipcbiAqIEFwcGxpZXMgYSBzZXJpZXMgb2YgZmlsZSBjaGFuZ2VzIHRvIHRoZSBzcGVjaWZpZWQgZmlsZSBvciBwYXRoIHdpdGhpbiB0aGUgYXBwbGljYXRpb24uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBhcHBseWluZyB0aGUgZmlsZSBjaGFuZ2VzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBmaWxlIGNoYW5nZXMgaGF2ZSBiZWVuIHN1Y2Nlc3NmdWxseSBhcHBsaWVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXBwbHlGaWxlQ2hhbmdlcyhwYXJhbXM6IEFwcGx5RmlsZUNoYW5nZXNQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBjaGFuZ2VzUHJvdmlkZXIsXG4gICAgcGF0aE9yRmlsZSxcbiAgICBzaG91bGRSZXRyeU9uSW52YWxpZENoYW5nZXMgPSB0cnVlLFxuICAgIC4uLm9wdGlvbnNcbiAgfSA9IHBhcmFtcztcbiAgYXdhaXQgcHJvY2Vzcyhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8UHJvY2Vzc1BhcmFtcz4oe1xuICAgIGFwcCxcbiAgICBhc3luYyBuZXdDb250ZW50UHJvdmlkZXIoeyBhYm9ydFNpZ25hbCwgY29udGVudCB9KSB7XG4gICAgICBpZiAoaXNDYW52YXNGaWxlKHBhdGhPckZpbGUpKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBhcHBseUNhbnZhc0NoYW5nZXMoe1xuICAgICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICAgIGNoYW5nZXNQcm92aWRlcixcbiAgICAgICAgICBjb250ZW50LFxuICAgICAgICAgIHBhdGg6IGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKSxcbiAgICAgICAgICBzaG91bGRSZXRyeU9uSW52YWxpZENoYW5nZXNcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCBhcHBseUNvbnRlbnRDaGFuZ2VzKHtcbiAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgIGNoYW5nZXNQcm92aWRlcixcbiAgICAgICAgY29udGVudCxcbiAgICAgICAgcGF0aDogZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpLFxuICAgICAgICBzaG91bGRSZXRyeU9uSW52YWxpZENoYW5nZXNcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgcGF0aE9yRmlsZSxcbiAgICAuLi5vcHRpb25zXG4gIH0pKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBmaWxlIGNoYW5nZSBpcyBhIGNhbnZhcyBjaGFuZ2UuXG4gKlxuICogQHBhcmFtIGNoYW5nZSAtIFRoZSBmaWxlIGNoYW5nZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGZpbGUgY2hhbmdlIGlzIGEgY2FudmFzIGNoYW5nZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2FudmFzQ2hhbmdlKGNoYW5nZTogRmlsZUNoYW5nZSk6IGNoYW5nZSBpcyBDYW52YXNDaGFuZ2Uge1xuICByZXR1cm4gaXNDYW52YXNSZWZlcmVuY2UoY2hhbmdlLnJlZmVyZW5jZSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgZmlsZSBjaGFuZ2UgaXMgYSBjYW52YXMgZmlsZSBub2RlIGNoYW5nZS5cbiAqXG4gKiBAcGFyYW0gY2hhbmdlIC0gVGhlIGZpbGUgY2hhbmdlIHRvIGNoZWNrLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgZmlsZSBjaGFuZ2UgaXMgYSBjYW52YXMgZmlsZSBub2RlIGNoYW5nZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2FudmFzRmlsZU5vZGVDaGFuZ2UoY2hhbmdlOiBGaWxlQ2hhbmdlKTogY2hhbmdlIGlzIENhbnZhc0ZpbGVOb2RlQ2hhbmdlIHtcbiAgcmV0dXJuIGlzQ2FudmFzQ2hhbmdlKGNoYW5nZSkgJiYgY2hhbmdlLnJlZmVyZW5jZS50eXBlID09PSAnZmlsZSc7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgZmlsZSBjaGFuZ2UgaXMgYSBjYW52YXMgdGV4dCBub2RlIGNoYW5nZS5cbiAqXG4gKiBAcGFyYW0gY2hhbmdlIC0gVGhlIGZpbGUgY2hhbmdlIHRvIGNoZWNrLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgZmlsZSBjaGFuZ2UgaXMgYSBjYW52YXMgdGV4dCBub2RlIGNoYW5nZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2FudmFzVGV4dE5vZGVDaGFuZ2UoY2hhbmdlOiBGaWxlQ2hhbmdlKTogY2hhbmdlIGlzIENhbnZhc1RleHROb2RlQ2hhbmdlIHtcbiAgcmV0dXJuIGlzQ2FudmFzQ2hhbmdlKGNoYW5nZSkgJiYgY2hhbmdlLnJlZmVyZW5jZS50eXBlID09PSAndGV4dCc7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgZmlsZSBjaGFuZ2UgaXMgYSBjb250ZW50IGNoYW5nZS5cbiAqXG4gKiBAcGFyYW0gZmlsZUNoYW5nZSAtIFRoZSBmaWxlIGNoYW5nZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGZpbGUgY2hhbmdlIGlzIGEgY29udGVudCBjaGFuZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbnRlbnRDaGFuZ2UoZmlsZUNoYW5nZTogRmlsZUNoYW5nZSk6IGZpbGVDaGFuZ2UgaXMgQ29udGVudENoYW5nZSB7XG4gIHJldHVybiBpc1JlZmVyZW5jZUNhY2hlKGZpbGVDaGFuZ2UucmVmZXJlbmNlKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBmaWxlIGNoYW5nZSBpcyBhIGZyb250bWF0dGVyIGNoYW5nZS5cbiAqXG4gKiBAcGFyYW0gZmlsZUNoYW5nZSAtIFRoZSBmaWxlIGNoYW5nZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGZpbGUgY2hhbmdlIGlzIGEgZnJvbnRtYXR0ZXIgY2hhbmdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNGcm9udG1hdHRlckNoYW5nZShmaWxlQ2hhbmdlOiBGaWxlQ2hhbmdlKTogZmlsZUNoYW5nZSBpcyBGcm9udG1hdHRlckNoYW5nZSB7XG4gIHJldHVybiBpc0Zyb250bWF0dGVyTGlua0NhY2hlKGZpbGVDaGFuZ2UucmVmZXJlbmNlKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBmaWxlIGNoYW5nZSBpcyBhIGZyb250bWF0dGVyIGNoYW5nZSB3aXRoIG9mZnNldHMuXG4gKlxuICogQHBhcmFtIGZpbGVDaGFuZ2UgLSBUaGUgZmlsZSBjaGFuZ2UgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBmaWxlIGNoYW5nZSBpcyBhIGZyb250bWF0dGVyIGNoYW5nZSB3aXRoIG9mZnNldHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Zyb250bWF0dGVyQ2hhbmdlV2l0aE9mZnNldHMoZmlsZUNoYW5nZTogRmlsZUNoYW5nZSk6IGZpbGVDaGFuZ2UgaXMgRnJvbnRtYXR0ZXJDaGFuZ2VXaXRoT2Zmc2V0cyB7XG4gIHJldHVybiBpc0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHMoZmlsZUNoYW5nZS5yZWZlcmVuY2UpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgZnJvbnRtYXR0ZXIgY2hhbmdlIHRvIGEgZnJvbnRtYXR0ZXIgY2hhbmdlIHdpdGggb2Zmc2V0cy5cbiAqXG4gKiBAcGFyYW0gZmlsZUNoYW5nZSAtIFRoZSBmaWxlIGNoYW5nZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMgVGhlIGNvbnZlcnRlZCBmaWxlIGNoYW5nZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvRnJvbnRtYXR0ZXJDaGFuZ2VXaXRoT2Zmc2V0cyhmaWxlQ2hhbmdlOiBGcm9udG1hdHRlckNoYW5nZSk6IEZyb250bWF0dGVyQ2hhbmdlV2l0aE9mZnNldHMge1xuICBpZiAoaXNGcm9udG1hdHRlckNoYW5nZVdpdGhPZmZzZXRzKGZpbGVDaGFuZ2UpKSB7XG4gICAgcmV0dXJuIGZpbGVDaGFuZ2U7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLmZpbGVDaGFuZ2UsXG4gICAgcmVmZXJlbmNlOiB0b0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHMoZmlsZUNoYW5nZS5yZWZlcmVuY2UpXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFwcGx5Q2FudmFzQ2hhbmdlcyhwYXJhbXM6IEFwcGx5Q2FudmFzQ2hhbmdlc1BhcmFtcyk6IFByb21pc2U8bnVsbCB8IHN0cmluZz4ge1xuICBjb25zdCB7XG4gICAgYWJvcnRTaWduYWwsXG4gICAgY2hhbmdlc1Byb3ZpZGVyLFxuICAgIGNvbnRlbnQsXG4gICAgcGF0aCxcbiAgICBzaG91bGRSZXRyeU9uSW52YWxpZENoYW5nZXMgPSB0cnVlXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGNoYW5nZXMgPSBhd2FpdCByZXNvbHZlVmFsdWUoY2hhbmdlc1Byb3ZpZGVyLCB7IGFib3J0U2lnbmFsLCBjb250ZW50IH0pO1xuICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICBpZiAoY2hhbmdlcyA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgY2FudmFzRGF0YSA9IHBhcnNlSnNvblNhZmUoY29udGVudCkgYXMgR2VuZXJpY09iamVjdDxDYW52YXNEYXRhPjtcblxuICAvLyBUaGUgY29udGVudCBpcyBub3QgYSB2YWxpZCBjYW52YXMgKGEgdHJhbnNpZW50IGB7fWAgb3IgcGFydGlhbCBvYmplY3QpLlxuICAvLyBUaGlzIGhhcHBlbnMgd2hlbiBhbm90aGVyIHBsdWdpbiBpcyBzdGlsbCBpbml0aWFsaXppbmcgdGhlIGZpbGUuXG4gIC8vIFNraXAgdGhlIHJld3JpdGUgc28gbm8gbWFsZm9ybWVkIG9iamVjdCBpcyB3cml0dGVuIGJhY2sgYW5kIHRoZSByZW5kZXJlciBuZXZlciBjcmFzaGVzLlxuICAvLyBNaXJyb3JzIHRoZSBgeyBlZGdlczogW10sIG5vZGVzOiBbXSB9YCBmYWxsYmFjayBpbiBgZ2V0Q2FudmFzUmVmZXJlbmNlc2AuXG4gIGlmICghQXJyYXkuaXNBcnJheShjYW52YXNEYXRhLm5vZGVzKSB8fCAhQXJyYXkuaXNBcnJheShjYW52YXNEYXRhLmVkZ2VzKSkge1xuICAgIGdldExpYkRlYnVnZ2VyKCdGaWxlQ2hhbmdlOmFwcGx5Q2FudmFzQ2hhbmdlcycpKCdOb3QgYSB2YWxpZCBjYW52YXM7IHNraXBwaW5nIHJld3JpdGUnLCB7IHBhdGggfSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBjYW52YXNUZXh0Q2hhbmdlcyA9IG5ldyBNYXA8bnVtYmVyLCBDYW52YXNUZXh0Tm9kZUNoYW5nZVtdPigpO1xuXG4gIGZvciAoY29uc3QgY2hhbmdlIG9mIGNoYW5nZXMpIHtcbiAgICBpZiAoIWlzQ2FudmFzQ2hhbmdlKGNoYW5nZSkpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnT25seSBjYW52YXMgY2hhbmdlcyBhcmUgc3VwcG9ydGVkIGZvciBjYW52YXMgZmlsZXMnO1xuICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlLCB7XG4gICAgICAgIGNoYW5nZSxcbiAgICAgICAgcGF0aFxuICAgICAgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBub2RlID0gY2FudmFzRGF0YS5ub2Rlc1tjaGFuZ2UucmVmZXJlbmNlLm5vZGVJbmRleF07XG4gICAgaWYgKCFub2RlKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gJ05vZGUgbm90IGZvdW5kJztcbiAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSwge1xuICAgICAgICBub2RlSW5kZXg6IGNoYW5nZS5yZWZlcmVuY2Uubm9kZUluZGV4LFxuICAgICAgICBwYXRoXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChpc0NhbnZhc0ZpbGVOb2RlQ2hhbmdlKGNoYW5nZSkpIHtcbiAgICAgIGlmIChub2RlLmZpbGUgIT09IGNoYW5nZS5vbGRDb250ZW50KSB7XG4gICAgICAgIGdldExpYkRlYnVnZ2VyKCdGaWxlQ2hhbmdlOmFwcGx5Q2FudmFzQ2hhbmdlcycpKCdDb250ZW50IG1pc21hdGNoJywge1xuICAgICAgICAgIGFjdHVhbENvbnRlbnQ6IG5vZGUuZmlsZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgZXhwZWN0ZWRDb250ZW50OiBjaGFuZ2Uub2xkQ29udGVudCxcbiAgICAgICAgICBub2RlSW5kZXg6IGNoYW5nZS5yZWZlcmVuY2Uubm9kZUluZGV4LFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgdHlwZTogJ2ZpbGUnXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgbm9kZS5maWxlID0gY2hhbmdlLm5ld0NvbnRlbnQ7XG4gICAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gVGhlIGZhbHNlIGJyYW5jaCBvZiB0aGUgZWxzZS1pZiBpcyB1bnJlYWNoYWJsZTsgb25seSAnZmlsZScgYW5kICd0ZXh0JyBjYW52YXMgbm9kZSB0eXBlcyBleGlzdC4gKi9cbiAgICB9IGVsc2UgaWYgKGlzQ2FudmFzVGV4dE5vZGVDaGFuZ2UoY2hhbmdlKSkge1xuICAgICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgICAgIGxldCBjYW52YXNUZXh0Q2hhbmdlc0Zvck5vZGUgPSBjYW52YXNUZXh0Q2hhbmdlcy5nZXQoY2hhbmdlLnJlZmVyZW5jZS5ub2RlSW5kZXgpO1xuICAgICAgaWYgKCFjYW52YXNUZXh0Q2hhbmdlc0Zvck5vZGUpIHtcbiAgICAgICAgY2FudmFzVGV4dENoYW5nZXNGb3JOb2RlID0gW107XG4gICAgICAgIGNhbnZhc1RleHRDaGFuZ2VzLnNldChjaGFuZ2UucmVmZXJlbmNlLm5vZGVJbmRleCwgY2FudmFzVGV4dENoYW5nZXNGb3JOb2RlKTtcbiAgICAgIH1cblxuICAgICAgY2FudmFzVGV4dENoYW5nZXNGb3JOb2RlLnB1c2goY2hhbmdlKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IFtub2RlSW5kZXgsIGNhbnZhc1RleHRDaGFuZ2VzRm9yTm9kZV0gb2YgY2FudmFzVGV4dENoYW5nZXMuZW50cmllcygpKSB7XG4gICAgY29uc3Qgbm9kZSA9IGNhbnZhc0RhdGEubm9kZXNbbm9kZUluZGV4XTtcbiAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gTm9kZSBleGlzdGVuY2UgaXMgYWxyZWFkeSB2ZXJpZmllZCBpbiB0aGUgZmlyc3QgbG9vcCBhYm92ZS4gKi9cbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnTm9kZSBub3QgZm91bmQnO1xuICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlLCB7XG4gICAgICAgIG5vZGVJbmRleCxcbiAgICAgICAgcGF0aFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuXG4gICAgaWYgKHR5cGVvZiBub2RlLnRleHQgIT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gJ05vZGUgdGV4dCBpcyBub3QgYSBzdHJpbmcnO1xuICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlLCB7XG4gICAgICAgIG5vZGVJbmRleCxcbiAgICAgICAgcGF0aFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRlbnRDaGFuZ2VzID0gY2FudmFzVGV4dENoYW5nZXNGb3JOb2RlLm1hcCgoY2hhbmdlKSA9PiB7XG4gICAgICAvLyBBIGNhbnZhcyB0ZXh0IG5vZGUgY2FuIGhvbGQgYSBtYXJrZG93biB0YWJsZSwgd2hlcmUgYSBzaXplZCBlbWJlZCBlc2NhcGVzIHRoZSB3aWtpbGlua1xuICAgICAgLy8gRGl2aWRlciBzbyB0aGUgcGlwZSBkb2VzIG5vdCB0ZXJtaW5hdGUgdGhlIHRhYmxlIGNlbGwgKGAhW1tpbWcucG5nXFx8NTAwXV1gKS4gVGhlIHJlZ2VuZXJhdGVkXG4gICAgICAvLyBMaW5rIHVzZXMgYW4gdW5lc2NhcGVkIGRpdmlkZXIsIHNvIHJlc3RvcmUgdGhlIGVzY2FwaW5nIHdoZW4gdGhlIG9yaWdpbmFsIHJlZmVyZW5jZSBoYWQgaXQsXG4gICAgICAvLyBLZWVwaW5nIGJvdGggdGhlIHRhYmxlIGFuZCB0aGUgZW1iZWQgc2l6ZSBpbnRhY3QgYWNyb3NzIHRoZSByZXdyaXRlLlxuICAgICAgY29uc3QgbmV3Q29udGVudCA9IGNoYW5nZS5yZWZlcmVuY2Uub3JpZ2luYWxSZWZlcmVuY2Uub3JpZ2luYWwuaW5jbHVkZXMoRVNDQVBFRF9XSUtJTElOS19ESVZJREVSKVxuICAgICAgICA/IGNoYW5nZS5uZXdDb250ZW50LnJlcGxhY2VBbGwoVU5FU0NBUEVEX1dJS0lMSU5LX0RJVklERVJfUkVHRVhQLCBFU0NBUEVEX1dJS0lMSU5LX0RJVklERVIpXG4gICAgICAgIDogY2hhbmdlLm5ld0NvbnRlbnQ7XG4gICAgICByZXR1cm4gcmVmZXJlbmNlVG9GaWxlQ2hhbmdlKGNoYW5nZS5yZWZlcmVuY2Uub3JpZ2luYWxSZWZlcmVuY2UsIG5ld0NvbnRlbnQpO1xuICAgIH0pO1xuICAgIG5vZGUudGV4dCA9IGF3YWl0IGFwcGx5Q29udGVudENoYW5nZXMoe1xuICAgICAgYWJvcnRTaWduYWwsXG4gICAgICBjaGFuZ2VzUHJvdmlkZXI6IGNvbnRlbnRDaGFuZ2VzLFxuICAgICAgY29udGVudDogbm9kZS50ZXh0LFxuICAgICAgcGF0aDogYCR7cGF0aH0ubm9kZSR7U3RyaW5nKG5vZGVJbmRleCl9LlZJUlRVQUxfRklMRS5tZGAsXG4gICAgICBzaG91bGRSZXRyeU9uSW52YWxpZENoYW5nZXNcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShjYW52YXNEYXRhLCBudWxsLCAnXFx0Jyk7XG59XG5cbmZ1bmN0aW9uIGFwcGx5Q29udGVudENoYW5nZXNUb1RleHQocGFyYW1zOiBBcHBseUNvbnRlbnRDaGFuZ2VzVG9UZXh0UGFyYW1zKTogQXBwbHlDb250ZW50Q2hhbmdlc1RvVGV4dFJlc3VsdCB7XG4gIGNvbnN0IHtcbiAgICBjaGFuZ2VzLFxuICAgIGNvbnRlbnQsXG4gICAgaGFzRnJvbnRtYXR0ZXJFcnJvcixcbiAgICBwYXRoXG4gIH0gPSBwYXJhbXM7XG4gIGxldCBuZXdDb250ZW50ID0gJyc7XG4gIGxldCBsYXN0SW5kZXggPSAwO1xuICBsZXQgbGFzdENvbnRlbnRDaGFuZ2U6IENvbnRlbnRDaGFuZ2UgPSB7XG4gICAgbmV3Q29udGVudDogJycsXG4gICAgb2xkQ29udGVudDogJycsXG4gICAgcmVmZXJlbmNlOiB7XG4gICAgICBsaW5rOiAnJyxcbiAgICAgIG9yaWdpbmFsOiAnJyxcbiAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgIGVuZDogeyBjb2w6IDAsIGxpbmU6IDAsIG9mZnNldDogMCB9LFxuICAgICAgICBzdGFydDogeyBjb2w6IDAsIGxpbmU6IDAsIG9mZnNldDogMCB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBmcm9udG1hdHRlckNoYW5nZXNXaXRoT2Zmc2V0TWFwID0gbmV3IE1hcDxzdHJpbmcsIEZyb250bWF0dGVyQ2hhbmdlV2l0aE9mZnNldHNbXT4oKTtcblxuICBmb3IgKGNvbnN0IGNoYW5nZSBvZiBjaGFuZ2VzKSB7XG4gICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIEFsbCBjaGFuZ2UgdHlwZXMgYXJlIGhhbmRsZWQ7IHRoZSBmYWxzZSBicmFuY2ggbGVhZHMgdG8gb3RoZXIgZWxzZS1pZiBjaGVja3MuICovXG4gICAgaWYgKGlzQ29udGVudENoYW5nZShjaGFuZ2UpKSB7XG4gICAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICAgICAgaWYgKGxhc3RJbmRleCA8PSBjaGFuZ2UucmVmZXJlbmNlLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldCkge1xuICAgICAgICBuZXdDb250ZW50ICs9IGNvbnRlbnQuc2xpY2UobGFzdEluZGV4LCBjaGFuZ2UucmVmZXJlbmNlLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldCk7XG4gICAgICAgIG5ld0NvbnRlbnQgKz0gY2hhbmdlLm5ld0NvbnRlbnQ7XG4gICAgICAgIGxhc3RJbmRleCA9IGNoYW5nZS5yZWZlcmVuY2UucG9zaXRpb24uZW5kLm9mZnNldDtcbiAgICAgICAgbGFzdENvbnRlbnRDaGFuZ2UgPSBjaGFuZ2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBvdmVybGFwcGluZ1N0YXJ0T2Zmc2V0ID0gY2hhbmdlLnJlZmVyZW5jZS5wb3NpdGlvbi5zdGFydC5vZmZzZXQgLSBsYXN0Q29udGVudENoYW5nZS5yZWZlcmVuY2UucG9zaXRpb24uc3RhcnQub2Zmc2V0O1xuICAgICAgICBjb25zdCBvdmVybGFwcGluZ0VuZE9mZnNldCA9IGNoYW5nZS5yZWZlcmVuY2UucG9zaXRpb24uZW5kLm9mZnNldCAtIGxhc3RDb250ZW50Q2hhbmdlLnJlZmVyZW5jZS5wb3NpdGlvbi5zdGFydC5vZmZzZXQ7XG4gICAgICAgIGNvbnN0IG92ZXJsYXBwaW5nQ29udGVudCA9IGxhc3RDb250ZW50Q2hhbmdlLm5ld0NvbnRlbnQuc2xpY2Uob3ZlcmxhcHBpbmdTdGFydE9mZnNldCwgb3ZlcmxhcHBpbmdFbmRPZmZzZXQpO1xuICAgICAgICBpZiAob3ZlcmxhcHBpbmdDb250ZW50ICE9PSBjaGFuZ2Uub2xkQ29udGVudCkge1xuICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnT3ZlcmxhcHBpbmcgY2hhbmdlcyc7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlLCB7IGNoYW5nZSwgbGFzdENvbnRlbnRDaGFuZ2UgfSk7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnNsaWNlKDAsIG5ld0NvbnRlbnQubGVuZ3RoIC0gbGFzdENvbnRlbnRDaGFuZ2UubmV3Q29udGVudC5sZW5ndGgpXG4gICAgICAgICAgKyBsYXN0Q29udGVudENoYW5nZS5uZXdDb250ZW50LnNsaWNlKDAsIG92ZXJsYXBwaW5nU3RhcnRPZmZzZXQpXG4gICAgICAgICAgKyBjaGFuZ2UubmV3Q29udGVudFxuICAgICAgICAgICsgbGFzdENvbnRlbnRDaGFuZ2UubmV3Q29udGVudC5zbGljZShvdmVybGFwcGluZ0VuZE9mZnNldCk7XG4gICAgICB9XG4gICAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gQWxsIGNoYW5nZSB0eXBlcyBhcmUgaGFuZGxlZCBhYm92ZTsgbm8gdW5rbm93biBjaGFuZ2UgdHlwZXMgaW4gcHJhY3RpY2UuICovXG4gICAgfSBlbHNlIGlmIChpc0Zyb250bWF0dGVyQ2hhbmdlKGNoYW5nZSkpIHtcbiAgICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gVmFsaWRhdGlvbiByZWplY3RzIGZyb250bWF0dGVyIGNoYW5nZXMgd2hlbiBwYXJzaW5nIGZhaWxzLCBzbyB0aGlzIGJyYW5jaCBpcyB1bnJlYWNoYWJsZS4gKi9cbiAgICAgIGlmIChoYXNGcm9udG1hdHRlckVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYENhbm5vdCBhcHBseSBmcm9udG1hdHRlciBjaGFuZ2UgaW4gJHtwYXRofSwgYmVjYXVzZSBmcm9udG1hdHRlciBwYXJzaW5nIGZhaWxlZGAsIHsgY2hhbmdlIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgbGV0IGZyb250bWF0dGVyQ2hhbmdlc1dpdGhPZmZzZXRzID0gZnJvbnRtYXR0ZXJDaGFuZ2VzV2l0aE9mZnNldE1hcC5nZXQoY2hhbmdlLnJlZmVyZW5jZS5rZXkpO1xuICAgICAgICBpZiAoIWZyb250bWF0dGVyQ2hhbmdlc1dpdGhPZmZzZXRzKSB7XG4gICAgICAgICAgZnJvbnRtYXR0ZXJDaGFuZ2VzV2l0aE9mZnNldHMgPSBbXTtcbiAgICAgICAgICBmcm9udG1hdHRlckNoYW5nZXNXaXRoT2Zmc2V0TWFwLnNldChjaGFuZ2UucmVmZXJlbmNlLmtleSwgZnJvbnRtYXR0ZXJDaGFuZ2VzV2l0aE9mZnNldHMpO1xuICAgICAgICB9XG4gICAgICAgIGZyb250bWF0dGVyQ2hhbmdlc1dpdGhPZmZzZXRzLnB1c2godG9Gcm9udG1hdHRlckNoYW5nZVdpdGhPZmZzZXRzKGNoYW5nZSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5ld0NvbnRlbnQgKz0gY29udGVudC5zbGljZShsYXN0SW5kZXgpO1xuXG4gIHJldHVybiB7IGZyb250bWF0dGVyQ2hhbmdlZDogZnJvbnRtYXR0ZXJDaGFuZ2VzV2l0aE9mZnNldE1hcCwgbmV3Q29udGVudCB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBhcHBseUZyb250bWF0dGVyQ2hhbmdlc1dpdGhPZmZzZXRzKHBhcmFtczogQXBwbHlGcm9udG1hdHRlckNoYW5nZXNXaXRoT2Zmc2V0c1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgYWJvcnRTaWduYWwsXG4gICAgZnJvbnRtYXR0ZXIsXG4gICAgZnJvbnRtYXR0ZXJDaGFuZ2VzV2l0aE9mZnNldE1hcCxcbiAgICBwYXRoXG4gIH0gPSBwYXJhbXM7XG4gIGZvciAoY29uc3QgW2tleSwgZnJvbnRtYXR0ZXJDaGFuZ2VzV2l0aE9mZnNldHNdIG9mIGZyb250bWF0dGVyQ2hhbmdlc1dpdGhPZmZzZXRNYXAuZW50cmllcygpKSB7XG4gICAgY29uc3QgcHJvcGVydHlWYWx1ZSA9IGdldE5lc3RlZFByb3BlcnR5VmFsdWUoZnJvbnRtYXR0ZXIsIGtleSk7XG4gICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIFZhbGlkYXRpb24gZW5zdXJlcyB0aGUgcHJvcGVydHkgaXMgYSBzdHJpbmcgYmVmb3JlIHJlYWNoaW5nIHRoaXMgcG9pbnQuICovXG4gICAgaWYgKHR5cGVvZiBwcm9wZXJ0eVZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuXG4gICAgY29uc3QgY29udGVudENoYW5nZXM6IENvbnRlbnRDaGFuZ2VbXSA9IGZyb250bWF0dGVyQ2hhbmdlc1dpdGhPZmZzZXRzLm1hcCgoY2hhbmdlKSA9PiAoe1xuICAgICAgbmV3Q29udGVudDogY2hhbmdlLm5ld0NvbnRlbnQsXG4gICAgICBvbGRDb250ZW50OiBjaGFuZ2Uub2xkQ29udGVudCxcbiAgICAgIHJlZmVyZW5jZToge1xuICAgICAgICBsaW5rOiAnJyxcbiAgICAgICAgb3JpZ2luYWw6ICcnLFxuICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgIGVuZDoge1xuICAgICAgICAgICAgY29sOiBjaGFuZ2UucmVmZXJlbmNlLmVuZE9mZnNldCxcbiAgICAgICAgICAgIGxpbmU6IDAsXG4gICAgICAgICAgICBvZmZzZXQ6IGNoYW5nZS5yZWZlcmVuY2UuZW5kT2Zmc2V0XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGFydDoge1xuICAgICAgICAgICAgY29sOiBjaGFuZ2UucmVmZXJlbmNlLnN0YXJ0T2Zmc2V0LFxuICAgICAgICAgICAgbGluZTogMCxcbiAgICAgICAgICAgIG9mZnNldDogY2hhbmdlLnJlZmVyZW5jZS5zdGFydE9mZnNldFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKTtcblxuICAgIGNvbnN0IG5ld1Byb3BlcnR5VmFsdWUgPSBhd2FpdCBhcHBseUNvbnRlbnRDaGFuZ2VzKHtcbiAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgY2hhbmdlc1Byb3ZpZGVyOiBjb250ZW50Q2hhbmdlcyxcbiAgICAgIGNvbnRlbnQ6IHByb3BlcnR5VmFsdWUsXG4gICAgICBwYXRoOiBgJHtwYXRofS5mcm9udG1hdHRlci4ke2tleX0uVklSVFVBTF9GSUxFLm1kYFxuICAgIH0pO1xuICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbm5lciBhcHBseUNvbnRlbnRDaGFuZ2VzIHVzZXMgdmFsaWRhdGVkIG9mZnNldHMsIHNvIG51bGwgaXMgbm90IGV4cGVjdGVkLiAqL1xuICAgIGlmIChuZXdQcm9wZXJ0eVZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG5cbiAgICBzZXROZXN0ZWRQcm9wZXJ0eVZhbHVlKHtcbiAgICAgIG9iajogZnJvbnRtYXR0ZXIsXG4gICAgICBwYXRoOiBrZXksXG4gICAgICB2YWx1ZTogbmV3UHJvcGVydHlWYWx1ZVxuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRmluYWxDb250ZW50KHBhcmFtczogQnVpbGRGaW5hbENvbnRlbnRQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7XG4gICAgZnJvbnRtYXR0ZXIsXG4gICAgZnJvbnRtYXR0ZXJDaGFuZ2VkLFxuICAgIG5ld0NvbnRlbnRcbiAgfSA9IHBhcmFtcztcbiAgaWYgKGZyb250bWF0dGVyQ2hhbmdlZC5zaXplID4gMCkge1xuICAgIHJldHVybiBzZXRGcm9udG1hdHRlcihuZXdDb250ZW50LCBmcm9udG1hdHRlcik7XG4gIH1cbiAgcmV0dXJuIG5ld0NvbnRlbnQ7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRnJvbnRtYXR0ZXJTYWZlbHkocGFyYW1zOiBQYXJzZUZyb250bWF0dGVyU2FmZWx5UGFyYW1zKTogUGFyc2VGcm9udG1hdHRlclNhZmVseVJlc3VsdCB7XG4gIGNvbnN0IHsgY29udGVudCwgcGF0aCB9ID0gcGFyYW1zO1xuICBsZXQgZnJvbnRtYXR0ZXI6IENvbWJpbmVkRnJvbnRtYXR0ZXI8dW5rbm93bj4gPSB7fTtcbiAgbGV0IGhhc0Zyb250bWF0dGVyRXJyb3IgPSBmYWxzZTtcblxuICB0cnkge1xuICAgIGZyb250bWF0dGVyID0gcGFyc2VGcm9udG1hdHRlcihjb250ZW50KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBwcmludEVycm9yKG5ldyBFcnJvcihgRnJvbnRtYXR0ZXIgcGFyc2luZyBmYWlsZWQgaW4gJHtwYXRofWAsIHsgY2F1c2U6IGVycm9yIH0pKTtcbiAgICBoYXNGcm9udG1hdHRlckVycm9yID0gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB7IGZyb250bWF0dGVyLCBoYXNGcm9udG1hdHRlckVycm9yIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlSnNvblNhZmUoY29udGVudDogc3RyaW5nKTogR2VuZXJpY09iamVjdCB7XG4gIGxldCBwYXJzZWQ6IHVua25vd247XG4gIHRyeSB7XG4gICAgcGFyc2VkID0gSlNPTi5wYXJzZShjb250ZW50KTtcbiAgfSBjYXRjaCB7XG4gICAgcGFyc2VkID0gbnVsbDtcbiAgfVxuXG4gIGlmIChwYXJzZWQgPT09IG51bGwgfHwgdHlwZW9mIHBhcnNlZCAhPT0gJ29iamVjdCcpIHtcbiAgICBwYXJzZWQgPSB7fTtcbiAgfVxuXG4gIHJldHVybiBwYXJzZWQgYXMgR2VuZXJpY09iamVjdDtcbn1cblxuZnVuY3Rpb24gc29ydEFuZEZpbHRlckNoYW5nZXMoY2hhbmdlczogRmlsZUNoYW5nZVtdKTogRmlsZUNoYW5nZVtdIHtcbiAgLy8gU29ydCBjaGFuZ2VzIGJ5IHR5cGUgYW5kIHBvc2l0aW9uXG4gIGNoYW5nZXMuc29ydCgoYSwgYikgPT4ge1xuICAgIGlmIChpc0NvbnRlbnRDaGFuZ2UoYSkgJiYgaXNDb250ZW50Q2hhbmdlKGIpKSB7XG4gICAgICByZXR1cm4gYS5yZWZlcmVuY2UucG9zaXRpb24uc3RhcnQub2Zmc2V0IC0gYi5yZWZlcmVuY2UucG9zaXRpb24uc3RhcnQub2Zmc2V0O1xuICAgIH1cblxuICAgIGlmIChpc0Zyb250bWF0dGVyQ2hhbmdlV2l0aE9mZnNldHMoYSkgJiYgaXNGcm9udG1hdHRlckNoYW5nZVdpdGhPZmZzZXRzKGIpKSB7XG4gICAgICByZXR1cm4gYS5yZWZlcmVuY2Uua2V5LmxvY2FsZUNvbXBhcmUoYi5yZWZlcmVuY2Uua2V5KSB8fCBhLnJlZmVyZW5jZS5zdGFydE9mZnNldCAtIGIucmVmZXJlbmNlLnN0YXJ0T2Zmc2V0O1xuICAgIH1cblxuICAgIGlmIChpc0Zyb250bWF0dGVyQ2hhbmdlKGEpICYmIGlzRnJvbnRtYXR0ZXJDaGFuZ2UoYikpIHtcbiAgICAgIHJldHVybiBhLnJlZmVyZW5jZS5rZXkubG9jYWxlQ29tcGFyZShiLnJlZmVyZW5jZS5rZXkpO1xuICAgIH1cblxuICAgIHJldHVybiBpc0NvbnRlbnRDaGFuZ2UoYSkgPyAtMSA6IDE7XG4gIH0pO1xuXG4gIC8vIEZpbHRlciBvdXQgZHVwbGljYXRlIGFuZCBuby1vcCBjaGFuZ2VzXG4gIHJldHVybiBjaGFuZ2VzLmZpbHRlcigoY2hhbmdlLCBpbmRleCkgPT4ge1xuICAgIGlmIChjaGFuZ2Uub2xkQ29udGVudCA9PT0gY2hhbmdlLm5ld0NvbnRlbnQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuICFkZWVwRXF1YWwoY2hhbmdlLCBjaGFuZ2VzW2luZGV4IC0gMV0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVDaGFuZ2VzKHBhcmFtczogVmFsaWRhdGVDaGFuZ2VzUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHtcbiAgICBjaGFuZ2VzLFxuICAgIGNvbnRlbnQsXG4gICAgZnJvbnRtYXR0ZXIsXG4gICAgcGF0aFxuICB9ID0gcGFyYW1zO1xuICBjb25zdCB2YWxpZGF0ZUNoYW5nZXNEZWJ1Z2dlciA9IGdldExpYkRlYnVnZ2VyKCdGaWxlQ2hhbmdlOnZhbGlkYXRlQ2hhbmdlcycpO1xuICBmb3IgKGNvbnN0IGNoYW5nZSBvZiBjaGFuZ2VzKSB7XG4gICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIEFsbCBjaGFuZ2UgdHlwZXMgYXJlIGhhbmRsZWQ7IHRoZSBmYWxzZSBicmFuY2ggbGVhZHMgdG8gb3RoZXIgZWxzZS1pZiBjaGVja3MuICovXG4gICAgaWYgKGlzQ29udGVudENoYW5nZShjaGFuZ2UpKSB7XG4gICAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICAgICAgY29uc3Qgc3RhcnRPZmZzZXQgPSBjaGFuZ2UucmVmZXJlbmNlLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldDtcbiAgICAgIGNvbnN0IGVuZE9mZnNldCA9IGNoYW5nZS5yZWZlcmVuY2UucG9zaXRpb24uZW5kLm9mZnNldDtcbiAgICAgIGNvbnN0IGFjdHVhbENvbnRlbnQgPSBjb250ZW50LnNsaWNlKHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQpO1xuICAgICAgaWYgKGFjdHVhbENvbnRlbnQgIT09IGNoYW5nZS5vbGRDb250ZW50KSB7XG4gICAgICAgIHZhbGlkYXRlQ2hhbmdlc0RlYnVnZ2VyKCdDb250ZW50IG1pc21hdGNoJywge1xuICAgICAgICAgIGFjdHVhbENvbnRlbnQsXG4gICAgICAgICAgZW5kT2Zmc2V0LFxuICAgICAgICAgIGV4cGVjdGVkQ29udGVudDogY2hhbmdlLm9sZENvbnRlbnQsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICBzdGFydE9mZnNldFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gQWxsIGNoYW5nZSB0eXBlcyBhcmUgaGFuZGxlZDsgbm8gdW5rbm93biBjaGFuZ2UgdHlwZXMgaW4gcHJhY3RpY2UuICovXG4gICAgfSBlbHNlIGlmIChpc0Zyb250bWF0dGVyQ2hhbmdlV2l0aE9mZnNldHMoY2hhbmdlKSkge1xuICAgICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgICAgIGNvbnN0IHByb3BlcnR5VmFsdWUgPSBnZXROZXN0ZWRQcm9wZXJ0eVZhbHVlKGZyb250bWF0dGVyLCBjaGFuZ2UucmVmZXJlbmNlLmtleSk7XG4gICAgICBpZiAodHlwZW9mIHByb3BlcnR5VmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHZhbGlkYXRlQ2hhbmdlc0RlYnVnZ2VyKCdQcm9wZXJ0eSB2YWx1ZSBpcyBub3QgYSBzdHJpbmcnLCB7XG4gICAgICAgICAgZnJvbnRtYXR0ZXJLZXk6IGNoYW5nZS5yZWZlcmVuY2Uua2V5LFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgcHJvcGVydHlWYWx1ZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhY3R1YWxDb250ZW50ID0gcHJvcGVydHlWYWx1ZS5zbGljZShjaGFuZ2UucmVmZXJlbmNlLnN0YXJ0T2Zmc2V0LCBjaGFuZ2UucmVmZXJlbmNlLmVuZE9mZnNldCk7XG4gICAgICBpZiAoYWN0dWFsQ29udGVudCAhPT0gY2hhbmdlLm9sZENvbnRlbnQpIHtcbiAgICAgICAgdmFsaWRhdGVDaGFuZ2VzRGVidWdnZXIoJ0NvbnRlbnQgbWlzbWF0Y2gnLCB7XG4gICAgICAgICAgYWN0dWFsQ29udGVudCxcbiAgICAgICAgICBleHBlY3RlZENvbnRlbnQ6IGNoYW5nZS5vbGRDb250ZW50LFxuICAgICAgICAgIGZyb250bWF0dGVyS2V5OiBjaGFuZ2UucmVmZXJlbmNlLmtleSxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIHN0YXJ0T2Zmc2V0OiBjaGFuZ2UucmVmZXJlbmNlLnN0YXJ0T2Zmc2V0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBBbGwgY2hhbmdlIHR5cGVzIGFyZSBoYW5kbGVkIGFib3ZlOyBubyB1bmtub3duIGNoYW5nZSB0eXBlcyBpbiBwcmFjdGljZS4gKi9cbiAgICB9IGVsc2UgaWYgKGlzRnJvbnRtYXR0ZXJDaGFuZ2UoY2hhbmdlKSkge1xuICAgICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgICAgIGNvbnN0IGFjdHVhbENvbnRlbnQgPSBnZXROZXN0ZWRQcm9wZXJ0eVZhbHVlKGZyb250bWF0dGVyLCBjaGFuZ2UucmVmZXJlbmNlLmtleSk7XG4gICAgICBpZiAoYWN0dWFsQ29udGVudCAhPT0gY2hhbmdlLm9sZENvbnRlbnQpIHtcbiAgICAgICAgdmFsaWRhdGVDaGFuZ2VzRGVidWdnZXIoJ0NvbnRlbnQgbWlzbWF0Y2gnLCB7XG4gICAgICAgICAgYWN0dWFsQ29udGVudCxcbiAgICAgICAgICBleHBlY3RlZENvbnRlbnQ6IGNoYW5nZS5vbGRDb250ZW50LFxuICAgICAgICAgIGZyb250bWF0dGVyS2V5OiBjaGFuZ2UucmVmZXJlbmNlLmtleSxcbiAgICAgICAgICBwYXRoXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFjQSw2QkFHTztBQWtCUCxtQkFBK0I7QUFDL0IsbUJBQTJCO0FBQzNCLDBCQUtPO0FBQ1AsNEJBQTZCO0FBQzdCLHlCQUdPO0FBQ1AsaURBR087QUFDUCx5QkFHTztBQUNQLHVCQUdPO0FBQ1AsbUJBQXdCO0FBRXhCLE1BQU0sMkJBQTJCO0FBQ2pDLE1BQU0sb0NBQW9DO0FBd08xQyxlQUFzQixvQkFBb0IsUUFBMkQ7QUFDbkcsUUFBTTtBQUFBLElBQ0o7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBLDhCQUE4QjtBQUFBLEVBQ2hDLElBQUk7QUFDSixjQUFZLGVBQWU7QUFDM0IsTUFBSSxVQUFVLFVBQU0sb0NBQWEsaUJBQWlCLEVBQUUsYUFBYSxRQUFRLENBQUM7QUFDMUUsY0FBWSxlQUFlO0FBQzNCLE1BQUksWUFBWSxNQUFNO0FBQ3BCLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxFQUFFLGFBQWEsb0JBQW9CLElBQUksdUJBQXVCLEVBQUUsU0FBUyxLQUFLLENBQUM7QUFFckYsTUFBSSxDQUFDLGdCQUFnQixFQUFFLFNBQVMsU0FBUyxhQUFhLEtBQUssQ0FBQyxHQUFHO0FBQzdELFdBQU8sOEJBQThCLE9BQU87QUFBQSxFQUM5QztBQUVBLFlBQVUscUJBQXFCLE9BQU87QUFFdEMsUUFBTSxFQUFFLG9CQUFvQixXQUFXLElBQUksMEJBQTBCLEVBQUUsU0FBUyxTQUFTLHFCQUFxQixLQUFLLENBQUM7QUFFcEgsUUFBTSxtQ0FBbUM7QUFBQSxJQUN2QztBQUFBLElBQ0E7QUFBQSxJQUNBLGlDQUFpQztBQUFBLElBQ2pDO0FBQUEsRUFDRixDQUFDO0FBQ0QsY0FBWSxlQUFlO0FBRTNCLFNBQU8sa0JBQWtCLEVBQUUsYUFBYSxvQkFBb0IsV0FBVyxDQUFDO0FBQzFFO0FBUUEsZUFBc0IsaUJBQWlCLFFBQStDO0FBQ3BGLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBLDhCQUE4QjtBQUFBLElBQzlCLEdBQUc7QUFBQSxFQUNMLElBQUk7QUFDSixZQUFNLDBCQUFRLGlEQUEyQztBQUFBLElBQ3ZEO0FBQUEsSUFDQSxNQUFNLG1CQUFtQixFQUFFLGFBQWEsUUFBUSxHQUFHO0FBQ2pELGNBQUksaUNBQWEsVUFBVSxHQUFHO0FBQzVCLGVBQU8sTUFBTSxtQkFBbUI7QUFBQSxVQUM5QjtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQSxVQUFNLDRCQUFRLEtBQUssVUFBVTtBQUFBLFVBQzdCO0FBQUEsUUFDRixDQUFDO0FBQUEsTUFDSDtBQUVBLGFBQU8sTUFBTSxvQkFBb0I7QUFBQSxRQUMvQjtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQSxVQUFNLDRCQUFRLEtBQUssVUFBVTtBQUFBLFFBQzdCO0FBQUEsTUFDRixDQUFDO0FBQUEsSUFDSDtBQUFBLElBQ0E7QUFBQSxJQUNBLEdBQUc7QUFBQSxFQUNMLENBQUMsQ0FBQztBQUNKO0FBUU8sU0FBUyxlQUFlLFFBQTRDO0FBQ3pFLGFBQU8sb0NBQWtCLE9BQU8sU0FBUztBQUMzQztBQVFPLFNBQVMsdUJBQXVCLFFBQW9EO0FBQ3pGLFNBQU8sZUFBZSxNQUFNLEtBQUssT0FBTyxVQUFVLFNBQVM7QUFDN0Q7QUFRTyxTQUFTLHVCQUF1QixRQUFvRDtBQUN6RixTQUFPLGVBQWUsTUFBTSxLQUFLLE9BQU8sVUFBVSxTQUFTO0FBQzdEO0FBUU8sU0FBUyxnQkFBZ0IsWUFBcUQ7QUFDbkYsYUFBTyx5Q0FBaUIsV0FBVyxTQUFTO0FBQzlDO0FBUU8sU0FBUyxvQkFBb0IsWUFBeUQ7QUFDM0YsYUFBTywrQ0FBdUIsV0FBVyxTQUFTO0FBQ3BEO0FBUU8sU0FBUywrQkFBK0IsWUFBb0U7QUFDakgsYUFBTyw4RUFBa0MsV0FBVyxTQUFTO0FBQy9EO0FBUU8sU0FBUywrQkFBK0IsWUFBNkQ7QUFDMUcsTUFBSSwrQkFBK0IsVUFBVSxHQUFHO0FBQzlDLFdBQU87QUFBQSxFQUNUO0FBRUEsU0FBTztBQUFBLElBQ0wsR0FBRztBQUFBLElBQ0gsZUFBVyw4RUFBa0MsV0FBVyxTQUFTO0FBQUEsRUFDbkU7QUFDRjtBQUVBLGVBQWUsbUJBQW1CLFFBQTBEO0FBQzFGLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQSw4QkFBOEI7QUFBQSxFQUNoQyxJQUFJO0FBQ0osUUFBTSxVQUFVLFVBQU0sb0NBQWEsaUJBQWlCLEVBQUUsYUFBYSxRQUFRLENBQUM7QUFDNUUsY0FBWSxlQUFlO0FBQzNCLE1BQUksWUFBWSxNQUFNO0FBQ3BCLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxhQUFhLGNBQWMsT0FBTztBQU14QyxNQUFJLENBQUMsTUFBTSxRQUFRLFdBQVcsS0FBSyxLQUFLLENBQUMsTUFBTSxRQUFRLFdBQVcsS0FBSyxHQUFHO0FBQ3hFLHFDQUFlLCtCQUErQixFQUFFLHdDQUF3QyxFQUFFLEtBQUssQ0FBQztBQUNoRyxXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sb0JBQW9CLG9CQUFJLElBQW9DO0FBRWxFLGFBQVcsVUFBVSxTQUFTO0FBQzVCLFFBQUksQ0FBQyxlQUFlLE1BQU0sR0FBRztBQUMzQixZQUFNLFVBQVU7QUFDaEIsY0FBUSxNQUFNLFNBQVM7QUFBQSxRQUNyQjtBQUFBLFFBQ0E7QUFBQSxNQUNGLENBQUM7QUFDRDtBQUFBLElBQ0Y7QUFFQSxVQUFNLE9BQU8sV0FBVyxNQUFNLE9BQU8sVUFBVSxTQUFTO0FBQ3hELFFBQUksQ0FBQyxNQUFNO0FBQ1QsWUFBTSxVQUFVO0FBQ2hCLGNBQVEsTUFBTSxTQUFTO0FBQUEsUUFDckIsV0FBVyxPQUFPLFVBQVU7QUFBQSxRQUM1QjtBQUFBLE1BQ0YsQ0FBQztBQUNELGFBQU87QUFBQSxJQUNUO0FBRUEsUUFBSSx1QkFBdUIsTUFBTSxHQUFHO0FBQ2xDLFVBQUksS0FBSyxTQUFTLE9BQU8sWUFBWTtBQUNuQyx5Q0FBZSwrQkFBK0IsRUFBRSxvQkFBb0I7QUFBQSxVQUNsRSxlQUFlLEtBQUs7QUFBQSxVQUNwQixpQkFBaUIsT0FBTztBQUFBLFVBQ3hCLFdBQVcsT0FBTyxVQUFVO0FBQUEsVUFDNUI7QUFBQSxVQUNBLE1BQU07QUFBQSxRQUNSLENBQUM7QUFFRCxlQUFPO0FBQUEsTUFDVDtBQUNBLFdBQUssT0FBTyxPQUFPO0FBQUEsSUFFckIsV0FBVyx1QkFBdUIsTUFBTSxHQUFHO0FBRXpDLFVBQUksMkJBQTJCLGtCQUFrQixJQUFJLE9BQU8sVUFBVSxTQUFTO0FBQy9FLFVBQUksQ0FBQywwQkFBMEI7QUFDN0IsbUNBQTJCLENBQUM7QUFDNUIsMEJBQWtCLElBQUksT0FBTyxVQUFVLFdBQVcsd0JBQXdCO0FBQUEsTUFDNUU7QUFFQSwrQkFBeUIsS0FBSyxNQUFNO0FBQUEsSUFDdEM7QUFBQSxFQUNGO0FBRUEsYUFBVyxDQUFDLFdBQVcsd0JBQXdCLEtBQUssa0JBQWtCLFFBQVEsR0FBRztBQUMvRSxVQUFNLE9BQU8sV0FBVyxNQUFNLFNBQVM7QUFFdkMsUUFBSSxDQUFDLE1BQU07QUFDVCxZQUFNLFVBQVU7QUFDaEIsY0FBUSxNQUFNLFNBQVM7QUFBQSxRQUNyQjtBQUFBLFFBQ0E7QUFBQSxNQUNGLENBQUM7QUFFRCxhQUFPO0FBQUEsSUFDVDtBQUdBLFFBQUksT0FBTyxLQUFLLFNBQVMsVUFBVTtBQUNqQyxZQUFNLFVBQVU7QUFDaEIsY0FBUSxNQUFNLFNBQVM7QUFBQSxRQUNyQjtBQUFBLFFBQ0E7QUFBQSxNQUNGLENBQUM7QUFFRCxhQUFPO0FBQUEsSUFDVDtBQUVBLFVBQU0saUJBQWlCLHlCQUF5QixJQUFJLENBQUMsV0FBVztBQUs5RCxZQUFNLGFBQWEsT0FBTyxVQUFVLGtCQUFrQixTQUFTLFNBQVMsd0JBQXdCLElBQzVGLE9BQU8sV0FBVyxXQUFXLG1DQUFtQyx3QkFBd0IsSUFDeEYsT0FBTztBQUNYLGlCQUFPLHdDQUFzQixPQUFPLFVBQVUsbUJBQW1CLFVBQVU7QUFBQSxJQUM3RSxDQUFDO0FBQ0QsU0FBSyxPQUFPLE1BQU0sb0JBQW9CO0FBQUEsTUFDcEM7QUFBQSxNQUNBLGlCQUFpQjtBQUFBLE1BQ2pCLFNBQVMsS0FBSztBQUFBLE1BQ2QsTUFBTSxHQUFHLElBQUksUUFBUSxPQUFPLFNBQVMsQ0FBQztBQUFBLE1BQ3RDO0FBQUEsSUFDRixDQUFDO0FBQUEsRUFDSDtBQUVBLFNBQU8sS0FBSyxVQUFVLFlBQVksTUFBTSxHQUFJO0FBQzlDO0FBRUEsU0FBUywwQkFBMEIsUUFBMEU7QUFDM0csUUFBTTtBQUFBLElBQ0o7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFDSixNQUFJLGFBQWE7QUFDakIsTUFBSSxZQUFZO0FBQ2hCLE1BQUksb0JBQW1DO0FBQUEsSUFDckMsWUFBWTtBQUFBLElBQ1osWUFBWTtBQUFBLElBQ1osV0FBVztBQUFBLE1BQ1QsTUFBTTtBQUFBLE1BQ04sVUFBVTtBQUFBLE1BQ1YsVUFBVTtBQUFBLFFBQ1IsS0FBSyxFQUFFLEtBQUssR0FBRyxNQUFNLEdBQUcsUUFBUSxFQUFFO0FBQUEsUUFDbEMsT0FBTyxFQUFFLEtBQUssR0FBRyxNQUFNLEdBQUcsUUFBUSxFQUFFO0FBQUEsTUFDdEM7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNBLFFBQU0sa0NBQWtDLG9CQUFJLElBQTRDO0FBRXhGLGFBQVcsVUFBVSxTQUFTO0FBRTVCLFFBQUksZ0JBQWdCLE1BQU0sR0FBRztBQUUzQixVQUFJLGFBQWEsT0FBTyxVQUFVLFNBQVMsTUFBTSxRQUFRO0FBQ3ZELHNCQUFjLFFBQVEsTUFBTSxXQUFXLE9BQU8sVUFBVSxTQUFTLE1BQU0sTUFBTTtBQUM3RSxzQkFBYyxPQUFPO0FBQ3JCLG9CQUFZLE9BQU8sVUFBVSxTQUFTLElBQUk7QUFDMUMsNEJBQW9CO0FBQUEsTUFDdEIsT0FBTztBQUNMLGNBQU0seUJBQXlCLE9BQU8sVUFBVSxTQUFTLE1BQU0sU0FBUyxrQkFBa0IsVUFBVSxTQUFTLE1BQU07QUFDbkgsY0FBTSx1QkFBdUIsT0FBTyxVQUFVLFNBQVMsSUFBSSxTQUFTLGtCQUFrQixVQUFVLFNBQVMsTUFBTTtBQUMvRyxjQUFNLHFCQUFxQixrQkFBa0IsV0FBVyxNQUFNLHdCQUF3QixvQkFBb0I7QUFDMUcsWUFBSSx1QkFBdUIsT0FBTyxZQUFZO0FBQzVDLGdCQUFNLFVBQVU7QUFDaEIsa0JBQVEsTUFBTSxTQUFTLEVBQUUsUUFBUSxrQkFBa0IsQ0FBQztBQUNwRCxnQkFBTSxJQUFJLE1BQU0sT0FBTztBQUFBLFFBQ3pCO0FBQ0EscUJBQWEsV0FBVyxNQUFNLEdBQUcsV0FBVyxTQUFTLGtCQUFrQixXQUFXLE1BQU0sSUFDcEYsa0JBQWtCLFdBQVcsTUFBTSxHQUFHLHNCQUFzQixJQUM1RCxPQUFPLGFBQ1Asa0JBQWtCLFdBQVcsTUFBTSxvQkFBb0I7QUFBQSxNQUM3RDtBQUFBLElBRUYsV0FBVyxvQkFBb0IsTUFBTSxHQUFHO0FBR3RDLFVBQUkscUJBQXFCO0FBQ3ZCLGdCQUFRLE1BQU0sc0NBQXNDLElBQUksd0NBQXdDLEVBQUUsT0FBTyxDQUFDO0FBQUEsTUFDNUcsT0FBTztBQUVMLFlBQUksZ0NBQWdDLGdDQUFnQyxJQUFJLE9BQU8sVUFBVSxHQUFHO0FBQzVGLFlBQUksQ0FBQywrQkFBK0I7QUFDbEMsMENBQWdDLENBQUM7QUFDakMsMENBQWdDLElBQUksT0FBTyxVQUFVLEtBQUssNkJBQTZCO0FBQUEsUUFDekY7QUFDQSxzQ0FBOEIsS0FBSywrQkFBK0IsTUFBTSxDQUFDO0FBQUEsTUFDM0U7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLGdCQUFjLFFBQVEsTUFBTSxTQUFTO0FBRXJDLFNBQU8sRUFBRSxvQkFBb0IsaUNBQWlDLFdBQVc7QUFDM0U7QUFFQSxlQUFlLG1DQUFtQyxRQUFpRTtBQUNqSCxRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0YsSUFBSTtBQUNKLGFBQVcsQ0FBQyxLQUFLLDZCQUE2QixLQUFLLGdDQUFnQyxRQUFRLEdBQUc7QUFDNUYsVUFBTSxvQkFBZ0IsNENBQXVCLGFBQWEsR0FBRztBQUU3RCxRQUFJLE9BQU8sa0JBQWtCLFVBQVU7QUFDckM7QUFBQSxJQUNGO0FBR0EsVUFBTSxpQkFBa0MsOEJBQThCLElBQUksQ0FBQyxZQUFZO0FBQUEsTUFDckYsWUFBWSxPQUFPO0FBQUEsTUFDbkIsWUFBWSxPQUFPO0FBQUEsTUFDbkIsV0FBVztBQUFBLFFBQ1QsTUFBTTtBQUFBLFFBQ04sVUFBVTtBQUFBLFFBQ1YsVUFBVTtBQUFBLFVBQ1IsS0FBSztBQUFBLFlBQ0gsS0FBSyxPQUFPLFVBQVU7QUFBQSxZQUN0QixNQUFNO0FBQUEsWUFDTixRQUFRLE9BQU8sVUFBVTtBQUFBLFVBQzNCO0FBQUEsVUFDQSxPQUFPO0FBQUEsWUFDTCxLQUFLLE9BQU8sVUFBVTtBQUFBLFlBQ3RCLE1BQU07QUFBQSxZQUNOLFFBQVEsT0FBTyxVQUFVO0FBQUEsVUFDM0I7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUFBLElBQ0YsRUFBRTtBQUVGLFVBQU0sbUJBQW1CLE1BQU0sb0JBQW9CO0FBQUEsTUFDakQ7QUFBQSxNQUNBLGlCQUFpQjtBQUFBLE1BQ2pCLFNBQVM7QUFBQSxNQUNULE1BQU0sR0FBRyxJQUFJLGdCQUFnQixHQUFHO0FBQUEsSUFDbEMsQ0FBQztBQUVELFFBQUkscUJBQXFCLE1BQU07QUFDN0I7QUFBQSxJQUNGO0FBR0Esb0RBQXVCO0FBQUEsTUFDckIsS0FBSztBQUFBLE1BQ0wsTUFBTTtBQUFBLE1BQ04sT0FBTztBQUFBLElBQ1QsQ0FBQztBQUFBLEVBQ0g7QUFDRjtBQUVBLFNBQVMsa0JBQWtCLFFBQXlDO0FBQ2xFLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFDSixNQUFJLG1CQUFtQixPQUFPLEdBQUc7QUFDL0IsZUFBTyxtQ0FBZSxZQUFZLFdBQVc7QUFBQSxFQUMvQztBQUNBLFNBQU87QUFDVDtBQUVBLFNBQVMsdUJBQXVCLFFBQW9FO0FBQ2xHLFFBQU0sRUFBRSxTQUFTLEtBQUssSUFBSTtBQUMxQixNQUFJLGNBQTRDLENBQUM7QUFDakQsTUFBSSxzQkFBc0I7QUFFMUIsTUFBSTtBQUNGLHNCQUFjLHFDQUFpQixPQUFPO0FBQUEsRUFDeEMsU0FBUyxPQUFPO0FBQ2QsaUNBQVcsSUFBSSxNQUFNLGlDQUFpQyxJQUFJLElBQUksRUFBRSxPQUFPLE1BQU0sQ0FBQyxDQUFDO0FBQy9FLDBCQUFzQjtBQUFBLEVBQ3hCO0FBRUEsU0FBTyxFQUFFLGFBQWEsb0JBQW9CO0FBQzVDO0FBRUEsU0FBUyxjQUFjLFNBQWdDO0FBQ3JELE1BQUk7QUFDSixNQUFJO0FBQ0YsYUFBUyxLQUFLLE1BQU0sT0FBTztBQUFBLEVBQzdCLFFBQVE7QUFDTixhQUFTO0FBQUEsRUFDWDtBQUVBLE1BQUksV0FBVyxRQUFRLE9BQU8sV0FBVyxVQUFVO0FBQ2pELGFBQVMsQ0FBQztBQUFBLEVBQ1o7QUFFQSxTQUFPO0FBQ1Q7QUFFQSxTQUFTLHFCQUFxQixTQUFxQztBQUVqRSxVQUFRLEtBQUssQ0FBQyxHQUFHLE1BQU07QUFDckIsUUFBSSxnQkFBZ0IsQ0FBQyxLQUFLLGdCQUFnQixDQUFDLEdBQUc7QUFDNUMsYUFBTyxFQUFFLFVBQVUsU0FBUyxNQUFNLFNBQVMsRUFBRSxVQUFVLFNBQVMsTUFBTTtBQUFBLElBQ3hFO0FBRUEsUUFBSSwrQkFBK0IsQ0FBQyxLQUFLLCtCQUErQixDQUFDLEdBQUc7QUFDMUUsYUFBTyxFQUFFLFVBQVUsSUFBSSxjQUFjLEVBQUUsVUFBVSxHQUFHLEtBQUssRUFBRSxVQUFVLGNBQWMsRUFBRSxVQUFVO0FBQUEsSUFDakc7QUFFQSxRQUFJLG9CQUFvQixDQUFDLEtBQUssb0JBQW9CLENBQUMsR0FBRztBQUNwRCxhQUFPLEVBQUUsVUFBVSxJQUFJLGNBQWMsRUFBRSxVQUFVLEdBQUc7QUFBQSxJQUN0RDtBQUVBLFdBQU8sZ0JBQWdCLENBQUMsSUFBSSxLQUFLO0FBQUEsRUFDbkMsQ0FBQztBQUdELFNBQU8sUUFBUSxPQUFPLENBQUMsUUFBUSxVQUFVO0FBQ3ZDLFFBQUksT0FBTyxlQUFlLE9BQU8sWUFBWTtBQUMzQyxhQUFPO0FBQUEsSUFDVDtBQUNBLFFBQUksVUFBVSxHQUFHO0FBQ2YsYUFBTztBQUFBLElBQ1Q7QUFDQSxXQUFPLEtBQUMsK0JBQVUsUUFBUSxRQUFRLFFBQVEsQ0FBQyxDQUFDO0FBQUEsRUFDOUMsQ0FBQztBQUNIO0FBRUEsU0FBUyxnQkFBZ0IsUUFBd0M7QUFDL0QsUUFBTTtBQUFBLElBQ0o7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFDSixRQUFNLDhCQUEwQiw2QkFBZSw0QkFBNEI7QUFDM0UsYUFBVyxVQUFVLFNBQVM7QUFFNUIsUUFBSSxnQkFBZ0IsTUFBTSxHQUFHO0FBRTNCLFlBQU0sY0FBYyxPQUFPLFVBQVUsU0FBUyxNQUFNO0FBQ3BELFlBQU0sWUFBWSxPQUFPLFVBQVUsU0FBUyxJQUFJO0FBQ2hELFlBQU0sZ0JBQWdCLFFBQVEsTUFBTSxhQUFhLFNBQVM7QUFDMUQsVUFBSSxrQkFBa0IsT0FBTyxZQUFZO0FBQ3ZDLGdDQUF3QixvQkFBb0I7QUFBQSxVQUMxQztBQUFBLFVBQ0E7QUFBQSxVQUNBLGlCQUFpQixPQUFPO0FBQUEsVUFDeEI7QUFBQSxVQUNBO0FBQUEsUUFDRixDQUFDO0FBRUQsZUFBTztBQUFBLE1BQ1Q7QUFBQSxJQUVGLFdBQVcsK0JBQStCLE1BQU0sR0FBRztBQUVqRCxZQUFNLG9CQUFnQiw0Q0FBdUIsYUFBYSxPQUFPLFVBQVUsR0FBRztBQUM5RSxVQUFJLE9BQU8sa0JBQWtCLFVBQVU7QUFDckMsZ0NBQXdCLGtDQUFrQztBQUFBLFVBQ3hELGdCQUFnQixPQUFPLFVBQVU7QUFBQSxVQUNqQztBQUFBLFVBQ0E7QUFBQSxRQUNGLENBQUM7QUFDRCxlQUFPO0FBQUEsTUFDVDtBQUVBLFlBQU0sZ0JBQWdCLGNBQWMsTUFBTSxPQUFPLFVBQVUsYUFBYSxPQUFPLFVBQVUsU0FBUztBQUNsRyxVQUFJLGtCQUFrQixPQUFPLFlBQVk7QUFDdkMsZ0NBQXdCLG9CQUFvQjtBQUFBLFVBQzFDO0FBQUEsVUFDQSxpQkFBaUIsT0FBTztBQUFBLFVBQ3hCLGdCQUFnQixPQUFPLFVBQVU7QUFBQSxVQUNqQztBQUFBLFVBQ0EsYUFBYSxPQUFPLFVBQVU7QUFBQSxRQUNoQyxDQUFDO0FBRUQsZUFBTztBQUFBLE1BQ1Q7QUFBQSxJQUVGLFdBQVcsb0JBQW9CLE1BQU0sR0FBRztBQUV0QyxZQUFNLG9CQUFnQiw0Q0FBdUIsYUFBYSxPQUFPLFVBQVUsR0FBRztBQUM5RSxVQUFJLGtCQUFrQixPQUFPLFlBQVk7QUFDdkMsZ0NBQXdCLG9CQUFvQjtBQUFBLFVBQzFDO0FBQUEsVUFDQSxpQkFBaUIsT0FBTztBQUFBLFVBQ3hCLGdCQUFnQixPQUFPLFVBQVU7QUFBQSxVQUNqQztBQUFBLFFBQ0YsQ0FBQztBQUVELGVBQU87QUFBQSxNQUNUO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7IiwKICAibmFtZXMiOiBbXQp9Cg==
558
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2ZpbGUtY2hhbmdlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29udGFpbnMgdXRpbGl0eSB0eXBlcyBhbmQgZnVuY3Rpb25zIGZvciBoYW5kbGluZyBmaWxlIGNoYW5nZXMgaW4gT2JzaWRpYW4uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIEZyb250bWF0dGVyTGlua0NhY2hlLFxuICBSZWZlcmVuY2UsXG4gIFJlZmVyZW5jZUNhY2hlXG59IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgQ2FudmFzRGF0YSB9IGZyb20gJ29ic2lkaWFuL2NhbnZhcy5kLnRzJztcblxuaW1wb3J0IHtcbiAgaXNGcm9udG1hdHRlckxpbmtDYWNoZSxcbiAgaXNSZWZlcmVuY2VDYWNoZVxufSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0L2ltcGxlbWVudGF0aW9ucyc7XG5cbmltcG9ydCB0eXBlIHsgR2VuZXJpY09iamVjdCB9IGZyb20gJy4uL3R5cGUtZ3VhcmRzLnRzJztcbmltcG9ydCB0eXBlIHsgVmFsdWVQcm92aWRlciB9IGZyb20gJy4uL3ZhbHVlLXByb3ZpZGVyLnRzJztcbmltcG9ydCB0eXBlIHsgUGF0aE9yRmlsZSB9IGZyb20gJy4vZmlsZS1zeXN0ZW0udHMnO1xuaW1wb3J0IHR5cGUgeyBGcm9udG1hdHRlckxpbmtDYWNoZVdpdGhPZmZzZXRzIH0gZnJvbSAnLi9mcm9udG1hdHRlci1saW5rLWNhY2hlLXdpdGgtb2Zmc2V0cy50cyc7XG5pbXBvcnQgdHlwZSB7IENvbWJpbmVkRnJvbnRtYXR0ZXIgfSBmcm9tICcuL2Zyb250bWF0dGVyLnRzJztcbmltcG9ydCB0eXBlIHtcbiAgQ2FudmFzRmlsZU5vZGVSZWZlcmVuY2UsXG4gIENhbnZhc1JlZmVyZW5jZSxcbiAgQ2FudmFzVGV4dE5vZGVSZWZlcmVuY2Vcbn0gZnJvbSAnLi9yZWZlcmVuY2UudHMnO1xuaW1wb3J0IHR5cGUge1xuICBDb250ZW50QXJndW1lbnRzLFxuICBQcm9jZXNzT3B0aW9ucyxcbiAgUHJvY2Vzc1BhcmFtc1xufSBmcm9tICcuL3ZhdWx0LnRzJztcblxuaW1wb3J0IHsgZ2V0TGliRGVidWdnZXIgfSBmcm9tICcuLi9kZWJ1Zy50cyc7XG5pbXBvcnQgeyBwcmludEVycm9yIH0gZnJvbSAnLi4vZXJyb3IudHMnO1xuaW1wb3J0IHtcbiAgZ2V0TmVzdGVkUHJvcGVydHlWYWx1ZSxcbiAgaXNEZWVwRXF1YWwsXG4gIG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllcyxcbiAgc2V0TmVzdGVkUHJvcGVydHlWYWx1ZVxufSBmcm9tICcuLi9vYmplY3QtdXRpbHMudHMnO1xuaW1wb3J0IHsgcmVzb2x2ZVZhbHVlIH0gZnJvbSAnLi4vdmFsdWUtcHJvdmlkZXIudHMnO1xuaW1wb3J0IHtcbiAgZ2V0UGF0aCxcbiAgaXNDYW52YXNGaWxlXG59IGZyb20gJy4vZmlsZS1zeXN0ZW0udHMnO1xuaW1wb3J0IHtcbiAgaXNGcm9udG1hdHRlckxpbmtDYWNoZVdpdGhPZmZzZXRzLFxuICB0b0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHNcbn0gZnJvbSAnLi9mcm9udG1hdHRlci1saW5rLWNhY2hlLXdpdGgtb2Zmc2V0cy50cyc7XG5pbXBvcnQge1xuICBwYXJzZUZyb250bWF0dGVyLFxuICBzZXRGcm9udG1hdHRlclxufSBmcm9tICcuL2Zyb250bWF0dGVyLnRzJztcbmltcG9ydCB7XG4gIGlzQ2FudmFzUmVmZXJlbmNlLFxuICByZWZlcmVuY2VUb0ZpbGVDaGFuZ2Vcbn0gZnJvbSAnLi9yZWZlcmVuY2UudHMnO1xuaW1wb3J0IHsgcHJvY2VzcyB9IGZyb20gJy4vdmF1bHQudHMnO1xuXG5jb25zdCBFU0NBUEVEX1dJS0lMSU5LX0RJVklERVIgPSBTdHJpbmcucmF3YFxcfGA7XG5jb25zdCBVTkVTQ0FQRURfV0lLSUxJTktfRElWSURFUl9SRUdFWFAgPSAvKD88IVxcXFwpXFx8L2c7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGFwcGx5Q29udGVudENoYW5nZXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcGx5Q29udGVudENoYW5nZXNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFib3J0IHNpZ25hbCB0byBjb250cm9sIHRoZSBleGVjdXRpb24gb2YgdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuXG4gIC8qKlxuICAgKiBBIHByb3ZpZGVyIHRoYXQgcmV0dXJucyBhbiBhcnJheSBvZiBjb250ZW50IGNoYW5nZXMgdG8gYXBwbHkuXG4gICAqL1xuICByZWFkb25seSBjaGFuZ2VzUHJvdmlkZXI6IFZhbHVlUHJvdmlkZXI8RmlsZUNoYW5nZVtdIHwgbnVsbCwgQ29udGVudEFyZ3VtZW50cz47XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IHRvIHdoaWNoIHRoZSBjaGFuZ2VzIHNob3VsZCBiZSBhcHBsaWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byB3aGljaCB0aGUgY2hhbmdlcyBzaG91bGQgYmUgYXBwbGllZC5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0byByZXRyeSB0aGUgb3BlcmF0aW9uIGlmIHRoZSBjaGFuZ2VzIGFyZSBpbnZhbGlkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFJldHJ5T25JbnZhbGlkQ2hhbmdlcz86IGJvb2xlYW47XG59XG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBhcHBseUZpbGVDaGFuZ2VzfS5cbiAqL1xuZXhwb3J0IHR5cGUgQXBwbHlGaWxlQ2hhbmdlc09wdGlvbnMgPSBQcm9jZXNzT3B0aW9ucztcbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGFwcGx5RmlsZUNoYW5nZXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcGx5RmlsZUNoYW5nZXNQYXJhbXMgZXh0ZW5kcyBBcHBseUZpbGVDaGFuZ2VzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2Ugd2hlcmUgdGhlIGZpbGUgY2hhbmdlcyB3aWxsIGJlIGFwcGxpZWQuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSBwcm92aWRlciB0aGF0IHJldHVybnMgYW4gYXJyYXkgb2YgZmlsZSBjaGFuZ2VzIHRvIGFwcGx5LlxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbmdlc1Byb3ZpZGVyOiBWYWx1ZVByb3ZpZGVyPEZpbGVDaGFuZ2VbXSB8IG51bGwsIENvbnRlbnRBcmd1bWVudHM+O1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmaWxlIHRvIHdoaWNoIHRoZSBjaGFuZ2VzIHNob3VsZCBiZSBhcHBsaWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZXRyeSB0aGUgb3BlcmF0aW9uIGlmIHRoZSBjaGFuZ2VzIGFyZSBpbnZhbGlkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFJldHJ5T25JbnZhbGlkQ2hhbmdlcz86IGJvb2xlYW47XG59XG4vKipcbiAqIEEgZmlsZSBjaGFuZ2UgaW4gdGhlIHZhdWx0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVDaGFuZ2Uge1xuICAvKipcbiAgICogQSBuZXcgY29udGVudCB0byByZXBsYWNlIHRoZSBvbGQgY29udGVudC5cbiAgICovXG4gIG5ld0NvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogQW4gb2xkIGNvbnRlbnQgdGhhdCB3aWxsIGJlIHJlcGxhY2VkLlxuICAgKi9cbiAgb2xkQ29udGVudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHJlZmVyZW5jZSB0aGF0IGNhdXNlZCB0aGUgY2hhbmdlLlxuICAgKi9cbiAgcmVmZXJlbmNlOiBSZWZlcmVuY2U7XG59XG5pbnRlcmZhY2UgQXBwbHlDYW52YXNDaGFuZ2VzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhYm9ydCBzaWduYWwgdG8gY29udHJvbCB0aGUgZXhlY3V0aW9uIG9mIHRoZSBmdW5jdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcblxuICAvKipcbiAgICogQSBwcm92aWRlciB0aGF0IHJldHVybnMgYW4gYXJyYXkgb2YgZmlsZSBjaGFuZ2VzIHRvIGFwcGx5LlxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbmdlc1Byb3ZpZGVyOiBWYWx1ZVByb3ZpZGVyPEZpbGVDaGFuZ2VbXSB8IG51bGwsIENvbnRlbnRBcmd1bWVudHM+O1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGVudCB0byB3aGljaCB0aGUgY2hhbmdlcyBzaG91bGQgYmUgYXBwbGllZC5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gd2hpY2ggdGhlIGNoYW5nZXMgc2hvdWxkIGJlIGFwcGxpZWQuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmV0cnkgdGhlIG9wZXJhdGlvbiBpZiB0aGUgY2hhbmdlcyBhcmUgaW52YWxpZC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFJldHJ5T25JbnZhbGlkQ2hhbmdlcz86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBBcHBseUNvbnRlbnRDaGFuZ2VzVG9UZXh0UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IGNoYW5nZXMgdG8gYXBwbHkuXG4gICAqL1xuICByZWFkb25seSBjaGFuZ2VzOiBGaWxlQ2hhbmdlW107XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IHRvIHdoaWNoIHRoZSBjaGFuZ2VzIHNob3VsZCBiZSBhcHBsaWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHBhcnNpbmcgdGhlIGZyb250bWF0dGVyIGZhaWxlZC5cbiAgICovXG4gIHJlYWRvbmx5IGhhc0Zyb250bWF0dGVyRXJyb3I6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIHdoaWNoIHRoZSBjaGFuZ2VzIHNob3VsZCBiZSBhcHBsaWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQXBwbHlDb250ZW50Q2hhbmdlc1RvVGV4dFJlc3VsdCB7XG4gIHJlYWRvbmx5IGZyb250bWF0dGVyQ2hhbmdlZDogTWFwPHN0cmluZywgRnJvbnRtYXR0ZXJDaGFuZ2VXaXRoT2Zmc2V0c1tdPjtcbiAgcmVhZG9ubHkgbmV3Q29udGVudDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQXBwbHlGcm9udG1hdHRlckNoYW5nZXNXaXRoT2Zmc2V0c1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYWJvcnQgc2lnbmFsIHRvIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG5cbiAgLyoqXG4gICAqIFRoZSBmcm9udG1hdHRlciB0byB3aGljaCB0aGUgY2hhbmdlcyBzaG91bGQgYmUgYXBwbGllZC5cbiAgICovXG4gIHJlYWRvbmx5IGZyb250bWF0dGVyOiBDb21iaW5lZEZyb250bWF0dGVyPHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBBIG1hcCBvZiBmcm9udG1hdHRlciBrZXlzIHRvIHRoZSBmcm9udG1hdHRlciBjaGFuZ2VzIHdpdGggb2Zmc2V0cyB0byBhcHBseS5cbiAgICovXG4gIHJlYWRvbmx5IGZyb250bWF0dGVyQ2hhbmdlc1dpdGhPZmZzZXRNYXA6IE1hcDxzdHJpbmcsIEZyb250bWF0dGVyQ2hhbmdlV2l0aE9mZnNldHNbXT47XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIHdoaWNoIHRoZSBjaGFuZ2VzIHNob3VsZCBiZSBhcHBsaWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQnVpbGRGaW5hbENvbnRlbnRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGZyb250bWF0dGVyIHRvIHdyaXRlIGludG8gdGhlIGZpbmFsIGNvbnRlbnQuXG4gICAqL1xuICByZWFkb25seSBmcm9udG1hdHRlcjogQ29tYmluZWRGcm9udG1hdHRlcjx1bmtub3duPjtcblxuICAvKipcbiAgICogQSBtYXAgb2YgZnJvbnRtYXR0ZXIga2V5cyB0byB0aGUgZnJvbnRtYXR0ZXIgY2hhbmdlcyB3aXRoIG9mZnNldHMgdGhhdCB3ZXJlIGFwcGxpZWQuXG4gICAqL1xuICByZWFkb25seSBmcm9udG1hdHRlckNoYW5nZWQ6IE1hcDxzdHJpbmcsIEZyb250bWF0dGVyQ2hhbmdlV2l0aE9mZnNldHNbXT47XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IHRvIHdoaWNoIHRoZSBmcm9udG1hdHRlciBzaG91bGQgYmUgYXBwbGllZC5cbiAgICovXG4gIHJlYWRvbmx5IG5ld0NvbnRlbnQ6IHN0cmluZztcbn1cblxudHlwZSBDYW52YXNDaGFuZ2UgPSBGaWxlQ2hhbmdlICYgV2l0aFJlZmVyZW5jZTxDYW52YXNSZWZlcmVuY2U+O1xudHlwZSBDYW52YXNGaWxlTm9kZUNoYW5nZSA9IEZpbGVDaGFuZ2UgJiBXaXRoUmVmZXJlbmNlPENhbnZhc0ZpbGVOb2RlUmVmZXJlbmNlPjtcbnR5cGUgQ2FudmFzVGV4dE5vZGVDaGFuZ2UgPSBGaWxlQ2hhbmdlICYgV2l0aFJlZmVyZW5jZTxDYW52YXNUZXh0Tm9kZVJlZmVyZW5jZT47XG50eXBlIENvbnRlbnRDaGFuZ2UgPSBGaWxlQ2hhbmdlICYgV2l0aFJlZmVyZW5jZTxSZWZlcmVuY2VDYWNoZT47XG50eXBlIEZyb250bWF0dGVyQ2hhbmdlID0gRmlsZUNoYW5nZSAmIFdpdGhSZWZlcmVuY2U8RnJvbnRtYXR0ZXJMaW5rQ2FjaGU+O1xuXG50eXBlIEZyb250bWF0dGVyQ2hhbmdlV2l0aE9mZnNldHMgPSBGaWxlQ2hhbmdlICYgV2l0aFJlZmVyZW5jZTxGcm9udG1hdHRlckxpbmtDYWNoZVdpdGhPZmZzZXRzPjtcblxuaW50ZXJmYWNlIFBhcnNlRnJvbnRtYXR0ZXJTYWZlbHlQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNvbnRlbnQgdG8gcGFyc2UgdGhlIGZyb250bWF0dGVyIGZyb20uXG4gICAqL1xuICByZWFkb25seSBjb250ZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRoZSBjb250ZW50IGJlbG9uZ3MgdG8uXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBQYXJzZUZyb250bWF0dGVyU2FmZWx5UmVzdWx0IHtcbiAgcmVhZG9ubHkgZnJvbnRtYXR0ZXI6IENvbWJpbmVkRnJvbnRtYXR0ZXI8dW5rbm93bj47XG4gIHJlYWRvbmx5IGhhc0Zyb250bWF0dGVyRXJyb3I6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBWYWxpZGF0ZUNoYW5nZXNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNvbnRlbnQgY2hhbmdlcyB0byB2YWxpZGF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGNoYW5nZXM6IEZpbGVDaGFuZ2VbXTtcblxuICAvKipcbiAgICogVGhlIGNvbnRlbnQgdGhlIGNoYW5nZXMgc2hvdWxkIGJlIHZhbGlkYXRlZCBhZ2FpbnN0LlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZnJvbnRtYXR0ZXIgdGhlIGNoYW5nZXMgc2hvdWxkIGJlIHZhbGlkYXRlZCBhZ2FpbnN0LlxuICAgKi9cbiAgcmVhZG9ubHkgZnJvbnRtYXR0ZXI6IENvbWJpbmVkRnJvbnRtYXR0ZXI8dW5rbm93bj47XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRoZSBjaGFuZ2VzIHNob3VsZCBiZSB2YWxpZGF0ZWQgYWdhaW5zdC5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFdpdGhSZWZlcmVuY2U8UiBleHRlbmRzIFJlZmVyZW5jZT4ge1xuICByZWZlcmVuY2U6IFI7XG59XG5cbi8qKlxuICogQXBwbGllcyBhIHNlcmllcyBvZiBjb250ZW50IGNoYW5nZXMgdG8gdGhlIHNwZWNpZmllZCBjb250ZW50LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgYXBwbHlpbmcgdGhlIGNvbnRlbnQgY2hhbmdlcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHVwZGF0ZWQgY29udGVudCBvciB0byBgbnVsbGAgaWYgdXBkYXRlIGRpZG4ndCBzdWNjZWVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXBwbHlDb250ZW50Q2hhbmdlcyhwYXJhbXM6IEFwcGx5Q29udGVudENoYW5nZXNQYXJhbXMpOiBQcm9taXNlPG51bGwgfCBzdHJpbmc+IHtcbiAgY29uc3Qge1xuICAgIGFib3J0U2lnbmFsLFxuICAgIGNoYW5nZXNQcm92aWRlcixcbiAgICBjb250ZW50LFxuICAgIHBhdGgsXG4gICAgc2hvdWxkUmV0cnlPbkludmFsaWRDaGFuZ2VzID0gdHJ1ZVxuICB9ID0gcGFyYW1zO1xuICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICBsZXQgY2hhbmdlcyA9IGF3YWl0IHJlc29sdmVWYWx1ZShjaGFuZ2VzUHJvdmlkZXIsIHsgYWJvcnRTaWduYWwsIGNvbnRlbnQgfSk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gIGlmIChjaGFuZ2VzID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCB7IGZyb250bWF0dGVyLCBoYXNGcm9udG1hdHRlckVycm9yIH0gPSBwYXJzZUZyb250bWF0dGVyU2FmZWx5KHsgY29udGVudCwgcGF0aCB9KTtcblxuICBpZiAoIWFyZUNoYW5nZXNWYWxpZCh7IGNoYW5nZXMsIGNvbnRlbnQsIGZyb250bWF0dGVyLCBwYXRoIH0pKSB7XG4gICAgcmV0dXJuIHNob3VsZFJldHJ5T25JbnZhbGlkQ2hhbmdlcyA/IG51bGwgOiBjb250ZW50O1xuICB9XG5cbiAgY2hhbmdlcyA9IHNvcnRBbmRGaWx0ZXJDaGFuZ2VzKGNoYW5nZXMpO1xuXG4gIGNvbnN0IHsgZnJvbnRtYXR0ZXJDaGFuZ2VkLCBuZXdDb250ZW50IH0gPSBhcHBseUNvbnRlbnRDaGFuZ2VzVG9UZXh0KHsgY2hhbmdlcywgY29udGVudCwgaGFzRnJvbnRtYXR0ZXJFcnJvciwgcGF0aCB9KTtcblxuICBhd2FpdCBhcHBseUZyb250bWF0dGVyQ2hhbmdlc1dpdGhPZmZzZXRzKHtcbiAgICBhYm9ydFNpZ25hbCxcbiAgICBmcm9udG1hdHRlcixcbiAgICBmcm9udG1hdHRlckNoYW5nZXNXaXRoT2Zmc2V0TWFwOiBmcm9udG1hdHRlckNoYW5nZWQsXG4gICAgcGF0aFxuICB9KTtcbiAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICByZXR1cm4gYnVpbGRGaW5hbENvbnRlbnQoeyBmcm9udG1hdHRlciwgZnJvbnRtYXR0ZXJDaGFuZ2VkLCBuZXdDb250ZW50IH0pO1xufVxuXG4vKipcbiAqIEFwcGxpZXMgYSBzZXJpZXMgb2YgZmlsZSBjaGFuZ2VzIHRvIHRoZSBzcGVjaWZpZWQgZmlsZSBvciBwYXRoIHdpdGhpbiB0aGUgYXBwbGljYXRpb24uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBhcHBseWluZyB0aGUgZmlsZSBjaGFuZ2VzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBmaWxlIGNoYW5nZXMgaGF2ZSBiZWVuIHN1Y2Nlc3NmdWxseSBhcHBsaWVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXBwbHlGaWxlQ2hhbmdlcyhwYXJhbXM6IEFwcGx5RmlsZUNoYW5nZXNQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBjaGFuZ2VzUHJvdmlkZXIsXG4gICAgcGF0aE9yRmlsZSxcbiAgICBzaG91bGRSZXRyeU9uSW52YWxpZENoYW5nZXMgPSB0cnVlLFxuICAgIC4uLm9wdGlvbnNcbiAgfSA9IHBhcmFtcztcbiAgYXdhaXQgcHJvY2Vzcyhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8UHJvY2Vzc1BhcmFtcz4oe1xuICAgIGFwcCxcbiAgICBhc3luYyBuZXdDb250ZW50UHJvdmlkZXIoeyBhYm9ydFNpZ25hbCwgY29udGVudCB9KSB7XG4gICAgICBpZiAoaXNDYW52YXNGaWxlKHBhdGhPckZpbGUpKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBhcHBseUNhbnZhc0NoYW5nZXMoe1xuICAgICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICAgIGNoYW5nZXNQcm92aWRlcixcbiAgICAgICAgICBjb250ZW50LFxuICAgICAgICAgIHBhdGg6IGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKSxcbiAgICAgICAgICBzaG91bGRSZXRyeU9uSW52YWxpZENoYW5nZXNcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCBhcHBseUNvbnRlbnRDaGFuZ2VzKHtcbiAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgIGNoYW5nZXNQcm92aWRlcixcbiAgICAgICAgY29udGVudCxcbiAgICAgICAgcGF0aDogZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpLFxuICAgICAgICBzaG91bGRSZXRyeU9uSW52YWxpZENoYW5nZXNcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgcGF0aE9yRmlsZSxcbiAgICAuLi5vcHRpb25zXG4gIH0pKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBmaWxlIGNoYW5nZSBpcyBhIGNhbnZhcyBjaGFuZ2UuXG4gKlxuICogQHBhcmFtIGNoYW5nZSAtIFRoZSBmaWxlIGNoYW5nZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGZpbGUgY2hhbmdlIGlzIGEgY2FudmFzIGNoYW5nZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2FudmFzQ2hhbmdlKGNoYW5nZTogRmlsZUNoYW5nZSk6IGNoYW5nZSBpcyBDYW52YXNDaGFuZ2Uge1xuICByZXR1cm4gaXNDYW52YXNSZWZlcmVuY2UoY2hhbmdlLnJlZmVyZW5jZSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgZmlsZSBjaGFuZ2UgaXMgYSBjYW52YXMgZmlsZSBub2RlIGNoYW5nZS5cbiAqXG4gKiBAcGFyYW0gY2hhbmdlIC0gVGhlIGZpbGUgY2hhbmdlIHRvIGNoZWNrLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgZmlsZSBjaGFuZ2UgaXMgYSBjYW52YXMgZmlsZSBub2RlIGNoYW5nZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2FudmFzRmlsZU5vZGVDaGFuZ2UoY2hhbmdlOiBGaWxlQ2hhbmdlKTogY2hhbmdlIGlzIENhbnZhc0ZpbGVOb2RlQ2hhbmdlIHtcbiAgcmV0dXJuIGlzQ2FudmFzQ2hhbmdlKGNoYW5nZSkgJiYgY2hhbmdlLnJlZmVyZW5jZS50eXBlID09PSAnZmlsZSc7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgZmlsZSBjaGFuZ2UgaXMgYSBjYW52YXMgdGV4dCBub2RlIGNoYW5nZS5cbiAqXG4gKiBAcGFyYW0gY2hhbmdlIC0gVGhlIGZpbGUgY2hhbmdlIHRvIGNoZWNrLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgZmlsZSBjaGFuZ2UgaXMgYSBjYW52YXMgdGV4dCBub2RlIGNoYW5nZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2FudmFzVGV4dE5vZGVDaGFuZ2UoY2hhbmdlOiBGaWxlQ2hhbmdlKTogY2hhbmdlIGlzIENhbnZhc1RleHROb2RlQ2hhbmdlIHtcbiAgcmV0dXJuIGlzQ2FudmFzQ2hhbmdlKGNoYW5nZSkgJiYgY2hhbmdlLnJlZmVyZW5jZS50eXBlID09PSAndGV4dCc7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgZmlsZSBjaGFuZ2UgaXMgYSBjb250ZW50IGNoYW5nZS5cbiAqXG4gKiBAcGFyYW0gZmlsZUNoYW5nZSAtIFRoZSBmaWxlIGNoYW5nZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGZpbGUgY2hhbmdlIGlzIGEgY29udGVudCBjaGFuZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbnRlbnRDaGFuZ2UoZmlsZUNoYW5nZTogRmlsZUNoYW5nZSk6IGZpbGVDaGFuZ2UgaXMgQ29udGVudENoYW5nZSB7XG4gIHJldHVybiBpc1JlZmVyZW5jZUNhY2hlKGZpbGVDaGFuZ2UucmVmZXJlbmNlKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBmaWxlIGNoYW5nZSBpcyBhIGZyb250bWF0dGVyIGNoYW5nZS5cbiAqXG4gKiBAcGFyYW0gZmlsZUNoYW5nZSAtIFRoZSBmaWxlIGNoYW5nZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGZpbGUgY2hhbmdlIGlzIGEgZnJvbnRtYXR0ZXIgY2hhbmdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNGcm9udG1hdHRlckNoYW5nZShmaWxlQ2hhbmdlOiBGaWxlQ2hhbmdlKTogZmlsZUNoYW5nZSBpcyBGcm9udG1hdHRlckNoYW5nZSB7XG4gIHJldHVybiBpc0Zyb250bWF0dGVyTGlua0NhY2hlKGZpbGVDaGFuZ2UucmVmZXJlbmNlKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBmaWxlIGNoYW5nZSBpcyBhIGZyb250bWF0dGVyIGNoYW5nZSB3aXRoIG9mZnNldHMuXG4gKlxuICogQHBhcmFtIGZpbGVDaGFuZ2UgLSBUaGUgZmlsZSBjaGFuZ2UgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBmaWxlIGNoYW5nZSBpcyBhIGZyb250bWF0dGVyIGNoYW5nZSB3aXRoIG9mZnNldHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Zyb250bWF0dGVyQ2hhbmdlV2l0aE9mZnNldHMoZmlsZUNoYW5nZTogRmlsZUNoYW5nZSk6IGZpbGVDaGFuZ2UgaXMgRnJvbnRtYXR0ZXJDaGFuZ2VXaXRoT2Zmc2V0cyB7XG4gIHJldHVybiBpc0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHMoZmlsZUNoYW5nZS5yZWZlcmVuY2UpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgZnJvbnRtYXR0ZXIgY2hhbmdlIHRvIGEgZnJvbnRtYXR0ZXIgY2hhbmdlIHdpdGggb2Zmc2V0cy5cbiAqXG4gKiBAcGFyYW0gZmlsZUNoYW5nZSAtIFRoZSBmaWxlIGNoYW5nZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMgVGhlIGNvbnZlcnRlZCBmaWxlIGNoYW5nZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvRnJvbnRtYXR0ZXJDaGFuZ2VXaXRoT2Zmc2V0cyhmaWxlQ2hhbmdlOiBGcm9udG1hdHRlckNoYW5nZSk6IEZyb250bWF0dGVyQ2hhbmdlV2l0aE9mZnNldHMge1xuICBpZiAoaXNGcm9udG1hdHRlckNoYW5nZVdpdGhPZmZzZXRzKGZpbGVDaGFuZ2UpKSB7XG4gICAgcmV0dXJuIGZpbGVDaGFuZ2U7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLmZpbGVDaGFuZ2UsXG4gICAgcmVmZXJlbmNlOiB0b0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHMoZmlsZUNoYW5nZS5yZWZlcmVuY2UpXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFwcGx5Q2FudmFzQ2hhbmdlcyhwYXJhbXM6IEFwcGx5Q2FudmFzQ2hhbmdlc1BhcmFtcyk6IFByb21pc2U8bnVsbCB8IHN0cmluZz4ge1xuICBjb25zdCB7XG4gICAgYWJvcnRTaWduYWwsXG4gICAgY2hhbmdlc1Byb3ZpZGVyLFxuICAgIGNvbnRlbnQsXG4gICAgcGF0aCxcbiAgICBzaG91bGRSZXRyeU9uSW52YWxpZENoYW5nZXMgPSB0cnVlXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGNoYW5nZXMgPSBhd2FpdCByZXNvbHZlVmFsdWUoY2hhbmdlc1Byb3ZpZGVyLCB7IGFib3J0U2lnbmFsLCBjb250ZW50IH0pO1xuICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICBpZiAoY2hhbmdlcyA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgY2FudmFzRGF0YSA9IHBhcnNlSnNvblNhZmUoY29udGVudCkgYXMgR2VuZXJpY09iamVjdDxDYW52YXNEYXRhPjtcblxuICAvLyBUaGUgY29udGVudCBpcyBub3QgYSB2YWxpZCBjYW52YXMgKGEgdHJhbnNpZW50IGB7fWAgb3IgcGFydGlhbCBvYmplY3QpLlxuICAvLyBUaGlzIGhhcHBlbnMgd2hlbiBhbm90aGVyIHBsdWdpbiBpcyBzdGlsbCBpbml0aWFsaXppbmcgdGhlIGZpbGUuXG4gIC8vIFNraXAgdGhlIHJld3JpdGUgc28gbm8gbWFsZm9ybWVkIG9iamVjdCBpcyB3cml0dGVuIGJhY2sgYW5kIHRoZSByZW5kZXJlciBuZXZlciBjcmFzaGVzLlxuICAvLyBNaXJyb3JzIHRoZSBgeyBlZGdlczogW10sIG5vZGVzOiBbXSB9YCBmYWxsYmFjayBpbiBgZ2V0Q2FudmFzUmVmZXJlbmNlc2AuXG4gIGlmICghQXJyYXkuaXNBcnJheShjYW52YXNEYXRhLm5vZGVzKSB8fCAhQXJyYXkuaXNBcnJheShjYW52YXNEYXRhLmVkZ2VzKSkge1xuICAgIGdldExpYkRlYnVnZ2VyKCdGaWxlQ2hhbmdlOmFwcGx5Q2FudmFzQ2hhbmdlcycpKCdOb3QgYSB2YWxpZCBjYW52YXM7IHNraXBwaW5nIHJld3JpdGUnLCB7IHBhdGggfSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBjYW52YXNUZXh0Q2hhbmdlcyA9IG5ldyBNYXA8bnVtYmVyLCBDYW52YXNUZXh0Tm9kZUNoYW5nZVtdPigpO1xuXG4gIGZvciAoY29uc3QgY2hhbmdlIG9mIGNoYW5nZXMpIHtcbiAgICBpZiAoIWlzQ2FudmFzQ2hhbmdlKGNoYW5nZSkpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnT25seSBjYW52YXMgY2hhbmdlcyBhcmUgc3VwcG9ydGVkIGZvciBjYW52YXMgZmlsZXMnO1xuICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlLCB7XG4gICAgICAgIGNoYW5nZSxcbiAgICAgICAgcGF0aFxuICAgICAgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBub2RlID0gY2FudmFzRGF0YS5ub2Rlc1tjaGFuZ2UucmVmZXJlbmNlLm5vZGVJbmRleF07XG4gICAgaWYgKCFub2RlKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gJ05vZGUgbm90IGZvdW5kJztcbiAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSwge1xuICAgICAgICBub2RlSW5kZXg6IGNoYW5nZS5yZWZlcmVuY2Uubm9kZUluZGV4LFxuICAgICAgICBwYXRoXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChpc0NhbnZhc0ZpbGVOb2RlQ2hhbmdlKGNoYW5nZSkpIHtcbiAgICAgIGlmIChub2RlLmZpbGUgIT09IGNoYW5nZS5vbGRDb250ZW50KSB7XG4gICAgICAgIGdldExpYkRlYnVnZ2VyKCdGaWxlQ2hhbmdlOmFwcGx5Q2FudmFzQ2hhbmdlcycpKCdDb250ZW50IG1pc21hdGNoJywge1xuICAgICAgICAgIGFjdHVhbENvbnRlbnQ6IG5vZGUuZmlsZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgZXhwZWN0ZWRDb250ZW50OiBjaGFuZ2Uub2xkQ29udGVudCxcbiAgICAgICAgICBub2RlSW5kZXg6IGNoYW5nZS5yZWZlcmVuY2Uubm9kZUluZGV4LFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgdHlwZTogJ2ZpbGUnXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgbm9kZS5maWxlID0gY2hhbmdlLm5ld0NvbnRlbnQ7XG4gICAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gVGhlIGZhbHNlIGJyYW5jaCBvZiB0aGUgZWxzZS1pZiBpcyB1bnJlYWNoYWJsZTsgb25seSAnZmlsZScgYW5kICd0ZXh0JyBjYW52YXMgbm9kZSB0eXBlcyBleGlzdC4gKi9cbiAgICB9IGVsc2UgaWYgKGlzQ2FudmFzVGV4dE5vZGVDaGFuZ2UoY2hhbmdlKSkge1xuICAgICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgICAgIGxldCBjYW52YXNUZXh0Q2hhbmdlc0Zvck5vZGUgPSBjYW52YXNUZXh0Q2hhbmdlcy5nZXQoY2hhbmdlLnJlZmVyZW5jZS5ub2RlSW5kZXgpO1xuICAgICAgaWYgKCFjYW52YXNUZXh0Q2hhbmdlc0Zvck5vZGUpIHtcbiAgICAgICAgY2FudmFzVGV4dENoYW5nZXNGb3JOb2RlID0gW107XG4gICAgICAgIGNhbnZhc1RleHRDaGFuZ2VzLnNldChjaGFuZ2UucmVmZXJlbmNlLm5vZGVJbmRleCwgY2FudmFzVGV4dENoYW5nZXNGb3JOb2RlKTtcbiAgICAgIH1cblxuICAgICAgY2FudmFzVGV4dENoYW5nZXNGb3JOb2RlLnB1c2goY2hhbmdlKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IFtub2RlSW5kZXgsIGNhbnZhc1RleHRDaGFuZ2VzRm9yTm9kZV0gb2YgY2FudmFzVGV4dENoYW5nZXMpIHtcbiAgICBjb25zdCBub2RlID0gY2FudmFzRGF0YS5ub2Rlc1tub2RlSW5kZXhdO1xuICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBOb2RlIGV4aXN0ZW5jZSBpcyBhbHJlYWR5IHZlcmlmaWVkIGluIHRoZSBmaXJzdCBsb29wIGFib3ZlLiAqL1xuICAgIGlmICghbm9kZSkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9ICdOb2RlIG5vdCBmb3VuZCc7XG4gICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UsIHtcbiAgICAgICAgbm9kZUluZGV4LFxuICAgICAgICBwYXRoXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG5cbiAgICBpZiAodHlwZW9mIG5vZGUudGV4dCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnTm9kZSB0ZXh0IGlzIG5vdCBhIHN0cmluZyc7XG4gICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UsIHtcbiAgICAgICAgbm9kZUluZGV4LFxuICAgICAgICBwYXRoXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgY29udGVudENoYW5nZXMgPSBjYW52YXNUZXh0Q2hhbmdlc0Zvck5vZGUubWFwKChjaGFuZ2UpID0+IHtcbiAgICAgIC8vIEEgY2FudmFzIHRleHQgbm9kZSBjYW4gaG9sZCBhIG1hcmtkb3duIHRhYmxlLCB3aGVyZSBhIHNpemVkIGVtYmVkIGVzY2FwZXMgdGhlIHdpa2lsaW5rXG4gICAgICAvLyBEaXZpZGVyIHNvIHRoZSBwaXBlIGRvZXMgbm90IHRlcm1pbmF0ZSB0aGUgdGFibGUgY2VsbCAoYCFbW2ltZy5wbmdcXHw1MDBdXWApLiBUaGUgcmVnZW5lcmF0ZWRcbiAgICAgIC8vIExpbmsgdXNlcyBhbiB1bmVzY2FwZWQgZGl2aWRlciwgc28gcmVzdG9yZSB0aGUgZXNjYXBpbmcgd2hlbiB0aGUgb3JpZ2luYWwgcmVmZXJlbmNlIGhhZCBpdCxcbiAgICAgIC8vIEtlZXBpbmcgYm90aCB0aGUgdGFibGUgYW5kIHRoZSBlbWJlZCBzaXplIGludGFjdCBhY3Jvc3MgdGhlIHJld3JpdGUuXG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gY2hhbmdlLnJlZmVyZW5jZS5vcmlnaW5hbFJlZmVyZW5jZS5vcmlnaW5hbC5pbmNsdWRlcyhFU0NBUEVEX1dJS0lMSU5LX0RJVklERVIpXG4gICAgICAgID8gY2hhbmdlLm5ld0NvbnRlbnQucmVwbGFjZUFsbChVTkVTQ0FQRURfV0lLSUxJTktfRElWSURFUl9SRUdFWFAsICgpID0+IEVTQ0FQRURfV0lLSUxJTktfRElWSURFUilcbiAgICAgICAgOiBjaGFuZ2UubmV3Q29udGVudDtcbiAgICAgIHJldHVybiByZWZlcmVuY2VUb0ZpbGVDaGFuZ2UoY2hhbmdlLnJlZmVyZW5jZS5vcmlnaW5hbFJlZmVyZW5jZSwgbmV3Q29udGVudCk7XG4gICAgfSk7XG4gICAgbm9kZS50ZXh0ID0gYXdhaXQgYXBwbHlDb250ZW50Q2hhbmdlcyh7XG4gICAgICBhYm9ydFNpZ25hbCxcbiAgICAgIGNoYW5nZXNQcm92aWRlcjogY29udGVudENoYW5nZXMsXG4gICAgICBjb250ZW50OiBub2RlLnRleHQsXG4gICAgICBwYXRoOiBgJHtwYXRofS5ub2RlJHtTdHJpbmcobm9kZUluZGV4KX0uVklSVFVBTF9GSUxFLm1kYCxcbiAgICAgIHNob3VsZFJldHJ5T25JbnZhbGlkQ2hhbmdlc1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGNhbnZhc0RhdGEsIG51bGwsICdcXHQnKTtcbn1cblxuZnVuY3Rpb24gYXBwbHlDb250ZW50Q2hhbmdlc1RvVGV4dChwYXJhbXM6IEFwcGx5Q29udGVudENoYW5nZXNUb1RleHRQYXJhbXMpOiBBcHBseUNvbnRlbnRDaGFuZ2VzVG9UZXh0UmVzdWx0IHtcbiAgY29uc3Qge1xuICAgIGNoYW5nZXMsXG4gICAgY29udGVudCxcbiAgICBoYXNGcm9udG1hdHRlckVycm9yLFxuICAgIHBhdGhcbiAgfSA9IHBhcmFtcztcbiAgbGV0IG5ld0NvbnRlbnQgPSAnJztcbiAgbGV0IGxhc3RJbmRleCA9IDA7XG4gIGxldCBsYXN0Q29udGVudENoYW5nZTogQ29udGVudENoYW5nZSA9IHtcbiAgICBuZXdDb250ZW50OiAnJyxcbiAgICBvbGRDb250ZW50OiAnJyxcbiAgICByZWZlcmVuY2U6IHtcbiAgICAgIGxpbms6ICcnLFxuICAgICAgb3JpZ2luYWw6ICcnLFxuICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgZW5kOiB7IGNvbDogMCwgbGluZTogMCwgb2Zmc2V0OiAwIH0sXG4gICAgICAgIHN0YXJ0OiB7IGNvbDogMCwgbGluZTogMCwgb2Zmc2V0OiAwIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGNvbnN0IGZyb250bWF0dGVyQ2hhbmdlc1dpdGhPZmZzZXRNYXAgPSBuZXcgTWFwPHN0cmluZywgRnJvbnRtYXR0ZXJDaGFuZ2VXaXRoT2Zmc2V0c1tdPigpO1xuXG4gIGZvciAoY29uc3QgY2hhbmdlIG9mIGNoYW5nZXMpIHtcbiAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gQWxsIGNoYW5nZSB0eXBlcyBhcmUgaGFuZGxlZDsgdGhlIGZhbHNlIGJyYW5jaCBsZWFkcyB0byBvdGhlciBlbHNlLWlmIGNoZWNrcy4gKi9cbiAgICBpZiAoaXNDb250ZW50Q2hhbmdlKGNoYW5nZSkpIHtcbiAgICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgICBpZiAobGFzdEluZGV4IDw9IGNoYW5nZS5yZWZlcmVuY2UucG9zaXRpb24uc3RhcnQub2Zmc2V0KSB7XG4gICAgICAgIG5ld0NvbnRlbnQgKz0gY29udGVudC5zbGljZShsYXN0SW5kZXgsIGNoYW5nZS5yZWZlcmVuY2UucG9zaXRpb24uc3RhcnQub2Zmc2V0KTtcbiAgICAgICAgbmV3Q29udGVudCArPSBjaGFuZ2UubmV3Q29udGVudDtcbiAgICAgICAgbGFzdEluZGV4ID0gY2hhbmdlLnJlZmVyZW5jZS5wb3NpdGlvbi5lbmQub2Zmc2V0O1xuICAgICAgICBsYXN0Q29udGVudENoYW5nZSA9IGNoYW5nZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG92ZXJsYXBwaW5nU3RhcnRPZmZzZXQgPSBjaGFuZ2UucmVmZXJlbmNlLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldCAtIGxhc3RDb250ZW50Q2hhbmdlLnJlZmVyZW5jZS5wb3NpdGlvbi5zdGFydC5vZmZzZXQ7XG4gICAgICAgIGNvbnN0IG92ZXJsYXBwaW5nRW5kT2Zmc2V0ID0gY2hhbmdlLnJlZmVyZW5jZS5wb3NpdGlvbi5lbmQub2Zmc2V0IC0gbGFzdENvbnRlbnRDaGFuZ2UucmVmZXJlbmNlLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldDtcbiAgICAgICAgY29uc3Qgb3ZlcmxhcHBpbmdDb250ZW50ID0gbGFzdENvbnRlbnRDaGFuZ2UubmV3Q29udGVudC5zbGljZShvdmVybGFwcGluZ1N0YXJ0T2Zmc2V0LCBvdmVybGFwcGluZ0VuZE9mZnNldCk7XG4gICAgICAgIGlmIChvdmVybGFwcGluZ0NvbnRlbnQgIT09IGNoYW5nZS5vbGRDb250ZW50KSB7XG4gICAgICAgICAgY29uc3QgbWVzc2FnZSA9ICdPdmVybGFwcGluZyBjaGFuZ2VzJztcbiAgICAgICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UsIHsgY2hhbmdlLCBsYXN0Q29udGVudENoYW5nZSB9KTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQuc2xpY2UoMCwgbmV3Q29udGVudC5sZW5ndGggLSBsYXN0Q29udGVudENoYW5nZS5uZXdDb250ZW50Lmxlbmd0aClcbiAgICAgICAgICArIGxhc3RDb250ZW50Q2hhbmdlLm5ld0NvbnRlbnQuc2xpY2UoMCwgb3ZlcmxhcHBpbmdTdGFydE9mZnNldClcbiAgICAgICAgICArIGNoYW5nZS5uZXdDb250ZW50XG4gICAgICAgICAgKyBsYXN0Q29udGVudENoYW5nZS5uZXdDb250ZW50LnNsaWNlKG92ZXJsYXBwaW5nRW5kT2Zmc2V0KTtcbiAgICAgIH1cbiAgICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBBbGwgY2hhbmdlIHR5cGVzIGFyZSBoYW5kbGVkIGFib3ZlOyBubyB1bmtub3duIGNoYW5nZSB0eXBlcyBpbiBwcmFjdGljZS4gKi9cbiAgICB9IGVsc2UgaWYgKGlzRnJvbnRtYXR0ZXJDaGFuZ2UoY2hhbmdlKSkge1xuICAgICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBWYWxpZGF0aW9uIHJlamVjdHMgZnJvbnRtYXR0ZXIgY2hhbmdlcyB3aGVuIHBhcnNpbmcgZmFpbHMsIHNvIHRoaXMgYnJhbmNoIGlzIHVucmVhY2hhYmxlLiAqL1xuICAgICAgaWYgKGhhc0Zyb250bWF0dGVyRXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgQ2Fubm90IGFwcGx5IGZyb250bWF0dGVyIGNoYW5nZSBpbiAke3BhdGh9LCBiZWNhdXNlIGZyb250bWF0dGVyIHBhcnNpbmcgZmFpbGVkYCwgeyBjaGFuZ2UgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICBsZXQgZnJvbnRtYXR0ZXJDaGFuZ2VzV2l0aE9mZnNldHMgPSBmcm9udG1hdHRlckNoYW5nZXNXaXRoT2Zmc2V0TWFwLmdldChjaGFuZ2UucmVmZXJlbmNlLmtleSk7XG4gICAgICAgIGlmICghZnJvbnRtYXR0ZXJDaGFuZ2VzV2l0aE9mZnNldHMpIHtcbiAgICAgICAgICBmcm9udG1hdHRlckNoYW5nZXNXaXRoT2Zmc2V0cyA9IFtdO1xuICAgICAgICAgIGZyb250bWF0dGVyQ2hhbmdlc1dpdGhPZmZzZXRNYXAuc2V0KGNoYW5nZS5yZWZlcmVuY2Uua2V5LCBmcm9udG1hdHRlckNoYW5nZXNXaXRoT2Zmc2V0cyk7XG4gICAgICAgIH1cbiAgICAgICAgZnJvbnRtYXR0ZXJDaGFuZ2VzV2l0aE9mZnNldHMucHVzaCh0b0Zyb250bWF0dGVyQ2hhbmdlV2l0aE9mZnNldHMoY2hhbmdlKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmV3Q29udGVudCArPSBjb250ZW50LnNsaWNlKGxhc3RJbmRleCk7XG5cbiAgcmV0dXJuIHsgZnJvbnRtYXR0ZXJDaGFuZ2VkOiBmcm9udG1hdHRlckNoYW5nZXNXaXRoT2Zmc2V0TWFwLCBuZXdDb250ZW50IH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFwcGx5RnJvbnRtYXR0ZXJDaGFuZ2VzV2l0aE9mZnNldHMocGFyYW1zOiBBcHBseUZyb250bWF0dGVyQ2hhbmdlc1dpdGhPZmZzZXRzUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBhYm9ydFNpZ25hbCxcbiAgICBmcm9udG1hdHRlcixcbiAgICBmcm9udG1hdHRlckNoYW5nZXNXaXRoT2Zmc2V0TWFwLFxuICAgIHBhdGhcbiAgfSA9IHBhcmFtcztcbiAgZm9yIChjb25zdCBba2V5LCBmcm9udG1hdHRlckNoYW5nZXNXaXRoT2Zmc2V0c10gb2YgZnJvbnRtYXR0ZXJDaGFuZ2VzV2l0aE9mZnNldE1hcCkge1xuICAgIGNvbnN0IHByb3BlcnR5VmFsdWUgPSBnZXROZXN0ZWRQcm9wZXJ0eVZhbHVlKGZyb250bWF0dGVyLCBrZXkpO1xuICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBWYWxpZGF0aW9uIGVuc3VyZXMgdGhlIHByb3BlcnR5IGlzIGEgc3RyaW5nIGJlZm9yZSByZWFjaGluZyB0aGlzIHBvaW50LiAqL1xuICAgIGlmICh0eXBlb2YgcHJvcGVydHlWYWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLyogdjggaWdub3JlIHN0b3AgKi9cblxuICAgIGNvbnN0IGNvbnRlbnRDaGFuZ2VzOiBDb250ZW50Q2hhbmdlW10gPSBmcm9udG1hdHRlckNoYW5nZXNXaXRoT2Zmc2V0cy5tYXAoKGNoYW5nZSkgPT4gKHtcbiAgICAgIG5ld0NvbnRlbnQ6IGNoYW5nZS5uZXdDb250ZW50LFxuICAgICAgb2xkQ29udGVudDogY2hhbmdlLm9sZENvbnRlbnQsXG4gICAgICByZWZlcmVuY2U6IHtcbiAgICAgICAgbGluazogJycsXG4gICAgICAgIG9yaWdpbmFsOiAnJyxcbiAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICBlbmQ6IHtcbiAgICAgICAgICAgIGNvbDogY2hhbmdlLnJlZmVyZW5jZS5lbmRPZmZzZXQsXG4gICAgICAgICAgICBsaW5lOiAwLFxuICAgICAgICAgICAgb2Zmc2V0OiBjaGFuZ2UucmVmZXJlbmNlLmVuZE9mZnNldFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RhcnQ6IHtcbiAgICAgICAgICAgIGNvbDogY2hhbmdlLnJlZmVyZW5jZS5zdGFydE9mZnNldCxcbiAgICAgICAgICAgIGxpbmU6IDAsXG4gICAgICAgICAgICBvZmZzZXQ6IGNoYW5nZS5yZWZlcmVuY2Uuc3RhcnRPZmZzZXRcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSk7XG5cbiAgICBjb25zdCBuZXdQcm9wZXJ0eVZhbHVlID0gYXdhaXQgYXBwbHlDb250ZW50Q2hhbmdlcyh7XG4gICAgICBhYm9ydFNpZ25hbCxcbiAgICAgIGNoYW5nZXNQcm92aWRlcjogY29udGVudENoYW5nZXMsXG4gICAgICBjb250ZW50OiBwcm9wZXJ0eVZhbHVlLFxuICAgICAgcGF0aDogYCR7cGF0aH0uZnJvbnRtYXR0ZXIuJHtrZXl9LlZJUlRVQUxfRklMRS5tZGBcbiAgICB9KTtcbiAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gSW5uZXIgYXBwbHlDb250ZW50Q2hhbmdlcyB1c2VzIHZhbGlkYXRlZCBvZmZzZXRzLCBzbyBudWxsIGlzIG5vdCBleHBlY3RlZC4gKi9cbiAgICBpZiAobmV3UHJvcGVydHlWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuXG4gICAgc2V0TmVzdGVkUHJvcGVydHlWYWx1ZSh7XG4gICAgICAkb2JqZWN0OiBmcm9udG1hdHRlcixcbiAgICAgIHBhdGg6IGtleSxcbiAgICAgIHZhbHVlOiBuZXdQcm9wZXJ0eVZhbHVlXG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXJlQ2hhbmdlc1ZhbGlkKHBhcmFtczogVmFsaWRhdGVDaGFuZ2VzUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHtcbiAgICBjaGFuZ2VzLFxuICAgIGNvbnRlbnQsXG4gICAgZnJvbnRtYXR0ZXIsXG4gICAgcGF0aFxuICB9ID0gcGFyYW1zO1xuICBjb25zdCB2YWxpZGF0ZUNoYW5nZXNEZWJ1Z2dlciA9IGdldExpYkRlYnVnZ2VyKCdGaWxlQ2hhbmdlOnZhbGlkYXRlQ2hhbmdlcycpO1xuICBmb3IgKGNvbnN0IGNoYW5nZSBvZiBjaGFuZ2VzKSB7XG4gICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIEFsbCBjaGFuZ2UgdHlwZXMgYXJlIGhhbmRsZWQ7IHRoZSBmYWxzZSBicmFuY2ggbGVhZHMgdG8gb3RoZXIgZWxzZS1pZiBjaGVja3MuICovXG4gICAgaWYgKGlzQ29udGVudENoYW5nZShjaGFuZ2UpKSB7XG4gICAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICAgICAgY29uc3Qgc3RhcnRPZmZzZXQgPSBjaGFuZ2UucmVmZXJlbmNlLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldDtcbiAgICAgIGNvbnN0IGVuZE9mZnNldCA9IGNoYW5nZS5yZWZlcmVuY2UucG9zaXRpb24uZW5kLm9mZnNldDtcbiAgICAgIGNvbnN0IGFjdHVhbENvbnRlbnQgPSBjb250ZW50LnNsaWNlKHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQpO1xuICAgICAgaWYgKGFjdHVhbENvbnRlbnQgIT09IGNoYW5nZS5vbGRDb250ZW50KSB7XG4gICAgICAgIHZhbGlkYXRlQ2hhbmdlc0RlYnVnZ2VyKCdDb250ZW50IG1pc21hdGNoJywge1xuICAgICAgICAgIGFjdHVhbENvbnRlbnQsXG4gICAgICAgICAgZW5kT2Zmc2V0LFxuICAgICAgICAgIGV4cGVjdGVkQ29udGVudDogY2hhbmdlLm9sZENvbnRlbnQsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICBzdGFydE9mZnNldFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gQWxsIGNoYW5nZSB0eXBlcyBhcmUgaGFuZGxlZDsgbm8gdW5rbm93biBjaGFuZ2UgdHlwZXMgaW4gcHJhY3RpY2UuICovXG4gICAgfSBlbHNlIGlmIChpc0Zyb250bWF0dGVyQ2hhbmdlV2l0aE9mZnNldHMoY2hhbmdlKSkge1xuICAgICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgICAgIGNvbnN0IHByb3BlcnR5VmFsdWUgPSBnZXROZXN0ZWRQcm9wZXJ0eVZhbHVlKGZyb250bWF0dGVyLCBjaGFuZ2UucmVmZXJlbmNlLmtleSk7XG4gICAgICBpZiAodHlwZW9mIHByb3BlcnR5VmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHZhbGlkYXRlQ2hhbmdlc0RlYnVnZ2VyKCdQcm9wZXJ0eSB2YWx1ZSBpcyBub3QgYSBzdHJpbmcnLCB7XG4gICAgICAgICAgZnJvbnRtYXR0ZXJLZXk6IGNoYW5nZS5yZWZlcmVuY2Uua2V5LFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgcHJvcGVydHlWYWx1ZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhY3R1YWxDb250ZW50ID0gcHJvcGVydHlWYWx1ZS5zbGljZShjaGFuZ2UucmVmZXJlbmNlLnN0YXJ0T2Zmc2V0LCBjaGFuZ2UucmVmZXJlbmNlLmVuZE9mZnNldCk7XG4gICAgICBpZiAoYWN0dWFsQ29udGVudCAhPT0gY2hhbmdlLm9sZENvbnRlbnQpIHtcbiAgICAgICAgdmFsaWRhdGVDaGFuZ2VzRGVidWdnZXIoJ0NvbnRlbnQgbWlzbWF0Y2gnLCB7XG4gICAgICAgICAgYWN0dWFsQ29udGVudCxcbiAgICAgICAgICBleHBlY3RlZENvbnRlbnQ6IGNoYW5nZS5vbGRDb250ZW50LFxuICAgICAgICAgIGZyb250bWF0dGVyS2V5OiBjaGFuZ2UucmVmZXJlbmNlLmtleSxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIHN0YXJ0T2Zmc2V0OiBjaGFuZ2UucmVmZXJlbmNlLnN0YXJ0T2Zmc2V0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBBbGwgY2hhbmdlIHR5cGVzIGFyZSBoYW5kbGVkIGFib3ZlOyBubyB1bmtub3duIGNoYW5nZSB0eXBlcyBpbiBwcmFjdGljZS4gKi9cbiAgICB9IGVsc2UgaWYgKGlzRnJvbnRtYXR0ZXJDaGFuZ2UoY2hhbmdlKSkge1xuICAgICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgICAgIGNvbnN0IGFjdHVhbENvbnRlbnQgPSBnZXROZXN0ZWRQcm9wZXJ0eVZhbHVlKGZyb250bWF0dGVyLCBjaGFuZ2UucmVmZXJlbmNlLmtleSk7XG4gICAgICBpZiAoYWN0dWFsQ29udGVudCAhPT0gY2hhbmdlLm9sZENvbnRlbnQpIHtcbiAgICAgICAgdmFsaWRhdGVDaGFuZ2VzRGVidWdnZXIoJ0NvbnRlbnQgbWlzbWF0Y2gnLCB7XG4gICAgICAgICAgYWN0dWFsQ29udGVudCxcbiAgICAgICAgICBleHBlY3RlZENvbnRlbnQ6IGNoYW5nZS5vbGRDb250ZW50LFxuICAgICAgICAgIGZyb250bWF0dGVyS2V5OiBjaGFuZ2UucmVmZXJlbmNlLmtleSxcbiAgICAgICAgICBwYXRoXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gYnVpbGRGaW5hbENvbnRlbnQocGFyYW1zOiBCdWlsZEZpbmFsQ29udGVudFBhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHtcbiAgICBmcm9udG1hdHRlcixcbiAgICBmcm9udG1hdHRlckNoYW5nZWQsXG4gICAgbmV3Q29udGVudFxuICB9ID0gcGFyYW1zO1xuICBpZiAoZnJvbnRtYXR0ZXJDaGFuZ2VkLnNpemUgPiAwKSB7XG4gICAgcmV0dXJuIHNldEZyb250bWF0dGVyKG5ld0NvbnRlbnQsIGZyb250bWF0dGVyKTtcbiAgfVxuICByZXR1cm4gbmV3Q29udGVudDtcbn1cblxuZnVuY3Rpb24gcGFyc2VGcm9udG1hdHRlclNhZmVseShwYXJhbXM6IFBhcnNlRnJvbnRtYXR0ZXJTYWZlbHlQYXJhbXMpOiBQYXJzZUZyb250bWF0dGVyU2FmZWx5UmVzdWx0IHtcbiAgY29uc3QgeyBjb250ZW50LCBwYXRoIH0gPSBwYXJhbXM7XG4gIGxldCBmcm9udG1hdHRlcjogQ29tYmluZWRGcm9udG1hdHRlcjx1bmtub3duPiA9IHt9O1xuICBsZXQgaGFzRnJvbnRtYXR0ZXJFcnJvciA9IGZhbHNlO1xuXG4gIHRyeSB7XG4gICAgZnJvbnRtYXR0ZXIgPSBwYXJzZUZyb250bWF0dGVyKGNvbnRlbnQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHByaW50RXJyb3IobmV3IEVycm9yKGBGcm9udG1hdHRlciBwYXJzaW5nIGZhaWxlZCBpbiAke3BhdGh9YCwgeyBjYXVzZTogZXJyb3IgfSkpO1xuICAgIGhhc0Zyb250bWF0dGVyRXJyb3IgPSB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHsgZnJvbnRtYXR0ZXIsIGhhc0Zyb250bWF0dGVyRXJyb3IgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VKc29uU2FmZShjb250ZW50OiBzdHJpbmcpOiBHZW5lcmljT2JqZWN0IHtcbiAgbGV0IHBhcnNlZDogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICBwYXJzZWQgPSBKU09OLnBhcnNlKGNvbnRlbnQpO1xuICB9IGNhdGNoIHtcbiAgICBwYXJzZWQgPSBudWxsO1xuICB9XG5cbiAgaWYgKHBhcnNlZCA9PT0gbnVsbCB8fCB0eXBlb2YgcGFyc2VkICE9PSAnb2JqZWN0Jykge1xuICAgIHBhcnNlZCA9IHt9O1xuICB9XG5cbiAgcmV0dXJuIHBhcnNlZCBhcyBHZW5lcmljT2JqZWN0O1xufVxuXG5mdW5jdGlvbiBzb3J0QW5kRmlsdGVyQ2hhbmdlcyhjaGFuZ2VzOiBGaWxlQ2hhbmdlW10pOiBGaWxlQ2hhbmdlW10ge1xuICAvLyBTb3J0IGNoYW5nZXMgYnkgdHlwZSBhbmQgcG9zaXRpb25cbiAgY2hhbmdlcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgaWYgKGlzQ29udGVudENoYW5nZShhKSAmJiBpc0NvbnRlbnRDaGFuZ2UoYikpIHtcbiAgICAgIHJldHVybiBhLnJlZmVyZW5jZS5wb3NpdGlvbi5zdGFydC5vZmZzZXQgLSBiLnJlZmVyZW5jZS5wb3NpdGlvbi5zdGFydC5vZmZzZXQ7XG4gICAgfVxuXG4gICAgaWYgKGlzRnJvbnRtYXR0ZXJDaGFuZ2VXaXRoT2Zmc2V0cyhhKSAmJiBpc0Zyb250bWF0dGVyQ2hhbmdlV2l0aE9mZnNldHMoYikpIHtcbiAgICAgIHJldHVybiBhLnJlZmVyZW5jZS5rZXkubG9jYWxlQ29tcGFyZShiLnJlZmVyZW5jZS5rZXkpIHx8IGEucmVmZXJlbmNlLnN0YXJ0T2Zmc2V0IC0gYi5yZWZlcmVuY2Uuc3RhcnRPZmZzZXQ7XG4gICAgfVxuXG4gICAgaWYgKGlzRnJvbnRtYXR0ZXJDaGFuZ2UoYSkgJiYgaXNGcm9udG1hdHRlckNoYW5nZShiKSkge1xuICAgICAgcmV0dXJuIGEucmVmZXJlbmNlLmtleS5sb2NhbGVDb21wYXJlKGIucmVmZXJlbmNlLmtleSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzQ29udGVudENoYW5nZShhKSA/IC0xIDogMTtcbiAgfSk7XG5cbiAgLy8gRmlsdGVyIG91dCBkdXBsaWNhdGUgYW5kIG5vLW9wIGNoYW5nZXNcbiAgcmV0dXJuIGNoYW5nZXMuZmlsdGVyKChjaGFuZ2UsIGluZGV4KSA9PiB7XG4gICAgaWYgKGNoYW5nZS5vbGRDb250ZW50ID09PSBjaGFuZ2UubmV3Q29udGVudCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gIWlzRGVlcEVxdWFsKGNoYW5nZSwgY2hhbmdlc1tpbmRleCAtIDFdKTtcbiAgfSk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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
@@ -9,7 +9,7 @@ import type { ValueProvider } from '../value-provider.cjs';
9
9
  import type { PathOrFile } from './file-system.cjs';
10
10
  import type { FrontmatterLinkCacheWithOffsets } from './frontmatter-link-cache-with-offsets.cjs';
11
11
  import type { CanvasFileNodeReference, CanvasReference, CanvasTextNodeReference } from './reference.cjs';
12
- import type { ContentArgs, ProcessOptions } from './vault.cjs';
12
+ import type { ContentArguments, ProcessOptions } from './vault.cjs';
13
13
  /**
14
14
  * Parameters for {@link applyContentChanges}.
15
15
  */
@@ -21,7 +21,7 @@ export interface ApplyContentChangesParams {
21
21
  /**
22
22
  * A provider that returns an array of content changes to apply.
23
23
  */
24
- readonly changesProvider: ValueProvider<FileChange[] | null, ContentArgs>;
24
+ readonly changesProvider: ValueProvider<FileChange[] | null, ContentArguments>;
25
25
  /**
26
26
  * The content to which the changes should be applied.
27
27
  */
@@ -52,7 +52,7 @@ export interface ApplyFileChangesParams extends ApplyFileChangesOptions {
52
52
  /**
53
53
  * A provider that returns an array of file changes to apply.
54
54
  */
55
- readonly changesProvider: ValueProvider<FileChange[] | null, ContentArgs>;
55
+ readonly changesProvider: ValueProvider<FileChange[] | null, ContentArguments>;
56
56
  /**
57
57
  * The path or file to which the changes should be applied.
58
58
  */