obsidian-dev-utils 65.0.1 → 66.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 (400) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/dist/dev/main.js +4892 -4807
  3. package/dist/lib/cjs/async-events.cjs +15 -18
  4. package/dist/lib/cjs/async-events.d.cts +19 -19
  5. package/dist/lib/cjs/async.cjs +1 -1
  6. package/dist/lib/cjs/async.d.cts +9 -8
  7. package/dist/lib/cjs/function.cjs +1 -1
  8. package/dist/lib/cjs/function.d.cts +43 -3
  9. package/dist/lib/cjs/library.cjs +1 -1
  10. package/dist/lib/cjs/obsidian/async-with-notice.cjs +1 -1
  11. package/dist/lib/cjs/obsidian/async-with-notice.d.cts +2 -2
  12. package/dist/lib/cjs/obsidian/{plugin/components → components}/abort-signal-component.cjs +4 -4
  13. package/dist/lib/cjs/obsidian/{plugin/components → components}/abort-signal-component.d.cts +2 -2
  14. package/dist/lib/cjs/obsidian/components/all-windows-event-component.cjs +201 -0
  15. package/dist/lib/{esm/obsidian/components/all-windows-event-handler.d.mts → cjs/obsidian/components/all-windows-event-component.d.cts} +6 -7
  16. package/dist/lib/cjs/obsidian/components/async-component.cjs +3 -2
  17. package/dist/lib/cjs/obsidian/components/async-component.d.cts +2 -1
  18. package/dist/lib/cjs/obsidian/{plugin/components → components}/async-error-handler-component.cjs +5 -5
  19. package/dist/lib/cjs/obsidian/{plugin/components → components}/async-error-handler-component.d.cts +2 -2
  20. package/dist/lib/cjs/obsidian/components/async-events-component.cjs +3 -2
  21. package/dist/lib/cjs/obsidian/components/async-events-component.d.cts +2 -1
  22. package/dist/lib/cjs/obsidian/{plugin/components → components}/console-debug-component.cjs +4 -4
  23. package/dist/lib/cjs/obsidian/{plugin/components → components}/console-debug-component.d.cts +2 -2
  24. package/dist/lib/cjs/obsidian/components/disposable-component.cjs +160 -0
  25. package/dist/lib/cjs/obsidian/components/disposable-component.d.cts +34 -0
  26. package/dist/lib/cjs/obsidian/{plugin/components → components}/i18n-component.cjs +4 -4
  27. package/dist/lib/cjs/obsidian/{plugin/components → components}/i18n-component.d.cts +2 -2
  28. package/dist/lib/cjs/obsidian/components/index.cjs +40 -7
  29. package/dist/lib/cjs/obsidian/components/index.d.cts +13 -2
  30. package/dist/lib/cjs/obsidian/components/layout-ready-component.cjs +185 -0
  31. package/dist/lib/cjs/obsidian/components/layout-ready-component.d.cts +47 -0
  32. package/dist/lib/cjs/obsidian/components/menu-event-registrar-component.cjs +172 -0
  33. package/dist/lib/cjs/obsidian/components/menu-event-registrar-component.d.cts +41 -0
  34. package/dist/lib/cjs/obsidian/components/monkey-around-component.cjs +197 -0
  35. package/dist/lib/cjs/obsidian/components/monkey-around-component.d.cts +113 -0
  36. package/dist/lib/cjs/obsidian/{plugin/components → components}/plugin-context-component.cjs +6 -6
  37. package/dist/lib/cjs/obsidian/{plugin/components → components}/plugin-context-component.d.cts +2 -2
  38. package/dist/lib/cjs/obsidian/{plugin/components → components}/plugin-notice-component.cjs +3 -2
  39. package/dist/lib/cjs/obsidian/{plugin/components → components}/plugin-notice-component.d.cts +2 -2
  40. package/dist/lib/cjs/obsidian/components/plugin-settings-component.cjs +534 -0
  41. package/dist/lib/cjs/obsidian/{plugin/components → components}/plugin-settings-component.d.cts +6 -21
  42. package/dist/lib/cjs/obsidian/{plugin/components → components}/plugin-settings-tab-component.cjs +3 -2
  43. package/dist/lib/cjs/obsidian/{plugin/components → components}/plugin-settings-tab-component.d.cts +5 -5
  44. package/dist/lib/cjs/obsidian/constructors/getDomEventsHandlersConstructor.cjs +20 -16
  45. package/dist/lib/cjs/obsidian/dataview.cjs +1 -1
  46. package/dist/lib/cjs/obsidian/dataview.d.cts +1 -1
  47. package/dist/lib/cjs/obsidian/index.cjs +7 -4
  48. package/dist/lib/cjs/obsidian/index.d.cts +2 -1
  49. package/dist/lib/cjs/obsidian/loop.cjs +1 -1
  50. package/dist/lib/cjs/obsidian/loop.d.cts +2 -2
  51. package/dist/lib/cjs/obsidian/markdown.cjs +13 -7
  52. package/dist/lib/cjs/obsidian/menu-event-registrar.cjs +1 -50
  53. package/dist/lib/cjs/obsidian/menu-event-registrar.d.cts +1 -35
  54. package/dist/lib/cjs/obsidian/modals/prompt.cjs +1 -1
  55. package/dist/lib/cjs/obsidian/modals/prompt.d.cts +1 -1
  56. package/dist/lib/cjs/obsidian/modals/select-item.cjs +1 -1
  57. package/dist/lib/cjs/obsidian/modals/select-item.d.cts +1 -1
  58. package/dist/lib/cjs/obsidian/path-settings.cjs +239 -0
  59. package/dist/lib/cjs/obsidian/plugin/index.cjs +1 -7
  60. package/dist/lib/cjs/obsidian/plugin/index.d.cts +0 -2
  61. package/dist/lib/cjs/obsidian/plugin/plugin-settings-tab.cjs +4 -4
  62. package/dist/lib/cjs/obsidian/plugin/plugin-settings-tab.d.cts +5 -5
  63. package/dist/lib/cjs/obsidian/plugin/plugin.cjs +39 -34
  64. package/dist/lib/cjs/obsidian/plugin/plugin.d.cts +13 -11
  65. package/dist/lib/cjs/obsidian/queue.cjs +1 -1
  66. package/dist/lib/cjs/obsidian/queue.d.cts +2 -2
  67. package/dist/lib/cjs/obsidian/rename-delete-handler.cjs +19 -12
  68. package/dist/lib/cjs/obsidian/setting-components/checkbox-component.cjs +209 -0
  69. package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/checkbox-component.d.cts +1 -1
  70. package/dist/lib/cjs/obsidian/setting-components/code-highlighter-component.cjs +356 -0
  71. package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/code-highlighter-component.d.cts +1 -1
  72. package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/date-component.cjs +3 -3
  73. package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/date-time-component.cjs +3 -3
  74. package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/email-component.cjs +2 -2
  75. package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/file-component.cjs +2 -2
  76. package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/index.cjs +1 -1
  77. package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/month-component.cjs +3 -3
  78. package/dist/lib/cjs/obsidian/setting-components/multiple-dropdown-component.cjs +241 -0
  79. package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/multiple-dropdown-component.d.cts +1 -1
  80. package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/multiple-email-component.cjs +2 -2
  81. package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/multiple-file-component.cjs +3 -3
  82. package/dist/lib/cjs/obsidian/setting-components/multiple-text-component.cjs +254 -0
  83. package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/multiple-text-component.d.cts +1 -1
  84. package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/number-component.cjs +2 -2
  85. package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/password-component.cjs +2 -2
  86. package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/setting-component-wrapper.cjs +4 -4
  87. package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/telephone-component.cjs +2 -2
  88. package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/text-based-component.cjs +1 -1
  89. package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/time-component.cjs +2 -2
  90. package/dist/lib/cjs/obsidian/setting-components/tri-state-checkbox-component.cjs +210 -0
  91. package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/tri-state-checkbox-component.d.cts +1 -1
  92. package/dist/lib/cjs/obsidian/setting-components/typed-dropdown-component.cjs +247 -0
  93. package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/typed-dropdown-component.d.cts +1 -1
  94. package/dist/lib/cjs/obsidian/setting-components/typed-multiple-dropdown-component.cjs +249 -0
  95. package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/typed-multiple-dropdown-component.d.cts +1 -1
  96. package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/typed-range-text-component.cjs +1 -1
  97. package/dist/lib/cjs/obsidian/setting-components/typed-text-component.cjs +224 -0
  98. package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/typed-text-component.d.cts +2 -2
  99. package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/url-component.cjs +2 -2
  100. package/dist/lib/cjs/obsidian/setting-components/validator-component.cjs +226 -0
  101. package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/validator-component.d.cts +1 -1
  102. package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/value-component-with-change-tracking.cjs +1 -1
  103. package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/week-component.cjs +3 -3
  104. package/dist/lib/cjs/obsidian/setting-ex.cjs +21 -21
  105. package/dist/lib/cjs/obsidian/setting-ex.d.cts +20 -20
  106. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.cjs +1 -1
  107. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.d.cts +2 -2
  108. package/dist/lib/cjs/script-utils/linters/eslint-config.cjs +2 -1
  109. package/dist/lib/cjs/script-utils/linters/eslint-config.d.cts +2 -2
  110. package/dist/lib/cjs/type.cjs +1 -1
  111. package/dist/lib/esm/async-events.d.mts +19 -19
  112. package/dist/lib/esm/async-events.mjs +15 -18
  113. package/dist/lib/esm/async.d.mts +9 -8
  114. package/dist/lib/esm/async.mjs +1 -1
  115. package/dist/lib/esm/function.d.mts +43 -3
  116. package/dist/lib/esm/function.mjs +1 -1
  117. package/dist/lib/esm/library.mjs +1 -1
  118. package/dist/lib/esm/obsidian/async-with-notice.d.mts +2 -2
  119. package/dist/lib/esm/obsidian/async-with-notice.mjs +1 -1
  120. package/dist/lib/esm/obsidian/{plugin/components → components}/abort-signal-component.d.mts +2 -2
  121. package/dist/lib/esm/obsidian/components/abort-signal-component.mjs +59 -0
  122. package/dist/lib/{cjs/obsidian/components/all-windows-event-handler.d.cts → esm/obsidian/components/all-windows-event-component.d.mts} +6 -7
  123. package/dist/lib/esm/obsidian/components/all-windows-event-component.mjs +93 -0
  124. package/dist/lib/esm/obsidian/components/async-component.d.mts +2 -1
  125. package/dist/lib/esm/obsidian/components/async-component.mjs +3 -2
  126. package/dist/lib/esm/obsidian/{plugin/components → components}/async-error-handler-component.d.mts +2 -2
  127. package/dist/lib/esm/obsidian/components/async-error-handler-component.mjs +62 -0
  128. package/dist/lib/esm/obsidian/components/async-events-component.d.mts +2 -1
  129. package/dist/lib/esm/obsidian/components/async-events-component.mjs +3 -2
  130. package/dist/lib/esm/obsidian/{plugin/components → components}/console-debug-component.d.mts +2 -2
  131. package/dist/lib/esm/obsidian/components/console-debug-component.mjs +56 -0
  132. package/dist/lib/esm/obsidian/components/disposable-component.d.mts +34 -0
  133. package/dist/lib/esm/obsidian/components/disposable-component.mjs +50 -0
  134. package/dist/lib/esm/obsidian/{plugin/components → components}/i18n-component.d.mts +2 -2
  135. package/dist/lib/esm/obsidian/components/i18n-component.mjs +53 -0
  136. package/dist/lib/esm/obsidian/components/index.d.mts +13 -2
  137. package/dist/lib/esm/obsidian/components/index.mjs +27 -5
  138. package/dist/lib/esm/obsidian/components/layout-ready-component.d.mts +47 -0
  139. package/dist/lib/esm/obsidian/components/layout-ready-component.mjs +76 -0
  140. package/dist/lib/esm/obsidian/components/menu-event-registrar-component.d.mts +41 -0
  141. package/dist/lib/esm/obsidian/components/menu-event-registrar-component.mjs +64 -0
  142. package/dist/lib/esm/obsidian/components/monkey-around-component.d.mts +113 -0
  143. package/dist/lib/esm/obsidian/components/monkey-around-component.mjs +87 -0
  144. package/dist/lib/esm/obsidian/{plugin/components → components}/plugin-context-component.d.mts +2 -2
  145. package/dist/lib/esm/obsidian/components/plugin-context-component.mjs +61 -0
  146. package/dist/lib/esm/obsidian/{plugin/components → components}/plugin-notice-component.d.mts +2 -2
  147. package/dist/lib/esm/obsidian/components/plugin-notice-component.mjs +58 -0
  148. package/dist/lib/esm/obsidian/{plugin/components → components}/plugin-settings-component.d.mts +6 -21
  149. package/dist/lib/esm/obsidian/components/plugin-settings-component.mjs +433 -0
  150. package/dist/lib/esm/obsidian/{plugin/components → components}/plugin-settings-tab-component.d.mts +5 -5
  151. package/dist/lib/esm/obsidian/components/plugin-settings-tab-component.mjs +50 -0
  152. package/dist/lib/esm/obsidian/constructors/getDomEventsHandlersConstructor.mjs +20 -16
  153. package/dist/lib/esm/obsidian/dataview.d.mts +1 -1
  154. package/dist/lib/esm/obsidian/dataview.mjs +1 -1
  155. package/dist/lib/esm/obsidian/index.d.mts +2 -1
  156. package/dist/lib/esm/obsidian/index.mjs +5 -3
  157. package/dist/lib/esm/obsidian/loop.d.mts +2 -2
  158. package/dist/lib/esm/obsidian/loop.mjs +1 -1
  159. package/dist/lib/esm/obsidian/markdown.mjs +13 -7
  160. package/dist/lib/esm/obsidian/menu-event-registrar.d.mts +1 -35
  161. package/dist/lib/esm/obsidian/menu-event-registrar.mjs +1 -42
  162. package/dist/lib/esm/obsidian/modals/prompt.d.mts +1 -1
  163. package/dist/lib/esm/obsidian/modals/prompt.mjs +1 -1
  164. package/dist/lib/esm/obsidian/modals/select-item.d.mts +1 -1
  165. package/dist/lib/esm/obsidian/modals/select-item.mjs +1 -1
  166. package/dist/lib/esm/obsidian/path-settings.mjs +135 -0
  167. package/dist/lib/esm/obsidian/plugin/index.d.mts +0 -2
  168. package/dist/lib/esm/obsidian/plugin/index.mjs +1 -5
  169. package/dist/lib/esm/obsidian/plugin/plugin-settings-tab.d.mts +5 -5
  170. package/dist/lib/esm/obsidian/plugin/plugin-settings-tab.mjs +4 -4
  171. package/dist/lib/esm/obsidian/plugin/plugin.d.mts +13 -11
  172. package/dist/lib/esm/obsidian/plugin/plugin.mjs +39 -34
  173. package/dist/lib/esm/obsidian/queue.d.mts +2 -2
  174. package/dist/lib/esm/obsidian/queue.mjs +1 -1
  175. package/dist/lib/esm/obsidian/rename-delete-handler.mjs +22 -12
  176. package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/checkbox-component.d.mts +1 -1
  177. package/dist/lib/esm/obsidian/setting-components/checkbox-component.mjs +101 -0
  178. package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/code-highlighter-component.d.mts +1 -1
  179. package/dist/lib/esm/obsidian/setting-components/code-highlighter-component.mjs +254 -0
  180. package/dist/lib/esm/obsidian/setting-components/date-component.mjs +62 -0
  181. package/dist/lib/esm/obsidian/setting-components/date-time-component.mjs +62 -0
  182. package/dist/lib/esm/obsidian/setting-components/email-component.mjs +72 -0
  183. package/dist/lib/esm/obsidian/setting-components/file-component.mjs +66 -0
  184. package/dist/lib/esm/obsidian/setting-components/index.mjs +78 -0
  185. package/dist/lib/esm/obsidian/setting-components/month-component.mjs +70 -0
  186. package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/multiple-dropdown-component.d.mts +1 -1
  187. package/dist/lib/esm/obsidian/setting-components/multiple-dropdown-component.mjs +136 -0
  188. package/dist/lib/esm/obsidian/setting-components/multiple-email-component.mjs +59 -0
  189. package/dist/lib/esm/obsidian/setting-components/multiple-file-component.mjs +68 -0
  190. package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/multiple-text-component.d.mts +1 -1
  191. package/dist/lib/esm/obsidian/setting-components/multiple-text-component.mjs +149 -0
  192. package/dist/lib/esm/obsidian/setting-components/number-component.mjs +82 -0
  193. package/dist/lib/esm/obsidian/setting-components/password-component.mjs +58 -0
  194. package/dist/lib/esm/obsidian/setting-components/setting-component-wrapper.mjs +45 -0
  195. package/dist/lib/esm/obsidian/setting-components/telephone-component.mjs +72 -0
  196. package/dist/lib/esm/obsidian/setting-components/text-based-component.mjs +58 -0
  197. package/dist/lib/esm/obsidian/setting-components/time-component.mjs +67 -0
  198. package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/tri-state-checkbox-component.d.mts +1 -1
  199. package/dist/lib/esm/obsidian/setting-components/tri-state-checkbox-component.mjs +102 -0
  200. package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/typed-dropdown-component.d.mts +1 -1
  201. package/dist/lib/esm/obsidian/setting-components/typed-dropdown-component.mjs +142 -0
  202. package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/typed-multiple-dropdown-component.d.mts +1 -1
  203. package/dist/lib/esm/obsidian/setting-components/typed-multiple-dropdown-component.mjs +141 -0
  204. package/dist/lib/esm/obsidian/setting-components/typed-range-text-component.mjs +60 -0
  205. package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/typed-text-component.d.mts +2 -2
  206. package/dist/lib/esm/obsidian/setting-components/typed-text-component.mjs +119 -0
  207. package/dist/lib/esm/obsidian/setting-components/url-component.mjs +72 -0
  208. package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/validator-component.d.mts +1 -1
  209. package/dist/lib/esm/obsidian/setting-components/validator-component.mjs +127 -0
  210. package/dist/lib/esm/obsidian/setting-components/week-component.mjs +70 -0
  211. package/dist/lib/esm/obsidian/setting-ex.d.mts +20 -20
  212. package/dist/lib/esm/obsidian/setting-ex.mjs +21 -21
  213. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.d.mts +2 -2
  214. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.mjs +1 -1
  215. package/dist/lib/esm/script-utils/linters/eslint-config.d.mts +2 -2
  216. package/dist/lib/esm/script-utils/linters/eslint-config.mjs +2 -1
  217. package/dist/lib/esm/type.mjs +1 -1
  218. package/obsidian/Components/abort-signal-component/package.json +6 -0
  219. package/obsidian/Components/{all-windows-event-handler → all-windows-event-component}/package.json +3 -3
  220. package/obsidian/Components/async-error-handler-component/package.json +6 -0
  221. package/obsidian/Components/console-debug-component/package.json +6 -0
  222. package/obsidian/Components/disposable-component/package.json +6 -0
  223. package/obsidian/Components/i18n-component/package.json +6 -0
  224. package/obsidian/Components/layout-ready-component/package.json +6 -0
  225. package/obsidian/Components/menu-event-registrar-component/package.json +6 -0
  226. package/obsidian/Components/monkey-around-component/package.json +6 -0
  227. package/obsidian/Components/plugin-context-component/package.json +6 -0
  228. package/obsidian/Components/plugin-notice-component/package.json +6 -0
  229. package/obsidian/Components/plugin-settings-component/package.json +6 -0
  230. package/obsidian/Components/plugin-settings-tab-component/package.json +6 -0
  231. package/obsidian/path-settings/package.json +6 -0
  232. package/obsidian/setting-components/checkbox-component/package.json +6 -0
  233. package/obsidian/setting-components/code-highlighter-component/package.json +6 -0
  234. package/obsidian/setting-components/date-component/package.json +6 -0
  235. package/obsidian/setting-components/date-time-component/package.json +6 -0
  236. package/obsidian/setting-components/email-component/package.json +6 -0
  237. package/obsidian/setting-components/file-component/package.json +6 -0
  238. package/obsidian/setting-components/index/package.json +6 -0
  239. package/obsidian/setting-components/month-component/package.json +6 -0
  240. package/obsidian/setting-components/multiple-dropdown-component/package.json +6 -0
  241. package/obsidian/setting-components/multiple-email-component/package.json +6 -0
  242. package/obsidian/setting-components/multiple-file-component/package.json +6 -0
  243. package/obsidian/setting-components/multiple-text-component/package.json +6 -0
  244. package/obsidian/setting-components/number-component/package.json +6 -0
  245. package/obsidian/setting-components/package.json +6 -0
  246. package/obsidian/setting-components/password-component/package.json +6 -0
  247. package/obsidian/setting-components/setting-component-wrapper/package.json +6 -0
  248. package/obsidian/setting-components/telephone-component/package.json +6 -0
  249. package/obsidian/setting-components/text-based-component/package.json +6 -0
  250. package/obsidian/setting-components/time-component/package.json +6 -0
  251. package/obsidian/setting-components/tri-state-checkbox-component/package.json +6 -0
  252. package/obsidian/setting-components/typed-dropdown-component/package.json +6 -0
  253. package/obsidian/setting-components/typed-multiple-dropdown-component/package.json +6 -0
  254. package/obsidian/setting-components/typed-range-text-component/package.json +6 -0
  255. package/obsidian/setting-components/typed-text-component/package.json +6 -0
  256. package/obsidian/setting-components/url-component/package.json +6 -0
  257. package/obsidian/setting-components/validator-component/package.json +6 -0
  258. package/obsidian/setting-components/value-component-with-change-tracking/package.json +6 -0
  259. package/obsidian/setting-components/week-component/package.json +6 -0
  260. package/package.json +23 -43
  261. package/dist/lib/cjs/obsidian/components/all-windows-event-handler.cjs +0 -196
  262. package/dist/lib/cjs/obsidian/components/setting-components/checkbox-component.cjs +0 -209
  263. package/dist/lib/cjs/obsidian/components/setting-components/code-highlighter-component.cjs +0 -356
  264. package/dist/lib/cjs/obsidian/components/setting-components/multiple-dropdown-component.cjs +0 -241
  265. package/dist/lib/cjs/obsidian/components/setting-components/multiple-text-component.cjs +0 -254
  266. package/dist/lib/cjs/obsidian/components/setting-components/tri-state-checkbox-component.cjs +0 -210
  267. package/dist/lib/cjs/obsidian/components/setting-components/typed-dropdown-component.cjs +0 -247
  268. package/dist/lib/cjs/obsidian/components/setting-components/typed-multiple-dropdown-component.cjs +0 -249
  269. package/dist/lib/cjs/obsidian/components/setting-components/typed-text-component.cjs +0 -224
  270. package/dist/lib/cjs/obsidian/components/setting-components/validator-component.cjs +0 -226
  271. package/dist/lib/cjs/obsidian/monkey-around.cjs +0 -177
  272. package/dist/lib/cjs/obsidian/monkey-around.d.cts +0 -62
  273. package/dist/lib/cjs/obsidian/plugin/components/index.cjs +0 -170
  274. package/dist/lib/cjs/obsidian/plugin/components/index.d.cts +0 -9
  275. package/dist/lib/cjs/obsidian/plugin/components/layout-ready-component.cjs +0 -124
  276. package/dist/lib/cjs/obsidian/plugin/components/layout-ready-component.d.cts +0 -18
  277. package/dist/lib/cjs/obsidian/plugin/components/plugin-settings-component.cjs +0 -563
  278. package/dist/lib/cjs/obsidian/plugin/path-settings.cjs +0 -239
  279. package/dist/lib/esm/obsidian/components/all-windows-event-handler.mjs +0 -88
  280. package/dist/lib/esm/obsidian/components/setting-components/checkbox-component.mjs +0 -101
  281. package/dist/lib/esm/obsidian/components/setting-components/code-highlighter-component.mjs +0 -254
  282. package/dist/lib/esm/obsidian/components/setting-components/date-component.mjs +0 -62
  283. package/dist/lib/esm/obsidian/components/setting-components/date-time-component.mjs +0 -62
  284. package/dist/lib/esm/obsidian/components/setting-components/email-component.mjs +0 -72
  285. package/dist/lib/esm/obsidian/components/setting-components/file-component.mjs +0 -66
  286. package/dist/lib/esm/obsidian/components/setting-components/index.mjs +0 -78
  287. package/dist/lib/esm/obsidian/components/setting-components/month-component.mjs +0 -70
  288. package/dist/lib/esm/obsidian/components/setting-components/multiple-dropdown-component.mjs +0 -136
  289. package/dist/lib/esm/obsidian/components/setting-components/multiple-email-component.mjs +0 -59
  290. package/dist/lib/esm/obsidian/components/setting-components/multiple-file-component.mjs +0 -68
  291. package/dist/lib/esm/obsidian/components/setting-components/multiple-text-component.mjs +0 -149
  292. package/dist/lib/esm/obsidian/components/setting-components/number-component.mjs +0 -82
  293. package/dist/lib/esm/obsidian/components/setting-components/password-component.mjs +0 -58
  294. package/dist/lib/esm/obsidian/components/setting-components/setting-component-wrapper.mjs +0 -45
  295. package/dist/lib/esm/obsidian/components/setting-components/telephone-component.mjs +0 -72
  296. package/dist/lib/esm/obsidian/components/setting-components/text-based-component.mjs +0 -58
  297. package/dist/lib/esm/obsidian/components/setting-components/time-component.mjs +0 -67
  298. package/dist/lib/esm/obsidian/components/setting-components/tri-state-checkbox-component.mjs +0 -102
  299. package/dist/lib/esm/obsidian/components/setting-components/typed-dropdown-component.mjs +0 -142
  300. package/dist/lib/esm/obsidian/components/setting-components/typed-multiple-dropdown-component.mjs +0 -141
  301. package/dist/lib/esm/obsidian/components/setting-components/typed-range-text-component.mjs +0 -60
  302. package/dist/lib/esm/obsidian/components/setting-components/typed-text-component.mjs +0 -119
  303. package/dist/lib/esm/obsidian/components/setting-components/url-component.mjs +0 -72
  304. package/dist/lib/esm/obsidian/components/setting-components/validator-component.mjs +0 -127
  305. package/dist/lib/esm/obsidian/components/setting-components/week-component.mjs +0 -70
  306. package/dist/lib/esm/obsidian/monkey-around.d.mts +0 -62
  307. package/dist/lib/esm/obsidian/monkey-around.mjs +0 -66
  308. package/dist/lib/esm/obsidian/plugin/components/abort-signal-component.mjs +0 -59
  309. package/dist/lib/esm/obsidian/plugin/components/async-error-handler-component.mjs +0 -62
  310. package/dist/lib/esm/obsidian/plugin/components/console-debug-component.mjs +0 -56
  311. package/dist/lib/esm/obsidian/plugin/components/i18n-component.mjs +0 -53
  312. package/dist/lib/esm/obsidian/plugin/components/index.d.mts +0 -9
  313. package/dist/lib/esm/obsidian/plugin/components/index.mjs +0 -44
  314. package/dist/lib/esm/obsidian/plugin/components/layout-ready-component.d.mts +0 -18
  315. package/dist/lib/esm/obsidian/plugin/components/layout-ready-component.mjs +0 -24
  316. package/dist/lib/esm/obsidian/plugin/components/plugin-context-component.mjs +0 -61
  317. package/dist/lib/esm/obsidian/plugin/components/plugin-notice-component.mjs +0 -60
  318. package/dist/lib/esm/obsidian/plugin/components/plugin-settings-component.mjs +0 -461
  319. package/dist/lib/esm/obsidian/plugin/components/plugin-settings-tab-component.mjs +0 -49
  320. package/dist/lib/esm/obsidian/plugin/path-settings.mjs +0 -135
  321. package/obsidian/Components/setting-components/checkbox-component/package.json +0 -6
  322. package/obsidian/Components/setting-components/code-highlighter-component/package.json +0 -6
  323. package/obsidian/Components/setting-components/date-component/package.json +0 -6
  324. package/obsidian/Components/setting-components/date-time-component/package.json +0 -6
  325. package/obsidian/Components/setting-components/email-component/package.json +0 -6
  326. package/obsidian/Components/setting-components/file-component/package.json +0 -6
  327. package/obsidian/Components/setting-components/index/package.json +0 -6
  328. package/obsidian/Components/setting-components/month-component/package.json +0 -6
  329. package/obsidian/Components/setting-components/multiple-dropdown-component/package.json +0 -6
  330. package/obsidian/Components/setting-components/multiple-email-component/package.json +0 -6
  331. package/obsidian/Components/setting-components/multiple-file-component/package.json +0 -6
  332. package/obsidian/Components/setting-components/multiple-text-component/package.json +0 -6
  333. package/obsidian/Components/setting-components/number-component/package.json +0 -6
  334. package/obsidian/Components/setting-components/package.json +0 -6
  335. package/obsidian/Components/setting-components/password-component/package.json +0 -6
  336. package/obsidian/Components/setting-components/setting-component-wrapper/package.json +0 -6
  337. package/obsidian/Components/setting-components/telephone-component/package.json +0 -6
  338. package/obsidian/Components/setting-components/text-based-component/package.json +0 -6
  339. package/obsidian/Components/setting-components/time-component/package.json +0 -6
  340. package/obsidian/Components/setting-components/tri-state-checkbox-component/package.json +0 -6
  341. package/obsidian/Components/setting-components/typed-dropdown-component/package.json +0 -6
  342. package/obsidian/Components/setting-components/typed-multiple-dropdown-component/package.json +0 -6
  343. package/obsidian/Components/setting-components/typed-range-text-component/package.json +0 -6
  344. package/obsidian/Components/setting-components/typed-text-component/package.json +0 -6
  345. package/obsidian/Components/setting-components/url-component/package.json +0 -6
  346. package/obsidian/Components/setting-components/validator-component/package.json +0 -6
  347. package/obsidian/Components/setting-components/value-component-with-change-tracking/package.json +0 -6
  348. package/obsidian/Components/setting-components/week-component/package.json +0 -6
  349. package/obsidian/Plugin/components/abort-signal-component/package.json +0 -6
  350. package/obsidian/Plugin/components/async-error-handler-component/package.json +0 -6
  351. package/obsidian/Plugin/components/console-debug-component/package.json +0 -6
  352. package/obsidian/Plugin/components/i18n-component/package.json +0 -6
  353. package/obsidian/Plugin/components/index/package.json +0 -6
  354. package/obsidian/Plugin/components/layout-ready-component/package.json +0 -6
  355. package/obsidian/Plugin/components/package.json +0 -6
  356. package/obsidian/Plugin/components/plugin-context-component/package.json +0 -6
  357. package/obsidian/Plugin/components/plugin-notice-component/package.json +0 -6
  358. package/obsidian/Plugin/components/plugin-settings-component/package.json +0 -6
  359. package/obsidian/Plugin/components/plugin-settings-tab-component/package.json +0 -6
  360. package/obsidian/Plugin/path-settings/package.json +0 -6
  361. package/obsidian/monkey-around/package.json +0 -6
  362. /package/dist/lib/cjs/obsidian/{plugin/path-settings.d.cts → path-settings.d.cts} +0 -0
  363. /package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/date-component.d.cts +0 -0
  364. /package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/date-time-component.d.cts +0 -0
  365. /package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/email-component.d.cts +0 -0
  366. /package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/file-component.d.cts +0 -0
  367. /package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/index.d.cts +0 -0
  368. /package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/month-component.d.cts +0 -0
  369. /package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/multiple-email-component.d.cts +0 -0
  370. /package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/multiple-file-component.d.cts +0 -0
  371. /package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/number-component.d.cts +0 -0
  372. /package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/password-component.d.cts +0 -0
  373. /package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/setting-component-wrapper.d.cts +0 -0
  374. /package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/telephone-component.d.cts +0 -0
  375. /package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/text-based-component.d.cts +0 -0
  376. /package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/time-component.d.cts +0 -0
  377. /package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/typed-range-text-component.d.cts +0 -0
  378. /package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/url-component.d.cts +0 -0
  379. /package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/value-component-with-change-tracking.d.cts +0 -0
  380. /package/dist/lib/cjs/obsidian/{components/setting-components → setting-components}/week-component.d.cts +0 -0
  381. /package/dist/lib/esm/obsidian/{plugin/path-settings.d.mts → path-settings.d.mts} +0 -0
  382. /package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/date-component.d.mts +0 -0
  383. /package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/date-time-component.d.mts +0 -0
  384. /package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/email-component.d.mts +0 -0
  385. /package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/file-component.d.mts +0 -0
  386. /package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/index.d.mts +0 -0
  387. /package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/month-component.d.mts +0 -0
  388. /package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/multiple-email-component.d.mts +0 -0
  389. /package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/multiple-file-component.d.mts +0 -0
  390. /package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/number-component.d.mts +0 -0
  391. /package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/password-component.d.mts +0 -0
  392. /package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/setting-component-wrapper.d.mts +0 -0
  393. /package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/telephone-component.d.mts +0 -0
  394. /package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/text-based-component.d.mts +0 -0
  395. /package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/time-component.d.mts +0 -0
  396. /package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/typed-range-text-component.d.mts +0 -0
  397. /package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/url-component.d.mts +0 -0
  398. /package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/value-component-with-change-tracking.d.mts +0 -0
  399. /package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/value-component-with-change-tracking.mjs +0 -0
  400. /package/dist/lib/esm/obsidian/{components/setting-components → setting-components}/week-component.d.mts +0 -0
