@decaf-ts/for-fabric 0.5.7 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (826) hide show
  1. package/dist/for-fabric.cjs +2 -3797
  2. package/dist/for-fabric.cjs.map +1 -0
  3. package/dist/for-fabric.js +2 -3901
  4. package/dist/for-fabric.js.map +1 -0
  5. package/lib/cjs/bin/cli.cjs +9 -0
  6. package/lib/cjs/bin/cli.js.map +1 -0
  7. package/lib/cjs/cli-module.cjs +479 -0
  8. package/lib/cjs/cli-module.js.map +1 -0
  9. package/lib/cjs/cli-utils.cjs +309 -0
  10. package/lib/cjs/cli-utils.js.map +1 -0
  11. package/lib/cjs/client/FabricClientAdapter.cjs +1362 -0
  12. package/lib/cjs/client/FabricClientAdapter.js.map +1 -0
  13. package/lib/cjs/client/FabricClientDispatch.cjs +290 -0
  14. package/lib/cjs/client/FabricClientDispatch.js.map +1 -0
  15. package/lib/cjs/client/FabricClientPaginator.cjs +21 -0
  16. package/lib/cjs/client/FabricClientPaginator.js.map +1 -0
  17. package/lib/cjs/client/FabricClientRepository.cjs +259 -0
  18. package/lib/cjs/client/FabricClientRepository.js.map +1 -0
  19. package/lib/cjs/client/FabricClientStatement.cjs +451 -0
  20. package/lib/cjs/client/FabricClientStatement.js.map +1 -0
  21. package/lib/cjs/client/collections/generation.cjs +113 -0
  22. package/lib/cjs/client/collections/generation.js.map +1 -0
  23. package/lib/{client/indexes → cjs/client/collections}/index.cjs +1 -1
  24. package/lib/cjs/client/collections/index.js.map +1 -0
  25. package/lib/cjs/client/constants.cjs +16 -0
  26. package/lib/cjs/client/constants.js.map +1 -0
  27. package/lib/cjs/client/crypto.cjs +368 -0
  28. package/lib/cjs/client/crypto.js.map +1 -0
  29. package/lib/{esm/client/erc20/FabricERC20ClientRepository.d.ts → cjs/client/erc20/FabricERC20ClientRepository.cjs} +139 -30
  30. package/lib/cjs/client/erc20/FabricERC20ClientRepository.js.map +1 -0
  31. package/lib/{client → cjs/client}/erc20/index.cjs +1 -1
  32. package/lib/cjs/client/erc20/index.js.map +1 -0
  33. package/lib/cjs/client/fabric-fs.cjs +234 -0
  34. package/lib/cjs/client/fabric-fs.js.map +1 -0
  35. package/lib/cjs/client/fabric-hsm.cjs +165 -0
  36. package/lib/cjs/client/fabric-hsm.js.map +1 -0
  37. package/lib/cjs/client/ids/id-extraction.cjs +30 -0
  38. package/lib/cjs/client/ids/id-extraction.js.map +1 -0
  39. package/lib/{client → cjs/client}/ids/index.cjs +1 -1
  40. package/lib/cjs/client/ids/index.js.map +1 -0
  41. package/lib/{client → cjs/client}/index.cjs +1 -1
  42. package/lib/cjs/client/index.js.map +1 -0
  43. package/lib/cjs/client/indexes/generation.cjs +95 -0
  44. package/lib/cjs/client/indexes/generation.js.map +1 -0
  45. package/lib/{client/collections → cjs/client/indexes}/index.cjs +1 -1
  46. package/lib/cjs/client/indexes/index.js.map +1 -0
  47. package/lib/{esm/client/logging.d.ts → cjs/client/logging.cjs} +51 -9
  48. package/lib/cjs/client/logging.js.map +1 -0
  49. package/lib/cjs/client/services/FabricEnrollmentService.cjs +363 -0
  50. package/lib/cjs/client/services/FabricEnrollmentService.js.map +1 -0
  51. package/lib/cjs/client/services/FabricIdentityService.cjs +324 -0
  52. package/lib/cjs/client/services/FabricIdentityService.js.map +1 -0
  53. package/lib/cjs/client/services/RegistrationRequestBuilder.cjs +91 -0
  54. package/lib/cjs/client/services/RegistrationRequestBuilder.js.map +1 -0
  55. package/lib/{esm/client/services/constants.d.ts → cjs/client/services/constants.cjs} +10 -5
  56. package/lib/cjs/client/services/constants.js.map +1 -0
  57. package/lib/cjs/client/services/index.cjs +21 -0
  58. package/lib/cjs/client/services/index.js.map +1 -0
  59. package/lib/cjs/client/types.cjs +3 -0
  60. package/lib/cjs/client/types.js.map +1 -0
  61. package/lib/cjs/client/utils.cjs +262 -0
  62. package/lib/cjs/client/utils.js.map +1 -0
  63. package/lib/{contract → cjs/contract}/Address.cjs +1 -1
  64. package/lib/cjs/contract/Address.js.map +1 -0
  65. package/lib/{contract → cjs/contract}/AddressContract.cjs +1 -1
  66. package/lib/cjs/contract/AddressContract.js.map +1 -0
  67. package/lib/{contract → cjs/contract}/AuditContract.cjs +1 -1
  68. package/lib/cjs/contract/AuditContract.js.map +1 -0
  69. package/lib/{contract → cjs/contract}/BatchContract.cjs +1 -1
  70. package/lib/cjs/contract/BatchContract.js.map +1 -0
  71. package/lib/{contract → cjs/contract}/MarketContract.cjs +1 -1
  72. package/lib/cjs/contract/MarketContract.js.map +1 -0
  73. package/lib/{contract → cjs/contract}/OtherAuditContract.cjs +1 -1
  74. package/lib/cjs/contract/OtherAuditContract.js.map +1 -0
  75. package/lib/{contract → cjs/contract}/OtherBatchContract.cjs +1 -1
  76. package/lib/cjs/contract/OtherBatchContract.js.map +1 -0
  77. package/lib/{contract → cjs/contract}/OtherMarketContract.cjs +1 -1
  78. package/lib/cjs/contract/OtherMarketContract.js.map +1 -0
  79. package/lib/{contract → cjs/contract}/OtherProductContract.cjs +1 -1
  80. package/lib/cjs/contract/OtherProductContract.js.map +1 -0
  81. package/lib/{contract → cjs/contract}/OtherProductImageContract.cjs +1 -1
  82. package/lib/cjs/contract/OtherProductImageContract.js.map +1 -0
  83. package/lib/{contract → cjs/contract}/OtherProductSharedContract.cjs +1 -1
  84. package/lib/cjs/contract/OtherProductSharedContract.js.map +1 -0
  85. package/lib/{contract → cjs/contract}/OtherProductStrengthContract.cjs +1 -1
  86. package/lib/cjs/contract/OtherProductStrengthContract.js.map +1 -0
  87. package/lib/{contract → cjs/contract}/Product.cjs +1 -1
  88. package/lib/cjs/contract/Product.js.map +1 -0
  89. package/lib/{contract → cjs/contract}/ProductContract.cjs +1 -1
  90. package/lib/cjs/contract/ProductContract.js.map +1 -0
  91. package/lib/{contract → cjs/contract}/ProductStrengthContract.cjs +1 -1
  92. package/lib/cjs/contract/ProductStrengthContract.js.map +1 -0
  93. package/lib/{contract → cjs/contract}/SegregatedPrivateDocumentContract.cjs +1 -1
  94. package/lib/cjs/contract/SegregatedPrivateDocumentContract.js.map +1 -0
  95. package/lib/{contract → cjs/contract}/SegregatedSharedDocumentContract.cjs +1 -1
  96. package/lib/cjs/contract/SegregatedSharedDocumentContract.js.map +1 -0
  97. package/lib/{contract → cjs/contract}/User.cjs +1 -1
  98. package/lib/cjs/contract/User.js.map +1 -0
  99. package/lib/{contract → cjs/contract}/UserContract.cjs +1 -1
  100. package/lib/cjs/contract/UserContract.js.map +1 -0
  101. package/lib/cjs/contract/index.cjs +36 -0
  102. package/lib/cjs/contract/index.js.map +1 -0
  103. package/lib/cjs/contract/logging-context.cjs +77 -0
  104. package/lib/cjs/contract/logging-context.js.map +1 -0
  105. package/lib/cjs/contract/models/Audit.cjs +106 -0
  106. package/lib/cjs/contract/models/Audit.js.map +1 -0
  107. package/lib/{contract → cjs/contract}/models/BaseIdentifiedModel.cjs +1 -1
  108. package/lib/cjs/contract/models/BaseIdentifiedModel.js.map +1 -0
  109. package/lib/{contract → cjs/contract}/models/BaseModel.cjs +1 -1
  110. package/lib/cjs/contract/models/BaseModel.js.map +1 -0
  111. package/lib/cjs/contract/models/Batch.cjs +174 -0
  112. package/lib/cjs/contract/models/Batch.js.map +1 -0
  113. package/lib/cjs/contract/models/GtinOwner.cjs +59 -0
  114. package/lib/cjs/contract/models/GtinOwner.js.map +1 -0
  115. package/lib/cjs/contract/models/History.cjs +75 -0
  116. package/lib/cjs/contract/models/History.js.map +1 -0
  117. package/lib/cjs/contract/models/Leaflet.cjs +95 -0
  118. package/lib/cjs/contract/models/Leaflet.js.map +1 -0
  119. package/lib/cjs/contract/models/LeafletFile.cjs +58 -0
  120. package/lib/cjs/contract/models/LeafletFile.js.map +1 -0
  121. package/lib/cjs/contract/models/Market.cjs +75 -0
  122. package/lib/cjs/contract/models/Market.js.map +1 -0
  123. package/lib/cjs/contract/models/OtherAudit.cjs +118 -0
  124. package/lib/cjs/contract/models/OtherAudit.js.map +1 -0
  125. package/lib/cjs/contract/models/OtherBatchShared.cjs +127 -0
  126. package/lib/cjs/contract/models/OtherBatchShared.js.map +1 -0
  127. package/lib/cjs/contract/models/OtherLeaflet.cjs +115 -0
  128. package/lib/cjs/contract/models/OtherLeaflet.js.map +1 -0
  129. package/lib/cjs/contract/models/OtherLeafletFile.cjs +65 -0
  130. package/lib/cjs/contract/models/OtherLeafletFile.js.map +1 -0
  131. package/lib/cjs/contract/models/OtherMarket.cjs +84 -0
  132. package/lib/cjs/contract/models/OtherMarket.js.map +1 -0
  133. package/lib/cjs/contract/models/OtherProduct.cjs +77 -0
  134. package/lib/cjs/contract/models/OtherProduct.js.map +1 -0
  135. package/lib/cjs/contract/models/OtherProductImage.cjs +59 -0
  136. package/lib/cjs/contract/models/OtherProductImage.js.map +1 -0
  137. package/lib/cjs/contract/models/OtherProductShared.cjs +99 -0
  138. package/lib/cjs/contract/models/OtherProductShared.js.map +1 -0
  139. package/lib/cjs/contract/models/OtherProductStrength.cjs +87 -0
  140. package/lib/cjs/contract/models/OtherProductStrength.js.map +1 -0
  141. package/lib/cjs/contract/models/Product.cjs +78 -0
  142. package/lib/cjs/contract/models/Product.js.map +1 -0
  143. package/lib/cjs/contract/models/ProductStrength.cjs +78 -0
  144. package/lib/cjs/contract/models/ProductStrength.js.map +1 -0
  145. package/lib/{contract → cjs/contract}/models/SegregatedDocument.cjs +1 -1
  146. package/lib/cjs/contract/models/SegregatedDocument.js.map +1 -0
  147. package/lib/cjs/contract/models/constants.cjs +30 -0
  148. package/lib/cjs/contract/models/constants.js.map +1 -0
  149. package/lib/cjs/contract/models/decorators-private.cjs +158 -0
  150. package/lib/cjs/contract/models/decorators-private.js.map +1 -0
  151. package/lib/cjs/contract/models/decorators.cjs +182 -0
  152. package/lib/cjs/contract/models/decorators.js.map +1 -0
  153. package/lib/cjs/contract/models/gtin.cjs +88 -0
  154. package/lib/cjs/contract/models/gtin.js.map +1 -0
  155. package/lib/cjs/contract/models/history-dec.cjs +83 -0
  156. package/lib/cjs/contract/models/history-dec.js.map +1 -0
  157. package/lib/cjs/contracts/ContractAdapter.cjs +1193 -0
  158. package/lib/cjs/contracts/ContractAdapter.js.map +1 -0
  159. package/lib/cjs/contracts/ContractContext.cjs +157 -0
  160. package/lib/cjs/contracts/ContractContext.js.map +1 -0
  161. package/lib/cjs/contracts/FabricContractDispatch.cjs +79 -0
  162. package/lib/cjs/contracts/FabricContractDispatch.js.map +1 -0
  163. package/lib/{esm/contracts/FabricContractPaginator.d.ts → cjs/contracts/FabricContractPaginator.cjs} +77 -9
  164. package/lib/cjs/contracts/FabricContractPaginator.js.map +1 -0
  165. package/lib/cjs/contracts/FabricContractRepository.cjs +322 -0
  166. package/lib/cjs/contracts/FabricContractRepository.js.map +1 -0
  167. package/lib/{esm/contracts/FabricContractRepositoryObservableHandler.d.ts → cjs/contracts/FabricContractRepositoryObservableHandler.cjs} +42 -8
  168. package/lib/cjs/contracts/FabricContractRepositoryObservableHandler.js.map +1 -0
  169. package/lib/cjs/contracts/FabricContractSequence.cjs +338 -0
  170. package/lib/cjs/contracts/FabricContractSequence.js.map +1 -0
  171. package/lib/cjs/contracts/FabricContractStatement.cjs +180 -0
  172. package/lib/cjs/contracts/FabricContractStatement.js.map +1 -0
  173. package/lib/cjs/contracts/MigrationContract.cjs +147 -0
  174. package/lib/cjs/contracts/MigrationContract.js.map +1 -0
  175. package/lib/{contracts → cjs/contracts}/PrivateSequence.cjs +1 -1
  176. package/lib/cjs/contracts/PrivateSequence.js.map +1 -0
  177. package/lib/cjs/contracts/auth/decorators.cjs +84 -0
  178. package/lib/cjs/contracts/auth/decorators.js.map +1 -0
  179. package/lib/{contracts → cjs/contracts}/auth/index.cjs +1 -1
  180. package/lib/cjs/contracts/auth/index.js.map +1 -0
  181. package/lib/cjs/contracts/crud/crud-contract.cjs +416 -0
  182. package/lib/cjs/contracts/crud/crud-contract.js.map +1 -0
  183. package/lib/{contracts → cjs/contracts}/crud/index.cjs +1 -1
  184. package/lib/cjs/contracts/crud/index.js.map +1 -0
  185. package/lib/cjs/contracts/crud/serialized-crud-contract.cjs +284 -0
  186. package/lib/cjs/contracts/crud/serialized-crud-contract.js.map +1 -0
  187. package/lib/cjs/contracts/erc20/erc20contract.cjs +581 -0
  188. package/lib/cjs/contracts/erc20/erc20contract.js.map +1 -0
  189. package/lib/cjs/contracts/erc20/index.cjs +21 -0
  190. package/lib/cjs/contracts/erc20/index.js.map +1 -0
  191. package/lib/cjs/contracts/erc20/models.cjs +209 -0
  192. package/lib/cjs/contracts/erc20/models.js.map +1 -0
  193. package/lib/{contracts → cjs/contracts}/index.cjs +1 -1
  194. package/lib/cjs/contracts/index.js.map +1 -0
  195. package/lib/cjs/contracts/logging.cjs +118 -0
  196. package/lib/cjs/contracts/logging.js.map +1 -0
  197. package/lib/cjs/contracts/overrides.cjs +8 -0
  198. package/lib/cjs/contracts/overrides.js.map +1 -0
  199. package/lib/cjs/contracts/types.cjs +3 -0
  200. package/lib/cjs/contracts/types.js.map +1 -0
  201. package/lib/cjs/contracts/uuid.cjs +75 -0
  202. package/lib/cjs/contracts/uuid.js.map +1 -0
  203. package/lib/{index.cjs → cjs/index.cjs} +1 -1
  204. package/lib/cjs/index.js.map +1 -0
  205. package/lib/{shared/ClientSerializer.d.ts → cjs/shared/ClientSerializer.cjs} +35 -6
  206. package/lib/cjs/shared/ClientSerializer.js.map +1 -0
  207. package/lib/cjs/shared/DeterministicSerializer.cjs +106 -0
  208. package/lib/cjs/shared/DeterministicSerializer.js.map +1 -0
  209. package/lib/cjs/shared/SimpleDeterministicSerializer.cjs +69 -0
  210. package/lib/cjs/shared/SimpleDeterministicSerializer.js.map +1 -0
  211. package/lib/{shared/constants.d.ts → cjs/shared/constants.cjs} +18 -12
  212. package/lib/cjs/shared/constants.js.map +1 -0
  213. package/lib/cjs/shared/decorators.cjs +595 -0
  214. package/lib/cjs/shared/decorators.js.map +1 -0
  215. package/lib/{shared/erc20/erc20-constants.d.ts → cjs/shared/erc20/erc20-constants.cjs} +9 -4
  216. package/lib/cjs/shared/erc20/erc20-constants.js.map +1 -0
  217. package/lib/{shared → cjs/shared}/erc20/index.cjs +1 -1
  218. package/lib/cjs/shared/erc20/index.js.map +1 -0
  219. package/lib/cjs/shared/errors.cjs +190 -0
  220. package/lib/cjs/shared/errors.js.map +1 -0
  221. package/lib/{shared/events.d.ts → cjs/shared/events.cjs} +21 -7
  222. package/lib/cjs/shared/events.js.map +1 -0
  223. package/lib/cjs/shared/fabric-types.cjs +3 -0
  224. package/lib/cjs/shared/fabric-types.js.map +1 -0
  225. package/lib/{shared → cjs/shared}/index.cjs +1 -1
  226. package/lib/cjs/shared/index.js.map +1 -0
  227. package/lib/cjs/shared/interfaces/Checkable.cjs +3 -0
  228. package/lib/cjs/shared/interfaces/Checkable.js.map +1 -0
  229. package/lib/{shared → cjs/shared}/interfaces/index.cjs +1 -1
  230. package/lib/cjs/shared/interfaces/index.js.map +1 -0
  231. package/lib/cjs/shared/math.cjs +66 -0
  232. package/lib/cjs/shared/math.js.map +1 -0
  233. package/lib/{shared → cjs/shared}/model/FabricBaseModel.cjs +1 -1
  234. package/lib/cjs/shared/model/FabricBaseModel.js.map +1 -0
  235. package/lib/{shared → cjs/shared}/model/FabricIdentifiedBaseModel.cjs +1 -1
  236. package/lib/cjs/shared/model/FabricIdentifiedBaseModel.js.map +1 -0
  237. package/lib/cjs/shared/model/Identity.cjs +71 -0
  238. package/lib/cjs/shared/model/Identity.js.map +1 -0
  239. package/lib/cjs/shared/model/IdentityCredentials.cjs +66 -0
  240. package/lib/cjs/shared/model/IdentityCredentials.js.map +1 -0
  241. package/lib/cjs/shared/model/index.cjs +21 -0
  242. package/lib/cjs/shared/model/index.js.map +1 -0
  243. package/lib/cjs/shared/overrides/Model.cjs +4 -0
  244. package/lib/cjs/shared/overrides/Model.js.map +1 -0
  245. package/lib/{shared → cjs/shared}/overrides/index.cjs +1 -1
  246. package/lib/cjs/shared/overrides/index.js.map +1 -0
  247. package/lib/cjs/shared/overrides/overrides.cjs +93 -0
  248. package/lib/cjs/shared/overrides/overrides.js.map +1 -0
  249. package/lib/cjs/shared/types.cjs +3 -0
  250. package/lib/cjs/shared/types.js.map +1 -0
  251. package/lib/cjs/version.cjs +8 -0
  252. package/lib/cjs/version.js.map +1 -0
  253. package/lib/esm/bin/cli.js +1 -1
  254. package/lib/esm/bin/cli.js.map +1 -0
  255. package/lib/esm/cli-module.js +1 -1
  256. package/lib/esm/cli-module.js.map +1 -0
  257. package/lib/esm/cli-utils.js +1 -1
  258. package/lib/esm/cli-utils.js.map +1 -0
  259. package/lib/esm/client/FabricClientAdapter.js +1 -1
  260. package/lib/esm/client/FabricClientAdapter.js.map +1 -0
  261. package/lib/esm/client/FabricClientDispatch.js +1 -1
  262. package/lib/esm/client/FabricClientDispatch.js.map +1 -0
  263. package/lib/esm/client/FabricClientPaginator.js +1 -1
  264. package/lib/esm/client/FabricClientPaginator.js.map +1 -0
  265. package/lib/esm/client/FabricClientRepository.js +1 -1
  266. package/lib/esm/client/FabricClientRepository.js.map +1 -0
  267. package/lib/esm/client/FabricClientStatement.js +1 -1
  268. package/lib/esm/client/FabricClientStatement.js.map +1 -0
  269. package/lib/esm/client/collections/generation.js +1 -1
  270. package/lib/esm/client/collections/generation.js.map +1 -0
  271. package/lib/esm/client/collections/index.js +1 -1
  272. package/lib/esm/client/collections/index.js.map +1 -0
  273. package/lib/esm/client/constants.js +1 -1
  274. package/lib/esm/client/constants.js.map +1 -0
  275. package/lib/esm/client/crypto.js +1 -1
  276. package/lib/esm/client/crypto.js.map +1 -0
  277. package/lib/esm/client/erc20/FabricERC20ClientRepository.js +1 -1
  278. package/lib/esm/client/erc20/FabricERC20ClientRepository.js.map +1 -0
  279. package/lib/esm/client/erc20/index.js +1 -1
  280. package/lib/esm/client/erc20/index.js.map +1 -0
  281. package/lib/esm/client/fabric-fs.js +1 -1
  282. package/lib/esm/client/fabric-fs.js.map +1 -0
  283. package/lib/esm/client/fabric-hsm.js +1 -1
  284. package/lib/esm/client/fabric-hsm.js.map +1 -0
  285. package/lib/esm/client/ids/id-extraction.js +1 -1
  286. package/lib/esm/client/ids/id-extraction.js.map +1 -0
  287. package/lib/esm/client/ids/index.js +1 -1
  288. package/lib/esm/client/ids/index.js.map +1 -0
  289. package/lib/esm/client/index.js +1 -1
  290. package/lib/esm/client/index.js.map +1 -0
  291. package/lib/esm/client/indexes/generation.js +1 -1
  292. package/lib/esm/client/indexes/generation.js.map +1 -0
  293. package/lib/esm/client/indexes/index.js +1 -1
  294. package/lib/esm/client/indexes/index.js.map +1 -0
  295. package/lib/esm/client/logging.js +1 -1
  296. package/lib/esm/client/logging.js.map +1 -0
  297. package/lib/esm/client/services/FabricEnrollmentService.js +1 -1
  298. package/lib/esm/client/services/FabricEnrollmentService.js.map +1 -0
  299. package/lib/esm/client/services/FabricIdentityService.js +1 -1
  300. package/lib/esm/client/services/FabricIdentityService.js.map +1 -0
  301. package/lib/esm/client/services/RegistrationRequestBuilder.js +1 -1
  302. package/lib/esm/client/services/RegistrationRequestBuilder.js.map +1 -0
  303. package/lib/esm/client/services/constants.js +1 -1
  304. package/lib/esm/client/services/constants.js.map +1 -0
  305. package/lib/esm/client/services/index.js +1 -1
  306. package/lib/esm/client/services/index.js.map +1 -0
  307. package/lib/esm/client/types.js +1 -1
  308. package/lib/esm/client/types.js.map +1 -0
  309. package/lib/esm/client/utils.js +1 -1
  310. package/lib/esm/client/utils.js.map +1 -0
  311. package/lib/esm/contract/Address.js +1 -1
  312. package/lib/esm/contract/Address.js.map +1 -0
  313. package/lib/esm/contract/AddressContract.js +1 -1
  314. package/lib/esm/contract/AddressContract.js.map +1 -0
  315. package/lib/esm/contract/AuditContract.js +1 -1
  316. package/lib/esm/contract/AuditContract.js.map +1 -0
  317. package/lib/esm/contract/BatchContract.js +1 -1
  318. package/lib/esm/contract/BatchContract.js.map +1 -0
  319. package/lib/esm/contract/MarketContract.js +1 -1
  320. package/lib/esm/contract/MarketContract.js.map +1 -0
  321. package/lib/esm/contract/OtherAuditContract.js +1 -1
  322. package/lib/esm/contract/OtherAuditContract.js.map +1 -0
  323. package/lib/esm/contract/OtherBatchContract.js +1 -1
  324. package/lib/esm/contract/OtherBatchContract.js.map +1 -0
  325. package/lib/esm/contract/OtherMarketContract.js +1 -1
  326. package/lib/esm/contract/OtherMarketContract.js.map +1 -0
  327. package/lib/esm/contract/OtherProductContract.js +1 -1
  328. package/lib/esm/contract/OtherProductContract.js.map +1 -0
  329. package/lib/esm/contract/OtherProductImageContract.js +1 -1
  330. package/lib/esm/contract/OtherProductImageContract.js.map +1 -0
  331. package/lib/esm/contract/OtherProductSharedContract.js +1 -1
  332. package/lib/esm/contract/OtherProductSharedContract.js.map +1 -0
  333. package/lib/esm/contract/OtherProductStrengthContract.js +1 -1
  334. package/lib/esm/contract/OtherProductStrengthContract.js.map +1 -0
  335. package/lib/esm/contract/Product.js +1 -1
  336. package/lib/esm/contract/Product.js.map +1 -0
  337. package/lib/esm/contract/ProductContract.js +1 -1
  338. package/lib/esm/contract/ProductContract.js.map +1 -0
  339. package/lib/esm/contract/ProductStrengthContract.js +1 -1
  340. package/lib/esm/contract/ProductStrengthContract.js.map +1 -0
  341. package/lib/esm/contract/SegregatedPrivateDocumentContract.js +1 -1
  342. package/lib/esm/contract/SegregatedPrivateDocumentContract.js.map +1 -0
  343. package/lib/esm/contract/SegregatedSharedDocumentContract.js +1 -1
  344. package/lib/esm/contract/SegregatedSharedDocumentContract.js.map +1 -0
  345. package/lib/esm/contract/User.js +1 -1
  346. package/lib/esm/contract/User.js.map +1 -0
  347. package/lib/esm/contract/UserContract.js +1 -1
  348. package/lib/esm/contract/UserContract.js.map +1 -0
  349. package/lib/esm/contract/index.js +1 -1
  350. package/lib/esm/contract/index.js.map +1 -0
  351. package/lib/esm/contract/logging-context.js +1 -1
  352. package/lib/esm/contract/logging-context.js.map +1 -0
  353. package/lib/esm/contract/models/Audit.js +1 -1
  354. package/lib/esm/contract/models/Audit.js.map +1 -0
  355. package/lib/esm/contract/models/BaseIdentifiedModel.js +1 -1
  356. package/lib/esm/contract/models/BaseIdentifiedModel.js.map +1 -0
  357. package/lib/esm/contract/models/BaseModel.js +1 -1
  358. package/lib/esm/contract/models/BaseModel.js.map +1 -0
  359. package/lib/esm/contract/models/Batch.js +1 -1
  360. package/lib/esm/contract/models/Batch.js.map +1 -0
  361. package/lib/esm/contract/models/GtinOwner.js +1 -1
  362. package/lib/esm/contract/models/GtinOwner.js.map +1 -0
  363. package/lib/esm/contract/models/History.js +1 -1
  364. package/lib/esm/contract/models/History.js.map +1 -0
  365. package/lib/esm/contract/models/Leaflet.js +1 -1
  366. package/lib/esm/contract/models/Leaflet.js.map +1 -0
  367. package/lib/esm/contract/models/LeafletFile.js +1 -1
  368. package/lib/esm/contract/models/LeafletFile.js.map +1 -0
  369. package/lib/esm/contract/models/Market.js +1 -1
  370. package/lib/esm/contract/models/Market.js.map +1 -0
  371. package/lib/esm/contract/models/OtherAudit.js +1 -1
  372. package/lib/esm/contract/models/OtherAudit.js.map +1 -0
  373. package/lib/esm/contract/models/OtherBatchShared.js +1 -1
  374. package/lib/esm/contract/models/OtherBatchShared.js.map +1 -0
  375. package/lib/esm/contract/models/OtherLeaflet.js +1 -1
  376. package/lib/esm/contract/models/OtherLeaflet.js.map +1 -0
  377. package/lib/esm/contract/models/OtherLeafletFile.js +1 -1
  378. package/lib/esm/contract/models/OtherLeafletFile.js.map +1 -0
  379. package/lib/esm/contract/models/OtherMarket.js +1 -1
  380. package/lib/esm/contract/models/OtherMarket.js.map +1 -0
  381. package/lib/esm/contract/models/OtherProduct.js +1 -1
  382. package/lib/esm/contract/models/OtherProduct.js.map +1 -0
  383. package/lib/esm/contract/models/OtherProductImage.js +1 -1
  384. package/lib/esm/contract/models/OtherProductImage.js.map +1 -0
  385. package/lib/esm/contract/models/OtherProductShared.js +1 -1
  386. package/lib/esm/contract/models/OtherProductShared.js.map +1 -0
  387. package/lib/esm/contract/models/OtherProductStrength.js +1 -1
  388. package/lib/esm/contract/models/OtherProductStrength.js.map +1 -0
  389. package/lib/esm/contract/models/Product.js +1 -1
  390. package/lib/esm/contract/models/Product.js.map +1 -0
  391. package/lib/esm/contract/models/ProductStrength.js +1 -1
  392. package/lib/esm/contract/models/ProductStrength.js.map +1 -0
  393. package/lib/esm/contract/models/SegregatedDocument.js +1 -1
  394. package/lib/esm/contract/models/SegregatedDocument.js.map +1 -0
  395. package/lib/esm/contract/models/constants.js +1 -1
  396. package/lib/esm/contract/models/constants.js.map +1 -0
  397. package/lib/esm/contract/models/decorators-private.js +1 -1
  398. package/lib/esm/contract/models/decorators-private.js.map +1 -0
  399. package/lib/esm/contract/models/decorators.js +1 -1
  400. package/lib/esm/contract/models/decorators.js.map +1 -0
  401. package/lib/esm/contract/models/gtin.js +1 -1
  402. package/lib/esm/contract/models/gtin.js.map +1 -0
  403. package/lib/esm/contract/models/history-dec.js +1 -1
  404. package/lib/esm/contract/models/history-dec.js.map +1 -0
  405. package/lib/esm/contracts/ContractAdapter.js +1 -1
  406. package/lib/esm/contracts/ContractAdapter.js.map +1 -0
  407. package/lib/esm/contracts/ContractContext.js +1 -1
  408. package/lib/esm/contracts/ContractContext.js.map +1 -0
  409. package/lib/esm/contracts/FabricContractDispatch.js +1 -1
  410. package/lib/esm/contracts/FabricContractDispatch.js.map +1 -0
  411. package/lib/esm/contracts/FabricContractPaginator.js +1 -1
  412. package/lib/esm/contracts/FabricContractPaginator.js.map +1 -0
  413. package/lib/esm/contracts/FabricContractRepository.js +1 -1
  414. package/lib/esm/contracts/FabricContractRepository.js.map +1 -0
  415. package/lib/esm/contracts/FabricContractRepositoryObservableHandler.js +1 -1
  416. package/lib/esm/contracts/FabricContractRepositoryObservableHandler.js.map +1 -0
  417. package/lib/esm/contracts/FabricContractSequence.js +1 -1
  418. package/lib/esm/contracts/FabricContractSequence.js.map +1 -0
  419. package/lib/esm/contracts/FabricContractStatement.js +1 -1
  420. package/lib/esm/contracts/FabricContractStatement.js.map +1 -0
  421. package/lib/esm/contracts/MigrationContract.js +1 -1
  422. package/lib/esm/contracts/MigrationContract.js.map +1 -0
  423. package/lib/esm/contracts/PrivateSequence.js +1 -1
  424. package/lib/esm/contracts/PrivateSequence.js.map +1 -0
  425. package/lib/esm/contracts/auth/decorators.js +1 -1
  426. package/lib/esm/contracts/auth/decorators.js.map +1 -0
  427. package/lib/esm/contracts/auth/index.js +1 -1
  428. package/lib/esm/contracts/auth/index.js.map +1 -0
  429. package/lib/esm/contracts/crud/crud-contract.js +1 -1
  430. package/lib/esm/contracts/crud/crud-contract.js.map +1 -0
  431. package/lib/esm/contracts/crud/index.js +1 -1
  432. package/lib/esm/contracts/crud/index.js.map +1 -0
  433. package/lib/esm/contracts/crud/serialized-crud-contract.js +1 -1
  434. package/lib/esm/contracts/crud/serialized-crud-contract.js.map +1 -0
  435. package/lib/esm/contracts/erc20/erc20contract.js +1 -1
  436. package/lib/esm/contracts/erc20/erc20contract.js.map +1 -0
  437. package/lib/esm/contracts/erc20/index.js +1 -1
  438. package/lib/esm/contracts/erc20/index.js.map +1 -0
  439. package/lib/esm/contracts/erc20/models.js +1 -1
  440. package/lib/esm/contracts/erc20/models.js.map +1 -0
  441. package/lib/esm/contracts/index.js +1 -1
  442. package/lib/esm/contracts/index.js.map +1 -0
  443. package/lib/esm/contracts/logging.js +1 -1
  444. package/lib/esm/contracts/logging.js.map +1 -0
  445. package/lib/esm/contracts/overrides.js +1 -1
  446. package/lib/esm/contracts/overrides.js.map +1 -0
  447. package/lib/esm/contracts/types.js +1 -1
  448. package/lib/esm/contracts/types.js.map +1 -0
  449. package/lib/esm/contracts/uuid.js +1 -1
  450. package/lib/esm/contracts/uuid.js.map +1 -0
  451. package/lib/esm/index.js +1 -1
  452. package/lib/esm/index.js.map +1 -0
  453. package/lib/esm/shared/ClientSerializer.js +1 -1
  454. package/lib/esm/shared/ClientSerializer.js.map +1 -0
  455. package/lib/esm/shared/DeterministicSerializer.js +1 -1
  456. package/lib/esm/shared/DeterministicSerializer.js.map +1 -0
  457. package/lib/esm/shared/SimpleDeterministicSerializer.js +1 -1
  458. package/lib/esm/shared/SimpleDeterministicSerializer.js.map +1 -0
  459. package/lib/esm/shared/constants.js +1 -1
  460. package/lib/esm/shared/constants.js.map +1 -0
  461. package/lib/esm/shared/decorators.js +1 -1
  462. package/lib/esm/shared/decorators.js.map +1 -0
  463. package/lib/esm/shared/erc20/erc20-constants.js +1 -1
  464. package/lib/esm/shared/erc20/erc20-constants.js.map +1 -0
  465. package/lib/esm/shared/erc20/index.js +1 -1
  466. package/lib/esm/shared/erc20/index.js.map +1 -0
  467. package/lib/esm/shared/errors.js +1 -1
  468. package/lib/esm/shared/errors.js.map +1 -0
  469. package/lib/esm/shared/events.js +1 -1
  470. package/lib/esm/shared/events.js.map +1 -0
  471. package/lib/esm/shared/fabric-types.js +1 -1
  472. package/lib/esm/shared/fabric-types.js.map +1 -0
  473. package/lib/esm/shared/index.js +1 -1
  474. package/lib/esm/shared/index.js.map +1 -0
  475. package/lib/esm/shared/interfaces/Checkable.js +1 -1
  476. package/lib/esm/shared/interfaces/Checkable.js.map +1 -0
  477. package/lib/esm/shared/interfaces/index.js +1 -1
  478. package/lib/esm/shared/interfaces/index.js.map +1 -0
  479. package/lib/esm/shared/math.js +1 -1
  480. package/lib/esm/shared/math.js.map +1 -0
  481. package/lib/esm/shared/model/FabricBaseModel.js +1 -1
  482. package/lib/esm/shared/model/FabricBaseModel.js.map +1 -0
  483. package/lib/esm/shared/model/FabricIdentifiedBaseModel.js +1 -1
  484. package/lib/esm/shared/model/FabricIdentifiedBaseModel.js.map +1 -0
  485. package/lib/esm/shared/model/Identity.js +1 -1
  486. package/lib/esm/shared/model/Identity.js.map +1 -0
  487. package/lib/esm/shared/model/IdentityCredentials.js +1 -1
  488. package/lib/esm/shared/model/IdentityCredentials.js.map +1 -0
  489. package/lib/esm/shared/model/index.js +1 -1
  490. package/lib/esm/shared/model/index.js.map +1 -0
  491. package/lib/esm/shared/overrides/Model.js +1 -1
  492. package/lib/esm/shared/overrides/Model.js.map +1 -0
  493. package/lib/esm/shared/overrides/index.js +1 -1
  494. package/lib/esm/shared/overrides/index.js.map +1 -0
  495. package/lib/esm/shared/overrides/overrides.js +1 -1
  496. package/lib/esm/shared/overrides/overrides.js.map +1 -0
  497. package/lib/esm/shared/types.js +1 -1
  498. package/lib/esm/shared/types.js.map +1 -0
  499. package/lib/esm/version.js +2 -2
  500. package/lib/esm/version.js.map +1 -0
  501. package/lib/{esm → types}/version.d.ts +1 -1
  502. package/package.json +22 -18
  503. package/lib/bin/cli.cjs +0 -9
  504. package/lib/cli-module.cjs +0 -479
  505. package/lib/cli-utils.cjs +0 -309
  506. package/lib/client/FabricClientAdapter.cjs +0 -1362
  507. package/lib/client/FabricClientDispatch.cjs +0 -290
  508. package/lib/client/FabricClientPaginator.cjs +0 -21
  509. package/lib/client/FabricClientRepository.cjs +0 -259
  510. package/lib/client/FabricClientStatement.cjs +0 -451
  511. package/lib/client/collections/generation.cjs +0 -113
  512. package/lib/client/constants.cjs +0 -16
  513. package/lib/client/crypto.cjs +0 -368
  514. package/lib/client/erc20/FabricERC20ClientRepository.cjs +0 -363
  515. package/lib/client/fabric-fs.cjs +0 -234
  516. package/lib/client/fabric-hsm.cjs +0 -165
  517. package/lib/client/ids/id-extraction.cjs +0 -30
  518. package/lib/client/indexes/generation.cjs +0 -95
  519. package/lib/client/logging.cjs +0 -102
  520. package/lib/client/services/FabricEnrollmentService.cjs +0 -363
  521. package/lib/client/services/FabricIdentityService.cjs +0 -324
  522. package/lib/client/services/RegistrationRequestBuilder.cjs +0 -91
  523. package/lib/client/services/constants.cjs +0 -20
  524. package/lib/client/services/index.cjs +0 -21
  525. package/lib/client/types.cjs +0 -3
  526. package/lib/client/utils.cjs +0 -262
  527. package/lib/contract/index.cjs +0 -36
  528. package/lib/contract/logging-context.cjs +0 -77
  529. package/lib/contract/models/Audit.cjs +0 -106
  530. package/lib/contract/models/Batch.cjs +0 -174
  531. package/lib/contract/models/GtinOwner.cjs +0 -59
  532. package/lib/contract/models/History.cjs +0 -75
  533. package/lib/contract/models/Leaflet.cjs +0 -95
  534. package/lib/contract/models/LeafletFile.cjs +0 -58
  535. package/lib/contract/models/Market.cjs +0 -75
  536. package/lib/contract/models/OtherAudit.cjs +0 -118
  537. package/lib/contract/models/OtherBatchShared.cjs +0 -127
  538. package/lib/contract/models/OtherLeaflet.cjs +0 -115
  539. package/lib/contract/models/OtherLeafletFile.cjs +0 -65
  540. package/lib/contract/models/OtherMarket.cjs +0 -84
  541. package/lib/contract/models/OtherProduct.cjs +0 -77
  542. package/lib/contract/models/OtherProductImage.cjs +0 -59
  543. package/lib/contract/models/OtherProductShared.cjs +0 -99
  544. package/lib/contract/models/OtherProductStrength.cjs +0 -87
  545. package/lib/contract/models/Product.cjs +0 -78
  546. package/lib/contract/models/ProductStrength.cjs +0 -78
  547. package/lib/contract/models/constants.cjs +0 -30
  548. package/lib/contract/models/decorators-private.cjs +0 -158
  549. package/lib/contract/models/decorators.cjs +0 -182
  550. package/lib/contract/models/gtin.cjs +0 -88
  551. package/lib/contract/models/history-dec.cjs +0 -83
  552. package/lib/contracts/ContractAdapter.cjs +0 -1193
  553. package/lib/contracts/ContractContext.cjs +0 -157
  554. package/lib/contracts/FabricContractDispatch.cjs +0 -79
  555. package/lib/contracts/FabricContractPaginator.cjs +0 -173
  556. package/lib/contracts/FabricContractRepository.cjs +0 -322
  557. package/lib/contracts/FabricContractRepositoryObservableHandler.cjs +0 -96
  558. package/lib/contracts/FabricContractSequence.cjs +0 -338
  559. package/lib/contracts/FabricContractStatement.cjs +0 -180
  560. package/lib/contracts/MigrationContract.cjs +0 -147
  561. package/lib/contracts/auth/decorators.cjs +0 -84
  562. package/lib/contracts/crud/crud-contract.cjs +0 -416
  563. package/lib/contracts/crud/serialized-crud-contract.cjs +0 -284
  564. package/lib/contracts/erc20/erc20contract.cjs +0 -581
  565. package/lib/contracts/erc20/index.cjs +0 -21
  566. package/lib/contracts/erc20/models.cjs +0 -209
  567. package/lib/contracts/logging.cjs +0 -118
  568. package/lib/contracts/overrides.cjs +0 -8
  569. package/lib/contracts/types.cjs +0 -3
  570. package/lib/contracts/uuid.cjs +0 -75
  571. package/lib/esm/bin/cli.d.ts +0 -1
  572. package/lib/esm/cli-module.d.ts +0 -3
  573. package/lib/esm/cli-utils.d.ts +0 -21
  574. package/lib/esm/client/FabricClientAdapter.d.ts +0 -404
  575. package/lib/esm/client/FabricClientDispatch.d.ts +0 -133
  576. package/lib/esm/client/FabricClientPaginator.d.ts +0 -12
  577. package/lib/esm/client/FabricClientRepository.d.ts +0 -71
  578. package/lib/esm/client/FabricClientStatement.d.ts +0 -64
  579. package/lib/esm/client/collections/generation.d.ts +0 -46
  580. package/lib/esm/client/collections/index.d.ts +0 -1
  581. package/lib/esm/client/constants.d.ts +0 -2
  582. package/lib/esm/client/crypto.d.ts +0 -107
  583. package/lib/esm/client/erc20/index.d.ts +0 -1
  584. package/lib/esm/client/fabric-fs.d.ts +0 -92
  585. package/lib/esm/client/fabric-hsm.d.ts +0 -24
  586. package/lib/esm/client/ids/id-extraction.d.ts +0 -4
  587. package/lib/esm/client/ids/index.d.ts +0 -1
  588. package/lib/esm/client/index.d.ts +0 -23
  589. package/lib/esm/client/indexes/generation.d.ts +0 -10
  590. package/lib/esm/client/indexes/index.d.ts +0 -1
  591. package/lib/esm/client/services/FabricEnrollmentService.d.ts +0 -176
  592. package/lib/esm/client/services/FabricIdentityService.d.ts +0 -98
  593. package/lib/esm/client/services/RegistrationRequestBuilder.d.ts +0 -19
  594. package/lib/esm/client/services/index.d.ts +0 -4
  595. package/lib/esm/client/types.d.ts +0 -20
  596. package/lib/esm/client/utils.d.ts +0 -71
  597. package/lib/esm/contract/Address.d.ts +0 -13
  598. package/lib/esm/contract/AddressContract.d.ts +0 -5
  599. package/lib/esm/contract/AuditContract.d.ts +0 -5
  600. package/lib/esm/contract/BatchContract.d.ts +0 -5
  601. package/lib/esm/contract/MarketContract.d.ts +0 -5
  602. package/lib/esm/contract/OtherAuditContract.d.ts +0 -5
  603. package/lib/esm/contract/OtherBatchContract.d.ts +0 -5
  604. package/lib/esm/contract/OtherMarketContract.d.ts +0 -5
  605. package/lib/esm/contract/OtherProductContract.d.ts +0 -5
  606. package/lib/esm/contract/OtherProductImageContract.d.ts +0 -5
  607. package/lib/esm/contract/OtherProductSharedContract.d.ts +0 -5
  608. package/lib/esm/contract/OtherProductStrengthContract.d.ts +0 -5
  609. package/lib/esm/contract/Product.d.ts +0 -7
  610. package/lib/esm/contract/ProductContract.d.ts +0 -5
  611. package/lib/esm/contract/ProductStrengthContract.d.ts +0 -5
  612. package/lib/esm/contract/SegregatedPrivateDocumentContract.d.ts +0 -5
  613. package/lib/esm/contract/SegregatedSharedDocumentContract.d.ts +0 -5
  614. package/lib/esm/contract/User.d.ts +0 -7
  615. package/lib/esm/contract/UserContract.d.ts +0 -5
  616. package/lib/esm/contract/index.d.ts +0 -2
  617. package/lib/esm/contract/logging-context.d.ts +0 -8
  618. package/lib/esm/contract/models/Audit.d.ts +0 -13
  619. package/lib/esm/contract/models/BaseIdentifiedModel.d.ts +0 -7
  620. package/lib/esm/contract/models/BaseModel.d.ts +0 -7
  621. package/lib/esm/contract/models/Batch.d.ts +0 -18
  622. package/lib/esm/contract/models/GtinOwner.d.ts +0 -8
  623. package/lib/esm/contract/models/History.d.ts +0 -9
  624. package/lib/esm/contract/models/Leaflet.d.ts +0 -12
  625. package/lib/esm/contract/models/LeafletFile.d.ts +0 -9
  626. package/lib/esm/contract/models/Market.d.ts +0 -12
  627. package/lib/esm/contract/models/OtherAudit.d.ts +0 -15
  628. package/lib/esm/contract/models/OtherBatchShared.d.ts +0 -18
  629. package/lib/esm/contract/models/OtherLeaflet.d.ts +0 -16
  630. package/lib/esm/contract/models/OtherLeafletFile.d.ts +0 -10
  631. package/lib/esm/contract/models/OtherMarket.d.ts +0 -13
  632. package/lib/esm/contract/models/OtherProduct.d.ts +0 -12
  633. package/lib/esm/contract/models/OtherProductImage.d.ts +0 -9
  634. package/lib/esm/contract/models/OtherProductShared.d.ts +0 -18
  635. package/lib/esm/contract/models/OtherProductStrength.d.ts +0 -12
  636. package/lib/esm/contract/models/Product.d.ts +0 -15
  637. package/lib/esm/contract/models/ProductStrength.d.ts +0 -11
  638. package/lib/esm/contract/models/SegregatedDocument.d.ts +0 -18
  639. package/lib/esm/contract/models/constants.d.ts +0 -24
  640. package/lib/esm/contract/models/decorators-private.d.ts +0 -16
  641. package/lib/esm/contract/models/decorators.d.ts +0 -28
  642. package/lib/esm/contract/models/gtin.d.ts +0 -8
  643. package/lib/esm/contract/models/history-dec.d.ts +0 -6
  644. package/lib/esm/contracts/ContractAdapter.d.ts +0 -287
  645. package/lib/esm/contracts/ContractContext.d.ts +0 -89
  646. package/lib/esm/contracts/FabricContractDispatch.d.ts +0 -7
  647. package/lib/esm/contracts/FabricContractRepository.d.ts +0 -119
  648. package/lib/esm/contracts/FabricContractSequence.d.ts +0 -87
  649. package/lib/esm/contracts/FabricContractStatement.d.ts +0 -36
  650. package/lib/esm/contracts/MigrationContract.d.ts +0 -22
  651. package/lib/esm/contracts/PrivateSequence.d.ts +0 -15
  652. package/lib/esm/contracts/auth/decorators.d.ts +0 -6
  653. package/lib/esm/contracts/auth/index.d.ts +0 -1
  654. package/lib/esm/contracts/crud/crud-contract.d.ts +0 -199
  655. package/lib/esm/contracts/crud/index.d.ts +0 -2
  656. package/lib/esm/contracts/crud/serialized-crud-contract.d.ts +0 -42
  657. package/lib/esm/contracts/erc20/erc20contract.d.ts +0 -152
  658. package/lib/esm/contracts/erc20/index.d.ts +0 -2
  659. package/lib/esm/contracts/erc20/models.d.ts +0 -114
  660. package/lib/esm/contracts/index.d.ts +0 -19
  661. package/lib/esm/contracts/logging.d.ts +0 -54
  662. package/lib/esm/contracts/types.d.ts +0 -38
  663. package/lib/esm/contracts/uuid.d.ts +0 -2
  664. package/lib/esm/shared/overrides/overrides.d.ts +0 -1
  665. package/lib/index.d.ts +0 -8
  666. package/lib/shared/ClientSerializer.cjs +0 -81
  667. package/lib/shared/DeterministicSerializer.cjs +0 -106
  668. package/lib/shared/DeterministicSerializer.d.ts +0 -47
  669. package/lib/shared/SimpleDeterministicSerializer.cjs +0 -69
  670. package/lib/shared/SimpleDeterministicSerializer.d.ts +0 -7
  671. package/lib/shared/constants.cjs +0 -41
  672. package/lib/shared/decorators.cjs +0 -595
  673. package/lib/shared/decorators.d.ts +0 -81
  674. package/lib/shared/erc20/erc20-constants.cjs +0 -30
  675. package/lib/shared/erc20/index.d.ts +0 -1
  676. package/lib/shared/errors.cjs +0 -190
  677. package/lib/shared/errors.d.ts +0 -140
  678. package/lib/shared/events.cjs +0 -51
  679. package/lib/shared/fabric-types.cjs +0 -3
  680. package/lib/shared/fabric-types.d.ts +0 -32
  681. package/lib/shared/index.d.ts +0 -20
  682. package/lib/shared/interfaces/Checkable.cjs +0 -3
  683. package/lib/shared/interfaces/Checkable.d.ts +0 -23
  684. package/lib/shared/interfaces/index.d.ts +0 -1
  685. package/lib/shared/math.cjs +0 -66
  686. package/lib/shared/math.d.ts +0 -34
  687. package/lib/shared/model/FabricBaseModel.d.ts +0 -7
  688. package/lib/shared/model/FabricIdentifiedBaseModel.d.ts +0 -7
  689. package/lib/shared/model/Identity.cjs +0 -71
  690. package/lib/shared/model/Identity.d.ts +0 -42
  691. package/lib/shared/model/IdentityCredentials.cjs +0 -66
  692. package/lib/shared/model/IdentityCredentials.d.ts +0 -41
  693. package/lib/shared/model/index.cjs +0 -21
  694. package/lib/shared/model/index.d.ts +0 -4
  695. package/lib/shared/overrides/Model.cjs +0 -4
  696. package/lib/shared/overrides/Model.d.ts +0 -22
  697. package/lib/shared/overrides/index.d.ts +0 -2
  698. package/lib/shared/overrides/overrides.cjs +0 -93
  699. package/lib/shared/overrides/overrides.d.ts +0 -1
  700. package/lib/shared/types.cjs +0 -3
  701. package/lib/shared/types.d.ts +0 -125
  702. package/lib/version.cjs +0 -8
  703. package/lib/version.d.ts +0 -2
  704. /package/lib/{bin → types/bin}/cli.d.ts +0 -0
  705. /package/lib/{cli-module.d.ts → types/cli-module.d.ts} +0 -0
  706. /package/lib/{cli-utils.d.ts → types/cli-utils.d.ts} +0 -0
  707. /package/lib/{client → types/client}/FabricClientAdapter.d.ts +0 -0
  708. /package/lib/{client → types/client}/FabricClientDispatch.d.ts +0 -0
  709. /package/lib/{client → types/client}/FabricClientPaginator.d.ts +0 -0
  710. /package/lib/{client → types/client}/FabricClientRepository.d.ts +0 -0
  711. /package/lib/{client → types/client}/FabricClientStatement.d.ts +0 -0
  712. /package/lib/{client → types/client}/collections/generation.d.ts +0 -0
  713. /package/lib/{client → types/client}/collections/index.d.ts +0 -0
  714. /package/lib/{client → types/client}/constants.d.ts +0 -0
  715. /package/lib/{client → types/client}/crypto.d.ts +0 -0
  716. /package/lib/{client → types/client}/erc20/FabricERC20ClientRepository.d.ts +0 -0
  717. /package/lib/{client → types/client}/erc20/index.d.ts +0 -0
  718. /package/lib/{client → types/client}/fabric-fs.d.ts +0 -0
  719. /package/lib/{client → types/client}/fabric-hsm.d.ts +0 -0
  720. /package/lib/{client → types/client}/ids/id-extraction.d.ts +0 -0
  721. /package/lib/{client → types/client}/ids/index.d.ts +0 -0
  722. /package/lib/{client → types/client}/index.d.ts +0 -0
  723. /package/lib/{client → types/client}/indexes/generation.d.ts +0 -0
  724. /package/lib/{client → types/client}/indexes/index.d.ts +0 -0
  725. /package/lib/{client → types/client}/logging.d.ts +0 -0
  726. /package/lib/{client → types/client}/services/FabricEnrollmentService.d.ts +0 -0
  727. /package/lib/{client → types/client}/services/FabricIdentityService.d.ts +0 -0
  728. /package/lib/{client → types/client}/services/RegistrationRequestBuilder.d.ts +0 -0
  729. /package/lib/{client → types/client}/services/constants.d.ts +0 -0
  730. /package/lib/{client → types/client}/services/index.d.ts +0 -0
  731. /package/lib/{client → types/client}/types.d.ts +0 -0
  732. /package/lib/{client → types/client}/utils.d.ts +0 -0
  733. /package/lib/{contract → types/contract}/Address.d.ts +0 -0
  734. /package/lib/{contract → types/contract}/AddressContract.d.ts +0 -0
  735. /package/lib/{contract → types/contract}/AuditContract.d.ts +0 -0
  736. /package/lib/{contract → types/contract}/BatchContract.d.ts +0 -0
  737. /package/lib/{contract → types/contract}/MarketContract.d.ts +0 -0
  738. /package/lib/{contract → types/contract}/OtherAuditContract.d.ts +0 -0
  739. /package/lib/{contract → types/contract}/OtherBatchContract.d.ts +0 -0
  740. /package/lib/{contract → types/contract}/OtherMarketContract.d.ts +0 -0
  741. /package/lib/{contract → types/contract}/OtherProductContract.d.ts +0 -0
  742. /package/lib/{contract → types/contract}/OtherProductImageContract.d.ts +0 -0
  743. /package/lib/{contract → types/contract}/OtherProductSharedContract.d.ts +0 -0
  744. /package/lib/{contract → types/contract}/OtherProductStrengthContract.d.ts +0 -0
  745. /package/lib/{contract → types/contract}/Product.d.ts +0 -0
  746. /package/lib/{contract → types/contract}/ProductContract.d.ts +0 -0
  747. /package/lib/{contract → types/contract}/ProductStrengthContract.d.ts +0 -0
  748. /package/lib/{contract → types/contract}/SegregatedPrivateDocumentContract.d.ts +0 -0
  749. /package/lib/{contract → types/contract}/SegregatedSharedDocumentContract.d.ts +0 -0
  750. /package/lib/{contract → types/contract}/User.d.ts +0 -0
  751. /package/lib/{contract → types/contract}/UserContract.d.ts +0 -0
  752. /package/lib/{contract → types/contract}/index.d.ts +0 -0
  753. /package/lib/{contract → types/contract}/logging-context.d.ts +0 -0
  754. /package/lib/{contract → types/contract}/models/Audit.d.ts +0 -0
  755. /package/lib/{contract → types/contract}/models/BaseIdentifiedModel.d.ts +0 -0
  756. /package/lib/{contract → types/contract}/models/BaseModel.d.ts +0 -0
  757. /package/lib/{contract → types/contract}/models/Batch.d.ts +0 -0
  758. /package/lib/{contract → types/contract}/models/GtinOwner.d.ts +0 -0
  759. /package/lib/{contract → types/contract}/models/History.d.ts +0 -0
  760. /package/lib/{contract → types/contract}/models/Leaflet.d.ts +0 -0
  761. /package/lib/{contract → types/contract}/models/LeafletFile.d.ts +0 -0
  762. /package/lib/{contract → types/contract}/models/Market.d.ts +0 -0
  763. /package/lib/{contract → types/contract}/models/OtherAudit.d.ts +0 -0
  764. /package/lib/{contract → types/contract}/models/OtherBatchShared.d.ts +0 -0
  765. /package/lib/{contract → types/contract}/models/OtherLeaflet.d.ts +0 -0
  766. /package/lib/{contract → types/contract}/models/OtherLeafletFile.d.ts +0 -0
  767. /package/lib/{contract → types/contract}/models/OtherMarket.d.ts +0 -0
  768. /package/lib/{contract → types/contract}/models/OtherProduct.d.ts +0 -0
  769. /package/lib/{contract → types/contract}/models/OtherProductImage.d.ts +0 -0
  770. /package/lib/{contract → types/contract}/models/OtherProductShared.d.ts +0 -0
  771. /package/lib/{contract → types/contract}/models/OtherProductStrength.d.ts +0 -0
  772. /package/lib/{contract → types/contract}/models/Product.d.ts +0 -0
  773. /package/lib/{contract → types/contract}/models/ProductStrength.d.ts +0 -0
  774. /package/lib/{contract → types/contract}/models/SegregatedDocument.d.ts +0 -0
  775. /package/lib/{contract → types/contract}/models/constants.d.ts +0 -0
  776. /package/lib/{contract → types/contract}/models/decorators-private.d.ts +0 -0
  777. /package/lib/{contract → types/contract}/models/decorators.d.ts +0 -0
  778. /package/lib/{contract → types/contract}/models/gtin.d.ts +0 -0
  779. /package/lib/{contract → types/contract}/models/history-dec.d.ts +0 -0
  780. /package/lib/{contracts → types/contracts}/ContractAdapter.d.ts +0 -0
  781. /package/lib/{contracts → types/contracts}/ContractContext.d.ts +0 -0
  782. /package/lib/{contracts → types/contracts}/FabricContractDispatch.d.ts +0 -0
  783. /package/lib/{contracts → types/contracts}/FabricContractPaginator.d.ts +0 -0
  784. /package/lib/{contracts → types/contracts}/FabricContractRepository.d.ts +0 -0
  785. /package/lib/{contracts → types/contracts}/FabricContractRepositoryObservableHandler.d.ts +0 -0
  786. /package/lib/{contracts → types/contracts}/FabricContractSequence.d.ts +0 -0
  787. /package/lib/{contracts → types/contracts}/FabricContractStatement.d.ts +0 -0
  788. /package/lib/{contracts → types/contracts}/MigrationContract.d.ts +0 -0
  789. /package/lib/{contracts → types/contracts}/PrivateSequence.d.ts +0 -0
  790. /package/lib/{contracts → types/contracts}/auth/decorators.d.ts +0 -0
  791. /package/lib/{contracts → types/contracts}/auth/index.d.ts +0 -0
  792. /package/lib/{contracts → types/contracts}/crud/crud-contract.d.ts +0 -0
  793. /package/lib/{contracts → types/contracts}/crud/index.d.ts +0 -0
  794. /package/lib/{contracts → types/contracts}/crud/serialized-crud-contract.d.ts +0 -0
  795. /package/lib/{contracts → types/contracts}/erc20/erc20contract.d.ts +0 -0
  796. /package/lib/{contracts → types/contracts}/erc20/index.d.ts +0 -0
  797. /package/lib/{contracts → types/contracts}/erc20/models.d.ts +0 -0
  798. /package/lib/{contracts → types/contracts}/index.d.ts +0 -0
  799. /package/lib/{contracts → types/contracts}/logging.d.ts +0 -0
  800. /package/lib/{contracts → types/contracts}/overrides.d.ts +0 -0
  801. /package/lib/{contracts → types/contracts}/types.d.ts +0 -0
  802. /package/lib/{contracts → types/contracts}/uuid.d.ts +0 -0
  803. /package/lib/{esm → types}/index.d.ts +0 -0
  804. /package/lib/{esm → types}/shared/ClientSerializer.d.ts +0 -0
  805. /package/lib/{esm → types}/shared/DeterministicSerializer.d.ts +0 -0
  806. /package/lib/{esm → types}/shared/SimpleDeterministicSerializer.d.ts +0 -0
  807. /package/lib/{esm → types}/shared/constants.d.ts +0 -0
  808. /package/lib/{esm → types}/shared/decorators.d.ts +0 -0
  809. /package/lib/{esm → types}/shared/erc20/erc20-constants.d.ts +0 -0
  810. /package/lib/{esm → types}/shared/erc20/index.d.ts +0 -0
  811. /package/lib/{esm → types}/shared/errors.d.ts +0 -0
  812. /package/lib/{esm → types}/shared/events.d.ts +0 -0
  813. /package/lib/{esm → types}/shared/fabric-types.d.ts +0 -0
  814. /package/lib/{esm → types}/shared/index.d.ts +0 -0
  815. /package/lib/{esm → types}/shared/interfaces/Checkable.d.ts +0 -0
  816. /package/lib/{esm → types}/shared/interfaces/index.d.ts +0 -0
  817. /package/lib/{esm → types}/shared/math.d.ts +0 -0
  818. /package/lib/{esm → types}/shared/model/FabricBaseModel.d.ts +0 -0
  819. /package/lib/{esm → types}/shared/model/FabricIdentifiedBaseModel.d.ts +0 -0
  820. /package/lib/{esm → types}/shared/model/Identity.d.ts +0 -0
  821. /package/lib/{esm → types}/shared/model/IdentityCredentials.d.ts +0 -0
  822. /package/lib/{esm → types}/shared/model/index.d.ts +0 -0
  823. /package/lib/{esm → types}/shared/overrides/Model.d.ts +0 -0
  824. /package/lib/{esm → types}/shared/overrides/index.d.ts +0 -0
  825. /package/lib/{esm/contracts → types/shared/overrides}/overrides.d.ts +0 -0
  826. /package/lib/{esm → types}/shared/types.d.ts +0 -0
