@mnaoumov/typescript-dev-toolkit 0.0.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (330) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +15 -1
  3. package/bundlers/esbuild-impl/change-extension-plugin/package.json +6 -0
  4. package/bundlers/esbuild-impl/custom-esbuild-options-plugin/package.json +6 -0
  5. package/bundlers/esbuild-impl/fix-esm-plugin/package.json +6 -0
  6. package/bundlers/esbuild-impl/index/package.json +6 -0
  7. package/bundlers/esbuild-impl/package.json +6 -0
  8. package/bundlers/esbuild-impl/preprocess-plugin/package.json +6 -0
  9. package/bundlers/esbuild-impl/svelte-wrapper-plugin/package.json +6 -0
  10. package/bundlers/index/package.json +6 -0
  11. package/bundlers/package.json +6 -0
  12. package/dist/lib/cjs/build.cjs +191 -0
  13. package/dist/lib/cjs/build.d.cts +59 -0
  14. package/dist/lib/cjs/bundlers/esbuild-impl/change-extension-plugin.cjs +139 -0
  15. package/dist/lib/cjs/bundlers/esbuild-impl/change-extension-plugin.d.cts +25 -0
  16. package/dist/lib/cjs/bundlers/esbuild-impl/custom-esbuild-options-plugin.cjs +96 -0
  17. package/dist/lib/cjs/bundlers/esbuild-impl/custom-esbuild-options-plugin.d.cts +14 -0
  18. package/dist/lib/cjs/bundlers/esbuild-impl/fix-esm-plugin.cjs +106 -0
  19. package/dist/lib/cjs/bundlers/esbuild-impl/fix-esm-plugin.d.cts +13 -0
  20. package/dist/lib/cjs/bundlers/esbuild-impl/index.cjs +111 -0
  21. package/dist/lib/cjs/bundlers/esbuild-impl/index.d.cts +6 -0
  22. package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.cjs +211 -0
  23. package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.d.cts +143 -0
  24. package/dist/lib/cjs/bundlers/esbuild-impl/svelte-wrapper-plugin.cjs +129 -0
  25. package/dist/lib/cjs/bundlers/esbuild-impl/svelte-wrapper-plugin.d.cts +14 -0
  26. package/dist/lib/cjs/bundlers/index.cjs +99 -0
  27. package/dist/lib/cjs/bundlers/index.d.cts +2 -0
  28. package/dist/lib/cjs/check-project-types.cjs +163 -0
  29. package/dist/lib/cjs/check-project-types.d.cts +92 -0
  30. package/dist/lib/cjs/cli-utils.cjs +276 -0
  31. package/dist/lib/cjs/cli-utils.d.cts +123 -0
  32. package/dist/lib/cjs/code-generator.cjs +96 -0
  33. package/dist/lib/cjs/code-generator.d.cts +14 -0
  34. package/dist/lib/cjs/commitlint-config.cjs +110 -0
  35. package/dist/lib/cjs/commitlint-config.d.cts +14 -0
  36. package/dist/lib/cjs/commitlint-forbidden-patterns.cjs +110 -0
  37. package/dist/lib/cjs/commitlint-forbidden-patterns.d.cts +37 -0
  38. package/dist/lib/cjs/commitlint-spellcheck-header.cjs +126 -0
  39. package/dist/lib/cjs/commitlint-spellcheck-header.d.cts +40 -0
  40. package/dist/lib/cjs/env-toggle.cjs +133 -0
  41. package/dist/lib/cjs/env-toggle.d.cts +42 -0
  42. package/dist/lib/cjs/exec.cjs +455 -0
  43. package/dist/lib/cjs/exec.d.cts +162 -0
  44. package/dist/lib/cjs/forbidden-patterns.cjs +157 -0
  45. package/dist/lib/cjs/forbidden-patterns.d.cts +57 -0
  46. package/dist/lib/cjs/formatters/dprint.cjs +108 -0
  47. package/dist/lib/cjs/formatters/dprint.d.cts +33 -0
  48. package/dist/lib/cjs/formatters/index.cjs +99 -0
  49. package/dist/lib/cjs/formatters/index.d.cts +2 -0
  50. package/dist/lib/cjs/fs.cjs +123 -0
  51. package/dist/lib/cjs/fs.d.cts +80 -0
  52. package/dist/lib/cjs/gate.cjs +140 -0
  53. package/dist/lib/cjs/gate.d.cts +93 -0
  54. package/dist/lib/cjs/git.cjs +109 -0
  55. package/dist/lib/cjs/git.d.cts +37 -0
  56. package/dist/lib/cjs/index.cjs +186 -0
  57. package/dist/lib/cjs/index.d.cts +35 -0
  58. package/dist/lib/cjs/json.cjs +141 -0
  59. package/dist/lib/cjs/json.d.cts +102 -0
  60. package/dist/lib/cjs/library-build.cjs +475 -0
  61. package/dist/lib/cjs/library-build.d.cts +97 -0
  62. package/dist/lib/cjs/linters/cspell-content.cjs +124 -0
  63. package/dist/lib/cjs/linters/cspell-content.d.cts +46 -0
  64. package/dist/lib/cjs/linters/cspell.cjs +103 -0
  65. package/dist/lib/cjs/linters/cspell.d.cts +36 -0
  66. package/dist/lib/cjs/linters/eslint-agnostic-core-boundary.cjs +94 -0
  67. package/dist/lib/cjs/linters/eslint-agnostic-core-boundary.d.cts +49 -0
  68. package/dist/lib/cjs/linters/eslint-config.cjs +1068 -0
  69. package/dist/lib/cjs/linters/eslint-config.d.cts +123 -0
  70. package/dist/lib/cjs/linters/eslint-no-restricted-syntax.cjs +130 -0
  71. package/dist/lib/cjs/linters/eslint-no-restricted-syntax.d.cts +27 -0
  72. package/dist/lib/cjs/linters/eslint-rules/in-house-plugin.cjs +116 -0
  73. package/dist/lib/cjs/linters/eslint-rules/in-house-plugin.d.cts +26 -0
  74. package/dist/lib/cjs/linters/eslint-rules/index.cjs +132 -0
  75. package/dist/lib/cjs/linters/eslint-rules/index.d.cts +13 -0
  76. package/dist/lib/cjs/linters/eslint-rules/no-async-callback-to-unsafe-return.cjs +175 -0
  77. package/dist/lib/cjs/linters/eslint-rules/no-async-callback-to-unsafe-return.d.cts +10 -0
  78. package/dist/lib/cjs/linters/eslint-rules/no-unresolved-jsdoc-link.cjs +290 -0
  79. package/dist/lib/cjs/linters/eslint-rules/no-unresolved-jsdoc-link.d.cts +10 -0
  80. package/dist/lib/cjs/linters/eslint-rules/no-unused-params-members.cjs +265 -0
  81. package/dist/lib/cjs/linters/eslint-rules/no-unused-params-members.d.cts +41 -0
  82. package/dist/lib/cjs/linters/eslint-rules/no-used-underscore-variables.cjs +134 -0
  83. package/dist/lib/cjs/linters/eslint-rules/no-used-underscore-variables.d.cts +20 -0
  84. package/dist/lib/cjs/linters/eslint-rules/params-options-name-match.cjs +217 -0
  85. package/dist/lib/cjs/linters/eslint-rules/params-options-name-match.d.cts +36 -0
  86. package/dist/lib/cjs/linters/eslint-rules/prefer-noop-async.cjs +126 -0
  87. package/dist/lib/cjs/linters/eslint-rules/prefer-noop-async.d.cts +10 -0
  88. package/dist/lib/cjs/linters/eslint-rules/readonly-params-options-result-members.cjs +125 -0
  89. package/dist/lib/cjs/linters/eslint-rules/readonly-params-options-result-members.d.cts +20 -0
  90. package/dist/lib/cjs/linters/eslint-rules/require-method-template.cjs +181 -0
  91. package/dist/lib/cjs/linters/eslint-rules/require-method-template.d.cts +14 -0
  92. package/dist/lib/cjs/linters/eslint-rules/require-super-call.cjs +217 -0
  93. package/dist/lib/cjs/linters/eslint-rules/require-super-call.d.cts +10 -0
  94. package/dist/lib/cjs/linters/eslint-rules/rule-tester-helper.cjs +92 -0
  95. package/dist/lib/cjs/linters/eslint-rules/rule-tester-helper.d.cts +18 -0
  96. package/dist/lib/cjs/linters/eslint-rules/ts-estree-node.cjs +92 -0
  97. package/dist/lib/cjs/linters/eslint-rules/ts-estree-node.d.cts +23 -0
  98. package/dist/lib/cjs/linters/eslint-types/@types/@eslint-community__eslint-plugin-eslint-comments__configs.d.cts +20 -0
  99. package/dist/lib/cjs/linters/eslint-types/@types/eslint-plugin-verify-tsdoc.d.cts +17 -0
  100. package/dist/lib/cjs/linters/eslint.cjs +122 -0
  101. package/dist/lib/cjs/linters/eslint.d.cts +35 -0
  102. package/dist/lib/cjs/linters/index.cjs +138 -0
  103. package/dist/lib/cjs/linters/index.d.cts +15 -0
  104. package/dist/lib/cjs/linters/lint-ignores.cjs +91 -0
  105. package/dist/lib/cjs/linters/lint-ignores.d.cts +30 -0
  106. package/dist/lib/cjs/linters/markdownlint-cli2-config.cjs +169 -0
  107. package/dist/lib/cjs/linters/markdownlint-cli2-config.d.cts +11 -0
  108. package/dist/lib/cjs/linters/markdownlint-content.cjs +120 -0
  109. package/dist/lib/cjs/linters/markdownlint-content.d.cts +47 -0
  110. package/dist/lib/cjs/linters/markdownlint-ignores.cjs +95 -0
  111. package/dist/lib/cjs/linters/markdownlint-ignores.d.cts +35 -0
  112. package/dist/lib/cjs/linters/markdownlint-rules/index.cjs +99 -0
  113. package/dist/lib/cjs/linters/markdownlint-rules/index.d.cts +2 -0
  114. package/dist/lib/cjs/linters/markdownlint-rules/no-soft-break-in-paragraph.cjs +152 -0
  115. package/dist/lib/cjs/linters/markdownlint-rules/no-soft-break-in-paragraph.d.cts +35 -0
  116. package/dist/lib/cjs/linters/markdownlint-types/@types/markdownlint-cli2-config-schema.d.cts +1344 -0
  117. package/dist/lib/cjs/linters/markdownlint-types/@types/markdownlint-cli2.d.cts +67 -0
  118. package/dist/lib/cjs/linters/markdownlint.cjs +151 -0
  119. package/dist/lib/cjs/linters/markdownlint.d.cts +32 -0
  120. package/dist/lib/cjs/linters/over-exposure.cjs +685 -0
  121. package/dist/lib/cjs/linters/over-exposure.d.cts +357 -0
  122. package/dist/lib/cjs/nano-staged-config.cjs +148 -0
  123. package/dist/lib/cjs/nano-staged-config.d.cts +54 -0
  124. package/dist/lib/cjs/npm-publish.cjs +93 -0
  125. package/dist/lib/cjs/npm-publish.d.cts +19 -0
  126. package/dist/lib/cjs/npm-run.cjs +120 -0
  127. package/dist/lib/cjs/npm-run.d.cts +34 -0
  128. package/dist/lib/cjs/npm.cjs +200 -0
  129. package/dist/lib/cjs/npm.d.cts +168 -0
  130. package/dist/lib/cjs/package-lock-integrity.cjs +134 -0
  131. package/dist/lib/cjs/package-lock-integrity.d.cts +38 -0
  132. package/dist/lib/cjs/package-manager.cjs +291 -0
  133. package/dist/lib/cjs/package-manager.d.cts +93 -0
  134. package/dist/lib/cjs/released-issues.cjs +178 -0
  135. package/dist/lib/cjs/released-issues.d.cts +79 -0
  136. package/dist/lib/cjs/repo-paths.cjs +167 -0
  137. package/dist/lib/cjs/repo-paths.d.cts +318 -0
  138. package/dist/lib/cjs/root.cjs +150 -0
  139. package/dist/lib/cjs/root.d.cts +107 -0
  140. package/dist/lib/cjs/test-runners/index.cjs +102 -0
  141. package/dist/lib/cjs/test-runners/index.d.cts +3 -0
  142. package/dist/lib/cjs/test-runners/vitest-config.cjs +126 -0
  143. package/dist/lib/cjs/test-runners/vitest-config.d.cts +90 -0
  144. package/dist/lib/cjs/test-runners/vitest.cjs +115 -0
  145. package/dist/lib/cjs/test-runners/vitest.d.cts +52 -0
  146. package/dist/lib/cjs/validate-declarations.cjs +120 -0
  147. package/dist/lib/cjs/validate-declarations.d.cts +37 -0
  148. package/dist/lib/cjs/version.cjs +758 -0
  149. package/dist/lib/cjs/version.d.cts +418 -0
  150. package/dist/lib/esm/build.d.mts +59 -0
  151. package/dist/lib/esm/build.mjs +165 -0
  152. package/dist/lib/esm/bundlers/esbuild-impl/change-extension-plugin.d.mts +25 -0
  153. package/dist/lib/esm/bundlers/esbuild-impl/change-extension-plugin.mjs +101 -0
  154. package/dist/lib/esm/bundlers/esbuild-impl/custom-esbuild-options-plugin.d.mts +14 -0
  155. package/dist/lib/esm/bundlers/esbuild-impl/custom-esbuild-options-plugin.mjs +59 -0
  156. package/dist/lib/esm/bundlers/esbuild-impl/fix-esm-plugin.d.mts +13 -0
  157. package/dist/lib/esm/bundlers/esbuild-impl/fix-esm-plugin.mjs +69 -0
  158. package/dist/lib/esm/bundlers/esbuild-impl/index.d.mts +6 -0
  159. package/dist/lib/esm/bundlers/esbuild-impl/index.mjs +60 -0
  160. package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.d.mts +143 -0
  161. package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.mjs +176 -0
  162. package/dist/lib/esm/bundlers/esbuild-impl/svelte-wrapper-plugin.d.mts +14 -0
  163. package/dist/lib/esm/bundlers/esbuild-impl/svelte-wrapper-plugin.mjs +82 -0
  164. package/dist/lib/esm/bundlers/index.d.mts +2 -0
  165. package/dist/lib/esm/bundlers/index.mjs +52 -0
  166. package/dist/lib/esm/check-project-types.d.mts +92 -0
  167. package/dist/lib/esm/check-project-types.mjs +123 -0
  168. package/dist/lib/esm/cli-utils.d.mts +123 -0
  169. package/dist/lib/esm/cli-utils.mjs +225 -0
  170. package/dist/lib/esm/code-generator.d.mts +14 -0
  171. package/dist/lib/esm/code-generator.mjs +59 -0
  172. package/dist/lib/esm/commitlint-config.d.mts +14 -0
  173. package/dist/lib/esm/commitlint-config.mjs +79 -0
  174. package/dist/lib/esm/commitlint-forbidden-patterns.d.mts +37 -0
  175. package/dist/lib/esm/commitlint-forbidden-patterns.mjs +75 -0
  176. package/dist/lib/esm/commitlint-spellcheck-header.d.mts +40 -0
  177. package/dist/lib/esm/commitlint-spellcheck-header.mjs +87 -0
  178. package/dist/lib/esm/env-toggle.d.mts +42 -0
  179. package/dist/lib/esm/env-toggle.mjs +84 -0
  180. package/dist/lib/esm/exec.d.mts +162 -0
  181. package/dist/lib/esm/exec.mjs +410 -0
  182. package/dist/lib/esm/forbidden-patterns.d.mts +57 -0
  183. package/dist/lib/esm/forbidden-patterns.mjs +108 -0
  184. package/dist/lib/esm/formatters/dprint.d.mts +33 -0
  185. package/dist/lib/esm/formatters/dprint.mjs +75 -0
  186. package/dist/lib/esm/formatters/index.d.mts +2 -0
  187. package/dist/lib/esm/formatters/index.mjs +52 -0
  188. package/dist/lib/esm/fs.d.mts +80 -0
  189. package/dist/lib/esm/fs.mjs +89 -0
  190. package/dist/lib/esm/gate.d.mts +93 -0
  191. package/dist/lib/esm/gate.mjs +106 -0
  192. package/dist/lib/esm/git.d.mts +37 -0
  193. package/dist/lib/esm/git.mjs +72 -0
  194. package/dist/lib/esm/index.d.mts +35 -0
  195. package/dist/lib/esm/index.mjs +110 -0
  196. package/dist/lib/esm/json.d.mts +102 -0
  197. package/dist/lib/esm/json.mjs +106 -0
  198. package/dist/lib/esm/library-build.d.mts +97 -0
  199. package/dist/lib/esm/library-build.mjs +435 -0
  200. package/dist/lib/esm/linters/cspell-content.d.mts +46 -0
  201. package/dist/lib/esm/linters/cspell-content.mjs +87 -0
  202. package/dist/lib/esm/linters/cspell.d.mts +36 -0
  203. package/dist/lib/esm/linters/cspell.mjs +69 -0
  204. package/dist/lib/esm/linters/eslint-agnostic-core-boundary.d.mts +49 -0
  205. package/dist/lib/esm/linters/eslint-agnostic-core-boundary.mjs +57 -0
  206. package/dist/lib/esm/linters/eslint-config.d.mts +123 -0
  207. package/dist/lib/esm/linters/eslint-config.mjs +1022 -0
  208. package/dist/lib/esm/linters/eslint-no-restricted-syntax.d.mts +27 -0
  209. package/dist/lib/esm/linters/eslint-no-restricted-syntax.mjs +93 -0
  210. package/dist/lib/esm/linters/eslint-rules/in-house-plugin.d.mts +26 -0
  211. package/dist/lib/esm/linters/eslint-rules/in-house-plugin.mjs +77 -0
  212. package/dist/lib/esm/linters/eslint-rules/index.d.mts +13 -0
  213. package/dist/lib/esm/linters/eslint-rules/index.mjs +74 -0
  214. package/dist/lib/esm/linters/eslint-rules/no-async-callback-to-unsafe-return.d.mts +10 -0
  215. package/dist/lib/esm/linters/eslint-rules/no-async-callback-to-unsafe-return.mjs +144 -0
  216. package/dist/lib/esm/linters/eslint-rules/no-unresolved-jsdoc-link.d.mts +10 -0
  217. package/dist/lib/esm/linters/eslint-rules/no-unresolved-jsdoc-link.mjs +277 -0
  218. package/dist/lib/esm/linters/eslint-rules/no-unused-params-members.d.mts +41 -0
  219. package/dist/lib/esm/linters/eslint-rules/no-unused-params-members.mjs +227 -0
  220. package/dist/lib/esm/linters/eslint-rules/no-used-underscore-variables.d.mts +20 -0
  221. package/dist/lib/esm/linters/eslint-rules/no-used-underscore-variables.mjs +96 -0
  222. package/dist/lib/esm/linters/eslint-rules/params-options-name-match.d.mts +36 -0
  223. package/dist/lib/esm/linters/eslint-rules/params-options-name-match.mjs +179 -0
  224. package/dist/lib/esm/linters/eslint-rules/prefer-noop-async.d.mts +10 -0
  225. package/dist/lib/esm/linters/eslint-rules/prefer-noop-async.mjs +88 -0
  226. package/dist/lib/esm/linters/eslint-rules/readonly-params-options-result-members.d.mts +20 -0
  227. package/dist/lib/esm/linters/eslint-rules/readonly-params-options-result-members.mjs +87 -0
  228. package/dist/lib/esm/linters/eslint-rules/require-method-template.d.mts +14 -0
  229. package/dist/lib/esm/linters/eslint-rules/require-method-template.mjs +142 -0
  230. package/dist/lib/esm/linters/eslint-rules/require-super-call.d.mts +10 -0
  231. package/dist/lib/esm/linters/eslint-rules/require-super-call.mjs +183 -0
  232. package/dist/lib/esm/linters/eslint-rules/rule-tester-helper.d.mts +18 -0
  233. package/dist/lib/esm/linters/eslint-rules/rule-tester-helper.mjs +55 -0
  234. package/dist/lib/esm/linters/eslint-rules/ts-estree-node.d.mts +23 -0
  235. package/dist/lib/esm/linters/eslint-rules/ts-estree-node.mjs +55 -0
  236. package/dist/lib/esm/linters/eslint-types/@types/@eslint-community__eslint-plugin-eslint-comments__configs.d.mts +20 -0
  237. package/dist/lib/esm/linters/eslint-types/@types/eslint-plugin-verify-tsdoc.d.mts +17 -0
  238. package/dist/lib/esm/linters/eslint.d.mts +35 -0
  239. package/dist/lib/esm/linters/eslint.mjs +88 -0
  240. package/dist/lib/esm/linters/index.d.mts +15 -0
  241. package/dist/lib/esm/linters/index.mjs +78 -0
  242. package/dist/lib/esm/linters/lint-ignores.d.mts +30 -0
  243. package/dist/lib/esm/linters/lint-ignores.mjs +54 -0
  244. package/dist/lib/esm/linters/markdownlint-cli2-config.d.mts +11 -0
  245. package/dist/lib/esm/linters/markdownlint-cli2-config.mjs +122 -0
  246. package/dist/lib/esm/linters/markdownlint-content.d.mts +47 -0
  247. package/dist/lib/esm/linters/markdownlint-content.mjs +83 -0
  248. package/dist/lib/esm/linters/markdownlint-ignores.d.mts +35 -0
  249. package/dist/lib/esm/linters/markdownlint-ignores.mjs +57 -0
  250. package/dist/lib/esm/linters/markdownlint-rules/index.d.mts +2 -0
  251. package/dist/lib/esm/linters/markdownlint-rules/index.mjs +52 -0
  252. package/dist/lib/esm/linters/markdownlint-rules/no-soft-break-in-paragraph.d.mts +35 -0
  253. package/dist/lib/esm/linters/markdownlint-rules/no-soft-break-in-paragraph.mjs +114 -0
  254. package/dist/lib/esm/linters/markdownlint-types/@types/markdownlint-cli2-config-schema.d.mts +1344 -0
  255. package/dist/lib/esm/linters/markdownlint-types/@types/markdownlint-cli2.d.mts +67 -0
  256. package/dist/lib/esm/linters/markdownlint.d.mts +32 -0
  257. package/dist/lib/esm/linters/markdownlint.mjs +124 -0
  258. package/dist/lib/esm/linters/over-exposure.d.mts +357 -0
  259. package/dist/lib/esm/linters/over-exposure.mjs +672 -0
  260. package/dist/lib/esm/nano-staged-config.d.mts +54 -0
  261. package/dist/lib/esm/nano-staged-config.mjs +103 -0
  262. package/dist/lib/esm/npm-publish.d.mts +19 -0
  263. package/dist/lib/esm/npm-publish.mjs +56 -0
  264. package/dist/lib/esm/npm-run.d.mts +34 -0
  265. package/dist/lib/esm/npm-run.mjs +81 -0
  266. package/dist/lib/esm/npm.d.mts +168 -0
  267. package/dist/lib/esm/npm.mjs +155 -0
  268. package/dist/lib/esm/package-lock-integrity.d.mts +38 -0
  269. package/dist/lib/esm/package-lock-integrity.mjs +99 -0
  270. package/dist/lib/esm/package-manager.d.mts +93 -0
  271. package/dist/lib/esm/package-manager.mjs +245 -0
  272. package/dist/lib/esm/released-issues.d.mts +79 -0
  273. package/dist/lib/esm/released-issues.mjs +143 -0
  274. package/dist/lib/esm/repo-paths.d.mts +318 -0
  275. package/dist/lib/esm/repo-paths.mjs +130 -0
  276. package/dist/lib/esm/root.d.mts +107 -0
  277. package/dist/lib/esm/root.mjs +115 -0
  278. package/dist/lib/esm/test-runners/index.d.mts +3 -0
  279. package/dist/lib/esm/test-runners/index.mjs +54 -0
  280. package/dist/lib/esm/test-runners/vitest-config.d.mts +90 -0
  281. package/dist/lib/esm/test-runners/vitest-config.mjs +86 -0
  282. package/dist/lib/esm/test-runners/vitest.d.mts +52 -0
  283. package/dist/lib/esm/test-runners/vitest.mjs +76 -0
  284. package/dist/lib/esm/validate-declarations.d.mts +37 -0
  285. package/dist/lib/esm/validate-declarations.mjs +87 -0
  286. package/dist/lib/esm/version.d.mts +418 -0
  287. package/dist/lib/esm/version.mjs +723 -0
  288. package/formatters/dprint/package.json +6 -0
  289. package/formatters/index/package.json +6 -0
  290. package/formatters/package.json +6 -0
  291. package/linters/cspell/package.json +6 -0
  292. package/linters/cspell-content/package.json +6 -0
  293. package/linters/eslint/package.json +6 -0
  294. package/linters/eslint-agnostic-core-boundary/package.json +6 -0
  295. package/linters/eslint-config/package.json +6 -0
  296. package/linters/eslint-no-restricted-syntax/package.json +6 -0
  297. package/linters/eslint-rules/in-house-plugin/package.json +6 -0
  298. package/linters/eslint-rules/index/package.json +6 -0
  299. package/linters/eslint-rules/no-async-callback-to-unsafe-return/package.json +6 -0
  300. package/linters/eslint-rules/no-unresolved-jsdoc-link/package.json +6 -0
  301. package/linters/eslint-rules/no-unused-params-members/package.json +6 -0
  302. package/linters/eslint-rules/no-used-underscore-variables/package.json +6 -0
  303. package/linters/eslint-rules/package.json +6 -0
  304. package/linters/eslint-rules/params-options-name-match/package.json +6 -0
  305. package/linters/eslint-rules/prefer-noop-async/package.json +6 -0
  306. package/linters/eslint-rules/readonly-params-options-result-members/package.json +6 -0
  307. package/linters/eslint-rules/require-method-template/package.json +6 -0
  308. package/linters/eslint-rules/require-super-call/package.json +6 -0
  309. package/linters/eslint-rules/rule-tester-helper/package.json +6 -0
  310. package/linters/eslint-rules/ts-estree-node/package.json +6 -0
  311. package/linters/eslint-types/@types/@eslint-community__eslint-plugin-eslint-comments__configs/package.json +4 -0
  312. package/linters/eslint-types/@types/eslint-plugin-verify-tsdoc/package.json +4 -0
  313. package/linters/index/package.json +6 -0
  314. package/linters/lint-ignores/package.json +6 -0
  315. package/linters/markdownlint/package.json +6 -0
  316. package/linters/markdownlint-cli2-config/package.json +6 -0
  317. package/linters/markdownlint-content/package.json +6 -0
  318. package/linters/markdownlint-ignores/package.json +6 -0
  319. package/linters/markdownlint-rules/index/package.json +6 -0
  320. package/linters/markdownlint-rules/no-soft-break-in-paragraph/package.json +6 -0
  321. package/linters/markdownlint-rules/package.json +6 -0
  322. package/linters/markdownlint-types/@types/markdownlint-cli2/package.json +4 -0
  323. package/linters/markdownlint-types/@types/markdownlint-cli2-config-schema/package.json +4 -0
  324. package/linters/over-exposure/package.json +6 -0
  325. package/linters/package.json +6 -0
  326. package/package.json +329 -13
  327. package/test-runners/index/package.json +6 -0
  328. package/test-runners/package.json +6 -0
  329. package/test-runners/vitest/package.json +6 -0
  330. package/test-runners/vitest-config/package.json +6 -0
