@bitgo/sdk-coin-sui 1.7.2 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/src/lib/bcs.js +25 -1
  3. package/dist/src/lib/constants.d.ts +13 -5
  4. package/dist/src/lib/constants.d.ts.map +1 -1
  5. package/dist/src/lib/constants.js +16 -8
  6. package/dist/src/lib/iface.d.ts +153 -4
  7. package/dist/src/lib/iface.d.ts.map +1 -1
  8. package/dist/src/lib/iface.js +53 -1
  9. package/dist/src/lib/index.d.ts +3 -0
  10. package/dist/src/lib/index.d.ts.map +1 -1
  11. package/dist/src/lib/index.js +8 -2
  12. package/dist/src/lib/stakingBuilder.d.ts +73 -0
  13. package/dist/src/lib/stakingBuilder.d.ts.map +1 -0
  14. package/dist/src/lib/stakingBuilder.js +223 -0
  15. package/dist/src/lib/stakingTransaction.d.ts +67 -0
  16. package/dist/src/lib/stakingTransaction.d.ts.map +1 -0
  17. package/dist/src/lib/stakingTransaction.js +353 -0
  18. package/dist/src/lib/transaction.d.ts +17 -30
  19. package/dist/src/lib/transaction.d.ts.map +1 -1
  20. package/dist/src/lib/transaction.js +75 -218
  21. package/dist/src/lib/transactionBuilder.d.ts +12 -27
  22. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  23. package/dist/src/lib/transactionBuilder.js +1 -160
  24. package/dist/src/lib/transactionBuilderFactory.d.ts +6 -2
  25. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  26. package/dist/src/lib/transactionBuilderFactory.js +22 -6
  27. package/dist/src/lib/transferBuilder.d.ts +25 -1
  28. package/dist/src/lib/transferBuilder.d.ts.map +1 -1
  29. package/dist/src/lib/transferBuilder.js +165 -1
  30. package/dist/src/lib/transferTransaction.d.ts +53 -0
  31. package/dist/src/lib/transferTransaction.d.ts.map +1 -0
  32. package/dist/src/lib/transferTransaction.js +240 -0
  33. package/dist/src/lib/txnSchema.d.ts +7 -0
  34. package/dist/src/lib/txnSchema.d.ts.map +1 -0
  35. package/dist/src/lib/txnSchema.js +81 -0
  36. package/dist/src/lib/utils.d.ts +111 -2
  37. package/dist/src/lib/utils.d.ts.map +1 -1
  38. package/dist/src/lib/utils.js +201 -2
  39. package/dist/src/sui.d.ts.map +1 -1
  40. package/dist/src/sui.js +3 -2
  41. package/package.json +7 -6
