@bitgo/sdk-coin-flrp 1.3.3 → 1.4.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.
- package/dist/src/flrp.d.ts +6 -75
- package/dist/src/flrp.d.ts.map +1 -1
- package/dist/src/flrp.js +13 -298
- package/dist/src/index.d.ts +0 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -2
- package/dist/src/lib/ExportInCTxBuilder.d.ts +51 -0
- package/dist/src/lib/ExportInCTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ExportInCTxBuilder.js +186 -0
- package/dist/src/lib/ExportInPTxBuilder.d.ts +47 -0
- package/dist/src/lib/ExportInPTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ExportInPTxBuilder.js +273 -0
- package/dist/src/lib/ImportInCTxBuilder.d.ts +48 -0
- package/dist/src/lib/ImportInCTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ImportInCTxBuilder.js +215 -0
- package/dist/src/lib/ImportInPTxBuilder.d.ts +33 -0
- package/dist/src/lib/ImportInPTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ImportInPTxBuilder.js +180 -0
- package/dist/src/lib/atomicInCTransactionBuilder.d.ts +18 -16
- package/dist/src/lib/atomicInCTransactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/atomicInCTransactionBuilder.js +38 -36
- package/dist/src/lib/atomicTransactionBuilder.d.ts +42 -79
- package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/atomicTransactionBuilder.js +138 -281
- package/dist/src/lib/iface.d.ts +50 -51
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +22 -10
- package/dist/src/lib/index.d.ts +2 -3
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +5 -6
- package/dist/src/lib/keyPair.d.ts +1 -1
- package/dist/src/lib/keyPair.d.ts.map +1 -1
- package/dist/src/lib/keyPair.js +9 -5
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +32 -67
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/permissionlessValidatorTxBuilder.js +91 -205
- package/dist/src/lib/transaction.d.ts +8 -73
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +159 -210
- package/dist/src/lib/transactionBuilder.d.ts +56 -34
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +113 -70
- package/dist/src/lib/transactionBuilderFactory.d.ts +35 -30
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +133 -74
- package/dist/src/lib/utils.d.ts +73 -151
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +197 -390
- package/dist/test/resources/transactionData/exportInC.d.ts +20 -0
- package/dist/test/resources/transactionData/exportInC.d.ts.map +1 -0
- package/dist/test/resources/transactionData/exportInC.js +34 -0
- package/dist/test/resources/transactionData/exportInP.d.ts +69 -0
- package/dist/test/resources/transactionData/exportInP.d.ts.map +1 -0
- package/dist/test/resources/transactionData/exportInP.js +140 -0
- package/dist/test/resources/transactionData/importInC.d.ts +27 -0
- package/dist/test/resources/transactionData/importInC.d.ts.map +1 -0
- package/dist/test/resources/transactionData/importInC.js +44 -0
- package/dist/test/resources/transactionData/importInP.d.ts +35 -0
- package/dist/test/resources/transactionData/importInP.d.ts.map +1 -0
- package/dist/test/resources/transactionData/importInP.js +58 -0
- package/dist/test/unit/lib/exportInCTxBuilder.js +95 -513
- package/dist/test/unit/lib/exportInPTxBuilder.d.ts +1 -1
- package/dist/test/unit/lib/exportInPTxBuilder.d.ts.map +1 -1
- package/dist/test/unit/lib/exportInPTxBuilder.js +110 -366
- package/dist/test/unit/lib/importInCTxBuilder.d.ts +1 -1
- package/dist/test/unit/lib/importInCTxBuilder.d.ts.map +1 -1
- package/dist/test/unit/lib/importInCTxBuilder.js +40 -251
- package/dist/test/unit/lib/importInPTxBuilder.d.ts +1 -1
- package/dist/test/unit/lib/importInPTxBuilder.d.ts.map +1 -1
- package/dist/test/unit/lib/importInPTxBuilder.js +61 -489
- package/dist/test/unit/lib/signFlowTestSuit.d.ts +20 -0
- package/dist/test/unit/lib/signFlowTestSuit.d.ts.map +1 -0
- package/dist/test/unit/lib/signFlowTestSuit.js +89 -0
- package/dist/test/unit/lib/utils.js +29 -302
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -10
- package/dist/src/iface.d.ts +0 -25
- package/dist/src/iface.d.ts.map +0 -1
- package/dist/src/iface.js +0 -3
- package/dist/src/lib/constants.d.ts +0 -170
- package/dist/src/lib/constants.d.ts.map +0 -1
- package/dist/src/lib/constants.js +0 -227
- package/dist/src/lib/delegatorTxBuilder.d.ts +0 -58
- package/dist/src/lib/delegatorTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/delegatorTxBuilder.js +0 -224
- package/dist/src/lib/errors.d.ts +0 -8
- package/dist/src/lib/errors.d.ts.map +0 -1
- package/dist/src/lib/errors.js +0 -19
- package/dist/src/lib/exportInCTxBuilder.d.ts +0 -77
- package/dist/src/lib/exportInCTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/exportInCTxBuilder.js +0 -199
- package/dist/src/lib/exportInPTxBuilder.d.ts +0 -30
- package/dist/src/lib/exportInPTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/exportInPTxBuilder.js +0 -120
- package/dist/src/lib/importInCTxBuilder.d.ts +0 -67
- package/dist/src/lib/importInCTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/importInCTxBuilder.js +0 -403
- package/dist/src/lib/importInPTxBuilder.d.ts +0 -73
- package/dist/src/lib/importInPTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/importInPTxBuilder.js +0 -464
- package/dist/src/lib/types.d.ts +0 -78
- package/dist/src/lib/types.d.ts.map +0 -1
- package/dist/src/lib/types.js +0 -5
- package/dist/src/lib/validatorTxBuilder.d.ts +0 -40
- package/dist/src/lib/validatorTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/validatorTxBuilder.js +0 -180
- package/dist/test/unit/delegatorTxBuilder.test.d.ts +0 -2
- package/dist/test/unit/delegatorTxBuilder.test.d.ts.map +0 -1
- package/dist/test/unit/delegatorTxBuilder.test.js +0 -233
- package/dist/test/unit/flrp.d.ts +0 -2
- package/dist/test/unit/flrp.d.ts.map +0 -1
- package/dist/test/unit/flrp.js +0 -118
- package/dist/test/unit/lib/atomicTransactionBuilder.d.ts +0 -2
- package/dist/test/unit/lib/atomicTransactionBuilder.d.ts.map +0 -1
- package/dist/test/unit/lib/atomicTransactionBuilder.js +0 -222
- package/dist/test/unit/lib/transaction.d.ts +0 -2
- package/dist/test/unit/lib/transaction.d.ts.map +0 -1
- package/dist/test/unit/lib/transaction.js +0 -460
- package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts +0 -2
- package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts.map +0 -1
- package/dist/test/unit/permissionlessValidatorTxBuilder.test.js +0 -271
- package/dist/test/unit/smoke.d.ts +0 -2
- package/dist/test/unit/smoke.d.ts.map +0 -1
- package/dist/test/unit/smoke.js +0 -23
- package/dist/test/unit/transactionBuilder.test.d.ts +0 -2
- package/dist/test/unit/transactionBuilder.test.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder.test.js +0 -114
- package/dist/test/unit/validatorTxBuilder.test.d.ts +0 -2
- package/dist/test/unit/validatorTxBuilder.test.d.ts.map +0 -1
- package/dist/test/unit/validatorTxBuilder.test.js +0 -293
|
@@ -1,460 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
const statics_1 = require("@bitgo/statics");
|
|
37
|
-
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
38
|
-
const assert = __importStar(require("assert"));
|
|
39
|
-
const transaction_1 = require("../../../src/lib/transaction");
|
|
40
|
-
const keyPair_1 = require("../../../src/lib/keyPair");
|
|
41
|
-
describe('FLRP Transaction', function () {
|
|
42
|
-
let transaction;
|
|
43
|
-
const coinConfig = statics_1.coins.get('tflrp');
|
|
44
|
-
// Helper to create a mock transaction for testing
|
|
45
|
-
const createMockTx = () => ({ test: 'transaction' });
|
|
46
|
-
beforeEach(function () {
|
|
47
|
-
transaction = new transaction_1.Transaction(coinConfig);
|
|
48
|
-
});
|
|
49
|
-
describe('Constructor', function () {
|
|
50
|
-
it('should initialize with correct network configuration', function () {
|
|
51
|
-
assert.strictEqual(transaction._assetId, 'FLR');
|
|
52
|
-
assert.strictEqual(transaction._blockchainID, '11111111111111111111111111111111LpoYY');
|
|
53
|
-
assert.strictEqual(transaction._networkID, 114);
|
|
54
|
-
assert.strictEqual(transaction._threshold, 2);
|
|
55
|
-
assert.strictEqual(transaction._locktime, BigInt(0));
|
|
56
|
-
});
|
|
57
|
-
it('should initialize empty arrays and default values', function () {
|
|
58
|
-
assert.deepStrictEqual(transaction._fromAddresses, []);
|
|
59
|
-
assert.deepStrictEqual(transaction._rewardAddresses, []);
|
|
60
|
-
assert.deepStrictEqual(transaction._utxos, []);
|
|
61
|
-
assert.deepStrictEqual(transaction._fee, {});
|
|
62
|
-
});
|
|
63
|
-
});
|
|
64
|
-
describe('Transaction Type Management', function () {
|
|
65
|
-
it('should set supported transaction types', function () {
|
|
66
|
-
const supportedTypes = [
|
|
67
|
-
sdk_core_1.TransactionType.Export,
|
|
68
|
-
sdk_core_1.TransactionType.Import,
|
|
69
|
-
sdk_core_1.TransactionType.AddValidator,
|
|
70
|
-
sdk_core_1.TransactionType.AddDelegator,
|
|
71
|
-
sdk_core_1.TransactionType.AddPermissionlessValidator,
|
|
72
|
-
sdk_core_1.TransactionType.AddPermissionlessDelegator,
|
|
73
|
-
];
|
|
74
|
-
supportedTypes.forEach((type) => {
|
|
75
|
-
assert.doesNotThrow(() => {
|
|
76
|
-
transaction.setTransactionType(type);
|
|
77
|
-
assert.strictEqual(transaction._type, type);
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
});
|
|
81
|
-
it('should throw error for unsupported transaction types', function () {
|
|
82
|
-
assert.throws(() => {
|
|
83
|
-
transaction.setTransactionType(sdk_core_1.TransactionType.Send);
|
|
84
|
-
}, /Transaction type .* is not supported/);
|
|
85
|
-
});
|
|
86
|
-
});
|
|
87
|
-
describe('Getters', function () {
|
|
88
|
-
it('should return correct flareTransaction', function () {
|
|
89
|
-
const mockTx = createMockTx();
|
|
90
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
91
|
-
transaction.setTransaction(mockTx);
|
|
92
|
-
assert.strictEqual(transaction.flareTransaction, mockTx);
|
|
93
|
-
});
|
|
94
|
-
it('should return empty signature array when no credentials', function () {
|
|
95
|
-
assert.deepStrictEqual(transaction.signature, []);
|
|
96
|
-
});
|
|
97
|
-
it('should return empty credentials array', function () {
|
|
98
|
-
assert.deepStrictEqual(transaction.credentials, []);
|
|
99
|
-
});
|
|
100
|
-
it('should return false for hasCredentials when no credentials', function () {
|
|
101
|
-
assert.strictEqual(transaction.hasCredentials, false);
|
|
102
|
-
});
|
|
103
|
-
it('should return placeholder ID when no transaction set', function () {
|
|
104
|
-
// This should throw error when no transaction is set
|
|
105
|
-
assert.throws(() => {
|
|
106
|
-
transaction.id;
|
|
107
|
-
}, sdk_core_1.InvalidTransactionError);
|
|
108
|
-
});
|
|
109
|
-
it('should return placeholder signablePayload when no transaction set', function () {
|
|
110
|
-
// This should throw error when no transaction is set
|
|
111
|
-
assert.throws(() => {
|
|
112
|
-
void transaction.signablePayload;
|
|
113
|
-
}, sdk_core_1.InvalidTransactionError);
|
|
114
|
-
});
|
|
115
|
-
it('should return formatted fromAddresses', function () {
|
|
116
|
-
transaction._fromAddresses = ['address1', 'address2'];
|
|
117
|
-
const addresses = transaction.fromAddresses;
|
|
118
|
-
assert.deepStrictEqual(addresses, ['address1', 'address2']);
|
|
119
|
-
});
|
|
120
|
-
it('should return formatted rewardAddresses', function () {
|
|
121
|
-
transaction._rewardAddresses = ['reward1', 'reward2'];
|
|
122
|
-
const addresses = transaction.rewardAddresses;
|
|
123
|
-
assert.deepStrictEqual(addresses, ['reward1', 'reward2']);
|
|
124
|
-
});
|
|
125
|
-
});
|
|
126
|
-
describe('Transaction Outputs', function () {
|
|
127
|
-
beforeEach(function () {
|
|
128
|
-
transaction._nodeID = 'test-node-id';
|
|
129
|
-
transaction._stakeAmount = BigInt('1000000000000000'); // 1M FLR
|
|
130
|
-
});
|
|
131
|
-
it('should return empty outputs for Export type', function () {
|
|
132
|
-
transaction.setTransactionType(sdk_core_1.TransactionType.Export);
|
|
133
|
-
const outputs = transaction.outputs;
|
|
134
|
-
assert.deepStrictEqual(outputs, []);
|
|
135
|
-
});
|
|
136
|
-
it('should return empty outputs for Import type', function () {
|
|
137
|
-
transaction.setTransactionType(sdk_core_1.TransactionType.Import);
|
|
138
|
-
const outputs = transaction.outputs;
|
|
139
|
-
assert.deepStrictEqual(outputs, []);
|
|
140
|
-
});
|
|
141
|
-
it('should return staking outputs for AddValidator type', function () {
|
|
142
|
-
transaction.setTransactionType(sdk_core_1.TransactionType.AddValidator);
|
|
143
|
-
const outputs = transaction.outputs;
|
|
144
|
-
assert.strictEqual(outputs.length, 1);
|
|
145
|
-
assert.strictEqual(outputs[0].address, 'test-node-id');
|
|
146
|
-
assert.strictEqual(outputs[0].value, '1000000000000000');
|
|
147
|
-
});
|
|
148
|
-
it('should return staking outputs for AddPermissionlessValidator type', function () {
|
|
149
|
-
transaction.setTransactionType(sdk_core_1.TransactionType.AddPermissionlessValidator);
|
|
150
|
-
const outputs = transaction.outputs;
|
|
151
|
-
assert.strictEqual(outputs.length, 1);
|
|
152
|
-
assert.strictEqual(outputs[0].address, 'test-node-id');
|
|
153
|
-
assert.strictEqual(outputs[0].value, '1000000000000000');
|
|
154
|
-
});
|
|
155
|
-
it('should return staking outputs for AddDelegator type', function () {
|
|
156
|
-
transaction.setTransactionType(sdk_core_1.TransactionType.AddDelegator);
|
|
157
|
-
const outputs = transaction.outputs;
|
|
158
|
-
assert.strictEqual(outputs.length, 1);
|
|
159
|
-
assert.strictEqual(outputs[0].address, 'test-node-id');
|
|
160
|
-
assert.strictEqual(outputs[0].value, '1000000000000000');
|
|
161
|
-
});
|
|
162
|
-
it('should return staking outputs for AddPermissionlessDelegator type', function () {
|
|
163
|
-
transaction.setTransactionType(sdk_core_1.TransactionType.AddPermissionlessDelegator);
|
|
164
|
-
const outputs = transaction.outputs;
|
|
165
|
-
assert.strictEqual(outputs.length, 1);
|
|
166
|
-
assert.strictEqual(outputs[0].address, 'test-node-id');
|
|
167
|
-
assert.strictEqual(outputs[0].value, '1000000000000000');
|
|
168
|
-
});
|
|
169
|
-
it('should return empty outputs for unknown type', function () {
|
|
170
|
-
// Don't set type, should default to empty
|
|
171
|
-
const outputs = transaction.outputs;
|
|
172
|
-
assert.deepStrictEqual(outputs, []);
|
|
173
|
-
});
|
|
174
|
-
});
|
|
175
|
-
describe('Transaction Inputs', function () {
|
|
176
|
-
it('should return inputs from UTXOs', function () {
|
|
177
|
-
transaction._utxos = [
|
|
178
|
-
{
|
|
179
|
-
outputID: 1,
|
|
180
|
-
amount: '1000000',
|
|
181
|
-
txid: 'test-txid-1',
|
|
182
|
-
outputidx: '0',
|
|
183
|
-
threshold: 2,
|
|
184
|
-
addresses: ['addr1', 'addr2'],
|
|
185
|
-
},
|
|
186
|
-
{
|
|
187
|
-
outputID: 2,
|
|
188
|
-
amount: '2000000',
|
|
189
|
-
txid: 'test-txid-2',
|
|
190
|
-
outputidx: '1',
|
|
191
|
-
threshold: 2,
|
|
192
|
-
addresses: ['addr3', 'addr4'],
|
|
193
|
-
},
|
|
194
|
-
];
|
|
195
|
-
transaction._fromAddresses = ['addr1', 'addr2', 'addr3', 'addr4'];
|
|
196
|
-
const inputs = transaction.inputs;
|
|
197
|
-
assert.strictEqual(inputs.length, 2);
|
|
198
|
-
assert.strictEqual(inputs[0].id, 'test-txid-1:0');
|
|
199
|
-
assert.strictEqual(inputs[0].value, '1000000');
|
|
200
|
-
assert.strictEqual(inputs[0].address, 'addr1~addr2~addr3~addr4');
|
|
201
|
-
assert.strictEqual(inputs[1].id, 'test-txid-2:1');
|
|
202
|
-
assert.strictEqual(inputs[1].value, '2000000');
|
|
203
|
-
});
|
|
204
|
-
it('should return empty inputs when no UTXOs', function () {
|
|
205
|
-
const inputs = transaction.inputs;
|
|
206
|
-
assert.deepStrictEqual(inputs, []);
|
|
207
|
-
});
|
|
208
|
-
});
|
|
209
|
-
describe('Change Outputs', function () {
|
|
210
|
-
it('should return empty change outputs', function () {
|
|
211
|
-
const changeOutputs = transaction.changeOutputs;
|
|
212
|
-
assert.deepStrictEqual(changeOutputs, []);
|
|
213
|
-
});
|
|
214
|
-
});
|
|
215
|
-
describe('Fee Handling', function () {
|
|
216
|
-
it('should return default fee when no fee set', function () {
|
|
217
|
-
const fee = transaction.fee;
|
|
218
|
-
assert.deepStrictEqual(fee, { fee: '0' });
|
|
219
|
-
});
|
|
220
|
-
it('should return custom fee when set', function () {
|
|
221
|
-
transaction._fee = { fee: '1000000' };
|
|
222
|
-
const fee = transaction.fee;
|
|
223
|
-
assert.deepStrictEqual(fee, { fee: '1000000' });
|
|
224
|
-
});
|
|
225
|
-
});
|
|
226
|
-
describe('Signing', function () {
|
|
227
|
-
let keyPair;
|
|
228
|
-
beforeEach(function () {
|
|
229
|
-
// Create a test key pair with a private key
|
|
230
|
-
keyPair = new keyPair_1.KeyPair({ prv: '01'.repeat(32) });
|
|
231
|
-
});
|
|
232
|
-
it('should throw error when no private key', async function () {
|
|
233
|
-
const emptyKeyPair = new keyPair_1.KeyPair();
|
|
234
|
-
await assert.rejects(async () => {
|
|
235
|
-
await transaction.sign(emptyKeyPair);
|
|
236
|
-
}, sdk_core_1.InvalidTransactionError); // Will throw InvalidTransactionError for empty transaction first
|
|
237
|
-
});
|
|
238
|
-
it('should throw error when no transaction to sign', async function () {
|
|
239
|
-
await assert.rejects(async () => {
|
|
240
|
-
await transaction.sign(keyPair);
|
|
241
|
-
}, sdk_core_1.InvalidTransactionError);
|
|
242
|
-
});
|
|
243
|
-
it('should throw error for FlareJS signing not implemented', async function () {
|
|
244
|
-
// Set a mock transaction and mock credentials to pass validation
|
|
245
|
-
const mockTx = createMockTx();
|
|
246
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
247
|
-
transaction.setTransaction(mockTx);
|
|
248
|
-
// Mock hasCredentials to return true
|
|
249
|
-
Object.defineProperty(transaction, 'hasCredentials', {
|
|
250
|
-
get: () => true,
|
|
251
|
-
});
|
|
252
|
-
await assert.rejects(async () => {
|
|
253
|
-
await transaction.sign(keyPair);
|
|
254
|
-
}, /FlareJS signing not yet implemented/);
|
|
255
|
-
});
|
|
256
|
-
});
|
|
257
|
-
describe('Serialization', function () {
|
|
258
|
-
it('should throw error for toBroadcastFormat when no transaction', function () {
|
|
259
|
-
assert.throws(() => {
|
|
260
|
-
transaction.toBroadcastFormat();
|
|
261
|
-
}, sdk_core_1.InvalidTransactionError);
|
|
262
|
-
});
|
|
263
|
-
it('should return placeholder for toBroadcastFormat when transaction set', function () {
|
|
264
|
-
const mockTx = createMockTx();
|
|
265
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
266
|
-
transaction.setTransaction(mockTx);
|
|
267
|
-
const broadcastFormat = transaction.toBroadcastFormat();
|
|
268
|
-
assert.strictEqual(broadcastFormat, 'flare-tx-hex-placeholder');
|
|
269
|
-
});
|
|
270
|
-
it('should throw error for toJson when no transaction', function () {
|
|
271
|
-
assert.throws(() => {
|
|
272
|
-
transaction.toJson();
|
|
273
|
-
}, sdk_core_1.InvalidTransactionError);
|
|
274
|
-
});
|
|
275
|
-
it('should return transaction data for toJson when transaction set', function () {
|
|
276
|
-
const mockTx = createMockTx();
|
|
277
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
278
|
-
transaction.setTransaction(mockTx);
|
|
279
|
-
transaction._fromAddresses = ['addr1'];
|
|
280
|
-
transaction._threshold = 2;
|
|
281
|
-
transaction._locktime = BigInt(100);
|
|
282
|
-
const jsonData = transaction.toJson();
|
|
283
|
-
assert.strictEqual(jsonData.id, 'flare-transaction-id-placeholder');
|
|
284
|
-
assert.deepStrictEqual(jsonData.fromAddresses, ['addr1']);
|
|
285
|
-
assert.strictEqual(jsonData.threshold, 2);
|
|
286
|
-
assert.strictEqual(jsonData.locktime, '100');
|
|
287
|
-
});
|
|
288
|
-
});
|
|
289
|
-
describe('Cross-chain Properties', function () {
|
|
290
|
-
it('should identify Export as cross-chain transaction', function () {
|
|
291
|
-
transaction.setTransactionType(sdk_core_1.TransactionType.Export);
|
|
292
|
-
assert.strictEqual(transaction.isTransactionForCChain, true);
|
|
293
|
-
});
|
|
294
|
-
it('should identify Import as cross-chain transaction', function () {
|
|
295
|
-
transaction.setTransactionType(sdk_core_1.TransactionType.Import);
|
|
296
|
-
assert.strictEqual(transaction.isTransactionForCChain, true);
|
|
297
|
-
});
|
|
298
|
-
it('should identify AddValidator as non-cross-chain transaction', function () {
|
|
299
|
-
transaction.setTransactionType(sdk_core_1.TransactionType.AddValidator);
|
|
300
|
-
assert.strictEqual(transaction.isTransactionForCChain, false);
|
|
301
|
-
});
|
|
302
|
-
});
|
|
303
|
-
describe('Transaction Explanation', function () {
|
|
304
|
-
beforeEach(function () {
|
|
305
|
-
const mockTx = createMockTx();
|
|
306
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
307
|
-
transaction.setTransaction(mockTx);
|
|
308
|
-
transaction._fromAddresses = ['test-address'];
|
|
309
|
-
transaction._fee = { fee: '1000000' };
|
|
310
|
-
});
|
|
311
|
-
it('should explain a basic transaction', function () {
|
|
312
|
-
transaction.setTransactionType(sdk_core_1.TransactionType.Export);
|
|
313
|
-
const explanation = transaction.explainTransaction();
|
|
314
|
-
assert.ok(explanation.displayOrder);
|
|
315
|
-
assert.ok(Array.isArray(explanation.displayOrder));
|
|
316
|
-
assert.strictEqual(explanation.id, 'flare-transaction-id-placeholder');
|
|
317
|
-
assert.deepStrictEqual(explanation.fee, { fee: '1000000' });
|
|
318
|
-
assert.strictEqual(explanation.type, sdk_core_1.TransactionType.Export);
|
|
319
|
-
});
|
|
320
|
-
it('should include reward addresses for staking transactions', function () {
|
|
321
|
-
transaction.setTransactionType(sdk_core_1.TransactionType.AddValidator);
|
|
322
|
-
transaction._rewardAddresses = ['reward-addr-1'];
|
|
323
|
-
const explanation = transaction.explainTransaction();
|
|
324
|
-
assert.ok(explanation.displayOrder);
|
|
325
|
-
assert.ok(explanation.displayOrder.includes('rewardAddresses'));
|
|
326
|
-
assert.deepStrictEqual(explanation.rewardAddresses, ['reward-addr-1']);
|
|
327
|
-
});
|
|
328
|
-
it('should include cross-chain information for export/import', function () {
|
|
329
|
-
transaction.setTransactionType(sdk_core_1.TransactionType.Export);
|
|
330
|
-
const explanation = transaction.explainTransaction();
|
|
331
|
-
assert.ok(explanation.displayOrder);
|
|
332
|
-
assert.ok(explanation.displayOrder.includes('sourceChain'));
|
|
333
|
-
assert.ok(explanation.displayOrder.includes('destinationChain'));
|
|
334
|
-
});
|
|
335
|
-
it('should calculate output amounts correctly', function () {
|
|
336
|
-
transaction._nodeID = 'test-node';
|
|
337
|
-
transaction._stakeAmount = BigInt('5000000000000000');
|
|
338
|
-
transaction.setTransactionType(sdk_core_1.TransactionType.AddValidator);
|
|
339
|
-
const explanation = transaction.explainTransaction();
|
|
340
|
-
assert.strictEqual(explanation.outputAmount, '5000000000000000');
|
|
341
|
-
assert.strictEqual(explanation.changeAmount, '0');
|
|
342
|
-
});
|
|
343
|
-
});
|
|
344
|
-
describe('Signature Creation', function () {
|
|
345
|
-
it('should create signature placeholder', function () {
|
|
346
|
-
const mockPrivateKey = Buffer.from('1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef', 'hex');
|
|
347
|
-
const mockTx = createMockTx();
|
|
348
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
349
|
-
transaction.setTransaction(mockTx);
|
|
350
|
-
const signature = transaction.createSignature(mockPrivateKey);
|
|
351
|
-
assert.ok(typeof signature === 'string');
|
|
352
|
-
assert.ok(signature.length > 0);
|
|
353
|
-
});
|
|
354
|
-
});
|
|
355
|
-
describe('Validation', function () {
|
|
356
|
-
it('should allow signing with valid key', function () {
|
|
357
|
-
const keyPair = new keyPair_1.KeyPair({ prv: '01'.repeat(32) });
|
|
358
|
-
const canSign = transaction.canSign({ key: keyPair });
|
|
359
|
-
assert.strictEqual(canSign, true);
|
|
360
|
-
});
|
|
361
|
-
});
|
|
362
|
-
describe('Transaction Setting', function () {
|
|
363
|
-
it('should set transaction correctly', function () {
|
|
364
|
-
const mockTx = createMockTx();
|
|
365
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
366
|
-
transaction.setTransaction(mockTx);
|
|
367
|
-
// Can't directly access _flareTransaction (protected), but can test via getter
|
|
368
|
-
assert.strictEqual(transaction.flareTransaction, mockTx);
|
|
369
|
-
});
|
|
370
|
-
});
|
|
371
|
-
describe('Hex Conversion', function () {
|
|
372
|
-
it('should convert byte array to hex string', function () {
|
|
373
|
-
const byteArray = new Uint8Array([0x01, 0x23, 0xab, 0xcd]);
|
|
374
|
-
const hexString = transaction.toHexString(byteArray);
|
|
375
|
-
assert.strictEqual(hexString, '0123abcd');
|
|
376
|
-
});
|
|
377
|
-
it('should handle empty byte array', function () {
|
|
378
|
-
const byteArray = new Uint8Array([]);
|
|
379
|
-
const hexString = transaction.toHexString(byteArray);
|
|
380
|
-
assert.strictEqual(hexString, '');
|
|
381
|
-
});
|
|
382
|
-
});
|
|
383
|
-
describe('Memo Functionality', function () {
|
|
384
|
-
it('should initialize with empty memo', function () {
|
|
385
|
-
assert.strictEqual(transaction.hasMemo(), false);
|
|
386
|
-
assert.strictEqual(transaction.getMemoString(), '');
|
|
387
|
-
assert.deepStrictEqual(transaction.getMemoBytes(), new Uint8Array());
|
|
388
|
-
});
|
|
389
|
-
it('should set memo from string', function () {
|
|
390
|
-
const memoText = 'Test transaction memo';
|
|
391
|
-
transaction.setMemo(memoText);
|
|
392
|
-
assert.strictEqual(transaction.hasMemo(), true);
|
|
393
|
-
assert.strictEqual(transaction.getMemoString(), memoText);
|
|
394
|
-
assert.deepStrictEqual(transaction.getMemoBytes(), new TextEncoder().encode(memoText));
|
|
395
|
-
});
|
|
396
|
-
it('should set memo from JSON object', function () {
|
|
397
|
-
const memoObj = { user: 'alice', amount: 1000 };
|
|
398
|
-
transaction.setMemoData(memoObj);
|
|
399
|
-
assert.strictEqual(transaction.hasMemo(), true);
|
|
400
|
-
assert.strictEqual(transaction.getMemoString(), JSON.stringify(memoObj));
|
|
401
|
-
});
|
|
402
|
-
it('should set memo from bytes', function () {
|
|
403
|
-
const memoBytes = new TextEncoder().encode('Binary memo data');
|
|
404
|
-
transaction.setMemoData(memoBytes);
|
|
405
|
-
assert.strictEqual(transaction.hasMemo(), true);
|
|
406
|
-
assert.deepStrictEqual(transaction.getMemoBytes(), memoBytes);
|
|
407
|
-
assert.strictEqual(transaction.getMemoString(), 'Binary memo data');
|
|
408
|
-
});
|
|
409
|
-
it('should handle empty string memo', function () {
|
|
410
|
-
transaction.setMemo('');
|
|
411
|
-
assert.strictEqual(transaction.hasMemo(), false);
|
|
412
|
-
assert.strictEqual(transaction.getMemoString(), '');
|
|
413
|
-
});
|
|
414
|
-
it('should handle UTF-8 memo', function () {
|
|
415
|
-
const utf8Memo = 'Hello 世界 🌍 Flare!';
|
|
416
|
-
transaction.setMemo(utf8Memo);
|
|
417
|
-
assert.strictEqual(transaction.hasMemo(), true);
|
|
418
|
-
assert.strictEqual(transaction.getMemoString(), utf8Memo);
|
|
419
|
-
});
|
|
420
|
-
it('should include memo in transaction JSON when present', function () {
|
|
421
|
-
const memoText = 'Transaction metadata';
|
|
422
|
-
transaction.setMemo(memoText);
|
|
423
|
-
// Mock the FlareJS transaction
|
|
424
|
-
const mockTx = createMockTx();
|
|
425
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
426
|
-
transaction.setTransaction(mockTx);
|
|
427
|
-
transaction.setTransactionType(sdk_core_1.TransactionType.Export);
|
|
428
|
-
const txData = transaction.toJson();
|
|
429
|
-
assert.strictEqual(txData.memo, memoText);
|
|
430
|
-
});
|
|
431
|
-
it('should not include memo in JSON when empty', function () {
|
|
432
|
-
// Mock the FlareJS transaction
|
|
433
|
-
const mockTx = createMockTx();
|
|
434
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
435
|
-
transaction.setTransaction(mockTx);
|
|
436
|
-
transaction.setTransactionType(sdk_core_1.TransactionType.Export);
|
|
437
|
-
const txData = transaction.toJson();
|
|
438
|
-
assert.strictEqual(txData.memo, '');
|
|
439
|
-
});
|
|
440
|
-
it('should validate memo size limits', function () {
|
|
441
|
-
// Test large memo - this should be validated by utils
|
|
442
|
-
const largeMemo = 'x'.repeat(5000); // 5KB memo
|
|
443
|
-
transaction.setMemo(largeMemo);
|
|
444
|
-
assert.strictEqual(transaction.getMemoString(), largeMemo);
|
|
445
|
-
});
|
|
446
|
-
it('should handle special characters in memo', function () {
|
|
447
|
-
const specialMemo = 'Special chars: \n\t\r\0\x01\xff';
|
|
448
|
-
transaction.setMemo(specialMemo);
|
|
449
|
-
assert.strictEqual(transaction.getMemoString(), specialMemo);
|
|
450
|
-
});
|
|
451
|
-
it('should throw error for invalid memo format in setMemoData', function () {
|
|
452
|
-
// This should be tested in utils, but we can check basic behavior
|
|
453
|
-
assert.throws(() => {
|
|
454
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
455
|
-
transaction.setMemoData(123);
|
|
456
|
-
});
|
|
457
|
-
});
|
|
458
|
-
});
|
|
459
|
-
});
|
|
460
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNENBQXVDO0FBQ3ZDLDhDQUEyRTtBQUMzRSwrQ0FBaUM7QUFDakMsOERBQTJEO0FBQzNELHNEQUFtRDtBQU9uRCxRQUFRLENBQUMsa0JBQWtCLEVBQUU7SUFDM0IsSUFBSSxXQUF3QixDQUFDO0lBQzdCLE1BQU0sVUFBVSxHQUFHLGVBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFdEMsa0RBQWtEO0lBQ2xELE1BQU0sWUFBWSxHQUFHLEdBQVcsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQztJQUU3RCxVQUFVLENBQUM7UUFDVCxXQUFXLEdBQUcsSUFBSSx5QkFBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzVDLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGFBQWEsRUFBRTtRQUN0QixFQUFFLENBQUMsc0RBQXNELEVBQUU7WUFDekQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2hELE1BQU0sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSx1Q0FBdUMsQ0FBQyxDQUFDO1lBQ3ZGLE1BQU0sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNoRCxNQUFNLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDOUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELENBQUMsQ0FBQyxD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TUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7Z0JBQ2pCLDhEQUE4RDtnQkFDOUQsV0FBVyxDQUFDLFdBQVcsQ0FBQyxHQUFVLENBQUMsQ0FBQztZQUN0QyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlLCBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvciB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBLZXlQYWlyIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi9rZXlQYWlyJztcblxuLy8gTW9jayB0cmFuc2FjdGlvbiBmb3IgdGVzdGluZ1xuaW50ZXJmYWNlIE1vY2tUeCB7XG4gIHRlc3Q6IHN0cmluZztcbn1cblxuZGVzY3JpYmUoJ0ZMUlAgVHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gIGxldCB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb247XG4gIGNvbnN0IGNvaW5Db25maWcgPSBjb2lucy5nZXQoJ3RmbHJwJyk7XG5cbiAgLy8gSGVscGVyIHRvIGNyZWF0ZSBhIG1vY2sgdHJhbnNhY3Rpb24gZm9yIHRlc3RpbmdcbiAgY29uc3QgY3JlYXRlTW9ja1R4ID0gKCk6IE1vY2tUeCA9PiAoeyB0ZXN0OiAndHJhbnNhY3Rpb24nIH0pO1xuXG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5Db25maWcpO1xuICB9KTtcblxuICBkZXNjcmliZSgnQ29uc3RydWN0b3InLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBpbml0aWFsaXplIHdpdGggY29ycmVjdCBuZXR3b3JrIGNvbmZpZ3VyYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHJhbnNhY3Rpb24uX2Fzc2V0SWQsICdGTFInKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0cmFuc2FjdGlvbi5fYmxvY2tjaGFpbklELCAnMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFMcG9ZWScpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRyYW5zYWN0aW9uLl9uZXR3b3JrSUQsIDExNCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHJhbnNhY3Rpb24uX3RocmVzaG9sZCwgMik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHJhbnNhY3Rpb24uX2xvY2t0aW1lLCBCaWdJbnQoMCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBpbml0aWFsaXplIGVtcHR5IGFycmF5cyBhbmQgZGVmYXVsdCB2YWx1ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzLCBbXSk7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHRyYW5zYWN0aW9uLl9yZXdhcmRBZGRyZXNzZXMsIFtdKTtcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwodHJhbnNhY3Rpb24uX3V0eG9zLCBbXSk7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHRyYW5zYWN0aW9uLl9mZWUsIHt9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1RyYW5zYWN0aW9uIFR5cGUgTWFuYWdlbWVudCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHNldCBzdXBwb3J0ZWQgdHJhbnNhY3Rpb24gdHlwZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzdXBwb3J0ZWRUeXBlcyA9IFtcbiAgICAgICAgVHJhbnNhY3Rpb25UeXBlLkV4cG9ydCxcbiAgICAgICAgVHJhbnNhY3Rpb25UeXBlLkltcG9ydCxcbiAgICAgICAgVHJhbnNhY3Rpb25UeXBlLkFkZFZhbGlkYXRvcixcbiAgICAgICAgVHJhbnNhY3Rpb25UeXBlLkFkZERlbGVnYXRvcixcbiAgICAgICAgVHJhbnNhY3Rpb25UeXBlLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yLFxuICAgICAgICBUcmFuc2FjdGlvblR5cGUuQWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3IsXG4gICAgICBdO1xuXG4gICAgICBzdXBwb3J0ZWRUeXBlcy5mb3JFYWNoKCh0eXBlKSA9PiB7XG4gICAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICAgIHRyYW5zYWN0aW9uLnNldFRyYW5zYWN0aW9uVHlwZSh0eXBlKTtcbiAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHJhbnNhY3Rpb24uX3R5cGUsIHR5cGUpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgdW5zdXBwb3J0ZWQgdHJhbnNhY3Rpb24gdHlwZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgdHJhbnNhY3Rpb24uc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgIH0sIC9UcmFuc2FjdGlvbiB0eXBlIC4qIGlzIG5vdCBzdXBwb3J0ZWQvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0dldHRlcnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gY29ycmVjdCBmbGFyZVRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbW9ja1R4ID0gY3JlYXRlTW9ja1R4KCk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgdHJhbnNhY3Rpb24uc2V0VHJhbnNhY3Rpb24obW9ja1R4IGFzIGFueSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHJhbnNhY3Rpb24uZmxhcmVUcmFuc2FjdGlvbiwgbW9ja1R4KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGVtcHR5IHNpZ25hdHVyZSBhcnJheSB3aGVuIG5vIGNyZWRlbnRpYWxzJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbCh0cmFuc2FjdGlvbi5zaWduYXR1cmUsIFtdKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGVtcHR5IGNyZWRlbnRpYWxzIGFycmF5JywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbCh0cmFuc2FjdGlvbi5jcmVkZW50aWFscywgW10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2UgZm9yIGhhc0NyZWRlbnRpYWxzIHdoZW4gbm8gY3JlZGVudGlhbHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHJhbnNhY3Rpb24uaGFzQ3JlZGVudGlhbHMsIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHBsYWNlaG9sZGVyIElEIHdoZW4gbm8gdHJhbnNhY3Rpb24gc2V0JywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gVGhpcyBzaG91bGQgdGhyb3cgZXJyb3Igd2hlbiBubyB0cmFuc2FjdGlvbiBpcyBzZXRcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICB0cmFuc2FjdGlvbi5pZDtcbiAgICAgIH0sIEludmFsaWRUcmFuc2FjdGlvbkVycm9yKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHBsYWNlaG9sZGVyIHNpZ25hYmxlUGF5bG9hZCB3aGVuIG5vIHRyYW5zYWN0aW9uIHNldCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFRoaXMgc2hvdWxkIHRocm93IGVycm9yIHdoZW4gbm8gdHJhbnNhY3Rpb24gaXMgc2V0XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgdm9pZCB0cmFuc2FjdGlvbi5zaWduYWJsZVBheWxvYWQ7XG4gICAgICB9LCBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBmb3JtYXR0ZWQgZnJvbUFkZHJlc3NlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzID0gWydhZGRyZXNzMScsICdhZGRyZXNzMiddO1xuICAgICAgY29uc3QgYWRkcmVzc2VzID0gdHJhbnNhY3Rpb24uZnJvbUFkZHJlc3NlcztcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoYWRkcmVzc2VzLCBbJ2FkZHJlc3MxJywgJ2FkZHJlc3MyJ10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZm9ybWF0dGVkIHJld2FyZEFkZHJlc3NlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRyYW5zYWN0aW9uLl9yZXdhcmRBZGRyZXNzZXMgPSBbJ3Jld2FyZDEnLCAncmV3YXJkMiddO1xuICAgICAgY29uc3QgYWRkcmVzc2VzID0gdHJhbnNhY3Rpb24ucmV3YXJkQWRkcmVzc2VzO1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChhZGRyZXNzZXMsIFsncmV3YXJkMScsICdyZXdhcmQyJ10pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVHJhbnNhY3Rpb24gT3V0cHV0cycsIGZ1bmN0aW9uICgpIHtcbiAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHRyYW5zYWN0aW9uLl9ub2RlSUQgPSAndGVzdC1ub2RlLWlkJztcbiAgICAgIHRyYW5zYWN0aW9uLl9zdGFrZUFtb3VudCA9IEJpZ0ludCgnMTAwMDAwMDAwMDAwMDAwMCcpOyAvLyAxTSBGTFJcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGVtcHR5IG91dHB1dHMgZm9yIEV4cG9ydCB0eXBlJywgZnVuY3Rpb24gKCkge1xuICAgICAgdHJhbnNhY3Rpb24uc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZS5FeHBvcnQpO1xuICAgICAgY29uc3Qgb3V0cHV0cyA9IHRyYW5zYWN0aW9uLm91dHB1dHM7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKG91dHB1dHMsIFtdKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGVtcHR5IG91dHB1dHMgZm9yIEltcG9ydCB0eXBlJywgZnVuY3Rpb24gKCkge1xuICAgICAgdHJhbnNhY3Rpb24uc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZS5JbXBvcnQpO1xuICAgICAgY29uc3Qgb3V0cHV0cyA9IHRyYW5zYWN0aW9uLm91dHB1dHM7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKG91dHB1dHMsIFtdKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHN0YWtpbmcgb3V0cHV0cyBmb3IgQWRkVmFsaWRhdG9yIHR5cGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB0cmFuc2FjdGlvbi5zZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlLkFkZFZhbGlkYXRvcik7XG4gICAgICBjb25zdCBvdXRwdXRzID0gdHJhbnNhY3Rpb24ub3V0cHV0cztcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChvdXRwdXRzLmxlbmd0aCwgMSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwob3V0cHV0c1swXS5hZGRyZXNzLCAndGVzdC1ub2RlLWlkJyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwob3V0cHV0c1swXS52YWx1ZSwgJzEwMDAwMDAwMDAwMDAwMDAnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHN0YWtpbmcgb3V0cHV0cyBmb3IgQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3IgdHlwZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRyYW5zYWN0aW9uLnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3IpO1xuICAgICAgY29uc3Qgb3V0cHV0cyA9IHRyYW5zYWN0aW9uLm91dHB1dHM7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwob3V0cHV0cy5sZW5ndGgsIDEpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKG91dHB1dHNbMF0uYWRkcmVzcywgJ3Rlc3Qtbm9kZS1pZCcpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKG91dHB1dHNbMF0udmFsdWUsICcxMDAwMDAwMDAwMDAwMDAwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBzdGFraW5nIG91dHB1dHMgZm9yIEFkZERlbGVnYXRvciB0eXBlJywgZnVuY3Rpb24gKCkge1xuICAgICAgdHJhbnNhY3Rpb24uc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZS5BZGREZWxlZ2F0b3IpO1xuICAgICAgY29uc3Qgb3V0cHV0cyA9IHRyYW5zYWN0aW9uLm91dHB1dHM7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwob3V0cHV0cy5sZW5ndGgsIDEpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKG91dHB1dHNbMF0uYWRkcmVzcywgJ3Rlc3Qtbm9kZS1pZCcpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKG91dHB1dHNbMF0udmFsdWUsICcxMDAwMDAwMDAwMDAwMDAwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBzdGFraW5nIG91dHB1dHMgZm9yIEFkZFBlcm1pc3Npb25sZXNzRGVsZWdhdG9yIHR5cGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB0cmFuc2FjdGlvbi5zZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlLkFkZFBlcm1pc3Npb25sZXNzRGVsZWdhdG9yKTtcbiAgICAgIGNvbnN0IG91dHB1dHMgPSB0cmFuc2FjdGlvbi5vdXRwdXRzO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKG91dHB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChvdXRwdXRzWzBdLmFkZHJlc3MsICd0ZXN0LW5vZGUtaWQnKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChvdXRwdXRzWzBdLnZhbHVlLCAnMTAwMDAwMDAwMDAwMDAwMCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZW1wdHkgb3V0cHV0cyBmb3IgdW5rbm93biB0eXBlJywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gRG9uJ3Qgc2V0IHR5cGUsIHNob3VsZCBkZWZhdWx0IHRvIGVtcHR5XG4gICAgICBjb25zdCBvdXRwdXRzID0gdHJhbnNhY3Rpb24ub3V0cHV0cztcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwob3V0cHV0cywgW10pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVHJhbnNhY3Rpb24gSW5wdXRzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGlucHV0cyBmcm9tIFVUWE9zJywgZnVuY3Rpb24gKCkge1xuICAgICAgdHJhbnNhY3Rpb24uX3V0eG9zID0gW1xuICAgICAgICB7XG4gICAgICAgICAgb3V0cHV0SUQ6IDEsXG4gICAgICAgICAgYW1vdW50OiAnMTAwMDAwMCcsXG4gICAgICAgICAgdHhpZDogJ3Rlc3QtdHhpZC0xJyxcbiAgICAgICAgICBvdXRwdXRpZHg6ICcwJyxcbiAgICAgICAgICB0aHJlc2hvbGQ6IDIsXG4gICAgICAgICAgYWRkcmVzc2VzOiBbJ2FkZHIxJywgJ2FkZHIyJ10sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBvdXRwdXRJRDogMixcbiAgICAgICAgICBhbW91bnQ6ICcyMDAwMDAwJyxcbiAgICAgICAgICB0eGlkOiAndGVzdC10eGlkLTInLFxuICAgICAgICAgIG91dHB1dGlkeDogJzEnLFxuICAgICAgICAgIHRocmVzaG9sZDogMixcbiAgICAgICAgICBhZGRyZXNzZXM6IFsnYWRkcjMnLCAnYWRkcjQnXSxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgICB0cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3NlcyA9IFsnYWRkcjEnLCAnYWRkcjInLCAnYWRkcjMnLCAnYWRkcjQnXTtcblxuICAgICAgY29uc3QgaW5wdXRzID0gdHJhbnNhY3Rpb24uaW5wdXRzO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGlucHV0cy5sZW5ndGgsIDIpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGlucHV0c1swXS5pZCwgJ3Rlc3QtdHhpZC0xOjAnKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChpbnB1dHNbMF0udmFsdWUsICcxMDAwMDAwJyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaW5wdXRzWzBdLmFkZHJlc3MsICdhZGRyMX5hZGRyMn5hZGRyM35hZGRyNCcpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGlucHV0c1sxXS5pZCwgJ3Rlc3QtdHhpZC0yOjEnKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChpbnB1dHNbMV0udmFsdWUsICcyMDAwMDAwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBlbXB0eSBpbnB1dHMgd2hlbiBubyBVVFhPcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGlucHV0cyA9IHRyYW5zYWN0aW9uLmlucHV0cztcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoaW5wdXRzLCBbXSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdDaGFuZ2UgT3V0cHV0cycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBlbXB0eSBjaGFuZ2Ugb3V0cHV0cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGNoYW5nZU91dHB1dHMgPSB0cmFuc2FjdGlvbi5jaGFuZ2VPdXRwdXRzO1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChjaGFuZ2VPdXRwdXRzLCBbXSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdGZWUgSGFuZGxpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZGVmYXVsdCBmZWUgd2hlbiBubyBmZWUgc2V0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZmVlID0gdHJhbnNhY3Rpb24uZmVlO1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChmZWUsIHsgZmVlOiAnMCcgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBjdXN0b20gZmVlIHdoZW4gc2V0JywgZnVuY3Rpb24gKCkge1xuICAgICAgdHJhbnNhY3Rpb24uX2ZlZSA9IHsgZmVlOiAnMTAwMDAwMCcgfTtcbiAgICAgIGNvbnN0IGZlZSA9IHRyYW5zYWN0aW9uLmZlZTtcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoZmVlLCB7IGZlZTogJzEwMDAwMDAnIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnU2lnbmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQga2V5UGFpcjogS2V5UGFpcjtcblxuICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgLy8gQ3JlYXRlIGEgdGVzdCBrZXkgcGFpciB3aXRoIGEgcHJpdmF0ZSBrZXlcbiAgICAgIGtleVBhaXIgPSBuZXcgS2V5UGFpcih7IHBydjogJzAxJy5yZXBlYXQoMzIpIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciB3aGVuIG5vIHByaXZhdGUga2V5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZW1wdHlLZXlQYWlyID0gbmV3IEtleVBhaXIoKTtcblxuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0cmFuc2FjdGlvbi5zaWduKGVtcHR5S2V5UGFpcik7XG4gICAgICB9LCBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcik7IC8vIFdpbGwgdGhyb3cgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IgZm9yIGVtcHR5IHRyYW5zYWN0aW9uIGZpcnN0XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIHdoZW4gbm8gdHJhbnNhY3Rpb24gdG8gc2lnbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdHJhbnNhY3Rpb24uc2lnbihrZXlQYWlyKTtcbiAgICAgIH0sIEludmFsaWRUcmFuc2FjdGlvbkVycm9yKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIEZsYXJlSlMgc2lnbmluZyBub3QgaW1wbGVtZW50ZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBTZXQgYSBtb2NrIHRyYW5zYWN0aW9uIGFuZCBtb2NrIGNyZWRlbnRpYWxzIHRvIHBhc3MgdmFsaWRhdGlvblxuICAgICAgY29uc3QgbW9ja1R4ID0gY3JlYXRlTW9ja1R4KCk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgdHJhbnNhY3Rpb24uc2V0VHJhbnNhY3Rpb24obW9ja1R4IGFzIGFueSk7XG5cbiAgICAgIC8vIE1vY2sgaGFzQ3JlZGVudGlhbHMgdG8gcmV0dXJuIHRydWVcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0cmFuc2FjdGlvbiwgJ2hhc0NyZWRlbnRpYWxzJywge1xuICAgICAgICBnZXQ6ICgpID0+IHRydWUsXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0cmFuc2FjdGlvbi5zaWduKGtleVBhaXIpO1xuICAgICAgfSwgL0ZsYXJlSlMgc2lnbmluZyBub3QgeWV0IGltcGxlbWVudGVkLyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdTZXJpYWxpemF0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIHRvQnJvYWRjYXN0Rm9ybWF0IHdoZW4gbm8gdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgdHJhbnNhY3Rpb24udG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIH0sIEludmFsaWRUcmFuc2FjdGlvbkVycm9yKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHBsYWNlaG9sZGVyIGZvciB0b0Jyb2FkY2FzdEZvcm1hdCB3aGVuIHRyYW5zYWN0aW9uIHNldCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1vY2tUeCA9IGNyZWF0ZU1vY2tUeCgpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIHRyYW5zYWN0aW9uLnNldFRyYW5zYWN0aW9uKG1vY2tUeCBhcyBhbnkpO1xuICAgICAgY29uc3QgYnJvYWRjYXN0Rm9ybWF0ID0gdHJhbnNhY3Rpb24udG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChicm9hZGNhc3RGb3JtYXQsICdmbGFyZS10eC1oZXgtcGxhY2Vob2xkZXInKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIHRvSnNvbiB3aGVuIG5vIHRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICAgIHRyYW5zYWN0aW9uLnRvSnNvbigpO1xuICAgICAgfSwgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJhbnNhY3Rpb24gZGF0YSBmb3IgdG9Kc29uIHdoZW4gdHJhbnNhY3Rpb24gc2V0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbW9ja1R4ID0gY3JlYXRlTW9ja1R4KCk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgdHJhbnNhY3Rpb24uc2V0VHJhbnNhY3Rpb24obW9ja1R4IGFzIGFueSk7XG4gICAgICB0cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3NlcyA9IFsnYWRkcjEnXTtcbiAgICAgIHRyYW5zYWN0aW9uLl90aHJlc2hvbGQgPSAyO1xuICAgICAgdHJhbnNhY3Rpb24uX2xvY2t0aW1lID0gQmlnSW50KDEwMCk7XG5cbiAgICAgIGNvbnN0IGpzb25EYXRhID0gdHJhbnNhY3Rpb24udG9Kc29uKCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoanNvbkRhdGEuaWQsICdmbGFyZS10cmFuc2FjdGlvbi1pZC1wbGFjZWhvbGRlcicpO1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChqc29uRGF0YS5mcm9tQWRkcmVzc2VzLCBbJ2FkZHIxJ10pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGpzb25EYXRhLnRocmVzaG9sZCwgMik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoanNvbkRhdGEubG9ja3RpbWUsICcxMDAnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0Nyb3NzLWNoYWluIFByb3BlcnRpZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBpZGVudGlmeSBFeHBvcnQgYXMgY3Jvc3MtY2hhaW4gdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICB0cmFuc2FjdGlvbi5zZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlLkV4cG9ydCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHJhbnNhY3Rpb24uaXNUcmFuc2FjdGlvbkZvckNDaGFpbiwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGlkZW50aWZ5IEltcG9ydCBhcyBjcm9zcy1jaGFpbiB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRyYW5zYWN0aW9uLnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuSW1wb3J0KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0cmFuc2FjdGlvbi5pc1RyYW5zYWN0aW9uRm9yQ0NoYWluLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaWRlbnRpZnkgQWRkVmFsaWRhdG9yIGFzIG5vbi1jcm9zcy1jaGFpbiB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRyYW5zYWN0aW9uLnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuQWRkVmFsaWRhdG9yKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0cmFuc2FjdGlvbi5pc1RyYW5zYWN0aW9uRm9yQ0NoYWluLCBmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdUcmFuc2FjdGlvbiBFeHBsYW5hdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1vY2tUeCA9IGNyZWF0ZU1vY2tUeCgpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIHRyYW5zYWN0aW9uLnNldFRyYW5zYWN0aW9uKG1vY2tUeCBhcyBhbnkpO1xuICAgICAgdHJhbnNhY3Rpb24uX2Zyb21BZGRyZXNzZXMgPSBbJ3Rlc3QtYWRkcmVzcyddO1xuICAgICAgdHJhbnNhY3Rpb24uX2ZlZSA9IHsgZmVlOiAnMTAwMDAwMCcgfTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXhwbGFpbiBhIGJhc2ljIHRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgdHJhbnNhY3Rpb24uc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZS5FeHBvcnQpO1xuXG4gICAgICBjb25zdCBleHBsYW5hdGlvbiA9IHRyYW5zYWN0aW9uLmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuICAgICAgYXNzZXJ0Lm9rKGV4cGxhbmF0aW9uLmRpc3BsYXlPcmRlcik7XG4gICAgICBhc3NlcnQub2soQXJyYXkuaXNBcnJheShleHBsYW5hdGlvbi5kaXNwbGF5T3JkZXIpKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChleHBsYW5hdGlvbi5pZCwgJ2ZsYXJlLXRyYW5zYWN0aW9uLWlkLXBsYWNlaG9sZGVyJyk7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKGV4cGxhbmF0aW9uLmZlZSwgeyBmZWU6ICcxMDAwMDAwJyB9KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChleHBsYW5hdGlvbi50eXBlLCBUcmFuc2FjdGlvblR5cGUuRXhwb3J0KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaW5jbHVkZSByZXdhcmQgYWRkcmVzc2VzIGZvciBzdGFraW5nIHRyYW5zYWN0aW9ucycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRyYW5zYWN0aW9uLnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuQWRkVmFsaWRhdG9yKTtcbiAgICAgIHRyYW5zYWN0aW9uLl9yZXdhcmRBZGRyZXNzZXMgPSBbJ3Jld2FyZC1hZGRyLTEnXTtcblxuICAgICAgY29uc3QgZXhwbGFuYXRpb24gPSB0cmFuc2FjdGlvbi5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgICAgIGFzc2VydC5vayhleHBsYW5hdGlvbi5kaXNwbGF5T3JkZXIpO1xuICAgICAgYXNzZXJ0Lm9rKGV4cGxhbmF0aW9uLmRpc3BsYXlPcmRlci5pbmNsdWRlcygncmV3YXJkQWRkcmVzc2VzJykpO1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChleHBsYW5hdGlvbi5yZXdhcmRBZGRyZXNzZXMsIFsncmV3YXJkLWFkZHItMSddKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaW5jbHVkZSBjcm9zcy1jaGFpbiBpbmZvcm1hdGlvbiBmb3IgZXhwb3J0L2ltcG9ydCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRyYW5zYWN0aW9uLnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuRXhwb3J0KTtcblxuICAgICAgY29uc3QgZXhwbGFuYXRpb24gPSB0cmFuc2FjdGlvbi5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgICAgIGFzc2VydC5vayhleHBsYW5hdGlvbi5kaXNwbGF5T3JkZXIpO1xuICAgICAgYXNzZXJ0Lm9rKGV4cGxhbmF0aW9uLmRpc3BsYXlPcmRlci5pbmNsdWRlcygnc291cmNlQ2hhaW4nKSk7XG4gICAgICBhc3NlcnQub2soZXhwbGFuYXRpb24uZGlzcGxheU9yZGVyLmluY2x1ZGVzKCdkZXN0aW5hdGlvbkNoYWluJykpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjYWxjdWxhdGUgb3V0cHV0IGFtb3VudHMgY29ycmVjdGx5JywgZnVuY3Rpb24gKCkge1xuICAgICAgdHJhbnNhY3Rpb24uX25vZGVJRCA9ICd0ZXN0LW5vZGUnO1xuICAgICAgdHJhbnNhY3Rpb24uX3N0YWtlQW1vdW50ID0gQmlnSW50KCc1MDAwMDAwMDAwMDAwMDAwJyk7XG4gICAgICB0cmFuc2FjdGlvbi5zZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlLkFkZFZhbGlkYXRvcik7XG5cbiAgICAgIGNvbnN0IGV4cGxhbmF0aW9uID0gdHJhbnNhY3Rpb24uZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZXhwbGFuYXRpb24ub3V0cHV0QW1vdW50LCAnNTAwMDAwMDAwMDAwMDAwMCcpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGV4cGxhbmF0aW9uLmNoYW5nZUFtb3VudCwgJzAnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1NpZ25hdHVyZSBDcmVhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGNyZWF0ZSBzaWduYXR1cmUgcGxhY2Vob2xkZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBtb2NrUHJpdmF0ZUtleSA9IEJ1ZmZlci5mcm9tKCcxMjM0NTY3ODkwYWJjZGVmMTIzNDU2Nzg5MGFiY2RlZjEyMzQ1Njc4OTBhYmNkZWYxMjM0NTY3ODkwYWJjZGVmJywgJ2hleCcpO1xuICAgICAgY29uc3QgbW9ja1R4ID0gY3JlYXRlTW9ja1R4KCk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgdHJhbnNhY3Rpb24uc2V0VHJhbnNhY3Rpb24obW9ja1R4IGFzIGFueSk7XG5cbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IHRyYW5zYWN0aW9uLmNyZWF0ZVNpZ25hdHVyZShtb2NrUHJpdmF0ZUtleSk7XG4gICAgICBhc3NlcnQub2sodHlwZW9mIHNpZ25hdHVyZSA9PT0gJ3N0cmluZycpO1xuICAgICAgYXNzZXJ0Lm9rKHNpZ25hdHVyZS5sZW5ndGggPiAwKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1ZhbGlkYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBhbGxvdyBzaWduaW5nIHdpdGggdmFsaWQga2V5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qga2V5UGFpciA9IG5ldyBLZXlQYWlyKHsgcHJ2OiAnMDEnLnJlcGVhdCgzMikgfSk7XG5cbiAgICAgIGNvbnN0IGNhblNpZ24gPSB0cmFuc2FjdGlvbi5jYW5TaWduKHsga2V5OiBrZXlQYWlyIH0pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGNhblNpZ24sIHRydWUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVHJhbnNhY3Rpb24gU2V0dGluZycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHNldCB0cmFuc2FjdGlvbiBjb3JyZWN0bHknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBtb2NrVHggPSBjcmVhdGVNb2NrVHgoKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICB0cmFuc2FjdGlvbi5zZXRUcmFuc2FjdGlvbihtb2NrVHggYXMgYW55KTtcbiAgICAgIC8vIENhbid0IGRpcmVjdGx5IGFjY2VzcyBfZmxhcmVUcmFuc2FjdGlvbiAocHJvdGVjdGVkKSwgYnV0IGNhbiB0ZXN0IHZpYSBnZXR0ZXJcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0cmFuc2FjdGlvbi5mbGFyZVRyYW5zYWN0aW9uLCBtb2NrVHgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnSGV4IENvbnZlcnNpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBjb252ZXJ0IGJ5dGUgYXJyYXkgdG8gaGV4IHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ5dGVBcnJheSA9IG5ldyBVaW50OEFycmF5KFsweDAxLCAweDIzLCAweGFiLCAweGNkXSk7XG4gICAgICBjb25zdCBoZXhTdHJpbmcgPSB0cmFuc2FjdGlvbi50b0hleFN0cmluZyhieXRlQXJyYXkpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGhleFN0cmluZywgJzAxMjNhYmNkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBlbXB0eSBieXRlIGFycmF5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnl0ZUFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoW10pO1xuICAgICAgY29uc3QgaGV4U3RyaW5nID0gdHJhbnNhY3Rpb24udG9IZXhTdHJpbmcoYnl0ZUFycmF5KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChoZXhTdHJpbmcsICcnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ01lbW8gRnVuY3Rpb25hbGl0eScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGluaXRpYWxpemUgd2l0aCBlbXB0eSBtZW1vJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRyYW5zYWN0aW9uLmhhc01lbW8oKSwgZmFsc2UpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRyYW5zYWN0aW9uLmdldE1lbW9TdHJpbmcoKSwgJycpO1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbCh0cmFuc2FjdGlvbi5nZXRNZW1vQnl0ZXMoKSwgbmV3IFVpbnQ4QXJyYXkoKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNldCBtZW1vIGZyb20gc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbWVtb1RleHQgPSAnVGVzdCB0cmFuc2FjdGlvbiBtZW1vJztcbiAgICAgIHRyYW5zYWN0aW9uLnNldE1lbW8obWVtb1RleHQpO1xuXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHJhbnNhY3Rpb24uaGFzTWVtbygpLCB0cnVlKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0cmFuc2FjdGlvbi5nZXRNZW1vU3RyaW5nKCksIG1lbW9UZXh0KTtcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwodHJhbnNhY3Rpb24uZ2V0TWVtb0J5dGVzKCksIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShtZW1vVGV4dCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzZXQgbWVtbyBmcm9tIEpTT04gb2JqZWN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbWVtb09iaiA9IHsgdXNlcjogJ2FsaWNlJywgYW1vdW50OiAxMDAwIH07XG4gICAgICB0cmFuc2FjdGlvbi5zZXRNZW1vRGF0YShtZW1vT2JqKTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRyYW5zYWN0aW9uLmhhc01lbW8oKSwgdHJ1ZSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHJhbnNhY3Rpb24uZ2V0TWVtb1N0cmluZygpLCBKU09OLnN0cmluZ2lmeShtZW1vT2JqKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNldCBtZW1vIGZyb20gYnl0ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBtZW1vQnl0ZXMgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoJ0JpbmFyeSBtZW1vIGRhdGEnKTtcbiAgICAgIHRyYW5zYWN0aW9uLnNldE1lbW9EYXRhKG1lbW9CeXRlcyk7XG5cbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0cmFuc2FjdGlvbi5oYXNNZW1vKCksIHRydWUpO1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbCh0cmFuc2FjdGlvbi5nZXRNZW1vQnl0ZXMoKSwgbWVtb0J5dGVzKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0cmFuc2FjdGlvbi5nZXRNZW1vU3RyaW5nKCksICdCaW5hcnkgbWVtbyBkYXRhJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBlbXB0eSBzdHJpbmcgbWVtbycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRyYW5zYWN0aW9uLnNldE1lbW8oJycpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRyYW5zYWN0aW9uLmhhc01lbW8oKSwgZmFsc2UpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRyYW5zYWN0aW9uLmdldE1lbW9TdHJpbmcoKSwgJycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgVVRGLTggbWVtbycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHV0ZjhNZW1vID0gJ0hlbGxvIOS4lueVjCDwn4yNIEZsYXJlISc7XG4gICAgICB0cmFuc2FjdGlvbi5zZXRNZW1vKHV0ZjhNZW1vKTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRyYW5zYWN0aW9uLmhhc01lbW8oKSwgdHJ1ZSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHJhbnNhY3Rpb24uZ2V0TWVtb1N0cmluZygpLCB1dGY4TWVtbyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGluY2x1ZGUgbWVtbyBpbiB0cmFuc2FjdGlvbiBKU09OIHdoZW4gcHJlc2VudCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1lbW9UZXh0ID0gJ1RyYW5zYWN0aW9uIG1ldGFkYXRhJztcbiAgICAgIHRyYW5zYWN0aW9uLnNldE1lbW8obWVtb1RleHQpO1xuXG4gICAgICAvLyBNb2NrIHRoZSBGbGFyZUpTIHRyYW5zYWN0aW9uXG4gICAgICBjb25zdCBtb2NrVHggPSBjcmVhdGVNb2NrVHgoKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICB0cmFuc2FjdGlvbi5zZXRUcmFuc2FjdGlvbihtb2NrVHggYXMgYW55KTtcbiAgICAgIHRyYW5zYWN0aW9uLnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuRXhwb3J0KTtcblxuICAgICAgY29uc3QgdHhEYXRhID0gdHJhbnNhY3Rpb24udG9Kc29uKCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHhEYXRhLm1lbW8sIG1lbW9UZXh0KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IGluY2x1ZGUgbWVtbyBpbiBKU09OIHdoZW4gZW1wdHknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBNb2NrIHRoZSBGbGFyZUpTIHRyYW5zYWN0aW9uXG4gICAgICBjb25zdCBtb2NrVHggPSBjcmVhdGVNb2NrVHgoKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICB0cmFuc2FjdGlvbi5zZXRUcmFuc2FjdGlvbihtb2NrVHggYXMgYW55KTtcbiAgICAgIHRyYW5zYWN0aW9uLnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuRXhwb3J0KTtcblxuICAgICAgY29uc3QgdHhEYXRhID0gdHJhbnNhY3Rpb24udG9Kc29uKCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHhEYXRhLm1lbW8sICcnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgbWVtbyBzaXplIGxpbWl0cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFRlc3QgbGFyZ2UgbWVtbyAtIHRoaXMgc2hvdWxkIGJlIHZhbGlkYXRlZCBieSB1dGlsc1xuICAgICAgY29uc3QgbGFyZ2VNZW1vID0gJ3gnLnJlcGVhdCg1MDAwKTsgLy8gNUtCIG1lbW9cbiAgICAgIHRyYW5zYWN0aW9uLnNldE1lbW8obGFyZ2VNZW1vKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0cmFuc2FjdGlvbi5nZXRNZW1vU3RyaW5nKCksIGxhcmdlTWVtbyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gbWVtbycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNwZWNpYWxNZW1vID0gJ1NwZWNpYWwgY2hhcnM6IFxcblxcdFxcclxcMFxceDAxXFx4ZmYnO1xuICAgICAgdHJhbnNhY3Rpb24uc2V0TWVtbyhzcGVjaWFsTWVtbyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHJhbnNhY3Rpb24uZ2V0TWVtb1N0cmluZygpLCBzcGVjaWFsTWVtbyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBpbnZhbGlkIG1lbW8gZm9ybWF0IGluIHNldE1lbW9EYXRhJywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gVGhpcyBzaG91bGQgYmUgdGVzdGVkIGluIHV0aWxzLCBidXQgd2UgY2FuIGNoZWNrIGJhc2ljIGJlaGF2aW9yXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgdHJhbnNhY3Rpb24uc2V0TWVtb0RhdGEoMTIzIGFzIGFueSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"permissionlessValidatorTxBuilder.test.d.ts","sourceRoot":"","sources":["../../../test/unit/permissionlessValidatorTxBuilder.test.ts"],"names":[],"mappings":""}
|