@mnaoumov/obsidian-lib 1.0.0 → 1.0.1

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 (386) hide show
  1. package/README.md +9 -1
  2. package/dist/lib/cjs/__merged.cjs +40 -64
  3. package/dist/lib/cjs/active-file-provider.cjs +40 -64
  4. package/dist/lib/cjs/app.cjs +40 -64
  5. package/dist/lib/cjs/async-with-notice.cjs +40 -64
  6. package/dist/lib/cjs/attachment-path.cjs +40 -64
  7. package/dist/lib/cjs/attachment-unit-folder.cjs +40 -64
  8. package/dist/lib/cjs/backlink-index.cjs +41 -65
  9. package/dist/lib/cjs/backlink.cjs +40 -64
  10. package/dist/lib/cjs/bases-view-registrar.cjs +40 -64
  11. package/dist/lib/cjs/callout.cjs +40 -64
  12. package/dist/lib/cjs/canvas.cjs +40 -64
  13. package/dist/lib/cjs/case-insensitive-file-index.cjs +40 -64
  14. package/dist/lib/cjs/code-block-markdown-information.cjs +40 -64
  15. package/dist/lib/cjs/code-block-reg-exp.cjs +40 -64
  16. package/dist/lib/cjs/codemirror/index.cjs +40 -64
  17. package/dist/lib/cjs/codemirror/state-field-spec.cjs +40 -64
  18. package/dist/lib/cjs/command-handlers/abstract-file-command-handler.cjs +40 -64
  19. package/dist/lib/cjs/command-handlers/command-handler-component.cjs +40 -64
  20. package/dist/lib/cjs/command-handlers/command-handler.cjs +40 -64
  21. package/dist/lib/cjs/command-handlers/editor-command-handler.cjs +40 -64
  22. package/dist/lib/cjs/command-handlers/file-command-handler.cjs +40 -64
  23. package/dist/lib/cjs/command-handlers/folder-command-handler.cjs +40 -64
  24. package/dist/lib/cjs/command-handlers/global-command-handler.cjs +40 -64
  25. package/dist/lib/cjs/command-handlers/index.cjs +40 -64
  26. package/dist/lib/cjs/command-handlers/open-demo-vault-command-handler.cjs +40 -64
  27. package/dist/lib/cjs/command-handlers/open-settings-command-handler.cjs +40 -64
  28. package/dist/lib/cjs/command-handlers/unlock-active-note-command-handler.cjs +40 -64
  29. package/dist/lib/cjs/command-registrar.cjs +40 -64
  30. package/dist/lib/cjs/community-plugins.cjs +40 -64
  31. package/dist/lib/cjs/components/abort-signal-component.cjs +40 -64
  32. package/dist/lib/cjs/components/all-windows-event-component.cjs +40 -64
  33. package/dist/lib/cjs/components/async-error-handler-component.cjs +40 -64
  34. package/dist/lib/cjs/components/async-events-component.cjs +40 -64
  35. package/dist/lib/cjs/components/case-insensitive-file-index-component.cjs +40 -64
  36. package/dist/lib/cjs/components/component-ex.cjs +41 -65
  37. package/dist/lib/cjs/components/console-debug-component.cjs +40 -64
  38. package/dist/lib/cjs/components/core-plugin-toggle-component.cjs +40 -64
  39. package/dist/lib/cjs/components/disposable-component.cjs +40 -64
  40. package/dist/lib/cjs/components/embed-extensions-component.cjs +40 -64
  41. package/dist/lib/cjs/components/generate-markdown-link-default-params-component.cjs +40 -64
  42. package/dist/lib/cjs/components/index.cjs +40 -64
  43. package/dist/lib/cjs/components/layout-ready-component.cjs +40 -64
  44. package/dist/lib/cjs/components/menu-event-registrar-component.cjs +40 -64
  45. package/dist/lib/cjs/components/monkey-around-component.cjs +40 -64
  46. package/dist/lib/cjs/components/notebook-navigator-menu-event-registrar-component.cjs +40 -64
  47. package/dist/lib/cjs/components/plugin-context-component.cjs +40 -64
  48. package/dist/lib/cjs/components/plugin-gate-component.cjs +41 -65
  49. package/dist/lib/cjs/components/plugin-notice-component.cjs +40 -64
  50. package/dist/lib/cjs/components/plugin-settings-component.cjs +41 -65
  51. package/dist/lib/cjs/components/plugin-settings-tab-component.cjs +40 -64
  52. package/dist/lib/cjs/components/plugin-suggestion-component.cjs +40 -64
  53. package/dist/lib/cjs/components/pointer-position-component.cjs +40 -64
  54. package/dist/lib/cjs/components/registry-component.cjs +40 -64
  55. package/dist/lib/cjs/components/release-notes-component.cjs +40 -64
  56. package/dist/lib/cjs/components/rename-delete-handler-component.cjs +40 -64
  57. package/dist/lib/cjs/components/rmdir-guard-component.cjs +40 -64
  58. package/dist/lib/cjs/components/settings-migration-component.cjs +40 -64
  59. package/dist/lib/cjs/components/syntax-highlighting-component.cjs +40 -64
  60. package/dist/lib/cjs/components/templates-language-component.cjs +40 -64
  61. package/dist/lib/cjs/constructors/get-dom-events-handlers-constructor.cjs +40 -64
  62. package/dist/lib/cjs/constructors/index.cjs +40 -64
  63. package/dist/lib/cjs/css-class.cjs +40 -64
  64. package/dist/lib/cjs/data-handler.cjs +40 -64
  65. package/dist/lib/cjs/dataview-link.cjs +40 -64
  66. package/dist/lib/cjs/dataview.cjs +40 -64
  67. package/dist/lib/cjs/debug.cjs +40 -64
  68. package/dist/lib/cjs/demo-vault-helper-settings.cjs +40 -64
  69. package/dist/lib/cjs/demo-vault-helper.cjs +40 -64
  70. package/dist/lib/cjs/demo-vault-naming.cjs +40 -64
  71. package/dist/lib/cjs/desktop-demo-vault-opener.cjs +40 -64
  72. package/dist/lib/cjs/desktop-trusted-input.cjs +40 -64
  73. package/dist/lib/cjs/editor-extension-registrar.cjs +40 -64
  74. package/dist/lib/cjs/editor-suggest-registrar.cjs +40 -64
  75. package/dist/lib/cjs/editor.cjs +40 -64
  76. package/dist/lib/cjs/events.cjs +40 -64
  77. package/dist/lib/cjs/extensions-registrar.cjs +40 -64
  78. package/dist/lib/cjs/file-change.cjs +40 -64
  79. package/dist/lib/cjs/file-explorer.cjs +40 -64
  80. package/dist/lib/cjs/file-manager.cjs +40 -64
  81. package/dist/lib/cjs/file-system.cjs +40 -64
  82. package/dist/lib/cjs/folder-note.cjs +40 -64
  83. package/dist/lib/cjs/frontmatter-formatting.cjs +41 -65
  84. package/dist/lib/cjs/frontmatter-link-cache-with-offsets.cjs +40 -64
  85. package/dist/lib/cjs/frontmatter.cjs +40 -64
  86. package/dist/lib/cjs/generated-during-build.cjs +41 -65
  87. package/dist/lib/cjs/generated-during-build.d.cts +8 -2
  88. package/dist/lib/cjs/hover-link-source-registrar.cjs +40 -64
  89. package/dist/lib/cjs/html-element.cjs +40 -64
  90. package/dist/lib/cjs/i18n/custom-type-options.cjs +40 -64
  91. package/dist/lib/cjs/i18n/default-translations.cjs +40 -64
  92. package/dist/lib/cjs/i18n/i18n.cjs +40 -64
  93. package/dist/lib/cjs/i18n/index.cjs +40 -64
  94. package/dist/lib/cjs/i18n/locales/en.cjs +40 -64
  95. package/dist/lib/cjs/i18n/locales/index.cjs +40 -64
  96. package/dist/lib/cjs/i18n/locales/translations-map.cjs +40 -64
  97. package/dist/lib/cjs/index.cjs +40 -64
  98. package/dist/lib/cjs/is-in-obsidian.cjs +40 -64
  99. package/dist/lib/cjs/library-styles.cjs +40 -64
  100. package/dist/lib/cjs/library.cjs +40 -64
  101. package/dist/lib/cjs/link-name.cjs +40 -64
  102. package/dist/lib/cjs/link-update-progress.cjs +40 -64
  103. package/dist/lib/cjs/link.cjs +40 -64
  104. package/dist/lib/cjs/logger.cjs +40 -64
  105. package/dist/lib/cjs/loop.cjs +40 -64
  106. package/dist/lib/cjs/markdown-code-block-processor-registrar.cjs +40 -64
  107. package/dist/lib/cjs/markdown-code-block-processor.cjs +40 -64
  108. package/dist/lib/cjs/markdown-post-processor-registrar.cjs +40 -64
  109. package/dist/lib/cjs/markdown-view.cjs +40 -64
  110. package/dist/lib/cjs/markdown.cjs +40 -64
  111. package/dist/lib/cjs/menu-event-registrar.cjs +40 -64
  112. package/dist/lib/cjs/metadata-cache.cjs +40 -64
  113. package/dist/lib/cjs/mobile-trusted-input.cjs +40 -64
  114. package/dist/lib/cjs/modals/alert.cjs +40 -64
  115. package/dist/lib/cjs/modals/confirm.cjs +40 -64
  116. package/dist/lib/cjs/modals/index.cjs +40 -64
  117. package/dist/lib/cjs/modals/minimizable-modal.cjs +40 -64
  118. package/dist/lib/cjs/modals/modal-command-builder.cjs +40 -64
  119. package/dist/lib/cjs/modals/modal.cjs +40 -64
  120. package/dist/lib/cjs/modals/prompt.cjs +40 -64
  121. package/dist/lib/cjs/modals/select-item.cjs +40 -64
  122. package/dist/lib/cjs/modals/select-option.cjs +40 -64
  123. package/dist/lib/cjs/modals/suggest-modal-command-builder.cjs +40 -64
  124. package/dist/lib/cjs/note-priority.cjs +41 -65
  125. package/dist/lib/cjs/notebook-navigator.cjs +40 -64
  126. package/dist/lib/cjs/obsidian-dev-utils-state.cjs +40 -64
  127. package/dist/lib/cjs/obsidian-protocol-handler-registrar.cjs +40 -64
  128. package/dist/lib/cjs/obsidian-settings.cjs +40 -64
  129. package/dist/lib/cjs/parse-link.cjs +40 -64
  130. package/dist/lib/cjs/path-settings.cjs +40 -64
  131. package/dist/lib/cjs/pdf.cjs +40 -64
  132. package/dist/lib/cjs/plugin/index.cjs +40 -64
  133. package/dist/lib/cjs/plugin/plugin-api.cjs +40 -64
  134. package/dist/lib/cjs/plugin/plugin-context.cjs +40 -64
  135. package/dist/lib/cjs/plugin/plugin-event-source.cjs +40 -64
  136. package/dist/lib/cjs/plugin/plugin-install-state.cjs +40 -64
  137. package/dist/lib/cjs/plugin/plugin-lifecycle-events.cjs +40 -64
  138. package/dist/lib/cjs/plugin/plugin-settings-tab.cjs +41 -65
  139. package/dist/lib/cjs/plugin/plugin.cjs +41 -65
  140. package/dist/lib/cjs/plugin/settings-migration-api.cjs +40 -64
  141. package/dist/lib/cjs/plugin-cli-handler-registrar.cjs +40 -64
  142. package/dist/lib/cjs/popovers/field-popover.cjs +40 -64
  143. package/dist/lib/cjs/popovers/index.cjs +40 -64
  144. package/dist/lib/cjs/popovers/popover-anchor.cjs +40 -64
  145. package/dist/lib/cjs/popovers/popover.cjs +40 -64
  146. package/dist/lib/cjs/property-entry.cjs +40 -64
  147. package/dist/lib/cjs/queue.cjs +40 -64
  148. package/dist/lib/cjs/react/app-context.cjs +40 -64
  149. package/dist/lib/cjs/react/index.cjs +40 -64
  150. package/dist/lib/cjs/reference.cjs +40 -64
  151. package/dist/lib/cjs/resource-lock.cjs +40 -64
  152. package/dist/lib/cjs/resource-url.cjs +40 -64
  153. package/dist/lib/cjs/ribbon-icon-registrar.cjs +40 -64
  154. package/dist/lib/cjs/setting-components/checkbox-component.cjs +40 -64
  155. package/dist/lib/cjs/setting-components/code-highlighter-component.cjs +40 -64
  156. package/dist/lib/cjs/setting-components/date-component.cjs +40 -64
  157. package/dist/lib/cjs/setting-components/date-time-component.cjs +40 -64
  158. package/dist/lib/cjs/setting-components/email-component.cjs +40 -64
  159. package/dist/lib/cjs/setting-components/file-component.cjs +40 -64
  160. package/dist/lib/cjs/setting-components/index.cjs +40 -64
  161. package/dist/lib/cjs/setting-components/month-component.cjs +40 -64
  162. package/dist/lib/cjs/setting-components/multiple-dropdown-component.cjs +41 -65
  163. package/dist/lib/cjs/setting-components/multiple-email-component.cjs +40 -64
  164. package/dist/lib/cjs/setting-components/multiple-file-component.cjs +40 -64
  165. package/dist/lib/cjs/setting-components/multiple-text-component.cjs +40 -64
  166. package/dist/lib/cjs/setting-components/number-component.cjs +40 -64
  167. package/dist/lib/cjs/setting-components/password-component.cjs +40 -64
  168. package/dist/lib/cjs/setting-components/setting-component-wrapper.cjs +40 -64
  169. package/dist/lib/cjs/setting-components/telephone-component.cjs +40 -64
  170. package/dist/lib/cjs/setting-components/text-based-component.cjs +40 -64
  171. package/dist/lib/cjs/setting-components/time-component.cjs +40 -64
  172. package/dist/lib/cjs/setting-components/tri-state-checkbox-component.cjs +40 -64
  173. package/dist/lib/cjs/setting-components/typed-dropdown-component.cjs +40 -64
  174. package/dist/lib/cjs/setting-components/typed-multiple-dropdown-component.cjs +40 -64
  175. package/dist/lib/cjs/setting-components/typed-range-text-component.cjs +40 -64
  176. package/dist/lib/cjs/setting-components/typed-text-component.cjs +41 -65
  177. package/dist/lib/cjs/setting-components/url-component.cjs +40 -64
  178. package/dist/lib/cjs/setting-components/validator-component.cjs +41 -65
  179. package/dist/lib/cjs/setting-components/value-component-with-change-tracking.cjs +40 -64
  180. package/dist/lib/cjs/setting-components/week-component.cjs +40 -64
  181. package/dist/lib/cjs/setting-ex.cjs +40 -64
  182. package/dist/lib/cjs/setting-group-ex.cjs +40 -64
  183. package/dist/lib/cjs/status-bar-item-registrar.cjs +40 -64
  184. package/dist/lib/cjs/templater.cjs +40 -64
  185. package/dist/lib/cjs/transformers/duration-transformer.cjs +40 -64
  186. package/dist/lib/cjs/transformers/index.cjs +40 -64
  187. package/dist/lib/cjs/trusted-input.cjs +40 -64
  188. package/dist/lib/cjs/validation.cjs +40 -64
  189. package/dist/lib/cjs/vault-delete.cjs +40 -64
  190. package/dist/lib/cjs/vault-transaction.cjs +40 -64
  191. package/dist/lib/cjs/vault.cjs +41 -65
  192. package/dist/lib/cjs/view-registrar.cjs +40 -64
  193. package/dist/lib/cjs/workspace.cjs +40 -64
  194. package/dist/lib/esm/__merged.mjs +6 -14
  195. package/dist/lib/esm/active-file-provider.mjs +6 -14
  196. package/dist/lib/esm/app.mjs +6 -14
  197. package/dist/lib/esm/async-with-notice.mjs +6 -14
  198. package/dist/lib/esm/attachment-path.mjs +6 -14
  199. package/dist/lib/esm/attachment-unit-folder.mjs +6 -14
  200. package/dist/lib/esm/backlink-index.mjs +6 -14
  201. package/dist/lib/esm/backlink.mjs +6 -14
  202. package/dist/lib/esm/bases-view-registrar.mjs +6 -14
  203. package/dist/lib/esm/callout.mjs +6 -14
  204. package/dist/lib/esm/canvas.mjs +6 -14
  205. package/dist/lib/esm/case-insensitive-file-index.mjs +6 -14
  206. package/dist/lib/esm/code-block-markdown-information.mjs +5 -13
  207. package/dist/lib/esm/code-block-reg-exp.mjs +6 -14
  208. package/dist/lib/esm/codemirror/index.mjs +6 -14
  209. package/dist/lib/esm/codemirror/state-field-spec.mjs +5 -13
  210. package/dist/lib/esm/command-handlers/abstract-file-command-handler.mjs +6 -14
  211. package/dist/lib/esm/command-handlers/command-handler-component.mjs +6 -14
  212. package/dist/lib/esm/command-handlers/command-handler.mjs +6 -14
  213. package/dist/lib/esm/command-handlers/editor-command-handler.mjs +6 -14
  214. package/dist/lib/esm/command-handlers/file-command-handler.mjs +6 -14
  215. package/dist/lib/esm/command-handlers/folder-command-handler.mjs +6 -14
  216. package/dist/lib/esm/command-handlers/global-command-handler.mjs +6 -14
  217. package/dist/lib/esm/command-handlers/index.mjs +6 -14
  218. package/dist/lib/esm/command-handlers/open-demo-vault-command-handler.mjs +6 -14
  219. package/dist/lib/esm/command-handlers/open-settings-command-handler.mjs +6 -14
  220. package/dist/lib/esm/command-handlers/unlock-active-note-command-handler.mjs +6 -14
  221. package/dist/lib/esm/command-registrar.mjs +6 -14
  222. package/dist/lib/esm/community-plugins.mjs +6 -14
  223. package/dist/lib/esm/components/abort-signal-component.mjs +6 -14
  224. package/dist/lib/esm/components/all-windows-event-component.mjs +6 -14
  225. package/dist/lib/esm/components/async-error-handler-component.mjs +6 -14
  226. package/dist/lib/esm/components/async-events-component.mjs +6 -14
  227. package/dist/lib/esm/components/case-insensitive-file-index-component.mjs +6 -14
  228. package/dist/lib/esm/components/component-ex.mjs +6 -14
  229. package/dist/lib/esm/components/console-debug-component.mjs +6 -14
  230. package/dist/lib/esm/components/core-plugin-toggle-component.mjs +6 -14
  231. package/dist/lib/esm/components/disposable-component.mjs +6 -14
  232. package/dist/lib/esm/components/embed-extensions-component.mjs +6 -14
  233. package/dist/lib/esm/components/generate-markdown-link-default-params-component.mjs +6 -14
  234. package/dist/lib/esm/components/index.mjs +6 -14
  235. package/dist/lib/esm/components/layout-ready-component.mjs +6 -14
  236. package/dist/lib/esm/components/menu-event-registrar-component.mjs +6 -14
  237. package/dist/lib/esm/components/monkey-around-component.mjs +6 -14
  238. package/dist/lib/esm/components/notebook-navigator-menu-event-registrar-component.mjs +6 -14
  239. package/dist/lib/esm/components/plugin-context-component.mjs +6 -14
  240. package/dist/lib/esm/components/plugin-gate-component.mjs +6 -14
  241. package/dist/lib/esm/components/plugin-notice-component.mjs +6 -14
  242. package/dist/lib/esm/components/plugin-settings-component.mjs +6 -14
  243. package/dist/lib/esm/components/plugin-settings-tab-component.mjs +6 -14
  244. package/dist/lib/esm/components/plugin-suggestion-component.mjs +6 -14
  245. package/dist/lib/esm/components/pointer-position-component.mjs +6 -14
  246. package/dist/lib/esm/components/registry-component.mjs +6 -14
  247. package/dist/lib/esm/components/release-notes-component.mjs +6 -14
  248. package/dist/lib/esm/components/rename-delete-handler-component.mjs +6 -14
  249. package/dist/lib/esm/components/rmdir-guard-component.mjs +6 -14
  250. package/dist/lib/esm/components/settings-migration-component.mjs +6 -14
  251. package/dist/lib/esm/components/syntax-highlighting-component.mjs +6 -14
  252. package/dist/lib/esm/components/templates-language-component.mjs +6 -14
  253. package/dist/lib/esm/constructors/get-dom-events-handlers-constructor.mjs +6 -14
  254. package/dist/lib/esm/constructors/index.mjs +6 -14
  255. package/dist/lib/esm/css-class.mjs +6 -14
  256. package/dist/lib/esm/data-handler.mjs +6 -14
  257. package/dist/lib/esm/dataview-link.mjs +6 -14
  258. package/dist/lib/esm/dataview.mjs +6 -14
  259. package/dist/lib/esm/debug.mjs +6 -14
  260. package/dist/lib/esm/demo-vault-helper-settings.mjs +5 -13
  261. package/dist/lib/esm/demo-vault-helper.mjs +6 -14
  262. package/dist/lib/esm/demo-vault-naming.mjs +6 -14
  263. package/dist/lib/esm/desktop-demo-vault-opener.mjs +6 -14
  264. package/dist/lib/esm/desktop-trusted-input.mjs +6 -14
  265. package/dist/lib/esm/editor-extension-registrar.mjs +6 -14
  266. package/dist/lib/esm/editor-suggest-registrar.mjs +6 -14
  267. package/dist/lib/esm/editor.mjs +6 -14
  268. package/dist/lib/esm/events.mjs +6 -14
  269. package/dist/lib/esm/extensions-registrar.mjs +6 -14
  270. package/dist/lib/esm/file-change.mjs +6 -14
  271. package/dist/lib/esm/file-explorer.mjs +6 -14
  272. package/dist/lib/esm/file-manager.mjs +6 -14
  273. package/dist/lib/esm/file-system.mjs +6 -14
  274. package/dist/lib/esm/folder-note.mjs +6 -14
  275. package/dist/lib/esm/frontmatter-formatting.mjs +6 -14
  276. package/dist/lib/esm/frontmatter-link-cache-with-offsets.mjs +6 -14
  277. package/dist/lib/esm/frontmatter.mjs +6 -14
  278. package/dist/lib/esm/generated-during-build.d.mts +8 -2
  279. package/dist/lib/esm/generated-during-build.mjs +7 -15
  280. package/dist/lib/esm/hover-link-source-registrar.mjs +6 -14
  281. package/dist/lib/esm/html-element.mjs +6 -14
  282. package/dist/lib/esm/i18n/custom-type-options.mjs +6 -14
  283. package/dist/lib/esm/i18n/default-translations.mjs +6 -14
  284. package/dist/lib/esm/i18n/i18n.mjs +6 -14
  285. package/dist/lib/esm/i18n/index.mjs +6 -14
  286. package/dist/lib/esm/i18n/locales/en.mjs +6 -14
  287. package/dist/lib/esm/i18n/locales/index.mjs +6 -14
  288. package/dist/lib/esm/i18n/locales/translations-map.mjs +6 -14
  289. package/dist/lib/esm/index.mjs +6 -14
  290. package/dist/lib/esm/is-in-obsidian.mjs +6 -14
  291. package/dist/lib/esm/library-styles.mjs +6 -14
  292. package/dist/lib/esm/library.mjs +6 -14
  293. package/dist/lib/esm/link-name.mjs +6 -14
  294. package/dist/lib/esm/link-update-progress.mjs +5 -13
  295. package/dist/lib/esm/link.mjs +6 -14
  296. package/dist/lib/esm/logger.mjs +6 -14
  297. package/dist/lib/esm/loop.mjs +6 -14
  298. package/dist/lib/esm/markdown-code-block-processor-registrar.mjs +6 -14
  299. package/dist/lib/esm/markdown-code-block-processor.mjs +6 -14
  300. package/dist/lib/esm/markdown-post-processor-registrar.mjs +6 -14
  301. package/dist/lib/esm/markdown-view.mjs +6 -14
  302. package/dist/lib/esm/markdown.mjs +6 -14
  303. package/dist/lib/esm/menu-event-registrar.mjs +5 -13
  304. package/dist/lib/esm/metadata-cache.mjs +6 -14
  305. package/dist/lib/esm/mobile-trusted-input.mjs +6 -14
  306. package/dist/lib/esm/modals/alert.mjs +6 -14
  307. package/dist/lib/esm/modals/confirm.mjs +6 -14
  308. package/dist/lib/esm/modals/index.mjs +6 -14
  309. package/dist/lib/esm/modals/minimizable-modal.mjs +6 -14
  310. package/dist/lib/esm/modals/modal-command-builder.mjs +6 -14
  311. package/dist/lib/esm/modals/modal.mjs +6 -14
  312. package/dist/lib/esm/modals/prompt.mjs +6 -14
  313. package/dist/lib/esm/modals/select-item.mjs +6 -14
  314. package/dist/lib/esm/modals/select-option.mjs +6 -14
  315. package/dist/lib/esm/modals/suggest-modal-command-builder.mjs +6 -14
  316. package/dist/lib/esm/note-priority.mjs +6 -14
  317. package/dist/lib/esm/notebook-navigator.mjs +6 -14
  318. package/dist/lib/esm/obsidian-dev-utils-state.mjs +6 -14
  319. package/dist/lib/esm/obsidian-protocol-handler-registrar.mjs +6 -14
  320. package/dist/lib/esm/obsidian-settings.mjs +6 -14
  321. package/dist/lib/esm/parse-link.mjs +6 -14
  322. package/dist/lib/esm/path-settings.mjs +6 -14
  323. package/dist/lib/esm/pdf.mjs +6 -14
  324. package/dist/lib/esm/plugin/index.mjs +6 -14
  325. package/dist/lib/esm/plugin/plugin-api.mjs +6 -14
  326. package/dist/lib/esm/plugin/plugin-context.mjs +6 -14
  327. package/dist/lib/esm/plugin/plugin-event-source.mjs +6 -14
  328. package/dist/lib/esm/plugin/plugin-install-state.mjs +6 -14
  329. package/dist/lib/esm/plugin/plugin-lifecycle-events.mjs +6 -14
  330. package/dist/lib/esm/plugin/plugin-settings-tab.mjs +6 -14
  331. package/dist/lib/esm/plugin/plugin.mjs +6 -14
  332. package/dist/lib/esm/plugin/settings-migration-api.mjs +5 -13
  333. package/dist/lib/esm/plugin-cli-handler-registrar.mjs +6 -14
  334. package/dist/lib/esm/popovers/field-popover.mjs +6 -14
  335. package/dist/lib/esm/popovers/index.mjs +6 -14
  336. package/dist/lib/esm/popovers/popover-anchor.mjs +6 -14
  337. package/dist/lib/esm/popovers/popover.mjs +6 -14
  338. package/dist/lib/esm/property-entry.mjs +6 -14
  339. package/dist/lib/esm/queue.mjs +6 -14
  340. package/dist/lib/esm/react/app-context.mjs +6 -14
  341. package/dist/lib/esm/react/index.mjs +6 -14
  342. package/dist/lib/esm/reference.mjs +6 -14
  343. package/dist/lib/esm/resource-lock.mjs +6 -14
  344. package/dist/lib/esm/resource-url.mjs +6 -14
  345. package/dist/lib/esm/ribbon-icon-registrar.mjs +6 -14
  346. package/dist/lib/esm/setting-components/checkbox-component.mjs +6 -14
  347. package/dist/lib/esm/setting-components/code-highlighter-component.mjs +6 -14
  348. package/dist/lib/esm/setting-components/date-component.mjs +6 -14
  349. package/dist/lib/esm/setting-components/date-time-component.mjs +6 -14
  350. package/dist/lib/esm/setting-components/email-component.mjs +6 -14
  351. package/dist/lib/esm/setting-components/file-component.mjs +6 -14
  352. package/dist/lib/esm/setting-components/index.mjs +6 -14
  353. package/dist/lib/esm/setting-components/month-component.mjs +6 -14
  354. package/dist/lib/esm/setting-components/multiple-dropdown-component.mjs +6 -14
  355. package/dist/lib/esm/setting-components/multiple-email-component.mjs +6 -14
  356. package/dist/lib/esm/setting-components/multiple-file-component.mjs +6 -14
  357. package/dist/lib/esm/setting-components/multiple-text-component.mjs +6 -14
  358. package/dist/lib/esm/setting-components/number-component.mjs +6 -14
  359. package/dist/lib/esm/setting-components/password-component.mjs +6 -14
  360. package/dist/lib/esm/setting-components/setting-component-wrapper.mjs +6 -14
  361. package/dist/lib/esm/setting-components/telephone-component.mjs +6 -14
  362. package/dist/lib/esm/setting-components/text-based-component.mjs +6 -14
  363. package/dist/lib/esm/setting-components/time-component.mjs +6 -14
  364. package/dist/lib/esm/setting-components/tri-state-checkbox-component.mjs +6 -14
  365. package/dist/lib/esm/setting-components/typed-dropdown-component.mjs +6 -14
  366. package/dist/lib/esm/setting-components/typed-multiple-dropdown-component.mjs +6 -14
  367. package/dist/lib/esm/setting-components/typed-range-text-component.mjs +6 -14
  368. package/dist/lib/esm/setting-components/typed-text-component.mjs +6 -14
  369. package/dist/lib/esm/setting-components/url-component.mjs +6 -14
  370. package/dist/lib/esm/setting-components/validator-component.mjs +6 -14
  371. package/dist/lib/esm/setting-components/value-component-with-change-tracking.mjs +5 -13
  372. package/dist/lib/esm/setting-components/week-component.mjs +6 -14
  373. package/dist/lib/esm/setting-ex.mjs +6 -14
  374. package/dist/lib/esm/setting-group-ex.mjs +6 -14
  375. package/dist/lib/esm/status-bar-item-registrar.mjs +6 -14
  376. package/dist/lib/esm/templater.mjs +6 -14
  377. package/dist/lib/esm/transformers/duration-transformer.mjs +6 -14
  378. package/dist/lib/esm/transformers/index.mjs +6 -14
  379. package/dist/lib/esm/trusted-input.mjs +6 -14
  380. package/dist/lib/esm/validation.mjs +6 -14
  381. package/dist/lib/esm/vault-delete.mjs +6 -14
  382. package/dist/lib/esm/vault-transaction.mjs +6 -14
  383. package/dist/lib/esm/vault.mjs +6 -14
  384. package/dist/lib/esm/view-registrar.mjs +6 -14
  385. package/dist/lib/esm/workspace.mjs +6 -14
  386. package/package.json +69 -24
@@ -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 keepName($unknown) {
@@ -46,17 +38,13 @@ function keepName($unknown) {
46
38
  }
47
39
 
48
40
  (function initCjs() {
49
- // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
50
41
  const globalThisRecord = globalThis;
51
42
  ensureDisposeSymbols();
52
- globalThisRecord['__name'] ??= keepName;
53
- globalThisRecord['__extractDefault'] ??= extractDefault;
54
-
43
+ globalThisRecord["__name"] ??= keepName;
44
+ globalThisRecord["__extractDefault"] ??= extractDefault;
55
45
  ensureBrowserProcess();
56
-
57
- // eslint-disable-next-line unicorn/consistent-function-scoping -- Serialized with initCjs into the banner; at module scope it would be left out of it.
58
46
  function extractDefault(module) {
59
- return module && module.__esModule && 'default' in module ? module.default : module;
47
+ return module && module.__esModule && "default" in module ? module.default : module;
60
48
  }
61
49
  })();
62
50
  })();
@@ -65,8 +53,6 @@ function keepName($unknown) {
65
53
  if (!originalRequire || originalRequire.__isPatched) {
66
54
  return;
67
55
  }
68
-
69
- // eslint-disable-next-line no-global-assign, no-implicit-globals -- We need to patch the `require()` function.
70
56
  require = Object.assign(
71
57
  (id) => requirePatched(id),
72
58
  originalRequire,
@@ -74,53 +60,45 @@ function keepName($unknown) {
74
60
  __isPatched: true
75
61
  }
76
62
  );
77
-
78
63
  function extractDefault(module) {
79
- return module && module.__esModule && 'default' in module ? module.default : module;
64
+ return module && module.__esModule && "default" in module ? module.default : module;
80
65
  }
81
-
82
- const OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
83
- '@codemirror/autocomplete',
84
- '@codemirror/collab',
85
- '@codemirror/commands',
86
- '@codemirror/language',
87
- '@codemirror/lint',
88
- '@codemirror/search',
89
- '@codemirror/state',
90
- '@codemirror/text',
91
- '@codemirror/view',
92
- '@lezer/common',
93
- '@lezer/highlight',
94
- '@lezer/lr',
95
- 'obsidian']
96
- );
97
-
98
- const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
99
- '@codemirror/closebrackets',
100
- '@codemirror/comment',
101
- '@codemirror/fold',
102
- '@codemirror/gutter',
103
- '@codemirror/highlight',
104
- '@codemirror/history',
105
- '@codemirror/matchbrackets',
106
- '@codemirror/panel',
107
- '@codemirror/rangeset',
108
- '@codemirror/rectangular-selection',
109
- '@codemirror/stream-parser',
110
- '@codemirror/tooltip']
111
- );
112
-
66
+ const OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
67
+ "@codemirror/autocomplete",
68
+ "@codemirror/collab",
69
+ "@codemirror/commands",
70
+ "@codemirror/language",
71
+ "@codemirror/lint",
72
+ "@codemirror/search",
73
+ "@codemirror/state",
74
+ "@codemirror/text",
75
+ "@codemirror/view",
76
+ "@lezer/common",
77
+ "@lezer/highlight",
78
+ "@lezer/lr",
79
+ "obsidian"
80
+ ]);
81
+ const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
82
+ "@codemirror/closebrackets",
83
+ "@codemirror/comment",
84
+ "@codemirror/fold",
85
+ "@codemirror/gutter",
86
+ "@codemirror/highlight",
87
+ "@codemirror/history",
88
+ "@codemirror/matchbrackets",
89
+ "@codemirror/panel",
90
+ "@codemirror/rangeset",
91
+ "@codemirror/rectangular-selection",
92
+ "@codemirror/stream-parser",
93
+ "@codemirror/tooltip"
94
+ ]);
113
95
  function requirePatched(id) {
114
96
  if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
115
97
  return originalRequire?.(id);
116
98
  }
117
-
118
- // eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
119
99
  if (globalThis.app.isMobile) {
120
- if (id === 'process' || id === 'node:process') {
121
- // eslint-disable-next-line no-console -- Valid usage.
100
+ if (id === "process" || id === "node:process") {
122
101
  console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
123
-
124
102
  return process;
125
103
  }
126
104
  } else {
@@ -129,8 +107,6 @@ function keepName($unknown) {
129
107
  return extractDefault(module);
130
108
  }
131
109
  }
132
-
133
- // eslint-disable-next-line no-console -- Valid usage.
134
110
  console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
135
111
  return {};
136
112
  }
@@ -1296,4 +1272,4 @@ function getLinkIdentityKey(link) {
1296
1272
  EmptyFolderBehavior,
1297
1273
  RenameDeleteHandlerComponent
1298
1274
  });
1299
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvcmVuYW1lLWRlbGV0ZS1oYW5kbGVyLWNvbXBvbmVudC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBoYW5kbGluZyByZW5hbWUgYW5kIGRlbGV0ZSBldmVudHMgaW4gT2JzaWRpYW4uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBMaW5rVXBkYXRlLFxuICBMaW5rVXBkYXRlc0hhbmRsZXJcbn0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdCc7XG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIFJlZmVyZW5jZSxcbiAgVEFic3RyYWN0RmlsZSxcbiAgVEZpbGUsXG4gIFRGb2xkZXJcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBmaWx0ZXJJblBsYWNlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FycmF5JztcbmltcG9ydCB7IHByaW50RXJyb3IgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZXJyb3InO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzLFxuICB0b0pzb25cbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuLyogdjggaWdub3JlIHN0YXJ0IC0tIERlZXBseSBjb3VwbGVkIHRvIE9ic2lkaWFuIHJ1bnRpbWU7IHJlcXVpcmVzIHJ1bm5pbmcgdmF1bHQgZm9yIG1lYW5pbmdmdWwgdGVzdGluZy4gKi9cbmltcG9ydCB7XG4gIGdldERhdGFBZGFwdGVyRXgsXG4gIEludGVybmFsUGx1Z2luTmFtZVxufSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0L2ltcGxlbWVudGF0aW9ucyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnaTE4bmV4dCc7XG5pbXBvcnQge1xuICBGaWxlTWFuYWdlcixcbiAgVmF1bHRcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IExpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyIH0gZnJvbSAnLi4vbGluay11cGRhdGUtcHJvZ3Jlc3MudHMnO1xuaW1wb3J0IHR5cGUge1xuICBFZGl0QmFja2xpbmtzU25hcHNob3RQYXJhbXMsXG4gIFVwZGF0ZUxpbmtQYXJhbXMsXG4gIFVwZGF0ZUxpbmtzSW5GaWxlUGFyYW1zXG59IGZyb20gJy4uL2xpbmsudHMnO1xuaW1wb3J0IHR5cGUgeyBSZXNvdXJjZUxvY2tDb21wb25lbnQgfSBmcm9tICcuLi9yZXNvdXJjZS1sb2NrLnRzJztcbmltcG9ydCB0eXBlIHsgUmVzY3VlU3RpbGxVc2VkRmlsZVBhcmFtcyB9IGZyb20gJy4uL3ZhdWx0LWRlbGV0ZS50cyc7XG5pbXBvcnQgdHlwZSB7IEFib3J0U2lnbmFsQ29tcG9uZW50IH0gZnJvbSAnLi9hYm9ydC1zaWduYWwtY29tcG9uZW50LnRzJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luTm90aWNlQ29tcG9uZW50IH0gZnJvbSAnLi9wbHVnaW4tbm90aWNlLWNvbXBvbmVudC50cyc7XG5cbmltcG9ydCB7XG4gIEF0dGFjaG1lbnRQYXRoQ29udGV4dCxcbiAgZ2V0QXR0YWNobWVudEZpbGVQYXRoLFxuICBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCxcbiAgaGFzT3duQXR0YWNobWVudEZvbGRlclxufSBmcm9tICcuLi9hdHRhY2htZW50LXBhdGgudHMnO1xuaW1wb3J0IHsgZ2V0Q2FudmFzUmVmZXJlbmNlcyB9IGZyb20gJy4uL2NhbnZhcy50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyIH0gZnJvbSAnLi4vZGVidWcudHMnO1xuaW1wb3J0IHsgd2FpdEZvclBlbmRpbmdMaW5rVXBkYXRlcyB9IGZyb20gJy4uL2ZpbGUtbWFuYWdlci50cyc7XG5pbXBvcnQge1xuICBDQU5WQVNfRklMRV9FWFRFTlNJT04sXG4gIGdldEZpbGUsXG4gIGdldEZpbGVPck51bGwsXG4gIGdldEZvbGRlck9yTnVsbCxcbiAgaXNDYW52YXNGaWxlLFxuICBpc0ZpbGUsXG4gIGlzRm9sZGVyLFxuICBpc01hcmtkb3duRmlsZSxcbiAgaXNOb3RlXG59IGZyb20gJy4uL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB7XG4gIGJ1aWxkQmFja2xpbmtzU25hcHNob3QsXG4gIGVkaXRCYWNrbGlua3NTbmFwc2hvdCxcbiAgZXh0cmFjdExpbmtGaWxlLFxuICB1cGRhdGVMaW5rLFxuICB1cGRhdGVMaW5rc0luRmlsZVxufSBmcm9tICcuLi9saW5rLnRzJztcbmltcG9ydCB7XG4gIGdldEJhY2tsaW5rc0ZvckZpbGVPclBhdGgsXG4gIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlLFxuICBnZXRMaW5rcyxcbiAgaGFzQmFja2xpbmtDYWNoZVBsdWdpbixcbiAgcmVnaXN0ZXJGaWxlQ2FjaGVGb3JOb25FeGlzdGluZ0ZpbGUsXG4gIHJlZ2lzdGVyRmlsZXNcbn0gZnJvbSAnLi4vbWV0YWRhdGEtY2FjaGUudHMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlIH0gZnJvbSAnLi4vb2JzaWRpYW4tZGV2LXV0aWxzLXN0YXRlLnRzJztcbmltcG9ydCB7IGFkZFRvUXVldWUgfSBmcm9tICcuLi9xdWV1ZS50cyc7XG5pbXBvcnQgeyBpc1Jlc291cmNlTG9ja2VkRm9yUGF0aEJ5QW5jZXN0b3IgfSBmcm9tICcuLi9yZXNvdXJjZS1sb2NrLnRzJztcbmltcG9ydCB7IGRlbGV0ZUlmTm90VXNlZCB9IGZyb20gJy4uL3ZhdWx0LWRlbGV0ZS50cyc7XG5pbXBvcnQge1xuICBjbGVhbnVwRW1wdHlGb2xkZXJzLFxuICBFbXB0eUZvbGRlckJlaGF2aW9yLFxuICBnZXRTYWZlUmVuYW1lUGF0aCxcbiAgaXNDaGlsZE9yU2VsZixcbiAgcmVuYW1lU2FmZSxcbiAgdHJhc2hTYWZlXG59IGZyb20gJy4uL3ZhdWx0LnRzJztcbmltcG9ydCB7IENvbXBvbmVudEV4IH0gZnJvbSAnLi9jb21wb25lbnQtZXgudHMnO1xuaW1wb3J0IHtcbiAgaGFzUGF0Y2hUb2tlbixcbiAgTW9ua2V5QXJvdW5kQ29tcG9uZW50XG59IGZyb20gJy4vbW9ua2V5LWFyb3VuZC1jb21wb25lbnQudHMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3MuZ2V0UmVzY3VlUGF0aH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0UmVzY3VlUGF0aFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvZiB0aGUgYXR0YWNobWVudCB0aGF0IGlzIGFib3V0IHRvIGJlIHN0cmFuZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYXR0YWNobWVudFBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBhdGhzIG9mIHRoZSBub3RlcyB0aGF0IHN0aWxsIHJlZmVyZW5jZSB0aGUgYXR0YWNobWVudCBvbmNlIHRoZSBkZWxldGlvbiBpcyBkb25lLiBOZXZlciBlbXB0eS5cbiAgICovXG4gIHJlYWRvbmx5IHN1cnZpdmluZ05vdGVQYXRoczogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbi8qKlxuICogU2V0dGluZ3MgZm9yIHRoZSByZW5hbWUvZGVsZXRlIGhhbmRsZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzIHtcbiAgLyoqXG4gICAqIEEgYmVoYXZpb3Igb2YgdGhlIHJlbmFtZS9kZWxldGUgaGFuZGxlciB3aGVuIGRlbGV0aW5nIGVtcHR5IGZvbGRlcnMuXG4gICAqL1xuICBlbXB0eUZvbGRlckJlaGF2aW9yOiBFbXB0eUZvbGRlckJlaGF2aW9yO1xuXG4gIC8qKlxuICAgKiBXaGVyZSB0byBtb3ZlIGFuIGF0dGFjaG1lbnQgdGhhdCBhIGRlbGV0aW9uIHdvdWxkIG90aGVyd2lzZSBzdHJhbmQgXHUyMDE0IG9uZSB0aGF0IHN1cnZpdmVzIGJlY2F1c2UgYW5vdGhlclxuICAgKiBub3RlIHN0aWxsIHJlZmVyZW5jZXMgaXQsIGJ1dCBpcyBsZWZ0IHNpdHRpbmcgaW4gYSBmb2xkZXIgd2hvc2Ugb3duaW5nIG5vdGUgaXMgZ29uZS5cbiAgICpcbiAgICogRGVjaWRpbmcgdGhlIGRlc3RpbmF0aW9uIGlzIHRoZSBwbHVnaW4ncyBhdHRhY2htZW50LXBhdGggcG9saWN5LCB3aGljaCBpcyB3aHkgdGhlIGhhbmRsZXIgYXNrcyByYXRoZXJcbiAgICogdGhhbiBndWVzc2VzLiBSZXR1cm5pbmcgYG51bGxgIFx1MjAxNCBvciBub3QgaW1wbGVtZW50aW5nIHRoaXMgYXQgYWxsIFx1MjAxNCBrZWVwcyB0aGUgYXR0YWNobWVudCB3aGVyZSBpdCBpcyxcbiAgICogd2hpY2ggaXMgdGhlIGJlaGF2aW9yIGV2ZXJ5IGNvbnN1bWVyIGhhZCBiZWZvcmUgdGhpcyBtZW1iZXIgZXhpc3RlZC5cbiAgICovXG4gIGdldFJlc2N1ZVBhdGg/OiAocGFyYW1zOiBHZXRSZXNjdWVQYXRoUGFyYW1zKSA9PiBQcm9taXNlPG51bGwgfCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwYXRoIGlzIGEgbm90ZS5cbiAgICovXG4gIGlzTm90ZTogKHBhdGg6IHN0cmluZykgPT4gYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpZ25vcmUgdGhlIHBhdGguXG4gICAqL1xuICBpc1BhdGhJZ25vcmVkOiAocGF0aDogc3RyaW5nKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGRlbGV0ZSBjb25mbGljdGluZyBhdHRhY2htZW50cy5cbiAgICovXG4gIHNob3VsZERlbGV0ZUNvbmZsaWN0aW5nQXR0YWNobWVudHM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaGFuZGxlIGRlbGV0aW9ucy5cbiAgICovXG4gIHNob3VsZEhhbmRsZURlbGV0aW9uczogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBoYW5kbGUgcmVuYW1lcy5cbiAgICovXG4gIHNob3VsZEhhbmRsZVJlbmFtZXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVuYW1lIGF0dGFjaG1lbnQgZmlsZXMgd2hlbiBhIG5vdGUgaXMgcmVuYW1lZC5cbiAgICovXG4gIHNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlczogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZW5hbWUgYXR0YWNobWVudCBmb2xkZXIgd2hlbiBhIG5vdGUgaXMgcmVuYW1lZC5cbiAgICovXG4gIHNob3VsZFJlbmFtZUF0dGFjaG1lbnRGb2xkZXI6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGUgbmFtZSBhbGlhc2VzIHdoZW4gYSBub3RlIGlzIHJlbmFtZWQuXG4gICAqL1xuICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzZXM6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBIYW5kbGVkUmVuYW1lS2V5IHtcbiAgbmV3UGF0aDogc3RyaW5nO1xuICBvbGRQYXRoOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBJbnRlcnJ1cHRlZFJlbmFtZSB7XG4gIGNvbWJpbmVkQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PjtcbiAgb2xkUGF0aDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUmVuYW1lSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuICByZWFkb25seSBhcHA6IEFwcDtcbiAgcmVhZG9ubHkgaGFuZGxlZFJlbmFtZXM6IEhhbmRsZWRSZW5hbWVzO1xuICByZWFkb25seSBpbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwPzogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj47XG4gIHJlYWRvbmx5IGludGVycnVwdGVkUmVuYW1lc01hcDogTWFwPHN0cmluZywgSW50ZXJydXB0ZWRSZW5hbWVbXT47XG4gIHJlYWRvbmx5IGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyOiBMaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciB8IG51bGw7XG4gIHJlYWRvbmx5IG5ld1BhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgb2xkQ2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcbiAgcmVhZG9ubHkgb2xkUGF0aDogc3RyaW5nO1xuICByZWFkb25seSBvbGRQYXRoQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT47XG4gIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICByZWFkb25seSByZXNvdXJjZUxvY2tDb21wb25lbnQ6IG51bGwgfCBSZXNvdXJjZUxvY2tDb21wb25lbnQ7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgUmVuYW1lTWFwQ29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBuZXdQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9sZENhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHJlYWRvbmx5IG9sZFBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBSZW5hbWVNYXBJbml0QmFja2xpbmtzTWFwUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjb21iaW5lZCBiYWNrbGlua3MgbWFwLCBrZXllZCBieSBuZXcgYmFja2xpbmsgcGF0aCwgYWNjdW11bGF0aW5nIGxpbmstSlNPTiB0byBzb3VyY2UtcGF0aCBtYXBwaW5ncy5cbiAgICovXG4gIHJlYWRvbmx5IGNvbWJpbmVkQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PjtcblxuICAvKipcbiAgICogVGhlIHBhdGggd2hvc2UgYmFja2xpbmtzIGFyZSBiZWluZyByZWNvcmRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGJhY2tsaW5rcyBtYXAgZm9yIGEgc2luZ2xlIGZpbGUsIGtleWVkIGJ5IGJhY2tsaW5rIHBhdGguXG4gICAqL1xuICByZWFkb25seSBzaW5nbGVCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPjtcbn1cblxuY29uc3QgUEFUQ0hfVE9LRU4gPSBTeW1ib2wuZm9yKCdyZW5hbWVEZWxldGVIYW5kbGVyJyk7XG5cbmludGVyZmFjZSBEZWxldGVIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+O1xuICByZWFkb25seSBmaWxlOiBUQWJzdHJhY3RGaWxlO1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBEZWxldGVQcm90ZWN0aW9uUGF0Y2hDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBEaWRSZXNjdWVTdGlsbFVzZWRBdHRhY2htZW50UGFyYW1zIHtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICByZWFkb25seSByZXNjdWVQYXJhbXM6IFJlc2N1ZVN0aWxsVXNlZEZpbGVQYXJhbXM7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgRmlsZU1hbmFnZXJSdW5Bc3luY0xpbmtVcGRhdGVQYXRjaENvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGZpbGVNYW5hZ2VyOiBGaWxlTWFuYWdlcjtcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBNZXRhZGF0YURlbGV0ZWRIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+O1xuICByZWFkb25seSBmaWxlOiBUQWJzdHJhY3RGaWxlO1xuICByZWFkb25seSBwcmV2aW91c0NhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYWJvcnRTaWduYWxDb21wb25lbnQ6IEFib3J0U2lnbmFsQ29tcG9uZW50O1xuICByZWFkb25seSBhcHA6IEFwcDtcbiAgcmVhZG9ubHkgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI/OiBMaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjtcbiAgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHJlYWRvbmx5IHJlc291cmNlTG9ja0NvbXBvbmVudDogbnVsbCB8IFJlc291cmNlTG9ja0NvbXBvbmVudDtcbiAgcmVhZG9ubHkgc2V0dGluZ3NCdWlsZGVyOiAoKSA9PiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz47XG59XG5cbmNsYXNzIERlbGV0ZUhhbmRsZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+O1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbGU6IFRBYnN0cmFjdEZpbGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogRGVsZXRlSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMuZmlsZSA9IHBhcmFtcy5maWxlO1xuICAgIHRoaXMuYWJvcnRTaWduYWwgPSBwYXJhbXMuYWJvcnRTaWduYWw7XG4gICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQgPSBwYXJhbXMucGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gcGFyYW1zLnNldHRpbmdzTWFuYWdlcjtcbiAgICB0aGlzLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwID0gcGFyYW1zLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGhhbmRsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVEZWxldGUnKShgSGFuZGxlIERlbGV0ZSAke3RoaXMuZmlsZS5wYXRofWApO1xuICAgIGlmICghaXNOb3RlKHRoaXMuZmlsZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci5leGlzdHModGhpcy5maWxlLnBhdGgpKSB7XG4gICAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZURlbGV0ZScpKFxuICAgICAgICBgU2tpcHBpbmcgZGVsZXRlIGhhbmRsZXIgb2YgJHt0aGlzLmZpbGUucGF0aH0gYXMgdGhlIGZpbGUgc3RpbGwgZXhpc3RzIG9uIGRpc2sgKGluZGV4LW9ubHkgcmVtb3ZhbCwgbm90IGEgcmVhbCBkZWxldGlvbikuYFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG5cbiAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKHRoaXMuZmlsZS5wYXRoKSkge1xuICAgICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVEZWxldGUnKShgU2tpcHBpbmcgZGVsZXRlIGhhbmRsZXIgb2YgJHt0aGlzLmZpbGUucGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnRGb2xkZXJQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPihbZGlybmFtZSh0aGlzLmZpbGUucGF0aCldKTtcblxuICAgIGlmIChzZXR0aW5ncy5zaG91bGRIYW5kbGVEZWxldGlvbnMpIHtcbiAgICAgIGNvbnN0IGNhY2hlID0gdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcC5nZXQodGhpcy5maWxlLnBhdGgpO1xuICAgICAgdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcC5kZWxldGUodGhpcy5maWxlLnBhdGgpO1xuICAgICAgaWYgKGNhY2hlKSB7XG4gICAgICAgIGNvbnN0IGxpbmtzID0gZ2V0TGlua3MoeyBjYWNoZSB9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IGxpbmsgb2YgbGlua3MpIHtcbiAgICAgICAgICBjb25zdCBhdHRhY2htZW50RmlsZSA9IGV4dHJhY3RMaW5rRmlsZSh7IGFwcDogdGhpcy5hcHAsIGxpbmssIHNvdXJjZVBhdGhPckZpbGU6IHRoaXMuZmlsZS5wYXRoIH0pO1xuICAgICAgICAgIGlmICghYXR0YWNobWVudEZpbGUgfHwgdGhpcy5zZXR0aW5nc01hbmFnZXIuaXNOb3RlRXgoYXR0YWNobWVudEZpbGUucGF0aCkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBhcmVudEZvbGRlclBhdGhzLmFkZChhdHRhY2htZW50RmlsZS5wYXJlbnQ/LnBhdGggPz8gJycpO1xuICAgICAgICAgIGF3YWl0IGRlbGV0ZUlmTm90VXNlZCh7XG4gICAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgICAgZGVsZXRlZE5vdGVQYXRoOiB0aGlzLmZpbGUucGF0aCxcbiAgICAgICAgICAgIHBhdGhPckZpbGU6IGF0dGFjaG1lbnRGaWxlLFxuICAgICAgICAgICAgcmVzY3VlU3RpbGxVc2VkRmlsZTogdGhpcy5yZXNjdWVTdGlsbFVzZWRGaWxlLmJpbmQodGhpcyksXG4gICAgICAgICAgICBzaG91bGREZWxldGVFbXB0eUZvbGRlcnM6IHNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgIT09IEVtcHR5Rm9sZGVyQmVoYXZpb3IuS2VlcFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHBhcmVudEZvbGRlclBhdGhzLmRlbGV0ZSgnJyk7XG4gICAgYXdhaXQgY2xlYW51cEVtcHR5Rm9sZGVycyh7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgZW1wdHlGb2xkZXJCZWhhdmlvcjogc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciA/PyBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXAsXG4gICAgICBmb2xkZXJQYXRoczogWy4uLnBhcmVudEZvbGRlclBhdGhzXVxuICAgIH0pO1xuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYXR0YWNobWVudEZvbGRlclBhdGggPSBhd2FpdCBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCh7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0LkRlbGV0ZU5vdGUsXG4gICAgICBub3RlUGF0aE9yRmlsZTogdGhpcy5maWxlLnBhdGhcbiAgICB9KTtcbiAgICBjb25zdCBhdHRhY2htZW50Rm9sZGVyID0gZ2V0Rm9sZGVyT3JOdWxsKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRm9sZGVyOiBhdHRhY2htZW50Rm9sZGVyUGF0aCB9KTtcblxuICAgIGlmIChcbiAgICAgICFhdHRhY2htZW50Rm9sZGVyIHx8ICFhd2FpdCBoYXNPd25BdHRhY2htZW50Rm9sZGVyKHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0LkRlbGV0ZU5vdGUsXG4gICAgICAgIHBhdGg6IHRoaXMuZmlsZS5wYXRoXG4gICAgICB9KVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIGF3YWl0IGRlbGV0ZUlmTm90VXNlZCh7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgZGVsZXRlZE5vdGVQYXRoOiB0aGlzLmZpbGUucGF0aCxcbiAgICAgIHBhdGhPckZpbGU6IGF0dGFjaG1lbnRGb2xkZXIsXG4gICAgICByZXNjdWVTdGlsbFVzZWRGaWxlOiB0aGlzLnJlc2N1ZVN0aWxsVXNlZEZpbGUuYmluZCh0aGlzKSxcbiAgICAgIHNob3VsZERlbGV0ZUVtcHR5Rm9sZGVyczogc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciAhPT0gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwXG4gICAgfSk7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNjdWVTdGlsbFVzZWRGaWxlKHJlc2N1ZVBhcmFtczogUmVzY3VlU3RpbGxVc2VkRmlsZVBhcmFtcyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBkaWRSZXNjdWVTdGlsbFVzZWRBdHRhY2htZW50KHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgcmVzY3VlUGFyYW1zLFxuICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogS2VlcHMgYSBmb2xkZXIgZGVsZXRpb24gZnJvbSBkZXN0cm95aW5nIGFuIGF0dGFjaG1lbnQgYSBub3RlIG91dHNpZGUgdGhhdCBmb2xkZXIgc3RpbGwgcmVmZXJlbmNlcy5cbiAqXG4gKiBEZWxldGluZyBhIE5PVEUgaXMgYWxyZWFkeSBzYWZlOiB7QGxpbmsgZGVsZXRlSWZOb3RVc2VkfSBkaXNjb3VudHMgdGhlIGRlbGV0ZWQgbm90ZSdzIG93biBiYWNrbGlua3MsIHNlZXNcbiAqIGFub3RoZXIgbm90ZSBzdGlsbCByZWZlcmVuY2luZyB0aGUgYXR0YWNobWVudCwgYW5kIGtlZXBzIGl0LiBEZWxldGluZyBhIEZPTERFUiB3YXMgbm90LCBiZWNhdXNlXG4gKiB7QGxpbmsgUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudH0gb25seSBsaXN0ZW5zIChgdmF1bHQub24oJ2RlbGV0ZScpYCkgYW5kIGJ5IHRoZSB0aW1lIGEgZm9sZGVyIGRlbGV0aW9uXG4gKiBpcyByZXBvcnRlZCBpdHMgY2hpbGRyZW4gYXJlIGFscmVhZHkgZ29uZS4gTm90aGluZyByZWFjdGl2ZSBjYW4gaGVscCwgc28gdGhpcyBjb21wb25lbnQgaW50ZXJjZXB0cyB0aGVcbiAqIGRlbGV0aW9uIHByaW1pdGl2ZXMgaW5zdGVhZDogYEZpbGVNYW5hZ2VyLnRyYXNoRmlsZWAgKHdoYXQgdGhlIGZpbGUtZXhwbG9yZXIgRGVsZXRlIGZsb3cgcmVhY2hlcyB0aHJvdWdoXG4gKiBgcHJvbXB0Rm9yRGVsZXRpb25gKSBwbHVzIHRoZSByYXcgYFZhdWx0LmRlbGV0ZWAgLyBgVmF1bHQudHJhc2hgIGEgcGx1Z2luIG1heSBjYWxsIGRpcmVjdGx5LlxuICpcbiAqIEEgZm9sZGVyIGRlbGV0aW9uIGlzIHNjYW5uZWQgZmlyc3QuIFdoZW4gbm90aGluZyBpbnNpZGUgaXQgaXMgc3RpbGwgcmVmZXJlbmNlZCBmcm9tIG91dHNpZGUgXHUyMDE0IHRoZVxuICogb3ZlcndoZWxtaW5nIG1ham9yaXR5IG9mIGRlbGV0aW9ucyBcdTIwMTQgdGhlIG9yaWdpbmFsIHJ1bnMgdW50b3VjaGVkLCBzbyB0aGUgbmF0aXZlIGJlaGF2aW9yIGlzIHByZXNlcnZlZFxuICogZXhhY3RseS4gT25seSB3aGVuIHNvbWV0aGluZyB3b3VsZCBiZSBsb3N0IGRvZXMgdGhpcyB0YWtlIG92ZXIsIHJlcGxheWluZyB0aGUgZGVsZXRpb24gdGhyb3VnaFxuICoge0BsaW5rIGRlbGV0ZUlmTm90VXNlZH06IGV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgZm9sZGVyIGdvZXMsIHRoZSBzdGlsbC1yZWZlcmVuY2VkIGF0dGFjaG1lbnRzIGFuZCB0aGVcbiAqIGZvbGRlcnMgaG9sZGluZyB0aGVtIHN0YXksIGFuZCB0aGUgYGF0dGFjaG1lbnRJc1N0aWxsVXNlZGAgbm90aWNlIGZpcmVzLCBtaXJyb3JpbmcgdGhlIG5vdGUgY2FzZS5cbiAqXG4gKiBGaWxlcyBhcmUgbmV2ZXIgaW50ZXJjZXB0ZWQgXHUyMDE0IGRlbGV0aW5nIGEgZmlsZSBpcyB0aGUgdXNlciBuYW1pbmcgdGhhdCBmaWxlIGV4cGxpY2l0bHkuXG4gKi9cbmNsYXNzIERlbGV0ZVByb3RlY3Rpb25QYXRjaENvbXBvbmVudCBleHRlbmRzIE1vbmtleUFyb3VuZENvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJvb3RzIG9mIHRoZSBmb2xkZXIgZGVsZXRpb25zIGN1cnJlbnRseSBiZWluZyByZXBsYXllZC4gVGhlIHJlcGxheSBkZWxldGVzIHRocm91Z2ggdGhlIFVOUEFUQ0hFRFxuICAgKiBvcmlnaW5hbCwgc28gaXQgY2Fubm90IHJlLWVudGVyIHRoaXMgY29tcG9uZW50IGRpcmVjdGx5IFx1MjAxNCBidXQgYEZpbGVNYW5hZ2VyLnRyYXNoRmlsZWAgaXRzZWxmIGNhbGxzIGRvd25cbiAgICogaW50byBgVmF1bHQudHJhc2hgIC8gYFZhdWx0LmRlbGV0ZWAsIHdoaWNoIGFyZSBwYXRjaGVkIHRvbywgYW5kIHJlLXNjYW5uaW5nIGEgc3VidHJlZSBhbHJlYWR5IGJlaW5nXG4gICAqIHdhbGtlZCBpcyBwdXJlIHdhc3RlLiBTY29wZWQgYnkgcGF0aCByYXRoZXIgdGhhbiBieSBhIGZsYWcgc28gdGhhdCBhbiB1bnJlbGF0ZWQgZm9sZGVyIGRlbGV0aW9uXG4gICAqIGludGVybGVhdmluZyBvbiBhbiBgYXdhaXRgIGlzIHN0aWxsIHByb3RlY3RlZC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVwbGF5ZWRGb2xkZXJQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogRGVsZXRlUHJvdGVjdGlvblBhdGNoQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCA9IHBhcmFtcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8RmlsZU1hbmFnZXIsICd0cmFzaEZpbGUnPih7XG4gICAgICAkb2JqZWN0OiBGaWxlTWFuYWdlci5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAndHJhc2hGaWxlJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZV0sIG9yaWdpbmFsTWV0aG9kQm91bmQgfSkgPT5cbiAgICAgICAgdGhpcy5oYW5kbGVEZWxldGlvbihmaWxlLCBmYWxsYmFjaywgYXN5bmMgKGFic3RyYWN0RmlsZSkgPT4ge1xuICAgICAgICAgIGF3YWl0IG9yaWdpbmFsTWV0aG9kQm91bmQoYWJzdHJhY3RGaWxlKTtcbiAgICAgICAgfSlcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdkZWxldGUnPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAnZGVsZXRlJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZSwgZm9yY2VdLCBvcmlnaW5hbE1ldGhvZEJvdW5kIH0pID0+XG4gICAgICAgIHRoaXMuaGFuZGxlRGVsZXRpb24oZmlsZSwgZmFsbGJhY2ssIGFzeW5jIChhYnN0cmFjdEZpbGUpID0+IHtcbiAgICAgICAgICBhd2FpdCBvcmlnaW5hbE1ldGhvZEJvdW5kKGFic3RyYWN0RmlsZSwgZm9yY2UpO1xuICAgICAgICB9KVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ3RyYXNoJz4oe1xuICAgICAgJG9iamVjdDogVmF1bHQucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ3RyYXNoJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZSwgc3lzdGVtXSwgb3JpZ2luYWxNZXRob2RCb3VuZCB9KSA9PlxuICAgICAgICB0aGlzLmhhbmRsZURlbGV0aW9uKGZpbGUsIGZhbGxiYWNrLCBhc3luYyAoYWJzdHJhY3RGaWxlKSA9PiB7XG4gICAgICAgICAgYXdhaXQgb3JpZ2luYWxNZXRob2RCb3VuZChhYnN0cmFjdEZpbGUsIHN5c3RlbSk7XG4gICAgICAgIH0pXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29sbGVjdHMgdGhlIHBhdGhzIG9mIGV2ZXJ5IG5vdGUgaW5zaWRlIHRoZSBmb2xkZXIuIFRoZXkgYXJlIHRoZSBsaW5rIHNvdXJjZXMgdGhhdCBkaXNhcHBlYXIgYWxvbmcgd2l0aFxuICAgKiB0aGUgZm9sZGVyLCBzbyB0aGVpciBiYWNrbGlua3MgbXVzdCBub3Qga2VlcCBhbiBhdHRhY2htZW50IGFsaXZlLlxuICAgKlxuICAgKiBAcGFyYW0gZm9sZGVyIC0gVGhlIGZvbGRlciBiZWluZyBkZWxldGVkLlxuICAgKiBAcGFyYW0gc2V0dGluZ3MgLSBUaGUgYWdncmVnYXRlZCByZW5hbWUvZGVsZXRlIGhhbmRsZXIgc2V0dGluZ3MuXG4gICAqIEByZXR1cm5zIFRoZSBwYXRocyBvZiB0aGUgbm90ZXMgaW5zaWRlIHRoZSBmb2xkZXIuXG4gICAqL1xuICBwcml2YXRlIGNvbGxlY3REZWxldGVkTm90ZVBhdGhzKGZvbGRlcjogVEZvbGRlciwgc2V0dGluZ3M6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPik6IFNldDxzdHJpbmc+IHtcbiAgICBjb25zdCBkZWxldGVkTm90ZVBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgVmF1bHQucmVjdXJzZUNoaWxkcmVuKGZvbGRlciwgKGNoaWxkKSA9PiB7XG4gICAgICBpZiAoaXNGaWxlKGNoaWxkKSAmJiAoc2V0dGluZ3MuaXNOb3RlPy4oY2hpbGQucGF0aCkgPz8gZmFsc2UpKSB7XG4gICAgICAgIGRlbGV0ZWROb3RlUGF0aHMuYWRkKGNoaWxkLnBhdGgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBkZWxldGVkTm90ZVBhdGhzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBhdHRhY2htZW50cyBpbnNpZGUgdGhlIGZvbGRlciB0aGF0IGEgbm90ZSBvdXRzaWRlIGl0IHN0aWxsIHJlZmVyZW5jZXMsIGFuZCB3b3VsZCB0aGVyZWZvcmUgYmVcbiAgICogZGVzdHJveWVkIGJ5IGRlbGV0aW5nIHRoZSBmb2xkZXIuXG4gICAqXG4gICAqIEBwYXJhbSBmb2xkZXIgLSBUaGUgZm9sZGVyIGJlaW5nIGRlbGV0ZWQuXG4gICAqIEBwYXJhbSBkZWxldGVkTm90ZVBhdGhzIC0gVGhlIHBhdGhzIG9mIHRoZSBub3RlcyB0aGF0IGRpc2FwcGVhciBhbG9uZyB3aXRoIHRoZSBmb2xkZXIuXG4gICAqIEBwYXJhbSBzZXR0aW5ncyAtIFRoZSBhZ2dyZWdhdGVkIHJlbmFtZS9kZWxldGUgaGFuZGxlciBzZXR0aW5ncy5cbiAgICogQHJldHVybnMgVGhlIHBhdGhzIG9mIHRoZSBhdHRhY2htZW50cyB0aGF0IG11c3Qgc3Vydml2ZSB0aGUgZGVsZXRpb24uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZpbmRTdGlsbFVzZWRBdHRhY2htZW50UGF0aHMoXG4gICAgZm9sZGVyOiBURm9sZGVyLFxuICAgIGRlbGV0ZWROb3RlUGF0aHM6IFNldDxzdHJpbmc+LFxuICAgIHNldHRpbmdzOiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz5cbiAgKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IGNhbmRpZGF0ZUZpbGVzOiBURmlsZVtdID0gW107XG4gICAgVmF1bHQucmVjdXJzZUNoaWxkcmVuKGZvbGRlciwgKGNoaWxkKSA9PiB7XG4gICAgICBpZiAoaXNGaWxlKGNoaWxkKSAmJiAhKHNldHRpbmdzLmlzTm90ZT8uKGNoaWxkLnBhdGgpID8/IGZhbHNlKSkge1xuICAgICAgICBjYW5kaWRhdGVGaWxlcy5wdXNoKGNoaWxkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHN0aWxsVXNlZEF0dGFjaG1lbnRQYXRoczogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgY2FuZGlkYXRlRmlsZSBvZiBjYW5kaWRhdGVGaWxlcykge1xuICAgICAgY29uc3QgYmFja2xpbmtzID0gYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiBjYW5kaWRhdGVGaWxlIH0pO1xuICAgICAgZm9yIChjb25zdCBkZWxldGVkTm90ZVBhdGggb2YgZGVsZXRlZE5vdGVQYXRocykge1xuICAgICAgICBiYWNrbGlua3MuY2xlYXIoZGVsZXRlZE5vdGVQYXRoKTtcbiAgICAgIH1cbiAgICAgIGlmIChiYWNrbGlua3MuY291bnQoKSAhPT0gMCkge1xuICAgICAgICBzdGlsbFVzZWRBdHRhY2htZW50UGF0aHMucHVzaChjYW5kaWRhdGVGaWxlLnBhdGgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzdGlsbFVzZWRBdHRhY2htZW50UGF0aHM7XG4gIH1cblxuICAvKipcbiAgICogRGVjaWRlcyB3aGV0aGVyIGEgZGVsZXRpb24gbmVlZHMgcHJvdGVjdGluZyBhbmQsIGlmIHNvLCByZXBsYWNlcyBpdCB3aXRoIGEgcHJvdGVjdGVkIHJlcGxheS5cbiAgICpcbiAgICogQHBhcmFtIGZpbGUgLSBUaGUgYWJzdHJhY3QgZmlsZSBiZWluZyBkZWxldGVkLlxuICAgKiBAcGFyYW0gZmFsbGJhY2sgLSBJbnZva2VzIHRoZSBpbnRlcmNlcHRlZCBtZXRob2QgdW5jaGFuZ2VkLlxuICAgKiBAcGFyYW0gZGVsZXRlQWJzdHJhY3RGaWxlIC0gRGVsZXRlcyBhIHNpbmdsZSBhYnN0cmFjdCBmaWxlIHRocm91Z2ggdGhlIGludGVyY2VwdGVkIG1ldGhvZCdzIHVucGF0Y2hlZCBvcmlnaW5hbC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBkZWxldGlvbiBpcyBkb25lLlxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVEZWxldGlvbihcbiAgICBmaWxlOiBUQWJzdHJhY3RGaWxlLFxuICAgIGZhbGxiYWNrOiAoKSA9PiBQcm9taXNlPHZvaWQ+LFxuICAgIGRlbGV0ZUFic3RyYWN0RmlsZTogKGFic3RyYWN0RmlsZTogVEFic3RyYWN0RmlsZSkgPT4gUHJvbWlzZTx2b2lkPlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5zaG91bGRDb25zaWRlckZvbGRlcihmaWxlKSA/IHRoaXMucmVwbGF5Rm9sZGVyRGVsZXRpb24oZmlsZSwgZmFsbGJhY2ssIGRlbGV0ZUFic3RyYWN0RmlsZSkgOiBmYWxsYmFjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgdGhlIGZvbGRlciB3aGlsZSBrZWVwaW5nIHdoYXRldmVyIGluc2lkZSBpdCBpcyBzdGlsbCByZWZlcmVuY2VkIGZyb20gb3V0c2lkZS5cbiAgICpcbiAgICogQHBhcmFtIGZvbGRlciAtIFRoZSBmb2xkZXIgYmVpbmcgZGVsZXRlZC5cbiAgICogQHBhcmFtIGZhbGxiYWNrIC0gSW52b2tlcyB0aGUgaW50ZXJjZXB0ZWQgbWV0aG9kIHVuY2hhbmdlZC5cbiAgICogQHBhcmFtIGRlbGV0ZUFic3RyYWN0RmlsZSAtIERlbGV0ZXMgYSBzaW5nbGUgYWJzdHJhY3QgZmlsZSB0aHJvdWdoIHRoZSBpbnRlcmNlcHRlZCBtZXRob2QncyB1bnBhdGNoZWQgb3JpZ2luYWwuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZGVsZXRpb24gaXMgZG9uZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVwbGF5Rm9sZGVyRGVsZXRpb24oXG4gICAgZm9sZGVyOiBURm9sZGVyLFxuICAgIGZhbGxiYWNrOiAoKSA9PiBQcm9taXNlPHZvaWQ+LFxuICAgIGRlbGV0ZUFic3RyYWN0RmlsZTogKGFic3RyYWN0RmlsZTogVEFic3RyYWN0RmlsZSkgPT4gUHJvbWlzZTx2b2lkPlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG4gICAgY29uc3QgZGVsZXRlZE5vdGVQYXRocyA9IHRoaXMuY29sbGVjdERlbGV0ZWROb3RlUGF0aHMoZm9sZGVyLCBzZXR0aW5ncyk7XG4gICAgY29uc3Qgc3RpbGxVc2VkQXR0YWNobWVudFBhdGhzID0gYXdhaXQgdGhpcy5maW5kU3RpbGxVc2VkQXR0YWNobWVudFBhdGhzKGZvbGRlciwgZGVsZXRlZE5vdGVQYXRocywgc2V0dGluZ3MpO1xuXG4gICAgaWYgKHN0aWxsVXNlZEF0dGFjaG1lbnRQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6ZGVsZXRlUHJvdGVjdGlvbicpKGBOb3RoaW5nIHRvIHByb3RlY3QgaW4gJHtmb2xkZXIucGF0aH07IGRlbGV0aW5nIGl0IGFzIHVzdWFsLmApO1xuICAgICAgYXdhaXQgZmFsbGJhY2soKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmRlbGV0ZVByb3RlY3Rpb24nKShcbiAgICAgIGBQcm90ZWN0aW5nICR7c3RpbGxVc2VkQXR0YWNobWVudFBhdGhzLmxlbmd0aC50b1N0cmluZygpfSBzdGlsbC1yZWZlcmVuY2VkIGF0dGFjaG1lbnQocykgZnJvbSB0aGUgZGVsZXRpb24gb2YgJHtmb2xkZXIucGF0aH06ICR7dG9Kc29uKHN0aWxsVXNlZEF0dGFjaG1lbnRQYXRocyl9YFxuICAgICk7XG5cbiAgICB0aGlzLnJlcGxheWVkRm9sZGVyUGF0aHMuYWRkKGZvbGRlci5wYXRoKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZGVsZXRlSWZOb3RVc2VkKHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgZGVsZXRlQWJzdHJhY3RGaWxlLFxuICAgICAgICBkZWxldGVkTm90ZVBhdGhzOiBbLi4uZGVsZXRlZE5vdGVQYXRoc10sXG4gICAgICAgIHBhdGhPckZpbGU6IGZvbGRlcixcbiAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICAgICAgcmVzY3VlU3RpbGxVc2VkRmlsZTogdGhpcy5yZXNjdWVTdGlsbFVzZWRGaWxlLmJpbmQodGhpcyksXG4gICAgICAgIC8qXG4gICAgICAgICAqIFRoZSB1c2VyIG5hbWVkIFRISVMgZm9sZGVyLCBzbyBpdCBnb2VzIGV2ZW4gdW5kZXIgYEVtcHR5Rm9sZGVyQmVoYXZpb3IuS2VlcGAgXHUyMDE0IHRoYXQgc2V0dGluZ1xuICAgICAgICAgKiBnb3Zlcm5zIGZvbGRlcnMgZW1wdGllZCBpbmNpZGVudGFsbHksIG5vdCB0aGUgb25lIGV4cGxpY2l0bHkgZGVsZXRlZC4gYGRlbGV0ZUlmTm90VXNlZGAgc3RpbGxcbiAgICAgICAgICogcmVmdXNlcyB0byByZW1vdmUgYW55IGZvbGRlciB3aG9zZSBjaGlsZCBoYWQgdG8gYmUga2VwdCwgd2hpY2ggaXMgdGhlIHByb3RlY3Rpb24gd2FudGVkIGhlcmUuXG4gICAgICAgICAqL1xuICAgICAgICBzaG91bGREZWxldGVFbXB0eUZvbGRlcnM6IHRydWUsXG4gICAgICAgIC8qXG4gICAgICAgICAqIEEgbm90ZSB0aGF0IG90aGVycyBsaW5rIHRvIGlzIGRlbGV0ZWQgYXMgbm9ybWFsOyBPYnNpZGlhbiBsZWF2ZXMgdGhlIGRhbmdsaW5nIGxpbmsuIFByb3RlY3RpbmdcbiAgICAgICAgICogbm90ZXMgdG9vIHdvdWxkIG1ha2UgZGVsZXRpbmcgYSBmb2xkZXIgb2YgbGlua2VkLXRvIG5vdGVzIGltcG9zc2libGUuXG4gICAgICAgICAqL1xuICAgICAgICBzaG91bGRQcm90ZWN0SWZTdGlsbFVzZWQ6IChjYW5kaWRhdGVGaWxlKSA9PiAhKHNldHRpbmdzLmlzTm90ZT8uKGNhbmRpZGF0ZUZpbGUucGF0aCkgPz8gZmFsc2UpXG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5yZXBsYXllZEZvbGRlclBhdGhzLmRlbGV0ZShmb2xkZXIucGF0aCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNjdWVTdGlsbFVzZWRGaWxlKHJlc2N1ZVBhcmFtczogUmVzY3VlU3RpbGxVc2VkRmlsZVBhcmFtcyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBkaWRSZXNjdWVTdGlsbFVzZWRBdHRhY2htZW50KHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgcmVzY3VlUGFyYW1zLFxuICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGEgZGVsZXRpb24gaXMgYSBmb2xkZXIgZGVsZXRpb24gdGhpcyBoYW5kbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBwcm90ZWN0aW5nLlxuICAgKlxuICAgKiBFdmVyeSBjaGVjayBoZXJlIGlzIHN5bmNocm9ub3VzIGFuZCBjaGVhcCwgc28gYSBmaWxlIGRlbGV0aW9uIFx1MjAxNCB0aGUgb3ZlcndoZWxtaW5nIG1ham9yaXR5IFx1MjAxNCBjb3N0cyBvbmVcbiAgICoge0BsaW5rIGlzRm9sZGVyfSBjYWxsIGFuZCByZWFjaGVzIHRoZSBvcmlnaW5hbCB1bnRvdWNoZWQuXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlIC0gVGhlIGFic3RyYWN0IGZpbGUgYmVpbmcgZGVsZXRlZC5cbiAgICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGRlbGV0aW9uIHNob3VsZCBiZSBzY2FubmVkIGJlZm9yZSBpdCBydW5zLlxuICAgKi9cbiAgcHJpdmF0ZSBzaG91bGRDb25zaWRlckZvbGRlcihmaWxlOiBUQWJzdHJhY3RGaWxlKTogZmlsZSBpcyBURm9sZGVyIHtcbiAgICBpZiAoIWlzRm9sZGVyKGZpbGUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuICAgIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zIHx8IChzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4oZmlsZS5wYXRoKSA/PyBmYWxzZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJlcGxheWVkRm9sZGVyUGF0aCBvZiB0aGlzLnJlcGxheWVkRm9sZGVyUGF0aHMpIHtcbiAgICAgIGlmIChpc0NoaWxkT3JTZWxmKHsgYXBwOiB0aGlzLmFwcCwgY2hpbGRQYXRoT3JGaWxlOiBmaWxlLnBhdGgsIHBhcmVudFBhdGhPckZpbGU6IHJlcGxheWVkRm9sZGVyUGF0aCB9KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuY2xhc3MgRmlsZU1hbmFnZXJSdW5Bc3luY0xpbmtVcGRhdGVQYXRjaENvbXBvbmVudCBleHRlbmRzIE1vbmtleUFyb3VuZENvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsZU1hbmFnZXI6IEZpbGVNYW5hZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IEZpbGVNYW5hZ2VyUnVuQXN5bmNMaW5rVXBkYXRlUGF0Y2hDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMuZmlsZU1hbmFnZXIgPSBwYXJhbXMuZmlsZU1hbmFnZXI7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2goe1xuICAgICAgJG9iamVjdDogdGhpcy5maWxlTWFuYWdlcixcbiAgICAgIG1ldGhvZE5hbWU6ICdydW5Bc3luY0xpbmtVcGRhdGUnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoe1xuICAgICAgICBmYWxsYmFjayxcbiAgICAgICAgb3JpZ2luYWxBcmd1bWVudHM6IFtsaW5rVXBkYXRlc0hhbmRsZXJdLFxuICAgICAgICBvcmlnaW5hbE1ldGhvZCxcbiAgICAgICAgb3JpZ2luYWxNZXRob2RCb3VuZFxuICAgICAgfSkgPT4ge1xuICAgICAgICBpZiAoaGFzUGF0Y2hUb2tlbihvcmlnaW5hbE1ldGhvZCwgUEFUQ0hfVE9LRU4pKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdIYW5kbGVyOiBMaW5rVXBkYXRlc0hhbmRsZXIgPSAobGlua1VwZGF0ZXMpID0+IHRoaXMud3JhcExpbmtVcGRhdGVzSGFuZGxlcihsaW5rVXBkYXRlcywgbGlua1VwZGF0ZXNIYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsTWV0aG9kQm91bmQobmV3SGFuZGxlcik7XG4gICAgICB9LFxuICAgICAgLypcbiAgICAgICAqIFN1cHByZXNzaW5nIE9ic2lkaWFuJ3Mgb3duIGxpbmsgdXBkYXRlcyBpcyBOT1QgaWRlbXBvdGVudCwgc28gdHdvIGxpdmUgY29waWVzIG9mIHRoaXMgY29tcG9uZW50XG4gICAgICAgKiB3b3VsZCBmaWdodCBvdmVyIHRoZSBzYW1lIG1ldGhvZC4gYFBBVENIX1RPS0VOYCBpcyBhIGBTeW1ib2wuZm9yYCBhbmQgdGhlIHRva2VuIHJlZ2lzdHJ5IGlzXG4gICAgICAgKiBgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlYC1iYWNrZWQsIHNvIHRoZSBhcmJpdHJhdGlvbiBzcGFucyBpbmRlcGVuZGVudGx5IGJ1bmRsZWQgY29waWVzIG9mIHRoaXNcbiAgICAgICAqIGxpYnJhcnk6IHRoZSBmaXJzdCBwYXRjaGVyIHN0YXlzIGxpdmUsIGEgY29weSB0aGF0IHBhdGNoZXMgYWZ0ZXJ3YXJkcyBzZWVzIHRoZSB0b2tlbiBvbiBpdHMgb3duXG4gICAgICAgKiBgb3JpZ2luYWxNZXRob2RgIGFuZCBkZWZlcnMgdmlhIHRoZSBndWFyZCBhYm92ZSwgYW5kIGl0IHRha2VzIG92ZXIgb24gaXRzIG5leHQgY2FsbCBvbmNlIHRoZVxuICAgICAgICogbGVhZGVyIHVubG9hZHMgYW5kIHRoZSB0b2tlbiBpcyBkcm9wcGVkLlxuICAgICAgICpcbiAgICAgICAqIFRoaXMgYXJiaXRyYXRlcyB0aGUgUEFUQ0ggb25seS4gVGhlIGNvbXBvbmVudCdzIGB2YXVsdC5vbigncmVuYW1lJyB8ICdkZWxldGUnKWAgYW5kXG4gICAgICAgKiBgbWV0YWRhdGFDYWNoZS5vbignZGVsZXRlZCcpYCBsaXN0ZW5lcnMgaGF2ZSBubyBlcXVpdmFsZW50IGd1YXJkIFx1MjAxNCB0aGUgcGx1Z2luLXJlZ2lzdHJ5IGVsZWN0aW9uXG4gICAgICAgKiB0aGF0IHVzZWQgdG8gcHJvdmlkZSBvbmUgd2VudCB3aXRoIHRoZSBtdWx0aS1wbHVnaW4gbWFjaGluZXJ5IFx1MjAxNCBzbyB0d28gbGl2ZSBjb3BpZXMgd291bGQgYm90aFxuICAgICAgICogaGFuZGxlIGFuIGV2ZW50LiBXaXRoIG9uZSBvd25lciB0aGF0IGNhbm5vdCBhcmlzZTsgYSBjb25zdW1lciB0aGF0IG11c3QgZ3VhcmFudGVlIGl0IHJlZnVzZXMgdG9cbiAgICAgICAqIGxvYWQgYmVzaWRlIGEgY29uZmxpY3RpbmcgdmVyc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBUaGF0IHJlZnVzYWwgdXNlZCB0byBiZSBkZXNjcmliZWQgaGVyZSBhcyBcImEgcGx1Z2luJ3Mgam9iIHJhdGhlciB0aGFuIGEgbGlicmFyeSdzXCIsIHdoaWNoIGlzIG5vXG4gICAgICAgKiBsb25nZXIgdHJ1ZSBcdTIwMTQgYFBsdWdpbkJhc2UuZ2V0UGx1Z2luRGVwZW5kZW5jaWVzYCBpcyB3aGVyZSBhIGNvbnN1bWVyIGRlY2xhcmVzIGl0LCBhbmQgdGhlXG4gICAgICAgKiBgYXBpVmVyc2lvblJhbmdlYCBpdCBuYW1lcyBpcyBleGFjdGx5IHRoZSBjb25mbGljdGluZy12ZXJzaW9uIGd1YXJkLiBUaGUgbGlicmFyeSBvd25zIHRoZVxuICAgICAgICogbWVjaGFuaXNtOyB0aGUgcGx1Z2luIHN0aWxsIG93bnMgdGhlIGRlY2lzaW9uIHRvIHVzZSBpdC5cbiAgICAgICAqL1xuICAgICAgcGF0Y2hUb2tlbjogUEFUQ0hfVE9LRU5cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd3JhcExpbmtVcGRhdGVzSGFuZGxlcihsaW5rVXBkYXRlczogTGlua1VwZGF0ZVtdLCBsaW5rVXBkYXRlc0hhbmRsZXI6IExpbmtVcGRhdGVzSGFuZGxlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBpc1JlbmFtZUNhbGxlZCA9IGZhbHNlO1xuICAgIGxldCBpc0ZvcmVpZ25Mb2NrZWRSZW5hbWVDYWxsZWQgPSBmYWxzZTtcbiAgICBjb25zdCBldmVudFJlZiA9IHRoaXMuYXBwLnZhdWx0Lm9uKCdyZW5hbWUnLCAoZmlsZSwgb2xkUGF0aCkgPT4ge1xuICAgICAgaXNSZW5hbWVDYWxsZWQgPSB0cnVlO1xuICAgICAgLypcbiAgICAgICAqIEEgcmVuYW1lIHBlcmZvcm1lZCBpbnNpZGUgYSBmb3JlaWduIHBsdWdpbidzIGluLWZsaWdodCBsb2NrZWQgdHJhbnNhY3Rpb24gKHdoaWNoIGxvY2tzIHRoZVxuICAgICAgICogYWZmZWN0ZWQgZm9sZGVyIHN1YnRyZWUsIGUuZy4gQWR2YW5jZWQgTm90ZSBDb21wb3NlcidzIGZvbGRlciBtZXJnZSkgaXMgb3duZWQgYnkgdGhhdFxuICAgICAgICogdHJhbnNhY3Rpb24sIHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvciBpdHMgb3duIGxpbmsgY29uc2lzdGVuY3kuIFRoaXMgaGFuZGxlciBkZWxpYmVyYXRlbHkgZG9lc1xuICAgICAgICogTk9UIHJld3JpdGUgbGlua3MgZm9yIGl0LCBzbyBzdXBwcmVzc2luZyBPYnNpZGlhbidzIG5hdGl2ZSBsaW5rIHVwZGF0ZSBiZWxvdyB3b3VsZCBsZWF2ZSB0aGVcbiAgICAgICAqIGxpbmtzIGRhbmdsaW5nLiBMZXQgdGhlIG5hdGl2ZSB1cGRhdGUgcHJvY2VlZCB1bnRvdWNoZWQuIFNlZVxuICAgICAgICogaHR0cHM6Ly9naXRodWIuY29tL21uYW91bW92L29ic2lkaWFuLWFkdmFuY2VkLW5vdGUtY29tcG9zZXIvaXNzdWVzLzE0Ni5cbiAgICAgICAqL1xuICAgICAgaWYgKGlzUmVzb3VyY2VMb2NrZWRGb3JQYXRoQnlBbmNlc3Rvcih0aGlzLmFwcCwgZmlsZS5wYXRoKSB8fCBpc1Jlc291cmNlTG9ja2VkRm9yUGF0aEJ5QW5jZXN0b3IodGhpcy5hcHAsIG9sZFBhdGgpKSB7XG4gICAgICAgIGlzRm9yZWlnbkxvY2tlZFJlbmFtZUNhbGxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGxpbmtVcGRhdGVzSGFuZGxlcihsaW5rVXBkYXRlcyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuYXBwLnZhdWx0Lm9mZnJlZihldmVudFJlZik7XG4gICAgfVxuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBJdCBtaWdodCBjaGFuZ2VkIGluIGByZW5hbWVgIGV2ZW50IGhhbmRsZXIuIEVTTGludCBtaXN0YWtlbmx5IGRvZXMgbm90IHJlY29nbml6ZSBpdC5cbiAgICBpZiAoIWlzUmVuYW1lQ2FsbGVkIHx8ICFzZXR0aW5ncy5zaG91bGRIYW5kbGVSZW5hbWVzIHx8IGlzRm9yZWlnbkxvY2tlZFJlbmFtZUNhbGxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZpbHRlckluUGxhY2UoXG4gICAgICBsaW5rVXBkYXRlcyxcbiAgICAgIChsaW5rVXBkYXRlKSA9PiB7XG4gICAgICAgIGlmIChzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4obGlua1VwZGF0ZS5zb3VyY2VGaWxlLnBhdGgpKSB7XG4gICAgICAgICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpydW5Bc3luY0xpbmtVcGRhdGUnKShcbiAgICAgICAgICAgIGBSb2xsIGJhY2sgdG8gZGVmYXVsdCBsaW5rIHVwZGF0ZSBvZiBzb3VyY2UgZmlsZSAke2xpbmtVcGRhdGUuc291cmNlRmlsZS5wYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihsaW5rVXBkYXRlLnJlc29sdmVkRmlsZS5wYXRoKSkge1xuICAgICAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6cnVuQXN5bmNMaW5rVXBkYXRlJykoXG4gICAgICAgICAgICBgUm9sbCBiYWNrIHRvIGRlZmF1bHQgbGluayB1cGRhdGUgb2YgcmVzb2x2ZWQgZmlsZSAke2xpbmtVcGRhdGUucmVzb2x2ZWRGaWxlLnBhdGh9IGFzIHRoZSBwYXRoIGlzIGlnbm9yZWQuYFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5hcHAuaW50ZXJuYWxQbHVnaW5zLmdldEVuYWJsZWRQbHVnaW5CeUlkKEludGVybmFsUGx1Z2luTmFtZS5DYW52YXMpICE9PSBudWxsICYmICFoYXNCYWNrbGlua0NhY2hlUGx1Z2luKHRoaXMuYXBwKVxuICAgICAgICAgICYmIChsaW5rVXBkYXRlLnNvdXJjZUZpbGUuZXh0ZW5zaW9uID09PSBDQU5WQVNfRklMRV9FWFRFTlNJT04gfHwgbGlua1VwZGF0ZS5yZXNvbHZlZEZpbGUuZXh0ZW5zaW9uID09PSBDQU5WQVNfRklMRV9FWFRFTlNJT04pO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cblxuY2xhc3MgSGFuZGxlZFJlbmFtZXMge1xuICBwcml2YXRlIHJlYWRvbmx5IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBIYW5kbGVkUmVuYW1lS2V5PigpO1xuXG4gIHB1YmxpYyBhZGQob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1hcC5zZXQodGhpcy5rZXlUb1N0cmluZyhvbGRQYXRoLCBuZXdQYXRoKSwgeyBuZXdQYXRoLCBvbGRQYXRoIH0pO1xuICB9XG5cbiAgcHVibGljIGRlbGV0ZShvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubWFwLmRlbGV0ZSh0aGlzLmtleVRvU3RyaW5nKG9sZFBhdGgsIG5ld1BhdGgpKTtcbiAgfVxuXG4gIHB1YmxpYyBoYXMob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tYXAuaGFzKHRoaXMua2V5VG9TdHJpbmcob2xkUGF0aCwgbmV3UGF0aCkpO1xuICB9XG5cbiAgcHVibGljIGtleXMoKTogSXRlcmFibGVJdGVyYXRvcjxIYW5kbGVkUmVuYW1lS2V5PiB7XG4gICAgcmV0dXJuIHRoaXMubWFwLnZhbHVlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBrZXlUb1N0cmluZyhvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke29sZFBhdGh9IC0+ICR7bmV3UGF0aH1gO1xuICB9XG59XG5cbmNsYXNzIE1ldGFkYXRhRGVsZXRlZEhhbmRsZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwOiBNYXA8c3RyaW5nLCBDYWNoZWRNZXRhZGF0YT47XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsZTogVEFic3RyYWN0RmlsZTtcbiAgcHJpdmF0ZSByZWFkb25seSBwcmV2aW91c0NhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogTWV0YWRhdGFEZWxldGVkSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcCA9IHBhcmFtcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcDtcbiAgICB0aGlzLmZpbGUgPSBwYXJhbXMuZmlsZTtcbiAgICB0aGlzLnByZXZpb3VzQ2FjaGUgPSBwYXJhbXMucHJldmlvdXNDYWNoZTtcbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlciA9IHBhcmFtcy5zZXR0aW5nc01hbmFnZXI7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlKCk6IHZvaWQge1xuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcblxuICAgIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/Lih0aGlzLmZpbGUucGF0aCkpIHtcbiAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlTWV0YWRhdGFEZWxldGVkJykoYFNraXBwaW5nIG1ldGFkYXRhIGRlbGV0ZSBoYW5kbGVyIG9mICR7dGhpcy5maWxlLnBhdGh9IGFzIHRoZSBwYXRoIGlzIGlnbm9yZWQuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzTWFya2Rvd25GaWxlKHRoaXMuZmlsZSkgJiYgdGhpcy5wcmV2aW91c0NhY2hlKSB7XG4gICAgICB0aGlzLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwLnNldCh0aGlzLmZpbGUucGF0aCwgdGhpcy5wcmV2aW91c0NhY2hlKTtcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgUmVuYW1lSGFuZGxlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuICBwcml2YXRlIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZWRSZW5hbWVzOiBIYW5kbGVkUmVuYW1lcztcbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PjtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcnJ1cHRlZFJlbmFtZXNNYXA6IE1hcDxzdHJpbmcsIEludGVycnVwdGVkUmVuYW1lW10+O1xuICBwcml2YXRlIHJlYWRvbmx5IGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyOiBMaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciB8IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgbmV3UGF0aDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG9sZENhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkUGF0aDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG9sZFBhdGhCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPjtcbiAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSByZXNvdXJjZUxvY2tDb21wb25lbnQ6IG51bGwgfCBSZXNvdXJjZUxvY2tDb21wb25lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUmVuYW1lSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgdGhpcy5hYm9ydFNpZ25hbCA9IHBhcmFtcy5hYm9ydFNpZ25hbDtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5yZXNvdXJjZUxvY2tDb21wb25lbnQgPSBwYXJhbXMucmVzb3VyY2VMb2NrQ29tcG9uZW50O1xuICAgIHRoaXMuaGFuZGxlZFJlbmFtZXMgPSBwYXJhbXMuaGFuZGxlZFJlbmFtZXM7XG4gICAgdGhpcy5pbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwID0gcGFyYW1zLmludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXAgPz8gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+KCk7XG4gICAgdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAgPSBwYXJhbXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwO1xuICAgIHRoaXMubGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIgPSBwYXJhbXMubGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI7XG4gICAgdGhpcy5uZXdQYXRoID0gcGFyYW1zLm5ld1BhdGg7XG4gICAgdGhpcy5vbGRDYWNoZSA9IHBhcmFtcy5vbGRDYWNoZTtcbiAgICB0aGlzLm9sZFBhdGggPSBwYXJhbXMub2xkUGF0aDtcbiAgICB0aGlzLm9sZFBhdGhCYWNrbGlua3NNYXAgPSBwYXJhbXMub2xkUGF0aEJhY2tsaW5rc01hcDtcbiAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCA9IHBhcmFtcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGhhbmRsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5vbGRQYXRoID09PSB0aGlzLm5ld1BhdGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgLypcbiAgICAgKiBUaGUgcmVuYW1lIHRoYXQgdHJpZ2dlcmVkIHRoaXMgaGFuZGxlciBpcyB2ZXJ5IGxpa2VseSBzdGlsbCBpbnNpZGUgT2JzaWRpYW4ncyBvd25cbiAgICAgKiBgRmlsZU1hbmFnZXIucnVuQXN5bmNMaW5rVXBkYXRlYCBjeWNsZSwgd2hpY2ggaXMgYWJvdXQgdG8gZGVjaWRlIFx1MjAxNCBzeW5jaHJvbm91c2x5IFx1MjAxNCB3aGljaCBsaW5rcyB0b1xuICAgICAqIHJld3JpdGUsIGJ5IHJlLXJlc29sdmluZyBlYWNoIG9uZS4gRXZlcnl0aGluZyBiZWxvdyB0ZW1wb3JhcmlseSByZWdpc3RlcnMgYSBwaGFudG9tIGZpbGUgYXQgdGhlXG4gICAgICogb2xkIHBhdGggKGByZWdpc3RlckZpbGVzYCwgZGlyZWN0bHkgaGVyZSBhbmQgaW5zaWRlIGBSZW5hbWVNYXBgKSBhbmQgaG9sZHMgaXQgYWNyb3NzIGFuIGBhd2FpdGA7XG4gICAgICogc2VlbiBtaWQtZGVjaXNpb24sIHRoYXQgcGhhbnRvbSBtYWtlcyB0aGUgb2xkIHBhdGggc3RpbGwgcmVzb2x2ZSwgc28gT2JzaWRpYW4gY29uY2x1ZGVzIG5vdGhpbmdcbiAgICAgKiBjaGFuZ2VkIGFuZCByZXdyaXRlcyBub3RoaW5nLiBTdGFuZGluZyBpbnZhcmlhbnQ6IG5ldmVyIHRvdWNoIHRoZSB2YXVsdCBpbmRleCB3aGlsZSBPYnNpZGlhbiBpc1xuICAgICAqIG1pZC1kZWNpc2lvbi4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tbmFvdW1vdi9vYnNpZGlhbi1jdXN0b20tYXR0YWNobWVudC1sb2NhdGlvbi9pc3N1ZXMvNDcuXG4gICAgICovXG4gICAgYXdhaXQgd2FpdEZvclBlbmRpbmdMaW5rVXBkYXRlcyh0aGlzLmFwcCk7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgYXdhaXQgdGhpcy5jb250aW51ZUludGVycnVwdGVkUmVuYW1lcygpO1xuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIC8vIFRoZSByZWZyZXNoZWQgYmFja2xpbmtzIGZlZWQgYG9sZFBhdGhCYWNrbGlua3NNYXBgLCB3aGljaCBvbmx5IHRoZSBsaW5rLXJld3JpdGUgc3RlcHMgYmVsb3cgcmVhZCwgYW5kIHRob3NlIGFyZSBnYXRlZCBvbiB0aGUgc2FtZSBmbGFnLlxuICAgIGlmICh0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpLnNob3VsZEhhbmRsZVJlbmFtZXMpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVmcmVzaExpbmtzKCk7XG4gICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgfVxuXG4gICAgaWYgKGF3YWl0IHRoaXMuaGFuZGxlQ2FzZUNvbGxpc2lvbigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgY29uc3QgcGx1Z2luTm90aWNlQ29tcG9uZW50ID0gdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG5cbiAgICBjb25zdCByZW5hbWVkRmlsZVBhdGhzID0gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlKCdyZW5hbWVkRmlsZVBhdGhzJywgbmV3IFNldDxzdHJpbmc+KCkpLnZhbHVlO1xuICAgIGNvbnN0IHJlbmFtZWRMaW5rcyA9IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSgncmVuYW1lZExpbmtQYXRocycsIG5ldyBTZXQ8c3RyaW5nPigpKS52YWx1ZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZW5hbWVNYXAgPSBuZXcgUmVuYW1lTWFwKHtcbiAgICAgICAgYWJvcnRTaWduYWw6IHRoaXMuYWJvcnRTaWduYWwsXG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIG5ld1BhdGg6IHRoaXMubmV3UGF0aCxcbiAgICAgICAgb2xkQ2FjaGU6IHRoaXMub2xkQ2FjaGUsXG4gICAgICAgIG9sZFBhdGg6IHRoaXMub2xkUGF0aCxcbiAgICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgICAgfSk7XG4gICAgICBhd2FpdCByZW5hbWVNYXAuZmlsbCgpO1xuICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG5cbiAgICAgIGNvbnN0IGNvbWJpbmVkQmFja2xpbmtzTWFwID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+KCk7XG5cbiAgICAgIC8vIEJhY2tsaW5rcyBhcmUgb25seSBjb25zdW1lZCBieSB0aGUgbGluay1yZXdyaXRlIHN0ZXBzIGJlbG93LCB3aGljaCBhcmUgZ2F0ZWQgb25cbiAgICAgIC8vIGBzaG91bGRIYW5kbGVSZW5hbWVzYC4gU2tpcCBnYXRoZXJpbmcgdGhlbSAoYSBiYWNrbGluayBmZXRjaCBwZXIgYXR0YWNobWVudCkgb24gYSBtb3ZlLW9ubHkgcmVuYW1lLlxuICAgICAgaWYgKHNldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXMpIHtcbiAgICAgICAgcmVuYW1lTWFwLmluaXRPcmlnaW5hbExpbmtzTWFwKGNvbWJpbmVkQmFja2xpbmtzTWFwKTtcbiAgICAgICAgcmVuYW1lTWFwLmluaXRCYWNrbGlua3NNYXAoe1xuICAgICAgICAgIGNvbWJpbmVkQmFja2xpbmtzTWFwLFxuICAgICAgICAgIHBhdGg6IHRoaXMub2xkUGF0aCxcbiAgICAgICAgICBzaW5nbGVCYWNrbGlua3NNYXA6IHRoaXMub2xkUGF0aEJhY2tsaW5rc01hcFxuICAgICAgICB9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IGF0dGFjaG1lbnRPbGRQYXRoIG9mIHJlbmFtZU1hcC5rZXlzKCkpIHtcbiAgICAgICAgICBpZiAoYXR0YWNobWVudE9sZFBhdGggPT09IHRoaXMub2xkUGF0aCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnRPbGRQYXRoQmFja2xpbmtzID0gYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiBhdHRhY2htZW50T2xkUGF0aCB9KTtcbiAgICAgICAgICBjb25zdCBhdHRhY2htZW50T2xkUGF0aEJhY2tsaW5rc01hcCA9IGF0dGFjaG1lbnRPbGRQYXRoQmFja2xpbmtzLmRhdGE7XG4gICAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICAgIHJlbmFtZU1hcC5pbml0QmFja2xpbmtzTWFwKHtcbiAgICAgICAgICAgIGNvbWJpbmVkQmFja2xpbmtzTWFwLFxuICAgICAgICAgICAgcGF0aDogYXR0YWNobWVudE9sZFBhdGgsXG4gICAgICAgICAgICBzaW5nbGVCYWNrbGlua3NNYXA6IGF0dGFjaG1lbnRPbGRQYXRoQmFja2xpbmtzTWFwXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyZW50Rm9sZGVyUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgICAgZm9yIChjb25zdCBbb2xkQXR0YWNobWVudFBhdGgsIG5ld0F0dGFjaG1lbnRQYXRoXSBvZiByZW5hbWVNYXAuZW50cmllcygpKSB7XG4gICAgICAgIGlmIChvbGRBdHRhY2htZW50UGF0aCAhPT0gdGhpcy5vbGRQYXRoKSB7XG4gICAgICAgICAgY29uc3QgZml4ZWROZXdBdHRhY2htZW50UGF0aCA9IGF3YWl0IHRoaXMucmVuYW1lSGFuZGxlZChvbGRBdHRhY2htZW50UGF0aCwgbmV3QXR0YWNobWVudFBhdGgpO1xuICAgICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgICByZW5hbWVNYXAuc2V0KG9sZEF0dGFjaG1lbnRQYXRoLCBmaXhlZE5ld0F0dGFjaG1lbnRQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZ3NNYW5hZ2VyLmlzTm90ZUV4KG9sZEF0dGFjaG1lbnRQYXRoKSkge1xuICAgICAgICAgIHBhcmVudEZvbGRlclBhdGhzLmFkZChkaXJuYW1lKG9sZEF0dGFjaG1lbnRQYXRoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXdhaXQgY2xlYW51cEVtcHR5Rm9sZGVycyh7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGVtcHR5Rm9sZGVyQmVoYXZpb3I6IHNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgPz8gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwLFxuICAgICAgICBmb2xkZXJQYXRoczogWy4uLnBhcmVudEZvbGRlclBhdGhzXVxuICAgICAgfSk7XG4gICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICAgIC8qXG4gICAgICAgKiBUaGUgYXR0YWNobWVudCBtb3ZlIGFib3ZlIHJ1bnMgcmVnYXJkbGVzcyBvZiBgc2hvdWxkSGFuZGxlUmVuYW1lc2AgKHRoYXQgaXMgdGhlIHBvaW50IG9mIGRlY291cGxpbmdcbiAgICAgICAqIFwiTW92ZSBhdHRhY2htZW50cyB3aXRoIG5vdGVcIiBmcm9tIFwiVXBkYXRlIGxpbmtzXCIpLiBUaGUgcmVtYWluaW5nIHN0ZXBzIG9ubHkgcmV3cml0ZSBsaW5rcywgc28gc2tpcFxuICAgICAgICogdGhlbSB3aGVuIGxpbmsgdXBkYXRlcyBhcmUgZGlzYWJsZWQ7IHRoZSBgZmluYWxseWAgYmxvY2sgYmVsb3cgc3RpbGwgcnVucy5cbiAgICAgICAqL1xuICAgICAgaWYgKCFzZXR0aW5ncy5zaG91bGRIYW5kbGVSZW5hbWVzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLypcbiAgICAgICAqIEEgcmVzdW1lZCByZW5hbWUgYnJpbmdzIGl0cyBvd24gc25hcHNob3QgYWxvbmcuIE1lcmdlIGl0IElOVE8gdGhlIGN1cnJlbnQgb25lIHJhdGhlciB0aGFuXG4gICAgICAgKiBjb25jYXRlbmF0aW5nIHRoZSB0d286IGEgZmlsZSBuYW1lZCBieSBib3RoIHdvdWxkIG90aGVyd2lzZSBiZSBvcGVuZWQgYW5kIHJld3JpdHRlbiB0d2ljZSwgd2hpY2ggaXNcbiAgICAgICAqIHRoZSB2ZXJ5IHRoaW5nIGEgY29tYmluZWQgc25hcHNob3QgZXhpc3RzIHRvIGF2b2lkLiBUaGUgY3VycmVudCByZW5hbWUncyBlbnRyeSB3aW5zIGEga2V5IGNvbGxpc2lvbixcbiAgICAgICAqIGJlY2F1c2UgaXQgZGVzY3JpYmVzIHdoZXJlIHRoZSB0YXJnZXQgaXMgbm93LlxuICAgICAgICovXG4gICAgICBmb3IgKGNvbnN0IFtpbnRlcnJ1cHRlZEJhY2tsaW5rUGF0aCwgaW50ZXJydXB0ZWRMaW5rS2V5VG9QYXRoTWFwXSBvZiB0aGlzLmludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXApIHtcbiAgICAgICAgY29uc3QgbGlua0tleVRvUGF0aE1hcCA9IGNvbWJpbmVkQmFja2xpbmtzTWFwLmdldChpbnRlcnJ1cHRlZEJhY2tsaW5rUGF0aCk7XG4gICAgICAgIGlmICghbGlua0tleVRvUGF0aE1hcCkge1xuICAgICAgICAgIGNvbWJpbmVkQmFja2xpbmtzTWFwLnNldChpbnRlcnJ1cHRlZEJhY2tsaW5rUGF0aCwgaW50ZXJydXB0ZWRMaW5rS2V5VG9QYXRoTWFwKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgW2xpbmtLZXksIG9sZFRhcmdldFBhdGhdIG9mIGludGVycnVwdGVkTGlua0tleVRvUGF0aE1hcCkge1xuICAgICAgICAgIGlmICghbGlua0tleVRvUGF0aE1hcC5oYXMobGlua0tleSkpIHtcbiAgICAgICAgICAgIGxpbmtLZXlUb1BhdGhNYXAuc2V0KGxpbmtLZXksIG9sZFRhcmdldFBhdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBsaW5rSW5kZXhlcyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgICBhd2FpdCBlZGl0QmFja2xpbmtzU25hcHNob3Qobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEVkaXRCYWNrbGlua3NTbmFwc2hvdFBhcmFtczxzdHJpbmc+Pih7XG4gICAgICAgIGFib3J0U2lnbmFsOiB0aGlzLmFib3J0U2lnbmFsLFxuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBsaW5rQ29udmVydGVyOiAoeyBsaW5rLCBwYXlsb2FkOiBvbGRBdHRhY2htZW50UGF0aCwgc291cmNlUGF0aDogbmV3QmFja2xpbmtQYXRoIH0pID0+IHtcbiAgICAgICAgICBjb25zdCBsaW5rSW5kZXggPSAobGlua0luZGV4ZXMuZ2V0KG5ld0JhY2tsaW5rUGF0aCkgPz8gMCkgKyAxO1xuICAgICAgICAgIGxpbmtJbmRleGVzLnNldChuZXdCYWNrbGlua1BhdGgsIGxpbmtJbmRleCk7XG5cbiAgICAgICAgICBpZiAoIW9sZEF0dGFjaG1lbnRQYXRoKSB7XG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgICogQSBsaW5rIHRoYXQgaXMgbm90IGluIHRoZSBzbmFwc2hvdCB3YXMgZWl0aGVyIG5ldmVyIG91cnMgdG8gcmV3cml0ZSwgb3Igd2FzIGFscmVhZHlcbiAgICAgICAgICAgICAqIHJld3JpdHRlbiBieSBzb21lb25lIGVsc2UgKGxlYXZpbmcgaXQgY29ycmVjdCkuIEVpdGhlciB3YXkgdGhlcmUgaXMgbm90aGluZyB0byBkbyAtXG4gICAgICAgICAgICAgKiBidXQgbG9nIGl0LCBiZWNhdXNlIGEgc2lsZW50IHNraXAgaGVyZSBpcyBleGFjdGx5IGhvd1xuICAgICAgICAgICAgICogaHR0cHM6Ly9naXRodWIuY29tL21uYW91bW92L29ic2lkaWFuLWN1c3RvbS1hdHRhY2htZW50LWxvY2F0aW9uL2lzc3Vlcy82MCBzdGF5ZWRcbiAgICAgICAgICAgICAqIGludmlzaWJsZTogZXZlcnkgc2tpcHBlZCBsaW5rIGxlZnQgYSBicm9rZW4gZW1iZWQgYW5kIHJlcG9ydGVkIG5vdGhpbmcuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6dXBkYXRlQmFja2xpbmtzJykoXG4gICAgICAgICAgICAgIGBObyBzbmFwc2hvdCBlbnRyeSBmb3IgbGluayAke3RvSnNvbihsaW5rKX0gaW4gJHtuZXdCYWNrbGlua1BhdGh9OyBsZWF2aW5nIGl0IHVuY2hhbmdlZC5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IG5ld0F0dGFjaG1lbnRQYXRoID0gcmVuYW1lTWFwLmdldChvbGRBdHRhY2htZW50UGF0aCkgPz8gb2xkQXR0YWNobWVudFBhdGg7XG5cbiAgICAgICAgICByZW5hbWVkRmlsZVBhdGhzLmFkZChuZXdCYWNrbGlua1BhdGgpO1xuICAgICAgICAgIHJlbmFtZWRMaW5rcy5hZGQoYCR7bmV3QmFja2xpbmtQYXRofS8vJHtTdHJpbmcobGlua0luZGV4KX1gKTtcblxuICAgICAgICAgIHJldHVybiB1cGRhdGVMaW5rKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxVcGRhdGVMaW5rUGFyYW1zPih7XG4gICAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgICAgbGluayxcbiAgICAgICAgICAgIG5ld1NvdXJjZVBhdGhPckZpbGU6IG5ld0JhY2tsaW5rUGF0aCxcbiAgICAgICAgICAgIG5ld1RhcmdldFBhdGhPckZpbGU6IG5ld0F0dGFjaG1lbnRQYXRoLFxuICAgICAgICAgICAgb2xkVGFyZ2V0UGF0aE9yRmlsZTogb2xkQXR0YWNobWVudFBhdGgsXG4gICAgICAgICAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzOiBzZXR0aW5ncy5zaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzZXNcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH0sXG4gICAgICAgIGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyOiB0aGlzLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyID8/IHVuZGVmaW5lZCxcbiAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgICByZXNvdXJjZUxvY2tDb21wb25lbnQ6IHRoaXMucmVzb3VyY2VMb2NrQ29tcG9uZW50LFxuICAgICAgICBzaG91bGRGYWlsT25NaXNzaW5nRmlsZTogZmFsc2UsXG4gICAgICAgIC8vIFRoZSBjb252ZXJ0ZXIgbG9ncyBldmVyeSBsaW5rIGl0IGRlY2xpbmVzLCBzbyBpdCBoYXMgdG8gYmUgc2hvd24gdGhlIG9uZXMgdGhlIHNuYXBzaG90IGRvZXMgbm90IG5hbWUuXG4gICAgICAgIHNob3VsZFZpc2l0VW5tYXRjaGVkTGlua3M6IHRydWUsXG4gICAgICAgIHNuYXBzaG90OiBjb21iaW5lZEJhY2tsaW5rc01hcFxuICAgICAgfSkpO1xuICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgICBpZiAoaXNOb3RlKHRoaXMubmV3UGF0aCkpIHtcbiAgICAgICAgYXdhaXQgdXBkYXRlTGlua3NJbkZpbGUobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFVwZGF0ZUxpbmtzSW5GaWxlUGFyYW1zPih7XG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlOiB0aGlzLm5ld1BhdGgsXG4gICAgICAgICAgb2xkU291cmNlUGF0aE9yRmlsZTogdGhpcy5vbGRQYXRoLFxuICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICAgICAgICByZXNvdXJjZUxvY2tDb21wb25lbnQ6IHRoaXMucmVzb3VyY2VMb2NrQ29tcG9uZW50LFxuICAgICAgICAgIHNob3VsZEZhaWxPbk1pc3NpbmdGaWxlOiBmYWxzZSxcbiAgICAgICAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzOiBzZXR0aW5ncy5zaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzZXNcbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZ2V0RmlsZU9yTnVsbCh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IHRoaXMubmV3UGF0aCB9KSkge1xuICAgICAgICBsZXQgaW50ZXJydXB0ZWRSZW5hbWVzID0gdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAuZ2V0KHRoaXMubmV3UGF0aCk7XG4gICAgICAgIGlmICghaW50ZXJydXB0ZWRSZW5hbWVzKSB7XG4gICAgICAgICAgaW50ZXJydXB0ZWRSZW5hbWVzID0gW107XG4gICAgICAgICAgdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAuc2V0KHRoaXMubmV3UGF0aCwgaW50ZXJydXB0ZWRSZW5hbWVzKTtcbiAgICAgICAgfVxuICAgICAgICBpbnRlcnJ1cHRlZFJlbmFtZXMucHVzaCh7XG4gICAgICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICAgICAgb2xkUGF0aDogdGhpcy5vbGRQYXRoXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBjb25zdCBvcnBoYW5LZXlzID0gWy4uLnRoaXMuaGFuZGxlZFJlbmFtZXMua2V5cygpXTtcbiAgICAgIGFkZFRvUXVldWUoe1xuICAgICAgICBhYm9ydFNpZ25hbDogdGhpcy5hYm9ydFNpZ25hbCxcbiAgICAgICAgb3BlcmF0aW9uRnVuY3Rpb246ICgpID0+IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IG9ycGhhbktleSBvZiBvcnBoYW5LZXlzKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZWRSZW5hbWVzLmRlbGV0ZShvcnBoYW5LZXkub2xkUGF0aCwgb3JwaGFuS2V5Lm5ld1BhdGgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChyZW5hbWVkTGlua3Muc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZSh0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMucmVuYW1lRGVsZXRlSGFuZGxlci51cGRhdGVkTGlua3MsIHsgZmlsZXNDb3VudDogcmVuYW1lZEZpbGVQYXRocy5zaXplLCBsaW5rc0NvdW50OiByZW5hbWVkTGlua3Muc2l6ZSB9KSk7XG4gICAgICAgICAgcmVuYW1lZEZpbGVQYXRocy5jbGVhcigpO1xuICAgICAgICAgIHJlbmFtZWRMaW5rcy5jbGVhcigpO1xuICAgICAgICB9LFxuICAgICAgICBvcGVyYXRpb25OYW1lOiB0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMucmVuYW1lRGVsZXRlSGFuZGxlci5oYW5kbGVPcnBoYW5lZFJlbmFtZXMpXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbnRpbnVlSW50ZXJydXB0ZWRSZW5hbWVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGludGVycnVwdGVkUmVuYW1lcyA9IHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwLmdldCh0aGlzLm9sZFBhdGgpO1xuICAgIGlmICghaW50ZXJydXB0ZWRSZW5hbWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAuZGVsZXRlKHRoaXMub2xkUGF0aCk7XG4gICAgZm9yIChjb25zdCBpbnRlcnJ1cHRlZFJlbmFtZSBvZiBpbnRlcnJ1cHRlZFJlbmFtZXMpIHtcbiAgICAgIGF3YWl0IG5ldyBSZW5hbWVIYW5kbGVyKHtcbiAgICAgICAgYWJvcnRTaWduYWw6IHRoaXMuYWJvcnRTaWduYWwsXG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGhhbmRsZWRSZW5hbWVzOiB0aGlzLmhhbmRsZWRSZW5hbWVzLFxuICAgICAgICBpbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwOiBpbnRlcnJ1cHRlZFJlbmFtZS5jb21iaW5lZEJhY2tsaW5rc01hcCxcbiAgICAgICAgaW50ZXJydXB0ZWRSZW5hbWVzTWFwOiB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcCxcbiAgICAgICAgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI6IHRoaXMubGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIsXG4gICAgICAgIG5ld1BhdGg6IHRoaXMubmV3UGF0aCxcbiAgICAgICAgb2xkQ2FjaGU6IHRoaXMub2xkQ2FjaGUsXG4gICAgICAgIG9sZFBhdGg6IGludGVycnVwdGVkUmVuYW1lLm9sZFBhdGgsXG4gICAgICAgIG9sZFBhdGhCYWNrbGlua3NNYXA6IHRoaXMub2xkUGF0aEJhY2tsaW5rc01hcCxcbiAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICAgICAgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCxcbiAgICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgICAgfSkuaGFuZGxlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVDYXNlQ29sbGlzaW9uKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghZ2V0RGF0YUFkYXB0ZXJFeCh0aGlzLmFwcCkuaW5zZW5zaXRpdmUgfHwgdGhpcy5vbGRQYXRoLnRvTG93ZXJDYXNlKCkgIT09IHRoaXMubmV3UGF0aC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgdGVtcG9yYXJ5UGF0aCA9IGpvaW4oZGlybmFtZSh0aGlzLm5ld1BhdGgpLCBgX190ZW1wX18ke2Jhc2VuYW1lKHRoaXMubmV3UGF0aCl9YCk7XG4gICAgYXdhaXQgdGhpcy5yZW5hbWVIYW5kbGVkKHRoaXMubmV3UGF0aCwgdGVtcG9yYXJ5UGF0aCk7XG5cbiAgICBhd2FpdCBuZXcgUmVuYW1lSGFuZGxlcih7XG4gICAgICBhYm9ydFNpZ25hbDogdGhpcy5hYm9ydFNpZ25hbCxcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBoYW5kbGVkUmVuYW1lczogdGhpcy5oYW5kbGVkUmVuYW1lcyxcbiAgICAgIGludGVycnVwdGVkUmVuYW1lc01hcDogdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAsXG4gICAgICBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjogdGhpcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcixcbiAgICAgIG5ld1BhdGg6IHRlbXBvcmFyeVBhdGgsXG4gICAgICBvbGRDYWNoZTogdGhpcy5vbGRDYWNoZSxcbiAgICAgIG9sZFBhdGg6IHRoaXMub2xkUGF0aCxcbiAgICAgIG9sZFBhdGhCYWNrbGlua3NNYXA6IHRoaXMub2xkUGF0aEJhY2tsaW5rc01hcCxcbiAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICByZXNvdXJjZUxvY2tDb21wb25lbnQ6IHRoaXMucmVzb3VyY2VMb2NrQ29tcG9uZW50LFxuICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgIH0pLmhhbmRsZSgpO1xuXG4gICAgYXdhaXQgdGhpcy5hcHAuZmlsZU1hbmFnZXIucmVuYW1lRmlsZShnZXRGaWxlKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogdGVtcG9yYXJ5UGF0aCB9KSwgdGhpcy5uZXdQYXRoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaExpbmtzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZha2VPbGRGaWxlID0gZ2V0RmlsZSh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IHRoaXMub2xkUGF0aCwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICAgIGxldCBvbGRQYXRoQmFja2xpbmtzTWFwUmVmcmVzaGVkOiBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT47XG4gICAge1xuICAgICAgdXNpbmcgX3JlZ2lzdHJhdGlvbiA9IHJlZ2lzdGVyRmlsZXModGhpcy5hcHAsIFtmYWtlT2xkRmlsZV0pO1xuICAgICAgY29uc3QgZmFrZU9sZEZpbGVCYWNrbGlua3MgPSBhd2FpdCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IGZha2VPbGRGaWxlIH0pO1xuICAgICAgb2xkUGF0aEJhY2tsaW5rc01hcFJlZnJlc2hlZCA9IGZha2VPbGRGaWxlQmFja2xpbmtzLmRhdGE7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbYmFja2xpbmtQYXRoLCByZWZyZXNoZWRMaW5rc10gb2Ygb2xkUGF0aEJhY2tsaW5rc01hcFJlZnJlc2hlZCkge1xuICAgICAgbGV0IG9sZExpbmtzID0gdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwLmdldChiYWNrbGlua1BhdGgpO1xuICAgICAgaWYgKCFvbGRMaW5rcykge1xuICAgICAgICBvbGRMaW5rcyA9IFtdO1xuICAgICAgICB0aGlzLm9sZFBhdGhCYWNrbGlua3NNYXAuc2V0KGJhY2tsaW5rUGF0aCwgb2xkTGlua3MpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGxpbmsgb2YgcmVmcmVzaGVkTGlua3MpIHtcbiAgICAgICAgaWYgKG9sZExpbmtzLmluY2x1ZGVzKGxpbmspKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgb2xkTGlua3MucHVzaChsaW5rKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlbmFtZUhhbmRsZWQob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIG5ld1BhdGggPSBnZXRTYWZlUmVuYW1lUGF0aCh7IGFwcDogdGhpcy5hcHAsIG5ld1BhdGgsIG9sZFBhdGhPckFic3RyYWN0RmlsZTogb2xkUGF0aCB9KTtcbiAgICBpZiAob2xkUGF0aCA9PT0gbmV3UGF0aCkge1xuICAgICAgcmV0dXJuIG5ld1BhdGg7XG4gICAgfVxuICAgIHRoaXMuaGFuZGxlZFJlbmFtZXMuYWRkKG9sZFBhdGgsIG5ld1BhdGgpO1xuICAgIG5ld1BhdGggPSBhd2FpdCByZW5hbWVTYWZlKHsgYXBwOiB0aGlzLmFwcCwgbmV3UGF0aCwgb2xkUGF0aE9yQWJzdHJhY3RGaWxlOiBvbGRQYXRoIH0pO1xuICAgIHJldHVybiBuZXdQYXRoO1xuICB9XG59XG5cbmNsYXNzIFJlbmFtZU1hcCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuICBwcml2YXRlIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwcml2YXRlIHJlYWRvbmx5IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbmV3UGF0aDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG9sZENhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkUGF0aDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG9sZFBhdGhMaW5rczogUmVmZXJlbmNlW107XG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUmVuYW1lTWFwQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmFib3J0U2lnbmFsID0gcGFyYW1zLmFib3J0U2lnbmFsO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlciA9IHBhcmFtcy5zZXR0aW5nc01hbmFnZXI7XG4gICAgdGhpcy5vbGRDYWNoZSA9IHBhcmFtcy5vbGRDYWNoZTtcbiAgICB0aGlzLm9sZFBhdGggPSBwYXJhbXMub2xkUGF0aDtcbiAgICB0aGlzLm5ld1BhdGggPSBwYXJhbXMubmV3UGF0aDtcbiAgICB0aGlzLm9sZFBhdGhMaW5rcyA9IHRoaXMub2xkQ2FjaGUgPyBnZXRMaW5rcyh7IGNhY2hlOiB0aGlzLm9sZENhY2hlIH0pIDogW107XG4gIH1cblxuICBwdWJsaWMgZW50cmllcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFtzdHJpbmcsIHN0cmluZ10+IHtcbiAgICByZXR1cm4gdGhpcy5tYXAuZW50cmllcygpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGZpbGwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIHRoaXMubWFwLnNldCh0aGlzLm9sZFBhdGgsIHRoaXMubmV3UGF0aCk7XG5cbiAgICBpZiAoIWlzTm90ZSh0aGlzLm9sZFBhdGgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gT2JzaWRpYW4gZG9lcyBub3QgaW5kZXggYSBjYW52YXMgZmlsZSBpbnRvIHRoZSBtZXRhZGF0YSBjYWNoZS5cbiAgICAvLyBUaGUgY2FjaGUtZGVyaXZlZCBgb2xkUGF0aExpbmtzYCBpcyBlbXB0eSBmb3IgYSBjYW52YXMsIGhpZGluZyBpdHMgZW1iZWRkZWQgYXR0YWNobWVudHMuXG4gICAgLy8gUmVhZGluZyB0aGUgY2FudmFzIHJlZmVyZW5jZXMgZGlyZWN0bHkgbW92ZXMgdGhlbSB3aXRoIHRoZSBjYW52YXMgKG1pcnJvcmluZyBub3RlIGJlaGF2aW9yKS5cbiAgICAvLyBUaGUgZmlsZSBhbHJlYWR5IGxpdmVzIGF0IHRoZSBuZXcgcGF0aCBhZnRlciB0aGUgcmVuYW1lLCBzbyByZWFkIHRoZSByZWZlcmVuY2VzIGZyb20gdGhlcmUuXG4gICAgaWYgKGlzQ2FudmFzRmlsZSh0aGlzLm9sZFBhdGgpKSB7XG4gICAgICBjb25zdCBjYW52YXNSZWZlcmVuY2VzID0gYXdhaXQgZ2V0Q2FudmFzUmVmZXJlbmNlcyh0aGlzLmFwcCwgdGhpcy5uZXdQYXRoKTtcbiAgICAgIHRoaXMub2xkUGF0aExpbmtzLnB1c2goLi4uY2FudmFzUmVmZXJlbmNlcyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuXG4gICAgY29uc3Qgb2xkRmlsZSA9IGdldEZpbGUoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGgsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogdHJ1ZSB9KTtcbiAgICBjb25zdCBvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCA9IGF3YWl0IHRoaXMuZ2V0T2xkQXR0YWNobWVudEZvbGRlclBhdGgob2xkRmlsZSk7XG5cbiAgICBjb25zdCBuZXdBdHRhY2htZW50Rm9sZGVyUGF0aCA9IHNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGb2xkZXJcbiAgICAgID8gYXdhaXQgZ2V0QXR0YWNobWVudEZvbGRlclBhdGgoe1xuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQuUmVuYW1lTm90ZSxcbiAgICAgICAgbm90ZVBhdGhPckZpbGU6IHRoaXMubmV3UGF0aFxuICAgICAgfSlcbiAgICAgIDogb2xkQXR0YWNobWVudEZvbGRlclBhdGg7XG5cbiAgICBjb25zdCBpc09sZEF0dGFjaG1lbnRGb2xkZXJBdFJvb3QgPSBvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCA9PT0gJy8nO1xuXG4gICAgY29uc3Qgb2xkQXR0YWNobWVudEZvbGRlciA9IGdldEZvbGRlck9yTnVsbCh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZvbGRlcjogb2xkQXR0YWNobWVudEZvbGRlclBhdGggfSk7XG5cbiAgICBpZiAoIW9sZEF0dGFjaG1lbnRGb2xkZXIgfHwgKG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoID09PSBuZXdBdHRhY2htZW50Rm9sZGVyUGF0aCAmJiAhc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRGaWxlczogVEZpbGVbXSA9IFtdO1xuXG4gICAgaWYgKFxuICAgICAgYXdhaXQgaGFzT3duQXR0YWNobWVudEZvbGRlcih7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGNvbnRleHQ6IEF0dGFjaG1lbnRQYXRoQ29udGV4dC5SZW5hbWVOb3RlLFxuICAgICAgICBwYXRoOiB0aGlzLm9sZFBhdGhcbiAgICAgIH0pXG4gICAgKSB7XG4gICAgICBWYXVsdC5yZWN1cnNlQ2hpbGRyZW4ob2xkQXR0YWNobWVudEZvbGRlciwgKG9sZEF0dGFjaG1lbnRGaWxlKSA9PiB7XG4gICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgaWYgKGlzRmlsZShvbGRBdHRhY2htZW50RmlsZSkpIHtcbiAgICAgICAgICBvbGRBdHRhY2htZW50RmlsZXMucHVzaChvbGRBdHRhY2htZW50RmlsZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IG9sZFBhdGhMaW5rIG9mIHRoaXMub2xkUGF0aExpbmtzKSB7XG4gICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgY29uc3Qgb2xkQXR0YWNobWVudEZpbGUgPSBleHRyYWN0TGlua0ZpbGUoeyBhcHA6IHRoaXMuYXBwLCBsaW5rOiBvbGRQYXRoTGluaywgc291cmNlUGF0aE9yRmlsZTogdGhpcy5vbGRQYXRoIH0pO1xuICAgICAgICBpZiAoIW9sZEF0dGFjaG1lbnRGaWxlIHx8ICghaXNPbGRBdHRhY2htZW50Rm9sZGVyQXRSb290ICYmICFvbGRBdHRhY2htZW50RmlsZS5wYXRoLnN0YXJ0c1dpdGgob2xkQXR0YWNobWVudEZvbGRlclBhdGgpKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb2xkQXR0YWNobWVudEJhY2tsaW5rcyA9IGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogb2xkQXR0YWNobWVudEZpbGUgfSk7XG4gICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgY29uc3Qga2V5cyA9IG5ldyBTZXQ8c3RyaW5nPihvbGRBdHRhY2htZW50QmFja2xpbmtzLmtleXMoKSk7XG4gICAgICAgIGtleXMuZGVsZXRlKHRoaXMub2xkUGF0aCk7XG4gICAgICAgIGtleXMuZGVsZXRlKHRoaXMubmV3UGF0aCk7XG4gICAgICAgIGlmIChrZXlzLnNpemUgPT09IDApIHtcbiAgICAgICAgICBvbGRBdHRhY2htZW50RmlsZXMucHVzaChvbGRBdHRhY2htZW50RmlsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG9sZEF0dGFjaG1lbnRGaWxlIG9mIG9sZEF0dGFjaG1lbnRGaWxlcykge1xuICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgaWYgKHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmlzTm90ZUV4KG9sZEF0dGFjaG1lbnRGaWxlLnBhdGgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBsZXQgbmV3QXR0YWNobWVudEZpbGVQYXRoOiBzdHJpbmc7XG4gICAgICBpZiAoc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzKSB7XG4gICAgICAgIG5ld0F0dGFjaG1lbnRGaWxlUGF0aCA9IGF3YWl0IGdldEF0dGFjaG1lbnRGaWxlUGF0aCh7XG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQuUmVuYW1lTm90ZSxcbiAgICAgICAgICBub3RlUGF0aE9yRmlsZTogdGhpcy5uZXdQYXRoLFxuICAgICAgICAgIG9sZEF0dGFjaG1lbnRQYXRoT3JGaWxlOiBvbGRBdHRhY2htZW50RmlsZSxcbiAgICAgICAgICBvbGROb3RlUGF0aE9yRmlsZTogdGhpcy5vbGRQYXRoLFxuICAgICAgICAgIHNob3VsZFNraXBEdXBsaWNhdGVDaGVjazogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gaXNPbGRBdHRhY2htZW50Rm9sZGVyQXRSb290ID8gb2xkQXR0YWNobWVudEZpbGUucGF0aCA6IHJlbGF0aXZlKG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoLCBvbGRBdHRhY2htZW50RmlsZS5wYXRoKTtcbiAgICAgICAgY29uc3QgbmV3Rm9sZGVyID0gam9pbihuZXdBdHRhY2htZW50Rm9sZGVyUGF0aCwgZGlybmFtZShyZWxhdGl2ZVBhdGgpKTtcbiAgICAgICAgbmV3QXR0YWNobWVudEZpbGVQYXRoID0gam9pbihuZXdGb2xkZXIsIG9sZEF0dGFjaG1lbnRGaWxlLm5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAob2xkQXR0YWNobWVudEZpbGUucGF0aCA9PT0gbmV3QXR0YWNobWVudEZpbGVQYXRoKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHNldHRpbmdzLnNob3VsZERlbGV0ZUNvbmZsaWN0aW5nQXR0YWNobWVudHMpIHtcbiAgICAgICAgY29uc3QgbmV3QXR0YWNobWVudEZpbGUgPSBnZXRGaWxlT3JOdWxsKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogbmV3QXR0YWNobWVudEZpbGVQYXRoIH0pO1xuICAgICAgICBpZiAobmV3QXR0YWNobWVudEZpbGUpIHtcbiAgICAgICAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmZpbGxSZW5hbWVNYXAnKShgUmVtb3ZpbmcgY29uZmxpY3RpbmcgYXR0YWNobWVudCAke25ld0F0dGFjaG1lbnRGaWxlLnBhdGh9LmApO1xuICAgICAgICAgIGF3YWl0IHRyYXNoU2FmZSh0aGlzLmFwcCwgbmV3QXR0YWNobWVudEZpbGUpO1xuICAgICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZGlyZWN0b3J5ID0gZGlybmFtZShuZXdBdHRhY2htZW50RmlsZVBhdGgpO1xuICAgICAgICBjb25zdCBleHRlbnNpb24gPSBleHRuYW1lKG5ld0F0dGFjaG1lbnRGaWxlUGF0aCk7XG4gICAgICAgIGNvbnN0IGJhc2VOYW1lID0gYmFzZW5hbWUobmV3QXR0YWNobWVudEZpbGVQYXRoLCBleHRlbnNpb24pO1xuICAgICAgICBuZXdBdHRhY2htZW50RmlsZVBhdGggPSB0aGlzLmFwcC52YXVsdC5nZXRBdmFpbGFibGVQYXRoKGpvaW4oZGlyZWN0b3J5LCBiYXNlTmFtZSksIGV4dGVuc2lvbi5zbGljZSgxKSk7XG4gICAgICB9XG4gICAgICB0aGlzLm1hcC5zZXQob2xkQXR0YWNobWVudEZpbGUucGF0aCwgbmV3QXR0YWNobWVudEZpbGVQYXRoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0KG9sZFBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmdldChvbGRQYXRoKTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0QmFja2xpbmtzTWFwKHBhcmFtczogUmVuYW1lTWFwSW5pdEJhY2tsaW5rc01hcFBhcmFtcyk6IHZvaWQge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbWJpbmVkQmFja2xpbmtzTWFwLFxuICAgICAgcGF0aCxcbiAgICAgIHNpbmdsZUJhY2tsaW5rc01hcFxuICAgIH0gPSBwYXJhbXM7XG4gICAgYnVpbGRCYWNrbGlua3NTbmFwc2hvdDxzdHJpbmc+KHtcbiAgICAgIGJhY2tsaW5rczogc2luZ2xlQmFja2xpbmtzTWFwLFxuICAgICAgbGlua0lkZW50aXR5S2V5UHJvdmlkZXI6IGdldExpbmtJZGVudGl0eUtleSxcbiAgICAgIHBhdGhSZW1hcHBlcjogKGJhY2tsaW5rUGF0aCkgPT4gdGhpcy5tYXAuZ2V0KGJhY2tsaW5rUGF0aCkgPz8gYmFja2xpbmtQYXRoLFxuICAgICAgcGF5bG9hZFByb3ZpZGVyOiAoKSA9PiBwYXRoLFxuICAgICAgdGFyZ2V0OiBjb21iaW5lZEJhY2tsaW5rc01hcFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGluaXRPcmlnaW5hbExpbmtzTWFwKGNvbWJpbmVkQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+Pik6IHZvaWQge1xuICAgIGZvciAoY29uc3Qgb2xkUGF0aExpbmsgb2YgdGhpcy5vbGRQYXRoTGlua3MpIHtcbiAgICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRGaWxlID0gZXh0cmFjdExpbmtGaWxlKHsgYXBwOiB0aGlzLmFwcCwgbGluazogb2xkUGF0aExpbmssIHNvdXJjZVBhdGhPckZpbGU6IHRoaXMub2xkUGF0aCB9KTtcbiAgICAgIGlmICghb2xkQXR0YWNobWVudEZpbGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBiYWNrbGlua3NNYXAgPSBuZXcgTWFwPHN0cmluZywgUmVmZXJlbmNlW10+KFtbdGhpcy5uZXdQYXRoLCBbb2xkUGF0aExpbmtdXV0pO1xuICAgICAgdGhpcy5pbml0QmFja2xpbmtzTWFwKHtcbiAgICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICAgIHBhdGg6IG9sZEF0dGFjaG1lbnRGaWxlLnBhdGgsXG4gICAgICAgIHNpbmdsZUJhY2tsaW5rc01hcDogYmFja2xpbmtzTWFwXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMga2V5cygpOiBJdGVyYWJsZUl0ZXJhdG9yPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLm1hcC5rZXlzKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0KG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tYXAuc2V0KG9sZFBhdGgsIG5ld1BhdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRPbGRBdHRhY2htZW50Rm9sZGVyUGF0aChvbGRGaWxlOiBURmlsZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdXNpbmcgX3JlZ2lzdHJhdGlvbiA9IHJlZ2lzdGVyRmlsZXModGhpcy5hcHAsIFtvbGRGaWxlXSk7XG4gICAgdXNpbmcgX2NhY2hlUmVnaXN0cmF0aW9uID0gdGhpcy5vbGRDYWNoZSAmJiBvbGRGaWxlLmRlbGV0ZWRcbiAgICAgID8gcmVnaXN0ZXJGaWxlQ2FjaGVGb3JOb25FeGlzdGluZ0ZpbGUoeyBhcHA6IHRoaXMuYXBwLCBjYWNoZTogdGhpcy5vbGRDYWNoZSwgcGF0aE9yRmlsZTogb2xkRmlsZSB9KVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGF3YWl0IGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQuUmVuYW1lTm90ZSxcbiAgICAgIG5vdGVQYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGhcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBzZXR0aW5ncyB0aGUgaGFuZGxlciBydW5zIHdpdGguXG4gKlxuICogVGhlcmUgaXMgZXhhY3RseSBvbmUgY29udHJpYnV0b3I6IHRoZSBjb21wb25lbnQncyBvd24gYHNldHRpbmdzQnVpbGRlcmAuIEVhcmxpZXIgdmVyc2lvbnMgYWdncmVnYXRlZCBhXG4gKiByZWdpc3RyeSBvZiBjb250cmlidXRvcnMgYW5kIE9SLW1lcmdlZCB0aGVpciBhbnN3ZXJzLCBiZWNhdXNlIHNldmVyYWwgcGx1Z2lucyBjb3VsZCBlYWNoIHJlZ2lzdGVyIGFcbiAqIGhhbmRsZXIgYWdhaW5zdCB0aGUgb25lIHNoYXJlZCB2YXVsdC4gVGhleSBubyBsb25nZXIgZG8sIHNvIHRoZXJlIGlzIG5vIGxvbmdlciBhbnkgcXVlc3Rpb24gb2Ygd2hvc2VcbiAqIHNldHRpbmcgd2lucy5cbiAqXG4gKiBXaGF0IHJlbWFpbnMgaXMgZGVmYXVsdGluZzogdGhlIGJ1aWxkZXIgcmV0dXJucyBhIGBQYXJ0aWFsYCwgc28gdGhlIHR3byBwcmVkaWNhdGVzIGFuZCB0aGUgZW1wdHktZm9sZGVyXG4gKiBiZWhhdmlvciBuZWVkIGEgdmFsdWUgd2hlbiBpdCBkb2VzIG5vdCBzdXBwbHkgb25lLlxuICovXG5jbGFzcyBTZXR0aW5nc01hbmFnZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzQnVpbGRlcjogKCkgPT4gUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzZXR0aW5nc0J1aWxkZXI6ICgpID0+IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPikge1xuICAgIHRoaXMuc2V0dGluZ3NCdWlsZGVyID0gc2V0dGluZ3NCdWlsZGVyO1xuICB9XG5cbiAgcHVibGljIGdldFNldHRpbmdzKCk6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPiB7XG4gICAgY29uc3QgYnVpbHRTZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NCdWlsZGVyKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmJ1aWx0U2V0dGluZ3MsXG4gICAgICBlbXB0eUZvbGRlckJlaGF2aW9yOiBidWlsdFNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgPz8gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwLFxuICAgICAgaXNOb3RlOiAocGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PiBidWlsdFNldHRpbmdzLmlzTm90ZT8uKHBhdGgpID8/IGlzTm90ZShwYXRoKSxcbiAgICAgIGlzUGF0aElnbm9yZWQ6IChwYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IGJ1aWx0U2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKHBhdGgpID8/IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBpc05vdGVFeChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuZ2V0U2V0dGluZ3MoKTtcbiAgICByZXR1cm4gc2V0dGluZ3MuaXNOb3RlPy4ocGF0aCkgPz8gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBDb21wb25lbnQgdGhhdCBoYW5kbGVzIHJlbmFtZSBhbmQgZGVsZXRlIGV2ZW50cyBpbiBPYnNpZGlhbi5cbiAqIEl0IGxpc3RlbnMgdG8gcmVuYW1lIGFuZCBkZWxldGUgZXZlbnRzIGFuZCB1cGRhdGVzIGxpbmtzIGFjY29yZGluZ2x5LlxuICogSXQgYWxzbyBoYW5kbGVzIGVkZ2UgY2FzZXMgc3VjaCBhcyBjYXNlLW9ubHkgcmVuYW1lcyBhbmQgY29sbGlzaW9ucyB3aXRoIGV4aXN0aW5nIGZpbGVzLlxuICovXG5leHBvcnQgY2xhc3MgUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgLyoqXG4gICAqIFRoZSBhYm9ydCBzaWduYWwgY29tcG9uZW50IHdob3NlIHNpZ25hbCBjYW5jZWxzIGluLWZsaWdodCByZW5hbWUgb3BlcmF0aW9ucy5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBhYm9ydFNpZ25hbENvbXBvbmVudDogQWJvcnRTaWduYWxDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCByZXBvcnRlciBpbnZva2VkIG9uY2UgcGVyIGJhY2tsaW5rIGZpbGUgd2hvc2UgbGlua3MgYXJlIHVwZGF0ZWQgZHVyaW5nIGEgcmVuYW1lL21vdmUsXG4gICAqIHdpdGggdGhlIHJ1bm5pbmcgY291bnQgb2YgcHJvY2Vzc2VkIGZpbGVzIGFuZCB0aGUgdG90YWwuIFdoZW4gYG51bGxgLCBubyBwcm9ncmVzcyBpcyByZXBvcnRlZC5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjogTGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIgfCBudWxsO1xuICAvKipcbiAgICogVGhlIG5vdGljZSBjb21wb25lbnQgdXNlZCB0byByZXBvcnQgdXBkYXRlZCBsaW5rcyB0byB0aGUgdXNlci5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZSBsb2NrIGNvbXBvbmVudCB1c2VkIHRvIGd1YXJkIGxpbmsgdXBkYXRlcywgb3IgYG51bGxgIGlmIG5vbmUgaXMgdXNlZC5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSByZXNvdXJjZUxvY2tDb21wb25lbnQ6IG51bGwgfCBSZXNvdXJjZUxvY2tDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGlzIHBsdWdpbidzIHJlbmFtZS9kZWxldGUgaGFuZGxlciBzZXR0aW5ncy5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzZXR0aW5nc0J1aWxkZXI6ICgpID0+IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPjtcblxuICAvKipcbiAgICogVGhlIG1hbmFnZXIgdGhhdCBhZ2dyZWdhdGVzIHJlbmFtZS9kZWxldGUgaGFuZGxlciBzZXR0aW5ncyBhY3Jvc3MgcmVnaXN0ZXJlZCBwbHVnaW5zLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAgPSBuZXcgTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVkUmVuYW1lcyA9IG5ldyBIYW5kbGVkUmVuYW1lcygpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZXJydXB0ZWRSZW5hbWVzTWFwID0gbmV3IE1hcDxzdHJpbmcsIEludGVycnVwdGVkUmVuYW1lW10+KCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFJlbmFtZURlbGV0ZUhhbmRsZXJDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hYm9ydFNpZ25hbENvbXBvbmVudCA9IHBhcmFtcy5hYm9ydFNpZ25hbENvbXBvbmVudDtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciA9IHBhcmFtcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciA/PyBudWxsO1xuICAgIHRoaXMucmVzb3VyY2VMb2NrQ29tcG9uZW50ID0gcGFyYW1zLnJlc291cmNlTG9ja0NvbXBvbmVudDtcbiAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCA9IHBhcmFtcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gICAgdGhpcy5zZXR0aW5nc0J1aWxkZXIgPSBwYXJhbXMuc2V0dGluZ3NCdWlsZGVyO1xuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gbmV3IFNldHRpbmdzTWFuYWdlcih0aGlzLnNldHRpbmdzQnVpbGRlcik7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdGhlIGNvbXBvbmVudFxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAudmF1bHQub24oJ2RlbGV0ZScsIHRoaXMuaGFuZGxlRGVsZXRlLmJpbmQodGhpcykpKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAudmF1bHQub24oJ3JlbmFtZScsIHRoaXMuaGFuZGxlUmVuYW1lLmJpbmQodGhpcykpKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAubWV0YWRhdGFDYWNoZS5vbignZGVsZXRlZCcsIHRoaXMuaGFuZGxlTWV0YWRhdGFEZWxldGVkLmJpbmQodGhpcykpKTtcblxuICAgIHRoaXMuYWRkQ2hpbGQoXG4gICAgICBuZXcgRmlsZU1hbmFnZXJSdW5Bc3luY0xpbmtVcGRhdGVQYXRjaENvbXBvbmVudCh7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGZpbGVNYW5hZ2VyOiB0aGlzLmFwcC5maWxlTWFuYWdlcixcbiAgICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5hZGRDaGlsZChcbiAgICAgIG5ldyBEZWxldGVQcm90ZWN0aW9uUGF0Y2hDb21wb25lbnQoe1xuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZURlbGV0ZShmaWxlOiBUQWJzdHJhY3RGaWxlKTogdm9pZCB7XG4gICAgYWRkVG9RdWV1ZSh7XG4gICAgICBvcGVyYXRpb25GdW5jdGlvbjogKGFib3J0U2lnbmFsKSA9PlxuICAgICAgICBuZXcgRGVsZXRlSGFuZGxlcih7XG4gICAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcCxcbiAgICAgICAgICBmaWxlLFxuICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgICAgICB9KS5oYW5kbGUoKSxcbiAgICAgIG9wZXJhdGlvbk5hbWU6IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5yZW5hbWVEZWxldGVIYW5kbGVyLmhhbmRsZURlbGV0ZSwgeyBmaWxlUGF0aDogZmlsZS5wYXRoIH0pXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU1ldGFkYXRhRGVsZXRlZChmaWxlOiBUQWJzdHJhY3RGaWxlLCBwcmV2aW91c0NhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGwpOiB2b2lkIHtcbiAgICBuZXcgTWV0YWRhdGFEZWxldGVkSGFuZGxlcih7XG4gICAgICBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcCxcbiAgICAgIGZpbGUsXG4gICAgICBwcmV2aW91c0NhY2hlLFxuICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgIH0pLmhhbmRsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVSZW5hbWUoZmlsZTogVEFic3RyYWN0RmlsZSwgb2xkUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCFpc0ZpbGUoZmlsZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdQYXRoID0gZmlsZS5wYXRoO1xuXG4gICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVSZW5hbWUnKShgSGFuZGxlIFJlbmFtZSAke29sZFBhdGh9IC0+ICR7bmV3UGF0aH1gKTtcbiAgICBpZiAodGhpcy5oYW5kbGVkUmVuYW1lcy5oYXMob2xkUGF0aCwgbmV3UGF0aCkpIHtcbiAgICAgIHRoaXMuaGFuZGxlZFJlbmFtZXMuZGVsZXRlKG9sZFBhdGgsIG5ld1BhdGgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogQSByZW5hbWUgb2NjdXJyaW5nIGluc2lkZSBhIGZvcmVpZ24gcGx1Z2luJ3MgaW4tZmxpZ2h0IGxvY2tlZCB0cmFuc2FjdGlvbiAod2hpY2ggbG9ja3MgdGhlXG4gICAgICogYWZmZWN0ZWQgZm9sZGVyIHN1YnRyZWUsIGUuZy4gQWR2YW5jZWQgTm90ZSBDb21wb3NlcidzIGZvbGRlciBtZXJnZSkgaXMgb3JjaGVzdHJhdGVkIGJ5IHRoYXRcbiAgICAgKiB0cmFuc2FjdGlvbidzIG93bmVyLCB3aGljaCB0YWtlcyByZXNwb25zaWJpbGl0eSBmb3IgaXRzIG93biBsaW5rIGNvbnNpc3RlbmN5LiBSZWFjdGluZyB0byBpdFxuICAgICAqIGhlcmUgd291bGQgKGEpIHBlcnR1cmIgT2JzaWRpYW4ncyBuYXRpdmUgcG9zdC1yZW5hbWUgbGluayB1cGRhdGUgYW5kIGxlYXZlIGxpbmtzIGRhbmdsaW5nLCBhbmRcbiAgICAgKiAoYikgY29sbGlkZSB3aXRoIHRoZSBmb3JlaWduIHRyYW5zYWN0aW9uIFx1MjAxNCBhbiBhc3luYyBhYm9ydCBmcm9tIHRoaXMgaGFuZGxlciBhYm9ydHMgYW5cbiAgICAgKiBhbHJlYWR5LWNvbW1pdHRlZCB0cmFuc2FjdGlvbiwgdGhyb3dpbmcgXCJDYW5ub3Qgcm9sbCBiYWNrIGEgY29tbWl0dGVkIHRyYW5zYWN0aW9uXCIuIFRoaXNcbiAgICAgKiBoYW5kbGVyJ3Mgb3duIGF0dGFjaG1lbnQgbW92ZXMgYXJlIGFscmVhZHkgZXhjbHVkZWQgYWJvdmUgdmlhIGBoYW5kbGVkUmVuYW1lc2AsIHNvIGEgbG9jayBzdGlsbFxuICAgICAqIGhlbGQgaGVyZSBhbHdheXMgYmVsb25ncyB0byBhIGZvcmVpZ24gb3BlcmF0aW9uOyBzdGF5IG91dCBvZiBpdHMgd2F5LiBTZWVcbiAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vbW5hb3Vtb3Yvb2JzaWRpYW4tYWR2YW5jZWQtbm90ZS1jb21wb3Nlci9pc3N1ZXMvMTQ2LlxuICAgICAqL1xuICAgIGlmIChpc1Jlc291cmNlTG9ja2VkRm9yUGF0aEJ5QW5jZXN0b3IodGhpcy5hcHAsIG9sZFBhdGgpIHx8IGlzUmVzb3VyY2VMb2NrZWRGb3JQYXRoQnlBbmNlc3Rvcih0aGlzLmFwcCwgbmV3UGF0aCkpIHtcbiAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlUmVuYW1lJykoXG4gICAgICAgIGBTa2lwcGluZyByZW5hbWUgaGFuZGxlciBvZiAke29sZFBhdGh9IC0+ICR7bmV3UGF0aH0gYXMgaXQgb2NjdXJzIGluc2lkZSBhIGZvcmVpZ24gbG9ja2VkIHRyYW5zYWN0aW9uLmBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuICAgIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcyAmJiAhc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZvbGRlciAmJiAhc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNOb09wUmVuYW1lKHNldHRpbmdzLCBvbGRQYXRoLCBuZXdQYXRoKSkge1xuICAgICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVSZW5hbWUnKShcbiAgICAgICAgYFNraXBwaW5nIHJlbmFtZSBoYW5kbGVyIG9mICR7b2xkUGF0aH0gLT4gJHtuZXdQYXRofSBhcyBpdCBpcyBub3QgYSBub3RlIGFuZCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvIHdpdGggbGluayB1cGRhdGVzIGRpc2FibGVkLmBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihvbGRQYXRoKSkge1xuICAgICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVSZW5hbWUnKShgU2tpcHBpbmcgcmVuYW1lIGhhbmRsZXIgb2Ygb2xkIHBhdGggJHtvbGRQYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4obmV3UGF0aCkpIHtcbiAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlUmVuYW1lJykoYFNraXBwaW5nIHJlbmFtZSBoYW5kbGVyIG9mIG5ldyBwYXRoICR7bmV3UGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvbGRDYWNoZSA9IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Q2FjaGUob2xkUGF0aCkgPz8gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRDYWNoZShuZXdQYXRoKTtcbiAgICBjb25zdCBvbGRQYXRoQmFja2xpbmtzTWFwID0gZ2V0QmFja2xpbmtzRm9yRmlsZU9yUGF0aCh0aGlzLmFwcCwgb2xkUGF0aCkuZGF0YTtcbiAgICBhZGRUb1F1ZXVlKHtcbiAgICAgIGFib3J0U2lnbmFsOiB0aGlzLmFib3J0U2lnbmFsQ29tcG9uZW50LmFib3J0U2lnbmFsLFxuICAgICAgb3BlcmF0aW9uRnVuY3Rpb246IChhYm9ydFNpZ25hbCkgPT5cbiAgICAgICAgbmV3IFJlbmFtZUhhbmRsZXIoe1xuICAgICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgaGFuZGxlZFJlbmFtZXM6IHRoaXMuaGFuZGxlZFJlbmFtZXMsXG4gICAgICAgICAgaW50ZXJydXB0ZWRSZW5hbWVzTWFwOiB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcCxcbiAgICAgICAgICBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjogdGhpcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcixcbiAgICAgICAgICBuZXdQYXRoLFxuICAgICAgICAgIG9sZENhY2hlLFxuICAgICAgICAgIG9sZFBhdGgsXG4gICAgICAgICAgb2xkUGF0aEJhY2tsaW5rc01hcCxcbiAgICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgICAgIHJlc291cmNlTG9ja0NvbXBvbmVudDogdGhpcy5yZXNvdXJjZUxvY2tDb21wb25lbnQsXG4gICAgICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgICAgICB9KS5oYW5kbGUoKSxcbiAgICAgIG9wZXJhdGlvbk5hbWU6IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5yZW5hbWVEZWxldGVIYW5kbGVyLmhhbmRsZVJlbmFtZSwgeyBuZXdQYXRoLCBvbGRQYXRoIH0pXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogV2l0aCBsaW5rIHJld3JpdGluZyBvZmYsIHRoZSBoYW5kbGVyJ3Mgb25seSByZW1haW5pbmcgam9icyBhcmUgbW92aW5nIGEgTk9URSdzIGF0dGFjaG1lbnRzIGFuZCBwcnVuaW5nXG4gICAqIHRoZSBmb2xkZXIgYSBtb3ZlZCBmaWxlIHZhY2F0ZWQuIEEgbm9uLW5vdGUgcmVuYW1lIG5lZWRzIG5laXRoZXIgd2hlbiBlbXB0eSBmb2xkZXJzIGFyZSBrZXB0LCBzbyB0aGVyZVxuICAgKiBpcyBub3RoaW5nIHRvIHF1ZXVlLlxuICAgKlxuICAgKiBAcGFyYW0gc2V0dGluZ3MgLSBUaGUgYWdncmVnYXRlZCByZW5hbWUvZGVsZXRlIGhhbmRsZXIgc2V0dGluZ3MuXG4gICAqIEBwYXJhbSBvbGRQYXRoIC0gVGhlIHBhdGggdGhlIGZpbGUgd2FzIHJlbmFtZWQgZnJvbS5cbiAgICogQHBhcmFtIG5ld1BhdGggLSBUaGUgcGF0aCB0aGUgZmlsZSB3YXMgcmVuYW1lZCB0by5cbiAgICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGhhbmRsZXIgd291bGQgZG8gbm8gd29yayBmb3IgdGhpcyByZW5hbWUuXG4gICAqL1xuICBwcml2YXRlIGlzTm9PcFJlbmFtZShzZXR0aW5nczogUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+LCBvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhc2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lc1xuICAgICAgJiYgIShzZXR0aW5ncy5pc05vdGU/LihvbGRQYXRoKSA/PyBmYWxzZSlcbiAgICAgICYmICEoc2V0dGluZ3MuaXNOb3RlPy4obmV3UGF0aCkgPz8gZmFsc2UpXG4gICAgICAmJiAoc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciA/PyBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXApID09PSBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXA7XG4gIH1cbn1cblxuLyoqXG4gKiBNb3ZlcyBhbiBhdHRhY2htZW50IGEgZGVsZXRpb24gd291bGQgb3RoZXJ3aXNlIHN0cmFuZCB0byB3aGVyZXZlciB0aGUgY29uc3VtaW5nIHBsdWdpbiBzYXlzIGl0IGJlbG9uZ3MuXG4gKlxuICogU2hhcmVkIGJ5IGJvdGggZGVsZXRlIHBhdGhzIFx1MjAxNCB0aGUgbm90ZSBkZWxldGUgaW4ge0BsaW5rIERlbGV0ZUhhbmRsZXJ9IGFuZCB0aGUgZm9sZGVyIGRlbGV0ZSByZXBsYXllZCBieVxuICoge0BsaW5rIERlbGV0ZVByb3RlY3Rpb25QYXRjaENvbXBvbmVudH0gXHUyMDE0IGJlY2F1c2UgYm90aCByZWFjaCB0aGUgc2FtZSBwb2ludDoge0BsaW5rIGRlbGV0ZUlmTm90VXNlZH0gaGFzXG4gKiBkZWNpZGVkIHRoZSBhdHRhY2htZW50IG11c3Qgc3Vydml2ZSwgYW5kIHdpdGhvdXQgdGhpcyBpdCB3b3VsZCBzdXJ2aXZlIGluIGEgZm9sZGVyIG5vdGhpbmcgb3ducyBhbnkgbW9yZS5cbiAqXG4gKiBBIGNvbnN1bWVyIHRoYXQgZG9lcyBub3QgaW1wbGVtZW50IHtAbGluayBSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3MuZ2V0UmVzY3VlUGF0aH0sIG9yIHRoYXQgYW5zd2Vyc1xuICogYG51bGxgLCBnZXRzIGV4YWN0bHkgdGhlIGJlaGF2aW9yIGl0IGhhZCBiZWZvcmUgdGhpcyBleGlzdGVkOiB0aGUgYXR0YWNobWVudCBzdGF5cyBwdXQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHdoZXRoZXIgdGhlIGF0dGFjaG1lbnQgd2FzIG1vdmVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBkaWRSZXNjdWVTdGlsbFVzZWRBdHRhY2htZW50KHBhcmFtczogRGlkUmVzY3VlU3RpbGxVc2VkQXR0YWNobWVudFBhcmFtcyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBzZXR0aW5ncyA9IHBhcmFtcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcbiAgaWYgKCFzZXR0aW5ncy5nZXRSZXNjdWVQYXRoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgYXR0YWNobWVudFBhdGggPSBwYXJhbXMucmVzY3VlUGFyYW1zLmZpbGUucGF0aDtcbiAgY29uc3QgcmVzY3VlUGF0aCA9IGF3YWl0IHNldHRpbmdzLmdldFJlc2N1ZVBhdGgoe1xuICAgIGF0dGFjaG1lbnRQYXRoLFxuICAgIHN1cnZpdmluZ05vdGVQYXRoczogcGFyYW1zLnJlc2N1ZVBhcmFtcy5zdXJ2aXZpbmdOb3RlUGF0aHNcbiAgfSk7XG5cbiAgaWYgKHJlc2N1ZVBhdGggPT09IG51bGwpIHtcbiAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmRpZFJlc2N1ZVN0aWxsVXNlZEF0dGFjaG1lbnQnKShgTm8gcmVzY3VlIHBhdGggZm9yICR7YXR0YWNobWVudFBhdGh9OyBrZWVwaW5nIGl0IHdoZXJlIGl0IGlzLmApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgLypcbiAgICAgKiBgcmVuYW1lU2FmZWAgY3JlYXRlcyB0aGUgZGVzdGluYXRpb24gZm9sZGVyLCByZXNvbHZlcyBhIGNvbGxpc2lvbiB2aWEgYGdldFNhZmVSZW5hbWVQYXRoYCwgYW5kIG1vdmVzXG4gICAgICogdGhyb3VnaCBgYXBwLmZpbGVNYW5hZ2VyLnJlbmFtZUZpbGVgLCBzbyB0aGUgc3Vydml2aW5nIG5vdGVzJyBsaW5rcyBmb2xsb3cgdGhlIGF0dGFjaG1lbnQuXG4gICAgICovXG4gICAgY29uc3QgbmV3QXR0YWNobWVudFBhdGggPSBhd2FpdCByZW5hbWVTYWZlKHtcbiAgICAgIGFwcDogcGFyYW1zLmFwcCxcbiAgICAgIG5ld1BhdGg6IHJlc2N1ZVBhdGgsXG4gICAgICBvbGRQYXRoT3JBYnN0cmFjdEZpbGU6IHBhcmFtcy5yZXNjdWVQYXJhbXMuZmlsZVxuICAgIH0pO1xuXG4gICAgaWYgKG5ld0F0dGFjaG1lbnRQYXRoID09PSBhdHRhY2htZW50UGF0aCkge1xuICAgICAgLypcbiAgICAgICAqIFRoZSBhdHRhY2htZW50IGlzIGFscmVhZHkgd2hlcmUgaXQgYmVsb25ncy4gVGhpcyBpcyB0aGUgbm9ybWFsIHNlY29uZCBsb29rIGF0IGEgZmlsZSB0aGUgZm9sZGVyXG4gICAgICAgKiBkZWxldGUganVzdCByZXNjdWVkOiB0aGUgb3duaW5nIG5vdGUncyBvd24gZGVsZXRpb24gaXMgcmVwb3J0ZWQgYWZ0ZXJ3YXJkcyBhbmQgd2Fsa3MgaXRzIGxpbmtzXG4gICAgICAgKiBhZ2Fpbi4gTm90aGluZyBtb3ZlZCwgc28gbm90aGluZyBpcyBjbGFpbWVkIFx1MjAxNCB0aGUgY2FsbGVyIGtlZXBzIGl0IGluIHBsYWNlLCB3aGljaCBpcyB0aGUgdHJ1dGguXG4gICAgICAgKi9cbiAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6ZGlkUmVzY3VlU3RpbGxVc2VkQXR0YWNobWVudCcpKGAke2F0dGFjaG1lbnRQYXRofSBhbHJlYWR5IHNpdHMgYXQgaXRzIHJlc2N1ZSBwYXRoOyBub3RoaW5nIHRvIG1vdmUuYCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBUaGUgbW92ZSBmaXJlcyBgdmF1bHQub24oJ3JlbmFtZScpYCwgc28gdGhpcyBoYW5kbGVyJ3Mgb3duIGBSZW5hbWVIYW5kbGVyYCBwaWNrcyBpdCB1cCBsaWtlIGFueSBvdGhlclxuICAgICAqIGF0dGFjaG1lbnQgbW92ZS4gSXQgaXMgZGVsaWJlcmF0ZWx5IE5PVCByZWdpc3RlcmVkIGluIGBoYW5kbGVkUmVuYW1lc2A6XG4gICAgICogYEZpbGVNYW5hZ2VyUnVuQXN5bmNMaW5rVXBkYXRlUGF0Y2hDb21wb25lbnRgIGFscmVhZHkgZGlzY2FyZHMgT2JzaWRpYW4ncyBuYXRpdmUgbGluayB1cGRhdGUgd2hpbGVcbiAgICAgKiBgc2hvdWxkSGFuZGxlUmVuYW1lc2AgaXMgb24sIHNvIHN1cHByZXNzaW5nIHRoZSBoYW5kbGVyIGFzIHdlbGwgd291bGQgbGVhdmUgZGFuZ2xpbmcgZXhhY3RseSB0aGUgbGlua3NcbiAgICAgKiB0aGlzIHJlc2N1ZSBleGlzdHMgdG8gcHJlc2VydmUuIExldCB0aGUgcmV3cml0ZSBzZXR0bGUgYmVmb3JlIHRoZSBkZWxldGUgd2FsayBjYXJyaWVzIG9uLlxuICAgICAqL1xuICAgIGF3YWl0IHdhaXRGb3JQZW5kaW5nTGlua1VwZGF0ZXMocGFyYW1zLmFwcCk7XG5cbiAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmRpZFJlc2N1ZVN0aWxsVXNlZEF0dGFjaG1lbnQnKShgUmVzY3VlZCAke2F0dGFjaG1lbnRQYXRofSB0byAke25ld0F0dGFjaG1lbnRQYXRofS5gKTtcbiAgICBwYXJhbXMucGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2UodCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLm5vdGljZXMuYXR0YWNobWVudFJlc2N1ZWQsIHsgYXR0YWNobWVudFBhdGgsIG5ld0F0dGFjaG1lbnRQYXRoIH0pKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvKlxuICAgICAqIEEgcmVzY3VlIHRoYXQgaGFsZiBoYXBwZW5lZCBtdXN0IG5vdCByZWFkIGFzIHN1Y2Nlc3MgXHUyMDE0IHJlcG9ydGluZyBgZmFsc2VgIGZhbGxzIGJhY2sgdG8ga2VlcGluZyB0aGVcbiAgICAgKiBhdHRhY2htZW50IGluIHBsYWNlIHdpdGggdGhlIGBhdHRhY2htZW50SXNTdGlsbFVzZWRgIG5vdGljZSwgd2hpY2ggaXMgc3RpbGwgc2FmZS5cbiAgICAgKi9cbiAgICBwcmludEVycm9yKG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlc2N1ZSAke2F0dGFjaG1lbnRQYXRofSB0byAke3Jlc2N1ZVBhdGh9YCwgeyBjYXVzZTogZXJyb3IgfSkpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUga2V5IHVuZGVyIHdoaWNoIGEgbGluayBpcyByZW1lbWJlcmVkIHdoaWxlIGEgcmVuYW1lIGlzIGluIGZsaWdodC5cbiAqXG4gKiBUaGUgcmV3cml0ZSBoYXMgdG8gbWF0Y2ggbGlua3MgY2FwdHVyZWQgQkVGT1JFIHRoZSBhdHRhY2htZW50cyBtb3ZlZCBhZ2FpbnN0IHRoZSBsaW5rcyB0aGUgbWV0YWRhdGEgY2FjaGVcbiAqIHJlcG9ydHMgQUZURVIgdGhleSBtb3ZlZCwgYW5kIHRoZSBvbmx5IHRoaW5nIHRoYXQgcmVsaWFibHkgc3Vydml2ZXMgdGhhdCBnYXAgaXMgdGhlIGxpbmsncyBURVhULlxuICogRGVsaWJlcmF0ZWx5IGV4Y2x1ZGVzIGBwb3NpdGlvbmA6IGtleWluZyBvbiB0aGUgd2hvbGUge0BsaW5rIFJlZmVyZW5jZX0gbWVhbnQgdGhhdCBhcyBzb29uIGFzIGFueXRoaW5nXG4gKiBlZGl0ZWQgdGhlIGZpbGUgaW4gYmV0d2VlbiBcdTIwMTQgYSBjby1pbnN0YWxsZWQgcGx1Z2luIHJld3JpdGluZyBpdHMgb3duIGxpbmtzLCBtb3N0IG9mdGVuIFx1MjAxNCBldmVyeSBsaW5rIGJlbG93XG4gKiB0aGUgZWRpdCBzaGlmdGVkIGl0cyBvZmZzZXRzLCBtaXNzZWQgaXRzIGtleSwgYW5kIHdhcyBza2lwcGVkIGluIHNpbGVuY2UsIGxlYXZpbmcgdGhlIG5vdGUgd2l0aCBzb21lIGVtYmVkc1xuICogcmV3cml0dGVuIGFuZCB0aGUgcmVzdCBicm9rZW4uIFNlZVxuICogaHR0cHM6Ly9naXRodWIuY29tL21uYW91bW92L29ic2lkaWFuLWN1c3RvbS1hdHRhY2htZW50LWxvY2F0aW9uL2lzc3Vlcy82MC5cbiAqXG4gKiBUd28gbGlua3Mgd2l0aCBpZGVudGljYWwgdGV4dCBpbiBvbmUgZmlsZSBuZWNlc3NhcmlseSByZXNvbHZlIHRvIHRoZSBzYW1lIHRhcmdldCwgc28gY29sbGFwc2luZyB0aGVtIG9udG9cbiAqIG9uZSBrZXkgbG9zZXMgbm90aGluZy5cbiAqXG4gKiBAcGFyYW0gbGluayAtIFRoZSBsaW5rIHRvIGJ1aWxkIHRoZSBrZXkgZm9yLlxuICogQHJldHVybnMgVGhlIGtleSBpZGVudGlmeWluZyB0aGUgbGluayBieSBpdHMgdGV4dCBhbG9uZS5cbiAqL1xuZnVuY3Rpb24gZ2V0TGlua0lkZW50aXR5S2V5KGxpbms6IFJlZmVyZW5jZSk6IHN0cmluZyB7XG4gIHJldHVybiB0b0pzb24oe1xuICAgIGxpbms6IGxpbmsubGluayxcbiAgICBvcmlnaW5hbDogbGluay5vcmlnaW5hbFxuICB9KTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cblxuZXhwb3J0IHsgRW1wdHlGb2xkZXJCZWhhdmlvciB9IGZyb20gJy4uL3ZhdWx0LnRzJztcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQW1CQSxtQkFBOEI7QUFDOUIsbUJBQTJCO0FBQzNCLDBCQUdPO0FBQ1Asa0JBTU87QUFFUCw2QkFHTztBQUNQLHFCQUFrQjtBQUNsQixzQkFHTztBQWFQLDZCQUtP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LFdBQU8sQ0FBQyxTQUFTLHVCQUNaLEVBQUUsU0FBUyxTQUFTLE9BQU8sS0FBSyxVQUNoQyxFQUFFLFNBQVMsU0FBUyxPQUFPLEtBQUssV0FDL0IsU0FBUyx1QkFBdUIsaUNBQW9CLFVBQVUsaUNBQW9CO0FBQUEsRUFDMUY7QUFDRjtBQWVBLGVBQWUsNkJBQTZCLFFBQThEO0FBQ3hHLFFBQU0sV0FBVyxPQUFPLGdCQUFnQixZQUFZO0FBQ3BELE1BQUksQ0FBQyxTQUFTLGVBQWU7QUFDM0IsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLGlCQUFpQixPQUFPLGFBQWEsS0FBSztBQUNoRCxRQUFNLGFBQWEsTUFBTSxTQUFTLGNBQWM7QUFBQSxJQUM5QztBQUFBLElBQ0Esb0JBQW9CLE9BQU8sYUFBYTtBQUFBLEVBQzFDLENBQUM7QUFFRCxNQUFJLGVBQWUsTUFBTTtBQUN2Qiw2Q0FBdUIsa0RBQWtELEVBQUUsc0JBQXNCLGNBQWMsMkJBQTJCO0FBQzFJLFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBSTtBQUtGLFVBQU0sb0JBQW9CLFVBQU0seUJBQVc7QUFBQSxNQUN6QyxLQUFLLE9BQU87QUFBQSxNQUNaLFNBQVM7QUFBQSxNQUNULHVCQUF1QixPQUFPLGFBQWE7QUFBQSxJQUM3QyxDQUFDO0FBRUQsUUFBSSxzQkFBc0IsZ0JBQWdCO0FBTXhDLCtDQUF1QixrREFBa0QsRUFBRSxHQUFHLGNBQWMsb0RBQW9EO0FBQ2hKLGFBQU87QUFBQSxJQUNUO0FBU0EsY0FBTSwrQ0FBMEIsT0FBTyxHQUFHO0FBRTFDLDZDQUF1QixrREFBa0QsRUFBRSxXQUFXLGNBQWMsT0FBTyxpQkFBaUIsR0FBRztBQUMvSCxXQUFPLHNCQUFzQixlQUFXLGtCQUFFLENBQUMsTUFBTSxFQUFFLGlCQUFpQixRQUFRLG1CQUFtQixFQUFFLGdCQUFnQixrQkFBa0IsQ0FBQyxDQUFDO0FBQ3JJLFdBQU87QUFBQSxFQUNULFNBQVMsT0FBTztBQUtkLGlDQUFXLElBQUksTUFBTSxvQkFBb0IsY0FBYyxPQUFPLFVBQVUsSUFBSSxFQUFFLE9BQU8sTUFBTSxDQUFDLENBQUM7QUFDN0YsV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQW1CQSxTQUFTLG1CQUFtQixNQUF5QjtBQUNuRCxhQUFPLDRCQUFPO0FBQUEsSUFDWixNQUFNLEtBQUs7QUFBQSxJQUNYLFVBQVUsS0FBSztBQUFBLEVBQ2pCLENBQUM7QUFDSDsiLAogICJuYW1lcyI6IFsiaW1wb3J0X3ZhdWx0Il0KfQo=
1275
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvcmVuYW1lLWRlbGV0ZS1oYW5kbGVyLWNvbXBvbmVudC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBoYW5kbGluZyByZW5hbWUgYW5kIGRlbGV0ZSBldmVudHMgaW4gT2JzaWRpYW4uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBMaW5rVXBkYXRlLFxuICBMaW5rVXBkYXRlc0hhbmRsZXJcbn0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdCc7XG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIFJlZmVyZW5jZSxcbiAgVEFic3RyYWN0RmlsZSxcbiAgVEZpbGUsXG4gIFRGb2xkZXJcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBmaWx0ZXJJblBsYWNlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FycmF5JztcbmltcG9ydCB7IHByaW50RXJyb3IgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZXJyb3InO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzLFxuICB0b0pzb25cbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuLyogdjggaWdub3JlIHN0YXJ0IC0tIERlZXBseSBjb3VwbGVkIHRvIE9ic2lkaWFuIHJ1bnRpbWU7IHJlcXVpcmVzIHJ1bm5pbmcgdmF1bHQgZm9yIG1lYW5pbmdmdWwgdGVzdGluZy4gKi9cbmltcG9ydCB7XG4gIGdldERhdGFBZGFwdGVyRXgsXG4gIEludGVybmFsUGx1Z2luTmFtZVxufSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0L2ltcGxlbWVudGF0aW9ucyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnaTE4bmV4dCc7XG5pbXBvcnQge1xuICBGaWxlTWFuYWdlcixcbiAgVmF1bHRcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IExpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyIH0gZnJvbSAnLi4vbGluay11cGRhdGUtcHJvZ3Jlc3MudHMnO1xuaW1wb3J0IHR5cGUge1xuICBFZGl0QmFja2xpbmtzU25hcHNob3RQYXJhbXMsXG4gIFVwZGF0ZUxpbmtQYXJhbXMsXG4gIFVwZGF0ZUxpbmtzSW5GaWxlUGFyYW1zXG59IGZyb20gJy4uL2xpbmsudHMnO1xuaW1wb3J0IHR5cGUgeyBSZXNvdXJjZUxvY2tDb21wb25lbnQgfSBmcm9tICcuLi9yZXNvdXJjZS1sb2NrLnRzJztcbmltcG9ydCB0eXBlIHsgUmVzY3VlU3RpbGxVc2VkRmlsZVBhcmFtcyB9IGZyb20gJy4uL3ZhdWx0LWRlbGV0ZS50cyc7XG5pbXBvcnQgdHlwZSB7IEFib3J0U2lnbmFsQ29tcG9uZW50IH0gZnJvbSAnLi9hYm9ydC1zaWduYWwtY29tcG9uZW50LnRzJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luTm90aWNlQ29tcG9uZW50IH0gZnJvbSAnLi9wbHVnaW4tbm90aWNlLWNvbXBvbmVudC50cyc7XG5cbmltcG9ydCB7XG4gIEF0dGFjaG1lbnRQYXRoQ29udGV4dCxcbiAgZ2V0QXR0YWNobWVudEZpbGVQYXRoLFxuICBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCxcbiAgaGFzT3duQXR0YWNobWVudEZvbGRlclxufSBmcm9tICcuLi9hdHRhY2htZW50LXBhdGgudHMnO1xuaW1wb3J0IHsgZ2V0Q2FudmFzUmVmZXJlbmNlcyB9IGZyb20gJy4uL2NhbnZhcy50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyIH0gZnJvbSAnLi4vZGVidWcudHMnO1xuaW1wb3J0IHsgd2FpdEZvclBlbmRpbmdMaW5rVXBkYXRlcyB9IGZyb20gJy4uL2ZpbGUtbWFuYWdlci50cyc7XG5pbXBvcnQge1xuICBDQU5WQVNfRklMRV9FWFRFTlNJT04sXG4gIGdldEZpbGUsXG4gIGdldEZpbGVPck51bGwsXG4gIGdldEZvbGRlck9yTnVsbCxcbiAgaXNDYW52YXNGaWxlLFxuICBpc0ZpbGUsXG4gIGlzRm9sZGVyLFxuICBpc01hcmtkb3duRmlsZSxcbiAgaXNOb3RlXG59IGZyb20gJy4uL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB7XG4gIGJ1aWxkQmFja2xpbmtzU25hcHNob3QsXG4gIGVkaXRCYWNrbGlua3NTbmFwc2hvdCxcbiAgZXh0cmFjdExpbmtGaWxlLFxuICB1cGRhdGVMaW5rLFxuICB1cGRhdGVMaW5rc0luRmlsZVxufSBmcm9tICcuLi9saW5rLnRzJztcbmltcG9ydCB7XG4gIGdldEJhY2tsaW5rc0ZvckZpbGVPclBhdGgsXG4gIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlLFxuICBnZXRMaW5rcyxcbiAgaGFzQmFja2xpbmtDYWNoZVBsdWdpbixcbiAgcmVnaXN0ZXJGaWxlQ2FjaGVGb3JOb25FeGlzdGluZ0ZpbGUsXG4gIHJlZ2lzdGVyRmlsZXNcbn0gZnJvbSAnLi4vbWV0YWRhdGEtY2FjaGUudHMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlIH0gZnJvbSAnLi4vb2JzaWRpYW4tZGV2LXV0aWxzLXN0YXRlLnRzJztcbmltcG9ydCB7IGFkZFRvUXVldWUgfSBmcm9tICcuLi9xdWV1ZS50cyc7XG5pbXBvcnQgeyBpc1Jlc291cmNlTG9ja2VkRm9yUGF0aEJ5QW5jZXN0b3IgfSBmcm9tICcuLi9yZXNvdXJjZS1sb2NrLnRzJztcbmltcG9ydCB7IGRlbGV0ZUlmTm90VXNlZCB9IGZyb20gJy4uL3ZhdWx0LWRlbGV0ZS50cyc7XG5pbXBvcnQge1xuICBjbGVhbnVwRW1wdHlGb2xkZXJzLFxuICBFbXB0eUZvbGRlckJlaGF2aW9yLFxuICBnZXRTYWZlUmVuYW1lUGF0aCxcbiAgaXNDaGlsZE9yU2VsZixcbiAgcmVuYW1lU2FmZSxcbiAgdHJhc2hTYWZlXG59IGZyb20gJy4uL3ZhdWx0LnRzJztcbmltcG9ydCB7IENvbXBvbmVudEV4IH0gZnJvbSAnLi9jb21wb25lbnQtZXgudHMnO1xuaW1wb3J0IHtcbiAgaGFzUGF0Y2hUb2tlbixcbiAgTW9ua2V5QXJvdW5kQ29tcG9uZW50XG59IGZyb20gJy4vbW9ua2V5LWFyb3VuZC1jb21wb25lbnQudHMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3MuZ2V0UmVzY3VlUGF0aH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0UmVzY3VlUGF0aFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvZiB0aGUgYXR0YWNobWVudCB0aGF0IGlzIGFib3V0IHRvIGJlIHN0cmFuZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYXR0YWNobWVudFBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBhdGhzIG9mIHRoZSBub3RlcyB0aGF0IHN0aWxsIHJlZmVyZW5jZSB0aGUgYXR0YWNobWVudCBvbmNlIHRoZSBkZWxldGlvbiBpcyBkb25lLiBOZXZlciBlbXB0eS5cbiAgICovXG4gIHJlYWRvbmx5IHN1cnZpdmluZ05vdGVQYXRoczogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbi8qKlxuICogU2V0dGluZ3MgZm9yIHRoZSByZW5hbWUvZGVsZXRlIGhhbmRsZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzIHtcbiAgLyoqXG4gICAqIEEgYmVoYXZpb3Igb2YgdGhlIHJlbmFtZS9kZWxldGUgaGFuZGxlciB3aGVuIGRlbGV0aW5nIGVtcHR5IGZvbGRlcnMuXG4gICAqL1xuICBlbXB0eUZvbGRlckJlaGF2aW9yOiBFbXB0eUZvbGRlckJlaGF2aW9yO1xuXG4gIC8qKlxuICAgKiBXaGVyZSB0byBtb3ZlIGFuIGF0dGFjaG1lbnQgdGhhdCBhIGRlbGV0aW9uIHdvdWxkIG90aGVyd2lzZSBzdHJhbmQgXHUyMDE0IG9uZSB0aGF0IHN1cnZpdmVzIGJlY2F1c2UgYW5vdGhlclxuICAgKiBub3RlIHN0aWxsIHJlZmVyZW5jZXMgaXQsIGJ1dCBpcyBsZWZ0IHNpdHRpbmcgaW4gYSBmb2xkZXIgd2hvc2Ugb3duaW5nIG5vdGUgaXMgZ29uZS5cbiAgICpcbiAgICogRGVjaWRpbmcgdGhlIGRlc3RpbmF0aW9uIGlzIHRoZSBwbHVnaW4ncyBhdHRhY2htZW50LXBhdGggcG9saWN5LCB3aGljaCBpcyB3aHkgdGhlIGhhbmRsZXIgYXNrcyByYXRoZXJcbiAgICogdGhhbiBndWVzc2VzLiBSZXR1cm5pbmcgYG51bGxgIFx1MjAxNCBvciBub3QgaW1wbGVtZW50aW5nIHRoaXMgYXQgYWxsIFx1MjAxNCBrZWVwcyB0aGUgYXR0YWNobWVudCB3aGVyZSBpdCBpcyxcbiAgICogd2hpY2ggaXMgdGhlIGJlaGF2aW9yIGV2ZXJ5IGNvbnN1bWVyIGhhZCBiZWZvcmUgdGhpcyBtZW1iZXIgZXhpc3RlZC5cbiAgICovXG4gIGdldFJlc2N1ZVBhdGg/OiAocGFyYW1zOiBHZXRSZXNjdWVQYXRoUGFyYW1zKSA9PiBQcm9taXNlPG51bGwgfCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwYXRoIGlzIGEgbm90ZS5cbiAgICovXG4gIGlzTm90ZTogKHBhdGg6IHN0cmluZykgPT4gYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpZ25vcmUgdGhlIHBhdGguXG4gICAqL1xuICBpc1BhdGhJZ25vcmVkOiAocGF0aDogc3RyaW5nKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGRlbGV0ZSBjb25mbGljdGluZyBhdHRhY2htZW50cy5cbiAgICovXG4gIHNob3VsZERlbGV0ZUNvbmZsaWN0aW5nQXR0YWNobWVudHM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaGFuZGxlIGRlbGV0aW9ucy5cbiAgICovXG4gIHNob3VsZEhhbmRsZURlbGV0aW9uczogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBoYW5kbGUgcmVuYW1lcy5cbiAgICovXG4gIHNob3VsZEhhbmRsZVJlbmFtZXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVuYW1lIGF0dGFjaG1lbnQgZmlsZXMgd2hlbiBhIG5vdGUgaXMgcmVuYW1lZC5cbiAgICovXG4gIHNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlczogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZW5hbWUgYXR0YWNobWVudCBmb2xkZXIgd2hlbiBhIG5vdGUgaXMgcmVuYW1lZC5cbiAgICovXG4gIHNob3VsZFJlbmFtZUF0dGFjaG1lbnRGb2xkZXI6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGUgbmFtZSBhbGlhc2VzIHdoZW4gYSBub3RlIGlzIHJlbmFtZWQuXG4gICAqL1xuICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzZXM6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBIYW5kbGVkUmVuYW1lS2V5IHtcbiAgbmV3UGF0aDogc3RyaW5nO1xuICBvbGRQYXRoOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBJbnRlcnJ1cHRlZFJlbmFtZSB7XG4gIGNvbWJpbmVkQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PjtcbiAgb2xkUGF0aDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUmVuYW1lSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuICByZWFkb25seSBhcHA6IEFwcDtcbiAgcmVhZG9ubHkgaGFuZGxlZFJlbmFtZXM6IEhhbmRsZWRSZW5hbWVzO1xuICByZWFkb25seSBpbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwPzogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj47XG4gIHJlYWRvbmx5IGludGVycnVwdGVkUmVuYW1lc01hcDogTWFwPHN0cmluZywgSW50ZXJydXB0ZWRSZW5hbWVbXT47XG4gIHJlYWRvbmx5IGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyOiBMaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciB8IG51bGw7XG4gIHJlYWRvbmx5IG5ld1BhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgb2xkQ2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcbiAgcmVhZG9ubHkgb2xkUGF0aDogc3RyaW5nO1xuICByZWFkb25seSBvbGRQYXRoQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT47XG4gIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICByZWFkb25seSByZXNvdXJjZUxvY2tDb21wb25lbnQ6IG51bGwgfCBSZXNvdXJjZUxvY2tDb21wb25lbnQ7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgUmVuYW1lTWFwQ29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBuZXdQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9sZENhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHJlYWRvbmx5IG9sZFBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBSZW5hbWVNYXBJbml0QmFja2xpbmtzTWFwUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjb21iaW5lZCBiYWNrbGlua3MgbWFwLCBrZXllZCBieSBuZXcgYmFja2xpbmsgcGF0aCwgYWNjdW11bGF0aW5nIGxpbmstSlNPTiB0byBzb3VyY2UtcGF0aCBtYXBwaW5ncy5cbiAgICovXG4gIHJlYWRvbmx5IGNvbWJpbmVkQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PjtcblxuICAvKipcbiAgICogVGhlIHBhdGggd2hvc2UgYmFja2xpbmtzIGFyZSBiZWluZyByZWNvcmRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGJhY2tsaW5rcyBtYXAgZm9yIGEgc2luZ2xlIGZpbGUsIGtleWVkIGJ5IGJhY2tsaW5rIHBhdGguXG4gICAqL1xuICByZWFkb25seSBzaW5nbGVCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPjtcbn1cblxuY29uc3QgUEFUQ0hfVE9LRU4gPSBTeW1ib2wuZm9yKCdyZW5hbWVEZWxldGVIYW5kbGVyJyk7XG5cbmludGVyZmFjZSBEZWxldGVIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+O1xuICByZWFkb25seSBmaWxlOiBUQWJzdHJhY3RGaWxlO1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBEZWxldGVQcm90ZWN0aW9uUGF0Y2hDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBEaWRSZXNjdWVTdGlsbFVzZWRBdHRhY2htZW50UGFyYW1zIHtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICByZWFkb25seSByZXNjdWVQYXJhbXM6IFJlc2N1ZVN0aWxsVXNlZEZpbGVQYXJhbXM7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgRmlsZU1hbmFnZXJSdW5Bc3luY0xpbmtVcGRhdGVQYXRjaENvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGZpbGVNYW5hZ2VyOiBGaWxlTWFuYWdlcjtcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBNZXRhZGF0YURlbGV0ZWRIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+O1xuICByZWFkb25seSBmaWxlOiBUQWJzdHJhY3RGaWxlO1xuICByZWFkb25seSBwcmV2aW91c0NhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYWJvcnRTaWduYWxDb21wb25lbnQ6IEFib3J0U2lnbmFsQ29tcG9uZW50O1xuICByZWFkb25seSBhcHA6IEFwcDtcbiAgcmVhZG9ubHkgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI/OiBMaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjtcbiAgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHJlYWRvbmx5IHJlc291cmNlTG9ja0NvbXBvbmVudDogbnVsbCB8IFJlc291cmNlTG9ja0NvbXBvbmVudDtcbiAgcmVhZG9ubHkgc2V0dGluZ3NCdWlsZGVyOiAoKSA9PiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz47XG59XG5cbmNsYXNzIERlbGV0ZUhhbmRsZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+O1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbGU6IFRBYnN0cmFjdEZpbGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogRGVsZXRlSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMuZmlsZSA9IHBhcmFtcy5maWxlO1xuICAgIHRoaXMuYWJvcnRTaWduYWwgPSBwYXJhbXMuYWJvcnRTaWduYWw7XG4gICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQgPSBwYXJhbXMucGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gcGFyYW1zLnNldHRpbmdzTWFuYWdlcjtcbiAgICB0aGlzLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwID0gcGFyYW1zLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGhhbmRsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVEZWxldGUnKShgSGFuZGxlIERlbGV0ZSAke3RoaXMuZmlsZS5wYXRofWApO1xuICAgIGlmICghaXNOb3RlKHRoaXMuZmlsZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci5leGlzdHModGhpcy5maWxlLnBhdGgpKSB7XG4gICAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZURlbGV0ZScpKFxuICAgICAgICBgU2tpcHBpbmcgZGVsZXRlIGhhbmRsZXIgb2YgJHt0aGlzLmZpbGUucGF0aH0gYXMgdGhlIGZpbGUgc3RpbGwgZXhpc3RzIG9uIGRpc2sgKGluZGV4LW9ubHkgcmVtb3ZhbCwgbm90IGEgcmVhbCBkZWxldGlvbikuYFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG5cbiAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKHRoaXMuZmlsZS5wYXRoKSkge1xuICAgICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVEZWxldGUnKShgU2tpcHBpbmcgZGVsZXRlIGhhbmRsZXIgb2YgJHt0aGlzLmZpbGUucGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnRGb2xkZXJQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPihbZGlybmFtZSh0aGlzLmZpbGUucGF0aCldKTtcblxuICAgIGlmIChzZXR0aW5ncy5zaG91bGRIYW5kbGVEZWxldGlvbnMpIHtcbiAgICAgIGNvbnN0IGNhY2hlID0gdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcC5nZXQodGhpcy5maWxlLnBhdGgpO1xuICAgICAgdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcC5kZWxldGUodGhpcy5maWxlLnBhdGgpO1xuICAgICAgaWYgKGNhY2hlKSB7XG4gICAgICAgIGNvbnN0IGxpbmtzID0gZ2V0TGlua3MoeyBjYWNoZSB9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IGxpbmsgb2YgbGlua3MpIHtcbiAgICAgICAgICBjb25zdCBhdHRhY2htZW50RmlsZSA9IGV4dHJhY3RMaW5rRmlsZSh7IGFwcDogdGhpcy5hcHAsIGxpbmssIHNvdXJjZVBhdGhPckZpbGU6IHRoaXMuZmlsZS5wYXRoIH0pO1xuICAgICAgICAgIGlmICghYXR0YWNobWVudEZpbGUgfHwgdGhpcy5zZXR0aW5nc01hbmFnZXIuaXNOb3RlRXgoYXR0YWNobWVudEZpbGUucGF0aCkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBhcmVudEZvbGRlclBhdGhzLmFkZChhdHRhY2htZW50RmlsZS5wYXJlbnQ/LnBhdGggPz8gJycpO1xuICAgICAgICAgIGF3YWl0IGRlbGV0ZUlmTm90VXNlZCh7XG4gICAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgICAgZGVsZXRlZE5vdGVQYXRoOiB0aGlzLmZpbGUucGF0aCxcbiAgICAgICAgICAgIHBhdGhPckZpbGU6IGF0dGFjaG1lbnRGaWxlLFxuICAgICAgICAgICAgcmVzY3VlU3RpbGxVc2VkRmlsZTogdGhpcy5yZXNjdWVTdGlsbFVzZWRGaWxlLmJpbmQodGhpcyksXG4gICAgICAgICAgICBzaG91bGREZWxldGVFbXB0eUZvbGRlcnM6IHNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgIT09IEVtcHR5Rm9sZGVyQmVoYXZpb3IuS2VlcFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHBhcmVudEZvbGRlclBhdGhzLmRlbGV0ZSgnJyk7XG4gICAgYXdhaXQgY2xlYW51cEVtcHR5Rm9sZGVycyh7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgZW1wdHlGb2xkZXJCZWhhdmlvcjogc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciA/PyBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXAsXG4gICAgICBmb2xkZXJQYXRoczogWy4uLnBhcmVudEZvbGRlclBhdGhzXVxuICAgIH0pO1xuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYXR0YWNobWVudEZvbGRlclBhdGggPSBhd2FpdCBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCh7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0LkRlbGV0ZU5vdGUsXG4gICAgICBub3RlUGF0aE9yRmlsZTogdGhpcy5maWxlLnBhdGhcbiAgICB9KTtcbiAgICBjb25zdCBhdHRhY2htZW50Rm9sZGVyID0gZ2V0Rm9sZGVyT3JOdWxsKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRm9sZGVyOiBhdHRhY2htZW50Rm9sZGVyUGF0aCB9KTtcblxuICAgIGlmIChcbiAgICAgICFhdHRhY2htZW50Rm9sZGVyIHx8ICFhd2FpdCBoYXNPd25BdHRhY2htZW50Rm9sZGVyKHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0LkRlbGV0ZU5vdGUsXG4gICAgICAgIHBhdGg6IHRoaXMuZmlsZS5wYXRoXG4gICAgICB9KVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIGF3YWl0IGRlbGV0ZUlmTm90VXNlZCh7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgZGVsZXRlZE5vdGVQYXRoOiB0aGlzLmZpbGUucGF0aCxcbiAgICAgIHBhdGhPckZpbGU6IGF0dGFjaG1lbnRGb2xkZXIsXG4gICAgICByZXNjdWVTdGlsbFVzZWRGaWxlOiB0aGlzLnJlc2N1ZVN0aWxsVXNlZEZpbGUuYmluZCh0aGlzKSxcbiAgICAgIHNob3VsZERlbGV0ZUVtcHR5Rm9sZGVyczogc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciAhPT0gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwXG4gICAgfSk7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNjdWVTdGlsbFVzZWRGaWxlKHJlc2N1ZVBhcmFtczogUmVzY3VlU3RpbGxVc2VkRmlsZVBhcmFtcyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBkaWRSZXNjdWVTdGlsbFVzZWRBdHRhY2htZW50KHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgcmVzY3VlUGFyYW1zLFxuICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogS2VlcHMgYSBmb2xkZXIgZGVsZXRpb24gZnJvbSBkZXN0cm95aW5nIGFuIGF0dGFjaG1lbnQgYSBub3RlIG91dHNpZGUgdGhhdCBmb2xkZXIgc3RpbGwgcmVmZXJlbmNlcy5cbiAqXG4gKiBEZWxldGluZyBhIE5PVEUgaXMgYWxyZWFkeSBzYWZlOiB7QGxpbmsgZGVsZXRlSWZOb3RVc2VkfSBkaXNjb3VudHMgdGhlIGRlbGV0ZWQgbm90ZSdzIG93biBiYWNrbGlua3MsIHNlZXNcbiAqIGFub3RoZXIgbm90ZSBzdGlsbCByZWZlcmVuY2luZyB0aGUgYXR0YWNobWVudCwgYW5kIGtlZXBzIGl0LiBEZWxldGluZyBhIEZPTERFUiB3YXMgbm90LCBiZWNhdXNlXG4gKiB7QGxpbmsgUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudH0gb25seSBsaXN0ZW5zIChgdmF1bHQub24oJ2RlbGV0ZScpYCkgYW5kIGJ5IHRoZSB0aW1lIGEgZm9sZGVyIGRlbGV0aW9uXG4gKiBpcyByZXBvcnRlZCBpdHMgY2hpbGRyZW4gYXJlIGFscmVhZHkgZ29uZS4gTm90aGluZyByZWFjdGl2ZSBjYW4gaGVscCwgc28gdGhpcyBjb21wb25lbnQgaW50ZXJjZXB0cyB0aGVcbiAqIGRlbGV0aW9uIHByaW1pdGl2ZXMgaW5zdGVhZDogYEZpbGVNYW5hZ2VyLnRyYXNoRmlsZWAgKHdoYXQgdGhlIGZpbGUtZXhwbG9yZXIgRGVsZXRlIGZsb3cgcmVhY2hlcyB0aHJvdWdoXG4gKiBgcHJvbXB0Rm9yRGVsZXRpb25gKSBwbHVzIHRoZSByYXcgYFZhdWx0LmRlbGV0ZWAgLyBgVmF1bHQudHJhc2hgIGEgcGx1Z2luIG1heSBjYWxsIGRpcmVjdGx5LlxuICpcbiAqIEEgZm9sZGVyIGRlbGV0aW9uIGlzIHNjYW5uZWQgZmlyc3QuIFdoZW4gbm90aGluZyBpbnNpZGUgaXQgaXMgc3RpbGwgcmVmZXJlbmNlZCBmcm9tIG91dHNpZGUgXHUyMDE0IHRoZVxuICogb3ZlcndoZWxtaW5nIG1ham9yaXR5IG9mIGRlbGV0aW9ucyBcdTIwMTQgdGhlIG9yaWdpbmFsIHJ1bnMgdW50b3VjaGVkLCBzbyB0aGUgbmF0aXZlIGJlaGF2aW9yIGlzIHByZXNlcnZlZFxuICogZXhhY3RseS4gT25seSB3aGVuIHNvbWV0aGluZyB3b3VsZCBiZSBsb3N0IGRvZXMgdGhpcyB0YWtlIG92ZXIsIHJlcGxheWluZyB0aGUgZGVsZXRpb24gdGhyb3VnaFxuICoge0BsaW5rIGRlbGV0ZUlmTm90VXNlZH06IGV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgZm9sZGVyIGdvZXMsIHRoZSBzdGlsbC1yZWZlcmVuY2VkIGF0dGFjaG1lbnRzIGFuZCB0aGVcbiAqIGZvbGRlcnMgaG9sZGluZyB0aGVtIHN0YXksIGFuZCB0aGUgYGF0dGFjaG1lbnRJc1N0aWxsVXNlZGAgbm90aWNlIGZpcmVzLCBtaXJyb3JpbmcgdGhlIG5vdGUgY2FzZS5cbiAqXG4gKiBGaWxlcyBhcmUgbmV2ZXIgaW50ZXJjZXB0ZWQgXHUyMDE0IGRlbGV0aW5nIGEgZmlsZSBpcyB0aGUgdXNlciBuYW1pbmcgdGhhdCBmaWxlIGV4cGxpY2l0bHkuXG4gKi9cbmNsYXNzIERlbGV0ZVByb3RlY3Rpb25QYXRjaENvbXBvbmVudCBleHRlbmRzIE1vbmtleUFyb3VuZENvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJvb3RzIG9mIHRoZSBmb2xkZXIgZGVsZXRpb25zIGN1cnJlbnRseSBiZWluZyByZXBsYXllZC4gVGhlIHJlcGxheSBkZWxldGVzIHRocm91Z2ggdGhlIFVOUEFUQ0hFRFxuICAgKiBvcmlnaW5hbCwgc28gaXQgY2Fubm90IHJlLWVudGVyIHRoaXMgY29tcG9uZW50IGRpcmVjdGx5IFx1MjAxNCBidXQgYEZpbGVNYW5hZ2VyLnRyYXNoRmlsZWAgaXRzZWxmIGNhbGxzIGRvd25cbiAgICogaW50byBgVmF1bHQudHJhc2hgIC8gYFZhdWx0LmRlbGV0ZWAsIHdoaWNoIGFyZSBwYXRjaGVkIHRvbywgYW5kIHJlLXNjYW5uaW5nIGEgc3VidHJlZSBhbHJlYWR5IGJlaW5nXG4gICAqIHdhbGtlZCBpcyBwdXJlIHdhc3RlLiBTY29wZWQgYnkgcGF0aCByYXRoZXIgdGhhbiBieSBhIGZsYWcgc28gdGhhdCBhbiB1bnJlbGF0ZWQgZm9sZGVyIGRlbGV0aW9uXG4gICAqIGludGVybGVhdmluZyBvbiBhbiBgYXdhaXRgIGlzIHN0aWxsIHByb3RlY3RlZC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVwbGF5ZWRGb2xkZXJQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogRGVsZXRlUHJvdGVjdGlvblBhdGNoQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCA9IHBhcmFtcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8RmlsZU1hbmFnZXIsICd0cmFzaEZpbGUnPih7XG4gICAgICAkb2JqZWN0OiBGaWxlTWFuYWdlci5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAndHJhc2hGaWxlJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZV0sIG9yaWdpbmFsTWV0aG9kQm91bmQgfSkgPT5cbiAgICAgICAgdGhpcy5oYW5kbGVEZWxldGlvbihmaWxlLCBmYWxsYmFjaywgYXN5bmMgKGFic3RyYWN0RmlsZSkgPT4ge1xuICAgICAgICAgIGF3YWl0IG9yaWdpbmFsTWV0aG9kQm91bmQoYWJzdHJhY3RGaWxlKTtcbiAgICAgICAgfSlcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdkZWxldGUnPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAnZGVsZXRlJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZSwgZm9yY2VdLCBvcmlnaW5hbE1ldGhvZEJvdW5kIH0pID0+XG4gICAgICAgIHRoaXMuaGFuZGxlRGVsZXRpb24oZmlsZSwgZmFsbGJhY2ssIGFzeW5jIChhYnN0cmFjdEZpbGUpID0+IHtcbiAgICAgICAgICBhd2FpdCBvcmlnaW5hbE1ldGhvZEJvdW5kKGFic3RyYWN0RmlsZSwgZm9yY2UpO1xuICAgICAgICB9KVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ3RyYXNoJz4oe1xuICAgICAgJG9iamVjdDogVmF1bHQucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ3RyYXNoJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZSwgc3lzdGVtXSwgb3JpZ2luYWxNZXRob2RCb3VuZCB9KSA9PlxuICAgICAgICB0aGlzLmhhbmRsZURlbGV0aW9uKGZpbGUsIGZhbGxiYWNrLCBhc3luYyAoYWJzdHJhY3RGaWxlKSA9PiB7XG4gICAgICAgICAgYXdhaXQgb3JpZ2luYWxNZXRob2RCb3VuZChhYnN0cmFjdEZpbGUsIHN5c3RlbSk7XG4gICAgICAgIH0pXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29sbGVjdHMgdGhlIHBhdGhzIG9mIGV2ZXJ5IG5vdGUgaW5zaWRlIHRoZSBmb2xkZXIuIFRoZXkgYXJlIHRoZSBsaW5rIHNvdXJjZXMgdGhhdCBkaXNhcHBlYXIgYWxvbmcgd2l0aFxuICAgKiB0aGUgZm9sZGVyLCBzbyB0aGVpciBiYWNrbGlua3MgbXVzdCBub3Qga2VlcCBhbiBhdHRhY2htZW50IGFsaXZlLlxuICAgKlxuICAgKiBAcGFyYW0gZm9sZGVyIC0gVGhlIGZvbGRlciBiZWluZyBkZWxldGVkLlxuICAgKiBAcGFyYW0gc2V0dGluZ3MgLSBUaGUgYWdncmVnYXRlZCByZW5hbWUvZGVsZXRlIGhhbmRsZXIgc2V0dGluZ3MuXG4gICAqIEByZXR1cm5zIFRoZSBwYXRocyBvZiB0aGUgbm90ZXMgaW5zaWRlIHRoZSBmb2xkZXIuXG4gICAqL1xuICBwcml2YXRlIGNvbGxlY3REZWxldGVkTm90ZVBhdGhzKGZvbGRlcjogVEZvbGRlciwgc2V0dGluZ3M6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPik6IFNldDxzdHJpbmc+IHtcbiAgICBjb25zdCBkZWxldGVkTm90ZVBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgVmF1bHQucmVjdXJzZUNoaWxkcmVuKGZvbGRlciwgKGNoaWxkKSA9PiB7XG4gICAgICBpZiAoaXNGaWxlKGNoaWxkKSAmJiAoc2V0dGluZ3MuaXNOb3RlPy4oY2hpbGQucGF0aCkgPz8gZmFsc2UpKSB7XG4gICAgICAgIGRlbGV0ZWROb3RlUGF0aHMuYWRkKGNoaWxkLnBhdGgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBkZWxldGVkTm90ZVBhdGhzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBhdHRhY2htZW50cyBpbnNpZGUgdGhlIGZvbGRlciB0aGF0IGEgbm90ZSBvdXRzaWRlIGl0IHN0aWxsIHJlZmVyZW5jZXMsIGFuZCB3b3VsZCB0aGVyZWZvcmUgYmVcbiAgICogZGVzdHJveWVkIGJ5IGRlbGV0aW5nIHRoZSBmb2xkZXIuXG4gICAqXG4gICAqIEBwYXJhbSBmb2xkZXIgLSBUaGUgZm9sZGVyIGJlaW5nIGRlbGV0ZWQuXG4gICAqIEBwYXJhbSBkZWxldGVkTm90ZVBhdGhzIC0gVGhlIHBhdGhzIG9mIHRoZSBub3RlcyB0aGF0IGRpc2FwcGVhciBhbG9uZyB3aXRoIHRoZSBmb2xkZXIuXG4gICAqIEBwYXJhbSBzZXR0aW5ncyAtIFRoZSBhZ2dyZWdhdGVkIHJlbmFtZS9kZWxldGUgaGFuZGxlciBzZXR0aW5ncy5cbiAgICogQHJldHVybnMgVGhlIHBhdGhzIG9mIHRoZSBhdHRhY2htZW50cyB0aGF0IG11c3Qgc3Vydml2ZSB0aGUgZGVsZXRpb24uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZpbmRTdGlsbFVzZWRBdHRhY2htZW50UGF0aHMoXG4gICAgZm9sZGVyOiBURm9sZGVyLFxuICAgIGRlbGV0ZWROb3RlUGF0aHM6IFNldDxzdHJpbmc+LFxuICAgIHNldHRpbmdzOiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz5cbiAgKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IGNhbmRpZGF0ZUZpbGVzOiBURmlsZVtdID0gW107XG4gICAgVmF1bHQucmVjdXJzZUNoaWxkcmVuKGZvbGRlciwgKGNoaWxkKSA9PiB7XG4gICAgICBpZiAoaXNGaWxlKGNoaWxkKSAmJiAhKHNldHRpbmdzLmlzTm90ZT8uKGNoaWxkLnBhdGgpID8/IGZhbHNlKSkge1xuICAgICAgICBjYW5kaWRhdGVGaWxlcy5wdXNoKGNoaWxkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHN0aWxsVXNlZEF0dGFjaG1lbnRQYXRoczogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgY2FuZGlkYXRlRmlsZSBvZiBjYW5kaWRhdGVGaWxlcykge1xuICAgICAgY29uc3QgYmFja2xpbmtzID0gYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiBjYW5kaWRhdGVGaWxlIH0pO1xuICAgICAgZm9yIChjb25zdCBkZWxldGVkTm90ZVBhdGggb2YgZGVsZXRlZE5vdGVQYXRocykge1xuICAgICAgICBiYWNrbGlua3MuY2xlYXIoZGVsZXRlZE5vdGVQYXRoKTtcbiAgICAgIH1cbiAgICAgIGlmIChiYWNrbGlua3MuY291bnQoKSAhPT0gMCkge1xuICAgICAgICBzdGlsbFVzZWRBdHRhY2htZW50UGF0aHMucHVzaChjYW5kaWRhdGVGaWxlLnBhdGgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzdGlsbFVzZWRBdHRhY2htZW50UGF0aHM7XG4gIH1cblxuICAvKipcbiAgICogRGVjaWRlcyB3aGV0aGVyIGEgZGVsZXRpb24gbmVlZHMgcHJvdGVjdGluZyBhbmQsIGlmIHNvLCByZXBsYWNlcyBpdCB3aXRoIGEgcHJvdGVjdGVkIHJlcGxheS5cbiAgICpcbiAgICogQHBhcmFtIGZpbGUgLSBUaGUgYWJzdHJhY3QgZmlsZSBiZWluZyBkZWxldGVkLlxuICAgKiBAcGFyYW0gZmFsbGJhY2sgLSBJbnZva2VzIHRoZSBpbnRlcmNlcHRlZCBtZXRob2QgdW5jaGFuZ2VkLlxuICAgKiBAcGFyYW0gZGVsZXRlQWJzdHJhY3RGaWxlIC0gRGVsZXRlcyBhIHNpbmdsZSBhYnN0cmFjdCBmaWxlIHRocm91Z2ggdGhlIGludGVyY2VwdGVkIG1ldGhvZCdzIHVucGF0Y2hlZCBvcmlnaW5hbC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBkZWxldGlvbiBpcyBkb25lLlxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVEZWxldGlvbihcbiAgICBmaWxlOiBUQWJzdHJhY3RGaWxlLFxuICAgIGZhbGxiYWNrOiAoKSA9PiBQcm9taXNlPHZvaWQ+LFxuICAgIGRlbGV0ZUFic3RyYWN0RmlsZTogKGFic3RyYWN0RmlsZTogVEFic3RyYWN0RmlsZSkgPT4gUHJvbWlzZTx2b2lkPlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5zaG91bGRDb25zaWRlckZvbGRlcihmaWxlKSA/IHRoaXMucmVwbGF5Rm9sZGVyRGVsZXRpb24oZmlsZSwgZmFsbGJhY2ssIGRlbGV0ZUFic3RyYWN0RmlsZSkgOiBmYWxsYmFjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgdGhlIGZvbGRlciB3aGlsZSBrZWVwaW5nIHdoYXRldmVyIGluc2lkZSBpdCBpcyBzdGlsbCByZWZlcmVuY2VkIGZyb20gb3V0c2lkZS5cbiAgICpcbiAgICogQHBhcmFtIGZvbGRlciAtIFRoZSBmb2xkZXIgYmVpbmcgZGVsZXRlZC5cbiAgICogQHBhcmFtIGZhbGxiYWNrIC0gSW52b2tlcyB0aGUgaW50ZXJjZXB0ZWQgbWV0aG9kIHVuY2hhbmdlZC5cbiAgICogQHBhcmFtIGRlbGV0ZUFic3RyYWN0RmlsZSAtIERlbGV0ZXMgYSBzaW5nbGUgYWJzdHJhY3QgZmlsZSB0aHJvdWdoIHRoZSBpbnRlcmNlcHRlZCBtZXRob2QncyB1bnBhdGNoZWQgb3JpZ2luYWwuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZGVsZXRpb24gaXMgZG9uZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVwbGF5Rm9sZGVyRGVsZXRpb24oXG4gICAgZm9sZGVyOiBURm9sZGVyLFxuICAgIGZhbGxiYWNrOiAoKSA9PiBQcm9taXNlPHZvaWQ+LFxuICAgIGRlbGV0ZUFic3RyYWN0RmlsZTogKGFic3RyYWN0RmlsZTogVEFic3RyYWN0RmlsZSkgPT4gUHJvbWlzZTx2b2lkPlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG4gICAgY29uc3QgZGVsZXRlZE5vdGVQYXRocyA9IHRoaXMuY29sbGVjdERlbGV0ZWROb3RlUGF0aHMoZm9sZGVyLCBzZXR0aW5ncyk7XG4gICAgY29uc3Qgc3RpbGxVc2VkQXR0YWNobWVudFBhdGhzID0gYXdhaXQgdGhpcy5maW5kU3RpbGxVc2VkQXR0YWNobWVudFBhdGhzKGZvbGRlciwgZGVsZXRlZE5vdGVQYXRocywgc2V0dGluZ3MpO1xuXG4gICAgaWYgKHN0aWxsVXNlZEF0dGFjaG1lbnRQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6ZGVsZXRlUHJvdGVjdGlvbicpKGBOb3RoaW5nIHRvIHByb3RlY3QgaW4gJHtmb2xkZXIucGF0aH07IGRlbGV0aW5nIGl0IGFzIHVzdWFsLmApO1xuICAgICAgYXdhaXQgZmFsbGJhY2soKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmRlbGV0ZVByb3RlY3Rpb24nKShcbiAgICAgIGBQcm90ZWN0aW5nICR7c3RpbGxVc2VkQXR0YWNobWVudFBhdGhzLmxlbmd0aC50b1N0cmluZygpfSBzdGlsbC1yZWZlcmVuY2VkIGF0dGFjaG1lbnQocykgZnJvbSB0aGUgZGVsZXRpb24gb2YgJHtmb2xkZXIucGF0aH06ICR7dG9Kc29uKHN0aWxsVXNlZEF0dGFjaG1lbnRQYXRocyl9YFxuICAgICk7XG5cbiAgICB0aGlzLnJlcGxheWVkRm9sZGVyUGF0aHMuYWRkKGZvbGRlci5wYXRoKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZGVsZXRlSWZOb3RVc2VkKHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgZGVsZXRlQWJzdHJhY3RGaWxlLFxuICAgICAgICBkZWxldGVkTm90ZVBhdGhzOiBbLi4uZGVsZXRlZE5vdGVQYXRoc10sXG4gICAgICAgIHBhdGhPckZpbGU6IGZvbGRlcixcbiAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICAgICAgcmVzY3VlU3RpbGxVc2VkRmlsZTogdGhpcy5yZXNjdWVTdGlsbFVzZWRGaWxlLmJpbmQodGhpcyksXG4gICAgICAgIC8qXG4gICAgICAgICAqIFRoZSB1c2VyIG5hbWVkIFRISVMgZm9sZGVyLCBzbyBpdCBnb2VzIGV2ZW4gdW5kZXIgYEVtcHR5Rm9sZGVyQmVoYXZpb3IuS2VlcGAgXHUyMDE0IHRoYXQgc2V0dGluZ1xuICAgICAgICAgKiBnb3Zlcm5zIGZvbGRlcnMgZW1wdGllZCBpbmNpZGVudGFsbHksIG5vdCB0aGUgb25lIGV4cGxpY2l0bHkgZGVsZXRlZC4gYGRlbGV0ZUlmTm90VXNlZGAgc3RpbGxcbiAgICAgICAgICogcmVmdXNlcyB0byByZW1vdmUgYW55IGZvbGRlciB3aG9zZSBjaGlsZCBoYWQgdG8gYmUga2VwdCwgd2hpY2ggaXMgdGhlIHByb3RlY3Rpb24gd2FudGVkIGhlcmUuXG4gICAgICAgICAqL1xuICAgICAgICBzaG91bGREZWxldGVFbXB0eUZvbGRlcnM6IHRydWUsXG4gICAgICAgIC8qXG4gICAgICAgICAqIEEgbm90ZSB0aGF0IG90aGVycyBsaW5rIHRvIGlzIGRlbGV0ZWQgYXMgbm9ybWFsOyBPYnNpZGlhbiBsZWF2ZXMgdGhlIGRhbmdsaW5nIGxpbmsuIFByb3RlY3RpbmdcbiAgICAgICAgICogbm90ZXMgdG9vIHdvdWxkIG1ha2UgZGVsZXRpbmcgYSBmb2xkZXIgb2YgbGlua2VkLXRvIG5vdGVzIGltcG9zc2libGUuXG4gICAgICAgICAqL1xuICAgICAgICBzaG91bGRQcm90ZWN0SWZTdGlsbFVzZWQ6IChjYW5kaWRhdGVGaWxlKSA9PiAhKHNldHRpbmdzLmlzTm90ZT8uKGNhbmRpZGF0ZUZpbGUucGF0aCkgPz8gZmFsc2UpXG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5yZXBsYXllZEZvbGRlclBhdGhzLmRlbGV0ZShmb2xkZXIucGF0aCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNjdWVTdGlsbFVzZWRGaWxlKHJlc2N1ZVBhcmFtczogUmVzY3VlU3RpbGxVc2VkRmlsZVBhcmFtcyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBkaWRSZXNjdWVTdGlsbFVzZWRBdHRhY2htZW50KHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgcmVzY3VlUGFyYW1zLFxuICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGEgZGVsZXRpb24gaXMgYSBmb2xkZXIgZGVsZXRpb24gdGhpcyBoYW5kbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBwcm90ZWN0aW5nLlxuICAgKlxuICAgKiBFdmVyeSBjaGVjayBoZXJlIGlzIHN5bmNocm9ub3VzIGFuZCBjaGVhcCwgc28gYSBmaWxlIGRlbGV0aW9uIFx1MjAxNCB0aGUgb3ZlcndoZWxtaW5nIG1ham9yaXR5IFx1MjAxNCBjb3N0cyBvbmVcbiAgICoge0BsaW5rIGlzRm9sZGVyfSBjYWxsIGFuZCByZWFjaGVzIHRoZSBvcmlnaW5hbCB1bnRvdWNoZWQuXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlIC0gVGhlIGFic3RyYWN0IGZpbGUgYmVpbmcgZGVsZXRlZC5cbiAgICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGRlbGV0aW9uIHNob3VsZCBiZSBzY2FubmVkIGJlZm9yZSBpdCBydW5zLlxuICAgKi9cbiAgcHJpdmF0ZSBzaG91bGRDb25zaWRlckZvbGRlcihmaWxlOiBUQWJzdHJhY3RGaWxlKTogZmlsZSBpcyBURm9sZGVyIHtcbiAgICBpZiAoIWlzRm9sZGVyKGZpbGUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuICAgIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zIHx8IChzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4oZmlsZS5wYXRoKSA/PyBmYWxzZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJlcGxheWVkRm9sZGVyUGF0aCBvZiB0aGlzLnJlcGxheWVkRm9sZGVyUGF0aHMpIHtcbiAgICAgIGlmIChpc0NoaWxkT3JTZWxmKHsgYXBwOiB0aGlzLmFwcCwgY2hpbGRQYXRoT3JGaWxlOiBmaWxlLnBhdGgsIHBhcmVudFBhdGhPckZpbGU6IHJlcGxheWVkRm9sZGVyUGF0aCB9KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuY2xhc3MgRmlsZU1hbmFnZXJSdW5Bc3luY0xpbmtVcGRhdGVQYXRjaENvbXBvbmVudCBleHRlbmRzIE1vbmtleUFyb3VuZENvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsZU1hbmFnZXI6IEZpbGVNYW5hZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IEZpbGVNYW5hZ2VyUnVuQXN5bmNMaW5rVXBkYXRlUGF0Y2hDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMuZmlsZU1hbmFnZXIgPSBwYXJhbXMuZmlsZU1hbmFnZXI7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2goe1xuICAgICAgJG9iamVjdDogdGhpcy5maWxlTWFuYWdlcixcbiAgICAgIG1ldGhvZE5hbWU6ICdydW5Bc3luY0xpbmtVcGRhdGUnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoe1xuICAgICAgICBmYWxsYmFjayxcbiAgICAgICAgb3JpZ2luYWxBcmd1bWVudHM6IFtsaW5rVXBkYXRlc0hhbmRsZXJdLFxuICAgICAgICBvcmlnaW5hbE1ldGhvZCxcbiAgICAgICAgb3JpZ2luYWxNZXRob2RCb3VuZFxuICAgICAgfSkgPT4ge1xuICAgICAgICBpZiAoaGFzUGF0Y2hUb2tlbihvcmlnaW5hbE1ldGhvZCwgUEFUQ0hfVE9LRU4pKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdIYW5kbGVyOiBMaW5rVXBkYXRlc0hhbmRsZXIgPSAobGlua1VwZGF0ZXMpID0+IHRoaXMud3JhcExpbmtVcGRhdGVzSGFuZGxlcihsaW5rVXBkYXRlcywgbGlua1VwZGF0ZXNIYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsTWV0aG9kQm91bmQobmV3SGFuZGxlcik7XG4gICAgICB9LFxuICAgICAgLypcbiAgICAgICAqIFN1cHByZXNzaW5nIE9ic2lkaWFuJ3Mgb3duIGxpbmsgdXBkYXRlcyBpcyBOT1QgaWRlbXBvdGVudCwgc28gdHdvIGxpdmUgY29waWVzIG9mIHRoaXMgY29tcG9uZW50XG4gICAgICAgKiB3b3VsZCBmaWdodCBvdmVyIHRoZSBzYW1lIG1ldGhvZC4gYFBBVENIX1RPS0VOYCBpcyBhIGBTeW1ib2wuZm9yYCBhbmQgdGhlIHRva2VuIHJlZ2lzdHJ5IGlzXG4gICAgICAgKiBgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlYC1iYWNrZWQsIHNvIHRoZSBhcmJpdHJhdGlvbiBzcGFucyBpbmRlcGVuZGVudGx5IGJ1bmRsZWQgY29waWVzIG9mIHRoaXNcbiAgICAgICAqIGxpYnJhcnk6IHRoZSBmaXJzdCBwYXRjaGVyIHN0YXlzIGxpdmUsIGEgY29weSB0aGF0IHBhdGNoZXMgYWZ0ZXJ3YXJkcyBzZWVzIHRoZSB0b2tlbiBvbiBpdHMgb3duXG4gICAgICAgKiBgb3JpZ2luYWxNZXRob2RgIGFuZCBkZWZlcnMgdmlhIHRoZSBndWFyZCBhYm92ZSwgYW5kIGl0IHRha2VzIG92ZXIgb24gaXRzIG5leHQgY2FsbCBvbmNlIHRoZVxuICAgICAgICogbGVhZGVyIHVubG9hZHMgYW5kIHRoZSB0b2tlbiBpcyBkcm9wcGVkLlxuICAgICAgICpcbiAgICAgICAqIFRoaXMgYXJiaXRyYXRlcyB0aGUgUEFUQ0ggb25seS4gVGhlIGNvbXBvbmVudCdzIGB2YXVsdC5vbigncmVuYW1lJyB8ICdkZWxldGUnKWAgYW5kXG4gICAgICAgKiBgbWV0YWRhdGFDYWNoZS5vbignZGVsZXRlZCcpYCBsaXN0ZW5lcnMgaGF2ZSBubyBlcXVpdmFsZW50IGd1YXJkIFx1MjAxNCB0aGUgcGx1Z2luLXJlZ2lzdHJ5IGVsZWN0aW9uXG4gICAgICAgKiB0aGF0IHVzZWQgdG8gcHJvdmlkZSBvbmUgd2VudCB3aXRoIHRoZSBtdWx0aS1wbHVnaW4gbWFjaGluZXJ5IFx1MjAxNCBzbyB0d28gbGl2ZSBjb3BpZXMgd291bGQgYm90aFxuICAgICAgICogaGFuZGxlIGFuIGV2ZW50LiBXaXRoIG9uZSBvd25lciB0aGF0IGNhbm5vdCBhcmlzZTsgYSBjb25zdW1lciB0aGF0IG11c3QgZ3VhcmFudGVlIGl0IHJlZnVzZXMgdG9cbiAgICAgICAqIGxvYWQgYmVzaWRlIGEgY29uZmxpY3RpbmcgdmVyc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBUaGF0IHJlZnVzYWwgdXNlZCB0byBiZSBkZXNjcmliZWQgaGVyZSBhcyBcImEgcGx1Z2luJ3Mgam9iIHJhdGhlciB0aGFuIGEgbGlicmFyeSdzXCIsIHdoaWNoIGlzIG5vXG4gICAgICAgKiBsb25nZXIgdHJ1ZSBcdTIwMTQgYFBsdWdpbkJhc2UuZ2V0UGx1Z2luRGVwZW5kZW5jaWVzYCBpcyB3aGVyZSBhIGNvbnN1bWVyIGRlY2xhcmVzIGl0LCBhbmQgdGhlXG4gICAgICAgKiBgYXBpVmVyc2lvblJhbmdlYCBpdCBuYW1lcyBpcyBleGFjdGx5IHRoZSBjb25mbGljdGluZy12ZXJzaW9uIGd1YXJkLiBUaGUgbGlicmFyeSBvd25zIHRoZVxuICAgICAgICogbWVjaGFuaXNtOyB0aGUgcGx1Z2luIHN0aWxsIG93bnMgdGhlIGRlY2lzaW9uIHRvIHVzZSBpdC5cbiAgICAgICAqL1xuICAgICAgcGF0Y2hUb2tlbjogUEFUQ0hfVE9LRU5cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd3JhcExpbmtVcGRhdGVzSGFuZGxlcihsaW5rVXBkYXRlczogTGlua1VwZGF0ZVtdLCBsaW5rVXBkYXRlc0hhbmRsZXI6IExpbmtVcGRhdGVzSGFuZGxlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBpc1JlbmFtZUNhbGxlZCA9IGZhbHNlO1xuICAgIGxldCBpc0ZvcmVpZ25Mb2NrZWRSZW5hbWVDYWxsZWQgPSBmYWxzZTtcbiAgICBjb25zdCBldmVudFJlZiA9IHRoaXMuYXBwLnZhdWx0Lm9uKCdyZW5hbWUnLCAoZmlsZSwgb2xkUGF0aCkgPT4ge1xuICAgICAgaXNSZW5hbWVDYWxsZWQgPSB0cnVlO1xuICAgICAgLypcbiAgICAgICAqIEEgcmVuYW1lIHBlcmZvcm1lZCBpbnNpZGUgYSBmb3JlaWduIHBsdWdpbidzIGluLWZsaWdodCBsb2NrZWQgdHJhbnNhY3Rpb24gKHdoaWNoIGxvY2tzIHRoZVxuICAgICAgICogYWZmZWN0ZWQgZm9sZGVyIHN1YnRyZWUsIGUuZy4gQWR2YW5jZWQgTm90ZSBDb21wb3NlcidzIGZvbGRlciBtZXJnZSkgaXMgb3duZWQgYnkgdGhhdFxuICAgICAgICogdHJhbnNhY3Rpb24sIHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvciBpdHMgb3duIGxpbmsgY29uc2lzdGVuY3kuIFRoaXMgaGFuZGxlciBkZWxpYmVyYXRlbHkgZG9lc1xuICAgICAgICogTk9UIHJld3JpdGUgbGlua3MgZm9yIGl0LCBzbyBzdXBwcmVzc2luZyBPYnNpZGlhbidzIG5hdGl2ZSBsaW5rIHVwZGF0ZSBiZWxvdyB3b3VsZCBsZWF2ZSB0aGVcbiAgICAgICAqIGxpbmtzIGRhbmdsaW5nLiBMZXQgdGhlIG5hdGl2ZSB1cGRhdGUgcHJvY2VlZCB1bnRvdWNoZWQuIFNlZVxuICAgICAgICogaHR0cHM6Ly9naXRodWIuY29tL21uYW91bW92L29ic2lkaWFuLWFkdmFuY2VkLW5vdGUtY29tcG9zZXIvaXNzdWVzLzE0Ni5cbiAgICAgICAqL1xuICAgICAgaWYgKGlzUmVzb3VyY2VMb2NrZWRGb3JQYXRoQnlBbmNlc3Rvcih0aGlzLmFwcCwgZmlsZS5wYXRoKSB8fCBpc1Jlc291cmNlTG9ja2VkRm9yUGF0aEJ5QW5jZXN0b3IodGhpcy5hcHAsIG9sZFBhdGgpKSB7XG4gICAgICAgIGlzRm9yZWlnbkxvY2tlZFJlbmFtZUNhbGxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGxpbmtVcGRhdGVzSGFuZGxlcihsaW5rVXBkYXRlcyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuYXBwLnZhdWx0Lm9mZnJlZihldmVudFJlZik7XG4gICAgfVxuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBJdCBtaWdodCBjaGFuZ2VkIGluIGByZW5hbWVgIGV2ZW50IGhhbmRsZXIuIEVTTGludCBtaXN0YWtlbmx5IGRvZXMgbm90IHJlY29nbml6ZSBpdC5cbiAgICBpZiAoIWlzUmVuYW1lQ2FsbGVkIHx8ICFzZXR0aW5ncy5zaG91bGRIYW5kbGVSZW5hbWVzIHx8IGlzRm9yZWlnbkxvY2tlZFJlbmFtZUNhbGxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZpbHRlckluUGxhY2UoXG4gICAgICBsaW5rVXBkYXRlcyxcbiAgICAgIChsaW5rVXBkYXRlKSA9PiB7XG4gICAgICAgIGlmIChzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4obGlua1VwZGF0ZS5zb3VyY2VGaWxlLnBhdGgpKSB7XG4gICAgICAgICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpydW5Bc3luY0xpbmtVcGRhdGUnKShcbiAgICAgICAgICAgIGBSb2xsIGJhY2sgdG8gZGVmYXVsdCBsaW5rIHVwZGF0ZSBvZiBzb3VyY2UgZmlsZSAke2xpbmtVcGRhdGUuc291cmNlRmlsZS5wYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihsaW5rVXBkYXRlLnJlc29sdmVkRmlsZS5wYXRoKSkge1xuICAgICAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6cnVuQXN5bmNMaW5rVXBkYXRlJykoXG4gICAgICAgICAgICBgUm9sbCBiYWNrIHRvIGRlZmF1bHQgbGluayB1cGRhdGUgb2YgcmVzb2x2ZWQgZmlsZSAke2xpbmtVcGRhdGUucmVzb2x2ZWRGaWxlLnBhdGh9IGFzIHRoZSBwYXRoIGlzIGlnbm9yZWQuYFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5hcHAuaW50ZXJuYWxQbHVnaW5zLmdldEVuYWJsZWRQbHVnaW5CeUlkKEludGVybmFsUGx1Z2luTmFtZS5DYW52YXMpICE9PSBudWxsICYmICFoYXNCYWNrbGlua0NhY2hlUGx1Z2luKHRoaXMuYXBwKVxuICAgICAgICAgICYmIChsaW5rVXBkYXRlLnNvdXJjZUZpbGUuZXh0ZW5zaW9uID09PSBDQU5WQVNfRklMRV9FWFRFTlNJT04gfHwgbGlua1VwZGF0ZS5yZXNvbHZlZEZpbGUuZXh0ZW5zaW9uID09PSBDQU5WQVNfRklMRV9FWFRFTlNJT04pO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cblxuY2xhc3MgSGFuZGxlZFJlbmFtZXMge1xuICBwcml2YXRlIHJlYWRvbmx5IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBIYW5kbGVkUmVuYW1lS2V5PigpO1xuXG4gIHB1YmxpYyBhZGQob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1hcC5zZXQodGhpcy5rZXlUb1N0cmluZyhvbGRQYXRoLCBuZXdQYXRoKSwgeyBuZXdQYXRoLCBvbGRQYXRoIH0pO1xuICB9XG5cbiAgcHVibGljIGRlbGV0ZShvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubWFwLmRlbGV0ZSh0aGlzLmtleVRvU3RyaW5nKG9sZFBhdGgsIG5ld1BhdGgpKTtcbiAgfVxuXG4gIHB1YmxpYyBoYXMob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tYXAuaGFzKHRoaXMua2V5VG9TdHJpbmcob2xkUGF0aCwgbmV3UGF0aCkpO1xuICB9XG5cbiAgcHVibGljIGtleXMoKTogSXRlcmFibGVJdGVyYXRvcjxIYW5kbGVkUmVuYW1lS2V5PiB7XG4gICAgcmV0dXJuIHRoaXMubWFwLnZhbHVlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBrZXlUb1N0cmluZyhvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke29sZFBhdGh9IC0+ICR7bmV3UGF0aH1gO1xuICB9XG59XG5cbmNsYXNzIE1ldGFkYXRhRGVsZXRlZEhhbmRsZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwOiBNYXA8c3RyaW5nLCBDYWNoZWRNZXRhZGF0YT47XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsZTogVEFic3RyYWN0RmlsZTtcbiAgcHJpdmF0ZSByZWFkb25seSBwcmV2aW91c0NhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogTWV0YWRhdGFEZWxldGVkSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcCA9IHBhcmFtcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcDtcbiAgICB0aGlzLmZpbGUgPSBwYXJhbXMuZmlsZTtcbiAgICB0aGlzLnByZXZpb3VzQ2FjaGUgPSBwYXJhbXMucHJldmlvdXNDYWNoZTtcbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlciA9IHBhcmFtcy5zZXR0aW5nc01hbmFnZXI7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlKCk6IHZvaWQge1xuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcblxuICAgIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/Lih0aGlzLmZpbGUucGF0aCkpIHtcbiAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlTWV0YWRhdGFEZWxldGVkJykoYFNraXBwaW5nIG1ldGFkYXRhIGRlbGV0ZSBoYW5kbGVyIG9mICR7dGhpcy5maWxlLnBhdGh9IGFzIHRoZSBwYXRoIGlzIGlnbm9yZWQuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzTWFya2Rvd25GaWxlKHRoaXMuZmlsZSkgJiYgdGhpcy5wcmV2aW91c0NhY2hlKSB7XG4gICAgICB0aGlzLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwLnNldCh0aGlzLmZpbGUucGF0aCwgdGhpcy5wcmV2aW91c0NhY2hlKTtcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgUmVuYW1lSGFuZGxlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuICBwcml2YXRlIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZWRSZW5hbWVzOiBIYW5kbGVkUmVuYW1lcztcbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PjtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcnJ1cHRlZFJlbmFtZXNNYXA6IE1hcDxzdHJpbmcsIEludGVycnVwdGVkUmVuYW1lW10+O1xuICBwcml2YXRlIHJlYWRvbmx5IGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyOiBMaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciB8IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgbmV3UGF0aDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG9sZENhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkUGF0aDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG9sZFBhdGhCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPjtcbiAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSByZXNvdXJjZUxvY2tDb21wb25lbnQ6IG51bGwgfCBSZXNvdXJjZUxvY2tDb21wb25lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUmVuYW1lSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgdGhpcy5hYm9ydFNpZ25hbCA9IHBhcmFtcy5hYm9ydFNpZ25hbDtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5yZXNvdXJjZUxvY2tDb21wb25lbnQgPSBwYXJhbXMucmVzb3VyY2VMb2NrQ29tcG9uZW50O1xuICAgIHRoaXMuaGFuZGxlZFJlbmFtZXMgPSBwYXJhbXMuaGFuZGxlZFJlbmFtZXM7XG4gICAgdGhpcy5pbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwID0gcGFyYW1zLmludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXAgPz8gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+KCk7XG4gICAgdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAgPSBwYXJhbXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwO1xuICAgIHRoaXMubGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIgPSBwYXJhbXMubGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI7XG4gICAgdGhpcy5uZXdQYXRoID0gcGFyYW1zLm5ld1BhdGg7XG4gICAgdGhpcy5vbGRDYWNoZSA9IHBhcmFtcy5vbGRDYWNoZTtcbiAgICB0aGlzLm9sZFBhdGggPSBwYXJhbXMub2xkUGF0aDtcbiAgICB0aGlzLm9sZFBhdGhCYWNrbGlua3NNYXAgPSBwYXJhbXMub2xkUGF0aEJhY2tsaW5rc01hcDtcbiAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCA9IHBhcmFtcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGhhbmRsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5vbGRQYXRoID09PSB0aGlzLm5ld1BhdGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgLypcbiAgICAgKiBUaGUgcmVuYW1lIHRoYXQgdHJpZ2dlcmVkIHRoaXMgaGFuZGxlciBpcyB2ZXJ5IGxpa2VseSBzdGlsbCBpbnNpZGUgT2JzaWRpYW4ncyBvd25cbiAgICAgKiBgRmlsZU1hbmFnZXIucnVuQXN5bmNMaW5rVXBkYXRlYCBjeWNsZSwgd2hpY2ggaXMgYWJvdXQgdG8gZGVjaWRlIFx1MjAxNCBzeW5jaHJvbm91c2x5IFx1MjAxNCB3aGljaCBsaW5rcyB0b1xuICAgICAqIHJld3JpdGUsIGJ5IHJlLXJlc29sdmluZyBlYWNoIG9uZS4gRXZlcnl0aGluZyBiZWxvdyB0ZW1wb3JhcmlseSByZWdpc3RlcnMgYSBwaGFudG9tIGZpbGUgYXQgdGhlXG4gICAgICogb2xkIHBhdGggKGByZWdpc3RlckZpbGVzYCwgZGlyZWN0bHkgaGVyZSBhbmQgaW5zaWRlIGBSZW5hbWVNYXBgKSBhbmQgaG9sZHMgaXQgYWNyb3NzIGFuIGBhd2FpdGA7XG4gICAgICogc2VlbiBtaWQtZGVjaXNpb24sIHRoYXQgcGhhbnRvbSBtYWtlcyB0aGUgb2xkIHBhdGggc3RpbGwgcmVzb2x2ZSwgc28gT2JzaWRpYW4gY29uY2x1ZGVzIG5vdGhpbmdcbiAgICAgKiBjaGFuZ2VkIGFuZCByZXdyaXRlcyBub3RoaW5nLiBTdGFuZGluZyBpbnZhcmlhbnQ6IG5ldmVyIHRvdWNoIHRoZSB2YXVsdCBpbmRleCB3aGlsZSBPYnNpZGlhbiBpc1xuICAgICAqIG1pZC1kZWNpc2lvbi4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tbmFvdW1vdi9vYnNpZGlhbi1jdXN0b20tYXR0YWNobWVudC1sb2NhdGlvbi9pc3N1ZXMvNDcuXG4gICAgICovXG4gICAgYXdhaXQgd2FpdEZvclBlbmRpbmdMaW5rVXBkYXRlcyh0aGlzLmFwcCk7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgYXdhaXQgdGhpcy5jb250aW51ZUludGVycnVwdGVkUmVuYW1lcygpO1xuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIC8vIFRoZSByZWZyZXNoZWQgYmFja2xpbmtzIGZlZWQgYG9sZFBhdGhCYWNrbGlua3NNYXBgLCB3aGljaCBvbmx5IHRoZSBsaW5rLXJld3JpdGUgc3RlcHMgYmVsb3cgcmVhZCwgYW5kIHRob3NlIGFyZSBnYXRlZCBvbiB0aGUgc2FtZSBmbGFnLlxuICAgIGlmICh0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpLnNob3VsZEhhbmRsZVJlbmFtZXMpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVmcmVzaExpbmtzKCk7XG4gICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgfVxuXG4gICAgaWYgKGF3YWl0IHRoaXMuaGFuZGxlQ2FzZUNvbGxpc2lvbigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgY29uc3QgcGx1Z2luTm90aWNlQ29tcG9uZW50ID0gdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG5cbiAgICBjb25zdCByZW5hbWVkRmlsZVBhdGhzID0gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlKCdyZW5hbWVkRmlsZVBhdGhzJywgbmV3IFNldDxzdHJpbmc+KCkpLnZhbHVlO1xuICAgIGNvbnN0IHJlbmFtZWRMaW5rcyA9IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSgncmVuYW1lZExpbmtQYXRocycsIG5ldyBTZXQ8c3RyaW5nPigpKS52YWx1ZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZW5hbWVNYXAgPSBuZXcgUmVuYW1lTWFwKHtcbiAgICAgICAgYWJvcnRTaWduYWw6IHRoaXMuYWJvcnRTaWduYWwsXG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIG5ld1BhdGg6IHRoaXMubmV3UGF0aCxcbiAgICAgICAgb2xkQ2FjaGU6IHRoaXMub2xkQ2FjaGUsXG4gICAgICAgIG9sZFBhdGg6IHRoaXMub2xkUGF0aCxcbiAgICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgICAgfSk7XG4gICAgICBhd2FpdCByZW5hbWVNYXAuZmlsbCgpO1xuICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG5cbiAgICAgIGNvbnN0IGNvbWJpbmVkQmFja2xpbmtzTWFwID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+KCk7XG5cbiAgICAgIC8vIEJhY2tsaW5rcyBhcmUgb25seSBjb25zdW1lZCBieSB0aGUgbGluay1yZXdyaXRlIHN0ZXBzIGJlbG93LCB3aGljaCBhcmUgZ2F0ZWQgb25cbiAgICAgIC8vIGBzaG91bGRIYW5kbGVSZW5hbWVzYC4gU2tpcCBnYXRoZXJpbmcgdGhlbSAoYSBiYWNrbGluayBmZXRjaCBwZXIgYXR0YWNobWVudCkgb24gYSBtb3ZlLW9ubHkgcmVuYW1lLlxuICAgICAgaWYgKHNldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXMpIHtcbiAgICAgICAgcmVuYW1lTWFwLmluaXRPcmlnaW5hbExpbmtzTWFwKGNvbWJpbmVkQmFja2xpbmtzTWFwKTtcbiAgICAgICAgcmVuYW1lTWFwLmluaXRCYWNrbGlua3NNYXAoe1xuICAgICAgICAgIGNvbWJpbmVkQmFja2xpbmtzTWFwLFxuICAgICAgICAgIHBhdGg6IHRoaXMub2xkUGF0aCxcbiAgICAgICAgICBzaW5nbGVCYWNrbGlua3NNYXA6IHRoaXMub2xkUGF0aEJhY2tsaW5rc01hcFxuICAgICAgICB9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IGF0dGFjaG1lbnRPbGRQYXRoIG9mIHJlbmFtZU1hcC5rZXlzKCkpIHtcbiAgICAgICAgICBpZiAoYXR0YWNobWVudE9sZFBhdGggPT09IHRoaXMub2xkUGF0aCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnRPbGRQYXRoQmFja2xpbmtzID0gYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiBhdHRhY2htZW50T2xkUGF0aCB9KTtcbiAgICAgICAgICBjb25zdCBhdHRhY2htZW50T2xkUGF0aEJhY2tsaW5rc01hcCA9IGF0dGFjaG1lbnRPbGRQYXRoQmFja2xpbmtzLmRhdGE7XG4gICAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICAgIHJlbmFtZU1hcC5pbml0QmFja2xpbmtzTWFwKHtcbiAgICAgICAgICAgIGNvbWJpbmVkQmFja2xpbmtzTWFwLFxuICAgICAgICAgICAgcGF0aDogYXR0YWNobWVudE9sZFBhdGgsXG4gICAgICAgICAgICBzaW5nbGVCYWNrbGlua3NNYXA6IGF0dGFjaG1lbnRPbGRQYXRoQmFja2xpbmtzTWFwXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyZW50Rm9sZGVyUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgICAgZm9yIChjb25zdCBbb2xkQXR0YWNobWVudFBhdGgsIG5ld0F0dGFjaG1lbnRQYXRoXSBvZiByZW5hbWVNYXAuZW50cmllcygpKSB7XG4gICAgICAgIGlmIChvbGRBdHRhY2htZW50UGF0aCAhPT0gdGhpcy5vbGRQYXRoKSB7XG4gICAgICAgICAgY29uc3QgZml4ZWROZXdBdHRhY2htZW50UGF0aCA9IGF3YWl0IHRoaXMucmVuYW1lSGFuZGxlZChvbGRBdHRhY2htZW50UGF0aCwgbmV3QXR0YWNobWVudFBhdGgpO1xuICAgICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgICByZW5hbWVNYXAuc2V0KG9sZEF0dGFjaG1lbnRQYXRoLCBmaXhlZE5ld0F0dGFjaG1lbnRQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZ3NNYW5hZ2VyLmlzTm90ZUV4KG9sZEF0dGFjaG1lbnRQYXRoKSkge1xuICAgICAgICAgIHBhcmVudEZvbGRlclBhdGhzLmFkZChkaXJuYW1lKG9sZEF0dGFjaG1lbnRQYXRoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXdhaXQgY2xlYW51cEVtcHR5Rm9sZGVycyh7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGVtcHR5Rm9sZGVyQmVoYXZpb3I6IHNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgPz8gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwLFxuICAgICAgICBmb2xkZXJQYXRoczogWy4uLnBhcmVudEZvbGRlclBhdGhzXVxuICAgICAgfSk7XG4gICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICAgIC8qXG4gICAgICAgKiBUaGUgYXR0YWNobWVudCBtb3ZlIGFib3ZlIHJ1bnMgcmVnYXJkbGVzcyBvZiBgc2hvdWxkSGFuZGxlUmVuYW1lc2AgKHRoYXQgaXMgdGhlIHBvaW50IG9mIGRlY291cGxpbmdcbiAgICAgICAqIFwiTW92ZSBhdHRhY2htZW50cyB3aXRoIG5vdGVcIiBmcm9tIFwiVXBkYXRlIGxpbmtzXCIpLiBUaGUgcmVtYWluaW5nIHN0ZXBzIG9ubHkgcmV3cml0ZSBsaW5rcywgc28gc2tpcFxuICAgICAgICogdGhlbSB3aGVuIGxpbmsgdXBkYXRlcyBhcmUgZGlzYWJsZWQ7IHRoZSBgZmluYWxseWAgYmxvY2sgYmVsb3cgc3RpbGwgcnVucy5cbiAgICAgICAqL1xuICAgICAgaWYgKCFzZXR0aW5ncy5zaG91bGRIYW5kbGVSZW5hbWVzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLypcbiAgICAgICAqIEEgcmVzdW1lZCByZW5hbWUgYnJpbmdzIGl0cyBvd24gc25hcHNob3QgYWxvbmcuIE1lcmdlIGl0IElOVE8gdGhlIGN1cnJlbnQgb25lIHJhdGhlciB0aGFuXG4gICAgICAgKiBjb25jYXRlbmF0aW5nIHRoZSB0d286IGEgZmlsZSBuYW1lZCBieSBib3RoIHdvdWxkIG90aGVyd2lzZSBiZSBvcGVuZWQgYW5kIHJld3JpdHRlbiB0d2ljZSwgd2hpY2ggaXNcbiAgICAgICAqIHRoZSB2ZXJ5IHRoaW5nIGEgY29tYmluZWQgc25hcHNob3QgZXhpc3RzIHRvIGF2b2lkLiBUaGUgY3VycmVudCByZW5hbWUncyBlbnRyeSB3aW5zIGEga2V5IGNvbGxpc2lvbixcbiAgICAgICAqIGJlY2F1c2UgaXQgZGVzY3JpYmVzIHdoZXJlIHRoZSB0YXJnZXQgaXMgbm93LlxuICAgICAgICovXG4gICAgICBmb3IgKGNvbnN0IFtpbnRlcnJ1cHRlZEJhY2tsaW5rUGF0aCwgaW50ZXJydXB0ZWRMaW5rS2V5VG9QYXRoTWFwXSBvZiB0aGlzLmludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXApIHtcbiAgICAgICAgY29uc3QgbGlua0tleVRvUGF0aE1hcCA9IGNvbWJpbmVkQmFja2xpbmtzTWFwLmdldChpbnRlcnJ1cHRlZEJhY2tsaW5rUGF0aCk7XG4gICAgICAgIGlmICghbGlua0tleVRvUGF0aE1hcCkge1xuICAgICAgICAgIGNvbWJpbmVkQmFja2xpbmtzTWFwLnNldChpbnRlcnJ1cHRlZEJhY2tsaW5rUGF0aCwgaW50ZXJydXB0ZWRMaW5rS2V5VG9QYXRoTWFwKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgW2xpbmtLZXksIG9sZFRhcmdldFBhdGhdIG9mIGludGVycnVwdGVkTGlua0tleVRvUGF0aE1hcCkge1xuICAgICAgICAgIGlmICghbGlua0tleVRvUGF0aE1hcC5oYXMobGlua0tleSkpIHtcbiAgICAgICAgICAgIGxpbmtLZXlUb1BhdGhNYXAuc2V0KGxpbmtLZXksIG9sZFRhcmdldFBhdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBsaW5rSW5kZXhlcyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgICBhd2FpdCBlZGl0QmFja2xpbmtzU25hcHNob3Qobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEVkaXRCYWNrbGlua3NTbmFwc2hvdFBhcmFtczxzdHJpbmc+Pih7XG4gICAgICAgIGFib3J0U2lnbmFsOiB0aGlzLmFib3J0U2lnbmFsLFxuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBsaW5rQ29udmVydGVyOiAoeyBsaW5rLCBwYXlsb2FkOiBvbGRBdHRhY2htZW50UGF0aCwgc291cmNlUGF0aDogbmV3QmFja2xpbmtQYXRoIH0pID0+IHtcbiAgICAgICAgICBjb25zdCBsaW5rSW5kZXggPSAobGlua0luZGV4ZXMuZ2V0KG5ld0JhY2tsaW5rUGF0aCkgPz8gMCkgKyAxO1xuICAgICAgICAgIGxpbmtJbmRleGVzLnNldChuZXdCYWNrbGlua1BhdGgsIGxpbmtJbmRleCk7XG5cbiAgICAgICAgICBpZiAoIW9sZEF0dGFjaG1lbnRQYXRoKSB7XG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgICogQSBsaW5rIHRoYXQgaXMgbm90IGluIHRoZSBzbmFwc2hvdCB3YXMgZWl0aGVyIG5ldmVyIG91cnMgdG8gcmV3cml0ZSwgb3Igd2FzIGFscmVhZHlcbiAgICAgICAgICAgICAqIHJld3JpdHRlbiBieSBzb21lb25lIGVsc2UgKGxlYXZpbmcgaXQgY29ycmVjdCkuIEVpdGhlciB3YXkgdGhlcmUgaXMgbm90aGluZyB0byBkbyAtXG4gICAgICAgICAgICAgKiBidXQgbG9nIGl0LCBiZWNhdXNlIGEgc2lsZW50IHNraXAgaGVyZSBpcyBleGFjdGx5IGhvd1xuICAgICAgICAgICAgICogaHR0cHM6Ly9naXRodWIuY29tL21uYW91bW92L29ic2lkaWFuLWN1c3RvbS1hdHRhY2htZW50LWxvY2F0aW9uL2lzc3Vlcy82MCBzdGF5ZWRcbiAgICAgICAgICAgICAqIGludmlzaWJsZTogZXZlcnkgc2tpcHBlZCBsaW5rIGxlZnQgYSBicm9rZW4gZW1iZWQgYW5kIHJlcG9ydGVkIG5vdGhpbmcuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6dXBkYXRlQmFja2xpbmtzJykoXG4gICAgICAgICAgICAgIGBObyBzbmFwc2hvdCBlbnRyeSBmb3IgbGluayAke3RvSnNvbihsaW5rKX0gaW4gJHtuZXdCYWNrbGlua1BhdGh9OyBsZWF2aW5nIGl0IHVuY2hhbmdlZC5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IG5ld0F0dGFjaG1lbnRQYXRoID0gcmVuYW1lTWFwLmdldChvbGRBdHRhY2htZW50UGF0aCkgPz8gb2xkQXR0YWNobWVudFBhdGg7XG5cbiAgICAgICAgICByZW5hbWVkRmlsZVBhdGhzLmFkZChuZXdCYWNrbGlua1BhdGgpO1xuICAgICAgICAgIHJlbmFtZWRMaW5rcy5hZGQoYCR7bmV3QmFja2xpbmtQYXRofS8vJHtTdHJpbmcobGlua0luZGV4KX1gKTtcblxuICAgICAgICAgIHJldHVybiB1cGRhdGVMaW5rKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxVcGRhdGVMaW5rUGFyYW1zPih7XG4gICAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgICAgbGluayxcbiAgICAgICAgICAgIG5ld1NvdXJjZVBhdGhPckZpbGU6IG5ld0JhY2tsaW5rUGF0aCxcbiAgICAgICAgICAgIG5ld1RhcmdldFBhdGhPckZpbGU6IG5ld0F0dGFjaG1lbnRQYXRoLFxuICAgICAgICAgICAgb2xkVGFyZ2V0UGF0aE9yRmlsZTogb2xkQXR0YWNobWVudFBhdGgsXG4gICAgICAgICAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzOiBzZXR0aW5ncy5zaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzZXNcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH0sXG4gICAgICAgIGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyOiB0aGlzLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyID8/IHVuZGVmaW5lZCxcbiAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgICByZXNvdXJjZUxvY2tDb21wb25lbnQ6IHRoaXMucmVzb3VyY2VMb2NrQ29tcG9uZW50LFxuICAgICAgICBzaG91bGRGYWlsT25NaXNzaW5nRmlsZTogZmFsc2UsXG4gICAgICAgIC8vIFRoZSBjb252ZXJ0ZXIgbG9ncyBldmVyeSBsaW5rIGl0IGRlY2xpbmVzLCBzbyBpdCBoYXMgdG8gYmUgc2hvd24gdGhlIG9uZXMgdGhlIHNuYXBzaG90IGRvZXMgbm90IG5hbWUuXG4gICAgICAgIHNob3VsZFZpc2l0VW5tYXRjaGVkTGlua3M6IHRydWUsXG4gICAgICAgIHNuYXBzaG90OiBjb21iaW5lZEJhY2tsaW5rc01hcFxuICAgICAgfSkpO1xuICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgICBpZiAoaXNOb3RlKHRoaXMubmV3UGF0aCkpIHtcbiAgICAgICAgYXdhaXQgdXBkYXRlTGlua3NJbkZpbGUobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFVwZGF0ZUxpbmtzSW5GaWxlUGFyYW1zPih7XG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlOiB0aGlzLm5ld1BhdGgsXG4gICAgICAgICAgb2xkU291cmNlUGF0aE9yRmlsZTogdGhpcy5vbGRQYXRoLFxuICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICAgICAgICByZXNvdXJjZUxvY2tDb21wb25lbnQ6IHRoaXMucmVzb3VyY2VMb2NrQ29tcG9uZW50LFxuICAgICAgICAgIHNob3VsZEZhaWxPbk1pc3NpbmdGaWxlOiBmYWxzZSxcbiAgICAgICAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzOiBzZXR0aW5ncy5zaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzZXNcbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZ2V0RmlsZU9yTnVsbCh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IHRoaXMubmV3UGF0aCB9KSkge1xuICAgICAgICBsZXQgaW50ZXJydXB0ZWRSZW5hbWVzID0gdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAuZ2V0KHRoaXMubmV3UGF0aCk7XG4gICAgICAgIGlmICghaW50ZXJydXB0ZWRSZW5hbWVzKSB7XG4gICAgICAgICAgaW50ZXJydXB0ZWRSZW5hbWVzID0gW107XG4gICAgICAgICAgdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAuc2V0KHRoaXMubmV3UGF0aCwgaW50ZXJydXB0ZWRSZW5hbWVzKTtcbiAgICAgICAgfVxuICAgICAgICBpbnRlcnJ1cHRlZFJlbmFtZXMucHVzaCh7XG4gICAgICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICAgICAgb2xkUGF0aDogdGhpcy5vbGRQYXRoXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBjb25zdCBvcnBoYW5LZXlzID0gWy4uLnRoaXMuaGFuZGxlZFJlbmFtZXMua2V5cygpXTtcbiAgICAgIGFkZFRvUXVldWUoe1xuICAgICAgICBhYm9ydFNpZ25hbDogdGhpcy5hYm9ydFNpZ25hbCxcbiAgICAgICAgb3BlcmF0aW9uRnVuY3Rpb246ICgpID0+IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IG9ycGhhbktleSBvZiBvcnBoYW5LZXlzKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZWRSZW5hbWVzLmRlbGV0ZShvcnBoYW5LZXkub2xkUGF0aCwgb3JwaGFuS2V5Lm5ld1BhdGgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChyZW5hbWVkTGlua3Muc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZSh0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMucmVuYW1lRGVsZXRlSGFuZGxlci51cGRhdGVkTGlua3MsIHsgZmlsZXNDb3VudDogcmVuYW1lZEZpbGVQYXRocy5zaXplLCBsaW5rc0NvdW50OiByZW5hbWVkTGlua3Muc2l6ZSB9KSk7XG4gICAgICAgICAgcmVuYW1lZEZpbGVQYXRocy5jbGVhcigpO1xuICAgICAgICAgIHJlbmFtZWRMaW5rcy5jbGVhcigpO1xuICAgICAgICB9LFxuICAgICAgICBvcGVyYXRpb25OYW1lOiB0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMucmVuYW1lRGVsZXRlSGFuZGxlci5oYW5kbGVPcnBoYW5lZFJlbmFtZXMpXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbnRpbnVlSW50ZXJydXB0ZWRSZW5hbWVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGludGVycnVwdGVkUmVuYW1lcyA9IHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwLmdldCh0aGlzLm9sZFBhdGgpO1xuICAgIGlmICghaW50ZXJydXB0ZWRSZW5hbWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAuZGVsZXRlKHRoaXMub2xkUGF0aCk7XG4gICAgZm9yIChjb25zdCBpbnRlcnJ1cHRlZFJlbmFtZSBvZiBpbnRlcnJ1cHRlZFJlbmFtZXMpIHtcbiAgICAgIGF3YWl0IG5ldyBSZW5hbWVIYW5kbGVyKHtcbiAgICAgICAgYWJvcnRTaWduYWw6IHRoaXMuYWJvcnRTaWduYWwsXG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGhhbmRsZWRSZW5hbWVzOiB0aGlzLmhhbmRsZWRSZW5hbWVzLFxuICAgICAgICBpbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwOiBpbnRlcnJ1cHRlZFJlbmFtZS5jb21iaW5lZEJhY2tsaW5rc01hcCxcbiAgICAgICAgaW50ZXJydXB0ZWRSZW5hbWVzTWFwOiB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcCxcbiAgICAgICAgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI6IHRoaXMubGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIsXG4gICAgICAgIG5ld1BhdGg6IHRoaXMubmV3UGF0aCxcbiAgICAgICAgb2xkQ2FjaGU6IHRoaXMub2xkQ2FjaGUsXG4gICAgICAgIG9sZFBhdGg6IGludGVycnVwdGVkUmVuYW1lLm9sZFBhdGgsXG4gICAgICAgIG9sZFBhdGhCYWNrbGlua3NNYXA6IHRoaXMub2xkUGF0aEJhY2tsaW5rc01hcCxcbiAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICAgICAgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCxcbiAgICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgICAgfSkuaGFuZGxlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVDYXNlQ29sbGlzaW9uKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghZ2V0RGF0YUFkYXB0ZXJFeCh0aGlzLmFwcCkuaW5zZW5zaXRpdmUgfHwgdGhpcy5vbGRQYXRoLnRvTG93ZXJDYXNlKCkgIT09IHRoaXMubmV3UGF0aC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgdGVtcG9yYXJ5UGF0aCA9IGpvaW4oZGlybmFtZSh0aGlzLm5ld1BhdGgpLCBgX190ZW1wX18ke2Jhc2VuYW1lKHRoaXMubmV3UGF0aCl9YCk7XG4gICAgYXdhaXQgdGhpcy5yZW5hbWVIYW5kbGVkKHRoaXMubmV3UGF0aCwgdGVtcG9yYXJ5UGF0aCk7XG5cbiAgICBhd2FpdCBuZXcgUmVuYW1lSGFuZGxlcih7XG4gICAgICBhYm9ydFNpZ25hbDogdGhpcy5hYm9ydFNpZ25hbCxcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBoYW5kbGVkUmVuYW1lczogdGhpcy5oYW5kbGVkUmVuYW1lcyxcbiAgICAgIGludGVycnVwdGVkUmVuYW1lc01hcDogdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAsXG4gICAgICBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjogdGhpcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcixcbiAgICAgIG5ld1BhdGg6IHRlbXBvcmFyeVBhdGgsXG4gICAgICBvbGRDYWNoZTogdGhpcy5vbGRDYWNoZSxcbiAgICAgIG9sZFBhdGg6IHRoaXMub2xkUGF0aCxcbiAgICAgIG9sZFBhdGhCYWNrbGlua3NNYXA6IHRoaXMub2xkUGF0aEJhY2tsaW5rc01hcCxcbiAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICByZXNvdXJjZUxvY2tDb21wb25lbnQ6IHRoaXMucmVzb3VyY2VMb2NrQ29tcG9uZW50LFxuICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgIH0pLmhhbmRsZSgpO1xuXG4gICAgYXdhaXQgdGhpcy5hcHAuZmlsZU1hbmFnZXIucmVuYW1lRmlsZShnZXRGaWxlKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogdGVtcG9yYXJ5UGF0aCB9KSwgdGhpcy5uZXdQYXRoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaExpbmtzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZha2VPbGRGaWxlID0gZ2V0RmlsZSh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IHRoaXMub2xkUGF0aCwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICAgIGxldCBvbGRQYXRoQmFja2xpbmtzTWFwUmVmcmVzaGVkOiBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT47XG4gICAge1xuICAgICAgdXNpbmcgX3JlZ2lzdHJhdGlvbiA9IHJlZ2lzdGVyRmlsZXModGhpcy5hcHAsIFtmYWtlT2xkRmlsZV0pO1xuICAgICAgY29uc3QgZmFrZU9sZEZpbGVCYWNrbGlua3MgPSBhd2FpdCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IGZha2VPbGRGaWxlIH0pO1xuICAgICAgb2xkUGF0aEJhY2tsaW5rc01hcFJlZnJlc2hlZCA9IGZha2VPbGRGaWxlQmFja2xpbmtzLmRhdGE7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbYmFja2xpbmtQYXRoLCByZWZyZXNoZWRMaW5rc10gb2Ygb2xkUGF0aEJhY2tsaW5rc01hcFJlZnJlc2hlZCkge1xuICAgICAgbGV0IG9sZExpbmtzID0gdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwLmdldChiYWNrbGlua1BhdGgpO1xuICAgICAgaWYgKCFvbGRMaW5rcykge1xuICAgICAgICBvbGRMaW5rcyA9IFtdO1xuICAgICAgICB0aGlzLm9sZFBhdGhCYWNrbGlua3NNYXAuc2V0KGJhY2tsaW5rUGF0aCwgb2xkTGlua3MpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGxpbmsgb2YgcmVmcmVzaGVkTGlua3MpIHtcbiAgICAgICAgaWYgKG9sZExpbmtzLmluY2x1ZGVzKGxpbmspKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgb2xkTGlua3MucHVzaChsaW5rKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlbmFtZUhhbmRsZWQob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIG5ld1BhdGggPSBnZXRTYWZlUmVuYW1lUGF0aCh7IGFwcDogdGhpcy5hcHAsIG5ld1BhdGgsIG9sZFBhdGhPckFic3RyYWN0RmlsZTogb2xkUGF0aCB9KTtcbiAgICBpZiAob2xkUGF0aCA9PT0gbmV3UGF0aCkge1xuICAgICAgcmV0dXJuIG5ld1BhdGg7XG4gICAgfVxuICAgIHRoaXMuaGFuZGxlZFJlbmFtZXMuYWRkKG9sZFBhdGgsIG5ld1BhdGgpO1xuICAgIG5ld1BhdGggPSBhd2FpdCByZW5hbWVTYWZlKHsgYXBwOiB0aGlzLmFwcCwgbmV3UGF0aCwgb2xkUGF0aE9yQWJzdHJhY3RGaWxlOiBvbGRQYXRoIH0pO1xuICAgIHJldHVybiBuZXdQYXRoO1xuICB9XG59XG5cbmNsYXNzIFJlbmFtZU1hcCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuICBwcml2YXRlIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwcml2YXRlIHJlYWRvbmx5IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbmV3UGF0aDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG9sZENhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkUGF0aDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG9sZFBhdGhMaW5rczogUmVmZXJlbmNlW107XG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUmVuYW1lTWFwQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmFib3J0U2lnbmFsID0gcGFyYW1zLmFib3J0U2lnbmFsO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlciA9IHBhcmFtcy5zZXR0aW5nc01hbmFnZXI7XG4gICAgdGhpcy5vbGRDYWNoZSA9IHBhcmFtcy5vbGRDYWNoZTtcbiAgICB0aGlzLm9sZFBhdGggPSBwYXJhbXMub2xkUGF0aDtcbiAgICB0aGlzLm5ld1BhdGggPSBwYXJhbXMubmV3UGF0aDtcbiAgICB0aGlzLm9sZFBhdGhMaW5rcyA9IHRoaXMub2xkQ2FjaGUgPyBnZXRMaW5rcyh7IGNhY2hlOiB0aGlzLm9sZENhY2hlIH0pIDogW107XG4gIH1cblxuICBwdWJsaWMgZW50cmllcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFtzdHJpbmcsIHN0cmluZ10+IHtcbiAgICByZXR1cm4gdGhpcy5tYXAuZW50cmllcygpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGZpbGwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIHRoaXMubWFwLnNldCh0aGlzLm9sZFBhdGgsIHRoaXMubmV3UGF0aCk7XG5cbiAgICBpZiAoIWlzTm90ZSh0aGlzLm9sZFBhdGgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gT2JzaWRpYW4gZG9lcyBub3QgaW5kZXggYSBjYW52YXMgZmlsZSBpbnRvIHRoZSBtZXRhZGF0YSBjYWNoZS5cbiAgICAvLyBUaGUgY2FjaGUtZGVyaXZlZCBgb2xkUGF0aExpbmtzYCBpcyBlbXB0eSBmb3IgYSBjYW52YXMsIGhpZGluZyBpdHMgZW1iZWRkZWQgYXR0YWNobWVudHMuXG4gICAgLy8gUmVhZGluZyB0aGUgY2FudmFzIHJlZmVyZW5jZXMgZGlyZWN0bHkgbW92ZXMgdGhlbSB3aXRoIHRoZSBjYW52YXMgKG1pcnJvcmluZyBub3RlIGJlaGF2aW9yKS5cbiAgICAvLyBUaGUgZmlsZSBhbHJlYWR5IGxpdmVzIGF0IHRoZSBuZXcgcGF0aCBhZnRlciB0aGUgcmVuYW1lLCBzbyByZWFkIHRoZSByZWZlcmVuY2VzIGZyb20gdGhlcmUuXG4gICAgaWYgKGlzQ2FudmFzRmlsZSh0aGlzLm9sZFBhdGgpKSB7XG4gICAgICBjb25zdCBjYW52YXNSZWZlcmVuY2VzID0gYXdhaXQgZ2V0Q2FudmFzUmVmZXJlbmNlcyh0aGlzLmFwcCwgdGhpcy5uZXdQYXRoKTtcbiAgICAgIHRoaXMub2xkUGF0aExpbmtzLnB1c2goLi4uY2FudmFzUmVmZXJlbmNlcyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuXG4gICAgY29uc3Qgb2xkRmlsZSA9IGdldEZpbGUoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGgsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogdHJ1ZSB9KTtcbiAgICBjb25zdCBvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCA9IGF3YWl0IHRoaXMuZ2V0T2xkQXR0YWNobWVudEZvbGRlclBhdGgob2xkRmlsZSk7XG5cbiAgICBjb25zdCBuZXdBdHRhY2htZW50Rm9sZGVyUGF0aCA9IHNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGb2xkZXJcbiAgICAgID8gYXdhaXQgZ2V0QXR0YWNobWVudEZvbGRlclBhdGgoe1xuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQuUmVuYW1lTm90ZSxcbiAgICAgICAgbm90ZVBhdGhPckZpbGU6IHRoaXMubmV3UGF0aFxuICAgICAgfSlcbiAgICAgIDogb2xkQXR0YWNobWVudEZvbGRlclBhdGg7XG5cbiAgICBjb25zdCBpc09sZEF0dGFjaG1lbnRGb2xkZXJBdFJvb3QgPSBvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCA9PT0gJy8nO1xuXG4gICAgY29uc3Qgb2xkQXR0YWNobWVudEZvbGRlciA9IGdldEZvbGRlck9yTnVsbCh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZvbGRlcjogb2xkQXR0YWNobWVudEZvbGRlclBhdGggfSk7XG5cbiAgICBpZiAoIW9sZEF0dGFjaG1lbnRGb2xkZXIgfHwgKG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoID09PSBuZXdBdHRhY2htZW50Rm9sZGVyUGF0aCAmJiAhc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRGaWxlczogVEZpbGVbXSA9IFtdO1xuXG4gICAgaWYgKFxuICAgICAgYXdhaXQgaGFzT3duQXR0YWNobWVudEZvbGRlcih7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGNvbnRleHQ6IEF0dGFjaG1lbnRQYXRoQ29udGV4dC5SZW5hbWVOb3RlLFxuICAgICAgICBwYXRoOiB0aGlzLm9sZFBhdGhcbiAgICAgIH0pXG4gICAgKSB7XG4gICAgICBWYXVsdC5yZWN1cnNlQ2hpbGRyZW4ob2xkQXR0YWNobWVudEZvbGRlciwgKG9sZEF0dGFjaG1lbnRGaWxlKSA9PiB7XG4gICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgaWYgKGlzRmlsZShvbGRBdHRhY2htZW50RmlsZSkpIHtcbiAgICAgICAgICBvbGRBdHRhY2htZW50RmlsZXMucHVzaChvbGRBdHRhY2htZW50RmlsZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IG9sZFBhdGhMaW5rIG9mIHRoaXMub2xkUGF0aExpbmtzKSB7XG4gICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgY29uc3Qgb2xkQXR0YWNobWVudEZpbGUgPSBleHRyYWN0TGlua0ZpbGUoeyBhcHA6IHRoaXMuYXBwLCBsaW5rOiBvbGRQYXRoTGluaywgc291cmNlUGF0aE9yRmlsZTogdGhpcy5vbGRQYXRoIH0pO1xuICAgICAgICBpZiAoIW9sZEF0dGFjaG1lbnRGaWxlIHx8ICghaXNPbGRBdHRhY2htZW50Rm9sZGVyQXRSb290ICYmICFvbGRBdHRhY2htZW50RmlsZS5wYXRoLnN0YXJ0c1dpdGgob2xkQXR0YWNobWVudEZvbGRlclBhdGgpKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb2xkQXR0YWNobWVudEJhY2tsaW5rcyA9IGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogb2xkQXR0YWNobWVudEZpbGUgfSk7XG4gICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgY29uc3Qga2V5cyA9IG5ldyBTZXQ8c3RyaW5nPihvbGRBdHRhY2htZW50QmFja2xpbmtzLmtleXMoKSk7XG4gICAgICAgIGtleXMuZGVsZXRlKHRoaXMub2xkUGF0aCk7XG4gICAgICAgIGtleXMuZGVsZXRlKHRoaXMubmV3UGF0aCk7XG4gICAgICAgIGlmIChrZXlzLnNpemUgPT09IDApIHtcbiAgICAgICAgICBvbGRBdHRhY2htZW50RmlsZXMucHVzaChvbGRBdHRhY2htZW50RmlsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG9sZEF0dGFjaG1lbnRGaWxlIG9mIG9sZEF0dGFjaG1lbnRGaWxlcykge1xuICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgaWYgKHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmlzTm90ZUV4KG9sZEF0dGFjaG1lbnRGaWxlLnBhdGgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBsZXQgbmV3QXR0YWNobWVudEZpbGVQYXRoOiBzdHJpbmc7XG4gICAgICBpZiAoc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzKSB7XG4gICAgICAgIG5ld0F0dGFjaG1lbnRGaWxlUGF0aCA9IGF3YWl0IGdldEF0dGFjaG1lbnRGaWxlUGF0aCh7XG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQuUmVuYW1lTm90ZSxcbiAgICAgICAgICBub3RlUGF0aE9yRmlsZTogdGhpcy5uZXdQYXRoLFxuICAgICAgICAgIG9sZEF0dGFjaG1lbnRQYXRoT3JGaWxlOiBvbGRBdHRhY2htZW50RmlsZSxcbiAgICAgICAgICBvbGROb3RlUGF0aE9yRmlsZTogdGhpcy5vbGRQYXRoLFxuICAgICAgICAgIHNob3VsZFNraXBEdXBsaWNhdGVDaGVjazogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gaXNPbGRBdHRhY2htZW50Rm9sZGVyQXRSb290ID8gb2xkQXR0YWNobWVudEZpbGUucGF0aCA6IHJlbGF0aXZlKG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoLCBvbGRBdHRhY2htZW50RmlsZS5wYXRoKTtcbiAgICAgICAgY29uc3QgbmV3Rm9sZGVyID0gam9pbihuZXdBdHRhY2htZW50Rm9sZGVyUGF0aCwgZGlybmFtZShyZWxhdGl2ZVBhdGgpKTtcbiAgICAgICAgbmV3QXR0YWNobWVudEZpbGVQYXRoID0gam9pbihuZXdGb2xkZXIsIG9sZEF0dGFjaG1lbnRGaWxlLm5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAob2xkQXR0YWNobWVudEZpbGUucGF0aCA9PT0gbmV3QXR0YWNobWVudEZpbGVQYXRoKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHNldHRpbmdzLnNob3VsZERlbGV0ZUNvbmZsaWN0aW5nQXR0YWNobWVudHMpIHtcbiAgICAgICAgY29uc3QgbmV3QXR0YWNobWVudEZpbGUgPSBnZXRGaWxlT3JOdWxsKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogbmV3QXR0YWNobWVudEZpbGVQYXRoIH0pO1xuICAgICAgICBpZiAobmV3QXR0YWNobWVudEZpbGUpIHtcbiAgICAgICAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmZpbGxSZW5hbWVNYXAnKShgUmVtb3ZpbmcgY29uZmxpY3RpbmcgYXR0YWNobWVudCAke25ld0F0dGFjaG1lbnRGaWxlLnBhdGh9LmApO1xuICAgICAgICAgIGF3YWl0IHRyYXNoU2FmZSh0aGlzLmFwcCwgbmV3QXR0YWNobWVudEZpbGUpO1xuICAgICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZGlyZWN0b3J5ID0gZGlybmFtZShuZXdBdHRhY2htZW50RmlsZVBhdGgpO1xuICAgICAgICBjb25zdCBleHRlbnNpb24gPSBleHRuYW1lKG5ld0F0dGFjaG1lbnRGaWxlUGF0aCk7XG4gICAgICAgIGNvbnN0IGJhc2VOYW1lID0gYmFzZW5hbWUobmV3QXR0YWNobWVudEZpbGVQYXRoLCBleHRlbnNpb24pO1xuICAgICAgICBuZXdBdHRhY2htZW50RmlsZVBhdGggPSB0aGlzLmFwcC52YXVsdC5nZXRBdmFpbGFibGVQYXRoKGpvaW4oZGlyZWN0b3J5LCBiYXNlTmFtZSksIGV4dGVuc2lvbi5zbGljZSgxKSk7XG4gICAgICB9XG4gICAgICB0aGlzLm1hcC5zZXQob2xkQXR0YWNobWVudEZpbGUucGF0aCwgbmV3QXR0YWNobWVudEZpbGVQYXRoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0KG9sZFBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmdldChvbGRQYXRoKTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0QmFja2xpbmtzTWFwKHBhcmFtczogUmVuYW1lTWFwSW5pdEJhY2tsaW5rc01hcFBhcmFtcyk6IHZvaWQge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbWJpbmVkQmFja2xpbmtzTWFwLFxuICAgICAgcGF0aCxcbiAgICAgIHNpbmdsZUJhY2tsaW5rc01hcFxuICAgIH0gPSBwYXJhbXM7XG4gICAgYnVpbGRCYWNrbGlua3NTbmFwc2hvdDxzdHJpbmc+KHtcbiAgICAgIGJhY2tsaW5rczogc2luZ2xlQmFja2xpbmtzTWFwLFxuICAgICAgbGlua0lkZW50aXR5S2V5UHJvdmlkZXI6IGdldExpbmtJZGVudGl0eUtleSxcbiAgICAgIHBhdGhSZW1hcHBlcjogKGJhY2tsaW5rUGF0aCkgPT4gdGhpcy5tYXAuZ2V0KGJhY2tsaW5rUGF0aCkgPz8gYmFja2xpbmtQYXRoLFxuICAgICAgcGF5bG9hZFByb3ZpZGVyOiAoKSA9PiBwYXRoLFxuICAgICAgdGFyZ2V0OiBjb21iaW5lZEJhY2tsaW5rc01hcFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGluaXRPcmlnaW5hbExpbmtzTWFwKGNvbWJpbmVkQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+Pik6IHZvaWQge1xuICAgIGZvciAoY29uc3Qgb2xkUGF0aExpbmsgb2YgdGhpcy5vbGRQYXRoTGlua3MpIHtcbiAgICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRGaWxlID0gZXh0cmFjdExpbmtGaWxlKHsgYXBwOiB0aGlzLmFwcCwgbGluazogb2xkUGF0aExpbmssIHNvdXJjZVBhdGhPckZpbGU6IHRoaXMub2xkUGF0aCB9KTtcbiAgICAgIGlmICghb2xkQXR0YWNobWVudEZpbGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBiYWNrbGlua3NNYXAgPSBuZXcgTWFwPHN0cmluZywgUmVmZXJlbmNlW10+KFtbdGhpcy5uZXdQYXRoLCBbb2xkUGF0aExpbmtdXV0pO1xuICAgICAgdGhpcy5pbml0QmFja2xpbmtzTWFwKHtcbiAgICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICAgIHBhdGg6IG9sZEF0dGFjaG1lbnRGaWxlLnBhdGgsXG4gICAgICAgIHNpbmdsZUJhY2tsaW5rc01hcDogYmFja2xpbmtzTWFwXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMga2V5cygpOiBJdGVyYWJsZUl0ZXJhdG9yPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLm1hcC5rZXlzKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0KG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tYXAuc2V0KG9sZFBhdGgsIG5ld1BhdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRPbGRBdHRhY2htZW50Rm9sZGVyUGF0aChvbGRGaWxlOiBURmlsZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdXNpbmcgX3JlZ2lzdHJhdGlvbiA9IHJlZ2lzdGVyRmlsZXModGhpcy5hcHAsIFtvbGRGaWxlXSk7XG4gICAgdXNpbmcgX2NhY2hlUmVnaXN0cmF0aW9uID0gdGhpcy5vbGRDYWNoZSAmJiBvbGRGaWxlLmRlbGV0ZWRcbiAgICAgID8gcmVnaXN0ZXJGaWxlQ2FjaGVGb3JOb25FeGlzdGluZ0ZpbGUoeyBhcHA6IHRoaXMuYXBwLCBjYWNoZTogdGhpcy5vbGRDYWNoZSwgcGF0aE9yRmlsZTogb2xkRmlsZSB9KVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGF3YWl0IGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQuUmVuYW1lTm90ZSxcbiAgICAgIG5vdGVQYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGhcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBzZXR0aW5ncyB0aGUgaGFuZGxlciBydW5zIHdpdGguXG4gKlxuICogVGhlcmUgaXMgZXhhY3RseSBvbmUgY29udHJpYnV0b3I6IHRoZSBjb21wb25lbnQncyBvd24gYHNldHRpbmdzQnVpbGRlcmAuIEVhcmxpZXIgdmVyc2lvbnMgYWdncmVnYXRlZCBhXG4gKiByZWdpc3RyeSBvZiBjb250cmlidXRvcnMgYW5kIE9SLW1lcmdlZCB0aGVpciBhbnN3ZXJzLCBiZWNhdXNlIHNldmVyYWwgcGx1Z2lucyBjb3VsZCBlYWNoIHJlZ2lzdGVyIGFcbiAqIGhhbmRsZXIgYWdhaW5zdCB0aGUgb25lIHNoYXJlZCB2YXVsdC4gVGhleSBubyBsb25nZXIgZG8sIHNvIHRoZXJlIGlzIG5vIGxvbmdlciBhbnkgcXVlc3Rpb24gb2Ygd2hvc2VcbiAqIHNldHRpbmcgd2lucy5cbiAqXG4gKiBXaGF0IHJlbWFpbnMgaXMgZGVmYXVsdGluZzogdGhlIGJ1aWxkZXIgcmV0dXJucyBhIGBQYXJ0aWFsYCwgc28gdGhlIHR3byBwcmVkaWNhdGVzIGFuZCB0aGUgZW1wdHktZm9sZGVyXG4gKiBiZWhhdmlvciBuZWVkIGEgdmFsdWUgd2hlbiBpdCBkb2VzIG5vdCBzdXBwbHkgb25lLlxuICovXG5jbGFzcyBTZXR0aW5nc01hbmFnZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzQnVpbGRlcjogKCkgPT4gUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzZXR0aW5nc0J1aWxkZXI6ICgpID0+IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPikge1xuICAgIHRoaXMuc2V0dGluZ3NCdWlsZGVyID0gc2V0dGluZ3NCdWlsZGVyO1xuICB9XG5cbiAgcHVibGljIGdldFNldHRpbmdzKCk6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPiB7XG4gICAgY29uc3QgYnVpbHRTZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NCdWlsZGVyKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmJ1aWx0U2V0dGluZ3MsXG4gICAgICBlbXB0eUZvbGRlckJlaGF2aW9yOiBidWlsdFNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgPz8gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwLFxuICAgICAgaXNOb3RlOiAocGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PiBidWlsdFNldHRpbmdzLmlzTm90ZT8uKHBhdGgpID8/IGlzTm90ZShwYXRoKSxcbiAgICAgIGlzUGF0aElnbm9yZWQ6IChwYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IGJ1aWx0U2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKHBhdGgpID8/IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBpc05vdGVFeChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuZ2V0U2V0dGluZ3MoKTtcbiAgICByZXR1cm4gc2V0dGluZ3MuaXNOb3RlPy4ocGF0aCkgPz8gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBDb21wb25lbnQgdGhhdCBoYW5kbGVzIHJlbmFtZSBhbmQgZGVsZXRlIGV2ZW50cyBpbiBPYnNpZGlhbi5cbiAqIEl0IGxpc3RlbnMgdG8gcmVuYW1lIGFuZCBkZWxldGUgZXZlbnRzIGFuZCB1cGRhdGVzIGxpbmtzIGFjY29yZGluZ2x5LlxuICogSXQgYWxzbyBoYW5kbGVzIGVkZ2UgY2FzZXMgc3VjaCBhcyBjYXNlLW9ubHkgcmVuYW1lcyBhbmQgY29sbGlzaW9ucyB3aXRoIGV4aXN0aW5nIGZpbGVzLlxuICovXG5leHBvcnQgY2xhc3MgUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgLyoqXG4gICAqIFRoZSBhYm9ydCBzaWduYWwgY29tcG9uZW50IHdob3NlIHNpZ25hbCBjYW5jZWxzIGluLWZsaWdodCByZW5hbWUgb3BlcmF0aW9ucy5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBhYm9ydFNpZ25hbENvbXBvbmVudDogQWJvcnRTaWduYWxDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCByZXBvcnRlciBpbnZva2VkIG9uY2UgcGVyIGJhY2tsaW5rIGZpbGUgd2hvc2UgbGlua3MgYXJlIHVwZGF0ZWQgZHVyaW5nIGEgcmVuYW1lL21vdmUsXG4gICAqIHdpdGggdGhlIHJ1bm5pbmcgY291bnQgb2YgcHJvY2Vzc2VkIGZpbGVzIGFuZCB0aGUgdG90YWwuIFdoZW4gYG51bGxgLCBubyBwcm9ncmVzcyBpcyByZXBvcnRlZC5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjogTGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIgfCBudWxsO1xuICAvKipcbiAgICogVGhlIG5vdGljZSBjb21wb25lbnQgdXNlZCB0byByZXBvcnQgdXBkYXRlZCBsaW5rcyB0byB0aGUgdXNlci5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZSBsb2NrIGNvbXBvbmVudCB1c2VkIHRvIGd1YXJkIGxpbmsgdXBkYXRlcywgb3IgYG51bGxgIGlmIG5vbmUgaXMgdXNlZC5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSByZXNvdXJjZUxvY2tDb21wb25lbnQ6IG51bGwgfCBSZXNvdXJjZUxvY2tDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGlzIHBsdWdpbidzIHJlbmFtZS9kZWxldGUgaGFuZGxlciBzZXR0aW5ncy5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzZXR0aW5nc0J1aWxkZXI6ICgpID0+IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPjtcblxuICAvKipcbiAgICogVGhlIG1hbmFnZXIgdGhhdCBhZ2dyZWdhdGVzIHJlbmFtZS9kZWxldGUgaGFuZGxlciBzZXR0aW5ncyBhY3Jvc3MgcmVnaXN0ZXJlZCBwbHVnaW5zLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAgPSBuZXcgTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVkUmVuYW1lcyA9IG5ldyBIYW5kbGVkUmVuYW1lcygpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZXJydXB0ZWRSZW5hbWVzTWFwID0gbmV3IE1hcDxzdHJpbmcsIEludGVycnVwdGVkUmVuYW1lW10+KCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFJlbmFtZURlbGV0ZUhhbmRsZXJDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hYm9ydFNpZ25hbENvbXBvbmVudCA9IHBhcmFtcy5hYm9ydFNpZ25hbENvbXBvbmVudDtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciA9IHBhcmFtcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciA/PyBudWxsO1xuICAgIHRoaXMucmVzb3VyY2VMb2NrQ29tcG9uZW50ID0gcGFyYW1zLnJlc291cmNlTG9ja0NvbXBvbmVudDtcbiAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCA9IHBhcmFtcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gICAgdGhpcy5zZXR0aW5nc0J1aWxkZXIgPSBwYXJhbXMuc2V0dGluZ3NCdWlsZGVyO1xuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gbmV3IFNldHRpbmdzTWFuYWdlcih0aGlzLnNldHRpbmdzQnVpbGRlcik7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdGhlIGNvbXBvbmVudFxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAudmF1bHQub24oJ2RlbGV0ZScsIHRoaXMuaGFuZGxlRGVsZXRlLmJpbmQodGhpcykpKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAudmF1bHQub24oJ3JlbmFtZScsIHRoaXMuaGFuZGxlUmVuYW1lLmJpbmQodGhpcykpKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAubWV0YWRhdGFDYWNoZS5vbignZGVsZXRlZCcsIHRoaXMuaGFuZGxlTWV0YWRhdGFEZWxldGVkLmJpbmQodGhpcykpKTtcblxuICAgIHRoaXMuYWRkQ2hpbGQoXG4gICAgICBuZXcgRmlsZU1hbmFnZXJSdW5Bc3luY0xpbmtVcGRhdGVQYXRjaENvbXBvbmVudCh7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGZpbGVNYW5hZ2VyOiB0aGlzLmFwcC5maWxlTWFuYWdlcixcbiAgICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5hZGRDaGlsZChcbiAgICAgIG5ldyBEZWxldGVQcm90ZWN0aW9uUGF0Y2hDb21wb25lbnQoe1xuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZURlbGV0ZShmaWxlOiBUQWJzdHJhY3RGaWxlKTogdm9pZCB7XG4gICAgYWRkVG9RdWV1ZSh7XG4gICAgICBvcGVyYXRpb25GdW5jdGlvbjogKGFib3J0U2lnbmFsKSA9PlxuICAgICAgICBuZXcgRGVsZXRlSGFuZGxlcih7XG4gICAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcCxcbiAgICAgICAgICBmaWxlLFxuICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgICAgICB9KS5oYW5kbGUoKSxcbiAgICAgIG9wZXJhdGlvbk5hbWU6IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5yZW5hbWVEZWxldGVIYW5kbGVyLmhhbmRsZURlbGV0ZSwgeyBmaWxlUGF0aDogZmlsZS5wYXRoIH0pXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU1ldGFkYXRhRGVsZXRlZChmaWxlOiBUQWJzdHJhY3RGaWxlLCBwcmV2aW91c0NhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGwpOiB2b2lkIHtcbiAgICBuZXcgTWV0YWRhdGFEZWxldGVkSGFuZGxlcih7XG4gICAgICBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcCxcbiAgICAgIGZpbGUsXG4gICAgICBwcmV2aW91c0NhY2hlLFxuICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgIH0pLmhhbmRsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVSZW5hbWUoZmlsZTogVEFic3RyYWN0RmlsZSwgb2xkUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCFpc0ZpbGUoZmlsZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdQYXRoID0gZmlsZS5wYXRoO1xuXG4gICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVSZW5hbWUnKShgSGFuZGxlIFJlbmFtZSAke29sZFBhdGh9IC0+ICR7bmV3UGF0aH1gKTtcbiAgICBpZiAodGhpcy5oYW5kbGVkUmVuYW1lcy5oYXMob2xkUGF0aCwgbmV3UGF0aCkpIHtcbiAgICAgIHRoaXMuaGFuZGxlZFJlbmFtZXMuZGVsZXRlKG9sZFBhdGgsIG5ld1BhdGgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogQSByZW5hbWUgb2NjdXJyaW5nIGluc2lkZSBhIGZvcmVpZ24gcGx1Z2luJ3MgaW4tZmxpZ2h0IGxvY2tlZCB0cmFuc2FjdGlvbiAod2hpY2ggbG9ja3MgdGhlXG4gICAgICogYWZmZWN0ZWQgZm9sZGVyIHN1YnRyZWUsIGUuZy4gQWR2YW5jZWQgTm90ZSBDb21wb3NlcidzIGZvbGRlciBtZXJnZSkgaXMgb3JjaGVzdHJhdGVkIGJ5IHRoYXRcbiAgICAgKiB0cmFuc2FjdGlvbidzIG93bmVyLCB3aGljaCB0YWtlcyByZXNwb25zaWJpbGl0eSBmb3IgaXRzIG93biBsaW5rIGNvbnNpc3RlbmN5LiBSZWFjdGluZyB0byBpdFxuICAgICAqIGhlcmUgd291bGQgKGEpIHBlcnR1cmIgT2JzaWRpYW4ncyBuYXRpdmUgcG9zdC1yZW5hbWUgbGluayB1cGRhdGUgYW5kIGxlYXZlIGxpbmtzIGRhbmdsaW5nLCBhbmRcbiAgICAgKiAoYikgY29sbGlkZSB3aXRoIHRoZSBmb3JlaWduIHRyYW5zYWN0aW9uIFx1MjAxNCBhbiBhc3luYyBhYm9ydCBmcm9tIHRoaXMgaGFuZGxlciBhYm9ydHMgYW5cbiAgICAgKiBhbHJlYWR5LWNvbW1pdHRlZCB0cmFuc2FjdGlvbiwgdGhyb3dpbmcgXCJDYW5ub3Qgcm9sbCBiYWNrIGEgY29tbWl0dGVkIHRyYW5zYWN0aW9uXCIuIFRoaXNcbiAgICAgKiBoYW5kbGVyJ3Mgb3duIGF0dGFjaG1lbnQgbW92ZXMgYXJlIGFscmVhZHkgZXhjbHVkZWQgYWJvdmUgdmlhIGBoYW5kbGVkUmVuYW1lc2AsIHNvIGEgbG9jayBzdGlsbFxuICAgICAqIGhlbGQgaGVyZSBhbHdheXMgYmVsb25ncyB0byBhIGZvcmVpZ24gb3BlcmF0aW9uOyBzdGF5IG91dCBvZiBpdHMgd2F5LiBTZWVcbiAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vbW5hb3Vtb3Yvb2JzaWRpYW4tYWR2YW5jZWQtbm90ZS1jb21wb3Nlci9pc3N1ZXMvMTQ2LlxuICAgICAqL1xuICAgIGlmIChpc1Jlc291cmNlTG9ja2VkRm9yUGF0aEJ5QW5jZXN0b3IodGhpcy5hcHAsIG9sZFBhdGgpIHx8IGlzUmVzb3VyY2VMb2NrZWRGb3JQYXRoQnlBbmNlc3Rvcih0aGlzLmFwcCwgbmV3UGF0aCkpIHtcbiAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlUmVuYW1lJykoXG4gICAgICAgIGBTa2lwcGluZyByZW5hbWUgaGFuZGxlciBvZiAke29sZFBhdGh9IC0+ICR7bmV3UGF0aH0gYXMgaXQgb2NjdXJzIGluc2lkZSBhIGZvcmVpZ24gbG9ja2VkIHRyYW5zYWN0aW9uLmBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuICAgIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcyAmJiAhc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZvbGRlciAmJiAhc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNOb09wUmVuYW1lKHNldHRpbmdzLCBvbGRQYXRoLCBuZXdQYXRoKSkge1xuICAgICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVSZW5hbWUnKShcbiAgICAgICAgYFNraXBwaW5nIHJlbmFtZSBoYW5kbGVyIG9mICR7b2xkUGF0aH0gLT4gJHtuZXdQYXRofSBhcyBpdCBpcyBub3QgYSBub3RlIGFuZCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvIHdpdGggbGluayB1cGRhdGVzIGRpc2FibGVkLmBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihvbGRQYXRoKSkge1xuICAgICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVSZW5hbWUnKShgU2tpcHBpbmcgcmVuYW1lIGhhbmRsZXIgb2Ygb2xkIHBhdGggJHtvbGRQYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4obmV3UGF0aCkpIHtcbiAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlUmVuYW1lJykoYFNraXBwaW5nIHJlbmFtZSBoYW5kbGVyIG9mIG5ldyBwYXRoICR7bmV3UGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvbGRDYWNoZSA9IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Q2FjaGUob2xkUGF0aCkgPz8gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRDYWNoZShuZXdQYXRoKTtcbiAgICBjb25zdCBvbGRQYXRoQmFja2xpbmtzTWFwID0gZ2V0QmFja2xpbmtzRm9yRmlsZU9yUGF0aCh0aGlzLmFwcCwgb2xkUGF0aCkuZGF0YTtcbiAgICBhZGRUb1F1ZXVlKHtcbiAgICAgIGFib3J0U2lnbmFsOiB0aGlzLmFib3J0U2lnbmFsQ29tcG9uZW50LmFib3J0U2lnbmFsLFxuICAgICAgb3BlcmF0aW9uRnVuY3Rpb246IChhYm9ydFNpZ25hbCkgPT5cbiAgICAgICAgbmV3IFJlbmFtZUhhbmRsZXIoe1xuICAgICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgaGFuZGxlZFJlbmFtZXM6IHRoaXMuaGFuZGxlZFJlbmFtZXMsXG4gICAgICAgICAgaW50ZXJydXB0ZWRSZW5hbWVzTWFwOiB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcCxcbiAgICAgICAgICBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjogdGhpcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcixcbiAgICAgICAgICBuZXdQYXRoLFxuICAgICAgICAgIG9sZENhY2hlLFxuICAgICAgICAgIG9sZFBhdGgsXG4gICAgICAgICAgb2xkUGF0aEJhY2tsaW5rc01hcCxcbiAgICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgICAgIHJlc291cmNlTG9ja0NvbXBvbmVudDogdGhpcy5yZXNvdXJjZUxvY2tDb21wb25lbnQsXG4gICAgICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgICAgICB9KS5oYW5kbGUoKSxcbiAgICAgIG9wZXJhdGlvbk5hbWU6IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5yZW5hbWVEZWxldGVIYW5kbGVyLmhhbmRsZVJlbmFtZSwgeyBuZXdQYXRoLCBvbGRQYXRoIH0pXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogV2l0aCBsaW5rIHJld3JpdGluZyBvZmYsIHRoZSBoYW5kbGVyJ3Mgb25seSByZW1haW5pbmcgam9icyBhcmUgbW92aW5nIGEgTk9URSdzIGF0dGFjaG1lbnRzIGFuZCBwcnVuaW5nXG4gICAqIHRoZSBmb2xkZXIgYSBtb3ZlZCBmaWxlIHZhY2F0ZWQuIEEgbm9uLW5vdGUgcmVuYW1lIG5lZWRzIG5laXRoZXIgd2hlbiBlbXB0eSBmb2xkZXJzIGFyZSBrZXB0LCBzbyB0aGVyZVxuICAgKiBpcyBub3RoaW5nIHRvIHF1ZXVlLlxuICAgKlxuICAgKiBAcGFyYW0gc2V0dGluZ3MgLSBUaGUgYWdncmVnYXRlZCByZW5hbWUvZGVsZXRlIGhhbmRsZXIgc2V0dGluZ3MuXG4gICAqIEBwYXJhbSBvbGRQYXRoIC0gVGhlIHBhdGggdGhlIGZpbGUgd2FzIHJlbmFtZWQgZnJvbS5cbiAgICogQHBhcmFtIG5ld1BhdGggLSBUaGUgcGF0aCB0aGUgZmlsZSB3YXMgcmVuYW1lZCB0by5cbiAgICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGhhbmRsZXIgd291bGQgZG8gbm8gd29yayBmb3IgdGhpcyByZW5hbWUuXG4gICAqL1xuICBwcml2YXRlIGlzTm9PcFJlbmFtZShzZXR0aW5nczogUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+LCBvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhc2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lc1xuICAgICAgJiYgIShzZXR0aW5ncy5pc05vdGU/LihvbGRQYXRoKSA/PyBmYWxzZSlcbiAgICAgICYmICEoc2V0dGluZ3MuaXNOb3RlPy4obmV3UGF0aCkgPz8gZmFsc2UpXG4gICAgICAmJiAoc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciA/PyBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXApID09PSBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXA7XG4gIH1cbn1cblxuLyoqXG4gKiBNb3ZlcyBhbiBhdHRhY2htZW50IGEgZGVsZXRpb24gd291bGQgb3RoZXJ3aXNlIHN0cmFuZCB0byB3aGVyZXZlciB0aGUgY29uc3VtaW5nIHBsdWdpbiBzYXlzIGl0IGJlbG9uZ3MuXG4gKlxuICogU2hhcmVkIGJ5IGJvdGggZGVsZXRlIHBhdGhzIFx1MjAxNCB0aGUgbm90ZSBkZWxldGUgaW4ge0BsaW5rIERlbGV0ZUhhbmRsZXJ9IGFuZCB0aGUgZm9sZGVyIGRlbGV0ZSByZXBsYXllZCBieVxuICoge0BsaW5rIERlbGV0ZVByb3RlY3Rpb25QYXRjaENvbXBvbmVudH0gXHUyMDE0IGJlY2F1c2UgYm90aCByZWFjaCB0aGUgc2FtZSBwb2ludDoge0BsaW5rIGRlbGV0ZUlmTm90VXNlZH0gaGFzXG4gKiBkZWNpZGVkIHRoZSBhdHRhY2htZW50IG11c3Qgc3Vydml2ZSwgYW5kIHdpdGhvdXQgdGhpcyBpdCB3b3VsZCBzdXJ2aXZlIGluIGEgZm9sZGVyIG5vdGhpbmcgb3ducyBhbnkgbW9yZS5cbiAqXG4gKiBBIGNvbnN1bWVyIHRoYXQgZG9lcyBub3QgaW1wbGVtZW50IHtAbGluayBSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3MuZ2V0UmVzY3VlUGF0aH0sIG9yIHRoYXQgYW5zd2Vyc1xuICogYG51bGxgLCBnZXRzIGV4YWN0bHkgdGhlIGJlaGF2aW9yIGl0IGhhZCBiZWZvcmUgdGhpcyBleGlzdGVkOiB0aGUgYXR0YWNobWVudCBzdGF5cyBwdXQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHdoZXRoZXIgdGhlIGF0dGFjaG1lbnQgd2FzIG1vdmVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBkaWRSZXNjdWVTdGlsbFVzZWRBdHRhY2htZW50KHBhcmFtczogRGlkUmVzY3VlU3RpbGxVc2VkQXR0YWNobWVudFBhcmFtcyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBzZXR0aW5ncyA9IHBhcmFtcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcbiAgaWYgKCFzZXR0aW5ncy5nZXRSZXNjdWVQYXRoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgYXR0YWNobWVudFBhdGggPSBwYXJhbXMucmVzY3VlUGFyYW1zLmZpbGUucGF0aDtcbiAgY29uc3QgcmVzY3VlUGF0aCA9IGF3YWl0IHNldHRpbmdzLmdldFJlc2N1ZVBhdGgoe1xuICAgIGF0dGFjaG1lbnRQYXRoLFxuICAgIHN1cnZpdmluZ05vdGVQYXRoczogcGFyYW1zLnJlc2N1ZVBhcmFtcy5zdXJ2aXZpbmdOb3RlUGF0aHNcbiAgfSk7XG5cbiAgaWYgKHJlc2N1ZVBhdGggPT09IG51bGwpIHtcbiAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmRpZFJlc2N1ZVN0aWxsVXNlZEF0dGFjaG1lbnQnKShgTm8gcmVzY3VlIHBhdGggZm9yICR7YXR0YWNobWVudFBhdGh9OyBrZWVwaW5nIGl0IHdoZXJlIGl0IGlzLmApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgLypcbiAgICAgKiBgcmVuYW1lU2FmZWAgY3JlYXRlcyB0aGUgZGVzdGluYXRpb24gZm9sZGVyLCByZXNvbHZlcyBhIGNvbGxpc2lvbiB2aWEgYGdldFNhZmVSZW5hbWVQYXRoYCwgYW5kIG1vdmVzXG4gICAgICogdGhyb3VnaCBgYXBwLmZpbGVNYW5hZ2VyLnJlbmFtZUZpbGVgLCBzbyB0aGUgc3Vydml2aW5nIG5vdGVzJyBsaW5rcyBmb2xsb3cgdGhlIGF0dGFjaG1lbnQuXG4gICAgICovXG4gICAgY29uc3QgbmV3QXR0YWNobWVudFBhdGggPSBhd2FpdCByZW5hbWVTYWZlKHtcbiAgICAgIGFwcDogcGFyYW1zLmFwcCxcbiAgICAgIG5ld1BhdGg6IHJlc2N1ZVBhdGgsXG4gICAgICBvbGRQYXRoT3JBYnN0cmFjdEZpbGU6IHBhcmFtcy5yZXNjdWVQYXJhbXMuZmlsZVxuICAgIH0pO1xuXG4gICAgaWYgKG5ld0F0dGFjaG1lbnRQYXRoID09PSBhdHRhY2htZW50UGF0aCkge1xuICAgICAgLypcbiAgICAgICAqIFRoZSBhdHRhY2htZW50IGlzIGFscmVhZHkgd2hlcmUgaXQgYmVsb25ncy4gVGhpcyBpcyB0aGUgbm9ybWFsIHNlY29uZCBsb29rIGF0IGEgZmlsZSB0aGUgZm9sZGVyXG4gICAgICAgKiBkZWxldGUganVzdCByZXNjdWVkOiB0aGUgb3duaW5nIG5vdGUncyBvd24gZGVsZXRpb24gaXMgcmVwb3J0ZWQgYWZ0ZXJ3YXJkcyBhbmQgd2Fsa3MgaXRzIGxpbmtzXG4gICAgICAgKiBhZ2Fpbi4gTm90aGluZyBtb3ZlZCwgc28gbm90aGluZyBpcyBjbGFpbWVkIFx1MjAxNCB0aGUgY2FsbGVyIGtlZXBzIGl0IGluIHBsYWNlLCB3aGljaCBpcyB0aGUgdHJ1dGguXG4gICAgICAgKi9cbiAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6ZGlkUmVzY3VlU3RpbGxVc2VkQXR0YWNobWVudCcpKGAke2F0dGFjaG1lbnRQYXRofSBhbHJlYWR5IHNpdHMgYXQgaXRzIHJlc2N1ZSBwYXRoOyBub3RoaW5nIHRvIG1vdmUuYCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBUaGUgbW92ZSBmaXJlcyBgdmF1bHQub24oJ3JlbmFtZScpYCwgc28gdGhpcyBoYW5kbGVyJ3Mgb3duIGBSZW5hbWVIYW5kbGVyYCBwaWNrcyBpdCB1cCBsaWtlIGFueSBvdGhlclxuICAgICAqIGF0dGFjaG1lbnQgbW92ZS4gSXQgaXMgZGVsaWJlcmF0ZWx5IE5PVCByZWdpc3RlcmVkIGluIGBoYW5kbGVkUmVuYW1lc2A6XG4gICAgICogYEZpbGVNYW5hZ2VyUnVuQXN5bmNMaW5rVXBkYXRlUGF0Y2hDb21wb25lbnRgIGFscmVhZHkgZGlzY2FyZHMgT2JzaWRpYW4ncyBuYXRpdmUgbGluayB1cGRhdGUgd2hpbGVcbiAgICAgKiBgc2hvdWxkSGFuZGxlUmVuYW1lc2AgaXMgb24sIHNvIHN1cHByZXNzaW5nIHRoZSBoYW5kbGVyIGFzIHdlbGwgd291bGQgbGVhdmUgZGFuZ2xpbmcgZXhhY3RseSB0aGUgbGlua3NcbiAgICAgKiB0aGlzIHJlc2N1ZSBleGlzdHMgdG8gcHJlc2VydmUuIExldCB0aGUgcmV3cml0ZSBzZXR0bGUgYmVmb3JlIHRoZSBkZWxldGUgd2FsayBjYXJyaWVzIG9uLlxuICAgICAqL1xuICAgIGF3YWl0IHdhaXRGb3JQZW5kaW5nTGlua1VwZGF0ZXMocGFyYW1zLmFwcCk7XG5cbiAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmRpZFJlc2N1ZVN0aWxsVXNlZEF0dGFjaG1lbnQnKShgUmVzY3VlZCAke2F0dGFjaG1lbnRQYXRofSB0byAke25ld0F0dGFjaG1lbnRQYXRofS5gKTtcbiAgICBwYXJhbXMucGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2UodCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLm5vdGljZXMuYXR0YWNobWVudFJlc2N1ZWQsIHsgYXR0YWNobWVudFBhdGgsIG5ld0F0dGFjaG1lbnRQYXRoIH0pKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvKlxuICAgICAqIEEgcmVzY3VlIHRoYXQgaGFsZiBoYXBwZW5lZCBtdXN0IG5vdCByZWFkIGFzIHN1Y2Nlc3MgXHUyMDE0IHJlcG9ydGluZyBgZmFsc2VgIGZhbGxzIGJhY2sgdG8ga2VlcGluZyB0aGVcbiAgICAgKiBhdHRhY2htZW50IGluIHBsYWNlIHdpdGggdGhlIGBhdHRhY2htZW50SXNTdGlsbFVzZWRgIG5vdGljZSwgd2hpY2ggaXMgc3RpbGwgc2FmZS5cbiAgICAgKi9cbiAgICBwcmludEVycm9yKG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlc2N1ZSAke2F0dGFjaG1lbnRQYXRofSB0byAke3Jlc2N1ZVBhdGh9YCwgeyBjYXVzZTogZXJyb3IgfSkpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUga2V5IHVuZGVyIHdoaWNoIGEgbGluayBpcyByZW1lbWJlcmVkIHdoaWxlIGEgcmVuYW1lIGlzIGluIGZsaWdodC5cbiAqXG4gKiBUaGUgcmV3cml0ZSBoYXMgdG8gbWF0Y2ggbGlua3MgY2FwdHVyZWQgQkVGT1JFIHRoZSBhdHRhY2htZW50cyBtb3ZlZCBhZ2FpbnN0IHRoZSBsaW5rcyB0aGUgbWV0YWRhdGEgY2FjaGVcbiAqIHJlcG9ydHMgQUZURVIgdGhleSBtb3ZlZCwgYW5kIHRoZSBvbmx5IHRoaW5nIHRoYXQgcmVsaWFibHkgc3Vydml2ZXMgdGhhdCBnYXAgaXMgdGhlIGxpbmsncyBURVhULlxuICogRGVsaWJlcmF0ZWx5IGV4Y2x1ZGVzIGBwb3NpdGlvbmA6IGtleWluZyBvbiB0aGUgd2hvbGUge0BsaW5rIFJlZmVyZW5jZX0gbWVhbnQgdGhhdCBhcyBzb29uIGFzIGFueXRoaW5nXG4gKiBlZGl0ZWQgdGhlIGZpbGUgaW4gYmV0d2VlbiBcdTIwMTQgYSBjby1pbnN0YWxsZWQgcGx1Z2luIHJld3JpdGluZyBpdHMgb3duIGxpbmtzLCBtb3N0IG9mdGVuIFx1MjAxNCBldmVyeSBsaW5rIGJlbG93XG4gKiB0aGUgZWRpdCBzaGlmdGVkIGl0cyBvZmZzZXRzLCBtaXNzZWQgaXRzIGtleSwgYW5kIHdhcyBza2lwcGVkIGluIHNpbGVuY2UsIGxlYXZpbmcgdGhlIG5vdGUgd2l0aCBzb21lIGVtYmVkc1xuICogcmV3cml0dGVuIGFuZCB0aGUgcmVzdCBicm9rZW4uIFNlZVxuICogaHR0cHM6Ly9naXRodWIuY29tL21uYW91bW92L29ic2lkaWFuLWN1c3RvbS1hdHRhY2htZW50LWxvY2F0aW9uL2lzc3Vlcy82MC5cbiAqXG4gKiBUd28gbGlua3Mgd2l0aCBpZGVudGljYWwgdGV4dCBpbiBvbmUgZmlsZSBuZWNlc3NhcmlseSByZXNvbHZlIHRvIHRoZSBzYW1lIHRhcmdldCwgc28gY29sbGFwc2luZyB0aGVtIG9udG9cbiAqIG9uZSBrZXkgbG9zZXMgbm90aGluZy5cbiAqXG4gKiBAcGFyYW0gbGluayAtIFRoZSBsaW5rIHRvIGJ1aWxkIHRoZSBrZXkgZm9yLlxuICogQHJldHVybnMgVGhlIGtleSBpZGVudGlmeWluZyB0aGUgbGluayBieSBpdHMgdGV4dCBhbG9uZS5cbiAqL1xuZnVuY3Rpb24gZ2V0TGlua0lkZW50aXR5S2V5KGxpbms6IFJlZmVyZW5jZSk6IHN0cmluZyB7XG4gIHJldHVybiB0b0pzb24oe1xuICAgIGxpbms6IGxpbmsubGluayxcbiAgICBvcmlnaW5hbDogbGluay5vcmlnaW5hbFxuICB9KTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cblxuZXhwb3J0IHsgRW1wdHlGb2xkZXJCZWhhdmlvciB9IGZyb20gJy4uL3ZhdWx0LnRzJztcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQW1CQSxtQkFBOEI7QUFDOUIsbUJBQTJCO0FBQzNCLDBCQUdPO0FBQ1Asa0JBTU87QUFFUCw2QkFHTztBQUNQLHFCQUFrQjtBQUNsQixzQkFHTztBQWFQLDZCQUtPO0FBQ1Asb0JBQW9DO0FBQ3BDLG1CQUF1QztBQUN2QywwQkFBMEM7QUFDMUMseUJBVU87QUFDUCxrQkFNTztBQUNQLDRCQU9PO0FBQ1Asc0NBQXlDO0FBQ3pDLG1CQUEyQjtBQUMzQiwyQkFBa0Q7QUFDbEQsMEJBQWdDO0FBQ2hDLG1CQU9PO0FBQ1AsMEJBQTRCO0FBQzVCLHFDQUdPO0FBNGdEUCxJQUFBQSxnQkFBb0M7QUEzNENwQyxNQUFNLGNBQWMsdUJBQU8sSUFBSSxxQkFBcUI7QUE4Q3BELE1BQU0sY0FBYztBQUFBLEVBQ0Q7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBRVYsWUFBWSxRQUF3QztBQUN6RCxTQUFLLE1BQU0sT0FBTztBQUNsQixTQUFLLE9BQU8sT0FBTztBQUNuQixTQUFLLGNBQWMsT0FBTztBQUMxQixTQUFLLHdCQUF3QixPQUFPO0FBQ3BDLFNBQUssa0JBQWtCLE9BQU87QUFDOUIsU0FBSywwQkFBMEIsT0FBTztBQUFBLEVBQ3hDO0FBQUEsRUFFQSxNQUFhLFNBQXdCO0FBQ25DLFNBQUssWUFBWSxlQUFlO0FBQ2hDLDZDQUF1QixrQ0FBa0MsRUFBRSxpQkFBaUIsS0FBSyxLQUFLLElBQUksRUFBRTtBQUM1RixRQUFJLEtBQUMsMkJBQU8sS0FBSyxJQUFJLEdBQUc7QUFDdEI7QUFBQSxJQUNGO0FBRUEsUUFBSSxNQUFNLEtBQUssSUFBSSxNQUFNLFFBQVEsT0FBTyxLQUFLLEtBQUssSUFBSSxHQUFHO0FBQ3ZELCtDQUF1QixrQ0FBa0M7QUFBQSxRQUN2RCw4QkFBOEIsS0FBSyxLQUFLLElBQUk7QUFBQSxNQUM5QztBQUNBO0FBQUEsSUFDRjtBQUVBLFVBQU0sV0FBVyxLQUFLLGdCQUFnQixZQUFZO0FBRWxELFFBQUksU0FBUyxnQkFBZ0IsS0FBSyxLQUFLLElBQUksR0FBRztBQUM1QywrQ0FBdUIsa0NBQWtDLEVBQUUsOEJBQThCLEtBQUssS0FBSyxJQUFJLDBCQUEwQjtBQUNqSTtBQUFBLElBQ0Y7QUFFQSxVQUFNLG9CQUFvQixvQkFBSSxJQUFZLEtBQUMscUJBQVEsS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDO0FBRW5FLFFBQUksU0FBUyx1QkFBdUI7QUFDbEMsWUFBTSxRQUFRLEtBQUssd0JBQXdCLElBQUksS0FBSyxLQUFLLElBQUk7QUFDN0QsV0FBSyx3QkFBd0IsT0FBTyxLQUFLLEtBQUssSUFBSTtBQUNsRCxVQUFJLE9BQU87QUFDVCxjQUFNLFlBQVEsZ0NBQVMsRUFBRSxNQUFNLENBQUM7QUFFaEMsbUJBQVcsUUFBUSxPQUFPO0FBQ3hCLGdCQUFNLHFCQUFpQiw2QkFBZ0IsRUFBRSxLQUFLLEtBQUssS0FBSyxNQUFNLGtCQUFrQixLQUFLLEtBQUssS0FBSyxDQUFDO0FBQ2hHLGNBQUksQ0FBQyxrQkFBa0IsS0FBSyxnQkFBZ0IsU0FBUyxlQUFlLElBQUksR0FBRztBQUN6RTtBQUFBLFVBQ0Y7QUFFQSw0QkFBa0IsSUFBSSxlQUFlLFFBQVEsUUFBUSxFQUFFO0FBQ3ZELG9CQUFNLHFDQUFnQjtBQUFBLFlBQ3BCLEtBQUssS0FBSztBQUFBLFlBQ1YsaUJBQWlCLEtBQUssS0FBSztBQUFBLFlBQzNCLFlBQVk7QUFBQSxZQUNaLHFCQUFxQixLQUFLLG9CQUFvQixLQUFLLElBQUk7QUFBQSxZQUN2RCwwQkFBMEIsU0FBUyx3QkFBd0IsaUNBQW9CO0FBQUEsVUFDakYsQ0FBQztBQUNELGVBQUssWUFBWSxlQUFlO0FBQUEsUUFDbEM7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUVBLHNCQUFrQixPQUFPLEVBQUU7QUFDM0IsY0FBTSxrQ0FBb0I7QUFBQSxNQUN4QixLQUFLLEtBQUs7QUFBQSxNQUNWLHFCQUFxQixTQUFTLHVCQUF1QixpQ0FBb0I7QUFBQSxNQUN6RSxhQUFhLENBQUMsR0FBRyxpQkFBaUI7QUFBQSxJQUNwQyxDQUFDO0FBQ0QsU0FBSyxZQUFZLGVBQWU7QUFFaEMsUUFBSSxDQUFDLFNBQVMsdUJBQXVCO0FBQ25DO0FBQUEsSUFDRjtBQUVBLFVBQU0sdUJBQXVCLFVBQU0sZ0RBQXdCO0FBQUEsTUFDekQsS0FBSyxLQUFLO0FBQUEsTUFDVixTQUFTLDZDQUFzQjtBQUFBLE1BQy9CLGdCQUFnQixLQUFLLEtBQUs7QUFBQSxJQUM1QixDQUFDO0FBQ0QsVUFBTSx1QkFBbUIsb0NBQWdCLEVBQUUsS0FBSyxLQUFLLEtBQUssY0FBYyxxQkFBcUIsQ0FBQztBQUU5RixRQUNFLENBQUMsb0JBQW9CLENBQUMsVUFBTSwrQ0FBdUI7QUFBQSxNQUNqRCxLQUFLLEtBQUs7QUFBQSxNQUNWLFNBQVMsNkNBQXNCO0FBQUEsTUFDL0IsTUFBTSxLQUFLLEtBQUs7QUFBQSxJQUNsQixDQUFDLEdBQ0Q7QUFDQTtBQUFBLElBQ0Y7QUFFQSxTQUFLLFlBQVksZUFBZTtBQUVoQyxjQUFNLHFDQUFnQjtBQUFBLE1BQ3BCLEtBQUssS0FBSztBQUFBLE1BQ1YsaUJBQWlCLEtBQUssS0FBSztBQUFBLE1BQzNCLFlBQVk7QUFBQSxNQUNaLHFCQUFxQixLQUFLLG9CQUFvQixLQUFLLElBQUk7QUFBQSxNQUN2RCwwQkFBMEIsU0FBUyx3QkFBd0IsaUNBQW9CO0FBQUEsSUFDakYsQ0FBQztBQUNELFNBQUssWUFBWSxlQUFlO0FBQUEsRUFDbEM7QUFBQSxFQUVRLG9CQUFvQixjQUEyRDtBQUNyRixXQUFPLDZCQUE2QjtBQUFBLE1BQ2xDLEtBQUssS0FBSztBQUFBLE1BQ1YsdUJBQXVCLEtBQUs7QUFBQSxNQUM1QjtBQUFBLE1BQ0EsaUJBQWlCLEtBQUs7QUFBQSxJQUN4QixDQUFDO0FBQUEsRUFDSDtBQUNGO0FBb0JBLE1BQU0sdUNBQXVDLHFEQUFzQjtBQUFBLEVBQ2hEO0FBQUEsRUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFTQSxzQkFBc0Isb0JBQUksSUFBWTtBQUFBLEVBRXRDO0FBQUEsRUFFVixZQUFZLFFBQXlEO0FBQzFFLFVBQU07QUFDTixTQUFLLE1BQU0sT0FBTztBQUNsQixTQUFLLHdCQUF3QixPQUFPO0FBQ3BDLFNBQUssa0JBQWtCLE9BQU87QUFBQSxFQUNoQztBQUFBLEVBRWdCLFNBQWU7QUFDN0IsU0FBSyxvQkFBOEM7QUFBQSxNQUNqRCxTQUFTLDRCQUFZO0FBQUEsTUFDckIsWUFBWTtBQUFBLE1BQ1osY0FBYyxDQUFDLEVBQUUsVUFBVSxtQkFBbUIsQ0FBQyxJQUFJLEdBQUcsb0JBQW9CLE1BQ3hFLEtBQUssZUFBZSxNQUFNLFVBQVUsT0FBTyxpQkFBaUI7QUFDMUQsY0FBTSxvQkFBb0IsWUFBWTtBQUFBLE1BQ3hDLENBQUM7QUFBQSxJQUNMLENBQUM7QUFDRCxTQUFLLG9CQUFxQztBQUFBLE1BQ3hDLFNBQVMsc0JBQU07QUFBQSxNQUNmLFlBQVk7QUFBQSxNQUNaLGNBQWMsQ0FBQyxFQUFFLFVBQVUsbUJBQW1CLENBQUMsTUFBTSxLQUFLLEdBQUcsb0JBQW9CLE1BQy9FLEtBQUssZUFBZSxNQUFNLFVBQVUsT0FBTyxpQkFBaUI7QUFDMUQsY0FBTSxvQkFBb0IsY0FBYyxLQUFLO0FBQUEsTUFDL0MsQ0FBQztBQUFBLElBQ0wsQ0FBQztBQUNELFNBQUssb0JBQW9DO0FBQUEsTUFDdkMsU0FBUyxzQkFBTTtBQUFBLE1BQ2YsWUFBWTtBQUFBLE1BQ1osY0FBYyxDQUFDLEVBQUUsVUFBVSxtQkFBbUIsQ0FBQyxNQUFNLE1BQU0sR0FBRyxvQkFBb0IsTUFDaEYsS0FBSyxlQUFlLE1BQU0sVUFBVSxPQUFPLGlCQUFpQjtBQUMxRCxjQUFNLG9CQUFvQixjQUFjLE1BQU07QUFBQSxNQUNoRCxDQUFDO0FBQUEsSUFDTCxDQUFDO0FBQUEsRUFDSDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVVRLHdCQUF3QixRQUFpQixVQUE2RDtBQUM1RyxVQUFNLG1CQUFtQixvQkFBSSxJQUFZO0FBQ3pDLDBCQUFNLGdCQUFnQixRQUFRLENBQUMsVUFBVTtBQUN2QyxjQUFJLDJCQUFPLEtBQUssTUFBTSxTQUFTLFNBQVMsTUFBTSxJQUFJLEtBQUssUUFBUTtBQUM3RCx5QkFBaUIsSUFBSSxNQUFNLElBQUk7QUFBQSxNQUNqQztBQUFBLElBQ0YsQ0FBQztBQUNELFdBQU87QUFBQSxFQUNUO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFXQSxNQUFjLDZCQUNaLFFBQ0Esa0JBQ0EsVUFDbUI7QUFDbkIsVUFBTSxpQkFBMEIsQ0FBQztBQUNqQywwQkFBTSxnQkFBZ0IsUUFBUSxDQUFDLFVBQVU7QUFDdkMsY0FBSSwyQkFBTyxLQUFLLEtBQUssRUFBRSxTQUFTLFNBQVMsTUFBTSxJQUFJLEtBQUssUUFBUTtBQUM5RCx1QkFBZSxLQUFLLEtBQUs7QUFBQSxNQUMzQjtBQUFBLElBQ0YsQ0FBQztBQUVELFVBQU0sMkJBQXFDLENBQUM7QUFFNUMsZUFBVyxpQkFBaUIsZ0JBQWdCO0FBQzFDLFlBQU0sWUFBWSxVQUFNLCtDQUF3QixFQUFFLEtBQUssS0FBSyxLQUFLLFlBQVksY0FBYyxDQUFDO0FBQzVGLGlCQUFXLG1CQUFtQixrQkFBa0I7QUFDOUMsa0JBQVUsTUFBTSxlQUFlO0FBQUEsTUFDakM7QUFDQSxVQUFJLFVBQVUsTUFBTSxNQUFNLEdBQUc7QUFDM0IsaUNBQXlCLEtBQUssY0FBYyxJQUFJO0FBQUEsTUFDbEQ7QUFBQSxJQUNGO0FBRUEsV0FBTztBQUFBLEVBQ1Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFVUSxlQUNOLE1BQ0EsVUFDQSxvQkFDZTtBQUNmLFdBQU8sS0FBSyxxQkFBcUIsSUFBSSxJQUFJLEtBQUsscUJBQXFCLE1BQU0sVUFBVSxrQkFBa0IsSUFBSSxTQUFTO0FBQUEsRUFDcEg7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFVQSxNQUFjLHFCQUNaLFFBQ0EsVUFDQSxvQkFDZTtBQUNmLFVBQU0sV0FBVyxLQUFLLGdCQUFnQixZQUFZO0FBQ2xELFVBQU0sbUJBQW1CLEtBQUssd0JBQXdCLFFBQVEsUUFBUTtBQUN0RSxVQUFNLDJCQUEyQixNQUFNLEtBQUssNkJBQTZCLFFBQVEsa0JBQWtCLFFBQVE7QUFFM0csUUFBSSx5QkFBeUIsV0FBVyxHQUFHO0FBQ3pDLCtDQUF1QixzQ0FBc0MsRUFBRSx5QkFBeUIsT0FBTyxJQUFJLHlCQUF5QjtBQUM1SCxZQUFNLFNBQVM7QUFDZjtBQUFBLElBQ0Y7QUFFQSw2Q0FBdUIsc0NBQXNDO0FBQUEsTUFDM0QsY0FBYyx5QkFBeUIsT0FBTyxTQUFTLENBQUMsd0RBQXdELE9BQU8sSUFBSSxTQUFLLDRCQUFPLHdCQUF3QixDQUFDO0FBQUEsSUFDbEs7QUFFQSxTQUFLLG9CQUFvQixJQUFJLE9BQU8sSUFBSTtBQUN4QyxRQUFJO0FBQ0YsZ0JBQU0scUNBQWdCO0FBQUEsUUFDcEIsS0FBSyxLQUFLO0FBQUEsUUFDVjtBQUFBLFFBQ0Esa0JBQWtCLENBQUMsR0FBRyxnQkFBZ0I7QUFBQSxRQUN0QyxZQUFZO0FBQUEsUUFDWix1QkFBdUIsS0FBSztBQUFBLFFBQzVCLHFCQUFxQixLQUFLLG9CQUFvQixLQUFLLElBQUk7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsUUFNdkQsMEJBQTBCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxRQUsxQiwwQkFBMEIsQ0FBQyxrQkFBa0IsRUFBRSxTQUFTLFNBQVMsY0FBYyxJQUFJLEtBQUs7QUFBQSxNQUMxRixDQUFDO0FBQUEsSUFDSCxVQUFFO0FBQ0EsV0FBSyxvQkFBb0IsT0FBTyxPQUFPLElBQUk7QUFBQSxJQUM3QztBQUFBLEVBQ0Y7QUFBQSxFQUVRLG9CQUFvQixjQUEyRDtBQUNyRixXQUFPLDZCQUE2QjtBQUFBLE1BQ2xDLEtBQUssS0FBSztBQUFBLE1BQ1YsdUJBQXVCLEtBQUs7QUFBQSxNQUM1QjtBQUFBLE1BQ0EsaUJBQWlCLEtBQUs7QUFBQSxJQUN4QixDQUFDO0FBQUEsRUFDSDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBV1EscUJBQXFCLE1BQXNDO0FBQ2pFLFFBQUksS0FBQyw2QkFBUyxJQUFJLEdBQUc7QUFDbkIsYUFBTztBQUFBLElBQ1Q7QUFFQSxVQUFNLFdBQVcsS0FBSyxnQkFBZ0IsWUFBWTtBQUNsRCxRQUFJLENBQUMsU0FBUywwQkFBMEIsU0FBUyxnQkFBZ0IsS0FBSyxJQUFJLEtBQUssUUFBUTtBQUNyRixhQUFPO0FBQUEsSUFDVDtBQUVBLGVBQVcsc0JBQXNCLEtBQUsscUJBQXFCO0FBQ3pELGNBQUksNEJBQWMsRUFBRSxLQUFLLEtBQUssS0FBSyxpQkFBaUIsS0FBSyxNQUFNLGtCQUFrQixtQkFBbUIsQ0FBQyxHQUFHO0FBQ3RHLGVBQU87QUFBQSxNQUNUO0FBQUEsSUFDRjtBQUVBLFdBQU87QUFBQSxFQUNUO0FBQ0Y7QUFFQSxNQUFNLG9EQUFvRCxxREFBc0I7QUFBQSxFQUM3RDtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFFVixZQUFZLFFBQXNFO0FBQ3ZGLFVBQU07QUFDTixTQUFLLE1BQU0sT0FBTztBQUNsQixTQUFLLGNBQWMsT0FBTztBQUMxQixTQUFLLGtCQUFrQixPQUFPO0FBQUEsRUFDaEM7QUFBQSxFQUVnQixTQUFlO0FBQzdCLFNBQUssb0JBQW9CO0FBQUEsTUFDdkIsU0FBUyxLQUFLO0FBQUEsTUFDZCxZQUFZO0FBQUEsTUFDWixjQUFjLENBQUM7QUFBQSxRQUNiO0FBQUEsUUFDQSxtQkFBbUIsQ0FBQyxrQkFBa0I7QUFBQSxRQUN0QztBQUFBLFFBQ0E7QUFBQSxNQUNGLE1BQU07QUFDSixnQkFBSSw4Q0FBYyxnQkFBZ0IsV0FBVyxHQUFHO0FBQzlDLGlCQUFPLFNBQVM7QUFBQSxRQUNsQjtBQUVBLGNBQU0sYUFBaUMsQ0FBQyxnQkFBZ0IsS0FBSyx1QkFBdUIsYUFBYSxrQkFBa0I7QUFDbkgsZUFBTyxvQkFBb0IsVUFBVTtBQUFBLE1BQ3ZDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQW9CQSxZQUFZO0FBQUEsSUFDZCxDQUFDO0FBQUEsRUFDSDtBQUFBLEVBRUEsTUFBYyx1QkFBdUIsYUFBMkIsb0JBQXVEO0FBQ3JILFFBQUksaUJBQWlCO0FBQ3JCLFFBQUksOEJBQThCO0FBQ2xDLFVBQU0sV0FBVyxLQUFLLElBQUksTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLFlBQVk7QUFDOUQsdUJBQWlCO0FBU2pCLGNBQUksd0RBQWtDLEtBQUssS0FBSyxLQUFLLElBQUksU0FBSyx3REFBa0MsS0FBSyxLQUFLLE9BQU8sR0FBRztBQUNsSCxzQ0FBOEI7QUFBQSxNQUNoQztBQUFBLElBQ0YsQ0FBQztBQUNELFFBQUk7QUFDRixZQUFNLG1CQUFtQixXQUFXO0FBQUEsSUFDdEMsVUFBRTtBQUNBLFdBQUssSUFBSSxNQUFNLE9BQU8sUUFBUTtBQUFBLElBQ2hDO0FBQ0EsVUFBTSxXQUFXLEtBQUssZ0JBQWdCLFlBQVk7QUFFbEQsUUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsdUJBQXVCLDZCQUE2QjtBQUNuRjtBQUFBLElBQ0Y7QUFFQTtBQUFBLE1BQ0U7QUFBQSxNQUNBLENBQUMsZUFBZTtBQUNkLFlBQUksU0FBUyxnQkFBZ0IsV0FBVyxXQUFXLElBQUksR0FBRztBQUN4RCxtREFBdUIsd0NBQXdDO0FBQUEsWUFDN0QsbURBQW1ELFdBQVcsV0FBVyxJQUFJO0FBQUEsVUFDL0U7QUFDQSxpQkFBTztBQUFBLFFBQ1Q7QUFFQSxZQUFJLFNBQVMsZ0JBQWdCLFdBQVcsYUFBYSxJQUFJLEdBQUc7QUFDMUQsbURBQXVCLHdDQUF3QztBQUFBLFlBQzdELHFEQUFxRCxXQUFXLGFBQWEsSUFBSTtBQUFBLFVBQ25GO0FBQ0EsaUJBQU87QUFBQSxRQUNUO0FBRUEsZUFBTyxLQUFLLElBQUksZ0JBQWdCLHFCQUFxQiwwQ0FBbUIsTUFBTSxNQUFNLFFBQVEsS0FBQyw4Q0FBdUIsS0FBSyxHQUFHLE1BQ3RILFdBQVcsV0FBVyxjQUFjLDRDQUF5QixXQUFXLGFBQWEsY0FBYztBQUFBLE1BQzNHO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRjtBQUVBLE1BQU0sZUFBZTtBQUFBLEVBQ0YsTUFBTSxvQkFBSSxJQUE4QjtBQUFBLEVBRWxELElBQUksU0FBaUIsU0FBdUI7QUFDakQsU0FBSyxJQUFJLElBQUksS0FBSyxZQUFZLFNBQVMsT0FBTyxHQUFHLEVBQUUsU0FBUyxRQUFRLENBQUM7QUFBQSxFQUN2RTtBQUFBLEVBRU8sT0FBTyxTQUFpQixTQUF1QjtBQUNwRCxTQUFLLElBQUksT0FBTyxLQUFLLFlBQVksU0FBUyxPQUFPLENBQUM7QUFBQSxFQUNwRDtBQUFBLEVBRU8sSUFBSSxTQUFpQixTQUEwQjtBQUNwRCxXQUFPLEtBQUssSUFBSSxJQUFJLEtBQUssWUFBWSxTQUFTLE9BQU8sQ0FBQztBQUFBLEVBQ3hEO0FBQUEsRUFFTyxPQUEyQztBQUNoRCxXQUFPLEtBQUssSUFBSSxPQUFPO0FBQUEsRUFDekI7QUFBQSxFQUVRLFlBQVksU0FBaUIsU0FBeUI7QUFDNUQsV0FBTyxHQUFHLE9BQU8sT0FBTyxPQUFPO0FBQUEsRUFDakM7QUFDRjtBQUVBLE1BQU0sdUJBQXVCO0FBQUEsRUFDVjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBRVYsWUFBWSxRQUFpRDtBQUNsRSxTQUFLLDBCQUEwQixPQUFPO0FBQ3RDLFNBQUssT0FBTyxPQUFPO0FBQ25CLFNBQUssZ0JBQWdCLE9BQU87QUFDNUIsU0FBSyxrQkFBa0IsT0FBTztBQUFBLEVBQ2hDO0FBQUEsRUFFTyxTQUFlO0FBQ3BCLFVBQU0sV0FBVyxLQUFLLGdCQUFnQixZQUFZO0FBRWxELFFBQUksQ0FBQyxTQUFTLHVCQUF1QjtBQUNuQztBQUFBLElBQ0Y7QUFFQSxRQUFJLFNBQVMsZ0JBQWdCLEtBQUssS0FBSyxJQUFJLEdBQUc7QUFDNUMsK0NBQXVCLDJDQUEyQyxFQUFFLHVDQUF1QyxLQUFLLEtBQUssSUFBSSwwQkFBMEI7QUFDbko7QUFBQSxJQUNGO0FBRUEsWUFBSSxtQ0FBZSxLQUFLLElBQUksS0FBSyxLQUFLLGVBQWU7QUFDbkQsV0FBSyx3QkFBd0IsSUFBSSxLQUFLLEtBQUssTUFBTSxLQUFLLGFBQWE7QUFBQSxJQUNyRTtBQUFBLEVBQ0Y7QUFDRjtBQUVBLE1BQU0sY0FBYztBQUFBLEVBQ0Q7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUVWLFlBQVksUUFBd0M7QUFDekQsU0FBSyxjQUFjLE9BQU87QUFDMUIsU0FBSyxNQUFNLE9BQU87QUFDbEIsU0FBSyx3QkFBd0IsT0FBTztBQUNwQyxTQUFLLGlCQUFpQixPQUFPO0FBQzdCLFNBQUssa0NBQWtDLE9BQU8sbUNBQW1DLG9CQUFJLElBQWlDO0FBQ3RILFNBQUssd0JBQXdCLE9BQU87QUFDcEMsU0FBSyw2QkFBNkIsT0FBTztBQUN6QyxTQUFLLFVBQVUsT0FBTztBQUN0QixTQUFLLFdBQVcsT0FBTztBQUN2QixTQUFLLFVBQVUsT0FBTztBQUN0QixTQUFLLHNCQUFzQixPQUFPO0FBQ2xDLFNBQUssd0JBQXdCLE9BQU87QUFDcEMsU0FBSyxrQkFBa0IsT0FBTztBQUFBLEVBQ2hDO0FBQUEsRUFFQSxNQUFhLFNBQXdCO0FBQ25DLFFBQUksS0FBSyxZQUFZLEtBQUssU0FBUztBQUNqQztBQUFBLElBQ0Y7QUFDQSxTQUFLLFlBQVksZUFBZTtBQVdoQyxjQUFNLCtDQUEwQixLQUFLLEdBQUc7QUFDeEMsU0FBSyxZQUFZLGVBQWU7QUFFaEMsVUFBTSxLQUFLLDJCQUEyQjtBQUN0QyxTQUFLLFlBQVksZUFBZTtBQUdoQyxRQUFJLEtBQUssZ0JBQWdCLFlBQVksRUFBRSxxQkFBcUI7QUFDMUQsWUFBTSxLQUFLLGFBQWE7QUFDeEIsV0FBSyxZQUFZLGVBQWU7QUFBQSxJQUNsQztBQUVBLFFBQUksTUFBTSxLQUFLLG9CQUFvQixHQUFHO0FBQ3BDO0FBQUEsSUFDRjtBQUVBLFNBQUssWUFBWSxlQUFlO0FBRWhDLFVBQU0sd0JBQXdCLEtBQUs7QUFFbkMsVUFBTSx1QkFBbUIsMERBQXlCLG9CQUFvQixvQkFBSSxJQUFZLENBQUMsRUFBRTtBQUN6RixVQUFNLG1CQUFlLDBEQUF5QixvQkFBb0Isb0JBQUksSUFBWSxDQUFDLEVBQUU7QUFFckYsUUFBSTtBQUNGLFlBQU0sWUFBWSxJQUFJLFVBQVU7QUFBQSxRQUM5QixhQUFhLEtBQUs7QUFBQSxRQUNsQixLQUFLLEtBQUs7QUFBQSxRQUNWLFNBQVMsS0FBSztBQUFBLFFBQ2QsVUFBVSxLQUFLO0FBQUEsUUFDZixTQUFTLEtBQUs7QUFBQSxRQUNkLGlCQUFpQixLQUFLO0FBQUEsTUFDeEIsQ0FBQztBQUNELFlBQU0sVUFBVSxLQUFLO0FBQ3JCLFdBQUssWUFBWSxlQUFlO0FBRWhDLFlBQU0sV0FBVyxLQUFLLGdCQUFnQixZQUFZO0FBRWxELFlBQU0sdUJBQXVCLG9CQUFJLElBQWlDO0FBSWxFLFVBQUksU0FBUyxxQkFBcUI7QUFDaEMsa0JBQVUscUJBQXFCLG9CQUFvQjtBQUNuRCxrQkFBVSxpQkFBaUI7QUFBQSxVQUN6QjtBQUFBLFVBQ0EsTUFBTSxLQUFLO0FBQUEsVUFDWCxvQkFBb0IsS0FBSztBQUFBLFFBQzNCLENBQUM7QUFFRCxtQkFBVyxxQkFBcUIsVUFBVSxLQUFLLEdBQUc7QUFDaEQsY0FBSSxzQkFBc0IsS0FBSyxTQUFTO0FBQ3RDO0FBQUEsVUFDRjtBQUNBLGdCQUFNLDZCQUE2QixVQUFNLCtDQUF3QixFQUFFLEtBQUssS0FBSyxLQUFLLFlBQVksa0JBQWtCLENBQUM7QUFDakgsZ0JBQU0sZ0NBQWdDLDJCQUEyQjtBQUNqRSxlQUFLLFlBQVksZUFBZTtBQUNoQyxvQkFBVSxpQkFBaUI7QUFBQSxZQUN6QjtBQUFBLFlBQ0EsTUFBTTtBQUFBLFlBQ04sb0JBQW9CO0FBQUEsVUFDdEIsQ0FBQztBQUFBLFFBQ0g7QUFBQSxNQUNGO0FBRUEsWUFBTSxvQkFBb0Isb0JBQUksSUFBWTtBQUUxQyxpQkFBVyxDQUFDLG1CQUFtQixpQkFBaUIsS0FBSyxVQUFVLFFBQVEsR0FBRztBQUN4RSxZQUFJLHNCQUFzQixLQUFLLFNBQVM7QUFDdEMsZ0JBQU0seUJBQXlCLE1BQU0sS0FBSyxjQUFjLG1CQUFtQixpQkFBaUI7QUFDNUYsZUFBSyxZQUFZLGVBQWU7QUFDaEMsb0JBQVUsSUFBSSxtQkFBbUIsc0JBQXNCO0FBQUEsUUFDekQ7QUFDQSxZQUFJLENBQUMsS0FBSyxnQkFBZ0IsU0FBUyxpQkFBaUIsR0FBRztBQUNyRCw0QkFBa0IsUUFBSSxxQkFBUSxpQkFBaUIsQ0FBQztBQUFBLFFBQ2xEO0FBQUEsTUFDRjtBQUVBLGdCQUFNLGtDQUFvQjtBQUFBLFFBQ3hCLEtBQUssS0FBSztBQUFBLFFBQ1YscUJBQXFCLFNBQVMsdUJBQXVCLGlDQUFvQjtBQUFBLFFBQ3pFLGFBQWEsQ0FBQyxHQUFHLGlCQUFpQjtBQUFBLE1BQ3BDLENBQUM7QUFDRCxXQUFLLFlBQVksZUFBZTtBQU9oQyxVQUFJLENBQUMsU0FBUyxxQkFBcUI7QUFDakM7QUFBQSxNQUNGO0FBUUEsaUJBQVcsQ0FBQyx5QkFBeUIsMkJBQTJCLEtBQUssS0FBSyxpQ0FBaUM7QUFDekcsY0FBTSxtQkFBbUIscUJBQXFCLElBQUksdUJBQXVCO0FBQ3pFLFlBQUksQ0FBQyxrQkFBa0I7QUFDckIsK0JBQXFCLElBQUkseUJBQXlCLDJCQUEyQjtBQUM3RTtBQUFBLFFBQ0Y7QUFFQSxtQkFBVyxDQUFDLFNBQVMsYUFBYSxLQUFLLDZCQUE2QjtBQUNsRSxjQUFJLENBQUMsaUJBQWlCLElBQUksT0FBTyxHQUFHO0FBQ2xDLDZCQUFpQixJQUFJLFNBQVMsYUFBYTtBQUFBLFVBQzdDO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFFQSxZQUFNLGNBQWMsb0JBQUksSUFBb0I7QUFDNUMsZ0JBQU0sdUNBQXNCLGlEQUFpRTtBQUFBLFFBQzNGLGFBQWEsS0FBSztBQUFBLFFBQ2xCLEtBQUssS0FBSztBQUFBLFFBQ1YsZUFBZSxDQUFDLEVBQUUsTUFBTSxTQUFTLG1CQUFtQixZQUFZLGdCQUFnQixNQUFNO0FBQ3BGLGdCQUFNLGFBQWEsWUFBWSxJQUFJLGVBQWUsS0FBSyxLQUFLO0FBQzVELHNCQUFZLElBQUksaUJBQWlCLFNBQVM7QUFFMUMsY0FBSSxDQUFDLG1CQUFtQjtBQVF0QixxREFBdUIscUNBQXFDO0FBQUEsY0FDMUQsa0NBQThCLDRCQUFPLElBQUksQ0FBQyxPQUFPLGVBQWU7QUFBQSxZQUNsRTtBQUNBO0FBQUEsVUFDRjtBQUVBLGdCQUFNLG9CQUFvQixVQUFVLElBQUksaUJBQWlCLEtBQUs7QUFFOUQsMkJBQWlCLElBQUksZUFBZTtBQUNwQyx1QkFBYSxJQUFJLEdBQUcsZUFBZSxLQUFLLE9BQU8sU0FBUyxDQUFDLEVBQUU7QUFFM0QscUJBQU8sNEJBQVcsaURBQThDO0FBQUEsWUFDOUQsS0FBSyxLQUFLO0FBQUEsWUFDVjtBQUFBLFlBQ0EscUJBQXFCO0FBQUEsWUFDckIscUJBQXFCO0FBQUEsWUFDckIscUJBQXFCO0FBQUEsWUFDckIsMkJBQTJCLFNBQVM7QUFBQSxVQUN0QyxDQUFDLENBQUM7QUFBQSxRQUNKO0FBQUEsUUFDQSw0QkFBNEIsS0FBSyw4QkFBOEI7QUFBQSxRQUMvRDtBQUFBLFFBQ0EsdUJBQXVCLEtBQUs7QUFBQSxRQUM1Qix5QkFBeUI7QUFBQTtBQUFBLFFBRXpCLDJCQUEyQjtBQUFBLFFBQzNCLFVBQVU7QUFBQSxNQUNaLENBQUMsQ0FBQztBQUNGLFdBQUssWUFBWSxlQUFlO0FBRWhDLGNBQUksMkJBQU8sS0FBSyxPQUFPLEdBQUc7QUFDeEIsa0JBQU0sbUNBQWtCLGlEQUFxRDtBQUFBLFVBQzNFLEtBQUssS0FBSztBQUFBLFVBQ1YscUJBQXFCLEtBQUs7QUFBQSxVQUMxQixxQkFBcUIsS0FBSztBQUFBLFVBQzFCO0FBQUEsVUFDQSx1QkFBdUIsS0FBSztBQUFBLFVBQzVCLHlCQUF5QjtBQUFBLFVBQ3pCLDJCQUEyQixTQUFTO0FBQUEsUUFDdEMsQ0FBQyxDQUFDO0FBQ0YsYUFBSyxZQUFZLGVBQWU7QUFBQSxNQUNsQztBQUVBLFVBQUksS0FBQyxrQ0FBYyxFQUFFLEtBQUssS0FBSyxLQUFLLFlBQVksS0FBSyxRQUFRLENBQUMsR0FBRztBQUMvRCxZQUFJLHFCQUFxQixLQUFLLHNCQUFzQixJQUFJLEtBQUssT0FBTztBQUNwRSxZQUFJLENBQUMsb0JBQW9CO0FBQ3ZCLCtCQUFxQixDQUFDO0FBQ3RCLGVBQUssc0JBQXNCLElBQUksS0FBSyxTQUFTLGtCQUFrQjtBQUFBLFFBQ2pFO0FBQ0EsMkJBQW1CLEtBQUs7QUFBQSxVQUN0QjtBQUFBLFVBQ0EsU0FBUyxLQUFLO0FBQUEsUUFDaEIsQ0FBQztBQUFBLE1BQ0g7QUFBQSxJQUNGLFVBQUU7QUFDQSxZQUFNLGFBQWEsQ0FBQyxHQUFHLEtBQUssZUFBZSxLQUFLLENBQUM7QUFDakQsbUNBQVc7QUFBQSxRQUNULGFBQWEsS0FBSztBQUFBLFFBQ2xCLG1CQUFtQixNQUFNO0FBQ3ZCLHFCQUFXLGFBQWEsWUFBWTtBQUNsQyxpQkFBSyxlQUFlLE9BQU8sVUFBVSxTQUFTLFVBQVUsT0FBTztBQUFBLFVBQ2pFO0FBRUEsY0FBSSxhQUFhLFNBQVMsR0FBRztBQUMzQjtBQUFBLFVBQ0Y7QUFDQSxnQ0FBc0IsZUFBVyxrQkFBRSxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsb0JBQW9CLGNBQWMsRUFBRSxZQUFZLGlCQUFpQixNQUFNLFlBQVksYUFBYSxLQUFLLENBQUMsQ0FBQztBQUNwSywyQkFBaUIsTUFBTTtBQUN2Qix1QkFBYSxNQUFNO0FBQUEsUUFDckI7QUFBQSxRQUNBLG1CQUFlLGtCQUFFLENBQUMsTUFBTSxFQUFFLGlCQUFpQixvQkFBb0IscUJBQXFCO0FBQUEsTUFDdEYsQ0FBQztBQUFBLElBQ0g7QUFBQSxFQUNGO0FBQUEsRUFFQSxNQUFjLDZCQUE0QztBQUN4RCxVQUFNLHFCQUFxQixLQUFLLHNCQUFzQixJQUFJLEtBQUssT0FBTztBQUN0RSxRQUFJLENBQUMsb0JBQW9CO0FBQ3ZCO0FBQUEsSUFDRjtBQUVBLFNBQUssc0JBQXNCLE9BQU8sS0FBSyxPQUFPO0FBQzlDLGVBQVcscUJBQXFCLG9CQUFvQjtBQUNsRCxZQUFNLElBQUksY0FBYztBQUFBLFFBQ3RCLGFBQWEsS0FBSztBQUFBLFFBQ2xCLEtBQUssS0FBSztBQUFBLFFBQ1YsZ0JBQWdCLEtBQUs7QUFBQSxRQUNyQixpQ0FBaUMsa0JBQWtCO0FBQUEsUUFDbkQsdUJBQXVCLEtBQUs7QUFBQSxRQUM1Qiw0QkFBNEIsS0FBSztBQUFBLFFBQ2pDLFNBQVMsS0FBSztBQUFBLFFBQ2QsVUFBVSxLQUFLO0FBQUEsUUFDZixTQUFTLGtCQUFrQjtBQUFBLFFBQzNCLHFCQUFxQixLQUFLO0FBQUEsUUFDMUIsdUJBQXVCLEtBQUs7QUFBQSxRQUM1Qix1QkFBdUIsS0FBSztBQUFBLFFBQzVCLGlCQUFpQixLQUFLO0FBQUEsTUFDeEIsQ0FBQyxFQUFFLE9BQU87QUFBQSxJQUNaO0FBQUEsRUFDRjtBQUFBLEVBRUEsTUFBYyxzQkFBd0M7QUFDcEQsUUFBSSxLQUFDLHlDQUFpQixLQUFLLEdBQUcsRUFBRSxlQUFlLEtBQUssUUFBUSxZQUFZLE1BQU0sS0FBSyxRQUFRLFlBQVksR0FBRztBQUN4RyxhQUFPO0FBQUEsSUFDVDtBQUVBLFVBQU0sb0JBQWdCLHNCQUFLLHFCQUFRLEtBQUssT0FBTyxHQUFHLGVBQVcsc0JBQVMsS0FBSyxPQUFPLENBQUMsRUFBRTtBQUNyRixVQUFNLEtBQUssY0FBYyxLQUFLLFNBQVMsYUFBYTtBQUVwRCxVQUFNLElBQUksY0FBYztBQUFBLE1BQ3RCLGFBQWEsS0FBSztBQUFBLE1BQ2xCLEtBQUssS0FBSztBQUFBLE1BQ1YsZ0JBQWdCLEtBQUs7QUFBQSxNQUNyQix1QkFBdUIsS0FBSztBQUFBLE1BQzVCLDRCQUE0QixLQUFLO0FBQUEsTUFDakMsU0FBUztBQUFBLE1BQ1QsVUFBVSxLQUFLO0FBQUEsTUFDZixTQUFTLEtBQUs7QUFBQSxNQUNkLHFCQUFxQixLQUFLO0FBQUEsTUFDMUIsdUJBQXVCLEtBQUs7QUFBQSxNQUM1Qix1QkFBdUIsS0FBSztBQUFBLE1BQzVCLGlCQUFpQixLQUFLO0FBQUEsSUFDeEIsQ0FBQyxFQUFFLE9BQU87QUFFVixVQUFNLEtBQUssSUFBSSxZQUFZLGVBQVcsNEJBQVEsRUFBRSxLQUFLLEtBQUssS0FBSyxZQUFZLGNBQWMsQ0FBQyxHQUFHLEtBQUssT0FBTztBQUN6RyxXQUFPO0FBQUEsRUFDVDtBQUFBLEVBRUEsTUFBYyxlQUE4QjtBQUMxQyxVQUFNLGtCQUFjLDRCQUFRLEVBQUUsS0FBSyxLQUFLLEtBQUssWUFBWSxLQUFLLFNBQVMsMEJBQTBCLEtBQUssQ0FBQztBQUN2RyxRQUFJO0FBQ0o7QUFDRTtBQUFBO0FBQUEsY0FBTSxnQkFBZ0IseURBQWMsS0FBSyxLQUFLLENBQUMsV0FBVyxDQUFDO0FBQzNELGNBQU0sdUJBQXVCLFVBQU0sK0NBQXdCLEVBQUUsS0FBSyxLQUFLLEtBQUssWUFBWSxZQUFZLENBQUM7QUFDckcsdUNBQStCLHFCQUFxQjtBQUFBLGVBRnBEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUdGO0FBRUEsZUFBVyxDQUFDLGNBQWMsY0FBYyxLQUFLLDhCQUE4QjtBQUN6RSxVQUFJLFdBQVcsS0FBSyxvQkFBb0IsSUFBSSxZQUFZO0FBQ3hELFVBQUksQ0FBQyxVQUFVO0FBQ2IsbUJBQVcsQ0FBQztBQUNaLGFBQUssb0JBQW9CLElBQUksY0FBYyxRQUFRO0FBQUEsTUFDckQ7QUFFQSxpQkFBVyxRQUFRLGdCQUFnQjtBQUNqQyxZQUFJLFNBQVMsU0FBUyxJQUFJLEdBQUc7QUFDM0I7QUFBQSxRQUNGO0FBQ0EsaUJBQVMsS0FBSyxJQUFJO0FBQUEsTUFDcEI7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUFBLEVBRUEsTUFBYyxjQUFjLFNBQWlCLFNBQWtDO0FBQzdFLGtCQUFVLGdDQUFrQixFQUFFLEtBQUssS0FBSyxLQUFLLFNBQVMsdUJBQXVCLFFBQVEsQ0FBQztBQUN0RixRQUFJLFlBQVksU0FBUztBQUN2QixhQUFPO0FBQUEsSUFDVDtBQUNBLFNBQUssZUFBZSxJQUFJLFNBQVMsT0FBTztBQUN4QyxjQUFVLFVBQU0seUJBQVcsRUFBRSxLQUFLLEtBQUssS0FBSyxTQUFTLHVCQUF1QixRQUFRLENBQUM7QUFDckYsV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQUVBLE1BQU0sVUFBVTtBQUFBLEVBQ0c7QUFBQSxFQUNBO0FBQUEsRUFDQSxNQUFNLG9CQUFJLElBQW9CO0FBQUEsRUFDOUI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFFVixZQUFZLFFBQW9DO0FBQ3JELFNBQUssY0FBYyxPQUFPO0FBQzFCLFNBQUssTUFBTSxPQUFPO0FBQ2xCLFNBQUssa0JBQWtCLE9BQU87QUFDOUIsU0FBSyxXQUFXLE9BQU87QUFDdkIsU0FBSyxVQUFVLE9BQU87QUFDdEIsU0FBSyxVQUFVLE9BQU87QUFDdEIsU0FBSyxlQUFlLEtBQUssZUFBVyxnQ0FBUyxFQUFFLE9BQU8sS0FBSyxTQUFTLENBQUMsSUFBSSxDQUFDO0FBQUEsRUFDNUU7QUFBQSxFQUVPLFVBQThDO0FBQ25ELFdBQU8sS0FBSyxJQUFJLFFBQVE7QUFBQSxFQUMxQjtBQUFBLEVBRUEsTUFBYSxPQUFzQjtBQUNqQyxTQUFLLFlBQVksZUFBZTtBQUNoQyxTQUFLLElBQUksSUFBSSxLQUFLLFNBQVMsS0FBSyxPQUFPO0FBRXZDLFFBQUksS0FBQywyQkFBTyxLQUFLLE9BQU8sR0FBRztBQUN6QjtBQUFBLElBQ0Y7QUFNQSxZQUFJLGlDQUFhLEtBQUssT0FBTyxHQUFHO0FBQzlCLFlBQU0sbUJBQW1CLFVBQU0sbUNBQW9CLEtBQUssS0FBSyxLQUFLLE9BQU87QUFDekUsV0FBSyxhQUFhLEtBQUssR0FBRyxnQkFBZ0I7QUFBQSxJQUM1QztBQUVBLFVBQU0sV0FBVyxLQUFLLGdCQUFnQixZQUFZO0FBRWxELFVBQU0sY0FBVSw0QkFBUSxFQUFFLEtBQUssS0FBSyxLQUFLLFlBQVksS0FBSyxTQUFTLDBCQUEwQixLQUFLLENBQUM7QUFDbkcsVUFBTSwwQkFBMEIsTUFBTSxLQUFLLDJCQUEyQixPQUFPO0FBRTdFLFVBQU0sMEJBQTBCLFNBQVMsK0JBQ3JDLFVBQU0sZ0RBQXdCO0FBQUEsTUFDOUIsS0FBSyxLQUFLO0FBQUEsTUFDVixTQUFTLDZDQUFzQjtBQUFBLE1BQy9CLGdCQUFnQixLQUFLO0FBQUEsSUFDdkIsQ0FBQyxJQUNDO0FBRUosVUFBTSw4QkFBOEIsNEJBQTRCO0FBRWhFLFVBQU0sMEJBQXNCLG9DQUFnQixFQUFFLEtBQUssS0FBSyxLQUFLLGNBQWMsd0JBQXdCLENBQUM7QUFFcEcsUUFBSSxDQUFDLHVCQUF3Qiw0QkFBNEIsMkJBQTJCLENBQUMsU0FBUyw2QkFBOEI7QUFDMUg7QUFBQSxJQUNGO0FBRUEsVUFBTSxxQkFBOEIsQ0FBQztBQUVyQyxRQUNFLFVBQU0sK0NBQXVCO0FBQUEsTUFDM0IsS0FBSyxLQUFLO0FBQUEsTUFDVixTQUFTLDZDQUFzQjtBQUFBLE1BQy9CLE1BQU0sS0FBSztBQUFBLElBQ2IsQ0FBQyxHQUNEO0FBQ0EsNEJBQU0sZ0JBQWdCLHFCQUFxQixDQUFDLHNCQUFzQjtBQUNoRSxhQUFLLFlBQVksZUFBZTtBQUNoQyxnQkFBSSwyQkFBTyxpQkFBaUIsR0FBRztBQUM3Qiw2QkFBbUIsS0FBSyxpQkFBaUI7QUFBQSxRQUMzQztBQUFBLE1BQ0YsQ0FBQztBQUFBLElBQ0gsT0FBTztBQUNMLGlCQUFXLGVBQWUsS0FBSyxjQUFjO0FBQzNDLGFBQUssWUFBWSxlQUFlO0FBQ2hDLGNBQU0sd0JBQW9CLDZCQUFnQixFQUFFLEtBQUssS0FBSyxLQUFLLE1BQU0sYUFBYSxrQkFBa0IsS0FBSyxRQUFRLENBQUM7QUFDOUcsWUFBSSxDQUFDLHFCQUFzQixDQUFDLCtCQUErQixDQUFDLGtCQUFrQixLQUFLLFdBQVcsdUJBQXVCLEdBQUk7QUFDdkg7QUFBQSxRQUNGO0FBRUEsY0FBTSx5QkFBeUIsVUFBTSwrQ0FBd0IsRUFBRSxLQUFLLEtBQUssS0FBSyxZQUFZLGtCQUFrQixDQUFDO0FBQzdHLGFBQUssWUFBWSxlQUFlO0FBQ2hDLGNBQU0sT0FBTyxJQUFJLElBQVksdUJBQXVCLEtBQUssQ0FBQztBQUMxRCxhQUFLLE9BQU8sS0FBSyxPQUFPO0FBQ3hCLGFBQUssT0FBTyxLQUFLLE9BQU87QUFDeEIsWUFBSSxLQUFLLFNBQVMsR0FBRztBQUNuQiw2QkFBbUIsS0FBSyxpQkFBaUI7QUFBQSxRQUMzQztBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBRUEsZUFBVyxxQkFBcUIsb0JBQW9CO0FBQ2xELFdBQUssWUFBWSxlQUFlO0FBQ2hDLFVBQUksS0FBSyxnQkFBZ0IsU0FBUyxrQkFBa0IsSUFBSSxHQUFHO0FBQ3pEO0FBQUEsTUFDRjtBQUVBLFVBQUk7QUFDSixVQUFJLFNBQVMsNkJBQTZCO0FBQ3hDLGdDQUF3QixVQUFNLDhDQUFzQjtBQUFBLFVBQ2xELEtBQUssS0FBSztBQUFBLFVBQ1YsU0FBUyw2Q0FBc0I7QUFBQSxVQUMvQixnQkFBZ0IsS0FBSztBQUFBLFVBQ3JCLHlCQUF5QjtBQUFBLFVBQ3pCLG1CQUFtQixLQUFLO0FBQUEsVUFDeEIsMEJBQTBCO0FBQUEsUUFDNUIsQ0FBQztBQUNELGFBQUssWUFBWSxlQUFlO0FBQUEsTUFDbEMsT0FBTztBQUNMLGNBQU0sZUFBZSw4QkFBOEIsa0JBQWtCLFdBQU8sc0JBQVMseUJBQXlCLGtCQUFrQixJQUFJO0FBQ3BJLGNBQU0sZ0JBQVksa0JBQUssNkJBQXlCLHFCQUFRLFlBQVksQ0FBQztBQUNyRSxvQ0FBd0Isa0JBQUssV0FBVyxrQkFBa0IsSUFBSTtBQUFBLE1BQ2hFO0FBRUEsVUFBSSxrQkFBa0IsU0FBUyx1QkFBdUI7QUFDcEQ7QUFBQSxNQUNGO0FBQ0EsVUFBSSxTQUFTLG9DQUFvQztBQUMvQyxjQUFNLHdCQUFvQixrQ0FBYyxFQUFFLEtBQUssS0FBSyxLQUFLLFlBQVksc0JBQXNCLENBQUM7QUFDNUYsWUFBSSxtQkFBbUI7QUFDckIsbURBQXVCLG1DQUFtQyxFQUFFLG1DQUFtQyxrQkFBa0IsSUFBSSxHQUFHO0FBQ3hILG9CQUFNLHdCQUFVLEtBQUssS0FBSyxpQkFBaUI7QUFDM0MsZUFBSyxZQUFZLGVBQWU7QUFBQSxRQUNsQztBQUFBLE1BQ0YsT0FBTztBQUNMLGNBQU0sZ0JBQVkscUJBQVEscUJBQXFCO0FBQy9DLGNBQU0sZ0JBQVkscUJBQVEscUJBQXFCO0FBQy9DLGNBQU0sZUFBVyxzQkFBUyx1QkFBdUIsU0FBUztBQUMxRCxnQ0FBd0IsS0FBSyxJQUFJLE1BQU0scUJBQWlCLGtCQUFLLFdBQVcsUUFBUSxHQUFHLFVBQVUsTUFBTSxDQUFDLENBQUM7QUFBQSxNQUN2RztBQUNBLFdBQUssSUFBSSxJQUFJLGtCQUFrQixNQUFNLHFCQUFxQjtBQUFBLElBQzVEO0FBQUEsRUFDRjtBQUFBLEVBRU8sSUFBSSxTQUFxQztBQUM5QyxXQUFPLEtBQUssSUFBSSxJQUFJLE9BQU87QUFBQSxFQUM3QjtBQUFBLEVBRU8saUJBQWlCLFFBQStDO0FBQ3JFLFVBQU07QUFBQSxNQUNKO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGLElBQUk7QUFDSiw0Q0FBK0I7QUFBQSxNQUM3QixXQUFXO0FBQUEsTUFDWCx5QkFBeUI7QUFBQSxNQUN6QixjQUFjLENBQUMsaUJBQWlCLEtBQUssSUFBSSxJQUFJLFlBQVksS0FBSztBQUFBLE1BQzlELGlCQUFpQixNQUFNO0FBQUEsTUFDdkIsUUFBUTtBQUFBLElBQ1YsQ0FBQztBQUFBLEVBQ0g7QUFBQSxFQUVPLHFCQUFxQixzQkFBOEQ7QUFDeEYsZUFBVyxlQUFlLEtBQUssY0FBYztBQUMzQyxZQUFNLHdCQUFvQiw2QkFBZ0IsRUFBRSxLQUFLLEtBQUssS0FBSyxNQUFNLGFBQWEsa0JBQWtCLEtBQUssUUFBUSxDQUFDO0FBQzlHLFVBQUksQ0FBQyxtQkFBbUI7QUFDdEI7QUFBQSxNQUNGO0FBQ0EsWUFBTSxlQUFlLG9CQUFJLElBQXlCLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO0FBQ2pGLFdBQUssaUJBQWlCO0FBQUEsUUFDcEI7QUFBQSxRQUNBLE1BQU0sa0JBQWtCO0FBQUEsUUFDeEIsb0JBQW9CO0FBQUEsTUFDdEIsQ0FBQztBQUFBLElBQ0g7QUFBQSxFQUNGO0FBQUEsRUFFTyxPQUFpQztBQUN0QyxXQUFPLEtBQUssSUFBSSxLQUFLO0FBQUEsRUFDdkI7QUFBQSxFQUVPLElBQUksU0FBaUIsU0FBdUI7QUFDakQsU0FBSyxJQUFJLElBQUksU0FBUyxPQUFPO0FBQUEsRUFDL0I7QUFBQSxFQUVBLE1BQWMsMkJBQTJCLFNBQWlDO0FBQ3hFO0FBQUE7QUFBQSxZQUFNLGdCQUFnQix5REFBYyxLQUFLLEtBQUssQ0FBQyxPQUFPLENBQUM7QUFDdkQsWUFBTSxxQkFBcUIscUJBQUssWUFBWSxRQUFRLGNBQ2hELDJEQUFvQyxFQUFFLEtBQUssS0FBSyxLQUFLLE9BQU8sS0FBSyxVQUFVLFlBQVksUUFBUSxDQUFDLElBQ2hHO0FBQ0osYUFBTyxVQUFNLGdEQUF3QjtBQUFBLFFBQ25DLEtBQUssS0FBSztBQUFBLFFBQ1YsU0FBUyw2Q0FBc0I7QUFBQSxRQUMvQixnQkFBZ0IsS0FBSztBQUFBLE1BQ3ZCLENBQUM7QUFBQSxhQVJEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVNGO0FBQ0Y7QUFhQSxNQUFNLGdCQUFnQjtBQUFBLEVBQ0g7QUFBQSxFQUVWLFlBQVksaUJBQTZEO0FBQzlFLFNBQUssa0JBQWtCO0FBQUEsRUFDekI7QUFBQSxFQUVPLGNBQW9EO0FBQ3pELFVBQU0sZ0JBQWdCLEtBQUssZ0JBQWdCO0FBQzNDLFdBQU87QUFBQSxNQUNMLEdBQUc7QUFBQSxNQUNILHFCQUFxQixjQUFjLHVCQUF1QixpQ0FBb0I7QUFBQSxNQUM5RSxRQUFRLENBQUMsU0FBMEIsY0FBYyxTQUFTLElBQUksU0FBSywyQkFBTyxJQUFJO0FBQUEsTUFDOUUsZUFBZSxDQUFDLFNBQTBCLGNBQWMsZ0JBQWdCLElBQUksS0FBSztBQUFBLElBQ25GO0FBQUEsRUFDRjtBQUFBLEVBRU8sU0FBUyxNQUF1QjtBQUNyQyxVQUFNLFdBQVcsS0FBSyxZQUFZO0FBQ2xDLFdBQU8sU0FBUyxTQUFTLElBQUksS0FBSztBQUFBLEVBQ3BDO0FBQ0Y7QUFPTyxNQUFNLHFDQUFxQyxnQ0FBWTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSXpDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0E7QUFBQSxFQUVGLDBCQUEwQixvQkFBSSxJQUE0QjtBQUFBLEVBRTFELGlCQUFpQixJQUFJLGVBQWU7QUFBQSxFQUVwQyx3QkFBd0Isb0JBQUksSUFBaUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPdkUsWUFBWSxRQUF1RDtBQUN4RSxVQUFNO0FBQ04sU0FBSyx1QkFBdUIsT0FBTztBQUNuQyxTQUFLLE1BQU0sT0FBTztBQUNsQixTQUFLLDZCQUE2QixPQUFPLDhCQUE4QjtBQUN2RSxTQUFLLHdCQUF3QixPQUFPO0FBQ3BDLFNBQUssd0JBQXdCLE9BQU87QUFDcEMsU0FBSyxrQkFBa0IsT0FBTztBQUM5QixTQUFLLGtCQUFrQixJQUFJLGdCQUFnQixLQUFLLGVBQWU7QUFBQSxFQUNqRTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS2dCLFNBQWU7QUFDN0IsU0FBSyxjQUFjLEtBQUssSUFBSSxNQUFNLEdBQUcsVUFBVSxLQUFLLGFBQWEsS0FBSyxJQUFJLENBQUMsQ0FBQztBQUM1RSxTQUFLLGNBQWMsS0FBSyxJQUFJLE1BQU0sR0FBRyxVQUFVLEtBQUssYUFBYSxLQUFLLElBQUksQ0FBQyxDQUFDO0FBQzVFLFNBQUssY0FBYyxLQUFLLElBQUksY0FBYyxHQUFHLFdBQVcsS0FBSyxzQkFBc0IsS0FBSyxJQUFJLENBQUMsQ0FBQztBQUU5RixTQUFLO0FBQUEsTUFDSCxJQUFJLDRDQUE0QztBQUFBLFFBQzlDLEtBQUssS0FBSztBQUFBLFFBQ1YsYUFBYSxLQUFLLElBQUk7QUFBQSxRQUN0QixpQkFBaUIsS0FBSztBQUFBLE1BQ3hCLENBQUM7QUFBQSxJQUNIO0FBRUEsU0FBSztBQUFBLE1BQ0gsSUFBSSwrQkFBK0I7QUFBQSxRQUNqQyxLQUFLLEtBQUs7QUFBQSxRQUNWLHVCQUF1QixLQUFLO0FBQUEsUUFDNUIsaUJBQWlCLEtBQUs7QUFBQSxNQUN4QixDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0Y7QUFBQSxFQUVRLGFBQWEsTUFBMkI7QUFDOUMsaUNBQVc7QUFBQSxNQUNULG1CQUFtQixDQUFDLGdCQUNsQixJQUFJLGNBQWM7QUFBQSxRQUNoQjtBQUFBLFFBQ0EsS0FBSyxLQUFLO0FBQUEsUUFDVix5QkFBeUIsS0FBSztBQUFBLFFBQzlCO0FBQUEsUUFDQSx1QkFBdUIsS0FBSztBQUFBLFFBQzVCLGlCQUFpQixLQUFLO0FBQUEsTUFDeEIsQ0FBQyxFQUFFLE9BQU87QUFBQSxNQUNaLG1CQUFlLGtCQUFFLENBQUMsTUFBTSxFQUFFLGlCQUFpQixvQkFBb0IsY0FBYyxFQUFFLFVBQVUsS0FBSyxLQUFLLENBQUM7QUFBQSxJQUN0RyxDQUFDO0FBQUEsRUFDSDtBQUFBLEVBRVEsc0JBQXNCLE1BQXFCLGVBQTRDO0FBQzdGLFFBQUksdUJBQXVCO0FBQUEsTUFDekIseUJBQXlCLEtBQUs7QUFBQSxNQUM5QjtBQUFBLE1BQ0E7QUFBQSxNQUNBLGlCQUFpQixLQUFLO0FBQUEsSUFDeEIsQ0FBQyxFQUFFLE9BQU87QUFBQSxFQUNaO0FBQUEsRUFFUSxhQUFhLE1BQXFCLFNBQXVCO0FBQy9ELFFBQUksS0FBQywyQkFBTyxJQUFJLEdBQUc7QUFDakI7QUFBQSxJQUNGO0FBRUEsVUFBTSxVQUFVLEtBQUs7QUFFckIsNkNBQXVCLGtDQUFrQyxFQUFFLGlCQUFpQixPQUFPLE9BQU8sT0FBTyxFQUFFO0FBQ25HLFFBQUksS0FBSyxlQUFlLElBQUksU0FBUyxPQUFPLEdBQUc7QUFDN0MsV0FBSyxlQUFlLE9BQU8sU0FBUyxPQUFPO0FBQzNDO0FBQUEsSUFDRjtBQWFBLFlBQUksd0RBQWtDLEtBQUssS0FBSyxPQUFPLFNBQUssd0RBQWtDLEtBQUssS0FBSyxPQUFPLEdBQUc7QUFDaEgsK0NBQXVCLGtDQUFrQztBQUFBLFFBQ3ZELDhCQUE4QixPQUFPLE9BQU8sT0FBTztBQUFBLE1BQ3JEO0FBQ0E7QUFBQSxJQUNGO0FBRUEsVUFBTSxXQUFXLEtBQUssZ0JBQWdCLFlBQVk7QUFDbEQsUUFBSSxDQUFDLFNBQVMsdUJBQXVCLENBQUMsU0FBUyxnQ0FBZ0MsQ0FBQyxTQUFTLDZCQUE2QjtBQUNwSDtBQUFBLElBQ0Y7QUFFQSxRQUFJLEtBQUssYUFBYSxVQUFVLFNBQVMsT0FBTyxHQUFHO0FBQ2pELCtDQUF1QixrQ0FBa0M7QUFBQSxRQUN2RCw4QkFBOEIsT0FBTyxPQUFPLE9BQU87QUFBQSxNQUNyRDtBQUNBO0FBQUEsSUFDRjtBQUVBLFFBQUksU0FBUyxnQkFBZ0IsT0FBTyxHQUFHO0FBQ3JDLCtDQUF1QixrQ0FBa0MsRUFBRSx1Q0FBdUMsT0FBTywwQkFBMEI7QUFDbkk7QUFBQSxJQUNGO0FBRUEsUUFBSSxTQUFTLGdCQUFnQixPQUFPLEdBQUc7QUFDckMsK0NBQXVCLGtDQUFrQyxFQUFFLHVDQUF1QyxPQUFPLDBCQUEwQjtBQUNuSTtBQUFBLElBQ0Y7QUFFQSxVQUFNLFdBQVcsS0FBSyxJQUFJLGNBQWMsU0FBUyxPQUFPLEtBQUssS0FBSyxJQUFJLGNBQWMsU0FBUyxPQUFPO0FBQ3BHLFVBQU0sMEJBQXNCLGlEQUEwQixLQUFLLEtBQUssT0FBTyxFQUFFO0FBQ3pFLGlDQUFXO0FBQUEsTUFDVCxhQUFhLEtBQUsscUJBQXFCO0FBQUEsTUFDdkMsbUJBQW1CLENBQUMsZ0JBQ2xCLElBQUksY0FBYztBQUFBLFFBQ2hCO0FBQUEsUUFDQSxLQUFLLEtBQUs7QUFBQSxRQUNWLGdCQUFnQixLQUFLO0FBQUEsUUFDckIsdUJBQXVCLEtBQUs7QUFBQSxRQUM1Qiw0QkFBNEIsS0FBSztBQUFBLFFBQ2pDO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQSx1QkFBdUIsS0FBSztBQUFBLFFBQzVCLHVCQUF1QixLQUFLO0FBQUEsUUFDNUIsaUJBQWlCLEtBQUs7QUFBQSxNQUN4QixDQUFDLEVBQUUsT0FBTztBQUFBLE1BQ1osbUJBQWUsa0JBQUUsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLG9CQUFvQixjQUFjLEVBQUUsU0FBUyxRQUFRLENBQUM7QUFBQSxJQUNuRyxDQUFDO0FBQUEsRUFDSDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFZUSxhQUFhLFVBQWdELFNBQWlCLFNBQTBCO0FBQzlHLFdBQU8sQ0FBQyxTQUFTLHVCQUNaLEVBQUUsU0FBUyxTQUFTLE9BQU8sS0FBSyxVQUNoQyxFQUFFLFNBQVMsU0FBUyxPQUFPLEtBQUssV0FDL0IsU0FBUyx1QkFBdUIsaUNBQW9CLFVBQVUsaUNBQW9CO0FBQUEsRUFDMUY7QUFDRjtBQWVBLGVBQWUsNkJBQTZCLFFBQThEO0FBQ3hHLFFBQU0sV0FBVyxPQUFPLGdCQUFnQixZQUFZO0FBQ3BELE1BQUksQ0FBQyxTQUFTLGVBQWU7QUFDM0IsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLGlCQUFpQixPQUFPLGFBQWEsS0FBSztBQUNoRCxRQUFNLGFBQWEsTUFBTSxTQUFTLGNBQWM7QUFBQSxJQUM5QztBQUFBLElBQ0Esb0JBQW9CLE9BQU8sYUFBYTtBQUFBLEVBQzFDLENBQUM7QUFFRCxNQUFJLGVBQWUsTUFBTTtBQUN2Qiw2Q0FBdUIsa0RBQWtELEVBQUUsc0JBQXNCLGNBQWMsMkJBQTJCO0FBQzFJLFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBSTtBQUtGLFVBQU0sb0JBQW9CLFVBQU0seUJBQVc7QUFBQSxNQUN6QyxLQUFLLE9BQU87QUFBQSxNQUNaLFNBQVM7QUFBQSxNQUNULHVCQUF1QixPQUFPLGFBQWE7QUFBQSxJQUM3QyxDQUFDO0FBRUQsUUFBSSxzQkFBc0IsZ0JBQWdCO0FBTXhDLCtDQUF1QixrREFBa0QsRUFBRSxHQUFHLGNBQWMsb0RBQW9EO0FBQ2hKLGFBQU87QUFBQSxJQUNUO0FBU0EsY0FBTSwrQ0FBMEIsT0FBTyxHQUFHO0FBRTFDLDZDQUF1QixrREFBa0QsRUFBRSxXQUFXLGNBQWMsT0FBTyxpQkFBaUIsR0FBRztBQUMvSCxXQUFPLHNCQUFzQixlQUFXLGtCQUFFLENBQUMsTUFBTSxFQUFFLGlCQUFpQixRQUFRLG1CQUFtQixFQUFFLGdCQUFnQixrQkFBa0IsQ0FBQyxDQUFDO0FBQ3JJLFdBQU87QUFBQSxFQUNULFNBQVMsT0FBTztBQUtkLGlDQUFXLElBQUksTUFBTSxvQkFBb0IsY0FBYyxPQUFPLFVBQVUsSUFBSSxFQUFFLE9BQU8sTUFBTSxDQUFDLENBQUM7QUFDN0YsV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQW1CQSxTQUFTLG1CQUFtQixNQUF5QjtBQUNuRCxhQUFPLDRCQUFPO0FBQUEsSUFDWixNQUFNLEtBQUs7QUFBQSxJQUNYLFVBQVUsS0FBSztBQUFBLEVBQ2pCLENBQUM7QUFDSDsiLAogICJuYW1lcyI6IFsiaW1wb3J0X3ZhdWx0Il0KfQo=