@mnaoumov/obsidian-lib 1.0.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (412) hide show
  1. package/README.md +9 -1
  2. package/dist/lib/cjs/__merged.cjs +54 -64
  3. package/dist/lib/cjs/__merged.d.cts +5 -3
  4. package/dist/lib/cjs/active-file-provider.cjs +40 -64
  5. package/dist/lib/cjs/app.cjs +40 -64
  6. package/dist/lib/cjs/async-with-notice.cjs +40 -64
  7. package/dist/lib/cjs/attachment-path.cjs +101 -72
  8. package/dist/lib/cjs/attachment-path.d.cts +21 -43
  9. package/dist/lib/cjs/attachment-unit-folder.cjs +40 -64
  10. package/dist/lib/cjs/attachment-unit-folder.d.cts +8 -9
  11. package/dist/lib/cjs/backlink-index.cjs +41 -65
  12. package/dist/lib/cjs/backlink.cjs +40 -64
  13. package/dist/lib/cjs/bases-view-registrar.cjs +40 -64
  14. package/dist/lib/cjs/callout.cjs +40 -64
  15. package/dist/lib/cjs/canvas.cjs +40 -64
  16. package/dist/lib/cjs/case-insensitive-file-index.cjs +40 -64
  17. package/dist/lib/cjs/code-block-markdown-information.cjs +40 -64
  18. package/dist/lib/cjs/code-block-reg-exp.cjs +40 -64
  19. package/dist/lib/cjs/codemirror/index.cjs +40 -64
  20. package/dist/lib/cjs/codemirror/state-field-spec.cjs +40 -64
  21. package/dist/lib/cjs/command-handlers/abstract-file-command-handler.cjs +40 -64
  22. package/dist/lib/cjs/command-handlers/command-handler-component.cjs +40 -64
  23. package/dist/lib/cjs/command-handlers/command-handler.cjs +40 -64
  24. package/dist/lib/cjs/command-handlers/editor-command-handler.cjs +40 -64
  25. package/dist/lib/cjs/command-handlers/file-command-handler.cjs +40 -64
  26. package/dist/lib/cjs/command-handlers/folder-command-handler.cjs +40 -64
  27. package/dist/lib/cjs/command-handlers/global-command-handler.cjs +40 -64
  28. package/dist/lib/cjs/command-handlers/index.cjs +40 -64
  29. package/dist/lib/cjs/command-handlers/open-demo-vault-command-handler.cjs +40 -64
  30. package/dist/lib/cjs/command-handlers/open-settings-command-handler.cjs +40 -64
  31. package/dist/lib/cjs/command-handlers/unlock-active-note-command-handler.cjs +40 -64
  32. package/dist/lib/cjs/command-registrar.cjs +40 -64
  33. package/dist/lib/cjs/community-plugins.cjs +40 -64
  34. package/dist/lib/cjs/components/abort-signal-component.cjs +40 -64
  35. package/dist/lib/cjs/components/all-windows-event-component.cjs +40 -64
  36. package/dist/lib/cjs/components/async-error-handler-component.cjs +40 -64
  37. package/dist/lib/cjs/components/async-events-component.cjs +40 -64
  38. package/dist/lib/cjs/components/case-insensitive-file-index-component.cjs +40 -64
  39. package/dist/lib/cjs/components/component-ex.cjs +41 -65
  40. package/dist/lib/cjs/components/console-debug-component.cjs +40 -64
  41. package/dist/lib/cjs/components/core-plugin-toggle-component.cjs +40 -64
  42. package/dist/lib/cjs/components/disposable-component.cjs +40 -64
  43. package/dist/lib/cjs/components/embed-extensions-component.cjs +40 -64
  44. package/dist/lib/cjs/components/generate-markdown-link-default-params-component.cjs +40 -64
  45. package/dist/lib/cjs/components/index.cjs +40 -64
  46. package/dist/lib/cjs/components/layout-ready-component.cjs +40 -64
  47. package/dist/lib/cjs/components/menu-event-registrar-component.cjs +40 -64
  48. package/dist/lib/cjs/components/monkey-around-component.cjs +40 -64
  49. package/dist/lib/cjs/components/notebook-navigator-menu-event-registrar-component.cjs +40 -64
  50. package/dist/lib/cjs/components/plugin-context-component.cjs +40 -64
  51. package/dist/lib/cjs/components/plugin-gate-component.cjs +41 -65
  52. package/dist/lib/cjs/components/plugin-notice-component.cjs +46 -65
  53. package/dist/lib/cjs/components/plugin-notice-component.d.cts +3 -0
  54. package/dist/lib/cjs/components/plugin-settings-component.cjs +41 -65
  55. package/dist/lib/cjs/components/plugin-settings-tab-component.cjs +40 -64
  56. package/dist/lib/cjs/components/plugin-suggestion-component.cjs +40 -64
  57. package/dist/lib/cjs/components/pointer-position-component.cjs +40 -64
  58. package/dist/lib/cjs/components/registry-component.cjs +40 -64
  59. package/dist/lib/cjs/components/release-notes-component.cjs +42 -65
  60. package/dist/lib/cjs/components/rename-delete-handler-component.cjs +40 -64
  61. package/dist/lib/cjs/components/rmdir-guard-component.cjs +40 -64
  62. package/dist/lib/cjs/components/settings-migration-component.cjs +44 -68
  63. package/dist/lib/cjs/components/settings-migration-component.d.cts +6 -4
  64. package/dist/lib/cjs/components/syntax-highlighting-component.cjs +40 -64
  65. package/dist/lib/cjs/components/templates-language-component.cjs +40 -64
  66. package/dist/lib/cjs/constructors/get-dom-events-handlers-constructor.cjs +40 -64
  67. package/dist/lib/cjs/constructors/index.cjs +40 -64
  68. package/dist/lib/cjs/css-class.cjs +40 -64
  69. package/dist/lib/cjs/data-handler.cjs +40 -64
  70. package/dist/lib/cjs/dataview-link.cjs +40 -64
  71. package/dist/lib/cjs/dataview.cjs +40 -64
  72. package/dist/lib/cjs/debug.cjs +40 -64
  73. package/dist/lib/cjs/demo-vault-helper-settings.cjs +40 -64
  74. package/dist/lib/cjs/demo-vault-helper.cjs +42 -65
  75. package/dist/lib/cjs/demo-vault-naming.cjs +40 -64
  76. package/dist/lib/cjs/desktop-demo-vault-opener.cjs +48 -71
  77. package/dist/lib/cjs/desktop-trusted-input.cjs +40 -64
  78. package/dist/lib/cjs/editor-extension-registrar.cjs +40 -64
  79. package/dist/lib/cjs/editor-suggest-registrar.cjs +40 -64
  80. package/dist/lib/cjs/editor.cjs +40 -64
  81. package/dist/lib/cjs/events.cjs +40 -64
  82. package/dist/lib/cjs/extensions-registrar.cjs +40 -64
  83. package/dist/lib/cjs/file-change.cjs +40 -64
  84. package/dist/lib/cjs/file-explorer.cjs +40 -64
  85. package/dist/lib/cjs/file-manager.cjs +40 -64
  86. package/dist/lib/cjs/file-system.cjs +45 -64
  87. package/dist/lib/cjs/file-system.d.cts +7 -0
  88. package/dist/lib/cjs/folder-note.cjs +40 -64
  89. package/dist/lib/cjs/frontmatter-formatting.cjs +41 -65
  90. package/dist/lib/cjs/frontmatter-link-cache-with-offsets.cjs +40 -64
  91. package/dist/lib/cjs/frontmatter.cjs +40 -64
  92. package/dist/lib/cjs/generated-during-build.cjs +42 -66
  93. package/dist/lib/cjs/generated-during-build.d.cts +8 -2
  94. package/dist/lib/cjs/hover-link-source-registrar.cjs +40 -64
  95. package/dist/lib/cjs/html-element.cjs +40 -64
  96. package/dist/lib/cjs/i18n/custom-type-options.cjs +40 -64
  97. package/dist/lib/cjs/i18n/default-translations.cjs +40 -64
  98. package/dist/lib/cjs/i18n/i18n.cjs +40 -64
  99. package/dist/lib/cjs/i18n/index.cjs +40 -64
  100. package/dist/lib/cjs/i18n/locales/en.cjs +40 -64
  101. package/dist/lib/cjs/i18n/locales/index.cjs +40 -64
  102. package/dist/lib/cjs/i18n/locales/translations-map.cjs +40 -64
  103. package/dist/lib/cjs/index.cjs +40 -64
  104. package/dist/lib/cjs/is-in-obsidian.cjs +40 -64
  105. package/dist/lib/cjs/library-styles.cjs +40 -64
  106. package/dist/lib/cjs/library.cjs +40 -64
  107. package/dist/lib/cjs/link-name.cjs +40 -64
  108. package/dist/lib/cjs/link-update-progress.cjs +40 -64
  109. package/dist/lib/cjs/link.cjs +40 -64
  110. package/dist/lib/cjs/logger.cjs +40 -64
  111. package/dist/lib/cjs/loop.cjs +40 -64
  112. package/dist/lib/cjs/markdown-code-block-processor-registrar.cjs +40 -64
  113. package/dist/lib/cjs/markdown-code-block-processor.cjs +40 -64
  114. package/dist/lib/cjs/markdown-post-processor-registrar.cjs +40 -64
  115. package/dist/lib/cjs/markdown-view.cjs +40 -64
  116. package/dist/lib/cjs/markdown.cjs +40 -64
  117. package/dist/lib/cjs/menu-event-registrar.cjs +40 -64
  118. package/dist/lib/cjs/metadata-cache.cjs +64 -70
  119. package/dist/lib/cjs/metadata-cache.d.cts +8 -19
  120. package/dist/lib/cjs/mobile-trusted-input.cjs +40 -64
  121. package/dist/lib/cjs/modals/alert.cjs +40 -64
  122. package/dist/lib/cjs/modals/confirm.cjs +40 -64
  123. package/dist/lib/cjs/modals/index.cjs +40 -64
  124. package/dist/lib/cjs/modals/minimizable-modal.cjs +40 -64
  125. package/dist/lib/cjs/modals/modal-command-builder.cjs +40 -64
  126. package/dist/lib/cjs/modals/modal.cjs +40 -64
  127. package/dist/lib/cjs/modals/prompt.cjs +40 -64
  128. package/dist/lib/cjs/modals/select-item.cjs +40 -64
  129. package/dist/lib/cjs/modals/select-option.cjs +40 -64
  130. package/dist/lib/cjs/modals/suggest-modal-command-builder.cjs +40 -64
  131. package/dist/lib/cjs/note-priority.cjs +41 -65
  132. package/dist/lib/cjs/notebook-navigator.cjs +40 -64
  133. package/dist/lib/cjs/obsidian-dev-utils-state.cjs +40 -64
  134. package/dist/lib/cjs/obsidian-protocol-handler-registrar.cjs +40 -64
  135. package/dist/lib/cjs/obsidian-settings.cjs +40 -64
  136. package/dist/lib/cjs/parse-link.cjs +40 -64
  137. package/dist/lib/cjs/path-settings.cjs +40 -64
  138. package/dist/lib/cjs/pdf.cjs +40 -64
  139. package/dist/lib/cjs/plugin/index.cjs +43 -64
  140. package/dist/lib/cjs/plugin/index.d.cts +1 -0
  141. package/dist/lib/cjs/plugin/plugin-api-schema.cjs +171 -0
  142. package/dist/lib/cjs/plugin/plugin-api-schema.d.cts +59 -0
  143. package/dist/lib/cjs/plugin/plugin-api.cjs +46 -64
  144. package/dist/lib/cjs/plugin/plugin-api.d.cts +83 -10
  145. package/dist/lib/cjs/plugin/plugin-context.cjs +40 -64
  146. package/dist/lib/cjs/plugin/plugin-event-source.cjs +40 -64
  147. package/dist/lib/cjs/plugin/plugin-install-state.cjs +40 -64
  148. package/dist/lib/cjs/plugin/plugin-lifecycle-events.cjs +40 -64
  149. package/dist/lib/cjs/plugin/plugin-settings-tab.cjs +41 -65
  150. package/dist/lib/cjs/plugin/plugin.cjs +41 -65
  151. package/dist/lib/cjs/plugin/settings-migration-api.cjs +69 -64
  152. package/dist/lib/cjs/plugin/settings-migration-api.d.cts +16 -3
  153. package/dist/lib/cjs/plugin-cli-handler-registrar.cjs +40 -64
  154. package/dist/lib/cjs/popovers/field-popover.cjs +40 -64
  155. package/dist/lib/cjs/popovers/index.cjs +40 -64
  156. package/dist/lib/cjs/popovers/popover-anchor.cjs +40 -64
  157. package/dist/lib/cjs/popovers/popover.cjs +40 -64
  158. package/dist/lib/cjs/property-entry.cjs +40 -64
  159. package/dist/lib/cjs/queue.cjs +40 -64
  160. package/dist/lib/cjs/react/app-context.cjs +40 -64
  161. package/dist/lib/cjs/react/index.cjs +40 -64
  162. package/dist/lib/cjs/reference.cjs +40 -64
  163. package/dist/lib/cjs/resource-lock.cjs +40 -64
  164. package/dist/lib/cjs/resource-url.cjs +40 -64
  165. package/dist/lib/cjs/ribbon-icon-registrar.cjs +40 -64
  166. package/dist/lib/cjs/setting-components/checkbox-component.cjs +40 -64
  167. package/dist/lib/cjs/setting-components/code-highlighter-component.cjs +40 -64
  168. package/dist/lib/cjs/setting-components/date-component.cjs +40 -64
  169. package/dist/lib/cjs/setting-components/date-time-component.cjs +40 -64
  170. package/dist/lib/cjs/setting-components/email-component.cjs +40 -64
  171. package/dist/lib/cjs/setting-components/file-component.cjs +40 -64
  172. package/dist/lib/cjs/setting-components/index.cjs +40 -64
  173. package/dist/lib/cjs/setting-components/month-component.cjs +40 -64
  174. package/dist/lib/cjs/setting-components/multiple-dropdown-component.cjs +41 -65
  175. package/dist/lib/cjs/setting-components/multiple-email-component.cjs +40 -64
  176. package/dist/lib/cjs/setting-components/multiple-file-component.cjs +40 -64
  177. package/dist/lib/cjs/setting-components/multiple-text-component.cjs +40 -64
  178. package/dist/lib/cjs/setting-components/number-component.cjs +40 -64
  179. package/dist/lib/cjs/setting-components/password-component.cjs +40 -64
  180. package/dist/lib/cjs/setting-components/setting-component-wrapper.cjs +40 -64
  181. package/dist/lib/cjs/setting-components/telephone-component.cjs +40 -64
  182. package/dist/lib/cjs/setting-components/text-based-component.cjs +40 -64
  183. package/dist/lib/cjs/setting-components/time-component.cjs +40 -64
  184. package/dist/lib/cjs/setting-components/tri-state-checkbox-component.cjs +40 -64
  185. package/dist/lib/cjs/setting-components/typed-dropdown-component.cjs +40 -64
  186. package/dist/lib/cjs/setting-components/typed-multiple-dropdown-component.cjs +40 -64
  187. package/dist/lib/cjs/setting-components/typed-range-text-component.cjs +40 -64
  188. package/dist/lib/cjs/setting-components/typed-text-component.cjs +41 -65
  189. package/dist/lib/cjs/setting-components/url-component.cjs +40 -64
  190. package/dist/lib/cjs/setting-components/validator-component.cjs +41 -65
  191. package/dist/lib/cjs/setting-components/value-component-with-change-tracking.cjs +40 -64
  192. package/dist/lib/cjs/setting-components/week-component.cjs +40 -64
  193. package/dist/lib/cjs/setting-ex.cjs +40 -64
  194. package/dist/lib/cjs/setting-group-ex.cjs +40 -64
  195. package/dist/lib/cjs/status-bar-item-registrar.cjs +40 -64
  196. package/dist/lib/cjs/templater.cjs +40 -64
  197. package/dist/lib/cjs/transformers/duration-transformer.cjs +40 -64
  198. package/dist/lib/cjs/transformers/index.cjs +40 -64
  199. package/dist/lib/cjs/trusted-input.cjs +40 -64
  200. package/dist/lib/cjs/validation.cjs +40 -64
  201. package/dist/lib/cjs/vault-delete.cjs +40 -64
  202. package/dist/lib/cjs/vault-transaction.cjs +40 -64
  203. package/dist/lib/cjs/vault.cjs +41 -65
  204. package/dist/lib/cjs/view-registrar.cjs +40 -64
  205. package/dist/lib/cjs/workspace.cjs +40 -64
  206. package/dist/lib/esm/__merged.d.mts +5 -3
  207. package/dist/lib/esm/__merged.mjs +20 -14
  208. package/dist/lib/esm/active-file-provider.mjs +6 -14
  209. package/dist/lib/esm/app.mjs +6 -14
  210. package/dist/lib/esm/async-with-notice.mjs +6 -14
  211. package/dist/lib/esm/attachment-path.d.mts +21 -43
  212. package/dist/lib/esm/attachment-path.mjs +70 -22
  213. package/dist/lib/esm/attachment-unit-folder.d.mts +8 -9
  214. package/dist/lib/esm/attachment-unit-folder.mjs +6 -14
  215. package/dist/lib/esm/backlink-index.mjs +6 -14
  216. package/dist/lib/esm/backlink.mjs +6 -14
  217. package/dist/lib/esm/bases-view-registrar.mjs +6 -14
  218. package/dist/lib/esm/callout.mjs +6 -14
  219. package/dist/lib/esm/canvas.mjs +6 -14
  220. package/dist/lib/esm/case-insensitive-file-index.mjs +6 -14
  221. package/dist/lib/esm/code-block-markdown-information.mjs +5 -13
  222. package/dist/lib/esm/code-block-reg-exp.mjs +6 -14
  223. package/dist/lib/esm/codemirror/index.mjs +6 -14
  224. package/dist/lib/esm/codemirror/state-field-spec.mjs +5 -13
  225. package/dist/lib/esm/command-handlers/abstract-file-command-handler.mjs +6 -14
  226. package/dist/lib/esm/command-handlers/command-handler-component.mjs +6 -14
  227. package/dist/lib/esm/command-handlers/command-handler.mjs +6 -14
  228. package/dist/lib/esm/command-handlers/editor-command-handler.mjs +6 -14
  229. package/dist/lib/esm/command-handlers/file-command-handler.mjs +6 -14
  230. package/dist/lib/esm/command-handlers/folder-command-handler.mjs +6 -14
  231. package/dist/lib/esm/command-handlers/global-command-handler.mjs +6 -14
  232. package/dist/lib/esm/command-handlers/index.mjs +6 -14
  233. package/dist/lib/esm/command-handlers/open-demo-vault-command-handler.mjs +6 -14
  234. package/dist/lib/esm/command-handlers/open-settings-command-handler.mjs +6 -14
  235. package/dist/lib/esm/command-handlers/unlock-active-note-command-handler.mjs +6 -14
  236. package/dist/lib/esm/command-registrar.mjs +6 -14
  237. package/dist/lib/esm/community-plugins.mjs +6 -14
  238. package/dist/lib/esm/components/abort-signal-component.mjs +6 -14
  239. package/dist/lib/esm/components/all-windows-event-component.mjs +6 -14
  240. package/dist/lib/esm/components/async-error-handler-component.mjs +6 -14
  241. package/dist/lib/esm/components/async-events-component.mjs +6 -14
  242. package/dist/lib/esm/components/case-insensitive-file-index-component.mjs +6 -14
  243. package/dist/lib/esm/components/component-ex.mjs +6 -14
  244. package/dist/lib/esm/components/console-debug-component.mjs +6 -14
  245. package/dist/lib/esm/components/core-plugin-toggle-component.mjs +6 -14
  246. package/dist/lib/esm/components/disposable-component.mjs +6 -14
  247. package/dist/lib/esm/components/embed-extensions-component.mjs +6 -14
  248. package/dist/lib/esm/components/generate-markdown-link-default-params-component.mjs +6 -14
  249. package/dist/lib/esm/components/index.mjs +6 -14
  250. package/dist/lib/esm/components/layout-ready-component.mjs +6 -14
  251. package/dist/lib/esm/components/menu-event-registrar-component.mjs +6 -14
  252. package/dist/lib/esm/components/monkey-around-component.mjs +6 -14
  253. package/dist/lib/esm/components/notebook-navigator-menu-event-registrar-component.mjs +6 -14
  254. package/dist/lib/esm/components/plugin-context-component.mjs +6 -14
  255. package/dist/lib/esm/components/plugin-gate-component.mjs +6 -14
  256. package/dist/lib/esm/components/plugin-notice-component.d.mts +3 -0
  257. package/dist/lib/esm/components/plugin-notice-component.mjs +12 -15
  258. package/dist/lib/esm/components/plugin-settings-component.mjs +6 -14
  259. package/dist/lib/esm/components/plugin-settings-tab-component.mjs +6 -14
  260. package/dist/lib/esm/components/plugin-suggestion-component.mjs +6 -14
  261. package/dist/lib/esm/components/pointer-position-component.mjs +6 -14
  262. package/dist/lib/esm/components/registry-component.mjs +6 -14
  263. package/dist/lib/esm/components/release-notes-component.mjs +11 -15
  264. package/dist/lib/esm/components/rename-delete-handler-component.mjs +6 -14
  265. package/dist/lib/esm/components/rmdir-guard-component.mjs +6 -14
  266. package/dist/lib/esm/components/settings-migration-component.d.mts +6 -4
  267. package/dist/lib/esm/components/settings-migration-component.mjs +10 -18
  268. package/dist/lib/esm/components/syntax-highlighting-component.mjs +6 -14
  269. package/dist/lib/esm/components/templates-language-component.mjs +6 -14
  270. package/dist/lib/esm/constructors/get-dom-events-handlers-constructor.mjs +6 -14
  271. package/dist/lib/esm/constructors/index.mjs +6 -14
  272. package/dist/lib/esm/css-class.mjs +6 -14
  273. package/dist/lib/esm/data-handler.mjs +6 -14
  274. package/dist/lib/esm/dataview-link.mjs +6 -14
  275. package/dist/lib/esm/dataview.mjs +6 -14
  276. package/dist/lib/esm/debug.mjs +6 -14
  277. package/dist/lib/esm/demo-vault-helper-settings.mjs +5 -13
  278. package/dist/lib/esm/demo-vault-helper.mjs +8 -15
  279. package/dist/lib/esm/demo-vault-naming.mjs +6 -14
  280. package/dist/lib/esm/desktop-demo-vault-opener.mjs +17 -21
  281. package/dist/lib/esm/desktop-trusted-input.mjs +6 -14
  282. package/dist/lib/esm/editor-extension-registrar.mjs +6 -14
  283. package/dist/lib/esm/editor-suggest-registrar.mjs +6 -14
  284. package/dist/lib/esm/editor.mjs +6 -14
  285. package/dist/lib/esm/events.mjs +6 -14
  286. package/dist/lib/esm/extensions-registrar.mjs +6 -14
  287. package/dist/lib/esm/file-change.mjs +6 -14
  288. package/dist/lib/esm/file-explorer.mjs +6 -14
  289. package/dist/lib/esm/file-manager.mjs +6 -14
  290. package/dist/lib/esm/file-system.d.mts +7 -0
  291. package/dist/lib/esm/file-system.mjs +10 -14
  292. package/dist/lib/esm/folder-note.mjs +6 -14
  293. package/dist/lib/esm/frontmatter-formatting.mjs +6 -14
  294. package/dist/lib/esm/frontmatter-link-cache-with-offsets.mjs +6 -14
  295. package/dist/lib/esm/frontmatter.mjs +6 -14
  296. package/dist/lib/esm/generated-during-build.d.mts +8 -2
  297. package/dist/lib/esm/generated-during-build.mjs +8 -16
  298. package/dist/lib/esm/hover-link-source-registrar.mjs +6 -14
  299. package/dist/lib/esm/html-element.mjs +6 -14
  300. package/dist/lib/esm/i18n/custom-type-options.mjs +6 -14
  301. package/dist/lib/esm/i18n/default-translations.mjs +6 -14
  302. package/dist/lib/esm/i18n/i18n.mjs +6 -14
  303. package/dist/lib/esm/i18n/index.mjs +6 -14
  304. package/dist/lib/esm/i18n/locales/en.mjs +6 -14
  305. package/dist/lib/esm/i18n/locales/index.mjs +6 -14
  306. package/dist/lib/esm/i18n/locales/translations-map.mjs +6 -14
  307. package/dist/lib/esm/index.mjs +6 -14
  308. package/dist/lib/esm/is-in-obsidian.mjs +6 -14
  309. package/dist/lib/esm/library-styles.mjs +6 -14
  310. package/dist/lib/esm/library.mjs +6 -14
  311. package/dist/lib/esm/link-name.mjs +6 -14
  312. package/dist/lib/esm/link-update-progress.mjs +5 -13
  313. package/dist/lib/esm/link.mjs +6 -14
  314. package/dist/lib/esm/logger.mjs +6 -14
  315. package/dist/lib/esm/loop.mjs +6 -14
  316. package/dist/lib/esm/markdown-code-block-processor-registrar.mjs +6 -14
  317. package/dist/lib/esm/markdown-code-block-processor.mjs +6 -14
  318. package/dist/lib/esm/markdown-post-processor-registrar.mjs +6 -14
  319. package/dist/lib/esm/markdown-view.mjs +6 -14
  320. package/dist/lib/esm/markdown.mjs +6 -14
  321. package/dist/lib/esm/menu-event-registrar.mjs +5 -13
  322. package/dist/lib/esm/metadata-cache.d.mts +8 -19
  323. package/dist/lib/esm/metadata-cache.mjs +35 -21
  324. package/dist/lib/esm/mobile-trusted-input.mjs +6 -14
  325. package/dist/lib/esm/modals/alert.mjs +6 -14
  326. package/dist/lib/esm/modals/confirm.mjs +6 -14
  327. package/dist/lib/esm/modals/index.mjs +6 -14
  328. package/dist/lib/esm/modals/minimizable-modal.mjs +6 -14
  329. package/dist/lib/esm/modals/modal-command-builder.mjs +6 -14
  330. package/dist/lib/esm/modals/modal.mjs +6 -14
  331. package/dist/lib/esm/modals/prompt.mjs +6 -14
  332. package/dist/lib/esm/modals/select-item.mjs +6 -14
  333. package/dist/lib/esm/modals/select-option.mjs +6 -14
  334. package/dist/lib/esm/modals/suggest-modal-command-builder.mjs +6 -14
  335. package/dist/lib/esm/note-priority.mjs +6 -14
  336. package/dist/lib/esm/notebook-navigator.mjs +6 -14
  337. package/dist/lib/esm/obsidian-dev-utils-state.mjs +6 -14
  338. package/dist/lib/esm/obsidian-protocol-handler-registrar.mjs +6 -14
  339. package/dist/lib/esm/obsidian-settings.mjs +6 -14
  340. package/dist/lib/esm/parse-link.mjs +6 -14
  341. package/dist/lib/esm/path-settings.mjs +6 -14
  342. package/dist/lib/esm/pdf.mjs +6 -14
  343. package/dist/lib/esm/plugin/index.d.mts +1 -0
  344. package/dist/lib/esm/plugin/index.mjs +8 -14
  345. package/dist/lib/esm/plugin/plugin-api-schema.d.mts +59 -0
  346. package/dist/lib/esm/plugin/plugin-api-schema.mjs +73 -0
  347. package/dist/lib/esm/plugin/plugin-api.d.mts +83 -10
  348. package/dist/lib/esm/plugin/plugin-api.mjs +11 -14
  349. package/dist/lib/esm/plugin/plugin-context.mjs +6 -14
  350. package/dist/lib/esm/plugin/plugin-event-source.mjs +6 -14
  351. package/dist/lib/esm/plugin/plugin-install-state.mjs +6 -14
  352. package/dist/lib/esm/plugin/plugin-lifecycle-events.mjs +6 -14
  353. package/dist/lib/esm/plugin/plugin-settings-tab.mjs +6 -14
  354. package/dist/lib/esm/plugin/plugin.mjs +6 -14
  355. package/dist/lib/esm/plugin/settings-migration-api.d.mts +16 -3
  356. package/dist/lib/esm/plugin/settings-migration-api.mjs +30 -14
  357. package/dist/lib/esm/plugin-cli-handler-registrar.mjs +6 -14
  358. package/dist/lib/esm/popovers/field-popover.mjs +6 -14
  359. package/dist/lib/esm/popovers/index.mjs +6 -14
  360. package/dist/lib/esm/popovers/popover-anchor.mjs +6 -14
  361. package/dist/lib/esm/popovers/popover.mjs +6 -14
  362. package/dist/lib/esm/property-entry.mjs +6 -14
  363. package/dist/lib/esm/queue.mjs +6 -14
  364. package/dist/lib/esm/react/app-context.mjs +6 -14
  365. package/dist/lib/esm/react/index.mjs +6 -14
  366. package/dist/lib/esm/reference.mjs +6 -14
  367. package/dist/lib/esm/resource-lock.mjs +6 -14
  368. package/dist/lib/esm/resource-url.mjs +6 -14
  369. package/dist/lib/esm/ribbon-icon-registrar.mjs +6 -14
  370. package/dist/lib/esm/setting-components/checkbox-component.mjs +6 -14
  371. package/dist/lib/esm/setting-components/code-highlighter-component.mjs +6 -14
  372. package/dist/lib/esm/setting-components/date-component.mjs +6 -14
  373. package/dist/lib/esm/setting-components/date-time-component.mjs +6 -14
  374. package/dist/lib/esm/setting-components/email-component.mjs +6 -14
  375. package/dist/lib/esm/setting-components/file-component.mjs +6 -14
  376. package/dist/lib/esm/setting-components/index.mjs +6 -14
  377. package/dist/lib/esm/setting-components/month-component.mjs +6 -14
  378. package/dist/lib/esm/setting-components/multiple-dropdown-component.mjs +6 -14
  379. package/dist/lib/esm/setting-components/multiple-email-component.mjs +6 -14
  380. package/dist/lib/esm/setting-components/multiple-file-component.mjs +6 -14
  381. package/dist/lib/esm/setting-components/multiple-text-component.mjs +6 -14
  382. package/dist/lib/esm/setting-components/number-component.mjs +6 -14
  383. package/dist/lib/esm/setting-components/password-component.mjs +6 -14
  384. package/dist/lib/esm/setting-components/setting-component-wrapper.mjs +6 -14
  385. package/dist/lib/esm/setting-components/telephone-component.mjs +6 -14
  386. package/dist/lib/esm/setting-components/text-based-component.mjs +6 -14
  387. package/dist/lib/esm/setting-components/time-component.mjs +6 -14
  388. package/dist/lib/esm/setting-components/tri-state-checkbox-component.mjs +6 -14
  389. package/dist/lib/esm/setting-components/typed-dropdown-component.mjs +6 -14
  390. package/dist/lib/esm/setting-components/typed-multiple-dropdown-component.mjs +6 -14
  391. package/dist/lib/esm/setting-components/typed-range-text-component.mjs +6 -14
  392. package/dist/lib/esm/setting-components/typed-text-component.mjs +6 -14
  393. package/dist/lib/esm/setting-components/url-component.mjs +6 -14
  394. package/dist/lib/esm/setting-components/validator-component.mjs +6 -14
  395. package/dist/lib/esm/setting-components/value-component-with-change-tracking.mjs +5 -13
  396. package/dist/lib/esm/setting-components/week-component.mjs +6 -14
  397. package/dist/lib/esm/setting-ex.mjs +6 -14
  398. package/dist/lib/esm/setting-group-ex.mjs +6 -14
  399. package/dist/lib/esm/status-bar-item-registrar.mjs +6 -14
  400. package/dist/lib/esm/templater.mjs +6 -14
  401. package/dist/lib/esm/transformers/duration-transformer.mjs +6 -14
  402. package/dist/lib/esm/transformers/index.mjs +6 -14
  403. package/dist/lib/esm/trusted-input.mjs +6 -14
  404. package/dist/lib/esm/validation.mjs +6 -14
  405. package/dist/lib/esm/vault-delete.mjs +6 -14
  406. package/dist/lib/esm/vault-transaction.mjs +6 -14
  407. package/dist/lib/esm/vault.mjs +6 -14
  408. package/dist/lib/esm/view-registrar.mjs +6 -14
  409. package/dist/lib/esm/workspace.mjs +6 -14
  410. package/dist/styles.css +4 -1
  411. package/package.json +69 -24
  412. package/plugin/plugin-api-schema/package.json +6 -0
