@bitgo-beta/sdk-coin-sui 3.0.3-beta.21 → 3.0.3-beta.2100

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 (207) hide show
  1. package/dist/src/index.d.ts +1 -0
  2. package/dist/src/index.d.ts.map +1 -1
  3. package/dist/src/index.js +7 -2
  4. package/dist/src/lib/compareTransactionBlocks.d.ts +8 -0
  5. package/dist/src/lib/compareTransactionBlocks.d.ts.map +1 -0
  6. package/dist/src/lib/compareTransactionBlocks.js +12 -0
  7. package/dist/src/lib/constants.d.ts +10 -2
  8. package/dist/src/lib/constants.d.ts.map +1 -1
  9. package/dist/src/lib/constants.js +19 -2
  10. package/dist/src/lib/customTransaction.d.ts +57 -0
  11. package/dist/src/lib/customTransaction.d.ts.map +1 -0
  12. package/dist/src/lib/customTransaction.js +159 -0
  13. package/dist/src/lib/customTransactionBuilder.d.ts +46 -0
  14. package/dist/src/lib/customTransactionBuilder.d.ts.map +1 -0
  15. package/dist/src/lib/customTransactionBuilder.js +117 -0
  16. package/dist/src/lib/iface.d.ts +96 -10
  17. package/dist/src/lib/iface.d.ts.map +1 -1
  18. package/dist/src/lib/iface.js +47 -5
  19. package/dist/src/lib/index.d.ts +8 -0
  20. package/dist/src/lib/index.d.ts.map +1 -1
  21. package/dist/src/lib/index.js +40 -10
  22. package/dist/src/lib/keyPair.js +24 -10
  23. package/dist/src/lib/mystenlab/builder/Inputs.d.ts +64 -11
  24. package/dist/src/lib/mystenlab/builder/Inputs.d.ts.map +1 -1
  25. package/dist/src/lib/mystenlab/builder/Inputs.js +63 -19
  26. package/dist/src/lib/mystenlab/builder/TransactionBlock.d.ts +88 -355
  27. package/dist/src/lib/mystenlab/builder/TransactionBlock.d.ts.map +1 -1
  28. package/dist/src/lib/mystenlab/builder/TransactionBlock.js +65 -48
  29. package/dist/src/lib/mystenlab/builder/TransactionDataBlock.d.ts +152 -77
  30. package/dist/src/lib/mystenlab/builder/TransactionDataBlock.d.ts.map +1 -1
  31. package/dist/src/lib/mystenlab/builder/TransactionDataBlock.js +54 -44
  32. package/dist/src/lib/mystenlab/builder/Transactions.d.ts +133 -188
  33. package/dist/src/lib/mystenlab/builder/Transactions.d.ts.map +1 -1
  34. package/dist/src/lib/mystenlab/builder/Transactions.js +52 -53
  35. package/dist/src/lib/mystenlab/builder/bcs.d.ts +1 -1
  36. package/dist/src/lib/mystenlab/builder/bcs.d.ts.map +1 -1
  37. package/dist/src/lib/mystenlab/builder/bcs.js +2 -2
  38. package/dist/src/lib/mystenlab/builder/index.js +6 -2
  39. package/dist/src/lib/mystenlab/builder/serializer.js +6 -8
  40. package/dist/src/lib/mystenlab/builder/utils.d.ts +1 -1
  41. package/dist/src/lib/mystenlab/builder/utils.d.ts.map +1 -1
  42. package/dist/src/lib/mystenlab/builder/utils.js +4 -4
  43. package/dist/src/lib/mystenlab/cryptography/hash.js +3 -4
  44. package/dist/src/lib/mystenlab/framework/framework.d.ts +6 -6
  45. package/dist/src/lib/mystenlab/framework/framework.d.ts.map +1 -1
  46. package/dist/src/lib/mystenlab/framework/framework.js +22 -25
  47. package/dist/src/lib/mystenlab/framework/index.js +6 -2
  48. package/dist/src/lib/mystenlab/framework/sui-system-state.d.ts +2 -0
  49. package/dist/src/lib/mystenlab/framework/sui-system-state.d.ts.map +1 -1
  50. package/dist/src/lib/mystenlab/framework/sui-system-state.js +6 -3
  51. package/dist/src/lib/mystenlab/txn-data-serializers/type-tag-serializer.js +2 -2
  52. package/dist/src/lib/mystenlab/types/coin.d.ts +17 -15
  53. package/dist/src/lib/mystenlab/types/coin.d.ts.map +1 -1
  54. package/dist/src/lib/mystenlab/types/coin.js +20 -19
  55. package/dist/src/lib/mystenlab/types/common.d.ts +8 -8
  56. package/dist/src/lib/mystenlab/types/common.d.ts.map +1 -1
  57. package/dist/src/lib/mystenlab/types/common.js +22 -22
  58. package/dist/src/lib/mystenlab/types/events.d.ts +15 -15
  59. package/dist/src/lib/mystenlab/types/events.d.ts.map +1 -1
  60. package/dist/src/lib/mystenlab/types/events.js +17 -17
  61. package/dist/src/lib/mystenlab/types/index.js +6 -2
  62. package/dist/src/lib/mystenlab/types/normalized.d.ts +21 -21
  63. package/dist/src/lib/mystenlab/types/normalized.d.ts.map +1 -1
  64. package/dist/src/lib/mystenlab/types/normalized.js +41 -41
  65. package/dist/src/lib/mystenlab/types/objects.d.ts +100 -100
  66. package/dist/src/lib/mystenlab/types/objects.d.ts.map +1 -1
  67. package/dist/src/lib/mystenlab/types/objects.js +96 -106
  68. package/dist/src/lib/mystenlab/types/option.d.ts +1 -1
  69. package/dist/src/lib/mystenlab/types/option.d.ts.map +1 -1
  70. package/dist/src/lib/mystenlab/types/option.js +2 -3
  71. package/dist/src/lib/mystenlab/types/sui-bcs.d.ts +55 -29
  72. package/dist/src/lib/mystenlab/types/sui-bcs.d.ts.map +1 -1
  73. package/dist/src/lib/mystenlab/types/sui-bcs.js +30 -6
  74. package/dist/src/lib/mystenlab/types/transactions.d.ts +641 -641
  75. package/dist/src/lib/mystenlab/types/transactions.d.ts.map +1 -1
  76. package/dist/src/lib/mystenlab/types/transactions.js +178 -194
  77. package/dist/src/lib/mystenlab/types/validator.d.ts +17 -17
  78. package/dist/src/lib/mystenlab/types/validator.d.ts.map +1 -1
  79. package/dist/src/lib/mystenlab/types/validator.js +124 -124
  80. package/dist/src/lib/resources/walrusConfig.d.ts +22 -0
  81. package/dist/src/lib/resources/walrusConfig.d.ts.map +1 -0
  82. package/dist/src/lib/resources/walrusConfig.js +37 -0
  83. package/dist/src/lib/rpcClient.d.ts +5 -0
  84. package/dist/src/lib/rpcClient.d.ts.map +1 -0
  85. package/dist/src/lib/rpcClient.js +81 -0
  86. package/dist/src/lib/stakingBuilder.d.ts +13 -3
  87. package/dist/src/lib/stakingBuilder.d.ts.map +1 -1
  88. package/dist/src/lib/stakingBuilder.js +83 -28
  89. package/dist/src/lib/stakingTransaction.d.ts +1 -1
  90. package/dist/src/lib/stakingTransaction.d.ts.map +1 -1
  91. package/dist/src/lib/stakingTransaction.js +44 -29
  92. package/dist/src/lib/tokenTransferBuilder.d.ts +93 -0
  93. package/dist/src/lib/tokenTransferBuilder.d.ts.map +1 -0
  94. package/dist/src/lib/tokenTransferBuilder.js +266 -0
  95. package/dist/src/lib/tokenTransferTransaction.d.ts +59 -0
  96. package/dist/src/lib/tokenTransferTransaction.d.ts.map +1 -0
  97. package/dist/src/lib/tokenTransferTransaction.js +272 -0
  98. package/dist/src/lib/transaction.d.ts +23 -4
  99. package/dist/src/lib/transaction.d.ts.map +1 -1
  100. package/dist/src/lib/transaction.js +162 -18
  101. package/dist/src/lib/transactionBuilder.d.ts +13 -4
  102. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  103. package/dist/src/lib/transactionBuilder.js +34 -4
  104. package/dist/src/lib/transactionBuilderFactory.d.ts +14 -2
  105. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  106. package/dist/src/lib/transactionBuilderFactory.js +42 -1
  107. package/dist/src/lib/transferBuilder.d.ts +58 -1
  108. package/dist/src/lib/transferBuilder.d.ts.map +1 -1
  109. package/dist/src/lib/transferBuilder.js +310 -24
  110. package/dist/src/lib/transferTransaction.d.ts +7 -1
  111. package/dist/src/lib/transferTransaction.d.ts.map +1 -1
  112. package/dist/src/lib/transferTransaction.js +129 -12
  113. package/dist/src/lib/unstakingBuilder.d.ts +8 -1
  114. package/dist/src/lib/unstakingBuilder.d.ts.map +1 -1
  115. package/dist/src/lib/unstakingBuilder.js +99 -20
  116. package/dist/src/lib/unstakingTransaction.d.ts +26 -2
  117. package/dist/src/lib/unstakingTransaction.d.ts.map +1 -1
  118. package/dist/src/lib/unstakingTransaction.js +162 -23
  119. package/dist/src/lib/utils.d.ts +36 -5
  120. package/dist/src/lib/utils.d.ts.map +1 -1
  121. package/dist/src/lib/utils.js +369 -26
  122. package/dist/src/lib/walrusStakingBuilder.d.ts +77 -0
  123. package/dist/src/lib/walrusStakingBuilder.d.ts.map +1 -0
  124. package/dist/src/lib/walrusStakingBuilder.js +276 -0
  125. package/dist/src/lib/walrusStakingTransaction.d.ts +52 -0
  126. package/dist/src/lib/walrusStakingTransaction.d.ts.map +1 -0
  127. package/dist/src/lib/walrusStakingTransaction.js +289 -0
  128. package/dist/src/lib/walrusWithdrawStakeBuilder.d.ts +36 -0
  129. package/dist/src/lib/walrusWithdrawStakeBuilder.d.ts.map +1 -0
  130. package/dist/src/lib/walrusWithdrawStakeBuilder.js +177 -0
  131. package/dist/src/lib/walrusWithdrawStakeTransaction.d.ts +21 -0
  132. package/dist/src/lib/walrusWithdrawStakeTransaction.d.ts.map +1 -0
  133. package/dist/src/lib/walrusWithdrawStakeTransaction.js +190 -0
  134. package/dist/src/register.d.ts.map +1 -1
  135. package/dist/src/register.js +5 -1
  136. package/dist/src/sui.d.ts +58 -8
  137. package/dist/src/sui.d.ts.map +1 -1
  138. package/dist/src/sui.js +562 -37
  139. package/dist/src/suiToken.d.ts +22 -0
  140. package/dist/src/suiToken.d.ts.map +1 -0
  141. package/dist/src/suiToken.js +61 -0
  142. package/dist/src/tsui.js +1 -1
  143. package/dist/test/integration/index.d.ts +1 -0
  144. package/dist/test/integration/index.d.ts.map +1 -0
  145. package/dist/test/integration/index.js +1 -0
  146. package/dist/test/local_fullnode/RpcClient.d.ts +60 -0
  147. package/dist/test/local_fullnode/RpcClient.d.ts.map +1 -0
  148. package/dist/test/local_fullnode/RpcClient.js +111 -0
  149. package/dist/test/local_fullnode/faucet.d.ts +6 -0
  150. package/dist/test/local_fullnode/faucet.d.ts.map +1 -0
  151. package/dist/test/local_fullnode/faucet.js +17 -0
  152. package/dist/test/local_fullnode/transactions.d.ts +2 -0
  153. package/dist/test/local_fullnode/transactions.d.ts.map +1 -0
  154. package/dist/test/local_fullnode/transactions.js +190 -0
  155. package/dist/test/resources/sui.d.ts +458 -0
  156. package/dist/test/resources/sui.d.ts.map +1 -0
  157. package/dist/test/resources/sui.js +632 -0
  158. package/dist/test/unit/compareTransactionBlocks.d.ts +2 -0
  159. package/dist/test/unit/compareTransactionBlocks.d.ts.map +1 -0
  160. package/dist/test/unit/compareTransactionBlocks.js +64 -0
  161. package/dist/test/unit/getBuilderFactory.d.ts +3 -0
  162. package/dist/test/unit/getBuilderFactory.d.ts.map +1 -0
  163. package/dist/test/unit/getBuilderFactory.js +10 -0
  164. package/dist/test/unit/keyPair.d.ts +2 -0
  165. package/dist/test/unit/keyPair.d.ts.map +1 -0
  166. package/dist/test/unit/keyPair.js +72 -0
  167. package/dist/test/unit/sui.d.ts +2 -0
  168. package/dist/test/unit/sui.d.ts.map +1 -0
  169. package/dist/test/unit/sui.js +2828 -0
  170. package/dist/test/unit/suiToken.d.ts +2 -0
  171. package/dist/test/unit/suiToken.d.ts.map +1 -0
  172. package/dist/test/unit/suiToken.js +39 -0
  173. package/dist/test/unit/transactionBuilder/customTransactionBuilder.d.ts +2 -0
  174. package/dist/test/unit/transactionBuilder/customTransactionBuilder.d.ts.map +1 -0
  175. package/dist/test/unit/transactionBuilder/customTransactionBuilder.js +106 -0
  176. package/dist/test/unit/transactionBuilder/stakingBuilder.d.ts +2 -0
  177. package/dist/test/unit/transactionBuilder/stakingBuilder.d.ts.map +1 -0
  178. package/dist/test/unit/transactionBuilder/stakingBuilder.js +294 -0
  179. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts +2 -0
  180. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
  181. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +431 -0
  182. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts +2 -0
  183. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
  184. package/dist/test/unit/transactionBuilder/transactionBuilder.js +639 -0
  185. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
  186. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  187. package/dist/test/unit/transactionBuilder/transferBuilder.js +1181 -0
  188. package/dist/test/unit/transactionBuilder/unstakingBuilder.d.ts +2 -0
  189. package/dist/test/unit/transactionBuilder/unstakingBuilder.d.ts.map +1 -0
  190. package/dist/test/unit/transactionBuilder/unstakingBuilder.js +115 -0
  191. package/dist/test/unit/transactionBuilder/walrusStakingBuilder.d.ts +2 -0
  192. package/dist/test/unit/transactionBuilder/walrusStakingBuilder.d.ts.map +1 -0
  193. package/dist/test/unit/transactionBuilder/walrusStakingBuilder.js +289 -0
  194. package/dist/test/unit/transactionBuilder/walrusWithdrawBuilder.d.ts +2 -0
  195. package/dist/test/unit/transactionBuilder/walrusWithdrawBuilder.d.ts.map +1 -0
  196. package/dist/test/unit/transactionBuilder/walrusWithdrawBuilder.js +250 -0
  197. package/dist/test/unit/transferTransaction.d.ts +2 -0
  198. package/dist/test/unit/transferTransaction.d.ts.map +1 -0
  199. package/dist/test/unit/transferTransaction.js +94 -0
  200. package/dist/test/unit/utils.d.ts +2 -0
  201. package/dist/test/unit/utils.d.ts.map +1 -0
  202. package/dist/test/unit/utils.js +186 -0
  203. package/dist/tsconfig.tsbuildinfo +1 -0
  204. package/package.json +19 -12
  205. package/.eslintignore +0 -6
  206. package/.mocharc.yml +0 -8
  207. package/CHANGELOG.md +0 -171
@@ -4,6 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.IntentScope = exports.IntentVersion = exports.AppId = exports.Utils = void 0;
7
+ exports.isImmOrOwnedObj = isImmOrOwnedObj;
7
8
  const sdk_core_1 = require("@bitgo-beta/sdk-core");
8
9
  const bignumber_js_1 = __importDefault(require("bignumber.js"));
9
10
  const constants_1 = require("./constants");
@@ -15,6 +16,13 @@ const types_1 = require("./mystenlab/types");
15
16
  const builder_1 = require("./mystenlab/builder");
16
17
  const keyPair_1 = require("./keyPair");
17
18
  const blake2b_1 = __importDefault(require("@bitgo-beta/blake2b"));
