@bitgo-beta/sdk-coin-apt 1.0.1-beta.91 → 1.0.1-beta.911

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 (145) hide show
  1. package/dist/src/apt.d.ts +9 -2
  2. package/dist/src/apt.d.ts.map +1 -1
  3. package/dist/src/apt.js +37 -11
  4. package/dist/src/aptNFTCollection.d.ts +18 -0
  5. package/dist/src/aptNFTCollection.d.ts.map +1 -0
  6. package/dist/src/aptNFTCollection.js +52 -0
  7. package/dist/src/aptToken.d.ts +19 -0
  8. package/dist/src/aptToken.d.ts.map +1 -0
  9. package/dist/src/aptToken.js +52 -0
  10. package/dist/src/index.d.ts +2 -0
  11. package/dist/src/index.d.ts.map +1 -1
  12. package/dist/src/index.js +3 -1
  13. package/dist/src/lib/constants.d.ts +16 -0
  14. package/dist/src/lib/constants.d.ts.map +1 -1
  15. package/dist/src/lib/constants.js +18 -2
  16. package/dist/src/lib/iface.d.ts +98 -2
  17. package/dist/src/lib/iface.d.ts.map +1 -1
  18. package/dist/src/lib/iface.js +1 -1
  19. package/dist/src/lib/index.d.ts +18 -4
  20. package/dist/src/lib/index.d.ts.map +1 -1
  21. package/dist/src/lib/index.js +35 -7
  22. package/dist/src/lib/transaction/abstractDelegationPoolAmountBasedTransaction.d.ts +21 -0
  23. package/dist/src/lib/transaction/abstractDelegationPoolAmountBasedTransaction.d.ts.map +1 -0
  24. package/dist/src/lib/transaction/abstractDelegationPoolAmountBasedTransaction.js +61 -0
  25. package/dist/src/lib/transaction/abstractDelegationPoolTransaction.d.ts +13 -0
  26. package/dist/src/lib/transaction/abstractDelegationPoolTransaction.d.ts.map +1 -0
  27. package/dist/src/lib/transaction/abstractDelegationPoolTransaction.js +23 -0
  28. package/dist/src/lib/transaction/abstractTransferTransaction.d.ts +10 -0
  29. package/dist/src/lib/transaction/abstractTransferTransaction.d.ts.map +1 -0
  30. package/dist/src/lib/transaction/abstractTransferTransaction.js +39 -0
  31. package/dist/src/lib/transaction/customTransaction.d.ts +89 -0
  32. package/dist/src/lib/transaction/customTransaction.d.ts.map +1 -0
  33. package/dist/src/lib/transaction/customTransaction.js +278 -0
  34. package/dist/src/lib/transaction/delegationPoolAddStakeTransaction.d.ts +10 -0
  35. package/dist/src/lib/transaction/delegationPoolAddStakeTransaction.d.ts.map +1 -0
  36. package/dist/src/lib/transaction/delegationPoolAddStakeTransaction.js +48 -0
  37. package/dist/src/lib/transaction/delegationPoolUnlockTransaction.d.ts +10 -0
  38. package/dist/src/lib/transaction/delegationPoolUnlockTransaction.d.ts.map +1 -0
  39. package/dist/src/lib/transaction/delegationPoolUnlockTransaction.js +24 -0
  40. package/dist/src/lib/transaction/delegationPoolWithdrawTransaction.d.ts +10 -0
  41. package/dist/src/lib/transaction/delegationPoolWithdrawTransaction.d.ts.map +1 -0
  42. package/dist/src/lib/transaction/delegationPoolWithdrawTransaction.js +43 -0
  43. package/dist/src/lib/transaction/digitalAssetTransfer.d.ts +10 -0
  44. package/dist/src/lib/transaction/digitalAssetTransfer.d.ts.map +1 -0
  45. package/dist/src/lib/transaction/digitalAssetTransfer.js +45 -0
  46. package/dist/src/lib/transaction/fungibleAssetTransfer.d.ts +12 -0
  47. package/dist/src/lib/transaction/fungibleAssetTransfer.d.ts.map +1 -0
  48. package/dist/src/lib/transaction/fungibleAssetTransfer.js +73 -0
  49. package/dist/src/lib/transaction/transaction.d.ts +45 -7
  50. package/dist/src/lib/transaction/transaction.d.ts.map +1 -1
  51. package/dist/src/lib/transaction/transaction.js +175 -61
  52. package/dist/src/lib/transaction/transferTransaction.d.ts +10 -8
  53. package/dist/src/lib/transaction/transferTransaction.d.ts.map +1 -1
  54. package/dist/src/lib/transaction/transferTransaction.js +48 -41
  55. package/dist/src/lib/transactionBuilder/customTransactionBuilder.d.ts +64 -0
  56. package/dist/src/lib/transactionBuilder/customTransactionBuilder.d.ts.map +1 -0
  57. package/dist/src/lib/transactionBuilder/customTransactionBuilder.js +127 -0
  58. package/dist/src/lib/transactionBuilder/delegationPoolAddStakeTransactionBuilder.d.ts +15 -0
  59. package/dist/src/lib/transactionBuilder/delegationPoolAddStakeTransactionBuilder.d.ts.map +1 -0
  60. package/dist/src/lib/transactionBuilder/delegationPoolAddStakeTransactionBuilder.js +50 -0
  61. package/dist/src/lib/transactionBuilder/delegationPoolUnlockTransactionBuilder.d.ts +15 -0
  62. package/dist/src/lib/transactionBuilder/delegationPoolUnlockTransactionBuilder.d.ts.map +1 -0
  63. package/dist/src/lib/transactionBuilder/delegationPoolUnlockTransactionBuilder.js +50 -0
  64. package/dist/src/lib/transactionBuilder/delegationPoolWithdrawTransactionBuilder.d.ts +15 -0
  65. package/dist/src/lib/transactionBuilder/delegationPoolWithdrawTransactionBuilder.d.ts.map +1 -0
  66. package/dist/src/lib/transactionBuilder/delegationPoolWithdrawTransactionBuilder.js +50 -0
  67. package/dist/src/lib/transactionBuilder/digitalAssetTransferBuilder.d.ts +14 -0
  68. package/dist/src/lib/transactionBuilder/digitalAssetTransferBuilder.d.ts.map +1 -0
  69. package/dist/src/lib/transactionBuilder/digitalAssetTransferBuilder.js +55 -0
  70. package/dist/src/lib/transactionBuilder/fungibleAssetTransferBuilder.d.ts +15 -0
  71. package/dist/src/lib/transactionBuilder/fungibleAssetTransferBuilder.d.ts.map +1 -0
  72. package/dist/src/lib/transactionBuilder/fungibleAssetTransferBuilder.js +61 -0
  73. package/dist/src/lib/{transactionBuilder.d.ts → transactionBuilder/transactionBuilder.d.ts} +25 -11
  74. package/dist/src/lib/transactionBuilder/transactionBuilder.d.ts.map +1 -0
  75. package/dist/src/lib/transactionBuilder/transactionBuilder.js +169 -0
  76. package/dist/src/lib/{transferBuilder.d.ts → transactionBuilder/transferBuilder.d.ts} +5 -7
  77. package/dist/src/lib/transactionBuilder/transferBuilder.d.ts.map +1 -0
  78. package/dist/src/lib/transactionBuilder/transferBuilder.js +56 -0
  79. package/dist/src/lib/transactionBuilderFactory.d.ts +26 -10
  80. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  81. package/dist/src/lib/transactionBuilderFactory.js +82 -18
  82. package/dist/src/lib/utils/validation.d.ts +32 -0
  83. package/dist/src/lib/utils/validation.d.ts.map +1 -0
  84. package/dist/src/lib/utils/validation.js +99 -0
  85. package/dist/src/lib/utils.d.ts +29 -5
  86. package/dist/src/lib/utils.d.ts.map +1 -1
  87. package/dist/src/lib/utils.js +111 -28
  88. package/dist/src/register.d.ts.map +1 -1
  89. package/dist/src/register.js +9 -1
  90. package/dist/test/integration/index.d.ts +1 -0
  91. package/dist/test/integration/index.d.ts.map +1 -0
  92. package/dist/test/integration/index.js +1 -0
  93. package/dist/test/resources/apt.d.ts +56 -0
  94. package/dist/test/resources/apt.d.ts.map +1 -0
  95. package/dist/test/resources/apt.js +115 -0
  96. package/dist/test/unit/apt.d.ts +2 -0
  97. package/dist/test/unit/apt.d.ts.map +1 -0
  98. package/dist/test/unit/apt.js +375 -0
  99. package/dist/test/unit/aptToken.d.ts +2 -0
  100. package/dist/test/unit/aptToken.d.ts.map +1 -0
  101. package/dist/test/unit/aptToken.js +92 -0
  102. package/dist/test/unit/customTransaction.test.d.ts +2 -0
  103. package/dist/test/unit/customTransaction.test.d.ts.map +1 -0
  104. package/dist/test/unit/customTransaction.test.js +264 -0
  105. package/dist/test/unit/getBuilderFactory.d.ts +3 -0
  106. package/dist/test/unit/getBuilderFactory.d.ts.map +1 -0
  107. package/dist/test/unit/getBuilderFactory.js +10 -0
  108. package/dist/test/unit/keyPair.d.ts +2 -0
  109. package/dist/test/unit/keyPair.d.ts.map +1 -0
  110. package/dist/test/unit/keyPair.js +71 -0
  111. package/dist/test/unit/transactionBuilder/customTransactionBuilder.d.ts +2 -0
  112. package/dist/test/unit/transactionBuilder/customTransactionBuilder.d.ts.map +1 -0
  113. package/dist/test/unit/transactionBuilder/customTransactionBuilder.js +743 -0
  114. package/dist/test/unit/transactionBuilder/delegationPoolAddStakeTransactionBuilder.d.ts +2 -0
  115. package/dist/test/unit/transactionBuilder/delegationPoolAddStakeTransactionBuilder.d.ts.map +1 -0
  116. package/dist/test/unit/transactionBuilder/delegationPoolAddStakeTransactionBuilder.js +172 -0
  117. package/dist/test/unit/transactionBuilder/delegationPoolUnlockTransactionBuilder.d.ts +2 -0
  118. package/dist/test/unit/transactionBuilder/delegationPoolUnlockTransactionBuilder.d.ts.map +1 -0
  119. package/dist/test/unit/transactionBuilder/delegationPoolUnlockTransactionBuilder.js +148 -0
  120. package/dist/test/unit/transactionBuilder/delegationPoolWithdrawTransactionBuilder.d.ts +2 -0
  121. package/dist/test/unit/transactionBuilder/delegationPoolWithdrawTransactionBuilder.d.ts.map +1 -0
  122. package/dist/test/unit/transactionBuilder/delegationPoolWithdrawTransactionBuilder.js +172 -0
  123. package/dist/test/unit/transactionBuilder/digitalAssetTransferBuilder.d.ts +2 -0
  124. package/dist/test/unit/transactionBuilder/digitalAssetTransferBuilder.d.ts.map +1 -0
  125. package/dist/test/unit/transactionBuilder/digitalAssetTransferBuilder.js +276 -0
  126. package/dist/test/unit/transactionBuilder/fungibleAssetTransferBuilder.d.ts +2 -0
  127. package/dist/test/unit/transactionBuilder/fungibleAssetTransferBuilder.d.ts.map +1 -0
  128. package/dist/test/unit/transactionBuilder/fungibleAssetTransferBuilder.js +449 -0
  129. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
  130. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  131. package/dist/test/unit/transactionBuilder/transferBuilder.js +529 -0
  132. package/dist/test/unit/utils.d.ts +2 -0
  133. package/dist/test/unit/utils.d.ts.map +1 -0
  134. package/dist/test/unit/utils.js +108 -0
  135. package/dist/tsconfig.tsbuildinfo +1 -0
  136. package/package.json +14 -11
  137. package/.eslintignore +0 -4
  138. package/.gitignore +0 -3
  139. package/.mocharc.yml +0 -8
  140. package/.prettierignore +0 -2
  141. package/CHANGELOG.md +0 -72
  142. package/dist/src/lib/transactionBuilder.d.ts.map +0 -1
  143. package/dist/src/lib/transactionBuilder.js +0 -118
  144. package/dist/src/lib/transferBuilder.d.ts.map +0 -1
  145. package/dist/src/lib/transferBuilder.js +0 -25
