@bitgo-beta/sdk-coin-sol 7.6.4-beta.613 → 7.6.4-beta.615
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/cjs/src/lib/constants.d.ts +21 -2
- package/dist/cjs/src/lib/constants.d.ts.map +1 -1
- package/dist/cjs/src/lib/constants.js +22 -2
- package/dist/cjs/src/lib/iface.d.ts +59 -2
- package/dist/cjs/src/lib/iface.d.ts.map +1 -1
- package/dist/cjs/src/lib/iface.js +1 -1
- package/dist/cjs/src/lib/index.d.ts +1 -0
- package/dist/cjs/src/lib/index.d.ts.map +1 -1
- package/dist/cjs/src/lib/index.js +6 -2
- package/dist/cjs/src/lib/instructionParamsFactory.d.ts +2 -1
- package/dist/cjs/src/lib/instructionParamsFactory.d.ts.map +1 -1
- package/dist/cjs/src/lib/instructionParamsFactory.js +42 -1
- package/dist/cjs/src/lib/solInstructionFactory.d.ts.map +1 -1
- package/dist/cjs/src/lib/solInstructionFactory.js +60 -20
- package/dist/cjs/src/lib/token2022Resolve.d.ts +106 -0
- package/dist/cjs/src/lib/token2022Resolve.d.ts.map +1 -0
- package/dist/cjs/src/lib/token2022Resolve.js +199 -0
- package/dist/cjs/src/lib/tokenTransferBuilder.d.ts +27 -1
- package/dist/cjs/src/lib/tokenTransferBuilder.d.ts.map +1 -1
- package/dist/cjs/src/lib/tokenTransferBuilder.js +44 -3
- package/dist/cjs/src/lib/transferBuilderV2.d.ts +27 -1
- package/dist/cjs/src/lib/transferBuilderV2.d.ts.map +1 -1
- package/dist/cjs/src/lib/transferBuilderV2.js +44 -3
- package/dist/cjs/src/lib/utils.d.ts.map +1 -1
- package/dist/cjs/src/lib/utils.js +4 -1
- package/dist/cjs/src/sol.d.ts +58 -2
- package/dist/cjs/src/sol.d.ts.map +1 -1
- package/dist/cjs/src/sol.js +90 -1
- package/dist/cjs/test/unit/sol.js +248 -1
- package/dist/cjs/test/unit/solInstructionFactory.js +127 -17
- package/dist/cjs/test/unit/token2022Resolve.d.ts +2 -0
- package/dist/cjs/test/unit/token2022Resolve.d.ts.map +1 -0
- package/dist/cjs/test/unit/token2022Resolve.js +252 -0
- package/dist/cjs/test/unit/transactionBuilder/tokenTransferBuilder.js +100 -1
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/lib/constants.d.ts +21 -2
- package/dist/esm/lib/constants.d.ts.map +1 -1
- package/dist/esm/lib/constants.js +21 -1
- package/dist/esm/lib/iface.d.ts +59 -2
- package/dist/esm/lib/iface.d.ts.map +1 -1
- package/dist/esm/lib/iface.js +1 -1
- package/dist/esm/lib/index.d.ts +1 -0
- package/dist/esm/lib/index.d.ts.map +1 -1
- package/dist/esm/lib/index.js +2 -1
- package/dist/esm/lib/instructionParamsFactory.d.ts +2 -1
- package/dist/esm/lib/instructionParamsFactory.d.ts.map +1 -1
- package/dist/esm/lib/instructionParamsFactory.js +41 -1
- package/dist/esm/lib/solInstructionFactory.d.ts.map +1 -1
- package/dist/esm/lib/solInstructionFactory.js +61 -21
- package/dist/esm/lib/token2022Resolve.d.ts +106 -0
- package/dist/esm/lib/token2022Resolve.d.ts.map +1 -0
- package/dist/esm/lib/token2022Resolve.js +194 -0
- package/dist/esm/lib/tokenTransferBuilder.d.ts +27 -1
- package/dist/esm/lib/tokenTransferBuilder.d.ts.map +1 -1
- package/dist/esm/lib/tokenTransferBuilder.js +44 -3
- package/dist/esm/lib/transferBuilderV2.d.ts +27 -1
- package/dist/esm/lib/transferBuilderV2.d.ts.map +1 -1
- package/dist/esm/lib/transferBuilderV2.js +44 -3
- package/dist/esm/lib/utils.d.ts.map +1 -1
- package/dist/esm/lib/utils.js +5 -2
- package/dist/esm/sol.d.ts +58 -2
- package/dist/esm/sol.d.ts.map +1 -1
- package/dist/esm/sol.js +90 -1
- package/package.json +7 -7
- package/dist/cjs/src/config/token2022StaticConfig.d.ts +0 -3
- package/dist/cjs/src/config/token2022StaticConfig.d.ts.map +0 -1
- package/dist/cjs/src/config/token2022StaticConfig.js +0 -50
- package/dist/cjs/src/lib/token2022Config.d.ts +0 -44
- package/dist/cjs/src/lib/token2022Config.d.ts.map +0 -1
- package/dist/cjs/src/lib/token2022Config.js +0 -27
- package/dist/esm/config/token2022StaticConfig.d.ts +0 -3
- package/dist/esm/config/token2022StaticConfig.d.ts.map +0 -1
- package/dist/esm/config/token2022StaticConfig.js +0 -47
- package/dist/esm/lib/token2022Config.d.ts +0 -44
- package/dist/esm/lib/token2022Config.d.ts.map +0 -1
- package/dist/esm/lib/token2022Config.js +0 -23
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
require("should");
|
|
37
|
+
const spl_token_1 = require("@solana/spl-token");
|
|
38
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
39
|
+
const constants_1 = require("../../src/lib/constants");
|
|
40
|
+
const token2022Resolve_1 = require("../../src/lib/token2022Resolve");
|
|
41
|
+
const resources = __importStar(require("../resources/sol"));
|
|
42
|
+
const makeConnection = (accounts) => {
|
|
43
|
+
const fetch = async (address) => {
|
|
44
|
+
const account = accounts[address];
|
|
45
|
+
if (!account) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
executable: false,
|
|
50
|
+
owner: new web3_js_1.PublicKey(account.owner),
|
|
51
|
+
lamports: 1,
|
|
52
|
+
data: account.data,
|
|
53
|
+
rentEpoch: 0,
|
|
54
|
+
};
|
|
55
|
+
};
|
|
56
|
+
return (0, token2022Resolve_1.buildSolAccountConnection)(fetch);
|
|
57
|
+
};
|
|
58
|
+
// Token-2022 mint account layout: 82-byte base MintLayout, padded to the 165-byte
|
|
59
|
+
// account size, an account-type byte (1 = Mint), then the extension TLV. TransferHook
|
|
60
|
+
// is extension type 14 with 64 bytes (authority + programId).
|
|
61
|
+
const buildMintWithTransferHook = (mintDecimals, hookProgram) => {
|
|
62
|
+
const data = Buffer.alloc(234);
|
|
63
|
+
data.writeUInt8(mintDecimals, 44); // MintLayout.decimals
|
|
64
|
+
data.writeUInt8(1, 45); // MintLayout.isInitialized
|
|
65
|
+
data.writeUInt8(1, 165); // AccountType.Mint
|
|
66
|
+
data.writeUInt16LE(14, 166); // extension type: TransferHook
|
|
67
|
+
data.writeUInt16LE(64, 168); // extension length
|
|
68
|
+
hookProgram.toBuffer().copy(data, 202); // programId occupies [202, 234)
|
|
69
|
+
return data;
|
|
70
|
+
};
|
|
71
|
+
// Plain SPL/Token-2022 mint with no extensions (base MintLayout only).
|
|
72
|
+
const buildBaseMint = (mintDecimals) => {
|
|
73
|
+
const data = Buffer.alloc(82);
|
|
74
|
+
data.writeUInt8(mintDecimals, 44);
|
|
75
|
+
data.writeUInt8(1, 45);
|
|
76
|
+
return data;
|
|
77
|
+
};
|
|
78
|
+
// MintConfig layout: u8 discriminator, u8 bump, bool thaw, bool freeze, pubkey mint(32),
|
|
79
|
+
// pubkey freezeAuthority(32), pubkey gatingProgram(32). Total 100 bytes.
|
|
80
|
+
const buildMintConfig = (mint, enablePermissionlessThaw, gateProgram) => {
|
|
81
|
+
const data = Buffer.alloc(100);
|
|
82
|
+
data.writeUInt8(1, 0); // discriminator
|
|
83
|
+
data.writeUInt8(255, 1); // bump
|
|
84
|
+
data.writeUInt8(enablePermissionlessThaw ? 1 : 0, 2);
|
|
85
|
+
data.writeUInt8(0, 3); // enablePermissionlessFreeze
|
|
86
|
+
mint.toBuffer().copy(data, 4);
|
|
87
|
+
new web3_js_1.PublicKey(constants_1.TOKEN_ACL_PROGRAM_ID).toBuffer().copy(data, 36); // freezeAuthority
|
|
88
|
+
gateProgram.toBuffer().copy(data, 68);
|
|
89
|
+
return data;
|
|
90
|
+
};
|
|
91
|
+
// ExtraAccountMetaList account: u64 discriminator + u32 length + u32 count, then 35-byte
|
|
92
|
+
// ExtraAccountMeta entries (discriminator 0 = fixed address).
|
|
93
|
+
const buildExtraAccountMetaList = (metas) => {
|
|
94
|
+
const headerSize = 16;
|
|
95
|
+
const data = Buffer.alloc(headerSize + metas.length * 35);
|
|
96
|
+
data.writeUInt32LE(4 + metas.length * 35, 8); // length
|
|
97
|
+
data.writeUInt32LE(metas.length, 12); // count
|
|
98
|
+
let offset = headerSize;
|
|
99
|
+
for (const meta of metas) {
|
|
100
|
+
data.writeUInt8(0, offset); // discriminator: fixed address
|
|
101
|
+
new web3_js_1.PublicKey(meta.pubkey).toBuffer().copy(data, offset + 1); // addressConfig
|
|
102
|
+
data.writeUInt8(meta.isSigner ? 1 : 0, offset + 33);
|
|
103
|
+
data.writeUInt8(meta.isWritable ? 1 : 0, offset + 34);
|
|
104
|
+
offset += 35;
|
|
105
|
+
}
|
|
106
|
+
return data;
|
|
107
|
+
};
|
|
108
|
+
describe('token2022Resolve (standalone)', () => {
|
|
109
|
+
const mintAddress = resources.sol2022TokenTransfers.mint;
|
|
110
|
+
const sourceAddress = resources.associatedTokenAccountsForSol2022.accounts[0].ata;
|
|
111
|
+
const destinationAddress = resources.sol2022TokenTransfers.source;
|
|
112
|
+
const ownerAddress = resources.sol2022TokenTransfers.owner;
|
|
113
|
+
const decimals = 6;
|
|
114
|
+
// Arbitrary but valid base58 pubkeys used purely as fixtures.
|
|
115
|
+
const hookProgramId = new web3_js_1.PublicKey('GbQ8ZiEFzGGTeYoXwtZtcoxwPcMyUcmZDduMVNdUPKpX');
|
|
116
|
+
describe('resolveTransferHookAccounts', () => {
|
|
117
|
+
const extraMetas = [
|
|
118
|
+
{ pubkey: '98wFF5MpMjMQbfDF2MPzo8LCGX37unZR1ohRA1mU9GmJ', isSigner: false, isWritable: true },
|
|
119
|
+
{ pubkey: '48n7YGEww7fKMfJ5gJ3sQC3rM6RWGjpUsghqVfXVkR5A', isSigner: false, isWritable: false },
|
|
120
|
+
{ pubkey: '9sQhAH7vV3RKTCK13VY4EiNjs3qBq1srSYxdNufdAAXm', isSigner: false, isWritable: false },
|
|
121
|
+
];
|
|
122
|
+
it('resolves the ordered extra accounts for a mint with a transfer hook', async function () {
|
|
123
|
+
const validationStatePubkey = (0, spl_token_1.getExtraAccountMetaAddress)(new web3_js_1.PublicKey(mintAddress), hookProgramId);
|
|
124
|
+
const connection = makeConnection({
|
|
125
|
+
[mintAddress]: {
|
|
126
|
+
data: buildMintWithTransferHook(decimals, hookProgramId),
|
|
127
|
+
owner: spl_token_1.TOKEN_2022_PROGRAM_ID.toBase58(),
|
|
128
|
+
},
|
|
129
|
+
[validationStatePubkey.toBase58()]: {
|
|
130
|
+
data: buildExtraAccountMetaList(extraMetas),
|
|
131
|
+
owner: hookProgramId.toBase58(),
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
const result = await (0, token2022Resolve_1.resolveTransferHookAccounts)(connection, {
|
|
135
|
+
mint: mintAddress,
|
|
136
|
+
source: sourceAddress,
|
|
137
|
+
destination: destinationAddress,
|
|
138
|
+
owner: ownerAddress,
|
|
139
|
+
amount: '500000',
|
|
140
|
+
});
|
|
141
|
+
// extra accounts, then the hook program, then the validation state account
|
|
142
|
+
result.should.have.length(extraMetas.length + 2);
|
|
143
|
+
result.slice(0, extraMetas.length).should.deepEqual(extraMetas);
|
|
144
|
+
result[extraMetas.length].should.deepEqual({
|
|
145
|
+
pubkey: hookProgramId.toBase58(),
|
|
146
|
+
isSigner: false,
|
|
147
|
+
isWritable: false,
|
|
148
|
+
});
|
|
149
|
+
result[extraMetas.length + 1].should.deepEqual({
|
|
150
|
+
pubkey: validationStatePubkey.toBase58(),
|
|
151
|
+
isSigner: false,
|
|
152
|
+
isWritable: false,
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
it('returns an empty array for a mint without a transfer hook', async function () {
|
|
156
|
+
const connection = makeConnection({
|
|
157
|
+
[mintAddress]: {
|
|
158
|
+
data: buildBaseMint(decimals),
|
|
159
|
+
owner: spl_token_1.TOKEN_2022_PROGRAM_ID.toBase58(),
|
|
160
|
+
},
|
|
161
|
+
});
|
|
162
|
+
const result = await (0, token2022Resolve_1.resolveTransferHookAccounts)(connection, {
|
|
163
|
+
mint: mintAddress,
|
|
164
|
+
source: sourceAddress,
|
|
165
|
+
destination: destinationAddress,
|
|
166
|
+
owner: ownerAddress,
|
|
167
|
+
amount: '500000',
|
|
168
|
+
});
|
|
169
|
+
result.should.deepEqual([]);
|
|
170
|
+
});
|
|
171
|
+
it('returns an empty array when the mint account is not found', async function () {
|
|
172
|
+
const connection = makeConnection({});
|
|
173
|
+
const result = await (0, token2022Resolve_1.resolveTransferHookAccounts)(connection, {
|
|
174
|
+
mint: mintAddress,
|
|
175
|
+
source: sourceAddress,
|
|
176
|
+
destination: destinationAddress,
|
|
177
|
+
owner: ownerAddress,
|
|
178
|
+
amount: '500000',
|
|
179
|
+
});
|
|
180
|
+
result.should.deepEqual([]);
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
describe('resolvePermissionlessThaw', () => {
|
|
184
|
+
const tokenAccount = resources.associatedTokenAccountsForSol2022.accounts[0].ata;
|
|
185
|
+
const tokenAccountOwner = resources.sol2022TokenTransfers.owner;
|
|
186
|
+
const authority = resources.sol2022TokenTransfers.source;
|
|
187
|
+
const gatingProgram = new web3_js_1.PublicKey('GbQ8ZiEFzGGTeYoXwtZtcoxwPcMyUcmZDduMVNdUPKpX');
|
|
188
|
+
const tokenAclProgramId = new web3_js_1.PublicKey(constants_1.TOKEN_ACL_PROGRAM_ID);
|
|
189
|
+
const extraMetas = [
|
|
190
|
+
{ pubkey: '98wFF5MpMjMQbfDF2MPzo8LCGX37unZR1ohRA1mU9GmJ', isSigner: false, isWritable: true },
|
|
191
|
+
{ pubkey: '9sQhAH7vV3RKTCK13VY4EiNjs3qBq1srSYxdNufdAAXm', isSigner: false, isWritable: false },
|
|
192
|
+
];
|
|
193
|
+
const [mintConfigPda] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from(constants_1.TOKEN_ACL_MINT_CONFIG_SEED), new web3_js_1.PublicKey(mintAddress).toBuffer()], tokenAclProgramId);
|
|
194
|
+
const [flagAccountPda] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from(constants_1.TOKEN_ACL_FLAG_ACCOUNT_SEED), new web3_js_1.PublicKey(tokenAccount).toBuffer()], tokenAclProgramId);
|
|
195
|
+
const [thawExtraMetasPda] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from(constants_1.TOKEN_ACL_THAW_EXTRA_METAS_SEED), new web3_js_1.PublicKey(mintAddress).toBuffer()], gatingProgram);
|
|
196
|
+
it('resolves the thaw params for a Token ACL mint with permissionless thaw enabled', async function () {
|
|
197
|
+
const connection = makeConnection({
|
|
198
|
+
[mintConfigPda.toBase58()]: {
|
|
199
|
+
data: buildMintConfig(new web3_js_1.PublicKey(mintAddress), true, gatingProgram),
|
|
200
|
+
owner: constants_1.TOKEN_ACL_PROGRAM_ID,
|
|
201
|
+
},
|
|
202
|
+
[thawExtraMetasPda.toBase58()]: {
|
|
203
|
+
data: buildExtraAccountMetaList(extraMetas),
|
|
204
|
+
owner: gatingProgram.toBase58(),
|
|
205
|
+
},
|
|
206
|
+
});
|
|
207
|
+
const result = await (0, token2022Resolve_1.resolvePermissionlessThaw)(connection, {
|
|
208
|
+
mint: mintAddress,
|
|
209
|
+
tokenAccount,
|
|
210
|
+
tokenAccountOwner,
|
|
211
|
+
authority,
|
|
212
|
+
});
|
|
213
|
+
result.applicable.should.be.true();
|
|
214
|
+
result.gatingProgram.should.equal(gatingProgram.toBase58());
|
|
215
|
+
result.flagAccount.should.equal(flagAccountPda.toBase58());
|
|
216
|
+
result.mintConfig.should.equal(mintConfigPda.toBase58());
|
|
217
|
+
result.tokenProgram.should.equal(spl_token_1.TOKEN_2022_PROGRAM_ID.toBase58());
|
|
218
|
+
result.systemProgram.should.equal(web3_js_1.SystemProgram.programId.toBase58());
|
|
219
|
+
// extra accounts = [thawExtraMetas, ...resolved fixed-address extras]
|
|
220
|
+
result.extraAccounts.should.deepEqual([
|
|
221
|
+
{ pubkey: thawExtraMetasPda.toBase58(), isSigner: false, isWritable: false },
|
|
222
|
+
...extraMetas,
|
|
223
|
+
]);
|
|
224
|
+
});
|
|
225
|
+
it('returns applicable:false for a mint with no Token ACL MintConfig', async function () {
|
|
226
|
+
const connection = makeConnection({});
|
|
227
|
+
const result = await (0, token2022Resolve_1.resolvePermissionlessThaw)(connection, {
|
|
228
|
+
mint: mintAddress,
|
|
229
|
+
tokenAccount,
|
|
230
|
+
tokenAccountOwner,
|
|
231
|
+
authority,
|
|
232
|
+
});
|
|
233
|
+
result.should.deepEqual({ applicable: false });
|
|
234
|
+
});
|
|
235
|
+
it('returns applicable:false when permissionless thaw is disabled', async function () {
|
|
236
|
+
const connection = makeConnection({
|
|
237
|
+
[mintConfigPda.toBase58()]: {
|
|
238
|
+
data: buildMintConfig(new web3_js_1.PublicKey(mintAddress), false, gatingProgram),
|
|
239
|
+
owner: constants_1.TOKEN_ACL_PROGRAM_ID,
|
|
240
|
+
},
|
|
241
|
+
});
|
|
242
|
+
const result = await (0, token2022Resolve_1.resolvePermissionlessThaw)(connection, {
|
|
243
|
+
mint: mintAddress,
|
|
244
|
+
tokenAccount,
|
|
245
|
+
tokenAccountOwner,
|
|
246
|
+
authority,
|
|
247
|
+
});
|
|
248
|
+
result.should.deepEqual({ applicable: false });
|
|
249
|
+
});
|
|
250
|
+
});
|
|
251
|
+
});
|
|
252
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4yMDIyUmVzb2x2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvdW5pdC90b2tlbjIwMjJSZXNvbHZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsa0JBQWdCO0FBRWhCLGlEQUFzRjtBQUN0Riw2Q0FBdUU7QUFFdkUsdURBS2lDO0FBRWpDLHFFQUt3QztBQUN4Qyw0REFBOEM7QUFLOUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxRQUFxQyxFQUFjLEVBQUU7SUFDM0UsTUFBTSxLQUFLLEdBQXNCLEtBQUssRUFBRSxPQUFlLEVBQUUsRUFBRTtRQUN6RCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsT0FBTztZQUNMLFVBQVUsRUFBRSxLQUFLO1lBQ2pCLEtBQUssRUFBRSxJQUFJLG1CQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUNuQyxRQUFRLEVBQUUsQ0FBQztZQUNYLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtZQUNsQixTQUFTLEVBQUUsQ0FBQztTQUNiLENBQUM7SUFDSixDQUFDLENBQUM7SUFDRixPQUFPLElBQUEsNENBQXlCLEVBQUMsS0FBSyxDQUFDLENBQUM7QUFDMUMsQ0FBQyxDQUFDO0FBRUYsa0ZBQWtGO0FBQ2xGLHNGQUFzRjtBQUN0Riw4REFBOEQ7QUFDOUQsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLFlBQW9CLEVBQUUsV0FBc0IsRUFBVSxFQUFFO0lBQ3pGLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxzQkFBc0I7SUFDekQs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QUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLCtEQUErRCxFQUFFLEtBQUs7WUFDdkUsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDO2dCQUNoQyxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFO29CQUMxQixJQUFJLEVBQUUsZUFBZSxDQUFDLElBQUksbUJBQVMsQ0FBQyxXQUFXLENBQUMsRUFBRSxLQUFLLEVBQUUsYUFBYSxDQUFDO29CQUN2RSxLQUFLLEVBQUUsZ0NBQW9CO2lCQUM1QjthQUNGLENBQUMsQ0FBQztZQUVILE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBQSw0Q0FBeUIsRUFBQyxVQUFVLEVBQUU7Z0JBQ3pELElBQUksRUFBRSxXQUFXO2dCQUNqQixZQUFZO2dCQUNaLGlCQUFpQjtnQkFDakIsU0FBUzthQUNWLENBQUMsQ0FBQztZQUNILE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDakQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICdzaG91bGQnO1xuXG5pbXBvcnQgeyBnZXRFeHRyYUFjY291bnRNZXRhQWRkcmVzcywgVE9LRU5fMjAyMl9QUk9HUkFNX0lEIH0gZnJvbSAnQHNvbGFuYS9zcGwtdG9rZW4nO1xuaW1wb3J0IHsgQ29ubmVjdGlvbiwgUHVibGljS2V5LCBTeXN0ZW1Qcm9ncmFtIH0gZnJvbSAnQHNvbGFuYS93ZWIzLmpzJztcblxuaW1wb3J0IHtcbiAgVE9LRU5fQUNMX0ZMQUdfQUNDT1VOVF9TRUVELFxuICBUT0tFTl9BQ0xfTUlOVF9DT05GSUdfU0VFRCxcbiAgVE9LRU5fQUNMX1BST0dSQU1fSUQsXG4gIFRPS0VOX0FDTF9USEFXX0VYVFJBX01FVEFTX1NFRUQsXG59IGZyb20gJy4uLy4uL3NyYy9saWIvY29uc3RhbnRzJztcbmltcG9ydCB7IEV4dHJhQWNjb3VudE1ldGEgfSBmcm9tICcuLi8uLi9zcmMvbGliL2lmYWNlJztcbmltcG9ydCB7XG4gIFNvbEFjY291bnRGZXRjaGVyLFxuICBidWlsZFNvbEFjY291bnRDb25uZWN0aW9uLFxuICByZXNvbHZlUGVybWlzc2lvbmxlc3NUaGF3LFxuICByZXNvbHZlVHJhbnNmZXJIb29rQWNjb3VudHMsXG59IGZyb20gJy4uLy4uL3NyYy9saWIvdG9rZW4yMDIyUmVzb2x2ZSc7XG5pbXBvcnQgKiBhcyByZXNvdXJjZXMgZnJvbSAnLi4vcmVzb3VyY2VzL3NvbCc7XG5cbi8vIEJ1aWxkIGEgZmFrZSBgQ29ubmVjdGlvbmAgYmFja2VkIGJ5IGFuIGluLW1lbW9yeSBhZGRyZXNzLT5hY2NvdW50IG1hcCB2aWEgdGhlXG4vLyBwcm9kdWN0aW9uIGBidWlsZFNvbEFjY291bnRDb25uZWN0aW9uYCBzaGltIChhbHNvIGV4ZXJjaXNpbmcgdGhhdCBmYWN0b3J5KS5cbnR5cGUgRmFrZUFjY291bnQgPSB7IGRhdGE6IEJ1ZmZlcjsgb3duZXI6IHN0cmluZyB9O1xuY29uc3QgbWFrZUNvbm5lY3Rpb24gPSAoYWNjb3VudHM6IFJlY29yZDxzdHJpbmcsIEZha2VBY2NvdW50Pik6IENvbm5lY3Rpb24gPT4ge1xuICBjb25zdCBmZXRjaDogU29sQWNjb3VudEZldGNoZXIgPSBhc3luYyAoYWRkcmVzczogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgYWNjb3VudCA9IGFjY291bnRzW2FkZHJlc3NdO1xuICAgIGlmICghYWNjb3VudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBleGVjdXRhYmxlOiBmYWxzZSxcbiAgICAgIG93bmVyOiBuZXcgUHVibGljS2V5KGFjY291bnQub3duZXIpLFxuICAgICAgbGFtcG9ydHM6IDEsXG4gICAgICBkYXRhOiBhY2NvdW50LmRhdGEsXG4gICAgICByZW50RXBvY2g6IDAsXG4gICAgfTtcbiAgfTtcbiAgcmV0dXJuIGJ1aWxkU29sQWNjb3VudENvbm5lY3Rpb24oZmV0Y2gpO1xufTtcblxuLy8gVG9rZW4tMjAyMiBtaW50IGFjY291bnQgbGF5b3V0OiA4Mi1ieXRlIGJhc2UgTWludExheW91dCwgcGFkZGVkIHRvIHRoZSAxNjUtYnl0ZVxuLy8gYWNjb3VudCBzaXplLCBhbiBhY2NvdW50LXR5cGUgYnl0ZSAoMSA9IE1pbnQpLCB0aGVuIHRoZSBleHRlbnNpb24gVExWLiBUcmFuc2Zlckhvb2tcbi8vIGlzIGV4dGVuc2lvbiB0eXBlIDE0IHdpdGggNjQgYnl0ZXMgKGF1dGhvcml0eSArIHByb2dyYW1JZCkuXG5jb25zdCBidWlsZE1pbnRXaXRoVHJhbnNmZXJIb29rID0gKG1pbnREZWNpbWFsczogbnVtYmVyLCBob29rUHJvZ3JhbTogUHVibGljS2V5KTogQnVmZmVyID0+IHtcbiAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYygyMzQpO1xuICBkYXRhLndyaXRlVUludDgobWludERlY2ltYWxzLCA0NCk7IC8vIE1pbnRMYXlvdXQuZGVjaW1hbHNcbiAgZGF0YS53cml0ZVVJbnQ4KDEsIDQ1KTsgLy8gTWludExheW91dC5pc0luaXRpYWxpemVkXG4gIGRhdGEud3JpdGVVSW50OCgxLCAxNjUpOyAvLyBBY2NvdW50VHlwZS5NaW50XG4gIGRhdGEud3JpdGVVSW50MTZMRSgxNCwgMTY2KTsgLy8gZXh0ZW5zaW9uIHR5cGU6IFRyYW5zZmVySG9va1xuICBkYXRhLndyaXRlVUludDE2TEUoNjQsIDE2OCk7IC8vIGV4dGVuc2lvbiBsZW5ndGhcbiAgaG9va1Byb2dyYW0udG9CdWZmZXIoKS5jb3B5KGRhdGEsIDIwMik7IC8vIHByb2dyYW1JZCBvY2N1cGllcyBbMjAyLCAyMzQpXG4gIHJldHVybiBkYXRhO1xufTtcblxuLy8gUGxhaW4gU1BML1Rva2VuLTIwMjIgbWludCB3aXRoIG5vIGV4dGVuc2lvbnMgKGJhc2UgTWludExheW91dCBvbmx5KS5cbmNvbnN0IGJ1aWxkQmFzZU1pbnQgPSAobWludERlY2ltYWxzOiBudW1iZXIpOiBCdWZmZXIgPT4ge1xuICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKDgyKTtcbiAgZGF0YS53cml0ZVVJbnQ4KG1pbnREZWNpbWFscywgNDQpO1xuICBkYXRhLndyaXRlVUludDgoMSwgNDUpO1xuICByZXR1cm4gZGF0YTtcbn07XG5cbi8vIE1pbnRDb25maWcgbGF5b3V0OiB1OCBkaXNjcmltaW5hdG9yLCB1OCBidW1wLCBib29sIHRoYXcsIGJvb2wgZnJlZXplLCBwdWJrZXkgbWludCgzMiksXG4vLyBwdWJrZXkgZnJlZXplQXV0aG9yaXR5KDMyKSwgcHVia2V5IGdhdGluZ1Byb2dyYW0oMzIpLiBUb3RhbCAxMDAgYnl0ZXMuXG5jb25zdCBidWlsZE1pbnRDb25maWcgPSAobWludDogUHVibGljS2V5LCBlbmFibGVQZXJtaXNzaW9ubGVzc1RoYXc6IGJvb2xlYW4sIGdhdGVQcm9ncmFtOiBQdWJsaWNLZXkpOiBCdWZmZXIgPT4ge1xuICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKDEwMCk7XG4gIGRhdGEud3JpdGVVSW50OCgxLCAwKTsgLy8gZGlzY3JpbWluYXRvclxuICBkYXRhLndyaXRlVUludDgoMjU1LCAxKTsgLy8gYnVtcFxuICBkYXRhLndyaXRlVUludDgoZW5hYmxlUGVybWlzc2lvbmxlc3NUaGF3ID8gMSA6IDAsIDIpO1xuICBkYXRhLndyaXRlVUludDgoMCwgMyk7IC8vIGVuYWJsZVBlcm1pc3Npb25sZXNzRnJlZXplXG4gIG1pbnQudG9CdWZmZXIoKS5jb3B5KGRhdGEsIDQpO1xuICBuZXcgUHVibGljS2V5KFRPS0VOX0FDTF9QUk9HUkFNX0lEKS50b0J1ZmZlcigpLmNvcHkoZGF0YSwgMzYpOyAvLyBmcmVlemVBdXRob3JpdHlcbiAgZ2F0ZVByb2dyYW0udG9CdWZmZXIoKS5jb3B5KGRhdGEsIDY4KTtcbiAgcmV0dXJuIGRhdGE7XG59O1xuXG4vLyBFeHRyYUFjY291bnRNZXRhTGlzdCBhY2NvdW50OiB1NjQgZGlzY3JpbWluYXRvciArIHUzMiBsZW5ndGggKyB1MzIgY291bnQsIHRoZW4gMzUtYnl0ZVxuLy8gRXh0cmFBY2NvdW50TWV0YSBlbnRyaWVzIChkaXNjcmltaW5hdG9yIDAgPSBmaXhlZCBhZGRyZXNzKS5cbmNvbnN0IGJ1aWxkRXh0cmFBY2NvdW50TWV0YUxpc3QgPSAobWV0YXM6IEV4dHJhQWNjb3VudE1ldGFbXSk6IEJ1ZmZlciA9PiB7XG4gIGNvbnN0IGhlYWRlclNpemUgPSAxNjtcbiAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYyhoZWFkZXJTaXplICsgbWV0YXMubGVuZ3RoICogMzUpO1xuICBkYXRhLndyaXRlVUludDMyTEUoNCArIG1ldGFzLmxlbmd0aCAqIDM1LCA4KTsgLy8gbGVuZ3RoXG4gIGRhdGEud3JpdGVVSW50MzJMRShtZXRhcy5sZW5ndGgsIDEyKTsgLy8gY291bnRcbiAgbGV0IG9mZnNldCA9IGhlYWRlclNpemU7XG4gIGZvciAoY29uc3QgbWV0YSBvZiBtZXRhcykge1xuICAgIGRhdGEud3JpdGVVSW50OCgwLCBvZmZzZXQpOyAvLyBkaXNjcmltaW5hdG9yOiBmaXhlZCBhZGRyZXNzXG4gICAgbmV3IFB1YmxpY0tleShtZXRhLnB1YmtleSkudG9CdWZmZXIoKS5jb3B5KGRhdGEsIG9mZnNldCArIDEpOyAvLyBhZGRyZXNzQ29uZmlnXG4gICAgZGF0YS53cml0ZVVJbnQ4KG1ldGEuaXNTaWduZXIgPyAxIDogMCwgb2Zmc2V0ICsgMzMpO1xuICAgIGRhdGEud3JpdGVVSW50OChtZXRhLmlzV3JpdGFibGUgPyAxIDogMCwgb2Zmc2V0ICsgMzQpO1xuICAgIG9mZnNldCArPSAzNTtcbiAgfVxuICByZXR1cm4gZGF0YTtcbn07XG5cbmRlc2NyaWJlKCd0b2tlbjIwMjJSZXNvbHZlIChzdGFuZGFsb25lKScsICgpID0+IHtcbiAgY29uc3QgbWludEFkZHJlc3MgPSByZXNvdXJjZXMuc29sMjAyMlRva2VuVHJhbnNmZXJzLm1pbnQ7XG4gIGNvbnN0IHNvdXJjZUFkZHJlc3MgPSByZXNvdXJjZXMuYXNzb2NpYXRlZFRva2VuQWNjb3VudHNGb3JTb2wyMDIyLmFjY291bnRzWzBdLmF0YTtcbiAgY29uc3QgZGVzdGluYXRpb25BZGRyZXNzID0gcmVzb3VyY2VzLnNvbDIwMjJUb2tlblRyYW5zZmVycy5zb3VyY2U7XG4gIGNvbnN0IG93bmVyQWRkcmVzcyA9IHJlc291cmNlcy5zb2wyMDIyVG9rZW5UcmFuc2ZlcnMub3duZXI7XG4gIGNvbnN0IGRlY2ltYWxzID0gNjtcbiAgLy8gQXJiaXRyYXJ5IGJ1dCB2YWxpZCBiYXNlNTggcHVia2V5cyB1c2VkIHB1cmVseSBhcyBmaXh0dXJlcy5cbiAgY29uc3QgaG9va1Byb2dyYW1JZCA9IG5ldyBQdWJsaWNLZXkoJ0diUThaaUVGekdHVGVZb1h3dFp0Y294d1BjTXlVY21aRGR1TVZOZFVQS3BYJyk7XG5cbiAgZGVzY3JpYmUoJ3Jlc29sdmVUcmFuc2Zlckhvb2tBY2NvdW50cycsICgpID0+IHtcbiAgICBjb25zdCBleHRyYU1ldGFzOiBFeHRyYUFjY291bnRNZXRhW10gPSBbXG4gICAgICB7IHB1YmtleTogJzk4d0ZGNU1wTWpNUWJmREYyTVB6bzhMQ0dYMzd1blpSMW9oUkExbVU5R21KJywgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgICB7IHB1YmtleTogJzQ4bjdZR0V3dzdmS01mSjVnSjNzUUMzck02UldHanBVc2docVZmWFZrUjVBJywgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICAgICAgeyBwdWJrZXk6ICc5c1FoQUg3dlYzUktUQ0sxM1ZZNEVpTmpzM3FCcTFzclNZeGROdWZkQUFYbScsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgICBdO1xuXG4gICAgaXQoJ3Jlc29sdmVzIHRoZSBvcmRlcmVkIGV4dHJhIGFjY291bnRzIGZvciBhIG1pbnQgd2l0aCBhIHRyYW5zZmVyIGhvb2snLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uU3RhdGVQdWJrZXkgPSBnZXRFeHRyYUFjY291bnRNZXRhQWRkcmVzcyhuZXcgUHVibGljS2V5KG1pbnRBZGRyZXNzKSwgaG9va1Byb2dyYW1JZCk7XG4gICAgICBjb25zdCBjb25uZWN0aW9uID0gbWFrZUNvbm5lY3Rpb24oe1xuICAgICAgICBbbWludEFkZHJlc3NdOiB7XG4gICAgICAgICAgZGF0YTogYnVpbGRNaW50V2l0aFRyYW5zZmVySG9vayhkZWNpbWFscywgaG9va1Byb2dyYW1JZCksXG4gICAgICAgICAgb3duZXI6IFRPS0VOXzIwMjJfUFJPR1JBTV9JRC50b0Jhc2U1OCgpLFxuICAgICAgICB9LFxuICAgICAgICBbdmFsaWRhdGlvblN0YXRlUHVia2V5LnRvQmFzZTU4KCldOiB7XG4gICAgICAgICAgZGF0YTogYnVpbGRFeHRyYUFjY291bnRNZXRhTGlzdChleHRyYU1ldGFzKSxcbiAgICAgICAgICBvd25lcjogaG9va1Byb2dyYW1JZC50b0Jhc2U1OCgpLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc29sdmVUcmFuc2Zlckhvb2tBY2NvdW50cyhjb25uZWN0aW9uLCB7XG4gICAgICAgIG1pbnQ6IG1pbnRBZGRyZXNzLFxuICAgICAgICBzb3VyY2U6IHNvdXJjZUFkZHJlc3MsXG4gICAgICAgIGRlc3RpbmF0aW9uOiBkZXN0aW5hdGlvbkFkZHJlc3MsXG4gICAgICAgIG93bmVyOiBvd25lckFkZHJlc3MsXG4gICAgICAgIGFtb3VudDogJzUwMDAwMCcsXG4gICAgICB9KTtcblxuICAgICAgLy8gZXh0cmEgYWNjb3VudHMsIHRoZW4gdGhlIGhvb2sgcHJvZ3JhbSwgdGhlbiB0aGUgdmFsaWRhdGlvbiBzdGF0ZSBhY2NvdW50XG4gICAgICByZXN1bHQuc2hvdWxkLmhhdmUubGVuZ3RoKGV4dHJhTWV0YXMubGVuZ3RoICsgMik7XG4gICAgICByZXN1bHQuc2xpY2UoMCwgZXh0cmFNZXRhcy5sZW5ndGgpLnNob3VsZC5kZWVwRXF1YWwoZXh0cmFNZXRhcyk7XG4gICAgICByZXN1bHRbZXh0cmFNZXRhcy5sZW5ndGhdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBwdWJrZXk6IGhvb2tQcm9ncmFtSWQudG9CYXNlNTgoKSxcbiAgICAgICAgaXNTaWduZXI6IGZhbHNlLFxuICAgICAgICBpc1dyaXRhYmxlOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgcmVzdWx0W2V4dHJhTWV0YXMubGVuZ3RoICsgMV0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIHB1YmtleTogdmFsaWRhdGlvblN0YXRlUHVia2V5LnRvQmFzZTU4KCksXG4gICAgICAgIGlzU2lnbmVyOiBmYWxzZSxcbiAgICAgICAgaXNXcml0YWJsZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIGFuIGVtcHR5IGFycmF5IGZvciBhIG1pbnQgd2l0aG91dCBhIHRyYW5zZmVyIGhvb2snLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBjb25uZWN0aW9uID0gbWFrZUNvbm5lY3Rpb24oe1xuICAgICAgICBbbWludEFkZHJlc3NdOiB7XG4gICAgICAgICAgZGF0YTogYnVpbGRCYXNlTWludChkZWNpbWFscyksXG4gICAgICAgICAgb3duZXI6IFRPS0VOXzIwMjJfUFJPR1JBTV9JRC50b0Jhc2U1OCgpLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc29sdmVUcmFuc2Zlckhvb2tBY2NvdW50cyhjb25uZWN0aW9uLCB7XG4gICAgICAgIG1pbnQ6IG1pbnRBZGRyZXNzLFxuICAgICAgICBzb3VyY2U6IHNvdXJjZUFkZHJlc3MsXG4gICAgICAgIGRlc3RpbmF0aW9uOiBkZXN0aW5hdGlvbkFkZHJlc3MsXG4gICAgICAgIG93bmVyOiBvd25lckFkZHJlc3MsXG4gICAgICAgIGFtb3VudDogJzUwMDAwMCcsXG4gICAgICB9KTtcbiAgICAgIHJlc3VsdC5zaG91bGQuZGVlcEVxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIGFuIGVtcHR5IGFycmF5IHdoZW4gdGhlIG1pbnQgYWNjb3VudCBpcyBub3QgZm91bmQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBjb25uZWN0aW9uID0gbWFrZUNvbm5lY3Rpb24oe30pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNvbHZlVHJhbnNmZXJIb29rQWNjb3VudHMoY29ubmVjdGlvbiwge1xuICAgICAgICBtaW50OiBtaW50QWRkcmVzcyxcbiAgICAgICAgc291cmNlOiBzb3VyY2VBZGRyZXNzLFxuICAgICAgICBkZXN0aW5hdGlvbjogZGVzdGluYXRpb25BZGRyZXNzLFxuICAgICAgICBvd25lcjogb3duZXJBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6ICc1MDAwMDAnLFxuICAgICAgfSk7XG4gICAgICByZXN1bHQuc2hvdWxkLmRlZXBFcXVhbChbXSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZXNvbHZlUGVybWlzc2lvbmxlc3NUaGF3JywgKCkgPT4ge1xuICAgIGNvbnN0IHRva2VuQWNjb3VudCA9IHJlc291cmNlcy5hc3NvY2lhdGVkVG9rZW5BY2NvdW50c0ZvclNvbDIwMjIuYWNjb3VudHNbMF0uYXRhO1xuICAgIGNvbnN0IHRva2VuQWNjb3VudE93bmVyID0gcmVzb3VyY2VzLnNvbDIwMjJUb2tlblRyYW5zZmVycy5vd25lcjtcbiAgICBjb25zdCBhdXRob3JpdHkgPSByZXNvdXJjZXMuc29sMjAyMlRva2VuVHJhbnNmZXJzLnNvdXJjZTtcbiAgICBjb25zdCBnYXRpbmdQcm9ncmFtID0gbmV3IFB1YmxpY0tleSgnR2JROFppRUZ6R0dUZVlvWHd0WnRjb3h3UGNNeVVjbVpEZHVNVk5kVVBLcFgnKTtcbiAgICBjb25zdCB0b2tlbkFjbFByb2dyYW1JZCA9IG5ldyBQdWJsaWNLZXkoVE9LRU5fQUNMX1BST0dSQU1fSUQpO1xuXG4gICAgY29uc3QgZXh0cmFNZXRhczogRXh0cmFBY2NvdW50TWV0YVtdID0gW1xuICAgICAgeyBwdWJrZXk6ICc5OHdGRjVNcE1qTVFiZkRGMk1Qem84TENHWDM3dW5aUjFvaFJBMW1VOUdtSicsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgICAgeyBwdWJrZXk6ICc5c1FoQUg3dlYzUktUQ0sxM1ZZNEVpTmpzM3FCcTFzclNZeGROdWZkQUFYbScsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgICBdO1xuXG4gICAgY29uc3QgW21pbnRDb25maWdQZGFdID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oVE9LRU5fQUNMX01JTlRfQ09ORklHX1NFRUQpLCBuZXcgUHVibGljS2V5KG1pbnRBZGRyZXNzKS50b0J1ZmZlcigpXSxcbiAgICAgIHRva2VuQWNsUHJvZ3JhbUlkXG4gICAgKTtcbiAgICBjb25zdCBbZmxhZ0FjY291bnRQZGFdID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oVE9LRU5fQUNMX0ZMQUdfQUNDT1VOVF9TRUVEKSwgbmV3IFB1YmxpY0tleSh0b2tlbkFjY291bnQpLnRvQnVmZmVyKCldLFxuICAgICAgdG9rZW5BY2xQcm9ncmFtSWRcbiAgICApO1xuICAgIGNvbnN0IFt0aGF3RXh0cmFNZXRhc1BkYV0gPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShUT0tFTl9BQ0xfVEhBV19FWFRSQV9NRVRBU19TRUVEKSwgbmV3IFB1YmxpY0tleShtaW50QWRkcmVzcykudG9CdWZmZXIoKV0sXG4gICAgICBnYXRpbmdQcm9ncmFtXG4gICAgKTtcblxuICAgIGl0KCdyZXNvbHZlcyB0aGUgdGhhdyBwYXJhbXMgZm9yIGEgVG9rZW4gQUNMIG1pbnQgd2l0aCBwZXJtaXNzaW9ubGVzcyB0aGF3IGVuYWJsZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBjb25uZWN0aW9uID0gbWFrZUNvbm5lY3Rpb24oe1xuICAgICAgICBbbWludENvbmZpZ1BkYS50b0Jhc2U1OCgpXToge1xuICAgICAgICAgIGRhdGE6IGJ1aWxkTWludENvbmZpZyhuZXcgUHVibGljS2V5KG1pbnRBZGRyZXNzKSwgdHJ1ZSwgZ2F0aW5nUHJvZ3JhbSksXG4gICAgICAgICAgb3duZXI6IFRPS0VOX0FDTF9QUk9HUkFNX0lELFxuICAgICAgICB9LFxuICAgICAgICBbdGhhd0V4dHJhTWV0YXNQZGEudG9CYXNlNTgoKV06IHtcbiAgICAgICAgICBkYXRhOiBidWlsZEV4dHJhQWNjb3VudE1ldGFMaXN0KGV4dHJhTWV0YXMpLFxuICAgICAgICAgIG93bmVyOiBnYXRpbmdQcm9ncmFtLnRvQmFzZTU4KCksXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzb2x2ZVBlcm1pc3Npb25sZXNzVGhhdyhjb25uZWN0aW9uLCB7XG4gICAgICAgIG1pbnQ6IG1pbnRBZGRyZXNzLFxuICAgICAgICB0b2tlbkFjY291bnQsXG4gICAgICAgIHRva2VuQWNjb3VudE93bmVyLFxuICAgICAgICBhdXRob3JpdHksXG4gICAgICB9KTtcblxuICAgICAgcmVzdWx0LmFwcGxpY2FibGUuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIHJlc3VsdC5nYXRpbmdQcm9ncmFtIS5zaG91bGQuZXF1YWwoZ2F0aW5nUHJvZ3JhbS50b0Jhc2U1OCgpKTtcbiAgICAgIHJlc3VsdC5mbGFnQWNjb3VudCEuc2hvdWxkLmVxdWFsKGZsYWdBY2NvdW50UGRhLnRvQmFzZTU4KCkpO1xuICAgICAgcmVzdWx0Lm1pbnRDb25maWchLnNob3VsZC5lcXVhbChtaW50Q29uZmlnUGRhLnRvQmFzZTU4KCkpO1xuICAgICAgcmVzdWx0LnRva2VuUHJvZ3JhbSEuc2hvdWxkLmVxdWFsKFRPS0VOXzIwMjJfUFJPR1JBTV9JRC50b0Jhc2U1OCgpKTtcbiAgICAgIHJlc3VsdC5zeXN0ZW1Qcm9ncmFtIS5zaG91bGQuZXF1YWwoU3lzdGVtUHJvZ3JhbS5wcm9ncmFtSWQudG9CYXNlNTgoKSk7XG4gICAgICAvLyBleHRyYSBhY2NvdW50cyA9IFt0aGF3RXh0cmFNZXRhcywgLi4ucmVzb2x2ZWQgZml4ZWQtYWRkcmVzcyBleHRyYXNdXG4gICAgICByZXN1bHQuZXh0cmFBY2NvdW50cyEuc2hvdWxkLmRlZXBFcXVhbChbXG4gICAgICAgIHsgcHVia2V5OiB0aGF3RXh0cmFNZXRhc1BkYS50b0Jhc2U1OCgpLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0sXG4gICAgICAgIC4uLmV4dHJhTWV0YXMsXG4gICAgICBdKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIGFwcGxpY2FibGU6ZmFsc2UgZm9yIGEgbWludCB3aXRoIG5vIFRva2VuIEFDTCBNaW50Q29uZmlnJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgY29ubmVjdGlvbiA9IG1ha2VDb25uZWN0aW9uKHt9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzb2x2ZVBlcm1pc3Npb25sZXNzVGhhdyhjb25uZWN0aW9uLCB7XG4gICAgICAgIG1pbnQ6IG1pbnRBZGRyZXNzLFxuICAgICAgICB0b2tlbkFjY291bnQsXG4gICAgICAgIHRva2VuQWNjb3VudE93bmVyLFxuICAgICAgICBhdXRob3JpdHksXG4gICAgICB9KTtcbiAgICAgIHJlc3VsdC5zaG91bGQuZGVlcEVxdWFsKHsgYXBwbGljYWJsZTogZmFsc2UgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBhcHBsaWNhYmxlOmZhbHNlIHdoZW4gcGVybWlzc2lvbmxlc3MgdGhhdyBpcyBkaXNhYmxlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBtYWtlQ29ubmVjdGlvbih7XG4gICAgICAgIFttaW50Q29uZmlnUGRhLnRvQmFzZTU4KCldOiB7XG4gICAgICAgICAgZGF0YTogYnVpbGRNaW50Q29uZmlnKG5ldyBQdWJsaWNLZXkobWludEFkZHJlc3MpLCBmYWxzZSwgZ2F0aW5nUHJvZ3JhbSksXG4gICAgICAgICAgb3duZXI6IFRPS0VOX0FDTF9QUk9HUkFNX0lELFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc29sdmVQZXJtaXNzaW9ubGVzc1RoYXcoY29ubmVjdGlvbiwge1xuICAgICAgICBtaW50OiBtaW50QWRkcmVzcyxcbiAgICAgICAgdG9rZW5BY2NvdW50LFxuICAgICAgICB0b2tlbkFjY291bnRPd25lcixcbiAgICAgICAgYXV0aG9yaXR5LFxuICAgICAgfSk7XG4gICAgICByZXN1bHQuc2hvdWxkLmRlZXBFcXVhbCh7IGFwcGxpY2FibGU6IGZhbHNlIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|