@@ -1,595 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SEGREGATED_COLLECTION_EXTRACTION_PRIORITY = exports.ImplicitPrivateCollection = exports.ModelCollection = void 0;
4
- exports.extractMspId = extractMspId;
5
- exports.Owner = Owner;
6
- exports.ownedByOnCreate = ownedByOnCreate;
7
- exports.ownedBy = ownedBy;
8
- exports.transactionIdOnCreate = transactionIdOnCreate;
9
- exports.transactionId = transactionId;
10
- exports.evalMirrorMetadata = evalMirrorMetadata;
11
- exports.createMirrorHandler = createMirrorHandler;
12
- exports.updateMirrorHandler = updateMirrorHandler;
13
- exports.deleteMirrorHandler = deleteMirrorHandler;
14
- exports.mirrorWriteGuard = mirrorWriteGuard;
15
- exports.readMirrorHandler = readMirrorHandler;
16
- exports.mirror = mirror;
17
- exports.NamespaceCollection = NamespaceCollection;
18
- exports.applySegregationFlags = applySegregationFlags;
19
- exports.applyMirrorFlags = applyMirrorFlags;
20
- exports.extractSegregatedCollections = extractSegregatedCollections;
21
- exports.segregatedDataOnCreate = segregatedDataOnCreate;
22
- exports.segregatedDataOnRead = segregatedDataOnRead;
23
- exports.segregatedDataOnUpdate = segregatedDataOnUpdate;
24
- exports.segregatedDataOnDelete = segregatedDataOnDelete;
25
- exports.privateData = privateData;
26
- exports.sharedData = sharedData;
27
- const core_1 = require("@decaf-ts/core");
28
- const db_decorators_1 = require("@decaf-ts/db-decorators");
29
- const decorator_validation_1 = require("@decaf-ts/decorator-validation");
30
- const constants_1 = require("./constants.cjs");
31
- const decoration_1 = require("@decaf-ts/decoration");
32
- const logging_1 = require("@decaf-ts/logging");
33
- require("./overrides/index.cjs");
34
- /**
35
- * @description Extracts the MSP ID from either a string or ClientIdentity object
36
- * @param identity - The identity value which can be a string MSP ID or ClientIdentity object
37
- * @returns The MSP ID as a string, or undefined if not available
38
- */
39
- function extractMspId(identity) {
40
- if (!identity)
41
- return undefined;
42
- if (typeof identity === "string")
43
- return identity;
44
- return identity.getMSPID();
45
- }
46
- /**
47
- * Decorator for marking methods that require ownership authorization.
48
- * Checks the owner of the token before allowing the method to be executed.
49
- *
50
- * @example
51
- * ```typescript
52
- * class TokenContract extends Contract {
53
- * @Owner()
54
- * async Mint(ctx: Context, amount: number) {
55
- * // Mint token logic
56
- * }
57
- * }
58
- * ```
59
- *
60
- * @returns {MethodDecorator} A method decorator that checks ownership authorization.
61
- */
62
- function Owner() {
63
- return function (target, propertyKey, descriptor) {
64
- const originalMethod = descriptor.value;
65
- descriptor.value = async function (...args) {
66
- const ctx = args[0];
67
- const acountId = ctx.clientIdentity.getID();
68
- const select = await this["tokenRepository"].select();
69
- const tokens = await select.execute(ctx);
70
- if (tokens.length == 0) {
71
- throw new db_decorators_1.NotFoundError("No tokens avaialble");
72
- }
73
- if (tokens.length > 1) {
74
- throw new db_decorators_1.NotFoundError(`To many token available : ${tokens.length}`);
75
- }
76
- if (tokens[0].owner != acountId) {
77
- throw new core_1.AuthorizationError(`User not authorized to run ${propertyKey} on the token`);
78
- }
79
- return await originalMethod.apply(this, args);
80
- };
81
- return descriptor;
82
- };
83
- }
84
- async function ownedByOnCreate(context, data, key, model) {
85
- const { stub } = context;
86
- const allowGenerationOverride = context.getOrUndefined("allowGenerationOverride") || false;
87
- const creator = await stub.getCreator();
88
- let owner = creator.mspid;
89
- context.logger.info(`Expected mspid to be ${model[key]} | ${owner}. \n Using allowGenerationOverride: ${allowGenerationOverride}`);
90
- if (allowGenerationOverride)
91
- owner = model[key] ? model[key] : owner;
92
- const setOwnedByKeyValue = function (target, propertyKey, value) {
93
- Object.defineProperty(target, propertyKey, {
94
- enumerable: true,
95
- writable: false,
96
- configurable: true,
97
- value: value,
98
- });
99
- };
100
- setOwnedByKeyValue(model, key, owner);
101
- }
102
- function ownedBy() {
103
- function ownedBy() {
104
- return function (obj, attribute) {
105
- return (0, decoration_1.apply)((0, decorator_validation_1.required)(), (0, db_decorators_1.generated)(), (0, db_decorators_1.readonly)(), (0, db_decorators_1.onCreate)(ownedByOnCreate), (0, decoration_1.propMetadata)(decoration_1.Metadata.key(constants_1.FabricModelKeys.FABRIC, constants_1.FabricModelKeys.OWNED_BY), attribute))(obj, attribute);
106
- };
107
- }
108
- return decoration_1.Decoration.for(constants_1.FabricModelKeys.OWNED_BY)
109
- .define({
110
- decorator: ownedBy,
111
- args: [],
112
- })
113
- .apply();
114
- }
115
- async function transactionIdOnCreate(context, data, key, model) {
116
- const { stub } = context;
117
- model[key] = stub.getTxID();
118
- }
119
- function transactionId() {
120
- function transactionId() {
121
- return function (obj, attribute) {
122
- return (0, decoration_1.apply)((0, decorator_validation_1.required)(), (0, db_decorators_1.readonly)(), (0, db_decorators_1.onCreate)(transactionIdOnCreate), (0, db_decorators_1.onUpdate)(transactionIdOnCreate), (0, decoration_1.propMetadata)(decoration_1.Metadata.key(constants_1.FabricModelKeys.FABRIC, attribute, constants_1.FabricModelKeys.TRANSACTION_ID), attribute))(obj, attribute);
123
- };
124
- }
125
- return decoration_1.Decoration.for(constants_1.FabricModelKeys.TRANSACTION_ID)
126
- .define({
127
- decorator: transactionId,
128
- args: [],
129
- })
130
- .apply();
131
- }
132
- async function evalMirrorMetadata(model, resolver, ctx) {
133
- let collection = resolver;
134
- if (typeof collection !== "string") {
135
- try {
136
- const owner = decorator_validation_1.Model.ownerOf(model) || ctx.get("stub").getCreator().toString();
137
- if (resolver && typeof resolver === "function")
138
- collection = await resolver(model, owner, ctx);
139
- }
140
- catch (e) {
141
- throw new db_decorators_1.InternalError(`Failed to resolve collection mirror name: ${e}`);
142
- }
143
- }
144
- if (!collection || typeof collection !== "string")
145
- throw new db_decorators_1.InternalError(`No collection found model ${model.constructor.name}`);
146
- return collection;
147
- }
148
- async function createMirrorHandler(context, data, key, model) {
149
- const collection = await evalMirrorMetadata(model, data.resolver, context);
150
- const fabricCtx = context;
151
- const sourceModel = model;
152
- // Put mirror flags directly on context so adapter.prepare() and adapter.create() can see them
153
- fabricCtx.put("mirror", true);
154
- fabricCtx.put("mirrorCollection", collection);
155
- try {
156
- const repo = this.override(Object.assign({}, this._overrides, {
157
- mirror: true,
158
- mirrorCollection: collection,
159
- ignoreValidation: true,
160
- ignoreHandlers: true,
161
- }));
162
- const mirror = await repo.create(sourceModel, context);
163
- context.logger.info(`Mirror for ${decorator_validation_1.Model.tableName(this.class)} created with ${decorator_validation_1.Model.pk(model)}: ${mirror[decorator_validation_1.Model.pk(model)]}`);
164
- }
165
- finally {
166
- // Clean up mirror flags from context
167
- fabricCtx.put("mirror", undefined);
168
- fabricCtx.put("mirrorCollection", undefined);
169
- }
170
- }
171
- async function updateMirrorHandler(context, data, key, model) {
172
- const collection = await evalMirrorMetadata(model, data.resolver, context);
173
- const fabricCtx = context;
174
- const sourceModel = model;
175
- fabricCtx.put("mirror", true);
176
- fabricCtx.put("mirrorCollection", collection);
177
- try {
178
- const repo = this.override(Object.assign({}, this._overrides, {
179
- mirror: true,
180
- mirrorCollection: collection,
181
- ignoreValidation: true,
182
- ignoreHandlers: true,
183
- applyUpdateValidation: false,
184
- mergeForUpdate: false,
185
- }));
186
- await repo.update(sourceModel, context);
187
- context.logger.info(`Mirror for ${decorator_validation_1.Model.tableName(this.class)} updated: ${model[decorator_validation_1.Model.pk(model)]}`);
188
- }
189
- finally {
190
- fabricCtx.put("mirror", undefined);
191
- fabricCtx.put("mirrorCollection", undefined);
192
- }
193
- }
194
- async function deleteMirrorHandler(context, data, key, model) {
195
- const collection = await evalMirrorMetadata(model, data.resolver, context);
196
- const fabricCtx = context;
197
- fabricCtx.put("mirror", true);
198
- fabricCtx.put("mirrorCollection", collection);
199
- fabricCtx.put("segregated", collection);
200
- try {
201
- const pkProp = decorator_validation_1.Model.pk(model);
202
- const id = model[pkProp];
203
- const repo = this.override(Object.assign({}, this._overrides, {
204
- segregated: collection,
205
- mirror: true,
206
- ignoreValidation: true,
207
- ignoreHandlers: true,
208
- }));
209
- try {
210
- await repo.delete(id, context);
211
- }
212
- catch {
213
- // May already be deleted by adapter.deleteSegregatedCollections
214
- }
215
- context.logger.info(`Mirror for ${decorator_validation_1.Model.tableName(this.class)} deleted: ${String(id)}`);
216
- }
217
- finally {
218
- fabricCtx.put("mirror", undefined);
219
- fabricCtx.put("mirrorCollection", undefined);
220
- fabricCtx.put("segregated", undefined);
221
- }
222
- }
223
- async function mirrorWriteGuard(context, data,
224
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
225
- key,
226
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
227
- model) {
228
- const msp = extractMspId(context.get("identity"));
229
- if (!msp)
230
- return;
231
- if (msp === data.mspId || (data.condition && data.condition(msp))) {
232
- throw new core_1.AuthorizationError(`Organization ${msp} is not authorized to modify mirrored data`);
233
- }
234
- }
235
- async function readMirrorHandler(context, data, key, model) {
236
- const msp = extractMspId(context.get("identity"));
237
- if (!msp)
238
- return;
239
- const collection = await evalMirrorMetadata(model, data.resolver, context);
240
- const fabricCtx = context;
241
- const matches = msp === data.mspId || (data.condition && data.condition(msp));
242
- if (matches) {
243
- context.logger.info(`Mirror read: MSP ${msp} matches, routing reads to mirror collection ${collection}`);
244
- // Route reads exclusively through the mirror collection
245
- fabricCtx.put("mirror", true);
246
- fabricCtx.put("mirrorCollection", collection);
247
- fabricCtx.put("fullySegregated", true);
248
- fabricCtx.readFrom(collection);
249
- }
250
- // When MSP does NOT match, normal read flow — all data is in public state
251
- }
252
- function mirror(collection, mspIdOrCondition, condition) {
253
- const isConditionOnly = typeof mspIdOrCondition !== "string" && Boolean(mspIdOrCondition);
254
- const mspId = isConditionOnly
255
- ? undefined
256
- : mspIdOrCondition;
257
- const cond = isConditionOnly
258
- ? mspIdOrCondition
259
- : condition;
260
- function mirror(resolver, mspId, condition) {
261
- const meta = {
262
- condition: condition,
263
- mspId: mspId,
264
- resolver: resolver,
265
- };
266
- return (0, decoration_1.apply)((0, decoration_1.metadata)(decoration_1.Metadata.key(constants_1.FabricModelKeys.FABRIC, constants_1.FabricModelKeys.MIRROR), meta),
267
- // Read handler runs early (priority 30) to set up context before any reads
268
- (0, db_decorators_1.onRead)(readMirrorHandler, meta, { priority: 30 }),
269
- // Write guards — reject matching MSPs before any processing
270
- (0, db_decorators_1.onCreate)(mirrorWriteGuard, meta, { priority: 20 }), (0, db_decorators_1.onUpdate)(mirrorWriteGuard, meta, { priority: 20 }), (0, db_decorators_1.onDelete)(mirrorWriteGuard, meta, { priority: 20 }),
271
- // Mirror sync handlers — write full model after other handlers (priority 100)
272
- (0, db_decorators_1.onCreate)(createMirrorHandler, meta, { priority: 100 }), (0, db_decorators_1.onUpdate)(updateMirrorHandler, meta, { priority: 100 }), (0, db_decorators_1.onDelete)(deleteMirrorHandler, meta, { priority: 100 }));
273
- }
274
- return decoration_1.Decoration.for(constants_1.FabricModelKeys.MIRROR)
275
- .define({
276
- decorator: mirror,
277
- args: [collection, mspId, cond],
278
- })
279
- .apply();
280
- }
281
- const ModelCollection = (model, mspId) => {
282
- const orgName = mspId || (typeof model !== "function" ? decorator_validation_1.Model.ownerOf(model) : undefined);
283
- const constr = typeof model === "function" ? model : model.constructor;
284
- if (!orgName)
285
- throw new db_decorators_1.InternalError(`Model ${constr.name} is not owned by any organization. did you use @ownedBy() (or provide the name)?`);
286
- return `${(0, logging_1.toPascalCase)(constr.name)}${orgName ? (0, logging_1.toPascalCase)(orgName) : ""}`;
287
- };
288
- exports.ModelCollection = ModelCollection;
289
- function NamespaceCollection(namespace) {
290
- return (model, mspId) => {
291
- const orgName = mspId || (typeof model !== "function" ? decorator_validation_1.Model.ownerOf(model) : undefined);
292
- const constr = typeof model === "function" ? model : model.constructor;
293
- if (!orgName)
294
- throw new db_decorators_1.InternalError(`Model ${constr.name} is not owned by any organization. did you use @ownedBy() (or provide the name)?`);
295
- return `${namespace}${orgName ? (0, logging_1.toPascalCase)(orgName) : ""}`;
296
- };
297
- }
298
- const ImplicitPrivateCollection = (model, mspId) => {
299
- const orgName = mspId || (typeof model !== "function" ? decorator_validation_1.Model.ownerOf(model) : undefined);
300
- if (!orgName)
301
- throw new db_decorators_1.InternalError(`Model ${model.constructor.name} is not owned by any organization. did you use @ownedBy() (or provide the name)?`);
302
- return `__${(0, logging_1.toPascalCase)(orgName)}PrivateCollection`;
303
- };
304
- exports.ImplicitPrivateCollection = ImplicitPrivateCollection;
305
- /**
306
- * @description Priority for early collection extraction (before pk generation at priority 60)
307
- * @summary This priority ensures collections are registered in context before any sequence
308
- * operations occur, allowing sequences to be replicated to private/shared collections.
309
- */
310
- exports.SEGREGATED_COLLECTION_EXTRACTION_PRIORITY = 35;
311
- function applySegregationFlags(clazz, collections, ctx) {
312
- // Register collections early using readFrom - this allows sequence code
313
- // to know which collections to replicate to during pk generation
314
- if (collections.length > 0) {
315
- ctx.readFrom(collections);
316
- }
317
- // Check if model is fully segregated (all non-pk properties are private/shared/transient).
318
- // Use Model.segregate() which is the canonical way to determine what's transient,
319
- // rather than reading DBKeys.TRANSIENT metadata which may not accumulate correctly
320
- // when class-level @privateData applies decorators iteratively.
321
- if (!ctx.isFullySegregated && collections.length) {
322
- if (!hasPublicProperties(clazz.constructor)) {
323
- ctx.markFullySegregated();
324
- }
325
- }
326
- }
327
- async function applyMirrorFlags(clazz, msp, ctx) {
328
- if (!msp)
329
- return;
330
- const mirrorMeta = decorator_validation_1.Model.mirroredAt(clazz);
331
- if (!mirrorMeta)
332
- return;
333
- const matches = msp === mirrorMeta.mspId ||
334
- (mirrorMeta.condition && mirrorMeta.condition(msp));
335
- if (!matches)
336
- return;
337
- const collection = await evalMirrorMetadata(new clazz(), mirrorMeta.resolver, ctx);
338
- // Mirror MSP matches — route reads exclusively through the mirror
339
- // collection. Clear any previously registered collections so queries
340
- // go ONLY to the mirror, not to the regular private/shared ones.
341
- ctx.put("segregateRead", undefined);
342
- ctx.put("segregateReadStack", undefined);
343
- ctx.put("fullySegregated", true);
344
- ctx.put("mirror", true);
345
- ctx.put("mirrorCollection", collection);
346
- ctx.readFrom(collection);
347
- }
348
- function hasPublicProperties(clazz) {
349
- const attributes = decoration_1.Metadata.getAttributes(clazz) || [];
350
- const pk = decorator_validation_1.Model.pk(clazz);
351
- const transientMeta = decoration_1.Metadata.get(clazz, db_decorators_1.DBKeys.TRANSIENT) || {};
352
- const privateMeta = decoration_1.Metadata.get(clazz, decoration_1.Metadata.key(constants_1.FabricModelKeys.PRIVATE)) || {};
353
- const sharedMeta = decoration_1.Metadata.get(clazz, decoration_1.Metadata.key(constants_1.FabricModelKeys.SHARED)) || {};
354
- return attributes.some((attr) => {
355
- if (attr === pk)
356
- return false;
357
- if (attr in transientMeta)
358
- return false;
359
- if (attr in privateMeta)
360
- return false;
361
- if (attr in sharedMeta)
362
- return false;
363
- return true;
364
- });
365
- }
366
- /**
367
- * @description Early handler to extract and register collections in context
368
- * @summary Runs with priority < 40 to extract collection names before pk generation (priority 60).
369
- * This allows FabricContractSequence to know which collections to replicate to.
370
- * @template M - Type that extends Model
371
- * @param {ContextOf<Repository<M, any>>} context - The execution context
372
- * @param {SegregatedDataMetadata | SegregatedDataMetadata[]} data - The segregated data metadata
373
- * @param {string | string[]} keys - The property key(s) being segregated
374
- * @param {M} model - The model instance
375
- * @return {Promise<void>}
376
- */
377
- async function extractSegregatedCollections(context, data, keys, model) {
378
- const dataArray = (Array.isArray(data) ? data : [data]);
379
- const m = context.getOrUndefined("allowGenerationOverride") || false
380
- ? context.getOrUndefined("ownerOverride")
381
- : undefined;
382
- const msp = m || decorator_validation_1.Model.ownerOf(model) || extractMspId(context.get("identity"));
383
- if (!msp) {
384
- // Can't extract collections without MSP, will be caught by later handlers
385
- return;
386
- }
387
- const collections = [];
388
- for (const metadata of dataArray) {
389
- const collectionResolver = metadata.collections;
390
- const collection = typeof collectionResolver === "string"
391
- ? collectionResolver
392
- : collectionResolver(model, msp, context);
393
- if (collection && !collections.includes(collection)) {
394
- collections.push(collection);
395
- }
396
- }
397
- applySegregationFlags(model, collections, context);
398
- // Store segregation metadata per-sequence so FabricContractSequence can decide
399
- // where to store/replicate sequence records (public vs private/shared).
400
- //
401
- // - `@pk()` sequences use the shared name `${table}_pk` (no id component).
402
- // - `@sequence()` / persistent `@version(true)` sequences are per-model-instance:
403
- // `${table}_${id}_${property}`.
404
- const keyArray = (Array.isArray(keys) ? keys : [keys]);
405
- const pkKey = decorator_validation_1.Model.pk(model.constructor);
406
- const pkSeqName = decorator_validation_1.Model.sequenceName(model, "pk");
407
- const idValue = model[pkKey];
408
- const canBuildPerInstance = typeof idValue !== "undefined" && idValue !== null;
409
- // Always union collections for the pk sequence when the model uses segregated data.
410
- context.setSequenceSegregation(pkSeqName, context.isFullySegregated, collections);
411
- // For per-property sequences, only register when we can compute an id-scoped name.
412
- // This keeps sequences constrained to the collections the attribute exists in.
413
- if (canBuildPerInstance) {
414
- for (const k of keyArray) {
415
- const propSeqName = decorator_validation_1.Model.sequenceName(model, String(idValue), String(k));
416
- context.setSequenceSegregation(propSeqName, context.isFullySegregated, collections);
417
- }
418
- }
419
- }
420
- async function segregatedDataOnCreate(context, data, keys, model) {
421
- const dataArray = (Array.isArray(data) ? data : [data]);
422
- const keyArray = (Array.isArray(keys) ? keys : [keys]);
423
- if (keyArray.length !== dataArray.length)
424
- throw new db_decorators_1.InternalError(`Segregated data keys and metadata length mismatch`);
425
- const msp = decorator_validation_1.Model.ownerOf(model) ||
426
- extractMspId(context.get("identity"));
427
- if (!msp)
428
- throw new db_decorators_1.ValidationError(`There's no assigned organization for model ${model.constructor.name}`);
429
- const collectionResolver = dataArray[0].collections;
430
- const collection = typeof collectionResolver === "string"
431
- ? collectionResolver
432
- : collectionResolver(model, msp, context);
433
- // Validate all keys resolve to the same collection
434
- keyArray.forEach((_k, i) => {
435
- const c = typeof dataArray[i].collections === "string"
436
- ? dataArray[i].collections
437
- : dataArray[i].collections(model, msp, context);
438
- if (c !== collection)
439
- throw new core_1.UnsupportedError(`Segregated data collection mismatch: ${c} vs ${collection}`);
440
- });
441
- const keyStrings = keyArray.map((key) => String(key));
442
- // Store the segregated model — prepare() will filter to collection-specific fields
443
- context.writeTo(collection, keyStrings);
444
- }
445
- async function segregatedDataOnRead(context, data, keys, model) {
446
- const dataArray = (Array.isArray(data) ? data : [data]);
447
- const keyArray = (Array.isArray(keys) ? keys : [keys]);
448
- if (keyArray.length !== dataArray.length)
449
- throw new db_decorators_1.InternalError(`Segregated data keys and metadata length mismatch`);
450
- const m = context.getOrUndefined("allowGenerationOverride") || false
451
- ? context.getOrUndefined("ownerOverride")
452
- : undefined;
453
- const msp = m || decorator_validation_1.Model.ownerOf(model) || extractMspId(context.get("identity"));
454
- if (!msp)
455
- throw new db_decorators_1.ValidationError(`There's no assigned organization for model ${model.constructor.name}`);
456
- const collectionResolver = dataArray[0].collections;
457
- const collection = typeof collectionResolver === "string"
458
- ? collectionResolver
459
- : await collectionResolver(model, msp, context);
460
- context.readFrom(collection);
461
- }
462
- async function segregatedDataOnUpdate(context, data, key, model,
463
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
464
- oldModel) {
465
- const dataArray = (Array.isArray(data) ? data : [data]);
466
- const keyArray = (Array.isArray(key) ? key : [key]);
467
- if (keyArray.length !== dataArray.length)
468
- throw new db_decorators_1.InternalError(`Segregated data keys and metadata length mismatch`);
469
- const msp = decorator_validation_1.Model.ownerOf(model) ||
470
- extractMspId(context.get("identity"));
471
- if (!msp)
472
- throw new db_decorators_1.ValidationError(`There's no assigned organization for model ${model.constructor.name}`);
473
- const collectionResolver = dataArray[0].collections;
474
- const collection = typeof collectionResolver === "string"
475
- ? collectionResolver
476
- : collectionResolver(model, msp, context);
477
- keyArray.forEach((k, i) => {
478
- const c = typeof dataArray[i].collections === "string"
479
- ? dataArray[i].collections
480
- : dataArray[i].collections(model, msp, context);
481
- if (c !== collection)
482
- throw new core_1.UnsupportedError(`Segregated data collection mismatch: ${c} vs ${collection}`);
483
- });
484
- const keyStrings = keyArray.map((key) => String(key));
485
- // Store the original model — prepare() will filter to collection-specific fields
486
- context.writeTo(collection, keyStrings);
487
- }
488
- async function segregatedDataOnDelete(context, data, key, model) {
489
- const dataArray = (Array.isArray(data) ? data : [data]);
490
- const keyArray = (Array.isArray(key) ? key : [key]);
491
- if (keyArray.length !== dataArray.length)
492
- throw new db_decorators_1.InternalError(`Segregated data keys and metadata length mismatch`);
493
- const m = context.getOrUndefined("allowGenerationOverride") || false
494
- ? context.getOrUndefined("ownerOverride")
495
- : undefined;
496
- const msp = m ||
497
- decorator_validation_1.Model.ownerOf(model) ||
498
- extractMspId(context.get("identity"));
499
- if (!msp)
500
- throw new db_decorators_1.ValidationError(`There's no assigned organization for model ${model.constructor.name}`);
501
- const collectionResolver = dataArray[0].collections;
502
- const collection = typeof collectionResolver === "string"
503
- ? collectionResolver
504
- : collectionResolver(model, msp, context);
505
- context.readFrom(collection);
506
- }
507
- function segregated(collection, type, filter) {
508
- return function innerSegregated(target, propertyKey) {
509
- function segregatedDec(target, propertyKey) {
510
- const key = decoration_1.Metadata.key(type, propertyKey);
511
- const constr = target.constructor;
512
- const meta = decoration_1.Metadata.get(constr, key) || {};
513
- const collections = new Set(meta.collections || []);
514
- collections.add(collection);
515
- meta.collections = [...collections];
516
- decoration_1.Metadata.set(constr, key, meta);
517
- const constrMeta = decoration_1.Metadata.get(constr, type) || {};
518
- const constrCollections = new Set(constrMeta.collections || []);
519
- constrCollections.add(collection);
520
- constrMeta.collections = [...constrCollections];
521
- decoration_1.Metadata.set(constr, type, constrMeta);
522
- const transientMeta = decoration_1.Metadata.get(constr, db_decorators_1.DBKeys.TRANSIENT) || {};
523
- const updatedTransientMeta = {
524
- ...transientMeta,
525
- [propertyKey]: {},
526
- };
527
- decoration_1.Metadata.set(constr, db_decorators_1.DBKeys.TRANSIENT, updatedTransientMeta);
528
- }
529
- const decs = [];
530
- if (!propertyKey) {
531
- // decorated at the class level
532
- const properties = decoration_1.Metadata.getAttributes(target);
533
- properties?.forEach((p) => {
534
- if (!filter || filter(p)) {
535
- segregated(collection, type)(target.prototype, p);
536
- }
537
- });
538
- return target;
539
- }
540
- else {
541
- const groupName = typeof collection === "string" ? collection : collection.toString();
542
- // Use different group names for extraction vs data handlers to prevent merging
543
- const extractGroupName = `${groupName}:extract`;
544
- const dataGroupName = `${groupName}:data`;
545
- const earlyExtractionMeta = { collections: collection };
546
- const earlyExtractionGroupSort = {
547
- priority: exports.SEGREGATED_COLLECTION_EXTRACTION_PRIORITY,
548
- group: extractGroupName,
549
- };
550
- decs.push((0, decoration_1.prop)(), (0, db_decorators_1.transient)(), segregatedDec,
551
- // Early extraction handlers - run BEFORE pk generation (priority 60)
552
- // This ensures collections are registered in context for sequence replication
553
- // We register for each operation explicitly to ensure proper handler lookup
554
- (0, db_decorators_1.on)(db_decorators_1.DBOperations.ALL, extractSegregatedCollections, earlyExtractionMeta, earlyExtractionGroupSort),
555
- // Main handlers for segregated data operations (priority 95)
556
- (0, db_decorators_1.onCreate)(segregatedDataOnCreate, { collections: collection }, {
557
- priority: 95,
558
- group: dataGroupName,
559
- }), (0, db_decorators_1.onRead)(segregatedDataOnRead, { collections: collection }, {
560
- priority: 95,
561
- group: dataGroupName,
562
- }), (0, db_decorators_1.onUpdate)(segregatedDataOnUpdate, { collections: collection }, {
563
- priority: 95,
564
- group: dataGroupName,
565
- }), (0, db_decorators_1.onDelete)(segregatedDataOnDelete, { collections: collection }, {
566
- priority: 95,
567
- group: dataGroupName,
568
- }));
569
- }
570
- return (0, decoration_1.apply)(...decs)(target, propertyKey);
571
- };
572
- }
573
- function privateData(collection = exports.ImplicitPrivateCollection) {
574
- function privateData(collection) {
575
- return segregated(collection, constants_1.FabricModelKeys.PRIVATE);
576
- }
577
- return decoration_1.Decoration.for(constants_1.FabricModelKeys.PRIVATE)
578
- .define({
579
- decorator: privateData,
580
- args: [collection],
581
- })
582
- .apply();
583
- }
584
- function sharedData(collection) {
585
- function sharedData(collection) {
586
- return segregated(collection, constants_1.FabricModelKeys.SHARED);
587
- }
588
- return decoration_1.Decoration.for(constants_1.FabricModelKeys.SHARED)
589
- .define({
590
- decorator: sharedData,
591
- args: [collection],
592
- })
593
- .apply();
594
- }
595
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zaGFyZWQvZGVjb3JhdG9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFnREEsb0NBTUM7QUFrQkQsc0JBd0NDO0FBRUQsMENBc0NDO0FBRUQsMEJBc0JDO0FBRUQsc0RBYUM7QUFFRCxzQ0EwQkM7QUFVRCxnREFzQkM7QUFFRCxrREFrQ0M7QUFFRCxrREFrQ0M7QUFFRCxrREF1Q0M7QUFFRCw0Q0FxQkM7QUFFRCw4Q0ErQkM7QUFFRCx3QkFnREM7QUFzQkQsa0RBV0M7QUEwQkQsc0RBb0JDO0FBRUQsNENBMEJDO0FBK0JELG9FQXNFQztBQUVELHdEQStDQztBQUVELG9EQW1DQztBQUVELHdEQWdEQztBQUVELHdEQXlDQztBQThHRCxrQ0FhQztBQUVELGdDQVdDO0FBaitCRCx5Q0FPd0I7QUFDeEIsMkRBY2lDO0FBQ2pDLHlFQUFpRTtBQUNqRSwrQ0FBOEM7QUFJOUMscURBUThCO0FBRTlCLCtDQUFpRDtBQUVqRCxpQ0FBNkI7QUFHN0I7Ozs7R0FJRztBQUNILFNBQWdCLFlBQVksQ0FDMUIsUUFBNkM7SUFFN0MsSUFBSSxDQUFDLFFBQVE7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNoQyxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVE7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUNsRCxPQUFPLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUM3QixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsU0FBZ0IsS0FBSztJQUNuQixPQUFPLFVBQ0wsTUFBVyxFQUNYLFdBQW1CLEVBQ25CLFVBQThCO1FBRTlCLE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFFeEMsVUFBVSxDQUFDLEtBQUssR0FBRyxLQUFLLFdBRXRCLEdBQUcsSUFBVztZQUVkLE1BQU0sR0FBRyxHQUFjLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQixNQUFN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SUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDO0tBQ25CLENBQUM7U0FDRCxLQUFLLEVBQUUsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBdXRob3JpemF0aW9uRXJyb3IsXG4gIFJlcG8sXG4gIENvbnRleHQsXG4gIFVuc3VwcG9ydGVkRXJyb3IsXG4gIFJlcG9zaXRvcnksXG4gIENvbnRleHRPZixcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQge1xuICBnZW5lcmF0ZWQsXG4gIEludGVybmFsRXJyb3IsXG4gIE5vdEZvdW5kRXJyb3IsXG4gIG9uQ3JlYXRlLFxuICBvbkRlbGV0ZSxcbiAgb25SZWFkLFxuICBvblVwZGF0ZSxcbiAgcmVhZG9ubHksXG4gIHRyYW5zaWVudCxcbiAgVmFsaWRhdGlvbkVycm9yLFxuICBEQktleXMsXG4gIERCT3BlcmF0aW9ucyxcbiAgb24sXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTW9kZWwsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljTW9kZWxLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQgYXMgSExDb250ZXh0IH0gZnJvbSBcImZhYnJpYy1jb250cmFjdC1hcGlcIjtcbmltcG9ydCB7IENsaWVudElkZW50aXR5IH0gZnJvbSBcImZhYnJpYy1zaGltLWFwaVwiO1xuaW1wb3J0IHsgRmFicmljRVJDMjBDb250cmFjdCB9IGZyb20gXCIuLi9jb250cmFjdHMvZXJjMjAvZXJjMjBjb250cmFjdFwiO1xuaW1wb3J0IHtcbiAgYXBwbHksXG4gIENvbnN0cnVjdG9yLFxuICBEZWNvcmF0aW9uLFxuICBtZXRhZGF0YSxcbiAgTWV0YWRhdGEsXG4gIHByb3AsXG4gIHByb3BNZXRhZGF0YSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyB0b1Bhc2NhbENhc2UgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IEZhYnJpY0NvbnRyYWN0RmxhZ3MgfSBmcm9tIFwiLi4vY29udHJhY3RzL3R5cGVzXCI7XG5pbXBvcnQgXCIuLi9zaGFyZWQvb3ZlcnJpZGVzXCI7XG5pbXBvcnQgeyB0eXBlIEZhYnJpY0NvbnRyYWN0Q29udGV4dCB9IGZyb20gXCIuLi9jb250cmFjdHMvQ29udHJhY3RDb250ZXh0XCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEV4dHJhY3RzIHRoZSBNU1AgSUQgZnJvbSBlaXRoZXIgYSBzdHJpbmcgb3IgQ2xpZW50SWRlbnRpdHkgb2JqZWN0XG4gKiBAcGFyYW0gaWRlbnRpdHkgLSBUaGUgaWRlbnRpdHkgdmFsdWUgd2hpY2ggY2FuIGJlIGEgc3RyaW5nIE1TUCBJRCBvciBDbGllbnRJZGVudGl0eSBvYmplY3RcbiAqIEByZXR1cm5zIFRoZSBNU1AgSUQgYXMgYSBzdHJpbmcsIG9yIHVuZGVmaW5lZCBpZiBub3QgYXZhaWxhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0TXNwSWQoXG4gIGlkZW50aXR5OiBzdHJpbmcgfCBDbGllbnRJZGVudGl0eSB8IHVuZGVmaW5lZFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFpZGVudGl0eSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHR5cGVvZiBpZGVudGl0eSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGlkZW50aXR5O1xuICByZXR1cm4gaWRlbnRpdHkuZ2V0TVNQSUQoKTtcbn1cblxuLyoqXG4gKiBEZWNvcmF0b3IgZm9yIG1hcmtpbmcgbWV0aG9kcyB0aGF0IHJlcXVpcmUgb3duZXJzaGlwIGF1dGhvcml6YXRpb24uXG4gKiBDaGVja3MgdGhlIG93bmVyIG9mIHRoZSB0b2tlbiBiZWZvcmUgYWxsb3dpbmcgdGhlIG1ldGhvZCB0byBiZSBleGVjdXRlZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVG9rZW5Db250cmFjdCBleHRlbmRzIENvbnRyYWN0IHtcbiAqICAgQE93bmVyKClcbiAqICAgYXN5bmMgTWludChjdHg6IENvbnRleHQsIGFtb3VudDogbnVtYmVyKSB7XG4gKiAgICAgLy8gTWludCB0b2tlbiBsb2dpY1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcmV0dXJucyB7TWV0aG9kRGVjb3JhdG9yfSBBIG1ldGhvZCBkZWNvcmF0b3IgdGhhdCBjaGVja3Mgb3duZXJzaGlwIGF1dGhvcml6YXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPd25lcigpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChcbiAgICB0YXJnZXQ6IGFueSxcbiAgICBwcm9wZXJ0eUtleTogc3RyaW5nLFxuICAgIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvclxuICApIHtcbiAgICBjb25zdCBvcmlnaW5hbE1ldGhvZCA9IGRlc2NyaXB0b3IudmFsdWU7XG5cbiAgICBkZXNjcmlwdG9yLnZhbHVlID0gYXN5bmMgZnVuY3Rpb24gKFxuICAgICAgdGhpczogRmFicmljRVJDMjBDb250cmFjdCxcbiAgICAgIC4uLmFyZ3M6IGFueVtdXG4gICAgKSB7XG4gICAgICBjb25zdCBjdHg6IEhMQ29udGV4dCA9IGFyZ3NbMF07XG4gICAgICBjb25zdCBhY291bnRJZCA9IGN0eC5jbGllbnRJZGVudGl0eS5nZXRJRCgpO1xuXG4gICAgICBjb25zdCBzZWxlY3QgPSBhd2FpdCAodGhpcyBhcyBGYWJyaWNFUkMyMENvbnRyYWN0KVtcbiAgICAgICAgXCJ0b2tlblJlcG9zaXRvcnlcIlxuICAgICAgXS5zZWxlY3QoKTtcblxuICAgICAgY29uc3QgdG9rZW5zID0gYXdhaXQgc2VsZWN0LmV4ZWN1dGUoY3R4KTtcblxuICAgICAgaWYgKHRva2Vucy5sZW5ndGggPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcIk5vIHRva2VucyBhdmFpYWxibGVcIik7XG4gICAgICB9XG5cbiAgICAgIGlmICh0b2tlbnMubGVuZ3RoID4gMSkge1xuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihgVG8gbWFueSB0b2tlbiBhdmFpbGFibGUgOiAke3Rva2Vucy5sZW5ndGh9YCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0b2tlbnNbMF0ub3duZXIgIT0gYWNvdW50SWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEF1dGhvcml6YXRpb25FcnJvcihcbiAgICAgICAgICBgVXNlciBub3QgYXV0aG9yaXplZCB0byBydW4gJHtwcm9wZXJ0eUtleX0gb24gdGhlIHRva2VuYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgb3JpZ2luYWxNZXRob2QuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfTtcblxuICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb3duZWRCeU9uQ3JlYXRlPFxuICBNIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4sXG4gIFIgZXh0ZW5kcyBSZXBvPE0+LFxuICBWLFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dE9mPFI+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBzdHViIH0gPSBjb250ZXh0IGFzIGFueTtcblxuICBjb25zdCBhbGxvd0dlbmVyYXRpb25PdmVycmlkZSA9XG4gICAgY29udGV4dC5nZXRPclVuZGVmaW5lZChcImFsbG93R2VuZXJhdGlvbk92ZXJyaWRlXCIpIHx8IGZhbHNlO1xuXG4gIGNvbnN0IGNyZWF0b3IgPSBhd2FpdCBzdHViLmdldENyZWF0b3IoKTtcbiAgbGV0IG93bmVyID0gY3JlYXRvci5tc3BpZDtcbiAgY29udGV4dC5sb2dnZXIuaW5mbyhcbiAgICBgRXhwZWN0ZWQgbXNwaWQgdG8gYmUgJHttb2RlbFtrZXldfSB8ICR7b3duZXJ9LiBcXG4gVXNpbmcgYWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGU6ICR7YWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGV9YFxuICApO1xuXG4gIGlmIChhbGxvd0dlbmVyYXRpb25PdmVycmlkZSkgb3duZXIgPSBtb2RlbFtrZXldID8gbW9kZWxba2V5XSA6IG93bmVyO1xuXG4gIGNvbnN0IHNldE93bmVkQnlLZXlWYWx1ZSA9IGZ1bmN0aW9uIDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHRhcmdldDogTSxcbiAgICBwcm9wZXJ0eUtleTogc3RyaW5nLFxuICAgIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnRcbiAgKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIHtcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgfSk7XG4gIH07XG5cbiAgc2V0T3duZWRCeUtleVZhbHVlKG1vZGVsLCBrZXkgYXMgc3RyaW5nLCBvd25lcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvd25lZEJ5KCkge1xuICBmdW5jdGlvbiBvd25lZEJ5KCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAob2JqOiBhbnksIGF0dHJpYnV0ZT86IGFueSkge1xuICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICByZXF1aXJlZCgpLFxuICAgICAgICBnZW5lcmF0ZWQoKSxcbiAgICAgICAgcmVhZG9ubHkoKSxcbiAgICAgICAgb25DcmVhdGUob3duZWRCeU9uQ3JlYXRlKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKFxuICAgICAgICAgIE1ldGFkYXRhLmtleShGYWJyaWNNb2RlbEtleXMuRkFCUklDLCBGYWJyaWNNb2RlbEtleXMuT1dORURfQlkpLFxuICAgICAgICAgIGF0dHJpYnV0ZVxuICAgICAgICApXG4gICAgICApKG9iaiwgYXR0cmlidXRlKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKEZhYnJpY01vZGVsS2V5cy5PV05FRF9CWSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogb3duZWRCeSxcbiAgICAgIGFyZ3M6IFtdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0cmFuc2FjdGlvbklkT25DcmVhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbDxib29sZWFuPixcbiAgUiBleHRlbmRzIFJlcG88TT4sXG4gIFYsXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0T2Y8Uj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHN0dWIgfSA9IGNvbnRleHQgYXMgYW55O1xuICBtb2RlbFtrZXldID0gc3R1Yi5nZXRUeElEKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2FjdGlvbklkKCkge1xuICBmdW5jdGlvbiB0cmFuc2FjdGlvbklkKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAob2JqOiBhbnksIGF0dHJpYnV0ZT86IGFueSkge1xuICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICByZXF1aXJlZCgpLFxuICAgICAgICByZWFkb25seSgpLFxuICAgICAgICBvbkNyZWF0ZSh0cmFuc2FjdGlvbklkT25DcmVhdGUpLFxuICAgICAgICBvblVwZGF0ZSh0cmFuc2FjdGlvbklkT25DcmVhdGUpLFxuICAgICAgICBwcm9wTWV0YWRhdGEoXG4gICAgICAgICAgTWV0YWRhdGEua2V5KFxuICAgICAgICAgICAgRmFicmljTW9kZWxLZXlzLkZBQlJJQyxcbiAgICAgICAgICAgIGF0dHJpYnV0ZSxcbiAgICAgICAgICAgIEZhYnJpY01vZGVsS2V5cy5UUkFOU0FDVElPTl9JRFxuICAgICAgICAgICksXG4gICAgICAgICAgYXR0cmlidXRlXG4gICAgICAgIClcbiAgICAgICkob2JqLCBhdHRyaWJ1dGUpO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3IoRmFicmljTW9kZWxLZXlzLlRSQU5TQUNUSU9OX0lEKVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiB0cmFuc2FjdGlvbklkLFxuICAgICAgYXJnczogW10sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuZXhwb3J0IHR5cGUgTWlycm9yQ29uZGl0aW9uID0gKG1zcDogc3RyaW5nKSA9PiBib29sZWFuO1xuXG5leHBvcnQgdHlwZSBNaXJyb3JNZXRhZGF0YSA9IHtcbiAgY29uZGl0aW9uPzogTWlycm9yQ29uZGl0aW9uO1xuICByZXNvbHZlcjogQ29sbGVjdGlvblJlc29sdmVyIHwgc3RyaW5nO1xuICBtc3BJZDogc3RyaW5nO1xufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV2YWxNaXJyb3JNZXRhZGF0YTxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSxcbiAgcmVzb2x2ZXI6IHVuZGVmaW5lZCB8IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcixcbiAgY3R4OiBDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+XG4pIHtcbiAgbGV0IGNvbGxlY3Rpb246IENvbGxlY3Rpb25SZXNvbHZlciB8IHN0cmluZyB8IHVuZGVmaW5lZCA9IHJlc29sdmVyO1xuICBpZiAodHlwZW9mIGNvbGxlY3Rpb24gIT09IFwic3RyaW5nXCIpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3duZXIgPVxuICAgICAgICBNb2RlbC5vd25lck9mKG1vZGVsKSB8fCBjdHguZ2V0KFwic3R1YlwiKS5nZXRDcmVhdG9yKCkudG9TdHJpbmcoKTtcbiAgICAgIGlmIChyZXNvbHZlciAmJiB0eXBlb2YgcmVzb2x2ZXIgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgY29sbGVjdGlvbiA9IGF3YWl0IHJlc29sdmVyKG1vZGVsLCBvd25lciwgY3R4KTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgRmFpbGVkIHRvIHJlc29sdmUgY29sbGVjdGlvbiBtaXJyb3IgbmFtZTogJHtlfWApO1xuICAgIH1cbiAgfVxuXG4gIGlmICghY29sbGVjdGlvbiB8fCB0eXBlb2YgY29sbGVjdGlvbiAhPT0gXCJzdHJpbmdcIilcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBObyBjb2xsZWN0aW9uIGZvdW5kIG1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX1gXG4gICAgKTtcbiAgcmV0dXJuIGNvbGxlY3Rpb247XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVNaXJyb3JIYW5kbGVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIGFueT4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+LFxuICBkYXRhOiBNaXJyb3JNZXRhZGF0YSxcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNvbGxlY3Rpb24gPSBhd2FpdCBldmFsTWlycm9yTWV0YWRhdGEobW9kZWwsIGRhdGEucmVzb2x2ZXIsIGNvbnRleHQpO1xuICBjb25zdCBmYWJyaWNDdHggPSBjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dDtcbiAgY29uc3Qgc291cmNlTW9kZWwgPSBtb2RlbDtcbiAgLy8gUHV0IG1pcnJvciBmbGFncyBkaXJlY3RseSBvbiBjb250ZXh0IHNvIGFkYXB0ZXIucHJlcGFyZSgpIGFuZCBhZGFwdGVyLmNyZWF0ZSgpIGNhbiBzZWUgdGhlbVxuICBmYWJyaWNDdHgucHV0KFwibWlycm9yXCIgYXMgYW55LCB0cnVlKTtcbiAgZmFicmljQ3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIGNvbGxlY3Rpb24pO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcG8gPSB0aGlzLm92ZXJyaWRlKFxuICAgICAgT2JqZWN0LmFzc2lnbih7fSwgKHRoaXMgYXMgYW55KS5fb3ZlcnJpZGVzLCB7XG4gICAgICAgIG1pcnJvcjogdHJ1ZSxcbiAgICAgICAgbWlycm9yQ29sbGVjdGlvbjogY29sbGVjdGlvbixcbiAgICAgICAgaWdub3JlVmFsaWRhdGlvbjogdHJ1ZSxcbiAgICAgICAgaWdub3JlSGFuZGxlcnM6IHRydWUsXG4gICAgICB9IGFzIGFueSlcbiAgICApO1xuICAgIGNvbnN0IG1pcnJvciA9IGF3YWl0IHJlcG8uY3JlYXRlKHNvdXJjZU1vZGVsLCBjb250ZXh0KTtcbiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKFxuICAgICAgYE1pcnJvciBmb3IgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IGNyZWF0ZWQgd2l0aCAke01vZGVsLnBrKG1vZGVsKSBhcyBzdHJpbmd9OiAke21pcnJvcltNb2RlbC5wayhtb2RlbCldfWBcbiAgICApO1xuICB9IGZpbmFsbHkge1xuICAgIC8vIENsZWFuIHVwIG1pcnJvciBmbGFncyBmcm9tIGNvbnRleHRcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yXCIgYXMgYW55LCB1bmRlZmluZWQpO1xuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCB1bmRlZmluZWQpO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVNaXJyb3JIYW5kbGVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIGFueT4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+LFxuICBkYXRhOiBNaXJyb3JNZXRhZGF0YSxcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNvbGxlY3Rpb24gPSBhd2FpdCBldmFsTWlycm9yTWV0YWRhdGEobW9kZWwsIGRhdGEucmVzb2x2ZXIsIGNvbnRleHQpO1xuICBjb25zdCBmYWJyaWNDdHggPSBjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dDtcbiAgY29uc3Qgc291cmNlTW9kZWwgPSBtb2RlbDtcbiAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdHJ1ZSk7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXBvID0gdGhpcy5vdmVycmlkZShcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sICh0aGlzIGFzIGFueSkuX292ZXJyaWRlcywge1xuICAgICAgICBtaXJyb3I6IHRydWUsXG4gICAgICAgIG1pcnJvckNvbGxlY3Rpb246IGNvbGxlY3Rpb24sXG4gICAgICAgIGlnbm9yZVZhbGlkYXRpb246IHRydWUsXG4gICAgICAgIGlnbm9yZUhhbmRsZXJzOiB0cnVlLFxuICAgICAgICBhcHBseVVwZGF0ZVZhbGlkYXRpb246IGZhbHNlLFxuICAgICAgICBtZXJnZUZvclVwZGF0ZTogZmFsc2UsXG4gICAgICB9IGFzIGFueSlcbiAgICApO1xuICAgIGF3YWl0IHJlcG8udXBkYXRlKHNvdXJjZU1vZGVsLCBjb250ZXh0KTtcbiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKFxuICAgICAgYE1pcnJvciBmb3IgJHtNb2RlbC50YWJsZU5hbWUodGhpcy5jbGFzcyl9IHVwZGF0ZWQ6ICR7KG1vZGVsIGFzIGFueSlbTW9kZWwucGsobW9kZWwpXX1gXG4gICAgKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yXCIgYXMgYW55LCB1bmRlZmluZWQpO1xuICAgIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCB1bmRlZmluZWQpO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVNaXJyb3JIYW5kbGVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIGFueT4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+LFxuICBkYXRhOiBNaXJyb3JNZXRhZGF0YSxcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNvbGxlY3Rpb24gPSBhd2FpdCBldmFsTWlycm9yTWV0YWRhdGEobW9kZWwsIGRhdGEucmVzb2x2ZXIsIGNvbnRleHQpO1xuICBjb25zdCBmYWJyaWNDdHggPSBjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dDtcbiAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdHJ1ZSk7XG4gIGZhYnJpY0N0eC5wdXQoXCJtaXJyb3JDb2xsZWN0aW9uXCIgYXMgYW55LCBjb2xsZWN0aW9uKTtcbiAgZmFicmljQ3R4LnB1dChcInNlZ3JlZ2F0ZWRcIiBhcyBhbnksIGNvbGxlY3Rpb24pO1xuICB0cnkge1xuICAgIGNvbnN0IHBrUHJvcCA9IE1vZGVsLnBrKG1vZGVsKSBhcyBrZXlvZiBNO1xuICAgIGNvbnN0IGlkID0gbW9kZWxbcGtQcm9wXTtcbiAgICBjb25zdCByZXBvID0gdGhpcy5vdmVycmlkZShcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sICh0aGlzIGFzIGFueSkuX292ZXJyaWRlcywge1xuICAgICAgICBzZWdyZWdhdGVkOiBjb2xsZWN0aW9uLFxuICAgICAgICBtaXJyb3I6IHRydWUsXG4gICAgICAgIGlnbm9yZVZhbGlkYXRpb246IHRydWUsXG4gICAgICAgIGlnbm9yZUhhbmRsZXJzOiB0cnVlLFxuICAgICAgfSBhcyBhbnkpXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgcmVwby5kZWxldGUoaWQgYXMgYW55LCBjb250ZXh0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE1heSBhbHJlYWR5IGJlIGRlbGV0ZWQgYnkgYWRhcHRlci5kZWxldGVTZWdyZWdhdGVkQ29sbGVjdGlvbnNcbiAgICB9XG4gICAgY29udGV4dC5sb2dnZXIuaW5mbyhcbiAgICAgIGBNaXJyb3IgZm9yICR7TW9kZWwudGFibGVOYW1lKHRoaXMuY2xhc3MpfSBkZWxldGVkOiAke1N0cmluZyhpZCl9YFxuICAgICk7XG4gIH0gZmluYWxseSB7XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgICBmYWJyaWNDdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgICBmYWJyaWNDdHgucHV0KFwic2VncmVnYXRlZFwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWlycm9yV3JpdGVHdWFyZDxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPixcbiAgZGF0YTogTWlycm9yTWV0YWRhdGEsXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAga2V5OiBrZXlvZiBNLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgbXNwID0gZXh0cmFjdE1zcElkKFxuICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgKTtcbiAgaWYgKCFtc3ApIHJldHVybjtcbiAgaWYgKG1zcCA9PT0gZGF0YS5tc3BJZCB8fCAoZGF0YS5jb25kaXRpb24gJiYgZGF0YS5jb25kaXRpb24obXNwKSkpIHtcbiAgICB0aHJvdyBuZXcgQXV0aG9yaXphdGlvbkVycm9yKFxuICAgICAgYE9yZ2FuaXphdGlvbiAke21zcH0gaXMgbm90IGF1dGhvcml6ZWQgdG8gbW9kaWZ5IG1pcnJvcmVkIGRhdGFgXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZE1pcnJvckhhbmRsZXI8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgYW55Pixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8RmFicmljQ29udHJhY3RGbGFncz4sXG4gIGRhdGE6IE1pcnJvck1ldGFkYXRhLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgbXNwID0gZXh0cmFjdE1zcElkKFxuICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgKTtcblxuICBpZiAoIW1zcCkgcmV0dXJuO1xuXG4gIGNvbnN0IGNvbGxlY3Rpb24gPSBhd2FpdCBldmFsTWlycm9yTWV0YWRhdGEobW9kZWwsIGRhdGEucmVzb2x2ZXIsIGNvbnRleHQpO1xuICBjb25zdCBmYWJyaWNDdHggPSBjb250ZXh0IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dDtcbiAgY29uc3QgbWF0Y2hlcyA9IG1zcCA9PT0gZGF0YS5tc3BJZCB8fCAoZGF0YS5jb25kaXRpb24gJiYgZGF0YS5jb25kaXRpb24obXNwKSk7XG5cbiAgaWYgKG1hdGNoZXMpIHtcbiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKFxuICAgICAgYE1pcnJvciByZWFkOiBNU1AgJHttc3B9IG1hdGNoZXMsIHJvdXRpbmcgcmVhZHMgdG8gbWlycm9yIGNvbGxlY3Rpb24gJHtjb2xsZWN0aW9ufWBcbiAgICApO1xuICAgIC8vIFJvdXRlIHJlYWRzIGV4Y2x1c2l2ZWx5IHRocm91Z2ggdGhlIG1pcnJvciBjb2xsZWN0aW9uXG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdHJ1ZSk7XG4gICAgZmFicmljQ3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIGNvbGxlY3Rpb24pO1xuICAgIGZhYnJpY0N0eC5wdXQoXCJmdWxseVNlZ3JlZ2F0ZWRcIiwgdHJ1ZSk7XG4gICAgZmFicmljQ3R4LnJlYWRGcm9tKGNvbGxlY3Rpb24pO1xuICB9XG4gIC8vIFdoZW4gTVNQIGRvZXMgTk9UIG1hdGNoLCBub3JtYWwgcmVhZCBmbG93IOKAlCBhbGwgZGF0YSBpcyBpbiBwdWJsaWMgc3RhdGVcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1pcnJvcihcbiAgY29sbGVjdGlvbjogQ29sbGVjdGlvblJlc29sdmVyIHwgc3RyaW5nLFxuICBtc3BJZE9yQ29uZGl0aW9uPzogc3RyaW5nIHwgTWlycm9yQ29uZGl0aW9uLFxuICBjb25kaXRpb24/OiBNaXJyb3JDb25kaXRpb25cbikge1xuICBjb25zdCBpc0NvbmRpdGlvbk9ubHkgPVxuICAgIHR5cGVvZiBtc3BJZE9yQ29uZGl0aW9uICE9PSBcInN0cmluZ1wiICYmIEJvb2xlYW4obXNwSWRPckNvbmRpdGlvbik7XG4gIGNvbnN0IG1zcElkID0gaXNDb25kaXRpb25Pbmx5XG4gICAgPyB1bmRlZmluZWRcbiAgICA6IChtc3BJZE9yQ29uZGl0aW9uIGFzIHN0cmluZyB8IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGNvbmQgPSBpc0NvbmRpdGlvbk9ubHlcbiAgICA/IChtc3BJZE9yQ29uZGl0aW9uIGFzIE1pcnJvckNvbmRpdGlvbilcbiAgICA6IGNvbmRpdGlvbjtcblxuICBmdW5jdGlvbiBtaXJyb3IoXG4gICAgcmVzb2x2ZXI6IENvbGxlY3Rpb25SZXNvbHZlciB8IHN0cmluZyxcbiAgICBtc3BJZDogc3RyaW5nLFxuICAgIGNvbmRpdGlvbj86IE1pcnJvckNvbmRpdGlvblxuICApIHtcbiAgICBjb25zdCBtZXRhOiBNaXJyb3JNZXRhZGF0YSA9IHtcbiAgICAgIGNvbmRpdGlvbjogY29uZGl0aW9uLFxuICAgICAgbXNwSWQ6IG1zcElkLFxuICAgICAgcmVzb2x2ZXI6IHJlc29sdmVyLFxuICAgIH07XG4gICAgcmV0dXJuIGFwcGx5KFxuICAgICAgbWV0YWRhdGEoXG4gICAgICAgIE1ldGFkYXRhLmtleShGYWJyaWNNb2RlbEtleXMuRkFCUklDLCBGYWJyaWNNb2RlbEtleXMuTUlSUk9SKSxcbiAgICAgICAgbWV0YVxuICAgICAgKSxcbiAgICAgIC8vIFJlYWQgaGFuZGxlciBydW5zIGVhcmx5IChwcmlvcml0eSAzMCkgdG8gc2V0IHVwIGNvbnRleHQgYmVmb3JlIGFueSByZWFkc1xuICAgICAgb25SZWFkKHJlYWRNaXJyb3JIYW5kbGVyIGFzIGFueSwgbWV0YSwgeyBwcmlvcml0eTogMzAgfSksXG4gICAgICAvLyBXcml0ZSBndWFyZHMg4oCUIHJlamVjdCBtYXRjaGluZyBNU1BzIGJlZm9yZSBhbnkgcHJvY2Vzc2luZ1xuICAgICAgb25DcmVhdGUobWlycm9yV3JpdGVHdWFyZCBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDIwIH0pLFxuICAgICAgb25VcGRhdGUobWlycm9yV3JpdGVHdWFyZCBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDIwIH0pLFxuICAgICAgb25EZWxldGUobWlycm9yV3JpdGVHdWFyZCBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDIwIH0pLFxuICAgICAgLy8gTWlycm9yIHN5bmMgaGFuZGxlcnMg4oCUIHdyaXRlIGZ1bGwgbW9kZWwgYWZ0ZXIgb3RoZXIgaGFuZGxlcnMgKHByaW9yaXR5IDEwMClcbiAgICAgIG9uQ3JlYXRlKGNyZWF0ZU1pcnJvckhhbmRsZXIgYXMgYW55LCBtZXRhLCB7IHByaW9yaXR5OiAxMDAgfSksXG4gICAgICBvblVwZGF0ZSh1cGRhdGVNaXJyb3JIYW5kbGVyIGFzIGFueSwgbWV0YSwgeyBwcmlvcml0eTogMTAwIH0pLFxuICAgICAgb25EZWxldGUoZGVsZXRlTWlycm9ySGFuZGxlciBhcyBhbnksIG1ldGEsIHsgcHJpb3JpdHk6IDEwMCB9KVxuICAgICk7XG4gIH1cblxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3IoRmFicmljTW9kZWxLZXlzLk1JUlJPUilcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogbWlycm9yLFxuICAgICAgYXJnczogW2NvbGxlY3Rpb24sIG1zcElkLCBjb25kXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG5leHBvcnQgdHlwZSBDb2xsZWN0aW9uUmVzb2x2ZXIgPSA8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPixcbiAgbXNwPzogc3RyaW5nLFxuICAuLi5hcmdzOiBhbnlbXVxuKSA9PiBzdHJpbmc7XG5cbmV4cG9ydCBjb25zdCBNb2RlbENvbGxlY3Rpb246IENvbGxlY3Rpb25SZXNvbHZlciA9IDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+LFxuICBtc3BJZD86IHN0cmluZ1xuKSA9PiB7XG4gIGNvbnN0IG9yZ05hbWUgPVxuICAgIG1zcElkIHx8ICh0eXBlb2YgbW9kZWwgIT09IFwiZnVuY3Rpb25cIiA/IE1vZGVsLm93bmVyT2YobW9kZWwpIDogdW5kZWZpbmVkKTtcbiAgY29uc3QgY29uc3RyID0gdHlwZW9mIG1vZGVsID09PSBcImZ1bmN0aW9uXCIgPyBtb2RlbCA6IG1vZGVsLmNvbnN0cnVjdG9yO1xuICBpZiAoIW9yZ05hbWUpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgTW9kZWwgJHtjb25zdHIubmFtZX0gaXMgbm90IG93bmVkIGJ5IGFueSBvcmdhbml6YXRpb24uIGRpZCB5b3UgdXNlIEBvd25lZEJ5KCkgKG9yIHByb3ZpZGUgdGhlIG5hbWUpP2BcbiAgICApO1xuICByZXR1cm4gYCR7dG9QYXNjYWxDYXNlKGNvbnN0ci5uYW1lKX0ke29yZ05hbWUgPyB0b1Bhc2NhbENhc2Uob3JnTmFtZSkgOiBcIlwifWA7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gTmFtZXNwYWNlQ29sbGVjdGlvbihuYW1lc3BhY2U6IHN0cmluZyk6IENvbGxlY3Rpb25SZXNvbHZlciB7XG4gIHJldHVybiA8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+LCBtc3BJZD86IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IG9yZ05hbWUgPVxuICAgICAgbXNwSWQgfHwgKHR5cGVvZiBtb2RlbCAhPT0gXCJmdW5jdGlvblwiID8gTW9kZWwub3duZXJPZihtb2RlbCkgOiB1bmRlZmluZWQpO1xuICAgIGNvbnN0IGNvbnN0ciA9IHR5cGVvZiBtb2RlbCA9PT0gXCJmdW5jdGlvblwiID8gbW9kZWwgOiBtb2RlbC5jb25zdHJ1Y3RvcjtcbiAgICBpZiAoIW9yZ05hbWUpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE1vZGVsICR7Y29uc3RyLm5hbWV9IGlzIG5vdCBvd25lZCBieSBhbnkgb3JnYW5pemF0aW9uLiBkaWQgeW91IHVzZSBAb3duZWRCeSgpIChvciBwcm92aWRlIHRoZSBuYW1lKT9gXG4gICAgICApO1xuICAgIHJldHVybiBgJHtuYW1lc3BhY2V9JHtvcmdOYW1lID8gdG9QYXNjYWxDYXNlKG9yZ05hbWUpIDogXCJcIn1gO1xuICB9O1xufVxuXG5leHBvcnQgY29uc3QgSW1wbGljaXRQcml2YXRlQ29sbGVjdGlvbjogQ29sbGVjdGlvblJlc29sdmVyID0gPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT4sXG4gIG1zcElkPzogc3RyaW5nXG4pID0+IHtcbiAgY29uc3Qgb3JnTmFtZSA9XG4gICAgbXNwSWQgfHwgKHR5cGVvZiBtb2RlbCAhPT0gXCJmdW5jdGlvblwiID8gTW9kZWwub3duZXJPZihtb2RlbCkgOiB1bmRlZmluZWQpO1xuICBpZiAoIW9yZ05hbWUpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgTW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfSBpcyBub3Qgb3duZWQgYnkgYW55IG9yZ2FuaXphdGlvbi4gZGlkIHlvdSB1c2UgQG93bmVkQnkoKSAob3IgcHJvdmlkZSB0aGUgbmFtZSk/YFxuICAgICk7XG4gIHJldHVybiBgX18ke3RvUGFzY2FsQ2FzZShvcmdOYW1lKX1Qcml2YXRlQ29sbGVjdGlvbmA7XG59O1xuXG5leHBvcnQgdHlwZSBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhID0ge1xuICBjb2xsZWN0aW9uczogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyO1xufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJpb3JpdHkgZm9yIGVhcmx5IGNvbGxlY3Rpb24gZXh0cmFjdGlvbiAoYmVmb3JlIHBrIGdlbmVyYXRpb24gYXQgcHJpb3JpdHkgNjApXG4gKiBAc3VtbWFyeSBUaGlzIHByaW9yaXR5IGVuc3VyZXMgY29sbGVjdGlvbnMgYXJlIHJlZ2lzdGVyZWQgaW4gY29udGV4dCBiZWZvcmUgYW55IHNlcXVlbmNlXG4gKiBvcGVyYXRpb25zIG9jY3VyLCBhbGxvd2luZyBzZXF1ZW5jZXMgdG8gYmUgcmVwbGljYXRlZCB0byBwcml2YXRlL3NoYXJlZCBjb2xsZWN0aW9ucy5cbiAqL1xuZXhwb3J0IGNvbnN0IFNFR1JFR0FURURfQ09MTEVDVElPTl9FWFRSQUNUSU9OX1BSSU9SSVRZID0gMzU7XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVNlZ3JlZ2F0aW9uRmxhZ3M8TSBleHRlbmRzIE1vZGVsPihcbiAgY2xheno6IE0sXG4gIGNvbGxlY3Rpb25zOiBzdHJpbmdbXSxcbiAgY3R4OiBhbnlcbikge1xuICAvLyBSZWdpc3RlciBjb2xsZWN0aW9ucyBlYXJseSB1c2luZyByZWFkRnJvbSAtIHRoaXMgYWxsb3dzIHNlcXVlbmNlIGNvZGVcbiAgLy8gdG8ga25vdyB3aGljaCBjb2xsZWN0aW9ucyB0byByZXBsaWNhdGUgdG8gZHVyaW5nIHBrIGdlbmVyYXRpb25cbiAgaWYgKGNvbGxlY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAoY3R4IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dCkucmVhZEZyb20oY29sbGVjdGlvbnMpO1xuICB9XG5cbiAgLy8gQ2hlY2sgaWYgbW9kZWwgaXMgZnVsbHkgc2VncmVnYXRlZCAoYWxsIG5vbi1wayBwcm9wZXJ0aWVzIGFyZSBwcml2YXRlL3NoYXJlZC90cmFuc2llbnQpLlxuICAvLyBVc2UgTW9kZWwuc2VncmVnYXRlKCkgd2hpY2ggaXMgdGhlIGNhbm9uaWNhbCB3YXkgdG8gZGV0ZXJtaW5lIHdoYXQncyB0cmFuc2llbnQsXG4gIC8vIHJhdGhlciB0aGFuIHJlYWRpbmcgREJLZXlzLlRSQU5TSUVOVCBtZXRhZGF0YSB3aGljaCBtYXkgbm90IGFjY3VtdWxhdGUgY29ycmVjdGx5XG4gIC8vIHdoZW4gY2xhc3MtbGV2ZWwgQHByaXZhdGVEYXRhIGFwcGxpZXMgZGVjb3JhdG9ycyBpdGVyYXRpdmVseS5cbiAgaWYgKCFjdHguaXNGdWxseVNlZ3JlZ2F0ZWQgJiYgY29sbGVjdGlvbnMubGVuZ3RoKSB7XG4gICAgaWYgKCFoYXNQdWJsaWNQcm9wZXJ0aWVzKGNsYXp6LmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yPE0+KSkge1xuICAgICAgY3R4Lm1hcmtGdWxseVNlZ3JlZ2F0ZWQoKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFwcGx5TWlycm9yRmxhZ3M8TSBleHRlbmRzIE1vZGVsPihcbiAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICBtc3A6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgY3R4OiBGYWJyaWNDb250cmFjdENvbnRleHRcbikge1xuICBpZiAoIW1zcCkgcmV0dXJuO1xuICBjb25zdCBtaXJyb3JNZXRhID0gTW9kZWwubWlycm9yZWRBdChjbGF6eik7XG4gIGlmICghbWlycm9yTWV0YSkgcmV0dXJuO1xuICBjb25zdCBtYXRjaGVzID1cbiAgICBtc3AgPT09IG1pcnJvck1ldGEubXNwSWQgfHxcbiAgICAobWlycm9yTWV0YS5jb25kaXRpb24gJiYgbWlycm9yTWV0YS5jb25kaXRpb24obXNwKSk7XG4gIGlmICghbWF0Y2hlcykgcmV0dXJuO1xuICBjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgZXZhbE1pcnJvck1ldGFkYXRhKFxuICAgIG5ldyBjbGF6eigpLFxuICAgIG1pcnJvck1ldGEucmVzb2x2ZXIsXG4gICAgY3R4XG4gICk7XG4gIC8vIE1pcnJvciBNU1AgbWF0Y2hlcyDigJQgcm91dGUgcmVhZHMgZXhjbHVzaXZlbHkgdGhyb3VnaCB0aGUgbWlycm9yXG4gIC8vIGNvbGxlY3Rpb24uIENsZWFyIGFueSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgY29sbGVjdGlvbnMgc28gcXVlcmllc1xuICAvLyBnbyBPTkxZIHRvIHRoZSBtaXJyb3IsIG5vdCB0byB0aGUgcmVndWxhciBwcml2YXRlL3NoYXJlZCBvbmVzLlxuICBjdHgucHV0KFwic2VncmVnYXRlUmVhZFwiLCB1bmRlZmluZWQpO1xuICBjdHgucHV0KFwic2VncmVnYXRlUmVhZFN0YWNrXCIsIHVuZGVmaW5lZCk7XG4gIGN0eC5wdXQoXCJmdWxseVNlZ3JlZ2F0ZWRcIiwgdHJ1ZSk7XG4gIGN0eC5wdXQoXCJtaXJyb3JcIiBhcyBhbnksIHRydWUpO1xuICBjdHgucHV0KFwibWlycm9yQ29sbGVjdGlvblwiIGFzIGFueSwgY29sbGVjdGlvbik7XG4gIGN0eC5yZWFkRnJvbShjb2xsZWN0aW9uKTtcbn1cblxuZnVuY3Rpb24gaGFzUHVibGljUHJvcGVydGllczxNIGV4dGVuZHMgTW9kZWw+KGNsYXp6OiBDb25zdHJ1Y3RvcjxNPik6IGJvb2xlYW4ge1xuICBjb25zdCBhdHRyaWJ1dGVzID0gTWV0YWRhdGEuZ2V0QXR0cmlidXRlcyhjbGF6eikgfHwgW107XG4gIGNvbnN0IHBrID0gTW9kZWwucGsoY2xhenopO1xuICBjb25zdCB0cmFuc2llbnRNZXRhID0gTWV0YWRhdGEuZ2V0KGNsYXp6IGFzIGFueSwgREJLZXlzLlRSQU5TSUVOVCkgfHwge307XG4gIGNvbnN0IHByaXZhdGVNZXRhID1cbiAgICBNZXRhZGF0YS5nZXQoY2xhenogYXMgYW55LCBNZXRhZGF0YS5rZXkoRmFicmljTW9kZWxLZXlzLlBSSVZBVEUpKSB8fCB7fTtcbiAgY29uc3Qgc2hhcmVkTWV0YSA9XG4gICAgTWV0YWRhdGEuZ2V0KGNsYXp6IGFzIGFueSwgTWV0YWRhdGEua2V5KEZhYnJpY01vZGVsS2V5cy5TSEFSRUQpKSB8fCB7fTtcblxuICByZXR1cm4gYXR0cmlidXRlcy5zb21lKChhdHRyKSA9PiB7XG4gICAgaWYgKGF0dHIgPT09IHBrKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGF0dHIgaW4gdHJhbnNpZW50TWV0YSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChhdHRyIGluIHByaXZhdGVNZXRhKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGF0dHIgaW4gc2hhcmVkTWV0YSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRWFybHkgaGFuZGxlciB0byBleHRyYWN0IGFuZCByZWdpc3RlciBjb2xsZWN0aW9ucyBpbiBjb250ZXh0XG4gKiBAc3VtbWFyeSBSdW5zIHdpdGggcHJpb3JpdHkgPCA0MCB0byBleHRyYWN0IGNvbGxlY3Rpb24gbmFtZXMgYmVmb3JlIHBrIGdlbmVyYXRpb24gKHByaW9yaXR5IDYwKS5cbiAqIFRoaXMgYWxsb3dzIEZhYnJpY0NvbnRyYWN0U2VxdWVuY2UgdG8ga25vdyB3aGljaCBjb2xsZWN0aW9ucyB0byByZXBsaWNhdGUgdG8uXG4gKiBAdGVtcGxhdGUgTSAtIFR5cGUgdGhhdCBleHRlbmRzIE1vZGVsXG4gKiBAcGFyYW0ge0NvbnRleHRPZjxSZXBvc2l0b3J5PE0sIGFueT4+fSBjb250ZXh0IC0gVGhlIGV4ZWN1dGlvbiBjb250ZXh0XG4gKiBAcGFyYW0ge1NlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEgfCBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW119IGRhdGEgLSBUaGUgc2VncmVnYXRlZCBkYXRhIG1ldGFkYXRhXG4gKiBAcGFyYW0ge3N0cmluZyB8IHN0cmluZ1tdfSBrZXlzIC0gVGhlIHByb3BlcnR5IGtleShzKSBiZWluZyBzZWdyZWdhdGVkXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXh0cmFjdFNlZ3JlZ2F0ZWRDb2xsZWN0aW9uczxNIGV4dGVuZHMgTW9kZWw+KFxuICB0aGlzOiBSZXBvc2l0b3J5PE0sIGFueT4sXG4gIGNvbnRleHQ6IENvbnRleHRPZjx0eXBlb2YgdGhpcz4sXG4gIGRhdGE6IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEgfCBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW10sXG4gIGtleXM6IGtleW9mIE0gfCAoa2V5b2YgTSlbXSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkYXRhQXJyYXkgPSAoXG4gICAgQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbZGF0YV1cbiAgKSBhcyBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW107XG5cbiAgY29uc3QgbSA9XG4gICAgY29udGV4dC5nZXRPclVuZGVmaW5lZChcImFsbG93R2VuZXJhdGlvbk92ZXJyaWRlXCIpIHx8IGZhbHNlXG4gICAgICA/IGNvbnRleHQuZ2V0T3JVbmRlZmluZWQoXCJvd25lck92ZXJyaWRlXCIpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBtc3AgPVxuICAgIG0gfHwgTW9kZWwub3duZXJPZihtb2RlbCkgfHwgZXh0cmFjdE1zcElkKGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikpO1xuXG4gIGlmICghbXNwKSB7XG4gICAgLy8gQ2FuJ3QgZXh0cmFjdCBjb2xsZWN0aW9ucyB3aXRob3V0IE1TUCwgd2lsbCBiZSBjYXVnaHQgYnkgbGF0ZXIgaGFuZGxlcnNcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBjb2xsZWN0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBtZXRhZGF0YSBvZiBkYXRhQXJyYXkpIHtcbiAgICBjb25zdCBjb2xsZWN0aW9uUmVzb2x2ZXIgPSBtZXRhZGF0YS5jb2xsZWN0aW9ucztcbiAgICBjb25zdCBjb2xsZWN0aW9uID1cbiAgICAgIHR5cGVvZiBjb2xsZWN0aW9uUmVzb2x2ZXIgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBjb2xsZWN0aW9uUmVzb2x2ZXJcbiAgICAgICAgOiBjb2xsZWN0aW9uUmVzb2x2ZXIobW9kZWwsIG1zcCwgY29udGV4dCk7XG4gICAgaWYgKGNvbGxlY3Rpb24gJiYgIWNvbGxlY3Rpb25zLmluY2x1ZGVzKGNvbGxlY3Rpb24pKSB7XG4gICAgICBjb2xsZWN0aW9ucy5wdXNoKGNvbGxlY3Rpb24pO1xuICAgIH1cbiAgfVxuICBhcHBseVNlZ3JlZ2F0aW9uRmxhZ3MobW9kZWwsIGNvbGxlY3Rpb25zLCBjb250ZXh0KTtcblxuICAvLyBTdG9yZSBzZWdyZWdhdGlvbiBtZXRhZGF0YSBwZXItc2VxdWVuY2Ugc28gRmFicmljQ29udHJhY3RTZXF1ZW5jZSBjYW4gZGVjaWRlXG4gIC8vIHdoZXJlIHRvIHN0b3JlL3JlcGxpY2F0ZSBzZXF1ZW5jZSByZWNvcmRzIChwdWJsaWMgdnMgcHJpdmF0ZS9zaGFyZWQpLlxuICAvL1xuICAvLyAtIGBAcGsoKWAgc2VxdWVuY2VzIHVzZSB0aGUgc2hhcmVkIG5hbWUgYCR7dGFibGV9X3BrYCAobm8gaWQgY29tcG9uZW50KS5cbiAgLy8gLSBgQHNlcXVlbmNlKClgIC8gcGVyc2lzdGVudCBgQHZlcnNpb24odHJ1ZSlgIHNlcXVlbmNlcyBhcmUgcGVyLW1vZGVsLWluc3RhbmNlOlxuICAvLyAgIGAke3RhYmxlfV8ke2lkfV8ke3Byb3BlcnR5fWAuXG4gIGNvbnN0IGtleUFycmF5ID0gKEFycmF5LmlzQXJyYXkoa2V5cykgPyBrZXlzIDogW2tleXNdKSBhcyAoa2V5b2YgTSlbXTtcbiAgY29uc3QgcGtLZXkgPSBNb2RlbC5wayhtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnkpIGFzIGtleW9mIE07XG4gIGNvbnN0IHBrU2VxTmFtZSA9IE1vZGVsLnNlcXVlbmNlTmFtZShtb2RlbCwgXCJwa1wiKTtcblxuICBjb25zdCBpZFZhbHVlID0gKG1vZGVsIGFzIGFueSlbcGtLZXkgYXMgYW55XTtcbiAgY29uc3QgY2FuQnVpbGRQZXJJbnN0YW5jZSA9XG4gICAgdHlwZW9mIGlkVmFsdWUgIT09IFwidW5kZWZpbmVkXCIgJiYgaWRWYWx1ZSAhPT0gbnVsbDtcblxuICAvLyBBbHdheXMgdW5pb24gY29sbGVjdGlvbnMgZm9yIHRoZSBwayBzZXF1ZW5jZSB3aGVuIHRoZSBtb2RlbCB1c2VzIHNlZ3JlZ2F0ZWQgZGF0YS5cbiAgKGNvbnRleHQgYXMgYW55KS5zZXRTZXF1ZW5jZVNlZ3JlZ2F0aW9uKFxuICAgIHBrU2VxTmFtZSxcbiAgICAoY29udGV4dCBhcyBhbnkpLmlzRnVsbHlTZWdyZWdhdGVkLFxuICAgIGNvbGxlY3Rpb25zXG4gICk7XG5cbiAgLy8gRm9yIHBlci1wcm9wZXJ0eSBzZXF1ZW5jZXMsIG9ubHkgcmVnaXN0ZXIgd2hlbiB3ZSBjYW4gY29tcHV0ZSBhbiBpZC1zY29wZWQgbmFtZS5cbiAgLy8gVGhpcyBrZWVwcyBzZXF1ZW5jZXMgY29uc3RyYWluZWQgdG8gdGhlIGNvbGxlY3Rpb25zIHRoZSBhdHRyaWJ1dGUgZXhpc3RzIGluLlxuICBpZiAoY2FuQnVpbGRQZXJJbnN0YW5jZSkge1xuICAgIGZvciAoY29uc3QgayBvZiBrZXlBcnJheSkge1xuICAgICAgY29uc3QgcHJvcFNlcU5hbWUgPSBNb2RlbC5zZXF1ZW5jZU5hbWUobW9kZWwsIFN0cmluZyhpZFZhbHVlKSwgU3RyaW5nKGspKTtcbiAgICAgIChjb250ZXh0IGFzIGFueSkuc2V0U2VxdWVuY2VTZWdyZWdhdGlvbihcbiAgICAgICAgcHJvcFNlcU5hbWUsXG4gICAgICAgIChjb250ZXh0IGFzIGFueSkuaXNGdWxseVNlZ3JlZ2F0ZWQsXG4gICAgICAgIGNvbGxlY3Rpb25zXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VncmVnYXRlZERhdGFPbkNyZWF0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICB0aGlzOiBSZXBvc2l0b3J5PE0sIGFueT4sXG4gIGNvbnRleHQ6IENvbnRleHRPZjx0eXBlb2YgdGhpcz4sXG4gIGRhdGE6IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEgfCBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW10sXG4gIGtleXM6IGtleW9mIE0gfCAoa2V5b2YgTSlbXSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkYXRhQXJyYXkgPSAoXG4gICAgQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbZGF0YV1cbiAgKSBhcyBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW107XG4gIGNvbnN0IGtleUFycmF5ID0gKEFycmF5LmlzQXJyYXkoa2V5cykgPyBrZXlzIDogW2tleXNdKSBhcyAoa2V5b2YgTSlbXTtcbiAgaWYgKGtleUFycmF5Lmxlbmd0aCAhPT0gZGF0YUFycmF5Lmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBTZWdyZWdhdGVkIGRhdGEga2V5cyBhbmQgbWV0YWRhdGEgbGVuZ3RoIG1pc21hdGNoYFxuICAgICk7XG5cbiAgY29uc3QgbXNwID1cbiAgICBNb2RlbC5vd25lck9mKG1vZGVsKSB8fFxuICAgIGV4dHJhY3RNc3BJZChcbiAgICAgIGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgc3RyaW5nIHwgQ2xpZW50SWRlbnRpdHkgfCB1bmRlZmluZWRcbiAgICApO1xuICBpZiAoIW1zcClcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYFRoZXJlJ3Mgbm8gYXNzaWduZWQgb3JnYW5pemF0aW9uIGZvciBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICk7XG5cbiAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gZGF0YUFycmF5WzBdLmNvbGxlY3Rpb25zO1xuICBjb25zdCBjb2xsZWN0aW9uID1cbiAgICB0eXBlb2YgY29sbGVjdGlvblJlc29sdmVyID09PSBcInN0cmluZ1wiXG4gICAgICA/IGNvbGxlY3Rpb25SZXNvbHZlclxuICAgICAgOiBjb2xsZWN0aW9uUmVzb2x2ZXIobW9kZWwsIG1zcCwgY29udGV4dCk7XG5cbiAgLy8gVmFsaWRhdGUgYWxsIGtleXMgcmVzb2x2ZSB0byB0aGUgc2FtZSBjb2xsZWN0aW9uXG4gIGtleUFycmF5LmZvckVhY2goKF9rLCBpKSA9PiB7XG4gICAgY29uc3QgYyA9XG4gICAgICB0eXBlb2YgZGF0YUFycmF5W2ldLmNvbGxlY3Rpb25zID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gZGF0YUFycmF5W2ldLmNvbGxlY3Rpb25zXG4gICAgICAgIDogZGF0YUFycmF5W2ldLmNvbGxlY3Rpb25zKG1vZGVsLCBtc3AsIGNvbnRleHQpO1xuICAgIGlmIChjICE9PSBjb2xsZWN0aW9uKVxuICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICAgIGBTZWdyZWdhdGVkIGRhdGEgY29sbGVjdGlvbiBtaXNtYXRjaDogJHtjfSB2cyAke2NvbGxlY3Rpb259YFxuICAgICAgKTtcbiAgfSk7XG5cbiAgY29uc3Qga2V5U3RyaW5ncyA9IGtleUFycmF5Lm1hcCgoa2V5KSA9PiBTdHJpbmcoa2V5KSk7XG4gIC8vIFN0b3JlIHRoZSBzZWdyZWdhdGVkIG1vZGVsIOKAlCBwcmVwYXJlKCkgd2lsbCBmaWx0ZXIgdG8gY29sbGVjdGlvbi1zcGVjaWZpYyBmaWVsZHNcbiAgKGNvbnRleHQgYXMgRmFicmljQ29udHJhY3RDb250ZXh0KS53cml0ZVRvKGNvbGxlY3Rpb24sIGtleVN0cmluZ3MpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VncmVnYXRlZERhdGFPblJlYWQ8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogUmVwb3NpdG9yeTxNLCBhbnk+LFxuICBjb250ZXh0OiBDb250ZXh0PEZhYnJpY0ZsYWdzPixcbiAgZGF0YTogU2VncmVnYXRlZERhdGFNZXRhZGF0YSB8IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGFbXSxcbiAga2V5czoga2V5b2YgTSB8IChrZXlvZiBNKVtdLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRhdGFBcnJheSA9IChcbiAgICBBcnJheS5pc0FycmF5KGRhdGEpID8gZGF0YSA6IFtkYXRhXVxuICApIGFzIFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGFbXTtcbiAgY29uc3Qga2V5QXJyYXkgPSAoQXJyYXkuaXNBcnJheShrZXlzKSA/IGtleXMgOiBba2V5c10pIGFzIChrZXlvZiBNKVtdO1xuICBpZiAoa2V5QXJyYXkubGVuZ3RoICE9PSBkYXRhQXJyYXkubGVuZ3RoKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYFNlZ3JlZ2F0ZWQgZGF0YSBrZXlzIGFuZCBtZXRhZGF0YSBsZW5ndGggbWlzbWF0Y2hgXG4gICAgKTtcblxuICBjb25zdCBtID1cbiAgICBjb250ZXh0LmdldE9yVW5kZWZpbmVkKFwiYWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGVcIikgfHwgZmFsc2VcbiAgICAgID8gY29udGV4dC5nZXRPclVuZGVmaW5lZChcIm93bmVyT3ZlcnJpZGVcIilcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gIGNvbnN0IG1zcCA9XG4gICAgbSB8fCBNb2RlbC5vd25lck9mKG1vZGVsKSB8fCBleHRyYWN0TXNwSWQoY29udGV4dC5nZXQoXCJpZGVudGl0eVwiKSk7XG4gIGlmICghbXNwKVxuICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBgVGhlcmUncyBubyBhc3NpZ25lZCBvcmdhbml6YXRpb24gZm9yIG1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX1gXG4gICAgKTtcblxuICBjb25zdCBjb2xsZWN0aW9uUmVzb2x2ZXIgPSBkYXRhQXJyYXlbMF0uY29sbGVjdGlvbnM7XG4gIGNvbnN0IGNvbGxlY3Rpb24gPVxuICAgIHR5cGVvZiBjb2xsZWN0aW9uUmVzb2x2ZXIgPT09IFwic3RyaW5nXCJcbiAgICAgID8gY29sbGVjdGlvblJlc29sdmVyXG4gICAgICA6IGF3YWl0IGNvbGxlY3Rpb25SZXNvbHZlcihtb2RlbCwgbXNwLCBjb250ZXh0KTtcblxuICAoY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQpLnJlYWRGcm9tKGNvbGxlY3Rpb24pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VncmVnYXRlZERhdGFPblVwZGF0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICB0aGlzOiBSZXBvc2l0b3J5PE0sIGFueT4sXG4gIGNvbnRleHQ6IENvbnRleHRPZjx0eXBlb2YgdGhpcz4sXG4gIGRhdGE6IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGEgfCBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhW10sXG4gIGtleToga2V5b2YgTSB8IChrZXlvZiBNKVtdLFxuICBtb2RlbDogTSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBvbGRNb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRhdGFBcnJheSA9IChcbiAgICBBcnJheS5pc0FycmF5KGRhdGEpID8gZGF0YSA6IFtkYXRhXVxuICApIGFzIFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGFbXTtcbiAgY29uc3Qga2V5QXJyYXkgPSAoQXJyYXkuaXNBcnJheShrZXkpID8ga2V5IDogW2tleV0pIGFzIChrZXlvZiBNKVtdO1xuICBpZiAoa2V5QXJyYXkubGVuZ3RoICE9PSBkYXRhQXJyYXkubGVuZ3RoKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYFNlZ3JlZ2F0ZWQgZGF0YSBrZXlzIGFuZCBtZXRhZGF0YSBsZW5ndGggbWlzbWF0Y2hgXG4gICAgKTtcblxuICBjb25zdCBtc3AgPVxuICAgIE1vZGVsLm93bmVyT2YobW9kZWwpIHx8XG4gICAgZXh0cmFjdE1zcElkKFxuICAgICAgY29udGV4dC5nZXQoXCJpZGVudGl0eVwiKSBhcyBzdHJpbmcgfCBDbGllbnRJZGVudGl0eSB8IHVuZGVmaW5lZFxuICAgICk7XG4gIGlmICghbXNwKVxuICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBgVGhlcmUncyBubyBhc3NpZ25lZCBvcmdhbml6YXRpb24gZm9yIG1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX1gXG4gICAgKTtcblxuICBjb25zdCBjb2xsZWN0aW9uUmVzb2x2ZXIgPSBkYXRhQXJyYXlbMF0uY29sbGVjdGlvbnM7XG4gIGNvbnN0IGNvbGxlY3Rpb24gPVxuICAgIHR5cGVvZiBjb2xsZWN0aW9uUmVzb2x2ZXIgPT09IFwic3RyaW5nXCJcbiAgICAgID8gY29sbGVjdGlvblJlc29sdmVyXG4gICAgICA6IGNvbGxlY3Rpb25SZXNvbHZlcihtb2RlbCwgbXNwLCBjb250ZXh0KTtcblxuICBrZXlBcnJheS5mb3JFYWNoKChrLCBpKSA9PiB7XG4gICAgY29uc3QgYyA9XG4gICAgICB0eXBlb2YgZGF0YUFycmF5W2ldLmNvbGxlY3Rpb25zID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gZGF0YUFycmF5W2ldLmNvbGxlY3Rpb25zXG4gICAgICAgIDogZGF0YUFycmF5W2ldLmNvbGxlY3Rpb25zKG1vZGVsLCBtc3AsIGNvbnRleHQpO1xuICAgIGlmIChjICE9PSBjb2xsZWN0aW9uKVxuICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICAgIGBTZWdyZWdhdGVkIGRhdGEgY29sbGVjdGlvbiBtaXNtYXRjaDogJHtjfSB2cyAke2NvbGxlY3Rpb259YFxuICAgICAgKTtcbiAgfSk7XG5cbiAgY29uc3Qga2V5U3RyaW5ncyA9IChrZXlBcnJheSBhcyAoa2V5b2YgTSlbXSkubWFwKChrZXkpID0+IFN0cmluZyhrZXkpKTtcbiAgLy8gU3RvcmUgdGhlIG9yaWdpbmFsIG1vZGVsIOKAlCBwcmVwYXJlKCkgd2lsbCBmaWx0ZXIgdG8gY29sbGVjdGlvbi1zcGVjaWZpYyBmaWVsZHNcbiAgKGNvbnRleHQgYXMgRmFicmljQ29udHJhY3RDb250ZXh0KS53cml0ZVRvKGNvbGxlY3Rpb24sIGtleVN0cmluZ3MpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VncmVnYXRlZERhdGFPbkRlbGV0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBhbnk+LFxuICBWIGV4dGVuZHMgU2VncmVnYXRlZERhdGFNZXRhZGF0YSxcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHRPZjxSPixcbiAgZGF0YTogViB8IFZbXSxcbiAga2V5OiAoa2V5b2YgTSlbXSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkYXRhQXJyYXkgPSAoQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbZGF0YV0pIGFzIFZbXTtcbiAgY29uc3Qga2V5QXJyYXkgPSAoQXJyYXkuaXNBcnJheShrZXkpID8ga2V5IDogW2tleV0pIGFzIChrZXlvZiBNKVtdO1xuICBpZiAoa2V5QXJyYXkubGVuZ3RoICE9PSBkYXRhQXJyYXkubGVuZ3RoKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYFNlZ3JlZ2F0ZWQgZGF0YSBrZXlzIGFuZCBtZXRhZGF0YSBsZW5ndGggbWlzbWF0Y2hgXG4gICAgKTtcblxuICBjb25zdCBtID1cbiAgICBjb250ZXh0LmdldE9yVW5kZWZpbmVkKFwiYWxsb3dHZW5lcmF0aW9uT3ZlcnJpZGVcIikgfHwgZmFsc2VcbiAgICAgID8gY29udGV4dC5nZXRPclVuZGVmaW5lZChcIm93bmVyT3ZlcnJpZGVcIilcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gIGNvbnN0IG1zcCA9XG4gICAgbSB8fFxuICAgIE1vZGVsLm93bmVyT2YobW9kZWwpIHx8XG4gICAgZXh0cmFjdE1zcElkKFxuICAgICAgY29udGV4dC5nZXQoXCJpZGVudGl0eVwiKSBhcyBzdHJpbmcgfCBDbGllbnRJZGVudGl0eSB8IHVuZGVmaW5lZFxuICAgICk7XG4gIGlmICghbXNwKVxuICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBgVGhlcmUncyBubyBhc3NpZ25lZCBvcmdhbml6YXRpb24gZm9yIG1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX1gXG4gICAgKTtcblxuICBjb25zdCBjb2xsZWN0aW9uUmVzb2x2ZXIgPSBkYXRhQXJyYXlbMF0uY29sbGVjdGlvbnM7XG4gIGNvbnN0IGNvbGxlY3Rpb24gPVxuICAgIHR5cGVvZiBjb2xsZWN0aW9uUmVzb2x2ZXIgPT09IFwic3RyaW5nXCJcbiAgICAgID8gY29sbGVjdGlvblJlc29sdmVyXG4gICAgICA6IGNvbGxlY3Rpb25SZXNvbHZlcihtb2RlbCwgbXNwLCBjb250ZXh0KTtcblxuICAoY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQpLnJlYWRGcm9tKGNvbGxlY3Rpb24pO1xufVxuXG5mdW5jdGlvbiBzZWdyZWdhdGVkKFxuICBjb2xsZWN0aW9uOiBzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIsXG4gIHR5cGU6IEZhYnJpY01vZGVsS2V5cy5QUklWQVRFIHwgRmFicmljTW9kZWxLZXlzLlNIQVJFRCxcbiAgZmlsdGVyPzogKHByb3BOYW1lOiBzdHJpbmcpID0+IGJvb2xlYW5cbikge1xuICByZXR1cm4gZnVuY3Rpb24gaW5uZXJTZWdyZWdhdGVkKHRhcmdldDogb2JqZWN0LCBwcm9wZXJ0eUtleT86IGFueSkge1xuICAgIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREZWModGFyZ2V0OiBvYmplY3QsIHByb3BlcnR5S2V5PzogYW55KSB7XG4gICAgICBjb25zdCBrZXkgPSBNZXRhZGF0YS5rZXkodHlwZSwgcHJvcGVydHlLZXkpO1xuICAgICAgY29uc3QgY29uc3RyOiBDb25zdHJ1Y3RvciA9IHRhcmdldC5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjtcblxuICAgICAgY29uc3QgbWV0YSA9IE1ldGFkYXRhLmdldChjb25zdHIgYXMgQ29uc3RydWN0b3IsIGtleSkgfHwge307XG4gICAgICBjb25zdCBjb2xsZWN0aW9ucyA9IG5ldyBTZXQobWV0YS5jb2xsZWN0aW9ucyB8fCBbXSk7XG4gICAgICBjb2xsZWN0aW9ucy5hZGQoY29sbGVjdGlvbik7XG4gICAgICBtZXRhLmNvbGxlY3Rpb25zID0gWy4uLmNvbGxlY3Rpb25zXTtcbiAgICAgIE1ldGFkYXRhLnNldChjb25zdHIgYXMgQ29uc3RydWN0b3IsIGtleSwgbWV0YSk7XG5cbiAgICAgIGNvbnN0IGNvbnN0ck1ldGEgPSBNZXRhZGF0YS5nZXQoY29uc3RyIGFzIENvbnN0cnVjdG9yLCB0eXBlKSB8fCB7fTtcbiAgICAgIGNvbnN0IGNvbnN0ckNvbGxlY3Rpb25zID0gbmV3IFNldChjb25zdHJNZXRhLmNvbGxlY3Rpb25zIHx8IFtdKTtcbiAgICAgIGNvbnN0ckNvbGxlY3Rpb25zLmFkZChjb2xsZWN0aW9uKTtcbiAgICAgIGNvbnN0ck1ldGEuY29sbGVjdGlvbnMgPSBbLi4uY29uc3RyQ29sbGVjdGlvbnNdO1xuICAgICAgTWV0YWRhdGEuc2V0KGNvbnN0ciBhcyBDb25zdHJ1Y3RvciwgdHlwZSwgY29uc3RyTWV0YSk7XG5cbiAgICAgIGNvbnN0IHRyYW5zaWVudE1ldGEgPVxuICAgICAgICBNZXRhZGF0YS5nZXQoY29uc3RyIGFzIENvbnN0cnVjdG9yLCBEQktleXMuVFJBTlNJRU5UKSB8fCB7fTtcbiAgICAgIGNvbnN0IHVwZGF0ZWRUcmFuc2llbnRNZXRhID0ge1xuICAgICAgICAuLi50cmFuc2llbnRNZXRhLFxuICAgICAgICBbcHJvcGVydHlLZXkgYXMgYW55XToge30sXG4gICAgICB9O1xuICAgICAgTWV0YWRhdGEuc2V0KFxuICAgICAgICBjb25zdHIgYXMgQ29uc3RydWN0b3IsXG4gICAgICAgIERCS2V5cy5UUkFOU0lFTlQsXG4gICAgICAgIHVwZGF0ZWRUcmFuc2llbnRNZXRhXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGRlY3M6IGFueVtdID0gW107XG4gICAgaWYgKCFwcm9wZXJ0eUtleSkge1xuICAgICAgLy8gZGVjb3JhdGVkIGF0IHRoZSBjbGFzcyBsZXZlbFxuICAgICAgY29uc3QgcHJvcGVydGllcyA9IE1ldGFkYXRhLmdldEF0dHJpYnV0ZXModGFyZ2V0IGFzIENvbnN0cnVjdG9yKTtcbiAgICAgIHByb3BlcnRpZXM/LmZvckVhY2goKHApID0+IHtcbiAgICAgICAgaWYgKCFmaWx0ZXIgfHwgZmlsdGVyKHApKSB7XG4gICAgICAgICAgc2VncmVnYXRlZChjb2xsZWN0aW9uLCB0eXBlKSgodGFyZ2V0IGFzIGFueSkucHJvdG90eXBlLCBwKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBncm91cE5hbWUgPVxuICAgICAgICB0eXBlb2YgY29sbGVjdGlvbiA9PT0gXCJzdHJpbmdcIiA/IGNvbGxlY3Rpb24gOiBjb2xsZWN0aW9uLnRvU3RyaW5nKCk7XG4gICAgICAvLyBVc2UgZGlmZmVyZW50IGdyb3VwIG5hbWVzIGZvciBleHRyYWN0aW9uIHZzIGRhdGEgaGFuZGxlcnMgdG8gcHJldmVudCBtZXJnaW5nXG4gICAgICBjb25zdCBleHRyYWN0R3JvdXBOYW1lID0gYCR7Z3JvdXBOYW1lfTpleHRyYWN0YDtcbiAgICAgIGNvbnN0IGRhdGFHcm91cE5hbWUgPSBgJHtncm91cE5hbWV9OmRhdGFgO1xuICAgICAgY29uc3QgZWFybHlFeHRyYWN0aW9uTWV0YSA9IHsgY29sbGVjdGlvbnM6IGNvbGxlY3Rpb24gfTtcbiAgICAgIGNvbnN0IGVhcmx5RXh0cmFjdGlvbkdyb3VwU29ydCA9IHtcbiAgICAgICAgcHJpb3JpdHk6IFNFR1JFR0FURURfQ09MTEVDVElPTl9FWFRSQUNUSU9OX1BSSU9SSVRZLFxuICAgICAgICBncm91cDogZXh0cmFjdEdyb3VwTmFtZSxcbiAgICAgIH07XG4gICAgICBkZWNzLnB1c2goXG4gICAgICAgIHByb3AoKSxcbiAgICAgICAgdHJhbnNpZW50KCksXG4gICAgICAgIHNlZ3JlZ2F0ZWREZWMsXG4gICAgICAgIC8vIEVhcmx5IGV4dHJhY3Rpb24gaGFuZGxlcnMgLSBydW4gQkVGT1JFIHBrIGdlbmVyYXRpb24gKHByaW9yaXR5IDYwKVxuICAgICAgICAvLyBUaGlzIGVuc3VyZXMgY29sbGVjdGlvbnMgYXJlIHJlZ2lzdGVyZWQgaW4gY29udGV4dCBmb3Igc2VxdWVuY2UgcmVwbGljYXRpb25cbiAgICAgICAgLy8gV2UgcmVnaXN0ZXIgZm9yIGVhY2ggb3BlcmF0aW9uIGV4cGxpY2l0bHkgdG8gZW5zdXJlIHByb3BlciBoYW5kbGVyIGxvb2t1cFxuICAgICAgICBvbihcbiAgICAgICAgICBEQk9wZXJhdGlvbnMuQUxMLFxuICAgICAgICAgIGV4dHJhY3RTZWdyZWdhdGVkQ29sbGVjdGlvbnMgYXMgYW55LFxuICAgICAgICAgIGVhcmx5RXh0cmFjdGlvbk1ldGEsXG4gICAgICAgICAgZWFybHlFeHRyYWN0aW9uR3JvdXBTb3J0XG4gICAgICAgICksXG4gICAgICAgIC8vIE1haW4gaGFuZGxlcnMgZm9yIHNlZ3JlZ2F0ZWQgZGF0YSBvcGVyYXRpb25zIChwcmlvcml0eSA5NSlcbiAgICAgICAgb25DcmVhdGUoXG4gICAgICAgICAgc2VncmVnYXRlZERhdGFPbkNyZWF0ZSxcbiAgICAgICAgICB7IGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9uIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJpb3JpdHk6IDk1LFxuICAgICAgICAgICAgZ3JvdXA6IGRhdGFHcm91cE5hbWUsXG4gICAgICAgICAgfVxuICAgICAgICApLFxuICAgICAgICBvblJlYWQoXG4gICAgICAgICAgc2VncmVnYXRlZERhdGFPblJlYWQgYXMgYW55LFxuICAgICAgICAgIHsgY29sbGVjdGlvbnM6IGNvbGxlY3Rpb24gfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwcmlvcml0eTogOTUsXG4gICAgICAgICAgICBncm91cDogZGF0YUdyb3VwTmFtZSxcbiAgICAgICAgICB9XG4gICAgICAgICksXG4gICAgICAgIG9uVXBkYXRlKFxuICAgICAgICAgIHNlZ3JlZ2F0ZWREYXRhT25VcGRhdGUgYXMgYW55LFxuICAgICAgICAgIHsgY29sbGVjdGlvbnM6IGNvbGxlY3Rpb24gfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwcmlvcml0eTogOTUsXG4gICAgICAgICAgICBncm91cDogZGF0YUdyb3VwTmFtZSxcbiAgICAgICAgICB9XG4gICAgICAgICksXG4gICAgICAgIG9uRGVsZXRlKFxuICAgICAgICAgIHNlZ3JlZ2F0ZWREYXRhT25EZWxldGUgYXMgYW55LFxuICAgICAgICAgIHsgY29sbGVjdGlvbnM6IGNvbGxlY3Rpb24gfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwcmlvcml0eTogOTUsXG4gICAgICAgICAgICBncm91cDogZGF0YUdyb3VwTmFtZSxcbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBhcHBseSguLi5kZWNzKSh0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVEYXRhKFxuICBjb2xsZWN0aW9uOiBzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIgPSBJbXBsaWNpdFByaXZhdGVDb2xsZWN0aW9uXG4pIHtcbiAgZnVuY3Rpb24gcHJpdmF0ZURhdGEoY29sbGVjdGlvbjogc3RyaW5nIHwgQ29sbGVjdGlvblJlc29sdmVyKSB7XG4gICAgcmV0dXJuIHNlZ3JlZ2F0ZWQoY29sbGVjdGlvbiwgRmFicmljTW9kZWxLZXlzLlBSSVZBVEUpO1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKEZhYnJpY01vZGVsS2V5cy5QUklWQVRFKVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiBwcml2YXRlRGF0YSxcbiAgICAgIGFyZ3M6IFtjb2xsZWN0aW9uXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hhcmVkRGF0YShjb2xsZWN0aW9uOiBzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIpIHtcbiAgZnVuY3Rpb24gc2hhcmVkRGF0YShjb2xsZWN0aW9uOiBzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIpIHtcbiAgICByZXR1cm4gc2VncmVnYXRlZChjb2xsZWN0aW9uLCBGYWJyaWNNb2RlbEtleXMuU0hBUkVEKTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihGYWJyaWNNb2RlbEtleXMuU0hBUkVEKVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiBzaGFyZWREYXRhLFxuICAgICAgYXJnczogW2NvbGxlY3Rpb25dLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG4iXX0=