@bitgo-beta/sdk-coin-avaxp 0.0.0-semantic-release-managed

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 (137) hide show
  1. package/.eslintignore +5 -0
  2. package/.eslintrc.json +7 -0
  3. package/.mocharc.yml +8 -0
  4. package/CHANGELOG.md +1091 -0
  5. package/LICENSE +191 -0
  6. package/README.md +39 -0
  7. package/dist/src/avaxp.d.ts +91 -0
  8. package/dist/src/avaxp.d.ts.map +1 -0
  9. package/dist/src/avaxp.js +343 -0
  10. package/dist/src/iface.d.ts +42 -0
  11. package/dist/src/iface.d.ts.map +1 -0
  12. package/dist/src/iface.js +3 -0
  13. package/dist/src/index.d.ts +6 -0
  14. package/dist/src/index.d.ts.map +1 -0
  15. package/dist/src/index.js +45 -0
  16. package/dist/src/lib/atomicInCTransactionBuilder.d.ts +21 -0
  17. package/dist/src/lib/atomicInCTransactionBuilder.d.ts.map +1 -0
  18. package/dist/src/lib/atomicInCTransactionBuilder.js +49 -0
  19. package/dist/src/lib/atomicTransactionBuilder.d.ts +38 -0
  20. package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -0
  21. package/dist/src/lib/atomicTransactionBuilder.js +129 -0
  22. package/dist/src/lib/delegatorTxBuilder.d.ts +95 -0
  23. package/dist/src/lib/delegatorTxBuilder.d.ts.map +1 -0
  24. package/dist/src/lib/delegatorTxBuilder.js +285 -0
  25. package/dist/src/lib/deprecatedTransaction.d.ts +98 -0
  26. package/dist/src/lib/deprecatedTransaction.d.ts.map +1 -0
  27. package/dist/src/lib/deprecatedTransaction.js +344 -0
  28. package/dist/src/lib/deprecatedTransactionBuilder.d.ts +114 -0
  29. package/dist/src/lib/deprecatedTransactionBuilder.d.ts.map +1 -0
  30. package/dist/src/lib/deprecatedTransactionBuilder.js +210 -0
  31. package/dist/src/lib/errors.d.ts +8 -0
  32. package/dist/src/lib/errors.d.ts.map +1 -0
  33. package/dist/src/lib/errors.js +19 -0
  34. package/dist/src/lib/exportInCTxBuilder.d.ts +55 -0
  35. package/dist/src/lib/exportInCTxBuilder.d.ts.map +1 -0
  36. package/dist/src/lib/exportInCTxBuilder.js +159 -0
  37. package/dist/src/lib/exportTxBuilder.d.ts +33 -0
  38. package/dist/src/lib/exportTxBuilder.d.ts.map +1 -0
  39. package/dist/src/lib/exportTxBuilder.js +88 -0
  40. package/dist/src/lib/iface.d.ts +68 -0
  41. package/dist/src/lib/iface.d.ts.map +1 -0
  42. package/dist/src/lib/iface.js +20 -0
  43. package/dist/src/lib/importInCTxBuilder.d.ts +44 -0
  44. package/dist/src/lib/importInCTxBuilder.d.ts.map +1 -0
  45. package/dist/src/lib/importInCTxBuilder.js +131 -0
  46. package/dist/src/lib/importTxBuilder.d.ts +18 -0
  47. package/dist/src/lib/importTxBuilder.d.ts.map +1 -0
  48. package/dist/src/lib/importTxBuilder.js +67 -0
  49. package/dist/src/lib/index.d.ts +11 -0
  50. package/dist/src/lib/index.d.ts.map +1 -0
  51. package/dist/src/lib/index.js +37 -0
  52. package/dist/src/lib/keyPair.d.ts +58 -0
  53. package/dist/src/lib/keyPair.d.ts.map +1 -0
  54. package/dist/src/lib/keyPair.js +150 -0
  55. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +154 -0
  56. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -0
  57. package/dist/src/lib/permissionlessValidatorTxBuilder.js +452 -0
  58. package/dist/src/lib/transaction.d.ts +78 -0
  59. package/dist/src/lib/transaction.d.ts.map +1 -0
  60. package/dist/src/lib/transaction.js +254 -0
  61. package/dist/src/lib/transactionBuilder.d.ts +71 -0
  62. package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
  63. package/dist/src/lib/transactionBuilder.js +138 -0
  64. package/dist/src/lib/transactionBuilderFactory.d.ts +57 -0
  65. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -0
  66. package/dist/src/lib/transactionBuilderFactory.js +178 -0
  67. package/dist/src/lib/utils.d.ts +184 -0
  68. package/dist/src/lib/utils.d.ts.map +1 -0
  69. package/dist/src/lib/utils.js +378 -0
  70. package/dist/src/lib/utxoEngine.d.ts +53 -0
  71. package/dist/src/lib/utxoEngine.d.ts.map +1 -0
  72. package/dist/src/lib/utxoEngine.js +112 -0
  73. package/dist/src/lib/validatorTxBuilder.d.ts +37 -0
  74. package/dist/src/lib/validatorTxBuilder.d.ts.map +1 -0
  75. package/dist/src/lib/validatorTxBuilder.js +69 -0
  76. package/dist/src/register.d.ts +3 -0
  77. package/dist/src/register.d.ts.map +1 -0
  78. package/dist/src/register.js +11 -0
  79. package/dist/src/tavaxp.d.ts +9 -0
  80. package/dist/src/tavaxp.d.ts.map +1 -0
  81. package/dist/src/tavaxp.js +14 -0
  82. package/dist/test/resources/avaxp.d.ts +259 -0
  83. package/dist/test/resources/avaxp.d.ts.map +1 -0
  84. package/dist/test/resources/avaxp.js +1093 -0
  85. package/dist/test/resources/errors.d.ts +19 -0
  86. package/dist/test/resources/errors.d.ts.map +1 -0
  87. package/dist/test/resources/errors.js +22 -0
  88. package/dist/test/resources/keychains.d.ts +18 -0
  89. package/dist/test/resources/keychains.d.ts.map +1 -0
  90. package/dist/test/resources/keychains.js +30 -0
  91. package/dist/test/resources/tx/exportC.d.ts +14 -0
  92. package/dist/test/resources/tx/exportC.d.ts.map +1 -0
  93. package/dist/test/resources/tx/exportC.js +21 -0
  94. package/dist/test/resources/tx/importC.d.ts +29 -0
  95. package/dist/test/resources/tx/importC.d.ts.map +1 -0
  96. package/dist/test/resources/tx/importC.js +42 -0
  97. package/dist/test/resources/tx/importP.d.ts +29 -0
  98. package/dist/test/resources/tx/importP.d.ts.map +1 -0
  99. package/dist/test/resources/tx/importP.js +42 -0
  100. package/dist/test/unit/avaxp.d.ts +2 -0
  101. package/dist/test/unit/avaxp.d.ts.map +1 -0
  102. package/dist/test/unit/avaxp.js +732 -0
  103. package/dist/test/unit/lib/exportC2PTxBuilder.d.ts +2 -0
  104. package/dist/test/unit/lib/exportC2PTxBuilder.d.ts.map +1 -0
  105. package/dist/test/unit/lib/exportC2PTxBuilder.js +125 -0
  106. package/dist/test/unit/lib/exportP2CTxBuilder.d.ts +2 -0
  107. package/dist/test/unit/lib/exportP2CTxBuilder.d.ts.map +1 -0
  108. package/dist/test/unit/lib/exportP2CTxBuilder.js +183 -0
  109. package/dist/test/unit/lib/importC2PTxBuilder.d.ts +2 -0
  110. package/dist/test/unit/lib/importC2PTxBuilder.d.ts.map +1 -0
  111. package/dist/test/unit/lib/importC2PTxBuilder.js +99 -0
  112. package/dist/test/unit/lib/importP2CTxBuilder.d.ts +2 -0
  113. package/dist/test/unit/lib/importP2CTxBuilder.d.ts.map +1 -0
  114. package/dist/test/unit/lib/importP2CTxBuilder.js +137 -0
  115. package/dist/test/unit/lib/keyPair.d.ts +2 -0
  116. package/dist/test/unit/lib/keyPair.d.ts.map +1 -0
  117. package/dist/test/unit/lib/keyPair.js +186 -0
  118. package/dist/test/unit/lib/permissionlessValidatorTxBuilder.d.ts +2 -0
  119. package/dist/test/unit/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -0
  120. package/dist/test/unit/lib/permissionlessValidatorTxBuilder.js +341 -0
  121. package/dist/test/unit/lib/signFlowTestSuit.d.ts +20 -0
  122. package/dist/test/unit/lib/signFlowTestSuit.d.ts.map +1 -0
  123. package/dist/test/unit/lib/signFlowTestSuit.js +80 -0
  124. package/dist/test/unit/lib/transactionBuilderFactory.d.ts +2 -0
  125. package/dist/test/unit/lib/transactionBuilderFactory.d.ts.map +1 -0
  126. package/dist/test/unit/lib/transactionBuilderFactory.js +179 -0
  127. package/dist/test/unit/lib/utils.d.ts +2 -0
  128. package/dist/test/unit/lib/utils.d.ts.map +1 -0
  129. package/dist/test/unit/lib/utils.js +83 -0
  130. package/dist/test/unit/lib/utxoEngine.d.ts +2 -0
  131. package/dist/test/unit/lib/utxoEngine.d.ts.map +1 -0
  132. package/dist/test/unit/lib/utxoEngine.js +168 -0
  133. package/dist/test/unit/lib/validateTxBuilder.d.ts +2 -0
  134. package/dist/test/unit/lib/validateTxBuilder.d.ts.map +1 -0
  135. package/dist/test/unit/lib/validateTxBuilder.js +327 -0
  136. package/dist/tsconfig.tsbuildinfo +1 -0
  137. package/package.json +63 -0
