@bitgo-beta/sdk-coin-flrp 1.0.1-beta.25 → 1.0.1-beta.251
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/lib/atomicTransactionBuilder.d.ts +10 -7
- package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/atomicTransactionBuilder.js +155 -89
- package/dist/src/lib/constants.d.ts +160 -1
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +213 -3
- package/dist/src/lib/delegatorTxBuilder.d.ts +58 -0
- package/dist/src/lib/delegatorTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/delegatorTxBuilder.js +224 -0
- package/dist/src/lib/exportInCTxBuilder.d.ts +1 -1
- package/dist/src/lib/exportInCTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/exportInCTxBuilder.js +46 -17
- package/dist/src/lib/exportInPTxBuilder.d.ts +1 -1
- package/dist/src/lib/exportInPTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/exportInPTxBuilder.js +70 -6
- package/dist/src/lib/importInCTxBuilder.d.ts +67 -0
- package/dist/src/lib/importInCTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/importInCTxBuilder.js +403 -0
- package/dist/src/lib/importInPTxBuilder.d.ts +73 -0
- package/dist/src/lib/importInPTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/importInPTxBuilder.js +464 -0
- package/dist/src/lib/index.d.ts +5 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +11 -2
- package/dist/src/lib/keyPair.d.ts +4 -4
- 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 +81 -0
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/permissionlessValidatorTxBuilder.js +248 -0
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +14 -13
- package/dist/src/lib/transactionBuilder.d.ts +85 -0
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder.js +167 -0
- package/dist/src/lib/types.d.ts +78 -0
- package/dist/src/lib/types.d.ts.map +1 -0
- package/dist/src/lib/types.js +5 -0
- package/dist/src/lib/utils.d.ts +28 -23
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +161 -65
- package/dist/src/lib/validatorTxBuilder.d.ts +40 -0
- package/dist/src/lib/validatorTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/validatorTxBuilder.js +180 -0
- package/dist/test/resources/account.d.ts +49 -0
- package/dist/test/resources/account.d.ts.map +1 -0
- package/dist/test/resources/account.js +52 -0
- package/dist/test/unit/delegatorTxBuilder.test.d.ts +2 -0
- package/dist/test/unit/delegatorTxBuilder.test.d.ts.map +1 -0
- package/dist/test/unit/delegatorTxBuilder.test.js +233 -0
- package/dist/test/unit/lib/exportInCTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/exportInCTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/exportInCTxBuilder.js +584 -0
- package/dist/test/unit/lib/exportInPTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/exportInPTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/exportInPTxBuilder.js +377 -0
- package/dist/test/unit/lib/importInCTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/importInCTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/importInCTxBuilder.js +258 -0
- package/dist/test/unit/lib/importInPTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/importInPTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/importInPTxBuilder.js +501 -0
- package/dist/test/unit/lib/keyPair.d.ts +2 -0
- package/dist/test/unit/lib/keyPair.d.ts.map +1 -0
- package/dist/test/unit/lib/keyPair.js +158 -0
- package/dist/test/unit/lib/utils.js +122 -43
- package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts +2 -0
- package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts.map +1 -0
- package/dist/test/unit/permissionlessValidatorTxBuilder.test.js +271 -0
- package/dist/test/unit/transactionBuilder.test.d.ts +2 -0
- package/dist/test/unit/transactionBuilder.test.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder.test.js +114 -0
- package/dist/test/unit/validatorTxBuilder.test.d.ts +2 -0
- package/dist/test/unit/validatorTxBuilder.test.d.ts.map +1 -0
- package/dist/test/unit/validatorTxBuilder.test.js +293 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +15 -10
- package/.eslintignore +0 -5
- package/.eslintrc.json +0 -7
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -0
- package/dist/test/unit/lib/exportTxBuilder.d.ts +0 -2
- package/dist/test/unit/lib/exportTxBuilder.d.ts.map +0 -1
- package/dist/test/unit/lib/exportTxBuilder.js +0 -45
|
@@ -0,0 +1,501 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
40
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
41
|
+
const assert = __importStar(require("assert"));
|
|
42
|
+
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
43
|
+
const importInPTxBuilder_1 = require("../../../src/lib/importInPTxBuilder");
|
|
44
|
+
describe('ImportInPTxBuilder', function () {
|
|
45
|
+
const coinConfig = statics_1.coins.get('tflrp');
|
|
46
|
+
let builder;
|
|
47
|
+
beforeEach(function () {
|
|
48
|
+
builder = new importInPTxBuilder_1.ImportInPTxBuilder(coinConfig);
|
|
49
|
+
});
|
|
50
|
+
describe('Constructor', function () {
|
|
51
|
+
it('should initialize with coin config', function () {
|
|
52
|
+
assert.ok(builder);
|
|
53
|
+
assert.ok(builder instanceof importInPTxBuilder_1.ImportInPTxBuilder);
|
|
54
|
+
});
|
|
55
|
+
it('should initialize with default values', function () {
|
|
56
|
+
// Builder should be initialized without throwing errors
|
|
57
|
+
assert.ok(builder);
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
describe('UTXO Management', function () {
|
|
61
|
+
it('should add single UTXO', function () {
|
|
62
|
+
const utxo = {
|
|
63
|
+
outputID: 1,
|
|
64
|
+
amount: '1000000000000000000', // 1 FLR
|
|
65
|
+
txid: 'test-txid-single',
|
|
66
|
+
outputidx: '0',
|
|
67
|
+
threshold: 1,
|
|
68
|
+
addresses: ['C-flare1test'],
|
|
69
|
+
};
|
|
70
|
+
assert.doesNotThrow(() => {
|
|
71
|
+
builder.addUtxos([utxo]);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
it('should add multiple UTXOs', function () {
|
|
75
|
+
const utxos = [
|
|
76
|
+
{
|
|
77
|
+
outputID: 1,
|
|
78
|
+
amount: '1000000000000000000', // 1 FLR
|
|
79
|
+
txid: 'test-txid-1',
|
|
80
|
+
outputidx: '0',
|
|
81
|
+
threshold: 1,
|
|
82
|
+
addresses: ['C-flare1test1'],
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
outputID: 2,
|
|
86
|
+
amount: '2000000000000000000', // 2 FLR
|
|
87
|
+
txid: 'test-txid-2',
|
|
88
|
+
outputidx: '1',
|
|
89
|
+
threshold: 2,
|
|
90
|
+
addresses: ['C-flare1test2', 'C-flare1test3'],
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
outputID: 3,
|
|
94
|
+
amount: '500000000000000000', // 0.5 FLR
|
|
95
|
+
txid: 'test-txid-3',
|
|
96
|
+
outputidx: '0',
|
|
97
|
+
threshold: 1,
|
|
98
|
+
addresses: ['C-flare1test4'],
|
|
99
|
+
},
|
|
100
|
+
];
|
|
101
|
+
assert.doesNotThrow(() => {
|
|
102
|
+
builder.addUtxos(utxos);
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
it('should handle empty UTXO array', function () {
|
|
106
|
+
assert.doesNotThrow(() => {
|
|
107
|
+
builder.addUtxos([]);
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
it('should accumulate UTXOs from multiple calls', function () {
|
|
111
|
+
const utxos1 = [
|
|
112
|
+
{
|
|
113
|
+
outputID: 1,
|
|
114
|
+
amount: '1000000000000000000',
|
|
115
|
+
txid: 'test-txid-1',
|
|
116
|
+
outputidx: '0',
|
|
117
|
+
threshold: 1,
|
|
118
|
+
addresses: ['C-flare1test1'],
|
|
119
|
+
},
|
|
120
|
+
];
|
|
121
|
+
const utxos2 = [
|
|
122
|
+
{
|
|
123
|
+
outputID: 2,
|
|
124
|
+
amount: '2000000000000000000',
|
|
125
|
+
txid: 'test-txid-2',
|
|
126
|
+
outputidx: '0',
|
|
127
|
+
threshold: 1,
|
|
128
|
+
addresses: ['C-flare1test2'],
|
|
129
|
+
},
|
|
130
|
+
];
|
|
131
|
+
builder.addUtxos(utxos1);
|
|
132
|
+
builder.addUtxos(utxos2);
|
|
133
|
+
// Should not throw
|
|
134
|
+
assert.ok(true);
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
describe('Fee Management', function () {
|
|
138
|
+
it('should set valid positive fee', function () {
|
|
139
|
+
const validFees = ['1000', '0', '1000000000000000000', '999999999999999999'];
|
|
140
|
+
validFees.forEach((fee) => {
|
|
141
|
+
assert.doesNotThrow(() => {
|
|
142
|
+
builder.fee(fee);
|
|
143
|
+
}, `Should accept fee: ${fee}`);
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
it('should reject negative fees', function () {
|
|
147
|
+
const negativeFees = ['-1', '-1000', '-1000000000000000000'];
|
|
148
|
+
negativeFees.forEach((fee) => {
|
|
149
|
+
assert.throws(() => {
|
|
150
|
+
builder.fee(fee);
|
|
151
|
+
}, sdk_core_1.BuildTransactionError, `Should reject negative fee: ${fee}`);
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
it('should handle invalid fee formats (BigNumber behavior)', function () {
|
|
155
|
+
const invalidFees = ['abc', 'not-a-number', '1.5.5', 'infinity'];
|
|
156
|
+
invalidFees.forEach((fee) => {
|
|
157
|
+
// BigNumber doesn't throw for invalid strings, it creates NaN values
|
|
158
|
+
// But our implementation should still accept them (no additional validation)
|
|
159
|
+
assert.doesNotThrow(() => {
|
|
160
|
+
builder.fee(fee);
|
|
161
|
+
}, `BigNumber accepts invalid strings: ${fee}`);
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
it('should handle BigNumber fee inputs', function () {
|
|
165
|
+
const bigNumberFee = new bignumber_js_1.default('1000000000000000000');
|
|
166
|
+
assert.doesNotThrow(() => {
|
|
167
|
+
builder.fee(bigNumberFee.toString());
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
it('should chain fee setting with other methods', function () {
|
|
171
|
+
const fee = '1000';
|
|
172
|
+
const utxo = {
|
|
173
|
+
outputID: 1,
|
|
174
|
+
amount: '1000000000000000000',
|
|
175
|
+
txid: 'test-txid',
|
|
176
|
+
outputidx: '0',
|
|
177
|
+
threshold: 1,
|
|
178
|
+
addresses: ['C-flare1test'],
|
|
179
|
+
};
|
|
180
|
+
assert.doesNotThrow(() => {
|
|
181
|
+
builder.fee(fee).addUtxos([utxo]);
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
describe('Locktime Management', function () {
|
|
186
|
+
it('should set valid locktime values', function () {
|
|
187
|
+
const validLocktimes = [0, 1, 1000, 4294967295]; // Max uint32
|
|
188
|
+
validLocktimes.forEach((locktime) => {
|
|
189
|
+
assert.doesNotThrow(() => {
|
|
190
|
+
builder.locktime(locktime);
|
|
191
|
+
}, `Should accept locktime: ${locktime}`);
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
it('should handle negative locktime (no validation)', function () {
|
|
195
|
+
const negativeLocktimes = [-1, -1000];
|
|
196
|
+
negativeLocktimes.forEach((locktime) => {
|
|
197
|
+
assert.doesNotThrow(() => {
|
|
198
|
+
builder.locktime(locktime);
|
|
199
|
+
}, `Should accept negative locktime: ${locktime} (no validation in implementation)`);
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
it('should handle boundary values', function () {
|
|
203
|
+
const boundaryValues = [0, 4294967295]; // Min and max uint32
|
|
204
|
+
boundaryValues.forEach((locktime) => {
|
|
205
|
+
assert.doesNotThrow(() => {
|
|
206
|
+
builder.locktime(locktime);
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
it('should chain locktime setting with other methods', function () {
|
|
211
|
+
const locktime = 123456;
|
|
212
|
+
const fee = '1000';
|
|
213
|
+
assert.doesNotThrow(() => {
|
|
214
|
+
builder.locktime(locktime).fee(fee);
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
describe('Threshold Management', function () {
|
|
219
|
+
it('should set valid threshold values', function () {
|
|
220
|
+
const validThresholds = [1, 2, 5, 10];
|
|
221
|
+
validThresholds.forEach((threshold) => {
|
|
222
|
+
assert.doesNotThrow(() => {
|
|
223
|
+
builder.threshold(threshold);
|
|
224
|
+
}, `Should accept threshold: ${threshold}`);
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
it('should reject invalid threshold values', function () {
|
|
228
|
+
const invalidThresholds = [0, -1, -10];
|
|
229
|
+
invalidThresholds.forEach((threshold) => {
|
|
230
|
+
assert.throws(() => {
|
|
231
|
+
builder.threshold(threshold);
|
|
232
|
+
}, sdk_core_1.BuildTransactionError, `Should reject threshold: ${threshold}`);
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
it('should handle typical threshold scenarios', function () {
|
|
236
|
+
// Single signature
|
|
237
|
+
assert.doesNotThrow(() => {
|
|
238
|
+
builder.threshold(1);
|
|
239
|
+
});
|
|
240
|
+
// Multi-signature
|
|
241
|
+
assert.doesNotThrow(() => {
|
|
242
|
+
builder.threshold(3);
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
it('should chain threshold setting with other methods', function () {
|
|
246
|
+
const threshold = 2;
|
|
247
|
+
const locktime = 123456;
|
|
248
|
+
assert.doesNotThrow(() => {
|
|
249
|
+
builder.threshold(threshold).locktime(locktime);
|
|
250
|
+
});
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
describe('Source Chain Management', function () {
|
|
254
|
+
// TODO : Enable these tests after fixing sourceChain method to accept P-chain IDs
|
|
255
|
+
it.skip('should set valid source chain IDs', function () {
|
|
256
|
+
const validChainIds = ['C-flare12345', 'NodeID-flare67890', '0x123456789abcdef', 'abc123def456'];
|
|
257
|
+
validChainIds.forEach((chainId) => {
|
|
258
|
+
assert.doesNotThrow(() => {
|
|
259
|
+
builder.sourceChain(chainId);
|
|
260
|
+
}, `Should accept chain ID: ${chainId}`);
|
|
261
|
+
});
|
|
262
|
+
});
|
|
263
|
+
it('should handle different chain ID formats', function () {
|
|
264
|
+
const chainIds = ['C-chain-id-123', 'P-chain-id-456', 'hex-formatted-id', '1234567890abcdef'];
|
|
265
|
+
chainIds.forEach((chainId) => {
|
|
266
|
+
assert.doesNotThrow(() => {
|
|
267
|
+
builder.sourceChain(chainId);
|
|
268
|
+
});
|
|
269
|
+
});
|
|
270
|
+
});
|
|
271
|
+
});
|
|
272
|
+
describe('Input/Output Creation', function () {
|
|
273
|
+
it('should test public methods only due to protected access', function () {
|
|
274
|
+
// Note: createInputOutput is protected, so we test through public interface
|
|
275
|
+
// Test that we can set parameters that would be used by createInputOutput
|
|
276
|
+
assert.doesNotThrow(() => {
|
|
277
|
+
builder.fee('1000');
|
|
278
|
+
builder.threshold(1);
|
|
279
|
+
// Protected method cannot be tested directly
|
|
280
|
+
});
|
|
281
|
+
});
|
|
282
|
+
it('should handle configuration for output creation', function () {
|
|
283
|
+
const fee = '1000';
|
|
284
|
+
const locktime = 0;
|
|
285
|
+
const threshold = 1;
|
|
286
|
+
assert.doesNotThrow(() => {
|
|
287
|
+
builder.fee(fee).locktime(locktime).threshold(threshold);
|
|
288
|
+
});
|
|
289
|
+
});
|
|
290
|
+
it('should allow setting parameters for large amounts', function () {
|
|
291
|
+
const locktime = 0;
|
|
292
|
+
const threshold = 1;
|
|
293
|
+
assert.doesNotThrow(() => {
|
|
294
|
+
builder.fee('1000').locktime(locktime).threshold(threshold);
|
|
295
|
+
});
|
|
296
|
+
});
|
|
297
|
+
it('should configure for different threshold scenarios', function () {
|
|
298
|
+
const locktime = 0;
|
|
299
|
+
// Test different thresholds
|
|
300
|
+
[1, 2, 3].forEach((threshold) => {
|
|
301
|
+
assert.doesNotThrow(() => {
|
|
302
|
+
builder.threshold(threshold).locktime(locktime);
|
|
303
|
+
});
|
|
304
|
+
});
|
|
305
|
+
});
|
|
306
|
+
});
|
|
307
|
+
describe('Transaction Type Verification', function () {
|
|
308
|
+
it('should verify transaction type (placeholder)', function () {
|
|
309
|
+
const mockTx = { type: 'import' };
|
|
310
|
+
const result = importInPTxBuilder_1.ImportInPTxBuilder.verifyTxType(mockTx);
|
|
311
|
+
assert.strictEqual(result, true); // Placeholder returns true
|
|
312
|
+
});
|
|
313
|
+
it('should handle different transaction objects', function () {
|
|
314
|
+
const testCases = [{}, null, undefined, { type: 'export' }, { data: 'test' }];
|
|
315
|
+
testCases.forEach((testCase, index) => {
|
|
316
|
+
const result = importInPTxBuilder_1.ImportInPTxBuilder.verifyTxType(testCase);
|
|
317
|
+
assert.strictEqual(result, true, `Test case ${index} should return true (placeholder)`);
|
|
318
|
+
});
|
|
319
|
+
});
|
|
320
|
+
it('should verify via instance method', function () {
|
|
321
|
+
const mockTx = { type: 'import' };
|
|
322
|
+
const result = builder.verifyTxType(mockTx);
|
|
323
|
+
assert.strictEqual(result, true);
|
|
324
|
+
});
|
|
325
|
+
});
|
|
326
|
+
describe('Transaction Building Preparation', function () {
|
|
327
|
+
it('should prepare basic import transaction parameters', function () {
|
|
328
|
+
const fee = '1000';
|
|
329
|
+
const locktime = 123456;
|
|
330
|
+
const threshold = 2;
|
|
331
|
+
const chainId = 'C-source-chain-123';
|
|
332
|
+
const utxos = [
|
|
333
|
+
{
|
|
334
|
+
outputID: 1,
|
|
335
|
+
amount: '1000000000000000000',
|
|
336
|
+
txid: 'test-txid',
|
|
337
|
+
outputidx: '0',
|
|
338
|
+
threshold: 1,
|
|
339
|
+
addresses: ['C-flare1test'],
|
|
340
|
+
},
|
|
341
|
+
];
|
|
342
|
+
// Set all parameters
|
|
343
|
+
builder.fee(fee).locktime(locktime).threshold(threshold).sourceChain(chainId).addUtxos(utxos);
|
|
344
|
+
// Should not throw
|
|
345
|
+
assert.ok(true);
|
|
346
|
+
});
|
|
347
|
+
it('should handle minimal configuration', function () {
|
|
348
|
+
const fee = '0';
|
|
349
|
+
const utxos = [
|
|
350
|
+
{
|
|
351
|
+
outputID: 1,
|
|
352
|
+
amount: '1000000000000000000',
|
|
353
|
+
txid: 'test-txid',
|
|
354
|
+
outputidx: '0',
|
|
355
|
+
threshold: 1,
|
|
356
|
+
addresses: ['C-flare1test'],
|
|
357
|
+
},
|
|
358
|
+
];
|
|
359
|
+
builder.fee(fee).addUtxos(utxos);
|
|
360
|
+
// Should not throw
|
|
361
|
+
assert.ok(true);
|
|
362
|
+
});
|
|
363
|
+
});
|
|
364
|
+
describe('Complex Scenarios', function () {
|
|
365
|
+
it('should handle multiple UTXOs with different properties', function () {
|
|
366
|
+
const utxos = [
|
|
367
|
+
{
|
|
368
|
+
outputID: 1,
|
|
369
|
+
amount: '1000000000000000000',
|
|
370
|
+
txid: 'test-txid-1',
|
|
371
|
+
outputidx: '0',
|
|
372
|
+
threshold: 1,
|
|
373
|
+
addresses: ['C-flare1single'],
|
|
374
|
+
},
|
|
375
|
+
{
|
|
376
|
+
outputID: 2,
|
|
377
|
+
amount: '2000000000000000000',
|
|
378
|
+
txid: 'test-txid-2',
|
|
379
|
+
outputidx: '1',
|
|
380
|
+
threshold: 2,
|
|
381
|
+
addresses: ['C-flare1multi1', 'C-flare1multi2'],
|
|
382
|
+
},
|
|
383
|
+
{
|
|
384
|
+
outputID: 3,
|
|
385
|
+
amount: '3000000000000000000',
|
|
386
|
+
txid: 'test-txid-3',
|
|
387
|
+
outputidx: '0',
|
|
388
|
+
threshold: 3,
|
|
389
|
+
addresses: ['C-flare1multi1', 'C-flare1multi2', 'C-flare1multi3'],
|
|
390
|
+
},
|
|
391
|
+
];
|
|
392
|
+
builder.addUtxos(utxos);
|
|
393
|
+
builder.fee('5000'); // Higher fee for complex transaction
|
|
394
|
+
builder.threshold(2);
|
|
395
|
+
// Should handle complex UTXO set
|
|
396
|
+
assert.ok(true);
|
|
397
|
+
});
|
|
398
|
+
it('should handle large transaction parameters', function () {
|
|
399
|
+
const fee = '1000000000000000000'; // 1 FLR fee
|
|
400
|
+
const locktime = 4294967295; // Max uint32
|
|
401
|
+
const threshold = 10; // High threshold
|
|
402
|
+
const chainId = 'very-long-chain-id-with-lots-of-characters-0x123456789abcdef0123456789abcdef';
|
|
403
|
+
builder.fee(fee).locktime(locktime).threshold(threshold).sourceChain(chainId);
|
|
404
|
+
// Should handle large values
|
|
405
|
+
assert.ok(true);
|
|
406
|
+
});
|
|
407
|
+
it('should handle rapid parameter changes', function () {
|
|
408
|
+
// Simulate rapid parameter updates
|
|
409
|
+
builder.fee('1000').fee('2000').fee('3000');
|
|
410
|
+
builder.locktime(100).locktime(200).locktime(300);
|
|
411
|
+
builder.threshold(1).threshold(2).threshold(3);
|
|
412
|
+
// Should handle rapid changes without issues
|
|
413
|
+
assert.ok(true);
|
|
414
|
+
});
|
|
415
|
+
});
|
|
416
|
+
describe('Edge Cases', function () {
|
|
417
|
+
it('should handle zero values where appropriate', function () {
|
|
418
|
+
builder.fee('0');
|
|
419
|
+
builder.locktime(0);
|
|
420
|
+
// threshold of 0 should be invalid
|
|
421
|
+
assert.throws(() => {
|
|
422
|
+
builder.threshold(0);
|
|
423
|
+
}, sdk_core_1.BuildTransactionError);
|
|
424
|
+
});
|
|
425
|
+
it('should handle maximum values', function () {
|
|
426
|
+
const maxFee = '115792089237316195423570985008687907853269984665640564039457584007913129639935'; // Max uint256
|
|
427
|
+
const maxLocktime = 4294967295; // Max uint32
|
|
428
|
+
assert.doesNotThrow(() => {
|
|
429
|
+
builder.fee(maxFee);
|
|
430
|
+
});
|
|
431
|
+
assert.doesNotThrow(() => {
|
|
432
|
+
builder.locktime(maxLocktime);
|
|
433
|
+
});
|
|
434
|
+
});
|
|
435
|
+
it('should maintain state across multiple operations', function () {
|
|
436
|
+
const utxo1 = {
|
|
437
|
+
outputID: 1,
|
|
438
|
+
amount: '1000000000000000000',
|
|
439
|
+
txid: 'test-txid-1',
|
|
440
|
+
outputidx: '0',
|
|
441
|
+
threshold: 1,
|
|
442
|
+
addresses: ['C-flare1test1'],
|
|
443
|
+
};
|
|
444
|
+
const utxo2 = {
|
|
445
|
+
outputID: 2,
|
|
446
|
+
amount: '2000000000000000000',
|
|
447
|
+
txid: 'test-txid-2',
|
|
448
|
+
outputidx: '0',
|
|
449
|
+
threshold: 1,
|
|
450
|
+
addresses: ['C-flare1test2'],
|
|
451
|
+
};
|
|
452
|
+
// Build state incrementally
|
|
453
|
+
builder.fee('1000');
|
|
454
|
+
builder.addUtxos([utxo1]);
|
|
455
|
+
builder.locktime(123456);
|
|
456
|
+
builder.addUtxos([utxo2]);
|
|
457
|
+
builder.threshold(2);
|
|
458
|
+
// State should be maintained across operations
|
|
459
|
+
assert.ok(true);
|
|
460
|
+
});
|
|
461
|
+
});
|
|
462
|
+
describe('Integration Tests', function () {
|
|
463
|
+
it('should handle complete P-chain import flow preparation', function () {
|
|
464
|
+
const fee = '2000';
|
|
465
|
+
const locktime = 654321;
|
|
466
|
+
const threshold = 1;
|
|
467
|
+
const chainId = 'C-source-chain-456';
|
|
468
|
+
const utxos = [
|
|
469
|
+
{
|
|
470
|
+
outputID: 1,
|
|
471
|
+
amount: '6000000000000000000', // 6 FLR (more than output for fees)
|
|
472
|
+
txid: 'integration-test-txid',
|
|
473
|
+
outputidx: '0',
|
|
474
|
+
threshold: 1,
|
|
475
|
+
addresses: ['C-flare1source'],
|
|
476
|
+
},
|
|
477
|
+
];
|
|
478
|
+
// Complete setup
|
|
479
|
+
builder.fee(fee).locktime(locktime).threshold(threshold).sourceChain(chainId).addUtxos(utxos);
|
|
480
|
+
// All operations should complete without throwing
|
|
481
|
+
assert.ok(true);
|
|
482
|
+
});
|
|
483
|
+
it('should handle method chaining extensively', function () {
|
|
484
|
+
const utxos = [
|
|
485
|
+
{
|
|
486
|
+
outputID: 1,
|
|
487
|
+
amount: '10000000000000000000', // 10 FLR
|
|
488
|
+
txid: 'chain-test-txid',
|
|
489
|
+
outputidx: '0',
|
|
490
|
+
threshold: 1,
|
|
491
|
+
addresses: ['C-flare1test'],
|
|
492
|
+
},
|
|
493
|
+
];
|
|
494
|
+
// Test extensive method chaining
|
|
495
|
+
assert.doesNotThrow(() => {
|
|
496
|
+
builder.fee('1000').locktime(100000).threshold(1).sourceChain('C-chain-123').addUtxos(utxos);
|
|
497
|
+
});
|
|
498
|
+
});
|
|
499
|
+
});
|
|
500
|
+
});
|
|
501
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0SW5QVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L2xpYi9pbXBvcnRJblBUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxpREFBNEM7QUFDNUMsbURBQTZEO0FBQzdELCtDQUFpQztBQUNqQyxnRUFBcUM7QUFDckMsNEVBQXlFO0FBR3pFLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRTtJQUM3QixNQUFNLFVBQVUsR0FBRyxlQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3RDLElBQUksT0FBMkIsQ0FBQztJQUVoQyxVQUFVLENBQUM7UUFDVCxPQUFPLEdBQUcsSUFBSSx1Q0FBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMvQyxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxhQUFhLEVBQUU7UUFDdEIsRUFBRSxDQUFDLG9DQUFvQyxFQUFFO1lBQ3ZDLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbkIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLFlBQVksdUNBQWtCLENBQUMsQ0FBQztRQUNuRCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx1Q0FBdUMsRUFBRTtZQUMxQyx3REFBd0Q7WUFDeEQsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGlCQUFpQixFQUFFO1FBQzFCLEVBQUUsQ0FBQyx3QkFBd0IsRUFBRTtZQUMzQixNQUFNLElBQUksR0FBbUI7Z0JBQzNCLFFBQVEsRUFBRSxDQUFDO2dCQUNYLE1BQU0sRUFBRSxxQkFBcUIsRUFBRSxRQUFRO2dCQUN2QyxJQUFJLEVBQUUsa0JBQWtCO2dCQUN4QixTQUFTLEVBQUUs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LENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRTlGLGtEQUFrRDtZQUNsRCxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDJDQUEyQyxFQUFFO1lBQzlDLE1BQU0sS0FBSyxHQUFxQjtnQkFDOUI7b0JBQ0UsUUFBUSxFQUFFLENBQUM7b0JBQ1gsTUFBTSxFQUFFLHNCQUFzQixFQUFFLFNBQVM7b0JBQ3pDLElBQUksRUFBRSxpQkFBaUI7b0JBQ3ZCLFNBQVMsRUFBRSxHQUFHO29CQUNkLFNBQVMsRUFBRSxDQUFDO29CQUNaLFNBQVMsRUFBRSxDQUFDLGNBQWMsQ0FBQztpQkFDNUI7YUFDRixDQUFDO1lBRUYsaUNBQWlDO1lBQ2pDLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFO2dCQUN2QixPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMvRixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCB7IEltcG9ydEluUFR4QnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL3NyYy9saWIvaW1wb3J0SW5QVHhCdWlsZGVyJztcbmltcG9ydCB7IERlY29kZWRVdHhvT2JqIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi9pZmFjZSc7XG5cbmRlc2NyaWJlKCdJbXBvcnRJblBUeEJ1aWxkZXInLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGNvaW5Db25maWcgPSBjb2lucy5nZXQoJ3RmbHJwJyk7XG4gIGxldCBidWlsZGVyOiBJbXBvcnRJblBUeEJ1aWxkZXI7XG5cbiAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgYnVpbGRlciA9IG5ldyBJbXBvcnRJblBUeEJ1aWxkZXIoY29pbkNvbmZpZyk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdDb25zdHJ1Y3RvcicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGluaXRpYWxpemUgd2l0aCBjb2luIGNvbmZpZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5vayhidWlsZGVyKTtcbiAgICAgIGFzc2VydC5vayhidWlsZGVyIGluc3RhbmNlb2YgSW1wb3J0SW5QVHhCdWlsZGVyKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaW5pdGlhbGl6ZSB3aXRoIGRlZmF1bHQgdmFsdWVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gQnVpbGRlciBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgd2l0aG91dCB0aHJvd2luZyBlcnJvcnNcbiAgICAgIGFzc2VydC5vayhidWlsZGVyKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1VUWE8gTWFuYWdlbWVudCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGFkZCBzaW5nbGUgVVRYTycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHV0eG86IERlY29kZWRVdHhvT2JqID0ge1xuICAgICAgICBvdXRwdXRJRDogMSxcbiAgICAgICAgYW1vdW50OiAnMTAwMDAwMDAwMDAwMDAwMDAwMCcsIC8vIDEgRkxSXG4gICAgICAgIHR4aWQ6ICd0ZXN0LXR4aWQtc2luZ2xlJyxcbiAgICAgICAgb3V0cHV0aWR4OiAnMCcsXG4gICAgICAgIHRocmVzaG9sZDogMSxcbiAgICAgICAgYWRkcmVzc2VzOiBbJ0MtZmxhcmUxdGVzdCddLFxuICAgICAgfTtcblxuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIuYWRkVXR4b3MoW3V0eG9dKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhZGQgbXVsdGlwbGUgVVRYT3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB1dHhvczogRGVjb2RlZFV0eG9PYmpbXSA9IFtcbiAgICAgICAge1xuICAgICAgICAgIG91dHB1dElEOiAxLFxuICAgICAgICAgIGFtb3VudDogJzEwMDAwMDAwMDAwMDAwMDAwMDAnLCAvLyAxIEZMUlxuICAgICAgICAgIHR4aWQ6ICd0ZXN0LXR4aWQtMScsXG4gICAgICAgICAgb3V0cHV0aWR4OiAnMCcsXG4gICAgICAgICAgdGhyZXNob2xkOiAxLFxuICAgICAgICAgIGFkZHJlc3NlczogWydDLWZsYXJlMXRlc3QxJ10sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBvdXRwdXRJRDogMixcbiAgICAgICAgICBhbW91bnQ6ICcyMDAwMDAwMDAwMDAwMDAwMDAwJywgLy8gMiBGTFJcbiAgICAgICAgICB0eGlkOiAndGVzdC10eGlkLTInLFxuICAgICAgICAgIG91dHB1dGlkeDogJzEnLFxuICAgICAgICAgIHRocmVzaG9sZDogMixcbiAgICAgICAgICBhZGRyZXNzZXM6IFsnQy1mbGFyZTF0ZXN0MicsICdDLWZsYXJlMXRlc3QzJ10sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBvdXRwdXRJRDogMyxcbiAgICAgICAgICBhbW91bnQ6ICc1MDAwMDAwMDAwMDAwMDAwMDAnLCAvLyAwLjUgRkxSXG4gICAgICAgICAgdHhpZDogJ3Rlc3QtdHhpZC0zJyxcbiAgICAgICAgICBvdXRwdXRpZHg6ICcwJyxcbiAgICAgICAgICB0aHJlc2hvbGQ6IDEsXG4gICAgICAgICAgYWRkcmVzc2VzOiBbJ0MtZmxhcmUxdGVzdDQnXSxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmFkZFV0eG9zKHV0eG9zKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgZW1wdHkgVVRYTyBhcnJheScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmFkZFV0eG9zKFtdKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhY2N1bXVsYXRlIFVUWE9zIGZyb20gbXVsdGlwbGUgY2FsbHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB1dHhvczE6IERlY29kZWRVdHhvT2JqW10gPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBvdXRwdXRJRDogMSxcbiAgICAgICAgICBhbW91bnQ6ICcxMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICB0eGlkOiAndGVzdC10eGlkLTEnLFxuICAgICAgICAgIG91dHB1dGlkeDogJzAnLFxuICAgICAgICAgIHRocmVzaG9sZDogMSxcbiAgICAgICAgICBhZGRyZXNzZXM6IFsnQy1mbGFyZTF0ZXN0MSddLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgY29uc3QgdXR4b3MyOiBEZWNvZGVkVXR4b09ialtdID0gW1xuICAgICAgICB7XG4gICAgICAgICAgb3V0cHV0SUQ6IDIsXG4gICAgICAgICAgYW1vdW50OiAnMjAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgICAgICAgdHhpZDogJ3Rlc3QtdHhpZC0yJyxcbiAgICAgICAgICBvdXRwdXRpZHg6ICcwJyxcbiAgICAgICAgICB0aHJlc2hvbGQ6IDEsXG4gICAgICAgICAgYWRkcmVzc2VzOiBbJ0MtZmxhcmUxdGVzdDInXSxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIGJ1aWxkZXIuYWRkVXR4b3ModXR4b3MxKTtcbiAgICAgIGJ1aWxkZXIuYWRkVXR4b3ModXR4b3MyKTtcblxuICAgICAgLy8gU2hvdWxkIG5vdCB0aHJvd1xuICAgICAgYXNzZXJ0Lm9rKHRydWUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRmVlIE1hbmFnZW1lbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBzZXQgdmFsaWQgcG9zaXRpdmUgZmVlJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdmFsaWRGZWVzID0gWycxMDAwJywgJzAnLCAnMTAwMDAwMDAwMDAwMDAwMDAwMCcsICc5OTk5OTk5OTk5OTk5OTk5OTknXTtcblxuICAgICAgdmFsaWRGZWVzLmZvckVhY2goKGZlZSkgPT4ge1xuICAgICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgICBidWlsZGVyLmZlZShmZWUpO1xuICAgICAgICB9LCBgU2hvdWxkIGFjY2VwdCBmZWU6ICR7ZmVlfWApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBuZWdhdGl2ZSBmZWVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbmVnYXRpdmVGZWVzID0gWyctMScsICctMTAwMCcsICctMTAwMDAwMDAwMDAwMDAwMDAwMCddO1xuXG4gICAgICBuZWdhdGl2ZUZlZXMuZm9yRWFjaCgoZmVlKSA9PiB7XG4gICAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgYnVpbGRlci5mZWUoZmVlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcixcbiAgICAgICAgICBgU2hvdWxkIHJlamVjdCBuZWdhdGl2ZSBmZWU6ICR7ZmVlfWBcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgaW52YWxpZCBmZWUgZm9ybWF0cyAoQmlnTnVtYmVyIGJlaGF2aW9yKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGludmFsaWRGZWVzID0gWydhYmMnLCAnbm90LWEtbnVtYmVyJywgJzEuNS41JywgJ2luZmluaXR5J107XG5cbiAgICAgIGludmFsaWRGZWVzLmZvckVhY2goKGZlZSkgPT4ge1xuICAgICAgICAvLyBCaWdOdW1iZXIgZG9lc24ndCB0aHJvdyBmb3IgaW52YWxpZCBzdHJpbmdzLCBpdCBjcmVhdGVzIE5hTiB2YWx1ZXNcbiAgICAgICAgLy8gQnV0IG91ciBpbXBsZW1lbnRhdGlvbiBzaG91bGQgc3RpbGwgYWNjZXB0IHRoZW0gKG5vIGFkZGl0aW9uYWwgdmFsaWRhdGlvbilcbiAgICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgICAgYnVpbGRlci5mZWUoZmVlKTtcbiAgICAgICAgfSwgYEJpZ051bWJlciBhY2NlcHRzIGludmFsaWQgc3RyaW5nczogJHtmZWV9YCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIEJpZ051bWJlciBmZWUgaW5wdXRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYmlnTnVtYmVyRmVlID0gbmV3IEJpZ051bWJlcignMTAwMDAwMDAwMDAwMDAwMDAwMCcpO1xuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIuZmVlKGJpZ051bWJlckZlZS50b1N0cmluZygpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjaGFpbiBmZWUgc2V0dGluZyB3aXRoIG90aGVyIG1ldGhvZHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBmZWUgPSAnMTAwMCc7XG4gICAgICBjb25zdCB1dHhvOiBEZWNvZGVkVXR4b09iaiA9IHtcbiAgICAgICAgb3V0cHV0SUQ6IDEsXG4gICAgICAgIGFtb3VudDogJzEwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICAgICB0eGlkOiAndGVzdC10eGlkJyxcbiAgICAgICAgb3V0cHV0aWR4OiAnMCcsXG4gICAgICAgIHRocmVzaG9sZDogMSxcbiAgICAgICAgYWRkcmVzc2VzOiBbJ0MtZmxhcmUxdGVzdCddLFxuICAgICAgfTtcblxuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIuZmVlKGZlZSkuYWRkVXR4b3MoW3V0eG9dKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnTG9ja3RpbWUgTWFuYWdlbWVudCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHNldCB2YWxpZCBsb2NrdGltZSB2YWx1ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB2YWxpZExvY2t0aW1lcyA9IFswLCAxLCAxMDAwLCA0Mjk0OTY3Mjk1XTsgLy8gTWF4IHVpbnQzMlxuXG4gICAgICB2YWxpZExvY2t0aW1lcy5mb3JFYWNoKChsb2NrdGltZSkgPT4ge1xuICAgICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgICBidWlsZGVyLmxvY2t0aW1lKGxvY2t0aW1lKTtcbiAgICAgICAgfSwgYFNob3VsZCBhY2NlcHQgbG9ja3RpbWU6ICR7bG9ja3RpbWV9YCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIG5lZ2F0aXZlIGxvY2t0aW1lIChubyB2YWxpZGF0aW9uKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG5lZ2F0aXZlTG9ja3RpbWVzID0gWy0xLCAtMTAwMF07XG5cbiAgICAgIG5lZ2F0aXZlTG9ja3RpbWVzLmZvckVhY2goKGxvY2t0aW1lKSA9PiB7XG4gICAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICAgIGJ1aWxkZXIubG9ja3RpbWUobG9ja3RpbWUpO1xuICAgICAgICB9LCBgU2hvdWxkIGFjY2VwdCBuZWdhdGl2ZSBsb2NrdGltZTogJHtsb2NrdGltZX0gKG5vIHZhbGlkYXRpb24gaW4gaW1wbGVtZW50YXRpb24pYCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGJvdW5kYXJ5IHZhbHVlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJvdW5kYXJ5VmFsdWVzID0gWzAsIDQyOTQ5NjcyOTVdOyAvLyBNaW4gYW5kIG1heCB1aW50MzJcblxuICAgICAgYm91bmRhcnlWYWx1ZXMuZm9yRWFjaCgobG9ja3RpbWUpID0+IHtcbiAgICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgICAgYnVpbGRlci5sb2NrdGltZShsb2NrdGltZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNoYWluIGxvY2t0aW1lIHNldHRpbmcgd2l0aCBvdGhlciBtZXRob2RzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbG9ja3RpbWUgPSAxMjM0NTY7XG4gICAgICBjb25zdCBmZWUgPSAnMTAwMCc7XG5cbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmxvY2t0aW1lKGxvY2t0aW1lKS5mZWUoZmVlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVGhyZXNob2xkIE1hbmFnZW1lbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBzZXQgdmFsaWQgdGhyZXNob2xkIHZhbHVlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHZhbGlkVGhyZXNob2xkcyA9IFsxLCAyLCA1LCAxMF07XG5cbiAgICAgIHZhbGlkVGhyZXNob2xkcy5mb3JFYWNoKCh0aHJlc2hvbGQpID0+IHtcbiAgICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgICAgYnVpbGRlci50aHJlc2hvbGQodGhyZXNob2xkKTtcbiAgICAgICAgfSwgYFNob3VsZCBhY2NlcHQgdGhyZXNob2xkOiAke3RocmVzaG9sZH1gKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgaW52YWxpZCB0aHJlc2hvbGQgdmFsdWVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaW52YWxpZFRocmVzaG9sZHMgPSBbMCwgLTEsIC0xMF07XG5cbiAgICAgIGludmFsaWRUaHJlc2hvbGRzLmZvckVhY2goKHRocmVzaG9sZCkgPT4ge1xuICAgICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIGJ1aWxkZXIudGhyZXNob2xkKHRocmVzaG9sZCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBCdWlsZFRyYW5zYWN0aW9uRXJyb3IsXG4gICAgICAgICAgYFNob3VsZCByZWplY3QgdGhyZXNob2xkOiAke3RocmVzaG9sZH1gXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIHR5cGljYWwgdGhyZXNob2xkIHNjZW5hcmlvcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFNpbmdsZSBzaWduYXR1cmVcbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnRocmVzaG9sZCgxKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBNdWx0aS1zaWduYXR1cmVcbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnRocmVzaG9sZCgzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjaGFpbiB0aHJlc2hvbGQgc2V0dGluZyB3aXRoIG90aGVyIG1ldGhvZHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0aHJlc2hvbGQgPSAyO1xuICAgICAgY29uc3QgbG9ja3RpbWUgPSAxMjM0NTY7XG5cbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnRocmVzaG9sZCh0aHJlc2hvbGQpLmxvY2t0aW1lKGxvY2t0aW1lKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnU291cmNlIENoYWluIE1hbmFnZW1lbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgLy8gVE9ETyA6IEVuYWJsZSB0aGVzZSB0ZXN0cyBhZnRlciBmaXhpbmcgc291cmNlQ2hhaW4gbWV0aG9kIHRvIGFjY2VwdCBQLWNoYWluIElEc1xuICAgIGl0LnNraXAoJ3Nob3VsZCBzZXQgdmFsaWQgc291cmNlIGNoYWluIElEcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHZhbGlkQ2hhaW5JZHMgPSBbJ0MtZmxhcmUxMjM0NScsICdOb2RlSUQtZmxhcmU2Nzg5MCcsICcweDEyMzQ1Njc4OWFiY2RlZicsICdhYmMxMjNkZWY0NTYnXTtcblxuICAgICAgdmFsaWRDaGFpbklkcy5mb3JFYWNoKChjaGFpbklkKSA9PiB7XG4gICAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICAgIGJ1aWxkZXIuc291cmNlQ2hhaW4oY2hhaW5JZCk7XG4gICAgICAgIH0sIGBTaG91bGQgYWNjZXB0IGNoYWluIElEOiAke2NoYWluSWR9YCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGRpZmZlcmVudCBjaGFpbiBJRCBmb3JtYXRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgY2hhaW5JZHMgPSBbJ0MtY2hhaW4taWQtMTIzJywgJ1AtY2hhaW4taWQtNDU2JywgJ2hleC1mb3JtYXR0ZWQtaWQnLCAnMTIzNDU2Nzg5MGFiY2RlZiddO1xuXG4gICAgICBjaGFpbklkcy5mb3JFYWNoKChjaGFpbklkKSA9PiB7XG4gICAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICAgIGJ1aWxkZXIuc291cmNlQ2hhaW4oY2hhaW5JZCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdJbnB1dC9PdXRwdXQgQ3JlYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB0ZXN0IHB1YmxpYyBtZXRob2RzIG9ubHkgZHVlIHRvIHByb3RlY3RlZCBhY2Nlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBOb3RlOiBjcmVhdGVJbnB1dE91dHB1dCBpcyBwcm90ZWN0ZWQsIHNvIHdlIHRlc3QgdGhyb3VnaCBwdWJsaWMgaW50ZXJmYWNlXG4gICAgICAvLyBUZXN0IHRoYXQgd2UgY2FuIHNldCBwYXJhbWV0ZXJzIHRoYXQgd291bGQgYmUgdXNlZCBieSBjcmVhdGVJbnB1dE91dHB1dFxuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIuZmVlKCcxMDAwJyk7XG4gICAgICAgIGJ1aWxkZXIudGhyZXNob2xkKDEpO1xuICAgICAgICAvLyBQcm90ZWN0ZWQgbWV0aG9kIGNhbm5vdCBiZSB0ZXN0ZWQgZGlyZWN0bHlcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgY29uZmlndXJhdGlvbiBmb3Igb3V0cHV0IGNyZWF0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZmVlID0gJzEwMDAnO1xuICAgICAgY29uc3QgbG9ja3RpbWUgPSAwO1xuICAgICAgY29uc3QgdGhyZXNob2xkID0gMTtcblxuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIuZmVlKGZlZSkubG9ja3RpbWUobG9ja3RpbWUpLnRocmVzaG9sZCh0aHJlc2hvbGQpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFsbG93IHNldHRpbmcgcGFyYW1ldGVycyBmb3IgbGFyZ2UgYW1vdW50cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGxvY2t0aW1lID0gMDtcbiAgICAgIGNvbnN0IHRocmVzaG9sZCA9IDE7XG5cbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmZlZSgnMTAwMCcpLmxvY2t0aW1lKGxvY2t0aW1lKS50aHJlc2hvbGQodGhyZXNob2xkKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjb25maWd1cmUgZm9yIGRpZmZlcmVudCB0aHJlc2hvbGQgc2NlbmFyaW9zJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbG9ja3RpbWUgPSAwO1xuXG4gICAgICAvLyBUZXN0IGRpZmZlcmVudCB0aHJlc2hvbGRzXG4gICAgICBbMSwgMiwgM10uZm9yRWFjaCgodGhyZXNob2xkKSA9PiB7XG4gICAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICAgIGJ1aWxkZXIudGhyZXNob2xkKHRocmVzaG9sZCkubG9ja3RpbWUobG9ja3RpbWUpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVHJhbnNhY3Rpb24gVHlwZSBWZXJpZmljYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB2ZXJpZnkgdHJhbnNhY3Rpb24gdHlwZSAocGxhY2Vob2xkZXIpJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbW9ja1R4ID0geyB0eXBlOiAnaW1wb3J0JyB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gSW1wb3J0SW5QVHhCdWlsZGVyLnZlcmlmeVR4VHlwZShtb2NrVHgpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgdHJ1ZSk7IC8vIFBsYWNlaG9sZGVyIHJldHVybnMgdHJ1ZVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgZGlmZmVyZW50IHRyYW5zYWN0aW9uIG9iamVjdHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0ZXN0Q2FzZXMgPSBbe30sIG51bGwsIHVuZGVmaW5lZCwgeyB0eXBlOiAnZXhwb3J0JyB9LCB7IGRhdGE6ICd0ZXN0JyB9XTtcblxuICAgICAgdGVzdENhc2VzLmZvckVhY2goKHRlc3RDYXNlLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBJbXBvcnRJblBUeEJ1aWxkZXIudmVyaWZ5VHhUeXBlKHRlc3RDYXNlKTtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgdHJ1ZSwgYFRlc3QgY2FzZSAke2luZGV4fSBzaG91bGQgcmV0dXJuIHRydWUgKHBsYWNlaG9sZGVyKWApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZlcmlmeSB2aWEgaW5zdGFuY2UgbWV0aG9kJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbW9ja1R4ID0geyB0eXBlOiAnaW1wb3J0JyB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gYnVpbGRlci52ZXJpZnlUeFR5cGUobW9ja1R4KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIHRydWUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVHJhbnNhY3Rpb24gQnVpbGRpbmcgUHJlcGFyYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBwcmVwYXJlIGJhc2ljIGltcG9ydCB0cmFuc2FjdGlvbiBwYXJhbWV0ZXJzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZmVlID0gJzEwMDAnO1xuICAgICAgY29uc3QgbG9ja3RpbWUgPSAxMjM0NTY7XG4gICAgICBjb25zdCB0aHJlc2hvbGQgPSAyO1xuICAgICAgY29uc3QgY2hhaW5JZCA9ICdDLXNvdXJjZS1jaGFpbi0xMjMnO1xuICAgICAgY29uc3QgdXR4b3M6IERlY29kZWRVdHhvT2JqW10gPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBvdXRwdXRJRDogMSxcbiAgICAgICAgICBhbW91bnQ6ICcxMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICB0eGlkOiAndGVzdC10eGlkJyxcbiAgICAgICAgICBvdXRwdXRpZHg6ICcwJyxcbiAgICAgICAgICB0aHJlc2hvbGQ6IDEsXG4gICAgICAgICAgYWRkcmVzc2VzOiBbJ0MtZmxhcmUxdGVzdCddLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgLy8gU2V0IGFsbCBwYXJhbWV0ZXJzXG4gICAgICBidWlsZGVyLmZlZShmZWUpLmxvY2t0aW1lKGxvY2t0aW1lKS50aHJlc2hvbGQodGhyZXNob2xkKS5zb3VyY2VDaGFpbihjaGFpbklkKS5hZGRVdHhvcyh1dHhvcyk7XG5cbiAgICAgIC8vIFNob3VsZCBub3QgdGhyb3dcbiAgICAgIGFzc2VydC5vayh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIG1pbmltYWwgY29uZmlndXJhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGZlZSA9ICcwJztcbiAgICAgIGNvbnN0IHV0eG9zOiBEZWNvZGVkVXR4b09ialtdID0gW1xuICAgICAgICB7XG4gICAgICAgICAgb3V0cHV0SUQ6IDEsXG4gICAgICAgICAgYW1vdW50OiAnMTAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgICAgICAgdHhpZDogJ3Rlc3QtdHhpZCcsXG4gICAgICAgICAgb3V0cHV0aWR4OiAnMCcsXG4gICAgICAgICAgdGhyZXNob2xkOiAxLFxuICAgICAgICAgIGFkZHJlc3NlczogWydDLWZsYXJlMXRlc3QnXSxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIGJ1aWxkZXIuZmVlKGZlZSkuYWRkVXR4b3ModXR4b3MpO1xuXG4gICAgICAvLyBTaG91bGQgbm90IHRocm93XG4gICAgICBhc3NlcnQub2sodHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdDb21wbGV4IFNjZW5hcmlvcycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBtdWx0aXBsZSBVVFhPcyB3aXRoIGRpZmZlcmVudCBwcm9wZXJ0aWVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdXR4b3M6IERlY29kZWRVdHhvT2JqW10gPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBvdXRwdXRJRDogMSxcbiAgICAgICAgICBhbW91bnQ6ICcxMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICB0eGlkOiAndGVzdC10eGlkLTEnLFxuICAgICAgICAgIG91dHB1dGlkeDogJzAnLFxuICAgICAgICAgIHRocmVzaG9sZDogMSxcbiAgICAgICAgICBhZGRyZXNzZXM6IFsnQy1mbGFyZTFzaW5nbGUnXSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG91dHB1dElEOiAyLFxuICAgICAgICAgIGFtb3VudDogJzIwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICAgICAgIHR4aWQ6ICd0ZXN0LXR4aWQtMicsXG4gICAgICAgICAgb3V0cHV0aWR4OiAnMScsXG4gICAgICAgICAgdGhyZXNob2xkOiAyLFxuICAgICAgICAgIGFkZHJlc3NlczogWydDLWZsYXJlMW11bHRpMScsICdDLWZsYXJlMW11bHRpMiddLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgb3V0cHV0SUQ6IDMsXG4gICAgICAgICAgYW1vdW50OiAnMzAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgICAgICAgdHhpZDogJ3Rlc3QtdHhpZC0zJyxcbiAgICAgICAgICBvdXRwdXRpZHg6ICcwJyxcbiAgICAgICAgICB0aHJlc2hvbGQ6IDMsXG4gICAgICAgICAgYWRkcmVzc2VzOiBbJ0MtZmxhcmUxbXVsdGkxJywgJ0MtZmxhcmUxbXVsdGkyJywgJ0MtZmxhcmUxbXVsdGkzJ10sXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBidWlsZGVyLmFkZFV0eG9zKHV0eG9zKTtcbiAgICAgIGJ1aWxkZXIuZmVlKCc1MDAwJyk7IC8vIEhpZ2hlciBmZWUgZm9yIGNvbXBsZXggdHJhbnNhY3Rpb25cbiAgICAgIGJ1aWxkZXIudGhyZXNob2xkKDIpO1xuXG4gICAgICAvLyBTaG91bGQgaGFuZGxlIGNvbXBsZXggVVRYTyBzZXRcbiAgICAgIGFzc2VydC5vayh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGxhcmdlIHRyYW5zYWN0aW9uIHBhcmFtZXRlcnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBmZWUgPSAnMTAwMDAwMDAwMDAwMDAwMDAwMCc7IC8vIDEgRkxSIGZlZVxuICAgICAgY29uc3QgbG9ja3RpbWUgPSA0Mjk0OTY3Mjk1OyAvLyBNYXggdWludDMyXG4gICAgICBjb25zdCB0aHJlc2hvbGQgPSAxMDsgLy8gSGlnaCB0aHJlc2hvbGRcbiAgICAgIGNvbnN0IGNoYWluSWQgPSAndmVyeS1sb25nLWNoYWluLWlkLXdpdGgtbG90cy1vZi1jaGFyYWN0ZXJzLTB4MTIzNDU2Nzg5YWJjZGVmMDEyMzQ1Njc4OWFiY2RlZic7XG5cbiAgICAgIGJ1aWxkZXIuZmVlKGZlZSkubG9ja3RpbWUobG9ja3RpbWUpLnRocmVzaG9sZCh0aHJlc2hvbGQpLnNvdXJjZUNoYWluKGNoYWluSWQpO1xuXG4gICAgICAvLyBTaG91bGQgaGFuZGxlIGxhcmdlIHZhbHVlc1xuICAgICAgYXNzZXJ0Lm9rKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgcmFwaWQgcGFyYW1ldGVyIGNoYW5nZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBTaW11bGF0ZSByYXBpZCBwYXJhbWV0ZXIgdXBkYXRlc1xuICAgICAgYnVpbGRlci5mZWUoJzEwMDAnKS5mZWUoJzIwMDAnKS5mZWUoJzMwMDAnKTtcbiAgICAgIGJ1aWxkZXIubG9ja3RpbWUoMTAwKS5sb2NrdGltZSgyMDApLmxvY2t0aW1lKDMwMCk7XG4gICAgICBidWlsZGVyLnRocmVzaG9sZCgxKS50aHJlc2hvbGQoMikudGhyZXNob2xkKDMpO1xuXG4gICAgICAvLyBTaG91bGQgaGFuZGxlIHJhcGlkIGNoYW5nZXMgd2l0aG91dCBpc3N1ZXNcbiAgICAgIGFzc2VydC5vayh0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0VkZ2UgQ2FzZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgemVybyB2YWx1ZXMgd2hlcmUgYXBwcm9wcmlhdGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBidWlsZGVyLmZlZSgnMCcpO1xuICAgICAgYnVpbGRlci5sb2NrdGltZSgwKTtcbiAgICAgIC8vIHRocmVzaG9sZCBvZiAwIHNob3VsZCBiZSBpbnZhbGlkXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgYnVpbGRlci50aHJlc2hvbGQoMCk7XG4gICAgICB9LCBCdWlsZFRyYW5zYWN0aW9uRXJyb3IpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgbWF4aW11bSB2YWx1ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBtYXhGZWUgPSAnMTE1NzkyMDg5MjM3MzE2MTk1NDIzNTcwOTg1MDA4Njg3OTA3ODUzMjY5OTg0NjY1NjQwNTY0MDM5NDU3NTg0MDA3OTEzMTI5NjM5OTM1JzsgLy8gTWF4IHVpbnQyNTZcbiAgICAgIGNvbnN0IG1heExvY2t0aW1lID0gNDI5NDk2NzI5NTsgLy8gTWF4IHVpbnQzMlxuXG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5mZWUobWF4RmVlKTtcbiAgICAgIH0pO1xuXG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5sb2NrdGltZShtYXhMb2NrdGltZSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbWFpbnRhaW4gc3RhdGUgYWNyb3NzIG11bHRpcGxlIG9wZXJhdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB1dHhvMTogRGVjb2RlZFV0eG9PYmogPSB7XG4gICAgICAgIG91dHB1dElEOiAxLFxuICAgICAgICBhbW91bnQ6ICcxMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgdHhpZDogJ3Rlc3QtdHhpZC0xJyxcbiAgICAgICAgb3V0cHV0aWR4OiAnMCcsXG4gICAgICAgIHRocmVzaG9sZDogMSxcbiAgICAgICAgYWRkcmVzc2VzOiBbJ0MtZmxhcmUxdGVzdDEnXSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHV0eG8yOiBEZWNvZGVkVXR4b09iaiA9IHtcbiAgICAgICAgb3V0cHV0SUQ6IDIsXG4gICAgICAgIGFtb3VudDogJzIwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICAgICB0eGlkOiAndGVzdC10eGlkLTInLFxuICAgICAgICBvdXRwdXRpZHg6ICcwJyxcbiAgICAgICAgdGhyZXNob2xkOiAxLFxuICAgICAgICBhZGRyZXNzZXM6IFsnQy1mbGFyZTF0ZXN0MiddLFxuICAgICAgfTtcblxuICAgICAgLy8gQnVpbGQgc3RhdGUgaW5jcmVtZW50YWxseVxuICAgICAgYnVpbGRlci5mZWUoJzEwMDAnKTtcbiAgICAgIGJ1aWxkZXIuYWRkVXR4b3MoW3V0eG8xXSk7XG4gICAgICBidWlsZGVyLmxvY2t0aW1lKDEyMzQ1Nik7XG4gICAgICBidWlsZGVyLmFkZFV0eG9zKFt1dHhvMl0pO1xuICAgICAgYnVpbGRlci50aHJlc2hvbGQoMik7XG5cbiAgICAgIC8vIFN0YXRlIHNob3VsZCBiZSBtYWludGFpbmVkIGFjcm9zcyBvcGVyYXRpb25zXG4gICAgICBhc3NlcnQub2sodHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdJbnRlZ3JhdGlvbiBUZXN0cycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBjb21wbGV0ZSBQLWNoYWluIGltcG9ydCBmbG93IHByZXBhcmF0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZmVlID0gJzIwMDAnO1xuICAgICAgY29uc3QgbG9ja3RpbWUgPSA2NTQzMjE7XG4gICAgICBjb25zdCB0aHJlc2hvbGQgPSAxO1xuICAgICAgY29uc3QgY2hhaW5JZCA9ICdDLXNvdXJjZS1jaGFpbi00NTYnO1xuICAgICAgY29uc3QgdXR4b3M6IERlY29kZWRVdHhvT2JqW10gPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBvdXRwdXRJRDogMSxcbiAgICAgICAgICBhbW91bnQ6ICc2MDAwMDAwMDAwMDAwMDAwMDAwJywgLy8gNiBGTFIgKG1vcmUgdGhhbiBvdXRwdXQgZm9yIGZlZXMpXG4gICAgICAgICAgdHhpZDogJ2ludGVncmF0aW9uLXRlc3QtdHhpZCcsXG4gICAgICAgICAgb3V0cHV0aWR4OiAnMCcsXG4gICAgICAgICAgdGhyZXNob2xkOiAxLFxuICAgICAgICAgIGFkZHJlc3NlczogWydDLWZsYXJlMXNvdXJjZSddLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgLy8gQ29tcGxldGUgc2V0dXBcbiAgICAgIGJ1aWxkZXIuZmVlKGZlZSkubG9ja3RpbWUobG9ja3RpbWUpLnRocmVzaG9sZCh0aHJlc2hvbGQpLnNvdXJjZUNoYWluKGNoYWluSWQpLmFkZFV0eG9zKHV0eG9zKTtcblxuICAgICAgLy8gQWxsIG9wZXJhdGlvbnMgc2hvdWxkIGNvbXBsZXRlIHdpdGhvdXQgdGhyb3dpbmdcbiAgICAgIGFzc2VydC5vayh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIG1ldGhvZCBjaGFpbmluZyBleHRlbnNpdmVseScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHV0eG9zOiBEZWNvZGVkVXR4b09ialtdID0gW1xuICAgICAgICB7XG4gICAgICAgICAgb3V0cHV0SUQ6IDEsXG4gICAgICAgICAgYW1vdW50OiAnMTAwMDAwMDAwMDAwMDAwMDAwMDAnLCAvLyAxMCBGTFJcbiAgICAgICAgICB0eGlkOiAnY2hhaW4tdGVzdC10eGlkJyxcbiAgICAgICAgICBvdXRwdXRpZHg6ICcwJyxcbiAgICAgICAgICB0aHJlc2hvbGQ6IDEsXG4gICAgICAgICAgYWRkcmVzc2VzOiBbJ0MtZmxhcmUxdGVzdCddLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgLy8gVGVzdCBleHRlbnNpdmUgbWV0aG9kIGNoYWluaW5nXG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5mZWUoJzEwMDAnKS5sb2NrdGltZSgxMDAwMDApLnRocmVzaG9sZCgxKS5zb3VyY2VDaGFpbignQy1jaGFpbi0xMjMnKS5hZGRVdHhvcyh1dHhvcyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyPair.d.ts","sourceRoot":"","sources":["../../../../test/unit/lib/keyPair.ts"],"names":[],"mappings":""}
|