@mnaoumov/obsidian-lib 3.3.0 → 3.4.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 (776) hide show
  1. package/README.md +6 -0
  2. package/dist/lib/cjs/@types/i18next.d.cts +1 -1
  3. package/dist/lib/cjs/@types/obsidian-integration-testing.d.cts +3 -3
  4. package/dist/lib/cjs/@types/original-fs.d.cts +2 -1
  5. package/dist/lib/cjs/__merged.cjs +2 -21
  6. package/dist/lib/cjs/__merged.d.cts +1 -1
  7. package/dist/lib/cjs/active-file-provider.cjs +1 -47
  8. package/dist/lib/cjs/active-file-provider.d.cts +1 -1
  9. package/dist/lib/cjs/app.cjs +1 -47
  10. package/dist/lib/cjs/app.d.cts +1 -1
  11. package/dist/lib/cjs/async-with-notice.cjs +2 -21
  12. package/dist/lib/cjs/async-with-notice.d.cts +2 -1
  13. package/dist/lib/cjs/attachment-path.cjs +2 -21
  14. package/dist/lib/cjs/attachment-path.d.cts +1 -1
  15. package/dist/lib/cjs/attachment-unit-folder.cjs +2 -21
  16. package/dist/lib/cjs/attachment-unit-folder.d.cts +1 -1
  17. package/dist/lib/cjs/backlink-index.cjs +2 -21
  18. package/dist/lib/cjs/backlink-index.d.cts +1 -1
  19. package/dist/lib/cjs/backlink.cjs +2 -21
  20. package/dist/lib/cjs/backlink.d.cts +1 -1
  21. package/dist/lib/cjs/bases-view-registrar.cjs +2 -21
  22. package/dist/lib/cjs/bases-view-registrar.d.cts +1 -1
  23. package/dist/lib/cjs/callout.cjs +2 -21
  24. package/dist/lib/cjs/callout.d.cts +2 -1
  25. package/dist/lib/cjs/canvas.cjs +2 -21
  26. package/dist/lib/cjs/canvas.d.cts +1 -1
  27. package/dist/lib/cjs/case-insensitive-file-index.cjs +2 -21
  28. package/dist/lib/cjs/case-insensitive-file-index.d.cts +1 -1
  29. package/dist/lib/cjs/code-block-markdown-information.cjs +1 -47
  30. package/dist/lib/cjs/code-block-markdown-information.d.cts +1 -1
  31. package/dist/lib/cjs/code-block-reg-exp.cjs +1 -47
  32. package/dist/lib/cjs/code-block-reg-exp.d.cts +1 -1
  33. package/dist/lib/cjs/codemirror/index.cjs +2 -48
  34. package/dist/lib/cjs/codemirror/index.d.cts +1 -1
  35. package/dist/lib/cjs/codemirror/state-field-spec.cjs +1 -47
  36. package/dist/lib/cjs/codemirror/state-field-spec.d.cts +1 -1
  37. package/dist/lib/cjs/command-handlers/abstract-file-command-handler.cjs +2 -21
  38. package/dist/lib/cjs/command-handlers/abstract-file-command-handler.d.cts +1 -1
  39. package/dist/lib/cjs/command-handlers/command-handler-component.cjs +2 -21
  40. package/dist/lib/cjs/command-handlers/command-handler-component.d.cts +1 -1
  41. package/dist/lib/cjs/command-handlers/command-handler.cjs +2 -21
  42. package/dist/lib/cjs/command-handlers/command-handler.d.cts +1 -1
  43. package/dist/lib/cjs/command-handlers/editor-command-handler.cjs +2 -21
  44. package/dist/lib/cjs/command-handlers/editor-command-handler.d.cts +1 -1
  45. package/dist/lib/cjs/command-handlers/file-command-handler.cjs +5 -24
  46. package/dist/lib/cjs/command-handlers/file-command-handler.d.cts +1 -1
  47. package/dist/lib/cjs/command-handlers/folder-command-handler.cjs +5 -24
  48. package/dist/lib/cjs/command-handlers/folder-command-handler.d.cts +1 -1
  49. package/dist/lib/cjs/command-handlers/global-command-handler.cjs +3 -22
  50. package/dist/lib/cjs/command-handlers/global-command-handler.d.cts +1 -1
  51. package/dist/lib/cjs/command-handlers/index.cjs +11 -57
  52. package/dist/lib/cjs/command-handlers/index.d.cts +1 -1
  53. package/dist/lib/cjs/command-handlers/open-demo-vault-command-handler.cjs +2 -21
  54. package/dist/lib/cjs/command-handlers/open-demo-vault-command-handler.d.cts +1 -1
  55. package/dist/lib/cjs/command-handlers/open-settings-command-handler.cjs +1 -47
  56. package/dist/lib/cjs/command-handlers/open-settings-command-handler.d.cts +1 -1
  57. package/dist/lib/cjs/command-handlers/unlock-active-note-command-handler.cjs +1 -47
  58. package/dist/lib/cjs/command-handlers/unlock-active-note-command-handler.d.cts +1 -1
  59. package/dist/lib/cjs/command-registrar.cjs +1 -47
  60. package/dist/lib/cjs/command-registrar.d.cts +1 -1
  61. package/dist/lib/cjs/community-plugins.cjs +2 -21
  62. package/dist/lib/cjs/community-plugins.d.cts +1 -1
  63. package/dist/lib/cjs/components/abort-signal-component.cjs +2 -21
  64. package/dist/lib/cjs/components/abort-signal-component.d.cts +2 -1
  65. package/dist/lib/cjs/components/all-windows-event-component.cjs +1 -47
  66. package/dist/lib/cjs/components/all-windows-event-component.d.cts +2 -1
  67. package/dist/lib/cjs/components/async-error-handler-component.cjs +2 -21
  68. package/dist/lib/cjs/components/async-error-handler-component.d.cts +1 -1
  69. package/dist/lib/cjs/components/async-events-component.cjs +2 -21
  70. package/dist/lib/cjs/components/async-events-component.d.cts +1 -1
  71. package/dist/lib/cjs/components/case-insensitive-file-index-component.cjs +1 -47
  72. package/dist/lib/cjs/components/case-insensitive-file-index-component.d.cts +1 -1
  73. package/dist/lib/cjs/components/component-ex.cjs +3 -16
  74. package/dist/lib/cjs/components/component-ex.d.cts +1 -1
  75. package/dist/lib/cjs/components/console-debug-component.cjs +2 -21
  76. package/dist/lib/cjs/components/console-debug-component.d.cts +2 -2
  77. package/dist/lib/cjs/components/core-plugin-toggle-component.cjs +2 -21
  78. package/dist/lib/cjs/components/core-plugin-toggle-component.d.cts +1 -1
  79. package/dist/lib/cjs/components/disposable-component.cjs +3 -16
  80. package/dist/lib/cjs/components/disposable-component.d.cts +1 -1
  81. package/dist/lib/cjs/components/embed-extensions-component.cjs +1 -47
  82. package/dist/lib/cjs/components/embed-extensions-component.d.cts +1 -1
  83. package/dist/lib/cjs/components/generate-markdown-link-default-params-component.cjs +1 -47
  84. package/dist/lib/cjs/components/generate-markdown-link-default-params-component.d.cts +1 -1
  85. package/dist/lib/cjs/components/index.cjs +30 -76
  86. package/dist/lib/cjs/components/index.d.cts +1 -1
  87. package/dist/lib/cjs/components/layout-ready-component.cjs +2 -21
  88. package/dist/lib/cjs/components/layout-ready-component.d.cts +1 -1
  89. package/dist/lib/cjs/components/menu-event-registrar-component.cjs +1 -47
  90. package/dist/lib/cjs/components/menu-event-registrar-component.d.cts +1 -1
  91. package/dist/lib/cjs/components/monkey-around-component.cjs +2 -21
  92. package/dist/lib/cjs/components/monkey-around-component.d.cts +1 -1
  93. package/dist/lib/cjs/components/notebook-navigator-menu-event-registrar-component.cjs +2 -21
  94. package/dist/lib/cjs/components/notebook-navigator-menu-event-registrar-component.d.cts +1 -1
  95. package/dist/lib/cjs/components/plugin-context-component.cjs +2 -21
  96. package/dist/lib/cjs/components/plugin-context-component.d.cts +1 -1
  97. package/dist/lib/cjs/components/plugin-gate-component.cjs +2 -21
  98. package/dist/lib/cjs/components/plugin-gate-component.d.cts +2 -1
  99. package/dist/lib/cjs/components/plugin-notice-component.cjs +3 -16
  100. package/dist/lib/cjs/components/plugin-notice-component.d.cts +2 -1
  101. package/dist/lib/cjs/components/plugin-settings-component.cjs +2 -21
  102. package/dist/lib/cjs/components/plugin-settings-component.d.cts +1 -1
  103. package/dist/lib/cjs/components/plugin-settings-tab-component.cjs +2 -21
  104. package/dist/lib/cjs/components/plugin-settings-tab-component.d.cts +1 -1
  105. package/dist/lib/cjs/components/plugin-suggestion-component.cjs +2 -21
  106. package/dist/lib/cjs/components/plugin-suggestion-component.d.cts +2 -1
  107. package/dist/lib/cjs/components/pointer-position-component.cjs +1 -47
  108. package/dist/lib/cjs/components/pointer-position-component.d.cts +1 -1
  109. package/dist/lib/cjs/components/registry-component.cjs +2 -21
  110. package/dist/lib/cjs/components/registry-component.d.cts +1 -1
  111. package/dist/lib/cjs/components/release-notes-component.cjs +2 -21
  112. package/dist/lib/cjs/components/release-notes-component.d.cts +2 -1
  113. package/dist/lib/cjs/components/rename-delete-handler-component.cjs +3 -16
  114. package/dist/lib/cjs/components/rename-delete-handler-component.d.cts +1 -1
  115. package/dist/lib/cjs/components/rmdir-guard-component.cjs +1 -47
  116. package/dist/lib/cjs/components/rmdir-guard-component.d.cts +1 -1
  117. package/dist/lib/cjs/components/settings-migration-component.cjs +2 -21
  118. package/dist/lib/cjs/components/settings-migration-component.d.cts +1 -1
  119. package/dist/lib/cjs/components/syntax-highlighting-component.cjs +2 -21
  120. package/dist/lib/cjs/components/syntax-highlighting-component.d.cts +1 -1
  121. package/dist/lib/cjs/components/templates-language-component.cjs +3 -49
  122. package/dist/lib/cjs/components/templates-language-component.d.cts +1 -1
  123. package/dist/lib/cjs/constructors/get-dom-events-handlers-constructor.cjs +3 -16
  124. package/dist/lib/cjs/constructors/get-dom-events-handlers-constructor.d.cts +1 -1
  125. package/dist/lib/cjs/constructors/index.cjs +2 -48
  126. package/dist/lib/cjs/constructors/index.d.cts +1 -1
  127. package/dist/lib/cjs/css-class.cjs +1 -47
  128. package/dist/lib/cjs/css-class.d.cts +1 -1
  129. package/dist/lib/cjs/data-handler.cjs +1 -47
  130. package/dist/lib/cjs/data-handler.d.cts +1 -1
  131. package/dist/lib/cjs/dataview-link.cjs +2 -21
  132. package/dist/lib/cjs/dataview-link.d.cts +1 -1
  133. package/dist/lib/cjs/dataview.cjs +2 -21
  134. package/dist/lib/cjs/dataview.d.cts +2 -1
  135. package/dist/lib/cjs/debug.cjs +2 -21
  136. package/dist/lib/cjs/debug.d.cts +1 -1
  137. package/dist/lib/cjs/demo-vault-helper-settings.cjs +1 -47
  138. package/dist/lib/cjs/demo-vault-helper-settings.d.cts +1 -1
  139. package/dist/lib/cjs/demo-vault-helper.cjs +2 -21
  140. package/dist/lib/cjs/demo-vault-helper.d.cts +1 -1
  141. package/dist/lib/cjs/demo-vault-naming.cjs +1 -47
  142. package/dist/lib/cjs/demo-vault-naming.d.cts +1 -1
  143. package/dist/lib/cjs/desktop-demo-vault-opener.cjs +3 -16
  144. package/dist/lib/cjs/desktop-demo-vault-opener.d.cts +1 -1
  145. package/dist/lib/cjs/desktop-trusted-input.cjs +2 -21
  146. package/dist/lib/cjs/desktop-trusted-input.d.cts +2 -1
  147. package/dist/lib/cjs/editor-extension-registrar.cjs +2 -21
  148. package/dist/lib/cjs/editor-extension-registrar.d.cts +1 -1
  149. package/dist/lib/cjs/editor-suggest-registrar.cjs +2 -21
  150. package/dist/lib/cjs/editor-suggest-registrar.d.cts +1 -1
  151. package/dist/lib/cjs/editor.cjs +2 -21
  152. package/dist/lib/cjs/editor.d.cts +1 -1
  153. package/dist/lib/cjs/events.cjs +2 -21
  154. package/dist/lib/cjs/events.d.cts +1 -1
  155. package/dist/lib/cjs/extensions-registrar.cjs +2 -21
  156. package/dist/lib/cjs/extensions-registrar.d.cts +1 -1
  157. package/dist/lib/cjs/file-change.cjs +2 -21
  158. package/dist/lib/cjs/file-change.d.cts +2 -1
  159. package/dist/lib/cjs/file-explorer.cjs +2 -21
  160. package/dist/lib/cjs/file-explorer.d.cts +1 -1
  161. package/dist/lib/cjs/file-manager.cjs +2 -21
  162. package/dist/lib/cjs/file-manager.d.cts +2 -1
  163. package/dist/lib/cjs/file-system.cjs +2 -21
  164. package/dist/lib/cjs/file-system.d.cts +1 -1
  165. package/dist/lib/cjs/folder-note.cjs +2 -21
  166. package/dist/lib/cjs/folder-note.d.cts +1 -1
  167. package/dist/lib/cjs/frontmatter-formatting.cjs +2 -21
  168. package/dist/lib/cjs/frontmatter-formatting.d.cts +1 -1
  169. package/dist/lib/cjs/frontmatter-link-cache-with-offsets.cjs +2 -21
  170. package/dist/lib/cjs/frontmatter-link-cache-with-offsets.d.cts +1 -1
  171. package/dist/lib/cjs/frontmatter.cjs +2 -21
  172. package/dist/lib/cjs/frontmatter.d.cts +1 -1
  173. package/dist/lib/cjs/generated-during-build.cjs +2 -48
  174. package/dist/lib/cjs/generated-during-build.d.cts +1 -1
  175. package/dist/lib/cjs/hover-link-source-registrar.cjs +2 -21
  176. package/dist/lib/cjs/hover-link-source-registrar.d.cts +1 -1
  177. package/dist/lib/cjs/html-element.cjs +1 -47
  178. package/dist/lib/cjs/html-element.d.cts +2 -1
  179. package/dist/lib/cjs/i18n/custom-type-options.cjs +1 -47
  180. package/dist/lib/cjs/i18n/custom-type-options.d.cts +1 -1
  181. package/dist/lib/cjs/i18n/default-translations.cjs +1 -47
  182. package/dist/lib/cjs/i18n/default-translations.d.cts +1 -1
  183. package/dist/lib/cjs/i18n/i18n.cjs +3 -22
  184. package/dist/lib/cjs/i18n/i18n.d.cts +2 -2
  185. package/dist/lib/cjs/i18n/index.cjs +5 -51
  186. package/dist/lib/cjs/i18n/index.d.cts +1 -1
  187. package/dist/lib/cjs/i18n/locales/en.cjs +1 -47
  188. package/dist/lib/cjs/i18n/locales/en.d.cts +1 -1
  189. package/dist/lib/cjs/i18n/locales/index.cjs +3 -49
  190. package/dist/lib/cjs/i18n/locales/index.d.cts +1 -1
  191. package/dist/lib/cjs/i18n/locales/translations-map.cjs +1 -47
  192. package/dist/lib/cjs/i18n/locales/translations-map.d.cts +1 -1
  193. package/dist/lib/cjs/index.cjs +96 -142
  194. package/dist/lib/cjs/index.d.cts +1 -1
  195. package/dist/lib/cjs/is-in-obsidian.cjs +1 -47
  196. package/dist/lib/cjs/is-in-obsidian.d.cts +1 -1
  197. package/dist/lib/cjs/library-references.d.cts +2 -0
  198. package/dist/lib/cjs/library-styles.cjs +2 -21
  199. package/dist/lib/cjs/library-styles.d.cts +2 -1
  200. package/dist/lib/cjs/library.cjs +1 -47
  201. package/dist/lib/cjs/link-name.cjs +1 -47
  202. package/dist/lib/cjs/link-name.d.cts +1 -1
  203. package/dist/lib/cjs/link-update-progress.cjs +1 -47
  204. package/dist/lib/cjs/link-update-progress.d.cts +1 -1
  205. package/dist/lib/cjs/link.cjs +3 -16
  206. package/dist/lib/cjs/link.d.cts +2 -1
  207. package/dist/lib/cjs/logger.cjs +2 -21
  208. package/dist/lib/cjs/logger.d.cts +2 -1
  209. package/dist/lib/cjs/loop.cjs +3 -16
  210. package/dist/lib/cjs/loop.d.cts +2 -1
  211. package/dist/lib/cjs/markdown-code-block-processor-registrar.cjs +2 -21
  212. package/dist/lib/cjs/markdown-code-block-processor-registrar.d.cts +2 -1
  213. package/dist/lib/cjs/markdown-code-block-processor.cjs +2 -21
  214. package/dist/lib/cjs/markdown-code-block-processor.d.cts +2 -1
  215. package/dist/lib/cjs/markdown-post-processor-registrar.cjs +2 -21
  216. package/dist/lib/cjs/markdown-post-processor-registrar.d.cts +2 -1
  217. package/dist/lib/cjs/markdown-view.cjs +1 -47
  218. package/dist/lib/cjs/markdown-view.d.cts +1 -1
  219. package/dist/lib/cjs/markdown.cjs +3 -16
  220. package/dist/lib/cjs/markdown.d.cts +2 -1
  221. package/dist/lib/cjs/menu-event-registrar.cjs +1 -47
  222. package/dist/lib/cjs/menu-event-registrar.d.cts +1 -1
  223. package/dist/lib/cjs/metadata-cache.cjs +3 -16
  224. package/dist/lib/cjs/metadata-cache.d.cts +1 -1
  225. package/dist/lib/cjs/mobile-trusted-input.cjs +1 -47
  226. package/dist/lib/cjs/mobile-trusted-input.d.cts +1 -1
  227. package/dist/lib/cjs/modals/alert.cjs +2 -21
  228. package/dist/lib/cjs/modals/alert.d.cts +2 -1
  229. package/dist/lib/cjs/modals/confirm.cjs +2 -21
  230. package/dist/lib/cjs/modals/confirm.d.cts +2 -1
  231. package/dist/lib/cjs/modals/index.cjs +10 -56
  232. package/dist/lib/cjs/modals/index.d.cts +1 -1
  233. package/dist/lib/cjs/modals/minimizable-modal.cjs +2 -21
  234. package/dist/lib/cjs/modals/minimizable-modal.d.cts +1 -1
  235. package/dist/lib/cjs/modals/modal-command-builder.cjs +2 -21
  236. package/dist/lib/cjs/modals/modal-command-builder.d.cts +2 -1
  237. package/dist/lib/cjs/modals/modal.cjs +2 -21
  238. package/dist/lib/cjs/modals/modal.d.cts +1 -1
  239. package/dist/lib/cjs/modals/prompt.cjs +2 -21
  240. package/dist/lib/cjs/modals/prompt.d.cts +2 -1
  241. package/dist/lib/cjs/modals/select-item.cjs +2 -21
  242. package/dist/lib/cjs/modals/select-item.d.cts +1 -1
  243. package/dist/lib/cjs/modals/select-option.cjs +2 -21
  244. package/dist/lib/cjs/modals/select-option.d.cts +2 -1
  245. package/dist/lib/cjs/modals/suggest-modal-command-builder.cjs +1 -47
  246. package/dist/lib/cjs/modals/suggest-modal-command-builder.d.cts +1 -1
  247. package/dist/lib/cjs/note-priority.cjs +2 -21
  248. package/dist/lib/cjs/note-priority.d.cts +1 -1
  249. package/dist/lib/cjs/notebook-navigator.cjs +1 -47
  250. package/dist/lib/cjs/notebook-navigator.d.cts +1 -1
  251. package/dist/lib/cjs/obsidian-dev-utils-state.cjs +2 -21
  252. package/dist/lib/cjs/obsidian-dev-utils-state.d.cts +1 -1
  253. package/dist/lib/cjs/obsidian-protocol-handler-registrar.cjs +2 -21
  254. package/dist/lib/cjs/obsidian-protocol-handler-registrar.d.cts +1 -1
  255. package/dist/lib/cjs/obsidian-settings.cjs +2 -21
  256. package/dist/lib/cjs/obsidian-settings.d.cts +1 -1
  257. package/dist/lib/cjs/parse-link.cjs +3 -22
  258. package/dist/lib/cjs/parse-link.d.cts +1 -1
  259. package/dist/lib/cjs/path-settings.cjs +2 -21
  260. package/dist/lib/cjs/path-settings.d.cts +1 -1
  261. package/dist/lib/cjs/pdf.cjs +2 -21
  262. package/dist/lib/cjs/pdf.d.cts +2 -1
  263. package/dist/lib/cjs/plugin/index.cjs +10 -56
  264. package/dist/lib/cjs/plugin/index.d.cts +1 -1
  265. package/dist/lib/cjs/plugin/plugin-api-schema.cjs +2 -21
  266. package/dist/lib/cjs/plugin/plugin-api-schema.d.cts +1 -1
  267. package/dist/lib/cjs/plugin/plugin-api.cjs +2 -21
  268. package/dist/lib/cjs/plugin/plugin-api.d.cts +1 -1
  269. package/dist/lib/cjs/plugin/plugin-context.cjs +3 -22
  270. package/dist/lib/cjs/plugin/plugin-context.d.cts +2 -1
  271. package/dist/lib/cjs/plugin/plugin-event-source.cjs +1 -47
  272. package/dist/lib/cjs/plugin/plugin-event-source.d.cts +1 -1
  273. package/dist/lib/cjs/plugin/plugin-install-state.cjs +1 -47
  274. package/dist/lib/cjs/plugin/plugin-install-state.d.cts +1 -1
  275. package/dist/lib/cjs/plugin/plugin-lifecycle-events.cjs +1 -47
  276. package/dist/lib/cjs/plugin/plugin-lifecycle-events.d.cts +1 -1
  277. package/dist/lib/cjs/plugin/plugin-settings-tab.cjs +2 -21
  278. package/dist/lib/cjs/plugin/plugin-settings-tab.d.cts +2 -1
  279. package/dist/lib/cjs/plugin/plugin.cjs +2 -21
  280. package/dist/lib/cjs/plugin/plugin.d.cts +1 -1
  281. package/dist/lib/cjs/plugin/settings-migration-api.cjs +2 -21
  282. package/dist/lib/cjs/plugin/settings-migration-api.d.cts +1 -1
  283. package/dist/lib/cjs/plugin-cli-handler-registrar.cjs +2 -21
  284. package/dist/lib/cjs/plugin-cli-handler-registrar.d.cts +1 -1
  285. package/dist/lib/cjs/popovers/field-popover.cjs +2 -21
  286. package/dist/lib/cjs/popovers/field-popover.d.cts +1 -1
  287. package/dist/lib/cjs/popovers/index.cjs +4 -50
  288. package/dist/lib/cjs/popovers/index.d.cts +1 -1
  289. package/dist/lib/cjs/popovers/popover-anchor.cjs +2 -21
  290. package/dist/lib/cjs/popovers/popover-anchor.d.cts +2 -1
  291. package/dist/lib/cjs/popovers/popover.cjs +2 -21
  292. package/dist/lib/cjs/popovers/popover.d.cts +2 -1
  293. package/dist/lib/cjs/property-entry.cjs +1 -47
  294. package/dist/lib/cjs/property-entry.d.cts +1 -1
  295. package/dist/lib/cjs/queue.cjs +2 -21
  296. package/dist/lib/cjs/queue.d.cts +2 -1
  297. package/dist/lib/cjs/react/app-context.cjs +2 -21
  298. package/dist/lib/cjs/react/app-context.d.cts +1 -1
  299. package/dist/lib/cjs/react/index.cjs +2 -48
  300. package/dist/lib/cjs/react/index.d.cts +1 -1
  301. package/dist/lib/cjs/reference.cjs +2 -21
  302. package/dist/lib/cjs/reference.d.cts +1 -1
  303. package/dist/lib/cjs/resource-lock.cjs +2 -21
  304. package/dist/lib/cjs/resource-lock.d.cts +2 -1
  305. package/dist/lib/cjs/resource-url.cjs +2 -21
  306. package/dist/lib/cjs/resource-url.d.cts +1 -1
  307. package/dist/lib/cjs/ribbon-icon-registrar.cjs +2 -21
  308. package/dist/lib/cjs/ribbon-icon-registrar.d.cts +2 -1
  309. package/dist/lib/cjs/setting-components/checkbox-component.cjs +2 -21
  310. package/dist/lib/cjs/setting-components/checkbox-component.d.cts +2 -1
  311. package/dist/lib/cjs/setting-components/code-highlighter-component.cjs +2 -21
  312. package/dist/lib/cjs/setting-components/code-highlighter-component.d.cts +2 -1
  313. package/dist/lib/cjs/setting-components/date-component.cjs +2 -21
  314. package/dist/lib/cjs/setting-components/date-component.d.cts +2 -1
  315. package/dist/lib/cjs/setting-components/date-time-component.cjs +2 -21
  316. package/dist/lib/cjs/setting-components/date-time-component.d.cts +2 -1
  317. package/dist/lib/cjs/setting-components/email-component.cjs +1 -47
  318. package/dist/lib/cjs/setting-components/email-component.d.cts +2 -1
  319. package/dist/lib/cjs/setting-components/file-component.cjs +1 -47
  320. package/dist/lib/cjs/setting-components/file-component.d.cts +2 -1
  321. package/dist/lib/cjs/setting-components/index.cjs +27 -73
  322. package/dist/lib/cjs/setting-components/index.d.cts +1 -1
  323. package/dist/lib/cjs/setting-components/month-component.cjs +2 -21
  324. package/dist/lib/cjs/setting-components/month-component.d.cts +2 -1
  325. package/dist/lib/cjs/setting-components/multiple-dropdown-component.cjs +2 -21
  326. package/dist/lib/cjs/setting-components/multiple-dropdown-component.d.cts +3 -1
  327. package/dist/lib/cjs/setting-components/multiple-email-component.cjs +1 -47
  328. package/dist/lib/cjs/setting-components/multiple-email-component.d.cts +2 -1
  329. package/dist/lib/cjs/setting-components/multiple-file-component.cjs +2 -21
  330. package/dist/lib/cjs/setting-components/multiple-file-component.d.cts +2 -1
  331. package/dist/lib/cjs/setting-components/multiple-text-component.cjs +2 -21
  332. package/dist/lib/cjs/setting-components/multiple-text-component.d.cts +2 -1
  333. package/dist/lib/cjs/setting-components/number-component.cjs +1 -47
  334. package/dist/lib/cjs/setting-components/number-component.d.cts +2 -1
  335. package/dist/lib/cjs/setting-components/password-component.cjs +1 -47
  336. package/dist/lib/cjs/setting-components/password-component.d.cts +2 -1
  337. package/dist/lib/cjs/setting-components/setting-component-wrapper.cjs +2 -21
  338. package/dist/lib/cjs/setting-components/setting-component-wrapper.d.cts +2 -1
  339. package/dist/lib/cjs/setting-components/telephone-component.cjs +1 -47
  340. package/dist/lib/cjs/setting-components/telephone-component.d.cts +2 -1
  341. package/dist/lib/cjs/setting-components/text-based-component.cjs +2 -21
  342. package/dist/lib/cjs/setting-components/text-based-component.d.cts +1 -1
  343. package/dist/lib/cjs/setting-components/time-component.cjs +2 -21
  344. package/dist/lib/cjs/setting-components/time-component.d.cts +2 -1
  345. package/dist/lib/cjs/setting-components/tri-state-checkbox-component.cjs +2 -21
  346. package/dist/lib/cjs/setting-components/tri-state-checkbox-component.d.cts +2 -1
  347. package/dist/lib/cjs/setting-components/typed-dropdown-component.cjs +2 -21
  348. package/dist/lib/cjs/setting-components/typed-dropdown-component.d.cts +3 -1
  349. package/dist/lib/cjs/setting-components/typed-multiple-dropdown-component.cjs +2 -21
  350. package/dist/lib/cjs/setting-components/typed-multiple-dropdown-component.d.cts +3 -1
  351. package/dist/lib/cjs/setting-components/typed-range-text-component.cjs +1 -47
  352. package/dist/lib/cjs/setting-components/typed-range-text-component.d.cts +1 -1
  353. package/dist/lib/cjs/setting-components/typed-text-component.cjs +2 -21
  354. package/dist/lib/cjs/setting-components/typed-text-component.d.cts +2 -1
  355. package/dist/lib/cjs/setting-components/url-component.cjs +1 -47
  356. package/dist/lib/cjs/setting-components/url-component.d.cts +2 -1
  357. package/dist/lib/cjs/setting-components/validator-component.cjs +2 -21
  358. package/dist/lib/cjs/setting-components/validator-component.d.cts +1 -1
  359. package/dist/lib/cjs/setting-components/value-component-with-change-tracking.cjs +1 -47
  360. package/dist/lib/cjs/setting-components/value-component-with-change-tracking.d.cts +1 -1
  361. package/dist/lib/cjs/setting-components/week-component.cjs +2 -21
  362. package/dist/lib/cjs/setting-components/week-component.d.cts +2 -1
  363. package/dist/lib/cjs/setting-ex.cjs +2 -21
  364. package/dist/lib/cjs/setting-ex.d.cts +2 -1
  365. package/dist/lib/cjs/setting-group-ex.cjs +2 -21
  366. package/dist/lib/cjs/setting-group-ex.d.cts +2 -1
  367. package/dist/lib/cjs/status-bar-item-registrar.cjs +2 -21
  368. package/dist/lib/cjs/status-bar-item-registrar.d.cts +2 -1
  369. package/dist/lib/cjs/templater.cjs +1 -47
  370. package/dist/lib/cjs/templater.d.cts +1 -1
  371. package/dist/lib/cjs/transformers/duration-transformer.cjs +2 -21
  372. package/dist/lib/cjs/transformers/duration-transformer.d.cts +1 -1
  373. package/dist/lib/cjs/transformers/index.cjs +2 -48
  374. package/dist/lib/cjs/transformers/index.d.cts +1 -1
  375. package/dist/lib/cjs/trusted-input.cjs +2 -21
  376. package/dist/lib/cjs/trusted-input.d.cts +1 -1
  377. package/dist/lib/cjs/validation.cjs +2 -21
  378. package/dist/lib/cjs/validation.d.cts +1 -1
  379. package/dist/lib/cjs/vault-delete.cjs +2 -21
  380. package/dist/lib/cjs/vault-delete.d.cts +1 -1
  381. package/dist/lib/cjs/vault-transaction.cjs +3 -16
  382. package/dist/lib/cjs/vault-transaction.d.cts +1 -1
  383. package/dist/lib/cjs/vault.cjs +3 -16
  384. package/dist/lib/cjs/vault.d.cts +1 -1
  385. package/dist/lib/cjs/view-registrar.cjs +2 -21
  386. package/dist/lib/cjs/view-registrar.d.cts +1 -1
  387. package/dist/lib/cjs/workspace.cjs +2 -21
  388. package/dist/lib/cjs/workspace.d.cts +2 -1
  389. package/dist/lib/esm/@types/i18next.d.mts +1 -1
  390. package/dist/lib/esm/@types/obsidian-integration-testing.d.mts +3 -3
  391. package/dist/lib/esm/@types/original-fs.d.mts +2 -1
  392. package/dist/lib/esm/__merged.d.mts +1 -1
  393. package/dist/lib/esm/__merged.mjs +2 -11
  394. package/dist/lib/esm/active-file-provider.d.mts +1 -1
  395. package/dist/lib/esm/active-file-provider.mjs +1 -37
  396. package/dist/lib/esm/app.d.mts +1 -1
  397. package/dist/lib/esm/app.mjs +1 -37
  398. package/dist/lib/esm/async-with-notice.d.mts +2 -1
  399. package/dist/lib/esm/async-with-notice.mjs +2 -11
  400. package/dist/lib/esm/attachment-path.d.mts +1 -1
  401. package/dist/lib/esm/attachment-path.mjs +2 -11
  402. package/dist/lib/esm/attachment-unit-folder.d.mts +1 -1
  403. package/dist/lib/esm/attachment-unit-folder.mjs +2 -11
  404. package/dist/lib/esm/backlink-index.d.mts +1 -1
  405. package/dist/lib/esm/backlink-index.mjs +2 -11
  406. package/dist/lib/esm/backlink.d.mts +1 -1
  407. package/dist/lib/esm/backlink.mjs +2 -11
  408. package/dist/lib/esm/bases-view-registrar.d.mts +1 -1
  409. package/dist/lib/esm/bases-view-registrar.mjs +2 -11
  410. package/dist/lib/esm/callout.d.mts +2 -1
  411. package/dist/lib/esm/callout.mjs +2 -11
  412. package/dist/lib/esm/canvas.d.mts +1 -1
  413. package/dist/lib/esm/canvas.mjs +2 -11
  414. package/dist/lib/esm/case-insensitive-file-index.d.mts +1 -1
  415. package/dist/lib/esm/case-insensitive-file-index.mjs +2 -11
  416. package/dist/lib/esm/code-block-markdown-information.d.mts +1 -1
  417. package/dist/lib/esm/code-block-markdown-information.mjs +0 -36
  418. package/dist/lib/esm/code-block-reg-exp.d.mts +1 -1
  419. package/dist/lib/esm/code-block-reg-exp.mjs +1 -37
  420. package/dist/lib/esm/codemirror/index.d.mts +1 -1
  421. package/dist/lib/esm/codemirror/index.mjs +1 -37
  422. package/dist/lib/esm/codemirror/state-field-spec.d.mts +1 -1
  423. package/dist/lib/esm/codemirror/state-field-spec.mjs +0 -36
  424. package/dist/lib/esm/command-handlers/abstract-file-command-handler.d.mts +1 -1
  425. package/dist/lib/esm/command-handlers/abstract-file-command-handler.mjs +2 -11
  426. package/dist/lib/esm/command-handlers/command-handler-component.d.mts +1 -1
  427. package/dist/lib/esm/command-handlers/command-handler-component.mjs +2 -11
  428. package/dist/lib/esm/command-handlers/command-handler.d.mts +1 -1
  429. package/dist/lib/esm/command-handlers/command-handler.mjs +2 -11
  430. package/dist/lib/esm/command-handlers/editor-command-handler.d.mts +1 -1
  431. package/dist/lib/esm/command-handlers/editor-command-handler.mjs +2 -11
  432. package/dist/lib/esm/command-handlers/file-command-handler.d.mts +1 -1
  433. package/dist/lib/esm/command-handlers/file-command-handler.mjs +5 -14
  434. package/dist/lib/esm/command-handlers/folder-command-handler.d.mts +1 -1
  435. package/dist/lib/esm/command-handlers/folder-command-handler.mjs +5 -14
  436. package/dist/lib/esm/command-handlers/global-command-handler.d.mts +1 -1
  437. package/dist/lib/esm/command-handlers/global-command-handler.mjs +3 -12
  438. package/dist/lib/esm/command-handlers/index.d.mts +1 -1
  439. package/dist/lib/esm/command-handlers/index.mjs +1 -37
  440. package/dist/lib/esm/command-handlers/open-demo-vault-command-handler.d.mts +1 -1
  441. package/dist/lib/esm/command-handlers/open-demo-vault-command-handler.mjs +2 -11
  442. package/dist/lib/esm/command-handlers/open-settings-command-handler.d.mts +1 -1
  443. package/dist/lib/esm/command-handlers/open-settings-command-handler.mjs +1 -37
  444. package/dist/lib/esm/command-handlers/unlock-active-note-command-handler.d.mts +1 -1
  445. package/dist/lib/esm/command-handlers/unlock-active-note-command-handler.mjs +1 -37
  446. package/dist/lib/esm/command-registrar.d.mts +1 -1
  447. package/dist/lib/esm/command-registrar.mjs +1 -37
  448. package/dist/lib/esm/community-plugins.d.mts +1 -1
  449. package/dist/lib/esm/community-plugins.mjs +2 -11
  450. package/dist/lib/esm/components/abort-signal-component.d.mts +2 -1
  451. package/dist/lib/esm/components/abort-signal-component.mjs +2 -11
  452. package/dist/lib/esm/components/all-windows-event-component.d.mts +2 -1
  453. package/dist/lib/esm/components/all-windows-event-component.mjs +1 -37
  454. package/dist/lib/esm/components/async-error-handler-component.d.mts +1 -1
  455. package/dist/lib/esm/components/async-error-handler-component.mjs +2 -11
  456. package/dist/lib/esm/components/async-events-component.d.mts +1 -1
  457. package/dist/lib/esm/components/async-events-component.mjs +2 -11
  458. package/dist/lib/esm/components/case-insensitive-file-index-component.d.mts +1 -1
  459. package/dist/lib/esm/components/case-insensitive-file-index-component.mjs +1 -37
  460. package/dist/lib/esm/components/component-ex.d.mts +1 -1
  461. package/dist/lib/esm/components/component-ex.mjs +3 -6
  462. package/dist/lib/esm/components/console-debug-component.d.mts +2 -2
  463. package/dist/lib/esm/components/console-debug-component.mjs +2 -11
  464. package/dist/lib/esm/components/core-plugin-toggle-component.d.mts +1 -1
  465. package/dist/lib/esm/components/core-plugin-toggle-component.mjs +2 -11
  466. package/dist/lib/esm/components/disposable-component.d.mts +1 -1
  467. package/dist/lib/esm/components/disposable-component.mjs +3 -6
  468. package/dist/lib/esm/components/embed-extensions-component.d.mts +1 -1
  469. package/dist/lib/esm/components/embed-extensions-component.mjs +1 -37
  470. package/dist/lib/esm/components/generate-markdown-link-default-params-component.d.mts +1 -1
  471. package/dist/lib/esm/components/generate-markdown-link-default-params-component.mjs +1 -37
  472. package/dist/lib/esm/components/index.d.mts +1 -1
  473. package/dist/lib/esm/components/index.mjs +1 -37
  474. package/dist/lib/esm/components/layout-ready-component.d.mts +1 -1
  475. package/dist/lib/esm/components/layout-ready-component.mjs +2 -11
  476. package/dist/lib/esm/components/menu-event-registrar-component.d.mts +1 -1
  477. package/dist/lib/esm/components/menu-event-registrar-component.mjs +1 -37
  478. package/dist/lib/esm/components/monkey-around-component.d.mts +1 -1
  479. package/dist/lib/esm/components/monkey-around-component.mjs +2 -11
  480. package/dist/lib/esm/components/notebook-navigator-menu-event-registrar-component.d.mts +1 -1
  481. package/dist/lib/esm/components/notebook-navigator-menu-event-registrar-component.mjs +2 -11
  482. package/dist/lib/esm/components/plugin-context-component.d.mts +1 -1
  483. package/dist/lib/esm/components/plugin-context-component.mjs +2 -11
  484. package/dist/lib/esm/components/plugin-gate-component.d.mts +2 -1
  485. package/dist/lib/esm/components/plugin-gate-component.mjs +2 -11
  486. package/dist/lib/esm/components/plugin-notice-component.d.mts +2 -1
  487. package/dist/lib/esm/components/plugin-notice-component.mjs +3 -6
  488. package/dist/lib/esm/components/plugin-settings-component.d.mts +1 -1
  489. package/dist/lib/esm/components/plugin-settings-component.mjs +2 -11
  490. package/dist/lib/esm/components/plugin-settings-tab-component.d.mts +1 -1
  491. package/dist/lib/esm/components/plugin-settings-tab-component.mjs +2 -11
  492. package/dist/lib/esm/components/plugin-suggestion-component.d.mts +2 -1
  493. package/dist/lib/esm/components/plugin-suggestion-component.mjs +2 -11
  494. package/dist/lib/esm/components/pointer-position-component.d.mts +1 -1
  495. package/dist/lib/esm/components/pointer-position-component.mjs +1 -37
  496. package/dist/lib/esm/components/registry-component.d.mts +1 -1
  497. package/dist/lib/esm/components/registry-component.mjs +2 -11
  498. package/dist/lib/esm/components/release-notes-component.d.mts +2 -1
  499. package/dist/lib/esm/components/release-notes-component.mjs +2 -11
  500. package/dist/lib/esm/components/rename-delete-handler-component.d.mts +1 -1
  501. package/dist/lib/esm/components/rename-delete-handler-component.mjs +3 -6
  502. package/dist/lib/esm/components/rmdir-guard-component.d.mts +1 -1
  503. package/dist/lib/esm/components/rmdir-guard-component.mjs +1 -37
  504. package/dist/lib/esm/components/settings-migration-component.d.mts +1 -1
  505. package/dist/lib/esm/components/settings-migration-component.mjs +2 -11
  506. package/dist/lib/esm/components/syntax-highlighting-component.d.mts +1 -1
  507. package/dist/lib/esm/components/syntax-highlighting-component.mjs +2 -11
  508. package/dist/lib/esm/components/templates-language-component.d.mts +1 -1
  509. package/dist/lib/esm/components/templates-language-component.mjs +3 -39
  510. package/dist/lib/esm/constructors/get-dom-events-handlers-constructor.d.mts +1 -1
  511. package/dist/lib/esm/constructors/get-dom-events-handlers-constructor.mjs +3 -6
  512. package/dist/lib/esm/constructors/index.d.mts +1 -1
  513. package/dist/lib/esm/constructors/index.mjs +1 -37
  514. package/dist/lib/esm/css-class.d.mts +1 -1
  515. package/dist/lib/esm/css-class.mjs +1 -37
  516. package/dist/lib/esm/data-handler.d.mts +1 -1
  517. package/dist/lib/esm/data-handler.mjs +1 -37
  518. package/dist/lib/esm/dataview-link.d.mts +1 -1
  519. package/dist/lib/esm/dataview-link.mjs +2 -11
  520. package/dist/lib/esm/dataview.d.mts +2 -1
  521. package/dist/lib/esm/dataview.mjs +2 -11
  522. package/dist/lib/esm/debug.d.mts +1 -1
  523. package/dist/lib/esm/debug.mjs +2 -11
  524. package/dist/lib/esm/demo-vault-helper-settings.d.mts +1 -1
  525. package/dist/lib/esm/demo-vault-helper-settings.mjs +0 -36
  526. package/dist/lib/esm/demo-vault-helper.d.mts +1 -1
  527. package/dist/lib/esm/demo-vault-helper.mjs +2 -11
  528. package/dist/lib/esm/demo-vault-naming.d.mts +1 -1
  529. package/dist/lib/esm/demo-vault-naming.mjs +1 -37
  530. package/dist/lib/esm/desktop-demo-vault-opener.d.mts +1 -1
  531. package/dist/lib/esm/desktop-demo-vault-opener.mjs +3 -6
  532. package/dist/lib/esm/desktop-trusted-input.d.mts +2 -1
  533. package/dist/lib/esm/desktop-trusted-input.mjs +2 -11
  534. package/dist/lib/esm/editor-extension-registrar.d.mts +1 -1
  535. package/dist/lib/esm/editor-extension-registrar.mjs +2 -11
  536. package/dist/lib/esm/editor-suggest-registrar.d.mts +1 -1
  537. package/dist/lib/esm/editor-suggest-registrar.mjs +2 -11
  538. package/dist/lib/esm/editor.d.mts +1 -1
  539. package/dist/lib/esm/editor.mjs +2 -11
  540. package/dist/lib/esm/events.d.mts +1 -1
  541. package/dist/lib/esm/events.mjs +2 -11
  542. package/dist/lib/esm/extensions-registrar.d.mts +1 -1
  543. package/dist/lib/esm/extensions-registrar.mjs +2 -11
  544. package/dist/lib/esm/file-change.d.mts +2 -1
  545. package/dist/lib/esm/file-change.mjs +2 -11
  546. package/dist/lib/esm/file-explorer.d.mts +1 -1
  547. package/dist/lib/esm/file-explorer.mjs +2 -11
  548. package/dist/lib/esm/file-manager.d.mts +2 -1
  549. package/dist/lib/esm/file-manager.mjs +2 -11
  550. package/dist/lib/esm/file-system.d.mts +1 -1
  551. package/dist/lib/esm/file-system.mjs +2 -11
  552. package/dist/lib/esm/folder-note.d.mts +1 -1
  553. package/dist/lib/esm/folder-note.mjs +2 -11
  554. package/dist/lib/esm/frontmatter-formatting.d.mts +1 -1
  555. package/dist/lib/esm/frontmatter-formatting.mjs +2 -11
  556. package/dist/lib/esm/frontmatter-link-cache-with-offsets.d.mts +1 -1
  557. package/dist/lib/esm/frontmatter-link-cache-with-offsets.mjs +2 -11
  558. package/dist/lib/esm/frontmatter.d.mts +1 -1
  559. package/dist/lib/esm/frontmatter.mjs +2 -11
  560. package/dist/lib/esm/generated-during-build.d.mts +1 -1
  561. package/dist/lib/esm/generated-during-build.mjs +2 -38
  562. package/dist/lib/esm/hover-link-source-registrar.d.mts +1 -1
  563. package/dist/lib/esm/hover-link-source-registrar.mjs +2 -11
  564. package/dist/lib/esm/html-element.d.mts +2 -1
  565. package/dist/lib/esm/html-element.mjs +1 -37
  566. package/dist/lib/esm/i18n/custom-type-options.d.mts +1 -1
  567. package/dist/lib/esm/i18n/custom-type-options.mjs +1 -37
  568. package/dist/lib/esm/i18n/default-translations.d.mts +1 -1
  569. package/dist/lib/esm/i18n/default-translations.mjs +1 -37
  570. package/dist/lib/esm/i18n/i18n.d.mts +2 -2
  571. package/dist/lib/esm/i18n/i18n.mjs +2 -11
  572. package/dist/lib/esm/i18n/index.d.mts +1 -1
  573. package/dist/lib/esm/i18n/index.mjs +1 -37
  574. package/dist/lib/esm/i18n/locales/en.d.mts +1 -1
  575. package/dist/lib/esm/i18n/locales/en.mjs +1 -37
  576. package/dist/lib/esm/i18n/locales/index.d.mts +1 -1
  577. package/dist/lib/esm/i18n/locales/index.mjs +1 -37
  578. package/dist/lib/esm/i18n/locales/translations-map.d.mts +1 -1
  579. package/dist/lib/esm/i18n/locales/translations-map.mjs +1 -37
  580. package/dist/lib/esm/index.d.mts +1 -1
  581. package/dist/lib/esm/index.mjs +1 -37
  582. package/dist/lib/esm/is-in-obsidian.d.mts +1 -1
  583. package/dist/lib/esm/is-in-obsidian.mjs +1 -37
  584. package/dist/lib/esm/library-references.d.mts +2 -0
  585. package/dist/lib/esm/library-styles.d.mts +2 -1
  586. package/dist/lib/esm/library-styles.mjs +2 -11
  587. package/dist/lib/esm/library.mjs +1 -37
  588. package/dist/lib/esm/link-name.d.mts +1 -1
  589. package/dist/lib/esm/link-name.mjs +1 -37
  590. package/dist/lib/esm/link-update-progress.d.mts +1 -1
  591. package/dist/lib/esm/link-update-progress.mjs +0 -36
  592. package/dist/lib/esm/link.d.mts +2 -1
  593. package/dist/lib/esm/link.mjs +3 -6
  594. package/dist/lib/esm/logger.d.mts +2 -1
  595. package/dist/lib/esm/logger.mjs +2 -11
  596. package/dist/lib/esm/loop.d.mts +2 -1
  597. package/dist/lib/esm/loop.mjs +3 -6
  598. package/dist/lib/esm/markdown-code-block-processor-registrar.d.mts +2 -1
  599. package/dist/lib/esm/markdown-code-block-processor-registrar.mjs +2 -11
  600. package/dist/lib/esm/markdown-code-block-processor.d.mts +2 -1
  601. package/dist/lib/esm/markdown-code-block-processor.mjs +2 -11
  602. package/dist/lib/esm/markdown-post-processor-registrar.d.mts +2 -1
  603. package/dist/lib/esm/markdown-post-processor-registrar.mjs +2 -11
  604. package/dist/lib/esm/markdown-view.d.mts +1 -1
  605. package/dist/lib/esm/markdown-view.mjs +1 -37
  606. package/dist/lib/esm/markdown.d.mts +2 -1
  607. package/dist/lib/esm/markdown.mjs +3 -6
  608. package/dist/lib/esm/menu-event-registrar.d.mts +1 -1
  609. package/dist/lib/esm/menu-event-registrar.mjs +0 -36
  610. package/dist/lib/esm/metadata-cache.d.mts +1 -1
  611. package/dist/lib/esm/metadata-cache.mjs +3 -6
  612. package/dist/lib/esm/mobile-trusted-input.d.mts +1 -1
  613. package/dist/lib/esm/mobile-trusted-input.mjs +1 -37
  614. package/dist/lib/esm/modals/alert.d.mts +2 -1
  615. package/dist/lib/esm/modals/alert.mjs +2 -11
  616. package/dist/lib/esm/modals/confirm.d.mts +2 -1
  617. package/dist/lib/esm/modals/confirm.mjs +2 -11
  618. package/dist/lib/esm/modals/index.d.mts +1 -1
  619. package/dist/lib/esm/modals/index.mjs +1 -37
  620. package/dist/lib/esm/modals/minimizable-modal.d.mts +1 -1
  621. package/dist/lib/esm/modals/minimizable-modal.mjs +2 -11
  622. package/dist/lib/esm/modals/modal-command-builder.d.mts +2 -1
  623. package/dist/lib/esm/modals/modal-command-builder.mjs +2 -11
  624. package/dist/lib/esm/modals/modal.d.mts +1 -1
  625. package/dist/lib/esm/modals/modal.mjs +2 -11
  626. package/dist/lib/esm/modals/prompt.d.mts +2 -1
  627. package/dist/lib/esm/modals/prompt.mjs +2 -11
  628. package/dist/lib/esm/modals/select-item.d.mts +1 -1
  629. package/dist/lib/esm/modals/select-item.mjs +2 -11
  630. package/dist/lib/esm/modals/select-option.d.mts +2 -1
  631. package/dist/lib/esm/modals/select-option.mjs +2 -11
  632. package/dist/lib/esm/modals/suggest-modal-command-builder.d.mts +1 -1
  633. package/dist/lib/esm/modals/suggest-modal-command-builder.mjs +1 -37
  634. package/dist/lib/esm/note-priority.d.mts +1 -1
  635. package/dist/lib/esm/note-priority.mjs +2 -11
  636. package/dist/lib/esm/notebook-navigator.d.mts +1 -1
  637. package/dist/lib/esm/notebook-navigator.mjs +1 -37
  638. package/dist/lib/esm/obsidian-dev-utils-state.d.mts +1 -1
  639. package/dist/lib/esm/obsidian-dev-utils-state.mjs +2 -11
  640. package/dist/lib/esm/obsidian-protocol-handler-registrar.d.mts +1 -1
  641. package/dist/lib/esm/obsidian-protocol-handler-registrar.mjs +2 -11
  642. package/dist/lib/esm/obsidian-settings.d.mts +1 -1
  643. package/dist/lib/esm/obsidian-settings.mjs +2 -11
  644. package/dist/lib/esm/parse-link.d.mts +1 -1
  645. package/dist/lib/esm/parse-link.mjs +2 -11
  646. package/dist/lib/esm/path-settings.d.mts +1 -1
  647. package/dist/lib/esm/path-settings.mjs +2 -11
  648. package/dist/lib/esm/pdf.d.mts +2 -1
  649. package/dist/lib/esm/pdf.mjs +2 -11
  650. package/dist/lib/esm/plugin/index.d.mts +1 -1
  651. package/dist/lib/esm/plugin/index.mjs +1 -37
  652. package/dist/lib/esm/plugin/plugin-api-schema.d.mts +1 -1
  653. package/dist/lib/esm/plugin/plugin-api-schema.mjs +2 -11
  654. package/dist/lib/esm/plugin/plugin-api.d.mts +1 -1
  655. package/dist/lib/esm/plugin/plugin-api.mjs +2 -11
  656. package/dist/lib/esm/plugin/plugin-context.d.mts +2 -1
  657. package/dist/lib/esm/plugin/plugin-context.mjs +3 -12
  658. package/dist/lib/esm/plugin/plugin-event-source.d.mts +1 -1
  659. package/dist/lib/esm/plugin/plugin-event-source.mjs +1 -37
  660. package/dist/lib/esm/plugin/plugin-install-state.d.mts +1 -1
  661. package/dist/lib/esm/plugin/plugin-install-state.mjs +1 -37
  662. package/dist/lib/esm/plugin/plugin-lifecycle-events.d.mts +1 -1
  663. package/dist/lib/esm/plugin/plugin-lifecycle-events.mjs +1 -37
  664. package/dist/lib/esm/plugin/plugin-settings-tab.d.mts +2 -1
  665. package/dist/lib/esm/plugin/plugin-settings-tab.mjs +2 -11
  666. package/dist/lib/esm/plugin/plugin.d.mts +1 -1
  667. package/dist/lib/esm/plugin/plugin.mjs +2 -11
  668. package/dist/lib/esm/plugin/settings-migration-api.d.mts +1 -1
  669. package/dist/lib/esm/plugin/settings-migration-api.mjs +2 -11
  670. package/dist/lib/esm/plugin-cli-handler-registrar.d.mts +1 -1
  671. package/dist/lib/esm/plugin-cli-handler-registrar.mjs +2 -11
  672. package/dist/lib/esm/popovers/field-popover.d.mts +1 -1
  673. package/dist/lib/esm/popovers/field-popover.mjs +2 -11
  674. package/dist/lib/esm/popovers/index.d.mts +1 -1
  675. package/dist/lib/esm/popovers/index.mjs +1 -37
  676. package/dist/lib/esm/popovers/popover-anchor.d.mts +2 -1
  677. package/dist/lib/esm/popovers/popover-anchor.mjs +2 -11
  678. package/dist/lib/esm/popovers/popover.d.mts +2 -1
  679. package/dist/lib/esm/popovers/popover.mjs +2 -11
  680. package/dist/lib/esm/property-entry.d.mts +1 -1
  681. package/dist/lib/esm/property-entry.mjs +1 -37
  682. package/dist/lib/esm/queue.d.mts +2 -1
  683. package/dist/lib/esm/queue.mjs +2 -11
  684. package/dist/lib/esm/react/app-context.d.mts +1 -1
  685. package/dist/lib/esm/react/app-context.mjs +2 -11
  686. package/dist/lib/esm/react/index.d.mts +1 -1
  687. package/dist/lib/esm/react/index.mjs +1 -37
  688. package/dist/lib/esm/reference.d.mts +1 -1
  689. package/dist/lib/esm/reference.mjs +2 -11
  690. package/dist/lib/esm/resource-lock.d.mts +2 -1
  691. package/dist/lib/esm/resource-lock.mjs +2 -11
  692. package/dist/lib/esm/resource-url.d.mts +1 -1
  693. package/dist/lib/esm/resource-url.mjs +2 -11
  694. package/dist/lib/esm/ribbon-icon-registrar.d.mts +2 -1
  695. package/dist/lib/esm/ribbon-icon-registrar.mjs +2 -11
  696. package/dist/lib/esm/setting-components/checkbox-component.d.mts +2 -1
  697. package/dist/lib/esm/setting-components/checkbox-component.mjs +2 -11
  698. package/dist/lib/esm/setting-components/code-highlighter-component.d.mts +2 -1
  699. package/dist/lib/esm/setting-components/code-highlighter-component.mjs +2 -11
  700. package/dist/lib/esm/setting-components/date-component.d.mts +2 -1
  701. package/dist/lib/esm/setting-components/date-component.mjs +2 -11
  702. package/dist/lib/esm/setting-components/date-time-component.d.mts +2 -1
  703. package/dist/lib/esm/setting-components/date-time-component.mjs +2 -11
  704. package/dist/lib/esm/setting-components/email-component.d.mts +2 -1
  705. package/dist/lib/esm/setting-components/email-component.mjs +1 -37
  706. package/dist/lib/esm/setting-components/file-component.d.mts +2 -1
  707. package/dist/lib/esm/setting-components/file-component.mjs +1 -37
  708. package/dist/lib/esm/setting-components/index.d.mts +1 -1
  709. package/dist/lib/esm/setting-components/index.mjs +1 -37
  710. package/dist/lib/esm/setting-components/month-component.d.mts +2 -1
  711. package/dist/lib/esm/setting-components/month-component.mjs +2 -11
  712. package/dist/lib/esm/setting-components/multiple-dropdown-component.d.mts +3 -1
  713. package/dist/lib/esm/setting-components/multiple-dropdown-component.mjs +2 -11
  714. package/dist/lib/esm/setting-components/multiple-email-component.d.mts +2 -1
  715. package/dist/lib/esm/setting-components/multiple-email-component.mjs +1 -37
  716. package/dist/lib/esm/setting-components/multiple-file-component.d.mts +2 -1
  717. package/dist/lib/esm/setting-components/multiple-file-component.mjs +2 -11
  718. package/dist/lib/esm/setting-components/multiple-text-component.d.mts +2 -1
  719. package/dist/lib/esm/setting-components/multiple-text-component.mjs +2 -11
  720. package/dist/lib/esm/setting-components/number-component.d.mts +2 -1
  721. package/dist/lib/esm/setting-components/number-component.mjs +1 -37
  722. package/dist/lib/esm/setting-components/password-component.d.mts +2 -1
  723. package/dist/lib/esm/setting-components/password-component.mjs +1 -37
  724. package/dist/lib/esm/setting-components/setting-component-wrapper.d.mts +2 -1
  725. package/dist/lib/esm/setting-components/setting-component-wrapper.mjs +2 -11
  726. package/dist/lib/esm/setting-components/telephone-component.d.mts +2 -1
  727. package/dist/lib/esm/setting-components/telephone-component.mjs +1 -37
  728. package/dist/lib/esm/setting-components/text-based-component.d.mts +1 -1
  729. package/dist/lib/esm/setting-components/text-based-component.mjs +2 -11
  730. package/dist/lib/esm/setting-components/time-component.d.mts +2 -1
  731. package/dist/lib/esm/setting-components/time-component.mjs +2 -11
  732. package/dist/lib/esm/setting-components/tri-state-checkbox-component.d.mts +2 -1
  733. package/dist/lib/esm/setting-components/tri-state-checkbox-component.mjs +2 -11
  734. package/dist/lib/esm/setting-components/typed-dropdown-component.d.mts +3 -1
  735. package/dist/lib/esm/setting-components/typed-dropdown-component.mjs +2 -11
  736. package/dist/lib/esm/setting-components/typed-multiple-dropdown-component.d.mts +3 -1
  737. package/dist/lib/esm/setting-components/typed-multiple-dropdown-component.mjs +2 -11
  738. package/dist/lib/esm/setting-components/typed-range-text-component.d.mts +1 -1
  739. package/dist/lib/esm/setting-components/typed-range-text-component.mjs +1 -37
  740. package/dist/lib/esm/setting-components/typed-text-component.d.mts +2 -1
  741. package/dist/lib/esm/setting-components/typed-text-component.mjs +2 -11
  742. package/dist/lib/esm/setting-components/url-component.d.mts +2 -1
  743. package/dist/lib/esm/setting-components/url-component.mjs +1 -37
  744. package/dist/lib/esm/setting-components/validator-component.d.mts +1 -1
  745. package/dist/lib/esm/setting-components/validator-component.mjs +2 -11
  746. package/dist/lib/esm/setting-components/value-component-with-change-tracking.d.mts +1 -1
  747. package/dist/lib/esm/setting-components/value-component-with-change-tracking.mjs +0 -36
  748. package/dist/lib/esm/setting-components/week-component.d.mts +2 -1
  749. package/dist/lib/esm/setting-components/week-component.mjs +2 -11
  750. package/dist/lib/esm/setting-ex.d.mts +2 -1
  751. package/dist/lib/esm/setting-ex.mjs +2 -11
  752. package/dist/lib/esm/setting-group-ex.d.mts +2 -1
  753. package/dist/lib/esm/setting-group-ex.mjs +2 -11
  754. package/dist/lib/esm/status-bar-item-registrar.d.mts +2 -1
  755. package/dist/lib/esm/status-bar-item-registrar.mjs +2 -11
  756. package/dist/lib/esm/templater.d.mts +1 -1
  757. package/dist/lib/esm/templater.mjs +1 -37
  758. package/dist/lib/esm/transformers/duration-transformer.d.mts +1 -1
  759. package/dist/lib/esm/transformers/duration-transformer.mjs +2 -11
  760. package/dist/lib/esm/transformers/index.d.mts +1 -1
  761. package/dist/lib/esm/transformers/index.mjs +1 -37
  762. package/dist/lib/esm/trusted-input.d.mts +1 -1
  763. package/dist/lib/esm/trusted-input.mjs +2 -11
  764. package/dist/lib/esm/validation.d.mts +1 -1
  765. package/dist/lib/esm/validation.mjs +2 -11
  766. package/dist/lib/esm/vault-delete.d.mts +1 -1
  767. package/dist/lib/esm/vault-delete.mjs +2 -11
  768. package/dist/lib/esm/vault-transaction.d.mts +1 -1
  769. package/dist/lib/esm/vault-transaction.mjs +3 -6
  770. package/dist/lib/esm/vault.d.mts +1 -1
  771. package/dist/lib/esm/vault.mjs +3 -6
  772. package/dist/lib/esm/view-registrar.d.mts +1 -1
  773. package/dist/lib/esm/view-registrar.mjs +2 -11
  774. package/dist/lib/esm/workspace.d.mts +2 -1
  775. package/dist/lib/esm/workspace.mjs +2 -11
  776. package/package.json +24 -8
@@ -2,13 +2,7 @@
2
2
  THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
3
  if you want to view the source, please visit the github repository of this plugin
4
4
  */
5
-
6
5
  (function () {
7
- function ensureDisposeSymbols(symbolConstructor = Symbol) {
8
- symbolConstructor.asyncDispose ??= symbolConstructor.for("Symbol.asyncDispose");
9
- symbolConstructor.dispose ??= symbolConstructor.for("Symbol.dispose");
10
- }
11
-
12
6
  function ensureBrowserProcess() {
13
7
  const browserProcess = {
14
8
  browser: true,
@@ -33,10 +27,7 @@ function ensureBrowserProcess() {
33
27
  existingProcessRecord["browser"] = true;
34
28
  }
35
29
 
36
- (function initEsm() {
37
- ensureDisposeSymbols();
38
- ensureBrowserProcess();
39
- })();
30
+ ensureBrowserProcess();
40
31
  })();
41
32
 
42
33
  import { snapshot } from "@mnaoumov/typescript-lib/array";
@@ -1003,4 +994,4 @@ export {
1003
994
  requestResourceUnlockForPath,
1004
995
  unlockResourceForPath
1005
996
  };
1006
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3Jlc291cmNlLWxvY2sudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBQYXRoLXNjb3BlZCByZXNvdXJjZSBsb2NraW5nIGZvciB2YXVsdCBmaWxlcyBhbmQgZm9sZGVycywgd2l0aCB0aHJlZSBlbmZvcmNlbWVudCBsYXllcnMgb3ZlciBvbmVcbiAqIHNoYXJlZCBsb2NrZWQtcGF0aCBzZXQ6XG4gKlxuICogMS4gKipFZGl0b3IgcmVhZC1vbmx5KiogXHUyMDE0IHdoaWxlIGEgcGF0aCBpcyBsb2NrZWQsIGV2ZXJ5IGN1cnJlbnQgYW5kIGZ1dHVyZSB7QGxpbmsgTWFya2Rvd25WaWV3fSBvZlxuICogICAgdGhhdCBub3RlIChpbiBhbnkgd2luZG93LCBpbmNsdWRpbmcgcG9wb3V0cykgaXMgbWFkZSByZWFkLW9ubHkgYW5kIHNob3dzIGEgbG9jayBpbmRpY2F0b3IgaW4gaXRzXG4gKiAgICB0YWIgaGVhZGVyLCBpdHMgdmlldyBhY3Rpb24gYmFyLCBhbmQgdGhlIHN0YXR1cyBiYXI7IGEgbm90ZSBpbnNpZGUgYSBgc3VidHJlZWAtbG9ja2VkIGZvbGRlciBpc1xuICogICAgY292ZXJlZCB0b28uIExvY2tzIGFyZSByZWZlcmVuY2UtY291bnRlZCBwZXIgbG9ja2luZyBwbHVnaW4gKHRoZSBpbmRpY2F0b3JzJyB0b29sdGlwIGxpc3RzIHdoaWNoXG4gKiAgICBwbHVnaW5zIGhvbGQgYSBsb2NrKSwgc28gbmVzdGVkL2NvbmN1cnJlbnQgb3BlcmF0aW9ucyBhcmUgc2FmZSBcdTIwMTQgdGhlIHBhdGggaXMgdW5sb2NrZWQgb25seSB3aGVuXG4gKiAgICB0aGUgbGFzdCBsb2NrIGlzIHJlbGVhc2VkLlxuICogMi4gKipWYXVsdC1tdXRhdGlvbiBibG9ja2luZyoqIChvcHQtaW4gdmlhIGBzaG91bGRCbG9ja011dGF0aW9uc2ApIFx1MjAxNCBhbnkgZWRpdC9kZWxldGUvcmVuYW1lL21vdmUvXG4gKiAgICBjcmVhdGUgb2YgYSBsb2NrZWQgcGF0aCB0aHJvdWdoIHRoZSBgVmF1bHRgL2BGaWxlTWFuYWdlcmAgQVBJIHRocm93cyB7QGxpbmsgUmVzb3VyY2VMb2NrZWRFcnJvcn0sXG4gKiAgICB1bmxlc3MgdGhlIG93bmluZyBvcGVyYXRpb24gaGFzIG9wZW5lZCBhIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnQuYnlwYXNzQmxvY2tlZE11dGF0aW9uc30gc2NvcGVcbiAqICAgIG92ZXIgdGhhdCBwYXRoLlxuICogMy4gKipFeHRlcm5hbC1jaGFuZ2UgZGV0ZWN0aW9uKiogXHUyMDE0IGEgdmF1bHQvbWV0YWRhdGEgZXZlbnQgb24gYSBsb2NrZWQgcGF0aCB0aGF0IG5vIGJ5cGFzcyBzY29wZVxuICogICAgY292ZXJzIGlzIHRyZWF0ZWQgYXMgYW4gaW50cnVkZXIgKFN5bmMgLyByYXcgZmlsZXN5c3RlbSAvIGFub3RoZXIgcGx1Z2luKSBhbmQgYWJvcnRzIHRoZSBvd25pbmdcbiAqICAgIG9wZXJhdGlvbidzIHtAbGluayBBYm9ydENvbnRyb2xsZXJ9LlxuICpcbiAqIEEgbG9jayAqKmZvbGxvd3MgaXRzIHJlc291cmNlIGFjcm9zcyBhIHJlbmFtZSoqOiB3aGVuIGEgbG9ja2VkIHBhdGggKG9yIGFuIGFuY2VzdG9yIGZvbGRlciBvZiBpdCkgaXNcbiAqIHJlbmFtZWQsIHRoZSBsb2NrIHJlZ2lzdHJ5IGFuZCBldmVyeSBhY3RpdmUgYnlwYXNzIHNjb3BlIGFyZSByZS1rZXllZCBvbnRvIHRoZSBuZXcgcGF0aCwgc28gYVxuICogbXVsdGktc3RlcCBvcGVyYXRpb24gdGhhdCByZW5hbWVzIGEgZm9sZGVyIGl0IGxvY2tlZCBrZWVwcyBpdHMgY292ZXJhZ2UgZm9yIHRoZSByZXN0IG9mIHRoZVxuICogdHJhbnNhY3Rpb24uXG4gKlxuICogVGhlIGFjcXVpcmVycyByZXR1cm4gYSB7QGxpbmsgRGlzcG9zYWJsZX0sIHNvIHRoZSBwcmVmZXJyZWQgY2FsbCBzdHlsZSBpcyBhIGB1c2luZ2AgZGVjbGFyYXRpb24gdGhhdFxuICogcmVsZWFzZXMgYXV0b21hdGljYWxseSBhdCBzY29wZSBleGl0IChpbmNsdWRpbmcgb24gdGhyb3cpOlxuICpcbiAqIGBgYHRzXG4gKiB1c2luZyBfbG9jayA9IGxvY2tSZXNvdXJjZUZvclBhdGgoeyBhcHAsIHBhdGhPckZpbGU6IHBhdGgsIHBsdWdpbklkOiB0aGlzLm1hbmlmZXN0LmlkLCBvcGVyYXRpb25OYW1lOiAnUHJvY2VzcyBub3RlJyB9KTtcbiAqIC8vIC4uLiBsb25nLXJ1bm5pbmcgd29yayAocHJvY2VzcywgcHJvY2Vzc0Zyb250TWF0dGVyLCBtZXJnZS9zcGxpdCkgLi4uXG4gKiAvLyBhdXRvLXVubG9ja2VkIGF0IHNjb3BlIGV4aXRcbiAqIGBgYFxuICpcbiAqIFRoZSBleHBsaWNpdCB7QGxpbmsgdW5sb2NrUmVzb3VyY2VGb3JQYXRofSBwYWlyIHJlbWFpbnMgYXZhaWxhYmxlIGZvciBub24tYHVzaW5nYCBjYWxsIHNpdGVzLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBUQWJzdHJhY3RGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgc25hcHNob3QgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvYXJyYXknO1xuaW1wb3J0IHsgY29udmVydEFzeW5jVG9TeW5jIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IEJlZXBlciB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9iZWVwZXInO1xuaW1wb3J0IHtcbiAgQ2FsbGJhY2tEaXNwb3NhYmxlLFxuICBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvclxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZGlzcG9zYWJsZSc7XG5pbXBvcnQgeyBub29wIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2Z1bmN0aW9uJztcbmltcG9ydCB7IGFzc2VydE5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IFZpZXdUeXBlIH0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuaW1wb3J0IHtcbiAgRmlsZU1hbmFnZXIsXG4gIE1hcmtkb3duVmlldyxcbiAgTWVudSxcbiAgc2V0SWNvbixcbiAgc2V0VG9vbHRpcCxcbiAgVmF1bHRcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IFBhdGhPckZpbGUgfSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcblxuaW1wb3J0IHsgQ29tcG9uZW50RXggfSBmcm9tICcuL2NvbXBvbmVudHMvY29tcG9uZW50LWV4LnRzJztcbmltcG9ydCB7IE1vbmtleUFyb3VuZENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9tb25rZXktYXJvdW5kLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyB0b2dnbGVFZGl0b3JSZWFkT25seSB9IGZyb20gJy4vZWRpdG9yLnRzJztcbmltcG9ydCB7IGdldFBhdGggfSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB7IGFwcGVuZENvZGVCbG9jayB9IGZyb20gJy4vaHRtbC1lbGVtZW50LnRzJztcbmltcG9ydCB7IHQgfSBmcm9tICcuL2kxOG4vaTE4bi50cyc7XG5pbXBvcnQgeyBjb25maXJtIH0gZnJvbSAnLi9tb2RhbHMvY29uZmlybS50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUgfSBmcm9tICcuL29ic2lkaWFuLWRldi11dGlscy1zdGF0ZS50cyc7XG5pbXBvcnQge1xuICBpc0NoaWxkLFxuICBpc0NoaWxkT3JTZWxmXG59IGZyb20gJy4vdmF1bHQudHMnO1xuXG5jb25zdCBSRVNPVVJDRV9MT0NLX1NUQVRFX0tFWSA9ICdyZXNvdXJjZUxvY2snO1xuY29uc3QgTE9DS19JQ09OX0lEID0gJ2xvY2snO1xuY29uc3QgTE9DS19JTkRJQ0FUT1JfQ1NTX0NMQVNTID0gJ29ic2lkaWFuLWRldi11dGlscy1sb2NrLWluZGljYXRvcic7XG5jb25zdCBMT0NLX0lORElDQVRPUl9GTEFTSF9DU1NfQ0xBU1MgPSAnb2JzaWRpYW4tZGV2LXV0aWxzLWxvY2staW5kaWNhdG9yLWZsYXNoJztcbmNvbnN0IFNUQVRVU19CQVJfSVRFTV9DU1NfQ0xBU1MgPSAnc3RhdHVzLWJhci1pdGVtJztcbmNvbnN0IFNUQVRVU19CQVJfQ1NTX1NFTEVDVE9SID0gJy5zdGF0dXMtYmFyJztcbmNvbnN0IFVOTE9DS19JQ09OX0lEID0gJ3VubG9jayc7XG5jb25zdCBNSURETEVfTU9VU0VfQlVUVE9OID0gMTtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgbG9ja1Jlc291cmNlRm9yUGF0aH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9ja1Jlc291cmNlRm9yUGF0aFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgb3BlcmF0aW9uIHRha2luZyB0aGUgbG9jayAoZS5nLiBgJ01vdmUgc2VsZWN0aW9uJ2ApLiBTaG93biBuZXh0IHRvXG4gICAqIHRoZSBwbHVnaW4gbmFtZSBpbiB0aGUgdW5sb2NrIGNvbmZpcm1hdGlvbiBkaWFsb2cuXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb25OYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gbG9jay5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgbG9ja2luZyBwbHVnaW4gKGUuZy4gaXRzIGBtYW5pZmVzdC5pZGApLiBUaGUgbG9jayBpcyBhdHRyaWJ1dGVkIHRvIGl0IGZvclxuICAgKiByZWZlcmVuY2UtY291bnRpbmcgYW5kIHRoZSBpbmRpY2F0b3JzJyBcImxvY2tlZCBieVwiIHRvb2x0aXAuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnQubG9ja0ZvclBhdGh9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIHtAbGluayBBYm9ydENvbnRyb2xsZXJ9IGFzc29jaWF0ZWQgd2l0aCB0aGUgbG9jay4gV2hlbiBhIGxvY2sgaW5kaWNhdG9yIGlzIGNsaWNrZWQgKHdpdGhcbiAgICogYW55IG1vdXNlIGJ1dHRvbikgYW5kIHRoZSB1c2VyIGNvbmZpcm1zIGFuIHVubG9jaywgdGhlIFwiVW5sb2NrIGFjdGl2ZSBub3RlXCIgY29tbWFuZCBydW5zLCBvclxuICAgKiB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50LnJlcXVlc3RVbmxvY2tGb3JQYXRofSAvIHtAbGluayByZXF1ZXN0UmVzb3VyY2VVbmxvY2tGb3JQYXRofSBpcyBjYWxsZWRcbiAgICogZm9yIHRoZSBwYXRoLCB0aGlzIGNvbnRyb2xsZXIgaXMgYWJvcnRlZCBzbyB0aGUgb3BlcmF0aW9uIGhvbGRpbmcgdGhlIGxvY2sgY2FuIGNhbmNlbCBpdHNlbGYuIFVubGVzc1xuICAgKiB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMuc2hvdWxkUmVsZWFzZU9uQWJvcnR9IGlzIHNldCwgdGhlIG9wZXJhdGlvbiBpc1xuICAgKiBleHBlY3RlZCB0byByZWxlYXNlIHRoZSBsb2NrIGluIGl0cyBvd24gY2xlYW51cC4gV2hlbiBvbWl0dGVkLCBhbiB1bmxvY2sgc3RpbGwgcmVsZWFzZXMgdGhlIGxvY2sgYnV0XG4gICAqIGNhbm5vdCBjYW5jZWwgdGhlIG9wZXJhdGlvbiB0aGF0IHRvb2sgaXQuXG4gICAqL1xuICByZWFkb25seSBhYm9ydENvbnRyb2xsZXI/OiBBYm9ydENvbnRyb2xsZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2NrIHNjb3BlLiBgJ3N1YnRyZWUnYCBhbHNvIGxvY2tzIGV2ZXJ5IGRlc2NlbmRhbnQgb2YgYSBmb2xkZXIgcGF0aDsgYCdmaWxlJ2AgbG9ja3Mgb25seSB0aGVcbiAgICogZXhhY3QgcGF0aC4gQSBgc3VidHJlZWAgbG9jayBtdXN0IGJlIHJlbGVhc2VkIHZpYSB0aGUgcmV0dXJuZWQge0BsaW5rIERpc3Bvc2FibGV9IChub3QgdGhlXG4gICAqIGV4cGxpY2l0IHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnQudW5sb2NrRm9yUGF0aH0pLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJ2ZpbGUnYFxuICAgKi9cbiAgcmVhZG9ubHkgbW9kZT86IFJlc291cmNlTG9ja01vZGU7XG5cbiAgLyoqXG4gICAqIFdoZW4gcHJvdmlkZWQsIHRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGVuIGFuIHVubG9jayBvZiB0aGUgbG9jayBpcyByZXF1ZXN0ZWQgXHUyMDE0IGkuZS4gd2hlbiB0aGVcbiAgICogbG9jaydzIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcy5hYm9ydENvbnRyb2xsZXJ9IGlzIGFib3J0ZWQgKGJ5IHRoZVxuICAgKiBpbmRpY2F0b3IncyBcIlVubG9ja1wiIG1lbnUsIHRoZSBcIlVubG9jayBhY3RpdmUgbm90ZVwiIGNvbW1hbmQsIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnQucmVxdWVzdFVubG9ja0ZvclBhdGh9LFxuICAgKiBvciB7QGxpbmsgaGFuZGxlRXh0ZXJuYWxNdXRhdGlvbn0pLiBVc2UgaXQgdG8gY2xlYXIgY29uc3VtZXItc2lkZSBzdGF0ZSB0aGF0IHNoYWRvd3MgdGhlIGxvY2sgKGUuZy5cbiAgICogYSBwZW5kaW5nLW9wZXJhdGlvbiBidWZmZXIgb3IgYSBub3RpY2UpIHdpdGhvdXQgaGFuZC13aXJpbmcgYW4gYGFib3J0YCBsaXN0ZW5lci4gRmlyZXMgYXQgbW9zdCBvbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgb25VbmxvY2tSZXF1ZXN0ZWQ/OiAoKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIG9wZXJhdGlvbiB0aGF0IHRvb2sgdGhlIGxvY2sgKGUuZy4gYCdNb3ZlIHNlbGVjdGlvbidgLCBgJ01lcmdlXG4gICAqIG5vdGVzJ2ApLiBJdCBpcyBzaG93biBcdTIwMTQgbmV4dCB0byB0aGUgbG9ja2luZyBwbHVnaW4ncyBuYW1lIFx1MjAxNCBpbiB0aGUgdW5sb2NrIGNvbmZpcm1hdGlvbiBkaWFsb2csIHNvXG4gICAqIHRoZSB1c2VyIHNlZXMgZXhhY3RseSB3aGljaCBvcGVyYXRpb24gYW4gdW5sb2NrIHdvdWxkIGNhbmNlbC5cbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdGlvbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byBsb2NrLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAsIHRoZSBsb2NrIGFsc28gKipibG9ja3MgdmF1bHQgbXV0YXRpb25zKiogb2YgdGhlIGNvdmVyZWQgcGF0aChzKTogYW55IGF0dGVtcHQgdG8gZWRpdCxcbiAgICogZGVsZXRlLCByZW5hbWUsIG1vdmUsIG9yIChyZSljcmVhdGUgdGhlIHJlc291cmNlIHRocm91Z2ggdGhlIGBWYXVsdGAvYEZpbGVNYW5hZ2VyYCBBUEkgdGhyb3dzIGFcbiAgICoge0BsaW5rIFJlc291cmNlTG9ja2VkRXJyb3J9LiBJbnN0YWxsZWQgbGF6aWx5IG9uIHRoZSBmaXJzdCBzdWNoIGxvY2sgYW5kIHJlbW92ZWQgd2hlbiB0aGUgbGFzdCBvbmVcbiAgICogaXMgcmVsZWFzZWQuIFdoZW4gYGZhbHNlYCAodGhlIGRlZmF1bHQpIHRoZSBsb2NrIG9ubHkgbWFrZXMgdGhlIGVkaXRvciByZWFkLW9ubHkgXHUyMDE0IGxlZ2FjeSBiZWhhdmlvcixcbiAgICogc28gZXhpc3RpbmcgY29uc3VtZXJzIHRoYXQgd3JpdGUgdG8gYSBub3RlIHRoZXkgaG9sZCBhbiBlZGl0b3IgbG9jayBvbiBhcmUgdW5hZmZlY3RlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQmxvY2tNdXRhdGlvbnM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGVuIGB0cnVlYCwgdGhlIGxvY2sgcmVsZWFzZXMgaXRzZWxmIHRoZSBtb21lbnQgaXRzXG4gICAqIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcy5hYm9ydENvbnRyb2xsZXJ9IGlzIGFib3J0ZWQsIGluc3RlYWQgb2YgcmVseWluZyBvblxuICAgKiB0aGUgb3duaW5nIG9wZXJhdGlvbiB0byByZWxlYXNlIGl0IGluIGl0cyBvd24gY2xlYW51cC4gVXNlIGl0IGZvciBhIGxvY2sgaGVsZCAqKmluZGVmaW5pdGVseSoqXG4gICAqIG91dHNpZGUgYSBgdXNpbmdgIHNjb3BlIChzbyB0aGVyZSBpcyBubyBgZmluYWxseWAgdG8gcmVsZWFzZSBpdCkgXHUyMDE0IGUuZy4gYSBsb2NrIHRoYXQgc3RheXMgdW50aWwgdGhlXG4gICAqIHVzZXIgZXhwbGljaXRseSB1bmxvY2tzLiBMZWF2ZSBpdCBgZmFsc2VgIGZvciBhIHRyYW5zYWN0aW9uYWwgb3BlcmF0aW9uIHRoYXQgaG9sZHMgdGhlIGxvY2sgdGhyb3VnaFxuICAgKiBpdHMgb3duIGFib3J0LWRyaXZlbiByb2xsYmFjayBhbmQgcmVsZWFzZXMgaXQgdmlhIGB1c2luZ2AgYXQgc2NvcGUgZXhpdC4gSGFzIG5vIGVmZmVjdCB3aXRob3V0IGFuXG4gICAqIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcy5hYm9ydENvbnRyb2xsZXJ9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRSZWxlYXNlT25BYm9ydD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVGhlIHNjb3BlIG9mIGEgbG9jay5cbiAqXG4gKiAtIGAnZmlsZSdgIGxvY2tzIG9ubHkgdGhlIGV4YWN0IHBhdGguXG4gKiAtIGAnc3VidHJlZSdgIGxvY2tzIHRoZSBwYXRoIGFuZCBldmVyeSBkZXNjZW5kYW50IHVuZGVyIGl0IChpdHMgd2hvbGUgZm9sZGVyIHN1YnRyZWUpLCBzbyBhIGZpbGVcbiAqICAgaW5zaWRlIGEgYHN1YnRyZWVgLWxvY2tlZCBmb2xkZXIgaXMgdHJlYXRlZCBhcyBsb2NrZWQgdG9vLlxuICovXG5leHBvcnQgdHlwZSBSZXNvdXJjZUxvY2tNb2RlID0gJ2ZpbGUnIHwgJ3N1YnRyZWUnO1xuXG5pbnRlcmZhY2UgTG9ja0Rlc2NyaXB0b3Ige1xuICByZWFkb25seSBvcGVyYXRpb25OYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIExvY2tFbnRyeSB7XG4gIHJlYWRvbmx5IGFib3J0Q29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyIHwgbnVsbDtcbiAgcmVhZG9ubHkgYmxvY2tzTXV0YXRpb25zOiBib29sZWFuO1xuICByZWFkb25seSBtb2RlOiBSZXNvdXJjZUxvY2tNb2RlO1xuICByZWFkb25seSBvblVubG9ja1JlcXVlc3RlZDogKCgpID0+IHZvaWQpIHwgbnVsbDtcbiAgcmVhZG9ubHkgb3BlcmF0aW9uTmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHBhdGggdGhlIGVudHJ5IGlzIGN1cnJlbnRseSByZWdpc3RlcmVkIHVuZGVyLiBEZWxpYmVyYXRlbHkgbXV0YWJsZTogYSByZW5hbWUgcmUta2V5cyB0aGVcbiAgICogcmVnaXN0cnksIGFuZCByZWxlYXNlIG11c3QgZmluZCB0aGUgZW50cnkgYXQgaXRzIENVUlJFTlQgcGF0aCBcdTIwMTQgYSByZWxlYXNlIHRoYXQgY2FwdHVyZWQgdGhlIHBhdGhcbiAgICogYXQgbG9jayB0aW1lIHdvdWxkIHNpbGVudGx5IG5vLW9wIGFmdGVyIHRoZSByZXNvdXJjZSBtb3ZlZCwgbGVha2luZyB0aGUgbG9jayBmb3JldmVyLlxuICAgKi9cbiAgcGF0aDogc3RyaW5nO1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICByZWFkb25seSBzaG91bGRSZWxlYXNlT25BYm9ydDogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIExvY2tJbmRpY2F0b3JzIHtcbiAgcmVhZG9ubHkgYWN0aW9uSWNvbkVsOiBIVE1MRWxlbWVudDtcbiAgZGlzcG9zZVR5cGVMaXN0ZW5lcjogKCkgPT4gdm9pZDtcbiAgcmVhZG9ubHkgdGFiSWNvbkVsOiBIVE1MRWxlbWVudCB8IG51bGw7XG59XG5cbmludGVyZmFjZSBNYW5hZ2VyTG9ja1BhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0Q29udHJvbGxlcj86IEFib3J0Q29udHJvbGxlciB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGJsb2Nrc011dGF0aW9ucz86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IG1vZGU/OiBSZXNvdXJjZUxvY2tNb2RlIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBvblVubG9ja1JlcXVlc3RlZD86ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgb3BlcmF0aW9uTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICByZWFkb25seSBzaG91bGRSZWxlYXNlT25BYm9ydD86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ29uc3RydWN0b3IgcGFyYW1ldGVycyBmb3Ige0BsaW5rIFJlc291cmNlTG9ja0V2ZW50c0NvbXBvbmVudH0uXG4gKi9cbmludGVyZmFjZSBSZXNvdXJjZUxvY2tFdmVudHNDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBvbkNoYW5nZTogKCkgPT4gdm9pZDtcbiAgcmVhZG9ubHkgb25FeHRlcm5hbE11dGF0aW9uOiAocGF0aDogc3RyaW5nKSA9PiB2b2lkO1xuICByZWFkb25seSBvbkZpbGVNZW51OiAobWVudTogTWVudSwgZmlsZTogVEFic3RyYWN0RmlsZSkgPT4gdm9pZDtcbiAgcmVhZG9ubHkgb25SZW5hbWU6IChvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZykgPT4gdm9pZDtcbn1cblxuaW50ZXJmYWNlIFJlc291cmNlTG9ja011dGF0aW9uQmxvY2tlckNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgc2hvdWxkQmxvY2tNdXRhdGlvbjogKHBhdGg6IHN0cmluZykgPT4gYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBTdWJzY3JpYmVzIHRvIHRoZSB3b3Jrc3BhY2UgZXZlbnRzIHRoYXQgc2hvdWxkIHRyaWdnZXIgYSBsb2NrIHJlY29uY2lsZSAoYW5kIHRoZSBmaWxlIGNvbnRleHQtbWVudVxuICogZXZlbnQgdGhhdCBvZmZlcnMgYW4gXCJVbmxvY2tcIiBpdGVtKS4gSW1wbGVtZW50ZWQgYXMgYSB7QGxpbmsgQ29tcG9uZW50RXh9IHNvIHRoZSBzdWJzY3JpcHRpb25zIGFyZVxuICogcmVnaXN0ZXJlZCBvbiBgbG9hZCgpYCBhbmQgYXV0b21hdGljYWxseSByZW1vdmVkIG9uIGB1bmxvYWQoKWAsIGluc3RlYWQgb2YgYmVpbmcgdHJhY2tlZCBieSBoYW5kLlxuICovXG5jbGFzcyBSZXNvdXJjZUxvY2tFdmVudHNDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRFeCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25DaGFuZ2U6ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25FeHRlcm5hbE11dGF0aW9uOiAocGF0aDogc3RyaW5nKSA9PiB2b2lkO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uRmlsZU1lbnU6IChtZW51OiBNZW51LCBmaWxlOiBUQWJzdHJhY3RGaWxlKSA9PiB2b2lkO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uUmVuYW1lOiAob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpID0+IHZvaWQ7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUmVzb3VyY2VMb2NrRXZlbnRzQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLm9uQ2hhbmdlID0gcGFyYW1zLm9uQ2hhbmdlO1xuICAgIHRoaXMub25FeHRlcm5hbE11dGF0aW9uID0gcGFyYW1zLm9uRXh0ZXJuYWxNdXRhdGlvbjtcbiAgICB0aGlzLm9uRmlsZU1lbnUgPSBwYXJhbXMub25GaWxlTWVudTtcbiAgICB0aGlzLm9uUmVuYW1lID0gcGFyYW1zLm9uUmVuYW1lO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICBzdXBlci5vbmxvYWQoKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAud29ya3NwYWNlLm9uKCdhY3RpdmUtbGVhZi1jaGFuZ2UnLCB0aGlzLm9uQ2hhbmdlKSk7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLndvcmtzcGFjZS5vbignbGF5b3V0LWNoYW5nZScsIHRoaXMub25DaGFuZ2UpKTtcbiAgICAvLyBTYW1lLWxlYWYgbmF2aWdhdGlvbiB0byBhbm90aGVyIG5vdGUgZmlyZXMgbm8gbGVhZi9sYXlvdXQgY2hhbmdlOyB3aXRob3V0IHRoaXMgaXQgc3RheXMgcmVhZC1vbmx5LlxuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC53b3Jrc3BhY2Uub24oJ2ZpbGUtb3BlbicsIHRoaXMub25DaGFuZ2UpKTtcbiAgICAvLyBBZGRzIGFuIFwiVW5sb2NrXCIgaXRlbSB0byBhIGxvY2tlZCBub3RlJ3MgdGFiL2ZpbGUgY29udGV4dCBtZW51IChhbG9uZ3NpZGUgdGhlIGluZGljYXRvciBtZW51cykuXG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLndvcmtzcGFjZS5vbignZmlsZS1tZW51JywgdGhpcy5vbkZpbGVNZW51KSk7XG4gICAgLy8gRXh0ZXJuYWwtY2hhbmdlIGJhY2tzdG9wOiBhIHZhdWx0L21ldGFkYXRhIGV2ZW50IG9uIGEgbXV0YXRpb24tYmxvY2tlZCBwYXRoIG5vdCBjb3ZlcmVkIGJ5IGFuIGFjdGl2ZSBieXBhc3Mgc2NvcGUgaXMgYW4gaW50cnVkZXIgKGEgc3luYy9GUy9hZGFwdGVyIGNoYW5nZSB0aGF0IGJ5cGFzc2VkIHRoZSBibG9ja2VyIHBhdGNoKS5cbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAudmF1bHQub24oJ2NyZWF0ZScsIChmaWxlKTogdm9pZCA9PiB7XG4gICAgICB0aGlzLm9uRXh0ZXJuYWxNdXRhdGlvbihmaWxlLnBhdGgpO1xuICAgIH0pKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAudmF1bHQub24oJ2RlbGV0ZScsIChmaWxlKTogdm9pZCA9PiB7XG4gICAgICB0aGlzLm9uRXh0ZXJuYWxNdXRhdGlvbihmaWxlLnBhdGgpO1xuICAgIH0pKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAudmF1bHQub24oJ3JlbmFtZScsIChmaWxlLCBvbGRQYXRoKTogdm9pZCA9PiB7XG4gICAgICAvLyBSZS1rZXkgRklSU1QsIHNvIHRoZSBjaGVja3MgYmVsb3cgcnVuIGFnYWluc3Qgd2hlcmUgdGhlIGxvY2tzIGFjdHVhbGx5IGFyZSBub3cuXG4gICAgICAvLyBJbnRydWRlciBkZXRlY3Rpb24gaXMgdW5hZmZlY3RlZDogdGhlIG9sZCBwYXRoIHN0b3BzIHJlc29sdmluZywgYnV0IHRoZSBuZXcgb25lIGlzIGNvdmVyZWQgaW5zdGVhZC5cbiAgICAgIHRoaXMub25SZW5hbWUob2xkUGF0aCwgZmlsZS5wYXRoKTtcbiAgICAgIHRoaXMub25FeHRlcm5hbE11dGF0aW9uKG9sZFBhdGgpO1xuICAgICAgdGhpcy5vbkV4dGVybmFsTXV0YXRpb24oZmlsZS5wYXRoKTtcbiAgICB9KSk7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUub24oJ2RlbGV0ZWQnLCAoZmlsZSk6IHZvaWQgPT4ge1xuICAgICAgdGhpcy5vbkV4dGVybmFsTXV0YXRpb24oZmlsZS5wYXRoKTtcbiAgICB9KSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUcmFja3MgcGF0aC1zY29wZWQgZWRpdG9yIGxvY2tzIGFuZCBrZWVwcyBldmVyeSBvcGVuIHtAbGluayBNYXJrZG93blZpZXd9IGluIHN5bmMgd2l0aCB0aGUgbG9ja2VkXG4gKiBzZXQuIEEgc2luZ2xlIGluc3RhbmNlIGxpdmVzIG9uIHRoZSBzaGFyZWQgYG9ic2lkaWFuLWRldi11dGlsc2Agc3RhdGUuIEVhY2ggbG9jayBpcyBvbmVcbiAqIHtAbGluayBMb2NrRW50cnl9IGluIGEgcGVyLXBhdGggbGlzdCwgc28gYSBwYXRoIGNhbiBiZSBoZWxkIGJ5IHNldmVyYWwgcGx1Z2lucyAob3Igc2V2ZXJhbCB0aW1lcyBieVxuICogb25lKSBjb25jdXJyZW50bHkgYW5kIGlzIHJlbGVhc2VkIG9ubHkgd2hlbiBpdHMgbGFzdCBlbnRyeSBpcyByZW1vdmVkOyB0aGUgaW5kaWNhdG9ycyByZXBvcnQgd2hpY2hcbiAqIHBsdWdpbnMgY3VycmVudGx5IGhvbGQgYSBsb2NrLlxuICovXG5jbGFzcyBSZXNvdXJjZUxvY2tNYW5hZ2VyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBiZWVwZXIgPSBuZXcgQmVlcGVyKCk7XG4gIC8vIFRoZSBpbm5lciBzZXRzIGFyZSBtdXRhYmxlIHNvIGEgcmVuYW1lIGNhbiByZS1rZXkgdGhlIHBhdGhzIG9mIGFuIGluLWZsaWdodCBieXBhc3Mgc2NvcGUgaW4gcGxhY2U7XG4gIC8vIHRoZSBzY29wZSdzIGBEaXNwb3NhYmxlYCBkZWxldGVzIGJ5IHNldCBpZGVudGl0eSwgc28gbXV0YXRpbmcgdGhlIGNvbnRlbnRzIGNhbm5vdCBvcnBoYW4gaXQuXG4gIHByaXZhdGUgcmVhZG9ubHkgYnlwYXNzUGF0aFNldHMgPSBuZXcgU2V0PFNldDxzdHJpbmc+PigpO1xuICBwcml2YXRlIGV2ZW50c0NvbXBvbmVudDogbnVsbCB8IFJlc291cmNlTG9ja0V2ZW50c0NvbXBvbmVudCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5kaWNhdG9yc0J5VmlldyA9IG5ldyBNYXA8TWFya2Rvd25WaWV3LCBMb2NrSW5kaWNhdG9ycz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2NrRW50cmllc0J5UGF0aCA9IG5ldyBNYXA8c3RyaW5nLCBMb2NrRW50cnlbXT4oKTtcbiAgcHJpdmF0ZSBtdXRhdGlvbkJsb2NrZXJDb21wb25lbnQ6IG51bGwgfCBSZXNvdXJjZUxvY2tNdXRhdGlvbkJsb2NrZXJDb21wb25lbnQgPSBudWxsO1xuICBwcml2YXRlIHN0YXR1c0Jhckl0ZW1FbDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICBwdWJsaWMgYnlwYXNzKGFwcDogQXBwLCBwYXRoc09yRmlsZXM6IHJlYWRvbmx5IFBhdGhPckZpbGVbXSk6IERpc3Bvc2FibGUge1xuICAgIGNvbnN0IGJ5cGFzc2VkUGF0aHMgPSBuZXcgU2V0KHBhdGhzT3JGaWxlcy5tYXAoKHBhdGhPckZpbGUpID0+IGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKSkpO1xuICAgIHRoaXMuYnlwYXNzUGF0aFNldHMuYWRkKGJ5cGFzc2VkUGF0aHMpO1xuICAgIHJldHVybiBuZXcgQ2FsbGJhY2tEaXNwb3NhYmxlKHtcbiAgICAgIGNhbGxiYWNrOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuYnlwYXNzUGF0aFNldHMuZGVsZXRlKGJ5cGFzc2VkUGF0aHMpO1xuICAgICAgfSxcbiAgICAgIG11bHRpcGxlRGlzcG9zZUJlaGF2aW9yOiBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JZ25vcmVcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGdWxseSB1bmxvY2tzIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoLiBSZXNvbHZlcyB0aGUgbG9jayBjb3ZlcmluZyBpdCBcdTIwMTQgdGhlIHBhdGggaXRzZWxmIHdoZW5cbiAgICogZGlyZWN0bHkgbG9ja2VkLCBvdGhlcndpc2UgdGhlIGVuY2xvc2luZyBgc3VidHJlZWAtbG9ja2VkIGZvbGRlciBcdTIwMTQgdGhlbiBhYm9ydHMgZXZlcnlcbiAgICoge0BsaW5rIEFib3J0Q29udHJvbGxlcn0gcmVnaXN0ZXJlZCBvbiB0aGF0IG93bmVyIChjYW5jZWxsaW5nIHRoZSBvcGVyYXRpb25zIHRoYXQgdG9vayB0aGUgbG9ja3MpXG4gICAqIEFORCByZW1vdmVzIHRoZSBvd25lcidzIGxvY2sgZW50cmllcyAocmVsZWFzaW5nIHRoZSBsb2NrIHVuY29uZGl0aW9uYWxseSkuIFVubGlrZVxuICAgKiB7QGxpbmsgcmVxdWVzdFVubG9ja30sIHdoaWNoIG9ubHkgYWJvcnRzIHRoZSBleGFjdCBwYXRoJ3MgY29udHJvbGxlcnMgYW5kIHJlbGllcyBvbiBlYWNoIG9wZXJhdGlvblxuICAgKiByZWxlYXNpbmcgaXRzIG93biBsb2NrLCB0aGlzIHJlc29sdmVzIGFuY2VzdG9yIGNvdmVyYWdlIGFuZCBhbHdheXMgcmVsZWFzZXMgXHUyMDE0IHNvIGEgbm90ZSBoZWxkIGJ5IGFuXG4gICAqIGluZGVmaW5pdGVseS1oZWxkIGxvY2sgaXMgZ3VhcmFudGVlZCB0byBiZWNvbWUgZWRpdGFibGUuIEEgbm8tb3Agd2hlbiBub3RoaW5nIGNvdmVycyB0aGUgcGF0aC5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byB1bmxvY2suXG4gICAqL1xuICBwdWJsaWMgZm9yY2VVbmxvY2soYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiB2b2lkIHtcbiAgICBjb25zdCBvd25lclBhdGggPSB0aGlzLnJlc29sdmVMb2NrT3duZXJQYXRoKGFwcCwgZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpKTtcbiAgICBpZiAob3duZXJQYXRoID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYWJvcnRBbmRSZWxlYXNlRW50cmllcyhhcHAsIG93bmVyUGF0aCk7XG4gIH1cblxuICBwdWJsaWMgaXNMb2NrZWQoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1BhdGhMb2NrZWQoZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gcGF0aCBpcyBsb2NrZWQgZGlyZWN0bHkgb3IgaXMgY292ZXJlZCBieSBhIGBzdWJ0cmVlYC1sb2NrZWQgYW5jZXN0b3JcbiAgICogZm9sZGVyLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHBhdGggaXMgaXRzZWxmIGxvY2tlZCBvciBsaWVzIHVuZGVyIGEgYHN1YnRyZWVgLWxvY2tlZCBmb2xkZXIuXG4gICAqL1xuICBwdWJsaWMgaXNMb2NrZWRCeUFuY2VzdG9yKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZUxvY2tPd25lclBhdGgoYXBwLCBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSkpICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBwYXRoIGlzIGNvdmVyZWQgYnkgYSBtdXRhdGlvbi1ibG9ja2luZyBsb2NrIChvbmUgdGFrZW4gd2l0aFxuICAgKiBgYmxvY2tzTXV0YXRpb25zYCkgZGlyZWN0bHkgb3Igb24gYSBgc3VidHJlZWAtbG9ja2VkIGFuY2VzdG9yIGZvbGRlci5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byBjaGVjay5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIGEgbXV0YXRpb24gb2YgdGhlIHBhdGggaXMgY3VycmVudGx5IGJsb2NrZWQuXG4gICAqL1xuICBwdWJsaWMgaXNNdXRhdGlvbkJsb2NrZWRCeUFuY2VzdG9yKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcGF0aCA9IGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKTtcbiAgICBjb25zdCBleGFjdEVudHJpZXMgPSB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmdldChwYXRoKTtcbiAgICBpZiAoZXhhY3RFbnRyaWVzPy5zb21lKChlbnRyeSkgPT4gZW50cnkuYmxvY2tzTXV0YXRpb25zKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2xvY2tlZFBhdGgsIGVudHJpZXNdIG9mIHRoaXMubG9ja0VudHJpZXNCeVBhdGgpIHtcbiAgICAgIGlmIChlbnRyaWVzLnNvbWUoKGVudHJ5KSA9PiBlbnRyeS5tb2RlID09PSAnc3VidHJlZScgJiYgZW50cnkuYmxvY2tzTXV0YXRpb25zKSAmJiBpc0NoaWxkKHsgYXBwLCBjaGlsZFBhdGhPckZpbGU6IHBhdGgsIHBhcmVudFBhdGhPckZpbGU6IGxvY2tlZFBhdGggfSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBsb2NrKHBhcmFtczogTWFuYWdlckxvY2tQYXJhbXMpOiBEaXNwb3NhYmxlIHtcbiAgICBjb25zdCB7IGFwcCB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IHBhdGggPSBnZXRQYXRoKGFwcCwgcGFyYW1zLnBhdGhPckZpbGUpO1xuICAgIGNvbnN0IGVudHJ5OiBMb2NrRW50cnkgPSB7XG4gICAgICBhYm9ydENvbnRyb2xsZXI6IHBhcmFtcy5hYm9ydENvbnRyb2xsZXIgPz8gbnVsbCxcbiAgICAgIGJsb2Nrc011dGF0aW9uczogcGFyYW1zLmJsb2Nrc011dGF0aW9ucyA/PyBmYWxzZSxcbiAgICAgIG1vZGU6IHBhcmFtcy5tb2RlID8/ICdmaWxlJyxcbiAgICAgIG9uVW5sb2NrUmVxdWVzdGVkOiBwYXJhbXMub25VbmxvY2tSZXF1ZXN0ZWQgPz8gbnVsbCxcbiAgICAgIG9wZXJhdGlvbk5hbWU6IHBhcmFtcy5vcGVyYXRpb25OYW1lLFxuICAgICAgcGF0aCxcbiAgICAgIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWQsXG4gICAgICBzaG91bGRSZWxlYXNlT25BYm9ydDogcGFyYW1zLnNob3VsZFJlbGVhc2VPbkFib3J0ID8/IGZhbHNlXG4gICAgfTtcbiAgICBsZXQgZW50cmllcyA9IHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KHBhdGgpO1xuICAgIGlmICghZW50cmllcykge1xuICAgICAgZW50cmllcyA9IFtdO1xuICAgICAgdGhpcy5sb2NrRW50cmllc0J5UGF0aC5zZXQocGF0aCwgZW50cmllcyk7XG4gICAgfVxuICAgIGVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgdGhpcy5lbnN1cmVTdWJzY3JpYmVkKGFwcCk7XG4gICAgaWYgKGVudHJ5LmJsb2Nrc011dGF0aW9ucykge1xuICAgICAgdGhpcy5lbnN1cmVCbG9ja2VySW5zdGFsbGVkKGFwcCk7XG4gICAgfVxuICAgIHRoaXMud2lyZVJlbGVhc2VPbkFib3J0KGFwcCwgZW50cnkpO1xuICAgIHRoaXMucmVjb25jaWxlKGFwcCk7XG5cbiAgICByZXR1cm4gbmV3IENhbGxiYWNrRGlzcG9zYWJsZSh7XG4gICAgICBjYWxsYmFjazogKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnJlbW92ZUVudHJ5KGFwcCwgZW50cnkpO1xuICAgICAgfSxcbiAgICAgIG11bHRpcGxlRGlzcG9zZUJlaGF2aW9yOiBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JZ25vcmVcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBYm9ydHMgZXZlcnkge0BsaW5rIEFib3J0Q29udHJvbGxlcn0gY3VycmVudGx5IHJlZ2lzdGVyZWQgZm9yIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoLCB3aGljaFxuICAgKiBjYW5jZWxzIHRoZSBvcGVyYXRpb25zIGhvbGRpbmcgdGhlIGxvY2suIEVhY2ggb3BlcmF0aW9uIHJlbGVhc2VzIGl0cyBvd24gbG9jayBpbiBpdHMgYGZpbmFsbHlgXG4gICAqIHdoZW4gaXQgb2JzZXJ2ZXMgdGhlIGFib3J0LCBzbyB0aGlzIGRvZXMgbm90IHVubG9jayB0aGUgcGF0aCBkaXJlY3RseS4gQSBuby1vcCB3aGVuIG5vIGNvbnRyb2xsZXJcbiAgICogaXMgcmVnaXN0ZXJlZCBmb3IgdGhlIHBhdGguXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gcmVxdWVzdCBhbiB1bmxvY2sgZm9yLlxuICAgKi9cbiAgcHVibGljIHJlcXVlc3RVbmxvY2soYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiB2b2lkIHtcbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQoZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpKTtcbiAgICBpZiAoIWVudHJpZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBlbnRyeS5hYm9ydENvbnRyb2xsZXI/LmFib3J0KCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVubG9jayhhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSwgcGx1Z2luSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHBhdGggPSBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSk7XG4gICAgY29uc3QgZW50cmllcyA9IHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KHBhdGgpO1xuICAgIGlmICghZW50cmllcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbmRleCA9IGVudHJpZXMuZmluZEluZGV4KChlbnRyeSkgPT4gZW50cnkucGx1Z2luSWQgPT09IHBsdWdpbklkKTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVudHJpZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMubG9ja0VudHJpZXNCeVBhdGguZGVsZXRlKHBhdGgpO1xuICAgIH1cbiAgICB0aGlzLnJlY29uY2lsZUFuZENsZWFudXAoYXBwKTtcbiAgfVxuXG4gIHB1YmxpYyB1bmxvY2tBbGxGb3JQbHVnaW4oYXBwOiBBcHAsIHBsdWdpbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFtwYXRoLCBlbnRyaWVzXSBvZiB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoKSB7XG4gICAgICBjb25zdCByZW1haW5pbmcgPSBlbnRyaWVzLmZpbHRlcigoZW50cnkpID0+IGVudHJ5LnBsdWdpbklkICE9PSBwbHVnaW5JZCk7XG4gICAgICBpZiAocmVtYWluaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmRlbGV0ZShwYXRoKTtcbiAgICAgIH0gZWxzZSBpZiAocmVtYWluaW5nLmxlbmd0aCAhPT0gZW50cmllcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5sb2NrRW50cmllc0J5UGF0aC5zZXQocGF0aCwgcmVtYWluaW5nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5yZWNvbmNpbGVBbmRDbGVhbnVwKGFwcCk7XG4gIH1cblxuICAvKipcbiAgICogQWJvcnRzIGV2ZXJ5IHtAbGluayBBYm9ydENvbnRyb2xsZXJ9IG9uIHRoZSBnaXZlbiAoYWxyZWFkeS1yZXNvbHZlZCkgb3duZXIgcGF0aCdzIGxvY2sgZW50cmllcyBcdTIwMTRcbiAgICogY2FuY2VsbGluZyB0aGUgb3duaW5nIG9wZXJhdGlvbnMgXHUyMDE0IGFuZCByZW1vdmVzIHRob3NlIGVudHJpZXMsIHJlbGVhc2luZyB0aGUgbG9jay4gVGhlIGVudHJpZXNcbiAgICogc25hcHNob3QgaXMgY29waWVkIGZpcnN0IGJlY2F1c2UgYW4gZW50cnkncyBgc2hvdWxkUmVsZWFzZU9uQWJvcnRgIGFib3J0IGxpc3RlbmVyIG11dGF0ZXMgdGhlXG4gICAqIGFycmF5IGFzIGl0IGZpcmVzLiBBbHdheXMgbGVhdmVzIHRoZSBvd25lciBwYXRoIHdpdGggbm8gZW50cmllcy5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBvd25lclBhdGggLSBUaGUgZGlyZWN0bHktbG9ja2VkIG93bmVyIHBhdGggd2hvc2UgZW50cmllcyB0byBhYm9ydCBhbmQgcmVsZWFzZS5cbiAgICovXG4gIHByaXZhdGUgYWJvcnRBbmRSZWxlYXNlRW50cmllcyhhcHA6IEFwcCwgb3duZXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQob3duZXJQYXRoKTtcbiAgICBhc3NlcnROb25OdWxsYWJsZShlbnRyaWVzKTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHNuYXBzaG90KGVudHJpZXMpKSB7XG4gICAgICBlbnRyeS5hYm9ydENvbnRyb2xsZXI/LmFib3J0KCk7XG4gICAgfVxuICAgIHRoaXMubG9ja0VudHJpZXNCeVBhdGguZGVsZXRlKG93bmVyUGF0aCk7XG4gICAgdGhpcy5yZWNvbmNpbGVBbmRDbGVhbnVwKGFwcCk7XG4gIH1cblxuICBwcml2YXRlIGFkZFVubG9ja01lbnVJdGVtKGFwcDogQXBwLCBtZW51OiBNZW51LCBwYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBtZW51LmFkZEl0ZW0oKGl0ZW0pID0+IHtcbiAgICAgIGl0ZW1cbiAgICAgICAgLnNldFRpdGxlKHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5yZXNvdXJjZUxvY2sudW5sb2NrTWVudUl0ZW0pKVxuICAgICAgICAuc2V0SWNvbihVTkxPQ0tfSUNPTl9JRClcbiAgICAgICAgLm9uQ2xpY2soY29udmVydEFzeW5jVG9TeW5jKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBpc0NvbmZpcm1lZCA9IGF3YWl0IGNvbmZpcm0oe1xuICAgICAgICAgICAgYXBwLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy51bmxvY2tDb25maXJtTWVzc2FnZShhcHAsIHBhdGgpLFxuICAgICAgICAgICAgdGl0bGU6IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5yZXNvdXJjZUxvY2sudW5sb2NrQ29uZmlybVRpdGxlKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChpc0NvbmZpcm1lZCkge1xuICAgICAgICAgICAgLy8gYHBhdGhgIGlzIHRoZSByZXNvbHZlZCBvd25lciBwYXRoLCBzbyBjYW5jZWwgaXRzIG9wZXJhdGlvbnMgYW5kIHJlbGVhc2UgdGhlIGxvY2sgb3V0cmlnaHQuXG4gICAgICAgICAgICB0aGlzLmFib3J0QW5kUmVsZWFzZUVudHJpZXMoYXBwLCBwYXRoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlSW5kaWNhdG9ycyhhcHA6IEFwcCwgdmlldzogTWFya2Rvd25WaWV3LCB0b29sdGlwOiBzdHJpbmcpOiBMb2NrSW5kaWNhdG9ycyB7XG4gICAgLy8gVGhlIGluZGljYXRvcnMgb3V0bGl2ZSBhIHJlbmFtZSBvZiB0aGUgbm90ZSAob3Igb2YgYW4gZW5jbG9zaW5nIGxvY2tlZCBmb2xkZXIpLCBzbyB0aGV5IHJlc29sdmVcbiAgICAvLyB0aGUgb3duZXIgbG9jayBhdCBDTElDSyB0aW1lIGZyb20gdGhlIHZpZXcncyBjdXJyZW50IGZpbGUsIGV4YWN0bHkgYXMgdGhlIHN0YXR1cy1iYXIgaXRlbSBkb2VzLlxuICAgIC8vIEEgY2FwdHVyZWQgb3duZXIgcGF0aCB3b3VsZCBnbyBzdGFsZSB0aGUgbW9tZW50IHRoZSBsb2NrIGlzIHJlLWtleWVkLlxuICAgIGNvbnN0IGdldE93bmVyUGF0aCA9ICgpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4gdGhpcy5yZXNvbHZlVmlld093bmVyUGF0aChhcHAsIHZpZXcpO1xuXG4gICAgY29uc3QgYWN0aW9uSWNvbkVsID0gdmlldy5hZGRBY3Rpb24oTE9DS19JQ09OX0lELCB0b29sdGlwLCBub29wKTtcbiAgICB0aGlzLnJlZ2lzdGVyVW5sb2NrTWVudShhcHAsIGFjdGlvbkljb25FbCwgZ2V0T3duZXJQYXRoKTtcblxuICAgIGxldCB0YWJJY29uRWw6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3QgdGFiU3RhdHVzQ29udGFpbmVyRWwgPSB2aWV3LmxlYWYudGFiSGVhZGVyU3RhdHVzQ29udGFpbmVyRWw7XG4gICAgaWYgKHRhYlN0YXR1c0NvbnRhaW5lckVsKSB7XG4gICAgICB0YWJJY29uRWwgPSB0YWJTdGF0dXNDb250YWluZXJFbC5jcmVhdGVTcGFuKHsgY2xzOiBMT0NLX0lORElDQVRPUl9DU1NfQ0xBU1MgfSk7XG4gICAgICBzZXRJY29uKHRhYkljb25FbCwgTE9DS19JQ09OX0lEKTtcbiAgICAgIHNldFRvb2x0aXAodGFiSWNvbkVsLCB0b29sdGlwKTtcbiAgICAgIHRoaXMucmVnaXN0ZXJVbmxvY2tNZW51KGFwcCwgdGFiSWNvbkVsLCBnZXRPd25lclBhdGgpO1xuICAgIH1cblxuICAgIC8vIEEgbG9ja2VkIHZpZXcgaXMgcmVhZC1vbmx5IGJ1dCBzdGlsbCBlZGl0YWJsZS1mb2N1c2FibGUsIHNvIGEga2V5c3Ryb2tlIGZpcmVzIGBiZWZvcmVpbnB1dGAuXG4gICAgLy8gT24gdGhhdCByZWplY3RlZCBhdHRlbXB0LCBmbGFzaCB0aGUgaW5kaWNhdG9ycyBhbmQgYmVlcCBzbyBpdCdzIGNsZWFyIHRoZSBub3RlIGlzIGxvY2tlZC5cbiAgICAvLyBUaGUgbGlzdGVuZXIgaXMgcmVtb3ZlZCBvbiB1bmxvY2suXG4gICAgY29uc3Qgb25UeXBlQXR0ZW1wdCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIHRoaXMuZmxhc2hJbmRpY2F0b3JzKHZpZXcpO1xuICAgICAgdGhpcy5iZWVwZXIuYmVlcCgpO1xuICAgIH07XG4gICAgdmlldy5jb250ZW50RWwuYWRkRXZlbnRMaXN0ZW5lcignYmVmb3JlaW5wdXQnLCBvblR5cGVBdHRlbXB0KTtcblxuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb25JY29uRWwsXG4gICAgICBkaXNwb3NlVHlwZUxpc3RlbmVyOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIHZpZXcuY29udGVudEVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JlZm9yZWlucHV0Jywgb25UeXBlQXR0ZW1wdCk7XG4gICAgICB9LFxuICAgICAgdGFiSWNvbkVsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlQmxvY2tlckluc3RhbGxlZChhcHA6IEFwcCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm11dGF0aW9uQmxvY2tlckNvbXBvbmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm11dGF0aW9uQmxvY2tlckNvbXBvbmVudCA9IG5ldyBSZXNvdXJjZUxvY2tNdXRhdGlvbkJsb2NrZXJDb21wb25lbnQoe1xuICAgICAgc2hvdWxkQmxvY2tNdXRhdGlvbjogKHBhdGgpOiBib29sZWFuID0+IHRoaXMuc2hvdWxkQmxvY2tNdXRhdGlvbihhcHAsIHBhdGgpXG4gICAgfSk7XG4gICAgdGhpcy5tdXRhdGlvbkJsb2NrZXJDb21wb25lbnQubG9hZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVTdWJzY3JpYmVkKGFwcDogQXBwKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZXZlbnRzQ29tcG9uZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZXZlbnRzQ29tcG9uZW50ID0gbmV3IFJlc291cmNlTG9ja0V2ZW50c0NvbXBvbmVudCh7XG4gICAgICBhcHAsXG4gICAgICBvbkNoYW5nZTogKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnJlY29uY2lsZShhcHApO1xuICAgICAgfSxcbiAgICAgIG9uRXh0ZXJuYWxNdXRhdGlvbjogKHBhdGgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVFeHRlcm5hbE11dGF0aW9uKGFwcCwgcGF0aCk7XG4gICAgICB9LFxuICAgICAgb25GaWxlTWVudTogKG1lbnUsIGZpbGUpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVGaWxlTWVudShhcHAsIG1lbnUsIGZpbGUpO1xuICAgICAgfSxcbiAgICAgIG9uUmVuYW1lOiAob2xkUGF0aCwgbmV3UGF0aCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZVJlbmFtZShhcHAsIG9sZFBhdGgsIG5ld1BhdGgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuZXZlbnRzQ29tcG9uZW50LmxvYWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgZmxhc2hFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgZWxlbWVudC5yZW1vdmVDbGFzcyhMT0NLX0lORElDQVRPUl9GTEFTSF9DU1NfQ0xBU1MpO1xuICAgIC8vIFJlYWQgbGF5b3V0IHRvIGZvcmNlIGEgcmVmbG93IHNvIHRoZSBmbGFzaCBhbmltYXRpb24gcmVzdGFydHMgb24gZXZlcnkgcmVqZWN0ZWQga2V5c3Ryb2tlLlxuICAgIGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgZWxlbWVudC5hZGRDbGFzcyhMT0NLX0lORElDQVRPUl9GTEFTSF9DU1NfQ0xBU1MpO1xuICB9XG5cbiAgcHJpdmF0ZSBmbGFzaEluZGljYXRvcnModmlldzogTWFya2Rvd25WaWV3KTogdm9pZCB7XG4gICAgY29uc3QgaW5kaWNhdG9ycyA9IHRoaXMuaW5kaWNhdG9yc0J5Vmlldy5nZXQodmlldyk7XG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIFtpbmRpY2F0b3JzPy5hY3Rpb25JY29uRWwsIGluZGljYXRvcnM/LnRhYkljb25FbCwgdGhpcy5zdGF0dXNCYXJJdGVtRWxdKSB7XG4gICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICB0aGlzLmZsYXNoRWxlbWVudChlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVhY3RzIHRvIGEgdmF1bHQvbWV0YWRhdGEgZXZlbnQgb24gYSBwYXRoLiBJZiB0aGUgcGF0aCBpcyBtdXRhdGlvbi1ibG9ja2VkIGFuZCBOT1QgY292ZXJlZCBieSBhblxuICAgKiBhY3RpdmUgYnlwYXNzIHNjb3BlLCB0aGUgY2hhbmdlIGJ5cGFzc2VkIHRoZSBibG9ja2VyIHBhdGNoIChzeW5jIC8gZmlsZXN5c3RlbSAvIGEgcmF3LWFkYXB0ZXJcbiAgICogd3JpdGUpIFx1MjAxNCBhbiBpbnRydWRlci4gQWJvcnQgdGhlIGBhYm9ydENvbnRyb2xsZXJgIG9mIGV2ZXJ5IG11dGF0aW9uLWJsb2NraW5nIGxvY2sgY292ZXJpbmcgdGhlIHBhdGhcbiAgICogc28gdGhlIG93bmluZyBvcGVyYXRpb24gY2FuY2VscyBhbmQgcm9sbHMgYmFjay4gQSBuby1vcCBmb3IgdGhlIG93bmVyJ3Mgb3duIChieXBhc3NlZCkgbXV0YXRpb25zLFxuICAgKiBmb3IgdW5ibG9ja2VkIHBhdGhzLCBhbmQgZm9yIGJsb2NraW5nIGxvY2tzIHdpdGggbm8gYGFib3J0Q29udHJvbGxlcmAuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIHRoZSBldmVudCBmaXJlZCBvbi5cbiAgICovXG4gIHByaXZhdGUgaGFuZGxlRXh0ZXJuYWxNdXRhdGlvbihhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzTXV0YXRpb25CbG9ja2VkQnlBbmNlc3RvcihhcHAsIHBhdGgpIHx8IHRoaXMuaXNCeXBhc3NlZChhcHAsIHBhdGgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2xvY2tlZFBhdGgsIGVudHJpZXNdIG9mIHRoaXMubG9ja0VudHJpZXNCeVBhdGgpIHtcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBpZiAoIWVudHJ5LmJsb2Nrc011dGF0aW9ucyB8fCAhZW50cnkuYWJvcnRDb250cm9sbGVyKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZG9lc0NvdmVyUGF0aCA9IGxvY2tlZFBhdGggPT09IHBhdGggfHwgKGVudHJ5Lm1vZGUgPT09ICdzdWJ0cmVlJyAmJiBpc0NoaWxkKHsgYXBwLCBjaGlsZFBhdGhPckZpbGU6IHBhdGgsIHBhcmVudFBhdGhPckZpbGU6IGxvY2tlZFBhdGggfSkpO1xuICAgICAgICBpZiAoZG9lc0NvdmVyUGF0aCkge1xuICAgICAgICAgIGVudHJ5LmFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVGaWxlTWVudShhcHA6IEFwcCwgbWVudTogTWVudSwgZmlsZTogVEFic3RyYWN0RmlsZSk6IHZvaWQge1xuICAgIC8vIE9mZmVyIFwiVW5sb2NrXCIgZm9yIGEgZGlyZWN0bHktbG9ja2VkIGZpbGUvZm9sZGVyLCBvciBhbnl0aGluZyBjb3ZlcmVkIGJ5IGEgYHN1YnRyZWVgIGxvY2sgb24gYW4gYW5jZXN0b3IuIFRoZSBtZW51IHRhcmdldHMgdGhlIG93bmVyIGxvY2sncyBwYXRoLlxuICAgIGNvbnN0IG93bmVyUGF0aCA9IHRoaXMucmVzb2x2ZUxvY2tPd25lclBhdGgoYXBwLCBmaWxlLnBhdGgpO1xuICAgIGlmIChvd25lclBhdGggPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hZGRVbmxvY2tNZW51SXRlbShhcHAsIG1lbnUsIG93bmVyUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogUmUta2V5cyB0aGUgcmVnaXN0cnkgb250byBhIHJlbmFtZWQgcGF0aCwgc28gYSBsb2NrIGZvbGxvd3MgdGhlIHJlc291cmNlIGl0IHdhcyB0YWtlbiBvbi4gTW92ZXNcbiAgICogdGhlIGVudHJpZXMgb2YgdGhlIHJlbmFtZWQgcGF0aCBBTkQgb2YgZXZlcnkgZGVzY2VuZGFudCBrZXkgKGEgZm9sZGVyIHJlbmFtZSBjaGFuZ2VzIGEgd2hvbGUgcGF0aFxuICAgKiBwcmVmaXgpLCBhbmQgcmViYXNlcyBldmVyeSBhY3RpdmUge0BsaW5rIFJlc291cmNlTG9ja01hbmFnZXIuYnlwYXNzfSBzY29wZSB0aGUgc2FtZSB3YXkgXHUyMDE0IHdpdGhvdXRcbiAgICogdGhhdCBzZWNvbmQgaGFsZiBhbiBvcGVyYXRpb24gdGhhdCByZW5hbWVzIGEgZm9sZGVyIGl0IGxvY2tlZCB3b3VsZCBoYXZlIGl0cyBPV04gbGF0ZXIgbXV0YXRpb25zXG4gICAqIHJlYWQgYXMgaW50cnVkZXJzLlxuICAgKlxuICAgKiBJZGVtcG90ZW50OiBhIHBhdGggdGhhdCBubyBsb25nZXIgbWF0Y2hlcyBpcyBsZWZ0IGFsb25lLCBzbyBpdCBkb2VzIG5vdCBtYXR0ZXIgd2hldGhlciBPYnNpZGlhblxuICAgKiBlbWl0cyB0aGUgZm9sZGVyJ3MgcmVuYW1lIGV2ZW50IGJlZm9yZSBvciBhZnRlciBpdHMgZGVzY2VuZGFudHMnLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIG9sZFBhdGggLSBUaGUgcGF0aCB0aGUgcmVzb3VyY2Ugd2FzIHJlbmFtZWQgZnJvbS5cbiAgICogQHBhcmFtIG5ld1BhdGggLSBUaGUgcGF0aCB0aGUgcmVzb3VyY2Ugd2FzIHJlbmFtZWQgdG8uXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVJlbmFtZShhcHA6IEFwcCwgb2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBDb2xsZWN0IGZpcnN0LCBhcHBseSBhZnRlcjogd3JpdGluZyBiYWNrIHdoaWxlIGl0ZXJhdGluZyB3b3VsZCByZS12aXNpdCB0aGUganVzdC1tb3ZlZCBrZXlzLlxuICAgIGNvbnN0IG1vdmVkRW50cmllc0J5UGF0aCA9IG5ldyBNYXA8c3RyaW5nLCBMb2NrRW50cnlbXT4oKTtcbiAgICBmb3IgKGNvbnN0IFtsb2NrZWRQYXRoLCBlbnRyaWVzXSBvZiB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoKSB7XG4gICAgICBjb25zdCByZWJhc2VkUGF0aCA9IHJlYmFzZVBhdGgobG9ja2VkUGF0aCwgb2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgICBpZiAocmViYXNlZFBhdGggPT09IG51bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgZW50cnkucGF0aCA9IHJlYmFzZWRQYXRoO1xuICAgICAgfVxuICAgICAgbW92ZWRFbnRyaWVzQnlQYXRoLnNldChyZWJhc2VkUGF0aCwgZW50cmllcyk7XG4gICAgICB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmRlbGV0ZShsb2NrZWRQYXRoKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtyZWJhc2VkUGF0aCwgZW50cmllc10gb2YgbW92ZWRFbnRyaWVzQnlQYXRoKSB7XG4gICAgICBjb25zdCBleGlzdGluZ0VudHJpZXMgPSB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmdldChyZWJhc2VkUGF0aCk7XG4gICAgICBpZiAoZXhpc3RpbmdFbnRyaWVzKSB7XG4gICAgICAgIC8vIEEgc3dhcCByZW5hbWVzIG9uZSBsb2NrZWQgcGF0aCBvbnRvIGFub3RoZXIsIHNvIHRoZSB0d28gZW50cnkgbGlzdHMgTUVSR0UgXHUyMDE0IG5laXRoZXIgaG9sZGVyIGxvc2VzIGl0cyBsb2NrLlxuICAgICAgICBleGlzdGluZ0VudHJpZXMucHVzaCguLi5lbnRyaWVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9ja0VudHJpZXNCeVBhdGguc2V0KHJlYmFzZWRQYXRoLCBlbnRyaWVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGJ5cGFzc2VkUGF0aHMgb2YgdGhpcy5ieXBhc3NQYXRoU2V0cykge1xuICAgICAgLy8gU2FtZSBjb2xsZWN0LXRoZW4tYXBwbHkgc2hhcGU6IHRoZSBzZXQgbWF5IG5vdCBiZSBtdXRhdGVkIHdoaWxlIGl0IGlzIGJlaW5nIGl0ZXJhdGVkLlxuICAgICAgY29uc3QgcmViYXNlZEJ5cGFzc2VkUGF0aHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCBieXBhc3NlZFBhdGggb2YgYnlwYXNzZWRQYXRocykge1xuICAgICAgICBjb25zdCByZWJhc2VkUGF0aCA9IHJlYmFzZVBhdGgoYnlwYXNzZWRQYXRoLCBvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICAgICAgaWYgKHJlYmFzZWRQYXRoICE9PSBudWxsKSB7XG4gICAgICAgICAgcmViYXNlZEJ5cGFzc2VkUGF0aHMuc2V0KGJ5cGFzc2VkUGF0aCwgcmViYXNlZFBhdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtieXBhc3NlZFBhdGgsIHJlYmFzZWRQYXRoXSBvZiByZWJhc2VkQnlwYXNzZWRQYXRocykge1xuICAgICAgICBieXBhc3NlZFBhdGhzLmRlbGV0ZShieXBhc3NlZFBhdGgpO1xuICAgICAgICBieXBhc3NlZFBhdGhzLmFkZChyZWJhc2VkUGF0aCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVjb25jaWxlIHVuY29uZGl0aW9uYWxseTogYSByZW5hbWUgY2hhbmdlcyBjb3ZlcmFnZSBldmVuIHdoZW4gbm8ga2V5IG1vdmVkIFx1MjAxNCBhIG5vdGUgcmVuYW1lZCBJTlRPXG4gICAgLy8gQSBgc3VidHJlZWAtbG9ja2VkIGZvbGRlciBiZWNvbWVzIGNvdmVyZWQsIG9uZSByZW5hbWVkIE9VVCBvZiBpdCBzdG9wcyBiZWluZyBjb3ZlcmVkLlxuICAgIHRoaXMucmVjb25jaWxlKGFwcCk7XG4gIH1cblxuICBwcml2YXRlIGhhc0Jsb2NraW5nTG9jaygpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IGVudHJpZXMgb2YgdGhpcy5sb2NrRW50cmllc0J5UGF0aC52YWx1ZXMoKSkge1xuICAgICAgaWYgKGVudHJpZXMuc29tZSgoZW50cnkpID0+IGVudHJ5LmJsb2Nrc011dGF0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgcGF0aCBpcyBjb3ZlcmVkIGJ5IGFuIGFjdGl2ZSB7QGxpbmsgUmVzb3VyY2VMb2NrTWFuYWdlci5ieXBhc3N9IHNjb3BlIFx1MjAxNCB0aGVcbiAgICogb3duZXIgZGVjbGFyaW5nIHRoYXQgaXRzIG93biBtdXRhdGlvbnMgb2YgdGhlIHBhdGggKGFuZCwgZm9yIGEgZm9sZGVyLCBpdHMgc3VidHJlZSkgYXJlIHNhbmN0aW9uZWQuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIGJlaW5nIG11dGF0ZWQuXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiBzb21lIGFjdGl2ZSBieXBhc3Mgc2NvcGUgY292ZXJzIHRoZSBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBpc0J5cGFzc2VkKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IGJ5cGFzc2VkUGF0aHMgb2YgdGhpcy5ieXBhc3NQYXRoU2V0cykge1xuICAgICAgZm9yIChjb25zdCBieXBhc3NlZFBhdGggb2YgYnlwYXNzZWRQYXRocykge1xuICAgICAgICBpZiAoaXNDaGlsZE9yU2VsZih7IGFwcCwgY2hpbGRQYXRoT3JGaWxlOiBwYXRoLCBwYXJlbnRQYXRoT3JGaWxlOiBieXBhc3NlZFBhdGggfSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGlzUGF0aExvY2tlZChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KHBhdGgpPy5sZW5ndGggPz8gMCkgPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgZGVkdXBsaWNhdGVkIGxpc3Qgb2YgYChwbHVnaW4gbmFtZSwgb3BlcmF0aW9uIG5hbWUpYCBwYWlycyBkZXNjcmliaW5nIHRoZSBsb2NrcyBvbiBhXG4gICAqIHBhdGggXHUyMDE0IG9uZSBwZXIgZGlzdGluY3QgcGx1Z2luK29wZXJhdGlvbi4gRHJpdmVzIHRoZSB1bmxvY2sgY29uZmlybWF0aW9uLCBzbyB0aGUgdXNlciBzZWVzIGV4YWN0bHlcbiAgICogd2hpY2ggb3BlcmF0aW9ucyBhbiB1bmxvY2sgd291bGQgY2FuY2VsLiBPbmx5IGV2ZXIgY2FsbGVkIGZvciBhIGxvY2tlZCBwYXRoLCBzbyBpdHMgZW50cmllcyBhcmVcbiAgICogYWx3YXlzIHByZXNlbnQuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBkaXJlY3RseS1sb2NrZWQgcGF0aCB3aG9zZSBsb2NrIGRlc2NyaXB0b3JzIHRvIGJ1aWxkLlxuICAgKiBAcmV0dXJucyBUaGUgZGlzdGluY3QgbG9jayBkZXNjcmlwdG9ycyBjb3ZlcmluZyB0aGUgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgbG9ja0Rlc2NyaXB0b3JzKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBMb2NrRGVzY3JpcHRvcltdIHtcbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQocGF0aCk7XG4gICAgYXNzZXJ0Tm9uTnVsbGFibGUoZW50cmllcyk7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IGRlc2NyaXB0b3JzOiBMb2NrRGVzY3JpcHRvcltdID0gW107XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBjb25zdCBwbHVnaW5OYW1lID0gYXBwLnBsdWdpbnMubWFuaWZlc3RzW2VudHJ5LnBsdWdpbklkXT8ubmFtZSA/PyBlbnRyeS5wbHVnaW5JZDtcbiAgICAgIGNvbnN0IGtleSA9IGAke3BsdWdpbk5hbWV9XFxuJHtlbnRyeS5vcGVyYXRpb25OYW1lfWA7XG4gICAgICBpZiAoc2Vlbi5oYXMoa2V5KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHNlZW4uYWRkKGtleSk7XG4gICAgICBkZXNjcmlwdG9ycy5wdXNoKHsgb3BlcmF0aW9uTmFtZTogZW50cnkub3BlcmF0aW9uTmFtZSwgcGx1Z2luTmFtZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGRlc2NyaXB0b3JzO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2NraW5nUGx1Z2luTmFtZXMoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQocGF0aCk7XG4gICAgLy8gYGxvY2tpbmdQbHVnaW5OYW1lc2AgaXMgb25seSBldmVyIGNhbGxlZCBmb3IgYSBsb2NrZWQgcGF0aCwgc28gaXRzIGVudHJpZXMgYXJlIGFsd2F5cyBwcmVzZW50LlxuICAgIGFzc2VydE5vbk51bGxhYmxlKGVudHJpZXMpO1xuICAgIGNvbnN0IHBsdWdpbklkcyA9IFsuLi5uZXcgU2V0KGVudHJpZXMubWFwKChlbnRyeSkgPT4gZW50cnkucGx1Z2luSWQpKV07XG4gICAgcmV0dXJuIHBsdWdpbklkcy5tYXAoKHBsdWdpbklkKSA9PiBhcHAucGx1Z2lucy5tYW5pZmVzdHNbcGx1Z2luSWRdPy5uYW1lID8/IHBsdWdpbklkKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9ja1Rvb2x0aXAoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgaGVhZGVyID0gdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlc291cmNlTG9jay5sb2NrZWRCeVRvb2x0aXApO1xuICAgIC8vIEEgcnVudGltZS1sZW5ndGggbGlzdCBvZiBwbHVnaW4gbmFtZXMsIG9uZSBwZXIgbGluZSB1bmRlciB0aGUgaGVhZGVyLlxuICAgIHJldHVybiBbaGVhZGVyLCAuLi50aGlzLmxvY2tpbmdQbHVnaW5OYW1lcyhhcHAsIHBhdGgpXS5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVjb25jaWxlKGFwcDogQXBwKTogdm9pZCB7XG4gICAgY29uc3Qgdmlld3NUb0xvY2sgPSBuZXcgU2V0PE1hcmtkb3duVmlldz4oKTtcbiAgICBmb3IgKGNvbnN0IGxlYWYgb2YgYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoVmlld1R5cGUuTWFya2Rvd24pKSB7XG4gICAgICBjb25zdCB2aWV3ID0gbGVhZi52aWV3O1xuICAgICAgaWYgKCEodmlldyBpbnN0YW5jZW9mIE1hcmtkb3duVmlldykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhdGggPSB2aWV3LmZpbGU/LnBhdGg7XG4gICAgICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXNvbHZlIHRoZSBsb2NrIGNvdmVyaW5nIHRoaXMgdmlldzogdGhlIGV4YWN0IHBhdGggd2hlbiBkaXJlY3RseSBsb2NrZWQsIG90aGVyd2lzZSB0aGUgZW5jbG9zaW5nIGBzdWJ0cmVlYC1sb2NrZWQgZm9sZGVyLiBJbmRpY2F0b3JzL3Rvb2x0aXAvdW5sb2NrIG1lbnUga2V5IG9mZiB0aGF0IG93bmVyIHBhdGguXG4gICAgICBjb25zdCBvd25lclBhdGggPSB0aGlzLnJlc29sdmVMb2NrT3duZXJQYXRoKGFwcCwgcGF0aCk7XG4gICAgICBpZiAob3duZXJQYXRoID09PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2aWV3c1RvTG9jay5hZGQodmlldyk7XG4gICAgICBjb25zdCB0b29sdGlwID0gdGhpcy5sb2NrVG9vbHRpcChhcHAsIG93bmVyUGF0aCk7XG4gICAgICAvLyBSZS1hcHBseSB0aGUgcmVhZC1vbmx5IHRvZ2dsZSBvbiBldmVyeSByZWNvbmNpbGUsIG5vdCBvbmx5IHRoZSBmaXJzdCB0aW1lIGEgdmlldyBpcyB0cmFja2VkLlxuICAgICAgLy8gVGhlIHRvZ2dsZSBpcyBpZGVtcG90ZW50LCBzbyByZS1hcHBseWluZyB0byBhbiBhbHJlYWR5LWxvY2tlZCB2aWV3IGlzIGNoZWFwLlxuICAgICAgLy8gQSB2aWV3IG9wZW5lZCBhZnRlciB0aGUgbG9jayBpcyByZWNvbmNpbGVkIHN5bmNocm9ub3VzbHksIGJlZm9yZSBpdHMgQ29kZU1pcnJvciBpcyByZWFkeS5cbiAgICAgIC8vIEl0cyBmaXJzdCB0b2dnbGUgaXMgdGhlcmVmb3JlIGEgbm8tb3A7IHJlLWFwcGx5aW5nIG1ha2VzIHRoZSBsb2NrIHRha2UgaG9sZCBvbmNlIGl0IHNldHRsZXMuXG4gICAgICB0b2dnbGVFZGl0b3JSZWFkT25seSh2aWV3LmVkaXRvciwgdHJ1ZSk7XG4gICAgICBjb25zdCBpbmRpY2F0b3JzID0gdGhpcy5pbmRpY2F0b3JzQnlWaWV3LmdldCh2aWV3KTtcbiAgICAgIGlmIChpbmRpY2F0b3JzKSB7XG4gICAgICAgIHRoaXMudXBkYXRlSW5kaWNhdG9yVG9vbHRpcHMoaW5kaWNhdG9ycywgdG9vbHRpcCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmluZGljYXRvcnNCeVZpZXcuc2V0KHZpZXcsIHRoaXMuY3JlYXRlSW5kaWNhdG9ycyhhcHAsIHZpZXcsIHRvb2x0aXApKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFt2aWV3LCBpbmRpY2F0b3JzXSBvZiB0aGlzLmluZGljYXRvcnNCeVZpZXcpIHtcbiAgICAgIGlmICh2aWV3c1RvTG9jay5oYXModmlldykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHRvZ2dsZUVkaXRvclJlYWRPbmx5KHZpZXcuZWRpdG9yLCBmYWxzZSk7XG4gICAgICBpbmRpY2F0b3JzLmRpc3Bvc2VUeXBlTGlzdGVuZXIoKTtcbiAgICAgIGluZGljYXRvcnMuYWN0aW9uSWNvbkVsLnJlbW92ZSgpO1xuICAgICAgaW5kaWNhdG9ycy50YWJJY29uRWw/LnJlbW92ZSgpO1xuICAgICAgdGhpcy5pbmRpY2F0b3JzQnlWaWV3LmRlbGV0ZSh2aWV3KTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZVN0YXR1c0JhcihhcHApO1xuICB9XG5cbiAgcHJpdmF0ZSByZWNvbmNpbGVBbmRDbGVhbnVwKGFwcDogQXBwKTogdm9pZCB7XG4gICAgdGhpcy5yZWNvbmNpbGUoYXBwKTtcbiAgICBpZiAodGhpcy5sb2NrRW50cmllc0J5UGF0aC5zaXplID09PSAwKSB7XG4gICAgICB0aGlzLmV2ZW50c0NvbXBvbmVudD8udW5sb2FkKCk7XG4gICAgICB0aGlzLmV2ZW50c0NvbXBvbmVudCA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc0Jsb2NraW5nTG9jaygpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5tdXRhdGlvbkJsb2NrZXJDb21wb25lbnQ/LnVubG9hZCgpO1xuICAgIHRoaXMubXV0YXRpb25CbG9ja2VyQ29tcG9uZW50ID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJVbmxvY2tNZW51KGFwcDogQXBwLCBlbGVtZW50OiBIVE1MRWxlbWVudCwgZ2V0Q29udGV4dFBhdGg6ICgpID0+IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIC8vIEEgY2xpY2sgb2YgQU5ZIG1vdXNlIGJ1dHRvbiBvbiBhIGxvY2sgaW5kaWNhdG9yIG9wZW5zIHRoZSBzYW1lIHVubG9jayBjb250ZXh0IG1lbnU6XG4gICAgLy8gYGNsaWNrYCBmaXJlcyBvbmx5IGZvciB0aGUgcHJpbWFyeSAobGVmdCkgYnV0dG9uLCBgY29udGV4dG1lbnVgIGZvciB0aGUgcmlnaHQgYnV0dG9uLCBhbmRcbiAgICAvLyBgYXV4Y2xpY2tgIGZvciB0aGUgbWlkZGxlIGJ1dHRvbiAodGhlIGJyb3dzZXIgZmlyZXMgbm8gYGNsaWNrYCBmb3IgaXQpLiBgYXV4Y2xpY2tgIGFsc28gZmlyZXMgZm9yXG4gICAgLy8gdGhlIHJpZ2h0IGJ1dHRvbiwgc28gaXQgaXMgZ3VhcmRlZCB0byB0aGUgbWlkZGxlIGJ1dHRvbiB0byBhdm9pZCBkb3VibGUtb3BlbmluZyBhbG9uZ3NpZGUgYGNvbnRleHRtZW51YC5cbiAgICAvLyBBIHBsYWluIGxpc3RlbmVyIGRpZXMgd2l0aCB0aGUgZWxlbWVudCB3aGVuIGl0IGlzIGAucmVtb3ZlKClgZCBvbiB1bmxvY2ssIHNvIGl0IG5ldmVyIGxlYWtzLlxuICAgIGNvbnN0IG9wZW5VbmxvY2tNZW51ID0gKCRldmVudDogTW91c2VFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25zdCBwYXRoID0gZ2V0Q29udGV4dFBhdGgoKTtcbiAgICAgIGlmIChwYXRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbWVudSA9IG5ldyBNZW51KCk7XG4gICAgICB0aGlzLmFkZFVubG9ja01lbnVJdGVtKGFwcCwgbWVudSwgcGF0aCk7XG4gICAgICBtZW51LnNob3dBdE1vdXNlRXZlbnQoJGV2ZW50KTtcbiAgICB9O1xuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvcGVuVW5sb2NrTWVudSk7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIG9wZW5VbmxvY2tNZW51KTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2F1eGNsaWNrJywgKCRldmVudCkgPT4ge1xuICAgICAgaWYgKCRldmVudC5idXR0b24gPT09IE1JRERMRV9NT1VTRV9CVVRUT04pIHtcbiAgICAgICAgb3BlblVubG9ja01lbnUoJGV2ZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlRW50cnkoYXBwOiBBcHAsIGVudHJ5OiBMb2NrRW50cnkpOiB2b2lkIHtcbiAgICAvLyBSZWFkIHRoZSBlbnRyeSdzIENVUlJFTlQgcGF0aCwgbm90IG9uZSBjYXB0dXJlZCB3aGVuIHRoZSBsb2NrIHdhcyB0YWtlbjogYSByZW5hbWUgbWF5IGhhdmVcbiAgICAvLyByZS1rZXllZCBpdCBzaW5jZSwgYW5kIGxvb2tpbmcgaXQgdXAgdW5kZXIgdGhlIG9sZCBwYXRoIHdvdWxkIHNpbGVudGx5IGxlYWsgdGhlIGxvY2suXG4gICAgY29uc3QgZW50cmllcyA9IHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KGVudHJ5LnBhdGgpO1xuICAgIGlmICghZW50cmllcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbmRleCA9IGVudHJpZXMuaW5kZXhPZihlbnRyeSk7XG4gICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbnRyaWVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmRlbGV0ZShlbnRyeS5wYXRoKTtcbiAgICB9XG4gICAgdGhpcy5yZWNvbmNpbGVBbmRDbGVhbnVwKGFwcCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgd2hpY2ggbG9ja2VkIHBhdGggKGlmIGFueSkgY292ZXJzIHRoZSBnaXZlbiBwYXRoOiB0aGUgcGF0aCBpdHNlbGYgd2hlbiBkaXJlY3RseSBsb2NrZWQsXG4gICAqIG90aGVyd2lzZSB0aGUgbG9uZ2VzdCBgc3VidHJlZWAtbG9ja2VkIGFuY2VzdG9yIGZvbGRlciB0aGF0IGNvbnRhaW5zIGl0IChsb25nZXN0IHNvIGEgbmVzdGVkXG4gICAqIHN1YnRyZWUgbG9jayB3aW5zIGRldGVybWluaXN0aWNhbGx5IG92ZXIgYW4gb3V0ZXIgb25lKS5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggdG8gcmVzb2x2ZSBhbiBvd25lciBsb2NrIGZvci5cbiAgICogQHJldHVybnMgVGhlIGNvdmVyaW5nIGxvY2tlZCBwYXRoLCBvciBgbnVsbGAgd2hlbiBub3RoaW5nIGNvdmVycyBpdC5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZUxvY2tPd25lclBhdGgoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IG51bGwgfCBzdHJpbmcge1xuICAgIGlmICh0aGlzLmlzUGF0aExvY2tlZChwYXRoKSkge1xuICAgICAgcmV0dXJuIHBhdGg7XG4gICAgfVxuICAgIGxldCBiZXN0T3duZXJQYXRoOiBudWxsIHwgc3RyaW5nID0gbnVsbDtcbiAgICBmb3IgKGNvbnN0IFtsb2NrZWRQYXRoLCBlbnRyaWVzXSBvZiB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoKSB7XG4gICAgICBjb25zdCBoYXNTdWJ0cmVlTG9jayA9IGVudHJpZXMuc29tZSgoZW50cnkpID0+IGVudHJ5Lm1vZGUgPT09ICdzdWJ0cmVlJyk7XG4gICAgICBpZiAoaGFzU3VidHJlZUxvY2sgJiYgaXNDaGlsZCh7IGFwcCwgY2hpbGRQYXRoT3JGaWxlOiBwYXRoLCBwYXJlbnRQYXRoT3JGaWxlOiBsb2NrZWRQYXRoIH0pICYmIChiZXN0T3duZXJQYXRoID09PSBudWxsIHx8IGxvY2tlZFBhdGgubGVuZ3RoID4gYmVzdE93bmVyUGF0aC5sZW5ndGgpKSB7XG4gICAgICAgIGJlc3RPd25lclBhdGggPSBsb2NrZWRQYXRoO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmVzdE93bmVyUGF0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgbG9jayBjb3ZlcmluZyB0aGUgbm90ZSBhIHZpZXcgY3VycmVudGx5IHNob3dzIFx1MjAxNCBpdHMgb3duIHBhdGggd2hlbiBkaXJlY3RseSBsb2NrZWQsXG4gICAqIG90aGVyd2lzZSB0aGUgZW5jbG9zaW5nIGBzdWJ0cmVlYC1sb2NrZWQgZm9sZGVyLiBSZWFkIGF0IGNsaWNrIHRpbWUgYnkgdGhlIHZpZXcncyBsb2NrIGluZGljYXRvcnMsXG4gICAqIHNvIGl0IHJlZmxlY3RzIHJlbmFtZXMgb2YgdGhlIG5vdGUgYW5kIG9mIHRoZSBsb2NrZWQgZm9sZGVyIGFsaWtlLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHZpZXcgLSBUaGUgdmlldyB3aG9zZSBjdXJyZW50IGZpbGUgdG8gcmVzb2x2ZSBhbiBvd25lciBsb2NrIGZvci5cbiAgICogQHJldHVybnMgVGhlIGNvdmVyaW5nIGxvY2tlZCBwYXRoLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSB2aWV3IGhhcyBubyBmaWxlIG9yIG5vdGhpbmcgY292ZXJzIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlVmlld093bmVyUGF0aChhcHA6IEFwcCwgdmlldzogTWFya2Rvd25WaWV3KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBwYXRoID0gdmlldy5maWxlPy5wYXRoO1xuICAgIHJldHVybiBwYXRoID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB0aGlzLnJlc29sdmVMb2NrT3duZXJQYXRoKGFwcCwgcGF0aCkgPz8gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY2lkZXMgd2hldGhlciBhIG11dGF0aW9uIG9mIHRoZSBwYXRoIG11c3QgYmUgYmxvY2tlZDogYHRydWVgIHdoZW4gdGhlIHBhdGggaXMgbXV0YXRpb24tYmxvY2tlZFxuICAgKiBhbmQgbm90IGNvdmVyZWQgYnkgYW55IGFjdGl2ZSB7QGxpbmsgUmVzb3VyY2VMb2NrTWFuYWdlci5ieXBhc3N9IHNjb3BlLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCBiZWluZyBtdXRhdGVkLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgdG8gcmVqZWN0IHRoZSBtdXRhdGlvbiwgYGZhbHNlYCB0byBhbGxvdyBpdC5cbiAgICovXG4gIHByaXZhdGUgc2hvdWxkQmxvY2tNdXRhdGlvbihhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNNdXRhdGlvbkJsb2NrZWRCeUFuY2VzdG9yKGFwcCwgcGF0aCkgJiYgIXRoaXMuaXNCeXBhc3NlZChhcHAsIHBhdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSB1bmxvY2tDb25maXJtTWVzc2FnZShhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgY29uc3QgZnJhZ21lbnQgPSBjcmVhdGVGcmFnbWVudCgpO1xuICAgIGZyYWdtZW50LmFwcGVuZFRleHQodCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlc291cmNlTG9jay51bmxvY2tDb25maXJtTWVzc2FnZSkpO1xuICAgIC8vIEEgcnVudGltZS1sZW5ndGggbGlzdCBvZiB0aGUgbG9ja3MgY3VycmVudGx5IGhlbGQ6IGVhY2ggcGx1Z2luIG5hbWUgYXMgYSBjb2RlIGJsb2NrIGZvbGxvd2VkIGJ5XG4gICAgLy8gdGhlIG9wZXJhdGlvbiBpdCBpcyBydW5uaW5nLCBvbmUgcGVyIGxpbmUuXG4gICAgZm9yIChjb25zdCBkZXNjcmlwdG9yIG9mIHRoaXMubG9ja0Rlc2NyaXB0b3JzKGFwcCwgcGF0aCkpIHtcbiAgICAgIGZyYWdtZW50LmNyZWF0ZUVsKCdicicpO1xuICAgICAgYXBwZW5kQ29kZUJsb2NrKGZyYWdtZW50LCBkZXNjcmlwdG9yLnBsdWdpbk5hbWUpO1xuICAgICAgZnJhZ21lbnQuYXBwZW5kVGV4dChgOiAke2Rlc2NyaXB0b3Iub3BlcmF0aW9uTmFtZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGZyYWdtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVJbmRpY2F0b3JUb29sdGlwcyhpbmRpY2F0b3JzOiBMb2NrSW5kaWNhdG9ycywgdG9vbHRpcDogc3RyaW5nKTogdm9pZCB7XG4gICAgc2V0VG9vbHRpcChpbmRpY2F0b3JzLmFjdGlvbkljb25FbCwgdG9vbHRpcCk7XG4gICAgaWYgKGluZGljYXRvcnMudGFiSWNvbkVsKSB7XG4gICAgICBzZXRUb29sdGlwKGluZGljYXRvcnMudGFiSWNvbkVsLCB0b29sdGlwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVN0YXR1c0JhcihhcHA6IEFwcCk6IHZvaWQge1xuICAgIGNvbnN0IGFjdGl2ZVZpZXcgPSBhcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KTtcbiAgICBjb25zdCBhY3RpdmVQYXRoID0gYWN0aXZlVmlldz8uZmlsZT8ucGF0aDtcbiAgICBjb25zdCBhY3RpdmVPd25lclBhdGggPSBhY3RpdmVQYXRoID09PSB1bmRlZmluZWQgPyBudWxsIDogdGhpcy5yZXNvbHZlTG9ja093bmVyUGF0aChhcHAsIGFjdGl2ZVBhdGgpO1xuXG4gICAgaWYgKGFjdGl2ZU93bmVyUGF0aCA9PT0gbnVsbCB8fCAhYWN0aXZlVmlldykge1xuICAgICAgdGhpcy5zdGF0dXNCYXJJdGVtRWw/LnJlbW92ZSgpO1xuICAgICAgdGhpcy5zdGF0dXNCYXJJdGVtRWwgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zdGF0dXNCYXJJdGVtRWwpIHtcbiAgICAgIGNvbnN0IHN0YXR1c0JhckVsID0gYWN0aXZlVmlldy5jb250YWluZXJFbC5vd25lckRvY3VtZW50LmJvZHkucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oU1RBVFVTX0JBUl9DU1NfU0VMRUNUT1IpO1xuICAgICAgaWYgKCFzdGF0dXNCYXJFbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnN0YXR1c0Jhckl0ZW1FbCA9IHN0YXR1c0JhckVsLmNyZWF0ZURpdih7IGNsczogW1NUQVRVU19CQVJfSVRFTV9DU1NfQ0xBU1MsIExPQ0tfSU5ESUNBVE9SX0NTU19DTEFTU10gfSk7XG4gICAgICBzZXRJY29uKHRoaXMuc3RhdHVzQmFySXRlbUVsLCBMT0NLX0lDT05fSUQpO1xuICAgICAgLy8gVGhlIHNpbmdsZSBzdGF0dXMtYmFyIGl0ZW0gaXMgcmV1c2VkIGFjcm9zcyBhY3RpdmUtbm90ZSBzd2l0Y2hlcy5cbiAgICAgIC8vIEl0IG11c3QgcmVzb2x2ZSB0aGUgY3VycmVudGx5IGFjdGl2ZSBub3RlJ3Mgb3duZXIgbG9jayBhdCBjbGljayB0aW1lIHJhdGhlciB0aGFuIGNhcHR1cmluZyBvbmUgcGF0aC5cbiAgICAgIHRoaXMucmVnaXN0ZXJVbmxvY2tNZW51KGFwcCwgdGhpcy5zdGF0dXNCYXJJdGVtRWwsICgpID0+IHtcbiAgICAgICAgY29uc3QgcGF0aCA9IGFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpPy5maWxlPy5wYXRoO1xuICAgICAgICByZXR1cm4gcGF0aCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdGhpcy5yZXNvbHZlTG9ja093bmVyUGF0aChhcHAsIHBhdGgpID8/IHVuZGVmaW5lZDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldFRvb2x0aXAodGhpcy5zdGF0dXNCYXJJdGVtRWwsIHRoaXMubG9ja1Rvb2x0aXAoYXBwLCBhY3RpdmVPd25lclBhdGgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaXJlcyBhbiBvcHQtaW4gYGFib3J0YCBsaXN0ZW5lciBmb3IgYSBsb2NrIGVudHJ5OiB3aGVuIHRoZSBlbnRyeSdzIGNvbnRyb2xsZXIgYWJvcnRzLCByZWxlYXNlc1xuICAgKiB0aGUgZW50cnkgKGlmIHtAbGluayBMb2NrRW50cnkuc2hvdWxkUmVsZWFzZU9uQWJvcnR9KSBhbmQvb3IgaW52b2tlc1xuICAgKiB7QGxpbmsgTG9ja0VudHJ5Lm9uVW5sb2NrUmVxdWVzdGVkfS4gQSBuby1vcCB3aGVuIHRoZSBlbnRyeSBoYXMgbm8gY29udHJvbGxlciBvciBuZWl0aGVyIG9wdC1pbiBpc1xuICAgKiBzZXQsIHNvIHRyYW5zYWN0aW9uYWwgbG9ja3Mga2VlcCByZWxlYXNpbmcgdmlhIHRoZWlyIG93biBjbGVhbnVwLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIGVudHJ5IC0gVGhlIGxvY2sgZW50cnkgd2hvc2UgY29udHJvbGxlciB0byBvYnNlcnZlLlxuICAgKi9cbiAgcHJpdmF0ZSB3aXJlUmVsZWFzZU9uQWJvcnQoYXBwOiBBcHAsIGVudHJ5OiBMb2NrRW50cnkpOiB2b2lkIHtcbiAgICBjb25zdCB7IG9uVW5sb2NrUmVxdWVzdGVkLCBzaG91bGRSZWxlYXNlT25BYm9ydCB9ID0gZW50cnk7XG4gICAgaWYgKCFlbnRyeS5hYm9ydENvbnRyb2xsZXIgfHwgKCFzaG91bGRSZWxlYXNlT25BYm9ydCAmJiAhb25VbmxvY2tSZXF1ZXN0ZWQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVudHJ5LmFib3J0Q29udHJvbGxlci5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB7XG4gICAgICBpZiAoc2hvdWxkUmVsZWFzZU9uQWJvcnQpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVFbnRyeShhcHAsIGVudHJ5KTtcbiAgICAgIH1cbiAgICAgIG9uVW5sb2NrUmVxdWVzdGVkPy4oKTtcbiAgICB9LCB7IG9uY2U6IHRydWUgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBNb25rZXktcGF0Y2hlcyB0aGUgdmF1bHQtbXV0YXRpb24gY2hva2UgcG9pbnRzIG9uIGBWYXVsdGAvYEZpbGVNYW5hZ2VyYCBzbyB0aGF0IGFueSBlZGl0LCBkZWxldGUsXG4gKiByZW5hbWUsIG1vdmUsIG9yIChyZSljcmVhdGUgb2YgYSBtdXRhdGlvbi1ibG9ja2VkIHBhdGggdGhyb3dzIGEge0BsaW5rIFJlc291cmNlTG9ja2VkRXJyb3J9LlxuICogSW5zdGFsbGVkIGxhemlseSBieSB7QGxpbmsgUmVzb3VyY2VMb2NrTWFuYWdlcn0gb24gdGhlIGZpcnN0IGBzaG91bGRCbG9ja011dGF0aW9uc2AgbG9jayBhbmQgcmVtb3ZlZFxuICogd2hlbiB0aGUgbGFzdCBvbmUgaXMgcmVsZWFzZWQ7IGJlaW5nIGEge0BsaW5rIE1vbmtleUFyb3VuZENvbXBvbmVudH0sIGV2ZXJ5IHBhdGNoIGlzIHRvcm4gZG93biBvblxuICogYHVubG9hZGAuIFJlbmFtZS9jb3B5IGNoZWNrIGJvdGggc291cmNlIGFuZCBkZXN0aW5hdGlvbjsgdGhlIG90aGVyIG1ldGhvZHMgY2hlY2sgdGhlaXIgc2luZ2xlIHBhdGguXG4gKi9cbmNsYXNzIFJlc291cmNlTG9ja011dGF0aW9uQmxvY2tlckNvbXBvbmVudCBleHRlbmRzIE1vbmtleUFyb3VuZENvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvdWxkQmxvY2tNdXRhdGlvbjogKHBhdGg6IHN0cmluZykgPT4gYm9vbGVhbjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBSZXNvdXJjZUxvY2tNdXRhdGlvbkJsb2NrZXJDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5zaG91bGRCbG9ja011dGF0aW9uID0gcGFyYW1zLnNob3VsZEJsb2NrTXV0YXRpb247XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHN1cGVyLm9ubG9hZCgpO1xuXG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAnYXBwZW5kJz4oe1xuICAgICAgJG9iamVjdDogVmF1bHQucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ2FwcGVuZCcsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW2ZpbGVdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtmaWxlLnBhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAnY29weSc+KHtcbiAgICAgICRvYmplY3Q6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdjb3B5JyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbLCBuZXdQYXRoXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbbmV3UGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdjcmVhdGUnPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAnY3JlYXRlJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbcGF0aF0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW3BhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAnY3JlYXRlQmluYXJ5Jz4oe1xuICAgICAgJG9iamVjdDogVmF1bHQucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ2NyZWF0ZUJpbmFyeScsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW3BhdGhdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtwYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ2NyZWF0ZUZvbGRlcic+KHtcbiAgICAgICRvYmplY3Q6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdjcmVhdGVGb2xkZXInLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtwYXRoXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbcGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdkZWxldGUnPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAnZGVsZXRlJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZV0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW2ZpbGUucGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdtb2RpZnknPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAnbW9kaWZ5JyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZV0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW2ZpbGUucGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdtb2RpZnlCaW5hcnknPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAnbW9kaWZ5QmluYXJ5JyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZV0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW2ZpbGUucGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdwcm9jZXNzJz4oe1xuICAgICAgJG9iamVjdDogVmF1bHQucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ3Byb2Nlc3MnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtmaWxlXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ3JlbmFtZSc+KHtcbiAgICAgICRvYmplY3Q6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdyZW5hbWUnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtmaWxlLCBuZXdQYXRoXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoLCBuZXdQYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ3RyYXNoJz4oe1xuICAgICAgJG9iamVjdDogVmF1bHQucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ3RyYXNoJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZV0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW2ZpbGUucGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8RmlsZU1hbmFnZXIsICdyZW5hbWVGaWxlJz4oe1xuICAgICAgJG9iamVjdDogRmlsZU1hbmFnZXIucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ3JlbmFtZUZpbGUnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtmaWxlLCBuZXdQYXRoXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoLCBuZXdQYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxGaWxlTWFuYWdlciwgJ3RyYXNoRmlsZSc+KHtcbiAgICAgICRvYmplY3Q6IEZpbGVNYW5hZ2VyLnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICd0cmFzaEZpbGUnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtmaWxlXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3NlcnROb3RCbG9ja2VkKHBhdGhzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiBwYXRocykge1xuICAgICAgaWYgKHRoaXMuc2hvdWxkQmxvY2tNdXRhdGlvbihwYXRoKSkge1xuICAgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VMb2NrZWRFcnJvcihwYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBIHBlci1wbHVnaW4gaGFuZGxlIGZvciBwYXRoLXNjb3BlZCByZXNvdXJjZSBsb2NraW5nIChlZGl0b3IgcmVhZC1vbmx5LCBvcHRpb25hbCB2YXVsdC1tdXRhdGlvblxuICogYmxvY2tpbmcsIGFuZCBleHRlcm5hbC1jaGFuZ2UgZGV0ZWN0aW9uIFx1MjAxNCBzZWUgdGhlIGZpbGUgb3ZlcnZpZXcpLiBBZGQgaXQgYXMgYSBjaGlsZCBvZiB5b3VyIHBsdWdpblxuICogKGB0aGlzLmFkZENoaWxkKG5ldyBSZXNvdXJjZUxvY2tDb21wb25lbnQodGhpcy5hcHApKWApIHNvIHRoYXQgYW55IGxvY2tzIGl0IHN0aWxsIGhvbGRzIGFyZSByZWxlYXNlZFxuICogYXV0b21hdGljYWxseSB3aGVuIHRoZSBwbHVnaW4gdW5sb2FkcyBcdTIwMTQgYSByZXNvdXJjZSBjYW4gbmV2ZXIgYmUgbGVmdCBzdHVjayBsb2NrZWQgYmVjYXVzZSB0aGUgcGx1Z2luXG4gKiB0aGF0IGxvY2tlZCBpdCB3YXMgZGlzYWJsZWQgb3IgcmVsb2FkZWQgbWlkLW9wZXJhdGlvbi5cbiAqXG4gKiBMb2NrcyBhcmUgcmVmZXJlbmNlLWNvdW50ZWQgYW5kIGF0dHJpYnV0ZWQgdG8gdGhpcyBwbHVnaW4sIHNvIHRoZSBsb2NrIGluZGljYXRvcnMnIHRvb2x0aXAgbmFtZXMgaXRcbiAqIGFtb25nIHRoZSBwbHVnaW5zIGN1cnJlbnRseSBob2xkaW5nIGEgbG9jay5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlc291cmNlTG9ja0NvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgb3duaW5nIHBsdWdpbiAoZS5nLiBpdHMgYG1hbmlmZXN0LmlkYCkuIExvY2tzIGFyZSBhdHRyaWJ1dGVkIHRvIGl0IGZvclxuICAgKiByZWZlcmVuY2UtY291bnRpbmcgYW5kIHRoZSBpbmRpY2F0b3JzJyBcImxvY2tlZCBieVwiIHRvb2x0aXAuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiByZXNvdXJjZS1sb2NrIGhhbmRsZSBvd25lZCBieSBhIHBsdWdpbi5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwbHVnaW5JZCAtIFRoZSBpZCBvZiB0aGUgb3duaW5nIHBsdWdpbiAoZS5nLiBpdHMgYG1hbmlmZXN0LmlkYCkuIExvY2tzIGFyZSBhdHRyaWJ1dGVkIHRvXG4gICAqIGl0IGZvciByZWZlcmVuY2UtY291bnRpbmcgYW5kIHRoZSBpbmRpY2F0b3JzJyBcImxvY2tlZCBieVwiIHRvb2x0aXAuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoYXBwOiBBcHAsIHBsdWdpbklkOiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gYXBwO1xuICAgIHRoaXMucGx1Z2luSWQgPSBwbHVnaW5JZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVucyBhbiAqKmFtYmllbnQgYnlwYXNzIHNjb3BlKio6IHdoaWxlIHRoZSByZXR1cm5lZCB7QGxpbmsgRGlzcG9zYWJsZX0gaXMgbm90IGRpc3Bvc2VkLCB0aGlzXG4gICAqIHBsdWdpbidzIG93biBtdXRhdGlvbnMgb2YgdGhlIGdpdmVuIHBhdGhzIChhbmQsIGZvciBhIGZvbGRlciwgaXRzIHdob2xlIHN1YnRyZWUpIHBhc3MgdGhyb3VnaCB0aGVcbiAgICogbXV0YXRpb24gYmxvY2tlciBpbnN0ZWFkIG9mIHRocm93aW5nIHtAbGluayBSZXNvdXJjZUxvY2tlZEVycm9yfS4gQW55IG11dGF0aW9uIG9mIGEgYmxvY2tlZCBwYXRoXG4gICAqIE5PVCBjb3ZlcmVkIGJ5IGFuIGFjdGl2ZSBieXBhc3Mgc2NvcGUgaXMgc3RpbGwgcmVqZWN0ZWQuIFVzZSBpdCB3aXRoIGEgYHVzaW5nYCBkZWNsYXJhdGlvbiBhcm91bmRcbiAgICogdGhlIG9wZXJhdGlvbiB0aGF0IGxlZ2l0aW1hdGVseSBtdXRhdGVzIHJlc291cmNlcyBpdCBoYXMgbG9ja2VkIHdpdGhcbiAgICoge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zLnNob3VsZEJsb2NrTXV0YXRpb25zfTpcbiAgICpcbiAgICogYGBgdHNcbiAgICogdXNpbmcgX2J5cGFzcyA9IGNvbXBvbmVudC5ieXBhc3NCbG9ja2VkTXV0YXRpb25zKFtzb3VyY2VGaWxlLCB0YXJnZXRGaWxlXSk7XG4gICAqIC8vIC4uLiB0aGUgb3BlcmF0aW9uJ3Mgb3duIHZhdWx0IG11dGF0aW9ucyBvZiB0aG9zZSBwYXRocyBhcmUgYWxsb3dlZCAuLi5cbiAgICogLy8gc2NvcGUgZW5kOiB0aGUgcGF0aHMgYXJlIGVuZm9yY2VkIGFnYWluXG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gcGF0aHNPckZpbGVzIC0gVGhlIHBhdGhzIChvciBmaWxlcy9mb2xkZXJzKSB3aG9zZSBtdXRhdGlvbiBieSB0aGlzIG9wZXJhdGlvbiBpcyBzYW5jdGlvbmVkLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBEaXNwb3NhYmxlfSB0aGF0IGVuZHMgdGhlIGJ5cGFzcyBzY29wZSB3aGVuIGRpc3Bvc2VkLlxuICAgKi9cbiAgcHVibGljIGJ5cGFzc0Jsb2NrZWRNdXRhdGlvbnMocGF0aHNPckZpbGVzOiByZWFkb25seSBQYXRoT3JGaWxlW10pOiBEaXNwb3NhYmxlIHtcbiAgICByZXR1cm4gZ2V0TWFuYWdlcigpLmJ5cGFzcyh0aGlzLmFwcCwgcGF0aHNPckZpbGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgcGF0aCBpcyBsb2NrZWQgZGlyZWN0bHkgb3IgbGllcyB1bmRlciBhIGBzdWJ0cmVlYC1sb2NrZWQgYW5jZXN0b3IgZm9sZGVyLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgcGF0aCBpcyBpdHNlbGYgbG9ja2VkIG9yIGlzIGNvdmVyZWQgYnkgYSBgc3VidHJlZWAgbG9jayBvbiBhbiBhbmNlc3Rvci5cbiAgICovXG4gIHB1YmxpYyBpc0xvY2tlZEJ5QW5jZXN0b3JGb3JQYXRoKHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZ2V0TWFuYWdlcigpLmlzTG9ja2VkQnlBbmNlc3Rvcih0aGlzLmFwcCwgcGF0aE9yRmlsZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggaXMgY3VycmVudGx5IGxvY2tlZCBieSBhbnkgcGx1Z2luLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbm90ZSBoYXMgYXQgbGVhc3Qgb25lIGFjdGl2ZSBsb2NrLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICovXG4gIHB1YmxpYyBpc0xvY2tlZEZvclBhdGgocGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBnZXRNYW5hZ2VyKCkuaXNMb2NrZWQodGhpcy5hcHAsIHBhdGhPckZpbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGEgdmF1bHQgbXV0YXRpb24gb2YgdGhlIHBhdGggaXMgY3VycmVudGx5IGJsb2NrZWQgYnkgYSBgc2hvdWxkQmxvY2tNdXRhdGlvbnNgIGxvY2tcbiAgICogb24gdGhlIHBhdGggaXRzZWxmIG9yIG9uIGEgYHN1YnRyZWVgLWxvY2tlZCBhbmNlc3RvciBmb2xkZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byBjaGVjay5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIGVkaXRpbmcvZGVsZXRpbmcvcmVuYW1pbmcvbW92aW5nL2NyZWF0aW5nIHRoZSBwYXRoIHdvdWxkIHRocm93IGFcbiAgICoge0BsaW5rIFJlc291cmNlTG9ja2VkRXJyb3J9LlxuICAgKi9cbiAgcHVibGljIGlzTXV0YXRpb25CbG9ja2VkQnlBbmNlc3RvckZvclBhdGgocGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBnZXRNYW5hZ2VyKCkuaXNNdXRhdGlvbkJsb2NrZWRCeUFuY2VzdG9yKHRoaXMuYXBwLCBwYXRoT3JGaWxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2NrcyB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCBvbiBiZWhhbGYgb2YgdGhpcyBwbHVnaW4sIG1ha2luZyBpdCByZWFkLW9ubHkgaW4gZXZlcnkgY3VycmVudFxuICAgKiBhbmQgZnV0dXJlIHtAbGluayBNYXJrZG93blZpZXd9IHVudGlsIHRoZSBsb2NrIGlzIHJlbGVhc2VkLiBSZWZlcmVuY2UtY291bnRlZDogYmFsYW5jZSBlYWNoIGNhbGxcbiAgICogd2l0aCBhIGRpc3Bvc2Ugb2YgdGhlIHJldHVybmVkIHtAbGluayBEaXNwb3NhYmxlfSAoaWRlYWxseSB2aWEgYHVzaW5nYCkgb3Ige0BsaW5rIHVubG9ja0ZvclBhdGh9LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gTG9ja2luZyBwYXJhbWV0ZXJzLiBJdHMge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zLnBhdGhPckZpbGV9XG4gICAqIGFuZCB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMub3BlcmF0aW9uTmFtZX0gYXJlIHJlcXVpcmVkICh0aGUgbGF0dGVyIGlzIHNob3duXG4gICAqIGluIHRoZSB1bmxvY2sgY29uZmlybWF0aW9uKS4gUGFzcyBhbiB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMuYWJvcnRDb250cm9sbGVyfVxuICAgKiB0byBtYWtlIHRoZSBsb2NrIGNhbmNlbGFibGUgdmlhIGEgbG9jayBpbmRpY2F0b3IncyBcInVubG9ja1wiIG1lbnUsIHRoZSBcIlVubG9jayBhY3RpdmUgbm90ZVwiIGNvbW1hbmQsXG4gICAqIG9yIHtAbGluayByZXF1ZXN0UmVzb3VyY2VVbmxvY2tGb3JQYXRofS5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgRGlzcG9zYWJsZX0gdGhhdCByZWxlYXNlcyB0aGlzIGxvY2sgd2hlbiBkaXNwb3NlZC4gRGlzcG9zaW5nIG1vcmUgdGhhbiBvbmNlIGlzIGEgbm8tb3AuXG4gICAqL1xuICBwdWJsaWMgbG9ja0ZvclBhdGgocGFyYW1zOiBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcyk6IERpc3Bvc2FibGUge1xuICAgIHJldHVybiBnZXRNYW5hZ2VyKCkubG9jayh7XG4gICAgICBhYm9ydENvbnRyb2xsZXI6IHBhcmFtcy5hYm9ydENvbnRyb2xsZXIsXG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgYmxvY2tzTXV0YXRpb25zOiBwYXJhbXMuc2hvdWxkQmxvY2tNdXRhdGlvbnMsXG4gICAgICBtb2RlOiBwYXJhbXMubW9kZSxcbiAgICAgIG9uVW5sb2NrUmVxdWVzdGVkOiBwYXJhbXMub25VbmxvY2tSZXF1ZXN0ZWQsXG4gICAgICBvcGVyYXRpb25OYW1lOiBwYXJhbXMub3BlcmF0aW9uTmFtZSxcbiAgICAgIHBhdGhPckZpbGU6IHBhcmFtcy5wYXRoT3JGaWxlLFxuICAgICAgcGx1Z2luSWQ6IHRoaXMucGx1Z2luSWQsXG4gICAgICBzaG91bGRSZWxlYXNlT25BYm9ydDogcGFyYW1zLnNob3VsZFJlbGVhc2VPbkFib3J0XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVsZWFzZXMgZXZlcnkgbG9jayBzdGlsbCBoZWxkIGJ5IHRoaXMgcGx1Z2luIHdoZW4gdGhlIGNvbXBvbmVudCAoYW5kIHRodXMgdGhlIHBsdWdpbikgdW5sb2FkcyxcbiAgICogc28gbm8gbm90ZSBpcyBsZWZ0IHN0dWNrIHJlYWQtb25seSBieSBhbiBvcGVyYXRpb24gdGhhdCBuZXZlciBjb21wbGV0ZWQuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb251bmxvYWQoKTogdm9pZCB7XG4gICAgZ2V0TWFuYWdlcigpLnVubG9ja0FsbEZvclBsdWdpbih0aGlzLmFwcCwgdGhpcy5wbHVnaW5JZCk7XG4gICAgc3VwZXIub251bmxvYWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGdWxseSB1bmxvY2tzIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoOiByZXNvbHZlcyB0aGUgbG9jayBjb3ZlcmluZyBpdCAodGhlIHBhdGggaXRzZWxmIHdoZW5cbiAgICogZGlyZWN0bHkgbG9ja2VkLCBvdGhlcndpc2UgYSBgc3VidHJlZWAtbG9ja2VkIGFuY2VzdG9yIGZvbGRlciksIGNhbmNlbHMgdGhlIG9wZXJhdGlvbihzKSB0aGF0IHRvb2tcbiAgICogdGhlIGxvY2sgYnkgYWJvcnRpbmcgdGhlaXIge0BsaW5rIEFib3J0Q29udHJvbGxlcn1zLCBhbmQgcmVsZWFzZXMgdGhlIGxvY2sgc28gdGhlIG5vdGUgYmVjb21lc1xuICAgKiBlZGl0YWJsZSBcdTIwMTQgcmVnYXJkbGVzcyBvZiB3aGljaCBwbHVnaW4gaG9sZHMgdGhlIGxvY2suIFBvd2VycyB0aGUgXCJVbmxvY2sgYWN0aXZlIG5vdGVcIiBjb21tYW5kLiBBXG4gICAqIG5vLW9wIHdoZW4gbm90aGluZyBjb3ZlcnMgdGhlIHBhdGguXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byB1bmxvY2suXG4gICAqL1xuICBwdWJsaWMgcmVxdWVzdFVubG9ja0ZvclBhdGgocGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IHZvaWQge1xuICAgIGdldE1hbmFnZXIoKS5mb3JjZVVubG9jayh0aGlzLmFwcCwgcGF0aE9yRmlsZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVsZWFzZXMgb25lIGxvY2sgcHJldmlvdXNseSBhY3F1aXJlZCBmb3IgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggdmlhIHtAbGluayBsb2NrRm9yUGF0aH0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byB1bmxvY2suXG4gICAqL1xuICBwdWJsaWMgdW5sb2NrRm9yUGF0aChwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogdm9pZCB7XG4gICAgZ2V0TWFuYWdlcigpLnVubG9jayh0aGlzLmFwcCwgcGF0aE9yRmlsZSwgdGhpcy5wbHVnaW5JZCk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gYnkgdGhlIHZhdWx0LW11dGF0aW9uIGJsb2NrZXIgd2hlbiBhIHBsdWdpbiB0cmllcyB0byBlZGl0LCBkZWxldGUsIHJlbmFtZSwgbW92ZSwgb3IgY3JlYXRlIGFcbiAqIHJlc291cmNlIHdob3NlIHBhdGggaXMgY292ZXJlZCBieSBhIGxvY2sgdGFrZW4gd2l0aFxuICoge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zLnNob3VsZEJsb2NrTXV0YXRpb25zfS5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlc291cmNlTG9ja2VkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBUaGUgdmF1bHQgcGF0aCB3aG9zZSBtdXRhdGlvbiB3YXMgYmxvY2tlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB7QGxpbmsgUmVzb3VyY2VMb2NrZWRFcnJvcn0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gVGhlIHZhdWx0IHBhdGggd2hvc2UgbXV0YXRpb24gd2FzIGJsb2NrZWQuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGF0aDogc3RyaW5nKSB7XG4gICAgc3VwZXIoYFRoZSByZXNvdXJjZSBcIiR7cGF0aH1cIiBpcyBsb2NrZWQgYW5kIGNhbm5vdCBiZSBtdXRhdGVkLmApO1xuICAgIHRoaXMubmFtZSA9ICdSZXNvdXJjZUxvY2tlZEVycm9yJztcbiAgICB0aGlzLnBhdGggPSBwYXRoO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggaXMgY3VycmVudGx5IGxvY2tlZC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbm90ZSBoYXMgYXQgbGVhc3Qgb25lIGFjdGl2ZSBsb2NrLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVzb3VyY2VMb2NrZWRGb3JQYXRoKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogYm9vbGVhbiB7XG4gIHJldHVybiBnZXRNYW5hZ2VyKCkuaXNMb2NrZWQoYXBwLCBwYXRoT3JGaWxlKTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCBpcyBjdXJyZW50bHkgbG9ja2VkIGRpcmVjdGx5IE9SIGlzIGNvdmVyZWQgYnkgYVxuICogYHN1YnRyZWVgLWxvY2tlZCBhbmNlc3RvciBmb2xkZXIuXG4gKlxuICogVW5saWtlIHtAbGluayBpc1Jlc291cmNlTG9ja2VkRm9yUGF0aH0sIHdoaWNoIG9ubHkgcmVwb3J0cyBhbiBleGFjdC1wYXRoIGxvY2ssIHRoaXMgYWxzbyByZXBvcnRzIGFcbiAqIHBhdGggdGhhdCBsaWVzIHVuZGVyIGEgZm9sZGVyIGxvY2tlZCBpbiBgc3VidHJlZWAgbW9kZS4gVXNlIGl0IHRvIGRldGVjdCB0aGF0IGEgcmVuYW1lL21vdmUgaXNcbiAqIGhhcHBlbmluZyBpbnNpZGUgYSBmb3JlaWduIHBsdWdpbidzIGluLWZsaWdodCBsb2NrZWQgdHJhbnNhY3Rpb24gKHdoaWNoIGxvY2tzIHRoZSBhZmZlY3RlZCBmb2xkZXJcbiAqIHN1YnRyZWUpLCBzbyB0aGF0IGEgYnlzdGFuZGVyIChlLmcuIHRoZSByZW5hbWUvZGVsZXRlIGhhbmRsZXIpIGNhbiBzdGF5IG91dCBvZiB0aGUgd2F5IGFuZCBsZXQgdGhlXG4gKiB0cmFuc2FjdGlvbidzIG93bmVyIGtlZXAgaXRzIG93biBsaW5rcyBjb25zaXN0ZW50LlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBwYXRoIGlzIGl0c2VsZiBsb2NrZWQgb3IgbGllcyB1bmRlciBhIGBzdWJ0cmVlYC1sb2NrZWQgYW5jZXN0b3IgZm9sZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZXNvdXJjZUxvY2tlZEZvclBhdGhCeUFuY2VzdG9yKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogYm9vbGVhbiB7XG4gIHJldHVybiBnZXRNYW5hZ2VyKCkuaXNMb2NrZWRCeUFuY2VzdG9yKGFwcCwgcGF0aE9yRmlsZSk7XG59XG5cbi8qKlxuICogTG9ja3MgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGgsIG1ha2luZyBpdCByZWFkLW9ubHkgaW4gZXZlcnkgY3VycmVudCBhbmQgZnV0dXJlXG4gKiB7QGxpbmsgTWFya2Rvd25WaWV3fSB1bnRpbCB0aGUgbG9jayBpcyByZWxlYXNlZCwgYW5kIHNob3dpbmcgYSBsb2NrIGluZGljYXRvciBpbiB0aGUgdGFiIGhlYWRlcixcbiAqIHZpZXcgYWN0aW9uIGJhciwgYW5kICh3aGlsZSBhY3RpdmUpIHRoZSBzdGF0dXMgYmFyLiBUaGUgaW5kaWNhdG9ycycgdG9vbHRpcCBsaXN0cyB0aGUgcGx1Z2luc1xuICogdGhhdCBjdXJyZW50bHkgaG9sZCBhIGxvY2sgb24gdGhlIG5vdGUuXG4gKlxuICogVGhlIGxvY2sgaXMgcmVmZXJlbmNlLWNvdW50ZWQgcGVyIGNhbGxpbmcgcGx1Z2luOiBlYWNoIGNhbGwgbXVzdCBiZSBiYWxhbmNlZCBieSBleGFjdGx5IG9uZVxuICogcmVsZWFzZSAoZWl0aGVyIGRpc3Bvc2luZyB0aGUgcmV0dXJuZWQge0BsaW5rIERpc3Bvc2FibGV9IFx1MjAxNCBpZGVhbGx5IHZpYSBhIGB1c2luZ2AgZGVjbGFyYXRpb24gXHUyMDE0IG9yXG4gKiBhIG1hdGNoaW5nIHtAbGluayB1bmxvY2tSZXNvdXJjZUZvclBhdGh9IGNhbGwpLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgbG9ja2luZyB0aGUgbm90ZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIERpc3Bvc2FibGV9IHRoYXQgcmVsZWFzZXMgdGhpcyBsb2NrIHdoZW4gZGlzcG9zZWQuIERpc3Bvc2luZyBtb3JlIHRoYW4gb25jZSBpcyBhIG5vLW9wLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9ja1Jlc291cmNlRm9yUGF0aChwYXJhbXM6IExvY2tSZXNvdXJjZUZvclBhdGhQYXJhbXMpOiBEaXNwb3NhYmxlIHtcbiAgcmV0dXJuIGdldE1hbmFnZXIoKS5sb2NrKHtcbiAgICBhcHA6IHBhcmFtcy5hcHAsXG4gICAgb3BlcmF0aW9uTmFtZTogcGFyYW1zLm9wZXJhdGlvbk5hbWUsXG4gICAgcGF0aE9yRmlsZTogcGFyYW1zLnBhdGhPckZpbGUsXG4gICAgcGx1Z2luSWQ6IHBhcmFtcy5wbHVnaW5JZFxuICB9KTtcbn1cblxuLyoqXG4gKiBSZXF1ZXN0cyBhbiB1bmxvY2sgb2YgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggYnkgYWJvcnRpbmcgZXZlcnkge0BsaW5rIEFib3J0Q29udHJvbGxlcn0gdGhhdCB3YXNcbiAqIGFzc29jaWF0ZWQgd2l0aCBhIGxvY2sgb24gaXQgKHZpYSB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50LmxvY2tGb3JQYXRofSdzXG4gKiB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMuYWJvcnRDb250cm9sbGVyfSkuIFRoZSBvcGVyYXRpb25zIGhvbGRpbmcgdGhlIGxvY2tcbiAqIG9ic2VydmUgdGhlIGFib3J0IGFuZCByZWxlYXNlIHRoZWlyIG93biBsb2Nrcy4gQSBuby1vcCB3aGVuIG5vIGFib3J0YWJsZSBsb2NrIGlzIHJlZ2lzdGVyZWQgZm9yIHRoZVxuICogcGF0aC5cbiAqXG4gKiBUaGlzIGxldHMgYSBjb25zdW1pbmcgcGx1Z2luIHdpcmUgaXRzIG93biBcInVubG9jayBhY3RpdmUgbm90ZVwiIGNvbW1hbmQgd2l0aG91dCByZWFjaGluZyBpbnRvIHRoZVxuICogbG9jayBtYW5hZ2VyIGRpcmVjdGx5LlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIHJlcXVlc3QgYW4gdW5sb2NrIGZvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVlc3RSZXNvdXJjZVVubG9ja0ZvclBhdGgoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiB2b2lkIHtcbiAgZ2V0TWFuYWdlcigpLnJlcXVlc3RVbmxvY2soYXBwLCBwYXRoT3JGaWxlKTtcbn1cblxuLyoqXG4gKiBSZWxlYXNlcyBvbmUgbG9jayBwcmV2aW91c2x5IGFjcXVpcmVkIGZvciB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCB2aWEge0BsaW5rIGxvY2tSZXNvdXJjZUZvclBhdGh9LlxuICpcbiAqIFdoZW4gdGhlIGxhc3QgbG9jayBpcyByZWxlYXNlZCB0aGUgbm90ZSBiZWNvbWVzIGZ1bGx5IGVkaXRhYmxlIGFnYWluIGFuZCBpdHMgbG9jayBpbmRpY2F0b3JzIGFyZVxuICogcmVtb3ZlZC4gQ2FsbGluZyB0aGlzIHdoZW4gdGhlIG5vdGUgaXMgbm90IGxvY2tlZCBpcyBhIG5vLW9wLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIHVubG9jay5cbiAqIEBwYXJhbSBwbHVnaW5JZCAtIFRoZSBpZCBvZiB0aGUgcGx1Z2luIHRoYXQgaG9sZHMgdGhlIGxvY2sgKGUuZy4gaXRzIGBtYW5pZmVzdC5pZGApOyBvbmUgb2YgaXRzXG4gKiBsb2NrcyBvbiB0aGUgbm90ZSBpcyByZWxlYXNlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVubG9ja1Jlc291cmNlRm9yUGF0aChhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSwgcGx1Z2luSWQ6IHN0cmluZyk6IHZvaWQge1xuICBnZXRNYW5hZ2VyKCkudW5sb2NrKGFwcCwgcGF0aE9yRmlsZSwgcGx1Z2luSWQpO1xufVxuXG5mdW5jdGlvbiBnZXRNYW5hZ2VyKCk6IFJlc291cmNlTG9ja01hbmFnZXIge1xuICByZXR1cm4gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlPFJlc291cmNlTG9ja01hbmFnZXI+KFJFU09VUkNFX0xPQ0tfU1RBVEVfS0VZLCBuZXcgUmVzb3VyY2VMb2NrTWFuYWdlcigpKS52YWx1ZTtcbn1cblxuLyoqXG4gKiBNYXBzIGEgc3RvcmVkIHBhdGggdGhyb3VnaCBhIHJlbmFtZTogdGhlIHJlbmFtZWQgcGF0aCBpdHNlbGYgYmVjb21lcyB0aGUgbmV3IHBhdGgsIGFuZCBhIGRlc2NlbmRhbnRcbiAqIG9mIGl0IGtlZXBzIGl0cyBzdWZmaXggdW5kZXIgdGhlIG5ldyBwYXRoLiBTcGVsbGVkIG91dCByYXRoZXIgdGhhbiByZXVzaW5nIHtAbGluayBpc0NoaWxkT3JTZWxmfVxuICogYmVjYXVzZSB0aGUgcmViYXNlZCBzdWZmaXggaGFzIHRvIGJlIGNvbXB1dGVkIGZyb20gdGhlIHNhbWUgcHJlZml4IHRoZSB0ZXN0IG1hdGNoZWQsIGFuZCBhIHJlbmFtZVxuICogc291cmNlIGlzIG5ldmVyIHRoZSB2YXVsdCByb290ICh0aGUgb25lIGNhc2UgdGhvc2UgaGVscGVycyB0cmVhdCBzcGVjaWFsbHkpLlxuICpcbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHN0b3JlZCBwYXRoIHRvIG1hcC5cbiAqIEBwYXJhbSBvbGRQYXRoIC0gVGhlIHBhdGggdGhlIHJlc291cmNlIHdhcyByZW5hbWVkIGZyb20uXG4gKiBAcGFyYW0gbmV3UGF0aCAtIFRoZSBwYXRoIHRoZSByZXNvdXJjZSB3YXMgcmVuYW1lZCB0by5cbiAqIEByZXR1cm5zIFRoZSByZWJhc2VkIHBhdGgsIG9yIGBudWxsYCB3aGVuIHRoZSByZW5hbWUgZG9lcyBub3QgYWZmZWN0IGl0LlxuICovXG5mdW5jdGlvbiByZWJhc2VQYXRoKHBhdGg6IHN0cmluZywgb2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiBudWxsIHwgc3RyaW5nIHtcbiAgaWYgKHBhdGggPT09IG9sZFBhdGgpIHtcbiAgICByZXR1cm4gbmV3UGF0aDtcbiAgfVxuICByZXR1cm4gcGF0aC5zdGFydHNXaXRoKGAke29sZFBhdGh9L2ApID8gbmV3UGF0aCArIHBhdGguc2xpY2Uob2xkUGF0aC5sZW5ndGgpIDogbnVsbDtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMENBLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMsMEJBQTBCO0FBQ25DLFNBQVMsY0FBYztBQUN2QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsWUFBWTtBQUNyQixTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLGdCQUFnQjtBQUN6QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFJUCxTQUFTLG1CQUFtQjtBQUM1QixTQUFTLDZCQUE2QjtBQUN0QyxTQUFTLDRCQUE0QjtBQUNyQyxTQUFTLGVBQWU7QUFDeEIsU0FBUyx1QkFBdUI7QUFDaEMsU0FBUyxTQUFTO0FBQ2xCLFNBQVMsZUFBZTtBQUN4QixTQUFTLGdDQUFnQztBQUN6QztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUVQLE1BQU0sMEJBQTBCO0FBQ2hDLE1BQU0sZUFBZTtBQUNyQixNQUFNLDJCQUEyQjtBQUNqQyxNQUFNLGlDQUFpQztBQUN2QyxNQUFNLDRCQUE0QjtBQUNsQyxNQUFNLDBCQUEwQjtBQUNoQyxNQUFNLGlCQUFpQjtBQUN2QixNQUFNLHNCQUFzQjtBQXVLNUIsTUFBTSxvQ0FBb0MsWUFBWTtBQUFBLEVBQ25DO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBRVYsWUFBWSxRQUFzRDtBQUN2RSxVQUFNO0FBQ04sU0FBSyxNQUFNLE9BQU87QUFDbEIsU0FBSyxXQUFXLE9BQU87QUFDdkIsU0FBSyxxQkFBcUIsT0FBTztBQUNqQyxTQUFLLGFBQWEsT0FB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LEtBQUssUUFBUTtBQUN2RCxVQUFNLFNBQVM7QUFBQSxFQUNqQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBV08scUJBQXFCLFlBQThCO0FBQ3hELGVBQVcsRUFBRSxZQUFZLEtBQUssS0FBSyxVQUFVO0FBQUEsRUFDL0M7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPTyxjQUFjLFlBQThCO0FBQ2pELGVBQVcsRUFBRSxPQUFPLEtBQUssS0FBSyxZQUFZLEtBQUssUUFBUTtBQUFBLEVBQ3pEO0FBQ0Y7QUFPTyxNQUFNLDRCQUE0QixNQUFNO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJN0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPVCxZQUFZLE1BQWM7QUFDL0IsVUFBTSxpQkFBaUIsSUFBSSxvQ0FBb0M7QUFDL0QsU0FBSyxPQUFPO0FBQ1osU0FBSyxPQUFPO0FBQUEsRUFDZDtBQUNGO0FBU08sU0FBUyx3QkFBd0IsS0FBVSxZQUFpQztBQUNqRixTQUFPLFdBQVcsRUFBRSxTQUFTLEtBQUssVUFBVTtBQUM5QztBQWdCTyxTQUFTLGtDQUFrQyxLQUFVLFlBQWlDO0FBQzNGLFNBQU8sV0FBVyxFQUFFLG1CQUFtQixLQUFLLFVBQVU7QUFDeEQ7QUFlTyxTQUFTLG9CQUFvQixRQUErQztBQUNqRixTQUFPLFdBQVcsRUFBRSxLQUFLO0FBQUEsSUFDdkIsS0FBSyxPQUFPO0FBQUEsSUFDWixlQUFlLE9BQU87QUFBQSxJQUN0QixZQUFZLE9BQU87QUFBQSxJQUNuQixVQUFVLE9BQU87QUFBQSxFQUNuQixDQUFDO0FBQ0g7QUFlTyxTQUFTLDZCQUE2QixLQUFVLFlBQThCO0FBQ25GLGFBQVcsRUFBRSxjQUFjLEtBQUssVUFBVTtBQUM1QztBQWFPLFNBQVMsc0JBQXNCLEtBQVUsWUFBd0IsVUFBd0I7QUFDOUYsYUFBVyxFQUFFLE9BQU8sS0FBSyxZQUFZLFFBQVE7QUFDL0M7QUFFQSxTQUFTLGFBQWtDO0FBQ3pDLFNBQU8seUJBQThDLHlCQUF5QixJQUFJLG9CQUFvQixDQUFDLEVBQUU7QUFDM0c7QUFhQSxTQUFTLFdBQVcsTUFBYyxTQUFpQixTQUFnQztBQUNqRixNQUFJLFNBQVMsU0FBUztBQUNwQixXQUFPO0FBQUEsRUFDVDtBQUNBLFNBQU8sS0FBSyxXQUFXLEdBQUcsT0FBTyxHQUFHLElBQUksVUFBVSxLQUFLLE1BQU0sUUFBUSxNQUFNLElBQUk7QUFDakY7IiwKICAibmFtZXMiOiBbXQp9Cg==
997
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yZXNvdXJjZS1sb2NrLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBQYXRoLXNjb3BlZCByZXNvdXJjZSBsb2NraW5nIGZvciB2YXVsdCBmaWxlcyBhbmQgZm9sZGVycywgd2l0aCB0aHJlZSBlbmZvcmNlbWVudCBsYXllcnMgb3ZlciBvbmVcbiAqIHNoYXJlZCBsb2NrZWQtcGF0aCBzZXQ6XG4gKlxuICogMS4gKipFZGl0b3IgcmVhZC1vbmx5Kiog4oCUIHdoaWxlIGEgcGF0aCBpcyBsb2NrZWQsIGV2ZXJ5IGN1cnJlbnQgYW5kIGZ1dHVyZSB7QGxpbmsgTWFya2Rvd25WaWV3fSBvZlxuICogICAgdGhhdCBub3RlIChpbiBhbnkgd2luZG93LCBpbmNsdWRpbmcgcG9wb3V0cykgaXMgbWFkZSByZWFkLW9ubHkgYW5kIHNob3dzIGEgbG9jayBpbmRpY2F0b3IgaW4gaXRzXG4gKiAgICB0YWIgaGVhZGVyLCBpdHMgdmlldyBhY3Rpb24gYmFyLCBhbmQgdGhlIHN0YXR1cyBiYXI7IGEgbm90ZSBpbnNpZGUgYSBgc3VidHJlZWAtbG9ja2VkIGZvbGRlciBpc1xuICogICAgY292ZXJlZCB0b28uIExvY2tzIGFyZSByZWZlcmVuY2UtY291bnRlZCBwZXIgbG9ja2luZyBwbHVnaW4gKHRoZSBpbmRpY2F0b3JzJyB0b29sdGlwIGxpc3RzIHdoaWNoXG4gKiAgICBwbHVnaW5zIGhvbGQgYSBsb2NrKSwgc28gbmVzdGVkL2NvbmN1cnJlbnQgb3BlcmF0aW9ucyBhcmUgc2FmZSDigJQgdGhlIHBhdGggaXMgdW5sb2NrZWQgb25seSB3aGVuXG4gKiAgICB0aGUgbGFzdCBsb2NrIGlzIHJlbGVhc2VkLlxuICogMi4gKipWYXVsdC1tdXRhdGlvbiBibG9ja2luZyoqIChvcHQtaW4gdmlhIGBzaG91bGRCbG9ja011dGF0aW9uc2ApIOKAlCBhbnkgZWRpdC9kZWxldGUvcmVuYW1lL21vdmUvXG4gKiAgICBjcmVhdGUgb2YgYSBsb2NrZWQgcGF0aCB0aHJvdWdoIHRoZSBgVmF1bHRgL2BGaWxlTWFuYWdlcmAgQVBJIHRocm93cyB7QGxpbmsgUmVzb3VyY2VMb2NrZWRFcnJvcn0sXG4gKiAgICB1bmxlc3MgdGhlIG93bmluZyBvcGVyYXRpb24gaGFzIG9wZW5lZCBhIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnQuYnlwYXNzQmxvY2tlZE11dGF0aW9uc30gc2NvcGVcbiAqICAgIG92ZXIgdGhhdCBwYXRoLlxuICogMy4gKipFeHRlcm5hbC1jaGFuZ2UgZGV0ZWN0aW9uKiog4oCUIGEgdmF1bHQvbWV0YWRhdGEgZXZlbnQgb24gYSBsb2NrZWQgcGF0aCB0aGF0IG5vIGJ5cGFzcyBzY29wZVxuICogICAgY292ZXJzIGlzIHRyZWF0ZWQgYXMgYW4gaW50cnVkZXIgKFN5bmMgLyByYXcgZmlsZXN5c3RlbSAvIGFub3RoZXIgcGx1Z2luKSBhbmQgYWJvcnRzIHRoZSBvd25pbmdcbiAqICAgIG9wZXJhdGlvbidzIHtAbGluayBBYm9ydENvbnRyb2xsZXJ9LlxuICpcbiAqIEEgbG9jayAqKmZvbGxvd3MgaXRzIHJlc291cmNlIGFjcm9zcyBhIHJlbmFtZSoqOiB3aGVuIGEgbG9ja2VkIHBhdGggKG9yIGFuIGFuY2VzdG9yIGZvbGRlciBvZiBpdCkgaXNcbiAqIHJlbmFtZWQsIHRoZSBsb2NrIHJlZ2lzdHJ5IGFuZCBldmVyeSBhY3RpdmUgYnlwYXNzIHNjb3BlIGFyZSByZS1rZXllZCBvbnRvIHRoZSBuZXcgcGF0aCwgc28gYVxuICogbXVsdGktc3RlcCBvcGVyYXRpb24gdGhhdCByZW5hbWVzIGEgZm9sZGVyIGl0IGxvY2tlZCBrZWVwcyBpdHMgY292ZXJhZ2UgZm9yIHRoZSByZXN0IG9mIHRoZVxuICogdHJhbnNhY3Rpb24uXG4gKlxuICogVGhlIGFjcXVpcmVycyByZXR1cm4gYSB7QGxpbmsgRGlzcG9zYWJsZX0sIHNvIHRoZSBwcmVmZXJyZWQgY2FsbCBzdHlsZSBpcyBhIGB1c2luZ2AgZGVjbGFyYXRpb24gdGhhdFxuICogcmVsZWFzZXMgYXV0b21hdGljYWxseSBhdCBzY29wZSBleGl0IChpbmNsdWRpbmcgb24gdGhyb3cpOlxuICpcbiAqIGBgYHRzXG4gKiB1c2luZyBfbG9jayA9IGxvY2tSZXNvdXJjZUZvclBhdGgoeyBhcHAsIHBhdGhPckZpbGU6IHBhdGgsIHBsdWdpbklkOiB0aGlzLm1hbmlmZXN0LmlkLCBvcGVyYXRpb25OYW1lOiAnUHJvY2VzcyBub3RlJyB9KTtcbiAqIC8vIC4uLiBsb25nLXJ1bm5pbmcgd29yayAocHJvY2VzcywgcHJvY2Vzc0Zyb250TWF0dGVyLCBtZXJnZS9zcGxpdCkgLi4uXG4gKiAvLyBhdXRvLXVubG9ja2VkIGF0IHNjb3BlIGV4aXRcbiAqIGBgYFxuICpcbiAqIFRoZSBleHBsaWNpdCB7QGxpbmsgdW5sb2NrUmVzb3VyY2VGb3JQYXRofSBwYWlyIHJlbWFpbnMgYXZhaWxhYmxlIGZvciBub24tYHVzaW5nYCBjYWxsIHNpdGVzLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBUQWJzdHJhY3RGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgc25hcHNob3QgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvYXJyYXknO1xuaW1wb3J0IHsgY29udmVydEFzeW5jVG9TeW5jIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IEJlZXBlciB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9iZWVwZXInO1xuaW1wb3J0IHtcbiAgQ2FsbGJhY2tEaXNwb3NhYmxlLFxuICBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvclxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZGlzcG9zYWJsZSc7XG5pbXBvcnQgeyBub29wIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2Z1bmN0aW9uJztcbmltcG9ydCB7IGFzc2VydE5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IFZpZXdUeXBlIH0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuaW1wb3J0IHtcbiAgRmlsZU1hbmFnZXIsXG4gIE1hcmtkb3duVmlldyxcbiAgTWVudSxcbiAgc2V0SWNvbixcbiAgc2V0VG9vbHRpcCxcbiAgVmF1bHRcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IFBhdGhPckZpbGUgfSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcblxuaW1wb3J0IHsgQ29tcG9uZW50RXggfSBmcm9tICcuL2NvbXBvbmVudHMvY29tcG9uZW50LWV4LnRzJztcbmltcG9ydCB7IE1vbmtleUFyb3VuZENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9tb25rZXktYXJvdW5kLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyB0b2dnbGVFZGl0b3JSZWFkT25seSB9IGZyb20gJy4vZWRpdG9yLnRzJztcbmltcG9ydCB7IGdldFBhdGggfSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB7IGFwcGVuZENvZGVCbG9jayB9IGZyb20gJy4vaHRtbC1lbGVtZW50LnRzJztcbmltcG9ydCB7IHQgfSBmcm9tICcuL2kxOG4vaTE4bi50cyc7XG5pbXBvcnQgeyBjb25maXJtIH0gZnJvbSAnLi9tb2RhbHMvY29uZmlybS50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUgfSBmcm9tICcuL29ic2lkaWFuLWRldi11dGlscy1zdGF0ZS50cyc7XG5pbXBvcnQge1xuICBpc0NoaWxkLFxuICBpc0NoaWxkT3JTZWxmXG59IGZyb20gJy4vdmF1bHQudHMnO1xuXG5jb25zdCBSRVNPVVJDRV9MT0NLX1NUQVRFX0tFWSA9ICdyZXNvdXJjZUxvY2snO1xuY29uc3QgTE9DS19JQ09OX0lEID0gJ2xvY2snO1xuY29uc3QgTE9DS19JTkRJQ0FUT1JfQ1NTX0NMQVNTID0gJ29ic2lkaWFuLWRldi11dGlscy1sb2NrLWluZGljYXRvcic7XG5jb25zdCBMT0NLX0lORElDQVRPUl9GTEFTSF9DU1NfQ0xBU1MgPSAnb2JzaWRpYW4tZGV2LXV0aWxzLWxvY2staW5kaWNhdG9yLWZsYXNoJztcbmNvbnN0IFNUQVRVU19CQVJfSVRFTV9DU1NfQ0xBU1MgPSAnc3RhdHVzLWJhci1pdGVtJztcbmNvbnN0IFNUQVRVU19CQVJfQ1NTX1NFTEVDVE9SID0gJy5zdGF0dXMtYmFyJztcbmNvbnN0IFVOTE9DS19JQ09OX0lEID0gJ3VubG9jayc7XG5jb25zdCBNSURETEVfTU9VU0VfQlVUVE9OID0gMTtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgbG9ja1Jlc291cmNlRm9yUGF0aH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9ja1Jlc291cmNlRm9yUGF0aFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgb3BlcmF0aW9uIHRha2luZyB0aGUgbG9jayAoZS5nLiBgJ01vdmUgc2VsZWN0aW9uJ2ApLiBTaG93biBuZXh0IHRvXG4gICAqIHRoZSBwbHVnaW4gbmFtZSBpbiB0aGUgdW5sb2NrIGNvbmZpcm1hdGlvbiBkaWFsb2cuXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb25OYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gbG9jay5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgbG9ja2luZyBwbHVnaW4gKGUuZy4gaXRzIGBtYW5pZmVzdC5pZGApLiBUaGUgbG9jayBpcyBhdHRyaWJ1dGVkIHRvIGl0IGZvclxuICAgKiByZWZlcmVuY2UtY291bnRpbmcgYW5kIHRoZSBpbmRpY2F0b3JzJyBcImxvY2tlZCBieVwiIHRvb2x0aXAuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnQubG9ja0ZvclBhdGh9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIHtAbGluayBBYm9ydENvbnRyb2xsZXJ9IGFzc29jaWF0ZWQgd2l0aCB0aGUgbG9jay4gV2hlbiBhIGxvY2sgaW5kaWNhdG9yIGlzIGNsaWNrZWQgKHdpdGhcbiAgICogYW55IG1vdXNlIGJ1dHRvbikgYW5kIHRoZSB1c2VyIGNvbmZpcm1zIGFuIHVubG9jaywgdGhlIFwiVW5sb2NrIGFjdGl2ZSBub3RlXCIgY29tbWFuZCBydW5zLCBvclxuICAgKiB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50LnJlcXVlc3RVbmxvY2tGb3JQYXRofSAvIHtAbGluayByZXF1ZXN0UmVzb3VyY2VVbmxvY2tGb3JQYXRofSBpcyBjYWxsZWRcbiAgICogZm9yIHRoZSBwYXRoLCB0aGlzIGNvbnRyb2xsZXIgaXMgYWJvcnRlZCBzbyB0aGUgb3BlcmF0aW9uIGhvbGRpbmcgdGhlIGxvY2sgY2FuIGNhbmNlbCBpdHNlbGYuIFVubGVzc1xuICAgKiB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMuc2hvdWxkUmVsZWFzZU9uQWJvcnR9IGlzIHNldCwgdGhlIG9wZXJhdGlvbiBpc1xuICAgKiBleHBlY3RlZCB0byByZWxlYXNlIHRoZSBsb2NrIGluIGl0cyBvd24gY2xlYW51cC4gV2hlbiBvbWl0dGVkLCBhbiB1bmxvY2sgc3RpbGwgcmVsZWFzZXMgdGhlIGxvY2sgYnV0XG4gICAqIGNhbm5vdCBjYW5jZWwgdGhlIG9wZXJhdGlvbiB0aGF0IHRvb2sgaXQuXG4gICAqL1xuICByZWFkb25seSBhYm9ydENvbnRyb2xsZXI/OiBBYm9ydENvbnRyb2xsZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2NrIHNjb3BlLiBgJ3N1YnRyZWUnYCBhbHNvIGxvY2tzIGV2ZXJ5IGRlc2NlbmRhbnQgb2YgYSBmb2xkZXIgcGF0aDsgYCdmaWxlJ2AgbG9ja3Mgb25seSB0aGVcbiAgICogZXhhY3QgcGF0aC4gQSBgc3VidHJlZWAgbG9jayBtdXN0IGJlIHJlbGVhc2VkIHZpYSB0aGUgcmV0dXJuZWQge0BsaW5rIERpc3Bvc2FibGV9IChub3QgdGhlXG4gICAqIGV4cGxpY2l0IHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnQudW5sb2NrRm9yUGF0aH0pLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJ2ZpbGUnYFxuICAgKi9cbiAgcmVhZG9ubHkgbW9kZT86IFJlc291cmNlTG9ja01vZGU7XG5cbiAgLyoqXG4gICAqIFdoZW4gcHJvdmlkZWQsIHRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGVuIGFuIHVubG9jayBvZiB0aGUgbG9jayBpcyByZXF1ZXN0ZWQg4oCUIGkuZS4gd2hlbiB0aGVcbiAgICogbG9jaydzIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcy5hYm9ydENvbnRyb2xsZXJ9IGlzIGFib3J0ZWQgKGJ5IHRoZVxuICAgKiBpbmRpY2F0b3IncyBcIlVubG9ja1wiIG1lbnUsIHRoZSBcIlVubG9jayBhY3RpdmUgbm90ZVwiIGNvbW1hbmQsIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnQucmVxdWVzdFVubG9ja0ZvclBhdGh9LFxuICAgKiBvciB7QGxpbmsgaGFuZGxlRXh0ZXJuYWxNdXRhdGlvbn0pLiBVc2UgaXQgdG8gY2xlYXIgY29uc3VtZXItc2lkZSBzdGF0ZSB0aGF0IHNoYWRvd3MgdGhlIGxvY2sgKGUuZy5cbiAgICogYSBwZW5kaW5nLW9wZXJhdGlvbiBidWZmZXIgb3IgYSBub3RpY2UpIHdpdGhvdXQgaGFuZC13aXJpbmcgYW4gYGFib3J0YCBsaXN0ZW5lci4gRmlyZXMgYXQgbW9zdCBvbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgb25VbmxvY2tSZXF1ZXN0ZWQ/OiAoKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIG9wZXJhdGlvbiB0aGF0IHRvb2sgdGhlIGxvY2sgKGUuZy4gYCdNb3ZlIHNlbGVjdGlvbidgLCBgJ01lcmdlXG4gICAqIG5vdGVzJ2ApLiBJdCBpcyBzaG93biDigJQgbmV4dCB0byB0aGUgbG9ja2luZyBwbHVnaW4ncyBuYW1lIOKAlCBpbiB0aGUgdW5sb2NrIGNvbmZpcm1hdGlvbiBkaWFsb2csIHNvXG4gICAqIHRoZSB1c2VyIHNlZXMgZXhhY3RseSB3aGljaCBvcGVyYXRpb24gYW4gdW5sb2NrIHdvdWxkIGNhbmNlbC5cbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdGlvbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byBsb2NrLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAsIHRoZSBsb2NrIGFsc28gKipibG9ja3MgdmF1bHQgbXV0YXRpb25zKiogb2YgdGhlIGNvdmVyZWQgcGF0aChzKTogYW55IGF0dGVtcHQgdG8gZWRpdCxcbiAgICogZGVsZXRlLCByZW5hbWUsIG1vdmUsIG9yIChyZSljcmVhdGUgdGhlIHJlc291cmNlIHRocm91Z2ggdGhlIGBWYXVsdGAvYEZpbGVNYW5hZ2VyYCBBUEkgdGhyb3dzIGFcbiAgICoge0BsaW5rIFJlc291cmNlTG9ja2VkRXJyb3J9LiBJbnN0YWxsZWQgbGF6aWx5IG9uIHRoZSBmaXJzdCBzdWNoIGxvY2sgYW5kIHJlbW92ZWQgd2hlbiB0aGUgbGFzdCBvbmVcbiAgICogaXMgcmVsZWFzZWQuIFdoZW4gYGZhbHNlYCAodGhlIGRlZmF1bHQpIHRoZSBsb2NrIG9ubHkgbWFrZXMgdGhlIGVkaXRvciByZWFkLW9ubHkg4oCUIGxlZ2FjeSBiZWhhdmlvcixcbiAgICogc28gZXhpc3RpbmcgY29uc3VtZXJzIHRoYXQgd3JpdGUgdG8gYSBub3RlIHRoZXkgaG9sZCBhbiBlZGl0b3IgbG9jayBvbiBhcmUgdW5hZmZlY3RlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQmxvY2tNdXRhdGlvbnM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGVuIGB0cnVlYCwgdGhlIGxvY2sgcmVsZWFzZXMgaXRzZWxmIHRoZSBtb21lbnQgaXRzXG4gICAqIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcy5hYm9ydENvbnRyb2xsZXJ9IGlzIGFib3J0ZWQsIGluc3RlYWQgb2YgcmVseWluZyBvblxuICAgKiB0aGUgb3duaW5nIG9wZXJhdGlvbiB0byByZWxlYXNlIGl0IGluIGl0cyBvd24gY2xlYW51cC4gVXNlIGl0IGZvciBhIGxvY2sgaGVsZCAqKmluZGVmaW5pdGVseSoqXG4gICAqIG91dHNpZGUgYSBgdXNpbmdgIHNjb3BlIChzbyB0aGVyZSBpcyBubyBgZmluYWxseWAgdG8gcmVsZWFzZSBpdCkg4oCUIGUuZy4gYSBsb2NrIHRoYXQgc3RheXMgdW50aWwgdGhlXG4gICAqIHVzZXIgZXhwbGljaXRseSB1bmxvY2tzLiBMZWF2ZSBpdCBgZmFsc2VgIGZvciBhIHRyYW5zYWN0aW9uYWwgb3BlcmF0aW9uIHRoYXQgaG9sZHMgdGhlIGxvY2sgdGhyb3VnaFxuICAgKiBpdHMgb3duIGFib3J0LWRyaXZlbiByb2xsYmFjayBhbmQgcmVsZWFzZXMgaXQgdmlhIGB1c2luZ2AgYXQgc2NvcGUgZXhpdC4gSGFzIG5vIGVmZmVjdCB3aXRob3V0IGFuXG4gICAqIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcy5hYm9ydENvbnRyb2xsZXJ9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRSZWxlYXNlT25BYm9ydD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVGhlIHNjb3BlIG9mIGEgbG9jay5cbiAqXG4gKiAtIGAnZmlsZSdgIGxvY2tzIG9ubHkgdGhlIGV4YWN0IHBhdGguXG4gKiAtIGAnc3VidHJlZSdgIGxvY2tzIHRoZSBwYXRoIGFuZCBldmVyeSBkZXNjZW5kYW50IHVuZGVyIGl0IChpdHMgd2hvbGUgZm9sZGVyIHN1YnRyZWUpLCBzbyBhIGZpbGVcbiAqICAgaW5zaWRlIGEgYHN1YnRyZWVgLWxvY2tlZCBmb2xkZXIgaXMgdHJlYXRlZCBhcyBsb2NrZWQgdG9vLlxuICovXG5leHBvcnQgdHlwZSBSZXNvdXJjZUxvY2tNb2RlID0gJ2ZpbGUnIHwgJ3N1YnRyZWUnO1xuXG5pbnRlcmZhY2UgTG9ja0Rlc2NyaXB0b3Ige1xuICByZWFkb25seSBvcGVyYXRpb25OYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIExvY2tFbnRyeSB7XG4gIHJlYWRvbmx5IGFib3J0Q29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyIHwgbnVsbDtcbiAgcmVhZG9ubHkgYmxvY2tzTXV0YXRpb25zOiBib29sZWFuO1xuICByZWFkb25seSBtb2RlOiBSZXNvdXJjZUxvY2tNb2RlO1xuICByZWFkb25seSBvblVubG9ja1JlcXVlc3RlZDogKCgpID0+IHZvaWQpIHwgbnVsbDtcbiAgcmVhZG9ubHkgb3BlcmF0aW9uTmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHBhdGggdGhlIGVudHJ5IGlzIGN1cnJlbnRseSByZWdpc3RlcmVkIHVuZGVyLiBEZWxpYmVyYXRlbHkgbXV0YWJsZTogYSByZW5hbWUgcmUta2V5cyB0aGVcbiAgICogcmVnaXN0cnksIGFuZCByZWxlYXNlIG11c3QgZmluZCB0aGUgZW50cnkgYXQgaXRzIENVUlJFTlQgcGF0aCDigJQgYSByZWxlYXNlIHRoYXQgY2FwdHVyZWQgdGhlIHBhdGhcbiAgICogYXQgbG9jayB0aW1lIHdvdWxkIHNpbGVudGx5IG5vLW9wIGFmdGVyIHRoZSByZXNvdXJjZSBtb3ZlZCwgbGVha2luZyB0aGUgbG9jayBmb3JldmVyLlxuICAgKi9cbiAgcGF0aDogc3RyaW5nO1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICByZWFkb25seSBzaG91bGRSZWxlYXNlT25BYm9ydDogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIExvY2tJbmRpY2F0b3JzIHtcbiAgcmVhZG9ubHkgYWN0aW9uSWNvbkVsOiBIVE1MRWxlbWVudDtcbiAgZGlzcG9zZVR5cGVMaXN0ZW5lcjogKCkgPT4gdm9pZDtcbiAgcmVhZG9ubHkgdGFiSWNvbkVsOiBIVE1MRWxlbWVudCB8IG51bGw7XG59XG5cbmludGVyZmFjZSBNYW5hZ2VyTG9ja1BhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0Q29udHJvbGxlcj86IEFib3J0Q29udHJvbGxlciB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGJsb2Nrc011dGF0aW9ucz86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IG1vZGU/OiBSZXNvdXJjZUxvY2tNb2RlIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBvblVubG9ja1JlcXVlc3RlZD86ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgb3BlcmF0aW9uTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICByZWFkb25seSBzaG91bGRSZWxlYXNlT25BYm9ydD86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ29uc3RydWN0b3IgcGFyYW1ldGVycyBmb3Ige0BsaW5rIFJlc291cmNlTG9ja0V2ZW50c0NvbXBvbmVudH0uXG4gKi9cbmludGVyZmFjZSBSZXNvdXJjZUxvY2tFdmVudHNDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBvbkNoYW5nZTogKCkgPT4gdm9pZDtcbiAgcmVhZG9ubHkgb25FeHRlcm5hbE11dGF0aW9uOiAocGF0aDogc3RyaW5nKSA9PiB2b2lkO1xuICByZWFkb25seSBvbkZpbGVNZW51OiAobWVudTogTWVudSwgZmlsZTogVEFic3RyYWN0RmlsZSkgPT4gdm9pZDtcbiAgcmVhZG9ubHkgb25SZW5hbWU6IChvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZykgPT4gdm9pZDtcbn1cblxuaW50ZXJmYWNlIFJlc291cmNlTG9ja011dGF0aW9uQmxvY2tlckNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgc2hvdWxkQmxvY2tNdXRhdGlvbjogKHBhdGg6IHN0cmluZykgPT4gYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBTdWJzY3JpYmVzIHRvIHRoZSB3b3Jrc3BhY2UgZXZlbnRzIHRoYXQgc2hvdWxkIHRyaWdnZXIgYSBsb2NrIHJlY29uY2lsZSAoYW5kIHRoZSBmaWxlIGNvbnRleHQtbWVudVxuICogZXZlbnQgdGhhdCBvZmZlcnMgYW4gXCJVbmxvY2tcIiBpdGVtKS4gSW1wbGVtZW50ZWQgYXMgYSB7QGxpbmsgQ29tcG9uZW50RXh9IHNvIHRoZSBzdWJzY3JpcHRpb25zIGFyZVxuICogcmVnaXN0ZXJlZCBvbiBgbG9hZCgpYCBhbmQgYXV0b21hdGljYWxseSByZW1vdmVkIG9uIGB1bmxvYWQoKWAsIGluc3RlYWQgb2YgYmVpbmcgdHJhY2tlZCBieSBoYW5kLlxuICovXG5jbGFzcyBSZXNvdXJjZUxvY2tFdmVudHNDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRFeCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25DaGFuZ2U6ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25FeHRlcm5hbE11dGF0aW9uOiAocGF0aDogc3RyaW5nKSA9PiB2b2lkO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uRmlsZU1lbnU6IChtZW51OiBNZW51LCBmaWxlOiBUQWJzdHJhY3RGaWxlKSA9PiB2b2lkO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uUmVuYW1lOiAob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpID0+IHZvaWQ7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUmVzb3VyY2VMb2NrRXZlbnRzQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLm9uQ2hhbmdlID0gcGFyYW1zLm9uQ2hhbmdlO1xuICAgIHRoaXMub25FeHRlcm5hbE11dGF0aW9uID0gcGFyYW1zLm9uRXh0ZXJuYWxNdXRhdGlvbjtcbiAgICB0aGlzLm9uRmlsZU1lbnUgPSBwYXJhbXMub25GaWxlTWVudTtcbiAgICB0aGlzLm9uUmVuYW1lID0gcGFyYW1zLm9uUmVuYW1lO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICBzdXBlci5vbmxvYWQoKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAud29ya3NwYWNlLm9uKCdhY3RpdmUtbGVhZi1jaGFuZ2UnLCB0aGlzLm9uQ2hhbmdlKSk7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLndvcmtzcGFjZS5vbignbGF5b3V0LWNoYW5nZScsIHRoaXMub25DaGFuZ2UpKTtcbiAgICAvLyBTYW1lLWxlYWYgbmF2aWdhdGlvbiB0byBhbm90aGVyIG5vdGUgZmlyZXMgbm8gbGVhZi9sYXlvdXQgY2hhbmdlOyB3aXRob3V0IHRoaXMgaXQgc3RheXMgcmVhZC1vbmx5LlxuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC53b3Jrc3BhY2Uub24oJ2ZpbGUtb3BlbicsIHRoaXMub25DaGFuZ2UpKTtcbiAgICAvLyBBZGRzIGFuIFwiVW5sb2NrXCIgaXRlbSB0byBhIGxvY2tlZCBub3RlJ3MgdGFiL2ZpbGUgY29udGV4dCBtZW51IChhbG9uZ3NpZGUgdGhlIGluZGljYXRvciBtZW51cykuXG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLndvcmtzcGFjZS5vbignZmlsZS1tZW51JywgdGhpcy5vbkZpbGVNZW51KSk7XG4gICAgLy8gRXh0ZXJuYWwtY2hhbmdlIGJhY2tzdG9wOiBhIHZhdWx0L21ldGFkYXRhIGV2ZW50IG9uIGEgbXV0YXRpb24tYmxvY2tlZCBwYXRoIG5vdCBjb3ZlcmVkIGJ5IGFuIGFjdGl2ZSBieXBhc3Mgc2NvcGUgaXMgYW4gaW50cnVkZXIgKGEgc3luYy9GUy9hZGFwdGVyIGNoYW5nZSB0aGF0IGJ5cGFzc2VkIHRoZSBibG9ja2VyIHBhdGNoKS5cbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAudmF1bHQub24oJ2NyZWF0ZScsIChmaWxlKTogdm9pZCA9PiB7XG4gICAgICB0aGlzLm9uRXh0ZXJuYWxNdXRhdGlvbihmaWxlLnBhdGgpO1xuICAgIH0pKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAudmF1bHQub24oJ2RlbGV0ZScsIChmaWxlKTogdm9pZCA9PiB7XG4gICAgICB0aGlzLm9uRXh0ZXJuYWxNdXRhdGlvbihmaWxlLnBhdGgpO1xuICAgIH0pKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAudmF1bHQub24oJ3JlbmFtZScsIChmaWxlLCBvbGRQYXRoKTogdm9pZCA9PiB7XG4gICAgICAvLyBSZS1rZXkgRklSU1QsIHNvIHRoZSBjaGVja3MgYmVsb3cgcnVuIGFnYWluc3Qgd2hlcmUgdGhlIGxvY2tzIGFjdHVhbGx5IGFyZSBub3cuXG4gICAgICAvLyBJbnRydWRlciBkZXRlY3Rpb24gaXMgdW5hZmZlY3RlZDogdGhlIG9sZCBwYXRoIHN0b3BzIHJlc29sdmluZywgYnV0IHRoZSBuZXcgb25lIGlzIGNvdmVyZWQgaW5zdGVhZC5cbiAgICAgIHRoaXMub25SZW5hbWUob2xkUGF0aCwgZmlsZS5wYXRoKTtcbiAgICAgIHRoaXMub25FeHRlcm5hbE11dGF0aW9uKG9sZFBhdGgpO1xuICAgICAgdGhpcy5vbkV4dGVybmFsTXV0YXRpb24oZmlsZS5wYXRoKTtcbiAgICB9KSk7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUub24oJ2RlbGV0ZWQnLCAoZmlsZSk6IHZvaWQgPT4ge1xuICAgICAgdGhpcy5vbkV4dGVybmFsTXV0YXRpb24oZmlsZS5wYXRoKTtcbiAgICB9KSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUcmFja3MgcGF0aC1zY29wZWQgZWRpdG9yIGxvY2tzIGFuZCBrZWVwcyBldmVyeSBvcGVuIHtAbGluayBNYXJrZG93blZpZXd9IGluIHN5bmMgd2l0aCB0aGUgbG9ja2VkXG4gKiBzZXQuIEEgc2luZ2xlIGluc3RhbmNlIGxpdmVzIG9uIHRoZSBzaGFyZWQgYG9ic2lkaWFuLWRldi11dGlsc2Agc3RhdGUuIEVhY2ggbG9jayBpcyBvbmVcbiAqIHtAbGluayBMb2NrRW50cnl9IGluIGEgcGVyLXBhdGggbGlzdCwgc28gYSBwYXRoIGNhbiBiZSBoZWxkIGJ5IHNldmVyYWwgcGx1Z2lucyAob3Igc2V2ZXJhbCB0aW1lcyBieVxuICogb25lKSBjb25jdXJyZW50bHkgYW5kIGlzIHJlbGVhc2VkIG9ubHkgd2hlbiBpdHMgbGFzdCBlbnRyeSBpcyByZW1vdmVkOyB0aGUgaW5kaWNhdG9ycyByZXBvcnQgd2hpY2hcbiAqIHBsdWdpbnMgY3VycmVudGx5IGhvbGQgYSBsb2NrLlxuICovXG5jbGFzcyBSZXNvdXJjZUxvY2tNYW5hZ2VyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBiZWVwZXIgPSBuZXcgQmVlcGVyKCk7XG4gIC8vIFRoZSBpbm5lciBzZXRzIGFyZSBtdXRhYmxlIHNvIGEgcmVuYW1lIGNhbiByZS1rZXkgdGhlIHBhdGhzIG9mIGFuIGluLWZsaWdodCBieXBhc3Mgc2NvcGUgaW4gcGxhY2U7XG4gIC8vIHRoZSBzY29wZSdzIGBEaXNwb3NhYmxlYCBkZWxldGVzIGJ5IHNldCBpZGVudGl0eSwgc28gbXV0YXRpbmcgdGhlIGNvbnRlbnRzIGNhbm5vdCBvcnBoYW4gaXQuXG4gIHByaXZhdGUgcmVhZG9ubHkgYnlwYXNzUGF0aFNldHMgPSBuZXcgU2V0PFNldDxzdHJpbmc+PigpO1xuICBwcml2YXRlIGV2ZW50c0NvbXBvbmVudDogbnVsbCB8IFJlc291cmNlTG9ja0V2ZW50c0NvbXBvbmVudCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5kaWNhdG9yc0J5VmlldyA9IG5ldyBNYXA8TWFya2Rvd25WaWV3LCBMb2NrSW5kaWNhdG9ycz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2NrRW50cmllc0J5UGF0aCA9IG5ldyBNYXA8c3RyaW5nLCBMb2NrRW50cnlbXT4oKTtcbiAgcHJpdmF0ZSBtdXRhdGlvbkJsb2NrZXJDb21wb25lbnQ6IG51bGwgfCBSZXNvdXJjZUxvY2tNdXRhdGlvbkJsb2NrZXJDb21wb25lbnQgPSBudWxsO1xuICBwcml2YXRlIHN0YXR1c0Jhckl0ZW1FbDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICBwdWJsaWMgYnlwYXNzKGFwcDogQXBwLCBwYXRoc09yRmlsZXM6IHJlYWRvbmx5IFBhdGhPckZpbGVbXSk6IERpc3Bvc2FibGUge1xuICAgIGNvbnN0IGJ5cGFzc2VkUGF0aHMgPSBuZXcgU2V0KHBhdGhzT3JGaWxlcy5tYXAoKHBhdGhPckZpbGUpID0+IGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKSkpO1xuICAgIHRoaXMuYnlwYXNzUGF0aFNldHMuYWRkKGJ5cGFzc2VkUGF0aHMpO1xuICAgIHJldHVybiBuZXcgQ2FsbGJhY2tEaXNwb3NhYmxlKHtcbiAgICAgIGNhbGxiYWNrOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuYnlwYXNzUGF0aFNldHMuZGVsZXRlKGJ5cGFzc2VkUGF0aHMpO1xuICAgICAgfSxcbiAgICAgIG11bHRpcGxlRGlzcG9zZUJlaGF2aW9yOiBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JZ25vcmVcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGdWxseSB1bmxvY2tzIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoLiBSZXNvbHZlcyB0aGUgbG9jayBjb3ZlcmluZyBpdCDigJQgdGhlIHBhdGggaXRzZWxmIHdoZW5cbiAgICogZGlyZWN0bHkgbG9ja2VkLCBvdGhlcndpc2UgdGhlIGVuY2xvc2luZyBgc3VidHJlZWAtbG9ja2VkIGZvbGRlciDigJQgdGhlbiBhYm9ydHMgZXZlcnlcbiAgICoge0BsaW5rIEFib3J0Q29udHJvbGxlcn0gcmVnaXN0ZXJlZCBvbiB0aGF0IG93bmVyIChjYW5jZWxsaW5nIHRoZSBvcGVyYXRpb25zIHRoYXQgdG9vayB0aGUgbG9ja3MpXG4gICAqIEFORCByZW1vdmVzIHRoZSBvd25lcidzIGxvY2sgZW50cmllcyAocmVsZWFzaW5nIHRoZSBsb2NrIHVuY29uZGl0aW9uYWxseSkuIFVubGlrZVxuICAgKiB7QGxpbmsgcmVxdWVzdFVubG9ja30sIHdoaWNoIG9ubHkgYWJvcnRzIHRoZSBleGFjdCBwYXRoJ3MgY29udHJvbGxlcnMgYW5kIHJlbGllcyBvbiBlYWNoIG9wZXJhdGlvblxuICAgKiByZWxlYXNpbmcgaXRzIG93biBsb2NrLCB0aGlzIHJlc29sdmVzIGFuY2VzdG9yIGNvdmVyYWdlIGFuZCBhbHdheXMgcmVsZWFzZXMg4oCUIHNvIGEgbm90ZSBoZWxkIGJ5IGFuXG4gICAqIGluZGVmaW5pdGVseS1oZWxkIGxvY2sgaXMgZ3VhcmFudGVlZCB0byBiZWNvbWUgZWRpdGFibGUuIEEgbm8tb3Agd2hlbiBub3RoaW5nIGNvdmVycyB0aGUgcGF0aC5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byB1bmxvY2suXG4gICAqL1xuICBwdWJsaWMgZm9yY2VVbmxvY2soYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiB2b2lkIHtcbiAgICBjb25zdCBvd25lclBhdGggPSB0aGlzLnJlc29sdmVMb2NrT3duZXJQYXRoKGFwcCwgZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpKTtcbiAgICBpZiAob3duZXJQYXRoID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYWJvcnRBbmRSZWxlYXNlRW50cmllcyhhcHAsIG93bmVyUGF0aCk7XG4gIH1cblxuICBwdWJsaWMgaXNMb2NrZWQoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1BhdGhMb2NrZWQoZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gcGF0aCBpcyBsb2NrZWQgZGlyZWN0bHkgb3IgaXMgY292ZXJlZCBieSBhIGBzdWJ0cmVlYC1sb2NrZWQgYW5jZXN0b3JcbiAgICogZm9sZGVyLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHBhdGggaXMgaXRzZWxmIGxvY2tlZCBvciBsaWVzIHVuZGVyIGEgYHN1YnRyZWVgLWxvY2tlZCBmb2xkZXIuXG4gICAqL1xuICBwdWJsaWMgaXNMb2NrZWRCeUFuY2VzdG9yKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZUxvY2tPd25lclBhdGgoYXBwLCBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSkpICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBwYXRoIGlzIGNvdmVyZWQgYnkgYSBtdXRhdGlvbi1ibG9ja2luZyBsb2NrIChvbmUgdGFrZW4gd2l0aFxuICAgKiBgYmxvY2tzTXV0YXRpb25zYCkgZGlyZWN0bHkgb3Igb24gYSBgc3VidHJlZWAtbG9ja2VkIGFuY2VzdG9yIGZvbGRlci5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byBjaGVjay5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIGEgbXV0YXRpb24gb2YgdGhlIHBhdGggaXMgY3VycmVudGx5IGJsb2NrZWQuXG4gICAqL1xuICBwdWJsaWMgaXNNdXRhdGlvbkJsb2NrZWRCeUFuY2VzdG9yKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcGF0aCA9IGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKTtcbiAgICBjb25zdCBleGFjdEVudHJpZXMgPSB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmdldChwYXRoKTtcbiAgICBpZiAoZXhhY3RFbnRyaWVzPy5zb21lKChlbnRyeSkgPT4gZW50cnkuYmxvY2tzTXV0YXRpb25zKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2xvY2tlZFBhdGgsIGVudHJpZXNdIG9mIHRoaXMubG9ja0VudHJpZXNCeVBhdGgpIHtcbiAgICAgIGlmIChlbnRyaWVzLnNvbWUoKGVudHJ5KSA9PiBlbnRyeS5tb2RlID09PSAnc3VidHJlZScgJiYgZW50cnkuYmxvY2tzTXV0YXRpb25zKSAmJiBpc0NoaWxkKHsgYXBwLCBjaGlsZFBhdGhPckZpbGU6IHBhdGgsIHBhcmVudFBhdGhPckZpbGU6IGxvY2tlZFBhdGggfSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBsb2NrKHBhcmFtczogTWFuYWdlckxvY2tQYXJhbXMpOiBEaXNwb3NhYmxlIHtcbiAgICBjb25zdCB7IGFwcCB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IHBhdGggPSBnZXRQYXRoKGFwcCwgcGFyYW1zLnBhdGhPckZpbGUpO1xuICAgIGNvbnN0IGVudHJ5OiBMb2NrRW50cnkgPSB7XG4gICAgICBhYm9ydENvbnRyb2xsZXI6IHBhcmFtcy5hYm9ydENvbnRyb2xsZXIgPz8gbnVsbCxcbiAgICAgIGJsb2Nrc011dGF0aW9uczogcGFyYW1zLmJsb2Nrc011dGF0aW9ucyA/PyBmYWxzZSxcbiAgICAgIG1vZGU6IHBhcmFtcy5tb2RlID8/ICdmaWxlJyxcbiAgICAgIG9uVW5sb2NrUmVxdWVzdGVkOiBwYXJhbXMub25VbmxvY2tSZXF1ZXN0ZWQgPz8gbnVsbCxcbiAgICAgIG9wZXJhdGlvbk5hbWU6IHBhcmFtcy5vcGVyYXRpb25OYW1lLFxuICAgICAgcGF0aCxcbiAgICAgIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWQsXG4gICAgICBzaG91bGRSZWxlYXNlT25BYm9ydDogcGFyYW1zLnNob3VsZFJlbGVhc2VPbkFib3J0ID8/IGZhbHNlXG4gICAgfTtcbiAgICBsZXQgZW50cmllcyA9IHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KHBhdGgpO1xuICAgIGlmICghZW50cmllcykge1xuICAgICAgZW50cmllcyA9IFtdO1xuICAgICAgdGhpcy5sb2NrRW50cmllc0J5UGF0aC5zZXQocGF0aCwgZW50cmllcyk7XG4gICAgfVxuICAgIGVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgdGhpcy5lbnN1cmVTdWJzY3JpYmVkKGFwcCk7XG4gICAgaWYgKGVudHJ5LmJsb2Nrc011dGF0aW9ucykge1xuICAgICAgdGhpcy5lbnN1cmVCbG9ja2VySW5zdGFsbGVkKGFwcCk7XG4gICAgfVxuICAgIHRoaXMud2lyZVJlbGVhc2VPbkFib3J0KGFwcCwgZW50cnkpO1xuICAgIHRoaXMucmVjb25jaWxlKGFwcCk7XG5cbiAgICByZXR1cm4gbmV3IENhbGxiYWNrRGlzcG9zYWJsZSh7XG4gICAgICBjYWxsYmFjazogKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnJlbW92ZUVudHJ5KGFwcCwgZW50cnkpO1xuICAgICAgfSxcbiAgICAgIG11bHRpcGxlRGlzcG9zZUJlaGF2aW9yOiBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JZ25vcmVcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBYm9ydHMgZXZlcnkge0BsaW5rIEFib3J0Q29udHJvbGxlcn0gY3VycmVudGx5IHJlZ2lzdGVyZWQgZm9yIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoLCB3aGljaFxuICAgKiBjYW5jZWxzIHRoZSBvcGVyYXRpb25zIGhvbGRpbmcgdGhlIGxvY2suIEVhY2ggb3BlcmF0aW9uIHJlbGVhc2VzIGl0cyBvd24gbG9jayBpbiBpdHMgYGZpbmFsbHlgXG4gICAqIHdoZW4gaXQgb2JzZXJ2ZXMgdGhlIGFib3J0LCBzbyB0aGlzIGRvZXMgbm90IHVubG9jayB0aGUgcGF0aCBkaXJlY3RseS4gQSBuby1vcCB3aGVuIG5vIGNvbnRyb2xsZXJcbiAgICogaXMgcmVnaXN0ZXJlZCBmb3IgdGhlIHBhdGguXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gcmVxdWVzdCBhbiB1bmxvY2sgZm9yLlxuICAgKi9cbiAgcHVibGljIHJlcXVlc3RVbmxvY2soYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiB2b2lkIHtcbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQoZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpKTtcbiAgICBpZiAoIWVudHJpZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBlbnRyeS5hYm9ydENvbnRyb2xsZXI/LmFib3J0KCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVubG9jayhhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSwgcGx1Z2luSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHBhdGggPSBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSk7XG4gICAgY29uc3QgZW50cmllcyA9IHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KHBhdGgpO1xuICAgIGlmICghZW50cmllcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbmRleCA9IGVudHJpZXMuZmluZEluZGV4KChlbnRyeSkgPT4gZW50cnkucGx1Z2luSWQgPT09IHBsdWdpbklkKTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVudHJpZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMubG9ja0VudHJpZXNCeVBhdGguZGVsZXRlKHBhdGgpO1xuICAgIH1cbiAgICB0aGlzLnJlY29uY2lsZUFuZENsZWFudXAoYXBwKTtcbiAgfVxuXG4gIHB1YmxpYyB1bmxvY2tBbGxGb3JQbHVnaW4oYXBwOiBBcHAsIHBsdWdpbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFtwYXRoLCBlbnRyaWVzXSBvZiB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoKSB7XG4gICAgICBjb25zdCByZW1haW5pbmcgPSBlbnRyaWVzLmZpbHRlcigoZW50cnkpID0+IGVudHJ5LnBsdWdpbklkICE9PSBwbHVnaW5JZCk7XG4gICAgICBpZiAocmVtYWluaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmRlbGV0ZShwYXRoKTtcbiAgICAgIH0gZWxzZSBpZiAocmVtYWluaW5nLmxlbmd0aCAhPT0gZW50cmllcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5sb2NrRW50cmllc0J5UGF0aC5zZXQocGF0aCwgcmVtYWluaW5nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5yZWNvbmNpbGVBbmRDbGVhbnVwKGFwcCk7XG4gIH1cblxuICAvKipcbiAgICogQWJvcnRzIGV2ZXJ5IHtAbGluayBBYm9ydENvbnRyb2xsZXJ9IG9uIHRoZSBnaXZlbiAoYWxyZWFkeS1yZXNvbHZlZCkgb3duZXIgcGF0aCdzIGxvY2sgZW50cmllcyDigJRcbiAgICogY2FuY2VsbGluZyB0aGUgb3duaW5nIG9wZXJhdGlvbnMg4oCUIGFuZCByZW1vdmVzIHRob3NlIGVudHJpZXMsIHJlbGVhc2luZyB0aGUgbG9jay4gVGhlIGVudHJpZXNcbiAgICogc25hcHNob3QgaXMgY29waWVkIGZpcnN0IGJlY2F1c2UgYW4gZW50cnkncyBgc2hvdWxkUmVsZWFzZU9uQWJvcnRgIGFib3J0IGxpc3RlbmVyIG11dGF0ZXMgdGhlXG4gICAqIGFycmF5IGFzIGl0IGZpcmVzLiBBbHdheXMgbGVhdmVzIHRoZSBvd25lciBwYXRoIHdpdGggbm8gZW50cmllcy5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBvd25lclBhdGggLSBUaGUgZGlyZWN0bHktbG9ja2VkIG93bmVyIHBhdGggd2hvc2UgZW50cmllcyB0byBhYm9ydCBhbmQgcmVsZWFzZS5cbiAgICovXG4gIHByaXZhdGUgYWJvcnRBbmRSZWxlYXNlRW50cmllcyhhcHA6IEFwcCwgb3duZXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQob3duZXJQYXRoKTtcbiAgICBhc3NlcnROb25OdWxsYWJsZShlbnRyaWVzKTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHNuYXBzaG90KGVudHJpZXMpKSB7XG4gICAgICBlbnRyeS5hYm9ydENvbnRyb2xsZXI/LmFib3J0KCk7XG4gICAgfVxuICAgIHRoaXMubG9ja0VudHJpZXNCeVBhdGguZGVsZXRlKG93bmVyUGF0aCk7XG4gICAgdGhpcy5yZWNvbmNpbGVBbmRDbGVhbnVwKGFwcCk7XG4gIH1cblxuICBwcml2YXRlIGFkZFVubG9ja01lbnVJdGVtKGFwcDogQXBwLCBtZW51OiBNZW51LCBwYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBtZW51LmFkZEl0ZW0oKGl0ZW0pID0+IHtcbiAgICAgIGl0ZW1cbiAgICAgICAgLnNldFRpdGxlKHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5yZXNvdXJjZUxvY2sudW5sb2NrTWVudUl0ZW0pKVxuICAgICAgICAuc2V0SWNvbihVTkxPQ0tfSUNPTl9JRClcbiAgICAgICAgLm9uQ2xpY2soY29udmVydEFzeW5jVG9TeW5jKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBpc0NvbmZpcm1lZCA9IGF3YWl0IGNvbmZpcm0oe1xuICAgICAgICAgICAgYXBwLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy51bmxvY2tDb25maXJtTWVzc2FnZShhcHAsIHBhdGgpLFxuICAgICAgICAgICAgdGl0bGU6IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5yZXNvdXJjZUxvY2sudW5sb2NrQ29uZmlybVRpdGxlKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChpc0NvbmZpcm1lZCkge1xuICAgICAgICAgICAgLy8gYHBhdGhgIGlzIHRoZSByZXNvbHZlZCBvd25lciBwYXRoLCBzbyBjYW5jZWwgaXRzIG9wZXJhdGlvbnMgYW5kIHJlbGVhc2UgdGhlIGxvY2sgb3V0cmlnaHQuXG4gICAgICAgICAgICB0aGlzLmFib3J0QW5kUmVsZWFzZUVudHJpZXMoYXBwLCBwYXRoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlSW5kaWNhdG9ycyhhcHA6IEFwcCwgdmlldzogTWFya2Rvd25WaWV3LCB0b29sdGlwOiBzdHJpbmcpOiBMb2NrSW5kaWNhdG9ycyB7XG4gICAgLy8gVGhlIGluZGljYXRvcnMgb3V0bGl2ZSBhIHJlbmFtZSBvZiB0aGUgbm90ZSAob3Igb2YgYW4gZW5jbG9zaW5nIGxvY2tlZCBmb2xkZXIpLCBzbyB0aGV5IHJlc29sdmVcbiAgICAvLyB0aGUgb3duZXIgbG9jayBhdCBDTElDSyB0aW1lIGZyb20gdGhlIHZpZXcncyBjdXJyZW50IGZpbGUsIGV4YWN0bHkgYXMgdGhlIHN0YXR1cy1iYXIgaXRlbSBkb2VzLlxuICAgIC8vIEEgY2FwdHVyZWQgb3duZXIgcGF0aCB3b3VsZCBnbyBzdGFsZSB0aGUgbW9tZW50IHRoZSBsb2NrIGlzIHJlLWtleWVkLlxuICAgIGNvbnN0IGdldE93bmVyUGF0aCA9ICgpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4gdGhpcy5yZXNvbHZlVmlld093bmVyUGF0aChhcHAsIHZpZXcpO1xuXG4gICAgY29uc3QgYWN0aW9uSWNvbkVsID0gdmlldy5hZGRBY3Rpb24oTE9DS19JQ09OX0lELCB0b29sdGlwLCBub29wKTtcbiAgICB0aGlzLnJlZ2lzdGVyVW5sb2NrTWVudShhcHAsIGFjdGlvbkljb25FbCwgZ2V0T3duZXJQYXRoKTtcblxuICAgIGxldCB0YWJJY29uRWw6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3QgdGFiU3RhdHVzQ29udGFpbmVyRWwgPSB2aWV3LmxlYWYudGFiSGVhZGVyU3RhdHVzQ29udGFpbmVyRWw7XG4gICAgaWYgKHRhYlN0YXR1c0NvbnRhaW5lckVsKSB7XG4gICAgICB0YWJJY29uRWwgPSB0YWJTdGF0dXNDb250YWluZXJFbC5jcmVhdGVTcGFuKHsgY2xzOiBMT0NLX0lORElDQVRPUl9DU1NfQ0xBU1MgfSk7XG4gICAgICBzZXRJY29uKHRhYkljb25FbCwgTE9DS19JQ09OX0lEKTtcbiAgICAgIHNldFRvb2x0aXAodGFiSWNvbkVsLCB0b29sdGlwKTtcbiAgICAgIHRoaXMucmVnaXN0ZXJVbmxvY2tNZW51KGFwcCwgdGFiSWNvbkVsLCBnZXRPd25lclBhdGgpO1xuICAgIH1cblxuICAgIC8vIEEgbG9ja2VkIHZpZXcgaXMgcmVhZC1vbmx5IGJ1dCBzdGlsbCBlZGl0YWJsZS1mb2N1c2FibGUsIHNvIGEga2V5c3Ryb2tlIGZpcmVzIGBiZWZvcmVpbnB1dGAuXG4gICAgLy8gT24gdGhhdCByZWplY3RlZCBhdHRlbXB0LCBmbGFzaCB0aGUgaW5kaWNhdG9ycyBhbmQgYmVlcCBzbyBpdCdzIGNsZWFyIHRoZSBub3RlIGlzIGxvY2tlZC5cbiAgICAvLyBUaGUgbGlzdGVuZXIgaXMgcmVtb3ZlZCBvbiB1bmxvY2suXG4gICAgY29uc3Qgb25UeXBlQXR0ZW1wdCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIHRoaXMuZmxhc2hJbmRpY2F0b3JzKHZpZXcpO1xuICAgICAgdGhpcy5iZWVwZXIuYmVlcCgpO1xuICAgIH07XG4gICAgdmlldy5jb250ZW50RWwuYWRkRXZlbnRMaXN0ZW5lcignYmVmb3JlaW5wdXQnLCBvblR5cGVBdHRlbXB0KTtcblxuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb25JY29uRWwsXG4gICAgICBkaXNwb3NlVHlwZUxpc3RlbmVyOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIHZpZXcuY29udGVudEVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JlZm9yZWlucHV0Jywgb25UeXBlQXR0ZW1wdCk7XG4gICAgICB9LFxuICAgICAgdGFiSWNvbkVsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlQmxvY2tlckluc3RhbGxlZChhcHA6IEFwcCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm11dGF0aW9uQmxvY2tlckNvbXBvbmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm11dGF0aW9uQmxvY2tlckNvbXBvbmVudCA9IG5ldyBSZXNvdXJjZUxvY2tNdXRhdGlvbkJsb2NrZXJDb21wb25lbnQoe1xuICAgICAgc2hvdWxkQmxvY2tNdXRhdGlvbjogKHBhdGgpOiBib29sZWFuID0+IHRoaXMuc2hvdWxkQmxvY2tNdXRhdGlvbihhcHAsIHBhdGgpXG4gICAgfSk7XG4gICAgdGhpcy5tdXRhdGlvbkJsb2NrZXJDb21wb25lbnQubG9hZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVTdWJzY3JpYmVkKGFwcDogQXBwKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZXZlbnRzQ29tcG9uZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZXZlbnRzQ29tcG9uZW50ID0gbmV3IFJlc291cmNlTG9ja0V2ZW50c0NvbXBvbmVudCh7XG4gICAgICBhcHAsXG4gICAgICBvbkNoYW5nZTogKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnJlY29uY2lsZShhcHApO1xuICAgICAgfSxcbiAgICAgIG9uRXh0ZXJuYWxNdXRhdGlvbjogKHBhdGgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVFeHRlcm5hbE11dGF0aW9uKGFwcCwgcGF0aCk7XG4gICAgICB9LFxuICAgICAgb25GaWxlTWVudTogKG1lbnUsIGZpbGUpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVGaWxlTWVudShhcHAsIG1lbnUsIGZpbGUpO1xuICAgICAgfSxcbiAgICAgIG9uUmVuYW1lOiAob2xkUGF0aCwgbmV3UGF0aCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZVJlbmFtZShhcHAsIG9sZFBhdGgsIG5ld1BhdGgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuZXZlbnRzQ29tcG9uZW50LmxvYWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgZmxhc2hFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgZWxlbWVudC5yZW1vdmVDbGFzcyhMT0NLX0lORElDQVRPUl9GTEFTSF9DU1NfQ0xBU1MpO1xuICAgIC8vIFJlYWQgbGF5b3V0IHRvIGZvcmNlIGEgcmVmbG93IHNvIHRoZSBmbGFzaCBhbmltYXRpb24gcmVzdGFydHMgb24gZXZlcnkgcmVqZWN0ZWQga2V5c3Ryb2tlLlxuICAgIGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgZWxlbWVudC5hZGRDbGFzcyhMT0NLX0lORElDQVRPUl9GTEFTSF9DU1NfQ0xBU1MpO1xuICB9XG5cbiAgcHJpdmF0ZSBmbGFzaEluZGljYXRvcnModmlldzogTWFya2Rvd25WaWV3KTogdm9pZCB7XG4gICAgY29uc3QgaW5kaWNhdG9ycyA9IHRoaXMuaW5kaWNhdG9yc0J5Vmlldy5nZXQodmlldyk7XG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIFtpbmRpY2F0b3JzPy5hY3Rpb25JY29uRWwsIGluZGljYXRvcnM/LnRhYkljb25FbCwgdGhpcy5zdGF0dXNCYXJJdGVtRWxdKSB7XG4gICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICB0aGlzLmZsYXNoRWxlbWVudChlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVhY3RzIHRvIGEgdmF1bHQvbWV0YWRhdGEgZXZlbnQgb24gYSBwYXRoLiBJZiB0aGUgcGF0aCBpcyBtdXRhdGlvbi1ibG9ja2VkIGFuZCBOT1QgY292ZXJlZCBieSBhblxuICAgKiBhY3RpdmUgYnlwYXNzIHNjb3BlLCB0aGUgY2hhbmdlIGJ5cGFzc2VkIHRoZSBibG9ja2VyIHBhdGNoIChzeW5jIC8gZmlsZXN5c3RlbSAvIGEgcmF3LWFkYXB0ZXJcbiAgICogd3JpdGUpIOKAlCBhbiBpbnRydWRlci4gQWJvcnQgdGhlIGBhYm9ydENvbnRyb2xsZXJgIG9mIGV2ZXJ5IG11dGF0aW9uLWJsb2NraW5nIGxvY2sgY292ZXJpbmcgdGhlIHBhdGhcbiAgICogc28gdGhlIG93bmluZyBvcGVyYXRpb24gY2FuY2VscyBhbmQgcm9sbHMgYmFjay4gQSBuby1vcCBmb3IgdGhlIG93bmVyJ3Mgb3duIChieXBhc3NlZCkgbXV0YXRpb25zLFxuICAgKiBmb3IgdW5ibG9ja2VkIHBhdGhzLCBhbmQgZm9yIGJsb2NraW5nIGxvY2tzIHdpdGggbm8gYGFib3J0Q29udHJvbGxlcmAuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIHRoZSBldmVudCBmaXJlZCBvbi5cbiAgICovXG4gIHByaXZhdGUgaGFuZGxlRXh0ZXJuYWxNdXRhdGlvbihhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzTXV0YXRpb25CbG9ja2VkQnlBbmNlc3RvcihhcHAsIHBhdGgpIHx8IHRoaXMuaXNCeXBhc3NlZChhcHAsIHBhdGgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2xvY2tlZFBhdGgsIGVudHJpZXNdIG9mIHRoaXMubG9ja0VudHJpZXNCeVBhdGgpIHtcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBpZiAoIWVudHJ5LmJsb2Nrc011dGF0aW9ucyB8fCAhZW50cnkuYWJvcnRDb250cm9sbGVyKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZG9lc0NvdmVyUGF0aCA9IGxvY2tlZFBhdGggPT09IHBhdGggfHwgKGVudHJ5Lm1vZGUgPT09ICdzdWJ0cmVlJyAmJiBpc0NoaWxkKHsgYXBwLCBjaGlsZFBhdGhPckZpbGU6IHBhdGgsIHBhcmVudFBhdGhPckZpbGU6IGxvY2tlZFBhdGggfSkpO1xuICAgICAgICBpZiAoZG9lc0NvdmVyUGF0aCkge1xuICAgICAgICAgIGVudHJ5LmFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVGaWxlTWVudShhcHA6IEFwcCwgbWVudTogTWVudSwgZmlsZTogVEFic3RyYWN0RmlsZSk6IHZvaWQge1xuICAgIC8vIE9mZmVyIFwiVW5sb2NrXCIgZm9yIGEgZGlyZWN0bHktbG9ja2VkIGZpbGUvZm9sZGVyLCBvciBhbnl0aGluZyBjb3ZlcmVkIGJ5IGEgYHN1YnRyZWVgIGxvY2sgb24gYW4gYW5jZXN0b3IuIFRoZSBtZW51IHRhcmdldHMgdGhlIG93bmVyIGxvY2sncyBwYXRoLlxuICAgIGNvbnN0IG93bmVyUGF0aCA9IHRoaXMucmVzb2x2ZUxvY2tPd25lclBhdGgoYXBwLCBmaWxlLnBhdGgpO1xuICAgIGlmIChvd25lclBhdGggPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hZGRVbmxvY2tNZW51SXRlbShhcHAsIG1lbnUsIG93bmVyUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogUmUta2V5cyB0aGUgcmVnaXN0cnkgb250byBhIHJlbmFtZWQgcGF0aCwgc28gYSBsb2NrIGZvbGxvd3MgdGhlIHJlc291cmNlIGl0IHdhcyB0YWtlbiBvbi4gTW92ZXNcbiAgICogdGhlIGVudHJpZXMgb2YgdGhlIHJlbmFtZWQgcGF0aCBBTkQgb2YgZXZlcnkgZGVzY2VuZGFudCBrZXkgKGEgZm9sZGVyIHJlbmFtZSBjaGFuZ2VzIGEgd2hvbGUgcGF0aFxuICAgKiBwcmVmaXgpLCBhbmQgcmViYXNlcyBldmVyeSBhY3RpdmUge0BsaW5rIFJlc291cmNlTG9ja01hbmFnZXIuYnlwYXNzfSBzY29wZSB0aGUgc2FtZSB3YXkg4oCUIHdpdGhvdXRcbiAgICogdGhhdCBzZWNvbmQgaGFsZiBhbiBvcGVyYXRpb24gdGhhdCByZW5hbWVzIGEgZm9sZGVyIGl0IGxvY2tlZCB3b3VsZCBoYXZlIGl0cyBPV04gbGF0ZXIgbXV0YXRpb25zXG4gICAqIHJlYWQgYXMgaW50cnVkZXJzLlxuICAgKlxuICAgKiBJZGVtcG90ZW50OiBhIHBhdGggdGhhdCBubyBsb25nZXIgbWF0Y2hlcyBpcyBsZWZ0IGFsb25lLCBzbyBpdCBkb2VzIG5vdCBtYXR0ZXIgd2hldGhlciBPYnNpZGlhblxuICAgKiBlbWl0cyB0aGUgZm9sZGVyJ3MgcmVuYW1lIGV2ZW50IGJlZm9yZSBvciBhZnRlciBpdHMgZGVzY2VuZGFudHMnLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIG9sZFBhdGggLSBUaGUgcGF0aCB0aGUgcmVzb3VyY2Ugd2FzIHJlbmFtZWQgZnJvbS5cbiAgICogQHBhcmFtIG5ld1BhdGggLSBUaGUgcGF0aCB0aGUgcmVzb3VyY2Ugd2FzIHJlbmFtZWQgdG8uXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVJlbmFtZShhcHA6IEFwcCwgb2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBDb2xsZWN0IGZpcnN0LCBhcHBseSBhZnRlcjogd3JpdGluZyBiYWNrIHdoaWxlIGl0ZXJhdGluZyB3b3VsZCByZS12aXNpdCB0aGUganVzdC1tb3ZlZCBrZXlzLlxuICAgIGNvbnN0IG1vdmVkRW50cmllc0J5UGF0aCA9IG5ldyBNYXA8c3RyaW5nLCBMb2NrRW50cnlbXT4oKTtcbiAgICBmb3IgKGNvbnN0IFtsb2NrZWRQYXRoLCBlbnRyaWVzXSBvZiB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoKSB7XG4gICAgICBjb25zdCByZWJhc2VkUGF0aCA9IHJlYmFzZVBhdGgobG9ja2VkUGF0aCwgb2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgICBpZiAocmViYXNlZFBhdGggPT09IG51bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgZW50cnkucGF0aCA9IHJlYmFzZWRQYXRoO1xuICAgICAgfVxuICAgICAgbW92ZWRFbnRyaWVzQnlQYXRoLnNldChyZWJhc2VkUGF0aCwgZW50cmllcyk7XG4gICAgICB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmRlbGV0ZShsb2NrZWRQYXRoKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtyZWJhc2VkUGF0aCwgZW50cmllc10gb2YgbW92ZWRFbnRyaWVzQnlQYXRoKSB7XG4gICAgICBjb25zdCBleGlzdGluZ0VudHJpZXMgPSB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmdldChyZWJhc2VkUGF0aCk7XG4gICAgICBpZiAoZXhpc3RpbmdFbnRyaWVzKSB7XG4gICAgICAgIC8vIEEgc3dhcCByZW5hbWVzIG9uZSBsb2NrZWQgcGF0aCBvbnRvIGFub3RoZXIsIHNvIHRoZSB0d28gZW50cnkgbGlzdHMgTUVSR0Ug4oCUIG5laXRoZXIgaG9sZGVyIGxvc2VzIGl0cyBsb2NrLlxuICAgICAgICBleGlzdGluZ0VudHJpZXMucHVzaCguLi5lbnRyaWVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9ja0VudHJpZXNCeVBhdGguc2V0KHJlYmFzZWRQYXRoLCBlbnRyaWVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGJ5cGFzc2VkUGF0aHMgb2YgdGhpcy5ieXBhc3NQYXRoU2V0cykge1xuICAgICAgLy8gU2FtZSBjb2xsZWN0LXRoZW4tYXBwbHkgc2hhcGU6IHRoZSBzZXQgbWF5IG5vdCBiZSBtdXRhdGVkIHdoaWxlIGl0IGlzIGJlaW5nIGl0ZXJhdGVkLlxuICAgICAgY29uc3QgcmViYXNlZEJ5cGFzc2VkUGF0aHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCBieXBhc3NlZFBhdGggb2YgYnlwYXNzZWRQYXRocykge1xuICAgICAgICBjb25zdCByZWJhc2VkUGF0aCA9IHJlYmFzZVBhdGgoYnlwYXNzZWRQYXRoLCBvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICAgICAgaWYgKHJlYmFzZWRQYXRoICE9PSBudWxsKSB7XG4gICAgICAgICAgcmViYXNlZEJ5cGFzc2VkUGF0aHMuc2V0KGJ5cGFzc2VkUGF0aCwgcmViYXNlZFBhdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtieXBhc3NlZFBhdGgsIHJlYmFzZWRQYXRoXSBvZiByZWJhc2VkQnlwYXNzZWRQYXRocykge1xuICAgICAgICBieXBhc3NlZFBhdGhzLmRlbGV0ZShieXBhc3NlZFBhdGgpO1xuICAgICAgICBieXBhc3NlZFBhdGhzLmFkZChyZWJhc2VkUGF0aCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVjb25jaWxlIHVuY29uZGl0aW9uYWxseTogYSByZW5hbWUgY2hhbmdlcyBjb3ZlcmFnZSBldmVuIHdoZW4gbm8ga2V5IG1vdmVkIOKAlCBhIG5vdGUgcmVuYW1lZCBJTlRPXG4gICAgLy8gQSBgc3VidHJlZWAtbG9ja2VkIGZvbGRlciBiZWNvbWVzIGNvdmVyZWQsIG9uZSByZW5hbWVkIE9VVCBvZiBpdCBzdG9wcyBiZWluZyBjb3ZlcmVkLlxuICAgIHRoaXMucmVjb25jaWxlKGFwcCk7XG4gIH1cblxuICBwcml2YXRlIGhhc0Jsb2NraW5nTG9jaygpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IGVudHJpZXMgb2YgdGhpcy5sb2NrRW50cmllc0J5UGF0aC52YWx1ZXMoKSkge1xuICAgICAgaWYgKGVudHJpZXMuc29tZSgoZW50cnkpID0+IGVudHJ5LmJsb2Nrc011dGF0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgcGF0aCBpcyBjb3ZlcmVkIGJ5IGFuIGFjdGl2ZSB7QGxpbmsgUmVzb3VyY2VMb2NrTWFuYWdlci5ieXBhc3N9IHNjb3BlIOKAlCB0aGVcbiAgICogb3duZXIgZGVjbGFyaW5nIHRoYXQgaXRzIG93biBtdXRhdGlvbnMgb2YgdGhlIHBhdGggKGFuZCwgZm9yIGEgZm9sZGVyLCBpdHMgc3VidHJlZSkgYXJlIHNhbmN0aW9uZWQuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIGJlaW5nIG11dGF0ZWQuXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiBzb21lIGFjdGl2ZSBieXBhc3Mgc2NvcGUgY292ZXJzIHRoZSBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBpc0J5cGFzc2VkKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IGJ5cGFzc2VkUGF0aHMgb2YgdGhpcy5ieXBhc3NQYXRoU2V0cykge1xuICAgICAgZm9yIChjb25zdCBieXBhc3NlZFBhdGggb2YgYnlwYXNzZWRQYXRocykge1xuICAgICAgICBpZiAoaXNDaGlsZE9yU2VsZih7IGFwcCwgY2hpbGRQYXRoT3JGaWxlOiBwYXRoLCBwYXJlbnRQYXRoT3JGaWxlOiBieXBhc3NlZFBhdGggfSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGlzUGF0aExvY2tlZChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KHBhdGgpPy5sZW5ndGggPz8gMCkgPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgZGVkdXBsaWNhdGVkIGxpc3Qgb2YgYChwbHVnaW4gbmFtZSwgb3BlcmF0aW9uIG5hbWUpYCBwYWlycyBkZXNjcmliaW5nIHRoZSBsb2NrcyBvbiBhXG4gICAqIHBhdGgg4oCUIG9uZSBwZXIgZGlzdGluY3QgcGx1Z2luK29wZXJhdGlvbi4gRHJpdmVzIHRoZSB1bmxvY2sgY29uZmlybWF0aW9uLCBzbyB0aGUgdXNlciBzZWVzIGV4YWN0bHlcbiAgICogd2hpY2ggb3BlcmF0aW9ucyBhbiB1bmxvY2sgd291bGQgY2FuY2VsLiBPbmx5IGV2ZXIgY2FsbGVkIGZvciBhIGxvY2tlZCBwYXRoLCBzbyBpdHMgZW50cmllcyBhcmVcbiAgICogYWx3YXlzIHByZXNlbnQuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBkaXJlY3RseS1sb2NrZWQgcGF0aCB3aG9zZSBsb2NrIGRlc2NyaXB0b3JzIHRvIGJ1aWxkLlxuICAgKiBAcmV0dXJucyBUaGUgZGlzdGluY3QgbG9jayBkZXNjcmlwdG9ycyBjb3ZlcmluZyB0aGUgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgbG9ja0Rlc2NyaXB0b3JzKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBMb2NrRGVzY3JpcHRvcltdIHtcbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQocGF0aCk7XG4gICAgYXNzZXJ0Tm9uTnVsbGFibGUoZW50cmllcyk7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IGRlc2NyaXB0b3JzOiBMb2NrRGVzY3JpcHRvcltdID0gW107XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBjb25zdCBwbHVnaW5OYW1lID0gYXBwLnBsdWdpbnMubWFuaWZlc3RzW2VudHJ5LnBsdWdpbklkXT8ubmFtZSA/PyBlbnRyeS5wbHVnaW5JZDtcbiAgICAgIGNvbnN0IGtleSA9IGAke3BsdWdpbk5hbWV9XFxuJHtlbnRyeS5vcGVyYXRpb25OYW1lfWA7XG4gICAgICBpZiAoc2Vlbi5oYXMoa2V5KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHNlZW4uYWRkKGtleSk7XG4gICAgICBkZXNjcmlwdG9ycy5wdXNoKHsgb3BlcmF0aW9uTmFtZTogZW50cnkub3BlcmF0aW9uTmFtZSwgcGx1Z2luTmFtZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGRlc2NyaXB0b3JzO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2NraW5nUGx1Z2luTmFtZXMoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQocGF0aCk7XG4gICAgLy8gYGxvY2tpbmdQbHVnaW5OYW1lc2AgaXMgb25seSBldmVyIGNhbGxlZCBmb3IgYSBsb2NrZWQgcGF0aCwgc28gaXRzIGVudHJpZXMgYXJlIGFsd2F5cyBwcmVzZW50LlxuICAgIGFzc2VydE5vbk51bGxhYmxlKGVudHJpZXMpO1xuICAgIGNvbnN0IHBsdWdpbklkcyA9IFsuLi5uZXcgU2V0KGVudHJpZXMubWFwKChlbnRyeSkgPT4gZW50cnkucGx1Z2luSWQpKV07XG4gICAgcmV0dXJuIHBsdWdpbklkcy5tYXAoKHBsdWdpbklkKSA9PiBhcHAucGx1Z2lucy5tYW5pZmVzdHNbcGx1Z2luSWRdPy5uYW1lID8/IHBsdWdpbklkKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9ja1Rvb2x0aXAoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgaGVhZGVyID0gdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlc291cmNlTG9jay5sb2NrZWRCeVRvb2x0aXApO1xuICAgIC8vIEEgcnVudGltZS1sZW5ndGggbGlzdCBvZiBwbHVnaW4gbmFtZXMsIG9uZSBwZXIgbGluZSB1bmRlciB0aGUgaGVhZGVyLlxuICAgIHJldHVybiBbaGVhZGVyLCAuLi50aGlzLmxvY2tpbmdQbHVnaW5OYW1lcyhhcHAsIHBhdGgpXS5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVjb25jaWxlKGFwcDogQXBwKTogdm9pZCB7XG4gICAgY29uc3Qgdmlld3NUb0xvY2sgPSBuZXcgU2V0PE1hcmtkb3duVmlldz4oKTtcbiAgICBmb3IgKGNvbnN0IGxlYWYgb2YgYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoVmlld1R5cGUuTWFya2Rvd24pKSB7XG4gICAgICBjb25zdCB2aWV3ID0gbGVhZi52aWV3O1xuICAgICAgaWYgKCEodmlldyBpbnN0YW5jZW9mIE1hcmtkb3duVmlldykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhdGggPSB2aWV3LmZpbGU/LnBhdGg7XG4gICAgICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXNvbHZlIHRoZSBsb2NrIGNvdmVyaW5nIHRoaXMgdmlldzogdGhlIGV4YWN0IHBhdGggd2hlbiBkaXJlY3RseSBsb2NrZWQsIG90aGVyd2lzZSB0aGUgZW5jbG9zaW5nIGBzdWJ0cmVlYC1sb2NrZWQgZm9sZGVyLiBJbmRpY2F0b3JzL3Rvb2x0aXAvdW5sb2NrIG1lbnUga2V5IG9mZiB0aGF0IG93bmVyIHBhdGguXG4gICAgICBjb25zdCBvd25lclBhdGggPSB0aGlzLnJlc29sdmVMb2NrT3duZXJQYXRoKGFwcCwgcGF0aCk7XG4gICAgICBpZiAob3duZXJQYXRoID09PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2aWV3c1RvTG9jay5hZGQodmlldyk7XG4gICAgICBjb25zdCB0b29sdGlwID0gdGhpcy5sb2NrVG9vbHRpcChhcHAsIG93bmVyUGF0aCk7XG4gICAgICAvLyBSZS1hcHBseSB0aGUgcmVhZC1vbmx5IHRvZ2dsZSBvbiBldmVyeSByZWNvbmNpbGUsIG5vdCBvbmx5IHRoZSBmaXJzdCB0aW1lIGEgdmlldyBpcyB0cmFja2VkLlxuICAgICAgLy8gVGhlIHRvZ2dsZSBpcyBpZGVtcG90ZW50LCBzbyByZS1hcHBseWluZyB0byBhbiBhbHJlYWR5LWxvY2tlZCB2aWV3IGlzIGNoZWFwLlxuICAgICAgLy8gQSB2aWV3IG9wZW5lZCBhZnRlciB0aGUgbG9jayBpcyByZWNvbmNpbGVkIHN5bmNocm9ub3VzbHksIGJlZm9yZSBpdHMgQ29kZU1pcnJvciBpcyByZWFkeS5cbiAgICAgIC8vIEl0cyBmaXJzdCB0b2dnbGUgaXMgdGhlcmVmb3JlIGEgbm8tb3A7IHJlLWFwcGx5aW5nIG1ha2VzIHRoZSBsb2NrIHRha2UgaG9sZCBvbmNlIGl0IHNldHRsZXMuXG4gICAgICB0b2dnbGVFZGl0b3JSZWFkT25seSh2aWV3LmVkaXRvciwgdHJ1ZSk7XG4gICAgICBjb25zdCBpbmRpY2F0b3JzID0gdGhpcy5pbmRpY2F0b3JzQnlWaWV3LmdldCh2aWV3KTtcbiAgICAgIGlmIChpbmRpY2F0b3JzKSB7XG4gICAgICAgIHRoaXMudXBkYXRlSW5kaWNhdG9yVG9vbHRpcHMoaW5kaWNhdG9ycywgdG9vbHRpcCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmluZGljYXRvcnNCeVZpZXcuc2V0KHZpZXcsIHRoaXMuY3JlYXRlSW5kaWNhdG9ycyhhcHAsIHZpZXcsIHRvb2x0aXApKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFt2aWV3LCBpbmRpY2F0b3JzXSBvZiB0aGlzLmluZGljYXRvcnNCeVZpZXcpIHtcbiAgICAgIGlmICh2aWV3c1RvTG9jay5oYXModmlldykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHRvZ2dsZUVkaXRvclJlYWRPbmx5KHZpZXcuZWRpdG9yLCBmYWxzZSk7XG4gICAgICBpbmRpY2F0b3JzLmRpc3Bvc2VUeXBlTGlzdGVuZXIoKTtcbiAgICAgIGluZGljYXRvcnMuYWN0aW9uSWNvbkVsLnJlbW92ZSgpO1xuICAgICAgaW5kaWNhdG9ycy50YWJJY29uRWw/LnJlbW92ZSgpO1xuICAgICAgdGhpcy5pbmRpY2F0b3JzQnlWaWV3LmRlbGV0ZSh2aWV3KTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZVN0YXR1c0JhcihhcHApO1xuICB9XG5cbiAgcHJpdmF0ZSByZWNvbmNpbGVBbmRDbGVhbnVwKGFwcDogQXBwKTogdm9pZCB7XG4gICAgdGhpcy5yZWNvbmNpbGUoYXBwKTtcbiAgICBpZiAodGhpcy5sb2NrRW50cmllc0J5UGF0aC5zaXplID09PSAwKSB7XG4gICAgICB0aGlzLmV2ZW50c0NvbXBvbmVudD8udW5sb2FkKCk7XG4gICAgICB0aGlzLmV2ZW50c0NvbXBvbmVudCA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc0Jsb2NraW5nTG9jaygpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5tdXRhdGlvbkJsb2NrZXJDb21wb25lbnQ/LnVubG9hZCgpO1xuICAgIHRoaXMubXV0YXRpb25CbG9ja2VyQ29tcG9uZW50ID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJVbmxvY2tNZW51KGFwcDogQXBwLCBlbGVtZW50OiBIVE1MRWxlbWVudCwgZ2V0Q29udGV4dFBhdGg6ICgpID0+IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIC8vIEEgY2xpY2sgb2YgQU5ZIG1vdXNlIGJ1dHRvbiBvbiBhIGxvY2sgaW5kaWNhdG9yIG9wZW5zIHRoZSBzYW1lIHVubG9jayBjb250ZXh0IG1lbnU6XG4gICAgLy8gYGNsaWNrYCBmaXJlcyBvbmx5IGZvciB0aGUgcHJpbWFyeSAobGVmdCkgYnV0dG9uLCBgY29udGV4dG1lbnVgIGZvciB0aGUgcmlnaHQgYnV0dG9uLCBhbmRcbiAgICAvLyBgYXV4Y2xpY2tgIGZvciB0aGUgbWlkZGxlIGJ1dHRvbiAodGhlIGJyb3dzZXIgZmlyZXMgbm8gYGNsaWNrYCBmb3IgaXQpLiBgYXV4Y2xpY2tgIGFsc28gZmlyZXMgZm9yXG4gICAgLy8gdGhlIHJpZ2h0IGJ1dHRvbiwgc28gaXQgaXMgZ3VhcmRlZCB0byB0aGUgbWlkZGxlIGJ1dHRvbiB0byBhdm9pZCBkb3VibGUtb3BlbmluZyBhbG9uZ3NpZGUgYGNvbnRleHRtZW51YC5cbiAgICAvLyBBIHBsYWluIGxpc3RlbmVyIGRpZXMgd2l0aCB0aGUgZWxlbWVudCB3aGVuIGl0IGlzIGAucmVtb3ZlKClgZCBvbiB1bmxvY2ssIHNvIGl0IG5ldmVyIGxlYWtzLlxuICAgIGNvbnN0IG9wZW5VbmxvY2tNZW51ID0gKCRldmVudDogTW91c2VFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25zdCBwYXRoID0gZ2V0Q29udGV4dFBhdGgoKTtcbiAgICAgIGlmIChwYXRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbWVudSA9IG5ldyBNZW51KCk7XG4gICAgICB0aGlzLmFkZFVubG9ja01lbnVJdGVtKGFwcCwgbWVudSwgcGF0aCk7XG4gICAgICBtZW51LnNob3dBdE1vdXNlRXZlbnQoJGV2ZW50KTtcbiAgICB9O1xuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvcGVuVW5sb2NrTWVudSk7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIG9wZW5VbmxvY2tNZW51KTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2F1eGNsaWNrJywgKCRldmVudCkgPT4ge1xuICAgICAgaWYgKCRldmVudC5idXR0b24gPT09IE1JRERMRV9NT1VTRV9CVVRUT04pIHtcbiAgICAgICAgb3BlblVubG9ja01lbnUoJGV2ZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlRW50cnkoYXBwOiBBcHAsIGVudHJ5OiBMb2NrRW50cnkpOiB2b2lkIHtcbiAgICAvLyBSZWFkIHRoZSBlbnRyeSdzIENVUlJFTlQgcGF0aCwgbm90IG9uZSBjYXB0dXJlZCB3aGVuIHRoZSBsb2NrIHdhcyB0YWtlbjogYSByZW5hbWUgbWF5IGhhdmVcbiAgICAvLyByZS1rZXllZCBpdCBzaW5jZSwgYW5kIGxvb2tpbmcgaXQgdXAgdW5kZXIgdGhlIG9sZCBwYXRoIHdvdWxkIHNpbGVudGx5IGxlYWsgdGhlIGxvY2suXG4gICAgY29uc3QgZW50cmllcyA9IHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KGVudHJ5LnBhdGgpO1xuICAgIGlmICghZW50cmllcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbmRleCA9IGVudHJpZXMuaW5kZXhPZihlbnRyeSk7XG4gICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbnRyaWVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmRlbGV0ZShlbnRyeS5wYXRoKTtcbiAgICB9XG4gICAgdGhpcy5yZWNvbmNpbGVBbmRDbGVhbnVwKGFwcCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgd2hpY2ggbG9ja2VkIHBhdGggKGlmIGFueSkgY292ZXJzIHRoZSBnaXZlbiBwYXRoOiB0aGUgcGF0aCBpdHNlbGYgd2hlbiBkaXJlY3RseSBsb2NrZWQsXG4gICAqIG90aGVyd2lzZSB0aGUgbG9uZ2VzdCBgc3VidHJlZWAtbG9ja2VkIGFuY2VzdG9yIGZvbGRlciB0aGF0IGNvbnRhaW5zIGl0IChsb25nZXN0IHNvIGEgbmVzdGVkXG4gICAqIHN1YnRyZWUgbG9jayB3aW5zIGRldGVybWluaXN0aWNhbGx5IG92ZXIgYW4gb3V0ZXIgb25lKS5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggdG8gcmVzb2x2ZSBhbiBvd25lciBsb2NrIGZvci5cbiAgICogQHJldHVybnMgVGhlIGNvdmVyaW5nIGxvY2tlZCBwYXRoLCBvciBgbnVsbGAgd2hlbiBub3RoaW5nIGNvdmVycyBpdC5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZUxvY2tPd25lclBhdGgoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IG51bGwgfCBzdHJpbmcge1xuICAgIGlmICh0aGlzLmlzUGF0aExvY2tlZChwYXRoKSkge1xuICAgICAgcmV0dXJuIHBhdGg7XG4gICAgfVxuICAgIGxldCBiZXN0T3duZXJQYXRoOiBudWxsIHwgc3RyaW5nID0gbnVsbDtcbiAgICBmb3IgKGNvbnN0IFtsb2NrZWRQYXRoLCBlbnRyaWVzXSBvZiB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoKSB7XG4gICAgICBjb25zdCBoYXNTdWJ0cmVlTG9jayA9IGVudHJpZXMuc29tZSgoZW50cnkpID0+IGVudHJ5Lm1vZGUgPT09ICdzdWJ0cmVlJyk7XG4gICAgICBpZiAoaGFzU3VidHJlZUxvY2sgJiYgaXNDaGlsZCh7IGFwcCwgY2hpbGRQYXRoT3JGaWxlOiBwYXRoLCBwYXJlbnRQYXRoT3JGaWxlOiBsb2NrZWRQYXRoIH0pICYmIChiZXN0T3duZXJQYXRoID09PSBudWxsIHx8IGxvY2tlZFBhdGgubGVuZ3RoID4gYmVzdE93bmVyUGF0aC5sZW5ndGgpKSB7XG4gICAgICAgIGJlc3RPd25lclBhdGggPSBsb2NrZWRQYXRoO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmVzdE93bmVyUGF0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgbG9jayBjb3ZlcmluZyB0aGUgbm90ZSBhIHZpZXcgY3VycmVudGx5IHNob3dzIOKAlCBpdHMgb3duIHBhdGggd2hlbiBkaXJlY3RseSBsb2NrZWQsXG4gICAqIG90aGVyd2lzZSB0aGUgZW5jbG9zaW5nIGBzdWJ0cmVlYC1sb2NrZWQgZm9sZGVyLiBSZWFkIGF0IGNsaWNrIHRpbWUgYnkgdGhlIHZpZXcncyBsb2NrIGluZGljYXRvcnMsXG4gICAqIHNvIGl0IHJlZmxlY3RzIHJlbmFtZXMgb2YgdGhlIG5vdGUgYW5kIG9mIHRoZSBsb2NrZWQgZm9sZGVyIGFsaWtlLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHZpZXcgLSBUaGUgdmlldyB3aG9zZSBjdXJyZW50IGZpbGUgdG8gcmVzb2x2ZSBhbiBvd25lciBsb2NrIGZvci5cbiAgICogQHJldHVybnMgVGhlIGNvdmVyaW5nIGxvY2tlZCBwYXRoLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSB2aWV3IGhhcyBubyBmaWxlIG9yIG5vdGhpbmcgY292ZXJzIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlVmlld093bmVyUGF0aChhcHA6IEFwcCwgdmlldzogTWFya2Rvd25WaWV3KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBwYXRoID0gdmlldy5maWxlPy5wYXRoO1xuICAgIHJldHVybiBwYXRoID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB0aGlzLnJlc29sdmVMb2NrT3duZXJQYXRoKGFwcCwgcGF0aCkgPz8gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY2lkZXMgd2hldGhlciBhIG11dGF0aW9uIG9mIHRoZSBwYXRoIG11c3QgYmUgYmxvY2tlZDogYHRydWVgIHdoZW4gdGhlIHBhdGggaXMgbXV0YXRpb24tYmxvY2tlZFxuICAgKiBhbmQgbm90IGNvdmVyZWQgYnkgYW55IGFjdGl2ZSB7QGxpbmsgUmVzb3VyY2VMb2NrTWFuYWdlci5ieXBhc3N9IHNjb3BlLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCBiZWluZyBtdXRhdGVkLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgdG8gcmVqZWN0IHRoZSBtdXRhdGlvbiwgYGZhbHNlYCB0byBhbGxvdyBpdC5cbiAgICovXG4gIHByaXZhdGUgc2hvdWxkQmxvY2tNdXRhdGlvbihhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNNdXRhdGlvbkJsb2NrZWRCeUFuY2VzdG9yKGFwcCwgcGF0aCkgJiYgIXRoaXMuaXNCeXBhc3NlZChhcHAsIHBhdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSB1bmxvY2tDb25maXJtTWVzc2FnZShhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgY29uc3QgZnJhZ21lbnQgPSBjcmVhdGVGcmFnbWVudCgpO1xuICAgIGZyYWdtZW50LmFwcGVuZFRleHQodCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlc291cmNlTG9jay51bmxvY2tDb25maXJtTWVzc2FnZSkpO1xuICAgIC8vIEEgcnVudGltZS1sZW5ndGggbGlzdCBvZiB0aGUgbG9ja3MgY3VycmVudGx5IGhlbGQ6IGVhY2ggcGx1Z2luIG5hbWUgYXMgYSBjb2RlIGJsb2NrIGZvbGxvd2VkIGJ5XG4gICAgLy8gdGhlIG9wZXJhdGlvbiBpdCBpcyBydW5uaW5nLCBvbmUgcGVyIGxpbmUuXG4gICAgZm9yIChjb25zdCBkZXNjcmlwdG9yIG9mIHRoaXMubG9ja0Rlc2NyaXB0b3JzKGFwcCwgcGF0aCkpIHtcbiAgICAgIGZyYWdtZW50LmNyZWF0ZUVsKCdicicpO1xuICAgICAgYXBwZW5kQ29kZUJsb2NrKGZyYWdtZW50LCBkZXNjcmlwdG9yLnBsdWdpbk5hbWUpO1xuICAgICAgZnJhZ21lbnQuYXBwZW5kVGV4dChgOiAke2Rlc2NyaXB0b3Iub3BlcmF0aW9uTmFtZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGZyYWdtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVJbmRpY2F0b3JUb29sdGlwcyhpbmRpY2F0b3JzOiBMb2NrSW5kaWNhdG9ycywgdG9vbHRpcDogc3RyaW5nKTogdm9pZCB7XG4gICAgc2V0VG9vbHRpcChpbmRpY2F0b3JzLmFjdGlvbkljb25FbCwgdG9vbHRpcCk7XG4gICAgaWYgKGluZGljYXRvcnMudGFiSWNvbkVsKSB7XG4gICAgICBzZXRUb29sdGlwKGluZGljYXRvcnMudGFiSWNvbkVsLCB0b29sdGlwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVN0YXR1c0JhcihhcHA6IEFwcCk6IHZvaWQge1xuICAgIGNvbnN0IGFjdGl2ZVZpZXcgPSBhcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KTtcbiAgICBjb25zdCBhY3RpdmVQYXRoID0gYWN0aXZlVmlldz8uZmlsZT8ucGF0aDtcbiAgICBjb25zdCBhY3RpdmVPd25lclBhdGggPSBhY3RpdmVQYXRoID09PSB1bmRlZmluZWQgPyBudWxsIDogdGhpcy5yZXNvbHZlTG9ja093bmVyUGF0aChhcHAsIGFjdGl2ZVBhdGgpO1xuXG4gICAgaWYgKGFjdGl2ZU93bmVyUGF0aCA9PT0gbnVsbCB8fCAhYWN0aXZlVmlldykge1xuICAgICAgdGhpcy5zdGF0dXNCYXJJdGVtRWw/LnJlbW92ZSgpO1xuICAgICAgdGhpcy5zdGF0dXNCYXJJdGVtRWwgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zdGF0dXNCYXJJdGVtRWwpIHtcbiAgICAgIGNvbnN0IHN0YXR1c0JhckVsID0gYWN0aXZlVmlldy5jb250YWluZXJFbC5vd25lckRvY3VtZW50LmJvZHkucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oU1RBVFVTX0JBUl9DU1NfU0VMRUNUT1IpO1xuICAgICAgaWYgKCFzdGF0dXNCYXJFbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnN0YXR1c0Jhckl0ZW1FbCA9IHN0YXR1c0JhckVsLmNyZWF0ZURpdih7IGNsczogW1NUQVRVU19CQVJfSVRFTV9DU1NfQ0xBU1MsIExPQ0tfSU5ESUNBVE9SX0NTU19DTEFTU10gfSk7XG4gICAgICBzZXRJY29uKHRoaXMuc3RhdHVzQmFySXRlbUVsLCBMT0NLX0lDT05fSUQpO1xuICAgICAgLy8gVGhlIHNpbmdsZSBzdGF0dXMtYmFyIGl0ZW0gaXMgcmV1c2VkIGFjcm9zcyBhY3RpdmUtbm90ZSBzd2l0Y2hlcy5cbiAgICAgIC8vIEl0IG11c3QgcmVzb2x2ZSB0aGUgY3VycmVudGx5IGFjdGl2ZSBub3RlJ3Mgb3duZXIgbG9jayBhdCBjbGljayB0aW1lIHJhdGhlciB0aGFuIGNhcHR1cmluZyBvbmUgcGF0aC5cbiAgICAgIHRoaXMucmVnaXN0ZXJVbmxvY2tNZW51KGFwcCwgdGhpcy5zdGF0dXNCYXJJdGVtRWwsICgpID0+IHtcbiAgICAgICAgY29uc3QgcGF0aCA9IGFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpPy5maWxlPy5wYXRoO1xuICAgICAgICByZXR1cm4gcGF0aCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdGhpcy5yZXNvbHZlTG9ja093bmVyUGF0aChhcHAsIHBhdGgpID8/IHVuZGVmaW5lZDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldFRvb2x0aXAodGhpcy5zdGF0dXNCYXJJdGVtRWwsIHRoaXMubG9ja1Rvb2x0aXAoYXBwLCBhY3RpdmVPd25lclBhdGgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaXJlcyBhbiBvcHQtaW4gYGFib3J0YCBsaXN0ZW5lciBmb3IgYSBsb2NrIGVudHJ5OiB3aGVuIHRoZSBlbnRyeSdzIGNvbnRyb2xsZXIgYWJvcnRzLCByZWxlYXNlc1xuICAgKiB0aGUgZW50cnkgKGlmIHtAbGluayBMb2NrRW50cnkuc2hvdWxkUmVsZWFzZU9uQWJvcnR9KSBhbmQvb3IgaW52b2tlc1xuICAgKiB7QGxpbmsgTG9ja0VudHJ5Lm9uVW5sb2NrUmVxdWVzdGVkfS4gQSBuby1vcCB3aGVuIHRoZSBlbnRyeSBoYXMgbm8gY29udHJvbGxlciBvciBuZWl0aGVyIG9wdC1pbiBpc1xuICAgKiBzZXQsIHNvIHRyYW5zYWN0aW9uYWwgbG9ja3Mga2VlcCByZWxlYXNpbmcgdmlhIHRoZWlyIG93biBjbGVhbnVwLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIGVudHJ5IC0gVGhlIGxvY2sgZW50cnkgd2hvc2UgY29udHJvbGxlciB0byBvYnNlcnZlLlxuICAgKi9cbiAgcHJpdmF0ZSB3aXJlUmVsZWFzZU9uQWJvcnQoYXBwOiBBcHAsIGVudHJ5OiBMb2NrRW50cnkpOiB2b2lkIHtcbiAgICBjb25zdCB7IG9uVW5sb2NrUmVxdWVzdGVkLCBzaG91bGRSZWxlYXNlT25BYm9ydCB9ID0gZW50cnk7XG4gICAgaWYgKCFlbnRyeS5hYm9ydENvbnRyb2xsZXIgfHwgKCFzaG91bGRSZWxlYXNlT25BYm9ydCAmJiAhb25VbmxvY2tSZXF1ZXN0ZWQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVudHJ5LmFib3J0Q29udHJvbGxlci5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB7XG4gICAgICBpZiAoc2hvdWxkUmVsZWFzZU9uQWJvcnQpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVFbnRyeShhcHAsIGVudHJ5KTtcbiAgICAgIH1cbiAgICAgIG9uVW5sb2NrUmVxdWVzdGVkPy4oKTtcbiAgICB9LCB7IG9uY2U6IHRydWUgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBNb25rZXktcGF0Y2hlcyB0aGUgdmF1bHQtbXV0YXRpb24gY2hva2UgcG9pbnRzIG9uIGBWYXVsdGAvYEZpbGVNYW5hZ2VyYCBzbyB0aGF0IGFueSBlZGl0LCBkZWxldGUsXG4gKiByZW5hbWUsIG1vdmUsIG9yIChyZSljcmVhdGUgb2YgYSBtdXRhdGlvbi1ibG9ja2VkIHBhdGggdGhyb3dzIGEge0BsaW5rIFJlc291cmNlTG9ja2VkRXJyb3J9LlxuICogSW5zdGFsbGVkIGxhemlseSBieSB7QGxpbmsgUmVzb3VyY2VMb2NrTWFuYWdlcn0gb24gdGhlIGZpcnN0IGBzaG91bGRCbG9ja011dGF0aW9uc2AgbG9jayBhbmQgcmVtb3ZlZFxuICogd2hlbiB0aGUgbGFzdCBvbmUgaXMgcmVsZWFzZWQ7IGJlaW5nIGEge0BsaW5rIE1vbmtleUFyb3VuZENvbXBvbmVudH0sIGV2ZXJ5IHBhdGNoIGlzIHRvcm4gZG93biBvblxuICogYHVubG9hZGAuIFJlbmFtZS9jb3B5IGNoZWNrIGJvdGggc291cmNlIGFuZCBkZXN0aW5hdGlvbjsgdGhlIG90aGVyIG1ldGhvZHMgY2hlY2sgdGhlaXIgc2luZ2xlIHBhdGguXG4gKi9cbmNsYXNzIFJlc291cmNlTG9ja011dGF0aW9uQmxvY2tlckNvbXBvbmVudCBleHRlbmRzIE1vbmtleUFyb3VuZENvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvdWxkQmxvY2tNdXRhdGlvbjogKHBhdGg6IHN0cmluZykgPT4gYm9vbGVhbjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBSZXNvdXJjZUxvY2tNdXRhdGlvbkJsb2NrZXJDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5zaG91bGRCbG9ja011dGF0aW9uID0gcGFyYW1zLnNob3VsZEJsb2NrTXV0YXRpb247XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHN1cGVyLm9ubG9hZCgpO1xuXG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAnYXBwZW5kJz4oe1xuICAgICAgJG9iamVjdDogVmF1bHQucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ2FwcGVuZCcsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW2ZpbGVdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtmaWxlLnBhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAnY29weSc+KHtcbiAgICAgICRvYmplY3Q6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdjb3B5JyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbLCBuZXdQYXRoXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbbmV3UGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdjcmVhdGUnPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAnY3JlYXRlJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbcGF0aF0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW3BhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAnY3JlYXRlQmluYXJ5Jz4oe1xuICAgICAgJG9iamVjdDogVmF1bHQucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ2NyZWF0ZUJpbmFyeScsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW3BhdGhdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtwYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ2NyZWF0ZUZvbGRlcic+KHtcbiAgICAgICRvYmplY3Q6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdjcmVhdGVGb2xkZXInLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtwYXRoXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbcGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdkZWxldGUnPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAnZGVsZXRlJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZV0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW2ZpbGUucGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdtb2RpZnknPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAnbW9kaWZ5JyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZV0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW2ZpbGUucGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdtb2RpZnlCaW5hcnknPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAnbW9kaWZ5QmluYXJ5JyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZV0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW2ZpbGUucGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdwcm9jZXNzJz4oe1xuICAgICAgJG9iamVjdDogVmF1bHQucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ3Byb2Nlc3MnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtmaWxlXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ3JlbmFtZSc+KHtcbiAgICAgICRvYmplY3Q6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdyZW5hbWUnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtmaWxlLCBuZXdQYXRoXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoLCBuZXdQYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ3RyYXNoJz4oe1xuICAgICAgJG9iamVjdDogVmF1bHQucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ3RyYXNoJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZV0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW2ZpbGUucGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8RmlsZU1hbmFnZXIsICdyZW5hbWVGaWxlJz4oe1xuICAgICAgJG9iamVjdDogRmlsZU1hbmFnZXIucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ3JlbmFtZUZpbGUnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtmaWxlLCBuZXdQYXRoXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoLCBuZXdQYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxGaWxlTWFuYWdlciwgJ3RyYXNoRmlsZSc+KHtcbiAgICAgICRvYmplY3Q6IEZpbGVNYW5hZ2VyLnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICd0cmFzaEZpbGUnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtmaWxlXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3NlcnROb3RCbG9ja2VkKHBhdGhzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiBwYXRocykge1xuICAgICAgaWYgKHRoaXMuc2hvdWxkQmxvY2tNdXRhdGlvbihwYXRoKSkge1xuICAgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VMb2NrZWRFcnJvcihwYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBIHBlci1wbHVnaW4gaGFuZGxlIGZvciBwYXRoLXNjb3BlZCByZXNvdXJjZSBsb2NraW5nIChlZGl0b3IgcmVhZC1vbmx5LCBvcHRpb25hbCB2YXVsdC1tdXRhdGlvblxuICogYmxvY2tpbmcsIGFuZCBleHRlcm5hbC1jaGFuZ2UgZGV0ZWN0aW9uIOKAlCBzZWUgdGhlIGZpbGUgb3ZlcnZpZXcpLiBBZGQgaXQgYXMgYSBjaGlsZCBvZiB5b3VyIHBsdWdpblxuICogKGB0aGlzLmFkZENoaWxkKG5ldyBSZXNvdXJjZUxvY2tDb21wb25lbnQodGhpcy5hcHApKWApIHNvIHRoYXQgYW55IGxvY2tzIGl0IHN0aWxsIGhvbGRzIGFyZSByZWxlYXNlZFxuICogYXV0b21hdGljYWxseSB3aGVuIHRoZSBwbHVnaW4gdW5sb2FkcyDigJQgYSByZXNvdXJjZSBjYW4gbmV2ZXIgYmUgbGVmdCBzdHVjayBsb2NrZWQgYmVjYXVzZSB0aGUgcGx1Z2luXG4gKiB0aGF0IGxvY2tlZCBpdCB3YXMgZGlzYWJsZWQgb3IgcmVsb2FkZWQgbWlkLW9wZXJhdGlvbi5cbiAqXG4gKiBMb2NrcyBhcmUgcmVmZXJlbmNlLWNvdW50ZWQgYW5kIGF0dHJpYnV0ZWQgdG8gdGhpcyBwbHVnaW4sIHNvIHRoZSBsb2NrIGluZGljYXRvcnMnIHRvb2x0aXAgbmFtZXMgaXRcbiAqIGFtb25nIHRoZSBwbHVnaW5zIGN1cnJlbnRseSBob2xkaW5nIGEgbG9jay5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlc291cmNlTG9ja0NvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgb3duaW5nIHBsdWdpbiAoZS5nLiBpdHMgYG1hbmlmZXN0LmlkYCkuIExvY2tzIGFyZSBhdHRyaWJ1dGVkIHRvIGl0IGZvclxuICAgKiByZWZlcmVuY2UtY291bnRpbmcgYW5kIHRoZSBpbmRpY2F0b3JzJyBcImxvY2tlZCBieVwiIHRvb2x0aXAuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiByZXNvdXJjZS1sb2NrIGhhbmRsZSBvd25lZCBieSBhIHBsdWdpbi5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwbHVnaW5JZCAtIFRoZSBpZCBvZiB0aGUgb3duaW5nIHBsdWdpbiAoZS5nLiBpdHMgYG1hbmlmZXN0LmlkYCkuIExvY2tzIGFyZSBhdHRyaWJ1dGVkIHRvXG4gICAqIGl0IGZvciByZWZlcmVuY2UtY291bnRpbmcgYW5kIHRoZSBpbmRpY2F0b3JzJyBcImxvY2tlZCBieVwiIHRvb2x0aXAuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoYXBwOiBBcHAsIHBsdWdpbklkOiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gYXBwO1xuICAgIHRoaXMucGx1Z2luSWQgPSBwbHVnaW5JZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVucyBhbiAqKmFtYmllbnQgYnlwYXNzIHNjb3BlKio6IHdoaWxlIHRoZSByZXR1cm5lZCB7QGxpbmsgRGlzcG9zYWJsZX0gaXMgbm90IGRpc3Bvc2VkLCB0aGlzXG4gICAqIHBsdWdpbidzIG93biBtdXRhdGlvbnMgb2YgdGhlIGdpdmVuIHBhdGhzIChhbmQsIGZvciBhIGZvbGRlciwgaXRzIHdob2xlIHN1YnRyZWUpIHBhc3MgdGhyb3VnaCB0aGVcbiAgICogbXV0YXRpb24gYmxvY2tlciBpbnN0ZWFkIG9mIHRocm93aW5nIHtAbGluayBSZXNvdXJjZUxvY2tlZEVycm9yfS4gQW55IG11dGF0aW9uIG9mIGEgYmxvY2tlZCBwYXRoXG4gICAqIE5PVCBjb3ZlcmVkIGJ5IGFuIGFjdGl2ZSBieXBhc3Mgc2NvcGUgaXMgc3RpbGwgcmVqZWN0ZWQuIFVzZSBpdCB3aXRoIGEgYHVzaW5nYCBkZWNsYXJhdGlvbiBhcm91bmRcbiAgICogdGhlIG9wZXJhdGlvbiB0aGF0IGxlZ2l0aW1hdGVseSBtdXRhdGVzIHJlc291cmNlcyBpdCBoYXMgbG9ja2VkIHdpdGhcbiAgICoge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zLnNob3VsZEJsb2NrTXV0YXRpb25zfTpcbiAgICpcbiAgICogYGBgdHNcbiAgICogdXNpbmcgX2J5cGFzcyA9IGNvbXBvbmVudC5ieXBhc3NCbG9ja2VkTXV0YXRpb25zKFtzb3VyY2VGaWxlLCB0YXJnZXRGaWxlXSk7XG4gICAqIC8vIC4uLiB0aGUgb3BlcmF0aW9uJ3Mgb3duIHZhdWx0IG11dGF0aW9ucyBvZiB0aG9zZSBwYXRocyBhcmUgYWxsb3dlZCAuLi5cbiAgICogLy8gc2NvcGUgZW5kOiB0aGUgcGF0aHMgYXJlIGVuZm9yY2VkIGFnYWluXG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gcGF0aHNPckZpbGVzIC0gVGhlIHBhdGhzIChvciBmaWxlcy9mb2xkZXJzKSB3aG9zZSBtdXRhdGlvbiBieSB0aGlzIG9wZXJhdGlvbiBpcyBzYW5jdGlvbmVkLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBEaXNwb3NhYmxlfSB0aGF0IGVuZHMgdGhlIGJ5cGFzcyBzY29wZSB3aGVuIGRpc3Bvc2VkLlxuICAgKi9cbiAgcHVibGljIGJ5cGFzc0Jsb2NrZWRNdXRhdGlvbnMocGF0aHNPckZpbGVzOiByZWFkb25seSBQYXRoT3JGaWxlW10pOiBEaXNwb3NhYmxlIHtcbiAgICByZXR1cm4gZ2V0TWFuYWdlcigpLmJ5cGFzcyh0aGlzLmFwcCwgcGF0aHNPckZpbGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgcGF0aCBpcyBsb2NrZWQgZGlyZWN0bHkgb3IgbGllcyB1bmRlciBhIGBzdWJ0cmVlYC1sb2NrZWQgYW5jZXN0b3IgZm9sZGVyLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgcGF0aCBpcyBpdHNlbGYgbG9ja2VkIG9yIGlzIGNvdmVyZWQgYnkgYSBgc3VidHJlZWAgbG9jayBvbiBhbiBhbmNlc3Rvci5cbiAgICovXG4gIHB1YmxpYyBpc0xvY2tlZEJ5QW5jZXN0b3JGb3JQYXRoKHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZ2V0TWFuYWdlcigpLmlzTG9ja2VkQnlBbmNlc3Rvcih0aGlzLmFwcCwgcGF0aE9yRmlsZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggaXMgY3VycmVudGx5IGxvY2tlZCBieSBhbnkgcGx1Z2luLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbm90ZSBoYXMgYXQgbGVhc3Qgb25lIGFjdGl2ZSBsb2NrLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICovXG4gIHB1YmxpYyBpc0xvY2tlZEZvclBhdGgocGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBnZXRNYW5hZ2VyKCkuaXNMb2NrZWQodGhpcy5hcHAsIHBhdGhPckZpbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGEgdmF1bHQgbXV0YXRpb24gb2YgdGhlIHBhdGggaXMgY3VycmVudGx5IGJsb2NrZWQgYnkgYSBgc2hvdWxkQmxvY2tNdXRhdGlvbnNgIGxvY2tcbiAgICogb24gdGhlIHBhdGggaXRzZWxmIG9yIG9uIGEgYHN1YnRyZWVgLWxvY2tlZCBhbmNlc3RvciBmb2xkZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byBjaGVjay5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIGVkaXRpbmcvZGVsZXRpbmcvcmVuYW1pbmcvbW92aW5nL2NyZWF0aW5nIHRoZSBwYXRoIHdvdWxkIHRocm93IGFcbiAgICoge0BsaW5rIFJlc291cmNlTG9ja2VkRXJyb3J9LlxuICAgKi9cbiAgcHVibGljIGlzTXV0YXRpb25CbG9ja2VkQnlBbmNlc3RvckZvclBhdGgocGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBnZXRNYW5hZ2VyKCkuaXNNdXRhdGlvbkJsb2NrZWRCeUFuY2VzdG9yKHRoaXMuYXBwLCBwYXRoT3JGaWxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2NrcyB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCBvbiBiZWhhbGYgb2YgdGhpcyBwbHVnaW4sIG1ha2luZyBpdCByZWFkLW9ubHkgaW4gZXZlcnkgY3VycmVudFxuICAgKiBhbmQgZnV0dXJlIHtAbGluayBNYXJrZG93blZpZXd9IHVudGlsIHRoZSBsb2NrIGlzIHJlbGVhc2VkLiBSZWZlcmVuY2UtY291bnRlZDogYmFsYW5jZSBlYWNoIGNhbGxcbiAgICogd2l0aCBhIGRpc3Bvc2Ugb2YgdGhlIHJldHVybmVkIHtAbGluayBEaXNwb3NhYmxlfSAoaWRlYWxseSB2aWEgYHVzaW5nYCkgb3Ige0BsaW5rIHVubG9ja0ZvclBhdGh9LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gTG9ja2luZyBwYXJhbWV0ZXJzLiBJdHMge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zLnBhdGhPckZpbGV9XG4gICAqIGFuZCB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMub3BlcmF0aW9uTmFtZX0gYXJlIHJlcXVpcmVkICh0aGUgbGF0dGVyIGlzIHNob3duXG4gICAqIGluIHRoZSB1bmxvY2sgY29uZmlybWF0aW9uKS4gUGFzcyBhbiB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMuYWJvcnRDb250cm9sbGVyfVxuICAgKiB0byBtYWtlIHRoZSBsb2NrIGNhbmNlbGFibGUgdmlhIGEgbG9jayBpbmRpY2F0b3IncyBcInVubG9ja1wiIG1lbnUsIHRoZSBcIlVubG9jayBhY3RpdmUgbm90ZVwiIGNvbW1hbmQsXG4gICAqIG9yIHtAbGluayByZXF1ZXN0UmVzb3VyY2VVbmxvY2tGb3JQYXRofS5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgRGlzcG9zYWJsZX0gdGhhdCByZWxlYXNlcyB0aGlzIGxvY2sgd2hlbiBkaXNwb3NlZC4gRGlzcG9zaW5nIG1vcmUgdGhhbiBvbmNlIGlzIGEgbm8tb3AuXG4gICAqL1xuICBwdWJsaWMgbG9ja0ZvclBhdGgocGFyYW1zOiBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcyk6IERpc3Bvc2FibGUge1xuICAgIHJldHVybiBnZXRNYW5hZ2VyKCkubG9jayh7XG4gICAgICBhYm9ydENvbnRyb2xsZXI6IHBhcmFtcy5hYm9ydENvbnRyb2xsZXIsXG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgYmxvY2tzTXV0YXRpb25zOiBwYXJhbXMuc2hvdWxkQmxvY2tNdXRhdGlvbnMsXG4gICAgICBtb2RlOiBwYXJhbXMubW9kZSxcbiAgICAgIG9uVW5sb2NrUmVxdWVzdGVkOiBwYXJhbXMub25VbmxvY2tSZXF1ZXN0ZWQsXG4gICAgICBvcGVyYXRpb25OYW1lOiBwYXJhbXMub3BlcmF0aW9uTmFtZSxcbiAgICAgIHBhdGhPckZpbGU6IHBhcmFtcy5wYXRoT3JGaWxlLFxuICAgICAgcGx1Z2luSWQ6IHRoaXMucGx1Z2luSWQsXG4gICAgICBzaG91bGRSZWxlYXNlT25BYm9ydDogcGFyYW1zLnNob3VsZFJlbGVhc2VPbkFib3J0XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVsZWFzZXMgZXZlcnkgbG9jayBzdGlsbCBoZWxkIGJ5IHRoaXMgcGx1Z2luIHdoZW4gdGhlIGNvbXBvbmVudCAoYW5kIHRodXMgdGhlIHBsdWdpbikgdW5sb2FkcyxcbiAgICogc28gbm8gbm90ZSBpcyBsZWZ0IHN0dWNrIHJlYWQtb25seSBieSBhbiBvcGVyYXRpb24gdGhhdCBuZXZlciBjb21wbGV0ZWQuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb251bmxvYWQoKTogdm9pZCB7XG4gICAgZ2V0TWFuYWdlcigpLnVubG9ja0FsbEZvclBsdWdpbih0aGlzLmFwcCwgdGhpcy5wbHVnaW5JZCk7XG4gICAgc3VwZXIub251bmxvYWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGdWxseSB1bmxvY2tzIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoOiByZXNvbHZlcyB0aGUgbG9jayBjb3ZlcmluZyBpdCAodGhlIHBhdGggaXRzZWxmIHdoZW5cbiAgICogZGlyZWN0bHkgbG9ja2VkLCBvdGhlcndpc2UgYSBgc3VidHJlZWAtbG9ja2VkIGFuY2VzdG9yIGZvbGRlciksIGNhbmNlbHMgdGhlIG9wZXJhdGlvbihzKSB0aGF0IHRvb2tcbiAgICogdGhlIGxvY2sgYnkgYWJvcnRpbmcgdGhlaXIge0BsaW5rIEFib3J0Q29udHJvbGxlcn1zLCBhbmQgcmVsZWFzZXMgdGhlIGxvY2sgc28gdGhlIG5vdGUgYmVjb21lc1xuICAgKiBlZGl0YWJsZSDigJQgcmVnYXJkbGVzcyBvZiB3aGljaCBwbHVnaW4gaG9sZHMgdGhlIGxvY2suIFBvd2VycyB0aGUgXCJVbmxvY2sgYWN0aXZlIG5vdGVcIiBjb21tYW5kLiBBXG4gICAqIG5vLW9wIHdoZW4gbm90aGluZyBjb3ZlcnMgdGhlIHBhdGguXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byB1bmxvY2suXG4gICAqL1xuICBwdWJsaWMgcmVxdWVzdFVubG9ja0ZvclBhdGgocGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IHZvaWQge1xuICAgIGdldE1hbmFnZXIoKS5mb3JjZVVubG9jayh0aGlzLmFwcCwgcGF0aE9yRmlsZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVsZWFzZXMgb25lIGxvY2sgcHJldmlvdXNseSBhY3F1aXJlZCBmb3IgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggdmlhIHtAbGluayBsb2NrRm9yUGF0aH0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byB1bmxvY2suXG4gICAqL1xuICBwdWJsaWMgdW5sb2NrRm9yUGF0aChwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogdm9pZCB7XG4gICAgZ2V0TWFuYWdlcigpLnVubG9jayh0aGlzLmFwcCwgcGF0aE9yRmlsZSwgdGhpcy5wbHVnaW5JZCk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gYnkgdGhlIHZhdWx0LW11dGF0aW9uIGJsb2NrZXIgd2hlbiBhIHBsdWdpbiB0cmllcyB0byBlZGl0LCBkZWxldGUsIHJlbmFtZSwgbW92ZSwgb3IgY3JlYXRlIGFcbiAqIHJlc291cmNlIHdob3NlIHBhdGggaXMgY292ZXJlZCBieSBhIGxvY2sgdGFrZW4gd2l0aFxuICoge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zLnNob3VsZEJsb2NrTXV0YXRpb25zfS5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlc291cmNlTG9ja2VkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBUaGUgdmF1bHQgcGF0aCB3aG9zZSBtdXRhdGlvbiB3YXMgYmxvY2tlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB7QGxpbmsgUmVzb3VyY2VMb2NrZWRFcnJvcn0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gVGhlIHZhdWx0IHBhdGggd2hvc2UgbXV0YXRpb24gd2FzIGJsb2NrZWQuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGF0aDogc3RyaW5nKSB7XG4gICAgc3VwZXIoYFRoZSByZXNvdXJjZSBcIiR7cGF0aH1cIiBpcyBsb2NrZWQgYW5kIGNhbm5vdCBiZSBtdXRhdGVkLmApO1xuICAgIHRoaXMubmFtZSA9ICdSZXNvdXJjZUxvY2tlZEVycm9yJztcbiAgICB0aGlzLnBhdGggPSBwYXRoO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggaXMgY3VycmVudGx5IGxvY2tlZC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbm90ZSBoYXMgYXQgbGVhc3Qgb25lIGFjdGl2ZSBsb2NrLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVzb3VyY2VMb2NrZWRGb3JQYXRoKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogYm9vbGVhbiB7XG4gIHJldHVybiBnZXRNYW5hZ2VyKCkuaXNMb2NrZWQoYXBwLCBwYXRoT3JGaWxlKTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCBpcyBjdXJyZW50bHkgbG9ja2VkIGRpcmVjdGx5IE9SIGlzIGNvdmVyZWQgYnkgYVxuICogYHN1YnRyZWVgLWxvY2tlZCBhbmNlc3RvciBmb2xkZXIuXG4gKlxuICogVW5saWtlIHtAbGluayBpc1Jlc291cmNlTG9ja2VkRm9yUGF0aH0sIHdoaWNoIG9ubHkgcmVwb3J0cyBhbiBleGFjdC1wYXRoIGxvY2ssIHRoaXMgYWxzbyByZXBvcnRzIGFcbiAqIHBhdGggdGhhdCBsaWVzIHVuZGVyIGEgZm9sZGVyIGxvY2tlZCBpbiBgc3VidHJlZWAgbW9kZS4gVXNlIGl0IHRvIGRldGVjdCB0aGF0IGEgcmVuYW1lL21vdmUgaXNcbiAqIGhhcHBlbmluZyBpbnNpZGUgYSBmb3JlaWduIHBsdWdpbidzIGluLWZsaWdodCBsb2NrZWQgdHJhbnNhY3Rpb24gKHdoaWNoIGxvY2tzIHRoZSBhZmZlY3RlZCBmb2xkZXJcbiAqIHN1YnRyZWUpLCBzbyB0aGF0IGEgYnlzdGFuZGVyIChlLmcuIHRoZSByZW5hbWUvZGVsZXRlIGhhbmRsZXIpIGNhbiBzdGF5IG91dCBvZiB0aGUgd2F5IGFuZCBsZXQgdGhlXG4gKiB0cmFuc2FjdGlvbidzIG93bmVyIGtlZXAgaXRzIG93biBsaW5rcyBjb25zaXN0ZW50LlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBwYXRoIGlzIGl0c2VsZiBsb2NrZWQgb3IgbGllcyB1bmRlciBhIGBzdWJ0cmVlYC1sb2NrZWQgYW5jZXN0b3IgZm9sZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZXNvdXJjZUxvY2tlZEZvclBhdGhCeUFuY2VzdG9yKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogYm9vbGVhbiB7XG4gIHJldHVybiBnZXRNYW5hZ2VyKCkuaXNMb2NrZWRCeUFuY2VzdG9yKGFwcCwgcGF0aE9yRmlsZSk7XG59XG5cbi8qKlxuICogTG9ja3MgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGgsIG1ha2luZyBpdCByZWFkLW9ubHkgaW4gZXZlcnkgY3VycmVudCBhbmQgZnV0dXJlXG4gKiB7QGxpbmsgTWFya2Rvd25WaWV3fSB1bnRpbCB0aGUgbG9jayBpcyByZWxlYXNlZCwgYW5kIHNob3dpbmcgYSBsb2NrIGluZGljYXRvciBpbiB0aGUgdGFiIGhlYWRlcixcbiAqIHZpZXcgYWN0aW9uIGJhciwgYW5kICh3aGlsZSBhY3RpdmUpIHRoZSBzdGF0dXMgYmFyLiBUaGUgaW5kaWNhdG9ycycgdG9vbHRpcCBsaXN0cyB0aGUgcGx1Z2luc1xuICogdGhhdCBjdXJyZW50bHkgaG9sZCBhIGxvY2sgb24gdGhlIG5vdGUuXG4gKlxuICogVGhlIGxvY2sgaXMgcmVmZXJlbmNlLWNvdW50ZWQgcGVyIGNhbGxpbmcgcGx1Z2luOiBlYWNoIGNhbGwgbXVzdCBiZSBiYWxhbmNlZCBieSBleGFjdGx5IG9uZVxuICogcmVsZWFzZSAoZWl0aGVyIGRpc3Bvc2luZyB0aGUgcmV0dXJuZWQge0BsaW5rIERpc3Bvc2FibGV9IOKAlCBpZGVhbGx5IHZpYSBhIGB1c2luZ2AgZGVjbGFyYXRpb24g4oCUIG9yXG4gKiBhIG1hdGNoaW5nIHtAbGluayB1bmxvY2tSZXNvdXJjZUZvclBhdGh9IGNhbGwpLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgbG9ja2luZyB0aGUgbm90ZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIERpc3Bvc2FibGV9IHRoYXQgcmVsZWFzZXMgdGhpcyBsb2NrIHdoZW4gZGlzcG9zZWQuIERpc3Bvc2luZyBtb3JlIHRoYW4gb25jZSBpcyBhIG5vLW9wLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9ja1Jlc291cmNlRm9yUGF0aChwYXJhbXM6IExvY2tSZXNvdXJjZUZvclBhdGhQYXJhbXMpOiBEaXNwb3NhYmxlIHtcbiAgcmV0dXJuIGdldE1hbmFnZXIoKS5sb2NrKHtcbiAgICBhcHA6IHBhcmFtcy5hcHAsXG4gICAgb3BlcmF0aW9uTmFtZTogcGFyYW1zLm9wZXJhdGlvbk5hbWUsXG4gICAgcGF0aE9yRmlsZTogcGFyYW1zLnBhdGhPckZpbGUsXG4gICAgcGx1Z2luSWQ6IHBhcmFtcy5wbHVnaW5JZFxuICB9KTtcbn1cblxuLyoqXG4gKiBSZXF1ZXN0cyBhbiB1bmxvY2sgb2YgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggYnkgYWJvcnRpbmcgZXZlcnkge0BsaW5rIEFib3J0Q29udHJvbGxlcn0gdGhhdCB3YXNcbiAqIGFzc29jaWF0ZWQgd2l0aCBhIGxvY2sgb24gaXQgKHZpYSB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50LmxvY2tGb3JQYXRofSdzXG4gKiB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMuYWJvcnRDb250cm9sbGVyfSkuIFRoZSBvcGVyYXRpb25zIGhvbGRpbmcgdGhlIGxvY2tcbiAqIG9ic2VydmUgdGhlIGFib3J0IGFuZCByZWxlYXNlIHRoZWlyIG93biBsb2Nrcy4gQSBuby1vcCB3aGVuIG5vIGFib3J0YWJsZSBsb2NrIGlzIHJlZ2lzdGVyZWQgZm9yIHRoZVxuICogcGF0aC5cbiAqXG4gKiBUaGlzIGxldHMgYSBjb25zdW1pbmcgcGx1Z2luIHdpcmUgaXRzIG93biBcInVubG9jayBhY3RpdmUgbm90ZVwiIGNvbW1hbmQgd2l0aG91dCByZWFjaGluZyBpbnRvIHRoZVxuICogbG9jayBtYW5hZ2VyIGRpcmVjdGx5LlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIHJlcXVlc3QgYW4gdW5sb2NrIGZvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVlc3RSZXNvdXJjZVVubG9ja0ZvclBhdGgoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiB2b2lkIHtcbiAgZ2V0TWFuYWdlcigpLnJlcXVlc3RVbmxvY2soYXBwLCBwYXRoT3JGaWxlKTtcbn1cblxuLyoqXG4gKiBSZWxlYXNlcyBvbmUgbG9jayBwcmV2aW91c2x5IGFjcXVpcmVkIGZvciB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCB2aWEge0BsaW5rIGxvY2tSZXNvdXJjZUZvclBhdGh9LlxuICpcbiAqIFdoZW4gdGhlIGxhc3QgbG9jayBpcyByZWxlYXNlZCB0aGUgbm90ZSBiZWNvbWVzIGZ1bGx5IGVkaXRhYmxlIGFnYWluIGFuZCBpdHMgbG9jayBpbmRpY2F0b3JzIGFyZVxuICogcmVtb3ZlZC4gQ2FsbGluZyB0aGlzIHdoZW4gdGhlIG5vdGUgaXMgbm90IGxvY2tlZCBpcyBhIG5vLW9wLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIHVubG9jay5cbiAqIEBwYXJhbSBwbHVnaW5JZCAtIFRoZSBpZCBvZiB0aGUgcGx1Z2luIHRoYXQgaG9sZHMgdGhlIGxvY2sgKGUuZy4gaXRzIGBtYW5pZmVzdC5pZGApOyBvbmUgb2YgaXRzXG4gKiBsb2NrcyBvbiB0aGUgbm90ZSBpcyByZWxlYXNlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVubG9ja1Jlc291cmNlRm9yUGF0aChhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSwgcGx1Z2luSWQ6IHN0cmluZyk6IHZvaWQge1xuICBnZXRNYW5hZ2VyKCkudW5sb2NrKGFwcCwgcGF0aE9yRmlsZSwgcGx1Z2luSWQpO1xufVxuXG5mdW5jdGlvbiBnZXRNYW5hZ2VyKCk6IFJlc291cmNlTG9ja01hbmFnZXIge1xuICByZXR1cm4gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlPFJlc291cmNlTG9ja01hbmFnZXI+KFJFU09VUkNFX0xPQ0tfU1RBVEVfS0VZLCBuZXcgUmVzb3VyY2VMb2NrTWFuYWdlcigpKS52YWx1ZTtcbn1cblxuLyoqXG4gKiBNYXBzIGEgc3RvcmVkIHBhdGggdGhyb3VnaCBhIHJlbmFtZTogdGhlIHJlbmFtZWQgcGF0aCBpdHNlbGYgYmVjb21lcyB0aGUgbmV3IHBhdGgsIGFuZCBhIGRlc2NlbmRhbnRcbiAqIG9mIGl0IGtlZXBzIGl0cyBzdWZmaXggdW5kZXIgdGhlIG5ldyBwYXRoLiBTcGVsbGVkIG91dCByYXRoZXIgdGhhbiByZXVzaW5nIHtAbGluayBpc0NoaWxkT3JTZWxmfVxuICogYmVjYXVzZSB0aGUgcmViYXNlZCBzdWZmaXggaGFzIHRvIGJlIGNvbXB1dGVkIGZyb20gdGhlIHNhbWUgcHJlZml4IHRoZSB0ZXN0IG1hdGNoZWQsIGFuZCBhIHJlbmFtZVxuICogc291cmNlIGlzIG5ldmVyIHRoZSB2YXVsdCByb290ICh0aGUgb25lIGNhc2UgdGhvc2UgaGVscGVycyB0cmVhdCBzcGVjaWFsbHkpLlxuICpcbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHN0b3JlZCBwYXRoIHRvIG1hcC5cbiAqIEBwYXJhbSBvbGRQYXRoIC0gVGhlIHBhdGggdGhlIHJlc291cmNlIHdhcyByZW5hbWVkIGZyb20uXG4gKiBAcGFyYW0gbmV3UGF0aCAtIFRoZSBwYXRoIHRoZSByZXNvdXJjZSB3YXMgcmVuYW1lZCB0by5cbiAqIEByZXR1cm5zIFRoZSByZWJhc2VkIHBhdGgsIG9yIGBudWxsYCB3aGVuIHRoZSByZW5hbWUgZG9lcyBub3QgYWZmZWN0IGl0LlxuICovXG5mdW5jdGlvbiByZWJhc2VQYXRoKHBhdGg6IHN0cmluZywgb2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiBudWxsIHwgc3RyaW5nIHtcbiAgaWYgKHBhdGggPT09IG9sZFBhdGgpIHtcbiAgICByZXR1cm4gbmV3UGF0aDtcbiAgfVxuICByZXR1cm4gcGF0aC5zdGFydHNXaXRoKGAke29sZFBhdGh9L2ApID8gbmV3UGF0aCArIHBhdGguc2xpY2Uo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
@@ -1,4 +1,4 @@
1
- /// <reference path="./library.d.mts" />
1
+ /// <reference path="./library-references.d.mts" />
2
2
  /**
3
3
  * @file
4
4
  *
@@ -2,13 +2,7 @@
2
2
  THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
3
  if you want to view the source, please visit the github repository of this plugin
4
4
  */
5
-
6
5
  (function () {
7
- function ensureDisposeSymbols(symbolConstructor = Symbol) {
8
- symbolConstructor.asyncDispose ??= symbolConstructor.for("Symbol.asyncDispose");
9
- symbolConstructor.dispose ??= symbolConstructor.for("Symbol.dispose");
10
- }
11
-
12
6
  function ensureBrowserProcess() {
13
7
  const browserProcess = {
14
8
  browser: true,
@@ -33,10 +27,7 @@ function ensureBrowserProcess() {
33
27
  existingProcessRecord["browser"] = true;
34
28
  }
35
29
 
36
- (function initEsm() {
37
- ensureDisposeSymbols();
38
- ensureBrowserProcess();
39
- })();
30
+ ensureBrowserProcess();
40
31
  })();
41
32
 
42
33
  import { toPosixPath } from "@mnaoumov/typescript-lib/path";
@@ -56,4 +47,4 @@ function relativePathToResourceUrl(params) {
56
47
  export {
57
48
  relativePathToResourceUrl
58
49
  };
59
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3Jlc291cmNlLXVybC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHV0aWxpdHkgZnVuY3Rpb25zIGZvciB3b3JraW5nIHdpdGggcmVzb3VyY2UgVVJMcyBpbiBPYnNpZGlhbi5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgdG9Qb3NpeFBhdGggfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvcGF0aCc7XG5pbXBvcnQgeyBnZXREYXRhQWRhcHRlckV4IH0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuaW1wb3J0IHsgUGxhdGZvcm0gfSBmcm9tICdvYnNpZGlhbic7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlbGF0aXZlUGF0aFRvUmVzb3VyY2VVcmx9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbGF0aXZlUGF0aFRvUmVzb3VyY2VVcmxQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9mIHRoZSBub3RlLlxuICAgKi9cbiAgcmVhZG9ubHkgbm90ZVBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIHJlc291cmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVsYXRpdmVQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSByZWxhdGl2ZSBwYXRoIHRvIGEgcmVzb3VyY2UgVVJMLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNvbnZlcnNpb24uXG4gKiBAcmV0dXJucyBUaGUgcmVzb3VyY2UgVVJMLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVsYXRpdmVQYXRoVG9SZXNvdXJjZVVybChwYXJhbXM6IFJlbGF0aXZlUGF0aFRvUmVzb3VyY2VVcmxQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIG5vdGVQYXRoLFxuICAgIHJlbGF0aXZlUGF0aFxuICB9ID0gcGFyYW1zO1xuICBjb25zdCBub3RlRnVsbFBhdGggPSB0b1Bvc2l4UGF0aChnZXREYXRhQWRhcHRlckV4KGFwcCkuZ2V0RnVsbFJlYWxQYXRoKG5vdGVQYXRoKSk7XG4gIGNvbnN0IG5vdGVVcmwgPSBgJHtQbGF0Zm9ybS5yZXNvdXJjZVBhdGhQcmVmaXh9JHtub3RlRnVsbFBhdGh9YDtcbiAgY29uc3QgcmVsYXRpdmVVcmwgPSBuZXcgVVJMKHJlbGF0aXZlUGF0aCwgbm90ZVVybCk7XG4gIHJldHVybiByZWxhdGl2ZVVybC5ocmVmO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRQSxTQUFTLG1CQUFtQjtBQUM1QixTQUFTLHdCQUF3QjtBQUNqQyxTQUFTLGdCQUFnQjtBQTRCbEIsU0FBUywwQkFBMEIsUUFBaUQ7QUFDekYsUUFBTTtBQUFBLElBQ0o7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0YsSUFBSTtBQUNKLFFBQU0sZUFBZSxZQUFZLGlCQUFpQixHQUFHLEVBQUUsZ0JBQWdCLFFBQVEsQ0FBQztBQUNoRixRQUFNLFVBQVUsR0FBRyxTQUFTLGtCQUFrQixHQUFHLFlBQVk7QUFDN0QsUUFBTSxjQUFjLElBQUksSUFBSSxjQUFjLE9BQU87QUFDakQsU0FBTyxZQUFZO0FBQ3JCOyIsCiAgIm5hbWVzIjogW10KfQo=
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yZXNvdXJjZS11cmwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHV0aWxpdHkgZnVuY3Rpb25zIGZvciB3b3JraW5nIHdpdGggcmVzb3VyY2UgVVJMcyBpbiBPYnNpZGlhbi5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgdG9Qb3NpeFBhdGggfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvcGF0aCc7XG5pbXBvcnQgeyBnZXREYXRhQWRhcHRlckV4IH0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuaW1wb3J0IHsgUGxhdGZvcm0gfSBmcm9tICdvYnNpZGlhbic7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlbGF0aXZlUGF0aFRvUmVzb3VyY2VVcmx9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbGF0aXZlUGF0aFRvUmVzb3VyY2VVcmxQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9mIHRoZSBub3RlLlxuICAgKi9cbiAgcmVhZG9ubHkgbm90ZVBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIHJlc291cmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVsYXRpdmVQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSByZWxhdGl2ZSBwYXRoIHRvIGEgcmVzb3VyY2UgVVJMLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNvbnZlcnNpb24uXG4gKiBAcmV0dXJucyBUaGUgcmVzb3VyY2UgVVJMLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVsYXRpdmVQYXRoVG9SZXNvdXJjZVVybChwYXJhbXM6IFJlbGF0aXZlUGF0aFRvUmVzb3VyY2VVcmxQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIG5vdGVQYXRoLFxuICAgIHJlbGF0aXZlUGF0aFxuICB9ID0gcGFyYW1zO1xuICBjb25zdCBub3RlRnVsbFBhdGggPSB0b1Bvc2l4UGF0aChnZXREYXRhQWRhcHRlckV4KGFwcCkuZ2V0RnVsbFJlYWxQYXRoKG5vdGVQYXRoKSk7XG4gIGNvbnN0IG5vdGVVcmwgPSBgJHtQbGF0Zm9ybS5yZXNvdXJjZVBhdGhQcmVmaXh9JHtub3RlRnVsbFBhdGh9YDtcbiAgY29uc3QgcmVsYXRpdmVVcmwgPSBuZXcgVVJMKHJlbGF0aXZlUGF0aCwgbm90ZVVybCk7XG4gIHJldHVybiByZWxhdGl2ZVVybC5ocmVmO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVFBLFNBQVMsbUJBQW1CO0FBQzVCLFNBQVMsd0JBQXdCO0FBQ2pDLFNBQVMsZ0JBQWdCO0FBNEJsQixTQUFTLDBCQUEwQixRQUFpRDtBQUN6RixRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRixJQUFJO0FBQ0osUUFBTSxlQUFlLFlBQVksaUJBQWlCLEdBQUcsRUFBRSxnQkFBZ0IsUUFBUSxDQUFDO0FBQ2hGLFFBQU0sVUFBVSxHQUFHLFNBQVMsa0JBQWtCLEdBQUcsWUFBWTtBQUM3RCxRQUFNLGNBQWMsSUFBSSxJQUFJLGNBQWMsT0FBTztBQUNqRCxTQUFPLFlBQVk7QUFDckI7IiwibmFtZXMiOltdfQ==
@@ -1,4 +1,5 @@
1
- /// <reference path="./library.d.mts" />
1
+ /// <reference path="./library-references.d.mts" />
2
+ /// <reference lib="dom" />
2
3
  /**
3
4
  * @file
4
5
  *
@@ -2,13 +2,7 @@
2
2
  THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
3
  if you want to view the source, please visit the github repository of this plugin
4
4
  */
5
-
6
5
  (function () {
7
- function ensureDisposeSymbols(symbolConstructor = Symbol) {
8
- symbolConstructor.asyncDispose ??= symbolConstructor.for("Symbol.asyncDispose");
9
- symbolConstructor.dispose ??= symbolConstructor.for("Symbol.dispose");
10
- }
11
-
12
6
  function ensureBrowserProcess() {
13
7
  const browserProcess = {
14
8
  browser: true,
@@ -33,10 +27,7 @@ function ensureBrowserProcess() {
33
27
  existingProcessRecord["browser"] = true;
34
28
  }
35
29
 
36
- (function initEsm() {
37
- ensureDisposeSymbols();
38
- ensureBrowserProcess();
39
- })();
30
+ ensureBrowserProcess();
40
31
  })();
41
32
 
42
33
  import { Plugin } from "obsidian";
@@ -63,4 +54,4 @@ class PluginRibbonIconRegistrar {
63
54
  export {
64
55
  PluginRibbonIconRegistrar
65
56
  };
66
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3JpYmJvbi1pY29uLXJlZ2lzdHJhci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFJpYmJvbiBpY29uIHJlZ2lzdHJhcnMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBJY29uTmFtZSB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG4vKipcbiAqIFJpYmJvbiBpY29uIHJlZ2lzdHJhci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSaWJib25JY29uUmVnaXN0cmFyIHtcbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIHJpYmJvbiBpY29uLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSByaWJib24gaWNvbiByZWdpc3RyYXRpb24uXG4gICAqIEByZXR1cm5zIFRoZSBIVE1MIGVsZW1lbnQgcmVwcmVzZW50aW5nIHRoZSByZWdpc3RlcmVkIHJpYmJvbiBpY29uLlxuICAgKi9cbiAgYWRkUmliYm9uSWNvbjogKHBhcmFtczogUmliYm9uSWNvblJlZ2lzdHJhckFkZFJpYmJvbkljb25QYXJhbXMpID0+IEhUTUxFbGVtZW50O1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHJlZ2lzdGVyaW5nIGEgcmliYm9uIGljb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmliYm9uSWNvblJlZ2lzdHJhckFkZFJpYmJvbkljb25QYXJhbXMge1xuICAvKipcbiAgICogQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIHRoZSByaWJib24gaWNvbiB0byByZWdpc3Rlci5cbiAgICpcbiAgICogQHBhcmFtICRldmVudCAtIFRoZSBtb3VzZSBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGUgY2FsbGJhY2suXG4gICAqL1xuICByZWFkb25seSBjYWxsYmFjazogKCRldmVudDogTW91c2VFdmVudCkgPT4gdm9pZDtcblxuICAvKipcbiAgICogVGhlIGljb24gbmFtZSBmb3IgdGhlIHJpYmJvbiBpY29uIHRvIHJlZ2lzdGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgaWNvbjogSWNvbk5hbWU7XG5cbiAgLyoqXG4gICAqIFRoZSB0aXRsZSBmb3IgdGhlIHJpYmJvbiBpY29uIHRvIHJlZ2lzdGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgdGl0bGU6IHN0cmluZztcbn1cblxudHlwZSBQbHVnaW5SaWJib25JY29uUmVnaXN0cmFyQWRkUmliYm9uSWNvblBhcmFtcyA9IFJpYmJvbkljb25SZWdpc3RyYXJBZGRSaWJib25JY29uUGFyYW1zO1xuXG4vKipcbiAqIFJpYmJvbiBpY29uIHJlZ2lzdHJhciBpbiBhbiBPYnNpZGlhbiBwbHVnaW4uXG4gKi9cbmV4cG9ydCBjbGFzcyBQbHVnaW5SaWJib25JY29uUmVnaXN0cmFyIGltcGxlbWVudHMgUmliYm9uSWNvblJlZ2lzdHJhciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSB7QGxpbmsgUGx1Z2luUmliYm9uSWNvblJlZ2lzdHJhcn0gY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSBwbHVnaW4gLSBUaGUgT2JzaWRpYW4gcGx1Z2luIGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSBwbHVnaW46IFBsdWdpbikge31cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgcmliYm9uIGljb24uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIHJpYmJvbiBpY29uIHJlZ2lzdHJhdGlvbi5cbiAgICogQHJldHVybnMgVGhlIEhUTUwgZWxlbWVudCByZXByZXNlbnRpbmcgdGhlIHJlZ2lzdGVyZWQgcmliYm9uIGljb24uXG4gICAqL1xuICBwdWJsaWMgYWRkUmliYm9uSWNvbihwYXJhbXM6IFBsdWdpblJpYmJvbkljb25SZWdpc3RyYXJBZGRSaWJib25JY29uUGFyYW1zKTogSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLnBsdWdpbi5hZGRSaWJib25JY29uKHBhcmFtcy5pY29uLCBwYXJhbXMudGl0bGUsIHBhcmFtcy5jYWxsYmFjayk7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUUEsU0FBUyxjQUFjO0FBMENoQixNQUFNLDBCQUF5RDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU03RCxZQUErQixRQUFnQjtBQUFoQjtBQUFBLEVBQWlCO0FBQUEsRUFBakI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVEvQixjQUFjLFFBQW1FO0FBQ3RGLFdBQU8sS0FBSyxPQUFPLGNBQWMsT0FBTyxNQUFNLE9BQU8sT0FBTyxPQUFPLFFBQVE7QUFBQSxFQUM3RTtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yaWJib24taWNvbi1yZWdpc3RyYXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFJpYmJvbiBpY29uIHJlZ2lzdHJhcnMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBJY29uTmFtZSB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG4vKipcbiAqIFJpYmJvbiBpY29uIHJlZ2lzdHJhci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSaWJib25JY29uUmVnaXN0cmFyIHtcbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIHJpYmJvbiBpY29uLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSByaWJib24gaWNvbiByZWdpc3RyYXRpb24uXG4gICAqIEByZXR1cm5zIFRoZSBIVE1MIGVsZW1lbnQgcmVwcmVzZW50aW5nIHRoZSByZWdpc3RlcmVkIHJpYmJvbiBpY29uLlxuICAgKi9cbiAgYWRkUmliYm9uSWNvbjogKHBhcmFtczogUmliYm9uSWNvblJlZ2lzdHJhckFkZFJpYmJvbkljb25QYXJhbXMpID0+IEhUTUxFbGVtZW50O1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHJlZ2lzdGVyaW5nIGEgcmliYm9uIGljb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmliYm9uSWNvblJlZ2lzdHJhckFkZFJpYmJvbkljb25QYXJhbXMge1xuICAvKipcbiAgICogQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIHRoZSByaWJib24gaWNvbiB0byByZWdpc3Rlci5cbiAgICpcbiAgICogQHBhcmFtICRldmVudCAtIFRoZSBtb3VzZSBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGUgY2FsbGJhY2suXG4gICAqL1xuICByZWFkb25seSBjYWxsYmFjazogKCRldmVudDogTW91c2VFdmVudCkgPT4gdm9pZDtcblxuICAvKipcbiAgICogVGhlIGljb24gbmFtZSBmb3IgdGhlIHJpYmJvbiBpY29uIHRvIHJlZ2lzdGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgaWNvbjogSWNvbk5hbWU7XG5cbiAgLyoqXG4gICAqIFRoZSB0aXRsZSBmb3IgdGhlIHJpYmJvbiBpY29uIHRvIHJlZ2lzdGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgdGl0bGU6IHN0cmluZztcbn1cblxudHlwZSBQbHVnaW5SaWJib25JY29uUmVnaXN0cmFyQWRkUmliYm9uSWNvblBhcmFtcyA9IFJpYmJvbkljb25SZWdpc3RyYXJBZGRSaWJib25JY29uUGFyYW1zO1xuXG4vKipcbiAqIFJpYmJvbiBpY29uIHJlZ2lzdHJhciBpbiBhbiBPYnNpZGlhbiBwbHVnaW4uXG4gKi9cbmV4cG9ydCBjbGFzcyBQbHVnaW5SaWJib25JY29uUmVnaXN0cmFyIGltcGxlbWVudHMgUmliYm9uSWNvblJlZ2lzdHJhciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSB7QGxpbmsgUGx1Z2luUmliYm9uSWNvblJlZ2lzdHJhcn0gY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSBwbHVnaW4gLSBUaGUgT2JzaWRpYW4gcGx1Z2luIGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSBwbHVnaW46IFBsdWdpbikge31cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgcmliYm9uIGljb24uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIHJpYmJvbiBpY29uIHJlZ2lzdHJhdGlvbi5cbiAgICogQHJldHVybnMgVGhlIEhUTUwgZWxlbWVudCByZXByZXNlbnRpbmcgdGhlIHJlZ2lzdGVyZWQgcmliYm9uIGljb24uXG4gICAqL1xuICBwdWJsaWMgYWRkUmliYm9uSWNvbihwYXJhbXM6IFBsdWdpblJpYmJvbkljb25SZWdpc3RyYXJBZGRSaWJib25JY29uUGFyYW1zKTogSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLnBsdWdpbi5hZGRSaWJib25JY29uKHBhcmFtcy5pY29uLCBwYXJhbXMudGl0bGUsIHBhcmFtcy5jYWxsYmFjayk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRQSxTQUFTLGNBQWM7QUEwQ2hCLE1BQU0sMEJBQXlEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTTdELFlBQStCLFFBQWdCO0FBQWhCO0FBQUEsRUFBaUI7QUFBQSxFQUFqQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUS9CLGNBQWMsUUFBbUU7QUFDdEYsV0FBTyxLQUFLLE9BQU8sY0FBYyxPQUFPLE1BQU0sT0FBTyxPQUFPLE9BQU8sUUFBUTtBQUFBLEVBQzdFO0FBQ0Y7IiwibmFtZXMiOltdfQ==
@@ -1,4 +1,5 @@
1
- /// <reference path="../library.d.mts" />
1
+ /// <reference path="../library-references.d.mts" />
2
+ /// <reference lib="dom" />
2
3
  /**
3
4
  * @file
4
5
  *