19
+ const TransactionDataBlock_1 = require("./mystenlab/builder/TransactionDataBlock");
20
+ const rpcClient_1 = require("./rpcClient");
21
+ const assert_1 = __importDefault(require("assert"));
22
+ const statics_1 = require("@bitgo-beta/statics");
23
+ function isImmOrOwnedObj(obj) {
24
+ return 'ImmOrOwned' in obj;
25
+ }
18
26
  class Utils {
19
27
  /** @inheritdoc */
20
28
  isValidBlockId(hash) {
@@ -26,7 +34,7 @@ class Utils {
26
34
  }
27
35
  /** @inheritdoc */
28
36
  isValidPublicKey(key) {
29
- return sdk_core_1.isValidEd25519PublicKey(key);
37
+ return (0, sdk_core_1.isValidEd25519PublicKey)(key);
30
38
  }
31
39
  /** @inheritdoc */
32
40
  isValidSignature(signature) {
@@ -44,9 +52,9 @@ class Utils {
44
52
  */
45
53
  isValidRawTransaction(rawTransaction) {
46
54
  try {
47
- const data = bcs_1.fromB64(rawTransaction);
55
+ const data = (0, bcs_1.fromB64)(rawTransaction);
48
56
  const deserialized = builder_1.builder.de('TransactionData', data);
49
- builder_1.builder.ser('TransactionData', deserialized, { maxSize: 1024 * 64 });
57
+ builder_1.builder.ser('TransactionData', deserialized, { maxSize: TransactionDataBlock_1.TRANSACTION_DATA_MAX_SIZE });
50
58
  return true;
51
59
  }
52
60
  catch (e) {
@@ -84,7 +92,7 @@ class Utils {
84
92
  * @param {string} fieldName Name of the field to validate, its needed to return which field is failing on case of error.
85
93
  */
86
94
  validateAddress(address, fieldName) {
87
- if (!address || !types_1.isValidSuiAddress(types_1.normalizeSuiAddress(address))) {
95
+ if (!address || !(0, types_1.isValidSuiAddress)((0, types_1.normalizeSuiAddress)(address))) {
88
96
  throw new sdk_core_1.BuildTransactionError(`Invalid or missing ${fieldName}, got: ${address}`);
89
97
  }
90
98
  }
@@ -120,7 +128,10 @@ class Utils {
120
128
  * @returns {boolean} - the validation result
121
129
  */
122
130
  isValidAmount(amount) {
123
- const bigNumberAmount = new bignumber_js_1.default(Number(amount));
131
+ // Build the BigNumber directly from the raw value. Wrapping in Number() first would
132
+ // truncate integers above 2^53 (e.g. large consolidation amounts in MIST), causing
133
+ // valid amounts to be mis-validated.
134
+ const bigNumberAmount = new bignumber_js_1.default(amount);
124
135
  if (!bigNumberAmount.isInteger() || bigNumberAmount.isLessThanOrEqualTo(0)) {
125
136
  return false;
126
137
  }
@@ -144,11 +155,18 @@ class Utils {
144
155
  getTransactionType(suiTransactionType) {
145
156
  switch (suiTransactionType) {
146
157
  case iface_1.SuiTransactionType.Transfer:
158
+ case iface_1.SuiTransactionType.TokenTransfer:
147
159
  return sdk_core_1.TransactionType.Send;
148
160
  case iface_1.SuiTransactionType.AddStake:
161
+ case iface_1.SuiTransactionType.WalrusStakeWithPool:
149
162
  return sdk_core_1.TransactionType.StakingAdd;
163
+ case iface_1.SuiTransactionType.WalrusRequestWithdrawStake:
164
+ return sdk_core_1.TransactionType.StakingDeactivate;
150
165
  case iface_1.SuiTransactionType.WithdrawStake:
166
+ case iface_1.SuiTransactionType.WalrusWithdrawStake:
151
167
  return sdk_core_1.TransactionType.StakingWithdraw;
168
+ case iface_1.SuiTransactionType.CustomTx:
169
+ return sdk_core_1.TransactionType.CustomTx;
152
170
  }
153
171
  }
154
172
  /**
@@ -159,8 +177,18 @@ class Utils {
159
177
  */
160
178
  getSuiTransactionType(command) {
161
179
  switch (command.kind) {
180
+ case 'SplitCoins':
181
+ if (command.coin.kind === 'GasCoin') {
182
+ return iface_1.SuiTransactionType.Transfer;
183
+ }
184
+ return iface_1.SuiTransactionType.TokenTransfer;
162
185
  case 'TransferObjects':
163
186
  return iface_1.SuiTransactionType.Transfer;
187
+ case 'MergeCoins':
188
+ if (command.destination.kind === 'GasCoin') {
189
+ return iface_1.SuiTransactionType.Transfer;
190
+ }
191
+ return iface_1.SuiTransactionType.TokenTransfer;
164
192
  case 'MoveCall':
165
193
  if (command.target.endsWith(iface_1.MethodNames.RequestAddStake)) {
166
194
  return iface_1.SuiTransactionType.AddStake;
@@ -168,49 +196,233 @@ class Utils {
168
196
  else if (command.target.endsWith(iface_1.MethodNames.RequestWithdrawStake)) {
169
197
  return iface_1.SuiTransactionType.WithdrawStake;
170
198
  }
199
+ else if (command.target.endsWith(iface_1.MethodNames.StakingPoolSplit) ||
200
+ command.target.endsWith(iface_1.MethodNames.PublicTransfer)) {
201
+ return iface_1.SuiTransactionType.CustomTx;
202
+ }
203
+ else if (command.target.endsWith(iface_1.MethodNames.WalrusStakeWithPool)) {
204
+ return iface_1.SuiTransactionType.WalrusStakeWithPool;
205
+ }
206
+ else if (command.target.endsWith(iface_1.MethodNames.WalrusRequestWithdrawStake) ||
207
+ command.target.endsWith(iface_1.MethodNames.WalrusSplitStakedWal)) {
208
+ return iface_1.SuiTransactionType.WalrusRequestWithdrawStake;
209
+ }
210
+ else if (command.target.endsWith(iface_1.MethodNames.WalrusWithdrawStake)) {
211
+ return iface_1.SuiTransactionType.WalrusWithdrawStake;
212
+ }
213
+ else if (command.target.endsWith(iface_1.MethodNames.RedeemFunds)) {
214
+ // redeem_funds is a helper MoveCall used with BalanceWithdrawal to convert
215
+ // address balance into a Coin<T>; it co-exists with Transfer or TokenTransfer commands.
216
+ return iface_1.SuiTransactionType.Transfer;
217
+ }
171
218
  else {
172
- throw new sdk_core_1.InvalidTransactionError(`unsupported target method`);
219
+ throw new sdk_core_1.InvalidTransactionError(`unsupported target method ${command.target}`);
173
220
  }
174
221
  default:
175
- throw new sdk_core_1.InvalidTransactionError(`unsupported transaction kind`);
222
+ throw new sdk_core_1.InvalidTransactionError(`unsupported transaction kind ${command.kind}`);
176
223
  }
177
224
  }
178
225
  getRecipients(tx) {
179
- const amounts = [];
180
- const addresses = [];
181
- tx.tx.transactions.forEach((transaction, i) => {
226
+ const receipts = [];
227
+ const splitResults = [];
228
+ tx.tx.transactions.forEach((transaction) => {
182
229
  if (transaction.kind === 'SplitCoins') {
183
230
  const index = transaction.amounts[0].index;
184
231
  const input = tx.tx.inputs[index];
185
- amounts.push(this.getAmount(input));
232
+ splitResults.push(this.getAmount(input));
233
+ }
234
+ if (transaction.kind === 'MoveCall' && transaction.target.endsWith(iface_1.MethodNames.StakingPoolSplit)) {
235
+ const index = transaction.arguments[1].index;
236
+ const input = tx.tx.inputs[index];
237
+ splitResults.push(this.getAmount(input));
186
238
  }
239
+ });
240
+ const destinations = [];
241
+ tx.tx.transactions.forEach((transaction) => {
187
242
  if (transaction.kind === 'TransferObjects') {
188
243
  const index = transaction.address.index;
189
244
  const input = tx.tx.inputs[index];
190
- addresses.push(this.getAddress(input));
245
+ destinations.push(this.getAddress(input));
246
+ }
247
+ });
248
+ // In Path 1b (sponsored, address-balance-only), after all recipient SplitCoins/TransferObjects
249
+ // there may be one extra TransferObjects that returns change to the sender. That transfer
250
+ // has no corresponding SplitCoins entry, so destinations.length may be splitResults.length+1.
251
+ // Limit the zip to splitResults.length so the change transfer is not counted as a recipient.
252
+ destinations.slice(0, splitResults.length).map((address, i) => {
253
+ receipts.push({
254
+ address: address,
255
+ amount: splitResults[i].toString(),
256
+ });
257
+ });
258
+ // Full-amount addr-bal transfer: the last recipient receives mergedObject (addrCoin)
259
+ // directly via TransferObjects rather than via SplitCoins, to avoid leaving a zero-balance
260
+ // Coin<T> unused (UnusedValueWithoutDrop). Recover amounts from BalanceWithdrawal.
261
+ //
262
+ // Single-recipient (0 SplitCoins, 1 TransferObjects): receipts is empty — recover the
263
+ // full withdrawal amount and push one receipt.
264
+ //
265
+ // Multi-recipient (N-1 SplitCoins, N TransferObjects): receipts has N-1 entries — recover
266
+ // the last recipient's amount as BalanceWithdrawal.amount - sum(splitResults).
267
+ if (receipts.length === 0 && destinations.length > 0) {
268
+ const withdrawalInput = tx.tx.inputs.find((input) => input?.BalanceWithdrawal != null || input?.value?.BalanceWithdrawal != null);
269
+ if (withdrawalInput) {
270
+ const bw = withdrawalInput.BalanceWithdrawal ?? withdrawalInput.value?.BalanceWithdrawal;
271
+ const amount = String(bw.reservation?.MaxAmountU64 ?? bw.amount ?? 0);
272
+ destinations.forEach((address) => {
273
+ receipts.push({ address, amount });
274
+ });
275
+ }
276
+ }
277
+ else if (receipts.length > 0 && destinations.length === receipts.length + 1) {
278
+ const lastDest = destinations[destinations.length - 1];
279
+ // Path 1b with change returns the surplus to the sender via a trailing TransferObjects —
280
+ // this destination is intentionally excluded by the zip-limit above and must not be
281
+ // re-added as a recipient. Only proceed when the last destination is NOT the sender
282
+ // (i.e. it is the final recipient in a multi-recipient full-amount addr-bal send).
283
+ if (lastDest !== tx.sender) {
284
+ const withdrawalInput = tx.tx.inputs.find((input) => input?.BalanceWithdrawal != null || input?.value?.BalanceWithdrawal != null);
285
+ if (withdrawalInput) {
286
+ const bw = withdrawalInput.BalanceWithdrawal ?? withdrawalInput.value?.BalanceWithdrawal;
287
+ const totalWithdrawn = Number(bw.reservation?.MaxAmountU64 ?? bw.amount ?? 0);
288
+ const splitTotal = splitResults.reduce((sum, v) => sum + v, 0);
289
+ const lastAmount = totalWithdrawn - splitTotal;
290
+ if (lastAmount > 0) {
291
+ receipts.push({ address: lastDest, amount: String(lastAmount) });
292
+ }
293
+ }
294
+ }
295
+ }
296
+ tx.tx.transactions.forEach((transaction) => {
297
+ if (transaction.kind === 'MoveCall' && transaction.target.endsWith(iface_1.MethodNames.PublicTransfer)) {
298
+ const destinationArg = transaction.arguments[1];
299
+ const destinationInput = tx.tx.inputs[destinationArg.index];
300
+ const destination = this.getAddress(destinationInput);
301
+ const movingObject = transaction.arguments[0];
302
+ if (movingObject.kind === 'Input') {
303
+ receipts.push({
304
+ address: destination,
305
+ amount: '0', // set 0, not able to get amount merely from parsing
306
+ data: 'unknown amount',
307
+ });
308
+ }
309
+ else if (movingObject.kind === 'Result') {
310
+ receipts.push({
311
+ address: destination,
312
+ amount: splitResults[movingObject.index].toString(),
313
+ });
314
+ }
315
+ }
316
+ });
317
+ return receipts;
318
+ }
319
+ /**
320
+ * Get add staking requests
321
+ *
322
+ * @param {StakingProgrammableTransaction} tx: staking transaction object
323
+ * @return {RequestAddStake[]} add staking requests
324
+ */
325
+ getStakeRequests(tx) {
326
+ const amounts = [];
327
+ const addresses = [];
328
+ tx.transactions.forEach((transaction, i) => {
329
+ if (transaction.kind === 'SplitCoins') {
330
+ const amountInputIdx = transaction.amounts[0].index;
331
+ amounts.push(utils.getAmount(tx.inputs[amountInputIdx]));
332
+ }
333
+ if (transaction.kind === 'MoveCall' &&
334
+ transaction.target.endsWith('::sui_system::request_add_stake')) {
335
+ const validatorAddressInputIdx = transaction.arguments[2]
336
+ .index;
337
+ const validatorAddress = utils.getAddress(tx.inputs[validatorAddressInputIdx]);
338
+ addresses.push(validatorAddress);
191
339
  }
192
340
  });
193
341
  return addresses.map((address, index) => {
194
342
  return {
195
- address: address,
196
- amount: Number(amounts[index]).toString(),
343
+ validatorAddress: address,
344
+ amount: amounts[index],
197
345
  };
198
346
  });
199
347
  }
348
+ getWalrusStakeWithPoolRequests(tx) {
349
+ const amounts = [];
350
+ const addresses = [];
351
+ tx.transactions.forEach((transaction, i) => {
352
+ if (transaction.kind === 'SplitCoins') {
353
+ const amountInputIdx = transaction.amounts[0].index;
354
+ amounts.push(utils.getAmount(tx.inputs[amountInputIdx]));
355
+ }
356
+ if (transaction.kind === 'MoveCall' &&
357
+ transaction.target.endsWith('::staking::stake_with_pool')) {
358
+ const validatorAddressInputIdx = transaction.arguments[2]
359
+ .index;
360
+ const validatorAddress = utils.getAddress(tx.inputs[validatorAddressInputIdx]);
361
+ addresses.push(validatorAddress);
362
+ }
363
+ });
364
+ return addresses.map((address, index) => {
365
+ return {
366
+ validatorAddress: address,
367
+ amount: amounts[index],
368
+ };
369
+ });
370
+ }
371
+ isWalrusRequestWithdrawStakeTx(tx) {
372
+ return tx.transactions
373
+ .filter((transaction) => 'kind' in transaction && transaction.kind === 'MoveCall')
374
+ .some(({ target }) => target.endsWith('::staking::request_withdraw_stake'));
375
+ }
376
+ getWalrusWithdrawStakeRequests(tx) {
377
+ let amount = undefined;
378
+ let stakedWal;
379
+ let stakedWalInputIdx = -1;
380
+ // TS won't let us use filter
381
+ const moveCalls = [];
382
+ tx.transactions.forEach((transaction) => {
383
+ if (transaction.kind === 'MoveCall') {
384
+ moveCalls.push(transaction);
385
+ }
386
+ });
387
+ if (moveCalls.length === 1) {
388
+ // This is either request_withdraw full or withdraw full (either way, no amount)
389
+ stakedWalInputIdx = moveCalls[0].arguments[1].index;
390
+ }
391
+ else if (moveCalls.length === 2) {
392
+ // This is request_withdraw partial
393
+ const amountInputIdx = moveCalls[0].arguments[1].index;
394
+ amount = utils.getAmount(tx.inputs[amountInputIdx]);
395
+ stakedWalInputIdx = moveCalls[0].arguments[0].index;
396
+ }
397
+ else {
398
+ throw new sdk_core_1.InvalidTransactionError('Invalid number of MoveCall transactions');
399
+ }
400
+ let input = tx.inputs[stakedWalInputIdx];
401
+ if ('value' in input) {
402
+ input = input.value;
403
+ }
404
+ if ('Object' in input && isImmOrOwnedObj(input.Object)) {
405
+ stakedWal = utils.normalizeSuiObjectRef(input.Object.ImmOrOwned);
406
+ }
407
+ else {
408
+ throw new sdk_core_1.InvalidTransactionError(`Expected StakedWal object at input index ${stakedWalInputIdx}, found ${input}`);
409
+ }
410
+ return { amount, stakedWal };
411
+ }
200
412
  getAmount(input) {
201
- return sui_bcs_1.isPureArg(input)
202
- ? builder_1.builder.de(bcs_1.BCS.U64, buffer_1.Buffer.from(input.Pure).toString('base64'), 'base64')
413
+ return (0, sui_bcs_1.isPureArg)(input)
414
+ ? builder_1.builder.de(bcs_1.BCS.U64, buffer_1.Buffer.from(new Uint16Array(input.Pure)).toString('base64'), 'base64')
203
415
  : input.value;
204
416
  }
205
417
  getAddress(input) {
206
418
  if (input.hasOwnProperty('value')) {
207
- return sui_bcs_1.isPureArg(input.value)
208
- ? types_1.normalizeSuiAddress(builder_1.builder.de(bcs_1.BCS.ADDRESS, buffer_1.Buffer.from(input === null || input === void 0 ? void 0 : input.value.Pure).toString('base64'), 'base64'))
419
+ return (0, sui_bcs_1.isPureArg)(input.value)
420
+ ? (0, types_1.normalizeSuiAddress)(builder_1.builder.de(bcs_1.BCS.ADDRESS, buffer_1.Buffer.from(new Uint16Array(input.value?.Pure)).toString('base64'), 'base64'))
209
421
  : input.value;
210
422
  }
211
423
  else {
212
- return sui_bcs_1.isPureArg(input)
213
- ? types_1.normalizeSuiAddress(builder_1.builder.de(bcs_1.BCS.ADDRESS, buffer_1.Buffer.from(input.Pure).toString('base64'), 'base64'))
424
+ return (0, sui_bcs_1.isPureArg)(input)
425
+ ? (0, types_1.normalizeSuiAddress)(builder_1.builder.de(bcs_1.BCS.ADDRESS, buffer_1.Buffer.from(new Uint16Array(input.Pure)).toString('base64'), 'base64'))
214
426
  : input.value;
215
427
  }
216
428
  }
@@ -221,7 +433,7 @@ class Utils {
221
433
  }
222
434
  normalizeSuiObjectRef(obj) {
223
435
  return {
224
- objectId: types_1.normalizeSuiObjectId(obj.objectId),
436
+ objectId: (0, types_1.normalizeSuiObjectId)(obj.objectId),
225
437
  version: Number(obj.version),
226
438
  digest: obj.digest,
227
439
  };
@@ -240,11 +452,142 @@ class Utils {
240
452
  const pubBuf = buffer_1.Buffer.from(publicKey, 'hex');
241
453
  tmp.set([keyPair_1.SIGNATURE_SCHEME_TO_FLAG['ED25519']]); // ED25519: 0x00,
242
454
  tmp.set(pubBuf, 1);
243
- return types_1.normalizeSuiAddress(blake2b_1.default(PUBLIC_KEY_SIZE)
455
+ return (0, types_1.normalizeSuiAddress)((0, blake2b_1.default)(PUBLIC_KEY_SIZE)
244
456
  .update(tmp)
245
457
  .digest('hex')
246
458
  .slice(0, constants_1.SUI_ADDRESS_LENGTH * 2));
247
459
  }
460
+ async getFeeEstimate(url, txHex) {
461
+ const result = await (0, rpcClient_1.makeRPC)(url, 'sui_dryRunTransactionBlock', [txHex]);
462
+ (0, assert_1.default)(result.effects);
463
+ (0, assert_1.default)(result.effects.gasUsed);
464
+ if (result.effects.status.status !== 'success') {
465
+ console.error(`Dry run failed, could not automatically determine a budget for txHex ${txHex}`);
466
+ throw new Error(`Failed to get fee estimate`);
467
+ }
468
+ const gasObject = result.effects.gasUsed;
469
+ const storageCost = new bignumber_js_1.default(gasObject.storageCost);
470
+ const computationCost = new bignumber_js_1.default(gasObject.computationCost);
471
+ const storageRebate = new bignumber_js_1.default(gasObject.storageRebate);
472
+ const netCost = computationCost.plus(storageCost).minus(storageRebate);
473
+ return netCost.comparedTo(computationCost) > 0 ? netCost : computationCost;
474
+ }
475
+ /**
476
+ * Returns the current epoch and chain identifier of the Sui network by making RPC calls to the provided URL.
477
+ * @param {string} url - The URL of the Sui network RPC endpoint.
478
+ * @returns {Promise<{ epoch: number; chainId: string }>} - The current epoch and chain identifier.
479
+ */
480
+ async getChainContext(url) {
481
+ const [systemState, genesisCheckpoint] = await Promise.all([
482
+ (0, rpcClient_1.makeRPC)(url, 'suix_getLatestSuiSystemState', []),
483
+ (0, rpcClient_1.makeRPC)(url, 'sui_getCheckpoint', ['0']),
484
+ ]);
485
+ return { epoch: Number(systemState.epoch), chainId: String(genesisCheckpoint.digest) };
486
+ }
487
+ async getBalance(url, owner, coinType) {
488
+ if (coinType === undefined) {
489
+ coinType = types_1.SUI_TYPE_ARG;
490
+ }
491
+ const result = await (0, rpcClient_1.makeRPC)(url, 'suix_getBalance', [owner, coinType]);
492
+ const totalBalance = (result.totalBalance ?? '0').toString();
493
+ const fundsInAddressBalance = (result.fundsInAddressBalance ?? '0').toString();
494
+ const coinObjectBalance = bignumber_js_1.default.max(0, new bignumber_js_1.default(totalBalance).minus(new bignumber_js_1.default(fundsInAddressBalance))).toString();
495
+ return {
496
+ totalBalance,
497
+ coinObjectBalance,
498
+ fundsInAddressBalance,
499
+ };
500
+ }
501
+ async getInputCoins(url, owner, coinType) {
502
+ if (coinType === undefined) {
503
+ coinType = types_1.SUI_TYPE_ARG;
504
+ }
505
+ let hasNextPage = true;
506
+ let cursor = undefined;
507
+ let params = [owner, coinType];
508
+ let data = [];
509
+ while (hasNextPage) {
510
+ if (cursor !== undefined) {
511
+ params = [owner, coinType, cursor];
512
+ }
513
+ try {
514
+ const result = await (0, rpcClient_1.makeRPC)(url, 'suix_getCoins', params);
515
+ data = data.concat(result.data);
516
+ hasNextPage = result.hasNextPage;
517
+ cursor = result.nextCursor;
518
+ }
519
+ catch (e) {
520
+ console.error(`Failed to get input coins from the node ${e}`);
521
+ throw new sdk_core_1.RecoveryProviderError(`Failed to get input coins from the node.`, e);
522
+ }
523
+ }
524
+ return data
525
+ .filter((object) => object.balance !== undefined)
526
+ .map((object) => {
527
+ return {
528
+ coinType: object.coinType,
529
+ objectId: object.coinObjectId,
530
+ version: object.version,
531
+ digest: object.digest,
532
+ balance: new bignumber_js_1.default(object.balance),
533
+ };
534
+ });
535
+ }
536
+ async executeTransactionBlock(url, serializedTx, signatures) {
537
+ const reqType = 'WaitForEffectsCert';
538
+ const options = { showEffects: true };
539
+ const params = [serializedTx, signatures, options, reqType];
540
+ let result;
541
+ try {
542
+ result = await (0, rpcClient_1.makeRPC)(url, 'sui_executeTransactionBlock', params);
543
+ }
544
+ catch (e) {
545
+ throw new Error(`${e.message}`);
546
+ }
547
+ return result.digest;
548
+ }
549
+ validateNonNegativeNumber(defaultVal, errorMsg, inputVal) {
550
+ if (inputVal === undefined) {
551
+ return defaultVal;
552
+ }
553
+ let nonNegativeNum;
554
+ try {
555
+ nonNegativeNum = Number(inputVal);
556
+ }
557
+ catch (e) {
558
+ throw new Error(errorMsg);
559
+ }
560
+ if (isNaN(nonNegativeNum.valueOf()) || nonNegativeNum < 0) {
561
+ throw new Error(errorMsg);
562
+ }
563
+ return nonNegativeNum;
564
+ }
565
+ getSuiTokenFromAddress(packageId, network) {
566
+ const tokens = statics_1.coins.filter((coin) => {
567
+ return (coin instanceof statics_1.SuiCoin &&
568
+ coin.network.type === network.type &&
569
+ coin.packageId.toLowerCase() === packageId.toLowerCase());
570
+ });
571
+ const tokensArray = tokens.map((token) => token);
572
+ if (tokensArray.length >= 1) {
573
+ // there should never be two tokens with the same contract address, so we assert that here
574
+ (0, assert_1.default)(tokensArray.length === 1);
575
+ return tokensArray[0];
576
+ }
577
+ return undefined;
578
+ }
579
+ selectObjectsInDescOrderOfBalance(objs, limit) {
580
+ objs = objs.sort((a, b) => {
581
+ return b.balance.minus(a.balance).toNumber();
582
+ });
583
+ return objs.reduce((acc, obj) => {
584
+ if (limit.gt(0)) {
585
+ acc.push(obj);
586
+ limit = limit.minus(obj.balance);
587
+ }
588
+ return acc;
589
+ }, []);
590
+ }
248
591
  }
249
592
  exports.Utils = Utils;
250
593
  const utils = new Utils();
@@ -252,16 +595,16 @@ exports.default = utils;
252
595
  var AppId;
253
596
  (function (AppId) {
254
597
  AppId[AppId["Sui"] = 0] = "Sui";
255
- })(AppId = exports.AppId || (exports.AppId = {}));
598
+ })(AppId || (exports.AppId = AppId = {}));
256
599
  var IntentVersion;
257
600
  (function (IntentVersion) {
258
601
  IntentVersion[IntentVersion["V0"] = 0] = "V0";
259
- })(IntentVersion = exports.IntentVersion || (exports.IntentVersion = {}));
602
+ })(IntentVersion || (exports.IntentVersion = IntentVersion = {}));
260
603
  var IntentScope;
261
604
  (function (IntentScope) {
262
605
  IntentScope[IntentScope["TransactionData"] = 0] = "TransactionData";
263
606
  IntentScope[IntentScope["TransactionEffects"] = 1] = "TransactionEffects";
264
607
  IntentScope[IntentScope["CheckpointSummary"] = 2] = "CheckpointSummary";
265
608
  IntentScope[IntentScope["PersonalMessage"] = 3] = "PersonalMessage";
266
- })(IntentScope = exports.IntentScope || (exports.IntentScope = {}));
267
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG1EQVE4QjtBQUM5QixnRUFBcUM7QUFDckMsMkNBQWlEO0FBQ2pELHVEQUFzRDtBQUN0RCxxQ0FBMkM7QUFDM0MsbUNBTWlCO0FBQ2pCLG1DQUFnQztBQUNoQyw2Q0FNMkI7QUFDM0IsaURBQWdIO0FBQ2hILHVDQUFxRDtBQUNyRCxrRUFBMEM7QUFFMUMsTUFBYSxLQUFLO0lBQ2hCLGtCQUFrQjtJQUNsQixjQUFjLENBQUMsSUFBWTtRQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixpQkFBaUIsQ0FBQyxHQUFXO1FBQzNCLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGdCQUFnQixDQUFDLEdBQVc7UUFDMUIsT0FBTyxrQ0FBdUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGdCQUFnQixDQUFDLFNBQWlCO1FBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLG9CQUFvQixDQUFDLElBQVk7UUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILHFCQUFxQixDQUFDLGNBQXNCO1FBQzFDLElBQUk7WUFDRixNQUFNLElBQUksR0FBRyxhQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDckMsTUFBTSxZQUFZLEdBQUcsaUJBQU8sQ0FBQyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDekQsaUJBQU8sQ0FBQyxHQUFHLENB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SUFDdkIsNkNBQU0sQ0FBQTtBQUNSLENBQUMsRUFGVyxhQUFhLEdBQWIscUJBQWEsS0FBYixxQkFBYSxRQUV4QjtBQUVELElBQVksV0FLWDtBQUxELFdBQVksV0FBVztJQUNyQixtRUFBbUIsQ0FBQTtJQUNuQix5RUFBc0IsQ0FBQTtJQUN0Qix1RUFBcUIsQ0FBQTtJQUNyQixtRUFBbUIsQ0FBQTtBQUNyQixDQUFDLEVBTFcsV0FBVyxHQUFYLG1CQUFXLEtBQVgsbUJBQVcsUUFLdEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBCYXNlVXRpbHMsXG4gIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcixcbiAgUGFyc2VUcmFuc2FjdGlvbkVycm9yLFxuICBpc1ZhbGlkRWQyNTUxOVB1YmxpY0tleSxcbiAgVHJhbnNhY3Rpb25UeXBlLFxuICBSZWNpcGllbnQsXG4gIEludmFsaWRUcmFuc2FjdGlvbkVycm9yLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgeyBTVUlfQUREUkVTU19MRU5HVEggfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBpc1B1cmVBcmcgfSBmcm9tICcuL215c3RlbmxhYi90eXBlcy9zdWktYmNzJztcbmltcG9ydCB7IEJDUywgZnJvbUI2NCB9IGZyb20gJ0BteXN0ZW4vYmNzJztcbmltcG9ydCB7XG4gIE1ldGhvZE5hbWVzLFxuICBTdWlUcmFuc2FjdGlvbixcbiAgU3VpVHJhbnNhY3Rpb25UeXBlLFxuICBUcmFuc2ZlclByb2dyYW1tYWJsZVRyYW5zYWN0aW9uLFxuICBTdGFraW5nUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb24sXG59IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnYnVmZmVyJztcbmltcG9ydCB7XG4gIGlzVmFsaWRTdWlBZGRyZXNzLFxuICBub3JtYWxpemVTdWlBZGRyZXNzLFxuICBub3JtYWxpemVTdWlPYmplY3RJZCxcbiAgU3VpSnNvblZhbHVlLFxuICBTdWlPYmplY3RSZWYsXG59IGZyb20gJy4vbXlzdGVubGFiL3R5cGVzJztcbmltcG9ydCB7IGJ1aWxkZXIsIFRyYW5zYWN0aW9uQmxvY2tJbnB1dCwgVHJhbnNhY3Rpb25UeXBlIGFzIFRyYW5zYWN0aW9uQ29tbWFuZFR5cGUgfSBmcm9tICcuL215c3RlbmxhYi9idWlsZGVyJztcbmltcG9ydCB7IFNJR05BVFVSRV9TQ0hFTUVfVE9fRkxBRyB9IGZyb20gJy4va2V5UGFpcic7XG5pbXBvcnQgYmxha2UyYiBmcm9tICdAYml0Z28tYmV0YS9ibGFrZTJiJztcblxuZXhwb3J0IGNsYXNzIFV0aWxzIGltcGxlbWVudHMgQmFzZVV0aWxzIHtcbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGlzVmFsaWRCbG9ja0lkKGhhc2g6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkUHJpdmF0ZUtleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkUHVibGljS2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzVmFsaWRFZDI1NTE5UHVibGljS2V5KGtleSk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFNpZ25hdHVyZShzaWduYXR1cmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkVHJhbnNhY3Rpb25JZCh0eElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHJhdyB0cmFuc2FjdGlvbiBjYW4gYmUgZGVzZXJpYWxpemVkXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByYXdUcmFuc2FjdGlvbiAtIHRyYW5zYWN0aW9uIGluIGJhc2U2NCBzdHJpbmcgZm9ybWF0XG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICAgKi9cbiAgaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IGZyb21CNjQocmF3VHJhbnNhY3Rpb24pO1xuICAgICAgY29uc3QgZGVzZXJpYWxpemVkID0gYnVpbGRlci5kZSgnVHJhbnNhY3Rpb25EYXRhJywgZGF0YSk7XG4gICAgICBidWlsZGVyLnNlcignVHJhbnNhY3Rpb25EYXRhJywgZGVzZXJpYWxpemVkLCB7IG1heFNpemU6IDEwMjQgKiA2NCB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgdGhlIHJhdyB0cmFuc2FjdGlvbiBoYXMgYSB2YWxpZCBmb3JtYXQgaW4gdGhlIGJsb2NrY2hhaW4gY29udGV4dCwgdGhyb3cgb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmF3VHJhbnNhY3Rpb24gLSBUcmFuc2FjdGlvbiBpbiBiYXNlNjQgc3RyaW5nICBmb3JtYXRcbiAgICovXG4gIHZhbGlkYXRlUmF3VHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb246IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghcmF3VHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgcmF3IHRyYW5zYWN0aW9uOiBVbmRlZmluZWQnKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgcmF3IHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhZGRyZXNzZXMgdG8gY2hlY2sgaWYgYWxsIGV4aXN0IGFuZCBhcmUgdmFsaWQgU3VpIHB1YmxpYyBrZXlzXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzZXMgVGhlIGFkZHJlc3MgdG8gYmUgdmFsaWRhdGVkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZE5hbWUgTmFtZSBvZiB0aGUgZmllbGQgdG8gdmFsaWRhdGUsIGl0cyBuZWVkZWQgdG8gcmV0dXJuIHdoaWNoIGZpZWxkIGlzIGZhaWxpbmcgb24gY2FzZSBvZiBlcnJvci5cbiAgICovXG4gIHZhbGlkYXRlQWRkcmVzc2VzKGFkZHJlc3Nlczogc3RyaW5nW10sIGZpZWxkTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBhZGRyZXNzIG9mIGFkZHJlc3Nlcykge1xuICAgICAgdGhpcy52YWxpZGF0ZUFkZHJlc3MoYWRkcmVzcywgZmllbGROYW1lKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGFkZHJlc3MgdG8gY2hlY2sgaWYgaXQgZXhpc3RzIGFuZCBpcyBhIHZhbGlkIFN1aSBwdWJsaWMga2V5XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzIFRoZSBhZGRyZXNzIHRvIGJlIHZhbGlkYXRlZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmllbGROYW1lIE5hbWUgb2YgdGhlIGZpZWxkIHRvIHZhbGlkYXRlLCBpdHMgbmVlZGVkIHRvIHJldHVybiB3aGljaCBmaWVsZCBpcyBmYWlsaW5nIG9uIGNhc2Ugb2YgZXJyb3IuXG4gICAqL1xuICB2YWxpZGF0ZUFkZHJlc3MoYWRkcmVzczogc3RyaW5nLCBmaWVsZE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghYWRkcmVzcyB8fCAhaXNWYWxpZFN1aUFkZHJlc3Mobm9ybWFsaXplU3VpQWRkcmVzcyhhZGRyZXNzKSkpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgb3IgbWlzc2luZyAke2ZpZWxkTmFtZX0sIGdvdDogJHthZGRyZXNzfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0hleChhZGRyZXNzKSAmJiB0aGlzLmdldEhleEJ5dGVMZW5ndGgoYWRkcmVzcykgPT09IFNVSV9BRERSRVNTX0xFTkdUSDtcbiAgfVxuXG4gIGlzSGV4KHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gL14oMHh8MFgpP1thLWZBLUYwLTldKyQvLnRlc3QodmFsdWUpICYmIHZhbHVlLmxlbmd0aCAlIDIgPT09IDA7XG4gIH1cblxuICBnZXRIZXhCeXRlTGVuZ3RoKHZhbHVlOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIC8vIHJldHVybiAvXigweHwwWCkvLnRlc3QodmFsdWUpID8gKHZhbHVlLmxlbmd0aCAtIDIpIC8gMiA6IHZhbHVlLmxlbmd0aCAvIDI7XG4gICAgcmV0dXJuIC9eKDB4fDBYKS8udGVzdCh2YWx1ZSkgPyAodmFsdWUubGVuZ3RoIC0gMikgLyAyIDogdmFsdWUubGVuZ3RoIC8gMjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBzdHJpbmcgaXMgYSB2YWxpZCBhbW91bnRcbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJbXX0gYW1vdW50cyAtIHRoZSBhbW91bnRzIHRvIHZhbGlkYXRlXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICAgKi9cbiAgaXNWYWxpZEFtb3VudHMoYW1vdW50czogbnVtYmVyW10pOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IGFtb3VudCBvZiBhbW91bnRzKSB7XG4gICAgICBpZiAoIXRoaXMuaXNWYWxpZEFtb3VudChhbW91bnQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgYW1vdW50XG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhbW91bnRzIC0gdGhlIGFtb3VudCB0byB2YWxpZGF0ZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0aGUgdmFsaWRhdGlvbiByZXN1bHRcbiAgICovXG4gIGlzVmFsaWRBbW91bnQoYW1vdW50OiBzdHJpbmcgfCBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBiaWdOdW1iZXJBbW91bnQgPSBuZXcgQmlnTnVtYmVyKE51bWJlcihhbW91bnQpKTtcbiAgICBpZiAoIWJpZ051bWJlckFtb3VudC5pc0ludGVnZXIoKSB8fCBiaWdOdW1iZXJBbW91bnQuaXNMZXNzVGhhbk9yRXF1YWxUbygwKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemVzIGhleCBpZHMgKGFkZHJlc3Nlcywgb2JqZWN0IGlkcykgdG8gYWx3YXlzIGNvbnRhaW4gdGhlICcweCcgcHJlZml4LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaWRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiovXG4gIG5vcm1hbGl6ZUhleElkKGlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBpZC5zdGFydHNXaXRoKCcweCcpID8gaWQgOiAnMHgnLmNvbmNhdChpZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRyYW5zYWN0aW9uIHR5cGUgYnkgZnVuY3Rpb24gbmFtZVxuICAgKlxuICAgKiBAcGFyYW0ge01ldGhvZE5hbWVzfSBmY3ROYW1lXG4gICAqIEByZXR1cm4ge1RyYW5zYWN0aW9uVHlwZX1cbiAgICovXG4gIGdldFRyYW5zYWN0aW9uVHlwZShzdWlUcmFuc2FjdGlvblR5cGU6IFN1aVRyYW5zYWN0aW9uVHlwZSk6IFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgc3dpdGNoIChzdWlUcmFuc2FjdGlvblR5cGUpIHtcbiAgICAgIGNhc2UgU3VpVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyOlxuICAgICAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlNlbmQ7XG4gICAgICBjYXNlIFN1aVRyYW5zYWN0aW9uVHlwZS5BZGRTdGFrZTpcbiAgICAgICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWRkO1xuICAgICAgY2FzZSBTdWlUcmFuc2FjdGlvblR5cGUuV2l0aGRyYXdTdGFrZTpcbiAgICAgICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nV2l0aGRyYXc7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBTVUkgdHJhbnNhY3Rpb24gdHlwZVxuICAgKlxuICAgKiBAcGFyYW0ge01ldGhvZE5hbWVzfSBmY3ROYW1lXG4gICAqIEByZXR1cm4ge1RyYW5zYWN0aW9uVHlwZX1cbiAgICovXG4gIGdldFN1aVRyYW5zYWN0aW9uVHlwZShjb21tYW5kOiBUcmFuc2FjdGlvbkNvbW1hbmRUeXBlKTogU3VpVHJhbnNhY3Rpb25UeXBlIHtcbiAgICBzd2l0Y2ggKGNvbW1hbmQua2luZCkge1xuICAgICAgY2FzZSAnVHJhbnNmZXJPYmplY3RzJzpcbiAgICAgICAgcmV0dXJuIFN1aVRyYW5zYWN0aW9uVHlwZS5UcmFuc2ZlcjtcbiAgICAgIGNhc2UgJ01vdmVDYWxsJzpcbiAgICAgICAgaWYgKGNvbW1hbmQudGFyZ2V0LmVuZHNXaXRoKE1ldGhvZE5hbWVzLlJlcXVlc3RBZGRTdGFrZSkpIHtcbiAgICAgICAgICByZXR1cm4gU3VpVHJhbnNhY3Rpb25UeXBlLkFkZFN0YWtlO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbW1hbmQudGFyZ2V0LmVuZHNXaXRoKE1ldGhvZE5hbWVzLlJlcXVlc3RXaXRoZHJhd1N0YWtlKSkge1xuICAgICAgICAgIHJldHVybiBTdWlUcmFuc2FjdGlvblR5cGUuV2l0aGRyYXdTdGFrZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoYHVuc3VwcG9ydGVkIHRhcmdldCBtZXRob2RgKTtcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKGB1bnN1cHBvcnRlZCB0cmFuc2FjdGlvbiBraW5kYCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0UmVjaXBpZW50cyh0eDogU3VpVHJhbnNhY3Rpb248VHJhbnNmZXJQcm9ncmFtbWFibGVUcmFuc2FjdGlvbiB8IFN0YWtpbmdQcm9ncmFtbWFibGVUcmFuc2FjdGlvbj4pOiBSZWNpcGllbnRbXSB7XG4gICAgY29uc3QgYW1vdW50czogbnVtYmVyW10gPSBbXTtcbiAgICBjb25zdCBhZGRyZXNzZXM6IHN0cmluZ1tdID0gW107XG4gICAgdHgudHgudHJhbnNhY3Rpb25zLmZvckVhY2goKHRyYW5zYWN0aW9uLCBpKSA9PiB7XG4gICAgICBpZiAodHJhbnNhY3Rpb24ua2luZCA9PT0gJ1NwbGl0Q29pbnMnKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdHJhbnNhY3Rpb24uYW1vdW50c1swXS5pbmRleDtcbiAgICAgICAgY29uc3QgaW5wdXQgPSB0eC50eC5pbnB1dHNbaW5kZXhdIGFzIGFueTtcbiAgICAgICAgYW1vdW50cy5wdXNoKHRoaXMuZ2V0QW1vdW50KGlucHV0KSk7XG4gICAgICB9XG4gICAgICBpZiAodHJhbnNhY3Rpb24ua2luZCA9PT0gJ1RyYW5zZmVyT2JqZWN0cycpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0cmFuc2FjdGlvbi5hZGRyZXNzLmluZGV4O1xuICAgICAgICBjb25zdCBpbnB1dCA9IHR4LnR4LmlucHV0c1tpbmRleF0gYXMgYW55O1xuICAgICAgICBhZGRyZXNzZXMucHVzaCh0aGlzLmdldEFkZHJlc3MoaW5wdXQpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gYWRkcmVzc2VzLm1hcCgoYWRkcmVzcywgaW5kZXgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFkZHJlc3M6IGFkZHJlc3MsXG4gICAgICAgIGFtb3VudDogTnVtYmVyKGFtb3VudHNbaW5kZXhdKS50b1N0cmluZygpLFxuICAgICAgfSBhcyBSZWNpcGllbnQ7XG4gICAgfSk7XG4gIH1cblxuICBnZXRBbW91bnQoaW5wdXQ6IFN1aUpzb25WYWx1ZSB8IFRyYW5zYWN0aW9uQmxvY2tJbnB1dCk6IG51bWJlciB7XG4gICAgcmV0dXJuIGlzUHVyZUFyZyhpbnB1dClcbiAgICAgID8gYnVpbGRlci5kZShCQ1MuVTY0LCBCdWZmZXIuZnJvbShpbnB1dC5QdXJlKS50b1N0cmluZygnYmFzZTY0JyksICdiYXNlNjQnKVxuICAgICAgOiAoaW5wdXQgYXMgVHJhbnNhY3Rpb25CbG9ja0lucHV0KS52YWx1ZTtcbiAgfVxuXG4gIGdldEFkZHJlc3MoaW5wdXQ6IFRyYW5zYWN0aW9uQmxvY2tJbnB1dCk6IHN0cmluZyB7XG4gICAgaWYgKGlucHV0Lmhhc093blByb3BlcnR5KCd2YWx1ZScpKSB7XG4gICAgICByZXR1cm4gaXNQdXJlQXJnKGlucHV0LnZhbHVlKVxuICAgICAgICA/IG5vcm1hbGl6ZVN1aUFkZHJlc3MoYnVpbGRlci5kZShCQ1MuQUREUkVTUywgQnVmZmVyLmZyb20oaW5wdXQ/LnZhbHVlLlB1cmUpLnRvU3RyaW5nKCdiYXNlNjQnKSwgJ2Jhc2U2NCcpKVxuICAgICAgICA6IChpbnB1dCBhcyBUcmFuc2FjdGlvbkJsb2NrSW5wdXQpLnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaXNQdXJlQXJnKGlucHV0KVxuICAgICAgICA/IG5vcm1hbGl6ZVN1aUFkZHJlc3MoYnVpbGRlci5kZShCQ1MuQUREUkVTUywgQnVmZmVyLmZyb20oaW5wdXQuUHVyZSkudG9TdHJpbmcoJ2Jhc2U2NCcpLCAnYmFzZTY0JykpXG4gICAgICAgIDogKGlucHV0IGFzIFRyYW5zYWN0aW9uQmxvY2tJbnB1dCkudmFsdWU7XG4gICAgfVxuICB9XG5cbiAgbm9ybWFsaXplQ29pbnMoY29pbnM6IGFueVtdKTogU3VpT2JqZWN0UmVmW10ge1xuICAgIHJldHVybiBjb2lucy5tYXAoKGNvaW4pID0+IHtcbiAgICAgIHJldHVybiB1dGlscy5ub3JtYWxpemVTdWlPYmplY3RSZWYoY29pbik7XG4gICAgfSk7XG4gIH1cblxuICBub3JtYWxpemVTdWlPYmplY3RSZWYob2JqOiBTdWlPYmplY3RSZWYpOiBTdWlPYmplY3RSZWYge1xuICAgIHJldHVybiB7XG4gICAgICBvYmplY3RJZDogbm9ybWFsaXplU3VpT2JqZWN0SWQob2JqLm9iamVjdElkKSxcbiAgICAgIHZlcnNpb246IE51bWJlcihvYmoudmVyc2lvbiksXG4gICAgICBkaWdlc3Q6IG9iai5kaWdlc3QsXG4gICAgfTtcbiAgfVxuXG4gIHRyYW5zYWN0aW9uSW5wdXQodHlwZTogJ29iamVjdCcgfCAncHVyZScsIGluZGV4ID0gMCwgdmFsdWU/OiB1bmtub3duKTogVHJhbnNhY3Rpb25CbG9ja0lucHV0IHtcbiAgICByZXR1cm4ge1xuICAgICAga2luZDogJ0lucHV0JyxcbiAgICAgIHZhbHVlOiB0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnID8gU3RyaW5nKHZhbHVlKSA6IHZhbHVlLFxuICAgICAgaW5kZXgsXG4gICAgICB0eXBlLFxuICAgIH07XG4gIH1cblxuICBnZXRBZGRyZXNzRnJvbVB1YmxpY0tleShwdWJsaWNLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgUFVCTElDX0tFWV9TSVpFID0gMzI7XG4gICAgY29uc3QgdG1wID0gbmV3IFVpbnQ4QXJyYXkoUFVCTElDX0tFWV9TSVpFICsgMSk7XG4gICAgY29uc3QgcHViQnVmID0gQnVmZmVyLmZyb20ocHVibGljS2V5LCAnaGV4Jyk7XG4gICAgdG1wLnNldChbU0lHTkFUVVJFX1NDSEVNRV9UT19GTEFHWydFRDI1NTE5J11dKTsgLy8gRUQyNTUxOTogMHgwMCxcbiAgICB0bXAuc2V0KHB1YkJ1ZiwgMSk7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVN1aUFkZHJlc3MoXG4gICAgICBibGFrZTJiKFBVQkxJQ19LRVlfU0laRSlcbiAgICAgICAgLnVwZGF0ZSh0bXApXG4gICAgICAgIC5kaWdlc3QoJ2hleCcpXG4gICAgICAgIC5zbGljZSgwLCBTVUlfQUREUkVTU19MRU5HVEggKiAyKVxuICAgICk7XG4gIH1cbn1cblxuY29uc3QgdXRpbHMgPSBuZXcgVXRpbHMoKTtcbmV4cG9ydCBkZWZhdWx0IHV0aWxzO1xuXG5leHBvcnQgZW51bSBBcHBJZCB7XG4gIFN1aSA9IDAsXG59XG5cbmV4cG9ydCBlbnVtIEludGVudFZlcnNpb24ge1xuICBWMCA9IDAsXG59XG5cbmV4cG9ydCBlbnVtIEludGVudFNjb3BlIHtcbiAgVHJhbnNhY3Rpb25EYXRhID0gMCxcbiAgVHJhbnNhY3Rpb25FZmZlY3RzID0gMSxcbiAgQ2hlY2twb2ludFN1bW1hcnkgPSAyLFxuICBQZXJzb25hbE1lc3NhZ2UgPSAzLFxufVxuXG5leHBvcnQgdHlwZSBJbnRlbnQgPSBbSW50ZW50U2NvcGUsIEludGVudFZlcnNpb24sIEFwcElkXTtcbiJdfQ==
609
+ })(IntentScope || (exports.IntentScope = IntentScope = {}));
610
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQXFEQSwwQ0FFQztBQXZERCxtREFTOEI7QUFDOUIsZ0VBQXFDO0FBQ3JDLDJDQUFpRDtBQUNqRCx1REFBc0Q7QUFDdEQscUNBQTJDO0FBQzNDLG1DQWFpQjtBQUNqQixtQ0FBZ0M7QUFDaEMsNkNBTzJCO0FBQzNCLGlEQVE2QjtBQUM3Qix1Q0FBcUQ7QUFDckQsa0VBQTBDO0FBQzFDLG1GQUFxRjtBQUNyRiwyQ0FBc0M7QUFDdEMsb0RBQTRCO0FBQzVCLGlEQUFrRTtBQUVsRSxTQUFnQixlQUFlLENBQUMsR0FBNEI7SUFDMUQsT0FBTyxZQUFZLElBQUksR0FBRyxDQUFDO0FBQzdCLENBQUM7QUFFRCxNQUFhLEtBQUs7SUFDaEIsa0JBQWtCO0lBQ2xCLGNBQWMsQ0FBQyxJQUFZO1FBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGlCQUFpQixDQUFDLEdBQVc7UUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsZ0JBQWdCLENBQUMsR0FBVztRQUMxQixPQUFPLElBQUEsa0NBQXVCLEVBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixnQkFBZ0IsQ0FBQyxTQUFpQjtRQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixvQkFBb0IsQ0FBQyxJQUFZO1FBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxxQkFBcUIsQ0FBQyxjQUFzQjtRQUMxQyxJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksR0FBRyxJQUFBLGFBQU8sRUFBQyxjQUFjLENBQUMsQ0FBQztZQUNyQyxNQUFNLFlBQVksR0FBRyxpQkFBTyxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN6RCxpQkFBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsRUFBRSxPQUFPLEVBQUUsZ0RBQXlCLEVBQUUsQ0FBQyxDQUFDO1lBQ3JGLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILHNCQUFzQixDQUFDLGNBQXNCO1FBQzNDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNwQixNQUFNLElBQUksZ0NBQXFCLENBQUMsb0NBQW9DLENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1lBQ2hELE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQzdELENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxpQkFBaUIsQ0FBQyxTQUFtQixFQUFFLFNBQWlCO1FBQ3RELEtBQUssTUFBTSxPQUFPLElBQUksU0FBUyxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDM0MsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGVBQWUsQ0FBQyxPQUFlLEVBQUUsU0FBaUI7UUFDaEQsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUEseUJBQWlCLEVBQUMsSUFBQSwyQkFBbUIsRUFBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDakUsTUFBTSxJQUFJLGdDQUFxQixDQUFDLHNCQUFzQixTQUFTLFVBQVUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN0RixDQUFDO0lBQ0gsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixjQUFjLENBQUMsT0FBZTtRQUM1QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxLQUFLLDhCQUFrQixDQUFDO0lBQ3RGLENBQUM7SUFFRCxLQUFLLENBQUMsS0FBYTtRQUNqQixPQUFPLHdCQUF3QixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVELGdCQUFnQixDQUFDLEtBQWE7UUFDNUIsNkVBQTZFO1FBQzdFLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsY0FBYyxDQUFDLE9BQWlCO1FBQzlCLEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDaEMsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsYUFBYSxDQUFDLE1BQXVCO1FBQ25DLG9GQUFvRjtRQUNwRixtRkFBbUY7UUFDbkYscUNBQXFDO1FBQ3JDLE1BQU0sZUFBZSxHQUFHLElBQUksc0JBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxJQUFJLGVBQWUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzNFLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7OztRQUtJO0lBQ0osY0FBYyxDQUFDLEVBQVU7UUFDdkIsT0FBTyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsa0JBQWtCLENBQUMsa0JBQXNDO1FBQ3ZELFFBQVEsa0JBQWtCLEVBQUUsQ0FBQztZQUMzQixLQUFLLDBCQUFrQixDQUFDLFFBQVEsQ0FBQztZQUNqQyxLQUFLLDBCQUFrQixDQUFDLGFBQWE7Z0JBQ25DLE9BQU8sMEJBQWUsQ0FBQyxJQUFJLENBQUM7WUFDOUIsS0FBSywwQkFBa0IsQ0FBQyxRQUFRLENBQUM7WUFDakMsS0FBSywwQkFBa0IsQ0FBQyxtQkFBbUI7Z0JBQ3pDLE9BQU8sMEJBQWUsQ0FBQyxVQUFVLENBQUM7WUFDcEMsS0FBSywwQkFBa0IsQ0FBQywwQkFBMEI7Z0JBQ2hELE9BQU8sMEJBQWUsQ0FBQyxpQkFBaUIsQ0FBQztZQUMzQyxLQUFLLDBCQUFrQixDQUFDLGFBQWEsQ0FBQztZQUN0QyxLQUFLLDBCQUFrQixDQUFDLG1CQUFtQjtnQkFDekMsT0FBTywwQkFBZSxDQUFDLGVBQWUsQ0FBQztZQUN6QyxLQUFLLDBCQUFrQixDQUFDLFFBQVE7Z0JBQzlCLE9BQU8sMEJBQWUsQ0FBQyxRQUFRLENBQUM7UUFDcEMsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILHFCQUFxQixDQUFDLE9BQStCO1FBQ25ELFFBQVEsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3JCLEtBQUssWUFBWTtnQkFDZixJQUFLLE9BQWlDLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDL0QsT0FBTywwQkFBa0IsQ0FBQyxRQUFRLENBQUM7Z0JBQ3JDLENBQUM7Z0JBQ0QsT0FBTywwQkFBa0IsQ0FBQyxhQUFhLENBQUM7WUFDMUMsS0FBSyxpQkFBaUI7Z0JBQ3BCLE9BQU8sMEJBQWtCLENBQUMsUUFBUSxDQUFDO1lBQ3JDLEtBQUssWUFBWTtnQkFDZixJQUFLLE9BQWlDLENBQUMsV0FBVyxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDdEUsT0FBTywwQkFBa0IsQ0FBQyxRQUFRLENBQUM7Z0JBQ3JDLENBQUM7Z0JBQ0QsT0FBTywwQkFBa0IsQ0FBQyxhQUFhLENBQUM7WUFDMUMsS0FBSyxVQUFVO2dCQUNiLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsbUJBQVcsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO29CQUN6RCxPQUFPLDBCQUFrQixDQUFDLFFBQVEsQ0FBQztnQkFDckMsQ0FBQztxQkFBTSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLG1CQUFXLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDO29CQUNyRSxPQUFPLDBCQUFrQixDQUFDLGFBQWEsQ0FBQztnQkFDMUMsQ0FBQztxQkFBTSxJQUNMLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLG1CQUFXLENBQUMsZ0JBQWdCLENBQUM7b0JBQ3JELE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLG1CQUFXLENBQUMsY0FBYyxDQUFDLEVBQ25ELENBQUM7b0JBQ0QsT0FBTywwQkFBa0IsQ0FBQyxRQUFRLENBQUM7Z0JBQ3JDLENBQUM7cUJBQU0sSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxtQkFBVyxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQztvQkFDcEUsT0FBTywwQkFBa0IsQ0FBQyxtQkFBbUIsQ0FBQztnQkFDaEQsQ0FBQztxQkFBTSxJQUNMLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLG1CQUFXLENBQUMsMEJBQTBCLENBQUM7b0JBQy9ELE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLG1CQUFXLENBQUMsb0JBQW9CLENBQUMsRUFDekQsQ0FBQztvQkFDRCxPQUFPLDBCQUFrQixDQUFDLDBCQUEwQixDQUFDO2dCQUN2RCxDQUFDO3FCQUFNLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsbUJBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUM7b0JBQ3BFLE9BQU8sMEJBQWtCLENBQUMsbUJBQW1CLENBQUM7Z0JBQ2hELENBQUM7cUJBQU0sSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxtQkFBVyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7b0JBQzVELDJFQUEyRTtvQkFDM0Usd0ZBQXdGO29CQUN4RixPQUFPLDBCQUFrQixDQUFDLFFBQVEsQ0FBQztnQkFDckMsQ0FBQztxQkFBTSxDQUFDO29CQUNOLE1BQU0sSUFBSSxrQ0FBdUIsQ0FBQyw2QkFBNkIsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7Z0JBQ25GLENBQUM7WUFDSDtnQkFDRSxNQUFNLElBQUksa0NBQXVCLENBQUMsZ0NBQWdDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3RGLENBQUM7SUFDSCxDQUFDO0lBRUQsYUFBYSxDQUFDLEVBQThDO1FBQzFELE1BQU0sUUFBUSxHQUFnQixFQUFFLENBQUM7UUFDakMsTUFBTSxZQUFZLEdBQWEsRUFBRSxDQUFDO1FBQ2xDLEVBQUUsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQ3pDLElBQUksV0FBVyxDQUFDLElBQUksS0FBSyxZQUFZLEVBQUUsQ0FBQztnQkFDdEMsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7Z0JBQzNDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBUSxDQUFDO2dCQUN6QyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUMzQyxDQUFDO1lBRUQsSUFBSSxXQUFXLENBQUMsSUFBSSxLQUFLLFVBQVUsSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxtQkFBVyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztnQkFDakcsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7Z0JBQzdDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBUSxDQUFDO2dCQUN6QyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUMzQyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLFlBQVksR0FBYSxFQUFFLENBQUM7UUFDbEMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUU7WUFDekMsSUFBSSxXQUFXLENBQUMsSUFBSSxLQUFLLGlCQUFpQixFQUFFLENBQUM7Z0JBQzNDLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO2dCQUN4QyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQVEsQ0FBQztnQkFDekMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDNUMsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsK0ZBQStGO1FBQy9GLDJGQUEyRjtRQUMzRiw4RkFBOEY7UUFDOUYsNkZBQTZGO1FBQzdGLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDNUQsUUFBUSxDQUFDLElBQUksQ0FBQztnQkFDWixPQUFPLEVBQUUsT0FBTztnQkFDaEIsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7YUFDbkMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxxRkFBcUY7UUFDckYsMkZBQTJGO1FBQzNGLG1GQUFtRjtRQUNuRixFQUFFO1FBQ0Ysc0ZBQXNGO1FBQ3RGLCtDQUErQztRQUMvQyxFQUFFO1FBQ0YsMEZBQTBGO1FBQzFGLCtFQUErRTtRQUMvRSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDckQsTUFBTSxlQUFlLEdBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFnQixDQUFDLElBQUksQ0FDbEQsQ0FBQyxLQUFVLEVBQUUsRUFBRSxDQUFDLEtBQUssRUFBRSxpQkFBaUIsSUFBSSxJQUFJLElBQUksS0FBSyxFQUFFLEtBQUssRUFBRSxpQkFBaUIsSUFBSSxJQUFJLENBQ3JGLENBQUM7WUFDVCxJQUFJLGVBQWUsRUFBRSxDQUFDO2dCQUNwQixNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsaUJBQWlCLElBQUksZUFBZSxDQUFDLEtBQUssRUFBRSxpQkFBaUIsQ0FBQztnQkFDekYsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsWUFBWSxJQUFJLEVBQUUsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3RFLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtvQkFDL0IsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO2dCQUNyQyxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO2FBQU0sSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDOUUsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDdkQseUZBQXlGO1lBQ3pGLG9GQUFvRjtZQUNwRixvRkFBb0Y7WUFDcEYsbUZBQW1GO1lBQ25GLElBQUksUUFBUSxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDM0IsTUFBTSxlQUFlLEdBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFnQixDQUFDLElBQUksQ0FDbEQsQ0FBQyxLQUFVLEVBQUUsRUFBRSxDQUFDLEtBQUssRUFBRSxpQkFBaUIsSUFBSSxJQUFJLElBQUksS0FBSyxFQUFFLEtBQUssRUFBRSxpQkFBaUIsSUFBSSxJQUFJLENBQ3JGLENBQUM7Z0JBQ1QsSUFBSSxlQUFlLEVBQUUsQ0FBQztvQkFDcEIsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLGlCQUFpQixJQUFJLGVBQWUsQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLENBQUM7b0JBQ3pGLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLFlBQVksSUFBSSxFQUFFLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDO29CQUM5RSxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDL0QsTUFBTSxVQUFVLEdBQUcsY0FBYyxHQUFHLFVBQVUsQ0FBQztvQkFDL0MsSUFBSSxVQUFVLEdBQUcsQ0FBQyxFQUFFLENBQUM7d0JBQ25CLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUNuRSxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELEVBQUUsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQ3pDLElBQUksV0FBVyxDQUFDLElBQUksS0FBSyxVQUFVLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsbUJBQVcsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO2dCQUMvRixNQUFNLGNBQWMsR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNoRCxNQUFNLGdCQUFnQixHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQVEsQ0FBQztnQkFDbkUsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUV0RCxNQUFNLFlBQVksR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM5QyxJQUFJLFlBQVksQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7b0JBQ2xDLFFBQVEsQ0FBQyxJQUFJLENBQUM7d0JBQ1osT0FBTyxFQUFFLFdBQVc7d0JBQ3BCLE1BQU0sRUFBRSxHQUFHLEVBQUUsb0RBQW9EO3dCQUNqRSxJQUFJLEVBQUUsZ0JBQWdCO3FCQUN2QixDQUFDLENBQUM7Z0JBQ0wsQ0FBQztxQkFBTSxJQUFJLFlBQVksQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQzFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7d0JBQ1osT0FBTyxFQUFFLFdBQVc7d0JBQ3BCLE1BQU0sRUFBRSxZQUFZLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsRUFBRTtxQkFDcEQsQ0FBQyxDQUFDO2dCQUNMLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxnQkFBZ0IsQ0FBQyxFQUFrQztRQUNqRCxNQUFNLE9BQU8sR0FBYSxFQUFFLENBQUM7UUFDN0IsTUFBTSxTQUFTLEdBQWEsRUFBRSxDQUFDO1FBQy9CLEVBQUUsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3pDLElBQUksV0FBVyxDQUFDLElBQUksS0FBSyxZQUFZLEVBQUUsQ0FBQztnQkFDdEMsTUFBTSxjQUFjLEdBQUssV0FBcUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUEyQixDQUFDLEtBQUssQ0FBQztnQkFDMUcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUEwQixDQUFDLENBQUMsQ0FBQztZQUNwRixDQUFDO1lBQ0QsSUFDRSxXQUFXLENBQUMsSUFBSSxLQUFLLFVBQVU7Z0JBQzlCLFdBQW1DLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxpQ0FBaUMsQ0FBQyxFQUN2RixDQUFDO2dCQUNELE1BQU0sd0JBQXdCLEdBQUssV0FBbUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUEyQjtxQkFDMUcsS0FBSyxDQUFDO2dCQUNULE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUEwQixDQUFDLENBQUM7Z0JBQ3hHLFNBQVMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUNuQyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDdEMsT0FBTztnQkFDTCxnQkFBZ0IsRUFBRSxPQUFPO2dCQUN6QixNQUFNLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQzthQUNKLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsOEJBQThCLENBQUMsRUFBd0M7UUFDckUsTUFBTSxPQUFPLEdBQWEsRUFBRSxDQUFDO1FBQzdCLE1BQU0sU0FBUyxHQUFhLEVBQUUsQ0FBQztRQUMvQixFQUFFLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN6QyxJQUFJLFdBQVcsQ0FBQyxJQUFJLEtBQUssWUFBWSxFQUFFLENBQUM7Z0JBQ3RDLE1BQU0sY0FBYyxHQUFLLFdBQXFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBMkIsQ0FBQyxLQUFLLENBQUM7Z0JBQzFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBMEIsQ0FBQyxDQUFDLENBQUM7WUFDcEYsQ0FBQztZQUNELElBQ0UsV0FBVyxDQUFDLElBQUksS0FBSyxVQUFVO2dCQUM5QixXQUFtQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsNEJBQTRCLENBQUMsRUFDbEYsQ0FBQztnQkFDRCxNQUFNLHdCQUF3QixHQUFLLFdBQW1DLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBMkI7cUJBQzFHLEtBQUssQ0FBQztnQkFDVCxNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBMEIsQ0FBQyxDQUFDO2dCQUN4RyxTQUFTLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDbkMsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ3RDLE9BQU87Z0JBQ0wsZ0JBQWdCLEVBQUUsT0FBTztnQkFDekIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUM7YUFDTyxDQUFDO1FBQ2xDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELDhCQUE4QixDQUFDLEVBQThDO1FBQzNFLE9BQU8sRUFBRSxDQUFDLFlBQVk7YUFDbkIsTUFBTSxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxNQUFNLElBQUksV0FBVyxJQUFJLFdBQVcsQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDO2FBQ2pGLElBQUksQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsbUNBQW1DLENBQUMsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFFRCw4QkFBOEIsQ0FBQyxFQUE4QztRQUMzRSxJQUFJLE1BQU0sR0FBdUIsU0FBUyxDQUFDO1FBQzNDLElBQUksU0FBdUIsQ0FBQztRQUM1QixJQUFJLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRTNCLDZCQUE2QjtRQUM3QixNQUFNLFNBQVMsR0FBMEIsRUFBRSxDQUFDO1FBQzVDLEVBQUUsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUU7WUFDdEMsSUFBSSxXQUFXLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRSxDQUFDO2dCQUNwQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzlCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMzQixnRkFBZ0Y7WUFDaEYsaUJBQWlCLEdBQUssU0FBUyxDQUFDLENBQUMsQ0FBeUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUEyQixDQUFDLEtBQUssQ0FBQztRQUMxRyxDQUFDO2FBQU0sSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2xDLG1DQUFtQztZQUNuQyxNQUFNLGNBQWMsR0FBSyxTQUFTLENBQUMsQ0FBQyxDQUF5QixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQTJCLENBQUMsS0FBSyxDQUFDO1lBQzNHLE1BQU0sR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUEwQixDQUFDLENBQUM7WUFFN0UsaUJBQWlCLEdBQUssU0FBUyxDQUFDLENBQUMsQ0FBeUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUEyQixDQUFDLEtBQUssQ0FBQztRQUMxRyxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sSUFBSSxrQ0FBdUIsQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO1FBQy9FLENBQUM7UUFFRCxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDekMsSUFBSSxPQUFPLElBQUksS0FBSyxFQUFFLENBQUM7WUFDckIsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDdEIsQ0FBQztRQUNELElBQUksUUFBUSxJQUFJLEtBQUssSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDdkQsU0FBUyxHQUFHLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQTBCLENBQUMsQ0FBQztRQUNuRixDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sSUFBSSxrQ0FBdUIsQ0FDL0IsNENBQTRDLGlCQUFpQixXQUFXLEtBQUssRUFBRSxDQUNoRixDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELFNBQVMsQ0FBQyxLQUEyQztRQUNuRCxPQUFPLElBQUEsbUJBQVMsRUFBQyxLQUFLLENBQUM7WUFDckIsQ0FBQyxDQUFDLGlCQUFPLENBQUMsRUFBRSxDQUFDLFNBQUcsQ0FBQyxHQUFHLEVBQUUsZUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsUUFBUSxDQUFDO1lBQzVGLENBQUMsQ0FBRSxLQUErQixDQUFDLEtBQUssQ0FBQztJQUM3QyxDQUFDO0lBRUQsVUFBVSxDQUFDLEtBQTRCO1FBQ3JDLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ2xDLE9BQU8sSUFBQSxtQkFBUyxFQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7Z0JBQzNCLENBQUMsQ0FBQyxJQUFBLDJCQUFtQixFQUNqQixpQkFBTyxDQUFDLEVBQUUsQ0FBQyxTQUFHLENBQUMsT0FBTyxFQUFFLGVBQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxXQUFXLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FDdEc7Z0JBQ0gsQ0FBQyxDQUFFLEtBQStCLENBQUMsS0FBSyxDQUFDO1FBQzdDLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxJQUFBLG1CQUFTLEVBQUMsS0FBSyxDQUFDO2dCQUNyQixDQUFDLENBQUMsSUFBQSwyQkFBbUIsRUFDakIsaUJBQU8sQ0FBQyxFQUFFLENBQUMsU0FBRyxDQUFDLE9BQU8sRUFBRSxlQUFNLENBQUMsSUFBSSxDQUFDLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FDL0Y7Z0JBQ0gsQ0FBQyxDQUFFLEtBQStCLENBQUMsS0FBSyxDQUFDO1FBQzdDLENBQUM7SUFDSCxDQUFDO0lBRUQsY0FBYyxDQUFDLEtBQVk7UUFDekIsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDeEIsT0FBTyxLQUFLLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0MsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQscUJBQXFCLENBQUMsR0FBaUI7UUFDckMsT0FBTztZQUNMLFFBQVEsRUFBRSxJQUFBLDRCQUFvQixFQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7WUFDNUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDO1lBQzVCLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTTtTQUNuQixDQUFDO0lBQ0osQ0FBQztJQUVELGdCQUFnQixDQUFDLElBQXVCLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFlO1FBQ2xFLE9BQU87WUFDTCxJQUFJLEVBQUUsT0FBTztZQUNiLEtBQUssRUFBRSxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSztZQUN4RCxLQUFLO1lBQ0wsSUFBSTtTQUNMLENBQUM7SUFDSixDQUFDO0lBRUQsdUJBQXVCLENBQUMsU0FBaUI7UUFDdkMsTUFBTSxlQUFlLEdBQUcsRUFBRSxDQUFDO1FBQzNCLE1BQU0sR0FBRyxHQUFHLElBQUksVUFBVSxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNoRCxNQUFNLE1BQU0sR0FBRyxlQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM3QyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsa0NBQXdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCO1FBQ2pFLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ25CLE9BQU8sSUFBQSwyQkFBbUIsRUFDeEIsSUFBQSxpQkFBTyxFQUFDLGVBQWUsQ0FBQzthQUNyQixNQUFNLENBQUMsR0FBRyxDQUFDO2FBQ1gsTUFBTSxDQUFDLEtBQUssQ0FBQzthQUNiLEtBQUssQ0FBQyxDQUFDLEVBQUUsOEJBQWtCLEdBQUcsQ0FBQyxDQUFDLENBQ3BDLENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLGNBQWMsQ0FBQyxHQUFXLEVBQUUsS0FBYTtRQUM3QyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUEsbUJBQU8sRUFBQyxHQUFHLEVBQUUsNEJBQTRCLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLElBQUEsZ0JBQU0sRUFBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkIsSUFBQSxnQkFBTSxFQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFL0IsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDL0MsT0FBTyxDQUFDLEtBQUssQ0FBQyx3RUFBd0UsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUMvRixNQUFNLElBQUksS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFDaEQsQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBRXpDLE1BQU0sV0FBVyxHQUFHLElBQUksc0JBQVMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDekQsTUFBTSxlQUFlLEdBQUcsSUFBSSxzQkFBUyxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNqRSxNQUFNLGFBQWEsR0FBRyxJQUFJLHNCQUFTLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzdELE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRXZFLE9BQU8sT0FBTyxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDO0lBQzdFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLGVBQWUsQ0FBQyxHQUFXO1FBQy9CLE1BQU0sQ0FBQyxXQUFXLEVBQUUsaUJBQWlCLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDekQsSUFBQSxtQkFBTyxFQUFDLEdBQUcsRUFBRSw4QkFBOEIsRUFBRSxFQUFFLENBQUM7WUFDaEQsSUFBQSxtQkFBTyxFQUFDLEdBQUcsRUFBRSxtQkFBbUIsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3pDLENBQUMsQ0FBQztRQUNILE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7SUFDekYsQ0FBQztJQUVELEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBVyxFQUFFLEtBQWEsRUFBRSxRQUFpQjtRQUM1RCxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMzQixRQUFRLEdBQUcsb0JBQVksQ0FBQztRQUMxQixDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFBLG1CQUFPLEVBQUMsR0FBRyxFQUFFLGlCQUFpQixFQUFFLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDeEUsTUFBTSxZQUFZLEdBQUcsQ0FBQyxNQUFNLENBQUMsWUFBWSxJQUFJLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzdELE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxNQUFNLENBQUMscUJBQXFCLElBQUksR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDL0UsTUFBTSxpQkFBaUIsR0FBRyxzQkFBUyxDQUFDLEdBQUcsQ0FDckMsQ0FBQyxFQUNELElBQUksc0JBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxzQkFBUyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FDeEUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNiLE9BQU87WUFDTCxZQUFZO1lBQ1osaUJBQWlCO1lBQ2pCLHFCQUFxQjtTQUN0QixDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxhQUFhLENBQUMsR0FBVyxFQUFFLEtBQWEsRUFBRSxRQUFpQjtRQUMvRCxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMzQixRQUFRLEdBQUcsb0JBQVksQ0FBQztRQUMxQixDQUFDO1FBQ0QsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLElBQUksTUFBTSxHQUFHLFNBQVMsQ0FBQztRQUN2QixJQUFJLE1BQU0sR0FBRyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMvQixJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7UUFDZCxPQUFPLFdBQVcsRUFBRSxDQUFDO1lBQ25CLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUN6QixNQUFNLEdBQUcsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3JDLENBQUM7WUFDRCxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFBLG1CQUFPLEVBQUMsR0FBRyxFQUFFLGVBQWUsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDM0QsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNoQyxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztnQkFDakMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7WUFDN0IsQ0FBQztZQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ1gsT0FBTyxDQUFDLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDOUQsTUFBTSxJQUFJLGdDQUFxQixDQUFDLDBDQUEwQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2pGLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxJQUFJO2FBQ1IsTUFBTSxDQUFDLENBQUMsTUFBVyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxLQUFLLFNBQVMsQ0FBQzthQUNyRCxHQUFHLENBQUMsQ0FBQyxNQUFXLEVBQUUsRUFBRTtZQUNuQixPQUFPO2dCQUNMLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtnQkFDekIsUUFBUSxFQUFFLE1BQU0sQ0FBQyxZQUFZO2dCQUM3QixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87Z0JBQ3ZCLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtnQkFDckIsT0FBTyxFQUFFLElBQUksc0JBQVMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO2FBQ3ZDLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxLQUFLLENBQUMsdUJBQXVCLENBQUMsR0FBVyxFQUFFLFlBQW9CLEVBQUUsVUFBb0I7UUFDbkYsTUFBTSxPQUFPLEdBQUcsb0JBQW9CLENBQUM7UUFDckMsTUFBTSxPQUFPLEdBQUcsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDdEMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM1RCxJQUFJLE1BQTJCLENBQUM7UUFDaEMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxHQUFHLE1BQU0sSUFBQSxtQkFBTyxFQUFDLEdBQUcsRUFBRSw2QkFBNkIsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNyRSxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCx5QkFBeUIsQ0FBQyxVQUFrQixFQUFFLFFBQWdCLEVBQUUsUUFBaUI7UUFDL0UsSUFBSSxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDM0IsT0FBTyxVQUFVLENBQUM7UUFDcEIsQ0FBQztRQUNELElBQUksY0FBc0IsQ0FBQztRQUMzQixJQUFJLENBQUM7WUFDSCxjQUFjLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BDLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1QixDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksY0FBYyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzFELE1BQU0sSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUIsQ0FBQztRQUNELE9BQU8sY0FBYyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxTQUFpQixFQUFFLE9BQW9CO1FBQzVELE1BQU0sTUFBTSxHQUFHLGVBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNuQyxPQUFPLENBQ0wsSUFBSSxZQUFZLGlCQUFPO2dCQUN2QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsSUFBSTtnQkFDbEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQ3pELENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pELElBQUksV0FBVyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM1QiwwRkFBMEY7WUFDMUYsSUFBQSxnQkFBTSxFQUFDLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDakMsT0FBTyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEIsQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxpQ0FBaUMsQ0FBQyxJQUFxQixFQUFFLEtBQWdCO1FBQ3ZFLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3hCLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQy9DLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQzlCLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNoQixHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNkLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNuQyxDQUFDO1lBQ0QsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLEVBQUUsRUFBcUIsQ0FBQyxDQUFDO0lBQzVCLENBQUM7Q0FDRjtBQS9tQkQsc0JBK21CQztBQUVELE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7QUFDMUIsa0JBQWUsS0FBSyxDQUFDO0FBRXJCLElBQVksS0FFWDtBQUZELFdBQVksS0FBSztJQUNmLCtCQUFPLENBQUE7QUFDVCxDQUFDLEVBRlcsS0FBSyxxQkFBTCxLQUFLLFFBRWhCO0FBRUQsSUFBWSxhQUVYO0FBRkQsV0FBWSxhQUFhO0lBQ3ZCLDZDQUFNLENBQUE7QUFDUixDQUFDLEVBRlcsYUFBYSw2QkFBYixhQUFhLFFBRXhCO0FBRUQsSUFBWSxXQUtYO0FBTEQsV0FBWSxXQUFXO0lBQ3JCLG1FQUFtQixDQUFBO0lBQ25CLHlFQUFzQixDQUFBO0lBQ3RCLHVFQUFxQixDQUFBO0lBQ3JCLG1FQUFtQixDQUFBO0FBQ3JCLENBQUMsRUFMVyxXQUFXLDJCQUFYLFdBQVcsUUFLdEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBCYXNlVXRpbHMsXG4gIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcixcbiAgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IsXG4gIGlzVmFsaWRFZDI1NTE5UHVibGljS2V5LFxuICBQYXJzZVRyYW5zYWN0aW9uRXJyb3IsXG4gIFJlY2lwaWVudCxcbiAgUmVjb3ZlcnlQcm92aWRlckVycm9yLFxuICBUcmFuc2FjdGlvblR5cGUsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCB7IFNVSV9BRERSRVNTX0xFTkdUSCB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IGlzUHVyZUFyZyB9IGZyb20gJy4vbXlzdGVubGFiL3R5cGVzL3N1aS1iY3MnO1xuaW1wb3J0IHsgQkNTLCBmcm9tQjY0IH0gZnJvbSAnQG15c3Rlbi9iY3MnO1xuaW1wb3J0IHtcbiAgTWV0aG9kTmFtZXMsXG4gIFJlcXVlc3RBZGRTdGFrZSxcbiAgUmVxdWVzdFdhbHJ1c1N0YWtlV2l0aFBvb2wsXG4gIFJlcXVlc3RXYWxydXNXaXRoZHJhd1N0YWtlLFxuICBTdGFraW5nUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb24sXG4gIFdhbHJ1c1N0YWtpbmdQcm9ncmFtbWFibGVUcmFuc2FjdGlvbixcbiAgV2FscnVzV2l0aGRyYXdTdGFrZVByb2dyYW1tYWJsZVRyYW5zYWN0aW9uLFxuICBTdWlCYWxhbmNlSW5mbyxcbiAgU3VpT2JqZWN0SW5mbyxcbiAgU3VpUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb24sXG4gIFN1aVRyYW5zYWN0aW9uLFxuICBTdWlUcmFuc2FjdGlvblR5cGUsXG59IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnYnVmZmVyJztcbmltcG9ydCB7XG4gIGlzVmFsaWRTdWlBZGRyZXNzLFxuICBub3JtYWxpemVTdWlBZGRyZXNzLFxuICBub3JtYWxpemVTdWlPYmplY3RJZCxcbiAgU1VJX1RZUEVfQVJHLFxuICBTdWlKc29uVmFsdWUsXG4gIFN1aU9iamVjdFJlZixcbn0gZnJvbSAnLi9teXN0ZW5sYWIvdHlwZXMnO1xuaW1wb3J0IHtcbiAgYnVpbGRlcixcbiAgTWVyZ2VDb2luc1RyYW5zYWN0aW9uLFxuICBNb3ZlQ2FsbFRyYW5zYWN0aW9uLFxuICBPYmplY3RDYWxsQXJnLFxuICBTcGxpdENvaW5zVHJhbnNhY3Rpb24sXG4gIFRyYW5zYWN0aW9uQmxvY2tJbnB1dCxcbiAgVHJhbnNhY3Rpb25UeXBlIGFzIFRyYW5zYWN0aW9uQ29tbWFuZFR5cGUsXG59IGZyb20gJy4vbXlzdGVubGFiL2J1aWxkZXInO1xuaW1wb3J0IHsgU0lHTkFUVVJFX1NDSEVNRV9UT19GTEFHIH0gZnJvbSAnLi9rZXlQYWlyJztcbmltcG9ydCBibGFrZTJiIGZyb20gJ0BiaXRnby1iZXRhL2JsYWtlMmInO1xuaW1wb3J0IHsgVFJBTlNBQ1RJT05fREFUQV9NQVhfU0laRSB9IGZyb20gJy4vbXlzdGVubGFiL2J1aWxkZXIvVHJhbnNhY3Rpb25EYXRhQmxvY2snO1xuaW1wb3J0IHsgbWFrZVJQQyB9IGZyb20gJy4vcnBjQ2xpZW50JztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IEJhc2VOZXR3b3JrLCBjb2lucywgU3VpQ29pbiB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNJbW1Pck93bmVkT2JqKG9iajogT2JqZWN0Q2FsbEFyZ1snT2JqZWN0J10pOiBvYmogaXMgeyBJbW1Pck93bmVkOiBTdWlPYmplY3RSZWYgfSB7XG4gIHJldHVybiAnSW1tT3JPd25lZCcgaW4gb2JqO1xufVxuXG5leHBvcnQgY2xhc3MgVXRpbHMgaW1wbGVtZW50cyBCYXNlVXRpbHMge1xuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZEJsb2NrSWQoaGFzaDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGlzVmFsaWRQcml2YXRlS2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGlzVmFsaWRQdWJsaWNLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNWYWxpZEVkMjU1MTlQdWJsaWNLZXkoa2V5KTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkU2lnbmF0dXJlKHNpZ25hdHVyZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGlzVmFsaWRUcmFuc2FjdGlvbklkKHR4SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgcmF3IHRyYW5zYWN0aW9uIGNhbiBiZSBkZXNlcmlhbGl6ZWRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJhd1RyYW5zYWN0aW9uIC0gdHJhbnNhY3Rpb24gaW4gYmFzZTY0IHN0cmluZyBmb3JtYXRcbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gICAqL1xuICBpc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gZnJvbUI2NChyYXdUcmFuc2FjdGlvbik7XG4gICAgICBjb25zdCBkZXNlcmlhbGl6ZWQgPSBidWlsZGVyLmRlKCdUcmFuc2FjdGlvbkRhdGEnLCBkYXRhKTtcbiAgICAgIGJ1aWxkZXIuc2VyKCdUcmFuc2FjdGlvbkRhdGEnLCBkZXNlcmlhbGl6ZWQsIHsgbWF4U2l6ZTogVFJBTlNBQ1RJT05fREFUQV9NQVhfU0laRSB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgdGhlIHJhdyB0cmFuc2FjdGlvbiBoYXMgYSB2YWxpZCBmb3JtYXQgaW4gdGhlIGJsb2NrY2hhaW4gY29udGV4dCwgdGhyb3cgb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmF3VHJhbnNhY3Rpb24gLSBUcmFuc2FjdGlvbiBpbiBiYXNlNjQgc3RyaW5nICBmb3JtYXRcbiAgICovXG4gIHZhbGlkYXRlUmF3VHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb246IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghcmF3VHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgcmF3IHRyYW5zYWN0aW9uOiBVbmRlZmluZWQnKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgcmF3IHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhZGRyZXNzZXMgdG8gY2hlY2sgaWYgYWxsIGV4aXN0IGFuZCBhcmUgdmFsaWQgU3VpIHB1YmxpYyBrZXlzXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzZXMgVGhlIGFkZHJlc3MgdG8gYmUgdmFsaWRhdGVkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZE5hbWUgTmFtZSBvZiB0aGUgZmllbGQgdG8gdmFsaWRhdGUsIGl0cyBuZWVkZWQgdG8gcmV0dXJuIHdoaWNoIGZpZWxkIGlzIGZhaWxpbmcgb24gY2FzZSBvZiBlcnJvci5cbiAgICovXG4gIHZhbGlkYXRlQWRkcmVzc2VzKGFkZHJlc3Nlczogc3RyaW5nW10sIGZpZWxkTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBhZGRyZXNzIG9mIGFkZHJlc3Nlcykge1xuICAgICAgdGhpcy52YWxpZGF0ZUFkZHJlc3MoYWRkcmVzcywgZmllbGROYW1lKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGFkZHJlc3MgdG8gY2hlY2sgaWYgaXQgZXhpc3RzIGFuZCBpcyBhIHZhbGlkIFN1aSBwdWJsaWMga2V5XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzIFRoZSBhZGRyZXNzIHRvIGJlIHZhbGlkYXRlZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmllbGROYW1lIE5hbWUgb2YgdGhlIGZpZWxkIHRvIHZhbGlkYXRlLCBpdHMgbmVlZGVkIHRvIHJldHVybiB3aGljaCBmaWVsZCBpcyBmYWlsaW5nIG9uIGNhc2Ugb2YgZXJyb3IuXG4gICAqL1xuICB2YWxpZGF0ZUFkZHJlc3MoYWRkcmVzczogc3RyaW5nLCBmaWVsZE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghYWRkcmVzcyB8fCAhaXNWYWxpZFN1aUFkZHJlc3Mobm9ybWFsaXplU3VpQWRkcmVzcyhhZGRyZXNzKSkpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgb3IgbWlzc2luZyAke2ZpZWxkTmFtZX0sIGdvdDogJHthZGRyZXNzfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0hleChhZGRyZXNzKSAmJiB0aGlzLmdldEhleEJ5dGVMZW5ndGgoYWRkcmVzcykgPT09IFNVSV9BRERSRVNTX0xFTkdUSDtcbiAgfVxuXG4gIGlzSGV4KHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gL14oMHh8MFgpP1thLWZBLUYwLTldKyQvLnRlc3QodmFsdWUpICYmIHZhbHVlLmxlbmd0aCAlIDIgPT09IDA7XG4gIH1cblxuICBnZXRIZXhCeXRlTGVuZ3RoKHZhbHVlOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIC8vIHJldHVybiAvXigweHwwWCkvLnRlc3QodmFsdWUpID8gKHZhbHVlLmxlbmd0aCAtIDIpIC8gMiA6IHZhbHVlLmxlbmd0aCAvIDI7XG4gICAgcmV0dXJuIC9eKDB4fDBYKS8udGVzdCh2YWx1ZSkgPyAodmFsdWUubGVuZ3RoIC0gMikgLyAyIDogdmFsdWUubGVuZ3RoIC8gMjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBzdHJpbmcgaXMgYSB2YWxpZCBhbW91bnRcbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJbXX0gYW1vdW50cyAtIHRoZSBhbW91bnRzIHRvIHZhbGlkYXRlXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICAgKi9cbiAgaXNWYWxpZEFtb3VudHMoYW1vdW50czogbnVtYmVyW10pOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IGFtb3VudCBvZiBhbW91bnRzKSB7XG4gICAgICBpZiAoIXRoaXMuaXNWYWxpZEFtb3VudChhbW91bnQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgYW1vdW50XG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhbW91bnRzIC0gdGhlIGFtb3VudCB0byB2YWxpZGF0ZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0aGUgdmFsaWRhdGlvbiByZXN1bHRcbiAgICovXG4gIGlzVmFsaWRBbW91bnQoYW1vdW50OiBzdHJpbmcgfCBudW1iZXIpOiBib29sZWFuIHtcbiAgICAvLyBCdWlsZCB0aGUgQmlnTnVtYmVyIGRpcmVjdGx5IGZyb20gdGhlIHJhdyB2YWx1ZS4gV3JhcHBpbmcgaW4gTnVtYmVyKCkgZmlyc3Qgd291bGRcbiAgICAvLyB0cnVuY2F0ZSBpbnRlZ2VycyBhYm92ZSAyXjUzIChlLmcuIGxhcmdlIGNvbnNvbGlkYXRpb24gYW1vdW50cyBpbiBNSVNUKSwgY2F1c2luZ1xuICAgIC8vIHZhbGlkIGFtb3VudHMgdG8gYmUgbWlzLXZhbGlkYXRlZC5cbiAgICBjb25zdCBiaWdOdW1iZXJBbW91bnQgPSBuZXcgQmlnTnVtYmVyKGFtb3VudCk7XG4gICAgaWYgKCFiaWdOdW1iZXJBbW91bnQuaXNJbnRlZ2VyKCkgfHwgYmlnTnVtYmVyQW1vdW50LmlzTGVzc1RoYW5PckVxdWFsVG8oMCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyBoZXggaWRzIChhZGRyZXNzZXMsIG9iamVjdCBpZHMpIHRvIGFsd2F5cyBjb250YWluIHRoZSAnMHgnIHByZWZpeC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGlkXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICoqL1xuICBub3JtYWxpemVIZXhJZChpZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gaWQuc3RhcnRzV2l0aCgnMHgnKSA/IGlkIDogJzB4Jy5jb25jYXQoaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0cmFuc2FjdGlvbiB0eXBlIGJ5IGZ1bmN0aW9uIG5hbWVcbiAgICpcbiAgICogQHBhcmFtIHtNZXRob2ROYW1lc30gZmN0TmFtZVxuICAgKiBAcmV0dXJuIHtUcmFuc2FjdGlvblR5cGV9XG4gICAqL1xuICBnZXRUcmFuc2FjdGlvblR5cGUoc3VpVHJhbnNhY3Rpb25UeXBlOiBTdWlUcmFuc2FjdGlvblR5cGUpOiBUcmFuc2FjdGlvblR5cGUge1xuICAgIHN3aXRjaCAoc3VpVHJhbnNhY3Rpb25UeXBlKSB7XG4gICAgICBjYXNlIFN1aVRyYW5zYWN0aW9uVHlwZS5UcmFuc2ZlcjpcbiAgICAgIGNhc2UgU3VpVHJhbnNhY3Rpb25UeXBlLlRva2VuVHJhbnNmZXI6XG4gICAgICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU2VuZDtcbiAgICAgIGNhc2UgU3VpVHJhbnNhY3Rpb25UeXBlLkFkZFN0YWtlOlxuICAgICAgY2FzZSBTdWlUcmFuc2FjdGlvblR5cGUuV2FscnVzU3Rha2VXaXRoUG9vbDpcbiAgICAgICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWRkO1xuICAgICAgY2FzZSBTdWlUcmFuc2FjdGlvblR5cGUuV2FscnVzUmVxdWVzdFdpdGhkcmF3U3Rha2U6XG4gICAgICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0RlYWN0aXZhdGU7XG4gICAgICBjYXNlIFN1aVRyYW5zYWN0aW9uVHlwZS5XaXRoZHJhd1N0YWtlOlxuICAgICAgY2FzZSBTdWlUcmFuc2FjdGlvblR5cGUuV2FscnVzV2l0aGRyYXdTdGFrZTpcbiAgICAgICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nV2l0aGRyYXc7XG4gICAgICBjYXNlIFN1aVRyYW5zYWN0aW9uVHlwZS5DdXN0b21UeDpcbiAgICAgICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5DdXN0b21UeDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IFNVSSB0cmFuc2FjdGlvbiB0eXBlXG4gICAqXG4gICAqIEBwYXJhbSB7TWV0aG9kTmFtZXN9IGZjdE5hbWVcbiAgICogQHJldHVybiB7VHJhbnNhY3Rpb25UeXBlfVxuICAgKi9cbiAgZ2V0U3VpVHJhbnNhY3Rpb25UeXBlKGNvbW1hbmQ6IFRyYW5zYWN0aW9uQ29tbWFuZFR5cGUpOiBTdWlUcmFuc2FjdGlvblR5cGUge1xuICAgIHN3aXRjaCAoY29tbWFuZC5raW5kKSB7XG4gICAgICBjYXNlICdTcGxpdENvaW5zJzpcbiAgICAgICAgaWYgKChjb21tYW5kIGFzIFNwbGl0Q29pbnNUcmFuc2FjdGlvbikuY29pbi5raW5kID09PSAnR2FzQ29pbicpIHtcbiAgICAgICAgICByZXR1cm4gU3VpVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTdWlUcmFuc2FjdGlvblR5cGUuVG9rZW5UcmFuc2ZlcjtcbiAgICAgIGNhc2UgJ1RyYW5zZmVyT2JqZWN0cyc6XG4gICAgICAgIHJldHVybiBTdWlUcmFuc2FjdGlvblR5cGUuVHJhbnNmZXI7XG4gICAgICBjYXNlICdNZXJnZUNvaW5zJzpcbiAgICAgICAgaWYgKChjb21tYW5kIGFzIE1lcmdlQ29pbnNUcmFuc2FjdGlvbikuZGVzdGluYXRpb24ua2luZCA9PT0gJ0dhc0NvaW4nKSB7XG4gICAgICAgICAgcmV0dXJuIFN1aVRyYW5zYWN0aW9uVHlwZS5UcmFuc2ZlcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU3VpVHJhbnNhY3Rpb25UeXBlLlRva2VuVHJhbnNmZXI7XG4gICAgICBjYXNlICdNb3ZlQ2FsbCc6XG4gICAgICAgIGlmIChjb21tYW5kLnRhcmdldC5lbmRzV2l0aChNZXRob2ROYW1lcy5SZXF1ZXN0QWRkU3Rha2UpKSB7XG4gICAgICAgICAgcmV0dXJuIFN1aVRyYW5zYWN0aW9uVHlwZS5BZGRTdGFrZTtcbiAgICAgICAgfSBlbHNlIGlmIChjb21tYW5kLnRhcmdldC5lbmRzV2l0aChNZXRob2ROYW1lcy5SZXF1ZXN0V2l0aGRyYXdTdGFrZSkpIHtcbiAgICAgICAgICByZXR1cm4gU3VpVHJhbnNhY3Rpb25UeXBlLldpdGhkcmF3U3Rha2U7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgY29tbWFuZC50YXJnZXQuZW5kc1dpdGgoTWV0aG9kTmFtZXMuU3Rha2luZ1Bvb2xTcGxpdCkgfHxcbiAgICAgICAgICBjb21tYW5kLnRhcmdldC5lbmRzV2l0aChNZXRob2ROYW1lcy5QdWJsaWNUcmFuc2ZlcilcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIFN1aVRyYW5zYWN0aW9uVHlwZS5DdXN0b21UeDtcbiAgICAgICAgfSBlbHNlIGlmIChjb21tYW5kLnRhcmdldC5lbmRzV2l0aChNZXRob2ROYW1lcy5XYWxydXNTdGFrZVdpdGhQb29sKSkge1xuICAgICAgICAgIHJldHVybiBTdWlUcmFuc2FjdGlvblR5cGUuV2FscnVzU3Rha2VXaXRoUG9vbDtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICBjb21tYW5kLnRhcmdldC5lbmRzV2l0aChNZXRob2ROYW1lcy5XYWxydXNSZXF1ZXN0V2l0aGRyYXdTdGFrZSkgfHxcbiAgICAgICAgICBjb21tYW5kLnRhcmdldC5lbmRzV2l0aChNZXRob2ROYW1lcy5XYWxydXNTcGxpdFN0YWtlZFdhbClcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIFN1aVRyYW5zYWN0aW9uVHlwZS5XYWxydXNSZXF1ZXN0V2l0aGRyYXdTdGFrZTtcbiAgICAgICAgfSBlbHNlIGlmIChjb21tYW5kLnRhcmdldC5lbmRzV2l0aChNZXRob2ROYW1lcy5XYWxydXNXaXRoZHJhd1N0YWtlKSkge1xuICAgICAgICAgIHJldHVybiBTdWlUcmFuc2FjdGlvblR5cGUuV2FscnVzV2l0aGRyYXdTdGFrZTtcbiAgICAgICAgfSBlbHNlIGlmIChjb21tYW5kLnRhcmdldC5lbmRzV2l0aChNZXRob2ROYW1lcy5SZWRlZW1GdW5kcykpIHtcbiAgICAgICAgICAvLyByZWRlZW1fZnVuZHMgaXMgYSBoZWxwZXIgTW92ZUNhbGwgdXNlZCB3aXRoIEJhbGFuY2VXaXRoZHJhd2FsIHRvIGNvbnZlcnRcbiAgICAgICAgICAvLyBhZGRyZXNzIGJhbGFuY2UgaW50byBhIENvaW48VD47IGl0IGNvLWV4aXN0cyB3aXRoIFRyYW5zZmVyIG9yIFRva2VuVHJhbnNmZXIgY29tbWFuZHMuXG4gICAgICAgICAgcmV0dXJuIFN1aVRyYW5zYWN0aW9uVHlwZS5UcmFuc2ZlcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoYHVuc3VwcG9ydGVkIHRhcmdldCBtZXRob2QgJHtjb21tYW5kLnRhcmdldH1gKTtcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKGB1bnN1cHBvcnRlZCB0cmFuc2FjdGlvbiBraW5kICR7Y29tbWFuZC5raW5kfWApO1xuICAgIH1cbiAgfVxuXG4gIGdldFJlY2lwaWVudHModHg6IFN1aVRyYW5zYWN0aW9uPFN1aVByb2dyYW1tYWJsZVRyYW5zYWN0aW9uPik6IFJlY2lwaWVudFtdIHtcbiAgICBjb25zdCByZWNlaXB0czogUmVjaXBpZW50W10gPSBbXTtcbiAgICBjb25zdCBzcGxpdFJlc3VsdHM6IG51bWJlcltdID0gW107XG4gICAgdHgudHgudHJhbnNhY3Rpb25zLmZvckVhY2goKHRyYW5zYWN0aW9uKSA9PiB7XG4gICAgICBpZiAodHJhbnNhY3Rpb24ua2luZCA9PT0gJ1NwbGl0Q29pbnMnKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdHJhbnNhY3Rpb24uYW1vdW50c1swXS5pbmRleDtcbiAgICAgICAgY29uc3QgaW5wdXQgPSB0eC50eC5pbnB1dHNbaW5kZXhdIGFzIGFueTtcbiAgICAgICAgc3BsaXRSZXN1bHRzLnB1c2godGhpcy5nZXRBbW91bnQoaW5wdXQpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRyYW5zYWN0aW9uLmtpbmQgPT09ICdNb3ZlQ2FsbCcgJiYgdHJhbnNhY3Rpb24udGFyZ2V0LmVuZHNXaXRoKE1ldGhvZE5hbWVzLlN0YWtpbmdQb29sU3BsaXQpKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdHJhbnNhY3Rpb24uYXJndW1lbnRzWzFdLmluZGV4O1xuICAgICAgICBjb25zdCBpbnB1dCA9IHR4LnR4LmlucHV0c1tpbmRleF0gYXMgYW55O1xuICAgICAgICBzcGxpdFJlc3VsdHMucHVzaCh0aGlzLmdldEFtb3VudChpbnB1dCkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgZGVzdGluYXRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICAgIHR4LnR4LnRyYW5zYWN0aW9ucy5mb3JFYWNoKCh0cmFuc2FjdGlvbikgPT4ge1xuICAgICAgaWYgKHRyYW5zYWN0aW9uLmtpbmQgPT09ICdUcmFuc2Zlck9iamVjdHMnKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdHJhbnNhY3Rpb24uYWRkcmVzcy5pbmRleDtcbiAgICAgICAgY29uc3QgaW5wdXQgPSB0eC50eC5pbnB1dHNbaW5kZXhdIGFzIGFueTtcbiAgICAgICAgZGVzdGluYXRpb25zLnB1c2godGhpcy5nZXRBZGRyZXNzKGlucHV0KSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gSW4gUGF0aCAxYiAoc3BvbnNvcmVkLCBhZGRyZXNzLWJhbGFuY2Utb25seSksIGFmdGVyIGFsbCByZWNpcGllbnQgU3BsaXRDb2lucy9UcmFuc2Zlck9iamVjdHNcbiAgICAvLyB0aGVyZSBtYXkgYmUgb25lIGV4dHJhIFRyYW5zZmVyT2JqZWN0cyB0aGF0IHJldHVybnMgY2hhbmdlIHRvIHRoZSBzZW5kZXIuICBUaGF0IHRyYW5zZmVyXG4gICAgLy8gaGFzIG5vIGNvcnJlc3BvbmRpbmcgU3BsaXRDb2lucyBlbnRyeSwgc28gZGVzdGluYXRpb25zLmxlbmd0aCBtYXkgYmUgc3BsaXRSZXN1bHRzLmxlbmd0aCsxLlxuICAgIC8vIExpbWl0IHRoZSB6aXAgdG8gc3BsaXRSZXN1bHRzLmxlbmd0aCBzbyB0aGUgY2hhbmdlIHRyYW5zZmVyIGlzIG5vdCBjb3VudGVkIGFzIGEgcmVjaXBpZW50LlxuICAgIGRlc3RpbmF0aW9ucy5zbGljZSgwLCBzcGxpdFJlc3VsdHMubGVuZ3RoKS5tYXAoKGFkZHJlc3MsIGkpID0+IHtcbiAgICAgIHJlY2VpcHRzLnB1c2goe1xuICAgICAgICBhZGRyZXNzOiBhZGRyZXNzLFxuICAgICAgICBhbW91bnQ6IHNwbGl0UmVzdWx0c1tpXS50b1N0cmluZygpLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBGdWxsLWFtb3VudCBhZGRyLWJhbCB0cmFuc2ZlcjogdGhlIGxhc3QgcmVjaXBpZW50IHJlY2VpdmVzIG1lcmdlZE9iamVjdCAoYWRkckNvaW4pXG4gICAgLy8gZGlyZWN0bHkgdmlhIFRyYW5zZmVyT2JqZWN0cyByYXRoZXIgdGhhbiB2aWEgU3BsaXRDb2lucywgdG8gYXZvaWQgbGVhdmluZyBhIHplcm8tYmFsYW5jZVxuICAgIC8vIENvaW48VD4gdW51c2VkIChVbnVzZWRWYWx1ZVdpdGhvdXREcm9wKS4gUmVjb3ZlciBhbW91bnRzIGZyb20gQmFsYW5jZVdpdGhkcmF3YWwuXG4gICAgLy9cbiAgICAvLyBTaW5nbGUtcmVjaXBpZW50ICgwIFNwbGl0Q29pbnMsIDEgVHJhbnNmZXJPYmplY3RzKTogcmVjZWlwdHMgaXMgZW1wdHkg4oCUIHJlY292ZXIgdGhlXG4gICAgLy8gZnVsbCB3aXRoZHJhd2FsIGFtb3VudCBhbmQgcHVzaCBvbmUgcmVjZWlwdC5cbiAgICAvL1xuICAgIC8vIE11bHRpLXJlY2lwaWVudCAoTi0xIFNwbGl0Q29pbnMsIE4gVHJhbnNmZXJPYmplY3RzKTogcmVjZWlwdHMgaGFzIE4tMSBlbnRyaWVzIOKAlCByZWNvdmVyXG4gICAgLy8gdGhlIGxhc3QgcmVjaXBpZW50J3MgYW1vdW50IGFzIEJhbGFuY2VXaXRoZHJhd2FsLmFtb3VudCAtIHN1bShzcGxpdFJlc3VsdHMpLlxuICAgIGlmIChyZWNlaXB0cy5sZW5ndGggPT09IDAgJiYgZGVzdGluYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHdpdGhkcmF3YWxJbnB1dCA9ICh0eC50eC5pbnB1dHMgYXMgYW55W10pLmZpbmQoXG4gICAgICAgIChpbnB1dDogYW55KSA9PiBpbnB1dD8uQmFsYW5jZVdpdGhkcmF3YWwgIT0gbnVsbCB8fCBpbnB1dD8udmFsdWU/LkJhbGFuY2VXaXRoZHJhd2FsICE9IG51bGxcbiAgICAgICkgYXMgYW55O1xuICAgICAgaWYgKHdpdGhkcmF3YWxJbnB1dCkge1xuICAgICAgICBjb25zdCBidyA9IHdpdGhkcmF3YWxJbnB1dC5CYWxhbmNlV2l0aGRyYXdhbCA/PyB3aXRoZHJhd2FsSW5wdXQudmFsdWU/LkJhbGFuY2VXaXRoZHJhd2FsO1xuICAgICAgICBjb25zdCBhbW91bnQgPSBTdHJpbmcoYncucmVzZXJ2YXRpb24/Lk1heEFtb3VudFU2NCA/PyBidy5hbW91bnQgPz8gMCk7XG4gICAgICAgIGRlc3RpbmF0aW9ucy5mb3JFYWNoKChhZGRyZXNzKSA9PiB7XG4gICAgICAgICAgcmVjZWlwdHMucHVzaCh7IGFkZHJlc3MsIGFtb3VudCB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChyZWNlaXB0cy5sZW5ndGggPiAwICYmIGRlc3RpbmF0aW9ucy5sZW5ndGggPT09IHJlY2VpcHRzLmxlbmd0aCArIDEpIHtcbiAgICAgIGNvbnN0IGxhc3REZXN0ID0gZGVzdGluYXRpb25zW2Rlc3RpbmF0aW9ucy5sZW5ndGggLSAxXTtcbiAgICAgIC8vIFBhdGggMWIgd2l0aCBjaGFuZ2UgcmV0dXJucyB0aGUgc3VycGx1cyB0byB0aGUgc2VuZGVyIHZpYSBhIHRyYWlsaW5nIFRyYW5zZmVyT2JqZWN0cyDigJRcbiAgICAgIC8vIHRoaXMgZGVzdGluYXRpb24gaXMgaW50ZW50aW9uYWxseSBleGNsdWRlZCBieSB0aGUgemlwLWxpbWl0IGFib3ZlIGFuZCBtdXN0IG5vdCBiZVxuICAgICAgLy8gcmUtYWRkZWQgYXMgYSByZWNpcGllbnQuIE9ubHkgcHJvY2VlZCB3aGVuIHRoZSBsYXN0IGRlc3RpbmF0aW9uIGlzIE5PVCB0aGUgc2VuZGVyXG4gICAgICAvLyAoaS5lLiBpdCBpcyB0aGUgZmluYWwgcmVjaXBpZW50IGluIGEgbXVsdGktcmVjaXBpZW50IGZ1bGwtYW1vdW50IGFkZHItYmFsIHNlbmQpLlxuICAgICAgaWYgKGxhc3REZXN0ICE9PSB0eC5zZW5kZXIpIHtcbiAgICAgICAgY29uc3Qgd2l0aGRyYXdhbElucHV0ID0gKHR4LnR4LmlucHV0cyBhcyBhbnlbXSkuZmluZChcbiAgICAgICAgICAoaW5wdXQ6IGFueSkgPT4gaW5wdXQ/LkJhbGFuY2VXaXRoZHJhd2FsICE9IG51bGwgfHwgaW5wdXQ/LnZhbHVlPy5CYWxhbmNlV2l0aGRyYXdhbCAhPSBudWxsXG4gICAgICAgICkgYXMgYW55O1xuICAgICAgICBpZiAod2l0aGRyYXdhbElucHV0KSB7XG4gICAgICAgICAgY29uc3QgYncgPSB3aXRoZHJhd2FsSW5wdXQuQmFsYW5jZVdpdGhkcmF3YWwgPz8gd2l0aGRyYXdhbElucHV0LnZhbHVlPy5CYWxhbmNlV2l0aGRyYXdhbDtcbiAgICAgICAgICBjb25zdCB0b3RhbFdpdGhkcmF3biA9IE51bWJlcihidy5yZXNlcnZhdGlvbj8uTWF4QW1vdW50VTY0ID8/IGJ3LmFtb3VudCA/PyAwKTtcbiAgICAgICAgICBjb25zdCBzcGxpdFRvdGFsID0gc3BsaXRSZXN1bHRzLnJlZHVjZSgoc3VtLCB2KSA9PiBzdW0gKyB2LCAwKTtcbiAgICAgICAgICBjb25zdCBsYXN0QW1vdW50ID0gdG90YWxXaXRoZHJhd24gLSBzcGxpdFRvdGFsO1xuICAgICAgICAgIGlmIChsYXN0QW1vdW50ID4gMCkge1xuICAgICAgICAgICAgcmVjZWlwdHMucHVzaCh7IGFkZHJlc3M6IGxhc3REZXN0LCBhbW91bnQ6IFN0cmluZyhsYXN0QW1vdW50KSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0eC50eC50cmFuc2FjdGlvbnMuZm9yRWFjaCgodHJhbnNhY3Rpb24pID0+IHtcbiAgICAgIGlmICh0cmFuc2FjdGlvbi5raW5kID09PSAnTW92ZUNhbGwnICYmIHRyYW5zYWN0aW9uLnRhcmdldC5lbmRzV2l0aChNZXRob2ROYW1lcy5QdWJsaWNUcmFuc2ZlcikpIHtcbiAgICAgICAgY29uc3QgZGVzdGluYXRpb25BcmcgPSB0cmFuc2FjdGlvbi5hcmd1bWVudHNbMV07XG4gICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uSW5wdXQgPSB0eC50eC5pbnB1dHNbZGVzdGluYXRpb25BcmcuaW5kZXhdIGFzIGFueTtcbiAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSB0aGlzLmdldEFkZHJlc3MoZGVzdGluYXRpb25JbnB1dCk7XG5cbiAgICAgICAgY29uc3QgbW92aW5nT2JqZWN0ID0gdHJhbnNhY3Rpb24uYXJndW1lbnRzWzBdO1xuICAgICAgICBpZiAobW92aW5nT2JqZWN0LmtpbmQgPT09ICdJbnB1dCcpIHtcbiAgICAgICAgICByZWNlaXB0cy5wdXNoKHtcbiAgICAgICAgICAgIGFkZHJlc3M6IGRlc3RpbmF0aW9uLFxuICAgICAgICAgICAgYW1vdW50OiAnMCcsIC8vIHNldCAwLCBub3QgYWJsZSB0byBnZXQgYW1vdW50IG1lcmVseSBmcm9tIHBhcnNpbmdcbiAgICAgICAgICAgIGRhdGE6ICd1bmtub3duIGFtb3VudCcsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAobW92aW5nT2JqZWN0LmtpbmQgPT09ICdSZXN1bHQnKSB7XG4gICAgICAgICAgcmVjZWlwdHMucHVzaCh7XG4gICAgICAgICAgICBhZGRyZXNzOiBkZXN0aW5hdGlvbixcbiAgICAgICAgICAgIGFtb3VudDogc3BsaXRSZXN1bHRzW21vdmluZ09iamVjdC5pbmRleF0udG9TdHJpbmcoKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlY2VpcHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhZGQgc3Rha2luZyByZXF1ZXN0c1xuICAgKlxuICAgKiBAcGFyYW0ge1N0YWtpbmdQcm9ncmFtbWFibGVUcmFuc2FjdGlvbn0gdHg6IHN0YWtpbmcgdHJhbnNhY3Rpb24gb2JqZWN0XG4gICAqIEByZXR1cm4ge1JlcXVlc3RBZGRTdGFrZVtdfSAgYWRkIHN0YWtpbmcgcmVxdWVzdHNcbiAgICovXG4gIGdldFN0YWtlUmVxdWVzdHModHg6IFN0YWtpbmdQcm9ncmFtbWFibGVUcmFuc2FjdGlvbik6IFJlcXVlc3RBZGRTdGFrZVtdIHtcbiAgICBjb25zdCBhbW91bnRzOiBudW1iZXJbXSA9IFtdO1xuICAgIGNvbnN0IGFkZHJlc3Nlczogc3RyaW5nW10gPSBbXTtcbiAgICB0eC50cmFuc2FjdGlvbnMuZm9yRWFjaCgodHJhbnNhY3Rpb24sIGkpID0+IHtcbiAgICAgIGlmICh0cmFuc2FjdGlvbi5raW5kID09PSAnU3BsaXRDb2lucycpIHtcbiAgICAgICAgY29uc3QgYW1vdW50SW5wdXRJZHggPSAoKHRyYW5zYWN0aW9uIGFzIFNwbGl0Q29pbnNUcmFuc2FjdGlvbikuYW1vdW50c1swXSBhcyBUcmFuc2FjdGlvbkJsb2NrSW5wdXQpLmluZGV4O1xuICAgICAgICBhbW91bnRzLnB1c2godXRpbHMuZ2V0QW1vdW50KHR4LmlucHV0c1thbW91bnRJbnB1dElkeF0gYXMgVHJhbnNhY3Rpb25CbG9ja0lucHV0KSk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHRyYW5zYWN0aW9uLmtpbmQgPT09ICdNb3ZlQ2FsbCcgJiZcbiAgICAgICAgKHRyYW5zYWN0aW9uIGFzIE1vdmVDYWxsVHJhbnNhY3Rpb24pLnRhcmdldC5lbmRzV2l0aCgnOjpzdWlfc3lzdGVtOjpyZXF1ZXN0X2FkZF9zdGFrZScpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdG9yQWRkcmVzc0lucHV0SWR4ID0gKCh0cmFuc2FjdGlvbiBhcyBNb3ZlQ2FsbFRyYW5zYWN0aW9uKS5hcmd1bWVudHNbMl0gYXMgVHJhbnNhY3Rpb25CbG9ja0lucHV0KVxuICAgICAgICAgIC5pbmRleDtcbiAgICAgICAgY29uc3QgdmFsaWRhdG9yQWRkcmVzcyA9IHV0aWxzLmdldEFkZHJlc3ModHguaW5wdXRzW3ZhbGlkYXRvckFkZHJlc3NJbnB1dElkeF0gYXMgVHJhbnNhY3Rpb25CbG9ja0lucHV0KTtcbiAgICAgICAgYWRkcmVzc2VzLnB1c2godmFsaWRhdG9yQWRkcmVzcyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGFkZHJlc3Nlcy5tYXAoKGFkZHJlc3MsIGluZGV4KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWxpZGF0b3JBZGRyZXNzOiBhZGRyZXNzLFxuICAgICAgICBhbW91bnQ6IGFtb3VudHNbaW5kZXhdLFxuICAgICAgfSBhcyBSZXF1ZXN0QWRkU3Rha2U7XG4gICAgfSk7XG4gIH1cblxuICBnZXRXYWxydXNTdGFrZVdpdGhQb29sUmVxdWVzdHModHg6IFdhbHJ1c1N0YWtpbmdQcm9ncmFtbWFibGVUcmFuc2FjdGlvbik6IFJlcXVlc3RXYWxydXNTdGFrZVdpdGhQb29sW10ge1xuICAgIGNvbnN0IGFtb3VudHM6IG51bWJlcltdID0gW107XG4gICAgY29uc3QgYWRkcmVzc2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHR4LnRyYW5zYWN0aW9ucy5mb3JFYWNoKCh0cmFuc2FjdGlvbiwgaSkgPT4ge1xuICAgICAgaWYgKHRyYW5zYWN0aW9uLmtpbmQgPT09ICdTcGxpdENvaW5zJykge1xuICAgICAgICBjb25zdCBhbW91bnRJbnB1dElkeCA9ICgodHJhbnNhY3Rpb24gYXMgU3BsaXRDb2luc1RyYW5zYWN0aW9uKS5hbW91bnRzWzBdIGFzIFRyYW5zYWN0aW9uQmxvY2tJbnB1dCkuaW5kZXg7XG4gICAgICAgIGFtb3VudHMucHVzaCh1dGlscy5nZXRBbW91bnQodHguaW5wdXRzW2Ftb3VudElucHV0SWR4XSBhcyBUcmFuc2FjdGlvbkJsb2NrSW5wdXQpKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgdHJhbnNhY3Rpb24ua2luZCA9PT0gJ01vdmVDYWxsJyAmJlxuICAgICAgICAodHJhbnNhY3Rpb24gYXMgTW92ZUNhbGxUcmFuc2FjdGlvbikudGFyZ2V0LmVuZHNXaXRoKCc6OnN0YWtpbmc6OnN0YWtlX3dpdGhfcG9vbCcpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdG9yQWRkcmVzc0lucHV0SWR4ID0gKCh0cmFuc2FjdGlvbiBhcyBNb3ZlQ2FsbFRyYW5zYWN0aW9uKS5hcmd1bWVudHNbMl0gYXMgVHJhbnNhY3Rpb25CbG9ja0lucHV0KVxuICAgICAgICAgIC5pbmRleDtcbiAgICAgICAgY29uc3QgdmFsaWRhdG9yQWRkcmVzcyA9IHV0aWxzLmdldEFkZHJlc3ModHguaW5wdXRzW3ZhbGlkYXRvckFkZHJlc3NJbnB1dElkeF0gYXMgVHJhbnNhY3Rpb25CbG9ja0lucHV0KTtcbiAgICAgICAgYWRkcmVzc2VzLnB1c2godmFsaWRhdG9yQWRkcmVzcyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGFkZHJlc3Nlcy5tYXAoKGFkZHJlc3MsIGluZGV4KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWxpZGF0b3JBZGRyZXNzOiBhZGRyZXNzLFxuICAgICAgICBhbW91bnQ6IGFtb3VudHNbaW5kZXhdLFxuICAgICAgfSBhcyBSZXF1ZXN0V2FscnVzU3Rha2VXaXRoUG9vbDtcbiAgICB9KTtcbiAgfVxuXG4gIGlzV2FscnVzUmVxdWVzdFdpdGhkcmF3U3Rha2VUeCh0eDogV2FscnVzV2l0aGRyYXdTdGFrZVByb2dyYW1tYWJsZVRyYW5zYWN0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR4LnRyYW5zYWN0aW9uc1xuICAgICAgLmZpbHRlcigodHJhbnNhY3Rpb24pID0+ICdraW5kJyBpbiB0cmFuc2FjdGlvbiAmJiB0cmFuc2FjdGlvbi5raW5kID09PSAnTW92ZUNhbGwnKVxuICAgICAgLnNvbWUoKHsgdGFyZ2V0IH0pID0+IHRhcmdldC5lbmRzV2l0aCgnOjpzdGFraW5nOjpyZXF1ZXN0X3dpdGhkcmF3X3N0YWtlJykpO1xuICB9XG5cbiAgZ2V0V2FscnVzV2l0aGRyYXdTdGFrZVJlcXVlc3RzKHR4OiBXYWxydXNXaXRoZHJhd1N0YWtlUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb24pOiBSZXF1ZXN0V2FscnVzV2l0aGRyYXdTdGFrZSB7XG4gICAgbGV0IGFtb3VudDogbnVtYmVyIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGxldCBzdGFrZWRXYWw6IFN1aU9iamVjdFJlZjtcbiAgICBsZXQgc3Rha2VkV2FsSW5wdXRJZHggPSAtMTtcblxuICAgIC8vIFRTIHdvbid0IGxldCB1cyB1c2UgZmlsdGVyXG4gICAgY29uc3QgbW92ZUNhbGxzOiBNb3ZlQ2FsbFRyYW5zYWN0aW9uW10gPSBbXTtcbiAgICB0eC50cmFuc2FjdGlvbnMuZm9yRWFjaCgodHJhbnNhY3Rpb24pID0+IHtcbiAgICAgIGlmICh0cmFuc2FjdGlvbi5raW5kID09PSAnTW92ZUNhbGwnKSB7XG4gICAgICAgIG1vdmVDYWxscy5wdXNoKHRyYW5zYWN0aW9uKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChtb3ZlQ2FsbHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAvLyBUaGlzIGlzIGVpdGhlciByZXF1ZXN0X3dpdGhkcmF3IGZ1bGwgb3Igd2l0aGRyYXcgZnVsbCAoZWl0aGVyIHdheSwgbm8gYW1vdW50KVxuICAgICAgc3Rha2VkV2FsSW5wdXRJZHggPSAoKG1vdmVDYWxsc1swXSBhcyBNb3ZlQ2FsbFRyYW5zYWN0aW9uKS5hcmd1bWVudHNbMV0gYXMgVHJhbnNhY3Rpb25CbG9ja0lucHV0KS5pbmRleDtcbiAgICB9IGVsc2UgaWYgKG1vdmVDYWxscy5sZW5ndGggPT09IDIpIHtcbiAgICAgIC8vIFRoaXMgaXMgcmVxdWVzdF93aXRoZHJhdyBwYXJ0aWFsXG4gICAgICBjb25zdCBhbW91bnRJbnB1dElkeCA9ICgobW92ZUNhbGxzWzBdIGFzIE1vdmVDYWxsVHJhbnNhY3Rpb24pLmFyZ3VtZW50c1sxXSBhcyBUcmFuc2FjdGlvbkJsb2NrSW5wdXQpLmluZGV4O1xuICAgICAgYW1vdW50ID0gdXRpbHMuZ2V0QW1vdW50KHR4LmlucHV0c1thbW91bnRJbnB1dElkeF0gYXMgVHJhbnNhY3Rpb25CbG9ja0lucHV0KTtcblxuICAgICAgc3Rha2VkV2FsSW5wdXRJZHggPSAoKG1vdmVDYWxsc1swXSBhcyBNb3ZlQ2FsbFRyYW5zYWN0aW9uKS5hcmd1bWVudHNbMF0gYXMgVHJhbnNhY3Rpb25CbG9ja0lucHV0KS5pbmRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIG51bWJlciBvZiBNb3ZlQ2FsbCB0cmFuc2FjdGlvbnMnKTtcbiAgICB9XG5cbiAgICBsZXQgaW5wdXQgPSB0eC5pbnB1dHNbc3Rha2VkV2FsSW5wdXRJZHhdO1xuICAgIGlmICgndmFsdWUnIGluIGlucHV0KSB7XG4gICAgICBpbnB1dCA9IGlucHV0LnZhbHVlO1xuICAgIH1cbiAgICBpZiAoJ09iamVjdCcgaW4gaW5wdXQgJiYgaXNJbW1Pck93bmVkT2JqKGlucHV0Lk9iamVjdCkpIHtcbiAgICAgIHN0YWtlZFdhbCA9IHV0aWxzLm5vcm1hbGl6ZVN1aU9iamVjdFJlZihpbnB1dC5PYmplY3QuSW1tT3JPd25lZCBhcyBTdWlPYmplY3RSZWYpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgIGBFeHBlY3RlZCBTdGFrZWRXYWwgb2JqZWN0IGF0IGlucHV0IGluZGV4ICR7c3Rha2VkV2FsSW5wdXRJZHh9LCBmb3VuZCAke2lucHV0fWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgYW1vdW50LCBzdGFrZWRXYWwgfTtcbiAgfVxuXG4gIGdldEFtb3VudChpbnB1dDogU3VpSnNvblZhbHVlIHwgVHJhbnNhY3Rpb25CbG9ja0lucHV0KTogbnVtYmVyIHtcbiAgICByZXR1cm4gaXNQdXJlQXJnKGlucHV0KVxuICAgICAgPyBidWlsZGVyLmRlKEJDUy5VNjQsIEJ1ZmZlci5mcm9tKG5ldyBVaW50MTZBcnJheShpbnB1dC5QdXJlKSkudG9TdHJpbmcoJ2Jhc2U2NCcpLCAnYmFzZTY0JylcbiAgICAgIDogKGlucHV0IGFzIFRyYW5zYWN0aW9uQmxvY2tJbnB1dCkudmFsdWU7XG4gIH1cblxuICBnZXRBZGRyZXNzKGlucHV0OiBUcmFuc2FjdGlvbkJsb2NrSW5wdXQpOiBzdHJpbmcge1xuICAgIGlmIChpbnB1dC5oYXNPd25Qcm9wZXJ0eSgndmFsdWUnKSkge1xuICAgICAgcmV0dXJuIGlzUHVyZUFyZyhpbnB1dC52YWx1ZSlcbiAgICAgICAgPyBub3JtYWxpemVTdWlBZGRyZXNzKFxuICAgICAgICAgICAgYnVpbGRlci5kZShCQ1MuQUREUkVTUywgQnVmZmVyLmZyb20obmV3IFVpbnQxNkFycmF5KGlucHV0LnZhbHVlPy5QdXJlKSkudG9TdHJpbmcoJ2Jhc2U2NCcpLCAnYmFzZTY0JylcbiAgICAgICAgICApXG4gICAgICAgIDogKGlucHV0IGFzIFRyYW5zYWN0aW9uQmxvY2tJbnB1dCkudmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpc1B1cmVBcmcoaW5wdXQpXG4gICAgICAgID8gbm9ybWFsaXplU3VpQWRkcmVzcyhcbiAgICAgICAgICAgIGJ1aWxkZXIuZGUoQkNTLkFERFJFU1MsIEJ1ZmZlci5mcm9tKG5ldyBVaW50MTZBcnJheShpbnB1dC5QdXJlKSkudG9TdHJpbmcoJ2Jhc2U2NCcpLCAnYmFzZTY0JylcbiAgICAgICAgICApXG4gICAgICAgIDogKGlucHV0IGFzIFRyYW5zYWN0aW9uQmxvY2tJbnB1dCkudmFsdWU7XG4gICAgfVxuICB9XG5cbiAgbm9ybWFsaXplQ29pbnMoY29pbnM6IGFueVtdKTogU3VpT2JqZWN0UmVmW10ge1xuICAgIHJldHVybiBjb2lucy5tYXAoKGNvaW4pID0+IHtcbiAgICAgIHJldHVybiB1dGlscy5ub3JtYWxpemVTdWlPYmplY3RSZWYoY29pbik7XG4gICAgfSk7XG4gIH1cblxuICBub3JtYWxpemVTdWlPYmplY3RSZWYob2JqOiBTdWlPYmplY3RSZWYpOiBTdWlPYmplY3RSZWYge1xuICAgIHJldHVybiB7XG4gICAgICBvYmplY3RJZDogbm9ybWFsaXplU3VpT2JqZWN0SWQob2JqLm9iamVjdElkKSxcbiAgICAgIHZlcnNpb246IE51bWJlcihvYmoudmVyc2lvbiksXG4gICAgICBkaWdlc3Q6IG9iai5kaWdlc3QsXG4gICAgfTtcbiAgfVxuXG4gIHRyYW5zYWN0aW9uSW5wdXQodHlwZTogJ29iamVjdCcgfCAncHVyZScsIGluZGV4ID0gMCwgdmFsdWU/OiB1bmtub3duKTogVHJhbnNhY3Rpb25CbG9ja0lucHV0IHtcbiAgICByZXR1cm4ge1xuICAgICAga2luZDogJ0lucHV0JyxcbiAgICAgIHZhbHVlOiB0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnID8gU3RyaW5nKHZhbHVlKSA6IHZhbHVlLFxuICAgICAgaW5kZXgsXG4gICAgICB0eXBlLFxuICAgIH07XG4gIH1cblxuICBnZXRBZGRyZXNzRnJvbVB1YmxpY0tleShwdWJsaWNLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgUFVCTElDX0tFWV9TSVpFID0gMzI7XG4gICAgY29uc3QgdG1wID0gbmV3IFVpbnQ4QXJyYXkoUFVCTElDX0tFWV9TSVpFICsgMSk7XG4gICAgY29uc3QgcHViQnVmID0gQnVmZmVyLmZyb20ocHVibGljS2V5LCAnaGV4Jyk7XG4gICAgdG1wLnNldChbU0lHTkFUVVJFX1NDSEVNRV9UT19GTEFHWydFRDI1NTE5J11dKTsgLy8gRUQyNTUxOTogMHgwMCxcbiAgICB0bXAuc2V0KHB1YkJ1ZiwgMSk7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVN1aUFkZHJlc3MoXG4gICAgICBibGFrZTJiKFBVQkxJQ19LRVlfU0laRSlcbiAgICAgICAgLnVwZGF0ZSh0bXApXG4gICAgICAgIC5kaWdlc3QoJ2hleCcpXG4gICAgICAgIC5zbGljZSgwLCBTVUlfQUREUkVTU19MRU5HVEggKiAyKVxuICAgICk7XG4gIH1cblxuICBhc3luYyBnZXRGZWVFc3RpbWF0ZSh1cmw6IHN0cmluZywgdHhIZXg6IHN0cmluZyk6IFByb21pc2U8QmlnTnVtYmVyPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbWFrZVJQQyh1cmwsICdzdWlfZHJ5UnVuVHJhbnNhY3Rpb25CbG9jaycsIFt0eEhleF0pO1xuICAgIGFzc2VydChyZXN1bHQuZWZmZWN0cyk7XG4gICAgYXNzZXJ0KHJlc3VsdC5lZmZlY3RzLmdhc1VzZWQpO1xuXG4gICAgaWYgKHJlc3VsdC5lZmZlY3RzLnN0YXR1cy5zdGF0dXMgIT09ICdzdWNjZXNzJykge1xuICAgICAgY29uc29sZS5lcnJvcihgRHJ5IHJ1biBmYWlsZWQsIGNvdWxkIG5vdCBhdXRvbWF0aWNhbGx5IGRldGVybWluZSBhIGJ1ZGdldCBmb3IgdHhIZXggJHt0eEhleH1gKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGdldCBmZWUgZXN0aW1hdGVgKTtcbiAgICB9XG5cbiAgICBjb25zdCBnYXNPYmplY3QgPSByZXN1bHQuZWZmZWN0cy5nYXNVc2VkO1xuXG4gICAgY29uc3Qgc3RvcmFnZUNvc3QgPSBuZXcgQmlnTnVtYmVyKGdhc09iamVjdC5zdG9yYWdlQ29zdCk7XG4gICAgY29uc3QgY29tcHV0YXRpb25Db3N0ID0gbmV3IEJpZ051bWJlcihnYXNPYmplY3QuY29tcHV0YXRpb25Db3N0KTtcbiAgICBjb25zdCBzdG9yYWdlUmViYXRlID0gbmV3IEJpZ051bWJlcihnYXNPYmplY3Quc3RvcmFnZVJlYmF0ZSk7XG4gICAgY29uc3QgbmV0Q29zdCA9IGNvbXB1dGF0aW9uQ29zdC5wbHVzKHN0b3JhZ2VDb3N0KS5taW51cyhzdG9yYWdlUmViYXRlKTtcblxuICAgIHJldHVybiBuZXRDb3N0LmNvbXBhcmVkVG8oY29tcHV0YXRpb25Db3N0KSA+IDAgPyBuZXRDb3N0IDogY29tcHV0YXRpb25Db3N0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgZXBvY2ggYW5kIGNoYWluIGlkZW50aWZpZXIgb2YgdGhlIFN1aSBuZXR3b3JrIGJ5IG1ha2luZyBSUEMgY2FsbHMgdG8gdGhlIHByb3ZpZGVkIFVSTC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIFRoZSBVUkwgb2YgdGhlIFN1aSBuZXR3b3JrIFJQQyBlbmRwb2ludC5cbiAgICogQHJldHVybnMge1Byb21pc2U8eyBlcG9jaDogbnVtYmVyOyBjaGFpbklkOiBzdHJpbmcgfT59IC0gVGhlIGN1cnJlbnQgZXBvY2ggYW5kIGNoYWluIGlkZW50aWZpZXIuXG4gICAqL1xuICBhc3luYyBnZXRDaGFpbkNvbnRleHQodXJsOiBzdHJpbmcpOiBQcm9taXNlPHsgZXBvY2g6IG51bWJlcjsgY2hhaW5JZDogc3RyaW5nIH0+IHtcbiAgICBjb25zdCBbc3lzdGVtU3RhdGUsIGdlbmVzaXNDaGVja3BvaW50XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIG1ha2VSUEModXJsLCAnc3VpeF9nZXRMYXRlc3RTdWlTeXN0ZW1TdGF0ZScsIFtdKSxcbiAgICAgIG1ha2VSUEModXJsLCAnc3VpX2dldENoZWNrcG9pbnQnLCBbJzAnXSksXG4gICAgXSk7XG4gICAgcmV0dXJuIHsgZXBvY2g6IE51bWJlcihzeXN0ZW1TdGF0ZS5lcG9jaCksIGNoYWluSWQ6IFN0cmluZyhnZW5lc2lzQ2hlY2twb2ludC5kaWdlc3QpIH07XG4gIH1cblxuICBhc3luYyBnZXRCYWxhbmNlKHVybDogc3RyaW5nLCBvd25lcjogc3RyaW5nLCBjb2luVHlwZT86IHN0cmluZyk6IFByb21pc2U8U3VpQmFsYW5jZUluZm8+IHtcbiAgICBpZiAoY29pblR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29pblR5cGUgPSBTVUlfVFlQRV9BUkc7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1ha2VSUEModXJsLCAnc3VpeF9nZXRCYWxhbmNlJywgW293bmVyLCBjb2luVHlwZV0pO1xuICAgIGNvbnN0IHRvdGFsQmFsYW5jZSA9IChyZXN1bHQudG90YWxCYWxhbmNlID8/ICcwJykudG9TdHJpbmcoKTtcbiAgICBjb25zdCBmdW5kc0luQWRkcmVzc0JhbGFuY2UgPSAocmVzdWx0LmZ1bmRzSW5BZGRyZXNzQmFsYW5jZSA/PyAnMCcpLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgY29pbk9iamVjdEJhbGFuY2UgPSBCaWdOdW1iZXIubWF4KFxuICAgICAgMCxcbiAgICAgIG5ldyBCaWdOdW1iZXIodG90YWxCYWxhbmNlKS5taW51cyhuZXcgQmlnTnVtYmVyKGZ1bmRzSW5BZGRyZXNzQmFsYW5jZSkpXG4gICAgKS50b1N0cmluZygpO1xuICAgIHJldHVybiB7XG4gICAgICB0b3RhbEJhbGFuY2UsXG4gICAgICBjb2luT2JqZWN0QmFsYW5jZSxcbiAgICAgIGZ1bmRzSW5BZGRyZXNzQmFsYW5jZSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZ2V0SW5wdXRDb2lucyh1cmw6IHN0cmluZywgb3duZXI6IHN0cmluZywgY29pblR5cGU/OiBzdHJpbmcpOiBQcm9taXNlPFN1aU9iamVjdEluZm9bXT4ge1xuICAgIGlmIChjb2luVHlwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb2luVHlwZSA9IFNVSV9UWVBFX0FSRztcbiAgICB9XG4gICAgbGV0IGhhc05leHRQYWdlID0gdHJ1ZTtcbiAgICBsZXQgY3Vyc29yID0gdW5kZWZpbmVkO1xuICAgIGxldCBwYXJhbXMgPSBbb3duZXIsIGNvaW5UeXBlXTtcbiAgICBsZXQgZGF0YSA9IFtdO1xuICAgIHdoaWxlIChoYXNOZXh0UGFnZSkge1xuICAgICAgaWYgKGN1cnNvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHBhcmFtcyA9IFtvd25lciwgY29pblR5cGUsIGN1cnNvcl07XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBtYWtlUlBDKHVybCwgJ3N1aXhfZ2V0Q29pbnMnLCBwYXJhbXMpO1xuICAgICAgICBkYXRhID0gZGF0YS5jb25jYXQocmVzdWx0LmRhdGEpO1xuICAgICAgICBoYXNOZXh0UGFnZSA9IHJlc3VsdC5oYXNOZXh0UGFnZTtcbiAgICAgICAgY3Vyc29yID0gcmVzdWx0Lm5leHRDdXJzb3I7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBnZXQgaW5wdXQgY29pbnMgZnJvbSB0aGUgbm9kZSAke2V9YCk7XG4gICAgICAgIHRocm93IG5ldyBSZWNvdmVyeVByb3ZpZGVyRXJyb3IoYEZhaWxlZCB0byBnZXQgaW5wdXQgY29pbnMgZnJvbSB0aGUgbm9kZS5gLCBlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGFcbiAgICAgIC5maWx0ZXIoKG9iamVjdDogYW55KSA9PiBvYmplY3QuYmFsYW5jZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgLm1hcCgob2JqZWN0OiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb2luVHlwZTogb2JqZWN0LmNvaW5UeXBlLFxuICAgICAgICAgIG9iamVjdElkOiBvYmplY3QuY29pbk9iamVjdElkLFxuICAgICAgICAgIHZlcnNpb246IG9iamVjdC52ZXJzaW9uLFxuICAgICAgICAgIGRpZ2VzdDogb2JqZWN0LmRpZ2VzdCxcbiAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKG9iamVjdC5iYWxhbmNlKSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZVRyYW5zYWN0aW9uQmxvY2sodXJsOiBzdHJpbmcsIHNlcmlhbGl6ZWRUeDogc3RyaW5nLCBzaWduYXR1cmVzOiBzdHJpbmdbXSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcmVxVHlwZSA9ICdXYWl0Rm9yRWZmZWN0c0NlcnQnO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7IHNob3dFZmZlY3RzOiB0cnVlIH07XG4gICAgY29uc3QgcGFyYW1zID0gW3NlcmlhbGl6ZWRUeCwgc2lnbmF0dXJlcywgb3B0aW9ucywgcmVxVHlwZV07XG4gICAgbGV0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgbWFrZVJQQyh1cmwsICdzdWlfZXhlY3V0ZVRyYW5zYWN0aW9uQmxvY2snLCBwYXJhbXMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQuZGlnZXN0O1xuICB9XG5cbiAgdmFsaWRhdGVOb25OZWdhdGl2ZU51bWJlcihkZWZhdWx0VmFsOiBudW1iZXIsIGVycm9yTXNnOiBzdHJpbmcsIGlucHV0VmFsPzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAoaW5wdXRWYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGRlZmF1bHRWYWw7XG4gICAgfVxuICAgIGxldCBub25OZWdhdGl2ZU51bTogbnVtYmVyO1xuICAgIHRyeSB7XG4gICAgICBub25OZWdhdGl2ZU51bSA9IE51bWJlcihpbnB1dFZhbCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTXNnKTtcbiAgICB9XG4gICAgaWYgKGlzTmFOKG5vbk5lZ2F0aXZlTnVtLnZhbHVlT2YoKSkgfHwgbm9uTmVnYXRpdmVOdW0gPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNc2cpO1xuICAgIH1cbiAgICByZXR1cm4gbm9uTmVnYXRpdmVOdW07XG4gIH1cblxuICBnZXRTdWlUb2tlbkZyb21BZGRyZXNzKHBhY2thZ2VJZDogc3RyaW5nLCBuZXR3b3JrOiBCYXNlTmV0d29yaykge1xuICAgIGNvbnN0IHRva2VucyA9IGNvaW5zLmZpbHRlcigoY29pbikgPT4ge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY29pbiBpbnN0YW5jZW9mIFN1aUNvaW4gJiZcbiAgICAgICAgY29pbi5uZXR3b3JrLnR5cGUgPT09IG5ldHdvcmsudHlwZSAmJlxuICAgICAgICBjb2luLnBhY2thZ2VJZC50b0xvd2VyQ2FzZSgpID09PSBwYWNrYWdlSWQudG9Mb3dlckNhc2UoKVxuICAgICAgKTtcbiAgICB9KTtcbiAgICBjb25zdCB0b2tlbnNBcnJheSA9IHRva2Vucy5tYXAoKHRva2VuKSA9PiB0b2tlbik7XG4gICAgaWYgKHRva2Vuc0FycmF5Lmxlbmd0aCA+PSAxKSB7XG4gICAgICAvLyB0aGVyZSBzaG91bGQgbmV2ZXIgYmUgdHdvIHRva2VucyB3aXRoIHRoZSBzYW1lIGNvbnRyYWN0IGFkZHJlc3MsIHNvIHdlIGFzc2VydCB0aGF0IGhlcmVcbiAgICAgIGFzc2VydCh0b2tlbnNBcnJheS5sZW5ndGggPT09IDEpO1xuICAgICAgcmV0dXJuIHRva2Vuc0FycmF5WzBdO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgc2VsZWN0T2JqZWN0c0luRGVzY09yZGVyT2ZCYWxhbmNlKG9ianM6IFN1aU9iamVjdEluZm9bXSwgbGltaXQ6IEJpZ051bWJlcik6IFN1aU9iamVjdEluZm9bXSB7XG4gICAgb2JqcyA9IG9ianMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgcmV0dXJuIGIuYmFsYW5jZS5taW51cyhhLmJhbGFuY2UpLnRvTnVtYmVyKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIG9ianMucmVkdWNlKChhY2MsIG9iaikgPT4ge1xuICAgICAgaWYgKGxpbWl0Lmd0KDApKSB7XG4gICAgICAgIGFjYy5wdXNoKG9iaik7XG4gICAgICAgIGxpbWl0ID0gbGltaXQubWludXMob2JqLmJhbGFuY2UpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBbXSBhcyBTdWlPYmplY3RJbmZvW10pO1xuICB9XG59XG5cbmNvbnN0IHV0aWxzID0gbmV3IFV0aWxzKCk7XG5leHBvcnQgZGVmYXVsdCB1dGlscztcblxuZXhwb3J0IGVudW0gQXBwSWQge1xuICBTdWkgPSAwLFxufVxuXG5leHBvcnQgZW51bSBJbnRlbnRWZXJzaW9uIHtcbiAgVjAgPSAwLFxufVxuXG5leHBvcnQgZW51bSBJbnRlbnRTY29wZSB7XG4gIFRyYW5zYWN0aW9uRGF0YSA9IDAsXG4gIFRyYW5zYWN0aW9uRWZmZWN0cyA9IDEsXG4gIENoZWNrcG9pbnRTdW1tYXJ5ID0gMixcbiAgUGVyc29uYWxNZXNzYWdlID0gMyxcbn1cblxuZXhwb3J0IHR5cGUgSW50ZW50ID0gW0ludGVudFNjb3BlLCBJbnRlbnRWZXJzaW9uLCBBcHBJZF07XG4iXX0=