@bitgo-beta/sdk-coin-flrp 1.0.1-beta.67 → 1.0.1-beta.68

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/dist/tsconfig.tsbuildinfo +1 -1
  2. package/package.json +6 -6
  3. package/dist/src/flrp.d.ts +0 -91
  4. package/dist/src/flrp.d.ts.map +0 -1
  5. package/dist/src/flrp.js +0 -343
  6. package/dist/src/iface.d.ts +0 -25
  7. package/dist/src/iface.d.ts.map +0 -1
  8. package/dist/src/iface.js +0 -3
  9. package/dist/src/index.d.ts +0 -6
  10. package/dist/src/index.d.ts.map +0 -1
  11. package/dist/src/index.js +0 -45
  12. package/dist/src/lib/atomicInCTransactionBuilder.d.ts +0 -26
  13. package/dist/src/lib/atomicInCTransactionBuilder.d.ts.map +0 -1
  14. package/dist/src/lib/atomicInCTransactionBuilder.js +0 -64
  15. package/dist/src/lib/atomicTransactionBuilder.d.ts +0 -96
  16. package/dist/src/lib/atomicTransactionBuilder.d.ts.map +0 -1
  17. package/dist/src/lib/atomicTransactionBuilder.js +0 -318
  18. package/dist/src/lib/constants.d.ts +0 -170
  19. package/dist/src/lib/constants.d.ts.map +0 -1
  20. package/dist/src/lib/constants.js +0 -227
  21. package/dist/src/lib/delegatorTxBuilder.d.ts +0 -58
  22. package/dist/src/lib/delegatorTxBuilder.d.ts.map +0 -1
  23. package/dist/src/lib/delegatorTxBuilder.js +0 -224
  24. package/dist/src/lib/errors.d.ts +0 -8
  25. package/dist/src/lib/errors.d.ts.map +0 -1
  26. package/dist/src/lib/errors.js +0 -19
  27. package/dist/src/lib/exportInCTxBuilder.d.ts +0 -77
  28. package/dist/src/lib/exportInCTxBuilder.d.ts.map +0 -1
  29. package/dist/src/lib/exportInCTxBuilder.js +0 -199
  30. package/dist/src/lib/exportInPTxBuilder.d.ts +0 -30
  31. package/dist/src/lib/exportInPTxBuilder.d.ts.map +0 -1
  32. package/dist/src/lib/exportInPTxBuilder.js +0 -120
  33. package/dist/src/lib/iface.d.ts +0 -119
  34. package/dist/src/lib/iface.d.ts.map +0 -1
  35. package/dist/src/lib/iface.js +0 -22
  36. package/dist/src/lib/importInCTxBuilder.d.ts +0 -67
  37. package/dist/src/lib/importInCTxBuilder.d.ts.map +0 -1
  38. package/dist/src/lib/importInCTxBuilder.js +0 -403
  39. package/dist/src/lib/importInPTxBuilder.d.ts +0 -73
  40. package/dist/src/lib/importInPTxBuilder.d.ts.map +0 -1
  41. package/dist/src/lib/importInPTxBuilder.js +0 -464
  42. package/dist/src/lib/index.d.ts +0 -12
  43. package/dist/src/lib/index.d.ts.map +0 -1
  44. package/dist/src/lib/index.js +0 -39
  45. package/dist/src/lib/keyPair.d.ts +0 -58
  46. package/dist/src/lib/keyPair.d.ts.map +0 -1
  47. package/dist/src/lib/keyPair.js +0 -142
  48. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +0 -81
  49. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +0 -1
  50. package/dist/src/lib/permissionlessValidatorTxBuilder.js +0 -248
  51. package/dist/src/lib/transaction.d.ts +0 -111
  52. package/dist/src/lib/transaction.d.ts.map +0 -1
  53. package/dist/src/lib/transaction.js +0 -322
  54. package/dist/src/lib/transactionBuilder.d.ts +0 -85
  55. package/dist/src/lib/transactionBuilder.d.ts.map +0 -1
  56. package/dist/src/lib/transactionBuilder.js +0 -167
  57. package/dist/src/lib/transactionBuilderFactory.d.ts +0 -37
  58. package/dist/src/lib/transactionBuilderFactory.d.ts.map +0 -1
  59. package/dist/src/lib/transactionBuilderFactory.js +0 -91
  60. package/dist/src/lib/types.d.ts +0 -78
  61. package/dist/src/lib/types.d.ts.map +0 -1
  62. package/dist/src/lib/types.js +0 -5
  63. package/dist/src/lib/utils.d.ts +0 -217
  64. package/dist/src/lib/utils.d.ts.map +0 -1
  65. package/dist/src/lib/utils.js +0 -498
  66. package/dist/src/lib/validatorTxBuilder.d.ts +0 -40
  67. package/dist/src/lib/validatorTxBuilder.d.ts.map +0 -1
  68. package/dist/src/lib/validatorTxBuilder.js +0 -180
  69. package/dist/src/register.d.ts +0 -3
  70. package/dist/src/register.d.ts.map +0 -1
  71. package/dist/src/register.js +0 -11
  72. package/dist/src/tflrp.d.ts +0 -8
  73. package/dist/src/tflrp.d.ts.map +0 -1
  74. package/dist/src/tflrp.js +0 -14
  75. package/dist/test/unit/delegatorTxBuilder.test.d.ts +0 -2
  76. package/dist/test/unit/delegatorTxBuilder.test.d.ts.map +0 -1
  77. package/dist/test/unit/delegatorTxBuilder.test.js +0 -233
  78. package/dist/test/unit/flrp.d.ts +0 -2
  79. package/dist/test/unit/flrp.d.ts.map +0 -1
  80. package/dist/test/unit/flrp.js +0 -118
  81. package/dist/test/unit/lib/atomicTransactionBuilder.d.ts +0 -2
  82. package/dist/test/unit/lib/atomicTransactionBuilder.d.ts.map +0 -1
  83. package/dist/test/unit/lib/atomicTransactionBuilder.js +0 -222
  84. package/dist/test/unit/lib/exportInCTxBuilder.d.ts +0 -2
  85. package/dist/test/unit/lib/exportInCTxBuilder.d.ts.map +0 -1
  86. package/dist/test/unit/lib/exportInCTxBuilder.js +0 -584
  87. package/dist/test/unit/lib/exportInPTxBuilder.d.ts +0 -2
  88. package/dist/test/unit/lib/exportInPTxBuilder.d.ts.map +0 -1
  89. package/dist/test/unit/lib/exportInPTxBuilder.js +0 -377
  90. package/dist/test/unit/lib/importInCTxBuilder.d.ts +0 -2
  91. package/dist/test/unit/lib/importInCTxBuilder.d.ts.map +0 -1
  92. package/dist/test/unit/lib/importInCTxBuilder.js +0 -257
  93. package/dist/test/unit/lib/importInPTxBuilder.d.ts +0 -2
  94. package/dist/test/unit/lib/importInPTxBuilder.d.ts.map +0 -1
  95. package/dist/test/unit/lib/importInPTxBuilder.js +0 -500
  96. package/dist/test/unit/lib/transaction.d.ts +0 -2
  97. package/dist/test/unit/lib/transaction.d.ts.map +0 -1
  98. package/dist/test/unit/lib/transaction.js +0 -460
  99. package/dist/test/unit/lib/utils.d.ts +0 -2
  100. package/dist/test/unit/lib/utils.d.ts.map +0 -1
  101. package/dist/test/unit/lib/utils.js +0 -286
  102. package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts +0 -2
  103. package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts.map +0 -1
  104. package/dist/test/unit/permissionlessValidatorTxBuilder.test.js +0 -271
  105. package/dist/test/unit/smoke.d.ts +0 -2
  106. package/dist/test/unit/smoke.d.ts.map +0 -1
  107. package/dist/test/unit/smoke.js +0 -23
  108. package/dist/test/unit/transactionBuilder.test.d.ts +0 -2
  109. package/dist/test/unit/transactionBuilder.test.d.ts.map +0 -1
  110. package/dist/test/unit/transactionBuilder.test.js +0 -114
  111. package/dist/test/unit/validatorTxBuilder.test.d.ts +0 -2
  112. package/dist/test/unit/validatorTxBuilder.test.d.ts.map +0 -1
  113. package/dist/test/unit/validatorTxBuilder.test.js +0 -293