@@ -0,0 +1,254 @@
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.Transaction = void 0;
7
+ const avalanchejs_1 = require("@bitgo-forks/avalanchejs");
8
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
9
+ const avalanche_1 = require("avalanche");
10
+ const iface_1 = require("./iface");
11
+ const utils_1 = __importDefault(require("./utils"));
12
+ /**
13
+ * Checks if a signature is empty
14
+ * @param signature
15
+ * @returns {boolean}
16
+ */
17
+ function isEmptySignature(signature) {
18
+ return !!signature && utils_1.default.removeHexPrefix(signature).startsWith(''.padStart(90, '0'));
19
+ }
20
+ function generateSelectorSignature(signatures) {
21
+ if (signatures.length > 1 && signatures.every((sig) => isEmptySignature(sig))) {
22
+ // Look for address.
23
+ return function (sig, address) {
24
+ try {
25
+ if (!isEmptySignature(sig)) {
26
+ return false;
27
+ }
28
+ if (sig.startsWith('0x'))
29
+ sig = sig.substring(2);
30
+ const pub = sig.substring(90);
31
+ return pub === address;
32
+ }
33
+ catch (e) {
34
+ return false;
35
+ }
36
+ };
37
+ }
38
+ else {
39
+ // Look for empty string
40
+ return function (sig, address) {
41
+ return isEmptySignature(sig);
42
+ };
43
+ }
44
+ }
45
+ // end region utils for sign
46
+ class Transaction extends sdk_core_1.BaseTransaction {
47
+ constructor(coinConfig) {
48
+ super(coinConfig);
49
+ this._threshold = 2;
50
+ this._locktime = BigInt(0);
51
+ this._fromAddresses = [];
52
+ this._rewardAddresses = [];
53
+ this._utxos = [];
54
+ this._fee = {};
55
+ this._network = coinConfig.network;
56
+ this._assetId = this._network.avaxAssetID;
57
+ this._blockchainID = this._network.blockchainID;
58
+ this._networkID = this._network.networkID;
59
+ }
60
+ get avaxPTransaction() {
61
+ return this._avaxTransaction.getTx().baseTx;
62
+ }
63
+ get signature() {
64
+ if (this.credentials.length === 0) {
65
+ return [];
66
+ }
67
+ return this.credentials[0].getSignatures().filter((s) => !isEmptySignature(s));
68
+ }
69
+ get credentials() {
70
+ return this._avaxTransaction?.credentials;
71
+ }
72
+ get hasCredentials() {
73
+ return this.credentials !== undefined && this.credentials.length > 0;
74
+ }
75
+ /** @inheritdoc */
76
+ canSign({ key }) {
77
+ // TODO(BG-56700): Improve canSign by check in addresses in empty credentials match signer
78
+ return true;
79
+ }
80
+ /**
81
+ * Sign an avaxp transaction and update the transaction hex
82
+ * @param {KeyPair} keyPair
83
+ */
84
+ async sign(keyPair) {
85
+ const prv = keyPair.getPrivateKey();
86
+ const addressHex = keyPair.getAddressBuffer().toString('hex');
87
+ if (!prv) {
88
+ throw new sdk_core_1.SigningError('Missing private key');
89
+ }
90
+ if (!this.avaxPTransaction) {
91
+ throw new sdk_core_1.InvalidTransactionError('empty transaction to sign');
92
+ }
93
+ if (!this.hasCredentials) {
94
+ throw new sdk_core_1.InvalidTransactionError('empty credentials to sign');
95
+ }
96
+ const unsignedTx = this._avaxTransaction;
97
+ const unsignedBytes = unsignedTx.toBytes();
98
+ const publicKey = avalanchejs_1.secp256k1.getPublicKey(prv);
99
+ if (unsignedTx.hasPubkey(publicKey)) {
100
+ const signature = await avalanchejs_1.secp256k1.sign(unsignedBytes, prv);
101
+ let checkSign = undefined;
102
+ unsignedTx.credentials.forEach((c, index) => {
103
+ if (checkSign === undefined) {
104
+ checkSign = generateSelectorSignature(c.getSignatures());
105
+ }
106
+ let find = false;
107
+ c.getSignatures().forEach((sig, index) => {
108
+ if (checkSign && checkSign(sig, addressHex)) {
109
+ c.setSignature(index, signature);
110
+ find = true;
111
+ }
112
+ });
113
+ if (!find) {
114
+ throw new sdk_core_1.SigningError(`Private key cannot sign the transaction, address hex ${addressHex}, public key: ${publicKey}`);
115
+ }
116
+ });
117
+ }
118
+ }
119
+ toHexString(byteArray) {
120
+ return avalanchejs_1.utils.bufferToHex(byteArray);
121
+ }
122
+ /** @inheritdoc */
123
+ /**
124
+ * should be of signedTx doing this with baseTx
125
+ */
126
+ toBroadcastFormat() {
127
+ if (!this.avaxPTransaction) {
128
+ throw new sdk_core_1.InvalidTransactionError('Empty transaction data');
129
+ }
130
+ return this.toHexString(avalanchejs_1.utils.addChecksum(this._avaxTransaction.getSignedTx().toBytes()));
131
+ }
132
+ // types - stakingTransaction, import, export
133
+ toJson() {
134
+ if (!this.avaxPTransaction) {
135
+ throw new sdk_core_1.InvalidTransactionError('Empty transaction data');
136
+ }
137
+ return {
138
+ id: this.id,
139
+ inputs: this.inputs,
140
+ fromAddresses: this.fromAddresses,
141
+ threshold: this._threshold,
142
+ locktime: this._locktime.toString(),
143
+ type: this.type,
144
+ signatures: this.signature,
145
+ outputs: this.outputs,
146
+ changeOutputs: this.changeOutputs,
147
+ };
148
+ }
149
+ setTransaction(tx) {
150
+ this._avaxTransaction = tx;
151
+ }
152
+ /**
153
+ * Set the transaction type
154
+ *
155
+ * @param {TransactionType} transactionType The transaction type to be set
156
+ */
157
+ setTransactionType(transactionType) {
158
+ if (![sdk_core_1.TransactionType.AddPermissionlessValidator].includes(transactionType)) {
159
+ throw new Error(`Transaction type ${transactionType} is not supported`);
160
+ }
161
+ this._type = transactionType;
162
+ }
163
+ /**
164
+ * Returns the portion of the transaction that needs to be signed in Buffer format.
165
+ * Only needed for coins that support adding signatures directly (e.g. TSS).
166
+ */
167
+ get signablePayload() {
168
+ return utils_1.default.sha256(this._avaxTransaction.toBytes());
169
+ }
170
+ get id() {
171
+ const bufferArray = utils_1.default.sha256(this._avaxTransaction.toBytes());
172
+ return utils_1.default.cb58Encode(avalanche_1.Buffer.from(bufferArray));
173
+ }
174
+ get fromAddresses() {
175
+ return this._fromAddresses.map((a) => avalanchejs_1.utils.format(this._network.alias, this._network.hrp, a));
176
+ }
177
+ get rewardAddresses() {
178
+ return this._rewardAddresses.map((a) => avalanchejs_1.utils.format(this._network.alias, this._network.hrp, a));
179
+ }
180
+ /**
181
+ * Get the list of outputs. Amounts are expressed in absolute value.
182
+ */
183
+ get outputs() {
184
+ switch (this.type) {
185
+ case sdk_core_1.TransactionType.AddPermissionlessValidator:
186
+ return [
187
+ {
188
+ address: this._avaxTransaction.getTx().subnetValidator.validator.nodeId.toString(),
189
+ value: this._avaxTransaction.getTx().subnetValidator.validator.weight.toJSON(),
190
+ },
191
+ ];
192
+ default:
193
+ return [];
194
+ }
195
+ }
196
+ get fee() {
197
+ return { fee: '0', ...this._fee };
198
+ }
199
+ get changeOutputs() {
200
+ return this._avaxTransaction.getTx().baseTx.outputs.map(utils_1.default.mapOutputToEntry(this._network));
201
+ }
202
+ get inputs() {
203
+ let inputs;
204
+ switch (this.type) {
205
+ case sdk_core_1.TransactionType.AddPermissionlessValidator:
206
+ default:
207
+ inputs = this._avaxTransaction.getTx().baseTx
208
+ .inputs;
209
+ break;
210
+ }
211
+ return inputs.map((input) => {
212
+ return {
213
+ id: input.utxoID.txID.toString() + iface_1.INPUT_SEPARATOR + input.utxoID.outputIdx.value(),
214
+ address: this.fromAddresses.sort().join(iface_1.ADDRESS_SEPARATOR),
215
+ value: input.amount().toString(),
216
+ };
217
+ });
218
+ }
219
+ /**
220
+ * Avax wrapper to create signature and return it for credentials
221
+ * @param prv
222
+ * @return hexstring
223
+ */
224
+ createSignature(prv) {
225
+ const signval = utils_1.default.createSignatureAvaxBuffer(this._network, avalanche_1.Buffer.from(this.signablePayload), avalanche_1.Buffer.from(prv));
226
+ return signval.toString('hex');
227
+ }
228
+ /** @inheritdoc */
229
+ explainTransaction() {
230
+ const txJson = this.toJson();
231
+ const displayOrder = ['id', 'inputs', 'outputAmount', 'changeAmount', 'outputs', 'changeOutputs', 'fee', 'type'];
232
+ const outputAmount = txJson.outputs.reduce((p, n) => p.add(new avalanche_1.BN(n.value)), new avalanche_1.BN(0)).toString();
233
+ const changeAmount = txJson.changeOutputs.reduce((p, n) => p.add(new avalanche_1.BN(n.value)), new avalanche_1.BN(0)).toString();
234
+ let rewardAddresses;
235
+ if ([sdk_core_1.TransactionType.AddPermissionlessValidator].includes(txJson.type)) {
236
+ rewardAddresses = this.rewardAddresses;
237
+ displayOrder.splice(6, 0, 'rewardAddresses');
238
+ }
239
+ return {
240
+ displayOrder,
241
+ id: txJson.id,
242
+ inputs: txJson.inputs,
243
+ outputs: txJson.outputs.map((o) => ({ address: o.address, amount: o.value })),
244
+ outputAmount,
245
+ changeOutputs: txJson.changeOutputs.map((o) => ({ address: o.address, amount: o.value })),
246
+ changeAmount,
247
+ rewardAddresses,
248
+ fee: this.fee,
249
+ type: txJson.type,
250
+ };
251
+ }
252
+ }
253
+ exports.Transaction = Transaction;
254
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDBEQUF3SDtBQUN4SCxtREFROEI7QUFFOUIseUNBQXFEO0FBRXJELG1DQUFpSDtBQUVqSCxvREFBNEI7QUFFNUI7Ozs7R0FJRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsU0FBaUI7SUFDekMsT0FBTyxDQUFDLENBQUMsU0FBUyxJQUFJLGVBQUssQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDMUYsQ0FBQztBQU1ELFNBQVMseUJBQXlCLENBQUMsVUFBb0I7SUFDckQsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDOUUsb0JBQW9CO1FBQ3BCLE9BQU8sVUFBVSxHQUFHLEVBQUUsT0FBTztZQUMzQixJQUFJLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQzNCLE9BQU8sS0FBSyxDQUFDO2dCQUNmLENBQUM7Z0JBQ0QsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztvQkFBRSxHQUFHLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDakQsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDOUIsT0FBTyxHQUFHLEtBQUssT0FBTyxDQUFDO1lBQ3pCLENBQUM7WUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNYLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztRQUNILENBQUMsQ0FBQztJQUNKLENBQUM7U0FBTSxDQUFDO1FBQ04sd0JBQXdCO1FBQ3hCLE9BQU8sVUFBVSxHQUFHLEVBQUUsT0FBTztZQUMzQixPQUFPLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLENBQUMsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDO0FBQ0QsNEJBQTRCO0FBRTVCLE1BQWEsV0FBWSxTQUFRLDBCQUFlO0lBcUI5QyxZQUFZLFVBQWdDO1FBQzFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQVhiLGVBQVUsR0FBRyxDQUFDLENBQUM7UUFDZixjQUFTLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLG1CQUFjLEdBQWlCLEVBQUUsQ0FBQztRQUNsQyxxQkFBZ0IsR0FBaUIsRUFBRSxDQUFDO1FBQ3BDLFdBQU0sR0FBcUIsRUFBRSxDQUFDO1FBRTlCLFNBQUksR0FBNEIsRUFBRSxDQUFDO1FBTXhDLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDLE9BQTJCLENBQUM7UUFDdkQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUMxQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDO1FBQ2hELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7SUFDNUMsQ0FBQztJQUVELElBQUksZ0JBQWdCO1FBQ2xCLE9BQVMsSUFBSSxDQUFDLGdCQUErQixDQUFDLEtBQUssRUFBNkMsQ0FBQyxNQUFNLENBQUM7SUFDMUcsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbEMsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFFRCxJQUFJLFdBQVc7UUFDYixPQUFRLElBQUksQ0FBQyxnQkFBK0IsRUFBRSxXQUFXLENBQUM7SUFDNUQsQ0FBQztJQUVELElBQUksY0FBYztRQUNoQixPQUFPLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLE9BQU8sQ0FBQyxFQUFFLEdBQUcsRUFBVztRQUN0QiwyRkFBMkY7UUFDM0YsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFnQjtRQUN6QixNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsYUFBYSxFQUFnQixDQUFDO1FBQ2xELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDVCxNQUFNLElBQUksdUJBQVksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ2hELENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDM0IsTUFBTSxJQUFJLGtDQUF1QixDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDakUsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDekIsTUFBTSxJQUFJLGtDQUF1QixDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDakUsQ0FBQztRQUNELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxnQkFBOEIsQ0FBQztRQUN2RCxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFM0MsTUFBTSxTQUFTLEdBQUcsdUJBQVMsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUMsSUFBSSxVQUFVLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDcEMsTUFBTSxTQUFTLEdBQUcsTUFBTSx1QkFBUyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDM0QsSUFBSSxTQUFTLEdBQStCLFNBQVMsQ0FBQztZQUN0RCxVQUFVLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDMUMsSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQzVCLFNBQVMsR0FBRyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztnQkFDM0QsQ0FBQztnQkFDRCxJQUFJLElBQUksR0FBRyxLQUFLLENBQUM7Z0JBQ2pCLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUU7b0JBQ3ZDLElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQzt3QkFDNUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7d0JBQ2pDLElBQUksR0FBRyxJQUFJLENBQUM7b0JBQ2QsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQztnQkFDSCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ1YsTUFBTSxJQUFJLHVCQUFZLENBQ3BCLHdEQUF3RCxVQUFVLGlCQUFpQixTQUFTLEVBQUUsQ0FDL0YsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVELFdBQVcsQ0FBQyxTQUFxQjtRQUMvQixPQUFPLG1CQUFTLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxrQkFBa0I7SUFDbEI7O09BRUc7SUFDSCxpQkFBaUI7UUFDZixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDM0IsTUFBTSxJQUFJLGtDQUF1QixDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDOUQsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBUyxDQUFDLFdBQVcsQ0FBRSxJQUFJLENBQUMsZ0JBQStCLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hILENBQUM7SUFFRCw2Q0FBNkM7SUFDN0MsTUFBTTtRQUNKLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMzQixNQUFNLElBQUksa0NBQXVCLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBQ0QsT0FBTztZQUNMLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRTtZQUNYLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7WUFDakMsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzFCLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRTtZQUNuQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixVQUFVLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDMUIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtTQUNsQyxDQUFDO0lBQ0osQ0FBQztJQUVELGNBQWMsQ0FBQyxFQUFNO1FBQ25CLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxrQkFBa0IsQ0FBQyxlQUFnQztRQUNqRCxJQUFJLENBQUMsQ0FBQywwQkFBZSxDQUFDLDBCQUEwQixDQUFDLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7WUFDNUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsZUFBZSxtQkFBbUIsQ0FBQyxDQUFDO1FBQzFFLENBQUM7UUFDRCxJQUFJLENBQUMsS0FBSyxHQUFHLGVBQWUsQ0FBQztJQUMvQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBSSxlQUFlO1FBQ2pCLE9BQU8sZUFBSyxDQUFDLE1BQU0sQ0FBRSxJQUFJLENBQUMsZ0JBQStCLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQsSUFBSSxFQUFFO1FBQ0osTUFBTSxXQUFXLEdBQUcsZUFBSyxDQUFDLE1BQU0sQ0FBRSxJQUFJLENBQUMsZ0JBQStCLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNsRixPQUFPLGVBQUssQ0FBQyxVQUFVLENBQUMsa0JBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsbUJBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRyxDQUFDO0lBRUQsSUFBSSxlQUFlO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsbUJBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2RyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLE9BQU87UUFDVCxRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsQixLQUFLLDBCQUFlLENBQUMsMEJBQTBCO2dCQUM3QyxPQUFPO29CQUNMO3dCQUNFLE9BQU8sRUFDSixJQUFJLENBQUMsZ0JBQStCLENBQUMsS0FBSyxFQUM1QyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRTt3QkFDN0MsS0FBSyxFQUNGLElBQUksQ0FBQyxnQkFBK0IsQ0FBQyxLQUFLLEVBQzVDLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFO3FCQUM1QztpQkFDRixDQUFDO1lBQ0o7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksR0FBRztRQUNMLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDZixPQUFTLElBQUksQ0FBQyxnQkFBK0IsQ0FBQyxLQUFLLEVBQTZDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQ2pILGVBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQ3RDLENBQUM7SUFDSixDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ1IsSUFBSSxNQUFNLENBQUM7UUFDWCxRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsQixLQUFLLDBCQUFlLENBQUMsMEJBQTBCLENBQUM7WUFDaEQ7Z0JBQ0UsTUFBTSxHQUFLLElBQUksQ0FBQyxnQkFBK0IsQ0FBQyxLQUFLLEVBQTZDLENBQUMsTUFBTTtxQkFDdEcsTUFBTSxDQUFDO2dCQUNWLE1BQU07UUFDVixDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDMUIsT0FBTztnQkFDTCxFQUFFLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsdUJBQWUsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUU7Z0JBQ25GLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyx5QkFBaUIsQ0FBQztnQkFDMUQsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7YUFDakMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxlQUFlLENBQUMsR0FBVztRQUN6QixNQUFNLE9BQU8sR0FBRyxlQUFLLENBQUMseUJBQXlCLENBQzdDLElBQUksQ0FBQyxRQUFRLEVBQ2Isa0JBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUNyQyxrQkFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FDckIsQ0FBQztRQUNGLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGtCQUFrQjtRQUNoQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDN0IsTUFBTSxZQUFZLEdBQUcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFakgsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksY0FBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksY0FBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbkcsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksY0FBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksY0FBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFekcsSUFBSSxlQUFlLENBQUM7UUFDcEIsSUFBSSxDQUFDLDBCQUFlLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDdkUsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7WUFDdkMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUVELE9BQU87WUFDTCxZQUFZO1lBQ1osRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFO1lBQ2IsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1lBQ3JCLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUM3RSxZQUFZO1lBQ1osYUFBYSxFQUFFLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ3pGLFlBQVk7WUFDWixlQUFlO1lBQ2YsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO1lBQ2IsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO1NBQ2xCLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFqUUQsa0NBaVFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXZheFNlcmlhbCwgdXRpbHMgYXMgYXZheFV0aWxzLCBDcmVkZW50aWFsLCBwdm1TZXJpYWwsIHNlY3AyNTZrMSwgVW5zaWduZWRUeCB9IGZyb20gJ0BiaXRnby1mb3Jrcy9hdmFsYW5jaGVqcyc7XG5pbXBvcnQge1xuICBCYXNlS2V5LFxuICBCYXNlVHJhbnNhY3Rpb24sXG4gIEVudHJ5LFxuICBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcixcbiAgU2lnbmluZ0Vycm9yLFxuICBUcmFuc2FjdGlvbkZlZSxcbiAgVHJhbnNhY3Rpb25UeXBlLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBBdmFsYW5jaGVOZXR3b3JrLCBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBCTiwgQnVmZmVyIGFzIEJ1ZmZlckF2YXggfSBmcm9tICdhdmFsYW5jaGUnO1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnYnVmZmVyJztcbmltcG9ydCB7IEFERFJFU1NfU0VQQVJBVE9SLCBEZWNvZGVkVXR4b09iaiwgSU5QVVRfU0VQQVJBVE9SLCBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLCBUeCwgVHhEYXRhIH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgeyBLZXlQYWlyIH0gZnJvbSAnLi9rZXlQYWlyJztcbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBzaWduYXR1cmUgaXMgZW1wdHlcbiAqIEBwYXJhbSBzaWduYXR1cmVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc0VtcHR5U2lnbmF0dXJlKHNpZ25hdHVyZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIXNpZ25hdHVyZSAmJiB1dGlscy5yZW1vdmVIZXhQcmVmaXgoc2lnbmF0dXJlKS5zdGFydHNXaXRoKCcnLnBhZFN0YXJ0KDkwLCAnMCcpKTtcbn1cblxuaW50ZXJmYWNlIENoZWNrU2lnbmF0dXJlIHtcbiAgKHNpZ2F0dXJlOiBzdHJpbmcsIGFkZHJlc3NIZXg6IHN0cmluZyk6IGJvb2xlYW47XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlU2VsZWN0b3JTaWduYXR1cmUoc2lnbmF0dXJlczogc3RyaW5nW10pOiBDaGVja1NpZ25hdHVyZSB7XG4gIGlmIChzaWduYXR1cmVzLmxlbmd0aCA+IDEgJiYgc2lnbmF0dXJlcy5ldmVyeSgoc2lnKSA9PiBpc0VtcHR5U2lnbmF0dXJlKHNpZykpKSB7XG4gICAgLy8gTG9vayBmb3IgYWRkcmVzcy5cbiAgICByZXR1cm4gZnVuY3Rpb24gKHNpZywgYWRkcmVzcyk6IGJvb2xlYW4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFpc0VtcHR5U2lnbmF0dXJlKHNpZykpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpZy5zdGFydHNXaXRoKCcweCcpKSBzaWcgPSBzaWcuc3Vic3RyaW5nKDIpO1xuICAgICAgICBjb25zdCBwdWIgPSBzaWcuc3Vic3RyaW5nKDkwKTtcbiAgICAgICAgcmV0dXJuIHB1YiA9PT0gYWRkcmVzcztcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgLy8gTG9vayBmb3IgZW1wdHkgc3RyaW5nXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzaWcsIGFkZHJlc3MpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBpc0VtcHR5U2lnbmF0dXJlKHNpZyk7XG4gICAgfTtcbiAgfVxufVxuLy8gZW5kIHJlZ2lvbiB1dGlscyBmb3Igc2lnblxuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb24gZXh0ZW5kcyBCYXNlVHJhbnNhY3Rpb24ge1xuICBwcm90ZWN0ZWQgX2F2YXhUcmFuc2FjdGlvbjogVHg7XG4gIHB1YmxpYyBfdHlwZTogVHJhbnNhY3Rpb25UeXBlO1xuICBwdWJsaWMgX25ldHdvcms6IEF2YWxhbmNoZU5ldHdvcms7XG4gIHB1YmxpYyBfbmV0d29ya0lEOiBudW1iZXI7XG4gIHB1YmxpYyBfYXNzZXRJZDogc3RyaW5nO1xuICBwdWJsaWMgX2Jsb2NrY2hhaW5JRDogc3RyaW5nO1xuICBwdWJsaWMgX25vZGVJRDogc3RyaW5nO1xuICBwdWJsaWMgX3N0YXJ0VGltZTogYmlnaW50O1xuICBwdWJsaWMgX2VuZFRpbWU6IGJpZ2ludDtcbiAgcHVibGljIF9zdGFrZUFtb3VudDogYmlnaW50O1xuICBwdWJsaWMgX3RocmVzaG9sZCA9IDI7XG4gIHB1YmxpYyBfbG9ja3RpbWUgPSBCaWdJbnQoMCk7XG4gIHB1YmxpYyBfZnJvbUFkZHJlc3NlczogVWludDhBcnJheVtdID0gW107XG4gIHB1YmxpYyBfcmV3YXJkQWRkcmVzc2VzOiBCdWZmZXJBdmF4W10gPSBbXTtcbiAgcHVibGljIF91dHhvczogRGVjb2RlZFV0eG9PYmpbXSA9IFtdO1xuICBwdWJsaWMgX3RvOiBCdWZmZXJBdmF4W107XG4gIHB1YmxpYyBfZmVlOiBQYXJ0aWFsPFRyYW5zYWN0aW9uRmVlPiA9IHt9O1xuICBwdWJsaWMgX2Jsc1B1YmxpY0tleTogc3RyaW5nO1xuICBwdWJsaWMgX2Jsc1NpZ25hdHVyZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGNvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoY29pbkNvbmZpZyk7XG4gICAgdGhpcy5fbmV0d29yayA9IGNvaW5Db25maWcubmV0d29yayBhcyBBdmFsYW5jaGVOZXR3b3JrO1xuICAgIHRoaXMuX2Fzc2V0SWQgPSB0aGlzLl9uZXR3b3JrLmF2YXhBc3NldElEO1xuICAgIHRoaXMuX2Jsb2NrY2hhaW5JRCA9IHRoaXMuX25ldHdvcmsuYmxvY2tjaGFpbklEO1xuICAgIHRoaXMuX25ldHdvcmtJRCA9IHRoaXMuX25ldHdvcmsubmV0d29ya0lEO1xuICB9XG5cbiAgZ2V0IGF2YXhQVHJhbnNhY3Rpb24oKTogYXZheFNlcmlhbC5CYXNlVHgge1xuICAgIHJldHVybiAoKHRoaXMuX2F2YXhUcmFuc2FjdGlvbiBhcyBVbnNpZ25lZFR4KS5nZXRUeCgpIGFzIHB2bVNlcmlhbC5BZGRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvclR4KS5iYXNlVHg7XG4gIH1cblxuICBnZXQgc2lnbmF0dXJlKCk6IHN0cmluZ1tdIHtcbiAgICBpZiAodGhpcy5jcmVkZW50aWFscy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY3JlZGVudGlhbHNbMF0uZ2V0U2lnbmF0dXJlcygpLmZpbHRlcigocykgPT4gIWlzRW1wdHlTaWduYXR1cmUocykpO1xuICB9XG5cbiAgZ2V0IGNyZWRlbnRpYWxzKCk6IENyZWRlbnRpYWxbXSB7XG4gICAgcmV0dXJuICh0aGlzLl9hdmF4VHJhbnNhY3Rpb24gYXMgVW5zaWduZWRUeCk/LmNyZWRlbnRpYWxzO1xuICB9XG5cbiAgZ2V0IGhhc0NyZWRlbnRpYWxzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNyZWRlbnRpYWxzICE9PSB1bmRlZmluZWQgJiYgdGhpcy5jcmVkZW50aWFscy5sZW5ndGggPiAwO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGNhblNpZ24oeyBrZXkgfTogQmFzZUtleSk6IGJvb2xlYW4ge1xuICAgIC8vIFRPRE8oQkctNTY3MDApOiAgSW1wcm92ZSBjYW5TaWduIGJ5IGNoZWNrIGluIGFkZHJlc3NlcyBpbiBlbXB0eSBjcmVkZW50aWFscyBtYXRjaCBzaWduZXJcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIGFuIGF2YXhwIHRyYW5zYWN0aW9uIGFuZCB1cGRhdGUgdGhlIHRyYW5zYWN0aW9uIGhleFxuICAgKiBAcGFyYW0ge0tleVBhaXJ9IGtleVBhaXJcbiAgICovXG4gIGFzeW5jIHNpZ24oa2V5UGFpcjogS2V5UGFpcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBydiA9IGtleVBhaXIuZ2V0UHJpdmF0ZUtleSgpIGFzIFVpbnQ4QXJyYXk7XG4gICAgY29uc3QgYWRkcmVzc0hleCA9IGtleVBhaXIuZ2V0QWRkcmVzc0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBpZiAoIXBydikge1xuICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignTWlzc2luZyBwcml2YXRlIGtleScpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuYXZheFBUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdlbXB0eSB0cmFuc2FjdGlvbiB0byBzaWduJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5oYXNDcmVkZW50aWFscykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdlbXB0eSBjcmVkZW50aWFscyB0byBzaWduJyk7XG4gICAgfVxuICAgIGNvbnN0IHVuc2lnbmVkVHggPSB0aGlzLl9hdmF4VHJhbnNhY3Rpb24gYXMgVW5zaWduZWRUeDtcbiAgICBjb25zdCB1bnNpZ25lZEJ5dGVzID0gdW5zaWduZWRUeC50b0J5dGVzKCk7XG5cbiAgICBjb25zdCBwdWJsaWNLZXkgPSBzZWNwMjU2azEuZ2V0UHVibGljS2V5KHBydik7XG4gICAgaWYgKHVuc2lnbmVkVHguaGFzUHVia2V5KHB1YmxpY0tleSkpIHtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGF3YWl0IHNlY3AyNTZrMS5zaWduKHVuc2lnbmVkQnl0ZXMsIHBydik7XG4gICAgICBsZXQgY2hlY2tTaWduOiBDaGVja1NpZ25hdHVyZSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAgIHVuc2lnbmVkVHguY3JlZGVudGlhbHMuZm9yRWFjaCgoYywgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKGNoZWNrU2lnbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY2hlY2tTaWduID0gZ2VuZXJhdGVTZWxlY3RvclNpZ25hdHVyZShjLmdldFNpZ25hdHVyZXMoKSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZpbmQgPSBmYWxzZTtcbiAgICAgICAgYy5nZXRTaWduYXR1cmVzKCkuZm9yRWFjaCgoc2lnLCBpbmRleCkgPT4ge1xuICAgICAgICAgIGlmIChjaGVja1NpZ24gJiYgY2hlY2tTaWduKHNpZywgYWRkcmVzc0hleCkpIHtcbiAgICAgICAgICAgIGMuc2V0U2lnbmF0dXJlKGluZGV4LCBzaWduYXR1cmUpO1xuICAgICAgICAgICAgZmluZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFmaW5kKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcihcbiAgICAgICAgICAgIGBQcml2YXRlIGtleSBjYW5ub3Qgc2lnbiB0aGUgdHJhbnNhY3Rpb24sIGFkZHJlc3MgaGV4ICR7YWRkcmVzc0hleH0sIHB1YmxpYyBrZXk6ICR7cHVibGljS2V5fWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB0b0hleFN0cmluZyhieXRlQXJyYXk6IFVpbnQ4QXJyYXkpOiBzdHJpbmcge1xuICAgIHJldHVybiBhdmF4VXRpbHMuYnVmZmVyVG9IZXgoYnl0ZUFycmF5KTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICAvKipcbiAgICogc2hvdWxkIGJlIG9mIHNpZ25lZFR4IGRvaW5nIHRoaXMgd2l0aCBiYXNlVHhcbiAgICovXG4gIHRvQnJvYWRjYXN0Rm9ybWF0KCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmF2YXhQVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24gZGF0YScpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50b0hleFN0cmluZyhhdmF4VXRpbHMuYWRkQ2hlY2tzdW0oKHRoaXMuX2F2YXhUcmFuc2FjdGlvbiBhcyBVbnNpZ25lZFR4KS5nZXRTaWduZWRUeCgpLnRvQnl0ZXMoKSkpO1xuICB9XG5cbiAgLy8gdHlwZXMgLSBzdGFraW5nVHJhbnNhY3Rpb24sIGltcG9ydCwgZXhwb3J0XG4gIHRvSnNvbigpOiBUeERhdGEge1xuICAgIGlmICghdGhpcy5hdmF4UFRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0VtcHR5IHRyYW5zYWN0aW9uIGRhdGEnKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgaW5wdXRzOiB0aGlzLmlucHV0cyxcbiAgICAgIGZyb21BZGRyZXNzZXM6IHRoaXMuZnJvbUFkZHJlc3NlcyxcbiAgICAgIHRocmVzaG9sZDogdGhpcy5fdGhyZXNob2xkLFxuICAgICAgbG9ja3RpbWU6IHRoaXMuX2xvY2t0aW1lLnRvU3RyaW5nKCksXG4gICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICBzaWduYXR1cmVzOiB0aGlzLnNpZ25hdHVyZSxcbiAgICAgIG91dHB1dHM6IHRoaXMub3V0cHV0cyxcbiAgICAgIGNoYW5nZU91dHB1dHM6IHRoaXMuY2hhbmdlT3V0cHV0cyxcbiAgICB9O1xuICB9XG5cbiAgc2V0VHJhbnNhY3Rpb24odHg6IFR4KTogdm9pZCB7XG4gICAgdGhpcy5fYXZheFRyYW5zYWN0aW9uID0gdHg7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB0cmFuc2FjdGlvbiB0eXBlXG4gICAqXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25UeXBlfSB0cmFuc2FjdGlvblR5cGUgVGhlIHRyYW5zYWN0aW9uIHR5cGUgdG8gYmUgc2V0XG4gICAqL1xuICBzZXRUcmFuc2FjdGlvblR5cGUodHJhbnNhY3Rpb25UeXBlOiBUcmFuc2FjdGlvblR5cGUpOiB2b2lkIHtcbiAgICBpZiAoIVtUcmFuc2FjdGlvblR5cGUuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3JdLmluY2x1ZGVzKHRyYW5zYWN0aW9uVHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVHJhbnNhY3Rpb24gdHlwZSAke3RyYW5zYWN0aW9uVHlwZX0gaXMgbm90IHN1cHBvcnRlZGApO1xuICAgIH1cbiAgICB0aGlzLl90eXBlID0gdHJhbnNhY3Rpb25UeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHBvcnRpb24gb2YgdGhlIHRyYW5zYWN0aW9uIHRoYXQgbmVlZHMgdG8gYmUgc2lnbmVkIGluIEJ1ZmZlciBmb3JtYXQuXG4gICAqIE9ubHkgbmVlZGVkIGZvciBjb2lucyB0aGF0IHN1cHBvcnQgYWRkaW5nIHNpZ25hdHVyZXMgZGlyZWN0bHkgKGUuZy4gVFNTKS5cbiAgICovXG4gIGdldCBzaWduYWJsZVBheWxvYWQoKTogQnVmZmVyIHtcbiAgICByZXR1cm4gdXRpbHMuc2hhMjU2KCh0aGlzLl9hdmF4VHJhbnNhY3Rpb24gYXMgVW5zaWduZWRUeCkudG9CeXRlcygpKTtcbiAgfVxuXG4gIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGJ1ZmZlckFycmF5ID0gdXRpbHMuc2hhMjU2KCh0aGlzLl9hdmF4VHJhbnNhY3Rpb24gYXMgVW5zaWduZWRUeCkudG9CeXRlcygpKTtcbiAgICByZXR1cm4gdXRpbHMuY2I1OEVuY29kZShCdWZmZXJBdmF4LmZyb20oYnVmZmVyQXJyYXkpKTtcbiAgfVxuXG4gIGdldCBmcm9tQWRkcmVzc2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fZnJvbUFkZHJlc3Nlcy5tYXAoKGEpID0+IGF2YXhVdGlscy5mb3JtYXQodGhpcy5fbmV0d29yay5hbGlhcywgdGhpcy5fbmV0d29yay5ocnAsIGEpKTtcbiAgfVxuXG4gIGdldCByZXdhcmRBZGRyZXNzZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9yZXdhcmRBZGRyZXNzZXMubWFwKChhKSA9PiBhdmF4VXRpbHMuZm9ybWF0KHRoaXMuX25ldHdvcmsuYWxpYXMsIHRoaXMuX25ldHdvcmsuaHJwLCBhKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsaXN0IG9mIG91dHB1dHMuIEFtb3VudHMgYXJlIGV4cHJlc3NlZCBpbiBhYnNvbHV0ZSB2YWx1ZS5cbiAgICovXG4gIGdldCBvdXRwdXRzKCk6IEVudHJ5W10ge1xuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5BZGRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvcjpcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiAoXG4gICAgICAgICAgICAgICh0aGlzLl9hdmF4VHJhbnNhY3Rpb24gYXMgVW5zaWduZWRUeCkuZ2V0VHgoKSBhcyBwdm1TZXJpYWwuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeFxuICAgICAgICAgICAgKS5zdWJuZXRWYWxpZGF0b3IudmFsaWRhdG9yLm5vZGVJZC50b1N0cmluZygpLFxuICAgICAgICAgICAgdmFsdWU6IChcbiAgICAgICAgICAgICAgKHRoaXMuX2F2YXhUcmFuc2FjdGlvbiBhcyBVbnNpZ25lZFR4KS5nZXRUeCgpIGFzIHB2bVNlcmlhbC5BZGRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvclR4XG4gICAgICAgICAgICApLnN1Ym5ldFZhbGlkYXRvci52YWxpZGF0b3Iud2VpZ2h0LnRvSlNPTigpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgZ2V0IGZlZSgpOiBUcmFuc2FjdGlvbkZlZSB7XG4gICAgcmV0dXJuIHsgZmVlOiAnMCcsIC4uLnRoaXMuX2ZlZSB9O1xuICB9XG5cbiAgZ2V0IGNoYW5nZU91dHB1dHMoKTogRW50cnlbXSB7XG4gICAgcmV0dXJuICgodGhpcy5fYXZheFRyYW5zYWN0aW9uIGFzIFVuc2lnbmVkVHgpLmdldFR4KCkgYXMgcHZtU2VyaWFsLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHgpLmJhc2VUeC5vdXRwdXRzLm1hcChcbiAgICAgIHV0aWxzLm1hcE91dHB1dFRvRW50cnkodGhpcy5fbmV0d29yaylcbiAgICApO1xuICB9XG5cbiAgZ2V0IGlucHV0cygpOiBFbnRyeVtdIHtcbiAgICBsZXQgaW5wdXRzO1xuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5BZGRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvcjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlucHV0cyA9ICgodGhpcy5fYXZheFRyYW5zYWN0aW9uIGFzIFVuc2lnbmVkVHgpLmdldFR4KCkgYXMgcHZtU2VyaWFsLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHgpLmJhc2VUeFxuICAgICAgICAgIC5pbnB1dHM7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gaW5wdXRzLm1hcCgoaW5wdXQpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBpbnB1dC51dHhvSUQudHhJRC50b1N0cmluZygpICsgSU5QVVRfU0VQQVJBVE9SICsgaW5wdXQudXR4b0lELm91dHB1dElkeC52YWx1ZSgpLFxuICAgICAgICBhZGRyZXNzOiB0aGlzLmZyb21BZGRyZXNzZXMuc29ydCgpLmpvaW4oQUREUkVTU19TRVBBUkFUT1IpLFxuICAgICAgICB2YWx1ZTogaW5wdXQuYW1vdW50KCkudG9TdHJpbmcoKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQXZheCB3cmFwcGVyIHRvIGNyZWF0ZSBzaWduYXR1cmUgYW5kIHJldHVybiBpdCBmb3IgY3JlZGVudGlhbHNcbiAgICogQHBhcmFtIHBydlxuICAgKiBAcmV0dXJuIGhleHN0cmluZ1xuICAgKi9cbiAgY3JlYXRlU2lnbmF0dXJlKHBydjogQnVmZmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBzaWdudmFsID0gdXRpbHMuY3JlYXRlU2lnbmF0dXJlQXZheEJ1ZmZlcihcbiAgICAgIHRoaXMuX25ldHdvcmssXG4gICAgICBCdWZmZXJBdmF4LmZyb20odGhpcy5zaWduYWJsZVBheWxvYWQpLFxuICAgICAgQnVmZmVyQXZheC5mcm9tKHBydilcbiAgICApO1xuICAgIHJldHVybiBzaWdudmFsLnRvU3RyaW5nKCdoZXgnKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBleHBsYWluVHJhbnNhY3Rpb24oKTogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gICAgY29uc3QgdHhKc29uID0gdGhpcy50b0pzb24oKTtcbiAgICBjb25zdCBkaXNwbGF5T3JkZXIgPSBbJ2lkJywgJ2lucHV0cycsICdvdXRwdXRBbW91bnQnLCAnY2hhbmdlQW1vdW50JywgJ291dHB1dHMnLCAnY2hhbmdlT3V0cHV0cycsICdmZWUnLCAndHlwZSddO1xuXG4gICAgY29uc3Qgb3V0cHV0QW1vdW50ID0gdHhKc29uLm91dHB1dHMucmVkdWNlKChwLCBuKSA9PiBwLmFkZChuZXcgQk4obi52YWx1ZSkpLCBuZXcgQk4oMCkpLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgY2hhbmdlQW1vdW50ID0gdHhKc29uLmNoYW5nZU91dHB1dHMucmVkdWNlKChwLCBuKSA9PiBwLmFkZChuZXcgQk4obi52YWx1ZSkpLCBuZXcgQk4oMCkpLnRvU3RyaW5nKCk7XG5cbiAgICBsZXQgcmV3YXJkQWRkcmVzc2VzO1xuICAgIGlmIChbVHJhbnNhY3Rpb25UeXBlLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yXS5pbmNsdWRlcyh0eEpzb24udHlwZSkpIHtcbiAgICAgIHJld2FyZEFkZHJlc3NlcyA9IHRoaXMucmV3YXJkQWRkcmVzc2VzO1xuICAgICAgZGlzcGxheU9yZGVyLnNwbGljZSg2LCAwLCAncmV3YXJkQWRkcmVzc2VzJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc3BsYXlPcmRlcixcbiAgICAgIGlkOiB0eEpzb24uaWQsXG4gICAgICBpbnB1dHM6IHR4SnNvbi5pbnB1dHMsXG4gICAgICBvdXRwdXRzOiB0eEpzb24ub3V0cHV0cy5tYXAoKG8pID0+ICh7IGFkZHJlc3M6IG8uYWRkcmVzcywgYW1vdW50OiBvLnZhbHVlIH0pKSxcbiAgICAgIG91dHB1dEFtb3VudCxcbiAgICAgIGNoYW5nZU91dHB1dHM6IHR4SnNvbi5jaGFuZ2VPdXRwdXRzLm1hcCgobykgPT4gKHsgYWRkcmVzczogby5hZGRyZXNzLCBhbW91bnQ6IG8udmFsdWUgfSkpLFxuICAgICAgY2hhbmdlQW1vdW50LFxuICAgICAgcmV3YXJkQWRkcmVzc2VzLFxuICAgICAgZmVlOiB0aGlzLmZlZSxcbiAgICAgIHR5cGU6IHR4SnNvbi50eXBlLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,71 @@
1
+ import { BaseTransactionBuilder } from '@bitgo-beta/sdk-core';
2
+ import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
3
+ import { DecodedUtxoObj, Tx } from './iface';
4
+ import { KeyPair } from './keyPair';
5
+ import { Transaction } from './transaction';
6
+ export declare abstract class TransactionBuilder extends BaseTransactionBuilder {
7
+ protected _transaction: Transaction;
8
+ protected recoverSigner: boolean;
9
+ _signer: KeyPair[];
10
+ constructor(_coinConfig: Readonly<CoinConfig>);
11
+ /**
12
+ * Initialize the transaction builder fields using the decoded transaction data
13
+ *
14
+ * @param {Transaction} tx the transaction data
15
+ * @returns itself
16
+ */
17
+ initBuilder(tx: Tx): this;
18
+ /**
19
+ * Validates the threshold
20
+ * @param threshold
21
+ */
22
+ validateThreshold(threshold: number): void;
23
+ /**
24
+ * Check the UTXO has expected fields.
25
+ * @param UTXO
26
+ */
27
+ validateUtxo(value: DecodedUtxoObj): void;
28
+ /**
29
+ * Check the list of UTXOS is empty and check each UTXO.
30
+ * @param values
31
+ */
32
+ validateUtxos(values: DecodedUtxoObj[]): void;
33
+ /**
34
+ * Validates locktime
35
+ * @param locktime
36
+ */
37
+ validateLocktime(locktime: bigint): void;
38
+ /**
39
+ * Threshold is an int that names the number of unique signatures required to spend the output.
40
+ * Must be less than or equal to the length of Addresses.
41
+ * @param {number} value
42
+ */
43
+ threshold(value: number): this;
44
+ /**
45
+ * Locktime is a long that contains the unix timestamp that this output can be spent after.
46
+ * The unix timestamp is specific to the second.
47
+ * @param value
48
+ */
49
+ locktime(value: string | number): this;
50
+ /**
51
+ * When using recovery key must be set here
52
+ * TODO: STLX-17317 recovery key signing
53
+ * @param {boolean}[recoverSigner=true] whether it's recovery signer
54
+ */
55
+ recoverMode(recoverSigner?: boolean): this;
56
+ /**
57
+ * fromPubKey is a list of unique addresses that correspond to the private keys that can be used to spend this output
58
+ * @param {string | string[]} senderPubKey
59
+ */
60
+ fromPubKey(senderPubKey: string | string[]): this;
61
+ /**
62
+ * List of UTXO required as inputs.
63
+ * A UTXO is a standalone representation of a transaction output.
64
+ *
65
+ * @param {DecodedUtxoObj[]} list of UTXOS
66
+ */
67
+ utxos(value: DecodedUtxoObj[]): this;
68
+ /** @inheritdoc */
69
+ protected fromImplementation(rawTransaction: string): Transaction;
70
+ }
71
+ //# sourceMappingURL=transactionBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactionBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/transactionBuilder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAyB,MAAM,sBAAsB,CAAC;AACrF,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,8BAAsB,kBAAmB,SAAQ,sBAAsB;IACrE,SAAS,CAAC,YAAY,EAAE,WAAW,CAAC;IACpC,SAAS,CAAC,aAAa,UAAS;IACzB,OAAO,EAAE,OAAO,EAAE,CAAM;gBAEnB,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAK7C;;;;;OAKG;IACH,WAAW,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI;IAazB;;;OAGG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAM1C;;;OAGG;IACH,YAAY,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAMzC;;;OAGG;IACH,aAAa,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI;IAO7C;;;OAGG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAOxC;;;;OAIG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAM9B;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAMtC;;;;OAIG;IACH,WAAW,CAAC,aAAa,UAAO,GAAG,IAAI;IAKvC;;;OAGG;IACH,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IAMjD;;;;;OAKG;IACH,KAAK,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,IAAI;IAcpC,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,WAAW;CASlE"}
@@ -0,0 +1,138 @@
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.TransactionBuilder = void 0;
7
+ const avalanchejs_1 = require("@bitgo-forks/avalanchejs");
8
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
9
+ const transaction_1 = require("./transaction");
10
+ const utils_1 = __importDefault(require("./utils"));
11
+ class TransactionBuilder extends sdk_core_1.BaseTransactionBuilder {
12
+ constructor(_coinConfig) {
13
+ super(_coinConfig);
14
+ this.recoverSigner = false;
15
+ this._signer = [];
16
+ this._transaction = new transaction_1.Transaction(_coinConfig);
17
+ }
18
+ /**
19
+ * Initialize the transaction builder fields using the decoded transaction data
20
+ *
21
+ * @param {Transaction} tx the transaction data
22
+ * @returns itself
23
+ */
24
+ initBuilder(tx) {
25
+ const baseTx = tx.tx.baseTx;
26
+ if (baseTx.NetworkId.value() !== this._transaction._networkID ||
27
+ baseTx.BlockchainId.value() !== this._transaction._blockchainID) {
28
+ throw new Error('Network or blockchain is not equals');
29
+ }
30
+ this._transaction.setTransaction(tx);
31
+ return this;
32
+ }
33
+ // region Validators
34
+ /**
35
+ * Validates the threshold
36
+ * @param threshold
37
+ */
38
+ validateThreshold(threshold) {
39
+ if (!threshold || threshold !== 2) {
40
+ throw new sdk_core_1.BuildTransactionError('Invalid transaction: threshold must be set to 2');
41
+ }
42
+ }
43
+ /**
44
+ * Check the UTXO has expected fields.
45
+ * @param UTXO
46
+ */
47
+ validateUtxo(value) {
48
+ ['outputID', 'amount', 'txid', 'outputidx'].forEach((field) => {
49
+ if (!value.hasOwnProperty(field))
50
+ throw new sdk_core_1.BuildTransactionError(`Utxos required ${field}`);
51
+ });
52
+ }
53
+ /**
54
+ * Check the list of UTXOS is empty and check each UTXO.
55
+ * @param values
56
+ */
57
+ validateUtxos(values) {
58
+ if (values.length === 0) {
59
+ throw new sdk_core_1.BuildTransactionError("Utxos can't be empty array");
60
+ }
61
+ values.forEach(this.validateUtxo);
62
+ }
63
+ /**
64
+ * Validates locktime
65
+ * @param locktime
66
+ */
67
+ validateLocktime(locktime) {
68
+ if (!locktime || locktime < BigInt(0)) {
69
+ throw new sdk_core_1.BuildTransactionError('Invalid transaction: locktime must be 0 or higher');
70
+ }
71
+ }
72
+ // endregion
73
+ /**
74
+ * Threshold is an int that names the number of unique signatures required to spend the output.
75
+ * Must be less than or equal to the length of Addresses.
76
+ * @param {number} value
77
+ */
78
+ threshold(value) {
79
+ this.validateThreshold(value);
80
+ this._transaction._threshold = value;
81
+ return this;
82
+ }
83
+ /**
84
+ * Locktime is a long that contains the unix timestamp that this output can be spent after.
85
+ * The unix timestamp is specific to the second.
86
+ * @param value
87
+ */
88
+ locktime(value) {
89
+ this.validateLocktime(BigInt(value));
90
+ this._transaction._locktime = BigInt(value);
91
+ return this;
92
+ }
93
+ /**
94
+ * When using recovery key must be set here
95
+ * TODO: STLX-17317 recovery key signing
96
+ * @param {boolean}[recoverSigner=true] whether it's recovery signer
97
+ */
98
+ recoverMode(recoverSigner = true) {
99
+ this.recoverSigner = recoverSigner;
100
+ return this;
101
+ }
102
+ /**
103
+ * fromPubKey is a list of unique addresses that correspond to the private keys that can be used to spend this output
104
+ * @param {string | string[]} senderPubKey
105
+ */
106
+ fromPubKey(senderPubKey) {
107
+ const pubKeys = senderPubKey instanceof Array ? senderPubKey : [senderPubKey];
108
+ this._transaction._fromAddresses = pubKeys.map(utils_1.default.parseAddress);
109
+ return this;
110
+ }
111
+ /**
112
+ * List of UTXO required as inputs.
113
+ * A UTXO is a standalone representation of a transaction output.
114
+ *
115
+ * @param {DecodedUtxoObj[]} list of UTXOS
116
+ */
117
+ utxos(value) {
118
+ this.validateUtxos(value);
119
+ this._transaction._utxos = value;
120
+ return this;
121
+ }
122
+ // TODO(CR-1073):
123
+ // Implement:
124
+ // buildImplementation
125
+ // signImplementation
126
+ // get transaction
127
+ // set transaction
128
+ // validateRawTransaction
129
+ /** @inheritdoc */
130
+ fromImplementation(rawTransaction) {
131
+ const [tx] = avalanchejs_1.pvmSerial.AddPermissionlessValidatorTx.fromBytes(Buffer.from(rawTransaction, 'hex'), avalanchejs_1.avmSerial.getAVMManager().getDefaultCodec());
132
+ // TODO(CR-1073): check if initBuilder can only use UnsignedTx and pvmSerial.BaseTx is not required
133
+ this.initBuilder(tx);
134
+ return this._transaction;
135
+ }
136
+ }
137
+ exports.TransactionBuilder = TransactionBuilder;
138
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90cmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsMERBQTRFO0FBQzVFLG1EQUFxRjtBQUlyRiwrQ0FBNEM7QUFDNUMsb0RBQTRCO0FBRTVCLE1BQXNCLGtCQUFtQixTQUFRLGlDQUFzQjtJQUtyRSxZQUFZLFdBQWlDO1FBQzNDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUpYLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLFlBQU8sR0FBYyxFQUFFLENBQUM7UUFJN0IsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLHlCQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsV0FBVyxDQUFDLEVBQU07UUFDaEIsTUFBTSxNQUFNLEdBQUssRUFBaUIsQ0FBQyxFQUE2QyxDQUFDLE1BQU0sQ0FBQztRQUN4RixJQUNFLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVO1lBQ3pELE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQy9ELENBQUM7WUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7UUFDekQsQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELG9CQUFvQjtJQUNwQjs7O09BR0c7SUFDSCxpQkFBaUIsQ0FBQyxTQUFpQjtRQUNqQyxJQUFJLENBQUMsU0FBUyxJQUFJLFNBQVMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNsQyxNQUFNLElBQUksZ0NBQXFCLENBQUMsaURBQWlELENBQUMs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Q0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztDQUNGO0FBL0lELGdEQStJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGF2bVNlcmlhbCwgcHZtU2VyaWFsLCBVbnNpZ25lZFR4IH0gZnJvbSAnQGJpdGdvLWZvcmtzL2F2YWxhbmNoZWpzJztcbmltcG9ydCB7IEJhc2VUcmFuc2FjdGlvbkJ1aWxkZXIsIEJ1aWxkVHJhbnNhY3Rpb25FcnJvciB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IERlY29kZWRVdHhvT2JqLCBUeCB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgS2V5UGFpciB9IGZyb20gJy4va2V5UGFpcic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVHJhbnNhY3Rpb25CdWlsZGVyIGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uQnVpbGRlciB7XG4gIHByb3RlY3RlZCBfdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uO1xuICBwcm90ZWN0ZWQgcmVjb3ZlclNpZ25lciA9IGZhbHNlO1xuICBwdWJsaWMgX3NpZ25lcjogS2V5UGFpcltdID0gW107XG5cbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKF9jb2luQ29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSB0cmFuc2FjdGlvbiBidWlsZGVyIGZpZWxkcyB1c2luZyB0aGUgZGVjb2RlZCB0cmFuc2FjdGlvbiBkYXRhXG4gICAqXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb259IHR4IHRoZSB0cmFuc2FjdGlvbiBkYXRhXG4gICAqIEByZXR1cm5zIGl0c2VsZlxuICAgKi9cbiAgaW5pdEJ1aWxkZXIodHg6IFR4KTogdGhpcyB7XG4gICAgY29uc3QgYmFzZVR4ID0gKCh0eCBhcyBVbnNpZ25lZFR4KS50eCBhcyBwdm1TZXJpYWwuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeCkuYmFzZVR4O1xuICAgIGlmIChcbiAgICAgIGJhc2VUeC5OZXR3b3JrSWQudmFsdWUoKSAhPT0gdGhpcy5fdHJhbnNhY3Rpb24uX25ldHdvcmtJRCB8fFxuICAgICAgYmFzZVR4LkJsb2NrY2hhaW5JZC52YWx1ZSgpICE9PSB0aGlzLl90cmFuc2FjdGlvbi5fYmxvY2tjaGFpbklEXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05ldHdvcmsgb3IgYmxvY2tjaGFpbiBpcyBub3QgZXF1YWxzJyk7XG4gICAgfVxuICAgIHRoaXMuX3RyYW5zYWN0aW9uLnNldFRyYW5zYWN0aW9uKHR4KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHJlZ2lvbiBWYWxpZGF0b3JzXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIHRocmVzaG9sZFxuICAgKiBAcGFyYW0gdGhyZXNob2xkXG4gICAqL1xuICB2YWxpZGF0ZVRocmVzaG9sZCh0aHJlc2hvbGQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhyZXNob2xkIHx8IHRocmVzaG9sZCAhPT0gMikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCB0cmFuc2FjdGlvbjogdGhyZXNob2xkIG11c3QgYmUgc2V0IHRvIDInKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgdGhlIFVUWE8gaGFzIGV4cGVjdGVkIGZpZWxkcy5cbiAgICogQHBhcmFtIFVUWE9cbiAgICovXG4gIHZhbGlkYXRlVXR4byh2YWx1ZTogRGVjb2RlZFV0eG9PYmopOiB2b2lkIHtcbiAgICBbJ291dHB1dElEJywgJ2Ftb3VudCcsICd0eGlkJywgJ291dHB1dGlkeCddLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICBpZiAoIXZhbHVlLmhhc093blByb3BlcnR5KGZpZWxkKSkgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgVXR4b3MgcmVxdWlyZWQgJHtmaWVsZH1gKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB0aGUgbGlzdCBvZiBVVFhPUyBpcyBlbXB0eSBhbmQgY2hlY2sgZWFjaCBVVFhPLlxuICAgKiBAcGFyYW0gdmFsdWVzXG4gICAqL1xuICB2YWxpZGF0ZVV0eG9zKHZhbHVlczogRGVjb2RlZFV0eG9PYmpbXSk6IHZvaWQge1xuICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFwiVXR4b3MgY2FuJ3QgYmUgZW1wdHkgYXJyYXlcIik7XG4gICAgfVxuICAgIHZhbHVlcy5mb3JFYWNoKHRoaXMudmFsaWRhdGVVdHhvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgbG9ja3RpbWVcbiAgICogQHBhcmFtIGxvY2t0aW1lXG4gICAqL1xuICB2YWxpZGF0ZUxvY2t0aW1lKGxvY2t0aW1lOiBiaWdpbnQpOiB2b2lkIHtcbiAgICBpZiAoIWxvY2t0aW1lIHx8IGxvY2t0aW1lIDwgQmlnSW50KDApKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIHRyYW5zYWN0aW9uOiBsb2NrdGltZSBtdXN0IGJlIDAgb3IgaGlnaGVyJyk7XG4gICAgfVxuICB9XG4gIC8vIGVuZHJlZ2lvblxuXG4gIC8qKlxuICAgKiBUaHJlc2hvbGQgaXMgYW4gaW50IHRoYXQgbmFtZXMgdGhlIG51bWJlciBvZiB1bmlxdWUgc2lnbmF0dXJlcyByZXF1aXJlZCB0byBzcGVuZCB0aGUgb3V0cHV0LlxuICAgKiBNdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgbGVuZ3RoIG9mIEFkZHJlc3Nlcy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gICAqL1xuICB0aHJlc2hvbGQodmFsdWU6IG51bWJlcik6IHRoaXMge1xuICAgIHRoaXMudmFsaWRhdGVUaHJlc2hvbGQodmFsdWUpO1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uLl90aHJlc2hvbGQgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2NrdGltZSBpcyBhIGxvbmcgdGhhdCBjb250YWlucyB0aGUgdW5peCB0aW1lc3RhbXAgdGhhdCB0aGlzIG91dHB1dCBjYW4gYmUgc3BlbnQgYWZ0ZXIuXG4gICAqIFRoZSB1bml4IHRpbWVzdGFtcCBpcyBzcGVjaWZpYyB0byB0aGUgc2Vjb25kLlxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICovXG4gIGxvY2t0aW1lKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIpOiB0aGlzIHtcbiAgICB0aGlzLnZhbGlkYXRlTG9ja3RpbWUoQmlnSW50KHZhbHVlKSk7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24uX2xvY2t0aW1lID0gQmlnSW50KHZhbHVlKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIHVzaW5nIHJlY292ZXJ5IGtleSBtdXN0IGJlIHNldCBoZXJlXG4gICAqIFRPRE86IFNUTFgtMTczMTcgcmVjb3Zlcnkga2V5IHNpZ25pbmdcbiAgICogQHBhcmFtIHtib29sZWFufVtyZWNvdmVyU2lnbmVyPXRydWVdIHdoZXRoZXIgaXQncyByZWNvdmVyeSBzaWduZXJcbiAgICovXG4gIHJlY292ZXJNb2RlKHJlY292ZXJTaWduZXIgPSB0cnVlKTogdGhpcyB7XG4gICAgdGhpcy5yZWNvdmVyU2lnbmVyID0gcmVjb3ZlclNpZ25lcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBmcm9tUHViS2V5IGlzIGEgbGlzdCBvZiB1bmlxdWUgYWRkcmVzc2VzIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgcHJpdmF0ZSBrZXlzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc3BlbmQgdGhpcyBvdXRwdXRcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBzdHJpbmdbXX0gc2VuZGVyUHViS2V5XG4gICAqL1xuICBmcm9tUHViS2V5KHNlbmRlclB1YktleTogc3RyaW5nIHwgc3RyaW5nW10pOiB0aGlzIHtcbiAgICBjb25zdCBwdWJLZXlzID0gc2VuZGVyUHViS2V5IGluc3RhbmNlb2YgQXJyYXkgPyBzZW5kZXJQdWJLZXkgOiBbc2VuZGVyUHViS2V5XTtcbiAgICB0aGlzLl90cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3NlcyA9IHB1YktleXMubWFwKHV0aWxzLnBhcnNlQWRkcmVzcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCBvZiBVVFhPIHJlcXVpcmVkIGFzIGlucHV0cy5cbiAgICogQSBVVFhPIGlzIGEgc3RhbmRhbG9uZSByZXByZXNlbnRhdGlvbiBvZiBhIHRyYW5zYWN0aW9uIG91dHB1dC5cbiAgICpcbiAgICogQHBhcmFtIHtEZWNvZGVkVXR4b09ialtdfSBsaXN0IG9mIFVUWE9TXG4gICAqL1xuICB1dHhvcyh2YWx1ZTogRGVjb2RlZFV0eG9PYmpbXSk6IHRoaXMge1xuICAgIHRoaXMudmFsaWRhdGVVdHhvcyh2YWx1ZSk7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24uX3V0eG9zID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBUT0RPKENSLTEwNzMpOlxuICAvLyBJbXBsZW1lbnQ6XG4gIC8vICBidWlsZEltcGxlbWVudGF0aW9uXG4gIC8vICBzaWduSW1wbGVtZW50YXRpb25cbiAgLy8gIGdldCB0cmFuc2FjdGlvblxuICAvLyAgc2V0IHRyYW5zYWN0aW9uXG4gIC8vICB2YWxpZGF0ZVJhd1RyYW5zYWN0aW9uXG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBmcm9tSW1wbGVtZW50YXRpb24ocmF3VHJhbnNhY3Rpb246IHN0cmluZyk6IFRyYW5zYWN0aW9uIHtcbiAgICBjb25zdCBbdHhdID0gcHZtU2VyaWFsLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHguZnJvbUJ5dGVzKFxuICAgICAgQnVmZmVyLmZyb20ocmF3VHJhbnNhY3Rpb24sICdoZXgnKSxcbiAgICAgIGF2bVNlcmlhbC5nZXRBVk1NYW5hZ2VyKCkuZ2V0RGVmYXVsdENvZGVjKClcbiAgICApO1xuICAgIC8vIFRPRE8oQ1ItMTA3Myk6IGNoZWNrIGlmIGluaXRCdWlsZGVyIGNhbiBvbmx5IHVzZSBVbnNpZ25lZFR4IGFuZCBwdm1TZXJpYWwuQmFzZVR4IGlzIG5vdCByZXF1aXJlZFxuICAgIHRoaXMuaW5pdEJ1aWxkZXIodHgpO1xuICAgIHJldHVybiB0aGlzLl90cmFuc2FjdGlvbjtcbiAgfVxufVxuIl19
@@ -0,0 +1,57 @@
1
+ import { BaseTransactionBuilderFactory } from '@bitgo-beta/sdk-core';
2
+ import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
3
+ import { DeprecatedTransactionBuilder } from './deprecatedTransactionBuilder';
4
+ import { ExportInCTxBuilder } from './exportInCTxBuilder';
5
+ import { ExportTxBuilder } from './exportTxBuilder';
6
+ import { ImportInCTxBuilder } from './importInCTxBuilder';
7
+ import { ImportTxBuilder } from './importTxBuilder';
8
+ import { PermissionlessValidatorTxBuilder } from './permissionlessValidatorTxBuilder';
9
+ import { TransactionBuilder } from './transactionBuilder';
10
+ import { ValidatorTxBuilder } from './validatorTxBuilder';
11
+ export declare class TransactionBuilderFactory extends BaseTransactionBuilderFactory {
12
+ protected recoverSigner: boolean;
13
+ constructor(_coinConfig: Readonly<CoinConfig>);
14
+ /** @inheritdoc */
15
+ from(raw: string): TransactionBuilder | DeprecatedTransactionBuilder;
16
+ /** @inheritdoc */
17
+ getTransferBuilder(): DeprecatedTransactionBuilder;
18
+ /**
19
+ * Initialize Validator builder
20
+ *
21
+ * @returns {ValidatorTxBuilder} the builder initialized
22
+ */
23
+ getValidatorBuilder(): ValidatorTxBuilder;
24
+ /**
25
+ * Initialize Permissionless Validator builder
26
+ *
27
+ * @returns {PermissionlessValidatorTxBuilder} the builder initialized
28
+ */
29
+ getPermissionlessValidatorTxBuilder(): PermissionlessValidatorTxBuilder;
30
+ /**
31
+ * Export Cross chain transfer
32
+ *
33
+ * @returns {ExportTxBuilder} the builder initialized
34
+ */
35
+ getExportBuilder(): ExportTxBuilder;
36
+ /**
37
+ * Import Cross chain transfer
38
+ *
39
+ * @returns {ImportTxBuilder} the builder initialized
40
+ */
41
+ getImportBuilder(): ImportTxBuilder;
42
+ /**
43
+ * Import in C chain Cross chain transfer
44
+ *
45
+ * @returns {ImportInCTxBuilder} the builder initialized
46
+ */
47
+ getImportInCBuilder(): ImportInCTxBuilder;
48
+ /**
49
+ * Export in C chain Cross chain transfer
50
+ *
51
+ * @returns {ExportInCTxBuilder} the builder initialized
52
+ */
53
+ getExportInCBuilder(): ExportInCTxBuilder;
54
+ /** @inheritdoc */
55
+ getWalletInitializationBuilder(): DeprecatedTransactionBuilder;
56
+ }
57
+ //# sourceMappingURL=transactionBuilderFactory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactionBuilderFactory.d.ts","sourceRoot":"","sources":["../../../src/lib/transactionBuilderFactory.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,6BAA6B,EAAgB,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAoB,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAI/E,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,gCAAgC,EAAE,MAAM,oCAAoC,CAAC;AACtF,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,qBAAa,yBAA0B,SAAQ,6BAA6B;IAC1E,SAAS,CAAC,aAAa,UAAS;gBACpB,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAI7C,kBAAkB;IAClB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,GAAG,4BAA4B;IA6FpE,kBAAkB;IAClB,kBAAkB,IAAI,4BAA4B;IAIlD;;;;OAIG;IACH,mBAAmB,IAAI,kBAAkB;IAIzC;;;;OAIG;IACH,mCAAmC,IAAI,gCAAgC;IAIvE;;;;OAIG;IACH,gBAAgB,IAAI,eAAe;IAInC;;;;OAIG;IACH,gBAAgB,IAAI,eAAe;IAInC;;;;OAIG;IACH,mBAAmB,IAAI,kBAAkB;IAIzC;;;;OAIG;IACH,mBAAmB,IAAI,kBAAkB;IAIzC,kBAAkB;IAClB,8BAA8B,IAAI,4BAA4B;CAG/D"}