@mnaoumov/obsidian-lib 0.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 (1044) hide show
  1. package/@types/dataview/api/data-array/package.json +4 -0
  2. package/@types/dataview/api/extensions/package.json +4 -0
  3. package/@types/dataview/api/inline-api/package.json +4 -0
  4. package/@types/dataview/api/plugin-api/package.json +4 -0
  5. package/@types/dataview/api/result/package.json +4 -0
  6. package/@types/dataview/data-import/common/package.json +4 -0
  7. package/@types/dataview/data-import/csv/package.json +4 -0
  8. package/@types/dataview/data-import/inline-field/package.json +4 -0
  9. package/@types/dataview/data-import/markdown-file/package.json +4 -0
  10. package/@types/dataview/data-import/persister/package.json +4 -0
  11. package/@types/dataview/data-import/web-worker/import-entry/package.json +4 -0
  12. package/@types/dataview/data-import/web-worker/import-impl/package.json +4 -0
  13. package/@types/dataview/data-import/web-worker/import-manager/package.json +4 -0
  14. package/@types/dataview/data-index/index/package.json +4 -0
  15. package/@types/dataview/data-index/package.json +4 -0
  16. package/@types/dataview/data-index/resolver/package.json +4 -0
  17. package/@types/dataview/data-index/source/package.json +4 -0
  18. package/@types/dataview/data-model/markdown/package.json +4 -0
  19. package/@types/dataview/data-model/serialized/markdown/package.json +4 -0
  20. package/@types/dataview/data-model/transferable/package.json +4 -0
  21. package/@types/dataview/data-model/value/package.json +4 -0
  22. package/@types/dataview/expression/binaryop/package.json +4 -0
  23. package/@types/dataview/expression/context/package.json +4 -0
  24. package/@types/dataview/expression/field/package.json +4 -0
  25. package/@types/dataview/expression/functions/package.json +4 -0
  26. package/@types/dataview/expression/parse/package.json +4 -0
  27. package/@types/dataview/index/package.json +4 -0
  28. package/@types/dataview/main/package.json +4 -0
  29. package/@types/dataview/package.json +4 -0
  30. package/@types/dataview/query/engine/package.json +4 -0
  31. package/@types/dataview/query/parse/package.json +4 -0
  32. package/@types/dataview/query/query/package.json +4 -0
  33. package/@types/dataview/settings/package.json +4 -0
  34. package/@types/dataview/typings/obsidian-ex/package.json +4 -0
  35. package/@types/dataview/typings/workers/package.json +4 -0
  36. package/@types/dataview/ui/export/markdown/package.json +4 -0
  37. package/@types/dataview/ui/lp-render/package.json +4 -0
  38. package/@types/dataview/ui/markdown/package.json +4 -0
  39. package/@types/dataview/ui/refreshable-view/package.json +4 -0
  40. package/@types/dataview/ui/render/package.json +4 -0
  41. package/@types/dataview/ui/views/calendar-view/package.json +4 -0
  42. package/@types/dataview/ui/views/inline-field-live-preview/package.json +4 -0
  43. package/@types/dataview/ui/views/inline-view/package.json +4 -0
  44. package/@types/dataview/ui/views/js-view/package.json +4 -0
  45. package/@types/dataview/ui/views/list-view/package.json +4 -0
  46. package/@types/dataview/ui/views/table-view/package.json +4 -0
  47. package/@types/dataview/ui/views/task-view/package.json +4 -0
  48. package/@types/dataview/util/hash/package.json +4 -0
  49. package/@types/dataview/util/locale/package.json +4 -0
  50. package/@types/dataview/util/media/package.json +4 -0
  51. package/@types/dataview/util/normalize/package.json +4 -0
  52. package/@types/i18next/package.json +4 -0
  53. package/@types/obsidian-integration-testing/package.json +4 -0
  54. package/@types/original-fs/package.json +4 -0
  55. package/LICENSE +21 -0
  56. package/README.md +15 -1
  57. package/codemirror/index/package.json +6 -0
  58. package/codemirror/package.json +6 -0
  59. package/codemirror/state-field-spec/package.json +6 -0
  60. package/command-handlers/abstract-file-command-handler/package.json +6 -0
  61. package/command-handlers/command-handler/package.json +6 -0
  62. package/command-handlers/command-handler-component/package.json +6 -0
  63. package/command-handlers/editor-command-handler/package.json +6 -0
  64. package/command-handlers/file-command-handler/package.json +6 -0
  65. package/command-handlers/folder-command-handler/package.json +6 -0
  66. package/command-handlers/global-command-handler/package.json +6 -0
  67. package/command-handlers/index/package.json +6 -0
  68. package/command-handlers/open-demo-vault-command-handler/package.json +6 -0
  69. package/command-handlers/open-settings-command-handler/package.json +6 -0
  70. package/command-handlers/package.json +6 -0
  71. package/command-handlers/unlock-active-note-command-handler/package.json +6 -0
  72. package/components/abort-signal-component/package.json +6 -0
  73. package/components/all-windows-event-component/package.json +6 -0
  74. package/components/async-error-handler-component/package.json +6 -0
  75. package/components/async-events-component/package.json +6 -0
  76. package/components/case-insensitive-file-index-component/package.json +6 -0
  77. package/components/component-ex/package.json +6 -0
  78. package/components/console-debug-component/package.json +6 -0
  79. package/components/core-plugin-toggle-component/package.json +6 -0
  80. package/components/disposable-component/package.json +6 -0
  81. package/components/embed-extensions-component/package.json +6 -0
  82. package/components/generate-markdown-link-default-params-component/package.json +6 -0
  83. package/components/index/package.json +6 -0
  84. package/components/layout-ready-component/package.json +6 -0
  85. package/components/menu-event-registrar-component/package.json +6 -0
  86. package/components/monkey-around-component/package.json +6 -0
  87. package/components/notebook-navigator-menu-event-registrar-component/package.json +6 -0
  88. package/components/package.json +6 -0
  89. package/components/plugin-context-component/package.json +6 -0
  90. package/components/plugin-gate-component/package.json +6 -0
  91. package/components/plugin-notice-component/package.json +6 -0
  92. package/components/plugin-settings-component/package.json +6 -0
  93. package/components/plugin-settings-tab-component/package.json +6 -0
  94. package/components/plugin-suggestion-component/package.json +6 -0
  95. package/components/pointer-position-component/package.json +6 -0
  96. package/components/registry-component/package.json +6 -0
  97. package/components/release-notes-component/package.json +6 -0
  98. package/components/rename-delete-handler-component/package.json +6 -0
  99. package/components/rmdir-guard-component/package.json +6 -0
  100. package/components/settings-migration-component/package.json +6 -0
  101. package/components/syntax-highlighting-component/package.json +6 -0
  102. package/components/templates-language-component/package.json +6 -0
  103. package/constructors/get-dom-events-handlers-constructor/package.json +6 -0
  104. package/constructors/index/package.json +6 -0
  105. package/constructors/package.json +6 -0
  106. package/dist/lib/cjs/@types/dataview/api/data-array.d.cts +137 -0
  107. package/dist/lib/cjs/@types/dataview/api/extensions.d.cts +16 -0
  108. package/dist/lib/cjs/@types/dataview/api/inline-api.d.cts +187 -0
  109. package/dist/lib/cjs/@types/dataview/api/plugin-api.d.cts +210 -0
  110. package/dist/lib/cjs/@types/dataview/api/result.d.cts +39 -0
  111. package/dist/lib/cjs/@types/dataview/data-import/common.d.cts +4 -0
  112. package/dist/lib/cjs/@types/dataview/data-import/csv.d.cts +4 -0
  113. package/dist/lib/cjs/@types/dataview/data-import/inline-field.d.cts +43 -0
  114. package/dist/lib/cjs/@types/dataview/data-import/markdown-file.d.cts +53 -0
  115. package/dist/lib/cjs/@types/dataview/data-import/persister.d.cts +33 -0
  116. package/dist/lib/cjs/@types/dataview/data-import/web-worker/import-entry.d.cts +2 -0
  117. package/dist/lib/cjs/@types/dataview/data-import/web-worker/import-impl.d.cts +7 -0
  118. package/dist/lib/cjs/@types/dataview/data-import/web-worker/import-manager.d.cts +38 -0
  119. package/dist/lib/cjs/@types/dataview/data-index/index.d.cts +187 -0
  120. package/dist/lib/cjs/@types/dataview/data-index/resolver.d.cts +24 -0
  121. package/dist/lib/cjs/@types/dataview/data-index/source.d.cts +72 -0
  122. package/dist/lib/cjs/@types/dataview/data-model/markdown.d.cts +116 -0
  123. package/dist/lib/cjs/@types/dataview/data-model/serialized/markdown.d.cts +107 -0
  124. package/dist/lib/cjs/@types/dataview/data-model/transferable.d.cts +8 -0
  125. package/dist/lib/cjs/@types/dataview/data-model/value.d.cts +176 -0
  126. package/dist/lib/cjs/@types/dataview/expression/binaryop.d.cts +44 -0
  127. package/dist/lib/cjs/@types/dataview/expression/context.d.cts +50 -0
  128. package/dist/lib/cjs/@types/dataview/expression/field.d.cts +83 -0
  129. package/dist/lib/cjs/@types/dataview/expression/functions.d.cts +150 -0
  130. package/dist/lib/cjs/@types/dataview/expression/parse.d.cts +164 -0
  131. package/dist/lib/cjs/@types/dataview/index.d.cts +56 -0
  132. package/dist/lib/cjs/@types/dataview/main.d.cts +53 -0
  133. package/dist/lib/cjs/@types/dataview/query/engine.d.cts +104 -0
  134. package/dist/lib/cjs/@types/dataview/query/parse.d.cts +45 -0
  135. package/dist/lib/cjs/@types/dataview/query/query.d.cts +96 -0
  136. package/dist/lib/cjs/@types/dataview/settings.d.cts +61 -0
  137. package/dist/lib/cjs/@types/dataview/typings/obsidian-ex.d.cts +29 -0
  138. package/dist/lib/cjs/@types/dataview/typings/workers.d.cts +5 -0
  139. package/dist/lib/cjs/@types/dataview/ui/export/markdown.d.cts +16 -0
  140. package/dist/lib/cjs/@types/dataview/ui/lp-render.d.cts +38 -0
  141. package/dist/lib/cjs/@types/dataview/ui/markdown.d.cts +87 -0
  142. package/dist/lib/cjs/@types/dataview/ui/refreshable-view.d.cts +19 -0
  143. package/dist/lib/cjs/@types/dataview/ui/render.d.cts +34 -0
  144. package/dist/lib/cjs/@types/dataview/ui/views/calendar-view.d.cts +18 -0
  145. package/dist/lib/cjs/@types/dataview/ui/views/inline-field-live-preview.d.cts +43 -0
  146. package/dist/lib/cjs/@types/dataview/ui/views/inline-view.d.cts +29 -0
  147. package/dist/lib/cjs/@types/dataview/ui/views/js-view.d.cts +24 -0
  148. package/dist/lib/cjs/@types/dataview/ui/views/list-view.d.cts +26 -0
  149. package/dist/lib/cjs/@types/dataview/ui/views/table-view.d.cts +29 -0
  150. package/dist/lib/cjs/@types/dataview/ui/views/task-view.d.cts +52 -0
  151. package/dist/lib/cjs/@types/dataview/util/hash.d.cts +2 -0
  152. package/dist/lib/cjs/@types/dataview/util/locale.d.cts +3 -0
  153. package/dist/lib/cjs/@types/dataview/util/media.d.cts +7 -0
  154. package/dist/lib/cjs/@types/dataview/util/normalize.d.cts +45 -0
  155. package/dist/lib/cjs/@types/i18next.d.cts +14 -0
  156. package/dist/lib/cjs/@types/obsidian-integration-testing.d.cts +29 -0
  157. package/dist/lib/cjs/@types/original-fs.d.cts +15 -0
  158. package/dist/lib/cjs/__merged.cjs +1656 -0
  159. package/dist/lib/cjs/__merged.d.cts +205 -0
  160. package/dist/lib/cjs/active-file-provider.cjs +161 -0
  161. package/dist/lib/cjs/active-file-provider.d.cts +36 -0
  162. package/dist/lib/cjs/app.cjs +153 -0
  163. package/dist/lib/cjs/app.d.cts +17 -0
  164. package/dist/lib/cjs/async-with-notice.cjs +235 -0
  165. package/dist/lib/cjs/async-with-notice.d.cts +113 -0
  166. package/dist/lib/cjs/attachment-path.cjs +379 -0
  167. package/dist/lib/cjs/attachment-path.d.cts +341 -0
  168. package/dist/lib/cjs/attachment-unit-folder.cjs +168 -0
  169. package/dist/lib/cjs/attachment-unit-folder.d.cts +103 -0
  170. package/dist/lib/cjs/backlink-index.cjs +249 -0
  171. package/dist/lib/cjs/backlink-index.d.cts +51 -0
  172. package/dist/lib/cjs/backlink.cjs +217 -0
  173. package/dist/lib/cjs/backlink.d.cts +66 -0
  174. package/dist/lib/cjs/bases-view-registrar.cjs +162 -0
  175. package/dist/lib/cjs/bases-view-registrar.d.cts +52 -0
  176. package/dist/lib/cjs/callout.cjs +220 -0
  177. package/dist/lib/cjs/callout.d.cts +76 -0
  178. package/dist/lib/cjs/canvas.cjs +215 -0
  179. package/dist/lib/cjs/canvas.d.cts +28 -0
  180. package/dist/lib/cjs/case-insensitive-file-index.cjs +244 -0
  181. package/dist/lib/cjs/case-insensitive-file-index.d.cts +92 -0
  182. package/dist/lib/cjs/code-block-markdown-information.cjs +131 -0
  183. package/dist/lib/cjs/code-block-markdown-information.d.cts +48 -0
  184. package/dist/lib/cjs/code-block-reg-exp.cjs +145 -0
  185. package/dist/lib/cjs/code-block-reg-exp.d.cts +39 -0
  186. package/dist/lib/cjs/codemirror/index.cjs +153 -0
  187. package/dist/lib/cjs/codemirror/index.d.cts +2 -0
  188. package/dist/lib/cjs/codemirror/state-field-spec.cjs +131 -0
  189. package/dist/lib/cjs/codemirror/state-field-spec.d.cts +72 -0
  190. package/dist/lib/cjs/command-handlers/abstract-file-command-handler.cjs +416 -0
  191. package/dist/lib/cjs/command-handlers/abstract-file-command-handler.d.cts +274 -0
  192. package/dist/lib/cjs/command-handlers/command-handler-component.cjs +278 -0
  193. package/dist/lib/cjs/command-handlers/command-handler-component.d.cts +146 -0
  194. package/dist/lib/cjs/command-handlers/command-handler.cjs +200 -0
  195. package/dist/lib/cjs/command-handlers/command-handler.d.cts +107 -0
  196. package/dist/lib/cjs/command-handlers/editor-command-handler.cjs +348 -0
  197. package/dist/lib/cjs/command-handlers/editor-command-handler.d.cts +208 -0
  198. package/dist/lib/cjs/command-handlers/file-command-handler.cjs +285 -0
  199. package/dist/lib/cjs/command-handlers/file-command-handler.d.cts +143 -0
  200. package/dist/lib/cjs/command-handlers/folder-command-handler.cjs +293 -0
  201. package/dist/lib/cjs/command-handlers/folder-command-handler.d.cts +149 -0
  202. package/dist/lib/cjs/command-handlers/global-command-handler.cjs +185 -0
  203. package/dist/lib/cjs/command-handlers/global-command-handler.d.cts +40 -0
  204. package/dist/lib/cjs/command-handlers/index.cjs +180 -0
  205. package/dist/lib/cjs/command-handlers/index.d.cts +11 -0
  206. package/dist/lib/cjs/command-handlers/open-demo-vault-command-handler.cjs +209 -0
  207. package/dist/lib/cjs/command-handlers/open-demo-vault-command-handler.d.cts +73 -0
  208. package/dist/lib/cjs/command-handlers/open-settings-command-handler.cjs +174 -0
  209. package/dist/lib/cjs/command-handlers/open-settings-command-handler.d.cts +44 -0
  210. package/dist/lib/cjs/command-handlers/unlock-active-note-command-handler.cjs +187 -0
  211. package/dist/lib/cjs/command-handlers/unlock-active-note-command-handler.d.cts +54 -0
  212. package/dist/lib/cjs/command-registrar.cjs +169 -0
  213. package/dist/lib/cjs/command-registrar.d.cts +48 -0
  214. package/dist/lib/cjs/community-plugins.cjs +322 -0
  215. package/dist/lib/cjs/community-plugins.d.cts +270 -0
  216. package/dist/lib/cjs/components/abort-signal-component.cjs +172 -0
  217. package/dist/lib/cjs/components/abort-signal-component.d.cts +30 -0
  218. package/dist/lib/cjs/components/all-windows-event-component.cjs +214 -0
  219. package/dist/lib/cjs/components/all-windows-event-component.d.cts +84 -0
  220. package/dist/lib/cjs/components/async-error-handler-component.cjs +176 -0
  221. package/dist/lib/cjs/components/async-error-handler-component.d.cts +30 -0
  222. package/dist/lib/cjs/components/async-events-component.cjs +148 -0
  223. package/dist/lib/cjs/components/async-events-component.d.cts +15 -0
  224. package/dist/lib/cjs/components/case-insensitive-file-index-component.cjs +186 -0
  225. package/dist/lib/cjs/components/case-insensitive-file-index-component.d.cts +36 -0
  226. package/dist/lib/cjs/components/component-ex.cjs +504 -0
  227. package/dist/lib/cjs/components/component-ex.d.cts +229 -0
  228. package/dist/lib/cjs/components/console-debug-component.cjs +170 -0
  229. package/dist/lib/cjs/components/console-debug-component.d.cts +30 -0
  230. package/dist/lib/cjs/components/core-plugin-toggle-component.cjs +202 -0
  231. package/dist/lib/cjs/components/core-plugin-toggle-component.d.cts +102 -0
  232. package/dist/lib/cjs/components/disposable-component.cjs +154 -0
  233. package/dist/lib/cjs/components/disposable-component.d.cts +24 -0
  234. package/dist/lib/cjs/components/embed-extensions-component.cjs +174 -0
  235. package/dist/lib/cjs/components/embed-extensions-component.d.cts +38 -0
  236. package/dist/lib/cjs/components/generate-markdown-link-default-params-component.cjs +170 -0
  237. package/dist/lib/cjs/components/generate-markdown-link-default-params-component.d.cts +42 -0
  238. package/dist/lib/cjs/components/index.cjs +237 -0
  239. package/dist/lib/cjs/components/index.d.cts +30 -0
  240. package/dist/lib/cjs/components/layout-ready-component.cjs +211 -0
  241. package/dist/lib/cjs/components/layout-ready-component.d.cts +48 -0
  242. package/dist/lib/cjs/components/menu-event-registrar-component.cjs +196 -0
  243. package/dist/lib/cjs/components/menu-event-registrar-component.d.cts +52 -0
  244. package/dist/lib/cjs/components/monkey-around-component.cjs +245 -0
  245. package/dist/lib/cjs/components/monkey-around-component.d.cts +241 -0
  246. package/dist/lib/cjs/components/notebook-navigator-menu-event-registrar-component.cjs +321 -0
  247. package/dist/lib/cjs/components/notebook-navigator-menu-event-registrar-component.d.cts +150 -0
  248. package/dist/lib/cjs/components/plugin-context-component.cjs +180 -0
  249. package/dist/lib/cjs/components/plugin-context-component.d.cts +36 -0
  250. package/dist/lib/cjs/components/plugin-gate-component.cjs +548 -0
  251. package/dist/lib/cjs/components/plugin-gate-component.d.cts +332 -0
  252. package/dist/lib/cjs/components/plugin-notice-component.cjs +629 -0
  253. package/dist/lib/cjs/components/plugin-notice-component.d.cts +362 -0
  254. package/dist/lib/cjs/components/plugin-settings-component.cjs +644 -0
  255. package/dist/lib/cjs/components/plugin-settings-component.d.cts +362 -0
  256. package/dist/lib/cjs/components/plugin-settings-tab-component.cjs +170 -0
  257. package/dist/lib/cjs/components/plugin-settings-tab-component.d.cts +39 -0
  258. package/dist/lib/cjs/components/plugin-suggestion-component.cjs +278 -0
  259. package/dist/lib/cjs/components/plugin-suggestion-component.d.cts +162 -0
  260. package/dist/lib/cjs/components/pointer-position-component.cjs +166 -0
  261. package/dist/lib/cjs/components/pointer-position-component.d.cts +29 -0
  262. package/dist/lib/cjs/components/registry-component.cjs +187 -0
  263. package/dist/lib/cjs/components/registry-component.d.cts +37 -0
  264. package/dist/lib/cjs/components/release-notes-component.cjs +225 -0
  265. package/dist/lib/cjs/components/release-notes-component.d.cts +129 -0
  266. package/dist/lib/cjs/components/rename-delete-handler-component.cjs +1275 -0
  267. package/dist/lib/cjs/components/rename-delete-handler-component.d.cts +165 -0
  268. package/dist/lib/cjs/components/rmdir-guard-component.cjs +190 -0
  269. package/dist/lib/cjs/components/rmdir-guard-component.d.cts +76 -0
  270. package/dist/lib/cjs/components/settings-migration-component.cjs +222 -0
  271. package/dist/lib/cjs/components/settings-migration-component.d.cts +120 -0
  272. package/dist/lib/cjs/components/syntax-highlighting-component.cjs +248 -0
  273. package/dist/lib/cjs/components/syntax-highlighting-component.d.cts +149 -0
  274. package/dist/lib/cjs/components/templates-language-component.cjs +276 -0
  275. package/dist/lib/cjs/components/templates-language-component.d.cts +124 -0
  276. package/dist/lib/cjs/constructors/get-dom-events-handlers-constructor.cjs +246 -0
  277. package/dist/lib/cjs/constructors/get-dom-events-handlers-constructor.d.cts +22 -0
  278. package/dist/lib/cjs/constructors/index.cjs +153 -0
  279. package/dist/lib/cjs/constructors/index.d.cts +2 -0
  280. package/dist/lib/cjs/css-class.cjs +208 -0
  281. package/dist/lib/cjs/css-class.d.cts +278 -0
  282. package/dist/lib/cjs/data-handler.cjs +170 -0
  283. package/dist/lib/cjs/data-handler.d.cts +49 -0
  284. package/dist/lib/cjs/dataview-link.cjs +160 -0
  285. package/dist/lib/cjs/dataview-link.d.cts +42 -0
  286. package/dist/lib/cjs/dataview.cjs +379 -0
  287. package/dist/lib/cjs/dataview.d.cts +249 -0
  288. package/dist/lib/cjs/debug.cjs +148 -0
  289. package/dist/lib/cjs/debug.d.cts +19 -0
  290. package/dist/lib/cjs/demo-vault-helper-settings.cjs +131 -0
  291. package/dist/lib/cjs/demo-vault-helper-settings.d.cts +29 -0
  292. package/dist/lib/cjs/demo-vault-helper.cjs +232 -0
  293. package/dist/lib/cjs/demo-vault-helper.d.cts +61 -0
  294. package/dist/lib/cjs/demo-vault-naming.cjs +157 -0
  295. package/dist/lib/cjs/demo-vault-naming.d.cts +54 -0
  296. package/dist/lib/cjs/desktop-demo-vault-opener.cjs +348 -0
  297. package/dist/lib/cjs/desktop-demo-vault-opener.d.cts +76 -0
  298. package/dist/lib/cjs/desktop-trusted-input.cjs +301 -0
  299. package/dist/lib/cjs/desktop-trusted-input.d.cts +288 -0
  300. package/dist/lib/cjs/editor-extension-registrar.cjs +162 -0
  301. package/dist/lib/cjs/editor-extension-registrar.d.cts +37 -0
  302. package/dist/lib/cjs/editor-suggest-registrar.cjs +162 -0
  303. package/dist/lib/cjs/editor-suggest-registrar.d.cts +36 -0
  304. package/dist/lib/cjs/editor.cjs +200 -0
  305. package/dist/lib/cjs/editor.d.cts +45 -0
  306. package/dist/lib/cjs/events.cjs +172 -0
  307. package/dist/lib/cjs/events.d.cts +98 -0
  308. package/dist/lib/cjs/extensions-registrar.cjs +162 -0
  309. package/dist/lib/cjs/extensions-registrar.d.cts +51 -0
  310. package/dist/lib/cjs/file-change.cjs +558 -0
  311. package/dist/lib/cjs/file-change.d.cts +156 -0
  312. package/dist/lib/cjs/file-explorer.cjs +157 -0
  313. package/dist/lib/cjs/file-explorer.d.cts +34 -0
  314. package/dist/lib/cjs/file-manager.cjs +251 -0
  315. package/dist/lib/cjs/file-manager.d.cts +123 -0
  316. package/dist/lib/cjs/file-system.cjs +571 -0
  317. package/dist/lib/cjs/file-system.d.cts +554 -0
  318. package/dist/lib/cjs/folder-note.cjs +261 -0
  319. package/dist/lib/cjs/folder-note.d.cts +166 -0
  320. package/dist/lib/cjs/frontmatter-formatting.cjs +448 -0
  321. package/dist/lib/cjs/frontmatter-formatting.d.cts +44 -0
  322. package/dist/lib/cjs/frontmatter-link-cache-with-offsets.cjs +159 -0
  323. package/dist/lib/cjs/frontmatter-link-cache-with-offsets.d.cts +34 -0
  324. package/dist/lib/cjs/frontmatter.cjs +271 -0
  325. package/dist/lib/cjs/frontmatter.d.cts +145 -0
  326. package/dist/lib/cjs/generated-during-build.cjs +146 -0
  327. package/dist/lib/cjs/generated-during-build.d.cts +25 -0
  328. package/dist/lib/cjs/hover-link-source-registrar.cjs +162 -0
  329. package/dist/lib/cjs/hover-link-source-registrar.d.cts +52 -0
  330. package/dist/lib/cjs/html-element.cjs +183 -0
  331. package/dist/lib/cjs/html-element.d.cts +98 -0
  332. package/dist/lib/cjs/i18n/custom-type-options.cjs +132 -0
  333. package/dist/lib/cjs/i18n/custom-type-options.d.cts +38 -0
  334. package/dist/lib/cjs/i18n/default-translations.cjs +132 -0
  335. package/dist/lib/cjs/i18n/default-translations.d.cts +15 -0
  336. package/dist/lib/cjs/i18n/i18n.cjs +192 -0
  337. package/dist/lib/cjs/i18n/i18n.d.cts +38 -0
  338. package/dist/lib/cjs/i18n/index.cjs +162 -0
  339. package/dist/lib/cjs/i18n/index.d.cts +5 -0
  340. package/dist/lib/cjs/i18n/locales/en.cjs +224 -0
  341. package/dist/lib/cjs/i18n/locales/en.d.cts +91 -0
  342. package/dist/lib/cjs/i18n/locales/index.cjs +156 -0
  343. package/dist/lib/cjs/i18n/locales/index.d.cts +3 -0
  344. package/dist/lib/cjs/i18n/locales/translations-map.cjs +150 -0
  345. package/dist/lib/cjs/i18n/locales/translations-map.d.cts +100 -0
  346. package/dist/lib/cjs/index.cjs +435 -0
  347. package/dist/lib/cjs/index.d.cts +96 -0
  348. package/dist/lib/cjs/is-in-obsidian.cjs +154 -0
  349. package/dist/lib/cjs/is-in-obsidian.d.cts +12 -0
  350. package/dist/lib/cjs/library-styles.cjs +173 -0
  351. package/dist/lib/cjs/library-styles.d.cts +56 -0
  352. package/dist/lib/cjs/library.cjs +181 -0
  353. package/dist/lib/cjs/library.d.cts +57 -0
  354. package/dist/lib/cjs/link-name.cjs +145 -0
  355. package/dist/lib/cjs/link-name.d.cts +23 -0
  356. package/dist/lib/cjs/link-update-progress.cjs +131 -0
  357. package/dist/lib/cjs/link-update-progress.d.cts +32 -0
  358. package/dist/lib/cjs/link.cjs +1053 -0
  359. package/dist/lib/cjs/link.d.cts +1369 -0
  360. package/dist/lib/cjs/logger.cjs +212 -0
  361. package/dist/lib/cjs/logger.d.cts +37 -0
  362. package/dist/lib/cjs/loop.cjs +243 -0
  363. package/dist/lib/cjs/loop.d.cts +104 -0
  364. package/dist/lib/cjs/markdown-code-block-processor-registrar.cjs +166 -0
  365. package/dist/lib/cjs/markdown-code-block-processor-registrar.d.cts +62 -0
  366. package/dist/lib/cjs/markdown-code-block-processor.cjs +444 -0
  367. package/dist/lib/cjs/markdown-code-block-processor.d.cts +137 -0
  368. package/dist/lib/cjs/markdown-post-processor-registrar.cjs +163 -0
  369. package/dist/lib/cjs/markdown-post-processor-registrar.d.cts +59 -0
  370. package/dist/lib/cjs/markdown-view.cjs +151 -0
  371. package/dist/lib/cjs/markdown-view.d.cts +14 -0
  372. package/dist/lib/cjs/markdown.cjs +470 -0
  373. package/dist/lib/cjs/markdown.d.cts +226 -0
  374. package/dist/lib/cjs/menu-event-registrar.cjs +131 -0
  375. package/dist/lib/cjs/menu-event-registrar.d.cts +84 -0
  376. package/dist/lib/cjs/metadata-cache.cjs +544 -0
  377. package/dist/lib/cjs/metadata-cache.d.cts +359 -0
  378. package/dist/lib/cjs/mobile-trusted-input.cjs +185 -0
  379. package/dist/lib/cjs/mobile-trusted-input.d.cts +98 -0
  380. package/dist/lib/cjs/modals/alert.cjs +178 -0
  381. package/dist/lib/cjs/modals/alert.d.cts +35 -0
  382. package/dist/lib/cjs/modals/confirm.cjs +188 -0
  383. package/dist/lib/cjs/modals/confirm.d.cts +39 -0
  384. package/dist/lib/cjs/modals/index.cjs +177 -0
  385. package/dist/lib/cjs/modals/index.d.cts +10 -0
  386. package/dist/lib/cjs/modals/minimizable-modal.cjs +441 -0
  387. package/dist/lib/cjs/modals/minimizable-modal.d.cts +129 -0
  388. package/dist/lib/cjs/modals/modal-command-builder.cjs +458 -0
  389. package/dist/lib/cjs/modals/modal-command-builder.d.cts +285 -0
  390. package/dist/lib/cjs/modals/modal.cjs +176 -0
  391. package/dist/lib/cjs/modals/modal.d.cts +64 -0
  392. package/dist/lib/cjs/modals/prompt.cjs +256 -0
  393. package/dist/lib/cjs/modals/prompt.d.cts +83 -0
  394. package/dist/lib/cjs/modals/select-item.cjs +201 -0
  395. package/dist/lib/cjs/modals/select-item.d.cts +55 -0
  396. package/dist/lib/cjs/modals/select-option.cjs +189 -0
  397. package/dist/lib/cjs/modals/select-option.d.cts +65 -0
  398. package/dist/lib/cjs/modals/suggest-modal-command-builder.cjs +144 -0
  399. package/dist/lib/cjs/modals/suggest-modal-command-builder.d.cts +35 -0
  400. package/dist/lib/cjs/note-priority.cjs +234 -0
  401. package/dist/lib/cjs/note-priority.d.cts +154 -0
  402. package/dist/lib/cjs/notebook-navigator.cjs +163 -0
  403. package/dist/lib/cjs/notebook-navigator.d.cts +132 -0
  404. package/dist/lib/cjs/obsidian-dev-utils-state.cjs +175 -0
  405. package/dist/lib/cjs/obsidian-dev-utils-state.d.cts +42 -0
  406. package/dist/lib/cjs/obsidian-protocol-handler-registrar.cjs +165 -0
  407. package/dist/lib/cjs/obsidian-protocol-handler-registrar.d.cts +55 -0
  408. package/dist/lib/cjs/obsidian-settings.cjs +182 -0
  409. package/dist/lib/cjs/obsidian-settings.d.cts +62 -0
  410. package/dist/lib/cjs/parse-link.cjs +538 -0
  411. package/dist/lib/cjs/parse-link.d.cts +288 -0
  412. package/dist/lib/cjs/path-settings.cjs +269 -0
  413. package/dist/lib/cjs/path-settings.d.cts +56 -0
  414. package/dist/lib/cjs/pdf.cjs +173 -0
  415. package/dist/lib/cjs/pdf.d.cts +26 -0
  416. package/dist/lib/cjs/plugin/index.cjs +174 -0
  417. package/dist/lib/cjs/plugin/index.d.cts +9 -0
  418. package/dist/lib/cjs/plugin/plugin-api.cjs +519 -0
  419. package/dist/lib/cjs/plugin/plugin-api.d.cts +413 -0
  420. package/dist/lib/cjs/plugin/plugin-context.cjs +191 -0
  421. package/dist/lib/cjs/plugin/plugin-context.d.cts +27 -0
  422. package/dist/lib/cjs/plugin/plugin-event-source.cjs +226 -0
  423. package/dist/lib/cjs/plugin/plugin-event-source.d.cts +97 -0
  424. package/dist/lib/cjs/plugin/plugin-install-state.cjs +195 -0
  425. package/dist/lib/cjs/plugin/plugin-install-state.d.cts +113 -0
  426. package/dist/lib/cjs/plugin/plugin-lifecycle-events.cjs +151 -0
  427. package/dist/lib/cjs/plugin/plugin-lifecycle-events.d.cts +127 -0
  428. package/dist/lib/cjs/plugin/plugin-settings-tab.cjs +611 -0
  429. package/dist/lib/cjs/plugin/plugin-settings-tab.d.cts +368 -0
  430. package/dist/lib/cjs/plugin/plugin.cjs +706 -0
  431. package/dist/lib/cjs/plugin/plugin.d.cts +363 -0
  432. package/dist/lib/cjs/plugin/settings-migration-api.cjs +131 -0
  433. package/dist/lib/cjs/plugin/settings-migration-api.d.cts +91 -0
  434. package/dist/lib/cjs/plugin-cli-handler-registrar.cjs +163 -0
  435. package/dist/lib/cjs/plugin-cli-handler-registrar.d.cts +64 -0
  436. package/dist/lib/cjs/popovers/field-popover.cjs +182 -0
  437. package/dist/lib/cjs/popovers/field-popover.d.cts +75 -0
  438. package/dist/lib/cjs/popovers/index.cjs +159 -0
  439. package/dist/lib/cjs/popovers/index.d.cts +4 -0
  440. package/dist/lib/cjs/popovers/popover-anchor.cjs +182 -0
  441. package/dist/lib/cjs/popovers/popover-anchor.d.cts +67 -0
  442. package/dist/lib/cjs/popovers/popover.cjs +229 -0
  443. package/dist/lib/cjs/popovers/popover.d.cts +78 -0
  444. package/dist/lib/cjs/property-entry.cjs +172 -0
  445. package/dist/lib/cjs/property-entry.d.cts +43 -0
  446. package/dist/lib/cjs/queue.cjs +212 -0
  447. package/dist/lib/cjs/queue.d.cts +93 -0
  448. package/dist/lib/cjs/react/app-context.cjs +151 -0
  449. package/dist/lib/cjs/react/app-context.d.cts +24 -0
  450. package/dist/lib/cjs/react/index.cjs +153 -0
  451. package/dist/lib/cjs/react/index.d.cts +2 -0
  452. package/dist/lib/cjs/reference.cjs +186 -0
  453. package/dist/lib/cjs/reference.d.cts +116 -0
  454. package/dist/lib/cjs/resource-lock.cjs +1096 -0
  455. package/dist/lib/cjs/resource-lock.d.cts +318 -0
  456. package/dist/lib/cjs/resource-url.cjs +156 -0
  457. package/dist/lib/cjs/resource-url.d.cts +31 -0
  458. package/dist/lib/cjs/ribbon-icon-registrar.cjs +163 -0
  459. package/dist/lib/cjs/ribbon-icon-registrar.d.cts +60 -0
  460. package/dist/lib/cjs/setting-components/checkbox-component.cjs +216 -0
  461. package/dist/lib/cjs/setting-components/checkbox-component.d.cts +69 -0
  462. package/dist/lib/cjs/setting-components/code-highlighter-component.cjs +378 -0
  463. package/dist/lib/cjs/setting-components/code-highlighter-component.d.cts +132 -0
  464. package/dist/lib/cjs/setting-components/date-component.cjs +180 -0
  465. package/dist/lib/cjs/setting-components/date-component.d.cts +38 -0
  466. package/dist/lib/cjs/setting-components/date-time-component.cjs +180 -0
  467. package/dist/lib/cjs/setting-components/date-time-component.d.cts +38 -0
  468. package/dist/lib/cjs/setting-components/email-component.cjs +191 -0
  469. package/dist/lib/cjs/setting-components/email-component.d.cts +49 -0
  470. package/dist/lib/cjs/setting-components/file-component.cjs +183 -0
  471. package/dist/lib/cjs/setting-components/file-component.d.cts +43 -0
  472. package/dist/lib/cjs/setting-components/index.cjs +228 -0
  473. package/dist/lib/cjs/setting-components/index.d.cts +27 -0
  474. package/dist/lib/cjs/setting-components/month-component.cjs +188 -0
  475. package/dist/lib/cjs/setting-components/month-component.d.cts +51 -0
  476. package/dist/lib/cjs/setting-components/multiple-dropdown-component.cjs +253 -0
  477. package/dist/lib/cjs/setting-components/multiple-dropdown-component.d.cts +92 -0
  478. package/dist/lib/cjs/setting-components/multiple-email-component.cjs +177 -0
  479. package/dist/lib/cjs/setting-components/multiple-email-component.d.cts +38 -0
  480. package/dist/lib/cjs/setting-components/multiple-file-component.cjs +185 -0
  481. package/dist/lib/cjs/setting-components/multiple-file-component.d.cts +43 -0
  482. package/dist/lib/cjs/setting-components/multiple-text-component.cjs +272 -0
  483. package/dist/lib/cjs/setting-components/multiple-text-component.d.cts +109 -0
  484. package/dist/lib/cjs/setting-components/number-component.cjs +201 -0
  485. package/dist/lib/cjs/setting-components/number-component.d.cts +56 -0
  486. package/dist/lib/cjs/setting-components/password-component.cjs +177 -0
  487. package/dist/lib/cjs/setting-components/password-component.d.cts +38 -0
  488. package/dist/lib/cjs/setting-components/setting-component-wrapper.cjs +160 -0
  489. package/dist/lib/cjs/setting-components/setting-component-wrapper.d.cts +13 -0
  490. package/dist/lib/cjs/setting-components/telephone-component.cjs +191 -0
  491. package/dist/lib/cjs/setting-components/telephone-component.d.cts +51 -0
  492. package/dist/lib/cjs/setting-components/text-based-component.cjs +170 -0
  493. package/dist/lib/cjs/setting-components/text-based-component.d.cts +38 -0
  494. package/dist/lib/cjs/setting-components/time-component.cjs +185 -0
  495. package/dist/lib/cjs/setting-components/time-component.d.cts +38 -0
  496. package/dist/lib/cjs/setting-components/tri-state-checkbox-component.cjs +217 -0
  497. package/dist/lib/cjs/setting-components/tri-state-checkbox-component.d.cts +69 -0
  498. package/dist/lib/cjs/setting-components/typed-dropdown-component.cjs +262 -0
  499. package/dist/lib/cjs/setting-components/typed-dropdown-component.d.cts +97 -0
  500. package/dist/lib/cjs/setting-components/typed-multiple-dropdown-component.cjs +264 -0
  501. package/dist/lib/cjs/setting-components/typed-multiple-dropdown-component.d.cts +99 -0
  502. package/dist/lib/cjs/setting-components/typed-range-text-component.cjs +175 -0
  503. package/dist/lib/cjs/setting-components/typed-range-text-component.d.cts +35 -0
  504. package/dist/lib/cjs/setting-components/typed-text-component.cjs +232 -0
  505. package/dist/lib/cjs/setting-components/typed-text-component.d.cts +100 -0
  506. package/dist/lib/cjs/setting-components/url-component.cjs +191 -0
  507. package/dist/lib/cjs/setting-components/url-component.d.cts +49 -0
  508. package/dist/lib/cjs/setting-components/validator-component.cjs +230 -0
  509. package/dist/lib/cjs/setting-components/validator-component.d.cts +23 -0
  510. package/dist/lib/cjs/setting-components/value-component-with-change-tracking.cjs +131 -0
  511. package/dist/lib/cjs/setting-components/value-component-with-change-tracking.d.cts +20 -0
  512. package/dist/lib/cjs/setting-components/week-component.cjs +188 -0
  513. package/dist/lib/cjs/setting-components/week-component.d.cts +51 -0
  514. package/dist/lib/cjs/setting-ex.cjs +372 -0
  515. package/dist/lib/cjs/setting-ex.d.cts +198 -0
  516. package/dist/lib/cjs/setting-group-ex.cjs +165 -0
  517. package/dist/lib/cjs/setting-group-ex.d.cts +26 -0
  518. package/dist/lib/cjs/status-bar-item-registrar.cjs +162 -0
  519. package/dist/lib/cjs/status-bar-item-registrar.d.cts +36 -0
  520. package/dist/lib/cjs/templater.cjs +279 -0
  521. package/dist/lib/cjs/templater.d.cts +284 -0
  522. package/dist/lib/cjs/transformers/duration-transformer.cjs +182 -0
  523. package/dist/lib/cjs/transformers/duration-transformer.d.cts +39 -0
  524. package/dist/lib/cjs/transformers/index.cjs +153 -0
  525. package/dist/lib/cjs/transformers/index.d.cts +2 -0
  526. package/dist/lib/cjs/trusted-input.cjs +196 -0
  527. package/dist/lib/cjs/trusted-input.d.cts +131 -0
  528. package/dist/lib/cjs/validation.cjs +189 -0
  529. package/dist/lib/cjs/validation.d.cts +87 -0
  530. package/dist/lib/cjs/vault-delete.cjs +222 -0
  531. package/dist/lib/cjs/vault-delete.d.cts +82 -0
  532. package/dist/lib/cjs/vault-transaction.cjs +412 -0
  533. package/dist/lib/cjs/vault-transaction.d.cts +163 -0
  534. package/dist/lib/cjs/vault.cjs +701 -0
  535. package/dist/lib/cjs/vault.d.cts +506 -0
  536. package/dist/lib/cjs/view-registrar.cjs +162 -0
  537. package/dist/lib/cjs/view-registrar.d.cts +52 -0
  538. package/dist/lib/cjs/workspace.cjs +186 -0
  539. package/dist/lib/cjs/workspace.d.cts +81 -0
  540. package/dist/lib/esm/@types/dataview/api/data-array.d.mts +137 -0
  541. package/dist/lib/esm/@types/dataview/api/extensions.d.mts +16 -0
  542. package/dist/lib/esm/@types/dataview/api/inline-api.d.mts +187 -0
  543. package/dist/lib/esm/@types/dataview/api/plugin-api.d.mts +210 -0
  544. package/dist/lib/esm/@types/dataview/api/result.d.mts +39 -0
  545. package/dist/lib/esm/@types/dataview/data-import/common.d.mts +4 -0
  546. package/dist/lib/esm/@types/dataview/data-import/csv.d.mts +4 -0
  547. package/dist/lib/esm/@types/dataview/data-import/inline-field.d.mts +43 -0
  548. package/dist/lib/esm/@types/dataview/data-import/markdown-file.d.mts +53 -0
  549. package/dist/lib/esm/@types/dataview/data-import/persister.d.mts +33 -0
  550. package/dist/lib/esm/@types/dataview/data-import/web-worker/import-entry.d.mts +2 -0
  551. package/dist/lib/esm/@types/dataview/data-import/web-worker/import-impl.d.mts +7 -0
  552. package/dist/lib/esm/@types/dataview/data-import/web-worker/import-manager.d.mts +38 -0
  553. package/dist/lib/esm/@types/dataview/data-index/index.d.mts +187 -0
  554. package/dist/lib/esm/@types/dataview/data-index/resolver.d.mts +24 -0
  555. package/dist/lib/esm/@types/dataview/data-index/source.d.mts +72 -0
  556. package/dist/lib/esm/@types/dataview/data-model/markdown.d.mts +116 -0
  557. package/dist/lib/esm/@types/dataview/data-model/serialized/markdown.d.mts +107 -0
  558. package/dist/lib/esm/@types/dataview/data-model/transferable.d.mts +8 -0
  559. package/dist/lib/esm/@types/dataview/data-model/value.d.mts +176 -0
  560. package/dist/lib/esm/@types/dataview/expression/binaryop.d.mts +44 -0
  561. package/dist/lib/esm/@types/dataview/expression/context.d.mts +50 -0
  562. package/dist/lib/esm/@types/dataview/expression/field.d.mts +83 -0
  563. package/dist/lib/esm/@types/dataview/expression/functions.d.mts +150 -0
  564. package/dist/lib/esm/@types/dataview/expression/parse.d.mts +164 -0
  565. package/dist/lib/esm/@types/dataview/index.d.mts +56 -0
  566. package/dist/lib/esm/@types/dataview/main.d.mts +53 -0
  567. package/dist/lib/esm/@types/dataview/query/engine.d.mts +104 -0
  568. package/dist/lib/esm/@types/dataview/query/parse.d.mts +45 -0
  569. package/dist/lib/esm/@types/dataview/query/query.d.mts +96 -0
  570. package/dist/lib/esm/@types/dataview/settings.d.mts +61 -0
  571. package/dist/lib/esm/@types/dataview/typings/obsidian-ex.d.mts +29 -0
  572. package/dist/lib/esm/@types/dataview/typings/workers.d.mts +5 -0
  573. package/dist/lib/esm/@types/dataview/ui/export/markdown.d.mts +16 -0
  574. package/dist/lib/esm/@types/dataview/ui/lp-render.d.mts +38 -0
  575. package/dist/lib/esm/@types/dataview/ui/markdown.d.mts +87 -0
  576. package/dist/lib/esm/@types/dataview/ui/refreshable-view.d.mts +19 -0
  577. package/dist/lib/esm/@types/dataview/ui/render.d.mts +34 -0
  578. package/dist/lib/esm/@types/dataview/ui/views/calendar-view.d.mts +18 -0
  579. package/dist/lib/esm/@types/dataview/ui/views/inline-field-live-preview.d.mts +43 -0
  580. package/dist/lib/esm/@types/dataview/ui/views/inline-view.d.mts +29 -0
  581. package/dist/lib/esm/@types/dataview/ui/views/js-view.d.mts +24 -0
  582. package/dist/lib/esm/@types/dataview/ui/views/list-view.d.mts +26 -0
  583. package/dist/lib/esm/@types/dataview/ui/views/table-view.d.mts +29 -0
  584. package/dist/lib/esm/@types/dataview/ui/views/task-view.d.mts +52 -0
  585. package/dist/lib/esm/@types/dataview/util/hash.d.mts +2 -0
  586. package/dist/lib/esm/@types/dataview/util/locale.d.mts +3 -0
  587. package/dist/lib/esm/@types/dataview/util/media.d.mts +7 -0
  588. package/dist/lib/esm/@types/dataview/util/normalize.d.mts +45 -0
  589. package/dist/lib/esm/@types/i18next.d.mts +14 -0
  590. package/dist/lib/esm/@types/obsidian-integration-testing.d.mts +29 -0
  591. package/dist/lib/esm/@types/original-fs.d.mts +15 -0
  592. package/dist/lib/esm/__merged.d.mts +205 -0
  593. package/dist/lib/esm/__merged.mjs +1524 -0
  594. package/dist/lib/esm/active-file-provider.d.mts +36 -0
  595. package/dist/lib/esm/active-file-provider.mjs +64 -0
  596. package/dist/lib/esm/app.d.mts +17 -0
  597. package/dist/lib/esm/app.mjs +56 -0
  598. package/dist/lib/esm/async-with-notice.d.mts +113 -0
  599. package/dist/lib/esm/async-with-notice.mjs +141 -0
  600. package/dist/lib/esm/attachment-path.d.mts +341 -0
  601. package/dist/lib/esm/attachment-path.mjs +294 -0
  602. package/dist/lib/esm/attachment-unit-folder.d.mts +103 -0
  603. package/dist/lib/esm/attachment-unit-folder.mjs +70 -0
  604. package/dist/lib/esm/backlink-index.d.mts +51 -0
  605. package/dist/lib/esm/backlink-index.mjs +152 -0
  606. package/dist/lib/esm/backlink.d.mts +66 -0
  607. package/dist/lib/esm/backlink.mjs +123 -0
  608. package/dist/lib/esm/bases-view-registrar.d.mts +52 -0
  609. package/dist/lib/esm/bases-view-registrar.mjs +65 -0
  610. package/dist/lib/esm/callout.d.mts +76 -0
  611. package/dist/lib/esm/callout.mjs +124 -0
  612. package/dist/lib/esm/canvas.d.mts +28 -0
  613. package/dist/lib/esm/canvas.mjs +121 -0
  614. package/dist/lib/esm/case-insensitive-file-index.d.mts +92 -0
  615. package/dist/lib/esm/case-insensitive-file-index.mjs +144 -0
  616. package/dist/lib/esm/code-block-markdown-information.d.mts +48 -0
  617. package/dist/lib/esm/code-block-markdown-information.mjs +42 -0
  618. package/dist/lib/esm/code-block-reg-exp.d.mts +39 -0
  619. package/dist/lib/esm/code-block-reg-exp.mjs +48 -0
  620. package/dist/lib/esm/codemirror/index.d.mts +2 -0
  621. package/dist/lib/esm/codemirror/index.mjs +46 -0
  622. package/dist/lib/esm/codemirror/state-field-spec.d.mts +72 -0
  623. package/dist/lib/esm/codemirror/state-field-spec.mjs +42 -0
  624. package/dist/lib/esm/command-handlers/abstract-file-command-handler.d.mts +274 -0
  625. package/dist/lib/esm/command-handlers/abstract-file-command-handler.mjs +322 -0
  626. package/dist/lib/esm/command-handlers/command-handler-component.d.mts +146 -0
  627. package/dist/lib/esm/command-handlers/command-handler-component.mjs +185 -0
  628. package/dist/lib/esm/command-handlers/command-handler.d.mts +107 -0
  629. package/dist/lib/esm/command-handlers/command-handler.mjs +103 -0
  630. package/dist/lib/esm/command-handlers/editor-command-handler.d.mts +208 -0
  631. package/dist/lib/esm/command-handlers/editor-command-handler.mjs +254 -0
  632. package/dist/lib/esm/command-handlers/file-command-handler.d.mts +143 -0
  633. package/dist/lib/esm/command-handlers/file-command-handler.mjs +192 -0
  634. package/dist/lib/esm/command-handlers/folder-command-handler.d.mts +149 -0
  635. package/dist/lib/esm/command-handlers/folder-command-handler.mjs +200 -0
  636. package/dist/lib/esm/command-handlers/global-command-handler.d.mts +40 -0
  637. package/dist/lib/esm/command-handlers/global-command-handler.mjs +88 -0
  638. package/dist/lib/esm/command-handlers/index.d.mts +11 -0
  639. package/dist/lib/esm/command-handlers/index.mjs +64 -0
  640. package/dist/lib/esm/command-handlers/open-demo-vault-command-handler.d.mts +73 -0
  641. package/dist/lib/esm/command-handlers/open-demo-vault-command-handler.mjs +102 -0
  642. package/dist/lib/esm/command-handlers/open-settings-command-handler.d.mts +44 -0
  643. package/dist/lib/esm/command-handlers/open-settings-command-handler.mjs +77 -0
  644. package/dist/lib/esm/command-handlers/unlock-active-note-command-handler.d.mts +54 -0
  645. package/dist/lib/esm/command-handlers/unlock-active-note-command-handler.mjs +90 -0
  646. package/dist/lib/esm/command-registrar.d.mts +48 -0
  647. package/dist/lib/esm/command-registrar.mjs +72 -0
  648. package/dist/lib/esm/community-plugins.d.mts +270 -0
  649. package/dist/lib/esm/community-plugins.mjs +214 -0
  650. package/dist/lib/esm/components/abort-signal-component.d.mts +30 -0
  651. package/dist/lib/esm/components/abort-signal-component.mjs +75 -0
  652. package/dist/lib/esm/components/all-windows-event-component.d.mts +84 -0
  653. package/dist/lib/esm/components/all-windows-event-component.mjs +117 -0
  654. package/dist/lib/esm/components/async-error-handler-component.d.mts +30 -0
  655. package/dist/lib/esm/components/async-error-handler-component.mjs +79 -0
  656. package/dist/lib/esm/components/async-events-component.d.mts +15 -0
  657. package/dist/lib/esm/components/async-events-component.mjs +51 -0
  658. package/dist/lib/esm/components/case-insensitive-file-index-component.d.mts +36 -0
  659. package/dist/lib/esm/components/case-insensitive-file-index-component.mjs +93 -0
  660. package/dist/lib/esm/components/component-ex.d.mts +229 -0
  661. package/dist/lib/esm/components/component-ex.mjs +413 -0
  662. package/dist/lib/esm/components/console-debug-component.d.mts +30 -0
  663. package/dist/lib/esm/components/console-debug-component.mjs +73 -0
  664. package/dist/lib/esm/components/core-plugin-toggle-component.d.mts +102 -0
  665. package/dist/lib/esm/components/core-plugin-toggle-component.mjs +105 -0
  666. package/dist/lib/esm/components/disposable-component.d.mts +24 -0
  667. package/dist/lib/esm/components/disposable-component.mjs +57 -0
  668. package/dist/lib/esm/components/embed-extensions-component.d.mts +38 -0
  669. package/dist/lib/esm/components/embed-extensions-component.mjs +77 -0
  670. package/dist/lib/esm/components/generate-markdown-link-default-params-component.d.mts +42 -0
  671. package/dist/lib/esm/components/generate-markdown-link-default-params-component.mjs +73 -0
  672. package/dist/lib/esm/components/index.d.mts +30 -0
  673. package/dist/lib/esm/components/index.mjs +102 -0
  674. package/dist/lib/esm/components/layout-ready-component.d.mts +48 -0
  675. package/dist/lib/esm/components/layout-ready-component.mjs +113 -0
  676. package/dist/lib/esm/components/menu-event-registrar-component.d.mts +52 -0
  677. package/dist/lib/esm/components/menu-event-registrar-component.mjs +99 -0
  678. package/dist/lib/esm/components/monkey-around-component.d.mts +241 -0
  679. package/dist/lib/esm/components/monkey-around-component.mjs +146 -0
  680. package/dist/lib/esm/components/notebook-navigator-menu-event-registrar-component.d.mts +150 -0
  681. package/dist/lib/esm/components/notebook-navigator-menu-event-registrar-component.mjs +227 -0
  682. package/dist/lib/esm/components/plugin-context-component.d.mts +36 -0
  683. package/dist/lib/esm/components/plugin-context-component.mjs +86 -0
  684. package/dist/lib/esm/components/plugin-gate-component.d.mts +332 -0
  685. package/dist/lib/esm/components/plugin-gate-component.mjs +464 -0
  686. package/dist/lib/esm/components/plugin-notice-component.d.mts +362 -0
  687. package/dist/lib/esm/components/plugin-notice-component.mjs +535 -0
  688. package/dist/lib/esm/components/plugin-settings-component.d.mts +362 -0
  689. package/dist/lib/esm/components/plugin-settings-component.mjs +554 -0
  690. package/dist/lib/esm/components/plugin-settings-tab-component.d.mts +39 -0
  691. package/dist/lib/esm/components/plugin-settings-tab-component.mjs +73 -0
  692. package/dist/lib/esm/components/plugin-suggestion-component.d.mts +162 -0
  693. package/dist/lib/esm/components/plugin-suggestion-component.mjs +184 -0
  694. package/dist/lib/esm/components/pointer-position-component.d.mts +29 -0
  695. package/dist/lib/esm/components/pointer-position-component.mjs +69 -0
  696. package/dist/lib/esm/components/registry-component.d.mts +37 -0
  697. package/dist/lib/esm/components/registry-component.mjs +90 -0
  698. package/dist/lib/esm/components/release-notes-component.d.mts +129 -0
  699. package/dist/lib/esm/components/release-notes-component.mjs +128 -0
  700. package/dist/lib/esm/components/rename-delete-handler-component.d.mts +165 -0
  701. package/dist/lib/esm/components/rename-delete-handler-component.mjs +1230 -0
  702. package/dist/lib/esm/components/rmdir-guard-component.d.mts +76 -0
  703. package/dist/lib/esm/components/rmdir-guard-component.mjs +92 -0
  704. package/dist/lib/esm/components/settings-migration-component.d.mts +120 -0
  705. package/dist/lib/esm/components/settings-migration-component.mjs +125 -0
  706. package/dist/lib/esm/components/syntax-highlighting-component.d.mts +149 -0
  707. package/dist/lib/esm/components/syntax-highlighting-component.mjs +151 -0
  708. package/dist/lib/esm/components/templates-language-component.d.mts +124 -0
  709. package/dist/lib/esm/components/templates-language-component.mjs +179 -0
  710. package/dist/lib/esm/constructors/get-dom-events-handlers-constructor.d.mts +22 -0
  711. package/dist/lib/esm/constructors/get-dom-events-handlers-constructor.mjs +149 -0
  712. package/dist/lib/esm/constructors/index.d.mts +2 -0
  713. package/dist/lib/esm/constructors/index.mjs +46 -0
  714. package/dist/lib/esm/css-class.d.mts +278 -0
  715. package/dist/lib/esm/css-class.mjs +111 -0
  716. package/dist/lib/esm/data-handler.d.mts +49 -0
  717. package/dist/lib/esm/data-handler.mjs +73 -0
  718. package/dist/lib/esm/dataview-link.d.mts +42 -0
  719. package/dist/lib/esm/dataview-link.mjs +66 -0
  720. package/dist/lib/esm/dataview.d.mts +249 -0
  721. package/dist/lib/esm/dataview.mjs +280 -0
  722. package/dist/lib/esm/debug.d.mts +19 -0
  723. package/dist/lib/esm/debug.mjs +51 -0
  724. package/dist/lib/esm/demo-vault-helper-settings.d.mts +29 -0
  725. package/dist/lib/esm/demo-vault-helper-settings.mjs +42 -0
  726. package/dist/lib/esm/demo-vault-helper.d.mts +61 -0
  727. package/dist/lib/esm/demo-vault-helper.mjs +142 -0
  728. package/dist/lib/esm/demo-vault-naming.d.mts +54 -0
  729. package/dist/lib/esm/demo-vault-naming.mjs +59 -0
  730. package/dist/lib/esm/desktop-demo-vault-opener.d.mts +76 -0
  731. package/dist/lib/esm/desktop-demo-vault-opener.mjs +266 -0
  732. package/dist/lib/esm/desktop-trusted-input.d.mts +288 -0
  733. package/dist/lib/esm/desktop-trusted-input.mjs +198 -0
  734. package/dist/lib/esm/editor-extension-registrar.d.mts +37 -0
  735. package/dist/lib/esm/editor-extension-registrar.mjs +65 -0
  736. package/dist/lib/esm/editor-suggest-registrar.d.mts +36 -0
  737. package/dist/lib/esm/editor-suggest-registrar.mjs +68 -0
  738. package/dist/lib/esm/editor.d.mts +45 -0
  739. package/dist/lib/esm/editor.mjs +107 -0
  740. package/dist/lib/esm/events.d.mts +98 -0
  741. package/dist/lib/esm/events.mjs +73 -0
  742. package/dist/lib/esm/extensions-registrar.d.mts +51 -0
  743. package/dist/lib/esm/extensions-registrar.mjs +65 -0
  744. package/dist/lib/esm/file-change.d.mts +156 -0
  745. package/dist/lib/esm/file-change.mjs +473 -0
  746. package/dist/lib/esm/file-explorer.d.mts +34 -0
  747. package/dist/lib/esm/file-explorer.mjs +60 -0
  748. package/dist/lib/esm/file-manager.d.mts +123 -0
  749. package/dist/lib/esm/file-manager.mjs +161 -0
  750. package/dist/lib/esm/file-system.d.mts +554 -0
  751. package/dist/lib/esm/file-system.mjs +458 -0
  752. package/dist/lib/esm/folder-note.d.mts +166 -0
  753. package/dist/lib/esm/folder-note.mjs +161 -0
  754. package/dist/lib/esm/frontmatter-formatting.d.mts +44 -0
  755. package/dist/lib/esm/frontmatter-formatting.mjs +368 -0
  756. package/dist/lib/esm/frontmatter-link-cache-with-offsets.d.mts +34 -0
  757. package/dist/lib/esm/frontmatter-link-cache-with-offsets.mjs +61 -0
  758. package/dist/lib/esm/frontmatter.d.mts +145 -0
  759. package/dist/lib/esm/frontmatter.mjs +174 -0
  760. package/dist/lib/esm/generated-during-build.d.mts +25 -0
  761. package/dist/lib/esm/generated-during-build.mjs +48 -0
  762. package/dist/lib/esm/hover-link-source-registrar.d.mts +52 -0
  763. package/dist/lib/esm/hover-link-source-registrar.mjs +65 -0
  764. package/dist/lib/esm/html-element.d.mts +98 -0
  765. package/dist/lib/esm/html-element.mjs +86 -0
  766. package/dist/lib/esm/i18n/custom-type-options.d.mts +38 -0
  767. package/dist/lib/esm/i18n/custom-type-options.mjs +43 -0
  768. package/dist/lib/esm/i18n/default-translations.d.mts +15 -0
  769. package/dist/lib/esm/i18n/default-translations.mjs +43 -0
  770. package/dist/lib/esm/i18n/i18n.d.mts +38 -0
  771. package/dist/lib/esm/i18n/i18n.mjs +89 -0
  772. package/dist/lib/esm/i18n/index.d.mts +5 -0
  773. package/dist/lib/esm/i18n/index.mjs +52 -0
  774. package/dist/lib/esm/i18n/locales/en.d.mts +91 -0
  775. package/dist/lib/esm/i18n/locales/en.mjs +127 -0
  776. package/dist/lib/esm/i18n/locales/index.d.mts +3 -0
  777. package/dist/lib/esm/i18n/locales/index.mjs +48 -0
  778. package/dist/lib/esm/i18n/locales/translations-map.d.mts +100 -0
  779. package/dist/lib/esm/i18n/locales/translations-map.mjs +52 -0
  780. package/dist/lib/esm/index.d.mts +96 -0
  781. package/dist/lib/esm/index.mjs +234 -0
  782. package/dist/lib/esm/is-in-obsidian.d.mts +12 -0
  783. package/dist/lib/esm/is-in-obsidian.mjs +59 -0
  784. package/dist/lib/esm/library-styles.d.mts +56 -0
  785. package/dist/lib/esm/library-styles.mjs +72 -0
  786. package/dist/lib/esm/library.d.mts +57 -0
  787. package/dist/lib/esm/library.mjs +83 -0
  788. package/dist/lib/esm/link-name.d.mts +23 -0
  789. package/dist/lib/esm/link-name.mjs +48 -0
  790. package/dist/lib/esm/link-update-progress.d.mts +32 -0
  791. package/dist/lib/esm/link-update-progress.mjs +42 -0
  792. package/dist/lib/esm/link.d.mts +1369 -0
  793. package/dist/lib/esm/link.mjs +988 -0
  794. package/dist/lib/esm/logger.d.mts +37 -0
  795. package/dist/lib/esm/logger.mjs +115 -0
  796. package/dist/lib/esm/loop.d.mts +104 -0
  797. package/dist/lib/esm/loop.mjs +151 -0
  798. package/dist/lib/esm/markdown-code-block-processor-registrar.d.mts +62 -0
  799. package/dist/lib/esm/markdown-code-block-processor-registrar.mjs +69 -0
  800. package/dist/lib/esm/markdown-code-block-processor.d.mts +137 -0
  801. package/dist/lib/esm/markdown-code-block-processor.mjs +356 -0
  802. package/dist/lib/esm/markdown-post-processor-registrar.d.mts +59 -0
  803. package/dist/lib/esm/markdown-post-processor-registrar.mjs +66 -0
  804. package/dist/lib/esm/markdown-view.d.mts +14 -0
  805. package/dist/lib/esm/markdown-view.mjs +54 -0
  806. package/dist/lib/esm/markdown.d.mts +226 -0
  807. package/dist/lib/esm/markdown.mjs +391 -0
  808. package/dist/lib/esm/menu-event-registrar.d.mts +84 -0
  809. package/dist/lib/esm/menu-event-registrar.mjs +42 -0
  810. package/dist/lib/esm/metadata-cache.d.mts +359 -0
  811. package/dist/lib/esm/metadata-cache.mjs +454 -0
  812. package/dist/lib/esm/mobile-trusted-input.d.mts +98 -0
  813. package/dist/lib/esm/mobile-trusted-input.mjs +82 -0
  814. package/dist/lib/esm/modals/alert.d.mts +35 -0
  815. package/dist/lib/esm/modals/alert.mjs +84 -0
  816. package/dist/lib/esm/modals/confirm.d.mts +39 -0
  817. package/dist/lib/esm/modals/confirm.mjs +94 -0
  818. package/dist/lib/esm/modals/index.d.mts +10 -0
  819. package/dist/lib/esm/modals/index.mjs +62 -0
  820. package/dist/lib/esm/modals/minimizable-modal.d.mts +129 -0
  821. package/dist/lib/esm/modals/minimizable-modal.mjs +348 -0
  822. package/dist/lib/esm/modals/modal-command-builder.d.mts +285 -0
  823. package/dist/lib/esm/modals/modal-command-builder.mjs +363 -0
  824. package/dist/lib/esm/modals/modal.d.mts +64 -0
  825. package/dist/lib/esm/modals/modal.mjs +78 -0
  826. package/dist/lib/esm/modals/prompt.d.mts +83 -0
  827. package/dist/lib/esm/modals/prompt.mjs +168 -0
  828. package/dist/lib/esm/modals/select-item.d.mts +55 -0
  829. package/dist/lib/esm/modals/select-item.mjs +104 -0
  830. package/dist/lib/esm/modals/select-option.d.mts +65 -0
  831. package/dist/lib/esm/modals/select-option.mjs +95 -0
  832. package/dist/lib/esm/modals/suggest-modal-command-builder.d.mts +35 -0
  833. package/dist/lib/esm/modals/suggest-modal-command-builder.mjs +47 -0
  834. package/dist/lib/esm/note-priority.d.mts +154 -0
  835. package/dist/lib/esm/note-priority.mjs +135 -0
  836. package/dist/lib/esm/notebook-navigator.d.mts +132 -0
  837. package/dist/lib/esm/notebook-navigator.mjs +64 -0
  838. package/dist/lib/esm/obsidian-dev-utils-state.d.mts +42 -0
  839. package/dist/lib/esm/obsidian-dev-utils-state.mjs +76 -0
  840. package/dist/lib/esm/obsidian-protocol-handler-registrar.d.mts +55 -0
  841. package/dist/lib/esm/obsidian-protocol-handler-registrar.mjs +68 -0
  842. package/dist/lib/esm/obsidian-settings.d.mts +62 -0
  843. package/dist/lib/esm/obsidian-settings.mjs +81 -0
  844. package/dist/lib/esm/parse-link.d.mts +288 -0
  845. package/dist/lib/esm/parse-link.mjs +428 -0
  846. package/dist/lib/esm/path-settings.d.mts +56 -0
  847. package/dist/lib/esm/path-settings.mjs +176 -0
  848. package/dist/lib/esm/pdf.d.mts +26 -0
  849. package/dist/lib/esm/pdf.mjs +76 -0
  850. package/dist/lib/esm/plugin/index.d.mts +9 -0
  851. package/dist/lib/esm/plugin/index.mjs +60 -0
  852. package/dist/lib/esm/plugin/plugin-api.d.mts +413 -0
  853. package/dist/lib/esm/plugin/plugin-api.mjs +422 -0
  854. package/dist/lib/esm/plugin/plugin-context.d.mts +27 -0
  855. package/dist/lib/esm/plugin/plugin-context.mjs +101 -0
  856. package/dist/lib/esm/plugin/plugin-event-source.d.mts +97 -0
  857. package/dist/lib/esm/plugin/plugin-event-source.mjs +129 -0
  858. package/dist/lib/esm/plugin/plugin-install-state.d.mts +113 -0
  859. package/dist/lib/esm/plugin/plugin-install-state.mjs +101 -0
  860. package/dist/lib/esm/plugin/plugin-lifecycle-events.d.mts +127 -0
  861. package/dist/lib/esm/plugin/plugin-lifecycle-events.mjs +52 -0
  862. package/dist/lib/esm/plugin/plugin-settings-tab.d.mts +368 -0
  863. package/dist/lib/esm/plugin/plugin-settings-tab.mjs +527 -0
  864. package/dist/lib/esm/plugin/plugin.d.mts +363 -0
  865. package/dist/lib/esm/plugin/plugin.mjs +611 -0
  866. package/dist/lib/esm/plugin/settings-migration-api.d.mts +91 -0
  867. package/dist/lib/esm/plugin/settings-migration-api.mjs +42 -0
  868. package/dist/lib/esm/plugin-cli-handler-registrar.d.mts +64 -0
  869. package/dist/lib/esm/plugin-cli-handler-registrar.mjs +66 -0
  870. package/dist/lib/esm/popovers/field-popover.d.mts +75 -0
  871. package/dist/lib/esm/popovers/field-popover.mjs +88 -0
  872. package/dist/lib/esm/popovers/index.d.mts +4 -0
  873. package/dist/lib/esm/popovers/index.mjs +50 -0
  874. package/dist/lib/esm/popovers/popover-anchor.d.mts +67 -0
  875. package/dist/lib/esm/popovers/popover-anchor.mjs +82 -0
  876. package/dist/lib/esm/popovers/popover.d.mts +78 -0
  877. package/dist/lib/esm/popovers/popover.mjs +132 -0
  878. package/dist/lib/esm/property-entry.d.mts +43 -0
  879. package/dist/lib/esm/property-entry.mjs +73 -0
  880. package/dist/lib/esm/queue.d.mts +93 -0
  881. package/dist/lib/esm/queue.mjs +122 -0
  882. package/dist/lib/esm/react/app-context.d.mts +24 -0
  883. package/dist/lib/esm/react/app-context.mjs +56 -0
  884. package/dist/lib/esm/react/index.d.mts +2 -0
  885. package/dist/lib/esm/react/index.mjs +46 -0
  886. package/dist/lib/esm/reference.d.mts +116 -0
  887. package/dist/lib/esm/reference.mjs +87 -0
  888. package/dist/lib/esm/resource-lock.d.mts +318 -0
  889. package/dist/lib/esm/resource-lock.mjs +1006 -0
  890. package/dist/lib/esm/resource-url.d.mts +31 -0
  891. package/dist/lib/esm/resource-url.mjs +59 -0
  892. package/dist/lib/esm/ribbon-icon-registrar.d.mts +60 -0
  893. package/dist/lib/esm/ribbon-icon-registrar.mjs +66 -0
  894. package/dist/lib/esm/setting-components/checkbox-component.d.mts +69 -0
  895. package/dist/lib/esm/setting-components/checkbox-component.mjs +119 -0
  896. package/dist/lib/esm/setting-components/code-highlighter-component.d.mts +132 -0
  897. package/dist/lib/esm/setting-components/code-highlighter-component.mjs +287 -0
  898. package/dist/lib/esm/setting-components/date-component.d.mts +38 -0
  899. package/dist/lib/esm/setting-components/date-component.mjs +83 -0
  900. package/dist/lib/esm/setting-components/date-time-component.d.mts +38 -0
  901. package/dist/lib/esm/setting-components/date-time-component.mjs +83 -0
  902. package/dist/lib/esm/setting-components/email-component.d.mts +49 -0
  903. package/dist/lib/esm/setting-components/email-component.mjs +94 -0
  904. package/dist/lib/esm/setting-components/file-component.d.mts +43 -0
  905. package/dist/lib/esm/setting-components/file-component.mjs +86 -0
  906. package/dist/lib/esm/setting-components/index.d.mts +27 -0
  907. package/dist/lib/esm/setting-components/index.mjs +96 -0
  908. package/dist/lib/esm/setting-components/month-component.d.mts +51 -0
  909. package/dist/lib/esm/setting-components/month-component.mjs +91 -0
  910. package/dist/lib/esm/setting-components/multiple-dropdown-component.d.mts +92 -0
  911. package/dist/lib/esm/setting-components/multiple-dropdown-component.mjs +159 -0
  912. package/dist/lib/esm/setting-components/multiple-email-component.d.mts +38 -0
  913. package/dist/lib/esm/setting-components/multiple-email-component.mjs +80 -0
  914. package/dist/lib/esm/setting-components/multiple-file-component.d.mts +43 -0
  915. package/dist/lib/esm/setting-components/multiple-file-component.mjs +88 -0
  916. package/dist/lib/esm/setting-components/multiple-text-component.d.mts +109 -0
  917. package/dist/lib/esm/setting-components/multiple-text-component.mjs +178 -0
  918. package/dist/lib/esm/setting-components/number-component.d.mts +56 -0
  919. package/dist/lib/esm/setting-components/number-component.mjs +104 -0
  920. package/dist/lib/esm/setting-components/password-component.d.mts +38 -0
  921. package/dist/lib/esm/setting-components/password-component.mjs +80 -0
  922. package/dist/lib/esm/setting-components/setting-component-wrapper.d.mts +13 -0
  923. package/dist/lib/esm/setting-components/setting-component-wrapper.mjs +63 -0
  924. package/dist/lib/esm/setting-components/telephone-component.d.mts +51 -0
  925. package/dist/lib/esm/setting-components/telephone-component.mjs +94 -0
  926. package/dist/lib/esm/setting-components/text-based-component.d.mts +38 -0
  927. package/dist/lib/esm/setting-components/text-based-component.mjs +73 -0
  928. package/dist/lib/esm/setting-components/time-component.d.mts +38 -0
  929. package/dist/lib/esm/setting-components/time-component.mjs +88 -0
  930. package/dist/lib/esm/setting-components/tri-state-checkbox-component.d.mts +69 -0
  931. package/dist/lib/esm/setting-components/tri-state-checkbox-component.mjs +120 -0
  932. package/dist/lib/esm/setting-components/typed-dropdown-component.d.mts +97 -0
  933. package/dist/lib/esm/setting-components/typed-dropdown-component.mjs +168 -0
  934. package/dist/lib/esm/setting-components/typed-multiple-dropdown-component.d.mts +99 -0
  935. package/dist/lib/esm/setting-components/typed-multiple-dropdown-component.mjs +167 -0
  936. package/dist/lib/esm/setting-components/typed-range-text-component.d.mts +35 -0
  937. package/dist/lib/esm/setting-components/typed-range-text-component.mjs +78 -0
  938. package/dist/lib/esm/setting-components/typed-text-component.d.mts +100 -0
  939. package/dist/lib/esm/setting-components/typed-text-component.mjs +138 -0
  940. package/dist/lib/esm/setting-components/url-component.d.mts +49 -0
  941. package/dist/lib/esm/setting-components/url-component.mjs +94 -0
  942. package/dist/lib/esm/setting-components/validator-component.d.mts +23 -0
  943. package/dist/lib/esm/setting-components/validator-component.mjs +142 -0
  944. package/dist/lib/esm/setting-components/value-component-with-change-tracking.d.mts +20 -0
  945. package/dist/lib/esm/setting-components/value-component-with-change-tracking.mjs +42 -0
  946. package/dist/lib/esm/setting-components/week-component.d.mts +51 -0
  947. package/dist/lib/esm/setting-components/week-component.mjs +91 -0
  948. package/dist/lib/esm/setting-ex.d.mts +198 -0
  949. package/dist/lib/esm/setting-ex.mjs +274 -0
  950. package/dist/lib/esm/setting-group-ex.d.mts +26 -0
  951. package/dist/lib/esm/setting-group-ex.mjs +68 -0
  952. package/dist/lib/esm/status-bar-item-registrar.d.mts +36 -0
  953. package/dist/lib/esm/status-bar-item-registrar.mjs +65 -0
  954. package/dist/lib/esm/templater.d.mts +284 -0
  955. package/dist/lib/esm/templater.mjs +173 -0
  956. package/dist/lib/esm/transformers/duration-transformer.d.mts +39 -0
  957. package/dist/lib/esm/transformers/duration-transformer.mjs +85 -0
  958. package/dist/lib/esm/transformers/index.d.mts +2 -0
  959. package/dist/lib/esm/transformers/index.mjs +46 -0
  960. package/dist/lib/esm/trusted-input.d.mts +131 -0
  961. package/dist/lib/esm/trusted-input.mjs +83 -0
  962. package/dist/lib/esm/validation.d.mts +87 -0
  963. package/dist/lib/esm/validation.mjs +87 -0
  964. package/dist/lib/esm/vault-delete.d.mts +82 -0
  965. package/dist/lib/esm/vault-delete.mjs +132 -0
  966. package/dist/lib/esm/vault-transaction.d.mts +163 -0
  967. package/dist/lib/esm/vault-transaction.mjs +325 -0
  968. package/dist/lib/esm/vault.d.mts +506 -0
  969. package/dist/lib/esm/vault.mjs +604 -0
  970. package/dist/lib/esm/view-registrar.d.mts +52 -0
  971. package/dist/lib/esm/view-registrar.mjs +65 -0
  972. package/dist/lib/esm/workspace.d.mts +81 -0
  973. package/dist/lib/esm/workspace.mjs +84 -0
  974. package/dist/styles.css +497 -0
  975. package/i18n/custom-type-options/package.json +6 -0
  976. package/i18n/default-translations/package.json +6 -0
  977. package/i18n/i18n/package.json +6 -0
  978. package/i18n/index/package.json +6 -0
  979. package/i18n/locales/en/package.json +6 -0
  980. package/i18n/locales/index/package.json +6 -0
  981. package/i18n/locales/package.json +6 -0
  982. package/i18n/locales/translations-map/package.json +6 -0
  983. package/i18n/package.json +6 -0
  984. package/modals/alert/package.json +6 -0
  985. package/modals/confirm/package.json +6 -0
  986. package/modals/index/package.json +6 -0
  987. package/modals/minimizable-modal/package.json +6 -0
  988. package/modals/modal/package.json +6 -0
  989. package/modals/modal-command-builder/package.json +6 -0
  990. package/modals/package.json +6 -0
  991. package/modals/prompt/package.json +6 -0
  992. package/modals/select-item/package.json +6 -0
  993. package/modals/select-option/package.json +6 -0
  994. package/modals/suggest-modal-command-builder/package.json +6 -0
  995. package/package.json +533 -13
  996. package/plugin/index/package.json +6 -0
  997. package/plugin/package.json +6 -0
  998. package/plugin/plugin/package.json +6 -0
  999. package/plugin/plugin-api/package.json +6 -0
  1000. package/plugin/plugin-context/package.json +6 -0
  1001. package/plugin/plugin-event-source/package.json +6 -0
  1002. package/plugin/plugin-install-state/package.json +6 -0
  1003. package/plugin/plugin-lifecycle-events/package.json +6 -0
  1004. package/plugin/plugin-settings-tab/package.json +6 -0
  1005. package/plugin/settings-migration-api/package.json +6 -0
  1006. package/popovers/field-popover/package.json +6 -0
  1007. package/popovers/index/package.json +6 -0
  1008. package/popovers/package.json +6 -0
  1009. package/popovers/popover/package.json +6 -0
  1010. package/popovers/popover-anchor/package.json +6 -0
  1011. package/react/app-context/package.json +6 -0
  1012. package/react/index/package.json +6 -0
  1013. package/react/package.json +6 -0
  1014. package/setting-components/checkbox-component/package.json +6 -0
  1015. package/setting-components/code-highlighter-component/package.json +6 -0
  1016. package/setting-components/date-component/package.json +6 -0
  1017. package/setting-components/date-time-component/package.json +6 -0
  1018. package/setting-components/email-component/package.json +6 -0
  1019. package/setting-components/file-component/package.json +6 -0
  1020. package/setting-components/index/package.json +6 -0
  1021. package/setting-components/month-component/package.json +6 -0
  1022. package/setting-components/multiple-dropdown-component/package.json +6 -0
  1023. package/setting-components/multiple-email-component/package.json +6 -0
  1024. package/setting-components/multiple-file-component/package.json +6 -0
  1025. package/setting-components/multiple-text-component/package.json +6 -0
  1026. package/setting-components/number-component/package.json +6 -0
  1027. package/setting-components/package.json +6 -0
  1028. package/setting-components/password-component/package.json +6 -0
  1029. package/setting-components/setting-component-wrapper/package.json +6 -0
  1030. package/setting-components/telephone-component/package.json +6 -0
  1031. package/setting-components/text-based-component/package.json +6 -0
  1032. package/setting-components/time-component/package.json +6 -0
  1033. package/setting-components/tri-state-checkbox-component/package.json +6 -0
  1034. package/setting-components/typed-dropdown-component/package.json +6 -0
  1035. package/setting-components/typed-multiple-dropdown-component/package.json +6 -0
  1036. package/setting-components/typed-range-text-component/package.json +6 -0
  1037. package/setting-components/typed-text-component/package.json +6 -0
  1038. package/setting-components/url-component/package.json +6 -0
  1039. package/setting-components/validator-component/package.json +6 -0
  1040. package/setting-components/value-component-with-change-tracking/package.json +6 -0
  1041. package/setting-components/week-component/package.json +6 -0
  1042. package/transformers/duration-transformer/package.json +6 -0
  1043. package/transformers/index/package.json +6 -0
  1044. package/transformers/package.json +6 -0