@@ -1,584 +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-beta/statics");
37
- const sdk_core_1 = require("@bitgo-beta/sdk-core");
38
- const assert = __importStar(require("assert"));
39
- const exportInCTxBuilder_1 = require("../../../src/lib/exportInCTxBuilder");
40
- describe('ExportInCTxBuilder', function () {
41
- const coinConfig = statics_1.coins.get('tflrp');
42
- let builder;
43
- beforeEach(function () {
44
- builder = new exportInCTxBuilder_1.ExportInCTxBuilder(coinConfig);
45
- });
46
- describe('Constructor', function () {
47
- it('should initialize with coin config', function () {
48
- assert.ok(builder);
49
- assert.ok(builder instanceof exportInCTxBuilder_1.ExportInCTxBuilder);
50
- });
51
- it('should extend AtomicInCTransactionBuilder', function () {
52
- // Test inheritance
53
- assert.ok(builder);
54
- });
55
- });
56
- describe('UTXO Override', function () {
57
- it('should throw error when trying to set UTXOs', function () {
58
- const mockUtxos = [{ id: 'test' }];
59
- assert.throws(() => {
60
- builder.utxos(mockUtxos);
61
- }, sdk_core_1.BuildTransactionError, 'Should reject UTXOs for C-chain export transactions');
62
- });
63
- it('should throw error for empty UTXO array', function () {
64
- assert.throws(() => {
65
- builder.utxos([]);
66
- }, sdk_core_1.BuildTransactionError, 'Should reject empty UTXO array');
67
- });
68
- it('should throw error for any UTXO input', function () {
69
- const testCases = [[], [{}], ['invalid'], null, undefined];
70
- testCases.forEach((testCase, index) => {
71
- assert.throws(() => {
72
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
73
- builder.utxos(testCase);
74
- }, sdk_core_1.BuildTransactionError, `Test case ${index} should throw error`);
75
- });
76
- });
77
- });
78
- describe('Amount Management', function () {
79
- it('should set valid positive amounts', function () {
80
- const validAmounts = ['1000', '1000000000000000000', '999999999999999999'];
81
- validAmounts.forEach((amount) => {
82
- assert.doesNotThrow(() => {
83
- builder.amount(amount);
84
- }, `Should accept amount: ${amount}`);
85
- });
86
- });
87
- it('should set bigint amounts', function () {
88
- const bigintAmounts = [1000n, 1000000000000000000n, 999999999999999999n];
89
- bigintAmounts.forEach((amount) => {
90
- assert.doesNotThrow(() => {
91
- builder.amount(amount);
92
- }, `Should accept bigint amount: ${amount}`);
93
- });
94
- });
95
- it('should set numeric amounts', function () {
96
- const numericAmounts = [1000, 2000000, 999999999];
97
- numericAmounts.forEach((amount) => {
98
- assert.doesNotThrow(() => {
99
- builder.amount(amount);
100
- }, `Should accept numeric amount: ${amount}`);
101
- });
102
- });
103
- it('should reject zero amount', function () {
104
- assert.throws(() => {
105
- builder.amount(0);
106
- }, /Amount must be positive/);
107
- assert.throws(() => {
108
- builder.amount('0');
109
- }, /Amount must be positive/);
110
- assert.throws(() => {
111
- builder.amount(0n);
112
- }, /Amount must be positive/);
113
- });
114
- it('should reject negative amounts', function () {
115
- const negativeAmounts = ['-1000', '-1'];
116
- negativeAmounts.forEach((amount) => {
117
- assert.throws(() => {
118
- builder.amount(amount);
119
- }, sdk_core_1.BuildTransactionError, `Should reject negative amount: ${amount}`);
120
- });
121
- });
122
- it('should handle large amounts', function () {
123
- const largeAmounts = [
124
- '100000000000000000000000', // Very large amount
125
- '18446744073709551615', // Near uint64 max
126
- BigInt('999999999999999999999999999999'),
127
- ];
128
- largeAmounts.forEach((amount) => {
129
- assert.doesNotThrow(() => {
130
- builder.amount(amount);
131
- }, `Should handle large amount: ${amount}`);
132
- });
133
- });
134
- it('should chain amount setting with other methods', function () {
135
- const amount = '1000000000000000000';
136
- const nonce = 1n;
137
- assert.doesNotThrow(() => {
138
- builder.amount(amount).nonce(nonce);
139
- });
140
- });
141
- });
142
- describe('Nonce Management', function () {
143
- it('should set valid nonce values', function () {
144
- const validNonces = [0n, 1n, 1000n, 999999999999n];
145
- validNonces.forEach((nonce) => {
146
- assert.doesNotThrow(() => {
147
- builder.nonce(nonce);
148
- }, `Should accept nonce: ${nonce}`);
149
- });
150
- });
151
- it('should set string nonce values', function () {
152
- const stringNonces = ['0', '1', '1000', '999999999999'];
153
- stringNonces.forEach((nonce) => {
154
- assert.doesNotThrow(() => {
155
- builder.nonce(nonce);
156
- }, `Should accept string nonce: ${nonce}`);
157
- });
158
- });
159
- it('should set numeric nonce values', function () {
160
- const numericNonces = [0, 1, 1000, 999999];
161
- numericNonces.forEach((nonce) => {
162
- assert.doesNotThrow(() => {
163
- builder.nonce(nonce);
164
- }, `Should accept numeric nonce: ${nonce}`);
165
- });
166
- });
167
- it('should reject negative nonce values', function () {
168
- const negativeNonces = [-1n, -1000n];
169
- negativeNonces.forEach((nonce) => {
170
- assert.throws(() => {
171
- builder.nonce(nonce);
172
- }, sdk_core_1.BuildTransactionError, `Should reject negative nonce: ${nonce}`);
173
- });
174
- });
175
- it('should reject negative string nonce values', function () {
176
- const negativeStringNonces = ['-1', '-1000'];
177
- negativeStringNonces.forEach((nonce) => {
178
- assert.throws(() => {
179
- builder.nonce(nonce);
180
- }, sdk_core_1.BuildTransactionError, `Should reject negative string nonce: ${nonce}`);
181
- });
182
- });
183
- it('should handle large nonce values', function () {
184
- const largeNonces = [
185
- '18446744073709551615', // Max uint64
186
- BigInt('999999999999999999999999999999'),
187
- 1000000000000000000n,
188
- ];
189
- largeNonces.forEach((nonce) => {
190
- assert.doesNotThrow(() => {
191
- builder.nonce(nonce);
192
- }, `Should handle large nonce: ${nonce}`);
193
- });
194
- });
195
- it('should chain nonce setting with other methods', function () {
196
- const nonce = 123n;
197
- const amount = '1000000000000000000';
198
- assert.doesNotThrow(() => {
199
- builder.nonce(nonce).amount(amount);
200
- });
201
- });
202
- });
203
- describe('Destination Address Management', function () {
204
- it('should set single destination address', function () {
205
- const singleAddress = 'P-flare1destination';
206
- assert.doesNotThrow(() => {
207
- builder.to(singleAddress);
208
- });
209
- });
210
- it('should set multiple destination addresses', function () {
211
- const multipleAddresses = ['P-flare1dest1', 'P-flare1dest2', 'P-flare1dest3'];
212
- assert.doesNotThrow(() => {
213
- builder.to(multipleAddresses);
214
- });
215
- });
216
- it('should handle comma-separated addresses', function () {
217
- const commaSeparated = 'P-flare1dest1~P-flare1dest2~P-flare1dest3';
218
- assert.doesNotThrow(() => {
219
- builder.to(commaSeparated);
220
- });
221
- });
222
- it('should handle empty address array', function () {
223
- assert.doesNotThrow(() => {
224
- builder.to([]);
225
- });
226
- });
227
- it('should chain address setting with other methods', function () {
228
- const addresses = ['P-flare1dest1', 'P-flare1dest2'];
229
- const amount = '1000000000000000000';
230
- assert.doesNotThrow(() => {
231
- builder.to(addresses).amount(amount);
232
- });
233
- });
234
- });
235
- describe('Transaction Type Verification', function () {
236
- it('should verify transaction type (placeholder returns true)', function () {
237
- const mockTx = { type: 'export' };
238
- const result = exportInCTxBuilder_1.ExportInCTxBuilder.verifyTxType(mockTx);
239
- assert.strictEqual(result, true); // Placeholder always returns true
240
- });
241
- it('should handle different transaction objects', function () {
242
- const testCases = [{}, null, undefined, { type: 'import' }, { data: 'test' }];
243
- testCases.forEach((testCase, index) => {
244
- const result = exportInCTxBuilder_1.ExportInCTxBuilder.verifyTxType(testCase);
245
- assert.strictEqual(result, true, `Test case ${index} should return true (placeholder)`);
246
- });
247
- });
248
- it('should verify via instance method', function () {
249
- const mockTx = { type: 'export' };
250
- const result = builder.verifyTxType(mockTx);
251
- assert.strictEqual(result, true);
252
- });
253
- });
254
- describe('Transaction Building', function () {
255
- it('should handle building when transaction has credentials', function () {
256
- const mockTx = {
257
- unsignedTx: {
258
- networkId: 0, // Match builder's default
259
- sourceBlockchainId: Buffer.alloc(0), // Match builder's default
260
- destinationBlockchainId: Buffer.from('test-dest'),
261
- inputs: [
262
- {
263
- address: 'C-flare1test',
264
- amount: 2000000000000000000n,
265
- assetId: Buffer.alloc(0), // Match builder's default
266
- nonce: 1n,
267
- },
268
- ],
269
- outputs: [
270
- {
271
- addresses: ['P-flare1dest'],
272
- amount: 1000000000000000000n,
273
- assetId: Buffer.alloc(0), // Match builder's default
274
- },
275
- ],
276
- },
277
- credentials: [],
278
- };
279
- builder.initBuilder(mockTx);
280
- // Should not throw when credentials exist
281
- assert.doesNotThrow(() => {
282
- // Access protected method via type assertion
283
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
284
- builder.buildFlareTransaction();
285
- });
286
- });
287
- it('should require amount for building', function () {
288
- builder.nonce(1n);
289
- builder.to(['P-flare1dest']);
290
- // Mock setting from addresses via transaction initialization
291
- const mockRawTx = {
292
- unsignedTx: {
293
- networkId: 0, // Match builder's default
294
- sourceBlockchainId: Buffer.alloc(0), // Match builder's default
295
- destinationBlockchainId: Buffer.from('test-dest'),
296
- inputs: [
297
- {
298
- address: 'C-flare1test',
299
- amount: 2000000000000000000n,
300
- assetId: Buffer.alloc(0), // Match builder's default
301
- nonce: 1n,
302
- },
303
- ],
304
- outputs: [
305
- {
306
- addresses: ['P-flare1dest'],
307
- amount: 1000000000000000000n,
308
- assetId: Buffer.alloc(0), // Match builder's default
309
- },
310
- ],
311
- },
312
- credentials: [],
313
- };
314
- builder.initBuilder(mockRawTx);
315
- // Clear amount to test error
316
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
317
- builder._amount = undefined;
318
- assert.throws(() => {
319
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
320
- builder.buildFlareTransaction();
321
- }, Error);
322
- });
323
- });
324
- describe('Transaction Initialization', function () {
325
- it('should initialize from raw transaction object', function () {
326
- const mockRawTx = {
327
- unsignedTx: {
328
- networkId: 0, // Match builder's default
329
- sourceBlockchainId: Buffer.alloc(0), // Match builder's default
330
- destinationBlockchainId: Buffer.from('test-dest'),
331
- inputs: [
332
- {
333
- address: 'C-flare1test',
334
- amount: 2000000000000000000n,
335
- assetId: Buffer.alloc(0), // Match builder's default
336
- nonce: 1n,
337
- },
338
- ],
339
- outputs: [
340
- {
341
- addresses: ['P-flare1dest'],
342
- amount: 1000000000000000000n,
343
- assetId: Buffer.alloc(0), // Match builder's default
344
- },
345
- ],
346
- },
347
- credentials: [],
348
- };
349
- assert.doesNotThrow(() => {
350
- builder.initBuilder(mockRawTx);
351
- });
352
- });
353
- it('should validate blockchain ID during initialization', function () {
354
- const mockRawTx = {
355
- unsignedTx: {
356
- networkId: 0, // Match builder's default
357
- sourceBlockchainId: Buffer.from('wrong-blockchain'),
358
- destinationBlockchainId: Buffer.from('test-dest'),
359
- inputs: [
360
- {
361
- address: 'C-flare1test',
362
- amount: 2000000000000000000n,
363
- assetId: Buffer.alloc(0), // Match builder's default
364
- nonce: 1n,
365
- },
366
- ],
367
- outputs: [
368
- {
369
- addresses: ['P-flare1dest'],
370
- amount: 1000000000000000000n,
371
- assetId: Buffer.alloc(0), // Match builder's default
372
- },
373
- ],
374
- },
375
- credentials: [],
376
- };
377
- assert.throws(() => {
378
- builder.initBuilder(mockRawTx);
379
- }, Error);
380
- });
381
- it('should validate single output requirement', function () {
382
- const mockRawTx = {
383
- unsignedTx: {
384
- networkId: 0, // Match builder's default
385
- sourceBlockchainId: Buffer.alloc(0), // Match builder's default // Will match default
386
- destinationBlockchainId: Buffer.from('test-dest'),
387
- inputs: [
388
- {
389
- address: 'C-flare1test',
390
- amount: 2000000000000000000n,
391
- assetId: Buffer.alloc(0), // Match builder's default
392
- nonce: 1n,
393
- },
394
- ],
395
- outputs: [
396
- {
397
- addresses: ['P-flare1dest1'],
398
- amount: 500000000000000000n,
399
- assetId: Buffer.alloc(0), // Match builder's default
400
- },
401
- {
402
- addresses: ['P-flare1dest2'],
403
- amount: 500000000000000000n,
404
- assetId: Buffer.alloc(0), // Match builder's default
405
- },
406
- ],
407
- },
408
- credentials: [],
409
- };
410
- assert.throws(() => {
411
- builder.initBuilder(mockRawTx);
412
- }, sdk_core_1.BuildTransactionError);
413
- });
414
- it('should validate single input requirement', function () {
415
- const mockRawTx = {
416
- unsignedTx: {
417
- networkId: 0, // Match builder's default
418
- sourceBlockchainId: Buffer.alloc(0), // Match builder's default
419
- destinationBlockchainId: Buffer.from('test-dest'),
420
- inputs: [
421
- {
422
- address: 'C-flare1test1',
423
- amount: 1000000000000000000n,
424
- assetId: Buffer.alloc(0), // Match builder's default
425
- nonce: 1n,
426
- },
427
- {
428
- address: 'C-flare1test2',
429
- amount: 1000000000000000000n,
430
- assetId: Buffer.alloc(0), // Match builder's default
431
- nonce: 2n,
432
- },
433
- ],
434
- outputs: [
435
- {
436
- addresses: ['P-flare1dest'],
437
- amount: 1000000000000000000n,
438
- assetId: Buffer.alloc(0), // Match builder's default
439
- },
440
- ],
441
- },
442
- credentials: [],
443
- };
444
- assert.throws(() => {
445
- builder.initBuilder(mockRawTx);
446
- }, sdk_core_1.BuildTransactionError);
447
- });
448
- it('should validate negative fee calculation', function () {
449
- const mockRawTx = {
450
- unsignedTx: {
451
- networkId: 0, // Match builder's default
452
- sourceBlockchainId: Buffer.alloc(0), // Match builder's default
453
- destinationBlockchainId: Buffer.from('test-dest'),
454
- inputs: [
455
- {
456
- address: 'C-flare1test',
457
- amount: 500000000000000000n, // Less than output
458
- assetId: Buffer.alloc(0), // Match builder's default
459
- nonce: 1n,
460
- },
461
- ],
462
- outputs: [
463
- {
464
- addresses: ['P-flare1dest'],
465
- amount: 1000000000000000000n, // More than input
466
- assetId: Buffer.alloc(0), // Match builder's default
467
- },
468
- ],
469
- },
470
- credentials: [],
471
- };
472
- assert.throws(() => {
473
- builder.initBuilder(mockRawTx);
474
- }, sdk_core_1.BuildTransactionError);
475
- });
476
- });
477
- describe('From Implementation', function () {
478
- it('should handle string raw transaction', function () {
479
- const rawString = 'hex-encoded-transaction';
480
- assert.doesNotThrow(() => {
481
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
482
- builder.fromImplementation(rawString);
483
- });
484
- });
485
- it('should handle object raw transaction', function () {
486
- const mockRawTx = {
487
- unsignedTx: {
488
- networkId: 0, // Match builder's default
489
- sourceBlockchainId: Buffer.alloc(0), // Match builder's default
490
- destinationBlockchainId: Buffer.from('test-dest'),
491
- inputs: [
492
- {
493
- address: 'C-flare1test',
494
- amount: 2000000000000000000n,
495
- assetId: Buffer.alloc(0), // Match builder's default
496
- nonce: 1n,
497
- },
498
- ],
499
- outputs: [
500
- {
501
- addresses: ['P-flare1dest'],
502
- amount: 1000000000000000000n,
503
- assetId: Buffer.alloc(0), // Match builder's default
504
- },
505
- ],
506
- },
507
- credentials: [],
508
- };
509
- assert.doesNotThrow(() => {
510
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
511
- builder.fromImplementation(mockRawTx);
512
- });
513
- });
514
- });
515
- describe('Integration Tests', function () {
516
- it('should handle complete export flow preparation', function () {
517
- const amount = '1000000000000000000'; // 1 FLR
518
- const nonce = 123n;
519
- const toAddresses = ['P-flare1destination'];
520
- // Complete setup
521
- builder.amount(amount).nonce(nonce).to(toAddresses);
522
- // All operations should complete without throwing
523
- assert.ok(true);
524
- });
525
- it('should handle method chaining extensively', function () {
526
- // Test extensive method chaining
527
- assert.doesNotThrow(() => {
528
- builder
529
- .amount('5000000000000000000') // 5 FLR
530
- .nonce(456n)
531
- .to(['P-flare1receiver1', 'P-flare1receiver2']);
532
- });
533
- });
534
- it('should handle large transaction values', function () {
535
- const largeAmount = '100000000000000000000000'; // 100k FLR
536
- const largeNonce = 999999999999n;
537
- assert.doesNotThrow(() => {
538
- builder.amount(largeAmount).nonce(largeNonce);
539
- });
540
- });
541
- it('should handle multiple destination addresses', function () {
542
- const multipleDestinations = [
543
- 'P-flare1dest1',
544
- 'P-flare1dest2',
545
- 'P-flare1dest3',
546
- 'P-flare1dest4',
547
- 'P-flare1dest5',
548
- ];
549
- assert.doesNotThrow(() => {
550
- builder.amount('1000000000000000000').to(multipleDestinations);
551
- });
552
- });
553
- });
554
- describe('Edge Cases', function () {
555
- it('should handle zero values appropriately', function () {
556
- // Zero amount should be rejected
557
- assert.throws(() => {
558
- builder.amount(0);
559
- }, /Amount must be positive/);
560
- // Zero nonce should be valid
561
- assert.doesNotThrow(() => {
562
- builder.nonce(0n);
563
- });
564
- });
565
- it('should handle maximum values', function () {
566
- const maxBigInt = BigInt('18446744073709551615'); // Max uint64
567
- assert.doesNotThrow(() => {
568
- builder.amount(maxBigInt);
569
- });
570
- assert.doesNotThrow(() => {
571
- builder.nonce(maxBigInt);
572
- });
573
- });
574
- it('should maintain state across multiple operations', function () {
575
- // Build state incrementally
576
- builder.amount('1000000000000000000');
577
- builder.nonce(123n);
578
- builder.to(['P-flare1dest']);
579
- // State should be maintained across operations
580
- assert.ok(true);
581
- });
582
- });
583
- });
584
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0SW5DVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L2xpYi9leHBvcnRJbkNUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxpREFBNEM7QUFDNUMsbURBQTZEO0FBQzdELCtDQUFpQztBQUNqQyw0RUFBeUU7QUFFekUsUUFBUSxDQUFDLG9CQUFvQixFQUFFO0lBQzdCLE1BQU0sVUFBVSxHQUFHLGVBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEMsSUFBSSxPQUEyQixDQUFDO0lBRWhDLFVBQVUsQ0FBQztRQUNULE9BQU8sR0FBRyxJQUFJLHVDQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQy9DLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGFBQWEsRUFBRTtRQUN0QixFQUFFLENBQUMsb0NBQW9DLEVBQUU7WUFDdkMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNuQixNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sWUFBWSx1Q0FBa0IsQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDJDQUEyQyxFQUFFO1lBQzlDLG1CQUFtQjtZQUNuQixNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsZUFBZSxFQUFFO1FBQ3hCLEVBQUUsQ0FBQyw2Q0FBNkMsRUFBRTtZQUNoRCxNQUFNLFNBQVMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFFbkMsTUFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUU7Z0JBQ0gsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FB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b3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IEJ1aWxkVHJhbnNhY3Rpb25FcnJvciB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgRXhwb3J0SW5DVHhCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi9leHBvcnRJbkNUeEJ1aWxkZXInO1xuXG5kZXNjcmliZSgnRXhwb3J0SW5DVHhCdWlsZGVyJywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBjb2luQ29uZmlnID0gY29pbnMuZ2V0KCd0ZmxycCcpO1xuICBsZXQgYnVpbGRlcjogRXhwb3J0SW5DVHhCdWlsZGVyO1xuXG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIGJ1aWxkZXIgPSBuZXcgRXhwb3J0SW5DVHhCdWlsZGVyKGNvaW5Db25maWcpO1xuICB9KTtcblxuICBkZXNjcmliZSgnQ29uc3RydWN0b3InLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBpbml0aWFsaXplIHdpdGggY29pbiBjb25maWcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQub2soYnVpbGRlcik7XG4gICAgICBhc3NlcnQub2soYnVpbGRlciBpbnN0YW5jZW9mIEV4cG9ydEluQ1R4QnVpbGRlcik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGV4dGVuZCBBdG9taWNJbkNUcmFuc2FjdGlvbkJ1aWxkZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBUZXN0IGluaGVyaXRhbmNlXG4gICAgICBhc3NlcnQub2soYnVpbGRlcik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdVVFhPIE92ZXJyaWRlJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3Igd2hlbiB0cnlpbmcgdG8gc2V0IFVUWE9zJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbW9ja1V0eG9zID0gW3sgaWQ6ICd0ZXN0JyB9XTtcblxuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIGJ1aWxkZXIudXR4b3MobW9ja1V0eG9zKTtcbiAgICAgICAgfSxcbiAgICAgICAgQnVpbGRUcmFuc2FjdGlvbkVycm9yLFxuICAgICAgICAnU2hvdWxkIHJlamVjdCBVVFhPcyBmb3IgQy1jaGFpbiBleHBvcnQgdHJhbnNhY3Rpb25zJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIGVtcHR5IFVUWE8gYXJyYXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgYnVpbGRlci51dHhvcyhbXSk7XG4gICAgICAgIH0sXG4gICAgICAgIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcixcbiAgICAgICAgJ1Nob3VsZCByZWplY3QgZW1wdHkgVVRYTyBhcnJheSdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBhbnkgVVRYTyBpbnB1dCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHRlc3RDYXNlcyA9IFtbXSwgW3t9XSwgWydpbnZhbGlkJ10sIG51bGwsIHVuZGVmaW5lZF07XG5cbiAgICAgIHRlc3RDYXNlcy5mb3JFYWNoKCh0ZXN0Q2FzZSwgaW5kZXgpID0+IHtcbiAgICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgYnVpbGRlci51dHhvcyh0ZXN0Q2FzZSBhcyBhbnkpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgQnVpbGRUcmFuc2FjdGlvbkVycm9yLFxuICAgICAgICAgIGBUZXN0IGNhc2UgJHtpbmRleH0gc2hvdWxkIHRocm93IGVycm9yYFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdBbW91bnQgTWFuYWdlbWVudCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHNldCB2YWxpZCBwb3NpdGl2ZSBhbW91bnRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdmFsaWRBbW91bnRzID0gWycxMDAwJywgJzEwMDAwMDAwMDAwMDAwMDAwMDAnLCAnOTk5OTk5OTk5OTk5OTk5OTk5J107XG5cbiAgICAgIHZhbGlkQW1vdW50cy5mb3JFYWNoKChhbW91bnQpID0+IHtcbiAgICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgICAgYnVpbGRlci5hbW91bnQoYW1vdW50KTtcbiAgICAgICAgfSwgYFNob3VsZCBhY2NlcHQgYW1vdW50OiAke2Ftb3VudH1gKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzZXQgYmlnaW50IGFtb3VudHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBiaWdpbnRBbW91bnRzID0gWzEwMDBuLCAxMDAwMDAwMDAwMDAwMDAwMDAwbiwgOTk5OTk5OTk5OTk5OTk5OTk5bl07XG5cbiAgICAgIGJpZ2ludEFtb3VudHMuZm9yRWFjaCgoYW1vdW50KSA9PiB7XG4gICAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICAgIGJ1aWxkZXIuYW1vdW50KGFtb3VudCk7XG4gICAgICAgIH0sIGBTaG91bGQgYWNjZXB0IGJpZ2ludCBhbW91bnQ6ICR7YW1vdW50fWApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNldCBudW1lcmljIGFtb3VudHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBudW1lcmljQW1vdW50cyA9IFsxMDAwLCAyMDAwMDAwLCA5OTk5OTk5OTldO1xuXG4gICAgICBudW1lcmljQW1vdW50cy5mb3JFYWNoKChhbW91bnQpID0+IHtcbiAgICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgICAgYnVpbGRlci5hbW91bnQoYW1vdW50KTtcbiAgICAgICAgfSwgYFNob3VsZCBhY2NlcHQgbnVtZXJpYyBhbW91bnQ6ICR7YW1vdW50fWApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCB6ZXJvIGFtb3VudCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmFtb3VudCgwKTtcbiAgICAgIH0sIC9BbW91bnQgbXVzdCBiZSBwb3NpdGl2ZS8pO1xuXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5hbW91bnQoJzAnKTtcbiAgICAgIH0sIC9BbW91bnQgbXVzdCBiZSBwb3NpdGl2ZS8pO1xuXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5hbW91bnQoMG4pO1xuICAgICAgfSwgL0Ftb3VudCBtdXN0IGJlIHBvc2l0aXZlLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBuZWdhdGl2ZSBhbW91bnRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbmVnYXRpdmVBbW91bnRzID0gWyctMTAwMCcsICctMSddO1xuXG4gICAgICBuZWdhdGl2ZUFtb3VudHMuZm9yRWFjaCgoYW1vdW50KSA9PiB7XG4gICAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgYnVpbGRlci5hbW91bnQoYW1vdW50KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcixcbiAgICAgICAgICBgU2hvdWxkIHJlamVjdCBuZWdhdGl2ZSBhbW91bnQ6ICR7YW1vdW50fWBcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgbGFyZ2UgYW1vdW50cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGxhcmdlQW1vdW50cyA9IFtcbiAgICAgICAgJzEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsIC8vIFZlcnkgbGFyZ2UgYW1vdW50XG4gICAgICAgICcxODQ0Njc0NDA3MzcwOTU1MTYxNScsIC8vIE5lYXIgdWludDY0IG1heFxuICAgICAgICBCaWdJbnQoJzk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OScpLFxuICAgICAgXTtcblxuICAgICAgbGFyZ2VBbW91bnRzLmZvckVhY2goKGFtb3VudCkgPT4ge1xuICAgICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgICBidWlsZGVyLmFtb3VudChhbW91bnQpO1xuICAgICAgICB9LCBgU2hvdWxkIGhhbmRsZSBsYXJnZSBhbW91bnQ6ICR7YW1vdW50fWApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNoYWluIGFtb3VudCBzZXR0aW5nIHdpdGggb3RoZXIgbWV0aG9kcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFtb3VudCA9ICcxMDAwMDAwMDAwMDAwMDAwMDAwJztcbiAgICAgIGNvbnN0IG5vbmNlID0gMW47XG5cbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmFtb3VudChhbW91bnQpLm5vbmNlKG5vbmNlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnTm9uY2UgTWFuYWdlbWVudCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHNldCB2YWxpZCBub25jZSB2YWx1ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB2YWxpZE5vbmNlcyA9IFswbiwgMW4sIDEwMDBuLCA5OTk5OTk5OTk5OTluXTtcblxuICAgICAgdmFsaWROb25jZXMuZm9yRWFjaCgobm9uY2UpID0+IHtcbiAgICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgICAgYnVpbGRlci5ub25jZShub25jZSk7XG4gICAgICAgIH0sIGBTaG91bGQgYWNjZXB0IG5vbmNlOiAke25vbmNlfWApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNldCBzdHJpbmcgbm9uY2UgdmFsdWVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc3RyaW5nTm9uY2VzID0gWycwJywgJzEnLCAnMTAwMCcsICc5OTk5OTk5OTk5OTknXTtcblxuICAgICAgc3RyaW5nTm9uY2VzLmZvckVhY2goKG5vbmNlKSA9PiB7XG4gICAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICAgIGJ1aWxkZXIubm9uY2Uobm9uY2UpO1xuICAgICAgICB9LCBgU2hvdWxkIGFjY2VwdCBzdHJpbmcgbm9uY2U6ICR7bm9uY2V9YCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2V0IG51bWVyaWMgbm9uY2UgdmFsdWVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbnVtZXJpY05vbmNlcyA9IFswLCAxLCAxMDAwLCA5OTk5OTldO1xuXG4gICAgICBudW1lcmljTm9uY2VzLmZvckVhY2goKG5vbmNlKSA9PiB7XG4gICAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICAgIGJ1aWxkZXIubm9uY2Uobm9uY2UpO1xuICAgICAgICB9LCBgU2hvdWxkIGFjY2VwdCBudW1lcmljIG5vbmNlOiAke25vbmNlfWApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBuZWdhdGl2ZSBub25jZSB2YWx1ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBuZWdhdGl2ZU5vbmNlcyA9IFstMW4sIC0xMDAwbl07XG5cbiAgICAgIG5lZ2F0aXZlTm9uY2VzLmZvckVhY2goKG5vbmNlKSA9PiB7XG4gICAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgYnVpbGRlci5ub25jZShub25jZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBCdWlsZFRyYW5zYWN0aW9uRXJyb3IsXG4gICAgICAgICAgYFNob3VsZCByZWplY3QgbmVnYXRpdmUgbm9uY2U6ICR7bm9uY2V9YFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBuZWdhdGl2ZSBzdHJpbmcgbm9uY2UgdmFsdWVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbmVnYXRpdmVTdHJpbmdOb25jZXMgPSBbJy0xJywgJy0xMDAwJ107XG5cbiAgICAgIG5lZ2F0aXZlU3RyaW5nTm9uY2VzLmZvckVhY2goKG5vbmNlKSA9PiB7XG4gICAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgYnVpbGRlci5ub25jZShub25jZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBCdWlsZFRyYW5zYWN0aW9uRXJyb3IsXG4gICAgICAgICAgYFNob3VsZCByZWplY3QgbmVnYXRpdmUgc3RyaW5nIG5vbmNlOiAke25vbmNlfWBcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgbGFyZ2Ugbm9uY2UgdmFsdWVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbGFyZ2VOb25jZXMgPSBbXG4gICAgICAgICcxODQ0Njc0NDA3MzcwOTU1MTYxNScsIC8vIE1heCB1aW50NjRcbiAgICAgICAgQmlnSW50KCc5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTknKSxcbiAgICAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMG4sXG4gICAgICBdO1xuXG4gICAgICBsYXJnZU5vbmNlcy5mb3JFYWNoKChub25jZSkgPT4ge1xuICAgICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgICBidWlsZGVyLm5vbmNlKG5vbmNlKTtcbiAgICAgICAgfSwgYFNob3VsZCBoYW5kbGUgbGFyZ2Ugbm9uY2U6ICR7bm9uY2V9YCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY2hhaW4gbm9uY2Ugc2V0dGluZyB3aXRoIG90aGVyIG1ldGhvZHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBub25jZSA9IDEyM247XG4gICAgICBjb25zdCBhbW91bnQgPSAnMTAwMDAwMDAwMDAwMDAwMDAwMCc7XG5cbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLm5vbmNlKG5vbmNlKS5hbW91bnQoYW1vdW50KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRGVzdGluYXRpb24gQWRkcmVzcyBNYW5hZ2VtZW50JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgc2V0IHNpbmdsZSBkZXN0aW5hdGlvbiBhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc2luZ2xlQWRkcmVzcyA9ICdQLWZsYXJlMWRlc3RpbmF0aW9uJztcblxuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIudG8oc2luZ2xlQWRkcmVzcyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2V0IG11bHRpcGxlIGRlc3RpbmF0aW9uIGFkZHJlc3NlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG11bHRpcGxlQWRkcmVzc2VzID0gWydQLWZsYXJlMWRlc3QxJywgJ1AtZmxhcmUxZGVzdDInLCAnUC1mbGFyZTFkZXN0MyddO1xuXG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgYnVpbGRlci50byhtdWx0aXBsZUFkZHJlc3Nlcyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGNvbW1hLXNlcGFyYXRlZCBhZGRyZXNzZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBjb21tYVNlcGFyYXRlZCA9ICdQLWZsYXJlMWRlc3QxflAtZmxhcmUxZGVzdDJ+UC1mbGFyZTFkZXN0Myc7XG5cbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnRvKGNvbW1hU2VwYXJhdGVkKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgZW1wdHkgYWRkcmVzcyBhcnJheScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnRvKFtdKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjaGFpbiBhZGRyZXNzIHNldHRpbmcgd2l0aCBvdGhlciBtZXRob2RzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWRkcmVzc2VzID0gWydQLWZsYXJlMWRlc3QxJywgJ1AtZmxhcmUxZGVzdDInXTtcbiAgICAgIGNvbnN0IGFtb3VudCA9ICcxMDAwMDAwMDAwMDAwMDAwMDAwJztcblxuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIudG8oYWRkcmVzc2VzKS5hbW91bnQoYW1vdW50KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVHJhbnNhY3Rpb24gVHlwZSBWZXJpZmljYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB2ZXJpZnkgdHJhbnNhY3Rpb24gdHlwZSAocGxhY2Vob2xkZXIgcmV0dXJucyB0cnVlKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1vY2tUeCA9IHsgdHlwZTogJ2V4cG9ydCcgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IEV4cG9ydEluQ1R4QnVpbGRlci52ZXJpZnlUeFR5cGUobW9ja1R4KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIHRydWUpOyAvLyBQbGFjZWhvbGRlciBhbHdheXMgcmV0dXJucyB0cnVlXG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBkaWZmZXJlbnQgdHJhbnNhY3Rpb24gb2JqZWN0cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHRlc3RDYXNlcyA9IFt7fSwgbnVsbCwgdW5kZWZpbmVkLCB7IHR5cGU6ICdpbXBvcnQnIH0sIHsgZGF0YTogJ3Rlc3QnIH1dO1xuXG4gICAgICB0ZXN0Q2FzZXMuZm9yRWFjaCgodGVzdENhc2UsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IEV4cG9ydEluQ1R4QnVpbGRlci52ZXJpZnlUeFR5cGUodGVzdENhc2UpO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCB0cnVlLCBgVGVzdCBjYXNlICR7aW5kZXh9IHNob3VsZCByZXR1cm4gdHJ1ZSAocGxhY2Vob2xkZXIpYCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmVyaWZ5IHZpYSBpbnN0YW5jZSBtZXRob2QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBtb2NrVHggPSB7IHR5cGU6ICdleHBvcnQnIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBidWlsZGVyLnZlcmlmeVR4VHlwZShtb2NrVHgpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgdHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdUcmFuc2FjdGlvbiBCdWlsZGluZycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBidWlsZGluZyB3aGVuIHRyYW5zYWN0aW9uIGhhcyBjcmVkZW50aWFscycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1vY2tUeCA9IHtcbiAgICAgICAgdW5zaWduZWRUeDoge1xuICAgICAgICAgIG5ldHdvcmtJZDogMCwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICBzb3VyY2VCbG9ja2NoYWluSWQ6IEJ1ZmZlci5hbGxvYygwKSwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICBkZXN0aW5hdGlvbkJsb2NrY2hhaW5JZDogQnVmZmVyLmZyb20oJ3Rlc3QtZGVzdCcpLFxuICAgICAgICAgIGlucHV0czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzOiAnQy1mbGFyZTF0ZXN0JyxcbiAgICAgICAgICAgICAgYW1vdW50OiAyMDAwMDAwMDAwMDAwMDAwMDAwbixcbiAgICAgICAgICAgICAgYXNzZXRJZDogQnVmZmVyLmFsbG9jKDApLCAvLyBNYXRjaCBidWlsZGVyJ3MgZGVmYXVsdFxuICAgICAgICAgICAgICBub25jZTogMW4sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzZXM6IFsnUC1mbGFyZTFkZXN0J10sXG4gICAgICAgICAgICAgIGFtb3VudDogMTAwMDAwMDAwMDAwMDAwMDAwMG4sXG4gICAgICAgICAgICAgIGFzc2V0SWQ6IEJ1ZmZlci5hbGxvYygwKSwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgY3JlZGVudGlhbHM6IFtdLFxuICAgICAgfTtcbiAgICAgIGJ1aWxkZXIuaW5pdEJ1aWxkZXIobW9ja1R4KTtcblxuICAgICAgLy8gU2hvdWxkIG5vdCB0aHJvdyB3aGVuIGNyZWRlbnRpYWxzIGV4aXN0XG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgLy8gQWNjZXNzIHByb3RlY3RlZCBtZXRob2QgdmlhIHR5cGUgYXNzZXJ0aW9uXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIChidWlsZGVyIGFzIGFueSkuYnVpbGRGbGFyZVRyYW5zYWN0aW9uKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVxdWlyZSBhbW91bnQgZm9yIGJ1aWxkaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgYnVpbGRlci5ub25jZSgxbik7XG4gICAgICBidWlsZGVyLnRvKFsnUC1mbGFyZTFkZXN0J10pO1xuXG4gICAgICAvLyBNb2NrIHNldHRpbmcgZnJvbSBhZGRyZXNzZXMgdmlhIHRyYW5zYWN0aW9uIGluaXRpYWxpemF0aW9uXG4gICAgICBjb25zdCBtb2NrUmF3VHggPSB7XG4gICAgICAgIHVuc2lnbmVkVHg6IHtcbiAgICAgICAgICBuZXR3b3JrSWQ6IDAsIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgc291cmNlQmxvY2tjaGFpbklkOiBCdWZmZXIuYWxsb2MoMCksIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgZGVzdGluYXRpb25CbG9ja2NoYWluSWQ6IEJ1ZmZlci5mcm9tKCd0ZXN0LWRlc3QnKSxcbiAgICAgICAgICBpbnB1dHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWRkcmVzczogJ0MtZmxhcmUxdGVzdCcsXG4gICAgICAgICAgICAgIGFtb3VudDogMjAwMDAwMDAwMDAwMDAwMDAwMG4sXG4gICAgICAgICAgICAgIGFzc2V0SWQ6IEJ1ZmZlci5hbGxvYygwKSwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICAgICAgbm9uY2U6IDFuLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWRkcmVzc2VzOiBbJ1AtZmxhcmUxZGVzdCddLFxuICAgICAgICAgICAgICBhbW91bnQ6IDEwMDAwMDAwMDAwMDAwMDAwMDBuLFxuICAgICAgICAgICAgICBhc3NldElkOiBCdWZmZXIuYWxsb2MoMCksIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIGNyZWRlbnRpYWxzOiBbXSxcbiAgICAgIH07XG5cbiAgICAgIGJ1aWxkZXIuaW5pdEJ1aWxkZXIobW9ja1Jhd1R4KTtcbiAgICAgIC8vIENsZWFyIGFtb3VudCB0byB0ZXN0IGVycm9yXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgKGJ1aWxkZXIgYXMgYW55KS5fYW1vdW50ID0gdW5kZWZpbmVkO1xuXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgKGJ1aWxkZXIgYXMgYW55KS5idWlsZEZsYXJlVHJhbnNhY3Rpb24oKTtcbiAgICAgIH0sIEVycm9yKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1RyYW5zYWN0aW9uIEluaXRpYWxpemF0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgaW5pdGlhbGl6ZSBmcm9tIHJhdyB0cmFuc2FjdGlvbiBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBtb2NrUmF3VHggPSB7XG4gICAgICAgIHVuc2lnbmVkVHg6IHtcbiAgICAgICAgICBuZXR3b3JrSWQ6IDAsIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgc291cmNlQmxvY2tjaGFpbklkOiBCdWZmZXIuYWxsb2MoMCksIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgZGVzdGluYXRpb25CbG9ja2NoYWluSWQ6IEJ1ZmZlci5mcm9tKCd0ZXN0LWRlc3QnKSxcbiAgICAgICAgICBpbnB1dHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWRkcmVzczogJ0MtZmxhcmUxdGVzdCcsXG4gICAgICAgICAgICAgIGFtb3VudDogMjAwMDAwMDAwMDAwMDAwMDAwMG4sXG4gICAgICAgICAgICAgIGFzc2V0SWQ6IEJ1ZmZlci5hbGxvYygwKSwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICAgICAgbm9uY2U6IDFuLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWRkcmVzc2VzOiBbJ1AtZmxhcmUxZGVzdCddLFxuICAgICAgICAgICAgICBhbW91bnQ6IDEwMDAwMDAwMDAwMDAwMDAwMDBuLFxuICAgICAgICAgICAgICBhc3NldElkOiBCdWZmZXIuYWxsb2MoMCksIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIGNyZWRlbnRpYWxzOiBbXSxcbiAgICAgIH07XG5cbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmluaXRCdWlsZGVyKG1vY2tSYXdUeCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgYmxvY2tjaGFpbiBJRCBkdXJpbmcgaW5pdGlhbGl6YXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBtb2NrUmF3VHggPSB7XG4gICAgICAgIHVuc2lnbmVkVHg6IHtcbiAgICAgICAgICBuZXR3b3JrSWQ6IDAsIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgc291cmNlQmxvY2tjaGFpbklkOiBCdWZmZXIuZnJvbSgnd3JvbmctYmxvY2tjaGFpbicpLFxuICAgICAgICAgIGRlc3RpbmF0aW9uQmxvY2tjaGFpbklkOiBCdWZmZXIuZnJvbSgndGVzdC1kZXN0JyksXG4gICAgICAgICAgaW5wdXRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFkZHJlc3M6ICdDLWZsYXJlMXRlc3QnLFxuICAgICAgICAgICAgICBhbW91bnQ6IDIwMDAwMDAwMDAwMDAwMDAwMDBuLFxuICAgICAgICAgICAgICBhc3NldElkOiBCdWZmZXIuYWxsb2MoMCksIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgICAgIG5vbmNlOiAxbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFkZHJlc3NlczogWydQLWZsYXJlMWRlc3QnXSxcbiAgICAgICAgICAgICAgYW1vdW50OiAxMDAwMDAwMDAwMDAwMDAwMDAwbixcbiAgICAgICAgICAgICAgYXNzZXRJZDogQnVmZmVyLmFsbG9jKDApLCAvLyBNYXRjaCBidWlsZGVyJ3MgZGVmYXVsdFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBjcmVkZW50aWFsczogW10sXG4gICAgICB9O1xuXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5pbml0QnVpbGRlcihtb2NrUmF3VHgpO1xuICAgICAgfSwgRXJyb3IpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBzaW5nbGUgb3V0cHV0IHJlcXVpcmVtZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbW9ja1Jhd1R4ID0ge1xuICAgICAgICB1bnNpZ25lZFR4OiB7XG4gICAgICAgICAgbmV0d29ya0lkOiAwLCAvLyBNYXRjaCBidWlsZGVyJ3MgZGVmYXVsdFxuICAgICAgICAgIHNvdXJjZUJsb2NrY2hhaW5JZDogQnVmZmVyLmFsbG9jKDApLCAvLyBNYXRjaCBidWlsZGVyJ3MgZGVmYXVsdCAvLyBXaWxsIG1hdGNoIGRlZmF1bHRcbiAgICAgICAgICBkZXN0aW5hdGlvbkJsb2NrY2hhaW5JZDogQnVmZmVyLmZyb20oJ3Rlc3QtZGVzdCcpLFxuICAgICAgICAgIGlucHV0czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzOiAnQy1mbGFyZTF0ZXN0JyxcbiAgICAgICAgICAgICAgYW1vdW50OiAyMDAwMDAwMDAwMDAwMDAwMDAwbixcbiAgICAgICAgICAgICAgYXNzZXRJZDogQnVmZmVyLmFsbG9jKDApLCAvLyBNYXRjaCBidWlsZGVyJ3MgZGVmYXVsdFxuICAgICAgICAgICAgICBub25jZTogMW4sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzZXM6IFsnUC1mbGFyZTFkZXN0MSddLFxuICAgICAgICAgICAgICBhbW91bnQ6IDUwMDAwMDAwMDAwMDAwMDAwMG4sXG4gICAgICAgICAgICAgIGFzc2V0SWQ6IEJ1ZmZlci5hbGxvYygwKSwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFkZHJlc3NlczogWydQLWZsYXJlMWRlc3QyJ10sXG4gICAgICAgICAgICAgIGFtb3VudDogNTAwMDAwMDAwMDAwMDAwMDAwbixcbiAgICAgICAgICAgICAgYXNzZXRJZDogQnVmZmVyLmFsbG9jKDApLCAvLyBNYXRjaCBidWlsZGVyJ3MgZGVmYXVsdFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBjcmVkZW50aWFsczogW10sXG4gICAgICB9O1xuXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5pbml0QnVpbGRlcihtb2NrUmF3VHgpO1xuICAgICAgfSwgQnVpbGRUcmFuc2FjdGlvbkVycm9yKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgc2luZ2xlIGlucHV0IHJlcXVpcmVtZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbW9ja1Jhd1R4ID0ge1xuICAgICAgICB1bnNpZ25lZFR4OiB7XG4gICAgICAgICAgbmV0d29ya0lkOiAwLCAvLyBNYXRjaCBidWlsZGVyJ3MgZGVmYXVsdFxuICAgICAgICAgIHNvdXJjZUJsb2NrY2hhaW5JZDogQnVmZmVyLmFsbG9jKDApLCAvLyBNYXRjaCBidWlsZGVyJ3MgZGVmYXVsdFxuICAgICAgICAgIGRlc3RpbmF0aW9uQmxvY2tjaGFpbklkOiBCdWZmZXIuZnJvbSgndGVzdC1kZXN0JyksXG4gICAgICAgICAgaW5wdXRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFkZHJlc3M6ICdDLWZsYXJlMXRlc3QxJyxcbiAgICAgICAgICAgICAgYW1vdW50OiAxMDAwMDAwMDAwMDAwMDAwMDAwbixcbiAgICAgICAgICAgICAgYXNzZXRJZDogQnVmZmVyLmFsbG9jKDApLCAvLyBNYXRjaCBidWlsZGVyJ3MgZGVmYXVsdFxuICAgICAgICAgICAgICBub25jZTogMW4sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzOiAnQy1mbGFyZTF0ZXN0MicsXG4gICAgICAgICAgICAgIGFtb3VudDogMTAwMDAwMDAwMDAwMDAwMDAwMG4sXG4gICAgICAgICAgICAgIGFzc2V0SWQ6IEJ1ZmZlci5hbGxvYygwKSwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICAgICAgbm9uY2U6IDJuLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWRkcmVzc2VzOiBbJ1AtZmxhcmUxZGVzdCddLFxuICAgICAgICAgICAgICBhbW91bnQ6IDEwMDAwMDAwMDAwMDAwMDAwMDBuLFxuICAgICAgICAgICAgICBhc3NldElkOiBCdWZmZXIuYWxsb2MoMCksIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIGNyZWRlbnRpYWxzOiBbXSxcbiAgICAgIH07XG5cbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmluaXRCdWlsZGVyKG1vY2tSYXdUeCk7XG4gICAgICB9LCBCdWlsZFRyYW5zYWN0aW9uRXJyb3IpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBuZWdhdGl2ZSBmZWUgY2FsY3VsYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBtb2NrUmF3VHggPSB7XG4gICAgICAgIHVuc2lnbmVkVHg6IHtcbiAgICAgICAgICBuZXR3b3JrSWQ6IDAsIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgc291cmNlQmxvY2tjaGFpbklkOiBCdWZmZXIuYWxsb2MoMCksIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgZGVzdGluYXRpb25CbG9ja2NoYWluSWQ6IEJ1ZmZlci5mcm9tKCd0ZXN0LWRlc3QnKSxcbiAgICAgICAgICBpbnB1dHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWRkcmVzczogJ0MtZmxhcmUxdGVzdCcsXG4gICAgICAgICAgICAgIGFtb3VudDogNTAwMDAwMDAwMDAwMDAwMDAwbiwgLy8gTGVzcyB0aGFuIG91dHB1dFxuICAgICAgICAgICAgICBhc3NldElkOiBCdWZmZXIuYWxsb2MoMCksIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgICAgIG5vbmNlOiAxbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFkZHJlc3NlczogWydQLWZsYXJlMWRlc3QnXSxcbiAgICAgICAgICAgICAgYW1vdW50OiAxMDAwMDAwMDAwMDAwMDAwMDAwbiwgLy8gTW9yZSB0aGFuIGlucHV0XG4gICAgICAgICAgICAgIGFzc2V0SWQ6IEJ1ZmZlci5hbGxvYygwKSwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgY3JlZGVudGlhbHM6IFtdLFxuICAgICAgfTtcblxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIuaW5pdEJ1aWxkZXIobW9ja1Jhd1R4KTtcbiAgICAgIH0sIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdGcm9tIEltcGxlbWVudGF0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgaGFuZGxlIHN0cmluZyByYXcgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByYXdTdHJpbmcgPSAnaGV4LWVuY29kZWQtdHJhbnNhY3Rpb24nO1xuXG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgKGJ1aWxkZXIgYXMgYW55KS5mcm9tSW1wbGVtZW50YXRpb24ocmF3U3RyaW5nKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgb2JqZWN0IHJhdyB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1vY2tSYXdUeCA9IHtcbiAgICAgICAgdW5zaWduZWRUeDoge1xuICAgICAgICAgIG5ldHdvcmtJZDogMCwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICBzb3VyY2VCbG9ja2NoYWluSWQ6IEJ1ZmZlci5hbGxvYygwKSwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICBkZXN0aW5hdGlvbkJsb2NrY2hhaW5JZDogQnVmZmVyLmZyb20oJ3Rlc3QtZGVzdCcpLFxuICAgICAgICAgIGlucHV0czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzOiAnQy1mbGFyZTF0ZXN0JyxcbiAgICAgICAgICAgICAgYW1vdW50OiAyMDAwMDAwMDAwMDAwMDAwMDAwbixcbiAgICAgICAgICAgICAgYXNzZXRJZDogQnVmZmVyLmFsbG9jKDApLCAvLyBNYXRjaCBidWlsZGVyJ3MgZGVmYXVsdFxuICAgICAgICAgICAgICBub25jZTogMW4sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzZXM6IFsnUC1mbGFyZTFkZXN0J10sXG4gICAgICAgICAgICAgIGFtb3VudDogMTAwMDAwMDAwMDAwMDAwMDAwMG4sXG4gICAgICAgICAgICAgIGFzc2V0SWQ6IEJ1ZmZlci5hbGxvYygwKSwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgY3JlZGVudGlhbHM6IFtdLFxuICAgICAgfTtcblxuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIChidWlsZGVyIGFzIGFueSkuZnJvbUltcGxlbWVudGF0aW9uKG1vY2tSYXdUeCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0ludGVncmF0aW9uIFRlc3RzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgaGFuZGxlIGNvbXBsZXRlIGV4cG9ydCBmbG93IHByZXBhcmF0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYW1vdW50ID0gJzEwMDAwMDAwMDAwMDAwMDAwMDAnOyAvLyAxIEZMUlxuICAgICAgY29uc3Qgbm9uY2UgPSAxMjNuO1xuICAgICAgY29uc3QgdG9BZGRyZXNzZXMgPSBbJ1AtZmxhcmUxZGVzdGluYXRpb24nXTtcblxuICAgICAgLy8gQ29tcGxldGUgc2V0dXBcbiAgICAgIGJ1aWxkZXIuYW1vdW50KGFtb3VudCkubm9uY2Uobm9uY2UpLnRvKHRvQWRkcmVzc2VzKTtcblxuICAgICAgLy8gQWxsIG9wZXJhdGlvbnMgc2hvdWxkIGNvbXBsZXRlIHdpdGhvdXQgdGhyb3dpbmdcbiAgICAgIGFzc2VydC5vayh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIG1ldGhvZCBjaGFpbmluZyBleHRlbnNpdmVseScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFRlc3QgZXh0ZW5zaXZlIG1ldGhvZCBjaGFpbmluZ1xuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXJcbiAgICAgICAgICAuYW1vdW50KCc1MDAwMDAwMDAwMDAwMDAwMDAwJykgLy8gNSBGTFJcbiAgICAgICAgICAubm9uY2UoNDU2bilcbiAgICAgICAgICAudG8oWydQLWZsYXJlMXJlY2VpdmVyMScsICdQLWZsYXJlMXJlY2VpdmVyMiddKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgbGFyZ2UgdHJhbnNhY3Rpb24gdmFsdWVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbGFyZ2VBbW91bnQgPSAnMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJzsgLy8gMTAwayBGTFJcbiAgICAgIGNvbnN0IGxhcmdlTm9uY2UgPSA5OTk5OTk5OTk5OTluO1xuXG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5hbW91bnQobGFyZ2VBbW91bnQpLm5vbmNlKGxhcmdlTm9uY2UpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBtdWx0aXBsZSBkZXN0aW5hdGlvbiBhZGRyZXNzZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBtdWx0aXBsZURlc3RpbmF0aW9ucyA9IFtcbiAgICAgICAgJ1AtZmxhcmUxZGVzdDEnLFxuICAgICAgICAnUC1mbGFyZTFkZXN0MicsXG4gICAgICAgICdQLWZsYXJlMWRlc3QzJyxcbiAgICAgICAgJ1AtZmxhcmUxZGVzdDQnLFxuICAgICAgICAnUC1mbGFyZTFkZXN0NScsXG4gICAgICBdO1xuXG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5hbW91bnQoJzEwMDAwMDAwMDAwMDAwMDAwMDAnKS50byhtdWx0aXBsZURlc3RpbmF0aW9ucyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0VkZ2UgQ2FzZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgemVybyB2YWx1ZXMgYXBwcm9wcmlhdGVseScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFplcm8gYW1vdW50IHNob3VsZCBiZSByZWplY3RlZFxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIuYW1vdW50KDApO1xuICAgICAgfSwgL0Ftb3VudCBtdXN0IGJlIHBvc2l0aXZlLyk7XG5cbiAgICAgIC8vIFplcm8gbm9uY2Ugc2hvdWxkIGJlIHZhbGlkXG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5ub25jZSgwbik7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIG1heGltdW0gdmFsdWVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbWF4QmlnSW50ID0gQmlnSW50KCcxODQ0Njc0NDA3MzcwOTU1MTYxNScpOyAvLyBNYXggdWludDY0XG5cbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmFtb3VudChtYXhCaWdJbnQpO1xuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLm5vbmNlKG1heEJpZ0ludCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbWFpbnRhaW4gc3RhdGUgYWNyb3NzIG11bHRpcGxlIG9wZXJhdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBCdWlsZCBzdGF0ZSBpbmNyZW1lbnRhbGx5XG4gICAgICBidWlsZGVyLmFtb3VudCgnMTAwMDAwMDAwMDAwMDAwMDAwMCcpO1xuICAgICAgYnVpbGRlci5ub25jZSgxMjNuKTtcbiAgICAgIGJ1aWxkZXIudG8oWydQLWZsYXJlMWRlc3QnXSk7XG5cbiAgICAgIC8vIFN0YXRlIHNob3VsZCBiZSBtYWludGFpbmVkIGFjcm9zcyBvcGVyYXRpb25zXG4gICAgICBhc3NlcnQub2sodHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=