@bitgo-beta/sdk-coin-sol 2.4.3-beta.998 → 7.6.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/bigint-buffer-guard.d.ts +1 -0
- package/dist/src/bigint-buffer-guard.d.ts.map +1 -0
- package/dist/src/bigint-buffer-guard.js +29 -0
- package/dist/src/config/token2022StaticConfig.d.ts +3 -0
- package/dist/src/config/token2022StaticConfig.d.ts.map +1 -0
- package/dist/src/config/token2022StaticConfig.js +50 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -1
- package/dist/src/lib/constants.d.ts +35 -2
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +41 -2
- package/dist/src/lib/customInstructionBuilder.d.ts +72 -0
- package/dist/src/lib/customInstructionBuilder.d.ts.map +1 -0
- package/dist/src/lib/customInstructionBuilder.js +289 -0
- package/dist/src/lib/iface.d.ts +79 -5
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +1 -1
- package/dist/src/lib/index.d.ts +1 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +4 -2
- package/dist/src/lib/instructionParamsFactory.d.ts.map +1 -1
- package/dist/src/lib/instructionParamsFactory.js +364 -78
- package/dist/src/lib/jitoStakePoolOperations.d.ts +113 -0
- package/dist/src/lib/jitoStakePoolOperations.d.ts.map +1 -0
- package/dist/src/lib/jitoStakePoolOperations.js +200 -0
- package/dist/src/lib/solInstructionFactory.d.ts.map +1 -1
- package/dist/src/lib/solInstructionFactory.js +266 -69
- package/dist/src/lib/stakingActivateBuilder.d.ts +16 -5
- package/dist/src/lib/stakingActivateBuilder.d.ts.map +1 -1
- package/dist/src/lib/stakingActivateBuilder.js +23 -10
- package/dist/src/lib/stakingDeactivateBuilder.d.ts +16 -5
- package/dist/src/lib/stakingDeactivateBuilder.d.ts.map +1 -1
- package/dist/src/lib/stakingDeactivateBuilder.js +43 -20
- package/dist/src/lib/token2022Config.d.ts +44 -0
- package/dist/src/lib/token2022Config.d.ts.map +1 -0
- package/dist/src/lib/token2022Config.js +27 -0
- package/dist/src/lib/tokenTransferBuilder.js +7 -7
- package/dist/src/lib/transaction.d.ts +31 -4
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +134 -46
- package/dist/src/lib/transactionBuilder.d.ts +18 -2
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +78 -2
- package/dist/src/lib/transactionBuilderFactory.d.ts +5 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +10 -1
- package/dist/src/lib/utils.d.ts +34 -1
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +88 -24
- package/dist/src/sol.d.ts +36 -13
- package/dist/src/sol.d.ts.map +1 -1
- package/dist/src/sol.js +230 -38
- package/dist/test/fixtures/sol.d.ts +1152 -0
- package/dist/test/fixtures/sol.d.ts.map +1 -0
- package/dist/test/fixtures/sol.js +1433 -0
- package/dist/test/resources/sol.d.ts +238 -0
- package/dist/test/resources/sol.d.ts.map +1 -0
- package/dist/test/resources/sol.js +320 -0
- package/dist/test/unit/fixtures/solBackupKey.d.ts +5 -0
- package/dist/test/unit/fixtures/solBackupKey.d.ts.map +1 -0
- package/dist/test/unit/fixtures/solBackupKey.js +8 -0
- package/dist/test/unit/getBuilderFactory.d.ts +3 -0
- package/dist/test/unit/getBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/getBuilderFactory.js +10 -0
- package/dist/test/unit/instructionParamsFactory.d.ts +2 -0
- package/dist/test/unit/instructionParamsFactory.d.ts.map +1 -0
- package/dist/test/unit/instructionParamsFactory.js +412 -0
- package/dist/test/unit/instructionParamsFactory.staking.d.ts +2 -0
- package/dist/test/unit/instructionParamsFactory.staking.d.ts.map +1 -0
- package/dist/test/unit/instructionParamsFactory.staking.js +1059 -0
- package/dist/test/unit/keyPair.d.ts +2 -0
- package/dist/test/unit/keyPair.d.ts.map +1 -0
- package/dist/test/unit/keyPair.js +177 -0
- package/dist/test/unit/messages/messageBuilderFactory.d.ts +2 -0
- package/dist/test/unit/messages/messageBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/messages/messageBuilderFactory.js +118 -0
- package/dist/test/unit/messages/simpleMessageBuilder.d.ts +2 -0
- package/dist/test/unit/messages/simpleMessageBuilder.d.ts.map +1 -0
- package/dist/test/unit/messages/simpleMessageBuilder.js +194 -0
- package/dist/test/unit/sol.d.ts +2 -0
- package/dist/test/unit/sol.d.ts.map +1 -0
- package/dist/test/unit/sol.js +3108 -0
- package/dist/test/unit/solInstructionFactory.d.ts +2 -0
- package/dist/test/unit/solInstructionFactory.d.ts.map +1 -0
- package/dist/test/unit/solInstructionFactory.js +454 -0
- package/dist/test/unit/solToken.d.ts +2 -0
- package/dist/test/unit/solToken.d.ts.map +1 -0
- package/dist/test/unit/solToken.js +31 -0
- package/dist/test/unit/transaction.d.ts +2 -0
- package/dist/test/unit/transaction.d.ts.map +1 -0
- package/dist/test/unit/transaction.js +983 -0
- package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.js +202 -0
- package/dist/test/unit/transactionBuilder/ataInitBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/ataInitBuilder.js +471 -0
- package/dist/test/unit/transactionBuilder/customInstructionBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/customInstructionBuilder.js +413 -0
- package/dist/test/unit/transactionBuilder/stakingActivateBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/stakingActivateBuilder.js +430 -0
- package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +157 -0
- package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.js +384 -0
- package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.js +224 -0
- package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +259 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +787 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.js +495 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.js +286 -0
- package/dist/test/unit/transactionBuilder/transferBuilderV2.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transferBuilderV2.js +862 -0
- package/dist/test/unit/transactionBuilder/walletInitBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/walletInitBuilder.js +259 -0
- package/dist/test/unit/utils.d.ts +2 -0
- package/dist/test/unit/utils.d.ts.map +1 -0
- package/dist/test/unit/utils.js +505 -0
- package/dist/test/unit/versionedTransaction.d.ts +2 -0
- package/dist/test/unit/versionedTransaction.d.ts.map +1 -0
- package/dist/test/unit/versionedTransaction.js +207 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +14 -9
- package/.eslintignore +0 -5
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -1223
|
@@ -0,0 +1,983 @@
|
|
|
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 assert_1 = __importDefault(require("assert"));
|
|
40
|
+
const should_1 = __importDefault(require("should"));
|
|
41
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
42
|
+
const lib_1 = require("../../src/lib");
|
|
43
|
+
const testData = __importStar(require("../resources/sol"));
|
|
44
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
45
|
+
const getBuilderFactory_1 = require("./getBuilderFactory");
|
|
46
|
+
describe('Sol Transaction', () => {
|
|
47
|
+
const coin = statics_1.coins.get('tsol');
|
|
48
|
+
describe('toJson should', () => {
|
|
49
|
+
it('throw empty transaction', () => {
|
|
50
|
+
const tx = new lib_1.Transaction(coin);
|
|
51
|
+
assert_1.default.throws(() => tx.toJson(), /Empty transaction/);
|
|
52
|
+
assert_1.default.throws(() => tx.toBroadcastFormat(), /Empty transaction/);
|
|
53
|
+
});
|
|
54
|
+
it('throw for toJson of empty tx', () => {
|
|
55
|
+
const tx = new lib_1.Transaction(coin);
|
|
56
|
+
(0, should_1.default)(() => tx.toJson()).throwError('Empty transaction');
|
|
57
|
+
tx.solTransaction = new web3_js_1.Transaction();
|
|
58
|
+
tx.solTransaction.recentBlockhash = testData.blockHashes.validBlockHashes[0];
|
|
59
|
+
(0, should_1.default)(() => tx.toJson()).throwError('Invalid transaction, transaction type not supported: undefined');
|
|
60
|
+
});
|
|
61
|
+
it('succeed for a unsigned transfer tx', () => {
|
|
62
|
+
const tx = new lib_1.Transaction(coin);
|
|
63
|
+
tx.fromRawTransaction(testData.TRANSFER_UNSIGNED_TX_WITH_MEMO_AND_DURABLE_NONCE);
|
|
64
|
+
tx.signature.should.be.empty();
|
|
65
|
+
const txJson = tx.toJson();
|
|
66
|
+
txJson.should.have.properties(['id', 'feePayer', 'nonce', 'numSignatures', 'instructionsData']);
|
|
67
|
+
txJson.id?.should.equal(undefined);
|
|
68
|
+
txJson.feePayer?.should.equal('5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe');
|
|
69
|
+
txJson.nonce.should.equal('GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi');
|
|
70
|
+
txJson.numSignatures.should.equal(0);
|
|
71
|
+
txJson.instructionsData.length.should.equal(3);
|
|
72
|
+
txJson.lamportsPerSignature?.should.be.undefined();
|
|
73
|
+
txJson.instructionsData.should.deepEqual([
|
|
74
|
+
{
|
|
75
|
+
type: 'NonceAdvance',
|
|
76
|
+
params: {
|
|
77
|
+
walletNonceAddress: '8Y7RM6JfcX4ASSNBkrkrmSbRu431YVi9Y3oLFnzC2dCh',
|
|
78
|
+
authWalletAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
type: 'Transfer',
|
|
83
|
+
params: {
|
|
84
|
+
fromAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
|
|
85
|
+
toAddress: 'CP5Dpaa42RtJmMuKqCQsLwma5Yh3knuvKsYDFX85F41S',
|
|
86
|
+
amount: '300000',
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
type: 'Memo',
|
|
91
|
+
params: {
|
|
92
|
+
memo: 'test memo',
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
]);
|
|
96
|
+
});
|
|
97
|
+
it('succeed for a multi transfer tx', () => {
|
|
98
|
+
const tx = new lib_1.Transaction(coin);
|
|
99
|
+
tx.fromRawTransaction(testData.MULTI_TRANSFER_SIGNED);
|
|
100
|
+
const txJson = tx.toJson();
|
|
101
|
+
txJson.should.have.properties(['id', 'feePayer', 'nonce', 'numSignatures', 'instructionsData']);
|
|
102
|
+
txJson.id?.should.equal('TPVcc18CYxPnM3eRgQhdb6V6ZLa34Dv3dU7MtvKPuy5ZPKLM1uZPFFEmF2m184PTWKRZ1Uq6NKFZWwr2krKk63f');
|
|
103
|
+
tx.signature.should.deepEqual([
|
|
104
|
+
'TPVcc18CYxPnM3eRgQhdb6V6ZLa34Dv3dU7MtvKPuy5ZPKLM1uZPFFEmF2m184PTWKRZ1Uq6NKFZWwr2krKk63f',
|
|
105
|
+
]);
|
|
106
|
+
txJson.feePayer?.should.equal('5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe');
|
|
107
|
+
txJson.nonce.should.equal('GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi');
|
|
108
|
+
txJson.numSignatures.should.equal(1);
|
|
109
|
+
txJson.lamportsPerSignature?.should.be.undefined();
|
|
110
|
+
txJson.instructionsData.length.should.equal(8);
|
|
111
|
+
txJson.instructionsData.should.deepEqual([
|
|
112
|
+
{
|
|
113
|
+
type: 'NonceAdvance',
|
|
114
|
+
params: {
|
|
115
|
+
walletNonceAddress: '8Y7RM6JfcX4ASSNBkrkrmSbRu431YVi9Y3oLFnzC2dCh',
|
|
116
|
+
authWalletAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
type: 'Transfer',
|
|
121
|
+
params: {
|
|
122
|
+
fromAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
|
|
123
|
+
toAddress: 'CP5Dpaa42RtJmMuKqCQsLwma5Yh3knuvKsYDFX85F41S',
|
|
124
|
+
amount: '300000',
|
|
125
|
+
},
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
type: 'Transfer',
|
|
129
|
+
params: {
|
|
130
|
+
fromAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
|
|
131
|
+
toAddress: '6B55XMiaS6tUZw5Tt3G1RaXAqdrvN38yXVDJmWvKLkiM',
|
|
132
|
+
amount: '300000',
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
type: 'Transfer',
|
|
137
|
+
params: {
|
|
138
|
+
fromAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
|
|
139
|
+
toAddress: 'C1UjpxcXNBpp1UyvYsuNBNZ5Da1G1i49g3yTvC23Ny7e',
|
|
140
|
+
amount: '300000',
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
type: 'Transfer',
|
|
145
|
+
params: {
|
|
146
|
+
fromAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
|
|
147
|
+
toAddress: 'CpUYXh9xXoWfkBVaBQRZ8nAgDbT16GZeQdqveeBS1hmk',
|
|
148
|
+
amount: '300000',
|
|
149
|
+
},
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
type: 'Transfer',
|
|
153
|
+
params: {
|
|
154
|
+
fromAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
|
|
155
|
+
toAddress: '64s6NjmEokdhicHEd432X5Ut2EDfDmVqdvGh4rASn1gd',
|
|
156
|
+
amount: '300000',
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
type: 'Transfer',
|
|
161
|
+
params: {
|
|
162
|
+
fromAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
|
|
163
|
+
toAddress: '6nXxL2jMSdkgfHm13Twvn1gzRAPdrWnWLfu89PJL3Aqe',
|
|
164
|
+
amount: '300000',
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
type: 'Memo',
|
|
169
|
+
params: {
|
|
170
|
+
memo: 'test memo',
|
|
171
|
+
},
|
|
172
|
+
},
|
|
173
|
+
]);
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
describe('sign should', () => {
|
|
177
|
+
it('fail if the tx doesnt have nonce', async () => {
|
|
178
|
+
const tx = new lib_1.Transaction(coin);
|
|
179
|
+
tx.solTransaction = new web3_js_1.Transaction();
|
|
180
|
+
tx.solTransaction.feePayer = new web3_js_1.PublicKey(testData.authAccount.pub);
|
|
181
|
+
const kp = new lib_1.KeyPair({ prv: testData.prvKeys.prvKey1.base58 });
|
|
182
|
+
await tx.sign(kp).should.be.rejectedWith('Nonce is required before signing');
|
|
183
|
+
});
|
|
184
|
+
it('fail if the tx doesnt have feePayer', async () => {
|
|
185
|
+
const tx = new lib_1.Transaction(coin);
|
|
186
|
+
const kp = new lib_1.KeyPair({ prv: testData.prvKeys.prvKey1.base58 });
|
|
187
|
+
tx.solTransaction = new web3_js_1.Transaction();
|
|
188
|
+
tx.solTransaction.recentBlockhash = testData.blockHashes.validBlockHashes[0];
|
|
189
|
+
await tx.sign(kp).should.be.rejectedWith('feePayer is required before signing');
|
|
190
|
+
});
|
|
191
|
+
it('fail if the KeyPair is not the right one', async () => {
|
|
192
|
+
const tx = new lib_1.Transaction(coin);
|
|
193
|
+
tx.fromRawTransaction(testData.RAW_TX_UNSIGNED);
|
|
194
|
+
const keypair = new lib_1.KeyPair({ prv: testData.prvKeys.prvKey1.base58 });
|
|
195
|
+
await tx.sign(keypair).should.be.rejectedWith('unknown signer: CP5Dpaa42RtJmMuKqCQsLwma5Yh3knuvKsYDFX85F41S');
|
|
196
|
+
});
|
|
197
|
+
it('fail if the KeyPair doesnt have a prv key', async () => {
|
|
198
|
+
const tx = new lib_1.Transaction(coin);
|
|
199
|
+
tx.fromRawTransaction(testData.RAW_TX_UNSIGNED);
|
|
200
|
+
const keypair = new lib_1.KeyPair({ pub: testData.pubKeys.validPubKeys[0] });
|
|
201
|
+
await tx.sign(keypair).should.be.rejectedWith('Missing private key');
|
|
202
|
+
});
|
|
203
|
+
it('succeed to sign with 1 KeyPair', async () => {
|
|
204
|
+
const tx = new lib_1.Transaction(coin);
|
|
205
|
+
tx.fromRawTransaction(testData.RAW_TX_UNSIGNED);
|
|
206
|
+
const keypair = new lib_1.KeyPair({ prv: testData.accountWithSeed.privateKey.base58 });
|
|
207
|
+
await tx.sign(keypair).should.be.fulfilled();
|
|
208
|
+
should_1.default.equal(tx.toBroadcastFormat(), testData.RAW_TX_SIGNED);
|
|
209
|
+
});
|
|
210
|
+
it('succeed when try to sign with the same keyPair multiple times ', async () => {
|
|
211
|
+
const tx = new lib_1.Transaction(coin);
|
|
212
|
+
tx.fromRawTransaction(testData.RAW_TX_UNSIGNED);
|
|
213
|
+
const keypair = new lib_1.KeyPair({ prv: testData.accountWithSeed.privateKey.base58 });
|
|
214
|
+
await tx.sign([keypair, keypair, keypair, keypair]).should.be.fulfilled();
|
|
215
|
+
should_1.default.equal(tx.toBroadcastFormat(), testData.RAW_TX_SIGNED);
|
|
216
|
+
});
|
|
217
|
+
it('succeed when try to sign with a keyPair that already signed', async () => {
|
|
218
|
+
const tx = new lib_1.Transaction(coin);
|
|
219
|
+
tx.fromRawTransaction(testData.RAW_TX_SIGNED);
|
|
220
|
+
const keypair = new lib_1.KeyPair({ prv: testData.accountWithSeed.privateKey.base58 });
|
|
221
|
+
await tx.sign(keypair).should.be.fulfilled();
|
|
222
|
+
should_1.default.equal(tx.toBroadcastFormat(), testData.RAW_TX_SIGNED);
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
describe('transaction parsing', function () {
|
|
226
|
+
it('fromRawTransaction and toBroadcastFormat', async function () {
|
|
227
|
+
const tx = new lib_1.Transaction(coin);
|
|
228
|
+
tx.fromRawTransaction(testData.RAW_TX_UNSIGNED);
|
|
229
|
+
should_1.default.equal(tx.toBroadcastFormat(), testData.RAW_TX_UNSIGNED);
|
|
230
|
+
});
|
|
231
|
+
it('fromRawTransaction, sign and toBroadcastFormat ', async function () {
|
|
232
|
+
const tx = new lib_1.Transaction(coin);
|
|
233
|
+
tx.fromRawTransaction(testData.RAW_TX_UNSIGNED);
|
|
234
|
+
const keypair = new lib_1.KeyPair({ prv: testData.accountWithSeed.privateKey.base58 });
|
|
235
|
+
await tx.sign(keypair);
|
|
236
|
+
should_1.default.equal(tx.toBroadcastFormat(), testData.RAW_TX_SIGNED);
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
describe('explain transaction', function () {
|
|
240
|
+
const factory = (0, getBuilderFactory_1.getBuilderFactory)('tsol');
|
|
241
|
+
const blockHash = testData.blockHashes.validBlockHashes[0];
|
|
242
|
+
const sender = testData.authAccount.pub;
|
|
243
|
+
const address = testData.addresses.validAddresses[0];
|
|
244
|
+
const amount = '10000';
|
|
245
|
+
const wallet = new lib_1.KeyPair(testData.authAccount).getKeys();
|
|
246
|
+
const stakeAccount = new lib_1.KeyPair(testData.stakeAccount).getKeys();
|
|
247
|
+
const validator = testData.validator;
|
|
248
|
+
it('should explain single transfer transaction', async function () {
|
|
249
|
+
const tx = await factory
|
|
250
|
+
.getTransferBuilder()
|
|
251
|
+
.nonce(blockHash)
|
|
252
|
+
.sender(sender)
|
|
253
|
+
.send({ address, amount })
|
|
254
|
+
.fee({ amount: 5000 })
|
|
255
|
+
.build();
|
|
256
|
+
const explainedTransaction = tx.explainTransaction();
|
|
257
|
+
explainedTransaction.should.deepEqual({
|
|
258
|
+
displayOrder: [
|
|
259
|
+
'id',
|
|
260
|
+
'type',
|
|
261
|
+
'blockhash',
|
|
262
|
+
'durableNonce',
|
|
263
|
+
'outputAmount',
|
|
264
|
+
'changeAmount',
|
|
265
|
+
'outputs',
|
|
266
|
+
'changeOutputs',
|
|
267
|
+
'tokenEnablements',
|
|
268
|
+
'fee',
|
|
269
|
+
'memo',
|
|
270
|
+
],
|
|
271
|
+
id: 'UNAVAILABLE',
|
|
272
|
+
type: 'Send',
|
|
273
|
+
changeOutputs: [],
|
|
274
|
+
changeAmount: '0',
|
|
275
|
+
outputAmount: '10000',
|
|
276
|
+
outputs: [
|
|
277
|
+
{
|
|
278
|
+
address: 'DesU7XscZjng8yj5VX6AZsk3hWSW4sQ3rTG2LuyQ2P4H',
|
|
279
|
+
amount: '10000',
|
|
280
|
+
},
|
|
281
|
+
],
|
|
282
|
+
fee: {
|
|
283
|
+
fee: '5000',
|
|
284
|
+
feeRate: 5000,
|
|
285
|
+
},
|
|
286
|
+
memo: undefined,
|
|
287
|
+
blockhash: '5ne7phA48Jrvpn39AtupB8ZkCCAy8gLTfpGihZPuDqen',
|
|
288
|
+
durableNonce: undefined,
|
|
289
|
+
tokenEnablements: [],
|
|
290
|
+
});
|
|
291
|
+
});
|
|
292
|
+
it('should explain single transfer with durable nonce transaction', async function () {
|
|
293
|
+
const tx = await factory
|
|
294
|
+
.getTransferBuilder()
|
|
295
|
+
.nonce(blockHash, { walletNonceAddress: testData.nonceAccount.pub, authWalletAddress: sender })
|
|
296
|
+
.sender(sender)
|
|
297
|
+
.send({ address, amount })
|
|
298
|
+
.build();
|
|
299
|
+
const explainedTransaction = tx.explainTransaction();
|
|
300
|
+
explainedTransaction.should.deepEqual({
|
|
301
|
+
displayOrder: [
|
|
302
|
+
'id',
|
|
303
|
+
'type',
|
|
304
|
+
'blockhash',
|
|
305
|
+
'durableNonce',
|
|
306
|
+
'outputAmount',
|
|
307
|
+
'changeAmount',
|
|
308
|
+
'outputs',
|
|
309
|
+
'changeOutputs',
|
|
310
|
+
'tokenEnablements',
|
|
311
|
+
'fee',
|
|
312
|
+
'memo',
|
|
313
|
+
],
|
|
314
|
+
id: 'UNAVAILABLE',
|
|
315
|
+
type: 'Send',
|
|
316
|
+
changeOutputs: [],
|
|
317
|
+
changeAmount: '0',
|
|
318
|
+
outputAmount: '10000',
|
|
319
|
+
outputs: [
|
|
320
|
+
{
|
|
321
|
+
address: 'DesU7XscZjng8yj5VX6AZsk3hWSW4sQ3rTG2LuyQ2P4H',
|
|
322
|
+
amount: '10000',
|
|
323
|
+
},
|
|
324
|
+
],
|
|
325
|
+
fee: {
|
|
326
|
+
fee: 'UNAVAILABLE',
|
|
327
|
+
feeRate: undefined,
|
|
328
|
+
},
|
|
329
|
+
memo: undefined,
|
|
330
|
+
blockhash: '5ne7phA48Jrvpn39AtupB8ZkCCAy8gLTfpGihZPuDqen',
|
|
331
|
+
durableNonce: {
|
|
332
|
+
authWalletAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
|
|
333
|
+
walletNonceAddress: '8Y7RM6JfcX4ASSNBkrkrmSbRu431YVi9Y3oLFnzC2dCh',
|
|
334
|
+
},
|
|
335
|
+
tokenEnablements: [],
|
|
336
|
+
});
|
|
337
|
+
});
|
|
338
|
+
it('should explain multi transfer with durable nonce and memo transaction', async function () {
|
|
339
|
+
const tx = await factory
|
|
340
|
+
.getTransferBuilder()
|
|
341
|
+
.nonce(blockHash, { walletNonceAddress: testData.nonceAccount.pub, authWalletAddress: sender })
|
|
342
|
+
.sender(sender)
|
|
343
|
+
.memo('memo text')
|
|
344
|
+
.send({ address, amount })
|
|
345
|
+
.send({ address: testData.addresses.validAddresses[1], amount })
|
|
346
|
+
.send({ address: testData.addresses.validAddresses[2], amount })
|
|
347
|
+
.build();
|
|
348
|
+
const explainedTransaction = tx.explainTransaction();
|
|
349
|
+
explainedTransaction.should.deepEqual({
|
|
350
|
+
displayOrder: [
|
|
351
|
+
'id',
|
|
352
|
+
'type',
|
|
353
|
+
'blockhash',
|
|
354
|
+
'durableNonce',
|
|
355
|
+
'outputAmount',
|
|
356
|
+
'changeAmount',
|
|
357
|
+
'outputs',
|
|
358
|
+
'changeOutputs',
|
|
359
|
+
'tokenEnablements',
|
|
360
|
+
'fee',
|
|
361
|
+
'memo',
|
|
362
|
+
],
|
|
363
|
+
id: 'UNAVAILABLE',
|
|
364
|
+
type: 'Send',
|
|
365
|
+
changeOutputs: [],
|
|
366
|
+
changeAmount: '0',
|
|
367
|
+
outputAmount: '30000',
|
|
368
|
+
outputs: [
|
|
369
|
+
{
|
|
370
|
+
address: 'DesU7XscZjng8yj5VX6AZsk3hWSW4sQ3rTG2LuyQ2P4H',
|
|
371
|
+
amount: '10000',
|
|
372
|
+
},
|
|
373
|
+
{
|
|
374
|
+
address: 'Azz9EmNuhtjoYrhWvidWx1Hfd14SNBsYyzXhA9Tnoca8',
|
|
375
|
+
amount: '10000',
|
|
376
|
+
},
|
|
377
|
+
{
|
|
378
|
+
address: '2n2xqWM9Z18LqxfJzkNrMMFWiDUFYA2k6WSgSnf6EnJs',
|
|
379
|
+
amount: '10000',
|
|
380
|
+
},
|
|
381
|
+
],
|
|
382
|
+
fee: {
|
|
383
|
+
fee: 'UNAVAILABLE',
|
|
384
|
+
feeRate: undefined,
|
|
385
|
+
},
|
|
386
|
+
memo: 'memo text',
|
|
387
|
+
blockhash: '5ne7phA48Jrvpn39AtupB8ZkCCAy8gLTfpGihZPuDqen',
|
|
388
|
+
durableNonce: {
|
|
389
|
+
authWalletAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
|
|
390
|
+
walletNonceAddress: '8Y7RM6JfcX4ASSNBkrkrmSbRu431YVi9Y3oLFnzC2dCh',
|
|
391
|
+
},
|
|
392
|
+
tokenEnablements: [],
|
|
393
|
+
});
|
|
394
|
+
});
|
|
395
|
+
it('should explain signed transfer transaction', async function () {
|
|
396
|
+
const tx = await factory
|
|
397
|
+
.getTransferBuilder()
|
|
398
|
+
.fee({ amount: 5000 })
|
|
399
|
+
.nonce(blockHash)
|
|
400
|
+
.sender(sender)
|
|
401
|
+
.send({ address, amount })
|
|
402
|
+
.build();
|
|
403
|
+
await tx.sign(new lib_1.KeyPair({ prv: testData.authAccount.prv }));
|
|
404
|
+
const explainedTransaction = tx.explainTransaction();
|
|
405
|
+
explainedTransaction.should.deepEqual({
|
|
406
|
+
displayOrder: [
|
|
407
|
+
'id',
|
|
408
|
+
'type',
|
|
409
|
+
'blockhash',
|
|
410
|
+
'durableNonce',
|
|
411
|
+
'outputAmount',
|
|
412
|
+
'changeAmount',
|
|
413
|
+
'outputs',
|
|
414
|
+
'changeOutputs',
|
|
415
|
+
'tokenEnablements',
|
|
416
|
+
'fee',
|
|
417
|
+
'memo',
|
|
418
|
+
],
|
|
419
|
+
id: tx.id,
|
|
420
|
+
type: 'Send',
|
|
421
|
+
changeOutputs: [],
|
|
422
|
+
changeAmount: '0',
|
|
423
|
+
outputAmount: '10000',
|
|
424
|
+
outputs: [
|
|
425
|
+
{
|
|
426
|
+
address: 'DesU7XscZjng8yj5VX6AZsk3hWSW4sQ3rTG2LuyQ2P4H',
|
|
427
|
+
amount: '10000',
|
|
428
|
+
},
|
|
429
|
+
],
|
|
430
|
+
fee: {
|
|
431
|
+
fee: '5000',
|
|
432
|
+
feeRate: 5000,
|
|
433
|
+
},
|
|
434
|
+
memo: undefined,
|
|
435
|
+
blockhash: '5ne7phA48Jrvpn39AtupB8ZkCCAy8gLTfpGihZPuDqen',
|
|
436
|
+
durableNonce: undefined,
|
|
437
|
+
tokenEnablements: [],
|
|
438
|
+
});
|
|
439
|
+
});
|
|
440
|
+
it('should explain wallet init transaction', async function () {
|
|
441
|
+
const tx = await factory
|
|
442
|
+
.getWalletInitializationBuilder()
|
|
443
|
+
.fee({ amount: 5000 })
|
|
444
|
+
.sender(sender)
|
|
445
|
+
.nonce(blockHash)
|
|
446
|
+
.address(testData.addresses.validAddresses[1])
|
|
447
|
+
.amount(amount)
|
|
448
|
+
.build();
|
|
449
|
+
const explainedTransaction = tx.explainTransaction();
|
|
450
|
+
explainedTransaction.should.deepEqual({
|
|
451
|
+
displayOrder: [
|
|
452
|
+
'id',
|
|
453
|
+
'type',
|
|
454
|
+
'blockhash',
|
|
455
|
+
'durableNonce',
|
|
456
|
+
'outputAmount',
|
|
457
|
+
'changeAmount',
|
|
458
|
+
'outputs',
|
|
459
|
+
'changeOutputs',
|
|
460
|
+
'tokenEnablements',
|
|
461
|
+
'fee',
|
|
462
|
+
'memo',
|
|
463
|
+
],
|
|
464
|
+
id: 'UNAVAILABLE',
|
|
465
|
+
type: 'WalletInitialization',
|
|
466
|
+
changeOutputs: [],
|
|
467
|
+
changeAmount: '0',
|
|
468
|
+
outputAmount: '10000',
|
|
469
|
+
outputs: [
|
|
470
|
+
{
|
|
471
|
+
address: 'Azz9EmNuhtjoYrhWvidWx1Hfd14SNBsYyzXhA9Tnoca8',
|
|
472
|
+
amount: '10000',
|
|
473
|
+
},
|
|
474
|
+
],
|
|
475
|
+
fee: {
|
|
476
|
+
fee: '10000',
|
|
477
|
+
feeRate: 5000,
|
|
478
|
+
},
|
|
479
|
+
memo: undefined,
|
|
480
|
+
blockhash: '5ne7phA48Jrvpn39AtupB8ZkCCAy8gLTfpGihZPuDqen',
|
|
481
|
+
durableNonce: undefined,
|
|
482
|
+
tokenEnablements: [],
|
|
483
|
+
});
|
|
484
|
+
});
|
|
485
|
+
it('should explain wallet init with durable nonce and memo transaction', async function () {
|
|
486
|
+
const tx = await factory
|
|
487
|
+
.getWalletInitializationBuilder()
|
|
488
|
+
.sender(sender)
|
|
489
|
+
.nonce(blockHash, { walletNonceAddress: testData.nonceAccount.pub, authWalletAddress: sender })
|
|
490
|
+
.memo('memo text')
|
|
491
|
+
.address(testData.addresses.validAddresses[1])
|
|
492
|
+
.amount(amount)
|
|
493
|
+
.build();
|
|
494
|
+
const explainedTransaction = tx.explainTransaction();
|
|
495
|
+
explainedTransaction.should.deepEqual({
|
|
496
|
+
displayOrder: [
|
|
497
|
+
'id',
|
|
498
|
+
'type',
|
|
499
|
+
'blockhash',
|
|
500
|
+
'durableNonce',
|
|
501
|
+
'outputAmount',
|
|
502
|
+
'changeAmount',
|
|
503
|
+
'outputs',
|
|
504
|
+
'changeOutputs',
|
|
505
|
+
'tokenEnablements',
|
|
506
|
+
'fee',
|
|
507
|
+
'memo',
|
|
508
|
+
],
|
|
509
|
+
id: 'UNAVAILABLE',
|
|
510
|
+
type: 'WalletInitialization',
|
|
511
|
+
changeOutputs: [],
|
|
512
|
+
changeAmount: '0',
|
|
513
|
+
outputAmount: '10000',
|
|
514
|
+
outputs: [
|
|
515
|
+
{
|
|
516
|
+
address: 'Azz9EmNuhtjoYrhWvidWx1Hfd14SNBsYyzXhA9Tnoca8',
|
|
517
|
+
amount: '10000',
|
|
518
|
+
},
|
|
519
|
+
],
|
|
520
|
+
fee: {
|
|
521
|
+
fee: 'UNAVAILABLE',
|
|
522
|
+
feeRate: undefined,
|
|
523
|
+
},
|
|
524
|
+
memo: 'memo text',
|
|
525
|
+
blockhash: '5ne7phA48Jrvpn39AtupB8ZkCCAy8gLTfpGihZPuDqen',
|
|
526
|
+
durableNonce: {
|
|
527
|
+
authWalletAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
|
|
528
|
+
walletNonceAddress: '8Y7RM6JfcX4ASSNBkrkrmSbRu431YVi9Y3oLFnzC2dCh',
|
|
529
|
+
},
|
|
530
|
+
tokenEnablements: [],
|
|
531
|
+
});
|
|
532
|
+
});
|
|
533
|
+
it('should explain signed wallet init transaction', async function () {
|
|
534
|
+
const tx = await factory
|
|
535
|
+
.getWalletInitializationBuilder()
|
|
536
|
+
.fee({ amount: 5000 })
|
|
537
|
+
.sender(sender)
|
|
538
|
+
.nonce(blockHash)
|
|
539
|
+
.address(testData.addresses.validAddresses[1])
|
|
540
|
+
.amount(amount)
|
|
541
|
+
.build();
|
|
542
|
+
await tx.sign(new lib_1.KeyPair({ prv: testData.authAccount.prv }));
|
|
543
|
+
const explainedTransaction = tx.explainTransaction();
|
|
544
|
+
explainedTransaction.should.deepEqual({
|
|
545
|
+
displayOrder: [
|
|
546
|
+
'id',
|
|
547
|
+
'type',
|
|
548
|
+
'blockhash',
|
|
549
|
+
'durableNonce',
|
|
550
|
+
'outputAmount',
|
|
551
|
+
'changeAmount',
|
|
552
|
+
'outputs',
|
|
553
|
+
'changeOutputs',
|
|
554
|
+
'tokenEnablements',
|
|
555
|
+
'fee',
|
|
556
|
+
'memo',
|
|
557
|
+
],
|
|
558
|
+
id: tx.id,
|
|
559
|
+
type: 'WalletInitialization',
|
|
560
|
+
changeOutputs: [],
|
|
561
|
+
changeAmount: '0',
|
|
562
|
+
outputAmount: '10000',
|
|
563
|
+
outputs: [
|
|
564
|
+
{
|
|
565
|
+
address: 'Azz9EmNuhtjoYrhWvidWx1Hfd14SNBsYyzXhA9Tnoca8',
|
|
566
|
+
amount: '10000',
|
|
567
|
+
},
|
|
568
|
+
],
|
|
569
|
+
fee: {
|
|
570
|
+
fee: '10000',
|
|
571
|
+
feeRate: 5000,
|
|
572
|
+
},
|
|
573
|
+
memo: undefined,
|
|
574
|
+
blockhash: '5ne7phA48Jrvpn39AtupB8ZkCCAy8gLTfpGihZPuDqen',
|
|
575
|
+
durableNonce: undefined,
|
|
576
|
+
tokenEnablements: [],
|
|
577
|
+
});
|
|
578
|
+
});
|
|
579
|
+
it('should explain create ATA transaction with tokenEnablements field', async function () {
|
|
580
|
+
const tx = await factory
|
|
581
|
+
.getAtaInitializationBuilder()
|
|
582
|
+
.fee({ amount: 5000 })
|
|
583
|
+
.sender(sender)
|
|
584
|
+
.nonce(blockHash)
|
|
585
|
+
.mint('tsol:usdc')
|
|
586
|
+
.rentExemptAmount(amount)
|
|
587
|
+
.build();
|
|
588
|
+
const explainedTransaction = tx.explainTransaction();
|
|
589
|
+
// Verify the tokenEnablements field exists and contains the correct data
|
|
590
|
+
explainedTransaction.should.have.property('tokenEnablements');
|
|
591
|
+
explainedTransaction.tokenEnablements.should.be.an.Array();
|
|
592
|
+
explainedTransaction.tokenEnablements.length.should.equal(1);
|
|
593
|
+
explainedTransaction.tokenEnablements[0].should.have.properties(['address', 'tokenName', 'tokenAddress']);
|
|
594
|
+
explainedTransaction.tokenEnablements[0].tokenName.should.equal('tsol:usdc');
|
|
595
|
+
// Verify displayOrder includes tokenEnablements
|
|
596
|
+
explainedTransaction.displayOrder.should.containEql('tokenEnablements');
|
|
597
|
+
// Verify other important fields
|
|
598
|
+
explainedTransaction.id.should.equal('UNAVAILABLE');
|
|
599
|
+
explainedTransaction.type.should.equal('AssociatedTokenAccountInitialization');
|
|
600
|
+
explainedTransaction.outputs.should.be.an.Array().and.be.empty();
|
|
601
|
+
explainedTransaction.fee.fee.should.equal('15000');
|
|
602
|
+
explainedTransaction.fee.feeRate.should.equal(5000);
|
|
603
|
+
explainedTransaction.blockhash.should.equal('5ne7phA48Jrvpn39AtupB8ZkCCAy8gLTfpGihZPuDqen');
|
|
604
|
+
should_1.default.not.exist(explainedTransaction.durableNonce);
|
|
605
|
+
});
|
|
606
|
+
it('should explain multiple token enablements in a transaction', async function () {
|
|
607
|
+
// Create a transaction with multiple token enablements
|
|
608
|
+
const txBuilder = factory.getAtaInitializationBuilder();
|
|
609
|
+
txBuilder.nonce(blockHash);
|
|
610
|
+
txBuilder.sender(sender);
|
|
611
|
+
txBuilder.enableToken({
|
|
612
|
+
ownerAddress: sender,
|
|
613
|
+
tokenName: 'tsol:usdc',
|
|
614
|
+
ataAddress: 'DfGJHsrY7RchVwPfigT4T3Wkc4zGq1kkbWzNaVQrDE4w',
|
|
615
|
+
});
|
|
616
|
+
txBuilder.enableToken({
|
|
617
|
+
ownerAddress: sender,
|
|
618
|
+
tokenName: 'tsol:ray',
|
|
619
|
+
ataAddress: 'GHhhPAuh5PdyeCM4zHPT7jz3jAGrXTPQu6mUMTtZ8TTf',
|
|
620
|
+
});
|
|
621
|
+
txBuilder.rentExemptAmount(amount);
|
|
622
|
+
txBuilder.fee({ amount: 5000 });
|
|
623
|
+
const tx = await txBuilder.build();
|
|
624
|
+
const explainedTransaction = tx.explainTransaction();
|
|
625
|
+
// Verify the tokenEnablements field contains multiple entries
|
|
626
|
+
explainedTransaction.should.have.property('tokenEnablements');
|
|
627
|
+
explainedTransaction.tokenEnablements.should.be.an.Array();
|
|
628
|
+
explainedTransaction.tokenEnablements.length.should.equal(2);
|
|
629
|
+
// Check the first token enablement
|
|
630
|
+
explainedTransaction.tokenEnablements[0].should.have.properties(['address', 'tokenName', 'tokenAddress']);
|
|
631
|
+
explainedTransaction.tokenEnablements[0].tokenName.should.equal('tsol:usdc');
|
|
632
|
+
// Check the second token enablement
|
|
633
|
+
explainedTransaction.tokenEnablements[1].should.have.properties(['address', 'tokenName', 'tokenAddress']);
|
|
634
|
+
explainedTransaction.tokenEnablements[1].tokenName.should.equal('tsol:ray');
|
|
635
|
+
// Verify outputs is empty (since token enablements are no longer added to outputs)
|
|
636
|
+
explainedTransaction.outputs.should.be.an.Array();
|
|
637
|
+
explainedTransaction.outputs.should.be.empty();
|
|
638
|
+
// Display order should include tokenEnablements
|
|
639
|
+
explainedTransaction.displayOrder.should.containEql('tokenEnablements');
|
|
640
|
+
});
|
|
641
|
+
it('should activate builder ', async function () {
|
|
642
|
+
const tx = await factory
|
|
643
|
+
.getStakingActivateBuilder()
|
|
644
|
+
.stakingAddress(stakeAccount.pub)
|
|
645
|
+
.sender(wallet.pub)
|
|
646
|
+
.nonce(blockHash)
|
|
647
|
+
.amount(amount)
|
|
648
|
+
.validator(validator.pub)
|
|
649
|
+
.fee({ amount: 5000 })
|
|
650
|
+
.build();
|
|
651
|
+
const explainedTransaction = tx.explainTransaction();
|
|
652
|
+
explainedTransaction.should.deepEqual({
|
|
653
|
+
displayOrder: [
|
|
654
|
+
'id',
|
|
655
|
+
'type',
|
|
656
|
+
'blockhash',
|
|
657
|
+
'durableNonce',
|
|
658
|
+
'outputAmount',
|
|
659
|
+
'changeAmount',
|
|
660
|
+
'outputs',
|
|
661
|
+
'changeOutputs',
|
|
662
|
+
'tokenEnablements',
|
|
663
|
+
'fee',
|
|
664
|
+
'memo',
|
|
665
|
+
],
|
|
666
|
+
id: 'UNAVAILABLE',
|
|
667
|
+
type: 'StakingActivate',
|
|
668
|
+
changeOutputs: [],
|
|
669
|
+
changeAmount: '0',
|
|
670
|
+
outputAmount: '10000',
|
|
671
|
+
outputs: [
|
|
672
|
+
{
|
|
673
|
+
address: '7dRuGFbU2y2kijP6o1LYNzVyz4yf13MooqoionCzv5Za',
|
|
674
|
+
amount: '10000',
|
|
675
|
+
},
|
|
676
|
+
],
|
|
677
|
+
fee: {
|
|
678
|
+
fee: '10000',
|
|
679
|
+
feeRate: 5000,
|
|
680
|
+
},
|
|
681
|
+
memo: undefined,
|
|
682
|
+
blockhash: '5ne7phA48Jrvpn39AtupB8ZkCCAy8gLTfpGihZPuDqen',
|
|
683
|
+
durableNonce: undefined,
|
|
684
|
+
tokenEnablements: [],
|
|
685
|
+
});
|
|
686
|
+
});
|
|
687
|
+
it('should deactivate builder ', async function () {
|
|
688
|
+
const recentBlockHash = 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi';
|
|
689
|
+
const tx = await factory
|
|
690
|
+
.getStakingDeactivateBuilder()
|
|
691
|
+
.stakingAddress(stakeAccount.pub)
|
|
692
|
+
.sender(wallet.pub)
|
|
693
|
+
.stakingAddress(stakeAccount.pub)
|
|
694
|
+
.nonce(recentBlockHash)
|
|
695
|
+
.fee({ amount: 5000 })
|
|
696
|
+
.build();
|
|
697
|
+
const explainedTransaction = tx.explainTransaction();
|
|
698
|
+
explainedTransaction.should.deepEqual({
|
|
699
|
+
displayOrder: [
|
|
700
|
+
'id',
|
|
701
|
+
'type',
|
|
702
|
+
'blockhash',
|
|
703
|
+
'durableNonce',
|
|
704
|
+
'outputAmount',
|
|
705
|
+
'changeAmount',
|
|
706
|
+
'outputs',
|
|
707
|
+
'changeOutputs',
|
|
708
|
+
'tokenEnablements',
|
|
709
|
+
'fee',
|
|
710
|
+
'memo',
|
|
711
|
+
],
|
|
712
|
+
id: 'UNAVAILABLE',
|
|
713
|
+
type: 'StakingDeactivate',
|
|
714
|
+
changeOutputs: [],
|
|
715
|
+
changeAmount: '0',
|
|
716
|
+
outputAmount: '0',
|
|
717
|
+
outputs: [],
|
|
718
|
+
fee: {
|
|
719
|
+
fee: '5000',
|
|
720
|
+
feeRate: 5000,
|
|
721
|
+
},
|
|
722
|
+
memo: undefined,
|
|
723
|
+
blockhash: 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi',
|
|
724
|
+
durableNonce: undefined,
|
|
725
|
+
tokenEnablements: [],
|
|
726
|
+
});
|
|
727
|
+
});
|
|
728
|
+
it('should explain withdraw transaction ', async function () {
|
|
729
|
+
const recentBlockHash = 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi';
|
|
730
|
+
const tx = await factory
|
|
731
|
+
.getStakingWithdrawBuilder()
|
|
732
|
+
.stakingAddress(stakeAccount.pub)
|
|
733
|
+
.sender(wallet.pub)
|
|
734
|
+
.amount(amount)
|
|
735
|
+
.nonce(recentBlockHash)
|
|
736
|
+
.fee({ amount: 5000 })
|
|
737
|
+
.build();
|
|
738
|
+
const explainedTransaction = tx.explainTransaction();
|
|
739
|
+
explainedTransaction.should.deepEqual({
|
|
740
|
+
displayOrder: [
|
|
741
|
+
'id',
|
|
742
|
+
'type',
|
|
743
|
+
'blockhash',
|
|
744
|
+
'durableNonce',
|
|
745
|
+
'outputAmount',
|
|
746
|
+
'changeAmount',
|
|
747
|
+
'outputs',
|
|
748
|
+
'changeOutputs',
|
|
749
|
+
'tokenEnablements',
|
|
750
|
+
'fee',
|
|
751
|
+
'memo',
|
|
752
|
+
],
|
|
753
|
+
id: 'UNAVAILABLE',
|
|
754
|
+
type: 'StakingWithdraw',
|
|
755
|
+
changeOutputs: [],
|
|
756
|
+
changeAmount: '0',
|
|
757
|
+
outputAmount: '10000',
|
|
758
|
+
outputs: [
|
|
759
|
+
{
|
|
760
|
+
address: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
|
|
761
|
+
amount: '10000',
|
|
762
|
+
},
|
|
763
|
+
],
|
|
764
|
+
fee: {
|
|
765
|
+
fee: '5000',
|
|
766
|
+
feeRate: 5000,
|
|
767
|
+
},
|
|
768
|
+
memo: undefined,
|
|
769
|
+
blockhash: 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi',
|
|
770
|
+
durableNonce: undefined,
|
|
771
|
+
tokenEnablements: [],
|
|
772
|
+
});
|
|
773
|
+
});
|
|
774
|
+
it('should explain withdraw transaction with memo and durable nonce ', async function () {
|
|
775
|
+
const tx = await factory
|
|
776
|
+
.getStakingWithdrawBuilder()
|
|
777
|
+
.stakingAddress(stakeAccount.pub)
|
|
778
|
+
.sender(wallet.pub)
|
|
779
|
+
.amount(amount)
|
|
780
|
+
.nonce(blockHash, { walletNonceAddress: testData.nonceAccount.pub, authWalletAddress: sender })
|
|
781
|
+
.memo('memo text')
|
|
782
|
+
.fee({ amount: 5000 })
|
|
783
|
+
.build();
|
|
784
|
+
tx.signablePayload;
|
|
785
|
+
const explainedTransaction = tx.explainTransaction();
|
|
786
|
+
explainedTransaction.should.deepEqual({
|
|
787
|
+
displayOrder: [
|
|
788
|
+
'id',
|
|
789
|
+
'type',
|
|
790
|
+
'blockhash',
|
|
791
|
+
'durableNonce',
|
|
792
|
+
'outputAmount',
|
|
793
|
+
'changeAmount',
|
|
794
|
+
'outputs',
|
|
795
|
+
'changeOutputs',
|
|
796
|
+
'tokenEnablements',
|
|
797
|
+
'fee',
|
|
798
|
+
'memo',
|
|
799
|
+
],
|
|
800
|
+
id: 'UNAVAILABLE',
|
|
801
|
+
type: 'StakingWithdraw',
|
|
802
|
+
changeOutputs: [],
|
|
803
|
+
changeAmount: '0',
|
|
804
|
+
outputAmount: '10000',
|
|
805
|
+
outputs: [
|
|
806
|
+
{
|
|
807
|
+
address: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
|
|
808
|
+
amount: '10000',
|
|
809
|
+
},
|
|
810
|
+
],
|
|
811
|
+
fee: {
|
|
812
|
+
fee: '5000',
|
|
813
|
+
feeRate: 5000,
|
|
814
|
+
},
|
|
815
|
+
memo: 'memo text',
|
|
816
|
+
blockhash: '5ne7phA48Jrvpn39AtupB8ZkCCAy8gLTfpGihZPuDqen',
|
|
817
|
+
durableNonce: {
|
|
818
|
+
walletNonceAddress: testData.nonceAccount.pub,
|
|
819
|
+
authWalletAddress: sender,
|
|
820
|
+
},
|
|
821
|
+
tokenEnablements: [],
|
|
822
|
+
});
|
|
823
|
+
});
|
|
824
|
+
it('should explain single token transfer transaction', async function () {
|
|
825
|
+
const tx = await factory
|
|
826
|
+
.getTokenTransferBuilder()
|
|
827
|
+
.nonce(blockHash)
|
|
828
|
+
.sender(sender)
|
|
829
|
+
.send({ address, amount, tokenName: 'tsol:usdc' })
|
|
830
|
+
.fee({ amount: 5000 })
|
|
831
|
+
.build();
|
|
832
|
+
const explainedTransaction = tx.explainTransaction();
|
|
833
|
+
explainedTransaction.should.deepEqual({
|
|
834
|
+
displayOrder: [
|
|
835
|
+
'id',
|
|
836
|
+
'type',
|
|
837
|
+
'blockhash',
|
|
838
|
+
'durableNonce',
|
|
839
|
+
'outputAmount',
|
|
840
|
+
'changeAmount',
|
|
841
|
+
'outputs',
|
|
842
|
+
'changeOutputs',
|
|
843
|
+
'tokenEnablements',
|
|
844
|
+
'fee',
|
|
845
|
+
'memo',
|
|
846
|
+
],
|
|
847
|
+
id: 'UNAVAILABLE',
|
|
848
|
+
type: 'Send',
|
|
849
|
+
changeOutputs: [],
|
|
850
|
+
changeAmount: '0',
|
|
851
|
+
outputAmount: '0',
|
|
852
|
+
outputs: [
|
|
853
|
+
{
|
|
854
|
+
address: 'DesU7XscZjng8yj5VX6AZsk3hWSW4sQ3rTG2LuyQ2P4H',
|
|
855
|
+
amount: '10000',
|
|
856
|
+
tokenName: 'tsol:usdc',
|
|
857
|
+
},
|
|
858
|
+
],
|
|
859
|
+
fee: {
|
|
860
|
+
fee: '5000',
|
|
861
|
+
feeRate: 5000,
|
|
862
|
+
},
|
|
863
|
+
memo: undefined,
|
|
864
|
+
blockhash: '5ne7phA48Jrvpn39AtupB8ZkCCAy8gLTfpGihZPuDqen',
|
|
865
|
+
durableNonce: undefined,
|
|
866
|
+
tokenEnablements: [],
|
|
867
|
+
});
|
|
868
|
+
});
|
|
869
|
+
it('should explain single token transfer transaction with optional params', async function () {
|
|
870
|
+
const tx = await factory
|
|
871
|
+
.getTokenTransferBuilder()
|
|
872
|
+
.nonce(blockHash)
|
|
873
|
+
.sender(sender)
|
|
874
|
+
.send({
|
|
875
|
+
address,
|
|
876
|
+
amount,
|
|
877
|
+
tokenName: 'tsol:ams',
|
|
878
|
+
tokenAddress: 'F4uLeXioFz3hw13MposuwaQbMcZbCjqvEGPPeRRB1Byf',
|
|
879
|
+
programId: 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',
|
|
880
|
+
decimalPlaces: 9,
|
|
881
|
+
})
|
|
882
|
+
.fee({ amount: 5000 })
|
|
883
|
+
.build();
|
|
884
|
+
const explainedTransaction = tx.explainTransaction();
|
|
885
|
+
explainedTransaction.should.deepEqual({
|
|
886
|
+
displayOrder: [
|
|
887
|
+
'id',
|
|
888
|
+
'type',
|
|
889
|
+
'blockhash',
|
|
890
|
+
'durableNonce',
|
|
891
|
+
'outputAmount',
|
|
892
|
+
'changeAmount',
|
|
893
|
+
'outputs',
|
|
894
|
+
'changeOutputs',
|
|
895
|
+
'tokenEnablements',
|
|
896
|
+
'fee',
|
|
897
|
+
'memo',
|
|
898
|
+
],
|
|
899
|
+
id: 'UNAVAILABLE',
|
|
900
|
+
type: 'Send',
|
|
901
|
+
changeOutputs: [],
|
|
902
|
+
changeAmount: '0',
|
|
903
|
+
outputAmount: '0',
|
|
904
|
+
outputs: [
|
|
905
|
+
{
|
|
906
|
+
address: 'DesU7XscZjng8yj5VX6AZsk3hWSW4sQ3rTG2LuyQ2P4H',
|
|
907
|
+
amount: '10000',
|
|
908
|
+
tokenName: 'tsol:ams',
|
|
909
|
+
},
|
|
910
|
+
],
|
|
911
|
+
fee: {
|
|
912
|
+
fee: '5000',
|
|
913
|
+
feeRate: 5000,
|
|
914
|
+
},
|
|
915
|
+
memo: undefined,
|
|
916
|
+
blockhash: '5ne7phA48Jrvpn39AtupB8ZkCCAy8gLTfpGihZPuDqen',
|
|
917
|
+
durableNonce: undefined,
|
|
918
|
+
tokenEnablements: [],
|
|
919
|
+
});
|
|
920
|
+
});
|
|
921
|
+
it('should explain multi token transfer with durable nonce and memo transaction', async function () {
|
|
922
|
+
const tx = await factory
|
|
923
|
+
.getTokenTransferBuilder()
|
|
924
|
+
.nonce(blockHash, { walletNonceAddress: testData.nonceAccount.pub, authWalletAddress: sender })
|
|
925
|
+
.sender(sender)
|
|
926
|
+
.memo('memo text')
|
|
927
|
+
.send({ address, amount, tokenName: 'tsol:usdc' })
|
|
928
|
+
.send({ address: testData.addresses.validAddresses[1], amount, tokenName: 'tsol:usdc' })
|
|
929
|
+
.send({ address: testData.addresses.validAddresses[2], amount, tokenName: 'tsol:usdc' })
|
|
930
|
+
.build();
|
|
931
|
+
const explainedTransaction = tx.explainTransaction();
|
|
932
|
+
explainedTransaction.should.deepEqual({
|
|
933
|
+
displayOrder: [
|
|
934
|
+
'id',
|
|
935
|
+
'type',
|
|
936
|
+
'blockhash',
|
|
937
|
+
'durableNonce',
|
|
938
|
+
'outputAmount',
|
|
939
|
+
'changeAmount',
|
|
940
|
+
'outputs',
|
|
941
|
+
'changeOutputs',
|
|
942
|
+
'tokenEnablements',
|
|
943
|
+
'fee',
|
|
944
|
+
'memo',
|
|
945
|
+
],
|
|
946
|
+
id: 'UNAVAILABLE',
|
|
947
|
+
type: 'Send',
|
|
948
|
+
changeOutputs: [],
|
|
949
|
+
changeAmount: '0',
|
|
950
|
+
outputAmount: '0',
|
|
951
|
+
outputs: [
|
|
952
|
+
{
|
|
953
|
+
address: 'DesU7XscZjng8yj5VX6AZsk3hWSW4sQ3rTG2LuyQ2P4H',
|
|
954
|
+
amount: '10000',
|
|
955
|
+
tokenName: 'tsol:usdc',
|
|
956
|
+
},
|
|
957
|
+
{
|
|
958
|
+
address: 'Azz9EmNuhtjoYrhWvidWx1Hfd14SNBsYyzXhA9Tnoca8',
|
|
959
|
+
amount: '10000',
|
|
960
|
+
tokenName: 'tsol:usdc',
|
|
961
|
+
},
|
|
962
|
+
{
|
|
963
|
+
address: '2n2xqWM9Z18LqxfJzkNrMMFWiDUFYA2k6WSgSnf6EnJs',
|
|
964
|
+
amount: '10000',
|
|
965
|
+
tokenName: 'tsol:usdc',
|
|
966
|
+
},
|
|
967
|
+
],
|
|
968
|
+
fee: {
|
|
969
|
+
fee: 'UNAVAILABLE',
|
|
970
|
+
feeRate: undefined,
|
|
971
|
+
},
|
|
972
|
+
memo: 'memo text',
|
|
973
|
+
blockhash: '5ne7phA48Jrvpn39AtupB8ZkCCAy8gLTfpGihZPuDqen',
|
|
974
|
+
durableNonce: {
|
|
975
|
+
authWalletAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
|
|
976
|
+
walletNonceAddress: '8Y7RM6JfcX4ASSNBkrkrmSbRu431YVi9Y3oLFnzC2dCh',
|
|
977
|
+
},
|
|
978
|
+
tokenEnablements: [],
|
|
979
|
+
});
|
|
980
|
+
});
|
|
981
|
+
});
|
|
982
|
+
});
|
|
983
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsb0RBQTRCO0FBQzVCLGlEQUE0QztBQUM1Qyx1Q0FBcUQ7QUFDckQsMkRBQTZDO0FBQzdDLDZDQUEyRTtBQUMzRSwyREFBd0Q7QUFFeEQsUUFBUSxDQUFDLGlCQUFpQixFQUFFLEdBQUcsRUFBRTtJQUMvQixNQUFNLElBQUksR0FBRyxlQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRS9CLFFBQVEsQ0FBQyxlQUFlLEVBQUUsR0FBRyxFQUFFO1FBQzdCLEVBQUUsQ0FBQyx5QkFBeUIsRUFBRSxHQUFHLEVBQUU7WUFDakMsTUFBTSxFQUFFLEdBQUcsSUFBSSxpQkFBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pDLGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1lBQ3RELGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDbkUsQ0FBQyxDQUFDLENBQUM7UUFDSCxFQUFFLENBQUMsOEJBQThCLEVBQUUsR0FBRyxFQUFFO1lBQ3RDLE1BQU0sRUFBRSxHQUFHLElBQUksaUJBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQyxJQUFBLGdCQUFNLEVBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDMUQsRUFBRSxDQUFDLGNBQWMsR0FBRyxJQUFJLHFCQUFjLEVBQUUsQ0FBQztZQUN6QyxF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QUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBLZXlQYWlyLCBUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uL3NyYy9saWInO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vcmVzb3VyY2VzL3NvbCc7XG5pbXBvcnQgeyBQdWJsaWNLZXksIFRyYW5zYWN0aW9uIGFzIFNvbFRyYW5zYWN0aW9uIH0gZnJvbSAnQHNvbGFuYS93ZWIzLmpzJztcbmltcG9ydCB7IGdldEJ1aWxkZXJGYWN0b3J5IH0gZnJvbSAnLi9nZXRCdWlsZGVyRmFjdG9yeSc7XG5cbmRlc2NyaWJlKCdTb2wgVHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gIGNvbnN0IGNvaW4gPSBjb2lucy5nZXQoJ3Rzb2wnKTtcblxuICBkZXNjcmliZSgndG9Kc29uIHNob3VsZCcsICgpID0+IHtcbiAgICBpdCgndGhyb3cgZW1wdHkgdHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2luKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHgudG9Kc29uKCksIC9FbXB0eSB0cmFuc2FjdGlvbi8pO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLCAvRW1wdHkgdHJhbnNhY3Rpb24vKTtcbiAgICB9KTtcbiAgICBpdCgndGhyb3cgZm9yIHRvSnNvbiBvZiBlbXB0eSB0eCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW4pO1xuICAgICAgc2hvdWxkKCgpID0+IHR4LnRvSnNvbigpKS50aHJvd0Vycm9yKCdFbXB0eSB0cmFuc2FjdGlvbicpO1xuICAgICAgdHguc29sVHJhbnNhY3Rpb24gPSBuZXcgU29sVHJhbnNhY3Rpb24oKTtcbiAgICAgIHR4LnNvbFRyYW5zYWN0aW9uLnJlY2VudEJsb2NraGFzaCA9IHRlc3REYXRhLmJsb2NrSGFzaGVzLnZhbGlkQmxvY2tIYXNoZXNbMF07XG4gICAgICBzaG91bGQoKCkgPT4gdHgudG9Kc29uKCkpLnRocm93RXJyb3IoJ0ludmFsaWQgdHJhbnNhY3Rpb24sIHRyYW5zYWN0aW9uIHR5cGUgbm90IHN1cHBvcnRlZDogdW5kZWZpbmVkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc3VjY2VlZCBmb3IgYSB1bnNpZ25lZCB0cmFuc2ZlciB0eCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW4pO1xuICAgICAgdHguZnJvbVJhd1RyYW5zYWN0aW9uKHRlc3REYXRhLlRSQU5TRkVSX1VOU0lHTkVEX1RYX1dJVEhfTUVNT19BTkRfRFVSQUJMRV9OT05DRSk7XG4gICAgICB0eC5zaWduYXR1cmUuc2hvdWxkLmJlLmVtcHR5KCk7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHR4SnNvbi5zaG91bGQuaGF2ZS5wcm9wZXJ0aWVzKFsnaWQnLCAnZmVlUGF5ZXInLCAnbm9uY2UnLCAnbnVtU2lnbmF0dXJlcycsICdpbnN0cnVjdGlvbnNEYXRhJ10pO1xuICAgICAgdHhKc29uLmlkPy5zaG91bGQuZXF1YWwodW5kZWZpbmVkKTtcbiAgICAgIHR4SnNvbi5mZWVQYXllcj8uc2hvdWxkLmVxdWFsKCc1aHI1ZmlzUGk2RFhOdXVScG01WFVienBpRW5tZHl4WHVCRFR3endaajVQZScpO1xuICAgICAgdHhKc29uLm5vbmNlLnNob3VsZC5lcXVhbCgnR0h0WFFCc29aSFZuTkZhOVlldkF6RnIxN0RKamdIWGszeWNUS0Q1eEQzWmknKTtcbiAgICAgIHR4SnNvbi5udW1TaWduYXR1cmVzLnNob3VsZC5lcXVhbCgwKTtcbiAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhLmxlbmd0aC5zaG91bGQuZXF1YWwoMyk7XG4gICAgICB0eEpzb24ubGFtcG9ydHNQZXJTaWduYXR1cmU/LnNob3VsZC5iZS51bmRlZmluZWQoKTtcbiAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhLnNob3VsZC5kZWVwRXF1YWwoW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ05vbmNlQWR2YW5jZScsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICB3YWxsZXROb25jZUFkZHJlc3M6ICc4WTdSTTZKZmNYNEFTU05Ca3Jrcm1TYlJ1NDMxWVZpOVkzb0xGbnpDMmRDaCcsXG4gICAgICAgICAgICBhdXRoV2FsbGV0QWRkcmVzczogJzVocjVmaXNQaTZEWE51dVJwbTVYVWJ6cGlFbm1keXhYdUJEVHd6d1pqNVBlJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ1RyYW5zZmVyJyxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIGZyb21BZGRyZXNzOiAnNWhyNWZpc1BpNkRYTnV1UnBtNVhVYnpwaUVubWR5eFh1QkRUd3p3Wmo1UGUnLFxuICAgICAgICAgICAgdG9BZGRyZXNzOiAnQ1A1RHBhYTQyUnRKbU11S3FDUXNMd21hNVloM2tudXZLc1lERlg4NUY0MVMnLFxuICAgICAgICAgICAgYW1vdW50OiAnMzAwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ01lbW8nLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgbWVtbzogJ3Rlc3QgbWVtbycsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3N1Y2NlZWQgZm9yIGEgbXVsdGkgdHJhbnNmZXIgdHgnLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2luKTtcbiAgICAgIHR4LmZyb21SYXdUcmFuc2FjdGlvbih0ZXN0RGF0YS5NVUxUSV9UUkFOU0ZFUl9TSUdORUQpO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICB0eEpzb24uc2hvdWxkLmhhdmUucHJvcGVydGllcyhbJ2lkJywgJ2ZlZVBheWVyJywgJ25vbmNlJywgJ251bVNpZ25hdHVyZXMnLCAnaW5zdHJ1Y3Rpb25zRGF0YSddKTtcbiAgICAgIHR4SnNvbi5pZD8uc2hvdWxkLmVxdWFsKFxuICAgICAgICAnVFBWY2MxOENZeFBuTTNlUmdRaGRiNlY2WkxhMzREdjNkVTdNdHZLUHV5NVpQS0xNMXVaUEZGRW1GMm0xODRQVFdLUloxVXE2TktGWld3cjJrcktrNjNmJ1xuICAgICAgKTtcbiAgICAgIHR4LnNpZ25hdHVyZS5zaG91bGQuZGVlcEVxdWFsKFtcbiAgICAgICAgJ1RQVmNjMThDWXhQbk0zZVJnUWhkYjZWNlpMYTM0RHYzZFU3TXR2S1B1eTVaUEtMTTF1WlBGRkVtRjJtMTg0UFRXS1JaMVVxNk5LRlpXd3Iya3JLazYzZicsXG4gICAgICBdKTtcbiAgICAgIHR4SnNvbi5mZWVQYXllcj8uc2hvdWxkLmVxdWFsKCc1aHI1ZmlzUGk2RFhOdXVScG01WFVienBpRW5tZHl4WHVCRFR3endaajVQZScpO1xuICAgICAgdHhKc29uLm5vbmNlLnNob3VsZC5lcXVhbCgnR0h0WFFCc29aSFZuTkZhOVlldkF6RnIxN0RKamdIWGszeWNUS0Q1eEQzWmknKTtcbiAgICAgIHR4SnNvbi5udW1TaWduYXR1cmVzLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4SnNvbi5sYW1wb3J0c1BlclNpZ25hdHVyZT8uc2hvdWxkLmJlLnVuZGVmaW5lZCgpO1xuICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGEubGVuZ3RoLnNob3VsZC5lcXVhbCg4KTtcbiAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhLnNob3VsZC5kZWVwRXF1YWwoW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ05vbmNlQWR2YW5jZScsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICB3YWxsZXROb25jZUFkZHJlc3M6ICc4WTdSTTZKZmNYNEFTU05Ca3Jrcm1TYlJ1NDMxWVZpOVkzb0xGbnpDMmRDaCcsXG4gICAgICAgICAgICBhdXRoV2FsbGV0QWRkcmVzczogJzVocjVmaXNQaTZEWE51dVJwbTVYVWJ6cGlFbm1keXhYdUJEVHd6d1pqNVBlJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ1RyYW5zZmVyJyxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIGZyb21BZGRyZXNzOiAnNWhyNWZpc1BpNkRYTnV1UnBtNVhVYnpwaUVubWR5eFh1QkRUd3p3Wmo1UGUnLFxuICAgICAgICAgICAgdG9BZGRyZXNzOiAnQ1A1RHBhYTQyUnRKbU11S3FDUXNMd21hNVloM2tudXZLc1lERlg4NUY0MVMnLFxuICAgICAgICAgICAgYW1vdW50OiAnMzAwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ1RyYW5zZmVyJyxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIGZyb21BZGRyZXNzOiAnNWhyNWZpc1BpNkRYTnV1UnBtNVhVYnpwaUVubWR5eFh1QkRUd3p3Wmo1UGUnLFxuICAgICAgICAgICAgdG9BZGRyZXNzOiAnNkI1NVhNaWFTNnRVWnc1VHQzRzFSYVhBcWRydk4zOHlYVkRKbVd2S0xraU0nLFxuICAgICAgICAgICAgYW1vdW50OiAnMzAwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ1RyYW5zZmVyJyxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIGZyb21BZGRyZXNzOiAnNWhyNWZpc1BpNkRYTnV1UnBtNVhVYnpwaUVubWR5eFh1QkRUd3p3Wmo1UGUnLFxuICAgICAgICAgICAgdG9BZGRyZXNzOiAnQzFVanB4Y1hOQnBwMVV5dllzdU5CTlo1RGExRzFpNDlnM3lUdkMyM055N2UnLFxuICAgICAgICAgICAgYW1vdW50OiAnMzAwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ1RyYW5zZmVyJyxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIGZyb21BZGRyZXNzOiAnNWhyNWZpc1BpNkRYTnV1UnBtNVhVYnpwaUVubWR5eFh1QkRUd3p3Wmo1UGUnLFxuICAgICAgICAgICAgdG9BZGRyZXNzOiAnQ3BVWVhoOXhYb1dma0JWYUJRUlo4bkFnRGJUMTZHWmVRZHF2ZWVCUzFobWsnLFxuICAgICAgICAgICAgYW1vdW50OiAnMzAwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ1RyYW5zZmVyJyxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIGZyb21BZGRyZXNzOiAnNWhyNWZpc1BpNkRYTnV1UnBtNVhVYnpwaUVubWR5eFh1QkRUd3p3Wmo1UGUnLFxuICAgICAgICAgICAgdG9BZGRyZXNzOiAnNjRzNk5qbUVva2RoaWNIRWQ0MzJYNVV0MkVEZkRtVnFkdkdoNHJBU24xZ2QnLFxuICAgICAgICAgICAgYW1vdW50OiAnMzAwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ1RyYW5zZmVyJyxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIGZyb21BZGRyZXNzOiAnNWhyNWZpc1BpNkRYTnV1UnBtNVhVYnpwaUVubWR5eFh1QkRUd3p3Wmo1UGUnLFxuICAgICAgICAgICAgdG9BZGRyZXNzOiAnNm5YeEwyak1TZGtnZkhtMTNUd3ZuMWd6UkFQZHJXbldMZnU4OVBKTDNBcWUnLFxuICAgICAgICAgICAgYW1vdW50OiAnMzAwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ01lbW8nLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgbWVtbzogJ3Rlc3QgbWVtbycsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2lnbiBzaG91bGQnLCAoKSA9PiB7XG4gICAgaXQoJ2ZhaWwgaWYgdGhlIHR4IGRvZXNudCBoYXZlIG5vbmNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbik7XG4gICAgICB0eC5zb2xUcmFuc2FjdGlvbiA9IG5ldyBTb2xUcmFuc2FjdGlvbigpO1xuICAgICAgdHguc29sVHJhbnNhY3Rpb24uZmVlUGF5ZXIgPSBuZXcgUHVibGljS2V5KHRlc3REYXRhLmF1dGhBY2NvdW50LnB1Yik7XG4gICAgICBjb25zdCBrcCA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5wcnZLZXlzLnBydktleTEuYmFzZTU4IH0pO1xuICAgICAgYXdhaXQgdHguc2lnbihrcCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnTm9uY2UgaXMgcmVxdWlyZWQgYmVmb3JlIHNpZ25pbmcnKTtcbiAgICB9KTtcblxuICAgIGl0KCdmYWlsIGlmIHRoZSB0eCBkb2VzbnQgaGF2ZSBmZWVQYXllcicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW4pO1xuICAgICAgY29uc3Qga3AgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEucHJ2S2V5cy5wcnZLZXkxLmJhc2U1OCB9KTtcbiAgICAgIHR4LnNvbFRyYW5zYWN0aW9uID0gbmV3IFNvbFRyYW5zYWN0aW9uKCk7XG4gICAgICB0eC5zb2xUcmFuc2FjdGlvbi5yZWNlbnRCbG9ja2hhc2ggPSB0ZXN0RGF0YS5ibG9ja0hhc2hlcy52YWxpZEJsb2NrSGFzaGVzWzBdO1xuICAgICAgYXdhaXQgdHguc2lnbihrcCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnZmVlUGF5ZXIgaXMgcmVxdWlyZWQgYmVmb3JlIHNpZ25pbmcnKTtcbiAgICB9KTtcblxuICAgIGl0KCdmYWlsIGlmIHRoZSBLZXlQYWlyIGlzIG5vdCB0aGUgcmlnaHQgb25lJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbik7XG4gICAgICB0eC5mcm9tUmF3VHJhbnNhY3Rpb24odGVzdERhdGEuUkFXX1RYX1VOU0lHTkVEKTtcbiAgICAgIGNvbnN0IGtleXBhaXIgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEucHJ2S2V5cy5wcnZLZXkxLmJhc2U1OCB9KTtcbiAgICAgIGF3YWl0IHR4LnNpZ24oa2V5cGFpcikuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgndW5rbm93biBzaWduZXI6IENQNURwYWE0MlJ0Sm1NdUtxQ1FzTHdtYTVZaDNrbnV2S3NZREZYODVGNDFTJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnZmFpbCBpZiB0aGUgS2V5UGFpciBkb2VzbnQgaGF2ZSBhIHBydiBrZXknLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2luKTtcbiAgICAgIHR4LmZyb21SYXdUcmFuc2FjdGlvbih0ZXN0RGF0YS5SQVdfVFhfVU5TSUdORUQpO1xuICAgICAgY29uc3Qga2V5cGFpciA9IG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5wdWJLZXlzLnZhbGlkUHViS2V5c1swXSB9KTtcbiAgICAgIGF3YWl0IHR4LnNpZ24oa2V5cGFpcikuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnTWlzc2luZyBwcml2YXRlIGtleScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3N1Y2NlZWQgdG8gc2lnbiB3aXRoIDEgS2V5UGFpcicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW4pO1xuICAgICAgdHguZnJvbVJhd1RyYW5zYWN0aW9uKHRlc3REYXRhLlJBV19UWF9VTlNJR05FRCk7XG4gICAgICBjb25zdCBrZXlwYWlyID0gbmV3IEtleVBhaXIoeyBwcnY6IHRlc3REYXRhLmFjY291bnRXaXRoU2VlZC5wcml2YXRlS2V5LmJhc2U1OCB9KTtcbiAgICAgIGF3YWl0IHR4LnNpZ24oa2V5cGFpcikuc2hvdWxkLmJlLmZ1bGZpbGxlZCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksIHRlc3REYXRhLlJBV19UWF9TSUdORUQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3N1Y2NlZWQgd2hlbiB0cnkgdG8gc2lnbiB3aXRoIHRoZSBzYW1lIGtleVBhaXIgbXVsdGlwbGUgdGltZXMgJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbik7XG4gICAgICB0eC5mcm9tUmF3VHJhbnNhY3Rpb24odGVzdERhdGEuUkFXX1RYX1VOU0lHTkVEKTtcbiAgICAgIGNvbnN0IGtleXBhaXIgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEuYWNjb3VudFdpdGhTZWVkLnByaXZhdGVLZXkuYmFzZTU4IH0pO1xuICAgICAgYXdhaXQgdHguc2lnbihba2V5cGFpciwga2V5cGFpciwga2V5cGFpciwga2V5cGFpcl0pLnNob3VsZC5iZS5mdWxmaWxsZWQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLCB0ZXN0RGF0YS5SQVdfVFhfU0lHTkVEKTtcbiAgICB9KTtcblxuICAgIGl0KCdzdWNjZWVkIHdoZW4gdHJ5IHRvIHNpZ24gd2l0aCBhIGtleVBhaXIgdGhhdCBhbHJlYWR5IHNpZ25lZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW4pO1xuICAgICAgdHguZnJvbVJhd1RyYW5zYWN0aW9uKHRlc3REYXRhLlJBV19UWF9TSUdORUQpO1xuICAgICAgY29uc3Qga2V5cGFpciA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5hY2NvdW50V2l0aFNlZWQucHJpdmF0ZUtleS5iYXNlNTggfSk7XG4gICAgICBhd2FpdCB0eC5zaWduKGtleXBhaXIpLnNob3VsZC5iZS5mdWxmaWxsZWQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLCB0ZXN0RGF0YS5SQVdfVFhfU0lHTkVEKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3RyYW5zYWN0aW9uIHBhcnNpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ2Zyb21SYXdUcmFuc2FjdGlvbiBhbmQgdG9Ccm9hZGNhc3RGb3JtYXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2luKTtcbiAgICAgIHR4LmZyb21SYXdUcmFuc2FjdGlvbih0ZXN0RGF0YS5SQVdfVFhfVU5TSUdORUQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksIHRlc3REYXRhLlJBV19UWF9VTlNJR05FRCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZnJvbVJhd1RyYW5zYWN0aW9uLCBzaWduIGFuZCB0b0Jyb2FkY2FzdEZvcm1hdCAnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2luKTtcbiAgICAgIHR4LmZyb21SYXdUcmFuc2FjdGlvbih0ZXN0RGF0YS5SQVdfVFhfVU5TSUdORUQpO1xuICAgICAgY29uc3Qga2V5cGFpciA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5hY2NvdW50V2l0aFNlZWQucHJpdmF0ZUtleS5iYXNlNTggfSk7XG4gICAgICBhd2FpdCB0eC5zaWduKGtleXBhaXIpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksIHRlc3REYXRhLlJBV19UWF9TSUdORUQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZXhwbGFpbiB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBmYWN0b3J5ID0gZ2V0QnVpbGRlckZhY3RvcnkoJ3Rzb2wnKTtcbiAgICBjb25zdCBibG9ja0hhc2ggPSB0ZXN0RGF0YS5ibG9ja0hhc2hlcy52YWxpZEJsb2NrSGFzaGVzWzBdO1xuICAgIGNvbnN0IHNlbmRlciA9IHRlc3REYXRhLmF1dGhBY2NvdW50LnB1YjtcbiAgICBjb25zdCBhZGRyZXNzID0gdGVzdERhdGEuYWRkcmVzc2VzLnZhbGlkQWRkcmVzc2VzWzBdO1xuICAgIGNvbnN0IGFtb3VudCA9ICcxMDAwMCc7XG4gICAgY29uc3Qgd2FsbGV0ID0gbmV3IEtleVBhaXIodGVzdERhdGEuYXV0aEFjY291bnQpLmdldEtleXMoKTtcbiAgICBjb25zdCBzdGFrZUFjY291bnQgPSBuZXcgS2V5UGFpcih0ZXN0RGF0YS5zdGFrZUFjY291bnQpLmdldEtleXMoKTtcbiAgICBjb25zdCB2YWxpZGF0b3IgPSB0ZXN0RGF0YS52YWxpZGF0b3I7XG5cbiAgICBpdCgnc2hvdWxkIGV4cGxhaW4gc2luZ2xlIHRyYW5zZmVyIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBhd2FpdCBmYWN0b3J5XG4gICAgICAgIC5nZXRUcmFuc2ZlckJ1aWxkZXIoKVxuICAgICAgICAubm9uY2UoYmxvY2tIYXNoKVxuICAgICAgICAuc2VuZGVyKHNlbmRlcilcbiAgICAgICAgLnNlbmQoeyBhZGRyZXNzLCBhbW91bnQgfSlcbiAgICAgICAgLmZlZSh7IGFtb3VudDogNTAwMCB9KVxuICAgICAgICAuYnVpbGQoKTtcblxuICAgICAgY29uc3QgZXhwbGFpbmVkVHJhbnNhY3Rpb24gPSB0eC5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgICAgIGV4cGxhaW5lZFRyYW5zYWN0aW9uLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBkaXNwbGF5T3JkZXI6IFtcbiAgICAgICAgICAnaWQnLFxuICAgICAgICAgICd0eXBlJyxcbiAgICAgICAgICAnYmxvY2toYXNoJyxcbiAgICAgICAgICAnZHVyYWJsZU5vbmNlJyxcbiAgICAgICAgICAnb3V0cHV0QW1vdW50JyxcbiAgICAgICAgICAnY2hhbmdlQW1vdW50JyxcbiAgICAgICAgICAnb3V0cHV0cycsXG4gICAgICAgICAgJ2NoYW5nZU91dHB1dHMnLFxuICAgICAgICAgICd0b2tlbkVuYWJsZW1lbnRzJyxcbiAgICAgICAgICAnZmVlJyxcbiAgICAgICAgICAnbWVtbycsXG4gICAgICAgIF0sXG4gICAgICAgIGlkOiAnVU5BVkFJTEFCTEUnLFxuICAgICAgICB0eXBlOiAnU2VuZCcsXG4gICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICAgICAgb3V0cHV0QW1vdW50OiAnMTAwMDAnLFxuICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogJ0Rlc1U3WHNjWmpuZzh5ajVWWDZBWnNrM2hXU1c0c1EzclRHMkx1eVEyUDRIJyxcbiAgICAgICAgICAgIGFtb3VudDogJzEwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBmZWU6IHtcbiAgICAgICAgICBmZWU6ICc1MDAwJyxcbiAgICAgICAgICBmZWVSYXRlOiA1MDAwLFxuICAgICAgICB9LFxuICAgICAgICBtZW1vOiB1bmRlZmluZWQsXG4gICAgICAgIGJsb2NraGFzaDogJzVuZTdwaEE0OEpydnBuMzlBdHVwQjhaa0NDQXk4Z0xUZnBHaWhaUHVEcWVuJyxcbiAgICAgICAgZHVyYWJsZU5vbmNlOiB1bmRlZmluZWQsXG4gICAgICAgIHRva2VuRW5hYmxlbWVudHM6IFtdLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGV4cGxhaW4gc2luZ2xlIHRyYW5zZmVyIHdpdGggZHVyYWJsZSBub25jZSB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgZmFjdG9yeVxuICAgICAgICAuZ2V0VHJhbnNmZXJCdWlsZGVyKClcbiAgICAgICAgLm5vbmNlKGJsb2NrSGFzaCwgeyB3YWxsZXROb25jZUFkZHJlc3M6IHRlc3REYXRhLm5vbmNlQWNjb3VudC5wdWIsIGF1dGhXYWxsZXRBZGRyZXNzOiBzZW5kZXIgfSlcbiAgICAgICAgLnNlbmRlcihzZW5kZXIpXG4gICAgICAgIC5zZW5kKHsgYWRkcmVzcywgYW1vdW50IH0pXG4gICAgICAgIC5idWlsZCgpO1xuXG4gICAgICBjb25zdCBleHBsYWluZWRUcmFuc2FjdGlvbiA9IHR4LmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGRpc3BsYXlPcmRlcjogW1xuICAgICAgICAgICdpZCcsXG4gICAgICAgICAgJ3R5cGUnLFxuICAgICAgICAgICdibG9ja2hhc2gnLFxuICAgICAgICAgICdkdXJhYmxlTm9uY2UnLFxuICAgICAgICAgICdvdXRwdXRBbW91bnQnLFxuICAgICAgICAgICdjaGFuZ2VBbW91bnQnLFxuICAgICAgICAgICdvdXRwdXRzJyxcbiAgICAgICAgICAnY2hhbmdlT3V0cHV0cycsXG4gICAgICAgICAgJ3Rva2VuRW5hYmxlbWVudHMnLFxuICAgICAgICAgICdmZWUnLFxuICAgICAgICAgICdtZW1vJyxcbiAgICAgICAgXSxcbiAgICAgICAgaWQ6ICdVTkFWQUlMQUJMRScsXG4gICAgICAgIHR5cGU6ICdTZW5kJyxcbiAgICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICAgIGNoYW5nZUFtb3VudDogJzAnLFxuICAgICAgICBvdXRwdXRBbW91bnQ6ICcxMDAwMCcsXG4gICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiAnRGVzVTdYc2Naam5nOHlqNVZYNkFac2szaFdTVzRzUTNyVEcyTHV5UTJQNEgnLFxuICAgICAgICAgICAgYW1vdW50OiAnMTAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGZlZToge1xuICAgICAgICAgIGZlZTogJ1VOQVZBSUxBQkxFJyxcbiAgICAgICAgICBmZWVSYXRlOiB1bmRlZmluZWQsXG4gICAgICAgIH0sXG4gICAgICAgIG1lbW86IHVuZGVmaW5lZCxcbiAgICAgICAgYmxvY2toYXNoOiAnNW5lN3BoQTQ4SnJ2cG4zOUF0dXBCOFprQ0NBeThnTFRmcEdpaFpQdURxZW4nLFxuICAgICAgICBkdXJhYmxlTm9uY2U6IHtcbiAgICAgICAgICBhdXRoV2FsbGV0QWRkcmVzczogJzVocjVmaXNQaTZEWE51dVJwbTVYVWJ6cGlFbm1keXhYdUJEVHd6d1pqNVBlJyxcbiAgICAgICAgICB3YWxsZXROb25jZUFkZHJlc3M6ICc4WTdSTTZKZmNYNEFTU05Ca3Jrcm1TYlJ1NDMxWVZpOVkzb0xGbnpDMmRDaCcsXG4gICAgICAgIH0sXG4gICAgICAgIHRva2VuRW5hYmxlbWVudHM6IFtdLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGV4cGxhaW4gbXVsdGkgdHJhbnNmZXIgd2l0aCBkdXJhYmxlIG5vbmNlIGFuZCBtZW1vIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBhd2FpdCBmYWN0b3J5XG4gICAgICAgIC5nZXRUcmFuc2ZlckJ1aWxkZXIoKVxuICAgICAgICAubm9uY2UoYmxvY2tIYXNoLCB7IHdhbGxldE5vbmNlQWRkcmVzczogdGVzdERhdGEubm9uY2VBY2NvdW50LnB1YiwgYXV0aFdhbGxldEFkZHJlc3M6IHNlbmRlciB9KVxuICAgICAgICAuc2VuZGVyKHNlbmRlcilcbiAgICAgICAgLm1lbW8oJ21lbW8gdGV4dCcpXG4gICAgICAgIC5zZW5kKHsgYWRkcmVzcywgYW1vdW50IH0pXG4gICAgICAgIC5zZW5kKHsgYWRkcmVzczogdGVzdERhdGEuYWRkcmVzc2VzLnZhbGlkQWRkcmVzc2VzWzFdLCBhbW91bnQgfSlcbiAgICAgICAgLnNlbmQoeyBhZGRyZXNzOiB0ZXN0RGF0YS5hZGRyZXNzZXMudmFsaWRBZGRyZXNzZXNbMl0sIGFtb3VudCB9KVxuICAgICAgICAuYnVpbGQoKTtcblxuICAgICAgY29uc3QgZXhwbGFpbmVkVHJhbnNhY3Rpb24gPSB0eC5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgICAgIGV4cGxhaW5lZFRyYW5zYWN0aW9uLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBkaXNwbGF5T3JkZXI6IFtcbiAgICAgICAgICAnaWQnLFxuICAgICAgICAgICd0eXBlJyxcbiAgICAgICAgICAnYmxvY2toYXNoJyxcbiAgICAgICAgICAnZHVyYWJsZU5vbmNlJyxcbiAgICAgICAgICAnb3V0cHV0QW1vdW50JyxcbiAgICAgICAgICAnY2hhbmdlQW1vdW50JyxcbiAgICAgICAgICAnb3V0cHV0cycsXG4gICAgICAgICAgJ2NoYW5nZU91dHB1dHMnLFxuICAgICAgICAgICd0b2tlbkVuYWJsZW1lbnRzJyxcbiAgICAgICAgICAnZmVlJyxcbiAgICAgICAgICAnbWVtbycsXG4gICAgICAgIF0sXG4gICAgICAgIGlkOiAnVU5BVkFJTEFCTEUnLFxuICAgICAgICB0eXBlOiAnU2VuZCcsXG4gICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICAgICAgb3V0cHV0QW1vdW50OiAnMzAwMDAnLFxuICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogJ0Rlc1U3WHNjWmpuZzh5ajVWWDZBWnNrM2hXU1c0c1EzclRHMkx1eVEyUDRIJyxcbiAgICAgICAgICAgIGFtb3VudDogJzEwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6ICdBeno5RW1OdWh0am9ZcmhXdmlkV3gxSGZkMTRTTkJzWXl6WGhBOVRub2NhOCcsXG4gICAgICAgICAgICBhbW91bnQ6ICcxMDAwMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiAnMm4yeHFXTTlaMThMcXhmSnprTnJNTUZXaURVRllBMms2V1NnU25mNkVuSnMnLFxuICAgICAgICAgICAgYW1vdW50OiAnMTAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGZlZToge1xuICAgICAgICAgIGZlZTogJ1VOQVZBSUxBQkxFJyxcbiAgICAgICAgICBmZWVSYXRlOiB1bmRlZmluZWQsXG4gICAgICAgIH0sXG4gICAgICAgIG1lbW86ICdtZW1vIHRleHQnLFxuICAgICAgICBibG9ja2hhc2g6ICc1bmU3cGhBNDhKcnZwbjM5QXR1cEI4WmtDQ0F5OGdMVGZwR2loWlB1RHFlbicsXG4gICAgICAgIGR1cmFibGVOb25jZToge1xuICAgICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiAnNWhyNWZpc1BpNkRYTnV1UnBtNVhVYnpwaUVubWR5eFh1QkRUd3p3Wmo1UGUnLFxuICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogJzhZN1JNNkpmY1g0QVNTTkJrcmtybVNiUnU0MzFZVmk5WTNvTEZuekMyZENoJyxcbiAgICAgICAgfSxcbiAgICAgICAgdG9rZW5FbmFibGVtZW50czogW10sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXhwbGFpbiBzaWduZWQgdHJhbnNmZXIgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGZhY3RvcnlcbiAgICAgICAgLmdldFRyYW5zZmVyQnVpbGRlcigpXG4gICAgICAgIC5mZWUoeyBhbW91bnQ6IDUwMDAgfSlcbiAgICAgICAgLm5vbmNlKGJsb2NrSGFzaClcbiAgICAgICAgLnNlbmRlcihzZW5kZXIpXG4gICAgICAgIC5zZW5kKHsgYWRkcmVzcywgYW1vdW50IH0pXG4gICAgICAgIC5idWlsZCgpO1xuICAgICAgYXdhaXQgKHR4IGFzIFRyYW5zYWN0aW9uKS5zaWduKG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5hdXRoQWNjb3VudC5wcnYgfSkpO1xuXG4gICAgICBjb25zdCBleHBsYWluZWRUcmFuc2FjdGlvbiA9IHR4LmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGRpc3BsYXlPcmRlcjogW1xuICAgICAgICAgICdpZCcsXG4gICAgICAgICAgJ3R5cGUnLFxuICAgICAgICAgICdibG9ja2hhc2gnLFxuICAgICAgICAgICdkdXJhYmxlTm9uY2UnLFxuICAgICAgICAgICdvdXRwdXRBbW91bnQnLFxuICAgICAgICAgICdjaGFuZ2VBbW91bnQnLFxuICAgICAgICAgICdvdXRwdXRzJyxcbiAgICAgICAgICAnY2hhbmdlT3V0cHV0cycsXG4gICAgICAgICAgJ3Rva2VuRW5hYmxlbWVudHMnLFxuICAgICAgICAgICdmZWUnLFxuICAgICAgICAgICdtZW1vJyxcbiAgICAgICAgXSxcbiAgICAgICAgaWQ6IHR4LmlkLFxuICAgICAgICB0eXBlOiAnU2VuZCcsXG4gICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICAgICAgb3V0cHV0QW1vdW50OiAnMTAwMDAnLFxuICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogJ0Rlc1U3WHNjWmpuZzh5ajVWWDZBWnNrM2hXU1c0c1EzclRHMkx1eVEyUDRIJyxcbiAgICAgICAgICAgIGFtb3VudDogJzEwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBmZWU6IHtcbiAgICAgICAgICBmZWU6ICc1MDAwJyxcbiAgICAgICAgICBmZWVSYXRlOiA1MDAwLFxuICAgICAgICB9LFxuICAgICAgICBtZW1vOiB1bmRlZmluZWQsXG4gICAgICAgIGJsb2NraGFzaDogJzVuZTdwaEE0OEpydnBuMzlBdHVwQjhaa0NDQXk4Z0xUZnBHaWhaUHVEcWVuJyxcbiAgICAgICAgZHVyYWJsZU5vbmNlOiB1bmRlZmluZWQsXG4gICAgICAgIHRva2VuRW5hYmxlbWVudHM6IFtdLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGV4cGxhaW4gd2FsbGV0IGluaXQgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGZhY3RvcnlcbiAgICAgICAgLmdldFdhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlcigpXG4gICAgICAgIC5mZWUoeyBhbW91bnQ6IDUwMDAgfSlcbiAgICAgICAgLnNlbmRlcihzZW5kZXIpXG4gICAgICAgIC5ub25jZShibG9ja0hhc2gpXG4gICAgICAgIC5hZGRyZXNzKHRlc3REYXRhLmFkZHJlc3Nlcy52YWxpZEFkZHJlc3Nlc1sxXSlcbiAgICAgICAgLmFtb3VudChhbW91bnQpXG4gICAgICAgIC5idWlsZCgpO1xuXG4gICAgICBjb25zdCBleHBsYWluZWRUcmFuc2FjdGlvbiA9IHR4LmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGRpc3BsYXlPcmRlcjogW1xuICAgICAgICAgICdpZCcsXG4gICAgICAgICAgJ3R5cGUnLFxuICAgICAgICAgICdibG9ja2hhc2gnLFxuICAgICAgICAgICdkdXJhYmxlTm9uY2UnLFxuICAgICAgICAgICdvdXRwdXRBbW91bnQnLFxuICAgICAgICAgICdjaGFuZ2VBbW91bnQnLFxuICAgICAgICAgICdvdXRwdXRzJyxcbiAgICAgICAgICAnY2hhbmdlT3V0cHV0cycsXG4gICAgICAgICAgJ3Rva2VuRW5hYmxlbWVudHMnLFxuICAgICAgICAgICdmZWUnLFxuICAgICAgICAgICdtZW1vJyxcbiAgICAgICAgXSxcbiAgICAgICAgaWQ6ICdVTkFWQUlMQUJMRScsXG4gICAgICAgIHR5cGU6ICdXYWxsZXRJbml0aWFsaXphdGlvbicsXG4gICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICAgICAgb3V0cHV0QW1vdW50OiAnMTAwMDAnLFxuICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogJ0F6ejlFbU51aHRqb1lyaFd2aWRXeDFIZmQxNFNOQnNZeXpYaEE5VG5vY2E4JyxcbiAgICAgICAgICAgIGFtb3VudDogJzEwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBmZWU6IHtcbiAgICAgICAgICBmZWU6ICcxMDAwMCcsXG4gICAgICAgICAgZmVlUmF0ZTogNTAwMCxcbiAgICAgICAgfSxcbiAgICAgICAgbWVtbzogdW5kZWZpbmVkLFxuICAgICAgICBibG9ja2hhc2g6ICc1bmU3cGhBNDhKcnZwbjM5QXR1cEI4WmtDQ0F5OGdMVGZwR2loWlB1RHFlbicsXG4gICAgICAgIGR1cmFibGVOb25jZTogdW5kZWZpbmVkLFxuICAgICAgICB0b2tlbkVuYWJsZW1lbnRzOiBbXSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBleHBsYWluIHdhbGxldCBpbml0IHdpdGggZHVyYWJsZSBub25jZSBhbmQgbWVtbyB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgZmFjdG9yeVxuICAgICAgICAuZ2V0V2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyKClcbiAgICAgICAgLnNlbmRlcihzZW5kZXIpXG4gICAgICAgIC5ub25jZShibG9ja0hhc2gsIHsgd2FsbGV0Tm9uY2VBZGRyZXNzOiB0ZXN0RGF0YS5ub25jZUFjY291bnQucHViLCBhdXRoV2FsbGV0QWRkcmVzczogc2VuZGVyIH0pXG4gICAgICAgIC5tZW1vKCdtZW1vIHRleHQnKVxuICAgICAgICAuYWRkcmVzcyh0ZXN0RGF0YS5hZGRyZXNzZXMudmFsaWRBZGRyZXNzZXNbMV0pXG4gICAgICAgIC5hbW91bnQoYW1vdW50KVxuICAgICAgICAuYnVpbGQoKTtcblxuICAgICAgY29uc3QgZXhwbGFpbmVkVHJhbnNhY3Rpb24gPSB0eC5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgICAgIGV4cGxhaW5lZFRyYW5zYWN0aW9uLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBkaXNwbGF5T3JkZXI6IFtcbiAgICAgICAgICAnaWQnLFxuICAgICAgICAgICd0eXBlJyxcbiAgICAgICAgICAnYmxvY2toYXNoJyxcbiAgICAgICAgICAnZHVyYWJsZU5vbmNlJyxcbiAgICAgICAgICAnb3V0cHV0QW1vdW50JyxcbiAgICAgICAgICAnY2hhbmdlQW1vdW50JyxcbiAgICAgICAgICAnb3V0cHV0cycsXG4gICAgICAgICAgJ2NoYW5nZU91dHB1dHMnLFxuICAgICAgICAgICd0b2tlbkVuYWJsZW1lbnRzJyxcbiAgICAgICAgICAnZmVlJyxcbiAgICAgICAgICAnbWVtbycsXG4gICAgICAgIF0sXG4gICAgICAgIGlkOiAnVU5BVkFJTEFCTEUnLFxuICAgICAgICB0eXBlOiAnV2FsbGV0SW5pdGlhbGl6YXRpb24nLFxuICAgICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgICAgY2hhbmdlQW1vdW50OiAnMCcsXG4gICAgICAgIG91dHB1dEFtb3VudDogJzEwMDAwJyxcbiAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6ICdBeno5RW1OdWh0am9ZcmhXdmlkV3gxSGZkMTRTTkJzWXl6WGhBOVRub2NhOCcsXG4gICAgICAgICAgICBhbW91bnQ6ICcxMDAwMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgZmVlOiB7XG4gICAgICAgICAgZmVlOiAnVU5BVkFJTEFCTEUnLFxuICAgICAgICAgIGZlZVJhdGU6IHVuZGVmaW5lZCxcbiAgICAgICAgfSxcbiAgICAgICAgbWVtbzogJ21lbW8gdGV4dCcsXG4gICAgICAgIGJsb2NraGFzaDogJzVuZTdwaEE0OEpydnBuMzlBdHVwQjhaa0NDQXk4Z0xUZnBHaWhaUHVEcWVuJyxcbiAgICAgICAgZHVyYWJsZU5vbmNlOiB7XG4gICAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6ICc1aHI1ZmlzUGk2RFhOdXVScG01WFVienBpRW5tZHl4WHVCRFR3endaajVQZScsXG4gICAgICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiAnOFk3Uk02SmZjWDRBU1NOQmtya3JtU2JSdTQzMVlWaTlZM29MRm56QzJkQ2gnLFxuICAgICAgICB9LFxuICAgICAgICB0b2tlbkVuYWJsZW1lbnRzOiBbXSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBleHBsYWluIHNpZ25lZCB3YWxsZXQgaW5pdCB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgZmFjdG9yeVxuICAgICAgICAuZ2V0V2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyKClcbiAgICAgICAgLmZlZSh7IGFtb3VudDogNTAwMCB9KVxuICAgICAgICAuc2VuZGVyKHNlbmRlcilcbiAgICAgICAgLm5vbmNlKGJsb2NrSGFzaClcbiAgICAgICAgLmFkZHJlc3ModGVzdERhdGEuYWRkcmVzc2VzLnZhbGlkQWRkcmVzc2VzWzFdKVxuICAgICAgICAuYW1vdW50KGFtb3VudClcbiAgICAgICAgLmJ1aWxkKCk7XG4gICAgICBhd2FpdCAodHggYXMgVHJhbnNhY3Rpb24pLnNpZ24obmV3IEtleVBhaXIoeyBwcnY6IHRlc3REYXRhLmF1dGhBY2NvdW50LnBydiB9KSk7XG5cbiAgICAgIGNvbnN0IGV4cGxhaW5lZFRyYW5zYWN0aW9uID0gdHguZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gICAgICBleHBsYWluZWRUcmFuc2FjdGlvbi5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgZGlzcGxheU9yZGVyOiBbXG4gICAgICAgICAgJ2lkJyxcbiAgICAgICAgICAndHlwZScsXG4gICAgICAgICAgJ2Jsb2NraGFzaCcsXG4gICAgICAgICAgJ2R1cmFibGVOb25jZScsXG4gICAgICAgICAgJ291dHB1dEFtb3VudCcsXG4gICAgICAgICAgJ2NoYW5nZUFtb3VudCcsXG4gICAgICAgICAgJ291dHB1dHMnLFxuICAgICAgICAgICdjaGFuZ2VPdXRwdXRzJyxcbiAgICAgICAgICAndG9rZW5FbmFibGVtZW50cycsXG4gICAgICAgICAgJ2ZlZScsXG4gICAgICAgICAgJ21lbW8nLFxuICAgICAgICBdLFxuICAgICAgICBpZDogdHguaWQsXG4gICAgICAgIHR5cGU6ICdXYWxsZXRJbml0aWFsaXphdGlvbicsXG4gICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICAgICAgb3V0cHV0QW1vdW50OiAnMTAwMDAnLFxuICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogJ0F6ejlFbU51aHRqb1lyaFd2aWRXeDFIZmQxNFNOQnNZeXpYaEE5VG5vY2E4JyxcbiAgICAgICAgICAgIGFtb3VudDogJzEwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBmZWU6IHtcbiAgICAgICAgICBmZWU6ICcxMDAwMCcsXG4gICAgICAgICAgZmVlUmF0ZTogNTAwMCxcbiAgICAgICAgfSxcbiAgICAgICAgbWVtbzogdW5kZWZpbmVkLFxuICAgICAgICBibG9ja2hhc2g6ICc1bmU3cGhBNDhKcnZwbjM5QXR1cEI4WmtDQ0F5OGdMVGZwR2loWlB1RHFlbicsXG4gICAgICAgIGR1cmFibGVOb25jZTogdW5kZWZpbmVkLFxuICAgICAgICB0b2tlbkVuYWJsZW1lbnRzOiBbXSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBleHBsYWluIGNyZWF0ZSBBVEEgdHJhbnNhY3Rpb24gd2l0aCB0b2tlbkVuYWJsZW1lbnRzIGZpZWxkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBhd2FpdCBmYWN0b3J5XG4gICAgICAgIC5nZXRBdGFJbml0aWFsaXphdGlvbkJ1aWxkZXIoKVxuICAgICAgICAuZmVlKHsgYW1vdW50OiA1MDAwIH0pXG4gICAgICAgIC5zZW5kZXIoc2VuZGVyKVxuICAgICAgICAubm9uY2UoYmxvY2tIYXNoKVxuICAgICAgICAubWludCgndHNvbDp1c2RjJylcbiAgICAgICAgLnJlbnRFeGVtcHRBbW91bnQoYW1vdW50KVxuICAgICAgICAuYnVpbGQoKTtcblxuICAgICAgY29uc3QgZXhwbGFpbmVkVHJhbnNhY3Rpb24gPSB0eC5leHBsYWluVHJhbnNhY3Rpb24oKTtcblxuICAgICAgLy8gVmVyaWZ5IHRoZSB0b2tlbkVuYWJsZW1lbnRzIGZpZWxkIGV4aXN0cyBhbmQgY29udGFpbnMgdGhlIGNvcnJlY3QgZGF0YVxuICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24uc2hvdWxkLmhhdmUucHJvcGVydHkoJ3Rva2VuRW5hYmxlbWVudHMnKTtcbiAgICAgIGV4cGxhaW5lZFRyYW5zYWN0aW9uLnRva2VuRW5hYmxlbWVudHMuc2hvdWxkLmJlLmFuLkFycmF5KCk7XG4gICAgICBleHBsYWluZWRUcmFuc2FjdGlvbi50b2tlbkVuYWJsZW1lbnRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICBleHBsYWluZWRUcmFuc2FjdGlvbi50b2tlbkVuYWJsZW1lbnRzWzBdLnNob3VsZC5oYXZlLnByb3BlcnRpZXMoWydhZGRyZXNzJywgJ3Rva2VuTmFtZScsICd0b2tlbkFkZHJlc3MnXSk7XG4gICAgICBleHBsYWluZWRUcmFuc2FjdGlvbi50b2tlbkVuYWJsZW1lbnRzWzBdLnRva2VuTmFtZS5zaG91bGQuZXF1YWwoJ3Rzb2w6dXNkYycpO1xuXG4gICAgICAvLyBWZXJpZnkgZGlzcGxheU9yZGVyIGluY2x1ZGVzIHRva2VuRW5hYmxlbWVudHNcbiAgICAgIGV4cGxhaW5lZFRyYW5zYWN0aW9uLmRpc3BsYXlPcmRlci5zaG91bGQuY29udGFpbkVxbCgndG9rZW5FbmFibGVtZW50cycpO1xuXG4gICAgICAvLyBWZXJpZnkgb3RoZXIgaW1wb3J0YW50IGZpZWxkc1xuICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24uaWQuc2hvdWxkLmVxdWFsKCdVTkFWQUlMQUJMRScpO1xuICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24udHlwZS5zaG91bGQuZXF1YWwoJ0Fzc29jaWF0ZWRUb2tlbkFjY291bnRJbml0aWFsaXphdGlvbicpO1xuICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24ub3V0cHV0cy5zaG91bGQuYmUuYW4uQXJyYXkoKS5hbmQuYmUuZW1wdHkoKTtcbiAgICAgIGV4cGxhaW5lZFRyYW5zYWN0aW9uLmZlZS5mZWUuc2hvdWxkLmVxdWFsKCcxNTAwMCcpO1xuICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24uZmVlLmZlZVJhdGUuc2hvdWxkLmVxdWFsKDUwMDApO1xuICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24uYmxvY2toYXNoLnNob3VsZC5lcXVhbCgnNW5lN3BoQTQ4SnJ2cG4zOUF0dXBCOFprQ0NBeThnTFRmcEdpaFpQdURxZW4nKTtcbiAgICAgIHNob3VsZC5ub3QuZXhpc3QoZXhwbGFpbmVkVHJhbnNhY3Rpb24uZHVyYWJsZU5vbmNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXhwbGFpbiBtdWx0aXBsZSB0b2tlbiBlbmFibGVtZW50cyBpbiBhIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gQ3JlYXRlIGEgdHJhbnNhY3Rpb24gd2l0aCBtdWx0aXBsZSB0b2tlbiBlbmFibGVtZW50c1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRBdGFJbml0aWFsaXphdGlvbkJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5ub25jZShibG9ja0hhc2gpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcihzZW5kZXIpO1xuICAgICAgdHhCdWlsZGVyLmVuYWJsZVRva2VuKHtcbiAgICAgICAgb3duZXJBZGRyZXNzOiBzZW5kZXIsXG4gICAgICAgIHRva2VuTmFtZTogJ3Rzb2w6dXNkYycsXG4gICAgICAgIGF0YUFkZHJlc3M6ICdEZkdKSHNyWTdSY2hWd1BmaWdUNFQzV2tjNHpHcTFra2JXek5hVlFyREU0dycsXG4gICAgICB9KTtcbiAgICAgIHR4QnVpbGRlci5lbmFibGVUb2tlbih7XG4gICAgICAgIG93bmVyQWRkcmVzczogc2VuZGVyLFxuICAgICAgICB0b2tlbk5hbWU6ICd0c29sOnJheScsXG4gICAgICAgIGF0YUFkZHJlc3M6ICdHSGhoUEF1aDVQZHllQ000ekhQVDdqejNqQUdyWFRQUXU2bVVNVHRaOFRUZicsXG4gICAgICB9KTtcbiAgICAgIHR4QnVpbGRlci5yZW50RXhlbXB0QW1vdW50KGFtb3VudCk7XG4gICAgICB0eEJ1aWxkZXIuZmVlKHsgYW1vdW50OiA1MDAwIH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgZXhwbGFpbmVkVHJhbnNhY3Rpb24gPSB0eC5leHBsYWluVHJhbnNhY3Rpb24oKTtcblxuICAgICAgLy8gVmVyaWZ5IHRoZSB0b2tlbkVuYWJsZW1lbnRzIGZpZWxkIGNvbnRhaW5zIG11bHRpcGxlIGVudHJpZXNcbiAgICAgIGV4cGxhaW5lZFRyYW5zYWN0aW9uLnNob3VsZC5oYXZlLnByb3BlcnR5KCd0b2tlbkVuYWJsZW1lbnRzJyk7XG4gICAgICBleHBsYWluZWRUcmFuc2FjdGlvbi50b2tlbkVuYWJsZW1lbnRzLnNob3VsZC5iZS5hbi5BcnJheSgpO1xuICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24udG9rZW5FbmFibGVtZW50cy5sZW5ndGguc2hvdWxkLmVxdWFsKDIpO1xuXG4gICAgICAvLyBDaGVjayB0aGUgZmlyc3QgdG9rZW4gZW5hYmxlbWVudFxuICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24udG9rZW5FbmFibGVtZW50c1swXS5zaG91bGQuaGF2ZS5wcm9wZXJ0aWVzKFsnYWRkcmVzcycsICd0b2tlbk5hbWUnLCAndG9rZW5BZGRyZXNzJ10pO1xuICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24udG9rZW5FbmFibGVtZW50c1swXS50b2tlbk5hbWUuc2hvdWxkLmVxdWFsKCd0c29sOnVzZGMnKTtcblxuICAgICAgLy8gQ2hlY2sgdGhlIHNlY29uZCB0b2tlbiBlbmFibGVtZW50XG4gICAgICBleHBsYWluZWRUcmFuc2FjdGlvbi50b2tlbkVuYWJsZW1lbnRzWzFdLnNob3VsZC5oYXZlLnByb3BlcnRpZXMoWydhZGRyZXNzJywgJ3Rva2VuTmFtZScsICd0b2tlbkFkZHJlc3MnXSk7XG4gICAgICBleHBsYWluZWRUcmFuc2FjdGlvbi50b2tlbkVuYWJsZW1lbnRzWzFdLnRva2VuTmFtZS5zaG91bGQuZXF1YWwoJ3Rzb2w6cmF5Jyk7XG5cbiAgICAgIC8vIFZlcmlmeSBvdXRwdXRzIGlzIGVtcHR5IChzaW5jZSB0b2tlbiBlbmFibGVtZW50cyBhcmUgbm8gbG9uZ2VyIGFkZGVkIHRvIG91dHB1dHMpXG4gICAgICBleHBsYWluZWRUcmFuc2FjdGlvbi5vdXRwdXRzLnNob3VsZC5iZS5hbi5BcnJheSgpO1xuICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24ub3V0cHV0cy5zaG91bGQuYmUuZW1wdHkoKTtcblxuICAgICAgLy8gRGlzcGxheSBvcmRlciBzaG91bGQgaW5jbHVkZSB0b2tlbkVuYWJsZW1lbnRzXG4gICAgICBleHBsYWluZWRUcmFuc2FjdGlvbi5kaXNwbGF5T3JkZXIuc2hvdWxkLmNvbnRhaW5FcWwoJ3Rva2VuRW5hYmxlbWVudHMnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWN0aXZhdGUgYnVpbGRlciAnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGZhY3RvcnlcbiAgICAgICAgLmdldFN0YWtpbmdBY3RpdmF0ZUJ1aWxkZXIoKVxuICAgICAgICAuc3Rha2luZ0FkZHJlc3Moc3Rha2VBY2NvdW50LnB1YilcbiAgICAgICAgLnNlbmRlcih3YWxsZXQucHViKVxuICAgICAgICAubm9uY2UoYmxvY2tIYXNoKVxuICAgICAgICAuYW1vdW50KGFtb3VudClcbiAgICAgICAgLnZhbGlkYXRvcih2YWxpZGF0b3IucHViKVxuICAgICAgICAuZmVlKHsgYW1vdW50OiA1MDAwIH0pXG4gICAgICAgIC5idWlsZCgpO1xuXG4gICAgICBjb25zdCBleHBsYWluZWRUcmFuc2FjdGlvbiA9IHR4LmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGRpc3BsYXlPcmRlcjogW1xuICAgICAgICAgICdpZCcsXG4gICAgICAgICAgJ3R5cGUnLFxuICAgICAgICAgICdibG9ja2hhc2gnLFxuICAgICAgICAgICdkdXJhYmxlTm9uY2UnLFxuICAgICAgICAgICdvdXRwdXRBbW91bnQnLFxuICAgICAgICAgICdjaGFuZ2VBbW91bnQnLFxuICAgICAgICAgICdvdXRwdXRzJyxcbiAgICAgICAgICAnY2hhbmdlT3V0cHV0cycsXG4gICAgICAgICAgJ3Rva2VuRW5hYmxlbWVudHMnLFxuICAgICAgICAgICdmZWUnLFxuICAgICAgICAgICdtZW1vJyxcbiAgICAgICAgXSxcbiAgICAgICAgaWQ6ICdVTkFWQUlMQUJMRScsXG4gICAgICAgIHR5cGU6ICdTdGFraW5nQWN0aXZhdGUnLFxuICAgICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgICAgY2hhbmdlQW1vdW50OiAnMCcsXG4gICAgICAgIG91dHB1dEFtb3VudDogJzEwMDAwJyxcbiAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6ICc3ZFJ1R0ZiVTJ5MmtpalA2bzFMWU56Vnl6NHlmMTNNb29xb2lvbkN6djVaYScsXG4gICAgICAgICAgICBhbW91bnQ6ICcxMDAwMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgZmVlOiB7XG4gICAgICAgICAgZmVlOiAnMTAwMDAnLFxuICAgICAgICAgIGZlZVJhdGU6IDUwMDAsXG4gICAgICAgIH0sXG4gICAgICAgIG1lbW86IHVuZGVmaW5lZCxcbiAgICAgICAgYmxvY2toYXNoOiAnNW5lN3BoQTQ4SnJ2cG4zOUF0dXBCOFprQ0NBeThnTFRmcEdpaFpQdURxZW4nLFxuICAgICAgICBkdXJhYmxlTm9uY2U6IHVuZGVmaW5lZCxcbiAgICAgICAgdG9rZW5FbmFibGVtZW50czogW10sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZGVhY3RpdmF0ZSBidWlsZGVyICcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlY2VudEJsb2NrSGFzaCA9ICdHSHRYUUJzb1pIVm5ORmE5WWV2QXpGcjE3REpqZ0hYazN5Y1RLRDV4RDNaaSc7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGZhY3RvcnlcbiAgICAgICAgLmdldFN0YWtpbmdEZWFjdGl2YXRlQnVpbGRlcigpXG4gICAgICAgIC5zdGFraW5nQWRkcmVzcyhzdGFrZUFjY291bnQucHViKVxuICAgICAgICAuc2VuZGVyKHdhbGxldC5wdWIpXG4gICAgICAgIC5zdGFraW5nQWRkcmVzcyhzdGFrZUFjY291bnQucHViKVxuICAgICAgICAubm9uY2UocmVjZW50QmxvY2tIYXNoKVxuICAgICAgICAuZmVlKHsgYW1vdW50OiA1MDAwIH0pXG4gICAgICAgIC5idWlsZCgpO1xuXG4gICAgICBjb25zdCBleHBsYWluZWRUcmFuc2FjdGlvbiA9IHR4LmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGRpc3BsYXlPcmRlcjogW1xuICAgICAgICAgICdpZCcsXG4gICAgICAgICAgJ3R5cGUnLFxuICAgICAgICAgICdibG9ja2hhc2gnLFxuICAgICAgICAgICdkdXJhYmxlTm9uY2UnLFxuICAgICAgICAgICdvdXRwdXRBbW91bnQnLFxuICAgICAgICAgICdjaGFuZ2VBbW91bnQnLFxuICAgICAgICAgICdvdXRwdXRzJyxcbiAgICAgICAgICAnY2hhbmdlT3V0cHV0cycsXG4gICAgICAgICAgJ3Rva2VuRW5hYmxlbWVudHMnLFxuICAgICAgICAgICdmZWUnLFxuICAgICAgICAgICdtZW1vJyxcbiAgICAgICAgXSxcbiAgICAgICAgaWQ6ICdVTkFWQUlMQUJMRScsXG4gICAgICAgIHR5cGU6ICdTdGFraW5nRGVhY3RpdmF0ZScsXG4gICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICAgICAgb3V0cHV0QW1vdW50OiAnMCcsXG4gICAgICAgIG91dHB1dHM6IFtdLFxuICAgICAgICBmZWU6IHtcbiAgICAgICAgICBmZWU6ICc1MDAwJyxcbiAgICAgICAgICBmZWVSYXRlOiA1MDAwLFxuICAgICAgICB9LFxuICAgICAgICBtZW1vOiB1bmRlZmluZWQsXG4gICAgICAgIGJsb2NraGFzaDogJ0dIdFhRQnNvWkhWbk5GYTlZZXZBekZyMTdESmpnSFhrM3ljVEtENXhEM1ppJyxcbiAgICAgICAgZHVyYWJsZU5vbmNlOiB1bmRlZmluZWQsXG4gICAgICAgIHRva2VuRW5hYmxlbWVudHM6IFtdLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGV4cGxhaW4gd2l0aGRyYXcgdHJhbnNhY3Rpb24gJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVjZW50QmxvY2tIYXNoID0gJ0dIdFhRQnNvWkhWbk5GYTlZZXZBekZyMTdESmpnSFhrM3ljVEtENXhEM1ppJztcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgZmFjdG9yeVxuICAgICAgICAuZ2V0U3Rha2luZ1dpdGhkcmF3QnVpbGRlcigpXG4gICAgICAgIC5zdGFraW5nQWRkcmVzcyhzdGFrZUFjY291bnQucHViKVxuICAgICAgICAuc2VuZGVyKHdhbGxldC5wdWIpXG4gICAgICAgIC5hbW91bnQoYW1vdW50KVxuICAgICAgICAubm9uY2UocmVjZW50QmxvY2tIYXNoKVxuICAgICAgICAuZmVlKHsgYW1vdW50OiA1MDAwIH0pXG4gICAgICAgIC5idWlsZCgpO1xuXG4gICAgICBjb25zdCBleHBsYWluZWRUcmFuc2FjdGlvbiA9IHR4LmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGRpc3BsYXlPcmRlcjogW1xuICAgICAgICAgICdpZCcsXG4gICAgICAgICAgJ3R5cGUnLFxuICAgICAgICAgICdibG9ja2hhc2gnLFxuICAgICAgICAgICdkdXJhYmxlTm9uY2UnLFxuICAgICAgICAgICdvdXRwdXRBbW91bnQnLFxuICAgICAgICAgICdjaGFuZ2VBbW91bnQnLFxuICAgICAgICAgICdvdXRwdXRzJyxcbiAgICAgICAgICAnY2hhbmdlT3V0cHV0cycsXG4gICAgICAgICAgJ3Rva2VuRW5hYmxlbWVudHMnLFxuICAgICAgICAgICdmZWUnLFxuICAgICAgICAgICdtZW1vJyxcbiAgICAgICAgXSxcbiAgICAgICAgaWQ6ICdVTkFWQUlMQUJMRScsXG4gICAgICAgIHR5cGU6ICdTdGFraW5nV2l0aGRyYXcnLFxuICAgICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgICAgY2hhbmdlQW1vdW50OiAnMCcsXG4gICAgICAgIG91dHB1dEFtb3VudDogJzEwMDAwJyxcbiAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6ICc1aHI1ZmlzUGk2RFhOdXVScG01WFVienBpRW5tZHl4WHVCRFR3endaajVQZScsXG4gICAgICAgICAgICBhbW91bnQ6ICcxMDAwMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgZmVlOiB7XG4gICAgICAgICAgZmVlOiAnNTAwMCcsXG4gICAgICAgICAgZmVlUmF0ZTogNTAwMCxcbiAgICAgICAgfSxcbiAgICAgICAgbWVtbzogdW5kZWZpbmVkLFxuICAgICAgICBibG9ja2hhc2g6ICdHSHRYUUJzb1pIVm5ORmE5WWV2QXpGcjE3REpqZ0hYazN5Y1RLRDV4RDNaaScsXG4gICAgICAgIGR1cmFibGVOb25jZTogdW5kZWZpbmVkLFxuICAgICAgICB0b2tlbkVuYWJsZW1lbnRzOiBbXSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBleHBsYWluIHdpdGhkcmF3IHRyYW5zYWN0aW9uIHdpdGggbWVtbyBhbmQgZHVyYWJsZSBub25jZSAnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGZhY3RvcnlcbiAgICAgICAgLmdldFN0YWtpbmdXaXRoZHJhd0J1aWxkZXIoKVxuICAgICAgICAuc3Rha2luZ0FkZHJlc3Moc3Rha2VBY2NvdW50LnB1YilcbiAgICAgICAgLnNlbmRlcih3YWxsZXQucHViKVxuICAgICAgICAuYW1vdW50KGFtb3VudClcbiAgICAgICAgLm5vbmNlKGJsb2NrSGFzaCwgeyB3YWxsZXROb25jZUFkZHJlc3M6IHRlc3REYXRhLm5vbmNlQWNjb3VudC5wdWIsIGF1dGhXYWxsZXRBZGRyZXNzOiBzZW5kZXIgfSlcbiAgICAgICAgLm1lbW8oJ21lbW8gdGV4dCcpXG4gICAgICAgIC5mZWUoeyBhbW91bnQ6IDUwMDAgfSlcbiAgICAgICAgLmJ1aWxkKCk7XG4gICAgICB0eC5zaWduYWJsZVBheWxvYWQ7XG5cbiAgICAgIGNvbnN0IGV4cGxhaW5lZFRyYW5zYWN0aW9uID0gdHguZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gICAgICBleHBsYWluZWRUcmFuc2FjdGlvbi5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgZGlzcGxheU9yZGVyOiBbXG4gICAgICAgICAgJ2lkJyxcbiAgICAgICAgICAndHlwZScsXG4gICAgICAgICAgJ2Jsb2NraGFzaCcsXG4gICAgICAgICAgJ2R1cmFibGVOb25jZScsXG4gICAgICAgICAgJ291dHB1dEFtb3VudCcsXG4gICAgICAgICAgJ2NoYW5nZUFtb3VudCcsXG4gICAgICAgICAgJ291dHB1dHMnLFxuICAgICAgICAgICdjaGFuZ2VPdXRwdXRzJyxcbiAgICAgICAgICAndG9rZW5FbmFibGVtZW50cycsXG4gICAgICAgICAgJ2ZlZScsXG4gICAgICAgICAgJ21lbW8nLFxuICAgICAgICBdLFxuICAgICAgICBpZDogJ1VOQVZBSUxBQkxFJyxcbiAgICAgICAgdHlwZTogJ1N0YWtpbmdXaXRoZHJhdycsXG4gICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICAgICAgb3V0cHV0QW1vdW50OiAnMTAwMDAnLFxuICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogJzVocjVmaXNQaTZEWE51dVJwbTVYVWJ6cGlFbm1keXhYdUJEVHd6d1pqNVBlJyxcbiAgICAgICAgICAgIGFtb3VudDogJzEwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBmZWU6IHtcbiAgICAgICAgICBmZWU6ICc1MDAwJyxcbiAgICAgICAgICBmZWVSYXRlOiA1MDAwLFxuICAgICAgICB9LFxuICAgICAgICBtZW1vOiAnbWVtbyB0ZXh0JyxcbiAgICAgICAgYmxvY2toYXNoOiAnNW5lN3BoQTQ4SnJ2cG4zOUF0dXBCOFprQ0NBeThnTFRmcEdpaFpQdURxZW4nLFxuICAgICAgICBkdXJhYmxlTm9uY2U6IHtcbiAgICAgICAgICB3YWxsZXROb25jZUFkZHJlc3M6IHRlc3REYXRhLm5vbmNlQWNjb3VudC5wdWIsXG4gICAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IHNlbmRlcixcbiAgICAgICAgfSxcbiAgICAgICAgdG9rZW5FbmFibGVtZW50czogW10sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXhwbGFpbiBzaW5nbGUgdG9rZW4gdHJhbnNmZXIgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGZhY3RvcnlcbiAgICAgICAgLmdldFRva2VuVHJhbnNmZXJCdWlsZGVyKClcbiAgICAgICAgLm5vbmNlKGJsb2NrSGFzaClcbiAgICAgICAgLnNlbmRlcihzZW5kZXIpXG4gICAgICAgIC5zZW5kKHsgYWRkcmVzcywgYW1vdW50LCB0b2tlbk5hbWU6ICd0c29sOnVzZGMnIH0pXG4gICAgICAgIC5mZWUoeyBhbW91bnQ6IDUwMDAgfSlcbiAgICAgICAgLmJ1aWxkKCk7XG5cbiAgICAgIGNvbnN0IGV4cGxhaW5lZFRyYW5zYWN0aW9uID0gdHguZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gICAgICBleHBsYWluZWRUcmFuc2FjdGlvbi5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgZGlzcGxheU9yZGVyOiBbXG4gICAgICAgICAgJ2lkJyxcbiAgICAgICAgICAndHlwZScsXG4gICAgICAgICAgJ2Jsb2NraGFzaCcsXG4gICAgICAgICAgJ2R1cmFibGVOb25jZScsXG4gICAgICAgICAgJ291dHB1dEFtb3VudCcsXG4gICAgICAgICAgJ2NoYW5nZUFtb3VudCcsXG4gICAgICAgICAgJ291dHB1dHMnLFxuICAgICAgICAgICdjaGFuZ2VPdXRwdXRzJyxcbiAgICAgICAgICAndG9rZW5FbmFibGVtZW50cycsXG4gICAgICAgICAgJ2ZlZScsXG4gICAgICAgICAgJ21lbW8nLFxuICAgICAgICBdLFxuICAgICAgICBpZDogJ1VOQVZBSUxBQkxFJyxcbiAgICAgICAgdHlwZTogJ1NlbmQnLFxuICAgICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgICAgY2hhbmdlQW1vdW50OiAnMCcsXG4gICAgICAgIG91dHB1dEFtb3VudDogJzAnLFxuICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogJ0Rlc1U3WHNjWmpuZzh5ajVWWDZBWnNrM2hXU1c0c1EzclRHMkx1eVEyUDRIJyxcbiAgICAgICAgICAgIGFtb3VudDogJzEwMDAwJyxcbiAgICAgICAgICAgIHRva2VuTmFtZTogJ3Rzb2w6dXNkYycsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgZmVlOiB7XG4gICAgICAgICAgZmVlOiAnNTAwMCcsXG4gICAgICAgICAgZmVlUmF0ZTogNTAwMCxcbiAgICAgICAgfSxcbiAgICAgICAgbWVtbzogdW5kZWZpbmVkLFxuICAgICAgICBibG9ja2hhc2g6ICc1bmU3cGhBNDhKcnZwbjM5QXR1cEI4WmtDQ0F5OGdMVGZwR2loWlB1RHFlbicsXG4gICAgICAgIGR1cmFibGVOb25jZTogdW5kZWZpbmVkLFxuICAgICAgICB0b2tlbkVuYWJsZW1lbnRzOiBbXSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBleHBsYWluIHNpbmdsZSB0b2tlbiB0cmFuc2ZlciB0cmFuc2FjdGlvbiB3aXRoIG9wdGlvbmFsIHBhcmFtcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgZmFjdG9yeVxuICAgICAgICAuZ2V0VG9rZW5UcmFuc2ZlckJ1aWxkZXIoKVxuICAgICAgICAubm9uY2UoYmxvY2tIYXNoKVxuICAgICAgICAuc2VuZGVyKHNlbmRlcilcbiAgICAgICAgLnNlbmQoe1xuICAgICAgICAgIGFkZHJlc3MsXG4gICAgICAgICAgYW1vdW50LFxuICAgICAgICAgIHRva2VuTmFtZTogJ3Rzb2w6YW1zJyxcbiAgICAgICAgICB0b2tlbkFkZHJlc3M6ICdGNHVMZVhpb0Z6M2h3MTNNcG9zdXdhUWJNY1piQ2pxdkVHUFBlUlJCMUJ5ZicsXG4gICAgICAgICAgcHJvZ3JhbUlkOiAnVG9rZW5rZWdRZmVaeWlOd0FKYk5iR0tQRlhDV3VCdmY5U3M2MjNWUTVEQScsXG4gICAgICAgICAgZGVjaW1hbFBsYWNlczogOSxcbiAgICAgICAgfSlcbiAgICAgICAgLmZlZSh7IGFtb3VudDogNTAwMCB9KVxuICAgICAgICAuYnVpbGQoKTtcblxuICAgICAgY29uc3QgZXhwbGFpbmVkVHJhbnNhY3Rpb24gPSB0eC5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgICAgIGV4cGxhaW5lZFRyYW5zYWN0aW9uLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBkaXNwbGF5T3JkZXI6IFtcbiAgICAgICAgICAnaWQnLFxuICAgICAgICAgICd0eXBlJyxcbiAgICAgICAgICAnYmxvY2toYXNoJyxcbiAgICAgICAgICAnZHVyYWJsZU5vbmNlJyxcbiAgICAgICAgICAnb3V0cHV0QW1vdW50JyxcbiAgICAgICAgICAnY2hhbmdlQW1vdW50JyxcbiAgICAgICAgICAnb3V0cHV0cycsXG4gICAgICAgICAgJ2NoYW5nZU91dHB1dHMnLFxuICAgICAgICAgICd0b2tlbkVuYWJsZW1lbnRzJyxcbiAgICAgICAgICAnZmVlJyxcbiAgICAgICAgICAnbWVtbycsXG4gICAgICAgIF0sXG4gICAgICAgIGlkOiAnVU5BVkFJTEFCTEUnLFxuICAgICAgICB0eXBlOiAnU2VuZCcsXG4gICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICAgICAgb3V0cHV0QW1vdW50OiAnMCcsXG4gICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiAnRGVzVTdYc2Naam5nOHlqNVZYNkFac2szaFdTVzRzUTNyVEcyTHV5UTJQNEgnLFxuICAgICAgICAgICAgYW1vdW50OiAnMTAwMDAnLFxuICAgICAgICAgICAgdG9rZW5OYW1lOiAndHNvbDphbXMnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGZlZToge1xuICAgICAgICAgIGZlZTogJzUwMDAnLFxuICAgICAgICAgIGZlZVJhdGU6IDUwMDAsXG4gICAgICAgIH0sXG4gICAgICAgIG1lbW86IHVuZGVmaW5lZCxcbiAgICAgICAgYmxvY2toYXNoOiAnNW5lN3BoQTQ4SnJ2cG4zOUF0dXBCOFprQ0NBeThnTFRmcEdpaFpQdURxZW4nLFxuICAgICAgICBkdXJhYmxlTm9uY2U6IHVuZGVmaW5lZCxcbiAgICAgICAgdG9rZW5FbmFibGVtZW50czogW10sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXhwbGFpbiBtdWx0aSB0b2tlbiB0cmFuc2ZlciB3aXRoIGR1cmFibGUgbm9uY2UgYW5kIG1lbW8gdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGZhY3RvcnlcbiAgICAgICAgLmdldFRva2VuVHJhbnNmZXJCdWlsZGVyKClcbiAgICAgICAgLm5vbmNlKGJsb2NrSGFzaCwgeyB3YWxsZXROb25jZUFkZHJlc3M6IHRlc3REYXRhLm5vbmNlQWNjb3VudC5wdWIsIGF1dGhXYWxsZXRBZGRyZXNzOiBzZW5kZXIgfSlcbiAgICAgICAgLnNlbmRlcihzZW5kZXIpXG4gICAgICAgIC5tZW1vKCdtZW1vIHRleHQnKVxuICAgICAgICAuc2VuZCh7IGFkZHJlc3MsIGFtb3VudCwgdG9rZW5OYW1lOiAndHNvbDp1c2RjJyB9KVxuICAgICAgICAuc2VuZCh7IGFkZHJlc3M6IHRlc3REYXRhLmFkZHJlc3Nlcy52YWxpZEFkZHJlc3Nlc1sxXSwgYW1vdW50LCB0b2tlbk5hbWU6ICd0c29sOnVzZGMnIH0pXG4gICAgICAgIC5zZW5kKHsgYWRkcmVzczogdGVzdERhdGEuYWRkcmVzc2VzLnZhbGlkQWRkcmVzc2VzWzJdLCBhbW91bnQsIHRva2VuTmFtZTogJ3Rzb2w6dXNkYycgfSlcbiAgICAgICAgLmJ1aWxkKCk7XG5cbiAgICAgIGNvbnN0IGV4cGxhaW5lZFRyYW5zYWN0aW9uID0gdHguZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gICAgICBleHBsYWluZWRUcmFuc2FjdGlvbi5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgZGlzcGxheU9yZGVyOiBbXG4gICAgICAgICAgJ2lkJyxcbiAgICAgICAgICAndHlwZScsXG4gICAgICAgICAgJ2Jsb2NraGFzaCcsXG4gICAgICAgICAgJ2R1cmFibGVOb25jZScsXG4gICAgICAgICAgJ291dHB1dEFtb3VudCcsXG4gICAgICAgICAgJ2NoYW5nZUFtb3VudCcsXG4gICAgICAgICAgJ291dHB1dHMnLFxuICAgICAgICAgICdjaGFuZ2VPdXRwdXRzJyxcbiAgICAgICAgICAndG9rZW5FbmFibGVtZW50cycsXG4gICAgICAgICAgJ2ZlZScsXG4gICAgICAgICAgJ21lbW8nLFxuICAgICAgICBdLFxuICAgICAgICBpZDogJ1VOQVZBSUxBQkxFJyxcbiAgICAgICAgdHlwZTogJ1NlbmQnLFxuICAgICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgICAgY2hhbmdlQW1vdW50OiAnMCcsXG4gICAgICAgIG91dHB1dEFtb3VudDogJzAnLFxuICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogJ0Rlc1U3WHNjWmpuZzh5ajVWWDZBWnNrM2hXU1c0c1EzclRHMkx1eVEyUDRIJyxcbiAgICAgICAgICAgIGFtb3VudDogJzEwMDAwJyxcbiAgICAgICAgICAgIHRva2VuTmFtZTogJ3Rzb2w6dXNkYycsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiAnQXp6OUVtTnVodGpvWXJoV3ZpZFd4MUhmZDE0U05Cc1l5elhoQTlUbm9jYTgnLFxuICAgICAgICAgICAgYW1vdW50OiAnMTAwMDAnLFxuICAgICAgICAgICAgdG9rZW5OYW1lOiAndHNvbDp1c2RjJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6ICcybjJ4cVdNOVoxOExxeGZKemtOck1NRldpRFVGWUEyazZXU2dTbmY2RW5KcycsXG4gICAgICAgICAgICBhbW91bnQ6ICcxMDAwMCcsXG4gICAgICAgICAgICB0b2tlbk5hbWU6ICd0c29sOnVzZGMnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGZlZToge1xuICAgICAgICAgIGZlZTogJ1VOQVZBSUxBQkxFJyxcbiAgICAgICAgICBmZWVSYXRlOiB1bmRlZmluZWQsXG4gICAgICAgIH0sXG4gICAgICAgIG1lbW86ICdtZW1vIHRleHQnLFxuICAgICAgICBibG9ja2hhc2g6ICc1bmU3cGhBNDhKcnZwbjM5QXR1cEI4WmtDQ0F5OGdMVGZwR2loWlB1RHFlbicsXG4gICAgICAgIGR1cmFibGVOb25jZToge1xuICAgICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiAnNWhyNWZpc1BpNkRYTnV1UnBtNVhVYnpwaUVubWR5eFh1QkRUd3p3Wmo1UGUnLFxuICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogJzhZN1JNNkpmY1g0QVNTTkJrcmtybVNiUnU0MzFZVmk5WTNvTEZuekMyZENoJyxcbiAgICAgICAgfSxcbiAgICAgICAgdG9rZW5FbmFibGVtZW50czogW10sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|