@@ -0,0 +1,988 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ (function () {
7
+ function ensureDisposeSymbols(symbolConstructor = Symbol) {
8
+ symbolConstructor.asyncDispose ??= symbolConstructor.for("Symbol.asyncDispose");
9
+ symbolConstructor.dispose ??= symbolConstructor.for("Symbol.dispose");
10
+ }
11
+
12
+ function ensureBrowserProcess() {
13
+ const browserProcess = {
14
+ browser: true,
15
+ cwd() {
16
+ return "/";
17
+ },
18
+ env: {},
19
+ platform: "android"
20
+ };
21
+ const existingProcess = globalThis.process;
22
+ if (!existingProcess) {
23
+ globalThis.process = browserProcess;
24
+ return;
25
+ }
26
+ if (existingProcess.versions?.node) {
27
+ return;
28
+ }
29
+ const existingProcessRecord = existingProcess;
30
+ for (const [key, value] of Object.entries(browserProcess)) {
31
+ existingProcessRecord[key] ??= value;
32
+ }
33
+ existingProcessRecord["browser"] = true;
34
+ }
35
+
36
+ (function initEsm() {
37
+ ensureDisposeSymbols();
38
+ ensureBrowserProcess();
39
+ })();
40
+ })();
41
+
42
+ var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
43
+ var __typeError = (msg) => {
44
+ throw TypeError(msg);
45
+ };
46
+ var __using = (stack, value, async) => {
47
+ if (value != null) {
48
+ if (typeof value !== "object" && typeof value !== "function") __typeError("Object expected");
49
+ var dispose, inner;
50
+ if (async) dispose = value[__knownSymbol("asyncDispose")];
51
+ if (dispose === void 0) {
52
+ dispose = value[__knownSymbol("dispose")];
53
+ if (async) inner = dispose;
54
+ }
55
+ if (typeof dispose !== "function") __typeError("Object not disposable");
56
+ if (inner) dispose = function() {
57
+ try {
58
+ inner.call(this);
59
+ } catch (e) {
60
+ return Promise.reject(e);
61
+ }
62
+ };
63
+ stack.push([async, dispose, value]);
64
+ } else if (async) {
65
+ stack.push([async]);
66
+ }
67
+ return value;
68
+ };
69
+ var __callDispose = (stack, error, hasError) => {
70
+ var E = typeof SuppressedError === "function" ? SuppressedError : function(e, s, m, _) {
71
+ return _ = Error(m), _.name = "SuppressedError", _.error = e, _.suppressed = s, _;
72
+ };
73
+ var fail = (e) => error = hasError ? new E(e, error, "An error was suppressed during disposal") : (hasError = true, e);
74
+ var next = (it) => {
75
+ while (it = stack.pop()) {
76
+ try {
77
+ var result = it[1] && it[1].call(it[2]);
78
+ if (it[0]) return Promise.resolve(result).then(next, (e) => (fail(e), next()));
79
+ } catch (e) {
80
+ fail(e);
81
+ }
82
+ }
83
+ if (hasError) throw error;
84
+ };
85
+ return next();
86
+ };
87
+ import { abortSignalNever } from "@mnaoumov/typescript-lib/abort-controller";
88
+ import {
89
+ normalizeOptionalProperties,
90
+ removeUndefinedProperties
91
+ } from "@mnaoumov/typescript-lib/object-utils";
92
+ import {
93
+ basename,
94
+ dirname,
95
+ extname,
96
+ join,
97
+ relative
98
+ } from "@mnaoumov/typescript-lib/path";
99
+ import {
100
+ normalizeString,
101
+ replaceAll,
102
+ trimEnd
103
+ } from "@mnaoumov/typescript-lib/string";
104
+ import {
105
+ assertNever,
106
+ assertNonNullable,
107
+ ensureNonNullable
108
+ } from "@mnaoumov/typescript-lib/type-guards";
109
+ import {
110
+ encodeUrl,
111
+ normalizeFileUrl
112
+ } from "@mnaoumov/typescript-lib/url";
113
+ import {
114
+ InternalPluginName,
115
+ isReferenceCache
116
+ } from "@obsidian-typings/obsidian-public-latest/implementations";
117
+ import {
118
+ normalizePath,
119
+ parseLinktext
120
+ } from "obsidian";
121
+ import { getObsidianLibDebugger } from "./debug.mjs";
122
+ import {
123
+ applyContentChanges,
124
+ applyFileChanges,
125
+ isCanvasChange,
126
+ isContentChange
127
+ } from "./file-change.mjs";
128
+ import {
129
+ getFile,
130
+ getPath,
131
+ isCanvasFile,
132
+ isMarkdownFile,
133
+ MARKDOWN_FILE_EXTENSION
134
+ } from "./file-system.mjs";
135
+ import {
136
+ getBacklinksForFileSafe,
137
+ getCacheSafe,
138
+ getLinks,
139
+ parseMetadata,
140
+ registerFiles
141
+ } from "./metadata-cache.mjs";
142
+ import { getObsidianDevUtilsState } from "./obsidian-dev-utils-state.mjs";
143
+ import {
144
+ getNewLinkFormat,
145
+ shouldUseWikilinks
146
+ } from "./obsidian-settings.mjs";
147
+ import {
148
+ escapeAlias,
149
+ isParseLinkFrontmatterReference,
150
+ isParseLinkReference,
151
+ parseLink
152
+ } from "./parse-link.mjs";
153
+ import {
154
+ isCanvasFileNodeReference,
155
+ isReferenceInOffsetRange,
156
+ referenceToFileChange
157
+ } from "./reference.mjs";
158
+ const ESCAPED_WIKILINK_DIVIDER = String.raw`\|`;
159
+ const OPTIONALLY_ESCAPED_WIKILINK_DIVIDER_REGEXP = /\\?\|/g;
160
+ const UNESCAPED_WIKILINK_DIVIDER_REGEXP = /(?:^|[^\\])\|/;
161
+ const snapshotLinkIdentityKeyProviders = /* @__PURE__ */ new WeakMap();
162
+ var LinkPathStyle = /* @__PURE__ */ ((LinkPathStyle2) => {
163
+ LinkPathStyle2["AbsolutePathInVault"] = "AbsolutePathInVault";
164
+ LinkPathStyle2["ObsidianSettingsDefault"] = "ObsidianSettingsDefault";
165
+ LinkPathStyle2["RelativePathToTheSource"] = "RelativePathToTheSource";
166
+ LinkPathStyle2["ShortestPathWhenPossible"] = "ShortestPathWhenPossible";
167
+ return LinkPathStyle2;
168
+ })(LinkPathStyle || {});
169
+ var LinkStyle = /* @__PURE__ */ ((LinkStyle2) => {
170
+ LinkStyle2["Markdown"] = "Markdown";
171
+ LinkStyle2["ObsidianSettingsDefault"] = "ObsidianSettingsDefault";
172
+ LinkStyle2["PreserveExisting"] = "PreserveExisting";
173
+ LinkStyle2["Wikilink"] = "Wikilink";
174
+ return LinkStyle2;
175
+ })(LinkStyle || {});
176
+ function buildBacklinksSnapshot(params) {
177
+ const {
178
+ backlinks,
179
+ linkIdentityKeyProvider: explicitLinkIdentityKeyProvider,
180
+ pathRemapper,
181
+ payloadProvider,
182
+ target
183
+ } = params;
184
+ const snapshot = target ?? /* @__PURE__ */ new Map();
185
+ const linkIdentityKeyProvider = resolveSnapshotLinkIdentityKeyProvider({
186
+ callerName: "buildBacklinksSnapshot",
187
+ explicitLinkIdentityKeyProvider,
188
+ snapshot
189
+ });
190
+ snapshotLinkIdentityKeyProviders.set(snapshot, linkIdentityKeyProvider);
191
+ for (const backlinkPath of backlinks.keys()) {
192
+ const newBacklinkPath = pathRemapper?.(backlinkPath) ?? backlinkPath;
193
+ let payloads = snapshot.get(newBacklinkPath);
194
+ if (!payloads) {
195
+ payloads = /* @__PURE__ */ new Map();
196
+ snapshot.set(newBacklinkPath, payloads);
197
+ }
198
+ for (const link of backlinks.get(backlinkPath) ?? []) {
199
+ payloads.set(linkIdentityKeyProvider(link), payloadProvider(link));
200
+ }
201
+ }
202
+ return snapshot;
203
+ }
204
+ function convertLink(params) {
205
+ const targetFile = extractLinkFile({
206
+ app: params.app,
207
+ link: params.link,
208
+ sourcePathOrFile: params.oldSourcePathOrFile ?? params.newSourcePathOrFile
209
+ });
210
+ return targetFile ? updateLink(normalizeOptionalProperties({
211
+ app: params.app,
212
+ isEmptyEmbedAliasAllowed: params.isEmptyEmbedAliasAllowed,
213
+ link: params.link,
214
+ linkPathStyle: params.linkPathStyle,
215
+ linkStyle: params.linkStyle,
216
+ newSourcePathOrFile: params.newSourcePathOrFile,
217
+ newTargetPathOrFile: targetFile,
218
+ oldSourcePathOrFile: params.oldSourcePathOrFile,
219
+ shouldEscapeAlias: params.shouldEscapeAlias,
220
+ shouldIncludeAttachmentExtensionToEmbedAlias: params.shouldIncludeAttachmentExtensionToEmbedAlias,
221
+ shouldUpdateFileNameAlias: params.shouldUpdateFileNameAlias,
222
+ shouldUseAngleBrackets: params.shouldUseAngleBrackets,
223
+ shouldUseLeadingDotForRelativePaths: params.shouldUseLeadingDotForRelativePaths,
224
+ shouldUseLeadingSlashForAbsolutePaths: params.shouldUseLeadingSlashForAbsolutePaths
225
+ })) : params.link.original;
226
+ }
227
+ async function editBacklinks(params) {
228
+ const {
229
+ app,
230
+ linkConverter,
231
+ linkUpdateProgressReporter,
232
+ pathOrFile,
233
+ ...options
234
+ } = params;
235
+ const backlinks = await getBacklinksForFileSafe({ app, pathOrFile, ...options });
236
+ const snapshot = buildBacklinksSnapshot({
237
+ backlinks,
238
+ payloadProvider: getUndefinedPayload
239
+ });
240
+ await editBacklinksSnapshot(normalizeOptionalProperties({
241
+ app,
242
+ linkConverter: ({ link }) => linkConverter(link),
243
+ linkUpdateProgressReporter,
244
+ snapshot,
245
+ ...options
246
+ }));
247
+ }
248
+ async function editBacklinksSnapshot(params) {
249
+ const {
250
+ app,
251
+ linkConverter,
252
+ linkIdentityKeyProvider: explicitLinkIdentityKeyProvider,
253
+ linkUpdateProgressReporter,
254
+ shouldVisitUnmatchedLinks = false,
255
+ snapshot,
256
+ ...options
257
+ } = params;
258
+ const linkIdentityKeyProvider = resolveSnapshotLinkIdentityKeyProvider({
259
+ callerName: "editBacklinksSnapshot",
260
+ explicitLinkIdentityKeyProvider,
261
+ snapshot
262
+ });
263
+ const backlinkNotePaths = [...snapshot.keys()];
264
+ let processed = 0;
265
+ for (const backlinkNotePath of backlinkNotePaths) {
266
+ const payloads = ensureNonNullable(snapshot.get(backlinkNotePath));
267
+ await editLinks({
268
+ app,
269
+ linkConverter: (link) => {
270
+ const linkIdentityKey = linkIdentityKeyProvider(link);
271
+ return !payloads.has(linkIdentityKey) && !shouldVisitUnmatchedLinks ? void 0 : linkConverter({
272
+ link,
273
+ payload: payloads.get(linkIdentityKey),
274
+ sourcePath: backlinkNotePath
275
+ });
276
+ },
277
+ pathOrFile: backlinkNotePath,
278
+ ...options
279
+ });
280
+ processed++;
281
+ linkUpdateProgressReporter?.({
282
+ currentPath: backlinkNotePath,
283
+ processed,
284
+ total: backlinkNotePaths.length
285
+ });
286
+ }
287
+ }
288
+ async function editLinks(params) {
289
+ const {
290
+ app,
291
+ linkConverter,
292
+ offsetRange,
293
+ pathOrFile,
294
+ shouldEditExternalLinks = false,
295
+ shouldEditFrontmatterExternalLinks = false,
296
+ shouldEditMultiValueFrontmatterExternalLinks = false,
297
+ ...options
298
+ } = params;
299
+ if (offsetRange !== void 0) {
300
+ validateOffsetRange(offsetRange);
301
+ }
302
+ await applyFileChanges({
303
+ app,
304
+ changesProvider: async ({ abortSignal, content }) => {
305
+ const cache = await getCacheSafe(app, pathOrFile, {
306
+ shouldParseExternalLinks: shouldEditExternalLinks,
307
+ shouldParseFrontmatterExternalLinks: shouldEditFrontmatterExternalLinks,
308
+ shouldParseMultiValueFrontmatterExternalLinks: shouldEditMultiValueFrontmatterExternalLinks
309
+ });
310
+ abortSignal.throwIfAborted();
311
+ const file = getFile({ app, pathOrFile });
312
+ const cachedContent = await app.vault.cachedRead(file);
313
+ abortSignal.throwIfAborted();
314
+ return content === cachedContent ? await getFileChanges(normalizeOptionalProperties({
315
+ abortSignal,
316
+ cache,
317
+ isCanvasFileCache: isCanvasFile(pathOrFile),
318
+ linkConverter,
319
+ offsetRange,
320
+ shouldIncludeExternalLinks: shouldEditExternalLinks,
321
+ shouldIncludeFrontmatterExternalLinks: shouldEditFrontmatterExternalLinks,
322
+ shouldIncludeMultiValueFrontmatterExternalLinks: shouldEditMultiValueFrontmatterExternalLinks
323
+ })) : null;
324
+ },
325
+ pathOrFile,
326
+ ...options
327
+ });
328
+ }
329
+ async function editLinksInContent(params) {
330
+ const { app, content, linkConverter, offsetRange, shouldEditExternalLinks = false, shouldEditFrontmatterExternalLinks = false, shouldEditMultiValueFrontmatterExternalLinks = false } = params;
331
+ let { abortSignal } = params;
332
+ abortSignal ??= abortSignalNever();
333
+ abortSignal.throwIfAborted();
334
+ if (offsetRange !== void 0) {
335
+ validateOffsetRange(offsetRange);
336
+ }
337
+ const newContent = await applyContentChanges({
338
+ abortSignal,
339
+ changesProvider: async () => {
340
+ const cache = await parseMetadata(app, content, {
341
+ shouldParseExternalLinks: shouldEditExternalLinks,
342
+ shouldParseFrontmatterExternalLinks: shouldEditFrontmatterExternalLinks,
343
+ shouldParseMultiValueFrontmatterExternalLinks: shouldEditMultiValueFrontmatterExternalLinks
344
+ });
345
+ abortSignal.throwIfAborted();
346
+ const changes = await getFileChanges(normalizeOptionalProperties({
347
+ abortSignal,
348
+ cache,
349
+ isCanvasFileCache: false,
350
+ linkConverter,
351
+ offsetRange,
352
+ shouldIncludeExternalLinks: shouldEditExternalLinks,
353
+ shouldIncludeFrontmatterExternalLinks: shouldEditFrontmatterExternalLinks,
354
+ shouldIncludeMultiValueFrontmatterExternalLinks: shouldEditMultiValueFrontmatterExternalLinks
355
+ }));
356
+ abortSignal.throwIfAborted();
357
+ return changes;
358
+ },
359
+ content,
360
+ path: ""
361
+ });
362
+ abortSignal.throwIfAborted();
363
+ assertNonNullable(newContent, "Failed to update links in content");
364
+ return newContent;
365
+ }
366
+ function extractLinkFile(params) {
367
+ const {
368
+ app,
369
+ link,
370
+ shouldAllowNonExistingFile = false,
371
+ sourcePathOrFile
372
+ } = params;
373
+ const { linkPath } = splitSubpath(link.link);
374
+ const sourcePath = getPath(app, sourcePathOrFile);
375
+ const file = app.metadataCache.getFirstLinkpathDest(linkPath, sourcePath);
376
+ if (file) {
377
+ return file;
378
+ }
379
+ if (!shouldAllowNonExistingFile) {
380
+ return null;
381
+ }
382
+ if (linkPath.startsWith("/")) {
383
+ return getFile({ app, pathOrFile: linkPath, shouldIncludeNonExisting: true });
384
+ }
385
+ const fullLinkPath = join(dirname(sourcePath), `./${linkPath}`);
386
+ return fullLinkPath.startsWith("../") ? null : getFile({ app, pathOrFile: fullLinkPath, shouldIncludeNonExisting: true });
387
+ }
388
+ function generateMarkdownLink(params) {
389
+ var _stack = [];
390
+ try {
391
+ const { app } = params;
392
+ const DEFAULT_PARAMS = {
393
+ isEmptyEmbedAliasAllowed: true
394
+ };
395
+ const customDefaultParams = getGenerateMarkdownLinkDefaultParamsFns().map((defaultParamsFunction) => defaultParamsFunction());
396
+ params = Object.assign({}, DEFAULT_PARAMS, ...customDefaultParams, removeUndefinedProperties({ ...params }));
397
+ const targetFile = getFile(normalizeOptionalProperties({ app, pathOrFile: params.targetPathOrFile, shouldIncludeNonExisting: params.isNonExistingFileAllowed }));
398
+ const _registration = __using(_stack, registerFiles(app, [targetFile]));
399
+ return generateMarkdownLinkImpl(params);
400
+ } catch (_) {
401
+ var _error = _, _hasError = true;
402
+ } finally {
403
+ __callDispose(_stack, _error, _hasError);
404
+ }
405
+ }
406
+ function generateRawMarkdownLink(params) {
407
+ const embedPrefix = params.isEmbed ? "!" : "";
408
+ if (params.isWikilink) {
409
+ const aliasPart = params.alias ? `|${params.alias}` : "";
410
+ return `${embedPrefix}[[${params.url}${aliasPart}]]`;
411
+ }
412
+ const alias = params.alias ?? "";
413
+ const shouldEscapeAlias = params.shouldEscapeAlias ?? false;
414
+ const escapedAlias = shouldEscapeAlias ? escapeAlias(alias) : alias;
415
+ const url = params.shouldUseAngleBrackets ? `<${params.url}>` : encodeUrl(params.url);
416
+ const titlePart = params.title ? ` ${JSON.stringify(params.title)}` : "";
417
+ return `${embedPrefix}[${escapedAlias}](${url}${titlePart})`;
418
+ }
419
+ function getGenerateMarkdownLinkDefaultParamsFns() {
420
+ return getObsidianDevUtilsState("generateMarkdownLinkDefaultParamsFns", []).value;
421
+ }
422
+ function hasAngleBrackets(link) {
423
+ const parseLinkResult = parseLink(link);
424
+ return parseLinkResult?.hasAngleBrackets ?? false;
425
+ }
426
+ function hasEmbedSyntax(link) {
427
+ const parseLinkResult = parseLink(link);
428
+ return parseLinkResult?.isEmbed ?? false;
429
+ }
430
+ function hasLeadingDot(link) {
431
+ const parseLinkResult = parseLink(link);
432
+ return parseLinkResult?.url.startsWith("./") ?? false;
433
+ }
434
+ function hasLeadingSlash(link) {
435
+ const parseLinkResult = parseLink(link);
436
+ return parseLinkResult?.url.startsWith("/") ?? false;
437
+ }
438
+ function hasWikilinkSyntax(link) {
439
+ const parseLinkResult = parseLink(link);
440
+ return parseLinkResult?.isWikilink ?? false;
441
+ }
442
+ function shouldResetAlias(params) {
443
+ const {
444
+ app,
445
+ displayText,
446
+ isWikilink,
447
+ newSourcePathOrFile,
448
+ oldSourcePathOrFile,
449
+ oldTargetPath,
450
+ targetPathOrFile
451
+ } = params;
452
+ if (isWikilink === false) {
453
+ return false;
454
+ }
455
+ if (!displayText) {
456
+ return true;
457
+ }
458
+ const targetFile = getFile({ app, pathOrFile: targetPathOrFile, shouldIncludeNonExisting: true });
459
+ const newSourcePath = getPath(app, newSourcePathOrFile);
460
+ const oldSourcePath = getPath(app, oldSourcePathOrFile ?? newSourcePathOrFile);
461
+ const newSourceFolder = dirname(newSourcePath);
462
+ const oldSourceFolder = dirname(oldSourcePath);
463
+ const aliasesToReset = /* @__PURE__ */ new Set();
464
+ for (const pathOrFile of [targetFile.path, oldTargetPath]) {
465
+ if (!pathOrFile) {
466
+ continue;
467
+ }
468
+ const path = getPath(app, pathOrFile);
469
+ aliasesToReset.add(path);
470
+ aliasesToReset.add(basename(path));
471
+ aliasesToReset.add(relative(newSourceFolder, path));
472
+ aliasesToReset.add(relative(oldSourceFolder, path));
473
+ }
474
+ for (const sourcePath of [oldSourcePath, newSourcePath]) {
475
+ aliasesToReset.add(app.metadataCache.fileToLinktext(targetFile, sourcePath, false));
476
+ }
477
+ const cleanDisplayText = replaceAll({
478
+ $string: normalizePath(ensureNonNullable(displayText.split(" > ", 1)[0])),
479
+ replacer: "",
480
+ searchValue: /^\.\//g
481
+ }).toLowerCase();
482
+ for (const alias of aliasesToReset) {
483
+ if (alias.toLowerCase() === cleanDisplayText) {
484
+ return true;
485
+ }
486
+ const folder = dirname(alias);
487
+ const base = basename(alias, extname(alias));
488
+ if (join(folder, base).toLowerCase() === cleanDisplayText) {
489
+ return true;
490
+ }
491
+ }
492
+ return false;
493
+ }
494
+ function splitSubpath(link) {
495
+ const parsed = parseLinktext(normalizeString(link));
496
+ return {
497
+ linkPath: parsed.path,
498
+ subpath: parsed.subpath
499
+ };
500
+ }
501
+ async function updateFileUrlLinksInContent(params) {
502
+ const { app, content, offsetRange, shouldUseAngleBrackets = false } = params;
503
+ return await editLinksInContent(normalizeOptionalProperties({
504
+ abortSignal: params.abortSignal,
505
+ app,
506
+ content,
507
+ linkConverter: (link) => normalizeFileUrlLink(link, shouldUseAngleBrackets),
508
+ offsetRange,
509
+ shouldEditExternalLinks: true,
510
+ shouldEditFrontmatterExternalLinks: true,
511
+ shouldEditMultiValueFrontmatterExternalLinks: true
512
+ }));
513
+ }
514
+ async function updateFileUrlLinksInFile(params) {
515
+ const {
516
+ app,
517
+ offsetRange,
518
+ pathOrFile,
519
+ shouldUseAngleBrackets = false,
520
+ ...options
521
+ } = params;
522
+ await editLinks(normalizeOptionalProperties({
523
+ app,
524
+ linkConverter: (link) => normalizeFileUrlLink(link, shouldUseAngleBrackets),
525
+ // Forwarded by name rather than through `options`, so a later refactor cannot drop it silently.
526
+ offsetRange,
527
+ pathOrFile,
528
+ shouldEditExternalLinks: true,
529
+ shouldEditFrontmatterExternalLinks: true,
530
+ shouldEditMultiValueFrontmatterExternalLinks: true,
531
+ ...options
532
+ }));
533
+ }
534
+ function updateLink(params) {
535
+ const {
536
+ app,
537
+ isEmptyEmbedAliasAllowed,
538
+ link,
539
+ linkPathStyle,
540
+ linkStyle,
541
+ newSourcePathOrFile,
542
+ newTargetPathOrFile,
543
+ oldSourcePathOrFile,
544
+ oldTargetPathOrFile,
545
+ shouldEscapeAlias,
546
+ shouldIncludeAttachmentExtensionToEmbedAlias,
547
+ shouldUpdateFileNameAlias = true,
548
+ shouldUseAngleBrackets,
549
+ shouldUseLeadingDotForRelativePaths,
550
+ shouldUseLeadingSlashForAbsolutePaths
551
+ } = params;
552
+ if (!newTargetPathOrFile) {
553
+ return link.original;
554
+ }
555
+ const newTargetFile = getFile({ app, pathOrFile: newTargetPathOrFile, shouldIncludeNonExisting: true });
556
+ const oldSourcePath = getPath(app, oldSourcePathOrFile ?? newSourcePathOrFile);
557
+ const oldTargetPath = getPath(app, oldTargetPathOrFile ?? newTargetPathOrFile);
558
+ const isWikilink = shouldUseWikilinkStyle(normalizeOptionalProperties({
559
+ app,
560
+ linkStyle,
561
+ originalLink: link.original
562
+ }));
563
+ const { subpath } = splitSubpath(link.link);
564
+ if (isCanvasFile(newSourcePathOrFile) && isCanvasFileNodeReference(link)) {
565
+ return newTargetFile.path + subpath;
566
+ }
567
+ const parseLinkResult = parseLink(link.original);
568
+ let alias;
569
+ if (isWikilink && parseLinkResult?.alias) {
570
+ alias = parseLinkResult.alias;
571
+ }
572
+ alias ??= shouldResetAlias(normalizeOptionalProperties({
573
+ app,
574
+ displayText: link.displayText,
575
+ isWikilink,
576
+ newSourcePathOrFile,
577
+ oldSourcePathOrFile,
578
+ oldTargetPath,
579
+ targetPathOrFile: newTargetFile
580
+ })) ? void 0 : parseLinkResult?.alias;
581
+ if (shouldUpdateFileNameAlias) {
582
+ if (alias === basename(oldTargetPath, extname(oldTargetPath))) {
583
+ alias = newTargetFile.basename;
584
+ } else if (alias === basename(oldTargetPath)) {
585
+ alias = newTargetFile.name;
586
+ }
587
+ }
588
+ const newLink = generateMarkdownLink(normalizeOptionalProperties({
589
+ alias,
590
+ app,
591
+ isEmptyEmbedAliasAllowed,
592
+ isSingleSubpathAllowed: oldSourcePath === oldTargetPath && !!parseLinkResult?.alias,
593
+ linkPathStyle,
594
+ linkStyle,
595
+ originalLink: link.original,
596
+ shouldEscapeAlias,
597
+ shouldIncludeAttachmentExtensionToEmbedAlias,
598
+ shouldUseAngleBrackets,
599
+ shouldUseLeadingDotForRelativePaths,
600
+ shouldUseLeadingSlashForAbsolutePaths,
601
+ sourcePathOrFile: newSourcePathOrFile,
602
+ subpath,
603
+ targetPathOrFile: newTargetFile
604
+ }));
605
+ return newLink;
606
+ }
607
+ async function updateLinksInContent(params) {
608
+ const {
609
+ app,
610
+ content,
611
+ isEmptyEmbedAliasAllowed,
612
+ linkPathStyle,
613
+ linkStyle,
614
+ newSourcePathOrFile,
615
+ offsetRange,
616
+ oldSourcePathOrFile,
617
+ shouldEscapeAlias,
618
+ shouldIncludeAttachmentExtensionToEmbedAlias,
619
+ shouldUpdateEmbedOnlyLinks,
620
+ shouldUpdateFileNameAlias,
621
+ shouldUseAngleBrackets,
622
+ shouldUseLeadingDotForRelativePaths,
623
+ shouldUseLeadingSlashForAbsolutePaths
624
+ } = params;
625
+ return await editLinksInContent(normalizeOptionalProperties({
626
+ app,
627
+ content,
628
+ linkConverter: (link) => {
629
+ const isEmbedLink = hasEmbedSyntax(link.original);
630
+ return shouldUpdateEmbedOnlyLinks !== void 0 && shouldUpdateEmbedOnlyLinks !== isEmbedLink ? void 0 : convertLink(normalizeOptionalProperties({
631
+ app,
632
+ isEmptyEmbedAliasAllowed,
633
+ link,
634
+ linkPathStyle,
635
+ linkStyle,
636
+ newSourcePathOrFile,
637
+ oldSourcePathOrFile,
638
+ shouldEscapeAlias,
639
+ shouldIncludeAttachmentExtensionToEmbedAlias,
640
+ shouldUpdateFileNameAlias,
641
+ shouldUseAngleBrackets,
642
+ shouldUseLeadingDotForRelativePaths,
643
+ shouldUseLeadingSlashForAbsolutePaths
644
+ }));
645
+ },
646
+ offsetRange
647
+ }));
648
+ }
649
+ async function updateLinksInFile(params) {
650
+ const {
651
+ app,
652
+ isEmptyEmbedAliasAllowed,
653
+ linkPathStyle,
654
+ linkStyle,
655
+ newSourcePathOrFile,
656
+ offsetRange,
657
+ oldSourcePathOrFile,
658
+ shouldEscapeAlias,
659
+ shouldIncludeAttachmentExtensionToEmbedAlias,
660
+ shouldUpdateEmbedOnlyLinks,
661
+ shouldUpdateFileNameAlias,
662
+ shouldUseAngleBrackets,
663
+ shouldUseLeadingDotForRelativePaths,
664
+ shouldUseLeadingSlashForAbsolutePaths
665
+ } = params;
666
+ if (isCanvasFile(newSourcePathOrFile) && !app.internalPlugins.getEnabledPluginById(InternalPluginName.Canvas)) {
667
+ return;
668
+ }
669
+ await editLinks(normalizeOptionalProperties({
670
+ ...params,
671
+ linkConverter: (link) => {
672
+ const isEmbedLink = hasEmbedSyntax(link.original);
673
+ return shouldUpdateEmbedOnlyLinks !== void 0 && shouldUpdateEmbedOnlyLinks !== isEmbedLink ? void 0 : convertLink(normalizeOptionalProperties({
674
+ app,
675
+ isEmptyEmbedAliasAllowed,
676
+ link,
677
+ linkPathStyle,
678
+ linkStyle,
679
+ newSourcePathOrFile,
680
+ oldSourcePathOrFile,
681
+ shouldEscapeAlias,
682
+ shouldIncludeAttachmentExtensionToEmbedAlias,
683
+ shouldUpdateFileNameAlias,
684
+ shouldUseAngleBrackets,
685
+ shouldUseLeadingDotForRelativePaths,
686
+ shouldUseLeadingSlashForAbsolutePaths
687
+ }));
688
+ },
689
+ // Named beside the `...params` spread, so a later refactor to explicit forwarding cannot drop it silently.
690
+ offsetRange,
691
+ pathOrFile: newSourcePathOrFile
692
+ }));
693
+ }
694
+ function defaultLinkIdentityKeyProvider(link) {
695
+ return JSON.stringify(link);
696
+ }
697
+ function generateLinkText(params) {
698
+ const { app, config, subpath, targetFile } = params;
699
+ let { sourcePath } = params;
700
+ if (sourcePath === "/") {
701
+ sourcePath = "";
702
+ }
703
+ let linkText;
704
+ if (targetFile.path === sourcePath && subpath && config.isSingleSubpathAllowed) {
705
+ linkText = "";
706
+ } else {
707
+ switch (config.linkPathStyle) {
708
+ /* v8 ignore stop */
709
+ case "AbsolutePathInVault" /* AbsolutePathInVault */: {
710
+ linkText = targetFile.path;
711
+ if (config.shouldUseLeadingSlashForAbsolutePaths && !linkText.startsWith("/")) {
712
+ linkText = `/${linkText}`;
713
+ }
714
+ break;
715
+ }
716
+ case "RelativePathToTheNote" /* RelativePathToTheSource */: {
717
+ linkText = relative(dirname(sourcePath), targetFile.path);
718
+ if (config.shouldUseLeadingDotForRelativePaths && !linkText.startsWith(".")) {
719
+ linkText = `./${linkText}`;
720
+ }
721
+ break;
722
+ }
723
+ case "ShortestPathWhenPossible" /* ShortestPathWhenPossible */: {
724
+ const shortestName = isMarkdownFile(targetFile) ? targetFile.basename : targetFile.name;
725
+ const matchedFiles = app.metadataCache.getLinkpathDest(shortestName, sourcePath);
726
+ linkText = matchedFiles.length === 1 && matchedFiles[0] === targetFile ? targetFile.name : targetFile.path;
727
+ break;
728
+ }
729
+ /* v8 ignore start -- All valid FinalLinkPathStyle values are handled above. */
730
+ default: {
731
+ assertNever(config.linkPathStyle);
732
+ }
733
+ }
734
+ }
735
+ linkText = config.isWikilink ? trimEnd({
736
+ $string: linkText,
737
+ suffix: `.${MARKDOWN_FILE_EXTENSION}`
738
+ }) : linkText;
739
+ linkText += subpath;
740
+ return linkText;
741
+ }
742
+ function generateMarkdownLinkImpl(params) {
743
+ const { app } = params;
744
+ const targetFile = getFile(normalizeOptionalProperties({ app, pathOrFile: params.targetPathOrFile, shouldIncludeNonExisting: params.isNonExistingFileAllowed }));
745
+ const sourcePath = getPath(app, params.sourcePathOrFile);
746
+ const subpath = params.subpath ?? "";
747
+ const linkConfig = getLinkConfig(params);
748
+ const linkText = generateLinkText({
749
+ app,
750
+ config: linkConfig,
751
+ sourcePath,
752
+ subpath,
753
+ targetFile
754
+ });
755
+ return linkConfig.isWikilink ? generateWikiLink({
756
+ alias: params.alias,
757
+ isEmbed: linkConfig.isEmbed,
758
+ linkText
759
+ }) : generateMarkdownStyleLink({
760
+ config: linkConfig,
761
+ linkText,
762
+ markdownLinkParams: params,
763
+ targetFile
764
+ });
765
+ }
766
+ function generateMarkdownStyleLink(params) {
767
+ const { config, linkText, markdownLinkParams, targetFile } = params;
768
+ let alias = markdownLinkParams.alias ?? "";
769
+ let shouldEscapeAlias = markdownLinkParams.shouldEscapeAlias ?? false;
770
+ if (!alias && (isMarkdownFile(targetFile) || !markdownLinkParams.isEmptyEmbedAliasAllowed)) {
771
+ alias = !markdownLinkParams.shouldIncludeAttachmentExtensionToEmbedAlias || isMarkdownFile(targetFile) ? targetFile.basename : targetFile.name;
772
+ shouldEscapeAlias = true;
773
+ }
774
+ return generateRawMarkdownLink({
775
+ alias,
776
+ isEmbed: config.isEmbed,
777
+ isWikilink: false,
778
+ shouldEscapeAlias,
779
+ shouldUseAngleBrackets: config.shouldUseAngleBrackets,
780
+ url: linkText
781
+ });
782
+ }
783
+ function generateWikiLink(params) {
784
+ const { alias, isEmbed, linkText } = params;
785
+ return generateRawMarkdownLink({
786
+ isEmbed,
787
+ isWikilink: true,
788
+ ...alias?.toLowerCase() === linkText.toLowerCase() ? { url: alias } : {
789
+ alias,
790
+ url: linkText
791
+ }
792
+ });
793
+ }
794
+ async function getFileChanges(params) {
795
+ const {
796
+ cache,
797
+ isCanvasFileCache,
798
+ linkConverter,
799
+ offsetRange,
800
+ shouldIncludeExternalLinks = false,
801
+ shouldIncludeFrontmatterExternalLinks = false,
802
+ shouldIncludeMultiValueFrontmatterExternalLinks = false
803
+ } = params;
804
+ let { abortSignal } = params;
805
+ abortSignal ??= abortSignalNever();
806
+ abortSignal.throwIfAborted();
807
+ if (!cache) {
808
+ return [];
809
+ }
810
+ const changes = [];
811
+ const tablePositions = (cache.sections ?? []).filter((section) => section.type === "table").map((section) => ({
812
+ end: section.position.end.offset,
813
+ start: section.position.start.offset
814
+ }));
815
+ const getFileChangesDebugger = getObsidianLibDebugger("Link:getFileChanges");
816
+ for (const link of getLinks({ cache, shouldIncludeExternalLinks, shouldIncludeFrontmatterExternalLinks, shouldIncludeMultiValueFrontmatterExternalLinks })) {
817
+ abortSignal.throwIfAborted();
818
+ if (offsetRange !== void 0 && !isReferenceInOffsetRange(link, offsetRange)) {
819
+ getFileChangesDebugger(
820
+ isReferenceCache(link) ? "Skipping a link that is not fully contained in the offset range" : "Skipping a link that carries no position within the content, so it can never be in the offset range",
821
+ { link: link.original, offsetRange }
822
+ );
823
+ continue;
824
+ }
825
+ const newContent = await linkConverter(link, abortSignal);
826
+ abortSignal.throwIfAborted();
827
+ if (newContent === void 0) {
828
+ continue;
829
+ }
830
+ const fileChange = referenceToFileChange(link, newContent);
831
+ if (isCanvasFileCache) {
832
+ if (isCanvasChange(fileChange)) {
833
+ changes.push(fileChange);
834
+ } else {
835
+ console.error("Unsupported file change", fileChange);
836
+ }
837
+ } else {
838
+ if (shouldEscapeWikilinkDivider(fileChange, tablePositions)) {
839
+ fileChange.newContent = fileChange.newContent.replaceAll(OPTIONALLY_ESCAPED_WIKILINK_DIVIDER_REGEXP, () => ESCAPED_WIKILINK_DIVIDER);
840
+ }
841
+ changes.push(fileChange);
842
+ }
843
+ }
844
+ return changes;
845
+ }
846
+ function getFinalLinkPathStyle(app, linkPathStyle) {
847
+ const resolvedStyle = linkPathStyle ?? "ObsidianSettingsDefault" /* ObsidianSettingsDefault */;
848
+ switch (resolvedStyle) {
849
+ case "AbsolutePathInVault" /* AbsolutePathInVault */: {
850
+ return "AbsolutePathInVault" /* AbsolutePathInVault */;
851
+ }
852
+ case "ObsidianSettingsDefault" /* ObsidianSettingsDefault */: {
853
+ return resolveFinalLinkPathStyleFromObsidianSettings(app);
854
+ }
855
+ case "RelativePathToTheSource" /* RelativePathToTheSource */: {
856
+ return "RelativePathToTheNote" /* RelativePathToTheSource */;
857
+ }
858
+ case "ShortestPathWhenPossible" /* ShortestPathWhenPossible */: {
859
+ return "ShortestPathWhenPossible" /* ShortestPathWhenPossible */;
860
+ }
861
+ default: {
862
+ assertNever(resolvedStyle);
863
+ }
864
+ }
865
+ }
866
+ function getLinkConfig(params) {
867
+ const { app } = params;
868
+ return {
869
+ isEmbed: params.isEmbed ?? (params.originalLink ? hasEmbedSyntax(params.originalLink) : false),
870
+ isSingleSubpathAllowed: params.isSingleSubpathAllowed ?? true,
871
+ isWikilink: shouldUseWikilinkStyle(normalizeOptionalProperties({
872
+ app,
873
+ linkStyle: params.linkStyle,
874
+ originalLink: params.originalLink
875
+ })),
876
+ linkPathStyle: getFinalLinkPathStyle(app, params.linkPathStyle),
877
+ shouldUseAngleBrackets: params.shouldUseAngleBrackets ?? (params.originalLink ? hasAngleBrackets(params.originalLink) : void 0) ?? false,
878
+ shouldUseLeadingDotForRelativePaths: params.shouldUseLeadingDotForRelativePaths ?? (params.originalLink ? hasLeadingDot(params.originalLink) : void 0) ?? false,
879
+ shouldUseLeadingSlashForAbsolutePaths: params.shouldUseLeadingSlashForAbsolutePaths ?? (params.originalLink ? hasLeadingSlash(params.originalLink) : void 0) ?? false
880
+ };
881
+ }
882
+ function getUndefinedPayload() {
883
+ }
884
+ function normalizeFileUrlLink(link, shouldUseAngleBrackets) {
885
+ if (isParseLinkFrontmatterReference(link)) {
886
+ return link.parseLinkResult.isFileUrl ? normalizeFileUrl(link.parseLinkResult.url) : void 0;
887
+ }
888
+ if (!isParseLinkReference(link)) {
889
+ return;
890
+ }
891
+ const { parseLinkResult } = link;
892
+ return parseLinkResult.isFileUrl ? generateRawMarkdownLink(normalizeOptionalProperties({
893
+ alias: parseLinkResult.alias,
894
+ isEmbed: parseLinkResult.isEmbed,
895
+ isWikilink: false,
896
+ shouldUseAngleBrackets,
897
+ url: normalizeFileUrl(parseLinkResult.url)
898
+ })) : void 0;
899
+ }
900
+ function resolveFinalLinkPathStyleFromObsidianSettings(app) {
901
+ const newLinkFormat = getNewLinkFormat(app);
902
+ switch (newLinkFormat) {
903
+ case "absolute": {
904
+ return "AbsolutePathInVault" /* AbsolutePathInVault */;
905
+ }
906
+ case "relative": {
907
+ return "RelativePathToTheNote" /* RelativePathToTheSource */;
908
+ }
909
+ case "shortest": {
910
+ return "ShortestPathWhenPossible" /* ShortestPathWhenPossible */;
911
+ }
912
+ default: {
913
+ assertNever(newLinkFormat);
914
+ }
915
+ }
916
+ }
917
+ function resolveSnapshotLinkIdentityKeyProvider(params) {
918
+ const { callerName, explicitLinkIdentityKeyProvider, snapshot } = params;
919
+ const recordedLinkIdentityKeyProvider = snapshotLinkIdentityKeyProviders.get(snapshot);
920
+ if (explicitLinkIdentityKeyProvider && recordedLinkIdentityKeyProvider && explicitLinkIdentityKeyProvider !== recordedLinkIdentityKeyProvider) {
921
+ throw new Error(
922
+ `${callerName} was passed a linkIdentityKeyProvider that differs from the one the snapshot was built with. The snapshot is keyed by the other, so no link would match. Omit the parameter to use the snapshot's own.`
923
+ );
924
+ }
925
+ return explicitLinkIdentityKeyProvider ?? recordedLinkIdentityKeyProvider ?? defaultLinkIdentityKeyProvider;
926
+ }
927
+ function shouldEscapeWikilinkDivider(fileChange, tablePositions) {
928
+ if (!isContentChange(fileChange)) {
929
+ return false;
930
+ }
931
+ return UNESCAPED_WIKILINK_DIVIDER_REGEXP.test(fileChange.newContent) && tablePositions.some((tablePosition) => tablePosition.start <= fileChange.reference.position.start.offset && fileChange.reference.position.end.offset <= tablePosition.end);
932
+ }
933
+ function shouldUseWikilinkStyle(params) {
934
+ const { app, linkStyle, originalLink } = params;
935
+ const resolvedStyle = linkStyle ?? "PreserveExisting" /* PreserveExisting */;
936
+ switch (resolvedStyle) {
937
+ case "Markdown" /* Markdown */: {
938
+ return false;
939
+ }
940
+ case "ObsidianSettingsDefault" /* ObsidianSettingsDefault */: {
941
+ return shouldUseWikilinks(app);
942
+ }
943
+ case "PreserveExisting" /* PreserveExisting */: {
944
+ return originalLink === void 0 ? shouldUseWikilinks(app) : hasWikilinkSyntax(originalLink);
945
+ }
946
+ case "Wikilink" /* Wikilink */: {
947
+ return true;
948
+ }
949
+ default: {
950
+ assertNever(resolvedStyle);
951
+ }
952
+ }
953
+ }
954
+ function validateOffsetRange(offsetRange) {
955
+ if (offsetRange.startOffset < 0) {
956
+ throw new Error(`Invalid offset range: the start offset ${String(offsetRange.startOffset)} must not be negative.`);
957
+ }
958
+ if (offsetRange.endOffset < offsetRange.startOffset) {
959
+ throw new Error(`Invalid offset range: the end offset ${String(offsetRange.endOffset)} must not be less than the start offset ${String(offsetRange.startOffset)}.`);
960
+ }
961
+ }
962
+ export {
963
+ LinkPathStyle,
964
+ LinkStyle,
965
+ buildBacklinksSnapshot,
966
+ convertLink,
967
+ editBacklinks,
968
+ editBacklinksSnapshot,
969
+ editLinks,
970
+ editLinksInContent,
971
+ extractLinkFile,
972
+ generateMarkdownLink,
973
+ generateRawMarkdownLink,
974
+ getGenerateMarkdownLinkDefaultParamsFns,
975
+ hasAngleBrackets,
976
+ hasEmbedSyntax,
977
+ hasLeadingDot,
978
+ hasLeadingSlash,
979
+ hasWikilinkSyntax,
980
+ shouldResetAlias,
981
+ splitSubpath,
982
+ updateFileUrlLinksInContent,
983
+ updateFileUrlLinksInFile,
984
+ updateLink,
985
+ updateLinksInContent,
986
+ updateLinksInFile
987
+ };
988
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2xpbmsudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyB1dGlsaXRpZXMgZm9yIGhhbmRsaW5nIGFuZCB1cGRhdGluZyBsaW5rcyB3aXRoaW4gT2JzaWRpYW4gdmF1bHRzLiBJdCBpbmNsdWRlc1xuICogZnVuY3Rpb25zIHRvIHNwbGl0IHBhdGhzLCB1cGRhdGUgbGlua3MgaW4gZmlsZXMsIGFuZCBnZW5lcmF0ZSBtYXJrZG93biBsaW5rcyB3aXRoIHZhcmlvdXMgb3B0aW9ucy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IE1heWJlUmV0dXJuIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUnO1xuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIENhY2hlZE1ldGFkYXRhLFxuICBSZWZlcmVuY2UsXG4gIFRGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGFib3J0U2lnbmFsTmV2ZXIgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvYWJvcnQtY29udHJvbGxlcic7XG5pbXBvcnQge1xuICBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMsXG4gIHJlbW92ZVVuZGVmaW5lZFByb3BlcnRpZXNcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplU3RyaW5nLFxuICByZXBsYWNlQWxsLFxuICB0cmltRW5kXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9zdHJpbmcnO1xuaW1wb3J0IHtcbiAgYXNzZXJ0TmV2ZXIsXG4gIGFzc2VydE5vbk51bGxhYmxlLFxuICBlbnN1cmVOb25OdWxsYWJsZVxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuaW1wb3J0IHtcbiAgZW5jb2RlVXJsLFxuICBub3JtYWxpemVGaWxlVXJsXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi91cmwnO1xuaW1wb3J0IHtcbiAgSW50ZXJuYWxQbHVnaW5OYW1lLFxuICBpc1JlZmVyZW5jZUNhY2hlXG59IGZyb20gJ0BvYnNpZGlhbi10eXBpbmdzL29ic2lkaWFuLXB1YmxpYy1sYXRlc3QvaW1wbGVtZW50YXRpb25zJztcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZVBhdGgsXG4gIHBhcnNlTGlua3RleHRcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IEZpbGVDaGFuZ2UgfSBmcm9tICcuL2ZpbGUtY2hhbmdlLnRzJztcbmltcG9ydCB0eXBlIHtcbiAgR2V0RmlsZVBhcmFtcyxcbiAgUGF0aE9yRmlsZVxufSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB0eXBlIHsgTGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIgfSBmcm9tICcuL2xpbmstdXBkYXRlLXByb2dyZXNzLnRzJztcbmltcG9ydCB0eXBlIHsgT2Zmc2V0UmFuZ2UgfSBmcm9tICcuL3JlZmVyZW5jZS50cyc7XG5pbXBvcnQgdHlwZSB7IFByb2Nlc3NPcHRpb25zIH0gZnJvbSAnLi92YXVsdC50cyc7XG5cbmltcG9ydCB7IGdldE9ic2lkaWFuTGliRGVidWdnZXIgfSBmcm9tICcuL2RlYnVnLnRzJztcbmltcG9ydCB7XG4gIGFwcGx5Q29udGVudENoYW5nZXMsXG4gIGFwcGx5RmlsZUNoYW5nZXMsXG4gIGlzQ2FudmFzQ2hhbmdlLFxuICBpc0NvbnRlbnRDaGFuZ2Vcbn0gZnJvbSAnLi9maWxlLWNoYW5nZS50cyc7XG5pbXBvcnQge1xuICBnZXRGaWxlLFxuICBnZXRQYXRoLFxuICBpc0NhbnZhc0ZpbGUsXG4gIGlzTWFya2Rvd25GaWxlLFxuICBNQVJLRE9XTl9GSUxFX0VYVEVOU0lPTlxufSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB7XG4gIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlLFxuICBnZXRDYWNoZVNhZmUsXG4gIGdldExpbmtzLFxuICBwYXJzZU1ldGFkYXRhLFxuICByZWdpc3RlckZpbGVzXG59IGZyb20gJy4vbWV0YWRhdGEtY2FjaGUudHMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlIH0gZnJvbSAnLi9vYnNpZGlhbi1kZXYtdXRpbHMtc3RhdGUudHMnO1xuaW1wb3J0IHtcbiAgZ2V0TmV3TGlua0Zvcm1hdCxcbiAgc2hvdWxkVXNlV2lraWxpbmtzXG59IGZyb20gJy4vb2JzaWRpYW4tc2V0dGluZ3MudHMnO1xuaW1wb3J0IHtcbiAgZXNjYXBlQWxpYXMsXG4gIGlzUGFyc2VMaW5rRnJvbnRtYXR0ZXJSZWZlcmVuY2UsXG4gIGlzUGFyc2VMaW5rUmVmZXJlbmNlLFxuICBwYXJzZUxpbmtcbn0gZnJvbSAnLi9wYXJzZS1saW5rLnRzJztcbmltcG9ydCB7XG4gIGlzQ2FudmFzRmlsZU5vZGVSZWZlcmVuY2UsXG4gIGlzUmVmZXJlbmNlSW5PZmZzZXRSYW5nZSxcbiAgcmVmZXJlbmNlVG9GaWxlQ2hhbmdlXG59IGZyb20gJy4vcmVmZXJlbmNlLnRzJztcblxuY29uc3QgRVNDQVBFRF9XSUtJTElOS19ESVZJREVSID0gU3RyaW5nLnJhd2BcXHxgO1xuXG4vKipcbiAqIE1hdGNoZXMgYSB3aWtpbGluayBkaXZpZGVyIHRvZ2V0aGVyIHdpdGggdGhlIGJhY2tzbGFzaCBlc2NhcGluZyBpdCwgaWYgYW55LiBBIGxvb2tiZWhpbmQgd291bGQgc2F5IFwidW5lc2NhcGVkXCJcbiAqIGRpcmVjdGx5LCBidXQgaXQgaXMgYSBzeW50YXggZXJyb3Igb24gaU9TIGJlZm9yZSAxNi40LCBiZWxvdyB0aGUgaU9TIDE1IE9ic2lkaWFuIG1vYmlsZSBzdGlsbCBzdXBwb3J0cy5cbiAqIFJlcGxhY2luZyBldmVyeSBtYXRjaCB3aXRoIGFuIGVzY2FwZWQgZGl2aWRlciBsZWF2ZXMgYW4gZXNjYXBlZCBvbmUgYXMgaXQgd2FzIGFuZCBlc2NhcGVzIGEgYmFyZSBvbmUuXG4gKi9cbmNvbnN0IE9QVElPTkFMTFlfRVNDQVBFRF9XSUtJTElOS19ESVZJREVSX1JFR0VYUCA9IC9cXFxcP1xcfC9nO1xuXG4vKipcbiAqIFRlc3RzIGZvciBhIHdpa2lsaW5rIGRpdmlkZXIgbm8gYmFja3NsYXNoIGVzY2FwZXMuIE5vdCBnbG9iYWwsIHNvIGEgYHRlc3RgIGtlZXBzIG5vIGBsYXN0SW5kZXhgIGJldHdlZW4gY2FsbHMuXG4gKi9cbmNvbnN0IFVORVNDQVBFRF9XSUtJTElOS19ESVZJREVSX1JFR0VYUCA9IC8oPzpefFteXFxcXF0pXFx8LztcblxuLyoqXG4gKiBUaGUgbGluayBpZGVudGl0eSBrZXkgcHJvdmlkZXIgZWFjaCBzbmFwc2hvdCB3YXMgYnVpbHQgd2l0aC4gS2VwdCBiZXNpZGUgdGhlIHNuYXBzaG90IHJhdGhlciB0aGFuIGluIGl0LCBzbyBhXG4gKiBzbmFwc2hvdCBzdGF5cyBhIHBsYWluIG1hcCBhbmQgdGhlIG9uZSBmdW5jdGlvbiB0aGF0IGtleWVkIGl0IGlzIGFsc28gdGhlIG9uZSB0aGF0IGxvb2tzIGl0IHVwIFx1MjAxNCBwYXNzaW5nIGFcbiAqIHByb3ZpZGVyIHRvIG9ubHkgb25lIG9mIHtAbGluayBidWlsZEJhY2tsaW5rc1NuYXBzaG90fSBhbmQge0BsaW5rIGVkaXRCYWNrbGlua3NTbmFwc2hvdH0gdXNlZCB0byBsZWF2ZSBldmVyeVxuICogbGluayB1bm1hdGNoZWQsIGFuZCB0aGUgZWRpdCByZXdyb3RlIG5vdGhpbmcgd2l0aG91dCBhIHdvcmQuXG4gKi9cbmNvbnN0IHNuYXBzaG90TGlua0lkZW50aXR5S2V5UHJvdmlkZXJzID0gbmV3IFdlYWtNYXA8QmFja2xpbmtzU25hcHNob3Q8dW5rbm93bj4sIChsaW5rOiBSZWZlcmVuY2UpID0+IHN0cmluZz4oKTtcblxuLyoqXG4gKiBBIHN0eWxlIG9mIHRoZSBsaW5rIHBhdGguXG4gKi9cbmV4cG9ydCBlbnVtIExpbmtQYXRoU3R5bGUge1xuICAvKipcbiAgICogVXNlIHRoZSBhYnNvbHV0ZSBwYXRoIGluIHRoZSB2YXVsdC5cbiAgICpcbiAgICogQGV4YW1wbGUgYFtbcGF0aC9mcm9tL3RoZS92YXVsdC9yb290L3RhcmdldF1dYFxuICAgKi9cbiAgQWJzb2x1dGVQYXRoSW5WYXVsdCA9ICdBYnNvbHV0ZVBhdGhJblZhdWx0JyxcblxuICAvKipcbiAgICogVXNlIHRoZSBkZWZhdWx0IGxpbmsgcGF0aCBzdHlsZSBkZWZpbmVkIGluIE9ic2lkaWFuIHNldHRpbmdzLlxuICAgKi9cbiAgT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQgPSAnT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQnLFxuXG4gIC8qKlxuICAgKiBVc2UgdGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIHNvdXJjZS5cbiAgICpcbiAgICogQGV4YW1wbGUgYFtbLi4vLi4vcmVsYXRpdmUvcGF0aC90by90YXJnZXRdXWBcbiAgICovXG4gIFJlbGF0aXZlUGF0aFRvVGhlU291cmNlID0gJ1JlbGF0aXZlUGF0aFRvVGhlU291cmNlJyxcblxuICAvKipcbiAgICogVXNlIHRoZSBzaG9ydGVzdCBwYXRoIHdoZW4gcG9zc2libGUuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbW3Nob3J0ZXN0LXBhdGgtdG8tdGFyZ2V0XV1gXG4gICAqL1xuICBTaG9ydGVzdFBhdGhXaGVuUG9zc2libGUgPSAnU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlJ1xufVxuXG4vKipcbiAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gKi9cbmV4cG9ydCBlbnVtIExpbmtTdHlsZSB7XG4gIC8qKlxuICAgKiBGb3JjZSB0aGUgbGluayB0byBiZSBpbiBtYXJrZG93biBmb3JtYXQuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbYWxpYXNdKHBhdGgvdG8vdGFyZ2V0Lm1kKWBcbiAgICovXG4gIE1hcmtkb3duID0gJ01hcmtkb3duJyxcblxuICAvKipcbiAgICogVXNlIHRoZSBkZWZhdWx0IGxpbmsgc3R5bGUgZGVmaW5lZCBpbiBPYnNpZGlhbiBzZXR0aW5ncy5cbiAgICovXG4gIE9ic2lkaWFuU2V0dGluZ3NEZWZhdWx0ID0gJ09ic2lkaWFuU2V0dGluZ3NEZWZhdWx0JyxcblxuICAvKipcbiAgICogUHJlc2VydmUgdGhlIGV4aXN0aW5nIGxpbmsgc3R5bGUuXG4gICAqL1xuICBQcmVzZXJ2ZUV4aXN0aW5nID0gJ1ByZXNlcnZlRXhpc3RpbmcnLFxuXG4gIC8qKlxuICAgKiBGb3JjZSB0aGUgbGluayB0byBiZSBpbiB3aWtpbGluayBmb3JtYXQuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbW3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqIEBleGFtcGxlIGBbW3BhdGgvdG8vdGFyZ2V0fGFsaWFzXV1gXG4gICAqL1xuICBXaWtpbGluayA9ICdXaWtpbGluaydcbn1cblxuZW51bSBGaW5hbExpbmtQYXRoU3R5bGUge1xuICBBYnNvbHV0ZVBhdGhJblZhdWx0ID0gJ0Fic29sdXRlUGF0aEluVmF1bHQnLFxuICBSZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZSA9ICdSZWxhdGl2ZVBhdGhUb1RoZU5vdGUnLFxuICBTaG9ydGVzdFBhdGhXaGVuUG9zc2libGUgPSAnU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlJ1xufVxuXG4vKipcbiAqIFBhcmFtcyBwYXNzZWQgdG8gdGhlIGxpbmsgY29udmVydGVyIG9mIHtAbGluayBlZGl0QmFja2xpbmtzU25hcHNob3R9LlxuICpcbiAqIEB0eXBlUGFyYW0gVFBheWxvYWQgLSBUaGUgcGF5bG9hZCByZWNvcmRlZCBmb3IgZWFjaCBsaW5rIHdoZW4gdGhlIHNuYXBzaG90IHdhcyBidWlsdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYWNrbGlua0NvbnZlcnNpb25QYXJhbXM8VFBheWxvYWQ+IHtcbiAgLyoqXG4gICAqIFRoZSBsaW5rIGJlaW5nIGNvbnZlcnRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGxpbms6IFJlZmVyZW5jZTtcblxuICAvKipcbiAgICogVGhlIHBheWxvYWQgY2FwdHVyZWQgZm9yIHRoZSBsaW5rIHdoZW4gdGhlIHNuYXBzaG90IHdhcyBidWlsdC5cbiAgICpcbiAgICogYHVuZGVmaW5lZGAgd2hlbiB0aGUgbGluayBpcyBub3QgaW4gdGhlIHNuYXBzaG90LCB3aGljaCBjYW4gb25seSBoYXBwZW4gaWZcbiAgICoge0BsaW5rIEVkaXRCYWNrbGlua3NTbmFwc2hvdFBhcmFtcy5zaG91bGRWaXNpdFVubWF0Y2hlZExpbmtzfSBpcyBgdHJ1ZWAuXG4gICAqL1xuICByZWFkb25seSBwYXlsb2FkOiBUUGF5bG9hZCB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIHBhdGggb2YgdGhlIG5vdGUgaG9sZGluZyB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgbWluaW1hbCBzaGFwZSB7QGxpbmsgYnVpbGRCYWNrbGlua3NTbmFwc2hvdH0gcmVhZHMgYSBzZXQgb2YgYmFja2xpbmtzIGZyb20uXG4gKlxuICogQm90aCBhIGBDdXN0b21BcnJheURpY3Q8UmVmZXJlbmNlPmAgXHUyMDE0IHdoYXRcbiAqIHtAbGluayAuLi9vYnNpZGlhbi9tZXRhZGF0YS1jYWNoZSFnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSB8IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlfSByZXR1cm5zIFx1MjAxNCBhbmQgYSBwbGFpblxuICogYE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPmAgc2F0aXNmeSBpdCwgc28gYSBjYWxsZXIgY2FuIHBhc3MgZWl0aGVyIHdpdGhvdXQgY29udmVydGluZyBmaXJzdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYWNrbGlua3NMaWtlIHtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxpbmtzIHRoZSBub3RlIGF0IGBrZXlgIGhvbGRzLCBvciBhIG51bGxpc2ggdmFsdWUgd2hlbiBpdCBob2xkcyBub25lLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gVGhlIHBhdGggb2YgdGhlIGJhY2tsaW5rLWhvbGRpbmcgbm90ZS5cbiAgICogQHJldHVybnMgVGhlIGxpbmtzLCBvciBhIG51bGxpc2ggdmFsdWUuXG4gICAqL1xuICBnZXQ6IChrZXk6IHN0cmluZykgPT4gbnVsbCB8IHJlYWRvbmx5IFJlZmVyZW5jZVtdIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBwYXRocyBvZiB0aGUgYmFja2xpbmstaG9sZGluZyBub3Rlcy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHBhdGhzLlxuICAgKi9cbiAga2V5czogKCkgPT4gSXRlcmFibGU8c3RyaW5nPjtcbn1cblxuLyoqXG4gKiBBIGNhcHR1cmVkIHNuYXBzaG90IG9mIGEgc2V0IG9mIGJhY2tsaW5rczogdGhlIHBhdGggb2YgZWFjaCBiYWNrbGluay1ob2xkaW5nIG5vdGUsIG1hcHBlZCB0byB0aGUgaWRlbnRpdHlcbiAqIGtleXMgb2YgdGhhdCBub3RlJ3Mgb3duIGxpbmtzIHRvIHRoZSB0YXJnZXQocyksIGVhY2ggbWFwcGVkIHRvIHRoZSBwYXlsb2FkIHJlY29yZGVkIGZvciBpdC5cbiAqXG4gKiBUaGUgc25hcHNob3QgZXhpc3RzIHNvIHRoYXQgdGhlIGZldGNoIGFuZCB0aGUgcmV3cml0ZSBjYW4gaGFwcGVuIGF0IGRpZmZlcmVudCBtb21lbnRzLiBBIHJlbmFtZSBpbnZhbGlkYXRlc1xuICogdGhlIG1ldGFkYXRhIGNhY2hlIGZvciB0aGUgb2xkIHBhdGgsIHNvIGEgY2FsbGVyIHRoYXQgcmV3cml0ZXMgbGlua3MgKiphZnRlcioqIHJlbmFtaW5nIGhhcyB0byBjYXB0dXJlIHRoZVxuICogYmFja2xpbmtzICoqYmVmb3JlKiogXHUyMDE0IHdoaWNoIGlzIHdoeSB7QGxpbmsgZWRpdEJhY2tsaW5rc1NuYXBzaG90fSB0YWtlcyBhIHNuYXBzaG90IHJhdGhlciB0aGFuIGEgcGF0aC5cbiAqXG4gKiBUaGUgcGF5bG9hZCBpcyB3aGF0ZXZlciB0aGUgY2FsbGVyIG5lZWRzIHRvIHJlbWVtYmVyIHBlciBsaW5rLiBJdCBpcyBgdW5kZWZpbmVkYCBmb3IgYSBzaW5nbGUtdGFyZ2V0XG4gKiByZXdyaXRlICh0aGUgdGFyZ2V0IGlzIGltcGxpZWQpLCBhbmQgdGhlIG9sZCB0YXJnZXQncyBwYXRoIGZvciBhIG11bHRpLXRhcmdldCBvbmUsIHdoZXJlIG9uZSBub3RlJ3MgbGlua3NcbiAqIG1heSBwb2ludCBhdCBzZXZlcmFsIGZpbGVzIHRoYXQgYWxsIG1vdmVkIGFuZCBlYWNoIGxpbmsgaGFzIHRvIGJlIHJlc29sdmVkIHRvIGl0cyBvd24gbmV3IHBhdGguXG4gKlxuICogQHR5cGVQYXJhbSBUUGF5bG9hZCAtIFRoZSBwYXlsb2FkIHJlY29yZGVkIGZvciBlYWNoIGxpbmsuXG4gKi9cbmV4cG9ydCB0eXBlIEJhY2tsaW5rc1NuYXBzaG90PFRQYXlsb2FkPiA9IFJlYWRvbmx5TWFwPHN0cmluZywgUmVhZG9ubHlNYXA8c3RyaW5nLCBUUGF5bG9hZD4+O1xuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGJ1aWxkQmFja2xpbmtzU25hcHNob3R9LlxuICpcbiAqIEB0eXBlUGFyYW0gVFBheWxvYWQgLSBUaGUgcGF5bG9hZCByZWNvcmRlZCBmb3IgZWFjaCBsaW5rLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkQmFja2xpbmtzU25hcHNob3RQYXJhbXM8VFBheWxvYWQ+IHtcbiAgLyoqXG4gICAqIFRoZSBiYWNrbGlua3MgdG8gcmVjb3JkLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFja2xpbmtzOiBCYWNrbGlua3NMaWtlO1xuXG4gIC8qKlxuICAgKiBDb21wdXRlcyB0aGUgaWRlbnRpdHkga2V5IG9mIGEgbGluay5cbiAgICpcbiAgICogVGhlIHNuYXBzaG90IHJlbWVtYmVycyBpdCwgc28ge0BsaW5rIGVkaXRCYWNrbGlua3NTbmFwc2hvdH0gbG9va3MgdGhlIGxpbmtzIHVwIHdpdGggdGhlIHNhbWUgZnVuY3Rpb25cbiAgICogd2l0aG91dCBiZWluZyB0b2xkLiBXaGVuIHtAbGluayBCdWlsZEJhY2tsaW5rc1NuYXBzaG90UGFyYW1zLnRhcmdldH0gd2FzIGJ1aWx0IHdpdGggYSBwcm92aWRlciwgb21pdHRpbmdcbiAgICogdGhpcyByZXVzZXMgdGhhdCBvbmUsIGFuZCBwYXNzaW5nIGEgZGlmZmVyZW50IG9uZSB0aHJvd3M6IGEgc25hcHNob3Qga2V5ZWQgYnkgdHdvIGZ1bmN0aW9ucyBtYXRjaGVzXG4gICAqIG5vdGhpbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRoZSBwcm92aWRlciBgdGFyZ2V0YCB3YXMgYnVpbHQgd2l0aCwgZWxzZSBgSlNPTi5zdHJpbmdpZnlgXG4gICAqL1xuICByZWFkb25seSBsaW5rSWRlbnRpdHlLZXlQcm92aWRlcj86IChsaW5rOiBSZWZlcmVuY2UpID0+IHN0cmluZztcblxuICAvKipcbiAgICogUmV3cml0ZXMgdGhlIHBhdGggb2YgYSBiYWNrbGluay1ob2xkaW5nIG5vdGUgYXMgaXQgd2lsbCBiZSAqKmFmdGVyKiogdGhlIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQSBub3RlIHRoYXQgaG9sZHMgYSBiYWNrbGluayBjYW4gaXRzZWxmIGJlIHJlbmFtZWQgb3IgbW92ZWQgYnkgdGhlIHNhbWUgb3BlcmF0aW9uIFx1MjAxNCBpbmNsdWRpbmcgdGhlXG4gICAqIHJlbmFtZWQgbm90ZSdzIG93biBzZWxmLWxpbmtzLiBSZW1hcHBpbmcgaGVyZSBrZXlzIHRoZSBzbmFwc2hvdCBieSB0aGUgcGF0aCB0aGUgcmV3cml0ZSB3aWxsIGFjdHVhbGx5XG4gICAqIG9wZW4uXG4gICAqXG4gICAqIEBkZWZhdWx0IHRoZSBpZGVudGl0eSBmdW5jdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aFJlbWFwcGVyPzogKGJhY2tsaW5rUGF0aDogc3RyaW5nKSA9PiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFByb2R1Y2VzIHRoZSBwYXlsb2FkIHRvIHJlY29yZCBmb3IgYSBsaW5rLiBTZWUge0BsaW5rIEJhY2tsaW5rc1NuYXBzaG90fSBmb3Igd2hhdCBhIHBheWxvYWQgaXMgZm9yLlxuICAgKlxuICAgKiBAcGFyYW0gbGluayAtIFRoZSBsaW5rIGJlaW5nIHJlY29yZGVkLlxuICAgKiBAcmV0dXJucyBUaGUgcGF5bG9hZC5cbiAgICovXG4gIHJlYWRvbmx5IHBheWxvYWRQcm92aWRlcjogKGxpbms6IFJlZmVyZW5jZSkgPT4gVFBheWxvYWQ7XG5cbiAgLyoqXG4gICAqIEFuIGV4aXN0aW5nIHNuYXBzaG90IHRvIG1lcmdlIGludG8sIHNvIHNldmVyYWwgc2V0cyBvZiBiYWNrbGlua3MgY2FuIGJlIGFjY3VtdWxhdGVkIGludG8gb25lLlxuICAgKlxuICAgKiBNZXJnaW5nIGlzIHdoYXQgbWFrZXMgYSBzaW5nbGUgcmV3cml0ZSBwYXNzIHBlciBub3RlIHBvc3NpYmxlIHdoZW4gYSBub3RlIGxpbmtzIHRvIHNldmVyYWwgbW92ZWRcbiAgICogdGFyZ2V0czogd2l0aG91dCBpdCwgY2FsbGluZyB0aGUgcmV3cml0ZSBvbmNlIHBlciB0YXJnZXQgd291bGQgb3BlbiBcdTIwMTQgYW5kIHdyaXRlIFx1MjAxNCB0aGUgc2FtZSBub3RlXG4gICAqIHJlcGVhdGVkbHkuXG4gICAqXG4gICAqIFdoZW4gb21pdHRlZCwgYSBuZXcgc25hcHNob3QgaXMgY3JlYXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldD86IE11dGFibGVCYWNrbGlua3NTbmFwc2hvdDxUUGF5bG9hZD47XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgY29udmVydExpbmt9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnZlcnRMaW5rUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IGFuIGVtcHR5IGFsaWFzIGZvciBlbWJlZHMuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB0aGUgcmVzdWx0IGxpbmsgc3R5bGUgaXMge0BsaW5rIExpbmtTdHlsZS5NYXJrZG93bn0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYCFbXShmb28ucG5nKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGAhW2Zvb10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgcmVmZXJlbmNlIGZvciB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbms6IFJlZmVyZW5jZTtcblxuICAvKipcbiAgICogQSBzdHlsZSBvZiB0aGUgbGluayBwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1BhdGhTdHlsZT86IExpbmtQYXRoU3R5bGU7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rU3R5bGU/OiBMaW5rU3R5bGU7XG5cbiAgLyoqXG4gICAqIEEgc291cmNlIGZpbGUgY29udGFpbmluZyB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG5ld1NvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkU291cmNlUGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZXNjYXBlIHRoZSBhbGlhcy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHRoZSByZXN1bHQgbGluayBzdHlsZSBpcyB7QGxpbmsgTGlua1N0eWxlLk1hcmtkb3dufS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1xcKlxcKmFsaWFzXFwqXFwqXShsaW5rLm1kKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbKiphbGlhcyoqXShsaW5rLm1kKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVzY2FwZUFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBhdHRhY2htZW50IGV4dGVuc2lvbiBpbiB0aGUgZW1iZWQgYWxpYXMuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkfSBpcyBgZmFsc2VgLlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbZm9vLnBuZ10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW2Zvb10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlQXR0YWNobWVudEV4dGVuc2lvblRvRW1iZWRBbGlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGUgbmFtZSBhbGlhcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYW5nbGUgYnJhY2tldHMuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgbGlua1N0eWxlfSBpcyB7QGxpbmsgTGlua1N0eWxlLk1hcmtkb3dufS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW2FsaWFzXSg8cGF0aCB3aXRoIHNwYWNlcy5tZD4pYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFthbGlhc10ocGF0aCUyMHdpdGglMjBzcGFjZXMubWQpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGEgbGVhZGluZyBkb3QuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgbGlua1BhdGhTdHlsZX0gaXMge0BsaW5rIExpbmtQYXRoU3R5bGUuUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2V9LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbWy4vcmVsYXRpdmUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbcmVsYXRpdmUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhIGxlYWRpbmcgc2xhc2guXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgbGlua1BhdGhTdHlsZX0gaXMge0BsaW5rIExpbmtQYXRoU3R5bGUuQWJzb2x1dGVQYXRoSW5WYXVsdH0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtbL2Fic29sdXRlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbW2Fic29sdXRlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBlZGl0QmFja2xpbmtzfS5cbiAqL1xuZXhwb3J0IHR5cGUgRWRpdEJhY2tsaW5rc09wdGlvbnMgPSBQcm9jZXNzT3B0aW9ucztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZWRpdEJhY2tsaW5rc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWRpdEJhY2tsaW5rc1BhcmFtcyBleHRlbmRzIEVkaXRCYWNrbGlua3NPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBlYWNoIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rQ29udmVydGVyOiAobGluazogUmVmZXJlbmNlKSA9PiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPHN0cmluZz4+O1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCByZXBvcnRlciBpbnZva2VkIG9uY2UgcGVyIGJhY2tsaW5rIGZpbGUgYWZ0ZXIgaXRzIGxpbmtzIGFyZSB1cGRhdGVkLCB3aXRoIHRoZSBydW5uaW5nXG4gICAqIGNvdW50IG9mIHByb2Nlc3NlZCBmaWxlcyBhbmQgdGhlIHRvdGFsLiBXaGVuIG9taXR0ZWQsIG5vIHByb2dyZXNzIGlzIHJlcG9ydGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI/OiBMaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjtcblxuICAvKipcbiAgICogVGhlIHBhdGggb3IgZmlsZSB0byBlZGl0IHRoZSBiYWNrbGlua3MgZm9yLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZWRpdEJhY2tsaW5rc1NuYXBzaG90fS5cbiAqL1xuZXhwb3J0IHR5cGUgRWRpdEJhY2tsaW5rc1NuYXBzaG90T3B0aW9ucyA9IFByb2Nlc3NPcHRpb25zO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBlZGl0QmFja2xpbmtzU25hcHNob3R9LlxuICpcbiAqIEB0eXBlUGFyYW0gVFBheWxvYWQgLSBUaGUgcGF5bG9hZCByZWNvcmRlZCBmb3IgZWFjaCBsaW5rIHdoZW4gdGhlIHNuYXBzaG90IHdhcyBidWlsdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFZGl0QmFja2xpbmtzU25hcHNob3RQYXJhbXM8VFBheWxvYWQ+IGV4dGVuZHMgRWRpdEJhY2tsaW5rc1NuYXBzaG90T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgZWFjaCBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua0NvbnZlcnRlcjogKHBhcmFtczogQmFja2xpbmtDb252ZXJzaW9uUGFyYW1zPFRQYXlsb2FkPikgPT4gUHJvbWlzYWJsZTxNYXliZVJldHVybjxzdHJpbmc+PjtcblxuICAvKipcbiAgICogQ29tcHV0ZXMgdGhlIGlkZW50aXR5IGtleSBvZiBhIGxpbmsuXG4gICAqXG4gICAqIExlYXZlIGl0IG91dCBmb3IgYSBzbmFwc2hvdCBtYWRlIGJ5IHtAbGluayBidWlsZEJhY2tsaW5rc1NuYXBzaG90fTogdGhlIHNuYXBzaG90IGNhcnJpZXMgdGhlIHByb3ZpZGVyIGl0IHdhc1xuICAgKiBidWlsdCB3aXRoLCBhbmQgdGhhdCBvbmUgaXMgdXNlZC4gUGFzc2luZyBhIGRpZmZlcmVudCBvbmUgdGhyb3dzLCBiZWNhdXNlIHRoZSBzbmFwc2hvdCBpcyBrZXllZCBieSB0aGVcbiAgICogb3RoZXIgYW5kIG5vdCBhIHNpbmdsZSBsaW5rIHdvdWxkIG1hdGNoIFx1MjAxNCB0aGUgZWRpdCB3b3VsZCBjb21wbGV0ZSBhbmQgcmV3cml0ZSBub3RoaW5nLiBJdCBpcyBuZWVkZWQgb25seVxuICAgKiBmb3IgYSBzbmFwc2hvdCBhc3NlbWJsZWQgYnkgaGFuZC5cbiAgICpcbiAgICogQGRlZmF1bHQgdGhlIHByb3ZpZGVyIHRoZSBzbmFwc2hvdCB3YXMgYnVpbHQgd2l0aCwgZWxzZSBgSlNPTi5zdHJpbmdpZnlgXG4gICAqL1xuICByZWFkb25seSBsaW5rSWRlbnRpdHlLZXlQcm92aWRlcj86IChsaW5rOiBSZWZlcmVuY2UpID0+IHN0cmluZztcblxuICAvKipcbiAgICogQW4gb3B0aW9uYWwgcmVwb3J0ZXIgaW52b2tlZCBvbmNlIHBlciBiYWNrbGluayBmaWxlIGFmdGVyIGl0cyBsaW5rcyBhcmUgdXBkYXRlZCwgd2l0aCB0aGUgcnVubmluZ1xuICAgKiBjb3VudCBvZiBwcm9jZXNzZWQgZmlsZXMgYW5kIHRoZSB0b3RhbC4gV2hlbiBvbWl0dGVkLCBubyBwcm9ncmVzcyBpcyByZXBvcnRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyPzogTGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNvbnZlcnRlciBpcyBhbHNvIHNob3duIGxpbmtzIHRoYXQgYXJlICoqbm90KiogaW4gdGhlIHNuYXBzaG90LCB3aXRoIGFuIGB1bmRlZmluZWRgXG4gICAqIHtAbGluayBCYWNrbGlua0NvbnZlcnNpb25QYXJhbXMucGF5bG9hZH0uXG4gICAqXG4gICAqIFRoZSBkZWZhdWx0IGZpbHRlcnMgdGhlbSBvdXQsIHdoaWNoIGlzIHdoYXQgYSBwbGFpbiByZW5hbWUgd2FudHM6IGEgbGluayBhYnNlbnQgZnJvbSB0aGUgc25hcHNob3Qgd2FzXG4gICAqIGVpdGhlciBuZXZlciB0aGUgY2FsbGVyJ3MgdG8gcmV3cml0ZSwgb3IgaGFzIGFscmVhZHkgYmVlbiByZXdyaXR0ZW4gYnkgc29tZW9uZSBlbHNlLiBTZXQgdGhpcyB0byBgdHJ1ZWBcbiAgICogb25seSB3aGVuIHRoZSBjYWxsZXIgaGFzIGl0cyBvd24gcmVhc29uIHRvIGxvb2sgYXQgdGhlbSBcdTIwMTQgYSB3aWRlbmVkIG1hdGNoIG9mIGl0cyBvd24sIG9yIGxvZ2dpbmcgYSBza2lwXG4gICAqIHRoYXQgd291bGQgb3RoZXJ3aXNlIGJlIHNpbGVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVmlzaXRVbm1hdGNoZWRMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBjYXB0dXJlZCBiYWNrbGlua3MgdG8gZWRpdC5cbiAgICovXG4gIHJlYWRvbmx5IHNuYXBzaG90OiBCYWNrbGlua3NTbmFwc2hvdDxUUGF5bG9hZD47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGVkaXRMaW5rc0luQ29udGVudH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWRpdExpbmtzSW5Db250ZW50UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhYm9ydCBzaWduYWwgdG8gY29udHJvbCB0aGUgZXhlY3V0aW9uIG9mIHRoZSBmdW5jdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWw7XG5cbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGVudCB0byBlZGl0IHRoZSBsaW5rcyBpbi5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgZWFjaCBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua0NvbnZlcnRlcjogKGxpbms6IFJlZmVyZW5jZSkgPT4gUHJvbWlzYWJsZTxNYXliZVJldHVybjxzdHJpbmc+PjtcblxuICAvKipcbiAgICogQSByYW5nZSB3aXRoaW4ge0BsaW5rIEVkaXRMaW5rc0luQ29udGVudFBhcmFtcy5jb250ZW50fSwgaW4gY2hhcmFjdGVyIG9mZnNldHMsIHJlc3RyaWN0aW5nIHRoZSBwYXNzIHRvXG4gICAqIHRoZSBsaW5rcyBpbnNpZGUgaXQuIFdoZW4gb21pdHRlZCwgZXZlcnkgbGluayBpcyB2aXNpdGVkLlxuICAgKlxuICAgKiBBIGxpbmsgaXMgZWRpdGVkIG9ubHkgd2hlbiBpdCBpcyAqKmZ1bGx5IGNvbnRhaW5lZCoqIGluIHRoZSByYW5nZTsgb25lIHRoYXQgbWVyZWx5IG92ZXJsYXBzIGl0IGlzIGxlZnRcbiAgICogYWxvbmUsIGJlY2F1c2UgcmV3cml0aW5nIHBhcnQgb2YgYSBsaW5rIGNvcnJ1cHRzIGl0LiBCb3RoIGJvdW5kcyBhcmUgaW5jbHVzaXZlLCBzbyBhIHJhbmdlIHdob3NlXG4gICAqIG9mZnNldHMgY29pbmNpZGUgZXhhY3RseSB3aXRoIGEgbGluaydzIGRvZXMgaW5jbHVkZSB0aGF0IGxpbmsuXG4gICAqXG4gICAqIEEgcmVmZXJlbmNlIHRoYXQgY2FycmllcyBubyBwb3NpdGlvbiB3aXRoaW4gdGhlIGNvbnRlbnQgXHUyMDE0IGEgZnJvbnRtYXR0ZXIgbGluaywgYSBtdWx0aS1saW5rIGZyb250bWF0dGVyXG4gICAqIHZhbHVlIGVudHJ5LCBvciBhbnkgY2FudmFzIHJlZmVyZW5jZSBcdTIwMTQgaXMgbmV2ZXIgaW4gcmFuZ2UgYW5kIGlzIHNraXBwZWQgd2hlbmV2ZXIgYSByYW5nZSBpcyBzdXBwbGllZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IG9mZnNldFJhbmdlPzogT2Zmc2V0UmFuZ2U7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxzbyBlZGl0IGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIHRoZSBub3RlIGJvZHkuIFdoZW4gYHRydWVgLCB0aGUgY29udmVydGVyIGFsc29cbiAgICogcmVjZWl2ZXMgcmVmZXJlbmNlcyBmb3IgZXh0ZXJuYWwgbGlua3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVkaXRFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbHNvIGVkaXQgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gZnJvbnRtYXR0ZXIgdmFsdWVzLiBXaGVuIGB0cnVlYCwgdGhlIGNvbnZlcnRlciBhbHNvXG4gICAqIHJlY2VpdmVzIHJlZmVyZW5jZXMgZm9yIGZyb250bWF0dGVyIGV4dGVybmFsIGxpbmtzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRFZGl0RnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbHNvIGVkaXQgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gbXVsdGktbGluayAobXVsdGktdmFsdWUpIGZyb250bWF0dGVyIHZhbHVlcy4gV2hlblxuICAgKiBgdHJ1ZWAsIHRoZSBjb252ZXJ0ZXIgYWxzbyByZWNlaXZlcyByZWZlcmVuY2VzIGZvciBlYWNoIGV4dGVybmFsIGxpbmsgd2l0aGluIGEgbXVsdGktbGluayBmcm9udG1hdHRlclxuICAgKiB2YWx1ZSAoZWFjaCBsb2NhdGVkIGJ5IGl0cyBvZmZzZXRzLCBzbyBvbmx5IHRoYXQgbGluayBpcyBzcGxpY2VkIGJhY2sgaW4gcGxhY2UpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRFZGl0TXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGVkaXRMaW5rc30uXG4gKi9cbmV4cG9ydCB0eXBlIEVkaXRMaW5rc09wdGlvbnMgPSBQcm9jZXNzT3B0aW9ucztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZWRpdExpbmtzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFZGl0TGlua3NQYXJhbXMgZXh0ZW5kcyBFZGl0TGlua3NPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBlYWNoIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rQ29udmVydGVyOiAobGluazogUmVmZXJlbmNlKSA9PiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPHN0cmluZz4+O1xuXG4gIC8qKlxuICAgKiBBIHJhbmdlIHdpdGhpbiB0aGUgZmlsZSdzIGNvbnRlbnQsIGluIGNoYXJhY3RlciBvZmZzZXRzLCByZXN0cmljdGluZyB0aGUgcGFzcyB0byB0aGUgbGlua3MgaW5zaWRlIGl0LlxuICAgKiBXaGVuIG9taXR0ZWQsIGV2ZXJ5IGxpbmsgaXMgdmlzaXRlZC5cbiAgICpcbiAgICogQSBsaW5rIGlzIGVkaXRlZCBvbmx5IHdoZW4gaXQgaXMgKipmdWxseSBjb250YWluZWQqKiBpbiB0aGUgcmFuZ2U7IG9uZSB0aGF0IG1lcmVseSBvdmVybGFwcyBpdCBpcyBsZWZ0XG4gICAqIGFsb25lLCBiZWNhdXNlIHJld3JpdGluZyBwYXJ0IG9mIGEgbGluayBjb3JydXB0cyBpdC4gQm90aCBib3VuZHMgYXJlIGluY2x1c2l2ZSwgc28gYSByYW5nZSB3aG9zZVxuICAgKiBvZmZzZXRzIGNvaW5jaWRlIGV4YWN0bHkgd2l0aCBhIGxpbmsncyBkb2VzIGluY2x1ZGUgdGhhdCBsaW5rLlxuICAgKlxuICAgKiBBIHJlZmVyZW5jZSB0aGF0IGNhcnJpZXMgbm8gcG9zaXRpb24gd2l0aGluIHRoZSBmaWxlJ3MgY29udGVudCBcdTIwMTQgYSBmcm9udG1hdHRlciBsaW5rLCBhIG11bHRpLWxpbmtcbiAgICogZnJvbnRtYXR0ZXIgdmFsdWUgZW50cnksIG9yIGFueSBjYW52YXMgcmVmZXJlbmNlIFx1MjAxNCBpcyBuZXZlciBpbiByYW5nZSBhbmQgaXMgc2tpcHBlZCB3aGVuZXZlciBhIHJhbmdlIGlzXG4gICAqIHN1cHBsaWVkLlxuICAgKlxuICAgKiBUaGUgb2Zmc2V0cyBhcmUgaW50byB0aGUgY29udGVudCB0aGlzIGZ1bmN0aW9uIHJlYWRzIGZyb20gdGhlIHZhdWx0LiBCZWZvcmUgcmVhZGluZywgaXQgc2F2ZXMgYW55XG4gICAqIHVuc2F2ZWQgZWRpdG9yIGJ1ZmZlciBmb3IgdGhlIGZpbGUsIHNvIGEgcmFuZ2UgdGFrZW4gZnJvbSBhbiBvcGVuIGVkaXRvciB2aWEgYEVkaXRvci5wb3NUb09mZnNldGAgaXNcbiAgICogdmFsaWQuIFRoZSBjYWxsZXIgb3ducyBvbmx5IHRoZSBjYXNlIHdoZXJlIHRoZSBidWZmZXIgY2hhbmdlcyBiZXR3ZWVuIGNvbXB1dGluZyB0aGUgcmFuZ2UgYW5kIHRoaXNcbiAgICogY2FsbC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IG9mZnNldFJhbmdlPzogT2Zmc2V0UmFuZ2U7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgdG8gZWRpdCB0aGUgbGlua3MgZm9yLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbHNvIGVkaXQgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gdGhlIG5vdGUgYm9keS4gV2hlbiBgdHJ1ZWAsIHRoZSBjb252ZXJ0ZXIgYWxzb1xuICAgKiByZWNlaXZlcyByZWZlcmVuY2VzIGZvciBleHRlcm5hbCBsaW5rcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRWRpdEV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsc28gZWRpdCBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBmcm9udG1hdHRlciB2YWx1ZXMuIFdoZW4gYHRydWVgLCB0aGUgY29udmVydGVyIGFsc29cbiAgICogcmVjZWl2ZXMgcmVmZXJlbmNlcyBmb3IgZnJvbnRtYXR0ZXIgZXh0ZXJuYWwgbGlua3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVkaXRGcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsc28gZWRpdCBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBtdWx0aS1saW5rIChtdWx0aS12YWx1ZSkgZnJvbnRtYXR0ZXIgdmFsdWVzLiBXaGVuXG4gICAqIGB0cnVlYCwgdGhlIGNvbnZlcnRlciBhbHNvIHJlY2VpdmVzIHJlZmVyZW5jZXMgZm9yIGVhY2ggZXh0ZXJuYWwgbGluayB3aXRoaW4gYSBtdWx0aS1saW5rIGZyb250bWF0dGVyXG4gICAqIHZhbHVlIChlYWNoIGxvY2F0ZWQgYnkgaXRzIG9mZnNldHMsIHNvIG9ubHkgdGhhdCBsaW5rIGlzIHNwbGljZWQgYmFjayBpbiBwbGFjZSkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVkaXRNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZXh0cmFjdExpbmtGaWxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0TGlua0ZpbGVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSByZWZlcmVuY2UgY2FjaGUgZm9yIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGluazogUmVmZXJlbmNlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IG5vbi1leGlzdGluZyBmaWxlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQWxsb3dOb25FeGlzdGluZ0ZpbGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIHBhdGggb3IgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZ2VuZXJhdGVNYXJrZG93bkxpbmt9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIGFsaWFzIGZvciB0aGUgbGluay5cbiAgICpcbiAgICogQGV4YW1wbGUgYFtbYWxpYXN8bGlua11dYFxuICAgKiBAZXhhbXBsZSBgW2FsaWFzXShsaW5rLm1kKWBcbiAgICovXG4gIHJlYWRvbmx5IGFsaWFzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCBiZSBlbWJlZGRlZC4gSWYgbm90IHByb3ZpZGVkLCBpdCB3aWxsIGJlIGluZmVycmVkIGJhc2VkIG9uIHRoZSBmaWxlIHR5cGUuXG4gICAqXG4gICAqIElmIGB0cnVlYDogYCFbW3RhcmdldF1dYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbdGFyZ2V0XV1gLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNFbWJlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgYW4gZW1wdHkgYWxpYXMgZm9yIGVtYmVkcy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHRoZSByZXN1bHQgbGluayBzdHlsZSBpcyB7QGxpbmsgTGlua1N0eWxlLk1hcmtkb3dufS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgIVtdKGZvby5wbmcpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYCFbZm9vXShmb28ucG5nKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBub24tZXhpc3RpbmcgZmlsZXMuXG4gICAqXG4gICAqIElmIGBmYWxzZWAgYW5kIHtAbGluayB0YXJnZXRQYXRoT3JGaWxlfSBpcyBhIG5vbi1leGlzdGluZyBmaWxlLCBhbiBlcnJvciB3aWxsIGJlIHRocm93bi5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNOb25FeGlzdGluZ0ZpbGVBbGxvd2VkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBhIHNpbmdsZSBzdWJwYXRoLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIHRhcmdldFBhdGhPckZpbGV9IGFuZCB7QGxpbmsgc291cmNlUGF0aE9yRmlsZX0gYXJlIHRoZSBzYW1lIGZpbGUuXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtbI3N1YnBhdGhdXWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbW3NvdXJjZSNzdWJwYXRoXV1gXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNTaW5nbGVTdWJwYXRoQWxsb3dlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsgcGF0aC5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtQYXRoU3R5bGU/OiBMaW5rUGF0aFN0eWxlO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvcmlnaW5hbCBsaW5rIHRleHQuXG4gICAqXG4gICAqIElmIHByb3ZpZGVkLCBpdCB3aWxsIGJlIHVzZWQgdG8gaW5mZXIgdGhlIHZhbHVlcyBvZlxuICAgKlxuICAgKiAtIHtAbGluayBoYXNFbWJlZFN5bnRheH1cbiAgICogLSB7QGxpbmsgbGlua1N0eWxlfVxuICAgKiAtIHtAbGluayBzaG91bGRVc2VBbmdsZUJyYWNrZXRzfVxuICAgKiAtIHtAbGluayBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRoc31cbiAgICogLSB7QGxpbmsgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRoc31cbiAgICpcbiAgICogVGhlc2UgaW5mZXJyZWQgdmFsdWVzIHdpbGwgYmUgb3ZlcnJpZGRlbiBieSBjb3JyZXNwb25kaW5nIHNldHRpbmdzIGlmIHNwZWNpZmllZC5cbiAgICovXG4gIHJlYWRvbmx5IG9yaWdpbmFsTGluaz86IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0byBlc2NhcGUgdGhlIGFsaWFzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYgdGhlIHJlc3VsdCBsaW5rIHN0eWxlIGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbXFwqXFwqYWxpYXNcXCpcXCpdKGxpbmsubWQpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFsqKmFsaWFzKipdKGxpbmsubWQpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRXNjYXBlQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGF0dGFjaG1lbnQgZXh0ZW5zaW9uIGluIHRoZSBlbWJlZCBhbGlhcy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWR9IGlzIGBmYWxzZWAuXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtmb28ucG5nXShmb28ucG5nKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbZm9vXShmb28ucG5nKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYW5nbGUgYnJhY2tldHMuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgbGlua1N0eWxlfSBpcyB7QGxpbmsgTGlua1N0eWxlLk1hcmtkb3dufS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW2FsaWFzXSg8cGF0aCB3aXRoIHNwYWNlcy5tZD4pYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFthbGlhc10ocGF0aCUyMHdpdGglMjBzcGFjZXMubWQpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGEgbGVhZGluZyBkb3QuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgbGlua1BhdGhTdHlsZX0gaXMge0BsaW5rIExpbmtQYXRoU3R5bGUuUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2V9LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbWy4vcmVsYXRpdmUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbcmVsYXRpdmUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhIGxlYWRpbmcgc2xhc2guXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgbGlua1BhdGhTdHlsZX0gaXMge0BsaW5rIExpbmtQYXRoU3R5bGUuQWJzb2x1dGVQYXRoSW5WYXVsdH0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtbL2Fic29sdXRlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbW2Fic29sdXRlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHNvdXJjZSBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQSBzdWJwYXRoIG9mIHRoZSBsaW5rLlxuICAgKlxuICAgKiBTaG91bGQgYmUgZW1wdHkgb3Igc3RhcnQgd2l0aCBgI2AuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbW2xpbmstd2l0aC1lbXB0eS1zdWJwYXRoXV1gXG4gICAqIEBleGFtcGxlIGBbW2xpbmstd2l0aC1zdWJwYXRoI3N1YnBhdGhdXWBcbiAgICogQGV4YW1wbGUgYFtbbGluay13aXRoLXN1YnBhdGgjc3VicGF0aCNuZXN0ZWQtc3VicGF0aF1dYFxuICAgKiBAZGVmYXVsdCBgJydgXG4gICAqL1xuICByZWFkb25seSBzdWJwYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHRhcmdldCBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGdlbmVyYXRlUmF3TWFya2Rvd25MaW5rfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZVJhd01hcmtkb3duTGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBhbGlhcyBvZiB0aGUgbGluay4gRGVmYXVsdHMgdG8gYHVuZGVmaW5lZGAuXG4gICAqL1xuICByZWFkb25seSBhbGlhcz86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbGluayBzaG91bGQgYmUgYW4gZW1iZWQgbGluay5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNFbWJlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGxpbmsgc2hvdWxkIGJlIGEgd2lraWxpbmsuXG4gICAqL1xuICByZWFkb25seSBpc1dpa2lsaW5rOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVzY2FwZSB0aGUgYWxpYXMuIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgaGFzV2lraWxpbmtTeW50YXh9IGlzIGBmYWxzZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVzY2FwZUFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1c2UgYW5nbGUgYnJhY2tldHMuIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgaGFzV2lraWxpbmtTeW50YXh9IGlzIGBmYWxzZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUFuZ2xlQnJhY2tldHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHRpdGxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgdGl0bGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIFVSTCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHVybDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEge0BsaW5rIEJhY2tsaW5rc1NuYXBzaG90fSB3aGlsZSBpdCBpcyBzdGlsbCBiZWluZyBhY2N1bXVsYXRlZCBieSB7QGxpbmsgYnVpbGRCYWNrbGlua3NTbmFwc2hvdH0uXG4gKlxuICogQHR5cGVQYXJhbSBUUGF5bG9hZCAtIFRoZSBwYXlsb2FkIHJlY29yZGVkIGZvciBlYWNoIGxpbmsuXG4gKi9cbmV4cG9ydCB0eXBlIE11dGFibGVCYWNrbGlua3NTbmFwc2hvdDxUUGF5bG9hZD4gPSBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBUUGF5bG9hZD4+O1xuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIHNob3VsZFJlc2V0QWxpYXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNob3VsZFJlc2V0QWxpYXNQYXJhbXMge1xuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgZGlzcGxheSB0ZXh0IG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgZGlzcGxheVRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIGlzIGEgd2lraWxpbmsuXG4gICAqL1xuICByZWFkb25seSBpc1dpa2lsaW5rPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBzb3VyY2UgcGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG5ld1NvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCBzb3VyY2UgZmlsZSBjb250YWluaW5nIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkU291cmNlUGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCB0YXJnZXQgcGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFRhcmdldFBhdGg6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEEgdGFyZ2V0IHBhdGggb3IgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldFBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogU3BsaXRzIGEgbGluayBpbnRvIGl0cyBsaW5rIHBhdGggYW5kIHN1YnBhdGguXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BsaXRTdWJwYXRoUmVzdWx0IHtcbiAgLyoqXG4gICAqIEEgbGluayBwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1BhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogQSBzdWJwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgc3VicGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIHVwZGF0ZUZpbGVVcmxMaW5rc0luQ29udGVudH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlRmlsZVVybExpbmtzSW5Db250ZW50UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhYm9ydCBzaWduYWwgdG8gY29udHJvbCB0aGUgZXhlY3V0aW9uIG9mIHRoZSBmdW5jdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWw7XG5cbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGVudCB0byBub3JtYWxpemUgdGhlIGBmaWxlOi8vYCBsaW5rcyBpbi5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogQSByYW5nZSB3aXRoaW4ge0BsaW5rIFVwZGF0ZUZpbGVVcmxMaW5rc0luQ29udGVudFBhcmFtcy5jb250ZW50fSwgaW4gY2hhcmFjdGVyIG9mZnNldHMsIHJlc3RyaWN0aW5nXG4gICAqIHRoZSBwYXNzIHRvIHRoZSBsaW5rcyBpbnNpZGUgaXQuIFdoZW4gb21pdHRlZCwgZXZlcnkgbGluayBpcyB2aXNpdGVkLlxuICAgKlxuICAgKiBBIGxpbmsgaXMgbm9ybWFsaXplZCBvbmx5IHdoZW4gaXQgaXMgKipmdWxseSBjb250YWluZWQqKiBpbiB0aGUgcmFuZ2U7IG9uZSB0aGF0IG1lcmVseSBvdmVybGFwcyBpdCBpc1xuICAgKiBsZWZ0IGFsb25lLCBiZWNhdXNlIHJld3JpdGluZyBwYXJ0IG9mIGEgbGluayBjb3JydXB0cyBpdC4gQm90aCBib3VuZHMgYXJlIGluY2x1c2l2ZSwgc28gYSByYW5nZSB3aG9zZVxuICAgKiBvZmZzZXRzIGNvaW5jaWRlIGV4YWN0bHkgd2l0aCBhIGxpbmsncyBkb2VzIGluY2x1ZGUgdGhhdCBsaW5rLlxuICAgKlxuICAgKiBBIHJlZmVyZW5jZSB0aGF0IGNhcnJpZXMgbm8gcG9zaXRpb24gd2l0aGluIHRoZSBjb250ZW50IFx1MjAxNCBhIGZyb250bWF0dGVyIGxpbmssIGEgbXVsdGktbGluayBmcm9udG1hdHRlclxuICAgKiB2YWx1ZSBlbnRyeSwgb3IgYW55IGNhbnZhcyByZWZlcmVuY2UgXHUyMDE0IGlzIG5ldmVyIGluIHJhbmdlIGFuZCBpcyBza2lwcGVkIHdoZW5ldmVyIGEgcmFuZ2UgaXMgc3VwcGxpZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgXG4gICAqL1xuICByZWFkb25seSBvZmZzZXRSYW5nZT86IE9mZnNldFJhbmdlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVtaXQgdGhlIG5vcm1hbGl6ZWQgbGlua3Mgd2l0aCBhbmdsZSBicmFja2V0cyBhbmQgcmF3IHNwYWNlcyBpbnN0ZWFkIG9mIGAlMjBgLWVuY29kaW5nLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VBbmdsZUJyYWNrZXRzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayB1cGRhdGVGaWxlVXJsTGlua3NJbkZpbGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUZpbGVVcmxMaW5rc0luRmlsZVBhcmFtcyBleHRlbmRzIFByb2Nlc3NPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIHJhbmdlIHdpdGhpbiB0aGUgZmlsZSdzIGNvbnRlbnQsIGluIGNoYXJhY3RlciBvZmZzZXRzLCByZXN0cmljdGluZyB0aGUgcGFzcyB0byB0aGUgbGlua3MgaW5zaWRlIGl0LlxuICAgKiBXaGVuIG9taXR0ZWQsIGV2ZXJ5IGxpbmsgaXMgdmlzaXRlZC5cbiAgICpcbiAgICogQSBsaW5rIGlzIG5vcm1hbGl6ZWQgb25seSB3aGVuIGl0IGlzICoqZnVsbHkgY29udGFpbmVkKiogaW4gdGhlIHJhbmdlOyBvbmUgdGhhdCBtZXJlbHkgb3ZlcmxhcHMgaXQgaXNcbiAgICogbGVmdCBhbG9uZSwgYmVjYXVzZSByZXdyaXRpbmcgcGFydCBvZiBhIGxpbmsgY29ycnVwdHMgaXQuIEJvdGggYm91bmRzIGFyZSBpbmNsdXNpdmUsIHNvIGEgcmFuZ2Ugd2hvc2VcbiAgICogb2Zmc2V0cyBjb2luY2lkZSBleGFjdGx5IHdpdGggYSBsaW5rJ3MgZG9lcyBpbmNsdWRlIHRoYXQgbGluay5cbiAgICpcbiAgICogQSByZWZlcmVuY2UgdGhhdCBjYXJyaWVzIG5vIHBvc2l0aW9uIHdpdGhpbiB0aGUgZmlsZSdzIGNvbnRlbnQgXHUyMDE0IGEgZnJvbnRtYXR0ZXIgbGluaywgYSBtdWx0aS1saW5rXG4gICAqIGZyb250bWF0dGVyIHZhbHVlIGVudHJ5LCBvciBhbnkgY2FudmFzIHJlZmVyZW5jZSBcdTIwMTQgaXMgbmV2ZXIgaW4gcmFuZ2UgYW5kIGlzIHNraXBwZWQgd2hlbmV2ZXIgYSByYW5nZSBpc1xuICAgKiBzdXBwbGllZC5cbiAgICpcbiAgICogVGhlIG9mZnNldHMgYXJlIGludG8gdGhlIGNvbnRlbnQgdGhpcyBmdW5jdGlvbiByZWFkcyBmcm9tIHRoZSB2YXVsdC4gQmVmb3JlIHJlYWRpbmcsIGl0IHNhdmVzIGFueVxuICAgKiB1bnNhdmVkIGVkaXRvciBidWZmZXIgZm9yIHRoZSBmaWxlLCBzbyBhIHJhbmdlIHRha2VuIGZyb20gYW4gb3BlbiBlZGl0b3IgdmlhIGBFZGl0b3IucG9zVG9PZmZzZXRgIGlzXG4gICAqIHZhbGlkLiBUaGUgY2FsbGVyIG93bnMgb25seSB0aGUgY2FzZSB3aGVyZSB0aGUgYnVmZmVyIGNoYW5nZXMgYmV0d2VlbiBjb21wdXRpbmcgdGhlIHJhbmdlIGFuZCB0aGlzXG4gICAqIGNhbGwuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgXG4gICAqL1xuICByZWFkb25seSBvZmZzZXRSYW5nZT86IE9mZnNldFJhbmdlO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmaWxlIHRvIG5vcm1hbGl6ZSB0aGUgYGZpbGU6Ly9gIGxpbmtzIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBlbWl0IHRoZSBub3JtYWxpemVkIGxpbmtzIHdpdGggYW5nbGUgYnJhY2tldHMgYW5kIHJhdyBzcGFjZXMgaW5zdGVhZCBvZiBgJTIwYC1lbmNvZGluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgdXBkYXRlTGlua30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlTGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBhbiBlbXB0eSBhbGlhcyBmb3IgZW1iZWRzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYgdGhlIHJlc3VsdCBsaW5rIHN0eWxlIGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGAhW10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgIVtmb29dKGZvby5wbmcpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rOiBSZWZlcmVuY2U7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsgcGF0aC5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtQYXRoU3R5bGU/OiBMaW5rUGF0aFN0eWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGZvcmNlIG1hcmtkb3duIGxpbmtzLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBBIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3VGFyZ2V0UGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHBhdGggb2YgdGhlIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBvbGRUYXJnZXRQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBlc2NhcGUgdGhlIGFsaWFzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYgdGhlIHJlc3VsdCBsaW5rIHN0eWxlIGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbXFwqXFwqYWxpYXNcXCpcXCpdKGxpbmsubWQpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFsqKmFsaWFzKipdKGxpbmsubWQpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRXNjYXBlQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGF0dGFjaG1lbnQgZXh0ZW5zaW9uIGluIHRoZSBlbWJlZCBhbGlhcy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWR9IGlzIGBmYWxzZWAuXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtmb28ucG5nXShmb28ucG5nKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbZm9vXShmb28ucG5nKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZSBuYW1lIGFsaWFzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhbmdsZSBicmFja2V0cy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rU3R5bGV9IGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbYWxpYXNdKDxwYXRoIHdpdGggc3BhY2VzLm1kPilgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW2FsaWFzXShwYXRoJTIwd2l0aCUyMHNwYWNlcy5tZClgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VBbmdsZUJyYWNrZXRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYSBsZWFkaW5nIGRvdC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rUGF0aFN0eWxlfSBpcyB7QGxpbmsgTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZX0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtbLi9yZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1tyZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRocz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGEgbGVhZGluZyBzbGFzaC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rUGF0aFN0eWxlfSBpcyB7QGxpbmsgTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0fS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1svYWJzb2x1dGUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbYWJzb2x1dGUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRocz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgdXBkYXRlTGlua3NJbkZpbGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUxpbmtzSW5GaWxlUGFyYW1zIGV4dGVuZHMgUHJvY2Vzc09wdGlvbnMge1xuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgYW4gZW1wdHkgYWxpYXMgZm9yIGVtYmVkcy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHRoZSByZXN1bHQgbGluayBzdHlsZSBpcyB7QGxpbmsgTGlua1N0eWxlLk1hcmtkb3dufS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgIVtdKGZvby5wbmcpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYCFbZm9vXShmb28ucG5nKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBzdHlsZSBvZiB0aGUgbGluayBwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1BhdGhTdHlsZT86IExpbmtQYXRoU3R5bGU7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rU3R5bGU/OiBMaW5rU3R5bGU7XG5cbiAgLyoqXG4gICAqIEEgZmlsZSB0byB1cGRhdGUgdGhlIGxpbmtzIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3U291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQSByYW5nZSB3aXRoaW4gdGhlIGZpbGUncyBjb250ZW50LCBpbiBjaGFyYWN0ZXIgb2Zmc2V0cywgcmVzdHJpY3RpbmcgdGhlIHBhc3MgdG8gdGhlIGxpbmtzIGluc2lkZSBpdC5cbiAgICogV2hlbiBvbWl0dGVkLCBldmVyeSBsaW5rIGlzIHZpc2l0ZWQuXG4gICAqXG4gICAqIEEgbGluayBpcyB1cGRhdGVkIG9ubHkgd2hlbiBpdCBpcyAqKmZ1bGx5IGNvbnRhaW5lZCoqIGluIHRoZSByYW5nZTsgb25lIHRoYXQgbWVyZWx5IG92ZXJsYXBzIGl0IGlzIGxlZnRcbiAgICogYWxvbmUsIGJlY2F1c2UgcmV3cml0aW5nIHBhcnQgb2YgYSBsaW5rIGNvcnJ1cHRzIGl0LiBCb3RoIGJvdW5kcyBhcmUgaW5jbHVzaXZlLCBzbyBhIHJhbmdlIHdob3NlXG4gICAqIG9mZnNldHMgY29pbmNpZGUgZXhhY3RseSB3aXRoIGEgbGluaydzIGRvZXMgaW5jbHVkZSB0aGF0IGxpbmsuXG4gICAqXG4gICAqIEEgcmVmZXJlbmNlIHRoYXQgY2FycmllcyBubyBwb3NpdGlvbiB3aXRoaW4gdGhlIGZpbGUncyBjb250ZW50IFx1MjAxNCBhIGZyb250bWF0dGVyIGxpbmssIGEgbXVsdGktbGlua1xuICAgKiBmcm9udG1hdHRlciB2YWx1ZSBlbnRyeSwgb3IgYW55IGNhbnZhcyByZWZlcmVuY2UgXHUyMDE0IGlzIG5ldmVyIGluIHJhbmdlIGFuZCBpcyBza2lwcGVkIHdoZW5ldmVyIGEgcmFuZ2UgaXNcbiAgICogc3VwcGxpZWQuXG4gICAqXG4gICAqIFRoZSBvZmZzZXRzIGFyZSBpbnRvIHRoZSBjb250ZW50IHRoaXMgZnVuY3Rpb24gcmVhZHMgZnJvbSB0aGUgdmF1bHQuIEJlZm9yZSByZWFkaW5nLCBpdCBzYXZlcyBhbnlcbiAgICogdW5zYXZlZCBlZGl0b3IgYnVmZmVyIGZvciB0aGUgZmlsZSwgc28gYSByYW5nZSB0YWtlbiBmcm9tIGFuIG9wZW4gZWRpdG9yIHZpYSBgRWRpdG9yLnBvc1RvT2Zmc2V0YCBpc1xuICAgKiB2YWxpZC4gVGhlIGNhbGxlciBvd25zIG9ubHkgdGhlIGNhc2Ugd2hlcmUgdGhlIGJ1ZmZlciBjaGFuZ2VzIGJldHdlZW4gY29tcHV0aW5nIHRoZSByYW5nZSBhbmQgdGhpc1xuICAgKiBjYWxsLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgb2Zmc2V0UmFuZ2U/OiBPZmZzZXRSYW5nZTtcblxuICAvKipcbiAgICogQW4gb2xkIHBhdGggb2YgdGhlIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBlc2NhcGUgdGhlIGFsaWFzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYgdGhlIHJlc3VsdCBsaW5rIHN0eWxlIGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbXFwqXFwqYWxpYXNcXCpcXCpdKGxpbmsubWQpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFsqKmFsaWFzKipdKGxpbmsubWQpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRXNjYXBlQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGF0dGFjaG1lbnQgZXh0ZW5zaW9uIGluIHRoZSBlbWJlZCBhbGlhcy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWR9IGlzIGBmYWxzZWAuXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtmb28ucG5nXShmb28ucG5nKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbZm9vXShmb28ucG5nKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgb25seSBlbWJlZGRlZCBsaW5rcy5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZSBuYW1lIGFsaWFzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhbmdsZSBicmFja2V0cy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rU3R5bGV9IGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbYWxpYXNdKDxwYXRoIHdpdGggc3BhY2VzLm1kPilgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW2FsaWFzXShwYXRoJTIwd2l0aCUyMHNwYWNlcy5tZClgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VBbmdsZUJyYWNrZXRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYSBsZWFkaW5nIGRvdC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rUGF0aFN0eWxlfSBpcyB7QGxpbmsgTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZX0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtbLi9yZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1tyZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRocz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGEgbGVhZGluZyBzbGFzaC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rUGF0aFN0eWxlfSBpcyB7QGxpbmsgTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0fS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1svYWJzb2x1dGUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbYWJzb2x1dGUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRocz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZ2VuZXJhdGVMaW5rVGV4dH0uXG4gKi9cbmludGVyZmFjZSBHZW5lcmF0ZUxpbmtUZXh0UGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBjb25maWc6IExpbmtDb25maWc7XG5cbiAgLyoqXG4gICAqIEEgc291cmNlIHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3VicGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHN1YnBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogQSB0YXJnZXQgZmlsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldEZpbGU6IFRGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGdlbmVyYXRlTWFya2Rvd25TdHlsZUxpbmt9LlxuICovXG5pbnRlcmZhY2UgR2VuZXJhdGVNYXJrZG93blN0eWxlTGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBjb25maWc6IExpbmtDb25maWc7XG5cbiAgLyoqXG4gICAqIEEgdGV4dCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtUZXh0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXJhbXMgZm9yIGdlbmVyYXRpbmcgdGhlIG1hcmtkb3duIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBtYXJrZG93bkxpbmtQYXJhbXM6IEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zO1xuXG4gIC8qKlxuICAgKiBBIHRhcmdldCBmaWxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0RmlsZTogVEZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZ2VuZXJhdGVXaWtpTGlua30uXG4gKi9cbmludGVyZmFjZSBHZW5lcmF0ZVdpa2lMaW5rUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIGFsaWFzIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxpYXM6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbGluayBzaG91bGQgYmUgYW4gZW1iZWQgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGlzRW1iZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgdGV4dCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtUZXh0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZ2V0RmlsZUNoYW5nZXN9LlxuICovXG5pbnRlcmZhY2UgR2V0RmlsZUNoYW5nZXNQYXJhbXMge1xuICAvKipcbiAgICogQW4gYWJvcnQgc2lnbmFsIHRvIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuXG4gIC8qKlxuICAgKiBBIG1ldGFkYXRhIGNhY2hlIHRvIGV4dHJhY3QgdGhlIGxpbmtzIGZyb20uXG4gICAqL1xuICByZWFkb25seSBjYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjYWNoZSBiZWxvbmdzIHRvIGEgY2FudmFzIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBpc0NhbnZhc0ZpbGVDYWNoZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGVhY2ggbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtDb252ZXJ0ZXI6IChsaW5rOiBSZWZlcmVuY2UsIGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCkgPT4gUHJvbWlzYWJsZTxNYXliZVJldHVybjxzdHJpbmc+PjtcblxuICAvKipcbiAgICogQSByYW5nZSB3aXRoaW4gdGhlIGNvbnRlbnQsIGluIGNoYXJhY3RlciBvZmZzZXRzLCByZXN0cmljdGluZyB0aGUgY2hhbmdlcyB0byB0aGUgbGlua3MgZnVsbHkgY29udGFpbmVkXG4gICAqIGluIGl0LiBXaGVuIG9taXR0ZWQsIGV2ZXJ5IGxpbmsgaXMgdmlzaXRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IG9mZnNldFJhbmdlPzogT2Zmc2V0UmFuZ2U7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSBleHRlcm5hbCBsaW5rcyAocGFyc2VkIGZyb20gdGhlIG5vdGUgYm9keSkgaW4gdGhlIGNoYW5nZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIGV4dGVybmFsIGxpbmtzIChwYXJzZWQgZnJvbSBmcm9udG1hdHRlciB2YWx1ZXMpIGluIHRoZSBjaGFuZ2VzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIGV4dGVybmFsIGxpbmtzIChwYXJzZWQgZnJvbSBtdWx0aS1saW5rIGZyb250bWF0dGVyIHZhbHVlcykgaW4gdGhlIGNoYW5nZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIExpbmtDb25maWcge1xuICByZWFkb25seSBpc0VtYmVkOiBib29sZWFuO1xuICByZWFkb25seSBpc1NpbmdsZVN1YnBhdGhBbGxvd2VkOiBib29sZWFuO1xuICByZWFkb25seSBpc1dpa2lsaW5rOiBib29sZWFuO1xuICByZWFkb25seSBsaW5rUGF0aFN0eWxlOiBGaW5hbExpbmtQYXRoU3R5bGU7XG4gIHJlYWRvbmx5IHNob3VsZFVzZUFuZ2xlQnJhY2tldHM6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzOiBib29sZWFuO1xuICByZWFkb25seSBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIHJlc29sdmVTbmFwc2hvdExpbmtJZGVudGl0eUtleVByb3ZpZGVyfS5cbiAqL1xuaW50ZXJmYWNlIFJlc29sdmVTbmFwc2hvdExpbmtJZGVudGl0eUtleVByb3ZpZGVyUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBwdWJsaWMgZnVuY3Rpb24gYXNraW5nLCBuYW1lZCBpbiB0aGUgZXJyb3IuXG4gICAqL1xuICByZWFkb25seSBjYWxsZXJOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm92aWRlciB0aGUgY2FsbGVyIHBhc3NlZCwgaWYgYW55LlxuICAgKi9cbiAgcmVhZG9ubHkgZXhwbGljaXRMaW5rSWRlbnRpdHlLZXlQcm92aWRlcjogKChsaW5rOiBSZWZlcmVuY2UpID0+IHN0cmluZykgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBzbmFwc2hvdCB3aG9zZSByZWNvcmRlZCBwcm92aWRlciB3aW5zIHdoZW4gdGhlIGNhbGxlciBwYXNzZWQgbm9uZS5cbiAgICovXG4gIHJlYWRvbmx5IHNuYXBzaG90OiBCYWNrbGlua3NTbmFwc2hvdDx1bmtub3duPjtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBzaG91bGRVc2VXaWtpbGlua1N0eWxlfS5cbiAqL1xuaW50ZXJmYWNlIFNob3VsZFVzZVdpa2lsaW5rU3R5bGVQYXJhbXMge1xuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rU3R5bGU/OiBMaW5rU3R5bGU7XG5cbiAgLyoqXG4gICAqIEFuIG9yaWdpbmFsIGxpbmsgdGV4dC5cbiAgICovXG4gIHJlYWRvbmx5IG9yaWdpbmFsTGluaz86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFRhYmxlUG9zaXRpb24ge1xuICBlbmQ6IG51bWJlcjtcbiAgc3RhcnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayB1cGRhdGVMaW5rc0luQ29udGVudH0uXG4gKi9cbmludGVyZmFjZSBVcGRhdGVMaW5rc0luQ29udGVudFBhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSBjb250ZW50IHRvIHVwZGF0ZSB0aGUgbGlua3MgaW4uXG4gICAqL1xuICByZWFkb25seSBjb250ZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgYW4gZW1wdHkgYWxpYXMgZm9yIGVtYmVkcy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHRoZSByZXN1bHQgbGluayBzdHlsZSBpcyB7QGxpbmsgTGlua1N0eWxlLk1hcmtkb3dufS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgIVtdKGZvby5wbmcpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYCFbZm9vXShmb28ucG5nKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBzdHlsZSBvZiB0aGUgbGluayBwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1BhdGhTdHlsZT86IExpbmtQYXRoU3R5bGU7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rU3R5bGU/OiBMaW5rU3R5bGU7XG5cbiAgLyoqXG4gICAqIEEgbmV3IHNvdXJjZSBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIHJhbmdlIHdpdGhpbiB7QGxpbmsgVXBkYXRlTGlua3NJbkNvbnRlbnRQYXJhbXMuY29udGVudH0sIGluIGNoYXJhY3RlciBvZmZzZXRzLCByZXN0cmljdGluZyB0aGUgcGFzc1xuICAgKiB0byB0aGUgbGlua3MgaW5zaWRlIGl0LiBXaGVuIG9taXR0ZWQsIGV2ZXJ5IGxpbmsgaXMgdmlzaXRlZC5cbiAgICpcbiAgICogQSBsaW5rIGlzIHVwZGF0ZWQgb25seSB3aGVuIGl0IGlzICoqZnVsbHkgY29udGFpbmVkKiogaW4gdGhlIHJhbmdlOyBvbmUgdGhhdCBtZXJlbHkgb3ZlcmxhcHMgaXQgaXMgbGVmdFxuICAgKiBhbG9uZSwgYmVjYXVzZSByZXdyaXRpbmcgcGFydCBvZiBhIGxpbmsgY29ycnVwdHMgaXQuIEJvdGggYm91bmRzIGFyZSBpbmNsdXNpdmUsIHNvIGEgcmFuZ2Ugd2hvc2VcbiAgICogb2Zmc2V0cyBjb2luY2lkZSBleGFjdGx5IHdpdGggYSBsaW5rJ3MgZG9lcyBpbmNsdWRlIHRoYXQgbGluay5cbiAgICpcbiAgICogQSByZWZlcmVuY2UgdGhhdCBjYXJyaWVzIG5vIHBvc2l0aW9uIHdpdGhpbiB0aGUgY29udGVudCBcdTIwMTQgYSBmcm9udG1hdHRlciBsaW5rLCBhIG11bHRpLWxpbmsgZnJvbnRtYXR0ZXJcbiAgICogdmFsdWUgZW50cnksIG9yIGFueSBjYW52YXMgcmVmZXJlbmNlIFx1MjAxNCBpcyBuZXZlciBpbiByYW5nZSBhbmQgaXMgc2tpcHBlZCB3aGVuZXZlciBhIHJhbmdlIGlzIHN1cHBsaWVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgb2Zmc2V0UmFuZ2U/OiBPZmZzZXRSYW5nZTtcblxuICAvKipcbiAgICogQW4gb2xkIHNvdXJjZSBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBlc2NhcGUgdGhlIGFsaWFzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYgdGhlIHJlc3VsdCBsaW5rIHN0eWxlIGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbXFwqXFwqYWxpYXNcXCpcXCpdKGxpbmsubWQpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFsqKmFsaWFzKipdKGxpbmsubWQpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRXNjYXBlQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGF0dGFjaG1lbnQgZXh0ZW5zaW9uIGluIHRoZSBlbWJlZCBhbGlhcy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWR9IGlzIGBmYWxzZWAuXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtmb28ucG5nXShmb28ucG5nKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbZm9vXShmb28ucG5nKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgb25seSBlbWJlZGRlZCBsaW5rcy5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZSBuYW1lIGFsaWFzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhbmdsZSBicmFja2V0cy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rU3R5bGV9IGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbYWxpYXNdKDxwYXRoIHdpdGggc3BhY2VzLm1kPilgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW2FsaWFzXShwYXRoJTIwd2l0aCUyMHNwYWNlcy5tZClgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VBbmdsZUJyYWNrZXRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYSBsZWFkaW5nIGRvdC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rUGF0aFN0eWxlfSBpcyB7QGxpbmsgTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZX0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtbLi9yZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1tyZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRocz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGEgbGVhZGluZyBzbGFzaC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rUGF0aFN0eWxlfSBpcyB7QGxpbmsgTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0fS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1svYWJzb2x1dGUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbYWJzb2x1dGUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRocz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUmVjb3JkcyBhIHNldCBvZiBiYWNrbGlua3MgaW50byBhIHNuYXBzaG90IHRoYXQge0BsaW5rIGVkaXRCYWNrbGlua3NTbmFwc2hvdH0gY2FuIHJld3JpdGUgbGF0ZXIuXG4gKlxuICogQ2FsbCBpdCBvbmNlIHBlciB0YXJnZXQgYW5kIHBhc3Mge0BsaW5rIEJ1aWxkQmFja2xpbmtzU25hcHNob3RQYXJhbXMudGFyZ2V0fSB0byBhY2N1bXVsYXRlIHNldmVyYWwgdGFyZ2V0c1xuICogaW50byBvbmUgc25hcHNob3QsIHNvIHRoYXQgYSBub3RlIGxpbmtpbmcgdG8gc2V2ZXJhbCBvZiB0aGVtIGlzIHN0aWxsIHJld3JpdHRlbiBleGFjdGx5IG9uY2UuXG4gKlxuICogQHR5cGVQYXJhbSBUUGF5bG9hZCAtIFRoZSBwYXlsb2FkIHJlY29yZGVkIGZvciBlYWNoIGxpbmsuXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGJ1aWxkaW5nIHRoZSBzbmFwc2hvdC5cbiAqIEByZXR1cm5zIFRoZSBzbmFwc2hvdCBcdTIwMTQge0BsaW5rIEJ1aWxkQmFja2xpbmtzU25hcHNob3RQYXJhbXMudGFyZ2V0fSBpdHNlbGYgd2hlbiBvbmUgd2FzIHBhc3NlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQmFja2xpbmtzU25hcHNob3Q8VFBheWxvYWQ+KHBhcmFtczogQnVpbGRCYWNrbGlua3NTbmFwc2hvdFBhcmFtczxUUGF5bG9hZD4pOiBNdXRhYmxlQmFja2xpbmtzU25hcHNob3Q8VFBheWxvYWQ+IHtcbiAgY29uc3Qge1xuICAgIGJhY2tsaW5rcyxcbiAgICBsaW5rSWRlbnRpdHlLZXlQcm92aWRlcjogZXhwbGljaXRMaW5rSWRlbnRpdHlLZXlQcm92aWRlcixcbiAgICBwYXRoUmVtYXBwZXIsXG4gICAgcGF5bG9hZFByb3ZpZGVyLFxuICAgIHRhcmdldFxuICB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IHNuYXBzaG90ID0gdGFyZ2V0ID8/IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBUUGF5bG9hZD4+KCk7XG4gIGNvbnN0IGxpbmtJZGVudGl0eUtleVByb3ZpZGVyID0gcmVzb2x2ZVNuYXBzaG90TGlua0lkZW50aXR5S2V5UHJvdmlkZXIoe1xuICAgIGNhbGxlck5hbWU6ICdidWlsZEJhY2tsaW5rc1NuYXBzaG90JyxcbiAgICBleHBsaWNpdExpbmtJZGVudGl0eUtleVByb3ZpZGVyLFxuICAgIHNuYXBzaG90XG4gIH0pO1xuICBzbmFwc2hvdExpbmtJZGVudGl0eUtleVByb3ZpZGVycy5zZXQoc25hcHNob3QsIGxpbmtJZGVudGl0eUtleVByb3ZpZGVyKTtcblxuICBmb3IgKGNvbnN0IGJhY2tsaW5rUGF0aCBvZiBiYWNrbGlua3Mua2V5cygpKSB7XG4gICAgY29uc3QgbmV3QmFja2xpbmtQYXRoID0gcGF0aFJlbWFwcGVyPy4oYmFja2xpbmtQYXRoKSA/PyBiYWNrbGlua1BhdGg7XG4gICAgbGV0IHBheWxvYWRzID0gc25hcHNob3QuZ2V0KG5ld0JhY2tsaW5rUGF0aCk7XG4gICAgaWYgKCFwYXlsb2Fkcykge1xuICAgICAgcGF5bG9hZHMgPSBuZXcgTWFwPHN0cmluZywgVFBheWxvYWQ+KCk7XG4gICAgICBzbmFwc2hvdC5zZXQobmV3QmFja2xpbmtQYXRoLCBwYXlsb2Fkcyk7XG4gICAgfVxuXG4gICAgLyogdjggaWdub3JlIG5leHQgLS0gQSBrZXkgeWllbGRlZCBieSBga2V5cygpYCBhbHdheXMgcmVzb2x2ZXM7IHRoZSBgPz8gW11gIGlzIGRlZmVuc2l2ZS4gKi9cbiAgICBmb3IgKGNvbnN0IGxpbmsgb2YgYmFja2xpbmtzLmdldChiYWNrbGlua1BhdGgpID8/IFtdKSB7XG4gICAgICBwYXlsb2Fkcy5zZXQobGlua0lkZW50aXR5S2V5UHJvdmlkZXIobGluayksIHBheWxvYWRQcm92aWRlcihsaW5rKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHNuYXBzaG90O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgbGluayB0byBhIG5ldyBwYXRoLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgY29udmVydGluZyB0aGUgbGluay5cbiAqIEByZXR1cm5zIFRoZSBjb252ZXJ0ZWQgbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRMaW5rKHBhcmFtczogQ29udmVydExpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB0YXJnZXRGaWxlID0gZXh0cmFjdExpbmtGaWxlKHtcbiAgICBhcHA6IHBhcmFtcy5hcHAsXG4gICAgbGluazogcGFyYW1zLmxpbmssXG4gICAgc291cmNlUGF0aE9yRmlsZTogcGFyYW1zLm9sZFNvdXJjZVBhdGhPckZpbGUgPz8gcGFyYW1zLm5ld1NvdXJjZVBhdGhPckZpbGVcbiAgfSk7XG4gIHJldHVybiB0YXJnZXRGaWxlXG4gICAgPyB1cGRhdGVMaW5rKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxVcGRhdGVMaW5rUGFyYW1zPih7XG4gICAgICBhcHA6IHBhcmFtcy5hcHAsXG4gICAgICBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQ6IHBhcmFtcy5pc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQsXG4gICAgICBsaW5rOiBwYXJhbXMubGluayxcbiAgICAgIGxpbmtQYXRoU3R5bGU6IHBhcmFtcy5saW5rUGF0aFN0eWxlLFxuICAgICAgbGlua1N0eWxlOiBwYXJhbXMubGlua1N0eWxlLFxuICAgICAgbmV3U291cmNlUGF0aE9yRmlsZTogcGFyYW1zLm5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgICBuZXdUYXJnZXRQYXRoT3JGaWxlOiB0YXJnZXRGaWxlLFxuICAgICAgb2xkU291cmNlUGF0aE9yRmlsZTogcGFyYW1zLm9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgICBzaG91bGRFc2NhcGVBbGlhczogcGFyYW1zLnNob3VsZEVzY2FwZUFsaWFzLFxuICAgICAgc2hvdWxkSW5jbHVkZUF0dGFjaG1lbnRFeHRlbnNpb25Ub0VtYmVkQWxpYXM6IHBhcmFtcy5zaG91bGRJbmNsdWRlQXR0YWNobWVudEV4dGVuc2lvblRvRW1iZWRBbGlhcyxcbiAgICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM6IHBhcmFtcy5zaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzLFxuICAgICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0czogcGFyYW1zLnNob3VsZFVzZUFuZ2xlQnJhY2tldHMsXG4gICAgICBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRoczogcGFyYW1zLnNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzLFxuICAgICAgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRoczogcGFyYW1zLnNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHNcbiAgICB9KSlcbiAgICA6IHBhcmFtcy5saW5rLm9yaWdpbmFsO1xufVxuXG4vKipcbiAqIEVkaXRzIHRoZSBiYWNrbGlua3MgZm9yIGEgZmlsZSBvciBwYXRoLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZWRpdGluZyB0aGUgYmFja2xpbmtzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBiYWNrbGlua3MgaGF2ZSBiZWVuIGVkaXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVkaXRCYWNrbGlua3MocGFyYW1zOiBFZGl0QmFja2xpbmtzUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgbGlua0NvbnZlcnRlcixcbiAgICBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcixcbiAgICBwYXRoT3JGaWxlLFxuICAgIC4uLm9wdGlvbnNcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgYmFja2xpbmtzID0gYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUoeyBhcHAsIHBhdGhPckZpbGUsIC4uLm9wdGlvbnMgfSk7XG4gIGNvbnN0IHNuYXBzaG90ID0gYnVpbGRCYWNrbGlua3NTbmFwc2hvdDx1bmRlZmluZWQ+KHtcbiAgICBiYWNrbGlua3MsXG4gICAgcGF5bG9hZFByb3ZpZGVyOiBnZXRVbmRlZmluZWRQYXlsb2FkXG4gIH0pO1xuICBhd2FpdCBlZGl0QmFja2xpbmtzU25hcHNob3Qobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEVkaXRCYWNrbGlua3NTbmFwc2hvdFBhcmFtczx1bmRlZmluZWQ+Pih7XG4gICAgYXBwLFxuICAgIGxpbmtDb252ZXJ0ZXI6ICh7IGxpbmsgfSkgPT4gbGlua0NvbnZlcnRlcihsaW5rKSxcbiAgICBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcixcbiAgICBzbmFwc2hvdCxcbiAgICAuLi5vcHRpb25zXG4gIH0pKTtcbn1cblxuLyoqXG4gKiBFZGl0cyBhIGNhcHR1cmVkIHNuYXBzaG90IG9mIGJhY2tsaW5rcywgcmV3cml0aW5nIGVhY2ggYmFja2xpbmstaG9sZGluZyBub3RlIGV4YWN0bHkgb25jZS5cbiAqXG4gKiBUaGUgY291bnRlcnBhcnQgb2Yge0BsaW5rIGVkaXRCYWNrbGlua3N9IGZvciBjYWxsZXJzIHRoYXQgY2Fubm90IGZldGNoIHRoZSBiYWNrbGlua3MgYXQgcmV3cml0ZSB0aW1lIFx1MjAxNFxuICogYmVjYXVzZSB0aGUgcmVuYW1lIHRoYXQgaW52YWxpZGF0ZWQgdGhlbSBoYXMgYWxyZWFkeSBoYXBwZW5lZCBcdTIwMTQgb3IgdGhhdCByZXdyaXRlIGxpbmtzIHRvIHNldmVyYWwgdGFyZ2V0c1xuICogYXQgb25jZS4gU2VlIHtAbGluayBCYWNrbGlua3NTbmFwc2hvdH0gZm9yIGJvdGggY2FzZXMuXG4gKlxuICogQHR5cGVQYXJhbSBUUGF5bG9hZCAtIFRoZSBwYXlsb2FkIHJlY29yZGVkIGZvciBlYWNoIGxpbmsgd2hlbiB0aGUgc25hcHNob3Qgd2FzIGJ1aWx0LlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBlZGl0aW5nIHRoZSBiYWNrbGlua3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJhY2tsaW5rcyBoYXZlIGJlZW4gZWRpdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZWRpdEJhY2tsaW5rc1NuYXBzaG90PFRQYXlsb2FkPihwYXJhbXM6IEVkaXRCYWNrbGlua3NTbmFwc2hvdFBhcmFtczxUUGF5bG9hZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBsaW5rQ29udmVydGVyLFxuICAgIGxpbmtJZGVudGl0eUtleVByb3ZpZGVyOiBleHBsaWNpdExpbmtJZGVudGl0eUtleVByb3ZpZGVyLFxuICAgIGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyLFxuICAgIHNob3VsZFZpc2l0VW5tYXRjaGVkTGlua3MgPSBmYWxzZSxcbiAgICBzbmFwc2hvdCxcbiAgICAuLi5vcHRpb25zXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGxpbmtJZGVudGl0eUtleVByb3ZpZGVyID0gcmVzb2x2ZVNuYXBzaG90TGlua0lkZW50aXR5S2V5UHJvdmlkZXIoe1xuICAgIGNhbGxlck5hbWU6ICdlZGl0QmFja2xpbmtzU25hcHNob3QnLFxuICAgIGV4cGxpY2l0TGlua0lkZW50aXR5S2V5UHJvdmlkZXIsXG4gICAgc25hcHNob3RcbiAgfSk7XG5cbiAgY29uc3QgYmFja2xpbmtOb3RlUGF0aHMgPSBbLi4uc25hcHNob3Qua2V5cygpXTtcbiAgbGV0IHByb2Nlc3NlZCA9IDA7XG4gIGZvciAoY29uc3QgYmFja2xpbmtOb3RlUGF0aCBvZiBiYWNrbGlua05vdGVQYXRocykge1xuICAgIGNvbnN0IHBheWxvYWRzID0gZW5zdXJlTm9uTnVsbGFibGUoc25hcHNob3QuZ2V0KGJhY2tsaW5rTm90ZVBhdGgpKTtcbiAgICBhd2FpdCBlZGl0TGlua3Moe1xuICAgICAgYXBwLFxuICAgICAgbGlua0NvbnZlcnRlcjogKGxpbmspID0+IHtcbiAgICAgICAgY29uc3QgbGlua0lkZW50aXR5S2V5ID0gbGlua0lkZW50aXR5S2V5UHJvdmlkZXIobGluayk7XG4gICAgICAgIHJldHVybiAhcGF5bG9hZHMuaGFzKGxpbmtJZGVudGl0eUtleSkgJiYgIXNob3VsZFZpc2l0VW5tYXRjaGVkTGlua3NcbiAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgIDogbGlua0NvbnZlcnRlcih7XG4gICAgICAgICAgICBsaW5rLFxuICAgICAgICAgICAgcGF5bG9hZDogcGF5bG9hZHMuZ2V0KGxpbmtJZGVudGl0eUtleSksXG4gICAgICAgICAgICBzb3VyY2VQYXRoOiBiYWNrbGlua05vdGVQYXRoXG4gICAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgcGF0aE9yRmlsZTogYmFja2xpbmtOb3RlUGF0aCxcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9KTtcbiAgICBwcm9jZXNzZWQrKztcbiAgICBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcj8uKHtcbiAgICAgIGN1cnJlbnRQYXRoOiBiYWNrbGlua05vdGVQYXRoLFxuICAgICAgcHJvY2Vzc2VkLFxuICAgICAgdG90YWw6IGJhY2tsaW5rTm90ZVBhdGhzLmxlbmd0aFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogRWRpdHMgdGhlIGxpbmtzIGZvciBhIGZpbGUgb3IgcGF0aC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGVkaXRpbmcgdGhlIGxpbmtzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBsaW5rcyBoYXZlIGJlZW4gZWRpdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZWRpdExpbmtzKHBhcmFtczogRWRpdExpbmtzUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgbGlua0NvbnZlcnRlcixcbiAgICBvZmZzZXRSYW5nZSxcbiAgICBwYXRoT3JGaWxlLFxuICAgIHNob3VsZEVkaXRFeHRlcm5hbExpbmtzID0gZmFsc2UsXG4gICAgc2hvdWxkRWRpdEZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9IGZhbHNlLFxuICAgIHNob3VsZEVkaXRNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzID0gZmFsc2UsXG4gICAgLi4ub3B0aW9uc1xuICB9ID0gcGFyYW1zO1xuXG4gIGlmIChvZmZzZXRSYW5nZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFsaWRhdGVPZmZzZXRSYW5nZShvZmZzZXRSYW5nZSk7XG4gIH1cblxuICBhd2FpdCBhcHBseUZpbGVDaGFuZ2VzKHtcbiAgICBhcHAsXG4gICAgY2hhbmdlc1Byb3ZpZGVyOiBhc3luYyAoeyBhYm9ydFNpZ25hbCwgY29udGVudCB9KSA9PiB7XG4gICAgICBjb25zdCBjYWNoZSA9IGF3YWl0IGdldENhY2hlU2FmZShhcHAsIHBhdGhPckZpbGUsIHtcbiAgICAgICAgc2hvdWxkUGFyc2VFeHRlcm5hbExpbmtzOiBzaG91bGRFZGl0RXh0ZXJuYWxMaW5rcyxcbiAgICAgICAgc2hvdWxkUGFyc2VGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHNob3VsZEVkaXRGcm9udG1hdHRlckV4dGVybmFsTGlua3MsXG4gICAgICAgIHNob3VsZFBhcnNlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdE11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3NcbiAgICAgIH0pO1xuICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIGNvbnN0IGZpbGUgPSBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlIH0pO1xuICAgICAgY29uc3QgY2FjaGVkQ29udGVudCA9IGF3YWl0IGFwcC52YXVsdC5jYWNoZWRSZWFkKGZpbGUpO1xuICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIHJldHVybiBjb250ZW50ID09PSBjYWNoZWRDb250ZW50XG4gICAgICAgID8gKGF3YWl0IGdldEZpbGVDaGFuZ2VzKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxHZXRGaWxlQ2hhbmdlc1BhcmFtcz4oe1xuICAgICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICAgIGNhY2hlLFxuICAgICAgICAgIGlzQ2FudmFzRmlsZUNhY2hlOiBpc0NhbnZhc0ZpbGUocGF0aE9yRmlsZSksXG4gICAgICAgICAgbGlua0NvbnZlcnRlcixcbiAgICAgICAgICBvZmZzZXRSYW5nZSxcbiAgICAgICAgICBzaG91bGRJbmNsdWRlRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdEV4dGVybmFsTGlua3MsXG4gICAgICAgICAgc2hvdWxkSW5jbHVkZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdEZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyxcbiAgICAgICAgICBzaG91bGRJbmNsdWRlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdE11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3NcbiAgICAgICAgfSkpKVxuICAgICAgICA6IG51bGw7XG4gICAgfSxcbiAgICBwYXRoT3JGaWxlLFxuICAgIC4uLm9wdGlvbnNcbiAgfSk7XG59XG5cbi8qKlxuICogRWRpdHMgdGhlIGxpbmtzIGluIGEgY29udGVudCBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBlZGl0aW5nIHRoZSBsaW5rcyBpbiB0aGUgY29udGVudC5cbiAqIEByZXR1cm5zIFRoZSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHVwZGF0ZWQgY29udGVudC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVkaXRMaW5rc0luQ29udGVudChwYXJhbXM6IEVkaXRMaW5rc0luQ29udGVudFBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgYXBwLCBjb250ZW50LCBsaW5rQ29udmVydGVyLCBvZmZzZXRSYW5nZSwgc2hvdWxkRWRpdEV4dGVybmFsTGlua3MgPSBmYWxzZSwgc2hvdWxkRWRpdEZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9IGZhbHNlLCBzaG91bGRFZGl0TXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9IGZhbHNlIH0gPSBwYXJhbXM7XG4gIGxldCB7IGFib3J0U2lnbmFsIH0gPSBwYXJhbXM7XG4gIGFib3J0U2lnbmFsID8/PSBhYm9ydFNpZ25hbE5ldmVyKCk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgaWYgKG9mZnNldFJhbmdlICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YWxpZGF0ZU9mZnNldFJhbmdlKG9mZnNldFJhbmdlKTtcbiAgfVxuXG4gIGNvbnN0IG5ld0NvbnRlbnQgPSBhd2FpdCBhcHBseUNvbnRlbnRDaGFuZ2VzKHtcbiAgICBhYm9ydFNpZ25hbCxcbiAgICBjaGFuZ2VzUHJvdmlkZXI6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNhY2hlID0gYXdhaXQgcGFyc2VNZXRhZGF0YShhcHAsIGNvbnRlbnQsIHtcbiAgICAgICAgc2hvdWxkUGFyc2VFeHRlcm5hbExpbmtzOiBzaG91bGRFZGl0RXh0ZXJuYWxMaW5rcyxcbiAgICAgICAgc2hvdWxkUGFyc2VGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHNob3VsZEVkaXRGcm9udG1hdHRlckV4dGVybmFsTGlua3MsXG4gICAgICAgIHNob3VsZFBhcnNlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdE11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3NcbiAgICAgIH0pO1xuICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIGNvbnN0IGNoYW5nZXMgPSBhd2FpdCBnZXRGaWxlQ2hhbmdlcyhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8R2V0RmlsZUNoYW5nZXNQYXJhbXM+KHtcbiAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgIGNhY2hlLFxuICAgICAgICBpc0NhbnZhc0ZpbGVDYWNoZTogZmFsc2UsXG4gICAgICAgIGxpbmtDb252ZXJ0ZXIsXG4gICAgICAgIG9mZnNldFJhbmdlLFxuICAgICAgICBzaG91bGRJbmNsdWRlRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdEV4dGVybmFsTGlua3MsXG4gICAgICAgIHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHNob3VsZEVkaXRGcm9udG1hdHRlckV4dGVybmFsTGlua3MsXG4gICAgICAgIHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiBzaG91bGRFZGl0TXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rc1xuICAgICAgfSkpO1xuICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIHJldHVybiBjaGFuZ2VzO1xuICAgIH0sXG4gICAgY29udGVudCxcbiAgICBwYXRoOiAnJ1xuICB9KTtcbiAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICBhc3NlcnROb25OdWxsYWJsZShuZXdDb250ZW50LCAnRmFpbGVkIHRvIHVwZGF0ZSBsaW5rcyBpbiBjb250ZW50Jyk7XG5cbiAgcmV0dXJuIG5ld0NvbnRlbnQ7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIGEgbGluay5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGV4dHJhY3RpbmcgdGhlIGxpbmsgZmlsZS5cbiAqIEByZXR1cm5zIFRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluaywgb3IgYG51bGxgIGlmIG5vdCBmb3VuZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RMaW5rRmlsZShwYXJhbXM6IEV4dHJhY3RMaW5rRmlsZVBhcmFtcyk6IG51bGwgfCBURmlsZSB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgbGluayxcbiAgICBzaG91bGRBbGxvd05vbkV4aXN0aW5nRmlsZSA9IGZhbHNlLFxuICAgIHNvdXJjZVBhdGhPckZpbGVcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgeyBsaW5rUGF0aCB9ID0gc3BsaXRTdWJwYXRoKGxpbmsubGluayk7XG4gIGNvbnN0IHNvdXJjZVBhdGggPSBnZXRQYXRoKGFwcCwgc291cmNlUGF0aE9yRmlsZSk7XG4gIGNvbnN0IGZpbGUgPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChsaW5rUGF0aCwgc291cmNlUGF0aCk7XG4gIGlmIChmaWxlKSB7XG4gICAgcmV0dXJuIGZpbGU7XG4gIH1cblxuICBpZiAoIXNob3VsZEFsbG93Tm9uRXhpc3RpbmdGaWxlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAobGlua1BhdGguc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgcmV0dXJuIGdldEZpbGUoeyBhcHAsIHBhdGhPckZpbGU6IGxpbmtQYXRoLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG4gIH1cblxuICBjb25zdCBmdWxsTGlua1BhdGggPSBqb2luKGRpcm5hbWUoc291cmNlUGF0aCksIGAuLyR7bGlua1BhdGh9YCk7XG5cbiAgcmV0dXJuIGZ1bGxMaW5rUGF0aC5zdGFydHNXaXRoKCcuLi8nKSA/IG51bGwgOiBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlOiBmdWxsTGlua1BhdGgsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogdHJ1ZSB9KTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBtYXJrZG93biBsaW5rIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZ2VuZXJhdGluZyB0aGUgbWFya2Rvd24gbGluay5cbiAqIEByZXR1cm5zIFRoZSBnZW5lcmF0ZWQgbWFya2Rvd24gbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlTWFya2Rvd25MaW5rKHBhcmFtczogR2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGFwcCB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IERFRkFVTFRfUEFSQU1TOiBQYXJ0aWFsPEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zPiA9IHtcbiAgICBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQ6IHRydWVcbiAgfTtcblxuICBjb25zdCBjdXN0b21EZWZhdWx0UGFyYW1zID0gZ2V0R2VuZXJhdGVNYXJrZG93bkxpbmtEZWZhdWx0UGFyYW1zRm5zKCkubWFwKChkZWZhdWx0UGFyYW1zRnVuY3Rpb24pID0+IGRlZmF1bHRQYXJhbXNGdW5jdGlvbigpKTtcbiAgLy8gU3RyaXAgZXhwbGljaXQgYHVuZGVmaW5lZGBzIGZpcnN0LCBvbiBhIGNvcHkgc28gdGhlIGNhbGxlcidzIG9iamVjdCBpcyB1bnRvdWNoZWQuXG4gIC8vIEEgY2FsbGVyIGZvcndhcmRpbmcgZXZlcnkgb3B0aW9uYWwgcGFyYW0gc2VuZHMgb3duIGtleXMgaG9sZGluZyBgdW5kZWZpbmVkYCBmb3IgdGhlIG9uZXMgaXQgZGlkIG5vdCByZWNlaXZlLlxuICAvLyBUaG9zZSBhcmUgbm90IHJlbW92ZWQgYnkgYG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllc2AsIHdoaWNoIGlzIGEgdHlwZS1sZXZlbCBuby1vcC5cbiAgLy8gV2l0aG91dCB0aGUgc3RyaXAsIHN1Y2ggYSBrZXkgb3ZlcndyaXRlcyBhIGRlZmF1bHQgd2l0aCBgdW5kZWZpbmVkYCBpbnN0ZWFkIG9mIGZhbGxpbmcgdGhyb3VnaCB0byBpdC5cbiAgcGFyYW1zID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9QQVJBTVMsIC4uLmN1c3RvbURlZmF1bHRQYXJhbXMsIHJlbW92ZVVuZGVmaW5lZFByb3BlcnRpZXM8R2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXM+KHsgLi4ucGFyYW1zIH0pKTtcbiAgY29uc3QgdGFyZ2V0RmlsZSA9IGdldEZpbGUobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEdldEZpbGVQYXJhbXM+KHsgYXBwLCBwYXRoT3JGaWxlOiBwYXJhbXMudGFyZ2V0UGF0aE9yRmlsZSwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiBwYXJhbXMuaXNOb25FeGlzdGluZ0ZpbGVBbGxvd2VkIH0pKTtcblxuICB1c2luZyBfcmVnaXN0cmF0aW9uID0gcmVnaXN0ZXJGaWxlcyhhcHAsIFt0YXJnZXRGaWxlXSk7XG4gIHJldHVybiBnZW5lcmF0ZU1hcmtkb3duTGlua0ltcGwocGFyYW1zKTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSByYXcgbWFya2Rvd24gbGluayBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGFyYW1zLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZ2VuZXJhdGluZyBhIHJhdyBtYXJrZG93biBsaW5rLlxuICogQHJldHVybnMgQSByYXcgbWFya2Rvd24gbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlUmF3TWFya2Rvd25MaW5rKHBhcmFtczogR2VuZXJhdGVSYXdNYXJrZG93bkxpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCBlbWJlZFByZWZpeCA9IHBhcmFtcy5pc0VtYmVkID8gJyEnIDogJyc7XG5cbiAgaWYgKHBhcmFtcy5pc1dpa2lsaW5rKSB7XG4gICAgY29uc3QgYWxpYXNQYXJ0ID0gcGFyYW1zLmFsaWFzID8gYHwke3BhcmFtcy5hbGlhc31gIDogJyc7XG4gICAgcmV0dXJuIGAke2VtYmVkUHJlZml4fVtbJHtwYXJhbXMudXJsfSR7YWxpYXNQYXJ0fV1dYDtcbiAgfVxuXG4gIGNvbnN0IGFsaWFzID0gcGFyYW1zLmFsaWFzID8/ICcnO1xuICBjb25zdCBzaG91bGRFc2NhcGVBbGlhcyA9IHBhcmFtcy5zaG91bGRFc2NhcGVBbGlhcyA/PyBmYWxzZTtcbiAgY29uc3QgZXNjYXBlZEFsaWFzID0gc2hvdWxkRXNjYXBlQWxpYXMgPyBlc2NhcGVBbGlhcyhhbGlhcykgOiBhbGlhcztcblxuICBjb25zdCB1cmwgPSBwYXJhbXMuc2hvdWxkVXNlQW5nbGVCcmFja2V0c1xuICAgID8gYDwke3BhcmFtcy51cmx9PmBcbiAgICA6IGVuY29kZVVybChwYXJhbXMudXJsKTtcblxuICBjb25zdCB0aXRsZVBhcnQgPSBwYXJhbXMudGl0bGUgPyBgICR7SlNPTi5zdHJpbmdpZnkocGFyYW1zLnRpdGxlKX1gIDogJyc7XG5cbiAgcmV0dXJuIGAke2VtYmVkUHJlZml4fVske2VzY2FwZWRBbGlhc31dKCR7dXJsfSR7dGl0bGVQYXJ0fSlgO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHNoYXJlZCwgbXV0YWJsZSBsaXN0IG9mIGZ1bmN0aW9ucyB0aGF0IHByb3ZpZGUgZGVmYXVsdCBwYXJhbXMgZm9yIHtAbGluayBnZW5lcmF0ZU1hcmtkb3duTGlua30uXG4gKlxuICogRWFjaCBmdW5jdGlvbiBpcyBpbnZva2VkIG9uIGV2ZXJ5IHtAbGluayBnZW5lcmF0ZU1hcmtkb3duTGlua30gY2FsbCBhbmQgaXRzIHJlc3VsdCBpcyBtZXJnZWQgaW50byB0aGUgcGFyYW1zIChsYXRlclxuICogcmVnaXN0cmF0aW9ucyB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGUgYnVpbHQtaW4gZGVmYXVsdHMsIGJ1dCBuZXZlciBvdmVyIGV4cGxpY2l0bHkgcGFzc2VkIHBhcmFtcykuIFJlZ2lzdGVyIGVudHJpZXNcbiAqIGJ5IGFkZGluZyBhIGBHZW5lcmF0ZU1hcmtkb3duTGlua0RlZmF1bHRQYXJhbXNDb21wb25lbnRgIHRvIGEgY29tcG9uZW50IHRyZWUgcmF0aGVyIHRoYW4gbXV0YXRpbmcgdGhpcyBsaXN0IGRpcmVjdGx5LlxuICpcbiAqIEByZXR1cm5zIFRoZSBtdXRhYmxlIGxpc3Qgb2YgZGVmYXVsdC1wYXJhbXMgZnVuY3Rpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2VuZXJhdGVNYXJrZG93bkxpbmtEZWZhdWx0UGFyYW1zRm5zKCk6ICgoKSA9PiBQYXJ0aWFsPEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zPilbXSB7XG4gIHJldHVybiBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGU8KCgpID0+IFBhcnRpYWw8R2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXM+KVtdPignZ2VuZXJhdGVNYXJrZG93bkxpbmtEZWZhdWx0UGFyYW1zRm5zJywgW10pLnZhbHVlO1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBsaW5rIHVzZXMgYW5nbGUgYnJhY2tldHMsIHBvc3NpYmx5IGVtYmVkOlxuICogYFt0aXRsZV0oPGxpbms+KWAsIGAhW3RpdGxlXSg8bGluaz4pYC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIExpbmsgdG8gdGVzdFxuICogQHJldHVybnMgV2hldGhlciB0aGUgbGluayB1c2VzIGFuZ2xlIGJyYWNrZXRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNBbmdsZUJyYWNrZXRzKGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsobGluayk7XG4gIHJldHVybiBwYXJzZUxpbmtSZXN1bHQ/Lmhhc0FuZ2xlQnJhY2tldHMgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIGxpbmsgaXMgYW4gZW1iZWQgbGluazpcbiAqIGAhW1tsaW5rXV1gLCBgIVt0aXRsZV0obGluaylgLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIGlzIGFuIGVtYmVkIGxpbmtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0VtYmVkU3ludGF4KGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsobGluayk7XG4gIHJldHVybiBwYXJzZUxpbmtSZXN1bHQ/LmlzRW1iZWQgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIGxpbmsgaGFzIGEgbGVhZGluZyBkb3QsIHBvc3NpYmx5IGVtYmVkOlxuICogYFtbLi9saW5rXV1gLCBgW3RpdGxlXSguL2xpbmspYCwgYFt0aXRsZV0oPC4vbGluaz4pYCxcbiAqIGAhW1suL2xpbmtdXWAsIGAhW3RpdGxlXSguL2xpbmspYCwgYCFbdGl0bGVdKDwuL2xpbms+KWAuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBMaW5rIHRvIHRlc3RcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGxpbmsgaGFzIGEgbGVhZGluZyBkb3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0xlYWRpbmdEb3QobGluazogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayhsaW5rKTtcbiAgcmV0dXJuIHBhcnNlTGlua1Jlc3VsdD8udXJsLnN0YXJ0c1dpdGgoJy4vJykgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIGxpbmsgaGFzIGEgbGVhZGluZyBzbGFzaCwgcG9zc2libHkgZW1iZWQ6XG4gKiBgW1svbGlua11dYCwgYFt0aXRsZV0oL2xpbmspYCwgYFt0aXRsZV0oPC9saW5rPilgLFxuICogYCFbWy9saW5rXV1gLCBgIVt0aXRsZV0oL2xpbmspYCwgYCFbdGl0bGVdKDwvbGluaz4pYC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIExpbmsgdG8gdGVzdFxuICogQHJldHVybnMgV2hldGhlciB0aGUgbGluayBoYXMgYSBsZWFkaW5nIHNsYXNoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNMZWFkaW5nU2xhc2gobGluazogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayhsaW5rKTtcbiAgcmV0dXJuIHBhcnNlTGlua1Jlc3VsdD8udXJsLnN0YXJ0c1dpdGgoJy8nKSA/PyBmYWxzZTtcbn1cblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIGEgbGluayBpcyBhIHdpa2lsaW5rLCBwb3NzaWJseSBlbWJlZDpcbiAqIGBbW2xpbmtdXWAsIGAhW1tsaW5rXV1gLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIGlzIGEgd2lraWxpbmtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1dpa2lsaW5rU3ludGF4KGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsobGluayk7XG4gIHJldHVybiBwYXJzZUxpbmtSZXN1bHQ/LmlzV2lraWxpbmsgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgYWxpYXMgb2YgYSBsaW5rIHNob3VsZCBiZSByZXNldC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGRldGVybWluaW5nIGlmIHRoZSBhbGlhcyBzaG91bGQgYmUgcmVzZXQuXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBhbGlhcyBzaG91bGQgYmUgcmVzZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRSZXNldEFsaWFzKHBhcmFtczogU2hvdWxkUmVzZXRBbGlhc1BhcmFtcyk6IGJvb2xlYW4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGRpc3BsYXlUZXh0LFxuICAgIGlzV2lraWxpbmssXG4gICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG9sZFRhcmdldFBhdGgsXG4gICAgdGFyZ2V0UGF0aE9yRmlsZVxuICB9ID0gcGFyYW1zO1xuICBpZiAoaXNXaWtpbGluayA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWRpc3BsYXlUZXh0KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCB0YXJnZXRGaWxlID0gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZTogdGFyZ2V0UGF0aE9yRmlsZSwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICBjb25zdCBuZXdTb3VyY2VQYXRoID0gZ2V0UGF0aChhcHAsIG5ld1NvdXJjZVBhdGhPckZpbGUpO1xuICBjb25zdCBvbGRTb3VyY2VQYXRoID0gZ2V0UGF0aChhcHAsIG9sZFNvdXJjZVBhdGhPckZpbGUgPz8gbmV3U291cmNlUGF0aE9yRmlsZSk7XG4gIGNvbnN0IG5ld1NvdXJjZUZvbGRlciA9IGRpcm5hbWUobmV3U291cmNlUGF0aCk7XG4gIGNvbnN0IG9sZFNvdXJjZUZvbGRlciA9IGRpcm5hbWUob2xkU291cmNlUGF0aCk7XG4gIGNvbnN0IGFsaWFzZXNUb1Jlc2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgZm9yIChjb25zdCBwYXRoT3JGaWxlIG9mIFt0YXJnZXRGaWxlLnBhdGgsIG9sZFRhcmdldFBhdGhdKSB7XG4gICAgaWYgKCFwYXRoT3JGaWxlKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpO1xuICAgIGFsaWFzZXNUb1Jlc2V0LmFkZChwYXRoKTtcbiAgICBhbGlhc2VzVG9SZXNldC5hZGQoYmFzZW5hbWUocGF0aCkpO1xuICAgIGFsaWFzZXNUb1Jlc2V0LmFkZChyZWxhdGl2ZShuZXdTb3VyY2VGb2xkZXIsIHBhdGgpKTtcbiAgICBhbGlhc2VzVG9SZXNldC5hZGQocmVsYXRpdmUob2xkU291cmNlRm9sZGVyLCBwYXRoKSk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHNvdXJjZVBhdGggb2YgW29sZFNvdXJjZVBhdGgsIG5ld1NvdXJjZVBhdGhdKSB7XG4gICAgYWxpYXNlc1RvUmVzZXQuYWRkKGFwcC5tZXRhZGF0YUNhY2hlLmZpbGVUb0xpbmt0ZXh0KHRhcmdldEZpbGUsIHNvdXJjZVBhdGgsIGZhbHNlKSk7XG4gIH1cblxuICBjb25zdCBjbGVhbkRpc3BsYXlUZXh0ID0gcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZzogbm9ybWFsaXplUGF0aChlbnN1cmVOb25OdWxsYWJsZShkaXNwbGF5VGV4dC5zcGxpdCgnID4gJywgMSlbMF0pKSxcbiAgICByZXBsYWNlcjogJycsXG4gICAgc2VhcmNoVmFsdWU6IC9eXFwuXFwvL2dcbiAgfSkudG9Mb3dlckNhc2UoKTtcblxuICBmb3IgKGNvbnN0IGFsaWFzIG9mIGFsaWFzZXNUb1Jlc2V0KSB7XG4gICAgaWYgKGFsaWFzLnRvTG93ZXJDYXNlKCkgPT09IGNsZWFuRGlzcGxheVRleHQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGZvbGRlciA9IGRpcm5hbWUoYWxpYXMpO1xuICAgIGNvbnN0IGJhc2UgPSBiYXNlbmFtZShhbGlhcywgZXh0bmFtZShhbGlhcykpO1xuICAgIGlmIChqb2luKGZvbGRlciwgYmFzZSkudG9Mb3dlckNhc2UoKSA9PT0gY2xlYW5EaXNwbGF5VGV4dCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFNwbGl0cyBhIGxpbmsgaW50byBpdHMgbGluayBwYXRoIGFuZCBzdWJwYXRoLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gVGhlIGxpbmsgdG8gc3BsaXQuXG4gKiBAcmV0dXJucyBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgbGluayBwYXRoIGFuZCBzdWJwYXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRTdWJwYXRoKGxpbms6IHN0cmluZyk6IFNwbGl0U3VicGF0aFJlc3VsdCB7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlTGlua3RleHQobm9ybWFsaXplU3RyaW5nKGxpbmspKTtcbiAgcmV0dXJuIHtcbiAgICBsaW5rUGF0aDogcGFyc2VkLnBhdGgsXG4gICAgc3VicGF0aDogcGFyc2VkLnN1YnBhdGhcbiAgfTtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIHRoZSBgZmlsZTovL2AgbGlua3MgaW4gYSBjb250ZW50IHN0cmluZyB0byBhIHByZXR0eSBmb3JtLCBjb252ZXJ0aW5nIGJhY2tzbGFzaGVzIHRvIGZvcndhcmRcbiAqIHNsYXNoZXMuIE90aGVyIGxpbmtzIGFyZSBsZWZ0IHVuY2hhbmdlZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIG5vcm1hbGl6aW5nIHRoZSBsaW5rcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNvbnRlbnQgd2l0aCBub3JtYWxpemVkIGBmaWxlOi8vYCBsaW5rcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUZpbGVVcmxMaW5rc0luQ29udGVudChwYXJhbXM6IFVwZGF0ZUZpbGVVcmxMaW5rc0luQ29udGVudFBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgYXBwLCBjb250ZW50LCBvZmZzZXRSYW5nZSwgc2hvdWxkVXNlQW5nbGVCcmFja2V0cyA9IGZhbHNlIH0gPSBwYXJhbXM7XG4gIHJldHVybiBhd2FpdCBlZGl0TGlua3NJbkNvbnRlbnQobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEVkaXRMaW5rc0luQ29udGVudFBhcmFtcz4oe1xuICAgIGFib3J0U2lnbmFsOiBwYXJhbXMuYWJvcnRTaWduYWwsXG4gICAgYXBwLFxuICAgIGNvbnRlbnQsXG4gICAgbGlua0NvbnZlcnRlcjogKGxpbmspID0+IG5vcm1hbGl6ZUZpbGVVcmxMaW5rKGxpbmssIHNob3VsZFVzZUFuZ2xlQnJhY2tldHMpLFxuICAgIG9mZnNldFJhbmdlLFxuICAgIHNob3VsZEVkaXRFeHRlcm5hbExpbmtzOiB0cnVlLFxuICAgIHNob3VsZEVkaXRGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHRydWUsXG4gICAgc2hvdWxkRWRpdE11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHRydWVcbiAgfSkpO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgdGhlIGBmaWxlOi8vYCBsaW5rcyBpbiBhIGZpbGUgdG8gYSBwcmV0dHkgZm9ybSwgY29udmVydGluZyBiYWNrc2xhc2hlcyB0byBmb3J3YXJkIHNsYXNoZXMuXG4gKiBPdGhlciBsaW5rcyBhcmUgbGVmdCB1bmNoYW5nZWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBub3JtYWxpemluZyB0aGUgbGlua3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGxpbmtzIGFyZSBub3JtYWxpemVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlRmlsZVVybExpbmtzSW5GaWxlKHBhcmFtczogVXBkYXRlRmlsZVVybExpbmtzSW5GaWxlUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgb2Zmc2V0UmFuZ2UsXG4gICAgcGF0aE9yRmlsZSxcbiAgICBzaG91bGRVc2VBbmdsZUJyYWNrZXRzID0gZmFsc2UsXG4gICAgLi4ub3B0aW9uc1xuICB9ID0gcGFyYW1zO1xuICBhd2FpdCBlZGl0TGlua3Mobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEVkaXRMaW5rc1BhcmFtcz4oe1xuICAgIGFwcCxcbiAgICBsaW5rQ29udmVydGVyOiAobGluaykgPT4gbm9ybWFsaXplRmlsZVVybExpbmsobGluaywgc2hvdWxkVXNlQW5nbGVCcmFja2V0cyksXG4gICAgLy8gRm9yd2FyZGVkIGJ5IG5hbWUgcmF0aGVyIHRoYW4gdGhyb3VnaCBgb3B0aW9uc2AsIHNvIGEgbGF0ZXIgcmVmYWN0b3IgY2Fubm90IGRyb3AgaXQgc2lsZW50bHkuXG4gICAgb2Zmc2V0UmFuZ2UsXG4gICAgcGF0aE9yRmlsZSxcbiAgICBzaG91bGRFZGl0RXh0ZXJuYWxMaW5rczogdHJ1ZSxcbiAgICBzaG91bGRFZGl0RnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiB0cnVlLFxuICAgIHNob3VsZEVkaXRNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiB0cnVlLFxuICAgIC4uLm9wdGlvbnNcbiAgfSkpO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgYSBsaW5rIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdXBkYXRpbmcgdGhlIGxpbmsuXG4gKiBAcmV0dXJucyBUaGUgdXBkYXRlZCBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlTGluayhwYXJhbXM6IFVwZGF0ZUxpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZCxcbiAgICBsaW5rLFxuICAgIGxpbmtQYXRoU3R5bGUsXG4gICAgbGlua1N0eWxlLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgbmV3VGFyZ2V0UGF0aE9yRmlsZSxcbiAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG9sZFRhcmdldFBhdGhPckZpbGUsXG4gICAgc2hvdWxkRXNjYXBlQWxpYXMsXG4gICAgc2hvdWxkSW5jbHVkZUF0dGFjaG1lbnRFeHRlbnNpb25Ub0VtYmVkQWxpYXMsXG4gICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcyA9IHRydWUsXG4gICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0cyxcbiAgICBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRocyxcbiAgICBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzXG4gIH0gPSBwYXJhbXM7XG4gIGlmICghbmV3VGFyZ2V0UGF0aE9yRmlsZSkge1xuICAgIHJldHVybiBsaW5rLm9yaWdpbmFsO1xuICB9XG4gIGNvbnN0IG5ld1RhcmdldEZpbGUgPSBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlOiBuZXdUYXJnZXRQYXRoT3JGaWxlLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG4gIGNvbnN0IG9sZFNvdXJjZVBhdGggPSBnZXRQYXRoKGFwcCwgb2xkU291cmNlUGF0aE9yRmlsZSA/PyBuZXdTb3VyY2VQYXRoT3JGaWxlKTtcbiAgY29uc3Qgb2xkVGFyZ2V0UGF0aCA9IGdldFBhdGgoYXBwLCBvbGRUYXJnZXRQYXRoT3JGaWxlID8/IG5ld1RhcmdldFBhdGhPckZpbGUpO1xuICBjb25zdCBpc1dpa2lsaW5rID0gc2hvdWxkVXNlV2lraWxpbmtTdHlsZShub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8U2hvdWxkVXNlV2lraWxpbmtTdHlsZVBhcmFtcz4oe1xuICAgIGFwcCxcbiAgICBsaW5rU3R5bGUsXG4gICAgb3JpZ2luYWxMaW5rOiBsaW5rLm9yaWdpbmFsXG4gIH0pKTtcblxuICBjb25zdCB7IHN1YnBhdGggfSA9IHNwbGl0U3VicGF0aChsaW5rLmxpbmspO1xuXG4gIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBDYW52YXMgZmlsZSBub2RlIHJlZmVyZW5jZSBicmFuY2ggaXMgaGFyZCB0byByZXByb2R1Y2UgaW4gdW5pdCB0ZXN0cy4gKi9cbiAgaWYgKGlzQ2FudmFzRmlsZShuZXdTb3VyY2VQYXRoT3JGaWxlKSAmJiBpc0NhbnZhc0ZpbGVOb2RlUmVmZXJlbmNlKGxpbmspKSB7XG4gICAgcmV0dXJuIG5ld1RhcmdldEZpbGUucGF0aCArIHN1YnBhdGg7XG5cbiAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICB9XG5cbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmsub3JpZ2luYWwpO1xuICBsZXQgYWxpYXM6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBpZiAoaXNXaWtpbGluayAmJiBwYXJzZUxpbmtSZXN1bHQ/LmFsaWFzKSB7XG4gICAgYWxpYXMgPSBwYXJzZUxpbmtSZXN1bHQuYWxpYXM7XG4gIH1cblxuICBhbGlhcyA/Pz0gc2hvdWxkUmVzZXRBbGlhcyhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8U2hvdWxkUmVzZXRBbGlhc1BhcmFtcz4oe1xuICAgICAgYXBwLFxuICAgICAgZGlzcGxheVRleHQ6IGxpbmsuZGlzcGxheVRleHQsXG4gICAgICBpc1dpa2lsaW5rLFxuICAgICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICAgIG9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgICBvbGRUYXJnZXRQYXRoLFxuICAgICAgdGFyZ2V0UGF0aE9yRmlsZTogbmV3VGFyZ2V0RmlsZVxuICAgIH0pKVxuICAgID8gdW5kZWZpbmVkXG4gICAgOiBwYXJzZUxpbmtSZXN1bHQ/LmFsaWFzO1xuXG4gIC8vIFJlZnJlc2ggYSBmaWxlLW5hbWUgYWxpYXMgdG8gdGhlIG5ldyBiYXNlIG5hbWUgd2hlbiB0aGUgZmxhZyBpcyBzZXQuXG4gIC8vIEEgZmlsZS1uYW1lIGFsaWFzIGVxdWFscyB0aGUgT0xEIGJhc2UgbmFtZSAod2l0aCBvciB3aXRob3V0IGV4dGVuc2lvbik7IGEgY3VzdG9tIGFsaWFzIGlzIGtlcHQuXG4gIC8vIEdhdGluZyBvbiB0aGUgZmxhZyBhbHNvIHJlZnJlc2hlcyB3aWtpbGlua3MgdGhhdCBjYXJyeSBhbiBleHBsaWNpdCBhbGlhcy5cbiAgLy8gVGhvc2UgcHJldmlvdXNseSBzaG9ydC1jaXJjdWl0ZWQgdGhlIHJlZnJlc2ggYW5kIGtlcHQgdGhlIHN0YWxlIG9sZCBiYXNlIG5hbWUuXG4gIGlmIChzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzKSB7XG4gICAgaWYgKGFsaWFzID09PSBiYXNlbmFtZShvbGRUYXJnZXRQYXRoLCBleHRuYW1lKG9sZFRhcmdldFBhdGgpKSkge1xuICAgICAgYWxpYXMgPSBuZXdUYXJnZXRGaWxlLmJhc2VuYW1lO1xuICAgIH0gZWxzZSBpZiAoYWxpYXMgPT09IGJhc2VuYW1lKG9sZFRhcmdldFBhdGgpKSB7XG4gICAgICBhbGlhcyA9IG5ld1RhcmdldEZpbGUubmFtZTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBuZXdMaW5rID0gZ2VuZXJhdGVNYXJrZG93bkxpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zPih7XG4gICAgYWxpYXMsXG4gICAgYXBwLFxuICAgIGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZCxcbiAgICBpc1NpbmdsZVN1YnBhdGhBbGxvd2VkOiBvbGRTb3VyY2VQYXRoID09PSBvbGRUYXJnZXRQYXRoICYmICEhcGFyc2VMaW5rUmVzdWx0Py5hbGlhcyxcbiAgICBsaW5rUGF0aFN0eWxlLFxuICAgIGxpbmtTdHlsZSxcbiAgICBvcmlnaW5hbExpbms6IGxpbmsub3JpZ2luYWwsXG4gICAgc2hvdWxkRXNjYXBlQWxpYXMsXG4gICAgc2hvdWxkSW5jbHVkZUF0dGFjaG1lbnRFeHRlbnNpb25Ub0VtYmVkQWxpYXMsXG4gICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0cyxcbiAgICBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRocyxcbiAgICBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzLFxuICAgIHNvdXJjZVBhdGhPckZpbGU6IG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgc3VicGF0aCxcbiAgICB0YXJnZXRQYXRoT3JGaWxlOiBuZXdUYXJnZXRGaWxlXG4gIH0pKTtcbiAgcmV0dXJuIG5ld0xpbms7XG59XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgbGlua3MgaW4gYSBjb250ZW50IHN0cmluZyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHVwZGF0aW5nIHRoZSBsaW5rcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNvbnRlbnQgd2l0aCB1cGRhdGVkIGxpbmtzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlTGlua3NJbkNvbnRlbnQocGFyYW1zOiBVcGRhdGVMaW5rc0luQ29udGVudFBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgY29udGVudCxcbiAgICBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQsXG4gICAgbGlua1BhdGhTdHlsZSxcbiAgICBsaW5rU3R5bGUsXG4gICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICBvZmZzZXRSYW5nZSxcbiAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgIHNob3VsZEVzY2FwZUFsaWFzLFxuICAgIHNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzLFxuICAgIHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzLFxuICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXMsXG4gICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0cyxcbiAgICBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRocyxcbiAgICBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzXG4gIH0gPSBwYXJhbXM7XG5cbiAgcmV0dXJuIGF3YWl0IGVkaXRMaW5rc0luQ29udGVudChub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8RWRpdExpbmtzSW5Db250ZW50UGFyYW1zPih7XG4gICAgYXBwLFxuICAgIGNvbnRlbnQsXG4gICAgbGlua0NvbnZlcnRlcjogKGxpbmspID0+IHtcbiAgICAgIGNvbnN0IGlzRW1iZWRMaW5rID0gaGFzRW1iZWRTeW50YXgobGluay5vcmlnaW5hbCk7XG4gICAgICByZXR1cm4gc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MgIT09IHVuZGVmaW5lZCAmJiBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyAhPT0gaXNFbWJlZExpbmtcbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiBjb252ZXJ0TGluayhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8Q29udmVydExpbmtQYXJhbXM+KHtcbiAgICAgICAgICBhcHAsXG4gICAgICAgICAgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkLFxuICAgICAgICAgIGxpbmssXG4gICAgICAgICAgbGlua1BhdGhTdHlsZSxcbiAgICAgICAgICBsaW5rU3R5bGUsXG4gICAgICAgICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICAgICAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgICAgIHNob3VsZEVzY2FwZUFsaWFzLFxuICAgICAgICAgIHNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzLFxuICAgICAgICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXMsXG4gICAgICAgICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0cyxcbiAgICAgICAgICBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRocyxcbiAgICAgICAgICBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzXG4gICAgICAgIH0pKTtcbiAgICB9LFxuICAgIG9mZnNldFJhbmdlXG4gIH0pKTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBsaW5rcyBpbiBhIGZpbGUgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB1cGRhdGluZyB0aGUgbGlua3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGxpbmtzIGFyZSB1cGRhdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlTGlua3NJbkZpbGUocGFyYW1zOiBVcGRhdGVMaW5rc0luRmlsZVBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZCxcbiAgICBsaW5rUGF0aFN0eWxlLFxuICAgIGxpbmtTdHlsZSxcbiAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG9mZnNldFJhbmdlLFxuICAgIG9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgc2hvdWxkRXNjYXBlQWxpYXMsXG4gICAgc2hvdWxkSW5jbHVkZUF0dGFjaG1lbnRFeHRlbnNpb25Ub0VtYmVkQWxpYXMsXG4gICAgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MsXG4gICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcyxcbiAgICBzaG91bGRVc2VBbmdsZUJyYWNrZXRzLFxuICAgIHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzLFxuICAgIHNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHNcbiAgfSA9IHBhcmFtcztcblxuICBpZiAoaXNDYW52YXNGaWxlKG5ld1NvdXJjZVBhdGhPckZpbGUpICYmICFhcHAuaW50ZXJuYWxQbHVnaW5zLmdldEVuYWJsZWRQbHVnaW5CeUlkKEludGVybmFsUGx1Z2luTmFtZS5DYW52YXMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXdhaXQgZWRpdExpbmtzKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxFZGl0TGlua3NQYXJhbXM+KHtcbiAgICAuLi5wYXJhbXMsXG4gICAgbGlua0NvbnZlcnRlcjogKGxpbmspID0+IHtcbiAgICAgIGNvbnN0IGlzRW1iZWRMaW5rID0gaGFzRW1iZWRTeW50YXgobGluay5vcmlnaW5hbCk7XG4gICAgICByZXR1cm4gc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MgIT09IHVuZGVmaW5lZCAmJiBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyAhPT0gaXNFbWJlZExpbmtcbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiBjb252ZXJ0TGluayhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8Q29udmVydExpbmtQYXJhbXM+KHtcbiAgICAgICAgICBhcHAsXG4gICAgICAgICAgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkLFxuICAgICAgICAgIGxpbmssXG4gICAgICAgICAgbGlua1BhdGhTdHlsZSxcbiAgICAgICAgICBsaW5rU3R5bGUsXG4gICAgICAgICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICAgICAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgICAgIHNob3VsZEVzY2FwZUFsaWFzLFxuICAgICAgICAgIHNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzLFxuICAgICAgICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXMsXG4gICAgICAgICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0cyxcbiAgICAgICAgICBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRocyxcbiAgICAgICAgICBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzXG4gICAgICAgIH0pKTtcbiAgICB9LFxuICAgIC8vIE5hbWVkIGJlc2lkZSB0aGUgYC4uLnBhcmFtc2Agc3ByZWFkLCBzbyBhIGxhdGVyIHJlZmFjdG9yIHRvIGV4cGxpY2l0IGZvcndhcmRpbmcgY2Fubm90IGRyb3AgaXQgc2lsZW50bHkuXG4gICAgb2Zmc2V0UmFuZ2UsXG4gICAgcGF0aE9yRmlsZTogbmV3U291cmNlUGF0aE9yRmlsZVxuICB9KSk7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRMaW5rSWRlbnRpdHlLZXlQcm92aWRlcihsaW5rOiBSZWZlcmVuY2UpOiBzdHJpbmcge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkobGluayk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlTGlua1RleHQocGFyYW1zOiBHZW5lcmF0ZUxpbmtUZXh0UGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBhcHAsIGNvbmZpZywgc3VicGF0aCwgdGFyZ2V0RmlsZSB9ID0gcGFyYW1zO1xuICBsZXQgeyBzb3VyY2VQYXRoIH0gPSBwYXJhbXM7XG4gIGlmIChzb3VyY2VQYXRoID09PSAnLycpIHtcbiAgICBzb3VyY2VQYXRoID0gJyc7XG4gIH1cblxuICBsZXQgbGlua1RleHQ6IHN0cmluZztcblxuICBpZiAodGFyZ2V0RmlsZS5wYXRoID09PSBzb3VyY2VQYXRoICYmIHN1YnBhdGggJiYgY29uZmlnLmlzU2luZ2xlU3VicGF0aEFsbG93ZWQpIHtcbiAgICBsaW5rVGV4dCA9ICcnO1xuICB9IGVsc2Uge1xuICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBBbGwgYnJhbmNoZXMgY292ZXJlZCBidXQgdjggcmVwb3J0cyBzd2l0Y2ggYXMgcGFydGlhbC4gKi9cbiAgICBzd2l0Y2ggKGNvbmZpZy5saW5rUGF0aFN0eWxlKSB7XG4gICAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICAgICAgY2FzZSBGaW5hbExpbmtQYXRoU3R5bGUuQWJzb2x1dGVQYXRoSW5WYXVsdDoge1xuICAgICAgICBsaW5rVGV4dCA9IHRhcmdldEZpbGUucGF0aDtcbiAgICAgICAgaWYgKGNvbmZpZy5zaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzICYmICFsaW5rVGV4dC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgICBsaW5rVGV4dCA9IGAvJHtsaW5rVGV4dH1gO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBGaW5hbExpbmtQYXRoU3R5bGUuUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2U6IHtcbiAgICAgICAgbGlua1RleHQgPSByZWxhdGl2ZShkaXJuYW1lKHNvdXJjZVBhdGgpLCB0YXJnZXRGaWxlLnBhdGgpO1xuICAgICAgICBpZiAoY29uZmlnLnNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzICYmICFsaW5rVGV4dC5zdGFydHNXaXRoKCcuJykpIHtcbiAgICAgICAgICBsaW5rVGV4dCA9IGAuLyR7bGlua1RleHR9YDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgRmluYWxMaW5rUGF0aFN0eWxlLlNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZToge1xuICAgICAgICBjb25zdCBzaG9ydGVzdE5hbWUgPSBpc01hcmtkb3duRmlsZSh0YXJnZXRGaWxlKSA/IHRhcmdldEZpbGUuYmFzZW5hbWUgOiB0YXJnZXRGaWxlLm5hbWU7XG4gICAgICAgIGNvbnN0IG1hdGNoZWRGaWxlcyA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldExpbmtwYXRoRGVzdChzaG9ydGVzdE5hbWUsIHNvdXJjZVBhdGgpO1xuICAgICAgICBsaW5rVGV4dCA9IG1hdGNoZWRGaWxlcy5sZW5ndGggPT09IDEgJiYgbWF0Y2hlZEZpbGVzWzBdID09PSB0YXJnZXRGaWxlID8gdGFyZ2V0RmlsZS5uYW1lIDogdGFyZ2V0RmlsZS5wYXRoO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBBbGwgdmFsaWQgRmluYWxMaW5rUGF0aFN0eWxlIHZhbHVlcyBhcmUgaGFuZGxlZCBhYm92ZS4gKi9cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgYXNzZXJ0TmV2ZXIoY29uZmlnLmxpbmtQYXRoU3R5bGUpO1xuICAgICAgfVxuICAgICAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICAgIH1cbiAgfVxuXG4gIGxpbmtUZXh0ID0gY29uZmlnLmlzV2lraWxpbmtcbiAgICA/IHRyaW1FbmQoe1xuICAgICAgJHN0cmluZzogbGlua1RleHQsXG4gICAgICBzdWZmaXg6IGAuJHtNQVJLRE9XTl9GSUxFX0VYVEVOU0lPTn1gXG4gICAgfSlcbiAgICA6IGxpbmtUZXh0O1xuICBsaW5rVGV4dCArPSBzdWJwYXRoO1xuXG4gIHJldHVybiBsaW5rVGV4dDtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVNYXJrZG93bkxpbmtJbXBsKHBhcmFtczogR2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGFwcCB9ID0gcGFyYW1zO1xuICBjb25zdCB0YXJnZXRGaWxlID0gZ2V0RmlsZShub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8R2V0RmlsZVBhcmFtcz4oeyBhcHAsIHBhdGhPckZpbGU6IHBhcmFtcy50YXJnZXRQYXRoT3JGaWxlLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHBhcmFtcy5pc05vbkV4aXN0aW5nRmlsZUFsbG93ZWQgfSkpO1xuICBjb25zdCBzb3VyY2VQYXRoID0gZ2V0UGF0aChhcHAsIHBhcmFtcy5zb3VyY2VQYXRoT3JGaWxlKTtcbiAgY29uc3Qgc3VicGF0aCA9IHBhcmFtcy5zdWJwYXRoID8/ICcnO1xuXG4gIGNvbnN0IGxpbmtDb25maWcgPSBnZXRMaW5rQ29uZmlnKHBhcmFtcyk7XG4gIGNvbnN0IGxpbmtUZXh0ID0gZ2VuZXJhdGVMaW5rVGV4dCh7XG4gICAgYXBwLFxuICAgIGNvbmZpZzogbGlua0NvbmZpZyxcbiAgICBzb3VyY2VQYXRoLFxuICAgIHN1YnBhdGgsXG4gICAgdGFyZ2V0RmlsZVxuICB9KTtcblxuICByZXR1cm4gbGlua0NvbmZpZy5pc1dpa2lsaW5rXG4gICAgPyBnZW5lcmF0ZVdpa2lMaW5rKHtcbiAgICAgIGFsaWFzOiBwYXJhbXMuYWxpYXMsXG4gICAgICBpc0VtYmVkOiBsaW5rQ29uZmlnLmlzRW1iZWQsXG4gICAgICBsaW5rVGV4dFxuICAgIH0pXG4gICAgOiBnZW5lcmF0ZU1hcmtkb3duU3R5bGVMaW5rKHtcbiAgICAgIGNvbmZpZzogbGlua0NvbmZpZyxcbiAgICAgIGxpbmtUZXh0LFxuICAgICAgbWFya2Rvd25MaW5rUGFyYW1zOiBwYXJhbXMsXG4gICAgICB0YXJnZXRGaWxlXG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlTWFya2Rvd25TdHlsZUxpbmsocGFyYW1zOiBHZW5lcmF0ZU1hcmtkb3duU3R5bGVMaW5rUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBjb25maWcsIGxpbmtUZXh0LCBtYXJrZG93bkxpbmtQYXJhbXMsIHRhcmdldEZpbGUgfSA9IHBhcmFtcztcbiAgbGV0IGFsaWFzID0gbWFya2Rvd25MaW5rUGFyYW1zLmFsaWFzID8/ICcnO1xuICBsZXQgc2hvdWxkRXNjYXBlQWxpYXMgPSBtYXJrZG93bkxpbmtQYXJhbXMuc2hvdWxkRXNjYXBlQWxpYXMgPz8gZmFsc2U7XG4gIGlmICghYWxpYXMgJiYgKGlzTWFya2Rvd25GaWxlKHRhcmdldEZpbGUpIHx8ICFtYXJrZG93bkxpbmtQYXJhbXMuaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkKSkge1xuICAgIGFsaWFzID0gIW1hcmtkb3duTGlua1BhcmFtcy5zaG91bGRJbmNsdWRlQXR0YWNobWVudEV4dGVuc2lvblRvRW1iZWRBbGlhcyB8fCBpc01hcmtkb3duRmlsZSh0YXJnZXRGaWxlKVxuICAgICAgPyB0YXJnZXRGaWxlLmJhc2VuYW1lXG4gICAgICA6IHRhcmdldEZpbGUubmFtZTtcbiAgICBzaG91bGRFc2NhcGVBbGlhcyA9IHRydWU7XG4gIH1cblxuICByZXR1cm4gZ2VuZXJhdGVSYXdNYXJrZG93bkxpbmsoe1xuICAgIGFsaWFzLFxuICAgIGlzRW1iZWQ6IGNvbmZpZy5pc0VtYmVkLFxuICAgIGlzV2lraWxpbms6IGZhbHNlLFxuICAgIHNob3VsZEVzY2FwZUFsaWFzLFxuICAgIHNob3VsZFVzZUFuZ2xlQnJhY2tldHM6IGNvbmZpZy5zaG91bGRVc2VBbmdsZUJyYWNrZXRzLFxuICAgIHVybDogbGlua1RleHRcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlV2lraUxpbmsocGFyYW1zOiBHZW5lcmF0ZVdpa2lMaW5rUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBhbGlhcywgaXNFbWJlZCwgbGlua1RleHQgfSA9IHBhcmFtcztcbiAgcmV0dXJuIGdlbmVyYXRlUmF3TWFya2Rvd25MaW5rKHtcbiAgICBpc0VtYmVkLFxuICAgIGlzV2lraWxpbms6IHRydWUsXG4gICAgLi4uKGFsaWFzPy50b0xvd2VyQ2FzZSgpID09PSBsaW5rVGV4dC50b0xvd2VyQ2FzZSgpXG4gICAgICA/IHsgdXJsOiBhbGlhcyB9XG4gICAgICA6IHtcbiAgICAgICAgYWxpYXMsXG4gICAgICAgIHVybDogbGlua1RleHRcbiAgICAgIH0pXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRGaWxlQ2hhbmdlcyhwYXJhbXM6IEdldEZpbGVDaGFuZ2VzUGFyYW1zKTogUHJvbWlzZTxGaWxlQ2hhbmdlW10+IHtcbiAgY29uc3Qge1xuICAgIGNhY2hlLFxuICAgIGlzQ2FudmFzRmlsZUNhY2hlLFxuICAgIGxpbmtDb252ZXJ0ZXIsXG4gICAgb2Zmc2V0UmFuZ2UsXG4gICAgc2hvdWxkSW5jbHVkZUV4dGVybmFsTGlua3MgPSBmYWxzZSxcbiAgICBzaG91bGRJbmNsdWRlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzID0gZmFsc2UsXG4gICAgc2hvdWxkSW5jbHVkZU11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3MgPSBmYWxzZVxuICB9ID0gcGFyYW1zO1xuICBsZXQgeyBhYm9ydFNpZ25hbCB9ID0gcGFyYW1zO1xuICBhYm9ydFNpZ25hbCA/Pz0gYWJvcnRTaWduYWxOZXZlcigpO1xuICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gIGlmICghY2FjaGUpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBjaGFuZ2VzOiBGaWxlQ2hhbmdlW10gPSBbXTtcblxuICBjb25zdCB0YWJsZVBvc2l0aW9uczogVGFibGVQb3NpdGlvbltdID0gKGNhY2hlLnNlY3Rpb25zID8/IFtdKS5maWx0ZXIoKHNlY3Rpb24pID0+IHNlY3Rpb24udHlwZSA9PT0gJ3RhYmxlJykubWFwKChzZWN0aW9uKSA9PiAoe1xuICAgIGVuZDogc2VjdGlvbi5wb3NpdGlvbi5lbmQub2Zmc2V0LFxuICAgIHN0YXJ0OiBzZWN0aW9uLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldFxuICB9KSk7XG5cbiAgY29uc3QgZ2V0RmlsZUNoYW5nZXNEZWJ1Z2dlciA9IGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ0xpbms6Z2V0RmlsZUNoYW5nZXMnKTtcblxuICBmb3IgKGNvbnN0IGxpbmsgb2YgZ2V0TGlua3MoeyBjYWNoZSwgc2hvdWxkSW5jbHVkZUV4dGVybmFsTGlua3MsIHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckV4dGVybmFsTGlua3MsIHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzIH0pKSB7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIGlmIChvZmZzZXRSYW5nZSAhPT0gdW5kZWZpbmVkICYmICFpc1JlZmVyZW5jZUluT2Zmc2V0UmFuZ2UobGluaywgb2Zmc2V0UmFuZ2UpKSB7XG4gICAgICBnZXRGaWxlQ2hhbmdlc0RlYnVnZ2VyKFxuICAgICAgICBpc1JlZmVyZW5jZUNhY2hlKGxpbmspXG4gICAgICAgICAgPyAnU2tpcHBpbmcgYSBsaW5rIHRoYXQgaXMgbm90IGZ1bGx5IGNvbnRhaW5lZCBpbiB0aGUgb2Zmc2V0IHJhbmdlJ1xuICAgICAgICAgIDogJ1NraXBwaW5nIGEgbGluayB0aGF0IGNhcnJpZXMgbm8gcG9zaXRpb24gd2l0aGluIHRoZSBjb250ZW50LCBzbyBpdCBjYW4gbmV2ZXIgYmUgaW4gdGhlIG9mZnNldCByYW5nZScsXG4gICAgICAgIHsgbGluazogbGluay5vcmlnaW5hbCwgb2Zmc2V0UmFuZ2UgfVxuICAgICAgKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBhd2FpdCBsaW5rQ29udmVydGVyKGxpbmssIGFib3J0U2lnbmFsKTtcbiAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGlmIChuZXdDb250ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVDaGFuZ2UgPSByZWZlcmVuY2VUb0ZpbGVDaGFuZ2UobGluaywgbmV3Q29udGVudCk7XG5cbiAgICBpZiAoaXNDYW52YXNGaWxlQ2FjaGUpIHtcbiAgICAgIGlmIChpc0NhbnZhc0NoYW5nZShmaWxlQ2hhbmdlKSkge1xuICAgICAgICBjaGFuZ2VzLnB1c2goZmlsZUNoYW5nZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdVbnN1cHBvcnRlZCBmaWxlIGNoYW5nZScsIGZpbGVDaGFuZ2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc2hvdWxkRXNjYXBlV2lraWxpbmtEaXZpZGVyKGZpbGVDaGFuZ2UsIHRhYmxlUG9zaXRpb25zKSkge1xuICAgICAgICBmaWxlQ2hhbmdlLm5ld0NvbnRlbnQgPSBmaWxlQ2hhbmdlLm5ld0NvbnRlbnQucmVwbGFjZUFsbChPUFRJT05BTExZX0VTQ0FQRURfV0lLSUxJTktfRElWSURFUl9SRUdFWFAsICgpID0+IEVTQ0FQRURfV0lLSUxJTktfRElWSURFUik7XG4gICAgICB9XG5cbiAgICAgIGNoYW5nZXMucHVzaChmaWxlQ2hhbmdlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNoYW5nZXM7XG59XG5cbmZ1bmN0aW9uIGdldEZpbmFsTGlua1BhdGhTdHlsZShhcHA6IEFwcCwgbGlua1BhdGhTdHlsZT86IExpbmtQYXRoU3R5bGUpOiBGaW5hbExpbmtQYXRoU3R5bGUge1xuICBjb25zdCByZXNvbHZlZFN0eWxlID0gbGlua1BhdGhTdHlsZSA/PyBMaW5rUGF0aFN0eWxlLk9ic2lkaWFuU2V0dGluZ3NEZWZhdWx0O1xuICBzd2l0Y2ggKHJlc29sdmVkU3R5bGUpIHtcbiAgICBjYXNlIExpbmtQYXRoU3R5bGUuQWJzb2x1dGVQYXRoSW5WYXVsdDoge1xuICAgICAgcmV0dXJuIEZpbmFsTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0O1xuICAgIH1cbiAgICBjYXNlIExpbmtQYXRoU3R5bGUuT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQ6IHtcbiAgICAgIHJldHVybiByZXNvbHZlRmluYWxMaW5rUGF0aFN0eWxlRnJvbU9ic2lkaWFuU2V0dGluZ3MoYXBwKTtcbiAgICB9XG4gICAgY2FzZSBMaW5rUGF0aFN0eWxlLlJlbGF0aXZlUGF0aFRvVGhlU291cmNlOiB7XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLlJlbGF0aXZlUGF0aFRvVGhlU291cmNlO1xuICAgIH1cbiAgICBjYXNlIExpbmtQYXRoU3R5bGUuU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlOiB7XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLlNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgYXNzZXJ0TmV2ZXIocmVzb2x2ZWRTdHlsZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldExpbmtDb25maWcocGFyYW1zOiBHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcyk6IExpbmtDb25maWcge1xuICBjb25zdCB7IGFwcCB9ID0gcGFyYW1zO1xuICByZXR1cm4ge1xuICAgIGlzRW1iZWQ6IHBhcmFtcy5pc0VtYmVkID8/IChwYXJhbXMub3JpZ2luYWxMaW5rID8gaGFzRW1iZWRTeW50YXgocGFyYW1zLm9yaWdpbmFsTGluaykgOiBmYWxzZSksXG4gICAgaXNTaW5nbGVTdWJwYXRoQWxsb3dlZDogcGFyYW1zLmlzU2luZ2xlU3VicGF0aEFsbG93ZWQgPz8gdHJ1ZSxcbiAgICBpc1dpa2lsaW5rOiBzaG91bGRVc2VXaWtpbGlua1N0eWxlKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxTaG91bGRVc2VXaWtpbGlua1N0eWxlUGFyYW1zPih7XG4gICAgICBhcHAsXG4gICAgICBsaW5rU3R5bGU6IHBhcmFtcy5saW5rU3R5bGUsXG4gICAgICBvcmlnaW5hbExpbms6IHBhcmFtcy5vcmlnaW5hbExpbmtcbiAgICB9KSksXG4gICAgbGlua1BhdGhTdHlsZTogZ2V0RmluYWxMaW5rUGF0aFN0eWxlKGFwcCwgcGFyYW1zLmxpbmtQYXRoU3R5bGUpLFxuICAgIHNob3VsZFVzZUFuZ2xlQnJhY2tldHM6IHBhcmFtcy5zaG91bGRVc2VBbmdsZUJyYWNrZXRzID8/IChwYXJhbXMub3JpZ2luYWxMaW5rID8gaGFzQW5nbGVCcmFja2V0cyhwYXJhbXMub3JpZ2luYWxMaW5rKSA6IHVuZGVmaW5lZCkgPz8gZmFsc2UsXG4gICAgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHM6IHBhcmFtcy5zaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRoc1xuICAgICAgPz8gKHBhcmFtcy5vcmlnaW5hbExpbmsgPyBoYXNMZWFkaW5nRG90KHBhcmFtcy5vcmlnaW5hbExpbmspIDogdW5kZWZpbmVkKSA/PyBmYWxzZSxcbiAgICBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzOiBwYXJhbXMuc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRoc1xuICAgICAgPz8gKHBhcmFtcy5vcmlnaW5hbExpbmsgPyBoYXNMZWFkaW5nU2xhc2gocGFyYW1zLm9yaWdpbmFsTGluaykgOiB1bmRlZmluZWQpID8/IGZhbHNlXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFVuZGVmaW5lZFBheWxvYWQoKTogdW5kZWZpbmVkIHtcbiAgLy8gQSBzaW5nbGUtdGFyZ2V0IHJld3JpdGUgaGFzIG5vdGhpbmcgdG8gcmVtZW1iZXIgcGVyIGxpbms6IHRoZSB0YXJnZXQgaXMgaW1wbGllZC5cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRmlsZVVybExpbmsobGluazogUmVmZXJlbmNlLCBzaG91bGRVc2VBbmdsZUJyYWNrZXRzOiBib29sZWFuKTogTWF5YmVSZXR1cm48c3RyaW5nPiB7XG4gIGlmIChpc1BhcnNlTGlua0Zyb250bWF0dGVyUmVmZXJlbmNlKGxpbmspKSB7XG4gICAgLy8gQSBmcm9udG1hdHRlciB2YWx1ZSBob2xkcyBhIGJhcmUgVVJMIChyZS1zZXJpYWxpemVkL3F1b3RlZCBhcyBZQU1MKSwgbm90IGEgYFthbGlhc10odXJsKWAgbWFya2Rvd24gbGluay5cbiAgICByZXR1cm4gbGluay5wYXJzZUxpbmtSZXN1bHQuaXNGaWxlVXJsID8gbm9ybWFsaXplRmlsZVVybChsaW5rLnBhcnNlTGlua1Jlc3VsdC51cmwpIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKCFpc1BhcnNlTGlua1JlZmVyZW5jZShsaW5rKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHsgcGFyc2VMaW5rUmVzdWx0IH0gPSBsaW5rO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0LmlzRmlsZVVybFxuICAgID8gZ2VuZXJhdGVSYXdNYXJrZG93bkxpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEdlbmVyYXRlUmF3TWFya2Rvd25MaW5rUGFyYW1zPih7XG4gICAgICBhbGlhczogcGFyc2VMaW5rUmVzdWx0LmFsaWFzLFxuICAgICAgaXNFbWJlZDogcGFyc2VMaW5rUmVzdWx0LmlzRW1iZWQsXG4gICAgICBpc1dpa2lsaW5rOiBmYWxzZSxcbiAgICAgIHNob3VsZFVzZUFuZ2xlQnJhY2tldHMsXG4gICAgICB1cmw6IG5vcm1hbGl6ZUZpbGVVcmwocGFyc2VMaW5rUmVzdWx0LnVybClcbiAgICB9KSlcbiAgICA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUZpbmFsTGlua1BhdGhTdHlsZUZyb21PYnNpZGlhblNldHRpbmdzKGFwcDogQXBwKTogRmluYWxMaW5rUGF0aFN0eWxlIHtcbiAgY29uc3QgbmV3TGlua0Zvcm1hdCA9IGdldE5ld0xpbmtGb3JtYXQoYXBwKTtcbiAgc3dpdGNoIChuZXdMaW5rRm9ybWF0KSB7XG4gICAgY2FzZSAnYWJzb2x1dGUnOiB7XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLkFic29sdXRlUGF0aEluVmF1bHQ7XG4gICAgfVxuICAgIGNhc2UgJ3JlbGF0aXZlJzoge1xuICAgICAgcmV0dXJuIEZpbmFsTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZTtcbiAgICB9XG4gICAgY2FzZSAnc2hvcnRlc3QnOiB7XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLlNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgYXNzZXJ0TmV2ZXIobmV3TGlua0Zvcm1hdCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVTbmFwc2hvdExpbmtJZGVudGl0eUtleVByb3ZpZGVyKHBhcmFtczogUmVzb2x2ZVNuYXBzaG90TGlua0lkZW50aXR5S2V5UHJvdmlkZXJQYXJhbXMpOiAobGluazogUmVmZXJlbmNlKSA9PiBzdHJpbmcge1xuICBjb25zdCB7IGNhbGxlck5hbWUsIGV4cGxpY2l0TGlua0lkZW50aXR5S2V5UHJvdmlkZXIsIHNuYXBzaG90IH0gPSBwYXJhbXM7XG4gIGNvbnN0IHJlY29yZGVkTGlua0lkZW50aXR5S2V5UHJvdmlkZXIgPSBzbmFwc2hvdExpbmtJZGVudGl0eUtleVByb3ZpZGVycy5nZXQoc25hcHNob3QpO1xuICBpZiAoXG4gICAgZXhwbGljaXRMaW5rSWRlbnRpdHlLZXlQcm92aWRlciAmJiByZWNvcmRlZExpbmtJZGVudGl0eUtleVByb3ZpZGVyXG4gICAgJiYgZXhwbGljaXRMaW5rSWRlbnRpdHlLZXlQcm92aWRlciAhPT0gcmVjb3JkZWRMaW5rSWRlbnRpdHlLZXlQcm92aWRlclxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgJHtjYWxsZXJOYW1lfSB3YXMgcGFzc2VkIGEgbGlua0lkZW50aXR5S2V5UHJvdmlkZXIgdGhhdCBkaWZmZXJzIGZyb20gdGhlIG9uZSB0aGUgc25hcHNob3Qgd2FzIGJ1aWx0IHdpdGguIGBcbiAgICAgICAgKyAnVGhlIHNuYXBzaG90IGlzIGtleWVkIGJ5IHRoZSBvdGhlciwgc28gbm8gbGluayB3b3VsZCBtYXRjaC4gT21pdCB0aGUgcGFyYW1ldGVyIHRvIHVzZSB0aGUgc25hcHNob3RcXCdzIG93bi4nXG4gICAgKTtcbiAgfVxuICByZXR1cm4gZXhwbGljaXRMaW5rSWRlbnRpdHlLZXlQcm92aWRlciA/PyByZWNvcmRlZExpbmtJZGVudGl0eUtleVByb3ZpZGVyID8/IGRlZmF1bHRMaW5rSWRlbnRpdHlLZXlQcm92aWRlcjtcbn1cblxuZnVuY3Rpb24gc2hvdWxkRXNjYXBlV2lraWxpbmtEaXZpZGVyKGZpbGVDaGFuZ2U6IEZpbGVDaGFuZ2UsIHRhYmxlUG9zaXRpb25zOiBUYWJsZVBvc2l0aW9uW10pOiBib29sZWFuIHtcbiAgLyogdjggaWdub3JlIHN0YXJ0IC0tIGdldEZpbGVDaGFuZ2VzIG9ubHkgY2FsbHMgdGhpcyBmb3Igbm9uLWNhbnZhcyBmaWxlcyB3aGljaCBhbHdheXMgaGF2ZSBjb250ZW50IGNoYW5nZXMuICovXG4gIGlmICghaXNDb250ZW50Q2hhbmdlKGZpbGVDaGFuZ2UpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8qIHY4IGlnbm9yZSBzdG9wICovXG5cbiAgcmV0dXJuIFVORVNDQVBFRF9XSUtJTElOS19ESVZJREVSX1JFR0VYUC50ZXN0KGZpbGVDaGFuZ2UubmV3Q29udGVudCkgJiYgdGFibGVQb3NpdGlvbnMuc29tZSgodGFibGVQb3NpdGlvbikgPT4gdGFibGVQb3NpdGlvbi5zdGFydCA8PSBmaWxlQ2hhbmdlLnJlZmVyZW5jZS5wb3NpdGlvbi5zdGFydC5vZmZzZXQgJiYgZmlsZUNoYW5nZS5yZWZlcmVuY2UucG9zaXRpb24uZW5kLm9mZnNldCA8PSB0YWJsZVBvc2l0aW9uLmVuZCk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVzZVdpa2lsaW5rU3R5bGUocGFyYW1zOiBTaG91bGRVc2VXaWtpbGlua1N0eWxlUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgYXBwLCBsaW5rU3R5bGUsIG9yaWdpbmFsTGluayB9ID0gcGFyYW1zO1xuICBjb25zdCByZXNvbHZlZFN0eWxlID0gbGlua1N0eWxlID8/IExpbmtTdHlsZS5QcmVzZXJ2ZUV4aXN0aW5nO1xuICBzd2l0Y2ggKHJlc29sdmVkU3R5bGUpIHtcbiAgICBjYXNlIExpbmtTdHlsZS5NYXJrZG93bjoge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjYXNlIExpbmtTdHlsZS5PYnNpZGlhblNldHRpbmdzRGVmYXVsdDoge1xuICAgICAgcmV0dXJuIHNob3VsZFVzZVdpa2lsaW5rcyhhcHApO1xuICAgIH1cbiAgICBjYXNlIExpbmtTdHlsZS5QcmVzZXJ2ZUV4aXN0aW5nOiB7XG4gICAgICByZXR1cm4gb3JpZ2luYWxMaW5rID09PSB1bmRlZmluZWQgPyBzaG91bGRVc2VXaWtpbGlua3MoYXBwKSA6IGhhc1dpa2lsaW5rU3ludGF4KG9yaWdpbmFsTGluayk7XG4gICAgfVxuICAgIGNhc2UgTGlua1N0eWxlLldpa2lsaW5rOiB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgYXNzZXJ0TmV2ZXIocmVzb2x2ZWRTdHlsZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlT2Zmc2V0UmFuZ2Uob2Zmc2V0UmFuZ2U6IE9mZnNldFJhbmdlKTogdm9pZCB7XG4gIGlmIChvZmZzZXRSYW5nZS5zdGFydE9mZnNldCA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgb2Zmc2V0IHJhbmdlOiB0aGUgc3RhcnQgb2Zmc2V0ICR7U3RyaW5nKG9mZnNldFJhbmdlLnN0YXJ0T2Zmc2V0KX0gbXVzdCBub3QgYmUgbmVnYXRpdmUuYCk7XG4gIH1cblxuICBpZiAob2Zmc2V0UmFuZ2UuZW5kT2Zmc2V0IDwgb2Zmc2V0UmFuZ2Uuc3RhcnRPZmZzZXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgb2Zmc2V0IHJhbmdlOiB0aGUgZW5kIG9mZnNldCAke1N0cmluZyhvZmZzZXRSYW5nZS5lbmRPZmZzZXQpfSBtdXN0IG5vdCBiZSBsZXNzIHRoYW4gdGhlIHN0YXJ0IG9mZnNldCAke1N0cmluZyhvZmZzZXRSYW5nZS5zdGFydE9mZnNldCl9LmApO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWdCQSxTQUFTLHdCQUF3QjtBQUNqQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FB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