@@ -1,563 +0,0 @@
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 initCjs() {
7
- // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
8
- const globalThisRecord = globalThis;
9
- globalThisRecord['__name'] ??= name;
10
- const originalRequire = require;
11
- if (originalRequire && !originalRequire.__isPatched) {
12
- // eslint-disable-next-line no-global-assign, no-implicit-globals -- We need to patch the `require()` function.
13
- require = Object.assign(
14
- (id) => requirePatched(id),
15
- originalRequire,
16
- {
17
- __isPatched: true
18
- }
19
- );
20
- }
21
-
22
- const newFuncs = {
23
- __extractDefault() {
24
- return extractDefault;
25
- },
26
- process() {
27
- const browserProcess = {
28
- browser: true,
29
- cwd() {
30
- return '/';
31
- },
32
- env: {},
33
- platform: 'android'
34
- };
35
- return browserProcess;
36
- }
37
- };
38
-
39
- for (const key of Object.keys(newFuncs)) {
40
- globalThisRecord[key] ??= newFuncs[key]?.();
41
- }
42
-
43
- function name(obj) {
44
- return obj;
45
- }
46
-
47
- function extractDefault(module) {
48
- return module && module.__esModule && 'default' in module ? module.default : module;
49
- }
50
-
51
- const OBSIDIAN_BUILT_IN_MODULE_NAMES = [
52
- 'obsidian',
53
- '@codemirror/autocomplete',
54
- '@codemirror/collab',
55
- '@codemirror/commands',
56
- '@codemirror/language',
57
- '@codemirror/lint',
58
- '@codemirror/search',
59
- '@codemirror/state',
60
- '@codemirror/text',
61
- '@codemirror/view',
62
- '@lezer/common',
63
- '@lezer/lr',
64
- '@lezer/highlight'];
65
-
66
-
67
- const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = [
68
- '@codemirror/closebrackets',
69
- '@codemirror/comment',
70
- '@codemirror/fold',
71
- '@codemirror/gutter',
72
- '@codemirror/highlight',
73
- '@codemirror/history',
74
- '@codemirror/matchbrackets',
75
- '@codemirror/panel',
76
- '@codemirror/rangeset',
77
- '@codemirror/rectangular-selection',
78
- '@codemirror/stream-parser',
79
- '@codemirror/tooltip'];
80
-
81
-
82
- function requirePatched(id) {
83
- if (OBSIDIAN_BUILT_IN_MODULE_NAMES.includes(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.includes(id)) {
84
- return originalRequire?.(id);
85
- }
86
-
87
- // eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
88
- if (globalThis.app.isMobile) {
89
- if (id === 'process' || id === 'node:process') {
90
- // eslint-disable-next-line no-console -- Valid usage.
91
- console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
92
- // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
93
- return globalThis.process;
94
- }
95
- } else {
96
- const module = originalRequire?.(id);
97
- if (module) {
98
- return extractDefault(module);
99
- }
100
- }
101
-
102
- // eslint-disable-next-line no-console -- Valid usage.
103
- console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
104
- return {};
105
- }
106
- })();
107
-
108
- "use strict";
109
- var __defProp = Object.defineProperty;
110
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
111
- var __getOwnPropNames = Object.getOwnPropertyNames;
112
- var __hasOwnProp = Object.prototype.hasOwnProperty;
113
- var __export = (target, all) => {
114
- for (var name in all)
115
- __defProp(target, name, { get: all[name], enumerable: true });
116
- };
117
- var __copyProps = (to, from, except, desc) => {
118
- if (from && typeof from === "object" || typeof from === "function") {
119
- for (let key of __getOwnPropNames(from))
120
- if (!__hasOwnProp.call(to, key) && key !== except)
121
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
122
- }
123
- return to;
124
- };
125
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
126
- var plugin_settings_component_exports = {};
127
- __export(plugin_settings_component_exports, {
128
- EmptyPluginSettingsComponent: () => EmptyPluginSettingsComponent,
129
- PluginSettingsComponentBase: () => PluginSettingsComponentBase
130
- });
131
- module.exports = __toCommonJS(plugin_settings_component_exports);
132
- var import_async_events = require('../../../async-events.cjs');
133
- var import_debug = require('../../../debug.cjs');
134
- var import_function = require('../../../function.cjs');
135
- var import_object_utils = require('../../../object-utils.cjs');
136
- var import_date_transformer = require('../../../transformers/date-transformer.cjs');
137
- var import_duration_transformer = require('../../../transformers/duration-transformer.cjs');
138
- var import_group_transformer = require('../../../transformers/group-transformer.cjs');
139
- var import_map_transformer = require('../../../transformers/map-transformer.cjs');
140
- var import_set_transformer = require('../../../transformers/set-transformer.cjs');
141
- var import_skip_private_property_transformer = require('../../../transformers/skip-private-property-transformer.cjs');
142
- var import_two_way_map_transformer = require('../../../transformers/two-way-map-transformer.cjs');
143
- var import_async_component = require('../../components/async-component.cjs');
144
- var import_async_events_component = require('../../components/async-events-component.cjs');
145
- const defaultTransformer = new import_group_transformer.GroupTransformer([
146
- new import_skip_private_property_transformer.SkipPrivatePropertyTransformer(),
147
- new import_date_transformer.DateTransformer(),
148
- new import_duration_transformer.DurationTransformer(),
149
- new import_map_transformer.MapTransformer(),
150
- new import_set_transformer.SetTransformer(),
151
- new import_two_way_map_transformer.TwoWayMapTransformer()
152
- ]);
153
- class EmptyDataHandler {
154
- async loadData() {
155
- await (0, import_function.noopAsync)();
156
- return {};
157
- }
158
- /* v8 ignore start -- unreachable because EmptyPluginSettingsComponent has no properties to change, so saveToFile always short-circuits. */
159
- async saveData() {
160
- await (0, import_function.noopAsync)();
161
- }
162
- /* v8 ignore stop */
163
- }
164
- class PluginSettingsComponentBase extends import_async_component.AsyncComponentBase {
165
- /**
166
- * Creates a new plugin settings component.
167
- *
168
- * @param dataHandler - The data handler.
169
- */
170
- constructor(dataHandler) {
171
- super();
172
- this.dataHandler = dataHandler;
173
- this.defaultSettings = this.createDefaultSettings();
174
- this.currentState = this.createDefaultState();
175
- this.lastSavedState = this.createDefaultState();
176
- this.propertyNames = (0, import_object_utils.getAllKeys)(this.currentState.inputValues);
177
- this.registerValidators();
178
- this.registerLegacySettingsConverters();
179
- }
180
- dataHandler;
181
- /**
182
- * Component key for singleton replacement via {@link PluginBase.addChild}.
183
- */
184
- static COMPONENT_KEY = Symbol(PluginSettingsComponentBase.name);
185
- /**
186
- * Gets the readonly default settings.
187
- *
188
- * @returns The default settings (as a readonly object).
189
- */
190
- defaultSettings;
191
- /**
192
- * Gets the readonly effective settings (validated, with defaults substituted for invalid values).
193
- *
194
- * @returns The readonly effective settings.
195
- */
196
- get settings() {
197
- return this.settingsState.effectiveValues;
198
- }
199
- /**
200
- * Gets the current settings state snapshot.
201
- *
202
- * @returns The current settings state.
203
- */
204
- get settingsState() {
205
- return this.currentState;
206
- }
207
- asyncEvents = new import_async_events.AsyncEvents();
208
- currentState;
209
- lastSavedState;
210
- legacySettingsConverters = [];
211
- propertyNames;
212
- validators = /* @__PURE__ */ new Map();
213
- /**
214
- * Edits the plugin settings and saves them.
215
- *
216
- * @param settingsEditor - The editor.
217
- * @param context - The context.
218
- * @returns A {@link Promise} that resolves when the settings are saved.
219
- */
220
- async editAndSave(settingsEditor, context) {
221
- await this.edit(settingsEditor);
222
- await this.saveToFile(context);
223
- }
224
- /**
225
- * Ensures the settings are safe.
226
- *
227
- * It runs validation for each property and sets the default value if the validation fails.
228
- *
229
- * @param settings - The settings.
230
- * @returns A {@link Promise} that resolves when the settings are safe.
231
- */
232
- async ensureSafe(settings) {
233
- const validationResult = await this.validate(settings);
234
- const defaults = this.defaultSettings;
235
- for (const propertyName of this.propertyNames) {
236
- if (validationResult[propertyName]) {
237
- settings[propertyName] = defaults[propertyName];
238
- }
239
- }
240
- }
241
- /**
242
- * Gets a safe copy of the settings.
243
- *
244
- * @param settings - The settings.
245
- * @returns A {@link Promise} that resolves to the safe copy of the settings.
246
- */
247
- async getSafeCopy(settings) {
248
- const safeSettings = await this.cloneSettings(settings);
249
- await this.ensureSafe(safeSettings);
250
- return safeSettings;
251
- }
252
- /**
253
- * Loads the plugin settings from the file.
254
- *
255
- * @param isInitialLoad - Whether the settings are being loaded for the first time.
256
- * @returns A {@link Promise} that resolves when the settings are loaded.
257
- */
258
- async loadFromFile(isInitialLoad) {
259
- const data = await this.dataHandler.loadData();
260
- this.lastSavedState = this.createDefaultState();
261
- this.currentState = this.createDefaultState();
262
- try {
263
- if (data === void 0 || data === null) {
264
- return;
265
- }
266
- if (typeof data !== "object") {
267
- console.error(`Invalid settings from data.json. Expected Object, got: ${typeof data}`);
268
- return;
269
- }
270
- const rawRecord = data;
271
- const parsedSettings = await this.rawRecordToSettings(rawRecord);
272
- const validationResult = await this.validate(parsedSettings);
273
- for (const propertyName of this.propertyNames) {
274
- this.setPropertyImpl(propertyName, parsedSettings[propertyName], validationResult[propertyName]);
275
- }
276
- this.lastSavedState = await this.cloneState(this.currentState);
277
- const newRecord = await this.settingsToRawRecord(this.currentState.inputValues);
278
- if (!(0, import_object_utils.deepEqual)(newRecord, data)) {
279
- await this.saveToFileImpl();
280
- }
281
- } finally {
282
- await this.asyncEvents.triggerAsync("loadSettings", this.currentState, isInitialLoad);
283
- }
284
- }
285
- /**
286
- * Subscribes to an event.
287
- *
288
- * @param name - The name of the event.
289
- * @param callback - The callback.
290
- * @param thisArg - The `this` context.
291
- * @returns A reference to the event listener.
292
- */
293
- on(name, callback, thisArg) {
294
- return this.asyncEvents.on(name, callback, thisArg);
295
- }
296
- /**
297
- * Called when the external settings change.
298
- *
299
- * @returns A {@link Promise} that resolves when the settings are reloaded.
300
- */
301
- async onExternalSettingsChange() {
302
- await this.loadFromFile(false);
303
- }
304
- /**
305
- * Loads settings from file and registers event handlers.
306
- */
307
- async onload() {
308
- await super.onload();
309
- (0, import_async_events_component.registerAsyncEvent)(this, this.on("loadSettings", this.onLoadSettings.bind(this)));
310
- (0, import_async_events_component.registerAsyncEvent)(this, this.on("saveSettings", this.onSaveSettings.bind(this)));
311
- await this.loadFromFile(true);
312
- }
313
- /**
314
- * Registers a legacy settings converter.
315
- *
316
- * @typeParam LegacySettings - The legacy settings class.
317
- * @param legacySettingsClass - The legacy settings class.
318
- * @param converter - The converter.
319
- */
320
- registerLegacySettingsConverter(legacySettingsClass, converter) {
321
- const that = this;
322
- this.legacySettingsConverters.push(legacySettingsConverter);
323
- function legacySettingsConverter(record) {
324
- const legacySettingsKeys = new Set(Object.keys(new legacySettingsClass()));
325
- const pluginSettingKeys = new Set(that.propertyNames);
326
- const legacySettings = record;
327
- converter(legacySettings);
328
- for (const key of Object.keys(legacySettings)) {
329
- if (pluginSettingKeys.has(key)) {
330
- continue;
331
- }
332
- if (!legacySettingsKeys.has(key)) {
333
- continue;
334
- }
335
- delete record[key];
336
- }
337
- }
338
- }
339
- /**
340
- * Registers a validator for a property.
341
- *
342
- * @param propertyName - The name of the property.
343
- * @param validator - The validator.
344
- */
345
- registerValidator(propertyName, validator) {
346
- this.validators.set(propertyName, validator);
347
- }
348
- /**
349
- * Revalidates the settings.
350
- *
351
- * @returns The validation messages.
352
- */
353
- async revalidate() {
354
- await this.edit(import_function.noop);
355
- return this.currentState.validationMessages;
356
- }
357
- /**
358
- * Saves the new plugin settings.
359
- *
360
- * @param context - The context of the save to file operation.
361
- * @returns A {@link Promise} that resolves when the settings are saved.
362
- */
363
- async saveToFile(context) {
364
- if ((0, import_object_utils.deepEqual)(this.lastSavedState.inputValues, this.currentState.inputValues)) {
365
- return;
366
- }
367
- await this.saveToFileImpl();
368
- await this.asyncEvents.triggerAsync("saveSettings", this.currentState, this.lastSavedState, context);
369
- this.lastSavedState = await this.cloneState(this.currentState);
370
- }
371
- /**
372
- * Sets the value of a property.
373
- *
374
- * @typeParam PropertyName - The name of the property.
375
- * @param propertyName - The name of the property.
376
- * @param value - The value to set.
377
- * @returns A {@link Promise} that resolves to the validation message.
378
- */
379
- async setProperty(propertyName, value) {
380
- await this.edit((settings) => {
381
- settings[propertyName] = value;
382
- });
383
- return this.currentState.validationMessages[propertyName];
384
- }
385
- /**
386
- * Validates the settings.
387
- *
388
- * @param settings - The settings.
389
- * @returns A {@link Promise} that resolves to the validation result.
390
- */
391
- async validate(settings) {
392
- const result = {};
393
- for (const [propertyName, validator] of this.validators.entries()) {
394
- const validationMessage = await validator(settings[propertyName], settings);
395
- if (validationMessage) {
396
- result[propertyName] = validationMessage;
397
- }
398
- }
399
- return result;
400
- }
401
- /**
402
- * Gets the transformer.
403
- *
404
- * @returns The transformer.
405
- */
406
- getTransformer() {
407
- return defaultTransformer;
408
- }
409
- /**
410
- * Called when the plugin settings record is loaded from disk.
411
- *
412
- * @param record - The record.
413
- */
414
- async onLoadRecord(record) {
415
- for (const converter of this.legacySettingsConverters) {
416
- converter(record);
417
- }
418
- await Promise.resolve();
419
- }
420
- /**
421
- * Called when settings are loaded or reloaded.
422
- *
423
- * @param _loadedState - The loaded settings state.
424
- * @param _isInitialLoad - Whether this is the initial load.
425
- */
426
- async onLoadSettings(_loadedState, _isInitialLoad) {
427
- await (0, import_function.noopAsync)();
428
- }
429
- /**
430
- * Called when settings are saved.
431
- *
432
- * @param _newState - The new settings state.
433
- * @param _oldState - The old settings state.
434
- * @param _context - The save context.
435
- */
436
- async onSaveSettings(_newState, _oldState, _context) {
437
- await (0, import_function.noopAsync)();
438
- }
439
- /**
440
- * Called when the plugin settings record is about to be saved to disk.
441
- *
442
- * @param _record - The record.
443
- */
444
- async onSavingRecord(_record) {
445
- await (0, import_function.noopAsync)();
446
- }
447
- /**
448
- * Registers the legacy settings converters.
449
- * Override to register legacy settings converters.
450
- */
451
- registerLegacySettingsConverters() {
452
- (0, import_function.noop)();
453
- }
454
- /**
455
- * Registers the validators.
456
- * Override to register validators for properties.
457
- */
458
- registerValidators() {
459
- (0, import_function.noop)();
460
- }
461
- async cloneSettings(settings) {
462
- const record = await this.settingsToRawRecord(settings);
463
- const json = JSON.stringify(record);
464
- const cloneRecord = JSON.parse(json);
465
- return await this.rawRecordToSettings(cloneRecord);
466
- }
467
- async cloneState(state) {
468
- return {
469
- effectiveValues: await this.cloneSettings(state.effectiveValues),
470
- inputValues: await this.cloneSettings(state.inputValues),
471
- validationMessages: { ...state.validationMessages }
472
- };
473
- }
474
- createDefaultState() {
475
- return {
476
- effectiveValues: this.createDefaultSettings(),
477
- inputValues: this.createDefaultSettings(),
478
- validationMessages: (0, import_object_utils.castTo)({})
479
- };
480
- }
481
- async edit(settingsEditor) {
482
- try {
483
- await settingsEditor(this.currentState.inputValues);
484
- } finally {
485
- const validationResult = await this.validate(this.currentState.inputValues);
486
- for (const propertyName of this.propertyNames) {
487
- const validationMessage = validationResult[propertyName] ?? "";
488
- this.currentState.validationMessages[propertyName] = validationMessage;
489
- const defaults = this.defaultSettings;
490
- this.currentState.effectiveValues[propertyName] = validationMessage ? defaults[propertyName] : this.currentState.inputValues[propertyName];
491
- }
492
- }
493
- }
494
- isValidPropertyName(prop) {
495
- if (typeof prop !== "string") {
496
- return false;
497
- }
498
- return this.propertyNames.includes(prop);
499
- }
500
- async rawRecordToSettings(rawRecord) {
501
- rawRecord = this.getTransformer().transformObjectRecursively(rawRecord);
502
- await this.onLoadRecord(rawRecord);
503
- const settings = this.createDefaultSettings();
504
- const defaults = this.defaultSettings;
505
- for (const [propertyName, value] of Object.entries(rawRecord)) {
506
- if (!this.isValidPropertyName(propertyName)) {
507
- (0, import_debug.getLibDebugger)("PluginSettingsComponentBase:rawRecordToSettings")(`Unknown property: ${propertyName}`);
508
- continue;
509
- }
510
- if (typeof value !== typeof defaults[propertyName]) {
511
- (0, import_debug.getLibDebugger)("PluginSettingsComponentBase:rawRecordToSettings")(
512
- "Possible invalid value type. It might lead to an unexpected behavior of the plugin. There is also a chance it is a false-negative warning, as we are unable to determine the exact type of the value in runtime.",
513
- {
514
- defaultValue: defaults[propertyName],
515
- propertyName,
516
- value
517
- }
518
- );
519
- }
520
- settings[propertyName] = value;
521
- }
522
- return settings;
523
- }
524
- async saveToFileImpl() {
525
- await this.dataHandler.saveData(await this.settingsToRawRecord(this.currentState.inputValues));
526
- }
527
- setPropertyImpl(propertyName, value, validationMessage) {
528
- const defaults = this.defaultSettings;
529
- this.currentState.inputValues[propertyName] = value;
530
- this.currentState.validationMessages[propertyName] = validationMessage ?? "";
531
- this.currentState.effectiveValues[propertyName] = validationMessage ? defaults[propertyName] : value;
532
- }
533
- async settingsToRawRecord(settings) {
534
- const rawRecord = {};
535
- for (const propertyName of this.propertyNames) {
536
- rawRecord[propertyName] = settings[propertyName];
537
- }
538
- await this.onSavingRecord(rawRecord);
539
- return this.getTransformer().transformObjectRecursively(rawRecord);
540
- }
541
- }
542
- class EmptyPluginSettingsComponent extends PluginSettingsComponentBase {
543
- /**
544
- * Creates a new empty plugin settings component.
545
- */
546
- constructor() {
547
- super(new EmptyDataHandler());
548
- }
549
- /**
550
- * Creates empty default settings.
551
- *
552
- * @returns An empty object.
553
- */
554
- createDefaultSettings() {
555
- return {};
556
- }
557
- }
558
- // Annotate the CommonJS export names for ESM import in node:
559
- 0 && (module.exports = {
560
- EmptyPluginSettingsComponent,
561
- PluginSettingsComponentBase
562
- });
563
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3BsdWdpbi9jb21wb25lbnRzL3BsdWdpbi1zZXR0aW5ncy1jb21wb25lbnQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDb21wb25lbnQgdGhhdCBtYW5hZ2VzIHBsdWdpbiBzZXR0aW5nczogZGF0YSwgcGVyc2lzdGVuY2UsIHZhbGlkYXRpb24sIGFuZCBldmVudHMuXG4gKlxuICogVGhpcyBpcyB0aGUgc2luZ2xlIHB1YmxpYy1mYWNpbmcgc2V0dGluZ3MgQVBJIGZvciBwbHVnaW4gYXV0aG9ycy5cbiAqIEFsbCBzZXR0aW5ncyBsb2dpYyAobG9hZCwgc2F2ZSwgdmFsaWRhdGUsIHRyYW5zZm9ybSwgY2xvbmUpIGlzIGhhbmRsZWQgZGlyZWN0bHlcbiAqIGJ5IHRoaXMgY29tcG9uZW50IFx1MjAxNCBubyBzZXBhcmF0ZSBtYW5hZ2VyIGNsYXNzIGlzIG5lZWRlZC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIFByb21pc2FibGUsXG4gIFJlYWRvbmx5RGVlcFxufSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IEFzeW5jRXZlbnRSZWYgfSBmcm9tICcuLi8uLi8uLi9hc3luYy1ldmVudHMudHMnO1xuaW1wb3J0IHR5cGUgeyBUcmFuc2Zvcm1lciB9IGZyb20gJy4uLy4uLy4uL3RyYW5zZm9ybWVycy90cmFuc2Zvcm1lci50cyc7XG5pbXBvcnQgdHlwZSB7IEdlbmVyaWNPYmplY3QgfSBmcm9tICcuLi8uLi8uLi90eXBlLWd1YXJkcy50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIE1heWJlUmV0dXJuLFxuICBTdHJpbmdLZXlzXG59IGZyb20gJy4uLy4uLy4uL3R5cGUudHMnO1xuaW1wb3J0IHR5cGUgeyBEYXRhSGFuZGxlciB9IGZyb20gJy4uLy4uL2RhdGEtaGFuZGxlci50cyc7XG5cbmltcG9ydCB7IEFzeW5jRXZlbnRzIH0gZnJvbSAnLi4vLi4vLi4vYXN5bmMtZXZlbnRzLnRzJztcbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnLi4vLi4vLi4vZGVidWcudHMnO1xuaW1wb3J0IHtcbiAgbm9vcCxcbiAgbm9vcEFzeW5jXG59IGZyb20gJy4uLy4uLy4uL2Z1bmN0aW9uLnRzJztcbmltcG9ydCB7XG4gIGNhc3RUbyxcbiAgZGVlcEVxdWFsLFxuICBnZXRBbGxLZXlzXG59IGZyb20gJy4uLy4uLy4uL29iamVjdC11dGlscy50cyc7XG5pbXBvcnQgeyBEYXRlVHJhbnNmb3JtZXIgfSBmcm9tICcuLi8uLi8uLi90cmFuc2Zvcm1lcnMvZGF0ZS10cmFuc2Zvcm1lci50cyc7XG5pbXBvcnQgeyBEdXJhdGlvblRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vLi4vLi4vdHJhbnNmb3JtZXJzL2R1cmF0aW9uLXRyYW5zZm9ybWVyLnRzJztcbmltcG9ydCB7IEdyb3VwVHJhbnNmb3JtZXIgfSBmcm9tICcuLi8uLi8uLi90cmFuc2Zvcm1lcnMvZ3JvdXAtdHJhbnNmb3JtZXIudHMnO1xuaW1wb3J0IHsgTWFwVHJhbnNmb3JtZXIgfSBmcm9tICcuLi8uLi8uLi90cmFuc2Zvcm1lcnMvbWFwLXRyYW5zZm9ybWVyLnRzJztcbmltcG9ydCB7IFNldFRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vLi4vLi4vdHJhbnNmb3JtZXJzL3NldC10cmFuc2Zvcm1lci50cyc7XG5pbXBvcnQgeyBTa2lwUHJpdmF0ZVByb3BlcnR5VHJhbnNmb3JtZXIgfSBmcm9tICcuLi8uLi8uLi90cmFuc2Zvcm1lcnMvc2tpcC1wcml2YXRlLXByb3BlcnR5LXRyYW5zZm9ybWVyLnRzJztcbmltcG9ydCB7IFR3b1dheU1hcFRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vLi4vLi4vdHJhbnNmb3JtZXJzL3R3by13YXktbWFwLXRyYW5zZm9ybWVyLnRzJztcbmltcG9ydCB7IEFzeW5jQ29tcG9uZW50QmFzZSB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvYXN5bmMtY29tcG9uZW50LnRzJztcbmltcG9ydCB7IHJlZ2lzdGVyQXN5bmNFdmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvYXN5bmMtZXZlbnRzLWNvbXBvbmVudC50cyc7XG5cbmNvbnN0IGRlZmF1bHRUcmFuc2Zvcm1lciA9IG5ldyBHcm91cFRyYW5zZm9ybWVyKFtcbiAgbmV3IFNraXBQcml2YXRlUHJvcGVydHlUcmFuc2Zvcm1lcigpLFxuICBuZXcgRGF0ZVRyYW5zZm9ybWVyKCksXG4gIG5ldyBEdXJhdGlvblRyYW5zZm9ybWVyKCksXG4gIG5ldyBNYXBUcmFuc2Zvcm1lcigpLFxuICBuZXcgU2V0VHJhbnNmb3JtZXIoKSxcbiAgbmV3IFR3b1dheU1hcFRyYW5zZm9ybWVyKClcbl0pO1xuXG4vKipcbiAqIEEgc25hcHNob3Qgb2YgcGx1Z2luIHNldHRpbmdzIHN0YXRlLCBpbmNsdWRpbmcgcmF3IGlucHV0IHZhbHVlcywgZWZmZWN0aXZlICh2YWxpZGF0ZWQpIHZhbHVlcyxcbiAqIGFuZCBwZXItcHJvcGVydHkgdmFsaWRhdGlvbiBtZXNzYWdlcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFBsdWdpblNldHRpbmdzIC0gVGhlIHR5cGUgb2YgdGhlIHBsdWdpbiBzZXR0aW5ncy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0PiB7XG4gIC8qKlxuICAgKiBUaGUgZWZmZWN0aXZlIHNldHRpbmdzIHZhbHVlcyB1c2VkIGJ5IHRoZSBwbHVnaW4uIEludmFsaWQgcHJvcGVydGllcyBhcmUgcmVwbGFjZWQgd2l0aCBkZWZhdWx0cy5cbiAgICovXG4gIGVmZmVjdGl2ZVZhbHVlczogUGx1Z2luU2V0dGluZ3M7XG5cbiAgLyoqXG4gICAqIFRoZSByYXcgaW5wdXQgdmFsdWVzIGFzIGVudGVyZWQgYnkgdGhlIHVzZXIuIE1heSBjb250YWluIGludmFsaWQgdmFsdWVzLlxuICAgKi9cbiAgaW5wdXRWYWx1ZXM6IFBsdWdpblNldHRpbmdzO1xuXG4gIC8qKlxuICAgKiBQZXItcHJvcGVydHkgdmFsaWRhdGlvbiBtZXNzYWdlcy4gRW1wdHkgc3RyaW5nIG1lYW5zIHZhbGlkLlxuICAgKi9cbiAgdmFsaWRhdGlvbk1lc3NhZ2VzOiBSZWNvcmQ8U3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz4sIHN0cmluZz47XG59XG5cbi8qKlxuICogUmVhZG9ubHkgdmVyc2lvbiBvZiB7QGxpbmsgUGx1Z2luU2V0dGluZ3N9LlxuICpcbiAqIEB0eXBlUGFyYW0gUGx1Z2luU2V0dGluZ3MgLSBUaGUgdHlwZSBvZiB0aGUgcGx1Z2luIHNldHRpbmdzLlxuICovXG5leHBvcnQgdHlwZSBSZWFkb25seVBsdWdpblNldHRpbmdzPFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0PiA9IFJlYWRvbmx5RGVlcDxQbHVnaW5TZXR0aW5ncz47XG5cbi8qKlxuICogUmVhZG9ubHkgdmVyc2lvbiBvZiB7QGxpbmsgUGx1Z2luU2V0dGluZ3NTdGF0ZX0gZm9yIHVzZSBpbiBldmVudCBjYWxsYmFja3MgYW5kIHB1YmxpYyBnZXR0ZXJzLlxuICpcbiAqIEB0eXBlUGFyYW0gUGx1Z2luU2V0dGluZ3MgLSBUaGUgdHlwZSBvZiB0aGUgcGx1Z2luIHNldHRpbmdzLlxuICovXG5leHBvcnQgdHlwZSBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+ID0gUmVhZG9ubHlEZWVwPFBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+PjtcblxuLyoqXG4gKiBBIHZhbGlkYXRvciBmdW5jdGlvbiBmb3IgYSBzZXR0aW5ncyBwcm9wZXJ0eS5cbiAqXG4gKiBAdHlwZVBhcmFtIFBsdWdpblNldHRpbmdzIC0gVGhlIHBsdWdpbiBzZXR0aW5ncyB0eXBlLlxuICogQHR5cGVQYXJhbSBQcm9wZXJ0eU5hbWUgLSBUaGUgcHJvcGVydHkgbmFtZS5cbiAqL1xuZXhwb3J0IHR5cGUgU2V0dGluZ3NWYWxpZGF0b3I8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3QsIFByb3BlcnR5TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+ID0gU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz4+ID0gKFxuICB2YWx1ZTogUGx1Z2luU2V0dGluZ3NbUHJvcGVydHlOYW1lXSxcbiAgc2V0dGluZ3M6IFBsdWdpblNldHRpbmdzXG4pID0+IFByb21pc2FibGU8TWF5YmVSZXR1cm48c3RyaW5nPj47XG5cbnR5cGUgUHJvcGVydHlOYW1lczxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4gPSBTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPjtcblxudHlwZSBQcm9wZXJ0eVZhbHVlczxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4gPSBQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVzPFBsdWdpblNldHRpbmdzPl07XG5cbnR5cGUgVmFsaWRhdGlvblJlc3VsdDxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4gPSBQYXJ0aWFsPFJlY29yZDxTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPiwgc3RyaW5nPj47XG5cbmNsYXNzIEVtcHR5RGF0YUhhbmRsZXIgaW1wbGVtZW50cyBEYXRhSGFuZGxlciB7XG4gIHB1YmxpYyBhc3luYyBsb2FkRGF0YSgpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBhd2FpdCBub29wQXN5bmMoKTtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gdW5yZWFjaGFibGUgYmVjYXVzZSBFbXB0eVBsdWdpblNldHRpbmdzQ29tcG9uZW50IGhhcyBubyBwcm9wZXJ0aWVzIHRvIGNoYW5nZSwgc28gc2F2ZVRvRmlsZSBhbHdheXMgc2hvcnQtY2lyY3VpdHMuICovXG4gIHB1YmxpYyBhc3luYyBzYXZlRGF0YSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBub29wQXN5bmMoKTtcbiAgfVxuICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIHBsdWdpbiBzZXR0aW5ncyBjb21wb25lbnRzLlxuICpcbiAqIE1hbmFnZXMgc2V0dGluZ3MgZGF0YSwgcGVyc2lzdGVuY2UsIHZhbGlkYXRpb24sIGFuZCBldmVudHMuXG4gKiBQbHVnaW4gYXV0aG9ycyBleHRlbmQgdGhpcyBjbGFzcyBhbmQgaW1wbGVtZW50IHtAbGluayBjcmVhdGVEZWZhdWx0U2V0dGluZ3N9LlxuICpcbiAqIEB0eXBlUGFyYW0gUGx1Z2luU2V0dGluZ3MgLSBUaGUgcGx1Z2luIHNldHRpbmdzIHR5cGUuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2U8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+IGV4dGVuZHMgQXN5bmNDb21wb25lbnRCYXNlIHtcbiAgLyoqXG4gICAqIENvbXBvbmVudCBrZXkgZm9yIHNpbmdsZXRvbiByZXBsYWNlbWVudCB2aWEge0BsaW5rIFBsdWdpbkJhc2UuYWRkQ2hpbGR9LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBDT01QT05FTlRfS0VZID0gU3ltYm9sKFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZS5uYW1lKTtcblxuICAvKipcbiAgICogR2V0cyB0aGUgcmVhZG9ubHkgZGVmYXVsdCBzZXR0aW5ncy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGRlZmF1bHQgc2V0dGluZ3MgKGFzIGEgcmVhZG9ubHkgb2JqZWN0KS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkZWZhdWx0U2V0dGluZ3M6IFJlYWRvbmx5RGVlcDxQbHVnaW5TZXR0aW5ncz47XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHJlYWRvbmx5IGVmZmVjdGl2ZSBzZXR0aW5ncyAodmFsaWRhdGVkLCB3aXRoIGRlZmF1bHRzIHN1YnN0aXR1dGVkIGZvciBpbnZhbGlkIHZhbHVlcykuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSByZWFkb25seSBlZmZlY3RpdmUgc2V0dGluZ3MuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNldHRpbmdzKCk6IFJlYWRvbmx5RGVlcDxQbHVnaW5TZXR0aW5ncz4ge1xuICAgIHJldHVybiB0aGlzLnNldHRpbmdzU3RhdGUuZWZmZWN0aXZlVmFsdWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgc2V0dGluZ3Mgc3RhdGUgc25hcHNob3QuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IHNldHRpbmdzIHN0YXRlLlxuICAgKi9cbiAgcHVibGljIGdldCBzZXR0aW5nc1N0YXRlKCk6IFJlYWRvbmx5UGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz4ge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRTdGF0ZSBhcyBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+O1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBhc3luY0V2ZW50cyA9IG5ldyBBc3luY0V2ZW50cygpO1xuICBwcml2YXRlIGN1cnJlbnRTdGF0ZTogUGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz47XG4gIHByaXZhdGUgbGFzdFNhdmVkU3RhdGU6IFBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+O1xuICBwcml2YXRlIHJlYWRvbmx5IGxlZ2FjeVNldHRpbmdzQ29udmVydGVyczogKChyZWNvcmQ6IEdlbmVyaWNPYmplY3QpID0+IHZvaWQpW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBwcm9wZXJ0eU5hbWVzOiBQcm9wZXJ0eU5hbWVzPFBsdWdpblNldHRpbmdzPltdO1xuICBwcml2YXRlIHJlYWRvbmx5IHZhbGlkYXRvcnMgPSBuZXcgTWFwPFByb3BlcnR5TmFtZXM8UGx1Z2luU2V0dGluZ3M+LCBTZXR0aW5nc1ZhbGlkYXRvcjxQbHVnaW5TZXR0aW5ncz4+KCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgcGx1Z2luIHNldHRpbmdzIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIGRhdGFIYW5kbGVyIC0gVGhlIGRhdGEgaGFuZGxlci5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGRhdGFIYW5kbGVyOiBEYXRhSGFuZGxlcikge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5kZWZhdWx0U2V0dGluZ3MgPSB0aGlzLmNyZWF0ZURlZmF1bHRTZXR0aW5ncygpIGFzIFJlYWRvbmx5RGVlcDxQbHVnaW5TZXR0aW5ncz47XG4gICAgdGhpcy5jdXJyZW50U3RhdGUgPSB0aGlzLmNyZWF0ZURlZmF1bHRTdGF0ZSgpO1xuICAgIHRoaXMubGFzdFNhdmVkU3RhdGUgPSB0aGlzLmNyZWF0ZURlZmF1bHRTdGF0ZSgpO1xuICAgIHRoaXMucHJvcGVydHlOYW1lcyA9IGdldEFsbEtleXModGhpcy5jdXJyZW50U3RhdGUuaW5wdXRWYWx1ZXMpO1xuICAgIHRoaXMucmVnaXN0ZXJWYWxpZGF0b3JzKCk7XG4gICAgdGhpcy5yZWdpc3RlckxlZ2FjeVNldHRpbmdzQ29udmVydGVycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVkaXRzIHRoZSBwbHVnaW4gc2V0dGluZ3MgYW5kIHNhdmVzIHRoZW0uXG4gICAqXG4gICAqIEBwYXJhbSBzZXR0aW5nc0VkaXRvciAtIFRoZSBlZGl0b3IuXG4gICAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIGNvbnRleHQuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgc2V0dGluZ3MgYXJlIHNhdmVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGVkaXRBbmRTYXZlKHNldHRpbmdzRWRpdG9yOiAoc2V0dGluZ3M6IFBsdWdpblNldHRpbmdzKSA9PiBQcm9taXNhYmxlPHZvaWQ+LCBjb250ZXh0PzogdW5rbm93bik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZWRpdChzZXR0aW5nc0VkaXRvcik7XG4gICAgYXdhaXQgdGhpcy5zYXZlVG9GaWxlKGNvbnRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgdGhlIHNldHRpbmdzIGFyZSBzYWZlLlxuICAgKlxuICAgKiBJdCBydW5zIHZhbGlkYXRpb24gZm9yIGVhY2ggcHJvcGVydHkgYW5kIHNldHMgdGhlIGRlZmF1bHQgdmFsdWUgaWYgdGhlIHZhbGlkYXRpb24gZmFpbHMuXG4gICAqXG4gICAqIEBwYXJhbSBzZXR0aW5ncyAtIFRoZSBzZXR0aW5ncy5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBzZXR0aW5ncyBhcmUgc2FmZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBlbnN1cmVTYWZlKHNldHRpbmdzOiBQbHVnaW5TZXR0aW5ncyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBhd2FpdCB0aGlzLnZhbGlkYXRlKHNldHRpbmdzKTtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHRoaXMuZGVmYXVsdFNldHRpbmdzIGFzIFBsdWdpblNldHRpbmdzO1xuICAgIGZvciAoY29uc3QgcHJvcGVydHlOYW1lIG9mIHRoaXMucHJvcGVydHlOYW1lcykge1xuICAgICAgaWYgKHZhbGlkYXRpb25SZXN1bHRbcHJvcGVydHlOYW1lXSkge1xuICAgICAgICBzZXR0aW5nc1twcm9wZXJ0eU5hbWVdID0gZGVmYXVsdHNbcHJvcGVydHlOYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHNhZmUgY29weSBvZiB0aGUgc2V0dGluZ3MuXG4gICAqXG4gICAqIEBwYXJhbSBzZXR0aW5ncyAtIFRoZSBzZXR0aW5ncy5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgc2FmZSBjb3B5IG9mIHRoZSBzZXR0aW5ncy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRTYWZlQ29weShzZXR0aW5nczogUGx1Z2luU2V0dGluZ3MpOiBQcm9taXNlPFBsdWdpblNldHRpbmdzPiB7XG4gICAgY29uc3Qgc2FmZVNldHRpbmdzID0gYXdhaXQgdGhpcy5jbG9uZVNldHRpbmdzKHNldHRpbmdzKTtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVNhZmUoc2FmZVNldHRpbmdzKTtcbiAgICByZXR1cm4gc2FmZVNldHRpbmdzO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIHRoZSBwbHVnaW4gc2V0dGluZ3MgZnJvbSB0aGUgZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIGlzSW5pdGlhbExvYWQgLSBXaGV0aGVyIHRoZSBzZXR0aW5ncyBhcmUgYmVpbmcgbG9hZGVkIGZvciB0aGUgZmlyc3QgdGltZS5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBzZXR0aW5ncyBhcmUgbG9hZGVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGxvYWRGcm9tRmlsZShpc0luaXRpYWxMb2FkOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuZGF0YUhhbmRsZXIubG9hZERhdGEoKTtcbiAgICB0aGlzLmxhc3RTYXZlZFN0YXRlID0gdGhpcy5jcmVhdGVEZWZhdWx0U3RhdGUoKTtcbiAgICB0aGlzLmN1cnJlbnRTdGF0ZSA9IHRoaXMuY3JlYXRlRGVmYXVsdFN0YXRlKCk7XG5cbiAgICB0cnkge1xuICAgICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCB8fCBkYXRhID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0Jykge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBJbnZhbGlkIHNldHRpbmdzIGZyb20gZGF0YS5qc29uLiBFeHBlY3RlZCBPYmplY3QsIGdvdDogJHt0eXBlb2YgZGF0YX1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByYXdSZWNvcmQgPSBkYXRhIGFzIEdlbmVyaWNPYmplY3Q7XG4gICAgICBjb25zdCBwYXJzZWRTZXR0aW5ncyA9IGF3YWl0IHRoaXMucmF3UmVjb3JkVG9TZXR0aW5ncyhyYXdSZWNvcmQpO1xuICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMudmFsaWRhdGUocGFyc2VkU2V0dGluZ3MpO1xuXG4gICAgICBmb3IgKGNvbnN0IHByb3BlcnR5TmFtZSBvZiB0aGlzLnByb3BlcnR5TmFtZXMpIHtcbiAgICAgICAgdGhpcy5zZXRQcm9wZXJ0eUltcGwocHJvcGVydHlOYW1lLCBwYXJzZWRTZXR0aW5nc1twcm9wZXJ0eU5hbWVdLCB2YWxpZGF0aW9uUmVzdWx0W3Byb3BlcnR5TmFtZV0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxhc3RTYXZlZFN0YXRlID0gYXdhaXQgdGhpcy5jbG9uZVN0YXRlKHRoaXMuY3VycmVudFN0YXRlKTtcblxuICAgICAgY29uc3QgbmV3UmVjb3JkID0gYXdhaXQgdGhpcy5zZXR0aW5nc1RvUmF3UmVjb3JkKHRoaXMuY3VycmVudFN0YXRlLmlucHV0VmFsdWVzKTtcblxuICAgICAgaWYgKCFkZWVwRXF1YWwobmV3UmVjb3JkLCBkYXRhKSkge1xuICAgICAgICBhd2FpdCB0aGlzLnNhdmVUb0ZpbGVJbXBsKCk7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHRoaXMuYXN5bmNFdmVudHMudHJpZ2dlckFzeW5jKCdsb2FkU2V0dGluZ3MnLCB0aGlzLmN1cnJlbnRTdGF0ZSwgaXNJbml0aWFsTG9hZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZXMgdG8gdGhlIGBsb2FkU2V0dGluZ3NgIGV2ZW50LlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAtIEFsd2F5cyBgbG9hZFNldHRpbmdzYC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrLlxuICAgKiBAcGFyYW0gdGhpc0FyZyAtIFRoZSBgdGhpc2AgY29udGV4dC5cbiAgICogQHJldHVybnMgQSByZWZlcmVuY2UgdG8gdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgKi9cbiAgcHVibGljIG9uKFxuICAgIG5hbWU6ICdsb2FkU2V0dGluZ3MnLFxuICAgIGNhbGxiYWNrOiAoXG4gICAgICBsb2FkZWRTdGF0ZTogUmVhZG9ubHlQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPixcbiAgICAgIGlzSW5pdGlhbExvYWQ6IGJvb2xlYW5cbiAgICApID0+IFByb21pc2FibGU8dm9pZD4sXG4gICAgdGhpc0FyZz86IHVua25vd25cbiAgKTogQXN5bmNFdmVudFJlZjtcbiAgLyoqXG4gICAqIFN1YnNjcmliZXMgdG8gdGhlIGBzYXZlU2V0dGluZ3NgIGV2ZW50LlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAtIEFsd2F5cyBgc2F2ZVNldHRpbmdzYC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrLlxuICAgKiBAcGFyYW0gdGhpc0FyZyAtIFRoZSBgdGhpc2AgY29udGV4dC5cbiAgICogQHJldHVybnMgQSByZWZlcmVuY2UgdG8gdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgKi9cbiAgcHVibGljIG9uKFxuICAgIG5hbWU6ICdzYXZlU2V0dGluZ3MnLFxuICAgIGNhbGxiYWNrOiAoXG4gICAgICBuZXdTdGF0ZTogUmVhZG9ubHlQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPixcbiAgICAgIG9sZFN0YXRlOiBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+LFxuICAgICAgY29udGV4dDogdW5rbm93blxuICAgICkgPT4gUHJvbWlzYWJsZTx2b2lkPixcbiAgICB0aGlzQXJnPzogdW5rbm93blxuICApOiBBc3luY0V2ZW50UmVmO1xuICAvKipcbiAgICogU3Vic2NyaWJlcyB0byBhbiBldmVudC5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjay5cbiAgICogQHBhcmFtIHRoaXNBcmcgLSBUaGUgYHRoaXNgIGNvbnRleHQuXG4gICAqIEByZXR1cm5zIEEgcmVmZXJlbmNlIHRvIHRoZSBldmVudCBsaXN0ZW5lci5cbiAgICovXG4gIHB1YmxpYyBvbjxBcmdzIGV4dGVuZHMgdW5rbm93bltdPihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgY2FsbGJhY2s6ICguLi5hcmdzOiBBcmdzKSA9PiBQcm9taXNhYmxlPHZvaWQ+LFxuICAgIHRoaXNBcmc/OiB1bmtub3duXG4gICk6IEFzeW5jRXZlbnRSZWYge1xuICAgIHJldHVybiB0aGlzLmFzeW5jRXZlbnRzLm9uKG5hbWUsIGNhbGxiYWNrLCB0aGlzQXJnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgZXh0ZXJuYWwgc2V0dGluZ3MgY2hhbmdlLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHNldHRpbmdzIGFyZSByZWxvYWRlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBvbkV4dGVybmFsU2V0dGluZ3NDaGFuZ2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5sb2FkRnJvbUZpbGUoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIHNldHRpbmdzIGZyb20gZmlsZSBhbmQgcmVnaXN0ZXJzIGV2ZW50IGhhbmRsZXJzLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGFzeW5jIG9ubG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBzdXBlci5vbmxvYWQoKTtcbiAgICByZWdpc3RlckFzeW5jRXZlbnQodGhpcywgdGhpcy5vbignbG9hZFNldHRpbmdzJywgdGhpcy5vbkxvYWRTZXR0aW5ncy5iaW5kKHRoaXMpKSk7XG4gICAgcmVnaXN0ZXJBc3luY0V2ZW50KHRoaXMsIHRoaXMub24oJ3NhdmVTZXR0aW5ncycsIHRoaXMub25TYXZlU2V0dGluZ3MuYmluZCh0aGlzKSkpO1xuICAgIGF3YWl0IHRoaXMubG9hZEZyb21GaWxlKHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGxlZ2FjeSBzZXR0aW5ncyBjb252ZXJ0ZXIuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gTGVnYWN5U2V0dGluZ3MgLSBUaGUgbGVnYWN5IHNldHRpbmdzIGNsYXNzLlxuICAgKiBAcGFyYW0gbGVnYWN5U2V0dGluZ3NDbGFzcyAtIFRoZSBsZWdhY3kgc2V0dGluZ3MgY2xhc3MuXG4gICAqIEBwYXJhbSBjb252ZXJ0ZXIgLSBUaGUgY29udmVydGVyLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyTGVnYWN5U2V0dGluZ3NDb252ZXJ0ZXI8TGVnYWN5U2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+KFxuICAgIGxlZ2FjeVNldHRpbmdzQ2xhc3M6IG5ldyAoKSA9PiBMZWdhY3lTZXR0aW5ncyxcbiAgICBjb252ZXJ0ZXI6IChsZWdhY3lTZXR0aW5nczogUGFydGlhbDxMZWdhY3lTZXR0aW5ncz4gJiBQYXJ0aWFsPFBsdWdpblNldHRpbmdzPikgPT4gdm9pZFxuICApOiB2b2lkIHtcbiAgICBjb25zdCB0aGF0ID0gdGhpcztcbiAgICB0aGlzLmxlZ2FjeVNldHRpbmdzQ29udmVydGVycy5wdXNoKGxlZ2FjeVNldHRpbmdzQ29udmVydGVyKTtcblxuICAgIGZ1bmN0aW9uIGxlZ2FjeVNldHRpbmdzQ29udmVydGVyKHJlY29yZDogR2VuZXJpY09iamVjdCk6IHZvaWQge1xuICAgICAgY29uc3QgbGVnYWN5U2V0dGluZ3NLZXlzID0gbmV3IFNldDxzdHJpbmc+KE9iamVjdC5rZXlzKG5ldyBsZWdhY3lTZXR0aW5nc0NsYXNzKCkpKTtcbiAgICAgIGNvbnN0IHBsdWdpblNldHRpbmdLZXlzID0gbmV3IFNldDxzdHJpbmc+KHRoYXQucHJvcGVydHlOYW1lcyk7XG4gICAgICBjb25zdCBsZWdhY3lTZXR0aW5ncyA9IHJlY29yZCBhcyBQYXJ0aWFsPExlZ2FjeVNldHRpbmdzPiAmIFBhcnRpYWw8UGx1Z2luU2V0dGluZ3M+O1xuICAgICAgY29udmVydGVyKGxlZ2FjeVNldHRpbmdzKTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGxlZ2FjeVNldHRpbmdzKSkge1xuICAgICAgICBpZiAocGx1Z2luU2V0dGluZ0tleXMuaGFzKGtleSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbGVnYWN5U2V0dGluZ3NLZXlzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlIC0tIFdlIGhhdmUgbm8gb3RoZXIgd2F5IHRvIGRlbGV0ZSB0aGUgcHJvcGVydHkuXG4gICAgICAgIGRlbGV0ZSByZWNvcmRba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgdmFsaWRhdG9yIGZvciBhIHByb3BlcnR5LlxuICAgKlxuICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LlxuICAgKiBAcGFyYW0gdmFsaWRhdG9yIC0gVGhlIHZhbGlkYXRvci5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclZhbGlkYXRvcjxQcm9wZXJ0eU5hbWUgZXh0ZW5kcyBQcm9wZXJ0eU5hbWVzPFBsdWdpblNldHRpbmdzPj4oXG4gICAgcHJvcGVydHlOYW1lOiBQcm9wZXJ0eU5hbWUsXG4gICAgdmFsaWRhdG9yOiBTZXR0aW5nc1ZhbGlkYXRvcjxQbHVnaW5TZXR0aW5ncywgUHJvcGVydHlOYW1lPlxuICApOiB2b2lkIHtcbiAgICB0aGlzLnZhbGlkYXRvcnMuc2V0KHByb3BlcnR5TmFtZSwgdmFsaWRhdG9yIGFzIFNldHRpbmdzVmFsaWRhdG9yPFBsdWdpblNldHRpbmdzPik7XG4gIH1cblxuICAvKipcbiAgICogUmV2YWxpZGF0ZXMgdGhlIHNldHRpbmdzLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgdmFsaWRhdGlvbiBtZXNzYWdlcy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZXZhbGlkYXRlKCk6IFByb21pc2U8UmVjb3JkPFByb3BlcnR5TmFtZXM8UGx1Z2luU2V0dGluZ3M+LCBzdHJpbmc+PiB7XG4gICAgYXdhaXQgdGhpcy5lZGl0KG5vb3ApO1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRTdGF0ZS52YWxpZGF0aW9uTWVzc2FnZXM7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZXMgdGhlIG5ldyBwbHVnaW4gc2V0dGluZ3MuXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIGNvbnRleHQgb2YgdGhlIHNhdmUgdG8gZmlsZSBvcGVyYXRpb24uXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgc2V0dGluZ3MgYXJlIHNhdmVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNhdmVUb0ZpbGUoY29udGV4dD86IHVua25vd24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoZGVlcEVxdWFsKHRoaXMubGFzdFNhdmVkU3RhdGUuaW5wdXRWYWx1ZXMsIHRoaXMuY3VycmVudFN0YXRlLmlucHV0VmFsdWVzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuc2F2ZVRvRmlsZUltcGwoKTtcbiAgICBhd2FpdCB0aGlzLmFzeW5jRXZlbnRzLnRyaWdnZXJBc3luYygnc2F2ZVNldHRpbmdzJywgdGhpcy5jdXJyZW50U3RhdGUsIHRoaXMubGFzdFNhdmVkU3RhdGUsIGNvbnRleHQpO1xuICAgIHRoaXMubGFzdFNhdmVkU3RhdGUgPSBhd2FpdCB0aGlzLmNsb25lU3RhdGUodGhpcy5jdXJyZW50U3RhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgcHJvcGVydHkuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gUHJvcGVydHlOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LlxuICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2V0UHJvcGVydHk8UHJvcGVydHlOYW1lIGV4dGVuZHMgUHJvcGVydHlOYW1lczxQbHVnaW5TZXR0aW5ncz4+KFxuICAgIHByb3BlcnR5TmFtZTogUHJvcGVydHlOYW1lLFxuICAgIHZhbHVlOiBQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVdXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgdGhpcy5lZGl0KChzZXR0aW5ncykgPT4ge1xuICAgICAgc2V0dGluZ3NbcHJvcGVydHlOYW1lXSA9IHZhbHVlO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRTdGF0ZS52YWxpZGF0aW9uTWVzc2FnZXNbcHJvcGVydHlOYW1lXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIHNldHRpbmdzLlxuICAgKlxuICAgKiBAcGFyYW0gc2V0dGluZ3MgLSBUaGUgc2V0dGluZ3MuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHZhbGlkYXRpb24gcmVzdWx0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHZhbGlkYXRlKHNldHRpbmdzOiBQbHVnaW5TZXR0aW5ncyk6IFByb21pc2U8VmFsaWRhdGlvblJlc3VsdDxQbHVnaW5TZXR0aW5ncz4+IHtcbiAgICBjb25zdCByZXN1bHQ6IFZhbGlkYXRpb25SZXN1bHQ8UGx1Z2luU2V0dGluZ3M+ID0ge307XG4gICAgZm9yIChjb25zdCBbcHJvcGVydHlOYW1lLCB2YWxpZGF0b3JdIG9mIHRoaXMudmFsaWRhdG9ycy5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25NZXNzYWdlID0gYXdhaXQgdmFsaWRhdG9yKHNldHRpbmdzW3Byb3BlcnR5TmFtZV0sIHNldHRpbmdzKTtcbiAgICAgIGlmICh2YWxpZGF0aW9uTWVzc2FnZSkge1xuICAgICAgICByZXN1bHRbcHJvcGVydHlOYW1lXSA9IHZhbGlkYXRpb25NZXNzYWdlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBzZXR0aW5ncy4gTXVzdCBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgZGVmYXVsdCBzZXR0aW5ncy5cbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBjcmVhdGVEZWZhdWx0U2V0dGluZ3MoKTogUGx1Z2luU2V0dGluZ3M7XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHRyYW5zZm9ybWVyLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgdHJhbnNmb3JtZXIuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0VHJhbnNmb3JtZXIoKTogVHJhbnNmb3JtZXIge1xuICAgIHJldHVybiBkZWZhdWx0VHJhbnNmb3JtZXI7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBzZXR0aW5ncyByZWNvcmQgaXMgbG9hZGVkIGZyb20gZGlzay5cbiAgICpcbiAgICogQHBhcmFtIHJlY29yZCAtIFRoZSByZWNvcmQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25Mb2FkUmVjb3JkKHJlY29yZDogR2VuZXJpY09iamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAoY29uc3QgY29udmVydGVyIG9mIHRoaXMubGVnYWN5U2V0dGluZ3NDb252ZXJ0ZXJzKSB7XG4gICAgICBjb252ZXJ0ZXIocmVjb3JkKTtcbiAgICB9XG4gICAgYXdhaXQgUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gc2V0dGluZ3MgYXJlIGxvYWRlZCBvciByZWxvYWRlZC5cbiAgICpcbiAgICogQHBhcmFtIF9sb2FkZWRTdGF0ZSAtIFRoZSBsb2FkZWQgc2V0dGluZ3Mgc3RhdGUuXG4gICAqIEBwYXJhbSBfaXNJbml0aWFsTG9hZCAtIFdoZXRoZXIgdGhpcyBpcyB0aGUgaW5pdGlhbCBsb2FkLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIG9uTG9hZFNldHRpbmdzKFxuICAgIF9sb2FkZWRTdGF0ZTogUmVhZG9ubHlQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPixcbiAgICBfaXNJbml0aWFsTG9hZDogYm9vbGVhblxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBub29wQXN5bmMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBzZXR0aW5ncyBhcmUgc2F2ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBfbmV3U3RhdGUgLSBUaGUgbmV3IHNldHRpbmdzIHN0YXRlLlxuICAgKiBAcGFyYW0gX29sZFN0YXRlIC0gVGhlIG9sZCBzZXR0aW5ncyBzdGF0ZS5cbiAgICogQHBhcmFtIF9jb250ZXh0IC0gVGhlIHNhdmUgY29udGV4dC5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBvblNhdmVTZXR0aW5ncyhcbiAgICBfbmV3U3RhdGU6IFJlYWRvbmx5UGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz4sXG4gICAgX29sZFN0YXRlOiBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+LFxuICAgIF9jb250ZXh0OiB1bmtub3duXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IG5vb3BBc3luYygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gc2V0dGluZ3MgcmVjb3JkIGlzIGFib3V0IHRvIGJlIHNhdmVkIHRvIGRpc2suXG4gICAqXG4gICAqIEBwYXJhbSBfcmVjb3JkIC0gVGhlIHJlY29yZC5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBvblNhdmluZ1JlY29yZChfcmVjb3JkOiBHZW5lcmljT2JqZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgbm9vcEFzeW5jKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIHRoZSBsZWdhY3kgc2V0dGluZ3MgY29udmVydGVycy5cbiAgICogT3ZlcnJpZGUgdG8gcmVnaXN0ZXIgbGVnYWN5IHNldHRpbmdzIGNvbnZlcnRlcnMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVnaXN0ZXJMZWdhY3lTZXR0aW5nc0NvbnZlcnRlcnMoKTogdm9pZCB7XG4gICAgbm9vcCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyB0aGUgdmFsaWRhdG9ycy5cbiAgICogT3ZlcnJpZGUgdG8gcmVnaXN0ZXIgdmFsaWRhdG9ycyBmb3IgcHJvcGVydGllcy5cbiAgICovXG4gIHByb3RlY3RlZCByZWdpc3RlclZhbGlkYXRvcnMoKTogdm9pZCB7XG4gICAgbm9vcCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjbG9uZVNldHRpbmdzKHNldHRpbmdzOiBQbHVnaW5TZXR0aW5ncyk6IFByb21pc2U8UGx1Z2luU2V0dGluZ3M+IHtcbiAgICBjb25zdCByZWNvcmQgPSBhd2FpdCB0aGlzLnNldHRpbmdzVG9SYXdSZWNvcmQoc2V0dGluZ3MpO1xuICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShyZWNvcmQpO1xuICAgIGNvbnN0IGNsb25lUmVjb3JkID0gSlNPTi5wYXJzZShqc29uKSBhcyBHZW5lcmljT2JqZWN0O1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnJhd1JlY29yZFRvU2V0dGluZ3MoY2xvbmVSZWNvcmQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjbG9uZVN0YXRlKFxuICAgIHN0YXRlOiBQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPlxuICApOiBQcm9taXNlPFBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVmZmVjdGl2ZVZhbHVlczogYXdhaXQgdGhpcy5jbG9uZVNldHRpbmdzKHN0YXRlLmVmZmVjdGl2ZVZhbHVlcyksXG4gICAgICBpbnB1dFZhbHVlczogYXdhaXQgdGhpcy5jbG9uZVNldHRpbmdzKHN0YXRlLmlucHV0VmFsdWVzKSxcbiAgICAgIHZhbGlkYXRpb25NZXNzYWdlczogeyAuLi5zdGF0ZS52YWxpZGF0aW9uTWVzc2FnZXMgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURlZmF1bHRTdGF0ZSgpOiBQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVmZmVjdGl2ZVZhbHVlczogdGhpcy5jcmVhdGVEZWZhdWx0U2V0dGluZ3MoKSxcbiAgICAgIGlucHV0VmFsdWVzOiB0aGlzLmNyZWF0ZURlZmF1bHRTZXR0aW5ncygpLFxuICAgICAgdmFsaWRhdGlvbk1lc3NhZ2VzOiBjYXN0VG88UmVjb3JkPFByb3BlcnR5TmFtZXM8UGx1Z2luU2V0dGluZ3M+LCBzdHJpbmc+Pih7fSlcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlZGl0KHNldHRpbmdzRWRpdG9yOiAoc2V0dGluZ3M6IFBsdWdpblNldHRpbmdzKSA9PiBQcm9taXNhYmxlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNldHRpbmdzRWRpdG9yKHRoaXMuY3VycmVudFN0YXRlLmlucHV0VmFsdWVzKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMudmFsaWRhdGUodGhpcy5jdXJyZW50U3RhdGUuaW5wdXRWYWx1ZXMpO1xuICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgb2YgdGhpcy5wcm9wZXJ0eU5hbWVzKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRpb25NZXNzYWdlID0gdmFsaWRhdGlvblJlc3VsdFtwcm9wZXJ0eU5hbWVdID8/ICcnO1xuICAgICAgICB0aGlzLmN1cnJlbnRTdGF0ZS52YWxpZGF0aW9uTWVzc2FnZXNbcHJvcGVydHlOYW1lXSA9IHZhbGlkYXRpb25NZXNzYWdlO1xuICAgICAgICBjb25zdCBkZWZhdWx0cyA9IHRoaXMuZGVmYXVsdFNldHRpbmdzIGFzIFBsdWdpblNldHRpbmdzO1xuICAgICAgICB0aGlzLmN1cnJlbnRTdGF0ZS5lZmZlY3RpdmVWYWx1ZXNbcHJvcGVydHlOYW1lXSA9IHZhbGlkYXRpb25NZXNzYWdlXG4gICAgICAgICAgPyBkZWZhdWx0c1twcm9wZXJ0eU5hbWVdXG4gICAgICAgICAgOiB0aGlzLmN1cnJlbnRTdGF0ZS5pbnB1dFZhbHVlc1twcm9wZXJ0eU5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNWYWxpZFByb3BlcnR5TmFtZShwcm9wOiB1bmtub3duKTogcHJvcCBpcyBQcm9wZXJ0eU5hbWVzPFBsdWdpblNldHRpbmdzPiB7XG4gICAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiAodGhpcy5wcm9wZXJ0eU5hbWVzIGFzIHN0cmluZ1tdKS5pbmNsdWRlcyhwcm9wKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmF3UmVjb3JkVG9TZXR0aW5ncyhyYXdSZWNvcmQ6IEdlbmVyaWNPYmplY3QpOiBQcm9taXNlPFBsdWdpblNldHRpbmdzPiB7XG4gICAgcmF3UmVjb3JkID0gdGhpcy5nZXRUcmFuc2Zvcm1lcigpLnRyYW5zZm9ybU9iamVjdFJlY3Vyc2l2ZWx5KHJhd1JlY29yZCk7XG4gICAgYXdhaXQgdGhpcy5vbkxvYWRSZWNvcmQocmF3UmVjb3JkKTtcblxuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5jcmVhdGVEZWZhdWx0U2V0dGluZ3MoKTtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHRoaXMuZGVmYXVsdFNldHRpbmdzIGFzIFBsdWdpblNldHRpbmdzO1xuXG4gICAgZm9yIChjb25zdCBbcHJvcGVydHlOYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmF3UmVjb3JkKSkge1xuICAgICAgaWYgKCF0aGlzLmlzVmFsaWRQcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lKSkge1xuICAgICAgICBnZXRMaWJEZWJ1Z2dlcignUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlOnJhd1JlY29yZFRvU2V0dGluZ3MnKShgVW5rbm93biBwcm9wZXJ0eTogJHtwcm9wZXJ0eU5hbWV9YCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSB0eXBlb2YgZGVmYXVsdHNbcHJvcGVydHlOYW1lXSkge1xuICAgICAgICBnZXRMaWJEZWJ1Z2dlcignUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlOnJhd1JlY29yZFRvU2V0dGluZ3MnKShcbiAgICAgICAgICAnUG9zc2libGUgaW52YWxpZCB2YWx1ZSB0eXBlLiBJdCBtaWdodCBsZWFkIHRvIGFuIHVuZXhwZWN0ZWQgYmVoYXZpb3Igb2YgdGhlIHBsdWdpbi4gVGhlcmUgaXMgYWxzbyBhIGNoYW5jZSBpdCBpcyBhIGZhbHNlLW5lZ2F0aXZlIHdhcm5pbmcsIGFzIHdlIGFyZSB1bmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBleGFjdCB0eXBlIG9mIHRoZSB2YWx1ZSBpbiBydW50aW1lLicsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBkZWZhdWx0c1twcm9wZXJ0eU5hbWVdLFxuICAgICAgICAgICAgcHJvcGVydHlOYW1lLFxuICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHNldHRpbmdzW3Byb3BlcnR5TmFtZV0gPSB2YWx1ZSBhcyBQcm9wZXJ0eVZhbHVlczxQbHVnaW5TZXR0aW5ncz47XG4gICAgfVxuXG4gICAgcmV0dXJuIHNldHRpbmdzO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzYXZlVG9GaWxlSW1wbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRhdGFIYW5kbGVyLnNhdmVEYXRhKGF3YWl0IHRoaXMuc2V0dGluZ3NUb1Jhd1JlY29yZCh0aGlzLmN1cnJlbnRTdGF0ZS5pbnB1dFZhbHVlcykpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRQcm9wZXJ0eUltcGwoXG4gICAgcHJvcGVydHlOYW1lOiBQcm9wZXJ0eU5hbWVzPFBsdWdpblNldHRpbmdzPixcbiAgICB2YWx1ZTogUHJvcGVydHlWYWx1ZXM8UGx1Z2luU2V0dGluZ3M+LFxuICAgIHZhbGlkYXRpb25NZXNzYWdlPzogc3RyaW5nXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGRlZmF1bHRzID0gdGhpcy5kZWZhdWx0U2V0dGluZ3MgYXMgUGx1Z2luU2V0dGluZ3M7XG4gICAgdGhpcy5jdXJyZW50U3RhdGUuaW5wdXRWYWx1ZXNbcHJvcGVydHlOYW1lXSA9IHZhbHVlO1xuICAgIHRoaXMuY3VycmVudFN0YXRlLnZhbGlkYXRpb25NZXNzYWdlc1twcm9wZXJ0eU5hbWVdID0gdmFsaWRhdGlvbk1lc3NhZ2UgPz8gJyc7XG4gICAgdGhpcy5jdXJyZW50U3RhdGUuZWZmZWN0aXZlVmFsdWVzW3Byb3BlcnR5TmFtZV0gPSB2YWxpZGF0aW9uTWVzc2FnZSA/IGRlZmF1bHRzW3Byb3BlcnR5TmFtZV0gOiB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2V0dGluZ3NUb1Jhd1JlY29yZChzZXR0aW5nczogUGx1Z2luU2V0dGluZ3MpOiBQcm9taXNlPEdlbmVyaWNPYmplY3Q+IHtcbiAgICBjb25zdCByYXdSZWNvcmQ6IEdlbmVyaWNPYmplY3QgPSB7fTtcblxuICAgIGZvciAoY29uc3QgcHJvcGVydHlOYW1lIG9mIHRoaXMucHJvcGVydHlOYW1lcykge1xuICAgICAgcmF3UmVjb3JkW3Byb3BlcnR5TmFtZV0gPSBzZXR0aW5nc1twcm9wZXJ0eU5hbWVdO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMub25TYXZpbmdSZWNvcmQocmF3UmVjb3JkKTtcblxuICAgIHJldHVybiB0aGlzLmdldFRyYW5zZm9ybWVyKCkudHJhbnNmb3JtT2JqZWN0UmVjdXJzaXZlbHkocmF3UmVjb3JkKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgbm8tb3Agc2V0dGluZ3MgY29tcG9uZW50IGZvciBwbHVnaW5zIHdpdGhvdXQgc2V0dGluZ3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBFbXB0eVBsdWdpblNldHRpbmdzQ29tcG9uZW50IGV4dGVuZHMgUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlPG9iamVjdD4ge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBlbXB0eSBwbHVnaW4gc2V0dGluZ3MgY29tcG9uZW50LlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKG5ldyBFbXB0eURhdGFIYW5kbGVyKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgZW1wdHkgZGVmYXVsdCBzZXR0aW5ncy5cbiAgICpcbiAgICogQHJldHVybnMgQW4gZW1wdHkgb2JqZWN0LlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGNyZWF0ZURlZmF1bHRTZXR0aW5ncygpOiBvYmplY3Qge1xuICAgIHJldHVybiB7fTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUF3QkEsMEJBQTRCO0FBQzVCLG1CQUErQjtBQUMvQixzQkFHTztBQUNQLDBCQUlPO0FBQ1AsOEJBQWdDO0FBQ2hDLGtDQUFvQztBQUNwQywrQkFBaUM7QUFDakMsNkJBQStCO0FBQy9CLDZCQUErQjtBQUMvQiwrQ0FBK0M7QUFDL0MscUNBQXFDO0FBQ3JDLDZCQUFtQztBQUNuQyxvQ0FBbUM7QUFFbkMsTUFBTSxxQkFBcUIsSUFBSSwwQ0FBaUI7QUFBQSxFQUM5QyxJQUFJLHdFQUErQjtBQUFBLEVBQ25DLElBQUksd0NBQWdCO0FBQUEsRUFDcEIsSUFBSSxnREFBb0I7QUFBQSxFQUN4QixJQUFJLHNDQUFlO0FBQUEsRUFDbkIsSUFBSSxzQ0FBZTtBQUFBLEVBQ25CLElBQUksb0RBQXFCO0FBQzNCLENBQUM7QUF3REQsTUFBTSxpQkFBd0M7QUFBQSxFQUM1QyxNQUFhLFdBQTZCO0FBQ3hDLGNBQU0sMkJBQVU7QUFDaEIsV0FBTyxDQUFDO0FBQUEsRUFDVjtBQUFBO0FBQUEsRUFHQSxNQUFhLFdBQTBCO0FBQ3JDLGNBQU0sMkJBQVU7QUFBQSxFQUNsQjtBQUFBO0FBRUY7QUFVTyxNQUFlLG9DQUFtRSwwQ0FBbUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUEyQ25HLFlBQTZCLGFBQTBCO0FBQzVELFVBQU07QUFENEI7QUFFbEMsU0FBSyxrQkFBa0IsS0FBSyxzQkFBc0I7QUFDbEQsU0FBSyxlQUFlLEtBQUssbUJBQW1CO0FBQzVDLFNBQUssaUJBQWlCLEtBQUssbUJBQW1CO0FBQzlDLFNBQUssb0JBQWdCLGdDQUFXLEtBQUssYUFBYSxXQUFXO0FBQzdELFNBQUssbUJBQW1CO0FBQ3hCLFNBQUssaUNBQWlDO0FBQUEsRUFDeEM7QUFBQSxFQVJvQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBdkNwQyxPQUF1QixnQkFBZ0IsT0FBTyw0QkFBNEIsSUFBSTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU85RDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9oQixJQUFXLFdBQXlDO0FBQ2xELFdBQU8sS0FBSyxjQUFjO0FBQUEsRUFDNUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxJQUFXLGdCQUE2RDtBQUN0RSxXQUFPLEtBQUs7QUFBQSxFQUNkO0FBQUEsRUFFaUIsY0FBYyxJQUFJLGdDQUFZO0FBQUEsRUFDdkM7QUFBQSxFQUNBO0FBQUEsRUFDUywyQkFBZ0UsQ0FBQztBQUFBLEVBQ2pFO0FBQUEsRUFDQSxhQUFhLG9CQUFJLElBQXNFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQXdCeEcsTUFBYSxZQUFZLGdCQUFnRSxTQUFrQztBQUN6SCxVQUFNLEtBQUssS0FBSyxjQUFjO0FBQzlCLFVBQU0sS0FBSyxXQUFXLE9BQU87QUFBQSxFQUMvQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVVBLE1BQWEsV0FBVyxVQUF5QztBQUMvRCxVQUFNLG1CQUFtQixNQUFNLEtBQUssU0FBUyxRQUFRO0FBQ3JELFVBQU0sV0FBVyxLQUFLO0FBQ3RCLGVBQVcsZ0JBQWdCLEtBQUssZUFBZTtBQUM3QyxVQUFJLGlCQUFpQixZQUFZLEdBQUc7QUFDbEMsaUJBQVMsWUFBWSxJQUFJLFNBQVMsWUFBWTtBQUFBLE1BQ2hEO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFBLE1BQWEsWUFBWSxVQUFtRDtBQUMxRSxVQUFNLGVBQWUsTUFBTSxLQUFLLGNBQWMsUUFBUTtBQUN0RCxVQUFNLEtBQUssV0FBVyxZQUFZO0FBQ2xDLFdBQU87QUFBQSxFQUNUO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRQSxNQUFhLGFBQWEsZUFBdUM7QUFDL0QsVUFBTSxPQUFPLE1BQU0sS0FBSyxZQUFZLFNBQVM7QUFDN0MsU0FBSyxpQkFBaUIsS0FBSyxtQkFBbUI7QUFDOUMsU0FBSyxlQUFlLEtBQUssbUJBQW1CO0FBRTVDLFFBQUk7QUFDRixVQUFJLFNBQVMsVUFBYSxTQUFTLE1BQU07QUFDdkM7QUFBQSxNQUNGO0FBRUEsVUFBSSxPQUFPLFNBQVMsVUFBVTtBQUM1QixnQkFBUSxNQUFNLDBEQUEwRCxPQUFPLElBQUksRUFBRTtBQUNyRjtBQUFBLE1BQ0Y7QUFFQSxZQUFNLFlBQVk7QUFDbEIsWUFBTSxpQkFBaUIsTUFBTSxLQUFLLG9CQUFvQixTQUFTO0FBQy9ELFlBQU0sbUJBQW1CLE1BQU0sS0FBSyxTQUFTLGNBQWM7QUFFM0QsaUJBQVcsZ0JBQWdCLEtBQUssZUFBZTtBQUM3QyxhQUFLLGdCQUFnQixjQUFjLGVBQWUsWUFBWSxHQUFHLGlCQUFpQixZQUFZLENBQUM7QUFBQSxNQUNqRztBQUVBLFdBQUssaUJBQWlCLE1BQU0sS0FBSyxXQUFXLEtBQUssWUFBWTtBQUU3RCxZQUFNLFlBQVksTUFBTSxLQUFLLG9CQUFvQixLQUFLLGFBQWEsV0FBVztBQUU5RSxVQUFJLEtBQUMsK0JBQVUsV0FBVyxJQUFJLEdBQUc7QUFDL0IsY0FBTSxLQUFLLGVBQWU7QUFBQSxNQUM1QjtBQUFBLElBQ0YsVUFBRTtBQUNBLFlBQU0sS0FBSyxZQUFZLGFBQWEsZ0JBQWdCLEtBQUssY0FBYyxhQUFhO0FBQUEsSUFDdEY7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBMkNPLEdBQ0wsTUFDQSxVQUNBLFNBQ2U7QUFDZixXQUFPLEtBQUssWUFBWSxHQUFHLE1BQU0sVUFBVSxPQUFPO0FBQUEsRUFDcEQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxNQUFhLDJCQUEwQztBQUNyRCxVQUFNLEtBQUssYUFBYSxLQUFLO0FBQUEsRUFDL0I7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLE1BQXNCLFNBQXdCO0FBQzVDLFVBQU0sTUFBTSxPQUFPO0FBQ25CLDBEQUFtQixNQUFNLEtBQUssR0FBRyxnQkFBZ0IsS0FBSyxlQUFlLEtBQUssSUFBSSxDQUFDLENBQUM7QUFDaEYsMERBQW1CLE1BQU0sS0FBSyxHQUFHLGdCQUFnQixLQUFLLGVBQWUsS0FBSyxJQUFJLENBQUMsQ0FBQztBQUNoRixVQUFNLEtBQUssYUFBYSxJQUFJO0FBQUEsRUFDOUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBU08sZ0NBQ0wscUJBQ0EsV0FDTTtBQUNOLFVBQU0sT0FBTztBQUNiLFNBQUsseUJBQXlCLEtBQUssdUJBQXVCO0FBRTFELGFBQVMsd0JBQXdCLFFBQTZCO0FBQzVELFlBQU0scUJBQXFCLElBQUksSUFBWSxPQUFPLEtBQUssSUFBSSxvQkFBb0IsQ0FBQyxDQUFDO0FBQ2pGLFlBQU0sb0JBQW9CLElBQUksSUFBWSxLQUFLLGFBQWE7QUFDNUQsWUFBTSxpQkFBaUI7QUFDdkIsZ0JBQVUsY0FBYztBQUN4QixpQkFBVyxPQUFPLE9BQU8sS0FBSyxjQUFjLEdBQUc7QUFDN0MsWUFBSSxrQkFBa0IsSUFBSSxHQUFHLEdBQUc7QUFDOUI7QUFBQSxRQUNGO0FBRUEsWUFBSSxDQUFDLG1CQUFtQixJQUFJLEdBQUcsR0FBRztBQUNoQztBQUFBLFFBQ0Y7QUFHQSxlQUFPLE9BQU8sR0FBRztBQUFBLE1BQ25CO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFPLGtCQUNMLGNBQ0EsV0FDTTtBQUNOLFNBQUssV0FBVyxJQUFJLGNBQWMsU0FBOEM7QUFBQSxFQUNsRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9BLE1BQWEsYUFBcUU7QUFDaEYsVUFBTSxLQUFLLEtBQUssb0JBQUk7QUFDcEIsV0FBTyxLQUFLLGFBQWE7QUFBQSxFQUMzQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUUEsTUFBYSxXQUFXLFNBQWtDO0FBQ3hELFlBQUksK0JBQVUsS0FBSyxlQUFlLGFBQWEsS0FBSyxhQUFhLFdBQVcsR0FBRztBQUM3RTtBQUFBLElBQ0Y7QUFFQSxVQUFNLEtBQUssZUFBZTtBQUMxQixVQUFNLEtBQUssWUFBWSxhQUFhLGdCQUFnQixLQUFLLGNBQWMsS0FBSyxnQkFBZ0IsT0FBTztBQUNuRyxTQUFLLGlCQUFpQixNQUFNLEtBQUssV0FBVyxLQUFLLFlBQVk7QUFBQSxFQUMvRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVVBLE1BQWEsWUFDWCxjQUNBLE9BQ2lCO0FBQ2pCLFVBQU0sS0FBSyxLQUFLLENBQUMsYUFBYTtBQUM1QixlQUFTLFlBQVksSUFBSTtBQUFBLElBQzNCLENBQUM7QUFDRCxXQUFPLEtBQUssYUFBYSxtQkFBbUIsWUFBWTtBQUFBLEVBQzFEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRQSxNQUFhLFNBQVMsVUFBcUU7QUFDekYsVUFBTSxTQUEyQyxDQUFDO0FBQ2xELGVBQVcsQ0FBQyxjQUFjLFNBQVMsS0FBSyxLQUFLLFdBQVcsUUFBUSxHQUFHO0FBQ2pFLFlBQU0sb0JBQW9CLE1BQU0sVUFBVSxTQUFTLFlBQVksR0FBRyxRQUFRO0FBQzFFLFVBQUksbUJBQW1CO0FBQ3JCLGVBQU8sWUFBWSxJQUFJO0FBQUEsTUFDekI7QUFBQSxJQUNGO0FBRUEsV0FBTztBQUFBLEVBQ1Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFjVSxpQkFBOEI7QUFDdEMsV0FBTztBQUFBLEVBQ1Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxNQUFnQixhQUFhLFFBQXNDO0FBQ2pFLGVBQVcsYUFBYSxLQUFLLDBCQUEwQjtBQUNyRCxnQkFBVSxNQUFNO0FBQUEsSUFDbEI7QUFDQSxVQUFNLFFBQVEsUUFBUTtBQUFBLEVBQ3hCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRQSxNQUFnQixlQUNkLGNBQ0EsZ0JBQ2U7QUFDZixjQUFNLDJCQUFVO0FBQUEsRUFDbEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBU0EsTUFBZ0IsZUFDZCxXQUNBLFdBQ0EsVUFDZTtBQUNmLGNBQU0sMkJBQVU7QUFBQSxFQUNsQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9BLE1BQWdCLGVBQWUsU0FBdUM7QUFDcEUsY0FBTSwyQkFBVTtBQUFBLEVBQ2xCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1VLG1DQUF5QztBQUNqRCw4QkFBSztBQUFBLEVBQ1A7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTVUscUJBQTJCO0FBQ25DLDhCQUFLO0FBQUEsRUFDUDtBQUFBLEVBRUEsTUFBYyxjQUFjLFVBQW1EO0FBQzdFLFVBQU0sU0FBUyxNQUFNLEtBQUssb0JBQW9CLFFBQVE7QUFDdEQsVUFBTSxPQUFPLEtBQUssVUFBVSxNQUFNO0FBQ2xDLFVBQU0sY0FBYyxLQUFLLE1BQU0sSUFBSTtBQUNuQyxXQUFPLE1BQU0sS0FBSyxvQkFBb0IsV0FBVztBQUFBLEVBQ25EO0FBQUEsRUFFQSxNQUFjLFdBQ1osT0FDOEM7QUFDOUMsV0FBTztBQUFBLE1BQ0wsaUJBQWlCLE1BQU0sS0FBSyxjQUFjLE1BQU0sZUFBZTtBQUFBLE1BQy9ELGFBQWEsTUFBTSxLQUFLLGNBQWMsTUFBTSxXQUFXO0FBQUEsTUFDdkQsb0JBQW9CLEVBQUUsR0FBRyxNQUFNLG1CQUFtQjtBQUFBLElBQ3BEO0FBQUEsRUFDRjtBQUFBLEVBRVEscUJBQTBEO0FBQ2hFLFdBQU87QUFBQSxNQUNMLGlCQUFpQixLQUFLLHNCQUFzQjtBQUFBLE1BQzVDLGFBQWEsS0FBSyxzQkFBc0I7QUFBQSxNQUN4Qyx3QkFBb0IsNEJBQXNELENBQUMsQ0FBQztBQUFBLElBQzlFO0FBQUEsRUFDRjtBQUFBLEVBRUEsTUFBYyxLQUFLLGdCQUErRTtBQUNoRyxRQUFJO0FBQ0YsWUFBTSxlQUFlLEtBQUssYUFBYSxXQUFXO0FBQUEsSUFDcEQsVUFBRTtBQUNBLFlBQU0sbUJBQW1CLE1BQU0sS0FBSyxTQUFTLEtBQUssYUFBYSxXQUFXO0FBQzFFLGlCQUFXLGdCQUFnQixLQUFLLGVBQWU7QUFDN0MsY0FBTSxvQkFBb0IsaUJBQWlCLFlBQVksS0FBSztBQUM1RCxhQUFLLGFBQWEsbUJBQW1CLFlBQVksSUFBSTtBQUNyRCxjQUFNLFdBQVcsS0FBSztBQUN0QixhQUFLLGFBQWEsZ0JBQWdCLFlBQVksSUFBSSxvQkFDOUMsU0FBUyxZQUFZLElBQ3JCLEtBQUssYUFBYSxZQUFZLFlBQVk7QUFBQSxNQUNoRDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUEsRUFFUSxvQkFBb0IsTUFBc0Q7QUFDaEYsUUFBSSxPQUFPLFNBQVMsVUFBVTtBQUM1QixhQUFPO0FBQUEsSUFDVDtBQUVBLFdBQVEsS0FBSyxjQUEyQixTQUFTLElBQUk7QUFBQSxFQUN2RDtBQUFBLEVBRUEsTUFBYyxvQkFBb0IsV0FBbUQ7QUFDbkYsZ0JBQVksS0FBSyxlQUFlLEVBQUUsMkJBQTJCLFNBQVM7QUFDdEUsVUFBTSxLQUFLLGFBQWEsU0FBUztBQUVqQyxVQUFNLFdBQVcsS0FBSyxzQkFBc0I7QUFDNUMsVUFBTSxXQUFXLEtBQUs7QUFFdEIsZUFBVyxDQUFDLGNBQWMsS0FBSyxLQUFLLE9BQU8sUUFBUSxTQUFTLEdBQUc7QUFDN0QsVUFBSSxDQUFDLEtBQUssb0JBQW9CLFlBQVksR0FBRztBQUMzQyx5Q0FBZSxpREFBaUQsRUFBRSxxQkFBcUIsWUFBWSxFQUFFO0FBQ3JHO0FBQUEsTUFDRjtBQUVBLFVBQUksT0FBTyxVQUFVLE9BQU8sU0FBUyxZQUFZLEdBQUc7QUFDbEQseUNBQWUsaURBQWlEO0FBQUEsVUFDOUQ7QUFBQSxVQUNBO0FBQUEsWUFDRSxjQUFjLFNBQVMsWUFBWTtBQUFBLFlBQ25DO0FBQUEsWUFDQTtBQUFBLFVBQ0Y7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUVBLGVBQVMsWUFBWSxJQUFJO0FBQUEsSUFDM0I7QUFFQSxXQUFPO0FBQUEsRUFDVDtBQUFBLEVBRUEsTUFBYyxpQkFBZ0M7QUFDNUMsVUFBTSxLQUFLLFlBQVksU0FBUyxNQUFNLEtBQUssb0JBQW9CLEtBQUssYUFBYSxXQUFXLENBQUM7QUFBQSxFQUMvRjtBQUFBLEVBRVEsZ0JBQ04sY0FDQSxPQUNBLG1CQUNNO0FBQ04sVUFBTSxXQUFXLEtBQUs7QUFDdEIsU0FBSyxhQUFhLFlBQVksWUFBWSxJQUFJO0FBQzlDLFNBQUssYUFBYSxtQkFBbUIsWUFBWSxJQUFJLHFCQUFxQjtBQUMxRSxTQUFLLGFBQWEsZ0JBQWdCLFlBQVksSUFBSSxvQkFBb0IsU0FBUyxZQUFZLElBQUk7QUFBQSxFQUNqRztBQUFBLEVBRUEsTUFBYyxvQkFBb0IsVUFBa0Q7QUFDbEYsVUFBTSxZQUEyQixDQUFDO0FBRWxDLGVBQVcsZ0JBQWdCLEtBQUssZUFBZTtBQUM3QyxnQkFBVSxZQUFZLElBQUksU0FBUyxZQUFZO0FBQUEsSUFDakQ7QUFFQSxVQUFNLEtBQUssZUFBZSxTQUFTO0FBRW5DLFdBQU8sS0FBSyxlQUFlLEVBQUUsMkJBQTJCLFNBQVM7QUFBQSxFQUNuRTtBQUNGO0FBS08sTUFBTSxxQ0FBcUMsNEJBQW9DO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJN0UsY0FBYztBQUNuQixVQUFNLElBQUksaUJBQWlCLENBQUM7QUFBQSxFQUM5QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9tQix3QkFBZ0M7QUFDakQsV0FBTyxDQUFDO0FBQUEsRUFDVjtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=