@@ -5,40 +5,32 @@ if you want to view the source, please visit the github repository of this plugi
5
5
 
6
6
  (function () {
7
7
  function ensureDisposeSymbols(symbolConstructor = Symbol) {
8
- symbolConstructor.asyncDispose ??= symbolConstructor.for('Symbol.asyncDispose');
9
- symbolConstructor.dispose ??= symbolConstructor.for('Symbol.dispose');
8
+ symbolConstructor.asyncDispose ??= symbolConstructor.for("Symbol.asyncDispose");
9
+ symbolConstructor.dispose ??= symbolConstructor.for("Symbol.dispose");
10
10
  }
11
11
 
12
12
  function ensureBrowserProcess() {
13
13
  const browserProcess = {
14
14
  browser: true,
15
15
  cwd() {
16
- return '/';
16
+ return "/";
17
17
  },
18
18
  env: {},
19
- platform: 'android'
19
+ platform: "android"
20
20
  };
21
-
22
- // eslint-disable-next-line obsidianmd/no-global-this, unicorn/no-unnecessary-global-this -- Must stay `globalThis`-qualified: in the emitted banner a bare `process` is a free identifier, so reading it where the host has none throws a ReferenceError instead of yielding `undefined`. That is the very case this function exists to handle.
23
21
  const existingProcess = globalThis.process;
24
-
25
22
  if (!existingProcess) {
26
- // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
27
23
  globalThis.process = browserProcess;
28
24
  return;
29
25
  }
30
-
31
26
  if (existingProcess.versions?.node) {
32
27
  return;
33
28
  }
34
-
35
29
  const existingProcessRecord = existingProcess;
36
-
37
30
  for (const [key, value] of Object.entries(browserProcess)) {
38
31
  existingProcessRecord[key] ??= value;
39
32
  }
40
-
41
- existingProcessRecord['browser'] = true;
33
+ existingProcessRecord["browser"] = true;
42
34
  }
43
35
 
44
36
  (function initEsm() {
@@ -58,6 +50,7 @@ import {
58
50
  setIcon
59
51
  } from "obsidian";
60
52
  import { CssClass } from "../css-class.mjs";
53
+ import { appendCodeBlock } from "../html-element.mjs";
61
54
  import { t } from "../i18n/i18n.mjs";
62
55
  import { getObsidianDevUtilsState } from "../obsidian-dev-utils-state.mjs";
63
56
  import { addPluginCssClasses } from "../plugin/plugin-context.mjs";
@@ -381,12 +374,16 @@ class PluginNoticeComponent extends ComponentEx {
381
374
  * Builds the notice content, prefixing the message with the plugin name in a styled element so it is
382
375
  * visually distinguished from the message body.
383
376
  *
377
+ * The name is rendered as inline code, the way every plugin name in the UI is, inside a span that keeps
378
+ * the prefix's own layout and accent color.
379
+ *
384
380
  * @param message - The message to display after the plugin name prefix.
385
381
  * @returns A {@link DocumentFragment} with the styled plugin name prefix followed by the message.
386
382
  */
387
383
  buildPrefixedMessage(message) {
388
384
  const fragment = createFragment();
389
- const nameEl = createSpan({ text: this.pluginName });
385
+ const nameEl = createSpan();
386
+ appendCodeBlock(nameEl, this.pluginName);
390
387
  addPluginCssClasses(nameEl, CssClass.PluginNoticeName);
391
388
  fragment.append(nameEl);
392
389
  if (!this._loaded) {
@@ -540,4 +537,4 @@ export {
540
537
  PluginNoticeComponent,
541
538
  PluginNoticeMode
542
539
  };
543
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvcGx1Z2luLW5vdGljZS1jb21wb25lbnQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDb21wb25lbnQgdGhhdCBtYW5hZ2VzIGRpc3BsYXlpbmcgbm90aWNlcyB0byB0aGUgdXNlci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZhbHVlUHJvdmlkZXIgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdmFsdWUtcHJvdmlkZXInO1xuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBzbmFwc2hvdCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hcnJheSc7XG5pbXBvcnQgeyBpbnZva2VBc3luY1NhZmVseSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hc3luYyc7XG5pbXBvcnQgeyBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvb2JqZWN0LXV0aWxzJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IHJlc29sdmVWYWx1ZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi92YWx1ZS1wcm92aWRlcic7XG5pbXBvcnQge1xuICBCdXR0b25Db21wb25lbnQsXG4gIE5vdGljZSxcbiAgc2V0SWNvblxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IENzc0NsYXNzIH0gZnJvbSAnLi4vY3NzLWNsYXNzLnRzJztcbmltcG9ydCB7IHQgfSBmcm9tICcuLi9pMThuL2kxOG4udHMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlIH0gZnJvbSAnLi4vb2JzaWRpYW4tZGV2LXV0aWxzLXN0YXRlLnRzJztcbmltcG9ydCB7IGFkZFBsdWdpbkNzc0NsYXNzZXMgfSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWNvbnRleHQudHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50RXggfSBmcm9tICcuL2NvbXBvbmVudC1leC50cyc7XG5pbXBvcnQgeyBNb25rZXlBcm91bmRDb21wb25lbnQgfSBmcm9tICcuL21vbmtleS1hcm91bmQtY29tcG9uZW50LnRzJztcblxuY29uc3QgUEVSTUFORU5UX05PVElDRVNfU1RBVEVfS0VZID0gJ3BsdWdpbi1ub3RpY2UtY29tcG9uZW50OnBlcm1hbmVudC1ub3RpY2VzJztcbmNvbnN0IFBFUk1BTkVOVF9OT1RJQ0VfRFVSQVRJT05fSU5fTUlMTElTRUNPTkRTID0gMDtcbmNvbnN0IERFRkFVTFRfREVMQVlfQkVGT1JFX1NIT1dfSU5fTUlMTElTRUNPTkRTID0gNTAwO1xuLy8gT2JzaWRpYW4ncyBvd24gZGVmYXVsdCBub3RpY2UgZHVyYXRpb24sIGFwcGxpZWQgYnkgdGhlIGBOb3RpY2VgIGNvbnN0cnVjdG9yIHdoZW4gbm9uZSBpcyBnaXZlbi4gSXQgaXNcbi8vIHJlcGVhdGVkIGhlcmUgYmVjYXVzZSByZXN0YXJ0aW5nIHRoZSBjb3VudGRvd24gb24gYW4gYXBwZW5kIGdvZXMgdGhyb3VnaCBgc2V0QXV0b0hpZGVgLCB3aGljaCB0YWtlcyBhblxuLy8gZXhwbGljaXQgZHVyYXRpb24gYW5kIHNvIGNhbm5vdCBmYWxsIGJhY2sgdG8gdGhhdCBkZWZhdWx0IGl0c2VsZi5cbmNvbnN0IE9CU0lESUFOX0RFRkFVTFRfTk9USUNFX0RVUkFUSU9OX0lOX01JTExJU0VDT05EUyA9IDQwMDA7XG5cbi8vIEVsZW1lbnRzIGEgdXNlciBjbGlja3MgdG8gYWN0IG9uIHRoZW0gcmF0aGVyIHRoYW4gdG8gZGlzbWlzcyB0aGUgbm90aWNlLiBBIGNsaWNrIGxhbmRpbmcgb24gKG9yXG4vLyBpbnNpZGUpIG9uZSBvZiB0aGVzZSBpcyBrZXB0IGZyb20gYnViYmxpbmcgdG8gdGhlIG5vdGljZSwgc28gdGhlIG5vdGljZSBzdGF5cyBvcGVuLlxuY29uc3QgSU5URVJBQ1RJVkVfRUxFTUVOVF9TRUxFQ1RPUiA9ICdhLCBidXR0b24sIGlucHV0LCBzZWxlY3QsIHRleHRhcmVhLCBsYWJlbCwgW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl0sIFtyb2xlPVwiYnV0dG9uXCJdLCBbcm9sZT1cImxpbmtcIl0sIFtyb2xlPVwiY2hlY2tib3hcIl0sIFtyb2xlPVwidGFiXCJdLCBbcm9sZT1cIm1lbnVpdGVtXCJdJztcblxuLyoqXG4gKiBIb3cgYSBuZXcgbm90aWNlIHJlbGF0ZXMgdG8gdGhlIHBsdWdpbidzIGN1cnJlbnQgbm90aWNlIFx1MjAxNCB0aGUgb25lIG9jY3VweWluZyB0aGUgc2luZ2xlIHBlci1wbHVnaW5cbiAqIHNsb3QgdGhpcyBjb21wb25lbnQga2VlcHMuXG4gKlxuICogUmF3IGBuZXcgTm90aWNlKC4uLilgIGNhbGxzIGFsd2F5cyBwaWxlIHVwLCB3aGljaCBpcyByYXJlbHkgd2hhdCBhIHBsdWdpbiB3YW50czogdXN1YWxseSBvbmx5IHRoZVxuICogbGF0ZXN0IG1lc3NhZ2UgbWF0dGVycy4gU28gdGhlIHNsb3QgZXhpc3RzLCBhbmQgdGhpcyBjaG9vc2VzIHdoYXQgYSBuZXcgbWVzc2FnZSBkb2VzIHdpdGggaXQuXG4gKi9cbmV4cG9ydCBlbnVtIFBsdWdpbk5vdGljZU1vZGUge1xuICAvKipcbiAgICogQWRkcyB0aGUgbWVzc2FnZSB0byB0aGUgY3VycmVudCBub3RpY2UsIHNvIGJvdGggbWVzc2FnZXMgc3RheSB2aXNpYmxlIGluIGEgc2luZ2xlIG5vdGljZSBcdTIwMTQgZm9yIGFcbiAgICogcnVubmluZyBhY2NvdW50IG9mIGFuIG9wZXJhdGlvbi4gVGhlIGNvdW50ZG93biByZXN0YXJ0cywgc28gYW4gYXBwZW5kZWQgbWVzc2FnZSBpcyByZWFkYWJsZSBmb3IgYVxuICAgKiBmdWxsIGR1cmF0aW9uIHJhdGhlciB0aGFuIGluaGVyaXRpbmcgdGhlIHJlbWFpbnMgb2YgdGhlIGN1cnJlbnQgb25lLlxuICAgKlxuICAgKiBGYWxscyBiYWNrIHRvIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlLlJlcGxhY2V9IHdoZW4gdGhlcmUgaXMgbm8gY3VycmVudCBub3RpY2Ugb24gc2NyZWVuIChpdCB3YXNcbiAgICogbmV2ZXIgc2hvd24sIG9yIGl0IGhhcyBzaW5jZSBiZWVuIGRpc21pc3NlZCkuXG4gICAqL1xuICBBcHBlbmQgPSAnYXBwZW5kJyxcblxuICAvKipcbiAgICogSGlkZXMgdGhlIGN1cnJlbnQgbm90aWNlIGFuZCBzaG93cyB0aGlzIG9uZSBpbiBpdHMgcGxhY2UsIHNvIG9ubHkgdGhlIGxhdGVzdCBtZXNzYWdlIGlzIG9uIHNjcmVlbi5cbiAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCwgYW5kIHRoZSByZWFzb24gdGhlIHNsb3QgZXhpc3RzLlxuICAgKi9cbiAgUmVwbGFjZSA9ICdyZXBsYWNlJyxcblxuICAvKipcbiAgICogU2hvd3MgdGhlIG1lc3NhZ2UgYXMgaXRzIG93biBub3RpY2UsIGxlYXZpbmcgdGhlIGN1cnJlbnQgb25lIGFsb25lOiBib3RoIGFyZSBvbiBzY3JlZW4sIHBpbGVkIHVwXG4gICAqIGxpa2UgcGxhaW4gYG5ldyBOb3RpY2UoLi4uKWAgY2FsbHMuIEEgc2VwYXJhdGUgbm90aWNlIG5ldmVyIHJlcGxhY2VzLCBhbmQgaXMgbmV2ZXIgcmVwbGFjZWQgYnksIGFcbiAgICogc2xvdCBub3RpY2U7IGFueSBudW1iZXIgb2YgdGhlbSBjb2V4aXN0LiBUaGV5IGFyZSBzdGlsbCBoaWRkZW4gdG9nZXRoZXIgb24gdW5sb2FkLlxuICAgKi9cbiAgU2VwYXJhdGUgPSAnc2VwYXJhdGUnXG59XG5cbi8qKlxuICogVGhlIGV2ZW50IHBhc3NlZCB0byB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMub25DbG9zZUNsaWNrfSB3aGVuIHRoZSBub3RpY2Unc1xuICogY2xvc2UgKFgpIGJ1dHRvbiBpcyBjbGlja2VkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNsb3NlQ2xpY2tFdmVudCB7XG4gIC8qKlxuICAgKiBDYW5jZWxzIHRoZSBjbG9zZSwgbGVhdmluZyB0aGUgbm90aWNlIG9wZW4uXG4gICAqL1xuICBjYW5jZWw6ICgpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogQSBoYW5kbGUgdG8gYSBkZWxheWVkIG5vdGljZSBjcmVhdGVkIGJ5IHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZUFmdGVyRGVsYXl9LiBJdCBpcyBhXG4gKiB7QGxpbmsgRGlzcG9zYWJsZX0gKHNvIGl0IGNhbiBiZSB1c2VkIHdpdGggYHVzaW5nYCkgdGhhdCBhbHNvIGxldHMgdGhlIGNvbnRlbnQgYmUgdXBkYXRlZCB3aGlsZSB0aGVcbiAqIG5vdGljZSBpcyBzaG93bi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5Ob3RpY2VDb21wb25lbnREZWxheWVkTm90aWNlIGV4dGVuZHMgRGlzcG9zYWJsZSB7XG4gIC8qKlxuICAgKiBSZXBsYWNlcyB0aGlzIGhhbmRsZSdzIG1lc3NhZ2UsIHJlLWFwcGx5aW5nIHRoZSBwbHVnaW4tbmFtZSBwcmVmaXgsIHRoZSBpbnRlcmFjdGl2ZS1jbGljayBndWFyZCwgYW5kXG4gICAqIHRoZSBDYW5jZWwgYnV0dG9uLiBVc2VmdWwgZm9yIHJlcG9ydGluZyBwcm9ncmVzcy4gSWYgdGhlIGRlbGF5IGhhcyBub3QgZWxhcHNlZCB5ZXQsIHRoZSBuZXcgY29udGVudFxuICAgKiBiZWNvbWVzIHdoYXQgaXMgc2hvd24gb25jZSBpdCBkb2VzLlxuICAgKlxuICAgKiBPbmx5IHRoaXMgaGFuZGxlJ3Mgb3duIG1lc3NhZ2UgaXMgcmV3cml0dGVuOiB3aGVuIHRoZSBub3RpY2Ugd2FzIGpvaW5lZCByYXRoZXIgdGhhbiBvcGVuZWQgKHNlZVxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZUFmdGVyRGVsYXlQYXJhbXMubW9kZX0pLCB0aGUgbWVzc2FnZXMgYWxyZWFkeSBpbiBpdCBhcmUgbGVmdFxuICAgKiBhbG9uZS5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRlbnQgLSBUaGUgbmV3IG5vdGljZSBjb250ZW50LlxuICAgKi9cbiAgc2V0Q29udGVudDogKGNvbnRlbnQ6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmcpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlQWZ0ZXJEZWxheX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZUFmdGVyRGVsYXlQYXJhbXMge1xuICAvKipcbiAgICogV2hlbiBwcm92aWRlZCwgYSBDYW5jZWwgYnV0dG9uIGlzIGFwcGVuZGVkIHRvIHRoZSBub3RpY2U7IGNsaWNraW5nIGl0IGFib3J0cyB0aGlzIGNvbnRyb2xsZXIuIFdoZW5cbiAgICogb21pdHRlZCwgbm8gQ2FuY2VsIGJ1dHRvbiBpcyBzaG93bi5cbiAgICovXG4gIHJlYWRvbmx5IGFib3J0Q29udHJvbGxlcj86IEFib3J0Q29udHJvbGxlcjtcblxuICAvKipcbiAgICogVGhlIHRleHQgb2YgdGhlIENhbmNlbCBidXR0b24gc2hvd24gd2hlbiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZUFmdGVyRGVsYXlQYXJhbXMuYWJvcnRDb250cm9sbGVyfVxuICAgKiBpcyBwcm92aWRlZC4gV2hlbiBvbWl0dGVkLCB0aGUgbG9jYWxpemVkIGBDYW5jZWxgIGxhYmVsIGlzIHVzZWQuXG4gICAqL1xuICByZWFkb25seSBjYW5jZWxCdXR0b25UZXh0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbm90aWNlIGNvbnRlbnQsIHJlc29sdmVkIGxhemlseSBvbmx5IGlmIHRoZSBkZWxheSBlbGFwc2VzIFx1MjAxNCBzbyBhbiBvcGVyYXRpb24gdGhhdCBmaW5pc2hlc1xuICAgKiBzb29uZXIgbmV2ZXIgYnVpbGRzIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudDogVmFsdWVQcm92aWRlcjxEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nPjtcblxuICAvKipcbiAgICogSG93IGxvbmcgdGhlIG9wZXJhdGlvbiBtdXN0IHJ1biBiZWZvcmUgdGhlIG5vdGljZSBpcyBzaG93bi4gT3BlcmF0aW9ucyB0aGF0IGZpbmlzaCBzb29uZXIgbmV2ZXJcbiAgICogc2hvdyBhIG5vdGljZSwgYXZvaWRpbmcgYSBkaXN0cmFjdGluZyBmbGFzaC5cbiAgICpcbiAgICogQGRlZmF1bHQgYDUwMGBcbiAgICovXG4gIHJlYWRvbmx5IGRlbGF5SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEhvdyB0aGlzIG5vdGljZSByZWxhdGVzIHRvIHRoZSBwbHVnaW4ncyBjdXJyZW50IG5vdGljZSBcdTIwMTQgc2VlIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlfS5cbiAgICpcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZU1vZGUuU2VwYXJhdGV9IGlzIHdvcnRoIGNvbnNpZGVyaW5nIGZvciBhIGxvbmcgb3BlcmF0aW9uOiBvbiB0aGUgZGVmYXVsdFxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5SZXBsYWNlfSB0aGUgcHJvZ3Jlc3Mgbm90aWNlIHRha2VzIHRoZSBzaGFyZWQgc2xvdCwgc28gYW55IG9yZGluYXJ5IG5vdGljZVxuICAgKiByYWlzZWQgd2hpbGUgdGhlIG9wZXJhdGlvbiBydW5zIGhpZGVzIGl0LCBhbmQgdGhlIHByb2dyZXNzIHRoZSB1c2VyIHdhcyB3YXRjaGluZyBkb2VzIG5vdCBjb21lIGJhY2suXG4gICAqXG4gICAqIFdoaWNoZXZlciBtb2RlIGlzIHVzZWQsIHRoZSByZXR1cm5lZCBoYW5kbGUgb3ducyBvbmx5IElUUyBtZXNzYWdlOiB1cGRhdGluZyB0aGUgY29udGVudCByZXdyaXRlc1xuICAgKiB0aGF0IG1lc3NhZ2UgYWxvbmUsIGFuZCBkaXNwb3NpbmcgdGFrZXMgYXdheSBvbmx5IHRoYXQgbWVzc2FnZSB3aGVuIHRoZSBub3RpY2Ugd2FzIGFscmVhZHkgb25cbiAgICogc2NyZWVuIChhIG5vdGljZSB0aGlzIGhhbmRsZSBvcGVuZWQgaXMgaGlkZGVuIGFzIGEgd2hvbGUpLlxuICAgKlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5SZXBsYWNlfVxuICAgKi9cbiAgcmVhZG9ubHkgbW9kZT86IFBsdWdpbk5vdGljZU1vZGU7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBub3RpY2Ugc2hvdWxkIHN0YXkgdW50aWwgaXQgaXMgcmVwbGFjZWQsIHRoZSBwbHVnaW4gaXMgcmVsb2FkZWQsIG9yIHRoZSB1c2VyIGRpc21pc3NlcyBpdC5cbiAgICpcbiAgICogQSBwZXJtYW5lbnQgbm90aWNlIGlzIHNob3duIHdpdGggYW4gaW5maW5pdGUgZHVyYXRpb24gYW5kIGlzIG5vdCBoaWRkZW4gd2hlbiB0aGUgY29tcG9uZW50IHVubG9hZHMsIHNvIGl0IGNhblxuICAgKiBjb21tdW5pY2F0ZSBzdGF0ZSB0aGF0IG91dGxpdmVzIHRoZSBwbHVnaW4gKGUuZy4gYSBjbGVhbnVwIHRoYXQgcmVxdWlyZXMgYSByZWxvYWQpLiBUaGVyZSBpcyBhdCBtb3N0IG9uZSBwZXJtYW5lbnRcbiAgICogbm90aWNlIHBlciBwbHVnaW46IGl0IGlzIGhpZGRlbiBieSB0aGUgbmV4dCB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2V9IGNhbGwgYW5kIGRpc21pc3NlZFxuICAgKiBhdXRvbWF0aWNhbGx5IHRoZSBuZXh0IHRpbWUgdGhlIGNvbXBvbmVudCBsb2FkcyAoaS5lLiB3aGVuIHRoZSBwbHVnaW4gaXMgcmUtZW5hYmxlZCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzUGVybWFuZW50PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSG93IHRoaXMgbm90aWNlIHJlbGF0ZXMgdG8gdGhlIHBsdWdpbidzIGN1cnJlbnQgbm90aWNlIFx1MjAxNCBzZWUge0BsaW5rIFBsdWdpbk5vdGljZU1vZGV9LlxuICAgKlxuICAgKiBBIHBlcm1hbmVudCBub3RpY2UgY2Fubm90IGJlIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlLlNlcGFyYXRlfSAoaXQgbmVlZHMgdGhlIHNoYXJlZCBzbG90IGl0IGlzXG4gICAqIHRyYWNrZWQgaW4pLCBhbmQgYSBub3RpY2UgdGhhdCBkb2VzIG5vdCBoaWRlIG9uIGNsaWNrIG11c3QgYmVcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZU1vZGUuU2VwYXJhdGV9IChzbyBhIGxhdGVyIG5vdGljZSBuZXZlciBzaWxlbnRseSByZXBsYWNlcyBpdCk7IGVpdGhlclxuICAgKiBjb250cmFkaWN0aW9uIHRocm93cy5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIFBsdWdpbk5vdGljZU1vZGUuUmVwbGFjZX0sIG9yIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlLlNlcGFyYXRlfSB3aGVuXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucy5zaG91bGRIaWRlT25DbGlja30gaXMgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgbW9kZT86IFBsdWdpbk5vdGljZU1vZGU7XG5cbiAgLyoqXG4gICAqIEEgY2FsbGJhY2sgaW52b2tlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgY2xvc2UgKFgpIGJ1dHRvbiwgYmVmb3JlIHRoZSBub3RpY2UgaXMgaGlkZGVuLiBDYWxsXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VDbG9zZUNsaWNrRXZlbnQuY2FuY2VsfSBvbiB0aGUgZXZlbnQgdG8gY2FuY2VsIHRoZSBjbG9zZSBhbmQga2VlcCB0aGUgbm90aWNlXG4gICAqIG9wZW4gXHUyMDE0IGZvciBleGFtcGxlIGFmdGVyIHlvdXIgb3duIGNvbmZpcm1hdGlvbiBkZWNsaW5lcy4gQW4gYXN5bmMgY2FsbGJhY2sgaXMgYXdhaXRlZCBiZWZvcmUgdGhlXG4gICAqIG5vdGljZSBpcyBoaWRkZW4uIFJ1bnMgb25seSB3aGVuIGEgY2xvc2UgYnV0dG9uIGlzIHNob3duIChib3RoXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucy5zaG91bGRIaWRlT25DbGlja30gYD0gZmFsc2VgIGFuZFxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMuc2hvdWxkU2hvd0Nsb3NlQnV0dG9ufSBhcmUgc2V0KS5cbiAgICovXG4gIHJlYWRvbmx5IG9uQ2xvc2VDbGljaz86IChldmVudDogUGx1Z2luTm90aWNlQ2xvc2VDbGlja0V2ZW50KSA9PiBQcm9taXNhYmxlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBBIGNhbGxiYWNrIGludm9rZWQgd2hlbiB0aGUgbm90aWNlIGlzIGhpZGRlbiBcdTIwMTQgd2hldGhlciBieSB0aGUgdXNlciBjbG9zaW5nIGl0LCBieSBhIGxhdGVyIHJldXNhYmxlXG4gICAqIG5vdGljZSByZXBsYWNpbmcgaXQsIGJ5IGl0cyBkdXJhdGlvbiBlbGFwc2luZywgb3Igb24gY29tcG9uZW50IHVubG9hZC4gSXQgcnVucyBhdCBtb3N0IG9uY2UgcGVyXG4gICAqIG5vdGljZS4gVGhlIHtAbGluayBQbHVnaW5Ob3RpY2VIaWRlSW5mb30gYXJndW1lbnQgZGlzdGluZ3Vpc2hlcyBhIHVzZXIgY2xvc2UgKHRoZSBjbG9zZSBidXR0b24pIGZyb21cbiAgICogYSBwcm9ncmFtbWF0aWMgaGlkZS4gQW4gYXN5bmMgY2FsbGJhY2sgaXMgcnVuIGZpcmUtYW5kLWZvcmdldCAoaXRzIHJlamVjdGlvbiBzdXJmYWNlcyB0aHJvdWdoIHRoZVxuICAgKiBhc3luYy1lcnJvciBwaXBlbGluZSkuXG4gICAqL1xuICByZWFkb25seSBvbkhpZGU/OiAoaW5mbzogUGx1Z2luTm90aWNlSGlkZUluZm8pID0+IFByb21pc2FibGU8dm9pZD47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgY2xpY2tpbmcgdGhlIG5vdGljZSBoaWRlcyBpdC4gV2hlbiBgdHJ1ZWAgKHRoZSBkZWZhdWx0KSwgdGhlIG5vdGljZSBkaXNtaXNzZXMgb24gY2xpY2sgbGlrZVxuICAgKiBhIG5vcm1hbCBPYnNpZGlhbiBub3RpY2UuIFdoZW4gYGZhbHNlYCwgdGhlIG5vdGljZSBpcyBoYXJkIHRvIGNsb3NlOiBpdCBkb2VzIG5vdCBkaXNtaXNzIG9uIGFueSBzdHJheVxuICAgKiBjbGljaywgYW5kIGluc3RlYWQgc2hvd3MgYSBjbG9zZSAoWCkgYnV0dG9uIHRoYXQgaGlkZXMgaXQgZGlyZWN0bHkgKHNlZVxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMuc2hvdWxkU2hvd0Nsb3NlQnV0dG9ufSBhbmRcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm9uQ2xvc2VDbGlja30pLlxuICAgKlxuICAgKiBBIGBzaG91bGRIaWRlT25DbGljazogZmFsc2VgIG5vdGljZSBpcyBzaG93biB3aXRoIGFuIGluZmluaXRlIGR1cmF0aW9uIGFuZCBzdGFuZHMgb24gaXRzIG93blxuICAgKiAoaW1wbGllcyB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5TZXBhcmF0ZX0pLCBzbyBhIGxhdGVyIG5vdGljZSBuZXZlciBzaWxlbnRseSByZXBsYWNlcyBpdDsgcGFzc2luZ1xuICAgKiBhbnkgb3RoZXIge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm1vZGV9IHRvZ2V0aGVyIHdpdGggYHNob3VsZEhpZGVPbkNsaWNrOiBmYWxzZWBcbiAgICogdGhyb3dzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEhpZGVPbkNsaWNrPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgY2xvc2UgKFgpIGJ1dHRvbiBpcyBzaG93biBvbiBhIGhhcmQtdG8tY2xvc2Ugbm90aWNlXG4gICAqICh7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMuc2hvdWxkSGlkZU9uQ2xpY2t9IGA9IGZhbHNlYCkuIFdoZW4gYGZhbHNlYCwgbm8gY2xvc2VcbiAgICogYnV0dG9uIGlzIHJlbmRlcmVkIGFuZCB0aGUgbm90aWNlIGNhbiBvbmx5IGJlIGhpZGRlbiBwcm9ncmFtbWF0aWNhbGx5LiBJZ25vcmVkIHVubGVzc1xuICAgKiBgc2hvdWxkSGlkZU9uQ2xpY2tgIGlzIGBmYWxzZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBEZXNjcmliZXMgd2h5IGEgbm90aWNlIHdhcyBoaWRkZW4sIHBhc3NlZCB0byB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMub25IaWRlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5Ob3RpY2VIaWRlSW5mbyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBub3RpY2Ugd2FzIGhpZGRlbiBieSB0aGUgdXNlciBjbGlja2luZyBpdHMgY2xvc2UgKFgpIGJ1dHRvbiBzcGVjaWZpY2FsbHkuIEFsd2F5cyBpbXBsaWVzXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VIaWRlSW5mby5pc1VzZXJBY3Rpb259LlxuICAgKi9cbiAgcmVhZG9ubHkgaXNDbG9zZUJ1dHRvbkNsaWNrZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG5vdGljZSB3YXMgaGlkZGVuIGJ5IGEgdXNlciBhY3Rpb24gXHUyMDE0IGNsaWNraW5nIHRoZSBjbG9zZSAoWCkgYnV0dG9uLCBvciBjbGlja2luZyBhXG4gICAqIGRpc21pc3NpYmxlIG5vdGljZSB0byBkaXNtaXNzIGl0IFx1MjAxNCBhcyBvcHBvc2VkIHRvIHByb2dyYW1tYXRpY2FsbHkgKGEgbGF0ZXIgcmV1c2FibGUgbm90aWNlIHJlcGxhY2luZ1xuICAgKiBpdCwgYW4gZXhwbGljaXQgYGhpZGUoKWAsIHRoZSBkdXJhdGlvbiBlbGFwc2luZywgb3IgY29tcG9uZW50IHVubG9hZCkuXG4gICAqL1xuICByZWFkb25seSBpc1VzZXJBY3Rpb246IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBQbHVnaW5Ob3RpY2VDb21wb25lbnRBcHBlbmRDbG9zZUJ1dHRvblBhcmFtcyB7XG4gIHJlYWRvbmx5IGNvbnRlbnRFbDogSFRNTEVsZW1lbnQ7XG4gIHJlYWRvbmx5IGdldE5vdGljZTogKCkgPT4gTm90aWNlIHwgbnVsbDtcbiAgcmVhZG9ubHkgb25DbG9zZUNsaWNrPzogKGV2ZW50OiBQbHVnaW5Ob3RpY2VDbG9zZUNsaWNrRXZlbnQpID0+IFByb21pc2FibGU8dm9pZD47XG59XG5cbmludGVyZmFjZSBQbHVnaW5Ob3RpY2VDb21wb25lbnRBcHBlbmRUb0N1cnJlbnROb3RpY2VQYXJhbXMge1xuICByZWFkb25seSBkdXJhdGlvbkluTWlsbGlzZWNvbmRzOiBudWxsIHwgbnVtYmVyO1xuICByZWFkb25seSBtZXNzYWdlOiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nO1xuICByZWFkb25seSBvbkhpZGU/OiAoaW5mbzogUGx1Z2luTm90aWNlSGlkZUluZm8pID0+IFByb21pc2FibGU8dm9pZD47XG4gIHJlYWRvbmx5IHNob3VsZFJlZ2lzdGVyQXNQZXJtYW5lbnQ6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBQbHVnaW5Ob3RpY2VDb21wb25lbnRCdWlsZERlbGF5ZWROb3RpY2VNZXNzYWdlUGFyYW1zIHtcbiAgcmVhZG9ubHkgYWJvcnRDb250cm9sbGVyPzogQWJvcnRDb250cm9sbGVyO1xuICByZWFkb25seSBjYW5jZWxCdXR0b25UZXh0Pzogc3RyaW5nO1xuICByZWFkb25seSBjb250ZW50OiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50QnVpbGROb3RpY2VDb250ZW50UGFyYW1zIHtcbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBub3RpY2UgdGhpcyBjb250ZW50IGJlbG9uZ3MgdG8sIHVzZWQgYnkgdGhlIGNsb3NlIGJ1dHRvbidzIGhhbmRsZXIuIFRoZSBub3RpY2UgZG9lc1xuICAgKiBub3QgZXhpc3QgeWV0IHdoZW4gdGhlIGNvbnRlbnQgaXMgYnVpbHQsIHNvIGl0IGlzIHJlc29sdmVkIGxhemlseSBhdCBjbGljayB0aW1lLiBSZXF1aXJlZCB3aGVuIGFcbiAgICogY2xvc2UgYnV0dG9uIGlzIHNob3duLlxuICAgKi9cbiAgcmVhZG9ubHkgZ2V0Tm90aWNlPzogKCkgPT4gTm90aWNlIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBhZnRlciB0aGUgcGx1Z2luIG5hbWUgcHJlZml4LlxuICAgKi9cbiAgcmVhZG9ubHkgbWVzc2FnZTogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZztcblxuICAvKipcbiAgICogSW52b2tlZCB3aGVuIHRoZSBjbG9zZSBidXR0b24gaXMgY2xpY2tlZDsgbWF5IGNhbmNlbCB0aGUgY2xvc2UuIFNlZVxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMub25DbG9zZUNsaWNrfS5cbiAgICovXG4gIHJlYWRvbmx5IG9uQ2xvc2VDbGljaz86IChldmVudDogUGx1Z2luTm90aWNlQ2xvc2VDbGlja0V2ZW50KSA9PiBQcm9taXNhYmxlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBub3RpY2UgaXMgaGFyZCB0byBjbG9zZTogc3RvcHMgZXZlcnkgY2xpY2sgZnJvbSBkaXNtaXNzaW5nIGl0IGFuZCwgdW5sZXNzIHN1cHByZXNzZWQgYnlcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudEJ1aWxkTm90aWNlQ29udGVudFBhcmFtcy5zaG91bGRTaG93Q2xvc2VCdXR0b259LCBhZGRzIGEgY2xvc2UgYnV0dG9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSByZXF1aXJlc0V4cGxpY2l0Q2xvc2U/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBtZXNzYWdlIGlzIHByZWZpeGVkIHdpdGggdGhlIHBsdWdpbiBuYW1lLiBPbmx5IGEgbWVzc2FnZSB0aGF0IG9wZW5zIGEgbm90aWNlIGlzXG4gICAqIHByZWZpeGVkOyBhIG1lc3NhZ2UgYXBwZW5kZWQgdG8gb25lIGFscmVhZHkgc2hvd2luZyBpdCBpcyBub3QsIHNvIHRoZSBuYW1lIGlzIG5vdCByZXBlYXRlZCBvbiBldmVyeVxuICAgKiBsaW5lLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFByZWZpeFdpdGhQbHVnaW5OYW1lPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZW5kZXIgdGhlIGNsb3NlIGJ1dHRvbiB3aGVuIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRCdWlsZE5vdGljZUNvbnRlbnRQYXJhbXMucmVxdWlyZXNFeHBsaWNpdENsb3NlfS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRTaG93Q2xvc2VCdXR0b24/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBhcHA6IEFwcDtcbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgYnVpbHQgbWVzc2FnZTogdGhlIHdyYXBwZXIgZWxlbWVudCBob2xkaW5nIGl0LCBhbmQgdGhlIGZyYWdtZW50IHRoYXQgZWxlbWVudCBzaXRzIGluLlxuICpcbiAqIFRoZSBlbGVtZW50IGlzIGhhbmRlZCBiYWNrIGJlY2F1c2UgYSBub3RpY2UgY2FuIGhvbGQgc2V2ZXJhbCBvZiB0aGVtIChzZWUge0BsaW5rIFBsdWdpbk5vdGljZU1vZGUuQXBwZW5kfSksXG4gKiBzbyB3aG9ldmVyIG93bnMgb25lIG1lc3NhZ2UgaGFzIHRvIGJlIGFibGUgdG8gdXBkYXRlIG9yIHJlbW92ZSBleGFjdGx5IHRoYXQgbWVzc2FnZS4gVGhlIHJlZmVyZW5jZVxuICogc3RheXMgdmFsaWQgb25jZSB0aGUgZnJhZ21lbnQgaXMgaGFuZGVkIHRvIGBOb3RpY2VgOiBhcHBlbmRpbmcgYSBmcmFnbWVudCBtb3ZlcyBpdHMgY2hpbGRyZW4gcmF0aGVyXG4gKiB0aGFuIGNvcHlpbmcgdGhlbS5cbiAqL1xuaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNvbXBvbmVudE5vdGljZUNvbnRlbnQge1xuICAvKipcbiAgICogVGhlIGVsZW1lbnQgd3JhcHBpbmcgdGhpcyBtZXNzYWdlIGFsb25lLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudEVsOiBIVE1MRWxlbWVudDtcblxuICAvKipcbiAgICogVGhlIGZyYWdtZW50IGhvbGRpbmcge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudE5vdGljZUNvbnRlbnQuY29udGVudEVsfSwgcmVhZHkgdG8gaGFuZCB0byBgTm90aWNlYFxuICAgKiBvciB0byBhcHBlbmQgaW50byBvbmUuXG4gICAqL1xuICByZWFkb25seSBmcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudDtcbn1cblxuLyoqXG4gKiBBIG1lc3NhZ2UgdGhhdCBoYXMgYmVlbiBwdXQgb24gc2NyZWVuLCBhbmQgd2hlcmUgaXQgZW5kZWQgdXAuXG4gKi9cbmludGVyZmFjZSBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93bk5vdGljZSB7XG4gIC8qKlxuICAgKiBUaGUgZWxlbWVudCBob2xkaW5nIHRoaXMgbWVzc2FnZSBhbG9uZSwgaW5zaWRlIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93bk5vdGljZS5ub3RpY2V9LlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudEVsOiBIVE1MRWxlbWVudDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIG1lc3NhZ2UgY3JlYXRlZCB0aGUgbm90aWNlLCBhcyBvcHBvc2VkIHRvIGpvaW5pbmcgb25lIHRoYXQgd2FzIGFscmVhZHkgb24gc2NyZWVuLlxuICAgKiBPbmx5IHRoZSBjcmVhdG9yIG1heSBoaWRlIGl0OyBhIGpvaW5lZCBtZXNzYWdlIGNhbiBtZXJlbHkgcmVtb3ZlIGl0c2VsZi5cbiAgICovXG4gIHJlYWRvbmx5IGlzTm90aWNlT3duZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBub3RpY2UgdGhlIG1lc3NhZ2UgaXMgaW4uXG4gICAqL1xuICByZWFkb25seSBub3RpY2U6IE5vdGljZTtcbn1cblxuaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VXaXRoRHVyYXRpb25QYXJhbXMge1xuICByZWFkb25seSBkdXJhdGlvbkluTWlsbGlzZWNvbmRzOiBudWxsIHwgbnVtYmVyO1xuICByZWFkb25seSBtZXNzYWdlOiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nO1xuICByZWFkb25seSBtb2RlOiBQbHVnaW5Ob3RpY2VNb2RlO1xuICByZWFkb25seSBvbkNsb3NlQ2xpY2s6ICgoZXZlbnQ6IFBsdWdpbk5vdGljZUNsb3NlQ2xpY2tFdmVudCkgPT4gUHJvbWlzYWJsZTx2b2lkPikgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IG9uSGlkZTogKChpbmZvOiBQbHVnaW5Ob3RpY2VIaWRlSW5mbykgPT4gUHJvbWlzYWJsZTx2b2lkPikgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IHJlcXVpcmVzRXhwbGljaXRDbG9zZTogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc2hvdWxkUmVnaXN0ZXJBc1Blcm1hbmVudDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uOiBib29sZWFuO1xufVxuXG4vKipcbiAqIE1hbmFnZXMgc2hvd2luZyBwbHVnaW4gbm90aWNlcy4gQnkgZGVmYXVsdCBhIG5ldyBub3RpY2UgaGlkZXMgdGhlIHByZXZpb3VzIG9uZSwgc28gb25seSB0aGUgbGF0ZXN0XG4gKiBtZXNzYWdlIGlzIG9uIHNjcmVlbjsge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm1vZGV9IGNob29zZXMgb3RoZXJ3aXNlIFx1MjAxNCBzZWVcbiAqIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlfS5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsdWdpbk5vdGljZUNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gbmFtZSAoc2hvd24gYXMgcHJlZml4IGluIG5vdGljZXMpLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IGNsb3NlQnV0dG9uQ2xpY2tlZE5vdGljZXMgPSBuZXcgV2Vha1NldDxOb3RpY2U+KCk7XG4gIHByaXZhdGUgbm90aWNlOiBOb3RpY2UgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBwZW5kaW5nVGltZXJDYW5jZWxsYXRpb25zID0gbmV3IFNldDwoKSA9PiB2b2lkPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YW5kYWxvbmVOb3RpY2VzID0gbmV3IFNldDxOb3RpY2U+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdXNlckNsaWNrZWROb3RpY2VzID0gbmV3IFdlYWtTZXQ8Tm90aWNlPigpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHBsdWdpbiBub3RpY2UgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBQbHVnaW5Ob3RpY2VDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMucGx1Z2luTmFtZSA9IHBhcmFtcy5wbHVnaW5OYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc21pc3NlcyB0aGUgcGVybWFuZW50IG5vdGljZSBsZWZ0IG92ZXIgZnJvbSBhIHByZXZpb3VzIGxvYWQgKGUuZy4gYSBwcmV2aW91cyBwbHVnaW4gc2Vzc2lvbikgb24gbG9hZC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgc3VwZXIub25sb2FkKCk7XG4gICAgY29uc3QgcGVybWFuZW50Tm90aWNlID0gdGhpcy5nZXRQZXJtYW5lbnROb3RpY2UoKTtcbiAgICBwZXJtYW5lbnROb3RpY2U/LmhpZGUoKTtcbiAgICB0aGlzLnNldFBlcm1hbmVudE5vdGljZShudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRlcyB0aGUgY3VycmVudCBub3RpY2Ugb24gdW5sb2FkLCB1bmxlc3MgaXQgaXMgdGhlIHBlcm1hbmVudCBub3RpY2UgKHdoaWNoIGlzIG1lYW50IHRvIG91dGxpdmUgdGhlIHBsdWdpbikuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb251bmxvYWQoKTogdm9pZCB7XG4gICAgLy8gQ2FuY2VsIGFueSBkZWxheWVkIG5vdGljZSB3aG9zZSB0aW1lciBoYXMgbm90IGZpcmVkIHlldCwgc28gaXQgbmV2ZXIgYXBwZWFycyBhZnRlciB1bmxvYWQuXG4gICAgZm9yIChjb25zdCBjYW5jZWxQZW5kaW5nVGltZXIgb2Ygc25hcHNob3QodGhpcy5wZW5kaW5nVGltZXJDYW5jZWxsYXRpb25zKSkge1xuICAgICAgY2FuY2VsUGVuZGluZ1RpbWVyKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmdldFBlcm1hbmVudE5vdGljZSgpICE9PSB0aGlzLm5vdGljZSkge1xuICAgICAgdGhpcy5ub3RpY2U/LmhpZGUoKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzdGFuZGFsb25lTm90aWNlIG9mIHRoaXMuc3RhbmRhbG9uZU5vdGljZXMpIHtcbiAgICAgIHN0YW5kYWxvbmVOb3RpY2UuaGlkZSgpO1xuICAgIH1cbiAgICB0aGlzLnN0YW5kYWxvbmVOb3RpY2VzLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGxheXMgYSBub3RpY2UgbWVzc2FnZSB0byB0aGUgdXNlci5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0byBkaXNwbGF5LlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciBkaXNwbGF5aW5nIHRoZSBub3RpY2UuXG4gICAqIEByZXR1cm5zIFRoZSBub3RpY2Ugb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIHNob3dOb3RpY2UobWVzc2FnZTogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZywgb3B0aW9ucz86IFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zKTogTm90aWNlIHtcbiAgICBjb25zdCBpc1Blcm1hbmVudCA9IG9wdGlvbnM/LmlzUGVybWFuZW50ID8/IGZhbHNlO1xuICAgIGNvbnN0IHNob3VsZEhpZGVPbkNsaWNrID0gb3B0aW9ucz8uc2hvdWxkSGlkZU9uQ2xpY2sgPz8gdHJ1ZTtcbiAgICBjb25zdCByZXF1aXJlc0V4cGxpY2l0Q2xvc2UgPSAhc2hvdWxkSGlkZU9uQ2xpY2s7XG4gICAgY29uc3QgbW9kZSA9IG9wdGlvbnM/Lm1vZGUgPz8gKHJlcXVpcmVzRXhwbGljaXRDbG9zZSA/IFBsdWdpbk5vdGljZU1vZGUuU2VwYXJhdGUgOiBQbHVnaW5Ob3RpY2VNb2RlLlJlcGxhY2UpO1xuXG4gICAgaWYgKG9wdGlvbnM/Lm1vZGUgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLm1vZGUgIT09IFBsdWdpbk5vdGljZU1vZGUuU2VwYXJhdGUgJiYgcmVxdWlyZXNFeHBsaWNpdENsb3NlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Egbm90aWNlIHRoYXQgZG9lcyBub3QgaGlkZSBvbiBjbGljayBtdXN0IGJlIHNob3duIGluIHRoZSBzZXBhcmF0ZSBtb2RlLicpO1xuICAgIH1cbiAgICBpZiAobW9kZSA9PT0gUGx1Z2luTm90aWNlTW9kZS5TZXBhcmF0ZSAmJiBpc1Blcm1hbmVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIHBlcm1hbmVudCBub3RpY2UgY2Fubm90IGJlIHNob3duIGluIHRoZSBzZXBhcmF0ZSBtb2RlLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGR1cmF0aW9uSW5NaWxsaXNlY29uZHMgPSBpc1Blcm1hbmVudCB8fCByZXF1aXJlc0V4cGxpY2l0Q2xvc2UgPyBQRVJNQU5FTlRfTk9USUNFX0RVUkFUSU9OX0lOX01JTExJU0VDT05EUyA6IG51bGw7XG4gICAgcmV0dXJuIHRoaXMuc2hvd05vdGljZVdpdGhEdXJhdGlvbih7XG4gICAgICBkdXJhdGlvbkluTWlsbGlzZWNvbmRzLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIG1vZGUsXG4gICAgICBvbkNsb3NlQ2xpY2s6IG9wdGlvbnM/Lm9uQ2xvc2VDbGljayxcbiAgICAgIG9uSGlkZTogb3B0aW9ucz8ub25IaWRlLFxuICAgICAgcmVxdWlyZXNFeHBsaWNpdENsb3NlLFxuICAgICAgc2hvdWxkUmVnaXN0ZXJBc1Blcm1hbmVudDogaXNQZXJtYW5lbnQsXG4gICAgICBzaG91bGRTaG93Q2xvc2VCdXR0b246IG9wdGlvbnM/LnNob3VsZFNob3dDbG9zZUJ1dHRvbiA/PyB0cnVlXG4gICAgfSkubm90aWNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3dzIGEgbm90aWNlIGRlc2NyaWJpbmcgYSBsb25nLXJ1bm5pbmcgb3BlcmF0aW9uLCBidXQgb25seSBvbmNlIHRoZSBvcGVyYXRpb24gaGFzIHJ1biBmb3IgbG9uZ2VyXG4gICAqIHRoYW4ge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VBZnRlckRlbGF5UGFyYW1zLmRlbGF5SW5NaWxsaXNlY29uZHN9IFx1MjAxNCBzbyBvcGVyYXRpb25zXG4gICAqIHRoYXQgZmluaXNoIHNvb25lciBuZXZlciBmbGFzaCBhIG5vdGljZS4gVGhlIG5vdGljZSBzdGF5cyB1bnRpbCB0aGUgcmV0dXJuZWQge0BsaW5rIERpc3Bvc2FibGV9IGlzXG4gICAqIGRpc3Bvc2VkICh3aGljaCBhbHNvIGNhbmNlbHMgdGhlIHBlbmRpbmcgdGltZXIgaWYgaXQgaGFzIG5vdCBmaXJlZCB5ZXQpLCBzbyBpdCBjYW4gYmUgdXNlZCB3aXRoXG4gICAqIGB1c2luZ2AuIFdoZW4gYW4ge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VBZnRlckRlbGF5UGFyYW1zLmFib3J0Q29udHJvbGxlcn0gaXMgZ2l2ZW4sIGFcbiAgICogQ2FuY2VsIGJ1dHRvbiB0aGF0IGFib3J0cyBpdCBpcyBhcHBlbmRlZCAoYW5kLCBiZWluZyBpbnRlcmFjdGl2ZSwgZG9lcyBub3QgZGlzbWlzcyB0aGUgbm90aWNlKS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogdXNpbmcgX25vdGljZSA9IHBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlQWZ0ZXJEZWxheSh7XG4gICAqICAgYWJvcnRDb250cm9sbGVyLFxuICAgKiAgIGNvbnRlbnQ6ICgpID0+IGJ1aWxkUHJvZ3Jlc3NGcmFnbWVudCgpXG4gICAqIH0pO1xuICAgKiBhd2FpdCBydW5PcGVyYXRpb24oYWJvcnRDb250cm9sbGVyLnNpZ25hbCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudERlbGF5ZWROb3RpY2V9IHRoYXQgaGlkZXMgdGhlIG5vdGljZSAob3IgY2FuY2VscyB0aGUgcGVuZGluZ1xuICAgKiB0aW1lcikgd2hlbiBkaXNwb3NlZCBhbmQgbGV0cyB0aGUgY29udGVudCBiZSB1cGRhdGVkIHdoaWxlIGl0IGlzIHNob3duLlxuICAgKi9cbiAgcHVibGljIHNob3dOb3RpY2VBZnRlckRlbGF5KHBhcmFtczogUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZUFmdGVyRGVsYXlQYXJhbXMpOiBQbHVnaW5Ob3RpY2VDb21wb25lbnREZWxheWVkTm90aWNlIHtcbiAgICBjb25zdCBtb2RlID0gcGFyYW1zLm1vZGUgPz8gUGx1Z2luTm90aWNlTW9kZS5SZXBsYWNlO1xuICAgIC8vIFdoZXJlIHRoaXMgbWVzc2FnZSBlbmRlZCB1cDogYSBub3RpY2Ugb2YgaXRzIG93biwgb3IgYSBjaHVuayBpbnNpZGUgb25lIHRoYXQgd2FzIGFscmVhZHkgdXAuIEl0XG4gICAgLy8gZGVjaWRlcyB3aGF0IGBzZXRDb250ZW50YCByZXdyaXRlcyBhbmQgd2hhdCBkaXNwb3NpbmcgdGFrZXMgYXdheS5cbiAgICBsZXQgc2hvd246IG51bGwgfCBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93bk5vdGljZSA9IG51bGw7XG4gICAgbGV0IGlzRGlzcG9zZWQgPSBmYWxzZTtcbiAgICBsZXQgdGltZXJJZCA9IDA7XG4gICAgbGV0IGN1cnJlbnRDb250ZW50OiBWYWx1ZVByb3ZpZGVyPERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc+ID0gcGFyYW1zLmNvbnRlbnQ7XG5cbiAgICBjb25zdCBjYW5jZWxQZW5kaW5nVGltZXIgPSAoKTogdm9pZCA9PiB7XG4gICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgICAgdGhpcy5wZW5kaW5nVGltZXJDYW5jZWxsYXRpb25zLmRlbGV0ZShjYW5jZWxQZW5kaW5nVGltZXIpO1xuICAgIH07XG5cbiAgICBjb25zdCBidWlsZERlbGF5ZWRNZXNzYWdlID0gKGNvbnRlbnQ6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmcpOiBEb2N1bWVudEZyYWdtZW50ID0+XG4gICAgICB0aGlzLmJ1aWxkRGVsYXllZE5vdGljZU1lc3NhZ2Uobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFBsdWdpbk5vdGljZUNvbXBvbmVudEJ1aWxkRGVsYXllZE5vdGljZU1lc3NhZ2VQYXJhbXM+KHtcbiAgICAgICAgYWJvcnRDb250cm9sbGVyOiBwYXJhbXMuYWJvcnRDb250cm9sbGVyLFxuICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiBwYXJhbXMuY2FuY2VsQnV0dG9uVGV4dCxcbiAgICAgICAgY29udGVudFxuICAgICAgfSkpO1xuXG4gICAgdGltZXJJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNhbmNlbFBlbmRpbmdUaW1lcigpO1xuICAgICAgaW52b2tlQXN5bmNTYWZlbHkoYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBSZXNvbHZpbmcgdGhlIGNvbnRlbnQgaXMgYXN5bmNocm9ub3VzLCBhbmQgdGhlIG9wZXJhdGlvbiB0aGUgbm90aWNlIGRlc2NyaWJlcyBrZWVwcyBydW5uaW5nXG4gICAgICAgIC8vIHdoaWxlIGl0IGhhcHBlbnMgXHUyMDE0IHNvIGBzZXRDb250ZW50YCBjYW4gbGFuZCBpbiBiZXR3ZWVuLiBJdCBjYW5ub3QgcmV3cml0ZSBhIG5vdGljZSB0aGF0IGRvZXNcbiAgICAgICAgLy8gbm90IGV4aXN0IHlldCwgc28gcmVzb2x2ZSBhZ2FpbiB3aGVuZXZlciB0aGF0IGhhcHBlbnM6IHRoZSBub3RpY2UgbXVzdCBvcGVuIHdpdGggdGhlIG1lc3NhZ2VcbiAgICAgICAgLy8gdGhlIGNhbGxlciBsYXN0IGFza2VkIGZvciwgbm90IHRoZSBvbmUgdGhhdCB3YXMgY3VycmVudCB3aGVuIHJlc29sdXRpb24gc3RhcnRlZC5cbiAgICAgICAgbGV0IHJlcXVlc3RlZENvbnRlbnQ6IFZhbHVlUHJvdmlkZXI8RG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZz47XG4gICAgICAgIGxldCByZXNvbHZlZENvbnRlbnQ6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICByZXF1ZXN0ZWRDb250ZW50ID0gY3VycmVudENvbnRlbnQ7XG4gICAgICAgICAgcmVzb2x2ZWRDb250ZW50ID0gYXdhaXQgcmVzb2x2ZVZhbHVlKHJlcXVlc3RlZENvbnRlbnQsIHt9KTtcbiAgICAgICAgICAvLyBUaGUgaGFuZGxlIG1heSBoYXZlIGJlZW4gZGlzcG9zZWQgd2hpbGUgdGhlIGNvbnRlbnQgd2FzIGJlaW5nIHJlc29sdmVkOyBkb24ndCBzaG93IGEgc3RhbGUgbm90aWNlLlxuICAgICAgICAgIGlmIChpc0Rpc3Bvc2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChyZXF1ZXN0ZWRDb250ZW50ICE9PSBjdXJyZW50Q29udGVudCk7XG5cbiAgICAgICAgc2hvd24gPSB0aGlzLnNob3dOb3RpY2VXaXRoRHVyYXRpb24oe1xuICAgICAgICAgIGR1cmF0aW9uSW5NaWxsaXNlY29uZHM6IFBFUk1BTkVOVF9OT1RJQ0VfRFVSQVRJT05fSU5fTUlMTElTRUNPTkRTLFxuICAgICAgICAgIG1lc3NhZ2U6IGJ1aWxkRGVsYXllZE1lc3NhZ2UocmVzb2x2ZWRDb250ZW50KSxcbiAgICAgICAgICBtb2RlLFxuICAgICAgICAgIG9uQ2xvc2VDbGljazogdW5kZWZpbmVkLFxuICAgICAgICAgIG9uSGlkZTogdW5kZWZpbmVkLFxuICAgICAgICAgIHJlcXVpcmVzRXhwbGljaXRDbG9zZTogZmFsc2UsXG4gICAgICAgICAgc2hvdWxkUmVnaXN0ZXJBc1Blcm1hbmVudDogZmFsc2UsXG4gICAgICAgICAgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSwgcGFyYW1zLmRlbGF5SW5NaWxsaXNlY29uZHMgPz8gREVGQVVMVF9ERUxBWV9CRUZPUkVfU0hPV19JTl9NSUxMSVNFQ09ORFMpO1xuXG4gICAgdGhpcy5wZW5kaW5nVGltZXJDYW5jZWxsYXRpb25zLmFkZChjYW5jZWxQZW5kaW5nVGltZXIpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNldENvbnRlbnQ6IChjb250ZW50OiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgICAgIGN1cnJlbnRDb250ZW50ID0gY29udGVudDtcbiAgICAgICAgaWYgKCFzaG93bikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBTd2FwcyBUSElTIG1lc3NhZ2UncyBlbGVtZW50IGZvciBhIGZyZXNobHkgYnVpbHQgb25lLCByYXRoZXIgdGhhbiByZXdyaXRpbmcgdGhlIHdob2xlIG5vdGljZTpcbiAgICAgICAgLy8gV2hlbiB0aGUgaGFuZGxlIGpvaW5lZCBhIG5vdGljZSB0aGF0IHdhcyBhbHJlYWR5IHVwLCB0aGUgb3RoZXIgbWVzc2FnZXMgaW4gaXQgYXJlIG5vdCBpdHMgdG9cbiAgICAgICAgLy8gb3ZlcndyaXRlLiBSZWJ1aWxkaW5nIGFsc28gcmUtYXBwbGllcyB0aGUgcHJlZml4LCB0aGUgaW50ZXJhY3RpdmUgZ3VhcmQsIGFuZCB0aGUgQ2FuY2VsIGJ1dHRvbi5cbiAgICAgICAgY29uc3QgcmVidWlsdCA9IHRoaXMuYnVpbGROb3RpY2VDb250ZW50KHtcbiAgICAgICAgICBtZXNzYWdlOiBidWlsZERlbGF5ZWRNZXNzYWdlKGNvbnRlbnQpLFxuICAgICAgICAgIHNob3VsZFByZWZpeFdpdGhQbHVnaW5OYW1lOiBzaG93bi5pc05vdGljZU93bmVkXG4gICAgICAgIH0pO1xuICAgICAgICBzaG93bi5jb250ZW50RWwucmVwbGFjZVdpdGgocmVidWlsdC5mcmFnbWVudCk7XG4gICAgICAgIHNob3duID0geyAuLi5zaG93biwgY29udGVudEVsOiByZWJ1aWx0LmNvbnRlbnRFbCB9O1xuICAgICAgfSxcbiAgICAgIFtTeW1ib2wuZGlzcG9zZV06ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaXNEaXNwb3NlZCA9IHRydWU7XG4gICAgICAgIGNhbmNlbFBlbmRpbmdUaW1lcigpO1xuICAgICAgICBpZiAoIXNob3duKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEEgbm90aWNlIHRoaXMgaGFuZGxlIG9wZW5lZCBnb2VzIGF3YXkgd2l0aCBpdDsgYSBub3RpY2UgaXQgbWVyZWx5IGpvaW5lZCBiZWxvbmdzIHRvIHdob2V2ZXJcbiAgICAgICAgLy8gb3BlbmVkIGl0LCBzbyBvbmx5IHRoaXMgbWVzc2FnZSBpcyB0YWtlbiBvdXQgb2YgaXQuXG4gICAgICAgIGlmIChzaG93bi5pc05vdGljZU93bmVkKSB7XG4gICAgICAgICAgc2hvd24ubm90aWNlLmhpZGUoKTtcbiAgICAgICAgICB0aGlzLnN0YW5kYWxvbmVOb3RpY2VzLmRlbGV0ZShzaG93bi5ub3RpY2UpO1xuICAgICAgICAgIGlmICh0aGlzLm5vdGljZSA9PT0gc2hvd24ubm90aWNlKSB7XG4gICAgICAgICAgICB0aGlzLm5vdGljZSA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNob3duLmNvbnRlbnRFbC5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kcyBhIGNsb3NlIChYKSBidXR0b24gdG8gdGhlIG5vdGljZSBjb250ZW50LiBDbGlja2luZyBpdCBmaXJlc1xuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50QXBwZW5kQ2xvc2VCdXR0b25QYXJhbXMub25DbG9zZUNsaWNrfSAod2hpY2ggbWF5IGNhbmNlbCB0aGUgY2xvc2UpOyBpZlxuICAgKiBub3QgY2FuY2VsbGVkLCBpdCBoaWRlcyB0aGUgbm90aWNlIGFuZCBkcm9wcyBpdCBmcm9tIHRoZSBzdGFuZGFsb25lLW5vdGljZSB0cmFja2luZyBzZXQuIFRoZSBoaWRlIGlzXG4gICAqIG1hcmtlZCBhcyBhIGNsb3NlLWJ1dHRvbiBjbGljayBzbyB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMub25IaWRlfSBjYW5cbiAgICogZGlzdGluZ3Vpc2ggaXQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAgICovXG4gIHByaXZhdGUgYXBwZW5kQ2xvc2VCdXR0b24ocGFyYW1zOiBQbHVnaW5Ob3RpY2VDb21wb25lbnRBcHBlbmRDbG9zZUJ1dHRvblBhcmFtcyk6IHZvaWQge1xuICAgIGNvbnN0IHsgY29udGVudEVsLCBnZXROb3RpY2UsIG9uQ2xvc2VDbGljayB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IGNsb3NlQnV0dG9uRWwgPSBjb250ZW50RWwuY3JlYXRlRWwoJ2J1dHRvbicsIHtcbiAgICAgIGF0dHI6IHsgJ2FyaWEtbGFiZWwnOiB0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMubm90aWNlcy5jbG9zZUFyaWFMYWJlbCkgfVxuICAgIH0pO1xuICAgIC8vIFJldXNlIE9ic2lkaWFuJ3MgbW9kYWwgY2xvc2UtYnV0dG9uIGNsYXNzZXMgc28gdGhpcyBidXR0b24gbWF0Y2hlcyB0aGUgbmF0aXZlIG1vZGFsIGNsb3NlIGJ1dHRvblxuICAgIC8vIChsb29rIGFuZCBob3Zlcik7IHRoZSBzdHlsZXNoZWV0IG9ubHkgcG9zaXRpb25zIGl0IGluIHRoZSBub3RpY2UgY29ybmVyLlxuICAgIGFkZFBsdWdpbkNzc0NsYXNzZXMoY2xvc2VCdXR0b25FbCwgQ3NzQ2xhc3MuUGx1Z2luTm90aWNlQ2xvc2VCdXR0b24pO1xuICAgIGNsb3NlQnV0dG9uRWwuYWRkQ2xhc3NlcyhbQ3NzQ2xhc3MuQ2xpY2thYmxlSWNvbiwgQ3NzQ2xhc3MuTW9kYWxIZWFkZXJCdXR0b25dKTtcbiAgICBzZXRJY29uKGNsb3NlQnV0dG9uRWwsICd4Jyk7XG4gICAgY2xvc2VCdXR0b25FbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgkZXZlbnQpID0+IHtcbiAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jICgpID0+IHtcbiAgICAgICAgbGV0IGlzQ2FuY2VsbGVkID0gZmFsc2U7XG4gICAgICAgIGF3YWl0IG9uQ2xvc2VDbGljaz8uKHtcbiAgICAgICAgICBjYW5jZWw6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGlzQ2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBDYW4gYmUgY2FuY2VsbGVkIGJ5IHRoZSB1c2VyLlxuICAgICAgICBpZiAoaXNDYW5jZWxsZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgbm90aWNlID0gZW5zdXJlTm9uTnVsbGFibGUoZ2V0Tm90aWNlKCkpO1xuICAgICAgICB0aGlzLmNsb3NlQnV0dG9uQ2xpY2tlZE5vdGljZXMuYWRkKG5vdGljZSk7XG4gICAgICAgIG5vdGljZS5oaWRlKCk7XG4gICAgICAgIHRoaXMuc3RhbmRhbG9uZU5vdGljZXMuZGVsZXRlKG5vdGljZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgbWVzc2FnZSB0byB0aGUgbm90aWNlIGN1cnJlbnRseSBpbiB0aGUgcGVyLXBsdWdpbiBzbG90LCBzbyBib3RoIG1lc3NhZ2VzIHN0YXkgb24gc2NyZWVuIGluIGFcbiAgICogc2luZ2xlIG5vdGljZS5cbiAgICpcbiAgICogVGhlIGFwcGVuZGVkIG1lc3NhZ2UgY2FycmllcyBubyBwbHVnaW4tbmFtZSBwcmVmaXggXHUyMDE0IHRoZSBub3RpY2UgYWxyZWFkeSBvcGVucyB3aXRoIG9uZSwgYW5kXG4gICAqIHJlcGVhdGluZyBpdCBvbiBldmVyeSBsaW5lIHJlYWRzIGFzIG5vaXNlLiBJdCBpcyB3cmFwcGVkIGxpa2UgYW55IG90aGVyIG5vdGljZSBjb250ZW50LCBzbyBhIGxpbmsgb3JcbiAgICogYnV0dG9uIGluc2lkZSBpdCBzdGlsbCBrZWVwcyB0aGUgbm90aWNlIG9wZW4gd2hlbiBjbGlja2VkLlxuICAgKlxuICAgKiBBcHBlbmRpbmcgcmVzdGFydHMgdGhlIG5vdGljZSdzIGNvdW50ZG93biAoe0BsaW5rIE5vdGljZS5zZXRBdXRvSGlkZX0pLCBzbyB0aGUgbmV3IG1lc3NhZ2UgZ2V0cyBhXG4gICAqIGZ1bGwgZHVyYXRpb24gaW5zdGVhZCBvZiBpbmhlcml0aW5nIHdoYXQgd2FzIGxlZnQgb2YgdGhlIGN1cnJlbnQgb25lIFx1MjAxNCBhIGxpbmUgYXBwZW5kZWQgYSBtb21lbnRcbiAgICogYmVmb3JlIHRoZSBub3RpY2UgZXhwaXJlcyB3b3VsZCBvdGhlcndpc2UgZmxhc2ggYW5kIHZhbmlzaC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyBUaGUge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3duTm90aWNlfSBkZXNjcmliaW5nIHRoZSBqb2luZWQgbm90aWNlLCBvciBgbnVsbGAgd2hlblxuICAgKiB0aGVyZSBpcyBub3RoaW5nIG9uIHNjcmVlbiB0byBhcHBlbmQgdG8gXHUyMDE0IHRoZSBzbG90IGlzIGVtcHR5LCBvciBpdHMgbm90aWNlIGhhcyBzaW5jZSBiZWVuIGRpc21pc3NlZFxuICAgKiBcdTIwMTQgYW5kIHRoZSBjYWxsZXIgc2hvdWxkIHNob3cgYSBuZXcgbm90aWNlIGluc3RlYWQuXG4gICAqL1xuICBwcml2YXRlIGFwcGVuZFRvQ3VycmVudE5vdGljZShwYXJhbXM6IFBsdWdpbk5vdGljZUNvbXBvbmVudEFwcGVuZFRvQ3VycmVudE5vdGljZVBhcmFtcyk6IG51bGwgfCBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93bk5vdGljZSB7XG4gICAgY29uc3QgeyBkdXJhdGlvbkluTWlsbGlzZWNvbmRzLCBtZXNzYWdlLCBvbkhpZGUsIHNob3VsZFJlZ2lzdGVyQXNQZXJtYW5lbnQgfSA9IHBhcmFtcztcbiAgICBjb25zdCBjdXJyZW50Tm90aWNlID0gdGhpcy5ub3RpY2U7XG4gICAgLy8gYGlzU2hvd25gIGlzIHRoZSBzYW1lIGNoZWNrIE9ic2lkaWFuJ3Mgb3duIGBOb3RpY2UuaGlkZWAgbWFrZXMgYmVmb3JlIGFuaW1hdGluZyBhIG5vdGljZSBhd2F5LCBzb1xuICAgIC8vIGl0IGlzIGV4YWN0bHkgXCJzdGlsbCBvbiBzY3JlZW5cIjogYSBub3RpY2UgdGhhdCBleHBpcmVkIG9yIHdhcyBkaXNtaXNzZWQgaGFzIGJlZW4gZGV0YWNoZWQuXG4gICAgaWYgKCFjdXJyZW50Tm90aWNlPy5jb250YWluZXJFbC5pc1Nob3duKCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29udGVudEVsLCBmcmFnbWVudCB9ID0gdGhpcy5idWlsZE5vdGljZUNvbnRlbnQoeyBtZXNzYWdlLCBzaG91bGRQcmVmaXhXaXRoUGx1Z2luTmFtZTogZmFsc2UgfSk7XG4gICAgY3VycmVudE5vdGljZS5tZXNzYWdlRWwuYXBwZW5kKGZyYWdtZW50KTtcbiAgICAvLyBBIGBudWxsYCBkdXJhdGlvbiBtZWFucyBcIk9ic2lkaWFuJ3Mgb3duIGRlZmF1bHRcIiwgd2hpY2ggb25seSB0aGUgY29uc3RydWN0b3IgYXBwbGllcyBcdTIwMTQgc28gcmVzdGFydFxuICAgIC8vIHRoZSBjb3VudGRvd24gd2l0aCB0aGF0IHNhbWUgZGVmYXVsdCByYXRoZXIgdGhhbiBsZWF2aW5nIHRoZSBjdXJyZW50IG9uZSBydW5uaW5nLlxuICAgIGN1cnJlbnROb3RpY2Uuc2V0QXV0b0hpZGUoZHVyYXRpb25Jbk1pbGxpc2Vjb25kcyA/PyBPQlNJRElBTl9ERUZBVUxUX05PVElDRV9EVVJBVElPTl9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIHRoaXMud2lyZU9uSGlkZShjdXJyZW50Tm90aWNlLCBvbkhpZGUpO1xuICAgIC8vIE9ubHkgZXZlciByZWdpc3RlcnMsIG5ldmVyIGNsZWFyczogdGhlIG5vdGljZSBiZWluZyBhcHBlbmRlZCB0byBtYXkgYWxyZWFkeSBiZSB0aGlzIHBsdWdpbidzXG4gICAgLy8gcGVybWFuZW50IG5vdGljZSwgYW5kIGEgbGF0ZXIgYXBwZW5kZWQgbWVzc2FnZSBpcyBubyByZWFzb24gdG8gZm9yZ2V0IHRoYXQuXG4gICAgaWYgKHNob3VsZFJlZ2lzdGVyQXNQZXJtYW5lbnQpIHtcbiAgICAgIHRoaXMuc2V0UGVybWFuZW50Tm90aWNlKGN1cnJlbnROb3RpY2UpO1xuICAgIH1cbiAgICByZXR1cm4geyBjb250ZW50RWwsIGlzTm90aWNlT3duZWQ6IGZhbHNlLCBub3RpY2U6IGN1cnJlbnROb3RpY2UgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIG1lc3NhZ2UgZm9yIGEgZGVsYXllZCBub3RpY2U6IHRoZSByZXNvbHZlZCBjb250ZW50LCBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgQ2FuY2VsXG4gICAqIGJ1dHRvbiB0aGF0IGFib3J0cyB0aGUgcHJvdmlkZWQgY29udHJvbGxlciB3aGVuIGNsaWNrZWQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgRG9jdW1lbnRGcmFnbWVudH0gaG9sZGluZyB0aGUgY29udGVudCBhbmQsIGlmIHJlcXVlc3RlZCwgYSBDYW5jZWwgYnV0dG9uLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZERlbGF5ZWROb3RpY2VNZXNzYWdlKHBhcmFtczogUGx1Z2luTm90aWNlQ29tcG9uZW50QnVpbGREZWxheWVkTm90aWNlTWVzc2FnZVBhcmFtcyk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIGNvbnN0IHsgYWJvcnRDb250cm9sbGVyLCBjYW5jZWxCdXR0b25UZXh0LCBjb250ZW50IH0gPSBwYXJhbXM7XG4gICAgY29uc3QgZnJhZ21lbnQgPSBjcmVhdGVGcmFnbWVudCgpO1xuICAgIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGZyYWdtZW50LmFwcGVuZFRleHQoY29udGVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZyYWdtZW50LmFwcGVuZChjb250ZW50KTtcbiAgICB9XG5cbiAgICBpZiAoYWJvcnRDb250cm9sbGVyKSB7XG4gICAgICAvLyBgQnV0dG9uQ29tcG9uZW50YCByZXF1aXJlcyBhbiBgSFRNTEVsZW1lbnRgIHBhcmVudCwgc28gYnVpbGQgaXQgb24gYSB0aHJvd2F3YXlcbiAgICAgIC8vIGRldGFjaGVkIGVsZW1lbnQgYW5kIG1vdmUgaXRzIGBidXR0b25FbGAgaW50byB0aGUgZnJhZ21lbnQuXG4gICAgICBjb25zdCBjYW5jZWxCdXR0b24gPSBuZXcgQnV0dG9uQ29tcG9uZW50KGNyZWF0ZURpdigpKTtcbiAgICAgIGNhbmNlbEJ1dHRvbi5zZXRCdXR0b25UZXh0KGNhbmNlbEJ1dHRvblRleHQgPz8gdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLmJ1dHRvbnMuY2FuY2VsKSk7XG4gICAgICBhZGRQbHVnaW5Dc3NDbGFzc2VzKGNhbmNlbEJ1dHRvbi5idXR0b25FbCwgQ3NzQ2xhc3MuQ2FuY2VsQnV0dG9uKTtcbiAgICAgIC8vIFRoZSBjbGljayBpcyB3aXJlZCB2aWEgYGFkZEV2ZW50TGlzdGVuZXJgIHJhdGhlciB0aGFuIGBCdXR0b25Db21wb25lbnQub25DbGlja2Agc28gaXRcbiAgICAgIC8vIGJ1YmJsZXMgdGhyb3VnaCB0aGUgaW50ZXJhY3RpdmUtZWxlbWVudCBndWFyZCAoa2VlcGluZyB0aGUgbm90aWNlIG9wZW4pIGFuZCBzdGF5c1xuICAgICAgLy8gZGlyZWN0bHkgZXhlcmNpc2FibGUgdmlhIGEgZGlzcGF0Y2hlZCBET00gZXZlbnQgaW4gdW5pdCB0ZXN0cy5cbiAgICAgIGNhbmNlbEJ1dHRvbi5idXR0b25FbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICB9KTtcbiAgICAgIGZyYWdtZW50LmFwcGVuZChjYW5jZWxCdXR0b24uYnV0dG9uRWwpO1xuICAgIH1cbiAgICByZXR1cm4gZnJhZ21lbnQ7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBub3RpY2UgY29udGVudCB3cmFwcGVkIGluIGEgY29udGFpbmVyIHRoYXQga2VlcHMgdGhlIG5vdGljZSBvcGVuIHdoZW4gYW4gaW50ZXJhY3RpdmVcbiAgICogZWxlbWVudCBpbnNpZGUgaXQgaXMgY2xpY2tlZC4gT2JzaWRpYW4gZGlzbWlzc2VzIGEgbm90aWNlIG9uIGFueSBjbGljayB0aGF0IGJ1YmJsZXMgdXAgdG8gaXRzXG4gICAqIGVsZW1lbnQ7IHRoZSBjb250YWluZXIgaW50ZXJjZXB0cyBjbGlja3Mgb3JpZ2luYXRpbmcgb24gYW4gaW50ZXJhY3RpdmUgZWxlbWVudCAoYSBsaW5rLCBidXR0b24sXG4gICAqIGlucHV0LCBldGMuKSBhbmQgc3RvcHMgdGhlbSB0aGVyZSwgc28gdGhlIGVsZW1lbnQncyBvd24gaGFuZGxlciBzdGlsbCBydW5zIGJ1dCB0aGUgbm90aWNlIHN0YXlzLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIFRoZSB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50Tm90aWNlQ29udGVudH0gaG9sZGluZyB0aGUgd3JhcHBlZCBub3RpY2UgY29udGVudC5cbiAgICovXG4gIHByaXZhdGUgYnVpbGROb3RpY2VDb250ZW50KHBhcmFtczogUGx1Z2luTm90aWNlQ29tcG9uZW50QnVpbGROb3RpY2VDb250ZW50UGFyYW1zKTogUGx1Z2luTm90aWNlQ29tcG9uZW50Tm90aWNlQ29udGVudCB7XG4gICAgY29uc3QgeyBnZXROb3RpY2UsIG1lc3NhZ2UsIG9uQ2xvc2VDbGljaywgcmVxdWlyZXNFeHBsaWNpdENsb3NlID0gZmFsc2UsIHNob3VsZFByZWZpeFdpdGhQbHVnaW5OYW1lID0gdHJ1ZSwgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uID0gdHJ1ZSB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IGZyYWdtZW50ID0gY3JlYXRlRnJhZ21lbnQoKTtcbiAgICBjb25zdCBjb250ZW50RWwgPSBmcmFnbWVudC5jcmVhdGVEaXYoKTtcbiAgICBhZGRQbHVnaW5Dc3NDbGFzc2VzKGNvbnRlbnRFbCwgQ3NzQ2xhc3MuUGx1Z2luTm90aWNlQ29udGVudCk7XG4gICAgaWYgKHNob3VsZFByZWZpeFdpdGhQbHVnaW5OYW1lKSB7XG4gICAgICBjb250ZW50RWwuYXBwZW5kKHRoaXMuYnVpbGRQcmVmaXhlZE1lc3NhZ2UobWVzc2FnZSkpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb250ZW50RWwuYXBwZW5kVGV4dChtZXNzYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGVudEVsLmFwcGVuZChtZXNzYWdlKTtcbiAgICB9XG4gICAgY29udGVudEVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCRldmVudCkgPT4ge1xuICAgICAgLy8gQSBoYXJkLXRvLWNsb3NlIG5vdGljZSBtdXN0IG5vdCBkaXNtaXNzIG9uIGFueSBzdHJheSBjbGljazsgb25seSBpdHMgY2xvc2UgYnV0dG9uIG1heSBoaWRlIGl0LlxuICAgICAgaWYgKHJlcXVpcmVzRXhwbGljaXRDbG9zZSkge1xuICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICgkZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCAmJiAkZXZlbnQudGFyZ2V0LmNsb3Nlc3QoSU5URVJBQ1RJVkVfRUxFTUVOVF9TRUxFQ1RPUikpIHtcbiAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHJlcXVpcmVzRXhwbGljaXRDbG9zZSAmJiBzaG91bGRTaG93Q2xvc2VCdXR0b24pIHtcbiAgICAgIHRoaXMuYXBwZW5kQ2xvc2VCdXR0b24obm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFBsdWdpbk5vdGljZUNvbXBvbmVudEFwcGVuZENsb3NlQnV0dG9uUGFyYW1zPih7XG4gICAgICAgIGNvbnRlbnRFbCxcbiAgICAgICAgZ2V0Tm90aWNlOiBlbnN1cmVOb25OdWxsYWJsZShnZXROb3RpY2UpLFxuICAgICAgICBvbkNsb3NlQ2xpY2tcbiAgICAgIH0pKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29udGVudEVsLCBmcmFnbWVudCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgbm90aWNlIGNvbnRlbnQsIHByZWZpeGluZyB0aGUgbWVzc2FnZSB3aXRoIHRoZSBwbHVnaW4gbmFtZSBpbiBhIHN0eWxlZCBlbGVtZW50IHNvIGl0IGlzXG4gICAqIHZpc3VhbGx5IGRpc3Rpbmd1aXNoZWQgZnJvbSB0aGUgbWVzc2FnZSBib2R5LlxuICAgKlxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgYWZ0ZXIgdGhlIHBsdWdpbiBuYW1lIHByZWZpeC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgRG9jdW1lbnRGcmFnbWVudH0gd2l0aCB0aGUgc3R5bGVkIHBsdWdpbiBuYW1lIHByZWZpeCBmb2xsb3dlZCBieSB0aGUgbWVzc2FnZS5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRQcmVmaXhlZE1lc3NhZ2UobWVzc2FnZTogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZyk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIGNvbnN0IGZyYWdtZW50ID0gY3JlYXRlRnJhZ21lbnQoKTtcbiAgICBjb25zdCBuYW1lRWwgPSBjcmVhdGVTcGFuKHsgdGV4dDogdGhpcy5wbHVnaW5OYW1lIH0pO1xuICAgIGFkZFBsdWdpbkNzc0NsYXNzZXMobmFtZUVsLCBDc3NDbGFzcy5QbHVnaW5Ob3RpY2VOYW1lKTtcbiAgICBmcmFnbWVudC5hcHBlbmQobmFtZUVsKTtcbiAgICBpZiAoIXRoaXMuX2xvYWRlZCkge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kVGV4dCgnICh1bmxvYWRlZCknKTtcbiAgICB9XG4gICAgZnJhZ21lbnQuYXBwZW5kVGV4dCgnXFxuJyk7XG4gICAgaWYgKHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kVGV4dChtZXNzYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kKG1lc3NhZ2UpO1xuICAgIH1cbiAgICByZXR1cm4gZnJhZ21lbnQ7XG4gIH1cblxuICBwcml2YXRlIGdldFBlcm1hbmVudE5vdGljZSgpOiBOb3RpY2UgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQZXJtYW5lbnROb3RpY2VzKCkuZ2V0KHRoaXMucGx1Z2luTmFtZSkgPz8gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGVybWFuZW50Tm90aWNlcygpOiBNYXA8c3RyaW5nLCBOb3RpY2U+IHtcbiAgICByZXR1cm4gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlPE1hcDxzdHJpbmcsIE5vdGljZT4+KFBFUk1BTkVOVF9OT1RJQ0VTX1NUQVRFX0tFWSwgbmV3IE1hcDxzdHJpbmcsIE5vdGljZT4oKSkudmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogTWFrZXMgYSBub3RpY2UgaGFyZCB0byBjbG9zZTogbWFya3MgaXRzIG91dGVyIGVsZW1lbnQgKHNvIHRoZSBDU1MgbmV1dHJhbGl6ZXMgaXRzIHBhZGRpbmcpIGFuZFxuICAgKiBpbnN0YWxscyBhIGNhcHR1cmUtcGhhc2UgY2xpY2sgZ3VhcmQgdGhhdCBzdG9wcyBldmVyeSBjbGljayBleGNlcHQgb24gYW4gaW50ZXJhY3RpdmUgZWxlbWVudCAoYVxuICAgKiBidXR0b24sIGxpbmssIHRoZSBjbG9zZSBidXR0b24sIGV0Yy4pIGZyb20gcmVhY2hpbmcgT2JzaWRpYW4ncyBvd24gZGlzbWlzcyBoYW5kbGVyIFx1MjAxNCBzbyBhblxuICAgKiBpbnRlcmFjdGl2ZSBjaGlsZCdzIG93biBoYW5kbGVyIHN0aWxsIHJ1bnMgd2hpbGUgYSBzdHJheSBjbGljayBjYW5ub3QgZGlzbWlzcyB0aGUgbm90aWNlLlxuICAgKlxuICAgKiBAcGFyYW0gbm90aWNlIC0gVGhlIG5vdGljZSB0byBndWFyZC5cbiAgICogQHBhcmFtIHJlcXVpcmVzRXhwbGljaXRDbG9zZSAtIFdoZXRoZXIgdGhlIG5vdGljZSByZXF1aXJlcyBleHBsaWNpdCBjbG9zZTsgd2hlbiBgZmFsc2VgLCBub3RoaW5nIGlzXG4gICAqIGluc3RhbGxlZC5cbiAgICovXG4gIHByaXZhdGUgaW5zdGFsbEV4cGxpY2l0Q2xvc2VHdWFyZHMobm90aWNlOiBOb3RpY2UsIHJlcXVpcmVzRXhwbGljaXRDbG9zZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghcmVxdWlyZXNFeHBsaWNpdENsb3NlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFRoZSBvdXRlciBgLm5vdGljZWAgZWxlbWVudCAoYGNvbnRhaW5lckVsYCkgY2FycmllcyBPYnNpZGlhbidzIGRpc21pc3Mtb24tY2xpY2sgaGFuZGxlciBhbmQgdGhlXG4gICAgLy8gcGFkZGluZyBhIHN0cmF5IGNsaWNrIGNvdWxkIGxhbmQgb247IG1hcmsgaXQgc28gdGhlIHN0eWxlc2hlZXQgZHJvcHMgdGhhdCBwYWRkaW5nLlxuICAgIGFkZFBsdWdpbkNzc0NsYXNzZXMobm90aWNlLmNvbnRhaW5lckVsLCBDc3NDbGFzcy5QbHVnaW5Ob3RpY2VSZXF1aXJlc0V4cGxpY2l0Q2xvc2UpO1xuICAgIC8vIFN0b3AgZXZlcnkgY2xpY2sgb24gdGhlIG5vdGljZSBcdTIwMTQgZXhjZXB0IG9uIGFuIGludGVyYWN0aXZlIGVsZW1lbnQgXHUyMDE0IGZyb20gcmVhY2hpbmcgT2JzaWRpYW4nc1xuICAgIC8vIGRpc21pc3MgaGFuZGxlci4gUmVnaXN0ZXJlZCBpbiB0aGUgY2FwdHVyZSBwaGFzZSBvbiB0aGUgb3V0ZXJtb3N0IGVsZW1lbnQgc28gaXQgYWx3YXlzIHJ1bnMgZmlyc3QuXG4gICAgLy8gTGV0dGluZyBhIGNsaWNrIHJlYWNoIGFuIGludGVyYWN0aXZlIGNoaWxkIChhIGJ1dHRvbiwgbGluaywgdGhlIGNsb3NlIGJ1dHRvbiwgZXRjLikgaXMgd2hhdCBrZWVwc1xuICAgIC8vIGl0cyBvd24gaGFuZGxlciB3b3JraW5nOyB0aGUgYnViYmxlLXBoYXNlIGd1YXJkIG9uIHRoZSBjb250ZW50IHdyYXBwZXIgdGhlbiBzdG9wcyB0aGF0IGNsaWNrIGZyb21cbiAgICAvLyBidWJibGluZyB1cCB0byBPYnNpZGlhbidzIGRpc21pc3MgaGFuZGxlciwgc28gdGhlIG5vdGljZSBzdGlsbCBzdGF5cyBvcGVuLlxuICAgIG5vdGljZS5jb250YWluZXJFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgkZXZlbnQpID0+IHtcbiAgICAgIGlmICgkZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCAmJiAkZXZlbnQudGFyZ2V0LmNsb3Nlc3QoSU5URVJBQ1RJVkVfRUxFTUVOVF9TRUxFQ1RPUikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH0sIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFja3MgYSBjbGljayBvbiB0aGUgbm90aWNlIHNvIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucy5vbkhpZGV9IGNhbiByZXBvcnQgYVxuICAgKiB1c2VyIGRpc21pc3NhbC4gT2JzaWRpYW4gaGlkZXMgYSBkaXNtaXNzaWJsZSBub3RpY2Ugc3luY2hyb25vdXNseSBkdXJpbmcgdGhlIGNsaWNrLCBzbyBhXG4gICAqIGNhcHR1cmUtcGhhc2UgbGlzdGVuZXIgbWFya3MgdGhlIG5vdGljZSBiZWZvcmUgdGhhdCBoaWRlIHJ1bnM7IHRoZSBtYXJrIGlzIGNsZWFyZWQgYWZ0ZXIgdGhlIGV2ZW50XG4gICAqIHNvIGEgbGF0ZXIgcHJvZ3JhbW1hdGljIGhpZGUgaXMgbm90IG1pc2F0dHJpYnV0ZWQuIEEgY2xvc2UtYnV0dG9uIGNsaWNrIGlzIHRyYWNrZWQgc2VwYXJhdGVseSAoc2VlXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnQuYXBwZW5kQ2xvc2VCdXR0b259KS5cbiAgICpcbiAgICogQHBhcmFtIG5vdGljZSAtIFRoZSBub3RpY2UgdG8gdHJhY2suXG4gICAqL1xuICBwcml2YXRlIGluc3RhbGxVc2VyQ2xpY2tUcmFja2luZyhub3RpY2U6IE5vdGljZSk6IHZvaWQge1xuICAgIG5vdGljZS5jb250YWluZXJFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIC8vIE9ic2lkaWFuIGRpc21pc3NlcyBhIGRpc21pc3NpYmxlIG5vdGljZSBzeW5jaHJvbm91c2x5IGR1cmluZyB0aGlzIGNsaWNrLCBzbyBtYXJrIGl0IG5vdyAoYmVmb3JlXG4gICAgICAvLyB0aGF0IGhpZGUgcnVucykgYW5kIGNsZWFyIGl0IG9uIHRoZSBuZXh0IG1pY3JvdGFzayBcdTIwMTQgYWZ0ZXIgYW55IHN5bmNocm9ub3VzIGRpc21pc3MsIGJ1dCBiZWZvcmUgYVxuICAgICAgLy8gbGF0ZXIgcHJvZ3JhbW1hdGljIGhpZGUsIHNvIHRoYXQgaGlkZSBpcyBub3QgbWlzYXR0cmlidXRlZCBhcyBhIHVzZXIgYWN0aW9uLlxuICAgICAgdGhpcy51c2VyQ2xpY2tlZE5vdGljZXMuYWRkKG5vdGljZSk7XG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgIHRoaXMudXNlckNsaWNrZWROb3RpY2VzLmRlbGV0ZShub3RpY2UpO1xuICAgICAgfSk7XG4gICAgfSwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRQZXJtYW5lbnROb3RpY2Uobm90aWNlOiBOb3RpY2UgfCBudWxsKTogdm9pZCB7XG4gICAgY29uc3QgbWFwID0gdGhpcy5nZXRQZXJtYW5lbnROb3RpY2VzKCk7XG4gICAgaWYgKG5vdGljZSkge1xuICAgICAgbWFwLnNldCh0aGlzLnBsdWdpbk5hbWUsIG5vdGljZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1hcC5kZWxldGUodGhpcy5wbHVnaW5OYW1lKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2hvd3MgYSBub3RpY2Ugd2l0aCB0aGUgZ2l2ZW4gZHVyYXRpb24sIHBsYWNpbmcgaXQgYWNjb3JkaW5nIHRvIGl0cyB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZX06IGFcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZU1vZGUuUmVwbGFjZX0gbm90aWNlIHRha2VzIHRoZSBwZXItcGx1Z2luIHNsb3QgKGhpZGluZyB3aGF0ZXZlciB3YXMgaW4gaXQsIGFuZFxuICAgKiBvcHRpb25hbGx5IHJlZ2lzdGVyaW5nIGFzIHRoaXMgcGx1Z2luJ3MgcGVybWFuZW50IG5vdGljZSksIGFuIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlLkFwcGVuZH0gb25lXG4gICAqIGpvaW5zIHRoZSBub3RpY2UgYWxyZWFkeSBpbiB0aGUgc2xvdCwgYW5kIGEge0BsaW5rIFBsdWdpbk5vdGljZU1vZGUuU2VwYXJhdGV9IG9uZSBpcyB0cmFja2VkIG9uIGl0c1xuICAgKiBvd24sIGxlYXZpbmcgdGhlIHNsb3QgdW50b3VjaGVkLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIFRoZSB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd25Ob3RpY2V9IGRlc2NyaWJpbmcgd2hlcmUgdGhlIG1lc3NhZ2UgZW5kZWQgdXAuXG4gICAqL1xuICBwcml2YXRlIHNob3dOb3RpY2VXaXRoRHVyYXRpb24ocGFyYW1zOiBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlV2l0aER1cmF0aW9uUGFyYW1zKTogUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd25Ob3RpY2Uge1xuICAgIGNvbnN0IHsgZHVyYXRpb25Jbk1pbGxpc2Vjb25kcywgbWVzc2FnZSwgbW9kZSwgb25DbG9zZUNsaWNrLCBvbkhpZGUsIHJlcXVpcmVzRXhwbGljaXRDbG9zZSwgc2hvdWxkUmVnaXN0ZXJBc1Blcm1hbmVudCwgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uIH0gPSBwYXJhbXM7XG4gICAgLy8gT2JzaWRpYW4ncyBgTm90aWNlYCB0cmVhdHMgYW4gb21pdHRlZCBkdXJhdGlvbiBhcyBpdHMgZGVmYXVsdCwgc28gbWFwIHRoZSBgbnVsbGAgXCJubyBleHBsaWNpdFxuICAgIC8vIGR1cmF0aW9uXCIgdmFsdWUgdG8gYHVuZGVmaW5lZGAuXG4gICAgY29uc3Qgbm90aWNlRHVyYXRpb25Jbk1pbGxpc2Vjb25kcyA9IGR1cmF0aW9uSW5NaWxsaXNlY29uZHMgPz8gdW5kZWZpbmVkO1xuXG4gICAgaWYgKG1vZGUgPT09IFBsdWdpbk5vdGljZU1vZGUuQXBwZW5kKSB7XG4gICAgICBjb25zdCBhcHBlbmRlZE5vdGljZSA9IHRoaXMuYXBwZW5kVG9DdXJyZW50Tm90aWNlKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxQbHVnaW5Ob3RpY2VDb21wb25lbnRBcHBlbmRUb0N1cnJlbnROb3RpY2VQYXJhbXM+KHtcbiAgICAgICAgZHVyYXRpb25Jbk1pbGxpc2Vjb25kcyxcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgb25IaWRlLFxuICAgICAgICBzaG91bGRSZWdpc3RlckFzUGVybWFuZW50XG4gICAgICB9KSk7XG4gICAgICBpZiAoYXBwZW5kZWROb3RpY2UpIHtcbiAgICAgICAgcmV0dXJuIGFwcGVuZGVkTm90aWNlO1xuICAgICAgfVxuICAgICAgLy8gTm90aGluZyBvbiBzY3JlZW4gdG8gYXBwZW5kIHRvLCBzbyB0aGlzIG1lc3NhZ2UgYmVjb21lcyB0aGUgc2xvdCdzIG5vdGljZSBpbnN0ZWFkLlxuICAgIH1cblxuICAgIGNvbnN0IGhhc0Nsb3NlQnV0dG9uID0gcmVxdWlyZXNFeHBsaWNpdENsb3NlICYmIHNob3VsZFNob3dDbG9zZUJ1dHRvbjtcbiAgICAvLyBUaGUgY2xvc2UgYnV0dG9uJ3MgY2xpY2sgaGFuZGxlciBuZWVkcyB0aGUgYE5vdGljZWAsIHdoaWNoIGRvZXMgbm90IGV4aXN0IHVudGlsIGl0IGlzIGJ1aWx0IGZyb21cbiAgICAvLyB0aGlzIGNvbnRlbnQ7IGNhcHR1cmUgaXQgbGF6aWx5IHZpYSBhIGhvbGRlciByZXNvbHZlZCBhdCBjbGljayB0aW1lLiBUaGUgZ2V0dGVyIGlzIGNyZWF0ZWQgb25seVxuICAgIC8vIHdoZW4gYSBjbG9zZSBidXR0b24gaXMgc2hvd24uXG4gICAgbGV0IGJ1aWx0Tm90aWNlOiBOb3RpY2UgfCBudWxsID0gbnVsbDtcbiAgICBjb25zdCB7IGNvbnRlbnRFbCwgZnJhZ21lbnQgfSA9IHRoaXMuYnVpbGROb3RpY2VDb250ZW50KG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxQbHVnaW5Ob3RpY2VDb21wb25lbnRCdWlsZE5vdGljZUNvbnRlbnRQYXJhbXM+KHtcbiAgICAgIGdldE5vdGljZTogaGFzQ2xvc2VCdXR0b24gPyAoKTogTm90aWNlIHwgbnVsbCA9PiBidWlsdE5vdGljZSA6IHVuZGVmaW5lZCxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBvbkNsb3NlQ2xpY2ssXG4gICAgICByZXF1aXJlc0V4cGxpY2l0Q2xvc2UsXG4gICAgICBzaG91bGRTaG93Q2xvc2VCdXR0b25cbiAgICB9KSk7XG5cbiAgICBpZiAobW9kZSA9PT0gUGx1Z2luTm90aWNlTW9kZS5TZXBhcmF0ZSkge1xuICAgICAgYnVpbHROb3RpY2UgPSBuZXcgTm90aWNlKGZyYWdtZW50LCBub3RpY2VEdXJhdGlvbkluTWlsbGlzZWNvbmRzKTtcbiAgICAgIHRoaXMuaW5zdGFsbEV4cGxpY2l0Q2xvc2VHdWFyZHMoYnVpbHROb3RpY2UsIHJlcXVpcmVzRXhwbGljaXRDbG9zZSk7XG4gICAgICB0aGlzLmluc3RhbGxVc2VyQ2xpY2tUcmFja2luZyhidWlsdE5vdGljZSk7XG4gICAgICB0aGlzLndpcmVPbkhpZGUoYnVpbHROb3RpY2UsIG9uSGlkZSk7XG4gICAgICB0aGlzLnN0YW5kYWxvbmVOb3RpY2VzLmFkZChidWlsdE5vdGljZSk7XG4gICAgICByZXR1cm4geyBjb250ZW50RWwsIGlzTm90aWNlT3duZWQ6IHRydWUsIG5vdGljZTogYnVpbHROb3RpY2UgfTtcbiAgICB9XG5cbiAgICB0aGlzLm5vdGljZT8uaGlkZSgpO1xuICAgIGJ1aWx0Tm90aWNlID0gbmV3IE5vdGljZShmcmFnbWVudCwgbm90aWNlRHVyYXRpb25Jbk1pbGxpc2Vjb25kcyk7XG4gICAgdGhpcy5ub3RpY2UgPSBidWlsdE5vdGljZTtcbiAgICB0aGlzLmluc3RhbGxFeHBsaWNpdENsb3NlR3VhcmRzKGJ1aWx0Tm90aWNlLCByZXF1aXJlc0V4cGxpY2l0Q2xvc2UpO1xuICAgIHRoaXMuaW5zdGFsbFVzZXJDbGlja1RyYWNraW5nKGJ1aWx0Tm90aWNlKTtcbiAgICB0aGlzLndpcmVPbkhpZGUoYnVpbHROb3RpY2UsIG9uSGlkZSk7XG5cbiAgICBpZiAoc2hvdWxkUmVnaXN0ZXJBc1Blcm1hbmVudCkge1xuICAgICAgdGhpcy5zZXRQZXJtYW5lbnROb3RpY2UoYnVpbHROb3RpY2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFBlcm1hbmVudE5vdGljZShudWxsKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29udGVudEVsLCBpc05vdGljZU93bmVkOiB0cnVlLCBub3RpY2U6IGJ1aWx0Tm90aWNlIH07XG4gIH1cblxuICAvKipcbiAgICogV3JhcHMgYSBub3RpY2UncyBgaGlkZWAgc28gdGhlIGdpdmVuIGNhbGxiYWNrIHJ1bnMgdGhlIGZpcnN0IHRpbWUgdGhlIG5vdGljZSBpcyBoaWRkZW4gXHUyMDE0IGJ5IHRoZVxuICAgKiB1c2VyLCBieSBhIHJlcGxhY2luZyBub3RpY2UsIGJ5IGl0cyBkdXJhdGlvbiBlbGFwc2luZywgb3Igb24gdW5sb2FkLiBEb2VzIG5vdGhpbmcgd2hlbiBubyBjYWxsYmFja1xuICAgKiBpcyBnaXZlbi5cbiAgICpcbiAgICogQHBhcmFtIG5vdGljZSAtIFRoZSBub3RpY2Ugd2hvc2UgYGhpZGVgIHRvIHdyYXAuXG4gICAqIEBwYXJhbSBvbkhpZGUgLSBUaGUgY2FsbGJhY2sgdG8gaW52b2tlIG9uIHRoZSBmaXJzdCBoaWRlLCBvciBgdW5kZWZpbmVkYCB0byBza2lwIHdyYXBwaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSB3aXJlT25IaWRlKG5vdGljZTogTm90aWNlLCBvbkhpZGU6ICgoaW5mbzogUGx1Z2luTm90aWNlSGlkZUluZm8pID0+IFByb21pc2FibGU8dm9pZD4pIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKCFvbkhpZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gUnVuIGBvbkhpZGVgIHRoZSBmaXJzdCB0aW1lIHRoZSBub3RpY2UgaXMgaGlkZGVuLiBBIGBvbmNlYCBwYXRjaCBvbiBgaGlkZWAgaW50ZXJjZXB0cyBleGFjdGx5IG9uZVxuICAgIC8vIGNhbGwgdGhlbiB1bmluc3RhbGxzIGl0c2VsZiAodW5sb2FkaW5nIHRoaXMgZGVkaWNhdGVkIGNvbXBvbmVudCksIHNvIHRoZXJlIGlzIG5vIG1hbnVhbFxuICAgIC8vIHNpbmdsZS1maXJlIGJvb2trZWVwaW5nIGFuZCBubyBsaW5nZXJpbmcgcGF0Y2ggb24gdGhlIHRyYW5zaWVudCBub3RpY2UuIFRoZSB1c2VyLWNsb3NlIGZsYWdzIHdlcmVcbiAgICAvLyBzZXQgYmVmb3JlIGBoaWRlKClgIHdhcyBpbnZva2VkIChzZWUgYGFwcGVuZENsb3NlQnV0dG9uYCAvIGBpbnN0YWxsVXNlckNsaWNrVHJhY2tpbmdgKSwgc28gdGhleVxuICAgIC8vIHN0aWxsIGhvbGQgd2hlbiByZWFkIGhlcmUgYWZ0ZXIgYGZhbGxiYWNrKClgLlxuICAgIGNvbnN0IHBhdGNoQ29tcG9uZW50ID0gbmV3IE1vbmtleUFyb3VuZENvbXBvbmVudCgpO1xuICAgIHBhdGNoQ29tcG9uZW50LmxvYWQoKTtcbiAgICBwYXRjaENvbXBvbmVudC5yZWdpc3Rlck1ldGhvZFBhdGNoKHtcbiAgICAgICRvYmplY3Q6IG5vdGljZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdoaWRlJyxcbiAgICAgIG9uY2U6IHRydWUsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrIH0pID0+IHtcbiAgICAgICAgZmFsbGJhY2soKTtcbiAgICAgICAgY29uc3QgaXNDbG9zZUJ1dHRvbkNsaWNrZWQgPSB0aGlzLmNsb3NlQnV0dG9uQ2xpY2tlZE5vdGljZXMuaGFzKG5vdGljZSk7XG4gICAgICAgIGNvbnN0IGlzVXNlckFjdGlvbiA9IGlzQ2xvc2VCdXR0b25DbGlja2VkIHx8IHRoaXMudXNlckNsaWNrZWROb3RpY2VzLmhhcyhub3RpY2UpO1xuICAgICAgICBpbnZva2VBc3luY1NhZmVseShhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgb25IaWRlKHsgaXNDbG9zZUJ1dHRvbkNsaWNrZWQsIGlzVXNlckFjdGlvbiB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFVQSxTQUFTLGdCQUFnQjtBQUN6QixTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLG1DQUFtQztBQUM1QyxTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLG9CQUFvQjtBQUM3QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFUCxTQUFTLGdCQUFnQjtBQUN6QixTQUFTLFNBQVM7QUFDbEIsU0FBUyxnQ0FBZ0M7QUFDekMsU0FBUywyQkFBMkI7QUFDcEMsU0FBUyxtQkFBbUI7QUFDNUIsU0FBUyw2QkFBNkI7QUFFdEMsTUFBTSw4QkFBOEI7QUFDcEMsTUFBTSw0Q0FBNEM7QUFDbEQsTUFBTSw0Q0FBNEM7QUFJbEQsTUFBTSxtREFBbUQ7QUFJekQs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
540
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvcGx1Z2luLW5vdGljZS1jb21wb25lbnQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDb21wb25lbnQgdGhhdCBtYW5hZ2VzIGRpc3BsYXlpbmcgbm90aWNlcyB0byB0aGUgdXNlci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZhbHVlUHJvdmlkZXIgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdmFsdWUtcHJvdmlkZXInO1xuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBzbmFwc2hvdCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hcnJheSc7XG5pbXBvcnQgeyBpbnZva2VBc3luY1NhZmVseSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hc3luYyc7XG5pbXBvcnQgeyBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvb2JqZWN0LXV0aWxzJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IHJlc29sdmVWYWx1ZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi92YWx1ZS1wcm92aWRlcic7XG5pbXBvcnQge1xuICBCdXR0b25Db21wb25lbnQsXG4gIE5vdGljZSxcbiAgc2V0SWNvblxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IENzc0NsYXNzIH0gZnJvbSAnLi4vY3NzLWNsYXNzLnRzJztcbmltcG9ydCB7IGFwcGVuZENvZGVCbG9jayB9IGZyb20gJy4uL2h0bWwtZWxlbWVudC50cyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi4vaTE4bi9pMThuLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSB9IGZyb20gJy4uL29ic2lkaWFuLWRldi11dGlscy1zdGF0ZS50cyc7XG5pbXBvcnQgeyBhZGRQbHVnaW5Dc3NDbGFzc2VzIH0gZnJvbSAnLi4vcGx1Z2luL3BsdWdpbi1jb250ZXh0LnRzJztcbmltcG9ydCB7IENvbXBvbmVudEV4IH0gZnJvbSAnLi9jb21wb25lbnQtZXgudHMnO1xuaW1wb3J0IHsgTW9ua2V5QXJvdW5kQ29tcG9uZW50IH0gZnJvbSAnLi9tb25rZXktYXJvdW5kLWNvbXBvbmVudC50cyc7XG5cbmNvbnN0IFBFUk1BTkVOVF9OT1RJQ0VTX1NUQVRFX0tFWSA9ICdwbHVnaW4tbm90aWNlLWNvbXBvbmVudDpwZXJtYW5lbnQtbm90aWNlcyc7XG5jb25zdCBQRVJNQU5FTlRfTk9USUNFX0RVUkFUSU9OX0lOX01JTExJU0VDT05EUyA9IDA7XG5jb25zdCBERUZBVUxUX0RFTEFZX0JFRk9SRV9TSE9XX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbi8vIE9ic2lkaWFuJ3Mgb3duIGRlZmF1bHQgbm90aWNlIGR1cmF0aW9uLCBhcHBsaWVkIGJ5IHRoZSBgTm90aWNlYCBjb25zdHJ1Y3RvciB3aGVuIG5vbmUgaXMgZ2l2ZW4uIEl0IGlzXG4vLyByZXBlYXRlZCBoZXJlIGJlY2F1c2UgcmVzdGFydGluZyB0aGUgY291bnRkb3duIG9uIGFuIGFwcGVuZCBnb2VzIHRocm91Z2ggYHNldEF1dG9IaWRlYCwgd2hpY2ggdGFrZXMgYW5cbi8vIGV4cGxpY2l0IGR1cmF0aW9uIGFuZCBzbyBjYW5ub3QgZmFsbCBiYWNrIHRvIHRoYXQgZGVmYXVsdCBpdHNlbGYuXG5jb25zdCBPQlNJRElBTl9ERUZBVUxUX05PVElDRV9EVVJBVElPTl9JTl9NSUxMSVNFQ09ORFMgPSA0MDAwO1xuXG4vLyBFbGVtZW50cyBhIHVzZXIgY2xpY2tzIHRvIGFjdCBvbiB0aGVtIHJhdGhlciB0aGFuIHRvIGRpc21pc3MgdGhlIG5vdGljZS4gQSBjbGljayBsYW5kaW5nIG9uIChvclxuLy8gaW5zaWRlKSBvbmUgb2YgdGhlc2UgaXMga2VwdCBmcm9tIGJ1YmJsaW5nIHRvIHRoZSBub3RpY2UsIHNvIHRoZSBub3RpY2Ugc3RheXMgb3Blbi5cbmNvbnN0IElOVEVSQUNUSVZFX0VMRU1FTlRfU0VMRUNUT1IgPSAnYSwgYnV0dG9uLCBpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgbGFiZWwsIFtjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCJdLCBbcm9sZT1cImJ1dHRvblwiXSwgW3JvbGU9XCJsaW5rXCJdLCBbcm9sZT1cImNoZWNrYm94XCJdLCBbcm9sZT1cInRhYlwiXSwgW3JvbGU9XCJtZW51aXRlbVwiXSc7XG5cbi8qKlxuICogSG93IGEgbmV3IG5vdGljZSByZWxhdGVzIHRvIHRoZSBwbHVnaW4ncyBjdXJyZW50IG5vdGljZSBcdTIwMTQgdGhlIG9uZSBvY2N1cHlpbmcgdGhlIHNpbmdsZSBwZXItcGx1Z2luXG4gKiBzbG90IHRoaXMgY29tcG9uZW50IGtlZXBzLlxuICpcbiAqIFJhdyBgbmV3IE5vdGljZSguLi4pYCBjYWxscyBhbHdheXMgcGlsZSB1cCwgd2hpY2ggaXMgcmFyZWx5IHdoYXQgYSBwbHVnaW4gd2FudHM6IHVzdWFsbHkgb25seSB0aGVcbiAqIGxhdGVzdCBtZXNzYWdlIG1hdHRlcnMuIFNvIHRoZSBzbG90IGV4aXN0cywgYW5kIHRoaXMgY2hvb3NlcyB3aGF0IGEgbmV3IG1lc3NhZ2UgZG9lcyB3aXRoIGl0LlxuICovXG5leHBvcnQgZW51bSBQbHVnaW5Ob3RpY2VNb2RlIHtcbiAgLyoqXG4gICAqIEFkZHMgdGhlIG1lc3NhZ2UgdG8gdGhlIGN1cnJlbnQgbm90aWNlLCBzbyBib3RoIG1lc3NhZ2VzIHN0YXkgdmlzaWJsZSBpbiBhIHNpbmdsZSBub3RpY2UgXHUyMDE0IGZvciBhXG4gICAqIHJ1bm5pbmcgYWNjb3VudCBvZiBhbiBvcGVyYXRpb24uIFRoZSBjb3VudGRvd24gcmVzdGFydHMsIHNvIGFuIGFwcGVuZGVkIG1lc3NhZ2UgaXMgcmVhZGFibGUgZm9yIGFcbiAgICogZnVsbCBkdXJhdGlvbiByYXRoZXIgdGhhbiBpbmhlcml0aW5nIHRoZSByZW1haW5zIG9mIHRoZSBjdXJyZW50IG9uZS5cbiAgICpcbiAgICogRmFsbHMgYmFjayB0byB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5SZXBsYWNlfSB3aGVuIHRoZXJlIGlzIG5vIGN1cnJlbnQgbm90aWNlIG9uIHNjcmVlbiAoaXQgd2FzXG4gICAqIG5ldmVyIHNob3duLCBvciBpdCBoYXMgc2luY2UgYmVlbiBkaXNtaXNzZWQpLlxuICAgKi9cbiAgQXBwZW5kID0gJ2FwcGVuZCcsXG5cbiAgLyoqXG4gICAqIEhpZGVzIHRoZSBjdXJyZW50IG5vdGljZSBhbmQgc2hvd3MgdGhpcyBvbmUgaW4gaXRzIHBsYWNlLCBzbyBvbmx5IHRoZSBsYXRlc3QgbWVzc2FnZSBpcyBvbiBzY3JlZW4uXG4gICAqIFRoaXMgaXMgdGhlIGRlZmF1bHQsIGFuZCB0aGUgcmVhc29uIHRoZSBzbG90IGV4aXN0cy5cbiAgICovXG4gIFJlcGxhY2UgPSAncmVwbGFjZScsXG5cbiAgLyoqXG4gICAqIFNob3dzIHRoZSBtZXNzYWdlIGFzIGl0cyBvd24gbm90aWNlLCBsZWF2aW5nIHRoZSBjdXJyZW50IG9uZSBhbG9uZTogYm90aCBhcmUgb24gc2NyZWVuLCBwaWxlZCB1cFxuICAgKiBsaWtlIHBsYWluIGBuZXcgTm90aWNlKC4uLilgIGNhbGxzLiBBIHNlcGFyYXRlIG5vdGljZSBuZXZlciByZXBsYWNlcywgYW5kIGlzIG5ldmVyIHJlcGxhY2VkIGJ5LCBhXG4gICAqIHNsb3Qgbm90aWNlOyBhbnkgbnVtYmVyIG9mIHRoZW0gY29leGlzdC4gVGhleSBhcmUgc3RpbGwgaGlkZGVuIHRvZ2V0aGVyIG9uIHVubG9hZC5cbiAgICovXG4gIFNlcGFyYXRlID0gJ3NlcGFyYXRlJ1xufVxuXG4vKipcbiAqIFRoZSBldmVudCBwYXNzZWQgdG8ge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm9uQ2xvc2VDbGlja30gd2hlbiB0aGUgbm90aWNlJ3NcbiAqIGNsb3NlIChYKSBidXR0b24gaXMgY2xpY2tlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5Ob3RpY2VDbG9zZUNsaWNrRXZlbnQge1xuICAvKipcbiAgICogQ2FuY2VscyB0aGUgY2xvc2UsIGxlYXZpbmcgdGhlIG5vdGljZSBvcGVuLlxuICAgKi9cbiAgY2FuY2VsOiAoKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIEEgaGFuZGxlIHRvIGEgZGVsYXllZCBub3RpY2UgY3JlYXRlZCBieSB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2VBZnRlckRlbGF5fS4gSXQgaXMgYVxuICoge0BsaW5rIERpc3Bvc2FibGV9IChzbyBpdCBjYW4gYmUgdXNlZCB3aXRoIGB1c2luZ2ApIHRoYXQgYWxzbyBsZXRzIHRoZSBjb250ZW50IGJlIHVwZGF0ZWQgd2hpbGUgdGhlXG4gKiBub3RpY2UgaXMgc2hvd24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50RGVsYXllZE5vdGljZSBleHRlbmRzIERpc3Bvc2FibGUge1xuICAvKipcbiAgICogUmVwbGFjZXMgdGhpcyBoYW5kbGUncyBtZXNzYWdlLCByZS1hcHBseWluZyB0aGUgcGx1Z2luLW5hbWUgcHJlZml4LCB0aGUgaW50ZXJhY3RpdmUtY2xpY2sgZ3VhcmQsIGFuZFxuICAgKiB0aGUgQ2FuY2VsIGJ1dHRvbi4gVXNlZnVsIGZvciByZXBvcnRpbmcgcHJvZ3Jlc3MuIElmIHRoZSBkZWxheSBoYXMgbm90IGVsYXBzZWQgeWV0LCB0aGUgbmV3IGNvbnRlbnRcbiAgICogYmVjb21lcyB3aGF0IGlzIHNob3duIG9uY2UgaXQgZG9lcy5cbiAgICpcbiAgICogT25seSB0aGlzIGhhbmRsZSdzIG93biBtZXNzYWdlIGlzIHJld3JpdHRlbjogd2hlbiB0aGUgbm90aWNlIHdhcyBqb2luZWQgcmF0aGVyIHRoYW4gb3BlbmVkIChzZWVcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VBZnRlckRlbGF5UGFyYW1zLm1vZGV9KSwgdGhlIG1lc3NhZ2VzIGFscmVhZHkgaW4gaXQgYXJlIGxlZnRcbiAgICogYWxvbmUuXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZW50IC0gVGhlIG5ldyBub3RpY2UgY29udGVudC5cbiAgICovXG4gIHNldENvbnRlbnQ6IChjb250ZW50OiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZUFmdGVyRGVsYXl9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VBZnRlckRlbGF5UGFyYW1zIHtcbiAgLyoqXG4gICAqIFdoZW4gcHJvdmlkZWQsIGEgQ2FuY2VsIGJ1dHRvbiBpcyBhcHBlbmRlZCB0byB0aGUgbm90aWNlOyBjbGlja2luZyBpdCBhYm9ydHMgdGhpcyBjb250cm9sbGVyLiBXaGVuXG4gICAqIG9taXR0ZWQsIG5vIENhbmNlbCBidXR0b24gaXMgc2hvd24uXG4gICAqL1xuICByZWFkb25seSBhYm9ydENvbnRyb2xsZXI/OiBBYm9ydENvbnRyb2xsZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXh0IG9mIHRoZSBDYW5jZWwgYnV0dG9uIHNob3duIHdoZW4ge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VBZnRlckRlbGF5UGFyYW1zLmFib3J0Q29udHJvbGxlcn1cbiAgICogaXMgcHJvdmlkZWQuIFdoZW4gb21pdHRlZCwgdGhlIGxvY2FsaXplZCBgQ2FuY2VsYCBsYWJlbCBpcyB1c2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FuY2VsQnV0dG9uVGV4dD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5vdGljZSBjb250ZW50LCByZXNvbHZlZCBsYXppbHkgb25seSBpZiB0aGUgZGVsYXkgZWxhcHNlcyBcdTIwMTQgc28gYW4gb3BlcmF0aW9uIHRoYXQgZmluaXNoZXNcbiAgICogc29vbmVyIG5ldmVyIGJ1aWxkcyBpdC5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IFZhbHVlUHJvdmlkZXI8RG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZz47XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nIHRoZSBvcGVyYXRpb24gbXVzdCBydW4gYmVmb3JlIHRoZSBub3RpY2UgaXMgc2hvd24uIE9wZXJhdGlvbnMgdGhhdCBmaW5pc2ggc29vbmVyIG5ldmVyXG4gICAqIHNob3cgYSBub3RpY2UsIGF2b2lkaW5nIGEgZGlzdHJhY3RpbmcgZmxhc2guXG4gICAqXG4gICAqIEBkZWZhdWx0IGA1MDBgXG4gICAqL1xuICByZWFkb25seSBkZWxheUluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBIb3cgdGhpcyBub3RpY2UgcmVsYXRlcyB0byB0aGUgcGx1Z2luJ3MgY3VycmVudCBub3RpY2UgXHUyMDE0IHNlZSB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZX0uXG4gICAqXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlLlNlcGFyYXRlfSBpcyB3b3J0aCBjb25zaWRlcmluZyBmb3IgYSBsb25nIG9wZXJhdGlvbjogb24gdGhlIGRlZmF1bHRcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZU1vZGUuUmVwbGFjZX0gdGhlIHByb2dyZXNzIG5vdGljZSB0YWtlcyB0aGUgc2hhcmVkIHNsb3QsIHNvIGFueSBvcmRpbmFyeSBub3RpY2VcbiAgICogcmFpc2VkIHdoaWxlIHRoZSBvcGVyYXRpb24gcnVucyBoaWRlcyBpdCwgYW5kIHRoZSBwcm9ncmVzcyB0aGUgdXNlciB3YXMgd2F0Y2hpbmcgZG9lcyBub3QgY29tZSBiYWNrLlxuICAgKlxuICAgKiBXaGljaGV2ZXIgbW9kZSBpcyB1c2VkLCB0aGUgcmV0dXJuZWQgaGFuZGxlIG93bnMgb25seSBJVFMgbWVzc2FnZTogdXBkYXRpbmcgdGhlIGNvbnRlbnQgcmV3cml0ZXNcbiAgICogdGhhdCBtZXNzYWdlIGFsb25lLCBhbmQgZGlzcG9zaW5nIHRha2VzIGF3YXkgb25seSB0aGF0IG1lc3NhZ2Ugd2hlbiB0aGUgbm90aWNlIHdhcyBhbHJlYWR5IG9uXG4gICAqIHNjcmVlbiAoYSBub3RpY2UgdGhpcyBoYW5kbGUgb3BlbmVkIGlzIGhpZGRlbiBhcyBhIHdob2xlKS5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIFBsdWdpbk5vdGljZU1vZGUuUmVwbGFjZX1cbiAgICovXG4gIHJlYWRvbmx5IG1vZGU/OiBQbHVnaW5Ob3RpY2VNb2RlO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgbm90aWNlIHNob3VsZCBzdGF5IHVudGlsIGl0IGlzIHJlcGxhY2VkLCB0aGUgcGx1Z2luIGlzIHJlbG9hZGVkLCBvciB0aGUgdXNlciBkaXNtaXNzZXMgaXQuXG4gICAqXG4gICAqIEEgcGVybWFuZW50IG5vdGljZSBpcyBzaG93biB3aXRoIGFuIGluZmluaXRlIGR1cmF0aW9uIGFuZCBpcyBub3QgaGlkZGVuIHdoZW4gdGhlIGNvbXBvbmVudCB1bmxvYWRzLCBzbyBpdCBjYW5cbiAgICogY29tbXVuaWNhdGUgc3RhdGUgdGhhdCBvdXRsaXZlcyB0aGUgcGx1Z2luIChlLmcuIGEgY2xlYW51cCB0aGF0IHJlcXVpcmVzIGEgcmVsb2FkKS4gVGhlcmUgaXMgYXQgbW9zdCBvbmUgcGVybWFuZW50XG4gICAqIG5vdGljZSBwZXIgcGx1Z2luOiBpdCBpcyBoaWRkZW4gYnkgdGhlIG5leHQge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlfSBjYWxsIGFuZCBkaXNtaXNzZWRcbiAgICogYXV0b21hdGljYWxseSB0aGUgbmV4dCB0aW1lIHRoZSBjb21wb25lbnQgbG9hZHMgKGkuZS4gd2hlbiB0aGUgcGx1Z2luIGlzIHJlLWVuYWJsZWQpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBpc1Blcm1hbmVudD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEhvdyB0aGlzIG5vdGljZSByZWxhdGVzIHRvIHRoZSBwbHVnaW4ncyBjdXJyZW50IG5vdGljZSBcdTIwMTQgc2VlIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlfS5cbiAgICpcbiAgICogQSBwZXJtYW5lbnQgbm90aWNlIGNhbm5vdCBiZSB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5TZXBhcmF0ZX0gKGl0IG5lZWRzIHRoZSBzaGFyZWQgc2xvdCBpdCBpc1xuICAgKiB0cmFja2VkIGluKSwgYW5kIGEgbm90aWNlIHRoYXQgZG9lcyBub3QgaGlkZSBvbiBjbGljayBtdXN0IGJlXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlLlNlcGFyYXRlfSAoc28gYSBsYXRlciBub3RpY2UgbmV2ZXIgc2lsZW50bHkgcmVwbGFjZXMgaXQpOyBlaXRoZXJcbiAgICogY29udHJhZGljdGlvbiB0aHJvd3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlLlJlcGxhY2V9LCBvciB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5TZXBhcmF0ZX0gd2hlblxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMuc2hvdWxkSGlkZU9uQ2xpY2t9IGlzIGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IG1vZGU/OiBQbHVnaW5Ob3RpY2VNb2RlO1xuXG4gIC8qKlxuICAgKiBBIGNhbGxiYWNrIGludm9rZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIGNsb3NlIChYKSBidXR0b24sIGJlZm9yZSB0aGUgbm90aWNlIGlzIGhpZGRlbi4gQ2FsbFxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlQ2xvc2VDbGlja0V2ZW50LmNhbmNlbH0gb24gdGhlIGV2ZW50IHRvIGNhbmNlbCB0aGUgY2xvc2UgYW5kIGtlZXAgdGhlIG5vdGljZVxuICAgKiBvcGVuIFx1MjAxNCBmb3IgZXhhbXBsZSBhZnRlciB5b3VyIG93biBjb25maXJtYXRpb24gZGVjbGluZXMuIEFuIGFzeW5jIGNhbGxiYWNrIGlzIGF3YWl0ZWQgYmVmb3JlIHRoZVxuICAgKiBub3RpY2UgaXMgaGlkZGVuLiBSdW5zIG9ubHkgd2hlbiBhIGNsb3NlIGJ1dHRvbiBpcyBzaG93biAoYm90aFxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMuc2hvdWxkSGlkZU9uQ2xpY2t9IGA9IGZhbHNlYCBhbmRcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLnNob3VsZFNob3dDbG9zZUJ1dHRvbn0gYXJlIHNldCkuXG4gICAqL1xuICByZWFkb25seSBvbkNsb3NlQ2xpY2s/OiAoZXZlbnQ6IFBsdWdpbk5vdGljZUNsb3NlQ2xpY2tFdmVudCkgPT4gUHJvbWlzYWJsZTx2b2lkPjtcblxuICAvKipcbiAgICogQSBjYWxsYmFjayBpbnZva2VkIHdoZW4gdGhlIG5vdGljZSBpcyBoaWRkZW4gXHUyMDE0IHdoZXRoZXIgYnkgdGhlIHVzZXIgY2xvc2luZyBpdCwgYnkgYSBsYXRlciByZXVzYWJsZVxuICAgKiBub3RpY2UgcmVwbGFjaW5nIGl0LCBieSBpdHMgZHVyYXRpb24gZWxhcHNpbmcsIG9yIG9uIGNvbXBvbmVudCB1bmxvYWQuIEl0IHJ1bnMgYXQgbW9zdCBvbmNlIHBlclxuICAgKiBub3RpY2UuIFRoZSB7QGxpbmsgUGx1Z2luTm90aWNlSGlkZUluZm99IGFyZ3VtZW50IGRpc3Rpbmd1aXNoZXMgYSB1c2VyIGNsb3NlICh0aGUgY2xvc2UgYnV0dG9uKSBmcm9tXG4gICAqIGEgcHJvZ3JhbW1hdGljIGhpZGUuIEFuIGFzeW5jIGNhbGxiYWNrIGlzIHJ1biBmaXJlLWFuZC1mb3JnZXQgKGl0cyByZWplY3Rpb24gc3VyZmFjZXMgdGhyb3VnaCB0aGVcbiAgICogYXN5bmMtZXJyb3IgcGlwZWxpbmUpLlxuICAgKi9cbiAgcmVhZG9ubHkgb25IaWRlPzogKGluZm86IFBsdWdpbk5vdGljZUhpZGVJbmZvKSA9PiBQcm9taXNhYmxlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGNsaWNraW5nIHRoZSBub3RpY2UgaGlkZXMgaXQuIFdoZW4gYHRydWVgICh0aGUgZGVmYXVsdCksIHRoZSBub3RpY2UgZGlzbWlzc2VzIG9uIGNsaWNrIGxpa2VcbiAgICogYSBub3JtYWwgT2JzaWRpYW4gbm90aWNlLiBXaGVuIGBmYWxzZWAsIHRoZSBub3RpY2UgaXMgaGFyZCB0byBjbG9zZTogaXQgZG9lcyBub3QgZGlzbWlzcyBvbiBhbnkgc3RyYXlcbiAgICogY2xpY2ssIGFuZCBpbnN0ZWFkIHNob3dzIGEgY2xvc2UgKFgpIGJ1dHRvbiB0aGF0IGhpZGVzIGl0IGRpcmVjdGx5IChzZWVcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLnNob3VsZFNob3dDbG9zZUJ1dHRvbn0gYW5kXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucy5vbkNsb3NlQ2xpY2t9KS5cbiAgICpcbiAgICogQSBgc2hvdWxkSGlkZU9uQ2xpY2s6IGZhbHNlYCBub3RpY2UgaXMgc2hvd24gd2l0aCBhbiBpbmZpbml0ZSBkdXJhdGlvbiBhbmQgc3RhbmRzIG9uIGl0cyBvd25cbiAgICogKGltcGxpZXMge0BsaW5rIFBsdWdpbk5vdGljZU1vZGUuU2VwYXJhdGV9KSwgc28gYSBsYXRlciBub3RpY2UgbmV2ZXIgc2lsZW50bHkgcmVwbGFjZXMgaXQ7IHBhc3NpbmdcbiAgICogYW55IG90aGVyIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucy5tb2RlfSB0b2dldGhlciB3aXRoIGBzaG91bGRIaWRlT25DbGljazogZmFsc2VgXG4gICAqIHRocm93cy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRIaWRlT25DbGljaz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNsb3NlIChYKSBidXR0b24gaXMgc2hvd24gb24gYSBoYXJkLXRvLWNsb3NlIG5vdGljZVxuICAgKiAoe0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLnNob3VsZEhpZGVPbkNsaWNrfSBgPSBmYWxzZWApLiBXaGVuIGBmYWxzZWAsIG5vIGNsb3NlXG4gICAqIGJ1dHRvbiBpcyByZW5kZXJlZCBhbmQgdGhlIG5vdGljZSBjYW4gb25seSBiZSBoaWRkZW4gcHJvZ3JhbW1hdGljYWxseS4gSWdub3JlZCB1bmxlc3NcbiAgICogYHNob3VsZEhpZGVPbkNsaWNrYCBpcyBgZmFsc2VgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNob3dDbG9zZUJ1dHRvbj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRGVzY3JpYmVzIHdoeSBhIG5vdGljZSB3YXMgaGlkZGVuLCBwYXNzZWQgdG8ge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm9uSGlkZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luTm90aWNlSGlkZUluZm8ge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgbm90aWNlIHdhcyBoaWRkZW4gYnkgdGhlIHVzZXIgY2xpY2tpbmcgaXRzIGNsb3NlIChYKSBidXR0b24gc3BlY2lmaWNhbGx5LiBBbHdheXMgaW1wbGllc1xuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlSGlkZUluZm8uaXNVc2VyQWN0aW9ufS5cbiAgICovXG4gIHJlYWRvbmx5IGlzQ2xvc2VCdXR0b25DbGlja2VkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBub3RpY2Ugd2FzIGhpZGRlbiBieSBhIHVzZXIgYWN0aW9uIFx1MjAxNCBjbGlja2luZyB0aGUgY2xvc2UgKFgpIGJ1dHRvbiwgb3IgY2xpY2tpbmcgYVxuICAgKiBkaXNtaXNzaWJsZSBub3RpY2UgdG8gZGlzbWlzcyBpdCBcdTIwMTQgYXMgb3Bwb3NlZCB0byBwcm9ncmFtbWF0aWNhbGx5IChhIGxhdGVyIHJldXNhYmxlIG5vdGljZSByZXBsYWNpbmdcbiAgICogaXQsIGFuIGV4cGxpY2l0IGBoaWRlKClgLCB0aGUgZHVyYXRpb24gZWxhcHNpbmcsIG9yIGNvbXBvbmVudCB1bmxvYWQpLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNVc2VyQWN0aW9uOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50QXBwZW5kQ2xvc2VCdXR0b25QYXJhbXMge1xuICByZWFkb25seSBjb250ZW50RWw6IEhUTUxFbGVtZW50O1xuICByZWFkb25seSBnZXROb3RpY2U6ICgpID0+IE5vdGljZSB8IG51bGw7XG4gIHJlYWRvbmx5IG9uQ2xvc2VDbGljaz86IChldmVudDogUGx1Z2luTm90aWNlQ2xvc2VDbGlja0V2ZW50KSA9PiBQcm9taXNhYmxlPHZvaWQ+O1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50QXBwZW5kVG9DdXJyZW50Tm90aWNlUGFyYW1zIHtcbiAgcmVhZG9ubHkgZHVyYXRpb25Jbk1pbGxpc2Vjb25kczogbnVsbCB8IG51bWJlcjtcbiAgcmVhZG9ubHkgbWVzc2FnZTogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZztcbiAgcmVhZG9ubHkgb25IaWRlPzogKGluZm86IFBsdWdpbk5vdGljZUhpZGVJbmZvKSA9PiBQcm9taXNhYmxlPHZvaWQ+O1xuICByZWFkb25seSBzaG91bGRSZWdpc3RlckFzUGVybWFuZW50OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50QnVpbGREZWxheWVkTm90aWNlTWVzc2FnZVBhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0Q29udHJvbGxlcj86IEFib3J0Q29udHJvbGxlcjtcbiAgcmVhZG9ubHkgY2FuY2VsQnV0dG9uVGV4dD86IHN0cmluZztcbiAgcmVhZG9ubHkgY29udGVudDogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNvbXBvbmVudEJ1aWxkTm90aWNlQ29udGVudFBhcmFtcyB7XG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgbm90aWNlIHRoaXMgY29udGVudCBiZWxvbmdzIHRvLCB1c2VkIGJ5IHRoZSBjbG9zZSBidXR0b24ncyBoYW5kbGVyLiBUaGUgbm90aWNlIGRvZXNcbiAgICogbm90IGV4aXN0IHlldCB3aGVuIHRoZSBjb250ZW50IGlzIGJ1aWx0LCBzbyBpdCBpcyByZXNvbHZlZCBsYXppbHkgYXQgY2xpY2sgdGltZS4gUmVxdWlyZWQgd2hlbiBhXG4gICAqIGNsb3NlIGJ1dHRvbiBpcyBzaG93bi5cbiAgICovXG4gIHJlYWRvbmx5IGdldE5vdGljZT86ICgpID0+IE5vdGljZSB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgYWZ0ZXIgdGhlIHBsdWdpbiBuYW1lIHByZWZpeC5cbiAgICovXG4gIHJlYWRvbmx5IG1lc3NhZ2U6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEludm9rZWQgd2hlbiB0aGUgY2xvc2UgYnV0dG9uIGlzIGNsaWNrZWQ7IG1heSBjYW5jZWwgdGhlIGNsb3NlLiBTZWVcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm9uQ2xvc2VDbGlja30uXG4gICAqL1xuICByZWFkb25seSBvbkNsb3NlQ2xpY2s/OiAoZXZlbnQ6IFBsdWdpbk5vdGljZUNsb3NlQ2xpY2tFdmVudCkgPT4gUHJvbWlzYWJsZTx2b2lkPjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbm90aWNlIGlzIGhhcmQgdG8gY2xvc2U6IHN0b3BzIGV2ZXJ5IGNsaWNrIGZyb20gZGlzbWlzc2luZyBpdCBhbmQsIHVubGVzcyBzdXBwcmVzc2VkIGJ5XG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRCdWlsZE5vdGljZUNvbnRlbnRQYXJhbXMuc2hvdWxkU2hvd0Nsb3NlQnV0dG9ufSwgYWRkcyBhIGNsb3NlIGJ1dHRvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgcmVxdWlyZXNFeHBsaWNpdENsb3NlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbWVzc2FnZSBpcyBwcmVmaXhlZCB3aXRoIHRoZSBwbHVnaW4gbmFtZS4gT25seSBhIG1lc3NhZ2UgdGhhdCBvcGVucyBhIG5vdGljZSBpc1xuICAgKiBwcmVmaXhlZDsgYSBtZXNzYWdlIGFwcGVuZGVkIHRvIG9uZSBhbHJlYWR5IHNob3dpbmcgaXQgaXMgbm90LCBzbyB0aGUgbmFtZSBpcyBub3QgcmVwZWF0ZWQgb24gZXZlcnlcbiAgICogbGluZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRQcmVmaXhXaXRoUGx1Z2luTmFtZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVuZGVyIHRoZSBjbG9zZSBidXR0b24gd2hlbiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50QnVpbGROb3RpY2VDb250ZW50UGFyYW1zLnJlcXVpcmVzRXhwbGljaXRDbG9zZX0uXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIGJ1aWx0IG1lc3NhZ2U6IHRoZSB3cmFwcGVyIGVsZW1lbnQgaG9sZGluZyBpdCwgYW5kIHRoZSBmcmFnbWVudCB0aGF0IGVsZW1lbnQgc2l0cyBpbi5cbiAqXG4gKiBUaGUgZWxlbWVudCBpcyBoYW5kZWQgYmFjayBiZWNhdXNlIGEgbm90aWNlIGNhbiBob2xkIHNldmVyYWwgb2YgdGhlbSAoc2VlIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlLkFwcGVuZH0pLFxuICogc28gd2hvZXZlciBvd25zIG9uZSBtZXNzYWdlIGhhcyB0byBiZSBhYmxlIHRvIHVwZGF0ZSBvciByZW1vdmUgZXhhY3RseSB0aGF0IG1lc3NhZ2UuIFRoZSByZWZlcmVuY2VcbiAqIHN0YXlzIHZhbGlkIG9uY2UgdGhlIGZyYWdtZW50IGlzIGhhbmRlZCB0byBgTm90aWNlYDogYXBwZW5kaW5nIGEgZnJhZ21lbnQgbW92ZXMgaXRzIGNoaWxkcmVuIHJhdGhlclxuICogdGhhbiBjb3B5aW5nIHRoZW0uXG4gKi9cbmludGVyZmFjZSBQbHVnaW5Ob3RpY2VDb21wb25lbnROb3RpY2VDb250ZW50IHtcbiAgLyoqXG4gICAqIFRoZSBlbGVtZW50IHdyYXBwaW5nIHRoaXMgbWVzc2FnZSBhbG9uZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnRFbDogSFRNTEVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBmcmFnbWVudCBob2xkaW5nIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnROb3RpY2VDb250ZW50LmNvbnRlbnRFbH0sIHJlYWR5IHRvIGhhbmQgdG8gYE5vdGljZWBcbiAgICogb3IgdG8gYXBwZW5kIGludG8gb25lLlxuICAgKi9cbiAgcmVhZG9ubHkgZnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQ7XG59XG5cbi8qKlxuICogQSBtZXNzYWdlIHRoYXQgaGFzIGJlZW4gcHV0IG9uIHNjcmVlbiwgYW5kIHdoZXJlIGl0IGVuZGVkIHVwLlxuICovXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd25Ob3RpY2Uge1xuICAvKipcbiAgICogVGhlIGVsZW1lbnQgaG9sZGluZyB0aGlzIG1lc3NhZ2UgYWxvbmUsIGluc2lkZSB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd25Ob3RpY2Uubm90aWNlfS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnRFbDogSFRNTEVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBtZXNzYWdlIGNyZWF0ZWQgdGhlIG5vdGljZSwgYXMgb3Bwb3NlZCB0byBqb2luaW5nIG9uZSB0aGF0IHdhcyBhbHJlYWR5IG9uIHNjcmVlbi5cbiAgICogT25seSB0aGUgY3JlYXRvciBtYXkgaGlkZSBpdDsgYSBqb2luZWQgbWVzc2FnZSBjYW4gbWVyZWx5IHJlbW92ZSBpdHNlbGYuXG4gICAqL1xuICByZWFkb25seSBpc05vdGljZU93bmVkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgbm90aWNlIHRoZSBtZXNzYWdlIGlzIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgbm90aWNlOiBOb3RpY2U7XG59XG5cbmludGVyZmFjZSBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlV2l0aER1cmF0aW9uUGFyYW1zIHtcbiAgcmVhZG9ubHkgZHVyYXRpb25Jbk1pbGxpc2Vjb25kczogbnVsbCB8IG51bWJlcjtcbiAgcmVhZG9ubHkgbWVzc2FnZTogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZztcbiAgcmVhZG9ubHkgbW9kZTogUGx1Z2luTm90aWNlTW9kZTtcbiAgcmVhZG9ubHkgb25DbG9zZUNsaWNrOiAoKGV2ZW50OiBQbHVnaW5Ob3RpY2VDbG9zZUNsaWNrRXZlbnQpID0+IFByb21pc2FibGU8dm9pZD4pIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBvbkhpZGU6ICgoaW5mbzogUGx1Z2luTm90aWNlSGlkZUluZm8pID0+IFByb21pc2FibGU8dm9pZD4pIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSByZXF1aXJlc0V4cGxpY2l0Q2xvc2U6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNob3VsZFJlZ2lzdGVyQXNQZXJtYW5lbnQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNob3VsZFNob3dDbG9zZUJ1dHRvbjogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBNYW5hZ2VzIHNob3dpbmcgcGx1Z2luIG5vdGljZXMuIEJ5IGRlZmF1bHQgYSBuZXcgbm90aWNlIGhpZGVzIHRoZSBwcmV2aW91cyBvbmUsIHNvIG9ubHkgdGhlIGxhdGVzdFxuICogbWVzc2FnZSBpcyBvbiBzY3JlZW47IHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucy5tb2RlfSBjaG9vc2VzIG90aGVyd2lzZSBcdTIwMTQgc2VlXG4gKiB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZX0uXG4gKi9cbmV4cG9ydCBjbGFzcyBQbHVnaW5Ob3RpY2VDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRFeCB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIG5hbWUgKHNob3duIGFzIHByZWZpeCBpbiBub3RpY2VzKS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwbHVnaW5OYW1lOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjbG9zZUJ1dHRvbkNsaWNrZWROb3RpY2VzID0gbmV3IFdlYWtTZXQ8Tm90aWNlPigpO1xuICBwcml2YXRlIG5vdGljZTogTm90aWNlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVuZGluZ1RpbWVyQ2FuY2VsbGF0aW9ucyA9IG5ldyBTZXQ8KCkgPT4gdm9pZD4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFuZGFsb25lTm90aWNlcyA9IG5ldyBTZXQ8Tm90aWNlPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHVzZXJDbGlja2VkTm90aWNlcyA9IG5ldyBXZWFrU2V0PE5vdGljZT4oKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBwbHVnaW4gbm90aWNlIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUGx1Z2luTm90aWNlQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLnBsdWdpbk5hbWUgPSBwYXJhbXMucGx1Z2luTmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNtaXNzZXMgdGhlIHBlcm1hbmVudCBub3RpY2UgbGVmdCBvdmVyIGZyb20gYSBwcmV2aW91cyBsb2FkIChlLmcuIGEgcHJldmlvdXMgcGx1Z2luIHNlc3Npb24pIG9uIGxvYWQuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHN1cGVyLm9ubG9hZCgpO1xuICAgIGNvbnN0IHBlcm1hbmVudE5vdGljZSA9IHRoaXMuZ2V0UGVybWFuZW50Tm90aWNlKCk7XG4gICAgcGVybWFuZW50Tm90aWNlPy5oaWRlKCk7XG4gICAgdGhpcy5zZXRQZXJtYW5lbnROb3RpY2UobnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogSGlkZXMgdGhlIGN1cnJlbnQgbm90aWNlIG9uIHVubG9hZCwgdW5sZXNzIGl0IGlzIHRoZSBwZXJtYW5lbnQgbm90aWNlICh3aGljaCBpcyBtZWFudCB0byBvdXRsaXZlIHRoZSBwbHVnaW4pLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIG9udW5sb2FkKCk6IHZvaWQge1xuICAgIC8vIENhbmNlbCBhbnkgZGVsYXllZCBub3RpY2Ugd2hvc2UgdGltZXIgaGFzIG5vdCBmaXJlZCB5ZXQsIHNvIGl0IG5ldmVyIGFwcGVhcnMgYWZ0ZXIgdW5sb2FkLlxuICAgIGZvciAoY29uc3QgY2FuY2VsUGVuZGluZ1RpbWVyIG9mIHNuYXBzaG90KHRoaXMucGVuZGluZ1RpbWVyQ2FuY2VsbGF0aW9ucykpIHtcbiAgICAgIGNhbmNlbFBlbmRpbmdUaW1lcigpO1xuICAgIH1cbiAgICBpZiAodGhpcy5nZXRQZXJtYW5lbnROb3RpY2UoKSAhPT0gdGhpcy5ub3RpY2UpIHtcbiAgICAgIHRoaXMubm90aWNlPy5oaWRlKCk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgc3RhbmRhbG9uZU5vdGljZSBvZiB0aGlzLnN0YW5kYWxvbmVOb3RpY2VzKSB7XG4gICAgICBzdGFuZGFsb25lTm90aWNlLmhpZGUoKTtcbiAgICB9XG4gICAgdGhpcy5zdGFuZGFsb25lTm90aWNlcy5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXlzIGEgbm90aWNlIG1lc3NhZ2UgdG8gdGhlIHVzZXIuXG4gICAqXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIG1lc3NhZ2UgdG8gZGlzcGxheS5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgZGlzcGxheWluZyB0aGUgbm90aWNlLlxuICAgKiBAcmV0dXJucyBUaGUgbm90aWNlIG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBzaG93Tm90aWNlKG1lc3NhZ2U6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmcsIG9wdGlvbnM/OiBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucyk6IE5vdGljZSB7XG4gICAgY29uc3QgaXNQZXJtYW5lbnQgPSBvcHRpb25zPy5pc1Blcm1hbmVudCA/PyBmYWxzZTtcbiAgICBjb25zdCBzaG91bGRIaWRlT25DbGljayA9IG9wdGlvbnM/LnNob3VsZEhpZGVPbkNsaWNrID8/IHRydWU7XG4gICAgY29uc3QgcmVxdWlyZXNFeHBsaWNpdENsb3NlID0gIXNob3VsZEhpZGVPbkNsaWNrO1xuICAgIGNvbnN0IG1vZGUgPSBvcHRpb25zPy5tb2RlID8/IChyZXF1aXJlc0V4cGxpY2l0Q2xvc2UgPyBQbHVnaW5Ob3RpY2VNb2RlLlNlcGFyYXRlIDogUGx1Z2luTm90aWNlTW9kZS5SZXBsYWNlKTtcblxuICAgIGlmIChvcHRpb25zPy5tb2RlICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5tb2RlICE9PSBQbHVnaW5Ob3RpY2VNb2RlLlNlcGFyYXRlICYmIHJlcXVpcmVzRXhwbGljaXRDbG9zZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIG5vdGljZSB0aGF0IGRvZXMgbm90IGhpZGUgb24gY2xpY2sgbXVzdCBiZSBzaG93biBpbiB0aGUgc2VwYXJhdGUgbW9kZS4nKTtcbiAgICB9XG4gICAgaWYgKG1vZGUgPT09IFBsdWdpbk5vdGljZU1vZGUuU2VwYXJhdGUgJiYgaXNQZXJtYW5lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQSBwZXJtYW5lbnQgbm90aWNlIGNhbm5vdCBiZSBzaG93biBpbiB0aGUgc2VwYXJhdGUgbW9kZS4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBkdXJhdGlvbkluTWlsbGlzZWNvbmRzID0gaXNQZXJtYW5lbnQgfHwgcmVxdWlyZXNFeHBsaWNpdENsb3NlID8gUEVSTUFORU5UX05PVElDRV9EVVJBVElPTl9JTl9NSUxMSVNFQ09ORFMgOiBudWxsO1xuICAgIHJldHVybiB0aGlzLnNob3dOb3RpY2VXaXRoRHVyYXRpb24oe1xuICAgICAgZHVyYXRpb25Jbk1pbGxpc2Vjb25kcyxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBtb2RlLFxuICAgICAgb25DbG9zZUNsaWNrOiBvcHRpb25zPy5vbkNsb3NlQ2xpY2ssXG4gICAgICBvbkhpZGU6IG9wdGlvbnM/Lm9uSGlkZSxcbiAgICAgIHJlcXVpcmVzRXhwbGljaXRDbG9zZSxcbiAgICAgIHNob3VsZFJlZ2lzdGVyQXNQZXJtYW5lbnQ6IGlzUGVybWFuZW50LFxuICAgICAgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uOiBvcHRpb25zPy5zaG91bGRTaG93Q2xvc2VCdXR0b24gPz8gdHJ1ZVxuICAgIH0pLm5vdGljZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBhIG5vdGljZSBkZXNjcmliaW5nIGEgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbiwgYnV0IG9ubHkgb25jZSB0aGUgb3BlcmF0aW9uIGhhcyBydW4gZm9yIGxvbmdlclxuICAgKiB0aGFuIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlQWZ0ZXJEZWxheVBhcmFtcy5kZWxheUluTWlsbGlzZWNvbmRzfSBcdTIwMTQgc28gb3BlcmF0aW9uc1xuICAgKiB0aGF0IGZpbmlzaCBzb29uZXIgbmV2ZXIgZmxhc2ggYSBub3RpY2UuIFRoZSBub3RpY2Ugc3RheXMgdW50aWwgdGhlIHJldHVybmVkIHtAbGluayBEaXNwb3NhYmxlfSBpc1xuICAgKiBkaXNwb3NlZCAod2hpY2ggYWxzbyBjYW5jZWxzIHRoZSBwZW5kaW5nIHRpbWVyIGlmIGl0IGhhcyBub3QgZmlyZWQgeWV0KSwgc28gaXQgY2FuIGJlIHVzZWQgd2l0aFxuICAgKiBgdXNpbmdgLiBXaGVuIGFuIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlQWZ0ZXJEZWxheVBhcmFtcy5hYm9ydENvbnRyb2xsZXJ9IGlzIGdpdmVuLCBhXG4gICAqIENhbmNlbCBidXR0b24gdGhhdCBhYm9ydHMgaXQgaXMgYXBwZW5kZWQgKGFuZCwgYmVpbmcgaW50ZXJhY3RpdmUsIGRvZXMgbm90IGRpc21pc3MgdGhlIG5vdGljZSkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIHVzaW5nIF9ub3RpY2UgPSBwbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZUFmdGVyRGVsYXkoe1xuICAgKiAgIGFib3J0Q29udHJvbGxlcixcbiAgICogICBjb250ZW50OiAoKSA9PiBidWlsZFByb2dyZXNzRnJhZ21lbnQoKVxuICAgKiB9KTtcbiAgICogYXdhaXQgcnVuT3BlcmF0aW9uKGFib3J0Q29udHJvbGxlci5zaWduYWwpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnREZWxheWVkTm90aWNlfSB0aGF0IGhpZGVzIHRoZSBub3RpY2UgKG9yIGNhbmNlbHMgdGhlIHBlbmRpbmdcbiAgICogdGltZXIpIHdoZW4gZGlzcG9zZWQgYW5kIGxldHMgdGhlIGNvbnRlbnQgYmUgdXBkYXRlZCB3aGlsZSBpdCBpcyBzaG93bi5cbiAgICovXG4gIHB1YmxpYyBzaG93Tm90aWNlQWZ0ZXJEZWxheShwYXJhbXM6IFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VBZnRlckRlbGF5UGFyYW1zKTogUGx1Z2luTm90aWNlQ29tcG9uZW50RGVsYXllZE5vdGljZSB7XG4gICAgY29uc3QgbW9kZSA9IHBhcmFtcy5tb2RlID8/IFBsdWdpbk5vdGljZU1vZGUuUmVwbGFjZTtcbiAgICAvLyBXaGVyZSB0aGlzIG1lc3NhZ2UgZW5kZWQgdXA6IGEgbm90aWNlIG9mIGl0cyBvd24sIG9yIGEgY2h1bmsgaW5zaWRlIG9uZSB0aGF0IHdhcyBhbHJlYWR5IHVwLiBJdFxuICAgIC8vIGRlY2lkZXMgd2hhdCBgc2V0Q29udGVudGAgcmV3cml0ZXMgYW5kIHdoYXQgZGlzcG9zaW5nIHRha2VzIGF3YXkuXG4gICAgbGV0IHNob3duOiBudWxsIHwgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd25Ob3RpY2UgPSBudWxsO1xuICAgIGxldCBpc0Rpc3Bvc2VkID0gZmFsc2U7XG4gICAgbGV0IHRpbWVySWQgPSAwO1xuICAgIGxldCBjdXJyZW50Q29udGVudDogVmFsdWVQcm92aWRlcjxEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nPiA9IHBhcmFtcy5jb250ZW50O1xuXG4gICAgY29uc3QgY2FuY2VsUGVuZGluZ1RpbWVyID0gKCk6IHZvaWQgPT4ge1xuICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICAgIHRoaXMucGVuZGluZ1RpbWVyQ2FuY2VsbGF0aW9ucy5kZWxldGUoY2FuY2VsUGVuZGluZ1RpbWVyKTtcbiAgICB9O1xuXG4gICAgY29uc3QgYnVpbGREZWxheWVkTWVzc2FnZSA9IChjb250ZW50OiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nKTogRG9jdW1lbnRGcmFnbWVudCA9PlxuICAgICAgdGhpcy5idWlsZERlbGF5ZWROb3RpY2VNZXNzYWdlKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxQbHVnaW5Ob3RpY2VDb21wb25lbnRCdWlsZERlbGF5ZWROb3RpY2VNZXNzYWdlUGFyYW1zPih7XG4gICAgICAgIGFib3J0Q29udHJvbGxlcjogcGFyYW1zLmFib3J0Q29udHJvbGxlcixcbiAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogcGFyYW1zLmNhbmNlbEJ1dHRvblRleHQsXG4gICAgICAgIGNvbnRlbnRcbiAgICAgIH0pKTtcblxuICAgIHRpbWVySWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjYW5jZWxQZW5kaW5nVGltZXIoKTtcbiAgICAgIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gUmVzb2x2aW5nIHRoZSBjb250ZW50IGlzIGFzeW5jaHJvbm91cywgYW5kIHRoZSBvcGVyYXRpb24gdGhlIG5vdGljZSBkZXNjcmliZXMga2VlcHMgcnVubmluZ1xuICAgICAgICAvLyB3aGlsZSBpdCBoYXBwZW5zIFx1MjAxNCBzbyBgc2V0Q29udGVudGAgY2FuIGxhbmQgaW4gYmV0d2Vlbi4gSXQgY2Fubm90IHJld3JpdGUgYSBub3RpY2UgdGhhdCBkb2VzXG4gICAgICAgIC8vIG5vdCBleGlzdCB5ZXQsIHNvIHJlc29sdmUgYWdhaW4gd2hlbmV2ZXIgdGhhdCBoYXBwZW5zOiB0aGUgbm90aWNlIG11c3Qgb3BlbiB3aXRoIHRoZSBtZXNzYWdlXG4gICAgICAgIC8vIHRoZSBjYWxsZXIgbGFzdCBhc2tlZCBmb3IsIG5vdCB0aGUgb25lIHRoYXQgd2FzIGN1cnJlbnQgd2hlbiByZXNvbHV0aW9uIHN0YXJ0ZWQuXG4gICAgICAgIGxldCByZXF1ZXN0ZWRDb250ZW50OiBWYWx1ZVByb3ZpZGVyPERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc+O1xuICAgICAgICBsZXQgcmVzb2x2ZWRDb250ZW50OiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgcmVxdWVzdGVkQ29udGVudCA9IGN1cnJlbnRDb250ZW50O1xuICAgICAgICAgIHJlc29sdmVkQ29udGVudCA9IGF3YWl0IHJlc29sdmVWYWx1ZShyZXF1ZXN0ZWRDb250ZW50LCB7fSk7XG4gICAgICAgICAgLy8gVGhlIGhhbmRsZSBtYXkgaGF2ZSBiZWVuIGRpc3Bvc2VkIHdoaWxlIHRoZSBjb250ZW50IHdhcyBiZWluZyByZXNvbHZlZDsgZG9uJ3Qgc2hvdyBhIHN0YWxlIG5vdGljZS5cbiAgICAgICAgICBpZiAoaXNEaXNwb3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAocmVxdWVzdGVkQ29udGVudCAhPT0gY3VycmVudENvbnRlbnQpO1xuXG4gICAgICAgIHNob3duID0gdGhpcy5zaG93Tm90aWNlV2l0aER1cmF0aW9uKHtcbiAgICAgICAgICBkdXJhdGlvbkluTWlsbGlzZWNvbmRzOiBQRVJNQU5FTlRfTk9USUNFX0RVUkFUSU9OX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgICBtZXNzYWdlOiBidWlsZERlbGF5ZWRNZXNzYWdlKHJlc29sdmVkQ29udGVudCksXG4gICAgICAgICAgbW9kZSxcbiAgICAgICAgICBvbkNsb3NlQ2xpY2s6IHVuZGVmaW5lZCxcbiAgICAgICAgICBvbkhpZGU6IHVuZGVmaW5lZCxcbiAgICAgICAgICByZXF1aXJlc0V4cGxpY2l0Q2xvc2U6IGZhbHNlLFxuICAgICAgICAgIHNob3VsZFJlZ2lzdGVyQXNQZXJtYW5lbnQ6IGZhbHNlLFxuICAgICAgICAgIHNob3VsZFNob3dDbG9zZUJ1dHRvbjogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0sIHBhcmFtcy5kZWxheUluTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfREVMQVlfQkVGT1JFX1NIT1dfSU5fTUlMTElTRUNPTkRTKTtcblxuICAgIHRoaXMucGVuZGluZ1RpbWVyQ2FuY2VsbGF0aW9ucy5hZGQoY2FuY2VsUGVuZGluZ1RpbWVyKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzZXRDb250ZW50OiAoY29udGVudDogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgICAgICBjdXJyZW50Q29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgIGlmICghc2hvd24pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gU3dhcHMgVEhJUyBtZXNzYWdlJ3MgZWxlbWVudCBmb3IgYSBmcmVzaGx5IGJ1aWx0IG9uZSwgcmF0aGVyIHRoYW4gcmV3cml0aW5nIHRoZSB3aG9sZSBub3RpY2U6XG4gICAgICAgIC8vIFdoZW4gdGhlIGhhbmRsZSBqb2luZWQgYSBub3RpY2UgdGhhdCB3YXMgYWxyZWFkeSB1cCwgdGhlIG90aGVyIG1lc3NhZ2VzIGluIGl0IGFyZSBub3QgaXRzIHRvXG4gICAgICAgIC8vIG92ZXJ3cml0ZS4gUmVidWlsZGluZyBhbHNvIHJlLWFwcGxpZXMgdGhlIHByZWZpeCwgdGhlIGludGVyYWN0aXZlIGd1YXJkLCBhbmQgdGhlIENhbmNlbCBidXR0b24uXG4gICAgICAgIGNvbnN0IHJlYnVpbHQgPSB0aGlzLmJ1aWxkTm90aWNlQ29udGVudCh7XG4gICAgICAgICAgbWVzc2FnZTogYnVpbGREZWxheWVkTWVzc2FnZShjb250ZW50KSxcbiAgICAgICAgICBzaG91bGRQcmVmaXhXaXRoUGx1Z2luTmFtZTogc2hvd24uaXNOb3RpY2VPd25lZFxuICAgICAgICB9KTtcbiAgICAgICAgc2hvd24uY29udGVudEVsLnJlcGxhY2VXaXRoKHJlYnVpbHQuZnJhZ21lbnQpO1xuICAgICAgICBzaG93biA9IHsgLi4uc2hvd24sIGNvbnRlbnRFbDogcmVidWlsdC5jb250ZW50RWwgfTtcbiAgICAgIH0sXG4gICAgICBbU3ltYm9sLmRpc3Bvc2VdOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlzRGlzcG9zZWQgPSB0cnVlO1xuICAgICAgICBjYW5jZWxQZW5kaW5nVGltZXIoKTtcbiAgICAgICAgaWYgKCFzaG93bikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBBIG5vdGljZSB0aGlzIGhhbmRsZSBvcGVuZWQgZ29lcyBhd2F5IHdpdGggaXQ7IGEgbm90aWNlIGl0IG1lcmVseSBqb2luZWQgYmVsb25ncyB0byB3aG9ldmVyXG4gICAgICAgIC8vIG9wZW5lZCBpdCwgc28gb25seSB0aGlzIG1lc3NhZ2UgaXMgdGFrZW4gb3V0IG9mIGl0LlxuICAgICAgICBpZiAoc2hvd24uaXNOb3RpY2VPd25lZCkge1xuICAgICAgICAgIHNob3duLm5vdGljZS5oaWRlKCk7XG4gICAgICAgICAgdGhpcy5zdGFuZGFsb25lTm90aWNlcy5kZWxldGUoc2hvd24ubm90aWNlKTtcbiAgICAgICAgICBpZiAodGhpcy5ub3RpY2UgPT09IHNob3duLm5vdGljZSkge1xuICAgICAgICAgICAgdGhpcy5ub3RpY2UgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG93bi5jb250ZW50RWwucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgYSBjbG9zZSAoWCkgYnV0dG9uIHRvIHRoZSBub3RpY2UgY29udGVudC4gQ2xpY2tpbmcgaXQgZmlyZXNcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudEFwcGVuZENsb3NlQnV0dG9uUGFyYW1zLm9uQ2xvc2VDbGlja30gKHdoaWNoIG1heSBjYW5jZWwgdGhlIGNsb3NlKTsgaWZcbiAgICogbm90IGNhbmNlbGxlZCwgaXQgaGlkZXMgdGhlIG5vdGljZSBhbmQgZHJvcHMgaXQgZnJvbSB0aGUgc3RhbmRhbG9uZS1ub3RpY2UgdHJhY2tpbmcgc2V0LiBUaGUgaGlkZSBpc1xuICAgKiBtYXJrZWQgYXMgYSBjbG9zZS1idXR0b24gY2xpY2sgc28ge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm9uSGlkZX0gY2FuXG4gICAqIGRpc3Rpbmd1aXNoIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwcml2YXRlIGFwcGVuZENsb3NlQnV0dG9uKHBhcmFtczogUGx1Z2luTm90aWNlQ29tcG9uZW50QXBwZW5kQ2xvc2VCdXR0b25QYXJhbXMpOiB2b2lkIHtcbiAgICBjb25zdCB7IGNvbnRlbnRFbCwgZ2V0Tm90aWNlLCBvbkNsb3NlQ2xpY2sgfSA9IHBhcmFtcztcbiAgICBjb25zdCBjbG9zZUJ1dHRvbkVsID0gY29udGVudEVsLmNyZWF0ZUVsKCdidXR0b24nLCB7XG4gICAgICBhdHRyOiB7ICdhcmlhLWxhYmVsJzogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLm5vdGljZXMuY2xvc2VBcmlhTGFiZWwpIH1cbiAgICB9KTtcbiAgICAvLyBSZXVzZSBPYnNpZGlhbidzIG1vZGFsIGNsb3NlLWJ1dHRvbiBjbGFzc2VzIHNvIHRoaXMgYnV0dG9uIG1hdGNoZXMgdGhlIG5hdGl2ZSBtb2RhbCBjbG9zZSBidXR0b25cbiAgICAvLyAobG9vayBhbmQgaG92ZXIpOyB0aGUgc3R5bGVzaGVldCBvbmx5IHBvc2l0aW9ucyBpdCBpbiB0aGUgbm90aWNlIGNvcm5lci5cbiAgICBhZGRQbHVnaW5Dc3NDbGFzc2VzKGNsb3NlQnV0dG9uRWwsIENzc0NsYXNzLlBsdWdpbk5vdGljZUNsb3NlQnV0dG9uKTtcbiAgICBjbG9zZUJ1dHRvbkVsLmFkZENsYXNzZXMoW0Nzc0NsYXNzLkNsaWNrYWJsZUljb24sIENzc0NsYXNzLk1vZGFsSGVhZGVyQnV0dG9uXSk7XG4gICAgc2V0SWNvbihjbG9zZUJ1dHRvbkVsLCAneCcpO1xuICAgIGNsb3NlQnV0dG9uRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoJGV2ZW50KSA9PiB7XG4gICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBpbnZva2VBc3luY1NhZmVseShhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCBpc0NhbmNlbGxlZCA9IGZhbHNlO1xuICAgICAgICBhd2FpdCBvbkNsb3NlQ2xpY2s/Lih7XG4gICAgICAgICAgY2FuY2VsOiAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBpc0NhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gQ2FuIGJlIGNhbmNlbGxlZCBieSB0aGUgdXNlci5cbiAgICAgICAgaWYgKGlzQ2FuY2VsbGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5vdGljZSA9IGVuc3VyZU5vbk51bGxhYmxlKGdldE5vdGljZSgpKTtcbiAgICAgICAgdGhpcy5jbG9zZUJ1dHRvbkNsaWNrZWROb3RpY2VzLmFkZChub3RpY2UpO1xuICAgICAgICBub3RpY2UuaGlkZSgpO1xuICAgICAgICB0aGlzLnN0YW5kYWxvbmVOb3RpY2VzLmRlbGV0ZShub3RpY2UpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIG1lc3NhZ2UgdG8gdGhlIG5vdGljZSBjdXJyZW50bHkgaW4gdGhlIHBlci1wbHVnaW4gc2xvdCwgc28gYm90aCBtZXNzYWdlcyBzdGF5IG9uIHNjcmVlbiBpbiBhXG4gICAqIHNpbmdsZSBub3RpY2UuXG4gICAqXG4gICAqIFRoZSBhcHBlbmRlZCBtZXNzYWdlIGNhcnJpZXMgbm8gcGx1Z2luLW5hbWUgcHJlZml4IFx1MjAxNCB0aGUgbm90aWNlIGFscmVhZHkgb3BlbnMgd2l0aCBvbmUsIGFuZFxuICAgKiByZXBlYXRpbmcgaXQgb24gZXZlcnkgbGluZSByZWFkcyBhcyBub2lzZS4gSXQgaXMgd3JhcHBlZCBsaWtlIGFueSBvdGhlciBub3RpY2UgY29udGVudCwgc28gYSBsaW5rIG9yXG4gICAqIGJ1dHRvbiBpbnNpZGUgaXQgc3RpbGwga2VlcHMgdGhlIG5vdGljZSBvcGVuIHdoZW4gY2xpY2tlZC5cbiAgICpcbiAgICogQXBwZW5kaW5nIHJlc3RhcnRzIHRoZSBub3RpY2UncyBjb3VudGRvd24gKHtAbGluayBOb3RpY2Uuc2V0QXV0b0hpZGV9KSwgc28gdGhlIG5ldyBtZXNzYWdlIGdldHMgYVxuICAgKiBmdWxsIGR1cmF0aW9uIGluc3RlYWQgb2YgaW5oZXJpdGluZyB3aGF0IHdhcyBsZWZ0IG9mIHRoZSBjdXJyZW50IG9uZSBcdTIwMTQgYSBsaW5lIGFwcGVuZGVkIGEgbW9tZW50XG4gICAqIGJlZm9yZSB0aGUgbm90aWNlIGV4cGlyZXMgd291bGQgb3RoZXJ3aXNlIGZsYXNoIGFuZCB2YW5pc2guXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMgVGhlIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93bk5vdGljZX0gZGVzY3JpYmluZyB0aGUgam9pbmVkIG5vdGljZSwgb3IgYG51bGxgIHdoZW5cbiAgICogdGhlcmUgaXMgbm90aGluZyBvbiBzY3JlZW4gdG8gYXBwZW5kIHRvIFx1MjAxNCB0aGUgc2xvdCBpcyBlbXB0eSwgb3IgaXRzIG5vdGljZSBoYXMgc2luY2UgYmVlbiBkaXNtaXNzZWRcbiAgICogXHUyMDE0IGFuZCB0aGUgY2FsbGVyIHNob3VsZCBzaG93IGEgbmV3IG5vdGljZSBpbnN0ZWFkLlxuICAgKi9cbiAgcHJpdmF0ZSBhcHBlbmRUb0N1cnJlbnROb3RpY2UocGFyYW1zOiBQbHVnaW5Ob3RpY2VDb21wb25lbnRBcHBlbmRUb0N1cnJlbnROb3RpY2VQYXJhbXMpOiBudWxsIHwgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd25Ob3RpY2Uge1xuICAgIGNvbnN0IHsgZHVyYXRpb25Jbk1pbGxpc2Vjb25kcywgbWVzc2FnZSwgb25IaWRlLCBzaG91bGRSZWdpc3RlckFzUGVybWFuZW50IH0gPSBwYXJhbXM7XG4gICAgY29uc3QgY3VycmVudE5vdGljZSA9IHRoaXMubm90aWNlO1xuICAgIC8vIGBpc1Nob3duYCBpcyB0aGUgc2FtZSBjaGVjayBPYnNpZGlhbidzIG93biBgTm90aWNlLmhpZGVgIG1ha2VzIGJlZm9yZSBhbmltYXRpbmcgYSBub3RpY2UgYXdheSwgc29cbiAgICAvLyBpdCBpcyBleGFjdGx5IFwic3RpbGwgb24gc2NyZWVuXCI6IGEgbm90aWNlIHRoYXQgZXhwaXJlZCBvciB3YXMgZGlzbWlzc2VkIGhhcyBiZWVuIGRldGFjaGVkLlxuICAgIGlmICghY3VycmVudE5vdGljZT8uY29udGFpbmVyRWwuaXNTaG93bigpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvbnRlbnRFbCwgZnJhZ21lbnQgfSA9IHRoaXMuYnVpbGROb3RpY2VDb250ZW50KHsgbWVzc2FnZSwgc2hvdWxkUHJlZml4V2l0aFBsdWdpbk5hbWU6IGZhbHNlIH0pO1xuICAgIGN1cnJlbnROb3RpY2UubWVzc2FnZUVsLmFwcGVuZChmcmFnbWVudCk7XG4gICAgLy8gQSBgbnVsbGAgZHVyYXRpb24gbWVhbnMgXCJPYnNpZGlhbidzIG93biBkZWZhdWx0XCIsIHdoaWNoIG9ubHkgdGhlIGNvbnN0cnVjdG9yIGFwcGxpZXMgXHUyMDE0IHNvIHJlc3RhcnRcbiAgICAvLyB0aGUgY291bnRkb3duIHdpdGggdGhhdCBzYW1lIGRlZmF1bHQgcmF0aGVyIHRoYW4gbGVhdmluZyB0aGUgY3VycmVudCBvbmUgcnVubmluZy5cbiAgICBjdXJyZW50Tm90aWNlLnNldEF1dG9IaWRlKGR1cmF0aW9uSW5NaWxsaXNlY29uZHMgPz8gT0JTSURJQU5fREVGQVVMVF9OT1RJQ0VfRFVSQVRJT05fSU5fTUlMTElTRUNPTkRTKTtcbiAgICB0aGlzLndpcmVPbkhpZGUoY3VycmVudE5vdGljZSwgb25IaWRlKTtcbiAgICAvLyBPbmx5IGV2ZXIgcmVnaXN0ZXJzLCBuZXZlciBjbGVhcnM6IHRoZSBub3RpY2UgYmVpbmcgYXBwZW5kZWQgdG8gbWF5IGFscmVhZHkgYmUgdGhpcyBwbHVnaW4nc1xuICAgIC8vIHBlcm1hbmVudCBub3RpY2UsIGFuZCBhIGxhdGVyIGFwcGVuZGVkIG1lc3NhZ2UgaXMgbm8gcmVhc29uIHRvIGZvcmdldCB0aGF0LlxuICAgIGlmIChzaG91bGRSZWdpc3RlckFzUGVybWFuZW50KSB7XG4gICAgICB0aGlzLnNldFBlcm1hbmVudE5vdGljZShjdXJyZW50Tm90aWNlKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29udGVudEVsLCBpc05vdGljZU93bmVkOiBmYWxzZSwgbm90aWNlOiBjdXJyZW50Tm90aWNlIH07XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBtZXNzYWdlIGZvciBhIGRlbGF5ZWQgbm90aWNlOiB0aGUgcmVzb2x2ZWQgY29udGVudCwgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhIENhbmNlbFxuICAgKiBidXR0b24gdGhhdCBhYm9ydHMgdGhlIHByb3ZpZGVkIGNvbnRyb2xsZXIgd2hlbiBjbGlja2VkLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIERvY3VtZW50RnJhZ21lbnR9IGhvbGRpbmcgdGhlIGNvbnRlbnQgYW5kLCBpZiByZXF1ZXN0ZWQsIGEgQ2FuY2VsIGJ1dHRvbi5cbiAgICovXG4gIHByaXZhdGUgYnVpbGREZWxheWVkTm90aWNlTWVzc2FnZShwYXJhbXM6IFBsdWdpbk5vdGljZUNvbXBvbmVudEJ1aWxkRGVsYXllZE5vdGljZU1lc3NhZ2VQYXJhbXMpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICBjb25zdCB7IGFib3J0Q29udHJvbGxlciwgY2FuY2VsQnV0dG9uVGV4dCwgY29udGVudCB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IGZyYWdtZW50ID0gY3JlYXRlRnJhZ21lbnQoKTtcbiAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBmcmFnbWVudC5hcHBlbmRUZXh0KGNvbnRlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmcmFnbWVudC5hcHBlbmQoY29udGVudCk7XG4gICAgfVxuXG4gICAgaWYgKGFib3J0Q29udHJvbGxlcikge1xuICAgICAgLy8gYEJ1dHRvbkNvbXBvbmVudGAgcmVxdWlyZXMgYW4gYEhUTUxFbGVtZW50YCBwYXJlbnQsIHNvIGJ1aWxkIGl0IG9uIGEgdGhyb3dhd2F5XG4gICAgICAvLyBkZXRhY2hlZCBlbGVtZW50IGFuZCBtb3ZlIGl0cyBgYnV0dG9uRWxgIGludG8gdGhlIGZyYWdtZW50LlxuICAgICAgY29uc3QgY2FuY2VsQnV0dG9uID0gbmV3IEJ1dHRvbkNvbXBvbmVudChjcmVhdGVEaXYoKSk7XG4gICAgICBjYW5jZWxCdXR0b24uc2V0QnV0dG9uVGV4dChjYW5jZWxCdXR0b25UZXh0ID8/IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5idXR0b25zLmNhbmNlbCkpO1xuICAgICAgYWRkUGx1Z2luQ3NzQ2xhc3NlcyhjYW5jZWxCdXR0b24uYnV0dG9uRWwsIENzc0NsYXNzLkNhbmNlbEJ1dHRvbik7XG4gICAgICAvLyBUaGUgY2xpY2sgaXMgd2lyZWQgdmlhIGBhZGRFdmVudExpc3RlbmVyYCByYXRoZXIgdGhhbiBgQnV0dG9uQ29tcG9uZW50Lm9uQ2xpY2tgIHNvIGl0XG4gICAgICAvLyBidWJibGVzIHRocm91Z2ggdGhlIGludGVyYWN0aXZlLWVsZW1lbnQgZ3VhcmQgKGtlZXBpbmcgdGhlIG5vdGljZSBvcGVuKSBhbmQgc3RheXNcbiAgICAgIC8vIGRpcmVjdGx5IGV4ZXJjaXNhYmxlIHZpYSBhIGRpc3BhdGNoZWQgRE9NIGV2ZW50IGluIHVuaXQgdGVzdHMuXG4gICAgICBjYW5jZWxCdXR0b24uYnV0dG9uRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgIGFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgfSk7XG4gICAgICBmcmFnbWVudC5hcHBlbmQoY2FuY2VsQnV0dG9uLmJ1dHRvbkVsKTtcbiAgICB9XG4gICAgcmV0dXJuIGZyYWdtZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgbm90aWNlIGNvbnRlbnQgd3JhcHBlZCBpbiBhIGNvbnRhaW5lciB0aGF0IGtlZXBzIHRoZSBub3RpY2Ugb3BlbiB3aGVuIGFuIGludGVyYWN0aXZlXG4gICAqIGVsZW1lbnQgaW5zaWRlIGl0IGlzIGNsaWNrZWQuIE9ic2lkaWFuIGRpc21pc3NlcyBhIG5vdGljZSBvbiBhbnkgY2xpY2sgdGhhdCBidWJibGVzIHVwIHRvIGl0c1xuICAgKiBlbGVtZW50OyB0aGUgY29udGFpbmVyIGludGVyY2VwdHMgY2xpY2tzIG9yaWdpbmF0aW5nIG9uIGFuIGludGVyYWN0aXZlIGVsZW1lbnQgKGEgbGluaywgYnV0dG9uLFxuICAgKiBpbnB1dCwgZXRjLikgYW5kIHN0b3BzIHRoZW0gdGhlcmUsIHNvIHRoZSBlbGVtZW50J3Mgb3duIGhhbmRsZXIgc3RpbGwgcnVucyBidXQgdGhlIG5vdGljZSBzdGF5cy5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyBUaGUge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudE5vdGljZUNvbnRlbnR9IGhvbGRpbmcgdGhlIHdyYXBwZWQgbm90aWNlIGNvbnRlbnQuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkTm90aWNlQ29udGVudChwYXJhbXM6IFBsdWdpbk5vdGljZUNvbXBvbmVudEJ1aWxkTm90aWNlQ29udGVudFBhcmFtcyk6IFBsdWdpbk5vdGljZUNvbXBvbmVudE5vdGljZUNvbnRlbnQge1xuICAgIGNvbnN0IHsgZ2V0Tm90aWNlLCBtZXNzYWdlLCBvbkNsb3NlQ2xpY2ssIHJlcXVpcmVzRXhwbGljaXRDbG9zZSA9IGZhbHNlLCBzaG91bGRQcmVmaXhXaXRoUGx1Z2luTmFtZSA9IHRydWUsIHNob3VsZFNob3dDbG9zZUJ1dHRvbiA9IHRydWUgfSA9IHBhcmFtcztcbiAgICBjb25zdCBmcmFnbWVudCA9IGNyZWF0ZUZyYWdtZW50KCk7XG4gICAgY29uc3QgY29udGVudEVsID0gZnJhZ21lbnQuY3JlYXRlRGl2KCk7XG4gICAgYWRkUGx1Z2luQ3NzQ2xhc3Nlcyhjb250ZW50RWwsIENzc0NsYXNzLlBsdWdpbk5vdGljZUNvbnRlbnQpO1xuICAgIGlmIChzaG91bGRQcmVmaXhXaXRoUGx1Z2luTmFtZSkge1xuICAgICAgY29udGVudEVsLmFwcGVuZCh0aGlzLmJ1aWxkUHJlZml4ZWRNZXNzYWdlKG1lc3NhZ2UpKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgY29udGVudEVsLmFwcGVuZFRleHQobWVzc2FnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRlbnRFbC5hcHBlbmQobWVzc2FnZSk7XG4gICAgfVxuICAgIGNvbnRlbnRFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgkZXZlbnQpID0+IHtcbiAgICAgIC8vIEEgaGFyZC10by1jbG9zZSBub3RpY2UgbXVzdCBub3QgZGlzbWlzcyBvbiBhbnkgc3RyYXkgY2xpY2s7IG9ubHkgaXRzIGNsb3NlIGJ1dHRvbiBtYXkgaGlkZSBpdC5cbiAgICAgIGlmIChyZXF1aXJlc0V4cGxpY2l0Q2xvc2UpIHtcbiAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoJGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgJGV2ZW50LnRhcmdldC5jbG9zZXN0KElOVEVSQUNUSVZFX0VMRU1FTlRfU0VMRUNUT1IpKSB7XG4gICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChyZXF1aXJlc0V4cGxpY2l0Q2xvc2UgJiYgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uKSB7XG4gICAgICB0aGlzLmFwcGVuZENsb3NlQnV0dG9uKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxQbHVnaW5Ob3RpY2VDb21wb25lbnRBcHBlbmRDbG9zZUJ1dHRvblBhcmFtcz4oe1xuICAgICAgICBjb250ZW50RWwsXG4gICAgICAgIGdldE5vdGljZTogZW5zdXJlTm9uTnVsbGFibGUoZ2V0Tm90aWNlKSxcbiAgICAgICAgb25DbG9zZUNsaWNrXG4gICAgICB9KSk7XG4gICAgfVxuICAgIHJldHVybiB7IGNvbnRlbnRFbCwgZnJhZ21lbnQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIG5vdGljZSBjb250ZW50LCBwcmVmaXhpbmcgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgcGx1Z2luIG5hbWUgaW4gYSBzdHlsZWQgZWxlbWVudCBzbyBpdCBpc1xuICAgKiB2aXN1YWxseSBkaXN0aW5ndWlzaGVkIGZyb20gdGhlIG1lc3NhZ2UgYm9keS5cbiAgICpcbiAgICogVGhlIG5hbWUgaXMgcmVuZGVyZWQgYXMgaW5saW5lIGNvZGUsIHRoZSB3YXkgZXZlcnkgcGx1Z2luIG5hbWUgaW4gdGhlIFVJIGlzLCBpbnNpZGUgYSBzcGFuIHRoYXQga2VlcHNcbiAgICogdGhlIHByZWZpeCdzIG93biBsYXlvdXQgYW5kIGFjY2VudCBjb2xvci5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0byBkaXNwbGF5IGFmdGVyIHRoZSBwbHVnaW4gbmFtZSBwcmVmaXguXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIERvY3VtZW50RnJhZ21lbnR9IHdpdGggdGhlIHN0eWxlZCBwbHVnaW4gbmFtZSBwcmVmaXggZm9sbG93ZWQgYnkgdGhlIG1lc3NhZ2UuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkUHJlZml4ZWRNZXNzYWdlKG1lc3NhZ2U6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmcpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICBjb25zdCBmcmFnbWVudCA9IGNyZWF0ZUZyYWdtZW50KCk7XG4gICAgY29uc3QgbmFtZUVsID0gY3JlYXRlU3BhbigpO1xuICAgIGFwcGVuZENvZGVCbG9jayhuYW1lRWwsIHRoaXMucGx1Z2luTmFtZSk7XG4gICAgYWRkUGx1Z2luQ3NzQ2xhc3NlcyhuYW1lRWwsIENzc0NsYXNzLlBsdWdpbk5vdGljZU5hbWUpO1xuICAgIGZyYWdtZW50LmFwcGVuZChuYW1lRWwpO1xuICAgIGlmICghdGhpcy5fbG9hZGVkKSB7XG4gICAgICBmcmFnbWVudC5hcHBlbmRUZXh0KCcgKHVubG9hZGVkKScpO1xuICAgIH1cbiAgICBmcmFnbWVudC5hcHBlbmRUZXh0KCdcXG4nKTtcbiAgICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICBmcmFnbWVudC5hcHBlbmRUZXh0KG1lc3NhZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmcmFnbWVudC5hcHBlbmQobWVzc2FnZSk7XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGVybWFuZW50Tm90aWNlKCk6IE5vdGljZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmdldFBlcm1hbmVudE5vdGljZXMoKS5nZXQodGhpcy5wbHVnaW5OYW1lKSA/PyBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQZXJtYW5lbnROb3RpY2VzKCk6IE1hcDxzdHJpbmcsIE5vdGljZT4ge1xuICAgIHJldHVybiBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGU8TWFwPHN0cmluZywgTm90aWNlPj4oUEVSTUFORU5UX05PVElDRVNfU1RBVEVfS0VZLCBuZXcgTWFwPHN0cmluZywgTm90aWNlPigpKS52YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlcyBhIG5vdGljZSBoYXJkIHRvIGNsb3NlOiBtYXJrcyBpdHMgb3V0ZXIgZWxlbWVudCAoc28gdGhlIENTUyBuZXV0cmFsaXplcyBpdHMgcGFkZGluZykgYW5kXG4gICAqIGluc3RhbGxzIGEgY2FwdHVyZS1waGFzZSBjbGljayBndWFyZCB0aGF0IHN0b3BzIGV2ZXJ5IGNsaWNrIGV4Y2VwdCBvbiBhbiBpbnRlcmFjdGl2ZSBlbGVtZW50IChhXG4gICAqIGJ1dHRvbiwgbGluaywgdGhlIGNsb3NlIGJ1dHRvbiwgZXRjLikgZnJvbSByZWFjaGluZyBPYnNpZGlhbidzIG93biBkaXNtaXNzIGhhbmRsZXIgXHUyMDE0IHNvIGFuXG4gICAqIGludGVyYWN0aXZlIGNoaWxkJ3Mgb3duIGhhbmRsZXIgc3RpbGwgcnVucyB3aGlsZSBhIHN0cmF5IGNsaWNrIGNhbm5vdCBkaXNtaXNzIHRoZSBub3RpY2UuXG4gICAqXG4gICAqIEBwYXJhbSBub3RpY2UgLSBUaGUgbm90aWNlIHRvIGd1YXJkLlxuICAgKiBAcGFyYW0gcmVxdWlyZXNFeHBsaWNpdENsb3NlIC0gV2hldGhlciB0aGUgbm90aWNlIHJlcXVpcmVzIGV4cGxpY2l0IGNsb3NlOyB3aGVuIGBmYWxzZWAsIG5vdGhpbmcgaXNcbiAgICogaW5zdGFsbGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsRXhwbGljaXRDbG9zZUd1YXJkcyhub3RpY2U6IE5vdGljZSwgcmVxdWlyZXNFeHBsaWNpdENsb3NlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCFyZXF1aXJlc0V4cGxpY2l0Q2xvc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gVGhlIG91dGVyIGAubm90aWNlYCBlbGVtZW50IChgY29udGFpbmVyRWxgKSBjYXJyaWVzIE9ic2lkaWFuJ3MgZGlzbWlzcy1vbi1jbGljayBoYW5kbGVyIGFuZCB0aGVcbiAgICAvLyBwYWRkaW5nIGEgc3RyYXkgY2xpY2sgY291bGQgbGFuZCBvbjsgbWFyayBpdCBzbyB0aGUgc3R5bGVzaGVldCBkcm9wcyB0aGF0IHBhZGRpbmcuXG4gICAgYWRkUGx1Z2luQ3NzQ2xhc3Nlcyhub3RpY2UuY29udGFpbmVyRWwsIENzc0NsYXNzLlBsdWdpbk5vdGljZVJlcXVpcmVzRXhwbGljaXRDbG9zZSk7XG4gICAgLy8gU3RvcCBldmVyeSBjbGljayBvbiB0aGUgbm90aWNlIFx1MjAxNCBleGNlcHQgb24gYW4gaW50ZXJhY3RpdmUgZWxlbWVudCBcdTIwMTQgZnJvbSByZWFjaGluZyBPYnNpZGlhbidzXG4gICAgLy8gZGlzbWlzcyBoYW5kbGVyLiBSZWdpc3RlcmVkIGluIHRoZSBjYXB0dXJlIHBoYXNlIG9uIHRoZSBvdXRlcm1vc3QgZWxlbWVudCBzbyBpdCBhbHdheXMgcnVucyBmaXJzdC5cbiAgICAvLyBMZXR0aW5nIGEgY2xpY2sgcmVhY2ggYW4gaW50ZXJhY3RpdmUgY2hpbGQgKGEgYnV0dG9uLCBsaW5rLCB0aGUgY2xvc2UgYnV0dG9uLCBldGMuKSBpcyB3aGF0IGtlZXBzXG4gICAgLy8gaXRzIG93biBoYW5kbGVyIHdvcmtpbmc7IHRoZSBidWJibGUtcGhhc2UgZ3VhcmQgb24gdGhlIGNvbnRlbnQgd3JhcHBlciB0aGVuIHN0b3BzIHRoYXQgY2xpY2sgZnJvbVxuICAgIC8vIGJ1YmJsaW5nIHVwIHRvIE9ic2lkaWFuJ3MgZGlzbWlzcyBoYW5kbGVyLCBzbyB0aGUgbm90aWNlIHN0aWxsIHN0YXlzIG9wZW4uXG4gICAgbm90aWNlLmNvbnRhaW5lckVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCRldmVudCkgPT4ge1xuICAgICAgaWYgKCRldmVudC50YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmICRldmVudC50YXJnZXQuY2xvc2VzdChJTlRFUkFDVElWRV9FTEVNRU5UX1NFTEVDVE9SKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfSwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYWNrcyBhIGNsaWNrIG9uIHRoZSBub3RpY2Ugc28ge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm9uSGlkZX0gY2FuIHJlcG9ydCBhXG4gICAqIHVzZXIgZGlzbWlzc2FsLiBPYnNpZGlhbiBoaWRlcyBhIGRpc21pc3NpYmxlIG5vdGljZSBzeW5jaHJvbm91c2x5IGR1cmluZyB0aGUgY2xpY2ssIHNvIGFcbiAgICogY2FwdHVyZS1waGFzZSBsaXN0ZW5lciBtYXJrcyB0aGUgbm90aWNlIGJlZm9yZSB0aGF0IGhpZGUgcnVuczsgdGhlIG1hcmsgaXMgY2xlYXJlZCBhZnRlciB0aGUgZXZlbnRcbiAgICogc28gYSBsYXRlciBwcm9ncmFtbWF0aWMgaGlkZSBpcyBub3QgbWlzYXR0cmlidXRlZC4gQSBjbG9zZS1idXR0b24gY2xpY2sgaXMgdHJhY2tlZCBzZXBhcmF0ZWx5IChzZWVcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudC5hcHBlbmRDbG9zZUJ1dHRvbn0pLlxuICAgKlxuICAgKiBAcGFyYW0gbm90aWNlIC0gVGhlIG5vdGljZSB0byB0cmFjay5cbiAgICovXG4gIHByaXZhdGUgaW5zdGFsbFVzZXJDbGlja1RyYWNraW5nKG5vdGljZTogTm90aWNlKTogdm9pZCB7XG4gICAgbm90aWNlLmNvbnRhaW5lckVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgLy8gT2JzaWRpYW4gZGlzbWlzc2VzIGEgZGlzbWlzc2libGUgbm90aWNlIHN5bmNocm9ub3VzbHkgZHVyaW5nIHRoaXMgY2xpY2ssIHNvIG1hcmsgaXQgbm93IChiZWZvcmVcbiAgICAgIC8vIHRoYXQgaGlkZSBydW5zKSBhbmQgY2xlYXIgaXQgb24gdGhlIG5leHQgbWljcm90YXNrIFx1MjAxNCBhZnRlciBhbnkgc3luY2hyb25vdXMgZGlzbWlzcywgYnV0IGJlZm9yZSBhXG4gICAgICAvLyBsYXRlciBwcm9ncmFtbWF0aWMgaGlkZSwgc28gdGhhdCBoaWRlIGlzIG5vdCBtaXNhdHRyaWJ1dGVkIGFzIGEgdXNlciBhY3Rpb24uXG4gICAgICB0aGlzLnVzZXJDbGlja2VkTm90aWNlcy5hZGQobm90aWNlKTtcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgdGhpcy51c2VyQ2xpY2tlZE5vdGljZXMuZGVsZXRlKG5vdGljZSk7XG4gICAgICB9KTtcbiAgICB9LCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldFBlcm1hbmVudE5vdGljZShub3RpY2U6IE5vdGljZSB8IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBtYXAgPSB0aGlzLmdldFBlcm1hbmVudE5vdGljZXMoKTtcbiAgICBpZiAobm90aWNlKSB7XG4gICAgICBtYXAuc2V0KHRoaXMucGx1Z2luTmFtZSwgbm90aWNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWFwLmRlbGV0ZSh0aGlzLnBsdWdpbk5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBhIG5vdGljZSB3aXRoIHRoZSBnaXZlbiBkdXJhdGlvbiwgcGxhY2luZyBpdCBhY2NvcmRpbmcgdG8gaXRzIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlfTogYVxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5SZXBsYWNlfSBub3RpY2UgdGFrZXMgdGhlIHBlci1wbHVnaW4gc2xvdCAoaGlkaW5nIHdoYXRldmVyIHdhcyBpbiBpdCwgYW5kXG4gICAqIG9wdGlvbmFsbHkgcmVnaXN0ZXJpbmcgYXMgdGhpcyBwbHVnaW4ncyBwZXJtYW5lbnQgbm90aWNlKSwgYW4ge0BsaW5rIFBsdWdpbk5vdGljZU1vZGUuQXBwZW5kfSBvbmVcbiAgICogam9pbnMgdGhlIG5vdGljZSBhbHJlYWR5IGluIHRoZSBzbG90LCBhbmQgYSB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5TZXBhcmF0ZX0gb25lIGlzIHRyYWNrZWQgb24gaXRzXG4gICAqIG93biwgbGVhdmluZyB0aGUgc2xvdCB1bnRvdWNoZWQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMgVGhlIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93bk5vdGljZX0gZGVzY3JpYmluZyB3aGVyZSB0aGUgbWVzc2FnZSBlbmRlZCB1cC5cbiAgICovXG4gIHByaXZhdGUgc2hvd05vdGljZVdpdGhEdXJhdGlvbihwYXJhbXM6IFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VXaXRoRHVyYXRpb25QYXJhbXMpOiBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93bk5vdGljZSB7XG4gICAgY29uc3QgeyBkdXJhdGlvbkluTWlsbGlzZWNvbmRzLCBtZXNzYWdlLCBtb2RlLCBvbkNsb3NlQ2xpY2ssIG9uSGlkZSwgcmVxdWlyZXNFeHBsaWNpdENsb3NlLCBzaG91bGRSZWdpc3RlckFzUGVybWFuZW50LCBzaG91bGRTaG93Q2xvc2VCdXR0b24gfSA9IHBhcmFtcztcbiAgICAvLyBPYnNpZGlhbidzIGBOb3RpY2VgIHRyZWF0cyBhbiBvbWl0dGVkIGR1cmF0aW9uIGFzIGl0cyBkZWZhdWx0LCBzbyBtYXAgdGhlIGBudWxsYCBcIm5vIGV4cGxpY2l0XG4gICAgLy8gZHVyYXRpb25cIiB2YWx1ZSB0byBgdW5kZWZpbmVkYC5cbiAgICBjb25zdCBub3RpY2VEdXJhdGlvbkluTWlsbGlzZWNvbmRzID0gZHVyYXRpb25Jbk1pbGxpc2Vjb25kcyA/PyB1bmRlZmluZWQ7XG5cbiAgICBpZiAobW9kZSA9PT0gUGx1Z2luTm90aWNlTW9kZS5BcHBlbmQpIHtcbiAgICAgIGNvbnN0IGFwcGVuZGVkTm90aWNlID0gdGhpcy5hcHBlbmRUb0N1cnJlbnROb3RpY2Uobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFBsdWdpbk5vdGljZUNvbXBvbmVudEFwcGVuZFRvQ3VycmVudE5vdGljZVBhcmFtcz4oe1xuICAgICAgICBkdXJhdGlvbkluTWlsbGlzZWNvbmRzLFxuICAgICAgICBtZXNzYWdlLFxuICAgICAgICBvbkhpZGUsXG4gICAgICAgIHNob3VsZFJlZ2lzdGVyQXNQZXJtYW5lbnRcbiAgICAgIH0pKTtcbiAgICAgIGlmIChhcHBlbmRlZE5vdGljZSkge1xuICAgICAgICByZXR1cm4gYXBwZW5kZWROb3RpY2U7XG4gICAgICB9XG4gICAgICAvLyBOb3RoaW5nIG9uIHNjcmVlbiB0byBhcHBlbmQgdG8sIHNvIHRoaXMgbWVzc2FnZSBiZWNvbWVzIHRoZSBzbG90J3Mgbm90aWNlIGluc3RlYWQuXG4gICAgfVxuXG4gICAgY29uc3QgaGFzQ2xvc2VCdXR0b24gPSByZXF1aXJlc0V4cGxpY2l0Q2xvc2UgJiYgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uO1xuICAgIC8vIFRoZSBjbG9zZSBidXR0b24ncyBjbGljayBoYW5kbGVyIG5lZWRzIHRoZSBgTm90aWNlYCwgd2hpY2ggZG9lcyBub3QgZXhpc3QgdW50aWwgaXQgaXMgYnVpbHQgZnJvbVxuICAgIC8vIHRoaXMgY29udGVudDsgY2FwdHVyZSBpdCBsYXppbHkgdmlhIGEgaG9sZGVyIHJlc29sdmVkIGF0IGNsaWNrIHRpbWUuIFRoZSBnZXR0ZXIgaXMgY3JlYXRlZCBvbmx5XG4gICAgLy8gd2hlbiBhIGNsb3NlIGJ1dHRvbiBpcyBzaG93bi5cbiAgICBsZXQgYnVpbHROb3RpY2U6IE5vdGljZSB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IHsgY29udGVudEVsLCBmcmFnbWVudCB9ID0gdGhpcy5idWlsZE5vdGljZUNvbnRlbnQobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFBsdWdpbk5vdGljZUNvbXBvbmVudEJ1aWxkTm90aWNlQ29udGVudFBhcmFtcz4oe1xuICAgICAgZ2V0Tm90aWNlOiBoYXNDbG9zZUJ1dHRvbiA/ICgpOiBOb3RpY2UgfCBudWxsID0+IGJ1aWx0Tm90aWNlIDogdW5kZWZpbmVkLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIG9uQ2xvc2VDbGljayxcbiAgICAgIHJlcXVpcmVzRXhwbGljaXRDbG9zZSxcbiAgICAgIHNob3VsZFNob3dDbG9zZUJ1dHRvblxuICAgIH0pKTtcblxuICAgIGlmIChtb2RlID09PSBQbHVnaW5Ob3RpY2VNb2RlLlNlcGFyYXRlKSB7XG4gICAgICBidWlsdE5vdGljZSA9IG5ldyBOb3RpY2UoZnJhZ21lbnQsIG5vdGljZUR1cmF0aW9uSW5NaWxsaXNlY29uZHMpO1xuICAgICAgdGhpcy5pbnN0YWxsRXhwbGljaXRDbG9zZUd1YXJkcyhidWlsdE5vdGljZSwgcmVxdWlyZXNFeHBsaWNpdENsb3NlKTtcbiAgICAgIHRoaXMuaW5zdGFsbFVzZXJDbGlja1RyYWNraW5nKGJ1aWx0Tm90aWNlKTtcbiAgICAgIHRoaXMud2lyZU9uSGlkZShidWlsdE5vdGljZSwgb25IaWRlKTtcbiAgICAgIHRoaXMuc3RhbmRhbG9uZU5vdGljZXMuYWRkKGJ1aWx0Tm90aWNlKTtcbiAgICAgIHJldHVybiB7IGNvbnRlbnRFbCwgaXNOb3RpY2VPd25lZDogdHJ1ZSwgbm90aWNlOiBidWlsdE5vdGljZSB9O1xuICAgIH1cblxuICAgIHRoaXMubm90aWNlPy5oaWRlKCk7XG4gICAgYnVpbHROb3RpY2UgPSBuZXcgTm90aWNlKGZyYWdtZW50LCBub3RpY2VEdXJhdGlvbkluTWlsbGlzZWNvbmRzKTtcbiAgICB0aGlzLm5vdGljZSA9IGJ1aWx0Tm90aWNlO1xuICAgIHRoaXMuaW5zdGFsbEV4cGxpY2l0Q2xvc2VHdWFyZHMoYnVpbHROb3RpY2UsIHJlcXVpcmVzRXhwbGljaXRDbG9zZSk7XG4gICAgdGhpcy5pbnN0YWxsVXNlckNsaWNrVHJhY2tpbmcoYnVpbHROb3RpY2UpO1xuICAgIHRoaXMud2lyZU9uSGlkZShidWlsdE5vdGljZSwgb25IaWRlKTtcblxuICAgIGlmIChzaG91bGRSZWdpc3RlckFzUGVybWFuZW50KSB7XG4gICAgICB0aGlzLnNldFBlcm1hbmVudE5vdGljZShidWlsdE5vdGljZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0UGVybWFuZW50Tm90aWNlKG51bGwpO1xuICAgIH1cbiAgICByZXR1cm4geyBjb250ZW50RWwsIGlzTm90aWNlT3duZWQ6IHRydWUsIG5vdGljZTogYnVpbHROb3RpY2UgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcmFwcyBhIG5vdGljZSdzIGBoaWRlYCBzbyB0aGUgZ2l2ZW4gY2FsbGJhY2sgcnVucyB0aGUgZmlyc3QgdGltZSB0aGUgbm90aWNlIGlzIGhpZGRlbiBcdTIwMTQgYnkgdGhlXG4gICAqIHVzZXIsIGJ5IGEgcmVwbGFjaW5nIG5vdGljZSwgYnkgaXRzIGR1cmF0aW9uIGVsYXBzaW5nLCBvciBvbiB1bmxvYWQuIERvZXMgbm90aGluZyB3aGVuIG5vIGNhbGxiYWNrXG4gICAqIGlzIGdpdmVuLlxuICAgKlxuICAgKiBAcGFyYW0gbm90aWNlIC0gVGhlIG5vdGljZSB3aG9zZSBgaGlkZWAgdG8gd3JhcC5cbiAgICogQHBhcmFtIG9uSGlkZSAtIFRoZSBjYWxsYmFjayB0byBpbnZva2Ugb24gdGhlIGZpcnN0IGhpZGUsIG9yIGB1bmRlZmluZWRgIHRvIHNraXAgd3JhcHBpbmcuXG4gICAqL1xuICBwcml2YXRlIHdpcmVPbkhpZGUobm90aWNlOiBOb3RpY2UsIG9uSGlkZTogKChpbmZvOiBQbHVnaW5Ob3RpY2VIaWRlSW5mbykgPT4gUHJvbWlzYWJsZTx2b2lkPikgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAoIW9uSGlkZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBSdW4gYG9uSGlkZWAgdGhlIGZpcnN0IHRpbWUgdGhlIG5vdGljZSBpcyBoaWRkZW4uIEEgYG9uY2VgIHBhdGNoIG9uIGBoaWRlYCBpbnRlcmNlcHRzIGV4YWN0bHkgb25lXG4gICAgLy8gY2FsbCB0aGVuIHVuaW5zdGFsbHMgaXRzZWxmICh1bmxvYWRpbmcgdGhpcyBkZWRpY2F0ZWQgY29tcG9uZW50KSwgc28gdGhlcmUgaXMgbm8gbWFudWFsXG4gICAgLy8gc2luZ2xlLWZpcmUgYm9va2tlZXBpbmcgYW5kIG5vIGxpbmdlcmluZyBwYXRjaCBvbiB0aGUgdHJhbnNpZW50IG5vdGljZS4gVGhlIHVzZXItY2xvc2UgZmxhZ3Mgd2VyZVxuICAgIC8vIHNldCBiZWZvcmUgYGhpZGUoKWAgd2FzIGludm9rZWQgKHNlZSBgYXBwZW5kQ2xvc2VCdXR0b25gIC8gYGluc3RhbGxVc2VyQ2xpY2tUcmFja2luZ2ApLCBzbyB0aGV5XG4gICAgLy8gc3RpbGwgaG9sZCB3aGVuIHJlYWQgaGVyZSBhZnRlciBgZmFsbGJhY2soKWAuXG4gICAgY29uc3QgcGF0Y2hDb21wb25lbnQgPSBuZXcgTW9ua2V5QXJvdW5kQ29tcG9uZW50KCk7XG4gICAgcGF0Y2hDb21wb25lbnQubG9hZCgpO1xuICAgIHBhdGNoQ29tcG9uZW50LnJlZ2lzdGVyTWV0aG9kUGF0Y2goe1xuICAgICAgJG9iamVjdDogbm90aWNlLFxuICAgICAgbWV0aG9kTmFtZTogJ2hpZGUnLFxuICAgICAgb25jZTogdHJ1ZSxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2sgfSkgPT4ge1xuICAgICAgICBmYWxsYmFjaygpO1xuICAgICAgICBjb25zdCBpc0Nsb3NlQnV0dG9uQ2xpY2tlZCA9IHRoaXMuY2xvc2VCdXR0b25DbGlja2VkTm90aWNlcy5oYXMobm90aWNlKTtcbiAgICAgICAgY29uc3QgaXNVc2VyQWN0aW9uID0gaXNDbG9zZUJ1dHRvbkNsaWNrZWQgfHwgdGhpcy51c2VyQ2xpY2tlZE5vdGljZXMuaGFzKG5vdGljZSk7XG4gICAgICAgIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBvbkhpZGUoeyBpc0Nsb3NlQnV0dG9uQ2xpY2tlZCwgaXNVc2VyQWN0aW9uIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFVQSxTQUFTLGdCQUFnQjtBQUN6QixTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLG1DQUFtQztBQUM1QyxTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLG9CQUFv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