@bitgo-beta/sdk-coin-tao 1.0.1-alpha.18 → 1.0.1-alpha.180

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 (132) hide show
  1. package/dist/src/index.d.ts +1 -0
  2. package/dist/src/index.d.ts.map +1 -1
  3. package/dist/src/index.js +2 -1
  4. package/dist/src/lib/constants.d.ts +11 -0
  5. package/dist/src/lib/constants.d.ts.map +1 -0
  6. package/dist/src/lib/constants.js +14 -0
  7. package/dist/src/lib/iface.d.ts +14 -335
  8. package/dist/src/lib/iface.d.ts.map +1 -1
  9. package/dist/src/lib/iface.js +1 -126
  10. package/dist/src/lib/index.d.ts +9 -9
  11. package/dist/src/lib/index.d.ts.map +1 -1
  12. package/dist/src/lib/index.js +30 -51
  13. package/dist/src/lib/moveStakeBuilder.d.ts +84 -0
  14. package/dist/src/lib/moveStakeBuilder.d.ts.map +1 -0
  15. package/dist/src/lib/moveStakeBuilder.js +182 -0
  16. package/dist/src/lib/moveStakeTransaction.d.ts +10 -0
  17. package/dist/src/lib/moveStakeTransaction.d.ts.map +1 -0
  18. package/dist/src/lib/moveStakeTransaction.js +68 -0
  19. package/dist/src/lib/stakingBuilder.d.ts +63 -0
  20. package/dist/src/lib/stakingBuilder.d.ts.map +1 -0
  21. package/dist/src/lib/stakingBuilder.js +133 -0
  22. package/dist/src/lib/tokenTransferBuilder.d.ts +79 -0
  23. package/dist/src/lib/tokenTransferBuilder.d.ts.map +1 -0
  24. package/dist/src/lib/tokenTransferBuilder.js +165 -0
  25. package/dist/src/lib/tokenTransferTransaction.d.ts +8 -0
  26. package/dist/src/lib/tokenTransferTransaction.d.ts.map +1 -0
  27. package/dist/src/lib/tokenTransferTransaction.js +57 -0
  28. package/dist/src/lib/transactionBuilderFactory.d.ts +10 -4
  29. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  30. package/dist/src/lib/transactionBuilderFactory.js +33 -8
  31. package/dist/src/lib/transferBuilder.d.ts +2 -7
  32. package/dist/src/lib/transferBuilder.d.ts.map +1 -1
  33. package/dist/src/lib/transferBuilder.js +8 -3
  34. package/dist/src/lib/unstakeBuilder.d.ts +66 -0
  35. package/dist/src/lib/unstakeBuilder.d.ts.map +1 -0
  36. package/dist/src/lib/unstakeBuilder.js +136 -0
  37. package/dist/src/lib/utils.d.ts +5 -264
  38. package/dist/src/lib/utils.d.ts.map +1 -1
  39. package/dist/src/lib/utils.js +15 -480
  40. package/dist/src/register.d.ts.map +1 -1
  41. package/dist/src/register.js +5 -1
  42. package/dist/src/resources/index.d.ts +1 -1
  43. package/dist/src/resources/index.js +2 -2
  44. package/dist/src/resources/mainnet.d.ts +12 -1
  45. package/dist/src/resources/mainnet.d.ts.map +1 -1
  46. package/dist/src/resources/mainnet.js +14 -3
  47. package/dist/src/resources/testnet.d.ts +13 -0
  48. package/dist/src/resources/testnet.d.ts.map +1 -0
  49. package/dist/src/resources/testnet.js +16 -0
  50. package/dist/src/tao.d.ts +19 -6
  51. package/dist/src/tao.d.ts.map +1 -1
  52. package/dist/src/tao.js +43 -81
  53. package/dist/src/taoToken.d.ts +19 -0
  54. package/dist/src/taoToken.d.ts.map +1 -0
  55. package/dist/src/taoToken.js +52 -0
  56. package/dist/test/integration/index.d.ts +1 -0
  57. package/dist/test/integration/index.d.ts.map +1 -0
  58. package/dist/test/integration/index.js +1 -0
  59. package/dist/test/resources/index.d.ts +150 -0
  60. package/dist/test/resources/index.d.ts.map +1 -0
  61. package/dist/test/resources/index.js +166 -0
  62. package/dist/test/resources/materialData.json +8 -0
  63. package/dist/test/resources/materialDataModified.json +8 -0
  64. package/dist/{src/resources/westend.d.ts → test/resources/testnet.d.ts} +2 -2
  65. package/dist/test/resources/testnet.d.ts.map +1 -0
  66. package/dist/test/resources/testnet.js +5 -0
  67. package/dist/test/unit/fixtures.d.ts +31 -0
  68. package/dist/test/unit/fixtures.d.ts.map +1 -0
  69. package/dist/test/unit/fixtures.js +107 -0
  70. package/dist/test/unit/tao.d.ts +2 -0
  71. package/dist/test/unit/tao.d.ts.map +1 -0
  72. package/dist/test/unit/tao.js +415 -0
  73. package/dist/test/unit/transactionBuilder/base.d.ts +8 -0
  74. package/dist/test/unit/transactionBuilder/base.d.ts.map +1 -0
  75. package/dist/test/unit/transactionBuilder/base.js +238 -0
  76. package/dist/test/unit/transactionBuilder/moveStakeBuilder.d.ts +2 -0
  77. package/dist/test/unit/transactionBuilder/moveStakeBuilder.d.ts.map +1 -0
  78. package/dist/test/unit/transactionBuilder/moveStakeBuilder.js +472 -0
  79. package/dist/test/unit/transactionBuilder/singeltonRegistry.d.ts +2 -0
  80. package/dist/test/unit/transactionBuilder/singeltonRegistry.d.ts.map +1 -0
  81. package/dist/test/unit/transactionBuilder/singeltonRegistry.js +59 -0
  82. package/dist/test/unit/transactionBuilder/stakingBuilder.d.ts +2 -0
  83. package/dist/test/unit/transactionBuilder/stakingBuilder.d.ts.map +1 -0
  84. package/dist/test/unit/transactionBuilder/stakingBuilder.js +112 -0
  85. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts +2 -0
  86. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
  87. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +93 -0
  88. package/dist/test/unit/transactionBuilder/transactionBuilderFactory.d.ts +2 -0
  89. package/dist/test/unit/transactionBuilder/transactionBuilderFactory.d.ts.map +1 -0
  90. package/dist/test/unit/transactionBuilder/transactionBuilderFactory.js +75 -0
  91. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
  92. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  93. package/dist/test/unit/transactionBuilder/transferBuilder.js +309 -0
  94. package/dist/test/unit/transactionBuilder/unstakeBuilder.d.ts +2 -0
  95. package/dist/test/unit/transactionBuilder/unstakeBuilder.d.ts.map +1 -0
  96. package/dist/test/unit/transactionBuilder/unstakeBuilder.js +112 -0
  97. package/dist/test/unit/util.d.ts +2 -0
  98. package/dist/test/unit/util.d.ts.map +1 -0
  99. package/dist/test/unit/util.js +29 -0
  100. package/dist/tsconfig.tsbuildinfo +1 -0
  101. package/package.json +14 -20
  102. package/.eslintignore +0 -4
  103. package/.gitignore +0 -3
  104. package/.mocharc.yml +0 -8
  105. package/.prettierignore +0 -2
  106. package/CHANGELOG.md +0 -36
  107. package/dist/src/lib/errors.d.ts +0 -8
  108. package/dist/src/lib/errors.d.ts.map +0 -1
  109. package/dist/src/lib/errors.js +0 -19
  110. package/dist/src/lib/iface_utils.d.ts +0 -59
  111. package/dist/src/lib/iface_utils.d.ts.map +0 -1
  112. package/dist/src/lib/iface_utils.js +0 -92
  113. package/dist/src/lib/keyPair.d.ts +0 -38
  114. package/dist/src/lib/keyPair.d.ts.map +0 -1
  115. package/dist/src/lib/keyPair.js +0 -117
  116. package/dist/src/lib/nativeTransferBuilder.d.ts +0 -84
  117. package/dist/src/lib/nativeTransferBuilder.d.ts.map +0 -1
  118. package/dist/src/lib/nativeTransferBuilder.js +0 -219
  119. package/dist/src/lib/singletonRegistry.d.ts +0 -7
  120. package/dist/src/lib/singletonRegistry.d.ts.map +0 -1
  121. package/dist/src/lib/singletonRegistry.js +0 -20
  122. package/dist/src/lib/transaction.d.ts +0 -83
  123. package/dist/src/lib/transaction.d.ts.map +0 -1
  124. package/dist/src/lib/transaction.js +0 -610
  125. package/dist/src/lib/transactionBuilder.d.ts +0 -131
  126. package/dist/src/lib/transactionBuilder.d.ts.map +0 -1
  127. package/dist/src/lib/transactionBuilder.js +0 -351
  128. package/dist/src/lib/txnSchema.d.ts +0 -15
  129. package/dist/src/lib/txnSchema.d.ts.map +0 -1
  130. package/dist/src/lib/txnSchema.js +0 -117
  131. package/dist/src/resources/westend.d.ts.map +0 -1
  132. package/dist/src/resources/westend.js +0 -5
