@dyanet/nestjs-config-aws 1.0.1 → 1.2.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 (391) hide show
  1. package/README.md +213 -1013
  2. package/dist/cjs/config-aws/src/config-manager.js +366 -0
  3. package/dist/cjs/config-aws/src/errors/index.js +77 -0
  4. package/dist/cjs/config-aws/src/index.js +37 -0
  5. package/dist/cjs/config-aws/src/interfaces/config-loader.interface.js +3 -0
  6. package/dist/cjs/config-aws/src/interfaces/config-manager.interface.js +3 -0
  7. package/dist/cjs/config-aws/src/interfaces/env-file-loader.interface.js +3 -0
  8. package/dist/cjs/config-aws/src/interfaces/environment-loader.interface.js +3 -0
  9. package/dist/cjs/config-aws/src/interfaces/s3-loader.interface.js +3 -0
  10. package/dist/cjs/config-aws/src/interfaces/secrets-manager-loader.interface.js +3 -0
  11. package/dist/cjs/config-aws/src/interfaces/ssm-parameter-store-loader.interface.js +3 -0
  12. package/dist/cjs/config-aws/src/loaders/env-file.loader.js +169 -0
  13. package/dist/cjs/config-aws/src/loaders/environment.loader.js +85 -0
  14. package/dist/cjs/config-aws/src/loaders/s3.loader.js +145 -0
  15. package/dist/cjs/config-aws/src/loaders/secrets-manager.loader.js +169 -0
  16. package/dist/cjs/config-aws/src/loaders/ssm-parameter-store.loader.js +199 -0
  17. package/dist/cjs/config-aws/src/utils/env-file-parser.util.js +98 -0
  18. package/dist/cjs/config-aws/src/utils/validation.util.js +116 -0
  19. package/dist/cjs/nestjs-config-aws/src/config.module.js +175 -0
  20. package/dist/cjs/nestjs-config-aws/src/index.js +61 -0
  21. package/dist/cjs/{integration → nestjs-config-aws/src/integration}/index.js +1 -1
  22. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/configuration-factory.interface.js +3 -0
  23. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/configuration-source.interface.js +3 -0
  24. package/dist/cjs/{integration → nestjs-config-aws/src/integration}/interfaces/index.js +1 -1
  25. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/integration-options.interface.js +3 -0
  26. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/integration-state.interface.js +3 -0
  27. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/nestjs-config-compatibility.interface.js +73 -0
  28. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/nestjs-config-integration.interface.js +3 -0
  29. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/typed-configuration.interface.js +4 -0
  30. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/utility-types.interface.js +52 -0
  31. package/dist/cjs/nestjs-config-aws/src/integration/nestjs-config-integration.module.js +124 -0
  32. package/dist/cjs/nestjs-config-aws/src/integration/providers/aws-configuration-loader.service.js +592 -0
  33. package/dist/cjs/nestjs-config-aws/src/integration/providers/configuration-factory.provider.js +385 -0
  34. package/dist/cjs/{integration → nestjs-config-aws/src/integration}/providers/index.js +1 -1
  35. package/dist/cjs/nestjs-config-aws/src/integration/services/async-config-helper.service.js +366 -0
  36. package/dist/cjs/nestjs-config-aws/src/integration/services/error-handler.service.js +267 -0
  37. package/dist/cjs/nestjs-config-aws/src/integration/services/factory-registration.service.js +517 -0
  38. package/dist/cjs/{integration → nestjs-config-aws/src/integration}/services/index.js +1 -1
  39. package/dist/cjs/nestjs-config-aws/src/integration/services/integration-state.service.js +81 -0
  40. package/dist/cjs/nestjs-config-aws/src/integration/services/namespace-handler.service.js +465 -0
  41. package/dist/cjs/nestjs-config-aws/src/integration/services/nestjs-config-integration.service.js +318 -0
  42. package/dist/cjs/nestjs-config-aws/src/integration/services/precedence-handler.service.js +292 -0
  43. package/dist/cjs/nestjs-config-aws/src/integration/services/validation-integration.service.js +595 -0
  44. package/dist/cjs/nestjs-config-aws/src/integration/utils/config-integration.util.js +283 -0
  45. package/dist/cjs/{integration → nestjs-config-aws/src/integration}/utils/index.js +1 -1
  46. package/dist/cjs/nestjs-config-aws/src/interfaces/config-service.interface.js +11 -0
  47. package/dist/cjs/nestjs-config-aws/src/interfaces/default-schema.interface.js +63 -0
  48. package/dist/cjs/nestjs-config-aws/src/interfaces/index.js +30 -0
  49. package/dist/cjs/nestjs-config-aws/src/interfaces/module-options.interface.js +3 -0
  50. package/dist/cjs/nestjs-config-aws/src/services/config.service.js +142 -0
  51. package/dist/esm/config-aws/src/config-manager.js +362 -0
  52. package/dist/esm/config-aws/src/errors/index.js +69 -0
  53. package/dist/esm/config-aws/src/index.js +21 -0
  54. package/dist/esm/config-aws/src/interfaces/config-loader.interface.js +2 -0
  55. package/dist/esm/config-aws/src/interfaces/config-manager.interface.js +2 -0
  56. package/dist/esm/config-aws/src/interfaces/env-file-loader.interface.js +2 -0
  57. package/dist/esm/config-aws/src/interfaces/environment-loader.interface.js +2 -0
  58. package/dist/esm/config-aws/src/interfaces/s3-loader.interface.js +2 -0
  59. package/dist/esm/config-aws/src/interfaces/secrets-manager-loader.interface.js +2 -0
  60. package/dist/esm/config-aws/src/interfaces/ssm-parameter-store-loader.interface.js +2 -0
  61. package/dist/esm/config-aws/src/loaders/env-file.loader.js +132 -0
  62. package/dist/esm/config-aws/src/loaders/environment.loader.js +81 -0
  63. package/dist/esm/config-aws/src/loaders/s3.loader.js +141 -0
  64. package/dist/esm/config-aws/src/loaders/secrets-manager.loader.js +165 -0
  65. package/dist/esm/config-aws/src/loaders/ssm-parameter-store.loader.js +195 -0
  66. package/dist/esm/config-aws/src/utils/env-file-parser.util.js +94 -0
  67. package/dist/esm/config-aws/src/utils/validation.util.js +112 -0
  68. package/dist/esm/nestjs-config-aws/src/config.module.js +172 -0
  69. package/dist/esm/nestjs-config-aws/src/index.js +23 -0
  70. package/dist/esm/nestjs-config-aws/src/integration/index.js +7 -0
  71. package/dist/esm/nestjs-config-aws/src/integration/interfaces/configuration-factory.interface.js +2 -0
  72. package/dist/esm/nestjs-config-aws/src/integration/interfaces/configuration-source.interface.js +2 -0
  73. package/dist/esm/nestjs-config-aws/src/integration/interfaces/index.js +10 -0
  74. package/dist/esm/nestjs-config-aws/src/integration/interfaces/integration-options.interface.js +2 -0
  75. package/dist/esm/nestjs-config-aws/src/integration/interfaces/integration-state.interface.js +2 -0
  76. package/dist/esm/nestjs-config-aws/src/integration/interfaces/nestjs-config-compatibility.interface.js +64 -0
  77. package/dist/esm/nestjs-config-aws/src/integration/interfaces/nestjs-config-integration.interface.js +2 -0
  78. package/dist/esm/nestjs-config-aws/src/integration/interfaces/typed-configuration.interface.js +3 -0
  79. package/dist/esm/nestjs-config-aws/src/integration/interfaces/utility-types.interface.js +44 -0
  80. package/dist/esm/nestjs-config-aws/src/integration/nestjs-config-integration.module.js +121 -0
  81. package/dist/esm/nestjs-config-aws/src/integration/providers/aws-configuration-loader.service.js +589 -0
  82. package/dist/esm/nestjs-config-aws/src/integration/providers/configuration-factory.provider.js +382 -0
  83. package/dist/esm/nestjs-config-aws/src/integration/providers/index.js +4 -0
  84. package/dist/esm/nestjs-config-aws/src/integration/services/async-config-helper.service.js +363 -0
  85. package/dist/esm/nestjs-config-aws/src/integration/services/error-handler.service.js +264 -0
  86. package/dist/esm/nestjs-config-aws/src/integration/services/factory-registration.service.js +514 -0
  87. package/dist/esm/nestjs-config-aws/src/integration/services/index.js +10 -0
  88. package/dist/esm/nestjs-config-aws/src/integration/services/integration-state.service.js +78 -0
  89. package/dist/esm/nestjs-config-aws/src/integration/services/namespace-handler.service.js +462 -0
  90. package/dist/esm/nestjs-config-aws/src/integration/services/nestjs-config-integration.service.js +315 -0
  91. package/dist/esm/nestjs-config-aws/src/integration/services/precedence-handler.service.js +289 -0
  92. package/dist/esm/nestjs-config-aws/src/integration/services/validation-integration.service.js +589 -0
  93. package/dist/esm/nestjs-config-aws/src/integration/utils/config-integration.util.js +240 -0
  94. package/dist/esm/nestjs-config-aws/src/integration/utils/index.js +3 -0
  95. package/dist/esm/nestjs-config-aws/src/interfaces/config-service.interface.js +7 -0
  96. package/dist/esm/nestjs-config-aws/src/interfaces/default-schema.interface.js +59 -0
  97. package/dist/esm/nestjs-config-aws/src/interfaces/index.js +8 -0
  98. package/dist/esm/nestjs-config-aws/src/interfaces/module-options.interface.js +2 -0
  99. package/dist/esm/nestjs-config-aws/src/services/config.service.js +139 -0
  100. package/dist/types/config-aws/src/config-manager.d.ts +119 -0
  101. package/dist/types/config-aws/src/config-manager.d.ts.map +1 -0
  102. package/dist/types/config-aws/src/errors/index.d.ts +43 -0
  103. package/dist/types/config-aws/src/errors/index.d.ts.map +1 -0
  104. package/dist/types/config-aws/src/index.d.ts +24 -0
  105. package/dist/types/config-aws/src/index.d.ts.map +1 -0
  106. package/dist/types/config-aws/src/interfaces/config-loader.interface.d.ts +33 -0
  107. package/dist/types/config-aws/src/interfaces/config-loader.interface.d.ts.map +1 -0
  108. package/dist/types/config-aws/src/interfaces/config-manager.interface.d.ts +86 -0
  109. package/dist/types/config-aws/src/interfaces/config-manager.interface.d.ts.map +1 -0
  110. package/dist/types/config-aws/src/interfaces/env-file-loader.interface.d.ts +12 -0
  111. package/dist/types/config-aws/src/interfaces/env-file-loader.interface.d.ts.map +1 -0
  112. package/dist/types/config-aws/src/interfaces/environment-loader.interface.d.ts +10 -0
  113. package/dist/types/config-aws/src/interfaces/environment-loader.interface.d.ts.map +1 -0
  114. package/dist/types/config-aws/src/interfaces/s3-loader.interface.d.ts +14 -0
  115. package/dist/types/config-aws/src/interfaces/s3-loader.interface.d.ts.map +1 -0
  116. package/dist/types/config-aws/src/interfaces/secrets-manager-loader.interface.d.ts +12 -0
  117. package/dist/types/config-aws/src/interfaces/secrets-manager-loader.interface.d.ts.map +1 -0
  118. package/dist/types/config-aws/src/interfaces/ssm-parameter-store-loader.interface.d.ts +14 -0
  119. package/dist/types/config-aws/src/interfaces/ssm-parameter-store-loader.interface.d.ts.map +1 -0
  120. package/dist/types/config-aws/src/loaders/env-file.loader.d.ts +69 -0
  121. package/dist/types/config-aws/src/loaders/env-file.loader.d.ts.map +1 -0
  122. package/dist/types/config-aws/src/loaders/environment.loader.d.ts +46 -0
  123. package/dist/types/config-aws/src/loaders/environment.loader.d.ts.map +1 -0
  124. package/dist/types/config-aws/src/loaders/s3.loader.d.ts +62 -0
  125. package/dist/types/config-aws/src/loaders/s3.loader.d.ts.map +1 -0
  126. package/dist/types/config-aws/src/loaders/secrets-manager.loader.d.ts +68 -0
  127. package/dist/types/config-aws/src/loaders/secrets-manager.loader.d.ts.map +1 -0
  128. package/dist/types/config-aws/src/loaders/ssm-parameter-store.loader.d.ts +78 -0
  129. package/dist/types/config-aws/src/loaders/ssm-parameter-store.loader.d.ts.map +1 -0
  130. package/dist/types/config-aws/src/utils/env-file-parser.util.d.ts +45 -0
  131. package/dist/types/config-aws/src/utils/env-file-parser.util.d.ts.map +1 -0
  132. package/dist/types/{utils → config-aws/src/utils}/validation.util.d.ts +10 -10
  133. package/dist/types/config-aws/src/utils/validation.util.d.ts.map +1 -0
  134. package/dist/types/{config.module.d.ts → nestjs-config-aws/src/config.module.d.ts} +1 -0
  135. package/dist/types/nestjs-config-aws/src/config.module.d.ts.map +1 -0
  136. package/dist/types/{index.d.ts → nestjs-config-aws/src/index.d.ts} +2 -4
  137. package/dist/types/nestjs-config-aws/src/index.d.ts.map +1 -0
  138. package/dist/types/nestjs-config-aws/src/integration/index.d.ts.map +1 -0
  139. package/dist/types/nestjs-config-aws/src/integration/interfaces/configuration-factory.interface.d.ts.map +1 -0
  140. package/dist/types/nestjs-config-aws/src/integration/interfaces/configuration-source.interface.d.ts.map +1 -0
  141. package/dist/types/nestjs-config-aws/src/integration/interfaces/index.d.ts.map +1 -0
  142. package/dist/types/nestjs-config-aws/src/integration/interfaces/integration-options.interface.d.ts.map +1 -0
  143. package/dist/types/nestjs-config-aws/src/integration/interfaces/integration-state.interface.d.ts.map +1 -0
  144. package/dist/types/nestjs-config-aws/src/integration/interfaces/nestjs-config-compatibility.interface.d.ts.map +1 -0
  145. package/dist/types/nestjs-config-aws/src/integration/interfaces/nestjs-config-integration.interface.d.ts.map +1 -0
  146. package/dist/types/nestjs-config-aws/src/integration/interfaces/typed-configuration.interface.d.ts.map +1 -0
  147. package/dist/types/nestjs-config-aws/src/integration/interfaces/utility-types.interface.d.ts.map +1 -0
  148. package/dist/types/nestjs-config-aws/src/integration/nestjs-config-integration.module.d.ts.map +1 -0
  149. package/dist/types/nestjs-config-aws/src/integration/providers/aws-configuration-loader.service.d.ts.map +1 -0
  150. package/dist/types/nestjs-config-aws/src/integration/providers/configuration-factory.provider.d.ts.map +1 -0
  151. package/dist/types/nestjs-config-aws/src/integration/providers/index.d.ts.map +1 -0
  152. package/dist/types/nestjs-config-aws/src/integration/services/async-config-helper.service.d.ts.map +1 -0
  153. package/dist/types/nestjs-config-aws/src/integration/services/error-handler.service.d.ts.map +1 -0
  154. package/dist/types/nestjs-config-aws/src/integration/services/factory-registration.service.d.ts.map +1 -0
  155. package/dist/types/nestjs-config-aws/src/integration/services/index.d.ts.map +1 -0
  156. package/dist/types/nestjs-config-aws/src/integration/services/integration-state.service.d.ts.map +1 -0
  157. package/dist/types/nestjs-config-aws/src/integration/services/namespace-handler.service.d.ts.map +1 -0
  158. package/dist/types/nestjs-config-aws/src/integration/services/nestjs-config-integration.service.d.ts.map +1 -0
  159. package/dist/types/nestjs-config-aws/src/integration/services/precedence-handler.service.d.ts.map +1 -0
  160. package/dist/types/nestjs-config-aws/src/integration/services/validation-integration.service.d.ts.map +1 -0
  161. package/dist/types/nestjs-config-aws/src/integration/utils/config-integration.util.d.ts.map +1 -0
  162. package/dist/types/nestjs-config-aws/src/integration/utils/index.d.ts.map +1 -0
  163. package/dist/types/nestjs-config-aws/src/interfaces/config-service.interface.d.ts.map +1 -0
  164. package/dist/types/{interfaces → nestjs-config-aws/src/interfaces}/default-schema.interface.d.ts +28 -28
  165. package/dist/types/nestjs-config-aws/src/interfaces/default-schema.interface.d.ts.map +1 -0
  166. package/dist/types/nestjs-config-aws/src/interfaces/index.d.ts +5 -0
  167. package/dist/types/nestjs-config-aws/src/interfaces/index.d.ts.map +1 -0
  168. package/dist/types/nestjs-config-aws/src/interfaces/module-options.interface.d.ts.map +1 -0
  169. package/dist/types/nestjs-config-aws/src/services/config.service.d.ts +88 -0
  170. package/dist/types/nestjs-config-aws/src/services/config.service.d.ts.map +1 -0
  171. package/package.json +20 -27
  172. package/LICENSE +0 -21
  173. package/dist/cjs/config.module.js +0 -178
  174. package/dist/cjs/config.module.js.map +0 -1
  175. package/dist/cjs/index.js +0 -47
  176. package/dist/cjs/index.js.map +0 -1
  177. package/dist/cjs/integration/index.js.map +0 -1
  178. package/dist/cjs/integration/interfaces/configuration-factory.interface.js +0 -3
  179. package/dist/cjs/integration/interfaces/configuration-factory.interface.js.map +0 -1
  180. package/dist/cjs/integration/interfaces/configuration-source.interface.js +0 -3
  181. package/dist/cjs/integration/interfaces/configuration-source.interface.js.map +0 -1
  182. package/dist/cjs/integration/interfaces/index.js.map +0 -1
  183. package/dist/cjs/integration/interfaces/integration-options.interface.js +0 -3
  184. package/dist/cjs/integration/interfaces/integration-options.interface.js.map +0 -1
  185. package/dist/cjs/integration/interfaces/integration-state.interface.js +0 -3
  186. package/dist/cjs/integration/interfaces/integration-state.interface.js.map +0 -1
  187. package/dist/cjs/integration/interfaces/nestjs-config-compatibility.interface.js +0 -73
  188. package/dist/cjs/integration/interfaces/nestjs-config-compatibility.interface.js.map +0 -1
  189. package/dist/cjs/integration/interfaces/nestjs-config-integration.interface.js +0 -3
  190. package/dist/cjs/integration/interfaces/nestjs-config-integration.interface.js.map +0 -1
  191. package/dist/cjs/integration/interfaces/typed-configuration.interface.js +0 -4
  192. package/dist/cjs/integration/interfaces/typed-configuration.interface.js.map +0 -1
  193. package/dist/cjs/integration/interfaces/utility-types.interface.js +0 -52
  194. package/dist/cjs/integration/interfaces/utility-types.interface.js.map +0 -1
  195. package/dist/cjs/integration/nestjs-config-integration.module.js +0 -124
  196. package/dist/cjs/integration/nestjs-config-integration.module.js.map +0 -1
  197. package/dist/cjs/integration/providers/aws-configuration-loader.service.js +0 -591
  198. package/dist/cjs/integration/providers/aws-configuration-loader.service.js.map +0 -1
  199. package/dist/cjs/integration/providers/configuration-factory.provider.js +0 -383
  200. package/dist/cjs/integration/providers/configuration-factory.provider.js.map +0 -1
  201. package/dist/cjs/integration/providers/index.js.map +0 -1
  202. package/dist/cjs/integration/services/async-config-helper.service.js +0 -356
  203. package/dist/cjs/integration/services/async-config-helper.service.js.map +0 -1
  204. package/dist/cjs/integration/services/error-handler.service.js +0 -265
  205. package/dist/cjs/integration/services/error-handler.service.js.map +0 -1
  206. package/dist/cjs/integration/services/factory-registration.service.js +0 -512
  207. package/dist/cjs/integration/services/factory-registration.service.js.map +0 -1
  208. package/dist/cjs/integration/services/index.js.map +0 -1
  209. package/dist/cjs/integration/services/integration-state.service.js +0 -83
  210. package/dist/cjs/integration/services/integration-state.service.js.map +0 -1
  211. package/dist/cjs/integration/services/namespace-handler.service.js +0 -467
  212. package/dist/cjs/integration/services/namespace-handler.service.js.map +0 -1
  213. package/dist/cjs/integration/services/nestjs-config-integration.service.js +0 -316
  214. package/dist/cjs/integration/services/nestjs-config-integration.service.js.map +0 -1
  215. package/dist/cjs/integration/services/precedence-handler.service.js +0 -294
  216. package/dist/cjs/integration/services/precedence-handler.service.js.map +0 -1
  217. package/dist/cjs/integration/services/validation-integration.service.js +0 -591
  218. package/dist/cjs/integration/services/validation-integration.service.js.map +0 -1
  219. package/dist/cjs/integration/utils/config-integration.util.js +0 -283
  220. package/dist/cjs/integration/utils/config-integration.util.js.map +0 -1
  221. package/dist/cjs/integration/utils/index.js.map +0 -1
  222. package/dist/cjs/interfaces/config-loader.interface.js +0 -3
  223. package/dist/cjs/interfaces/config-loader.interface.js.map +0 -1
  224. package/dist/cjs/interfaces/config-service.interface.js +0 -11
  225. package/dist/cjs/interfaces/config-service.interface.js.map +0 -1
  226. package/dist/cjs/interfaces/default-schema.interface.js +0 -63
  227. package/dist/cjs/interfaces/default-schema.interface.js.map +0 -1
  228. package/dist/cjs/interfaces/errors.interface.js +0 -77
  229. package/dist/cjs/interfaces/errors.interface.js.map +0 -1
  230. package/dist/cjs/interfaces/index.js +0 -25
  231. package/dist/cjs/interfaces/index.js.map +0 -1
  232. package/dist/cjs/interfaces/module-options.interface.js +0 -3
  233. package/dist/cjs/interfaces/module-options.interface.js.map +0 -1
  234. package/dist/cjs/loaders/environment.loader.js +0 -59
  235. package/dist/cjs/loaders/environment.loader.js.map +0 -1
  236. package/dist/cjs/loaders/secrets-manager.loader.js +0 -122
  237. package/dist/cjs/loaders/secrets-manager.loader.js.map +0 -1
  238. package/dist/cjs/loaders/ssm-parameter-store.loader.js +0 -146
  239. package/dist/cjs/loaders/ssm-parameter-store.loader.js.map +0 -1
  240. package/dist/cjs/services/config.service.js +0 -297
  241. package/dist/cjs/services/config.service.js.map +0 -1
  242. package/dist/cjs/utils/validation.util.js +0 -114
  243. package/dist/cjs/utils/validation.util.js.map +0 -1
  244. package/dist/esm/config.module.js +0 -175
  245. package/dist/esm/config.module.js.map +0 -1
  246. package/dist/esm/index.js +0 -18
  247. package/dist/esm/index.js.map +0 -1
  248. package/dist/esm/integration/index.js +0 -7
  249. package/dist/esm/integration/index.js.map +0 -1
  250. package/dist/esm/integration/interfaces/configuration-factory.interface.js +0 -2
  251. package/dist/esm/integration/interfaces/configuration-factory.interface.js.map +0 -1
  252. package/dist/esm/integration/interfaces/configuration-source.interface.js +0 -2
  253. package/dist/esm/integration/interfaces/configuration-source.interface.js.map +0 -1
  254. package/dist/esm/integration/interfaces/index.js +0 -10
  255. package/dist/esm/integration/interfaces/index.js.map +0 -1
  256. package/dist/esm/integration/interfaces/integration-options.interface.js +0 -2
  257. package/dist/esm/integration/interfaces/integration-options.interface.js.map +0 -1
  258. package/dist/esm/integration/interfaces/integration-state.interface.js +0 -2
  259. package/dist/esm/integration/interfaces/integration-state.interface.js.map +0 -1
  260. package/dist/esm/integration/interfaces/nestjs-config-compatibility.interface.js +0 -64
  261. package/dist/esm/integration/interfaces/nestjs-config-compatibility.interface.js.map +0 -1
  262. package/dist/esm/integration/interfaces/nestjs-config-integration.interface.js +0 -2
  263. package/dist/esm/integration/interfaces/nestjs-config-integration.interface.js.map +0 -1
  264. package/dist/esm/integration/interfaces/typed-configuration.interface.js +0 -3
  265. package/dist/esm/integration/interfaces/typed-configuration.interface.js.map +0 -1
  266. package/dist/esm/integration/interfaces/utility-types.interface.js +0 -44
  267. package/dist/esm/integration/interfaces/utility-types.interface.js.map +0 -1
  268. package/dist/esm/integration/nestjs-config-integration.module.js +0 -121
  269. package/dist/esm/integration/nestjs-config-integration.module.js.map +0 -1
  270. package/dist/esm/integration/providers/aws-configuration-loader.service.js +0 -588
  271. package/dist/esm/integration/providers/aws-configuration-loader.service.js.map +0 -1
  272. package/dist/esm/integration/providers/configuration-factory.provider.js +0 -380
  273. package/dist/esm/integration/providers/configuration-factory.provider.js.map +0 -1
  274. package/dist/esm/integration/providers/index.js +0 -4
  275. package/dist/esm/integration/providers/index.js.map +0 -1
  276. package/dist/esm/integration/services/async-config-helper.service.js +0 -353
  277. package/dist/esm/integration/services/async-config-helper.service.js.map +0 -1
  278. package/dist/esm/integration/services/error-handler.service.js +0 -262
  279. package/dist/esm/integration/services/error-handler.service.js.map +0 -1
  280. package/dist/esm/integration/services/factory-registration.service.js +0 -509
  281. package/dist/esm/integration/services/factory-registration.service.js.map +0 -1
  282. package/dist/esm/integration/services/index.js +0 -10
  283. package/dist/esm/integration/services/index.js.map +0 -1
  284. package/dist/esm/integration/services/integration-state.service.js +0 -80
  285. package/dist/esm/integration/services/integration-state.service.js.map +0 -1
  286. package/dist/esm/integration/services/namespace-handler.service.js +0 -464
  287. package/dist/esm/integration/services/namespace-handler.service.js.map +0 -1
  288. package/dist/esm/integration/services/nestjs-config-integration.service.js +0 -313
  289. package/dist/esm/integration/services/nestjs-config-integration.service.js.map +0 -1
  290. package/dist/esm/integration/services/precedence-handler.service.js +0 -291
  291. package/dist/esm/integration/services/precedence-handler.service.js.map +0 -1
  292. package/dist/esm/integration/services/validation-integration.service.js +0 -585
  293. package/dist/esm/integration/services/validation-integration.service.js.map +0 -1
  294. package/dist/esm/integration/utils/config-integration.util.js +0 -240
  295. package/dist/esm/integration/utils/config-integration.util.js.map +0 -1
  296. package/dist/esm/integration/utils/index.js +0 -3
  297. package/dist/esm/integration/utils/index.js.map +0 -1
  298. package/dist/esm/interfaces/config-loader.interface.js +0 -2
  299. package/dist/esm/interfaces/config-loader.interface.js.map +0 -1
  300. package/dist/esm/interfaces/config-service.interface.js +0 -7
  301. package/dist/esm/interfaces/config-service.interface.js.map +0 -1
  302. package/dist/esm/interfaces/default-schema.interface.js +0 -59
  303. package/dist/esm/interfaces/default-schema.interface.js.map +0 -1
  304. package/dist/esm/interfaces/errors.interface.js +0 -69
  305. package/dist/esm/interfaces/errors.interface.js.map +0 -1
  306. package/dist/esm/interfaces/index.js +0 -9
  307. package/dist/esm/interfaces/index.js.map +0 -1
  308. package/dist/esm/interfaces/module-options.interface.js +0 -2
  309. package/dist/esm/interfaces/module-options.interface.js.map +0 -1
  310. package/dist/esm/loaders/environment.loader.js +0 -55
  311. package/dist/esm/loaders/environment.loader.js.map +0 -1
  312. package/dist/esm/loaders/secrets-manager.loader.js +0 -118
  313. package/dist/esm/loaders/secrets-manager.loader.js.map +0 -1
  314. package/dist/esm/loaders/ssm-parameter-store.loader.js +0 -142
  315. package/dist/esm/loaders/ssm-parameter-store.loader.js.map +0 -1
  316. package/dist/esm/services/config.service.js +0 -261
  317. package/dist/esm/services/config.service.js.map +0 -1
  318. package/dist/esm/utils/validation.util.js +0 -110
  319. package/dist/esm/utils/validation.util.js.map +0 -1
  320. package/dist/types/config.module.d.ts.map +0 -1
  321. package/dist/types/index.d.ts.map +0 -1
  322. package/dist/types/integration/index.d.ts.map +0 -1
  323. package/dist/types/integration/interfaces/configuration-factory.interface.d.ts.map +0 -1
  324. package/dist/types/integration/interfaces/configuration-source.interface.d.ts.map +0 -1
  325. package/dist/types/integration/interfaces/index.d.ts.map +0 -1
  326. package/dist/types/integration/interfaces/integration-options.interface.d.ts.map +0 -1
  327. package/dist/types/integration/interfaces/integration-state.interface.d.ts.map +0 -1
  328. package/dist/types/integration/interfaces/nestjs-config-compatibility.interface.d.ts.map +0 -1
  329. package/dist/types/integration/interfaces/nestjs-config-integration.interface.d.ts.map +0 -1
  330. package/dist/types/integration/interfaces/typed-configuration.interface.d.ts.map +0 -1
  331. package/dist/types/integration/interfaces/utility-types.interface.d.ts.map +0 -1
  332. package/dist/types/integration/nestjs-config-integration.module.d.ts.map +0 -1
  333. package/dist/types/integration/providers/aws-configuration-loader.service.d.ts.map +0 -1
  334. package/dist/types/integration/providers/configuration-factory.provider.d.ts.map +0 -1
  335. package/dist/types/integration/providers/index.d.ts.map +0 -1
  336. package/dist/types/integration/services/async-config-helper.service.d.ts.map +0 -1
  337. package/dist/types/integration/services/error-handler.service.d.ts.map +0 -1
  338. package/dist/types/integration/services/factory-registration.service.d.ts.map +0 -1
  339. package/dist/types/integration/services/index.d.ts.map +0 -1
  340. package/dist/types/integration/services/integration-state.service.d.ts.map +0 -1
  341. package/dist/types/integration/services/namespace-handler.service.d.ts.map +0 -1
  342. package/dist/types/integration/services/nestjs-config-integration.service.d.ts.map +0 -1
  343. package/dist/types/integration/services/precedence-handler.service.d.ts.map +0 -1
  344. package/dist/types/integration/services/validation-integration.service.d.ts.map +0 -1
  345. package/dist/types/integration/utils/config-integration.util.d.ts.map +0 -1
  346. package/dist/types/integration/utils/index.d.ts.map +0 -1
  347. package/dist/types/interfaces/config-loader.interface.d.ts +0 -22
  348. package/dist/types/interfaces/config-loader.interface.d.ts.map +0 -1
  349. package/dist/types/interfaces/config-service.interface.d.ts.map +0 -1
  350. package/dist/types/interfaces/default-schema.interface.d.ts.map +0 -1
  351. package/dist/types/interfaces/errors.interface.d.ts +0 -38
  352. package/dist/types/interfaces/errors.interface.d.ts.map +0 -1
  353. package/dist/types/interfaces/index.d.ts +0 -6
  354. package/dist/types/interfaces/index.d.ts.map +0 -1
  355. package/dist/types/interfaces/module-options.interface.d.ts.map +0 -1
  356. package/dist/types/loaders/environment.loader.d.ts +0 -26
  357. package/dist/types/loaders/environment.loader.d.ts.map +0 -1
  358. package/dist/types/loaders/secrets-manager.loader.d.ts +0 -52
  359. package/dist/types/loaders/secrets-manager.loader.d.ts.map +0 -1
  360. package/dist/types/loaders/ssm-parameter-store.loader.d.ts +0 -68
  361. package/dist/types/loaders/ssm-parameter-store.loader.d.ts.map +0 -1
  362. package/dist/types/services/config.service.d.ts +0 -94
  363. package/dist/types/services/config.service.d.ts.map +0 -1
  364. package/dist/types/utils/validation.util.d.ts.map +0 -1
  365. /package/dist/types/{integration → nestjs-config-aws/src/integration}/index.d.ts +0 -0
  366. /package/dist/types/{integration → nestjs-config-aws/src/integration}/interfaces/configuration-factory.interface.d.ts +0 -0
  367. /package/dist/types/{integration → nestjs-config-aws/src/integration}/interfaces/configuration-source.interface.d.ts +0 -0
  368. /package/dist/types/{integration → nestjs-config-aws/src/integration}/interfaces/index.d.ts +0 -0
  369. /package/dist/types/{integration → nestjs-config-aws/src/integration}/interfaces/integration-options.interface.d.ts +0 -0
  370. /package/dist/types/{integration → nestjs-config-aws/src/integration}/interfaces/integration-state.interface.d.ts +0 -0
  371. /package/dist/types/{integration → nestjs-config-aws/src/integration}/interfaces/nestjs-config-compatibility.interface.d.ts +0 -0
  372. /package/dist/types/{integration → nestjs-config-aws/src/integration}/interfaces/nestjs-config-integration.interface.d.ts +0 -0
  373. /package/dist/types/{integration → nestjs-config-aws/src/integration}/interfaces/typed-configuration.interface.d.ts +0 -0
  374. /package/dist/types/{integration → nestjs-config-aws/src/integration}/interfaces/utility-types.interface.d.ts +0 -0
  375. /package/dist/types/{integration → nestjs-config-aws/src/integration}/nestjs-config-integration.module.d.ts +0 -0
  376. /package/dist/types/{integration → nestjs-config-aws/src/integration}/providers/aws-configuration-loader.service.d.ts +0 -0
  377. /package/dist/types/{integration → nestjs-config-aws/src/integration}/providers/configuration-factory.provider.d.ts +0 -0
  378. /package/dist/types/{integration → nestjs-config-aws/src/integration}/providers/index.d.ts +0 -0
  379. /package/dist/types/{integration → nestjs-config-aws/src/integration}/services/async-config-helper.service.d.ts +0 -0
  380. /package/dist/types/{integration → nestjs-config-aws/src/integration}/services/error-handler.service.d.ts +0 -0
  381. /package/dist/types/{integration → nestjs-config-aws/src/integration}/services/factory-registration.service.d.ts +0 -0
  382. /package/dist/types/{integration → nestjs-config-aws/src/integration}/services/index.d.ts +0 -0
  383. /package/dist/types/{integration → nestjs-config-aws/src/integration}/services/integration-state.service.d.ts +0 -0
  384. /package/dist/types/{integration → nestjs-config-aws/src/integration}/services/namespace-handler.service.d.ts +0 -0
  385. /package/dist/types/{integration → nestjs-config-aws/src/integration}/services/nestjs-config-integration.service.d.ts +0 -0
  386. /package/dist/types/{integration → nestjs-config-aws/src/integration}/services/precedence-handler.service.d.ts +0 -0
  387. /package/dist/types/{integration → nestjs-config-aws/src/integration}/services/validation-integration.service.d.ts +0 -0
  388. /package/dist/types/{integration → nestjs-config-aws/src/integration}/utils/config-integration.util.d.ts +0 -0
  389. /package/dist/types/{integration → nestjs-config-aws/src/integration}/utils/index.d.ts +0 -0
  390. /package/dist/types/{interfaces → nestjs-config-aws/src/interfaces}/config-service.interface.d.ts +0 -0
  391. /package/dist/types/{interfaces → nestjs-config-aws/src/interfaces}/module-options.interface.d.ts +0 -0