@@ -0,0 +1,245 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ (function () {
7
+ function ensureDisposeSymbols(symbolConstructor = Symbol) {
8
+ symbolConstructor.asyncDispose ??= symbolConstructor.for('Symbol.asyncDispose');
9
+ symbolConstructor.dispose ??= symbolConstructor.for('Symbol.dispose');
10
+ }
11
+
12
+ function ensureBrowserProcess() {
13
+ const browserProcess = {
14
+ browser: true,
15
+ cwd() {
16
+ return '/';
17
+ },
18
+ env: {},
19
+ platform: 'android'
20
+ };
21
+
22
+ const existingProcess = globalThis.process;
23
+
24
+ if (!existingProcess) {
25
+ globalThis.process = browserProcess;
26
+ return;
27
+ }
28
+
29
+ if (existingProcess.versions?.node) {
30
+ return;
31
+ }
32
+
33
+ const existingProcessRecord = existingProcess;
34
+
35
+ for (const [key, value] of Object.entries(browserProcess)) {
36
+ existingProcessRecord[key] ??= value;
37
+ }
38
+
39
+ existingProcessRecord['browser'] = true;
40
+ }
41
+
42
+ (function initEsm() {
43
+ ensureDisposeSymbols();
44
+ ensureBrowserProcess();
45
+ })();
46
+ })();
47
+
48
+ import {
49
+ dirname,
50
+ join,
51
+ toPosixPath
52
+ } from "@mnaoumov/typescript-lib/path";
53
+ import { getMandatoryNamedGroup } from "@mnaoumov/typescript-lib/reg-exp";
54
+ import { assertNever } from "@mnaoumov/typescript-lib/type-guards";
55
+ import { existsSync } from "node:fs";
56
+ import process from "node:process";
57
+ import { readJsonSync } from "./json.mjs";
58
+ import { RepoPaths } from "./repo-paths.mjs";
59
+ import { getRootFolder } from "./root.mjs";
60
+ var PackageManager = /* @__PURE__ */ ((PackageManager2) => {
61
+ PackageManager2["Bun"] = "bun";
62
+ PackageManager2["Npm"] = "npm";
63
+ PackageManager2["Pnpm"] = "pnpm";
64
+ PackageManager2["Yarn"] = "yarn";
65
+ return PackageManager2;
66
+ })(PackageManager || {});
67
+ function getPackageManager(cwd) {
68
+ const root = getStartFolder(cwd);
69
+ const declaredPackageManager = detectPackageManagerFromPackageJson(root);
70
+ const lockfiles = LOCKFILES.filter((lockfile) => existsSync(join(root, lockfile.fileName)));
71
+ const claimants = new Set(lockfiles.map((lockfile) => lockfile.packageManager));
72
+ if (declaredPackageManager !== null) {
73
+ claimants.add(declaredPackageManager);
74
+ }
75
+ const packageManager = resolvePackageManager({
76
+ claimants,
77
+ declaredPackageManager
78
+ });
79
+ if (claimants.size > 1) {
80
+ warnAboutSeveralClaimants({
81
+ declaredPackageManager,
82
+ lockfiles,
83
+ packageManager,
84
+ root
85
+ });
86
+ }
87
+ return packageManager;
88
+ }
89
+ function getPackageManagerRunCommand(cwd) {
90
+ return [getPackageManager(cwd), "run"];
91
+ }
92
+ function resolveToolCommand(params) {
93
+ const { cwd, tool } = params;
94
+ const shimPath = findBinShim({ cwd, tool });
95
+ return shimPath === null ? [...getPackageManagerExecCommand(cwd), tool] : [shimPath];
96
+ }
97
+ const DECLARATION_NAME_REG_EXP = /^(?<name>[^@\s]+)@/;
98
+ const LOCKFILES = [
99
+ { fileName: RepoPaths.BunLock, packageManager: "bun" /* Bun */ },
100
+ { fileName: RepoPaths.BunLockb, packageManager: "bun" /* Bun */ },
101
+ { fileName: RepoPaths.PnpmLockYaml, packageManager: "pnpm" /* Pnpm */ },
102
+ { fileName: RepoPaths.YarnLock, packageManager: "yarn" /* Yarn */ },
103
+ { fileName: RepoPaths.PackageLockJson, packageManager: "npm" /* Npm */ }
104
+ ];
105
+ const USER_AGENT_NAME_REG_EXP = /^(?<name>[^/\s]+)\//;
106
+ const reportedDisagreements = /* @__PURE__ */ new Set();
107
+ function detectPackageManagerFromPackageJson(root) {
108
+ const packageJsonPath = join(root, RepoPaths.PackageJson);
109
+ if (!existsSync(packageJsonPath)) {
110
+ return null;
111
+ }
112
+ let packageJson;
113
+ try {
114
+ packageJson = readJsonSync(packageJsonPath);
115
+ } catch {
116
+ return null;
117
+ }
118
+ const declaration = packageJson.packageManager;
119
+ if (!declaration) {
120
+ return null;
121
+ }
122
+ const match = DECLARATION_NAME_REG_EXP.exec(declaration);
123
+ return match ? parsePackageManagerName(getMandatoryNamedGroup(match, "name")) : null;
124
+ }
125
+ function detectPackageManagerFromUserAgent() {
126
+ const userAgent = process.env["npm_config_user_agent"];
127
+ if (!userAgent) {
128
+ return null;
129
+ }
130
+ const match = USER_AGENT_NAME_REG_EXP.exec(userAgent);
131
+ return match ? parsePackageManagerName(getMandatoryNamedGroup(match, "name")) : null;
132
+ }
133
+ function findBinShim(params) {
134
+ const { cwd, tool } = params;
135
+ const candidates = getShimCandidates(tool);
136
+ let currentFolder = getStartFolder(cwd);
137
+ while (currentFolder !== RepoPaths.CurrentFolder && currentFolder !== RepoPaths.RootFolder) {
138
+ for (const candidate of candidates) {
139
+ const shimPath = join(currentFolder, RepoPaths.NodeModules, RepoPaths.Bin, candidate);
140
+ if (existsSync(shimPath)) {
141
+ return shimPath;
142
+ }
143
+ }
144
+ currentFolder = dirname(currentFolder);
145
+ }
146
+ return null;
147
+ }
148
+ function getPackageManagerExecCommand(cwd) {
149
+ const packageManager = getPackageManager(cwd);
150
+ switch (packageManager) {
151
+ case "bun" /* Bun */: {
152
+ return ["bun", "x"];
153
+ }
154
+ case "npm" /* Npm */: {
155
+ return ["npx"];
156
+ }
157
+ case "pnpm" /* Pnpm */: {
158
+ return ["pnpm", "exec"];
159
+ }
160
+ case "yarn" /* Yarn */: {
161
+ return ["yarn", "exec"];
162
+ }
163
+ /* v8 ignore start -- Exhaustive switch guard; default branch is unreachable. */
164
+ default: {
165
+ return assertNever(packageManager);
166
+ }
167
+ }
168
+ }
169
+ function getShimCandidates(tool) {
170
+ return process.platform === "win32" ? [
171
+ `${tool}${RepoPaths.CommandExtension}`,
172
+ `${tool}${RepoPaths.ExeExtension}`,
173
+ `${tool}${RepoPaths.BatExtension}`
174
+ ] : [tool];
175
+ }
176
+ function getStartFolder(cwd) {
177
+ return getRootFolder(cwd) ?? toPosixPath(cwd ?? process.cwd());
178
+ }
179
+ function parsePackageManagerName(name) {
180
+ switch (name) {
181
+ case "bun" /* Bun */: {
182
+ return "bun" /* Bun */;
183
+ }
184
+ case "npm" /* Npm */: {
185
+ return "npm" /* Npm */;
186
+ }
187
+ case "pnpm" /* Pnpm */: {
188
+ return "pnpm" /* Pnpm */;
189
+ }
190
+ case "yarn" /* Yarn */: {
191
+ return "yarn" /* Yarn */;
192
+ }
193
+ default: {
194
+ return null;
195
+ }
196
+ }
197
+ }
198
+ function resolvePackageManager(params) {
199
+ const {
200
+ claimants,
201
+ declaredPackageManager
202
+ } = params;
203
+ if (declaredPackageManager !== null) {
204
+ return declaredPackageManager;
205
+ }
206
+ const lockfileOwners = [...claimants];
207
+ const [firstLockfileOwner] = lockfileOwners;
208
+ if (firstLockfileOwner === void 0) {
209
+ return detectPackageManagerFromUserAgent() ?? "npm" /* Npm */;
210
+ }
211
+ if (lockfileOwners.length === 1) {
212
+ return firstLockfileOwner;
213
+ }
214
+ const launchedBy = detectPackageManagerFromUserAgent();
215
+ return launchedBy !== null && claimants.has(launchedBy) ? launchedBy : firstLockfileOwner;
216
+ }
217
+ function warnAboutSeveralClaimants(params) {
218
+ const {
219
+ declaredPackageManager,
220
+ lockfiles,
221
+ packageManager,
222
+ root
223
+ } = params;
224
+ const lockfileNames = lockfiles.map((lockfile) => lockfile.fileName).join(", ");
225
+ const advice = declaredPackageManager === null ? 'Delete the stale lockfile, or declare "packageManager" in package.json, to settle it.' : "Delete the stale lockfile to settle it.";
226
+ const message = [
227
+ `obsidian-dev-utils: more than one package manager claims ${root}.`,
228
+ `Lockfiles: ${lockfileNames}.`,
229
+ `package.json "packageManager": ${declaredPackageManager ?? "not set"}.`,
230
+ `Using ${packageManager}.`,
231
+ advice
232
+ ].join(" ");
233
+ if (reportedDisagreements.has(message)) {
234
+ return;
235
+ }
236
+ reportedDisagreements.add(message);
237
+ console.warn(message);
238
+ }
239
+ export {
240
+ PackageManager,
241
+ getPackageManager,
242
+ getPackageManagerRunCommand,
243
+ resolveToolCommand
244
+ };
245
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3BhY2thZ2UtbWFuYWdlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFJlc29sdmVzIGxvY2FsbHktaW5zdGFsbGVkIHRvb2wgYmluYXJpZXMgYW5kIHBhY2thZ2Utc2NyaXB0IHJ1bm5lcnMgd2l0aG91dCBhc3N1bWluZyBgbnBtYC5cbiAqXG4gKiBEZWxlZ2F0aW5nIHRvIGBucHhgIHNpbGVudGx5IGFzc3VtZXMgYW4gbnBtLWluc3RhbGxlZCB0cmVlLiBPbiBXaW5kb3dzIHRoYXQgYXNzdW1wdGlvbiBpcyBmYXRhbCB1bmRlclxuICogYGJ1bmA6IGBidW4gaW5zdGFsbGAgd3JpdGVzIGBub2RlX21vZHVsZXMvLmJpbi88dG9vbD4uZXhlYCwgbm90IHRoZSBgPHRvb2w+LmNtZGAgdGhhdCBucG0ncyBgbnB4YCBsb29rc1xuICogZm9yLCBzbyBgbnB4YCBtaXNzZXMgdGhlIGxvY2FsIGluc3RhbGwgZW50aXJlbHkgYW5kIGRvd25sb2FkcyB0aGUgdG9vbCBmcm9tIHRoZSByZWdpc3RyeSBpbnN0ZWFkIFx1MjAxNCB3aGljaFxuICogZm9yIGB0c2NgIGlzIHRoZSB3ZWxsLWtub3duIGRlY295IHBhY2thZ2UsIG5vdCBUeXBlU2NyaXB0LiBSZXNvbHZpbmcgdGhlIHNoaW0gZnJvbSBgbm9kZV9tb2R1bGVzLy5iaW5gXG4gKiBvdXJzZWx2ZXMgc2lkZXN0ZXBzIHRoZSB3aG9sZSBzaGltLWZvcm1hdCBxdWVzdGlvbiwgYmVjYXVzZSBldmVyeSBwYWNrYWdlIG1hbmFnZXIgd3JpdGVzIG9uZSB0aGVyZS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHtcbiAgZGlybmFtZSxcbiAgam9pbixcbiAgdG9Qb3NpeFBhdGhcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHsgZ2V0TWFuZGF0b3J5TmFtZWRHcm91cCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9yZWctZXhwJztcbmltcG9ydCB7IGFzc2VydE5ldmVyIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCB7IHJlYWRKc29uU3luYyB9IGZyb20gJy4vanNvbi50cyc7XG5pbXBvcnQgeyBSZXBvUGF0aHMgfSBmcm9tICcuL3JlcG8tcGF0aHMudHMnO1xuaW1wb3J0IHsgZ2V0Um9vdEZvbGRlciB9IGZyb20gJy4vcm9vdC50cyc7XG5cbi8qKlxuICogQSBwYWNrYWdlIG1hbmFnZXIgdGhhdCBjYW4gb3duIGEgcHJvamVjdCdzIGRlcGVuZGVuY3kgdHJlZS5cbiAqL1xuZXhwb3J0IGVudW0gUGFja2FnZU1hbmFnZXIge1xuICAvKipcbiAgICogVGhlIGBidW5gIHBhY2thZ2UgbWFuYWdlci5cbiAgICovXG4gIEJ1biA9ICdidW4nLFxuXG4gIC8qKlxuICAgKiBUaGUgYG5wbWAgcGFja2FnZSBtYW5hZ2VyLlxuICAgKi9cbiAgTnBtID0gJ25wbScsXG5cbiAgLyoqXG4gICAqIFRoZSBgcG5wbWAgcGFja2FnZSBtYW5hZ2VyLlxuICAgKi9cbiAgUG5wbSA9ICdwbnBtJyxcblxuICAvKipcbiAgICogVGhlIGB5YXJuYCBwYWNrYWdlIG1hbmFnZXIuXG4gICAqL1xuICBZYXJuID0gJ3lhcm4nXG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlc29sdmVUb29sQ29tbWFuZH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZVRvb2xDb21tYW5kUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHdvcmtpbmcgZm9sZGVyIHRvIHJlc29sdmUgZnJvbS5cbiAgICovXG4gIHJlYWRvbmx5IGN3ZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGxvY2FsbHktaW5zdGFsbGVkIHRvb2wsIGFzIGl0IGFwcGVhcnMgaW4gYG5vZGVfbW9kdWxlcy8uYmluYC5cbiAgICovXG4gIHJlYWRvbmx5IHRvb2w6IHN0cmluZztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoaWNoIHBhY2thZ2UgbWFuYWdlciBvd25zIHRoZSBwcm9qZWN0J3MgZGVwZW5kZW5jeSB0cmVlLlxuICpcbiAqIEV2ZXJ5IHNpZ25hbCBpcyBjb2xsZWN0ZWQgYmVmb3JlIGFueSBvZiB0aGVtIGlzIGJlbGlldmVkLCBiZWNhdXNlIGEgcmVwbyBjYXJyeWluZyB0d28gbG9ja2ZpbGVzIHVzZWQgdG9cbiAqIHJlc29sdmUgdG8gd2hpY2hldmVyIHNhdCBlYXJsaWVyIGluIGEgZml4ZWQgbGlzdCBcdTIwMTQgc2lsZW50bHkgcmVhc3NpZ25pbmcgZXZlcnkgcGFja2FnZSBzY3JpcHQgYW5kIGV2ZXJ5XG4gKiB0b29sIGludm9jYXRpb24gdG8gYSBtYW5hZ2VyIHRoYXQgbmV2ZXIgaW5zdGFsbGVkIHRoZSB0cmVlLlxuICpcbiAqIFRoZSBvcmRlciBpczpcbiAqXG4gKiAxLiBUaGUgYHBhY2thZ2VNYW5hZ2VyYCBmaWVsZCBvZiBgcGFja2FnZS5qc29uYC4gSXQgaXMgYSBkZWxpYmVyYXRlIGRlY2xhcmF0aW9uIGJ5IHRoZSByZXBvJ3MgYXV0aG9yXG4gKiAgICByYXRoZXIgdGhhbiBhbiBhcnRpZmFjdCBsZWZ0IGJlaGluZCBieSB3aGF0ZXZlciByYW4gbGFzdCwgc28gaXQgb3V0cmFua3MgZXZlcnkgbG9ja2ZpbGUgXHUyMDE0IGFuZCBpdCBpc1xuICogICAgdGhlIG9ubHkgc2lnbmFsIHRoYXQgaGVscHMgYXQgYWxsIGJlZm9yZSB0aGUgZmlyc3QgaW5zdGFsbCwgd2hlbiBubyBsb2NrZmlsZSBleGlzdHMgeWV0LlxuICogMi4gVGhlIHNvbGUgbG9ja2ZpbGUsIHdoZW4gZXhhY3RseSBvbmUgbWFuYWdlciBjbGFpbXMgdGhlIHRyZWUuXG4gKiAzLiBBbW9uZyBzZXZlcmFsIGxvY2tmaWxlcywgdGhlIG1hbmFnZXIgdGhhdCBsYXVuY2hlZCB1cyAoYG5wbV9jb25maWdfdXNlcl9hZ2VudGApLCB3aGVuIGl0IG93bnMgb25lIG9mXG4gKiAgICB0aGVtIFx1MjAxNCBhIGxpdmUgc2lnbmFsIGJlYXRzIGEgZmlsZSB0aGF0IG1heSBoYXZlIGJlZW4gYWJhbmRvbmVkIG1pZC1taWdyYXRpb24uIE90aGVyd2lzZSB0aGVcbiAqICAgIGRvY3VtZW50ZWQgZmFsbGJhY2sgb3JkZXIgaW4ge0BsaW5rIExPQ0tGSUxFU30gZGVjaWRlcy4gTm90ZSB0aGlzIGlzIGRlbGliZXJhdGVseSBOT1QgXCJ0aGUgbW9zdFxuICogICAgcmVjZW50bHkgbW9kaWZpZWQgbG9ja2ZpbGVcIjogYSBzdHJheSBsb2NrZmlsZSBpcyB0eXBpY2FsbHkgdGhlIG5ld2VzdCBmaWxlLCBzbyBtdGltZSBwaWNrcyBwcmVjaXNlbHlcbiAqICAgIHRoZSB3cm9uZyBvbmUuXG4gKiA0LiBgbnBtX2NvbmZpZ191c2VyX2FnZW50YCBvbiBpdHMgb3duLCB3aGVuIHRoZXJlIGlzIG5vIGxvY2tmaWxlLlxuICogNS4ge0BsaW5rIFBhY2thZ2VNYW5hZ2VyLk5wbX0uXG4gKlxuICogV2hlbmV2ZXIgbW9yZSB0aGFuIG9uZSBtYW5hZ2VyIGNsYWltcyB0aGUgdHJlZSwgdGhlIGRpc2FncmVlbWVudCBpcyByZXBvcnRlZCBvbmNlIHBlciBwcm9qZWN0IHRocm91Z2hcbiAqIHtAbGluayB3YXJuQWJvdXRTZXZlcmFsQ2xhaW1hbnRzfSBcdTIwMTQgdGhlIHJlc29sdXRpb24gc3RheXMgZGV0ZXJtaW5pc3RpYywgYnV0IGl0IHN0b3BzIGJlaW5nIHNpbGVudC5cbiAqXG4gKiBAcGFyYW0gY3dkIC0gVGhlIGN1cnJlbnQgd29ya2luZyBmb2xkZXIgdG8gcmVzb2x2ZSBmcm9tLlxuICogQHJldHVybnMgVGhlIGRldGVjdGVkIHBhY2thZ2UgbWFuYWdlciwgb3Ige0BsaW5rIFBhY2thZ2VNYW5hZ2VyLk5wbX0gd2hlbiBub3RoaW5nIGluZGljYXRlcyBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYWNrYWdlTWFuYWdlcihjd2Q/OiBzdHJpbmcpOiBQYWNrYWdlTWFuYWdlciB7XG4gIGNvbnN0IHJvb3QgPSBnZXRTdGFydEZvbGRlcihjd2QpO1xuICBjb25zdCBkZWNsYXJlZFBhY2thZ2VNYW5hZ2VyID0gZGV0ZWN0UGFja2FnZU1hbmFnZXJGcm9tUGFja2FnZUpzb24ocm9vdCk7XG4gIGNvbnN0IGxvY2tmaWxlcyA9IExPQ0tGSUxFUy5maWx0ZXIoKGxvY2tmaWxlKSA9PiBleGlzdHNTeW5jKGpvaW4ocm9vdCwgbG9ja2ZpbGUuZmlsZU5hbWUpKSk7XG4gIGNvbnN0IGNsYWltYW50cyA9IG5ldyBTZXQobG9ja2ZpbGVzLm1hcCgobG9ja2ZpbGUpID0+IGxvY2tmaWxlLnBhY2thZ2VNYW5hZ2VyKSk7XG5cbiAgaWYgKGRlY2xhcmVkUGFja2FnZU1hbmFnZXIgIT09IG51bGwpIHtcbiAgICBjbGFpbWFudHMuYWRkKGRlY2xhcmVkUGFja2FnZU1hbmFnZXIpO1xuICB9XG5cbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSByZXNvbHZlUGFja2FnZU1hbmFnZXIoe1xuICAgIGNsYWltYW50cyxcbiAgICBkZWNsYXJlZFBhY2thZ2VNYW5hZ2VyXG4gIH0pO1xuXG4gIGlmIChjbGFpbWFudHMuc2l6ZSA+IDEpIHtcbiAgICB3YXJuQWJvdXRTZXZlcmFsQ2xhaW1hbnRzKHtcbiAgICAgIGRlY2xhcmVkUGFja2FnZU1hbmFnZXIsXG4gICAgICBsb2NrZmlsZXMsXG4gICAgICBwYWNrYWdlTWFuYWdlcixcbiAgICAgIHJvb3RcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBwYWNrYWdlTWFuYWdlcjtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGNvbW1hbmQgcGFydHMgdGhhdCBydW4gYSBwYWNrYWdlIHNjcmlwdCB0aHJvdWdoIHRoZSBtYW5hZ2VyIHRoYXQgb3ducyB0aGUgdHJlZS5cbiAqXG4gKiBAcGFyYW0gY3dkIC0gVGhlIGN1cnJlbnQgd29ya2luZyBmb2xkZXIgdG8gcmVzb2x2ZSBmcm9tLlxuICogQHJldHVybnMgVGhlIGNvbW1hbmQgcGFydHMsIGUuZy4gYFsnYnVuJywgJ3J1biddYC4gVGhlIHNjcmlwdCBuYW1lIGlzIGFwcGVuZGVkIGJ5IHRoZSBjYWxsZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYWNrYWdlTWFuYWdlclJ1bkNvbW1hbmQoY3dkPzogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gW2dldFBhY2thZ2VNYW5hZ2VyKGN3ZCksICdydW4nXTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGNvbW1hbmQgcGFydHMgdGhhdCBydW4gYSBsb2NhbGx5LWluc3RhbGxlZCB0b29sLCB3aXRoIHRoZSB0b29sIGl0c2VsZiBhbHJlYWR5IGluY2x1ZGVkLlxuICpcbiAqIFByZWZlcnMgdGhlIHNoaW0gaW4gdGhlIG5lYXJlc3QgYG5vZGVfbW9kdWxlcy8uYmluYCwgd2Fsa2luZyB1cCB0aHJvdWdoIGFuY2VzdG9yIGZvbGRlcnMgc28gYSBob2lzdGVkXG4gKiB3b3Jrc3BhY2UgaW5zdGFsbCBpcyBzdGlsbCBmb3VuZC4gRmFsbHMgYmFjayB0byB0aGUgb3duaW5nIG1hbmFnZXIncyBleGVjIGZvcm0gd2hlbiBubyBzaGltIHJlc29sdmVzIFx1MjAxNFxuICogd2hpY2ggaXMgYm90aCB0aGUgcHJldmlvdXMgYmVoYXZpb3IgYW5kIHRoZSBvbmx5IHRoaW5nIHRoYXQgd29ya3MgdW5kZXIgeWFybidzIFBsdWcnbidQbGF5LCB3aGVyZVxuICogYG5vZGVfbW9kdWxlcy8uYmluYCBkb2VzIG5vdCBleGlzdCBhdCBhbGwuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgcmVzb2x1dGlvbi5cbiAqIEByZXR1cm5zIFRoZSBjb21tYW5kIHBhcnRzLCBlLmcuIGBbJy9wcm9qZWN0L25vZGVfbW9kdWxlcy8uYmluL3RzYyddYCBvciBgWydidW4nLCAneCcsICd0c2MnXWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVG9vbENvbW1hbmQocGFyYW1zOiBSZXNvbHZlVG9vbENvbW1hbmRQYXJhbXMpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHsgY3dkLCB0b29sIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHNoaW1QYXRoID0gZmluZEJpblNoaW0oeyBjd2QsIHRvb2wgfSk7XG5cbiAgcmV0dXJuIHNoaW1QYXRoID09PSBudWxsID8gWy4uLmdldFBhY2thZ2VNYW5hZ2VyRXhlY0NvbW1hbmQoY3dkKSwgdG9vbF0gOiBbc2hpbVBhdGhdO1xufVxuXG4vKipcbiAqIE1hdGNoZXMgdGhlIGxlYWRpbmcgYDxuYW1lPkBgIHRva2VuIG9mIGEgYHBhY2thZ2UuanNvbmAgYHBhY2thZ2VNYW5hZ2VyYCB2YWx1ZS5cbiAqXG4gKiBUaGUgYEBgIGlzIHJlcXVpcmVkLCBiZWNhdXNlIGNvcmVwYWNrJ3MgZm9ybWF0IGlzIGA8bmFtZT5APHZlcnNpb24+YCBcdTIwMTQgYSBiYXJlIG5hbWUgaXMgYSBtYWxmb3JtZWRcbiAqIGRlY2xhcmF0aW9uIHJhdGhlciB0aGFuIGEgc2hvcnRoYW5kLCBhbmQgaXMgaWdub3JlZCBpbnN0ZWFkIG9mIGd1ZXNzZWQgYXQuXG4gKi9cbmNvbnN0IERFQ0xBUkFUSU9OX05BTUVfUkVHX0VYUCA9IC9eKD88bmFtZT5bXkBcXHNdKylALztcblxuLyoqXG4gKiBUaGUgbG9ja2ZpbGVzIHRoYXQgaWRlbnRpZnkgYSBwYWNrYWdlIG1hbmFnZXIsIGluIHRoZSBvcmRlciB0aGV5IGRlY2lkZSBhIHRpZSBubyBvdGhlciBzaWduYWwgc2V0dGxlcy5cbiAqXG4gKiBCb3RoIGJ1biBsb2NrZmlsZSBmb3JtYXRzIG1hcCB0byB0aGUgc2FtZSBtYW5hZ2VyLCBzbyBhIHJlcG8gaG9sZGluZyBib3RoIGlzIG9uZSBjbGFpbWFudCwgbm90IHR3by5cbiAqL1xuY29uc3QgTE9DS0ZJTEVTOiBMb2NrZmlsZUNsYWltW10gPSBbXG4gIHsgZmlsZU5hbWU6IFJlcG9QYXRocy5CdW5Mb2NrLCBwYWNrYWdlTWFuYWdlcjogUGFja2FnZU1hbmFnZXIuQnVuIH0sXG4gIHsgZmlsZU5hbWU6IFJlcG9QYXRocy5CdW5Mb2NrYiwgcGFja2FnZU1hbmFnZXI6IFBhY2thZ2VNYW5hZ2VyLkJ1biB9LFxuICB7IGZpbGVOYW1lOiBSZXBvUGF0aHMuUG5wbUxvY2tZYW1sLCBwYWNrYWdlTWFuYWdlcjogUGFja2FnZU1hbmFnZXIuUG5wbSB9LFxuICB7IGZpbGVOYW1lOiBSZXBvUGF0aHMuWWFybkxvY2ssIHBhY2thZ2VNYW5hZ2VyOiBQYWNrYWdlTWFuYWdlci5ZYXJuIH0sXG4gIHsgZmlsZU5hbWU6IFJlcG9QYXRocy5QYWNrYWdlTG9ja0pzb24sIHBhY2thZ2VNYW5hZ2VyOiBQYWNrYWdlTWFuYWdlci5OcG0gfVxuXTtcblxuLyoqXG4gKiBNYXRjaGVzIHRoZSBsZWFkaW5nIGA8bmFtZT4vYCB0b2tlbiBvZiBhbiBgbnBtX2NvbmZpZ191c2VyX2FnZW50YCB2YWx1ZS5cbiAqL1xuY29uc3QgVVNFUl9BR0VOVF9OQU1FX1JFR19FWFAgPSAvXig/PG5hbWU+W14vXFxzXSspXFwvLztcblxuLyoqXG4gKiBUaGUgZGlzYWdyZWVtZW50cyBhbHJlYWR5IHJlcG9ydGVkLCBzbyBhIGJ1aWxkIHRoYXQgcmVzb2x2ZXMgdGhlIG1hbmFnZXIgb25jZSBwZXIgc2NyaXB0IGhvcCBhbmQgb25jZVxuICogcGVyIHRvb2wgaW52b2NhdGlvbiBzdGlsbCBzYXlzIGl0IG9ubHkgb25jZS5cbiAqL1xuY29uc3QgcmVwb3J0ZWREaXNhZ3JlZW1lbnRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGZpbmRCaW5TaGltfS5cbiAqL1xuaW50ZXJmYWNlIEZpbmRCaW5TaGltUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHdvcmtpbmcgZm9sZGVyIHRvIHJlc29sdmUgZnJvbS5cbiAgICovXG4gIHJlYWRvbmx5IGN3ZD86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGxvY2FsbHktaW5zdGFsbGVkIHRvb2wuXG4gICAqL1xuICByZWFkb25seSB0b29sOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBsb2NrZmlsZSBhbmQgdGhlIHBhY2thZ2UgbWFuYWdlciB3aG9zZSBwcmVzZW5jZSBpdCBwcm92ZXMuXG4gKi9cbmludGVyZmFjZSBMb2NrZmlsZUNsYWltIHtcbiAgLyoqXG4gICAqIFRoZSBsb2NrZmlsZSBuYW1lLCBhcyBpdCBhcHBlYXJzIGF0IHRoZSBwcm9qZWN0IHJvb3QuXG4gICAqL1xuICByZWFkb25seSBmaWxlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGFja2FnZSBtYW5hZ2VyIHRoYXQgd3JpdGVzIHRoaXMgbG9ja2ZpbGUuXG4gICAqL1xuICByZWFkb25seSBwYWNrYWdlTWFuYWdlcjogUGFja2FnZU1hbmFnZXI7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlc29sdmVQYWNrYWdlTWFuYWdlcn0uXG4gKi9cbmludGVyZmFjZSBSZXNvbHZlUGFja2FnZU1hbmFnZXJQYXJhbXMge1xuICAvKipcbiAgICogRXZlcnkgcGFja2FnZSBtYW5hZ2VyIGNsYWltaW5nIHRoZSB0cmVlIFx1MjAxNCB0aGUgbG9ja2ZpbGUgb3duZXJzIGluIHtAbGluayBMT0NLRklMRVN9IG9yZGVyLCBwbHVzIHRoZVxuICAgKiBkZWNsYXJlZCBvbmUuIE9ubHkgY29uc3VsdGVkIHdoZW4gbm90aGluZyBpcyBkZWNsYXJlZCwgaW4gd2hpY2ggY2FzZSBpdCBob2xkcyBleGFjdGx5IHRoZSBsb2NrZmlsZVxuICAgKiBvd25lcnMuXG4gICAqL1xuICByZWFkb25seSBjbGFpbWFudHM6IFJlYWRvbmx5U2V0PFBhY2thZ2VNYW5hZ2VyPjtcblxuICAvKipcbiAgICogVGhlIHBhY2thZ2UgbWFuYWdlciBkZWNsYXJlZCBpbiBgcGFja2FnZS5qc29uYCwgb3IgYG51bGxgIHdoZW4gbm9uZSBpcy5cbiAgICovXG4gIHJlYWRvbmx5IGRlY2xhcmVkUGFja2FnZU1hbmFnZXI6IG51bGwgfCBQYWNrYWdlTWFuYWdlcjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgd2FybkFib3V0U2V2ZXJhbENsYWltYW50c30uXG4gKi9cbmludGVyZmFjZSBXYXJuQWJvdXRTZXZlcmFsQ2xhaW1hbnRzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBwYWNrYWdlIG1hbmFnZXIgZGVjbGFyZWQgaW4gYHBhY2thZ2UuanNvbmAsIG9yIGBudWxsYCB3aGVuIG5vbmUgaXMuXG4gICAqL1xuICByZWFkb25seSBkZWNsYXJlZFBhY2thZ2VNYW5hZ2VyOiBudWxsIHwgUGFja2FnZU1hbmFnZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2NrZmlsZXMgYWN0dWFsbHkgZm91bmQgYXQgdGhlIHByb2plY3Qgcm9vdC5cbiAgICovXG4gIHJlYWRvbmx5IGxvY2tmaWxlczogcmVhZG9ubHkgTG9ja2ZpbGVDbGFpbVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgcGFja2FnZSBtYW5hZ2VyIHRoYXQgd29uLlxuICAgKi9cbiAgcmVhZG9ubHkgcGFja2FnZU1hbmFnZXI6IFBhY2thZ2VNYW5hZ2VyO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJvamVjdCByb290IHRoZSBsb2NrZmlsZXMgd2VyZSBmb3VuZCBpbi5cbiAgICovXG4gIHJlYWRvbmx5IHJvb3Q6IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgcGFja2FnZSBtYW5hZ2VyIG91dCBvZiB0aGUgYHBhY2thZ2VNYW5hZ2VyYCBmaWVsZCBvZiB0aGUgcHJvamVjdCdzIGBwYWNrYWdlLmpzb25gLCB3aGljaCBpc1xuICogY29yZXBhY2sncyBgPG5hbWU+QDx2ZXJzaW9uPmAgZGVjbGFyYXRpb24uXG4gKlxuICogQHBhcmFtIHJvb3QgLSBUaGUgcHJvamVjdCByb290IHRvIHJlYWQgYHBhY2thZ2UuanNvbmAgZnJvbS5cbiAqIEByZXR1cm5zIFRoZSBkZWNsYXJlZCBwYWNrYWdlIG1hbmFnZXIsIG9yIGBudWxsYCB3aGVuIHRoZXJlIGlzIG5vIGBwYWNrYWdlLmpzb25gLCBpdCBjYW5ub3QgYmUgcGFyc2VkLFxuICogdGhlIGZpZWxkIGlzIGFic2VudCBvciBtYWxmb3JtZWQsIG9yIGl0IG5hbWVzIGEgbWFuYWdlciB3ZSBkbyBub3QgaGFuZGxlLlxuICovXG5mdW5jdGlvbiBkZXRlY3RQYWNrYWdlTWFuYWdlckZyb21QYWNrYWdlSnNvbihyb290OiBzdHJpbmcpOiBudWxsIHwgUGFja2FnZU1hbmFnZXIge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBqb2luKHJvb3QsIFJlcG9QYXRocy5QYWNrYWdlSnNvbik7XG5cbiAgaWYgKCFleGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGxldCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb247XG5cbiAgdHJ5IHtcbiAgICBwYWNrYWdlSnNvbiA9IHJlYWRKc29uU3luYzxQYWNrYWdlSnNvbj4ocGFja2FnZUpzb25QYXRoKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBkZWNsYXJhdGlvbiA9IHBhY2thZ2VKc29uLnBhY2thZ2VNYW5hZ2VyO1xuXG4gIGlmICghZGVjbGFyYXRpb24pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IG1hdGNoID0gREVDTEFSQVRJT05fTkFNRV9SRUdfRVhQLmV4ZWMoZGVjbGFyYXRpb24pO1xuXG4gIHJldHVybiBtYXRjaCA/IHBhcnNlUGFja2FnZU1hbmFnZXJOYW1lKGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICduYW1lJykpIDogbnVsbDtcbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgcGFja2FnZSBtYW5hZ2VyIG91dCBvZiBgbnBtX2NvbmZpZ191c2VyX2FnZW50YCwgd2hpY2ggZXZlcnkgbWFuYWdlciBzZXRzIGZvciB0aGUgcHJvY2Vzc2VzIGl0XG4gKiBsYXVuY2hlcy5cbiAqXG4gKiBAcmV0dXJucyBUaGUgZGV0ZWN0ZWQgcGFja2FnZSBtYW5hZ2VyLCBvciBgbnVsbGAgd2hlbiB0aGUgdmFyaWFibGUgaXMgYWJzZW50LCBtYWxmb3JtZWQsIG9yIG5hbWVzIGFcbiAqIHJ1bnRpbWUgd2UgZG8gbm90IGhhbmRsZS5cbiAqL1xuZnVuY3Rpb24gZGV0ZWN0UGFja2FnZU1hbmFnZXJGcm9tVXNlckFnZW50KCk6IG51bGwgfCBQYWNrYWdlTWFuYWdlciB7XG4gIGNvbnN0IHVzZXJBZ2VudCA9IHByb2Nlc3MuZW52WyducG1fY29uZmlnX3VzZXJfYWdlbnQnXTtcblxuICBpZiAoIXVzZXJBZ2VudCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgbWF0Y2ggPSBVU0VSX0FHRU5UX05BTUVfUkVHX0VYUC5leGVjKHVzZXJBZ2VudCk7XG5cbiAgcmV0dXJuIG1hdGNoID8gcGFyc2VQYWNrYWdlTWFuYWdlck5hbWUoZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ25hbWUnKSkgOiBudWxsO1xufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBgbm9kZV9tb2R1bGVzLy5iaW5gIHNoaW0gZm9yIGEgdG9vbCwgd2Fsa2luZyB1cCBmcm9tIHRoZSBwcm9qZWN0IHJvb3QgdGhyb3VnaCBhbmNlc3RvciBmb2xkZXJzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGxvb2t1cC5cbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBzaGltLCBvciBgbnVsbGAgd2hlbiBub25lIGV4aXN0cy5cbiAqL1xuZnVuY3Rpb24gZmluZEJpblNoaW0ocGFyYW1zOiBGaW5kQmluU2hpbVBhcmFtcyk6IG51bGwgfCBzdHJpbmcge1xuICBjb25zdCB7IGN3ZCwgdG9vbCB9ID0gcGFyYW1zO1xuICBjb25zdCBjYW5kaWRhdGVzID0gZ2V0U2hpbUNhbmRpZGF0ZXModG9vbCk7XG4gIGxldCBjdXJyZW50Rm9sZGVyID0gZ2V0U3RhcnRGb2xkZXIoY3dkKTtcblxuICB3aGlsZSAoXG4gICAgY3VycmVudEZvbGRlciAhPT0gUmVwb1BhdGhzLkN1cnJlbnRGb2xkZXIgYXMgc3RyaW5nXG4gICAgJiYgY3VycmVudEZvbGRlciAhPT0gUmVwb1BhdGhzLlJvb3RGb2xkZXIgYXMgc3RyaW5nXG4gICkge1xuICAgIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICAgIGNvbnN0IHNoaW1QYXRoID0gam9pbihjdXJyZW50Rm9sZGVyLCBSZXBvUGF0aHMuTm9kZU1vZHVsZXMsIFJlcG9QYXRocy5CaW4sIGNhbmRpZGF0ZSk7XG4gICAgICBpZiAoZXhpc3RzU3luYyhzaGltUGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIHNoaW1QYXRoO1xuICAgICAgfVxuICAgIH1cblxuICAgIGN1cnJlbnRGb2xkZXIgPSBkaXJuYW1lKGN1cnJlbnRGb2xkZXIpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBjb21tYW5kIHBhcnRzIHRoYXQgcnVuIGEgb25lLW9mZiB0b29sIHRocm91Z2ggdGhlIG1hbmFnZXIgdGhhdCBvd25zIHRoZSB0cmVlLlxuICpcbiAqIEBwYXJhbSBjd2QgLSBUaGUgY3VycmVudCB3b3JraW5nIGZvbGRlciB0byByZXNvbHZlIGZyb20uXG4gKiBAcmV0dXJucyBUaGUgY29tbWFuZCBwYXJ0cywgZS5nLiBgWydidW4nLCAneCddYC4gVGhlIHRvb2wgbmFtZSBpcyBhcHBlbmRlZCBieSB0aGUgY2FsbGVyLlxuICovXG5mdW5jdGlvbiBnZXRQYWNrYWdlTWFuYWdlckV4ZWNDb21tYW5kKGN3ZD86IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBnZXRQYWNrYWdlTWFuYWdlcihjd2QpO1xuXG4gIHN3aXRjaCAocGFja2FnZU1hbmFnZXIpIHtcbiAgICBjYXNlIFBhY2thZ2VNYW5hZ2VyLkJ1bjoge1xuICAgICAgcmV0dXJuIFsnYnVuJywgJ3gnXTtcbiAgICB9XG4gICAgY2FzZSBQYWNrYWdlTWFuYWdlci5OcG06IHtcbiAgICAgIHJldHVybiBbJ25weCddO1xuICAgIH1cbiAgICBjYXNlIFBhY2thZ2VNYW5hZ2VyLlBucG06IHtcbiAgICAgIHJldHVybiBbJ3BucG0nLCAnZXhlYyddO1xuICAgIH1cbiAgICBjYXNlIFBhY2thZ2VNYW5hZ2VyLllhcm46IHtcbiAgICAgIHJldHVybiBbJ3lhcm4nLCAnZXhlYyddO1xuICAgIH1cbiAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gRXhoYXVzdGl2ZSBzd2l0Y2ggZ3VhcmQ7IGRlZmF1bHQgYnJhbmNoIGlzIHVucmVhY2hhYmxlLiAqL1xuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHJldHVybiBhc3NlcnROZXZlcihwYWNrYWdlTWFuYWdlcik7XG4gICAgfVxuICAgICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgfVxufVxuXG4vKipcbiAqIExpc3RzIHRoZSBzaGltIGZpbGUgbmFtZXMgdG8gdHJ5IGZvciBhIHRvb2wsIG1vc3Qgc3BlY2lmaWMgZmlyc3QuXG4gKlxuICogT24gV2luZG93cyBvbmx5IHRoZSBleGVjdXRhYmxlIGZvcm1zIGFyZSB2aWFibGU6IG5wbSBhbmQgcG5wbSBhbHNvIHdyaXRlIGEgc2hpbSB3aXRoIG5vIGV4dGVuc2lvbiwgYnV0XG4gKiB0aGF0IG9uZSBpcyBhIGBzaGAgc2NyaXB0IHRoYXQgYGNtZC5leGVgIGNhbm5vdCBydW4sIHNvIGl0IG11c3QgbmV2ZXIgYmUgY2hvc2VuIHRoZXJlLlxuICpcbiAqIEBwYXJhbSB0b29sIC0gVGhlIG5hbWUgb2YgdGhlIGxvY2FsbHktaW5zdGFsbGVkIHRvb2wuXG4gKiBAcmV0dXJucyBUaGUgY2FuZGlkYXRlIGZpbGUgbmFtZXMsIGluIHRoZSBvcmRlciB0aGV5IHNob3VsZCBiZSB0cmllZC5cbiAqL1xuZnVuY3Rpb24gZ2V0U2hpbUNhbmRpZGF0ZXModG9vbDogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJ1xuICAgID8gW1xuICAgICAgYCR7dG9vbH0ke1JlcG9QYXRocy5Db21tYW5kRXh0ZW5zaW9ufWAsXG4gICAgICBgJHt0b29sfSR7UmVwb1BhdGhzLkV4ZUV4dGVuc2lvbn1gLFxuICAgICAgYCR7dG9vbH0ke1JlcG9QYXRocy5CYXRFeHRlbnNpb259YFxuICAgIF1cbiAgICA6IFt0b29sXTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgZm9sZGVyIHRvIHN0YXJ0IGEgbG9va3VwIGZyb20gXHUyMDE0IHRoZSBwcm9qZWN0IHJvb3Qgd2hlbiB0aGVyZSBpcyBvbmUsIHRoZSB3b3JraW5nIGZvbGRlclxuICogb3RoZXJ3aXNlLlxuICpcbiAqIEBwYXJhbSBjd2QgLSBUaGUgY3VycmVudCB3b3JraW5nIGZvbGRlciB0byByZXNvbHZlIGZyb20uXG4gKiBAcmV0dXJucyBUaGUgYWJzb2x1dGUgZm9sZGVyIHRvIHN0YXJ0IGZyb20uXG4gKi9cbmZ1bmN0aW9uIGdldFN0YXJ0Rm9sZGVyKGN3ZD86IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBnZXRSb290Rm9sZGVyKGN3ZCkgPz8gdG9Qb3NpeFBhdGgoY3dkID8/IHByb2Nlc3MuY3dkKCkpO1xufVxuXG4vKipcbiAqIE1hcHMgdGhlIGJhcmUgbmFtZSBhIGxvY2tmaWxlIGRlY2xhcmF0aW9uIG9yIGEgdXNlciBhZ2VudCByZXBvcnRzIG9udG8gdGhlIHBhY2thZ2UgbWFuYWdlciBpdCBuYW1lcy5cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSByZXBvcnRlZCBuYW1lLlxuICogQHJldHVybnMgVGhlIG1hdGNoaW5nIHBhY2thZ2UgbWFuYWdlciwgb3IgYG51bGxgIGZvciBhIHJ1bnRpbWUgd2UgZG8gbm90IGhhbmRsZS5cbiAqL1xuZnVuY3Rpb24gcGFyc2VQYWNrYWdlTWFuYWdlck5hbWUobmFtZTogc3RyaW5nKTogbnVsbCB8IFBhY2thZ2VNYW5hZ2VyIHtcbiAgc3dpdGNoIChuYW1lKSB7XG4gICAgY2FzZSBQYWNrYWdlTWFuYWdlci5CdW4gYXMgc3RyaW5nOiB7XG4gICAgICByZXR1cm4gUGFja2FnZU1hbmFnZXIuQnVuO1xuICAgIH1cbiAgICBjYXNlIFBhY2thZ2VNYW5hZ2VyLk5wbSBhcyBzdHJpbmc6IHtcbiAgICAgIHJldHVybiBQYWNrYWdlTWFuYWdlci5OcG07XG4gICAgfVxuICAgIGNhc2UgUGFja2FnZU1hbmFnZXIuUG5wbSBhcyBzdHJpbmc6IHtcbiAgICAgIHJldHVybiBQYWNrYWdlTWFuYWdlci5QbnBtO1xuICAgIH1cbiAgICBjYXNlIFBhY2thZ2VNYW5hZ2VyLllhcm4gYXMgc3RyaW5nOiB7XG4gICAgICByZXR1cm4gUGFja2FnZU1hbmFnZXIuWWFybjtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUGlja3MgdGhlIHdpbm5lciBvdXQgb2YgdGhlIGNvbGxlY3RlZCBzaWduYWxzLCBwZXIgdGhlIG9yZGVyIGRvY3VtZW50ZWQgb24ge0BsaW5rIGdldFBhY2thZ2VNYW5hZ2VyfS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSByZXNvbHV0aW9uLlxuICogQHJldHVybnMgVGhlIHBhY2thZ2UgbWFuYWdlciB0aGF0IG93bnMgdGhlIHRyZWUuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVQYWNrYWdlTWFuYWdlcihwYXJhbXM6IFJlc29sdmVQYWNrYWdlTWFuYWdlclBhcmFtcyk6IFBhY2thZ2VNYW5hZ2VyIHtcbiAgY29uc3Qge1xuICAgIGNsYWltYW50cyxcbiAgICBkZWNsYXJlZFBhY2thZ2VNYW5hZ2VyXG4gIH0gPSBwYXJhbXM7XG5cbiAgaWYgKGRlY2xhcmVkUGFja2FnZU1hbmFnZXIgIT09IG51bGwpIHtcbiAgICByZXR1cm4gZGVjbGFyZWRQYWNrYWdlTWFuYWdlcjtcbiAgfVxuXG4gIGNvbnN0IGxvY2tmaWxlT3duZXJzID0gWy4uLmNsYWltYW50c107XG4gIGNvbnN0IFtmaXJzdExvY2tmaWxlT3duZXJdID0gbG9ja2ZpbGVPd25lcnM7XG5cbiAgaWYgKGZpcnN0TG9ja2ZpbGVPd25lciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGRldGVjdFBhY2thZ2VNYW5hZ2VyRnJvbVVzZXJBZ2VudCgpID8/IFBhY2thZ2VNYW5hZ2VyLk5wbTtcbiAgfVxuXG4gIGlmIChsb2NrZmlsZU93bmVycy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gZmlyc3RMb2NrZmlsZU93bmVyO1xuICB9XG5cbiAgY29uc3QgbGF1bmNoZWRCeSA9IGRldGVjdFBhY2thZ2VNYW5hZ2VyRnJvbVVzZXJBZ2VudCgpO1xuXG4gIHJldHVybiBsYXVuY2hlZEJ5ICE9PSBudWxsICYmIGNsYWltYW50cy5oYXMobGF1bmNoZWRCeSkgPyBsYXVuY2hlZEJ5IDogZmlyc3RMb2NrZmlsZU93bmVyO1xufVxuXG4vKipcbiAqIFJlcG9ydHMgdGhhdCBzZXZlcmFsIHBhY2thZ2UgbWFuYWdlcnMgY2xhaW0gdGhlIHNhbWUgdHJlZSwgbmFtaW5nIGVhY2ggbG9ja2ZpbGUgZm91bmQsIHdoYXRcbiAqIGBwYWNrYWdlLmpzb25gIGRlY2xhcmVzLCBhbmQgd2hpY2ggbWFuYWdlciB3b24uXG4gKlxuICogYGNvbnNvbGUud2FybmAgcmF0aGVyIHRoYW4gYSBkZWJ1ZyBjaGFubmVsOiB0aGlzIHJ1bnMgaW4gdGhlIGJ1aWxkJ3Mgb3duIHRlcm1pbmFsLCBhbmQgYSBtZXNzYWdlIG5vYm9keVxuICogc2VlcyB1bmxlc3MgdGhleSBhbHJlYWR5IHN1c3BlY3QgdGhlIHByb2JsZW0gbGVhdmVzIHRoZSBmYWlsdXJlIGV4YWN0bHkgYXMgc2lsZW50IGFzIGl0IHdhcy4gRWFjaFxuICogZGlzdGluY3QgbWVzc2FnZSBpcyBwcmludGVkIG9uY2UsIGJlY2F1c2UgdGhlIG1hbmFnZXIgaXMgcmVzb2x2ZWQgb25jZSBwZXIgcGFja2FnZS1zY3JpcHQgaG9wIGFuZCBvbmNlXG4gKiBwZXIgdG9vbCBpbnZvY2F0aW9uLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIHJlcG9ydC5cbiAqL1xuZnVuY3Rpb24gd2FybkFib3V0U2V2ZXJhbENsYWltYW50cyhwYXJhbXM6IFdhcm5BYm91dFNldmVyYWxDbGFpbWFudHNQYXJhbXMpOiB2b2lkIHtcbiAgY29uc3Qge1xuICAgIGRlY2xhcmVkUGFja2FnZU1hbmFnZXIsXG4gICAgbG9ja2ZpbGVzLFxuICAgIHBhY2thZ2VNYW5hZ2VyLFxuICAgIHJvb3RcbiAgfSA9IHBhcmFtcztcblxuICBjb25zdCBsb2NrZmlsZU5hbWVzID0gbG9ja2ZpbGVzLm1hcCgobG9ja2ZpbGUpID0+IGxvY2tmaWxlLmZpbGVOYW1lKS5qb2luKCcsICcpO1xuICBjb25zdCBhZHZpY2UgPSBkZWNsYXJlZFBhY2thZ2VNYW5hZ2VyID09PSBudWxsXG4gICAgPyAnRGVsZXRlIHRoZSBzdGFsZSBsb2NrZmlsZSwgb3IgZGVjbGFyZSBcInBhY2thZ2VNYW5hZ2VyXCIgaW4gcGFja2FnZS5qc29uLCB0byBzZXR0bGUgaXQuJ1xuICAgIDogJ0RlbGV0ZSB0aGUgc3RhbGUgbG9ja2ZpbGUgdG8gc2V0dGxlIGl0Lic7XG4gIGNvbnN0IG1lc3NhZ2UgPSBbXG4gICAgYG9ic2lkaWFuLWRldi11dGlsczogbW9yZSB0aGFuIG9uZSBwYWNrYWdlIG1hbmFnZXIgY2xhaW1zICR7cm9vdH0uYCxcbiAgICBgTG9ja2ZpbGVzOiAke2xvY2tmaWxlTmFtZXN9LmAsXG4gICAgYHBhY2thZ2UuanNvbiBcInBhY2thZ2VNYW5hZ2VyXCI6ICR7ZGVjbGFyZWRQYWNrYWdlTWFuYWdlciA/PyAnbm90IHNldCd9LmAsXG4gICAgYFVzaW5nICR7cGFja2FnZU1hbmFnZXJ9LmAsXG4gICAgYWR2aWNlXG4gIF0uam9pbignICcpO1xuXG4gIGlmIChyZXBvcnRlZERpc2FncmVlbWVudHMuaGFzKG1lc3NhZ2UpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmVwb3J0ZWREaXNhZ3JlZW1lbnRzLmFkZChtZXNzYWdlKTtcbiAgY29uc29sZS53YXJuKG1lc3NhZ2UpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFjQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLDhCQUE4QjtBQUN2QyxTQUFTLG1CQUFtQjtBQUM1QixTQUFTLGtCQUFrQjtBQUMzQixPQUFPLGFBQWE7QUFFcEIsU0FBUyxvQkFBb0I7QUFDN0IsU0FBUyxpQkFBaUI7QUFDMUIsU0FBUyxxQkFBcUI7QUFLdkIsSUFBSyxpQkFBTCxrQkFBS0Esb0JBQUw7QUFJTCxFQUFBQSxnQkFBQSxTQUFNO0FBS04sRUFBQUEsZ0JBQUEsU0FBTTtBQUtOLEVBQUFBLGdCQUFBLFVBQU87QUFLUCxFQUFBQSxnQkFBQSxVQUFPO0FBbkJHLFNBQUFBO0FBQUEsR0FBQTtBQWdFTCxTQUFTLGtCQUFrQixLQUE4QjtBQUM5RCxRQUFNLE9BQU8sZUFBZSxHQUFHO0FBQy9CLFFBQU0seUJBQXlCLG9DQUFvQyxJQUFJO0FBQ3ZFLFFBQU0sWUFBWSxVQUFVLE9BQU8sQ0FBQyxhQUFhLFdBQVcsS0FBSyxNQUFNLFNBQVMsUUFBUSxDQUFDLENBQUM7QUFDMUYsUUFBTSxZQUFZLElBQUksSUFBSSxVQUFVLElBQUksQ0FBQyxhQUFhLFNBQVMsY0FBYyxDQUFDO0FBRTlFLE1BQUksMkJBQTJCLE1BQU07QUFDbkMsY0FBVSxJQUFJLHNCQUFzQjtBQUFBLEVBQ3RDO0FBRUEsUUFBTSxpQkFBaUIsc0JBQXNCO0FBQUEsSUFDM0M7QUFBQSxJQUNBO0FBQUEsRUFDRixDQUFDO0FBRUQsTUFBSSxVQUFVLE9BQU8sR0FBRztBQUN0Qiw4QkFBMEI7QUFBQSxNQUN4QjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0YsQ0FBQztBQUFBLEVBQ0g7QUFFQSxTQUFPO0FBQ1Q7QUFRTyxTQUFTLDRCQUE0QixLQUF3QjtBQUNsRSxTQUFPLENBQUMsa0JBQWtCLEdBQUcsR0FBRyxLQUFLO0FBQ3ZDO0FBYU8sU0FBUyxtQkFBbUIsUUFBNEM7QUFDN0UsUUFBTSxFQUFFLEtBQUssS0FBSyxJQUFJO0FBQ3RCLFFBQU0sV0FBVyxZQUFZLEVBQUUsS0FBSyxLQUFLLENBQUM7QUFFMUMsU0FBTyxhQUFhLE9BQU8sQ0FBQyxHQUFHLDZCQUE2QixHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsUUFBUTtBQUNyRjtBQVFBLE1BQU0sMkJBQTJCO0FBT2pDLE1BQU0sWUFBNkI7QUFBQSxFQUNqQyxFQUFFLFVBQVUsVUFBVSxTQUFTLGdCQUFnQixnQkFBbUI7QUFBQSxFQUNsRSxFQUFFLFVBQVUsVUFBVSxVQUFVLGdCQUFnQixnQkFBbUI7QUFBQSxFQUNuRSxFQUFFLFVBQVUsVUFBVSxjQUFjLGdCQUFnQixrQkFBb0I7QUFBQSxFQUN4RSxFQUFFLFVBQVUsVUFBVSxVQUFVLGdCQUFnQixrQkFBb0I7QUFBQSxFQUNwRSxFQUFFLFVBQVUsVUFBVSxpQkFBaUIsZ0JBQWdCLGdCQUFtQjtBQUM1RTtBQUtBLE1BQU0sMEJBQTBCO0FBTWhDLE1BQU0sd0JBQXdCLG9CQUFJLElBQVk7QUFrRjlDLFNBQVMsb0NBQW9DLE1BQXFDO0FBQ2hGLFFBQU0sa0JBQWtCLEtBQUssTUFBTSxVQUFVLFdBQVc7QUFFeEQsTUFBSSxDQUFDLFdBQVcsZUFBZSxHQUFHO0FBQ2hDLFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBSTtBQUVKLE1BQUk7QUFDRixrQkFBYyxhQUEwQixlQUFlO0FBQUEsRUFDekQsUUFBUTtBQUNOLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxjQUFjLFlBQVk7QUFFaEMsTUFBSSxDQUFDLGFBQWE7QUFDaEIsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLFFBQVEseUJBQXlCLEtBQUssV0FBVztBQUV2RCxTQUFPLFFBQVEsd0JBQXdCLHVCQUF1QixPQUFPLE1BQU0sQ0FBQyxJQUFJO0FBQ2xGO0FBU0EsU0FBUyxvQ0FBMkQ7QUFDbEUsUUFBTSxZQUFZLFFBQVEsSUFBSSx1QkFBdUI7QUFFckQsTUFBSSxDQUFDLFdBQVc7QUFDZCxXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sUUFBUSx3QkFBd0IsS0FBSyxTQUFTO0FBRXBELFNBQU8sUUFBUSx3QkFBd0IsdUJBQXVCLE9BQU8sTUFBTSxDQUFDLElBQUk7QUFDbEY7QUFRQSxTQUFTLFlBQVksUUFBMEM7QUFDN0QsUUFBTSxFQUFFLEtBQUssS0FBSyxJQUFJO0FBQ3RCLFFBQU0sYUFBYSxrQkFBa0IsSUFBSTtBQUN6QyxNQUFJLGdCQUFnQixlQUFlLEdBQUc7QUFFdEMsU0FDRSxrQkFBa0IsVUFBVSxpQkFDekIsa0JBQWtCLFVBQVUsWUFDL0I7QUFDQSxlQUFXLGFBQWEsWUFBWTtBQUNsQyxZQUFNLFdBQVcsS0FBSyxlQUFlLFVBQVUsYUFBYSxVQUFVLEtBQUssU0FBUztBQUNwRixVQUFJLFdBQVcsUUFBUSxHQUFHO0FBQ3hCLGVBQU87QUFBQSxNQUNUO0FBQUEsSUFDRjtBQUVBLG9CQUFnQixRQUFRLGFBQWE7QUFBQSxFQUN2QztBQUVBLFNBQU87QUFDVDtBQVFBLFNBQVMsNkJBQTZCLEtBQXdCO0FBQzVELFFBQU0saUJBQWlCLGtCQUFrQixHQUFHO0FBRTVDLFVBQVEsZ0JBQWdCO0FBQUEsSUFDdEIsS0FBSyxpQkFBb0I7QUFDdkIsYUFBTyxDQUFDLE9BQU8sR0FBRztBQUFBLElBQ3BCO0FBQUEsSUFDQSxLQUFLLGlCQUFvQjtBQUN2QixhQUFPLENBQUMsS0FBSztBQUFBLElBQ2Y7QUFBQSxJQUNBLEtBQUssbUJBQXFCO0FBQ3hCLGFBQU8sQ0FBQyxRQUFRLE1BQU07QUFBQSxJQUN4QjtBQUFBLElBQ0EsS0FBSyxtQkFBcUI7QUFDeEIsYUFBTyxDQUFDLFFBQVEsTUFBTTtBQUFBLElBQ3hCO0FBQUE7QUFBQSxJQUVBLFNBQVM7QUFDUCxhQUFPLFlBQVksY0FBYztBQUFBLElBQ25DO0FBQUEsRUFFRjtBQUNGO0FBV0EsU0FBUyxrQkFBa0IsTUFBd0I7QUFDakQsU0FBTyxRQUFRLGFBQWEsVUFDeEI7QUFBQSxJQUNBLEdBQUcsSUFBSSxHQUFHLFVBQVUsZ0JBQWdCO0FBQUEsSUFDcEMsR0FBRyxJQUFJLEdBQUcsVUFBVSxZQUFZO0FBQUEsSUFDaEMsR0FBRyxJQUFJLEdBQUcsVUFBVSxZQUFZO0FBQUEsRUFDbEMsSUFDRSxDQUFDLElBQUk7QUFDWDtBQVNBLFNBQVMsZUFBZSxLQUFzQjtBQUM1QyxTQUFPLGNBQWMsR0FBRyxLQUFLLFlBQVksT0FBTyxRQUFRLElBQUksQ0FBQztBQUMvRDtBQVFBLFNBQVMsd0JBQXdCLE1BQXFDO0FBQ3BFLFVBQVEsTUFBTTtBQUFBLElBQ1osS0FBSyxpQkFBOEI7QUFDakMsYUFBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLEtBQUssaUJBQThCO0FBQ2pDLGFBQU87QUFBQSxJQUNUO0FBQUEsSUFDQSxLQUFLLG1CQUErQjtBQUNsQyxhQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0EsS0FBSyxtQkFBK0I7QUFDbEMsYUFBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLFNBQVM7QUFDUCxhQUFPO0FBQUEsSUFDVDtBQUFBLEVBQ0Y7QUFDRjtBQVFBLFNBQVMsc0JBQXNCLFFBQXFEO0FBQ2xGLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLEVBQ0YsSUFBSTtBQUVKLE1BQUksMkJBQTJCLE1BQU07QUFDbkMsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLGlCQUFpQixDQUFDLEdBQUcsU0FBUztBQUNwQyxRQUFNLENBQUMsa0JBQWtCLElBQUk7QUFFN0IsTUFBSSx1QkFBdUIsUUFBVztBQUNwQyxXQUFPLGtDQUFrQyxLQUFLO0FBQUEsRUFDaEQ7QUFFQSxNQUFJLGVBQWUsV0FBVyxHQUFHO0FBQy9CLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxhQUFhLGtDQUFrQztBQUVyRCxTQUFPLGVBQWUsUUFBUSxVQUFVLElBQUksVUFBVSxJQUFJLGFBQWE7QUFDekU7QUFhQSxTQUFTLDBCQUEwQixRQUErQztBQUNoRixRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0YsSUFBSTtBQUVKLFFBQU0sZ0JBQWdCLFVBQVUsSUFBSSxDQUFDLGFBQWEsU0FBUyxRQUFRLEVBQUUsS0FBSyxJQUFJO0FBQzlFLFFBQU0sU0FBUywyQkFBMkIsT0FDdEMsMEZBQ0E7QUFDSixRQUFNLFVBQVU7QUFBQSxJQUNkLDREQUE0RCxJQUFJO0FBQUEsSUFDaEUsY0FBYyxhQUFhO0FBQUEsSUFDM0Isa0NBQWtDLDBCQUEwQixTQUFTO0FBQUEsSUFDckUsU0FBUyxjQUFjO0FBQUEsSUFDdkI7QUFBQSxFQUNGLEVBQUUsS0FBSyxHQUFHO0FBRVYsTUFBSSxzQkFBc0IsSUFBSSxPQUFPLEdBQUc7QUFDdEM7QUFBQSxFQUNGO0FBRUEsd0JBQXNCLElBQUksT0FBTztBQUNqQyxVQUFRLEtBQUssT0FBTztBQUN0QjsiLAogICJuYW1lcyI6IFsiUGFja2FnZU1hbmFnZXIiXQp9Cg==
@@ -0,0 +1,79 @@
1
+ /// <reference path="./index.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Closes the GitHub issues a release carries, with a comment linking the release.
6
+ *
7
+ * An issue that a commit in the release names with a closing keyword (`fixes #12`, `closes #12`, `resolves #12`,
8
+ * and their other tenses) is closed as completed, with `Fixed in <release URL>` when it carries a `bug` label and
9
+ * `Implemented in <release URL>` otherwise. The URL is the `releases/tag/<version>` page, which exists by the time
10
+ * this runs.
11
+ *
12
+ * Only a closing keyword closes anything. A bare mention (`re #12`, `(#12)`, the issue URL) is often one step of
13
+ * unfinished work, and this module cannot know whether the rest has landed, so such an issue is listed as left open
14
+ * and nothing is posted to it.
15
+ *
16
+ * GitHub itself closes an issue named with a closing keyword as soon as the commit reaches the default branch —
17
+ * before the release, and without saying which release carries the change. So an issue that is already closed as
18
+ * completed still gets the release link, unless one of its comments already carries this release's URL, which also
19
+ * makes a second run post nothing.
20
+ */
21
+ /**
22
+ * Params for {@link closeReleasedIssues}.
23
+ */
24
+ export interface CloseReleasedIssuesParams {
25
+ /**
26
+ * The version just released. Its tag must exist locally and its GitHub release must be published.
27
+ */
28
+ readonly newVersion: string;
29
+ }
30
+ /**
31
+ * Params for {@link getIssueReferences}.
32
+ */
33
+ export interface GetIssueReferencesParams {
34
+ /**
35
+ * The commit messages to read.
36
+ */
37
+ readonly commitMessages: readonly string[];
38
+ /**
39
+ * The `<owner>/<name>` of the repository whose issues count. A reference into any other repository is ignored.
40
+ */
41
+ readonly repoSlug: string;
42
+ }
43
+ /**
44
+ * An issue number named by the commit messages of a release.
45
+ */
46
+ export interface IssueReference {
47
+ /**
48
+ * Whether at least one mention used a closing keyword.
49
+ */
50
+ readonly isClosing: boolean;
51
+ /**
52
+ * The issue or pull request number.
53
+ */
54
+ readonly number: number;
55
+ }
56
+ /**
57
+ * Closes the issues the release of {@link CloseReleasedIssuesParams.newVersion} carries, as described in the file
58
+ * overview.
59
+ *
60
+ * A failure to read or update one issue is reported and the rest are still processed, because the release is
61
+ * already published by the time this runs and nothing about it can be undone.
62
+ *
63
+ * @param params - The {@link CloseReleasedIssuesParams}.
64
+ * @returns A {@link Promise} that resolves to the numbers of the issues that could not be processed.
65
+ */
66
+ export declare function closeReleasedIssues(params: CloseReleasedIssuesParams): Promise<number[]>;
67
+ /**
68
+ * Collects the issue numbers of one repository that a set of commit messages names, and whether each was named with
69
+ * a closing keyword.
70
+ *
71
+ * Three forms count: a bare `#12`, `<owner>/<name>#12`, and the repository's `issues/12` or `pull/12` URL. A bare
72
+ * `#12` glued to a preceding token (`other#12`, `other/repo#12`, `&#12`) does not. A mention is closing when
73
+ * GitHub's own closing keyword precedes it directly: `close`, `closes`, `closed`, `fix`, `fixes`, `fixed`,
74
+ * `resolve`, `resolves` or `resolved`, in any case, optionally followed by a colon.
75
+ *
76
+ * @param params - The {@link GetIssueReferencesParams}.
77
+ * @returns The references, sorted by number, one per number.
78
+ */
79
+ export declare function getIssueReferences(params: GetIssueReferencesParams): IssueReference[];
@@ -0,0 +1,143 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ (function () {
7
+ function ensureDisposeSymbols(symbolConstructor = Symbol) {
8
+ symbolConstructor.asyncDispose ??= symbolConstructor.for('Symbol.asyncDispose');
9
+ symbolConstructor.dispose ??= symbolConstructor.for('Symbol.dispose');
10
+ }
11
+
12
+ function ensureBrowserProcess() {
13
+ const browserProcess = {
14
+ browser: true,
15
+ cwd() {
16
+ return '/';
17
+ },
18
+ env: {},
19
+ platform: 'android'
20
+ };
21
+
22
+ const existingProcess = globalThis.process;
23
+
24
+ if (!existingProcess) {
25
+ globalThis.process = browserProcess;
26
+ return;
27
+ }
28
+
29
+ if (existingProcess.versions?.node) {
30
+ return;
31
+ }
32
+
33
+ const existingProcessRecord = existingProcess;
34
+
35
+ for (const [key, value] of Object.entries(browserProcess)) {
36
+ existingProcessRecord[key] ??= value;
37
+ }
38
+
39
+ existingProcessRecord['browser'] = true;
40
+ }
41
+
42
+ (function initEsm() {
43
+ ensureDisposeSymbols();
44
+ ensureBrowserProcess();
45
+ })();
46
+ })();
47
+
48
+ import { errorToString } from "@mnaoumov/typescript-lib/error";
49
+ import {
50
+ escapeRegExp,
51
+ getOptionalNamedGroup
52
+ } from "@mnaoumov/typescript-lib/reg-exp";
53
+ import { execFromRoot } from "./root.mjs";
54
+ async function closeReleasedIssues(params) {
55
+ const { newVersion } = params;
56
+ const repoUrl = await execFromRoot("gh repo view --json url -q .url", { isQuiet: true });
57
+ const repoSlug = toRepoSlug(repoUrl);
58
+ if (!repoSlug) {
59
+ console.warn(`Not closing the released issues: '${repoUrl}' is not a GitHub repository URL.`);
60
+ return [];
61
+ }
62
+ const previousTag = await execFromRoot(["git", "describe", "--tags", "--abbrev=0", `${newVersion}^`], {
63
+ isQuiet: true,
64
+ shouldIgnoreExitCode: true
65
+ });
66
+ const commitRange = previousTag ? `${previousTag}..${newVersion}` : newVersion;
67
+ const commitMessagesString = await execFromRoot(["git", "log", commitRange, "--format=%B", "-z"], { isQuiet: true });
68
+ const references = getIssueReferences({ commitMessages: commitMessagesString.split("\0"), repoSlug });
69
+ const releaseUrl = `${repoUrl}/releases/tag/${newVersion}`;
70
+ const failedNumbers = [];
71
+ const leftOpenLines = [];
72
+ for (const reference of references) {
73
+ try {
74
+ const issue = JSON.parse(await execFromRoot(["gh", "api", `repos/${repoSlug}/issues/${String(reference.number)}`], { isQuiet: true }));
75
+ if (issue.pull_request !== void 0) {
76
+ continue;
77
+ }
78
+ const comment = `${issue.labels.some((label) => /bug/i.test(label.name)) ? "Fixed in" : "Implemented in"} ${releaseUrl}`;
79
+ const isOpen = issue.state === "open";
80
+ if (!reference.isClosing) {
81
+ if (isOpen) {
82
+ leftOpenLines.push(` #${String(reference.number)} ${issue.title}`);
83
+ }
84
+ continue;
85
+ }
86
+ if (isOpen) {
87
+ await execFromRoot(["gh", "issue", "close", String(reference.number), "-R", repoSlug, "--reason", "completed", "--comment", comment], {
88
+ isQuiet: true
89
+ });
90
+ console.warn(`Closed #${String(reference.number)} ${issue.title}: ${comment}`);
91
+ continue;
92
+ }
93
+ if (issue.state_reason !== "completed" || await hasCommentContaining(repoSlug, reference.number, releaseUrl)) {
94
+ continue;
95
+ }
96
+ await execFromRoot(["gh", "issue", "comment", String(reference.number), "-R", repoSlug, "--body", comment], { isQuiet: true });
97
+ console.warn(`Commented on the already closed #${String(reference.number)} ${issue.title}: ${comment}`);
98
+ } catch (error) {
99
+ failedNumbers.push(reference.number);
100
+ console.warn(`Could not process issue #${String(reference.number)} of ${repoSlug}: ${errorToString(error)}`);
101
+ }
102
+ }
103
+ if (leftOpenLines.length > 0) {
104
+ console.warn(
105
+ `Left open: the release names these issues without a closing keyword, so whether they are finished is not known here:
106
+ ${leftOpenLines.join("\n")}`
107
+ );
108
+ }
109
+ return failedNumbers;
110
+ }
111
+ function getIssueReferences(params) {
112
+ const { commitMessages, repoSlug } = params;
113
+ const escapedSlug = escapeRegExp(repoSlug);
114
+ const regExp = new RegExp(
115
+ String.raw`(?<keyword>\b(?:close[sd]?|fix(?:e[sd])?|resolve[sd]?):?\s+)?(?:https?://github\.com/${escapedSlug}/(?:issues|pull)/(?<urlNumber>\d+)|(?<![\w.-])${escapedSlug}#(?<slugNumber>\d+)\b|(?<![\w/&#.-])#(?<bareNumber>\d{1,6})\b)`,
116
+ "gi"
117
+ );
118
+ const closingFlagByNumber = /* @__PURE__ */ new Map();
119
+ for (const commitMessage of commitMessages) {
120
+ for (const match of commitMessage.matchAll(regExp)) {
121
+ const number = Number(
122
+ getOptionalNamedGroup(match, "urlNumber") ?? getOptionalNamedGroup(match, "slugNumber") ?? getOptionalNamedGroup(match, "bareNumber")
123
+ );
124
+ closingFlagByNumber.set(number, (closingFlagByNumber.get(number) ?? false) || getOptionalNamedGroup(match, "keyword") !== null);
125
+ }
126
+ }
127
+ return [...closingFlagByNumber].sort(([number1], [number2]) => number1 - number2).map(([number, isClosing]) => ({ isClosing, number }));
128
+ }
129
+ async function hasCommentContaining(repoSlug, issueNumber, text) {
130
+ const bodies = await execFromRoot(["gh", "api", "--paginate", `repos/${repoSlug}/issues/${String(issueNumber)}/comments`, "--jq", ".[].body"], {
131
+ isQuiet: true
132
+ });
133
+ return bodies.includes(text);
134
+ }
135
+ function toRepoSlug(repoUrl) {
136
+ const match = /^https:\/\/github\.com\/(?<slug>[^/]+\/[^/]+?)\/?$/.exec(repoUrl);
137
+ return match?.groups?.["slug"] ?? null;
138
+ }
139
+ export {
140
+ closeReleasedIssues,
141
+ getIssueReferences
142
+ };
143
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3JlbGVhc2VkLWlzc3Vlcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENsb3NlcyB0aGUgR2l0SHViIGlzc3VlcyBhIHJlbGVhc2UgY2Fycmllcywgd2l0aCBhIGNvbW1lbnQgbGlua2luZyB0aGUgcmVsZWFzZS5cbiAqXG4gKiBBbiBpc3N1ZSB0aGF0IGEgY29tbWl0IGluIHRoZSByZWxlYXNlIG5hbWVzIHdpdGggYSBjbG9zaW5nIGtleXdvcmQgKGBmaXhlcyAjMTJgLCBgY2xvc2VzICMxMmAsIGByZXNvbHZlcyAjMTJgLFxuICogYW5kIHRoZWlyIG90aGVyIHRlbnNlcykgaXMgY2xvc2VkIGFzIGNvbXBsZXRlZCwgd2l0aCBgRml4ZWQgaW4gPHJlbGVhc2UgVVJMPmAgd2hlbiBpdCBjYXJyaWVzIGEgYGJ1Z2AgbGFiZWwgYW5kXG4gKiBgSW1wbGVtZW50ZWQgaW4gPHJlbGVhc2UgVVJMPmAgb3RoZXJ3aXNlLiBUaGUgVVJMIGlzIHRoZSBgcmVsZWFzZXMvdGFnLzx2ZXJzaW9uPmAgcGFnZSwgd2hpY2ggZXhpc3RzIGJ5IHRoZSB0aW1lXG4gKiB0aGlzIHJ1bnMuXG4gKlxuICogT25seSBhIGNsb3Npbmcga2V5d29yZCBjbG9zZXMgYW55dGhpbmcuIEEgYmFyZSBtZW50aW9uIChgcmUgIzEyYCwgYCgjMTIpYCwgdGhlIGlzc3VlIFVSTCkgaXMgb2Z0ZW4gb25lIHN0ZXAgb2ZcbiAqIHVuZmluaXNoZWQgd29yaywgYW5kIHRoaXMgbW9kdWxlIGNhbm5vdCBrbm93IHdoZXRoZXIgdGhlIHJlc3QgaGFzIGxhbmRlZCwgc28gc3VjaCBhbiBpc3N1ZSBpcyBsaXN0ZWQgYXMgbGVmdCBvcGVuXG4gKiBhbmQgbm90aGluZyBpcyBwb3N0ZWQgdG8gaXQuXG4gKlxuICogR2l0SHViIGl0c2VsZiBjbG9zZXMgYW4gaXNzdWUgbmFtZWQgd2l0aCBhIGNsb3Npbmcga2V5d29yZCBhcyBzb29uIGFzIHRoZSBjb21taXQgcmVhY2hlcyB0aGUgZGVmYXVsdCBicmFuY2ggXHUyMDE0XG4gKiBiZWZvcmUgdGhlIHJlbGVhc2UsIGFuZCB3aXRob3V0IHNheWluZyB3aGljaCByZWxlYXNlIGNhcnJpZXMgdGhlIGNoYW5nZS4gU28gYW4gaXNzdWUgdGhhdCBpcyBhbHJlYWR5IGNsb3NlZCBhc1xuICogY29tcGxldGVkIHN0aWxsIGdldHMgdGhlIHJlbGVhc2UgbGluaywgdW5sZXNzIG9uZSBvZiBpdHMgY29tbWVudHMgYWxyZWFkeSBjYXJyaWVzIHRoaXMgcmVsZWFzZSdzIFVSTCwgd2hpY2ggYWxzb1xuICogbWFrZXMgYSBzZWNvbmQgcnVuIHBvc3Qgbm90aGluZy5cbiAqL1xuXG5pbXBvcnQgeyBlcnJvclRvU3RyaW5nIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2Vycm9yJztcbmltcG9ydCB7XG4gIGVzY2FwZVJlZ0V4cCxcbiAgZ2V0T3B0aW9uYWxOYW1lZEdyb3VwXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9yZWctZXhwJztcblxuaW1wb3J0IHsgZXhlY0Zyb21Sb290IH0gZnJvbSAnLi9yb290LnRzJztcblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBjbG9zZVJlbGVhc2VkSXNzdWVzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbG9zZVJlbGVhc2VkSXNzdWVzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIGp1c3QgcmVsZWFzZWQuIEl0cyB0YWcgbXVzdCBleGlzdCBsb2NhbGx5IGFuZCBpdHMgR2l0SHViIHJlbGVhc2UgbXVzdCBiZSBwdWJsaXNoZWQuXG4gICAqL1xuICByZWFkb25seSBuZXdWZXJzaW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZ2V0SXNzdWVSZWZlcmVuY2VzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRJc3N1ZVJlZmVyZW5jZXNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNvbW1pdCBtZXNzYWdlcyB0byByZWFkLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWl0TWVzc2FnZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgYDxvd25lcj4vPG5hbWU+YCBvZiB0aGUgcmVwb3NpdG9yeSB3aG9zZSBpc3N1ZXMgY291bnQuIEEgcmVmZXJlbmNlIGludG8gYW55IG90aGVyIHJlcG9zaXRvcnkgaXMgaWdub3JlZC5cbiAgICovXG4gIHJlYWRvbmx5IHJlcG9TbHVnOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQW4gaXNzdWUgbnVtYmVyIG5hbWVkIGJ5IHRoZSBjb21taXQgbWVzc2FnZXMgb2YgYSByZWxlYXNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElzc3VlUmVmZXJlbmNlIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgYXQgbGVhc3Qgb25lIG1lbnRpb24gdXNlZCBhIGNsb3Npbmcga2V5d29yZC5cbiAgICovXG4gIHJlYWRvbmx5IGlzQ2xvc2luZzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGlzc3VlIG9yIHB1bGwgcmVxdWVzdCBudW1iZXIuXG4gICAqL1xuICByZWFkb25seSBudW1iZXI6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIEdpdEh1Yklzc3VlIHtcbiAgcmVhZG9ubHkgbGFiZWxzOiByZWFkb25seSBHaXRIdWJMYWJlbFtdO1xuICByZWFkb25seSBwdWxsX3JlcXVlc3Q/OiB1bmtub3duO1xuICByZWFkb25seSBzdGF0ZTogc3RyaW5nO1xuICByZWFkb25seSBzdGF0ZV9yZWFzb24/OiBudWxsIHwgc3RyaW5nO1xuICByZWFkb25seSB0aXRsZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgR2l0SHViTGFiZWwge1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ2xvc2VzIHRoZSBpc3N1ZXMgdGhlIHJlbGVhc2Ugb2Yge0BsaW5rIENsb3NlUmVsZWFzZWRJc3N1ZXNQYXJhbXMubmV3VmVyc2lvbn0gY2FycmllcywgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlXG4gKiBvdmVydmlldy5cbiAqXG4gKiBBIGZhaWx1cmUgdG8gcmVhZCBvciB1cGRhdGUgb25lIGlzc3VlIGlzIHJlcG9ydGVkIGFuZCB0aGUgcmVzdCBhcmUgc3RpbGwgcHJvY2Vzc2VkLCBiZWNhdXNlIHRoZSByZWxlYXNlIGlzXG4gKiBhbHJlYWR5IHB1Ymxpc2hlZCBieSB0aGUgdGltZSB0aGlzIHJ1bnMgYW5kIG5vdGhpbmcgYWJvdXQgaXQgY2FuIGJlIHVuZG9uZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBDbG9zZVJlbGVhc2VkSXNzdWVzUGFyYW1zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIG51bWJlcnMgb2YgdGhlIGlzc3VlcyB0aGF0IGNvdWxkIG5vdCBiZSBwcm9jZXNzZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbG9zZVJlbGVhc2VkSXNzdWVzKHBhcmFtczogQ2xvc2VSZWxlYXNlZElzc3Vlc1BhcmFtcyk6IFByb21pc2U8bnVtYmVyW10+IHtcbiAgY29uc3QgeyBuZXdWZXJzaW9uIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHJlcG9VcmwgPSBhd2FpdCBleGVjRnJvbVJvb3QoJ2doIHJlcG8gdmlldyAtLWpzb24gdXJsIC1xIC51cmwnLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gIGNvbnN0IHJlcG9TbHVnID0gdG9SZXBvU2x1ZyhyZXBvVXJsKTtcbiAgaWYgKCFyZXBvU2x1Zykge1xuICAgIGNvbnNvbGUud2FybihgTm90IGNsb3NpbmcgdGhlIHJlbGVhc2VkIGlzc3VlczogJyR7cmVwb1VybH0nIGlzIG5vdCBhIEdpdEh1YiByZXBvc2l0b3J5IFVSTC5gKTtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBwcmV2aW91c1RhZyA9IGF3YWl0IGV4ZWNGcm9tUm9vdChbJ2dpdCcsICdkZXNjcmliZScsICctLXRhZ3MnLCAnLS1hYmJyZXY9MCcsIGAke25ld1ZlcnNpb259XmBdLCB7XG4gICAgaXNRdWlldDogdHJ1ZSxcbiAgICBzaG91bGRJZ25vcmVFeGl0Q29kZTogdHJ1ZVxuICB9KTtcbiAgY29uc3QgY29tbWl0UmFuZ2UgPSBwcmV2aW91c1RhZyA/IGAke3ByZXZpb3VzVGFnfS4uJHtuZXdWZXJzaW9ufWAgOiBuZXdWZXJzaW9uO1xuICBjb25zdCBjb21taXRNZXNzYWdlc1N0cmluZyA9IGF3YWl0IGV4ZWNGcm9tUm9vdChbJ2dpdCcsICdsb2cnLCBjb21taXRSYW5nZSwgJy0tZm9ybWF0PSVCJywgJy16J10sIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgY29uc3QgcmVmZXJlbmNlcyA9IGdldElzc3VlUmVmZXJlbmNlcyh7IGNvbW1pdE1lc3NhZ2VzOiBjb21taXRNZXNzYWdlc1N0cmluZy5zcGxpdCgnXFwwJyksIHJlcG9TbHVnIH0pO1xuICBjb25zdCByZWxlYXNlVXJsID0gYCR7cmVwb1VybH0vcmVsZWFzZXMvdGFnLyR7bmV3VmVyc2lvbn1gO1xuICBjb25zdCBmYWlsZWROdW1iZXJzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBsZWZ0T3BlbkxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIHJlZmVyZW5jZXMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaXNzdWUgPSBKU09OLnBhcnNlKGF3YWl0IGV4ZWNGcm9tUm9vdChbJ2doJywgJ2FwaScsIGByZXBvcy8ke3JlcG9TbHVnfS9pc3N1ZXMvJHtTdHJpbmcocmVmZXJlbmNlLm51bWJlcil9YF0sIHsgaXNRdWlldDogdHJ1ZSB9KSkgYXMgR2l0SHViSXNzdWU7XG4gICAgICBpZiAoaXNzdWUucHVsbF9yZXF1ZXN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbW1lbnQgPSBgJHtpc3N1ZS5sYWJlbHMuc29tZSgobGFiZWwpID0+IC9idWcvaS50ZXN0KGxhYmVsLm5hbWUpKSA/ICdGaXhlZCBpbicgOiAnSW1wbGVtZW50ZWQgaW4nfSAke3JlbGVhc2VVcmx9YDtcbiAgICAgIGNvbnN0IGlzT3BlbiA9IGlzc3VlLnN0YXRlID09PSAnb3Blbic7XG5cbiAgICAgIGlmICghcmVmZXJlbmNlLmlzQ2xvc2luZykge1xuICAgICAgICBpZiAoaXNPcGVuKSB7XG4gICAgICAgICAgbGVmdE9wZW5MaW5lcy5wdXNoKGAgICMke1N0cmluZyhyZWZlcmVuY2UubnVtYmVyKX0gJHtpc3N1ZS50aXRsZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzT3Blbikge1xuICAgICAgICBhd2FpdCBleGVjRnJvbVJvb3QoWydnaCcsICdpc3N1ZScsICdjbG9zZScsIFN0cmluZyhyZWZlcmVuY2UubnVtYmVyKSwgJy1SJywgcmVwb1NsdWcsICctLXJlYXNvbicsICdjb21wbGV0ZWQnLCAnLS1jb21tZW50JywgY29tbWVudF0sIHtcbiAgICAgICAgICBpc1F1aWV0OiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zb2xlLndhcm4oYENsb3NlZCAjJHtTdHJpbmcocmVmZXJlbmNlLm51bWJlcil9ICR7aXNzdWUudGl0bGV9OiAke2NvbW1lbnR9YCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNzdWUuc3RhdGVfcmVhc29uICE9PSAnY29tcGxldGVkJyB8fCBhd2FpdCBoYXNDb21tZW50Q29udGFpbmluZyhyZXBvU2x1ZywgcmVmZXJlbmNlLm51bWJlciwgcmVsZWFzZVVybCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGV4ZWNGcm9tUm9vdChbJ2doJywgJ2lzc3VlJywgJ2NvbW1lbnQnLCBTdHJpbmcocmVmZXJlbmNlLm51bWJlciksICctUicsIHJlcG9TbHVnLCAnLS1ib2R5JywgY29tbWVudF0sIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICAgIGNvbnNvbGUud2FybihgQ29tbWVudGVkIG9uIHRoZSBhbHJlYWR5IGNsb3NlZCAjJHtTdHJpbmcocmVmZXJlbmNlLm51bWJlcil9ICR7aXNzdWUudGl0bGV9OiAke2NvbW1lbnR9YCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGZhaWxlZE51bWJlcnMucHVzaChyZWZlcmVuY2UubnVtYmVyKTtcbiAgICAgIGNvbnNvbGUud2FybihgQ291bGQgbm90IHByb2Nlc3MgaXNzdWUgIyR7U3RyaW5nKHJlZmVyZW5jZS5udW1iZXIpfSBvZiAke3JlcG9TbHVnfTogJHtlcnJvclRvU3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG4gIH1cblxuICBpZiAobGVmdE9wZW5MaW5lcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgYExlZnQgb3BlbjogdGhlIHJlbGVhc2UgbmFtZXMgdGhlc2UgaXNzdWVzIHdpdGhvdXQgYSBjbG9zaW5nIGtleXdvcmQsIHNvIHdoZXRoZXIgdGhleSBhcmUgZmluaXNoZWQgaXMgbm90IGtub3duIGhlcmU6XFxuJHtsZWZ0T3BlbkxpbmVzLmpvaW4oJ1xcbicpfWBcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGZhaWxlZE51bWJlcnM7XG59XG5cbi8qKlxuICogQ29sbGVjdHMgdGhlIGlzc3VlIG51bWJlcnMgb2Ygb25lIHJlcG9zaXRvcnkgdGhhdCBhIHNldCBvZiBjb21taXQgbWVzc2FnZXMgbmFtZXMsIGFuZCB3aGV0aGVyIGVhY2ggd2FzIG5hbWVkIHdpdGhcbiAqIGEgY2xvc2luZyBrZXl3b3JkLlxuICpcbiAqIFRocmVlIGZvcm1zIGNvdW50OiBhIGJhcmUgYCMxMmAsIGA8b3duZXI+LzxuYW1lPiMxMmAsIGFuZCB0aGUgcmVwb3NpdG9yeSdzIGBpc3N1ZXMvMTJgIG9yIGBwdWxsLzEyYCBVUkwuIEEgYmFyZVxuICogYCMxMmAgZ2x1ZWQgdG8gYSBwcmVjZWRpbmcgdG9rZW4gKGBvdGhlciMxMmAsIGBvdGhlci9yZXBvIzEyYCwgYCYjMTJgKSBkb2VzIG5vdC4gQSBtZW50aW9uIGlzIGNsb3Npbmcgd2hlblxuICogR2l0SHViJ3Mgb3duIGNsb3Npbmcga2V5d29yZCBwcmVjZWRlcyBpdCBkaXJlY3RseTogYGNsb3NlYCwgYGNsb3Nlc2AsIGBjbG9zZWRgLCBgZml4YCwgYGZpeGVzYCwgYGZpeGVkYCxcbiAqIGByZXNvbHZlYCwgYHJlc29sdmVzYCBvciBgcmVzb2x2ZWRgLCBpbiBhbnkgY2FzZSwgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhIGNvbG9uLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIEdldElzc3VlUmVmZXJlbmNlc1BhcmFtc30uXG4gKiBAcmV0dXJucyBUaGUgcmVmZXJlbmNlcywgc29ydGVkIGJ5IG51bWJlciwgb25lIHBlciBudW1iZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJc3N1ZVJlZmVyZW5jZXMocGFyYW1zOiBHZXRJc3N1ZVJlZmVyZW5jZXNQYXJhbXMpOiBJc3N1ZVJlZmVyZW5jZVtdIHtcbiAgY29uc3QgeyBjb21taXRNZXNzYWdlcywgcmVwb1NsdWcgfSA9IHBhcmFtcztcbiAgY29uc3QgZXNjYXBlZFNsdWcgPSBlc2NhcGVSZWdFeHAocmVwb1NsdWcpO1xuICBjb25zdCByZWdFeHAgPSBuZXcgUmVnRXhwKFxuICAgIFN0cmluZy5yYXdgKD88a2V5d29yZD5cXGIoPzpjbG9zZVtzZF0/fGZpeCg/OmVbc2RdKT98cmVzb2x2ZVtzZF0/KTo/XFxzKyk/KD86aHR0cHM/Oi8vZ2l0aHViXFwuY29tLyR7ZXNjYXBlZFNsdWd9Lyg/Omlzc3Vlc3xwdWxsKS8oPzx1cmxOdW1iZXI+XFxkKyl8KD88IVtcXHcuLV0pJHtlc2NhcGVkU2x1Z30jKD88c2x1Z051bWJlcj5cXGQrKVxcYnwoPzwhW1xcdy8mIy4tXSkjKD88YmFyZU51bWJlcj5cXGR7MSw2fSlcXGIpYCxcbiAgICAnZ2knXG4gICk7XG4gIGNvbnN0IGNsb3NpbmdGbGFnQnlOdW1iZXIgPSBuZXcgTWFwPG51bWJlciwgYm9vbGVhbj4oKTtcblxuICBmb3IgKGNvbnN0IGNvbW1pdE1lc3NhZ2Ugb2YgY29tbWl0TWVzc2FnZXMpIHtcbiAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIGNvbW1pdE1lc3NhZ2UubWF0Y2hBbGwocmVnRXhwKSkge1xuICAgICAgY29uc3QgbnVtYmVyID0gTnVtYmVyKFxuICAgICAgICBnZXRPcHRpb25hbE5hbWVkR3JvdXAobWF0Y2gsICd1cmxOdW1iZXInKSA/PyBnZXRPcHRpb25hbE5hbWVkR3JvdXAobWF0Y2gsICdzbHVnTnVtYmVyJykgPz8gZ2V0T3B0aW9uYWxOYW1lZEdyb3VwKG1hdGNoLCAnYmFyZU51bWJlcicpXG4gICAgICApO1xuICAgICAgY2xvc2luZ0ZsYWdCeU51bWJlci5zZXQobnVtYmVyLCAoY2xvc2luZ0ZsYWdCeU51bWJlci5nZXQobnVtYmVyKSA/PyBmYWxzZSkgfHwgZ2V0T3B0aW9uYWxOYW1lZEdyb3VwKG1hdGNoLCAna2V5d29yZCcpICE9PSBudWxsKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gWy4uLmNsb3NpbmdGbGFnQnlOdW1iZXJdXG4gICAgLnNvcnQoKFtudW1iZXIxXSwgW251bWJlcjJdKSA9PiBudW1iZXIxIC0gbnVtYmVyMilcbiAgICAubWFwKChbbnVtYmVyLCBpc0Nsb3NpbmddKSA9PiAoeyBpc0Nsb3NpbmcsIG51bWJlciB9KSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhc0NvbW1lbnRDb250YWluaW5nKHJlcG9TbHVnOiBzdHJpbmcsIGlzc3VlTnVtYmVyOiBudW1iZXIsIHRleHQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBib2RpZXMgPSBhd2FpdCBleGVjRnJvbVJvb3QoWydnaCcsICdhcGknLCAnLS1wYWdpbmF0ZScsIGByZXBvcy8ke3JlcG9TbHVnfS9pc3N1ZXMvJHtTdHJpbmcoaXNzdWVOdW1iZXIpfS9jb21tZW50c2AsICctLWpxJywgJy5bXS5ib2R5J10sIHtcbiAgICBpc1F1aWV0OiB0cnVlXG4gIH0pO1xuICByZXR1cm4gYm9kaWVzLmluY2x1ZGVzKHRleHQpO1xufVxuXG5mdW5jdGlvbiB0b1JlcG9TbHVnKHJlcG9Vcmw6IHN0cmluZyk6IG51bGwgfCBzdHJpbmcge1xuICBjb25zdCBtYXRjaCA9IC9eaHR0cHM6XFwvXFwvZ2l0aHViXFwuY29tXFwvKD88c2x1Zz5bXi9dK1xcL1teL10rPylcXC8/JC8uZXhlYyhyZXBvVXJsKTtcbiAgcmV0dXJuIG1hdGNoPy5ncm91cHM/Llsnc2x1ZyddID8/IG51bGw7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQSxTQUFTLHFCQUFxQjtBQUM5QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUVQLFNBQVMsb0JBQW9CO0FBZ0U3QixlQUFzQixvQkFBb0IsUUFBc0Q7QUFDOUYsUUFBTSxFQUFFLFdBQVcsSUFBSTtBQUN2QixRQUFNLFVBQVUsTUFBTSxhQUFhLG1DQUFtQyxFQUFFLFNBQVMsS0FBSyxDQUFDO0FBQ3ZGLFFBQU0sV0FBVyxXQUFXLE9BQU87QUFDbkMsTUFBSSxDQUFDLFVBQVU7QUFDYixZQUFRLEtBQUsscUNBQXFDLE9BQU8sbUNBQW1DO0FBQzVGLFdBQU8sQ0FBQztBQUFBLEVBQ1Y7QUFFQSxRQUFNLGNBQWMsTUFBTSxhQUFhLENBQUMsT0FBTyxZQUFZLFVBQVUsY0FBYyxHQUFHLFVBQVUsR0FBRyxHQUFHO0FBQUEsSUFDcEcsU0FBUztBQUFBLElBQ1Qsc0JBQXNCO0FBQUEsRUFDeEIsQ0FBQztBQUNELFFBQU0sY0FBYyxjQUFjLEdBQUcsV0FBVyxLQUFLLFVBQVUsS0FBSztBQUNwRSxRQUFNLHVCQUF1QixNQUFNLGFBQWEsQ0FBQyxPQUFPLE9BQU8sYUFBYSxlQUFlLElBQUksR0FBRyxFQUFFLFNBQVMsS0FBSyxDQUFDO0FBQ25ILFFBQU0sYUFBYSxtQkFBbUIsRUFBRSxnQkFBZ0IscUJBQXFCLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQztBQUNwRyxRQUFNLGFBQWEsR0FB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