@@ -0,0 +1,353 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.StakingTransaction = void 0;
7
+ const sdk_core_1 = require("@bitgo/sdk-core");
8
+ const iface_1 = require("./iface");
9
+ const utils_1 = __importDefault(require("./utils"));
10
+ const constants_1 = require("./constants");
11
+ const transaction_1 = require("./transaction");
12
+ class StakingTransaction extends transaction_1.Transaction {
13
+ constructor(_coinConfig) {
14
+ super(_coinConfig);
15
+ }
16
+ get suiTransaction() {
17
+ return this._suiTransaction;
18
+ }
19
+ setSuiTransaction(tx) {
20
+ this._suiTransaction = tx;
21
+ }
22
+ addSignature(publicKey, signature) {
23
+ this._signatures.push(signature.toString('hex'));
24
+ this._signature = { publicKey, signature };
25
+ this.serialize();
26
+ }
27
+ get suiSignature() {
28
+ return this._signature;
29
+ }
30
+ /** @inheritdoc */
31
+ canSign(key) {
32
+ return true;
33
+ }
34
+ /** @inheritdoc */
35
+ toBroadcastFormat() {
36
+ if (!this._suiTransaction) {
37
+ throw new sdk_core_1.InvalidTransactionError('Empty transaction');
38
+ }
39
+ return this.serialize();
40
+ }
41
+ /** @inheritdoc */
42
+ toJson() {
43
+ if (!this._suiTransaction) {
44
+ throw new sdk_core_1.ParseTransactionError('Empty transaction');
45
+ }
46
+ const suiTx = this._suiTransaction;
47
+ let txDetails;
48
+ switch (suiTx.type) {
49
+ case iface_1.SuiTransactionType.AddDelegation:
50
+ txDetails = {
51
+ Call: {
52
+ package: suiTx.tx.package || constants_1.SUI_PACKAGE,
53
+ module: suiTx.tx.module || iface_1.ModulesNames.SuiSystem,
54
+ function: suiTx.tx.function || iface_1.MethodNames.RequestAddDelegationMulCoin,
55
+ typeArguments: suiTx.tx.typeArguments,
56
+ arguments: suiTx.tx.arguments,
57
+ },
58
+ };
59
+ break;
60
+ case iface_1.SuiTransactionType.WithdrawDelegation:
61
+ txDetails = {
62
+ Call: {
63
+ package: suiTx.tx.package || constants_1.SUI_PACKAGE,
64
+ module: suiTx.tx.module || iface_1.ModulesNames.SuiSystem,
65
+ function: suiTx.tx.function || iface_1.MethodNames.RequestWithdrawDelegation,
66
+ typeArguments: suiTx.tx.typeArguments,
67
+ arguments: suiTx.tx.arguments,
68
+ },
69
+ };
70
+ break;
71
+ case iface_1.SuiTransactionType.SwitchDelegation:
72
+ txDetails = {
73
+ Call: {
74
+ package: suiTx.tx.package || constants_1.SUI_PACKAGE,
75
+ module: suiTx.tx.module || iface_1.ModulesNames.SuiSystem,
76
+ function: suiTx.tx.function || iface_1.MethodNames.RequestSwitchDelegation,
77
+ typeArguments: suiTx.tx.typeArguments,
78
+ arguments: suiTx.tx.arguments,
79
+ },
80
+ };
81
+ break;
82
+ default:
83
+ throw new sdk_core_1.InvalidTransactionError('SuiTransactionType not supported');
84
+ }
85
+ return {
86
+ id: this._id,
87
+ kind: { Single: txDetails },
88
+ sender: suiTx.sender,
89
+ gasPayment: suiTx.gasPayment,
90
+ gasBudget: suiTx.gasBudget,
91
+ gasPrice: constants_1.SUI_GAS_PRICE,
92
+ };
93
+ }
94
+ /** @inheritDoc */
95
+ explainTransaction() {
96
+ const result = this.toJson();
97
+ const displayOrder = [
98
+ 'id',
99
+ 'outputs',
100
+ 'outputAmount',
101
+ 'changeOutputs',
102
+ 'changeAmount',
103
+ 'fee',
104
+ 'type',
105
+ 'module',
106
+ 'function',
107
+ 'validatorAddress',
108
+ ];
109
+ const outputs = [];
110
+ const explanationResult = {
111
+ displayOrder,
112
+ id: this.id,
113
+ outputs,
114
+ outputAmount: '0',
115
+ changeOutputs: [],
116
+ changeAmount: '0',
117
+ fee: { fee: this.suiTransaction.gasBudget.toString() },
118
+ type: this.type,
119
+ };
120
+ switch (this.type) {
121
+ case sdk_core_1.TransactionType.AddDelegator:
122
+ return this.explainAddDelegationTransaction(result, explanationResult);
123
+ case sdk_core_1.TransactionType.StakingWithdraw:
124
+ return this.explainWithdrawDelegationTransaction(result, explanationResult);
125
+ case sdk_core_1.TransactionType.StakingSwitch:
126
+ return this.explainSwitchDelegationTransaction(result, explanationResult);
127
+ default:
128
+ throw new sdk_core_1.InvalidTransactionError('Transaction type not supported');
129
+ }
130
+ }
131
+ /**
132
+ * Set the transaction type.
133
+ *
134
+ * @param {TransactionType} transactionType The transaction type to be set.
135
+ */
136
+ transactionType(transactionType) {
137
+ this._type = transactionType;
138
+ }
139
+ /**
140
+ * Load the input and output data on this transaction.
141
+ */
142
+ loadInputsAndOutputs() {
143
+ if (!this.suiTransaction) {
144
+ return;
145
+ }
146
+ switch (this.suiTransaction.type) {
147
+ case iface_1.SuiTransactionType.AddDelegation:
148
+ const staking_amount = this.suiTransaction.tx.arguments[2].toString();
149
+ this._inputs = [
150
+ {
151
+ address: this.suiTransaction.sender,
152
+ value: staking_amount,
153
+ coin: this._coinConfig.name,
154
+ },
155
+ ];
156
+ this._outputs = [
157
+ {
158
+ address: utils_1.default.normalizeHexId(this.suiTransaction.tx.arguments[3].toString()),
159
+ value: staking_amount,
160
+ coin: this._coinConfig.name,
161
+ },
162
+ ];
163
+ break;
164
+ case iface_1.SuiTransactionType.WithdrawDelegation:
165
+ this._inputs = [
166
+ {
167
+ address: utils_1.default.normalizeHexId(this.suiTransaction.tx.arguments[1].objectId),
168
+ value: constants_1.TRANSFER_AMOUNT_UNKNOWN_TEXT,
169
+ coin: this._coinConfig.name,
170
+ },
171
+ ];
172
+ this._outputs = [
173
+ {
174
+ address: this.suiTransaction.sender,
175
+ value: constants_1.TRANSFER_AMOUNT_UNKNOWN_TEXT,
176
+ coin: this._coinConfig.name,
177
+ },
178
+ ];
179
+ break;
180
+ case iface_1.SuiTransactionType.SwitchDelegation:
181
+ this._inputs = [
182
+ {
183
+ address: this.suiTransaction.sender,
184
+ value: constants_1.TRANSFER_AMOUNT_UNKNOWN_TEXT,
185
+ coin: this._coinConfig.name,
186
+ },
187
+ ];
188
+ this._outputs = [
189
+ {
190
+ address: utils_1.default.normalizeHexId(this.suiTransaction.tx.arguments[3].toString()),
191
+ value: constants_1.TRANSFER_AMOUNT_UNKNOWN_TEXT,
192
+ coin: this._coinConfig.name,
193
+ },
194
+ ];
195
+ break;
196
+ default:
197
+ return;
198
+ }
199
+ }
200
+ /**
201
+ * Sets this transaction payload
202
+ *
203
+ * @param {string} rawTransaction
204
+ */
205
+ fromRawTransaction(rawTransaction) {
206
+ try {
207
+ utils_1.default.isValidRawTransaction(rawTransaction);
208
+ this._suiTransaction = transaction_1.Transaction.deserializeSuiTransaction(rawTransaction);
209
+ this._type = utils_1.default.getTransactionType(this._suiTransaction.tx.function);
210
+ this.loadInputsAndOutputs();
211
+ }
212
+ catch (e) {
213
+ throw e;
214
+ }
215
+ }
216
+ /**
217
+ * Helper function for serialize() to get the correct txData with transaction type
218
+ *
219
+ * @return {TxData}
220
+ */
221
+ getTxData() {
222
+ const suiTx = this._suiTransaction;
223
+ let tx;
224
+ switch (suiTx.type) {
225
+ case iface_1.SuiTransactionType.AddDelegation:
226
+ tx = {
227
+ Call: {
228
+ package: suiTx.tx.package || constants_1.SUI_FRAMEWORK_ADDRESS,
229
+ module: suiTx.tx.module || iface_1.ModulesNames.SuiSystem,
230
+ function: suiTx.tx.function || iface_1.MethodNames.RequestAddDelegationMulCoin,
231
+ typeArguments: suiTx.tx.typeArguments,
232
+ arguments: [
233
+ utils_1.default.mapSharedObjectToCallArg(suiTx.tx.arguments[0]),
234
+ utils_1.default.mapCoinsToCallArg(suiTx.tx.arguments[1]),
235
+ utils_1.default.mapAmountToCallArg(Number(suiTx.tx.arguments[2])),
236
+ utils_1.default.mapAddressToCallArg(suiTx.tx.arguments[3].toString()),
237
+ ],
238
+ },
239
+ };
240
+ break;
241
+ case iface_1.SuiTransactionType.WithdrawDelegation:
242
+ tx = {
243
+ Call: {
244
+ package: suiTx.tx.package || constants_1.SUI_FRAMEWORK_ADDRESS,
245
+ module: suiTx.tx.module || iface_1.ModulesNames.SuiSystem,
246
+ function: suiTx.tx.function || iface_1.MethodNames.RequestWithdrawDelegation,
247
+ typeArguments: suiTx.tx.typeArguments,
248
+ arguments: [
249
+ utils_1.default.mapSharedObjectToCallArg(suiTx.tx.arguments[0]),
250
+ utils_1.default.mapSuiObjectRefToCallArg(suiTx.tx.arguments[1]),
251
+ utils_1.default.mapSuiObjectRefToCallArg(suiTx.tx.arguments[2]),
252
+ ],
253
+ },
254
+ };
255
+ break;
256
+ case iface_1.SuiTransactionType.SwitchDelegation:
257
+ tx = {
258
+ Call: {
259
+ package: suiTx.tx.package || constants_1.SUI_FRAMEWORK_ADDRESS,
260
+ module: suiTx.tx.module || iface_1.ModulesNames.SuiSystem,
261
+ function: suiTx.tx.function || iface_1.MethodNames.RequestSwitchDelegation,
262
+ typeArguments: suiTx.tx.typeArguments,
263
+ arguments: [
264
+ utils_1.default.mapSharedObjectToCallArg(suiTx.tx.arguments[0]),
265
+ utils_1.default.mapSuiObjectRefToCallArg(suiTx.tx.arguments[1]),
266
+ utils_1.default.mapSuiObjectRefToCallArg(suiTx.tx.arguments[2]),
267
+ utils_1.default.mapAddressToCallArg(suiTx.tx.arguments[3].toString()),
268
+ ],
269
+ },
270
+ };
271
+ break;
272
+ default:
273
+ throw new sdk_core_1.InvalidTransactionError(`Sui StakingTransaction type ${suiTx.type} not supported`);
274
+ }
275
+ return {
276
+ kind: { Single: tx },
277
+ gasPayment: suiTx.gasPayment,
278
+ gasPrice: constants_1.SUI_GAS_PRICE,
279
+ gasBudget: suiTx.gasBudget,
280
+ sender: suiTx.sender,
281
+ };
282
+ }
283
+ /**
284
+ * Returns a complete explanation for a transfer transaction
285
+ *
286
+ * @param {TxData} json The transaction data in json format
287
+ * @param {TransactionExplanation} explanationResult The transaction explanation to be completed
288
+ * @returns {TransactionExplanation}
289
+ */
290
+ explainAddDelegationTransaction(json, explanationResult) {
291
+ const amount = this.suiTransaction.tx.arguments[2];
292
+ return {
293
+ ...explanationResult,
294
+ fee: {
295
+ fee: this.suiTransaction.gasBudget.toString(),
296
+ },
297
+ type: sdk_core_1.TransactionType.AddDelegator,
298
+ outputs: [
299
+ {
300
+ address: json.sender,
301
+ amount: Number(amount),
302
+ },
303
+ ],
304
+ outputAmount: amount,
305
+ };
306
+ }
307
+ /**
308
+ * Returns a complete explanation for a withdraw delegation transaction
309
+ *
310
+ * @param {TxData} json The transaction data in json format
311
+ * @param {TransactionExplanation} explanationResult The transaction explanation to be completed
312
+ * @returns {TransactionExplanation}
313
+ */
314
+ explainWithdrawDelegationTransaction(json, explanationResult) {
315
+ return {
316
+ ...explanationResult,
317
+ fee: {
318
+ fee: this.suiTransaction.gasBudget.toString(),
319
+ },
320
+ type: sdk_core_1.TransactionType.StakingWithdraw,
321
+ outputs: [
322
+ {
323
+ address: json.sender,
324
+ amount: constants_1.TRANSFER_AMOUNT_UNKNOWN_TEXT,
325
+ },
326
+ ],
327
+ };
328
+ }
329
+ /**
330
+ * Returns a complete explanation for a switch delegation transaction
331
+ *
332
+ * @param {TxData} json The transaction data in json format
333
+ * @param {TransactionExplanation} explanationResult The transaction explanation to be completed
334
+ * @returns {TransactionExplanation}
335
+ */
336
+ explainSwitchDelegationTransaction(json, explanationResult) {
337
+ return {
338
+ ...explanationResult,
339
+ fee: {
340
+ fee: this.suiTransaction.gasBudget.toString(),
341
+ },
342
+ type: sdk_core_1.TransactionType.StakingSwitch,
343
+ outputs: [
344
+ {
345
+ address: json.sender,
346
+ amount: constants_1.TRANSFER_AMOUNT_UNKNOWN_TEXT,
347
+ },
348
+ ],
349
+ };
350
+ }
351
+ }
352
+ exports.StakingTransaction = StakingTransaction;
353
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Rha2luZ1RyYW5zYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9zdGFraW5nVHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsOENBUXlCO0FBQ3pCLG1DQVdpQjtBQUVqQixvREFBNEI7QUFDNUIsMkNBQThHO0FBRTlHLCtDQUE0QztBQUU1QyxNQUFhLGtCQUFtQixTQUFRLHlCQUF1QjtJQUM3RCxZQUFZLFdBQWlDO1FBQzNDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRUQsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUM5QixDQUFDO0lBRUQsaUJBQWlCLENBQUMsRUFBOEI7UUFDOUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELFlBQVksQ0FBQyxTQUF3QixFQUFFLFNBQWlCO1FBQ3RELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRUQsSUFBSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsT0FBTyxDQUFDLEdBQVk7UUFDbEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGlCQUFpQjtRQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3pCLE1BQU0sSUFBSSxrQ0FBdUIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1NBQ3hEO1FBQ0QsT0FBTyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixNQUFNO1FBQ0osSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDekIsTUFBTSxJQUFJLGdDQUFxQixDQUFDLG1CQUFtQixDQUFDLENBQUM7U0FDdEQ7UUFDRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQ25DLElBQUksU0FBb0IsQ0FBQztRQUN6QixRQUFRLEtBQUssQ0FBQyxJQUFJLEVBQUU7WUFDbEIsS0FBSywwQkFBa0IsQ0FBQyxhQUFhO2dCQUNuQyxTQUFTLEdBQUc7b0JBQ1YsSUFBSSxFQUFFO3dCQUNKLE9BQU8sRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLE9BQU8sSUFBSSx1QkFBVzt3QkFDeEMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxJQUFJLG9CQUFZLENBQUMsU0FBUzt3QkFDakQsUUFBUSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsUUFBUSxJQUFJLG1CQUFXLENBQUMsMkJBQTJCO3dCQUN0RSxhQUFhLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxhQUFhO3dCQUNyQyxTQUFTLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxTQUFTO3FCQUM5QjtpQkFDRixDQUFDO2dCQUNGLE1BQU07WUFDUixLQUFLLDBCQUFrQixDQUFDLGtCQUFrQjtnQkFDeEMsU0FBUyxHQUFHO29CQUNWLElBQUksRUFBRTt3QkFDSixPQUFPLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxPQUFPLElBQUksdUJBQVc7d0JBQ3hDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sSUFBSSxvQkFBWSxDQUFDLFNBQVM7d0JBQ2pELFFBQVEsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLFFBQVEsSUFBSSxtQkFBVyxDQUFDLHlCQUF5Qjt3QkFDcEUsYUFBYSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsYUFBYTt3QkFDckMsU0FBUyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsU0FBUztxQkFDOUI7aUJBQ0YsQ0FBQztnQkFDRixNQUFNO1lBQ1IsS0FBSywwQkFBa0IsQ0FBQyxnQkFBZ0I7Z0JBQ3RDLFNBQVMsR0FBRztvQkFDVixJQUFJLEVBQUU7d0JBQ0osT0FBTyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsT0FBTyxJQUFJLHVCQUFXO3dCQUN4QyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLElBQUksb0JBQVksQ0FBQyxTQUFTO3dCQUNqRCxRQUFRLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxRQUFRLElBQUksbUJBQVcsQ0FBQyx1QkFBdUI7d0JBQ2xFLGFBQWEsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLGFBQWE7d0JBQ3JDLFNBQVMsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLFNBQVM7cUJBQzlCO2lCQUNGLENBQUM7Z0JBQ0YsTUFBTTtZQUNSO2dCQUNFLE1BQU0sSUFBSSxrQ0FBdUIsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1NBQ3pFO1FBRUQsT0FBTztZQUNMLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRztZQUNaLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUU7WUFDM0IsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO1lBQ3BCLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtZQUM1QixTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7WUFDMUIsUUFBUSxFQUFFLHlCQUFhO1NBQ3hCLENBQUM7SUFDSixDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGtCQUFrQjtRQUNoQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDN0IsTUFBTSxZQUFZLEdBQUc7WUFDbkIsSUFBSTtZQUNKLFNBQVM7WUFDVCxjQUFjO1lBQ2QsZUFBZTtZQUNmLGNBQWM7WUFDZCxLQUFLO1lBQ0wsTUFBTTtZQUNOLFFBQVE7WUFDUixVQUFVO1lBQ1Ysa0JBQWtCO1NBQ25CLENBQUM7UUFDRixNQUFNLE9BQU8sR0FBMkIsRUFBRSxDQUFDO1FBRTNDLE1BQU0saUJBQWlCLEdBQTJCO1lBQ2hELFlBQVk7WUFDWixFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUU7WUFDWCxPQUFPO1lBQ1AsWUFBWSxFQUFFLEdBQUc7WUFDakIsYUFBYSxFQUFFLEVBQUU7WUFDakIsWUFBWSxFQUFFLEdBQUc7WUFDakIsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ3RELElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtTQUNoQixDQUFDO1FBRUYsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ2pCLEtBQUssMEJBQWUsQ0FBQyxZQUFZO2dCQUMvQixPQUFPLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUN6RSxLQUFLLDBCQUFlLENBQUMsZUFBZTtnQkFDbEMsT0FBTyxJQUFJLENBQUMsb0NBQW9DLENBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDLENBQUM7WUFDOUUsS0FBSywwQkFBZSxDQUFDLGFBQWE7Z0JBQ2hDLE9BQU8sSUFBSSxDQUFDLGtDQUFrQyxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1lBQzVFO2dCQUNFLE1BQU0sSUFBSSxrQ0FBdUIsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1NBQ3ZFO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxlQUFlLENBQUMsZUFBZ0M7UUFDOUMsSUFBSSxDQUFDLEtBQUssR0FBRyxlQUFlLENBQUM7SUFDL0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsb0JBQW9CO1FBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3hCLE9BQU87U0FDUjtRQUNELFFBQVEsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUU7WUFDaEMsS0FBSywwQkFBa0IsQ0FBQyxhQUFhO2dCQUNuQyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3RFLElBQUksQ0FBQyxPQUFPLEdBQUc7b0JBQ2I7d0JBQ0UsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTTt3QkFDbkMsS0FBSyxFQUFFLGNBQWM7d0JBQ3JCLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUk7cUJBQzVCO2lCQUNGLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLFFBQVEsR0FBRztvQkFDZDt3QkFDRSxPQUFPLEVBQUUsZUFBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7d0JBQzdFLEtBQUssRUFBRSxjQUFjO3dCQUNyQixJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJO3FCQUM1QjtpQkFDRixDQUFDO2dCQUNGLE1BQU07WUFDUixLQUFLLDBCQUFrQixDQUFDLGtCQUFrQjtnQkFDeEMsSUFBSSxDQUFDLE9BQU8sR0FBRztvQkFDYjt3QkFDRSxPQUFPLEVBQUUsZUFBSyxDQUFDLGNBQWMsQ0FBRSxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFrQixDQUFDLFFBQVEsQ0FBQzt3QkFDN0YsS0FBSyxFQUFFLHdDQUE0Qjt3QkFDbkMsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSTtxQkFDNUI7aUJBQ0YsQ0FBQztnQkFDRixJQUFJLENBQUMsUUFBUSxHQUFHO29CQUNkO3dCQUNFLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU07d0JBQ25DLEtBQUssRUFBRSx3Q0FBNEI7d0JBQ25DLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUk7cUJBQzVCO2lCQUNGLENBQUM7Z0JBQ0YsTUFBTTtZQUNSLEtBQUssMEJBQWtCLENBQUMsZ0JBQWdCO2dCQUN0QyxJQUFJLENBQUMsT0FBTyxHQUFHO29CQUNiO3dCQUNFLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU07d0JBQ25DLEtBQUssRUFBRSx3Q0FBNEI7d0JBQ25DLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUk7cUJBQzVCO2lCQUNGLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLFFBQVEsR0FBRztvQkFDZDt3QkFDRSxPQUFPLEVBQUUsZUFBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7d0JBQzdFLEtBQUssRUFBRSx3Q0FBNEI7d0JBQ25DLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUk7cUJBQzVCO2lCQUNGLENBQUM7Z0JBQ0YsTUFBTTtZQUNSO2dCQUNFLE9BQU87U0FDVjtJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsa0JBQWtCLENBQUMsY0FBc0I7UUFDdkMsSUFBSTtZQUNGLGVBQUssQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUM1QyxJQUFJLENBQUMsZUFBZSxHQUFHLHlCQUFXLENBQUMseUJBQXlCLENBQUMsY0FBYyxDQUErQixDQUFDO1lBQzNHLElBQUksQ0FBQyxLQUFLLEdBQUcsZUFBSyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3hFLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1NBQzdCO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDVixNQUFNLENBQUMsQ0FBQztTQUNUO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxTQUFTO1FBQ1AsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUNuQyxJQUFJLEVBQWEsQ0FBQztRQUVsQixRQUFRLEtBQUssQ0FBQyxJQUFJLEVBQUU7WUFDbEIsS0FBSywwQkFBa0IsQ0FBQyxhQUFhO2dCQUNuQyxFQUFFLEdBQUc7b0JBQ0gsSUFBSSxFQUFFO3dCQUNKLE9BQU8sRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLE9BQU8sSUFBSSxpQ0FBcUI7d0JBQ2xELE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sSUFBSSxvQkFBWSxDQUFDLFNBQVM7d0JBQ2pELFFBQVEsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLFFBQVEsSUFBSSxtQkFBVyxDQUFDLDJCQUEyQjt3QkFDdEUsYUFBYSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsYUFBYTt3QkFDckMsU0FBUyxFQUFFOzRCQUNULGVBQUssQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQW9CLENBQUM7NEJBQ3hFLGVBQUssQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQW1CLENBQUM7NEJBQ2hFLGVBQUssQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDdkQsZUFBSyxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO3lCQUM1RDtxQkFDRjtpQkFDRixDQUFDO2dCQUNGLE1BQU07WUFDUixLQUFLLDBCQUFrQixDQUFDLGtCQUFrQjtnQkFDeEMsRUFBRSxHQUFHO29CQUNILElBQUksRUFBRTt3QkFDSixPQUFPLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxPQUFPLElBQUksaUNBQXFCO3dCQUNsRCxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLElBQUksb0JBQVksQ0FBQyxTQUFTO3dCQUNqRCxRQUFRLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxRQUFRLElBQUksbUJBQVcsQ0FBQyx5QkFBeUI7d0JBQ3BFLGFBQWEsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLGFBQWE7d0JBQ3JDLFNBQVMsRUFBRTs0QkFDVCxlQUFLLENBQUMsd0JBQXdCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFvQixDQUFDOzRCQUN4RSxlQUFLLENBQUMsd0JBQXdCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFpQixDQUFDOzRCQUNyRSxlQUFLLENBQUMsd0JBQXdCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFpQixDQUFDO3lCQUN0RTtxQkFDRjtpQkFDRixDQUFDO2dCQUNGLE1BQU07WUFDUixLQUFLLDBCQUFrQixDQUFDLGdCQUFnQjtnQkFDdEMsRUFBRSxHQUFHO29CQUNILElBQUksRUFBRTt3QkFDSixPQUFPLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxPQUFPLElBQUksaUNBQXFCO3dCQUNsRCxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLElBQUksb0JBQVksQ0FBQyxTQUFTO3dCQUNqRCxRQUFRLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxRQUFRLElBQUksbUJBQVcsQ0FBQyx1QkFBdUI7d0JBQ2xFLGFBQWEsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLGFBQWE7d0JBQ3JDLFNBQVMsRUFBRTs0QkFDVCxlQUFLLENBQUMsd0JBQXdCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFvQixDQUFDOzRCQUN4RSxlQUFLLENBQUMsd0JBQXdCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFpQixDQUFDOzRCQUNyRSxlQUFLLENBQUMsd0JBQXdCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFpQixDQUFDOzRCQUNyRSxlQUFLLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7eUJBQzVEO3FCQUNGO2lCQUNGLENBQUM7Z0JBQ0YsTUFBTTtZQUNSO2dCQUNFLE1BQU0sSUFBSSxrQ0FBdUIsQ0FBQywrQkFBK0IsS0FBSyxDQUFDLElBQUksZ0JBQWdCLENBQUMsQ0FBQztTQUNoRztRQUVELE9BQU87WUFDTCxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFO1lBQ3BCLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtZQUM1QixRQUFRLEVBQUUseUJBQWE7WUFDdkIsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO1lBQzFCLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTtTQUNyQixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILCtCQUErQixDQUFDLElBQVksRUFBRSxpQkFBeUM7UUFDckYsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25ELE9BQU87WUFDTCxHQUFHLGlCQUFpQjtZQUNwQixHQUFHLEVBQUU7Z0JBQ0gsR0FBRyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRTthQUM5QztZQUNELElBQUksRUFBRSwwQkFBZSxDQUFDLFlBQVk7WUFDbEMsT0FBTyxFQUFFO2dCQUNQO29CQUNFLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTTtvQkFDcEIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUM7aUJBQ3ZCO2FBQ0Y7WUFDRCxZQUFZLEVBQUUsTUFBTTtTQUNyQixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILG9DQUFvQyxDQUNsQyxJQUFZLEVBQ1osaUJBQXlDO1FBRXpDLE9BQU87WUFDTCxHQUFHLGlCQUFpQjtZQUNwQixHQUFHLEVBQUU7Z0JBQ0gsR0FBRyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRTthQUM5QztZQUNELElBQUksRUFBRSwwQkFBZSxDQUFDLGVBQWU7WUFDckMsT0FBTyxFQUFFO2dCQUNQO29CQUNFLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTTtvQkFDcEIsTUFBTSxFQUFFLHdDQUE0QjtpQkFDckM7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsa0NBQWtDLENBQUMsSUFBWSxFQUFFLGlCQUF5QztRQUN4RixPQUFPO1lBQ0wsR0FBRyxpQkFBaUI7WUFDcEIsR0FBRyxFQUFFO2dCQUNILEdBQUcsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUU7YUFDOUM7WUFDRCxJQUFJLEVBQUUsMEJBQWUsQ0FBQyxhQUFhO1lBQ25DLE9BQU8sRUFBRTtnQkFDUDtvQkFDRSxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU07b0JBQ3BCLE1BQU0sRUFBRSx3Q0FBNEI7aUJBQ3JDO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztDQUNGO0FBeldELGdEQXlXQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJhc2VLZXksXG4gIEludmFsaWRUcmFuc2FjdGlvbkVycm9yLFxuICBQYXJzZVRyYW5zYWN0aW9uRXJyb3IsXG4gIFB1YmxpY0tleSBhcyBCYXNlUHVibGljS2V5LFxuICBTaWduYXR1cmUsXG4gIFRyYW5zYWN0aW9uUmVjaXBpZW50LFxuICBUcmFuc2FjdGlvblR5cGUsXG59IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQge1xuICBNZXRob2ROYW1lcyxcbiAgTW9kdWxlc05hbWVzLFxuICBNb3ZlQ2FsbFR4LFxuICBTaGFyZWRPYmplY3RSZWYsXG4gIFN1aU9iamVjdFJlZixcbiAgU3VpVHJhbnNhY3Rpb24sXG4gIFN1aVRyYW5zYWN0aW9uVHlwZSxcbiAgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbixcbiAgVHhEYXRhLFxuICBUeERldGFpbHMsXG59IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IFNVSV9GUkFNRVdPUktfQUREUkVTUywgU1VJX0dBU19QUklDRSwgU1VJX1BBQ0tBR0UsIFRSQU5TRkVSX0FNT1VOVF9VTktOT1dOX1RFWFQgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcblxuZXhwb3J0IGNsYXNzIFN0YWtpbmdUcmFuc2FjdGlvbiBleHRlbmRzIFRyYW5zYWN0aW9uPE1vdmVDYWxsVHg+IHtcbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICB9XG5cbiAgZ2V0IHN1aVRyYW5zYWN0aW9uKCk6IFN1aVRyYW5zYWN0aW9uPE1vdmVDYWxsVHg+IHtcbiAgICByZXR1cm4gdGhpcy5fc3VpVHJhbnNhY3Rpb247XG4gIH1cblxuICBzZXRTdWlUcmFuc2FjdGlvbih0eDogU3VpVHJhbnNhY3Rpb248TW92ZUNhbGxUeD4pOiB2b2lkIHtcbiAgICB0aGlzLl9zdWlUcmFuc2FjdGlvbiA9IHR4O1xuICB9XG5cbiAgYWRkU2lnbmF0dXJlKHB1YmxpY0tleTogQmFzZVB1YmxpY0tleSwgc2lnbmF0dXJlOiBCdWZmZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9zaWduYXR1cmVzLnB1c2goc2lnbmF0dXJlLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgdGhpcy5fc2lnbmF0dXJlID0geyBwdWJsaWNLZXksIHNpZ25hdHVyZSB9O1xuICAgIHRoaXMuc2VyaWFsaXplKCk7XG4gIH1cblxuICBnZXQgc3VpU2lnbmF0dXJlKCk6IFNpZ25hdHVyZSB7XG4gICAgcmV0dXJuIHRoaXMuX3NpZ25hdHVyZTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBjYW5TaWduKGtleTogQmFzZUtleSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHRvQnJvYWRjYXN0Rm9ybWF0KCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLl9zdWlUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdFbXB0eSB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZXJpYWxpemUoKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB0b0pzb24oKTogVHhEYXRhIHtcbiAgICBpZiAoIXRoaXMuX3N1aVRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2VUcmFuc2FjdGlvbkVycm9yKCdFbXB0eSB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgICBjb25zdCBzdWlUeCA9IHRoaXMuX3N1aVRyYW5zYWN0aW9uO1xuICAgIGxldCB0eERldGFpbHM6IFR4RGV0YWlscztcbiAgICBzd2l0Y2ggKHN1aVR4LnR5cGUpIHtcbiAgICAgIGNhc2UgU3VpVHJhbnNhY3Rpb25UeXBlLkFkZERlbGVnYXRpb246XG4gICAgICAgIHR4RGV0YWlscyA9IHtcbiAgICAgICAgICBDYWxsOiB7XG4gICAgICAgICAgICBwYWNrYWdlOiBzdWlUeC50eC5wYWNrYWdlIHx8IFNVSV9QQUNLQUdFLFxuICAgICAgICAgICAgbW9kdWxlOiBzdWlUeC50eC5tb2R1bGUgfHwgTW9kdWxlc05hbWVzLlN1aVN5c3RlbSxcbiAgICAgICAgICAgIGZ1bmN0aW9uOiBzdWlUeC50eC5mdW5jdGlvbiB8fCBNZXRob2ROYW1lcy5SZXF1ZXN0QWRkRGVsZWdhdGlvbk11bENvaW4sXG4gICAgICAgICAgICB0eXBlQXJndW1lbnRzOiBzdWlUeC50eC50eXBlQXJndW1lbnRzLFxuICAgICAgICAgICAgYXJndW1lbnRzOiBzdWlUeC50eC5hcmd1bWVudHMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN1aVRyYW5zYWN0aW9uVHlwZS5XaXRoZHJhd0RlbGVnYXRpb246XG4gICAgICAgIHR4RGV0YWlscyA9IHtcbiAgICAgICAgICBDYWxsOiB7XG4gICAgICAgICAgICBwYWNrYWdlOiBzdWlUeC50eC5wYWNrYWdlIHx8IFNVSV9QQUNLQUdFLFxuICAgICAgICAgICAgbW9kdWxlOiBzdWlUeC50eC5tb2R1bGUgfHwgTW9kdWxlc05hbWVzLlN1aVN5c3RlbSxcbiAgICAgICAgICAgIGZ1bmN0aW9uOiBzdWlUeC50eC5mdW5jdGlvbiB8fCBNZXRob2ROYW1lcy5SZXF1ZXN0V2l0aGRyYXdEZWxlZ2F0aW9uLFxuICAgICAgICAgICAgdHlwZUFyZ3VtZW50czogc3VpVHgudHgudHlwZUFyZ3VtZW50cyxcbiAgICAgICAgICAgIGFyZ3VtZW50czogc3VpVHgudHguYXJndW1lbnRzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdWlUcmFuc2FjdGlvblR5cGUuU3dpdGNoRGVsZWdhdGlvbjpcbiAgICAgICAgdHhEZXRhaWxzID0ge1xuICAgICAgICAgIENhbGw6IHtcbiAgICAgICAgICAgIHBhY2thZ2U6IHN1aVR4LnR4LnBhY2thZ2UgfHwgU1VJX1BBQ0tBR0UsXG4gICAgICAgICAgICBtb2R1bGU6IHN1aVR4LnR4Lm1vZHVsZSB8fCBNb2R1bGVzTmFtZXMuU3VpU3lzdGVtLFxuICAgICAgICAgICAgZnVuY3Rpb246IHN1aVR4LnR4LmZ1bmN0aW9uIHx8IE1ldGhvZE5hbWVzLlJlcXVlc3RTd2l0Y2hEZWxlZ2F0aW9uLFxuICAgICAgICAgICAgdHlwZUFyZ3VtZW50czogc3VpVHgudHgudHlwZUFyZ3VtZW50cyxcbiAgICAgICAgICAgIGFyZ3VtZW50czogc3VpVHgudHguYXJndW1lbnRzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdTdWlUcmFuc2FjdGlvblR5cGUgbm90IHN1cHBvcnRlZCcpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpZDogdGhpcy5faWQsXG4gICAgICBraW5kOiB7IFNpbmdsZTogdHhEZXRhaWxzIH0sXG4gICAgICBzZW5kZXI6IHN1aVR4LnNlbmRlcixcbiAgICAgIGdhc1BheW1lbnQ6IHN1aVR4Lmdhc1BheW1lbnQsXG4gICAgICBnYXNCdWRnZXQ6IHN1aVR4Lmdhc0J1ZGdldCxcbiAgICAgIGdhc1ByaWNlOiBTVUlfR0FTX1BSSUNFLFxuICAgIH07XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgZXhwbGFpblRyYW5zYWN0aW9uKCk6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMudG9Kc29uKCk7XG4gICAgY29uc3QgZGlzcGxheU9yZGVyID0gW1xuICAgICAgJ2lkJyxcbiAgICAgICdvdXRwdXRzJyxcbiAgICAgICdvdXRwdXRBbW91bnQnLFxuICAgICAgJ2NoYW5nZU91dHB1dHMnLFxuICAgICAgJ2NoYW5nZUFtb3VudCcsXG4gICAgICAnZmVlJyxcbiAgICAgICd0eXBlJyxcbiAgICAgICdtb2R1bGUnLFxuICAgICAgJ2Z1bmN0aW9uJyxcbiAgICAgICd2YWxpZGF0b3JBZGRyZXNzJyxcbiAgICBdO1xuICAgIGNvbnN0IG91dHB1dHM6IFRyYW5zYWN0aW9uUmVjaXBpZW50W10gPSBbXTtcblxuICAgIGNvbnN0IGV4cGxhbmF0aW9uUmVzdWx0OiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uID0ge1xuICAgICAgZGlzcGxheU9yZGVyLFxuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBvdXRwdXRzLFxuICAgICAgb3V0cHV0QW1vdW50OiAnMCcsXG4gICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgIGNoYW5nZUFtb3VudDogJzAnLFxuICAgICAgZmVlOiB7IGZlZTogdGhpcy5zdWlUcmFuc2FjdGlvbi5nYXNCdWRnZXQudG9TdHJpbmcoKSB9LFxuICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgIH07XG5cbiAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuQWRkRGVsZWdhdG9yOlxuICAgICAgICByZXR1cm4gdGhpcy5leHBsYWluQWRkRGVsZWdhdGlvblRyYW5zYWN0aW9uKHJlc3VsdCwgZXhwbGFuYXRpb25SZXN1bHQpO1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1dpdGhkcmF3OlxuICAgICAgICByZXR1cm4gdGhpcy5leHBsYWluV2l0aGRyYXdEZWxlZ2F0aW9uVHJhbnNhY3Rpb24ocmVzdWx0LCBleHBsYW5hdGlvblJlc3VsdCk7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nU3dpdGNoOlxuICAgICAgICByZXR1cm4gdGhpcy5leHBsYWluU3dpdGNoRGVsZWdhdGlvblRyYW5zYWN0aW9uKHJlc3VsdCwgZXhwbGFuYXRpb25SZXN1bHQpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdUcmFuc2FjdGlvbiB0eXBlIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB0cmFuc2FjdGlvbiB0eXBlLlxuICAgKlxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uVHlwZX0gdHJhbnNhY3Rpb25UeXBlIFRoZSB0cmFuc2FjdGlvbiB0eXBlIHRvIGJlIHNldC5cbiAgICovXG4gIHRyYW5zYWN0aW9uVHlwZSh0cmFuc2FjdGlvblR5cGU6IFRyYW5zYWN0aW9uVHlwZSk6IHZvaWQge1xuICAgIHRoaXMuX3R5cGUgPSB0cmFuc2FjdGlvblR5cGU7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCB0aGUgaW5wdXQgYW5kIG91dHB1dCBkYXRhIG9uIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAqL1xuICBsb2FkSW5wdXRzQW5kT3V0cHV0cygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3VpVHJhbnNhY3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3dpdGNoICh0aGlzLnN1aVRyYW5zYWN0aW9uLnR5cGUpIHtcbiAgICAgIGNhc2UgU3VpVHJhbnNhY3Rpb25UeXBlLkFkZERlbGVnYXRpb246XG4gICAgICAgIGNvbnN0IHN0YWtpbmdfYW1vdW50ID0gdGhpcy5zdWlUcmFuc2FjdGlvbi50eC5hcmd1bWVudHNbMl0udG9TdHJpbmcoKTtcbiAgICAgICAgdGhpcy5faW5wdXRzID0gW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRoaXMuc3VpVHJhbnNhY3Rpb24uc2VuZGVyLFxuICAgICAgICAgICAgdmFsdWU6IHN0YWtpbmdfYW1vdW50LCAvLyBzdGFraW5nX2Ftb3VudFxuICAgICAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgICAgIHRoaXMuX291dHB1dHMgPSBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdXRpbHMubm9ybWFsaXplSGV4SWQodGhpcy5zdWlUcmFuc2FjdGlvbi50eC5hcmd1bWVudHNbM10udG9TdHJpbmcoKSksIC8vIHZhbGlkYXRvciBhZGRyZXNzXG4gICAgICAgICAgICB2YWx1ZTogc3Rha2luZ19hbW91bnQsIC8vIHN0YWtpbmdfYW1vdW50XG4gICAgICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN1aVRyYW5zYWN0aW9uVHlwZS5XaXRoZHJhd0RlbGVnYXRpb246XG4gICAgICAgIHRoaXMuX2lucHV0cyA9IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiB1dGlscy5ub3JtYWxpemVIZXhJZCgodGhpcy5zdWlUcmFuc2FjdGlvbi50eC5hcmd1bWVudHNbMV0gYXMgU3VpT2JqZWN0UmVmKS5vYmplY3RJZCksIC8vIGRlbGVnYXRvciBhZGRyZXNzXG4gICAgICAgICAgICB2YWx1ZTogVFJBTlNGRVJfQU1PVU5UX1VOS05PV05fVEVYVCxcbiAgICAgICAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgICB0aGlzLl9vdXRwdXRzID0gW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRoaXMuc3VpVHJhbnNhY3Rpb24uc2VuZGVyLFxuICAgICAgICAgICAgdmFsdWU6IFRSQU5TRkVSX0FNT1VOVF9VTktOT1dOX1RFWFQsXG4gICAgICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN1aVRyYW5zYWN0aW9uVHlwZS5Td2l0Y2hEZWxlZ2F0aW9uOlxuICAgICAgICB0aGlzLl9pbnB1dHMgPSBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGhpcy5zdWlUcmFuc2FjdGlvbi5zZW5kZXIsXG4gICAgICAgICAgICB2YWx1ZTogVFJBTlNGRVJfQU1PVU5UX1VOS05PV05fVEVYVCxcbiAgICAgICAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgICB0aGlzLl9vdXRwdXRzID0gW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHV0aWxzLm5vcm1hbGl6ZUhleElkKHRoaXMuc3VpVHJhbnNhY3Rpb24udHguYXJndW1lbnRzWzNdLnRvU3RyaW5nKCkpLCAvLyB2YWxpZGF0b3IgYWRkcmVzc1xuICAgICAgICAgICAgdmFsdWU6IFRSQU5TRkVSX0FNT1VOVF9VTktOT1dOX1RFWFQsXG4gICAgICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhpcyB0cmFuc2FjdGlvbiBwYXlsb2FkXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByYXdUcmFuc2FjdGlvblxuICAgKi9cbiAgZnJvbVJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgdXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uKTtcbiAgICAgIHRoaXMuX3N1aVRyYW5zYWN0aW9uID0gVHJhbnNhY3Rpb24uZGVzZXJpYWxpemVTdWlUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbikgYXMgU3VpVHJhbnNhY3Rpb248TW92ZUNhbGxUeD47XG4gICAgICB0aGlzLl90eXBlID0gdXRpbHMuZ2V0VHJhbnNhY3Rpb25UeXBlKHRoaXMuX3N1aVRyYW5zYWN0aW9uLnR4LmZ1bmN0aW9uKTtcbiAgICAgIHRoaXMubG9hZElucHV0c0FuZE91dHB1dHMoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIHNlcmlhbGl6ZSgpIHRvIGdldCB0aGUgY29ycmVjdCB0eERhdGEgd2l0aCB0cmFuc2FjdGlvbiB0eXBlXG4gICAqXG4gICAqIEByZXR1cm4ge1R4RGF0YX1cbiAgICovXG4gIGdldFR4RGF0YSgpOiBUeERhdGEge1xuICAgIGNvbnN0IHN1aVR4ID0gdGhpcy5fc3VpVHJhbnNhY3Rpb247XG4gICAgbGV0IHR4OiBUeERldGFpbHM7XG5cbiAgICBzd2l0Y2ggKHN1aVR4LnR5cGUpIHtcbiAgICAgIGNhc2UgU3VpVHJhbnNhY3Rpb25UeXBlLkFkZERlbGVnYXRpb246XG4gICAgICAgIHR4ID0ge1xuICAgICAgICAgIENhbGw6IHtcbiAgICAgICAgICAgIHBhY2thZ2U6IHN1aVR4LnR4LnBhY2thZ2UgfHwgU1VJX0ZSQU1FV09SS19BRERSRVNTLFxuICAgICAgICAgICAgbW9kdWxlOiBzdWlUeC50eC5tb2R1bGUgfHwgTW9kdWxlc05hbWVzLlN1aVN5c3RlbSxcbiAgICAgICAgICAgIGZ1bmN0aW9uOiBzdWlUeC50eC5mdW5jdGlvbiB8fCBNZXRob2ROYW1lcy5SZXF1ZXN0QWRkRGVsZWdhdGlvbk11bENvaW4sXG4gICAgICAgICAgICB0eXBlQXJndW1lbnRzOiBzdWlUeC50eC50eXBlQXJndW1lbnRzLFxuICAgICAgICAgICAgYXJndW1lbnRzOiBbXG4gICAgICAgICAgICAgIHV0aWxzLm1hcFNoYXJlZE9iamVjdFRvQ2FsbEFyZyhzdWlUeC50eC5hcmd1bWVudHNbMF0gYXMgU2hhcmVkT2JqZWN0UmVmKSxcbiAgICAgICAgICAgICAgdXRpbHMubWFwQ29pbnNUb0NhbGxBcmcoc3VpVHgudHguYXJndW1lbnRzWzFdIGFzIFN1aU9iamVjdFJlZltdKSxcbiAgICAgICAgICAgICAgdXRpbHMubWFwQW1vdW50VG9DYWxsQXJnKE51bWJlcihzdWlUeC50eC5hcmd1bWVudHNbMl0pKSxcbiAgICAgICAgICAgICAgdXRpbHMubWFwQWRkcmVzc1RvQ2FsbEFyZyhzdWlUeC50eC5hcmd1bWVudHNbM10udG9TdHJpbmcoKSksXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdWlUcmFuc2FjdGlvblR5cGUuV2l0aGRyYXdEZWxlZ2F0aW9uOlxuICAgICAgICB0eCA9IHtcbiAgICAgICAgICBDYWxsOiB7XG4gICAgICAgICAgICBwYWNrYWdlOiBzdWlUeC50eC5wYWNrYWdlIHx8IFNVSV9GUkFNRVdPUktfQUREUkVTUyxcbiAgICAgICAgICAgIG1vZHVsZTogc3VpVHgudHgubW9kdWxlIHx8IE1vZHVsZXNOYW1lcy5TdWlTeXN0ZW0sXG4gICAgICAgICAgICBmdW5jdGlvbjogc3VpVHgudHguZnVuY3Rpb24gfHwgTWV0aG9kTmFtZXMuUmVxdWVzdFdpdGhkcmF3RGVsZWdhdGlvbixcbiAgICAgICAgICAgIHR5cGVBcmd1bWVudHM6IHN1aVR4LnR4LnR5cGVBcmd1bWVudHMsXG4gICAgICAgICAgICBhcmd1bWVudHM6IFtcbiAgICAgICAgICAgICAgdXRpbHMubWFwU2hhcmVkT2JqZWN0VG9DYWxsQXJnKHN1aVR4LnR4LmFyZ3VtZW50c1swXSBhcyBTaGFyZWRPYmplY3RSZWYpLFxuICAgICAgICAgICAgICB1dGlscy5tYXBTdWlPYmplY3RSZWZUb0NhbGxBcmcoc3VpVHgudHguYXJndW1lbnRzWzFdIGFzIFN1aU9iamVjdFJlZiksXG4gICAgICAgICAgICAgIHV0aWxzLm1hcFN1aU9iamVjdFJlZlRvQ2FsbEFyZyhzdWlUeC50eC5hcmd1bWVudHNbMl0gYXMgU3VpT2JqZWN0UmVmKSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN1aVRyYW5zYWN0aW9uVHlwZS5Td2l0Y2hEZWxlZ2F0aW9uOlxuICAgICAgICB0eCA9IHtcbiAgICAgICAgICBDYWxsOiB7XG4gICAgICAgICAgICBwYWNrYWdlOiBzdWlUeC50eC5wYWNrYWdlIHx8IFNVSV9GUkFNRVdPUktfQUREUkVTUyxcbiAgICAgICAgICAgIG1vZHVsZTogc3VpVHgudHgubW9kdWxlIHx8IE1vZHVsZXNOYW1lcy5TdWlTeXN0ZW0sXG4gICAgICAgICAgICBmdW5jdGlvbjogc3VpVHgudHguZnVuY3Rpb24gfHwgTWV0aG9kTmFtZXMuUmVxdWVzdFN3aXRjaERlbGVnYXRpb24sXG4gICAgICAgICAgICB0eXBlQXJndW1lbnRzOiBzdWlUeC50eC50eXBlQXJndW1lbnRzLFxuICAgICAgICAgICAgYXJndW1lbnRzOiBbXG4gICAgICAgICAgICAgIHV0aWxzLm1hcFNoYXJlZE9iamVjdFRvQ2FsbEFyZyhzdWlUeC50eC5hcmd1bWVudHNbMF0gYXMgU2hhcmVkT2JqZWN0UmVmKSxcbiAgICAgICAgICAgICAgdXRpbHMubWFwU3VpT2JqZWN0UmVmVG9DYWxsQXJnKHN1aVR4LnR4LmFyZ3VtZW50c1sxXSBhcyBTdWlPYmplY3RSZWYpLFxuICAgICAgICAgICAgICB1dGlscy5tYXBTdWlPYmplY3RSZWZUb0NhbGxBcmcoc3VpVHgudHguYXJndW1lbnRzWzJdIGFzIFN1aU9iamVjdFJlZiksXG4gICAgICAgICAgICAgIHV0aWxzLm1hcEFkZHJlc3NUb0NhbGxBcmcoc3VpVHgudHguYXJndW1lbnRzWzNdLnRvU3RyaW5nKCkpLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihgU3VpIFN0YWtpbmdUcmFuc2FjdGlvbiB0eXBlICR7c3VpVHgudHlwZX0gbm90IHN1cHBvcnRlZGApO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBraW5kOiB7IFNpbmdsZTogdHggfSxcbiAgICAgIGdhc1BheW1lbnQ6IHN1aVR4Lmdhc1BheW1lbnQsXG4gICAgICBnYXNQcmljZTogU1VJX0dBU19QUklDRSxcbiAgICAgIGdhc0J1ZGdldDogc3VpVHguZ2FzQnVkZ2V0LFxuICAgICAgc2VuZGVyOiBzdWlUeC5zZW5kZXIsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgY29tcGxldGUgZXhwbGFuYXRpb24gZm9yIGEgdHJhbnNmZXIgdHJhbnNhY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtUeERhdGF9IGpzb24gVGhlIHRyYW5zYWN0aW9uIGRhdGEgaW4ganNvbiBmb3JtYXRcbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvbkV4cGxhbmF0aW9ufSBleHBsYW5hdGlvblJlc3VsdCBUaGUgdHJhbnNhY3Rpb24gZXhwbGFuYXRpb24gdG8gYmUgY29tcGxldGVkXG4gICAqIEByZXR1cm5zIHtUcmFuc2FjdGlvbkV4cGxhbmF0aW9ufVxuICAgKi9cbiAgZXhwbGFpbkFkZERlbGVnYXRpb25UcmFuc2FjdGlvbihqc29uOiBUeERhdGEsIGV4cGxhbmF0aW9uUmVzdWx0OiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uKTogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gICAgY29uc3QgYW1vdW50ID0gdGhpcy5zdWlUcmFuc2FjdGlvbi50eC5hcmd1bWVudHNbMl07XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmV4cGxhbmF0aW9uUmVzdWx0LFxuICAgICAgZmVlOiB7XG4gICAgICAgIGZlZTogdGhpcy5zdWlUcmFuc2FjdGlvbi5nYXNCdWRnZXQudG9TdHJpbmcoKSxcbiAgICAgIH0sXG4gICAgICB0eXBlOiBUcmFuc2FjdGlvblR5cGUuQWRkRGVsZWdhdG9yLFxuICAgICAgb3V0cHV0czogW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczoganNvbi5zZW5kZXIsXG4gICAgICAgICAgYW1vdW50OiBOdW1iZXIoYW1vdW50KSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBvdXRwdXRBbW91bnQ6IGFtb3VudCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBjb21wbGV0ZSBleHBsYW5hdGlvbiBmb3IgYSB3aXRoZHJhdyBkZWxlZ2F0aW9uIHRyYW5zYWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7VHhEYXRhfSBqc29uIFRoZSB0cmFuc2FjdGlvbiBkYXRhIGluIGpzb24gZm9ybWF0XG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25FeHBsYW5hdGlvbn0gZXhwbGFuYXRpb25SZXN1bHQgVGhlIHRyYW5zYWN0aW9uIGV4cGxhbmF0aW9uIHRvIGJlIGNvbXBsZXRlZFxuICAgKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25FeHBsYW5hdGlvbn1cbiAgICovXG4gIGV4cGxhaW5XaXRoZHJhd0RlbGVnYXRpb25UcmFuc2FjdGlvbihcbiAgICBqc29uOiBUeERhdGEsXG4gICAgZXhwbGFuYXRpb25SZXN1bHQ6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb25cbiAgKTogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmV4cGxhbmF0aW9uUmVzdWx0LFxuICAgICAgZmVlOiB7XG4gICAgICAgIGZlZTogdGhpcy5zdWlUcmFuc2FjdGlvbi5nYXNCdWRnZXQudG9TdHJpbmcoKSxcbiAgICAgIH0sXG4gICAgICB0eXBlOiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1dpdGhkcmF3LFxuICAgICAgb3V0cHV0czogW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczoganNvbi5zZW5kZXIsXG4gICAgICAgICAgYW1vdW50OiBUUkFOU0ZFUl9BTU9VTlRfVU5LTk9XTl9URVhULFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBjb21wbGV0ZSBleHBsYW5hdGlvbiBmb3IgYSBzd2l0Y2ggZGVsZWdhdGlvbiB0cmFuc2FjdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge1R4RGF0YX0ganNvbiBUaGUgdHJhbnNhY3Rpb24gZGF0YSBpbiBqc29uIGZvcm1hdFxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uRXhwbGFuYXRpb259IGV4cGxhbmF0aW9uUmVzdWx0IFRoZSB0cmFuc2FjdGlvbiBleHBsYW5hdGlvbiB0byBiZSBjb21wbGV0ZWRcbiAgICogQHJldHVybnMge1RyYW5zYWN0aW9uRXhwbGFuYXRpb259XG4gICAqL1xuICBleHBsYWluU3dpdGNoRGVsZWdhdGlvblRyYW5zYWN0aW9uKGpzb246IFR4RGF0YSwgZXhwbGFuYXRpb25SZXN1bHQ6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24pOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZXhwbGFuYXRpb25SZXN1bHQsXG4gICAgICBmZWU6IHtcbiAgICAgICAgZmVlOiB0aGlzLnN1aVRyYW5zYWN0aW9uLmdhc0J1ZGdldC50b1N0cmluZygpLFxuICAgICAgfSxcbiAgICAgIHR5cGU6IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nU3dpdGNoLFxuICAgICAgb3V0cHV0czogW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczoganNvbi5zZW5kZXIsXG4gICAgICAgICAgYW1vdW50OiBUUkFOU0ZFUl9BTU9VTlRfVU5LTk9XTl9URVhULFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG59XG4iXX0=
@@ -1,23 +1,21 @@
1
1
  /// <reference types="node" />
