@bitgo-beta/sdk-core 8.2.1-beta.172 → 8.2.1-beta.1721

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 (616) hide show
  1. package/dist/src/account-lib/baseCoin/baseTransaction.d.ts +0 -1
  2. package/dist/src/account-lib/baseCoin/baseTransaction.d.ts.map +1 -1
  3. package/dist/src/account-lib/baseCoin/baseTransactionBuilder.d.ts +3 -3
  4. package/dist/src/account-lib/baseCoin/baseTransactionBuilder.d.ts.map +1 -1
  5. package/dist/src/account-lib/baseCoin/baseTransactionBuilder.js +4 -3
  6. package/dist/src/account-lib/baseCoin/ed25519KeyPair.d.ts +1 -0
  7. package/dist/src/account-lib/baseCoin/ed25519KeyPair.d.ts.map +1 -1
  8. package/dist/src/account-lib/baseCoin/ed25519KeyPair.js +41 -29
  9. package/dist/src/account-lib/baseCoin/enum.d.ts +39 -5
  10. package/dist/src/account-lib/baseCoin/enum.d.ts.map +1 -1
  11. package/dist/src/account-lib/baseCoin/enum.js +68 -10
  12. package/dist/src/account-lib/baseCoin/errors.d.ts +3 -0
  13. package/dist/src/account-lib/baseCoin/errors.d.ts.map +1 -1
  14. package/dist/src/account-lib/baseCoin/errors.js +8 -2
  15. package/dist/src/account-lib/baseCoin/iface.d.ts +19 -35
  16. package/dist/src/account-lib/baseCoin/iface.d.ts.map +1 -1
  17. package/dist/src/account-lib/baseCoin/iface.js +26 -18
  18. package/dist/src/account-lib/baseCoin/index.d.ts +1 -1
  19. package/dist/src/account-lib/baseCoin/index.d.ts.map +1 -1
  20. package/dist/src/account-lib/baseCoin/index.js +8 -5
  21. package/dist/src/account-lib/baseCoin/messages/baseMessage.d.ts +88 -0
  22. package/dist/src/account-lib/baseCoin/messages/baseMessage.d.ts.map +1 -0
  23. package/dist/src/account-lib/baseCoin/messages/baseMessage.js +154 -0
  24. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilder.d.ts +67 -0
  25. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilder.d.ts.map +1 -0
  26. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilder.js +144 -0
  27. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts +33 -0
  28. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts.map +1 -0
  29. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilderFactory.js +45 -0
  30. package/dist/src/account-lib/baseCoin/messages/iface.d.ts +164 -0
  31. package/dist/src/account-lib/baseCoin/messages/iface.d.ts.map +1 -0
  32. package/dist/src/account-lib/baseCoin/messages/iface.js +3 -0
  33. package/dist/src/account-lib/baseCoin/messages/index.d.ts +6 -0
  34. package/dist/src/account-lib/baseCoin/messages/index.d.ts.map +1 -0
  35. package/dist/src/account-lib/baseCoin/messages/index.js +22 -0
  36. package/dist/src/account-lib/baseCoin/messages/simple/index.d.ts +3 -0
  37. package/dist/src/account-lib/baseCoin/messages/simple/index.d.ts.map +1 -0
  38. package/dist/src/account-lib/baseCoin/messages/simple/index.js +19 -0
  39. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessage.d.ts +13 -0
  40. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessage.d.ts.map +1 -0
  41. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessage.js +28 -0
  42. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessageBuilder.d.ts +21 -0
  43. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessageBuilder.d.ts.map +1 -0
  44. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessageBuilder.js +28 -0
  45. package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.d.ts +1 -2
  46. package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.d.ts.map +1 -1
  47. package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.js +38 -26
  48. package/dist/src/account-lib/index.js +23 -9
  49. package/dist/src/account-lib/mpc/index.d.ts +1 -1
  50. package/dist/src/account-lib/mpc/index.d.ts.map +1 -1
  51. package/dist/src/account-lib/mpc/index.js +6 -2
  52. package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts +2 -3
  53. package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts.map +1 -1
  54. package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.js +376 -354
  55. package/dist/src/account-lib/mpc/tss/ecdsa/index.js +23 -9
  56. package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.d.ts +2 -2
  57. package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.d.ts.map +1 -1
  58. package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.js +3 -3
  59. package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts +46 -53
  60. package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts.map +1 -1
  61. package/dist/src/account-lib/mpc/tss/ecdsa/types.js +1 -1
  62. package/dist/src/account-lib/mpc/tss/eddsa/eddsa.d.ts +0 -1
  63. package/dist/src/account-lib/mpc/tss/eddsa/eddsa.d.ts.map +1 -1
  64. package/dist/src/account-lib/mpc/tss/eddsa/eddsa.js +66 -69
  65. package/dist/src/account-lib/mpc/tss/eddsa/index.js +23 -9
  66. package/dist/src/account-lib/mpc/tss/eddsa/types.d.ts +1 -1
  67. package/dist/src/account-lib/mpc/tss/eddsa/types.d.ts.map +1 -1
  68. package/dist/src/account-lib/mpc/tss/eddsa/types.js +1 -1
  69. package/dist/src/account-lib/mpc/tss/index.js +23 -9
  70. package/dist/src/account-lib/mpc/util.d.ts +7 -1
  71. package/dist/src/account-lib/mpc/util.d.ts.map +1 -1
  72. package/dist/src/account-lib/mpc/util.js +24 -1
  73. package/dist/src/account-lib/staking/index.js +6 -2
  74. package/dist/src/account-lib/staking/utils.js +3 -3
  75. package/dist/src/account-lib/util/crypto.d.ts +8 -2
  76. package/dist/src/account-lib/util/crypto.d.ts.map +1 -1
  77. package/dist/src/account-lib/util/crypto.js +69 -38
  78. package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts +2 -1
  79. package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts.map +1 -1
  80. package/dist/src/account-lib/util/ed25519KeyDeriver.js +5 -3
  81. package/dist/src/api/bip32path.js +2 -3
  82. package/dist/src/api/index.js +6 -2
  83. package/dist/src/api/types.d.ts +8 -0
  84. package/dist/src/api/types.d.ts.map +1 -1
  85. package/dist/src/api/types.js +1 -1
  86. package/dist/src/bitgo/address-book/address-book.d.ts +61 -0
  87. package/dist/src/bitgo/address-book/address-book.d.ts.map +1 -0
  88. package/dist/src/bitgo/address-book/address-book.js +139 -0
  89. package/dist/src/bitgo/address-book/index.d.ts +3 -0
  90. package/dist/src/bitgo/address-book/index.d.ts.map +1 -0
  91. package/dist/src/bitgo/address-book/index.js +19 -0
  92. package/dist/src/bitgo/address-book/types.d.ts +170 -0
  93. package/dist/src/bitgo/address-book/types.d.ts.map +1 -0
  94. package/dist/src/bitgo/address-book/types.js +3 -0
  95. package/dist/src/bitgo/baseCoin/baseCoin.d.ts +96 -11
  96. package/dist/src/bitgo/baseCoin/baseCoin.d.ts.map +1 -1
  97. package/dist/src/bitgo/baseCoin/baseCoin.js +149 -16
  98. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +180 -28
  99. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
  100. package/dist/src/bitgo/baseCoin/iBaseCoin.js +14 -3
  101. package/dist/src/bitgo/baseCoin/index.js +6 -2
  102. package/dist/src/bitgo/bip32util.d.ts +3 -16
  103. package/dist/src/bitgo/bip32util.d.ts.map +1 -1
  104. package/dist/src/bitgo/bip32util.js +4 -56
  105. package/dist/src/bitgo/bitcoin.d.ts +0 -1
  106. package/dist/src/bitgo/bitcoin.d.ts.map +1 -1
  107. package/dist/src/bitgo/bitcoin.js +26 -13
  108. package/dist/src/bitgo/bitgoBase.d.ts +5 -1
  109. package/dist/src/bitgo/bitgoBase.d.ts.map +1 -1
  110. package/dist/src/bitgo/bitgoBase.js +1 -1
  111. package/dist/src/bitgo/coinFactory.d.ts +17 -3
  112. package/dist/src/bitgo/coinFactory.d.ts.map +1 -1
  113. package/dist/src/bitgo/coinFactory.js +26 -3
  114. package/dist/src/bitgo/config.d.ts +3 -95
  115. package/dist/src/bitgo/config.d.ts.map +1 -1
  116. package/dist/src/bitgo/config.js +26 -15
  117. package/dist/src/bitgo/ecdh.d.ts +0 -1
  118. package/dist/src/bitgo/ecdh.d.ts.map +1 -1
  119. package/dist/src/bitgo/ecdh.js +26 -13
  120. package/dist/src/bitgo/enterprise/enterprise.d.ts +3 -13
  121. package/dist/src/bitgo/enterprise/enterprise.d.ts.map +1 -1
  122. package/dist/src/bitgo/enterprise/enterprise.js +39 -34
  123. package/dist/src/bitgo/enterprise/enterprises.js +27 -13
  124. package/dist/src/bitgo/enterprise/iEnterprise.d.ts +2 -6
  125. package/dist/src/bitgo/enterprise/iEnterprise.d.ts.map +1 -1
  126. package/dist/src/bitgo/enterprise/iEnterprise.js +1 -1
  127. package/dist/src/bitgo/enterprise/index.js +6 -2
  128. package/dist/src/bitgo/environments.d.ts +68 -5
  129. package/dist/src/bitgo/environments.d.ts.map +1 -1
  130. package/dist/src/bitgo/environments.js +383 -40
  131. package/dist/src/bitgo/errors.d.ts +175 -0
  132. package/dist/src/bitgo/errors.d.ts.map +1 -1
  133. package/dist/src/bitgo/errors.js +166 -2
  134. package/dist/src/bitgo/evm/evmUtils.d.ts +26 -0
  135. package/dist/src/bitgo/evm/evmUtils.d.ts.map +1 -0
  136. package/dist/src/bitgo/evm/evmUtils.js +50 -0
  137. package/dist/src/bitgo/index.d.ts +3 -1
  138. package/dist/src/bitgo/index.d.ts.map +1 -1
  139. package/dist/src/bitgo/index.js +29 -11
  140. package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.d.ts +3 -3
  141. package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.d.ts.map +1 -1
  142. package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.js +1 -1
  143. package/dist/src/bitgo/inscriptionBuilder/index.js +6 -2
  144. package/dist/src/bitgo/internal/index.js +6 -2
  145. package/dist/src/bitgo/internal/internal.js +5 -6
  146. package/dist/src/bitgo/internal/keycard.js +6 -7
  147. package/dist/src/bitgo/keychain/decryptKeychain.d.ts +13 -0
  148. package/dist/src/bitgo/keychain/decryptKeychain.d.ts.map +1 -0
  149. package/dist/src/bitgo/keychain/decryptKeychain.js +35 -0
  150. package/dist/src/bitgo/keychain/iKeychains.d.ts +81 -7
  151. package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
  152. package/dist/src/bitgo/keychain/iKeychains.js +2 -2
  153. package/dist/src/bitgo/keychain/index.d.ts +1 -0
  154. package/dist/src/bitgo/keychain/index.d.ts.map +1 -1
  155. package/dist/src/bitgo/keychain/index.js +7 -2
  156. package/dist/src/bitgo/keychain/keychains.d.ts +29 -4
  157. package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
  158. package/dist/src/bitgo/keychain/keychains.js +174 -43
  159. package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts +3 -3
  160. package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts.map +1 -1
  161. package/dist/src/bitgo/keychain/ovcJsonCodec.js +23 -9
  162. package/dist/src/bitgo/legacyBitcoin.d.ts +0 -1
  163. package/dist/src/bitgo/legacyBitcoin.d.ts.map +1 -1
  164. package/dist/src/bitgo/legacyBitcoin.js +27 -13
  165. package/dist/src/bitgo/lightning/lightningWalletUtil.d.ts +7 -0
  166. package/dist/src/bitgo/lightning/lightningWalletUtil.d.ts.map +1 -0
  167. package/dist/src/bitgo/lightning/lightningWalletUtil.js +25 -0
  168. package/dist/src/bitgo/market/iMarkets.d.ts +2 -2
  169. package/dist/src/bitgo/market/iMarkets.d.ts.map +1 -1
  170. package/dist/src/bitgo/market/index.js +6 -2
  171. package/dist/src/bitgo/market/markets.js +23 -9
  172. package/dist/src/bitgo/pendingApproval/iPendingApproval.d.ts +1 -0
  173. package/dist/src/bitgo/pendingApproval/iPendingApproval.d.ts.map +1 -1
  174. package/dist/src/bitgo/pendingApproval/iPendingApproval.js +4 -4
  175. package/dist/src/bitgo/pendingApproval/index.js +6 -2
  176. package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts +20 -8
  177. package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts.map +1 -1
  178. package/dist/src/bitgo/pendingApproval/pendingApproval.js +231 -111
  179. package/dist/src/bitgo/pendingApproval/pendingApprovals.js +23 -9
  180. package/dist/src/bitgo/proofs/WalletProofs.d.ts +19 -0
  181. package/dist/src/bitgo/proofs/WalletProofs.d.ts.map +1 -0
  182. package/dist/src/bitgo/proofs/WalletProofs.js +37 -0
  183. package/dist/src/bitgo/proofs/index.d.ts +2 -0
  184. package/dist/src/bitgo/proofs/index.d.ts.map +1 -0
  185. package/dist/src/bitgo/proofs/index.js +6 -0
  186. package/dist/src/bitgo/proofs/types.d.ts +80 -0
  187. package/dist/src/bitgo/proofs/types.d.ts.map +1 -0
  188. package/dist/src/bitgo/proofs/types.js +80 -0
  189. package/dist/src/bitgo/recovery/index.js +6 -2
  190. package/dist/src/bitgo/recovery/initiate.d.ts +8 -1
  191. package/dist/src/bitgo/recovery/initiate.d.ts.map +1 -1
  192. package/dist/src/bitgo/recovery/initiate.js +14 -8
  193. package/dist/src/bitgo/staking/goStakingInterfaces.d.ts +132 -0
  194. package/dist/src/bitgo/staking/goStakingInterfaces.d.ts.map +1 -0
  195. package/dist/src/bitgo/staking/goStakingInterfaces.js +3 -0
  196. package/dist/src/bitgo/staking/goStakingWallet.d.ts +62 -0
  197. package/dist/src/bitgo/staking/goStakingWallet.d.ts.map +1 -0
  198. package/dist/src/bitgo/staking/goStakingWallet.js +141 -0
  199. package/dist/src/bitgo/staking/iGoStakingWallet.d.ts +17 -0
  200. package/dist/src/bitgo/staking/iGoStakingWallet.d.ts.map +1 -0
  201. package/dist/src/bitgo/staking/iGoStakingWallet.js +3 -0
  202. package/dist/src/bitgo/staking/iStakingWallet.d.ts +173 -7
  203. package/dist/src/bitgo/staking/iStakingWallet.d.ts.map +1 -1
  204. package/dist/src/bitgo/staking/iStakingWallet.js +2 -2
  205. package/dist/src/bitgo/staking/index.d.ts +3 -0
  206. package/dist/src/bitgo/staking/index.d.ts.map +1 -1
  207. package/dist/src/bitgo/staking/index.js +9 -2
  208. package/dist/src/bitgo/staking/stakingWallet.d.ts +21 -8
  209. package/dist/src/bitgo/staking/stakingWallet.d.ts.map +1 -1
  210. package/dist/src/bitgo/staking/stakingWallet.js +140 -7
  211. package/dist/src/bitgo/trading/iTradingAccount.d.ts +2 -32
  212. package/dist/src/bitgo/trading/iTradingAccount.d.ts.map +1 -1
  213. package/dist/src/bitgo/trading/iTradingAccount.js +1 -1
  214. package/dist/src/bitgo/trading/index.d.ts +1 -15
  215. package/dist/src/bitgo/trading/index.d.ts.map +1 -1
  216. package/dist/src/bitgo/trading/index.js +7 -17
  217. package/dist/src/bitgo/trading/network/decrypt-aes-gcm.d.ts +8 -0
  218. package/dist/src/bitgo/trading/network/decrypt-aes-gcm.d.ts.map +1 -0
  219. package/dist/src/bitgo/trading/network/decrypt-aes-gcm.js +31 -0
  220. package/dist/src/bitgo/trading/network/decrypt-rsa.d.ts +8 -0
  221. package/dist/src/bitgo/trading/network/decrypt-rsa.d.ts.map +1 -0
  222. package/dist/src/bitgo/trading/network/decrypt-rsa.js +23 -0
  223. package/dist/src/bitgo/trading/network/decrypt.d.ts +14 -0
  224. package/dist/src/bitgo/trading/network/decrypt.d.ts.map +1 -0
  225. package/dist/src/bitgo/trading/network/decrypt.js +23 -0
  226. package/dist/src/bitgo/trading/network/encrypt-aes-gcm.d.ts +8 -0
  227. package/dist/src/bitgo/trading/network/encrypt-aes-gcm.d.ts.map +1 -0
  228. package/dist/src/bitgo/trading/network/encrypt-aes-gcm.js +25 -0
  229. package/dist/src/bitgo/trading/network/encrypt-rsa-browser.d.ts +8 -0
  230. package/dist/src/bitgo/trading/network/encrypt-rsa-browser.d.ts.map +1 -0
  231. package/dist/src/bitgo/trading/network/encrypt-rsa-browser.js +65 -0
  232. package/dist/src/bitgo/trading/network/encrypt-rsa.d.ts +8 -0
  233. package/dist/src/bitgo/trading/network/encrypt-rsa.d.ts.map +1 -0
  234. package/dist/src/bitgo/trading/network/encrypt-rsa.js +23 -0
  235. package/dist/src/bitgo/trading/network/encrypt.d.ts +37 -0
  236. package/dist/src/bitgo/trading/network/encrypt.d.ts.map +1 -0
  237. package/dist/src/bitgo/trading/network/encrypt.js +58 -0
  238. package/dist/src/bitgo/trading/network/index.d.ts +5 -0
  239. package/dist/src/bitgo/trading/network/index.d.ts.map +1 -0
  240. package/dist/src/bitgo/trading/network/index.js +21 -0
  241. package/dist/src/bitgo/trading/network/network.d.ts +36 -0
  242. package/dist/src/bitgo/trading/network/network.d.ts.map +1 -0
  243. package/dist/src/bitgo/trading/network/network.js +101 -0
  244. package/dist/src/bitgo/trading/network/types.d.ts +277 -0
  245. package/dist/src/bitgo/trading/network/types.d.ts.map +1 -0
  246. package/dist/src/bitgo/trading/network/types.js +3 -0
  247. package/dist/src/bitgo/trading/network/utils.d.ts +20 -0
  248. package/dist/src/bitgo/trading/network/utils.d.ts.map +1 -0
  249. package/dist/src/bitgo/trading/network/utils.js +54 -0
  250. package/dist/src/bitgo/trading/tradingAccount.d.ts +11 -35
  251. package/dist/src/bitgo/trading/tradingAccount.d.ts.map +1 -1
  252. package/dist/src/bitgo/trading/tradingAccount.js +9 -96
  253. package/dist/src/bitgo/tss/bitgoPubKeys.d.ts +38 -0
  254. package/dist/src/bitgo/tss/bitgoPubKeys.d.ts.map +1 -0
  255. package/dist/src/bitgo/tss/bitgoPubKeys.js +75 -0
  256. package/dist/src/bitgo/tss/common.d.ts +37 -5
  257. package/dist/src/bitgo/tss/common.d.ts.map +1 -1
  258. package/dist/src/bitgo/tss/common.js +103 -17
  259. package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts +6 -4
  260. package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts.map +1 -1
  261. package/dist/src/bitgo/tss/ecdsa/ecdsa.js +78 -66
  262. package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.d.ts +15 -0
  263. package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
  264. package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.js +167 -0
  265. package/dist/src/bitgo/tss/ecdsa/index.d.ts +1 -0
  266. package/dist/src/bitgo/tss/ecdsa/index.d.ts.map +1 -1
  267. package/dist/src/bitgo/tss/ecdsa/index.js +25 -10
  268. package/dist/src/bitgo/tss/ecdsa/types.d.ts +27 -27
  269. package/dist/src/bitgo/tss/ecdsa/types.d.ts.map +1 -1
  270. package/dist/src/bitgo/tss/ecdsa/types.js +3 -3
  271. package/dist/src/bitgo/tss/eddsa/eddsa.d.ts +15 -6
  272. package/dist/src/bitgo/tss/eddsa/eddsa.d.ts.map +1 -1
  273. package/dist/src/bitgo/tss/eddsa/eddsa.js +47 -40
  274. package/dist/src/bitgo/tss/eddsa/index.js +23 -9
  275. package/dist/src/bitgo/tss/eddsa/types.d.ts +4 -4
  276. package/dist/src/bitgo/tss/eddsa/types.d.ts.map +1 -1
  277. package/dist/src/bitgo/tss/index.d.ts +3 -2
  278. package/dist/src/bitgo/tss/index.d.ts.map +1 -1
  279. package/dist/src/bitgo/tss/index.js +26 -10
  280. package/dist/src/bitgo/tss/types.d.ts +3 -3
  281. package/dist/src/bitgo/tss/types.d.ts.map +1 -1
  282. package/dist/src/bitgo/tss/types.js +2 -2
  283. package/dist/src/bitgo/types.d.ts +3 -3
  284. package/dist/src/bitgo/types.d.ts.map +1 -1
  285. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts +8 -0
  286. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts.map +1 -1
  287. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.js +55 -13
  288. package/dist/src/bitgo/utils/codecProps.js +24 -11
  289. package/dist/src/bitgo/utils/codecs.d.ts +11 -0
  290. package/dist/src/bitgo/utils/codecs.d.ts.map +1 -0
  291. package/dist/src/bitgo/utils/codecs.js +59 -0
  292. package/dist/src/bitgo/utils/decode.d.ts.map +1 -1
  293. package/dist/src/bitgo/utils/decode.js +30 -16
  294. package/dist/src/bitgo/utils/index.d.ts +4 -2
  295. package/dist/src/bitgo/utils/index.d.ts.map +1 -1
  296. package/dist/src/bitgo/utils/index.js +27 -11
  297. package/dist/src/bitgo/utils/messageTypes.d.ts +38 -0
  298. package/dist/src/bitgo/utils/messageTypes.d.ts.map +1 -0
  299. package/dist/src/bitgo/utils/messageTypes.js +15 -0
  300. package/dist/src/bitgo/utils/mpcUtils.d.ts +2 -3
  301. package/dist/src/bitgo/utils/mpcUtils.d.ts.map +1 -1
  302. package/dist/src/bitgo/utils/mpcUtils.js +82 -14
  303. package/dist/src/bitgo/utils/notEmpty.d.ts +2 -0
  304. package/dist/src/bitgo/utils/notEmpty.d.ts.map +1 -0
  305. package/dist/src/bitgo/utils/notEmpty.js +7 -0
  306. package/dist/src/bitgo/utils/opengpgUtils.d.ts +12 -9
  307. package/dist/src/bitgo/utils/opengpgUtils.d.ts.map +1 -1
  308. package/dist/src/bitgo/utils/opengpgUtils.js +77 -64
  309. package/dist/src/bitgo/utils/postWithCodec.d.ts.map +1 -1
  310. package/dist/src/bitgo/utils/postWithCodec.js +4 -38
  311. package/dist/src/bitgo/utils/promise-utils.d.ts +1 -1
  312. package/dist/src/bitgo/utils/promise-utils.d.ts.map +1 -1
  313. package/dist/src/bitgo/utils/promise-utils.js +2 -3
  314. package/dist/src/bitgo/utils/transactionUtils.d.ts +9 -0
  315. package/dist/src/bitgo/utils/transactionUtils.d.ts.map +1 -0
  316. package/dist/src/bitgo/utils/transactionUtils.js +29 -0
  317. package/dist/src/bitgo/utils/triple.d.ts +1 -1
  318. package/dist/src/bitgo/utils/triple.d.ts.map +1 -1
  319. package/dist/src/bitgo/utils/triple.js +2 -3
  320. package/dist/src/bitgo/utils/tss/addressVerification.d.ts +37 -0
  321. package/dist/src/bitgo/utils/tss/addressVerification.d.ts.map +1 -0
  322. package/dist/src/bitgo/utils/tss/addressVerification.js +75 -0
  323. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts +55 -16
  324. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
  325. package/dist/src/bitgo/utils/tss/baseTSSUtils.js +195 -47
  326. package/dist/src/bitgo/utils/tss/baseTypes.d.ts +251 -38
  327. package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
  328. package/dist/src/bitgo/utils/tss/baseTypes.js +22 -21
  329. package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.d.ts +23 -0
  330. package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.d.ts.map +1 -0
  331. package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.js +157 -0
  332. package/dist/src/bitgo/utils/tss/ecdsa/base.d.ts +28 -0
  333. package/dist/src/bitgo/utils/tss/ecdsa/base.d.ts.map +1 -0
  334. package/dist/src/bitgo/utils/tss/ecdsa/base.js +53 -0
  335. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts +17 -50
  336. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
  337. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +128 -238
  338. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +203 -0
  339. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
  340. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +973 -0
  341. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts +8 -0
  342. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts.map +1 -0
  343. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.js +13 -0
  344. package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts +4 -0
  345. package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts.map +1 -1
  346. package/dist/src/bitgo/utils/tss/ecdsa/index.js +10 -2
  347. package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts +7 -10
  348. package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts.map +1 -1
  349. package/dist/src/bitgo/utils/tss/ecdsa/types.js +1 -1
  350. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts +107 -0
  351. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts.map +1 -0
  352. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.js +55 -0
  353. package/dist/src/bitgo/utils/tss/eddsa/base.d.ts +18 -0
  354. package/dist/src/bitgo/utils/tss/eddsa/base.d.ts.map +1 -0
  355. package/dist/src/bitgo/utils/tss/eddsa/base.js +64 -0
  356. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +22 -8
  357. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
  358. package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +113 -66
  359. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +22 -0
  360. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
  361. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +215 -0
  362. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts +6 -0
  363. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts.map +1 -0
  364. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.js +13 -0
  365. package/dist/src/bitgo/utils/tss/eddsa/index.d.ts +3 -0
  366. package/dist/src/bitgo/utils/tss/eddsa/index.d.ts.map +1 -1
  367. package/dist/src/bitgo/utils/tss/eddsa/index.js +28 -8
  368. package/dist/src/bitgo/utils/tss/eddsa/types.d.ts +7 -7
  369. package/dist/src/bitgo/utils/tss/eddsa/types.d.ts.map +1 -1
  370. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts +40 -0
  371. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts.map +1 -0
  372. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.js +44 -0
  373. package/dist/src/bitgo/utils/tss/index.d.ts +1 -0
  374. package/dist/src/bitgo/utils/tss/index.d.ts.map +1 -1
  375. package/dist/src/bitgo/utils/tss/index.js +24 -9
  376. package/dist/src/bitgo/utils/tss/recipientUtils.d.ts +20 -0
  377. package/dist/src/bitgo/utils/tss/recipientUtils.d.ts.map +1 -0
  378. package/dist/src/bitgo/utils/tss/recipientUtils.js +46 -0
  379. package/dist/src/bitgo/utils/txRequest.d.ts +10 -0
  380. package/dist/src/bitgo/utils/txRequest.d.ts.map +1 -0
  381. package/dist/src/bitgo/utils/txRequest.js +47 -0
  382. package/dist/src/bitgo/utils/util.js +24 -10
  383. package/dist/src/bitgo/utils/wallet.d.ts +7 -0
  384. package/dist/src/bitgo/utils/wallet.d.ts.map +1 -0
  385. package/dist/src/bitgo/utils/wallet.js +48 -0
  386. package/dist/src/bitgo/wallet/BuildParams.d.ts +27 -1
  387. package/dist/src/bitgo/wallet/BuildParams.d.ts.map +1 -1
  388. package/dist/src/bitgo/wallet/BuildParams.js +45 -11
  389. package/dist/src/bitgo/wallet/iWallet.d.ts +388 -21
  390. package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
  391. package/dist/src/bitgo/wallet/iWallet.js +1 -1
  392. package/dist/src/bitgo/wallet/iWallets.d.ts +143 -18
  393. package/dist/src/bitgo/wallet/iWallets.d.ts.map +1 -1
  394. package/dist/src/bitgo/wallet/iWallets.js +55 -3
  395. package/dist/src/bitgo/wallet/index.js +6 -2
  396. package/dist/src/bitgo/wallet/wallet.d.ts +260 -22
  397. package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
  398. package/dist/src/bitgo/wallet/wallet.js +1421 -328
  399. package/dist/src/bitgo/wallet/wallets.d.ts +100 -9
  400. package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
  401. package/dist/src/bitgo/wallet/wallets.js +1014 -203
  402. package/dist/src/bitgo/walletUtil/iMessageProvider.d.ts +12 -0
  403. package/dist/src/bitgo/walletUtil/iMessageProvider.d.ts.map +1 -0
  404. package/dist/src/bitgo/walletUtil/iMessageProvider.js +3 -0
  405. package/dist/src/bitgo/walletUtil/index.d.ts +3 -0
  406. package/dist/src/bitgo/walletUtil/index.d.ts.map +1 -0
  407. package/dist/src/bitgo/walletUtil/index.js +19 -0
  408. package/dist/src/bitgo/walletUtil/midnightMessageProvider.d.ts +22 -0
  409. package/dist/src/bitgo/walletUtil/midnightMessageProvider.d.ts.map +1 -0
  410. package/dist/src/bitgo/walletUtil/midnightMessageProvider.js +95 -0
  411. package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.d.ts +9 -0
  412. package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.d.ts.map +1 -0
  413. package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.js +72 -0
  414. package/dist/src/bitgo/walletUtil/utxoMessageProof.d.ts +15 -0
  415. package/dist/src/bitgo/walletUtil/utxoMessageProof.d.ts.map +1 -0
  416. package/dist/src/bitgo/walletUtil/utxoMessageProof.js +40 -0
  417. package/dist/src/bitgo/webhook/index.js +6 -2
  418. package/dist/src/bitgo/webhook/webhooks.js +23 -9
  419. package/dist/src/coins/fiat.d.ts +45 -0
  420. package/dist/src/coins/fiat.d.ts.map +1 -0
  421. package/dist/src/coins/fiat.js +94 -0
  422. package/dist/src/coins/index.d.ts +1 -6
  423. package/dist/src/coins/index.d.ts.map +1 -1
  424. package/dist/src/coins/index.js +7 -8
  425. package/dist/src/coins/ofc.d.ts +3 -2
  426. package/dist/src/coins/ofc.d.ts.map +1 -1
  427. package/dist/src/coins/ofc.js +6 -2
  428. package/dist/src/coins/ofcToken.d.ts +2 -1
  429. package/dist/src/coins/ofcToken.d.ts.map +1 -1
  430. package/dist/src/coins/ofcToken.js +27 -2
  431. package/dist/src/coins/susd.d.ts +3 -2
  432. package/dist/src/coins/susd.d.ts.map +1 -1
  433. package/dist/src/coins/susd.js +5 -1
  434. package/dist/src/common.js +27 -13
  435. package/dist/src/index.d.ts +4 -1
  436. package/dist/src/index.d.ts.map +1 -1
  437. package/dist/src/index.js +30 -11
  438. package/dist/src/lightning.d.ts +2 -0
  439. package/dist/src/lightning.d.ts.map +1 -0
  440. package/dist/src/lightning.js +13 -0
  441. package/dist/src/units.js +5 -6
  442. package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.d.ts +2 -0
  443. package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.d.ts.map +1 -0
  444. package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.js +207 -0
  445. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.d.ts +2 -0
  446. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.d.ts.map +1 -0
  447. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.js +174 -0
  448. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts +2 -0
  449. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts.map +1 -0
  450. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.js +108 -0
  451. package/dist/test/unit/account-lib/baseCoin/messages/fixtures.d.ts +46 -0
  452. package/dist/test/unit/account-lib/baseCoin/messages/fixtures.d.ts.map +1 -0
  453. package/dist/test/unit/account-lib/baseCoin/messages/fixtures.js +69 -0
  454. package/dist/test/unit/account-lib/mpc/tss/ecdsa/ecdsa.js +91 -29
  455. package/dist/test/unit/account-lib/mpc/util.d.ts +2 -0
  456. package/dist/test/unit/account-lib/mpc/util.d.ts.map +1 -0
  457. package/dist/test/unit/account-lib/mpc/util.js +53 -0
  458. package/dist/test/unit/bitgo/environment.d.ts +2 -0
  459. package/dist/test/unit/bitgo/environment.d.ts.map +1 -0
  460. package/dist/test/unit/bitgo/environment.js +38 -0
  461. package/dist/test/unit/bitgo/errors.d.ts +2 -0
  462. package/dist/test/unit/bitgo/errors.d.ts.map +1 -0
  463. package/dist/test/unit/bitgo/errors.js +262 -0
  464. package/dist/test/unit/bitgo/trading/network/encrypt.d.ts +2 -0
  465. package/dist/test/unit/bitgo/trading/network/encrypt.d.ts.map +1 -0
  466. package/dist/test/unit/bitgo/trading/network/encrypt.js +71 -0
  467. package/dist/test/unit/bitgo/utils/abstractUtxoCoinUtil.js +24 -4
  468. package/dist/test/unit/bitgo/utils/messageTypes.d.ts +2 -0
  469. package/dist/test/unit/bitgo/utils/messageTypes.d.ts.map +1 -0
  470. package/dist/test/unit/bitgo/utils/messageTypes.js +64 -0
  471. package/dist/test/unit/bitgo/utils/notEmpty.d.ts +2 -0
  472. package/dist/test/unit/bitgo/utils/notEmpty.d.ts.map +1 -0
  473. package/dist/test/unit/bitgo/utils/notEmpty.js +15 -0
  474. package/dist/test/unit/bitgo/utils/postWithCodec.js +32 -38
  475. package/dist/test/unit/bitgo/utils/tss/addressVerification.d.ts +2 -0
  476. package/dist/test/unit/bitgo/utils/tss/addressVerification.d.ts.map +1 -0
  477. package/dist/test/unit/bitgo/utils/tss/addressVerification.js +85 -0
  478. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +2 -0
  479. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
  480. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +465 -0
  481. package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.d.ts +5 -0
  482. package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.d.ts.map +1 -0
  483. package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.js +36 -0
  484. package/dist/test/unit/bitgo/utils/tss/recipientUtils.d.ts +2 -0
  485. package/dist/test/unit/bitgo/utils/tss/recipientUtils.d.ts.map +1 -0
  486. package/dist/test/unit/bitgo/utils/tss/recipientUtils.js +137 -0
  487. package/dist/test/unit/bitgo/utils/txRequest.d.ts +2 -0
  488. package/dist/test/unit/bitgo/utils/txRequest.d.ts.map +1 -0
  489. package/dist/test/unit/bitgo/utils/txRequest.js +105 -0
  490. package/dist/test/unit/bitgo/wallet/BuildParams.d.ts +2 -0
  491. package/dist/test/unit/bitgo/wallet/BuildParams.d.ts.map +1 -0
  492. package/dist/test/unit/bitgo/wallet/BuildParams.js +68 -0
  493. package/dist/test/unit/bitgo/wallet/SendTransactionRequest.js +23 -9
  494. package/dist/test/unit/bitgo/wallet/getAccountResources.d.ts +2 -0
  495. package/dist/test/unit/bitgo/wallet/getAccountResources.d.ts.map +1 -0
  496. package/dist/test/unit/bitgo/wallet/getAccountResources.js +133 -0
  497. package/dist/test/unit/bitgo/wallet/getResourceDelegations.d.ts +2 -0
  498. package/dist/test/unit/bitgo/wallet/getResourceDelegations.d.ts.map +1 -0
  499. package/dist/test/unit/bitgo/wallet/getResourceDelegations.js +118 -0
  500. package/dist/test/unit/bitgo/wallet/tokenApproval.d.ts +2 -0
  501. package/dist/test/unit/bitgo/wallet/tokenApproval.d.ts.map +1 -0
  502. package/dist/test/unit/bitgo/wallet/tokenApproval.js +135 -0
  503. package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.d.ts +2 -0
  504. package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.d.ts.map +1 -0
  505. package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.js +181 -0
  506. package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.d.ts +2 -0
  507. package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.d.ts.map +1 -0
  508. package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.js +276 -0
  509. package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.d.ts +2 -0
  510. package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.d.ts.map +1 -0
  511. package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.js +216 -0
  512. package/dist/test/unit/bitgo/wallet/walletsWebauthn.d.ts +2 -0
  513. package/dist/test/unit/bitgo/wallet/walletsWebauthn.d.ts.map +1 -0
  514. package/dist/test/unit/bitgo/wallet/walletsWebauthn.js +197 -0
  515. package/dist/test/unit/lightning.d.ts +2 -0
  516. package/dist/test/unit/lightning.d.ts.map +1 -0
  517. package/dist/test/unit/lightning.js +23 -0
  518. package/dist/test/unit/units.d.ts.map +1 -1
  519. package/dist/test/unit/units.js +64 -64
  520. package/dist/tsconfig.tsbuildinfo +1 -1
  521. package/package.json +24 -21
  522. package/.eslintignore +0 -5
  523. package/CHANGELOG.md +0 -1367
  524. package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts +0 -77
  525. package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts.map +0 -1
  526. package/dist/src/account-lib/baseCoin/blsKeyPair.js +0 -209
  527. package/dist/src/bitgo/lightning/iLightning.d.ts +0 -186
  528. package/dist/src/bitgo/lightning/iLightning.d.ts.map +0 -1
  529. package/dist/src/bitgo/lightning/iLightning.js +0 -106
  530. package/dist/src/bitgo/lightning/index.d.ts +0 -5
  531. package/dist/src/bitgo/lightning/index.d.ts.map +0 -1
  532. package/dist/src/bitgo/lightning/index.js +0 -17
  533. package/dist/src/bitgo/lightning/lightning.d.ts +0 -25
  534. package/dist/src/bitgo/lightning/lightning.d.ts.map +0 -1
  535. package/dist/src/bitgo/lightning/lightning.js +0 -111
  536. package/dist/src/bitgo/lightning/lightningUtils.d.ts +0 -46
  537. package/dist/src/bitgo/lightning/lightningUtils.d.ts.map +0 -1
  538. package/dist/src/bitgo/lightning/lightningUtils.js +0 -133
  539. package/dist/src/bitgo/lightning/lnurlCodec.d.ts +0 -3
  540. package/dist/src/bitgo/lightning/lnurlCodec.d.ts.map +0 -1
  541. package/dist/src/bitgo/lightning/lnurlCodec.js +0 -28
  542. package/dist/src/bitgo/trading/affirmation.d.ts +0 -35
  543. package/dist/src/bitgo/trading/affirmation.d.ts.map +0 -1
  544. package/dist/src/bitgo/trading/affirmation.js +0 -53
  545. package/dist/src/bitgo/trading/affirmations.d.ts +0 -23
  546. package/dist/src/bitgo/trading/affirmations.d.ts.map +0 -1
  547. package/dist/src/bitgo/trading/affirmations.js +0 -45
  548. package/dist/src/bitgo/trading/iAffirmation.d.ts +0 -15
  549. package/dist/src/bitgo/trading/iAffirmation.d.ts.map +0 -1
  550. package/dist/src/bitgo/trading/iAffirmation.js +0 -13
  551. package/dist/src/bitgo/trading/iAffirmations.d.ts +0 -10
  552. package/dist/src/bitgo/trading/iAffirmations.d.ts.map +0 -1
  553. package/dist/src/bitgo/trading/iAffirmations.js +0 -3
  554. package/dist/src/bitgo/trading/iSettlement.d.ts +0 -25
  555. package/dist/src/bitgo/trading/iSettlement.d.ts.map +0 -1
  556. package/dist/src/bitgo/trading/iSettlement.js +0 -17
  557. package/dist/src/bitgo/trading/iSettlements.d.ts +0 -19
  558. package/dist/src/bitgo/trading/iSettlements.d.ts.map +0 -1
  559. package/dist/src/bitgo/trading/iSettlements.js +0 -3
  560. package/dist/src/bitgo/trading/iTradingPartner.d.ts +0 -14
  561. package/dist/src/bitgo/trading/iTradingPartner.d.ts.map +0 -1
  562. package/dist/src/bitgo/trading/iTradingPartner.js +0 -17
  563. package/dist/src/bitgo/trading/iTradingPartners.d.ts +0 -15
  564. package/dist/src/bitgo/trading/iTradingPartners.d.ts.map +0 -1
  565. package/dist/src/bitgo/trading/iTradingPartners.js +0 -9
  566. package/dist/src/bitgo/trading/lock.d.ts +0 -16
  567. package/dist/src/bitgo/trading/lock.d.ts.map +0 -1
  568. package/dist/src/bitgo/trading/lock.js +0 -12
  569. package/dist/src/bitgo/trading/payload.d.ts +0 -22
  570. package/dist/src/bitgo/trading/payload.d.ts.map +0 -1
  571. package/dist/src/bitgo/trading/payload.js +0 -3
  572. package/dist/src/bitgo/trading/settlement.d.ts +0 -16
  573. package/dist/src/bitgo/trading/settlement.d.ts.map +0 -1
  574. package/dist/src/bitgo/trading/settlement.js +0 -21
  575. package/dist/src/bitgo/trading/settlements.d.ts +0 -32
  576. package/dist/src/bitgo/trading/settlements.d.ts.map +0 -1
  577. package/dist/src/bitgo/trading/settlements.js +0 -61
  578. package/dist/src/bitgo/trading/trade.d.ts +0 -29
  579. package/dist/src/bitgo/trading/trade.d.ts.map +0 -1
  580. package/dist/src/bitgo/trading/trade.js +0 -11
  581. package/dist/src/bitgo/trading/tradingPartner.d.ts +0 -26
  582. package/dist/src/bitgo/trading/tradingPartner.d.ts.map +0 -1
  583. package/dist/src/bitgo/trading/tradingPartner.js +0 -31
  584. package/dist/src/bitgo/trading/tradingPartners.d.ts +0 -24
  585. package/dist/src/bitgo/trading/tradingPartners.d.ts.map +0 -1
  586. package/dist/src/bitgo/trading/tradingPartners.js +0 -32
  587. package/dist/src/bitgo/utils/blsUtils.d.ts +0 -52
  588. package/dist/src/bitgo/utils/blsUtils.d.ts.map +0 -1
  589. package/dist/src/bitgo/utils/blsUtils.js +0 -237
  590. package/dist/src/bitgo/utils/iBlsUtils.d.ts +0 -14
  591. package/dist/src/bitgo/utils/iBlsUtils.d.ts.map +0 -1
  592. package/dist/src/bitgo/utils/iBlsUtils.js +0 -3
  593. package/dist/src/coins/fiateur.d.ts +0 -31
  594. package/dist/src/coins/fiateur.d.ts.map +0 -1
  595. package/dist/src/coins/fiateur.js +0 -57
  596. package/dist/src/coins/fiatgbp.d.ts +0 -31
  597. package/dist/src/coins/fiatgbp.d.ts.map +0 -1
  598. package/dist/src/coins/fiatgbp.js +0 -57
  599. package/dist/src/coins/fiatusd.d.ts +0 -31
  600. package/dist/src/coins/fiatusd.d.ts.map +0 -1
  601. package/dist/src/coins/fiatusd.js +0 -57
  602. package/dist/src/coins/tfiateur.d.ts +0 -11
  603. package/dist/src/coins/tfiateur.d.ts.map +0 -1
  604. package/dist/src/coins/tfiateur.js +0 -17
  605. package/dist/src/coins/tfiatgbp.d.ts +0 -11
  606. package/dist/src/coins/tfiatgbp.d.ts.map +0 -1
  607. package/dist/src/coins/tfiatgbp.js +0 -17
  608. package/dist/src/coins/tfiatusd.d.ts +0 -11
  609. package/dist/src/coins/tfiatusd.d.ts.map +0 -1
  610. package/dist/src/coins/tfiatusd.js +0 -17
  611. package/dist/src/openssl/index.d.ts +0 -5
  612. package/dist/src/openssl/index.d.ts.map +0 -1
  613. package/dist/src/openssl/index.js +0 -9
  614. package/dist/test/unit/openssl.d.ts +0 -2
  615. package/dist/test/unit/openssl.d.ts.map +0 -1
  616. package/dist/test/unit/openssl.js +0 -39
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
3
  if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
5
9
  }) : (function(o, m, k, k2) {
6
10
  if (k2 === undefined) k2 = k;
7
11
  o[k2] = m[k];
@@ -11,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
11
15
  }) : function(o, v) {
12
16
  o["default"] = v;
13
17
  });
14
- var __importStar = (this && this.__importStar) || function (mod) {
15
- if (mod && mod.__esModule) return mod;
16
- var result = {};
17
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
- __setModuleDefault(result, mod);
19
- return result;
20
- };
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
21
35
  var __importDefault = (this && this.__importDefault) || function (mod) {
22
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
23
37
  };
@@ -26,34 +40,38 @@ exports.Wallet = exports.ManageUnspentsOptions = void 0;
26
40
  /**
27
41
  * @prettier
28
42
  */
43
+ const public_types_1 = require("@bitgo/public-types");
44
+ const statics_1 = require("@bitgo-beta/statics");
29
45
  const assert_1 = __importDefault(require("assert"));
30
- const bignumber_js_1 = require("bignumber.js");
46
+ const bignumber_js_1 = __importDefault(require("bignumber.js"));
47
+ const t = __importStar(require("io-ts"));
31
48
  const _ = __importStar(require("lodash"));
32
49
  const common = __importStar(require("../../common"));
50
+ const address_book_1 = require("../address-book");
33
51
  const bitcoin_1 = require("../bitcoin");
34
52
  const ecdh_1 = require("../ecdh");
35
53
  const errors_1 = require("../errors");
54
+ const internal_1 = require("../internal");
36
55
  const internal = __importStar(require("../internal/internal"));
37
- const keycard_1 = require("../internal/keycard");
56
+ const keychain_1 = require("../keychain");
57
+ const lightningWalletUtil_1 = require("../lightning/lightningWalletUtil");
38
58
  const pendingApproval_1 = require("../pendingApproval");
39
- const tradingAccount_1 = require("../trading/tradingAccount");
59
+ const staking_1 = require("../staking");
60
+ const trading_1 = require("../trading");
61
+ const tss_1 = require("../tss");
40
62
  const utils_1 = require("../utils");
41
- const stakingWallet_1 = require("../staking/stakingWallet");
42
- const lightning_1 = require("../lightning");
43
- const eddsa_1 = __importDefault(require("../utils/tss/eddsa"));
63
+ const postWithCodec_1 = require("../utils/postWithCodec");
44
64
  const ecdsa_1 = require("../utils/tss/ecdsa");
45
- const tss_1 = require("../tss");
46
- const statics_1 = require("@bitgo-beta/statics");
65
+ const eddsa_1 = __importStar(require("../utils/tss/eddsa"));
66
+ const txRequest_1 = require("../utils/txRequest");
47
67
  const BuildParams_1 = require("./BuildParams");
48
- const postWithCodec_1 = require("../utils/postWithCodec");
49
- const public_types_1 = require("@bitgo/public-types");
50
68
  const debug = require('debug')('bitgo:v2:wallet');
51
69
  const whitelistedSendParams = public_types_1.TxSendBody.type.types.flatMap((t) => Object.keys(t.props));
52
70
  var ManageUnspentsOptions;
53
71
  (function (ManageUnspentsOptions) {
54
72
  ManageUnspentsOptions[ManageUnspentsOptions["BUILD_ONLY"] = 0] = "BUILD_ONLY";
55
73
  ManageUnspentsOptions[ManageUnspentsOptions["BUILD_SIGN_SEND"] = 1] = "BUILD_SIGN_SEND";
56
- })(ManageUnspentsOptions = exports.ManageUnspentsOptions || (exports.ManageUnspentsOptions = {}));
74
+ })(ManageUnspentsOptions || (exports.ManageUnspentsOptions = ManageUnspentsOptions = {}));
57
75
  function isPrebuildTransactionResult(prebuildTx) {
58
76
  if (!prebuildTx || typeof prebuildTx === 'string') {
59
77
  return false;
@@ -70,13 +88,23 @@ class Wallet {
70
88
  const userDetails = _.find(walletData.users, { user: userId });
71
89
  this._permissions = _.get(userDetails, 'permissions');
72
90
  }
73
- if ((baseCoin === null || baseCoin === void 0 ? void 0 : baseCoin.supportsTss()) && this._wallet.multisigType === 'tss') {
91
+ if (baseCoin?.supportsTss() && this._wallet.multisigType === 'tss') {
74
92
  switch (baseCoin.getMPCAlgorithm()) {
75
93
  case 'ecdsa':
76
- this.tssUtils = new ecdsa_1.EcdsaUtils(bitgo, baseCoin, this);
94
+ if (walletData.multisigTypeVersion === 'MPCv2') {
95
+ this.tssUtils = new ecdsa_1.EcdsaMPCv2Utils(bitgo, baseCoin, this);
96
+ }
97
+ else {
98
+ this.tssUtils = new ecdsa_1.EcdsaUtils(bitgo, baseCoin, this);
99
+ }
77
100
  break;
78
101
  case 'eddsa':
79
- this.tssUtils = new eddsa_1.default(bitgo, baseCoin, this);
102
+ if (walletData.multisigTypeVersion === 'MPCv2') {
103
+ this.tssUtils = new eddsa_1.EddsaMPCv2Utils(bitgo, baseCoin, this);
104
+ }
105
+ else {
106
+ this.tssUtils = new eddsa_1.default(bitgo, baseCoin, this);
107
+ }
80
108
  break;
81
109
  default:
82
110
  this.tssUtils = undefined;
@@ -118,6 +146,8 @@ class Wallet {
118
146
  prebuildConsolidateAccountParams() {
119
147
  return [
120
148
  'consolidateAddresses',
149
+ 'nftCollectionId',
150
+ 'nftId',
121
151
  'feeRate',
122
152
  'maxFeeRate',
123
153
  'memo',
@@ -125,6 +155,7 @@ class Wallet {
125
155
  'validToBlock',
126
156
  'preview',
127
157
  'keepAlive',
158
+ 'apiVersion',
128
159
  ];
129
160
  }
130
161
  /**
@@ -170,11 +201,14 @@ class Wallet {
170
201
  return this._wallet.coin;
171
202
  }
172
203
  type() {
173
- return this._wallet.type;
204
+ return this._wallet.type || 'hot';
174
205
  }
175
206
  multisigType() {
176
207
  return this._wallet.multisigType;
177
208
  }
209
+ multisigTypeVersion() {
210
+ return this._wallet.multisigTypeVersion;
211
+ }
178
212
  subType() {
179
213
  return this._wallet.subType;
180
214
  }
@@ -184,6 +218,12 @@ class Wallet {
184
218
  label() {
185
219
  return this._wallet.label;
186
220
  }
221
+ flags() {
222
+ return this._wallet.walletFlags ?? [];
223
+ }
224
+ flag(name) {
225
+ return this.flags().find((flag) => flag.name === name)?.value;
226
+ }
187
227
  /**
188
228
  * Get the public object ids for the keychains on this wallet.
189
229
  */
@@ -194,7 +234,7 @@ class Wallet {
194
234
  * Get a receive address for this wallet
195
235
  */
196
236
  receiveAddress() {
197
- return this._wallet.receiveAddress.address;
237
+ return this._wallet.receiveAddress?.address;
198
238
  }
199
239
  /**
200
240
  * Get the wallet id of the wallet that this wallet was migrated from.
@@ -262,6 +302,43 @@ class Wallet {
262
302
  .query(query)
263
303
  .result();
264
304
  }
305
+ /**
306
+ * Return a list of nft tokens for this wallet. Will always return undefined if the wallet
307
+ * was not initialized with the allTokens flag.
308
+ *
309
+ * @returns {NftBalance[] | undefined}
310
+ */
311
+ nftBalances() {
312
+ if (this._wallet.nfts) {
313
+ return Object.values(this._wallet.nfts).map((nftData) => nftData);
314
+ }
315
+ return undefined;
316
+ }
317
+ /**
318
+ * Return a list of unsupported nft tokens for this wallet. Will always return undefined if the wallet
319
+ * was not initialized with the allTokens flag.
320
+ *
321
+ * @returns {NftBalance[] | undefined}
322
+ */
323
+ unsupportedNftBalances() {
324
+ if (this._wallet.unsupportedNfts) {
325
+ return Object.values(this._wallet.unsupportedNfts).map((nftData) => nftData);
326
+ }
327
+ return undefined;
328
+ }
329
+ /**
330
+ * Returns a list of the wallets nft & unsupported nfts.
331
+ *
332
+ * @returns {NftBalance[]}
333
+ */
334
+ async getNftBalances() {
335
+ const walletData = await this.bitgo.get(this.url()).query({ allTokens: true }).result();
336
+ const supportedNfts = walletData?.nfts ? Object.values(walletData.nfts).map((balance) => balance) : [];
337
+ const unsupportedNfts = walletData?.unsupportedNfts
338
+ ? Object.values(walletData.unsupportedNfts).map((balance) => balance)
339
+ : [];
340
+ return [...supportedNfts, ...unsupportedNfts];
341
+ }
265
342
  /**
266
343
  * List the transactions for a given wallet
267
344
  * @param params
@@ -270,18 +347,22 @@ class Wallet {
270
347
  */
271
348
  async getTransaction(params = {}) {
272
349
  common.validateParams(params, ['txHash'], []);
273
- const query = {};
350
+ const paginatedOptions = {};
274
351
  if (!_.isUndefined(params.prevId)) {
275
352
  if (!_.isString(params.prevId)) {
276
353
  throw new Error('invalid prevId argument, expecting string');
277
354
  }
278
- query.prevId = params.prevId;
355
+ paginatedOptions.prevId = params.prevId;
279
356
  }
280
357
  if (!_.isUndefined(params.limit)) {
281
358
  if (!_.isInteger(params.limit) || params.limit < 1) {
282
359
  throw new Error('invalid limit argument, expecting positive integer');
283
360
  }
284
- query.limit = params.limit;
361
+ paginatedOptions.limit = params.limit;
362
+ }
363
+ const query = paginatedOptions;
364
+ if (params.includeRbf) {
365
+ query['includeRbf'] = params.includeRbf;
285
366
  }
286
367
  return await this.bitgo
287
368
  .get(this.url('/tx/' + params.txHash))
@@ -381,6 +462,12 @@ class Wallet {
381
462
  }
382
463
  query.type = params.type;
383
464
  }
465
+ if (!_.isNil(params.decorateUtxoSpecificFields)) {
466
+ if (!_.isBoolean(params.decorateUtxoSpecificFields)) {
467
+ throw new Error('invalid includeHex argument, expecting boolean');
468
+ }
469
+ query.decorateUtxoSpecificFields = params.decorateUtxoSpecificFields;
470
+ }
384
471
  return await this.bitgo.get(this.url('/transfer')).query(query).result();
385
472
  }
386
473
  /**
@@ -447,6 +534,7 @@ class Wallet {
447
534
  'prevId',
448
535
  'segwit',
449
536
  'target',
537
+ 'unspentIds',
450
538
  ]);
451
539
  return this.bitgo.get(this.url('/unspents')).query(query).result();
452
540
  }
@@ -482,8 +570,15 @@ class Wallet {
482
570
  * with each transaction composed of 200 unspents, except for the last transaction which may have fewer unspents.
483
571
  */
484
572
  async manageUnspents(routeName, params = {}, option = ManageUnspentsOptions.BUILD_SIGN_SEND) {
573
+ if (this._wallet.type === 'custodial' && routeName === 'consolidate') {
574
+ return this.initiateTransaction({ ...params, type: 'consolidate' });
575
+ }
576
+ else if (this._wallet.type === 'custodial' && routeName === 'fanout') {
577
+ return this.initiateTransaction({ ...params, type: 'fanout' });
578
+ }
485
579
  common.validateParams(params, [], ['walletPassphrase', 'xprv']);
486
580
  const reqId = new utils_1.RequestTracer();
581
+ const fanoutInputFormat = params.maxNumInputsToUse ? 'maxNumInputsToUse' : 'unspents';
487
582
  const filteredParams = _.pick(params, [
488
583
  'feeRate',
489
584
  'maxFeeRate',
@@ -497,7 +592,7 @@ class Wallet {
497
592
  'targetAddress',
498
593
  'txFormat',
499
594
  'bulk',
500
- routeName === 'consolidate' ? 'limit' : 'maxNumInputsToUse',
595
+ routeName === 'consolidate' ? 'limit' : fanoutInputFormat,
501
596
  'numUnspentsToMake',
502
597
  ]);
503
598
  this.bitgo.setRequestTracer(reqId);
@@ -511,24 +606,75 @@ class Wallet {
511
606
  const keychains = (await this.baseCoin
512
607
  .keychains()
513
608
  .getKeysForSigning({ wallet: this, reqId }));
609
+ // Validate that the platform-built transaction matches user parameters
610
+ const txPrebuilds = Array.isArray(buildResponse) ? buildResponse : [buildResponse];
611
+ await Promise.all(txPrebuilds.map((txPrebuild) => this.baseCoin.verifyTransaction({
612
+ txParams: params,
613
+ txPrebuild,
614
+ wallet: this,
615
+ verification: {
616
+ ...(params.verification ?? {}),
617
+ keychains: {
618
+ user: keychains[0],
619
+ backup: keychains[1],
620
+ bitgo: keychains[2],
621
+ },
622
+ },
623
+ reqId,
624
+ })));
514
625
  const transactionParams = {
515
626
  ...params,
516
627
  keychain: keychains[0],
517
628
  pubs: keychains.map((k) => {
518
- assert_1.default(k.pub);
629
+ (0, assert_1.default)(k.pub);
519
630
  return k.pub;
520
631
  }),
632
+ // Building PSBTs with the bulk flag does not include the previous transaction for non-segwit inputs.
633
+ // Manually override the signing and validating to not fail.
634
+ allowNonSegwitSigningWithoutPrevTx: !!params.bulk,
521
635
  };
522
- const txPrebuilds = Array.isArray(buildResponse) ? buildResponse : [buildResponse];
523
636
  const selectParams = _.pick(params, ['comment', 'otp', 'bulk']);
524
637
  const response = await Promise.all(txPrebuilds.map(async (txPrebuild) => {
525
- const signedTransaction = await this.signTransaction({ ...transactionParams, txPrebuild });
526
- const finalTxParams = _.extend({}, signedTransaction, selectParams, { type: routeName });
638
+ const signedTransaction = await this.signTransaction({
639
+ ...transactionParams,
640
+ txPrebuild,
641
+ });
642
+ const finalTxParams = _.extend({}, signedTransaction, selectParams, {
643
+ type: routeName,
644
+ });
527
645
  this.bitgo.setRequestTracer(reqId);
528
- return this.sendTransaction(finalTxParams);
646
+ return this.sendTransaction(finalTxParams, reqId);
529
647
  }));
530
648
  return Array.isArray(buildResponse) ? response : response[0];
531
649
  }
650
+ /**
651
+ * Manage the unspent reservations on the wallet
652
+ *
653
+ * @param params.create - create a new reservation
654
+ * @param params.modify - modify an existing reservation
655
+ * @param params.delete - delete an existing reservation
656
+ */
657
+ async manageUnspentReservations(params) {
658
+ const filteredParams = _.pick(params, ['create', 'modify', 'delete']);
659
+ this.bitgo.setRequestTracer(new utils_1.RequestTracer());
660
+ // The URL cannot contain the coinName, so we remove it from the URL
661
+ const url = this.url(`/reservedunspents`).replace(`/${this.baseCoin.getChain()}`, '');
662
+ if (filteredParams.create) {
663
+ const filteredCreateParams = _.pick(params.create, ['unspentIds', 'expireTime']);
664
+ return this.bitgo.post(url).send(filteredCreateParams).result();
665
+ }
666
+ else if (filteredParams.modify) {
667
+ const filteredModifyParams = _.pick(params.modify, ['unspentIds', 'changes']);
668
+ return this.bitgo.put(url).send(filteredModifyParams).result();
669
+ }
670
+ else if (filteredParams.delete) {
671
+ const filteredDeleteParams = _.pick(params.delete, ['id']);
672
+ return this.bitgo.del(url).query(filteredDeleteParams).result();
673
+ }
674
+ else {
675
+ throw new Error('Did not detect a creation, modification, or deletion request.');
676
+ }
677
+ }
532
678
  /**
533
679
  * Consolidate unspents on a wallet
534
680
  *
@@ -570,9 +716,11 @@ class Wallet {
570
716
  * @param {Number} params.maxFeeRate - The max limit for a fee rate in satoshis/kB
571
717
  * @param {Number} params.maxNumInputsToUse - the number of unspents you want to use in the transaction
572
718
  * @param {Number} params.numUnspentsToMake - the number of new unspents to make
719
+ *
720
+ * @param {ManageUnspentsOptions} option - flag to toggle build and send or build only
573
721
  */
574
- async fanoutUnspents(params = {}) {
575
- return this.manageUnspents('fanout', params);
722
+ async fanoutUnspents(params = {}, option = ManageUnspentsOptions.BUILD_SIGN_SEND) {
723
+ return this.manageUnspents('fanout', params, option);
576
724
  }
577
725
  /**
578
726
  * Set the token flush thresholds for the wallet. Updates the wallet.
@@ -679,17 +827,21 @@ class Wallet {
679
827
  if (this.confirmedBalanceString() !== this.balanceString()) {
680
828
  throw new Error('cannot sweep when unconfirmed funds exist on the wallet, please wait until all inbound transactions confirm');
681
829
  }
682
- const value = this.spendableBalanceString();
683
- if (_.isUndefined(value) || value === '0') {
830
+ const value = await this.bitgo.get(this.url('/maximumSpendable')).result();
831
+ const maximumSpendable = new bignumber_js_1.default(value.maximumSpendable);
832
+ if (value === undefined || maximumSpendable.isZero()) {
684
833
  throw new Error('no funds to sweep');
685
834
  }
686
- params.recipients = [
687
- {
688
- address: params.address,
689
- amount: value,
690
- },
691
- ];
692
- return this.sendMany(params);
835
+ const sendManyParams = {
836
+ ...params,
837
+ recipients: [
838
+ {
839
+ address: params.address || '', // Ensure address is always a string
840
+ amount: maximumSpendable.toString(),
841
+ },
842
+ ],
843
+ };
844
+ return this.sendMany(sendManyParams);
693
845
  }
694
846
  // the following flow works for all UTXO coins
695
847
  const reqId = new utils_1.RequestTracer();
@@ -699,10 +851,20 @@ class Wallet {
699
851
  'maxFeeRate',
700
852
  'feeTxConfirmTarget',
701
853
  'allowPartialSweep',
854
+ 'txFormat',
702
855
  ]);
703
856
  this.bitgo.setRequestTracer(reqId);
704
857
  const response = await this.bitgo.post(this.url('/sweepWallet')).send(filteredParams).result();
705
- // TODO(BG-3588): add txHex validation to protect man in the middle attacks replacing the txHex
858
+ const transaction = await this.baseCoin.explainTransaction(response);
859
+ if (transaction?.outputs.length) {
860
+ const invalidOutputAddress = transaction.outputs.find((output) => output.address !== params.address);
861
+ if (invalidOutputAddress) {
862
+ throw new Error(`invalid sweep destination ${invalidOutputAddress.address}, specified ${params.address}`);
863
+ }
864
+ }
865
+ else {
866
+ throw new Error('invalid transaction, no destination address');
867
+ }
706
868
  const keychains = (await this.baseCoin.keychains().getKeysForSigning({ wallet: this, reqId }));
707
869
  const transactionParams = {
708
870
  ...params,
@@ -717,7 +879,7 @@ class Wallet {
717
879
  const selectParams = _.pick(params, ['otp']);
718
880
  const finalTxParams = _.extend({}, signedTransaction, selectParams);
719
881
  this.bitgo.setRequestTracer(reqId);
720
- return this.sendTransaction(finalTxParams);
882
+ return this.sendTransaction(finalTxParams, reqId);
721
883
  }
722
884
  /**
723
885
  * Freeze a given wallet
@@ -827,6 +989,43 @@ class Wallet {
827
989
  .query(query)
828
990
  .result();
829
991
  }
992
+ /**
993
+ * List the addresses sorted by balance for a given wallet
994
+ * @param params
995
+ * @returns {*}
996
+ */
997
+ async addressesByBalance(params) {
998
+ const query = {
999
+ token: params.token,
1000
+ nftCollectionId: params.nftCollectionId,
1001
+ nftId: params.nftId,
1002
+ };
1003
+ query.sort = params.sort ?? -1;
1004
+ query.page = params.page ?? 1;
1005
+ query.limit = params.limit ?? 500;
1006
+ if (!_.isNumber(query.sort)) {
1007
+ throw new Error('invalid sort argument, expecting number');
1008
+ }
1009
+ if (!_.isNumber(query.page)) {
1010
+ throw new Error('invalid page argument, expecting number');
1011
+ }
1012
+ if (!_.isNumber(query.limit)) {
1013
+ throw new Error('invalid limit argument, expecting number');
1014
+ }
1015
+ if (query.limit < 1 || query.limit > 500) {
1016
+ throw new Error('limit argument must be between 1 and 500');
1017
+ }
1018
+ // Assert that either both nftCollectionId and nftId are provided or neither are provided
1019
+ const hasNftCollectionId = !_.isUndefined(query.nftCollectionId);
1020
+ const hasNftId = !_.isUndefined(query.nftId);
1021
+ if (hasNftCollectionId !== hasNftId) {
1022
+ throw new Error('nftCollectionId and nftId must both be provided or both be omitted');
1023
+ }
1024
+ return this.bitgo
1025
+ .get(this.baseCoin.url('/wallet/' + this._wallet.id + '/addresses/balances'))
1026
+ .query(query)
1027
+ .result();
1028
+ }
830
1029
  /**
831
1030
  * Get a single wallet address by its id
832
1031
  * @param params
@@ -874,7 +1073,7 @@ class Wallet {
874
1073
  async createAddress(params = {}) {
875
1074
  const addressParams = {};
876
1075
  const reqId = new utils_1.RequestTracer();
877
- const { chain, gasPrice, label, lowPriority, forwarderVersion, format, count = 1, baseAddress, allowSkipVerifyAddress = true, onToken, } = params;
1076
+ const { chain, gasPrice, label, lowPriority, forwarderVersion, format, count = 1, baseAddress, allowSkipVerifyAddress = true, onToken, evmKeyRingReferenceAddress, } = params;
878
1077
  if (!_.isUndefined(chain)) {
879
1078
  if (!_.isInteger(chain)) {
880
1079
  throw new Error('chain has to be an integer');
@@ -888,14 +1087,11 @@ class Wallet {
888
1087
  addressParams.gasPrice = gasPrice;
889
1088
  }
890
1089
  if (!_.isUndefined(forwarderVersion)) {
891
- if (!_.isInteger(forwarderVersion) || forwarderVersion < 0 || forwarderVersion > 3) {
892
- throw new Error('forwarderVersion has to be an integer 0, 1, 2 or 3');
1090
+ if (!_.isInteger(forwarderVersion) || forwarderVersion < 0 || forwarderVersion > 5) {
1091
+ throw new Error('forwarderVersion has to be an integer 0, 1, 2, 3, 4 or 5');
893
1092
  }
894
1093
  addressParams.forwarderVersion = forwarderVersion;
895
1094
  }
896
- else if (this._wallet.multisigType === 'tss' && this.baseCoin.getMPCAlgorithm() === 'ecdsa') {
897
- addressParams.forwarderVersion = 3;
898
- }
899
1095
  if (!_.isUndefined(label)) {
900
1096
  if (!_.isString(label)) {
901
1097
  throw new Error('label has to be a string');
@@ -932,9 +1128,6 @@ class Wallet {
932
1128
  if (!_.isString(onToken)) {
933
1129
  throw new Error('onToken has to be a string');
934
1130
  }
935
- if (!statics_1.ofcTokens.includes(onToken)) {
936
- throw new Error('Unknown OFC token');
937
- }
938
1131
  addressParams.onToken = onToken;
939
1132
  }
940
1133
  else {
@@ -944,27 +1137,45 @@ class Wallet {
944
1137
  throw new Error('onToken has to be a string');
945
1138
  }
946
1139
  }
1140
+ if (!_.isUndefined(evmKeyRingReferenceAddress)) {
1141
+ if (!_.isString(evmKeyRingReferenceAddress)) {
1142
+ throw new Error('evmKeyRingReferenceAddress has to be a string');
1143
+ }
1144
+ if (!this.baseCoin.isEVM()) {
1145
+ throw new Error('evmKeyRingReferenceAddress is only supported for EVM chains');
1146
+ }
1147
+ if (!this.baseCoin.isValidAddress(evmKeyRingReferenceAddress)) {
1148
+ throw new Error('evmKeyRingReferenceAddress must be a valid address');
1149
+ }
1150
+ addressParams.evmKeyRingReferenceAddress = evmKeyRingReferenceAddress;
1151
+ }
947
1152
  // get keychains for address verification
948
1153
  const keychains = await Promise.all(this._wallet.keys.map((k) => this.baseCoin.keychains().get({ id: k, reqId })));
949
1154
  const rootAddress = _.get(this._wallet, 'receiveAddress.address');
950
1155
  const newAddresses = _.times(count, async () => {
951
- var _a;
952
1156
  this.bitgo.setRequestTracer(reqId);
953
1157
  const newAddress = (await this.bitgo
954
1158
  .post(this.baseCoin.url('/wallet/' + this._wallet.id + '/address'))
955
1159
  .send(addressParams)
956
1160
  .result());
957
- // infer its address type
958
- if (_.isObject(newAddress.coinSpecific)) {
959
- newAddress.addressType = utils_1.inferAddressType(newAddress);
960
- }
961
1161
  newAddress.keychains = keychains;
962
- newAddress.baseAddress = baseAddress !== null && baseAddress !== void 0 ? baseAddress : _.get(this._wallet, 'coinSpecific.baseAddress');
963
- const verificationData = _.merge({}, newAddress, { rootAddress });
1162
+ newAddress.baseAddress = baseAddress ?? _.get(this._wallet, 'coinSpecific.baseAddress');
1163
+ newAddress.format = addressParams.format;
1164
+ const verificationData = _.merge({}, newAddress, {
1165
+ rootAddress,
1166
+ walletVersion: _.get(this._wallet, 'coinSpecific.walletVersion'),
1167
+ });
964
1168
  if (verificationData.error) {
965
1169
  throw new errors_1.AddressGenerationError(verificationData.error);
966
1170
  }
967
- verificationData.impliedForwarderVersion = forwarderVersion !== null && forwarderVersion !== void 0 ? forwarderVersion : (_a = verificationData.coinSpecific) === null || _a === void 0 ? void 0 : _a.forwarderVersion;
1171
+ verificationData.impliedForwarderVersion = forwarderVersion ?? verificationData.coinSpecific?.forwarderVersion;
1172
+ // For SMC (Self-Managed Custodial) wallets, pass derivedFromParentWithSeed from user keychain
1173
+ // The verification function will compute the derivation prefix internally
1174
+ // Custodial wallets don't need this as their commonKeychain already accounts for the prefix
1175
+ if (this.multisigType() === 'tss' && this.type() === 'cold' && this._wallet.keys.length > keychain_1.KeyIndices.USER) {
1176
+ const userKeychain = keychains[keychain_1.KeyIndices.USER];
1177
+ verificationData.derivedFromParentWithSeed = userKeychain?.derivedFromParentWithSeed;
1178
+ }
968
1179
  // This condition was added in first place because in celo, when verifyAddress method was called on addresses which were having pendingChainInitialization as true, it used to throw some error
969
1180
  // In case of forwarder version 1 eth addresses, addresses need to be verified even if the pendingChainInitialization flag is true
970
1181
  if (verificationData.coinSpecific &&
@@ -972,7 +1183,7 @@ class Wallet {
972
1183
  // can't verify addresses which are pending chain initialization, as the address is hidden
973
1184
  let isWalletAddress = false;
974
1185
  try {
975
- isWalletAddress = await this.baseCoin.isWalletAddress(verificationData);
1186
+ isWalletAddress = await this.baseCoin.isWalletAddress(verificationData, this);
976
1187
  }
977
1188
  catch (e) {
978
1189
  if (!(e instanceof errors_1.MethodNotImplementedError)) {
@@ -1011,6 +1222,69 @@ class Wallet {
1011
1222
  const url = this.url('/address/' + encodeURIComponent(address));
1012
1223
  return this.bitgo.put(url).send(putParams).result();
1013
1224
  }
1225
+ /**
1226
+ * Get account resources for the given addresses
1227
+ * @param params - options object containing addresses and optional destinationAddress
1228
+ * @returns {Promise<GetAccountResourcesResponse>} - response from WP API
1229
+ */
1230
+ async getAccountResources(params) {
1231
+ const { addresses, destinationAddress } = params;
1232
+ if (!Array.isArray(addresses)) {
1233
+ throw new Error('addresses must be an array');
1234
+ }
1235
+ if (addresses.length === 0) {
1236
+ throw new Error('addresses array cannot be empty');
1237
+ }
1238
+ const body = { addresses };
1239
+ if (destinationAddress) {
1240
+ body.destinationAddress = destinationAddress;
1241
+ }
1242
+ return this.bitgo.post(this.url('/getAccountResources')).send(body).result();
1243
+ }
1244
+ /**
1245
+ * Get resource delegations for this wallet
1246
+ * @param params - optional filters: type, resource, limit, nextBatchPrevId
1247
+ * @returns {Promise<GetResourceDelegationsResponse>} - response from WP API
1248
+ */
1249
+ async getResourceDelegations(params) {
1250
+ const queryParams = {};
1251
+ if (params?.type !== undefined)
1252
+ queryParams.type = params.type;
1253
+ if (params?.resource !== undefined)
1254
+ queryParams.resource = params.resource;
1255
+ if (params?.limit !== undefined)
1256
+ queryParams.limit = params.limit;
1257
+ if (params?.nextBatchPrevId !== undefined)
1258
+ queryParams.nextBatchPrevId = params.nextBatchPrevId;
1259
+ return this.bitgo.get(this.url('/resourcedelegations')).query(queryParams).result();
1260
+ }
1261
+ async updateWalletBuildDefaults(params) {
1262
+ common.validateParams(params, [], ['minFeeRate', 'changeAddressType', 'txFormat']);
1263
+ return this.updateWallet({
1264
+ buildDefaults: {
1265
+ minFeeRate: params.minFeeRate,
1266
+ changeAddressType: params.changeAddressType,
1267
+ txFormat: params.txFormat,
1268
+ },
1269
+ });
1270
+ }
1271
+ async updateWallet(params) {
1272
+ const filteredParams = _.pick(params, ['coinSpecific', 'buildDefaults', 'label']);
1273
+ const { coinSpecific, ...rest } = filteredParams;
1274
+ return this.bitgo
1275
+ .put(this.url())
1276
+ .send({
1277
+ ...rest,
1278
+ ...(coinSpecific
1279
+ ? {
1280
+ coinSpecific: {
1281
+ [this.baseCoin.getChain()]: coinSpecific,
1282
+ },
1283
+ }
1284
+ : {}),
1285
+ })
1286
+ .result();
1287
+ }
1014
1288
  /**
1015
1289
  * List webhooks on this wallet
1016
1290
  * @param params
@@ -1076,16 +1350,15 @@ class Wallet {
1076
1350
  return this.bitgo.del(this.url('/webhooks')).send(params).result();
1077
1351
  }
1078
1352
  /**
1079
- * Gets the user key chain for this wallet
1353
+ * Gets the user keychain for this wallet
1080
1354
  *
1081
- * The user key chain is the first keychain of the wallet and usually has the encrypted prv stored on BitGo.
1355
+ * The user keychain is the first keychain of the wallet and usually has the encrypted prv stored on BitGo.
1082
1356
  * Useful when trying to get the users' keychain from the server before decrypting to sign a transaction.
1083
- * @param params
1084
1357
  */
1085
- async getEncryptedUserKeychain(params = {}) {
1358
+ async getEncryptedUserKeychain() {
1086
1359
  const tryKeyChain = async (index) => {
1087
1360
  if (!this._wallet.keys || index >= this._wallet.keys.length) {
1088
- throw new Error('No encrypted keychains on this wallet.');
1361
+ throw new errors_1.MissingEncryptedKeychainError();
1089
1362
  }
1090
1363
  const params = { id: this._wallet.keys[index] };
1091
1364
  const keychain = await this.baseCoin.keychains().get(params);
@@ -1118,23 +1391,33 @@ class Wallet {
1118
1391
  if (params.prv) {
1119
1392
  return params.prv;
1120
1393
  }
1121
- const userKeychain = (await this.getEncryptedUserKeychain());
1122
- const userEncryptedPrv = userKeychain.encryptedPrv;
1123
- let userPrv;
1124
- try {
1125
- userPrv = this.bitgo.decrypt({ input: userEncryptedPrv, password: params.walletPassphrase });
1394
+ const userKeychain = await this.getEncryptedUserKeychain();
1395
+ if (!params.walletPassphrase) {
1396
+ throw new Error('wallet passphrase was not provided');
1126
1397
  }
1127
- catch (e) {
1128
- throw new Error('error decrypting wallet passphrase');
1398
+ const userPrv = (0, keychain_1.decryptKeychainPrivateKey)(this.bitgo, userKeychain, params.walletPassphrase);
1399
+ if (!userPrv) {
1400
+ throw new Error('error decrypting wallet private key');
1129
1401
  }
1130
1402
  return userPrv;
1131
1403
  }
1404
+ isMultiUserKeyWallet() {
1405
+ return this._wallet.coinSpecific?.features?.includes('multi-key-user-key') ?? false;
1406
+ }
1132
1407
  /**
1133
1408
  * Send an encrypted wallet share to BitGo.
1134
1409
  * @param params
1135
1410
  */
1136
1411
  async createShare(params = {}) {
1137
1412
  common.validateParams(params, ['user', 'permissions'], []);
1413
+ const isMultiUserKeyWallet = this.isMultiUserKeyWallet();
1414
+ if (isMultiUserKeyWallet) {
1415
+ if (params.keychain && !_.isEmpty(params.keychain)) {
1416
+ throw new Error('keychain property must not be provided for multi-key-user-key wallets');
1417
+ }
1418
+ // Remove keychain from params if presents
1419
+ return await this.bitgo.post(this.url('/share')).send(_.omit(params, 'keychain')).result();
1420
+ }
1138
1421
  if (params.keychain && !_.isEmpty(params.keychain)) {
1139
1422
  if (!params.keychain.pub ||
1140
1423
  !params.keychain.encryptedPrv ||
@@ -1146,13 +1429,200 @@ class Wallet {
1146
1429
  }
1147
1430
  return this.bitgo.post(this.url('/share')).send(params).result();
1148
1431
  }
1432
+ /**
1433
+ * Shares a wallet with multiple users by creating bulk wallet shares.
1434
+ *
1435
+ * @async
1436
+ * @param {BulkWalletShareOptions} params - The options for sharing wallets in bulk.
1437
+ * @param {Array<ShareOption>} params.shareOptions - An array of share option objects containing user and permissions information.
1438
+ * @param {Object} [params.shareOptions[].keychain] - The keychain object used to share the wallet.
1439
+ * @param {string} [params.shareOptions[].keychain.toPubKey] - The recipient's public key.
1440
+ * @param {string} [params.shareOptions[].keychain.path] - The derivation path of the keychain.
1441
+ * @param {string} params.shareOptions[].user - The user to share the wallet with.
1442
+ * @param {string} params.shareOptions[].permissions - The permissions granted to the user.
1443
+ * @param {string} [params.walletPassphrase] - The wallet passphrase used to decrypt the keychain.
1444
+ * @throws {Error} If `shareOptions` is empty, or if required keychain parameters (`toPubKey` and `path`) are missing when needed.
1445
+ * @throws {Error} If unable to decrypt the user keychain.
1446
+ * @returns {Promise<CreateBulkWalletShareListResponse>} A promise that resolves with the response of the bulk wallet share creation.
1447
+ */
1448
+ async createBulkWalletShare(params) {
1449
+ if (params.keyShareOptions.length === 0) {
1450
+ throw new Error('No share options provided');
1451
+ }
1452
+ const bulkCreateShareOptions = [];
1453
+ // Check if any share option needs a keychain (has 'spend' permission)
1454
+ const anyNeedsKeychain = params.keyShareOptions.some((opt) => opt.permissions && opt.permissions.includes('spend'));
1455
+ // Fetch and decrypt the keychain ONCE for all users
1456
+ let decryptedKeychain;
1457
+ if (anyNeedsKeychain) {
1458
+ try {
1459
+ decryptedKeychain = await this.getDecryptedKeychainForSharing(params.walletPassphrase);
1460
+ }
1461
+ catch (e) {
1462
+ if (e instanceof errors_1.MissingEncryptedKeychainError) {
1463
+ decryptedKeychain = undefined;
1464
+ }
1465
+ else {
1466
+ throw e;
1467
+ }
1468
+ }
1469
+ }
1470
+ for (const shareOption of params.keyShareOptions) {
1471
+ try {
1472
+ common.validateParams(shareOption, ['userId', 'pubKey', 'path'], []);
1473
+ }
1474
+ catch (e) {
1475
+ if (!shareOption.pubKey) {
1476
+ throw new errors_1.NeedUserSignupError(shareOption.userId);
1477
+ }
1478
+ throw e;
1479
+ }
1480
+ const needsKeychain = shareOption.permissions && shareOption.permissions.includes('spend');
1481
+ if (needsKeychain && decryptedKeychain) {
1482
+ const sharedKeychain = this.encryptPrvForUser(decryptedKeychain.prv, decryptedKeychain.pub, shareOption.pubKey, shareOption.path);
1483
+ bulkCreateShareOptions.push({
1484
+ user: shareOption.userId,
1485
+ permissions: shareOption.permissions,
1486
+ keychain: sharedKeychain,
1487
+ });
1488
+ }
1489
+ }
1490
+ return await this.createBulkKeyShares(bulkCreateShareOptions);
1491
+ }
1492
+ /**
1493
+ * Creates bulk wallet share entries for specified share options.
1494
+ * Filters out share options that do not contain valid keychain information or have missing keychain fields.
1495
+ * If all share options are invalid or empty, it throws an error.
1496
+ * Sends a POST request to create the wallet shares for valid share options.
1497
+ *
1498
+ * @async
1499
+ * @param {BulkCreateShareOption[]} [params=[]] - The array of share options to process.
1500
+ * Keychain entries must include the following fields: `pub`, `encryptedPrv`, `fromPubKey`, `toPubKey`, and `path`.
1501
+ * @returns {Promise<CreateBulkWalletShareListResponse>} A promise resolving to the result of the wallet shares creation.
1502
+ * @throws {Error} Throws an error if no valid share options are provided.
1503
+ */
1504
+ async createBulkKeyShares(params = []) {
1505
+ params = params.filter((shareOption) => {
1506
+ try {
1507
+ common.validateParams(shareOption.keychain, ['pub', 'encryptedPrv', 'fromPubKey', 'toPubKey', 'path'], []);
1508
+ return true;
1509
+ }
1510
+ catch (e) {
1511
+ // Exclude share options with invalid keychain
1512
+ return false;
1513
+ }
1514
+ });
1515
+ if (!params || Object.keys(params).length === 0) {
1516
+ throw new Error('shareOptions cannot be empty');
1517
+ }
1518
+ const url = this.bitgo.url(`/wallet/${this._wallet.id}/walletshares`, 2);
1519
+ return this.bitgo.post(url).send({ shareOptions: params }).result();
1520
+ }
1521
+ /**
1522
+ * Gets keychain with encrypted private key to be shared for wallet sharing.
1523
+ */
1524
+ async getEncryptedWalletKeychainForWalletSharing() {
1525
+ if (this.baseCoin.getFamily() === 'lnbtc') {
1526
+ // lightning coin does not use user key to sign the transactions from SDK.
1527
+ // it uses user auth key instead.
1528
+ return await (0, lightningWalletUtil_1.getLightningAuthKey)(this, 'userAuth');
1529
+ }
1530
+ else {
1531
+ return await this.getEncryptedUserKeychain();
1532
+ }
1533
+ }
1534
+ /**
1535
+ * Fetches and decrypts the wallet keychain for sharing.
1536
+ * This method fetches the keychain once and decrypts it, returning the decrypted
1537
+ * private key and public key info needed for sharing with multiple users.
1538
+ *
1539
+ * @param walletPassphrase - The passphrase to decrypt the keychain
1540
+ * @returns Object containing decrypted prv and pub, or undefined for cold wallets
1541
+ */
1542
+ async getDecryptedKeychainForSharing(walletPassphrase) {
1543
+ const keychain = await this.getEncryptedWalletKeychainForWalletSharing();
1544
+ if (!keychain.encryptedPrv) {
1545
+ return undefined;
1546
+ }
1547
+ if (!walletPassphrase) {
1548
+ throw new Error('Missing walletPassphrase argument');
1549
+ }
1550
+ const prv = (0, keychain_1.decryptKeychainPrivateKey)(this.bitgo, keychain, walletPassphrase);
1551
+ if (!prv) {
1552
+ throw new errors_1.IncorrectPasswordError('Password shared is incorrect for this wallet');
1553
+ }
1554
+ // Only one of pub/commonPub/commonKeychain should be present in the keychain
1555
+ let pub = keychain.pub ?? keychain.commonPub;
1556
+ if (keychain.commonKeychain) {
1557
+ pub =
1558
+ this.baseCoin.getMPCAlgorithm() === 'eddsa'
1559
+ ? eddsa_1.default.getPublicKeyFromCommonKeychain(keychain.commonKeychain)
1560
+ : ecdsa_1.EcdsaUtils.getPublicKeyFromCommonKeychain(keychain.commonKeychain);
1561
+ }
1562
+ if (!pub) {
1563
+ throw new Error('Unable to determine public key from keychain');
1564
+ }
1565
+ return { prv, pub };
1566
+ }
1567
+ /**
1568
+ * Encrypts a decrypted private key for sharing with a specific user.
1569
+ * This is the pure encryption step - no API calls, no decryption.
1570
+ *
1571
+ * @param decryptedPrv - The already-decrypted private key
1572
+ * @param pub - The wallet's public key
1573
+ * @param userPubkey - The recipient user's public key
1574
+ * @param path - The key path
1575
+ * @returns The encrypted keychain for the recipient with all required fields
1576
+ */
1577
+ encryptPrvForUser(decryptedPrv, pub, userPubkey, path) {
1578
+ const eckey = (0, bitcoin_1.makeRandomKey)();
1579
+ const secret = (0, ecdh_1.getSharedSecret)(eckey, Buffer.from(userPubkey, 'hex')).toString('hex');
1580
+ const newEncryptedPrv = this.bitgo.encrypt({ password: secret, input: decryptedPrv });
1581
+ const keychain = {
1582
+ pub,
1583
+ encryptedPrv: newEncryptedPrv,
1584
+ fromPubKey: eckey.publicKey.toString('hex'),
1585
+ toPubKey: userPubkey,
1586
+ path: path,
1587
+ };
1588
+ (0, assert_1.default)(keychain.pub, 'pub must be defined for sharing');
1589
+ (0, assert_1.default)(keychain.encryptedPrv, 'encryptedPrv must be defined for sharing');
1590
+ (0, assert_1.default)(keychain.fromPubKey, 'fromPubKey must be defined for sharing');
1591
+ (0, assert_1.default)(keychain.toPubKey, 'toPubKey must be defined for sharing');
1592
+ (0, assert_1.default)(keychain.path, 'path must be defined for sharing');
1593
+ return keychain;
1594
+ }
1595
+ /**
1596
+ * Prepares a keychain for sharing with another user.
1597
+ * Fetches the wallet keychain, decrypts it, and encrypts it for the recipient.
1598
+ *
1599
+ * @param walletPassphrase - The passphrase to decrypt the keychain
1600
+ * @param pubkey - The recipient's public key
1601
+ * @param path - The key path
1602
+ * @returns The encrypted keychain for the recipient
1603
+ */
1604
+ async prepareSharedKeychain(walletPassphrase, pubkey, path) {
1605
+ try {
1606
+ const decryptedKeychain = await this.getDecryptedKeychainForSharing(walletPassphrase);
1607
+ if (!decryptedKeychain) {
1608
+ return {};
1609
+ }
1610
+ return this.encryptPrvForUser(decryptedKeychain.prv, decryptedKeychain.pub, pubkey, path);
1611
+ }
1612
+ catch (e) {
1613
+ if (e instanceof errors_1.MissingEncryptedKeychainError) {
1614
+ // ignore this error because this looks like a cold wallet
1615
+ return {};
1616
+ }
1617
+ throw e;
1618
+ }
1619
+ }
1149
1620
  /**
1150
1621
  * Share this wallet with another BitGo user.
1151
1622
  * @param params
1152
1623
  * @returns {*}
1153
1624
  */
1154
1625
  async shareWallet(params = {}) {
1155
- var _a;
1156
1626
  common.validateParams(params, ['email', 'permissions'], ['walletPassphrase', 'message']);
1157
1627
  if (params.reshare !== undefined && !_.isBoolean(params.reshare)) {
1158
1628
  throw new Error('Expected reshare to be a boolean.');
@@ -1160,58 +1630,24 @@ class Wallet {
1160
1630
  if (params.skipKeychain !== undefined && !_.isBoolean(params.skipKeychain)) {
1161
1631
  throw new Error('Expected skipKeychain to be a boolean. ');
1162
1632
  }
1163
- const needsKeychain = !params.skipKeychain && params.permissions && params.permissions.indexOf('spend') !== -1;
1633
+ // Check if this is a multi-key-user-key OFC wallet
1634
+ // For multi-key-user-key wallets, skip keychain preparation regardless of other conditions
1635
+ const needsKeychain = !this.isMultiUserKeyWallet() &&
1636
+ !params.skipKeychain &&
1637
+ params.permissions &&
1638
+ params.permissions.indexOf('spend') !== -1;
1164
1639
  if (params.disableEmail !== undefined && !_.isBoolean(params.disableEmail)) {
1165
1640
  throw new Error('Expected disableEmail to be a boolean.');
1166
1641
  }
1167
1642
  if (!_.isString(params.email)) {
1168
1643
  throw new Error('missing required string parameter email');
1169
1644
  }
1170
- const sharing = (await this.bitgo.getSharingKey({ email: params.email.toLowerCase() }));
1645
+ const sharing = (await this.bitgo.getSharingKey({
1646
+ email: params.email.toLowerCase(),
1647
+ }));
1171
1648
  let sharedKeychain;
1172
1649
  if (needsKeychain) {
1173
- try {
1174
- const keychain = (await this.getEncryptedUserKeychain({}));
1175
- // Decrypt the user key with a passphrase
1176
- if (keychain.encryptedPrv) {
1177
- if (!params.walletPassphrase) {
1178
- throw new Error('Missing walletPassphrase argument');
1179
- }
1180
- try {
1181
- keychain.prv = this.bitgo.decrypt({ password: params.walletPassphrase, input: keychain.encryptedPrv });
1182
- }
1183
- catch (e) {
1184
- throw new Error('Unable to decrypt user keychain');
1185
- }
1186
- const eckey = bitcoin_1.makeRandomKey();
1187
- const secret = ecdh_1.getSharedSecret(eckey, Buffer.from(sharing.pubkey, 'hex')).toString('hex');
1188
- const newEncryptedPrv = this.bitgo.encrypt({ password: secret, input: keychain.prv });
1189
- // Only one of pub/commonPub/commonKeychain should be present in the keychain
1190
- let pub = (_a = keychain.pub) !== null && _a !== void 0 ? _a : keychain.commonPub;
1191
- if (keychain.commonKeychain) {
1192
- pub =
1193
- this.baseCoin.getMPCAlgorithm() === 'eddsa'
1194
- ? eddsa_1.default.getPublicKeyFromCommonKeychain(keychain.commonKeychain)
1195
- : ecdsa_1.EcdsaUtils.getPublicKeyFromCommonKeychain(keychain.commonKeychain);
1196
- }
1197
- sharedKeychain = {
1198
- pub,
1199
- encryptedPrv: newEncryptedPrv,
1200
- fromPubKey: eckey.publicKey.toString('hex'),
1201
- toPubKey: sharing.pubkey,
1202
- path: sharing.path,
1203
- };
1204
- }
1205
- }
1206
- catch (e) {
1207
- if (e.message === 'No encrypted keychains on this wallet.') {
1208
- sharedKeychain = {};
1209
- // ignore this error because this looks like a cold wallet
1210
- }
1211
- else {
1212
- throw e;
1213
- }
1214
- }
1650
+ sharedKeychain = await this.prepareSharedKeychain(params.walletPassphrase, sharing.pubkey, sharing.path);
1215
1651
  }
1216
1652
  const options = {
1217
1653
  user: sharing.userId,
@@ -1219,13 +1655,9 @@ class Wallet {
1219
1655
  reshare: params.reshare,
1220
1656
  message: params.message,
1221
1657
  disableEmail: params.disableEmail,
1658
+ skipKeychain: Object.keys(sharedKeychain ?? {}).length === 0,
1659
+ keychain: Object.keys(sharedKeychain ?? {}).length === 0 ? undefined : sharedKeychain,
1222
1660
  };
1223
- if (sharedKeychain) {
1224
- options.keychain = sharedKeychain;
1225
- }
1226
- else if (params.skipKeychain) {
1227
- options.keychain = {};
1228
- }
1229
1661
  return await this.createShare(options);
1230
1662
  }
1231
1663
  /**
@@ -1276,10 +1708,10 @@ class Wallet {
1276
1708
  */
1277
1709
  async prebuildTransaction(params = {}) {
1278
1710
  if (this._wallet.multisigType === 'tss') {
1279
- return this.prebuildTransactionTss(params);
1711
+ return this.prebuildTransactionTxRequests(params);
1280
1712
  }
1281
1713
  // Whitelist params to build tx
1282
- const whitelistedParams = _.pick(params, this.prebuildWhitelistedParams());
1714
+ const whitelistedParams = this.baseCoin.preprocessBuildParams(_.pick(params, this.prebuildWhitelistedParams()));
1283
1715
  debug('prebuilding transaction: %O', whitelistedParams);
1284
1716
  if (params.reqId) {
1285
1717
  this.bitgo.setRequestTracer(params.reqId);
@@ -1303,13 +1735,19 @@ class Wallet {
1303
1735
  if (!_.isUndefined(blockHeight)) {
1304
1736
  buildResponse.blockHeight = blockHeight;
1305
1737
  }
1306
- let prebuild = (await this.baseCoin.postProcessPrebuild(Object.assign(buildResponse, { wallet: this, buildParams: whitelistedParams })));
1738
+ let prebuild = (await this.baseCoin.postProcessPrebuild(Object.assign(buildResponse, {
1739
+ wallet: this,
1740
+ buildParams: whitelistedParams,
1741
+ })));
1307
1742
  delete prebuild.wallet;
1308
1743
  delete prebuild.buildParams;
1309
1744
  prebuild = _.extend({}, prebuild, { walletId: this.id() });
1310
1745
  if (this._wallet && this._wallet.coinSpecific && !params.walletContractAddress) {
1311
- prebuild = _.extend({}, prebuild, { walletContractAddress: this._wallet.coinSpecific.baseAddress });
1746
+ prebuild = _.extend({}, prebuild, {
1747
+ walletContractAddress: this._wallet.coinSpecific.baseAddress,
1748
+ });
1312
1749
  }
1750
+ prebuild = _.extend({}, prebuild, { reqId: params.reqId });
1313
1751
  debug('final transaction prebuild: %O', prebuild);
1314
1752
  return prebuild;
1315
1753
  }
@@ -1324,21 +1762,21 @@ class Wallet {
1324
1762
  throw new Error('getUserKeyAndSignTssTransaction is only supported for TSS wallets');
1325
1763
  }
1326
1764
  const reqId = new utils_1.RequestTracer();
1327
- const keychains = await this.baseCoin.keychains().getKeysForSigning({ wallet: this, reqId });
1328
1765
  // Doing a sanity check for password here to avoid doing further work if we know it's wrong
1766
+ const keychains = await this.getKeychainsAndValidatePassphrase({
1767
+ reqId,
1768
+ walletPassphrase,
1769
+ });
1329
1770
  const userKeychain = keychains[0];
1330
1771
  if (!userKeychain || !userKeychain.encryptedPrv) {
1331
1772
  throw new Error('the user keychain does not have property encryptedPrv');
1332
1773
  }
1333
- try {
1334
- this.bitgo.decrypt({ input: userKeychain.encryptedPrv, password: walletPassphrase });
1335
- }
1336
- catch (e) {
1337
- const error = new Error(`unable to decrypt keychain with the given wallet passphrase. Error: ${JSON.stringify(e)}`);
1338
- error.code = 'wallet_passphrase_incorrect';
1339
- throw error;
1340
- }
1341
- return this.signTransaction({ txPrebuild: { txRequestId }, walletPassphrase, reqId, keychain: userKeychain });
1774
+ return this.signTransaction({
1775
+ txPrebuild: { txRequestId },
1776
+ walletPassphrase,
1777
+ reqId,
1778
+ keychain: userKeychain,
1779
+ });
1342
1780
  }
1343
1781
  /**
1344
1782
  * Sign a transaction
@@ -1346,10 +1784,12 @@ class Wallet {
1346
1784
  * - txPrebuild
1347
1785
  * - [keychain / key] (object) or prv (string)
1348
1786
  * - walletPassphrase
1787
+ * - verifyTxParams (optional) - when provided, the transaction will be verified before signing
1788
+ * - txParams: transaction parameters used for verification
1789
+ * - verification: optional verification options
1349
1790
  * @return {*}
1350
1791
  */
1351
1792
  async signTransaction(params = {}) {
1352
- var _a;
1353
1793
  const { txPrebuild, apiVersion, txRequestId } = params;
1354
1794
  if (_.isFunction(params.customCommitmentGeneratingFunction) &&
1355
1795
  _.isFunction(params.customGShareGeneratingFunction) &&
@@ -1364,6 +1804,12 @@ class Wallet {
1364
1804
  // invoke external signer TSS for ECDSA workflow
1365
1805
  return this.signTransactionTssExternalSignerECDSA(this.baseCoin, params);
1366
1806
  }
1807
+ if (_.isFunction(params.customMPCv2SigningRound1GenerationFunction) &&
1808
+ _.isFunction(params.customMPCv2SigningRound2GenerationFunction) &&
1809
+ _.isFunction(params.customMPCv2SigningRound3GenerationFunction)) {
1810
+ // invoke external signer TSS for ECDSA MPCv2workflow
1811
+ return this.signTransactionTssExternalSignerECDSAMPCv2(this.baseCoin, params);
1812
+ }
1367
1813
  if (!txPrebuild || typeof txPrebuild !== 'object') {
1368
1814
  if (this.multisigType() === 'onchain') {
1369
1815
  throw new Error('txPrebuild is required for on-chain multisig wallets');
@@ -1374,19 +1820,52 @@ class Wallet {
1374
1820
  // We only do this if we're not using the external signer TSS flow
1375
1821
  params.txPrebuild = { txRequestId };
1376
1822
  }
1823
+ // Verify transaction if verifyTxParams is provided
1824
+ if (params.verifyTxParams && txPrebuild?.txHex) {
1825
+ const verifyParams = {
1826
+ txPrebuild: { ...txPrebuild },
1827
+ txParams: params.verifyTxParams.txParams,
1828
+ wallet: this,
1829
+ verification: params.verifyTxParams.verification,
1830
+ reqId: params.reqId,
1831
+ walletType: this.multisigType(),
1832
+ };
1833
+ await this.baseCoin.verifyTransaction(verifyParams);
1834
+ }
1835
+ if (params.walletPassphrase &&
1836
+ !(params.keychain || params.key) &&
1837
+ (this.type() === 'hot' || this.type() === undefined)) {
1838
+ // this logic should only apply to hot wallets
1839
+ if (!_.isString(params.walletPassphrase)) {
1840
+ throw new Error('walletPassphrase must be a string');
1841
+ }
1842
+ const keychains = await this.getKeychainsAndValidatePassphrase({
1843
+ reqId: params.reqId,
1844
+ walletPassphrase: params.walletPassphrase,
1845
+ });
1846
+ const userKeychain = keychains[0];
1847
+ if (!userKeychain || !userKeychain.encryptedPrv) {
1848
+ throw new Error('the user keychain does not have property encryptedPrv');
1849
+ }
1850
+ params.keychain = userKeychain;
1851
+ }
1377
1852
  const presign = await this.baseCoin.presignTransaction({
1378
1853
  ...params,
1379
1854
  walletData: this._wallet,
1380
1855
  tssUtils: this.tssUtils,
1381
1856
  });
1382
1857
  if (this.multisigType() === 'tss') {
1383
- return this.signTransactionTss({ ...presign, prv: this.getUserPrv(presign), apiVersion });
1858
+ return this.signTransactionTss({
1859
+ ...presign,
1860
+ prv: this.getUserPrv(presign),
1861
+ apiVersion,
1862
+ });
1384
1863
  }
1385
1864
  let { pubs } = params;
1386
1865
  if (!pubs && this.baseCoin.keyIdsForSigning().length > 1) {
1387
1866
  const keychains = await this.baseCoin.keychains().getKeysForSigning({ wallet: this });
1388
1867
  pubs = keychains.map((k) => {
1389
- assert_1.default(k.pub);
1868
+ (0, assert_1.default)(k.pub);
1390
1869
  return k.pub;
1391
1870
  });
1392
1871
  }
@@ -1398,18 +1877,23 @@ class Wallet {
1398
1877
  };
1399
1878
  if (_.isFunction(params.customSigningFunction)) {
1400
1879
  if (typeof this.baseCoin.signWithCustomSigningFunction === 'function') {
1401
- return this.baseCoin.signWithCustomSigningFunction(params.customSigningFunction, signTransactionParams);
1880
+ (0, assert_1.default)(pubs, 'pubs are required for custom signing');
1881
+ return this.baseCoin.signWithCustomSigningFunction(params.customSigningFunction, {
1882
+ ...signTransactionParams,
1883
+ pubs,
1884
+ });
1402
1885
  }
1403
1886
  const keys = await this.baseCoin.keychains().getKeysForSigning({ wallet: this });
1404
1887
  const signTransactionParamsWithSeed = {
1405
1888
  ...signTransactionParams,
1406
- derivationSeed: (_a = keys[0]) === null || _a === void 0 ? void 0 : _a.derivedFromParentWithSeed,
1889
+ derivationSeed: keys[0]?.derivedFromParentWithSeed,
1407
1890
  };
1408
1891
  return params.customSigningFunction(signTransactionParamsWithSeed);
1409
1892
  }
1410
1893
  return this.baseCoin.signTransaction({
1411
1894
  ...signTransactionParams,
1412
1895
  prv: this.getUserPrv(presign),
1896
+ wallet: this,
1413
1897
  });
1414
1898
  }
1415
1899
  /**
@@ -1433,8 +1917,11 @@ class Wallet {
1433
1917
  params.typedData.typedDataEncoded = this.baseCoin.encodeTypedData(params.typedData);
1434
1918
  }
1435
1919
  const keychains = await this.baseCoin.keychains().getKeysForSigning({ wallet: this, reqId: params.reqId });
1436
- const userPrvOptions = { ...params, keychain: keychains[0] };
1437
- assert_1.default(keychains[0].commonKeychain, 'Unable to find commonKeychain in keychains');
1920
+ const userPrvOptions = {
1921
+ ...params,
1922
+ keychain: keychains[0],
1923
+ };
1924
+ (0, assert_1.default)(keychains[0].commonKeychain, 'Unable to find commonKeychain in keychains');
1438
1925
  const presign = {
1439
1926
  ...params,
1440
1927
  walletData: this._wallet,
@@ -1458,8 +1945,8 @@ class Wallet {
1458
1945
  if (!this.baseCoin.supportsMessageSigning()) {
1459
1946
  throw new Error(`Message signing not supported for ${this.baseCoin.getFullName()}`);
1460
1947
  }
1461
- if (!params.message) {
1462
- throw new Error('message required to sign message');
1948
+ if (!params.message || !params.message.messageStandardType) {
1949
+ throw new Error('message and type required to sign message');
1463
1950
  }
1464
1951
  if (this._wallet.multisigType !== 'tss') {
1465
1952
  throw new Error('Message signing only supported for TSS wallets');
@@ -1468,8 +1955,11 @@ class Wallet {
1468
1955
  params.message.messageEncoded = this.baseCoin.encodeMessage(params.message.messageRaw);
1469
1956
  }
1470
1957
  const keychains = await this.baseCoin.keychains().getKeysForSigning({ wallet: this, reqId: params.reqId });
1471
- const userPrvOptions = { ...params, keychain: keychains[0] };
1472
- assert_1.default(keychains[0].commonKeychain, 'Unable to find commonKeychain in keychains');
1958
+ const userPrvOptions = {
1959
+ ...params,
1960
+ keychain: keychains[0],
1961
+ };
1962
+ (0, assert_1.default)(keychains[0].commonKeychain, 'Unable to find commonKeychain in keychains');
1473
1963
  const presign = {
1474
1964
  ...params,
1475
1965
  walletData: this._wallet,
@@ -1482,6 +1972,44 @@ class Wallet {
1482
1972
  };
1483
1973
  return this.signMessageTss(presign);
1484
1974
  }
1975
+ /**
1976
+ * Prepares and creates a sign message request for TSS wallets, that can be used later for signing.
1977
+ *
1978
+ * @param params - Parameters for creating the sign message request
1979
+ * @returns Promise<TxRequest> - The created transaction request for signing a message
1980
+ */
1981
+ async buildSignMessageRequest(params) {
1982
+ if (this._wallet.multisigType !== 'tss') {
1983
+ throw new Error('Message signing only supported for TSS wallets');
1984
+ }
1985
+ if (!this.baseCoin.supportsMessageSigning()) {
1986
+ throw new Error(`Message signing not supported for ${this.baseCoin.getFullName()}`);
1987
+ }
1988
+ if (!params.message?.messageRaw || !params.message?.messageStandardType) {
1989
+ throw new Error('message and type required to create message sign request');
1990
+ }
1991
+ const messageRaw = params.message.messageRaw;
1992
+ const messageStandardType = params.message.messageStandardType;
1993
+ const reqId = params.reqId || new utils_1.RequestTracer();
1994
+ try {
1995
+ const intentOption = {
1996
+ custodianMessageId: params.custodianMessageId,
1997
+ reqId,
1998
+ intentType: 'signMessage',
1999
+ isTss: true,
2000
+ messageRaw,
2001
+ messageStandardType,
2002
+ signerAddress: params.message.signerAddress,
2003
+ };
2004
+ if (!this.tssUtils) {
2005
+ throw new Error('TSS utilities not available for this wallet');
2006
+ }
2007
+ return await this.tssUtils.buildSignMessageRequest(intentOption);
2008
+ }
2009
+ catch (error) {
2010
+ throw new Error(`Failed to create message sign request: ${error}`);
2011
+ }
2012
+ }
1485
2013
  /**
1486
2014
  * Get the user private key from either a derivation or an encrypted keychain
1487
2015
  * @param [params.keychain / params.key] (object) or params.prv (string)
@@ -1504,7 +2032,10 @@ class Wallet {
1504
2032
  }
1505
2033
  if (userPrv && params.coldDerivationSeed) {
1506
2034
  // the derivation only makes sense when a key already exists
1507
- const derivation = this.baseCoin.deriveKeyWithSeed({ key: userPrv, seed: params.coldDerivationSeed });
2035
+ const derivation = this.baseCoin.deriveKeyWithSeed({
2036
+ key: userPrv,
2037
+ seed: params.coldDerivationSeed,
2038
+ });
1508
2039
  userPrv = derivation.key;
1509
2040
  }
1510
2041
  else if (!userPrv) {
@@ -1518,7 +2049,10 @@ class Wallet {
1518
2049
  if (!params.walletPassphrase) {
1519
2050
  throw new Error('walletPassphrase property missing');
1520
2051
  }
1521
- userPrv = this.bitgo.decrypt({ input: userEncryptedPrv, password: params.walletPassphrase });
2052
+ userPrv = (0, keychain_1.decryptKeychainPrivateKey)(this.bitgo, userKeychain, params.walletPassphrase);
2053
+ if (!userPrv) {
2054
+ throw new Error('failed to decrypt user keychain');
2055
+ }
1522
2056
  }
1523
2057
  return userPrv;
1524
2058
  }
@@ -1527,7 +2061,6 @@ class Wallet {
1527
2061
  * @param params
1528
2062
  */
1529
2063
  async prebuildAndSignTransaction(params = {}) {
1530
- var _a, _b, _c;
1531
2064
  if (params.eip1559 && params.gasPrice) {
1532
2065
  const error = new Error('Only one of params.eip1559 and params.gasPrice may be specified');
1533
2066
  error.code = 'both_gasPrice_and_eip1559gasModel_specified';
@@ -1558,26 +2091,17 @@ class Wallet {
1558
2091
  error.code = 'recipients_not_allowed_for_fillnonce_and_acceleration_tx_type';
1559
2092
  throw error;
1560
2093
  }
1561
- const supportedTxRequestVersions = ((_a = this.tssUtils) === null || _a === void 0 ? void 0 : _a.supportedTxRequestVersions()) || [];
1562
- if (params.apiVersion && !supportedTxRequestVersions.includes(params.apiVersion)) {
1563
- throw new Error(`prebuildAndSignTransaction params.apiVersion=${params.apiVersion} must be one of ${supportedTxRequestVersions}`);
2094
+ if (params.apiVersion) {
2095
+ (0, txRequest_1.validateTxRequestApiVersion)(this, params.apiVersion);
1564
2096
  }
1565
- const keychains = await this.baseCoin.keychains().getKeysForSigning({ wallet: this, reqId: params.reqId });
1566
2097
  // Doing a sanity check for password here to avoid doing further work if we know it's wrong
1567
- // we ignore this check with if customSigningFunction is provided
1568
- // which means that the user is handling the signing in external signing mode
1569
- try {
1570
- if (keychains[0].encryptedPrv && !params.customSigningFunction && params.walletPassphrase) {
1571
- this.bitgo.decrypt({ input: keychains[0].encryptedPrv, password: params.walletPassphrase });
1572
- }
1573
- }
1574
- catch (e) {
1575
- const error = new Error(`unable to decrypt keychain with the given wallet passphrase. Error: ${JSON.stringify(e)}`);
1576
- error.code = 'wallet_passphrase_incorrect';
1577
- throw error;
1578
- }
2098
+ const keychains = await this.getKeychainsAndValidatePassphrase({
2099
+ reqId: params.reqId,
2100
+ walletPassphrase: params.walletPassphrase,
2101
+ customSigningFunction: params.customSigningFunction,
2102
+ });
1579
2103
  let txPrebuildQuery;
1580
- if (isPrebuildTransactionResult(params.prebuildTx) && ((_b = params.prebuildTx.buildParams) === null || _b === void 0 ? void 0 : _b.preview)) {
2104
+ if (isPrebuildTransactionResult(params.prebuildTx) && params.prebuildTx.buildParams?.preview) {
1581
2105
  // If we prebuilt the txRequest with preview=true, then we should rebuild with preview=false to persist the request
1582
2106
  txPrebuildQuery = this.prebuildTransaction({
1583
2107
  ...params,
@@ -1591,10 +2115,10 @@ class Wallet {
1591
2115
  const txPrebuild = (await txPrebuildQuery);
1592
2116
  try {
1593
2117
  await this.baseCoin.verifyTransaction({
1594
- txParams: txPrebuild.buildParams || params,
2118
+ txParams: { ...txPrebuild.buildParams, ...params },
1595
2119
  txPrebuild,
1596
2120
  wallet: this,
1597
- verification: (_c = params.verification) !== null && _c !== void 0 ? _c : {},
2121
+ verification: params.verification ?? {},
1598
2122
  reqId: params.reqId,
1599
2123
  walletType: this._wallet.multisigType,
1600
2124
  });
@@ -1602,7 +2126,15 @@ class Wallet {
1602
2126
  catch (e) {
1603
2127
  console.error('transaction prebuild failed local validation:', e.message);
1604
2128
  console.error('transaction params:', _.omit(params, ['keychain', 'prv', 'passphrase', 'walletPassphrase', 'key', 'wallet']));
1605
- console.error('transaction prebuild:', txPrebuild);
2129
+ // Sanitize to remove _token from bitgo
2130
+ const sanitizedPrebuild = {
2131
+ ..._.omit(txPrebuild, ['wallet']),
2132
+ wallet: {
2133
+ ...this,
2134
+ bitgo: _.omit(this.bitgo, ['_token']),
2135
+ },
2136
+ };
2137
+ console.error('transaction prebuild:', sanitizedPrebuild);
1606
2138
  console.trace(e);
1607
2139
  throw e;
1608
2140
  }
@@ -1610,10 +2142,7 @@ class Wallet {
1610
2142
  const signingParams = {
1611
2143
  ...params,
1612
2144
  txPrebuild,
1613
- wallet: {
1614
- // this is the version of the multisig address at wallet creation time
1615
- addressVersion: this._wallet.coinSpecific.addressVersion,
1616
- },
2145
+ wallet: this,
1617
2146
  keychain: keychains[0],
1618
2147
  backupKeychain: keychains.length > 1 ? keychains[1] : null,
1619
2148
  bitgoKeychain: keychains.length > 2 ? keychains[2] : null,
@@ -1621,13 +2150,13 @@ class Wallet {
1621
2150
  };
1622
2151
  if (this._wallet.multisigType === 'onchain') {
1623
2152
  signingParams.pubs = keychains.map((k) => {
1624
- assert_1.default(k.pub);
2153
+ (0, assert_1.default)(k.pub);
1625
2154
  return k.pub;
1626
2155
  });
1627
2156
  }
1628
2157
  if (signingParams.txPrebuild.txRequestId) {
1629
- assert_1.default(this.tssUtils, 'tssUtils must be defined for TSS wallets');
1630
- const txRequest = await this.tssUtils.getTxRequest(signingParams.txPrebuild.txRequestId);
2158
+ (0, assert_1.default)(this.tssUtils, 'tssUtils must be defined for TSS wallets');
2159
+ const txRequest = await this.tssUtils.getTxRequest(signingParams.txPrebuild.txRequestId, params.reqId);
1631
2160
  if (this.tssUtils.isPendingApprovalTxRequestFull(txRequest)) {
1632
2161
  return txRequest;
1633
2162
  }
@@ -1646,21 +2175,75 @@ class Wallet {
1646
2175
  confirmedBalance: this.confirmedBalance(),
1647
2176
  spendableBalance: this.spendableBalance(),
1648
2177
  };
1649
- error.txParams = _.omit(params, ['keychain', 'prv', 'passphrase', 'walletPassphrase', 'key']);
2178
+ error.txParams = {
2179
+ ..._.omit(params, ['keychain', 'prv', 'passphrase', 'walletPassphrase', 'key', 'wallet']),
2180
+ wallet: {
2181
+ ...this,
2182
+ bitgo: _.omit(this.bitgo, ['_token']),
2183
+ },
2184
+ };
1650
2185
  }
1651
2186
  throw error;
1652
2187
  }
1653
2188
  }
1654
2189
  /**
1655
- * Accelerate a transaction's confirmation using Child-Pays-For-Parent (CPFP)
2190
+ * Accelerate a transaction's confirmation using Child-Pays-For-Parent (CPFP) or Replace-By-Fee (RBF)
1656
2191
  * @param params
1657
2192
  */
1658
2193
  async accelerateTransaction(params = {}) {
1659
- // TODO(BG-9349): change the last check to > 0 and the error message once platform allows multiple transactions to
1660
- // be bumped in the same CPFP transaction
1661
- if (_.isUndefined(params.cpfpTxIds) || !Array.isArray(params.cpfpTxIds) || params.cpfpTxIds.length !== 1) {
1662
- const error = new Error('expecting cpfpTxIds to be an array of length 1');
1663
- error.code = 'cpfptxids_not_array';
2194
+ this.validateAccelerationParams(params);
2195
+ params.recipients = [];
2196
+ return await this.submitTransaction({
2197
+ ...(await this.prebuildAndSignTransaction(params)),
2198
+ ...BuildParams_1.BuildParams.encode(params),
2199
+ });
2200
+ }
2201
+ validateAccelerationParams(params) {
2202
+ if (!params.cpfpTxIds && !params.rbfTxIds) {
2203
+ const error = new Error('must pass cpfpTxIds or rbfTxIds');
2204
+ error.code = 'cpfptxids_or_rbftxids_required';
2205
+ throw error;
2206
+ }
2207
+ if (params.cpfpTxIds && params.rbfTxIds) {
2208
+ const error = new Error('cannot specify both cpfpTxIds and rbfTxIds');
2209
+ error.code = 'cannot_specify_both_cpfp_and_rbf_txids';
2210
+ throw error;
2211
+ }
2212
+ if (params.cpfpTxIds) {
2213
+ this.validateCpfpParams(params);
2214
+ }
2215
+ if (params.rbfTxIds) {
2216
+ this.validateRbfParams(params);
2217
+ }
2218
+ if (params.recipients !== undefined) {
2219
+ if (!Array.isArray(params.recipients) || params.recipients.length !== 0) {
2220
+ throw new Error(`invalid value for 'recipients': must be empty array when set`);
2221
+ }
2222
+ }
2223
+ }
2224
+ validateRbfParams(params) {
2225
+ if (!Array.isArray(params.rbfTxIds) || params.rbfTxIds.length !== 1) {
2226
+ const error = new Error('expecting rbfTxIds to be an array of length 1');
2227
+ error.code = 'rbftxids_not_array';
2228
+ throw error;
2229
+ }
2230
+ if (!params.feeMultiplier) {
2231
+ const error = new Error('feeMultiplier must be set');
2232
+ error.code = 'feemultiplier_not_set';
2233
+ throw error;
2234
+ }
2235
+ if (params.feeMultiplier <= 1) {
2236
+ const error = new Error('feeMultiplier must be a greater than 1');
2237
+ error.code = 'feemultiplier_greater_than_one';
2238
+ throw error;
2239
+ }
2240
+ }
2241
+ validateCpfpParams(params) {
2242
+ // TODO(BG-9349): change the last check to > 0 and the error message once platform allows multiple transactions to
2243
+ // be bumped in the same CPFP transaction
2244
+ if (!Array.isArray(params.cpfpTxIds) || params.cpfpTxIds.length !== 1) {
2245
+ const error = new Error('expecting cpfpTxIds to be an array of length 1');
2246
+ error.code = 'cpfptxids_not_array';
1664
2247
  throw error;
1665
2248
  }
1666
2249
  if (_.isUndefined(params.cpfpFeeRate)) {
@@ -1691,24 +2274,15 @@ class Wallet {
1691
2274
  throw error;
1692
2275
  }
1693
2276
  }
1694
- if (params.recipients !== undefined) {
1695
- if (!Array.isArray(params.recipients) || params.recipients.length !== 0) {
1696
- throw new Error(`invalid value for 'recipients': must be empty array when set`);
1697
- }
1698
- }
1699
- params.recipients = [];
1700
- return await this.submitTransaction({
1701
- ...(await this.prebuildAndSignTransaction(params)),
1702
- ...BuildParams_1.BuildParams.encode(params),
1703
- });
1704
2277
  }
1705
2278
  /**
1706
2279
  * Submit a half-signed transaction to BitGo
1707
2280
  * @param params
1708
2281
  * - txHex: transaction hex to submit
1709
2282
  * - halfSigned: object containing transaction (txHex or txBase64) to submit
2283
+ * @param reqId - request tracer request id
1710
2284
  */
1711
- async submitTransaction(params = {}) {
2285
+ async submitTransaction(params = {}, reqId) {
1712
2286
  common.validateParams(params, [], ['otp', 'txHex', 'txRequestId']);
1713
2287
  const hasTxHex = !!params.txHex;
1714
2288
  const hasHalfSigned = !!params.halfSigned;
@@ -1718,7 +2292,7 @@ class Wallet {
1718
2292
  else if (!params.txRequestId && ((hasTxHex && hasHalfSigned) || (!hasTxHex && !hasHalfSigned))) {
1719
2293
  throw new Error('must supply either txHex or halfSigned, but not both');
1720
2294
  }
1721
- return this.sendTransaction(params);
2295
+ return this.sendTransaction(params, reqId);
1722
2296
  }
1723
2297
  /**
1724
2298
  * Send coins to a recipient
@@ -1743,13 +2317,15 @@ class Wallet {
1743
2317
  throw new Error('missing required parameter address');
1744
2318
  }
1745
2319
  const coin = this.baseCoin;
1746
- const amount = new bignumber_js_1.BigNumber(params.amount);
1747
- if (amount.isNegative()) {
1748
- throw new Error('invalid argument for amount - positive number greater than zero or numeric string expected');
1749
- }
1750
- if (!coin.valuelessTransferAllowed() && amount.isZero()) {
1751
- throw new Error('invalid argument for amount - positive number greater than zero or numeric string expected');
1752
- }
2320
+ const amount = new bignumber_js_1.default(params.amount);
2321
+ const isAmountNegative = amount.isNegative();
2322
+ const isAmountZero = amount.isZero();
2323
+ const isAmountDecimal = !amount.isInteger();
2324
+ _.some([isAmountNegative, !coin.valuelessTransferAllowed() && isAmountZero, isAmountDecimal], (condition) => {
2325
+ if (condition) {
2326
+ throw new Error('invalid argument for amount - Integer greater than zero or numeric string expected');
2327
+ }
2328
+ });
1753
2329
  const recipients = [
1754
2330
  {
1755
2331
  address: params.address,
@@ -1762,9 +2338,125 @@ class Wallet {
1762
2338
  if (params.data && coin.transactionDataAllowed()) {
1763
2339
  recipients[0].data = params.data;
1764
2340
  }
1765
- const sendManyOptions = Object.assign({}, params, { recipients });
2341
+ const sendManyOptions = Object.assign({}, params, {
2342
+ recipients,
2343
+ });
1766
2344
  return this.sendMany(sendManyOptions);
1767
2345
  }
2346
+ /**
2347
+ * Send an ERC-721 NFT or ERC-1155 NFT(s).
2348
+ *
2349
+ * This function constructs the appropriate call data for an ERC-721/1155 token transfer,
2350
+ * and calls the token contract with the data, and amount 0. This transaction will always produce
2351
+ * a pending approval.
2352
+ *
2353
+ * @param sendOptions Options to specify how the transaction should be sent.
2354
+ * @param sendNftOptions Options to specify the NFT(s) to be sent.
2355
+ *
2356
+ * @return A pending approval for the transaction.
2357
+ */
2358
+ async sendNft(sendOptions, sendNftOptions) {
2359
+ const nftCollections = await this.getNftBalances();
2360
+ const { tokenContractAddress, recipientAddress, type } = sendNftOptions;
2361
+ const nftBalance = nftCollections.find((c) => c.metadata.tokenContractAddress === tokenContractAddress);
2362
+ if (!nftBalance) {
2363
+ throw new Error(`Collection not found for token contract ${tokenContractAddress}`);
2364
+ }
2365
+ if (!this.baseCoin.isValidAddress(recipientAddress)) {
2366
+ throw new Error(`Invalid recipient address ${recipientAddress}`);
2367
+ }
2368
+ const baseAddress = this.coinSpecific()?.baseAddress || this.coinSpecific()?.rootAddress;
2369
+ if (!baseAddress) {
2370
+ throw new Error('Missing base address for wallet');
2371
+ }
2372
+ if (nftBalance.type !== type) {
2373
+ throw new Error(`Specified NFT type ${type} does not match collection type ${nftBalance.type}`);
2374
+ }
2375
+ switch (sendNftOptions.type) {
2376
+ case 'ERC721': {
2377
+ if (!nftBalance.collections[sendNftOptions.tokenId]) {
2378
+ throw new Error(`Token ${sendNftOptions.tokenId} not found in collection ${tokenContractAddress} or does not have a spendable balance`);
2379
+ }
2380
+ const data = this.baseCoin.buildNftTransferData({
2381
+ ...sendNftOptions,
2382
+ fromAddress: baseAddress,
2383
+ });
2384
+ let recipient;
2385
+ if (this.baseCoin.getFamily() === 'vet') {
2386
+ recipient = {
2387
+ address: recipientAddress,
2388
+ amount: '1',
2389
+ tokenData: data,
2390
+ };
2391
+ }
2392
+ else if (this.baseCoin.getFamily() === 'hbarevm') {
2393
+ recipient = {
2394
+ address: sendNftOptions.tokenContractAddress,
2395
+ amount: '0',
2396
+ data,
2397
+ tokenName: nftBalance.metadata.name,
2398
+ };
2399
+ }
2400
+ else {
2401
+ recipient = {
2402
+ address: sendNftOptions.tokenContractAddress,
2403
+ amount: '0',
2404
+ data,
2405
+ };
2406
+ }
2407
+ return this.sendMany({
2408
+ ...sendOptions,
2409
+ recipients: [recipient],
2410
+ });
2411
+ }
2412
+ case 'ERC1155': {
2413
+ const entries = sendNftOptions.entries;
2414
+ for (const entry of entries) {
2415
+ if (!nftBalance.collections[entry.tokenId]) {
2416
+ throw new Error(`Token ${entry.tokenId} not found in collection ${sendNftOptions.tokenContractAddress} or does not have a spendable balance`);
2417
+ }
2418
+ if (nftBalance.collections[entry.tokenId] < entry.amount) {
2419
+ throw new Error(`Amount ${entry.amount} exceeds spendable balance of ${nftBalance.collections[entry.tokenId]} for token ${entry.tokenId}`);
2420
+ }
2421
+ }
2422
+ const data = this.baseCoin.buildNftTransferData({
2423
+ ...sendNftOptions,
2424
+ fromAddress: baseAddress,
2425
+ });
2426
+ return this.sendMany({
2427
+ ...sendOptions,
2428
+ recipients: [
2429
+ {
2430
+ address: sendNftOptions.tokenContractAddress,
2431
+ amount: '0',
2432
+ data: data,
2433
+ },
2434
+ ],
2435
+ });
2436
+ }
2437
+ case utils_1.TokenType.DIGITAL_ASSET: {
2438
+ if (!nftBalance.collections[sendNftOptions.tokenId]) {
2439
+ throw new Error(`Token ${sendNftOptions.tokenId} not found in collection ${tokenContractAddress} or does not have a spendable balance`);
2440
+ }
2441
+ const tokenData = {
2442
+ tokenType: sendNftOptions.type,
2443
+ tokenQuantity: '1', // This NFT standard will always have quantity of 1
2444
+ tokenContractAddress,
2445
+ tokenId: sendNftOptions.tokenId,
2446
+ };
2447
+ return this.sendMany({
2448
+ ...sendOptions,
2449
+ recipients: [
2450
+ {
2451
+ address: recipientAddress,
2452
+ amount: '1', // the amount needs to be non-zero for the transaction to be valid, it is ignored
2453
+ tokenData,
2454
+ },
2455
+ ],
2456
+ });
2457
+ }
2458
+ }
2459
+ }
1768
2460
  /**
1769
2461
  * Send money to multiple recipients
1770
2462
  * 1. Gets the user keychain by checking the wallet for a key which has an encrypted prv
@@ -1806,28 +2498,23 @@ class Wallet {
1806
2498
  this.bitgo.setRequestTracer(reqId);
1807
2499
  const coin = this.baseCoin;
1808
2500
  if (_.isObject(params.recipients)) {
1809
- params.recipients.map(function (recipient) {
1810
- const amount = new bignumber_js_1.BigNumber(recipient.amount);
1811
- if (amount.isNegative()) {
1812
- throw new Error('invalid argument for amount - positive number greater than zero or numeric string expected');
1813
- }
1814
- if (!coin.valuelessTransferAllowed() && amount.isZero()) {
1815
- throw new Error('invalid argument for amount - positive number greater than zero or numeric string expected');
1816
- }
2501
+ params.recipients.forEach(function (recipient) {
2502
+ coin.checkRecipient(recipient);
1817
2503
  });
1818
2504
  }
1819
2505
  if (this._wallet.multisigType === 'tss') {
1820
- return this.sendManyTss(params);
2506
+ return this.sendManyTxRequests(params);
1821
2507
  }
1822
2508
  const selectParams = _.pick(params, [...this.prebuildWhitelistedParams(), 'comment', 'otp', 'hop']);
1823
2509
  if (this._wallet.type === 'custodial') {
1824
2510
  const extraParams = await this.baseCoin.getExtraPrebuildParams(Object.assign(params, { wallet: this }));
1825
2511
  Object.assign(selectParams, extraParams);
1826
- return this.initiateTransaction(selectParams);
2512
+ return this.initiateTransaction(selectParams, reqId);
1827
2513
  }
1828
2514
  const halfSignedTransaction = await this.prebuildAndSignTransaction(params);
1829
- const finalTxParams = _.extend({}, halfSignedTransaction, selectParams);
1830
- return this.sendTransaction(finalTxParams);
2515
+ const extraParams = await this.baseCoin.getExtraPrebuildParams(Object.assign(params, { wallet: this }));
2516
+ const finalTxParams = _.extend({}, halfSignedTransaction, selectParams, extraParams);
2517
+ return this.sendTransaction(finalTxParams, reqId);
1831
2518
  }
1832
2519
  /**
1833
2520
  * Recover an unsupported token from a BitGo multisig wallet
@@ -1976,17 +2663,34 @@ class Wallet {
1976
2663
  if (this.baseCoin.getFamily() !== 'ofc') {
1977
2664
  throw new Error('Can only convert an Offchain (OFC) wallet to a trading account');
1978
2665
  }
1979
- return new tradingAccount_1.TradingAccount(this._wallet.enterprise, this, this.bitgo);
2666
+ return new trading_1.TradingAccount(this._wallet.enterprise, this, this.bitgo);
2667
+ }
2668
+ /**
2669
+ * Get the address book for this wallet
2670
+ */
2671
+ toAddressBook() {
2672
+ if (this.baseCoin.getFamily() !== 'ofc') {
2673
+ throw new Error('Can only use an Offchain (OFC) wallet for the address book');
2674
+ }
2675
+ return new address_book_1.AddressBook(this._wallet.enterprise, this.bitgo, this);
1980
2676
  }
1981
2677
  /**
1982
2678
  * Create a staking wallet from this wallet
1983
2679
  */
1984
2680
  toStakingWallet() {
1985
- var _a;
1986
- const isEthTss = this.baseCoin.getFamily() == 'eth' && ((_a = this._wallet.coinSpecific) === null || _a === void 0 ? void 0 : _a.walletVersion)
2681
+ const isEthTss = this.baseCoin.getFamily() == 'eth' && this._wallet.coinSpecific?.walletVersion
1987
2682
  ? this._wallet.coinSpecific.walletVersion >= 3
1988
2683
  : false;
1989
- return new stakingWallet_1.StakingWallet(this, isEthTss);
2684
+ return new staking_1.StakingWallet(this, isEthTss);
2685
+ }
2686
+ /**
2687
+ * Create a go staking wallet from this wallet
2688
+ */
2689
+ toGoStakingWallet() {
2690
+ if (this.baseCoin.getFamily() !== 'ofc') {
2691
+ throw new Error('Can only convert an Offchain (OFC) wallet to a staking wallet');
2692
+ }
2693
+ return new staking_1.GoStakingWallet(this);
1990
2694
  }
1991
2695
  /**
1992
2696
  * Creates and downloads PDF keycard for wallet (requires response from wallets.generateWallet)
@@ -2041,7 +2745,7 @@ class Wallet {
2041
2745
  const coinShortName = this.baseCoin.type;
2042
2746
  const coinName = this.baseCoin.getFullName();
2043
2747
  const walletLabel = this._wallet.label;
2044
- const doc = keycard_1.drawKeycard({
2748
+ const doc = (0, internal_1.drawKeycard)({
2045
2749
  jsPDF,
2046
2750
  QRCode,
2047
2751
  encrypt: this.bitgo.encrypt,
@@ -2080,10 +2784,16 @@ class Wallet {
2080
2784
  .post(this.baseCoin.url('/wallet/' + this.id() + '/consolidateAccount/build'))
2081
2785
  .send(whitelistedParams)
2082
2786
  .result());
2787
+ if (buildResponse.length === 0) {
2788
+ throw new Error('No receive addresses with balance found to consolidate.');
2789
+ }
2083
2790
  // we need to step over each prebuild now - should be in an array in the body
2084
2791
  const consolidations = [];
2085
2792
  for (const consolidateAccountBuild of buildResponse) {
2086
- let prebuild = (await this.baseCoin.postProcessPrebuild(Object.assign(consolidateAccountBuild, { wallet: this, buildParams: whitelistedParams })));
2793
+ let prebuild = (await this.baseCoin.postProcessPrebuild(Object.assign(consolidateAccountBuild, {
2794
+ wallet: this,
2795
+ buildParams: whitelistedParams,
2796
+ })));
2087
2797
  delete prebuild.wallet;
2088
2798
  delete prebuild.buildParams;
2089
2799
  prebuild = _.extend({}, prebuild, { walletId: this.id() });
@@ -2105,7 +2815,7 @@ class Wallet {
2105
2815
  }
2106
2816
  if (this._wallet.type === 'custodial' && this._wallet.multisigType !== 'tss') {
2107
2817
  params.type = 'consolidate';
2108
- return this.initiateTransaction(params);
2818
+ return this.initiateTransaction(params, params.reqId);
2109
2819
  }
2110
2820
  // one of a set of consolidation transactions
2111
2821
  if (typeof params.prebuildTx === 'string' || params.prebuildTx === undefined) {
@@ -2118,13 +2828,13 @@ class Wallet {
2118
2828
  if (!params.prebuildTx.txRequestId) {
2119
2829
  throw new Error('Consolidation request missing txRequestId.');
2120
2830
  }
2121
- return await this.sendManyTss(params);
2831
+ return await this.sendManyTxRequests(params);
2122
2832
  }
2123
2833
  const signedPrebuild = (await this.prebuildAndSignTransaction(params));
2124
2834
  // decorate with our consolidation id
2125
2835
  signedPrebuild.consolidateId = params.prebuildTx.consolidateId;
2126
2836
  delete signedPrebuild.wallet;
2127
- return await this.submitTransaction(signedPrebuild);
2837
+ return await this.submitTransaction(signedPrebuild, params.reqId);
2128
2838
  }
2129
2839
  /**
2130
2840
  * Builds and sends a set of account consolidations. This is intended to flush many balances to the root wallet balance.
@@ -2135,22 +2845,53 @@ class Wallet {
2135
2845
  if (!this.baseCoin.allowsAccountConsolidations()) {
2136
2846
  throw new Error(`${this.baseCoin.getFullName()} does not allow account consolidations.`);
2137
2847
  }
2848
+ const apiVersion = params.apiVersion ??
2849
+ (this.tssUtils && this.tssUtils.supportedTxRequestVersions().includes('full') ? 'full' : undefined);
2850
+ // Doing a sanity check for password here to avoid doing further work if we know it's wrong
2851
+ await this.getKeychainsAndValidatePassphrase({
2852
+ reqId: params.reqId,
2853
+ walletPassphrase: params.walletPassphrase,
2854
+ customSigningFunction: params.customSigningFunction,
2855
+ });
2138
2856
  // this gives us a set of account consolidation transactions
2139
- const unsignedBuilds = (await this.buildAccountConsolidations(params));
2857
+ const unsignedBuilds = await this.buildAccountConsolidations({
2858
+ ...params,
2859
+ apiVersion: apiVersion,
2860
+ });
2140
2861
  if (unsignedBuilds && unsignedBuilds.length > 0) {
2862
+ // Get wallet's base address to validate destination addresses
2863
+ const baseAddress = this._wallet.coinSpecific?.baseAddress || this._wallet.coinSpecific?.rootAddress;
2864
+ // Validate all transactions
2865
+ for (const build of unsignedBuilds) {
2866
+ if (baseAddress) {
2867
+ debug('verifying txHex', JSON.stringify(build));
2868
+ //Verify transactions send funds to the base address
2869
+ if (!(await this.baseCoin.verifyTransaction({
2870
+ txPrebuild: build,
2871
+ txParams: params,
2872
+ verification: {
2873
+ consolidationToBaseAddress: true,
2874
+ },
2875
+ wallet: this,
2876
+ walletType: this._wallet.multisigType,
2877
+ }))) {
2878
+ throw new Error('Found output that does not consolidate funds to base address');
2879
+ }
2880
+ }
2881
+ }
2141
2882
  const successfulTxs = [];
2142
- const failedTxs = new Array();
2883
+ const failedTxs = [];
2143
2884
  for (const unsignedBuild of unsignedBuilds) {
2144
2885
  // fold any of the parameters we used to build this transaction into the unsignedBuild
2145
2886
  const unsignedBuildWithOptions = Object.assign({}, params);
2887
+ unsignedBuildWithOptions.apiVersion = apiVersion;
2146
2888
  unsignedBuildWithOptions.prebuildTx = unsignedBuild;
2147
2889
  try {
2148
2890
  const sendTx = await this.sendAccountConsolidation(unsignedBuildWithOptions);
2149
2891
  successfulTxs.push(sendTx);
2150
2892
  }
2151
2893
  catch (e) {
2152
- console.dir(e);
2153
- failedTxs.push(e);
2894
+ failedTxs.push({ message: e.message, name: e.name });
2154
2895
  }
2155
2896
  }
2156
2897
  return {
@@ -2170,6 +2911,10 @@ class Wallet {
2170
2911
  if (!teConfig.requiresTokenEnablement) {
2171
2912
  throw new Error(`${this.baseCoin.getFullName()} does not require token enablements`);
2172
2913
  }
2914
+ // Validate wallet type if coin requires it
2915
+ if (typeof teConfig.validateWallet === 'function' && this._wallet.type) {
2916
+ teConfig.validateWallet(this._wallet.type);
2917
+ }
2173
2918
  if (params.enableTokens.length === 0) {
2174
2919
  throw new Error('No tokens are being specified');
2175
2920
  }
@@ -2191,7 +2936,9 @@ class Wallet {
2191
2936
  return results.flat();
2192
2937
  }
2193
2938
  const buildParams = _.pick(params, this.prebuildWhitelistedParams());
2194
- buildParams.type = 'enabletoken';
2939
+ if (!buildParams.type) {
2940
+ buildParams.type = 'enabletoken';
2941
+ }
2195
2942
  // Check if we build with intent
2196
2943
  if (this._wallet.multisigType === 'tss') {
2197
2944
  return [await this.prebuildTransaction(buildParams)];
@@ -2199,11 +2946,10 @@ class Wallet {
2199
2946
  else {
2200
2947
  // Rewrite tokens into recipients for buildTransaction
2201
2948
  buildParams.recipients = params.enableTokens.map((token) => {
2202
- var _a, _b;
2203
2949
  // If token has non address, take the first wallet address is stored in its coin-specific property
2204
2950
  // In account-based coin implementations that use wallet contracts, the address is called baseAddress (e.g. eth-like, xtz)
2205
2951
  // for others it's called rootAddress (e.g. xrp, xlm, algo, trx)
2206
- const address = token.address || ((_a = this._wallet.coinSpecific) === null || _a === void 0 ? void 0 : _a.baseAddress) || ((_b = this._wallet.coinSpecific) === null || _b === void 0 ? void 0 : _b.rootAddress);
2952
+ const address = token.address || this._wallet.coinSpecific?.baseAddress || this._wallet.coinSpecific?.rootAddress;
2207
2953
  if (!address) {
2208
2954
  throw new Error('Wallet does not have base address, must specify with token param');
2209
2955
  }
@@ -2219,6 +2965,27 @@ class Wallet {
2219
2965
  return [prebuildTx];
2220
2966
  }
2221
2967
  }
2968
+ /**
2969
+ * Builds wallet initialization
2970
+ * @param {PrebuildTransactionOptions} params
2971
+ * @returns {Promise<PrebuildTransactionResult>}
2972
+ */
2973
+ async buildWalletInitialization(params) {
2974
+ if (!this.baseCoin.requiresWalletInitializationTransaction()) {
2975
+ throw new Error(`Wallet initialization is not required for ${this.baseCoin.getFullName()}`);
2976
+ }
2977
+ if (this._wallet.multisigType !== 'tss') {
2978
+ throw new Error('Wallet initialization transaction is only supported for TSS wallets');
2979
+ }
2980
+ if (params.reqId) {
2981
+ this.bitgo.setRequestTracer(params.reqId);
2982
+ }
2983
+ const buildParams = _.pick(params, this.prebuildWhitelistedParams());
2984
+ if (!buildParams.type) {
2985
+ buildParams.type = 'createAccount';
2986
+ }
2987
+ return await this.prebuildTransaction(buildParams);
2988
+ }
2222
2989
  /**
2223
2990
  * Signs and sends a single unsigned token enablement transaction
2224
2991
  * @param params
@@ -2227,25 +2994,31 @@ class Wallet {
2227
2994
  * - The response from initiating the transaction for custodial wallets
2228
2995
  */
2229
2996
  async sendTokenEnablement(params = {}) {
2230
- var _a, _b;
2231
2997
  const teConfig = this.baseCoin.getTokenEnablementConfig();
2998
+ params.verification = params.verification ?? {};
2999
+ params.verification.verifyTokenEnablement = params.verification.verifyTokenEnablement ?? true;
2232
3000
  if (!teConfig.requiresTokenEnablement) {
2233
3001
  throw new Error(`${this.baseCoin.getFullName()} does not require token enablement transactions`);
2234
3002
  }
2235
- if (typeof params.prebuildTx === 'string' || ((_b = (_a = params.prebuildTx) === null || _a === void 0 ? void 0 : _a.buildParams) === null || _b === void 0 ? void 0 : _b.type) !== 'enabletoken') {
3003
+ // Validate wallet type if coin requires it
3004
+ if (teConfig.validateWallet && this._wallet.type) {
3005
+ teConfig.validateWallet(this._wallet.type);
3006
+ }
3007
+ if (typeof params.prebuildTx === 'string' || params.prebuildTx?.buildParams?.type !== 'enabletoken') {
2236
3008
  throw new Error('Invalid build of token enablement.');
2237
3009
  }
2238
3010
  if (this._wallet.multisigType === 'tss') {
2239
- return await this.sendManyTss(params);
3011
+ return await this.sendManyTxRequests(params);
2240
3012
  }
2241
3013
  else {
2242
3014
  switch (this._wallet.type) {
2243
3015
  case 'hot':
2244
3016
  case 'cold':
2245
3017
  const signedPrebuild = await this.prebuildAndSignTransaction(params);
2246
- return await this.submitTransaction(signedPrebuild);
3018
+ return await this.submitTransaction(signedPrebuild, params.reqId);
2247
3019
  case 'custodial':
2248
- return this.initiateTransaction(params.prebuildTx.buildParams);
3020
+ case 'backing':
3021
+ return this.initiateTransaction(params.prebuildTx.buildParams, params.reqId);
2249
3022
  }
2250
3023
  }
2251
3024
  }
@@ -2283,13 +3056,30 @@ class Wallet {
2283
3056
  };
2284
3057
  }
2285
3058
  /**
2286
- * Create lightning for btc/tbtc from this wallet
3059
+ * The chain canton, requires the wallet to be initialized by sending out a transaction
3060
+ * to be onboarded onto the validator.
3061
+ * Builds, Signs and sends a transaction that initializes the canton wallet
3062
+ * @param params
2287
3063
  */
2288
- lightning() {
2289
- if (!this.baseCoin.supportsLightning()) {
2290
- throw new Error(`Lightning not supported for ${this.coin()}`);
3064
+ async sendWalletInitialization(params = {}) {
3065
+ const prebuildTx = await this.buildWalletInitialization(params);
3066
+ const unsignedBuildWithOptions = {
3067
+ ...params,
3068
+ prebuildTx,
3069
+ };
3070
+ const successfulTxs = [];
3071
+ const failedTxs = new Array();
3072
+ try {
3073
+ const sendTx = await this.sendManyTxRequests(unsignedBuildWithOptions);
3074
+ successfulTxs.push(sendTx);
3075
+ }
3076
+ catch (e) {
3077
+ failedTxs.push(e);
2291
3078
  }
2292
- return new lightning_1.Lightning(this.bitgo, this);
3079
+ return {
3080
+ success: successfulTxs,
3081
+ failure: failedTxs,
3082
+ };
2293
3083
  }
2294
3084
  /* MARK: TSS Helpers */
2295
3085
  /**
@@ -2297,34 +3087,34 @@ class Wallet {
2297
3087
  *
2298
3088
  * @param params prebuild transaction options
2299
3089
  */
2300
- async prebuildTransactionTss(params = {}) {
2301
- var _a, _b, _c;
3090
+ async prebuildTransactionTxRequests(params = {}) {
2302
3091
  const reqId = params.reqId || new utils_1.RequestTracer();
2303
3092
  this.bitgo.setRequestTracer(reqId);
2304
- if (params.apiVersion === 'lite' &&
2305
- (this._wallet.type === 'custodial' || this._wallet.type === 'cold' || this.baseCoin.getMPCAlgorithm() === 'ecdsa')) {
2306
- throw new Error(`Custodial and ECDSA MPC algorithm must always use 'full' api version`);
2307
- }
2308
- const apiVersion = params.apiVersion ||
2309
- (this._wallet.type === 'custodial' || this._wallet.type === 'cold' || this.baseCoin.getMPCAlgorithm() === 'ecdsa'
2310
- ? 'full'
2311
- : 'lite');
3093
+ const apiVersion = (0, txRequest_1.getTxRequestApiVersion)(this, params.apiVersion);
2312
3094
  // Two options different implementations of fees seems to now be supported, for now we will support both to be backwards compatible
2313
3095
  // TODO(BG-59685): deprecate one of these so that we have a single way to pass fees
2314
3096
  let feeOptions;
2315
3097
  if (params.feeOptions) {
2316
- feeOptions = params.feeOptions;
3098
+ feeOptions = params.feeToken ? { ...params.feeOptions, feeToken: params.feeToken } : params.feeOptions;
2317
3099
  }
2318
3100
  else if (params.gasPrice !== undefined || params.eip1559 !== undefined) {
2319
3101
  feeOptions =
2320
3102
  params.gasPrice !== undefined
2321
- ? { gasPrice: params.gasPrice, gasLimit: params.gasLimit }
3103
+ ? {
3104
+ gasPrice: params.gasPrice,
3105
+ gasLimit: params.gasLimit,
3106
+ ...(params.feeToken !== undefined && { feeToken: params.feeToken }),
3107
+ }
2322
3108
  : {
2323
- maxFeePerGas: Number((_a = params.eip1559) === null || _a === void 0 ? void 0 : _a.maxFeePerGas),
2324
- maxPriorityFeePerGas: Number((_b = params.eip1559) === null || _b === void 0 ? void 0 : _b.maxPriorityFeePerGas),
3109
+ maxFeePerGas: Number(params.eip1559?.maxFeePerGas),
3110
+ maxPriorityFeePerGas: Number(params.eip1559?.maxPriorityFeePerGas),
2325
3111
  gasLimit: params.gasLimit,
3112
+ ...(params.feeToken !== undefined && { feeToken: params.feeToken }),
2326
3113
  };
2327
3114
  }
3115
+ else if (params.feeToken !== undefined) {
3116
+ feeOptions = { feeToken: params.feeToken };
3117
+ }
2328
3118
  else if (params.gasLimit !== undefined) {
2329
3119
  feeOptions = { gasLimit: params.gasLimit };
2330
3120
  }
@@ -2343,7 +3133,11 @@ class Wallet {
2343
3133
  memo: params.memo,
2344
3134
  nonce: params.nonce,
2345
3135
  feeOptions,
3136
+ feeToken: params.feeToken,
2346
3137
  custodianTransactionId: params.custodianTransactionId,
3138
+ unspents: params.unspents,
3139
+ senderAddress: params.senderAddress,
3140
+ isTestTransaction: params.isTestTransaction,
2347
3141
  }, apiVersion, params.preview);
2348
3142
  break;
2349
3143
  case 'transfertoken':
@@ -2354,6 +3148,9 @@ class Wallet {
2354
3148
  recipients: params.recipients || [],
2355
3149
  nonce: params.nonce,
2356
3150
  feeOptions,
3151
+ feeToken: params.feeToken,
3152
+ unspents: params.unspents,
3153
+ sequenceId: params.sequenceId,
2357
3154
  }, apiVersion, params.preview);
2358
3155
  break;
2359
3156
  case 'enabletoken':
@@ -2365,6 +3162,14 @@ class Wallet {
2365
3162
  memo: params.memo,
2366
3163
  }, apiVersion, params.preview);
2367
3164
  break;
3165
+ case 'closeAssociatedTokenAccount':
3166
+ txRequest = await this.tssUtils.prebuildTxWithIntent({
3167
+ reqId,
3168
+ intentType: 'closeAssociatedTokenAccount',
3169
+ recipients: params.recipients || [],
3170
+ memo: params.memo,
3171
+ }, apiVersion, params.preview);
3172
+ break;
2368
3173
  case 'acceleration':
2369
3174
  txRequest = await this.tssUtils.prebuildTxWithIntent({
2370
3175
  reqId,
@@ -2373,6 +3178,7 @@ class Wallet {
2373
3178
  lowFeeTxid: params.lowFeeTxid,
2374
3179
  receiveAddress: params.receiveAddress,
2375
3180
  feeOptions,
3181
+ feeToken: params.feeToken,
2376
3182
  }, apiVersion, params.preview);
2377
3183
  break;
2378
3184
  case 'fillNonce':
@@ -2383,6 +3189,76 @@ class Wallet {
2383
3189
  nonce: params.nonce,
2384
3190
  receiveAddress: params.receiveAddress,
2385
3191
  feeOptions,
3192
+ feeToken: params.feeToken,
3193
+ }, apiVersion, params.preview);
3194
+ break;
3195
+ case 'tokenApproval':
3196
+ txRequest = await this.tssUtils.prebuildTxWithIntent({
3197
+ reqId,
3198
+ intentType: 'tokenApproval',
3199
+ tokenName: params.tokenName,
3200
+ feeToken: params.feeToken,
3201
+ }, apiVersion, params.preview);
3202
+ break;
3203
+ case 'createAccount':
3204
+ txRequest = await this.tssUtils.prebuildTxWithIntent({
3205
+ reqId,
3206
+ intentType: 'createAccount',
3207
+ recipients: params.recipients || [],
3208
+ }, apiVersion, params.preview);
3209
+ break;
3210
+ case 'transferAccept': {
3211
+ txRequest = await this.tssUtils.prebuildTxWithIntent({
3212
+ reqId,
3213
+ intentType: 'transferAccept',
3214
+ txRequestId: params.txRequestId,
3215
+ sequenceId: params.txRequestId,
3216
+ }, apiVersion, params.preview);
3217
+ break;
3218
+ }
3219
+ case 'transferReject': {
3220
+ txRequest = await this.tssUtils.prebuildTxWithIntent({
3221
+ reqId,
3222
+ intentType: 'transferReject',
3223
+ txRequestId: params.txRequestId,
3224
+ sequenceId: params.txRequestId,
3225
+ }, apiVersion, params.preview);
3226
+ break;
3227
+ }
3228
+ case 'transferOfferWithdrawn': {
3229
+ txRequest = await this.tssUtils.prebuildTxWithIntent({
3230
+ reqId,
3231
+ intentType: 'transferOfferWithdrawn',
3232
+ transferOfferId: params.transferOfferId,
3233
+ sequenceId: params.transferOfferId,
3234
+ }, apiVersion, params.preview);
3235
+ break;
3236
+ }
3237
+ case 'customTx':
3238
+ txRequest = await this.tssUtils.prebuildTxWithIntent({
3239
+ reqId,
3240
+ intentType: 'customTx',
3241
+ sequenceId: params.sequenceId,
3242
+ comment: params.comment,
3243
+ solInstructions: params.solInstructions,
3244
+ solVersionedTransactionData: params.solVersionedTransactionData,
3245
+ aptosCustomTransactionParams: params.aptosCustomTransactionParams,
3246
+ recipients: params.recipients || [],
3247
+ nonce: params.nonce,
3248
+ memo: params.memo,
3249
+ feeOptions,
3250
+ }, apiVersion, params.preview);
3251
+ break;
3252
+ case 'bridgeFunds':
3253
+ txRequest = await this.tssUtils.prebuildTxWithIntent({
3254
+ reqId,
3255
+ intentType: 'bridgeFunds',
3256
+ sequenceId: params.sequenceId,
3257
+ comment: params.comment,
3258
+ amount: params.intentAmount,
3259
+ nonce: params.nonce,
3260
+ feeOptions,
3261
+ feeToken: params.feeToken,
2386
3262
  }, apiVersion, params.preview);
2387
3263
  break;
2388
3264
  default:
@@ -2390,7 +3266,7 @@ class Wallet {
2390
3266
  }
2391
3267
  let unsignedTx;
2392
3268
  if (txRequest.apiVersion === 'full') {
2393
- if (((_c = txRequest.transactions) === null || _c === void 0 ? void 0 : _c.length) !== 1) {
3269
+ if (txRequest.transactions?.length !== 1) {
2394
3270
  throw new Error(`Expected a single unsigned tx for tx request with id: ${txRequest.txRequestId}`);
2395
3271
  }
2396
3272
  unsignedTx = txRequest.transactions[0].unsignedTx;
@@ -2409,6 +3285,9 @@ class Wallet {
2409
3285
  txHex: unsignedTx.serializedTxHex,
2410
3286
  buildParams: whitelistedParams,
2411
3287
  feeInfo: unsignedTx.feeInfo,
3288
+ ...(txRequest.pendingApprovalId && {
3289
+ pendingApprovalId: txRequest.pendingApprovalId,
3290
+ }),
2412
3291
  };
2413
3292
  }
2414
3293
  /**
@@ -2436,17 +3315,67 @@ class Wallet {
2436
3315
  if (!params.customGShareGeneratingFunction) {
2437
3316
  throw new Error('Generator function for G share required to sign transactions with External Signer.');
2438
3317
  }
2439
- assert_1.default(this.tssUtils, 'tssUtils must be defined');
3318
+ (0, assert_1.default)(this.tssUtils, 'tssUtils must be defined');
2440
3319
  // adding this to rebuild the transaction just before signing for EdDSA transaction using external signer
2441
- await this.tssUtils.deleteSignatureShares(txRequestId);
3320
+ const reqId = params.reqId || undefined;
3321
+ await this.tssUtils.deleteSignatureShares(txRequestId, reqId);
2442
3322
  try {
2443
- const signedTxRequest = await this.tssUtils.signEddsaTssUsingExternalSigner(txRequestId, params.customCommitmentGeneratingFunction, params.customRShareGeneratingFunction, params.customGShareGeneratingFunction);
3323
+ const signedTxRequest = await this.tssUtils.signEddsaTssUsingExternalSigner(txRequestId, params.customCommitmentGeneratingFunction, params.customRShareGeneratingFunction, params.customGShareGeneratingFunction, reqId);
2444
3324
  return signedTxRequest;
2445
3325
  }
2446
3326
  catch (e) {
2447
3327
  throw new Error('failed to sign transaction ' + e);
2448
3328
  }
2449
3329
  }
3330
+ /**
3331
+ * Signs and sends a transaction request from a TSS (hot) wallet, or a SMC (cold) wallet with an external signer.
3332
+ * Meant to be used for a transaction request where the signing process is aborted.
3333
+ *
3334
+ * @param params
3335
+ * txRequestId - The ID of the transaction request.
3336
+ * walletPassphrase - The passphrase for the wallet.
3337
+ * isTxRequestFull - Flag indicating if the transaction request is full.
3338
+ * @returns A promise that resolves to a SignedTransaction.
3339
+ */
3340
+ async signAndSendTxRequest(params) {
3341
+ if (params.isTxRequestFull) {
3342
+ await this.tssUtils?.deleteSignatureShares(params.txRequestId);
3343
+ }
3344
+ const ret = await this.getUserKeyAndSignTssTransaction({
3345
+ walletPassphrase: params.walletPassphrase,
3346
+ txRequestId: params.txRequestId,
3347
+ });
3348
+ if (!params.isTxRequestFull) {
3349
+ // It is assumed that if its not a full tx request, then it is a lite tx request
3350
+ const submitTx = await this.submitTransaction({
3351
+ txRequestId: params.txRequestId,
3352
+ });
3353
+ return submitTx;
3354
+ }
3355
+ return ret;
3356
+ }
3357
+ /**
3358
+ * Ensures signature shares are in a clean state before signing a transaction.
3359
+ * Automatically deletes signature shares for Full TxRequests before signing to prevent
3360
+ * issues with stale or partial signatures.
3361
+ * Use this for Express API and other integrations that need automatic cleanup of signatures.
3362
+ *
3363
+ * @param params - signing options
3364
+ * @returns signed transaction
3365
+ */
3366
+ async ensureCleanSigSharesAndSignTransaction(params = {}) {
3367
+ const txRequestId = params.txRequestId || params.txPrebuild?.txRequestId;
3368
+ if (txRequestId && this.tssUtils && this.multisigType() === 'tss') {
3369
+ const txRequest = await this.tssUtils.getTxRequest(txRequestId);
3370
+ // Always clean signature shares for Full TxRequests before signing
3371
+ const isFull = txRequest.apiVersion === 'full' &&
3372
+ ((txRequest.transactions ?? []).length > 0 || (txRequest.messages ?? []).length > 0);
3373
+ if (isFull) {
3374
+ await this.tssUtils.deleteSignatureShares(txRequestId);
3375
+ }
3376
+ }
3377
+ return this.signTransaction(params);
3378
+ }
2450
3379
  /**
2451
3380
  * Signs a transaction from a TSS ECDSA wallet using external signer.
2452
3381
  *
@@ -2476,11 +3405,10 @@ class Wallet {
2476
3405
  throw new Error('Generator function for S share required to sign transactions with External Signer.');
2477
3406
  }
2478
3407
  try {
2479
- assert_1.default(this.tssUtils, 'tssUtils must be defined');
3408
+ (0, assert_1.default)(this.tssUtils, 'tssUtils must be defined');
2480
3409
  const signedTxRequest = await this.tssUtils.signEcdsaTssUsingExternalSigner({
2481
3410
  txRequest: txRequestId,
2482
- prv: '',
2483
- reqId: new utils_1.RequestTracer(),
3411
+ reqId: params.reqId || new utils_1.RequestTracer(),
2484
3412
  }, utils_1.RequestType.tx, params.customPaillierModulusGeneratingFunction, params.customKShareGeneratingFunction, params.customMuDeltaShareGeneratingFunction, params.customSShareGeneratingFunction);
2485
3413
  return signedTxRequest;
2486
3414
  }
@@ -2488,6 +3416,43 @@ class Wallet {
2488
3416
  throw new Error('failed to sign transaction ' + e);
2489
3417
  }
2490
3418
  }
3419
+ /**
3420
+ * Signs a transaction from a TSS ECDSA wallet using external signer.
3421
+ *
3422
+ * @param params signing options
3423
+ */
3424
+ async signTransactionTssExternalSignerECDSAMPCv2(coin, params = {}) {
3425
+ let txRequestId = '';
3426
+ if (params.txRequestId) {
3427
+ txRequestId = params.txRequestId;
3428
+ }
3429
+ else if (params.txPrebuild && params.txPrebuild.txRequestId) {
3430
+ txRequestId = params.txPrebuild.txRequestId;
3431
+ }
3432
+ else {
3433
+ throw new Error('TxRequestId required to sign TSS transactions with External Signer.');
3434
+ }
3435
+ if (!params.customMPCv2SigningRound1GenerationFunction) {
3436
+ throw new Error('Generator function for MPCv2 Round 1 share required to sign transactions with External Signer.');
3437
+ }
3438
+ if (!params.customMPCv2SigningRound2GenerationFunction) {
3439
+ throw new Error('Generator function for MPCv2 Round 2 share required to sign transactions with External Signer.');
3440
+ }
3441
+ if (!params.customMPCv2SigningRound3GenerationFunction) {
3442
+ throw new Error('Generator function for MPCv2 Round 3 share required to sign transactions with External Signer.');
3443
+ }
3444
+ try {
3445
+ (0, assert_1.default)(this.tssUtils, 'tssUtils must be defined');
3446
+ const signedTxRequest = await this.tssUtils.signEcdsaMPCv2TssUsingExternalSigner({
3447
+ txRequest: txRequestId,
3448
+ reqId: params.reqId || new utils_1.RequestTracer(),
3449
+ }, params.customMPCv2SigningRound1GenerationFunction, params.customMPCv2SigningRound2GenerationFunction, params.customMPCv2SigningRound3GenerationFunction);
3450
+ return signedTxRequest;
3451
+ }
3452
+ catch (e) {
3453
+ throw new Error('failed to sign transaction ' + e);
3454
+ }
3455
+ }
2491
3456
  /**
2492
3457
  * Signs a transaction from a TSS wallet.
2493
3458
  *
@@ -2503,26 +3468,14 @@ class Wallet {
2503
3468
  if (!params.prv) {
2504
3469
  throw new Error('prv required to sign transactions with TSS');
2505
3470
  }
2506
- // If only the getHashFunction() is defined for the coin use it otherwise
2507
- // pass undefined hash, default hash will be used in that case.
2508
- let hash;
2509
3471
  try {
2510
- hash = this.baseCoin.getHashFunction();
2511
- }
2512
- catch (err) {
2513
- hash = undefined;
2514
- }
2515
- try {
2516
- const signedTxRequest = await this.tssUtils.signTxRequest({
3472
+ return await this.tssUtils.signTxRequest({
2517
3473
  txRequest: params.txPrebuild.txRequestId,
3474
+ txParams: params.txPrebuild.buildParams,
2518
3475
  prv: params.prv,
2519
3476
  reqId: params.reqId || new utils_1.RequestTracer(),
2520
3477
  apiVersion: params.apiVersion,
2521
- hash,
2522
3478
  });
2523
- return {
2524
- txRequestId: signedTxRequest.txRequestId,
2525
- };
2526
3479
  }
2527
3480
  catch (e) {
2528
3481
  throw new Error('failed to sign transaction ' + e);
@@ -2534,7 +3487,6 @@ class Wallet {
2534
3487
  * @param params signing options
2535
3488
  */
2536
3489
  async signMessageTss(params = {}) {
2537
- var _a, _b, _c, _d;
2538
3490
  if (!params.reqId) {
2539
3491
  params.reqId = new utils_1.RequestTracer();
2540
3492
  }
@@ -2543,37 +3495,45 @@ class Wallet {
2543
3495
  }
2544
3496
  try {
2545
3497
  let txRequest;
2546
- assert_1.default(params.message, 'message required for message signing');
3498
+ (0, assert_1.default)(params.message, 'message required for message signing');
3499
+ const messageRaw = params.message.messageRaw;
2547
3500
  if (!params.message.txRequestId) {
2548
3501
  const intentOption = {
2549
3502
  custodianMessageId: params.custodianMessageId,
2550
3503
  reqId: params.reqId,
2551
3504
  intentType: 'signMessage',
2552
3505
  isTss: true,
2553
- messageRaw: params.message.messageRaw,
2554
- messageEncoded: Buffer.from((_b = (_a = params.message) === null || _a === void 0 ? void 0 : _a.messageEncoded) !== null && _b !== void 0 ? _b : '').toString('hex'),
3506
+ messageRaw,
3507
+ messageStandardType: params.message.messageStandardType,
3508
+ signerAddress: params.message.signerAddress,
2555
3509
  };
2556
- txRequest = await this.tssUtils.createTxRequestWithIntentForMessageSigning(intentOption);
3510
+ txRequest = await this.tssUtils.buildSignMessageRequest(intentOption);
2557
3511
  params.message.txRequestId = txRequest.txRequestId;
2558
3512
  }
2559
3513
  else {
2560
- txRequest = await tss_1.getTxRequest(this.bitgo, this.id(), params.message.txRequestId);
3514
+ txRequest = await (0, tss_1.getTxRequest)(this.bitgo, this.id(), params.message.txRequestId, params.reqId);
2561
3515
  }
3516
+ (0, assert_1.default)(txRequest.messages && txRequest.messages.length > 0, 'Unable to find messages in txRequest for message signing');
3517
+ const messageEncoded = txRequest.messages[0].messageEncoded;
2562
3518
  const signedMessageRequest = await this.tssUtils.signTxRequestForMessage({
2563
3519
  txRequest,
2564
3520
  prv: params.prv,
2565
3521
  reqId: params.reqId || new utils_1.RequestTracer(),
2566
- messageRaw: params.message.messageRaw,
2567
- messageEncoded: params.message.messageEncoded,
2568
- bufferToSign: Buffer.from((_c = params.message.messageEncoded) !== null && _c !== void 0 ? _c : ''),
3522
+ messageRaw,
3523
+ messageEncoded,
3524
+ bufferToSign: Buffer.from(messageEncoded, 'hex'),
2569
3525
  });
2570
- assert_1.default(signedMessageRequest.messages, 'Unable to find messages in signedMessageRequest');
2571
- assert_1.default(signedMessageRequest.messages[0].combineSigShare, 'Unable to find combineSigShare in signedMessageRequest.messages');
2572
- assert_1.default(signedMessageRequest.messages[0].txHash, 'Unable to find txHash in signedMessageRequest.messages');
3526
+ (0, assert_1.default)(signedMessageRequest.messages, 'Unable to find messages in signedMessageRequest');
3527
+ if (this.baseCoin.getFamily() === statics_1.CoinFamily.ETH) {
3528
+ (0, assert_1.default)(signedMessageRequest.messages[0].combineSigShare, 'Unable to find combineSigShare in signedMessageRequest.messages');
3529
+ }
3530
+ (0, assert_1.default)(signedMessageRequest.messages[0].txHash, 'Unable to find txHash in signedMessageRequest.messages');
2573
3531
  return {
2574
3532
  coin: this.coin(),
2575
3533
  txHash: signedMessageRequest.messages[0].txHash,
2576
- messageRaw: (_d = params.message) === null || _d === void 0 ? void 0 : _d.messageRaw,
3534
+ signature: signedMessageRequest.messages[0].txHash,
3535
+ messageRaw,
3536
+ messageEncoded,
2577
3537
  txRequestId: signedMessageRequest.txRequestId,
2578
3538
  };
2579
3539
  }
@@ -2595,7 +3555,7 @@ class Wallet {
2595
3555
  }
2596
3556
  try {
2597
3557
  let txRequest;
2598
- assert_1.default(params.typedData, 'typedData required for typed data signing');
3558
+ (0, assert_1.default)(params.typedData, 'typedData required for typed data signing');
2599
3559
  if (!params.typedData.txRequestId) {
2600
3560
  const intentOptions = {
2601
3561
  custodianMessageId: params.custodianMessageId,
@@ -2609,7 +3569,7 @@ class Wallet {
2609
3569
  params.typedData.txRequestId = txRequest.txRequestId;
2610
3570
  }
2611
3571
  else {
2612
- txRequest = await tss_1.getTxRequest(this.bitgo, this.id(), params.typedData.txRequestId);
3572
+ txRequest = await (0, tss_1.getTxRequest)(this.bitgo, this.id(), params.typedData.txRequestId, params.reqId);
2613
3573
  }
2614
3574
  const signedTypedDataRequest = await this.tssUtils.signTxRequestForMessage({
2615
3575
  txRequest,
@@ -2619,13 +3579,15 @@ class Wallet {
2619
3579
  messageEncoded: params.typedData.typedDataEncoded.toString('hex'),
2620
3580
  bufferToSign: params.typedData.typedDataEncoded,
2621
3581
  });
2622
- assert_1.default(signedTypedDataRequest.messages, 'Unable to find messages in signedTypedDataRequest');
2623
- assert_1.default(signedTypedDataRequest.messages[0].combineSigShare, 'Unable to find combineSigShare in signedTypedDataRequest.messages');
2624
- assert_1.default(signedTypedDataRequest.messages[0].txHash, 'Unable to find txHash in signedTypedDataRequest.messages');
3582
+ (0, assert_1.default)(signedTypedDataRequest.messages, 'Unable to find messages in signedTypedDataRequest');
3583
+ (0, assert_1.default)(signedTypedDataRequest.messages[0].combineSigShare, 'Unable to find combineSigShare in signedTypedDataRequest.messages');
3584
+ (0, assert_1.default)(signedTypedDataRequest.messages[0].txHash, 'Unable to find txHash in signedTypedDataRequest.messages');
2625
3585
  return {
2626
3586
  coin: this.coin(),
2627
3587
  txHash: signedTypedDataRequest.messages[0].txHash,
3588
+ signature: signedTypedDataRequest.messages[0].txHash,
2628
3589
  messageRaw: params.typedData.typedDataRaw,
3590
+ messageEncoded: params.typedData.typedDataEncoded.toString('hex'),
2629
3591
  txRequestId: signedTypedDataRequest.txRequestId,
2630
3592
  };
2631
3593
  }
@@ -2638,29 +3600,40 @@ class Wallet {
2638
3600
  *
2639
3601
  * @param params send options
2640
3602
  */
2641
- async sendManyTss(params = {}) {
2642
- var _a, _b, _c;
2643
- const { apiVersion } = params;
2644
- const supportedTxRequestVersions = (_b = (_a = this.tssUtils) === null || _a === void 0 ? void 0 : _a.supportedTxRequestVersions()) !== null && _b !== void 0 ? _b : [];
2645
- const onlySupportsTxRequestFull = supportedTxRequestVersions.length === 1 && supportedTxRequestVersions.includes('full');
2646
- if (apiVersion === 'lite' && onlySupportsTxRequestFull) {
2647
- throw new Error('TxRequest Lite API is not supported for this wallet');
2648
- }
3603
+ async sendManyTxRequests(params = {}) {
3604
+ params.apiVersion = (0, txRequest_1.getTxRequestApiVersion)(this, params.apiVersion);
2649
3605
  const signedTransaction = (await this.prebuildAndSignTransaction(params));
2650
3606
  if (!signedTransaction.txRequestId) {
2651
3607
  throw new Error('txRequestId missing from signed transaction');
2652
3608
  }
2653
- // TODO: BG-51122 Remove conditional when moved to txRequestFull for everything
2654
- if (this._wallet.type === 'custodial') {
2655
- await this.bitgo
3609
+ if (params.apiVersion === 'full') {
3610
+ const latestTxRequest = await (0, tss_1.getTxRequest)(this.bitgo, this.id(), signedTransaction.txRequestId, params.reqId);
3611
+ const reqId = params.reqId || new utils_1.RequestTracer();
3612
+ this.bitgo.setRequestTracer(reqId);
3613
+ const transfer = await this.bitgo
2656
3614
  .post(this.bitgo.url('/wallet/' + this._wallet.id + '/txrequests/' + signedTransaction.txRequestId + '/transfers', 2))
2657
- .send();
2658
- }
2659
- // ECDSA TSS uses TxRequestFull
2660
- if (apiVersion === 'full' || onlySupportsTxRequestFull) {
2661
- return tss_1.getTxRequest(this.bitgo, this.id(), signedTransaction.txRequestId);
3615
+ .send()
3616
+ .result();
3617
+ if (latestTxRequest.state === 'pendingApproval') {
3618
+ const pendingApprovals = new pendingApproval_1.PendingApprovals(this.bitgo, this.baseCoin);
3619
+ const pendingApproval = await pendingApprovals.get({
3620
+ id: latestTxRequest.pendingApprovalId,
3621
+ });
3622
+ return {
3623
+ pendingApproval: pendingApproval.toJSON(),
3624
+ txRequest: latestTxRequest,
3625
+ };
3626
+ }
3627
+ return {
3628
+ transfer,
3629
+ txRequest: latestTxRequest,
3630
+ txid: (latestTxRequest.transactions ?? [])[0]?.signedTx?.id,
3631
+ tx: (latestTxRequest.transactions ?? [])[0]?.signedTx?.tx,
3632
+ status: transfer.state,
3633
+ };
2662
3634
  }
2663
- return (_c = this.tssUtils) === null || _c === void 0 ? void 0 : _c.sendTxRequest(signedTransaction.txRequestId);
3635
+ const reqId = params.reqId || undefined;
3636
+ return this.tssUtils?.sendTxRequest(signedTransaction.txRequestId, reqId);
2664
3637
  }
2665
3638
  /**
2666
3639
  * Send funds from a fee address to a forwarder. Only supports eth-like coins.
@@ -2678,6 +3651,21 @@ class Wallet {
2678
3651
  this._wallet = await this.bitgo.post(url).send(params).result();
2679
3652
  return this._wallet;
2680
3653
  }
3654
+ /**
3655
+ * Send funds from a fee address to a forwarder.
3656
+ *
3657
+ * @param {Object} params - parameters object
3658
+ * @param {List} params.forwarders - list of fund forwarder options
3659
+ * @returns {*}
3660
+ */
3661
+ async fundForwarders(params) {
3662
+ if (_.isUndefined(params.forwarders) || params.forwarders.length == 0) {
3663
+ throw new Error('fund forwarder options required');
3664
+ }
3665
+ const url = this.url('/fundforwarders');
3666
+ this._wallet = await this.bitgo.post(url).send(params).result();
3667
+ return this._wallet;
3668
+ }
2681
3669
  /**
2682
3670
  * Gets forwarder's balance
2683
3671
  * @param params - optional query parameters
@@ -2686,11 +3674,11 @@ class Wallet {
2686
3674
  */
2687
3675
  async getForwarderBalance(params) {
2688
3676
  const query = {};
2689
- if (params === null || params === void 0 ? void 0 : params.maximumBalance) {
2690
- query.maximumBalance = params === null || params === void 0 ? void 0 : params.maximumBalance;
3677
+ if (params?.maximumBalance) {
3678
+ query.maximumBalance = params?.maximumBalance;
2691
3679
  }
2692
- if (params === null || params === void 0 ? void 0 : params.minimumBalance) {
2693
- query.minimumBalance = params === null || params === void 0 ? void 0 : params.minimumBalance;
3680
+ if (params?.minimumBalance) {
3681
+ query.minimumBalance = params?.minimumBalance;
2694
3682
  }
2695
3683
  const url = this.url(`/forwarders/balances`);
2696
3684
  const response = await this.bitgo.get(url).query(query).result();
@@ -2708,20 +3696,125 @@ class Wallet {
2708
3696
  const url = this.bitgo.url(`/wallet/${this.id()}/challenges`, 2);
2709
3697
  return await this.bitgo.get(url).query({}).result();
2710
3698
  }
2711
- sendTransaction(params) {
3699
+ sendTransaction(params, reqId) {
2712
3700
  // extract the whitelisted params from the top level, in case
2713
3701
  // other invalid params are present that would fail encoding
2714
3702
  // and fall back to the body params
2715
- const whitelistedParams = _.pick(params, whitelistedSendParams);
2716
- return postWithCodec_1.postWithCodec(this.bitgo, this.baseCoin.url('/wallet/' + this.id() + '/tx/send'), public_types_1.TxSendBody, whitelistedParams).result();
3703
+ const whitelistedParams = this.baseCoin.preprocessBuildParams(_.pick(params, whitelistedSendParams));
3704
+ const reqTracer = reqId || new utils_1.RequestTracer();
3705
+ this.bitgo.setRequestTracer(reqTracer);
3706
+ return (0, postWithCodec_1.postWithCodec)(this.bitgo, this.baseCoin.url('/wallet/' + this.id() + '/tx/send'), t.intersection([public_types_1.TxSendBody, t.partial({ locktime: t.number })]), whitelistedParams).result();
2717
3707
  }
2718
- initiateTransaction(params) {
3708
+ initiateTransaction(params, reqId) {
2719
3709
  // extract the whitelisted params from the top level, in case
2720
3710
  // other invalid params are present that would fail encoding
2721
3711
  // and fall back to the body params
2722
- const whitelistedParams = _.pick(params, whitelistedSendParams);
2723
- return postWithCodec_1.postWithCodec(this.bitgo, this.baseCoin.url('/wallet/' + this.id() + '/tx/initiate'), public_types_1.TxSendBody, whitelistedParams).result();
3712
+ const whitelistedParams = this.baseCoin.preprocessBuildParams(_.pick(params, whitelistedSendParams));
3713
+ const reqTracer = reqId || new utils_1.RequestTracer();
3714
+ this.bitgo.setRequestTracer(reqTracer);
3715
+ return (0, postWithCodec_1.postWithCodec)(this.bitgo, this.baseCoin.url('/wallet/' + this.id() + '/tx/initiate'), public_types_1.TxSendBody, whitelistedParams).result();
3716
+ }
3717
+ /**
3718
+ * Get wallet keychains and validate passphrase if necessary
3719
+ * @param {PrebuildTransactionOptions} params - prebuild transaction options
3720
+ * @param {string} params.walletPassphrase - wallet passphrase
3721
+ * @param {string} params.reqId - request id for tracing purposes
3722
+ * @param {Function} params.customSigningFunction - custom signing function for external signing
3723
+ * @returns {Promise<Keychain[]>}
3724
+ */
3725
+ async getKeychainsAndValidatePassphrase({ customSigningFunction, walletPassphrase, reqId, }) {
3726
+ const keychains = await this.baseCoin.keychains().getKeysForSigning({ wallet: this, reqId });
3727
+ // Doing a sanity check for password here to avoid doing further work if we know it's wrong
3728
+ // we ignore this check with if customSigningFunction is provided
3729
+ // which means that the user is handling the signing in external signing mode
3730
+ if (!customSigningFunction && keychains?.[0]?.encryptedPrv && walletPassphrase) {
3731
+ if (!(0, keychain_1.decryptKeychainPrivateKey)(this.bitgo, keychains[0], walletPassphrase)) {
3732
+ const error = new Error(`unable to decrypt keychain with the given wallet passphrase`);
3733
+ error.code = 'wallet_passphrase_incorrect';
3734
+ throw error;
3735
+ }
3736
+ }
3737
+ return keychains;
3738
+ }
3739
+ /**
3740
+ * Approve token for use with a batcher contract
3741
+ * This function builds, signs, and sends a token approval transaction
3742
+ *
3743
+ * @param {string} walletPassphrase - The passphrase to be used to decrypt the user key
3744
+ * @param {string} tokenName - The name of the token to be approved
3745
+ * @returns {Promise<any>} The transaction details
3746
+ */
3747
+ async approveErc20Token(walletPassphrase, tokenName) {
3748
+ const reqId = new utils_1.RequestTracer();
3749
+ this.bitgo.setRequestTracer(reqId);
3750
+ let tokenApprovalBuild;
3751
+ try {
3752
+ const url = this.baseCoin.url(`/wallet/${this.id()}/token/approval/build`);
3753
+ tokenApprovalBuild = await this.bitgo
3754
+ .post(url)
3755
+ .send({
3756
+ tokenName: tokenName,
3757
+ })
3758
+ .result();
3759
+ }
3760
+ catch (e) {
3761
+ throw e;
3762
+ }
3763
+ const keychains = await this.getKeychainsAndValidatePassphrase({
3764
+ reqId,
3765
+ walletPassphrase,
3766
+ });
3767
+ const signingParams = {
3768
+ txPrebuild: tokenApprovalBuild,
3769
+ keychain: keychains[0],
3770
+ walletPassphrase,
3771
+ reqId,
3772
+ };
3773
+ const halfSignedTransaction = await this.signTransaction(signingParams);
3774
+ const finalTxParams = _.extend({}, halfSignedTransaction);
3775
+ return this.sendTransaction(finalTxParams, reqId);
3776
+ }
3777
+ /**
3778
+ * Build token approval transaction for ERC20 tokens
3779
+ * If walletPassphrase is provided, also signs and sends the transaction
3780
+ *
3781
+ * @param {string} tokenName - The name of the token to be approved
3782
+ * @param {string} [walletPassphrase] - Optional wallet passphrase for signing and sending
3783
+ * @returns {Promise<BuildTokenApprovalResponse | SubmitTransactionResponse>} The token approval build response or transaction details if signed
3784
+ */
3785
+ async buildErc20TokenApproval(tokenName, walletPassphrase) {
3786
+ const reqId = new utils_1.RequestTracer();
3787
+ this.bitgo.setRequestTracer(reqId);
3788
+ let tokenApprovalBuild;
3789
+ const url = this.baseCoin.url(`/wallet/${this.id()}/token/approval/build`);
3790
+ try {
3791
+ tokenApprovalBuild = await this.bitgo
3792
+ .post(url)
3793
+ .send({
3794
+ tokenName: tokenName,
3795
+ })
3796
+ .result();
3797
+ }
3798
+ catch (error) {
3799
+ throw new Error(`error building erc20 token approval tx: ${error}`);
3800
+ }
3801
+ if (!walletPassphrase) {
3802
+ return tokenApprovalBuild;
3803
+ }
3804
+ const keychains = await this.getKeychainsAndValidatePassphrase({
3805
+ reqId,
3806
+ walletPassphrase,
3807
+ });
3808
+ const signingParams = {
3809
+ txPrebuild: tokenApprovalBuild,
3810
+ keychain: keychains[0],
3811
+ walletPassphrase,
3812
+ reqId,
3813
+ };
3814
+ const halfSignedTransaction = await this.signTransaction(signingParams);
3815
+ const finalTxParams = _.extend({}, halfSignedTransaction);
3816
+ return this.sendTransaction(finalTxParams, reqId);
2724
3817
  }
2725
3818
  }
2726
3819
  exports.Wallet = Wallet;
2727
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3dhbGxldC93YWxsZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztHQUVHO0FBQ0gsb0RBQTRCO0FBQzVCLCtDQUF5QztBQUN6QywwQ0FBNEI7QUFDNUIscURBQXVDO0FBU3ZDLHdDQUEyQztBQUUzQyxrQ0FBMEM7QUFDMUMsc0NBQThFO0FBQzlFLCtEQUFpRDtBQUNqRCxpREFBa0Q7QUFFbEQsd0RBQXVFO0FBQ3ZFLDhEQUEyRDtBQUMzRCxvQ0FRa0I7QUF5RGxCLDREQUF5RDtBQUN6RCw0Q0FBeUM7QUFDekMsK0RBQTRDO0FBQzVDLDhDQUFnRDtBQUNoRCxnQ0FBc0M7QUFFdEMsaURBQWdEO0FBQ2hELCtDQUE0RDtBQUM1RCwwREFBdUQ7QUFDdkQsc0RBQWlEO0FBRWpELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBSWxELE1BQU0scUJBQXFCLEdBQUcseUJBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUV6RixJQUFZLHFCQUdYO0FBSEQsV0FBWSxxQkFBcUI7SUFDL0IsNkVBQVUsQ0FBQTtJQUNWLHVGQUFlLENBQUE7QUFDakIsQ0FBQyxFQUhXLHFCQUFxQixHQUFyQiw2QkFBcUIsS0FBckIsNkJBQXFCLFFBR2hDO0FBRUQsU0FBUywyQkFBMkIsQ0FDbEMsVUFBMEQ7SUFFMUQsSUFBSSxDQUFDLFVBQVUsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRLEVBQUU7UUFDakQsT0FBTyxLQUFLLENBQUM7S0FDZDtJQUNELE9BQVEsVUFBd0MsQ0FBQyxRQUFRLEtBQUssU0FBUyxD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QUM7SUFFTyxtQkFBbUIsQ0FBQyxNQUFrQjtRQUM1Qyw2REFBNkQ7UUFDN0QsNERBQTREO1FBQzVELG1DQUFtQztRQUNuQyxNQUFNLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFDaEUsT0FBTyw2QkFBYSxDQUNsQixJQUFJLENBQUMsS0FBSyxFQUNWLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLEdBQUcsY0FBYyxDQUFDLEVBQzFELHlCQUFVLEVBQ1YsaUJBQWlCLENBQ2xCLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDYixDQUFDO0NBQ0Y7QUE5Z0dELHdCQThnR0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICovXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBCaWdOdW1iZXIgfSBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0ICogYXMgY29tbW9uIGZyb20gJy4uLy4uL2NvbW1vbic7XG5pbXBvcnQge1xuICBJQmFzZUNvaW4sXG4gIFNpZ25lZE1lc3NhZ2UsXG4gIFNpZ25lZFRyYW5zYWN0aW9uLFxuICBTaWduZWRUcmFuc2FjdGlvblJlcXVlc3QsXG4gIFRyYW5zYWN0aW9uUHJlYnVpbGQsXG4gIFZlcmlmeUFkZHJlc3NPcHRpb25zLFxufSBmcm9tICcuLi9iYXNlQ29pbic7XG5pbXBvcnQgeyBtYWtlUmFuZG9tS2V5IH0gZnJvbSAnLi4vYml0Y29pbic7XG5pbXBvcnQgeyBCaXRHb0Jhc2UgfSBmcm9tICcuLi9iaXRnb0Jhc2UnO1xuaW1wb3J0IHsgZ2V0U2hhcmVkU2VjcmV0IH0gZnJvbSAnLi4vZWNkaCc7XG5pbXBvcnQgeyBBZGRyZXNzR2VuZXJhdGlvbkVycm9yLCBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCAqIGFzIGludGVybmFsIGZyb20gJy4uL2ludGVybmFsL2ludGVybmFsJztcbmltcG9ydCB7IGRyYXdLZXljYXJkIH0gZnJvbSAnLi4vaW50ZXJuYWwva2V5Y2FyZCc7XG5pbXBvcnQgeyBLZXljaGFpbiB9IGZyb20gJy4uL2tleWNoYWluJztcbmltcG9ydCB7IElQZW5kaW5nQXBwcm92YWwsIFBlbmRpbmdBcHByb3ZhbCB9IGZyb20gJy4uL3BlbmRpbmdBcHByb3ZhbCc7XG5pbXBvcnQgeyBUcmFkaW5nQWNjb3VudCB9IGZyb20gJy4uL3RyYWRpbmcvdHJhZGluZ0FjY291bnQnO1xuaW1wb3J0IHtcbiAgaW5mZXJBZGRyZXNzVHlwZSxcbiAgUmVxdWVzdFRyYWNlcixcbiAgVHhSZXF1ZXN0LFxuICBFZGRzYVVuc2lnbmVkVHJhbnNhY3Rpb24sXG4gIEludGVudE9wdGlvbnNGb3JNZXNzYWdlLFxuICBJbnRlbnRPcHRpb25zRm9yVHlwZWREYXRhLFxuICBSZXF1ZXN0VHlwZSxcbn0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHtcbiAgQWNjZWxlcmF0ZVRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgQWRkcmVzc2VzT3B0aW9ucyxcbiAgQnVpbGRDb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25PcHRpb25zLFxuICBCdWlsZFRva2VuRW5hYmxlbWVudE9wdGlvbnMsXG4gIENoYW5nZUZlZU9wdGlvbnMsXG4gIENvbnNvbGlkYXRlVW5zcGVudHNPcHRpb25zLFxuICBDcmVhdGVBZGRyZXNzT3B0aW9ucyxcbiAgQ3JlYXRlUG9saWN5UnVsZU9wdGlvbnMsXG4gIENyZWF0ZVNoYXJlT3B0aW9ucyxcbiAgQ3Jvc3NDaGFpblVUWE8sXG4gIERlcGxveUZvcndhcmRlcnNPcHRpb25zLFxuICBEb3dubG9hZEtleWNhcmRPcHRpb25zLFxuICBGYW5vdXRVbnNwZW50c09wdGlvbnMsXG4gIEZldGNoQ3Jvc3NDaGFpblVUWE9zT3B0aW9ucyxcbiAgRmx1c2hGb3J3YXJkZXJUb2tlbk9wdGlvbnMsXG4gIEZvcndhcmRlckJhbGFuY2UsXG4gIEZvcndhcmRlckJhbGFuY2VPcHRpb25zLFxuICBGcmVlemVPcHRpb25zLFxuICBGdW5kRm9yd2FyZGVyc09wdGlvbnMsXG4gIEdldEFkZHJlc3NPcHRpb25zLFxuICBHZXRQcnZPcHRpb25zLFxuICBHZXRUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIEdldFRyYW5zZmVyT3B0aW9ucyxcbiAgR2V0VXNlclBydk9wdGlvbnMsXG4gIElXYWxsZXQsXG4gIE1heGltdW1TcGVuZGFibGUsXG4gIE1heGltdW1TcGVuZGFibGVPcHRpb25zLFxuICBNb2RpZnlXZWJob29rT3B0aW9ucyxcbiAgUGFnaW5hdGlvbk9wdGlvbnMsXG4gIFByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgUHJlYnVpbGRUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQsXG4gIFJlY292ZXJUb2tlbk9wdGlvbnMsXG4gIFJlbW92ZVBvbGljeVJ1bGVPcHRpb25zLFxuICBSZW1vdmVVc2VyT3B0aW9ucyxcbiAgU2VuZE1hbnlPcHRpb25zLFxuICBTZW5kT3B0aW9ucyxcbiAgU2hhcmVXYWxsZXRPcHRpb25zLFxuICBTaW11bGF0ZVdlYmhvb2tPcHRpb25zLFxuICBTdWJtaXRUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFN1YldhbGxldFR5cGUsXG4gIFN3ZWVwT3B0aW9ucyxcbiAgVHJhbnNmZXJCeVNlcXVlbmNlSWRPcHRpb25zLFxuICBUcmFuc2ZlckNvbW1lbnRPcHRpb25zLFxuICBUcmFuc2ZlcnNPcHRpb25zLFxuICBVbnNwZW50c09wdGlvbnMsXG4gIFVwZGF0ZUFkZHJlc3NPcHRpb25zLFxuICBXYWxsZXRDb2luU3BlY2lmaWMsXG4gIFdhbGxldERhdGEsXG4gIFdhbGxldEVjZHNhQ2hhbGxlbmdlcyxcbiAgV2FsbGV0U2lnbk1lc3NhZ2VPcHRpb25zLFxuICBXYWxsZXRTaWduVHJhbnNhY3Rpb25PcHRpb25zLFxuICBXYWxsZXRTaWduVHlwZWREYXRhT3B0aW9ucyxcbiAgV2FsbGV0VHlwZSxcbn0gZnJvbSAnLi9pV2FsbGV0JztcbmltcG9ydCB7IFN0YWtpbmdXYWxsZXQgfSBmcm9tICcuLi9zdGFraW5nL3N0YWtpbmdXYWxsZXQnO1xuaW1wb3J0IHsgTGlnaHRuaW5nIH0gZnJvbSAnLi4vbGlnaHRuaW5nJztcbmltcG9ydCBFZGRzYVV0aWxzIGZyb20gJy4uL3V0aWxzL3Rzcy9lZGRzYSc7XG5pbXBvcnQgeyBFY2RzYVV0aWxzIH0gZnJvbSAnLi4vdXRpbHMvdHNzL2VjZHNhJztcbmltcG9ydCB7IGdldFR4UmVxdWVzdCB9IGZyb20gJy4uL3Rzcyc7XG5pbXBvcnQgeyBIYXNoIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IG9mY1Rva2VucyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgYnVpbGRQYXJhbUtleXMsIEJ1aWxkUGFyYW1zIH0gZnJvbSAnLi9CdWlsZFBhcmFtcyc7XG5pbXBvcnQgeyBwb3N0V2l0aENvZGVjIH0gZnJvbSAnLi4vdXRpbHMvcG9zdFdpdGhDb2RlYyc7XG5pbXBvcnQgeyBUeFNlbmRCb2R5IH0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5cbmNvbnN0IGRlYnVnID0gcmVxdWlyZSgnZGVidWcnKSgnYml0Z286djI6d2FsbGV0Jyk7XG5cbnR5cGUgTWFuYWdlVW5zcGVudHMgPSAnY29uc29saWRhdGUnIHwgJ2Zhbm91dCc7XG5cbmNvbnN0IHdoaXRlbGlzdGVkU2VuZFBhcmFtcyA9IFR4U2VuZEJvZHkudHlwZS50eXBlcy5mbGF0TWFwKCh0KSA9PiBPYmplY3Qua2V5cyh0LnByb3BzKSk7XG5cbmV4cG9ydCBlbnVtIE1hbmFnZVVuc3BlbnRzT3B0aW9ucyB7XG4gIEJVSUxEX09OTFksXG4gIEJVSUxEX1NJR05fU0VORCxcbn1cblxuZnVuY3Rpb24gaXNQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0KFxuICBwcmVidWlsZFR4OiBzdHJpbmcgfCBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0IHwgdW5kZWZpbmVkXG4pOiBwcmVidWlsZFR4IGlzIFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQge1xuICBpZiAoIXByZWJ1aWxkVHggfHwgdHlwZW9mIHByZWJ1aWxkVHggPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiAocHJlYnVpbGRUeCBhcyBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0KS53YWxsZXRJZCAhPT0gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgY2xhc3MgV2FsbGV0IGltcGxlbWVudHMgSVdhbGxldCB7XG4gIHB1YmxpYyByZWFkb25seSBiaXRnbzogQml0R29CYXNlO1xuICBwdWJsaWMgcmVhZG9ubHkgYmFzZUNvaW46IElCYXNlQ29pbjtcbiAgcHVibGljIF93YWxsZXQ6IFdhbGxldERhdGE7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHNzVXRpbHM6IEVjZHNhVXRpbHMgfCBFZGRzYVV0aWxzIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IF9wZXJtaXNzaW9ucz86IHN0cmluZ1tdO1xuXG4gIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIGJhc2VDb2luOiBJQmFzZUNvaW4sIHdhbGxldERhdGE6IGFueSkge1xuICAgIHRoaXMuYml0Z28gPSBiaXRnbztcbiAgICB0aGlzLmJhc2VDb2luID0gYmFzZUNvaW47XG4gICAgdGhpcy5fd2FsbGV0ID0gd2FsbGV0RGF0YTtcbiAgICBjb25zdCB1c2VySWQgPSBfLmdldChiaXRnbywgJ191c2VyLmlkJyk7XG4gICAgaWYgKF8uaXNTdHJpbmcodXNlcklkKSkge1xuICAgICAgY29uc3QgdXNlckRldGFpbHMgPSBfLmZpbmQod2FsbGV0RGF0YS51c2VycywgeyB1c2VyOiB1c2VySWQgfSk7XG4gICAgICB0aGlzLl9wZXJtaXNzaW9ucyA9IF8uZ2V0KHVzZXJEZXRhaWxzLCAncGVybWlzc2lvbnMnKTtcbiAgICB9XG4gICAgaWYgKGJhc2VDb2luPy5zdXBwb3J0c1RzcygpICYmIHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnKSB7XG4gICAgICBzd2l0Y2ggKGJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpKSB7XG4gICAgICAgIGNhc2UgJ2VjZHNhJzpcbiAgICAgICAgICB0aGlzLnRzc1V0aWxzID0gbmV3IEVjZHNhVXRpbHMoYml0Z28sIGJhc2VDb2luLCB0aGlzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZWRkc2EnOlxuICAgICAgICAgIHRoaXMudHNzVXRpbHMgPSBuZXcgRWRkc2FVdGlscyhiaXRnbywgYmFzZUNvaW4sIHRoaXMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRoaXMudHNzVXRpbHMgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgVVJMIHVzaW5nIHRoaXMgd2FsbGV0J3MgaWQgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIEJpdEdvIEFQSSBvcGVyYXRpb25zXG4gICAqIEBwYXJhbSBleHRyYSBBUEkgc3BlY2lmaWMgc3RyaW5nIHRvIGFwcGVuZCB0byB0aGUgd2FsbGV0IGlkXG4gICAqL1xuICB1cmwoZXh0cmEgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLmlkKCkgKyBleHRyYSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoaXMgd2FsbGV0J3MgaWRcbiAgICovXG4gIGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5pZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG51bWJlciBvZiBhcHByb3ZhbHMgcmVxdWlyZWQgZm9yIHNwZW5kaW5nIGZ1bmRzIGZyb20gdGhpcyB3YWxsZXRcbiAgICovXG4gIGFwcHJvdmFsc1JlcXVpcmVkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5hcHByb3ZhbHNSZXF1aXJlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgYmFsYW5jZSBvZiB0aGlzIHdhbGxldFxuICAgKi9cbiAgYmFsYW5jZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuYmFsYW5jZTtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCB1c2UgY29kZWMgaW5zdGVhZDogdC5leGFjdChCdWlsZFBhcmFtcykuZW5jb2RlKHYpICovXG4gIHByZWJ1aWxkV2hpdGVsaXN0ZWRQYXJhbXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBidWlsZFBhcmFtS2V5cztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGlzIGEgc3RyaWN0IHN1Yi1zZXQgb2YgcHJlYnVpbGRXaGl0ZWxpc3RlZFBhcmFtc1xuICAgKi9cbiAgcHJlYnVpbGRDb25zb2xpZGF0ZUFjY291bnRQYXJhbXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbXG4gICAgICAnY29uc29saWRhdGVBZGRyZXNzZXMnLFxuICAgICAgJ2ZlZVJhdGUnLFxuICAgICAgJ21heEZlZVJhdGUnLFxuICAgICAgJ21lbW8nLFxuICAgICAgJ3ZhbGlkRnJvbUJsb2NrJyxcbiAgICAgICd2YWxpZFRvQmxvY2snLFxuICAgICAgJ3ByZXZpZXcnLFxuICAgICAgJ2tlZXBBbGl2ZScsXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNvbmZpcm1lZCBiYWxhbmNlIG9mIHRoaXMgd2FsbGV0XG4gICAqL1xuICBjb25maXJtZWRCYWxhbmNlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5jb25maXJtZWRCYWxhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgc3BlbmRhYmxlIGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXRcbiAgICovXG4gIHNwZW5kYWJsZUJhbGFuY2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LnNwZW5kYWJsZUJhbGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBiYWxhbmNlIG9mIHRoaXMgd2FsbGV0XG4gICAqXG4gICAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gYmFsYW5jZXMgaGF2ZSB0aGUgcG90ZW50aWFsIHRvIG92ZXJmbG93IHN0YW5kYXJkIGphdmFzY3JpcHQgbnVtYmVyc1xuICAgKi9cbiAgYmFsYW5jZVN0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuYmFsYW5jZVN0cmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbmZpcm1lZCBiYWxhbmNlIG9mIHRoaXMgd2FsbGV0XG4gICAqXG4gICAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gYmFsYW5jZXMgaGF2ZSB0aGUgcG90ZW50aWFsIHRvIG92ZXJmbG93IHN0YW5kYXJkIGphdmFzY3JpcHQgbnVtYmVyc1xuICAgKi9cbiAgY29uZmlybWVkQmFsYW5jZVN0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuY29uZmlybWVkQmFsYW5jZVN0cmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZW5kYWJsZSBiYWxhbmNlIG9mIHRoaXMgd2FsbGV0XG4gICAqXG4gICAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gYmFsYW5jZXMgaGF2ZSB0aGUgcG90ZW50aWFsIHRvIG92ZXJmbG93IHN0YW5kYXJkIGphdmFzY3JpcHQgbnVtYmVyc1xuICAgKi9cbiAgc3BlbmRhYmxlQmFsYW5jZVN0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuc3BlbmRhYmxlQmFsYW5jZVN0cmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNvaW4gaWRlbnRpZmllciBmb3IgdGhlIHR5cGUgb2YgY29pbiB0aGlzIHdhbGxldCBob2xkc1xuICAgKi9cbiAgY29pbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuY29pbjtcbiAgfVxuXG4gIHR5cGUoKTogV2FsbGV0VHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC50eXBlO1xuICB9XG5cbiAgbXVsdGlzaWdUeXBlKCk6ICdvbmNoYWluJyB8ICd0c3MnIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZTtcbiAgfVxuXG4gIHN1YlR5cGUoKTogU3ViV2FsbGV0VHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5zdWJUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbGFiZWwgKG5hbWUpIGZvciB0aGlzIHdhbGxldFxuICAgKi9cbiAgcHVibGljIGxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5sYWJlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHB1YmxpYyBvYmplY3QgaWRzIGZvciB0aGUga2V5Y2hhaW5zIG9uIHRoaXMgd2FsbGV0LlxuICAgKi9cbiAgcHVibGljIGtleUlkcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5rZXlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHJlY2VpdmUgYWRkcmVzcyBmb3IgdGhpcyB3YWxsZXRcbiAgICovXG4gIHB1YmxpYyByZWNlaXZlQWRkcmVzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQucmVjZWl2ZUFkZHJlc3MuYWRkcmVzcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHdhbGxldCBpZCBvZiB0aGUgd2FsbGV0IHRoYXQgdGhpcyB3YWxsZXQgd2FzIG1pZ3JhdGVkIGZyb20uXG4gICAqXG4gICAqIEZvciBleGFtcGxlLCBpZiB0aGlzIGlzIGEgQkNIIHdhbGxldCB0aGF0IHdhcyBjcmVhdGVkIGZyb20gYSBCVEMgd2FsbGV0LFxuICAgKiB0aGUgQkNIIHdhbGxldCBtaWdyYXRlZCBmcm9tIGZpZWxkIHdvdWxkIGhhdmUgdGhlIEJUQyB3YWxsZXQgaWQuXG4gICAqL1xuICBwdWJsaWMgbWlncmF0ZWRGcm9tKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5taWdyYXRlZEZyb207XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSB0b2tlbiBmbHVzaCB0aHJlc2hvbGRzIGZvciB0aGlzIHdhbGxldFxuICAgKiBAcmV0dXJuIHsqfE9iamVjdH0gcGFpcnMgb2YgeyBbdG9rZW5OYW1lXTogdGhyZXNob2xkcyB9IGJhc2UgdW5pdHNcbiAgICovXG4gIHRva2VuRmx1c2hUaHJlc2hvbGRzKCk6IGFueSB7XG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgIT09ICdldGgnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgd2FsbGV0Jyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljLnRva2VuRmx1c2hUaHJlc2hvbGRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB3YWxsZXQgcHJvcGVydGllcyB3aGljaCBhcmUgc3BlY2lmaWMgdG8gY2VydGFpbiBjb2luIGltcGxlbWVudGF0aW9uc1xuICAgKi9cbiAgY29pblNwZWNpZmljKCk6IFdhbGxldENvaW5TcGVjaWZpYyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBwZW5kaW5nIGFwcHJvdmFscyBvbiB0aGlzIHdhbGxldFxuICAgKi9cbiAgcGVuZGluZ0FwcHJvdmFscygpOiBJUGVuZGluZ0FwcHJvdmFsW10ge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQucGVuZGluZ0FwcHJvdmFscy5tYXAoKGN1cnJlbnRBcHByb3ZhbCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQZW5kaW5nQXBwcm92YWwodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbiwgY3VycmVudEFwcHJvdmFsLCB0aGlzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZyZXNoIHRoZSB3YWxsZXQgb2JqZWN0IGJ5IHN5bmNpbmcgd2l0aCB0aGUgYmFjay1lbmRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7V2FsbGV0fVxuICAgKi9cbiAgYXN5bmMgcmVmcmVzaChwYXJhbXM6IFJlY29yZDxzdHJpbmcsIG5ldmVyPiA9IHt9KTogUHJvbWlzZTxXYWxsZXQ+IHtcbiAgICB0aGlzLl93YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgpKS5yZXN1bHQoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHRoZSB0cmFuc2FjdGlvbnMgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyB0cmFuc2FjdGlvbnMocGFyYW1zOiBQYWdpbmF0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBxdWVyeTogUGFnaW5hdGlvbk9wdGlvbnMgPSB7fTtcblxuICAgIGlmIChwYXJhbXMucHJldklkKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByZXZJZCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkucHJldklkID0gcGFyYW1zLnByZXZJZDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmxpbWl0KSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmxpbWl0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAuZ2V0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLl93YWxsZXQuaWQgKyAnL3R4JykpXG4gICAgICAucXVlcnkocXVlcnkpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB0aGUgdHJhbnNhY3Rpb25zIGZvciBhIGdpdmVuIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqICAtIHR4SGFzaCB0aGUgdHJhbnNhY3Rpb24gaGFzaCB0byBzZWFyY2ggZm9yXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgZ2V0VHJhbnNhY3Rpb24ocGFyYW1zOiBHZXRUcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd0eEhhc2gnXSwgW10pO1xuXG4gICAgY29uc3QgcXVlcnk6IFBhZ2luYXRpb25PcHRpb25zID0ge307XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5wcmV2SWQpKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByZXZJZCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkucHJldklkID0gcGFyYW1zLnByZXZJZDtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmxpbWl0KSkge1xuICAgICAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMubGltaXQpIHx8IHBhcmFtcy5saW1pdCA8IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxpbWl0IGFyZ3VtZW50LCBleHBlY3RpbmcgcG9zaXRpdmUgaW50ZWdlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5nZXQodGhpcy51cmwoJy90eC8nICsgcGFyYW1zLnR4SGFzaCkpXG4gICAgICAucXVlcnkocXVlcnkpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB0aGUgdHJhbnNmZXJzIGZvciBhIGdpdmVuIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgdHJhbnNmZXJzKHBhcmFtczogVHJhbnNmZXJzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBxdWVyeTogVHJhbnNmZXJzT3B0aW9ucyA9IHt9O1xuICAgIGlmIChwYXJhbXMucHJldklkKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByZXZJZCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkucHJldklkID0gcGFyYW1zLnByZXZJZDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmxpbWl0KSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmxpbWl0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuYWxsVG9rZW5zKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5hbGxUb2tlbnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhbGxUb2tlbnMgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5hbGxUb2tlbnMgPSBwYXJhbXMuYWxsVG9rZW5zO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuc2VhcmNoTGFiZWwpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMuc2VhcmNoTGFiZWwpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzZWFyY2hMYWJlbCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkuc2VhcmNoTGFiZWwgPSBwYXJhbXMuc2VhcmNoTGFiZWw7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5hZGRyZXNzKSB7XG4gICAgICBpZiAoIV8uaXNBcnJheShwYXJhbXMuYWRkcmVzcykgJiYgIV8uaXNTdHJpbmcocGFyYW1zLmFkZHJlc3MpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhZGRyZXNzIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nIG9yIGFycmF5Jyk7XG4gICAgICB9XG4gICAgICBpZiAoXy5pc0FycmF5KHBhcmFtcy5hZGRyZXNzKSkge1xuICAgICAgICBwYXJhbXMuYWRkcmVzcy5mb3JFYWNoKChhZGRyZXNzKSA9PiB7XG4gICAgICAgICAgaWYgKCFfLmlzU3RyaW5nKGFkZHJlc3MpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYWRkcmVzcyBhcmd1bWVudCwgZXhwZWN0aW5nIGFycmF5IG9mIGFkZHJlc3Mgc3RyaW5ncycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBxdWVyeS5hZGRyZXNzID0gcGFyYW1zLmFkZHJlc3M7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5kYXRlR3RlKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLmRhdGVHdGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBkYXRlR3RlIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5kYXRlR3RlID0gcGFyYW1zLmRhdGVHdGU7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5kYXRlTHQpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMuZGF0ZUx0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZGF0ZUx0IGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5kYXRlTHQgPSBwYXJhbXMuZGF0ZUx0O1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMudmFsdWVHdGUpKSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLnZhbHVlR3RlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdmFsdWVHdGUgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnZhbHVlR3RlID0gcGFyYW1zLnZhbHVlR3RlO1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMudmFsdWVMdCkpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMudmFsdWVMdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHZhbHVlTHQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnZhbHVlTHQgPSBwYXJhbXMudmFsdWVMdDtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNOaWwocGFyYW1zLmluY2x1ZGVIZXgpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5pbmNsdWRlSGV4KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5jbHVkZUhleCBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmluY2x1ZGVIZXggPSBwYXJhbXMuaW5jbHVkZUhleDtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNOaWwocGFyYW1zLnN0YXRlKSkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBhcmFtcy5zdGF0ZSkgJiYgIV8uaXNTdHJpbmcocGFyYW1zLnN0YXRlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc3RhdGUgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcgb3IgYXJyYXknKTtcbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW1zLnN0YXRlKSkge1xuICAgICAgICBwYXJhbXMuc3RhdGUuZm9yRWFjaCgoc3RhdGUpID0+IHtcbiAgICAgICAgICBpZiAoIV8uaXNTdHJpbmcoc3RhdGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc3RhdGUgYXJndW1lbnQsIGV4cGVjdGluZyBhcnJheSBvZiBzdGF0ZSBzdHJpbmdzJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnN0YXRlID0gcGFyYW1zLnN0YXRlO1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMudHlwZSkpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMudHlwZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHR5cGUgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnR5cGUgPSBwYXJhbXMudHlwZTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy90cmFuc2ZlcicpKS5xdWVyeShxdWVyeSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRyYW5zZmVycyBvbiB0aGlzIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBnZXRUcmFuc2ZlcihwYXJhbXM6IEdldFRyYW5zZmVyT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJ10sIFtdKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy90cmFuc2Zlci8nICsgcGFyYW1zLmlkKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgdHJhbnNhY3Rpb24gYnkgc2VxdWVuY2UgaWQgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIHRyYW5zZmVyQnlTZXF1ZW5jZUlkKHBhcmFtczogVHJhbnNmZXJCeVNlcXVlbmNlSWRPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnc2VxdWVuY2VJZCddLCBbXSk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvdHJhbnNmZXIvc2VxdWVuY2VJZC8nICsgcGFyYW1zLnNlcXVlbmNlSWQpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG1heGltdW0gYW1vdW50IHlvdSBjYW4gc3BlbmQgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubGltaXQgLSBtYXhpbXVtIG51bWJlciBvZiBzZWxlY3RhYmxlIHVuc3BlbnRzXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWluVmFsdWUgLSB0aGUgbWluaW11bSB2YWx1ZSBvZiB1bnNwZW50cyB0byB1c2UgaW4gc2F0b3NoaXNcbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5tYXhWYWx1ZSAtIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHVuc3BlbnRzIHRvIHVzZSBpbiBzYXRvc2hpc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkhlaWdodCAtIHRoZSBtaW5pbXVtIGhlaWdodCBvZiB1bnNwZW50cyBvbiB0aGUgYmxvY2sgY2hhaW4gdG8gdXNlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluQ29uZmlybXMgLSBhbGwgc2VsZWN0ZWQgdW5zcGVudHMgd2lsbCBoYXZlIGF0IGxlYXN0IHRoaXMgbWFueSBjb25maXJtYXRpb25zXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmVuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZSAtIEVuZm9yY2VzIG1pbkNvbmZpcm1zIG9uIGNoYW5nZSBpbnB1dHNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVSYXRlIC0gZmVlIHJhdGUgdG8gdXNlIGluIGNhbGN1bGF0aW9uIG9mIG1heGltdW0gc3BlbmRhYmxlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUmF0ZSAtIHVwcGVyIGxpbWl0IGZvciBmZWVSYXRlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMucmVjaXBpZW50QWRkcmVzcyAtIHJlY2lwaWVudCBhZGRyZXNzZXMgZm9yIGEgbW9yZSBhY2N1cmF0ZSBjYWxjdWxhdGlvbiBvZiB0aGUgbWF4aW11bSBhdmFpbGFibGUgdG8gc2VuZFxuICAgKiBAcmV0dXJucyB7e21heGltdW1TcGVuZGFibGU6IE51bWJlciwgY29pbjogU3RyaW5nfX1cbiAgICogTk9URSA6IGZlZVR4Q29uZmlybVRhcmdldCBvbWl0dGVkIG9uIHB1cnBvc2UgYmVjYXVzZSBnYXVnaW5nIHRoZSBtYXhpbXVtIHNwZW5kYWJsZSBhbW91bnQgd2l0aCBkeW5hbWljIGZlZXMgZG9lcyBub3QgbWFrZSBzZW5zZVxuICAgKi9cbiAgYXN5bmMgbWF4aW11bVNwZW5kYWJsZShwYXJhbXM6IE1heGltdW1TcGVuZGFibGVPcHRpb25zID0ge30pOiBQcm9taXNlPE1heGltdW1TcGVuZGFibGU+IHtcbiAgICBjb25zdCBmaWx0ZXJlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFtcbiAgICAgICdlbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UnLFxuICAgICAgJ2ZlZVJhdGUnLFxuICAgICAgJ2xpbWl0JyxcbiAgICAgICdtYXhGZWVSYXRlJyxcbiAgICAgICdtYXhWYWx1ZScsXG4gICAgICAnbWluQ29uZmlybXMnLFxuICAgICAgJ21pbkhlaWdodCcsXG4gICAgICAnbWluVmFsdWUnLFxuICAgICAgJ3BsYWluVGFyZ2V0JyxcbiAgICAgICdyZWNpcGllbnRBZGRyZXNzJyxcbiAgICAgICd0YXJnZXQnLFxuICAgIF0pO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvbWF4aW11bVNwZW5kYWJsZScpKS5xdWVyeShmaWx0ZXJlZFBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB0aGUgdW5zcGVudHMgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyB1bnNwZW50cyhwYXJhbXM6IFVuc3BlbnRzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBxdWVyeSA9IF8ucGljayhwYXJhbXMsIFtcbiAgICAgICdjaGFpbnMnLFxuICAgICAgJ2xpbWl0JyxcbiAgICAgICdtYXhWYWx1ZScsXG4gICAgICAnbWluQ29uZmlybXMnLFxuICAgICAgJ21pbkhlaWdodCcsXG4gICAgICAnbWluVmFsdWUnLFxuICAgICAgJ3ByZXZJZCcsXG4gICAgICAnc2Vnd2l0JyxcbiAgICAgICd0YXJnZXQnLFxuICAgIF0pO1xuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvdW5zcGVudHMnKSkucXVlcnkocXVlcnkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnNvbGlkYXRlIG9yIGZhbm91dCB1bnNwZW50cyBvbiBhIHdhbGxldFxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcm91dGVOYW1lIC0gZWl0aGVyIGBjb25zb2xpZGF0ZWAgb3IgYGZhbm91dGBcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqXG4gICAqIFdhbGxldCBwYXJhbWV0ZXJzOlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgLSB0aGUgdXNlcnMgd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy54cHJ2IC0gdGhlIHByaXZhdGUga2V5IGluIHN0cmluZyBmb3JtIGlmIHRoZSB3YWxsZXRQYXNzcGhyYXNlIGlzIG5vdCBhdmFpbGFibGVcbiAgICpcbiAgICogRmVlIHBhcmFtZXRlcnM6XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlUmF0ZSAtIFRoZSBmZWUgcmF0ZSB0byB1c2UgZm9yIHRoZSBjb25zb2xpZGF0aW9uIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUmF0ZSAtIHVwcGVyIGxpbWl0IGZvciBmZWVSYXRlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUGVyY2VudGFnZSAtIHRoZSBtYXhpbXVtIHJlbGF0aXZlIHBvcnRpb24gdGhhdCB5b3UncmUgd2lsbGluZyB0byBzcGVuZCB0b3dhcmRzIGZlZXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVUeENvbmZpcm1UYXJnZXQgLSBlc3RpbWF0ZSB0aGUgZmVlcyB0byBhaW0gZm9yIGZpcnN0IGNvbmZpcm1hdGlvbiB3aXRoIHRoaXMgbnVtYmVyIG9mIGJsb2Nrc1xuICAgKlxuICAgKiBJbnB1dCBwYXJhbWV0ZXJzOlxuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1pblZhbHVlIC0gdGhlIG1pbmltdW0gdmFsdWUgb2YgdW5zcGVudHMgdG8gdXNlIGluIHNhdG9zaGlzXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWF4VmFsdWUgLSB0aGUgbWF4aW11bSB2YWx1ZSBvZiB1bnNwZW50cyB0byB1c2UgaW4gc2F0b3NoaXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5IZWlnaHQgLSB0aGUgbWluaW11bSBoZWlnaHQgb2YgdW5zcGVudHMgb24gdGhlIGJsb2NrIGNoYWluIHRvIHVzZVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gYWxsIHNlbGVjdGVkIHVuc3BlbnRzIHdpbGwgaGF2ZSBhdCBsZWFzdCB0aGlzIG1hbnkgY29uZmlybWF0aW9uc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5lbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UgLSBpZiB0cnVlLCBtaW5Db25maXJtcyBhbHNvIGFwcGxpZXMgdG8gY2hhbmdlIG91dHB1dHNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5saW1pdCAgICAgICAgICAgICAgICBmb3Igcm91dGVOYW1lID09PSAnY29uc29saWRhdGUnXG4gICAqICAgICAgICAgICAgICAgICBwYXJhbXMubWF4TnVtSW5wdXRzVG9Vc2UgICAgZm9yIHJvdXRlTmFtZSA9PT0gJ2Zhbm91dCdcbiAgICogICAgICAgICAgICAgICAgICAtIG1heGltdW0gbnVtYmVyIG9mIHVuc3BlbnRzIHlvdSB3YW50IHRvIHVzZSBpbiB0aGUgdHJhbnNhY3Rpb25cbiAgICogT3V0cHV0IHBhcmFtZXRlcnM6XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubnVtVW5zcGVudHNUb01ha2UgLSB0aGUgbnVtYmVyIG9mIG5ldyB1bnNwZW50cyB0byBtYWtlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmJ1bGsgLSBpZiBzZXQgdG8gVHJ1ZSwgdGhpcyBlbmFibGVzIHRoZSBjb25zb2xpZGF0aW9uIG9mIGxhcmdlIG51bWJlciBvZiB1bnNwZW50cyBieSBjcmVhdGluZyBtdWx0aXBsZSB0cmFuc2FjdGlvbnMsXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGVhY2ggdHJhbnNhY3Rpb24gY29tcG9zZWQgb2YgMjAwIHVuc3BlbnRzLCBleGNlcHQgZm9yIHRoZSBsYXN0IHRyYW5zYWN0aW9uIHdoaWNoIG1heSBoYXZlIGZld2VyIHVuc3BlbnRzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBtYW5hZ2VVbnNwZW50cyhcbiAgICByb3V0ZU5hbWU6IE1hbmFnZVVuc3BlbnRzLFxuICAgIHBhcmFtczogQ29uc29saWRhdGVVbnNwZW50c09wdGlvbnMgfCBGYW5vdXRVbnNwZW50c09wdGlvbnMgPSB7fSxcbiAgICBvcHRpb24gPSBNYW5hZ2VVbnNwZW50c09wdGlvbnMuQlVJTERfU0lHTl9TRU5EXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ3dhbGxldFBhc3NwaHJhc2UnLCAneHBydiddKTtcblxuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICBjb25zdCBmaWx0ZXJlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFtcbiAgICAgICdmZWVSYXRlJyxcbiAgICAgICdtYXhGZWVSYXRlJyxcbiAgICAgICdtYXhGZWVQZXJjZW50YWdlJyxcbiAgICAgICdmZWVUeENvbmZpcm1UYXJnZXQnLFxuXG4gICAgICAnbWluVmFsdWUnLFxuICAgICAgJ21heFZhbHVlJyxcbiAgICAgICdtaW5IZWlnaHQnLFxuICAgICAgJ21pbkNvbmZpcm1zJyxcbiAgICAgICdlbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UnLFxuICAgICAgJ3RhcmdldEFkZHJlc3MnLFxuICAgICAgJ3R4Rm9ybWF0JyxcbiAgICAgICdidWxrJyxcblxuICAgICAgcm91dGVOYW1lID09PSAnY29uc29saWRhdGUnID8gJ2xpbWl0JyA6ICdtYXhOdW1JbnB1dHNUb1VzZScsXG4gICAgICAnbnVtVW5zcGVudHNUb01ha2UnLFxuICAgIF0pO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG5cbiAgICBjb25zdCBidWlsZFJlc3BvbnNlOiBUcmFuc2FjdGlvblByZWJ1aWxkIHwgVHJhbnNhY3Rpb25QcmVidWlsZFtdID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy51cmwoYC8ke3JvdXRlTmFtZX1VbnNwZW50c2ApKVxuICAgICAgLnNlbmQoZmlsdGVyZWRQYXJhbXMpXG4gICAgICAucmVzdWx0KCk7XG5cbiAgICBpZiAob3B0aW9uID09PSBNYW5hZ2VVbnNwZW50c09wdGlvbnMuQlVJTERfT05MWSkge1xuICAgICAgcmV0dXJuIGJ1aWxkUmVzcG9uc2U7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gKGF3YWl0IHRoaXMuYmFzZUNvaW5cbiAgICAgIC5rZXljaGFpbnMoKVxuICAgICAgLmdldEtleXNGb3JTaWduaW5nKHsgd2FsbGV0OiB0aGlzLCByZXFJZCB9KSkgYXMgdW5rbm93biBhcyBLZXljaGFpbltdO1xuXG4gICAgY29uc3QgdHJhbnNhY3Rpb25QYXJhbXMgPSB7XG4gICAgICAuLi5wYXJhbXMsXG4gICAgICBrZXljaGFpbjoga2V5Y2hhaW5zWzBdLFxuICAgICAgcHViczoga2V5Y2hhaW5zLm1hcCgoaykgPT4ge1xuICAgICAgICBhc3NlcnQoay5wdWIpO1xuICAgICAgICByZXR1cm4gay5wdWI7XG4gICAgICB9KSxcbiAgICB9O1xuXG4gICAgY29uc3QgdHhQcmVidWlsZHMgPSBBcnJheS5pc0FycmF5KGJ1aWxkUmVzcG9uc2UpID8gYnVpbGRSZXNwb25zZSA6IFtidWlsZFJlc3BvbnNlXTtcblxuICAgIGNvbnN0IHNlbGVjdFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFsnY29tbWVudCcsICdvdHAnLCAnYnVsayddKTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICB0eFByZWJ1aWxkcy5tYXAoYXN5bmMgKHR4UHJlYnVpbGQpID0+IHtcbiAgICAgICAgY29uc3Qgc2lnbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCB0aGlzLnNpZ25UcmFuc2FjdGlvbih7IC4uLnRyYW5zYWN0aW9uUGFyYW1zLCB0eFByZWJ1aWxkIH0pO1xuICAgICAgICBjb25zdCBmaW5hbFR4UGFyYW1zID0gXy5leHRlbmQoe30sIHNpZ25lZFRyYW5zYWN0aW9uLCBzZWxlY3RQYXJhbXMsIHsgdHlwZTogcm91dGVOYW1lIH0pO1xuICAgICAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kVHJhbnNhY3Rpb24oZmluYWxUeFBhcmFtcyk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShidWlsZFJlc3BvbnNlKSA/IHJlc3BvbnNlIDogcmVzcG9uc2VbMF07XG4gIH1cblxuICAvKipcbiAgICogQ29uc29saWRhdGUgdW5zcGVudHMgb24gYSB3YWxsZXRcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIHRoZSB1c2VycyB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnhwcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0gaWYgdGhlIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVJhdGUgLSBUaGUgZmVlIHJhdGUgdG8gdXNlIGZvciB0aGUgY29uc29saWRhdGlvbiBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVJhdGUgLSB1cHBlciBsaW1pdCBmb3IgZmVlUmF0ZSBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVBlcmNlbnRhZ2UgLSB0aGUgbWF4aW11bSByZWxhdGl2ZSBwb3J0aW9uIHRoYXQgeW91J3JlIHdpbGxpbmcgdG8gc3BlbmQgdG93YXJkcyBmZWVzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlVHhDb25maXJtVGFyZ2V0IC0gZXN0aW1hdGUgdGhlIGZlZXMgdG8gYWltIGZvciBmaXJzdCBjb25maXJtYXRpb24gd2l0aCB0aGlzIG51bWJlciBvZiBibG9ja3NcbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5taW5WYWx1ZSAtIHRoZSBtaW5pbXVtIHZhbHVlIG9mIHVuc3BlbnRzIHRvIHVzZSBpbiBzYXRvc2hpc1xuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1heFZhbHVlIC0gdGhlIG1heGltdW0gdmFsdWUgb2YgdW5zcGVudHMgdG8gdXNlIGluIHNhdG9zaGlzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluSGVpZ2h0IC0gdGhlIG1pbmltdW0gaGVpZ2h0IG9mIHVuc3BlbnRzIG9uIHRoZSBibG9jayBjaGFpbiB0byB1c2VcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5Db25maXJtcyAtIGFsbCBzZWxlY3RlZCB1bnNwZW50cyB3aWxsIGhhdmUgYXQgbGVhc3QgdGhpcyBtYW55IGNvbmZpcm1hdGlvbnNcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlIC0gaWYgdHJ1ZSwgbWluQ29uZmlybXMgYWxzbyBhcHBsaWVzIHRvIGNoYW5nZSBvdXRwdXRzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubGltaXQgICAgICAgICAgICAgICAgZm9yIHJvdXRlTmFtZSA9PT0gJ2NvbnNvbGlkYXRlJ1xuICAgKiAgICAgICAgICAgICAgICAgcGFyYW1zLm1heE51bUlucHV0c1RvVXNlICAgIGZvciByb3V0ZU5hbWUgPT09ICdmYW5vdXQnXG4gICAqICAgICAgICAgICAgICAgICAgLSBtYXhpbXVtIG51bWJlciBvZiB1bnNwZW50cyB5b3Ugd2FudCB0byB1c2UgaW4gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubnVtVW5zcGVudHNUb01ha2UgLSB0aGUgbnVtYmVyIG9mIG5ldyB1bnNwZW50cyB0byBtYWtlLiBJdCBpcyBub3QgYXBwbGljYWJsZSBmb3IgaWYgYnVsayBjb25zb2xpZGF0ZS5cbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuYnVsayAtIGlmIHNldCB0byBUcnVlLCB0aGlzIGVuYWJsZXMgdGhlIGNvbnNvbGlkYXRpb24gb2YgbGFyZ2UgbnVtYmVyIG9mIHVuc3BlbnRzIGJ5IGNyZWF0aW5nIG11bHRpcGxlIHRyYW5zYWN0aW9ucyxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggZWFjaCB0cmFuc2FjdGlvbiBjb21wb3NlZCBvZiAyMDAgdW5zcGVudHMsIGV4Y2VwdCBmb3IgdGhlIGxhc3QgdHJhbnNhY3Rpb24gd2hpY2ggbWF5IGhhdmUgZmV3ZXIgdW5zcGVudHMuXG4gICAqL1xuICBhc3luYyBjb25zb2xpZGF0ZVVuc3BlbnRzKFxuICAgIHBhcmFtczogQ29uc29saWRhdGVVbnNwZW50c09wdGlvbnMgPSB7fSxcbiAgICBvcHRpb24gPSBNYW5hZ2VVbnNwZW50c09wdGlvbnMuQlVJTERfU0lHTl9TRU5EXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLm1hbmFnZVVuc3BlbnRzKCdjb25zb2xpZGF0ZScsIHBhcmFtcywgb3B0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYW5vdXQgdW5zcGVudHMgb24gYSB3YWxsZXRcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIHRoZSB1c2VycyB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnhwcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0gaWYgdGhlIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1pblZhbHVlIC0gdGhlIG1pbmltdW0gdmFsdWUgb2YgdW5zcGVudHMgdG8gdXNlXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWF4VmFsdWUgLSB0aGUgbWF4aW11bSB2YWx1ZSBvZiB1bnNwZW50cyB0byB1c2VcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5IZWlnaHQgLSB0aGUgbWluaW11bSBoZWlnaHQgb2YgdW5zcGVudHMgb24gdGhlIGJsb2NrIGNoYWluIHRvIHVzZVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gYWxsIHNlbGVjdGVkIHVuc3BlbnRzIHdpbGwgaGF2ZSBhdCBsZWFzdCB0aGlzIG1hbnkgY29uZmlybWF0aW9uc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVBlcmNlbnRhZ2UgLSB0aGUgbWF4aW11bSBwcm9wb3J0aW9uIG9mIGFuIHVuc3BlbnQgeW91IGFyZSB3aWxsaW5nIHRvIGxvc2UgdG8gZmVlc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVR4Q29uZmlybVRhcmdldCAtIGVzdGltYXRlIHRoZSBmZWVzIHRvIGFpbSBmb3IgZmlyc3QgY29uZmlybWF0aW9uIHdpdGggdGhpcyBudW1iZXIgb2YgYmxvY2tzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlUmF0ZSAtIFRoZSBkZXNpcmVkIGZlZSByYXRlIGZvciB0aGUgdHJhbnNhY3Rpb24gaW4gc2F0b3NoaXMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhGZWVSYXRlIC0gVGhlIG1heCBsaW1pdCBmb3IgYSBmZWUgcmF0ZSBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heE51bUlucHV0c1RvVXNlIC0gdGhlIG51bWJlciBvZiB1bnNwZW50cyB5b3Ugd2FudCB0byB1c2UgaW4gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubnVtVW5zcGVudHNUb01ha2UgLSB0aGUgbnVtYmVyIG9mIG5ldyB1bnNwZW50cyB0byBtYWtlXG4gICAqL1xuICBhc3luYyBmYW5vdXRVbnNwZW50cyhwYXJhbXM6IEZhbm91dFVuc3BlbnRzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMubWFuYWdlVW5zcGVudHMoJ2Zhbm91dCcsIHBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB0b2tlbiBmbHVzaCB0aHJlc2hvbGRzIGZvciB0aGUgd2FsbGV0LiBVcGRhdGVzIHRoZSB3YWxsZXQuXG4gICAqIFRva2VucyB3aWxsIG9ubHkgYmUgZmx1c2hlZCBmcm9tIGZvcndhcmRlciBjb250cmFjdHMgaWYgdGhlIGJhbGFuY2UgaXMgZ3JlYXRlciB0aGFuIHRoZSB0aHJlc2hvbGQgZGVmaW5lZCBoZXJlLlxuICAgKiBAcGFyYW0gdGhyZXNob2xkcyB7T2JqZWN0fSAtIHBhaXJzIG9mIHsgW3Rva2VuTmFtZV06IHRocmVzaG9sZCB9IChiYXNlIHVuaXRzKVxuICAgKi9cbiAgYXN5bmMgdXBkYXRlVG9rZW5GbHVzaFRocmVzaG9sZHModGhyZXNob2xkczogYW55ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpICE9PSAnZXRoJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdub3Qgc3VwcG9ydGVkIGZvciB0aGlzIHdhbGxldCcpO1xuICAgIH1cblxuICAgIHRoaXMuX3dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wdXQodGhpcy51cmwoKSlcbiAgICAgIC5zZW5kKHtcbiAgICAgICAgdG9rZW5GbHVzaFRocmVzaG9sZHM6IHRocmVzaG9sZHMsXG4gICAgICB9KVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG4gIC8qKlxuICAgICAgKiBVcGRhdGVzIHRoZSB3YWxsZXQuIFNldHMgZmxhZ3MgZm9yIGRlcGxveUZvcndhcmRlcnNNYW51YWxseSBhbmQgZmx1c2hGb3J3YXJkZXJzTWFudWFsbHkgb2YgdGhlIHdhbGxldC5cbiAgICAgICogQHBhcmFtIGZvcndhcmRlckZsYWdzIHtPYmplY3R9IC0ge1xuICAgICAgICBcImNvaW5TcGVjaWZpY1wiOiB7XG4gICAgICAgICAgW2NvaW5OYW1lXToge1xuICAgICAgICAgICAgXCJkZXBsb3lGb3J3YXJkZXJzTWFudWFsbHlcIjoge0Jvb2xlYW59LFxuICAgICAgICAgICAgXCJmbHVzaEZvcndhcmRlcnNNYW51YWxseVwiOiB7Qm9vbGVhbn1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgICovXG4gIGFzeW5jIHVwZGF0ZUZvcndhcmRlcnMoZm9yd2FyZGVyRmxhZ3M6IGFueSA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAodGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSAhPT0gJ2V0aCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm90IHN1cHBvcnRlZCBmb3IgdGhpcyB3YWxsZXQnKTtcbiAgICB9XG4gICAgdGhpcy5fd2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wdXQodGhpcy51cmwoKSkuc2VuZChmb3J3YXJkZXJGbGFncykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogVG8gbWFudWFsbHkgZGVwbG95IGFuIEVUSCBhZGRyZXNzXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBwYXJhbWV0ZXJzIG9iamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gW3BhcmFtcy5hZGRyZXNzXSAtIGFkZHJlc3NJZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gW3BhcmFtcy5pZF0gLSBhZGRyZXNzSWQgY291bGQgYmUgcmVjZWl2ZWQgYWxzbyBhcyBpZFxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBIdHRwIHJlc3BvbnNlXG4gICAqL1xuICBhc3luYyBkZXBsb3lGb3J3YXJkZXJzKHBhcmFtczogRGVwbG95Rm9yd2FyZGVyc09wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5hZGRyZXNzKSAmJiBfLmlzVW5kZWZpbmVkKHBhcmFtcy5pZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYWRkcmVzcyBvciBpZCBvZiBhZGRyZXNzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGxldCBxdWVyeTtcbiAgICBpZiAocGFyYW1zLmFkZHJlc3MpIHtcbiAgICAgIHF1ZXJ5ID0gcGFyYW1zLmFkZHJlc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXJ5ID0gcGFyYW1zLmlkO1xuICAgIH1cbiAgICBjb25zdCB1cmwgPSB0aGlzLnVybChgL2FkZHJlc3MvJHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfS9kZXBsb3ltZW50YCk7XG4gICAgdGhpcy5fd2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHVybCkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQ7XG4gIH1cblxuICAvKipcbiAgICogVG8gbWFudWFsbHkgZm9yd2FyZCB0b2tlbnMgZnJvbSBhbiBFVEggb3IgQ0VMTyBhZGRyZXNzXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBwYXJhbWV0ZXJzIG9iamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnRva2VuTmFtZSAtIE5hbWUgb2YgdG9rZW4gdGhhdCBuZWVkcyB0byBiZSBmb3J3YXJkZWQgZnJvbSB0aGUgYWRkcmVzc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gW3BhcmFtcy5hZGRyZXNzXSAtXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyYW1zLmFkZHJlc3NdIC0gYWRkcmVzc0lkXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyYW1zLmlkXSAtIGFkZHJlc3NJZCBjb3VsZCBiZSByZWNlaXZlZCBhbHNvIGFzIGlkXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyYW1zLmdhc1ByaWNlXSAtIEV4cGxpY2l0IGdhcyBwcmljZSB0byB1c2Ugd2hlbiBmb3J3YXJkaW5nIHRva2VuIGZyb20gdGhlIGZvcndhcmRlciBjb250cmFjdCAoRVRIIGFuZCBDZWxvIG9ubHkpLiBJZiBub3QgZ2l2ZW4sIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGVzdGltYXRlZCBuZXR3b3JrIGdhcyBwcmljZS5cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMuZWlwMTU1OV0gLSBTcGVjaWZ5IGVpcDE1NTkgZmVlIHBhcmFtZXRlcnMgaW4gdG9rZW4gZm9yd2FyZGluZyB0cmFuc2FjdGlvbi5cbiAgICogQHJldHVybnMge09iamVjdH0gSHR0cCByZXNwb25zZVxuICAgKi9cbiAgYXN5bmMgZmx1c2hGb3J3YXJkZXJUb2tlbihwYXJhbXM6IEZsdXNoRm9yd2FyZGVyVG9rZW5PcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuYWRkcmVzcykgJiYgXy5pc1VuZGVmaW5lZChwYXJhbXMuaWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FkZHJlc3Mgb3IgaWQgb2YgYWRkcmVzcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICBsZXQgcXVlcnk7XG4gICAgaWYgKHBhcmFtcy5hZGRyZXNzKSB7XG4gICAgICBxdWVyeSA9IHBhcmFtcy5hZGRyZXNzO1xuICAgIH0gZWxzZSB7XG4gICAgICBxdWVyeSA9IHBhcmFtcy5pZDtcbiAgICB9XG4gICAgY29uc3QgdXJsID0gdGhpcy51cmwoYC9hZGRyZXNzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5KX0vdG9rZW5mb3J3YXJkYCk7XG4gICAgdGhpcy5fd2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHVybCkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQ7XG4gIH1cblxuICAvKipcbiAgICogU3dlZXAgZnVuZHMgZm9yIGEgd2FsbGV0XG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBwYXJhbWV0ZXJzIG9iamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmFkZHJlc3MgLSBUaGUgYWRkcmVzcyB0byBzZW5kIGFsbCB0aGUgZnVuZHMgaW4gdGhlIHdhbGxldCB0b1xuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgLSB0aGUgdXNlcnMgd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy54cHJ2IC0gdGhlIHByaXZhdGUga2V5IGluIHN0cmluZyBmb3JtIGlmIHRoZSB3YWxsZXRQYXNzcGhyYXNlIGlzIG5vdCBhdmFpbGFibGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5vdHAgLSBUd28gZmFjdG9yIGF1dGggY29kZSB0byBlbmFibGUgc2VuZGluZyB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVUeENvbmZpcm1UYXJnZXQgLSBFc3RpbWF0ZSB0aGUgZmVlcyB0byBhaW0gZm9yIGZpcnN0IGNvbmZpcm1hdGlvbiB3aXRoaW4gdGhpcyBudW1iZXIgb2YgYmxvY2tzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlUmF0ZSAtIFRoZSBkZXNpcmVkIGZlZSByYXRlIGZvciB0aGUgdHJhbnNhY3Rpb24gaW4gc2F0b3NoaXMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtwYXJhbXMubWF4RmVlUmF0ZV0gLSB1cHBlciBsaW1pdCBmb3IgZmVlUmF0ZSBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtwYXJhbXMuYWxsb3dQYXJ0aWFsU3dlZXBdIC0gYWxsb3dzIHN3ZWVwaW5nIDIwMCB1bnNwZW50cyB3aGVuIHRoZSB3YWxsZXQgaGFzIG1vcmUgdGhhbiB0aGF0XG4gICAqIEByZXR1cm5zIHR4SGV4IHtTdHJpbmd9IHRoZSB0eEhleCBvZiB0aGUgc2lnbmVkIHRyYW5zYWN0aW9uXG4gICAqL1xuICBhc3luYyBzd2VlcChwYXJhbXM6IFN3ZWVwT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydhZGRyZXNzJ10sIFsnd2FsbGV0UGFzc3BocmFzZScsICd4cHJ2JywgJ290cCddKTtcblxuICAgIC8vIFRoZSBzd2VlcCBBUEkgZW5kcG9pbnQgaXMgb25seSBhdmFpbGFibGUgdG8gdXR4by1iYXNlZCBjb2luc1xuXG4gICAgaWYgKCF0aGlzLmJhc2VDb2luLnN3ZWVwV2l0aFNlbmRNYW55KCkpIHtcbiAgICAgIGlmICh0aGlzLmNvbmZpcm1lZEJhbGFuY2VTdHJpbmcoKSAhPT0gdGhpcy5iYWxhbmNlU3RyaW5nKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdjYW5ub3Qgc3dlZXAgd2hlbiB1bmNvbmZpcm1lZCBmdW5kcyBleGlzdCBvbiB0aGUgd2FsbGV0LCBwbGVhc2Ugd2FpdCB1bnRpbCBhbGwgaW5ib3VuZCB0cmFuc2FjdGlvbnMgY29uZmlybSdcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnNwZW5kYWJsZUJhbGFuY2VTdHJpbmcoKTtcbiAgICAgIGlmIChfLmlzVW5kZWZpbmVkKHZhbHVlKSB8fCB2YWx1ZSA9PT0gJzAnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbm8gZnVuZHMgdG8gc3dlZXAnKTtcbiAgICAgIH1cbiAgICAgIChwYXJhbXMgYXMgYW55KS5yZWNpcGllbnRzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogcGFyYW1zLmFkZHJlc3MsXG4gICAgICAgICAgYW1vdW50OiB2YWx1ZSxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIHJldHVybiB0aGlzLnNlbmRNYW55KHBhcmFtcyk7XG4gICAgfVxuICAgIC8vIHRoZSBmb2xsb3dpbmcgZmxvdyB3b3JrcyBmb3IgYWxsIFVUWE8gY29pbnNcblxuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICBjb25zdCBmaWx0ZXJlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFtcbiAgICAgICdhZGRyZXNzJyxcbiAgICAgICdmZWVSYXRlJyxcbiAgICAgICdtYXhGZWVSYXRlJyxcbiAgICAgICdmZWVUeENvbmZpcm1UYXJnZXQnLFxuICAgICAgJ2FsbG93UGFydGlhbFN3ZWVwJyxcbiAgICBdKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMudXJsKCcvc3dlZXBXYWxsZXQnKSkuc2VuZChmaWx0ZXJlZFBhcmFtcykucmVzdWx0KCk7XG5cbiAgICAvLyBUT0RPKEJHLTM1ODgpOiBhZGQgdHhIZXggdmFsaWRhdGlvbiB0byBwcm90ZWN0IG1hbiBpbiB0aGUgbWlkZGxlIGF0dGFja3MgcmVwbGFjaW5nIHRoZSB0eEhleFxuXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gKGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0S2V5c0ZvclNpZ25pbmcoeyB3YWxsZXQ6IHRoaXMsIHJlcUlkIH0pKSBhcyBhbnk7XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvblBhcmFtcyA9IHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHR4UHJlYnVpbGQ6IHJlc3BvbnNlLFxuICAgICAga2V5Y2hhaW46IGtleWNoYWluc1swXSxcbiAgICAgIHVzZXJLZXljaGFpbjoga2V5Y2hhaW5zWzBdLFxuICAgICAgYmFja3VwS2V5Y2hhaW46IGtleWNoYWlucy5sZW5ndGggPiAxID8ga2V5Y2hhaW5zWzFdIDogbnVsbCxcbiAgICAgIGJpdGdvS2V5Y2hhaW46IGtleWNoYWlucy5sZW5ndGggPiAyID8ga2V5Y2hhaW5zWzJdIDogbnVsbCxcbiAgICAgIHBydjogcGFyYW1zLnhwcnYsXG4gICAgfTtcbiAgICBjb25zdCBzaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMuc2lnblRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uUGFyYW1zKTtcblxuICAgIGNvbnN0IHNlbGVjdFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFsnb3RwJ10pO1xuICAgIGNvbnN0IGZpbmFsVHhQYXJhbXMgPSBfLmV4dGVuZCh7fSwgc2lnbmVkVHJhbnNhY3Rpb24sIHNlbGVjdFBhcmFtcyk7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcbiAgICByZXR1cm4gdGhpcy5zZW5kVHJhbnNhY3Rpb24oZmluYWxUeFBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogRnJlZXplIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBmcmVlemUocGFyYW1zOiBGcmVlemVPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSk7XG5cbiAgICBpZiAocGFyYW1zLmR1cmF0aW9uKSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmR1cmF0aW9uKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZHVyYXRpb246IHNob3VsZCBiZSBudW1iZXIgb2Ygc2Vjb25kcycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9mcmVlemUnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBjb21tZW50IG9mIGEgdHJhbnNmZXJcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHRyYW5zZmVyQ29tbWVudChwYXJhbXM6IFRyYW5zZmVyQ29tbWVudE9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCddLCBbJ2NvbW1lbnQnXSk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuX3dhbGxldC5pZCArICcvdHJhbnNmZXIvJyArIHBhcmFtcy5pZCArICcvY29tbWVudCcpKVxuICAgICAgLnNlbmQocGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgdGhlIGFkZHJlc3NlcyBmb3IgYSBnaXZlbiB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGFkZHJlc3NlcyhwYXJhbXM6IEFkZHJlc3Nlc09wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdKTtcblxuICAgIGNvbnN0IHF1ZXJ5OiBBZGRyZXNzZXNPcHRpb25zID0ge307XG5cbiAgICBpZiAocGFyYW1zLm1pbmUpIHtcbiAgICAgIHF1ZXJ5Lm1pbmUgPSAhIXBhcmFtcy5taW5lO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMucHJldklkKSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5wcmV2SWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwcmV2SWQgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnByZXZJZCA9IHBhcmFtcy5wcmV2SWQ7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5zb3J0KSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLnNvcnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzb3J0IGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5zb3J0ID0gcGFyYW1zLnNvcnQ7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5saW1pdCkge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5saW1pdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxpbWl0IGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5saW1pdCA9IHBhcmFtcy5saW1pdDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmxhYmVsQ29udGFpbnMpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMubGFiZWxDb250YWlucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxhYmVsQ29udGFpbnMgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmxhYmVsQ29udGFpbnMgPSBwYXJhbXMubGFiZWxDb250YWlucztcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnNlZ3dpdCkpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLnNlZ3dpdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNlZ3dpdCBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnNlZ3dpdCA9IHBhcmFtcy5zZWd3aXQ7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5jaGFpbnMpKSB7XG4gICAgICBpZiAoIV8uaXNBcnJheShwYXJhbXMuY2hhaW5zKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY2hhaW5zIGFyZ3VtZW50LCBleHBlY3RpbmcgYXJyYXkgb2YgbnVtYmVycycpO1xuICAgICAgfVxuICAgICAgcXVlcnkuY2hhaW5zID0gcGFyYW1zLmNoYWlucztcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNOaWwocGFyYW1zLmluY2x1ZGVCYWxhbmNlcykpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmluY2x1ZGVCYWxhbmNlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGluY2x1ZGVCYWxhbmNlcyBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmluY2x1ZGVCYWxhbmNlcyA9IHBhcmFtcy5pbmNsdWRlQmFsYW5jZXM7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTmlsKHBhcmFtcy5pbmNsdWRlVG9rZW5zKSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuaW5jbHVkZVRva2VucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGluY2x1ZGVUb2tlbnMgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5pbmNsdWRlVG9rZW5zID0gcGFyYW1zLmluY2x1ZGVUb2tlbnM7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTmlsKHBhcmFtcy5pbmNsdWRlVG90YWxBZGRyZXNzQ291bnQpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5pbmNsdWRlVG90YWxBZGRyZXNzQ291bnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbmNsdWRlVG90YWxBZGRyZXNzQ291bnQgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5pbmNsdWRlVG90YWxBZGRyZXNzQ291bnQgPSBwYXJhbXMuaW5jbHVkZVRvdGFsQWRkcmVzc0NvdW50O1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucmV0dXJuQmFsYW5jZXNGb3JUb2tlbikge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5yZXR1cm5CYWxhbmNlc0ZvclRva2VuKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcmV0dXJuQmFsYW5jZXNGb3JUb2tlbiBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkucmV0dXJuQmFsYW5jZXNGb3JUb2tlbiA9IHBhcmFtcy5yZXR1cm5CYWxhbmNlc0ZvclRva2VuO1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMucGVuZGluZ0RlcGxveW1lbnQpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5wZW5kaW5nRGVwbG95bWVudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHBlbmRpbmdEZXBsb3ltZW50IGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgcXVlcnkucGVuZGluZ0RlcGxveW1lbnQgPSBwYXJhbXMucGVuZGluZ0RlcGxveW1lbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z29cbiAgICAgIC5nZXQodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuX3dhbGxldC5pZCArICcvYWRkcmVzc2VzJykpXG4gICAgICAucXVlcnkocXVlcnkpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgc2luZ2xlIHdhbGxldCBhZGRyZXNzIGJ5IGl0cyBpZFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgZ2V0QWRkcmVzcyhwYXJhbXM6IEdldEFkZHJlc3NPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ2FkZHJlc3MnLCAnaWQnXSk7XG4gICAgbGV0IHF1ZXJ5O1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5hZGRyZXNzKSAmJiBfLmlzVW5kZWZpbmVkKHBhcmFtcy5pZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYWRkcmVzcyBvciBpZCBvZiBhZGRyZXNzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGlmIChwYXJhbXMuYWRkcmVzcykge1xuICAgICAgcXVlcnkgPSBwYXJhbXMuYWRkcmVzcztcbiAgICB9IGVsc2Uge1xuICAgICAgcXVlcnkgPSBwYXJhbXMuaWQ7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5yZXFJZCkge1xuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z29cbiAgICAgIC5nZXQodGhpcy5iYXNlQ29pbi51cmwoYC93YWxsZXQvJHt0aGlzLl93YWxsZXQuaWR9L2FkZHJlc3MvJHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfWApKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBvbmUgb3IgbW9yZSBuZXcgYWRkcmVzcyhlcykgZm9yIHVzZSB3aXRoIHRoaXMgd2FsbGV0LlxuICAgKlxuICAgKiBJZiB0aGUgYGNvdW50YCBmaWVsZCBpcyBkZWZpbmVkIGFuZCBncmVhdGVyIHRoYW4gMSwgYW4gb2JqZWN0IHdpdGggYSBzaW5nbGVcbiAgICogYXJyYXkgcHJvcGVydHkgbmFtZWQgYGFkZHJlc3Nlc2AgY29udGFpbmluZyBgY291bnRgIGFkZHJlc3Mgb2JqZWN0c1xuICAgKiB3aWxsIGJlIHJldHVybmVkLiBPdGhlcndpc2UsIGEgc2luZ2xlIGFkZHJlc3Mgb2JqZWN0IGlzIHJldHVybmVkLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuY2hhaW4gb24gd2hpY2ggdGhlIG5ldyBhZGRyZXNzIHNob3VsZCBiZSBjcmVhdGVkXG4gICAqIEBwYXJhbSB7KE51bWJlcnxTdHJpbmcpfSBwYXJhbXMuZ2FzUHJpY2UgZ2FzIHByaWNlIGZvciBuZXcgYWRkcmVzcyBjcmVhdGlvbiwgaWYgYXBwbGljYWJsZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmxhYmVsIGxhYmVsIGZvciB0aGUgbmV3IGFkZHJlc3MoZXMpXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuY291bnQ9MSBudW1iZXIgb2YgbmV3IGFkZHJlc3NlcyB3aGljaCBzaG91bGQgYmUgY3JlYXRlZCAobWF4aW11bSAyNTApXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZm9yd2FyZGVyVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiBhZGRyZXNzIHRvIGNyZWF0ZSwgaWYgYXBwbGljYWJsZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5sb3dQcmlvcml0eSBFdGhlcmV1bS1zcGVjaWZpYyBwYXJhbSB0byBjcmVhdGUgYWRkcmVzcyB1c2luZyBsb3cgcHJpb3JpdHkgZmVlIGFkZHJlc3NcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5iYXNlQWRkcmVzcyBiYXNlIGFkZHJlc3Mgb2YgdGhlIHdhbGxldChvcHRpb25hbCBwYXJhbWV0ZXIpXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmFsbG93U2tpcFZlcmlmeUFkZHJlc3MgV2hlbiBzZXQgdG8gZmFsc2UsIGl0IHRocm93cyBlcnJvciBpZiBhZGRyZXNzIHZlcmlmaWNhdGlvbiBpcyBza2lwcGVkIGZvciBhbnkgcmVhc29uLiBEZWZhdWx0IGlzIHRydWUuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMub25Ub2tlbiBtYW5kYXRvcnkgaW4gY2FzZSBvZiB0aGUgT0ZDIHdhbGxldCwgdGhlIG5hbWUgb2YgdG9rZW4gdG8gY3JlYXRlIGFkZHJlc3MgZm9yXG4gICAqIEFkZHJlc3MgdmVyaWZpY2F0aW9uIGNhbiBiZSBza2lwcGVkIHdoZW4gZm9yd2FyZGVyVmVyc2lvbiBpcyAwIGFuZCBwZW5kaW5nQ2hhaW5Jbml0aWFsaXphdGlvbiBpcyB0cnVlIE9SXG4gICAqIGlmICdjb2luU3BlY2lmaWMnIGlzIG5vdCBwYXJ0IG9mIHRoZSByZXNwb25zZSBmcm9tIGFwaSBjYWxsIHRvIGNyZWF0ZSBhZGRyZXNzXG4gICAqL1xuICBhc3luYyBjcmVhdGVBZGRyZXNzKHBhcmFtczogQ3JlYXRlQWRkcmVzc09wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgYWRkcmVzc1BhcmFtczogQ3JlYXRlQWRkcmVzc09wdGlvbnMgPSB7fTtcbiAgICBjb25zdCByZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG5cbiAgICBjb25zdCB7XG4gICAgICBjaGFpbixcbiAgICAgIGdhc1ByaWNlLFxuICAgICAgbGFiZWwsXG4gICAgICBsb3dQcmlvcml0eSxcbiAgICAgIGZvcndhcmRlclZlcnNpb24sXG4gICAgICBmb3JtYXQsXG4gICAgICBjb3VudCA9IDEsXG4gICAgICBiYXNlQWRkcmVzcyxcbiAgICAgIGFsbG93U2tpcFZlcmlmeUFkZHJlc3MgPSB0cnVlLFxuICAgICAgb25Ub2tlbixcbiAgICB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGNoYWluKSkge1xuICAgICAgaWYgKCFfLmlzSW50ZWdlcihjaGFpbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjaGFpbiBoYXMgdG8gYmUgYW4gaW50ZWdlcicpO1xuICAgICAgfVxuICAgICAgYWRkcmVzc1BhcmFtcy5jaGFpbiA9IGNoYWluO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChnYXNQcmljZSkpIHtcbiAgICAgIGlmICghXy5pc0ludGVnZXIoZ2FzUHJpY2UpICYmIChpc05hTihOdW1iZXIoZ2FzUHJpY2UpKSB8fCAhXy5pc1N0cmluZyhnYXNQcmljZSkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZ2FzUHJpY2UgaGFzIHRvIGJlIGFuIGludGVnZXIgb3IgbnVtZXJpYyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIGFkZHJlc3NQYXJhbXMuZ2FzUHJpY2UgPSBnYXNQcmljZTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZm9yd2FyZGVyVmVyc2lvbikpIHtcbiAgICAgIGlmICghXy5pc0ludGVnZXIoZm9yd2FyZGVyVmVyc2lvbikgfHwgZm9yd2FyZGVyVmVyc2lvbiA8IDAgfHwgZm9yd2FyZGVyVmVyc2lvbiA+IDMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdmb3J3YXJkZXJWZXJzaW9uIGhhcyB0byBiZSBhbiBpbnRlZ2VyIDAsIDEsIDIgb3IgMycpO1xuICAgICAgfVxuICAgICAgYWRkcmVzc1BhcmFtcy5mb3J3YXJkZXJWZXJzaW9uID0gZm9yd2FyZGVyVmVyc2lvbjtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnICYmIHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCkgPT09ICdlY2RzYScpIHtcbiAgICAgIGFkZHJlc3NQYXJhbXMuZm9yd2FyZGVyVmVyc2lvbiA9IDM7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGxhYmVsKSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKGxhYmVsKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2xhYmVsIGhhcyB0byBiZSBhIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgYWRkcmVzc1BhcmFtcy5sYWJlbCA9IGxhYmVsO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChiYXNlQWRkcmVzcykpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhiYXNlQWRkcmVzcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdiYXNlQWRkcmVzcyBoYXMgdG8gYmUgYSBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoYWxsb3dTa2lwVmVyaWZ5QWRkcmVzcykpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4oYWxsb3dTa2lwVmVyaWZ5QWRkcmVzcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhbGxvd1NraXBWZXJpZnlBZGRyZXNzIGhhcyB0byBiZSBhIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIV8uaXNJbnRlZ2VyKGNvdW50KSB8fCBjb3VudCA8PSAwIHx8IGNvdW50ID4gMjUwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdW50IGhhcyB0byBiZSBhIG51bWJlciBiZXR3ZWVuIDEgYW5kIDI1MCcpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChsb3dQcmlvcml0eSkpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4obG93UHJpb3JpdHkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbG93UHJpb3JpdHkgaGFzIHRvIGJlIGEgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgYWRkcmVzc1BhcmFtcy5sb3dQcmlvcml0eSA9IGxvd1ByaW9yaXR5O1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChmb3JtYXQpKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcoZm9ybWF0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Zvcm1hdCBoYXMgdG8gYmUgYSBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIGFkZHJlc3NQYXJhbXMuZm9ybWF0ID0gZm9ybWF0O1xuICAgIH1cblxuICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpID09PSAnb2ZjJykge1xuICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKG9uVG9rZW4pKSB7XG4gICAgICAgIGlmICghXy5pc1N0cmluZyhvblRva2VuKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignb25Ub2tlbiBoYXMgdG8gYmUgYSBzdHJpbmcnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW9mY1Rva2Vucy5pbmNsdWRlcyhvblRva2VuKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBPRkMgdG9rZW4nKTtcbiAgICAgICAgfVxuICAgICAgICBhZGRyZXNzUGFyYW1zLm9uVG9rZW4gPSBvblRva2VuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvblRva2VuIGlzIGEgbWFuZGF0b3J5IHBhcmFtZXRlciBmb3IgT0ZDIHdhbGxldHMnKTtcbiAgICAgIH1cbiAgICAgIGlmICghXy5pc1N0cmluZyhvblRva2VuKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ29uVG9rZW4gaGFzIHRvIGJlIGEgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZ2V0IGtleWNoYWlucyBmb3IgYWRkcmVzcyB2ZXJpZmljYXRpb25cbiAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLl93YWxsZXQua2V5cy5tYXAoKGspID0+IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0KHsgaWQ6IGssIHJlcUlkIH0pKSk7XG4gICAgY29uc3Qgcm9vdEFkZHJlc3MgPSBfLmdldCh0aGlzLl93YWxsZXQsICdyZWNlaXZlQWRkcmVzcy5hZGRyZXNzJyk7XG5cbiAgICBjb25zdCBuZXdBZGRyZXNzZXMgPSBfLnRpbWVzKGNvdW50LCBhc3luYyAoKSA9PiB7XG4gICAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgICAgY29uc3QgbmV3QWRkcmVzcyA9IChhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLl93YWxsZXQuaWQgKyAnL2FkZHJlc3MnKSlcbiAgICAgICAgLnNlbmQoYWRkcmVzc1BhcmFtcylcbiAgICAgICAgLnJlc3VsdCgpKSBhcyBhbnk7XG5cbiAgICAgIC8vIGluZmVyIGl0cyBhZGRyZXNzIHR5cGVcbiAgICAgIGlmIChfLmlzT2JqZWN0KG5ld0FkZHJlc3MuY29pblNwZWNpZmljKSkge1xuICAgICAgICBuZXdBZGRyZXNzLmFkZHJlc3NUeXBlID0gaW5mZXJBZGRyZXNzVHlwZShuZXdBZGRyZXNzKTtcbiAgICAgIH1cblxuICAgICAgbmV3QWRkcmVzcy5rZXljaGFpbnMgPSBrZXljaGFpbnM7XG4gICAgICBuZXdBZGRyZXNzLmJhc2VBZGRyZXNzID0gYmFzZUFkZHJlc3MgPz8gXy5nZXQodGhpcy5fd2FsbGV0LCAnY29pblNwZWNpZmljLmJhc2VBZGRyZXNzJyk7XG5cbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbkRhdGE6IFZlcmlmeUFkZHJlc3NPcHRpb25zID0gXy5tZXJnZSh7fSwgbmV3QWRkcmVzcywgeyByb290QWRkcmVzcyB9KTtcblxuICAgICAgaWYgKHZlcmlmaWNhdGlvbkRhdGEuZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEFkZHJlc3NHZW5lcmF0aW9uRXJyb3IodmVyaWZpY2F0aW9uRGF0YS5lcnJvcik7XG4gICAgICB9XG5cbiAgICAgIHZlcmlmaWNhdGlvbkRhdGEuaW1wbGllZEZvcndhcmRlclZlcnNpb24gPSBmb3J3YXJkZXJWZXJzaW9uID8/IHZlcmlmaWNhdGlvbkRhdGEuY29pblNwZWNpZmljPy5mb3J3YXJkZXJWZXJzaW9uO1xuICAgICAgLy8gVGhpcyBjb25kaXRpb24gd2FzIGFkZGVkIGluIGZpcnN0IHBsYWNlIGJlY2F1c2UgaW4gY2Vsbywgd2hlbiB2ZXJpZnlBZGRyZXNzIG1ldGhvZCB3YXMgY2FsbGVkIG9uIGFkZHJlc3NlcyB3aGljaCB3ZXJlIGhhdmluZyBwZW5kaW5nQ2hhaW5Jbml0aWFsaXphdGlvbiBhcyB0cnVlLCBpdCB1c2VkIHRvIHRocm93IHNvbWUgZXJyb3JcbiAgICAgIC8vIEluIGNhc2Ugb2YgZm9yd2FyZGVyIHZlcnNpb24gMSBldGggYWRkcmVzc2VzLCBhZGRyZXNzZXMgbmVlZCB0byBiZSB2ZXJpZmllZCBldmVuIGlmIHRoZSBwZW5kaW5nQ2hhaW5Jbml0aWFsaXphdGlvbiBmbGFnIGlzIHRydWVcbiAgICAgIGlmIChcbiAgICAgICAgdmVyaWZpY2F0aW9uRGF0YS5jb2luU3BlY2lmaWMgJiZcbiAgICAgICAgKCF2ZXJpZmljYXRpb25EYXRhLmNvaW5TcGVjaWZpYy5wZW5kaW5nQ2hhaW5Jbml0aWFsaXphdGlvbiB8fCB2ZXJpZmljYXRpb25EYXRhLmltcGxpZWRGb3J3YXJkZXJWZXJzaW9uID09PSAxKVxuICAgICAgKSB7XG4gICAgICAgIC8vIGNhbid0IHZlcmlmeSBhZGRyZXNzZXMgd2hpY2ggYXJlIHBlbmRpbmcgY2hhaW4gaW5pdGlhbGl6YXRpb24sIGFzIHRoZSBhZGRyZXNzIGlzIGhpZGRlblxuICAgICAgICBsZXQgaXNXYWxsZXRBZGRyZXNzID0gZmFsc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaXNXYWxsZXRBZGRyZXNzID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5pc1dhbGxldEFkZHJlc3ModmVyaWZpY2F0aW9uRGF0YSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcikpIHtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEZJWE1FKEJHLTQzMjI1KTogaW1wbGVtZW50IHRoaXMgY29ycmVjdGx5XG4gICAgICAgICAgaXNXYWxsZXRBZGRyZXNzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzV2FsbGV0QWRkcmVzcykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgbm90IGEgd2FsbGV0IGFkZHJlc3NgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghYWxsb3dTa2lwVmVyaWZ5QWRkcmVzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGFkZHJlc3MgdmVyaWZpY2F0aW9uIHNraXBwZWQgZm9yIGNvdW50ID0gJHtjb3VudH1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ld0FkZHJlc3M7XG4gICAgfSk7XG5cbiAgICBpZiAobmV3QWRkcmVzc2VzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIG5ld0FkZHJlc3Nlc1swXTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWRkcmVzc2VzOiBhd2FpdCBQcm9taXNlLmFsbChuZXdBZGRyZXNzZXMpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHByb3BlcnRpZXMgb24gYW4gYWRkcmVzc1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgdXBkYXRlQWRkcmVzcyhwYXJhbXM6IFVwZGF0ZUFkZHJlc3NPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IGFkZHJlc3MgPSBwYXJhbXMuYWRkcmVzcztcblxuICAgIGlmICghXy5pc1N0cmluZyhhZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHN0cmluZyBwYXJhbWV0ZXIgYWRkcmVzcycpO1xuICAgIH1cblxuICAgIGNvbnN0IHB1dFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFsnbGFiZWwnXSk7XG4gICAgY29uc3QgdXJsID0gdGhpcy51cmwoJy9hZGRyZXNzLycgKyBlbmNvZGVVUklDb21wb25lbnQoYWRkcmVzcykpO1xuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28ucHV0KHVybCkuc2VuZChwdXRQYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3Qgd2ViaG9va3Mgb24gdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgbGlzdFdlYmhvb2tzKHBhcmFtczogUGFnaW5hdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcXVlcnk6IFBhZ2luYXRpb25PcHRpb25zID0ge307XG4gICAgaWYgKHBhcmFtcy5wcmV2SWQpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucHJldklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJldklkIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5wcmV2SWQgPSBwYXJhbXMucHJldklkO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMubGltaXQpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMubGltaXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsaW1pdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvd2ViaG9va3MnKSkucXVlcnkocXVlcnkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpbXVsYXRlIHdhbGxldCB3ZWJob29rLCBjdXJyZW50bHkgZm9yIHdlYmhvb2tzIG9mIHR5cGUgdHJhbnNmZXIgYW5kIHBlbmRpbmcgYXBwcm92YWxcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAtIHdlYmhvb2tJZCAocmVxdWlyZWQpIGlkIG9mIHRoZSB3ZWJob29rIHRvIGJlIHNpbXVsYXRlZFxuICAgKiAtIHRyYW5zZmVySWQgKG9wdGlvbmFsIGJ1dCByZXF1aXJlZCBmb3IgdHJhbnNmZXIgd2ViaG9va3MpIGlkIG9mIHRoZSBzaW11bGF0ZWQgdHJhbnNmZXJcbiAgICogLSBwZW5kaW5nQXBwcm92YWxJZCAob3B0aW9uYWwgYnV0IHJlcXVpcmVkIGZvciBwZW5kaW5nIGFwcHJvdmFsIHdlYmhvb2tzKSBpZCBvZiB0aGUgc2ltdWxhdGVkIHBlbmRpbmcgYXBwcm92YWxcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBzaW11bGF0ZVdlYmhvb2socGFyYW1zOiBTaW11bGF0ZVdlYmhvb2tPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnd2ViaG9va0lkJ10sIFsndHJhbnNmZXJJZCcsICdwZW5kaW5nQXBwcm92YWxJZCddKTtcblxuICAgIGNvbnN0IGhhc1RyYW5zZmVySWQgPSAhIXBhcmFtcy50cmFuc2ZlcklkO1xuICAgIGNvbnN0IGhhc1BlbmRpbmdBcHByb3ZhbElkID0gISFwYXJhbXMucGVuZGluZ0FwcHJvdmFsSWQ7XG4gICAgaWYgKCFoYXNUcmFuc2ZlcklkICYmICFoYXNQZW5kaW5nQXBwcm92YWxJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtdXN0IHN1cHBseSBlaXRoZXIgdHJhbnNmZXJJZCBvciBwZW5kaW5nQXBwcm92YWxJZCcpO1xuICAgIH1cblxuICAgIGlmIChoYXNUcmFuc2ZlcklkICYmIGhhc1BlbmRpbmdBcHByb3ZhbElkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ211c3Qgc3VwcGx5IGVpdGhlciB0cmFuc2ZlcklkIG9yIHBlbmRpbmdBcHByb3ZhbElkLCBidXQgbm90IGJvdGgnKTtcbiAgICB9XG5cbiAgICAvLyBkZXBlbmRpbmcgb24gdGhlIGNvaW4gdHlwZSBvZiB0aGUgd2FsbGV0LCB0aGUgdHhIYXNoIGhhcyB0byBhZGhlcmUgdG8gaXRzIHJlc3BlY3RpdmUgZm9ybWF0XG4gICAgLy8gYnV0IHRoZSBzZXJ2ZXIgdGFrZXMgY2FyZSBvZiB0aGF0XG5cbiAgICAvLyBvbmx5IHRha2UgdGhlIHRyYW5zZmVySWQgYW5kIHBlbmRpbmdBcHByb3ZhbElkIHByb3BlcnRpZXNcbiAgICBjb25zdCBmaWx0ZXJlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFsndHJhbnNmZXJJZCcsICdwZW5kaW5nQXBwcm92YWxJZCddKTtcblxuICAgIGNvbnN0IHdlYmhvb2tJZCA9IHBhcmFtcy53ZWJob29rSWQ7XG4gICAgcmV0dXJuIHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMudXJsKCcvd2ViaG9va3MvJyArIHdlYmhvb2tJZCArICcvc2ltdWxhdGUnKSlcbiAgICAgIC5zZW5kKGZpbHRlcmVkUGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHdlYmhvb2sgdG8gdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgYWRkV2ViaG9vayhwYXJhbXM6IE1vZGlmeVdlYmhvb2tPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndXJsJywgJ3R5cGUnXSwgW10pO1xuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL3dlYmhvb2tzJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSB3ZWJob29rIGZyb20gdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgcmVtb3ZlV2ViaG9vayhwYXJhbXM6IE1vZGlmeVdlYmhvb2tPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndXJsJywgJ3R5cGUnXSwgW10pO1xuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28uZGVsKHRoaXMudXJsKCcvd2ViaG9va3MnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHVzZXIga2V5IGNoYWluIGZvciB0aGlzIHdhbGxldFxuICAgKlxuICAgKiBUaGUgdXNlciBrZXkgY2hhaW4gaXMgdGhlIGZpcnN0IGtleWNoYWluIG9mIHRoZSB3YWxsZXQgYW5kIHVzdWFsbHkgaGFzIHRoZSBlbmNyeXB0ZWQgcHJ2IHN0b3JlZCBvbiBCaXRHby5cbiAgICogVXNlZnVsIHdoZW4gdHJ5aW5nIHRvIGdldCB0aGUgdXNlcnMnIGtleWNoYWluIGZyb20gdGhlIHNlcnZlciBiZWZvcmUgZGVjcnlwdGluZyB0byBzaWduIGEgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGdldEVuY3J5cHRlZFVzZXJLZXljaGFpbihwYXJhbXM6IFJlY29yZDxzdHJpbmcsIG5ldmVyPiA9IHt9KTogUHJvbWlzZTx7IGVuY3J5cHRlZFBydjogc3RyaW5nIH0+IHtcbiAgICBjb25zdCB0cnlLZXlDaGFpbiA9IGFzeW5jIChpbmRleDogbnVtYmVyKTogUHJvbWlzZTx7IGVuY3J5cHRlZFBydjogc3RyaW5nIH0+ID0+IHtcbiAgICAgIGlmICghdGhpcy5fd2FsbGV0LmtleXMgfHwgaW5kZXggPj0gdGhpcy5fd2FsbGV0LmtleXMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gZW5jcnlwdGVkIGtleWNoYWlucyBvbiB0aGlzIHdhbGxldC4nKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyYW1zID0geyBpZDogdGhpcy5fd2FsbGV0LmtleXNbaW5kZXhdIH07XG5cbiAgICAgIGNvbnN0IGtleWNoYWluID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXQocGFyYW1zKTtcbiAgICAgIC8vIElmIHdlIGZpbmQgdGhlIHBydiwgdGhlbiB0aGlzIGlzIHByb2JhYmx5IHRoZSB1c2VyIGtleWNoYWluIHdlJ3JlIGxvb2tpbmcgZm9yXG4gICAgICBpZiAoa2V5Y2hhaW4uZW5jcnlwdGVkUHJ2KSB7XG4gICAgICAgIHJldHVybiBrZXljaGFpbiBhcyB7IGVuY3J5cHRlZFBydjogc3RyaW5nIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ5S2V5Q2hhaW4oaW5kZXggKyAxKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRyeUtleUNoYWluKDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHVuZW5jcnlwdGVkIHByaXZhdGUga2V5IGZvciB0aGlzIHdhbGxldCAoYmUgY2FyZWZ1bCEpXG4gICAqIFJlcXVpcmVzIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGdldFBydihwYXJhbXM6IEdldFBydk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnd2FsbGV0UGFzc3BocmFzZScsICdwcnYnXSk7XG5cbiAgICAvLyBQcmVwYXJlIHNpZ25pbmcga2V5XG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnBydikgJiYgXy5pc1VuZGVmaW5lZChwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBlaXRoZXIgcHJvdmlkZSBwcnYgb3Igd2FsbGV0IHBhc3NwaHJhc2UnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnBydikgJiYgIV8uaXNTdHJpbmcocGFyYW1zLnBydikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHJ2IG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLndhbGxldFBhc3NwaHJhc2UpICYmICFfLmlzU3RyaW5nKHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd3YWxsZXRQYXNzcGhyYXNlIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnBydikge1xuICAgICAgcmV0dXJuIHBhcmFtcy5wcnY7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlcktleWNoYWluID0gKGF3YWl0IHRoaXMuZ2V0RW5jcnlwdGVkVXNlcktleWNoYWluKCkpIGFzIGFueTtcbiAgICBjb25zdCB1c2VyRW5jcnlwdGVkUHJ2ID0gdXNlcktleWNoYWluLmVuY3J5cHRlZFBydjtcblxuICAgIGxldCB1c2VyUHJ2O1xuICAgIHRyeSB7XG4gICAgICB1c2VyUHJ2ID0gdGhpcy5iaXRnby5kZWNyeXB0KHsgaW5wdXQ6IHVzZXJFbmNyeXB0ZWRQcnYsIHBhc3N3b3JkOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Vycm9yIGRlY3J5cHRpbmcgd2FsbGV0IHBhc3NwaHJhc2UnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXNlclBydjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGFuIGVuY3J5cHRlZCB3YWxsZXQgc2hhcmUgdG8gQml0R28uXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGNyZWF0ZVNoYXJlKHBhcmFtczogQ3JlYXRlU2hhcmVPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndXNlcicsICdwZXJtaXNzaW9ucyddLCBbXSk7XG5cbiAgICBpZiAocGFyYW1zLmtleWNoYWluICYmICFfLmlzRW1wdHkocGFyYW1zLmtleWNoYWluKSkge1xuICAgICAgaWYgKFxuICAgICAgICAhcGFyYW1zLmtleWNoYWluLnB1YiB8fFxuICAgICAgICAhcGFyYW1zLmtleWNoYWluLmVuY3J5cHRlZFBydiB8fFxuICAgICAgICAhcGFyYW1zLmtleWNoYWluLmZyb21QdWJLZXkgfHxcbiAgICAgICAgIXBhcmFtcy5rZXljaGFpbi50b1B1YktleSB8fFxuICAgICAgICAhcGFyYW1zLmtleWNoYWluLnBhdGhcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVzIGtleWNoYWluIHBhcmFtZXRlcnMgLSBwdWIsIGVuY3J5cHRlZFBydiwgZnJvbVB1YktleSwgdG9QdWJLZXksIHBhdGgnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5iaXRnby5wb3N0KHRoaXMudXJsKCcvc2hhcmUnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNoYXJlIHRoaXMgd2FsbGV0IHdpdGggYW5vdGhlciBCaXRHbyB1c2VyLlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgc2hhcmVXYWxsZXQocGFyYW1zOiBTaGFyZVdhbGxldE9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydlbWFpbCcsICdwZXJtaXNzaW9ucyddLCBbJ3dhbGxldFBhc3NwaHJhc2UnLCAnbWVzc2FnZSddKTtcblxuICAgIGlmIChwYXJhbXMucmVzaGFyZSAhPT0gdW5kZWZpbmVkICYmICFfLmlzQm9vbGVhbihwYXJhbXMucmVzaGFyZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgcmVzaGFyZSB0byBiZSBhIGJvb2xlYW4uJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5za2lwS2V5Y2hhaW4gIT09IHVuZGVmaW5lZCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLnNraXBLZXljaGFpbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgc2tpcEtleWNoYWluIHRvIGJlIGEgYm9vbGVhbi4gJyk7XG4gICAgfVxuICAgIGNvbnN0IG5lZWRzS2V5Y2hhaW4gPSAhcGFyYW1zLnNraXBLZXljaGFpbiAmJiBwYXJhbXMucGVybWlzc2lvbnMgJiYgcGFyYW1zLnBlcm1pc3Npb25zLmluZGV4T2YoJ3NwZW5kJykgIT09IC0xO1xuXG4gICAgaWYgKHBhcmFtcy5kaXNhYmxlRW1haWwgIT09IHVuZGVmaW5lZCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLmRpc2FibGVFbWFpbCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgZGlzYWJsZUVtYWlsIHRvIGJlIGEgYm9vbGVhbi4nKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLmVtYWlsKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHN0cmluZyBwYXJhbWV0ZXIgZW1haWwnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaGFyaW5nID0gKGF3YWl0IHRoaXMuYml0Z28uZ2V0U2hhcmluZ0tleSh7IGVtYWlsOiBwYXJhbXMuZW1haWwudG9Mb3dlckNhc2UoKSB9KSkgYXMgYW55O1xuICAgIGxldCBzaGFyZWRLZXljaGFpbjtcbiAgICBpZiAobmVlZHNLZXljaGFpbikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qga2V5Y2hhaW4gPSAoYXdhaXQgdGhpcy5nZXRFbmNyeXB0ZWRVc2VyS2V5Y2hhaW4oe30pKSBhcyBhbnk7XG4gICAgICAgIC8vIERlY3J5cHQgdGhlIHVzZXIga2V5IHdpdGggYSBwYXNzcGhyYXNlXG4gICAgICAgIGlmIChrZXljaGFpbi5lbmNyeXB0ZWRQcnYpIHtcbiAgICAgICAgICBpZiAoIXBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3Npbmcgd2FsbGV0UGFzc3BocmFzZSBhcmd1bWVudCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAga2V5Y2hhaW4ucHJ2ID0gdGhpcy5iaXRnby5kZWNyeXB0KHsgcGFzc3dvcmQ6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLCBpbnB1dDoga2V5Y2hhaW4uZW5jcnlwdGVkUHJ2IH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGRlY3J5cHQgdXNlciBrZXljaGFpbicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGVja2V5ID0gbWFrZVJhbmRvbUtleSgpO1xuICAgICAgICAgIGNvbnN0IHNlY3JldCA9IGdldFNoYXJlZFNlY3JldChlY2tleSwgQnVmZmVyLmZyb20oc2hhcmluZy5wdWJrZXksICdoZXgnKSkudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgICAgIGNvbnN0IG5ld0VuY3J5cHRlZFBydiA9IHRoaXMuYml0Z28uZW5jcnlwdCh7IHBhc3N3b3JkOiBzZWNyZXQsIGlucHV0OiBrZXljaGFpbi5wcnYgfSk7XG4gICAgICAgICAgLy8gT25seSBvbmUgb2YgcHViL2NvbW1vblB1Yi9jb21tb25LZXljaGFpbiBzaG91bGQgYmUgcHJlc2VudCBpbiB0aGUga2V5Y2hhaW5cbiAgICAgICAgICBsZXQgcHViID0ga2V5Y2hhaW4ucHViID8/IGtleWNoYWluLmNvbW1vblB1YjtcbiAgICAgICAgICBpZiAoa2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pIHtcbiAgICAgICAgICAgIHB1YiA9XG4gICAgICAgICAgICAgIHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCkgPT09ICdlZGRzYSdcbiAgICAgICAgICAgICAgICA/IEVkZHNhVXRpbHMuZ2V0UHVibGljS2V5RnJvbUNvbW1vbktleWNoYWluKGtleWNoYWluLmNvbW1vbktleWNoYWluKVxuICAgICAgICAgICAgICAgIDogRWNkc2FVdGlscy5nZXRQdWJsaWNLZXlGcm9tQ29tbW9uS2V5Y2hhaW4oa2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzaGFyZWRLZXljaGFpbiA9IHtcbiAgICAgICAgICAgIHB1YixcbiAgICAgICAgICAgIGVuY3J5cHRlZFBydjogbmV3RW5jcnlwdGVkUHJ2LFxuICAgICAgICAgICAgZnJvbVB1YktleTogZWNrZXkucHVibGljS2V5LnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICAgIHRvUHViS2V5OiBzaGFyaW5nLnB1YmtleSxcbiAgICAgICAgICAgIHBhdGg6IHNoYXJpbmcucGF0aCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlLm1lc3NhZ2UgPT09ICdObyBlbmNyeXB0ZWQga2V5Y2hhaW5zIG9uIHRoaXMgd2FsbGV0LicpIHtcbiAgICAgICAgICBzaGFyZWRLZXljaGFpbiA9IHt9O1xuICAgICAgICAgIC8vIGlnbm9yZSB0aGlzIGVycm9yIGJlY2F1c2UgdGhpcyBsb29rcyBsaWtlIGEgY29sZCB3YWxsZXRcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9uczogQ3JlYXRlU2hhcmVPcHRpb25zID0ge1xuICAgICAgdXNlcjogc2hhcmluZy51c2VySWQsXG4gICAgICBwZXJtaXNzaW9uczogcGFyYW1zLnBlcm1pc3Npb25zLFxuICAgICAgcmVzaGFyZTogcGFyYW1zLnJlc2hhcmUsXG4gICAgICBtZXNzYWdlOiBwYXJhbXMubWVzc2FnZSxcbiAgICAgIGRpc2FibGVFbWFpbDogcGFyYW1zLmRpc2FibGVFbWFpbCxcbiAgICB9O1xuXG4gICAgaWYgKHNoYXJlZEtleWNoYWluKSB7XG4gICAgICBvcHRpb25zLmtleWNoYWluID0gc2hhcmVkS2V5Y2hhaW47XG4gICAgfSBlbHNlIGlmIChwYXJhbXMuc2tpcEtleWNoYWluKSB7XG4gICAgICBvcHRpb25zLmtleWNoYWluID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY3JlYXRlU2hhcmUob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHVzZXIgZnJvbSB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAtIHVzZXJJZCBJZCBvZiB0aGUgdXNlciB0byByZW1vdmVcbiAgICogQHJldHVybiB7Kn1cbiAgICovXG4gIGFzeW5jIHJlbW92ZVVzZXIocGFyYW1zOiBSZW1vdmVVc2VyT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VzZXJJZCddLCBbXSk7XG5cbiAgICBjb25zdCB1c2VySWQgPSBwYXJhbXMudXNlcklkO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmRlbCh0aGlzLnVybCgnL3VzZXIvJyArIHVzZXJJZCkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGEgdHJhbnNhY3Rpb24gcHJlYnVpbGQgKHVuc2lnbmVkIHRyYW5zYWN0aW9uKSBmcm9tIEJpdEdvXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXNcbiAgICogQHBhcmFtIHt7YWRkcmVzczogc3RyaW5nLCBhbW91bnQ6IHN0cmluZ319IHBhcmFtcy5yZWNpcGllbnRzIC0gbGlzdCBvZiByZWNpcGllbnRzIGFuZCBuZWNlc3NhcnkgcmVjaXBpZW50IGluZm9ybWF0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubnVtQmxvY2tzIC0gRXN0aW1hdGVzIHRoZSBhcHByb3hpbWF0ZSBmZWUgcGVyIGtpbG9ieXRlIG5lY2Vzc2FyeSBmb3IgYSB0cmFuc2FjdGlvbiBjb25maXJtYXRpb24gd2l0aGluIG51bUJsb2NrcyBibG9ja3NcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVSYXRlIC0gdGhlIGRlc2lyZWQgZmVlUmF0ZSBmb3IgdGhlIHRyYW5zYWN0aW9uIGluIGJhc2UgdW5pdHMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhGZWVSYXRlIC0gdXBwZXIgbGltaXQgZm9yIGZlZVJhdGUgaW4gYmFzZSB1bml0cy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gTWluaW11bSBudW1iZXIgb2YgY29uZmlybWF0aW9ucyB1bnNwZW50cyBnb2luZyBpbnRvIHRoaXMgdHJhbnNhY3Rpb24gc2hvdWxkIGhhdmVcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlIC0gRW5mb3JjZSBtaW5pbXVtIG51bWJlciBvZiBjb25maXJtYXRpb25zIG9uIGNoYW5nZSAoaW50ZXJuYWwpIGlucHV0cy5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy50YXJnZXRXYWxsZXRVbnNwZW50cyAtIFRoZSBkZXNpcmVkIGNvdW50IG9mIHVuc3BlbnRzIGluIHRoZSB3YWxsZXQuIElmIHRoZSB3YWxsZXTigJlzIGN1cnJlbnQgdW5zcGVudCBjb3VudCBpcyBsb3dlciB0aGFuIHRoZSB0YXJnZXQsIHVwIHRvIGZvdXIgYWRkaXRpb25hbCBjaGFuZ2Ugb3V0cHV0cyB3aWxsIGJlIGFkZGVkIHRvIHRoZSB0cmFuc2FjdGlvbi5cbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5taW5WYWx1ZSAtIElnbm9yZSB1bnNwZW50cyBzbWFsbGVyIHRoYW4gdGhpcyBhbW91bnQgb2YgYmFzZSB1bml0c1xuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1heFZhbHVlIC0gSWdub3JlIHVuc3BlbnRzIGxhcmdlciB0aGFuIHRoaXMgYW1vdW50IG9mIGJhc2UgdW5pdHNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5zZXF1ZW5jZUlkIC0gVGhlIHNlcXVlbmNlIElEIG9mIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmxhc3RMZWRnZXJTZXF1ZW5jZSAtIEFic29sdXRlIG1heCBsZWRnZXIgdGhlIHRyYW5zYWN0aW9uIHNob3VsZCBiZSBhY2NlcHRlZCBpbiwgd2hlcmVhZnRlciBpdCB3aWxsIGJlIHJlamVjdGVkLlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmxlZGdlclNlcXVlbmNlRGVsdGEgLSBSZWxhdGl2ZSBsZWRnZXIgaGVpZ2h0IChpbiByZWxhdGlvbiB0byB0aGUgY3VycmVudCBsZWRnZXIpIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHNob3VsZCBiZSBhY2NlcHRlZCBpbiwgd2hlcmVhZnRlciBpdCB3aWxsIGJlIHJlamVjdGVkLlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmdhc1ByaWNlIC0gQ3VzdG9tIGdhcyBwcmljZSB0byBiZSB1c2VkIGZvciBzZW5kaW5nIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmdhc0xpbWl0IC0gQ3VzdG9tIGdhcyBsaW1pdCB0byBiZSB1c2VkIGZvciBzZW5kaW5nIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5ub1NwbGl0Q2hhbmdlIC0gU2V0IHRvIHRydWUgdG8gZGlzYWJsZSBhdXRvbWF0aWMgY2hhbmdlIHNwbGl0dGluZyBmb3IgcHVycG9zZXMgb2YgdW5zcGVudCBtYW5hZ2VtZW50XG4gICAqIEBwYXJhbSB7QXJyYXl9IHBhcmFtcy51bnNwZW50cyAtIFRoZSB1bnNwZW50cyB0byB1c2UgaW4gdGhlIHRyYW5zYWN0aW9uLiBFYWNoIHVuc3BlbnQgc2hvdWxkIGJlIGluIHRoZSBmb3JtIHByZXZUeElkOm5PdXRwdXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5jaGFuZ2VBZGRyZXNzIC0gU3BlY2lmaWVzIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgY2hhbmdlIG91dHB1dFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5ub25QYXJ0aWNpcGF0aW9uIC0gKEFsZ29yYW5kKSBOb24gcGFydGljaXBhdGluZyBrZXkgcmVnIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMudmFsaWRGcm9tQmxvY2sgLSAoQWxnb3JhbmQpIFRoZSBtaW5pbXVtIHJvdW5kIHRoaXMgd2lsbCBydW4gb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy52YWxpZFRvQmxvY2sgLSAoQWxnb3JhbmQpIFRoZSBtYXhpbXVtIHJvdW5kIHRoaXMgd2lsbCBydW4gb25cbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuaW5zdGFudCAtIEJ1aWxkIHRoaXMgdHJhbnNhY3Rpb24gdG8gY29uZm9ybSB3aXRoIGluc3RhbnQgc2VuZGluZyBjb2luLXNwZWNpZmljIG1ldGhvZCAoaWYgYXZhaWxhYmxlKVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5rZWVwQWxpdmUgLSAoUG9sa2Fkb3QpIGtlZXAgYWRkcmVzcyBhbGl2ZSBieSBzZW5kaW5nIHRoZSBhZGRyZXNzIG1pbmltdW0gZnVuZGluZyBhbW91bnQsIHVzZWQgZHVyaW5nIHdhbGxldCBjb25zb2xpZGF0aW9uLCB0cnVlIGJ5IGRlZmF1bHRcbiAgICogQHBhcmFtIHt7dmFsdWU6IFN0cmluZywgdHlwZTogU3RyaW5nfX0gcGFyYW1zLm1lbW8gLSBNZW1vIHRvIHVzZSBpbiB0cmFuc2FjdGlvbiAoc3VwcG9ydGVkIGJ5IFN0ZWxsYXIpXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbS50cmFuc2ZlcklkIC0gdHJhbnNmZXIgSWQgdG8gdXNlIGluIHRyYW5zYWN0aW9uIChzdXBwb3J0ZWQgYnkgY2FzcGVyKVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmFkZHJlc3NUeXBlIC0gVGhlIHR5cGUgb2YgYWRkcmVzcyB0byBjcmVhdGUgZm9yIGNoYW5nZS4gT25lIG9mIGBwMnNoYCwgYHAyc2hQMndzaGAsIGFuZCBgcDJ3c2hgLiBDYXNlLXNlbnNpdGl2ZS5cbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuaG9wIC0gQnVpbGQgdGhpcyBhcyBhbiBFdGhlcmV1bSBob3AgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcy5yZXNlcnZhdGlvbiAtIE9iamVjdCB0byByZXNlcnZlIHRoZSB1bnNwZW50cyB0aGF0IHRoaXMgdHggYnVpbGQgdXNlcy4gRm9ybWF0IGlzIHJlc2VydmF0aW9uID0geyBleHBpcmVUaW1lOiBJU09EYXRlU3RyaW5nLCBwZW5kaW5nQXBwcm92YWxJZDogU3RyaW5nIH1cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIFRoZSBwYXNzcGhyYXNlIHRvIHRoZSB3YWxsZXQgdXNlciBrZXksIHRvIHNpZ24gY29tbWl0bWVudCBkYXRhIGZvciBFdGhlcmV1bSBob3AgdHJhbnNhY3Rpb25zXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMud2FsbGV0Q29udHJhY3RBZGRyZXNzIC0gVGhlIGNvbnRyYWN0IGFkZHJlc3MgdXNlZCBhcyB0aGUgXCJ0b1wiIGZpZWxkIG9mIGEgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBwcmVidWlsZFRyYW5zYWN0aW9uKHBhcmFtczogUHJlYnVpbGRUcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8UHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdD4ge1xuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlID09PSAndHNzJykge1xuICAgICAgcmV0dXJuIHRoaXMucHJlYnVpbGRUcmFuc2FjdGlvblRzcyhwYXJhbXMpO1xuICAgIH1cblxuICAgIC8vIFdoaXRlbGlzdCBwYXJhbXMgdG8gYnVpbGQgdHhcbiAgICBjb25zdCB3aGl0ZWxpc3RlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIHRoaXMucHJlYnVpbGRXaGl0ZWxpc3RlZFBhcmFtcygpKTtcbiAgICBkZWJ1ZygncHJlYnVpbGRpbmcgdHJhbnNhY3Rpb246ICVPJywgd2hpdGVsaXN0ZWRQYXJhbXMpO1xuXG4gICAgaWYgKHBhcmFtcy5yZXFJZCkge1xuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCk7XG4gICAgfVxuICAgIGNvbnN0IGV4dHJhUGFyYW1zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5nZXRFeHRyYVByZWJ1aWxkUGFyYW1zKE9iamVjdC5hc3NpZ24ocGFyYW1zLCB7IHdhbGxldDogdGhpcyB9KSk7XG4gICAgT2JqZWN0LmFzc2lnbih3aGl0ZWxpc3RlZFBhcmFtcywgZXh0cmFQYXJhbXMpO1xuICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0ge1xuICAgICAgb2ZmbGluZVZlcmlmaWNhdGlvbjogcGFyYW1zLm9mZmxpbmVWZXJpZmljYXRpb24gPyB0cnVlIDogdW5kZWZpbmVkLFxuICAgIH07XG5cbiAgICBjb25zdCBidWlsZFF1ZXJ5ID0gdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuaWQoKSArICcvdHgvYnVpbGQnKSlcbiAgICAgIC5xdWVyeShxdWVyeVBhcmFtcylcbiAgICAgIC5zZW5kKHdoaXRlbGlzdGVkUGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuXG4gICAgY29uc3QgYmxvY2tIZWlnaHRRdWVyeSA9IF8uaXNGdW5jdGlvbigodGhpcy5iYXNlQ29pbiBhcyBhbnkpLmdldExhdGVzdEJsb2NrSGVpZ2h0KVxuICAgICAgPyAodGhpcy5iYXNlQ29pbiBhcyBhbnkpLmdldExhdGVzdEJsb2NrSGVpZ2h0KHBhcmFtcy5yZXFJZClcbiAgICAgIDogUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgY29uc3QgcXVlcmllcyA9IFtidWlsZFF1ZXJ5LCBibG9ja0hlaWdodFF1ZXJ5XTtcbiAgICBjb25zdCBbYnVpbGRSZXNwb25zZSwgYmxvY2tIZWlnaHRdID0gKGF3YWl0IFByb21pc2UuYWxsKHF1ZXJpZXMpKSBhcyBhbnk7XG4gICAgZGVidWcoJ3Bvc3Rwcm9jZXNzaW5nIHRyYW5zYWN0aW9uIHByZWJ1aWxkOiAlTycsIGJ1aWxkUmVzcG9uc2UpO1xuICAgIGlmICghXy5pc1VuZGVmaW5lZChibG9ja0hlaWdodCkpIHtcbiAgICAgIGJ1aWxkUmVzcG9uc2UuYmxvY2tIZWlnaHQgPSBibG9ja0hlaWdodDtcbiAgICB9XG4gICAgbGV0IHByZWJ1aWxkOiBUcmFuc2FjdGlvblByZWJ1aWxkID0gKGF3YWl0IHRoaXMuYmFzZUNvaW4ucG9zdFByb2Nlc3NQcmVidWlsZChcbiAgICAgIE9iamVjdC5hc3NpZ24oYnVpbGRSZXNwb25zZSwgeyB3YWxsZXQ6IHRoaXMsIGJ1aWxkUGFyYW1zOiB3aGl0ZWxpc3RlZFBhcmFtcyB9KVxuICAgICkpIGFzIGFueTtcbiAgICBkZWxldGUgcHJlYnVpbGQud2FsbGV0O1xuICAgIGRlbGV0ZSBwcmVidWlsZC5idWlsZFBhcmFtcztcbiAgICBwcmVidWlsZCA9IF8uZXh0ZW5kKHt9LCBwcmVidWlsZCwgeyB3YWxsZXRJZDogdGhpcy5pZCgpIH0pO1xuICAgIGlmICh0aGlzLl93YWxsZXQgJiYgdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYyAmJiAhcGFyYW1zLndhbGxldENvbnRyYWN0QWRkcmVzcykge1xuICAgICAgcHJlYnVpbGQgPSBfLmV4dGVuZCh7fSwgcHJlYnVpbGQsIHsgd2FsbGV0Q29udHJhY3RBZGRyZXNzOiB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljLmJhc2VBZGRyZXNzIH0pO1xuICAgIH1cbiAgICBkZWJ1ZygnZmluYWwgdHJhbnNhY3Rpb24gcHJlYnVpbGQ6ICVPJywgcHJlYnVpbGQpO1xuICAgIHJldHVybiBwcmVidWlsZCBhcyBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIFVzZXIgS2V5Y2hhaW4gYW5kIHNpZ24gYSBUU1MgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHR4UmVxdWVzdElkIFRoZSB0cmFuc2FjdGlvbiByZXF1ZXN0IGlkXG4gICAqIEBwYXJhbSB3YWxsZXRQYXNzcGhyYXNlIFRoZSB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcmV0dXJuIFByb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24+XG4gICAqL1xuICBhc3luYyBnZXRVc2VyS2V5QW5kU2lnblRzc1RyYW5zYWN0aW9uKHtcbiAgICB0eFJlcXVlc3RJZCxcbiAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICB9OiB7XG4gICAgdHhSZXF1ZXN0SWQ6IHN0cmluZztcbiAgICB3YWxsZXRQYXNzcGhyYXNlOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPiB7XG4gICAgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgIT09ICd0c3MnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2dldFVzZXJLZXlBbmRTaWduVHNzVHJhbnNhY3Rpb24gaXMgb25seSBzdXBwb3J0ZWQgZm9yIFRTUyB3YWxsZXRzJyk7XG4gICAgfVxuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmdldEtleXNGb3JTaWduaW5nKHsgd2FsbGV0OiB0aGlzLCByZXFJZCB9KTtcblxuICAgIC8vIERvaW5nIGEgc2FuaXR5IGNoZWNrIGZvciBwYXNzd29yZCBoZXJlIHRvIGF2b2lkIGRvaW5nIGZ1cnRoZXIgd29yayBpZiB3ZSBrbm93IGl0J3Mgd3JvbmdcbiAgICBjb25zdCB1c2VyS2V5Y2hhaW4gPSBrZXljaGFpbnNbMF07XG4gICAgaWYgKCF1c2VyS2V5Y2hhaW4gfHwgIXVzZXJLZXljaGFpbi5lbmNyeXB0ZWRQcnYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndGhlIHVzZXIga2V5Y2hhaW4gZG9lcyBub3QgaGF2ZSBwcm9wZXJ0eSBlbmNyeXB0ZWRQcnYnKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuYml0Z28uZGVjcnlwdCh7IGlucHV0OiB1c2VyS2V5Y2hhaW4uZW5jcnlwdGVkUHJ2LCBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKFxuICAgICAgICBgdW5hYmxlIHRvIGRlY3J5cHQga2V5Y2hhaW4gd2l0aCB0aGUgZ2l2ZW4gd2FsbGV0IHBhc3NwaHJhc2UuIEVycm9yOiAke0pTT04uc3RyaW5naWZ5KGUpfWBcbiAgICAgICk7XG4gICAgICBlcnJvci5jb2RlID0gJ3dhbGxldF9wYXNzcGhyYXNlX2luY29ycmVjdCc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zaWduVHJhbnNhY3Rpb24oeyB0eFByZWJ1aWxkOiB7IHR4UmVxdWVzdElkIH0sIHdhbGxldFBhc3NwaHJhc2UsIHJlcUlkLCBrZXljaGFpbjogdXNlcktleWNoYWluIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gYSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIC0gdHhQcmVidWlsZFxuICAgKiAtIFtrZXljaGFpbiAvIGtleV0gKG9iamVjdCkgb3IgcHJ2IChzdHJpbmcpXG4gICAqIC0gd2FsbGV0UGFzc3BocmFzZVxuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgYXN5bmMgc2lnblRyYW5zYWN0aW9uKHBhcmFtczogV2FsbGV0U2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbiB8IFR4UmVxdWVzdD4ge1xuICAgIGNvbnN0IHsgdHhQcmVidWlsZCwgYXBpVmVyc2lvbiwgdHhSZXF1ZXN0SWQgfSA9IHBhcmFtcztcblxuICAgIGlmIChcbiAgICAgIF8uaXNGdW5jdGlvbihwYXJhbXMuY3VzdG9tQ29tbWl0bWVudEdlbmVyYXRpbmdGdW5jdGlvbikgJiZcbiAgICAgIF8uaXNGdW5jdGlvbihwYXJhbXMuY3VzdG9tR1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uKSAmJlxuICAgICAgXy5pc0Z1bmN0aW9uKHBhcmFtcy5jdXN0b21SU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24pXG4gICAgKSB7XG4gICAgICAvLyBpbnZva2UgZXh0ZXJuYWwgc2lnbmVyIFRTUyBmb3IgRWREU0Egd29ya2Zsb3dcbiAgICAgIHJldHVybiB0aGlzLnNpZ25UcmFuc2FjdGlvblRzc0V4dGVybmFsU2lnbmVyRWREU0EocGFyYW1zLCB0aGlzLmJhc2VDb2luKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBfLmlzRnVuY3Rpb24ocGFyYW1zLmN1c3RvbVBhaWxsaWVyTW9kdWx1c0dlbmVyYXRpbmdGdW5jdGlvbikgJiZcbiAgICAgIF8uaXNGdW5jdGlvbihwYXJhbXMuY3VzdG9tS1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uKSAmJlxuICAgICAgXy5pc0Z1bmN0aW9uKHBhcmFtcy5jdXN0b21NdURlbHRhU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24pICYmXG4gICAgICBfLmlzRnVuY3Rpb24ocGFyYW1zLmN1c3RvbVNTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbilcbiAgICApIHtcbiAgICAgIC8vIGludm9rZSBleHRlcm5hbCBzaWduZXIgVFNTIGZvciBFQ0RTQSB3b3JrZmxvd1xuICAgICAgcmV0dXJuIHRoaXMuc2lnblRyYW5zYWN0aW9uVHNzRXh0ZXJuYWxTaWduZXJFQ0RTQSh0aGlzLmJhc2VDb2luLCBwYXJhbXMpO1xuICAgIH1cblxuICAgIGlmICghdHhQcmVidWlsZCB8fCB0eXBlb2YgdHhQcmVidWlsZCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIGlmICh0aGlzLm11bHRpc2lnVHlwZSgpID09PSAnb25jaGFpbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eFByZWJ1aWxkIGlzIHJlcXVpcmVkIGZvciBvbi1jaGFpbiBtdWx0aXNpZyB3YWxsZXRzJyk7XG4gICAgICB9XG4gICAgICBpZiAoIXR4UmVxdWVzdElkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndHhQcmVidWlsZCBvciB0eFJlcXVlc3RJZCBpcyByZXF1aXJlZCBmb3IgVFNTIHdhbGxldHMnKTtcbiAgICAgIH1cbiAgICAgIC8vIFdlIG9ubHkgZG8gdGhpcyBpZiB3ZSdyZSBub3QgdXNpbmcgdGhlIGV4dGVybmFsIHNpZ25lciBUU1MgZmxvd1xuICAgICAgcGFyYW1zLnR4UHJlYnVpbGQgPSB7IHR4UmVxdWVzdElkIH07XG4gICAgfVxuXG4gICAgY29uc3QgcHJlc2lnbiA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ucHJlc2lnblRyYW5zYWN0aW9uKHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHdhbGxldERhdGE6IHRoaXMuX3dhbGxldCxcbiAgICAgIHRzc1V0aWxzOiB0aGlzLnRzc1V0aWxzLFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMubXVsdGlzaWdUeXBlKCkgPT09ICd0c3MnKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaWduVHJhbnNhY3Rpb25Uc3MoeyAuLi5wcmVzaWduLCBwcnY6IHRoaXMuZ2V0VXNlclBydihwcmVzaWduIGFzIEdldFVzZXJQcnZPcHRpb25zKSwgYXBpVmVyc2lvbiB9KTtcbiAgICB9XG5cbiAgICBsZXQgeyBwdWJzIH0gPSBwYXJhbXM7XG4gICAgaWYgKCFwdWJzICYmIHRoaXMuYmFzZUNvaW4ua2V5SWRzRm9yU2lnbmluZygpLmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IGtleWNoYWlucyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0S2V5c0ZvclNpZ25pbmcoeyB3YWxsZXQ6IHRoaXMgfSk7XG4gICAgICBwdWJzID0ga2V5Y2hhaW5zLm1hcCgoaykgPT4ge1xuICAgICAgICBhc3NlcnQoay5wdWIpO1xuICAgICAgICByZXR1cm4gay5wdWI7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBzaWduVHJhbnNhY3Rpb25QYXJhbXMgPSB7XG4gICAgICAuLi5wcmVzaWduLFxuICAgICAgdHhQcmVidWlsZDogeyAuLi50eFByZWJ1aWxkLCB3YWxsZXRJZDogdGhpcy5pZCgpIH0sXG4gICAgICBwdWJzLFxuICAgICAgY29pbjogdGhpcy5iYXNlQ29pbixcbiAgICB9O1xuXG4gICAgaWYgKF8uaXNGdW5jdGlvbihwYXJhbXMuY3VzdG9tU2lnbmluZ0Z1bmN0aW9uKSkge1xuICAgICAgaWYgKHR5cGVvZiB0aGlzLmJhc2VDb2luLnNpZ25XaXRoQ3VzdG9tU2lnbmluZ0Z1bmN0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJhc2VDb2luLnNpZ25XaXRoQ3VzdG9tU2lnbmluZ0Z1bmN0aW9uKHBhcmFtcy5jdXN0b21TaWduaW5nRnVuY3Rpb24sIHNpZ25UcmFuc2FjdGlvblBhcmFtcyk7XG4gICAgICB9XG4gICAgICBjb25zdCBrZXlzID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXRLZXlzRm9yU2lnbmluZyh7IHdhbGxldDogdGhpcyB9KTtcbiAgICAgIGNvbnN0IHNpZ25UcmFuc2FjdGlvblBhcmFtc1dpdGhTZWVkID0ge1xuICAgICAgICAuLi5zaWduVHJhbnNhY3Rpb25QYXJhbXMsXG4gICAgICAgIGRlcml2YXRpb25TZWVkOiBrZXlzWzBdPy5kZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkLFxuICAgICAgfTtcbiAgICAgIHJldHVybiBwYXJhbXMuY3VzdG9tU2lnbmluZ0Z1bmN0aW9uKHNpZ25UcmFuc2FjdGlvblBhcmFtc1dpdGhTZWVkKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYmFzZUNvaW4uc2lnblRyYW5zYWN0aW9uKHtcbiAgICAgIC4uLnNpZ25UcmFuc2FjdGlvblBhcmFtcyxcbiAgICAgIHBydjogdGhpcy5nZXRVc2VyUHJ2KHByZXNpZ24gYXMgR2V0VXNlclBydk9wdGlvbnMpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gYSB0eXBlZCBzdHJ1Y3R1cmVkIGRhdGEgdXNpbmcgVFNTXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIHNpZ25UeXBlZERhdGEocGFyYW1zOiBXYWxsZXRTaWduVHlwZWREYXRhT3B0aW9ucyk6IFByb21pc2U8U2lnbmVkTWVzc2FnZT4ge1xuICAgIGlmICghdGhpcy5iYXNlQ29pbi5zdXBwb3J0c1NpZ25pbmdUeXBlZERhdGEoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTaWduIHR5cGVkIGRhdGEgbm90IHN1cHBvcnRlZCBmb3IgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9YCk7XG4gICAgfVxuICAgIGlmICghcGFyYW1zLnR5cGVkRGF0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUeXBlZCBkYXRhIHJlcXVpcmVkYCk7XG4gICAgfVxuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlICE9PSAndHNzJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXNzYWdlIHNpZ25pbmcgb25seSBzdXBwb3J0ZWQgZm9yIFRTUyB3YWxsZXRzJyk7XG4gICAgfVxuICAgIGlmIChfLmlzRnVuY3Rpb24ocGFyYW1zLnR5cGVkRGF0YS50eXBlZERhdGFSYXcpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R5cGVkRGF0YS50eXBlZERhdGFSYXcgbXVzdCBiZSBKU09OIHN0cmluZycpO1xuICAgIH1cbiAgICBpZiAoXy5pc0Z1bmN0aW9uKCh0aGlzLmJhc2VDb2luIGFzIGFueSkuZW5jb2RlVHlwZWREYXRhKSkge1xuICAgICAgcGFyYW1zLnR5cGVkRGF0YS50eXBlZERhdGFFbmNvZGVkID0gKHRoaXMuYmFzZUNvaW4gYXMgYW55KS5lbmNvZGVUeXBlZERhdGEocGFyYW1zLnR5cGVkRGF0YSk7XG4gICAgfVxuICAgIGNvbnN0IGtleWNoYWlucyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0S2V5c0ZvclNpZ25pbmcoeyB3YWxsZXQ6IHRoaXMsIHJlcUlkOiBwYXJhbXMucmVxSWQgfSk7XG4gICAgY29uc3QgdXNlclBydk9wdGlvbnM6IEdldFVzZXJQcnZPcHRpb25zID0geyAuLi5wYXJhbXMsIGtleWNoYWluOiBrZXljaGFpbnNbMF0gfTtcbiAgICBhc3NlcnQoa2V5Y2hhaW5zWzBdLmNvbW1vbktleWNoYWluLCAnVW5hYmxlIHRvIGZpbmQgY29tbW9uS2V5Y2hhaW4gaW4ga2V5Y2hhaW5zJyk7XG4gICAgY29uc3QgcHJlc2lnbiA9IHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHdhbGxldERhdGE6IHRoaXMuX3dhbGxldCxcbiAgICAgIHRzc1V0aWxzOiB0aGlzLnRzc1V0aWxzLFxuICAgICAgcHJ2OiB0aGlzLmdldFVzZXJQcnYodXNlclBydk9wdGlvbnMpLFxuICAgICAga2V5Y2hhaW46IGtleWNoYWluc1swXSxcbiAgICAgIGJhY2t1cEtleWNoYWluOiBrZXljaGFpbnMubGVuZ3RoID4gMSA/IGtleWNoYWluc1sxXSA6IG51bGwsXG4gICAgICBiaXRnb0tleWNoYWluOiBrZXljaGFpbnMubGVuZ3RoID4gMiA/IGtleWNoYWluc1syXSA6IG51bGwsXG4gICAgICBwdWI6IGtleWNoYWlucy5tYXAoKGspID0+IGsucHViKSxcbiAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5zaWduVHlwZWREYXRhVHNzKHByZXNpZ24pO1xuICB9XG5cbiAgLyoqXG4gICAqICBTaWduIGEgbWVzc2FnZSB1c2luZyBUU1NcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAtIE1lc3NhZ2VcbiAgICogLSBjdXN0b2RpYW5NZXNzYWdlSWRcbiAgICovXG4gIGFzeW5jIHNpZ25NZXNzYWdlKHBhcmFtczogV2FsbGV0U2lnbk1lc3NhZ2VPcHRpb25zID0ge30pOiBQcm9taXNlPFNpZ25lZE1lc3NhZ2U+IHtcbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4uc3VwcG9ydHNNZXNzYWdlU2lnbmluZygpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1lc3NhZ2Ugc2lnbmluZyBub3Qgc3VwcG9ydGVkIGZvciAke3RoaXMuYmFzZUNvaW4uZ2V0RnVsbE5hbWUoKX1gKTtcbiAgICB9XG4gICAgaWYgKCFwYXJhbXMubWVzc2FnZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtZXNzYWdlIHJlcXVpcmVkIHRvIHNpZ24gbWVzc2FnZScpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSAhPT0gJ3RzcycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWVzc2FnZSBzaWduaW5nIG9ubHkgc3VwcG9ydGVkIGZvciBUU1Mgd2FsbGV0cycpO1xuICAgIH1cbiAgICBpZiAoXy5pc0Z1bmN0aW9uKCh0aGlzLmJhc2VDb2luIGFzIGFueSkuZW5jb2RlTWVzc2FnZSkpIHtcbiAgICAgIHBhcmFtcy5tZXNzYWdlLm1lc3NhZ2VFbmNvZGVkID0gKHRoaXMuYmFzZUNvaW4gYXMgYW55KS5lbmNvZGVNZXNzYWdlKHBhcmFtcy5tZXNzYWdlLm1lc3NhZ2VSYXcpO1xuICAgIH1cbiAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmdldEtleXNGb3JTaWduaW5nKHsgd2FsbGV0OiB0aGlzLCByZXFJZDogcGFyYW1zLnJlcUlkIH0pO1xuICAgIGNvbnN0IHVzZXJQcnZPcHRpb25zOiBHZXRVc2VyUHJ2T3B0aW9ucyA9IHsgLi4ucGFyYW1zLCBrZXljaGFpbjoga2V5Y2hhaW5zWzBdIH07XG4gICAgYXNzZXJ0KGtleWNoYWluc1swXS5jb21tb25LZXljaGFpbiwgJ1VuYWJsZSB0byBmaW5kIGNvbW1vbktleWNoYWluIGluIGtleWNoYWlucycpO1xuICAgIGNvbnN0IHByZXNpZ24gPSB7XG4gICAgICAuLi5wYXJhbXMsXG4gICAgICB3YWxsZXREYXRhOiB0aGlzLl93YWxsZXQsXG4gICAgICB0c3NVdGlsczogdGhpcy50c3NVdGlscyxcbiAgICAgIHBydjogdGhpcy5nZXRVc2VyUHJ2KHVzZXJQcnZPcHRpb25zKSxcbiAgICAgIGtleWNoYWluOiBrZXljaGFpbnNbMF0sXG4gICAgICBiYWNrdXBLZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDEgPyBrZXljaGFpbnNbMV0gOiBudWxsLFxuICAgICAgYml0Z29LZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDIgPyBrZXljaGFpbnNbMl0gOiBudWxsLFxuICAgICAgcmVxSWQ6IHBhcmFtcy5yZXFJZCxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLnNpZ25NZXNzYWdlVHNzKHByZXNpZ24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdXNlciBwcml2YXRlIGtleSBmcm9tIGVpdGhlciBhIGRlcml2YXRpb24gb3IgYW4gZW5jcnlwdGVkIGtleWNoYWluXG4gICAqIEBwYXJhbSBbcGFyYW1zLmtleWNoYWluIC8gcGFyYW1zLmtleV0gKG9iamVjdCkgb3IgcGFyYW1zLnBydiAoc3RyaW5nKVxuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgKHN0cmluZylcbiAgICovXG4gIGdldFVzZXJQcnYocGFyYW1zOiBHZXRVc2VyUHJ2T3B0aW9ucyA9IHt9KTogc3RyaW5nIHtcbiAgICBjb25zdCB1c2VyS2V5Y2hhaW4gPSBwYXJhbXMua2V5Y2hhaW4gfHwgcGFyYW1zLmtleTtcbiAgICBsZXQgdXNlclBydiA9IHBhcmFtcy5wcnY7XG4gICAgaWYgKHVzZXJQcnYgJiYgdHlwZW9mIHVzZXJQcnYgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BydiBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgLy8gdXNlIHRoZSBgZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZGAgcHJvcGVydHkgZnJvbSB0aGUgdXNlciBrZXljaGFpbiBhcyB0aGUgYGNvbGREZXJpdmF0aW9uU2VlZGBcbiAgICAvLyBpZiBubyBvdGhlciBgY29sZERlcml2YXRpb25TZWVkYCB3YXMgZXhwbGljaXRseSBwcm92aWRlZFxuICAgIC8vIE9ubHkgZm9yIG9uY2hhaW4gbXVsdGlzaWcgd2FsbGV0cywgVFNTIGtleSBkZXJpdmF0aW9uIGhhcHBlbnMgZHVyaW5nIHRoZSBzaWduaW5nIHByb2Nlc3NcbiAgICBpZiAoXG4gICAgICBwYXJhbXMuY29sZERlcml2YXRpb25TZWVkID09PSB1bmRlZmluZWQgJiZcbiAgICAgIHBhcmFtcy5rZXljaGFpbiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBwYXJhbXMua2V5Y2hhaW4uZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICB0aGlzLm11bHRpc2lnVHlwZSgpID09PSAnb25jaGFpbidcbiAgICApIHtcbiAgICAgIHBhcmFtcy5jb2xkRGVyaXZhdGlvblNlZWQgPSBwYXJhbXMua2V5Y2hhaW4uZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZDtcbiAgICB9XG5cbiAgICBpZiAodXNlclBydiAmJiBwYXJhbXMuY29sZERlcml2YXRpb25TZWVkKSB7XG4gICAgICAvLyB0aGUgZGVyaXZhdGlvbiBvbmx5IG1ha2VzIHNlbnNlIHdoZW4gYSBrZXkgYWxyZWFkeSBleGlzdHNcbiAgICAgIGNvbnN0IGRlcml2YXRpb24gPSB0aGlzLmJhc2VDb2luLmRlcml2ZUtleVdpdGhTZWVkKHsga2V5OiB1c2VyUHJ2LCBzZWVkOiBwYXJhbXMuY29sZERlcml2YXRpb25TZWVkIH0pO1xuICAgICAgdXNlclBydiA9IGRlcml2YXRpb24ua2V5O1xuICAgIH0gZWxzZSBpZiAoIXVzZXJQcnYpIHtcbiAgICAgIGlmICghdXNlcktleWNoYWluIHx8IHR5cGVvZiB1c2VyS2V5Y2hhaW4gIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigna2V5Y2hhaW4gbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVzZXJFbmNyeXB0ZWRQcnYgPSB1c2VyS2V5Y2hhaW4uZW5jcnlwdGVkUHJ2O1xuICAgICAgaWYgKCF1c2VyRW5jcnlwdGVkUHJ2KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigna2V5Y2hhaW4gZG9lcyBub3QgaGF2ZSBwcm9wZXJ0eSBlbmNyeXB0ZWRQcnYnKTtcbiAgICAgIH1cbiAgICAgIGlmICghcGFyYW1zLndhbGxldFBhc3NwaHJhc2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd3YWxsZXRQYXNzcGhyYXNlIHByb3BlcnR5IG1pc3NpbmcnKTtcbiAgICAgIH1cblxuICAgICAgdXNlclBydiA9IHRoaXMuYml0Z28uZGVjcnlwdCh7IGlucHV0OiB1c2VyRW5jcnlwdGVkUHJ2LCBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgfSk7XG4gICAgfVxuICAgIHJldHVybiB1c2VyUHJ2O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHRyYW5zYWN0aW9uIHByZWJ1aWxkIGZyb20gQml0R28sIHZhbGlkYXRlIGl0LCBhbmQgdGhlbiBkZWNyeXB0IHRoZSB1c2VyIGtleSBhbmQgc2lnbiB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgcHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb24ocGFyYW1zOiBQcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24+IHtcbiAgICBpZiAocGFyYW1zLmVpcDE1NTkgJiYgcGFyYW1zLmdhc1ByaWNlKSB7XG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdPbmx5IG9uZSBvZiBwYXJhbXMuZWlwMTU1OSBhbmQgcGFyYW1zLmdhc1ByaWNlIG1heSBiZSBzcGVjaWZpZWQnKTtcbiAgICAgIGVycm9yLmNvZGUgPSAnYm90aF9nYXNQcmljZV9hbmRfZWlwMTU1OWdhc01vZGVsX3NwZWNpZmllZCc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnByZWJ1aWxkVHggJiYgcGFyYW1zLnJlY2lwaWVudHMpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ09ubHkgb25lIG9mIHByZWJ1aWxkVHggYW5kIHJlY2lwaWVudHMgbWF5IGJlIHNwZWNpZmllZCcpO1xuICAgICAgZXJyb3IuY29kZSA9ICdib3RoX3ByZWJ1aWxkdHhfYW5kX3JlY2lwaWVudHNfc3BlY2lmaWVkJztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucmVjaXBpZW50cyAmJiAhQXJyYXkuaXNBcnJheShwYXJhbXMucmVjaXBpZW50cykpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ2V4cGVjdGluZyByZWNpcGllbnRzIGFycmF5Jyk7XG4gICAgICBlcnJvci5jb2RlID0gJ3JlY2lwaWVudHNfbm90X2FycmF5JztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChfLmlzQXJyYXkodGhpcy5fcGVybWlzc2lvbnMpICYmICF0aGlzLl9wZXJtaXNzaW9ucy5pbmNsdWRlcygnc3BlbmQnKSkge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignbm8gc3BlbmQgcGVybWlzc2lvbiBvbiB0aGlzIHdhbGxldCcpO1xuICAgICAgZXJyb3IuY29kZSA9ICd1c2VyX25vdF9hbGxvd2VkX3RvX3NwZW5kX2Zyb21fd2FsbGV0JztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucmVjZWl2ZUFkZHJlc3MgJiYgKHBhcmFtcy50eXBlID09PSAndHJhbnNmZXInIHx8IHBhcmFtcy50eXBlID09PSAndHJhbnNmZXJUb2tlbicpKSB7XG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKGBjYW5ub3QgdXNlIHJlY2VpdmUgYWRkcmVzcyBmb3IgVFNTIHRyYW5zYWN0aW9ucyBvZiB0eXBlICR7cGFyYW1zLnR5cGV9YCk7XG4gICAgICBlcnJvci5jb2RlID0gJ3JlY2VpdmVfYWRkcmVzc19ub3RfYWxsb3dlZF9mb3JfdHNzX3dpdGhkcmF3YWxzJztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucmVjaXBpZW50cyAmJiAocGFyYW1zLnR5cGUgPT09ICdmaWxsTm9uY2UnIHx8IHBhcmFtcy50eXBlID09PSAnYWNjZWxlcmF0aW9uJykpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoYGNhbm5vdCBwcm92aWRlIHJlY2lwaWVudHMgZm9yIHRyYW5zYWN0aW9uIHR5cGUgJHtwYXJhbXMudHlwZX1gKTtcbiAgICAgIGVycm9yLmNvZGUgPSAncmVjaXBpZW50c19ub3RfYWxsb3dlZF9mb3JfZmlsbG5vbmNlX2FuZF9hY2NlbGVyYXRpb25fdHhfdHlwZSc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgY29uc3Qgc3VwcG9ydGVkVHhSZXF1ZXN0VmVyc2lvbnMgPSB0aGlzLnRzc1V0aWxzPy5zdXBwb3J0ZWRUeFJlcXVlc3RWZXJzaW9ucygpIHx8IFtdO1xuICAgIGlmIChwYXJhbXMuYXBpVmVyc2lvbiAmJiAhc3VwcG9ydGVkVHhSZXF1ZXN0VmVyc2lvbnMuaW5jbHVkZXMocGFyYW1zLmFwaVZlcnNpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBwcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbiBwYXJhbXMuYXBpVmVyc2lvbj0ke3BhcmFtcy5hcGlWZXJzaW9ufSBtdXN0IGJlIG9uZSBvZiAke3N1cHBvcnRlZFR4UmVxdWVzdFZlcnNpb25zfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXRLZXlzRm9yU2lnbmluZyh7IHdhbGxldDogdGhpcywgcmVxSWQ6IHBhcmFtcy5yZXFJZCB9KTtcblxuICAgIC8vIERvaW5nIGEgc2FuaXR5IGNoZWNrIGZvciBwYXNzd29yZCBoZXJlIHRvIGF2b2lkIGRvaW5nIGZ1cnRoZXIgd29yayBpZiB3ZSBrbm93IGl0J3Mgd3JvbmdcbiAgICAvLyB3ZSBpZ25vcmUgdGhpcyBjaGVjayB3aXRoIGlmIGN1c3RvbVNpZ25pbmdGdW5jdGlvbiBpcyBwcm92aWRlZFxuICAgIC8vICB3aGljaCBtZWFucyB0aGF0IHRoZSB1c2VyIGlzIGhhbmRsaW5nIHRoZSBzaWduaW5nIGluIGV4dGVybmFsIHNpZ25pbmcgbW9kZVxuICAgIHRyeSB7XG4gICAgICBpZiAoa2V5Y2hhaW5zWzBdLmVuY3J5cHRlZFBydiAmJiAhcGFyYW1zLmN1c3RvbVNpZ25pbmdGdW5jdGlvbiAmJiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkge1xuICAgICAgICB0aGlzLmJpdGdvLmRlY3J5cHQoeyBpbnB1dDoga2V5Y2hhaW5zWzBdLmVuY3J5cHRlZFBydiBhcyBzdHJpbmcsIHBhc3N3b3JkOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKFxuICAgICAgICBgdW5hYmxlIHRvIGRlY3J5cHQga2V5Y2hhaW4gd2l0aCB0aGUgZ2l2ZW4gd2FsbGV0IHBhc3NwaHJhc2UuIEVycm9yOiAke0pTT04uc3RyaW5naWZ5KGUpfWBcbiAgICAgICk7XG4gICAgICBlcnJvci5jb2RlID0gJ3dhbGxldF9wYXNzcGhyYXNlX2luY29ycmVjdCc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBsZXQgdHhQcmVidWlsZFF1ZXJ5OiBQcm9taXNlPFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQgfCBzdHJpbmc+O1xuICAgIGlmIChpc1ByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQocGFyYW1zLnByZWJ1aWxkVHgpICYmIHBhcmFtcy5wcmVidWlsZFR4LmJ1aWxkUGFyYW1zPy5wcmV2aWV3KSB7XG4gICAgICAvLyBJZiB3ZSBwcmVidWlsdCB0aGUgdHhSZXF1ZXN0IHdpdGggcHJldmlldz10cnVlLCB0aGVuIHdlIHNob3VsZCByZWJ1aWxkIHdpdGggcHJldmlldz1mYWxzZSB0byBwZXJzaXN0IHRoZSByZXF1ZXN0XG4gICAgICB0eFByZWJ1aWxkUXVlcnkgPSB0aGlzLnByZWJ1aWxkVHJhbnNhY3Rpb24oe1xuICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIC4uLnsgLi4ucGFyYW1zLnByZWJ1aWxkVHguYnVpbGRQYXJhbXMsIHByZXZpZXc6IGZhbHNlIH0sXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHhQcmVidWlsZFF1ZXJ5ID0gcGFyYW1zLnByZWJ1aWxkVHggPyBQcm9taXNlLnJlc29sdmUocGFyYW1zLnByZWJ1aWxkVHgpIDogdGhpcy5wcmVidWlsZFRyYW5zYWN0aW9uKHBhcmFtcyk7XG4gICAgfVxuXG4gICAgLy8gdGhlIHByZWJ1aWxkIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHByb3ZpZGluZyBhbiBleHBsaWNpdCB0eFxuICAgIGNvbnN0IHR4UHJlYnVpbGQgPSAoYXdhaXQgdHhQcmVidWlsZFF1ZXJ5KSBhcyBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0O1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuYmFzZUNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFBhcmFtczogdHhQcmVidWlsZC5idWlsZFBhcmFtcyB8fCBwYXJhbXMsXG4gICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgIHdhbGxldDogdGhpcyxcbiAgICAgICAgdmVyaWZpY2F0aW9uOiBwYXJhbXMudmVyaWZpY2F0aW9uID8/IHt9LFxuICAgICAgICByZXFJZDogcGFyYW1zLnJlcUlkLFxuICAgICAgICB3YWxsZXRUeXBlOiB0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcigndHJhbnNhY3Rpb24gcHJlYnVpbGQgZmFpbGVkIGxvY2FsIHZhbGlkYXRpb246JywgZS5tZXNzYWdlKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICd0cmFuc2FjdGlvbiBwYXJhbXM6JyxcbiAgICAgICAgXy5vbWl0KHBhcmFtcywgWydrZXljaGFpbicsICdwcnYnLCAncGFzc3BocmFzZScsICd3YWxsZXRQYXNzcGhyYXNlJywgJ2tleScsICd3YWxsZXQnXSlcbiAgICAgICk7XG4gICAgICBjb25zb2xlLmVycm9yKCd0cmFuc2FjdGlvbiBwcmVidWlsZDonLCB0eFByZWJ1aWxkKTtcbiAgICAgIGNvbnNvbGUudHJhY2UoZSk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICAvLyBwYXNzIG91ciB0aHJlZSBrZXlzXG4gICAgY29uc3Qgc2lnbmluZ1BhcmFtcyA9IHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHR4UHJlYnVpbGQsXG4gICAgICB3YWxsZXQ6IHtcbiAgICAgICAgLy8gdGhpcyBpcyB0aGUgdmVyc2lvbiBvZiB0aGUgbXVsdGlzaWcgYWRkcmVzcyBhdCB3YWxsZXQgY3JlYXRpb24gdGltZVxuICAgICAgICBhZGRyZXNzVmVyc2lvbjogdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYy5hZGRyZXNzVmVyc2lvbixcbiAgICAgIH0sXG4gICAgICBrZXljaGFpbjoga2V5Y2hhaW5zWzBdLFxuICAgICAgYmFja3VwS2V5Y2hhaW46IGtleWNoYWlucy5sZW5ndGggPiAxID8ga2V5Y2hhaW5zWzFdIDogbnVsbCxcbiAgICAgIGJpdGdvS2V5Y2hhaW46IGtleWNoYWlucy5sZW5ndGggPiAyID8ga2V5Y2hhaW5zWzJdIDogbnVsbCxcbiAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgfTtcbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSA9PT0gJ29uY2hhaW4nKSB7XG4gICAgICBzaWduaW5nUGFyYW1zLnB1YnMgPSBrZXljaGFpbnMubWFwKChrKSA9PiB7XG4gICAgICAgIGFzc2VydChrLnB1Yik7XG4gICAgICAgIHJldHVybiBrLnB1YjtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChzaWduaW5nUGFyYW1zLnR4UHJlYnVpbGQudHhSZXF1ZXN0SWQpIHtcbiAgICAgIGFzc2VydCh0aGlzLnRzc1V0aWxzLCAndHNzVXRpbHMgbXVzdCBiZSBkZWZpbmVkIGZvciBUU1Mgd2FsbGV0cycpO1xuICAgICAgY29uc3QgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscy5nZXRUeFJlcXVlc3Qoc2lnbmluZ1BhcmFtcy50eFByZWJ1aWxkLnR4UmVxdWVzdElkKTtcbiAgICAgIGlmICh0aGlzLnRzc1V0aWxzLmlzUGVuZGluZ0FwcHJvdmFsVHhSZXF1ZXN0RnVsbCh0eFJlcXVlc3QpKSB7XG4gICAgICAgIHJldHVybiB0eFJlcXVlc3Q7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNpZ25UcmFuc2FjdGlvbihzaWduaW5nUGFyYW1zKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ2luc3VmZmljaWVudCBmdW5kcycpKSB7XG4gICAgICAgIGVycm9yLmNvZGUgPSAnaW5zdWZmaWNpZW50X2Z1bmRzJztcbiAgICAgICAgZXJyb3Iud2FsbGV0QmFsYW5jZXMgPSB7XG4gICAgICAgICAgYmFsYW5jZVN0cmluZzogdGhpcy5iYWxhbmNlU3RyaW5nKCksXG4gICAgICAgICAgY29uZmlybWVkQmFsYW5jZVN0cmluZzogdGhpcy5jb25maXJtZWRCYWxhbmNlU3RyaW5nKCksXG4gICAgICAgICAgc3BlbmRhYmxlQmFsYW5jZVN0cmluZzogdGhpcy5zcGVuZGFibGVCYWxhbmNlU3RyaW5nKCksXG4gICAgICAgICAgYmFsYW5jZTogdGhpcy5iYWxhbmNlKCksXG4gICAgICAgICAgY29uZmlybWVkQmFsYW5jZTogdGhpcy5jb25maXJtZWRCYWxhbmNlKCksXG4gICAgICAgICAgc3BlbmRhYmxlQmFsYW5jZTogdGhpcy5zcGVuZGFibGVCYWxhbmNlKCksXG4gICAgICAgIH07XG4gICAgICAgIGVycm9yLnR4UGFyYW1zID0gXy5vbWl0KHBhcmFtcywgWydrZXljaGFpbicsICdwcnYnLCAncGFzc3BocmFzZScsICd3YWxsZXRQYXNzcGhyYXNlJywgJ2tleSddKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBY2NlbGVyYXRlIGEgdHJhbnNhY3Rpb24ncyBjb25maXJtYXRpb24gdXNpbmcgQ2hpbGQtUGF5cy1Gb3ItUGFyZW50IChDUEZQKVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBhY2NlbGVyYXRlVHJhbnNhY3Rpb24ocGFyYW1zOiBBY2NlbGVyYXRlVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIC8vIFRPRE8oQkctOTM0OSk6IGNoYW5nZSB0aGUgbGFzdCBjaGVjayB0byA+IDAgYW5kIHRoZSBlcnJvciBtZXNzYWdlIG9uY2UgcGxhdGZvcm0gYWxsb3dzIG11bHRpcGxlIHRyYW5zYWN0aW9ucyB0b1xuICAgIC8vICAgICAgICAgICAgICAgIGJlIGJ1bXBlZCBpbiB0aGUgc2FtZSBDUEZQIHRyYW5zYWN0aW9uXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmNwZnBUeElkcykgfHwgIUFycmF5LmlzQXJyYXkocGFyYW1zLmNwZnBUeElkcykgfHwgcGFyYW1zLmNwZnBUeElkcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ2V4cGVjdGluZyBjcGZwVHhJZHMgdG8gYmUgYW4gYXJyYXkgb2YgbGVuZ3RoIDEnKTtcbiAgICAgIGVycm9yLmNvZGUgPSAnY3BmcHR4aWRzX25vdF9hcnJheSc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuY3BmcEZlZVJhdGUpKSB7XG4gICAgICBpZiAocGFyYW1zLm5vQ3BmcEZlZVJhdGUgIT09IHRydWUpIHtcbiAgICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignY3BmcEZlZVJhdGUgbXVzdCBiZSBzZXQgdW5sZXNzIG5vQ3BmcEZlZVJhdGUgaXMgc2V0Jyk7XG4gICAgICAgIGVycm9yLmNvZGUgPSAnY3BmcGZlZXJhdGVfbm90X3NldCc7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5jcGZwRmVlUmF0ZSkgfHwgcGFyYW1zLmNwZnBGZWVSYXRlIDwgMCkge1xuICAgICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdjcGZwRmVlUmF0ZSBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXInKTtcbiAgICAgICAgZXJyb3IuY29kZSA9ICdjcGZwZmVlcmF0ZV9ub3Rfbm9ubmVnYXRpdmVfaW50ZWdlcic7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5tYXhGZWUpKSB7XG4gICAgICBpZiAocGFyYW1zLm5vTWF4RmVlICE9PSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ21heEZlZSBtdXN0IGJlIHNldCB1bmxlc3Mgbm9NYXhGZWUgaXMgc2V0Jyk7XG4gICAgICAgIGVycm9yLmNvZGUgPSAnbWF4ZmVlX25vdF9zZXQnO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMubWF4RmVlKSB8fCBwYXJhbXMubWF4RmVlIDwgMCkge1xuICAgICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdtYXhGZWUgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyJyk7XG4gICAgICAgIGVycm9yLmNvZGUgPSAnbWF4ZmVlX25vdF9ub25uZWdhdGl2ZV9pbnRlZ2VyJztcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5yZWNpcGllbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJhbXMucmVjaXBpZW50cykgfHwgcGFyYW1zLnJlY2lwaWVudHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCB2YWx1ZSBmb3IgJ3JlY2lwaWVudHMnOiBtdXN0IGJlIGVtcHR5IGFycmF5IHdoZW4gc2V0YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGFyYW1zLnJlY2lwaWVudHMgPSBbXTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKHtcbiAgICAgIC4uLihhd2FpdCB0aGlzLnByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uKHBhcmFtcykpLFxuICAgICAgLi4uQnVpbGRQYXJhbXMuZW5jb2RlKHBhcmFtcyksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3VibWl0IGEgaGFsZi1zaWduZWQgdHJhbnNhY3Rpb24gdG8gQml0R29cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAtIHR4SGV4OiB0cmFuc2FjdGlvbiBoZXggdG8gc3VibWl0XG4gICAqIC0gaGFsZlNpZ25lZDogb2JqZWN0IGNvbnRhaW5pbmcgdHJhbnNhY3Rpb24gKHR4SGV4IG9yIHR4QmFzZTY0KSB0byBzdWJtaXRcbiAgICovXG4gIGFzeW5jIHN1Ym1pdFRyYW5zYWN0aW9uKHBhcmFtczogU3VibWl0VHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ290cCcsICd0eEhleCcsICd0eFJlcXVlc3RJZCddKTtcbiAgICBjb25zdCBoYXNUeEhleCA9ICEhcGFyYW1zLnR4SGV4O1xuICAgIGNvbnN0IGhhc0hhbGZTaWduZWQgPSAhIXBhcmFtcy5oYWxmU2lnbmVkO1xuXG4gICAgaWYgKHBhcmFtcy50eFJlcXVlc3RJZCAmJiAoaGFzVHhIZXggfHwgaGFzSGFsZlNpZ25lZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBzdXBwbHkgZXhhY3RseSBvbmUgb2YgdHhSZXF1ZXN0SWQsIHR4SGV4LCBvciBoYWxmU2lnbmVkJyk7XG4gICAgfSBlbHNlIGlmICghcGFyYW1zLnR4UmVxdWVzdElkICYmICgoaGFzVHhIZXggJiYgaGFzSGFsZlNpZ25lZCkgfHwgKCFoYXNUeEhleCAmJiAhaGFzSGFsZlNpZ25lZCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ211c3Qgc3VwcGx5IGVpdGhlciB0eEhleCBvciBoYWxmU2lnbmVkLCBidXQgbm90IGJvdGgnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2VuZFRyYW5zYWN0aW9uKHBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBjb2lucyB0byBhIHJlY2lwaWVudFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMuYWRkcmVzcyAtIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzXG4gICAqIEBwYXJhbSBwYXJhbXMuYW1vdW50IC0gdGhlIGFtb3VudCBpbiBzYXRvc2hpcy93ZWkvYmFzZSB2YWx1ZSB0byBiZSBzZW50XG4gICAqIEBwYXJhbSBwYXJhbXMubWVzc2FnZSAtIG9wdGlvbmFsIG1lc3NhZ2UgdG8gYXR0YWNoIHRvIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXMuZGF0YSAtIFtFdGhlcmV1bSBTcGVjaWZpY10gb3B0aW9uYWwgZGF0YSB0byBwYXNzIHRvIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXMuY3VzdG9kaWFuVHJhbnNhY3Rpb25JZCAtIFtFdGhlcmV1bS9NTUkgU3BlY2lmaWNdIGlkIG9mIHRyYW5zYWN0aW9uIGNyZWF0ZWQgdmlhIG1ldGFtYXNrXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIHRoZSBwYXNzcGhyYXNlIHRvIGJlIHVzZWQgdG8gZGVjcnlwdCB0aGUgdXNlciBrZXkgb24gdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtcy5wcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0sIGlmIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuICAgKiBAcGFyYW0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gdGhlIG1pbmltdW0gY29uZmlybWF0aW9uIHRocmVzaG9sZCBmb3IgaW5wdXRzXG4gICAqIEBwYXJhbSBwYXJhbXMuZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlIC0gd2hldGhlciB0byBlbmZvcmNlIG1pbkNvbmZpcm1zIGZvciBjaGFuZ2UgaW5wdXRzXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgc2VuZChwYXJhbXM6IFNlbmRPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnYWRkcmVzcyddLCBbJ21lc3NhZ2UnLCAnZGF0YSddKTtcblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5hbW91bnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyIGFtb3VudCcpO1xuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5hZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciBhZGRyZXNzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29pbiA9IHRoaXMuYmFzZUNvaW47XG5cbiAgICBjb25zdCBhbW91bnQgPSBuZXcgQmlnTnVtYmVyKHBhcmFtcy5hbW91bnQpO1xuICAgIGlmIChhbW91bnQuaXNOZWdhdGl2ZSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGFtb3VudCAtIHBvc2l0aXZlIG51bWJlciBncmVhdGVyIHRoYW4gemVybyBvciBudW1lcmljIHN0cmluZyBleHBlY3RlZCcpO1xuICAgIH1cblxuICAgIGlmICghY29pbi52YWx1ZWxlc3NUcmFuc2ZlckFsbG93ZWQoKSAmJiBhbW91bnQuaXNaZXJvKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgYW1vdW50IC0gcG9zaXRpdmUgbnVtYmVyIGdyZWF0ZXIgdGhhbiB6ZXJvIG9yIG51bWVyaWMgc3RyaW5nIGV4cGVjdGVkJyk7XG4gICAgfVxuICAgIGNvbnN0IHJlY2lwaWVudHM6IFNlbmRNYW55T3B0aW9uc1sncmVjaXBpZW50cyddID0gW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiBwYXJhbXMuYWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiBwYXJhbXMuYW1vdW50LFxuICAgICAgfSxcbiAgICBdO1xuICAgIGlmIChwYXJhbXMudG9rZW5OYW1lKSB7XG4gICAgICByZWNpcGllbnRzWzBdLnRva2VuTmFtZSA9IHBhcmFtcy50b2tlbk5hbWU7XG4gICAgfVxuICAgIGlmIChwYXJhbXMuZGF0YSAmJiBjb2luLnRyYW5zYWN0aW9uRGF0YUFsbG93ZWQoKSkge1xuICAgICAgcmVjaXBpZW50c1swXS5kYXRhID0gcGFyYW1zLmRhdGE7XG4gICAgfVxuICAgIGNvbnN0IHNlbmRNYW55T3B0aW9uczogU2VuZE1hbnlPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgcGFyYW1zLCB7IHJlY2lwaWVudHMgfSk7XG4gICAgcmV0dXJuIHRoaXMuc2VuZE1hbnkoc2VuZE1hbnlPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIG1vbmV5IHRvIG11bHRpcGxlIHJlY2lwaWVudHNcbiAgICogMS4gR2V0cyB0aGUgdXNlciBrZXljaGFpbiBieSBjaGVja2luZyB0aGUgd2FsbGV0IGZvciBhIGtleSB3aGljaCBoYXMgYW4gZW5jcnlwdGVkIHBydlxuICAgKiAyLiBEZWNyeXB0cyB1c2VyIGtleVxuICAgKiAzLiBDcmVhdGVzIHRoZSB0cmFuc2FjdGlvbiB3aXRoIGRlZmF1bHQgZmVlXG4gICAqIDQuIFNpZ25zIHRyYW5zYWN0aW9uIHdpdGggZGVjcnlwdGVkIHVzZXIga2V5XG4gICAqIDUuIFNlbmRzIHRoZSB0cmFuc2FjdGlvbiB0byBCaXRHb1xuICAgKiBAcGFyYW0ge29iamVjdH0gcGFyYW1zXG4gICAqIEBwYXJhbSB7e2FkZHJlc3M6IHN0cmluZywgYW1vdW50OiBzdHJpbmd9fSBwYXJhbXMucmVjaXBpZW50cyAtIGxpc3Qgb2YgcmVjaXBpZW50cyBhbmQgbmVjZXNzYXJ5IHJlY2lwaWVudCBpbmZvcm1hdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm51bUJsb2NrcyAtIEVzdGltYXRlcyB0aGUgYXBwcm94aW1hdGUgZmVlIHBlciBraWxvYnl0ZSBuZWNlc3NhcnkgZm9yIGEgdHJhbnNhY3Rpb24gY29uZmlybWF0aW9uIHdpdGhpbiBudW1CbG9ja3MgYmxvY2tzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlUmF0ZSAtIHRoZSBkZXNpcmVkIGZlZVJhdGUgZm9yIHRoZSB0cmFuc2FjdGlvbiBpbiBzYXRvdGhpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVJhdGUgLSB1cHBlciBsaW1pdCBmb3IgZmVlUmF0ZSBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gYWxsIHNlbGVjdGVkIHVuc3BlbnRzIHdpbGwgaGF2ZSBhdCBsZWFzdCB0aGlzIG1hbnkgY29uZmlybWF0aW9uc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5lbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UgLSBFbmZvcmNlcyBtaW5Db25maXJtcyBvbiBjaGFuZ2UgaW5wdXRzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMudGFyZ2V0V2FsbGV0VW5zcGVudHMgLSBUaGUgZGVzaXJlZCBjb3VudCBvZiB1bnNwZW50cyBpbiB0aGUgd2FsbGV0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMubWVzc2FnZSAtIG9wdGlvbmFsIG1lc3NhZ2UgdG8gYXR0YWNoIHRvIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWluVmFsdWUgLSBJZ25vcmUgdW5zcGVudHMgc21hbGxlciB0aGFuIHRoaXMgYW1vdW50IG9mIHNhdG9zaGlzXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWF4VmFsdWUgLSBJZ25vcmUgdW5zcGVudHMgbGFyZ2VyIHRoYW4gdGhpcyBhbW91bnQgb2Ygc2F0b3NoaXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5zZXF1ZW5jZUlkIC0gVGhlIHNlcXVlbmNlIElEIG9mIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmxhc3RMZWRnZXJTZXF1ZW5jZSAtIEFic29sdXRlIG1heCBsZWRnZXIgdGhlIHRyYW5zYWN0aW9uIHNob3VsZCBiZSBhY2NlcHRlZCBpbiwgd2hlcmVhZnRlciBpdCB3aWxsIGJlIHJlamVjdGVkLlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmxlZGdlclNlcXVlbmNlRGVsdGEgLSBSZWxhdGl2ZSBsZWRnZXIgaGVpZ2h0IChpbiByZWxhdGlvbiB0byB0aGUgY3VycmVudCBsZWRnZXIpIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHNob3VsZCBiZSBhY2NlcHRlZCBpbiwgd2hlcmVhZnRlciBpdCB3aWxsIGJlIHJlamVjdGVkLlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmdhc1ByaWNlIC0gQ3VzdG9tIGdhcyBwcmljZSB0byBiZSB1c2VkIGZvciBzZW5kaW5nIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5ub1NwbGl0Q2hhbmdlIC0gU2V0IHRvIHRydWUgdG8gZGlzYWJsZSBhdXRvbWF0aWMgY2hhbmdlIHNwbGl0dGluZyBmb3IgcHVycG9zZXMgb2YgdW5zcGVudCBtYW5hZ2VtZW50XG4gICAqIEBwYXJhbSB7QXJyYXl9IHBhcmFtcy51bnNwZW50cyAtIFRoZSB1bnNwZW50cyB0byB1c2UgaW4gdGhlIHRyYW5zYWN0aW9uLiBFYWNoIHVuc3BlbnQgc2hvdWxkIGJlIGluIHRoZSBmb3JtIHByZXZUeElkOm5PdXRwdXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5jb21tZW50IC0gQW55IGFkZGl0aW9uYWwgY29tbWVudCB0byBhdHRhY2ggdG8gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMub3RwIC0gVHdvIGZhY3RvciBhdXRoIGNvZGUgdG8gZW5hYmxlIHNlbmRpbmcgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuY2hhbmdlQWRkcmVzcyAtIFNwZWNpZmllcyB0aGUgZGVzdGluYXRpb24gb2YgdGhlIGNoYW5nZSBvdXRwdXRcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuaW5zdGFudCAtIFNlbmQgdGhpcyB0cmFuc2FjdGlvbiB1c2luZyBjb2luLXNwZWNpZmljIGluc3RhbnQgc2VuZGluZyBtZXRob2QgKGlmIGF2YWlsYWJsZSlcbiAgICogQHBhcmFtIHt7dmFsdWU6IFN0cmluZywgdHlwZTogU3RyaW5nfX0gcGFyYW1zLm1lbW8gLSBNZW1vIHRvIHVzZSBpbiB0cmFuc2FjdGlvbiAoc3VwcG9ydGVkIGJ5IFN0ZWxsYXIpXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMudHlwZSAtIFR5cGUgb2YgdGhlIHRyYW5zYWN0aW9uIChlLmcuIHRydXN0bGluZSlcbiAgICogQHBhcmFtIHt7dG9rZW46IHBhcmFtcywgYWN0aW9uOiBTdHJpbmcsIGxpbWl0OiBTdHJpbmd9W119IG9wdGlvbnMudHJ1c3RsaW5lcyAtIEFycmF5IG9mIHRydXN0bGluZXMgdG8gbWFuYWdlIChzdXBwb3J0ZWQgYnkgU3RlbGxhcilcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBzZW5kTWFueShwYXJhbXM6IFNlbmRNYW55T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgWydjb21tZW50JywgJ290cCddKTtcbiAgICBkZWJ1Zygnc2VuZE1hbnkgY2FsbGVkJyk7XG4gICAgY29uc3QgcmVxSWQgPSBwYXJhbXMucmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICBwYXJhbXMucmVxSWQgPSByZXFJZDtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgIGNvbnN0IGNvaW4gPSB0aGlzLmJhc2VDb2luO1xuICAgIGlmIChfLmlzT2JqZWN0KHBhcmFtcy5yZWNpcGllbnRzKSkge1xuICAgICAgcGFyYW1zLnJlY2lwaWVudHMubWFwKGZ1bmN0aW9uIChyZWNpcGllbnQpIHtcbiAgICAgICAgY29uc3QgYW1vdW50ID0gbmV3IEJpZ051bWJlcihyZWNpcGllbnQuYW1vdW50KTtcbiAgICAgICAgaWYgKGFtb3VudC5pc05lZ2F0aXZlKCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGFtb3VudCAtIHBvc2l0aXZlIG51bWJlciBncmVhdGVyIHRoYW4gemVybyBvciBudW1lcmljIHN0cmluZyBleHBlY3RlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY29pbi52YWx1ZWxlc3NUcmFuc2ZlckFsbG93ZWQoKSAmJiBhbW91bnQuaXNaZXJvKCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGFtb3VudCAtIHBvc2l0aXZlIG51bWJlciBncmVhdGVyIHRoYW4gemVybyBvciBudW1lcmljIHN0cmluZyBleHBlY3RlZCcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSA9PT0gJ3RzcycpIHtcbiAgICAgIHJldHVybiB0aGlzLnNlbmRNYW55VHNzKHBhcmFtcyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0UGFyYW1zID0gXy5waWNrKHBhcmFtcywgWy4uLnRoaXMucHJlYnVpbGRXaGl0ZWxpc3RlZFBhcmFtcygpLCAnY29tbWVudCcsICdvdHAnLCAnaG9wJ10pO1xuXG4gICAgaWYgKHRoaXMuX3dhbGxldC50eXBlID09PSAnY3VzdG9kaWFsJykge1xuICAgICAgY29uc3QgZXh0cmFQYXJhbXMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLmdldEV4dHJhUHJlYnVpbGRQYXJhbXMoT2JqZWN0LmFzc2lnbihwYXJhbXMsIHsgd2FsbGV0OiB0aGlzIH0pKTtcbiAgICAgIE9iamVjdC5hc3NpZ24oc2VsZWN0UGFyYW1zLCBleHRyYVBhcmFtcyk7XG4gICAgICByZXR1cm4gdGhpcy5pbml0aWF0ZVRyYW5zYWN0aW9uKHNlbGVjdFBhcmFtcyk7XG4gICAgfVxuXG4gICAgY29uc3QgaGFsZlNpZ25lZFRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5wcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbihwYXJhbXMpO1xuICAgIGNvbnN0IGZpbmFsVHhQYXJhbXMgPSBfLmV4dGVuZCh7fSwgaGFsZlNpZ25lZFRyYW5zYWN0aW9uLCBzZWxlY3RQYXJhbXMpO1xuICAgIHJldHVybiB0aGlzLnNlbmRUcmFuc2FjdGlvbihmaW5hbFR4UGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvdmVyIGFuIHVuc3VwcG9ydGVkIHRva2VuIGZyb20gYSBCaXRHbyBtdWx0aXNpZyB3YWxsZXRcbiAgICogcGFyYW1zIGFyZSB2YWxpZGF0ZWQgaW4gRXRoLnByb3RvdHlwZS5yZWNvdmVyVG9rZW5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLnRva2VuQ29udHJhY3RBZGRyZXNzIHRoZSBjb250cmFjdCBhZGRyZXNzIG9mIHRoZSB1bnN1cHBvcnRlZCB0b2tlblxuICAgKiBAcGFyYW0gcGFyYW1zLnJlY2lwaWVudCB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyByZWNvdmVyZWQgdG9rZW5zIHNob3VsZCBiZSBzZW50IHRvXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSB0aGUgd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogQHBhcmFtIHBhcmFtcy5wcnYgdGhlIHhwcnZcbiAgICovXG4gIGFzeW5jIHJlY292ZXJUb2tlbihwYXJhbXM6IFJlY292ZXJUb2tlbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgIT09ICdldGgnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Rva2VuIHJlY292ZXJ5IG9ubHkgc3VwcG9ydGVkIGZvciBldGggd2FsbGV0cycpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgdG9rZW5Db250cmFjdEFkZHJlc3MsIHJlY2lwaWVudCB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQodG9rZW5Db250cmFjdEFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgc3RyaW5nIHBhcmFtZXRlciB0b2tlbkNvbnRyYWN0QWRkcmVzcycpO1xuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHJlY2lwaWVudCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBzdHJpbmcgcGFyYW1ldGVyIHJlY2lwaWVudCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlY292ZXJUb2tlbk9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHsgdG9rZW5Db250cmFjdEFkZHJlc3MsIHJlY2lwaWVudCB9LCBwYXJhbXMsIHsgd2FsbGV0OiB0aGlzIH0pO1xuICAgIHJldHVybiB0aGlzLmJhc2VDb2luLnJlY292ZXJUb2tlbihyZWNvdmVyVG9rZW5PcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdHJhbnNhY3Rpb24gbWV0YWRhdGEgZm9yIHRoZSBvbGRlc3QgdHJhbnNhY3Rpb24gdGhhdCBpcyBzdGlsbCBwZW5kaW5nIG9yIGF0dGVtcHRlZFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IE9iamVjdCB3aXRoIHR4aWQsIHdhbGxldElkLCB0eCwgYW5kIGZlZSAoaWYgc3VwcG9ydGVkIGZvciBjb2luKVxuICAgKi9cbiAgYXN5bmMgZ2V0Rmlyc3RQZW5kaW5nVHJhbnNhY3Rpb24ocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBuZXZlcj4gPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGludGVybmFsLmdldEZpcnN0UGVuZGluZ1RyYW5zYWN0aW9uKHsgd2FsbGV0SWQ6IHRoaXMuaWQoKSB9LCB0aGlzLmJhc2VDb2luLCB0aGlzLmJpdGdvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGFuZ2UgdGhlIGZlZSBvbiB0aGUgcGVuZGluZyB0cmFuc2FjdGlvbiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiB0eGlkIHRvIHRoZSBnaXZlbiBuZXcgZmVlXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy50eGlkIFRoZSB0cmFuc2FjdGlvbiBJZCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0cmFuc2FjdGlvbiB3aG9zZSBmZWUgaXMgdG8gYmUgY2hhbmdlZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gW3BhcmFtcy5mZWVdIE9wdGlvbmFsIC0gVGhlIG5ldyBmZWUgdG8gYXBwbHkgdG8gdGhlIGRlbm90ZWQgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXMuZWlwMTU1OV0gT3B0aW9uYWwgLSB0aGUgZWlwMTU1OSB2YWx1ZXMgdG8gYXBwbHkgdG8gdGhlIGRlbm90ZWQgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybnMge1N0cmluZ30gVGhlIHRyYW5zYWN0aW9uIElEIG9mIHRoZSBuZXcgdHJhbnNhY3Rpb24gdGhhdCBjb250YWlucyB0aGUgbmV3IGZlZSByYXRlXG4gICAqL1xuICBhc3luYyBjaGFuZ2VGZWUocGFyYW1zOiBDaGFuZ2VGZWVPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmIChwYXJhbXMuZmVlKSBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3R4aWQnLCAnZmVlJ10sIFtdKTtcbiAgICBpZiAocGFyYW1zLmVpcDE1NTkpIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMuZWlwMTU1OSwgWydtYXhGZWVQZXJHYXMnLCAnbWF4UHJpb3JpdHlGZWVQZXJHYXMnXSk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLmlkKCkgKyAnL3R4L2NoYW5nZUZlZScpKVxuICAgICAgLnNlbmQocGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGluZm8gZnJvbSBtZXJjaGFudCBzZXJ2ZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBUaGUgcGFyYW1zIHBhc3NlZCBpbnRvIHRoZSBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnVybCBUaGUgVXJsIHRvIHJldHJpZXZlIGluZm8gZnJvbVxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgaW5mbyByZXR1cm5lZCBmcm9tIHRoZSBtZXJjaGFudCBzZXJ2ZXJcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGFzeW5jIGdldFBheW1lbnRJbmZvKHBhcmFtczogeyB1cmw/OiBzdHJpbmcgfSA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd1cmwnXSwgW10pO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvcGF5bWVudEluZm8nKSkucXVlcnkocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGpzb24gcGF5bWVudCByZXNwb25zZVxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIFRoZSBwYXJhbXMgcGFzc2VkIGludG8gdGhlIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMucGF5bWVudFVybCAtIFRoZSB1cmwgdG8gc2VuZCB0aGUgZnVsbHkgc2lnbmVkIHRyYW5zYWN0aW9uIHRvXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMudHhIZXggLSBUaGUgdHJhbnNhY3Rpb24gaGV4IG9mIHRoZSBwYXltZW50XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMubWVtbyB7U3RyaW5nfSAtIEEgbWVtbyBzdXBwbGllZCBieSB0aGUgbWVyY2hhbnQsIHRvIGJlIGluc2VydGVkIGludG8gdGhlIHRyYW5zZmVyIGFzIHRoZSBjb21tZW50XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuZXhwaXJlcyB7U3RyaW5nfSAtIElTTyBEYXRlIGZvcm1hdCBvZiB3aGVuIHRoZSBwYXltZW50IHJlcXVlc3QgZXhwaXJlc1xuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgaW5mbyByZXR1cm5lZCBmcm9tIHRoZSBtZXJjaGFudCBzZXJ2ZXIgUGF5bWVudCBBY2tcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGFzeW5jIHNlbmRQYXltZW50UmVzcG9uc2UocGFyYW1zOiBhbnkgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL3NlbmRQYXltZW50JykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBwb2xpY3kgcnVsZVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMuY29uZGl0aW9uIGNvbmRpdGlvbiBvYmplY3RcbiAgICogQHBhcmFtIHBhcmFtcy5hY3Rpb24gYWN0aW9uIG9iamVjdFxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVBvbGljeVJ1bGUocGFyYW1zOiBDcmVhdGVQb2xpY3lSdWxlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJywgJ3R5cGUnXSwgWydtZXNzYWdlJ10pO1xuXG4gICAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcy5jb25kaXRpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcGFyYW1ldGVyOiBjb25kaXRpb25zIG9iamVjdCcpO1xuICAgIH1cblxuICAgIGlmICghXy5pc09iamVjdChwYXJhbXMuYWN0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHBhcmFtZXRlcjogYWN0aW9uIG9iamVjdCcpO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9wb2xpY3kvcnVsZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGEgcG9saWN5IHJ1bGVcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLmNvbmRpdGlvbiBjb25kaXRpb24gb2JqZWN0XG4gICAqIEBwYXJhbSBwYXJhbXMuYWN0aW9uIGFjdGlvbiBvYmplY3RcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBzZXRQb2xpY3lSdWxlKHBhcmFtczogYW55ID0ge30pIHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJywgJ3R5cGUnXSwgWydtZXNzYWdlJ10pO1xuXG4gICAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcy5jb25kaXRpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcGFyYW1ldGVyOiBjb25kaXRpb25zIG9iamVjdCcpO1xuICAgIH1cblxuICAgIGlmICghXy5pc09iamVjdChwYXJhbXMuYWN0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHBhcmFtZXRlcjogYWN0aW9uIG9iamVjdCcpO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLnB1dCh0aGlzLnVybCgnL3BvbGljeS9ydWxlJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgUG9saWN5IFJ1bGVcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHJlbW92ZVBvbGljeVJ1bGUocGFyYW1zOiBSZW1vdmVQb2xpY3lSdWxlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJ10sIFsnbWVzc2FnZSddKTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmRlbCh0aGlzLnVybCgnL3BvbGljeS9ydWxlJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHJlbW92ZShwYXJhbXM6IFJlY29yZDxzdHJpbmcsIG5ldmVyPiA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5iaXRnby5kZWwodGhpcy51cmwoKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBjcm9zc0NoYWluIFVUWE9zXG4gICAqIEN1cnJlbnRseSBvbmx5IGZvciBBVkFYXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMuc291cmNlQ2hhaW4gdGhlIHNvdXJjZWNoYWluIHRvIHBpY2sgVVRYT3MsIGlmIG5vdCBnaXZlbiwgdGhlbiBwaWNrIGZyb20gYWxsIGF2YWlsYWJsZSBjaGFpbnMgW1AsIENdXG4gICAqL1xuICBmZXRjaENyb3NzQ2hhaW5VVFhPcyhwYXJhbXM6IEZldGNoQ3Jvc3NDaGFpblVUWE9zT3B0aW9ucyk6IFByb21pc2U8Q3Jvc3NDaGFpblVUWE9bXT4ge1xuICAgIGNvbnN0IHF1ZXJ5ID0gXy5waWNrKHBhcmFtcywgWydzb3VyY2VDaGFpbiddKTtcbiAgICByZXR1cm4gdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy9jcm9zc0NoYWluVW5zcGVudHMnKSkucXVlcnkocXVlcnkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3QgYSBKU09OIHJlcHJlc2VudGFibGUgdmVyc2lvbiBvZiB0aGlzIHdhbGxldFxuICAgKi9cbiAgdG9KU09OKCk6IFdhbGxldERhdGEge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQ7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgdHJhZGluZyBhY2NvdW50IGZyb20gdGhpcyB3YWxsZXRcbiAgICovXG4gIHRvVHJhZGluZ0FjY291bnQoKTogVHJhZGluZ0FjY291bnQge1xuICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpICE9PSAnb2ZjJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gb25seSBjb252ZXJ0IGFuIE9mZmNoYWluIChPRkMpIHdhbGxldCB0byBhIHRyYWRpbmcgYWNjb3VudCcpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFRyYWRpbmdBY2NvdW50KHRoaXMuX3dhbGxldC5lbnRlcnByaXNlLCB0aGlzLCB0aGlzLmJpdGdvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBzdGFraW5nIHdhbGxldCBmcm9tIHRoaXMgd2FsbGV0XG4gICAqL1xuICB0b1N0YWtpbmdXYWxsZXQoKTogU3Rha2luZ1dhbGxldCB7XG4gICAgY29uc3QgaXNFdGhUc3MgPVxuICAgICAgdGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSA9PSAnZXRoJyAmJiB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljPy53YWxsZXRWZXJzaW9uXG4gICAgICAgID8gdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYy53YWxsZXRWZXJzaW9uID49IDNcbiAgICAgICAgOiBmYWxzZTtcbiAgICByZXR1cm4gbmV3IFN0YWtpbmdXYWxsZXQodGhpcywgaXNFdGhUc3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW5kIGRvd25sb2FkcyBQREYga2V5Y2FyZCBmb3Igd2FsbGV0IChyZXF1aXJlcyByZXNwb25zZSBmcm9tIHdhbGxldHMuZ2VuZXJhdGVXYWxsZXQpXG4gICAqXG4gICAqIE5vdGU6IHRoaXMgaXMgZXhhbXBsZSBjb2RlIGFuZCBpcyBub3QgdGhlIHZlcnNpb24gdXNlZCBvbiBiaXRnby5jb21cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAgICoganNQREYgLSBhbiBpbnN0YW5jZSBvZiB0aGUganNQREYgbGlicmFyeVxuICAgKiAgICogUVJDb2RlIC0gYW4gaW5zdGFuY2Ugb2YgdGhlIFFSaW91cyBsaWJyYXJ5XG4gICAqICAgKiB1c2VyS2V5Y2hhaW4gLSBhIHdhbGxldCdzIHByaXZhdGUgdXNlciBrZXljaGFpblxuICAgKiAgICogYmFja3VwS2V5Y2hhaW4gLSBhIHdhbGxldCdzIHByaXZhdGUgYmFja3VwIGtleWNoYWluXG4gICAqICAgKiBiaXRnb0tleWNoYWluIC0gYSB3YWxsZXQncyBwcml2YXRlIGJpdGdvIGtleWNoYWluXG4gICAqICAgKiBwYXNzcGhyYXNlIC0gdGhlIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqICAgKiBwYXNzY29kZUVuY3J5cHRpb25Db2RlIC0gdGhlIGVuY3J5cHRpb24gc2VjcmV0IHVzZWQgZm9yIEJveCBEXG4gICAqICAgKiBhY3RpdmF0aW9uQ29kZSAtIGEgcmFuZG9tbHkgZ2VuZXJhdGVkIHNpeC1kaWdpdCBhY3RpdmF0aW9uIGNvZGVcbiAgICogICAqIHdhbGxldEtleUlEIC0gdGhlIEtleSBJRCB1c2VkIGZvciBkZXJpdmluZyBhIGNvbGQgd2FsbGV0J3Mgc2lnbmluZyBrZXlcbiAgICogICAqIGJhY2t1cEtleUlEIC0gdGhlIEtleSBJRCB1c2VkIGZvciBkZXJpdmluZyBhIGNvbGQgd2FsbGV0J3MgYmFja3VwIGtleVxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGRvd25sb2FkS2V5Y2FyZChwYXJhbXM6IERvd25sb2FkS2V5Y2FyZE9wdGlvbnMgPSB7fSk6IHZvaWQge1xuICAgIGlmICghd2luZG93IHx8ICF3aW5kb3cubG9jYXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGRvd25sb2FkS2V5Y2FyZCBmdW5jdGlvbiBpcyBvbmx5IGNhbGxhYmxlIHdpdGhpbiBhIGJyb3dzZXIuJyk7XG4gICAgfVxuXG4gICAgLy8gR3JhYiBwYXJhbWV0ZXJzIHdpdGggZGVmYXVsdCBmb3IgYWN0aXZhdGlvbkNvZGVcbiAgICBjb25zdCB7XG4gICAgICBqc1BERixcbiAgICAgIFFSQ29kZSxcbiAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgIGJhY2t1cEtleWNoYWluLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIHBhc3NwaHJhc2UsXG4gICAgICBwYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgd2FsbGV0S2V5SUQsXG4gICAgICBiYWNrdXBLZXlJRCxcbiAgICAgIGFjdGl2YXRpb25Db2RlID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogOTAwMDAwICsgMTAwMDAwKS50b1N0cmluZygpLFxuICAgIH0gPSBwYXJhbXM7XG5cbiAgICBpZiAoIWpzUERGIHx8IHR5cGVvZiBqc1BERiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbGVhc2UgcGFzcyBpbiBhIHZhbGlkIGpzUERGIGluc3RhbmNlJyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUga2V5Y2hhaW5zXG4gICAgaWYgKCF1c2VyS2V5Y2hhaW4gfHwgdHlwZW9mIHVzZXJLZXljaGFpbiAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgV2FsbGV0IGtleWNoYWluIG11c3QgaGF2ZSBhICd1c2VyJyBwcm9wZXJ0eWApO1xuICAgIH1cblxuICAgIGlmICghYmFja3VwS2V5Y2hhaW4gfHwgdHlwZW9mIGJhY2t1cEtleWNoYWluICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCYWNrdXAga2V5Y2hhaW4gaXMgcmVxdWlyZWQgYW5kIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgfVxuXG4gICAgaWYgKCFiaXRnb0tleWNoYWluIHx8IHR5cGVvZiBiaXRnb0tleWNoYWluICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCaXRnbyBrZXljaGFpbiBpcyByZXF1aXJlZCBhbmQgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgICB9XG5cbiAgICBpZiAod2FsbGV0S2V5SUQgJiYgdHlwZW9mIHdhbGxldEtleUlEICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd3YWxsZXRLZXlJRCBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgaWYgKGJhY2t1cEtleUlEICYmIHR5cGVvZiBiYWNrdXBLZXlJRCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYmFja3VwS2V5SUQgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGFjdGl2YXRpb24gY29kZSBpZiBwcm92aWRlZFxuICAgIGlmICh0eXBlb2YgYWN0aXZhdGlvbkNvZGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FjdGl2YXRpb24gQ29kZSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGl2YXRpb25Db2RlLmxlbmd0aCAhPT0gNikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBY3RpdmF0aW9uIGNvZGUgbXVzdCBiZSBzaXggY2hhcmFjdGVycycpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvaW5TaG9ydE5hbWUgPSB0aGlzLmJhc2VDb2luLnR5cGU7XG4gICAgY29uc3QgY29pbk5hbWUgPSB0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCk7XG4gICAgY29uc3Qgd2FsbGV0TGFiZWwgPSB0aGlzLl93YWxsZXQubGFiZWw7XG5cbiAgICBjb25zdCBkb2MgPSBkcmF3S2V5Y2FyZCh7XG4gICAgICBqc1BERixcbiAgICAgIFFSQ29kZSxcbiAgICAgIGVuY3J5cHQ6IHRoaXMuYml0Z28uZW5jcnlwdCxcbiAgICAgIGNvaW5TaG9ydE5hbWUsXG4gICAgICBjb2luTmFtZSxcbiAgICAgIGFjdGl2YXRpb25Db2RlLFxuICAgICAgd2FsbGV0TGFiZWwsXG4gICAgICBwYXNzcGhyYXNlLFxuICAgICAgcGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgIGJhY2t1cEtleWNoYWluLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIHdhbGxldEtleUlELFxuICAgICAgYmFja3VwS2V5SUQsXG4gICAgfSk7XG5cbiAgICAvLyBTYXZlIHRoZSBQREYgb24gdGhlIHVzZXIncyBicm93c2VyXG4gICAgZG9jLnNhdmUoYEJpdEdvIEtleWNhcmQgZm9yICR7d2FsbGV0TGFiZWx9LnBkZmApO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHNldCBvZiBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9ucyBmb3IgYSB3YWxsZXQuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogICAgIGNvbnNvbGlkYXRlQWRkcmVzc2VzIC0gdGhlc2UgYXJlIHRoZSBvbi1jaGFpbiByZWNlaXZlIGFkZHJlc3NlcyB3ZSB3YW50IHRvIHBpY2sgYSBjb25zb2xpZGF0aW9uIGFtb3VudCBmcm9tXG4gICAqL1xuICBhc3luYyBidWlsZEFjY291bnRDb25zb2xpZGF0aW9ucyhcbiAgICBwYXJhbXM6IEJ1aWxkQ29uc29saWRhdGlvblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8UHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdFtdPiB7XG4gICAgaWYgKCF0aGlzLmJhc2VDb2luLmFsbG93c0FjY291bnRDb25zb2xpZGF0aW9ucygpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5iYXNlQ29pbi5nZXRGdWxsTmFtZSgpfSBkb2VzIG5vdCBhbGxvdyBhY2NvdW50IGNvbnNvbGlkYXRpb25zLmApO1xuICAgIH1cblxuICAgIC8vIFdoaXRlbGlzdCBwYXJhbXMgdG8gYnVpbGQgdHhcbiAgICBjb25zdCB3aGl0ZWxpc3RlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIHRoaXMucHJlYnVpbGRDb25zb2xpZGF0ZUFjY291bnRQYXJhbXMoKSk7XG4gICAgZGVidWcoJ3ByZWJ1aWxkaW5nIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb246ICVPJywgd2hpdGVsaXN0ZWRQYXJhbXMpO1xuXG4gICAgaWYgKHBhcmFtcy5yZXFJZCkge1xuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCk7XG4gICAgfVxuXG4gICAgLy8gdGhpcyBjb3VsZCByZXR1cm4gMTAwIGJ1aWxkIHRyYW5zYWN0aW9uc1xuICAgIGNvbnN0IGJ1aWxkUmVzcG9uc2UgPSAoYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuaWQoKSArICcvY29uc29saWRhdGVBY2NvdW50L2J1aWxkJykpXG4gICAgICAuc2VuZCh3aGl0ZWxpc3RlZFBhcmFtcylcbiAgICAgIC5yZXN1bHQoKSkgYXMgYW55O1xuXG4gICAgLy8gd2UgbmVlZCB0byBzdGVwIG92ZXIgZWFjaCBwcmVidWlsZCBub3cgLSBzaG91bGQgYmUgaW4gYW4gYXJyYXkgaW4gdGhlIGJvZHlcbiAgICBjb25zdCBjb25zb2xpZGF0aW9uczogUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdFtdID0gW107XG4gICAgZm9yIChjb25zdCBjb25zb2xpZGF0ZUFjY291bnRCdWlsZCBvZiBidWlsZFJlc3BvbnNlKSB7XG4gICAgICBsZXQgcHJlYnVpbGQ6IFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQgPSAoYXdhaXQgdGhpcy5iYXNlQ29pbi5wb3N0UHJvY2Vzc1ByZWJ1aWxkKFxuICAgICAgICBPYmplY3QuYXNzaWduKGNvbnNvbGlkYXRlQWNjb3VudEJ1aWxkLCB7IHdhbGxldDogdGhpcywgYnVpbGRQYXJhbXM6IHdoaXRlbGlzdGVkUGFyYW1zIH0pXG4gICAgICApKSBhcyBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0O1xuXG4gICAgICBkZWxldGUgcHJlYnVpbGQud2FsbGV0O1xuICAgICAgZGVsZXRlIHByZWJ1aWxkLmJ1aWxkUGFyYW1zO1xuXG4gICAgICBwcmVidWlsZCA9IF8uZXh0ZW5kKHt9LCBwcmVidWlsZCwgeyB3YWxsZXRJZDogdGhpcy5pZCgpIH0pO1xuICAgICAgZGVidWcoJ2ZpbmFsIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb24gcHJlYnVpbGQ6ICVPJywgcHJlYnVpbGQpO1xuXG4gICAgICBjb25zb2xpZGF0aW9ucy5wdXNoKHByZWJ1aWxkKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnNvbGlkYXRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhbmQgc2VuZHMgYSBzZXQgb2YgY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbnMgZm9yIGEgd2FsbGV0LlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqICAgICBwcmVidWlsZFR4ICAgLSB0aGlzIGlzIHRoZSBwcmUtYnVpbGQgY29uc29saWRhdGlvbiB0eC4gdGhpcyBpcyBhIG5vcm1hbGx5IGJ1aWx0IHR4IHdpdGhcbiAgICogICAgICAgICAgICAgICAgICAgIGFuIGFkZGl0aW9uYWwgcGFyYW1ldGVyIG9mIGNvbnNvbGlkYXRlSWQuXG4gICAqICAgICB2ZXJpZmljYXRpb24gLSBub3JtYWwga2V5Y2hhaW5zLCBldGMuIGZvciB2ZXJpZmljYXRpb25cbiAgICovXG4gIGFzeW5jIHNlbmRBY2NvdW50Q29uc29saWRhdGlvbihwYXJhbXM6IFByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4uYWxsb3dzQWNjb3VudENvbnNvbGlkYXRpb25zKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9IGRvZXMgbm90IGFsbG93IGFjY291bnQgY29uc29saWRhdGlvbnMuYCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3dhbGxldC50eXBlID09PSAnY3VzdG9kaWFsJyAmJiB0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlICE9PSAndHNzJykge1xuICAgICAgcGFyYW1zLnR5cGUgPSAnY29uc29saWRhdGUnO1xuICAgICAgcmV0dXJuIHRoaXMuaW5pdGlhdGVUcmFuc2FjdGlvbihwYXJhbXMgYXMgVHhTZW5kQm9keSk7XG4gICAgfVxuXG4gICAgLy8gb25lIG9mIGEgc2V0IG9mIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb25zXG4gICAgaWYgKHR5cGVvZiBwYXJhbXMucHJlYnVpbGRUeCA9PT0gJ3N0cmluZycgfHwgcGFyYW1zLnByZWJ1aWxkVHggPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGJ1aWxkIG9mIGFjY291bnQgY29uc29saWRhdGlvbi4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5wcmVidWlsZFR4LmNvbnNvbGlkYXRlSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGZpbmQgY29uc29saWRhdGlvbiBpZCBvbiBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9uLicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlID09PSAndHNzJykge1xuICAgICAgaWYgKCFwYXJhbXMucHJlYnVpbGRUeC50eFJlcXVlc3RJZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbnNvbGlkYXRpb24gcmVxdWVzdCBtaXNzaW5nIHR4UmVxdWVzdElkLicpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZW5kTWFueVRzcyhwYXJhbXMpO1xuICAgIH1cblxuICAgIGNvbnN0IHNpZ25lZFByZWJ1aWxkID0gKGF3YWl0IHRoaXMucHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb24ocGFyYW1zKSkgYXMgYW55O1xuXG4gICAgLy8gZGVjb3JhdGUgd2l0aCBvdXIgY29uc29saWRhdGlvbiBpZFxuICAgIHNpZ25lZFByZWJ1aWxkLmNvbnNvbGlkYXRlSWQgPSBwYXJhbXMucHJlYnVpbGRUeC5jb25zb2xpZGF0ZUlkO1xuXG4gICAgZGVsZXRlIHNpZ25lZFByZWJ1aWxkLndhbGxldDtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKHNpZ25lZFByZWJ1aWxkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYW5kIHNlbmRzIGEgc2V0IG9mIGFjY291bnQgY29uc29saWRhdGlvbnMuIFRoaXMgaXMgaW50ZW5kZWQgdG8gZmx1c2ggbWFueSBiYWxhbmNlcyB0byB0aGUgcm9vdCB3YWxsZXQgYmFsYW5jZS5cbiAgICogQHBhcmFtIHBhcmFtcyAtXG4gICAqICAgICBjb25zb2xpZGF0ZUFkZHJlc3NlcyAtIHRoZXNlIGFyZSB0aGUgb24tY2hhaW4gcmVjZWl2ZSBhZGRyZXNzZXMgd2Ugd2FudCB0byBwaWNrIGEgY29uc29saWRhdGlvbiBhbW91bnQgZnJvbVxuICAgKi9cbiAgYXN5bmMgc2VuZEFjY291bnRDb25zb2xpZGF0aW9ucyhwYXJhbXM6IEJ1aWxkQ29uc29saWRhdGlvblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4uYWxsb3dzQWNjb3VudENvbnNvbGlkYXRpb25zKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9IGRvZXMgbm90IGFsbG93IGFjY291bnQgY29uc29saWRhdGlvbnMuYCk7XG4gICAgfVxuXG4gICAgLy8gdGhpcyBnaXZlcyB1cyBhIHNldCBvZiBhY2NvdW50IGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb25zXG4gICAgY29uc3QgdW5zaWduZWRCdWlsZHMgPSAoYXdhaXQgdGhpcy5idWlsZEFjY291bnRDb25zb2xpZGF0aW9ucyhwYXJhbXMpKSBhcyBhbnk7XG4gICAgaWYgKHVuc2lnbmVkQnVpbGRzICYmIHVuc2lnbmVkQnVpbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHN1Y2Nlc3NmdWxUeHM6IGFueVtdID0gW107XG4gICAgICBjb25zdCBmYWlsZWRUeHMgPSBuZXcgQXJyYXk8RXJyb3I+KCk7XG4gICAgICBmb3IgKGNvbnN0IHVuc2lnbmVkQnVpbGQgb2YgdW5zaWduZWRCdWlsZHMpIHtcbiAgICAgICAgLy8gZm9sZCBhbnkgb2YgdGhlIHBhcmFtZXRlcnMgd2UgdXNlZCB0byBidWlsZCB0aGlzIHRyYW5zYWN0aW9uIGludG8gdGhlIHVuc2lnbmVkQnVpbGRcbiAgICAgICAgY29uc3QgdW5zaWduZWRCdWlsZFdpdGhPcHRpb25zOiBQcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBwYXJhbXMpO1xuICAgICAgICB1bnNpZ25lZEJ1aWxkV2l0aE9wdGlvbnMucHJlYnVpbGRUeCA9IHVuc2lnbmVkQnVpbGQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgc2VuZFR4ID0gYXdhaXQgdGhpcy5zZW5kQWNjb3VudENvbnNvbGlkYXRpb24odW5zaWduZWRCdWlsZFdpdGhPcHRpb25zKTtcbiAgICAgICAgICBzdWNjZXNzZnVsVHhzLnB1c2goc2VuZFR4KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnNvbGUuZGlyKGUpO1xuICAgICAgICAgIGZhaWxlZFR4cy5wdXNoKGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IHN1Y2Nlc3NmdWxUeHMsXG4gICAgICAgIGZhaWx1cmU6IGZhaWxlZFR4cyxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHNldCBvZiB0cmFuc2FjdGlvbnMgdGhhdCBlbmFibGVzIHRoZSBzcGVjaWZpZWQgdG9rZW5zXG4gICAqIEBwYXJhbSBwYXJhbXMgLVxuICAgKiAgICBlbmFibGVUb2tlbnM6IFRva2VuIGVuYWJsZW1lbnQgb3BlcmF0aW9ucyB3ZSB3YW50IHRvIHBlcmZvcm1cbiAgICogQHJldHVybnMgVW5zaWduZWQgdHJhbnNhY3Rpb25zIHRoYXQgZW5hYmxlcyB0aGUgc3BlY2lmaWVkIHRva2Vuc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGJ1aWxkVG9rZW5FbmFibGVtZW50cyhcbiAgICBwYXJhbXM6IEJ1aWxkVG9rZW5FbmFibGVtZW50T3B0aW9ucyA9IHsgZW5hYmxlVG9rZW5zOiBbXSB9XG4gICk6IFByb21pc2U8UHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdFtdPiB7XG4gICAgY29uc3QgdGVDb25maWcgPSB0aGlzLmJhc2VDb2luLmdldFRva2VuRW5hYmxlbWVudENvbmZpZygpO1xuICAgIGlmICghdGVDb25maWcucmVxdWlyZXNUb2tlbkVuYWJsZW1lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9IGRvZXMgbm90IHJlcXVpcmUgdG9rZW4gZW5hYmxlbWVudHNgKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5lbmFibGVUb2tlbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHRva2VucyBhcmUgYmVpbmcgc3BlY2lmaWVkJyk7XG4gICAgfVxuICAgIGlmIChwYXJhbXMucmVjaXBpZW50cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gbm90IHNwZWNpZnkgcmVjaXBpZW50cyBmb3IgdG9rZW4gZW5hYmxlbWVudCB0cmFuc2FjdGlvbnMnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnJlcUlkKSB7XG4gICAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocGFyYW1zLnJlcUlkKTtcbiAgICB9XG5cbiAgICAvLyBTcGxpdCBxdWVyeSBpZiB3ZSBjYW4ndCBlbmFibGUgbXVsdGlwbGUgdG9rZW5zIGluIG9uZSB0eFxuICAgIGlmICghdGVDb25maWcuc3VwcG9ydHNNdWx0aXBsZVRva2VuRW5hYmxlbWVudHMgJiYgcGFyYW1zLmVuYWJsZVRva2Vucy5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBxdWVyaWVzID0gcGFyYW1zLmVuYWJsZVRva2Vucy5tYXAoYXN5bmMgKGVuYWJsZVRva2VuKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkVG9rZW5FbmFibGVtZW50cyh7XG4gICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICAgIGVuYWJsZVRva2VuczogW2VuYWJsZVRva2VuXSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChxdWVyaWVzKTtcbiAgICAgIHJldHVybiByZXN1bHRzLmZsYXQoKTtcbiAgICB9XG5cbiAgICBjb25zdCBidWlsZFBhcmFtczogUHJlYnVpbGRUcmFuc2FjdGlvbk9wdGlvbnMgPSBfLnBpY2socGFyYW1zLCB0aGlzLnByZWJ1aWxkV2hpdGVsaXN0ZWRQYXJhbXMoKSk7XG4gICAgYnVpbGRQYXJhbXMudHlwZSA9ICdlbmFibGV0b2tlbic7XG4gICAgLy8gQ2hlY2sgaWYgd2UgYnVpbGQgd2l0aCBpbnRlbnRcbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSA9PT0gJ3RzcycpIHtcbiAgICAgIHJldHVybiBbYXdhaXQgdGhpcy5wcmVidWlsZFRyYW5zYWN0aW9uKGJ1aWxkUGFyYW1zKV07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJld3JpdGUgdG9rZW5zIGludG8gcmVjaXBpZW50cyBmb3IgYnVpbGRUcmFuc2FjdGlvblxuICAgICAgYnVpbGRQYXJhbXMucmVjaXBpZW50cyA9IHBhcmFtcy5lbmFibGVUb2tlbnMubWFwKCh0b2tlbikgPT4ge1xuICAgICAgICAvLyBJZiB0b2tlbiBoYXMgbm9uIGFkZHJlc3MsIHRha2UgdGhlIGZpcnN0IHdhbGxldCBhZGRyZXNzIGlzIHN0b3JlZCBpbiBpdHMgY29pbi1zcGVjaWZpYyBwcm9wZXJ0eVxuICAgICAgICAvLyBJbiBhY2NvdW50LWJhc2VkIGNvaW4gaW1wbGVtZW50YXRpb25zIHRoYXQgdXNlIHdhbGxldCBjb250cmFjdHMsIHRoZSBhZGRyZXNzIGlzIGNhbGxlZCBiYXNlQWRkcmVzcyAoZS5nLiBldGgtbGlrZSwgeHR6KVxuICAgICAgICAvLyBmb3Igb3RoZXJzIGl0J3MgY2FsbGVkIHJvb3RBZGRyZXNzIChlLmcuIHhycCwgeGxtLCBhbGdvLCB0cngpXG4gICAgICAgIGNvbnN0IGFkZHJlc3MgPVxuICAgICAgICAgIHRva2VuLmFkZHJlc3MgfHwgdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYz8uYmFzZUFkZHJlc3MgfHwgdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYz8ucm9vdEFkZHJlc3M7XG4gICAgICAgIGlmICghYWRkcmVzcykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV2FsbGV0IGRvZXMgbm90IGhhdmUgYmFzZSBhZGRyZXNzLCBtdXN0IHNwZWNpZnkgd2l0aCB0b2tlbiBwYXJhbScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdG9rZW5OYW1lOiB0b2tlbi5uYW1lLFxuICAgICAgICAgIGFkZHJlc3MsXG4gICAgICAgICAgYW1vdW50OiAnMCcsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIGRlbGV0ZSBidWlsZFBhcmFtcy5lbmFibGVUb2tlbnM7XG4gICAgICBjb25zdCBwcmVidWlsZFR4ID0gYXdhaXQgdGhpcy5wcmVidWlsZFRyYW5zYWN0aW9uKGJ1aWxkUGFyYW1zKTtcbiAgICAgIHByZWJ1aWxkVHguYnVpbGRQYXJhbXMgPSBidWlsZFBhcmFtcztcbiAgICAgIHJldHVybiBbcHJlYnVpbGRUeF07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGFuZCBzZW5kcyBhIHNpbmdsZSB1bnNpZ25lZCB0b2tlbiBlbmFibGVtZW50IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnNcbiAgICogICAtIFRoZSByZXNwb25zZSBmcm9tIHNlbmRpbmcgdGhlIHRyYW5zYWN0aW9uIGZvciBob3QvY29sZCB3YWxsZXRzXG4gICAqICAgLSBUaGUgcmVzcG9uc2UgZnJvbSBpbml0aWF0aW5nIHRoZSB0cmFuc2FjdGlvbiBmb3IgY3VzdG9kaWFsIHdhbGxldHNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZW5kVG9rZW5FbmFibGVtZW50KHBhcmFtczogUHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHRlQ29uZmlnID0gdGhpcy5iYXNlQ29pbi5nZXRUb2tlbkVuYWJsZW1lbnRDb25maWcoKTtcbiAgICBpZiAoIXRlQ29uZmlnLnJlcXVpcmVzVG9rZW5FbmFibGVtZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5iYXNlQ29pbi5nZXRGdWxsTmFtZSgpfSBkb2VzIG5vdCByZXF1aXJlIHRva2VuIGVuYWJsZW1lbnQgdHJhbnNhY3Rpb25zYCk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwYXJhbXMucHJlYnVpbGRUeCA9PT0gJ3N0cmluZycgfHwgcGFyYW1zLnByZWJ1aWxkVHg/LmJ1aWxkUGFyYW1zPy50eXBlICE9PSAnZW5hYmxldG9rZW4nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYnVpbGQgb2YgdG9rZW4gZW5hYmxlbWVudC4nKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSA9PT0gJ3RzcycpIHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNlbmRNYW55VHNzKHBhcmFtcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXRjaCAodGhpcy5fd2FsbGV0LnR5cGUpIHtcbiAgICAgICAgY2FzZSAnaG90JzpcbiAgICAgICAgY2FzZSAnY29sZCc6XG4gICAgICAgICAgY29uc3Qgc2lnbmVkUHJlYnVpbGQgPSBhd2FpdCB0aGlzLnByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uKHBhcmFtcyk7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oc2lnbmVkUHJlYnVpbGQpO1xuICAgICAgICBjYXNlICdjdXN0b2RpYWwnOlxuICAgICAgICAgIHJldHVybiB0aGlzLmluaXRpYXRlVHJhbnNhY3Rpb24ocGFyYW1zLnByZWJ1aWxkVHguYnVpbGRQYXJhbXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTb21lIGNoYWlucyByZXF1aXJlIHRva2VucyB0byBiZSBlbmFibGVkIGJlZm9yZSB0aGV5IGNhbiBiZSByZWNlaXZlZC9zZW50LlxuICAgKiBUaGlzIGlzIGEgZGVkaWNhdGVkIGZ1bmN0aW9uIHRoYXQgZW5hYmxlcyB0b2tlbnMuXG4gICAqXG4gICAqIEJ1aWxkcywgc2lnbnMsIGFuZCBzZW5kcyBhIHNldCBvZiB0cmFuc2FjdGlvbnMgdGhhdCBlbmFibGVzIHRoZSBzcGVjaWZpZWQgdG9rZW5zXG4gICAqIEBwYXJhbSBwYXJhbXMgLVxuICAgKiAgICBlbmFibGVUb2tlbnM6IFRva2VuIGVuYWJsZW1lbnQgb3BlcmF0aW9ucyB3ZSB3YW50IHRvIHBlcmZvcm1cbiAgICogQHJldHVyblxuICAgKiAgICBzdWNjZXNzOiBTdWNjZXNzZnVsIHJlc3BvbnNlcyBmcm9tIHNlbmRUb2tlbkVuYWJsZW1lbnRcbiAgICogICAgZmFpbHVyZTogRXJyb3JzIGZyb20gZmFpbGVkIHRyYW5zYWN0aW9uc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlbmRUb2tlbkVuYWJsZW1lbnRzKHBhcmFtczogQnVpbGRUb2tlbkVuYWJsZW1lbnRPcHRpb25zID0geyBlbmFibGVUb2tlbnM6IFtdIH0pOiBQcm9taXNlPHtcbiAgICBzdWNjZXNzOiBhbnlbXTtcbiAgICBmYWlsdXJlOiBFcnJvcltdO1xuICB9PiB7XG4gICAgY29uc3QgdW5zaWduZWRCdWlsZHMgPSBhd2FpdCB0aGlzLmJ1aWxkVG9rZW5FbmFibGVtZW50cyhwYXJhbXMpO1xuXG4gICAgY29uc3Qgc3VjY2Vzc2Z1bFR4czogYW55W10gPSBbXTtcbiAgICBjb25zdCBmYWlsZWRUeHMgPSBuZXcgQXJyYXk8RXJyb3I+KCk7XG4gICAgZm9yIChjb25zdCB1bnNpZ25lZEJ1aWxkIG9mIHVuc2lnbmVkQnVpbGRzKSB7XG4gICAgICBjb25zdCB1bnNpZ25lZEJ1aWxkV2l0aE9wdGlvbnM6IFByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IHtcbiAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICBwcmVidWlsZFR4OiB1bnNpZ25lZEJ1aWxkLFxuICAgICAgfTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHNlbmRUeCA9IGF3YWl0IHRoaXMuc2VuZFRva2VuRW5hYmxlbWVudCh1bnNpZ25lZEJ1aWxkV2l0aE9wdGlvbnMpO1xuICAgICAgICBzdWNjZXNzZnVsVHhzLnB1c2goc2VuZFR4KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgZmFpbGVkVHhzLnB1c2goZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHN1Y2Nlc3NmdWxUeHMsXG4gICAgICBmYWlsdXJlOiBmYWlsZWRUeHMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgbGlnaHRuaW5nIGZvciBidGMvdGJ0YyBmcm9tIHRoaXMgd2FsbGV0XG4gICAqL1xuICBwdWJsaWMgbGlnaHRuaW5nKCk6IExpZ2h0bmluZyB7XG4gICAgaWYgKCF0aGlzLmJhc2VDb2luLnN1cHBvcnRzTGlnaHRuaW5nKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTGlnaHRuaW5nIG5vdCBzdXBwb3J0ZWQgZm9yICR7dGhpcy5jb2luKCl9YCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgTGlnaHRuaW5nKHRoaXMuYml0Z28sIHRoaXMpO1xuICB9XG5cbiAgLyogTUFSSzogVFNTIEhlbHBlcnMgKi9cblxuICAvKipcbiAgICogUHJlYnVpbGRzIGEgdHJhbnNhY3Rpb24gZm9yIGEgVFNTIHdhbGxldC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyBwcmVidWlsZCB0cmFuc2FjdGlvbiBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByZWJ1aWxkVHJhbnNhY3Rpb25Uc3MocGFyYW1zOiBQcmVidWlsZFRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0PiB7XG4gICAgY29uc3QgcmVxSWQgPSBwYXJhbXMucmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuXG4gICAgaWYgKFxuICAgICAgcGFyYW1zLmFwaVZlcnNpb24gPT09ICdsaXRlJyAmJlxuICAgICAgKHRoaXMuX3dhbGxldC50eXBlID09PSAnY3VzdG9kaWFsJyB8fCB0aGlzLl93YWxsZXQudHlwZSA9PT0gJ2NvbGQnIHx8IHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCkgPT09ICdlY2RzYScpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEN1c3RvZGlhbCBhbmQgRUNEU0EgTVBDIGFsZ29yaXRobSBtdXN0IGFsd2F5cyB1c2UgJ2Z1bGwnIGFwaSB2ZXJzaW9uYCk7XG4gICAgfVxuXG4gICAgY29uc3QgYXBpVmVyc2lvbiA9XG4gICAgICBwYXJhbXMuYXBpVmVyc2lvbiB8fFxuICAgICAgKHRoaXMuX3dhbGxldC50eXBlID09PSAnY3VzdG9kaWFsJyB8fCB0aGlzLl93YWxsZXQudHlwZSA9PT0gJ2NvbGQnIHx8IHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCkgPT09ICdlY2RzYSdcbiAgICAgICAgPyAnZnVsbCdcbiAgICAgICAgOiAnbGl0ZScpO1xuICAgIC8vIFR3byBvcHRpb25zIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMgb2YgZmVlcyBzZWVtcyB0byBub3cgYmUgc3VwcG9ydGVkLCBmb3Igbm93IHdlIHdpbGwgc3VwcG9ydCBib3RoIHRvIGJlIGJhY2t3YXJkcyBjb21wYXRpYmxlXG4gICAgLy8gVE9ETyhCRy01OTY4NSk6IGRlcHJlY2F0ZSBvbmUgb2YgdGhlc2Ugc28gdGhhdCB3ZSBoYXZlIGEgc2luZ2xlIHdheSB0byBwYXNzIGZlZXNcbiAgICBsZXQgZmVlT3B0aW9ucztcbiAgICBpZiAocGFyYW1zLmZlZU9wdGlvbnMpIHtcbiAgICAgIGZlZU9wdGlvbnMgPSBwYXJhbXMuZmVlT3B0aW9ucztcbiAgICB9IGVsc2UgaWYgKHBhcmFtcy5nYXNQcmljZSAhPT0gdW5kZWZpbmVkIHx8IHBhcmFtcy5laXAxNTU5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZlZU9wdGlvbnMgPVxuICAgICAgICBwYXJhbXMuZ2FzUHJpY2UgIT09IHVuZGVmaW5lZFxuICAgICAgICAgID8geyBnYXNQcmljZTogcGFyYW1zLmdhc1ByaWNlLCBnYXNMaW1pdDogcGFyYW1zLmdhc0xpbWl0IH1cbiAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgbWF4RmVlUGVyR2FzOiBOdW1iZXIocGFyYW1zLmVpcDE1NTk/Lm1heEZlZVBlckdhcyksXG4gICAgICAgICAgICAgIG1heFByaW9yaXR5RmVlUGVyR2FzOiBOdW1iZXIocGFyYW1zLmVpcDE1NTk/Lm1heFByaW9yaXR5RmVlUGVyR2FzKSxcbiAgICAgICAgICAgICAgZ2FzTGltaXQ6IHBhcmFtcy5nYXNMaW1pdCxcbiAgICAgICAgICAgIH07XG4gICAgfSBlbHNlIGlmIChwYXJhbXMuZ2FzTGltaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZmVlT3B0aW9ucyA9IHsgZ2FzTGltaXQ6IHBhcmFtcy5nYXNMaW1pdCB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBmZWVPcHRpb25zID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGxldCB0eFJlcXVlc3Q6IFR4UmVxdWVzdDtcbiAgICBzd2l0Y2ggKHBhcmFtcy50eXBlKSB7XG4gICAgICBjYXNlICd0cmFuc2Zlcic6XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnByZWJ1aWxkVHhXaXRoSW50ZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgICAgaW50ZW50VHlwZTogJ3BheW1lbnQnLFxuICAgICAgICAgICAgc2VxdWVuY2VJZDogcGFyYW1zLnNlcXVlbmNlSWQsXG4gICAgICAgICAgICBjb21tZW50OiBwYXJhbXMuY29tbWVudCxcbiAgICAgICAgICAgIHJlY2lwaWVudHM6IHBhcmFtcy5yZWNpcGllbnRzIHx8IFtdLFxuICAgICAgICAgICAgbWVtbzogcGFyYW1zLm1lbW8sXG4gICAgICAgICAgICBub25jZTogcGFyYW1zLm5vbmNlLFxuICAgICAgICAgICAgZmVlT3B0aW9ucyxcbiAgICAgICAgICAgIGN1c3RvZGlhblRyYW5zYWN0aW9uSWQ6IHBhcmFtcy5jdXN0b2RpYW5UcmFuc2FjdGlvbklkLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBpVmVyc2lvbixcbiAgICAgICAgICBwYXJhbXMucHJldmlld1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RyYW5zZmVydG9rZW4nOlxuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5wcmVidWlsZFR4V2l0aEludGVudChcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXFJZCxcbiAgICAgICAgICAgIGlzVHNzOiBwYXJhbXMuaXNUc3MsXG4gICAgICAgICAgICBpbnRlbnRUeXBlOiAndHJhbnNmZXJUb2tlbicsXG4gICAgICAgICAgICByZWNpcGllbnRzOiBwYXJhbXMucmVjaXBpZW50cyB8fCBbXSxcbiAgICAgICAgICAgIG5vbmNlOiBwYXJhbXMubm9uY2UsXG4gICAgICAgICAgICBmZWVPcHRpb25zLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBpVmVyc2lvbixcbiAgICAgICAgICBwYXJhbXMucHJldmlld1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2VuYWJsZXRva2VuJzpcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEucHJlYnVpbGRUeFdpdGhJbnRlbnQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgICBpbnRlbnRUeXBlOiAnZW5hYmxlVG9rZW4nLFxuICAgICAgICAgICAgcmVjaXBpZW50czogcGFyYW1zLnJlY2lwaWVudHMgfHwgW10sXG4gICAgICAgICAgICBlbmFibGVUb2tlbnM6IHBhcmFtcy5lbmFibGVUb2tlbnMsXG4gICAgICAgICAgICBtZW1vOiBwYXJhbXMubWVtbyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFwaVZlcnNpb24sXG4gICAgICAgICAgcGFyYW1zLnByZXZpZXdcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhY2NlbGVyYXRpb24nOlxuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5wcmVidWlsZFR4V2l0aEludGVudChcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXFJZCxcbiAgICAgICAgICAgIGludGVudFR5cGU6ICdhY2NlbGVyYXRpb24nLFxuICAgICAgICAgICAgY29tbWVudDogcGFyYW1zLmNvbW1lbnQsXG4gICAgICAgICAgICBsb3dGZWVUeGlkOiBwYXJhbXMubG93RmVlVHhpZCxcbiAgICAgICAgICAgIHJlY2VpdmVBZGRyZXNzOiBwYXJhbXMucmVjZWl2ZUFkZHJlc3MsXG4gICAgICAgICAgICBmZWVPcHRpb25zLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBpVmVyc2lvbixcbiAgICAgICAgICBwYXJhbXMucHJldmlld1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2ZpbGxOb25jZSc6XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnByZWJ1aWxkVHhXaXRoSW50ZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgICAgaW50ZW50VHlwZTogJ2ZpbGxOb25jZScsXG4gICAgICAgICAgICBjb21tZW50OiBwYXJhbXMuY29tbWVudCxcbiAgICAgICAgICAgIG5vbmNlOiBwYXJhbXMubm9uY2UsXG4gICAgICAgICAgICByZWNlaXZlQWRkcmVzczogcGFyYW1zLnJlY2VpdmVBZGRyZXNzLFxuICAgICAgICAgICAgZmVlT3B0aW9ucyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFwaVZlcnNpb24sXG4gICAgICAgICAgcGFyYW1zLnByZXZpZXdcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHRyYW5zYWN0aW9uIHR5cGUgbm90IHN1cHBvcnRlZDogJHtwYXJhbXMudHlwZX1gKTtcbiAgICB9XG5cbiAgICBsZXQgdW5zaWduZWRUeDogRWRkc2FVbnNpZ25lZFRyYW5zYWN0aW9uO1xuXG4gICAgaWYgKHR4UmVxdWVzdC5hcGlWZXJzaW9uID09PSAnZnVsbCcpIHtcbiAgICAgIGlmICh0eFJlcXVlc3QudHJhbnNhY3Rpb25zPy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhIHNpbmdsZSB1bnNpZ25lZCB0eCBmb3IgdHggcmVxdWVzdCB3aXRoIGlkOiAke3R4UmVxdWVzdC50eFJlcXVlc3RJZH1gKTtcbiAgICAgIH1cblxuICAgICAgdW5zaWduZWRUeCA9IHR4UmVxdWVzdC50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR4UmVxdWVzdC51bnNpZ25lZFR4cy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhIHNpbmdsZSB1bnNpZ25lZCB0eCBmb3IgdHggcmVxdWVzdCB3aXRoIGlkOiAke3R4UmVxdWVzdC50eFJlcXVlc3RJZH1gKTtcbiAgICAgIH1cbiAgICAgIHVuc2lnbmVkVHggPSB0eFJlcXVlc3QudW5zaWduZWRUeHNbMF07XG4gICAgfVxuXG4gICAgY29uc3Qgd2hpdGVsaXN0ZWRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCB0aGlzLnByZWJ1aWxkV2hpdGVsaXN0ZWRQYXJhbXMoKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdhbGxldElkOiB0aGlzLmlkKCksXG4gICAgICB3YWxsZXQ6IHRoaXMsXG4gICAgICB0eFJlcXVlc3RJZDogdHhSZXF1ZXN0LnR4UmVxdWVzdElkLFxuICAgICAgdHhIZXg6IHVuc2lnbmVkVHguc2VyaWFsaXplZFR4SGV4LFxuICAgICAgYnVpbGRQYXJhbXM6IHdoaXRlbGlzdGVkUGFyYW1zLFxuICAgICAgZmVlSW5mbzogdW5zaWduZWRUeC5mZWVJbmZvLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgYSB0cmFuc2FjdGlvbiBmcm9tIGEgVFNTIEVkRFNBIHdhbGxldCB1c2luZyBleHRlcm5hbCBzaWduZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgc2lnbmluZyBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNpZ25UcmFuc2FjdGlvblRzc0V4dGVybmFsU2lnbmVyRWREU0EoXG4gICAgcGFyYW1zOiBXYWxsZXRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge30sXG4gICAgY29pbjogSUJhc2VDb2luXG4gICk6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgbGV0IHR4UmVxdWVzdElkID0gJyc7XG4gICAgaWYgKHBhcmFtcy50eFJlcXVlc3RJZCkge1xuICAgICAgdHhSZXF1ZXN0SWQgPSBwYXJhbXMudHhSZXF1ZXN0SWQ7XG4gICAgfSBlbHNlIGlmIChwYXJhbXMudHhQcmVidWlsZCAmJiBwYXJhbXMudHhQcmVidWlsZC50eFJlcXVlc3RJZCkge1xuICAgICAgdHhSZXF1ZXN0SWQgPSBwYXJhbXMudHhQcmVidWlsZC50eFJlcXVlc3RJZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUeFJlcXVlc3RJZCByZXF1aXJlZCB0byBzaWduIFRTUyB0cmFuc2FjdGlvbnMgd2l0aCBFeHRlcm5hbCBTaWduZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMuY3VzdG9tQ29tbWl0bWVudEdlbmVyYXRpbmdGdW5jdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHZW5lcmF0b3IgZnVuY3Rpb24gZm9yIGNvbW1pdG1lbnQgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBFeHRlcm5hbCBTaWduZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMuY3VzdG9tUlNoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dlbmVyYXRvciBmdW5jdGlvbiBmb3IgUiBzaGFyZSByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5jdXN0b21HU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignR2VuZXJhdG9yIGZ1bmN0aW9uIGZvciBHIHNoYXJlIHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIGFzc2VydCh0aGlzLnRzc1V0aWxzLCAndHNzVXRpbHMgbXVzdCBiZSBkZWZpbmVkJyk7XG4gICAgLy8gYWRkaW5nIHRoaXMgdG8gcmVidWlsZCB0aGUgdHJhbnNhY3Rpb24ganVzdCBiZWZvcmUgc2lnbmluZyBmb3IgRWREU0EgdHJhbnNhY3Rpb24gdXNpbmcgZXh0ZXJuYWwgc2lnbmVyXG4gICAgYXdhaXQgdGhpcy50c3NVdGlscy5kZWxldGVTaWduYXR1cmVTaGFyZXModHhSZXF1ZXN0SWQpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNpZ25lZFR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMuc2lnbkVkZHNhVHNzVXNpbmdFeHRlcm5hbFNpZ25lcihcbiAgICAgICAgdHhSZXF1ZXN0SWQsXG4gICAgICAgIHBhcmFtcy5jdXN0b21Db21taXRtZW50R2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgICAgICBwYXJhbXMuY3VzdG9tUlNoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgICAgICBwYXJhbXMuY3VzdG9tR1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uXG4gICAgICApO1xuICAgICAgcmV0dXJuIHNpZ25lZFR4UmVxdWVzdDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBzaWduIHRyYW5zYWN0aW9uICcgKyBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgYSB0cmFuc2FjdGlvbiBmcm9tIGEgVFNTIEVDRFNBIHdhbGxldCB1c2luZyBleHRlcm5hbCBzaWduZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgc2lnbmluZyBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNpZ25UcmFuc2FjdGlvblRzc0V4dGVybmFsU2lnbmVyRUNEU0EoXG4gICAgY29pbjogSUJhc2VDb2luLFxuICAgIHBhcmFtczogV2FsbGV0U2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgbGV0IHR4UmVxdWVzdElkID0gJyc7XG4gICAgaWYgKHBhcmFtcy50eFJlcXVlc3RJZCkge1xuICAgICAgdHhSZXF1ZXN0SWQgPSBwYXJhbXMudHhSZXF1ZXN0SWQ7XG4gICAgfSBlbHNlIGlmIChwYXJhbXMudHhQcmVidWlsZCAmJiBwYXJhbXMudHhQcmVidWlsZC50eFJlcXVlc3RJZCkge1xuICAgICAgdHhSZXF1ZXN0SWQgPSBwYXJhbXMudHhQcmVidWlsZC50eFJlcXVlc3RJZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUeFJlcXVlc3RJZCByZXF1aXJlZCB0byBzaWduIFRTUyB0cmFuc2FjdGlvbnMgd2l0aCBFeHRlcm5hbCBTaWduZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMuY3VzdG9tUGFpbGxpZXJNb2R1bHVzR2VuZXJhdGluZ0Z1bmN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dlbmVyYXRvciBmdW5jdGlvbiBmb3IgcGFpbGxpZXIgbW9kdWx1cyByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5jdXN0b21LU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignR2VuZXJhdG9yIGZ1bmN0aW9uIGZvciBLIHNoYXJlIHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmN1c3RvbU11RGVsdGFTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHZW5lcmF0b3IgZnVuY3Rpb24gZm9yIE11RGVsdGEgc2hhcmUgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBFeHRlcm5hbCBTaWduZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMuY3VzdG9tU1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dlbmVyYXRvciBmdW5jdGlvbiBmb3IgUyBzaGFyZSByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXNzZXJ0KHRoaXMudHNzVXRpbHMsICd0c3NVdGlscyBtdXN0IGJlIGRlZmluZWQnKTtcbiAgICAgIGNvbnN0IHNpZ25lZFR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMuc2lnbkVjZHNhVHNzVXNpbmdFeHRlcm5hbFNpZ25lcihcbiAgICAgICAge1xuICAgICAgICAgIHR4UmVxdWVzdDogdHhSZXF1ZXN0SWQsXG4gICAgICAgICAgcHJ2OiAnJyxcbiAgICAgICAgICByZXFJZDogbmV3IFJlcXVlc3RUcmFjZXIoKSxcbiAgICAgICAgfSxcbiAgICAgICAgUmVxdWVzdFR5cGUudHgsXG4gICAgICAgIHBhcmFtcy5jdXN0b21QYWlsbGllck1vZHVsdXNHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgICAgIHBhcmFtcy5jdXN0b21LU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgICAgIHBhcmFtcy5jdXN0b21NdURlbHRhU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgICAgIHBhcmFtcy5jdXN0b21TU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb25cbiAgICAgICk7XG4gICAgICByZXR1cm4gc2lnbmVkVHhSZXF1ZXN0O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIHNpZ24gdHJhbnNhY3Rpb24gJyArIGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBhIHRyYW5zYWN0aW9uIGZyb20gYSBUU1Mgd2FsbGV0LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIHNpZ25pbmcgb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzaWduVHJhbnNhY3Rpb25Uc3MocGFyYW1zOiBXYWxsZXRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPiB7XG4gICAgaWYgKCFwYXJhbXMudHhQcmVidWlsZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eFByZWJ1aWxkIHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggVFNTJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMudHhQcmVidWlsZC50eFJlcXVlc3RJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eFJlcXVlc3RJZCByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIFRTUycpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLnBydikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcnYgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBUU1MnKTtcbiAgICB9XG5cbiAgICAvLyBJZiBvbmx5IHRoZSBnZXRIYXNoRnVuY3Rpb24oKSBpcyBkZWZpbmVkIGZvciB0aGUgY29pbiB1c2UgaXQgb3RoZXJ3aXNlXG4gICAgLy8gcGFzcyB1bmRlZmluZWQgaGFzaCwgZGVmYXVsdCBoYXNoIHdpbGwgYmUgdXNlZCBpbiB0aGF0IGNhc2UuXG4gICAgbGV0IGhhc2g6IEhhc2ggfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGhhc2ggPSB0aGlzLmJhc2VDb2luLmdldEhhc2hGdW5jdGlvbigpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaGFzaCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNpZ25lZFR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnNpZ25UeFJlcXVlc3Qoe1xuICAgICAgICB0eFJlcXVlc3Q6IHBhcmFtcy50eFByZWJ1aWxkLnR4UmVxdWVzdElkLFxuICAgICAgICBwcnY6IHBhcmFtcy5wcnYsXG4gICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKSxcbiAgICAgICAgYXBpVmVyc2lvbjogcGFyYW1zLmFwaVZlcnNpb24sXG4gICAgICAgIGhhc2gsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR4UmVxdWVzdElkOiBzaWduZWRUeFJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIHNpZ24gdHJhbnNhY3Rpb24gJyArIGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBhIG1lc3NhZ2UgZnJvbSBhIFRTUyB3YWxsZXQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgc2lnbmluZyBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNpZ25NZXNzYWdlVHNzKHBhcmFtczogV2FsbGV0U2lnbk1lc3NhZ2VPcHRpb25zID0ge30pOiBQcm9taXNlPFNpZ25lZE1lc3NhZ2U+IHtcbiAgICBpZiAoIXBhcmFtcy5yZXFJZCkge1xuICAgICAgcGFyYW1zLnJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5wcnYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHJ2IHJlcXVpcmVkIHRvIHNpZ24gbWVzc2FnZSB3aXRoIFRTUycpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBsZXQgdHhSZXF1ZXN0O1xuICAgICAgYXNzZXJ0KHBhcmFtcy5tZXNzYWdlLCAnbWVzc2FnZSByZXF1aXJlZCBmb3IgbWVzc2FnZSBzaWduaW5nJyk7XG4gICAgICBpZiAoIXBhcmFtcy5tZXNzYWdlLnR4UmVxdWVzdElkKSB7XG4gICAgICAgIGNvbnN0IGludGVudE9wdGlvbjogSW50ZW50T3B0aW9uc0Zvck1lc3NhZ2UgPSB7XG4gICAgICAgICAgY3VzdG9kaWFuTWVzc2FnZUlkOiBwYXJhbXMuY3VzdG9kaWFuTWVzc2FnZUlkLFxuICAgICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgICAgICAgaW50ZW50VHlwZTogJ3NpZ25NZXNzYWdlJyxcbiAgICAgICAgICBpc1RzczogdHJ1ZSxcbiAgICAgICAgICBtZXNzYWdlUmF3OiBwYXJhbXMubWVzc2FnZS5tZXNzYWdlUmF3LFxuICAgICAgICAgIG1lc3NhZ2VFbmNvZGVkOiBCdWZmZXIuZnJvbShwYXJhbXMubWVzc2FnZT8ubWVzc2FnZUVuY29kZWQgPz8gJycpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgfTtcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEuY3JlYXRlVHhSZXF1ZXN0V2l0aEludGVudEZvck1lc3NhZ2VTaWduaW5nKGludGVudE9wdGlvbik7XG4gICAgICAgIHBhcmFtcy5tZXNzYWdlLnR4UmVxdWVzdElkID0gdHhSZXF1ZXN0LnR4UmVxdWVzdElkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgZ2V0VHhSZXF1ZXN0KHRoaXMuYml0Z28sIHRoaXMuaWQoKSwgcGFyYW1zLm1lc3NhZ2UudHhSZXF1ZXN0SWQpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzaWduZWRNZXNzYWdlUmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnNpZ25UeFJlcXVlc3RGb3JNZXNzYWdlKHtcbiAgICAgICAgdHhSZXF1ZXN0LFxuICAgICAgICBwcnY6IHBhcmFtcy5wcnYsXG4gICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKSxcbiAgICAgICAgbWVzc2FnZVJhdzogcGFyYW1zLm1lc3NhZ2UubWVzc2FnZVJhdyxcbiAgICAgICAgbWVzc2FnZUVuY29kZWQ6IHBhcmFtcy5tZXNzYWdlLm1lc3NhZ2VFbmNvZGVkLFxuICAgICAgICBidWZmZXJUb1NpZ246IEJ1ZmZlci5mcm9tKHBhcmFtcy5tZXNzYWdlLm1lc3NhZ2VFbmNvZGVkID8/ICcnKSxcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0KHNpZ25lZE1lc3NhZ2VSZXF1ZXN0Lm1lc3NhZ2VzLCAnVW5hYmxlIHRvIGZpbmQgbWVzc2FnZXMgaW4gc2lnbmVkTWVzc2FnZVJlcXVlc3QnKTtcbiAgICAgIGFzc2VydChcbiAgICAgICAgc2lnbmVkTWVzc2FnZVJlcXVlc3QubWVzc2FnZXNbMF0uY29tYmluZVNpZ1NoYXJlLFxuICAgICAgICAnVW5hYmxlIHRvIGZpbmQgY29tYmluZVNpZ1NoYXJlIGluIHNpZ25lZE1lc3NhZ2VSZXF1ZXN0Lm1lc3NhZ2VzJ1xuICAgICAgKTtcbiAgICAgIGFzc2VydChzaWduZWRNZXNzYWdlUmVxdWVzdC5tZXNzYWdlc1swXS50eEhhc2gsICdVbmFibGUgdG8gZmluZCB0eEhhc2ggaW4gc2lnbmVkTWVzc2FnZVJlcXVlc3QubWVzc2FnZXMnKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvaW46IHRoaXMuY29pbigpLFxuICAgICAgICB0eEhhc2g6IHNpZ25lZE1lc3NhZ2VSZXF1ZXN0Lm1lc3NhZ2VzWzBdLnR4SGFzaCxcbiAgICAgICAgbWVzc2FnZVJhdzogcGFyYW1zLm1lc3NhZ2U/Lm1lc3NhZ2VSYXcsXG4gICAgICAgIHR4UmVxdWVzdElkOiBzaWduZWRNZXNzYWdlUmVxdWVzdC50eFJlcXVlc3RJZCxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmYWlsZWQgdG8gc2lnbiBtZXNzYWdlICcgKyBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgYSB0eXBlZCBkYXRhIGZyb20gYSBUU1Mgd2FsbGV0LlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNpZ25UeXBlZERhdGFUc3MocGFyYW1zOiBXYWxsZXRTaWduVHlwZWREYXRhT3B0aW9ucyk6IFByb21pc2U8U2lnbmVkTWVzc2FnZT4ge1xuICAgIGlmICghcGFyYW1zLnJlcUlkKSB7XG4gICAgICBwYXJhbXMucmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIH1cbiAgICBpZiAoIXBhcmFtcy5wcnYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHJ2IHJlcXVpcmVkIHRvIHNpZ24gdHlwZWQgZGF0YSB3aXRoIFRTUycpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBsZXQgdHhSZXF1ZXN0O1xuICAgICAgYXNzZXJ0KHBhcmFtcy50eXBlZERhdGEsICd0eXBlZERhdGEgcmVxdWlyZWQgZm9yIHR5cGVkIGRhdGEgc2lnbmluZycpO1xuICAgICAgaWYgKCFwYXJhbXMudHlwZWREYXRhLnR4UmVxdWVzdElkKSB7XG4gICAgICAgIGNvbnN0IGludGVudE9wdGlvbnM6IEludGVudE9wdGlvbnNGb3JUeXBlZERhdGEgPSB7XG4gICAgICAgICAgY3VzdG9kaWFuTWVzc2FnZUlkOiBwYXJhbXMuY3VzdG9kaWFuTWVzc2FnZUlkLFxuICAgICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgICAgICAgaW50ZW50VHlwZTogJ3NpZ25UeXBlZFN0cnVjdHVyZWREYXRhJyxcbiAgICAgICAgICBpc1RzczogdHJ1ZSxcbiAgICAgICAgICB0eXBlZERhdGFSYXc6IHBhcmFtcy50eXBlZERhdGEudHlwZWREYXRhUmF3LFxuICAgICAgICAgIHR5cGVkRGF0YUVuY29kZWQ6IHBhcmFtcy50eXBlZERhdGEudHlwZWREYXRhRW5jb2RlZCEudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB9O1xuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5jcmVhdGVUeFJlcXVlc3RXaXRoSW50ZW50Rm9yVHlwZWREYXRhU2lnbmluZyhpbnRlbnRPcHRpb25zKTtcbiAgICAgICAgcGFyYW1zLnR5cGVkRGF0YS50eFJlcXVlc3RJZCA9IHR4UmVxdWVzdC50eFJlcXVlc3RJZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IGdldFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0aGlzLmlkKCksIHBhcmFtcy50eXBlZERhdGEudHhSZXF1ZXN0SWQpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzaWduZWRUeXBlZERhdGFSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEuc2lnblR4UmVxdWVzdEZvck1lc3NhZ2Uoe1xuICAgICAgICB0eFJlcXVlc3QsXG4gICAgICAgIHBydjogcGFyYW1zLnBydixcbiAgICAgICAgcmVxSWQ6IHBhcmFtcy5yZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpLFxuICAgICAgICBtZXNzYWdlUmF3OiBKU09OLnN0cmluZ2lmeShwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YVJhdyksXG4gICAgICAgIG1lc3NhZ2VFbmNvZGVkOiBwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YUVuY29kZWQhLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgYnVmZmVyVG9TaWduOiBwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YUVuY29kZWQhLFxuICAgICAgfSk7XG4gICAgICBhc3NlcnQoc2lnbmVkVHlwZWREYXRhUmVxdWVzdC5tZXNzYWdlcywgJ1VuYWJsZSB0byBmaW5kIG1lc3NhZ2VzIGluIHNpZ25lZFR5cGVkRGF0YVJlcXVlc3QnKTtcbiAgICAgIGFzc2VydChcbiAgICAgICAgc2lnbmVkVHlwZWREYXRhUmVxdWVzdC5tZXNzYWdlc1swXS5jb21iaW5lU2lnU2hhcmUsXG4gICAgICAgICdVbmFibGUgdG8gZmluZCBjb21iaW5lU2lnU2hhcmUgaW4gc2lnbmVkVHlwZWREYXRhUmVxdWVzdC5tZXNzYWdlcydcbiAgICAgICk7XG4gICAgICBhc3NlcnQoc2lnbmVkVHlwZWREYXRhUmVxdWVzdC5tZXNzYWdlc1swXS50eEhhc2gsICdVbmFibGUgdG8gZmluZCB0eEhhc2ggaW4gc2lnbmVkVHlwZWREYXRhUmVxdWVzdC5tZXNzYWdlcycpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29pbjogdGhpcy5jb2luKCksXG4gICAgICAgIHR4SGFzaDogc2lnbmVkVHlwZWREYXRhUmVxdWVzdC5tZXNzYWdlc1swXS50eEhhc2gsXG4gICAgICAgIG1lc3NhZ2VSYXc6IHBhcmFtcy50eXBlZERhdGEudHlwZWREYXRhUmF3LFxuICAgICAgICB0eFJlcXVlc3RJZDogc2lnbmVkVHlwZWREYXRhUmVxdWVzdC50eFJlcXVlc3RJZCxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmYWlsZWQgdG8gc2lnbiB0eXBlZCBkYXRhICcgKyBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzLCBzaWducywgYW5kIHNlbmRzIGEgdHJhbnNhY3Rpb24gZnJvbSBhIFRTUyB3YWxsZXQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgc2VuZCBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlbmRNYW55VHNzKHBhcmFtczogU2VuZE1hbnlPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHsgYXBpVmVyc2lvbiB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IHN1cHBvcnRlZFR4UmVxdWVzdFZlcnNpb25zID0gdGhpcy50c3NVdGlscz8uc3VwcG9ydGVkVHhSZXF1ZXN0VmVyc2lvbnMoKSA/PyBbXTtcbiAgICBjb25zdCBvbmx5U3VwcG9ydHNUeFJlcXVlc3RGdWxsID1cbiAgICAgIHN1cHBvcnRlZFR4UmVxdWVzdFZlcnNpb25zLmxlbmd0aCA9PT0gMSAmJiBzdXBwb3J0ZWRUeFJlcXVlc3RWZXJzaW9ucy5pbmNsdWRlcygnZnVsbCcpO1xuICAgIGlmIChhcGlWZXJzaW9uID09PSAnbGl0ZScgJiYgb25seVN1cHBvcnRzVHhSZXF1ZXN0RnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUeFJlcXVlc3QgTGl0ZSBBUEkgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyB3YWxsZXQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaWduZWRUcmFuc2FjdGlvbiA9IChhd2FpdCB0aGlzLnByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uKHBhcmFtcykpIGFzIFNpZ25lZFRyYW5zYWN0aW9uUmVxdWVzdDtcbiAgICBpZiAoIXNpZ25lZFRyYW5zYWN0aW9uLnR4UmVxdWVzdElkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R4UmVxdWVzdElkIG1pc3NpbmcgZnJvbSBzaWduZWQgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBCRy01MTEyMiBSZW1vdmUgY29uZGl0aW9uYWwgd2hlbiBtb3ZlZCB0byB0eFJlcXVlc3RGdWxsIGZvciBldmVyeXRoaW5nXG4gICAgaWYgKHRoaXMuX3dhbGxldC50eXBlID09PSAnY3VzdG9kaWFsJykge1xuICAgICAgYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgICAucG9zdChcbiAgICAgICAgICB0aGlzLmJpdGdvLnVybChcbiAgICAgICAgICAgICcvd2FsbGV0LycgKyB0aGlzLl93YWxsZXQuaWQgKyAnL3R4cmVxdWVzdHMvJyArIHNpZ25lZFRyYW5zYWN0aW9uLnR4UmVxdWVzdElkICsgJy90cmFuc2ZlcnMnLFxuICAgICAgICAgICAgMlxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAuc2VuZCgpO1xuICAgIH1cblxuICAgIC8vIEVDRFNBIFRTUyB1c2VzIFR4UmVxdWVzdEZ1bGxcbiAgICBpZiAoYXBpVmVyc2lvbiA9PT0gJ2Z1bGwnIHx8IG9ubHlTdXBwb3J0c1R4UmVxdWVzdEZ1bGwpIHtcbiAgICAgIHJldHVybiBnZXRUeFJlcXVlc3QodGhpcy5iaXRnbywgdGhpcy5pZCgpLCBzaWduZWRUcmFuc2FjdGlvbi50eFJlcXVlc3RJZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudHNzVXRpbHM/LnNlbmRUeFJlcXVlc3Qoc2lnbmVkVHJhbnNhY3Rpb24udHhSZXF1ZXN0SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgZnVuZHMgZnJvbSBhIGZlZSBhZGRyZXNzIHRvIGEgZm9yd2FyZGVyLiBPbmx5IHN1cHBvcnRzIGV0aC1saWtlIGNvaW5zLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gcGFyYW1ldGVycyBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5mb3J3YXJkZXJBZGRyZXNzIC0gQWRkcmVzcyBvZiB0aGUgZm9yd2FyZGVyIHRvIHNlbmQgZnVuZHMgdG8uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuYW1vdW50IC0gQW1vdW50IHRvIHNlbmQgdGhlIGZvcndhcmRlciAob3B0aW9uYWwpLiBJZiBub3QgZ2l2ZW4sIGRlZmF1bHRzIHRvIHNlbmRpbmcgYW4gZXN0aW1hdGUgb2YgdGhlIGFtb3VudCBuZWVkZWQgZm9yIGEgZnVuZCByZWNvdmVyeVxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIHB1YmxpYyBhc3luYyBmdW5kRm9yd2FyZGVyKHBhcmFtczogRnVuZEZvcndhcmRlcnNPcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuZm9yd2FyZGVyQWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZm9yd2FyZGVyIGFkZHJlc3MgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgY29uc3QgdXJsID0gdGhpcy51cmwoJy9mdW5kRm9yd2FyZGVyJyk7XG4gICAgdGhpcy5fd2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHVybCkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBmb3J3YXJkZXIncyBiYWxhbmNlXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBvcHRpb25hbCBxdWVyeSBwYXJhbWV0ZXJzXG4gICAqIEByZXR1cm5zIExpc3Qgb2YgZm9yd2FyZGVyIGFkZHJlc3MgYW5kIGJhbGFuY2VcbiAgICogaWYgcGFyYW1zIGlzIG5vdCBzZXQgdGhlbiByZXR1cm5zIGxvdyBiYWxhbmNlIGZvcndhcmRlcnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRGb3J3YXJkZXJCYWxhbmNlKHBhcmFtcz86IEZvcndhcmRlckJhbGFuY2VPcHRpb25zKTogUHJvbWlzZTxGb3J3YXJkZXJCYWxhbmNlW10+IHtcbiAgICBjb25zdCBxdWVyeTogRm9yd2FyZGVyQmFsYW5jZU9wdGlvbnMgPSB7fTtcbiAgICBpZiAocGFyYW1zPy5tYXhpbXVtQmFsYW5jZSkge1xuICAgICAgcXVlcnkubWF4aW11bUJhbGFuY2UgPSBwYXJhbXM/Lm1heGltdW1CYWxhbmNlO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXM/Lm1pbmltdW1CYWxhbmNlKSB7XG4gICAgICBxdWVyeS5taW5pbXVtQmFsYW5jZSA9IHBhcmFtcz8ubWluaW11bUJhbGFuY2U7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gdGhpcy51cmwoYC9mb3J3YXJkZXJzL2JhbGFuY2VzYCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmJpdGdvLmdldCh1cmwpLnF1ZXJ5KHF1ZXJ5KS5yZXN1bHQoKTtcbiAgICByZXR1cm4gcmVzcG9uc2UgYXMgRm9yd2FyZGVyQmFsYW5jZVtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGVjZHNhIHRzcyBjaGFsbGVuZ2VzIGZvciBhIHdhbGxldC5cbiAgICogVGhlc2UgYXJlIHN0YXRpYyBjaGFsbGVuZ2VzIHRoYXQgaGF2ZSBiZWVuIHZlcmlmaWVkIGJ5IGFuIGVudGVycHJpc2UgYWRtaW4uXG4gICAqIENhbGxlcnMgc2hvdWxkIHZlcmlmeSB0aGF0IGFuIGVudGVycHJpc2UgYWRtaW4gc2lnbmVkIHRoZSBjaGFsbGVuZ2UgdmFsdWVzIGJlZm9yZSB1c2luZyB0aGVtLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxXYWxsZXRFY2RzYUNoYWxsZW5nZXM+fVxuICAgKi9cbiAgYXN5bmMgZ2V0Q2hhbGxlbmdlc0ZvckVjZHNhU2lnbmluZygpOiBQcm9taXNlPFdhbGxldEVjZHNhQ2hhbGxlbmdlcz4ge1xuICAgIC8vIG5vdGU6IHRoaXMgaXMgbm90IGEgY29pbiBzcGVjaWZpYyByb3V0ZSwgd2UgY2Fubm90IHVzZSB0aGlzLnVybCguLilcbiAgICBjb25zdCB1cmwgPSB0aGlzLmJpdGdvLnVybChgL3dhbGxldC8ke3RoaXMuaWQoKX0vY2hhbGxlbmdlc2AsIDIpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmdldCh1cmwpLnF1ZXJ5KHt9KS5yZXN1bHQoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2VuZFRyYW5zYWN0aW9uKHBhcmFtczogVHhTZW5kQm9keSkge1xuICAgIC8vIGV4dHJhY3QgdGhlIHdoaXRlbGlzdGVkIHBhcmFtcyBmcm9tIHRoZSB0b3AgbGV2ZWwsIGluIGNhc2VcbiAgICAvLyBvdGhlciBpbnZhbGlkIHBhcmFtcyBhcmUgcHJlc2VudCB0aGF0IHdvdWxkIGZhaWwgZW5jb2RpbmdcbiAgICAvLyBhbmQgZmFsbCBiYWNrIHRvIHRoZSBib2R5IHBhcmFtc1xuICAgIGNvbnN0IHdoaXRlbGlzdGVkUGFyYW1zID0gXy5waWNrKHBhcmFtcywgd2hpdGVsaXN0ZWRTZW5kUGFyYW1zKTtcbiAgICByZXR1cm4gcG9zdFdpdGhDb2RlYyhcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5pZCgpICsgJy90eC9zZW5kJyksXG4gICAgICBUeFNlbmRCb2R5LFxuICAgICAgd2hpdGVsaXN0ZWRQYXJhbXNcbiAgICApLnJlc3VsdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWF0ZVRyYW5zYWN0aW9uKHBhcmFtczogVHhTZW5kQm9keSkge1xuICAgIC8vIGV4dHJhY3QgdGhlIHdoaXRlbGlzdGVkIHBhcmFtcyBmcm9tIHRoZSB0b3AgbGV2ZWwsIGluIGNhc2VcbiAgICAvLyBvdGhlciBpbnZhbGlkIHBhcmFtcyBhcmUgcHJlc2VudCB0aGF0IHdvdWxkIGZhaWwgZW5jb2RpbmdcbiAgICAvLyBhbmQgZmFsbCBiYWNrIHRvIHRoZSBib2R5IHBhcmFtc1xuICAgIGNvbnN0IHdoaXRlbGlzdGVkUGFyYW1zID0gXy5waWNrKHBhcmFtcywgd2hpdGVsaXN0ZWRTZW5kUGFyYW1zKTtcbiAgICByZXR1cm4gcG9zdFdpdGhDb2RlYyhcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5pZCgpICsgJy90eC9pbml0aWF0ZScpLFxuICAgICAgVHhTZW5kQm9keSxcbiAgICAgIHdoaXRlbGlzdGVkUGFyYW1zXG4gICAgKS5yZXN1bHQoKTtcbiAgfVxufVxuIl19
3820
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3dhbGxldC93YWxsZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0dBRUc7QUFDSCxzREFBMEU7QUFDMUUsaURBQWlEO0FBQ2pELG9EQUE0QjtBQUM1QixnRUFBcUM7QUFDckMseUNBQTJCO0FBQzNCLDBDQUE0QjtBQUU1QixxREFBdUM7QUFDdkMsa0RBQTREO0FBVTVELHdDQUEyQztBQUUzQyxrQ0FBMEM7QUFDMUMsc0NBTW1CO0FBRW5CLDBDQUEwQztBQUMxQywrREFBaUQ7QUFDakQsMENBQXdHO0FBQ3hHLDBFQUF1RTtBQUN2RSx3REFBeUY7QUFDekYsd0NBQTREO0FBQzVELHdDQUE0QztBQUM1QyxnQ0FBc0M7QUFDdEMsb0NBU2tCO0FBQ2xCLDBEQUF1RDtBQUN2RCw4Q0FBaUU7QUFDakUsNERBQWlFO0FBQ2pFLGtEQUF5RjtBQUN6RiwrQ0FBNEQ7QUErRTVELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBSWxELE1BQU0scUJBQXFCLEdBQUcseUJBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUV6RixJQUFZLHFCQUdYO0FBSEQsV0FBWSxxQkFBcUI7SUFDL0IsNkVBQVUsQ0FBQTtJQUNWLHVGQUFlLENBQUE7QUFDakIsQ0FBQyxFQUhXLHFCQUFxQixxQ0FBckIscUJBQXFCLFFBR2hDO0FBRUQsU0FBUywyQkFBMkIsQ0FDbEMsVUFBMEQ7SUFFMUQsSUFBSSxDQUFDLFVBQVUsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNs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RjtBQXp3SUQsd0JBeXdJQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKi9cbmltcG9ydCB7IFR4U2VuZEJvZHksIHR5cGUgQWRkcmVzc1F1ZXJ5UmVzdWx0IH0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5pbXBvcnQgeyBDb2luRmFtaWx5IH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgKiBhcyB0IGZyb20gJ2lvLXRzJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IElSZXF1ZXN0VHJhY2VyIH0gZnJvbSAnLi4vLi4vYXBpJztcbmltcG9ydCAqIGFzIGNvbW1vbiBmcm9tICcuLi8uLi9jb21tb24nO1xuaW1wb3J0IHsgQWRkcmVzc0Jvb2ssIElBZGRyZXNzQm9vayB9IGZyb20gJy4uL2FkZHJlc3MtYm9vayc7XG5pbXBvcnQge1xuICBJQmFzZUNvaW4sXG4gIE5GVFRyYW5zZmVyT3B0aW9ucyxcbiAgU2lnbmVkTWVzc2FnZSxcbiAgU2lnbmVkVHJhbnNhY3Rpb24sXG4gIFNpZ25lZFRyYW5zYWN0aW9uUmVxdWVzdCxcbiAgVHJhbnNhY3Rpb25QcmVidWlsZCxcbiAgVmVyaWZ5QWRkcmVzc09wdGlvbnMsXG59IGZyb20gJy4uL2Jhc2VDb2luJztcbmltcG9ydCB7IG1ha2VSYW5kb21LZXkgfSBmcm9tICcuLi9iaXRjb2luJztcbmltcG9ydCB7IEJpdEdvQmFzZSB9IGZyb20gJy4uL2JpdGdvQmFzZSc7XG5pbXBvcnQgeyBnZXRTaGFyZWRTZWNyZXQgfSBmcm9tICcuLi9lY2RoJztcbmltcG9ydCB7XG4gIEFkZHJlc3NHZW5lcmF0aW9uRXJyb3IsXG4gIEluY29ycmVjdFBhc3N3b3JkRXJyb3IsXG4gIE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IsXG4gIE1pc3NpbmdFbmNyeXB0ZWRLZXljaGFpbkVycm9yLFxuICBOZWVkVXNlclNpZ251cEVycm9yLFxufSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgU3VibWl0VHJhbnNhY3Rpb25SZXNwb25zZSB9IGZyb20gJy4uL2luc2NyaXB0aW9uQnVpbGRlcic7XG5pbXBvcnQgeyBkcmF3S2V5Y2FyZCB9IGZyb20gJy4uL2ludGVybmFsJztcbmltcG9ydCAqIGFzIGludGVybmFsIGZyb20gJy4uL2ludGVybmFsL2ludGVybmFsJztcbmltcG9ydCB7IGRlY3J5cHRLZXljaGFpblByaXZhdGVLZXksIEtleWNoYWluLCBLZXljaGFpbldpdGhFbmNyeXB0ZWRQcnYsIEtleUluZGljZXMgfSBmcm9tICcuLi9rZXljaGFpbic7XG5pbXBvcnQgeyBnZXRMaWdodG5pbmdBdXRoS2V5IH0gZnJvbSAnLi4vbGlnaHRuaW5nL2xpZ2h0bmluZ1dhbGxldFV0aWwnO1xuaW1wb3J0IHsgSVBlbmRpbmdBcHByb3ZhbCwgUGVuZGluZ0FwcHJvdmFsLCBQZW5kaW5nQXBwcm92YWxzIH0gZnJvbSAnLi4vcGVuZGluZ0FwcHJvdmFsJztcbmltcG9ydCB7IEdvU3Rha2luZ1dhbGxldCwgU3Rha2luZ1dhbGxldCB9IGZyb20gJy4uL3N0YWtpbmcnO1xuaW1wb3J0IHsgVHJhZGluZ0FjY291bnQgfSBmcm9tICcuLi90cmFkaW5nJztcbmltcG9ydCB7IGdldFR4UmVxdWVzdCB9IGZyb20gJy4uL3Rzcyc7XG5pbXBvcnQge1xuICBFZGRzYVVuc2lnbmVkVHJhbnNhY3Rpb24sXG4gIEludGVudE9wdGlvbnNGb3JNZXNzYWdlLFxuICBJbnRlbnRPcHRpb25zRm9yVHlwZWREYXRhLFxuICBSZXF1ZXN0VHJhY2VyLFxuICBSZXF1ZXN0VHlwZSxcbiAgVG9rZW5UcmFuc2ZlclJlY2lwaWVudFBhcmFtcyxcbiAgVG9rZW5UeXBlLFxuICBUeFJlcXVlc3QsXG59IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IHBvc3RXaXRoQ29kZWMgfSBmcm9tICcuLi91dGlscy9wb3N0V2l0aENvZGVjJztcbmltcG9ydCB7IEVjZHNhTVBDdjJVdGlscywgRWNkc2FVdGlscyB9IGZyb20gJy4uL3V0aWxzL3Rzcy9lY2RzYSc7XG5pbXBvcnQgRWRkc2FVdGlscywgeyBFZGRzYU1QQ3YyVXRpbHMgfSBmcm9tICcuLi91dGlscy90c3MvZWRkc2EnO1xuaW1wb3J0IHsgZ2V0VHhSZXF1ZXN0QXBpVmVyc2lvbiwgdmFsaWRhdGVUeFJlcXVlc3RBcGlWZXJzaW9uIH0gZnJvbSAnLi4vdXRpbHMvdHhSZXF1ZXN0JztcbmltcG9ydCB7IGJ1aWxkUGFyYW1LZXlzLCBCdWlsZFBhcmFtcyB9IGZyb20gJy4vQnVpbGRQYXJhbXMnO1xuaW1wb3J0IHtcbiAgQWNjZWxlcmF0ZVRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgQWRkcmVzc2VzQnlCYWxhbmNlT3B0aW9ucyxcbiAgQWRkcmVzc2VzT3B0aW9ucyxcbiAgQnVpbGRDb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25PcHRpb25zLFxuICBCdWlsZFRva2VuRW5hYmxlbWVudE9wdGlvbnMsXG4gIEJ1bGtDcmVhdGVTaGFyZU9wdGlvbixcbiAgQnVsa1dhbGxldFNoYXJlS2V5Y2hhaW4sXG4gIEJ1bGtXYWxsZXRTaGFyZU9wdGlvbnMsXG4gIENoYW5nZUZlZU9wdGlvbnMsXG4gIENvbnNvbGlkYXRlVW5zcGVudHNPcHRpb25zLFxuICBDcmVhdGVBZGRyZXNzT3B0aW9ucyxcbiAgQ3JlYXRlQnVsa1dhbGxldFNoYXJlTGlzdFJlc3BvbnNlLFxuICBDcmVhdGVQb2xpY3lSdWxlT3B0aW9ucyxcbiAgQ3JlYXRlU2hhcmVPcHRpb25zLFxuICBDcm9zc0NoYWluVVRYTyxcbiAgRGVjcnlwdGVkS2V5Y2hhaW5EYXRhLFxuICBEZXBsb3lGb3J3YXJkZXJzT3B0aW9ucyxcbiAgRG93bmxvYWRLZXljYXJkT3B0aW9ucyxcbiAgRmFub3V0VW5zcGVudHNPcHRpb25zLFxuICBGZXRjaENyb3NzQ2hhaW5VVFhPc09wdGlvbnMsXG4gIEZsdXNoRm9yd2FyZGVyVG9rZW5PcHRpb25zLFxuICBGb3J3YXJkZXJCYWxhbmNlLFxuICBGb3J3YXJkZXJCYWxhbmNlT3B0aW9ucyxcbiAgRnJlZXplT3B0aW9ucyxcbiAgRnVuZEZvcndhcmRlclBhcmFtcyxcbiAgRnVuZEZvcndhcmRlcnNPcHRpb25zLFxuICBHZXRBZGRyZXNzT3B0aW9ucyxcbiAgR2V0UHJ2T3B0aW9ucyxcbiAgR2V0VHJhbnNhY3Rpb25PcHRpb25zLFxuICBHZXRUcmFuc2Zlck9wdGlvbnMsXG4gIEdldFVzZXJQcnZPcHRpb25zLFxuICB0eXBlIElXYWxsZXQsXG4gIE1hbmFnZVVuc3BlbnRSZXNlcnZhdGlvbk9wdGlvbnMsXG4gIE1heGltdW1TcGVuZGFibGUsXG4gIE1heGltdW1TcGVuZGFibGVPcHRpb25zLFxuICBNb2RpZnlXZWJob29rT3B0aW9ucyxcbiAgTmZ0QmFsYW5jZSxcbiAgUGFnaW5hdGlvbk9wdGlvbnMsXG4gIFByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgUHJlYnVpbGRUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQsXG4gIFJlY292ZXJUb2tlbk9wdGlvbnMsXG4gIFJlbW92ZVBvbGljeVJ1bGVPcHRpb25zLFxuICBSZW1vdmVVc2VyT3B0aW9ucyxcbiAgU2VuZE1hbnlPcHRpb25zLFxuICBTZW5kTkZUT3B0aW9ucyxcbiAgU2VuZE5GVFJlc3VsdCxcbiAgU2VuZE9wdGlvbnMsXG4gIFNoYXJlZEtleUNoYWluLFxuICBTaGFyZVdhbGxldE9wdGlvbnMsXG4gIFNpZ25BbmRTZW5kVHhSZXF1ZXN0T3B0aW9ucyxcbiAgU2ltdWxhdGVXZWJob29rT3B0aW9ucyxcbiAgU3VibWl0VHJhbnNhY3Rpb25PcHRpb25zLFxuICBTdWJXYWxsZXRUeXBlLFxuICBTd2VlcE9wdGlvbnMsXG4gIFRyYW5zZmVyQnlTZXF1ZW5jZUlkT3B0aW9ucyxcbiAgVHJhbnNmZXJDb21tZW50T3B0aW9ucyxcbiAgVHJhbnNmZXJzT3B0aW9ucyxcbiAgVW5zcGVudHNPcHRpb25zLFxuICBVcGRhdGVBZGRyZXNzT3B0aW9ucyxcbiAgVXBkYXRlQnVpbGREZWZhdWx0T3B0aW9ucyxcbiAgVXBkYXRlV2FsbGV0T3B0aW9ucyxcbiAgV2FsbGV0Q29pblNwZWNpZmljLFxuICBXYWxsZXREYXRhLFxuICBXYWxsZXRFY2RzYUNoYWxsZW5nZXMsXG4gIFdhbGxldFNpZ25NZXNzYWdlT3B0aW9ucyxcbiAgV2FsbGV0U2lnblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgV2FsbGV0U2lnblR5cGVkRGF0YU9wdGlvbnMsXG4gIFdhbGxldFR5cGUsXG4gIEJ1aWxkVG9rZW5BcHByb3ZhbFJlc3BvbnNlLFxuICBXYWxsZXRJbml0UmVzdWx0LFxuICBHZXRBY2NvdW50UmVzb3VyY2VzT3B0aW9ucyxcbiAgR2V0QWNjb3VudFJlc291cmNlc1Jlc3BvbnNlLFxuICBHZXRSZXNvdXJjZURlbGVnYXRpb25zT3B0aW9ucyxcbiAgR2V0UmVzb3VyY2VEZWxlZ2F0aW9uc1Jlc3BvbnNlLFxufSBmcm9tICcuL2lXYWxsZXQnO1xuXG5jb25zdCBkZWJ1ZyA9IHJlcXVpcmUoJ2RlYnVnJykoJ2JpdGdvOnYyOndhbGxldCcpO1xuXG50eXBlIE1hbmFnZVVuc3BlbnRzID0gJ2NvbnNvbGlkYXRlJyB8ICdmYW5vdXQnO1xuXG5jb25zdCB3aGl0ZWxpc3RlZFNlbmRQYXJhbXMgPSBUeFNlbmRCb2R5LnR5cGUudHlwZXMuZmxhdE1hcCgodCkgPT4gT2JqZWN0LmtleXModC5wcm9wcykpO1xuXG5leHBvcnQgZW51bSBNYW5hZ2VVbnNwZW50c09wdGlvbnMge1xuICBCVUlMRF9PTkxZLFxuICBCVUlMRF9TSUdOX1NFTkQsXG59XG5cbmZ1bmN0aW9uIGlzUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdChcbiAgcHJlYnVpbGRUeDogc3RyaW5nIHwgUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdCB8IHVuZGVmaW5lZFxuKTogcHJlYnVpbGRUeCBpcyBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0IHtcbiAgaWYgKCFwcmVidWlsZFR4IHx8IHR5cGVvZiBwcmVidWlsZFR4ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gKHByZWJ1aWxkVHggYXMgUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdCkud2FsbGV0SWQgIT09IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGNsYXNzIFdhbGxldCBpbXBsZW1lbnRzIElXYWxsZXQge1xuICBwdWJsaWMgcmVhZG9ubHkgYml0Z286IEJpdEdvQmFzZTtcbiAgcHVibGljIHJlYWRvbmx5IGJhc2VDb2luOiBJQmFzZUNvaW47XG4gIHB1YmxpYyBfd2FsbGV0OiBXYWxsZXREYXRhO1xuICBwcml2YXRlIHJlYWRvbmx5IHRzc1V0aWxzOiBFY2RzYVV0aWxzIHwgRWNkc2FNUEN2MlV0aWxzIHwgRWRkc2FVdGlscyB8IEVkZHNhTVBDdjJVdGlscyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBfcGVybWlzc2lvbnM/OiBzdHJpbmdbXTtcblxuICBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBiYXNlQ29pbjogSUJhc2VDb2luLCB3YWxsZXREYXRhOiBhbnkpIHtcbiAgICB0aGlzLmJpdGdvID0gYml0Z287XG4gICAgdGhpcy5iYXNlQ29pbiA9IGJhc2VDb2luO1xuICAgIHRoaXMuX3dhbGxldCA9IHdhbGxldERhdGE7XG4gICAgY29uc3QgdXNlcklkID0gXy5nZXQoYml0Z28sICdfdXNlci5pZCcpO1xuICAgIGlmIChfLmlzU3RyaW5nKHVzZXJJZCkpIHtcbiAgICAgIGNvbnN0IHVzZXJEZXRhaWxzID0gXy5maW5kKHdhbGxldERhdGEudXNlcnMsIHsgdXNlcjogdXNlcklkIH0pO1xuICAgICAgdGhpcy5fcGVybWlzc2lvbnMgPSBfLmdldCh1c2VyRGV0YWlscywgJ3Blcm1pc3Npb25zJyk7XG4gICAgfVxuICAgIGlmIChiYXNlQ29pbj8uc3VwcG9ydHNUc3MoKSAmJiB0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlID09PSAndHNzJykge1xuICAgICAgc3dpdGNoIChiYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSkge1xuICAgICAgICBjYXNlICdlY2RzYSc6XG4gICAgICAgICAgaWYgKHdhbGxldERhdGEubXVsdGlzaWdUeXBlVmVyc2lvbiA9PT0gJ01QQ3YyJykge1xuICAgICAgICAgICAgdGhpcy50c3NVdGlscyA9IG5ldyBFY2RzYU1QQ3YyVXRpbHMoYml0Z28sIGJhc2VDb2luLCB0aGlzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50c3NVdGlscyA9IG5ldyBFY2RzYVV0aWxzKGJpdGdvLCBiYXNlQ29pbiwgdGhpcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdlZGRzYSc6XG4gICAgICAgICAgaWYgKHdhbGxldERhdGEubXVsdGlzaWdUeXBlVmVyc2lvbiA9PT0gJ01QQ3YyJykge1xuICAgICAgICAgICAgdGhpcy50c3NVdGlscyA9IG5ldyBFZGRzYU1QQ3YyVXRpbHMoYml0Z28sIGJhc2VDb2luLCB0aGlzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50c3NVdGlscyA9IG5ldyBFZGRzYVV0aWxzKGJpdGdvLCBiYXNlQ29pbiwgdGhpcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRoaXMudHNzVXRpbHMgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgVVJMIHVzaW5nIHRoaXMgd2FsbGV0J3MgaWQgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIEJpdEdvIEFQSSBvcGVyYXRpb25zXG4gICAqIEBwYXJhbSBleHRyYSBBUEkgc3BlY2lmaWMgc3RyaW5nIHRvIGFwcGVuZCB0byB0aGUgd2FsbGV0IGlkXG4gICAqL1xuICB1cmwoZXh0cmEgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLmlkKCkgKyBleHRyYSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoaXMgd2FsbGV0J3MgaWRcbiAgICovXG4gIGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5pZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG51bWJlciBvZiBhcHByb3ZhbHMgcmVxdWlyZWQgZm9yIHNwZW5kaW5nIGZ1bmRzIGZyb20gdGhpcyB3YWxsZXRcbiAgICovXG4gIGFwcHJvdmFsc1JlcXVpcmVkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5hcHByb3ZhbHNSZXF1aXJlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgYmFsYW5jZSBvZiB0aGlzIHdhbGxldFxuICAgKi9cbiAgYmFsYW5jZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuYmFsYW5jZTtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCB1c2UgY29kZWMgaW5zdGVhZDogdC5leGFjdChCdWlsZFBhcmFtcykuZW5jb2RlKHYpICovXG4gIHByZWJ1aWxkV2hpdGVsaXN0ZWRQYXJhbXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBidWlsZFBhcmFtS2V5cztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGlzIGEgc3RyaWN0IHN1Yi1zZXQgb2YgcHJlYnVpbGRXaGl0ZWxpc3RlZFBhcmFtc1xuICAgKi9cbiAgcHJlYnVpbGRDb25zb2xpZGF0ZUFjY291bnRQYXJhbXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbXG4gICAgICAnY29uc29saWRhdGVBZGRyZXNzZXMnLFxuICAgICAgJ25mdENvbGxlY3Rpb25JZCcsXG4gICAgICAnbmZ0SWQnLFxuICAgICAgJ2ZlZVJhdGUnLFxuICAgICAgJ21heEZlZVJhdGUnLFxuICAgICAgJ21lbW8nLFxuICAgICAgJ3ZhbGlkRnJvbUJsb2NrJyxcbiAgICAgICd2YWxpZFRvQmxvY2snLFxuICAgICAgJ3ByZXZpZXcnLFxuICAgICAgJ2tlZXBBbGl2ZScsXG4gICAgICAnYXBpVmVyc2lvbicsXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNvbmZpcm1lZCBiYWxhbmNlIG9mIHRoaXMgd2FsbGV0XG4gICAqL1xuICBjb25maXJtZWRCYWxhbmNlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5jb25maXJtZWRCYWxhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgc3BlbmRhYmxlIGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXRcbiAgICovXG4gIHNwZW5kYWJsZUJhbGFuY2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LnNwZW5kYWJsZUJhbGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBiYWxhbmNlIG9mIHRoaXMgd2FsbGV0XG4gICAqXG4gICAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gYmFsYW5jZXMgaGF2ZSB0aGUgcG90ZW50aWFsIHRvIG92ZXJmbG93IHN0YW5kYXJkIGphdmFzY3JpcHQgbnVtYmVyc1xuICAgKi9cbiAgYmFsYW5jZVN0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuYmFsYW5jZVN0cmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbmZpcm1lZCBiYWxhbmNlIG9mIHRoaXMgd2FsbGV0XG4gICAqXG4gICAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gYmFsYW5jZXMgaGF2ZSB0aGUgcG90ZW50aWFsIHRvIG92ZXJmbG93IHN0YW5kYXJkIGphdmFzY3JpcHQgbnVtYmVyc1xuICAgKi9cbiAgY29uZmlybWVkQmFsYW5jZVN0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuY29uZmlybWVkQmFsYW5jZVN0cmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZW5kYWJsZSBiYWxhbmNlIG9mIHRoaXMgd2FsbGV0XG4gICAqXG4gICAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gYmFsYW5jZXMgaGF2ZSB0aGUgcG90ZW50aWFsIHRvIG92ZXJmbG93IHN0YW5kYXJkIGphdmFzY3JpcHQgbnVtYmVyc1xuICAgKi9cbiAgc3BlbmRhYmxlQmFsYW5jZVN0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuc3BlbmRhYmxlQmFsYW5jZVN0cmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNvaW4gaWRlbnRpZmllciBmb3IgdGhlIHR5cGUgb2YgY29pbiB0aGlzIHdhbGxldCBob2xkc1xuICAgKi9cbiAgY29pbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuY29pbjtcbiAgfVxuXG4gIHR5cGUoKTogV2FsbGV0VHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC50eXBlIHx8ICdob3QnO1xuICB9XG5cbiAgbXVsdGlzaWdUeXBlKCk6ICdvbmNoYWluJyB8ICd0c3MnIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZTtcbiAgfVxuXG4gIG11bHRpc2lnVHlwZVZlcnNpb24oKTogJ01QQ3YyJyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGVWZXJzaW9uO1xuICB9XG5cbiAgc3ViVHlwZSgpOiBTdWJXYWxsZXRUeXBlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LnN1YlR5cGU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsYWJlbCAobmFtZSkgZm9yIHRoaXMgd2FsbGV0XG4gICAqL1xuICBwdWJsaWMgbGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmxhYmVsO1xuICB9XG5cbiAgcHVibGljIGZsYWdzKCk6IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC53YWxsZXRGbGFncyA/PyBbXTtcbiAgfVxuXG4gIHB1YmxpYyBmbGFnKG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmxhZ3MoKS5maW5kKChmbGFnKSA9PiBmbGFnLm5hbWUgPT09IG5hbWUpPy52YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHB1YmxpYyBvYmplY3QgaWRzIGZvciB0aGUga2V5Y2hhaW5zIG9uIHRoaXMgd2FsbGV0LlxuICAgKi9cbiAgcHVibGljIGtleUlkcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5rZXlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHJlY2VpdmUgYWRkcmVzcyBmb3IgdGhpcyB3YWxsZXRcbiAgICovXG4gIHB1YmxpYyByZWNlaXZlQWRkcmVzcygpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQucmVjZWl2ZUFkZHJlc3M/LmFkZHJlc3M7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB3YWxsZXQgaWQgb2YgdGhlIHdhbGxldCB0aGF0IHRoaXMgd2FsbGV0IHdhcyBtaWdyYXRlZCBmcm9tLlxuICAgKlxuICAgKiBGb3IgZXhhbXBsZSwgaWYgdGhpcyBpcyBhIEJDSCB3YWxsZXQgdGhhdCB3YXMgY3JlYXRlZCBmcm9tIGEgQlRDIHdhbGxldCxcbiAgICogdGhlIEJDSCB3YWxsZXQgbWlncmF0ZWQgZnJvbSBmaWVsZCB3b3VsZCBoYXZlIHRoZSBCVEMgd2FsbGV0IGlkLlxuICAgKi9cbiAgcHVibGljIG1pZ3JhdGVkRnJvbSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQubWlncmF0ZWRGcm9tO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgdG9rZW4gZmx1c2ggdGhyZXNob2xkcyBmb3IgdGhpcyB3YWxsZXRcbiAgICogQHJldHVybiB7KnxPYmplY3R9IHBhaXJzIG9mIHsgW3Rva2VuTmFtZV06IHRocmVzaG9sZHMgfSBiYXNlIHVuaXRzXG4gICAqL1xuICB0b2tlbkZsdXNoVGhyZXNob2xkcygpOiBhbnkge1xuICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpICE9PSAnZXRoJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdub3Qgc3VwcG9ydGVkIGZvciB0aGlzIHdhbGxldCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYy50b2tlbkZsdXNoVGhyZXNob2xkcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgd2FsbGV0IHByb3BlcnRpZXMgd2hpY2ggYXJlIHNwZWNpZmljIHRvIGNlcnRhaW4gY29pbiBpbXBsZW1lbnRhdGlvbnNcbiAgICovXG4gIGNvaW5TcGVjaWZpYygpOiBXYWxsZXRDb2luU3BlY2lmaWMgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgcGVuZGluZyBhcHByb3ZhbHMgb24gdGhpcyB3YWxsZXRcbiAgICovXG4gIHBlbmRpbmdBcHByb3ZhbHMoKTogSVBlbmRpbmdBcHByb3ZhbFtdIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LnBlbmRpbmdBcHByb3ZhbHMubWFwKChjdXJyZW50QXBwcm92YWwpID0+IHtcbiAgICAgIHJldHVybiBuZXcgUGVuZGluZ0FwcHJvdmFsKHRoaXMuYml0Z28sIHRoaXMuYmFzZUNvaW4sIGN1cnJlbnRBcHByb3ZhbCwgdGhpcyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVmcmVzaCB0aGUgd2FsbGV0IG9iamVjdCBieSBzeW5jaW5nIHdpdGggdGhlIGJhY2stZW5kXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMge1dhbGxldH1cbiAgICovXG4gIGFzeW5jIHJlZnJlc2gocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBuZXZlcj4gPSB7fSk6IFByb21pc2U8V2FsbGV0PiB7XG4gICAgdGhpcy5fd2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoKSkucmVzdWx0KCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB0aGUgdHJhbnNhY3Rpb25zIGZvciBhIGdpdmVuIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgdHJhbnNhY3Rpb25zKHBhcmFtczogUGFnaW5hdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcXVlcnk6IFBhZ2luYXRpb25PcHRpb25zID0ge307XG5cbiAgICBpZiAocGFyYW1zLnByZXZJZCkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5wcmV2SWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwcmV2SWQgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnByZXZJZCA9IHBhcmFtcy5wcmV2SWQ7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5saW1pdCkge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5saW1pdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxpbWl0IGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5saW1pdCA9IHBhcmFtcy5saW1pdDtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLmdldCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5fd2FsbGV0LmlkICsgJy90eCcpKVxuICAgICAgLnF1ZXJ5KHF1ZXJ5KVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIGxpc3Qgb2YgbmZ0IHRva2VucyBmb3IgdGhpcyB3YWxsZXQuIFdpbGwgYWx3YXlzIHJldHVybiB1bmRlZmluZWQgaWYgdGhlIHdhbGxldFxuICAgKiB3YXMgbm90IGluaXRpYWxpemVkIHdpdGggdGhlIGFsbFRva2VucyBmbGFnLlxuICAgKlxuICAgKiBAcmV0dXJucyB7TmZ0QmFsYW5jZVtdIHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgbmZ0QmFsYW5jZXMoKTogTmZ0QmFsYW5jZVtdIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5fd2FsbGV0Lm5mdHMpIHtcbiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuX3dhbGxldC5uZnRzKS5tYXAoKG5mdERhdGEpID0+IG5mdERhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIGxpc3Qgb2YgdW5zdXBwb3J0ZWQgbmZ0IHRva2VucyBmb3IgdGhpcyB3YWxsZXQuIFdpbGwgYWx3YXlzIHJldHVybiB1bmRlZmluZWQgaWYgdGhlIHdhbGxldFxuICAgKiB3YXMgbm90IGluaXRpYWxpemVkIHdpdGggdGhlIGFsbFRva2VucyBmbGFnLlxuICAgKlxuICAgKiBAcmV0dXJucyB7TmZ0QmFsYW5jZVtdIHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgdW5zdXBwb3J0ZWROZnRCYWxhbmNlcygpOiBOZnRCYWxhbmNlW10gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLl93YWxsZXQudW5zdXBwb3J0ZWROZnRzKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLl93YWxsZXQudW5zdXBwb3J0ZWROZnRzKS5tYXAoKG5mdERhdGEpID0+IG5mdERhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsaXN0IG9mIHRoZSB3YWxsZXRzIG5mdCAmIHVuc3VwcG9ydGVkIG5mdHMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtOZnRCYWxhbmNlW119XG4gICAqL1xuICBhc3luYyBnZXROZnRCYWxhbmNlcygpOiBQcm9taXNlPE5mdEJhbGFuY2VbXT4ge1xuICAgIGNvbnN0IHdhbGxldERhdGE6IFBhcnRpYWw8V2FsbGV0RGF0YT4gPSBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgpKS5xdWVyeSh7IGFsbFRva2VuczogdHJ1ZSB9KS5yZXN1bHQoKTtcblxuICAgIGNvbnN0IHN1cHBvcnRlZE5mdHMgPSB3YWxsZXREYXRhPy5uZnRzID8gT2JqZWN0LnZhbHVlcyh3YWxsZXREYXRhLm5mdHMpLm1hcCgoYmFsYW5jZSkgPT4gYmFsYW5jZSkgOiBbXTtcblxuICAgIGNvbnN0IHVuc3VwcG9ydGVkTmZ0cyA9IHdhbGxldERhdGE/LnVuc3VwcG9ydGVkTmZ0c1xuICAgICAgPyBPYmplY3QudmFsdWVzKHdhbGxldERhdGEudW5zdXBwb3J0ZWROZnRzKS5tYXAoKGJhbGFuY2UpID0+IGJhbGFuY2UpXG4gICAgICA6IFtdO1xuICAgIHJldHVybiBbLi4uc3VwcG9ydGVkTmZ0cywgLi4udW5zdXBwb3J0ZWROZnRzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHRoZSB0cmFuc2FjdGlvbnMgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogIC0gdHhIYXNoIHRoZSB0cmFuc2FjdGlvbiBoYXNoIHRvIHNlYXJjaCBmb3JcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBnZXRUcmFuc2FjdGlvbihwYXJhbXM6IEdldFRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3R4SGFzaCddLCBbXSk7XG5cbiAgICBjb25zdCBwYWdpbmF0ZWRPcHRpb25zOiBQYWdpbmF0aW9uT3B0aW9ucyA9IHt9O1xuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMucHJldklkKSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5wcmV2SWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwcmV2SWQgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHBhZ2luYXRlZE9wdGlvbnMucHJldklkID0gcGFyYW1zLnByZXZJZDtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmxpbWl0KSkge1xuICAgICAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMubGltaXQpIHx8IHBhcmFtcy5saW1pdCA8IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxpbWl0IGFyZ3VtZW50LCBleHBlY3RpbmcgcG9zaXRpdmUgaW50ZWdlcicpO1xuICAgICAgfVxuICAgICAgcGFnaW5hdGVkT3B0aW9ucy5saW1pdCA9IHBhcmFtcy5saW1pdDtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeSA9IHBhZ2luYXRlZE9wdGlvbnM7XG4gICAgaWYgKHBhcmFtcy5pbmNsdWRlUmJmKSB7XG4gICAgICBxdWVyeVsnaW5jbHVkZVJiZiddID0gcGFyYW1zLmluY2x1ZGVSYmY7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5nZXQodGhpcy51cmwoJy90eC8nICsgcGFyYW1zLnR4SGFzaCkpXG4gICAgICAucXVlcnkocXVlcnkpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB0aGUgdHJhbnNmZXJzIGZvciBhIGdpdmVuIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgdHJhbnNmZXJzKHBhcmFtczogVHJhbnNmZXJzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBxdWVyeTogVHJhbnNmZXJzT3B0aW9ucyA9IHt9O1xuICAgIGlmIChwYXJhbXMucHJldklkKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByZXZJZCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkucHJldklkID0gcGFyYW1zLnByZXZJZDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmxpbWl0KSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmxpbWl0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuYWxsVG9rZW5zKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5hbGxUb2tlbnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhbGxUb2tlbnMgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5hbGxUb2tlbnMgPSBwYXJhbXMuYWxsVG9rZW5zO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuc2VhcmNoTGFiZWwpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMuc2VhcmNoTGFiZWwpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzZWFyY2hMYWJlbCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkuc2VhcmNoTGFiZWwgPSBwYXJhbXMuc2VhcmNoTGFiZWw7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5hZGRyZXNzKSB7XG4gICAgICBpZiAoIV8uaXNBcnJheShwYXJhbXMuYWRkcmVzcykgJiYgIV8uaXNTdHJpbmcocGFyYW1zLmFkZHJlc3MpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhZGRyZXNzIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nIG9yIGFycmF5Jyk7XG4gICAgICB9XG4gICAgICBpZiAoXy5pc0FycmF5KHBhcmFtcy5hZGRyZXNzKSkge1xuICAgICAgICBwYXJhbXMuYWRkcmVzcy5mb3JFYWNoKChhZGRyZXNzKSA9PiB7XG4gICAgICAgICAgaWYgKCFfLmlzU3RyaW5nKGFkZHJlc3MpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYWRkcmVzcyBhcmd1bWVudCwgZXhwZWN0aW5nIGFycmF5IG9mIGFkZHJlc3Mgc3RyaW5ncycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBxdWVyeS5hZGRyZXNzID0gcGFyYW1zLmFkZHJlc3M7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5kYXRlR3RlKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLmRhdGVHdGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBkYXRlR3RlIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5kYXRlR3RlID0gcGFyYW1zLmRhdGVHdGU7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5kYXRlTHQpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMuZGF0ZUx0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZGF0ZUx0IGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5kYXRlTHQgPSBwYXJhbXMuZGF0ZUx0O1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMudmFsdWVHdGUpKSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLnZhbHVlR3RlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdmFsdWVHdGUgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnZhbHVlR3RlID0gcGFyYW1zLnZhbHVlR3RlO1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMudmFsdWVMdCkpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMudmFsdWVMdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHZhbHVlTHQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnZhbHVlTHQgPSBwYXJhbXMudmFsdWVMdDtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNOaWwocGFyYW1zLmluY2x1ZGVIZXgpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5pbmNsdWRlSGV4KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5jbHVkZUhleCBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmluY2x1ZGVIZXggPSBwYXJhbXMuaW5jbHVkZUhleDtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNOaWwocGFyYW1zLnN0YXRlKSkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBhcmFtcy5zdGF0ZSkgJiYgIV8uaXNTdHJpbmcocGFyYW1zLnN0YXRlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc3RhdGUgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcgb3IgYXJyYXknKTtcbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW1zLnN0YXRlKSkge1xuICAgICAgICBwYXJhbXMuc3RhdGUuZm9yRWFjaCgoc3RhdGUpID0+IHtcbiAgICAgICAgICBpZiAoIV8uaXNTdHJpbmcoc3RhdGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc3RhdGUgYXJndW1lbnQsIGV4cGVjdGluZyBhcnJheSBvZiBzdGF0ZSBzdHJpbmdzJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnN0YXRlID0gcGFyYW1zLnN0YXRlO1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMudHlwZSkpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMudHlwZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHR5cGUgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnR5cGUgPSBwYXJhbXMudHlwZTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNOaWwocGFyYW1zLmRlY29yYXRlVXR4b1NwZWNpZmljRmllbGRzKSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuZGVjb3JhdGVVdHhvU3BlY2lmaWNGaWVsZHMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbmNsdWRlSGV4IGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgcXVlcnkuZGVjb3JhdGVVdHhvU3BlY2lmaWNGaWVsZHMgPSBwYXJhbXMuZGVjb3JhdGVVdHhvU3BlY2lmaWNGaWVsZHM7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvdHJhbnNmZXInKSkucXVlcnkocXVlcnkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0cmFuc2ZlcnMgb24gdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgZ2V0VHJhbnNmZXIocGFyYW1zOiBHZXRUcmFuc2Zlck9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCddLCBbXSk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvdHJhbnNmZXIvJyArIHBhcmFtcy5pZCkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHRyYW5zYWN0aW9uIGJ5IHNlcXVlbmNlIGlkIGZvciBhIGdpdmVuIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyB0cmFuc2ZlckJ5U2VxdWVuY2VJZChwYXJhbXM6IFRyYW5zZmVyQnlTZXF1ZW5jZUlkT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3NlcXVlbmNlSWQnXSwgW10pO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3RyYW5zZmVyL3NlcXVlbmNlSWQvJyArIHBhcmFtcy5zZXF1ZW5jZUlkKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBtYXhpbXVtIGFtb3VudCB5b3UgY2FuIHNwZW5kIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBwYXJhbWV0ZXJzIG9iamVjdFxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmxpbWl0IC0gbWF4aW11bSBudW1iZXIgb2Ygc2VsZWN0YWJsZSB1bnNwZW50c1xuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1pblZhbHVlIC0gdGhlIG1pbmltdW0gdmFsdWUgb2YgdW5zcGVudHMgdG8gdXNlIGluIHNhdG9zaGlzXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWF4VmFsdWUgLSB0aGUgbWF4aW11bSB2YWx1ZSBvZiB1bnNwZW50cyB0byB1c2UgaW4gc2F0b3NoaXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5IZWlnaHQgLSB0aGUgbWluaW11bSBoZWlnaHQgb2YgdW5zcGVudHMgb24gdGhlIGJsb2NrIGNoYWluIHRvIHVzZVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gYWxsIHNlbGVjdGVkIHVuc3BlbnRzIHdpbGwgaGF2ZSBhdCBsZWFzdCB0aGlzIG1hbnkgY29uZmlybWF0aW9uc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5lbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UgLSBFbmZvcmNlcyBtaW5Db25maXJtcyBvbiBjaGFuZ2UgaW5wdXRzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlUmF0ZSAtIGZlZSByYXRlIHRvIHVzZSBpbiBjYWxjdWxhdGlvbiBvZiBtYXhpbXVtIHNwZW5kYWJsZSBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVJhdGUgLSB1cHBlciBsaW1pdCBmb3IgZmVlUmF0ZSBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnJlY2lwaWVudEFkZHJlc3MgLSByZWNpcGllbnQgYWRkcmVzc2VzIGZvciBhIG1vcmUgYWNjdXJhdGUgY2FsY3VsYXRpb24gb2YgdGhlIG1heGltdW0gYXZhaWxhYmxlIHRvIHNlbmRcbiAgICogQHJldHVybnMge3ttYXhpbXVtU3BlbmRhYmxlOiBOdW1iZXIsIGNvaW46IFN0cmluZ319XG4gICAqIE5PVEUgOiBmZWVUeENvbmZpcm1UYXJnZXQgb21pdHRlZCBvbiBwdXJwb3NlIGJlY2F1c2UgZ2F1Z2luZyB0aGUgbWF4aW11bSBzcGVuZGFibGUgYW1vdW50IHdpdGggZHluYW1pYyBmZWVzIGRvZXMgbm90IG1ha2Ugc2Vuc2VcbiAgICovXG4gIGFzeW5jIG1heGltdW1TcGVuZGFibGUocGFyYW1zOiBNYXhpbXVtU3BlbmRhYmxlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxNYXhpbXVtU3BlbmRhYmxlPiB7XG4gICAgY29uc3QgZmlsdGVyZWRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbXG4gICAgICAnZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlJyxcbiAgICAgICdmZWVSYXRlJyxcbiAgICAgICdsaW1pdCcsXG4gICAgICAnbWF4RmVlUmF0ZScsXG4gICAgICAnbWF4VmFsdWUnLFxuICAgICAgJ21pbkNvbmZpcm1zJyxcbiAgICAgICdtaW5IZWlnaHQnLFxuICAgICAgJ21pblZhbHVlJyxcbiAgICAgICdwbGFpblRhcmdldCcsXG4gICAgICAncmVjaXBpZW50QWRkcmVzcycsXG4gICAgICAndGFyZ2V0JyxcbiAgICBdKTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL21heGltdW1TcGVuZGFibGUnKSkucXVlcnkoZmlsdGVyZWRQYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgdGhlIHVuc3BlbnRzIGZvciBhIGdpdmVuIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgdW5zcGVudHMocGFyYW1zOiBVbnNwZW50c09wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcXVlcnkgPSBfLnBpY2socGFyYW1zLCBbXG4gICAgICAnY2hhaW5zJyxcbiAgICAgICdsaW1pdCcsXG4gICAgICAnbWF4VmFsdWUnLFxuICAgICAgJ21pbkNvbmZpcm1zJyxcbiAgICAgICdtaW5IZWlnaHQnLFxuICAgICAgJ21pblZhbHVlJyxcbiAgICAgICdwcmV2SWQnLFxuICAgICAgJ3NlZ3dpdCcsXG4gICAgICAndGFyZ2V0JyxcbiAgICAgICd1bnNwZW50SWRzJyxcbiAgICBdKTtcblxuICAgIHJldHVybiB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3Vuc3BlbnRzJykpLnF1ZXJ5KHF1ZXJ5KS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zb2xpZGF0ZSBvciBmYW5vdXQgdW5zcGVudHMgb24gYSB3YWxsZXRcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHJvdXRlTmFtZSAtIGVpdGhlciBgY29uc29saWRhdGVgIG9yIGBmYW5vdXRgXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBwYXJhbWV0ZXJzIG9iamVjdFxuICAgKlxuICAgKiBXYWxsZXQgcGFyYW1ldGVyczpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIC0gdGhlIHVzZXJzIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMueHBydiAtIHRoZSBwcml2YXRlIGtleSBpbiBzdHJpbmcgZm9ybSBpZiB0aGUgd2FsbGV0UGFzc3BocmFzZSBpcyBub3QgYXZhaWxhYmxlXG4gICAqXG4gICAqIEZlZSBwYXJhbWV0ZXJzOlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVJhdGUgLSBUaGUgZmVlIHJhdGUgdG8gdXNlIGZvciB0aGUgY29uc29saWRhdGlvbiBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVJhdGUgLSB1cHBlciBsaW1pdCBmb3IgZmVlUmF0ZSBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVBlcmNlbnRhZ2UgLSB0aGUgbWF4aW11bSByZWxhdGl2ZSBwb3J0aW9uIHRoYXQgeW91J3JlIHdpbGxpbmcgdG8gc3BlbmQgdG93YXJkcyBmZWVzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlVHhDb25maXJtVGFyZ2V0IC0gZXN0aW1hdGUgdGhlIGZlZXMgdG8gYWltIGZvciBmaXJzdCBjb25maXJtYXRpb24gd2l0aCB0aGlzIG51bWJlciBvZiBibG9ja3NcbiAgICpcbiAgICogSW5wdXQgcGFyYW1ldGVyczpcbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5taW5WYWx1ZSAtIHRoZSBtaW5pbXVtIHZhbHVlIG9mIHVuc3BlbnRzIHRvIHVzZSBpbiBzYXRvc2hpc1xuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1heFZhbHVlIC0gdGhlIG1heGltdW0gdmFsdWUgb2YgdW5zcGVudHMgdG8gdXNlIGluIHNhdG9zaGlzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluSGVpZ2h0IC0gdGhlIG1pbmltdW0gaGVpZ2h0IG9mIHVuc3BlbnRzIG9uIHRoZSBibG9jayBjaGFpbiB0byB1c2VcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5Db25maXJtcyAtIGFsbCBzZWxlY3RlZCB1bnNwZW50cyB3aWxsIGhhdmUgYXQgbGVhc3QgdGhpcyBtYW55IGNvbmZpcm1hdGlvbnNcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlIC0gaWYgdHJ1ZSwgbWluQ29uZmlybXMgYWxzbyBhcHBsaWVzIHRvIGNoYW5nZSBvdXRwdXRzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubGltaXQgICAgICAgICAgICAgICAgZm9yIHJvdXRlTmFtZSA9PT0gJ2NvbnNvbGlkYXRlJ1xuICAgKiAgICAgICAgICAgICAgICAgcGFyYW1zLm1heE51bUlucHV0c1RvVXNlICAgIGZvciByb3V0ZU5hbWUgPT09ICdmYW5vdXQnXG4gICAqICAgICAgICAgICAgICAgICAgLSBtYXhpbXVtIG51bWJlciBvZiB1bnNwZW50cyB5b3Ugd2FudCB0byB1c2UgaW4gdGhlIHRyYW5zYWN0aW9uXG4gICAqIE91dHB1dCBwYXJhbWV0ZXJzOlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm51bVVuc3BlbnRzVG9NYWtlIC0gdGhlIG51bWJlciBvZiBuZXcgdW5zcGVudHMgdG8gbWFrZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5idWxrIC0gaWYgc2V0IHRvIFRydWUsIHRoaXMgZW5hYmxlcyB0aGUgY29uc29saWRhdGlvbiBvZiBsYXJnZSBudW1iZXIgb2YgdW5zcGVudHMgYnkgY3JlYXRpbmcgbXVsdGlwbGUgdHJhbnNhY3Rpb25zLFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBlYWNoIHRyYW5zYWN0aW9uIGNvbXBvc2VkIG9mIDIwMCB1bnNwZW50cywgZXhjZXB0IGZvciB0aGUgbGFzdCB0cmFuc2FjdGlvbiB3aGljaCBtYXkgaGF2ZSBmZXdlciB1bnNwZW50cy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbWFuYWdlVW5zcGVudHMoXG4gICAgcm91dGVOYW1lOiBNYW5hZ2VVbnNwZW50cyxcbiAgICBwYXJhbXM6IENvbnNvbGlkYXRlVW5zcGVudHNPcHRpb25zIHwgRmFub3V0VW5zcGVudHNPcHRpb25zID0ge30sXG4gICAgb3B0aW9uID0gTWFuYWdlVW5zcGVudHNPcHRpb25zLkJVSUxEX1NJR05fU0VORFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBpZiAodGhpcy5fd2FsbGV0LnR5cGUgPT09ICdjdXN0b2RpYWwnICYmIHJvdXRlTmFtZSA9PT0gJ2NvbnNvbGlkYXRlJykge1xuICAgICAgcmV0dXJuIHRoaXMuaW5pdGlhdGVUcmFuc2FjdGlvbih7IC4uLnBhcmFtcywgdHlwZTogJ2NvbnNvbGlkYXRlJyB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3dhbGxldC50eXBlID09PSAnY3VzdG9kaWFsJyAmJiByb3V0ZU5hbWUgPT09ICdmYW5vdXQnKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbml0aWF0ZVRyYW5zYWN0aW9uKHsgLi4ucGFyYW1zLCB0eXBlOiAnZmFub3V0JyB9KTtcbiAgICB9XG5cbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgWyd3YWxsZXRQYXNzcGhyYXNlJywgJ3hwcnYnXSk7XG5cbiAgICBjb25zdCByZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgY29uc3QgZmFub3V0SW5wdXRGb3JtYXQgPSBwYXJhbXMubWF4TnVtSW5wdXRzVG9Vc2UgPyAnbWF4TnVtSW5wdXRzVG9Vc2UnIDogJ3Vuc3BlbnRzJztcbiAgICBjb25zdCBmaWx0ZXJlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFtcbiAgICAgICdmZWVSYXRlJyxcbiAgICAgICdtYXhGZWVSYXRlJyxcbiAgICAgICdtYXhGZWVQZXJjZW50YWdlJyxcbiAgICAgICdmZWVUeENvbmZpcm1UYXJnZXQnLFxuXG4gICAgICAnbWluVmFsdWUnLFxuICAgICAgJ21heFZhbHVlJyxcbiAgICAgICdtaW5IZWlnaHQnLFxuICAgICAgJ21pbkNvbmZpcm1zJyxcbiAgICAgICdlbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UnLFxuICAgICAgJ3RhcmdldEFkZHJlc3MnLFxuICAgICAgJ3R4Rm9ybWF0JyxcbiAgICAgICdidWxrJyxcblxuICAgICAgcm91dGVOYW1lID09PSAnY29uc29saWRhdGUnID8gJ2xpbWl0JyA6IGZhbm91dElucHV0Rm9ybWF0LFxuICAgICAgJ251bVVuc3BlbnRzVG9NYWtlJyxcbiAgICBdKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuXG4gICAgY29uc3QgYnVpbGRSZXNwb25zZTogVHJhbnNhY3Rpb25QcmVidWlsZCB8IFRyYW5zYWN0aW9uUHJlYnVpbGRbXSA9IGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMudXJsKGAvJHtyb3V0ZU5hbWV9VW5zcGVudHNgKSlcbiAgICAgIC5zZW5kKGZpbHRlcmVkUGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuXG4gICAgaWYgKG9wdGlvbiA9PT0gTWFuYWdlVW5zcGVudHNPcHRpb25zLkJVSUxEX09OTFkpIHtcbiAgICAgIHJldHVybiBidWlsZFJlc3BvbnNlO1xuICAgIH1cblxuICAgIGNvbnN0IGtleWNoYWlucyA9IChhd2FpdCB0aGlzLmJhc2VDb2luXG4gICAgICAua2V5Y2hhaW5zKClcbiAgICAgIC5nZXRLZXlzRm9yU2lnbmluZyh7IHdhbGxldDogdGhpcywgcmVxSWQgfSkpIGFzIHVua25vd24gYXMgS2V5Y2hhaW5bXTtcblxuICAgIC8vIFZhbGlkYXRlIHRoYXQgdGhlIHBsYXRmb3JtLWJ1aWx0IHRyYW5zYWN0aW9uIG1hdGNoZXMgdXNlciBwYXJhbWV0ZXJzXG4gICAgY29uc3QgdHhQcmVidWlsZHMgPSBBcnJheS5pc0FycmF5KGJ1aWxkUmVzcG9uc2UpID8gYnVpbGRSZXNwb25zZSA6IFtidWlsZFJlc3BvbnNlXTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHR4UHJlYnVpbGRzLm1hcCgodHhQcmVidWlsZCkgPT5cbiAgICAgICAgdGhpcy5iYXNlQ29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgdHhQYXJhbXM6IHBhcmFtcyxcbiAgICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICAgIHdhbGxldDogdGhpcyxcbiAgICAgICAgICB2ZXJpZmljYXRpb246IHtcbiAgICAgICAgICAgIC4uLihwYXJhbXMudmVyaWZpY2F0aW9uID8/IHt9KSxcbiAgICAgICAgICAgIGtleWNoYWluczoge1xuICAgICAgICAgICAgICB1c2VyOiBrZXljaGFpbnNbMF0sXG4gICAgICAgICAgICAgIGJhY2t1cDoga2V5Y2hhaW5zWzFdLFxuICAgICAgICAgICAgICBiaXRnbzoga2V5Y2hhaW5zWzJdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlcUlkLFxuICAgICAgICB9KVxuICAgICAgKVxuICAgICk7XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvblBhcmFtcyA9IHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIGtleWNoYWluOiBrZXljaGFpbnNbMF0sXG4gICAgICBwdWJzOiBrZXljaGFpbnMubWFwKChrKSA9PiB7XG4gICAgICAgIGFzc2VydChrLnB1Yik7XG4gICAgICAgIHJldHVybiBrLnB1YjtcbiAgICAgIH0pLFxuICAgICAgLy8gQnVpbGRpbmcgUFNCVHMgd2l0aCB0aGUgYnVsayBmbGFnIGRvZXMgbm90IGluY2x1ZGUgdGhlIHByZXZpb3VzIHRyYW5zYWN0aW9uIGZvciBub24tc2Vnd2l0IGlucHV0cy5cbiAgICAgIC8vIE1hbnVhbGx5IG92ZXJyaWRlIHRoZSBzaWduaW5nIGFuZCB2YWxpZGF0aW5nIHRvIG5vdCBmYWlsLlxuICAgICAgYWxsb3dOb25TZWd3aXRTaWduaW5nV2l0aG91dFByZXZUeDogISFwYXJhbXMuYnVsayxcbiAgICB9O1xuXG4gICAgY29uc3Qgc2VsZWN0UGFyYW1zID0gXy5waWNrKHBhcmFtcywgWydjb21tZW50JywgJ290cCcsICdidWxrJ10pO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHR4UHJlYnVpbGRzLm1hcChhc3luYyAodHhQcmVidWlsZCkgPT4ge1xuICAgICAgICBjb25zdCBzaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMuc2lnblRyYW5zYWN0aW9uKHtcbiAgICAgICAgICAuLi50cmFuc2FjdGlvblBhcmFtcyxcbiAgICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZmluYWxUeFBhcmFtcyA9IF8uZXh0ZW5kKHt9LCBzaWduZWRUcmFuc2FjdGlvbiwgc2VsZWN0UGFyYW1zLCB7XG4gICAgICAgICAgdHlwZTogcm91dGVOYW1lLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRyYW5zYWN0aW9uKGZpbmFsVHhQYXJhbXMsIHJlcUlkKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGJ1aWxkUmVzcG9uc2UpID8gcmVzcG9uc2UgOiByZXNwb25zZVswXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYW5hZ2UgdGhlIHVuc3BlbnQgcmVzZXJ2YXRpb25zIG9uIHRoZSB3YWxsZXRcbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcy5jcmVhdGUgLSBjcmVhdGUgYSBuZXcgcmVzZXJ2YXRpb25cbiAgICogQHBhcmFtIHBhcmFtcy5tb2RpZnkgLSBtb2RpZnkgYW4gZXhpc3RpbmcgcmVzZXJ2YXRpb25cbiAgICogQHBhcmFtIHBhcmFtcy5kZWxldGUgLSBkZWxldGUgYW4gZXhpc3RpbmcgcmVzZXJ2YXRpb25cbiAgICovXG4gIGFzeW5jIG1hbmFnZVVuc3BlbnRSZXNlcnZhdGlvbnMocGFyYW1zOiBNYW5hZ2VVbnNwZW50UmVzZXJ2YXRpb25PcHRpb25zKTogUHJvbWlzZTx7XG4gICAgdW5zcGVudHM6IHtcbiAgICAgIGlkOiBzdHJpbmc7XG4gICAgICB3YWxsZXRJZDogc3RyaW5nO1xuICAgICAgZXhwaXJlVGltZTogc3RyaW5nO1xuICAgICAgdXNlcklkPzogc3RyaW5nO1xuICAgIH1bXTtcbiAgfT4ge1xuICAgIGNvbnN0IGZpbHRlcmVkUGFyYW1zID0gXy5waWNrKHBhcmFtcywgWydjcmVhdGUnLCAnbW9kaWZ5JywgJ2RlbGV0ZSddKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIobmV3IFJlcXVlc3RUcmFjZXIoKSk7XG4gICAgLy8gVGhlIFVSTCBjYW5ub3QgY29udGFpbiB0aGUgY29pbk5hbWUsIHNvIHdlIHJlbW92ZSBpdCBmcm9tIHRoZSBVUkxcbiAgICBjb25zdCB1cmwgPSB0aGlzLnVybChgL3Jlc2VydmVkdW5zcGVudHNgKS5yZXBsYWNlKGAvJHt0aGlzLmJhc2VDb2luLmdldENoYWluKCl9YCwgJycpO1xuICAgIGlmIChmaWx0ZXJlZFBhcmFtcy5jcmVhdGUpIHtcbiAgICAgIGNvbnN0IGZpbHRlcmVkQ3JlYXRlUGFyYW1zID0gXy5waWNrKHBhcmFtcy5jcmVhdGUsIFsndW5zcGVudElkcycsICdleHBpcmVUaW1lJ10pO1xuICAgICAgcmV0dXJuIHRoaXMuYml0Z28ucG9zdCh1cmwpLnNlbmQoZmlsdGVyZWRDcmVhdGVQYXJhbXMpLnJlc3VsdCgpO1xuICAgIH0gZWxzZSBpZiAoZmlsdGVyZWRQYXJhbXMubW9kaWZ5KSB7XG4gICAgICBjb25zdCBmaWx0ZXJlZE1vZGlmeVBhcmFtcyA9IF8ucGljayhwYXJhbXMubW9kaWZ5LCBbJ3Vuc3BlbnRJZHMnLCAnY2hhbmdlcyddKTtcbiAgICAgIHJldHVybiB0aGlzLmJpdGdvLnB1dCh1cmwpLnNlbmQoZmlsdGVyZWRNb2RpZnlQYXJhbXMpLnJlc3VsdCgpO1xuICAgIH0gZWxzZSBpZiAoZmlsdGVyZWRQYXJhbXMuZGVsZXRlKSB7XG4gICAgICBjb25zdCBmaWx0ZXJlZERlbGV0ZVBhcmFtcyA9IF8ucGljayhwYXJhbXMuZGVsZXRlLCBbJ2lkJ10pO1xuICAgICAgcmV0dXJuIHRoaXMuYml0Z28uZGVsKHVybCkucXVlcnkoZmlsdGVyZWREZWxldGVQYXJhbXMpLnJlc3VsdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RpZCBub3QgZGV0ZWN0IGEgY3JlYXRpb24sIG1vZGlmaWNhdGlvbiwgb3IgZGVsZXRpb24gcmVxdWVzdC4nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29uc29saWRhdGUgdW5zcGVudHMgb24gYSB3YWxsZXRcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIHRoZSB1c2VycyB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnhwcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0gaWYgdGhlIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVJhdGUgLSBUaGUgZmVlIHJhdGUgdG8gdXNlIGZvciB0aGUgY29uc29saWRhdGlvbiBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVJhdGUgLSB1cHBlciBsaW1pdCBmb3IgZmVlUmF0ZSBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVBlcmNlbnRhZ2UgLSB0aGUgbWF4aW11bSByZWxhdGl2ZSBwb3J0aW9uIHRoYXQgeW91J3JlIHdpbGxpbmcgdG8gc3BlbmQgdG93YXJkcyBmZWVzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlVHhDb25maXJtVGFyZ2V0IC0gZXN0aW1hdGUgdGhlIGZlZXMgdG8gYWltIGZvciBmaXJzdCBjb25maXJtYXRpb24gd2l0aCB0aGlzIG51bWJlciBvZiBibG9ja3NcbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5taW5WYWx1ZSAtIHRoZSBtaW5pbXVtIHZhbHVlIG9mIHVuc3BlbnRzIHRvIHVzZSBpbiBzYXRvc2hpc1xuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1heFZhbHVlIC0gdGhlIG1heGltdW0gdmFsdWUgb2YgdW5zcGVudHMgdG8gdXNlIGluIHNhdG9zaGlzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluSGVpZ2h0IC0gdGhlIG1pbmltdW0gaGVpZ2h0IG9mIHVuc3BlbnRzIG9uIHRoZSBibG9jayBjaGFpbiB0byB1c2VcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5Db25maXJtcyAtIGFsbCBzZWxlY3RlZCB1bnNwZW50cyB3aWxsIGhhdmUgYXQgbGVhc3QgdGhpcyBtYW55IGNvbmZpcm1hdGlvbnNcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlIC0gaWYgdHJ1ZSwgbWluQ29uZmlybXMgYWxzbyBhcHBsaWVzIHRvIGNoYW5nZSBvdXRwdXRzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubGltaXQgICAgICAgICAgICAgICAgZm9yIHJvdXRlTmFtZSA9PT0gJ2NvbnNvbGlkYXRlJ1xuICAgKiAgICAgICAgICAgICAgICAgcGFyYW1zLm1heE51bUlucHV0c1RvVXNlICAgIGZvciByb3V0ZU5hbWUgPT09ICdmYW5vdXQnXG4gICAqICAgICAgICAgICAgICAgICAgLSBtYXhpbXVtIG51bWJlciBvZiB1bnNwZW50cyB5b3Ugd2FudCB0byB1c2UgaW4gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubnVtVW5zcGVudHNUb01ha2UgLSB0aGUgbnVtYmVyIG9mIG5ldyB1bnNwZW50cyB0byBtYWtlLiBJdCBpcyBub3QgYXBwbGljYWJsZSBmb3IgaWYgYnVsayBjb25zb2xpZGF0ZS5cbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuYnVsayAtIGlmIHNldCB0byBUcnVlLCB0aGlzIGVuYWJsZXMgdGhlIGNvbnNvbGlkYXRpb24gb2YgbGFyZ2UgbnVtYmVyIG9mIHVuc3BlbnRzIGJ5IGNyZWF0aW5nIG11bHRpcGxlIHRyYW5zYWN0aW9ucyxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggZWFjaCB0cmFuc2FjdGlvbiBjb21wb3NlZCBvZiAyMDAgdW5zcGVudHMsIGV4Y2VwdCBmb3IgdGhlIGxhc3QgdHJhbnNhY3Rpb24gd2hpY2ggbWF5IGhhdmUgZmV3ZXIgdW5zcGVudHMuXG4gICAqL1xuICBhc3luYyBjb25zb2xpZGF0ZVVuc3BlbnRzKFxuICAgIHBhcmFtczogQ29uc29saWRhdGVVbnNwZW50c09wdGlvbnMgPSB7fSxcbiAgICBvcHRpb24gPSBNYW5hZ2VVbnNwZW50c09wdGlvbnMuQlVJTERfU0lHTl9TRU5EXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLm1hbmFnZVVuc3BlbnRzKCdjb25zb2xpZGF0ZScsIHBhcmFtcywgb3B0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYW5vdXQgdW5zcGVudHMgb24gYSB3YWxsZXRcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIHRoZSB1c2VycyB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnhwcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0gaWYgdGhlIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1pblZhbHVlIC0gdGhlIG1pbmltdW0gdmFsdWUgb2YgdW5zcGVudHMgdG8gdXNlXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWF4VmFsdWUgLSB0aGUgbWF4aW11bSB2YWx1ZSBvZiB1bnNwZW50cyB0byB1c2VcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5IZWlnaHQgLSB0aGUgbWluaW11bSBoZWlnaHQgb2YgdW5zcGVudHMgb24gdGhlIGJsb2NrIGNoYWluIHRvIHVzZVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gYWxsIHNlbGVjdGVkIHVuc3BlbnRzIHdpbGwgaGF2ZSBhdCBsZWFzdCB0aGlzIG1hbnkgY29uZmlybWF0aW9uc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVBlcmNlbnRhZ2UgLSB0aGUgbWF4aW11bSBwcm9wb3J0aW9uIG9mIGFuIHVuc3BlbnQgeW91IGFyZSB3aWxsaW5nIHRvIGxvc2UgdG8gZmVlc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVR4Q29uZmlybVRhcmdldCAtIGVzdGltYXRlIHRoZSBmZWVzIHRvIGFpbSBmb3IgZmlyc3QgY29uZmlybWF0aW9uIHdpdGggdGhpcyBudW1iZXIgb2YgYmxvY2tzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlUmF0ZSAtIFRoZSBkZXNpcmVkIGZlZSByYXRlIGZvciB0aGUgdHJhbnNhY3Rpb24gaW4gc2F0b3NoaXMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhGZWVSYXRlIC0gVGhlIG1heCBsaW1pdCBmb3IgYSBmZWUgcmF0ZSBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heE51bUlucHV0c1RvVXNlIC0gdGhlIG51bWJlciBvZiB1bnNwZW50cyB5b3Ugd2FudCB0byB1c2UgaW4gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubnVtVW5zcGVudHNUb01ha2UgLSB0aGUgbnVtYmVyIG9mIG5ldyB1bnNwZW50cyB0byBtYWtlXG4gICAqXG4gICAqIEBwYXJhbSB7TWFuYWdlVW5zcGVudHNPcHRpb25zfSBvcHRpb24gLSBmbGFnIHRvIHRvZ2dsZSBidWlsZCBhbmQgc2VuZCBvciBidWlsZCBvbmx5XG4gICAqL1xuICBhc3luYyBmYW5vdXRVbnNwZW50cyhcbiAgICBwYXJhbXM6IEZhbm91dFVuc3BlbnRzT3B0aW9ucyA9IHt9LFxuICAgIG9wdGlvbiA9IE1hbmFnZVVuc3BlbnRzT3B0aW9ucy5CVUlMRF9TSUdOX1NFTkRcbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMubWFuYWdlVW5zcGVudHMoJ2Zhbm91dCcsIHBhcmFtcywgb3B0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHRva2VuIGZsdXNoIHRocmVzaG9sZHMgZm9yIHRoZSB3YWxsZXQuIFVwZGF0ZXMgdGhlIHdhbGxldC5cbiAgICogVG9rZW5zIHdpbGwgb25seSBiZSBmbHVzaGVkIGZyb20gZm9yd2FyZGVyIGNvbnRyYWN0cyBpZiB0aGUgYmFsYW5jZSBpcyBncmVhdGVyIHRoYW4gdGhlIHRocmVzaG9sZCBkZWZpbmVkIGhlcmUuXG4gICAqIEBwYXJhbSB0aHJlc2hvbGRzIHtPYmplY3R9IC0gcGFpcnMgb2YgeyBbdG9rZW5OYW1lXTogdGhyZXNob2xkIH0gKGJhc2UgdW5pdHMpXG4gICAqL1xuICBhc3luYyB1cGRhdGVUb2tlbkZsdXNoVGhyZXNob2xkcyh0aHJlc2hvbGRzOiBhbnkgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgIT09ICdldGgnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgd2FsbGV0Jyk7XG4gICAgfVxuXG4gICAgdGhpcy5fd2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnB1dCh0aGlzLnVybCgpKVxuICAgICAgLnNlbmQoe1xuICAgICAgICB0b2tlbkZsdXNoVGhyZXNob2xkczogdGhyZXNob2xkcyxcbiAgICAgIH0pXG4gICAgICAucmVzdWx0KCk7XG4gIH1cbiAgLyoqXG4gICAgICAqIFVwZGF0ZXMgdGhlIHdhbGxldC4gU2V0cyBmbGFncyBmb3IgZGVwbG95Rm9yd2FyZGVyc01hbnVhbGx5IGFuZCBmbHVzaEZvcndhcmRlcnNNYW51YWxseSBvZiB0aGUgd2FsbGV0LlxuICAgICAgKiBAcGFyYW0gZm9yd2FyZGVyRmxhZ3Mge09iamVjdH0gLSB7XG4gICAgICAgIFwiY29pblNwZWNpZmljXCI6IHtcbiAgICAgICAgICBbY29pbk5hbWVdOiB7XG4gICAgICAgICAgICBcImRlcGxveUZvcndhcmRlcnNNYW51YWxseVwiOiB7Qm9vbGVhbn0sXG4gICAgICAgICAgICBcImZsdXNoRm9yd2FyZGVyc01hbnVhbGx5XCI6IHtCb29sZWFufVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgKi9cbiAgYXN5bmMgdXBkYXRlRm9yd2FyZGVycyhmb3J3YXJkZXJGbGFnczogYW55ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpICE9PSAnZXRoJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdub3Qgc3VwcG9ydGVkIGZvciB0aGlzIHdhbGxldCcpO1xuICAgIH1cbiAgICB0aGlzLl93YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnB1dCh0aGlzLnVybCgpKS5zZW5kKGZvcndhcmRlckZsYWdzKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUbyBtYW51YWxseSBkZXBsb3kgYW4gRVRIIGFkZHJlc3NcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyYW1zLmFkZHJlc3NdIC0gYWRkcmVzc0lkXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyYW1zLmlkXSAtIGFkZHJlc3NJZCBjb3VsZCBiZSByZWNlaXZlZCBhbHNvIGFzIGlkXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IEh0dHAgcmVzcG9uc2VcbiAgICovXG4gIGFzeW5jIGRlcGxveUZvcndhcmRlcnMocGFyYW1zOiBEZXBsb3lGb3J3YXJkZXJzT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmFkZHJlc3MpICYmIF8uaXNVbmRlZmluZWQocGFyYW1zLmlkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhZGRyZXNzIG9yIGlkIG9mIGFkZHJlc3MgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgbGV0IHF1ZXJ5O1xuICAgIGlmIChwYXJhbXMuYWRkcmVzcykge1xuICAgICAgcXVlcnkgPSBwYXJhbXMuYWRkcmVzcztcbiAgICB9IGVsc2Uge1xuICAgICAgcXVlcnkgPSBwYXJhbXMuaWQ7XG4gICAgfVxuICAgIGNvbnN0IHVybCA9IHRoaXMudXJsKGAvYWRkcmVzcy8ke2VuY29kZVVSSUNvbXBvbmVudChxdWVyeSl9L2RlcGxveW1lbnRgKTtcbiAgICB0aGlzLl93YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodXJsKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUbyBtYW51YWxseSBmb3J3YXJkIHRva2VucyBmcm9tIGFuIEVUSCBvciBDRUxPIGFkZHJlc3NcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMudG9rZW5OYW1lIC0gTmFtZSBvZiB0b2tlbiB0aGF0IG5lZWRzIHRvIGJlIGZvcndhcmRlZCBmcm9tIHRoZSBhZGRyZXNzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyYW1zLmFkZHJlc3NdIC1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMuYWRkcmVzc10gLSBhZGRyZXNzSWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMuaWRdIC0gYWRkcmVzc0lkIGNvdWxkIGJlIHJlY2VpdmVkIGFsc28gYXMgaWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMuZ2FzUHJpY2VdIC0gRXhwbGljaXQgZ2FzIHByaWNlIHRvIHVzZSB3aGVuIGZvcndhcmRpbmcgdG9rZW4gZnJvbSB0aGUgZm9yd2FyZGVyIGNvbnRyYWN0IChFVEggYW5kIENlbG8gb25seSkuIElmIG5vdCBnaXZlbiwgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgZXN0aW1hdGVkIG5ldHdvcmsgZ2FzIHByaWNlLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gW3BhcmFtcy5laXAxNTU5XSAtIFNwZWNpZnkgZWlwMTU1OSBmZWUgcGFyYW1ldGVycyBpbiB0b2tlbiBmb3J3YXJkaW5nIHRyYW5zYWN0aW9uLlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBIdHRwIHJlc3BvbnNlXG4gICAqL1xuICBhc3luYyBmbHVzaEZvcndhcmRlclRva2VuKHBhcmFtczogRmx1c2hGb3J3YXJkZXJUb2tlbk9wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5hZGRyZXNzKSAmJiBfLmlzVW5kZWZpbmVkKHBhcmFtcy5pZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYWRkcmVzcyBvciBpZCBvZiBhZGRyZXNzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGxldCBxdWVyeTtcbiAgICBpZiAocGFyYW1zLmFkZHJlc3MpIHtcbiAgICAgIHF1ZXJ5ID0gcGFyYW1zLmFkZHJlc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXJ5ID0gcGFyYW1zLmlkO1xuICAgIH1cbiAgICBjb25zdCB1cmwgPSB0aGlzLnVybChgL2FkZHJlc3MvJHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfS90b2tlbmZvcndhcmRgKTtcbiAgICB0aGlzLl93YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodXJsKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTd2VlcCBmdW5kcyBmb3IgYSB3YWxsZXRcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuYWRkcmVzcyAtIFRoZSBhZGRyZXNzIHRvIHNlbmQgYWxsIHRoZSBmdW5kcyBpbiB0aGUgd2FsbGV0IHRvXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIHRoZSB1c2VycyB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnhwcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0gaWYgdGhlIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLm90cCAtIFR3byBmYWN0b3IgYXV0aCBjb2RlIHRvIGVuYWJsZSBzZW5kaW5nIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVR4Q29uZmlybVRhcmdldCAtIEVzdGltYXRlIHRoZSBmZWVzIHRvIGFpbSBmb3IgZmlyc3QgY29uZmlybWF0aW9uIHdpdGhpbiB0aGlzIG51bWJlciBvZiBibG9ja3NcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVSYXRlIC0gVGhlIGRlc2lyZWQgZmVlIHJhdGUgZm9yIHRoZSB0cmFuc2FjdGlvbiBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gW3BhcmFtcy5tYXhGZWVSYXRlXSAtIHVwcGVyIGxpbWl0IGZvciBmZWVSYXRlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3BhcmFtcy5hbGxvd1BhcnRpYWxTd2VlcF0gLSBhbGxvd3Mgc3dlZXBpbmcgMjAwIHVuc3BlbnRzIHdoZW4gdGhlIHdhbGxldCBoYXMgbW9yZSB0aGFuIHRoYXRcbiAgICogQHJldHVybnMgdHhIZXgge1N0cmluZ30gdGhlIHR4SGV4IG9mIHRoZSBzaWduZWQgdHJhbnNhY3Rpb25cbiAgICovXG4gIGFzeW5jIHN3ZWVwKHBhcmFtczogU3dlZXBPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2FkZHJlc3MnXSwgWyd3YWxsZXRQYXNzcGhyYXNlJywgJ3hwcnYnLCAnb3RwJ10pO1xuXG4gICAgLy8gVGhlIHN3ZWVwIEFQSSBlbmRwb2ludCBpcyBvbmx5IGF2YWlsYWJsZSB0byB1dHhvLWJhc2VkIGNvaW5zXG5cbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4uc3dlZXBXaXRoU2VuZE1hbnkoKSkge1xuICAgICAgaWYgKHRoaXMuY29uZmlybWVkQmFsYW5jZVN0cmluZygpICE9PSB0aGlzLmJhbGFuY2VTdHJpbmcoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ2Nhbm5vdCBzd2VlcCB3aGVuIHVuY29uZmlybWVkIGZ1bmRzIGV4aXN0IG9uIHRoZSB3YWxsZXQsIHBsZWFzZSB3YWl0IHVudGlsIGFsbCBpbmJvdW5kIHRyYW5zYWN0aW9ucyBjb25maXJtJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL21heGltdW1TcGVuZGFibGUnKSkucmVzdWx0KCk7XG4gICAgICBjb25zdCBtYXhpbXVtU3BlbmRhYmxlID0gbmV3IEJpZ051bWJlcih2YWx1ZS5tYXhpbXVtU3BlbmRhYmxlKTtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IG1heGltdW1TcGVuZGFibGUuaXNaZXJvKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBmdW5kcyB0byBzd2VlcCcpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzZW5kTWFueVBhcmFtczogU2VuZE1hbnlPcHRpb25zID0ge1xuICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiBwYXJhbXMuYWRkcmVzcyB8fCAnJywgLy8gRW5zdXJlIGFkZHJlc3MgaXMgYWx3YXlzIGEgc3RyaW5nXG4gICAgICAgICAgICBhbW91bnQ6IG1heGltdW1TcGVuZGFibGUudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHRoaXMuc2VuZE1hbnkoc2VuZE1hbnlQYXJhbXMpO1xuICAgIH1cbiAgICAvLyB0aGUgZm9sbG93aW5nIGZsb3cgd29ya3MgZm9yIGFsbCBVVFhPIGNvaW5zXG5cbiAgICBjb25zdCByZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgY29uc3QgZmlsdGVyZWRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbXG4gICAgICAnYWRkcmVzcycsXG4gICAgICAnZmVlUmF0ZScsXG4gICAgICAnbWF4RmVlUmF0ZScsXG4gICAgICAnZmVlVHhDb25maXJtVGFyZ2V0JyxcbiAgICAgICdhbGxvd1BhcnRpYWxTd2VlcCcsXG4gICAgICAndHhGb3JtYXQnLFxuICAgIF0pO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9zd2VlcFdhbGxldCcpKS5zZW5kKGZpbHRlcmVkUGFyYW1zKS5yZXN1bHQoKTtcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMuYmFzZUNvaW4uZXhwbGFpblRyYW5zYWN0aW9uKHJlc3BvbnNlKTtcbiAgICBpZiAodHJhbnNhY3Rpb24/Lm91dHB1dHMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBpbnZhbGlkT3V0cHV0QWRkcmVzcyA9IHRyYW5zYWN0aW9uLm91dHB1dHMuZmluZCgob3V0cHV0KSA9PiBvdXRwdXQuYWRkcmVzcyAhPT0gcGFyYW1zLmFkZHJlc3MpO1xuICAgICAgaWYgKGludmFsaWRPdXRwdXRBZGRyZXNzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBzd2VlcCBkZXN0aW5hdGlvbiAke2ludmFsaWRPdXRwdXRBZGRyZXNzLmFkZHJlc3N9LCBzcGVjaWZpZWQgJHtwYXJhbXMuYWRkcmVzc31gKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHRyYW5zYWN0aW9uLCBubyBkZXN0aW5hdGlvbiBhZGRyZXNzJyk7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gKGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0S2V5c0ZvclNpZ25pbmcoeyB3YWxsZXQ6IHRoaXMsIHJlcUlkIH0pKSBhcyBhbnk7XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvblBhcmFtcyA9IHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHR4UHJlYnVpbGQ6IHJlc3BvbnNlLFxuICAgICAga2V5Y2hhaW46IGtleWNoYWluc1swXSxcbiAgICAgIHVzZXJLZXljaGFpbjoga2V5Y2hhaW5zWzBdLFxuICAgICAgYmFja3VwS2V5Y2hhaW46IGtleWNoYWlucy5sZW5ndGggPiAxID8ga2V5Y2hhaW5zWzFdIDogbnVsbCxcbiAgICAgIGJpdGdvS2V5Y2hhaW46IGtleWNoYWlucy5sZW5ndGggPiAyID8ga2V5Y2hhaW5zWzJdIDogbnVsbCxcbiAgICAgIHBydjogcGFyYW1zLnhwcnYsXG4gICAgfTtcbiAgICBjb25zdCBzaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMuc2lnblRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uUGFyYW1zKTtcblxuICAgIGNvbnN0IHNlbGVjdFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFsnb3RwJ10pO1xuICAgIGNvbnN0IGZpbmFsVHhQYXJhbXMgPSBfLmV4dGVuZCh7fSwgc2lnbmVkVHJhbnNhY3Rpb24sIHNlbGVjdFBhcmFtcyk7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcbiAgICByZXR1cm4gdGhpcy5zZW5kVHJhbnNhY3Rpb24oZmluYWxUeFBhcmFtcywgcmVxSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZyZWV6ZSBhIGdpdmVuIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgZnJlZXplKHBhcmFtczogRnJlZXplT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10pO1xuXG4gICAgaWYgKHBhcmFtcy5kdXJhdGlvbikge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5kdXJhdGlvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGR1cmF0aW9uOiBzaG91bGQgYmUgbnVtYmVyIG9mIHNlY29uZHMnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMudXJsKCcvZnJlZXplJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgY29tbWVudCBvZiBhIHRyYW5zZmVyXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyB0cmFuc2ZlckNvbW1lbnQocGFyYW1zOiBUcmFuc2ZlckNvbW1lbnRPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnaWQnXSwgWydjb21tZW50J10pO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLl93YWxsZXQuaWQgKyAnL3RyYW5zZmVyLycgKyBwYXJhbXMuaWQgKyAnL2NvbW1lbnQnKSlcbiAgICAgIC5zZW5kKHBhcmFtcylcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHRoZSBhZGRyZXNzZXMgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBhZGRyZXNzZXMocGFyYW1zOiBBZGRyZXNzZXNPcHRpb25zID0ge30pOiBQcm9taXNlPEFkZHJlc3NRdWVyeVJlc3VsdD4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSk7XG5cbiAgICBjb25zdCBxdWVyeTogQWRkcmVzc2VzT3B0aW9ucyA9IHt9O1xuXG4gICAgaWYgKHBhcmFtcy5taW5lKSB7XG4gICAgICBxdWVyeS5taW5lID0gISFwYXJhbXMubWluZTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucHJldklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJldklkIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5wcmV2SWQgPSBwYXJhbXMucHJldklkO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuc29ydCkge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5zb3J0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc29ydCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkuc29ydCA9IHBhcmFtcy5zb3J0O1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMubGltaXQpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMubGltaXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsaW1pdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5sYWJlbENvbnRhaW5zKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLmxhYmVsQ29udGFpbnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsYWJlbENvbnRhaW5zIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5sYWJlbENvbnRhaW5zID0gcGFyYW1zLmxhYmVsQ29udGFpbnM7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5zZWd3aXQpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5zZWd3aXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzZWd3aXQgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5zZWd3aXQgPSBwYXJhbXMuc2Vnd2l0O1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuY2hhaW5zKSkge1xuICAgICAgaWYgKCFfLmlzQXJyYXkocGFyYW1zLmNoYWlucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGNoYWlucyBhcmd1bWVudCwgZXhwZWN0aW5nIGFycmF5IG9mIG51bWJlcnMnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmNoYWlucyA9IHBhcmFtcy5jaGFpbnM7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTmlsKHBhcmFtcy5pbmNsdWRlQmFsYW5jZXMpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5pbmNsdWRlQmFsYW5jZXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbmNsdWRlQmFsYW5jZXMgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5pbmNsdWRlQmFsYW5jZXMgPSBwYXJhbXMuaW5jbHVkZUJhbGFuY2VzO1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMuaW5jbHVkZVRva2VucykpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmluY2x1ZGVUb2tlbnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbmNsdWRlVG9rZW5zIGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgcXVlcnkuaW5jbHVkZVRva2VucyA9IHBhcmFtcy5pbmNsdWRlVG9rZW5zO1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMuaW5jbHVkZVRvdGFsQWRkcmVzc0NvdW50KSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuaW5jbHVkZVRvdGFsQWRkcmVzc0NvdW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5jbHVkZVRvdGFsQWRkcmVzc0NvdW50IGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgcXVlcnkuaW5jbHVkZVRvdGFsQWRkcmVzc0NvdW50ID0gcGFyYW1zLmluY2x1ZGVUb3RhbEFkZHJlc3NDb3VudDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnJldHVybkJhbGFuY2VzRm9yVG9rZW4pIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucmV0dXJuQmFsYW5jZXNGb3JUb2tlbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHJldHVybkJhbGFuY2VzRm9yVG9rZW4gYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnJldHVybkJhbGFuY2VzRm9yVG9rZW4gPSBwYXJhbXMucmV0dXJuQmFsYW5jZXNGb3JUb2tlbjtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNOaWwocGFyYW1zLnBlbmRpbmdEZXBsb3ltZW50KSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMucGVuZGluZ0RlcGxveW1lbnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwZW5kaW5nRGVwbG95bWVudCBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnBlbmRpbmdEZXBsb3ltZW50ID0gcGFyYW1zLnBlbmRpbmdEZXBsb3ltZW50O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmJpdGdvXG4gICAgICAuZ2V0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLl93YWxsZXQuaWQgKyAnL2FkZHJlc3NlcycpKVxuICAgICAgLnF1ZXJ5KHF1ZXJ5KVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgdGhlIGFkZHJlc3NlcyBzb3J0ZWQgYnkgYmFsYW5jZSBmb3IgYSBnaXZlbiB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGFkZHJlc3Nlc0J5QmFsYW5jZShwYXJhbXM6IEFkZHJlc3Nlc0J5QmFsYW5jZU9wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHF1ZXJ5OiBBZGRyZXNzZXNCeUJhbGFuY2VPcHRpb25zID0ge1xuICAgICAgdG9rZW46IHBhcmFtcy50b2tlbixcbiAgICAgIG5mdENvbGxlY3Rpb25JZDogcGFyYW1zLm5mdENvbGxlY3Rpb25JZCxcbiAgICAgIG5mdElkOiBwYXJhbXMubmZ0SWQsXG4gICAgfTtcbiAgICBxdWVyeS5zb3J0ID0gcGFyYW1zLnNvcnQgPz8gLTE7XG4gICAgcXVlcnkucGFnZSA9IHBhcmFtcy5wYWdlID8/IDE7XG4gICAgcXVlcnkubGltaXQgPSBwYXJhbXMubGltaXQgPz8gNTAwO1xuXG4gICAgaWYgKCFfLmlzTnVtYmVyKHF1ZXJ5LnNvcnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc29ydCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgIH1cbiAgICBpZiAoIV8uaXNOdW1iZXIocXVlcnkucGFnZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwYWdlIGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgfVxuICAgIGlmICghXy5pc051bWJlcihxdWVyeS5saW1pdCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsaW1pdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgIH1cbiAgICBpZiAocXVlcnkubGltaXQgPCAxIHx8IHF1ZXJ5LmxpbWl0ID4gNTAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2xpbWl0IGFyZ3VtZW50IG11c3QgYmUgYmV0d2VlbiAxIGFuZCA1MDAnKTtcbiAgICB9XG5cbiAgICAvLyBBc3NlcnQgdGhhdCBlaXRoZXIgYm90aCBuZnRDb2xsZWN0aW9uSWQgYW5kIG5mdElkIGFyZSBwcm92aWRlZCBvciBuZWl0aGVyIGFyZSBwcm92aWRlZFxuICAgIGNvbnN0IGhhc05mdENvbGxlY3Rpb25JZCA9ICFfLmlzVW5kZWZpbmVkKHF1ZXJ5Lm5mdENvbGxlY3Rpb25JZCk7XG4gICAgY29uc3QgaGFzTmZ0SWQgPSAhXy5pc1VuZGVmaW5lZChxdWVyeS5uZnRJZCk7XG4gICAgaWYgKGhhc05mdENvbGxlY3Rpb25JZCAhPT0gaGFzTmZ0SWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbmZ0Q29sbGVjdGlvbklkIGFuZCBuZnRJZCBtdXN0IGJvdGggYmUgcHJvdmlkZWQgb3IgYm90aCBiZSBvbWl0dGVkJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z29cbiAgICAgIC5nZXQodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuX3dhbGxldC5pZCArICcvYWRkcmVzc2VzL2JhbGFuY2VzJykpXG4gICAgICAucXVlcnkocXVlcnkpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgc2luZ2xlIHdhbGxldCBhZGRyZXNzIGJ5IGl0cyBpZFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgZ2V0QWRkcmVzcyhwYXJhbXM6IEdldEFkZHJlc3NPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ2FkZHJlc3MnLCAnaWQnXSk7XG4gICAgbGV0IHF1ZXJ5O1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5hZGRyZXNzKSAmJiBfLmlzVW5kZWZpbmVkKHBhcmFtcy5pZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYWRkcmVzcyBvciBpZCBvZiBhZGRyZXNzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGlmIChwYXJhbXMuYWRkcmVzcykge1xuICAgICAgcXVlcnkgPSBwYXJhbXMuYWRkcmVzcztcbiAgICB9IGVsc2Uge1xuICAgICAgcXVlcnkgPSBwYXJhbXMuaWQ7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5yZXFJZCkge1xuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z29cbiAgICAgIC5nZXQodGhpcy5iYXNlQ29pbi51cmwoYC93YWxsZXQvJHt0aGlzLl93YWxsZXQuaWR9L2FkZHJlc3MvJHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfWApKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBvbmUgb3IgbW9yZSBuZXcgYWRkcmVzcyhlcykgZm9yIHVzZSB3aXRoIHRoaXMgd2FsbGV0LlxuICAgKlxuICAgKiBJZiB0aGUgYGNvdW50YCBmaWVsZCBpcyBkZWZpbmVkIGFuZCBncmVhdGVyIHRoYW4gMSwgYW4gb2JqZWN0IHdpdGggYSBzaW5nbGVcbiAgICogYXJyYXkgcHJvcGVydHkgbmFtZWQgYGFkZHJlc3Nlc2AgY29udGFpbmluZyBgY291bnRgIGFkZHJlc3Mgb2JqZWN0c1xuICAgKiB3aWxsIGJlIHJldHVybmVkLiBPdGhlcndpc2UsIGEgc2luZ2xlIGFkZHJlc3Mgb2JqZWN0IGlzIHJldHVybmVkLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuY2hhaW4gb24gd2hpY2ggdGhlIG5ldyBhZGRyZXNzIHNob3VsZCBiZSBjcmVhdGVkXG4gICAqIEBwYXJhbSB7KE51bWJlcnxTdHJpbmcpfSBwYXJhbXMuZ2FzUHJpY2UgZ2FzIHByaWNlIGZvciBuZXcgYWRkcmVzcyBjcmVhdGlvbiwgaWYgYXBwbGljYWJsZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmxhYmVsIGxhYmVsIGZvciB0aGUgbmV3IGFkZHJlc3MoZXMpXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuY291bnQ9MSBudW1iZXIgb2YgbmV3IGFkZHJlc3NlcyB3aGljaCBzaG91bGQgYmUgY3JlYXRlZCAobWF4aW11bSAyNTApXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZm9yd2FyZGVyVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiBhZGRyZXNzIHRvIGNyZWF0ZSwgaWYgYXBwbGljYWJsZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5sb3dQcmlvcml0eSBFdGhlcmV1bS1zcGVjaWZpYyBwYXJhbSB0byBjcmVhdGUgYWRkcmVzcyB1c2luZyBsb3cgcHJpb3JpdHkgZmVlIGFkZHJlc3NcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5iYXNlQWRkcmVzcyBiYXNlIGFkZHJlc3Mgb2YgdGhlIHdhbGxldChvcHRpb25hbCBwYXJhbWV0ZXIpXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmFsbG93U2tpcFZlcmlmeUFkZHJlc3MgV2hlbiBzZXQgdG8gZmFsc2UsIGl0IHRocm93cyBlcnJvciBpZiBhZGRyZXNzIHZlcmlmaWNhdGlvbiBpcyBza2lwcGVkIGZvciBhbnkgcmVhc29uLiBEZWZhdWx0IGlzIHRydWUuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMub25Ub2tlbiBtYW5kYXRvcnkgaW4gY2FzZSBvZiB0aGUgT0ZDIHdhbGxldCwgdGhlIG5hbWUgb2YgdG9rZW4gdG8gY3JlYXRlIGFkZHJlc3MgZm9yXG4gICAqIEFkZHJlc3MgdmVyaWZpY2F0aW9uIGNhbiBiZSBza2lwcGVkIHdoZW4gZm9yd2FyZGVyVmVyc2lvbiBpcyAwIGFuZCBwZW5kaW5nQ2hhaW5Jbml0aWFsaXphdGlvbiBpcyB0cnVlIE9SXG4gICAqIGlmICdjb2luU3BlY2lmaWMnIGlzIG5vdCBwYXJ0IG9mIHRoZSByZXNwb25zZSBmcm9tIGFwaSBjYWxsIHRvIGNyZWF0ZSBhZGRyZXNzXG4gICAqL1xuICBhc3luYyBjcmVhdGVBZGRyZXNzKHBhcmFtczogQ3JlYXRlQWRkcmVzc09wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgYWRkcmVzc1BhcmFtczogQ3JlYXRlQWRkcmVzc09wdGlvbnMgPSB7fTtcbiAgICBjb25zdCByZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG5cbiAgICBjb25zdCB7XG4gICAgICBjaGFpbixcbiAgICAgIGdhc1ByaWNlLFxuICAgICAgbGFiZWwsXG4gICAgICBsb3dQcmlvcml0eSxcbiAgICAgIGZvcndhcmRlclZlcnNpb24sXG4gICAgICBmb3JtYXQsXG4gICAgICBjb3VudCA9IDEsXG4gICAgICBiYXNlQWRkcmVzcyxcbiAgICAgIGFsbG93U2tpcFZlcmlmeUFkZHJlc3MgPSB0cnVlLFxuICAgICAgb25Ub2tlbixcbiAgICAgIGV2bUtleVJpbmdSZWZlcmVuY2VBZGRyZXNzLFxuICAgIH0gPSBwYXJhbXM7XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoY2hhaW4pKSB7XG4gICAgICBpZiAoIV8uaXNJbnRlZ2VyKGNoYWluKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NoYWluIGhhcyB0byBiZSBhbiBpbnRlZ2VyJyk7XG4gICAgICB9XG4gICAgICBhZGRyZXNzUGFyYW1zLmNoYWluID0gY2hhaW47XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGdhc1ByaWNlKSkge1xuICAgICAgaWYgKCFfLmlzSW50ZWdlcihnYXNQcmljZSkgJiYgKGlzTmFOKE51bWJlcihnYXNQcmljZSkpIHx8ICFfLmlzU3RyaW5nKGdhc1ByaWNlKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdnYXNQcmljZSBoYXMgdG8gYmUgYW4gaW50ZWdlciBvciBudW1lcmljIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgYWRkcmVzc1BhcmFtcy5nYXNQcmljZSA9IGdhc1ByaWNlO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChmb3J3YXJkZXJWZXJzaW9uKSkge1xuICAgICAgaWYgKCFfLmlzSW50ZWdlcihmb3J3YXJkZXJWZXJzaW9uKSB8fCBmb3J3YXJkZXJWZXJzaW9uIDwgMCB8fCBmb3J3YXJkZXJWZXJzaW9uID4gNSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZvcndhcmRlclZlcnNpb24gaGFzIHRvIGJlIGFuIGludGVnZXIgMCwgMSwgMiwgMywgNCBvciA1Jyk7XG4gICAgICB9XG4gICAgICBhZGRyZXNzUGFyYW1zLmZvcndhcmRlclZlcnNpb24gPSBmb3J3YXJkZXJWZXJzaW9uO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChsYWJlbCkpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhsYWJlbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdsYWJlbCBoYXMgdG8gYmUgYSBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIGFkZHJlc3NQYXJhbXMubGFiZWwgPSBsYWJlbDtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoYmFzZUFkZHJlc3MpKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcoYmFzZUFkZHJlc3MpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYmFzZUFkZHJlc3MgaGFzIHRvIGJlIGEgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGFsbG93U2tpcFZlcmlmeUFkZHJlc3MpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKGFsbG93U2tpcFZlcmlmeUFkZHJlc3MpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYWxsb3dTa2lwVmVyaWZ5QWRkcmVzcyBoYXMgdG8gYmUgYSBib29sZWFuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzSW50ZWdlcihjb3VudCkgfHwgY291bnQgPD0gMCB8fCBjb3VudCA+IDI1MCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VudCBoYXMgdG8gYmUgYSBudW1iZXIgYmV0d2VlbiAxIGFuZCAyNTAnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQobG93UHJpb3JpdHkpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKGxvd1ByaW9yaXR5KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2xvd1ByaW9yaXR5IGhhcyB0byBiZSBhIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIGFkZHJlc3NQYXJhbXMubG93UHJpb3JpdHkgPSBsb3dQcmlvcml0eTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZm9ybWF0KSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKGZvcm1hdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdmb3JtYXQgaGFzIHRvIGJlIGEgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBhZGRyZXNzUGFyYW1zLmZvcm1hdCA9IGZvcm1hdDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSA9PT0gJ29mYycpIHtcbiAgICAgIGlmICghXy5pc1VuZGVmaW5lZChvblRva2VuKSkge1xuICAgICAgICBpZiAoIV8uaXNTdHJpbmcob25Ub2tlbikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ29uVG9rZW4gaGFzIHRvIGJlIGEgc3RyaW5nJyk7XG4gICAgICAgIH1cbiAgICAgICAgYWRkcmVzc1BhcmFtcy5vblRva2VuID0gb25Ub2tlbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignb25Ub2tlbiBpcyBhIG1hbmRhdG9yeSBwYXJhbWV0ZXIgZm9yIE9GQyB3YWxsZXRzJyk7XG4gICAgICB9XG4gICAgICBpZiAoIV8uaXNTdHJpbmcob25Ub2tlbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvblRva2VuIGhhcyB0byBiZSBhIHN0cmluZycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChldm1LZXlSaW5nUmVmZXJlbmNlQWRkcmVzcykpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhldm1LZXlSaW5nUmVmZXJlbmNlQWRkcmVzcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdldm1LZXlSaW5nUmVmZXJlbmNlQWRkcmVzcyBoYXMgdG8gYmUgYSBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5iYXNlQ29pbi5pc0VWTSgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZXZtS2V5UmluZ1JlZmVyZW5jZUFkZHJlc3MgaXMgb25seSBzdXBwb3J0ZWQgZm9yIEVWTSBjaGFpbnMnKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5iYXNlQ29pbi5pc1ZhbGlkQWRkcmVzcyhldm1LZXlSaW5nUmVmZXJlbmNlQWRkcmVzcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdldm1LZXlSaW5nUmVmZXJlbmNlQWRkcmVzcyBtdXN0IGJlIGEgdmFsaWQgYWRkcmVzcycpO1xuICAgICAgfVxuICAgICAgYWRkcmVzc1BhcmFtcy5ldm1LZXlSaW5nUmVmZXJlbmNlQWRkcmVzcyA9IGV2bUtleVJpbmdSZWZlcmVuY2VBZGRyZXNzO1xuICAgIH1cblxuICAgIC8vIGdldCBrZXljaGFpbnMgZm9yIGFkZHJlc3MgdmVyaWZpY2F0aW9uXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5fd2FsbGV0LmtleXMubWFwKChrKSA9PiB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmdldCh7IGlkOiBrLCByZXFJZCB9KSkpO1xuICAgIGNvbnN0IHJvb3RBZGRyZXNzID0gXy5nZXQodGhpcy5fd2FsbGV0LCAncmVjZWl2ZUFkZHJlc3MuYWRkcmVzcycpO1xuXG4gICAgY29uc3QgbmV3QWRkcmVzc2VzID0gXy50aW1lcyhjb3VudCwgYXN5bmMgKCkgPT4ge1xuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcbiAgICAgIGNvbnN0IG5ld0FkZHJlc3MgPSAoYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgICAucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5fd2FsbGV0LmlkICsgJy9hZGRyZXNzJykpXG4gICAgICAgIC5zZW5kKGFkZHJlc3NQYXJhbXMpXG4gICAgICAgIC5yZXN1bHQoKSkgYXMgYW55O1xuXG4gICAgICBuZXdBZGRyZXNzLmtleWNoYWlucyA9IGtleWNoYWlucztcbiAgICAgIG5ld0FkZHJlc3MuYmFzZUFkZHJlc3MgPSBiYXNlQWRkcmVzcyA/PyBfLmdldCh0aGlzLl93YWxsZXQsICdjb2luU3BlY2lmaWMuYmFzZUFkZHJlc3MnKTtcbiAgICAgIG5ld0FkZHJlc3MuZm9ybWF0ID0gYWRkcmVzc1BhcmFtcy5mb3JtYXQ7XG5cbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbkRhdGE6IFZlcmlmeUFkZHJlc3NPcHRpb25zID0gXy5tZXJnZSh7fSwgbmV3QWRkcmVzcywge1xuICAgICAgICByb290QWRkcmVzcyxcbiAgICAgICAgd2FsbGV0VmVyc2lvbjogXy5nZXQodGhpcy5fd2FsbGV0LCAnY29pblNwZWNpZmljLndhbGxldFZlcnNpb24nKSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAodmVyaWZpY2F0aW9uRGF0YS5lcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgQWRkcmVzc0dlbmVyYXRpb25FcnJvcih2ZXJpZmljYXRpb25EYXRhLmVycm9yKTtcbiAgICAgIH1cblxuICAgICAgdmVyaWZpY2F0aW9uRGF0YS5pbXBsaWVkRm9yd2FyZGVyVmVyc2lvbiA9IGZvcndhcmRlclZlcnNpb24gPz8gdmVyaWZpY2F0aW9uRGF0YS5jb2luU3BlY2lmaWM/LmZvcndhcmRlclZlcnNpb247XG5cbiAgICAgIC8vIEZvciBTTUMgKFNlbGYtTWFuYWdlZCBDdXN0b2RpYWwpIHdhbGxldHMsIHBhc3MgZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZCBmcm9tIHVzZXIga2V5Y2hhaW5cbiAgICAgIC8vIFRoZSB2ZXJpZmljYXRpb24gZnVuY3Rpb24gd2lsbCBjb21wdXRlIHRoZSBkZXJpdmF0aW9uIHByZWZpeCBpbnRlcm5hbGx5XG4gICAgICAvLyBDdXN0b2RpYWwgd2FsbGV0cyBkb24ndCBuZWVkIHRoaXMgYXMgdGhlaXIgY29tbW9uS2V5Y2hhaW4gYWxyZWFkeSBhY2NvdW50cyBmb3IgdGhlIHByZWZpeFxuICAgICAgaWYgKHRoaXMubXVsdGlzaWdUeXBlKCkgPT09ICd0c3MnICYmIHRoaXMudHlwZSgpID09PSAnY29sZCcgJiYgdGhpcy5fd2FsbGV0LmtleXMubGVuZ3RoID4gS2V5SW5kaWNlcy5VU0VSKSB7XG4gICAgICAgIGNvbnN0IHVzZXJLZXljaGFpbiA9IGtleWNoYWluc1tLZXlJbmRpY2VzLlVTRVJdIGFzIEtleWNoYWluIHwgdW5kZWZpbmVkO1xuICAgICAgICB2ZXJpZmljYXRpb25EYXRhLmRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWQgPSB1c2VyS2V5Y2hhaW4/LmRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoaXMgY29uZGl0aW9uIHdhcyBhZGRlZCBpbiBmaXJzdCBwbGFjZSBiZWNhdXNlIGluIGNlbG8sIHdoZW4gdmVyaWZ5QWRkcmVzcyBtZXRob2Qgd2FzIGNhbGxlZCBvbiBhZGRyZXNzZXMgd2hpY2ggd2VyZSBoYXZpbmcgcGVuZGluZ0NoYWluSW5pdGlhbGl6YXRpb24gYXMgdHJ1ZSwgaXQgdXNlZCB0byB0aHJvdyBzb21lIGVycm9yXG4gICAgICAvLyBJbiBjYXNlIG9mIGZvcndhcmRlciB2ZXJzaW9uIDEgZXRoIGFkZHJlc3NlcywgYWRkcmVzc2VzIG5lZWQgdG8gYmUgdmVyaWZpZWQgZXZlbiBpZiB0aGUgcGVuZGluZ0NoYWluSW5pdGlhbGl6YXRpb24gZmxhZyBpcyB0cnVlXG4gICAgICBpZiAoXG4gICAgICAgIHZlcmlmaWNhdGlvbkRhdGEuY29pblNwZWNpZmljICYmXG4gICAgICAgICghdmVyaWZpY2F0aW9uRGF0YS5jb2luU3BlY2lmaWMucGVuZGluZ0NoYWluSW5pdGlhbGl6YXRpb24gfHwgdmVyaWZpY2F0aW9uRGF0YS5pbXBsaWVkRm9yd2FyZGVyVmVyc2lvbiA9PT0gMSlcbiAgICAgICkge1xuICAgICAgICAvLyBjYW4ndCB2ZXJpZnkgYWRkcmVzc2VzIHdoaWNoIGFyZSBwZW5kaW5nIGNoYWluIGluaXRpYWxpemF0aW9uLCBhcyB0aGUgYWRkcmVzcyBpcyBoaWRkZW5cbiAgICAgICAgbGV0IGlzV2FsbGV0QWRkcmVzcyA9IGZhbHNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlzV2FsbGV0QWRkcmVzcyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4uaXNXYWxsZXRBZGRyZXNzKHZlcmlmaWNhdGlvbkRhdGEsIHRoaXMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IpKSB7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBGSVhNRShCRy00MzIyNSk6IGltcGxlbWVudCB0aGlzIGNvcnJlY3RseVxuICAgICAgICAgIGlzV2FsbGV0QWRkcmVzcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1dhbGxldEFkZHJlc3MpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vdCBhIHdhbGxldCBhZGRyZXNzYCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIWFsbG93U2tpcFZlcmlmeUFkZHJlc3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBhZGRyZXNzIHZlcmlmaWNhdGlvbiBza2lwcGVkIGZvciBjb3VudCA9ICR7Y291bnR9YCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXdBZGRyZXNzO1xuICAgIH0pO1xuXG4gICAgaWYgKG5ld0FkZHJlc3Nlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiBuZXdBZGRyZXNzZXNbMF07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFkZHJlc3NlczogYXdhaXQgUHJvbWlzZS5hbGwobmV3QWRkcmVzc2VzKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBwcm9wZXJ0aWVzIG9uIGFuIGFkZHJlc3NcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHVwZGF0ZUFkZHJlc3MocGFyYW1zOiBVcGRhdGVBZGRyZXNzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBhZGRyZXNzID0gcGFyYW1zLmFkZHJlc3M7XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcoYWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBzdHJpbmcgcGFyYW1ldGVyIGFkZHJlc3MnKTtcbiAgICB9XG5cbiAgICBjb25zdCBwdXRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbJ2xhYmVsJ10pO1xuICAgIGNvbnN0IHVybCA9IHRoaXMudXJsKCcvYWRkcmVzcy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGFkZHJlc3MpKTtcblxuICAgIHJldHVybiB0aGlzLmJpdGdvLnB1dCh1cmwpLnNlbmQocHV0UGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWNjb3VudCByZXNvdXJjZXMgZm9yIHRoZSBnaXZlbiBhZGRyZXNzZXNcbiAgICogQHBhcmFtIHBhcmFtcyAtIG9wdGlvbnMgb2JqZWN0IGNvbnRhaW5pbmcgYWRkcmVzc2VzIGFuZCBvcHRpb25hbCBkZXN0aW5hdGlvbkFkZHJlc3NcbiAgICogQHJldHVybnMge1Byb21pc2U8R2V0QWNjb3VudFJlc291cmNlc1Jlc3BvbnNlPn0gLSByZXNwb25zZSBmcm9tIFdQIEFQSVxuICAgKi9cbiAgYXN5bmMgZ2V0QWNjb3VudFJlc291cmNlcyhwYXJhbXM6IEdldEFjY291bnRSZXNvdXJjZXNPcHRpb25zKTogUHJvbWlzZTxHZXRBY2NvdW50UmVzb3VyY2VzUmVzcG9uc2U+IHtcbiAgICBjb25zdCB7IGFkZHJlc3NlcywgZGVzdGluYXRpb25BZGRyZXNzIH0gPSBwYXJhbXM7XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYWRkcmVzc2VzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhZGRyZXNzZXMgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgIH1cblxuICAgIGlmIChhZGRyZXNzZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FkZHJlc3NlcyBhcnJheSBjYW5ub3QgYmUgZW1wdHknKTtcbiAgICB9XG5cbiAgICBjb25zdCBib2R5OiBHZXRBY2NvdW50UmVzb3VyY2VzT3B0aW9ucyA9IHsgYWRkcmVzc2VzIH07XG4gICAgaWYgKGRlc3RpbmF0aW9uQWRkcmVzcykge1xuICAgICAgYm9keS5kZXN0aW5hdGlvbkFkZHJlc3MgPSBkZXN0aW5hdGlvbkFkZHJlc3M7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL2dldEFjY291bnRSZXNvdXJjZXMnKSkuc2VuZChib2R5KS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcmVzb3VyY2UgZGVsZWdhdGlvbnMgZm9yIHRoaXMgd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXMgLSBvcHRpb25hbCBmaWx0ZXJzOiB0eXBlLCByZXNvdXJjZSwgbGltaXQsIG5leHRCYXRjaFByZXZJZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxHZXRSZXNvdXJjZURlbGVnYXRpb25zUmVzcG9uc2U+fSAtIHJlc3BvbnNlIGZyb20gV1AgQVBJXG4gICAqL1xuICBhc3luYyBnZXRSZXNvdXJjZURlbGVnYXRpb25zKHBhcmFtcz86IEdldFJlc291cmNlRGVsZWdhdGlvbnNPcHRpb25zKTogUHJvbWlzZTxHZXRSZXNvdXJjZURlbGVnYXRpb25zUmVzcG9uc2U+IHtcbiAgICBjb25zdCBxdWVyeVBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPiA9IHt9O1xuICAgIGlmIChwYXJhbXM/LnR5cGUgIT09IHVuZGVmaW5lZCkgcXVlcnlQYXJhbXMudHlwZSA9IHBhcmFtcy50eXBlO1xuICAgIGlmIChwYXJhbXM/LnJlc291cmNlICE9PSB1bmRlZmluZWQpIHF1ZXJ5UGFyYW1zLnJlc291cmNlID0gcGFyYW1zLnJlc291cmNlO1xuICAgIGlmIChwYXJhbXM/LmxpbWl0ICE9PSB1bmRlZmluZWQpIHF1ZXJ5UGFyYW1zLmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICAgIGlmIChwYXJhbXM/Lm5leHRCYXRjaFByZXZJZCAhPT0gdW5kZWZpbmVkKSBxdWVyeVBhcmFtcy5uZXh0QmF0Y2hQcmV2SWQgPSBwYXJhbXMubmV4dEJhdGNoUHJldklkO1xuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvcmVzb3VyY2VkZWxlZ2F0aW9ucycpKS5xdWVyeShxdWVyeVBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVXYWxsZXRCdWlsZERlZmF1bHRzKHBhcmFtczogVXBkYXRlQnVpbGREZWZhdWx0T3B0aW9ucyk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ21pbkZlZVJhdGUnLCAnY2hhbmdlQWRkcmVzc1R5cGUnLCAndHhGb3JtYXQnXSk7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlV2FsbGV0KHtcbiAgICAgIGJ1aWxkRGVmYXVsdHM6IHtcbiAgICAgICAgbWluRmVlUmF0ZTogcGFyYW1zLm1pbkZlZVJhdGUsXG4gICAgICAgIGNoYW5nZUFkZHJlc3NUeXBlOiBwYXJhbXMuY2hhbmdlQWRkcmVzc1R5cGUsXG4gICAgICAgIHR4Rm9ybWF0OiBwYXJhbXMudHhGb3JtYXQsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlV2FsbGV0KHBhcmFtczogVXBkYXRlV2FsbGV0T3B0aW9ucyk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IGZpbHRlcmVkUGFyYW1zID0gXy5waWNrKHBhcmFtcywgWydjb2luU3BlY2lmaWMnLCAnYnVpbGREZWZhdWx0cycsICdsYWJlbCddKTtcbiAgICBjb25zdCB7IGNvaW5TcGVjaWZpYywgLi4ucmVzdCB9ID0gZmlsdGVyZWRQYXJhbXM7XG4gICAgcmV0dXJuIHRoaXMuYml0Z29cbiAgICAgIC5wdXQodGhpcy51cmwoKSlcbiAgICAgIC5zZW5kKHtcbiAgICAgICAgLi4ucmVzdCxcbiAgICAgICAgLi4uKGNvaW5TcGVjaWZpY1xuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBjb2luU3BlY2lmaWM6IHtcbiAgICAgICAgICAgICAgICBbdGhpcy5iYXNlQ29pbi5nZXRDaGFpbigpXTogY29pblNwZWNpZmljLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgfSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHdlYmhvb2tzIG9uIHRoaXMgd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGxpc3RXZWJob29rcyhwYXJhbXM6IFBhZ2luYXRpb25PcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHF1ZXJ5OiBQYWdpbmF0aW9uT3B0aW9ucyA9IHt9O1xuICAgIGlmIChwYXJhbXMucHJldklkKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByZXZJZCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkucHJldklkID0gcGFyYW1zLnByZXZJZDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmxpbWl0KSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmxpbWl0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3dlYmhvb2tzJykpLnF1ZXJ5KHF1ZXJ5KS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaW11bGF0ZSB3YWxsZXQgd2ViaG9vaywgY3VycmVudGx5IGZvciB3ZWJob29rcyBvZiB0eXBlIHRyYW5zZmVyIGFuZCBwZW5kaW5nIGFwcHJvdmFsXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogLSB3ZWJob29rSWQgKHJlcXVpcmVkKSBpZCBvZiB0aGUgd2ViaG9vayB0byBiZSBzaW11bGF0ZWRcbiAgICogLSB0cmFuc2ZlcklkIChvcHRpb25hbCBidXQgcmVxdWlyZWQgZm9yIHRyYW5zZmVyIHdlYmhvb2tzKSBpZCBvZiB0aGUgc2ltdWxhdGVkIHRyYW5zZmVyXG4gICAqIC0gcGVuZGluZ0FwcHJvdmFsSWQgKG9wdGlvbmFsIGJ1dCByZXF1aXJlZCBmb3IgcGVuZGluZyBhcHByb3ZhbCB3ZWJob29rcykgaWQgb2YgdGhlIHNpbXVsYXRlZCBwZW5kaW5nIGFwcHJvdmFsXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgc2ltdWxhdGVXZWJob29rKHBhcmFtczogU2ltdWxhdGVXZWJob29rT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3dlYmhvb2tJZCddLCBbJ3RyYW5zZmVySWQnLCAncGVuZGluZ0FwcHJvdmFsSWQnXSk7XG5cbiAgICBjb25zdCBoYXNUcmFuc2ZlcklkID0gISFwYXJhbXMudHJhbnNmZXJJZDtcbiAgICBjb25zdCBoYXNQZW5kaW5nQXBwcm92YWxJZCA9ICEhcGFyYW1zLnBlbmRpbmdBcHByb3ZhbElkO1xuICAgIGlmICghaGFzVHJhbnNmZXJJZCAmJiAhaGFzUGVuZGluZ0FwcHJvdmFsSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBzdXBwbHkgZWl0aGVyIHRyYW5zZmVySWQgb3IgcGVuZGluZ0FwcHJvdmFsSWQnKTtcbiAgICB9XG5cbiAgICBpZiAoaGFzVHJhbnNmZXJJZCAmJiBoYXNQZW5kaW5nQXBwcm92YWxJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtdXN0IHN1cHBseSBlaXRoZXIgdHJhbnNmZXJJZCBvciBwZW5kaW5nQXBwcm92YWxJZCwgYnV0IG5vdCBib3RoJyk7XG4gICAgfVxuXG4gICAgLy8gZGVwZW5kaW5nIG9uIHRoZSBjb2luIHR5cGUgb2YgdGhlIHdhbGxldCwgdGhlIHR4SGFzaCBoYXMgdG8gYWRoZXJlIHRvIGl0cyByZXNwZWN0aXZlIGZvcm1hdFxuICAgIC8vIGJ1dCB0aGUgc2VydmVyIHRha2VzIGNhcmUgb2YgdGhhdFxuXG4gICAgLy8gb25seSB0YWtlIHRoZSB0cmFuc2ZlcklkIGFuZCBwZW5kaW5nQXBwcm92YWxJZCBwcm9wZXJ0aWVzXG4gICAgY29uc3QgZmlsdGVyZWRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbJ3RyYW5zZmVySWQnLCAncGVuZGluZ0FwcHJvdmFsSWQnXSk7XG5cbiAgICBjb25zdCB3ZWJob29rSWQgPSBwYXJhbXMud2ViaG9va0lkO1xuICAgIHJldHVybiB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLnVybCgnL3dlYmhvb2tzLycgKyB3ZWJob29rSWQgKyAnL3NpbXVsYXRlJykpXG4gICAgICAuc2VuZChmaWx0ZXJlZFBhcmFtcylcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSB3ZWJob29rIHRvIHRoaXMgd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGFkZFdlYmhvb2socGFyYW1zOiBNb2RpZnlXZWJob29rT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VybCcsICd0eXBlJ10sIFtdKTtcblxuICAgIHJldHVybiB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy93ZWJob29rcycpKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgd2ViaG9vayBmcm9tIHRoaXMgd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIHJlbW92ZVdlYmhvb2socGFyYW1zOiBNb2RpZnlXZWJob29rT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VybCcsICd0eXBlJ10sIFtdKTtcblxuICAgIHJldHVybiB0aGlzLmJpdGdvLmRlbCh0aGlzLnVybCgnL3dlYmhvb2tzJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB1c2VyIGtleWNoYWluIGZvciB0aGlzIHdhbGxldFxuICAgKlxuICAgKiBUaGUgdXNlciBrZXljaGFpbiBpcyB0aGUgZmlyc3Qga2V5Y2hhaW4gb2YgdGhlIHdhbGxldCBhbmQgdXN1YWxseSBoYXMgdGhlIGVuY3J5cHRlZCBwcnYgc3RvcmVkIG9uIEJpdEdvLlxuICAgKiBVc2VmdWwgd2hlbiB0cnlpbmcgdG8gZ2V0IHRoZSB1c2Vycycga2V5Y2hhaW4gZnJvbSB0aGUgc2VydmVyIGJlZm9yZSBkZWNyeXB0aW5nIHRvIHNpZ24gYSB0cmFuc2FjdGlvbi5cbiAgICovXG4gIGFzeW5jIGdldEVuY3J5cHRlZFVzZXJLZXljaGFpbigpOiBQcm9taXNlPEtleWNoYWluV2l0aEVuY3J5cHRlZFBydj4ge1xuICAgIGNvbnN0IHRyeUtleUNoYWluID0gYXN5bmMgKGluZGV4OiBudW1iZXIpOiBQcm9taXNlPEtleWNoYWluV2l0aEVuY3J5cHRlZFBydj4gPT4ge1xuICAgICAgaWYgKCF0aGlzLl93YWxsZXQua2V5cyB8fCBpbmRleCA+PSB0aGlzLl93YWxsZXQua2V5cy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdFbmNyeXB0ZWRLZXljaGFpbkVycm9yKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmFtcyA9IHsgaWQ6IHRoaXMuX3dhbGxldC5rZXlzW2luZGV4XSB9O1xuXG4gICAgICBjb25zdCBrZXljaGFpbiA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0KHBhcmFtcyk7XG4gICAgICAvLyBJZiB3ZSBmaW5kIHRoZSBwcnYsIHRoZW4gdGhpcyBpcyBwcm9iYWJseSB0aGUgdXNlciBrZXljaGFpbiB3ZSdyZSBsb29raW5nIGZvclxuICAgICAgaWYgKGtleWNoYWluLmVuY3J5cHRlZFBydikge1xuICAgICAgICByZXR1cm4ga2V5Y2hhaW4gYXMgS2V5Y2hhaW5XaXRoRW5jcnlwdGVkUHJ2O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRyeUtleUNoYWluKGluZGV4ICsgMSk7XG4gICAgfTtcblxuICAgIHJldHVybiB0cnlLZXlDaGFpbigwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB1bmVuY3J5cHRlZCBwcml2YXRlIGtleSBmb3IgdGhpcyB3YWxsZXQgKGJlIGNhcmVmdWwhKVxuICAgKiBSZXF1aXJlcyB3YWxsZXQgcGFzc3BocmFzZVxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBnZXRQcnYocGFyYW1zOiBHZXRQcnZPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ3dhbGxldFBhc3NwaHJhc2UnLCAncHJ2J10pO1xuXG4gICAgLy8gUHJlcGFyZSBzaWduaW5nIGtleVxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5wcnYpICYmIF8uaXNVbmRlZmluZWQocGFyYW1zLndhbGxldFBhc3NwaHJhc2UpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ211c3QgZWl0aGVyIHByb3ZpZGUgcHJ2IG9yIHdhbGxldCBwYXNzcGhyYXNlJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5wcnYpICYmICFfLmlzU3RyaW5nKHBhcmFtcy5wcnYpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BydiBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSAmJiAhXy5pc1N0cmluZyhwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignd2FsbGV0UGFzc3BocmFzZSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5wcnYpIHtcbiAgICAgIHJldHVybiBwYXJhbXMucHJ2O1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJLZXljaGFpbiA9IGF3YWl0IHRoaXMuZ2V0RW5jcnlwdGVkVXNlcktleWNoYWluKCk7XG4gICAgaWYgKCFwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd3YWxsZXQgcGFzc3BocmFzZSB3YXMgbm90IHByb3ZpZGVkJyk7XG4gICAgfVxuICAgIGNvbnN0IHVzZXJQcnYgPSBkZWNyeXB0S2V5Y2hhaW5Qcml2YXRlS2V5KHRoaXMuYml0Z28sIHVzZXJLZXljaGFpbiwgcGFyYW1zLndhbGxldFBhc3NwaHJhc2UpO1xuICAgIGlmICghdXNlclBydikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdlcnJvciBkZWNyeXB0aW5nIHdhbGxldCBwcml2YXRlIGtleScpO1xuICAgIH1cbiAgICByZXR1cm4gdXNlclBydjtcbiAgfVxuXG4gIHByaXZhdGUgaXNNdWx0aVVzZXJLZXlXYWxsZXQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWM/LmZlYXR1cmVzPy5pbmNsdWRlcygnbXVsdGkta2V5LXVzZXIta2V5JykgPz8gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBhbiBlbmNyeXB0ZWQgd2FsbGV0IHNoYXJlIHRvIEJpdEdvLlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBjcmVhdGVTaGFyZShwYXJhbXM6IENyZWF0ZVNoYXJlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VzZXInLCAncGVybWlzc2lvbnMnXSwgW10pO1xuXG4gICAgY29uc3QgaXNNdWx0aVVzZXJLZXlXYWxsZXQgPSB0aGlzLmlzTXVsdGlVc2VyS2V5V2FsbGV0KCk7XG5cbiAgICBpZiAoaXNNdWx0aVVzZXJLZXlXYWxsZXQpIHtcbiAgICAgIGlmIChwYXJhbXMua2V5Y2hhaW4gJiYgIV8uaXNFbXB0eShwYXJhbXMua2V5Y2hhaW4pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigna2V5Y2hhaW4gcHJvcGVydHkgbXVzdCBub3QgYmUgcHJvdmlkZWQgZm9yIG11bHRpLWtleS11c2VyLWtleSB3YWxsZXRzJyk7XG4gICAgICB9XG4gICAgICAvLyBSZW1vdmUga2V5Y2hhaW4gZnJvbSBwYXJhbXMgaWYgcHJlc2VudHNcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9zaGFyZScpKS5zZW5kKF8ub21pdChwYXJhbXMsICdrZXljaGFpbicpKS5yZXN1bHQoKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmtleWNoYWluICYmICFfLmlzRW1wdHkocGFyYW1zLmtleWNoYWluKSkge1xuICAgICAgaWYgKFxuICAgICAgICAhcGFyYW1zLmtleWNoYWluLnB1YiB8fFxuICAgICAgICAhcGFyYW1zLmtleWNoYWluLmVuY3J5cHRlZFBydiB8fFxuICAgICAgICAhcGFyYW1zLmtleWNoYWluLmZyb21QdWJLZXkgfHxcbiAgICAgICAgIXBhcmFtcy5rZXljaGFpbi50b1B1YktleSB8fFxuICAgICAgICAhcGFyYW1zLmtleWNoYWluLnBhdGhcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVzIGtleWNoYWluIHBhcmFtZXRlcnMgLSBwdWIsIGVuY3J5cHRlZFBydiwgZnJvbVB1YktleSwgdG9QdWJLZXksIHBhdGgnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5iaXRnby5wb3N0KHRoaXMudXJsKCcvc2hhcmUnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNoYXJlcyBhIHdhbGxldCB3aXRoIG11bHRpcGxlIHVzZXJzIGJ5IGNyZWF0aW5nIGJ1bGsgd2FsbGV0IHNoYXJlcy5cbiAgICpcbiAgICogQGFzeW5jXG4gICAqIEBwYXJhbSB7QnVsa1dhbGxldFNoYXJlT3B0aW9uc30gcGFyYW1zIC0gVGhlIG9wdGlvbnMgZm9yIHNoYXJpbmcgd2FsbGV0cyBpbiBidWxrLlxuICAgKiBAcGFyYW0ge0FycmF5PFNoYXJlT3B0aW9uPn0gcGFyYW1zLnNoYXJlT3B0aW9ucyAtIEFuIGFycmF5IG9mIHNoYXJlIG9wdGlvbiBvYmplY3RzIGNvbnRhaW5pbmcgdXNlciBhbmQgcGVybWlzc2lvbnMgaW5mb3JtYXRpb24uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zLnNoYXJlT3B0aW9uc1tdLmtleWNoYWluXSAtIFRoZSBrZXljaGFpbiBvYmplY3QgdXNlZCB0byBzaGFyZSB0aGUgd2FsbGV0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3BhcmFtcy5zaGFyZU9wdGlvbnNbXS5rZXljaGFpbi50b1B1YktleV0gLSBUaGUgcmVjaXBpZW50J3MgcHVibGljIGtleS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXJhbXMuc2hhcmVPcHRpb25zW10ua2V5Y2hhaW4ucGF0aF0gLSBUaGUgZGVyaXZhdGlvbiBwYXRoIG9mIHRoZSBrZXljaGFpbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5zaGFyZU9wdGlvbnNbXS51c2VyIC0gVGhlIHVzZXIgdG8gc2hhcmUgdGhlIHdhbGxldCB3aXRoLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnNoYXJlT3B0aW9uc1tdLnBlcm1pc3Npb25zIC0gVGhlIHBlcm1pc3Npb25zIGdyYW50ZWQgdG8gdGhlIHVzZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGFyYW1zLndhbGxldFBhc3NwaHJhc2VdIC0gVGhlIHdhbGxldCBwYXNzcGhyYXNlIHVzZWQgdG8gZGVjcnlwdCB0aGUga2V5Y2hhaW4uXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBgc2hhcmVPcHRpb25zYCBpcyBlbXB0eSwgb3IgaWYgcmVxdWlyZWQga2V5Y2hhaW4gcGFyYW1ldGVycyAoYHRvUHViS2V5YCBhbmQgYHBhdGhgKSBhcmUgbWlzc2luZyB3aGVuIG5lZWRlZC5cbiAgICogQHRocm93cyB7RXJyb3J9IElmIHVuYWJsZSB0byBkZWNyeXB0IHRoZSB1c2VyIGtleWNoYWluLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDcmVhdGVCdWxrV2FsbGV0U2hhcmVMaXN0UmVzcG9uc2U+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSByZXNwb25zZSBvZiB0aGUgYnVsayB3YWxsZXQgc2hhcmUgY3JlYXRpb24uXG4gICAqL1xuICBhc3luYyBjcmVhdGVCdWxrV2FsbGV0U2hhcmUocGFyYW1zOiBCdWxrV2FsbGV0U2hhcmVPcHRpb25zKTogUHJvbWlzZTxDcmVhdGVCdWxrV2FsbGV0U2hhcmVMaXN0UmVzcG9uc2U+IHtcbiAgICBpZiAocGFyYW1zLmtleVNoYXJlT3B0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gc2hhcmUgb3B0aW9ucyBwcm92aWRlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGJ1bGtDcmVhdGVTaGFyZU9wdGlvbnM6IEJ1bGtDcmVhdGVTaGFyZU9wdGlvbltdID0gW107XG5cbiAgICAvLyBDaGVjayBpZiBhbnkgc2hhcmUgb3B0aW9uIG5lZWRzIGEga2V5Y2hhaW4gKGhhcyAnc3BlbmQnIHBlcm1pc3Npb24pXG4gICAgY29uc3QgYW55TmVlZHNLZXljaGFpbiA9IHBhcmFtcy5rZXlTaGFyZU9wdGlvbnMuc29tZSgob3B0KSA9PiBvcHQucGVybWlzc2lvbnMgJiYgb3B0LnBlcm1pc3Npb25zLmluY2x1ZGVzKCdzcGVuZCcpKTtcblxuICAgIC8vIEZldGNoIGFuZCBkZWNyeXB0IHRoZSBrZXljaGFpbiBPTkNFIGZvciBhbGwgdXNlcnNcbiAgICBsZXQgZGVjcnlwdGVkS2V5Y2hhaW46IERlY3J5cHRlZEtleWNoYWluRGF0YSB8IHVuZGVmaW5lZDtcblxuICAgIGlmIChhbnlOZWVkc0tleWNoYWluKSB7XG4gICAgICB0cnkge1xuICAgICAgICBkZWNyeXB0ZWRLZXljaGFpbiA9IGF3YWl0IHRoaXMuZ2V0RGVjcnlwdGVkS2V5Y2hhaW5Gb3JTaGFyaW5nKHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBNaXNzaW5nRW5jcnlwdGVkS2V5Y2hhaW5FcnJvcikge1xuICAgICAgICAgIGRlY3J5cHRlZEtleWNoYWluID0gdW5kZWZpbmVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHNoYXJlT3B0aW9uIG9mIHBhcmFtcy5rZXlTaGFyZU9wdGlvbnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhzaGFyZU9wdGlvbiwgWyd1c2VySWQnLCAncHViS2V5JywgJ3BhdGgnXSwgW10pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoIXNoYXJlT3B0aW9uLnB1YktleSkge1xuICAgICAgICAgIHRocm93IG5ldyBOZWVkVXNlclNpZ251cEVycm9yKHNoYXJlT3B0aW9uLnVzZXJJZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmVlZHNLZXljaGFpbiA9IHNoYXJlT3B0aW9uLnBlcm1pc3Npb25zICYmIHNoYXJlT3B0aW9uLnBlcm1pc3Npb25zLmluY2x1ZGVzKCdzcGVuZCcpO1xuXG4gICAgICBpZiAobmVlZHNLZXljaGFpbiAmJiBkZWNyeXB0ZWRLZXljaGFpbikge1xuICAgICAgICBjb25zdCBzaGFyZWRLZXljaGFpbiA9IHRoaXMuZW5jcnlwdFBydkZvclVzZXIoXG4gICAgICAgICAgZGVjcnlwdGVkS2V5Y2hhaW4ucHJ2LFxuICAgICAgICAgIGRlY3J5cHRlZEtleWNoYWluLnB1YixcbiAgICAgICAgICBzaGFyZU9wdGlvbi5wdWJLZXksXG4gICAgICAgICAgc2hhcmVPcHRpb24ucGF0aFxuICAgICAgICApO1xuXG4gICAgICAgIGJ1bGtDcmVhdGVTaGFyZU9wdGlvbnMucHVzaCh7XG4gICAgICAgICAgdXNlcjogc2hhcmVPcHRpb24udXNlcklkLFxuICAgICAgICAgIHBlcm1pc3Npb25zOiBzaGFyZU9wdGlvbi5wZXJtaXNzaW9ucyxcbiAgICAgICAgICBrZXljaGFpbjogc2hhcmVkS2V5Y2hhaW4sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmNyZWF0ZUJ1bGtLZXlTaGFyZXMoYnVsa0NyZWF0ZVNoYXJlT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBidWxrIHdhbGxldCBzaGFyZSBlbnRyaWVzIGZvciBzcGVjaWZpZWQgc2hhcmUgb3B0aW9ucy5cbiAgICogRmlsdGVycyBvdXQgc2hhcmUgb3B0aW9ucyB0aGF0IGRvIG5vdCBjb250YWluIHZhbGlkIGtleWNoYWluIGluZm9ybWF0aW9uIG9yIGhhdmUgbWlzc2luZyBrZXljaGFpbiBmaWVsZHMuXG4gICAqIElmIGFsbCBzaGFyZSBvcHRpb25zIGFyZSBpbnZhbGlkIG9yIGVtcHR5LCBpdCB0aHJvd3MgYW4gZXJyb3IuXG4gICAqIFNlbmRzIGEgUE9TVCByZXF1ZXN0IHRvIGNyZWF0ZSB0aGUgd2FsbGV0IHNoYXJlcyBmb3IgdmFsaWQgc2hhcmUgb3B0aW9ucy5cbiAgICpcbiAgICogQGFzeW5jXG4gICAqIEBwYXJhbSB7QnVsa0NyZWF0ZVNoYXJlT3B0aW9uW119IFtwYXJhbXM9W11dIC0gVGhlIGFycmF5IG9mIHNoYXJlIG9wdGlvbnMgdG8gcHJvY2Vzcy5cbiAgICogICBLZXljaGFpbiBlbnRyaWVzIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGZpZWxkczogYHB1YmAsIGBlbmNyeXB0ZWRQcnZgLCBgZnJvbVB1YktleWAsIGB0b1B1YktleWAsIGFuZCBgcGF0aGAuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENyZWF0ZUJ1bGtXYWxsZXRTaGFyZUxpc3RSZXNwb25zZT59IEEgcHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHJlc3VsdCBvZiB0aGUgd2FsbGV0IHNoYXJlcyBjcmVhdGlvbi5cbiAgICogQHRocm93cyB7RXJyb3J9IFRocm93cyBhbiBlcnJvciBpZiBubyB2YWxpZCBzaGFyZSBvcHRpb25zIGFyZSBwcm92aWRlZC5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZUJ1bGtLZXlTaGFyZXMocGFyYW1zOiBCdWxrQ3JlYXRlU2hhcmVPcHRpb25bXSA9IFtdKTogUHJvbWlzZTxDcmVhdGVCdWxrV2FsbGV0U2hhcmVMaXN0UmVzcG9uc2U+IHtcbiAgICBwYXJhbXMgPSBwYXJhbXMuZmlsdGVyKChzaGFyZU9wdGlvbikgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHNoYXJlT3B0aW9uLmtleWNoYWluLCBbJ3B1YicsICdlbmNyeXB0ZWRQcnYnLCAnZnJvbVB1YktleScsICd0b1B1YktleScsICdwYXRoJ10sIFtdKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIEV4Y2x1ZGUgc2hhcmUgb3B0aW9ucyB3aXRoIGludmFsaWQga2V5Y2hhaW5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKCFwYXJhbXMgfHwgT2JqZWN0LmtleXMocGFyYW1zKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2hhcmVPcHRpb25zIGNhbm5vdCBiZSBlbXB0eScpO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IHRoaXMuYml0Z28udXJsKGAvd2FsbGV0LyR7dGhpcy5fd2FsbGV0LmlkfS93YWxsZXRzaGFyZXNgLCAyKTtcbiAgICByZXR1cm4gdGhpcy5iaXRnby5wb3N0KHVybCkuc2VuZCh7IHNoYXJlT3B0aW9uczogcGFyYW1zIH0pLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMga2V5Y2hhaW4gd2l0aCBlbmNyeXB0ZWQgcHJpdmF0ZSBrZXkgdG8gYmUgc2hhcmVkIGZvciB3YWxsZXQgc2hhcmluZy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0RW5jcnlwdGVkV2FsbGV0S2V5Y2hhaW5Gb3JXYWxsZXRTaGFyaW5nKCk6IFByb21pc2U8S2V5Y2hhaW5XaXRoRW5jcnlwdGVkUHJ2PiB7XG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgPT09ICdsbmJ0YycpIHtcbiAgICAgIC8vIGxpZ2h0bmluZyBjb2luIGRvZXMgbm90IHVzZSB1c2VyIGtleSB0byBzaWduIHRoZSB0cmFuc2FjdGlvbnMgZnJvbSBTREsuXG4gICAgICAvLyBpdCB1c2VzIHVzZXIgYXV0aCBrZXkgaW5zdGVhZC5cbiAgICAgIHJldHVybiBhd2FpdCBnZXRMaWdodG5pbmdBdXRoS2V5KHRoaXMsICd1c2VyQXV0aCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRFbmNyeXB0ZWRVc2VyS2V5Y2hhaW4oKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBhbmQgZGVjcnlwdHMgdGhlIHdhbGxldCBrZXljaGFpbiBmb3Igc2hhcmluZy5cbiAgICogVGhpcyBtZXRob2QgZmV0Y2hlcyB0aGUga2V5Y2hhaW4gb25jZSBhbmQgZGVjcnlwdHMgaXQsIHJldHVybmluZyB0aGUgZGVjcnlwdGVkXG4gICAqIHByaXZhdGUga2V5IGFuZCBwdWJsaWMga2V5IGluZm8gbmVlZGVkIGZvciBzaGFyaW5nIHdpdGggbXVsdGlwbGUgdXNlcnMuXG4gICAqXG4gICAqIEBwYXJhbSB3YWxsZXRQYXNzcGhyYXNlIC0gVGhlIHBhc3NwaHJhc2UgdG8gZGVjcnlwdCB0aGUga2V5Y2hhaW5cbiAgICogQHJldHVybnMgT2JqZWN0IGNvbnRhaW5pbmcgZGVjcnlwdGVkIHBydiBhbmQgcHViLCBvciB1bmRlZmluZWQgZm9yIGNvbGQgd2FsbGV0c1xuICAgKi9cbiAgYXN5bmMgZ2V0RGVjcnlwdGVkS2V5Y2hhaW5Gb3JTaGFyaW5nKFxuICAgIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZyB8IHVuZGVmaW5lZFxuICApOiBQcm9taXNlPERlY3J5cHRlZEtleWNoYWluRGF0YSB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGtleWNoYWluID0gYXdhaXQgdGhpcy5nZXRFbmNyeXB0ZWRXYWxsZXRLZXljaGFpbkZvcldhbGxldFNoYXJpbmcoKTtcblxuICAgIGlmICgha2V5Y2hhaW4uZW5jcnlwdGVkUHJ2KSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmICghd2FsbGV0UGFzc3BocmFzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHdhbGxldFBhc3NwaHJhc2UgYXJndW1lbnQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcnYgPSBkZWNyeXB0S2V5Y2hhaW5Qcml2YXRlS2V5KHRoaXMuYml0Z28sIGtleWNoYWluLCB3YWxsZXRQYXNzcGhyYXNlKTtcbiAgICBpZiAoIXBydikge1xuICAgICAgdGhyb3cgbmV3IEluY29ycmVjdFBhc3N3b3JkRXJyb3IoJ1Bhc3N3b3JkIHNoYXJlZCBpcyBpbmNvcnJlY3QgZm9yIHRoaXMgd2FsbGV0Jyk7XG4gICAgfVxuXG4gICAgLy8gT25seSBvbmUgb2YgcHViL2NvbW1vblB1Yi9jb21tb25LZXljaGFpbiBzaG91bGQgYmUgcHJlc2VudCBpbiB0aGUga2V5Y2hhaW5cbiAgICBsZXQgcHViID0ga2V5Y2hhaW4ucHViID8/IGtleWNoYWluLmNvbW1vblB1YjtcbiAgICBpZiAoa2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pIHtcbiAgICAgIHB1YiA9XG4gICAgICAgIHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCkgPT09ICdlZGRzYSdcbiAgICAgICAgICA/IEVkZHNhVXRpbHMuZ2V0UHVibGljS2V5RnJvbUNvbW1vbktleWNoYWluKGtleWNoYWluLmNvbW1vbktleWNoYWluKVxuICAgICAgICAgIDogRWNkc2FVdGlscy5nZXRQdWJsaWNLZXlGcm9tQ29tbW9uS2V5Y2hhaW4oa2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pO1xuICAgIH1cblxuICAgIGlmICghcHViKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBkZXRlcm1pbmUgcHVibGljIGtleSBmcm9tIGtleWNoYWluJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgcHJ2LCBwdWIgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmNyeXB0cyBhIGRlY3J5cHRlZCBwcml2YXRlIGtleSBmb3Igc2hhcmluZyB3aXRoIGEgc3BlY2lmaWMgdXNlci5cbiAgICogVGhpcyBpcyB0aGUgcHVyZSBlbmNyeXB0aW9uIHN0ZXAgLSBubyBBUEkgY2FsbHMsIG5vIGRlY3J5cHRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBkZWNyeXB0ZWRQcnYgLSBUaGUgYWxyZWFkeS1kZWNyeXB0ZWQgcHJpdmF0ZSBrZXlcbiAgICogQHBhcmFtIHB1YiAtIFRoZSB3YWxsZXQncyBwdWJsaWMga2V5XG4gICAqIEBwYXJhbSB1c2VyUHVia2V5IC0gVGhlIHJlY2lwaWVudCB1c2VyJ3MgcHVibGljIGtleVxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBrZXkgcGF0aFxuICAgKiBAcmV0dXJucyBUaGUgZW5jcnlwdGVkIGtleWNoYWluIGZvciB0aGUgcmVjaXBpZW50IHdpdGggYWxsIHJlcXVpcmVkIGZpZWxkc1xuICAgKi9cbiAgZW5jcnlwdFBydkZvclVzZXIoZGVjcnlwdGVkUHJ2OiBzdHJpbmcsIHB1Yjogc3RyaW5nLCB1c2VyUHVia2V5OiBzdHJpbmcsIHBhdGg6IHN0cmluZyk6IEJ1bGtXYWxsZXRTaGFyZUtleWNoYWluIHtcbiAgICBjb25zdCBlY2tleSA9IG1ha2VSYW5kb21LZXkoKTtcbiAgICBjb25zdCBzZWNyZXQgPSBnZXRTaGFyZWRTZWNyZXQoZWNrZXksIEJ1ZmZlci5mcm9tKHVzZXJQdWJrZXksICdoZXgnKSkudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IG5ld0VuY3J5cHRlZFBydiA9IHRoaXMuYml0Z28uZW5jcnlwdCh7IHBhc3N3b3JkOiBzZWNyZXQsIGlucHV0OiBkZWNyeXB0ZWRQcnYgfSk7XG5cbiAgICBjb25zdCBrZXljaGFpbjogQnVsa1dhbGxldFNoYXJlS2V5Y2hhaW4gPSB7XG4gICAgICBwdWIsXG4gICAgICBlbmNyeXB0ZWRQcnY6IG5ld0VuY3J5cHRlZFBydixcbiAgICAgIGZyb21QdWJLZXk6IGVja2V5LnB1YmxpY0tleS50b1N0cmluZygnaGV4JyksXG4gICAgICB0b1B1YktleTogdXNlclB1YmtleSxcbiAgICAgIHBhdGg6IHBhdGgsXG4gICAgfTtcblxuICAgIGFzc2VydChrZXljaGFpbi5wdWIsICdwdWIgbXVzdCBiZSBkZWZpbmVkIGZvciBzaGFyaW5nJyk7XG4gICAgYXNzZXJ0KGtleWNoYWluLmVuY3J5cHRlZFBydiwgJ2VuY3J5cHRlZFBydiBtdXN0IGJlIGRlZmluZWQgZm9yIHNoYXJpbmcnKTtcbiAgICBhc3NlcnQoa2V5Y2hhaW4uZnJvbVB1YktleSwgJ2Zyb21QdWJLZXkgbXVzdCBiZSBkZWZpbmVkIGZvciBzaGFyaW5nJyk7XG4gICAgYXNzZXJ0KGtleWNoYWluLnRvUHViS2V5LCAndG9QdWJLZXkgbXVzdCBiZSBkZWZpbmVkIGZvciBzaGFyaW5nJyk7XG4gICAgYXNzZXJ0KGtleWNoYWluLnBhdGgsICdwYXRoIG11c3QgYmUgZGVmaW5lZCBmb3Igc2hhcmluZycpO1xuXG4gICAgcmV0dXJuIGtleWNoYWluO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmVzIGEga2V5Y2hhaW4gZm9yIHNoYXJpbmcgd2l0aCBhbm90aGVyIHVzZXIuXG4gICAqIEZldGNoZXMgdGhlIHdhbGxldCBrZXljaGFpbiwgZGVjcnlwdHMgaXQsIGFuZCBlbmNyeXB0cyBpdCBmb3IgdGhlIHJlY2lwaWVudC5cbiAgICpcbiAgICogQHBhcmFtIHdhbGxldFBhc3NwaHJhc2UgLSBUaGUgcGFzc3BocmFzZSB0byBkZWNyeXB0IHRoZSBrZXljaGFpblxuICAgKiBAcGFyYW0gcHVia2V5IC0gVGhlIHJlY2lwaWVudCdzIHB1YmxpYyBrZXlcbiAgICogQHBhcmFtIHBhdGggLSBUaGUga2V5IHBhdGhcbiAgICogQHJldHVybnMgVGhlIGVuY3J5cHRlZCBrZXljaGFpbiBmb3IgdGhlIHJlY2lwaWVudFxuICAgKi9cbiAgYXN5bmMgcHJlcGFyZVNoYXJlZEtleWNoYWluKFxuICAgIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwdWJrZXk6IHN0cmluZyxcbiAgICBwYXRoOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxTaGFyZWRLZXlDaGFpbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZWNyeXB0ZWRLZXljaGFpbiA9IGF3YWl0IHRoaXMuZ2V0RGVjcnlwdGVkS2V5Y2hhaW5Gb3JTaGFyaW5nKHdhbGxldFBhc3NwaHJhc2UpO1xuICAgICAgaWYgKCFkZWNyeXB0ZWRLZXljaGFpbikge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5lbmNyeXB0UHJ2Rm9yVXNlcihkZWNyeXB0ZWRLZXljaGFpbi5wcnYsIGRlY3J5cHRlZEtleWNoYWluLnB1YiwgcHVia2V5LCBwYXRoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIE1pc3NpbmdFbmNyeXB0ZWRLZXljaGFpbkVycm9yKSB7XG4gICAgICAgIC8vIGlnbm9yZSB0aGlzIGVycm9yIGJlY2F1c2UgdGhpcyBsb29rcyBsaWtlIGEgY29sZCB3YWxsZXRcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2hhcmUgdGhpcyB3YWxsZXQgd2l0aCBhbm90aGVyIEJpdEdvIHVzZXIuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBzaGFyZVdhbGxldChwYXJhbXM6IFNoYXJlV2FsbGV0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2VtYWlsJywgJ3Blcm1pc3Npb25zJ10sIFsnd2FsbGV0UGFzc3BocmFzZScsICdtZXNzYWdlJ10pO1xuICAgIGlmIChwYXJhbXMucmVzaGFyZSAhPT0gdW5kZWZpbmVkICYmICFfLmlzQm9vbGVhbihwYXJhbXMucmVzaGFyZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgcmVzaGFyZSB0byBiZSBhIGJvb2xlYW4uJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5za2lwS2V5Y2hhaW4gIT09IHVuZGVmaW5lZCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLnNraXBLZXljaGFpbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgc2tpcEtleWNoYWluIHRvIGJlIGEgYm9vbGVhbi4gJyk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIG11bHRpLWtleS11c2VyLWtleSBPRkMgd2FsbGV0XG4gICAgLy8gRm9yIG11bHRpLWtleS11c2VyLWtleSB3YWxsZXRzLCBza2lwIGtleWNoYWluIHByZXBhcmF0aW9uIHJlZ2FyZGxlc3Mgb2Ygb3RoZXIgY29uZGl0aW9uc1xuICAgIGNvbnN0IG5lZWRzS2V5Y2hhaW4gPVxuICAgICAgIXRoaXMuaXNNdWx0aVVzZXJLZXlXYWxsZXQoKSAmJlxuICAgICAgIXBhcmFtcy5za2lwS2V5Y2hhaW4gJiZcbiAgICAgIHBhcmFtcy5wZXJtaXNzaW9ucyAmJlxuICAgICAgcGFyYW1zLnBlcm1pc3Npb25zLmluZGV4T2YoJ3NwZW5kJykgIT09IC0xO1xuXG4gICAgaWYgKHBhcmFtcy5kaXNhYmxlRW1haWwgIT09IHVuZGVmaW5lZCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLmRpc2FibGVFbWFpbCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgZGlzYWJsZUVtYWlsIHRvIGJlIGEgYm9vbGVhbi4nKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLmVtYWlsKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHN0cmluZyBwYXJhbWV0ZXIgZW1haWwnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaGFyaW5nID0gKGF3YWl0IHRoaXMuYml0Z28uZ2V0U2hhcmluZ0tleSh7XG4gICAgICBlbWFpbDogcGFyYW1zLmVtYWlsLnRvTG93ZXJDYXNlKCksXG4gICAgfSkpIGFzIGFueTtcbiAgICBsZXQgc2hhcmVkS2V5Y2hhaW47XG4gICAgaWYgKG5lZWRzS2V5Y2hhaW4pIHtcbiAgICAgIHNoYXJlZEtleWNoYWluID0gYXdhaXQgdGhpcy5wcmVwYXJlU2hhcmVkS2V5Y2hhaW4ocGFyYW1zLndhbGxldFBhc3NwaHJhc2UsIHNoYXJpbmcucHVia2V5LCBzaGFyaW5nLnBhdGgpO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnM6IENyZWF0ZVNoYXJlT3B0aW9ucyA9IHtcbiAgICAgIHVzZXI6IHNoYXJpbmcudXNlcklkLFxuICAgICAgcGVybWlzc2lvbnM6IHBhcmFtcy5wZXJtaXNzaW9ucyxcbiAgICAgIHJlc2hhcmU6IHBhcmFtcy5yZXNoYXJlLFxuICAgICAgbWVzc2FnZTogcGFyYW1zLm1lc3NhZ2UsXG4gICAgICBkaXNhYmxlRW1haWw6IHBhcmFtcy5kaXNhYmxlRW1haWwsXG4gICAgICBza2lwS2V5Y2hhaW46IE9iamVjdC5rZXlzKHNoYXJlZEtleWNoYWluID8/IHt9KS5sZW5ndGggPT09IDAsXG4gICAgICBrZXljaGFpbjogT2JqZWN0LmtleXMoc2hhcmVkS2V5Y2hhaW4gPz8ge30pLmxlbmd0aCA9PT0gMCA/IHVuZGVmaW5lZCA6IHNoYXJlZEtleWNoYWluLFxuICAgIH07XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jcmVhdGVTaGFyZShvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdXNlciBmcm9tIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIC0gdXNlcklkIElkIG9mIHRoZSB1c2VyIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlVXNlcihwYXJhbXM6IFJlbW92ZVVzZXJPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndXNlcklkJ10sIFtdKTtcblxuICAgIGNvbnN0IHVzZXJJZCA9IHBhcmFtcy51c2VySWQ7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZGVsKHRoaXMudXJsKCcvdXNlci8nICsgdXNlcklkKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggYSB0cmFuc2FjdGlvbiBwcmVidWlsZCAodW5zaWduZWQgdHJhbnNhY3Rpb24pIGZyb20gQml0R29cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtc1xuICAgKiBAcGFyYW0ge3thZGRyZXNzOiBzdHJpbmcsIGFtb3VudDogc3RyaW5nfX0gcGFyYW1zLnJlY2lwaWVudHMgLSBsaXN0IG9mIHJlY2lwaWVudHMgYW5kIG5lY2Vzc2FyeSByZWNpcGllbnQgaW5mb3JtYXRpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5udW1CbG9ja3MgLSBFc3RpbWF0ZXMgdGhlIGFwcHJveGltYXRlIGZlZSBwZXIga2lsb2J5dGUgbmVjZXNzYXJ5IGZvciBhIHRyYW5zYWN0aW9uIGNvbmZpcm1hdGlvbiB3aXRoaW4gbnVtQmxvY2tzIGJsb2Nrc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVJhdGUgLSB0aGUgZGVzaXJlZCBmZWVSYXRlIGZvciB0aGUgdHJhbnNhY3Rpb24gaW4gYmFzZSB1bml0cy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVJhdGUgLSB1cHBlciBsaW1pdCBmb3IgZmVlUmF0ZSBpbiBiYXNlIHVuaXRzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluQ29uZmlybXMgLSBNaW5pbXVtIG51bWJlciBvZiBjb25maXJtYXRpb25zIHVuc3BlbnRzIGdvaW5nIGludG8gdGhpcyB0cmFuc2FjdGlvbiBzaG91bGQgaGF2ZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5lbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UgLSBFbmZvcmNlIG1pbmltdW0gbnVtYmVyIG9mIGNvbmZpcm1hdGlvbnMgb24gY2hhbmdlIChpbnRlcm5hbCkgaW5wdXRzLlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLnRhcmdldFdhbGxldFVuc3BlbnRzIC0gVGhlIGRlc2lyZWQgY291bnQgb2YgdW5zcGVudHMgaW4gdGhlIHdhbGxldC4gSWYgdGhlIHdhbGxldOKAmXMgY3VycmVudCB1bnNwZW50IGNvdW50IGlzIGxvd2VyIHRoYW4gdGhlIHRhcmdldCwgdXAgdG8gZm91ciBhZGRpdGlvbmFsIGNoYW5nZSBvdXRwdXRzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1pblZhbHVlIC0gSWdub3JlIHVuc3BlbnRzIHNtYWxsZXIgdGhhbiB0aGlzIGFtb3VudCBvZiBiYXNlIHVuaXRzXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWF4VmFsdWUgLSBJZ25vcmUgdW5zcGVudHMgbGFyZ2VyIHRoYW4gdGhpcyBhbW91bnQgb2YgYmFzZSB1bml0c1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLnNlcXVlbmNlSWQgLSBUaGUgc2VxdWVuY2UgSUQgb2YgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubGFzdExlZGdlclNlcXVlbmNlIC0gQWJzb2x1dGUgbWF4IGxlZGdlciB0aGUgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIGFjY2VwdGVkIGluLCB3aGVyZWFmdGVyIGl0IHdpbGwgYmUgcmVqZWN0ZWQuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubGVkZ2VyU2VxdWVuY2VEZWx0YSAtIFJlbGF0aXZlIGxlZGdlciBoZWlnaHQgKGluIHJlbGF0aW9uIHRvIHRoZSBjdXJyZW50IGxlZGdlcikgdGhhdCB0aGUgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIGFjY2VwdGVkIGluLCB3aGVyZWFmdGVyIGl0IHdpbGwgYmUgcmVqZWN0ZWQuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZ2FzUHJpY2UgLSBDdXN0b20gZ2FzIHByaWNlIHRvIGJlIHVzZWQgZm9yIHNlbmRpbmcgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZ2FzTGltaXQgLSBDdXN0b20gZ2FzIGxpbWl0IHRvIGJlIHVzZWQgZm9yIHNlbmRpbmcgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLm5vU3BsaXRDaGFuZ2UgLSBTZXQgdG8gdHJ1ZSB0byBkaXNhYmxlIGF1dG9tYXRpYyBjaGFuZ2Ugc3BsaXR0aW5nIGZvciBwdXJwb3NlcyBvZiB1bnNwZW50IG1hbmFnZW1lbnRcbiAgICogQHBhcmFtIHtBcnJheX0gcGFyYW1zLnVuc3BlbnRzIC0gVGhlIHVuc3BlbnRzIHRvIHVzZSBpbiB0aGUgdHJhbnNhY3Rpb24uIEVhY2ggdW5zcGVudCBzaG91bGQgYmUgaW4gdGhlIGZvcm0gcHJldlR4SWQ6bk91dHB1dFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmNoYW5nZUFkZHJlc3MgLSBTcGVjaWZpZXMgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBjaGFuZ2Ugb3V0cHV0XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLm5vblBhcnRpY2lwYXRpb24gLSAoQWxnb3JhbmQpIE5vbiBwYXJ0aWNpcGF0aW5nIGtleSByZWcgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy52YWxpZEZyb21CbG9jayAtIChBbGdvcmFuZCkgVGhlIG1pbmltdW0gcm91bmQgdGhpcyB3aWxsIHJ1biBvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLnZhbGlkVG9CbG9jayAtIChBbGdvcmFuZCkgVGhlIG1heGltdW0gcm91bmQgdGhpcyB3aWxsIHJ1biBvblxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5pbnN0YW50IC0gQnVpbGQgdGhpcyB0cmFuc2FjdGlvbiB0byBjb25mb3JtIHdpdGggaW5zdGFudCBzZW5kaW5nIGNvaW4tc3BlY2lmaWMgbWV0aG9kIChpZiBhdmFpbGFibGUpXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmtlZXBBbGl2ZSAtIChQb2xrYWRvdCkga2VlcCBhZGRyZXNzIGFsaXZlIGJ5IHNlbmRpbmcgdGhlIGFkZHJlc3MgbWluaW11bSBmdW5kaW5nIGFtb3VudCwgdXNlZCBkdXJpbmcgd2FsbGV0IGNvbnNvbGlkYXRpb24sIHRydWUgYnkgZGVmYXVsdFxuICAgKiBAcGFyYW0ge3t2YWx1ZTogU3RyaW5nLCB0eXBlOiBTdHJpbmd9fSBwYXJhbXMubWVtbyAtIE1lbW8gdG8gdXNlIGluIHRyYW5zYWN0aW9uIChzdXBwb3J0ZWQgYnkgU3RlbGxhcilcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtLnRyYW5zZmVySWQgLSB0cmFuc2ZlciBJZCB0byB1c2UgaW4gdHJhbnNhY3Rpb24gKHN1cHBvcnRlZCBieSBjYXNwZXIpXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuYWRkcmVzc1R5cGUgLSBUaGUgdHlwZSBvZiBhZGRyZXNzIHRvIGNyZWF0ZSBmb3IgY2hhbmdlLiBPbmUgb2YgYHAyc2hgLCBgcDJzaFAyd3NoYCwgYW5kIGBwMndzaGAuIENhc2Utc2Vuc2l0aXZlLlxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5ob3AgLSBCdWlsZCB0aGlzIGFzIGFuIEV0aGVyZXVtIGhvcCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zLnJlc2VydmF0aW9uIC0gT2JqZWN0IHRvIHJlc2VydmUgdGhlIHVuc3BlbnRzIHRoYXQgdGhpcyB0eCBidWlsZCB1c2VzLiBGb3JtYXQgaXMgcmVzZXJ2YXRpb24gPSB7IGV4cGlyZVRpbWU6IElTT0RhdGVTdHJpbmcsIHBlbmRpbmdBcHByb3ZhbElkOiBTdHJpbmcgfVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgVGhlIHBhc3NwaHJhc2UgdG8gdGhlIHdhbGxldCB1c2VyIGtleSwgdG8gc2lnbiBjb21taXRtZW50IGRhdGEgZm9yIEV0aGVyZXVtIGhvcCB0cmFuc2FjdGlvbnNcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy53YWxsZXRDb250cmFjdEFkZHJlc3MgLSBUaGUgY29udHJhY3QgYWRkcmVzcyB1c2VkIGFzIHRoZSBcInRvXCIgZmllbGQgb2YgYSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHByZWJ1aWxkVHJhbnNhY3Rpb24ocGFyYW1zOiBQcmVidWlsZFRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0PiB7XG4gICAgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcmVidWlsZFRyYW5zYWN0aW9uVHhSZXF1ZXN0cyhwYXJhbXMpO1xuICAgIH1cblxuICAgIC8vIFdoaXRlbGlzdCBwYXJhbXMgdG8gYnVpbGQgdHhcbiAgICBjb25zdCB3aGl0ZWxpc3RlZFBhcmFtcyA9IHRoaXMuYmFzZUNvaW4ucHJlcHJvY2Vzc0J1aWxkUGFyYW1zKF8ucGljayhwYXJhbXMsIHRoaXMucHJlYnVpbGRXaGl0ZWxpc3RlZFBhcmFtcygpKSk7XG4gICAgZGVidWcoJ3ByZWJ1aWxkaW5nIHRyYW5zYWN0aW9uOiAlTycsIHdoaXRlbGlzdGVkUGFyYW1zKTtcblxuICAgIGlmIChwYXJhbXMucmVxSWQpIHtcbiAgICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQpO1xuICAgIH1cbiAgICBjb25zdCBleHRyYVBhcmFtcyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4uZ2V0RXh0cmFQcmVidWlsZFBhcmFtcyhPYmplY3QuYXNzaWduKHBhcmFtcywgeyB3YWxsZXQ6IHRoaXMgfSkpO1xuICAgIE9iamVjdC5hc3NpZ24od2hpdGVsaXN0ZWRQYXJhbXMsIGV4dHJhUGFyYW1zKTtcbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHtcbiAgICAgIG9mZmxpbmVWZXJpZmljYXRpb246IHBhcmFtcy5vZmZsaW5lVmVyaWZpY2F0aW9uID8gdHJ1ZSA6IHVuZGVmaW5lZCxcbiAgICB9O1xuXG4gICAgY29uc3QgYnVpbGRRdWVyeSA9IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLmlkKCkgKyAnL3R4L2J1aWxkJykpXG4gICAgICAucXVlcnkocXVlcnlQYXJhbXMpXG4gICAgICAuc2VuZCh3aGl0ZWxpc3RlZFBhcmFtcylcbiAgICAgIC5yZXN1bHQoKTtcblxuICAgIGNvbnN0IGJsb2NrSGVpZ2h0UXVlcnkgPSBfLmlzRnVuY3Rpb24oKHRoaXMuYmFzZUNvaW4gYXMgYW55KS5nZXRMYXRlc3RCbG9ja0hlaWdodClcbiAgICAgID8gKHRoaXMuYmFzZUNvaW4gYXMgYW55KS5nZXRMYXRlc3RCbG9ja0hlaWdodChwYXJhbXMucmVxSWQpXG4gICAgICA6IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgIGNvbnN0IHF1ZXJpZXMgPSBbYnVpbGRRdWVyeSwgYmxvY2tIZWlnaHRRdWVyeV07XG4gICAgY29uc3QgW2J1aWxkUmVzcG9uc2UsIGJsb2NrSGVpZ2h0XSA9IChhd2FpdCBQcm9taXNlLmFsbChxdWVyaWVzKSkgYXMgYW55O1xuICAgIGRlYnVnKCdwb3N0cHJvY2Vzc2luZyB0cmFuc2FjdGlvbiBwcmVidWlsZDogJU8nLCBidWlsZFJlc3BvbnNlKTtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoYmxvY2tIZWlnaHQpKSB7XG4gICAgICBidWlsZFJlc3BvbnNlLmJsb2NrSGVpZ2h0ID0gYmxvY2tIZWlnaHQ7XG4gICAgfVxuICAgIGxldCBwcmVidWlsZDogVHJhbnNhY3Rpb25QcmVidWlsZCA9IChhd2FpdCB0aGlzLmJhc2VDb2luLnBvc3RQcm9jZXNzUHJlYnVpbGQoXG4gICAgICBPYmplY3QuYXNzaWduKGJ1aWxkUmVzcG9uc2UsIHtcbiAgICAgICAgd2FsbGV0OiB0aGlzLFxuICAgICAgICBidWlsZFBhcmFtczogd2hpdGVsaXN0ZWRQYXJhbXMsXG4gICAgICB9KVxuICAgICkpIGFzIGFueTtcbiAgICBkZWxldGUgcHJlYnVpbGQud2FsbGV0O1xuICAgIGRlbGV0ZSBwcmVidWlsZC5idWlsZFBhcmFtcztcbiAgICBwcmVidWlsZCA9IF8uZXh0ZW5kKHt9LCBwcmVidWlsZCwgeyB3YWxsZXRJZDogdGhpcy5pZCgpIH0pO1xuICAgIGlmICh0aGlzLl93YWxsZXQgJiYgdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYyAmJiAhcGFyYW1zLndhbGxldENvbnRyYWN0QWRkcmVzcykge1xuICAgICAgcHJlYnVpbGQgPSBfLmV4dGVuZCh7fSwgcHJlYnVpbGQsIHtcbiAgICAgICAgd2FsbGV0Q29udHJhY3RBZGRyZXNzOiB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljLmJhc2VBZGRyZXNzLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHByZWJ1aWxkID0gXy5leHRlbmQoe30sIHByZWJ1aWxkLCB7IHJlcUlkOiBwYXJhbXMucmVxSWQgfSk7XG4gICAgZGVidWcoJ2ZpbmFsIHRyYW5zYWN0aW9uIHByZWJ1aWxkOiAlTycsIHByZWJ1aWxkKTtcbiAgICByZXR1cm4gcHJlYnVpbGQgYXMgUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBVc2VyIEtleWNoYWluIGFuZCBzaWduIGEgVFNTIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB0eFJlcXVlc3RJZCBUaGUgdHJhbnNhY3Rpb24gcmVxdWVzdCBpZFxuICAgKiBAcGFyYW0gd2FsbGV0UGFzc3BocmFzZSBUaGUgd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogQHJldHVybiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPlxuICAgKi9cbiAgYXN5bmMgZ2V0VXNlcktleUFuZFNpZ25Uc3NUcmFuc2FjdGlvbih7XG4gICAgdHhSZXF1ZXN0SWQsXG4gICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgfToge1xuICAgIHR4UmVxdWVzdElkOiBzdHJpbmc7XG4gICAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbj4ge1xuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlICE9PSAndHNzJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdnZXRVc2VyS2V5QW5kU2lnblRzc1RyYW5zYWN0aW9uIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBUU1Mgd2FsbGV0cycpO1xuICAgIH1cbiAgICBjb25zdCByZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgLy8gRG9pbmcgYSBzYW5pdHkgY2hlY2sgZm9yIHBhc3N3b3JkIGhlcmUgdG8gYXZvaWQgZG9pbmcgZnVydGhlciB3b3JrIGlmIHdlIGtub3cgaXQncyB3cm9uZ1xuICAgIGNvbnN0IGtleWNoYWlucyA9IGF3YWl0IHRoaXMuZ2V0S2V5Y2hhaW5zQW5kVmFsaWRhdGVQYXNzcGhyYXNlKHtcbiAgICAgIHJlcUlkLFxuICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICB9KTtcbiAgICBjb25zdCB1c2VyS2V5Y2hhaW4gPSBrZXljaGFpbnNbMF07XG4gICAgaWYgKCF1c2VyS2V5Y2hhaW4gfHwgIXVzZXJLZXljaGFpbi5lbmNyeXB0ZWRQcnYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndGhlIHVzZXIga2V5Y2hhaW4gZG9lcyBub3QgaGF2ZSBwcm9wZXJ0eSBlbmNyeXB0ZWRQcnYnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zaWduVHJhbnNhY3Rpb24oe1xuICAgICAgdHhQcmVidWlsZDogeyB0eFJlcXVlc3RJZCB9LFxuICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIHJlcUlkLFxuICAgICAga2V5Y2hhaW46IHVzZXJLZXljaGFpbixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIGEgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAtIHR4UHJlYnVpbGRcbiAgICogLSBba2V5Y2hhaW4gLyBrZXldIChvYmplY3QpIG9yIHBydiAoc3RyaW5nKVxuICAgKiAtIHdhbGxldFBhc3NwaHJhc2VcbiAgICogLSB2ZXJpZnlUeFBhcmFtcyAob3B0aW9uYWwpIC0gd2hlbiBwcm92aWRlZCwgdGhlIHRyYW5zYWN0aW9uIHdpbGwgYmUgdmVyaWZpZWQgYmVmb3JlIHNpZ25pbmdcbiAgICogICAtIHR4UGFyYW1zOiB0cmFuc2FjdGlvbiBwYXJhbWV0ZXJzIHVzZWQgZm9yIHZlcmlmaWNhdGlvblxuICAgKiAgIC0gdmVyaWZpY2F0aW9uOiBvcHRpb25hbCB2ZXJpZmljYXRpb24gb3B0aW9uc1xuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgYXN5bmMgc2lnblRyYW5zYWN0aW9uKHBhcmFtczogV2FsbGV0U2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbiB8IFR4UmVxdWVzdD4ge1xuICAgIGNvbnN0IHsgdHhQcmVidWlsZCwgYXBpVmVyc2lvbiwgdHhSZXF1ZXN0SWQgfSA9IHBhcmFtcztcblxuICAgIGlmIChcbiAgICAgIF8uaXNGdW5jdGlvbihwYXJhbXMuY3VzdG9tQ29tbWl0bWVudEdlbmVyYXRpbmdGdW5jdGlvbikgJiZcbiAgICAgIF8uaXNGdW5jdGlvbihwYXJhbXMuY3VzdG9tR1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uKSAmJlxuICAgICAgXy5pc0Z1bmN0aW9uKHBhcmFtcy5jdXN0b21SU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24pXG4gICAgKSB7XG4gICAgICAvLyBpbnZva2UgZXh0ZXJuYWwgc2lnbmVyIFRTUyBmb3IgRWREU0Egd29ya2Zsb3dcbiAgICAgIHJldHVybiB0aGlzLnNpZ25UcmFuc2FjdGlvblRzc0V4dGVybmFsU2lnbmVyRWREU0EocGFyYW1zLCB0aGlzLmJhc2VDb2luKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBfLmlzRnVuY3Rpb24ocGFyYW1zLmN1c3RvbVBhaWxsaWVyTW9kdWx1c0dlbmVyYXRpbmdGdW5jdGlvbikgJiZcbiAgICAgIF8uaXNGdW5jdGlvbihwYXJhbXMuY3VzdG9tS1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uKSAmJlxuICAgICAgXy5pc0Z1bmN0aW9uKHBhcmFtcy5jdXN0b21NdURlbHRhU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24pICYmXG4gICAgICBfLmlzRnVuY3Rpb24ocGFyYW1zLmN1c3RvbVNTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbilcbiAgICApIHtcbiAgICAgIC8vIGludm9rZSBleHRlcm5hbCBzaWduZXIgVFNTIGZvciBFQ0RTQSB3b3JrZmxvd1xuICAgICAgcmV0dXJuIHRoaXMuc2lnblRyYW5zYWN0aW9uVHNzRXh0ZXJuYWxTaWduZXJFQ0RTQSh0aGlzLmJhc2VDb2luLCBwYXJhbXMpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIF8uaXNGdW5jdGlvbihwYXJhbXMuY3VzdG9tTVBDdjJTaWduaW5nUm91bmQxR2VuZXJhdGlvbkZ1bmN0aW9uKSAmJlxuICAgICAgXy5pc0Z1bmN0aW9uKHBhcmFtcy5jdXN0b21NUEN2MlNpZ25pbmdSb3VuZDJHZW5lcmF0aW9uRnVuY3Rpb24pICYmXG4gICAgICBfLmlzRnVuY3Rpb24ocGFyYW1zLmN1c3RvbU1QQ3YyU2lnbmluZ1JvdW5kM0dlbmVyYXRpb25GdW5jdGlvbilcbiAgICApIHtcbiAgICAgIC8vIGludm9rZSBleHRlcm5hbCBzaWduZXIgVFNTIGZvciBFQ0RTQSBNUEN2MndvcmtmbG93XG4gICAgICByZXR1cm4gdGhpcy5zaWduVHJhbnNhY3Rpb25Uc3NFeHRlcm5hbFNpZ25lckVDRFNBTVBDdjIodGhpcy5iYXNlQ29pbiwgcGFyYW1zKTtcbiAgICB9XG5cbiAgICBpZiAoIXR4UHJlYnVpbGQgfHwgdHlwZW9mIHR4UHJlYnVpbGQgIT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAodGhpcy5tdWx0aXNpZ1R5cGUoKSA9PT0gJ29uY2hhaW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndHhQcmVidWlsZCBpcyByZXF1aXJlZCBmb3Igb24tY2hhaW4gbXVsdGlzaWcgd2FsbGV0cycpO1xuICAgICAgfVxuICAgICAgaWYgKCF0eFJlcXVlc3RJZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R4UHJlYnVpbGQgb3IgdHhSZXF1ZXN0SWQgaXMgcmVxdWlyZWQgZm9yIFRTUyB3YWxsZXRzJyk7XG4gICAgICB9XG4gICAgICAvLyBXZSBvbmx5IGRvIHRoaXMgaWYgd2UncmUgbm90IHVzaW5nIHRoZSBleHRlcm5hbCBzaWduZXIgVFNTIGZsb3dcbiAgICAgIHBhcmFtcy50eFByZWJ1aWxkID0geyB0eFJlcXVlc3RJZCB9O1xuICAgIH1cblxuICAgIC8vIFZlcmlmeSB0cmFuc2FjdGlvbiBpZiB2ZXJpZnlUeFBhcmFtcyBpcyBwcm92aWRlZFxuICAgIGlmIChwYXJhbXMudmVyaWZ5VHhQYXJhbXMgJiYgdHhQcmVidWlsZD8udHhIZXgpIHtcbiAgICAgIGNvbnN0IHZlcmlmeVBhcmFtcyA9IHtcbiAgICAgICAgdHhQcmVidWlsZDogeyAuLi50eFByZWJ1aWxkIH0sXG4gICAgICAgIHR4UGFyYW1zOiBwYXJhbXMudmVyaWZ5VHhQYXJhbXMudHhQYXJhbXMsXG4gICAgICAgIHdhbGxldDogdGhpcyBhcyBJV2FsbGV0LFxuICAgICAgICB2ZXJpZmljYXRpb246IHBhcmFtcy52ZXJpZnlUeFBhcmFtcy52ZXJpZmljYXRpb24sXG4gICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgICAgIHdhbGxldFR5cGU6IHRoaXMubXVsdGlzaWdUeXBlKCkgYXMgJ29uY2hhaW4nIHwgJ3RzcycsXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCB0aGlzLmJhc2VDb2luLnZlcmlmeVRyYW5zYWN0aW9uKHZlcmlmeVBhcmFtcyk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgJiZcbiAgICAgICEocGFyYW1zLmtleWNoYWluIHx8IHBhcmFtcy5rZXkpICYmXG4gICAgICAodGhpcy50eXBlKCkgPT09ICdob3QnIHx8IHRoaXMudHlwZSgpID09PSB1bmRlZmluZWQpXG4gICAgKSB7XG4gICAgICAvLyB0aGlzIGxvZ2ljIHNob3VsZCBvbmx5IGFwcGx5IHRvIGhvdCB3YWxsZXRzXG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLndhbGxldFBhc3NwaHJhc2UpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignd2FsbGV0UGFzc3BocmFzZSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCB0aGlzLmdldEtleWNoYWluc0FuZFZhbGlkYXRlUGFzc3BocmFzZSh7XG4gICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgfSk7XG4gICAgICBjb25zdCB1c2VyS2V5Y2hhaW4gPSBrZXljaGFpbnNbMF07XG4gICAgICBpZiAoIXVzZXJLZXljaGFpbiB8fCAhdXNlcktleWNoYWluLmVuY3J5cHRlZFBydikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RoZSB1c2VyIGtleWNoYWluIGRvZXMgbm90IGhhdmUgcHJvcGVydHkgZW5jcnlwdGVkUHJ2Jyk7XG4gICAgICB9XG4gICAgICBwYXJhbXMua2V5Y2hhaW4gPSB1c2VyS2V5Y2hhaW47XG4gICAgfVxuXG4gICAgY29uc3QgcHJlc2lnbiA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ucHJlc2lnblRyYW5zYWN0aW9uKHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHdhbGxldERhdGE6IHRoaXMuX3dhbGxldCxcbiAgICAgIHRzc1V0aWxzOiB0aGlzLnRzc1V0aWxzLFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMubXVsdGlzaWdUeXBlKCkgPT09ICd0c3MnKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaWduVHJhbnNhY3Rpb25Uc3Moe1xuICAgICAgICAuLi5wcmVzaWduLFxuICAgICAgICBwcnY6IHRoaXMuZ2V0VXNlclBydihwcmVzaWduIGFzIEdldFVzZXJQcnZPcHRpb25zKSxcbiAgICAgICAgYXBpVmVyc2lvbixcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGxldCB7IHB1YnMgfSA9IHBhcmFtcztcbiAgICBpZiAoIXB1YnMgJiYgdGhpcy5iYXNlQ29pbi5rZXlJZHNGb3JTaWduaW5nKCkubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3Qga2V5Y2hhaW5zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXRLZXlzRm9yU2lnbmluZyh7IHdhbGxldDogdGhpcyB9KTtcbiAgICAgIHB1YnMgPSBrZXljaGFpbnMubWFwKChrKSA9PiB7XG4gICAgICAgIGFzc2VydChrLnB1Yik7XG4gICAgICAgIHJldHVybiBrLnB1YjtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHNpZ25UcmFuc2FjdGlvblBhcmFtcyA9IHtcbiAgICAgIC4uLnByZXNpZ24sXG4gICAgICB0eFByZWJ1aWxkOiB7IC4uLnR4UHJlYnVpbGQsIHdhbGxldElkOiB0aGlzLmlkKCkgfSxcbiAgICAgIHB1YnMsXG4gICAgICBjb2luOiB0aGlzLmJhc2VDb2luLFxuICAgIH07XG5cbiAgICBpZiAoXy5pc0Z1bmN0aW9uKHBhcmFtcy5jdXN0b21TaWduaW5nRnVuY3Rpb24pKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuYmFzZUNvaW4uc2lnbldpdGhDdXN0b21TaWduaW5nRnVuY3Rpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgYXNzZXJ0KHB1YnMsICdwdWJzIGFyZSByZXF1aXJlZCBmb3IgY3VzdG9tIHNpZ25pbmcnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmFzZUNvaW4uc2lnbldpdGhDdXN0b21TaWduaW5nRnVuY3Rpb24ocGFyYW1zLmN1c3RvbVNpZ25pbmdGdW5jdGlvbiwge1xuICAgICAgICAgIC4uLnNpZ25UcmFuc2FjdGlvblBhcmFtcyxcbiAgICAgICAgICBwdWJzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGtleXMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmdldEtleXNGb3JTaWduaW5nKHsgd2FsbGV0OiB0aGlzIH0pO1xuICAgICAgY29uc3Qgc2lnblRyYW5zYWN0aW9uUGFyYW1zV2l0aFNlZWQgPSB7XG4gICAgICAgIC4uLnNpZ25UcmFuc2FjdGlvblBhcmFtcyxcbiAgICAgICAgZGVyaXZhdGlvblNlZWQ6IGtleXNbMF0/LmRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWQsXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHBhcmFtcy5jdXN0b21TaWduaW5nRnVuY3Rpb24oc2lnblRyYW5zYWN0aW9uUGFyYW1zV2l0aFNlZWQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5iYXNlQ29pbi5zaWduVHJhbnNhY3Rpb24oe1xuICAgICAgLi4uc2lnblRyYW5zYWN0aW9uUGFyYW1zLFxuICAgICAgcHJ2OiB0aGlzLmdldFVzZXJQcnYocHJlc2lnbiBhcyBHZXRVc2VyUHJ2T3B0aW9ucyksXG4gICAgICB3YWxsZXQ6IHRoaXMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbiBhIHR5cGVkIHN0cnVjdHVyZWQgZGF0YSB1c2luZyBUU1NcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgc2lnblR5cGVkRGF0YShwYXJhbXM6IFdhbGxldFNpZ25UeXBlZERhdGFPcHRpb25zKTogUHJvbWlzZTxTaWduZWRNZXNzYWdlPiB7XG4gICAgaWYgKCF0aGlzLmJhc2VDb2luLnN1cHBvcnRzU2lnbmluZ1R5cGVkRGF0YSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNpZ24gdHlwZWQgZGF0YSBub3Qgc3VwcG9ydGVkIGZvciAke3RoaXMuYmFzZUNvaW4uZ2V0RnVsbE5hbWUoKX1gKTtcbiAgICB9XG4gICAgaWYgKCFwYXJhbXMudHlwZWREYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFR5cGVkIGRhdGEgcmVxdWlyZWRgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgIT09ICd0c3MnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lc3NhZ2Ugc2lnbmluZyBvbmx5IHN1cHBvcnRlZCBmb3IgVFNTIHdhbGxldHMnKTtcbiAgICB9XG4gICAgaWYgKF8uaXNGdW5jdGlvbihwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YVJhdykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndHlwZWREYXRhLnR5cGVkRGF0YVJhdyBtdXN0IGJlIEpTT04gc3RyaW5nJyk7XG4gICAgfVxuICAgIGlmIChfLmlzRnVuY3Rpb24oKHRoaXMuYmFzZUNvaW4gYXMgYW55KS5lbmNvZGVUeXBlZERhdGEpKSB7XG4gICAgICBwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YUVuY29kZWQgPSAodGhpcy5iYXNlQ29pbiBhcyBhbnkpLmVuY29kZVR5cGVkRGF0YShwYXJhbXMudHlwZWREYXRhKTtcbiAgICB9XG4gICAgY29uc3Qga2V5Y2hhaW5zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXRLZXlzRm9yU2lnbmluZyh7IHdhbGxldDogdGhpcywgcmVxSWQ6IHBhcmFtcy5yZXFJZCB9KTtcbiAgICBjb25zdCB1c2VyUHJ2T3B0aW9uczogR2V0VXNlclBydk9wdGlvbnMgPSB7XG4gICAgICAuLi5wYXJhbXMsXG4gICAgICBrZXljaGFpbjoga2V5Y2hhaW5zWzBdLFxuICAgIH07XG4gICAgYXNzZXJ0KGtleWNoYWluc1swXS5jb21tb25LZXljaGFpbiwgJ1VuYWJsZSB0byBmaW5kIGNvbW1vbktleWNoYWluIGluIGtleWNoYWlucycpO1xuICAgIGNvbnN0IHByZXNpZ24gPSB7XG4gICAgICAuLi5wYXJhbXMsXG4gICAgICB3YWxsZXREYXRhOiB0aGlzLl93YWxsZXQsXG4gICAgICB0c3NVdGlsczogdGhpcy50c3NVdGlscyxcbiAgICAgIHBydjogdGhpcy5nZXRVc2VyUHJ2KHVzZXJQcnZPcHRpb25zKSxcbiAgICAgIGtleWNoYWluOiBrZXljaGFpbnNbMF0sXG4gICAgICBiYWNrdXBLZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDEgPyBrZXljaGFpbnNbMV0gOiBudWxsLFxuICAgICAgYml0Z29LZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDIgPyBrZXljaGFpbnNbMl0gOiBudWxsLFxuICAgICAgcHViOiBrZXljaGFpbnMubWFwKChrKSA9PiBrLnB1YiksXG4gICAgICByZXFJZDogcGFyYW1zLnJlcUlkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuc2lnblR5cGVkRGF0YVRzcyhwcmVzaWduKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAgU2lnbiBhIG1lc3NhZ2UgdXNpbmcgVFNTXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogLSBNZXNzYWdlXG4gICAqIC0gY3VzdG9kaWFuTWVzc2FnZUlkXG4gICAqL1xuICBhc3luYyBzaWduTWVzc2FnZShwYXJhbXM6IFdhbGxldFNpZ25NZXNzYWdlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxTaWduZWRNZXNzYWdlPiB7XG4gICAgaWYgKCF0aGlzLmJhc2VDb2luLnN1cHBvcnRzTWVzc2FnZVNpZ25pbmcoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNZXNzYWdlIHNpZ25pbmcgbm90IHN1cHBvcnRlZCBmb3IgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9YCk7XG4gICAgfVxuICAgIGlmICghcGFyYW1zLm1lc3NhZ2UgfHwgIXBhcmFtcy5tZXNzYWdlLm1lc3NhZ2VTdGFuZGFyZFR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWVzc2FnZSBhbmQgdHlwZSByZXF1aXJlZCB0byBzaWduIG1lc3NhZ2UnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgIT09ICd0c3MnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lc3NhZ2Ugc2lnbmluZyBvbmx5IHN1cHBvcnRlZCBmb3IgVFNTIHdhbGxldHMnKTtcbiAgICB9XG4gICAgaWYgKF8uaXNGdW5jdGlvbigodGhpcy5iYXNlQ29pbiBhcyBhbnkpLmVuY29kZU1lc3NhZ2UpKSB7XG4gICAgICBwYXJhbXMubWVzc2FnZS5tZXNzYWdlRW5jb2RlZCA9ICh0aGlzLmJhc2VDb2luIGFzIGFueSkuZW5jb2RlTWVzc2FnZShwYXJhbXMubWVzc2FnZS5tZXNzYWdlUmF3KTtcbiAgICB9XG4gICAgY29uc3Qga2V5Y2hhaW5zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXRLZXlzRm9yU2lnbmluZyh7IHdhbGxldDogdGhpcywgcmVxSWQ6IHBhcmFtcy5yZXFJZCB9KTtcbiAgICBjb25zdCB1c2VyUHJ2T3B0aW9uczogR2V0VXNlclBydk9wdGlvbnMgPSB7XG4gICAgICAuLi5wYXJhbXMsXG4gICAgICBrZXljaGFpbjoga2V5Y2hhaW5zWzBdLFxuICAgIH07XG4gICAgYXNzZXJ0KGtleWNoYWluc1swXS5jb21tb25LZXljaGFpbiwgJ1VuYWJsZSB0byBmaW5kIGNvbW1vbktleWNoYWluIGluIGtleWNoYWlucycpO1xuICAgIGNvbnN0IHByZXNpZ24gPSB7XG4gICAgICAuLi5wYXJhbXMsXG4gICAgICB3YWxsZXREYXRhOiB0aGlzLl93YWxsZXQsXG4gICAgICB0c3NVdGlsczogdGhpcy50c3NVdGlscyxcbiAgICAgIHBydjogdGhpcy5nZXRVc2VyUHJ2KHVzZXJQcnZPcHRpb25zKSxcbiAgICAgIGtleWNoYWluOiBrZXljaGFpbnNbMF0sXG4gICAgICBiYWNrdXBLZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDEgPyBrZXljaGFpbnNbMV0gOiBudWxsLFxuICAgICAgYml0Z29LZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDIgPyBrZXljaGFpbnNbMl0gOiBudWxsLFxuICAgICAgcmVxSWQ6IHBhcmFtcy5yZXFJZCxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLnNpZ25NZXNzYWdlVHNzKHByZXNpZ24pO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmVzIGFuZCBjcmVhdGVzIGEgc2lnbiBtZXNzYWdlIHJlcXVlc3QgZm9yIFRTUyB3YWxsZXRzLCB0aGF0IGNhbiBiZSB1c2VkIGxhdGVyIGZvciBzaWduaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gUGFyYW1ldGVycyBmb3IgY3JlYXRpbmcgdGhlIHNpZ24gbWVzc2FnZSByZXF1ZXN0XG4gICAqIEByZXR1cm5zIFByb21pc2U8VHhSZXF1ZXN0PiAtIFRoZSBjcmVhdGVkIHRyYW5zYWN0aW9uIHJlcXVlc3QgZm9yIHNpZ25pbmcgYSBtZXNzYWdlXG4gICAqL1xuICBhc3luYyBidWlsZFNpZ25NZXNzYWdlUmVxdWVzdChwYXJhbXM6IFdhbGxldFNpZ25NZXNzYWdlT3B0aW9ucyk6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgIT09ICd0c3MnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lc3NhZ2Ugc2lnbmluZyBvbmx5IHN1cHBvcnRlZCBmb3IgVFNTIHdhbGxldHMnKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4uc3VwcG9ydHNNZXNzYWdlU2lnbmluZygpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1lc3NhZ2Ugc2lnbmluZyBub3Qgc3VwcG9ydGVkIGZvciAke3RoaXMuYmFzZUNvaW4uZ2V0RnVsbE5hbWUoKX1gKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5tZXNzYWdlPy5tZXNzYWdlUmF3IHx8ICFwYXJhbXMubWVzc2FnZT8ubWVzc2FnZVN0YW5kYXJkVHlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtZXNzYWdlIGFuZCB0eXBlIHJlcXVpcmVkIHRvIGNyZWF0ZSBtZXNzYWdlIHNpZ24gcmVxdWVzdCcpO1xuICAgIH1cbiAgICBjb25zdCBtZXNzYWdlUmF3ID0gcGFyYW1zLm1lc3NhZ2UubWVzc2FnZVJhdztcbiAgICBjb25zdCBtZXNzYWdlU3RhbmRhcmRUeXBlID0gcGFyYW1zLm1lc3NhZ2UubWVzc2FnZVN0YW5kYXJkVHlwZTtcblxuICAgIGNvbnN0IHJlcUlkID0gcGFyYW1zLnJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgaW50ZW50T3B0aW9uOiBJbnRlbnRPcHRpb25zRm9yTWVzc2FnZSA9IHtcbiAgICAgICAgY3VzdG9kaWFuTWVzc2FnZUlkOiBwYXJhbXMuY3VzdG9kaWFuTWVzc2FnZUlkLFxuICAgICAgICByZXFJZCxcbiAgICAgICAgaW50ZW50VHlwZTogJ3NpZ25NZXNzYWdlJyxcbiAgICAgICAgaXNUc3M6IHRydWUsXG4gICAgICAgIG1lc3NhZ2VSYXcsXG4gICAgICAgIG1lc3NhZ2VTdGFuZGFyZFR5cGUsXG4gICAgICAgIHNpZ25lckFkZHJlc3M6IHBhcmFtcy5tZXNzYWdlLnNpZ25lckFkZHJlc3MsXG4gICAgICB9O1xuXG4gICAgICBpZiAoIXRoaXMudHNzVXRpbHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUU1MgdXRpbGl0aWVzIG5vdCBhdmFpbGFibGUgZm9yIHRoaXMgd2FsbGV0Jyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy50c3NVdGlscy5idWlsZFNpZ25NZXNzYWdlUmVxdWVzdChpbnRlbnRPcHRpb24pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgbWVzc2FnZSBzaWduIHJlcXVlc3Q6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdXNlciBwcml2YXRlIGtleSBmcm9tIGVpdGhlciBhIGRlcml2YXRpb24gb3IgYW4gZW5jcnlwdGVkIGtleWNoYWluXG4gICAqIEBwYXJhbSBbcGFyYW1zLmtleWNoYWluIC8gcGFyYW1zLmtleV0gKG9iamVjdCkgb3IgcGFyYW1zLnBydiAoc3RyaW5nKVxuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgKHN0cmluZylcbiAgICovXG4gIGdldFVzZXJQcnYocGFyYW1zOiBHZXRVc2VyUHJ2T3B0aW9ucyA9IHt9KTogc3RyaW5nIHtcbiAgICBjb25zdCB1c2VyS2V5Y2hhaW4gPSBwYXJhbXMua2V5Y2hhaW4gfHwgcGFyYW1zLmtleTtcbiAgICBsZXQgdXNlclBydiA9IHBhcmFtcy5wcnY7XG4gICAgaWYgKHVzZXJQcnYgJiYgdHlwZW9mIHVzZXJQcnYgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BydiBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgLy8gdXNlIHRoZSBgZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZGAgcHJvcGVydHkgZnJvbSB0aGUgdXNlciBrZXljaGFpbiBhcyB0aGUgYGNvbGREZXJpdmF0aW9uU2VlZGBcbiAgICAvLyBpZiBubyBvdGhlciBgY29sZERlcml2YXRpb25TZWVkYCB3YXMgZXhwbGljaXRseSBwcm92aWRlZFxuICAgIC8vIE9ubHkgZm9yIG9uY2hhaW4gbXVsdGlzaWcgd2FsbGV0cywgVFNTIGtleSBkZXJpdmF0aW9uIGhhcHBlbnMgZHVyaW5nIHRoZSBzaWduaW5nIHByb2Nlc3NcbiAgICBpZiAoXG4gICAgICBwYXJhbXMuY29sZERlcml2YXRpb25TZWVkID09PSB1bmRlZmluZWQgJiZcbiAgICAgIHBhcmFtcy5rZXljaGFpbiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBwYXJhbXMua2V5Y2hhaW4uZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICB0aGlzLm11bHRpc2lnVHlwZSgpID09PSAnb25jaGFpbidcbiAgICApIHtcbiAgICAgIHBhcmFtcy5jb2xkRGVyaXZhdGlvblNlZWQgPSBwYXJhbXMua2V5Y2hhaW4uZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZDtcbiAgICB9XG5cbiAgICBpZiAodXNlclBydiAmJiBwYXJhbXMuY29sZERlcml2YXRpb25TZWVkKSB7XG4gICAgICAvLyB0aGUgZGVyaXZhdGlvbiBvbmx5IG1ha2VzIHNlbnNlIHdoZW4gYSBrZXkgYWxyZWFkeSBleGlzdHNcbiAgICAgIGNvbnN0IGRlcml2YXRpb24gPSB0aGlzLmJhc2VDb2luLmRlcml2ZUtleVdpdGhTZWVkKHtcbiAgICAgICAga2V5OiB1c2VyUHJ2LFxuICAgICAgICBzZWVkOiBwYXJhbXMuY29sZERlcml2YXRpb25TZWVkLFxuICAgICAgfSk7XG4gICAgICB1c2VyUHJ2ID0gZGVyaXZhdGlvbi5rZXk7XG4gICAgfSBlbHNlIGlmICghdXNlclBydikge1xuICAgICAgaWYgKCF1c2VyS2V5Y2hhaW4gfHwgdHlwZW9mIHVzZXJLZXljaGFpbiAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdrZXljaGFpbiBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICAgICAgfVxuICAgICAgY29uc3QgdXNlckVuY3J5cHRlZFBydiA9IHVzZXJLZXljaGFpbi5lbmNyeXB0ZWRQcnY7XG4gICAgICBpZiAoIXVzZXJFbmNyeXB0ZWRQcnYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdrZXljaGFpbiBkb2VzIG5vdCBoYXZlIHByb3BlcnR5IGVuY3J5cHRlZFBydicpO1xuICAgICAgfVxuICAgICAgaWYgKCFwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dhbGxldFBhc3NwaHJhc2UgcHJvcGVydHkgbWlzc2luZycpO1xuICAgICAgfVxuICAgICAgdXNlclBydiA9IGRlY3J5cHRLZXljaGFpblByaXZhdGVLZXkodGhpcy5iaXRnbywgdXNlcktleWNoYWluLCBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSk7XG4gICAgICBpZiAoIXVzZXJQcnYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdmYWlsZWQgdG8gZGVjcnlwdCB1c2VyIGtleWNoYWluJyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1c2VyUHJ2O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHRyYW5zYWN0aW9uIHByZWJ1aWxkIGZyb20gQml0R28sIHZhbGlkYXRlIGl0LCBhbmQgdGhlbiBkZWNyeXB0IHRoZSB1c2VyIGtleSBhbmQgc2lnbiB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgcHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb24ocGFyYW1zOiBQcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24+IHtcbiAgICBpZiAocGFyYW1zLmVpcDE1NTkgJiYgcGFyYW1zLmdhc1ByaWNlKSB7XG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdPbmx5IG9uZSBvZiBwYXJhbXMuZWlwMTU1OSBhbmQgcGFyYW1zLmdhc1ByaWNlIG1heSBiZSBzcGVjaWZpZWQnKTtcbiAgICAgIGVycm9yLmNvZGUgPSAnYm90aF9nYXNQcmljZV9hbmRfZWlwMTU1OWdhc01vZGVsX3NwZWNpZmllZCc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnByZWJ1aWxkVHggJiYgcGFyYW1zLnJlY2lwaWVudHMpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ09ubHkgb25lIG9mIHByZWJ1aWxkVHggYW5kIHJlY2lwaWVudHMgbWF5IGJlIHNwZWNpZmllZCcpO1xuICAgICAgZXJyb3IuY29kZSA9ICdib3RoX3ByZWJ1aWxkdHhfYW5kX3JlY2lwaWVudHNfc3BlY2lmaWVkJztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucmVjaXBpZW50cyAmJiAhQXJyYXkuaXNBcnJheShwYXJhbXMucmVjaXBpZW50cykpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ2V4cGVjdGluZyByZWNpcGllbnRzIGFycmF5Jyk7XG4gICAgICBlcnJvci5jb2RlID0gJ3JlY2lwaWVudHNfbm90X2FycmF5JztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChfLmlzQXJyYXkodGhpcy5fcGVybWlzc2lvbnMpICYmICF0aGlzLl9wZXJtaXNzaW9ucy5pbmNsdWRlcygnc3BlbmQnKSkge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignbm8gc3BlbmQgcGVybWlzc2lvbiBvbiB0aGlzIHdhbGxldCcpO1xuICAgICAgZXJyb3IuY29kZSA9ICd1c2VyX25vdF9hbGxvd2VkX3RvX3NwZW5kX2Zyb21fd2FsbGV0JztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucmVjZWl2ZUFkZHJlc3MgJiYgKHBhcmFtcy50eXBlID09PSAndHJhbnNmZXInIHx8IHBhcmFtcy50eXBlID09PSAndHJhbnNmZXJUb2tlbicpKSB7XG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKGBjYW5ub3QgdXNlIHJlY2VpdmUgYWRkcmVzcyBmb3IgVFNTIHRyYW5zYWN0aW9ucyBvZiB0eXBlICR7cGFyYW1zLnR5cGV9YCk7XG4gICAgICBlcnJvci5jb2RlID0gJ3JlY2VpdmVfYWRkcmVzc19ub3RfYWxsb3dlZF9mb3JfdHNzX3dpdGhkcmF3YWxzJztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucmVjaXBpZW50cyAmJiAocGFyYW1zLnR5cGUgPT09ICdmaWxsTm9uY2UnIHx8IHBhcmFtcy50eXBlID09PSAnYWNjZWxlcmF0aW9uJykpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoYGNhbm5vdCBwcm92aWRlIHJlY2lwaWVudHMgZm9yIHRyYW5zYWN0aW9uIHR5cGUgJHtwYXJhbXMudHlwZX1gKTtcbiAgICAgIGVycm9yLmNvZGUgPSAncmVjaXBpZW50c19ub3RfYWxsb3dlZF9mb3JfZmlsbG5vbmNlX2FuZF9hY2NlbGVyYXRpb25fdHhfdHlwZSc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5hcGlWZXJzaW9uKSB7XG4gICAgICB2YWxpZGF0ZVR4UmVxdWVzdEFwaVZlcnNpb24odGhpcywgcGFyYW1zLmFwaVZlcnNpb24pO1xuICAgIH1cblxuICAgIC8vIERvaW5nIGEgc2FuaXR5IGNoZWNrIGZvciBwYXNzd29yZCBoZXJlIHRvIGF2b2lkIGRvaW5nIGZ1cnRoZXIgd29yayBpZiB3ZSBrbm93IGl0J3Mgd3JvbmdcbiAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCB0aGlzLmdldEtleWNoYWluc0FuZFZhbGlkYXRlUGFzc3BocmFzZSh7XG4gICAgICByZXFJZDogcGFyYW1zLnJlcUlkLFxuICAgICAgd2FsbGV0UGFzc3BocmFzZTogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgICBjdXN0b21TaWduaW5nRnVuY3Rpb246IHBhcmFtcy5jdXN0b21TaWduaW5nRnVuY3Rpb24sXG4gICAgfSk7XG5cbiAgICBsZXQgdHhQcmVidWlsZFF1ZXJ5OiBQcm9taXNlPFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQgfCBzdHJpbmc+O1xuICAgIGlmIChpc1ByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQocGFyYW1zLnByZWJ1aWxkVHgpICYmIHBhcmFtcy5wcmVidWlsZFR4LmJ1aWxkUGFyYW1zPy5wcmV2aWV3KSB7XG4gICAgICAvLyBJZiB3ZSBwcmVidWlsdCB0aGUgdHhSZXF1ZXN0IHdpdGggcHJldmlldz10cnVlLCB0aGVuIHdlIHNob3VsZCByZWJ1aWxkIHdpdGggcHJldmlldz1mYWxzZSB0byBwZXJzaXN0IHRoZSByZXF1ZXN0XG4gICAgICB0eFByZWJ1aWxkUXVlcnkgPSB0aGlzLnByZWJ1aWxkVHJhbnNhY3Rpb24oe1xuICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIC4uLnsgLi4ucGFyYW1zLnByZWJ1aWxkVHguYnVpbGRQYXJhbXMsIHByZXZpZXc6IGZhbHNlIH0sXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHhQcmVidWlsZFF1ZXJ5ID0gcGFyYW1zLnByZWJ1aWxkVHggPyBQcm9taXNlLnJlc29sdmUocGFyYW1zLnByZWJ1aWxkVHgpIDogdGhpcy5wcmVidWlsZFRyYW5zYWN0aW9uKHBhcmFtcyk7XG4gICAgfVxuXG4gICAgLy8gdGhlIHByZWJ1aWxkIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHByb3ZpZGluZyBhbiBleHBsaWNpdCB0eFxuICAgIGNvbnN0IHR4UHJlYnVpbGQgPSAoYXdhaXQgdHhQcmVidWlsZFF1ZXJ5KSBhcyBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0O1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuYmFzZUNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFBhcmFtczogeyAuLi50eFByZWJ1aWxkLmJ1aWxkUGFyYW1zLCAuLi5wYXJhbXMgfSxcbiAgICAgICAgdHhQcmVidWlsZCxcbiAgICAgICAgd2FsbGV0OiB0aGlzLFxuICAgICAgICB2ZXJpZmljYXRpb246IHBhcmFtcy52ZXJpZmljYXRpb24gPz8ge30sXG4gICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgICAgIHdhbGxldFR5cGU6IHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCd0cmFuc2FjdGlvbiBwcmVidWlsZCBmYWlsZWQgbG9jYWwgdmFsaWRhdGlvbjonLCBlLm1lc3NhZ2UpO1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgJ3RyYW5zYWN0aW9uIHBhcmFtczonLFxuICAgICAgICBfLm9taXQocGFyYW1zLCBbJ2tleWNoYWluJywgJ3BydicsICdwYXNzcGhyYXNlJywgJ3dhbGxldFBhc3NwaHJhc2UnLCAna2V5JywgJ3dhbGxldCddKVxuICAgICAgKTtcbiAgICAgIC8vIFNhbml0aXplIHRvIHJlbW92ZSBfdG9rZW4gZnJvbSBiaXRnb1xuICAgICAgY29uc3Qgc2FuaXRpemVkUHJlYnVpbGQgPSB7XG4gICAgICAgIC4uLl8ub21pdCh0eFByZWJ1aWxkLCBbJ3dhbGxldCddKSxcbiAgICAgICAgd2FsbGV0OiB7XG4gICAgICAgICAgLi4udGhpcyxcbiAgICAgICAgICBiaXRnbzogXy5vbWl0KHRoaXMuYml0Z28sIFsnX3Rva2VuJ10pLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3RyYW5zYWN0aW9uIHByZWJ1aWxkOicsIHNhbml0aXplZFByZWJ1aWxkKTtcbiAgICAgIGNvbnNvbGUudHJhY2UoZSk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICAvLyBwYXNzIG91ciB0aHJlZSBrZXlzXG4gICAgY29uc3Qgc2lnbmluZ1BhcmFtcyA9IHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHR4UHJlYnVpbGQsXG4gICAgICB3YWxsZXQ6IHRoaXMsXG4gICAgICBrZXljaGFpbjoga2V5Y2hhaW5zWzBdLFxuICAgICAgYmFja3VwS2V5Y2hhaW46IGtleWNoYWlucy5sZW5ndGggPiAxID8ga2V5Y2hhaW5zWzFdIDogbnVsbCxcbiAgICAgIGJpdGdvS2V5Y2hhaW46IGtleWNoYWlucy5sZW5ndGggPiAyID8ga2V5Y2hhaW5zWzJdIDogbnVsbCxcbiAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgfTtcbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSA9PT0gJ29uY2hhaW4nKSB7XG4gICAgICBzaWduaW5nUGFyYW1zLnB1YnMgPSBrZXljaGFpbnMubWFwKChrKSA9PiB7XG4gICAgICAgIGFzc2VydChrLnB1Yik7XG4gICAgICAgIHJldHVybiBrLnB1YjtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChzaWduaW5nUGFyYW1zLnR4UHJlYnVpbGQudHhSZXF1ZXN0SWQpIHtcbiAgICAgIGFzc2VydCh0aGlzLnRzc1V0aWxzLCAndHNzVXRpbHMgbXVzdCBiZSBkZWZpbmVkIGZvciBUU1Mgd2FsbGV0cycpO1xuICAgICAgY29uc3QgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscy5nZXRUeFJlcXVlc3Qoc2lnbmluZ1BhcmFtcy50eFByZWJ1aWxkLnR4UmVxdWVzdElkLCBwYXJhbXMucmVxSWQpO1xuICAgICAgaWYgKHRoaXMudHNzVXRpbHMuaXNQZW5kaW5nQXBwcm92YWxUeFJlcXVlc3RGdWxsKHR4UmVxdWVzdCkpIHtcbiAgICAgICAgcmV0dXJuIHR4UmVxdWVzdDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2lnblRyYW5zYWN0aW9uKHNpZ25pbmdQYXJhbXMpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnaW5zdWZmaWNpZW50IGZ1bmRzJykpIHtcbiAgICAgICAgZXJyb3IuY29kZSA9ICdpbnN1ZmZpY2llbnRfZnVuZHMnO1xuICAgICAgICBlcnJvci53YWxsZXRCYWxhbmNlcyA9IHtcbiAgICAgICAgICBiYWxhbmNlU3RyaW5nOiB0aGlzLmJhbGFuY2VTdHJpbmcoKSxcbiAgICAgICAgICBjb25maXJtZWRCYWxhbmNlU3RyaW5nOiB0aGlzLmNvbmZpcm1lZEJhbGFuY2VTdHJpbmcoKSxcbiAgICAgICAgICBzcGVuZGFibGVCYWxhbmNlU3RyaW5nOiB0aGlzLnNwZW5kYWJsZUJhbGFuY2VTdHJpbmcoKSxcbiAgICAgICAgICBiYWxhbmNlOiB0aGlzLmJhbGFuY2UoKSxcbiAgICAgICAgICBjb25maXJtZWRCYWxhbmNlOiB0aGlzLmNvbmZpcm1lZEJhbGFuY2UoKSxcbiAgICAgICAgICBzcGVuZGFibGVCYWxhbmNlOiB0aGlzLnNwZW5kYWJsZUJhbGFuY2UoKSxcbiAgICAgICAgfTtcbiAgICAgICAgZXJyb3IudHhQYXJhbXMgPSB7XG4gICAgICAgICAgLi4uXy5vbWl0KHBhcmFtcywgWydrZXljaGFpbicsICdwcnYnLCAncGFzc3BocmFzZScsICd3YWxsZXRQYXNzcGhyYXNlJywgJ2tleScsICd3YWxsZXQnXSksXG4gICAgICAgICAgd2FsbGV0OiB7XG4gICAgICAgICAgICAuLi50aGlzLFxuICAgICAgICAgICAgYml0Z286IF8ub21pdCh0aGlzLmJpdGdvLCBbJ190b2tlbiddKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFjY2VsZXJhdGUgYSB0cmFuc2FjdGlvbidzIGNvbmZpcm1hdGlvbiB1c2luZyBDaGlsZC1QYXlzLUZvci1QYXJlbnQgKENQRlApIG9yIFJlcGxhY2UtQnktRmVlIChSQkYpXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGFjY2VsZXJhdGVUcmFuc2FjdGlvbihwYXJhbXM6IEFjY2VsZXJhdGVUcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgdGhpcy52YWxpZGF0ZUFjY2VsZXJhdGlvblBhcmFtcyhwYXJhbXMpO1xuXG4gICAgcGFyYW1zLnJlY2lwaWVudHMgPSBbXTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKHtcbiAgICAgIC4uLihhd2FpdCB0aGlzLnByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uKHBhcmFtcykpLFxuICAgICAgLi4uQnVpbGRQYXJhbXMuZW5jb2RlKHBhcmFtcyksXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlQWNjZWxlcmF0aW9uUGFyYW1zKHBhcmFtczogQWNjZWxlcmF0ZVRyYW5zYWN0aW9uT3B0aW9ucykge1xuICAgIGlmICghcGFyYW1zLmNwZnBUeElkcyAmJiAhcGFyYW1zLnJiZlR4SWRzKSB7XG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdtdXN0IHBhc3MgY3BmcFR4SWRzIG9yIHJiZlR4SWRzJyk7XG4gICAgICBlcnJvci5jb2RlID0gJ2NwZnB0eGlkc19vcl9yYmZ0eGlkc19yZXF1aXJlZCc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmNwZnBUeElkcyAmJiBwYXJhbXMucmJmVHhJZHMpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ2Nhbm5vdCBzcGVjaWZ5IGJvdGggY3BmcFR4SWRzIGFuZCByYmZUeElkcycpO1xuICAgICAgZXJyb3IuY29kZSA9ICdjYW5ub3Rfc3BlY2lmeV9ib3RoX2NwZnBfYW5kX3JiZl90eGlkcyc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmNwZnBUeElkcykge1xuICAgICAgdGhpcy52YWxpZGF0ZUNwZnBQYXJhbXMocGFyYW1zKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnJiZlR4SWRzKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlUmJmUGFyYW1zKHBhcmFtcyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5yZWNpcGllbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJhbXMucmVjaXBpZW50cykgfHwgcGFyYW1zLnJlY2lwaWVudHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCB2YWx1ZSBmb3IgJ3JlY2lwaWVudHMnOiBtdXN0IGJlIGVtcHR5IGFycmF5IHdoZW4gc2V0YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZVJiZlBhcmFtcyhwYXJhbXM6IEFjY2VsZXJhdGVUcmFuc2FjdGlvbk9wdGlvbnMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocGFyYW1zLnJiZlR4SWRzKSB8fCBwYXJhbXMucmJmVHhJZHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdleHBlY3RpbmcgcmJmVHhJZHMgdG8gYmUgYW4gYXJyYXkgb2YgbGVuZ3RoIDEnKTtcbiAgICAgIGVycm9yLmNvZGUgPSAncmJmdHhpZHNfbm90X2FycmF5JztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmZlZU11bHRpcGxpZXIpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ2ZlZU11bHRpcGxpZXIgbXVzdCBiZSBzZXQnKTtcbiAgICAgIGVycm9yLmNvZGUgPSAnZmVlbXVsdGlwbGllcl9ub3Rfc2V0JztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuZmVlTXVsdGlwbGllciA8PSAxKSB7XG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdmZWVNdWx0aXBsaWVyIG11c3QgYmUgYSBncmVhdGVyIHRoYW4gMScpO1xuICAgICAgZXJyb3IuY29kZSA9ICdmZWVtdWx0aXBsaWVyX2dyZWF0ZXJfdGhhbl9vbmUnO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZUNwZnBQYXJhbXMocGFyYW1zOiBBY2NlbGVyYXRlVHJhbnNhY3Rpb25PcHRpb25zKSB7XG4gICAgLy8gVE9ETyhCRy05MzQ5KTogY2hhbmdlIHRoZSBsYXN0IGNoZWNrIHRvID4gMCBhbmQgdGhlIGVycm9yIG1lc3NhZ2Ugb25jZSBwbGF0Zm9ybSBhbGxvd3MgbXVsdGlwbGUgdHJhbnNhY3Rpb25zIHRvXG4gICAgLy8gYmUgYnVtcGVkIGluIHRoZSBzYW1lIENQRlAgdHJhbnNhY3Rpb25cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocGFyYW1zLmNwZnBUeElkcykgfHwgcGFyYW1zLmNwZnBUeElkcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ2V4cGVjdGluZyBjcGZwVHhJZHMgdG8gYmUgYW4gYXJyYXkgb2YgbGVuZ3RoIDEnKTtcbiAgICAgIGVycm9yLmNvZGUgPSAnY3BmcHR4aWRzX25vdF9hcnJheSc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuY3BmcEZlZVJhdGUpKSB7XG4gICAgICBpZiAocGFyYW1zLm5vQ3BmcEZlZVJhdGUgIT09IHRydWUpIHtcbiAgICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignY3BmcEZlZVJhdGUgbXVzdCBiZSBzZXQgdW5sZXNzIG5vQ3BmcEZlZVJhdGUgaXMgc2V0Jyk7XG4gICAgICAgIGVycm9yLmNvZGUgPSAnY3BmcGZlZXJhdGVfbm90X3NldCc7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5jcGZwRmVlUmF0ZSkgfHwgcGFyYW1zLmNwZnBGZWVSYXRlIDwgMCkge1xuICAgICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdjcGZwRmVlUmF0ZSBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXInKTtcbiAgICAgICAgZXJyb3IuY29kZSA9ICdjcGZwZmVlcmF0ZV9ub3Rfbm9ubmVnYXRpdmVfaW50ZWdlcic7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5tYXhGZWUpKSB7XG4gICAgICBpZiAocGFyYW1zLm5vTWF4RmVlICE9PSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ21heEZlZSBtdXN0IGJlIHNldCB1bmxlc3Mgbm9NYXhGZWUgaXMgc2V0Jyk7XG4gICAgICAgIGVycm9yLmNvZGUgPSAnbWF4ZmVlX25vdF9zZXQnO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMubWF4RmVlKSB8fCBwYXJhbXMubWF4RmVlIDwgMCkge1xuICAgICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdtYXhGZWUgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyJyk7XG4gICAgICAgIGVycm9yLmNvZGUgPSAnbWF4ZmVlX25vdF9ub25uZWdhdGl2ZV9pbnRlZ2VyJztcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN1Ym1pdCBhIGhhbGYtc2lnbmVkIHRyYW5zYWN0aW9uIHRvIEJpdEdvXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogLSB0eEhleDogdHJhbnNhY3Rpb24gaGV4IHRvIHN1Ym1pdFxuICAgKiAtIGhhbGZTaWduZWQ6IG9iamVjdCBjb250YWluaW5nIHRyYW5zYWN0aW9uICh0eEhleCBvciB0eEJhc2U2NCkgdG8gc3VibWl0XG4gICAqIEBwYXJhbSByZXFJZCAtIHJlcXVlc3QgdHJhY2VyIHJlcXVlc3QgaWRcbiAgICovXG4gIGFzeW5jIHN1Ym1pdFRyYW5zYWN0aW9uKHBhcmFtczogU3VibWl0VHJhbnNhY3Rpb25PcHRpb25zID0ge30sIHJlcUlkPzogSVJlcXVlc3RUcmFjZXIpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ290cCcsICd0eEhleCcsICd0eFJlcXVlc3RJZCddKTtcbiAgICBjb25zdCBoYXNUeEhleCA9ICEhcGFyYW1zLnR4SGV4O1xuICAgIGNvbnN0IGhhc0hhbGZTaWduZWQgPSAhIXBhcmFtcy5oYWxmU2lnbmVkO1xuXG4gICAgaWYgKHBhcmFtcy50eFJlcXVlc3RJZCAmJiAoaGFzVHhIZXggfHwgaGFzSGFsZlNpZ25lZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBzdXBwbHkgZXhhY3RseSBvbmUgb2YgdHhSZXF1ZXN0SWQsIHR4SGV4LCBvciBoYWxmU2lnbmVkJyk7XG4gICAgfSBlbHNlIGlmICghcGFyYW1zLnR4UmVxdWVzdElkICYmICgoaGFzVHhIZXggJiYgaGFzSGFsZlNpZ25lZCkgfHwgKCFoYXNUeEhleCAmJiAhaGFzSGFsZlNpZ25lZCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ211c3Qgc3VwcGx5IGVpdGhlciB0eEhleCBvciBoYWxmU2lnbmVkLCBidXQgbm90IGJvdGgnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2VuZFRyYW5zYWN0aW9uKHBhcmFtcywgcmVxSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgY29pbnMgdG8gYSByZWNpcGllbnRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLmFkZHJlc3MgLSB0aGUgZGVzdGluYXRpb24gYWRkcmVzc1xuICAgKiBAcGFyYW0gcGFyYW1zLmFtb3VudCAtIHRoZSBhbW91bnQgaW4gc2F0b3NoaXMvd2VpL2Jhc2UgdmFsdWUgdG8gYmUgc2VudFxuICAgKiBAcGFyYW0gcGFyYW1zLm1lc3NhZ2UgLSBvcHRpb25hbCBtZXNzYWdlIHRvIGF0dGFjaCB0byB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zLmRhdGEgLSBbRXRoZXJldW0gU3BlY2lmaWNdIG9wdGlvbmFsIGRhdGEgdG8gcGFzcyB0byB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zLmN1c3RvZGlhblRyYW5zYWN0aW9uSWQgLSBbRXRoZXJldW0vTU1JIFNwZWNpZmljXSBpZCBvZiB0cmFuc2FjdGlvbiBjcmVhdGVkIHZpYSBtZXRhbWFza1xuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgLSB0aGUgcGFzc3BocmFzZSB0byBiZSB1c2VkIHRvIGRlY3J5cHQgdGhlIHVzZXIga2V5IG9uIHRoaXMgd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXMucHJ2IC0gdGhlIHByaXZhdGUga2V5IGluIHN0cmluZyBmb3JtLCBpZiB3YWxsZXRQYXNzcGhyYXNlIGlzIG5vdCBhdmFpbGFibGVcbiAgICogQHBhcmFtIHBhcmFtcy5taW5Db25maXJtcyAtIHRoZSBtaW5pbXVtIGNvbmZpcm1hdGlvbiB0aHJlc2hvbGQgZm9yIGlucHV0c1xuICAgKiBAcGFyYW0gcGFyYW1zLmVuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZSAtIHdoZXRoZXIgdG8gZW5mb3JjZSBtaW5Db25maXJtcyBmb3IgY2hhbmdlIGlucHV0c1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHNlbmQocGFyYW1zOiBTZW5kT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2FkZHJlc3MnXSwgWydtZXNzYWdlJywgJ2RhdGEnXSk7XG5cbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuYW1vdW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciBhbW91bnQnKTtcbiAgICB9XG5cbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuYWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgYWRkcmVzcycpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvaW4gPSB0aGlzLmJhc2VDb2luO1xuXG4gICAgY29uc3QgYW1vdW50ID0gbmV3IEJpZ051bWJlcihwYXJhbXMuYW1vdW50KTtcblxuICAgIGNvbnN0IGlzQW1vdW50TmVnYXRpdmUgPSBhbW91bnQuaXNOZWdhdGl2ZSgpO1xuICAgIGNvbnN0IGlzQW1vdW50WmVybyA9IGFtb3VudC5pc1plcm8oKTtcbiAgICBjb25zdCBpc0Ftb3VudERlY2ltYWwgPSAhYW1vdW50LmlzSW50ZWdlcigpO1xuXG4gICAgXy5zb21lKFtpc0Ftb3VudE5lZ2F0aXZlLCAhY29pbi52YWx1ZWxlc3NUcmFuc2ZlckFsbG93ZWQoKSAmJiBpc0Ftb3VudFplcm8sIGlzQW1vdW50RGVjaW1hbF0sIChjb25kaXRpb24pID0+IHtcbiAgICAgIGlmIChjb25kaXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IGZvciBhbW91bnQgLSBJbnRlZ2VyIGdyZWF0ZXIgdGhhbiB6ZXJvIG9yIG51bWVyaWMgc3RyaW5nIGV4cGVjdGVkJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCByZWNpcGllbnRzOiBTZW5kTWFueU9wdGlvbnNbJ3JlY2lwaWVudHMnXSA9IFtcbiAgICAgIHtcbiAgICAgICAgYWRkcmVzczogcGFyYW1zLmFkZHJlc3MsXG4gICAgICAgIGFtb3VudDogcGFyYW1zLmFtb3VudCxcbiAgICAgIH0sXG4gICAgXTtcbiAgICBpZiAocGFyYW1zLnRva2VuTmFtZSkge1xuICAgICAgcmVjaXBpZW50c1swXS50b2tlbk5hbWUgPSBwYXJhbXMudG9rZW5OYW1lO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmRhdGEgJiYgY29pbi50cmFuc2FjdGlvbkRhdGFBbGxvd2VkKCkpIHtcbiAgICAgIHJlY2lwaWVudHNbMF0uZGF0YSA9IHBhcmFtcy5kYXRhO1xuICAgIH1cbiAgICBjb25zdCBzZW5kTWFueU9wdGlvbnM6IFNlbmRNYW55T3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHBhcmFtcywge1xuICAgICAgcmVjaXBpZW50cyxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5zZW5kTWFueShzZW5kTWFueU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYW4gRVJDLTcyMSBORlQgb3IgRVJDLTExNTUgTkZUKHMpLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGNvbnN0cnVjdHMgdGhlIGFwcHJvcHJpYXRlIGNhbGwgZGF0YSBmb3IgYW4gRVJDLTcyMS8xMTU1IHRva2VuIHRyYW5zZmVyLFxuICAgKiBhbmQgY2FsbHMgdGhlIHRva2VuIGNvbnRyYWN0IHdpdGggdGhlIGRhdGEsIGFuZCBhbW91bnQgMC4gVGhpcyB0cmFuc2FjdGlvbiB3aWxsIGFsd2F5cyBwcm9kdWNlXG4gICAqIGEgcGVuZGluZyBhcHByb3ZhbC5cbiAgICpcbiAgICogQHBhcmFtIHNlbmRPcHRpb25zIE9wdGlvbnMgdG8gc3BlY2lmeSBob3cgdGhlIHRyYW5zYWN0aW9uIHNob3VsZCBiZSBzZW50LlxuICAgKiBAcGFyYW0gc2VuZE5mdE9wdGlvbnMgT3B0aW9ucyB0byBzcGVjaWZ5IHRoZSBORlQocykgdG8gYmUgc2VudC5cbiAgICpcbiAgICogQHJldHVybiBBIHBlbmRpbmcgYXBwcm92YWwgZm9yIHRoZSB0cmFuc2FjdGlvbi5cbiAgICovXG4gIGFzeW5jIHNlbmROZnQoc2VuZE9wdGlvbnM6IFNlbmRORlRPcHRpb25zLCBzZW5kTmZ0T3B0aW9uczogTkZUVHJhbnNmZXJPcHRpb25zKTogUHJvbWlzZTxTZW5kTkZUUmVzdWx0PiB7XG4gICAgY29uc3QgbmZ0Q29sbGVjdGlvbnMgPSBhd2FpdCB0aGlzLmdldE5mdEJhbGFuY2VzKCk7XG4gICAgY29uc3QgeyB0b2tlbkNvbnRyYWN0QWRkcmVzcywgcmVjaXBpZW50QWRkcmVzcywgdHlwZSB9ID0gc2VuZE5mdE9wdGlvbnM7XG5cbiAgICBjb25zdCBuZnRCYWxhbmNlID0gbmZ0Q29sbGVjdGlvbnMuZmluZCgoYykgPT4gYy5tZXRhZGF0YS50b2tlbkNvbnRyYWN0QWRkcmVzcyA9PT0gdG9rZW5Db250cmFjdEFkZHJlc3MpO1xuICAgIGlmICghbmZ0QmFsYW5jZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb2xsZWN0aW9uIG5vdCBmb3VuZCBmb3IgdG9rZW4gY29udHJhY3QgJHt0b2tlbkNvbnRyYWN0QWRkcmVzc31gKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4uaXNWYWxpZEFkZHJlc3MocmVjaXBpZW50QWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCByZWNpcGllbnQgYWRkcmVzcyAke3JlY2lwaWVudEFkZHJlc3N9YCk7XG4gICAgfVxuICAgIGNvbnN0IGJhc2VBZGRyZXNzID0gdGhpcy5jb2luU3BlY2lmaWMoKT8uYmFzZUFkZHJlc3MgfHwgdGhpcy5jb2luU3BlY2lmaWMoKT8ucm9vdEFkZHJlc3M7XG4gICAgaWYgKCFiYXNlQWRkcmVzcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGJhc2UgYWRkcmVzcyBmb3Igd2FsbGV0Jyk7XG4gICAgfVxuXG4gICAgaWYgKG5mdEJhbGFuY2UudHlwZSAhPT0gdHlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTcGVjaWZpZWQgTkZUIHR5cGUgJHt0eXBlfSBkb2VzIG5vdCBtYXRjaCBjb2xsZWN0aW9uIHR5cGUgJHtuZnRCYWxhbmNlLnR5cGV9YCk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChzZW5kTmZ0T3B0aW9ucy50eXBlKSB7XG4gICAgICBjYXNlICdFUkM3MjEnOiB7XG4gICAgICAgIGlmICghbmZ0QmFsYW5jZS5jb2xsZWN0aW9uc1tzZW5kTmZ0T3B0aW9ucy50b2tlbklkXSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBUb2tlbiAke3NlbmROZnRPcHRpb25zLnRva2VuSWR9IG5vdCBmb3VuZCBpbiBjb2xsZWN0aW9uICR7dG9rZW5Db250cmFjdEFkZHJlc3N9IG9yIGRvZXMgbm90IGhhdmUgYSBzcGVuZGFibGUgYmFsYW5jZWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuYmFzZUNvaW4uYnVpbGROZnRUcmFuc2ZlckRhdGEoe1xuICAgICAgICAgIC4uLnNlbmROZnRPcHRpb25zLFxuICAgICAgICAgIGZyb21BZGRyZXNzOiBiYXNlQWRkcmVzcyxcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCByZWNpcGllbnQ7XG4gICAgICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpID09PSAndmV0Jykge1xuICAgICAgICAgIHJlY2lwaWVudCA9IHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHJlY2lwaWVudEFkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6ICcxJyxcbiAgICAgICAgICAgIHRva2VuRGF0YTogZGF0YSxcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgPT09ICdoYmFyZXZtJykge1xuICAgICAgICAgIHJlY2lwaWVudCA9IHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHNlbmROZnRPcHRpb25zLnRva2VuQ29udHJhY3RBZGRyZXNzLFxuICAgICAgICAgICAgYW1vdW50OiAnMCcsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgdG9rZW5OYW1lOiBuZnRCYWxhbmNlLm1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWNpcGllbnQgPSB7XG4gICAgICAgICAgICBhZGRyZXNzOiBzZW5kTmZ0T3B0aW9ucy50b2tlbkNvbnRyYWN0QWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogJzAnLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmRNYW55KHtcbiAgICAgICAgICAuLi5zZW5kT3B0aW9ucyxcbiAgICAgICAgICByZWNpcGllbnRzOiBbcmVjaXBpZW50XSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjYXNlICdFUkMxMTU1Jzoge1xuICAgICAgICBjb25zdCBlbnRyaWVzID0gc2VuZE5mdE9wdGlvbnMuZW50cmllcztcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgaWYgKCFuZnRCYWxhbmNlLmNvbGxlY3Rpb25zW2VudHJ5LnRva2VuSWRdKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBUb2tlbiAke2VudHJ5LnRva2VuSWR9IG5vdCBmb3VuZCBpbiBjb2xsZWN0aW9uICR7c2VuZE5mdE9wdGlvbnMudG9rZW5Db250cmFjdEFkZHJlc3N9IG9yIGRvZXMgbm90IGhhdmUgYSBzcGVuZGFibGUgYmFsYW5jZWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChuZnRCYWxhbmNlLmNvbGxlY3Rpb25zW2VudHJ5LnRva2VuSWRdIDwgZW50cnkuYW1vdW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBBbW91bnQgJHtlbnRyeS5hbW91bnR9IGV4Y2VlZHMgc3BlbmRhYmxlIGJhbGFuY2Ugb2YgJHtuZnRCYWxhbmNlLmNvbGxlY3Rpb25zW2VudHJ5LnRva2VuSWRdfSBmb3IgdG9rZW4gJHtcbiAgICAgICAgICAgICAgICBlbnRyeS50b2tlbklkXG4gICAgICAgICAgICAgIH1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmJhc2VDb2luLmJ1aWxkTmZ0VHJhbnNmZXJEYXRhKHtcbiAgICAgICAgICAuLi5zZW5kTmZ0T3B0aW9ucyxcbiAgICAgICAgICBmcm9tQWRkcmVzczogYmFzZUFkZHJlc3MsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kTWFueSh7XG4gICAgICAgICAgLi4uc2VuZE9wdGlvbnMsXG4gICAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzOiBzZW5kTmZ0T3B0aW9ucy50b2tlbkNvbnRyYWN0QWRkcmVzcyxcbiAgICAgICAgICAgICAgYW1vdW50OiAnMCcsXG4gICAgICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFRva2VuVHlwZS5ESUdJVEFMX0FTU0VUOiB7XG4gICAgICAgIGlmICghbmZ0QmFsYW5jZS5jb2xsZWN0aW9uc1tzZW5kTmZ0T3B0aW9ucy50b2tlbklkXSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBUb2tlbiAke3NlbmROZnRPcHRpb25zLnRva2VuSWR9IG5vdCBmb3VuZCBpbiBjb2xsZWN0aW9uICR7dG9rZW5Db250cmFjdEFkZHJlc3N9IG9yIGRvZXMgbm90IGhhdmUgYSBzcGVuZGFibGUgYmFsYW5jZWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRva2VuRGF0YTogVG9rZW5UcmFuc2ZlclJlY2lwaWVudFBhcmFtcyA9IHtcbiAgICAgICAgICB0b2tlblR5cGU6IHNlbmROZnRPcHRpb25zLnR5cGUsXG4gICAgICAgICAgdG9rZW5RdWFudGl0eTogJzEnLCAvLyBUaGlzIE5GVCBzdGFuZGFyZCB3aWxsIGFsd2F5cyBoYXZlIHF1YW50aXR5IG9mIDFcbiAgICAgICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzcyxcbiAgICAgICAgICB0b2tlbklkOiBzZW5kTmZ0T3B0aW9ucy50b2tlbklkLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kTWFueSh7XG4gICAgICAgICAgLi4uc2VuZE9wdGlvbnMsXG4gICAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzOiByZWNpcGllbnRBZGRyZXNzLFxuICAgICAgICAgICAgICBhbW91bnQ6ICcxJywgLy8gdGhlIGFtb3VudCBuZWVkcyB0byBiZSBub24temVybyBmb3IgdGhlIHRyYW5zYWN0aW9uIHRvIGJlIHZhbGlkLCBpdCBpcyBpZ25vcmVkXG4gICAgICAgICAgICAgIHRva2VuRGF0YSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgbW9uZXkgdG8gbXVsdGlwbGUgcmVjaXBpZW50c1xuICAgKiAxLiBHZXRzIHRoZSB1c2VyIGtleWNoYWluIGJ5IGNoZWNraW5nIHRoZSB3YWxsZXQgZm9yIGEga2V5IHdoaWNoIGhhcyBhbiBlbmNyeXB0ZWQgcHJ2XG4gICAqIDIuIERlY3J5cHRzIHVzZXIga2V5XG4gICAqIDMuIENyZWF0ZXMgdGhlIHRyYW5zYWN0aW9uIHdpdGggZGVmYXVsdCBmZWVcbiAgICogNC4gU2lnbnMgdHJhbnNhY3Rpb24gd2l0aCBkZWNyeXB0ZWQgdXNlciBrZXlcbiAgICogNS4gU2VuZHMgdGhlIHRyYW5zYWN0aW9uIHRvIEJpdEdvXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwYXJhbXNcbiAgICogQHBhcmFtIHt7YWRkcmVzczogc3RyaW5nLCBhbW91bnQ6IHN0cmluZ319IHBhcmFtcy5yZWNpcGllbnRzIC0gbGlzdCBvZiByZWNpcGllbnRzIGFuZCBuZWNlc3NhcnkgcmVjaXBpZW50IGluZm9ybWF0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubnVtQmxvY2tzIC0gRXN0aW1hdGVzIHRoZSBhcHByb3hpbWF0ZSBmZWUgcGVyIGtpbG9ieXRlIG5lY2Vzc2FyeSBmb3IgYSB0cmFuc2FjdGlvbiBjb25maXJtYXRpb24gd2l0aGluIG51bUJsb2NrcyBibG9ja3NcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVSYXRlIC0gdGhlIGRlc2lyZWQgZmVlUmF0ZSBmb3IgdGhlIHRyYW5zYWN0aW9uIGluIHNhdG90aGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUmF0ZSAtIHVwcGVyIGxpbWl0IGZvciBmZWVSYXRlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluQ29uZmlybXMgLSBhbGwgc2VsZWN0ZWQgdW5zcGVudHMgd2lsbCBoYXZlIGF0IGxlYXN0IHRoaXMgbWFueSBjb25maXJtYXRpb25zXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmVuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZSAtIEVuZm9yY2VzIG1pbkNvbmZpcm1zIG9uIGNoYW5nZSBpbnB1dHNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy50YXJnZXRXYWxsZXRVbnNwZW50cyAtIFRoZSBkZXNpcmVkIGNvdW50IG9mIHVuc3BlbnRzIGluIHRoZSB3YWxsZXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5tZXNzYWdlIC0gb3B0aW9uYWwgbWVzc2FnZSB0byBhdHRhY2ggdG8gdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5taW5WYWx1ZSAtIElnbm9yZSB1bnNwZW50cyBzbWFsbGVyIHRoYW4gdGhpcyBhbW91bnQgb2Ygc2F0b3NoaXNcbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5tYXhWYWx1ZSAtIElnbm9yZSB1bnNwZW50cyBsYXJnZXIgdGhhbiB0aGlzIGFtb3VudCBvZiBzYXRvc2hpc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLnNlcXVlbmNlSWQgLSBUaGUgc2VxdWVuY2UgSUQgb2YgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubGFzdExlZGdlclNlcXVlbmNlIC0gQWJzb2x1dGUgbWF4IGxlZGdlciB0aGUgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIGFjY2VwdGVkIGluLCB3aGVyZWFmdGVyIGl0IHdpbGwgYmUgcmVqZWN0ZWQuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubGVkZ2VyU2VxdWVuY2VEZWx0YSAtIFJlbGF0aXZlIGxlZGdlciBoZWlnaHQgKGluIHJlbGF0aW9uIHRvIHRoZSBjdXJyZW50IGxlZGdlcikgdGhhdCB0aGUgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIGFjY2VwdGVkIGluLCB3aGVyZWFmdGVyIGl0IHdpbGwgYmUgcmVqZWN0ZWQuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZ2FzUHJpY2UgLSBDdXN0b20gZ2FzIHByaWNlIHRvIGJlIHVzZWQgZm9yIHNlbmRpbmcgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLm5vU3BsaXRDaGFuZ2UgLSBTZXQgdG8gdHJ1ZSB0byBkaXNhYmxlIGF1dG9tYXRpYyBjaGFuZ2Ugc3BsaXR0aW5nIGZvciBwdXJwb3NlcyBvZiB1bnNwZW50IG1hbmFnZW1lbnRcbiAgICogQHBhcmFtIHtBcnJheX0gcGFyYW1zLnVuc3BlbnRzIC0gVGhlIHVuc3BlbnRzIHRvIHVzZSBpbiB0aGUgdHJhbnNhY3Rpb24uIEVhY2ggdW5zcGVudCBzaG91bGQgYmUgaW4gdGhlIGZvcm0gcHJldlR4SWQ6bk91dHB1dFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmNvbW1lbnQgLSBBbnkgYWRkaXRpb25hbCBjb21tZW50IHRvIGF0dGFjaCB0byB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5vdHAgLSBUd28gZmFjdG9yIGF1dGggY29kZSB0byBlbmFibGUgc2VuZGluZyB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5jaGFuZ2VBZGRyZXNzIC0gU3BlY2lmaWVzIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgY2hhbmdlIG91dHB1dFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5pbnN0YW50IC0gU2VuZCB0aGlzIHRyYW5zYWN0aW9uIHVzaW5nIGNvaW4tc3BlY2lmaWMgaW5zdGFudCBzZW5kaW5nIG1ldGhvZCAoaWYgYXZhaWxhYmxlKVxuICAgKiBAcGFyYW0ge3t2YWx1ZTogU3RyaW5nLCB0eXBlOiBTdHJpbmd9fSBwYXJhbXMubWVtbyAtIE1lbW8gdG8gdXNlIGluIHRyYW5zYWN0aW9uIChzdXBwb3J0ZWQgYnkgU3RlbGxhcilcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy50eXBlIC0gVHlwZSBvZiB0aGUgdHJhbnNhY3Rpb24gKGUuZy4gdHJ1c3RsaW5lKVxuICAgKiBAcGFyYW0ge3t0b2tlbjogcGFyYW1zLCBhY3Rpb246IFN0cmluZywgbGltaXQ6IFN0cmluZ31bXX0gb3B0aW9ucy50cnVzdGxpbmVzIC0gQXJyYXkgb2YgdHJ1c3RsaW5lcyB0byBtYW5hZ2UgKHN1cHBvcnRlZCBieSBTdGVsbGFyKVxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHNlbmRNYW55KHBhcmFtczogU2VuZE1hbnlPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ2NvbW1lbnQnLCAnb3RwJ10pO1xuICAgIGRlYnVnKCdzZW5kTWFueSBjYWxsZWQnKTtcbiAgICBjb25zdCByZXFJZCA9IHBhcmFtcy5yZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIHBhcmFtcy5yZXFJZCA9IHJlcUlkO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG4gICAgY29uc3QgY29pbiA9IHRoaXMuYmFzZUNvaW47XG4gICAgaWYgKF8uaXNPYmplY3QocGFyYW1zLnJlY2lwaWVudHMpKSB7XG4gICAgICBwYXJhbXMucmVjaXBpZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChyZWNpcGllbnQpIHtcbiAgICAgICAgY29pbi5jaGVja1JlY2lwaWVudChyZWNpcGllbnQpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZW5kTWFueVR4UmVxdWVzdHMocGFyYW1zKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbLi4udGhpcy5wcmVidWlsZFdoaXRlbGlzdGVkUGFyYW1zKCksICdjb21tZW50JywgJ290cCcsICdob3AnXSk7XG5cbiAgICBpZiAodGhpcy5fd2FsbGV0LnR5cGUgPT09ICdjdXN0b2RpYWwnKSB7XG4gICAgICBjb25zdCBleHRyYVBhcmFtcyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4uZ2V0RXh0cmFQcmVidWlsZFBhcmFtcyhPYmplY3QuYXNzaWduKHBhcmFtcywgeyB3YWxsZXQ6IHRoaXMgfSkpO1xuICAgICAgT2JqZWN0LmFzc2lnbihzZWxlY3RQYXJhbXMsIGV4dHJhUGFyYW1zKTtcbiAgICAgIHJldHVybiB0aGlzLmluaXRpYXRlVHJhbnNhY3Rpb24oc2VsZWN0UGFyYW1zLCByZXFJZCk7XG4gICAgfVxuXG4gICAgY29uc3QgaGFsZlNpZ25lZFRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5wcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbihwYXJhbXMpO1xuICAgIGNvbnN0IGV4dHJhUGFyYW1zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5nZXRFeHRyYVByZWJ1aWxkUGFyYW1zKE9iamVjdC5hc3NpZ24ocGFyYW1zLCB7IHdhbGxldDogdGhpcyB9KSk7XG4gICAgY29uc3QgZmluYWxUeFBhcmFtcyA9IF8uZXh0ZW5kKHt9LCBoYWxmU2lnbmVkVHJhbnNhY3Rpb24sIHNlbGVjdFBhcmFtcywgZXh0cmFQYXJhbXMpO1xuICAgIHJldHVybiB0aGlzLnNlbmRUcmFuc2FjdGlvbihmaW5hbFR4UGFyYW1zLCByZXFJZCk7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3ZlciBhbiB1bnN1cHBvcnRlZCB0b2tlbiBmcm9tIGEgQml0R28gbXVsdGlzaWcgd2FsbGV0XG4gICAqIHBhcmFtcyBhcmUgdmFsaWRhdGVkIGluIEV0aC5wcm90b3R5cGUucmVjb3ZlclRva2VuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy50b2tlbkNvbnRyYWN0QWRkcmVzcyB0aGUgY29udHJhY3QgYWRkcmVzcyBvZiB0aGUgdW5zdXBwb3J0ZWQgdG9rZW5cbiAgICogQHBhcmFtIHBhcmFtcy5yZWNpcGllbnQgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgcmVjb3ZlcmVkIHRva2VucyBzaG91bGQgYmUgc2VudCB0b1xuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgdGhlIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqIEBwYXJhbSBwYXJhbXMucHJ2IHRoZSB4cHJ2XG4gICAqL1xuICBhc3luYyByZWNvdmVyVG9rZW4ocGFyYW1zOiBSZWNvdmVyVG9rZW5PcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpICE9PSAnZXRoJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0b2tlbiByZWNvdmVyeSBvbmx5IHN1cHBvcnRlZCBmb3IgZXRoIHdhbGxldHMnKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHRva2VuQ29udHJhY3RBZGRyZXNzLCByZWNpcGllbnQgfSA9IHBhcmFtcztcblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHRva2VuQ29udHJhY3RBZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHN0cmluZyBwYXJhbWV0ZXIgdG9rZW5Db250cmFjdEFkZHJlc3MnKTtcbiAgICB9XG5cbiAgICBpZiAoXy5pc1VuZGVmaW5lZChyZWNpcGllbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgc3RyaW5nIHBhcmFtZXRlciByZWNpcGllbnQnKTtcbiAgICB9XG5cbiAgICBjb25zdCByZWNvdmVyVG9rZW5PcHRpb25zID0gT2JqZWN0LmFzc2lnbih7IHRva2VuQ29udHJhY3RBZGRyZXNzLCByZWNpcGllbnQgfSwgcGFyYW1zLCB7IHdhbGxldDogdGhpcyB9KTtcbiAgICByZXR1cm4gdGhpcy5iYXNlQ29pbi5yZWNvdmVyVG9rZW4ocmVjb3ZlclRva2VuT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRyYW5zYWN0aW9uIG1ldGFkYXRhIGZvciB0aGUgb2xkZXN0IHRyYW5zYWN0aW9uIHRoYXQgaXMgc3RpbGwgcGVuZGluZyBvciBhdHRlbXB0ZWRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBPYmplY3Qgd2l0aCB0eGlkLCB3YWxsZXRJZCwgdHgsIGFuZCBmZWUgKGlmIHN1cHBvcnRlZCBmb3IgY29pbilcbiAgICovXG4gIGFzeW5jIGdldEZpcnN0UGVuZGluZ1RyYW5zYWN0aW9uKHBhcmFtczogUmVjb3JkPHN0cmluZywgbmV2ZXI+ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBpbnRlcm5hbC5nZXRGaXJzdFBlbmRpbmdUcmFuc2FjdGlvbih7IHdhbGxldElkOiB0aGlzLmlkKCkgfSwgdGhpcy5iYXNlQ29pbiwgdGhpcy5iaXRnbyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlIHRoZSBmZWUgb24gdGhlIHBlbmRpbmcgdHJhbnNhY3Rpb24gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4gdHhpZCB0byB0aGUgZ2l2ZW4gbmV3IGZlZVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMudHhpZCBUaGUgdHJhbnNhY3Rpb24gSWQgY29ycmVzcG9uZGluZyB0byB0aGUgdHJhbnNhY3Rpb24gd2hvc2UgZmVlIGlzIHRvIGJlIGNoYW5nZWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMuZmVlXSBPcHRpb25hbCAtIFRoZSBuZXcgZmVlIHRvIGFwcGx5IHRvIHRoZSBkZW5vdGVkIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zLmVpcDE1NTldIE9wdGlvbmFsIC0gdGhlIGVpcDE1NTkgdmFsdWVzIHRvIGFwcGx5IHRvIHRoZSBkZW5vdGVkIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSB0cmFuc2FjdGlvbiBJRCBvZiB0aGUgbmV3IHRyYW5zYWN0aW9uIHRoYXQgY29udGFpbnMgdGhlIG5ldyBmZWUgcmF0ZVxuICAgKi9cbiAgYXN5bmMgY2hhbmdlRmVlKHBhcmFtczogQ2hhbmdlRmVlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAocGFyYW1zLmZlZSkgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd0eGlkJywgJ2ZlZSddLCBbXSk7XG4gICAgaWYgKHBhcmFtcy5laXAxNTU5KSBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLmVpcDE1NTksIFsnbWF4RmVlUGVyR2FzJywgJ21heFByaW9yaXR5RmVlUGVyR2FzJ10pO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5pZCgpICsgJy90eC9jaGFuZ2VGZWUnKSlcbiAgICAgIC5zZW5kKHBhcmFtcylcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBpbmZvIGZyb20gbWVyY2hhbnQgc2VydmVyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgVGhlIHBhcmFtcyBwYXNzZWQgaW50byB0aGUgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy51cmwgVGhlIFVybCB0byByZXRyaWV2ZSBpbmZvIGZyb21cbiAgICogQHJldHVybnMge09iamVjdH0gVGhlIGluZm8gcmV0dXJuZWQgZnJvbSB0aGUgbWVyY2hhbnQgc2VydmVyXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBhc3luYyBnZXRQYXltZW50SW5mbyhwYXJhbXM6IHsgdXJsPzogc3RyaW5nIH0gPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndXJsJ10sIFtdKTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3BheW1lbnRJbmZvJykpLnF1ZXJ5KHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBqc29uIHBheW1lbnQgcmVzcG9uc2VcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBUaGUgcGFyYW1zIHBhc3NlZCBpbnRvIHRoZSBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnBheW1lbnRVcmwgLSBUaGUgdXJsIHRvIHNlbmQgdGhlIGZ1bGx5IHNpZ25lZCB0cmFuc2FjdGlvbiB0b1xuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnR4SGV4IC0gVGhlIHRyYW5zYWN0aW9uIGhleCBvZiB0aGUgcGF5bWVudFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLm1lbW8ge1N0cmluZ30gLSBBIG1lbW8gc3VwcGxpZWQgYnkgdGhlIG1lcmNoYW50LCB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSB0cmFuc2ZlciBhcyB0aGUgY29tbWVudFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmV4cGlyZXMge1N0cmluZ30gLSBJU08gRGF0ZSBmb3JtYXQgb2Ygd2hlbiB0aGUgcGF5bWVudCByZXF1ZXN0IGV4cGlyZXNcbiAgICogQHJldHVybnMge09iamVjdH0gVGhlIGluZm8gcmV0dXJuZWQgZnJvbSB0aGUgbWVyY2hhbnQgc2VydmVyIFBheW1lbnQgQWNrXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBhc3luYyBzZW5kUGF5bWVudFJlc3BvbnNlKHBhcmFtczogYW55ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9zZW5kUGF5bWVudCcpKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgcG9saWN5IHJ1bGVcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLmNvbmRpdGlvbiBjb25kaXRpb24gb2JqZWN0XG4gICAqIEBwYXJhbSBwYXJhbXMuYWN0aW9uIGFjdGlvbiBvYmplY3RcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBjcmVhdGVQb2xpY3lSdWxlKHBhcmFtczogQ3JlYXRlUG9saWN5UnVsZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCcsICd0eXBlJ10sIFsnbWVzc2FnZSddKTtcblxuICAgIGlmICghXy5pc09iamVjdChwYXJhbXMuY29uZGl0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHBhcmFtZXRlcjogY29uZGl0aW9ucyBvYmplY3QnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNPYmplY3QocGFyYW1zLmFjdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBwYXJhbWV0ZXI6IGFjdGlvbiBvYmplY3QnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMudXJsKCcvcG9saWN5L3J1bGUnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBhIHBvbGljeSBydWxlXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy5jb25kaXRpb24gY29uZGl0aW9uIG9iamVjdFxuICAgKiBAcGFyYW0gcGFyYW1zLmFjdGlvbiBhY3Rpb24gb2JqZWN0XG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgc2V0UG9saWN5UnVsZShwYXJhbXM6IGFueSA9IHt9KSB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCcsICd0eXBlJ10sIFsnbWVzc2FnZSddKTtcblxuICAgIGlmICghXy5pc09iamVjdChwYXJhbXMuY29uZGl0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHBhcmFtZXRlcjogY29uZGl0aW9ucyBvYmplY3QnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNPYmplY3QocGFyYW1zLmFjdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBwYXJhbWV0ZXI6IGFjdGlvbiBvYmplY3QnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5wdXQodGhpcy51cmwoJy9wb2xpY3kvcnVsZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIFBvbGljeSBSdWxlXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyByZW1vdmVQb2xpY3lSdWxlKHBhcmFtczogUmVtb3ZlUG9saWN5UnVsZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCddLCBbJ21lc3NhZ2UnXSk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5kZWwodGhpcy51cmwoJy9wb2xpY3kvcnVsZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHRoaXMgd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyByZW1vdmUocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBuZXZlcj4gPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuYml0Z28uZGVsKHRoaXMudXJsKCkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgY3Jvc3NDaGFpbiBVVFhPc1xuICAgKiBDdXJyZW50bHkgb25seSBmb3IgQVZBWFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnNvdXJjZUNoYWluIHRoZSBzb3VyY2VjaGFpbiB0byBwaWNrIFVUWE9zLCBpZiBub3QgZ2l2ZW4sIHRoZW4gcGljayBmcm9tIGFsbCBhdmFpbGFibGUgY2hhaW5zIFtQLCBDXVxuICAgKi9cbiAgZmV0Y2hDcm9zc0NoYWluVVRYT3MocGFyYW1zOiBGZXRjaENyb3NzQ2hhaW5VVFhPc09wdGlvbnMpOiBQcm9taXNlPENyb3NzQ2hhaW5VVFhPW10+IHtcbiAgICBjb25zdCBxdWVyeSA9IF8ucGljayhwYXJhbXMsIFsnc291cmNlQ2hhaW4nXSk7XG4gICAgcmV0dXJuIHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvY3Jvc3NDaGFpblVuc3BlbnRzJykpLnF1ZXJ5KHF1ZXJ5KS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0IGEgSlNPTiByZXByZXNlbnRhYmxlIHZlcnNpb24gb2YgdGhpcyB3YWxsZXRcbiAgICovXG4gIHRvSlNPTigpOiBXYWxsZXREYXRhIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHRyYWRpbmcgYWNjb3VudCBmcm9tIHRoaXMgd2FsbGV0XG4gICAqL1xuICB0b1RyYWRpbmdBY2NvdW50KCk6IFRyYWRpbmdBY2NvdW50IHtcbiAgICBpZiAodGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSAhPT0gJ29mYycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuIG9ubHkgY29udmVydCBhbiBPZmZjaGFpbiAoT0ZDKSB3YWxsZXQgdG8gYSB0cmFkaW5nIGFjY291bnQnKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUcmFkaW5nQWNjb3VudCh0aGlzLl93YWxsZXQuZW50ZXJwcmlzZSwgdGhpcywgdGhpcy5iaXRnbyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBhZGRyZXNzIGJvb2sgZm9yIHRoaXMgd2FsbGV0XG4gICAqL1xuICB0b0FkZHJlc3NCb29rKCk6IElBZGRyZXNzQm9vayB7XG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgIT09ICdvZmMnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBvbmx5IHVzZSBhbiBPZmZjaGFpbiAoT0ZDKSB3YWxsZXQgZm9yIHRoZSBhZGRyZXNzIGJvb2snKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBBZGRyZXNzQm9vayh0aGlzLl93YWxsZXQuZW50ZXJwcmlzZSwgdGhpcy5iaXRnbywgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgc3Rha2luZyB3YWxsZXQgZnJvbSB0aGlzIHdhbGxldFxuICAgKi9cbiAgdG9TdGFraW5nV2FsbGV0KCk6IFN0YWtpbmdXYWxsZXQge1xuICAgIGNvbnN0IGlzRXRoVHNzID1cbiAgICAgIHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgPT0gJ2V0aCcgJiYgdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYz8ud2FsbGV0VmVyc2lvblxuICAgICAgICA/IHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWMud2FsbGV0VmVyc2lvbiA+PSAzXG4gICAgICAgIDogZmFsc2U7XG4gICAgcmV0dXJuIG5ldyBTdGFraW5nV2FsbGV0KHRoaXMsIGlzRXRoVHNzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBnbyBzdGFraW5nIHdhbGxldCBmcm9tIHRoaXMgd2FsbGV0XG4gICAqL1xuICB0b0dvU3Rha2luZ1dhbGxldCgpOiBHb1N0YWtpbmdXYWxsZXQge1xuICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpICE9PSAnb2ZjJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gb25seSBjb252ZXJ0IGFuIE9mZmNoYWluIChPRkMpIHdhbGxldCB0byBhIHN0YWtpbmcgd2FsbGV0Jyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgR29TdGFraW5nV2FsbGV0KHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW5kIGRvd25sb2FkcyBQREYga2V5Y2FyZCBmb3Igd2FsbGV0IChyZXF1aXJlcyByZXNwb25zZSBmcm9tIHdhbGxldHMuZ2VuZXJhdGVXYWxsZXQpXG4gICAqXG4gICAqIE5vdGU6IHRoaXMgaXMgZXhhbXBsZSBjb2RlIGFuZCBpcyBub3QgdGhlIHZlcnNpb24gdXNlZCBvbiBiaXRnby5jb21cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAgICoganNQREYgLSBhbiBpbnN0YW5jZSBvZiB0aGUganNQREYgbGlicmFyeVxuICAgKiAgICogUVJDb2RlIC0gYW4gaW5zdGFuY2Ugb2YgdGhlIFFSaW91cyBsaWJyYXJ5XG4gICAqICAgKiB1c2VyS2V5Y2hhaW4gLSBhIHdhbGxldCdzIHByaXZhdGUgdXNlciBrZXljaGFpblxuICAgKiAgICogYmFja3VwS2V5Y2hhaW4gLSBhIHdhbGxldCdzIHByaXZhdGUgYmFja3VwIGtleWNoYWluXG4gICAqICAgKiBiaXRnb0tleWNoYWluIC0gYSB3YWxsZXQncyBwcml2YXRlIGJpdGdvIGtleWNoYWluXG4gICAqICAgKiBwYXNzcGhyYXNlIC0gdGhlIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqICAgKiBwYXNzY29kZUVuY3J5cHRpb25Db2RlIC0gdGhlIGVuY3J5cHRpb24gc2VjcmV0IHVzZWQgZm9yIEJveCBEXG4gICAqICAgKiBhY3RpdmF0aW9uQ29kZSAtIGEgcmFuZG9tbHkgZ2VuZXJhdGVkIHNpeC1kaWdpdCBhY3RpdmF0aW9uIGNvZGVcbiAgICogICAqIHdhbGxldEtleUlEIC0gdGhlIEtleSBJRCB1c2VkIGZvciBkZXJpdmluZyBhIGNvbGQgd2FsbGV0J3Mgc2lnbmluZyBrZXlcbiAgICogICAqIGJhY2t1cEtleUlEIC0gdGhlIEtleSBJRCB1c2VkIGZvciBkZXJpdmluZyBhIGNvbGQgd2FsbGV0J3MgYmFja3VwIGtleVxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGRvd25sb2FkS2V5Y2FyZChwYXJhbXM6IERvd25sb2FkS2V5Y2FyZE9wdGlvbnMgPSB7fSk6IHZvaWQge1xuICAgIGlmICghd2luZG93IHx8ICF3aW5kb3cubG9jYXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGRvd25sb2FkS2V5Y2FyZCBmdW5jdGlvbiBpcyBvbmx5IGNhbGxhYmxlIHdpdGhpbiBhIGJyb3dzZXIuJyk7XG4gICAgfVxuXG4gICAgLy8gR3JhYiBwYXJhbWV0ZXJzIHdpdGggZGVmYXVsdCBmb3IgYWN0aXZhdGlvbkNvZGVcbiAgICBjb25zdCB7XG4gICAgICBqc1BERixcbiAgICAgIFFSQ29kZSxcbiAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgIGJhY2t1cEtleWNoYWluLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIHBhc3NwaHJhc2UsXG4gICAgICBwYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgd2FsbGV0S2V5SUQsXG4gICAgICBiYWNrdXBLZXlJRCxcbiAgICAgIGFjdGl2YXRpb25Db2RlID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogOTAwMDAwICsgMTAwMDAwKS50b1N0cmluZygpLFxuICAgIH0gPSBwYXJhbXM7XG5cbiAgICBpZiAoIWpzUERGIHx8IHR5cGVvZiBqc1BERiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbGVhc2UgcGFzcyBpbiBhIHZhbGlkIGpzUERGIGluc3RhbmNlJyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUga2V5Y2hhaW5zXG4gICAgaWYgKCF1c2VyS2V5Y2hhaW4gfHwgdHlwZW9mIHVzZXJLZXljaGFpbiAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgV2FsbGV0IGtleWNoYWluIG11c3QgaGF2ZSBhICd1c2VyJyBwcm9wZXJ0eWApO1xuICAgIH1cblxuICAgIGlmICghYmFja3VwS2V5Y2hhaW4gfHwgdHlwZW9mIGJhY2t1cEtleWNoYWluICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCYWNrdXAga2V5Y2hhaW4gaXMgcmVxdWlyZWQgYW5kIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgfVxuXG4gICAgaWYgKCFiaXRnb0tleWNoYWluIHx8IHR5cGVvZiBiaXRnb0tleWNoYWluICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCaXRnbyBrZXljaGFpbiBpcyByZXF1aXJlZCBhbmQgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgICB9XG5cbiAgICBpZiAod2FsbGV0S2V5SUQgJiYgdHlwZW9mIHdhbGxldEtleUlEICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd3YWxsZXRLZXlJRCBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgaWYgKGJhY2t1cEtleUlEICYmIHR5cGVvZiBiYWNrdXBLZXlJRCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYmFja3VwS2V5SUQgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGFjdGl2YXRpb24gY29kZSBpZiBwcm92aWRlZFxuICAgIGlmICh0eXBlb2YgYWN0aXZhdGlvbkNvZGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FjdGl2YXRpb24gQ29kZSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGl2YXRpb25Db2RlLmxlbmd0aCAhPT0gNikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBY3RpdmF0aW9uIGNvZGUgbXVzdCBiZSBzaXggY2hhcmFjdGVycycpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvaW5TaG9ydE5hbWUgPSB0aGlzLmJhc2VDb2luLnR5cGU7XG4gICAgY29uc3QgY29pbk5hbWUgPSB0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCk7XG4gICAgY29uc3Qgd2FsbGV0TGFiZWwgPSB0aGlzLl93YWxsZXQubGFiZWw7XG5cbiAgICBjb25zdCBkb2MgPSBkcmF3S2V5Y2FyZCh7XG4gICAgICBqc1BERixcbiAgICAgIFFSQ29kZSxcbiAgICAgIGVuY3J5cHQ6IHRoaXMuYml0Z28uZW5jcnlwdCxcbiAgICAgIGNvaW5TaG9ydE5hbWUsXG4gICAgICBjb2luTmFtZSxcbiAgICAgIGFjdGl2YXRpb25Db2RlLFxuICAgICAgd2FsbGV0TGFiZWwsXG4gICAgICBwYXNzcGhyYXNlLFxuICAgICAgcGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgIGJhY2t1cEtleWNoYWluLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIHdhbGxldEtleUlELFxuICAgICAgYmFja3VwS2V5SUQsXG4gICAgfSk7XG5cbiAgICAvLyBTYXZlIHRoZSBQREYgb24gdGhlIHVzZXIncyBicm93c2VyXG4gICAgZG9jLnNhdmUoYEJpdEdvIEtleWNhcmQgZm9yICR7d2FsbGV0TGFiZWx9LnBkZmApO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHNldCBvZiBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9ucyBmb3IgYSB3YWxsZXQuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogICAgIGNvbnNvbGlkYXRlQWRkcmVzc2VzIC0gdGhlc2UgYXJlIHRoZSBvbi1jaGFpbiByZWNlaXZlIGFkZHJlc3NlcyB3ZSB3YW50IHRvIHBpY2sgYSBjb25zb2xpZGF0aW9uIGFtb3VudCBmcm9tXG4gICAqL1xuICBhc3luYyBidWlsZEFjY291bnRDb25zb2xpZGF0aW9ucyhcbiAgICBwYXJhbXM6IEJ1aWxkQ29uc29saWRhdGlvblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8UHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdFtdPiB7XG4gICAgaWYgKCF0aGlzLmJhc2VDb2luLmFsbG93c0FjY291bnRDb25zb2xpZGF0aW9ucygpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5iYXNlQ29pbi5nZXRGdWxsTmFtZSgpfSBkb2VzIG5vdCBhbGxvdyBhY2NvdW50IGNvbnNvbGlkYXRpb25zLmApO1xuICAgIH1cblxuICAgIC8vIFdoaXRlbGlzdCBwYXJhbXMgdG8gYnVpbGQgdHhcbiAgICBjb25zdCB3aGl0ZWxpc3RlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIHRoaXMucHJlYnVpbGRDb25zb2xpZGF0ZUFjY291bnRQYXJhbXMoKSk7XG4gICAgZGVidWcoJ3ByZWJ1aWxkaW5nIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb246ICVPJywgd2hpdGVsaXN0ZWRQYXJhbXMpO1xuXG4gICAgaWYgKHBhcmFtcy5yZXFJZCkge1xuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCk7XG4gICAgfVxuXG4gICAgLy8gdGhpcyBjb3VsZCByZXR1cm4gMTAwIGJ1aWxkIHRyYW5zYWN0aW9uc1xuICAgIGNvbnN0IGJ1aWxkUmVzcG9uc2UgPSAoYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuaWQoKSArICcvY29uc29saWRhdGVBY2NvdW50L2J1aWxkJykpXG4gICAgICAuc2VuZCh3aGl0ZWxpc3RlZFBhcmFtcylcbiAgICAgIC5yZXN1bHQoKSkgYXMgYW55O1xuXG4gICAgaWYgKGJ1aWxkUmVzcG9uc2UubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHJlY2VpdmUgYWRkcmVzc2VzIHdpdGggYmFsYW5jZSBmb3VuZCB0byBjb25zb2xpZGF0ZS4nKTtcbiAgICB9XG5cbiAgICAvLyB3ZSBuZWVkIHRvIHN0ZXAgb3ZlciBlYWNoIHByZWJ1aWxkIG5vdyAtIHNob3VsZCBiZSBpbiBhbiBhcnJheSBpbiB0aGUgYm9keVxuICAgIGNvbnN0IGNvbnNvbGlkYXRpb25zOiBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbnNvbGlkYXRlQWNjb3VudEJ1aWxkIG9mIGJ1aWxkUmVzcG9uc2UpIHtcbiAgICAgIGxldCBwcmVidWlsZDogUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdCA9IChhd2FpdCB0aGlzLmJhc2VDb2luLnBvc3RQcm9jZXNzUHJlYnVpbGQoXG4gICAgICAgIE9iamVjdC5hc3NpZ24oY29uc29saWRhdGVBY2NvdW50QnVpbGQsIHtcbiAgICAgICAgICB3YWxsZXQ6IHRoaXMsXG4gICAgICAgICAgYnVpbGRQYXJhbXM6IHdoaXRlbGlzdGVkUGFyYW1zLFxuICAgICAgICB9KVxuICAgICAgKSkgYXMgUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdDtcblxuICAgICAgZGVsZXRlIHByZWJ1aWxkLndhbGxldDtcbiAgICAgIGRlbGV0ZSBwcmVidWlsZC5idWlsZFBhcmFtcztcblxuICAgICAgcHJlYnVpbGQgPSBfLmV4dGVuZCh7fSwgcHJlYnVpbGQsIHsgd2FsbGV0SWQ6IHRoaXMuaWQoKSB9KTtcbiAgICAgIGRlYnVnKCdmaW5hbCBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9uIHByZWJ1aWxkOiAlTycsIHByZWJ1aWxkKTtcblxuICAgICAgY29uc29saWRhdGlvbnMucHVzaChwcmVidWlsZCk7XG4gICAgfVxuICAgIHJldHVybiBjb25zb2xpZGF0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYW5kIHNlbmRzIGEgc2V0IG9mIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb25zIGZvciBhIHdhbGxldC5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAgICAgcHJlYnVpbGRUeCAgIC0gdGhpcyBpcyB0aGUgcHJlLWJ1aWxkIGNvbnNvbGlkYXRpb24gdHguIHRoaXMgaXMgYSBub3JtYWxseSBidWlsdCB0eCB3aXRoXG4gICAqICAgICAgICAgICAgICAgICAgICBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlciBvZiBjb25zb2xpZGF0ZUlkLlxuICAgKiAgICAgdmVyaWZpY2F0aW9uIC0gbm9ybWFsIGtleWNoYWlucywgZXRjLiBmb3IgdmVyaWZpY2F0aW9uXG4gICAqL1xuICBhc3luYyBzZW5kQWNjb3VudENvbnNvbGlkYXRpb24ocGFyYW1zOiBQcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCF0aGlzLmJhc2VDb2luLmFsbG93c0FjY291bnRDb25zb2xpZGF0aW9ucygpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5iYXNlQ29pbi5nZXRGdWxsTmFtZSgpfSBkb2VzIG5vdCBhbGxvdyBhY2NvdW50IGNvbnNvbGlkYXRpb25zLmApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl93YWxsZXQudHlwZSA9PT0gJ2N1c3RvZGlhbCcgJiYgdGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSAhPT0gJ3RzcycpIHtcbiAgICAgIHBhcmFtcy50eXBlID0gJ2NvbnNvbGlkYXRlJztcbiAgICAgIHJldHVybiB0aGlzLmluaXRpYXRlVHJhbnNhY3Rpb24ocGFyYW1zIGFzIFR4U2VuZEJvZHksIHBhcmFtcy5yZXFJZCk7XG4gICAgfVxuXG4gICAgLy8gb25lIG9mIGEgc2V0IG9mIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb25zXG4gICAgaWYgKHR5cGVvZiBwYXJhbXMucHJlYnVpbGRUeCA9PT0gJ3N0cmluZycgfHwgcGFyYW1zLnByZWJ1aWxkVHggPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGJ1aWxkIG9mIGFjY291bnQgY29uc29saWRhdGlvbi4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5wcmVidWlsZFR4LmNvbnNvbGlkYXRlSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGZpbmQgY29uc29saWRhdGlvbiBpZCBvbiBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9uLicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlID09PSAndHNzJykge1xuICAgICAgaWYgKCFwYXJhbXMucHJlYnVpbGRUeC50eFJlcXVlc3RJZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbnNvbGlkYXRpb24gcmVxdWVzdCBtaXNzaW5nIHR4UmVxdWVzdElkLicpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZW5kTWFueVR4UmVxdWVzdHMocGFyYW1zKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaWduZWRQcmVidWlsZCA9IChhd2FpdCB0aGlzLnByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uKHBhcmFtcykpIGFzIGFueTtcblxuICAgIC8vIGRlY29yYXRlIHdpdGggb3VyIGNvbnNvbGlkYXRpb24gaWRcbiAgICBzaWduZWRQcmVidWlsZC5jb25zb2xpZGF0ZUlkID0gcGFyYW1zLnByZWJ1aWxkVHguY29uc29saWRhdGVJZDtcblxuICAgIGRlbGV0ZSBzaWduZWRQcmVidWlsZC53YWxsZXQ7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihzaWduZWRQcmVidWlsZCwgcGFyYW1zLnJlcUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYW5kIHNlbmRzIGEgc2V0IG9mIGFjY291bnQgY29uc29saWRhdGlvbnMuIFRoaXMgaXMgaW50ZW5kZWQgdG8gZmx1c2ggbWFueSBiYWxhbmNlcyB0byB0aGUgcm9vdCB3YWxsZXQgYmFsYW5jZS5cbiAgICogQHBhcmFtIHBhcmFtcyAtXG4gICAqICAgICBjb25zb2xpZGF0ZUFkZHJlc3NlcyAtIHRoZXNlIGFyZSB0aGUgb24tY2hhaW4gcmVjZWl2ZSBhZGRyZXNzZXMgd2Ugd2FudCB0byBwaWNrIGEgY29uc29saWRhdGlvbiBhbW91bnQgZnJvbVxuICAgKi9cbiAgYXN5bmMgc2VuZEFjY291bnRDb25zb2xpZGF0aW9ucyhwYXJhbXM6IEJ1aWxkQ29uc29saWRhdGlvblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4uYWxsb3dzQWNjb3VudENvbnNvbGlkYXRpb25zKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9IGRvZXMgbm90IGFsbG93IGFjY291bnQgY29uc29saWRhdGlvbnMuYCk7XG4gICAgfVxuXG4gICAgY29uc3QgYXBpVmVyc2lvbiA9XG4gICAgICBwYXJhbXMuYXBpVmVyc2lvbiA/P1xuICAgICAgKHRoaXMudHNzVXRpbHMgJiYgdGhpcy50c3NVdGlscy5zdXBwb3J0ZWRUeFJlcXVlc3RWZXJzaW9ucygpLmluY2x1ZGVzKCdmdWxsJykgPyAnZnVsbCcgOiB1bmRlZmluZWQpO1xuXG4gICAgLy8gRG9pbmcgYSBzYW5pdHkgY2hlY2sgZm9yIHBhc3N3b3JkIGhlcmUgdG8gYXZvaWQgZG9pbmcgZnVydGhlciB3b3JrIGlmIHdlIGtub3cgaXQncyB3cm9uZ1xuICAgIGF3YWl0IHRoaXMuZ2V0S2V5Y2hhaW5zQW5kVmFsaWRhdGVQYXNzcGhyYXNlKHtcbiAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIGN1c3RvbVNpZ25pbmdGdW5jdGlvbjogcGFyYW1zLmN1c3RvbVNpZ25pbmdGdW5jdGlvbixcbiAgICB9KTtcblxuICAgIC8vIHRoaXMgZ2l2ZXMgdXMgYSBzZXQgb2YgYWNjb3VudCBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9uc1xuICAgIGNvbnN0IHVuc2lnbmVkQnVpbGRzID0gYXdhaXQgdGhpcy5idWlsZEFjY291bnRDb25zb2xpZGF0aW9ucyh7XG4gICAgICAuLi5wYXJhbXMsXG4gICAgICBhcGlWZXJzaW9uOiBhcGlWZXJzaW9uLFxuICAgIH0pO1xuICAgIGlmICh1bnNpZ25lZEJ1aWxkcyAmJiB1bnNpZ25lZEJ1aWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBHZXQgd2FsbGV0J3MgYmFzZSBhZGRyZXNzIHRvIHZhbGlkYXRlIGRlc3RpbmF0aW9uIGFkZHJlc3Nlc1xuICAgICAgY29uc3QgYmFzZUFkZHJlc3MgPSB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljPy5iYXNlQWRkcmVzcyB8fCB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljPy5yb290QWRkcmVzcztcbiAgICAgIC8vIFZhbGlkYXRlIGFsbCB0cmFuc2FjdGlvbnNcbiAgICAgIGZvciAoY29uc3QgYnVpbGQgb2YgdW5zaWduZWRCdWlsZHMpIHtcbiAgICAgICAgaWYgKGJhc2VBZGRyZXNzKSB7XG4gICAgICAgICAgZGVidWcoJ3ZlcmlmeWluZyB0eEhleCcsIEpTT04uc3RyaW5naWZ5KGJ1aWxkKSk7XG4gICAgICAgICAgLy9WZXJpZnkgdHJhbnNhY3Rpb25zIHNlbmQgZnVuZHMgdG8gdGhlIGJhc2UgYWRkcmVzc1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICEoYXdhaXQgdGhpcy5iYXNlQ29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgICAgIHR4UHJlYnVpbGQ6IGJ1aWxkLFxuICAgICAgICAgICAgICB0eFBhcmFtczogcGFyYW1zLFxuICAgICAgICAgICAgICB2ZXJpZmljYXRpb246IHtcbiAgICAgICAgICAgICAgICBjb25zb2xpZGF0aW9uVG9CYXNlQWRkcmVzczogdHJ1ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgd2FsbGV0OiB0aGlzLFxuICAgICAgICAgICAgICB3YWxsZXRUeXBlOiB0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlLFxuICAgICAgICAgICAgfSkpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIG91dHB1dCB0aGF0IGRvZXMgbm90IGNvbnNvbGlkYXRlIGZ1bmRzIHRvIGJhc2UgYWRkcmVzcycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3Qgc3VjY2Vzc2Z1bFR4czogYW55W10gPSBbXTtcbiAgICAgIGNvbnN0IGZhaWxlZFR4czogeyBtZXNzYWdlOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdW5zaWduZWRCdWlsZCBvZiB1bnNpZ25lZEJ1aWxkcykge1xuICAgICAgICAvLyBmb2xkIGFueSBvZiB0aGUgcGFyYW1ldGVycyB3ZSB1c2VkIHRvIGJ1aWxkIHRoaXMgdHJhbnNhY3Rpb24gaW50byB0aGUgdW5zaWduZWRCdWlsZFxuICAgICAgICBjb25zdCB1bnNpZ25lZEJ1aWxkV2l0aE9wdGlvbnM6IFByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHBhcmFtcyk7XG4gICAgICAgIHVuc2lnbmVkQnVpbGRXaXRoT3B0aW9ucy5hcGlWZXJzaW9uID0gYXBpVmVyc2lvbjtcbiAgICAgICAgdW5zaWduZWRCdWlsZFdpdGhPcHRpb25zLnByZWJ1aWxkVHggPSB1bnNpZ25lZEJ1aWxkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHNlbmRUeCA9IGF3YWl0IHRoaXMuc2VuZEFjY291bnRDb25zb2xpZGF0aW9uKHVuc2lnbmVkQnVpbGRXaXRoT3B0aW9ucyk7XG4gICAgICAgICAgc3VjY2Vzc2Z1bFR4cy5wdXNoKHNlbmRUeCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBmYWlsZWRUeHMucHVzaCh7IG1lc3NhZ2U6IGUubWVzc2FnZSwgbmFtZTogZS5uYW1lIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IHN1Y2Nlc3NmdWxUeHMsXG4gICAgICAgIGZhaWx1cmU6IGZhaWxlZFR4cyxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHNldCBvZiB0cmFuc2FjdGlvbnMgdGhhdCBlbmFibGVzIHRoZSBzcGVjaWZpZWQgdG9rZW5zXG4gICAqIEBwYXJhbSBwYXJhbXMgLVxuICAgKiAgICBlbmFibGVUb2tlbnM6IFRva2VuIGVuYWJsZW1lbnQgb3BlcmF0aW9ucyB3ZSB3YW50IHRvIHBlcmZvcm1cbiAgICogQHJldHVybnMgVW5zaWduZWQgdHJhbnNhY3Rpb25zIHRoYXQgZW5hYmxlcyB0aGUgc3BlY2lmaWVkIHRva2Vuc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGJ1aWxkVG9rZW5FbmFibGVtZW50cyhcbiAgICBwYXJhbXM6IEJ1aWxkVG9rZW5FbmFibGVtZW50T3B0aW9ucyA9IHsgZW5hYmxlVG9rZW5zOiBbXSB9XG4gICk6IFByb21pc2U8UHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdFtdPiB7XG4gICAgY29uc3QgdGVDb25maWcgPSB0aGlzLmJhc2VDb2luLmdldFRva2VuRW5hYmxlbWVudENvbmZpZygpO1xuICAgIGlmICghdGVDb25maWcucmVxdWlyZXNUb2tlbkVuYWJsZW1lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9IGRvZXMgbm90IHJlcXVpcmUgdG9rZW4gZW5hYmxlbWVudHNgKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB3YWxsZXQgdHlwZSBpZiBjb2luIHJlcXVpcmVzIGl0XG4gICAgaWYgKHR5cGVvZiB0ZUNvbmZpZy52YWxpZGF0ZVdhbGxldCA9PT0gJ2Z1bmN0aW9uJyAmJiB0aGlzLl93YWxsZXQudHlwZSkge1xuICAgICAgdGVDb25maWcudmFsaWRhdGVXYWxsZXQodGhpcy5fd2FsbGV0LnR5cGUpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuZW5hYmxlVG9rZW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyB0b2tlbnMgYXJlIGJlaW5nIHNwZWNpZmllZCcpO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLnJlY2lwaWVudHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuIG5vdCBzcGVjaWZ5IHJlY2lwaWVudHMgZm9yIHRva2VuIGVuYWJsZW1lbnQgdHJhbnNhY3Rpb25zJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5yZXFJZCkge1xuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCk7XG4gICAgfVxuXG4gICAgLy8gU3BsaXQgcXVlcnkgaWYgd2UgY2FuJ3QgZW5hYmxlIG11bHRpcGxlIHRva2VucyBpbiBvbmUgdHhcbiAgICBpZiAoIXRlQ29uZmlnLnN1cHBvcnRzTXVsdGlwbGVUb2tlbkVuYWJsZW1lbnRzICYmIHBhcmFtcy5lbmFibGVUb2tlbnMubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3QgcXVlcmllcyA9IHBhcmFtcy5lbmFibGVUb2tlbnMubWFwKGFzeW5jIChlbmFibGVUb2tlbikgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5idWlsZFRva2VuRW5hYmxlbWVudHMoe1xuICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgICBlbmFibGVUb2tlbnM6IFtlbmFibGVUb2tlbl0sXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwocXVlcmllcyk7XG4gICAgICByZXR1cm4gcmVzdWx0cy5mbGF0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgYnVpbGRQYXJhbXM6IFByZWJ1aWxkVHJhbnNhY3Rpb25PcHRpb25zID0gXy5waWNrKHBhcmFtcywgdGhpcy5wcmVidWlsZFdoaXRlbGlzdGVkUGFyYW1zKCkpO1xuICAgIGlmICghYnVpbGRQYXJhbXMudHlwZSkge1xuICAgICAgYnVpbGRQYXJhbXMudHlwZSA9ICdlbmFibGV0b2tlbic7XG4gICAgfVxuICAgIC8vIENoZWNrIGlmIHdlIGJ1aWxkIHdpdGggaW50ZW50XG4gICAgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnKSB7XG4gICAgICByZXR1cm4gW2F3YWl0IHRoaXMucHJlYnVpbGRUcmFuc2FjdGlvbihidWlsZFBhcmFtcyldO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZXdyaXRlIHRva2VucyBpbnRvIHJlY2lwaWVudHMgZm9yIGJ1aWxkVHJhbnNhY3Rpb25cbiAgICAgIGJ1aWxkUGFyYW1zLnJlY2lwaWVudHMgPSBwYXJhbXMuZW5hYmxlVG9rZW5zLm1hcCgodG9rZW4pID0+IHtcbiAgICAgICAgLy8gSWYgdG9rZW4gaGFzIG5vbiBhZGRyZXNzLCB0YWtlIHRoZSBmaXJzdCB3YWxsZXQgYWRkcmVzcyBpcyBzdG9yZWQgaW4gaXRzIGNvaW4tc3BlY2lmaWMgcHJvcGVydHlcbiAgICAgICAgLy8gSW4gYWNjb3VudC1iYXNlZCBjb2luIGltcGxlbWVudGF0aW9ucyB0aGF0IHVzZSB3YWxsZXQgY29udHJhY3RzLCB0aGUgYWRkcmVzcyBpcyBjYWxsZWQgYmFzZUFkZHJlc3MgKGUuZy4gZXRoLWxpa2UsIHh0eilcbiAgICAgICAgLy8gZm9yIG90aGVycyBpdCdzIGNhbGxlZCByb290QWRkcmVzcyAoZS5nLiB4cnAsIHhsbSwgYWxnbywgdHJ4KVxuICAgICAgICBjb25zdCBhZGRyZXNzID1cbiAgICAgICAgICB0b2tlbi5hZGRyZXNzIHx8IHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWM/LmJhc2VBZGRyZXNzIHx8IHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWM/LnJvb3RBZGRyZXNzO1xuICAgICAgICBpZiAoIWFkZHJlc3MpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dhbGxldCBkb2VzIG5vdCBoYXZlIGJhc2UgYWRkcmVzcywgbXVzdCBzcGVjaWZ5IHdpdGggdG9rZW4gcGFyYW0nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRva2VuTmFtZTogdG9rZW4ubmFtZSxcbiAgICAgICAgICBhZGRyZXNzLFxuICAgICAgICAgIGFtb3VudDogJzAnLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICBkZWxldGUgYnVpbGRQYXJhbXMuZW5hYmxlVG9rZW5zO1xuICAgICAgY29uc3QgcHJlYnVpbGRUeCA9IGF3YWl0IHRoaXMucHJlYnVpbGRUcmFuc2FjdGlvbihidWlsZFBhcmFtcyk7XG4gICAgICBwcmVidWlsZFR4LmJ1aWxkUGFyYW1zID0gYnVpbGRQYXJhbXM7XG4gICAgICByZXR1cm4gW3ByZWJ1aWxkVHhdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgd2FsbGV0IGluaXRpYWxpemF0aW9uXG4gICAqIEBwYXJhbSB7UHJlYnVpbGRUcmFuc2FjdGlvbk9wdGlvbnN9IHBhcmFtc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0Pn1cbiAgICovXG4gIHB1YmxpYyBhc3luYyBidWlsZFdhbGxldEluaXRpYWxpemF0aW9uKHBhcmFtczogUHJlYnVpbGRUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQ+IHtcbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4ucmVxdWlyZXNXYWxsZXRJbml0aWFsaXphdGlvblRyYW5zYWN0aW9uKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgV2FsbGV0IGluaXRpYWxpemF0aW9uIGlzIG5vdCByZXF1aXJlZCBmb3IgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9YCk7XG4gICAgfVxuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlICE9PSAndHNzJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdXYWxsZXQgaW5pdGlhbGl6YXRpb24gdHJhbnNhY3Rpb24gaXMgb25seSBzdXBwb3J0ZWQgZm9yIFRTUyB3YWxsZXRzJyk7XG4gICAgfVxuICAgIGlmIChwYXJhbXMucmVxSWQpIHtcbiAgICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQpO1xuICAgIH1cbiAgICBjb25zdCBidWlsZFBhcmFtczogUHJlYnVpbGRUcmFuc2FjdGlvbk9wdGlvbnMgPSBfLnBpY2socGFyYW1zLCB0aGlzLnByZWJ1aWxkV2hpdGVsaXN0ZWRQYXJhbXMoKSk7XG4gICAgaWYgKCFidWlsZFBhcmFtcy50eXBlKSB7XG4gICAgICBidWlsZFBhcmFtcy50eXBlID0gJ2NyZWF0ZUFjY291bnQnO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcmVidWlsZFRyYW5zYWN0aW9uKGJ1aWxkUGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBhbmQgc2VuZHMgYSBzaW5nbGUgdW5zaWduZWQgdG9rZW4gZW5hYmxlbWVudCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zXG4gICAqICAgLSBUaGUgcmVzcG9uc2UgZnJvbSBzZW5kaW5nIHRoZSB0cmFuc2FjdGlvbiBmb3IgaG90L2NvbGQgd2FsbGV0c1xuICAgKiAgIC0gVGhlIHJlc3BvbnNlIGZyb20gaW5pdGlhdGluZyB0aGUgdHJhbnNhY3Rpb24gZm9yIGN1c3RvZGlhbCB3YWxsZXRzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2VuZFRva2VuRW5hYmxlbWVudChwYXJhbXM6IFByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCB0ZUNvbmZpZyA9IHRoaXMuYmFzZUNvaW4uZ2V0VG9rZW5FbmFibGVtZW50Q29uZmlnKCk7XG4gICAgcGFyYW1zLnZlcmlmaWNhdGlvbiA9IHBhcmFtcy52ZXJpZmljYXRpb24gPz8ge307XG4gICAgcGFyYW1zLnZlcmlmaWNhdGlvbi52ZXJpZnlUb2tlbkVuYWJsZW1lbnQgPSBwYXJhbXMudmVyaWZpY2F0aW9uLnZlcmlmeVRva2VuRW5hYmxlbWVudCA/PyB0cnVlO1xuICAgIGlmICghdGVDb25maWcucmVxdWlyZXNUb2tlbkVuYWJsZW1lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9IGRvZXMgbm90IHJlcXVpcmUgdG9rZW4gZW5hYmxlbWVudCB0cmFuc2FjdGlvbnNgKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB3YWxsZXQgdHlwZSBpZiBjb2luIHJlcXVpcmVzIGl0XG4gICAgaWYgKHRlQ29uZmlnLnZhbGlkYXRlV2FsbGV0ICYmIHRoaXMuX3dhbGxldC50eXBlKSB7XG4gICAgICB0ZUNvbmZpZy52YWxpZGF0ZVdhbGxldCh0aGlzLl93YWxsZXQudHlwZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwYXJhbXMucHJlYnVpbGRUeCA9PT0gJ3N0cmluZycgfHwgcGFyYW1zLnByZWJ1aWxkVHg/LmJ1aWxkUGFyYW1zPy50eXBlICE9PSAnZW5hYmxldG9rZW4nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYnVpbGQgb2YgdG9rZW4gZW5hYmxlbWVudC4nKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSA9PT0gJ3RzcycpIHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNlbmRNYW55VHhSZXF1ZXN0cyhwYXJhbXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzd2l0Y2ggKHRoaXMuX3dhbGxldC50eXBlKSB7XG4gICAgICAgIGNhc2UgJ2hvdCc6XG4gICAgICAgIGNhc2UgJ2NvbGQnOlxuICAgICAgICAgIGNvbnN0IHNpZ25lZFByZWJ1aWxkID0gYXdhaXQgdGhpcy5wcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbihwYXJhbXMpO1xuICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKHNpZ25lZFByZWJ1aWxkLCBwYXJhbXMucmVxSWQpO1xuICAgICAgICBjYXNlICdjdXN0b2RpYWwnOlxuICAgICAgICBjYXNlICdiYWNraW5nJzpcbiAgICAgICAgICByZXR1cm4gdGhpcy5pbml0aWF0ZVRyYW5zYWN0aW9uKHBhcmFtcy5wcmVidWlsZFR4LmJ1aWxkUGFyYW1zLCBwYXJhbXMucmVxSWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTb21lIGNoYWlucyByZXF1aXJlIHRva2VucyB0byBiZSBlbmFibGVkIGJlZm9yZSB0aGV5IGNhbiBiZSByZWNlaXZlZC9zZW50LlxuICAgKiBUaGlzIGlzIGEgZGVkaWNhdGVkIGZ1bmN0aW9uIHRoYXQgZW5hYmxlcyB0b2tlbnMuXG4gICAqXG4gICAqIEJ1aWxkcywgc2lnbnMsIGFuZCBzZW5kcyBhIHNldCBvZiB0cmFuc2FjdGlvbnMgdGhhdCBlbmFibGVzIHRoZSBzcGVjaWZpZWQgdG9rZW5zXG4gICAqIEBwYXJhbSBwYXJhbXMgLVxuICAgKiAgICBlbmFibGVUb2tlbnM6IFRva2VuIGVuYWJsZW1lbnQgb3BlcmF0aW9ucyB3ZSB3YW50IHRvIHBlcmZvcm1cbiAgICogQHJldHVyblxuICAgKiAgICBzdWNjZXNzOiBTdWNjZXNzZnVsIHJlc3BvbnNlcyBmcm9tIHNlbmRUb2tlbkVuYWJsZW1lbnRcbiAgICogICAgZmFpbHVyZTogRXJyb3JzIGZyb20gZmFpbGVkIHRyYW5zYWN0aW9uc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlbmRUb2tlbkVuYWJsZW1lbnRzKHBhcmFtczogQnVpbGRUb2tlbkVuYWJsZW1lbnRPcHRpb25zID0geyBlbmFibGVUb2tlbnM6IFtdIH0pOiBQcm9taXNlPHtcbiAgICBzdWNjZXNzOiBhbnlbXTtcbiAgICBmYWlsdXJlOiBFcnJvcltdO1xuICB9PiB7XG4gICAgY29uc3QgdW5zaWduZWRCdWlsZHMgPSBhd2FpdCB0aGlzLmJ1aWxkVG9rZW5FbmFibGVtZW50cyhwYXJhbXMpO1xuXG4gICAgY29uc3Qgc3VjY2Vzc2Z1bFR4czogYW55W10gPSBbXTtcbiAgICBjb25zdCBmYWlsZWRUeHMgPSBuZXcgQXJyYXk8RXJyb3I+KCk7XG4gICAgZm9yIChjb25zdCB1bnNpZ25lZEJ1aWxkIG9mIHVuc2lnbmVkQnVpbGRzKSB7XG4gICAgICBjb25zdCB1bnNpZ25lZEJ1aWxkV2l0aE9wdGlvbnM6IFByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IHtcbiAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICBwcmVidWlsZFR4OiB1bnNpZ25lZEJ1aWxkLFxuICAgICAgfTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHNlbmRUeCA9IGF3YWl0IHRoaXMuc2VuZFRva2VuRW5hYmxlbWVudCh1bnNpZ25lZEJ1aWxkV2l0aE9wdGlvbnMpO1xuICAgICAgICBzdWNjZXNzZnVsVHhzLnB1c2goc2VuZFR4KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgZmFpbGVkVHhzLnB1c2goZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHN1Y2Nlc3NmdWxUeHMsXG4gICAgICBmYWlsdXJlOiBmYWlsZWRUeHMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY2hhaW4gY2FudG9uLCByZXF1aXJlcyB0aGUgd2FsbGV0IHRvIGJlIGluaXRpYWxpemVkIGJ5IHNlbmRpbmcgb3V0IGEgdHJhbnNhY3Rpb25cbiAgICogdG8gYmUgb25ib2FyZGVkIG9udG8gdGhlIHZhbGlkYXRvci5cbiAgICogQnVpbGRzLCBTaWducyBhbmQgc2VuZHMgYSB0cmFuc2FjdGlvbiB0aGF0IGluaXRpYWxpemVzIHRoZSBjYW50b24gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZW5kV2FsbGV0SW5pdGlhbGl6YXRpb24ocGFyYW1zOiBQcmVidWlsZFRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxXYWxsZXRJbml0UmVzdWx0PiB7XG4gICAgY29uc3QgcHJlYnVpbGRUeCA9IGF3YWl0IHRoaXMuYnVpbGRXYWxsZXRJbml0aWFsaXphdGlvbihwYXJhbXMpO1xuICAgIGNvbnN0IHVuc2lnbmVkQnVpbGRXaXRoT3B0aW9uczogUHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgcHJlYnVpbGRUeCxcbiAgICB9O1xuICAgIGNvbnN0IHN1Y2Nlc3NmdWxUeHM6IFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHRbXSA9IFtdO1xuICAgIGNvbnN0IGZhaWxlZFR4cyA9IG5ldyBBcnJheTxFcnJvcj4oKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2VuZFR4ID0gYXdhaXQgdGhpcy5zZW5kTWFueVR4UmVxdWVzdHModW5zaWduZWRCdWlsZFdpdGhPcHRpb25zKTtcbiAgICAgIHN1Y2Nlc3NmdWxUeHMucHVzaChzZW5kVHgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGZhaWxlZFR4cy5wdXNoKGUpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2Vzczogc3VjY2Vzc2Z1bFR4cyxcbiAgICAgIGZhaWx1cmU6IGZhaWxlZFR4cyxcbiAgICB9O1xuICB9XG5cbiAgLyogTUFSSzogVFNTIEhlbHBlcnMgKi9cblxuICAvKipcbiAgICogUHJlYnVpbGRzIGEgdHJhbnNhY3Rpb24gZm9yIGEgVFNTIHdhbGxldC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyBwcmVidWlsZCB0cmFuc2FjdGlvbiBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByZWJ1aWxkVHJhbnNhY3Rpb25UeFJlcXVlc3RzKFxuICAgIHBhcmFtczogUHJlYnVpbGRUcmFuc2FjdGlvbk9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQ+IHtcbiAgICBjb25zdCByZXFJZCA9IHBhcmFtcy5yZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG4gICAgY29uc3QgYXBpVmVyc2lvbiA9IGdldFR4UmVxdWVzdEFwaVZlcnNpb24odGhpcywgcGFyYW1zLmFwaVZlcnNpb24pO1xuICAgIC8vIFR3byBvcHRpb25zIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMgb2YgZmVlcyBzZWVtcyB0byBub3cgYmUgc3VwcG9ydGVkLCBmb3Igbm93IHdlIHdpbGwgc3VwcG9ydCBib3RoIHRvIGJlIGJhY2t3YXJkcyBjb21wYXRpYmxlXG4gICAgLy8gVE9ETyhCRy01OTY4NSk6IGRlcHJlY2F0ZSBvbmUgb2YgdGhlc2Ugc28gdGhhdCB3ZSBoYXZlIGEgc2luZ2xlIHdheSB0byBwYXNzIGZlZXNcbiAgICBsZXQgZmVlT3B0aW9ucztcbiAgICBpZiAocGFyYW1zLmZlZU9wdGlvbnMpIHtcbiAgICAgIGZlZU9wdGlvbnMgPSBwYXJhbXMuZmVlVG9rZW4gPyB7IC4uLnBhcmFtcy5mZWVPcHRpb25zLCBmZWVUb2tlbjogcGFyYW1zLmZlZVRva2VuIH0gOiBwYXJhbXMuZmVlT3B0aW9ucztcbiAgICB9IGVsc2UgaWYgKHBhcmFtcy5nYXNQcmljZSAhPT0gdW5kZWZpbmVkIHx8IHBhcmFtcy5laXAxNTU5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZlZU9wdGlvbnMgPVxuICAgICAgICBwYXJhbXMuZ2FzUHJpY2UgIT09IHVuZGVmaW5lZFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBnYXNQcmljZTogcGFyYW1zLmdhc1ByaWNlLFxuICAgICAgICAgICAgICBnYXNMaW1pdDogcGFyYW1zLmdhc0xpbWl0LFxuICAgICAgICAgICAgICAuLi4ocGFyYW1zLmZlZVRva2VuICE9PSB1bmRlZmluZWQgJiYgeyBmZWVUb2tlbjogcGFyYW1zLmZlZVRva2VuIH0pLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBtYXhGZWVQZXJHYXM6IE51bWJlcihwYXJhbXMuZWlwMTU1OT8ubWF4RmVlUGVyR2FzKSxcbiAgICAgICAgICAgICAgbWF4UHJpb3JpdHlGZWVQZXJHYXM6IE51bWJlcihwYXJhbXMuZWlwMTU1OT8ubWF4UHJpb3JpdHlGZWVQZXJHYXMpLFxuICAgICAgICAgICAgICBnYXNMaW1pdDogcGFyYW1zLmdhc0xpbWl0LFxuICAgICAgICAgICAgICAuLi4ocGFyYW1zLmZlZVRva2VuICE9PSB1bmRlZmluZWQgJiYgeyBmZWVUb2tlbjogcGFyYW1zLmZlZVRva2VuIH0pLFxuICAgICAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHBhcmFtcy5mZWVUb2tlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBmZWVPcHRpb25zID0geyBmZWVUb2tlbjogcGFyYW1zLmZlZVRva2VuIH07XG4gICAgfSBlbHNlIGlmIChwYXJhbXMuZ2FzTGltaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZmVlT3B0aW9ucyA9IHsgZ2FzTGltaXQ6IHBhcmFtcy5nYXNMaW1pdCB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBmZWVPcHRpb25zID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGxldCB0eFJlcXVlc3Q6IFR4UmVxdWVzdDtcbiAgICBzd2l0Y2ggKHBhcmFtcy50eXBlKSB7XG4gICAgICBjYXNlICd0cmFuc2Zlcic6XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnByZWJ1aWxkVHhXaXRoSW50ZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgICAgaW50ZW50VHlwZTogJ3BheW1lbnQnLFxuICAgICAgICAgICAgc2VxdWVuY2VJZDogcGFyYW1zLnNlcXVlbmNlSWQsXG4gICAgICAgICAgICBjb21tZW50OiBwYXJhbXMuY29tbWVudCxcbiAgICAgICAgICAgIHJlY2lwaWVudHM6IHBhcmFtcy5yZWNpcGllbnRzIHx8IFtdLFxuICAgICAgICAgICAgbWVtbzogcGFyYW1zLm1lbW8sXG4gICAgICAgICAgICBub25jZTogcGFyYW1zLm5vbmNlLFxuICAgICAgICAgICAgZmVlT3B0aW9ucyxcbiAgICAgICAgICAgIGZlZVRva2VuOiBwYXJhbXMuZmVlVG9rZW4sXG4gICAgICAgICAgICBjdXN0b2RpYW5UcmFuc2FjdGlvbklkOiBwYXJhbXMuY3VzdG9kaWFuVHJhbnNhY3Rpb25JZCxcbiAgICAgICAgICAgIHVuc3BlbnRzOiBwYXJhbXMudW5zcGVudHMsXG4gICAgICAgICAgICBzZW5kZXJBZGRyZXNzOiBwYXJhbXMuc2VuZGVyQWRkcmVzcyxcbiAgICAgICAgICAgIGlzVGVzdFRyYW5zYWN0aW9uOiBwYXJhbXMuaXNUZXN0VHJhbnNhY3Rpb24sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcGlWZXJzaW9uLFxuICAgICAgICAgIHBhcmFtcy5wcmV2aWV3XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndHJhbnNmZXJ0b2tlbic6XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnByZWJ1aWxkVHhXaXRoSW50ZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgICAgaXNUc3M6IHBhcmFtcy5pc1RzcyxcbiAgICAgICAgICAgIGludGVudFR5cGU6ICd0cmFuc2ZlclRva2VuJyxcbiAgICAgICAgICAgIHJlY2lwaWVudHM6IHBhcmFtcy5yZWNpcGllbnRzIHx8IFtdLFxuICAgICAgICAgICAgbm9uY2U6IHBhcmFtcy5ub25jZSxcbiAgICAgICAgICAgIGZlZU9wdGlvbnMsXG4gICAgICAgICAgICBmZWVUb2tlbjogcGFyYW1zLmZlZVRva2VuLFxuICAgICAgICAgICAgdW5zcGVudHM6IHBhcmFtcy51bnNwZW50cyxcbiAgICAgICAgICAgIHNlcXVlbmNlSWQ6IHBhcmFtcy5zZXF1ZW5jZUlkLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBpVmVyc2lvbixcbiAgICAgICAgICBwYXJhbXMucHJldmlld1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2VuYWJsZXRva2VuJzpcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEucHJlYnVpbGRUeFdpdGhJbnRlbnQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgICBpbnRlbnRUeXBlOiAnZW5hYmxlVG9rZW4nLFxuICAgICAgICAgICAgcmVjaXBpZW50czogcGFyYW1zLnJlY2lwaWVudHMgfHwgW10sXG4gICAgICAgICAgICBlbmFibGVUb2tlbnM6IHBhcmFtcy5lbmFibGVUb2tlbnMsXG4gICAgICAgICAgICBtZW1vOiBwYXJhbXMubWVtbyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFwaVZlcnNpb24sXG4gICAgICAgICAgcGFyYW1zLnByZXZpZXdcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjbG9zZUFzc29jaWF0ZWRUb2tlbkFjY291bnQnOlxuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5wcmVidWlsZFR4V2l0aEludGVudChcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXFJZCxcbiAgICAgICAgICAgIGludGVudFR5cGU6ICdjbG9zZUFzc29jaWF0ZWRUb2tlbkFjY291bnQnLFxuICAgICAgICAgICAgcmVjaXBpZW50czogcGFyYW1zLnJlY2lwaWVudHMgfHwgW10sXG4gICAgICAgICAgICBtZW1vOiBwYXJhbXMubWVtbyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFwaVZlcnNpb24sXG4gICAgICAgICAgcGFyYW1zLnByZXZpZXdcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhY2NlbGVyYXRpb24nOlxuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5wcmVidWlsZFR4V2l0aEludGVudChcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXFJZCxcbiAgICAgICAgICAgIGludGVudFR5cGU6ICdhY2NlbGVyYXRpb24nLFxuICAgICAgICAgICAgY29tbWVudDogcGFyYW1zLmNvbW1lbnQsXG4gICAgICAgICAgICBsb3dGZWVUeGlkOiBwYXJhbXMubG93RmVlVHhpZCxcbiAgICAgICAgICAgIHJlY2VpdmVBZGRyZXNzOiBwYXJhbXMucmVjZWl2ZUFkZHJlc3MsXG4gICAgICAgICAgICBmZWVPcHRpb25zLFxuICAgICAgICAgICAgZmVlVG9rZW46IHBhcmFtcy5mZWVUb2tlbixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFwaVZlcnNpb24sXG4gICAgICAgICAgcGFyYW1zLnByZXZpZXdcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdmaWxsTm9uY2UnOlxuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5wcmVidWlsZFR4V2l0aEludGVudChcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXFJZCxcbiAgICAgICAgICAgIGludGVudFR5cGU6ICdmaWxsTm9uY2UnLFxuICAgICAgICAgICAgY29tbWVudDogcGFyYW1zLmNvbW1lbnQsXG4gICAgICAgICAgICBub25jZTogcGFyYW1zLm5vbmNlLFxuICAgICAgICAgICAgcmVjZWl2ZUFkZHJlc3M6IHBhcmFtcy5yZWNlaXZlQWRkcmVzcyxcbiAgICAgICAgICAgIGZlZU9wdGlvbnMsXG4gICAgICAgICAgICBmZWVUb2tlbjogcGFyYW1zLmZlZVRva2VuLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBpVmVyc2lvbixcbiAgICAgICAgICBwYXJhbXMucHJldmlld1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3Rva2VuQXBwcm92YWwnOlxuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5wcmVidWlsZFR4V2l0aEludGVudChcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXFJZCxcbiAgICAgICAgICAgIGludGVudFR5cGU6ICd0b2tlbkFwcHJvdmFsJyxcbiAgICAgICAgICAgIHRva2VuTmFtZTogcGFyYW1zLnRva2VuTmFtZSxcbiAgICAgICAgICAgIGZlZVRva2VuOiBwYXJhbXMuZmVlVG9rZW4sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcGlWZXJzaW9uLFxuICAgICAgICAgIHBhcmFtcy5wcmV2aWV3XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY3JlYXRlQWNjb3VudCc6XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnByZWJ1aWxkVHhXaXRoSW50ZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgICAgaW50ZW50VHlwZTogJ2NyZWF0ZUFjY291bnQnLFxuICAgICAgICAgICAgcmVjaXBpZW50czogcGFyYW1zLnJlY2lwaWVudHMgfHwgW10sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcGlWZXJzaW9uLFxuICAgICAgICAgIHBhcmFtcy5wcmV2aWV3XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndHJhbnNmZXJBY2NlcHQnOiB7XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnByZWJ1aWxkVHhXaXRoSW50ZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgICAgaW50ZW50VHlwZTogJ3RyYW5zZmVyQWNjZXB0JyxcbiAgICAgICAgICAgIHR4UmVxdWVzdElkOiBwYXJhbXMudHhSZXF1ZXN0SWQsXG4gICAgICAgICAgICBzZXF1ZW5jZUlkOiBwYXJhbXMudHhSZXF1ZXN0SWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcGlWZXJzaW9uLFxuICAgICAgICAgIHBhcmFtcy5wcmV2aWV3XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAndHJhbnNmZXJSZWplY3QnOiB7XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnByZWJ1aWxkVHhXaXRoSW50ZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgICAgaW50ZW50VHlwZTogJ3RyYW5zZmVyUmVqZWN0JyxcbiAgICAgICAgICAgIHR4UmVxdWVzdElkOiBwYXJhbXMudHhSZXF1ZXN0SWQsXG4gICAgICAgICAgICBzZXF1ZW5jZUlkOiBwYXJhbXMudHhSZXF1ZXN0SWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcGlWZXJzaW9uLFxuICAgICAgICAgIHBhcmFtcy5wcmV2aWV3XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAndHJhbnNmZXJPZmZlcldpdGhkcmF3bic6IHtcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEucHJlYnVpbGRUeFdpdGhJbnRlbnQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgICBpbnRlbnRUeXBlOiAndHJhbnNmZXJPZmZlcldpdGhkcmF3bicsXG4gICAgICAgICAgICB0cmFuc2Zlck9mZmVySWQ6IHBhcmFtcy50cmFuc2Zlck9mZmVySWQsXG4gICAgICAgICAgICBzZXF1ZW5jZUlkOiBwYXJhbXMudHJhbnNmZXJPZmZlcklkLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBpVmVyc2lvbixcbiAgICAgICAgICBwYXJhbXMucHJldmlld1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2N1c3RvbVR4JzpcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEucHJlYnVpbGRUeFdpdGhJbnRlbnQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgICBpbnRlbnRUeXBlOiAnY3VzdG9tVHgnLFxuICAgICAgICAgICAgc2VxdWVuY2VJZDogcGFyYW1zLnNlcXVlbmNlSWQsXG4gICAgICAgICAgICBjb21tZW50OiBwYXJhbXMuY29tbWVudCxcbiAgICAgICAgICAgIHNvbEluc3RydWN0aW9uczogcGFyYW1zLnNvbEluc3RydWN0aW9ucyxcbiAgICAgICAgICAgIHNvbFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YTogcGFyYW1zLnNvbFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSxcbiAgICAgICAgICAgIGFwdG9zQ3VzdG9tVHJhbnNhY3Rpb25QYXJhbXM6IHBhcmFtcy5hcHRvc0N1c3RvbVRyYW5zYWN0aW9uUGFyYW1zLFxuICAgICAgICAgICAgcmVjaXBpZW50czogcGFyYW1zLnJlY2lwaWVudHMgfHwgW10sXG4gICAgICAgICAgICBub25jZTogcGFyYW1zLm5vbmNlLFxuICAgICAgICAgICAgbWVtbzogcGFyYW1zLm1lbW8sXG4gICAgICAgICAgICBmZWVPcHRpb25zLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBpVmVyc2lvbixcbiAgICAgICAgICBwYXJhbXMucHJldmlld1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2JyaWRnZUZ1bmRzJzpcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEucHJlYnVpbGRUeFdpdGhJbnRlbnQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgICBpbnRlbnRUeXBlOiAnYnJpZGdlRnVuZHMnLFxuICAgICAgICAgICAgc2VxdWVuY2VJZDogcGFyYW1zLnNlcXVlbmNlSWQsXG4gICAgICAgICAgICBjb21tZW50OiBwYXJhbXMuY29tbWVudCxcbiAgICAgICAgICAgIGFtb3VudDogcGFyYW1zLmludGVudEFtb3VudCxcbiAgICAgICAgICAgIG5vbmNlOiBwYXJhbXMubm9uY2UsXG4gICAgICAgICAgICBmZWVPcHRpb25zLFxuICAgICAgICAgICAgZmVlVG9rZW46IHBhcmFtcy5mZWVUb2tlbixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFwaVZlcnNpb24sXG4gICAgICAgICAgcGFyYW1zLnByZXZpZXdcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHRyYW5zYWN0aW9uIHR5cGUgbm90IHN1cHBvcnRlZDogJHtwYXJhbXMudHlwZX1gKTtcbiAgICB9XG5cbiAgICBsZXQgdW5zaWduZWRUeDogRWRkc2FVbnNpZ25lZFRyYW5zYWN0aW9uO1xuXG4gICAgaWYgKHR4UmVxdWVzdC5hcGlWZXJzaW9uID09PSAnZnVsbCcpIHtcbiAgICAgIGlmICh0eFJlcXVlc3QudHJhbnNhY3Rpb25zPy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhIHNpbmdsZSB1bnNpZ25lZCB0eCBmb3IgdHggcmVxdWVzdCB3aXRoIGlkOiAke3R4UmVxdWVzdC50eFJlcXVlc3RJZH1gKTtcbiAgICAgIH1cblxuICAgICAgdW5zaWduZWRUeCA9IHR4UmVxdWVzdC50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR4UmVxdWVzdC51bnNpZ25lZFR4cy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhIHNpbmdsZSB1bnNpZ25lZCB0eCBmb3IgdHggcmVxdWVzdCB3aXRoIGlkOiAke3R4UmVxdWVzdC50eFJlcXVlc3RJZH1gKTtcbiAgICAgIH1cbiAgICAgIHVuc2lnbmVkVHggPSB0eFJlcXVlc3QudW5zaWduZWRUeHNbMF07XG4gICAgfVxuXG4gICAgY29uc3Qgd2hpdGVsaXN0ZWRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCB0aGlzLnByZWJ1aWxkV2hpdGVsaXN0ZWRQYXJhbXMoKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdhbGxldElkOiB0aGlzLmlkKCksXG4gICAgICB3YWxsZXQ6IHRoaXMsXG4gICAgICB0eFJlcXVlc3RJZDogdHhSZXF1ZXN0LnR4UmVxdWVzdElkLFxuICAgICAgdHhIZXg6IHVuc2lnbmVkVHguc2VyaWFsaXplZFR4SGV4LFxuICAgICAgYnVpbGRQYXJhbXM6IHdoaXRlbGlzdGVkUGFyYW1zLFxuICAgICAgZmVlSW5mbzogdW5zaWduZWRUeC5mZWVJbmZvLFxuICAgICAgLi4uKHR4UmVxdWVzdC5wZW5kaW5nQXBwcm92YWxJZCAmJiB7XG4gICAgICAgIHBlbmRpbmdBcHByb3ZhbElkOiB0eFJlcXVlc3QucGVuZGluZ0FwcHJvdmFsSWQsXG4gICAgICB9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGEgdHJhbnNhY3Rpb24gZnJvbSBhIFRTUyBFZERTQSB3YWxsZXQgdXNpbmcgZXh0ZXJuYWwgc2lnbmVyLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIHNpZ25pbmcgb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzaWduVHJhbnNhY3Rpb25Uc3NFeHRlcm5hbFNpZ25lckVkRFNBKFxuICAgIHBhcmFtczogV2FsbGV0U2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9LFxuICAgIGNvaW46IElCYXNlQ29pblxuICApOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIGxldCB0eFJlcXVlc3RJZCA9ICcnO1xuICAgIGlmIChwYXJhbXMudHhSZXF1ZXN0SWQpIHtcbiAgICAgIHR4UmVxdWVzdElkID0gcGFyYW1zLnR4UmVxdWVzdElkO1xuICAgIH0gZWxzZSBpZiAocGFyYW1zLnR4UHJlYnVpbGQgJiYgcGFyYW1zLnR4UHJlYnVpbGQudHhSZXF1ZXN0SWQpIHtcbiAgICAgIHR4UmVxdWVzdElkID0gcGFyYW1zLnR4UHJlYnVpbGQudHhSZXF1ZXN0SWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHhSZXF1ZXN0SWQgcmVxdWlyZWQgdG8gc2lnbiBUU1MgdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmN1c3RvbUNvbW1pdG1lbnRHZW5lcmF0aW5nRnVuY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignR2VuZXJhdG9yIGZ1bmN0aW9uIGZvciBjb21taXRtZW50IHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmN1c3RvbVJTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHZW5lcmF0b3IgZnVuY3Rpb24gZm9yIFIgc2hhcmUgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBFeHRlcm5hbCBTaWduZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMuY3VzdG9tR1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dlbmVyYXRvciBmdW5jdGlvbiBmb3IgRyBzaGFyZSByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICBhc3NlcnQodGhpcy50c3NVdGlscywgJ3Rzc1V0aWxzIG11c3QgYmUgZGVmaW5lZCcpO1xuICAgIC8vIGFkZGluZyB0aGlzIHRvIHJlYnVpbGQgdGhlIHRyYW5zYWN0aW9uIGp1c3QgYmVmb3JlIHNpZ25pbmcgZm9yIEVkRFNBIHRyYW5zYWN0aW9uIHVzaW5nIGV4dGVybmFsIHNpZ25lclxuICAgIGNvbnN0IHJlcUlkID0gcGFyYW1zLnJlcUlkIHx8IHVuZGVmaW5lZDtcbiAgICBhd2FpdCB0aGlzLnRzc1V0aWxzLmRlbGV0ZVNpZ25hdHVyZVNoYXJlcyh0eFJlcXVlc3RJZCwgcmVxSWQpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNpZ25lZFR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMuc2lnbkVkZHNhVHNzVXNpbmdFeHRlcm5hbFNpZ25lcihcbiAgICAgICAgdHhSZXF1ZXN0SWQsXG4gICAgICAgIHBhcmFtcy5jdXN0b21Db21taXRtZW50R2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgICAgICBwYXJhbXMuY3VzdG9tUlNoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgICAgICBwYXJhbXMuY3VzdG9tR1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgICAgICByZXFJZFxuICAgICAgKTtcbiAgICAgIHJldHVybiBzaWduZWRUeFJlcXVlc3Q7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmYWlsZWQgdG8gc2lnbiB0cmFuc2FjdGlvbiAnICsgZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGFuZCBzZW5kcyBhIHRyYW5zYWN0aW9uIHJlcXVlc3QgZnJvbSBhIFRTUyAoaG90KSB3YWxsZXQsIG9yIGEgU01DIChjb2xkKSB3YWxsZXQgd2l0aCBhbiBleHRlcm5hbCBzaWduZXIuXG4gICAqIE1lYW50IHRvIGJlIHVzZWQgZm9yIGEgdHJhbnNhY3Rpb24gcmVxdWVzdCB3aGVyZSB0aGUgc2lnbmluZyBwcm9jZXNzIGlzIGFib3J0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogICAgdHhSZXF1ZXN0SWQgLSBUaGUgSUQgb2YgdGhlIHRyYW5zYWN0aW9uIHJlcXVlc3QuXG4gICAqICAgIHdhbGxldFBhc3NwaHJhc2UgLSBUaGUgcGFzc3BocmFzZSBmb3IgdGhlIHdhbGxldC5cbiAgICogICAgaXNUeFJlcXVlc3RGdWxsIC0gRmxhZyBpbmRpY2F0aW5nIGlmIHRoZSB0cmFuc2FjdGlvbiByZXF1ZXN0IGlzIGZ1bGwuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgU2lnbmVkVHJhbnNhY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2lnbkFuZFNlbmRUeFJlcXVlc3QocGFyYW1zOiBTaWduQW5kU2VuZFR4UmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPiB7XG4gICAgaWYgKHBhcmFtcy5pc1R4UmVxdWVzdEZ1bGwpIHtcbiAgICAgIGF3YWl0IHRoaXMudHNzVXRpbHM/LmRlbGV0ZVNpZ25hdHVyZVNoYXJlcyhwYXJhbXMudHhSZXF1ZXN0SWQpO1xuICAgIH1cblxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHRoaXMuZ2V0VXNlcktleUFuZFNpZ25Uc3NUcmFuc2FjdGlvbih7XG4gICAgICB3YWxsZXRQYXNzcGhyYXNlOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIHR4UmVxdWVzdElkOiBwYXJhbXMudHhSZXF1ZXN0SWQsXG4gICAgfSk7XG4gICAgaWYgKCFwYXJhbXMuaXNUeFJlcXVlc3RGdWxsKSB7XG4gICAgICAvLyBJdCBpcyBhc3N1bWVkIHRoYXQgaWYgaXRzIG5vdCBhIGZ1bGwgdHggcmVxdWVzdCwgdGhlbiBpdCBpcyBhIGxpdGUgdHggcmVxdWVzdFxuICAgICAgY29uc3Qgc3VibWl0VHggPSBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhSZXF1ZXN0SWQ6IHBhcmFtcy50eFJlcXVlc3RJZCxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHN1Ym1pdFR4O1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgc2lnbmF0dXJlIHNoYXJlcyBhcmUgaW4gYSBjbGVhbiBzdGF0ZSBiZWZvcmUgc2lnbmluZyBhIHRyYW5zYWN0aW9uLlxuICAgKiBBdXRvbWF0aWNhbGx5IGRlbGV0ZXMgc2lnbmF0dXJlIHNoYXJlcyBmb3IgRnVsbCBUeFJlcXVlc3RzIGJlZm9yZSBzaWduaW5nIHRvIHByZXZlbnRcbiAgICogaXNzdWVzIHdpdGggc3RhbGUgb3IgcGFydGlhbCBzaWduYXR1cmVzLlxuICAgKiBVc2UgdGhpcyBmb3IgRXhwcmVzcyBBUEkgYW5kIG90aGVyIGludGVncmF0aW9ucyB0aGF0IG5lZWQgYXV0b21hdGljIGNsZWFudXAgb2Ygc2lnbmF0dXJlcy5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIHNpZ25pbmcgb3B0aW9uc1xuICAgKiBAcmV0dXJucyBzaWduZWQgdHJhbnNhY3Rpb25cbiAgICovXG4gIHB1YmxpYyBhc3luYyBlbnN1cmVDbGVhblNpZ1NoYXJlc0FuZFNpZ25UcmFuc2FjdGlvbihcbiAgICBwYXJhbXM6IFdhbGxldFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uIHwgVHhSZXF1ZXN0PiB7XG4gICAgY29uc3QgdHhSZXF1ZXN0SWQgPSBwYXJhbXMudHhSZXF1ZXN0SWQgfHwgcGFyYW1zLnR4UHJlYnVpbGQ/LnR4UmVxdWVzdElkO1xuXG4gICAgaWYgKHR4UmVxdWVzdElkICYmIHRoaXMudHNzVXRpbHMgJiYgdGhpcy5tdWx0aXNpZ1R5cGUoKSA9PT0gJ3RzcycpIHtcbiAgICAgIGNvbnN0IHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMuZ2V0VHhSZXF1ZXN0KHR4UmVxdWVzdElkKTtcblxuICAgICAgLy8gQWx3YXlzIGNsZWFuIHNpZ25hdHVyZSBzaGFyZXMgZm9yIEZ1bGwgVHhSZXF1ZXN0cyBiZWZvcmUgc2lnbmluZ1xuICAgICAgY29uc3QgaXNGdWxsID1cbiAgICAgICAgdHhSZXF1ZXN0LmFwaVZlcnNpb24gPT09ICdmdWxsJyAmJlxuICAgICAgICAoKHR4UmVxdWVzdC50cmFuc2FjdGlvbnMgPz8gW10pLmxlbmd0aCA+IDAgfHwgKHR4UmVxdWVzdC5tZXNzYWdlcyA/PyBbXSkubGVuZ3RoID4gMCk7XG5cbiAgICAgIGlmIChpc0Z1bGwpIHtcbiAgICAgICAgYXdhaXQgdGhpcy50c3NVdGlscy5kZWxldGVTaWduYXR1cmVTaGFyZXModHhSZXF1ZXN0SWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNpZ25UcmFuc2FjdGlvbihwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGEgdHJhbnNhY3Rpb24gZnJvbSBhIFRTUyBFQ0RTQSB3YWxsZXQgdXNpbmcgZXh0ZXJuYWwgc2lnbmVyLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIHNpZ25pbmcgb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzaWduVHJhbnNhY3Rpb25Uc3NFeHRlcm5hbFNpZ25lckVDRFNBKFxuICAgIGNvaW46IElCYXNlQ29pbixcbiAgICBwYXJhbXM6IFdhbGxldFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIGxldCB0eFJlcXVlc3RJZCA9ICcnO1xuICAgIGlmIChwYXJhbXMudHhSZXF1ZXN0SWQpIHtcbiAgICAgIHR4UmVxdWVzdElkID0gcGFyYW1zLnR4UmVxdWVzdElkO1xuICAgIH0gZWxzZSBpZiAocGFyYW1zLnR4UHJlYnVpbGQgJiYgcGFyYW1zLnR4UHJlYnVpbGQudHhSZXF1ZXN0SWQpIHtcbiAgICAgIHR4UmVxdWVzdElkID0gcGFyYW1zLnR4UHJlYnVpbGQudHhSZXF1ZXN0SWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHhSZXF1ZXN0SWQgcmVxdWlyZWQgdG8gc2lnbiBUU1MgdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmN1c3RvbVBhaWxsaWVyTW9kdWx1c0dlbmVyYXRpbmdGdW5jdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHZW5lcmF0b3IgZnVuY3Rpb24gZm9yIHBhaWxsaWVyIG1vZHVsdXMgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBFeHRlcm5hbCBTaWduZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMuY3VzdG9tS1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dlbmVyYXRvciBmdW5jdGlvbiBmb3IgSyBzaGFyZSByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5jdXN0b21NdURlbHRhU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignR2VuZXJhdG9yIGZ1bmN0aW9uIGZvciBNdURlbHRhIHNoYXJlIHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmN1c3RvbVNTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHZW5lcmF0b3IgZnVuY3Rpb24gZm9yIFMgc2hhcmUgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBFeHRlcm5hbCBTaWduZXIuJyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGFzc2VydCh0aGlzLnRzc1V0aWxzLCAndHNzVXRpbHMgbXVzdCBiZSBkZWZpbmVkJyk7XG4gICAgICBjb25zdCBzaWduZWRUeFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzLnNpZ25FY2RzYVRzc1VzaW5nRXh0ZXJuYWxTaWduZXIoXG4gICAgICAgIHtcbiAgICAgICAgICB0eFJlcXVlc3Q6IHR4UmVxdWVzdElkLFxuICAgICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKSxcbiAgICAgICAgfSxcbiAgICAgICAgUmVxdWVzdFR5cGUudHgsXG4gICAgICAgIHBhcmFtcy5jdXN0b21QYWlsbGllck1vZHVsdXNHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgICAgIHBhcmFtcy5jdXN0b21LU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgICAgIHBhcmFtcy5jdXN0b21NdURlbHRhU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgICAgIHBhcmFtcy5jdXN0b21TU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb25cbiAgICAgICk7XG4gICAgICByZXR1cm4gc2lnbmVkVHhSZXF1ZXN0O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIHNpZ24gdHJhbnNhY3Rpb24gJyArIGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBhIHRyYW5zYWN0aW9uIGZyb20gYSBUU1MgRUNEU0Egd2FsbGV0IHVzaW5nIGV4dGVybmFsIHNpZ25lci5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyBzaWduaW5nIG9wdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2lnblRyYW5zYWN0aW9uVHNzRXh0ZXJuYWxTaWduZXJFQ0RTQU1QQ3YyKFxuICAgIGNvaW46IElCYXNlQ29pbixcbiAgICBwYXJhbXM6IFdhbGxldFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIGxldCB0eFJlcXVlc3RJZCA9ICcnO1xuICAgIGlmIChwYXJhbXMudHhSZXF1ZXN0SWQpIHtcbiAgICAgIHR4UmVxdWVzdElkID0gcGFyYW1zLnR4UmVxdWVzdElkO1xuICAgIH0gZWxzZSBpZiAocGFyYW1zLnR4UHJlYnVpbGQgJiYgcGFyYW1zLnR4UHJlYnVpbGQudHhSZXF1ZXN0SWQpIHtcbiAgICAgIHR4UmVxdWVzdElkID0gcGFyYW1zLnR4UHJlYnVpbGQudHhSZXF1ZXN0SWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHhSZXF1ZXN0SWQgcmVxdWlyZWQgdG8gc2lnbiBUU1MgdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmN1c3RvbU1QQ3YyU2lnbmluZ1JvdW5kMUdlbmVyYXRpb25GdW5jdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHZW5lcmF0b3IgZnVuY3Rpb24gZm9yIE1QQ3YyIFJvdW5kIDEgc2hhcmUgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBFeHRlcm5hbCBTaWduZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMuY3VzdG9tTVBDdjJTaWduaW5nUm91bmQyR2VuZXJhdGlvbkZ1bmN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dlbmVyYXRvciBmdW5jdGlvbiBmb3IgTVBDdjIgUm91bmQgMiBzaGFyZSByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5jdXN0b21NUEN2MlNpZ25pbmdSb3VuZDNHZW5lcmF0aW9uRnVuY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignR2VuZXJhdG9yIGZ1bmN0aW9uIGZvciBNUEN2MiBSb3VuZCAzIHNoYXJlIHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhc3NlcnQodGhpcy50c3NVdGlscywgJ3Rzc1V0aWxzIG11c3QgYmUgZGVmaW5lZCcpO1xuICAgICAgY29uc3Qgc2lnbmVkVHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscy5zaWduRWNkc2FNUEN2MlRzc1VzaW5nRXh0ZXJuYWxTaWduZXIoXG4gICAgICAgIHtcbiAgICAgICAgICB0eFJlcXVlc3Q6IHR4UmVxdWVzdElkLFxuICAgICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKSxcbiAgICAgICAgfSxcbiAgICAgICAgcGFyYW1zLmN1c3RvbU1QQ3YyU2lnbmluZ1JvdW5kMUdlbmVyYXRpb25GdW5jdGlvbixcbiAgICAgICAgcGFyYW1zLmN1c3RvbU1QQ3YyU2lnbmluZ1JvdW5kMkdlbmVyYXRpb25GdW5jdGlvbixcbiAgICAgICAgcGFyYW1zLmN1c3RvbU1QQ3YyU2lnbmluZ1JvdW5kM0dlbmVyYXRpb25GdW5jdGlvblxuICAgICAgKTtcbiAgICAgIHJldHVybiBzaWduZWRUeFJlcXVlc3Q7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmYWlsZWQgdG8gc2lnbiB0cmFuc2FjdGlvbiAnICsgZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGEgdHJhbnNhY3Rpb24gZnJvbSBhIFRTUyB3YWxsZXQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgc2lnbmluZyBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNpZ25UcmFuc2FjdGlvblRzcyhwYXJhbXM6IFdhbGxldFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24+IHtcbiAgICBpZiAoIXBhcmFtcy50eFByZWJ1aWxkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R4UHJlYnVpbGQgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBUU1MnKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy50eFByZWJ1aWxkLnR4UmVxdWVzdElkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R4UmVxdWVzdElkIHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggVFNTJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMucHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BydiByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIFRTUycpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy50c3NVdGlscyEuc2lnblR4UmVxdWVzdCh7XG4gICAgICAgIHR4UmVxdWVzdDogcGFyYW1zLnR4UHJlYnVpbGQudHhSZXF1ZXN0SWQsXG4gICAgICAgIHR4UGFyYW1zOiBwYXJhbXMudHhQcmVidWlsZC5idWlsZFBhcmFtcyxcbiAgICAgICAgcHJ2OiBwYXJhbXMucHJ2LFxuICAgICAgICByZXFJZDogcGFyYW1zLnJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCksXG4gICAgICAgIGFwaVZlcnNpb246IHBhcmFtcy5hcGlWZXJzaW9uLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmYWlsZWQgdG8gc2lnbiB0cmFuc2FjdGlvbiAnICsgZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGEgbWVzc2FnZSBmcm9tIGEgVFNTIHdhbGxldC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyBzaWduaW5nIG9wdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2lnbk1lc3NhZ2VUc3MocGFyYW1zOiBXYWxsZXRTaWduTWVzc2FnZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8U2lnbmVkTWVzc2FnZT4ge1xuICAgIGlmICghcGFyYW1zLnJlcUlkKSB7XG4gICAgICBwYXJhbXMucmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLnBydikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcnYgcmVxdWlyZWQgdG8gc2lnbiBtZXNzYWdlIHdpdGggVFNTJyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGxldCB0eFJlcXVlc3Q7XG4gICAgICBhc3NlcnQocGFyYW1zLm1lc3NhZ2UsICdtZXNzYWdlIHJlcXVpcmVkIGZvciBtZXNzYWdlIHNpZ25pbmcnKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2VSYXcgPSBwYXJhbXMubWVzc2FnZS5tZXNzYWdlUmF3O1xuXG4gICAgICBpZiAoIXBhcmFtcy5tZXNzYWdlLnR4UmVxdWVzdElkKSB7XG4gICAgICAgIGNvbnN0IGludGVudE9wdGlvbjogSW50ZW50T3B0aW9uc0Zvck1lc3NhZ2UgPSB7XG4gICAgICAgICAgY3VzdG9kaWFuTWVzc2FnZUlkOiBwYXJhbXMuY3VzdG9kaWFuTWVzc2FnZUlkLFxuICAgICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgICAgICAgaW50ZW50VHlwZTogJ3NpZ25NZXNzYWdlJyxcbiAgICAgICAgICBpc1RzczogdHJ1ZSxcbiAgICAgICAgICBtZXNzYWdlUmF3LFxuICAgICAgICAgIG1lc3NhZ2VTdGFuZGFyZFR5cGU6IHBhcmFtcy5tZXNzYWdlLm1lc3NhZ2VTdGFuZGFyZFR5cGUsXG4gICAgICAgICAgc2lnbmVyQWRkcmVzczogcGFyYW1zLm1lc3NhZ2Uuc2lnbmVyQWRkcmVzcyxcbiAgICAgICAgfTtcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEuYnVpbGRTaWduTWVzc2FnZVJlcXVlc3QoaW50ZW50T3B0aW9uKTtcbiAgICAgICAgcGFyYW1zLm1lc3NhZ2UudHhSZXF1ZXN0SWQgPSB0eFJlcXVlc3QudHhSZXF1ZXN0SWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCBnZXRUeFJlcXVlc3QodGhpcy5iaXRnbywgdGhpcy5pZCgpLCBwYXJhbXMubWVzc2FnZS50eFJlcXVlc3RJZCwgcGFyYW1zLnJlcUlkKTtcbiAgICAgIH1cblxuICAgICAgYXNzZXJ0KFxuICAgICAgICB0eFJlcXVlc3QubWVzc2FnZXMgJiYgdHhSZXF1ZXN0Lm1lc3NhZ2VzLmxlbmd0aCA+IDAsXG4gICAgICAgICdVbmFibGUgdG8gZmluZCBtZXNzYWdlcyBpbiB0eFJlcXVlc3QgZm9yIG1lc3NhZ2Ugc2lnbmluZydcbiAgICAgICk7XG4gICAgICBjb25zdCBtZXNzYWdlRW5jb2RlZCA9IHR4UmVxdWVzdC5tZXNzYWdlc1swXS5tZXNzYWdlRW5jb2RlZDtcblxuICAgICAgY29uc3Qgc2lnbmVkTWVzc2FnZVJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5zaWduVHhSZXF1ZXN0Rm9yTWVzc2FnZSh7XG4gICAgICAgIHR4UmVxdWVzdCxcbiAgICAgICAgcHJ2OiBwYXJhbXMucHJ2LFxuICAgICAgICByZXFJZDogcGFyYW1zLnJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCksXG4gICAgICAgIG1lc3NhZ2VSYXcsXG4gICAgICAgIG1lc3NhZ2VFbmNvZGVkLFxuICAgICAgICBidWZmZXJUb1NpZ246IEJ1ZmZlci5mcm9tKG1lc3NhZ2VFbmNvZGVkLCAnaGV4JyksXG4gICAgICB9KTtcbiAgICAgIGFzc2VydChzaWduZWRNZXNzYWdlUmVxdWVzdC5tZXNzYWdlcywgJ1VuYWJsZSB0byBmaW5kIG1lc3NhZ2VzIGluIHNpZ25lZE1lc3NhZ2VSZXF1ZXN0Jyk7XG4gICAgICBpZiAodGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSA9PT0gQ29pbkZhbWlseS5FVEgpIHtcbiAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgIHNpZ25lZE1lc3NhZ2VSZXF1ZXN0Lm1lc3NhZ2VzWzBdLmNvbWJpbmVTaWdTaGFyZSxcbiAgICAgICAgICAnVW5hYmxlIHRvIGZpbmQgY29tYmluZVNpZ1NoYXJlIGluIHNpZ25lZE1lc3NhZ2VSZXF1ZXN0Lm1lc3NhZ2VzJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYXNzZXJ0KHNpZ25lZE1lc3NhZ2VSZXF1ZXN0Lm1lc3NhZ2VzWzBdLnR4SGFzaCwgJ1VuYWJsZSB0byBmaW5kIHR4SGFzaCBpbiBzaWduZWRNZXNzYWdlUmVxdWVzdC5tZXNzYWdlcycpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29pbjogdGhpcy5jb2luKCksXG4gICAgICAgIHR4SGFzaDogc2lnbmVkTWVzc2FnZVJlcXVlc3QubWVzc2FnZXNbMF0udHhIYXNoLFxuICAgICAgICBzaWduYXR1cmU6IHNpZ25lZE1lc3NhZ2VSZXF1ZXN0Lm1lc3NhZ2VzWzBdLnR4SGFzaCxcbiAgICAgICAgbWVzc2FnZVJhdyxcbiAgICAgICAgbWVzc2FnZUVuY29kZWQsXG4gICAgICAgIHR4UmVxdWVzdElkOiBzaWduZWRNZXNzYWdlUmVxdWVzdC50eFJlcXVlc3RJZCxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmYWlsZWQgdG8gc2lnbiBtZXNzYWdlICcgKyBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgYSB0eXBlZCBkYXRhIGZyb20gYSBUU1Mgd2FsbGV0LlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNpZ25UeXBlZERhdGFUc3MocGFyYW1zOiBXYWxsZXRTaWduVHlwZWREYXRhT3B0aW9ucyk6IFByb21pc2U8U2lnbmVkTWVzc2FnZT4ge1xuICAgIGlmICghcGFyYW1zLnJlcUlkKSB7XG4gICAgICBwYXJhbXMucmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIH1cbiAgICBpZiAoIXBhcmFtcy5wcnYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHJ2IHJlcXVpcmVkIHRvIHNpZ24gdHlwZWQgZGF0YSB3aXRoIFRTUycpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBsZXQgdHhSZXF1ZXN0O1xuICAgICAgYXNzZXJ0KHBhcmFtcy50eXBlZERhdGEsICd0eXBlZERhdGEgcmVxdWlyZWQgZm9yIHR5cGVkIGRhdGEgc2lnbmluZycpO1xuICAgICAgaWYgKCFwYXJhbXMudHlwZWREYXRhLnR4UmVxdWVzdElkKSB7XG4gICAgICAgIGNvbnN0IGludGVudE9wdGlvbnM6IEludGVudE9wdGlvbnNGb3JUeXBlZERhdGEgPSB7XG4gICAgICAgICAgY3VzdG9kaWFuTWVzc2FnZUlkOiBwYXJhbXMuY3VzdG9kaWFuTWVzc2FnZUlkLFxuICAgICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgICAgICAgaW50ZW50VHlwZTogJ3NpZ25UeXBlZFN0cnVjdHVyZWREYXRhJyxcbiAgICAgICAgICBpc1RzczogdHJ1ZSxcbiAgICAgICAgICB0eXBlZERhdGFSYXc6IHBhcmFtcy50eXBlZERhdGEudHlwZWREYXRhUmF3LFxuICAgICAgICAgIHR5cGVkRGF0YUVuY29kZWQ6IHBhcmFtcy50eXBlZERhdGEudHlwZWREYXRhRW5jb2RlZCEudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB9O1xuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5jcmVhdGVUeFJlcXVlc3RXaXRoSW50ZW50Rm9yVHlwZWREYXRhU2lnbmluZyhpbnRlbnRPcHRpb25zKTtcbiAgICAgICAgcGFyYW1zLnR5cGVkRGF0YS50eFJlcXVlc3RJZCA9IHR4UmVxdWVzdC50eFJlcXVlc3RJZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IGdldFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0aGlzLmlkKCksIHBhcmFtcy50eXBlZERhdGEudHhSZXF1ZXN0SWQsIHBhcmFtcy5yZXFJZCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNpZ25lZFR5cGVkRGF0YVJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5zaWduVHhSZXF1ZXN0Rm9yTWVzc2FnZSh7XG4gICAgICAgIHR4UmVxdWVzdCxcbiAgICAgICAgcHJ2OiBwYXJhbXMucHJ2LFxuICAgICAgICByZXFJZDogcGFyYW1zLnJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCksXG4gICAgICAgIG1lc3NhZ2VSYXc6IEpTT04uc3RyaW5naWZ5KHBhcmFtcy50eXBlZERhdGEudHlwZWREYXRhUmF3KSxcbiAgICAgICAgbWVzc2FnZUVuY29kZWQ6IHBhcmFtcy50eXBlZERhdGEudHlwZWREYXRhRW5jb2RlZCEudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICBidWZmZXJUb1NpZ246IHBhcmFtcy50eXBlZERhdGEudHlwZWREYXRhRW5jb2RlZCEsXG4gICAgICB9KTtcbiAgICAgIGFzc2VydChzaWduZWRUeXBlZERhdGFSZXF1ZXN0Lm1lc3NhZ2VzLCAnVW5hYmxlIHRvIGZpbmQgbWVzc2FnZXMgaW4gc2lnbmVkVHlwZWREYXRhUmVxdWVzdCcpO1xuICAgICAgYXNzZXJ0KFxuICAgICAgICBzaWduZWRUeXBlZERhdGFSZXF1ZXN0Lm1lc3NhZ2VzWzBdLmNvbWJpbmVTaWdTaGFyZSxcbiAgICAgICAgJ1VuYWJsZSB0byBmaW5kIGNvbWJpbmVTaWdTaGFyZSBpbiBzaWduZWRUeXBlZERhdGFSZXF1ZXN0Lm1lc3NhZ2VzJ1xuICAgICAgKTtcbiAgICAgIGFzc2VydChzaWduZWRUeXBlZERhdGFSZXF1ZXN0Lm1lc3NhZ2VzWzBdLnR4SGFzaCwgJ1VuYWJsZSB0byBmaW5kIHR4SGFzaCBpbiBzaWduZWRUeXBlZERhdGFSZXF1ZXN0Lm1lc3NhZ2VzJyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2luOiB0aGlzLmNvaW4oKSxcbiAgICAgICAgdHhIYXNoOiBzaWduZWRUeXBlZERhdGFSZXF1ZXN0Lm1lc3NhZ2VzWzBdLnR4SGFzaCxcbiAgICAgICAgc2lnbmF0dXJlOiBzaWduZWRUeXBlZERhdGFSZXF1ZXN0Lm1lc3NhZ2VzWzBdLnR4SGFzaCxcbiAgICAgICAgbWVzc2FnZVJhdzogcGFyYW1zLnR5cGVkRGF0YS50eXBlZERhdGFSYXcsXG4gICAgICAgIG1lc3NhZ2VFbmNvZGVkOiBwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YUVuY29kZWQhLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgdHhSZXF1ZXN0SWQ6IHNpZ25lZFR5cGVkRGF0YVJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIHNpZ24gdHlwZWQgZGF0YSAnICsgZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcywgc2lnbnMsIGFuZCBzZW5kcyBhIHRyYW5zYWN0aW9uIGZyb20gYSBUU1Mgd2FsbGV0LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIHNlbmQgb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZW5kTWFueVR4UmVxdWVzdHMocGFyYW1zOiBTZW5kTWFueU9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcGFyYW1zLmFwaVZlcnNpb24gPSBnZXRUeFJlcXVlc3RBcGlWZXJzaW9uKHRoaXMsIHBhcmFtcy5hcGlWZXJzaW9uKTtcblxuICAgIGNvbnN0IHNpZ25lZFRyYW5zYWN0aW9uID0gKGF3YWl0IHRoaXMucHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb24ocGFyYW1zKSkgYXMgU2lnbmVkVHJhbnNhY3Rpb25SZXF1ZXN0O1xuICAgIGlmICghc2lnbmVkVHJhbnNhY3Rpb24udHhSZXF1ZXN0SWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndHhSZXF1ZXN0SWQgbWlzc2luZyBmcm9tIHNpZ25lZCB0cmFuc2FjdGlvbicpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuYXBpVmVyc2lvbiA9PT0gJ2Z1bGwnKSB7XG4gICAgICBjb25zdCBsYXRlc3RUeFJlcXVlc3QgPSBhd2FpdCBnZXRUeFJlcXVlc3QodGhpcy5iaXRnbywgdGhpcy5pZCgpLCBzaWduZWRUcmFuc2FjdGlvbi50eFJlcXVlc3RJZCwgcGFyYW1zLnJlcUlkKTtcbiAgICAgIGNvbnN0IHJlcUlkID0gcGFyYW1zLnJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgICAgY29uc3QgdHJhbnNmZXI6IHtcbiAgICAgICAgc3RhdGU6IHN0cmluZztcbiAgICAgICAgcGVuZGluZ0FwcHJvdmFsPzogc3RyaW5nO1xuICAgICAgICB0eGlkPzogc3RyaW5nO1xuICAgICAgfSA9IGF3YWl0IHRoaXMuYml0Z29cbiAgICAgICAgLnBvc3QoXG4gICAgICAgICAgdGhpcy5iaXRnby51cmwoXG4gICAgICAgICAgICAnL3dhbGxldC8nICsgdGhpcy5fd2FsbGV0LmlkICsgJy90eHJlcXVlc3RzLycgKyBzaWduZWRUcmFuc2FjdGlvbi50eFJlcXVlc3RJZCArICcvdHJhbnNmZXJzJyxcbiAgICAgICAgICAgIDJcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgLnNlbmQoKVxuICAgICAgICAucmVzdWx0KCk7XG4gICAgICBpZiAobGF0ZXN0VHhSZXF1ZXN0LnN0YXRlID09PSAncGVuZGluZ0FwcHJvdmFsJykge1xuICAgICAgICBjb25zdCBwZW5kaW5nQXBwcm92YWxzID0gbmV3IFBlbmRpbmdBcHByb3ZhbHModGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbik7XG4gICAgICAgIGNvbnN0IHBlbmRpbmdBcHByb3ZhbCA9IGF3YWl0IHBlbmRpbmdBcHByb3ZhbHMuZ2V0KHtcbiAgICAgICAgICBpZDogbGF0ZXN0VHhSZXF1ZXN0LnBlbmRpbmdBcHByb3ZhbElkLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwZW5kaW5nQXBwcm92YWw6IHBlbmRpbmdBcHByb3ZhbC50b0pTT04oKSxcbiAgICAgICAgICB0eFJlcXVlc3Q6IGxhdGVzdFR4UmVxdWVzdCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRyYW5zZmVyLFxuICAgICAgICB0eFJlcXVlc3Q6IGxhdGVzdFR4UmVxdWVzdCxcbiAgICAgICAgdHhpZDogKGxhdGVzdFR4UmVxdWVzdC50cmFuc2FjdGlvbnMgPz8gW10pWzBdPy5zaWduZWRUeD8uaWQsXG4gICAgICAgIHR4OiAobGF0ZXN0VHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyA/PyBbXSlbMF0/LnNpZ25lZFR4Py50eCxcbiAgICAgICAgc3RhdHVzOiB0cmFuc2Zlci5zdGF0ZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgcmVxSWQgPSBwYXJhbXMucmVxSWQgfHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLnRzc1V0aWxzPy5zZW5kVHhSZXF1ZXN0KHNpZ25lZFRyYW5zYWN0aW9uLnR4UmVxdWVzdElkLCByZXFJZCk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBmdW5kcyBmcm9tIGEgZmVlIGFkZHJlc3MgdG8gYSBmb3J3YXJkZXIuIE9ubHkgc3VwcG9ydHMgZXRoLWxpa2UgY29pbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBwYXJhbWV0ZXJzIG9iamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmZvcndhcmRlckFkZHJlc3MgLSBBZGRyZXNzIG9mIHRoZSBmb3J3YXJkZXIgdG8gc2VuZCBmdW5kcyB0by5cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5hbW91bnQgLSBBbW91bnQgdG8gc2VuZCB0aGUgZm9yd2FyZGVyIChvcHRpb25hbCkuIElmIG5vdCBnaXZlbiwgZGVmYXVsdHMgdG8gc2VuZGluZyBhbiBlc3RpbWF0ZSBvZiB0aGUgYW1vdW50IG5lZWRlZCBmb3IgYSBmdW5kIHJlY292ZXJ5XG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGZ1bmRGb3J3YXJkZXIocGFyYW1zOiBGdW5kRm9yd2FyZGVyc09wdGlvbnMpOiBQcm9taXNlPFdhbGxldERhdGE+IHtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuZm9yd2FyZGVyQWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZm9yd2FyZGVyIGFkZHJlc3MgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgY29uc3QgdXJsID0gdGhpcy51cmwoJy9mdW5kRm9yd2FyZGVyJyk7XG4gICAgdGhpcy5fd2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHVybCkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQ7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBmdW5kcyBmcm9tIGEgZmVlIGFkZHJlc3MgdG8gYSBmb3J3YXJkZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBwYXJhbWV0ZXJzIG9iamVjdFxuICAgKiBAcGFyYW0ge0xpc3R9IHBhcmFtcy5mb3J3YXJkZXJzIC0gbGlzdCBvZiBmdW5kIGZvcndhcmRlciBvcHRpb25zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGZ1bmRGb3J3YXJkZXJzKHBhcmFtczogRnVuZEZvcndhcmRlclBhcmFtcyk6IFByb21pc2U8V2FsbGV0RGF0YT4ge1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5mb3J3YXJkZXJzKSB8fCBwYXJhbXMuZm9yd2FyZGVycy5sZW5ndGggPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmdW5kIGZvcndhcmRlciBvcHRpb25zIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGNvbnN0IHVybCA9IHRoaXMudXJsKCcvZnVuZGZvcndhcmRlcnMnKTtcbiAgICB0aGlzLl93YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodXJsKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGZvcndhcmRlcidzIGJhbGFuY2VcbiAgICogQHBhcmFtIHBhcmFtcyAtIG9wdGlvbmFsIHF1ZXJ5IHBhcmFtZXRlcnNcbiAgICogQHJldHVybnMgTGlzdCBvZiBmb3J3YXJkZXIgYWRkcmVzcyBhbmQgYmFsYW5jZVxuICAgKiBpZiBwYXJhbXMgaXMgbm90IHNldCB0aGVuIHJldHVybnMgbG93IGJhbGFuY2UgZm9yd2FyZGVyc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldEZvcndhcmRlckJhbGFuY2UocGFyYW1zPzogRm9yd2FyZGVyQmFsYW5jZU9wdGlvbnMpOiBQcm9taXNlPEZvcndhcmRlckJhbGFuY2VbXT4ge1xuICAgIGNvbnN0IHF1ZXJ5OiBGb3J3YXJkZXJCYWxhbmNlT3B0aW9ucyA9IHt9O1xuICAgIGlmIChwYXJhbXM/Lm1heGltdW1CYWxhbmNlKSB7XG4gICAgICBxdWVyeS5tYXhpbXVtQmFsYW5jZSA9IHBhcmFtcz8ubWF4aW11bUJhbGFuY2U7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcz8ubWluaW11bUJhbGFuY2UpIHtcbiAgICAgIHF1ZXJ5Lm1pbmltdW1CYWxhbmNlID0gcGFyYW1zPy5taW5pbXVtQmFsYW5jZTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSB0aGlzLnVybChgL2ZvcndhcmRlcnMvYmFsYW5jZXNgKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYml0Z28uZ2V0KHVybCkucXVlcnkocXVlcnkpLnJlc3VsdCgpO1xuICAgIHJldHVybiByZXNwb25zZSBhcyBGb3J3YXJkZXJCYWxhbmNlW107XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZWNkc2EgdHNzIGNoYWxsZW5nZXMgZm9yIGEgd2FsbGV0LlxuICAgKiBUaGVzZSBhcmUgc3RhdGljIGNoYWxsZW5nZXMgdGhhdCBoYXZlIGJlZW4gdmVyaWZpZWQgYnkgYW4gZW50ZXJwcmlzZSBhZG1pbi5cbiAgICogQ2FsbGVycyBzaG91bGQgdmVyaWZ5IHRoYXQgYW4gZW50ZXJwcmlzZSBhZG1pbiBzaWduZWQgdGhlIGNoYWxsZW5nZSB2YWx1ZXMgYmVmb3JlIHVzaW5nIHRoZW0uXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFdhbGxldEVjZHNhQ2hhbGxlbmdlcz59XG4gICAqL1xuICBhc3luYyBnZXRDaGFsbGVuZ2VzRm9yRWNkc2FTaWduaW5nKCk6IFByb21pc2U8V2FsbGV0RWNkc2FDaGFsbGVuZ2VzPiB7XG4gICAgLy8gbm90ZTogdGhpcyBpcyBub3QgYSBjb2luIHNwZWNpZmljIHJvdXRlLCB3ZSBjYW5ub3QgdXNlIHRoaXMudXJsKC4uKVxuICAgIGNvbnN0IHVybCA9IHRoaXMuYml0Z28udXJsKGAvd2FsbGV0LyR7dGhpcy5pZCgpfS9jaGFsbGVuZ2VzYCwgMik7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHVybCkucXVlcnkoe30pLnJlc3VsdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZW5kVHJhbnNhY3Rpb24ocGFyYW1zOiBUeFNlbmRCb2R5LCByZXFJZD86IElSZXF1ZXN0VHJhY2VyKSB7XG4gICAgLy8gZXh0cmFjdCB0aGUgd2hpdGVsaXN0ZWQgcGFyYW1zIGZyb20gdGhlIHRvcCBsZXZlbCwgaW4gY2FzZVxuICAgIC8vIG90aGVyIGludmFsaWQgcGFyYW1zIGFyZSBwcmVzZW50IHRoYXQgd291bGQgZmFpbCBlbmNvZGluZ1xuICAgIC8vIGFuZCBmYWxsIGJhY2sgdG8gdGhlIGJvZHkgcGFyYW1zXG4gICAgY29uc3Qgd2hpdGVsaXN0ZWRQYXJhbXMgPSB0aGlzLmJhc2VDb2luLnByZXByb2Nlc3NCdWlsZFBhcmFtcyhfLnBpY2socGFyYW1zLCB3aGl0ZWxpc3RlZFNlbmRQYXJhbXMpKTtcbiAgICBjb25zdCByZXFUcmFjZXIgPSByZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFUcmFjZXIpO1xuICAgIHJldHVybiBwb3N0V2l0aENvZGVjKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLmlkKCkgKyAnL3R4L3NlbmQnKSxcbiAgICAgIHQuaW50ZXJzZWN0aW9uKFtUeFNlbmRCb2R5LCB0LnBhcnRpYWwoeyBsb2NrdGltZTogdC5udW1iZXIgfSldKSxcbiAgICAgIHdoaXRlbGlzdGVkUGFyYW1zXG4gICAgKS5yZXN1bHQoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhdGVUcmFuc2FjdGlvbihwYXJhbXM6IFR4U2VuZEJvZHksIHJlcUlkPzogSVJlcXVlc3RUcmFjZXIpIHtcbiAgICAvLyBleHRyYWN0IHRoZSB3aGl0ZWxpc3RlZCBwYXJhbXMgZnJvbSB0aGUgdG9wIGxldmVsLCBpbiBjYXNlXG4gICAgLy8gb3RoZXIgaW52YWxpZCBwYXJhbXMgYXJlIHByZXNlbnQgdGhhdCB3b3VsZCBmYWlsIGVuY29kaW5nXG4gICAgLy8gYW5kIGZhbGwgYmFjayB0byB0aGUgYm9keSBwYXJhbXNcbiAgICBjb25zdCB3aGl0ZWxpc3RlZFBhcmFtcyA9IHRoaXMuYmFzZUNvaW4ucHJlcHJvY2Vzc0J1aWxkUGFyYW1zKF8ucGljayhwYXJhbXMsIHdoaXRlbGlzdGVkU2VuZFBhcmFtcykpO1xuICAgIGNvbnN0IHJlcVRyYWNlciA9IHJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcVRyYWNlcik7XG4gICAgcmV0dXJuIHBvc3RXaXRoQ29kZWMoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuaWQoKSArICcvdHgvaW5pdGlhdGUnKSxcbiAgICAgIFR4U2VuZEJvZHksXG4gICAgICB3aGl0ZWxpc3RlZFBhcmFtc1xuICAgICkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHdhbGxldCBrZXljaGFpbnMgYW5kIHZhbGlkYXRlIHBhc3NwaHJhc2UgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSB7UHJlYnVpbGRUcmFuc2FjdGlvbk9wdGlvbnN9IHBhcmFtcyAtIHByZWJ1aWxkIHRyYW5zYWN0aW9uIG9wdGlvbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIC0gd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5yZXFJZCAtIHJlcXVlc3QgaWQgZm9yIHRyYWNpbmcgcHVycG9zZXNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcGFyYW1zLmN1c3RvbVNpZ25pbmdGdW5jdGlvbiAtIGN1c3RvbSBzaWduaW5nIGZ1bmN0aW9uIGZvciBleHRlcm5hbCBzaWduaW5nXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEtleWNoYWluW10+fVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRLZXljaGFpbnNBbmRWYWxpZGF0ZVBhc3NwaHJhc2Uoe1xuICAgIGN1c3RvbVNpZ25pbmdGdW5jdGlvbixcbiAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgIHJlcUlkLFxuICB9OiBQcmVidWlsZFRyYW5zYWN0aW9uT3B0aW9ucyAmIFdhbGxldFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPEtleWNoYWluW10+IHtcbiAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmdldEtleXNGb3JTaWduaW5nKHsgd2FsbGV0OiB0aGlzLCByZXFJZCB9KTtcblxuICAgIC8vIERvaW5nIGEgc2FuaXR5IGNoZWNrIGZvciBwYXNzd29yZCBoZXJlIHRvIGF2b2lkIGRvaW5nIGZ1cnRoZXIgd29yayBpZiB3ZSBrbm93IGl0J3Mgd3JvbmdcbiAgICAvLyB3ZSBpZ25vcmUgdGhpcyBjaGVjayB3aXRoIGlmIGN1c3RvbVNpZ25pbmdGdW5jdGlvbiBpcyBwcm92aWRlZFxuICAgIC8vICB3aGljaCBtZWFucyB0aGF0IHRoZSB1c2VyIGlzIGhhbmRsaW5nIHRoZSBzaWduaW5nIGluIGV4dGVybmFsIHNpZ25pbmcgbW9kZVxuICAgIGlmICghY3VzdG9tU2lnbmluZ0Z1bmN0aW9uICYmIGtleWNoYWlucz8uWzBdPy5lbmNyeXB0ZWRQcnYgJiYgd2FsbGV0UGFzc3BocmFzZSkge1xuICAgICAgaWYgKCFkZWNyeXB0S2V5Y2hhaW5Qcml2YXRlS2V5KHRoaXMuYml0Z28sIGtleWNoYWluc1swXSwgd2FsbGV0UGFzc3BocmFzZSkpIHtcbiAgICAgICAgY29uc3QgZXJyb3I6IEVycm9yICYgeyBjb2RlPzogc3RyaW5nIH0gPSBuZXcgRXJyb3IoXG4gICAgICAgICAgYHVuYWJsZSB0byBkZWNyeXB0IGtleWNoYWluIHdpdGggdGhlIGdpdmVuIHdhbGxldCBwYXNzcGhyYXNlYFxuICAgICAgICApO1xuICAgICAgICBlcnJvci5jb2RlID0gJ3dhbGxldF9wYXNzcGhyYXNlX2luY29ycmVjdCc7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ga2V5Y2hhaW5zO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcHJvdmUgdG9rZW4gZm9yIHVzZSB3aXRoIGEgYmF0Y2hlciBjb250cmFjdFxuICAgKiBUaGlzIGZ1bmN0aW9uIGJ1aWxkcywgc2lnbnMsIGFuZCBzZW5kcyBhIHRva2VuIGFwcHJvdmFsIHRyYW5zYWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB3YWxsZXRQYXNzcGhyYXNlIC0gVGhlIHBhc3NwaHJhc2UgdG8gYmUgdXNlZCB0byBkZWNyeXB0IHRoZSB1c2VyIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdG9rZW5OYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRva2VuIHRvIGJlIGFwcHJvdmVkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFRoZSB0cmFuc2FjdGlvbiBkZXRhaWxzXG4gICAqL1xuICBhc3luYyBhcHByb3ZlRXJjMjBUb2tlbih3YWxsZXRQYXNzcGhyYXNlOiBzdHJpbmcsIHRva2VuTmFtZTogc3RyaW5nKTogUHJvbWlzZTxTdWJtaXRUcmFuc2FjdGlvblJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG5cbiAgICBsZXQgdG9rZW5BcHByb3ZhbEJ1aWxkO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cmwgPSB0aGlzLmJhc2VDb2luLnVybChgL3dhbGxldC8ke3RoaXMuaWQoKX0vdG9rZW4vYXBwcm92YWwvYnVpbGRgKTtcbiAgICAgIHRva2VuQXBwcm92YWxCdWlsZCA9IGF3YWl0IHRoaXMuYml0Z29cbiAgICAgICAgLnBvc3QodXJsKVxuICAgICAgICAuc2VuZCh7XG4gICAgICAgICAgdG9rZW5OYW1lOiB0b2tlbk5hbWUsXG4gICAgICAgIH0pXG4gICAgICAgIC5yZXN1bHQoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cblxuICAgIGNvbnN0IGtleWNoYWlucyA9IGF3YWl0IHRoaXMuZ2V0S2V5Y2hhaW5zQW5kVmFsaWRhdGVQYXNzcGhyYXNlKHtcbiAgICAgIHJlcUlkLFxuICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHNpZ25pbmdQYXJhbXMgPSB7XG4gICAgICB0eFByZWJ1aWxkOiB0b2tlbkFwcHJvdmFsQnVpbGQsXG4gICAgICBrZXljaGFpbjoga2V5Y2hhaW5zWzBdLFxuICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIHJlcUlkLFxuICAgIH07XG5cbiAgICBjb25zdCBoYWxmU2lnbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCB0aGlzLnNpZ25UcmFuc2FjdGlvbihzaWduaW5nUGFyYW1zKTtcbiAgICBjb25zdCBmaW5hbFR4UGFyYW1zID0gXy5leHRlbmQoe30sIGhhbGZTaWduZWRUcmFuc2FjdGlvbik7XG5cbiAgICByZXR1cm4gdGhpcy5zZW5kVHJhbnNhY3Rpb24oZmluYWxUeFBhcmFtcywgcmVxSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHRva2VuIGFwcHJvdmFsIHRyYW5zYWN0aW9uIGZvciBFUkMyMCB0b2tlbnNcbiAgICogSWYgd2FsbGV0UGFzc3BocmFzZSBpcyBwcm92aWRlZCwgYWxzbyBzaWducyBhbmQgc2VuZHMgdGhlIHRyYW5zYWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0b2tlbk5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdG9rZW4gdG8gYmUgYXBwcm92ZWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IFt3YWxsZXRQYXNzcGhyYXNlXSAtIE9wdGlvbmFsIHdhbGxldCBwYXNzcGhyYXNlIGZvciBzaWduaW5nIGFuZCBzZW5kaW5nXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEJ1aWxkVG9rZW5BcHByb3ZhbFJlc3BvbnNlIHwgU3VibWl0VHJhbnNhY3Rpb25SZXNwb25zZT59IFRoZSB0b2tlbiBhcHByb3ZhbCBidWlsZCByZXNwb25zZSBvciB0cmFuc2FjdGlvbiBkZXRhaWxzIGlmIHNpZ25lZFxuICAgKi9cbiAgYXN5bmMgYnVpbGRFcmMyMFRva2VuQXBwcm92YWwoXG4gICAgdG9rZW5OYW1lOiBzdHJpbmcsXG4gICAgd2FsbGV0UGFzc3BocmFzZT86IHN0cmluZ1xuICApOiBQcm9taXNlPEJ1aWxkVG9rZW5BcHByb3ZhbFJlc3BvbnNlIHwgU3VibWl0VHJhbnNhY3Rpb25SZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuXG4gICAgbGV0IHRva2VuQXBwcm92YWxCdWlsZDogQnVpbGRUb2tlbkFwcHJvdmFsUmVzcG9uc2U7XG4gICAgY29uc3QgdXJsID0gdGhpcy5iYXNlQ29pbi51cmwoYC93YWxsZXQvJHt0aGlzLmlkKCl9L3Rva2VuL2FwcHJvdmFsL2J1aWxkYCk7XG4gICAgdHJ5IHtcbiAgICAgIHRva2VuQXBwcm92YWxCdWlsZCA9IGF3YWl0IHRoaXMuYml0Z29cbiAgICAgICAgLnBvc3QodXJsKVxuICAgICAgICAuc2VuZCh7XG4gICAgICAgICAgdG9rZW5OYW1lOiB0b2tlbk5hbWUsXG4gICAgICAgIH0pXG4gICAgICAgIC5yZXN1bHQoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBlcnJvciBidWlsZGluZyBlcmMyMCB0b2tlbiBhcHByb3ZhbCB0eDogJHtlcnJvcn1gKTtcbiAgICB9XG5cbiAgICBpZiAoIXdhbGxldFBhc3NwaHJhc2UpIHtcbiAgICAgIHJldHVybiB0b2tlbkFwcHJvdmFsQnVpbGQ7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gYXdhaXQgdGhpcy5nZXRLZXljaGFpbnNBbmRWYWxpZGF0ZVBhc3NwaHJhc2Uoe1xuICAgICAgcmVxSWQsXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc2lnbmluZ1BhcmFtcyA9IHtcbiAgICAgIHR4UHJlYnVpbGQ6IHRva2VuQXBwcm92YWxCdWlsZCxcbiAgICAgIGtleWNoYWluOiBrZXljaGFpbnNbMF0sXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgcmVxSWQsXG4gICAgfTtcblxuICAgIGNvbnN0IGhhbGZTaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMuc2lnblRyYW5zYWN0aW9uKHNpZ25pbmdQYXJhbXMpO1xuICAgIGNvbnN0IGZpbmFsVHhQYXJhbXMgPSBfLmV4dGVuZCh7fSwgaGFsZlNpZ25lZFRyYW5zYWN0aW9uKTtcblxuICAgIHJldHVybiB0aGlzLnNlbmRUcmFuc2FjdGlvbihmaW5hbFR4UGFyYW1zLCByZXFJZCk7XG4gIH1cbn1cbiJdfQ==