@@ -0,0 +1,592 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var AwsConfigurationLoaderService_1;
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.AwsConfigurationLoaderService = void 0;
17
+ const common_1 = require("@nestjs/common");
18
+ const config_aws_1 = require("@dyanet/config-aws");
19
+ const error_handler_service_1 = require("../services/error-handler.service");
20
+ /**
21
+ * Service for loading configuration from AWS sources for integration with @nestjs/config.
22
+ * Uses existing AWS loaders to fetch configuration and provides namespace-aware loading capabilities.
23
+ */
24
+ let AwsConfigurationLoaderService = AwsConfigurationLoaderService_1 = class AwsConfigurationLoaderService {
25
+ logger = new common_1.Logger(AwsConfigurationLoaderService_1.name);
26
+ loaders;
27
+ options;
28
+ errorHandler;
29
+ constructor(options) {
30
+ this.options = options || {};
31
+ this.errorHandler = new error_handler_service_1.ErrorHandlerService(this.options);
32
+ this.loaders = this.createLoaders();
33
+ }
34
+ /**
35
+ * Load configuration from AWS sources.
36
+ * @returns Promise resolving to configuration data
37
+ */
38
+ async loadConfiguration() {
39
+ const mergedConfig = {};
40
+ const sources = [];
41
+ for (const loader of this.loaders) {
42
+ try {
43
+ // Check if loader is available in current environment with timeout
44
+ const isAvailable = await this.checkAvailabilityWithTimeout(loader);
45
+ if (!isAvailable) {
46
+ if (this.options.enableLogging) {
47
+ this.logger.debug(`Skipping ${loader.getName()} - not available in current environment`);
48
+ }
49
+ continue;
50
+ }
51
+ if (this.options.enableLogging) {
52
+ this.logger.debug(`Loading configuration from ${loader.getName()}`);
53
+ }
54
+ // Load configuration from this source with retry logic for AWS services
55
+ const loaderConfig = loader instanceof config_aws_1.EnvironmentLoader
56
+ ? await loader.load()
57
+ : await this.loadWithRetry(loader);
58
+ // Create configuration source metadata
59
+ const source = {
60
+ name: loader.getName(),
61
+ type: this.getSourceType(loader),
62
+ priority: this.getSourcePriority(loader),
63
+ data: loaderConfig,
64
+ loadedAt: new Date(),
65
+ };
66
+ sources.push(source);
67
+ // Merge with existing configuration based on precedence
68
+ Object.assign(mergedConfig, loaderConfig);
69
+ if (this.options.enableLogging) {
70
+ const keyCount = Object.keys(loaderConfig).length;
71
+ this.logger.debug(`Loaded ${keyCount} configuration values from ${loader.getName()}`);
72
+ }
73
+ }
74
+ catch (error) {
75
+ const loaderError = error instanceof Error ? error : new Error(String(error));
76
+ // Log detailed error information for troubleshooting
77
+ this.errorHandler.logDetailedError(`loadConfiguration - ${loader.getName()}`, loaderError, {
78
+ loaderName: loader.getName(),
79
+ loaderType: this.getSourceType(loader),
80
+ });
81
+ // Handle specific error types
82
+ if (this.isAwsServiceError(loaderError)) {
83
+ const shouldContinue = this.handleAwsSpecificError(loader, loaderError);
84
+ if (!shouldContinue) {
85
+ throw loaderError;
86
+ }
87
+ }
88
+ else {
89
+ // Handle general configuration errors
90
+ const shouldContinue = this.errorHandler.handleConfigurationError(loader.getName(), loaderError);
91
+ if (!shouldContinue) {
92
+ throw loaderError;
93
+ }
94
+ }
95
+ // Add error to source metadata
96
+ const errorSource = {
97
+ name: loader.getName(),
98
+ type: this.getSourceType(loader),
99
+ priority: this.getSourcePriority(loader),
100
+ data: {},
101
+ loadedAt: new Date(),
102
+ errors: [loaderError.message],
103
+ };
104
+ sources.push(errorSource);
105
+ }
106
+ }
107
+ return mergedConfig;
108
+ }
109
+ /**
110
+ * Load configuration for specific namespaces from AWS sources.
111
+ * @param namespaces - Array of namespace names to load
112
+ * @returns Promise resolving to namespaced configuration data
113
+ */
114
+ async loadNamespacedConfiguration(namespaces) {
115
+ const result = {};
116
+ // Initialize all namespaces
117
+ for (const namespace of namespaces) {
118
+ result[namespace] = {};
119
+ }
120
+ for (const loader of this.loaders) {
121
+ try {
122
+ // Check if loader is available in current environment with timeout
123
+ const isAvailable = await this.checkAvailabilityWithTimeout(loader);
124
+ if (!isAvailable) {
125
+ if (this.options.enableLogging) {
126
+ this.logger.debug(`Skipping ${loader.getName()} for namespace loading - not available`);
127
+ }
128
+ continue;
129
+ }
130
+ if (this.options.enableLogging) {
131
+ this.logger.debug(`Loading namespaced configuration from ${loader.getName()}`);
132
+ }
133
+ // Load configuration from this source with retry logic for AWS services
134
+ const loaderConfig = loader instanceof config_aws_1.EnvironmentLoader
135
+ ? await loader.load()
136
+ : await this.loadWithRetry(loader);
137
+ // Distribute configuration to namespaces based on key prefixes or patterns
138
+ for (const namespace of namespaces) {
139
+ const namespacedConfig = this.extractNamespaceConfig(loaderConfig, namespace);
140
+ if (Object.keys(namespacedConfig).length > 0) {
141
+ Object.assign(result[namespace], namespacedConfig);
142
+ if (this.options.enableLogging) {
143
+ const keyCount = Object.keys(namespacedConfig).length;
144
+ this.logger.debug(`Loaded ${keyCount} values for namespace '${namespace}' from ${loader.getName()}`);
145
+ }
146
+ }
147
+ }
148
+ }
149
+ catch (error) {
150
+ const loaderError = error instanceof Error ? error : new Error(String(error));
151
+ // Log detailed error information for troubleshooting
152
+ this.errorHandler.logDetailedError(`loadNamespacedConfiguration - ${loader.getName()}`, loaderError, {
153
+ loaderName: loader.getName(),
154
+ loaderType: this.getSourceType(loader),
155
+ namespaces,
156
+ });
157
+ // Handle specific error types
158
+ if (this.isAwsServiceError(loaderError)) {
159
+ const shouldContinue = this.handleAwsSpecificError(loader, loaderError);
160
+ if (!shouldContinue) {
161
+ throw loaderError;
162
+ }
163
+ }
164
+ else {
165
+ // Handle general configuration errors
166
+ const shouldContinue = this.errorHandler.handleConfigurationError(loader.getName(), loaderError);
167
+ if (!shouldContinue) {
168
+ throw loaderError;
169
+ }
170
+ }
171
+ // Create fallback configuration for each namespace
172
+ if (this.options.fallbackToLocal) {
173
+ for (const namespace of namespaces) {
174
+ const fallbackConfig = this.errorHandler.createFallbackConfiguration(namespace);
175
+ Object.assign(result[namespace], fallbackConfig);
176
+ }
177
+ }
178
+ }
179
+ }
180
+ return result;
181
+ }
182
+ /**
183
+ * Check if AWS services are available.
184
+ * @returns Promise resolving to availability status
185
+ */
186
+ async isAvailable() {
187
+ try {
188
+ // Check if at least one AWS loader is available
189
+ const availabilityChecks = this.loaders
190
+ .filter(loader => !(loader instanceof config_aws_1.EnvironmentLoader)) // Skip environment loader
191
+ .map(loader => this.checkAvailabilityWithTimeout(loader));
192
+ if (availabilityChecks.length === 0) {
193
+ // No AWS loaders configured
194
+ return false;
195
+ }
196
+ // Wait for all availability checks to complete
197
+ const results = await Promise.allSettled(availabilityChecks);
198
+ // Return true if at least one AWS service is available
199
+ return results.some(result => result.status === 'fulfilled' && result.value === true);
200
+ }
201
+ catch (error) {
202
+ const availabilityError = error instanceof Error ? error : new Error(String(error));
203
+ this.errorHandler.logDetailedError('isAvailable', availabilityError);
204
+ // Handle as AWS unavailable
205
+ this.errorHandler.handleAwsUnavailable('AWS Services', availabilityError);
206
+ return false;
207
+ }
208
+ }
209
+ /**
210
+ * Get all available configuration sources with their metadata.
211
+ * @returns Promise resolving to array of configuration sources
212
+ */
213
+ async getAvailableSources() {
214
+ const sources = [];
215
+ for (const loader of this.loaders) {
216
+ try {
217
+ const isAvailable = await loader.isAvailable();
218
+ if (isAvailable) {
219
+ const loaderConfig = await loader.load();
220
+ const source = {
221
+ name: loader.getName(),
222
+ type: this.getSourceType(loader),
223
+ priority: this.getSourcePriority(loader),
224
+ data: loaderConfig,
225
+ loadedAt: new Date(),
226
+ };
227
+ sources.push(source);
228
+ }
229
+ }
230
+ catch (error) {
231
+ // Add source with error information
232
+ const source = {
233
+ name: loader.getName(),
234
+ type: this.getSourceType(loader),
235
+ priority: this.getSourcePriority(loader),
236
+ data: {},
237
+ loadedAt: new Date(),
238
+ errors: [error instanceof Error ? error.message : String(error)],
239
+ };
240
+ sources.push(source);
241
+ }
242
+ }
243
+ return sources;
244
+ }
245
+ /**
246
+ * Create configuration loaders based on integration options.
247
+ * @returns Array of configuration loaders
248
+ */
249
+ createLoaders() {
250
+ const loaders = [];
251
+ // Always include environment loader
252
+ loaders.push(new config_aws_1.EnvironmentLoader({ prefix: this.options.envPrefix }));
253
+ // Add AWS Secrets Manager loader if configured
254
+ if (this.options.secretsManagerConfig?.enabled !== false) {
255
+ const secretsConfig = {
256
+ region: this.options.secretsManagerConfig?.region,
257
+ // Convert paths to secretName format expected by SecretsManagerLoader
258
+ secretName: this.getSecretsManagerPath(),
259
+ };
260
+ loaders.push(new config_aws_1.SecretsManagerLoader(secretsConfig));
261
+ }
262
+ // Add SSM Parameter Store loader if configured
263
+ if (this.options.ssmConfig?.enabled !== false) {
264
+ const ssmConfig = {
265
+ region: this.options.ssmConfig?.region,
266
+ // Convert paths to parameterPath format expected by SSMParameterStoreLoader
267
+ parameterPath: this.getSSMParameterPath(),
268
+ withDecryption: this.options.ssmConfig?.decrypt ?? true,
269
+ };
270
+ loaders.push(new config_aws_1.SSMParameterStoreLoader(ssmConfig));
271
+ }
272
+ return loaders;
273
+ }
274
+ /**
275
+ * Get the source type for a given loader.
276
+ * @param loader - The configuration loader
277
+ * @returns The configuration source type
278
+ */
279
+ getSourceType(loader) {
280
+ if (loader instanceof config_aws_1.EnvironmentLoader) {
281
+ return 'environment';
282
+ }
283
+ else if (loader instanceof config_aws_1.SecretsManagerLoader) {
284
+ return 'secrets-manager';
285
+ }
286
+ else if (loader instanceof config_aws_1.SSMParameterStoreLoader) {
287
+ return 'ssm';
288
+ }
289
+ else {
290
+ return 'local-file';
291
+ }
292
+ }
293
+ /**
294
+ * Get the priority for a given loader based on precedence rules.
295
+ * @param loader - The configuration loader
296
+ * @returns The priority number (higher = higher priority)
297
+ */
298
+ getSourcePriority(loader) {
299
+ const precedence = this.options.precedence || 'aws-first';
300
+ if (precedence === 'local-first') {
301
+ // Environment variables have highest priority
302
+ if (loader instanceof config_aws_1.EnvironmentLoader)
303
+ return 100;
304
+ if (loader instanceof config_aws_1.SecretsManagerLoader)
305
+ return 50;
306
+ if (loader instanceof config_aws_1.SSMParameterStoreLoader)
307
+ return 40;
308
+ }
309
+ else if (precedence === 'aws-first') {
310
+ // AWS sources have higher priority
311
+ if (loader instanceof config_aws_1.SecretsManagerLoader)
312
+ return 100;
313
+ if (loader instanceof config_aws_1.SSMParameterStoreLoader)
314
+ return 90;
315
+ if (loader instanceof config_aws_1.EnvironmentLoader)
316
+ return 50;
317
+ }
318
+ else {
319
+ // merge - equal priority, order matters
320
+ return 50;
321
+ }
322
+ return 50;
323
+ }
324
+ /**
325
+ * Extract configuration for a specific namespace from loaded configuration.
326
+ * @param config - The loaded configuration
327
+ * @param namespace - The namespace to extract
328
+ * @returns Configuration values for the namespace
329
+ */
330
+ extractNamespaceConfig(config, namespace) {
331
+ const namespaceConfig = {};
332
+ const namespacePrefix = namespace.toUpperCase();
333
+ // Strategy 1: Look for direct namespace key (e.g., config.database)
334
+ if (config[namespace]) {
335
+ Object.assign(namespaceConfig, config[namespace]);
336
+ }
337
+ // Strategy 2: Look for keys that start with the namespace prefix (e.g., DATABASE_HOST)
338
+ for (const [key, value] of Object.entries(config)) {
339
+ const upperKey = key.toUpperCase();
340
+ // Check if key starts with namespace prefix followed by underscore
341
+ if (upperKey.startsWith(`${namespacePrefix}_`)) {
342
+ // Remove namespace prefix and underscore, convert to camelCase
343
+ const namespacedKey = key.substring(namespace.length + 1);
344
+ const camelCaseKey = this.toCamelCase(namespacedKey);
345
+ if (camelCaseKey) {
346
+ namespaceConfig[camelCaseKey] = value;
347
+ }
348
+ }
349
+ }
350
+ // Strategy 3: Look for nested namespace paths (e.g., /app/database/host)
351
+ const nestedConfig = this.extractNestedNamespaceConfig(config, namespace);
352
+ Object.assign(namespaceConfig, nestedConfig);
353
+ return namespaceConfig;
354
+ }
355
+ /**
356
+ * Extract nested namespace configuration from hierarchical keys.
357
+ * @param config - The loaded configuration
358
+ * @param namespace - The namespace to extract
359
+ * @returns Configuration values for the namespace
360
+ */
361
+ extractNestedNamespaceConfig(config, namespace) {
362
+ const namespaceConfig = {};
363
+ const namespacePath = `/${namespace}/`;
364
+ for (const [key, value] of Object.entries(config)) {
365
+ // Check if key contains namespace path
366
+ if (key.includes(namespacePath)) {
367
+ // Extract the part after the namespace path
368
+ const pathIndex = key.indexOf(namespacePath);
369
+ const afterNamespace = key.substring(pathIndex + namespacePath.length);
370
+ if (afterNamespace) {
371
+ // Convert path segments to nested object structure
372
+ const nestedKey = this.pathToNestedKey(afterNamespace);
373
+ this.setNestedValue(namespaceConfig, nestedKey, value);
374
+ }
375
+ }
376
+ }
377
+ return namespaceConfig;
378
+ }
379
+ /**
380
+ * Convert snake_case or kebab-case to camelCase.
381
+ * @param str - String to convert
382
+ * @returns camelCase string
383
+ */
384
+ toCamelCase(str) {
385
+ return str
386
+ .toLowerCase()
387
+ .replace(/[_-](.)/g, (_, char) => char.toUpperCase());
388
+ }
389
+ /**
390
+ * Convert path segments to nested key structure.
391
+ * @param path - Path string (e.g., "host/port")
392
+ * @returns Nested key structure
393
+ */
394
+ pathToNestedKey(path) {
395
+ return path
396
+ .split('/')
397
+ .map(segment => this.toCamelCase(segment))
398
+ .join('.');
399
+ }
400
+ /**
401
+ * Set a nested value in an object using dot notation.
402
+ * @param obj - Target object
403
+ * @param path - Dot notation path
404
+ * @param value - Value to set
405
+ */
406
+ setNestedValue(obj, path, value) {
407
+ const keys = path.split('.');
408
+ let current = obj;
409
+ for (let i = 0; i < keys.length - 1; i++) {
410
+ const key = keys[i];
411
+ if (key && (!(key in current) || typeof current[key] !== 'object')) {
412
+ current[key] = {};
413
+ }
414
+ if (key) {
415
+ current = current[key];
416
+ }
417
+ }
418
+ const lastKey = keys[keys.length - 1];
419
+ if (lastKey) {
420
+ current[lastKey] = value;
421
+ }
422
+ }
423
+ /**
424
+ * Get the Secrets Manager path based on configuration.
425
+ * @returns The secrets manager path
426
+ */
427
+ getSecretsManagerPath() {
428
+ const paths = this.options.secretsManagerConfig?.paths;
429
+ if (!paths) {
430
+ return '/nestjs-config-aws';
431
+ }
432
+ // Use the first available path or default
433
+ return paths.production || paths.development || paths.test || '/nestjs-config-aws';
434
+ }
435
+ /**
436
+ * Get the SSM Parameter Store path based on configuration.
437
+ * @returns The SSM parameter path
438
+ */
439
+ getSSMParameterPath() {
440
+ const paths = this.options.ssmConfig?.paths;
441
+ if (!paths) {
442
+ return '/nestjs-config-aws';
443
+ }
444
+ // Use the first available path or default
445
+ return paths.production || paths.development || paths.test || '/nestjs-config-aws';
446
+ }
447
+ /**
448
+ * Check if an error is an AWS service error.
449
+ * @param error - The error to check
450
+ * @returns Whether the error is from an AWS service
451
+ */
452
+ isAwsServiceError(error) {
453
+ // AWS SDK errors typically have specific names
454
+ const awsErrorNames = [
455
+ 'AccessDeniedException',
456
+ 'ResourceNotFoundException',
457
+ 'InvalidRequestException',
458
+ 'ThrottlingException',
459
+ 'ServiceUnavailableException',
460
+ 'NetworkingError',
461
+ 'TimeoutError',
462
+ 'CredentialsError',
463
+ 'UnknownEndpoint',
464
+ ];
465
+ return awsErrorNames.includes(error.name) || error.message.includes('AWS');
466
+ }
467
+ /**
468
+ * Handle AWS-specific errors with appropriate strategies.
469
+ * @param loader - The loader that encountered the error
470
+ * @param error - The AWS error
471
+ * @returns Whether to continue processing
472
+ */
473
+ handleAwsSpecificError(loader, error) {
474
+ const serviceName = this.getServiceName(loader);
475
+ switch (error.name) {
476
+ case 'AccessDeniedException':
477
+ return this.errorHandler.handlePermissionError(serviceName, this.getResourceName(loader), error);
478
+ case 'ResourceNotFoundException':
479
+ return this.errorHandler.handleResourceNotFound(serviceName, this.getResourceName(loader), error);
480
+ case 'NetworkingError':
481
+ case 'TimeoutError':
482
+ const networkResult = this.errorHandler.handleNetworkError(serviceName, error);
483
+ return networkResult.shouldContinue;
484
+ case 'ThrottlingException':
485
+ case 'TooManyRequestsException':
486
+ this.logger.warn(`Rate limiting encountered for ${serviceName}, continuing with other sources`);
487
+ return true;
488
+ case 'ServiceUnavailableException':
489
+ return this.errorHandler.handleAwsUnavailable(serviceName, error);
490
+ case 'CredentialsError':
491
+ this.logger.error(`AWS credentials error for ${serviceName}: ${error.message}`);
492
+ this.logger.error('Please check AWS credentials configuration');
493
+ return this.errorHandler.handleAwsUnavailable(serviceName, error);
494
+ default:
495
+ // Handle as general configuration error
496
+ return this.errorHandler.handleConfigurationError(serviceName, error);
497
+ }
498
+ }
499
+ /**
500
+ * Get the service name for a loader.
501
+ * @param loader - The configuration loader
502
+ * @returns The service name
503
+ */
504
+ getServiceName(loader) {
505
+ if (loader instanceof config_aws_1.SecretsManagerLoader) {
506
+ return 'AWS Secrets Manager';
507
+ }
508
+ else if (loader instanceof config_aws_1.SSMParameterStoreLoader) {
509
+ return 'AWS Systems Manager Parameter Store';
510
+ }
511
+ else if (loader instanceof config_aws_1.EnvironmentLoader) {
512
+ return 'Environment Variables';
513
+ }
514
+ else {
515
+ return 'Unknown Service';
516
+ }
517
+ }
518
+ /**
519
+ * Get the resource name for a loader.
520
+ * @param loader - The configuration loader
521
+ * @returns The resource name
522
+ */
523
+ getResourceName(loader) {
524
+ if (loader instanceof config_aws_1.SecretsManagerLoader) {
525
+ return this.getSecretsManagerPath();
526
+ }
527
+ else if (loader instanceof config_aws_1.SSMParameterStoreLoader) {
528
+ return this.getSSMParameterPath();
529
+ }
530
+ else {
531
+ return 'configuration';
532
+ }
533
+ }
534
+ /**
535
+ * Load configuration with retry logic for retryable errors.
536
+ * @param loader - The configuration loader
537
+ * @param maxRetries - Maximum number of retries
538
+ * @returns Promise resolving to configuration data
539
+ */
540
+ async loadWithRetry(loader, maxRetries = 3) {
541
+ let lastError = null;
542
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
543
+ try {
544
+ return await loader.load();
545
+ }
546
+ catch (error) {
547
+ const loaderError = error instanceof Error ? error : new Error(String(error));
548
+ lastError = loaderError;
549
+ // Check if error is retryable
550
+ if (!this.errorHandler.isRetryableError(loaderError) || attempt === maxRetries) {
551
+ throw loaderError;
552
+ }
553
+ // Wait before retrying
554
+ const delay = this.errorHandler.getRetryDelay(attempt);
555
+ this.logger.warn(`Retrying ${loader.getName()} in ${delay}ms (attempt ${attempt}/${maxRetries})`);
556
+ await new Promise(resolve => setTimeout(resolve, delay));
557
+ }
558
+ }
559
+ // This should never be reached, but just in case
560
+ throw lastError || new Error('Unknown error during retry');
561
+ }
562
+ /**
563
+ * Check availability with timeout and error handling.
564
+ * @param loader - The configuration loader
565
+ * @param timeoutMs - Timeout in milliseconds
566
+ * @returns Promise resolving to availability status
567
+ */
568
+ async checkAvailabilityWithTimeout(loader, timeoutMs = 5000) {
569
+ try {
570
+ const timeoutPromise = new Promise((_, reject) => {
571
+ setTimeout(() => reject(new Error('Availability check timeout')), timeoutMs);
572
+ });
573
+ const availabilityPromise = loader.isAvailable();
574
+ return await Promise.race([availabilityPromise, timeoutPromise]);
575
+ }
576
+ catch (error) {
577
+ const loaderError = error instanceof Error ? error : new Error(String(error));
578
+ if (this.options.enableLogging) {
579
+ this.logger.debug(`Availability check failed for ${loader.getName()}: ${loaderError.message}`);
580
+ }
581
+ return false;
582
+ }
583
+ }
584
+ };
585
+ exports.AwsConfigurationLoaderService = AwsConfigurationLoaderService;
586
+ exports.AwsConfigurationLoaderService = AwsConfigurationLoaderService = AwsConfigurationLoaderService_1 = __decorate([
587
+ (0, common_1.Injectable)(),
588
+ __param(0, (0, common_1.Optional)()),
589
+ __param(0, (0, common_1.Inject)('INTEGRATION_OPTIONS')),
590
+ __metadata("design:paramtypes", [Object])
591
+ ], AwsConfigurationLoaderService);
592
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLWNvbmZpZ3VyYXRpb24tbG9hZGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvaW50ZWdyYXRpb24vcHJvdmlkZXJzL2F3cy1jb25maWd1cmF0aW9uLWxvYWRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBc0U7QUFDdEUsbURBSzRCO0FBSTVCLDZFQUF3RTtBQUV4RTs7O0dBR0c7QUFFSSxJQUFNLDZCQUE2QixxQ0FBbkMsTUFBTSw2QkFBNkI7SUFDdkIsTUFBTSxHQUFHLElBQUksZUFBTSxDQUFDLCtCQUE2QixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hELE9BQU8sQ0FBaUI7SUFDeEIsT0FBTyxDQUFxQjtJQUM1QixZQUFZLENBQXNCO0lBRW5ELFlBQzZDLE9BQTRCO1FBRXZFLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksMkNBQW1CLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsaUJBQWlCO1FBQ3JCLE1BQU0sWUFBWSxHQUF3QixFQUFFLENBQUM7UUFDN0MsTUFBTSxPQUFPLEdBQTBCLEVBQUUsQ0FBQztRQUUxQyxLQUFLLE1BQU0sTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUM7Z0JBQ0gsbUVBQW1FO2dCQUNuRSxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFFcEUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUNqQixJQUFJLElBQUksQ0FBQyxPQUFPLENB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LE9BQU8sTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsbUJBQW1CLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQztRQUNuRSxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sV0FBVyxHQUFHLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFFOUUsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUMvQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxLQUFLLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ2pHLENBQUM7WUFFRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0NBQ0YsQ0FBQTtBQS9uQlksc0VBQTZCO3dDQUE3Qiw2QkFBNkI7SUFEekMsSUFBQSxtQkFBVSxHQUFFO0lBUVIsV0FBQSxJQUFBLGlCQUFRLEdBQUUsQ0FBQTtJQUFFLFdBQUEsSUFBQSxlQUFNLEVBQUMscUJBQXFCLENBQUMsQ0FBQTs7R0FQakMsNkJBQTZCLENBK25CekMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBMb2dnZXIsIEluamVjdCwgT3B0aW9uYWwgfSBmcm9tICdAbmVzdGpzL2NvbW1vbic7XHJcbmltcG9ydCB7XHJcbiAgQ29uZmlnTG9hZGVyLFxyXG4gIFNlY3JldHNNYW5hZ2VyTG9hZGVyLFxyXG4gIFNTTVBhcmFtZXRlclN0b3JlTG9hZGVyLFxyXG4gIEVudmlyb25tZW50TG9hZGVyLFxyXG59IGZyb20gJ0BkeWFuZXQvY29uZmlnLWF3cyc7XHJcbmltcG9ydCB7IEludGVncmF0aW9uT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMvaW50ZWdyYXRpb24tb3B0aW9ucy5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uU291cmNlLCBDb25maWd1cmF0aW9uU291cmNlVHlwZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvY29uZmlndXJhdGlvbi1zb3VyY2UuaW50ZXJmYWNlJztcclxuXHJcbmltcG9ydCB7IEVycm9ySGFuZGxlclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9lcnJvci1oYW5kbGVyLnNlcnZpY2UnO1xyXG5cclxuLyoqXHJcbiAqIFNlcnZpY2UgZm9yIGxvYWRpbmcgY29uZmlndXJhdGlvbiBmcm9tIEFXUyBzb3VyY2VzIGZvciBpbnRlZ3JhdGlvbiB3aXRoIEBuZXN0anMvY29uZmlnLlxyXG4gKiBVc2VzIGV4aXN0aW5nIEFXUyBsb2FkZXJzIHRvIGZldGNoIGNvbmZpZ3VyYXRpb24gYW5kIHByb3ZpZGVzIG5hbWVzcGFjZS1hd2FyZSBsb2FkaW5nIGNhcGFiaWxpdGllcy5cclxuICovXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEF3c0NvbmZpZ3VyYXRpb25Mb2FkZXJTZXJ2aWNlIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBMb2dnZXIoQXdzQ29uZmlndXJhdGlvbkxvYWRlclNlcnZpY2UubmFtZSk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkZXJzOiBDb25maWdMb2FkZXJbXTtcclxuICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IEludGVncmF0aW9uT3B0aW9ucztcclxuICBwcml2YXRlIHJlYWRvbmx5IGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVyU2VydmljZTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KCdJTlRFR1JBVElPTl9PUFRJT05TJykgb3B0aW9ucz86IEludGVncmF0aW9uT3B0aW9uc1xyXG4gICkge1xyXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcclxuICAgIHRoaXMuZXJyb3JIYW5kbGVyID0gbmV3IEVycm9ySGFuZGxlclNlcnZpY2UodGhpcy5vcHRpb25zKTtcclxuICAgIHRoaXMubG9hZGVycyA9IHRoaXMuY3JlYXRlTG9hZGVycygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTG9hZCBjb25maWd1cmF0aW9uIGZyb20gQVdTIHNvdXJjZXMuXHJcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gY29uZmlndXJhdGlvbiBkYXRhXHJcbiAgICovXHJcbiAgYXN5bmMgbG9hZENvbmZpZ3VyYXRpb24oKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XHJcbiAgICBjb25zdCBtZXJnZWRDb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcclxuICAgIGNvbnN0IHNvdXJjZXM6IENvbmZpZ3VyYXRpb25Tb3VyY2VbXSA9IFtdO1xyXG5cclxuICAgIGZvciAoY29uc3QgbG9hZGVyIG9mIHRoaXMubG9hZGVycykge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIC8vIENoZWNrIGlmIGxvYWRlciBpcyBhdmFpbGFibGUgaW4gY3VycmVudCBlbnZpcm9ubWVudCB3aXRoIHRpbWVvdXRcclxuICAgICAgICBjb25zdCBpc0F2YWlsYWJsZSA9IGF3YWl0IHRoaXMuY2hlY2tBdmFpbGFiaWxpdHlXaXRoVGltZW91dChsb2FkZXIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICghaXNBdmFpbGFibGUpIHtcclxuICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZW5hYmxlTG9nZ2luZykge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgU2tpcHBpbmcgJHtsb2FkZXIuZ2V0TmFtZSgpfSAtIG5vdCBhdmFpbGFibGUgaW4gY3VycmVudCBlbnZpcm9ubWVudGApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmVuYWJsZUxvZ2dpbmcpIHtcclxuICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBMb2FkaW5nIGNvbmZpZ3VyYXRpb24gZnJvbSAke2xvYWRlci5nZXROYW1lKCl9YCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBMb2FkIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGlzIHNvdXJjZSB3aXRoIHJldHJ5IGxvZ2ljIGZvciBBV1Mgc2VydmljZXNcclxuICAgICAgICBjb25zdCBsb2FkZXJDb25maWcgPSBsb2FkZXIgaW5zdGFuY2VvZiBFbnZpcm9ubWVudExvYWRlciBcclxuICAgICAgICAgID8gYXdhaXQgbG9hZGVyLmxvYWQoKSBcclxuICAgICAgICAgIDogYXdhaXQgdGhpcy5sb2FkV2l0aFJldHJ5KGxvYWRlcik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQ3JlYXRlIGNvbmZpZ3VyYXRpb24gc291cmNlIG1ldGFkYXRhXHJcbiAgICAgICAgY29uc3Qgc291cmNlOiBDb25maWd1cmF0aW9uU291cmNlID0ge1xyXG4gICAgICAgICAgbmFtZTogbG9hZGVyLmdldE5hbWUoKSxcclxuICAgICAgICAgIHR5cGU6IHRoaXMuZ2V0U291cmNlVHlwZShsb2FkZXIpLFxyXG4gICAgICAgICAgcHJpb3JpdHk6IHRoaXMuZ2V0U291cmNlUHJpb3JpdHkobG9hZGVyKSxcclxuICAgICAgICAgIGRhdGE6IGxvYWRlckNvbmZpZyxcclxuICAgICAgICAgIGxvYWRlZEF0OiBuZXcgRGF0ZSgpLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHNvdXJjZXMucHVzaChzb3VyY2UpO1xyXG5cclxuICAgICAgICAvLyBNZXJnZSB3aXRoIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gcHJlY2VkZW5jZVxyXG4gICAgICAgIE9iamVjdC5hc3NpZ24obWVyZ2VkQ29uZmlnLCBsb2FkZXJDb25maWcpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZW5hYmxlTG9nZ2luZykge1xyXG4gICAgICAgICAgY29uc3Qga2V5Q291bnQgPSBPYmplY3Qua2V5cyhsb2FkZXJDb25maWcpLmxlbmd0aDtcclxuICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBMb2FkZWQgJHtrZXlDb3VudH0gY29uZmlndXJhdGlvbiB2YWx1ZXMgZnJvbSAke2xvYWRlci5nZXROYW1lKCl9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIGNvbnN0IGxvYWRlckVycm9yID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIExvZyBkZXRhaWxlZCBlcnJvciBpbmZvcm1hdGlvbiBmb3IgdHJvdWJsZXNob290aW5nXHJcbiAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIubG9nRGV0YWlsZWRFcnJvcihgbG9hZENvbmZpZ3VyYXRpb24gLSAke2xvYWRlci5nZXROYW1lKCl9YCwgbG9hZGVyRXJyb3IsIHtcclxuICAgICAgICAgIGxvYWRlck5hbWU6IGxvYWRlci5nZXROYW1lKCksXHJcbiAgICAgICAgICBsb2FkZXJUeXBlOiB0aGlzLmdldFNvdXJjZVR5cGUobG9hZGVyKSxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gSGFuZGxlIHNwZWNpZmljIGVycm9yIHR5cGVzXHJcbiAgICAgICAgaWYgKHRoaXMuaXNBd3NTZXJ2aWNlRXJyb3IobG9hZGVyRXJyb3IpKSB7XHJcbiAgICAgICAgICBjb25zdCBzaG91bGRDb250aW51ZSA9IHRoaXMuaGFuZGxlQXdzU3BlY2lmaWNFcnJvcihsb2FkZXIsIGxvYWRlckVycm9yKTtcclxuICAgICAgICAgIGlmICghc2hvdWxkQ29udGludWUpIHtcclxuICAgICAgICAgICAgdGhyb3cgbG9hZGVyRXJyb3I7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIEhhbmRsZSBnZW5lcmFsIGNvbmZpZ3VyYXRpb24gZXJyb3JzXHJcbiAgICAgICAgICBjb25zdCBzaG91bGRDb250aW51ZSA9IHRoaXMuZXJyb3JIYW5kbGVyLmhhbmRsZUNvbmZpZ3VyYXRpb25FcnJvcihsb2FkZXIuZ2V0TmFtZSgpLCBsb2FkZXJFcnJvcik7XHJcbiAgICAgICAgICBpZiAoIXNob3VsZENvbnRpbnVlKSB7XHJcbiAgICAgICAgICAgIHRocm93IGxvYWRlckVycm9yO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQWRkIGVycm9yIHRvIHNvdXJjZSBtZXRhZGF0YVxyXG4gICAgICAgIGNvbnN0IGVycm9yU291cmNlOiBDb25maWd1cmF0aW9uU291cmNlID0ge1xyXG4gICAgICAgICAgbmFtZTogbG9hZGVyLmdldE5hbWUoKSxcclxuICAgICAgICAgIHR5cGU6IHRoaXMuZ2V0U291cmNlVHlwZShsb2FkZXIpLFxyXG4gICAgICAgICAgcHJpb3JpdHk6IHRoaXMuZ2V0U291cmNlUHJpb3JpdHkobG9hZGVyKSxcclxuICAgICAgICAgIGRhdGE6IHt9LFxyXG4gICAgICAgICAgbG9hZGVkQXQ6IG5ldyBEYXRlKCksXHJcbiAgICAgICAgICBlcnJvcnM6IFtsb2FkZXJFcnJvci5tZXNzYWdlXSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHNvdXJjZXMucHVzaChlcnJvclNvdXJjZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbWVyZ2VkQ29uZmlnO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTG9hZCBjb25maWd1cmF0aW9uIGZvciBzcGVjaWZpYyBuYW1lc3BhY2VzIGZyb20gQVdTIHNvdXJjZXMuXHJcbiAgICogQHBhcmFtIG5hbWVzcGFjZXMgLSBBcnJheSBvZiBuYW1lc3BhY2UgbmFtZXMgdG8gbG9hZFxyXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIG5hbWVzcGFjZWQgY29uZmlndXJhdGlvbiBkYXRhXHJcbiAgICovXHJcbiAgYXN5bmMgbG9hZE5hbWVzcGFjZWRDb25maWd1cmF0aW9uKG5hbWVzcGFjZXM6IHN0cmluZ1tdKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBhbnk+Pj4ge1xyXG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9IHt9O1xyXG4gICAgXHJcbiAgICAvLyBJbml0aWFsaXplIGFsbCBuYW1lc3BhY2VzXHJcbiAgICBmb3IgKGNvbnN0IG5hbWVzcGFjZSBvZiBuYW1lc3BhY2VzKSB7XHJcbiAgICAgIHJlc3VsdFtuYW1lc3BhY2VdID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChjb25zdCBsb2FkZXIgb2YgdGhpcy5sb2FkZXJzKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgLy8gQ2hlY2sgaWYgbG9hZGVyIGlzIGF2YWlsYWJsZSBpbiBjdXJyZW50IGVudmlyb25tZW50IHdpdGggdGltZW91dFxyXG4gICAgICAgIGNvbnN0IGlzQXZhaWxhYmxlID0gYXdhaXQgdGhpcy5jaGVja0F2YWlsYWJpbGl0eVdpdGhUaW1lb3V0KGxvYWRlcik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKCFpc0F2YWlsYWJsZSkge1xyXG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5lbmFibGVMb2dnaW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBTa2lwcGluZyAke2xvYWRlci5nZXROYW1lKCl9IGZvciBuYW1lc3BhY2UgbG9hZGluZyAtIG5vdCBhdmFpbGFibGVgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5lbmFibGVMb2dnaW5nKSB7XHJcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgTG9hZGluZyBuYW1lc3BhY2VkIGNvbmZpZ3VyYXRpb24gZnJvbSAke2xvYWRlci5nZXROYW1lKCl9YCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBMb2FkIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGlzIHNvdXJjZSB3aXRoIHJldHJ5IGxvZ2ljIGZvciBBV1Mgc2VydmljZXNcclxuICAgICAgICBjb25zdCBsb2FkZXJDb25maWcgPSBsb2FkZXIgaW5zdGFuY2VvZiBFbnZpcm9ubWVudExvYWRlciBcclxuICAgICAgICAgID8gYXdhaXQgbG9hZGVyLmxvYWQoKSBcclxuICAgICAgICAgIDogYXdhaXQgdGhpcy5sb2FkV2l0aFJldHJ5KGxvYWRlcik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gRGlzdHJpYnV0ZSBjb25maWd1cmF0aW9uIHRvIG5hbWVzcGFjZXMgYmFzZWQgb24ga2V5IHByZWZpeGVzIG9yIHBhdHRlcm5zXHJcbiAgICAgICAgZm9yIChjb25zdCBuYW1lc3BhY2Ugb2YgbmFtZXNwYWNlcykge1xyXG4gICAgICAgICAgY29uc3QgbmFtZXNwYWNlZENvbmZpZyA9IHRoaXMuZXh0cmFjdE5hbWVzcGFjZUNvbmZpZyhsb2FkZXJDb25maWcsIG5hbWVzcGFjZSk7XHJcbiAgICAgICAgICBcclxuICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhuYW1lc3BhY2VkQ29uZmlnKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24ocmVzdWx0W25hbWVzcGFjZV0hLCBuYW1lc3BhY2VkQ29uZmlnKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZW5hYmxlTG9nZ2luZykge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGtleUNvdW50ID0gT2JqZWN0LmtleXMobmFtZXNwYWNlZENvbmZpZykubGVuZ3RoO1xyXG4gICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBMb2FkZWQgJHtrZXlDb3VudH0gdmFsdWVzIGZvciBuYW1lc3BhY2UgJyR7bmFtZXNwYWNlfScgZnJvbSAke2xvYWRlci5nZXROYW1lKCl9YCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc3QgbG9hZGVyRXJyb3IgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gTG9nIGRldGFpbGVkIGVycm9yIGluZm9ybWF0aW9uIGZvciB0cm91Ymxlc2hvb3RpbmdcclxuICAgICAgICB0aGlzLmVycm9ySGFuZGxlci5sb2dEZXRhaWxlZEVycm9yKGBsb2FkTmFtZXNwYWNlZENvbmZpZ3VyYXRpb24gLSAke2xvYWRlci5nZXROYW1lKCl9YCwgbG9hZGVyRXJyb3IsIHtcclxuICAgICAgICAgIGxvYWRlck5hbWU6IGxvYWRlci5nZXROYW1lKCksXHJcbiAgICAgICAgICBsb2FkZXJUeXBlOiB0aGlzLmdldFNvdXJjZVR5cGUobG9hZGVyKSxcclxuICAgICAgICAgIG5hbWVzcGFjZXMsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIEhhbmRsZSBzcGVjaWZpYyBlcnJvciB0eXBlc1xyXG4gICAgICAgIGlmICh0aGlzLmlzQXdzU2VydmljZUVycm9yKGxvYWRlckVycm9yKSkge1xyXG4gICAgICAgICAgY29uc3Qgc2hvdWxkQ29udGludWUgPSB0aGlzLmhhbmRsZUF3c1NwZWNpZmljRXJyb3IobG9hZGVyLCBsb2FkZXJFcnJvcik7XHJcbiAgICAgICAgICBpZiAoIXNob3VsZENvbnRpbnVlKSB7XHJcbiAgICAgICAgICAgIHRocm93IGxvYWRlckVycm9yO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBIYW5kbGUgZ2VuZXJhbCBjb25maWd1cmF0aW9uIGVycm9yc1xyXG4gICAgICAgICAgY29uc3Qgc2hvdWxkQ29udGludWUgPSB0aGlzLmVycm9ySGFuZGxlci5oYW5kbGVDb25maWd1cmF0aW9uRXJyb3IobG9hZGVyLmdldE5hbWUoKSwgbG9hZGVyRXJyb3IpO1xyXG4gICAgICAgICAgaWYgKCFzaG91bGRDb250aW51ZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBsb2FkZXJFcnJvcjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIENyZWF0ZSBmYWxsYmFjayBjb25maWd1cmF0aW9uIGZvciBlYWNoIG5hbWVzcGFjZVxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZmFsbGJhY2tUb0xvY2FsKSB7XHJcbiAgICAgICAgICBmb3IgKGNvbnN0IG5hbWVzcGFjZSBvZiBuYW1lc3BhY2VzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZhbGxiYWNrQ29uZmlnID0gdGhpcy5lcnJvckhhbmRsZXIuY3JlYXRlRmFsbGJhY2tDb25maWd1cmF0aW9uKG5hbWVzcGFjZSk7XHJcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24ocmVzdWx0W25hbWVzcGFjZV0hLCBmYWxsYmFja0NvbmZpZyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIEFXUyBzZXJ2aWNlcyBhcmUgYXZhaWxhYmxlLlxyXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGF2YWlsYWJpbGl0eSBzdGF0dXNcclxuICAgKi9cclxuICBhc3luYyBpc0F2YWlsYWJsZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIENoZWNrIGlmIGF0IGxlYXN0IG9uZSBBV1MgbG9hZGVyIGlzIGF2YWlsYWJsZVxyXG4gICAgICBjb25zdCBhdmFpbGFiaWxpdHlDaGVja3MgPSB0aGlzLmxvYWRlcnNcclxuICAgICAgICAuZmlsdGVyKGxvYWRlciA9PiAhKGxvYWRlciBpbnN0YW5jZW9mIEVudmlyb25tZW50TG9hZGVyKSkgLy8gU2tpcCBlbnZpcm9ubWVudCBsb2FkZXJcclxuICAgICAgICAubWFwKGxvYWRlciA9PiB0aGlzLmNoZWNrQXZhaWxhYmlsaXR5V2l0aFRpbWVvdXQobG9hZGVyKSk7XHJcblxyXG4gICAgICBpZiAoYXZhaWxhYmlsaXR5Q2hlY2tzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIC8vIE5vIEFXUyBsb2FkZXJzIGNvbmZpZ3VyZWRcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFdhaXQgZm9yIGFsbCBhdmFpbGFiaWxpdHkgY2hlY2tzIHRvIGNvbXBsZXRlXHJcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoYXZhaWxhYmlsaXR5Q2hlY2tzKTtcclxuICAgICAgXHJcbiAgICAgIC8vIFJldHVybiB0cnVlIGlmIGF0IGxlYXN0IG9uZSBBV1Mgc2VydmljZSBpcyBhdmFpbGFibGVcclxuICAgICAgcmV0dXJuIHJlc3VsdHMuc29tZShyZXN1bHQgPT4gcmVzdWx0LnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcgJiYgcmVzdWx0LnZhbHVlID09PSB0cnVlKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnN0IGF2YWlsYWJpbGl0eUVycm9yID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpO1xyXG4gICAgICBcclxuICAgICAgdGhpcy5lcnJvckhhbmRsZXIubG9nRGV0YWlsZWRFcnJvcignaXNBdmFpbGFibGUnLCBhdmFpbGFiaWxpdHlFcnJvcik7XHJcbiAgICAgIFxyXG4gICAgICAvLyBIYW5kbGUgYXMgQVdTIHVuYXZhaWxhYmxlXHJcbiAgICAgIHRoaXMuZXJyb3JIYW5kbGVyLmhhbmRsZUF3c1VuYXZhaWxhYmxlKCdBV1MgU2VydmljZXMnLCBhdmFpbGFiaWxpdHlFcnJvcik7XHJcbiAgICAgIFxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgYWxsIGF2YWlsYWJsZSBjb25maWd1cmF0aW9uIHNvdXJjZXMgd2l0aCB0aGVpciBtZXRhZGF0YS5cclxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBhcnJheSBvZiBjb25maWd1cmF0aW9uIHNvdXJjZXNcclxuICAgKi9cclxuICBhc3luYyBnZXRBdmFpbGFibGVTb3VyY2VzKCk6IFByb21pc2U8Q29uZmlndXJhdGlvblNvdXJjZVtdPiB7XHJcbiAgICBjb25zdCBzb3VyY2VzOiBDb25maWd1cmF0aW9uU291cmNlW10gPSBbXTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGxvYWRlciBvZiB0aGlzLmxvYWRlcnMpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBpc0F2YWlsYWJsZSA9IGF3YWl0IGxvYWRlci5pc0F2YWlsYWJsZSgpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChpc0F2YWlsYWJsZSkge1xyXG4gICAgICAgICAgY29uc3QgbG9hZGVyQ29uZmlnID0gYXdhaXQgbG9hZGVyLmxvYWQoKTtcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgY29uc3Qgc291cmNlOiBDb25maWd1cmF0aW9uU291cmNlID0ge1xyXG4gICAgICAgICAgICBuYW1lOiBsb2FkZXIuZ2V0TmFtZSgpLFxyXG4gICAgICAgICAgICB0eXBlOiB0aGlzLmdldFNvdXJjZVR5cGUobG9hZGVyKSxcclxuICAgICAgICAgICAgcHJpb3JpdHk6IHRoaXMuZ2V0U291cmNlUHJpb3JpdHkobG9hZGVyKSxcclxuICAgICAgICAgICAgZGF0YTogbG9hZGVyQ29uZmlnLFxyXG4gICAgICAgICAgICBsb2FkZWRBdDogbmV3IERhdGUoKSxcclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgc291cmNlcy5wdXNoKHNvdXJjZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIC8vIEFkZCBzb3VyY2Ugd2l0aCBlcnJvciBpbmZvcm1hdGlvblxyXG4gICAgICAgIGNvbnN0IHNvdXJjZTogQ29uZmlndXJhdGlvblNvdXJjZSA9IHtcclxuICAgICAgICAgIG5hbWU6IGxvYWRlci5nZXROYW1lKCksXHJcbiAgICAgICAgICB0eXBlOiB0aGlzLmdldFNvdXJjZVR5cGUobG9hZGVyKSxcclxuICAgICAgICAgIHByaW9yaXR5OiB0aGlzLmdldFNvdXJjZVByaW9yaXR5KGxvYWRlciksXHJcbiAgICAgICAgICBkYXRhOiB7fSxcclxuICAgICAgICAgIGxvYWRlZEF0OiBuZXcgRGF0ZSgpLFxyXG4gICAgICAgICAgZXJyb3JzOiBbZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXSxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBzb3VyY2VzLnB1c2goc291cmNlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzb3VyY2VzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGNvbmZpZ3VyYXRpb24gbG9hZGVycyBiYXNlZCBvbiBpbnRlZ3JhdGlvbiBvcHRpb25zLlxyXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIGNvbmZpZ3VyYXRpb24gbG9hZGVyc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgY3JlYXRlTG9hZGVycygpOiBDb25maWdMb2FkZXJbXSB7XHJcbiAgICBjb25zdCBsb2FkZXJzOiBDb25maWdMb2FkZXJbXSA9IFtdO1xyXG5cclxuICAgIC8vIEFsd2F5cyBpbmNsdWRlIGVudmlyb25tZW50IGxvYWRlclxyXG4gICAgbG9hZGVycy5wdXNoKG5ldyBFbnZpcm9ubWVudExvYWRlcih7IHByZWZpeDogdGhpcy5vcHRpb25zLmVudlByZWZpeCB9KSk7XHJcblxyXG4gICAgLy8gQWRkIEFXUyBTZWNyZXRzIE1hbmFnZXIgbG9hZGVyIGlmIGNvbmZpZ3VyZWRcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuc2VjcmV0c01hbmFnZXJDb25maWc/LmVuYWJsZWQgIT09IGZhbHNlKSB7XHJcbiAgICAgIGNvbnN0IHNlY3JldHNDb25maWcgPSB7XHJcbiAgICAgICAgcmVnaW9uOiB0aGlzLm9wdGlvbnMuc2VjcmV0c01hbmFnZXJDb25maWc/LnJlZ2lvbixcclxuICAgICAgICAvLyBDb252ZXJ0IHBhdGhzIHRvIHNlY3JldE5hbWUgZm9ybWF0IGV4cGVjdGVkIGJ5IFNlY3JldHNNYW5hZ2VyTG9hZGVyXHJcbiAgICAgICAgc2VjcmV0TmFtZTogdGhpcy5nZXRTZWNyZXRzTWFuYWdlclBhdGgoKSxcclxuICAgICAgfTtcclxuICAgICAgbG9hZGVycy5wdXNoKG5ldyBTZWNyZXRzTWFuYWdlckxvYWRlcihzZWNyZXRzQ29uZmlnKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQWRkIFNTTSBQYXJhbWV0ZXIgU3RvcmUgbG9hZGVyIGlmIGNvbmZpZ3VyZWRcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuc3NtQ29uZmlnPy5lbmFibGVkICE9PSBmYWxzZSkge1xyXG4gICAgICBjb25zdCBzc21Db25maWcgPSB7XHJcbiAgICAgICAgcmVnaW9uOiB0aGlzLm9wdGlvbnMuc3NtQ29uZmlnPy5yZWdpb24sXHJcbiAgICAgICAgLy8gQ29udmVydCBwYXRocyB0byBwYXJhbWV0ZXJQYXRoIGZvcm1hdCBleHBlY3RlZCBieSBTU01QYXJhbWV0ZXJTdG9yZUxvYWRlclxyXG4gICAgICAgIHBhcmFtZXRlclBhdGg6IHRoaXMuZ2V0U1NNUGFyYW1ldGVyUGF0aCgpLFxyXG4gICAgICAgIHdpdGhEZWNyeXB0aW9uOiB0aGlzLm9wdGlvbnMuc3NtQ29uZmlnPy5kZWNyeXB0ID8/IHRydWUsXHJcbiAgICAgIH07XHJcbiAgICAgIGxvYWRlcnMucHVzaChuZXcgU1NNUGFyYW1ldGVyU3RvcmVMb2FkZXIoc3NtQ29uZmlnKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGxvYWRlcnM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIHNvdXJjZSB0eXBlIGZvciBhIGdpdmVuIGxvYWRlci5cclxuICAgKiBAcGFyYW0gbG9hZGVyIC0gVGhlIGNvbmZpZ3VyYXRpb24gbG9hZGVyXHJcbiAgICogQHJldHVybnMgVGhlIGNvbmZpZ3VyYXRpb24gc291cmNlIHR5cGVcclxuICAgKi9cclxuICBwcml2YXRlIGdldFNvdXJjZVR5cGUobG9hZGVyOiBDb25maWdMb2FkZXIpOiBDb25maWd1cmF0aW9uU291cmNlVHlwZSB7XHJcbiAgICBpZiAobG9hZGVyIGluc3RhbmNlb2YgRW52aXJvbm1lbnRMb2FkZXIpIHtcclxuICAgICAgcmV0dXJuICdlbnZpcm9ubWVudCc7XHJcbiAgICB9IGVsc2UgaWYgKGxvYWRlciBpbnN0YW5jZW9mIFNlY3JldHNNYW5hZ2VyTG9hZGVyKSB7XHJcbiAgICAgIHJldHVybiAnc2VjcmV0cy1tYW5hZ2VyJztcclxuICAgIH0gZWxzZSBpZiAobG9hZGVyIGluc3RhbmNlb2YgU1NNUGFyYW1ldGVyU3RvcmVMb2FkZXIpIHtcclxuICAgICAgcmV0dXJuICdzc20nO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuICdsb2NhbC1maWxlJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgcHJpb3JpdHkgZm9yIGEgZ2l2ZW4gbG9hZGVyIGJhc2VkIG9uIHByZWNlZGVuY2UgcnVsZXMuXHJcbiAgICogQHBhcmFtIGxvYWRlciAtIFRoZSBjb25maWd1cmF0aW9uIGxvYWRlclxyXG4gICAqIEByZXR1cm5zIFRoZSBwcmlvcml0eSBudW1iZXIgKGhpZ2hlciA9IGhpZ2hlciBwcmlvcml0eSlcclxuICAgKi9cclxuICBwcml2YXRlIGdldFNvdXJjZVByaW9yaXR5KGxvYWRlcjogQ29uZmlnTG9hZGVyKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IHByZWNlZGVuY2UgPSB0aGlzLm9wdGlvbnMucHJlY2VkZW5jZSB8fCAnYXdzLWZpcnN0JztcclxuICAgIFxyXG4gICAgaWYgKHByZWNlZGVuY2UgPT09ICdsb2NhbC1maXJzdCcpIHtcclxuICAgICAgLy8gRW52aXJvbm1lbnQgdmFyaWFibGVzIGhhdmUgaGlnaGVzdCBwcmlvcml0eVxyXG4gICAgICBpZiAobG9hZGVyIGluc3RhbmNlb2YgRW52aXJvbm1lbnRMb2FkZXIpIHJldHVybiAxMDA7XHJcbiAgICAgIGlmIChsb2FkZXIgaW5zdGFuY2VvZiBTZWNyZXRzTWFuYWdlckxvYWRlcikgcmV0dXJuIDUwO1xyXG4gICAgICBpZiAobG9hZGVyIGluc3RhbmNlb2YgU1NNUGFyYW1ldGVyU3RvcmVMb2FkZXIpIHJldHVybiA0MDtcclxuICAgIH0gZWxzZSBpZiAocHJlY2VkZW5jZSA9PT0gJ2F3cy1maXJzdCcpIHtcclxuICAgICAgLy8gQVdTIHNvdXJjZXMgaGF2ZSBoaWdoZXIgcHJpb3JpdHlcclxuICAgICAgaWYgKGxvYWRlciBpbnN0YW5jZW9mIFNlY3JldHNNYW5hZ2VyTG9hZGVyKSByZXR1cm4gMTAwO1xyXG4gICAgICBpZiAobG9hZGVyIGluc3RhbmNlb2YgU1NNUGFyYW1ldGVyU3RvcmVMb2FkZXIpIHJldHVybiA5MDtcclxuICAgICAgaWYgKGxvYWRlciBpbnN0YW5jZW9mIEVudmlyb25tZW50TG9hZGVyKSByZXR1cm4gNTA7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBtZXJnZSAtIGVxdWFsIHByaW9yaXR5LCBvcmRlciBtYXR0ZXJzXHJcbiAgICAgIHJldHVybiA1MDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgcmV0dXJuIDUwO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXh0cmFjdCBjb25maWd1cmF0aW9uIGZvciBhIHNwZWNpZmljIG5hbWVzcGFjZSBmcm9tIGxvYWRlZCBjb25maWd1cmF0aW9uLlxyXG4gICAqIEBwYXJhbSBjb25maWcgLSBUaGUgbG9hZGVkIGNvbmZpZ3VyYXRpb25cclxuICAgKiBAcGFyYW0gbmFtZXNwYWNlIC0gVGhlIG5hbWVzcGFjZSB0byBleHRyYWN0XHJcbiAgICogQHJldHVybnMgQ29uZmlndXJhdGlvbiB2YWx1ZXMgZm9yIHRoZSBuYW1lc3BhY2VcclxuICAgKi9cclxuICBwcml2YXRlIGV4dHJhY3ROYW1lc3BhY2VDb25maWcoY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBuYW1lc3BhY2U6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xyXG4gICAgY29uc3QgbmFtZXNwYWNlQ29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XHJcbiAgICBjb25zdCBuYW1lc3BhY2VQcmVmaXggPSBuYW1lc3BhY2UudG9VcHBlckNhc2UoKTtcclxuXHJcbiAgICAvLyBTdHJhdGVneSAxOiBMb29rIGZvciBkaXJlY3QgbmFtZXNwYWNlIGtleSAoZS5nLiwgY29uZmlnLmRhdGFiYXNlKVxyXG4gICAgaWYgKGNvbmZpZ1tuYW1lc3BhY2VdKSB7XHJcbiAgICAgIE9iamVjdC5hc3NpZ24obmFtZXNwYWNlQ29uZmlnLCBjb25maWdbbmFtZXNwYWNlXSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gU3RyYXRlZ3kgMjogTG9vayBmb3Iga2V5cyB0aGF0IHN0YXJ0IHdpdGggdGhlIG5hbWVzcGFjZSBwcmVmaXggKGUuZy4sIERBVEFCQVNFX0hPU1QpXHJcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhjb25maWcpKSB7XHJcbiAgICAgIGNvbnN0IHVwcGVyS2V5ID0ga2V5LnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgIFxyXG4gICAgICAvLyBDaGVjayBpZiBrZXkgc3RhcnRzIHdpdGggbmFtZXNwYWNlIHByZWZpeCBmb2xsb3dlZCBieSB1bmRlcnNjb3JlXHJcbiAgICAgIGlmICh1cHBlcktleS5zdGFydHNXaXRoKGAke25hbWVzcGFjZVByZWZpeH1fYCkpIHtcclxuICAgICAgICAvLyBSZW1vdmUgbmFtZXNwYWNlIHByZWZpeCBhbmQgdW5kZXJzY29yZSwgY29udmVydCB0byBjYW1lbENhc2VcclxuICAgICAgICBjb25zdCBuYW1lc3BhY2VkS2V5ID0ga2V5LnN1YnN0cmluZyhuYW1lc3BhY2UubGVuZ3RoICsgMSk7XHJcbiAgICAgICAgY29uc3QgY2FtZWxDYXNlS2V5ID0gdGhpcy50b0NhbWVsQ2FzZShuYW1lc3BhY2VkS2V5KTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAoY2FtZWxDYXNlS2V5KSB7XHJcbiAgICAgICAgICBuYW1lc3BhY2VDb25maWdbY2FtZWxDYXNlS2V5XSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFN0cmF0ZWd5IDM6IExvb2sgZm9yIG5lc3RlZCBuYW1lc3BhY2UgcGF0aHMgKGUuZy4sIC9hcHAvZGF0YWJhc2UvaG9zdClcclxuICAgIGNvbnN0IG5lc3RlZENvbmZpZyA9IHRoaXMuZXh0cmFjdE5lc3RlZE5hbWVzcGFjZUNvbmZpZyhjb25maWcsIG5hbWVzcGFjZSk7XHJcbiAgICBPYmplY3QuYXNzaWduKG5hbWVzcGFjZUNvbmZpZywgbmVzdGVkQ29uZmlnKTtcclxuXHJcbiAgICByZXR1cm4gbmFtZXNwYWNlQ29uZmlnO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXh0cmFjdCBuZXN0ZWQgbmFtZXNwYWNlIGNvbmZpZ3VyYXRpb24gZnJvbSBoaWVyYXJjaGljYWwga2V5cy5cclxuICAgKiBAcGFyYW0gY29uZmlnIC0gVGhlIGxvYWRlZCBjb25maWd1cmF0aW9uXHJcbiAgICogQHBhcmFtIG5hbWVzcGFjZSAtIFRoZSBuYW1lc3BhY2UgdG8gZXh0cmFjdFxyXG4gICAqIEByZXR1cm5zIENvbmZpZ3VyYXRpb24gdmFsdWVzIGZvciB0aGUgbmFtZXNwYWNlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBleHRyYWN0TmVzdGVkTmFtZXNwYWNlQ29uZmlnKGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PiwgbmFtZXNwYWNlOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcclxuICAgIGNvbnN0IG5hbWVzcGFjZUNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xyXG4gICAgY29uc3QgbmFtZXNwYWNlUGF0aCA9IGAvJHtuYW1lc3BhY2V9L2A7XHJcblxyXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnKSkge1xyXG4gICAgICAvLyBDaGVjayBpZiBrZXkgY29udGFpbnMgbmFtZXNwYWNlIHBhdGhcclxuICAgICAgaWYgKGtleS5pbmNsdWRlcyhuYW1lc3BhY2VQYXRoKSkge1xyXG4gICAgICAgIC8vIEV4dHJhY3QgdGhlIHBhcnQgYWZ0ZXIgdGhlIG5hbWVzcGFjZSBwYXRoXHJcbiAgICAgICAgY29uc3QgcGF0aEluZGV4ID0ga2V5LmluZGV4T2YobmFtZXNwYWNlUGF0aCk7XHJcbiAgICAgICAgY29uc3QgYWZ0ZXJOYW1lc3BhY2UgPSBrZXkuc3Vic3RyaW5nKHBhdGhJbmRleCArIG5hbWVzcGFjZVBhdGgubGVuZ3RoKTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAoYWZ0ZXJOYW1lc3BhY2UpIHtcclxuICAgICAgICAgIC8vIENvbnZlcnQgcGF0aCBzZWdtZW50cyB0byBuZXN0ZWQgb2JqZWN0IHN0cnVjdHVyZVxyXG4gICAgICAgICAgY29uc3QgbmVzdGVkS2V5ID0gdGhpcy5wYXRoVG9OZXN0ZWRLZXkoYWZ0ZXJOYW1lc3BhY2UpO1xyXG4gICAgICAgICAgdGhpcy5zZXROZXN0ZWRWYWx1ZShuYW1lc3BhY2VDb25maWcsIG5lc3RlZEtleSwgdmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBuYW1lc3BhY2VDb25maWc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb252ZXJ0IHNuYWtlX2Nhc2Ugb3Iga2ViYWItY2FzZSB0byBjYW1lbENhc2UuXHJcbiAgICogQHBhcmFtIHN0ciAtIFN0cmluZyB0byBjb252ZXJ0XHJcbiAgICogQHJldHVybnMgY2FtZWxDYXNlIHN0cmluZ1xyXG4gICAqL1xyXG4gIHByaXZhdGUgdG9DYW1lbENhc2Uoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHN0clxyXG4gICAgICAudG9Mb3dlckNhc2UoKVxyXG4gICAgICAucmVwbGFjZSgvW18tXSguKS9nLCAoXywgY2hhcikgPT4gY2hhci50b1VwcGVyQ2FzZSgpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbnZlcnQgcGF0aCBzZWdtZW50cyB0byBuZXN0ZWQga2V5IHN0cnVjdHVyZS5cclxuICAgKiBAcGFyYW0gcGF0aCAtIFBhdGggc3RyaW5nIChlLmcuLCBcImhvc3QvcG9ydFwiKVxyXG4gICAqIEByZXR1cm5zIE5lc3RlZCBrZXkgc3RydWN0dXJlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBwYXRoVG9OZXN0ZWRLZXkocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBwYXRoXHJcbiAgICAgIC5zcGxpdCgnLycpXHJcbiAgICAgIC5tYXAoc2VnbWVudCA9PiB0aGlzLnRvQ2FtZWxDYXNlKHNlZ21lbnQpKVxyXG4gICAgICAuam9pbignLicpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IGEgbmVzdGVkIHZhbHVlIGluIGFuIG9iamVjdCB1c2luZyBkb3Qgbm90YXRpb24uXHJcbiAgICogQHBhcmFtIG9iaiAtIFRhcmdldCBvYmplY3RcclxuICAgKiBAcGFyYW0gcGF0aCAtIERvdCBub3RhdGlvbiBwYXRoXHJcbiAgICogQHBhcmFtIHZhbHVlIC0gVmFsdWUgdG8gc2V0XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXROZXN0ZWRWYWx1ZShvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sIHBhdGg6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3Qga2V5cyA9IHBhdGguc3BsaXQoJy4nKTtcclxuICAgIGxldCBjdXJyZW50ID0gb2JqO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGggLSAxOyBpKyspIHtcclxuICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcclxuICAgICAgaWYgKGtleSAmJiAoIShrZXkgaW4gY3VycmVudCkgfHwgdHlwZW9mIGN1cnJlbnRba2V5XSAhPT0gJ29iamVjdCcpKSB7XHJcbiAgICAgICAgY3VycmVudFtrZXldID0ge307XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGtleSkge1xyXG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBsYXN0S2V5ID0ga2V5c1trZXlzLmxlbmd0aCAtIDFdO1xyXG4gICAgaWYgKGxhc3RLZXkpIHtcclxuICAgICAgY3VycmVudFtsYXN0S2V5XSA9IHZhbHVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBTZWNyZXRzIE1hbmFnZXIgcGF0aCBiYXNlZCBvbiBjb25maWd1cmF0aW9uLlxyXG4gICAqIEByZXR1cm5zIFRoZSBzZWNyZXRzIG1hbmFnZXIgcGF0aFxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0U2VjcmV0c01hbmFnZXJQYXRoKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBwYXRocyA9IHRoaXMub3B0aW9ucy5zZWNyZXRzTWFuYWdlckNvbmZpZz8ucGF0aHM7XHJcbiAgICBpZiAoIXBhdGhzKSB7XHJcbiAgICAgIHJldHVybiAnL25lc3Rqcy1jb25maWctYXdzJztcclxuICAgIH1cclxuXHJcbiAgICAvLyBVc2UgdGhlIGZpcnN0IGF2YWlsYWJsZSBwYXRoIG9yIGRlZmF1bHRcclxuICAgIHJldHVybiBwYXRocy5wcm9kdWN0aW9uIHx8IHBhdGhzLmRldmVsb3BtZW50IHx8IHBhdGhzLnRlc3QgfHwgJy9uZXN0anMtY29uZmlnLWF3cyc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIFNTTSBQYXJhbWV0ZXIgU3RvcmUgcGF0aCBiYXNlZCBvbiBjb25maWd1cmF0aW9uLlxyXG4gICAqIEByZXR1cm5zIFRoZSBTU00gcGFyYW1ldGVyIHBhdGhcclxuICAgKi9cclxuICBwcml2YXRlIGdldFNTTVBhcmFtZXRlclBhdGgoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHBhdGhzID0gdGhpcy5vcHRpb25zLnNzbUNvbmZpZz8ucGF0aHM7XHJcbiAgICBpZiAoIXBhdGhzKSB7XHJcbiAgICAgIHJldHVybiAnL25lc3Rqcy1jb25maWctYXdzJztcclxuICAgIH1cclxuXHJcbiAgICAvLyBVc2UgdGhlIGZpcnN0IGF2YWlsYWJsZSBwYXRoIG9yIGRlZmF1bHRcclxuICAgIHJldHVybiBwYXRocy5wcm9kdWN0aW9uIHx8IHBhdGhzLmRldmVsb3BtZW50IHx8IHBhdGhzLnRlc3QgfHwgJy9uZXN0anMtY29uZmlnLWF3cyc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayBpZiBhbiBlcnJvciBpcyBhbiBBV1Mgc2VydmljZSBlcnJvci5cclxuICAgKiBAcGFyYW0gZXJyb3IgLSBUaGUgZXJyb3IgdG8gY2hlY2tcclxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBlcnJvciBpcyBmcm9tIGFuIEFXUyBzZXJ2aWNlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpc0F3c1NlcnZpY2VFcnJvcihlcnJvcjogRXJyb3IpOiBib29sZWFuIHtcclxuICAgIC8vIEFXUyBTREsgZXJyb3JzIHR5cGljYWxseSBoYXZlIHNwZWNpZmljIG5hbWVzXHJcbiAgICBjb25zdCBhd3NFcnJvck5hbWVzID0gW1xyXG4gICAgICAnQWNjZXNzRGVuaWVkRXhjZXB0aW9uJyxcclxuICAgICAgJ1Jlc291cmNlTm90Rm91bmRFeGNlcHRpb24nLFxyXG4gICAgICAnSW52YWxpZFJlcXVlc3RFeGNlcHRpb24nLFxyXG4gICAgICAnVGhyb3R0bGluZ0V4Y2VwdGlvbicsXHJcbiAgICAgICdTZXJ2aWNlVW5hdmFpbGFibGVFeGNlcHRpb24nLFxyXG4gICAgICAnTmV0d29ya2luZ0Vycm9yJyxcclxuICAgICAgJ1RpbWVvdXRFcnJvcicsXHJcbiAgICAgICdDcmVkZW50aWFsc0Vycm9yJyxcclxuICAgICAgJ1Vua25vd25FbmRwb2ludCcsXHJcbiAgICBdO1xyXG5cclxuICAgIHJldHVybiBhd3NFcnJvck5hbWVzLmluY2x1ZGVzKGVycm9yLm5hbWUpIHx8IGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ0FXUycpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIEFXUy1zcGVjaWZpYyBlcnJvcnMgd2l0aCBhcHByb3ByaWF0ZSBzdHJhdGVnaWVzLlxyXG4gICAqIEBwYXJhbSBsb2FkZXIgLSBUaGUgbG9hZGVyIHRoYXQgZW5jb3VudGVyZWQgdGhlIGVycm9yXHJcbiAgICogQHBhcmFtIGVycm9yIC0gVGhlIEFXUyBlcnJvclxyXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdG8gY29udGludWUgcHJvY2Vzc2luZ1xyXG4gICAqL1xyXG4gIHByaXZhdGUgaGFuZGxlQXdzU3BlY2lmaWNFcnJvcihsb2FkZXI6IENvbmZpZ0xvYWRlciwgZXJyb3I6IEVycm9yKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBzZXJ2aWNlTmFtZSA9IHRoaXMuZ2V0U2VydmljZU5hbWUobG9hZGVyKTtcclxuXHJcbiAgICBzd2l0Y2ggKGVycm9yLm5hbWUpIHtcclxuICAgICAgY2FzZSAnQWNjZXNzRGVuaWVkRXhjZXB0aW9uJzpcclxuICAgICAgICByZXR1cm4gdGhpcy5lcnJvckhhbmRsZXIuaGFuZGxlUGVybWlzc2lvbkVycm9yKFxyXG4gICAgICAgICAgc2VydmljZU5hbWUsXHJcbiAgICAgICAgICB0aGlzLmdldFJlc291cmNlTmFtZShsb2FkZXIpLFxyXG4gICAgICAgICAgZXJyb3JcclxuICAgICAgICApO1xyXG5cclxuICAgICAgY2FzZSAnUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbic6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3JIYW5kbGVyLmhhbmRsZVJlc291cmNlTm90Rm91bmQoXHJcbiAgICAgICAgICBzZXJ2aWNlTmFtZSxcclxuICAgICAgICAgIHRoaXMuZ2V0UmVzb3VyY2VOYW1lKGxvYWRlciksXHJcbiAgICAgICAgICBlcnJvclxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICBjYXNlICdOZXR3b3JraW5nRXJyb3InOlxyXG4gICAgICBjYXNlICdUaW1lb3V0RXJyb3InOlxyXG4gICAgICAgIGNvbnN0IG5ldHdvcmtSZXN1bHQgPSB0aGlzLmVycm9ySGFuZGxlci5oYW5kbGVOZXR3b3JrRXJyb3Ioc2VydmljZU5hbWUsIGVycm9yKTtcclxuICAgICAgICByZXR1cm4gbmV0d29ya1Jlc3VsdC5zaG91bGRDb250aW51ZTtcclxuXHJcbiAgICAgIGNhc2UgJ1Rocm90dGxpbmdFeGNlcHRpb24nOlxyXG4gICAgICBjYXNlICdUb29NYW55UmVxdWVzdHNFeGNlcHRpb24nOlxyXG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYFJhdGUgbGltaXRpbmcgZW5jb3VudGVyZWQgZm9yICR7c2VydmljZU5hbWV9LCBjb250aW51aW5nIHdpdGggb3RoZXIgc291cmNlc2ApO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG5cclxuICAgICAgY2FzZSAnU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uJzpcclxuICAgICAgICByZXR1cm4gdGhpcy5lcnJvckhhbmRsZXIuaGFuZGxlQXdzVW5hdmFpbGFibGUoc2VydmljZU5hbWUsIGVycm9yKTtcclxuXHJcbiAgICAgIGNhc2UgJ0NyZWRlbnRpYWxzRXJyb3InOlxyXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBBV1MgY3JlZGVudGlhbHMgZXJyb3IgZm9yICR7c2VydmljZU5hbWV9OiAke2Vycm9yLm1lc3NhZ2V9YCk7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ1BsZWFzZSBjaGVjayBBV1MgY3JlZGVudGlhbHMgY29uZmlndXJhdGlvbicpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVycm9ySGFuZGxlci5oYW5kbGVBd3NVbmF2YWlsYWJsZShzZXJ2aWNlTmFtZSwgZXJyb3IpO1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICAvLyBIYW5kbGUgYXMgZ2VuZXJhbCBjb25maWd1cmF0aW9uIGVycm9yXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3JIYW5kbGVyLmhhbmRsZUNvbmZpZ3VyYXRpb25FcnJvcihzZXJ2aWNlTmFtZSwgZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBzZXJ2aWNlIG5hbWUgZm9yIGEgbG9hZGVyLlxyXG4gICAqIEBwYXJhbSBsb2FkZXIgLSBUaGUgY29uZmlndXJhdGlvbiBsb2FkZXJcclxuICAgKiBAcmV0dXJucyBUaGUgc2VydmljZSBuYW1lXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRTZXJ2aWNlTmFtZShsb2FkZXI6IENvbmZpZ0xvYWRlcik6IHN0cmluZyB7XHJcbiAgICBpZiAobG9hZGVyIGluc3RhbmNlb2YgU2VjcmV0c01hbmFnZXJMb2FkZXIpIHtcclxuICAgICAgcmV0dXJuICdBV1MgU2VjcmV0cyBNYW5hZ2VyJztcclxuICAgIH0gZWxzZSBpZiAobG9hZGVyIGluc3RhbmNlb2YgU1NNUGFyYW1ldGVyU3RvcmVMb2FkZXIpIHtcclxuICAgICAgcmV0dXJuICdBV1MgU3lzdGVtcyBNYW5hZ2VyIFBhcmFtZXRlciBTdG9yZSc7XHJcbiAgICB9IGVsc2UgaWYgKGxvYWRlciBpbnN0YW5jZW9mIEVudmlyb25tZW50TG9hZGVyKSB7XHJcbiAgICAgIHJldHVybiAnRW52aXJvbm1lbnQgVmFyaWFibGVzJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiAnVW5rbm93biBTZXJ2aWNlJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgcmVzb3VyY2UgbmFtZSBmb3IgYSBsb2FkZXIuXHJcbiAgICogQHBhcmFtIGxvYWRlciAtIFRoZSBjb25maWd1cmF0aW9uIGxvYWRlclxyXG4gICAqIEByZXR1cm5zIFRoZSByZXNvdXJjZSBuYW1lXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRSZXNvdXJjZU5hbWUobG9hZGVyOiBDb25maWdMb2FkZXIpOiBzdHJpbmcge1xyXG4gICAgaWYgKGxvYWRlciBpbnN0YW5jZW9mIFNlY3JldHNNYW5hZ2VyTG9hZGVyKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldFNlY3JldHNNYW5hZ2VyUGF0aCgpO1xyXG4gICAgfSBlbHNlIGlmIChsb2FkZXIgaW5zdGFuY2VvZiBTU01QYXJhbWV0ZXJTdG9yZUxvYWRlcikge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRTU01QYXJhbWV0ZXJQYXRoKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gJ2NvbmZpZ3VyYXRpb24nO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTG9hZCBjb25maWd1cmF0aW9uIHdpdGggcmV0cnkgbG9naWMgZm9yIHJldHJ5YWJsZSBlcnJvcnMuXHJcbiAgICogQHBhcmFtIGxvYWRlciAtIFRoZSBjb25maWd1cmF0aW9uIGxvYWRlclxyXG4gICAqIEBwYXJhbSBtYXhSZXRyaWVzIC0gTWF4aW11bSBudW1iZXIgb2YgcmV0cmllc1xyXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGNvbmZpZ3VyYXRpb24gZGF0YVxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgbG9hZFdpdGhSZXRyeShsb2FkZXI6IENvbmZpZ0xvYWRlciwgbWF4UmV0cmllczogbnVtYmVyID0gMyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xyXG4gICAgbGV0IGxhc3RFcnJvcjogRXJyb3IgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgYXR0ZW1wdCA8PSBtYXhSZXRyaWVzOyBhdHRlbXB0KyspIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gYXdhaXQgbG9hZGVyLmxvYWQoKTtcclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zdCBsb2FkZXJFcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKTtcclxuICAgICAgICBsYXN0RXJyb3IgPSBsb2FkZXJFcnJvcjtcclxuXHJcbiAgICAgICAgLy8gQ2hlY2sgaWYgZXJyb3IgaXMgcmV0cnlhYmxlXHJcbiAgICAgICAgaWYgKCF0aGlzLmVycm9ySGFuZGxlci5pc1JldHJ5YWJsZUVycm9yKGxvYWRlckVycm9yKSB8fCBhdHRlbXB0ID09PSBtYXhSZXRyaWVzKSB7XHJcbiAgICAgICAgICB0aHJvdyBsb2FkZXJFcnJvcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFdhaXQgYmVmb3JlIHJldHJ5aW5nXHJcbiAgICAgICAgY29uc3QgZGVsYXkgPSB0aGlzLmVycm9ySGFuZGxlci5nZXRSZXRyeURlbGF5KGF0dGVtcHQpO1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYFJldHJ5aW5nICR7bG9hZGVyLmdldE5hbWUoKX0gaW4gJHtkZWxheX1tcyAoYXR0ZW1wdCAke2F0dGVtcHR9LyR7bWF4UmV0cmllc30pYCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGRlbGF5KSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBiZSByZWFjaGVkLCBidXQganVzdCBpbiBjYXNlXHJcbiAgICB0aHJvdyBsYXN0RXJyb3IgfHwgbmV3IEVycm9yKCdVbmtub3duIGVycm9yIGR1cmluZyByZXRyeScpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2sgYXZhaWxhYmlsaXR5IHdpdGggdGltZW91dCBhbmQgZXJyb3IgaGFuZGxpbmcuXHJcbiAgICogQHBhcmFtIGxvYWRlciAtIFRoZSBjb25maWd1cmF0aW9uIGxvYWRlclxyXG4gICAqIEBwYXJhbSB0aW1lb3V0TXMgLSBUaW1lb3V0IGluIG1pbGxpc2Vjb25kc1xyXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGF2YWlsYWJpbGl0eSBzdGF0dXNcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGNoZWNrQXZhaWxhYmlsaXR5V2l0aFRpbWVvdXQobG9hZGVyOiBDb25maWdMb2FkZXIsIHRpbWVvdXRNczogbnVtYmVyID0gNTAwMCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgdGltZW91dFByb21pc2UgPSBuZXcgUHJvbWlzZTxib29sZWFuPigoXywgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiByZWplY3QobmV3IEVycm9yKCdBdmFpbGFiaWxpdHkgY2hlY2sgdGltZW91dCcpKSwgdGltZW91dE1zKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCBhdmFpbGFiaWxpdHlQcm9taXNlID0gbG9hZGVyLmlzQXZhaWxhYmxlKCk7XHJcblxyXG4gICAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5yYWNlKFthdmFpbGFiaWxpdHlQcm9taXNlLCB0aW1lb3V0UHJvbWlzZV0pO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc3QgbG9hZGVyRXJyb3IgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSk7XHJcbiAgICAgIFxyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmVuYWJsZUxvZ2dpbmcpIHtcclxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgQXZhaWxhYmlsaXR5IGNoZWNrIGZhaWxlZCBmb3IgJHtsb2FkZXIuZ2V0TmFtZSgpfTogJHtsb2FkZXJFcnJvci5tZXNzYWdlfWApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG59Il19