2
2
  import { BaseKey, BaseTransaction, PublicKey as BasePublicKey, Signature, TransactionType } from '@bitgo/sdk-core';
3
- import { SuiObjectRef, SuiTransaction, TransactionExplanation, TxData } from './iface';
3
+ import { MoveCallTx, PayTx, SuiTransaction, SuiTransactionType, TxData } from './iface';
4
4
  import { BaseCoin as CoinConfig } from '@bitgo/statics';
5
- import { SuiTransactionType } from './constants';
6
5
  import { KeyPair } from './keyPair';
7
- export declare class Transaction extends BaseTransaction {
8
- private _suiTransaction;
9
- private _signature;
6
+ export declare abstract class Transaction<T> extends BaseTransaction {
7
+ protected _suiTransaction: SuiTransaction<T>;
8
+ protected _signature: Signature;
10
9
  private _serializedSig;
11
- constructor(_coinConfig: Readonly<CoinConfig>);
12
- get suiTransaction(): SuiTransaction;
13
- setSuiTransaction(tx: SuiTransaction): void;
10
+ protected constructor(_coinConfig: Readonly<CoinConfig>);
11
+ get suiTransaction(): SuiTransaction<T>;
12
+ setSuiTransaction(tx: SuiTransaction<T>): void;
14
13
  /** @inheritDoc **/
15
14
  get id(): string;
16
15
  addSignature(publicKey: BasePublicKey, signature: Buffer): void;
17
16
  get suiSignature(): Signature;
18
17
  get serializedSig(): Uint8Array;
19
18
  setSerializedSig(publicKey: BasePublicKey, signature: Buffer): void;
20
- getInputCoins(): SuiObjectRef[];
21
19
  /** @inheritdoc */
22
20
  canSign(key: BaseKey): boolean;
23
21
  /**
@@ -29,46 +27,35 @@ export declare class Transaction extends BaseTransaction {
29
27
  /** @inheritdoc */
30
28
  toBroadcastFormat(): string;
31
29
  /** @inheritdoc */
32
- toJson(): TxData;
33
- /** @inheritDoc */
34
- explainTransaction(): TransactionExplanation;
30
+ abstract toJson(): TxData;
35
31
  /**
36
32
  * Set the transaction type.
37
33
  *
38
34
  * @param {TransactionType} transactionType The transaction type to be set.
39
35
  */
40
36
  transactionType(transactionType: TransactionType): void;
37
+ /**
38
+ * get the correct txData with transaction type
39
+ */
40
+ abstract getTxData(): TxData;
41
41
  /**
42
42
  * Load the input and output data on this transaction.
43
43
  */
44
- loadInputsAndOutputs(): void;
44
+ abstract loadInputsAndOutputs(): void;
45
45
  /**
46
46
  * Sets this transaction payload
47
47
  *
48
48
  * @param rawTransaction
49
49
  */
50
- fromRawTransaction(rawTransaction: string): void;
51
- /**
52
- * Helper function for serialize() to get the correct txData with transaction type
53
- */
54
- private getTxData;
50
+ abstract fromRawTransaction(rawTransaction: string): void;
55
51
  getDataBytes(): Uint8Array;
56
52
  /** @inheritDoc */
57
53
  get signablePayload(): Buffer;
58
54
  serialize(): string;
59
55
  private getSha256Hash;
60
56
  static deserializeSuiTransaction(serializedTx: string): SuiTransaction;
61
- static getProperTxDetails(k: any, type: SuiTransactionType): {
62
- coins: SuiObjectRef[];
63
- recipients: string[];
64
- amounts: number[];
65
- };
66
- /**
67
- * Returns a complete explanation for a transfer transaction
68
- * @param {TxData} json The transaction data in json format
69
- * @param {TransactionExplanation} explanationResult The transaction explanation to be completed
70
- * @returns {TransactionExplanation}
71
- */
72
- explainTransferTransaction(json: TxData, explanationResult: TransactionExplanation): TransactionExplanation;
57
+ static getProperTxDetails(k: any, type: SuiTransactionType): PayTx | MoveCallTx;
58
+ private static normalizeCoins;
59
+ private static normalizeSuiObjectRef;
73
60
  }
74
61
  //# sourceMappingURL=transaction.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../../src/lib/transaction.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,OAAO,EACP,eAAe,EAGf,SAAS,IAAI,aAAa,EAC1B,SAAS,EAET,eAAe,EAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,EAAa,MAAM,SAAS,CAAC;AAClG,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGxD,OAAO,EAKL,kBAAkB,EAEnB,MAAM,aAAa,CAAC;AAKrB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,qBAAa,WAAY,SAAQ,eAAe;IAC9C,OAAO,CAAC,eAAe,CAAiB;IACxC,OAAO,CAAC,UAAU,CAAY;IAC9B,OAAO,CAAC,cAAc,CAAa;gBAEvB,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAI7C,IAAI,cAAc,IAAI,cAAc,CAEnC;IAED,iBAAiB,CAAC,EAAE,EAAE,cAAc,GAAG,IAAI;IAI3C,mBAAmB;IACnB,IAAI,EAAE,IAAI,MAAM,CAOf;IAED,YAAY,CAAC,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAM/D,IAAI,YAAY,IAAI,SAAS,CAE5B;IAED,IAAI,aAAa,IAAI,UAAU,CAE9B;IAED,gBAAgB,CAAC,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IASnE,aAAa,IAAI,YAAY,EAAE;IAI/B,kBAAkB;IAClB,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO;IAI9B;;;;OAIG;IAEH,IAAI,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;IAU3B,kBAAkB;IAClB,iBAAiB,IAAI,MAAM;IAO3B,kBAAkB;IAClB,MAAM,IAAI,MAAM;IAiDhB,kBAAkB;IAClB,kBAAkB,IAAI,sBAAsB;IAwB5C;;;;OAIG;IACH,eAAe,CAAC,eAAe,EAAE,eAAe,GAAG,IAAI;IAIvD;;OAEG;IACH,oBAAoB,IAAI,IAAI;IAgC5B;;;;OAIG;IACH,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAWhD;;OAEG;IACH,OAAO,CAAC,SAAS;IA+CjB,YAAY,IAAI,UAAU;IAK1B,kBAAkB;IAClB,IAAI,eAAe,IAAI,MAAM,CAO5B;IAED,SAAS,IAAI,MAAM;IASnB,OAAO,CAAC,aAAa;IAcrB,MAAM,CAAC,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,cAAc;IAoCtE,MAAM,CAAC,kBAAkB,CACvB,CAAC,EAAE,GAAG,EACN,IAAI,EAAE,kBAAkB,GACvB;QAAE,KAAK,EAAE,YAAY,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE;IAuCrE;;;;;OAKG;IACH,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,sBAAsB,GAAG,sBAAsB;CAgB5G"}
1
+ {"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../../src/lib/transaction.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,OAAO,EACP,eAAe,EAEf,SAAS,IAAI,aAAa,EAC1B,SAAS,EACT,eAAe,EAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,UAAU,EAEV,KAAK,EAEL,cAAc,EACd,kBAAkB,EAClB,MAAM,EAEP,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAQxD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,8BAAsB,WAAW,CAAC,CAAC,CAAE,SAAQ,eAAe;IAC1D,SAAS,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;IAC7C,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC;IAChC,OAAO,CAAC,cAAc,CAAa;IAEnC,SAAS,aAAa,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAIvD,IAAI,cAAc,IAAI,cAAc,CAAC,CAAC,CAAC,CAEtC;IAED,iBAAiB,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI;IAI9C,mBAAmB;IACnB,IAAI,EAAE,IAAI,MAAM,CAOf;IAED,YAAY,CAAC,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAM/D,IAAI,YAAY,IAAI,SAAS,CAE5B;IAED,IAAI,aAAa,IAAI,UAAU,CAE9B;IAED,gBAAgB,CAAC,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IASnE,kBAAkB;IAClB,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO;IAI9B;;;;OAIG;IAEH,IAAI,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;IAU3B,kBAAkB;IAClB,iBAAiB,IAAI,MAAM;IAO3B,kBAAkB;IAClB,QAAQ,CAAC,MAAM,IAAI,MAAM;IAEzB;;;;OAIG;IACH,eAAe,CAAC,eAAe,EAAE,eAAe,GAAG,IAAI;IAIvD;;OAEG;IACH,QAAQ,CAAC,SAAS,IAAI,MAAM;IAE5B;;OAEG;IACH,QAAQ,CAAC,oBAAoB,IAAI,IAAI;IAErC;;;;OAIG;IACH,QAAQ,CAAC,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAEzD,YAAY,IAAI,UAAU;IAK1B,kBAAkB;IAClB,IAAI,eAAe,IAAI,MAAM,CAO5B;IAED,SAAS,IAAI,MAAM;IASnB,OAAO,CAAC,aAAa;IAcrB,MAAM,CAAC,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,cAAc;IAmCtE,MAAM,CAAC,kBAAkB,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,kBAAkB,GAAG,KAAK,GAAG,UAAU;IAiE/E,OAAO,CAAC,MAAM,CAAC,cAAc;IAM7B,OAAO,CAAC,MAAM,CAAC,qBAAqB;CAOrC"}