@@ -0,0 +1,449 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const getBuilderFactory_1 = require("../getBuilderFactory");
40
+ const statics_1 = require("@bitgo-beta/statics");
41
+ const src_1 = require("../../../src");
42
+ const testData = __importStar(require("../../resources/apt"));
43
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
44
+ const should_1 = __importDefault(require("should"));
45
+ const fungibleAssetTransfer_1 = require("../../../src/lib/transaction/fungibleAssetTransfer");
46
+ describe('Apt Token Transfer Builder', () => {
47
+ const factory = (0, getBuilderFactory_1.getBuilderFactory)('tapt:usdt');
48
+ describe('Succeed', () => {
49
+ it('should build a token transfer', async function () {
50
+ const fungibleTokenTransfer = new fungibleAssetTransfer_1.FungibleAssetTransfer(statics_1.coins.get('tapt:usdt'));
51
+ const txBuilder = factory.getFungibleAssetTransactionBuilder(fungibleTokenTransfer);
52
+ txBuilder.sender(testData.sender2.address);
53
+ txBuilder.recipients([testData.fungibleTokenRecipients[0]]);
54
+ txBuilder.gasData({
55
+ maxGasAmount: 200000,
56
+ gasUnitPrice: 100,
57
+ });
58
+ txBuilder.assetId(testData.fungibleTokenAddress.usdt);
59
+ txBuilder.sequenceNumber(14);
60
+ txBuilder.expirationTime(1736246155);
61
+ txBuilder.addFeePayerAddress(testData.feePayer.address);
62
+ const tx = (await txBuilder.build());
63
+ should_1.default.equal(tx.sender, testData.sender2.address);
64
+ should_1.default.equal(tx.recipients[0].address, testData.fungibleTokenRecipients[0].address);
65
+ should_1.default.equal(tx.recipient.address, testData.fungibleTokenRecipients[0].address);
66
+ should_1.default.equal(tx.recipients[0].amount, testData.fungibleTokenRecipients[0].amount);
67
+ should_1.default.equal(tx.recipient.amount, testData.fungibleTokenRecipients[0].amount);
68
+ should_1.default.equal(tx.assetId, testData.fungibleTokenAddress.usdt);
69
+ should_1.default.equal(tx.maxGasAmount, 200000);
70
+ should_1.default.equal(tx.gasUnitPrice, 100);
71
+ should_1.default.equal(tx.sequenceNumber, 14);
72
+ should_1.default.equal(tx.expirationTime, 1736246155);
73
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.SendToken);
74
+ tx.inputs.length.should.equal(1);
75
+ tx.inputs[0].should.deepEqual({
76
+ address: testData.sender2.address,
77
+ value: testData.fungibleTokenRecipients[0].amount,
78
+ coin: 'tapt:usdt',
79
+ });
80
+ tx.outputs.length.should.equal(1);
81
+ tx.outputs[0].should.deepEqual({
82
+ address: testData.fungibleTokenRecipients[0].address,
83
+ value: testData.fungibleTokenRecipients[0].amount,
84
+ coin: 'tapt:usdt',
85
+ });
86
+ const rawTx = tx.toBroadcastFormat();
87
+ should_1.default.equal(txBuilder.isValidRawTransaction(rawTx), true);
88
+ rawTx.should.equal('0x1aed808916ab9b1b30b07abb53561afd46847285ce28651221d406173a3724490e00000000000000020000000000000000000000000000000000000000000000000000000000000001167072696d6172795f66756e6769626c655f73746f7265087472616e73666572010700000000000000000000000000000000000000000000000000000000000000010e66756e6769626c655f6173736574084d65746164617461000320d5d0d561493ea2b9410f67da804653ae44e793c2423707d4f11edb2e3819205020f7405c28a02cf5bab4ea4498240bb3579db45951794eb1c843bef0534c093ad9080100000000000000400d03000000000064000000000000008b037d670000000002030020000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dbc87a1c816d9bcd06b683c37e80c7162e4d48da7812198b830e4d5d8e0629f2002000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000');
89
+ });
90
+ it('should build and send a signed tx', async function () {
91
+ const txBuilder = factory.from(testData.FUNGIBLE_TOKEN_TRANSFER);
92
+ const tx = (await txBuilder.build());
93
+ tx.inputs.length.should.equal(1);
94
+ tx.inputs[0].should.deepEqual({
95
+ address: testData.sender2.address,
96
+ value: testData.fungibleTokenRecipients[0].amount,
97
+ coin: 'tapt:usdt',
98
+ });
99
+ tx.outputs.length.should.equal(1);
100
+ tx.outputs[0].should.deepEqual({
101
+ address: testData.fungibleTokenRecipients[0].address,
102
+ value: testData.fungibleTokenRecipients[0].amount,
103
+ coin: 'tapt:usdt',
104
+ });
105
+ should_1.default.equal(tx.id, '0x271da92f3dcd673a0bd28d26f8b49c1f0c6ead0f5be0fbab3e9412972e96d80b');
106
+ should_1.default.equal(tx.maxGasAmount, 200000);
107
+ should_1.default.equal(tx.gasUnitPrice, 100);
108
+ should_1.default.equal(tx.sequenceNumber, 167);
109
+ should_1.default.equal(tx.expirationTime, 1737893604);
110
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.SendToken);
111
+ const rawTx = tx.toBroadcastFormat();
112
+ should_1.default.equal(txBuilder.isValidRawTransaction(rawTx), true);
113
+ should_1.default.equal(rawTx, testData.FUNGIBLE_TOKEN_TRANSFER);
114
+ });
115
+ it('should succeed to validate a valid signablePayload', async function () {
116
+ const transaction = new fungibleAssetTransfer_1.FungibleAssetTransfer(statics_1.coins.get('tapt'));
117
+ const txBuilder = factory.getFungibleAssetTransactionBuilder(transaction);
118
+ txBuilder.sender(testData.sender2.address);
119
+ txBuilder.recipients([testData.fungibleTokenRecipients[0]]);
120
+ txBuilder.gasData({
121
+ maxGasAmount: 200000,
122
+ gasUnitPrice: 100,
123
+ });
124
+ txBuilder.sequenceNumber(14);
125
+ txBuilder.expirationTime(1736246155);
126
+ txBuilder.assetId(testData.fungibleTokenAddress.usdt);
127
+ txBuilder.addFeePayerAddress(testData.feePayer.address);
128
+ const tx = (await txBuilder.build());
129
+ const signablePayload = tx.signablePayload;
130
+ should_1.default.equal(signablePayload.toString('hex'), '5efa3c4f02f83a0f4b2d69fc95c607cc02825cc4e7be536ef0992df050d9e67c011aed808916ab9b1b30b07abb53561afd46847285ce28651221d406173a3724490e00000000000000020000000000000000000000000000000000000000000000000000000000000001167072696d6172795f66756e6769626c655f73746f7265087472616e73666572010700000000000000000000000000000000000000000000000000000000000000010e66756e6769626c655f6173736574084d65746164617461000320d5d0d561493ea2b9410f67da804653ae44e793c2423707d4f11edb2e3819205020f7405c28a02cf5bab4ea4498240bb3579db45951794eb1c843bef0534c093ad9080100000000000000400d03000000000064000000000000008b037d67000000000200dbc87a1c816d9bcd06b683c37e80c7162e4d48da7812198b830e4d5d8e0629f2');
131
+ });
132
+ it('should build a unsigned tx and validate its toJson', async function () {
133
+ const transaction = new fungibleAssetTransfer_1.FungibleAssetTransfer(statics_1.coins.get('tapt'));
134
+ const txBuilder = factory.getFungibleAssetTransactionBuilder(transaction);
135
+ txBuilder.sender(testData.sender2.address);
136
+ txBuilder.recipients([testData.fungibleTokenRecipients[0]]);
137
+ txBuilder.gasData({
138
+ maxGasAmount: 200000,
139
+ gasUnitPrice: 100,
140
+ });
141
+ txBuilder.sequenceNumber(14);
142
+ txBuilder.expirationTime(1736246155);
143
+ txBuilder.assetId(testData.fungibleTokenAddress.usdt);
144
+ txBuilder.addFeePayerAddress(testData.feePayer.address);
145
+ const tx = (await txBuilder.build());
146
+ const toJson = tx.toJson();
147
+ should_1.default.equal(toJson.sender, testData.sender2.address);
148
+ should_1.default.deepEqual(toJson.recipients, [
149
+ {
150
+ address: testData.fungibleTokenRecipients[0].address,
151
+ amount: testData.fungibleTokenRecipients[0].amount,
152
+ },
153
+ ]);
154
+ should_1.default.deepEqual(toJson.recipient, {
155
+ address: testData.fungibleTokenRecipients[0].address,
156
+ amount: testData.fungibleTokenRecipients[0].amount,
157
+ });
158
+ should_1.default.equal(toJson.sequenceNumber, 14);
159
+ should_1.default.equal(tx.assetId, testData.fungibleTokenAddress.usdt);
160
+ should_1.default.equal(toJson.maxGasAmount, 200000);
161
+ should_1.default.equal(toJson.gasUnitPrice, 100);
162
+ should_1.default.equal(toJson.expirationTime, 1736246155);
163
+ should_1.default.equal(toJson.feePayer, testData.feePayer.address);
164
+ });
165
+ it('should build a signed tx and validate its toJson', async function () {
166
+ const txBuilder = factory.from(testData.FUNGIBLE_TOKEN_TRANSFER);
167
+ const tx = (await txBuilder.build());
168
+ const toJson = tx.toJson();
169
+ should_1.default.equal(toJson.id, '0x271da92f3dcd673a0bd28d26f8b49c1f0c6ead0f5be0fbab3e9412972e96d80b');
170
+ should_1.default.equal(toJson.sender, testData.sender2.address);
171
+ should_1.default.deepEqual(toJson.recipients, [
172
+ {
173
+ address: testData.fungibleTokenRecipients[0].address,
174
+ amount: testData.fungibleTokenRecipients[0].amount.toString(),
175
+ },
176
+ ]);
177
+ should_1.default.deepEqual(toJson.recipient, {
178
+ address: testData.fungibleTokenRecipients[0].address,
179
+ amount: testData.fungibleTokenRecipients[0].amount.toString(),
180
+ });
181
+ should_1.default.equal(tx.assetId, testData.fungibleTokenAddress.usdt);
182
+ should_1.default.equal(toJson.sequenceNumber, 167);
183
+ should_1.default.equal(toJson.maxGasAmount, 200000);
184
+ should_1.default.equal(toJson.gasUnitPrice, 100);
185
+ should_1.default.equal(toJson.expirationTime, 1737893604);
186
+ });
187
+ });
188
+ describe('Fail', () => {
189
+ it('should fail for invalid sender', async function () {
190
+ const transaction = new src_1.TransferTransaction(statics_1.coins.get('tapt'));
191
+ const builder = factory.getTransferBuilder(transaction);
192
+ (0, should_1.default)(() => builder.sender('randomString')).throwError('Invalid address randomString');
193
+ });
194
+ it('should fail for invalid recipient', async function () {
195
+ const builder = factory.getTransferBuilder();
196
+ (0, should_1.default)(() => builder.recipients([testData.invalidRecipients[0]])).throwError('Invalid address randomString');
197
+ (0, should_1.default)(() => builder.recipients([testData.invalidRecipients[1]])).throwError('Value cannot be less than zero');
198
+ (0, should_1.default)(() => builder.recipients([testData.invalidRecipients[2]])).throwError('Invalid amount format');
199
+ });
200
+ it('should fail for invalid gas amount', async function () {
201
+ const builder = factory.getTransferBuilder();
202
+ (0, should_1.default)(() => builder.gasData({ maxGasAmount: -1, gasUnitPrice: 100 })).throwError('Value cannot be less than zero');
203
+ (0, should_1.default)(() => builder.gasData({ maxGasAmount: 200000, gasUnitPrice: -1 })).throwError('Value cannot be less than zero');
204
+ });
205
+ it('should fail for invalid fungible token address', async function () {
206
+ const transaction = new fungibleAssetTransfer_1.FungibleAssetTransfer(statics_1.coins.get('tapt'));
207
+ const txBuilder = factory.getFungibleAssetTransactionBuilder(transaction);
208
+ (0, should_1.default)(() => txBuilder.assetId('randomString')).throwError('Invalid address randomString');
209
+ });
210
+ });
211
+ describe('should test for deprecated field recipient in building transaction, without usage of recipients', () => {
212
+ it('should build a token transfer', async function () {
213
+ const fungibleTokenTransfer = new fungibleAssetTransfer_1.FungibleAssetTransfer(statics_1.coins.get('tapt:usdt'));
214
+ const txBuilder = factory.getFungibleAssetTransactionBuilder(fungibleTokenTransfer);
215
+ txBuilder.sender(testData.sender2.address);
216
+ txBuilder.recipient(testData.fungibleTokenRecipients[0]);
217
+ txBuilder.gasData({
218
+ maxGasAmount: 200000,
219
+ gasUnitPrice: 100,
220
+ });
221
+ txBuilder.assetId(testData.fungibleTokenAddress.usdt);
222
+ txBuilder.sequenceNumber(14);
223
+ txBuilder.expirationTime(1736246155);
224
+ txBuilder.addFeePayerAddress(testData.feePayer.address);
225
+ const tx = (await txBuilder.build());
226
+ should_1.default.equal(tx.sender, testData.sender2.address);
227
+ should_1.default.equal(tx.recipient.address, testData.fungibleTokenRecipients[0].address);
228
+ should_1.default.equal(tx.recipient.amount, testData.fungibleTokenRecipients[0].amount);
229
+ should_1.default.equal(tx.assetId, testData.fungibleTokenAddress.usdt);
230
+ should_1.default.equal(tx.maxGasAmount, 200000);
231
+ should_1.default.equal(tx.gasUnitPrice, 100);
232
+ should_1.default.equal(tx.sequenceNumber, 14);
233
+ should_1.default.equal(tx.expirationTime, 1736246155);
234
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.SendToken);
235
+ tx.inputs.length.should.equal(1);
236
+ tx.inputs[0].should.deepEqual({
237
+ address: testData.sender2.address,
238
+ value: testData.fungibleTokenRecipients[0].amount,
239
+ coin: 'tapt:usdt',
240
+ });
241
+ tx.outputs.length.should.equal(1);
242
+ tx.outputs[0].should.deepEqual({
243
+ address: testData.fungibleTokenRecipients[0].address,
244
+ value: testData.fungibleTokenRecipients[0].amount,
245
+ coin: 'tapt:usdt',
246
+ });
247
+ const rawTx = tx.toBroadcastFormat();
248
+ should_1.default.equal(txBuilder.isValidRawTransaction(rawTx), true);
249
+ rawTx.should.equal('0x1aed808916ab9b1b30b07abb53561afd46847285ce28651221d406173a3724490e00000000000000020000000000000000000000000000000000000000000000000000000000000001167072696d6172795f66756e6769626c655f73746f7265087472616e73666572010700000000000000000000000000000000000000000000000000000000000000010e66756e6769626c655f6173736574084d65746164617461000320d5d0d561493ea2b9410f67da804653ae44e793c2423707d4f11edb2e3819205020f7405c28a02cf5bab4ea4498240bb3579db45951794eb1c843bef0534c093ad9080100000000000000400d03000000000064000000000000008b037d670000000002030020000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dbc87a1c816d9bcd06b683c37e80c7162e4d48da7812198b830e4d5d8e0629f2002000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000');
250
+ const toJson = tx.toJson();
251
+ should_1.default.equal(toJson.sender, testData.sender2.address);
252
+ should_1.default.deepEqual(toJson.recipient, {
253
+ address: testData.fungibleTokenRecipients[0].address,
254
+ amount: testData.fungibleTokenRecipients[0].amount,
255
+ });
256
+ should_1.default.equal(toJson.sequenceNumber, 14);
257
+ should_1.default.equal(tx.assetId, testData.fungibleTokenAddress.usdt);
258
+ should_1.default.equal(toJson.maxGasAmount, 200000);
259
+ should_1.default.equal(toJson.gasUnitPrice, 100);
260
+ should_1.default.equal(toJson.expirationTime, 1736246155);
261
+ should_1.default.equal(toJson.feePayer, testData.feePayer.address);
262
+ });
263
+ it('should build and send a signed tx', async function () {
264
+ const txBuilder = factory.from(testData.FUNGIBLE_TOKEN_TRANSFER);
265
+ const tx = (await txBuilder.build());
266
+ tx.inputs.length.should.equal(1);
267
+ tx.inputs[0].should.deepEqual({
268
+ address: testData.sender2.address,
269
+ value: testData.fungibleTokenRecipients[0].amount,
270
+ coin: 'tapt:usdt',
271
+ });
272
+ tx.outputs.length.should.equal(1);
273
+ tx.outputs[0].should.deepEqual({
274
+ address: testData.fungibleTokenRecipients[0].address,
275
+ value: testData.fungibleTokenRecipients[0].amount,
276
+ coin: 'tapt:usdt',
277
+ });
278
+ should_1.default.equal(tx.id, '0x271da92f3dcd673a0bd28d26f8b49c1f0c6ead0f5be0fbab3e9412972e96d80b');
279
+ should_1.default.equal(tx.maxGasAmount, 200000);
280
+ should_1.default.equal(tx.gasUnitPrice, 100);
281
+ should_1.default.equal(tx.sequenceNumber, 167);
282
+ should_1.default.equal(tx.expirationTime, 1737893604);
283
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.SendToken);
284
+ const rawTx = tx.toBroadcastFormat();
285
+ should_1.default.equal(txBuilder.isValidRawTransaction(rawTx), true);
286
+ should_1.default.equal(rawTx, testData.FUNGIBLE_TOKEN_TRANSFER);
287
+ const toJson = tx.toJson();
288
+ should_1.default.equal(toJson.id, '0x271da92f3dcd673a0bd28d26f8b49c1f0c6ead0f5be0fbab3e9412972e96d80b');
289
+ should_1.default.equal(toJson.sender, testData.sender2.address);
290
+ should_1.default.deepEqual(toJson.recipient, {
291
+ address: testData.fungibleTokenRecipients[0].address,
292
+ amount: testData.fungibleTokenRecipients[0].amount.toString(),
293
+ });
294
+ should_1.default.equal(tx.assetId, testData.fungibleTokenAddress.usdt);
295
+ should_1.default.equal(toJson.sequenceNumber, 167);
296
+ should_1.default.equal(toJson.maxGasAmount, 200000);
297
+ should_1.default.equal(toJson.gasUnitPrice, 100);
298
+ should_1.default.equal(toJson.expirationTime, 1737893604);
299
+ });
300
+ });
301
+ describe('Batch Transfer', () => {
302
+ it('should build a token transfer', async function () {
303
+ const fungibleTokenTransfer = new fungibleAssetTransfer_1.FungibleAssetTransfer(statics_1.coins.get('tapt:usdt'));
304
+ const txBuilder = factory.getFungibleAssetTransactionBuilder(fungibleTokenTransfer);
305
+ txBuilder.sender(testData.sender2.address);
306
+ txBuilder.recipients(testData.batchFungibleRecipients);
307
+ txBuilder.gasData({
308
+ maxGasAmount: 200000,
309
+ gasUnitPrice: 100,
310
+ });
311
+ txBuilder.assetId(testData.fungibleTokenAddress.usdt);
312
+ txBuilder.sequenceNumber(14);
313
+ txBuilder.expirationTime(1736246155);
314
+ txBuilder.addFeePayerAddress(testData.feePayer.address);
315
+ const tx = (await txBuilder.build());
316
+ should_1.default.equal(tx.sender, testData.sender2.address);
317
+ should_1.default.equal(tx.recipients[0].address, testData.batchFungibleRecipients[0].address);
318
+ should_1.default.equal(tx.recipients[1].address, testData.batchFungibleRecipients[1].address);
319
+ should_1.default.equal(tx.recipients[0].amount, testData.batchFungibleRecipients[0].amount);
320
+ should_1.default.equal(tx.recipients[1].amount, testData.batchFungibleRecipients[1].amount);
321
+ should_1.default.equal(tx.assetId, testData.fungibleTokenAddress.usdt);
322
+ should_1.default.equal(tx.maxGasAmount, 200000);
323
+ should_1.default.equal(tx.gasUnitPrice, 100);
324
+ should_1.default.equal(tx.sequenceNumber, 14);
325
+ should_1.default.equal(tx.expirationTime, 1736246155);
326
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.SendToken);
327
+ tx.inputs.length.should.equal(1);
328
+ tx.inputs[0].should.deepEqual({
329
+ address: testData.sender2.address,
330
+ value: (Number(testData.batchFungibleRecipients[0].amount) + Number(testData.batchFungibleRecipients[1].amount)).toString(),
331
+ coin: 'tapt:usdt',
332
+ });
333
+ tx.outputs.length.should.equal(2);
334
+ tx.outputs[0].should.deepEqual({
335
+ address: testData.batchFungibleRecipients[0].address,
336
+ value: testData.batchFungibleRecipients[0].amount,
337
+ coin: 'tapt:usdt',
338
+ });
339
+ tx.outputs[1].should.deepEqual({
340
+ address: testData.batchFungibleRecipients[1].address,
341
+ value: testData.batchFungibleRecipients[1].amount,
342
+ coin: 'tapt:usdt',
343
+ });
344
+ const rawTx = tx.toBroadcastFormat();
345
+ should_1.default.equal(txBuilder.isValidRawTransaction(rawTx), true);
346
+ rawTx.should.equal(testData.FUNGIBLE_BATCH_RAW_TX_HEX);
347
+ });
348
+ it('should succeed to validate a valid signablePayload', async function () {
349
+ const transaction = new fungibleAssetTransfer_1.FungibleAssetTransfer(statics_1.coins.get('tapt'));
350
+ const txBuilder = factory.getFungibleAssetTransactionBuilder(transaction);
351
+ txBuilder.sender(testData.sender2.address);
352
+ txBuilder.recipients(testData.batchFungibleRecipients);
353
+ txBuilder.gasData({
354
+ maxGasAmount: 200000,
355
+ gasUnitPrice: 100,
356
+ });
357
+ txBuilder.sequenceNumber(14);
358
+ txBuilder.expirationTime(1736246155);
359
+ txBuilder.assetId(testData.fungibleTokenAddress.usdt);
360
+ txBuilder.addFeePayerAddress(testData.feePayer.address);
361
+ const tx = (await txBuilder.build());
362
+ const signablePayload = tx.signablePayload;
363
+ should_1.default.equal(signablePayload.toString('hex'), testData.FUNGIBLE_BATCH_SIGNABLE_PAYLOAD);
364
+ });
365
+ it('should build a unsigned tx and validate its toJson', async function () {
366
+ const transaction = new fungibleAssetTransfer_1.FungibleAssetTransfer(statics_1.coins.get('tapt'));
367
+ const txBuilder = factory.getFungibleAssetTransactionBuilder(transaction);
368
+ txBuilder.sender(testData.sender2.address);
369
+ txBuilder.recipients(testData.batchFungibleRecipients);
370
+ txBuilder.gasData({
371
+ maxGasAmount: 200000,
372
+ gasUnitPrice: 100,
373
+ });
374
+ txBuilder.sequenceNumber(14);
375
+ txBuilder.expirationTime(1736246155);
376
+ txBuilder.assetId(testData.fungibleTokenAddress.usdt);
377
+ txBuilder.addFeePayerAddress(testData.feePayer.address);
378
+ const tx = (await txBuilder.build());
379
+ const toJson = tx.toJson();
380
+ should_1.default.equal(toJson.sender, testData.sender2.address);
381
+ should_1.default.deepEqual(toJson.recipients, [
382
+ {
383
+ address: testData.batchFungibleRecipients[0].address,
384
+ amount: testData.batchFungibleRecipients[0].amount,
385
+ },
386
+ {
387
+ address: testData.batchFungibleRecipients[1].address,
388
+ amount: testData.batchFungibleRecipients[1].amount,
389
+ },
390
+ ]);
391
+ should_1.default.deepEqual(toJson.recipient, {
392
+ address: testData.batchFungibleRecipients[0].address,
393
+ amount: testData.batchFungibleRecipients[0].amount,
394
+ });
395
+ should_1.default.equal(toJson.sequenceNumber, 14);
396
+ should_1.default.equal(tx.assetId, testData.fungibleTokenAddress.usdt);
397
+ should_1.default.equal(toJson.maxGasAmount, 200000);
398
+ should_1.default.equal(toJson.gasUnitPrice, 100);
399
+ should_1.default.equal(toJson.expirationTime, 1736246155);
400
+ should_1.default.equal(toJson.feePayer, testData.feePayer.address);
401
+ });
402
+ it('should build a signed tx and validate its toJson', async function () {
403
+ const txBuilder = factory.from(testData.FUNGIBLE_BATCH_TRANSFER);
404
+ const tx = (await txBuilder.build());
405
+ should_1.default.equal(tx.inputs[0].address, '0xc8f02d25aa698b3e9fbd8a08e8da4c8ee261832a25a4cde8731b5ec356537d09');
406
+ should_1.default.equal(tx.inputs[0].value, '2');
407
+ should_1.default.equal(tx.outputs[0].address, '0xdd52c0b72a73696b867d6571a308c413e43bff8f44956a5991abc4d50db0b849');
408
+ should_1.default.equal(tx.outputs[0].value, '1');
409
+ should_1.default.equal(tx.outputs[1].address, '0x2a81760d52db9a96df2609860218214b6d1012e77e84a3fed5145a9a65bf6932');
410
+ should_1.default.equal(tx.outputs[1].value, '1');
411
+ should_1.default.equal(tx.maxGasAmount, 200000);
412
+ should_1.default.equal(tx.gasUnitPrice, 100);
413
+ should_1.default.equal(tx.gasUsed, 0);
414
+ should_1.default.equal(tx.expirationTime, 1869289760000);
415
+ should_1.default.equal(tx.sequenceNumber, 81);
416
+ should_1.default.equal(tx.sender, '0xc8f02d25aa698b3e9fbd8a08e8da4c8ee261832a25a4cde8731b5ec356537d09');
417
+ should_1.default.equal(tx.recipients[0].address, '0xdd52c0b72a73696b867d6571a308c413e43bff8f44956a5991abc4d50db0b849');
418
+ should_1.default.equal(tx.recipients[0].amount, '1');
419
+ should_1.default.equal(tx.recipients[1].address, '0x2a81760d52db9a96df2609860218214b6d1012e77e84a3fed5145a9a65bf6932');
420
+ should_1.default.equal(tx.recipients[1].amount, '1');
421
+ should_1.default.equal(tx.feePayerAddress, '0xdbc87a1c816d9bcd06b683c37e80c7162e4d48da7812198b830e4d5d8e0629f2');
422
+ const toJson = tx.toJson();
423
+ should_1.default.equal(toJson.id, '0xf781e531a20d9b1b80eab6402a44dfca81c7a196accf350c974d627ac2e52f9a');
424
+ should_1.default.equal(toJson.sender, '0xc8f02d25aa698b3e9fbd8a08e8da4c8ee261832a25a4cde8731b5ec356537d09');
425
+ should_1.default.deepEqual(toJson.recipients, [
426
+ {
427
+ address: '0xdd52c0b72a73696b867d6571a308c413e43bff8f44956a5991abc4d50db0b849',
428
+ amount: '1',
429
+ },
430
+ {
431
+ address: '0x2a81760d52db9a96df2609860218214b6d1012e77e84a3fed5145a9a65bf6932',
432
+ amount: '1',
433
+ },
434
+ ]);
435
+ should_1.default.deepEqual(toJson.recipient, {
436
+ address: '0xdd52c0b72a73696b867d6571a308c413e43bff8f44956a5991abc4d50db0b849',
437
+ amount: '1',
438
+ });
439
+ should_1.default.equal(toJson.sequenceNumber, 81);
440
+ should_1.default.equal(toJson.maxGasAmount, 200000);
441
+ should_1.default.equal(toJson.gasUnitPrice, 100);
442
+ should_1.default.equal(toJson.gasUsed, 0);
443
+ should_1.default.equal(toJson.expirationTime, 1869289760000);
444
+ should_1.default.equal(toJson.feePayer, '0xdbc87a1c816d9bcd06b683c37e80c7162e4d48da7812198b830e4d5d8e0629f2');
445
+ should_1.default.equal(toJson.assetId, '0xd5d0d561493ea2b9410f67da804653ae44e793c2423707d4f11edb2e38192050');
446
+ });
447
+ });
448
+ });
449
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuZ2libGVBc3NldFRyYW5zZmVyQnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvdW5pdC90cmFuc2FjdGlvbkJ1aWxkZXIvZnVuZ2libGVBc3NldFRyYW5zZmVyQnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDREQUF5RDtBQUN6RCxpREFBNEM7QUFDNUMsc0NBQW1EO0FBQ25ELDhEQUFnRDtBQUNoRCxtREFBdUQ7QUFDdkQsb0RBQTRCO0FBQzVCLDhGQUEyRjtBQUUzRixRQUFRLENBQUMsNEJBQTRCLEVBQUUsR0FBRyxFQUFFO0lBQzFDLE1BQU0sT0FBTyxHQUFHLElBQUEscUNBQWlCLEVBQUMsV0FBVyxDQUFDLENBQUM7SUFFL0MsUUFBUSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUU7UUFDdkIsRUFBRSxDQUFDLCtCQUErQixFQUFFLEtBQUs7WUFDdkMsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLDZDQUFxQixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUNoRixNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsa0NBQWtDLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUNwRixTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDM0MsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUQsU0FBUyxDQUFDLE9BQU8sQ0FBQztnQkFDaEIsWUFBWSxFQUFFLE1BQU07Z0JBQ3BCLFlBQVksRUFBRSxHQUFHO2FBQ2xCLENBQUMsQ0FBQztZQUNILFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RE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Z0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxhQUFhLENBQUMsQ0FBQztZQUNuRCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLG9FQUFvRSxDQUFDLENBQUM7WUFDcEcsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxvRUFBb0UsQ0FBQyxDQUFDO1FBQ3JHLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldEJ1aWxkZXJGYWN0b3J5IH0gZnJvbSAnLi4vZ2V0QnVpbGRlckZhY3RvcnknO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IFRyYW5zZmVyVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi8uLi9zcmMnO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vLi4vcmVzb3VyY2VzL2FwdCc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgeyBGdW5naWJsZUFzc2V0VHJhbnNmZXIgfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uL2Z1bmdpYmxlQXNzZXRUcmFuc2Zlcic7XG5cbmRlc2NyaWJlKCdBcHQgVG9rZW4gVHJhbnNmZXIgQnVpbGRlcicsICgpID0+IHtcbiAgY29uc3QgZmFjdG9yeSA9IGdldEJ1aWxkZXJGYWN0b3J5KCd0YXB0OnVzZHQnKTtcblxuICBkZXNjcmliZSgnU3VjY2VlZCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgdG9rZW4gdHJhbnNmZXInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBmdW5naWJsZVRva2VuVHJhbnNmZXIgPSBuZXcgRnVuZ2libGVBc3NldFRyYW5zZmVyKGNvaW5zLmdldCgndGFwdDp1c2R0JykpO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRGdW5naWJsZUFzc2V0VHJhbnNhY3Rpb25CdWlsZGVyKGZ1bmdpYmxlVG9rZW5UcmFuc2Zlcik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlcjIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIucmVjaXBpZW50cyhbdGVzdERhdGEuZnVuZ2libGVUb2tlblJlY2lwaWVudHNbMF1dKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHtcbiAgICAgICAgbWF4R2FzQW1vdW50OiAyMDAwMDAsXG4gICAgICAgIGdhc1VuaXRQcmljZTogMTAwLFxuICAgICAgfSk7XG4gICAgICB0eEJ1aWxkZXIuYXNzZXRJZCh0ZXN0RGF0YS5mdW5naWJsZVRva2VuQWRkcmVzcy51c2R0KTtcbiAgICAgIHR4QnVpbGRlci5zZXF1ZW5jZU51bWJlcigxNCk7XG4gICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvblRpbWUoMTczNjI0NjE1NSk7XG4gICAgICB0eEJ1aWxkZXIuYWRkRmVlUGF5ZXJBZGRyZXNzKHRlc3REYXRhLmZlZVBheWVyLmFkZHJlc3MpO1xuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIEZ1bmdpYmxlQXNzZXRUcmFuc2ZlcjtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5zZW5kZXIsIHRlc3REYXRhLnNlbmRlcjIuYWRkcmVzcyk7XG4gICAgICBzaG91bGQuZXF1YWwodHgucmVjaXBpZW50c1swXS5hZGRyZXNzLCB0ZXN0RGF0YS5mdW5naWJsZVRva2VuUmVjaXBpZW50c1swXS5hZGRyZXNzKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5yZWNpcGllbnQuYWRkcmVzcywgdGVzdERhdGEuZnVuZ2libGVUb2tlblJlY2lwaWVudHNbMF0uYWRkcmVzcyk7XG4gICAgICBzaG91bGQuZXF1YWwodHgucmVjaXBpZW50c1swXS5hbW91bnQsIHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5SZWNpcGllbnRzWzBdLmFtb3VudCk7XG4gICAgICBzaG91bGQuZXF1YWwodHgucmVjaXBpZW50LmFtb3VudCwgdGVzdERhdGEuZnVuZ2libGVUb2tlblJlY2lwaWVudHNbMF0uYW1vdW50KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5hc3NldElkLCB0ZXN0RGF0YS5mdW5naWJsZVRva2VuQWRkcmVzcy51c2R0KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5tYXhHYXNBbW91bnQsIDIwMDAwMCk7XG4gICAgICBzaG91bGQuZXF1YWwodHguZ2FzVW5pdFByaWNlLCAxMDApO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnNlcXVlbmNlTnVtYmVyLCAxNCk7XG4gICAgICBzaG91bGQuZXF1YWwodHguZXhwaXJhdGlvblRpbWUsIDE3MzYyNDYxNTUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kVG9rZW4pO1xuICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5pbnB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnNlbmRlcjIuYWRkcmVzcyxcbiAgICAgICAgdmFsdWU6IHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5SZWNpcGllbnRzWzBdLmFtb3VudCxcbiAgICAgICAgY29pbjogJ3RhcHQ6dXNkdCcsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4Lm91dHB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5SZWNpcGllbnRzWzBdLmFkZHJlc3MsXG4gICAgICAgIHZhbHVlOiB0ZXN0RGF0YS5mdW5naWJsZVRva2VuUmVjaXBpZW50c1swXS5hbW91bnQsXG4gICAgICAgIGNvaW46ICd0YXB0OnVzZHQnLFxuICAgICAgfSk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwodHhCdWlsZGVyLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgICAgcmF3VHguc2hvdWxkLmVxdWFsKFxuICAgICAgICAnMHgxYWVkODA4OTE2YWI5YjFiMzBiMDdhYmI1MzU2MWFmZDQ2ODQ3Mjg1Y2UyODY1MTIyMWQ0MDYxNzNhMzcyNDQ5MGUwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTE2NzA3MjY5NmQ2MTcyNzk1ZjY2NzU2ZTY3Njk2MjZjNjU1ZjczNzQ2ZjcyNjUwODc0NzI2MTZlNzM2NjY1NzIwMTA3MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTBlNjY3NTZlNjc2OTYyNmM2NTVmNjE3MzczNjU3NDA4NGQ2NTc0NjE2NDYxNzQ2MTAwMDMyMGQ1ZDBkNTYxNDkzZWEyYjk0MTBmNjdkYTgwNDY1M2FlNDRlNzkzYzI0MjM3MDdkNGYxMWVkYjJlMzgxOTIwNTAyMGY3NDA1YzI4YTAyY2Y1YmFiNGVhNDQ5ODI0MGJiMzU3OWRiNDU5NTE3OTRlYjFjODQzYmVmMDUzNGMwOTNhZDkwODAxMDAwMDAwMDAwMDAwMDA0MDBkMDMwMDAwMDAwMDAwNjQwMDAwMDAwMDAwMDAwMDhiMDM3ZDY3MDAwMDAwMDAwMjAzMDAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGRiYzg3YTFjODE2ZDliY2QwNmI2ODNjMzdlODBjNzE2MmU0ZDQ4ZGE3ODEyMTk4YjgzMGU0ZDVkOGUwNjI5ZjIwMDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhbmQgc2VuZCBhIHNpZ25lZCB0eCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0ZXN0RGF0YS5GVU5HSUJMRV9UT0tFTl9UUkFOU0ZFUik7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgRnVuZ2libGVBc3NldFRyYW5zZmVyO1xuICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5pbnB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnNlbmRlcjIuYWRkcmVzcyxcbiAgICAgICAgdmFsdWU6IHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5SZWNpcGllbnRzWzBdLmFtb3VudCxcbiAgICAgICAgY29pbjogJ3RhcHQ6dXNkdCcsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4Lm91dHB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5SZWNpcGllbnRzWzBdLmFkZHJlc3MsXG4gICAgICAgIHZhbHVlOiB0ZXN0RGF0YS5mdW5naWJsZVRva2VuUmVjaXBpZW50c1swXS5hbW91bnQsXG4gICAgICAgIGNvaW46ICd0YXB0OnVzZHQnLFxuICAgICAgfSk7XG4gICAgICBzaG91bGQuZXF1YWwodHguaWQsICcweDI3MWRhOTJmM2RjZDY3M2EwYmQyOGQyNmY4YjQ5YzFmMGM2ZWFkMGY1YmUwZmJhYjNlOTQxMjk3MmU5NmQ4MGInKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5tYXhHYXNBbW91bnQsIDIwMDAwMCk7XG4gICAgICBzaG91bGQuZXF1YWwodHguZ2FzVW5pdFByaWNlLCAxMDApO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnNlcXVlbmNlTnVtYmVyLCAxNjcpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmV4cGlyYXRpb25UaW1lLCAxNzM3ODkzNjA0KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZFRva2VuKTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEJ1aWxkZXIuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLkZVTkdJQkxFX1RPS0VOX1RSQU5TRkVSKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc3VjY2VlZCB0byB2YWxpZGF0ZSBhIHZhbGlkIHNpZ25hYmxlUGF5bG9hZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IEZ1bmdpYmxlQXNzZXRUcmFuc2Zlcihjb2lucy5nZXQoJ3RhcHQnKSk7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEZ1bmdpYmxlQXNzZXRUcmFuc2FjdGlvbkJ1aWxkZXIodHJhbnNhY3Rpb24pO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnJlY2lwaWVudHMoW3Rlc3REYXRhLmZ1bmdpYmxlVG9rZW5SZWNpcGllbnRzWzBdXSk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh7XG4gICAgICAgIG1heEdhc0Ftb3VudDogMjAwMDAwLFxuICAgICAgICBnYXNVbml0UHJpY2U6IDEwMCxcbiAgICAgIH0pO1xuICAgICAgdHhCdWlsZGVyLnNlcXVlbmNlTnVtYmVyKDE0KTtcbiAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uVGltZSgxNzM2MjQ2MTU1KTtcbiAgICAgIHR4QnVpbGRlci5hc3NldElkKHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5BZGRyZXNzLnVzZHQpO1xuICAgICAgdHhCdWlsZGVyLmFkZEZlZVBheWVyQWRkcmVzcyh0ZXN0RGF0YS5mZWVQYXllci5hZGRyZXNzKTtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBGdW5naWJsZUFzc2V0VHJhbnNmZXI7XG4gICAgICBjb25zdCBzaWduYWJsZVBheWxvYWQgPSB0eC5zaWduYWJsZVBheWxvYWQ7XG4gICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgIHNpZ25hYmxlUGF5bG9hZC50b1N0cmluZygnaGV4JyksXG4gICAgICAgICc1ZWZhM2M0ZjAyZjgzYTBmNGIyZDY5ZmM5NWM2MDdjYzAyODI1Y2M0ZTdiZTUzNmVmMDk5MmRmMDUwZDllNjdjMDExYWVkODA4OTE2YWI5YjFiMzBiMDdhYmI1MzU2MWFmZDQ2ODQ3Mjg1Y2UyODY1MTIyMWQ0MDYxNzNhMzcyNDQ5MGUwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTE2NzA3MjY5NmQ2MTcyNzk1ZjY2NzU2ZTY3Njk2MjZjNjU1ZjczNzQ2ZjcyNjUwODc0NzI2MTZlNzM2NjY1NzIwMTA3MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTBlNjY3NTZlNjc2OTYyNmM2NTVmNjE3MzczNjU3NDA4NGQ2NTc0NjE2NDYxNzQ2MTAwMDMyMGQ1ZDBkNTYxNDkzZWEyYjk0MTBmNjdkYTgwNDY1M2FlNDRlNzkzYzI0MjM3MDdkNGYxMWVkYjJlMzgxOTIwNTAyMGY3NDA1YzI4YTAyY2Y1YmFiNGVhNDQ5ODI0MGJiMzU3OWRiNDU5NTE3OTRlYjFjODQzYmVmMDUzNGMwOTNhZDkwODAxMDAwMDAwMDAwMDAwMDA0MDBkMDMwMDAwMDAwMDAwNjQwMDAwMDAwMDAwMDAwMDhiMDM3ZDY3MDAwMDAwMDAwMjAwZGJjODdhMWM4MTZkOWJjZDA2YjY4M2MzN2U4MGM3MTYyZTRkNDhkYTc4MTIxOThiODMwZTRkNWQ4ZTA2MjlmMidcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgdW5zaWduZWQgdHggYW5kIHZhbGlkYXRlIGl0cyB0b0pzb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBGdW5naWJsZUFzc2V0VHJhbnNmZXIoY29pbnMuZ2V0KCd0YXB0JykpO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRGdW5naWJsZUFzc2V0VHJhbnNhY3Rpb25CdWlsZGVyKHRyYW5zYWN0aW9uKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKFt0ZXN0RGF0YS5mdW5naWJsZVRva2VuUmVjaXBpZW50c1swXV0pO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEoe1xuICAgICAgICBtYXhHYXNBbW91bnQ6IDIwMDAwMCxcbiAgICAgICAgZ2FzVW5pdFByaWNlOiAxMDAsXG4gICAgICB9KTtcbiAgICAgIHR4QnVpbGRlci5zZXF1ZW5jZU51bWJlcigxNCk7XG4gICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvblRpbWUoMTczNjI0NjE1NSk7XG4gICAgICB0eEJ1aWxkZXIuYXNzZXRJZCh0ZXN0RGF0YS5mdW5naWJsZVRva2VuQWRkcmVzcy51c2R0KTtcbiAgICAgIHR4QnVpbGRlci5hZGRGZWVQYXllckFkZHJlc3ModGVzdERhdGEuZmVlUGF5ZXIuYWRkcmVzcyk7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgRnVuZ2libGVBc3NldFRyYW5zZmVyO1xuICAgICAgY29uc3QgdG9Kc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLnNlbmRlciwgdGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodG9Kc29uLnJlY2lwaWVudHMsIFtcbiAgICAgICAge1xuICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5SZWNpcGllbnRzWzBdLmFkZHJlc3MsXG4gICAgICAgICAgYW1vdW50OiB0ZXN0RGF0YS5mdW5naWJsZVRva2VuUmVjaXBpZW50c1swXS5hbW91bnQsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodG9Kc29uLnJlY2lwaWVudCwge1xuICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5mdW5naWJsZVRva2VuUmVjaXBpZW50c1swXS5hZGRyZXNzLFxuICAgICAgICBhbW91bnQ6IHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5SZWNpcGllbnRzWzBdLmFtb3VudCxcbiAgICAgIH0pO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5zZXF1ZW5jZU51bWJlciwgMTQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmFzc2V0SWQsIHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5BZGRyZXNzLnVzZHQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5tYXhHYXNBbW91bnQsIDIwMDAwMCk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLmdhc1VuaXRQcmljZSwgMTAwKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24uZXhwaXJhdGlvblRpbWUsIDE3MzYyNDYxNTUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5mZWVQYXllciwgdGVzdERhdGEuZmVlUGF5ZXIuYWRkcmVzcyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgc2lnbmVkIHR4IGFuZCB2YWxpZGF0ZSBpdHMgdG9Kc29uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHRlc3REYXRhLkZVTkdJQkxFX1RPS0VOX1RSQU5TRkVSKTtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBGdW5naWJsZUFzc2V0VHJhbnNmZXI7XG4gICAgICBjb25zdCB0b0pzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24uaWQsICcweDI3MWRhOTJmM2RjZDY3M2EwYmQyOGQyNmY4YjQ5YzFmMGM2ZWFkMGY1YmUwZmJhYjNlOTQxMjk3MmU5NmQ4MGInKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24uc2VuZGVyLCB0ZXN0RGF0YS5zZW5kZXIyLmFkZHJlc3MpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0b0pzb24ucmVjaXBpZW50cywgW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuZnVuZ2libGVUb2tlblJlY2lwaWVudHNbMF0uYWRkcmVzcyxcbiAgICAgICAgICBhbW91bnQ6IHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5SZWNpcGllbnRzWzBdLmFtb3VudC50b1N0cmluZygpLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHRvSnNvbi5yZWNpcGllbnQsIHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEuZnVuZ2libGVUb2tlblJlY2lwaWVudHNbMF0uYWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiB0ZXN0RGF0YS5mdW5naWJsZVRva2VuUmVjaXBpZW50c1swXS5hbW91bnQudG9TdHJpbmcoKSxcbiAgICAgIH0pO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmFzc2V0SWQsIHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5BZGRyZXNzLnVzZHQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5zZXF1ZW5jZU51bWJlciwgMTY3KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24ubWF4R2FzQW1vdW50LCAyMDAwMDApO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5nYXNVbml0UHJpY2UsIDEwMCk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLmV4cGlyYXRpb25UaW1lLCAxNzM3ODkzNjA0KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0ZhaWwnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBmYWlsIGZvciBpbnZhbGlkIHNlbmRlcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zZmVyVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0YXB0JykpO1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKHRyYW5zYWN0aW9uKTtcbiAgICAgIHNob3VsZCgoKSA9PiBidWlsZGVyLnNlbmRlcigncmFuZG9tU3RyaW5nJykpLnRocm93RXJyb3IoJ0ludmFsaWQgYWRkcmVzcyByYW5kb21TdHJpbmcnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBmb3IgaW52YWxpZCByZWNpcGllbnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHNob3VsZCgoKSA9PiBidWlsZGVyLnJlY2lwaWVudHMoW3Rlc3REYXRhLmludmFsaWRSZWNpcGllbnRzWzBdXSkpLnRocm93RXJyb3IoJ0ludmFsaWQgYWRkcmVzcyByYW5kb21TdHJpbmcnKTtcbiAgICAgIHNob3VsZCgoKSA9PiBidWlsZGVyLnJlY2lwaWVudHMoW3Rlc3REYXRhLmludmFsaWRSZWNpcGllbnRzWzFdXSkpLnRocm93RXJyb3IoJ1ZhbHVlIGNhbm5vdCBiZSBsZXNzIHRoYW4gemVybycpO1xuICAgICAgc2hvdWxkKCgpID0+IGJ1aWxkZXIucmVjaXBpZW50cyhbdGVzdERhdGEuaW52YWxpZFJlY2lwaWVudHNbMl1dKSkudGhyb3dFcnJvcignSW52YWxpZCBhbW91bnQgZm9ybWF0Jyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBmYWlsIGZvciBpbnZhbGlkIGdhcyBhbW91bnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHNob3VsZCgoKSA9PiBidWlsZGVyLmdhc0RhdGEoeyBtYXhHYXNBbW91bnQ6IC0xLCBnYXNVbml0UHJpY2U6IDEwMCB9KSkudGhyb3dFcnJvcihcbiAgICAgICAgJ1ZhbHVlIGNhbm5vdCBiZSBsZXNzIHRoYW4gemVybydcbiAgICAgICk7XG4gICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci5nYXNEYXRhKHsgbWF4R2FzQW1vdW50OiAyMDAwMDAsIGdhc1VuaXRQcmljZTogLTEgfSkpLnRocm93RXJyb3IoXG4gICAgICAgICdWYWx1ZSBjYW5ub3QgYmUgbGVzcyB0aGFuIHplcm8nXG4gICAgICApO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgZmFpbCBmb3IgaW52YWxpZCBmdW5naWJsZSB0b2tlbiBhZGRyZXNzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgRnVuZ2libGVBc3NldFRyYW5zZmVyKGNvaW5zLmdldCgndGFwdCcpKTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0RnVuZ2libGVBc3NldFRyYW5zYWN0aW9uQnVpbGRlcih0cmFuc2FjdGlvbik7XG4gICAgICBzaG91bGQoKCkgPT4gdHhCdWlsZGVyLmFzc2V0SWQoJ3JhbmRvbVN0cmluZycpKS50aHJvd0Vycm9yKCdJbnZhbGlkIGFkZHJlc3MgcmFuZG9tU3RyaW5nJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaG91bGQgdGVzdCBmb3IgZGVwcmVjYXRlZCBmaWVsZCByZWNpcGllbnQgaW4gYnVpbGRpbmcgdHJhbnNhY3Rpb24sIHdpdGhvdXQgdXNhZ2Ugb2YgcmVjaXBpZW50cycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgdG9rZW4gdHJhbnNmZXInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBmdW5naWJsZVRva2VuVHJhbnNmZXIgPSBuZXcgRnVuZ2libGVBc3NldFRyYW5zZmVyKGNvaW5zLmdldCgndGFwdDp1c2R0JykpO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRGdW5naWJsZUFzc2V0VHJhbnNhY3Rpb25CdWlsZGVyKGZ1bmdpYmxlVG9rZW5UcmFuc2Zlcik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlcjIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIucmVjaXBpZW50KHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5SZWNpcGllbnRzWzBdKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHtcbiAgICAgICAgbWF4R2FzQW1vdW50OiAyMDAwMDAsXG4gICAgICAgIGdhc1VuaXRQcmljZTogMTAwLFxuICAgICAgfSk7XG4gICAgICB0eEJ1aWxkZXIuYXNzZXRJZCh0ZXN0RGF0YS5mdW5naWJsZVRva2VuQWRkcmVzcy51c2R0KTtcbiAgICAgIHR4QnVpbGRlci5zZXF1ZW5jZU51bWJlcigxNCk7XG4gICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvblRpbWUoMTczNjI0NjE1NSk7XG4gICAgICB0eEJ1aWxkZXIuYWRkRmVlUGF5ZXJBZGRyZXNzKHRlc3REYXRhLmZlZVBheWVyLmFkZHJlc3MpO1xuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIEZ1bmdpYmxlQXNzZXRUcmFuc2ZlcjtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5zZW5kZXIsIHRlc3REYXRhLnNlbmRlcjIuYWRkcmVzcyk7XG4gICAgICBzaG91bGQuZXF1YWwodHgucmVjaXBpZW50LmFkZHJlc3MsIHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5SZWNpcGllbnRzWzBdLmFkZHJlc3MpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnJlY2lwaWVudC5hbW91bnQsIHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5SZWNpcGllbnRzWzBdLmFtb3VudCk7XG4gICAgICBzaG91bGQuZXF1YWwodHguYXNzZXRJZCwgdGVzdERhdGEuZnVuZ2libGVUb2tlbkFkZHJlc3MudXNkdCk7XG4gICAgICBzaG91bGQuZXF1YWwodHgubWF4R2FzQW1vdW50LCAyMDAwMDApO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4Lmdhc1VuaXRQcmljZSwgMTAwKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5zZXF1ZW5jZU51bWJlciwgMTQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmV4cGlyYXRpb25UaW1lLCAxNzM2MjQ2MTU1KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZFRva2VuKTtcbiAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5zZW5kZXIyLmFkZHJlc3MsXG4gICAgICAgIHZhbHVlOiB0ZXN0RGF0YS5mdW5naWJsZVRva2VuUmVjaXBpZW50c1swXS5hbW91bnQsXG4gICAgICAgIGNvaW46ICd0YXB0OnVzZHQnLFxuICAgICAgfSk7XG4gICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5vdXRwdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5mdW5naWJsZVRva2VuUmVjaXBpZW50c1swXS5hZGRyZXNzLFxuICAgICAgICB2YWx1ZTogdGVzdERhdGEuZnVuZ2libGVUb2tlblJlY2lwaWVudHNbMF0uYW1vdW50LFxuICAgICAgICBjb2luOiAndGFwdDp1c2R0JyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4QnVpbGRlci5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICAgIHJhd1R4LnNob3VsZC5lcXVhbChcbiAgICAgICAgJzB4MWFlZDgwODkxNmFiOWIxYjMwYjA3YWJiNTM1NjFhZmQ0Njg0NzI4NWNlMjg2NTEyMjFkNDA2MTczYTM3MjQ0OTBlMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExNjcwNzI2OTZkNjE3Mjc5NWY2Njc1NmU2NzY5NjI2YzY1NWY3Mzc0NmY3MjY1MDg3NDcyNjE2ZTczNjY2NTcyMDEwNzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwZTY2NzU2ZTY3Njk2MjZjNjU1ZjYxNzM3MzY1NzQwODRkNjU3NDYxNjQ2MTc0NjEwMDAzMjBkNWQwZDU2MTQ5M2VhMmI5NDEwZjY3ZGE4MDQ2NTNhZTQ0ZTc5M2MyNDIzNzA3ZDRmMTFlZGIyZTM4MTkyMDUwMjBmNzQwNWMyOGEwMmNmNWJhYjRlYTQ0OTgyNDBiYjM1NzlkYjQ1OTUxNzk0ZWIxYzg0M2JlZjA1MzRjMDkzYWQ5MDgwMTAwMDAwMDAwMDAwMDAwNDAwZDAzMDAwMDAwMDAwMDY0MDAwMDAwMDAwMDAwMDA4YjAzN2Q2NzAwMDAwMDAwMDIwMzAwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBkYmM4N2ExYzgxNmQ5YmNkMDZiNjgzYzM3ZTgwYzcxNjJlNGQ0OGRhNzgxMjE5OGI4MzBlNGQ1ZDhlMDYyOWYyMDAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJ1xuICAgICAgKTtcbiAgICAgIGNvbnN0IHRvSnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5zZW5kZXIsIHRlc3REYXRhLnNlbmRlcjIuYWRkcmVzcyk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHRvSnNvbi5yZWNpcGllbnQsIHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEuZnVuZ2libGVUb2tlblJlY2lwaWVudHNbMF0uYWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiB0ZXN0RGF0YS5mdW5naWJsZVRva2VuUmVjaXBpZW50c1swXS5hbW91bnQsXG4gICAgICB9KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24uc2VxdWVuY2VOdW1iZXIsIDE0KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5hc3NldElkLCB0ZXN0RGF0YS5mdW5naWJsZVRva2VuQWRkcmVzcy51c2R0KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24ubWF4R2FzQW1vdW50LCAyMDAwMDApO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5nYXNVbml0UHJpY2UsIDEwMCk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLmV4cGlyYXRpb25UaW1lLCAxNzM2MjQ2MTU1KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24uZmVlUGF5ZXIsIHRlc3REYXRhLmZlZVBheWVyLmFkZHJlc3MpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhbmQgc2VuZCBhIHNpZ25lZCB0eCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0ZXN0RGF0YS5GVU5HSUJMRV9UT0tFTl9UUkFOU0ZFUik7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgRnVuZ2libGVBc3NldFRyYW5zZmVyO1xuICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5pbnB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnNlbmRlcjIuYWRkcmVzcyxcbiAgICAgICAgdmFsdWU6IHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5SZWNpcGllbnRzWzBdLmFtb3VudCxcbiAgICAgICAgY29pbjogJ3RhcHQ6dXNkdCcsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4Lm91dHB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5SZWNpcGllbnRzWzBdLmFkZHJlc3MsXG4gICAgICAgIHZhbHVlOiB0ZXN0RGF0YS5mdW5naWJsZVRva2VuUmVjaXBpZW50c1swXS5hbW91bnQsXG4gICAgICAgIGNvaW46ICd0YXB0OnVzZHQnLFxuICAgICAgfSk7XG4gICAgICBzaG91bGQuZXF1YWwodHguaWQsICcweDI3MWRhOTJmM2RjZDY3M2EwYmQyOGQyNmY4YjQ5YzFmMGM2ZWFkMGY1YmUwZmJhYjNlOTQxMjk3MmU5NmQ4MGInKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5tYXhHYXNBbW91bnQsIDIwMDAwMCk7XG4gICAgICBzaG91bGQuZXF1YWwodHguZ2FzVW5pdFByaWNlLCAxMDApO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnNlcXVlbmNlTnVtYmVyLCAxNjcpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmV4cGlyYXRpb25UaW1lLCAxNzM3ODkzNjA0KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZFRva2VuKTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEJ1aWxkZXIuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLkZVTkdJQkxFX1RPS0VOX1RSQU5TRkVSKTtcbiAgICAgIGNvbnN0IHRvSnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5pZCwgJzB4MjcxZGE5MmYzZGNkNjczYTBiZDI4ZDI2ZjhiNDljMWYwYzZlYWQwZjViZTBmYmFiM2U5NDEyOTcyZTk2ZDgwYicpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5zZW5kZXIsIHRlc3REYXRhLnNlbmRlcjIuYWRkcmVzcyk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHRvSnNvbi5yZWNpcGllbnQsIHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEuZnVuZ2libGVUb2tlblJlY2lwaWVudHNbMF0uYWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiB0ZXN0RGF0YS5mdW5naWJsZVRva2VuUmVjaXBpZW50c1swXS5hbW91bnQudG9TdHJpbmcoKSxcbiAgICAgIH0pO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmFzc2V0SWQsIHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5BZGRyZXNzLnVzZHQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5zZXF1ZW5jZU51bWJlciwgMTY3KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24ubWF4R2FzQW1vdW50LCAyMDAwMDApO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5nYXNVbml0UHJpY2UsIDEwMCk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLmV4cGlyYXRpb25UaW1lLCAxNzM3ODkzNjA0KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0JhdGNoIFRyYW5zZmVyJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYnVpbGQgYSB0b2tlbiB0cmFuc2ZlcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGZ1bmdpYmxlVG9rZW5UcmFuc2ZlciA9IG5ldyBGdW5naWJsZUFzc2V0VHJhbnNmZXIoY29pbnMuZ2V0KCd0YXB0OnVzZHQnKSk7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEZ1bmdpYmxlQXNzZXRUcmFuc2FjdGlvbkJ1aWxkZXIoZnVuZ2libGVUb2tlblRyYW5zZmVyKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLmJhdGNoRnVuZ2libGVSZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHtcbiAgICAgICAgbWF4R2FzQW1vdW50OiAyMDAwMDAsXG4gICAgICAgIGdhc1VuaXRQcmljZTogMTAwLFxuICAgICAgfSk7XG4gICAgICB0eEJ1aWxkZXIuYXNzZXRJZCh0ZXN0RGF0YS5mdW5naWJsZVRva2VuQWRkcmVzcy51c2R0KTtcbiAgICAgIHR4QnVpbGRlci5zZXF1ZW5jZU51bWJlcigxNCk7XG4gICAgICB0eEJ1aWxkZXIuZXhwaXJhdGlvblRpbWUoMTczNjI0NjE1NSk7XG4gICAgICB0eEJ1aWxkZXIuYWRkRmVlUGF5ZXJBZGRyZXNzKHRlc3REYXRhLmZlZVBheWVyLmFkZHJlc3MpO1xuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIEZ1bmdpYmxlQXNzZXRUcmFuc2ZlcjtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5zZW5kZXIsIHRlc3REYXRhLnNlbmRlcjIuYWRkcmVzcyk7XG4gICAgICBzaG91bGQuZXF1YWwodHgucmVjaXBpZW50c1swXS5hZGRyZXNzLCB0ZXN0RGF0YS5iYXRjaEZ1bmdpYmxlUmVjaXBpZW50c1swXS5hZGRyZXNzKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5yZWNpcGllbnRzWzFdLmFkZHJlc3MsIHRlc3REYXRhLmJhdGNoRnVuZ2libGVSZWNpcGllbnRzWzFdLmFkZHJlc3MpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnJlY2lwaWVudHNbMF0uYW1vdW50LCB0ZXN0RGF0YS5iYXRjaEZ1bmdpYmxlUmVjaXBpZW50c1swXS5hbW91bnQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnJlY2lwaWVudHNbMV0uYW1vdW50LCB0ZXN0RGF0YS5iYXRjaEZ1bmdpYmxlUmVjaXBpZW50c1sxXS5hbW91bnQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmFzc2V0SWQsIHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5BZGRyZXNzLnVzZHQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4Lm1heEdhc0Ftb3VudCwgMjAwMDAwKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5nYXNVbml0UHJpY2UsIDEwMCk7XG4gICAgICBzaG91bGQuZXF1YWwodHguc2VxdWVuY2VOdW1iZXIsIDE0KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5leHBpcmF0aW9uVGltZSwgMTczNjI0NjE1NSk7XG4gICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmRUb2tlbik7XG4gICAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4LmlucHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzLFxuICAgICAgICB2YWx1ZTogKFxuICAgICAgICAgIE51bWJlcih0ZXN0RGF0YS5iYXRjaEZ1bmdpYmxlUmVjaXBpZW50c1swXS5hbW91bnQpICsgTnVtYmVyKHRlc3REYXRhLmJhdGNoRnVuZ2libGVSZWNpcGllbnRzWzFdLmFtb3VudClcbiAgICAgICAgKS50b1N0cmluZygpLFxuICAgICAgICBjb2luOiAndGFwdDp1c2R0JyxcbiAgICAgIH0pO1xuICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDIpO1xuICAgICAgdHgub3V0cHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEuYmF0Y2hGdW5naWJsZVJlY2lwaWVudHNbMF0uYWRkcmVzcyxcbiAgICAgICAgdmFsdWU6IHRlc3REYXRhLmJhdGNoRnVuZ2libGVSZWNpcGllbnRzWzBdLmFtb3VudCxcbiAgICAgICAgY29pbjogJ3RhcHQ6dXNkdCcsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHNbMV0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLmJhdGNoRnVuZ2libGVSZWNpcGllbnRzWzFdLmFkZHJlc3MsXG4gICAgICAgIHZhbHVlOiB0ZXN0RGF0YS5iYXRjaEZ1bmdpYmxlUmVjaXBpZW50c1sxXS5hbW91bnQsXG4gICAgICAgIGNvaW46ICd0YXB0OnVzZHQnLFxuICAgICAgfSk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwodHhCdWlsZGVyLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgICAgcmF3VHguc2hvdWxkLmVxdWFsKHRlc3REYXRhLkZVTkdJQkxFX0JBVENIX1JBV19UWF9IRVgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIHZhbGlkYXRlIGEgdmFsaWQgc2lnbmFibGVQYXlsb2FkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgRnVuZ2libGVBc3NldFRyYW5zZmVyKGNvaW5zLmdldCgndGFwdCcpKTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0RnVuZ2libGVBc3NldFRyYW5zYWN0aW9uQnVpbGRlcih0cmFuc2FjdGlvbik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlcjIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5iYXRjaEZ1bmdpYmxlUmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh7XG4gICAgICAgIG1heEdhc0Ftb3VudDogMjAwMDAwLFxuICAgICAgICBnYXNVbml0UHJpY2U6IDEwMCxcbiAgICAgIH0pO1xuICAgICAgdHhCdWlsZGVyLnNlcXVlbmNlTnVtYmVyKDE0KTtcbiAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uVGltZSgxNzM2MjQ2MTU1KTtcbiAgICAgIHR4QnVpbGRlci5hc3NldElkKHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5BZGRyZXNzLnVzZHQpO1xuICAgICAgdHhCdWlsZGVyLmFkZEZlZVBheWVyQWRkcmVzcyh0ZXN0RGF0YS5mZWVQYXllci5hZGRyZXNzKTtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBGdW5naWJsZUFzc2V0VHJhbnNmZXI7XG4gICAgICBjb25zdCBzaWduYWJsZVBheWxvYWQgPSB0eC5zaWduYWJsZVBheWxvYWQ7XG4gICAgICBzaG91bGQuZXF1YWwoc2lnbmFibGVQYXlsb2FkLnRvU3RyaW5nKCdoZXgnKSwgdGVzdERhdGEuRlVOR0lCTEVfQkFUQ0hfU0lHTkFCTEVfUEFZTE9BRCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgdW5zaWduZWQgdHggYW5kIHZhbGlkYXRlIGl0cyB0b0pzb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBGdW5naWJsZUFzc2V0VHJhbnNmZXIoY29pbnMuZ2V0KCd0YXB0JykpO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRGdW5naWJsZUFzc2V0VHJhbnNhY3Rpb25CdWlsZGVyKHRyYW5zYWN0aW9uKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyMi5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLmJhdGNoRnVuZ2libGVSZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHtcbiAgICAgICAgbWF4R2FzQW1vdW50OiAyMDAwMDAsXG4gICAgICAgIGdhc1VuaXRQcmljZTogMTAwLFxuICAgICAgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2VxdWVuY2VOdW1iZXIoMTQpO1xuICAgICAgdHhCdWlsZGVyLmV4cGlyYXRpb25UaW1lKDE3MzYyNDYxNTUpO1xuICAgICAgdHhCdWlsZGVyLmFzc2V0SWQodGVzdERhdGEuZnVuZ2libGVUb2tlbkFkZHJlc3MudXNkdCk7XG4gICAgICB0eEJ1aWxkZXIuYWRkRmVlUGF5ZXJBZGRyZXNzKHRlc3REYXRhLmZlZVBheWVyLmFkZHJlc3MpO1xuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIEZ1bmdpYmxlQXNzZXRUcmFuc2ZlcjtcbiAgICAgIGNvbnN0IHRvSnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5zZW5kZXIsIHRlc3REYXRhLnNlbmRlcjIuYWRkcmVzcyk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHRvSnNvbi5yZWNpcGllbnRzLCBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5iYXRjaEZ1bmdpYmxlUmVjaXBpZW50c1swXS5hZGRyZXNzLFxuICAgICAgICAgIGFtb3VudDogdGVzdERhdGEuYmF0Y2hGdW5naWJsZVJlY2lwaWVudHNbMF0uYW1vdW50LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuYmF0Y2hGdW5naWJsZVJlY2lwaWVudHNbMV0uYWRkcmVzcyxcbiAgICAgICAgICBhbW91bnQ6IHRlc3REYXRhLmJhdGNoRnVuZ2libGVSZWNpcGllbnRzWzFdLmFtb3VudCxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0b0pzb24ucmVjaXBpZW50LCB7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLmJhdGNoRnVuZ2libGVSZWNpcGllbnRzWzBdLmFkZHJlc3MsXG4gICAgICAgIGFtb3VudDogdGVzdERhdGEuYmF0Y2hGdW5naWJsZVJlY2lwaWVudHNbMF0uYW1vdW50LFxuICAgICAgfSk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLnNlcXVlbmNlTnVtYmVyLCAxNCk7XG4gICAgICBzaG91bGQuZXF1YWwodHguYXNzZXRJZCwgdGVzdERhdGEuZnVuZ2libGVUb2tlbkFkZHJlc3MudXNkdCk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLm1heEdhc0Ftb3VudCwgMjAwMDAwKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24uZ2FzVW5pdFByaWNlLCAxMDApO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5leHBpcmF0aW9uVGltZSwgMTczNjI0NjE1NSk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLmZlZVBheWVyLCB0ZXN0RGF0YS5mZWVQYXllci5hZGRyZXNzKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSBzaWduZWQgdHggYW5kIHZhbGlkYXRlIGl0cyB0b0pzb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuRlVOR0lCTEVfQkFUQ0hfVFJBTlNGRVIpO1xuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIEZ1bmdpYmxlQXNzZXRUcmFuc2ZlcjtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pbnB1dHNbMF0uYWRkcmVzcywgJzB4YzhmMDJkMjVhYTY5OGIzZTlmYmQ4YTA4ZThkYTRjOGVlMjYxODMyYTI1YTRjZGU4NzMxYjVlYzM1NjUzN2QwOScpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmlucHV0c1swXS52YWx1ZSwgJzInKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5vdXRwdXRzWzBdLmFkZHJlc3MsICcweGRkNTJjMGI3MmE3MzY5NmI4NjdkNjU3MWEzMDhjNDEzZTQzYmZmOGY0NDk1NmE1OTkxYWJjNGQ1MGRiMGI4NDknKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5vdXRwdXRzWzBdLnZhbHVlLCAnMScpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4Lm91dHB1dHNbMV0uYWRkcmVzcywgJzB4MmE4MTc2MGQ1MmRiOWE5NmRmMjYwOTg2MDIxODIxNGI2ZDEwMTJlNzdlODRhM2ZlZDUxNDVhOWE2NWJmNjkzMicpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4Lm91dHB1dHNbMV0udmFsdWUsICcxJyk7XG4gICAgICBzaG91bGQuZXF1YWwodHgubWF4R2FzQW1vdW50LCAyMDAwMDApO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4Lmdhc1VuaXRQcmljZSwgMTAwKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5nYXNVc2VkLCAwKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5leHBpcmF0aW9uVGltZSwgMTg2OTI4OTc2MDAwMCk7XG4gICAgICBzaG91bGQuZXF1YWwodHguc2VxdWVuY2VOdW1iZXIsIDgxKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5zZW5kZXIsICcweGM4ZjAyZDI1YWE2OThiM2U5ZmJkOGEwOGU4ZGE0YzhlZTI2MTgzMmEyNWE0Y2RlODczMWI1ZWMzNTY1MzdkMDknKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5yZWNpcGllbnRzWzBdLmFkZHJlc3MsICcweGRkNTJjMGI3MmE3MzY5NmI4NjdkNjU3MWEzMDhjNDEzZTQzYmZmOGY0NDk1NmE1OTkxYWJjNGQ1MGRiMGI4NDknKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5yZWNpcGllbnRzWzBdLmFtb3VudCwgJzEnKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5yZWNpcGllbnRzWzFdLmFkZHJlc3MsICcweDJhODE3NjBkNTJkYjlhOTZkZjI2MDk4NjAyMTgyMTRiNmQxMDEyZTc3ZTg0YTNmZWQ1MTQ1YTlhNjViZjY5MzInKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5yZWNpcGllbnRzWzFdLmFtb3VudCwgJzEnKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5mZWVQYXllckFkZHJlc3MsICcweGRiYzg3YTFjODE2ZDliY2QwNmI2ODNjMzdlODBjNzE2MmU0ZDQ4ZGE3ODEyMTk4YjgzMGU0ZDVkOGUwNjI5ZjInKTtcblxuICAgICAgY29uc3QgdG9Kc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLmlkLCAnMHhmNzgxZTUzMWEyMGQ5YjFiODBlYWI2NDAyYTQ0ZGZjYTgxYzdhMTk2YWNjZjM1MGM5NzRkNjI3YWMyZTUyZjlhJyk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLnNlbmRlciwgJzB4YzhmMDJkMjVhYTY5OGIzZTlmYmQ4YTA4ZThkYTRjOGVlMjYxODMyYTI1YTRjZGU4NzMxYjVlYzM1NjUzN2QwOScpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0b0pzb24ucmVjaXBpZW50cywgW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogJzB4ZGQ1MmMwYjcyYTczNjk2Yjg2N2Q2NTcxYTMwOGM0MTNlNDNiZmY4ZjQ0OTU2YTU5OTFhYmM0ZDUwZGIwYjg0OScsXG4gICAgICAgICAgYW1vdW50OiAnMScsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiAnMHgyYTgxNzYwZDUyZGI5YTk2ZGYyNjA5ODYwMjE4MjE0YjZkMTAxMmU3N2U4NGEzZmVkNTE0NWE5YTY1YmY2OTMyJyxcbiAgICAgICAgICBhbW91bnQ6ICcxJyxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0b0pzb24ucmVjaXBpZW50LCB7XG4gICAgICAgIGFkZHJlc3M6ICcweGRkNTJjMGI3MmE3MzY5NmI4NjdkNjU3MWEzMDhjNDEzZTQzYmZmOGY0NDk1NmE1OTkxYWJjNGQ1MGRiMGI4NDknLFxuICAgICAgICBhbW91bnQ6ICcxJyxcbiAgICAgIH0pO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5zZXF1ZW5jZU51bWJlciwgODEpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRvSnNvbi5tYXhHYXNBbW91bnQsIDIwMDAwMCk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLmdhc1VuaXRQcmljZSwgMTAwKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24uZ2FzVXNlZCwgMCk7XG4gICAgICBzaG91bGQuZXF1YWwodG9Kc29uLmV4cGlyYXRpb25UaW1lLCAxODY5Mjg5NzYwMDAwKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24uZmVlUGF5ZXIsICcweGRiYzg3YTFjODE2ZDliY2QwNmI2ODNjMzdlODBjNzE2MmU0ZDQ4ZGE3ODEyMTk4YjgzMGU0ZDVkOGUwNjI5ZjInKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0b0pzb24uYXNzZXRJZCwgJzB4ZDVkMGQ1NjE0OTNlYTJiOTQxMGY2N2RhODA0NjUzYWU0NGU3OTNjMjQyMzcwN2Q0ZjExZWRiMmUzODE5MjA1MCcpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=transferBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transferBuilder.d.ts","sourceRoot":"","sources":["../../../../test/unit/transactionBuilder/transferBuilder.ts"],"names":[],"mappings":""}