@@ -0,0 +1,472 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const assert_1 = __importDefault(require("assert"));
7
+ const should_1 = __importDefault(require("should"));
8
+ const sinon_1 = require("sinon");
9
+ const moveStakeBuilder_1 = require("../../../src/lib/moveStakeBuilder");
10
+ const utils_1 = __importDefault(require("../../../src/lib/utils"));
11
+ const resources_1 = require("../../resources");
12
+ const base_1 = require("./base");
13
+ const resources_2 = require("../../../src/resources");
14
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
15
+ // Test helper class to access private methods for testing
16
+ class TestMoveStakeBuilder extends moveStakeBuilder_1.MoveStakeBuilder {
17
+ setMethodForTesting(method) {
18
+ this._method = method;
19
+ }
20
+ }
21
+ describe('Tao Move Stake Builder', function () {
22
+ const referenceBlock = '0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d';
23
+ let builder;
24
+ const sender = resources_1.accounts.account1;
25
+ beforeEach(function () {
26
+ const config = (0, base_1.buildTestConfig)();
27
+ const material = utils_1.default.getMaterial(config.network.type);
28
+ builder = new moveStakeBuilder_1.MoveStakeBuilder(config).material(material);
29
+ });
30
+ describe('setter validation', function () {
31
+ it('should validate amount', function () {
32
+ assert_1.default.throws(() => builder.amount('-1'), (e) => e.message === 'Amount must be greater than zero');
33
+ assert_1.default.throws(() => builder.amount('0'), (e) => e.message === 'Amount must be greater than zero');
34
+ should_1.default.doesNotThrow(() => builder.amount('1000'));
35
+ should_1.default.doesNotThrow(() => builder.amount('1'));
36
+ });
37
+ it('should validate addresses', function () {
38
+ const spyValidateAddress = (0, sinon_1.spy)(builder, 'validateAddress');
39
+ assert_1.default.throws(() => builder.originHotkey({ address: 'abc' }), (e) => e.message === `The address 'abc' is not a well-formed dot address`);
40
+ assert_1.default.throws(() => builder.destinationHotkey({ address: 'abc' }), (e) => e.message === `The address 'abc' is not a well-formed dot address`);
41
+ should_1.default.doesNotThrow(() => builder.originHotkey({ address: '5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT' }));
42
+ should_1.default.doesNotThrow(() => builder.destinationHotkey({ address: '5Ffp1wJCPu4hzVDTo7XaMLqZSvSadyUQmxWPDw74CBjECSoq' }));
43
+ sinon_1.assert.callCount(spyValidateAddress, 4);
44
+ });
45
+ });
46
+ describe('build move stake transaction', function () {
47
+ it('should build a move stake transaction', async function () {
48
+ builder
49
+ .amount('9007199254740995')
50
+ .originHotkey({ address: '5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT' })
51
+ .destinationHotkey({ address: '5Ffp1wJCPu4hzVDTo7XaMLqZSvSadyUQmxWPDw74CBjECSoq' })
52
+ .originNetuid('1')
53
+ .destinationNetuid('1')
54
+ .sender({ address: sender.address })
55
+ .validity({ firstValid: 3933, maxDuration: 64 })
56
+ .referenceBlock(referenceBlock)
57
+ .sequenceId({ name: 'Nonce', keyword: 'nonce', value: 200 })
58
+ .fee({ amount: 0, type: 'tip' });
59
+ const tx = await builder.build();
60
+ const txJson = tx.toJson();
61
+ txJson.should.have.properties([
62
+ 'id',
63
+ 'sender',
64
+ 'referenceBlock',
65
+ 'blockNumber',
66
+ 'genesisHash',
67
+ 'nonce',
68
+ 'specVersion',
69
+ 'transactionVersion',
70
+ 'eraPeriod',
71
+ 'chainName',
72
+ 'tip',
73
+ 'originHotkey',
74
+ 'destinationHotkey',
75
+ 'originNetuid',
76
+ 'destinationNetuid',
77
+ 'alphaAmount',
78
+ ]);
79
+ txJson.sender.should.equal('5EGoFA95omzemRssELLDjVenNZ68aXyUeqtKQScXSEBvVJkr');
80
+ txJson.originHotkey.should.equal('5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT');
81
+ txJson.destinationHotkey.should.equal('5Ffp1wJCPu4hzVDTo7XaMLqZSvSadyUQmxWPDw74CBjECSoq');
82
+ txJson.originNetuid.should.equal('1');
83
+ txJson.destinationNetuid.should.equal('1');
84
+ txJson.alphaAmount.should.equal('9007199254740995');
85
+ txJson.blockNumber.should.equal(3933);
86
+ txJson.nonce.should.equal(200);
87
+ txJson.tip.should.equal(0);
88
+ // Verify transaction explanation
89
+ const explanation = tx.explainTransaction();
90
+ explanation.should.have.properties(['outputAmount', 'changeAmount', 'fee']);
91
+ });
92
+ it('should validate required fields', function () {
93
+ assert_1.default.throws(() => builder.validateTransaction({}), (e) => e.message.includes('Transaction validation failed'));
94
+ });
95
+ it('should set and get origin netuid', function () {
96
+ builder.originNetuid('5');
97
+ // We can't directly access private fields, but we can verify through building
98
+ should_1.default.doesNotThrow(() => builder.originNetuid('5'));
99
+ });
100
+ it('should set and get destination netuid', function () {
101
+ builder.destinationNetuid('10');
102
+ // We can't directly access private fields, but we can verify through building
103
+ should_1.default.doesNotThrow(() => builder.destinationNetuid('10'));
104
+ });
105
+ it('should build transaction with different netuids', async function () {
106
+ builder
107
+ .amount('1000000000000')
108
+ .originHotkey({ address: '5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT' })
109
+ .destinationHotkey({ address: '5Ffp1wJCPu4hzVDTo7XaMLqZSvSadyUQmxWPDw74CBjECSoq' })
110
+ .originNetuid('1')
111
+ .destinationNetuid('2')
112
+ .sender({ address: sender.address })
113
+ .validity({ firstValid: 3933, maxDuration: 64 })
114
+ .referenceBlock(referenceBlock)
115
+ .sequenceId({ name: 'Nonce', keyword: 'nonce', value: 200 })
116
+ .fee({ amount: 0, type: 'tip' });
117
+ const tx = await builder.build();
118
+ const txJson = tx.toJson();
119
+ txJson.originNetuid.should.equal('1');
120
+ txJson.destinationNetuid.should.equal('2');
121
+ txJson.alphaAmount.should.equal('1000000000000');
122
+ });
123
+ });
124
+ describe('validation', function () {
125
+ it('should validate move stake transaction schema', function () {
126
+ should_1.default.doesNotThrow(() => {
127
+ builder
128
+ .amount('1000000000000')
129
+ .originHotkey({ address: '5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT' })
130
+ .destinationHotkey({ address: '5Ffp1wJCPu4hzVDTo7XaMLqZSvSadyUQmxWPDw74CBjECSoq' })
131
+ .originNetuid('1')
132
+ .destinationNetuid('1');
133
+ });
134
+ });
135
+ it('should throw error for invalid amount', function () {
136
+ assert_1.default.throws(() => builder.amount('-100'), (e) => e.message.includes('Amount must be greater than zero'));
137
+ });
138
+ it('should throw error for zero amount', function () {
139
+ assert_1.default.throws(() => builder.amount('0'), (e) => e.message === 'Amount must be greater than zero');
140
+ });
141
+ it('should validate netuid range for origin netuid', function () {
142
+ // Valid netuids
143
+ should_1.default.doesNotThrow(() => builder.originNetuid('0'));
144
+ should_1.default.doesNotThrow(() => builder.originNetuid('64'));
145
+ should_1.default.doesNotThrow(() => builder.originNetuid('128'));
146
+ // Invalid netuids
147
+ assert_1.default.throws(() => builder.originNetuid('-1'), (e) => e.message.includes('Invalid netuid: -1. Must be a non-negative integer.'));
148
+ assert_1.default.throws(() => builder.originNetuid('129'), (e) => e.message.includes('Invalid netuid: 129. Netuid must be between 0 and 128.'));
149
+ assert_1.default.throws(() => builder.originNetuid('abc'), (e) => e.message.includes('Invalid netuid: abc. Must be a non-negative integer.'));
150
+ });
151
+ it('should validate netuid range for destination netuid', function () {
152
+ // Valid netuids
153
+ should_1.default.doesNotThrow(() => builder.destinationNetuid('0'));
154
+ should_1.default.doesNotThrow(() => builder.destinationNetuid('64'));
155
+ should_1.default.doesNotThrow(() => builder.destinationNetuid('128'));
156
+ // Invalid netuids
157
+ assert_1.default.throws(() => builder.destinationNetuid('-1'), (e) => e.message.includes('Invalid netuid: -1. Must be a non-negative integer.'));
158
+ assert_1.default.throws(() => builder.destinationNetuid('129'), (e) => e.message.includes('Invalid netuid: 129. Netuid must be between 0 and 128.'));
159
+ assert_1.default.throws(() => builder.destinationNetuid('invalid'), (e) => e.message.includes('Invalid netuid: invalid. Must be a non-negative integer.'));
160
+ });
161
+ });
162
+ describe('TSS signature integration', function () {
163
+ it('should build a signed move stake transaction with TSS signature', async function () {
164
+ builder
165
+ .amount('9007199254740995')
166
+ .originHotkey({ address: '5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT' })
167
+ .destinationHotkey({ address: '5Ffp1wJCPu4hzVDTo7XaMLqZSvSadyUQmxWPDw74CBjECSoq' })
168
+ .originNetuid('1')
169
+ .destinationNetuid('1')
170
+ .sender({ address: sender.address })
171
+ .validity({ firstValid: 3933, maxDuration: 64 })
172
+ .referenceBlock(referenceBlock)
173
+ .sequenceId({ name: 'Nonce', keyword: 'nonce', value: 200 })
174
+ .fee({ amount: 0, type: 'tip' })
175
+ .addSignature({ pub: sender.publicKey }, Buffer.from(resources_1.mockTssSignature, 'hex'));
176
+ const tx = await builder.build();
177
+ const txJson = tx.toJson();
178
+ txJson.alphaAmount.should.equal('9007199254740995');
179
+ txJson.originHotkey.should.equal('5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT');
180
+ txJson.destinationHotkey.should.equal('5Ffp1wJCPu4hzVDTo7XaMLqZSvSadyUQmxWPDw74CBjECSoq');
181
+ txJson.originNetuid.should.equal('1');
182
+ txJson.destinationNetuid.should.equal('1');
183
+ txJson.sender.should.equal(sender.address);
184
+ txJson.blockNumber.should.equal(3933);
185
+ txJson.referenceBlock.should.equal(referenceBlock);
186
+ txJson.genesisHash.should.equal(resources_1.genesisHash);
187
+ txJson.specVersion.should.equal(Number(resources_2.testnetMaterial.specVersion));
188
+ txJson.nonce.should.equal(200);
189
+ txJson.tip.should.equal(0);
190
+ txJson.transactionVersion.should.equal(Number(resources_2.testnetMaterial.txVersion));
191
+ txJson.chainName.toLowerCase().should.equal(resources_1.chainName);
192
+ txJson.eraPeriod.should.equal(64);
193
+ });
194
+ it('should build an unsigned move stake transaction', async function () {
195
+ builder
196
+ .amount('50000000')
197
+ .originHotkey({ address: '5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT' })
198
+ .destinationHotkey({ address: '5Ffp1wJCPu4hzVDTo7XaMLqZSvSadyUQmxWPDw74CBjECSoq' })
199
+ .originNetuid('1')
200
+ .destinationNetuid('2')
201
+ .sender({ address: sender.address })
202
+ .validity({ firstValid: 3933, maxDuration: 64 })
203
+ .referenceBlock(referenceBlock)
204
+ .sequenceId({ name: 'Nonce', keyword: 'nonce', value: 200 })
205
+ .fee({ amount: 0, type: 'tip' });
206
+ const tx = await builder.build();
207
+ const txJson = tx.toJson();
208
+ txJson.alphaAmount.should.equal('50000000');
209
+ txJson.originHotkey.should.equal('5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT');
210
+ txJson.destinationHotkey.should.equal('5Ffp1wJCPu4hzVDTo7XaMLqZSvSadyUQmxWPDw74CBjECSoq');
211
+ txJson.originNetuid.should.equal('1');
212
+ txJson.destinationNetuid.should.equal('2');
213
+ txJson.sender.should.equal(sender.address);
214
+ txJson.blockNumber.should.equal(3933);
215
+ txJson.referenceBlock.should.equal(referenceBlock);
216
+ txJson.genesisHash.should.equal(resources_1.genesisHash);
217
+ txJson.specVersion.should.equal(Number(resources_2.testnetMaterial.specVersion));
218
+ txJson.nonce.should.equal(200);
219
+ txJson.tip.should.equal(0);
220
+ txJson.transactionVersion.should.equal(Number(resources_2.testnetMaterial.txVersion));
221
+ txJson.chainName.toLowerCase().should.equal(resources_1.chainName);
222
+ txJson.eraPeriod.should.equal(64);
223
+ });
224
+ });
225
+ describe('comprehensive error handling', function () {
226
+ it('should throw error for missing origin hotkey', function () {
227
+ builder
228
+ .amount('1000000000000')
229
+ .destinationHotkey({ address: '5Ffp1wJCPu4hzVDTo7XaMLqZSvSadyUQmxWPDw74CBjECSoq' })
230
+ .originNetuid('1')
231
+ .destinationNetuid('1');
232
+ assert_1.default.throws(() => builder.validateTransaction({}), (e) => e.message.includes('Transaction validation failed'));
233
+ });
234
+ it('should throw error for missing destination hotkey', function () {
235
+ builder
236
+ .amount('1000000000000')
237
+ .originHotkey({ address: '5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT' })
238
+ .originNetuid('1')
239
+ .destinationNetuid('1');
240
+ assert_1.default.throws(() => builder.validateTransaction({}), (e) => e.message.includes('Transaction validation failed'));
241
+ });
242
+ it('should throw error for missing origin netuid', function () {
243
+ builder
244
+ .amount('1000000000000')
245
+ .originHotkey({ address: '5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT' })
246
+ .destinationHotkey({ address: '5Ffp1wJCPu4hzVDTo7XaMLqZSvSadyUQmxWPDw74CBjECSoq' })
247
+ .destinationNetuid('1');
248
+ assert_1.default.throws(() => builder.validateTransaction({}), (e) => e.message.includes('Transaction validation failed'));
249
+ });
250
+ it('should throw error for missing destination netuid', function () {
251
+ builder
252
+ .amount('1000000000000')
253
+ .originHotkey({ address: '5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT' })
254
+ .destinationHotkey({ address: '5Ffp1wJCPu4hzVDTo7XaMLqZSvSadyUQmxWPDw74CBjECSoq' })
255
+ .originNetuid('1');
256
+ assert_1.default.throws(() => builder.validateTransaction({}), (e) => e.message.includes('Transaction validation failed'));
257
+ });
258
+ it('should throw error for missing amount', function () {
259
+ builder
260
+ .originHotkey({ address: '5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT' })
261
+ .destinationHotkey({ address: '5Ffp1wJCPu4hzVDTo7XaMLqZSvSadyUQmxWPDw74CBjECSoq' })
262
+ .originNetuid('1')
263
+ .destinationNetuid('1');
264
+ assert_1.default.throws(() => builder.validateTransaction({}), (e) => e.message.includes('Transaction validation failed'));
265
+ });
266
+ it('should throw error for invalid transaction type in fromImplementation', function () {
267
+ const config = (0, base_1.buildTestConfig)();
268
+ const material = utils_1.default.getMaterial(config.network.type);
269
+ const mockBuilder = new TestMoveStakeBuilder(config).material(material);
270
+ mockBuilder.setMethodForTesting({
271
+ name: 'transferKeepAlive',
272
+ args: { dest: { id: 'test' }, value: '1000' },
273
+ pallet: 'balances',
274
+ });
275
+ assert_1.default.throws(() => {
276
+ // Call the validation logic directly
277
+ if (mockBuilder['_method']?.name !== 'moveStake') {
278
+ throw new sdk_core_1.InvalidTransactionError(`Invalid Transaction Type: ${mockBuilder['_method']?.name}. Expected moveStake`);
279
+ }
280
+ }, (e) => e.message.includes('Invalid Transaction Type: transferKeepAlive. Expected moveStake'));
281
+ });
282
+ it('should handle malformed raw transaction', function () {
283
+ assert_1.default.throws(() => builder.from('invalid_hex_data'), (e) => e.message !== undefined);
284
+ });
285
+ });
286
+ describe('boundary value and edge case tests', function () {
287
+ it('should handle very large amounts', function () {
288
+ const largeAmount = '999999999999999999999999999999';
289
+ should_1.default.doesNotThrow(() => builder.amount(largeAmount));
290
+ });
291
+ it('should handle same origin and destination hotkeys', function () {
292
+ const sameAddress = '5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT';
293
+ should_1.default.doesNotThrow(() => {
294
+ builder.originHotkey({ address: sameAddress }).destinationHotkey({ address: sameAddress });
295
+ });
296
+ });
297
+ it('should handle same origin and destination netuids', function () {
298
+ should_1.default.doesNotThrow(() => {
299
+ builder.originNetuid('5').destinationNetuid('5');
300
+ });
301
+ });
302
+ it('should validate various address formats', function () {
303
+ const invalidAddresses = [
304
+ '',
305
+ '123',
306
+ 'invalid_address_format',
307
+ '5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT_invalid',
308
+ ];
309
+ invalidAddresses.forEach((address) => {
310
+ assert_1.default.throws(() => builder.originHotkey({ address }), (e) => e.message.includes('is not a well-formed dot address'));
311
+ assert_1.default.throws(() => builder.destinationHotkey({ address }), (e) => e.message.includes('is not a well-formed dot address'));
312
+ });
313
+ });
314
+ it('should handle boundary netuid values', function () {
315
+ should_1.default.doesNotThrow(() => builder.originNetuid('0'));
316
+ should_1.default.doesNotThrow(() => builder.originNetuid('128'));
317
+ should_1.default.doesNotThrow(() => builder.destinationNetuid('0'));
318
+ should_1.default.doesNotThrow(() => builder.destinationNetuid('128'));
319
+ assert_1.default.throws(() => builder.originNetuid('-1'), (e) => e.message.includes('Invalid netuid: -1. Must be a non-negative integer.'));
320
+ assert_1.default.throws(() => builder.destinationNetuid('129'), (e) => e.message.includes('Invalid netuid: 129. Netuid must be between 0 and 128.'));
321
+ });
322
+ });
323
+ describe('transaction explanation validation', function () {
324
+ it('should provide correct explanation with different subnet tokens', async function () {
325
+ builder
326
+ .amount('1000000000000')
327
+ .originHotkey({ address: '5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT' })
328
+ .destinationHotkey({ address: '5Ffp1wJCPu4hzVDTo7XaMLqZSvSadyUQmxWPDw74CBjECSoq' })
329
+ .originNetuid('1')
330
+ .destinationNetuid('2')
331
+ .sender({ address: sender.address })
332
+ .validity({ firstValid: 3933, maxDuration: 64 })
333
+ .referenceBlock(referenceBlock)
334
+ .sequenceId({ name: 'Nonce', keyword: 'nonce', value: 200 })
335
+ .fee({ amount: 0, type: 'tip' });
336
+ const tx = await builder.build();
337
+ const explanation = tx.explainTransaction();
338
+ explanation.should.have.properties(['outputAmount', 'changeAmount', 'fee', 'type']);
339
+ explanation.outputAmount.should.equal('1000000000000');
340
+ explanation.changeAmount.should.equal('0');
341
+ explanation.fee.should.have.properties(['fee', 'type']);
342
+ explanation.fee.type.should.equal('tip');
343
+ });
344
+ it('should handle explanation with zero tip', async function () {
345
+ builder
346
+ .amount('500000000')
347
+ .originHotkey({ address: '5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT' })
348
+ .destinationHotkey({ address: '5Ffp1wJCPu4hzVDTo7XaMLqZSvSadyUQmxWPDw74CBjECSoq' })
349
+ .originNetuid('1')
350
+ .destinationNetuid('1')
351
+ .sender({ address: sender.address })
352
+ .validity({ firstValid: 3933, maxDuration: 64 })
353
+ .referenceBlock(referenceBlock)
354
+ .sequenceId({ name: 'Nonce', keyword: 'nonce', value: 200 })
355
+ .fee({ amount: 0, type: 'tip' });
356
+ const tx = await builder.build();
357
+ const explanation = tx.explainTransaction();
358
+ explanation.fee.fee.should.equal('0');
359
+ explanation.outputAmount.should.equal('500000000');
360
+ });
361
+ });
362
+ describe('fromImplementation stages validation', function () {
363
+ it('should call super.fromImplementation before validation to populate _method', async function () {
364
+ const config = (0, base_1.buildTestConfig)();
365
+ const material = utils_1.default.getMaterial(config.network.type);
366
+ const validBuilder = new moveStakeBuilder_1.MoveStakeBuilder(config).material(material);
367
+ validBuilder
368
+ .amount('1000000000000')
369
+ .originHotkey({ address: '5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT' })
370
+ .destinationHotkey({ address: '5Ffp1wJCPu4hzVDTo7XaMLqZSvSadyUQmxWPDw74CBjECSoq' })
371
+ .originNetuid('1')
372
+ .destinationNetuid('2')
373
+ .sender({ address: sender.address })
374
+ .validity({ firstValid: 3933, maxDuration: 64 })
375
+ .referenceBlock(referenceBlock)
376
+ .sequenceId({ name: 'Nonce', keyword: 'nonce', value: 200 })
377
+ .fee({ amount: 0, type: 'tip' });
378
+ const validTx = await validBuilder.build();
379
+ const rawTxHex = validTx.toBroadcastFormat();
380
+ const newBuilder = new moveStakeBuilder_1.MoveStakeBuilder(config).material(material);
381
+ should_1.default.doesNotThrow(() => {
382
+ newBuilder.from(rawTxHex);
383
+ });
384
+ const builderMethod = newBuilder._method;
385
+ builderMethod.should.not.be.undefined();
386
+ builderMethod.name.should.equal('moveStake');
387
+ builderMethod.args.should.have.properties([
388
+ 'originHotkey',
389
+ 'destinationHotkey',
390
+ 'originNetuid',
391
+ 'destinationNetuid',
392
+ 'alphaAmount',
393
+ ]);
394
+ builderMethod.args.alphaAmount.should.equal('1000000000000');
395
+ builderMethod.args.originHotkey.should.equal('5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT');
396
+ builderMethod.args.destinationHotkey.should.equal('5Ffp1wJCPu4hzVDTo7XaMLqZSvSadyUQmxWPDw74CBjECSoq');
397
+ builderMethod.args.originNetuid.should.equal('1');
398
+ builderMethod.args.destinationNetuid.should.equal('2');
399
+ });
400
+ it('should throw error if _method is not populated before validation', function () {
401
+ const config = (0, base_1.buildTestConfig)();
402
+ const material = utils_1.default.getMaterial(config.network.type);
403
+ const mockBuilder = new TestMoveStakeBuilder(config).material(material);
404
+ assert_1.default.throws(() => {
405
+ if (mockBuilder['_method']?.name !== 'moveStake') {
406
+ throw new sdk_core_1.InvalidTransactionError(`Invalid Transaction Type: ${mockBuilder['_method']?.name}. Expected moveStake`);
407
+ }
408
+ }, (e) => e.message.includes('Invalid Transaction Type: undefined. Expected moveStake'));
409
+ });
410
+ it('should properly validate transaction type after super.fromImplementation', function () {
411
+ const config = (0, base_1.buildTestConfig)();
412
+ const material = utils_1.default.getMaterial(config.network.type);
413
+ const mockBuilder = new TestMoveStakeBuilder(config).material(material);
414
+ mockBuilder.setMethodForTesting({
415
+ name: 'transferKeepAlive',
416
+ args: { dest: { id: 'test' }, value: '1000' },
417
+ pallet: 'balances',
418
+ });
419
+ assert_1.default.throws(() => {
420
+ if (mockBuilder['_method']?.name !== 'moveStake') {
421
+ throw new sdk_core_1.InvalidTransactionError(`Invalid Transaction Type: ${mockBuilder['_method']?.name}. Expected moveStake`);
422
+ }
423
+ }, (e) => e.message.includes('Invalid Transaction Type: transferKeepAlive. Expected moveStake'));
424
+ });
425
+ it('should successfully parse and validate correct moveStake transaction', function () {
426
+ const config = (0, base_1.buildTestConfig)();
427
+ const material = utils_1.default.getMaterial(config.network.type);
428
+ const mockBuilder = new TestMoveStakeBuilder(config).material(material);
429
+ mockBuilder.setMethodForTesting({
430
+ name: 'moveStake',
431
+ args: {
432
+ originHotkey: '5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT',
433
+ destinationHotkey: '5Ffp1wJCPu4hzVDTo7XaMLqZSvSadyUQmxWPDw74CBjECSoq',
434
+ originNetuid: '1',
435
+ destinationNetuid: '2',
436
+ alphaAmount: '1000000000000',
437
+ },
438
+ pallet: 'subtensorModule',
439
+ });
440
+ should_1.default.doesNotThrow(() => {
441
+ if (mockBuilder['_method']?.name !== 'moveStake') {
442
+ throw new sdk_core_1.InvalidTransactionError(`Invalid Transaction Type: ${mockBuilder['_method']?.name}. Expected moveStake`);
443
+ }
444
+ });
445
+ });
446
+ it('should fail validation when parsing wrong transaction type (transferStake instead of moveStake)', function () {
447
+ const config = (0, base_1.buildTestConfig)();
448
+ const material = utils_1.default.getMaterial(config.network.type);
449
+ const moveStakeBuilder = new moveStakeBuilder_1.MoveStakeBuilder(config).material(material);
450
+ assert_1.default.throws(() => {
451
+ moveStakeBuilder.from(resources_1.rawTx.transferStake.signed);
452
+ }, (e) => e.message.includes('Invalid Transaction Type: transferStake. Expected moveStake'));
453
+ });
454
+ it('should verify _method is properly populated after super.fromImplementation with wrong transaction type', function () {
455
+ const config = (0, base_1.buildTestConfig)();
456
+ const material = utils_1.default.getMaterial(config.network.type);
457
+ const testBuilder = new TestMoveStakeBuilder(config).material(material);
458
+ try {
459
+ testBuilder.from(resources_1.rawTx.transferStake.signed);
460
+ }
461
+ catch (error) {
462
+ const method = testBuilder._method;
463
+ method.should.not.be.undefined();
464
+ method.name.should.equal('transferStake'); // This proves super.fromImplementation was called
465
+ method.should.have.property('args');
466
+ method.should.have.property('pallet');
467
+ error.message.should.containEql('Invalid Transaction Type: transferStake. Expected moveStake');
468
+ }
469
+ });
470
+ });
471
+ });
472
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW92ZVN0YWtlQnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvdW5pdC90cmFuc2FjdGlvbkJ1aWxkZXIvbW92ZVN0YWtlQnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG9EQUE0QjtBQUM1QixvREFBNEI7QUFDNUIsaUNBQW1EO0FBQ25ELHdFQUFxRTtBQUNyRSxtRUFBMkM7QUFDM0MsK0NBQTRGO0FBQzVGLGlDQUF5QztBQUN6QyxzREFBeUQ7QUFDekQsbURBQStEO0FBRS9ELDBEQUEwRDtBQUMxRCxNQUFNLG9CQUFxQixTQUFRLG1DQUFnQjtJQUNqRCxtQkFBbUIsQ0FBQyxNQUFXO1FBQzdCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO0lBQ3hCLENBQUM7Q0FDRjtBQUVELFFBQVEsQ0FBQyx3QkFBd0IsRUFBRTtJQUNqQyxNQUFNLGNBQWMsR0FBRyxvRUFBb0UsQ0FBQztJQUM1RixJQUFJLE9BQXlCLENBQUM7SUFDOUIsTUFBTSxNQUFNLEdBQUcsb0JBQVEsQ0FBQyxRQUFRLENBQUM7SUFFakMsVUFBVSxDQUFDO1FBQ1QsTUFBTSxNQUFNLEdBQUcsSUFBQSxzQkFBZSxHQUFFLENBQUM7UUFDakMsTUFBTSxRQUFRLEdBQUcsZUFBSyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hELE9BQU8sR0FBRyxJQUFJLG1DQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM1RCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxtQkFBbUIsRUFBRTtRQUM1QixFQUFFLENBQUMsd0JBQXdCLEVBQUU7WUFDM0IsZ0JBQU0sQ0FBQyxNQUFNLENBQ1gsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFDMUIsQ0FBQyxDQUFRLEVBQUUsRUFBRSxD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TSxXQUFXLEdBQUcsSUFBSSxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFeEUsSUFBSSxDQUFDO2dCQUNILFdBQVcsQ0FBQyxJQUFJLENBQUMsaUJBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDL0MsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsTUFBTSxNQUFNLEdBQUksV0FBbUIsQ0FBQyxPQUFPLENBQUM7Z0JBQzVDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDakMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsa0RBQWtEO2dCQUM3RixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3BDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFFckMsS0FBZSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLDZEQUE2RCxDQUFDLENBQUM7WUFDNUcsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IGFzc2VydCBhcyBTaW5vbkFzc2VydCwgc3B5IH0gZnJvbSAnc2lub24nO1xuaW1wb3J0IHsgTW92ZVN0YWtlQnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL3NyYy9saWIvbW92ZVN0YWtlQnVpbGRlcic7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi91dGlscyc7XG5pbXBvcnQgeyBhY2NvdW50cywgbW9ja1Rzc1NpZ25hdHVyZSwgZ2VuZXNpc0hhc2gsIGNoYWluTmFtZSwgcmF3VHggfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMnO1xuaW1wb3J0IHsgYnVpbGRUZXN0Q29uZmlnIH0gZnJvbSAnLi9iYXNlJztcbmltcG9ydCB7IHRlc3RuZXRNYXRlcmlhbCB9IGZyb20gJy4uLy4uLy4uL3NyYy9yZXNvdXJjZXMnO1xuaW1wb3J0IHsgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5cbi8vIFRlc3QgaGVscGVyIGNsYXNzIHRvIGFjY2VzcyBwcml2YXRlIG1ldGhvZHMgZm9yIHRlc3RpbmdcbmNsYXNzIFRlc3RNb3ZlU3Rha2VCdWlsZGVyIGV4dGVuZHMgTW92ZVN0YWtlQnVpbGRlciB7XG4gIHNldE1ldGhvZEZvclRlc3RpbmcobWV0aG9kOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl9tZXRob2QgPSBtZXRob2Q7XG4gIH1cbn1cblxuZGVzY3JpYmUoJ1RhbyBNb3ZlIFN0YWtlIEJ1aWxkZXInLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHJlZmVyZW5jZUJsb2NrID0gJzB4MTQ5Nzk5YmM5NjAyY2I1Y2YyMDFmMzQyNWZiOGQyNTNiMmQ0ZTYxZmMxMTlkY2FiMzI0OWYzMDdmNTk0NzU0ZCc7XG4gIGxldCBidWlsZGVyOiBNb3ZlU3Rha2VCdWlsZGVyO1xuICBjb25zdCBzZW5kZXIgPSBhY2NvdW50cy5hY2NvdW50MTtcblxuICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBjb25maWcgPSBidWlsZFRlc3RDb25maWcoKTtcbiAgICBjb25zdCBtYXRlcmlhbCA9IHV0aWxzLmdldE1hdGVyaWFsKGNvbmZpZy5uZXR3b3JrLnR5cGUpO1xuICAgIGJ1aWxkZXIgPSBuZXcgTW92ZVN0YWtlQnVpbGRlcihjb25maWcpLm1hdGVyaWFsKG1hdGVyaWFsKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3NldHRlciB2YWxpZGF0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgYW1vdW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gYnVpbGRlci5hbW91bnQoJy0xJyksXG4gICAgICAgIChlOiBFcnJvcikgPT4gZS5tZXNzYWdlID09PSAnQW1vdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8nXG4gICAgICApO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gYnVpbGRlci5hbW91bnQoJzAnKSxcbiAgICAgICAgKGU6IEVycm9yKSA9PiBlLm1lc3NhZ2UgPT09ICdBbW91bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybydcbiAgICAgICk7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IGJ1aWxkZXIuYW1vdW50KCcxMDAwJykpO1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiBidWlsZGVyLmFtb3VudCgnMScpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgYWRkcmVzc2VzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc3B5VmFsaWRhdGVBZGRyZXNzID0gc3B5KGJ1aWxkZXIsICd2YWxpZGF0ZUFkZHJlc3MnKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IGJ1aWxkZXIub3JpZ2luSG90a2V5KHsgYWRkcmVzczogJ2FiYycgfSksXG4gICAgICAgIChlOiBFcnJvcikgPT4gZS5tZXNzYWdlID09PSBgVGhlIGFkZHJlc3MgJ2FiYycgaXMgbm90IGEgd2VsbC1mb3JtZWQgZG90IGFkZHJlc3NgXG4gICAgICApO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gYnVpbGRlci5kZXN0aW5hdGlvbkhvdGtleSh7IGFkZHJlc3M6ICdhYmMnIH0pLFxuICAgICAgICAoZTogRXJyb3IpID0+IGUubWVzc2FnZSA9PT0gYFRoZSBhZGRyZXNzICdhYmMnIGlzIG5vdCBhIHdlbGwtZm9ybWVkIGRvdCBhZGRyZXNzYFxuICAgICAgKTtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gYnVpbGRlci5vcmlnaW5Ib3RrZXkoeyBhZGRyZXNzOiAnNUZDUFRuamV2R3FBdVR0dGV0Qnk0YTI0RWozcEg5ZmlROGZtdlAxWmtyVnNMVW9UJyB9KSk7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+XG4gICAgICAgIGJ1aWxkZXIuZGVzdGluYXRpb25Ib3RrZXkoeyBhZGRyZXNzOiAnNUZmcDF3SkNQdTRoelZEVG83WGFNTHFaU3ZTYWR5VVFteFdQRHc3NENCakVDU29xJyB9KVxuICAgICAgKTtcblxuICAgICAgU2lub25Bc3NlcnQuY2FsbENvdW50KHNweVZhbGlkYXRlQWRkcmVzcywgNCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdidWlsZCBtb3ZlIHN0YWtlIHRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgYnVpbGQgYSBtb3ZlIHN0YWtlIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYnVpbGRlclxuICAgICAgICAuYW1vdW50KCc5MDA3MTk5MjU0NzQwOTk1JylcbiAgICAgICAgLm9yaWdpbkhvdGtleSh7IGFkZHJlc3M6ICc1RkNQVG5qZXZHcUF1VHR0ZXRCeTRhMjRFajNwSDlmaVE4Zm12UDFaa3JWc0xVb1QnIH0pXG4gICAgICAgIC5kZXN0aW5hdGlvbkhvdGtleSh7IGFkZHJlc3M6ICc1RmZwMXdKQ1B1NGh6VkRUbzdYYU1McVpTdlNhZHlVUW14V1BEdzc0Q0JqRUNTb3EnIH0pXG4gICAgICAgIC5vcmlnaW5OZXR1aWQoJzEnKVxuICAgICAgICAuZGVzdGluYXRpb25OZXR1aWQoJzEnKVxuICAgICAgICAuc2VuZGVyKHsgYWRkcmVzczogc2VuZGVyLmFkZHJlc3MgfSlcbiAgICAgICAgLnZhbGlkaXR5KHsgZmlyc3RWYWxpZDogMzkzMywgbWF4RHVyYXRpb246IDY0IH0pXG4gICAgICAgIC5yZWZlcmVuY2VCbG9jayhyZWZlcmVuY2VCbG9jaylcbiAgICAgICAgLnNlcXVlbmNlSWQoeyBuYW1lOiAnTm9uY2UnLCBrZXl3b3JkOiAnbm9uY2UnLCB2YWx1ZTogMjAwIH0pXG4gICAgICAgIC5mZWUoeyBhbW91bnQ6IDAsIHR5cGU6ICd0aXAnIH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgICB0eEpzb24uc2hvdWxkLmhhdmUucHJvcGVydGllcyhbXG4gICAgICAgICdpZCcsXG4gICAgICAgICdzZW5kZXInLFxuICAgICAgICAncmVmZXJlbmNlQmxvY2snLFxuICAgICAgICAnYmxvY2tOdW1iZXInLFxuICAgICAgICAnZ2VuZXNpc0hhc2gnLFxuICAgICAgICAnbm9uY2UnLFxuICAgICAgICAnc3BlY1ZlcnNpb24nLFxuICAgICAgICAndHJhbnNhY3Rpb25WZXJzaW9uJyxcbiAgICAgICAgJ2VyYVBlcmlvZCcsXG4gICAgICAgICdjaGFpbk5hbWUnLFxuICAgICAgICAndGlwJyxcbiAgICAgICAgJ29yaWdpbkhvdGtleScsXG4gICAgICAgICdkZXN0aW5hdGlvbkhvdGtleScsXG4gICAgICAgICdvcmlnaW5OZXR1aWQnLFxuICAgICAgICAnZGVzdGluYXRpb25OZXR1aWQnLFxuICAgICAgICAnYWxwaGFBbW91bnQnLFxuICAgICAgXSk7XG5cbiAgICAgIHR4SnNvbi5zZW5kZXIuc2hvdWxkLmVxdWFsKCc1RUdvRkE5NW9temVtUnNzRUxMRGpWZW5OWjY4YVh5VWVxdEtRU2NYU0VCdlZKa3InKTtcbiAgICAgIHR4SnNvbi5vcmlnaW5Ib3RrZXkuc2hvdWxkLmVxdWFsKCc1RkNQVG5qZXZHcUF1VHR0ZXRCeTRhMjRFajNwSDlmaVE4Zm12UDFaa3JWc0xVb1QnKTtcbiAgICAgIHR4SnNvbi5kZXN0aW5hdGlvbkhvdGtleS5zaG91bGQuZXF1YWwoJzVGZnAxd0pDUHU0aHpWRFRvN1hhTUxxWlN2U2FkeVVRbXhXUER3NzRDQmpFQ1NvcScpO1xuICAgICAgdHhKc29uLm9yaWdpbk5ldHVpZC5zaG91bGQuZXF1YWwoJzEnKTtcbiAgICAgIHR4SnNvbi5kZXN0aW5hdGlvbk5ldHVpZC5zaG91bGQuZXF1YWwoJzEnKTtcbiAgICAgIHR4SnNvbi5hbHBoYUFtb3VudC5zaG91bGQuZXF1YWwoJzkwMDcxOTkyNTQ3NDA5OTUnKTtcbiAgICAgIHR4SnNvbi5ibG9ja051bWJlci5zaG91bGQuZXF1YWwoMzkzMyk7XG4gICAgICB0eEpzb24ubm9uY2Uuc2hvdWxkLmVxdWFsKDIwMCk7XG4gICAgICB0eEpzb24udGlwLnNob3VsZC5lcXVhbCgwKTtcblxuICAgICAgLy8gVmVyaWZ5IHRyYW5zYWN0aW9uIGV4cGxhbmF0aW9uXG4gICAgICBjb25zdCBleHBsYW5hdGlvbiA9IHR4LmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuICAgICAgZXhwbGFuYXRpb24uc2hvdWxkLmhhdmUucHJvcGVydGllcyhbJ291dHB1dEFtb3VudCcsICdjaGFuZ2VBbW91bnQnLCAnZmVlJ10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSByZXF1aXJlZCBmaWVsZHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiBidWlsZGVyLnZhbGlkYXRlVHJhbnNhY3Rpb24oe30gYXMgYW55KSxcbiAgICAgICAgKGU6IEVycm9yKSA9PiBlLm1lc3NhZ2UuaW5jbHVkZXMoJ1RyYW5zYWN0aW9uIHZhbGlkYXRpb24gZmFpbGVkJylcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNldCBhbmQgZ2V0IG9yaWdpbiBuZXR1aWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBidWlsZGVyLm9yaWdpbk5ldHVpZCgnNScpO1xuICAgICAgLy8gV2UgY2FuJ3QgZGlyZWN0bHkgYWNjZXNzIHByaXZhdGUgZmllbGRzLCBidXQgd2UgY2FuIHZlcmlmeSB0aHJvdWdoIGJ1aWxkaW5nXG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IGJ1aWxkZXIub3JpZ2luTmV0dWlkKCc1JykpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzZXQgYW5kIGdldCBkZXN0aW5hdGlvbiBuZXR1aWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBidWlsZGVyLmRlc3RpbmF0aW9uTmV0dWlkKCcxMCcpO1xuICAgICAgLy8gV2UgY2FuJ3QgZGlyZWN0bHkgYWNjZXNzIHByaXZhdGUgZmllbGRzLCBidXQgd2UgY2FuIHZlcmlmeSB0aHJvdWdoIGJ1aWxkaW5nXG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IGJ1aWxkZXIuZGVzdGluYXRpb25OZXR1aWQoJzEwJykpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCB0cmFuc2FjdGlvbiB3aXRoIGRpZmZlcmVudCBuZXR1aWRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYnVpbGRlclxuICAgICAgICAuYW1vdW50KCcxMDAwMDAwMDAwMDAwJylcbiAgICAgICAgLm9yaWdpbkhvdGtleSh7IGFkZHJlc3M6ICc1RkNQVG5qZXZHcUF1VHR0ZXRCeTRhMjRFajNwSDlmaVE4Zm12UDFaa3JWc0xVb1QnIH0pXG4gICAgICAgIC5kZXN0aW5hdGlvbkhvdGtleSh7IGFkZHJlc3M6ICc1RmZwMXdKQ1B1NGh6VkRUbzdYYU1McVpTdlNhZHlVUW14V1BEdzc0Q0JqRUNTb3EnIH0pXG4gICAgICAgIC5vcmlnaW5OZXR1aWQoJzEnKVxuICAgICAgICAuZGVzdGluYXRpb25OZXR1aWQoJzInKVxuICAgICAgICAuc2VuZGVyKHsgYWRkcmVzczogc2VuZGVyLmFkZHJlc3MgfSlcbiAgICAgICAgLnZhbGlkaXR5KHsgZmlyc3RWYWxpZDogMzkzMywgbWF4RHVyYXRpb246IDY0IH0pXG4gICAgICAgIC5yZWZlcmVuY2VCbG9jayhyZWZlcmVuY2VCbG9jaylcbiAgICAgICAgLnNlcXVlbmNlSWQoeyBuYW1lOiAnTm9uY2UnLCBrZXl3b3JkOiAnbm9uY2UnLCB2YWx1ZTogMjAwIH0pXG4gICAgICAgIC5mZWUoeyBhbW91bnQ6IDAsIHR5cGU6ICd0aXAnIH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgICB0eEpzb24ub3JpZ2luTmV0dWlkLnNob3VsZC5lcXVhbCgnMScpO1xuICAgICAgdHhKc29uLmRlc3RpbmF0aW9uTmV0dWlkLnNob3VsZC5lcXVhbCgnMicpO1xuICAgICAgdHhKc29uLmFscGhhQW1vdW50LnNob3VsZC5lcXVhbCgnMTAwMDAwMDAwMDAwMCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndmFsaWRhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIG1vdmUgc3Rha2UgdHJhbnNhY3Rpb24gc2NoZW1hJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXJcbiAgICAgICAgICAuYW1vdW50KCcxMDAwMDAwMDAwMDAwJylcbiAgICAgICAgICAub3JpZ2luSG90a2V5KHsgYWRkcmVzczogJzVGQ1BUbmpldkdxQXVUdHRldEJ5NGEyNEVqM3BIOWZpUThmbXZQMVprclZzTFVvVCcgfSlcbiAgICAgICAgICAuZGVzdGluYXRpb25Ib3RrZXkoeyBhZGRyZXNzOiAnNUZmcDF3SkNQdTRoelZEVG83WGFNTHFaU3ZTYWR5VVFteFdQRHc3NENCakVDU29xJyB9KVxuICAgICAgICAgIC5vcmlnaW5OZXR1aWQoJzEnKVxuICAgICAgICAgIC5kZXN0aW5hdGlvbk5ldHVpZCgnMScpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBpbnZhbGlkIGFtb3VudCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IGJ1aWxkZXIuYW1vdW50KCctMTAwJyksXG4gICAgICAgIChlOiBFcnJvcikgPT4gZS5tZXNzYWdlLmluY2x1ZGVzKCdBbW91bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybycpXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgemVybyBhbW91bnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiBidWlsZGVyLmFtb3VudCgnMCcpLFxuICAgICAgICAoZTogRXJyb3IpID0+IGUubWVzc2FnZSA9PT0gJ0Ftb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgbmV0dWlkIHJhbmdlIGZvciBvcmlnaW4gbmV0dWlkJywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gVmFsaWQgbmV0dWlkc1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiBidWlsZGVyLm9yaWdpbk5ldHVpZCgnMCcpKTtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gYnVpbGRlci5vcmlnaW5OZXR1aWQoJzY0JykpO1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiBidWlsZGVyLm9yaWdpbk5ldHVpZCgnMTI4JykpO1xuXG4gICAgICAvLyBJbnZhbGlkIG5ldHVpZHNcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IGJ1aWxkZXIub3JpZ2luTmV0dWlkKCctMScpLFxuICAgICAgICAoZTogRXJyb3IpID0+IGUubWVzc2FnZS5pbmNsdWRlcygnSW52YWxpZCBuZXR1aWQ6IC0xLiBNdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIuJylcbiAgICAgICk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiBidWlsZGVyLm9yaWdpbk5ldHVpZCgnMTI5JyksXG4gICAgICAgIChlOiBFcnJvcikgPT4gZS5tZXNzYWdlLmluY2x1ZGVzKCdJbnZhbGlkIG5ldHVpZDogMTI5LiBOZXR1aWQgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEyOC4nKVxuICAgICAgKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IGJ1aWxkZXIub3JpZ2luTmV0dWlkKCdhYmMnKSxcbiAgICAgICAgKGU6IEVycm9yKSA9PiBlLm1lc3NhZ2UuaW5jbHVkZXMoJ0ludmFsaWQgbmV0dWlkOiBhYmMuIE11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlci4nKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgbmV0dWlkIHJhbmdlIGZvciBkZXN0aW5hdGlvbiBuZXR1aWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBWYWxpZCBuZXR1aWRzXG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IGJ1aWxkZXIuZGVzdGluYXRpb25OZXR1aWQoJzAnKSk7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IGJ1aWxkZXIuZGVzdGluYXRpb25OZXR1aWQoJzY0JykpO1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiBidWlsZGVyLmRlc3RpbmF0aW9uTmV0dWlkKCcxMjgnKSk7XG5cbiAgICAgIC8vIEludmFsaWQgbmV0dWlkc1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gYnVpbGRlci5kZXN0aW5hdGlvbk5ldHVpZCgnLTEnKSxcbiAgICAgICAgKGU6IEVycm9yKSA9PiBlLm1lc3NhZ2UuaW5jbHVkZXMoJ0ludmFsaWQgbmV0dWlkOiAtMS4gTXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLicpXG4gICAgICApO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gYnVpbGRlci5kZXN0aW5hdGlvbk5ldHVpZCgnMTI5JyksXG4gICAgICAgIChlOiBFcnJvcikgPT4gZS5tZXNzYWdlLmluY2x1ZGVzKCdJbnZhbGlkIG5ldHVpZDogMTI5LiBOZXR1aWQgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEyOC4nKVxuICAgICAgKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IGJ1aWxkZXIuZGVzdGluYXRpb25OZXR1aWQoJ2ludmFsaWQnKSxcbiAgICAgICAgKGU6IEVycm9yKSA9PiBlLm1lc3NhZ2UuaW5jbHVkZXMoJ0ludmFsaWQgbmV0dWlkOiBpbnZhbGlkLiBNdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIuJylcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdUU1Mgc2lnbmF0dXJlIGludGVncmF0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgYnVpbGQgYSBzaWduZWQgbW92ZSBzdGFrZSB0cmFuc2FjdGlvbiB3aXRoIFRTUyBzaWduYXR1cmUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5hbW91bnQoJzkwMDcxOTkyNTQ3NDA5OTUnKVxuICAgICAgICAub3JpZ2luSG90a2V5KHsgYWRkcmVzczogJzVGQ1BUbmpldkdxQXVUdHRldEJ5NGEyNEVqM3BIOWZpUThmbXZQMVprclZzTFVvVCcgfSlcbiAgICAgICAgLmRlc3RpbmF0aW9uSG90a2V5KHsgYWRkcmVzczogJzVGZnAxd0pDUHU0aHpWRFRvN1hhTUxxWlN2U2FkeVVRbXhXUER3NzRDQmpFQ1NvcScgfSlcbiAgICAgICAgLm9yaWdpbk5ldHVpZCgnMScpXG4gICAgICAgIC5kZXN0aW5hdGlvbk5ldHVpZCgnMScpXG4gICAgICAgIC5zZW5kZXIoeyBhZGRyZXNzOiBzZW5kZXIuYWRkcmVzcyB9KVxuICAgICAgICAudmFsaWRpdHkoeyBmaXJzdFZhbGlkOiAzOTMzLCBtYXhEdXJhdGlvbjogNjQgfSlcbiAgICAgICAgLnJlZmVyZW5jZUJsb2NrKHJlZmVyZW5jZUJsb2NrKVxuICAgICAgICAuc2VxdWVuY2VJZCh7IG5hbWU6ICdOb25jZScsIGtleXdvcmQ6ICdub25jZScsIHZhbHVlOiAyMDAgfSlcbiAgICAgICAgLmZlZSh7IGFtb3VudDogMCwgdHlwZTogJ3RpcCcgfSlcbiAgICAgICAgLmFkZFNpZ25hdHVyZSh7IHB1Yjogc2VuZGVyLnB1YmxpY0tleSB9LCBCdWZmZXIuZnJvbShtb2NrVHNzU2lnbmF0dXJlLCAnaGV4JykpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgICB0eEpzb24uYWxwaGFBbW91bnQuc2hvdWxkLmVxdWFsKCc5MDA3MTk5MjU0NzQwOTk1Jyk7XG4gICAgICB0eEpzb24ub3JpZ2luSG90a2V5LnNob3VsZC5lcXVhbCgnNUZDUFRuamV2R3FBdVR0dGV0Qnk0YTI0RWozcEg5ZmlROGZtdlAxWmtyVnNMVW9UJyk7XG4gICAgICB0eEpzb24uZGVzdGluYXRpb25Ib3RrZXkuc2hvdWxkLmVxdWFsKCc1RmZwMXdKQ1B1NGh6VkRUbzdYYU1McVpTdlNhZHlVUW14V1BEdzc0Q0JqRUNTb3EnKTtcbiAgICAgIHR4SnNvbi5vcmlnaW5OZXR1aWQuc2hvdWxkLmVxdWFsKCcxJyk7XG4gICAgICB0eEpzb24uZGVzdGluYXRpb25OZXR1aWQuc2hvdWxkLmVxdWFsKCcxJyk7XG4gICAgICB0eEpzb24uc2VuZGVyLnNob3VsZC5lcXVhbChzZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEpzb24uYmxvY2tOdW1iZXIuc2hvdWxkLmVxdWFsKDM5MzMpO1xuICAgICAgdHhKc29uLnJlZmVyZW5jZUJsb2NrLnNob3VsZC5lcXVhbChyZWZlcmVuY2VCbG9jayk7XG4gICAgICB0eEpzb24uZ2VuZXNpc0hhc2guc2hvdWxkLmVxdWFsKGdlbmVzaXNIYXNoKTtcbiAgICAgIHR4SnNvbi5zcGVjVmVyc2lvbi5zaG91bGQuZXF1YWwoTnVtYmVyKHRlc3RuZXRNYXRlcmlhbC5zcGVjVmVyc2lvbikpO1xuICAgICAgdHhKc29uLm5vbmNlLnNob3VsZC5lcXVhbCgyMDApO1xuICAgICAgdHhKc29uLnRpcC5zaG91bGQuZXF1YWwoMCk7XG4gICAgICB0eEpzb24udHJhbnNhY3Rpb25WZXJzaW9uLnNob3VsZC5lcXVhbChOdW1iZXIodGVzdG5ldE1hdGVyaWFsLnR4VmVyc2lvbikpO1xuICAgICAgdHhKc29uLmNoYWluTmFtZS50b0xvd2VyQ2FzZSgpLnNob3VsZC5lcXVhbChjaGFpbk5hbWUpO1xuICAgICAgdHhKc29uLmVyYVBlcmlvZC5zaG91bGQuZXF1YWwoNjQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhbiB1bnNpZ25lZCBtb3ZlIHN0YWtlIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYnVpbGRlclxuICAgICAgICAuYW1vdW50KCc1MDAwMDAwMCcpXG4gICAgICAgIC5vcmlnaW5Ib3RrZXkoeyBhZGRyZXNzOiAnNUZDUFRuamV2R3FBdVR0dGV0Qnk0YTI0RWozcEg5ZmlROGZtdlAxWmtyVnNMVW9UJyB9KVxuICAgICAgICAuZGVzdGluYXRpb25Ib3RrZXkoeyBhZGRyZXNzOiAnNUZmcDF3SkNQdTRoelZEVG83WGFNTHFaU3ZTYWR5VVFteFdQRHc3NENCakVDU29xJyB9KVxuICAgICAgICAub3JpZ2luTmV0dWlkKCcxJylcbiAgICAgICAgLmRlc3RpbmF0aW9uTmV0dWlkKCcyJylcbiAgICAgICAgLnNlbmRlcih7IGFkZHJlc3M6IHNlbmRlci5hZGRyZXNzIH0pXG4gICAgICAgIC52YWxpZGl0eSh7IGZpcnN0VmFsaWQ6IDM5MzMsIG1heER1cmF0aW9uOiA2NCB9KVxuICAgICAgICAucmVmZXJlbmNlQmxvY2socmVmZXJlbmNlQmxvY2spXG4gICAgICAgIC5zZXF1ZW5jZUlkKHsgbmFtZTogJ05vbmNlJywga2V5d29yZDogJ25vbmNlJywgdmFsdWU6IDIwMCB9KVxuICAgICAgICAuZmVlKHsgYW1vdW50OiAwLCB0eXBlOiAndGlwJyB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgdHhKc29uLmFscGhhQW1vdW50LnNob3VsZC5lcXVhbCgnNTAwMDAwMDAnKTtcbiAgICAgIHR4SnNvbi5vcmlnaW5Ib3RrZXkuc2hvdWxkLmVxdWFsKCc1RkNQVG5qZXZHcUF1VHR0ZXRCeTRhMjRFajNwSDlmaVE4Zm12UDFaa3JWc0xVb1QnKTtcbiAgICAgIHR4SnNvbi5kZXN0aW5hdGlvbkhvdGtleS5zaG91bGQuZXF1YWwoJzVGZnAxd0pDUHU0aHpWRFRvN1hhTUxxWlN2U2FkeVVRbXhXUER3NzRDQmpFQ1NvcScpO1xuICAgICAgdHhKc29uLm9yaWdpbk5ldHVpZC5zaG91bGQuZXF1YWwoJzEnKTtcbiAgICAgIHR4SnNvbi5kZXN0aW5hdGlvbk5ldHVpZC5zaG91bGQuZXF1YWwoJzInKTtcbiAgICAgIHR4SnNvbi5zZW5kZXIuc2hvdWxkLmVxdWFsKHNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4SnNvbi5ibG9ja051bWJlci5zaG91bGQuZXF1YWwoMzkzMyk7XG4gICAgICB0eEpzb24ucmVmZXJlbmNlQmxvY2suc2hvdWxkLmVxdWFsKHJlZmVyZW5jZUJsb2NrKTtcbiAgICAgIHR4SnNvbi5nZW5lc2lzSGFzaC5zaG91bGQuZXF1YWwoZ2VuZXNpc0hhc2gpO1xuICAgICAgdHhKc29uLnNwZWNWZXJzaW9uLnNob3VsZC5lcXVhbChOdW1iZXIodGVzdG5ldE1hdGVyaWFsLnNwZWNWZXJzaW9uKSk7XG4gICAgICB0eEpzb24ubm9uY2Uuc2hvdWxkLmVxdWFsKDIwMCk7XG4gICAgICB0eEpzb24udGlwLnNob3VsZC5lcXVhbCgwKTtcbiAgICAgIHR4SnNvbi50cmFuc2FjdGlvblZlcnNpb24uc2hvdWxkLmVxdWFsKE51bWJlcih0ZXN0bmV0TWF0ZXJpYWwudHhWZXJzaW9uKSk7XG4gICAgICB0eEpzb24uY2hhaW5OYW1lLnRvTG93ZXJDYXNlKCkuc2hvdWxkLmVxdWFsKGNoYWluTmFtZSk7XG4gICAgICB0eEpzb24uZXJhUGVyaW9kLnNob3VsZC5lcXVhbCg2NCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjb21wcmVoZW5zaXZlIGVycm9yIGhhbmRsaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIG1pc3Npbmcgb3JpZ2luIGhvdGtleScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLmFtb3VudCgnMTAwMDAwMDAwMDAwMCcpXG4gICAgICAgIC5kZXN0aW5hdGlvbkhvdGtleSh7IGFkZHJlc3M6ICc1RmZwMXdKQ1B1NGh6VkRUbzdYYU1McVpTdlNhZHlVUW14V1BEdzc0Q0JqRUNTb3EnIH0pXG4gICAgICAgIC5vcmlnaW5OZXR1aWQoJzEnKVxuICAgICAgICAuZGVzdGluYXRpb25OZXR1aWQoJzEnKTtcblxuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gYnVpbGRlci52YWxpZGF0ZVRyYW5zYWN0aW9uKHt9IGFzIGFueSksXG4gICAgICAgIChlOiBFcnJvcikgPT4gZS5tZXNzYWdlLmluY2x1ZGVzKCdUcmFuc2FjdGlvbiB2YWxpZGF0aW9uIGZhaWxlZCcpXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgbWlzc2luZyBkZXN0aW5hdGlvbiBob3RrZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5hbW91bnQoJzEwMDAwMDAwMDAwMDAnKVxuICAgICAgICAub3JpZ2luSG90a2V5KHsgYWRkcmVzczogJzVGQ1BUbmpldkdxQXVUdHRldEJ5NGEyNEVqM3BIOWZpUThmbXZQMVprclZzTFVvVCcgfSlcbiAgICAgICAgLm9yaWdpbk5ldHVpZCgnMScpXG4gICAgICAgIC5kZXN0aW5hdGlvbk5ldHVpZCgnMScpO1xuXG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiBidWlsZGVyLnZhbGlkYXRlVHJhbnNhY3Rpb24oe30gYXMgYW55KSxcbiAgICAgICAgKGU6IEVycm9yKSA9PiBlLm1lc3NhZ2UuaW5jbHVkZXMoJ1RyYW5zYWN0aW9uIHZhbGlkYXRpb24gZmFpbGVkJylcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBtaXNzaW5nIG9yaWdpbiBuZXR1aWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5hbW91bnQoJzEwMDAwMDAwMDAwMDAnKVxuICAgICAgICAub3JpZ2luSG90a2V5KHsgYWRkcmVzczogJzVGQ1BUbmpldkdxQXVUdHRldEJ5NGEyNEVqM3BIOWZpUThmbXZQMVprclZzTFVvVCcgfSlcbiAgICAgICAgLmRlc3RpbmF0aW9uSG90a2V5KHsgYWRkcmVzczogJzVGZnAxd0pDUHU0aHpWRFRvN1hhTUxxWlN2U2FkeVVRbXhXUER3NzRDQmpFQ1NvcScgfSlcbiAgICAgICAgLmRlc3RpbmF0aW9uTmV0dWlkKCcxJyk7XG5cbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IGJ1aWxkZXIudmFsaWRhdGVUcmFuc2FjdGlvbih7fSBhcyBhbnkpLFxuICAgICAgICAoZTogRXJyb3IpID0+IGUubWVzc2FnZS5pbmNsdWRlcygnVHJhbnNhY3Rpb24gdmFsaWRhdGlvbiBmYWlsZWQnKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIG1pc3NpbmcgZGVzdGluYXRpb24gbmV0dWlkJywgZnVuY3Rpb24gKCkge1xuICAgICAgYnVpbGRlclxuICAgICAgICAuYW1vdW50KCcxMDAwMDAwMDAwMDAwJylcbiAgICAgICAgLm9yaWdpbkhvdGtleSh7IGFkZHJlc3M6ICc1RkNQVG5qZXZHcUF1VHR0ZXRCeTRhMjRFajNwSDlmaVE4Zm12UDFaa3JWc0xVb1QnIH0pXG4gICAgICAgIC5kZXN0aW5hdGlvbkhvdGtleSh7IGFkZHJlc3M6ICc1RmZwMXdKQ1B1NGh6VkRUbzdYYU1McVpTdlNhZHlVUW14V1BEdzc0Q0JqRUNTb3EnIH0pXG4gICAgICAgIC5vcmlnaW5OZXR1aWQoJzEnKTtcblxuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gYnVpbGRlci52YWxpZGF0ZVRyYW5zYWN0aW9uKHt9IGFzIGFueSksXG4gICAgICAgIChlOiBFcnJvcikgPT4gZS5tZXNzYWdlLmluY2x1ZGVzKCdUcmFuc2FjdGlvbiB2YWxpZGF0aW9uIGZhaWxlZCcpXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgbWlzc2luZyBhbW91bnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5vcmlnaW5Ib3RrZXkoeyBhZGRyZXNzOiAnNUZDUFRuamV2R3FBdVR0dGV0Qnk0YTI0RWozcEg5ZmlROGZtdlAxWmtyVnNMVW9UJyB9KVxuICAgICAgICAuZGVzdGluYXRpb25Ib3RrZXkoeyBhZGRyZXNzOiAnNUZmcDF3SkNQdTRoelZEVG83WGFNTHFaU3ZTYWR5VVFteFdQRHc3NENCakVDU29xJyB9KVxuICAgICAgICAub3JpZ2luTmV0dWlkKCcxJylcbiAgICAgICAgLmRlc3RpbmF0aW9uTmV0dWlkKCcxJyk7XG5cbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IGJ1aWxkZXIudmFsaWRhdGVUcmFuc2FjdGlvbih7fSBhcyBhbnkpLFxuICAgICAgICAoZTogRXJyb3IpID0+IGUubWVzc2FnZS5pbmNsdWRlcygnVHJhbnNhY3Rpb24gdmFsaWRhdGlvbiBmYWlsZWQnKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIGludmFsaWQgdHJhbnNhY3Rpb24gdHlwZSBpbiBmcm9tSW1wbGVtZW50YXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBjb25maWcgPSBidWlsZFRlc3RDb25maWcoKTtcbiAgICAgIGNvbnN0IG1hdGVyaWFsID0gdXRpbHMuZ2V0TWF0ZXJpYWwoY29uZmlnLm5ldHdvcmsudHlwZSk7XG4gICAgICBjb25zdCBtb2NrQnVpbGRlciA9IG5ldyBUZXN0TW92ZVN0YWtlQnVpbGRlcihjb25maWcpLm1hdGVyaWFsKG1hdGVyaWFsKTtcbiAgICAgIG1vY2tCdWlsZGVyLnNldE1ldGhvZEZvclRlc3Rpbmcoe1xuICAgICAgICBuYW1lOiAndHJhbnNmZXJLZWVwQWxpdmUnLFxuICAgICAgICBhcmdzOiB7IGRlc3Q6IHsgaWQ6ICd0ZXN0JyB9LCB2YWx1ZTogJzEwMDAnIH0sXG4gICAgICAgIHBhbGxldDogJ2JhbGFuY2VzJyxcbiAgICAgIH0pO1xuXG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgLy8gQ2FsbCB0aGUgdmFsaWRhdGlvbiBsb2dpYyBkaXJlY3RseVxuICAgICAgICAgIGlmIChtb2NrQnVpbGRlclsnX21ldGhvZCddPy5uYW1lICE9PSAnbW92ZVN0YWtlJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICAgICAgICBgSW52YWxpZCBUcmFuc2FjdGlvbiBUeXBlOiAke21vY2tCdWlsZGVyWydfbWV0aG9kJ10/Lm5hbWV9LiBFeHBlY3RlZCBtb3ZlU3Rha2VgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgKGU6IEVycm9yKSA9PiBlLm1lc3NhZ2UuaW5jbHVkZXMoJ0ludmFsaWQgVHJhbnNhY3Rpb24gVHlwZTogdHJhbnNmZXJLZWVwQWxpdmUuIEV4cGVjdGVkIG1vdmVTdGFrZScpXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgbWFsZm9ybWVkIHJhdyB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IGJ1aWxkZXIuZnJvbSgnaW52YWxpZF9oZXhfZGF0YScpLFxuICAgICAgICAoZTogRXJyb3IpID0+IGUubWVzc2FnZSAhPT0gdW5kZWZpbmVkXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYm91bmRhcnkgdmFsdWUgYW5kIGVkZ2UgY2FzZSB0ZXN0cycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGhhbmRsZSB2ZXJ5IGxhcmdlIGFtb3VudHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBsYXJnZUFtb3VudCA9ICc5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTknO1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiBidWlsZGVyLmFtb3VudChsYXJnZUFtb3VudCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgc2FtZSBvcmlnaW4gYW5kIGRlc3RpbmF0aW9uIGhvdGtleXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzYW1lQWRkcmVzcyA9ICc1RkNQVG5qZXZHcUF1VHR0ZXRCeTRhMjRFajNwSDlmaVE4Zm12UDFaa3JWc0xVb1QnO1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIub3JpZ2luSG90a2V5KHsgYWRkcmVzczogc2FtZUFkZHJlc3MgfSkuZGVzdGluYXRpb25Ib3RrZXkoeyBhZGRyZXNzOiBzYW1lQWRkcmVzcyB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgc2FtZSBvcmlnaW4gYW5kIGRlc3RpbmF0aW9uIG5ldHVpZHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5vcmlnaW5OZXR1aWQoJzUnKS5kZXN0aW5hdGlvbk5ldHVpZCgnNScpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHZhcmlvdXMgYWRkcmVzcyBmb3JtYXRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaW52YWxpZEFkZHJlc3NlcyA9IFtcbiAgICAgICAgJycsXG4gICAgICAgICcxMjMnLFxuICAgICAgICAnaW52YWxpZF9hZGRyZXNzX2Zvcm1hdCcsXG4gICAgICAgICc1RkNQVG5qZXZHcUF1VHR0ZXRCeTRhMjRFajNwSDlmaVE4Zm12UDFaa3JWc0xVb1RfaW52YWxpZCcsXG4gICAgICBdO1xuXG4gICAgICBpbnZhbGlkQWRkcmVzc2VzLmZvckVhY2goKGFkZHJlc3MpID0+IHtcbiAgICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgICAoKSA9PiBidWlsZGVyLm9yaWdpbkhvdGtleSh7IGFkZHJlc3MgfSksXG4gICAgICAgICAgKGU6IEVycm9yKSA9PiBlLm1lc3NhZ2UuaW5jbHVkZXMoJ2lzIG5vdCBhIHdlbGwtZm9ybWVkIGRvdCBhZGRyZXNzJylcbiAgICAgICAgKTtcbiAgICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgICAoKSA9PiBidWlsZGVyLmRlc3RpbmF0aW9uSG90a2V5KHsgYWRkcmVzcyB9KSxcbiAgICAgICAgICAoZTogRXJyb3IpID0+IGUubWVzc2FnZS5pbmNsdWRlcygnaXMgbm90IGEgd2VsbC1mb3JtZWQgZG90IGFkZHJlc3MnKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBib3VuZGFyeSBuZXR1aWQgdmFsdWVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiBidWlsZGVyLm9yaWdpbk5ldHVpZCgnMCcpKTtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gYnVpbGRlci5vcmlnaW5OZXR1aWQoJzEyOCcpKTtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gYnVpbGRlci5kZXN0aW5hdGlvbk5ldHVpZCgnMCcpKTtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gYnVpbGRlci5kZXN0aW5hdGlvbk5ldHVpZCgnMTI4JykpO1xuXG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiBidWlsZGVyLm9yaWdpbk5ldHVpZCgnLTEnKSxcbiAgICAgICAgKGU6IEVycm9yKSA9PiBlLm1lc3NhZ2UuaW5jbHVkZXMoJ0ludmFsaWQgbmV0dWlkOiAtMS4gTXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLicpXG4gICAgICApO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gYnVpbGRlci5kZXN0aW5hdGlvbk5ldHVpZCgnMTI5JyksXG4gICAgICAgIChlOiBFcnJvcikgPT4gZS5tZXNzYWdlLmluY2x1ZGVzKCdJbnZhbGlkIG5ldHVpZDogMTI5LiBOZXR1aWQgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEyOC4nKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3RyYW5zYWN0aW9uIGV4cGxhbmF0aW9uIHZhbGlkYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBwcm92aWRlIGNvcnJlY3QgZXhwbGFuYXRpb24gd2l0aCBkaWZmZXJlbnQgc3VibmV0IHRva2VucycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLmFtb3VudCgnMTAwMDAwMDAwMDAwMCcpXG4gICAgICAgIC5vcmlnaW5Ib3RrZXkoeyBhZGRyZXNzOiAnNUZDUFRuamV2R3FBdVR0dGV0Qnk0YTI0RWozcEg5ZmlROGZtdlAxWmtyVnNMVW9UJyB9KVxuICAgICAgICAuZGVzdGluYXRpb25Ib3RrZXkoeyBhZGRyZXNzOiAnNUZmcDF3SkNQdTRoelZEVG83WGFNTHFaU3ZTYWR5VVFteFdQRHc3NENCakVDU29xJyB9KVxuICAgICAgICAub3JpZ2luTmV0dWlkKCcxJylcbiAgICAgICAgLmRlc3RpbmF0aW9uTmV0dWlkKCcyJylcbiAgICAgICAgLnNlbmRlcih7IGFkZHJlc3M6IHNlbmRlci5hZGRyZXNzIH0pXG4gICAgICAgIC52YWxpZGl0eSh7IGZpcnN0VmFsaWQ6IDM5MzMsIG1heER1cmF0aW9uOiA2NCB9KVxuICAgICAgICAucmVmZXJlbmNlQmxvY2socmVmZXJlbmNlQmxvY2spXG4gICAgICAgIC5zZXF1ZW5jZUlkKHsgbmFtZTogJ05vbmNlJywga2V5d29yZDogJ25vbmNlJywgdmFsdWU6IDIwMCB9KVxuICAgICAgICAuZmVlKHsgYW1vdW50OiAwLCB0eXBlOiAndGlwJyB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBleHBsYW5hdGlvbiA9IHR4LmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuXG4gICAgICBleHBsYW5hdGlvbi5zaG91bGQuaGF2ZS5wcm9wZXJ0aWVzKFsnb3V0cHV0QW1vdW50JywgJ2NoYW5nZUFtb3VudCcsICdmZWUnLCAndHlwZSddKTtcbiAgICAgIGV4cGxhbmF0aW9uLm91dHB1dEFtb3VudC5zaG91bGQuZXF1YWwoJzEwMDAwMDAwMDAwMDAnKTtcbiAgICAgIGV4cGxhbmF0aW9uLmNoYW5nZUFtb3VudC5zaG91bGQuZXF1YWwoJzAnKTtcbiAgICAgIGV4cGxhbmF0aW9uLmZlZS5zaG91bGQuaGF2ZS5wcm9wZXJ0aWVzKFsnZmVlJywgJ3R5cGUnXSk7XG4gICAgICBleHBsYW5hdGlvbi5mZWUudHlwZS5zaG91bGQuZXF1YWwoJ3RpcCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgZXhwbGFuYXRpb24gd2l0aCB6ZXJvIHRpcCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLmFtb3VudCgnNTAwMDAwMDAwJylcbiAgICAgICAgLm9yaWdpbkhvdGtleSh7IGFkZHJlc3M6ICc1RkNQVG5qZXZHcUF1VHR0ZXRCeTRhMjRFajNwSDlmaVE4Zm12UDFaa3JWc0xVb1QnIH0pXG4gICAgICAgIC5kZXN0aW5hdGlvbkhvdGtleSh7IGFkZHJlc3M6ICc1RmZwMXdKQ1B1NGh6VkRUbzdYYU1McVpTdlNhZHlVUW14V1BEdzc0Q0JqRUNTb3EnIH0pXG4gICAgICAgIC5vcmlnaW5OZXR1aWQoJzEnKVxuICAgICAgICAuZGVzdGluYXRpb25OZXR1aWQoJzEnKVxuICAgICAgICAuc2VuZGVyKHsgYWRkcmVzczogc2VuZGVyLmFkZHJlc3MgfSlcbiAgICAgICAgLnZhbGlkaXR5KHsgZmlyc3RWYWxpZDogMzkzMywgbWF4RHVyYXRpb246IDY0IH0pXG4gICAgICAgIC5yZWZlcmVuY2VCbG9jayhyZWZlcmVuY2VCbG9jaylcbiAgICAgICAgLnNlcXVlbmNlSWQoeyBuYW1lOiAnTm9uY2UnLCBrZXl3b3JkOiAnbm9uY2UnLCB2YWx1ZTogMjAwIH0pXG4gICAgICAgIC5mZWUoeyBhbW91bnQ6IDAsIHR5cGU6ICd0aXAnIH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IGV4cGxhbmF0aW9uID0gdHguZXhwbGFpblRyYW5zYWN0aW9uKCk7XG5cbiAgICAgIGV4cGxhbmF0aW9uLmZlZS5mZWUuc2hvdWxkLmVxdWFsKCcwJyk7XG4gICAgICBleHBsYW5hdGlvbi5vdXRwdXRBbW91bnQuc2hvdWxkLmVxdWFsKCc1MDAwMDAwMDAnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2Zyb21JbXBsZW1lbnRhdGlvbiBzdGFnZXMgdmFsaWRhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGNhbGwgc3VwZXIuZnJvbUltcGxlbWVudGF0aW9uIGJlZm9yZSB2YWxpZGF0aW9uIHRvIHBvcHVsYXRlIF9tZXRob2QnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBjb25maWcgPSBidWlsZFRlc3RDb25maWcoKTtcbiAgICAgIGNvbnN0IG1hdGVyaWFsID0gdXRpbHMuZ2V0TWF0ZXJpYWwoY29uZmlnLm5ldHdvcmsudHlwZSk7XG4gICAgICBjb25zdCB2YWxpZEJ1aWxkZXIgPSBuZXcgTW92ZVN0YWtlQnVpbGRlcihjb25maWcpLm1hdGVyaWFsKG1hdGVyaWFsKTtcbiAgICAgIHZhbGlkQnVpbGRlclxuICAgICAgICAuYW1vdW50KCcxMDAwMDAwMDAwMDAwJylcbiAgICAgICAgLm9yaWdpbkhvdGtleSh7IGFkZHJlc3M6ICc1RkNQVG5qZXZHcUF1VHR0ZXRCeTRhMjRFajNwSDlmaVE4Zm12UDFaa3JWc0xVb1QnIH0pXG4gICAgICAgIC5kZXN0aW5hdGlvbkhvdGtleSh7IGFkZHJlc3M6ICc1RmZwMXdKQ1B1NGh6VkRUbzdYYU1McVpTdlNhZHlVUW14V1BEdzc0Q0JqRUNTb3EnIH0pXG4gICAgICAgIC5vcmlnaW5OZXR1aWQoJzEnKVxuICAgICAgICAuZGVzdGluYXRpb25OZXR1aWQoJzInKVxuICAgICAgICAuc2VuZGVyKHsgYWRkcmVzczogc2VuZGVyLmFkZHJlc3MgfSlcbiAgICAgICAgLnZhbGlkaXR5KHsgZmlyc3RWYWxpZDogMzkzMywgbWF4RHVyYXRpb246IDY0IH0pXG4gICAgICAgIC5yZWZlcmVuY2VCbG9jayhyZWZlcmVuY2VCbG9jaylcbiAgICAgICAgLnNlcXVlbmNlSWQoeyBuYW1lOiAnTm9uY2UnLCBrZXl3b3JkOiAnbm9uY2UnLCB2YWx1ZTogMjAwIH0pXG4gICAgICAgIC5mZWUoeyBhbW91bnQ6IDAsIHR5cGU6ICd0aXAnIH0pO1xuXG4gICAgICBjb25zdCB2YWxpZFR4ID0gYXdhaXQgdmFsaWRCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCByYXdUeEhleCA9IHZhbGlkVHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgY29uc3QgbmV3QnVpbGRlciA9IG5ldyBNb3ZlU3Rha2VCdWlsZGVyKGNvbmZpZykubWF0ZXJpYWwobWF0ZXJpYWwpO1xuXG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgbmV3QnVpbGRlci5mcm9tKHJhd1R4SGV4KTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBidWlsZGVyTWV0aG9kID0gKG5ld0J1aWxkZXIgYXMgYW55KS5fbWV0aG9kO1xuICAgICAgYnVpbGRlck1ldGhvZC5zaG91bGQubm90LmJlLnVuZGVmaW5lZCgpO1xuICAgICAgYnVpbGRlck1ldGhvZC5uYW1lLnNob3VsZC5lcXVhbCgnbW92ZVN0YWtlJyk7XG4gICAgICBidWlsZGVyTWV0aG9kLmFyZ3Muc2hvdWxkLmhhdmUucHJvcGVydGllcyhbXG4gICAgICAgICdvcmlnaW5Ib3RrZXknLFxuICAgICAgICAnZGVzdGluYXRpb25Ib3RrZXknLFxuICAgICAgICAnb3JpZ2luTmV0dWlkJyxcbiAgICAgICAgJ2Rlc3RpbmF0aW9uTmV0dWlkJyxcbiAgICAgICAgJ2FscGhhQW1vdW50JyxcbiAgICAgIF0pO1xuICAgICAgYnVpbGRlck1ldGhvZC5hcmdzLmFscGhhQW1vdW50LnNob3VsZC5lcXVhbCgnMTAwMDAwMDAwMDAwMCcpO1xuICAgICAgYnVpbGRlck1ldGhvZC5hcmdzLm9yaWdpbkhvdGtleS5zaG91bGQuZXF1YWwoJzVGQ1BUbmpldkdxQXVUdHRldEJ5NGEyNEVqM3BIOWZpUThmbXZQMVprclZzTFVvVCcpO1xuICAgICAgYnVpbGRlck1ldGhvZC5hcmdzLmRlc3RpbmF0aW9uSG90a2V5LnNob3VsZC5lcXVhbCgnNUZmcDF3SkNQdTRoelZEVG83WGFNTHFaU3ZTYWR5VVFteFdQRHc3NENCakVDU29xJyk7XG4gICAgICBidWlsZGVyTWV0aG9kLmFyZ3Mub3JpZ2luTmV0dWlkLnNob3VsZC5lcXVhbCgnMScpO1xuICAgICAgYnVpbGRlck1ldGhvZC5hcmdzLmRlc3RpbmF0aW9uTmV0dWlkLnNob3VsZC5lcXVhbCgnMicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBpZiBfbWV0aG9kIGlzIG5vdCBwb3B1bGF0ZWQgYmVmb3JlIHZhbGlkYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBjb25maWcgPSBidWlsZFRlc3RDb25maWcoKTtcbiAgICAgIGNvbnN0IG1hdGVyaWFsID0gdXRpbHMuZ2V0TWF0ZXJpYWwoY29uZmlnLm5ldHdvcmsudHlwZSk7XG4gICAgICBjb25zdCBtb2NrQnVpbGRlciA9IG5ldyBUZXN0TW92ZVN0YWtlQnVpbGRlcihjb25maWcpLm1hdGVyaWFsKG1hdGVyaWFsKTtcblxuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIGlmIChtb2NrQnVpbGRlclsnX21ldGhvZCddPy5uYW1lICE9PSAnbW92ZVN0YWtlJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICAgICAgICBgSW52YWxpZCBUcmFuc2FjdGlvbiBUeXBlOiAke21vY2tCdWlsZGVyWydfbWV0aG9kJ10/Lm5hbWV9LiBFeHBlY3RlZCBtb3ZlU3Rha2VgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgKGU6IEVycm9yKSA9PiBlLm1lc3NhZ2UuaW5jbHVkZXMoJ0ludmFsaWQgVHJhbnNhY3Rpb24gVHlwZTogdW5kZWZpbmVkLiBFeHBlY3RlZCBtb3ZlU3Rha2UnKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcHJvcGVybHkgdmFsaWRhdGUgdHJhbnNhY3Rpb24gdHlwZSBhZnRlciBzdXBlci5mcm9tSW1wbGVtZW50YXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBjb25maWcgPSBidWlsZFRlc3RDb25maWcoKTtcbiAgICAgIGNvbnN0IG1hdGVyaWFsID0gdXRpbHMuZ2V0TWF0ZXJpYWwoY29uZmlnLm5ldHdvcmsudHlwZSk7XG4gICAgICBjb25zdCBtb2NrQnVpbGRlciA9IG5ldyBUZXN0TW92ZVN0YWtlQnVpbGRlcihjb25maWcpLm1hdGVyaWFsKG1hdGVyaWFsKTtcblxuICAgICAgbW9ja0J1aWxkZXIuc2V0TWV0aG9kRm9yVGVzdGluZyh7XG4gICAgICAgIG5hbWU6ICd0cmFuc2ZlcktlZXBBbGl2ZScsXG4gICAgICAgIGFyZ3M6IHsgZGVzdDogeyBpZDogJ3Rlc3QnIH0sIHZhbHVlOiAnMTAwMCcgfSxcbiAgICAgICAgcGFsbGV0OiAnYmFsYW5jZXMnLFxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICBpZiAobW9ja0J1aWxkZXJbJ19tZXRob2QnXT8ubmFtZSAhPT0gJ21vdmVTdGFrZScpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgICAgICAgYEludmFsaWQgVHJhbnNhY3Rpb24gVHlwZTogJHttb2NrQnVpbGRlclsnX21ldGhvZCddPy5uYW1lfS4gRXhwZWN0ZWQgbW92ZVN0YWtlYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBFcnJvcikgPT4gZS5tZXNzYWdlLmluY2x1ZGVzKCdJbnZhbGlkIFRyYW5zYWN0aW9uIFR5cGU6IHRyYW5zZmVyS2VlcEFsaXZlLiBFeHBlY3RlZCBtb3ZlU3Rha2UnKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc3VjY2Vzc2Z1bGx5IHBhcnNlIGFuZCB2YWxpZGF0ZSBjb3JyZWN0IG1vdmVTdGFrZSB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGJ1aWxkVGVzdENvbmZpZygpO1xuICAgICAgY29uc3QgbWF0ZXJpYWwgPSB1dGlscy5nZXRNYXRlcmlhbChjb25maWcubmV0d29yay50eXBlKTtcbiAgICAgIGNvbnN0IG1vY2tCdWlsZGVyID0gbmV3IFRlc3RNb3ZlU3Rha2VCdWlsZGVyKGNvbmZpZykubWF0ZXJpYWwobWF0ZXJpYWwpO1xuXG4gICAgICBtb2NrQnVpbGRlci5zZXRNZXRob2RGb3JUZXN0aW5nKHtcbiAgICAgICAgbmFtZTogJ21vdmVTdGFrZScsXG4gICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICBvcmlnaW5Ib3RrZXk6ICc1RkNQVG5qZXZHcUF1VHR0ZXRCeTRhMjRFajNwSDlmaVE4Zm12UDFaa3JWc0xVb1QnLFxuICAgICAgICAgIGRlc3RpbmF0aW9uSG90a2V5OiAnNUZmcDF3SkNQdTRoelZEVG83WGFNTHFaU3ZTYWR5VVFteFdQRHc3NENCakVDU29xJyxcbiAgICAgICAgICBvcmlnaW5OZXR1aWQ6ICcxJyxcbiAgICAgICAgICBkZXN0aW5hdGlvbk5ldHVpZDogJzInLFxuICAgICAgICAgIGFscGhhQW1vdW50OiAnMTAwMDAwMDAwMDAwMCcsXG4gICAgICAgIH0sXG4gICAgICAgIHBhbGxldDogJ3N1YnRlbnNvck1vZHVsZScsXG4gICAgICB9KTtcblxuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGlmIChtb2NrQnVpbGRlclsnX21ldGhvZCddPy5uYW1lICE9PSAnbW92ZVN0YWtlJykge1xuICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgICAgIGBJbnZhbGlkIFRyYW5zYWN0aW9uIFR5cGU6ICR7bW9ja0J1aWxkZXJbJ19tZXRob2QnXT8ubmFtZX0uIEV4cGVjdGVkIG1vdmVTdGFrZWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB2YWxpZGF0aW9uIHdoZW4gcGFyc2luZyB3cm9uZyB0cmFuc2FjdGlvbiB0eXBlICh0cmFuc2ZlclN0YWtlIGluc3RlYWQgb2YgbW92ZVN0YWtlKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGJ1aWxkVGVzdENvbmZpZygpO1xuICAgICAgY29uc3QgbWF0ZXJpYWwgPSB1dGlscy5nZXRNYXRlcmlhbChjb25maWcubmV0d29yay50eXBlKTtcbiAgICAgIGNvbnN0IG1vdmVTdGFrZUJ1aWxkZXIgPSBuZXcgTW92ZVN0YWtlQnVpbGRlcihjb25maWcpLm1hdGVyaWFsKG1hdGVyaWFsKTtcblxuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIG1vdmVTdGFrZUJ1aWxkZXIuZnJvbShyYXdUeC50cmFuc2ZlclN0YWtlLnNpZ25lZCk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBFcnJvcikgPT4gZS5tZXNzYWdlLmluY2x1ZGVzKCdJbnZhbGlkIFRyYW5zYWN0aW9uIFR5cGU6IHRyYW5zZmVyU3Rha2UuIEV4cGVjdGVkIG1vdmVTdGFrZScpXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2ZXJpZnkgX21ldGhvZCBpcyBwcm9wZXJseSBwb3B1bGF0ZWQgYWZ0ZXIgc3VwZXIuZnJvbUltcGxlbWVudGF0aW9uIHdpdGggd3JvbmcgdHJhbnNhY3Rpb24gdHlwZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGJ1aWxkVGVzdENvbmZpZygpO1xuICAgICAgY29uc3QgbWF0ZXJpYWwgPSB1dGlscy5nZXRNYXRlcmlhbChjb25maWcubmV0d29yay50eXBlKTtcblxuICAgICAgY29uc3QgdGVzdEJ1aWxkZXIgPSBuZXcgVGVzdE1vdmVTdGFrZUJ1aWxkZXIoY29uZmlnKS5tYXRlcmlhbChtYXRlcmlhbCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHRlc3RCdWlsZGVyLmZyb20ocmF3VHgudHJhbnNmZXJTdGFrZS5zaWduZWQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgbWV0aG9kID0gKHRlc3RCdWlsZGVyIGFzIGFueSkuX21ldGhvZDtcbiAgICAgICAgbWV0aG9kLnNob3VsZC5ub3QuYmUudW5kZWZpbmVkKCk7XG4gICAgICAgIG1ldGhvZC5uYW1lLnNob3VsZC5lcXVhbCgndHJhbnNmZXJTdGFrZScpOyAvLyBUaGlzIHByb3ZlcyBzdXBlci5mcm9tSW1wbGVtZW50YXRpb24gd2FzIGNhbGxlZFxuICAgICAgICBtZXRob2Quc2hvdWxkLmhhdmUucHJvcGVydHkoJ2FyZ3MnKTtcbiAgICAgICAgbWV0aG9kLnNob3VsZC5oYXZlLnByb3BlcnR5KCdwYWxsZXQnKTtcblxuICAgICAgICAoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2Uuc2hvdWxkLmNvbnRhaW5FcWwoJ0ludmFsaWQgVHJhbnNhY3Rpb24gVHlwZTogdHJhbnNmZXJTdGFrZS4gRXhwZWN0ZWQgbW92ZVN0YWtlJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=singeltonRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"singeltonRegistry.d.ts","sourceRoot":"","sources":["../../../../test/unit/transactionBuilder/singeltonRegistry.ts"],"names":[],"mappings":""}