@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,289 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var PrecedenceHandlerService_1;
8
+ import { Injectable, Logger } from '@nestjs/common';
9
+ /**
10
+ * Service responsible for handling configuration precedence rules and merging strategies.
11
+ */
12
+ let PrecedenceHandlerService = PrecedenceHandlerService_1 = class PrecedenceHandlerService {
13
+ logger = new Logger(PrecedenceHandlerService_1.name);
14
+ /**
15
+ * Apply precedence rules to merge configuration from multiple sources.
16
+ * @param sources - Array of configuration sources
17
+ * @param precedenceRule - The precedence rule to apply
18
+ * @returns Merged configuration data
19
+ */
20
+ applyPrecedenceRules(sources, precedenceRule) {
21
+ this.logger.debug(`Applying precedence rule: ${precedenceRule} to ${sources.length} sources`);
22
+ if (sources.length === 0) {
23
+ return {};
24
+ }
25
+ if (sources.length === 1) {
26
+ return sources[0]?.data || {};
27
+ }
28
+ switch (precedenceRule) {
29
+ case 'aws-first':
30
+ return this.applyAwsFirstPrecedence(sources);
31
+ case 'local-first':
32
+ return this.applyLocalFirstPrecedence(sources);
33
+ case 'merge':
34
+ return this.applyMergePrecedence(sources);
35
+ default:
36
+ this.logger.warn(`Unknown precedence rule: ${precedenceRule}, defaulting to 'aws-first'`);
37
+ return this.applyAwsFirstPrecedence(sources);
38
+ }
39
+ }
40
+ /**
41
+ * Apply AWS-first precedence: AWS sources override local sources.
42
+ * Priority order: AWS Secrets Manager > SSM Parameter Store > Environment > Local Files
43
+ * @param sources - Configuration sources
44
+ * @returns Merged configuration
45
+ */
46
+ applyAwsFirstPrecedence(sources) {
47
+ this.logger.debug('Applying AWS-first precedence');
48
+ const sortedSources = this.sortSourcesByAwsFirstPriority(sources);
49
+ return this.mergeSourcesInOrder(sortedSources);
50
+ }
51
+ /**
52
+ * Apply local-first precedence: Local sources override AWS sources.
53
+ * Priority order: Local Files > Environment > SSM Parameter Store > AWS Secrets Manager
54
+ * @param sources - Configuration sources
55
+ * @returns Merged configuration
56
+ */
57
+ applyLocalFirstPrecedence(sources) {
58
+ this.logger.debug('Applying local-first precedence');
59
+ const sortedSources = this.sortSourcesByLocalFirstPriority(sources);
60
+ return this.mergeSourcesInOrder(sortedSources);
61
+ }
62
+ /**
63
+ * Apply merge precedence: Intelligent merging based on source type and priority.
64
+ * Uses a balanced approach where both AWS and local sources contribute.
65
+ * @param sources - Configuration sources
66
+ * @returns Merged configuration
67
+ */
68
+ applyMergePrecedence(sources) {
69
+ this.logger.debug('Applying merge precedence');
70
+ // Group sources by type
71
+ const sourceGroups = this.groupSourcesByType(sources);
72
+ // Merge within each group first
73
+ const mergedGroups = {};
74
+ for (const [type, typeSources] of Object.entries(sourceGroups)) {
75
+ if (typeSources.length > 0) {
76
+ mergedGroups[type] = this.mergeSourcesInOrder(typeSources);
77
+ }
78
+ }
79
+ // Then merge across groups with balanced priority
80
+ return this.mergeGroupsWithBalancedPriority(mergedGroups);
81
+ }
82
+ /**
83
+ * Sort sources by AWS-first priority.
84
+ * @param sources - Configuration sources
85
+ * @returns Sorted sources (lowest priority first, highest priority last)
86
+ */
87
+ sortSourcesByAwsFirstPriority(sources) {
88
+ const priorityMap = {
89
+ 'local-file': 1,
90
+ 'environment': 2,
91
+ 'ssm': 3,
92
+ 'secrets-manager': 4
93
+ };
94
+ return [...sources].sort((a, b) => {
95
+ const priorityA = priorityMap[a.type] || 0;
96
+ const priorityB = priorityMap[b.type] || 0;
97
+ if (priorityA !== priorityB) {
98
+ return priorityA - priorityB;
99
+ }
100
+ // If same type, sort by explicit priority
101
+ return a.priority - b.priority;
102
+ });
103
+ }
104
+ /**
105
+ * Sort sources by local-first priority.
106
+ * @param sources - Configuration sources
107
+ * @returns Sorted sources (lowest priority first, highest priority last)
108
+ */
109
+ sortSourcesByLocalFirstPriority(sources) {
110
+ const priorityMap = {
111
+ 'secrets-manager': 1,
112
+ 'ssm': 2,
113
+ 'environment': 3,
114
+ 'local-file': 4
115
+ };
116
+ return [...sources].sort((a, b) => {
117
+ const priorityA = priorityMap[a.type] || 0;
118
+ const priorityB = priorityMap[b.type] || 0;
119
+ if (priorityA !== priorityB) {
120
+ return priorityA - priorityB;
121
+ }
122
+ // If same type, sort by explicit priority
123
+ return a.priority - b.priority;
124
+ });
125
+ }
126
+ /**
127
+ * Group sources by their type.
128
+ * @param sources - Configuration sources
129
+ * @returns Sources grouped by type
130
+ */
131
+ groupSourcesByType(sources) {
132
+ const groups = {};
133
+ for (const source of sources) {
134
+ if (!groups[source.type]) {
135
+ groups[source.type] = [];
136
+ }
137
+ groups[source.type]?.push(source);
138
+ }
139
+ // Sort within each group by priority
140
+ for (const type in groups) {
141
+ groups[type]?.sort((a, b) => a.priority - b.priority);
142
+ }
143
+ return groups;
144
+ }
145
+ /**
146
+ * Merge sources in the given order (later sources override earlier ones).
147
+ * @param sources - Ordered configuration sources
148
+ * @returns Merged configuration
149
+ */
150
+ mergeSourcesInOrder(sources) {
151
+ let merged = {};
152
+ for (const source of sources) {
153
+ this.logger.debug(`Merging source: ${source.name} (${source.type})`);
154
+ merged = this.deepMerge(merged, source.data);
155
+ }
156
+ return merged;
157
+ }
158
+ /**
159
+ * Merge groups with balanced priority for merge precedence.
160
+ * @param groups - Configuration groups by type
161
+ * @returns Merged configuration
162
+ */
163
+ mergeGroupsWithBalancedPriority(groups) {
164
+ let merged = {};
165
+ // Merge in balanced order: local-file -> environment -> ssm -> secrets-manager
166
+ const mergeOrder = ['local-file', 'environment', 'ssm', 'secrets-manager'];
167
+ for (const type of mergeOrder) {
168
+ if (groups[type]) {
169
+ this.logger.debug(`Merging group: ${type}`);
170
+ merged = this.deepMerge(merged, groups[type]);
171
+ }
172
+ }
173
+ return merged;
174
+ }
175
+ /**
176
+ * Deep merge two configuration objects with conflict resolution.
177
+ * @param target - Target object (lower priority)
178
+ * @param source - Source object (higher priority)
179
+ * @returns Merged object
180
+ */
181
+ deepMerge(target, source) {
182
+ const result = { ...target };
183
+ for (const [key, value] of Object.entries(source)) {
184
+ if (this.shouldDeepMerge(result[key], value)) {
185
+ result[key] = this.deepMerge(result[key], value);
186
+ }
187
+ else {
188
+ result[key] = this.cloneValue(value);
189
+ }
190
+ }
191
+ return result;
192
+ }
193
+ /**
194
+ * Determine if two values should be deep merged.
195
+ * @param target - Target value
196
+ * @param source - Source value
197
+ * @returns True if should deep merge, false otherwise
198
+ */
199
+ shouldDeepMerge(target, source) {
200
+ return target !== null &&
201
+ source !== null &&
202
+ typeof target === 'object' &&
203
+ typeof source === 'object' &&
204
+ !Array.isArray(target) &&
205
+ !Array.isArray(source);
206
+ }
207
+ /**
208
+ * Clone a value to avoid reference issues.
209
+ * @param value - Value to clone
210
+ * @returns Cloned value
211
+ */
212
+ cloneValue(value) {
213
+ if (value === null || typeof value !== 'object') {
214
+ return value;
215
+ }
216
+ if (Array.isArray(value)) {
217
+ return value.map(item => this.cloneValue(item));
218
+ }
219
+ const cloned = {};
220
+ for (const [key, val] of Object.entries(value)) {
221
+ cloned[key] = this.cloneValue(val);
222
+ }
223
+ return cloned;
224
+ }
225
+ /**
226
+ * Validate configuration sources for precedence handling.
227
+ * @param sources - Configuration sources to validate
228
+ * @returns Validation result with any issues found
229
+ */
230
+ validateSources(sources) {
231
+ const issues = [];
232
+ if (!Array.isArray(sources)) {
233
+ issues.push('Sources must be an array');
234
+ return { valid: false, issues };
235
+ }
236
+ for (let i = 0; i < sources.length; i++) {
237
+ const source = sources[i];
238
+ if (!source) {
239
+ issues.push(`Source at index ${i} is null or undefined`);
240
+ continue;
241
+ }
242
+ if (!source.name || typeof source.name !== 'string') {
243
+ issues.push(`Source at index ${i} must have a valid name`);
244
+ }
245
+ if (!source.type || !['environment', 'secrets-manager', 'ssm', 'local-file'].includes(source.type)) {
246
+ issues.push(`Source at index ${i} must have a valid type`);
247
+ }
248
+ if (typeof source.priority !== 'number') {
249
+ issues.push(`Source at index ${i} must have a numeric priority`);
250
+ }
251
+ if (!source.data || typeof source.data !== 'object') {
252
+ issues.push(`Source at index ${i} must have valid data object`);
253
+ }
254
+ if (!source.loadedAt || !(source.loadedAt instanceof Date)) {
255
+ issues.push(`Source at index ${i} must have a valid loadedAt date`);
256
+ }
257
+ }
258
+ return { valid: issues.length === 0, issues };
259
+ }
260
+ /**
261
+ * Get the effective priority for a source based on precedence rule.
262
+ * @param source - Configuration source
263
+ * @param precedenceRule - Precedence rule
264
+ * @returns Effective priority
265
+ */
266
+ getEffectivePriority(source, precedenceRule) {
267
+ const basePriority = source.priority;
268
+ switch (precedenceRule) {
269
+ case 'aws-first':
270
+ const awsFirstBonus = source.type === 'secrets-manager' ? 1000 :
271
+ source.type === 'ssm' ? 500 : 0;
272
+ return basePriority + awsFirstBonus;
273
+ case 'local-first':
274
+ const localFirstBonus = source.type === 'local-file' ? 1000 :
275
+ source.type === 'environment' ? 500 : 0;
276
+ return basePriority + localFirstBonus;
277
+ case 'merge':
278
+ // In merge mode, all sources have equal weight
279
+ return basePriority;
280
+ default:
281
+ return basePriority;
282
+ }
283
+ }
284
+ };
285
+ PrecedenceHandlerService = PrecedenceHandlerService_1 = __decorate([
286
+ Injectable()
287
+ ], PrecedenceHandlerService);
288
+ export { PrecedenceHandlerService };
289
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlY2VkZW5jZS1oYW5kbGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvaW50ZWdyYXRpb24vc2VydmljZXMvcHJlY2VkZW5jZS1oYW5kbGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJcEQ7O0dBRUc7QUFFSSxJQUFNLHdCQUF3QixnQ0FBOUIsTUFBTSx3QkFBd0I7SUFDbEIsTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLDBCQUF3QixDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXBFOzs7OztPQUtHO0lBQ0gsb0JBQW9CLENBQ2xCLE9BQThCLEVBQzlCLGNBQThCO1FBRTlCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLDZCQUE2QixjQUFjLE9BQU8sT0FBTyxDQUFDLE1BQU0sVUFBVSxDQUFDLENBQUM7UUFFOUYsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUVELElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6QixPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ2hDLENBQUM7UUFFRCxRQUFRLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLEtBQUssV0FBVztnQkFDZCxPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMvQyxLQUFLLGFBQWE7Z0JBQ2hCLE9BQU8sSUFBSSxDQUFDLHlCQUF5QixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2pELEtBQUssT0FBTztnQkFDVixPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM1QztnQkFDRSxJQUFJ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SUFBSSxDQUFDLENBQUM7b0JBQ3RDLE1BQU0sQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDL0QsT0FBTyxZQUFZLEdBQUcsZUFBZSxDQUFDO1lBRXhDLEtBQUssT0FBTztnQkFDViwrQ0FBK0M7Z0JBQy9DLE9BQU8sWUFBWSxDQUFDO1lBRXRCO2dCQUNFLE9BQU8sWUFBWSxDQUFDO1FBQ3hCLENBQUM7SUFDSCxDQUFDO0NBQ0YsQ0FBQTtBQXpVWSx3QkFBd0I7SUFEcEMsVUFBVSxFQUFFO0dBQ0Esd0JBQXdCLENBeVVwQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIExvZ2dlciB9IGZyb20gJ0BuZXN0anMvY29tbW9uJztcclxuaW1wb3J0IHsgQ29uZmlndXJhdGlvblNvdXJjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvY29uZmlndXJhdGlvbi1zb3VyY2UuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgUHJlY2VkZW5jZVJ1bGUgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2ludGVncmF0aW9uLW9wdGlvbnMuaW50ZXJmYWNlJztcclxuXHJcbi8qKlxyXG4gKiBTZXJ2aWNlIHJlc3BvbnNpYmxlIGZvciBoYW5kbGluZyBjb25maWd1cmF0aW9uIHByZWNlZGVuY2UgcnVsZXMgYW5kIG1lcmdpbmcgc3RyYXRlZ2llcy5cclxuICovXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFByZWNlZGVuY2VIYW5kbGVyU2VydmljZSB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBuZXcgTG9nZ2VyKFByZWNlZGVuY2VIYW5kbGVyU2VydmljZS5uYW1lKTtcclxuXHJcbiAgLyoqXHJcbiAgICogQXBwbHkgcHJlY2VkZW5jZSBydWxlcyB0byBtZXJnZSBjb25maWd1cmF0aW9uIGZyb20gbXVsdGlwbGUgc291cmNlcy5cclxuICAgKiBAcGFyYW0gc291cmNlcyAtIEFycmF5IG9mIGNvbmZpZ3VyYXRpb24gc291cmNlc1xyXG4gICAqIEBwYXJhbSBwcmVjZWRlbmNlUnVsZSAtIFRoZSBwcmVjZWRlbmNlIHJ1bGUgdG8gYXBwbHlcclxuICAgKiBAcmV0dXJucyBNZXJnZWQgY29uZmlndXJhdGlvbiBkYXRhXHJcbiAgICovXHJcbiAgYXBwbHlQcmVjZWRlbmNlUnVsZXMoXHJcbiAgICBzb3VyY2VzOiBDb25maWd1cmF0aW9uU291cmNlW10sXHJcbiAgICBwcmVjZWRlbmNlUnVsZTogUHJlY2VkZW5jZVJ1bGVcclxuICApOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcclxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBBcHBseWluZyBwcmVjZWRlbmNlIHJ1bGU6ICR7cHJlY2VkZW5jZVJ1bGV9IHRvICR7c291cmNlcy5sZW5ndGh9IHNvdXJjZXNgKTtcclxuXHJcbiAgICBpZiAoc291cmNlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIHt9O1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzb3VyY2VzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICByZXR1cm4gc291cmNlc1swXT8uZGF0YSB8fCB7fTtcclxuICAgIH1cclxuXHJcbiAgICBzd2l0Y2ggKHByZWNlZGVuY2VSdWxlKSB7XHJcbiAgICAgIGNhc2UgJ2F3cy1maXJzdCc6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHlBd3NGaXJzdFByZWNlZGVuY2Uoc291cmNlcyk7XHJcbiAgICAgIGNhc2UgJ2xvY2FsLWZpcnN0JzpcclxuICAgICAgICByZXR1cm4gdGhpcy5hcHBseUxvY2FsRmlyc3RQcmVjZWRlbmNlKHNvdXJjZXMpO1xyXG4gICAgICBjYXNlICdtZXJnZSc6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHlNZXJnZVByZWNlZGVuY2Uoc291cmNlcyk7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihgVW5rbm93biBwcmVjZWRlbmNlIHJ1bGU6ICR7cHJlY2VkZW5jZVJ1bGV9LCBkZWZhdWx0aW5nIHRvICdhd3MtZmlyc3QnYCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHlBd3NGaXJzdFByZWNlZGVuY2Uoc291cmNlcyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBcHBseSBBV1MtZmlyc3QgcHJlY2VkZW5jZTogQVdTIHNvdXJjZXMgb3ZlcnJpZGUgbG9jYWwgc291cmNlcy5cclxuICAgKiBQcmlvcml0eSBvcmRlcjogQVdTIFNlY3JldHMgTWFuYWdlciA+IFNTTSBQYXJhbWV0ZXIgU3RvcmUgPiBFbnZpcm9ubWVudCA+IExvY2FsIEZpbGVzXHJcbiAgICogQHBhcmFtIHNvdXJjZXMgLSBDb25maWd1cmF0aW9uIHNvdXJjZXNcclxuICAgKiBAcmV0dXJucyBNZXJnZWQgY29uZmlndXJhdGlvblxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXBwbHlBd3NGaXJzdFByZWNlZGVuY2Uoc291cmNlczogQ29uZmlndXJhdGlvblNvdXJjZVtdKTogUmVjb3JkPHN0cmluZywgYW55PiB7XHJcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnQXBwbHlpbmcgQVdTLWZpcnN0IHByZWNlZGVuY2UnKTtcclxuICAgIFxyXG4gICAgY29uc3Qgc29ydGVkU291cmNlcyA9IHRoaXMuc29ydFNvdXJjZXNCeUF3c0ZpcnN0UHJpb3JpdHkoc291cmNlcyk7XHJcbiAgICByZXR1cm4gdGhpcy5tZXJnZVNvdXJjZXNJbk9yZGVyKHNvcnRlZFNvdXJjZXMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXBwbHkgbG9jYWwtZmlyc3QgcHJlY2VkZW5jZTogTG9jYWwgc291cmNlcyBvdmVycmlkZSBBV1Mgc291cmNlcy5cclxuICAgKiBQcmlvcml0eSBvcmRlcjogTG9jYWwgRmlsZXMgPiBFbnZpcm9ubWVudCA+IFNTTSBQYXJhbWV0ZXIgU3RvcmUgPiBBV1MgU2VjcmV0cyBNYW5hZ2VyXHJcbiAgICogQHBhcmFtIHNvdXJjZXMgLSBDb25maWd1cmF0aW9uIHNvdXJjZXNcclxuICAgKiBAcmV0dXJucyBNZXJnZWQgY29uZmlndXJhdGlvblxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXBwbHlMb2NhbEZpcnN0UHJlY2VkZW5jZShzb3VyY2VzOiBDb25maWd1cmF0aW9uU291cmNlW10pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcclxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdBcHBseWluZyBsb2NhbC1maXJzdCBwcmVjZWRlbmNlJyk7XHJcbiAgICBcclxuICAgIGNvbnN0IHNvcnRlZFNvdXJjZXMgPSB0aGlzLnNvcnRTb3VyY2VzQnlMb2NhbEZpcnN0UHJpb3JpdHkoc291cmNlcyk7XHJcbiAgICByZXR1cm4gdGhpcy5tZXJnZVNvdXJjZXNJbk9yZGVyKHNvcnRlZFNvdXJjZXMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXBwbHkgbWVyZ2UgcHJlY2VkZW5jZTogSW50ZWxsaWdlbnQgbWVyZ2luZyBiYXNlZCBvbiBzb3VyY2UgdHlwZSBhbmQgcHJpb3JpdHkuXHJcbiAgICogVXNlcyBhIGJhbGFuY2VkIGFwcHJvYWNoIHdoZXJlIGJvdGggQVdTIGFuZCBsb2NhbCBzb3VyY2VzIGNvbnRyaWJ1dGUuXHJcbiAgICogQHBhcmFtIHNvdXJjZXMgLSBDb25maWd1cmF0aW9uIHNvdXJjZXNcclxuICAgKiBAcmV0dXJucyBNZXJnZWQgY29uZmlndXJhdGlvblxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXBwbHlNZXJnZVByZWNlZGVuY2Uoc291cmNlczogQ29uZmlndXJhdGlvblNvdXJjZVtdKTogUmVjb3JkPHN0cmluZywgYW55PiB7XHJcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnQXBwbHlpbmcgbWVyZ2UgcHJlY2VkZW5jZScpO1xyXG4gICAgXHJcbiAgICAvLyBHcm91cCBzb3VyY2VzIGJ5IHR5cGVcclxuICAgIGNvbnN0IHNvdXJjZUdyb3VwcyA9IHRoaXMuZ3JvdXBTb3VyY2VzQnlUeXBlKHNvdXJjZXMpO1xyXG4gICAgXHJcbiAgICAvLyBNZXJnZSB3aXRoaW4gZWFjaCBncm91cCBmaXJzdFxyXG4gICAgY29uc3QgbWVyZ2VkR3JvdXBzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XHJcbiAgICBcclxuICAgIGZvciAoY29uc3QgW3R5cGUsIHR5cGVTb3VyY2VzXSBvZiBPYmplY3QuZW50cmllcyhzb3VyY2VHcm91cHMpKSB7XHJcbiAgICAgIGlmICh0eXBlU291cmNlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgbWVyZ2VkR3JvdXBzW3R5cGVdID0gdGhpcy5tZXJnZVNvdXJjZXNJbk9yZGVyKHR5cGVTb3VyY2VzKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFRoZW4gbWVyZ2UgYWNyb3NzIGdyb3VwcyB3aXRoIGJhbGFuY2VkIHByaW9yaXR5XHJcbiAgICByZXR1cm4gdGhpcy5tZXJnZUdyb3Vwc1dpdGhCYWxhbmNlZFByaW9yaXR5KG1lcmdlZEdyb3Vwcyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTb3J0IHNvdXJjZXMgYnkgQVdTLWZpcnN0IHByaW9yaXR5LlxyXG4gICAqIEBwYXJhbSBzb3VyY2VzIC0gQ29uZmlndXJhdGlvbiBzb3VyY2VzXHJcbiAgICogQHJldHVybnMgU29ydGVkIHNvdXJjZXMgKGxvd2VzdCBwcmlvcml0eSBmaXJzdCwgaGlnaGVzdCBwcmlvcml0eSBsYXN0KVxyXG4gICAqL1xyXG4gIHByaXZhdGUgc29ydFNvdXJjZXNCeUF3c0ZpcnN0UHJpb3JpdHkoc291cmNlczogQ29uZmlndXJhdGlvblNvdXJjZVtdKTogQ29uZmlndXJhdGlvblNvdXJjZVtdIHtcclxuICAgIGNvbnN0IHByaW9yaXR5TWFwOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge1xyXG4gICAgICAnbG9jYWwtZmlsZSc6IDEsXHJcbiAgICAgICdlbnZpcm9ubWVudCc6IDIsXHJcbiAgICAgICdzc20nOiAzLFxyXG4gICAgICAnc2VjcmV0cy1tYW5hZ2VyJzogNFxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gWy4uLnNvdXJjZXNdLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgY29uc3QgcHJpb3JpdHlBID0gcHJpb3JpdHlNYXBbYS50eXBlXSB8fCAwO1xyXG4gICAgICBjb25zdCBwcmlvcml0eUIgPSBwcmlvcml0eU1hcFtiLnR5cGVdIHx8IDA7XHJcbiAgICAgIFxyXG4gICAgICBpZiAocHJpb3JpdHlBICE9PSBwcmlvcml0eUIpIHtcclxuICAgICAgICByZXR1cm4gcHJpb3JpdHlBIC0gcHJpb3JpdHlCO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICAvLyBJZiBzYW1lIHR5cGUsIHNvcnQgYnkgZXhwbGljaXQgcHJpb3JpdHlcclxuICAgICAgcmV0dXJuIGEucHJpb3JpdHkgLSBiLnByaW9yaXR5O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTb3J0IHNvdXJjZXMgYnkgbG9jYWwtZmlyc3QgcHJpb3JpdHkuXHJcbiAgICogQHBhcmFtIHNvdXJjZXMgLSBDb25maWd1cmF0aW9uIHNvdXJjZXNcclxuICAgKiBAcmV0dXJucyBTb3J0ZWQgc291cmNlcyAobG93ZXN0IHByaW9yaXR5IGZpcnN0LCBoaWdoZXN0IHByaW9yaXR5IGxhc3QpXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzb3J0U291cmNlc0J5TG9jYWxGaXJzdFByaW9yaXR5KHNvdXJjZXM6IENvbmZpZ3VyYXRpb25Tb3VyY2VbXSk6IENvbmZpZ3VyYXRpb25Tb3VyY2VbXSB7XHJcbiAgICBjb25zdCBwcmlvcml0eU1hcDogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHtcclxuICAgICAgJ3NlY3JldHMtbWFuYWdlcic6IDEsXHJcbiAgICAgICdzc20nOiAyLFxyXG4gICAgICAnZW52aXJvbm1lbnQnOiAzLFxyXG4gICAgICAnbG9jYWwtZmlsZSc6IDRcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIFsuLi5zb3VyY2VzXS5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgIGNvbnN0IHByaW9yaXR5QSA9IHByaW9yaXR5TWFwW2EudHlwZV0gfHwgMDtcclxuICAgICAgY29uc3QgcHJpb3JpdHlCID0gcHJpb3JpdHlNYXBbYi50eXBlXSB8fCAwO1xyXG4gICAgICBcclxuICAgICAgaWYgKHByaW9yaXR5QSAhPT0gcHJpb3JpdHlCKSB7XHJcbiAgICAgICAgcmV0dXJuIHByaW9yaXR5QSAtIHByaW9yaXR5QjtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgLy8gSWYgc2FtZSB0eXBlLCBzb3J0IGJ5IGV4cGxpY2l0IHByaW9yaXR5XHJcbiAgICAgIHJldHVybiBhLnByaW9yaXR5IC0gYi5wcmlvcml0eTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR3JvdXAgc291cmNlcyBieSB0aGVpciB0eXBlLlxyXG4gICAqIEBwYXJhbSBzb3VyY2VzIC0gQ29uZmlndXJhdGlvbiBzb3VyY2VzXHJcbiAgICogQHJldHVybnMgU291cmNlcyBncm91cGVkIGJ5IHR5cGVcclxuICAgKi9cclxuICBwcml2YXRlIGdyb3VwU291cmNlc0J5VHlwZShzb3VyY2VzOiBDb25maWd1cmF0aW9uU291cmNlW10pOiBSZWNvcmQ8c3RyaW5nLCBDb25maWd1cmF0aW9uU291cmNlW10+IHtcclxuICAgIGNvbnN0IGdyb3VwczogUmVjb3JkPHN0cmluZywgQ29uZmlndXJhdGlvblNvdXJjZVtdPiA9IHt9O1xyXG4gICAgXHJcbiAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XHJcbiAgICAgIGlmICghZ3JvdXBzW3NvdXJjZS50eXBlXSkge1xyXG4gICAgICAgIGdyb3Vwc1tzb3VyY2UudHlwZV0gPSBbXTtcclxuICAgICAgfVxyXG4gICAgICBncm91cHNbc291cmNlLnR5cGVdPy5wdXNoKHNvdXJjZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gU29ydCB3aXRoaW4gZWFjaCBncm91cCBieSBwcmlvcml0eVxyXG4gICAgZm9yIChjb25zdCB0eXBlIGluIGdyb3Vwcykge1xyXG4gICAgICBncm91cHNbdHlwZV0/LnNvcnQoKGEsIGIpID0+IGEucHJpb3JpdHkgLSBiLnByaW9yaXR5KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZ3JvdXBzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWVyZ2Ugc291cmNlcyBpbiB0aGUgZ2l2ZW4gb3JkZXIgKGxhdGVyIHNvdXJjZXMgb3ZlcnJpZGUgZWFybGllciBvbmVzKS5cclxuICAgKiBAcGFyYW0gc291cmNlcyAtIE9yZGVyZWQgY29uZmlndXJhdGlvbiBzb3VyY2VzXHJcbiAgICogQHJldHVybnMgTWVyZ2VkIGNvbmZpZ3VyYXRpb25cclxuICAgKi9cclxuICBwcml2YXRlIG1lcmdlU291cmNlc0luT3JkZXIoc291cmNlczogQ29uZmlndXJhdGlvblNvdXJjZVtdKTogUmVjb3JkPHN0cmluZywgYW55PiB7XHJcbiAgICBsZXQgbWVyZ2VkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XHJcblxyXG4gICAgZm9yIChjb25zdCBzb3VyY2Ugb2Ygc291cmNlcykge1xyXG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgTWVyZ2luZyBzb3VyY2U6ICR7c291cmNlLm5hbWV9ICgke3NvdXJjZS50eXBlfSlgKTtcclxuICAgICAgbWVyZ2VkID0gdGhpcy5kZWVwTWVyZ2UobWVyZ2VkLCBzb3VyY2UuZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG1lcmdlZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1lcmdlIGdyb3VwcyB3aXRoIGJhbGFuY2VkIHByaW9yaXR5IGZvciBtZXJnZSBwcmVjZWRlbmNlLlxyXG4gICAqIEBwYXJhbSBncm91cHMgLSBDb25maWd1cmF0aW9uIGdyb3VwcyBieSB0eXBlXHJcbiAgICogQHJldHVybnMgTWVyZ2VkIGNvbmZpZ3VyYXRpb25cclxuICAgKi9cclxuICBwcml2YXRlIG1lcmdlR3JvdXBzV2l0aEJhbGFuY2VkUHJpb3JpdHkoZ3JvdXBzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUmVjb3JkPHN0cmluZywgYW55PiB7XHJcbiAgICBsZXQgbWVyZ2VkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XHJcblxyXG4gICAgLy8gTWVyZ2UgaW4gYmFsYW5jZWQgb3JkZXI6IGxvY2FsLWZpbGUgLT4gZW52aXJvbm1lbnQgLT4gc3NtIC0+IHNlY3JldHMtbWFuYWdlclxyXG4gICAgY29uc3QgbWVyZ2VPcmRlciA9IFsnbG9jYWwtZmlsZScsICdlbnZpcm9ubWVudCcsICdzc20nLCAnc2VjcmV0cy1tYW5hZ2VyJ107XHJcbiAgICBcclxuICAgIGZvciAoY29uc3QgdHlwZSBvZiBtZXJnZU9yZGVyKSB7XHJcbiAgICAgIGlmIChncm91cHNbdHlwZV0pIHtcclxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgTWVyZ2luZyBncm91cDogJHt0eXBlfWApO1xyXG4gICAgICAgIG1lcmdlZCA9IHRoaXMuZGVlcE1lcmdlKG1lcmdlZCwgZ3JvdXBzW3R5cGVdKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBtZXJnZWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWVwIG1lcmdlIHR3byBjb25maWd1cmF0aW9uIG9iamVjdHMgd2l0aCBjb25mbGljdCByZXNvbHV0aW9uLlxyXG4gICAqIEBwYXJhbSB0YXJnZXQgLSBUYXJnZXQgb2JqZWN0IChsb3dlciBwcmlvcml0eSlcclxuICAgKiBAcGFyYW0gc291cmNlIC0gU291cmNlIG9iamVjdCAoaGlnaGVyIHByaW9yaXR5KVxyXG4gICAqIEByZXR1cm5zIE1lcmdlZCBvYmplY3RcclxuICAgKi9cclxuICBwcml2YXRlIGRlZXBNZXJnZSh0YXJnZXQ6IFJlY29yZDxzdHJpbmcsIGFueT4sIHNvdXJjZTogUmVjb3JkPHN0cmluZywgYW55Pik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xyXG4gICAgY29uc3QgcmVzdWx0ID0geyAuLi50YXJnZXQgfTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzb3VyY2UpKSB7XHJcbiAgICAgIGlmICh0aGlzLnNob3VsZERlZXBNZXJnZShyZXN1bHRba2V5XSwgdmFsdWUpKSB7XHJcbiAgICAgICAgcmVzdWx0W2tleV0gPSB0aGlzLmRlZXBNZXJnZShyZXN1bHRba2V5XSwgdmFsdWUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc3VsdFtrZXldID0gdGhpcy5jbG9uZVZhbHVlKHZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZXRlcm1pbmUgaWYgdHdvIHZhbHVlcyBzaG91bGQgYmUgZGVlcCBtZXJnZWQuXHJcbiAgICogQHBhcmFtIHRhcmdldCAtIFRhcmdldCB2YWx1ZVxyXG4gICAqIEBwYXJhbSBzb3VyY2UgLSBTb3VyY2UgdmFsdWVcclxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHNob3VsZCBkZWVwIG1lcmdlLCBmYWxzZSBvdGhlcndpc2VcclxuICAgKi9cclxuICBwcml2YXRlIHNob3VsZERlZXBNZXJnZSh0YXJnZXQ6IGFueSwgc291cmNlOiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0YXJnZXQgIT09IG51bGwgJiZcclxuICAgICAgICAgICBzb3VyY2UgIT09IG51bGwgJiZcclxuICAgICAgICAgICB0eXBlb2YgdGFyZ2V0ID09PSAnb2JqZWN0JyAmJlxyXG4gICAgICAgICAgIHR5cGVvZiBzb3VyY2UgPT09ICdvYmplY3QnICYmXHJcbiAgICAgICAgICAgIUFycmF5LmlzQXJyYXkodGFyZ2V0KSAmJlxyXG4gICAgICAgICAgICFBcnJheS5pc0FycmF5KHNvdXJjZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbG9uZSBhIHZhbHVlIHRvIGF2b2lkIHJlZmVyZW5jZSBpc3N1ZXMuXHJcbiAgICogQHBhcmFtIHZhbHVlIC0gVmFsdWUgdG8gY2xvbmVcclxuICAgKiBAcmV0dXJucyBDbG9uZWQgdmFsdWVcclxuICAgKi9cclxuICBwcml2YXRlIGNsb25lVmFsdWUodmFsdWU6IGFueSk6IGFueSB7XHJcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0Jykge1xyXG4gICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XHJcbiAgICAgIHJldHVybiB2YWx1ZS5tYXAoaXRlbSA9PiB0aGlzLmNsb25lVmFsdWUoaXRlbSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNsb25lZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xyXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xyXG4gICAgICBjbG9uZWRba2V5XSA9IHRoaXMuY2xvbmVWYWx1ZSh2YWwpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjbG9uZWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBWYWxpZGF0ZSBjb25maWd1cmF0aW9uIHNvdXJjZXMgZm9yIHByZWNlZGVuY2UgaGFuZGxpbmcuXHJcbiAgICogQHBhcmFtIHNvdXJjZXMgLSBDb25maWd1cmF0aW9uIHNvdXJjZXMgdG8gdmFsaWRhdGVcclxuICAgKiBAcmV0dXJucyBWYWxpZGF0aW9uIHJlc3VsdCB3aXRoIGFueSBpc3N1ZXMgZm91bmRcclxuICAgKi9cclxuICB2YWxpZGF0ZVNvdXJjZXMoc291cmNlczogQ29uZmlndXJhdGlvblNvdXJjZVtdKTogeyB2YWxpZDogYm9vbGVhbjsgaXNzdWVzOiBzdHJpbmdbXSB9IHtcclxuICAgIGNvbnN0IGlzc3Vlczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc291cmNlcykpIHtcclxuICAgICAgaXNzdWVzLnB1c2goJ1NvdXJjZXMgbXVzdCBiZSBhbiBhcnJheScpO1xyXG4gICAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGlzc3VlcyB9O1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VzW2ldO1xyXG4gICAgICBcclxuICAgICAgaWYgKCFzb3VyY2UpIHtcclxuICAgICAgICBpc3N1ZXMucHVzaChgU291cmNlIGF0IGluZGV4ICR7aX0gaXMgbnVsbCBvciB1bmRlZmluZWRgKTtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgaWYgKCFzb3VyY2UubmFtZSB8fCB0eXBlb2Ygc291cmNlLm5hbWUgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgaXNzdWVzLnB1c2goYFNvdXJjZSBhdCBpbmRleCAke2l9IG11c3QgaGF2ZSBhIHZhbGlkIG5hbWVgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFzb3VyY2UudHlwZSB8fCAhWydlbnZpcm9ubWVudCcsICdzZWNyZXRzLW1hbmFnZXInLCAnc3NtJywgJ2xvY2FsLWZpbGUnXS5pbmNsdWRlcyhzb3VyY2UudHlwZSkpIHtcclxuICAgICAgICBpc3N1ZXMucHVzaChgU291cmNlIGF0IGluZGV4ICR7aX0gbXVzdCBoYXZlIGEgdmFsaWQgdHlwZWApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodHlwZW9mIHNvdXJjZS5wcmlvcml0eSAhPT0gJ251bWJlcicpIHtcclxuICAgICAgICBpc3N1ZXMucHVzaChgU291cmNlIGF0IGluZGV4ICR7aX0gbXVzdCBoYXZlIGEgbnVtZXJpYyBwcmlvcml0eWApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIXNvdXJjZS5kYXRhIHx8IHR5cGVvZiBzb3VyY2UuZGF0YSAhPT0gJ29iamVjdCcpIHtcclxuICAgICAgICBpc3N1ZXMucHVzaChgU291cmNlIGF0IGluZGV4ICR7aX0gbXVzdCBoYXZlIHZhbGlkIGRhdGEgb2JqZWN0YCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghc291cmNlLmxvYWRlZEF0IHx8ICEoc291cmNlLmxvYWRlZEF0IGluc3RhbmNlb2YgRGF0ZSkpIHtcclxuICAgICAgICBpc3N1ZXMucHVzaChgU291cmNlIGF0IGluZGV4ICR7aX0gbXVzdCBoYXZlIGEgdmFsaWQgbG9hZGVkQXQgZGF0ZWApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHsgdmFsaWQ6IGlzc3Vlcy5sZW5ndGggPT09IDAsIGlzc3VlcyB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBlZmZlY3RpdmUgcHJpb3JpdHkgZm9yIGEgc291cmNlIGJhc2VkIG9uIHByZWNlZGVuY2UgcnVsZS5cclxuICAgKiBAcGFyYW0gc291cmNlIC0gQ29uZmlndXJhdGlvbiBzb3VyY2VcclxuICAgKiBAcGFyYW0gcHJlY2VkZW5jZVJ1bGUgLSBQcmVjZWRlbmNlIHJ1bGVcclxuICAgKiBAcmV0dXJucyBFZmZlY3RpdmUgcHJpb3JpdHlcclxuICAgKi9cclxuICBnZXRFZmZlY3RpdmVQcmlvcml0eShzb3VyY2U6IENvbmZpZ3VyYXRpb25Tb3VyY2UsIHByZWNlZGVuY2VSdWxlOiBQcmVjZWRlbmNlUnVsZSk6IG51bWJlciB7XHJcbiAgICBjb25zdCBiYXNlUHJpb3JpdHkgPSBzb3VyY2UucHJpb3JpdHk7XHJcbiAgICBcclxuICAgIHN3aXRjaCAocHJlY2VkZW5jZVJ1bGUpIHtcclxuICAgICAgY2FzZSAnYXdzLWZpcnN0JzpcclxuICAgICAgICBjb25zdCBhd3NGaXJzdEJvbnVzID0gc291cmNlLnR5cGUgPT09ICdzZWNyZXRzLW1hbmFnZXInID8gMTAwMCA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLnR5cGUgPT09ICdzc20nID8gNTAwIDogMDtcclxuICAgICAgICByZXR1cm4gYmFzZVByaW9yaXR5ICsgYXdzRmlyc3RCb251cztcclxuICAgICAgICBcclxuICAgICAgY2FzZSAnbG9jYWwtZmlyc3QnOlxyXG4gICAgICAgIGNvbnN0IGxvY2FsRmlyc3RCb251cyA9IHNvdXJjZS50eXBlID09PSAnbG9jYWwtZmlsZScgPyAxMDAwIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS50eXBlID09PSAnZW52aXJvbm1lbnQnID8gNTAwIDogMDtcclxuICAgICAgICByZXR1cm4gYmFzZVByaW9yaXR5ICsgbG9jYWxGaXJzdEJvbnVzO1xyXG4gICAgICAgIFxyXG4gICAgICBjYXNlICdtZXJnZSc6XHJcbiAgICAgICAgLy8gSW4gbWVyZ2UgbW9kZSwgYWxsIHNvdXJjZXMgaGF2ZSBlcXVhbCB3ZWlnaHRcclxuICAgICAgICByZXR1cm4gYmFzZVByaW9yaXR5O1xyXG4gICAgICAgIFxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBiYXNlUHJpb3JpdHk7XHJcbiAgICB9XHJcbiAgfVxyXG59Il19