@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
package/dist/src/lib/utils.js
CHANGED
|
@@ -3,6 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.isIdempotentAtaInstruction = isIdempotentAtaInstruction;
|
|
6
7
|
exports.isValidAddress = isValidAddress;
|
|
7
8
|
exports.isValidBlockId = isValidBlockId;
|
|
8
9
|
exports.isValidPrivateKey = isValidPrivateKey;
|
|
@@ -12,6 +13,8 @@ exports.isValidTransactionId = isValidTransactionId;
|
|
|
12
13
|
exports.isValidAmount = isValidAmount;
|
|
13
14
|
exports.isValidStakingAmount = isValidStakingAmount;
|
|
14
15
|
exports.isValidMemo = isValidMemo;
|
|
16
|
+
exports.isValidBase64 = isValidBase64;
|
|
17
|
+
exports.isValidHex = isValidHex;
|
|
15
18
|
exports.isValidRawTransaction = isValidRawTransaction;
|
|
16
19
|
exports.verifySignature = verifySignature;
|
|
17
20
|
exports.base58ToUint8Array = base58ToUint8Array;
|
|
@@ -31,6 +34,7 @@ exports.getSolTokenFromTokenName = getSolTokenFromTokenName;
|
|
|
31
34
|
exports.getAssociatedTokenAccountAddress = getAssociatedTokenAccountAddress;
|
|
32
35
|
exports.validateMintAddress = validateMintAddress;
|
|
33
36
|
exports.validateOwnerAddress = validateOwnerAddress;
|
|
37
|
+
exports.isSolLegacyInstruction = isSolLegacyInstruction;
|
|
34
38
|
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
35
39
|
const statics_1 = require("@bitgo-beta/statics");
|
|
36
40
|
const spl_token_1 = require("@solana/spl-token");
|
|
@@ -40,10 +44,25 @@ const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
|
40
44
|
const bs58_1 = __importDefault(require("bs58"));
|
|
41
45
|
const tweetnacl_1 = __importDefault(require("tweetnacl"));
|
|
42
46
|
const constants_1 = require("./constants");
|
|
47
|
+
const spl_stake_pool_1 = require("@solana/spl-stake-pool");
|
|
43
48
|
const DECODED_BLOCK_HASH_LENGTH = 32; // https://docs.solana.com/developing/programming-model/transactions#blockhash-format
|
|
44
49
|
const DECODED_SIGNATURE_LENGTH = 64; // https://docs.solana.com/terminology#signature
|
|
45
50
|
const BASE_58_ENCONDING_REGEX = '[1-9A-HJ-NP-Za-km-z]';
|
|
46
51
|
const COMPUTE_BUDGET = 'ComputeBudget111111111111111111111111111111';
|
|
52
|
+
/**
|
|
53
|
+
* Checks if an ATA instruction is idempotent (discriminator byte = 1).
|
|
54
|
+
*
|
|
55
|
+
* Idempotent ATA instructions use Buffer.from([1]) as instruction data, created by
|
|
56
|
+
* @solana/spl-token's createAssociatedTokenAccountIdempotentInstruction() (v0.4.1+).
|
|
57
|
+
* An idempotent ATA instruction succeed even if account exists,
|
|
58
|
+
* preventing race condition errors in concurrent scenarios.
|
|
59
|
+
*
|
|
60
|
+
* @param {TransactionInstruction} instruction - The instruction to validate
|
|
61
|
+
* @returns {boolean} True if instruction data is a single byte with value 1
|
|
62
|
+
*/
|
|
63
|
+
function isIdempotentAtaInstruction(instruction) {
|
|
64
|
+
return instruction.data.length === 1 && instruction.data[0] === 1;
|
|
65
|
+
}
|
|
47
66
|
/** @inheritdoc */
|
|
48
67
|
function isValidAddress(address) {
|
|
49
68
|
return isValidPublicKey(address);
|
|
@@ -122,6 +141,28 @@ function isValidStakingAmount(amount) {
|
|
|
122
141
|
function isValidMemo(memo) {
|
|
123
142
|
return Buffer.from(memo).length <= constants_1.MAX_MEMO_LENGTH;
|
|
124
143
|
}
|
|
144
|
+
/**
|
|
145
|
+
* Checks if a string is valid base64 encoded data
|
|
146
|
+
* @param str - The string to validate
|
|
147
|
+
* @returns True if the string is valid base64, false otherwise
|
|
148
|
+
*/
|
|
149
|
+
function isValidBase64(str) {
|
|
150
|
+
try {
|
|
151
|
+
const decoded = Buffer.from(str, 'base64').toString('base64');
|
|
152
|
+
return decoded === str;
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Checks if a string is valid hexadecimal data
|
|
160
|
+
* @param str - The string to validate
|
|
161
|
+
* @returns True if the string is valid hex, false otherwise
|
|
162
|
+
*/
|
|
163
|
+
function isValidHex(str) {
|
|
164
|
+
return /^[0-9A-Fa-f]*$/.test(str) && str.length % 2 === 0;
|
|
165
|
+
}
|
|
125
166
|
/**
|
|
126
167
|
* Checks if raw transaction can be deserialized
|
|
127
168
|
*
|
|
@@ -223,7 +264,11 @@ function matchTransactionTypeByInstructionsOrder(instructions, instructionIndexe
|
|
|
223
264
|
}
|
|
224
265
|
// Check instructions by order using the index.
|
|
225
266
|
for (const keyName of instructionsKeys) {
|
|
226
|
-
const
|
|
267
|
+
const index = instructionIndexes[keyName];
|
|
268
|
+
if (index >= instructionsCopy.length) {
|
|
269
|
+
return false;
|
|
270
|
+
}
|
|
271
|
+
const result = getInstructionType(instructionsCopy[index]);
|
|
227
272
|
if (result !== keyName) {
|
|
228
273
|
return false;
|
|
229
274
|
}
|
|
@@ -246,7 +291,7 @@ function getTransactionType(transaction) {
|
|
|
246
291
|
// check if deactivate instruction does not exist because deactivate can be include a transfer instruction
|
|
247
292
|
const memoInstruction = instructions.find((instruction) => getInstructionType(instruction) === 'Memo');
|
|
248
293
|
const memoData = memoInstruction?.data.toString('utf-8');
|
|
249
|
-
if (instructions.filter((instruction) => getInstructionType(instruction) === 'Deactivate').length
|
|
294
|
+
if (instructions.filter((instruction) => getInstructionType(instruction) === 'Deactivate').length === 0) {
|
|
250
295
|
for (const instruction of instructions) {
|
|
251
296
|
const instructionType = getInstructionType(instruction);
|
|
252
297
|
// Check if memo instruction is there and if it contains 'PrepareForRevoke' because Marinade staking deactivate transaction will have this
|
|
@@ -260,6 +305,8 @@ function getTransactionType(transaction) {
|
|
|
260
305
|
return sdk_core_1.TransactionType.WalletInitialization;
|
|
261
306
|
}
|
|
262
307
|
else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.marinadeStakingActivateInstructionsIndexes) ||
|
|
308
|
+
matchTransactionTypeByInstructionsOrder(instructions, constants_1.jitoStakingActivateInstructionsIndexes) ||
|
|
309
|
+
matchTransactionTypeByInstructionsOrder(instructions, constants_1.jitoStakingActivateWithATAInstructionsIndexes) ||
|
|
263
310
|
matchTransactionTypeByInstructionsOrder(instructions, constants_1.stakingActivateInstructionsIndexes)) {
|
|
264
311
|
return sdk_core_1.TransactionType.StakingActivate;
|
|
265
312
|
}
|
|
@@ -271,7 +318,8 @@ function getTransactionType(transaction) {
|
|
|
271
318
|
}
|
|
272
319
|
else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.marinadeStakingDeactivateInstructionsIndexes) ||
|
|
273
320
|
matchTransactionTypeByInstructionsOrder(instructions, constants_1.stakingDeactivateInstructionsIndexes) ||
|
|
274
|
-
matchTransactionTypeByInstructionsOrder(instructions, constants_1.stakingPartialDeactivateInstructionsIndexes)
|
|
321
|
+
matchTransactionTypeByInstructionsOrder(instructions, constants_1.stakingPartialDeactivateInstructionsIndexes) ||
|
|
322
|
+
matchTransactionTypeByInstructionsOrder(instructions, constants_1.jitoStakingDeactivateInstructionsIndexes)) {
|
|
275
323
|
return sdk_core_1.TransactionType.StakingDeactivate;
|
|
276
324
|
}
|
|
277
325
|
else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.stakingWithdrawInstructionsIndexes)) {
|
|
@@ -284,7 +332,7 @@ function getTransactionType(transaction) {
|
|
|
284
332
|
return sdk_core_1.TransactionType.CloseAssociatedTokenAccount;
|
|
285
333
|
}
|
|
286
334
|
else {
|
|
287
|
-
|
|
335
|
+
return sdk_core_1.TransactionType.CustomTx;
|
|
288
336
|
}
|
|
289
337
|
}
|
|
290
338
|
/**
|
|
@@ -302,28 +350,33 @@ function getInstructionType(instruction) {
|
|
|
302
350
|
return web3_js_1.SystemInstruction.decodeInstructionType(instruction);
|
|
303
351
|
case spl_token_1.TOKEN_PROGRAM_ID.toString():
|
|
304
352
|
case spl_token_1.TOKEN_2022_PROGRAM_ID.toString():
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
}
|
|
353
|
+
const decodedInstruction = (0, spl_token_1.decodeInstruction)(instruction, instruction.programId);
|
|
354
|
+
const instructionTypeMap = new Map();
|
|
355
|
+
instructionTypeMap.set(spl_token_1.TokenInstruction.CloseAccount, 'CloseAssociatedTokenAccount');
|
|
356
|
+
instructionTypeMap.set(spl_token_1.TokenInstruction.Burn, 'Burn');
|
|
357
|
+
instructionTypeMap.set(spl_token_1.TokenInstruction.MintTo, 'MintTo');
|
|
358
|
+
instructionTypeMap.set(spl_token_1.TokenInstruction.Approve, 'Approve');
|
|
359
|
+
instructionTypeMap.set(spl_token_1.TokenInstruction.TransferChecked, 'TokenTransfer');
|
|
360
|
+
const validInstruction = instructionTypeMap.get(decodedInstruction.data.instruction);
|
|
361
|
+
if (!validInstruction) {
|
|
362
|
+
return 'CustomInstruction';
|
|
316
363
|
}
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
364
|
+
return validInstruction;
|
|
365
|
+
case spl_stake_pool_1.STAKE_POOL_PROGRAM_ID.toString():
|
|
366
|
+
const discriminator = instruction.data.readUint8(0);
|
|
367
|
+
const layoutKey = Object.entries(spl_stake_pool_1.STAKE_POOL_INSTRUCTION_LAYOUTS).find(([_, v]) => v.index === discriminator)?.[0];
|
|
368
|
+
if (layoutKey === undefined) {
|
|
369
|
+
throw new Error('Instruction type incorrect; unknown discriminator');
|
|
320
370
|
}
|
|
321
|
-
|
|
371
|
+
const instructionKey = layoutKey;
|
|
372
|
+
return instructionKey;
|
|
322
373
|
case web3_js_1.StakeProgram.programId.toString():
|
|
323
374
|
return web3_js_1.StakeInstruction.decodeInstructionType(instruction);
|
|
324
375
|
case spl_token_1.ASSOCIATED_TOKEN_PROGRAM_ID.toString():
|
|
325
376
|
// TODO: change this when @spl-token supports decoding associated token instructions
|
|
326
|
-
|
|
377
|
+
// Support both legacy ATA creation (data.length === 0) and idempotent ATA creation (discriminator = 1)
|
|
378
|
+
// Both instruction types are treated as 'InitializeAssociatedTokenAccount' for compatibility
|
|
379
|
+
if (instruction.data.length === 0 || isIdempotentAtaInstruction(instruction)) {
|
|
327
380
|
return 'InitializeAssociatedTokenAccount';
|
|
328
381
|
}
|
|
329
382
|
else {
|
|
@@ -332,7 +385,7 @@ function getInstructionType(instruction) {
|
|
|
332
385
|
case COMPUTE_BUDGET:
|
|
333
386
|
return 'SetPriorityFee';
|
|
334
387
|
default:
|
|
335
|
-
|
|
388
|
+
return 'CustomInstruction';
|
|
336
389
|
}
|
|
337
390
|
}
|
|
338
391
|
/**
|
|
@@ -490,7 +543,7 @@ async function getAssociatedTokenAccountAddress(tokenMintAddress, ownerAddress,
|
|
|
490
543
|
}
|
|
491
544
|
if (!programId) {
|
|
492
545
|
const coin = getSolTokenFromAddressOnly(tokenMintAddress);
|
|
493
|
-
if (coin && coin instanceof statics_1.SolCoin && coin.programId) {
|
|
546
|
+
if (coin && coin instanceof statics_1.SolCoin && 'programId' in coin && coin.programId) {
|
|
494
547
|
programId = coin.programId.toString();
|
|
495
548
|
}
|
|
496
549
|
else {
|
|
@@ -499,7 +552,7 @@ async function getAssociatedTokenAccountAddress(tokenMintAddress, ownerAddress,
|
|
|
499
552
|
}
|
|
500
553
|
let ataAddress;
|
|
501
554
|
if (programId === spl_token_1.TOKEN_2022_PROGRAM_ID.toString()) {
|
|
502
|
-
ataAddress = await (0, spl_token_1.getAssociatedTokenAddress)(mintPublicKey, ownerPublicKey,
|
|
555
|
+
ataAddress = await (0, spl_token_1.getAssociatedTokenAddress)(mintPublicKey, ownerPublicKey, allowOwnerOffCurve, spl_token_1.TOKEN_2022_PROGRAM_ID);
|
|
503
556
|
}
|
|
504
557
|
else {
|
|
505
558
|
ataAddress = await (0, spl_token_1.getAssociatedTokenAddress)(mintPublicKey, ownerPublicKey, allowOwnerOffCurve);
|
|
@@ -516,4 +569,15 @@ function validateOwnerAddress(ownerAddress) {
|
|
|
516
569
|
throw new sdk_core_1.BuildTransactionError('Invalid or missing ownerAddress, got: ' + ownerAddress);
|
|
517
570
|
}
|
|
518
571
|
}
|
|
519
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBMkRBLHdDQUVDO0FBR0Qsd0NBUUM7QUFHRCw4Q0FPQztBQUdELDRDQVFDO0FBR0QsNENBTUM7QUFJRCxvREFFQztBQVFELHNDQUdDO0FBUUQsb0RBR0M7QUFRRCxrQ0FFQztBQVVELHNEQVlDO0FBVUQsMENBY0M7QUFRRCxnREFFQztBQVFELGdEQUVDO0FBUUQsd0RBRUM7QUFRRCxzREFFQztBQVVELDBGQTJCQztBQVNELGdEQStDQztBQVNELGdEQXlDQztBQVNELDBEQU1DO0FBUUQsOERBc0NDO0FBTUQsd0RBV0M7QUFRRCwwQ0FJQztBQVNELHdEQWNDO0FBU0QsZ0VBY0M7QUFNRCw0REFhQztBQVFELDRFQThCQztBQUVELGtEQUlDO0FBRUQsb0RBSUM7QUE5akJELG1EQU84QjtBQUM5QixpREFBaUc7QUFDakcsaURBTTJCO0FBQzNCLDZDQVV5QjtBQUN6QixvREFBNEI7QUFDNUIsZ0VBQXFDO0FBQ3JDLGdEQUF3QjtBQUN4QiwwREFBNkI7QUFDN0IsMkNBbUJxQjtBQUdyQixNQUFNLHlCQUF5QixHQUFHLEVBQUUsQ0FBQyxDQUFDLHFGQUFxRjtBQUMzSCxNQUFNLHdCQUF3QixHQUFHLEVBQUUsQ0FBQyxDQUFDLGdEQUFnRDtBQUNyRixNQUFNLHVCQUF1QixHQUFHLHNCQUFzQixDQUFDO0FBQ3ZELE1BQU0sY0FBYyxHQUFHLDZDQUE2QyxDQUFDO0FBRXJFLGtCQUFrQjtBQUNsQixTQUFnQixjQUFjLENBQUMsT0FBZTtJQUM1QyxPQUFPLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ25DLENBQUM7QUFFRCxrQkFBa0I7QUFDbEIsU0FBZ0IsY0FBYyxDQUFDLElBQVk7SUFDekMsSUFBSSxDQUFDO1FBQ0gsT0FBTyxDQUNMLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxNQUFNLENBQUMs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O0FBQy9CLENBQUM7QUFFRCxTQUFnQixtQkFBbUIsQ0FBQyxXQUFtQjtJQUNyRCxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7UUFDakQsTUFBTSxJQUFJLGdDQUFxQixDQUFDLHVDQUF1QyxHQUFHLFdBQVcsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBZ0Isb0JBQW9CLENBQUMsWUFBb0I7SUFDdkQsSUFBSSxDQUFDLFlBQVksSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1FBQ25ELE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyx3Q0FBd0MsR0FBRyxZQUFZLENBQUMsQ0FBQztJQUMzRixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcixcbiAgaXNWYWxpZFhwdWIsXG4gIE5vdFN1cHBvcnRlZCxcbiAgUGFyc2VUcmFuc2FjdGlvbkVycm9yLFxuICBUcmFuc2FjdGlvblR5cGUsXG4gIFV0aWxzRXJyb3IsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEJhc2VDb2luLCBCYXNlTmV0d29yaywgQ29pbk5vdERlZmluZWRFcnJvciwgY29pbnMsIFNvbENvaW4gfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7XG4gIEFTU09DSUFURURfVE9LRU5fUFJPR1JBTV9JRCxcbiAgZGVjb2RlQ2xvc2VBY2NvdW50SW5zdHJ1Y3Rpb24sXG4gIGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3MsXG4gIFRPS0VOX1BST0dSQU1fSUQsXG4gIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCxcbn0gZnJvbSAnQHNvbGFuYS9zcGwtdG9rZW4nO1xuaW1wb3J0IHtcbiAgS2V5cGFpcixcbiAgUHVibGljS2V5LFxuICBTaWduYXR1cmVQdWJrZXlQYWlyLFxuICBUcmFuc2FjdGlvbiBhcyBTb2xUcmFuc2FjdGlvbixcbiAgU3Rha2VJbnN0cnVjdGlvbixcbiAgU3Rha2VQcm9ncmFtLFxuICBTeXN0ZW1JbnN0cnVjdGlvbixcbiAgU3lzdGVtUHJvZ3JhbSxcbiAgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbixcbn0gZnJvbSAnQHNvbGFuYS93ZWIzLmpzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCBiczU4IGZyb20gJ2JzNTgnO1xuaW1wb3J0IG5hY2wgZnJvbSAndHdlZXRuYWNsJztcbmltcG9ydCB7XG4gIGF0YUNsb3NlSW5zdHJ1Y3Rpb25JbmRleGVzLFxuICBhdGFJbml0SW5zdHJ1Y3Rpb25JbmRleGVzLFxuICBNQVhfTUVNT19MRU5HVEgsXG4gIE1FTU9fUFJPR1JBTV9QSyxcbiAgbm9uY2VBZHZhbmNlSW5zdHJ1Y3Rpb24sXG4gIHN0YWtpbmdBY3RpdmF0ZUluc3RydWN0aW9uc0luZGV4ZXMsXG4gIG1hcmluYWRlU3Rha2luZ0FjdGl2YXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcyxcbiAgc3Rha2luZ0F1dGhvcml6ZUluc3RydWN0aW9uc0luZGV4ZXMsXG4gIHN0YWtpbmdEZWFjdGl2YXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcyxcbiAgbWFyaW5hZGVTdGFraW5nRGVhY3RpdmF0ZUluc3RydWN0aW9uc0luZGV4ZXMsXG4gIHN0YWtpbmdEZWxlZ2F0ZUluc3RydWN0aW9uc0luZGV4ZXMsXG4gIHN0YWtpbmdQYXJ0aWFsRGVhY3RpdmF0ZUluc3RydWN0aW9uc0luZGV4ZXMsXG4gIHN0YWtpbmdXaXRoZHJhd0luc3RydWN0aW9uc0luZGV4ZXMsXG4gIFZBTElEX1NZU1RFTV9JTlNUUlVDVElPTl9UWVBFUyxcbiAgdmFsaWRJbnN0cnVjdGlvbkRhdGEsXG4gIHZhbGlkSW5zdHJ1Y3Rpb25EYXRhMixcbiAgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bSxcbiAgd2FsbGV0SW5pdEluc3RydWN0aW9uSW5kZXhlcyxcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgVmFsaWRJbnN0cnVjdGlvblR5cGVzIH0gZnJvbSAnLi9pZmFjZSc7XG5cbmNvbnN0IERFQ09ERURfQkxPQ0tfSEFTSF9MRU5HVEggPSAzMjsgLy8gaHR0cHM6Ly9kb2NzLnNvbGFuYS5jb20vZGV2ZWxvcGluZy9wcm9ncmFtbWluZy1tb2RlbC90cmFuc2FjdGlvbnMjYmxvY2toYXNoLWZvcm1hdFxuY29uc3QgREVDT0RFRF9TSUdOQVRVUkVfTEVOR1RIID0gNjQ7IC8vIGh0dHBzOi8vZG9jcy5zb2xhbmEuY29tL3Rlcm1pbm9sb2d5I3NpZ25hdHVyZVxuY29uc3QgQkFTRV81OF9FTkNPTkRJTkdfUkVHRVggPSAnWzEtOUEtSEotTlAtWmEta20tel0nO1xuY29uc3QgQ09NUFVURV9CVURHRVQgPSAnQ29tcHV0ZUJ1ZGdldDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSc7XG5cbi8qKiBAaW5oZXJpdGRvYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNWYWxpZFB1YmxpY0tleShhZGRyZXNzKTtcbn1cblxuLyoqIEBpbmhlcml0ZG9jICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEJsb2NrSWQoaGFzaDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhaGFzaCAmJiBuZXcgUmVnRXhwKEJBU0VfNThfRU5DT05ESU5HX1JFR0VYKS50ZXN0KGhhc2gpICYmIGJzNTguZGVjb2RlKGhhc2gpLmxlbmd0aCA9PT0gREVDT0RFRF9CTE9DS19IQVNIX0xFTkdUSFxuICAgICk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqIEBpbmhlcml0ZG9jICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFByaXZhdGVLZXkocHJ2S2V5OiBzdHJpbmcgfCBVaW50OEFycmF5KTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgY29uc3Qga2V5OiBVaW50OEFycmF5ID0gdHlwZW9mIHBydktleSA9PT0gJ3N0cmluZycgPyBiYXNlNThUb1VpbnQ4QXJyYXkocHJ2S2V5KSA6IHBydktleTtcbiAgICByZXR1cm4gISFLZXlwYWlyLmZyb21TZWNyZXRLZXkoa2V5KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKiogQGluaGVyaXRkb2MgKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkUHVibGljS2V5KHB1YktleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgaWYgKGlzVmFsaWRYcHViKHB1YktleSkpIHJldHVybiB0cnVlO1xuICAgIG5ldyBQdWJsaWNLZXkocHViS2V5KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKiBAaW5oZXJpdGRvYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRTaWduYXR1cmUoc2lnbmF0dXJlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gISFzaWduYXR1cmUgJiYgYnM1OC5kZWNvZGUoc2lnbmF0dXJlKS5sZW5ndGggPT09IERFQ09ERURfU0lHTkFUVVJFX0xFTkdUSDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKiogQGluaGVyaXRkb2MgKi9cbi8vIFRyYW5zYWN0aW9uSWQgYXJlIHRoZSBmaXJzdCBzaWduYXR1cmUgb24gYSBUcmFuc2FjdGlvblxuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRUcmFuc2FjdGlvbklkKHR4SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNWYWxpZFNpZ25hdHVyZSh0eElkKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBzdHJpbmcgaXMgYSB2YWxpZCBhbW91bnQgb2YgbGFtcG9ydHMgbnVtYmVyXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFtb3VudCAtIHRoZSBzdHJpbmcgdG8gdmFsaWRhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEFtb3VudChhbW91bnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBiaWdOdW1iZXJBbW91bnQgPSBuZXcgQmlnTnVtYmVyKGFtb3VudCk7XG4gIHJldHVybiBiaWdOdW1iZXJBbW91bnQuaXNJbnRlZ2VyKCkgJiYgYmlnTnVtYmVyQW1vdW50LmlzR3JlYXRlclRoYW5PckVxdWFsVG8oMCk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIHN0cmluZyBpcyBhIHZhbGlkIGFtb3VudCBvZiBsYW1wb3J0cyBudW1iZXIgb24gc3Rha2luZ1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhbW91bnQgLSB0aGUgc3RyaW5nIHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0aGUgdmFsaWRhdGlvbiByZXN1bHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRTdGFraW5nQW1vdW50KGFtb3VudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGJpZ051bWJlckFtb3VudCA9IG5ldyBCaWdOdW1iZXIoYW1vdW50KTtcbiAgcmV0dXJuIGJpZ051bWJlckFtb3VudC5pc0ludGVnZXIoKSAmJiBiaWdOdW1iZXJBbW91bnQuaXNHcmVhdGVyVGhhbigwKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGlzIGlzIGEgdmFsaWQgbWVtbyBvciBub3QuXG4gKlxuICogQHBhcmFtIG1lbW8gLSB0aGUgbWVtbyBzdHJpbmdcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZE1lbW8obWVtbzogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBCdWZmZXIuZnJvbShtZW1vKS5sZW5ndGggPD0gTUFYX01FTU9fTEVOR1RIO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiByYXcgdHJhbnNhY3Rpb24gY2FuIGJlIGRlc2VyaWFsaXplZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByYXdUcmFuc2FjdGlvbiAtIHRyYW5zYWN0aW9uIGluIGJhc2U2NCBzdHJpbmcgZm9ybWF0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IHJlcXVpcmVBbGxTaWduYXR1cmVzIC0gcmVxdWlyZSBhbGwgc2lnbmF0dXJlcyB0byBiZSBwcmVzZW50XG4gKiBAcGFyYW0ge2Jvb2xlYW59IHZlcmlmeVNpZ25hdHVyZXMgLSB2ZXJpZnkgc2lnbmF0dXJlc1xuICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkUmF3VHJhbnNhY3Rpb24oXG4gIHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcsXG4gIHJlcXVpcmVBbGxTaWduYXR1cmVzID0gZmFsc2UsXG4gIHZlcmlmeVNpZ25hdHVyZXMgPSBmYWxzZVxuKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgY29uc3QgdHggPSBTb2xUcmFuc2FjdGlvbi5mcm9tKEJ1ZmZlci5mcm9tKHJhd1RyYW5zYWN0aW9uLCAnYmFzZTY0JykpO1xuICAgIHR4LnNlcmlhbGl6ZSh7IHJlcXVpcmVBbGxTaWduYXR1cmVzLCB2ZXJpZnlTaWduYXR1cmVzIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogVmVyaWZpZXMgaWYgc2lnbmF0dXJlIGZvciBtZXNzYWdlIGlzIHZhbGlkLlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBzZXJpYWxpemVkVHggLSB0eCBhcyBhIGJhc2U2NCBzdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBzaWduYXR1cmUgLSBzaWduYXR1cmUgYXMgYSBzdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBwdWJsaWNLZXkgLSBwdWJsaWMga2V5IGFzIGJhc2UgNThcbiAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIHNpZ25hdHVyZSBpcyB2YWxpZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcmlmeVNpZ25hdHVyZShzZXJpYWxpemVkVHg6IHN0cmluZywgc2lnbmF0dXJlOiBzdHJpbmcsIHB1YmxpY0tleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICghaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHNlcmlhbGl6ZWRUeCkpIHtcbiAgICB0aHJvdyBuZXcgVXRpbHNFcnJvcignSW52YWxpZCBzZXJpYWxpemVkVHgnKTtcbiAgfVxuICBpZiAoIWlzVmFsaWRQdWJsaWNLZXkocHVibGljS2V5KSkge1xuICAgIHRocm93IG5ldyBVdGlsc0Vycm9yKCdJbnZhbGlkIHB1YmxpY0tleScpO1xuICB9XG4gIGlmICghaXNWYWxpZFNpZ25hdHVyZShzaWduYXR1cmUpKSB7XG4gICAgdGhyb3cgbmV3IFV0aWxzRXJyb3IoJ0ludmFsaWQgc2lnbmF0dXJlJyk7XG4gIH1cbiAgY29uc3QgbXNnID0gU29sVHJhbnNhY3Rpb24uZnJvbShCdWZmZXIuZnJvbShzZXJpYWxpemVkVHgsICdiYXNlNjQnKSkuc2VyaWFsaXplTWVzc2FnZSgpO1xuICBjb25zdCBzaWcgPSBiYXNlNThUb1VpbnQ4QXJyYXkoc2lnbmF0dXJlKTtcbiAgY29uc3QgcHViID0gbmV3IFB1YmxpY0tleShwdWJsaWNLZXkpO1xuICByZXR1cm4gbmFjbC5zaWduLmRldGFjaGVkLnZlcmlmeShtc2csIHNpZywgcHViLnRvQnVmZmVyKCkpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgYmFzZTU4IHN0cmluZyBpbnRvIGEgVWludDhBcnJheS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQgLSBhIHN0cmluZyBpbiBiYXNlNThcbiAqIEByZXR1cm5zIHtVaW50OEFycmF5fSAtIGFuIFVpbnQ4QXJyYXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJhc2U1OFRvVWludDhBcnJheShpbnB1dDogc3RyaW5nKTogVWludDhBcnJheSB7XG4gIHJldHVybiBuZXcgVWludDhBcnJheShiczU4LmRlY29kZShpbnB1dCkpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgVWludDhBcnJheSB0byBhIGJhc2U1OCBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtVaW50OEFycmF5fSBpbnB1dCAtIGFuIFVpbnQ4QXJyYXlcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gYSBzdHJpbmcgaW4gYmFzZTU4XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBVaW50OEFycmF5VG9iYXNlNTgoaW5wdXQ6IFVpbnQ4QXJyYXkpOiBzdHJpbmcge1xuICByZXR1cm4gYnM1OC5lbmNvZGUoaW5wdXQpO1xufVxuXG4vKipcbiAqIENvdW50IHRoZSBhbW91bnQgb2Ygc2lnbmF0dXJlcyBhcmUgbm90IG51bGwuXG4gKlxuICogQHBhcmFtIHtTaWduYXR1cmVQdWJrZXlQYWlyW119IHNpZ25hdHVyZXMgLSBhbiBhcnJheSBvZiBTaWduYXR1cmVQdWJrZXlQYWlyXG4gKiBAcmV0dXJucyB7bnVtYmVyfSAtIHRoZSBhbW91bnQgb2YgdmFsaWQgc2lnbmF0dXJlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY291bnROb3ROdWxsU2lnbmF0dXJlcyhzaWduYXR1cmVzOiBTaWduYXR1cmVQdWJrZXlQYWlyW10pOiBudW1iZXIge1xuICByZXR1cm4gc2lnbmF0dXJlcy5maWx0ZXIoKHNpZykgPT4gISFzaWcuc2lnbmF0dXJlKS5sZW5ndGg7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYWxsIHNpZ25hdHVyZXMgYXJlIGNvbXBsZXRlZC5cbiAqXG4gKiBAcGFyYW0ge1NpZ25hdHVyZVB1YmtleVBhaXJbXX0gc2lnbmF0dXJlcyAtIHNpZ25hdHVyZXNcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZXNBbGxTaWduYXR1cmVzKHNpZ25hdHVyZXM6IFNpZ25hdHVyZVB1YmtleVBhaXJbXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gc2lnbmF0dXJlcy5sZW5ndGggPiAwICYmIGNvdW50Tm90TnVsbFNpZ25hdHVyZXMoc2lnbmF0dXJlcykgPT09IHNpZ25hdHVyZXMubGVuZ3RoO1xufVxuXG4vKipcbiAqIENoZWNrIHRoZSB0cmFuc2FjdGlvbiB0eXBlIG1hdGNoaW5nIGluc3RydWN0aW9ucyBieSBvcmRlci4gTWVtbyBhbmQgQWR2YW5jZU5vbmNlQWNjb3VudCBpbnN0cnVjdGlvbnNcbiAqIGFyZSBpZ25vcmVkLlxuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSB0aGUgYXJyYXkgb2Ygc3VwcG9ydGVkIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gYmUgcGFyc2VkXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIG51bWJlcj59IGluc3RydWN0aW9uSW5kZXhlcyAtIHRoZSBpbnN0cnVjdGlvbnMgaW5kZXhlcyBvZiB0aGUgY3VycmVudCB0cmFuc2FjdGlvblxuICogQHJldHVybnMgdHJ1ZSBpZiBpdCBtYXRjaGVzIGJ5IG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKFxuICBpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSxcbiAgaW5zdHJ1Y3Rpb25JbmRleGVzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+XG4pOiBib29sZWFuIHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25zQ29weSA9IFsuLi5pbnN0cnVjdGlvbnNdOyAvLyBNYWtlIGEgY29weSBzaW5jZSB3ZSBtYXkgbW9kaWZ5IHRoZSBhcnJheSBiZWxvd1xuICAvLyBBZHZhbmNlTm9uY2VBY2NvdW50IGlzIG9wdGlvbmFsIGFuZCB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gYWRkZWQsIGl0IGRvZXMgbm90IG1hdHRlciB0byBtYXRjaCB0aGUgdHlwZVxuICBpZiAoaW5zdHJ1Y3Rpb25zQ29weS5sZW5ndGggPiAwKSB7XG4gICAgaWYgKGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbnNbMF0pID09PSAnQWR2YW5jZU5vbmNlQWNjb3VudCcpIHtcbiAgICAgIGluc3RydWN0aW9uc0NvcHkuc2hpZnQoKTtcbiAgICB9XG4gIH1cblxuICAvLyBNZW1vIGlzIG9wdGlvbmFsIGFuZCB0aGUgbGFzdCBpbnN0cnVjdGlvbiBhZGRlZCwgaXQgZG9lcyBub3QgbWF0dGVyIHRvIG1hdGNoIHRoZSB0eXBlXG4gIC8vIFdoeSBoYXZlIGl0IGluIGluc3RydWN0aW9uS2V5cyBpZiB3ZSBhcmUgZ29pbmcgdG8gaWdub3JlIGl0P1xuICBjb25zdCBpbnN0cnVjdGlvbnNLZXlzID0gT2JqZWN0LmtleXMoaW5zdHJ1Y3Rpb25JbmRleGVzKTtcbiAgaWYgKGluc3RydWN0aW9uc0tleXNbaW5zdHJ1Y3Rpb25zS2V5cy5sZW5ndGggLSAxXSA9PT0gJ01lbW8nKSB7XG4gICAgaW5zdHJ1Y3Rpb25zS2V5cy5wb3AoKTtcbiAgfVxuXG4gIC8vIENoZWNrIGluc3RydWN0aW9ucyBieSBvcmRlciB1c2luZyB0aGUgaW5kZXguXG4gIGZvciAoY29uc3Qga2V5TmFtZSBvZiBpbnN0cnVjdGlvbnNLZXlzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uc0NvcHlbaW5zdHJ1Y3Rpb25JbmRleGVzW2tleU5hbWVdXSk7XG4gICAgaWYgKHJlc3VsdCAhPT0ga2V5TmFtZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB0cmFuc2FjdGlvbiBUeXBlIGJhc2VkIG9uIHRoZSAgdHJhbnNhY3Rpb24gaW5zdHJ1Y3Rpb25zLlxuICogV2FsbGV0IGluaXRpYWxpemF0aW9uLCBUcmFuc2ZlciBhbmQgU3Rha2luZyB0cmFuc2FjdGlvbnMgYXJlIHN1cHBvcnRlZC5cbiAqXG4gKiBAcGFyYW0ge1NvbFRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvbiAtIHRoZSBzb2xhbmEgdHJhbnNhY3Rpb25cbiAqIEByZXR1cm5zIHtUcmFuc2FjdGlvblR5cGV9IC0gdGhlIHR5cGUgb2YgdHJhbnNhY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uVHlwZSh0cmFuc2FjdGlvbjogU29sVHJhbnNhY3Rpb24pOiBUcmFuc2FjdGlvblR5cGUge1xuICBjb25zdCB7IGluc3RydWN0aW9ucyB9ID0gdHJhbnNhY3Rpb247XG4gIGlmICh2YWxpZGF0ZVJhd01zZ0luc3RydWN0aW9uKGluc3RydWN0aW9ucykpIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBdXRob3JpemVSYXc7XG4gIH1cbiAgdmFsaWRhdGVJbnRydWN0aW9uVHlwZXMoaW5zdHJ1Y3Rpb25zKTtcbiAgLy8gY2hlY2sgaWYgZGVhY3RpdmF0ZSBpbnN0cnVjdGlvbiBkb2VzIG5vdCBleGlzdCBiZWNhdXNlIGRlYWN0aXZhdGUgY2FuIGJlIGluY2x1ZGUgYSB0cmFuc2ZlciBpbnN0cnVjdGlvblxuICBjb25zdCBtZW1vSW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbnMuZmluZCgoaW5zdHJ1Y3Rpb24pID0+IGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbikgPT09ICdNZW1vJyk7XG4gIGNvbnN0IG1lbW9EYXRhID0gbWVtb0luc3RydWN0aW9uPy5kYXRhLnRvU3RyaW5nKCd1dGYtOCcpO1xuICBpZiAoaW5zdHJ1Y3Rpb25zLmZpbHRlcigoaW5zdHJ1Y3Rpb24pID0+IGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbikgPT09ICdEZWFjdGl2YXRlJykubGVuZ3RoID09IDApIHtcbiAgICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25UeXBlID0gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKTtcbiAgICAgIC8vIENoZWNrIGlmIG1lbW8gaW5zdHJ1Y3Rpb24gaXMgdGhlcmUgYW5kIGlmIGl0IGNvbnRhaW5zICdQcmVwYXJlRm9yUmV2b2tlJyBiZWNhdXNlIE1hcmluYWRlIHN0YWtpbmcgZGVhY3RpdmF0ZSB0cmFuc2FjdGlvbiB3aWxsIGhhdmUgdGhpc1xuICAgICAgaWYgKFxuICAgICAgICAoaW5zdHJ1Y3Rpb25UeXBlID09PSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlRyYW5zZmVyICYmICFtZW1vRGF0YT8uaW5jbHVkZXMoJ1ByZXBhcmVGb3JSZXZva2UnKSkgfHxcbiAgICAgICAgaW5zdHJ1Y3Rpb25UeXBlID09PSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlRva2VuVHJhbnNmZXJcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlNlbmQ7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCB3YWxsZXRJbml0SW5zdHJ1Y3Rpb25JbmRleGVzKSkge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb247XG4gIH0gZWxzZSBpZiAoXG4gICAgbWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgbWFyaW5hZGVTdGFraW5nQWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzKSB8fFxuICAgIG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIHN0YWtpbmdBY3RpdmF0ZUluc3RydWN0aW9uc0luZGV4ZXMpXG4gICkge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0FjdGl2YXRlO1xuICB9IGVsc2UgaWYgKG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIHN0YWtpbmdBdXRob3JpemVJbnN0cnVjdGlvbnNJbmRleGVzKSkge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0F1dGhvcml6ZTtcbiAgfSBlbHNlIGlmIChtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCBzdGFraW5nRGVsZWdhdGVJbnN0cnVjdGlvbnNJbmRleGVzKSkge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0RlbGVnYXRlO1xuICB9IGVsc2UgaWYgKFxuICAgIG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIG1hcmluYWRlU3Rha2luZ0RlYWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzKSB8fFxuICAgIG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIHN0YWtpbmdEZWFjdGl2YXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcykgfHxcbiAgICBtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCBzdGFraW5nUGFydGlhbERlYWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzKVxuICApIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdEZWFjdGl2YXRlO1xuICB9IGVsc2UgaWYgKG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIHN0YWtpbmdXaXRoZHJhd0luc3RydWN0aW9uc0luZGV4ZXMpKSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nV2l0aGRyYXc7XG4gIH0gZWxzZSBpZiAobWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgYXRhSW5pdEluc3RydWN0aW9uSW5kZXhlcykpIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLkFzc29jaWF0ZWRUb2tlbkFjY291bnRJbml0aWFsaXphdGlvbjtcbiAgfSBlbHNlIGlmIChtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCBhdGFDbG9zZUluc3RydWN0aW9uSW5kZXhlcykpIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLkNsb3NlQXNzb2NpYXRlZFRva2VuQWNjb3VudDtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdJbnZhbGlkIHRyYW5zYWN0aW9uLCB0cmFuc2FjdGlvbiBub3Qgc3VwcG9ydGVkIG9yIGludmFsaWQnKTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGluc3RydWN0aW9uIFR5cGUgYmFzZWQgb24gdGhlIHNvbGFuYSBpbnN0cnVjdGlvbnMuXG4gKiBUaHJvd3MgaWYgdGhlIHNvbGFuYSBpbnN0cnVjdGlvbiBwcm9ncmFtIGlzIG5vdCBzdXBwb3J0ZWRcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb259IGluc3RydWN0aW9uIC0gYSBzb2xhbmEgaW5zdHJ1Y3Rpb25cbiAqIEByZXR1cm5zIHtWYWxpZEluc3RydWN0aW9uVHlwZXN9IC0gYSBzb2xhbmEgaW5zdHJ1Y3Rpb24gdHlwZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uKTogVmFsaWRJbnN0cnVjdGlvblR5cGVzIHtcbiAgc3dpdGNoIChpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9TdHJpbmcoKSkge1xuICAgIGNhc2UgbmV3IFB1YmxpY0tleShNRU1PX1BST0dSQU1fUEspLnRvU3RyaW5nKCk6XG4gICAgICByZXR1cm4gJ01lbW8nO1xuICAgIGNhc2UgU3lzdGVtUHJvZ3JhbS5wcm9ncmFtSWQudG9TdHJpbmcoKTpcbiAgICAgIHJldHVybiBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgIGNhc2UgVE9LRU5fUFJPR1JBTV9JRC50b1N0cmluZygpOlxuICAgIGNhc2UgVE9LRU5fMjAyMl9QUk9HUkFNX0lELnRvU3RyaW5nKCk6XG4gICAgICB0cnkge1xuICAgICAgICBsZXQgZGVjb2RlZEluc3RydWN0aW9uO1xuICAgICAgICBpZiAoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkLnRvU3RyaW5nKCkgIT09IFRPS0VOXzIwMjJfUFJPR1JBTV9JRC50b1N0cmluZygpKSB7XG4gICAgICAgICAgZGVjb2RlZEluc3RydWN0aW9uID0gZGVjb2RlQ2xvc2VBY2NvdW50SW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlY29kZWRJbnN0cnVjdGlvbiA9IGRlY29kZUNsb3NlQWNjb3VudEluc3RydWN0aW9uKGluc3RydWN0aW9uLCBUT0tFTl8yMDIyX1BST0dSQU1fSUQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWNvZGVkSW5zdHJ1Y3Rpb24gJiYgZGVjb2RlZEluc3RydWN0aW9uLmRhdGEuaW5zdHJ1Y3Rpb24gPT09IDkpIHtcbiAgICAgICAgICByZXR1cm4gJ0Nsb3NlQXNzb2NpYXRlZFRva2VuQWNjb3VudCc7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gaWdub3JlIGVycm9yIGFuZCBkZWZhdWx0IHRvIFRva2VuVHJhbnNmZXJcbiAgICAgICAgcmV0dXJuICdUb2tlblRyYW5zZmVyJztcbiAgICAgIH1cbiAgICAgIHJldHVybiAnVG9rZW5UcmFuc2Zlcic7XG4gICAgY2FzZSBTdGFrZVByb2dyYW0ucHJvZ3JhbUlkLnRvU3RyaW5nKCk6XG4gICAgICByZXR1cm4gU3Rha2VJbnN0cnVjdGlvbi5kZWNvZGVJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgIGNhc2UgQVNTT0NJQVRFRF9UT0tFTl9QUk9HUkFNX0lELnRvU3RyaW5nKCk6XG4gICAgICAvLyBUT0RPOiBjaGFuZ2UgdGhpcyB3aGVuIEBzcGwtdG9rZW4gc3VwcG9ydHMgZGVjb2RpbmcgYXNzb2NpYXRlZCB0b2tlbiBpbnN0cnVjdGlvbnNcbiAgICAgIGlmIChpbnN0cnVjdGlvbi5kYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gJ0luaXRpYWxpemVBc3NvY2lhdGVkVG9rZW5BY2NvdW50JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoXG4gICAgICAgICAgJ0ludmFsaWQgdHJhbnNhY3Rpb24sIGluc3RydWN0aW9uIHByb2dyYW0gaWQgbm90IHN1cHBvcnRlZDogJyArIGluc3RydWN0aW9uLnByb2dyYW1JZC50b1N0cmluZygpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgY2FzZSBDT01QVVRFX0JVREdFVDpcbiAgICAgIHJldHVybiAnU2V0UHJpb3JpdHlGZWUnO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgICAnSW52YWxpZCB0cmFuc2FjdGlvbiwgaW5zdHJ1Y3Rpb24gcHJvZ3JhbSBpZCBub3Qgc3VwcG9ydGVkOiAnICsgaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkLnRvU3RyaW5nKClcbiAgICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBzb2xhbmEgaW5zdHJ1Y3Rpb25zIHR5cGVzIHRvIHNlZSBpZiB0aGV5IGFyZSBzdXBwb3J0ZWQgYnkgdGhlIGJ1aWxkZXIuXG4gKiBUaHJvd3MgaWYgdGhlIGluc3RydWN0aW9uIHR5cGUgaXMgaW52YWxpZC5cbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb259IGluc3RydWN0aW9ucyAtIGEgc29sYW5hIGluc3RydWN0aW9uXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlSW50cnVjdGlvblR5cGVzKGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb25zKSB7XG4gICAgaWYgKCFWQUxJRF9TWVNURU1fSU5TVFJVQ1RJT05fVFlQRVMuaW5jbHVkZXMoZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKSkpIHtcbiAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ0ludmFsaWQgdHJhbnNhY3Rpb24sIGluc3RydWN0aW9uIHR5cGUgbm90IHN1cHBvcnRlZDogJyArIGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbikpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIHNvbGFuYSBpbnN0cnVjdGlvbnMgbWF0Y2ggcmF3IG1zZyBhdXRob3JpemUgdHJhbnNhY3Rpb25cbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb259IGluc3RydWN0aW9ucyAtIGEgc29sYW5hIGluc3RydWN0aW9uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgaW5zdHJ1Y3Rpb25zIG1hdGNoIHRoZSByYXcgbXNnIGF1dGhvcml6ZSB0cmFuc2FjdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVSYXdNc2dJbnN0cnVjdGlvbihpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSk6IGJvb2xlYW4ge1xuICAvLyBhcyB3ZWIzLmpzIGNhbm5vdCBkZWNvZGUgYXV0aG9yaXplIGluc3RydWN0aW9uIGZyb20gQ0xJLCB3ZSBuZWVkIHRvIGNoZWNrIGl0IG1hbnVhbGx5IGZpcnN0XG4gIGlmIChpbnN0cnVjdGlvbnMubGVuZ3RoID09PSAyKSB7XG4gICAgY29uc3QgcHJvZ3JhbUlkMSA9IGluc3RydWN0aW9uc1swXS5wcm9ncmFtSWQudG9TdHJpbmcoKTtcbiAgICBjb25zdCBwcm9ncmFtSWQyID0gaW5zdHJ1Y3Rpb25zWzFdLnByb2dyYW1JZC50b1N0cmluZygpO1xuICAgIGlmIChwcm9ncmFtSWQxID09PSBTeXN0ZW1Qcm9ncmFtLnByb2dyYW1JZC50b1N0cmluZygpICYmIHByb2dyYW1JZDIgPT09IFN0YWtlUHJvZ3JhbS5wcm9ncmFtSWQudG9TdHJpbmcoKSkge1xuICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25OYW1lMSA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZUluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbnNbMF0pO1xuICAgICAgY29uc3QgZGF0YSA9IGluc3RydWN0aW9uc1sxXS5kYXRhLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIGlmIChcbiAgICAgICAgaW5zdHJ1Y3Rpb25OYW1lMSA9PT0gbm9uY2VBZHZhbmNlSW5zdHJ1Y3Rpb24gJiZcbiAgICAgICAgKGRhdGEgPT09IHZhbGlkSW5zdHJ1Y3Rpb25EYXRhIHx8IGRhdGEgPT09IHZhbGlkSW5zdHJ1Y3Rpb25EYXRhMilcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGluc3RydWN0aW9ucy5sZW5ndGggPT09IDMpIHtcbiAgICBjb25zdCBwcm9ncmFtSWQxID0gaW5zdHJ1Y3Rpb25zWzBdLnByb2dyYW1JZC50b1N0cmluZygpO1xuICAgIGNvbnN0IHByb2dyYW1JZDIgPSBpbnN0cnVjdGlvbnNbMV0ucHJvZ3JhbUlkLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgcHJvZ3JhbUlkMyA9IGluc3RydWN0aW9uc1syXS5wcm9ncmFtSWQudG9TdHJpbmcoKTtcbiAgICBpZiAoXG4gICAgICBwcm9ncmFtSWQxID09PSBTeXN0ZW1Qcm9ncmFtLnByb2dyYW1JZC50b1N0cmluZygpICYmXG4gICAgICBwcm9ncmFtSWQyID09PSBTdGFrZVByb2dyYW0ucHJvZ3JhbUlkLnRvU3RyaW5nKCkgJiZcbiAgICAgIHByb2dyYW1JZDMgPT09IFN0YWtlUHJvZ3JhbS5wcm9ncmFtSWQudG9TdHJpbmcoKVxuICAgICkge1xuICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25OYW1lMSA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZUluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbnNbMF0pO1xuICAgICAgY29uc3QgZGF0YSA9IGluc3RydWN0aW9uc1sxXS5kYXRhLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIGNvbnN0IGRhdGEyID0gaW5zdHJ1Y3Rpb25zWzJdLmRhdGEudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgaWYgKFxuICAgICAgICBpbnN0cnVjdGlvbk5hbWUxID09PSBub25jZUFkdmFuY2VJbnN0cnVjdGlvbiAmJlxuICAgICAgICAoZGF0YSA9PT0gdmFsaWRJbnN0cnVjdGlvbkRhdGEgfHwgZGF0YSA9PT0gdmFsaWRJbnN0cnVjdGlvbkRhdGEyKSAmJlxuICAgICAgICAoZGF0YTIgPT09IHZhbGlkSW5zdHJ1Y3Rpb25EYXRhIHx8IGRhdGEyID09PSB2YWxpZEluc3RydWN0aW9uRGF0YTIpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbi8qKlxuICogQ2hlY2sgdGhlIHJhdyB0cmFuc2FjdGlvbiBoYXMgYSB2YWxpZCBmb3JtYXQgaW4gdGhlIGJsb2NrY2hhaW4gY29udGV4dCwgdGhyb3cgb3RoZXJ3aXNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByYXdUcmFuc2FjdGlvbiAtIFRyYW5zYWN0aW9uIGluIGJhc2U2NCBzdHJpbmcgIGZvcm1hdFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVSYXdUcmFuc2FjdGlvbihcbiAgcmF3VHJhbnNhY3Rpb246IHN0cmluZyxcbiAgcmVxdWlyZUFsbFNpZ25hdHVyZXMgPSBmYWxzZSxcbiAgdmVyaWZ5U2lnbmF0dXJlcyA9IGZhbHNlXG4pOiB2b2lkIHtcbiAgaWYgKCFyYXdUcmFuc2FjdGlvbikge1xuICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgcmF3IHRyYW5zYWN0aW9uOiBVbmRlZmluZWQnKTtcbiAgfVxuICBpZiAoIWlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbiwgcmVxdWlyZUFsbFNpZ25hdHVyZXMsIHZlcmlmeVNpZ25hdHVyZXMpKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCByYXcgdHJhbnNhY3Rpb24nKTtcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBhZGRyZXNzIHRvIGNoZWNrIGlmIGl0IGV4aXN0cyBhbmQgaXMgYSB2YWxpZCBTb2xhbmEgcHVibGljIGtleVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzIFRoZSBhZGRyZXNzIHRvIGJlIHZhbGlkYXRlZFxuICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkTmFtZSBOYW1lIG9mIHRoZSBmaWVsZCB0byB2YWxpZGF0ZSwgaXRzIG5lZWRlZCB0byByZXR1cm4gd2hpY2ggZmllbGQgaXMgZmFpbGluZyBvbiBjYXNlIG9mIGVycm9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVBZGRyZXNzKGFkZHJlc3M6IHN0cmluZywgZmllbGROYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKCFhZGRyZXNzIHx8ICFpc1ZhbGlkUHVibGljS2V5KGFkZHJlc3MpKSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBvciBtaXNzaW5nICR7ZmllbGROYW1lfSwgZ290OiAke2FkZHJlc3N9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIHN0YXRpY3MgY29pbiBvYmplY3QgbWF0Y2hpbmcgYSBnaXZlbiBTb2xhbmEgdG9rZW4gYWRkcmVzcyBpZiBpdCBleGlzdHNcbiAqXG4gKiBAcGFyYW0gdG9rZW5BZGRyZXNzIFRoZSB0b2tlbiBhZGRyZXNzIHRvIG1hdGNoIGFnYWluc3RcbiAqIEBwYXJhbSBuZXR3b3JrIFNvbGFuYSBNYWlubmV0IG9yIFRlc3RuZXRcbiAqIEByZXR1cm5zIHN0YXRpY3MgQmFzZUNvaW4gb2JqZWN0IGZvciB0aGUgbWF0Y2hpbmcgdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNvbFRva2VuRnJvbUFkZHJlc3ModG9rZW5BZGRyZXNzOiBzdHJpbmcsIG5ldHdvcms6IEJhc2VOZXR3b3JrKTogUmVhZG9ubHk8QmFzZUNvaW4+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdG9rZW5zID0gY29pbnMuZmlsdGVyKChjb2luKSA9PiB7XG4gICAgaWYgKGNvaW4gaW5zdGFuY2VvZiBTb2xDb2luKSB7XG4gICAgICByZXR1cm4gY29pbi5uZXR3b3JrLnR5cGUgPT09IG5ldHdvcmsudHlwZSAmJiBjb2luLnRva2VuQWRkcmVzcy50b0xvd2VyQ2FzZSgpID09PSB0b2tlbkFkZHJlc3MudG9Mb3dlckNhc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9KTtcbiAgY29uc3QgdG9rZW5zQXJyYXkgPSB0b2tlbnMubWFwKCh0b2tlbikgPT4gdG9rZW4pO1xuICBpZiAodG9rZW5zQXJyYXkubGVuZ3RoID49IDEpIHtcbiAgICAvLyB0aGVyZSBzaG91bGQgbmV2ZXIgYmUgdHdvIHRva2VucyB3aXRoIHRoZSBzYW1lIGNvbnRyYWN0IGFkZHJlc3MsIHNvIHdlIGFzc2VydCB0aGF0IGhlcmVcbiAgICBhc3NlcnQodG9rZW5zQXJyYXkubGVuZ3RoID09PSAxKTtcbiAgICByZXR1cm4gdG9rZW5zQXJyYXlbMF07XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHN0YXRpY3MgY29pbiBvYmplY3QgbWF0Y2hpbmcgYSBnaXZlbiBTb2xhbmEgdG9rZW4gYWRkcmVzcyBpZiBpdCBleGlzdHNcbiAqXG4gKiBAcGFyYW0gdG9rZW5BZGRyZXNzIFRoZSB0b2tlbiBhZGRyZXNzIHRvIG1hdGNoIGFnYWluc3RcbiAqIEBwYXJhbSBuZXR3b3JrIFNvbGFuYSBNYWlubmV0IG9yIFRlc3RuZXRcbiAqIEByZXR1cm5zIHN0YXRpY3MgQmFzZUNvaW4gb2JqZWN0IGZvciB0aGUgbWF0Y2hpbmcgdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNvbFRva2VuRnJvbUFkZHJlc3NPbmx5KHRva2VuQWRkcmVzczogc3RyaW5nKTogUmVhZG9ubHk8QmFzZUNvaW4+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdG9rZW5zID0gY29pbnMuZmlsdGVyKChjb2luKSA9PiB7XG4gICAgaWYgKGNvaW4gaW5zdGFuY2VvZiBTb2xDb2luKSB7XG4gICAgICByZXR1cm4gY29pbi50b2tlbkFkZHJlc3MudG9Mb3dlckNhc2UoKSA9PT0gdG9rZW5BZGRyZXNzLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG4gIGNvbnN0IHRva2Vuc0FycmF5ID0gdG9rZW5zLm1hcCgodG9rZW4pID0+IHRva2VuKTtcbiAgaWYgKHRva2Vuc0FycmF5Lmxlbmd0aCA+PSAxKSB7XG4gICAgLy8gdGhlcmUgc2hvdWxkIG5ldmVyIGJlIHR3byB0b2tlbnMgd2l0aCB0aGUgc2FtZSBjb250cmFjdCBhZGRyZXNzLCBzbyB3ZSBhc3NlcnQgdGhhdCBoZXJlXG4gICAgYXNzZXJ0KHRva2Vuc0FycmF5Lmxlbmd0aCA9PT0gMSk7XG4gICAgcmV0dXJuIHRva2Vuc0FycmF5WzBdO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogR2V0IHRoZSBzb2xhbmEgdG9rZW4gb2JqZWN0IGZyb20gdG9rZW4gbmFtZVxuICogQHBhcmFtIHRva2VuTmFtZSBUaGUgdG9rZW4gbmFtZSB0byBtYXRjaCBhZ2FpbnN0XG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNvbFRva2VuRnJvbVRva2VuTmFtZSh0b2tlbk5hbWU6IHN0cmluZyk6IFJlYWRvbmx5PFNvbENvaW4+IHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCB0b2tlbiA9IGNvaW5zLmdldCh0b2tlbk5hbWUpO1xuICAgIGlmICghKHRva2VuLmlzVG9rZW4gJiYgdG9rZW4gaW5zdGFuY2VvZiBTb2xDb2luKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRva2VuO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCEoZSBpbnN0YW5jZW9mIENvaW5Ob3REZWZpbmVkRXJyb3IpKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBzb2xhbmEgYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IGFkZHJlc3NcbiAqIEBwYXJhbSB0b2tlbkFkZHJlc3MgdG9rZW4gbWludCBhZGRyZXNzXG4gKiBAcGFyYW0gb3duZXJBZGRyZXNzIFRoZSBvd25lciBvZiB0aGUgYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50XG4gKiBAcmV0dXJucyBUaGUgYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IGFkZHJlc3NcbiAqICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QXNzb2NpYXRlZFRva2VuQWNjb3VudEFkZHJlc3MoXG4gIHRva2VuTWludEFkZHJlc3M6IHN0cmluZyxcbiAgb3duZXJBZGRyZXNzOiBzdHJpbmcsXG4gIGFsbG93T3duZXJPZmZDdXJ2ZSA9IGZhbHNlLFxuICBwcm9ncmFtSWQ/OiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IG1pbnRQdWJsaWNLZXkgPSBuZXcgUHVibGljS2V5KHRva2VuTWludEFkZHJlc3MpO1xuICBjb25zdCBvd25lclB1YmxpY0tleSA9IG5ldyBQdWJsaWNLZXkob3duZXJBZGRyZXNzKTtcblxuICAvLyB0b2tlbkFkZHJlc3MgYXJlIG5vdCBvbiBlZDI1NTE5IGN1cnZlLCBzbyB0aGV5IGNhbid0IGJlIHVzZWQgYXMgb3duZXJBZGRyZXNzXG4gIGlmICghYWxsb3dPd25lck9mZkN1cnZlICYmICFQdWJsaWNLZXkuaXNPbkN1cnZlKG93bmVyUHVibGljS2V5LnRvQnVmZmVyKCkpKSB7XG4gICAgdGhyb3cgbmV3IFV0aWxzRXJyb3IoJ0ludmFsaWQgb3duZXJBZGRyZXNzIC0gYWRkcmVzcyBvZmYgZWQyNTUxOSBjdXJ2ZSwgZ290OiAnICsgb3duZXJBZGRyZXNzKTtcbiAgfVxuXG4gIGlmICghcHJvZ3JhbUlkKSB7XG4gICAgY29uc3QgY29pbiA9IGdldFNvbFRva2VuRnJvbUFkZHJlc3NPbmx5KHRva2VuTWludEFkZHJlc3MpO1xuICAgIGlmIChjb2luICYmIGNvaW4gaW5zdGFuY2VvZiBTb2xDb2luICYmIChjb2luIGFzIGFueSkucHJvZ3JhbUlkKSB7XG4gICAgICBwcm9ncmFtSWQgPSAoY29pbiBhcyBhbnkpLnByb2dyYW1JZC50b1N0cmluZygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9ncmFtSWQgPSBUT0tFTl9QUk9HUkFNX0lELnRvU3RyaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgbGV0IGF0YUFkZHJlc3M6IFB1YmxpY0tleTtcbiAgaWYgKHByb2dyYW1JZCA9PT0gVE9LRU5fMjAyMl9QUk9HUkFNX0lELnRvU3RyaW5nKCkpIHtcbiAgICBhdGFBZGRyZXNzID0gYXdhaXQgZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzcyhtaW50UHVibGljS2V5LCBvd25lclB1YmxpY0tleSwgZmFsc2UsIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG4gIH0gZWxzZSB7XG4gICAgYXRhQWRkcmVzcyA9IGF3YWl0IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3MobWludFB1YmxpY0tleSwgb3duZXJQdWJsaWNLZXksIGFsbG93T3duZXJPZmZDdXJ2ZSk7XG4gIH1cbiAgcmV0dXJuIGF0YUFkZHJlc3MudG9TdHJpbmcoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlTWludEFkZHJlc3MobWludEFkZHJlc3M6IHN0cmluZykge1xuICBpZiAoIW1pbnRBZGRyZXNzIHx8ICFpc1ZhbGlkQWRkcmVzcyhtaW50QWRkcmVzcykpIHtcbiAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIG9yIG1pc3NpbmcgbWludEFkZHJlc3MsIGdvdDogJyArIG1pbnRBZGRyZXNzKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVPd25lckFkZHJlc3Mob3duZXJBZGRyZXNzOiBzdHJpbmcpIHtcbiAgaWYgKCFvd25lckFkZHJlc3MgfHwgIWlzVmFsaWRBZGRyZXNzKG93bmVyQWRkcmVzcykpIHtcbiAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIG9yIG1pc3Npbmcgb3duZXJBZGRyZXNzLCBnb3Q6ICcgKyBvd25lckFkZHJlc3MpO1xuICB9XG59XG4iXX0=
|
|
572
|
+
/**
|
|
573
|
+
* Type predicate to check if an instruction is a legacy SolInstruction.
|
|
574
|
+
* Uses 'programId' property as the discriminator since it's unique to legacy instructions
|
|
575
|
+
* Versioned instructions have 'programIdIndex' property.
|
|
576
|
+
*
|
|
577
|
+
* @param instruction - The instruction to check
|
|
578
|
+
* @returns True if the instruction is a SolInstruction (has programId field)
|
|
579
|
+
*/
|
|
580
|
+
function isSolLegacyInstruction(instruction) {
|
|
581
|
+
return 'programId' in instruction;
|
|
582
|
+
}
|
|
583
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBNEVBLGdFQUVDO0FBR0Qsd0NBRUM7QUFHRCx3Q0FRQztBQUdELDhDQU9DO0FBR0QsNENBUUM7QUFHRCw0Q0FNQztBQUlELG9EQUVDO0FBUUQsc0NBR0M7QUFRRCxvREFHQztBQVFELGtDQUVDO0FBT0Qsc0NBT0M7QUFPRCxnQ0FFQztBQVVELHNEQVlDO0FBVUQsMENBY0M7QUFRRCxnREFFQztBQVFELGdEQUVDO0FBUUQsd0RBRUM7QUFRRCxzREFFQztBQVVELDBGQStCQztBQVNELGdEQWtEQztBQVNELGdEQThDQztBQVNELDBEQU1DO0FBUUQsOERBc0NDO0FBTUQsd0RBV0M7QUFRRCwwQ0FJQztBQVNELHdEQWNDO0FBU0QsZ0VBY0M7QUFNRCw0REFhQztBQVFELDRFQW1DQztBQUVELGtEQUlDO0FBRUQsb0RBSUM7QUFVRCx3REFJQztBQTFvQkQsbURBUzhCO0FBQzlCLGlEQUFpRztBQUNqRyxpREFPMkI7QUFDM0IsNkNBVXlCO0FBQ3pCLG9EQUE0QjtBQUM1QixnRUFBcUM7QUFDckMsZ0RBQXdCO0FBQ3hCLDBEQUE2QjtBQUM3QiwyQ0FzQnFCO0FBRXJCLDJEQUErRjtBQUUvRixNQUFNLHlCQUF5QixHQUFHLEVBQUUsQ0FBQyxDQUFDLHFGQUFxRjtBQUMzSCxNQUFNLHdCQUF3QixHQUFHLEVBQUUsQ0FBQyxDQUFDLGdEQUFnRDtBQUNyRixNQUFNLHVCQUF1QixHQUFHLHNCQUFzQixDQUFDO0FBQ3ZELE1BQU0sY0FBYyxHQUFHLDZDQUE2QyxDQUFDO0FBRXJFOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFnQiwwQkFBMEIsQ0FBQyxXQUFtQztJQUM1RSxPQUFPLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENB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Q0FBQztBQUNwQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQnVpbGRUcmFuc2FjdGlvbkVycm9yLFxuICBpc1ZhbGlkWHB1YixcbiAgTm90U3VwcG9ydGVkLFxuICBQYXJzZVRyYW5zYWN0aW9uRXJyb3IsXG4gIFNvbEluc3RydWN0aW9uLFxuICBTb2xWZXJzaW9uZWRJbnN0cnVjdGlvbixcbiAgVHJhbnNhY3Rpb25UeXBlLFxuICBVdGlsc0Vycm9yLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBCYXNlQ29pbiwgQmFzZU5ldHdvcmssIENvaW5Ob3REZWZpbmVkRXJyb3IsIGNvaW5zLCBTb2xDb2luIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQge1xuICBBU1NPQ0lBVEVEX1RPS0VOX1BST0dSQU1fSUQsXG4gIGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3MsXG4gIFRPS0VOX1BST0dSQU1fSUQsXG4gIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCxcbiAgZGVjb2RlSW5zdHJ1Y3Rpb24sXG4gIFRva2VuSW5zdHJ1Y3Rpb24sXG59IGZyb20gJ0Bzb2xhbmEvc3BsLXRva2VuJztcbmltcG9ydCB7XG4gIEtleXBhaXIsXG4gIFB1YmxpY0tleSxcbiAgU2lnbmF0dXJlUHVia2V5UGFpcixcbiAgVHJhbnNhY3Rpb24gYXMgU29sVHJhbnNhY3Rpb24sXG4gIFN0YWtlSW5zdHJ1Y3Rpb24sXG4gIFN0YWtlUHJvZ3JhbSxcbiAgU3lzdGVtSW5zdHJ1Y3Rpb24sXG4gIFN5c3RlbVByb2dyYW0sXG4gIFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24sXG59IGZyb20gJ0Bzb2xhbmEvd2ViMy5qcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgYnM1OCBmcm9tICdiczU4JztcbmltcG9ydCBuYWNsIGZyb20gJ3R3ZWV0bmFjbCc7XG5pbXBvcnQge1xuICBhdGFDbG9zZUluc3RydWN0aW9uSW5kZXhlcyxcbiAgYXRhSW5pdEluc3RydWN0aW9uSW5kZXhlcyxcbiAgTUFYX01FTU9fTEVOR1RILFxuICBNRU1PX1BST0dSQU1fUEssXG4gIG5vbmNlQWR2YW5jZUluc3RydWN0aW9uLFxuICBzdGFraW5nQWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzLFxuICBtYXJpbmFkZVN0YWtpbmdBY3RpdmF0ZUluc3RydWN0aW9uc0luZGV4ZXMsXG4gIHN0YWtpbmdBdXRob3JpemVJbnN0cnVjdGlvbnNJbmRleGVzLFxuICBzdGFraW5nRGVhY3RpdmF0ZUluc3RydWN0aW9uc0luZGV4ZXMsXG4gIG1hcmluYWRlU3Rha2luZ0RlYWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzLFxuICBzdGFraW5nRGVsZWdhdGVJbnN0cnVjdGlvbnNJbmRleGVzLFxuICBzdGFraW5nUGFydGlhbERlYWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzLFxuICBzdGFraW5nV2l0aGRyYXdJbnN0cnVjdGlvbnNJbmRleGVzLFxuICBWQUxJRF9TWVNURU1fSU5TVFJVQ1RJT05fVFlQRVMsXG4gIHZhbGlkSW5zdHJ1Y3Rpb25EYXRhLFxuICB2YWxpZEluc3RydWN0aW9uRGF0YTIsXG4gIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0sXG4gIHdhbGxldEluaXRJbnN0cnVjdGlvbkluZGV4ZXMsXG4gIGppdG9TdGFraW5nQWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzLFxuICBqaXRvU3Rha2luZ0RlYWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzLFxuICBqaXRvU3Rha2luZ0FjdGl2YXRlV2l0aEFUQUluc3RydWN0aW9uc0luZGV4ZXMsXG59IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IFZhbGlkSW5zdHJ1Y3Rpb25UeXBlcyB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgU1RBS0VfUE9PTF9JTlNUUlVDVElPTl9MQVlPVVRTLCBTVEFLRV9QT09MX1BST0dSQU1fSUQgfSBmcm9tICdAc29sYW5hL3NwbC1zdGFrZS1wb29sJztcblxuY29uc3QgREVDT0RFRF9CTE9DS19IQVNIX0xFTkdUSCA9IDMyOyAvLyBodHRwczovL2RvY3Muc29sYW5hLmNvbS9kZXZlbG9waW5nL3Byb2dyYW1taW5nLW1vZGVsL3RyYW5zYWN0aW9ucyNibG9ja2hhc2gtZm9ybWF0XG5jb25zdCBERUNPREVEX1NJR05BVFVSRV9MRU5HVEggPSA2NDsgLy8gaHR0cHM6Ly9kb2NzLnNvbGFuYS5jb20vdGVybWlub2xvZ3kjc2lnbmF0dXJlXG5jb25zdCBCQVNFXzU4X0VOQ09ORElOR19SRUdFWCA9ICdbMS05QS1ISi1OUC1aYS1rbS16XSc7XG5jb25zdCBDT01QVVRFX0JVREdFVCA9ICdDb21wdXRlQnVkZ2V0MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYW4gQVRBIGluc3RydWN0aW9uIGlzIGlkZW1wb3RlbnQgKGRpc2NyaW1pbmF0b3IgYnl0ZSA9IDEpLlxuICpcbiAqIElkZW1wb3RlbnQgQVRBIGluc3RydWN0aW9ucyB1c2UgQnVmZmVyLmZyb20oWzFdKSBhcyBpbnN0cnVjdGlvbiBkYXRhLCBjcmVhdGVkIGJ5XG4gKiBAc29sYW5hL3NwbC10b2tlbidzIGNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnRJZGVtcG90ZW50SW5zdHJ1Y3Rpb24oKSAodjAuNC4xKykuXG4gKiBBbiBpZGVtcG90ZW50IEFUQSBpbnN0cnVjdGlvbiBzdWNjZWVkIGV2ZW4gaWYgYWNjb3VudCBleGlzdHMsXG4gKiBwcmV2ZW50aW5nIHJhY2UgY29uZGl0aW9uIGVycm9ycyBpbiBjb25jdXJyZW50IHNjZW5hcmlvcy5cbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb259IGluc3RydWN0aW9uIC0gVGhlIGluc3RydWN0aW9uIHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBpbnN0cnVjdGlvbiBkYXRhIGlzIGEgc2luZ2xlIGJ5dGUgd2l0aCB2YWx1ZSAxXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0lkZW1wb3RlbnRBdGFJbnN0cnVjdGlvbihpbnN0cnVjdGlvbjogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbik6IGJvb2xlYW4ge1xuICByZXR1cm4gaW5zdHJ1Y3Rpb24uZGF0YS5sZW5ndGggPT09IDEgJiYgaW5zdHJ1Y3Rpb24uZGF0YVswXSA9PT0gMTtcbn1cblxuLyoqIEBpbmhlcml0ZG9jICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1ZhbGlkUHVibGljS2V5KGFkZHJlc3MpO1xufVxuXG4vKiogQGluaGVyaXRkb2MgKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkQmxvY2tJZChoYXNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKFxuICAgICAgISFoYXNoICYmIG5ldyBSZWdFeHAoQkFTRV81OF9FTkNPTkRJTkdfUkVHRVgpLnRlc3QoaGFzaCkgJiYgYnM1OC5kZWNvZGUoaGFzaCkubGVuZ3RoID09PSBERUNPREVEX0JMT0NLX0hBU0hfTEVOR1RIXG4gICAgKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKiogQGluaGVyaXRkb2MgKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkUHJpdmF0ZUtleShwcnZLZXk6IHN0cmluZyB8IFVpbnQ4QXJyYXkpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBrZXk6IFVpbnQ4QXJyYXkgPSB0eXBlb2YgcHJ2S2V5ID09PSAnc3RyaW5nJyA/IGJhc2U1OFRvVWludDhBcnJheShwcnZLZXkpIDogcHJ2S2V5O1xuICAgIHJldHVybiAhIUtleXBhaXIuZnJvbVNlY3JldEtleShrZXkpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKiBAaW5oZXJpdGRvYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRQdWJsaWNLZXkocHViS2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBpZiAoaXNWYWxpZFhwdWIocHViS2V5KSkgcmV0dXJuIHRydWU7XG4gICAgbmV3IFB1YmxpY0tleShwdWJLZXkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqIEBpbmhlcml0ZG9jICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFNpZ25hdHVyZShzaWduYXR1cmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiAhIXNpZ25hdHVyZSAmJiBiczU4LmRlY29kZShzaWduYXR1cmUpLmxlbmd0aCA9PT0gREVDT0RFRF9TSUdOQVRVUkVfTEVOR1RIO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKiBAaW5oZXJpdGRvYyAqL1xuLy8gVHJhbnNhY3Rpb25JZCBhcmUgdGhlIGZpcnN0IHNpZ25hdHVyZSBvbiBhIFRyYW5zYWN0aW9uXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFRyYW5zYWN0aW9uSWQodHhJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1ZhbGlkU2lnbmF0dXJlKHR4SWQpO1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHN0cmluZyBpcyBhIHZhbGlkIGFtb3VudCBvZiBsYW1wb3J0cyBudW1iZXJcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYW1vdW50IC0gdGhlIHN0cmluZyB0byB2YWxpZGF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkQW1vdW50KGFtb3VudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGJpZ051bWJlckFtb3VudCA9IG5ldyBCaWdOdW1iZXIoYW1vdW50KTtcbiAgcmV0dXJuIGJpZ051bWJlckFtb3VudC5pc0ludGVnZXIoKSAmJiBiaWdOdW1iZXJBbW91bnQuaXNHcmVhdGVyVGhhbk9yRXF1YWxUbygwKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgYW1vdW50IG9mIGxhbXBvcnRzIG51bWJlciBvbiBzdGFraW5nXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFtb3VudCAtIHRoZSBzdHJpbmcgdG8gdmFsaWRhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFN0YWtpbmdBbW91bnQoYW1vdW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgYmlnTnVtYmVyQW1vdW50ID0gbmV3IEJpZ051bWJlcihhbW91bnQpO1xuICByZXR1cm4gYmlnTnVtYmVyQW1vdW50LmlzSW50ZWdlcigpICYmIGJpZ051bWJlckFtb3VudC5pc0dyZWF0ZXJUaGFuKDApO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHRoaXMgaXMgYSB2YWxpZCBtZW1vIG9yIG5vdC5cbiAqXG4gKiBAcGFyYW0gbWVtbyAtIHRoZSBtZW1vIHN0cmluZ1xuICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkTWVtbyhtZW1vOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKG1lbW8pLmxlbmd0aCA8PSBNQVhfTUVNT19MRU5HVEg7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgc3RyaW5nIGlzIHZhbGlkIGJhc2U2NCBlbmNvZGVkIGRhdGFcbiAqIEBwYXJhbSBzdHIgLSBUaGUgc3RyaW5nIHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBzdHJpbmcgaXMgdmFsaWQgYmFzZTY0LCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRCYXNlNjQoc3RyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBkZWNvZGVkID0gQnVmZmVyLmZyb20oc3RyLCAnYmFzZTY0JykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgIHJldHVybiBkZWNvZGVkID09PSBzdHI7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHN0cmluZyBpcyB2YWxpZCBoZXhhZGVjaW1hbCBkYXRhXG4gKiBAcGFyYW0gc3RyIC0gVGhlIHN0cmluZyB0byB2YWxpZGF0ZVxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIHZhbGlkIGhleCwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkSGV4KHN0cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXlswLTlBLUZhLWZdKiQvLnRlc3Qoc3RyKSAmJiBzdHIubGVuZ3RoICUgMiA9PT0gMDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgcmF3IHRyYW5zYWN0aW9uIGNhbiBiZSBkZXNlcmlhbGl6ZWRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmF3VHJhbnNhY3Rpb24gLSB0cmFuc2FjdGlvbiBpbiBiYXNlNjQgc3RyaW5nIGZvcm1hdFxuICogQHBhcmFtIHtib29sZWFufSByZXF1aXJlQWxsU2lnbmF0dXJlcyAtIHJlcXVpcmUgYWxsIHNpZ25hdHVyZXMgdG8gYmUgcHJlc2VudFxuICogQHBhcmFtIHtib29sZWFufSB2ZXJpZnlTaWduYXR1cmVzIC0gdmVyaWZ5IHNpZ25hdHVyZXNcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFJhd1RyYW5zYWN0aW9uKFxuICByYXdUcmFuc2FjdGlvbjogc3RyaW5nLFxuICByZXF1aXJlQWxsU2lnbmF0dXJlcyA9IGZhbHNlLFxuICB2ZXJpZnlTaWduYXR1cmVzID0gZmFsc2Vcbik6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIGNvbnN0IHR4ID0gU29sVHJhbnNhY3Rpb24uZnJvbShCdWZmZXIuZnJvbShyYXdUcmFuc2FjdGlvbiwgJ2Jhc2U2NCcpKTtcbiAgICB0eC5zZXJpYWxpemUoeyByZXF1aXJlQWxsU2lnbmF0dXJlcywgdmVyaWZ5U2lnbmF0dXJlcyB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFZlcmlmaWVzIGlmIHNpZ25hdHVyZSBmb3IgbWVzc2FnZSBpcyB2YWxpZC5cbiAqXG4gKiBAcGFyYW0ge0J1ZmZlcn0gc2VyaWFsaXplZFR4IC0gdHggYXMgYSBiYXNlNjQgc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gc2lnbmF0dXJlIC0gc2lnbmF0dXJlIGFzIGEgc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gcHVibGljS2V5IC0gcHVibGljIGtleSBhcyBiYXNlIDU4XG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBzaWduYXR1cmUgaXMgdmFsaWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZXJpZnlTaWduYXR1cmUoc2VyaWFsaXplZFR4OiBzdHJpbmcsIHNpZ25hdHVyZTogc3RyaW5nLCBwdWJsaWNLZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIWlzVmFsaWRSYXdUcmFuc2FjdGlvbihzZXJpYWxpemVkVHgpKSB7XG4gICAgdGhyb3cgbmV3IFV0aWxzRXJyb3IoJ0ludmFsaWQgc2VyaWFsaXplZFR4Jyk7XG4gIH1cbiAgaWYgKCFpc1ZhbGlkUHVibGljS2V5KHB1YmxpY0tleSkpIHtcbiAgICB0aHJvdyBuZXcgVXRpbHNFcnJvcignSW52YWxpZCBwdWJsaWNLZXknKTtcbiAgfVxuICBpZiAoIWlzVmFsaWRTaWduYXR1cmUoc2lnbmF0dXJlKSkge1xuICAgIHRocm93IG5ldyBVdGlsc0Vycm9yKCdJbnZhbGlkIHNpZ25hdHVyZScpO1xuICB9XG4gIGNvbnN0IG1zZyA9IFNvbFRyYW5zYWN0aW9uLmZyb20oQnVmZmVyLmZyb20oc2VyaWFsaXplZFR4LCAnYmFzZTY0JykpLnNlcmlhbGl6ZU1lc3NhZ2UoKTtcbiAgY29uc3Qgc2lnID0gYmFzZTU4VG9VaW50OEFycmF5KHNpZ25hdHVyZSk7XG4gIGNvbnN0IHB1YiA9IG5ldyBQdWJsaWNLZXkocHVibGljS2V5KTtcbiAgcmV0dXJuIG5hY2wuc2lnbi5kZXRhY2hlZC52ZXJpZnkobXNnLCBzaWcsIHB1Yi50b0J1ZmZlcigpKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGJhc2U1OCBzdHJpbmcgaW50byBhIFVpbnQ4QXJyYXkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0IC0gYSBzdHJpbmcgaW4gYmFzZTU4XG4gKiBAcmV0dXJucyB7VWludDhBcnJheX0gLSBhbiBVaW50OEFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYXNlNThUb1VpbnQ4QXJyYXkoaW5wdXQ6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYnM1OC5kZWNvZGUoaW5wdXQpKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIFVpbnQ4QXJyYXkgdG8gYSBiYXNlNTggc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gaW5wdXQgLSBhbiBVaW50OEFycmF5XG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIGEgc3RyaW5nIGluIGJhc2U1OFxuICovXG5leHBvcnQgZnVuY3Rpb24gVWludDhBcnJheVRvYmFzZTU4KGlucHV0OiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgcmV0dXJuIGJzNTguZW5jb2RlKGlucHV0KTtcbn1cblxuLyoqXG4gKiBDb3VudCB0aGUgYW1vdW50IG9mIHNpZ25hdHVyZXMgYXJlIG5vdCBudWxsLlxuICpcbiAqIEBwYXJhbSB7U2lnbmF0dXJlUHVia2V5UGFpcltdfSBzaWduYXR1cmVzIC0gYW4gYXJyYXkgb2YgU2lnbmF0dXJlUHVia2V5UGFpclxuICogQHJldHVybnMge251bWJlcn0gLSB0aGUgYW1vdW50IG9mIHZhbGlkIHNpZ25hdHVyZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvdW50Tm90TnVsbFNpZ25hdHVyZXMoc2lnbmF0dXJlczogU2lnbmF0dXJlUHVia2V5UGFpcltdKTogbnVtYmVyIHtcbiAgcmV0dXJuIHNpZ25hdHVyZXMuZmlsdGVyKChzaWcpID0+ICEhc2lnLnNpZ25hdHVyZSkubGVuZ3RoO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGFsbCBzaWduYXR1cmVzIGFyZSBjb21wbGV0ZWQuXG4gKlxuICogQHBhcmFtIHtTaWduYXR1cmVQdWJrZXlQYWlyW119IHNpZ25hdHVyZXMgLSBzaWduYXR1cmVzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVzQWxsU2lnbmF0dXJlcyhzaWduYXR1cmVzOiBTaWduYXR1cmVQdWJrZXlQYWlyW10pOiBib29sZWFuIHtcbiAgcmV0dXJuIHNpZ25hdHVyZXMubGVuZ3RoID4gMCAmJiBjb3VudE5vdE51bGxTaWduYXR1cmVzKHNpZ25hdHVyZXMpID09PSBzaWduYXR1cmVzLmxlbmd0aDtcbn1cblxuLyoqXG4gKiBDaGVjayB0aGUgdHJhbnNhY3Rpb24gdHlwZSBtYXRjaGluZyBpbnN0cnVjdGlvbnMgYnkgb3JkZXIuIE1lbW8gYW5kIEFkdmFuY2VOb25jZUFjY291bnQgaW5zdHJ1Y3Rpb25zXG4gKiBhcmUgaWdub3JlZC5cbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gdGhlIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGJlIHBhcnNlZFxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBudW1iZXI+fSBpbnN0cnVjdGlvbkluZGV4ZXMgLSB0aGUgaW5zdHJ1Y3Rpb25zIGluZGV4ZXMgb2YgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb25cbiAqIEByZXR1cm5zIHRydWUgaWYgaXQgbWF0Y2hlcyBieSBvcmRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihcbiAgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10sXG4gIGluc3RydWN0aW9uSW5kZXhlczogUmVjb3JkPHN0cmluZywgbnVtYmVyPlxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGluc3RydWN0aW9uc0NvcHkgPSBbLi4uaW5zdHJ1Y3Rpb25zXTsgLy8gTWFrZSBhIGNvcHkgc2luY2Ugd2UgbWF5IG1vZGlmeSB0aGUgYXJyYXkgYmVsb3dcbiAgLy8gQWR2YW5jZU5vbmNlQWNjb3VudCBpcyBvcHRpb25hbCBhbmQgdGhlIGZpcnN0IGluc3RydWN0aW9uIGFkZGVkLCBpdCBkb2VzIG5vdCBtYXR0ZXIgdG8gbWF0Y2ggdGhlIHR5cGVcbiAgaWYgKGluc3RydWN0aW9uc0NvcHkubGVuZ3RoID4gMCkge1xuICAgIGlmIChnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb25zWzBdKSA9PT0gJ0FkdmFuY2VOb25jZUFjY291bnQnKSB7XG4gICAgICBpbnN0cnVjdGlvbnNDb3B5LnNoaWZ0KCk7XG4gICAgfVxuICB9XG5cbiAgLy8gTWVtbyBpcyBvcHRpb25hbCBhbmQgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gYWRkZWQsIGl0IGRvZXMgbm90IG1hdHRlciB0byBtYXRjaCB0aGUgdHlwZVxuICAvLyBXaHkgaGF2ZSBpdCBpbiBpbnN0cnVjdGlvbktleXMgaWYgd2UgYXJlIGdvaW5nIHRvIGlnbm9yZSBpdD9cbiAgY29uc3QgaW5zdHJ1Y3Rpb25zS2V5cyA9IE9iamVjdC5rZXlzKGluc3RydWN0aW9uSW5kZXhlcyk7XG4gIGlmIChpbnN0cnVjdGlvbnNLZXlzW2luc3RydWN0aW9uc0tleXMubGVuZ3RoIC0gMV0gPT09ICdNZW1vJykge1xuICAgIGluc3RydWN0aW9uc0tleXMucG9wKCk7XG4gIH1cblxuICAvLyBDaGVjayBpbnN0cnVjdGlvbnMgYnkgb3JkZXIgdXNpbmcgdGhlIGluZGV4LlxuICBmb3IgKGNvbnN0IGtleU5hbWUgb2YgaW5zdHJ1Y3Rpb25zS2V5cykge1xuICAgIGNvbnN0IGluZGV4ID0gaW5zdHJ1Y3Rpb25JbmRleGVzW2tleU5hbWVdO1xuICAgIGlmIChpbmRleCA+PSBpbnN0cnVjdGlvbnNDb3B5Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb25zQ29weVtpbmRleF0pO1xuICAgIGlmIChyZXN1bHQgIT09IGtleU5hbWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgdHJhbnNhY3Rpb24gVHlwZSBiYXNlZCBvbiB0aGUgIHRyYW5zYWN0aW9uIGluc3RydWN0aW9ucy5cbiAqIFdhbGxldCBpbml0aWFsaXphdGlvbiwgVHJhbnNmZXIgYW5kIFN0YWtpbmcgdHJhbnNhY3Rpb25zIGFyZSBzdXBwb3J0ZWQuXG4gKlxuICogQHBhcmFtIHtTb2xUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb24gLSB0aGUgc29sYW5hIHRyYW5zYWN0aW9uXG4gKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25UeXBlfSAtIHRoZSB0eXBlIG9mIHRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUcmFuc2FjdGlvblR5cGUodHJhbnNhY3Rpb246IFNvbFRyYW5zYWN0aW9uKTogVHJhbnNhY3Rpb25UeXBlIHtcbiAgY29uc3QgeyBpbnN0cnVjdGlvbnMgfSA9IHRyYW5zYWN0aW9uO1xuICBpZiAodmFsaWRhdGVSYXdNc2dJbnN0cnVjdGlvbihpbnN0cnVjdGlvbnMpKSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQXV0aG9yaXplUmF3O1xuICB9XG4gIHZhbGlkYXRlSW50cnVjdGlvblR5cGVzKGluc3RydWN0aW9ucyk7XG4gIC8vIGNoZWNrIGlmIGRlYWN0aXZhdGUgaW5zdHJ1Y3Rpb24gZG9lcyBub3QgZXhpc3QgYmVjYXVzZSBkZWFjdGl2YXRlIGNhbiBiZSBpbmNsdWRlIGEgdHJhbnNmZXIgaW5zdHJ1Y3Rpb25cbiAgY29uc3QgbWVtb0luc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb25zLmZpbmQoKGluc3RydWN0aW9uKSA9PiBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pID09PSAnTWVtbycpO1xuICBjb25zdCBtZW1vRGF0YSA9IG1lbW9JbnN0cnVjdGlvbj8uZGF0YS50b1N0cmluZygndXRmLTgnKTtcbiAgaWYgKGluc3RydWN0aW9ucy5maWx0ZXIoKGluc3RydWN0aW9uKSA9PiBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pID09PSAnRGVhY3RpdmF0ZScpLmxlbmd0aCA9PT0gMCkge1xuICAgIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb25zKSB7XG4gICAgICBjb25zdCBpbnN0cnVjdGlvblR5cGUgPSBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgICAgLy8gQ2hlY2sgaWYgbWVtbyBpbnN0cnVjdGlvbiBpcyB0aGVyZSBhbmQgaWYgaXQgY29udGFpbnMgJ1ByZXBhcmVGb3JSZXZva2UnIGJlY2F1c2UgTWFyaW5hZGUgc3Rha2luZyBkZWFjdGl2YXRlIHRyYW5zYWN0aW9uIHdpbGwgaGF2ZSB0aGlzXG4gICAgICBpZiAoXG4gICAgICAgIChpbnN0cnVjdGlvblR5cGUgPT09IFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uVHJhbnNmZXIgJiYgIW1lbW9EYXRhPy5pbmNsdWRlcygnUHJlcGFyZUZvclJldm9rZScpKSB8fFxuICAgICAgICBpbnN0cnVjdGlvblR5cGUgPT09IFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uVG9rZW5UcmFuc2ZlclxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU2VuZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIHdhbGxldEluaXRJbnN0cnVjdGlvbkluZGV4ZXMpKSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbjtcbiAgfSBlbHNlIGlmIChcbiAgICBtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCBtYXJpbmFkZVN0YWtpbmdBY3RpdmF0ZUluc3RydWN0aW9uc0luZGV4ZXMpIHx8XG4gICAgbWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgaml0b1N0YWtpbmdBY3RpdmF0ZUluc3RydWN0aW9uc0luZGV4ZXMpIHx8XG4gICAgbWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgaml0b1N0YWtpbmdBY3RpdmF0ZVdpdGhBVEFJbnN0cnVjdGlvbnNJbmRleGVzKSB8fFxuICAgIG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIHN0YWtpbmdBY3RpdmF0ZUluc3RydWN0aW9uc0luZGV4ZXMpXG4gICkge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0FjdGl2YXRlO1xuICB9IGVsc2UgaWYgKG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIHN0YWtpbmdBdXRob3JpemVJbnN0cnVjdGlvbnNJbmRleGVzKSkge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0F1dGhvcml6ZTtcbiAgfSBlbHNlIGlmIChtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCBzdGFraW5nRGVsZWdhdGVJbnN0cnVjdGlvbnNJbmRleGVzKSkge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0RlbGVnYXRlO1xuICB9IGVsc2UgaWYgKFxuICAgIG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIG1hcmluYWRlU3Rha2luZ0RlYWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzKSB8fFxuICAgIG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIHN0YWtpbmdEZWFjdGl2YXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcykgfHxcbiAgICBtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCBzdGFraW5nUGFydGlhbERlYWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzKSB8fFxuICAgIG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIGppdG9TdGFraW5nRGVhY3RpdmF0ZUluc3RydWN0aW9uc0luZGV4ZXMpXG4gICkge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0RlYWN0aXZhdGU7XG4gIH0gZWxzZSBpZiAobWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgc3Rha2luZ1dpdGhkcmF3SW5zdHJ1Y3Rpb25zSW5kZXhlcykpIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdXaXRoZHJhdztcbiAgfSBlbHNlIGlmIChtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCBhdGFJbml0SW5zdHJ1Y3Rpb25JbmRleGVzKSkge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuQXNzb2NpYXRlZFRva2VuQWNjb3VudEluaXRpYWxpemF0aW9uO1xuICB9IGVsc2UgaWYgKG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIGF0YUNsb3NlSW5zdHJ1Y3Rpb25JbmRleGVzKSkge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuQ2xvc2VBc3NvY2lhdGVkVG9rZW5BY2NvdW50O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuQ3VzdG9tVHg7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbnN0cnVjdGlvbiBUeXBlIGJhc2VkIG9uIHRoZSBzb2xhbmEgaW5zdHJ1Y3Rpb25zLlxuICogVGhyb3dzIGlmIHRoZSBzb2xhbmEgaW5zdHJ1Y3Rpb24gcHJvZ3JhbSBpcyBub3Qgc3VwcG9ydGVkXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9ufSBpbnN0cnVjdGlvbiAtIGEgc29sYW5hIGluc3RydWN0aW9uXG4gKiBAcmV0dXJucyB7VmFsaWRJbnN0cnVjdGlvblR5cGVzfSAtIGEgc29sYW5hIGluc3RydWN0aW9uIHR5cGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbjogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbik6IFZhbGlkSW5zdHJ1Y3Rpb25UeXBlcyB7XG4gIHN3aXRjaCAoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkLnRvU3RyaW5nKCkpIHtcbiAgICBjYXNlIG5ldyBQdWJsaWNLZXkoTUVNT19QUk9HUkFNX1BLKS50b1N0cmluZygpOlxuICAgICAgcmV0dXJuICdNZW1vJztcbiAgICBjYXNlIFN5c3RlbVByb2dyYW0ucHJvZ3JhbUlkLnRvU3RyaW5nKCk6XG4gICAgICByZXR1cm4gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlSW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKTtcbiAgICBjYXNlIFRPS0VOX1BST0dSQU1fSUQudG9TdHJpbmcoKTpcbiAgICBjYXNlIFRPS0VOXzIwMjJfUFJPR1JBTV9JRC50b1N0cmluZygpOlxuICAgICAgY29uc3QgZGVjb2RlZEluc3RydWN0aW9uID0gZGVjb2RlSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24sIGluc3RydWN0aW9uLnByb2dyYW1JZCk7XG4gICAgICBjb25zdCBpbnN0cnVjdGlvblR5cGVNYXA6IE1hcDxUb2tlbkluc3RydWN0aW9uLCBWYWxpZEluc3RydWN0aW9uVHlwZXM+ID0gbmV3IE1hcCgpO1xuICAgICAgaW5zdHJ1Y3Rpb25UeXBlTWFwLnNldChUb2tlbkluc3RydWN0aW9uLkNsb3NlQWNjb3VudCwgJ0Nsb3NlQXNzb2NpYXRlZFRva2VuQWNjb3VudCcpO1xuICAgICAgaW5zdHJ1Y3Rpb25UeXBlTWFwLnNldChUb2tlbkluc3RydWN0aW9uLkJ1cm4sICdCdXJuJyk7XG4gICAgICBpbnN0cnVjdGlvblR5cGVNYXAuc2V0KFRva2VuSW5zdHJ1Y3Rpb24uTWludFRvLCAnTWludFRvJyk7XG4gICAgICBpbnN0cnVjdGlvblR5cGVNYXAuc2V0KFRva2VuSW5zdHJ1Y3Rpb24uQXBwcm92ZSwgJ0FwcHJvdmUnKTtcbiAgICAgIGluc3RydWN0aW9uVHlwZU1hcC5zZXQoVG9rZW5JbnN0cnVjdGlvbi5UcmFuc2ZlckNoZWNrZWQsICdUb2tlblRyYW5zZmVyJyk7XG4gICAgICBjb25zdCB2YWxpZEluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb25UeXBlTWFwLmdldChkZWNvZGVkSW5zdHJ1Y3Rpb24uZGF0YS5pbnN0cnVjdGlvbik7XG4gICAgICBpZiAoIXZhbGlkSW5zdHJ1Y3Rpb24pIHtcbiAgICAgICAgcmV0dXJuICdDdXN0b21JbnN0cnVjdGlvbic7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsaWRJbnN0cnVjdGlvbjtcbiAgICBjYXNlIFNUQUtFX1BPT0xfUFJPR1JBTV9JRC50b1N0cmluZygpOlxuICAgICAgY29uc3QgZGlzY3JpbWluYXRvciA9IGluc3RydWN0aW9uLmRhdGEucmVhZFVpbnQ4KDApO1xuICAgICAgY29uc3QgbGF5b3V0S2V5ID0gT2JqZWN0LmVudHJpZXMoU1RBS0VfUE9PTF9JTlNUUlVDVElPTl9MQVlPVVRTKS5maW5kKChbXywgdl0pID0+IHYuaW5kZXggPT09IGRpc2NyaW1pbmF0b3IpPy5bMF07XG4gICAgICBpZiAobGF5b3V0S2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnN0cnVjdGlvbiB0eXBlIGluY29ycmVjdDsgdW5rbm93biBkaXNjcmltaW5hdG9yJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBpbnN0cnVjdGlvbktleSA9IGxheW91dEtleSBhcyBrZXlvZiB0eXBlb2YgU1RBS0VfUE9PTF9JTlNUUlVDVElPTl9MQVlPVVRTO1xuICAgICAgcmV0dXJuIGluc3RydWN0aW9uS2V5O1xuICAgIGNhc2UgU3Rha2VQcm9ncmFtLnByb2dyYW1JZC50b1N0cmluZygpOlxuICAgICAgcmV0dXJuIFN0YWtlSW5zdHJ1Y3Rpb24uZGVjb2RlSW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKTtcbiAgICBjYXNlIEFTU09DSUFURURfVE9LRU5fUFJPR1JBTV9JRC50b1N0cmluZygpOlxuICAgICAgLy8gVE9ETzogY2hhbmdlIHRoaXMgd2hlbiBAc3BsLXRva2VuIHN1cHBvcnRzIGRlY29kaW5nIGFzc29jaWF0ZWQgdG9rZW4gaW5zdHJ1Y3Rpb25zXG4gICAgICAvLyBTdXBwb3J0IGJvdGggbGVnYWN5IEFUQSBjcmVhdGlvbiAoZGF0YS5sZW5ndGggPT09IDApIGFuZCBpZGVtcG90ZW50IEFUQSBjcmVhdGlvbiAoZGlzY3JpbWluYXRvciA9IDEpXG4gICAgICAvLyBCb3RoIGluc3RydWN0aW9uIHR5cGVzIGFyZSB0cmVhdGVkIGFzICdJbml0aWFsaXplQXNzb2NpYXRlZFRva2VuQWNjb3VudCcgZm9yIGNvbXBhdGliaWxpdHlcbiAgICAgIGlmIChpbnN0cnVjdGlvbi5kYXRhLmxlbmd0aCA9PT0gMCB8fCBpc0lkZW1wb3RlbnRBdGFJbnN0cnVjdGlvbihpbnN0cnVjdGlvbikpIHtcbiAgICAgICAgcmV0dXJuICdJbml0aWFsaXplQXNzb2NpYXRlZFRva2VuQWNjb3VudCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgICAgICdJbnZhbGlkIHRyYW5zYWN0aW9uLCBpbnN0cnVjdGlvbiBwcm9ncmFtIGlkIG5vdCBzdXBwb3J0ZWQ6ICcgKyBpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9TdHJpbmcoKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIGNhc2UgQ09NUFVURV9CVURHRVQ6XG4gICAgICByZXR1cm4gJ1NldFByaW9yaXR5RmVlJztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICdDdXN0b21JbnN0cnVjdGlvbic7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBzb2xhbmEgaW5zdHJ1Y3Rpb25zIHR5cGVzIHRvIHNlZSBpZiB0aGV5IGFyZSBzdXBwb3J0ZWQgYnkgdGhlIGJ1aWxkZXIuXG4gKiBUaHJvd3MgaWYgdGhlIGluc3RydWN0aW9uIHR5cGUgaXMgaW52YWxpZC5cbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb259IGluc3RydWN0aW9ucyAtIGEgc29sYW5hIGluc3RydWN0aW9uXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlSW50cnVjdGlvblR5cGVzKGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb25zKSB7XG4gICAgaWYgKCFWQUxJRF9TWVNURU1fSU5TVFJVQ1RJT05fVFlQRVMuaW5jbHVkZXMoZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKSkpIHtcbiAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ0ludmFsaWQgdHJhbnNhY3Rpb24sIGluc3RydWN0aW9uIHR5cGUgbm90IHN1cHBvcnRlZDogJyArIGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbikpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIHNvbGFuYSBpbnN0cnVjdGlvbnMgbWF0Y2ggcmF3IG1zZyBhdXRob3JpemUgdHJhbnNhY3Rpb25cbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb259IGluc3RydWN0aW9ucyAtIGEgc29sYW5hIGluc3RydWN0aW9uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgaW5zdHJ1Y3Rpb25zIG1hdGNoIHRoZSByYXcgbXNnIGF1dGhvcml6ZSB0cmFuc2FjdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVSYXdNc2dJbnN0cnVjdGlvbihpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSk6IGJvb2xlYW4ge1xuICAvLyBhcyB3ZWIzLmpzIGNhbm5vdCBkZWNvZGUgYXV0aG9yaXplIGluc3RydWN0aW9uIGZyb20gQ0xJLCB3ZSBuZWVkIHRvIGNoZWNrIGl0IG1hbnVhbGx5IGZpcnN0XG4gIGlmIChpbnN0cnVjdGlvbnMubGVuZ3RoID09PSAyKSB7XG4gICAgY29uc3QgcHJvZ3JhbUlkMSA9IGluc3RydWN0aW9uc1swXS5wcm9ncmFtSWQudG9TdHJpbmcoKTtcbiAgICBjb25zdCBwcm9ncmFtSWQyID0gaW5zdHJ1Y3Rpb25zWzFdLnByb2dyYW1JZC50b1N0cmluZygpO1xuICAgIGlmIChwcm9ncmFtSWQxID09PSBTeXN0ZW1Qcm9ncmFtLnByb2dyYW1JZC50b1N0cmluZygpICYmIHByb2dyYW1JZDIgPT09IFN0YWtlUHJvZ3JhbS5wcm9ncmFtSWQudG9TdHJpbmcoKSkge1xuICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25OYW1lMSA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZUluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbnNbMF0pO1xuICAgICAgY29uc3QgZGF0YSA9IGluc3RydWN0aW9uc1sxXS5kYXRhLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIGlmIChcbiAgICAgICAgaW5zdHJ1Y3Rpb25OYW1lMSA9PT0gbm9uY2VBZHZhbmNlSW5zdHJ1Y3Rpb24gJiZcbiAgICAgICAgKGRhdGEgPT09IHZhbGlkSW5zdHJ1Y3Rpb25EYXRhIHx8IGRhdGEgPT09IHZhbGlkSW5zdHJ1Y3Rpb25EYXRhMilcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGluc3RydWN0aW9ucy5sZW5ndGggPT09IDMpIHtcbiAgICBjb25zdCBwcm9ncmFtSWQxID0gaW5zdHJ1Y3Rpb25zWzBdLnByb2dyYW1JZC50b1N0cmluZygpO1xuICAgIGNvbnN0IHByb2dyYW1JZDIgPSBpbnN0cnVjdGlvbnNbMV0ucHJvZ3JhbUlkLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgcHJvZ3JhbUlkMyA9IGluc3RydWN0aW9uc1syXS5wcm9ncmFtSWQudG9TdHJpbmcoKTtcbiAgICBpZiAoXG4gICAgICBwcm9ncmFtSWQxID09PSBTeXN0ZW1Qcm9ncmFtLnByb2dyYW1JZC50b1N0cmluZygpICYmXG4gICAgICBwcm9ncmFtSWQyID09PSBTdGFrZVByb2dyYW0ucHJvZ3JhbUlkLnRvU3RyaW5nKCkgJiZcbiAgICAgIHByb2dyYW1JZDMgPT09IFN0YWtlUHJvZ3JhbS5wcm9ncmFtSWQudG9TdHJpbmcoKVxuICAgICkge1xuICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25OYW1lMSA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZUluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbnNbMF0pO1xuICAgICAgY29uc3QgZGF0YSA9IGluc3RydWN0aW9uc1sxXS5kYXRhLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIGNvbnN0IGRhdGEyID0gaW5zdHJ1Y3Rpb25zWzJdLmRhdGEudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgaWYgKFxuICAgICAgICBpbnN0cnVjdGlvbk5hbWUxID09PSBub25jZUFkdmFuY2VJbnN0cnVjdGlvbiAmJlxuICAgICAgICAoZGF0YSA9PT0gdmFsaWRJbnN0cnVjdGlvbkRhdGEgfHwgZGF0YSA9PT0gdmFsaWRJbnN0cnVjdGlvbkRhdGEyKSAmJlxuICAgICAgICAoZGF0YTIgPT09IHZhbGlkSW5zdHJ1Y3Rpb25EYXRhIHx8IGRhdGEyID09PSB2YWxpZEluc3RydWN0aW9uRGF0YTIpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbi8qKlxuICogQ2hlY2sgdGhlIHJhdyB0cmFuc2FjdGlvbiBoYXMgYSB2YWxpZCBmb3JtYXQgaW4gdGhlIGJsb2NrY2hhaW4gY29udGV4dCwgdGhyb3cgb3RoZXJ3aXNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByYXdUcmFuc2FjdGlvbiAtIFRyYW5zYWN0aW9uIGluIGJhc2U2NCBzdHJpbmcgIGZvcm1hdFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVSYXdUcmFuc2FjdGlvbihcbiAgcmF3VHJhbnNhY3Rpb246IHN0cmluZyxcbiAgcmVxdWlyZUFsbFNpZ25hdHVyZXMgPSBmYWxzZSxcbiAgdmVyaWZ5U2lnbmF0dXJlcyA9IGZhbHNlXG4pOiB2b2lkIHtcbiAgaWYgKCFyYXdUcmFuc2FjdGlvbikge1xuICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgcmF3IHRyYW5zYWN0aW9uOiBVbmRlZmluZWQnKTtcbiAgfVxuICBpZiAoIWlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbiwgcmVxdWlyZUFsbFNpZ25hdHVyZXMsIHZlcmlmeVNpZ25hdHVyZXMpKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCByYXcgdHJhbnNhY3Rpb24nKTtcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBhZGRyZXNzIHRvIGNoZWNrIGlmIGl0IGV4aXN0cyBhbmQgaXMgYSB2YWxpZCBTb2xhbmEgcHVibGljIGtleVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzIFRoZSBhZGRyZXNzIHRvIGJlIHZhbGlkYXRlZFxuICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkTmFtZSBOYW1lIG9mIHRoZSBmaWVsZCB0byB2YWxpZGF0ZSwgaXRzIG5lZWRlZCB0byByZXR1cm4gd2hpY2ggZmllbGQgaXMgZmFpbGluZyBvbiBjYXNlIG9mIGVycm9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVBZGRyZXNzKGFkZHJlc3M6IHN0cmluZywgZmllbGROYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKCFhZGRyZXNzIHx8ICFpc1ZhbGlkUHVibGljS2V5KGFkZHJlc3MpKSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBvciBtaXNzaW5nICR7ZmllbGROYW1lfSwgZ290OiAke2FkZHJlc3N9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIHN0YXRpY3MgY29pbiBvYmplY3QgbWF0Y2hpbmcgYSBnaXZlbiBTb2xhbmEgdG9rZW4gYWRkcmVzcyBpZiBpdCBleGlzdHNcbiAqXG4gKiBAcGFyYW0gdG9rZW5BZGRyZXNzIFRoZSB0b2tlbiBhZGRyZXNzIHRvIG1hdGNoIGFnYWluc3RcbiAqIEBwYXJhbSBuZXR3b3JrIFNvbGFuYSBNYWlubmV0IG9yIFRlc3RuZXRcbiAqIEByZXR1cm5zIHN0YXRpY3MgQmFzZUNvaW4gb2JqZWN0IGZvciB0aGUgbWF0Y2hpbmcgdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNvbFRva2VuRnJvbUFkZHJlc3ModG9rZW5BZGRyZXNzOiBzdHJpbmcsIG5ldHdvcms6IEJhc2VOZXR3b3JrKTogUmVhZG9ubHk8QmFzZUNvaW4+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdG9rZW5zID0gY29pbnMuZmlsdGVyKChjb2luKSA9PiB7XG4gICAgaWYgKGNvaW4gaW5zdGFuY2VvZiBTb2xDb2luKSB7XG4gICAgICByZXR1cm4gY29pbi5uZXR3b3JrLnR5cGUgPT09IG5ldHdvcmsudHlwZSAmJiBjb2luLnRva2VuQWRkcmVzcy50b0xvd2VyQ2FzZSgpID09PSB0b2tlbkFkZHJlc3MudG9Mb3dlckNhc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9KTtcbiAgY29uc3QgdG9rZW5zQXJyYXkgPSB0b2tlbnMubWFwKCh0b2tlbikgPT4gdG9rZW4pO1xuICBpZiAodG9rZW5zQXJyYXkubGVuZ3RoID49IDEpIHtcbiAgICAvLyB0aGVyZSBzaG91bGQgbmV2ZXIgYmUgdHdvIHRva2VucyB3aXRoIHRoZSBzYW1lIGNvbnRyYWN0IGFkZHJlc3MsIHNvIHdlIGFzc2VydCB0aGF0IGhlcmVcbiAgICBhc3NlcnQodG9rZW5zQXJyYXkubGVuZ3RoID09PSAxKTtcbiAgICByZXR1cm4gdG9rZW5zQXJyYXlbMF07XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHN0YXRpY3MgY29pbiBvYmplY3QgbWF0Y2hpbmcgYSBnaXZlbiBTb2xhbmEgdG9rZW4gYWRkcmVzcyBpZiBpdCBleGlzdHNcbiAqXG4gKiBAcGFyYW0gdG9rZW5BZGRyZXNzIFRoZSB0b2tlbiBhZGRyZXNzIHRvIG1hdGNoIGFnYWluc3RcbiAqIEBwYXJhbSBuZXR3b3JrIFNvbGFuYSBNYWlubmV0IG9yIFRlc3RuZXRcbiAqIEByZXR1cm5zIHN0YXRpY3MgQmFzZUNvaW4gb2JqZWN0IGZvciB0aGUgbWF0Y2hpbmcgdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNvbFRva2VuRnJvbUFkZHJlc3NPbmx5KHRva2VuQWRkcmVzczogc3RyaW5nKTogUmVhZG9ubHk8QmFzZUNvaW4+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdG9rZW5zID0gY29pbnMuZmlsdGVyKChjb2luKSA9PiB7XG4gICAgaWYgKGNvaW4gaW5zdGFuY2VvZiBTb2xDb2luKSB7XG4gICAgICByZXR1cm4gY29pbi50b2tlbkFkZHJlc3MudG9Mb3dlckNhc2UoKSA9PT0gdG9rZW5BZGRyZXNzLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG4gIGNvbnN0IHRva2Vuc0FycmF5ID0gdG9rZW5zLm1hcCgodG9rZW4pID0+IHRva2VuKTtcbiAgaWYgKHRva2Vuc0FycmF5Lmxlbmd0aCA+PSAxKSB7XG4gICAgLy8gdGhlcmUgc2hvdWxkIG5ldmVyIGJlIHR3byB0b2tlbnMgd2l0aCB0aGUgc2FtZSBjb250cmFjdCBhZGRyZXNzLCBzbyB3ZSBhc3NlcnQgdGhhdCBoZXJlXG4gICAgYXNzZXJ0KHRva2Vuc0FycmF5Lmxlbmd0aCA9PT0gMSk7XG4gICAgcmV0dXJuIHRva2Vuc0FycmF5WzBdO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogR2V0IHRoZSBzb2xhbmEgdG9rZW4gb2JqZWN0IGZyb20gdG9rZW4gbmFtZVxuICogQHBhcmFtIHRva2VuTmFtZSBUaGUgdG9rZW4gbmFtZSB0byBtYXRjaCBhZ2FpbnN0XG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNvbFRva2VuRnJvbVRva2VuTmFtZSh0b2tlbk5hbWU6IHN0cmluZyk6IFJlYWRvbmx5PFNvbENvaW4+IHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCB0b2tlbiA9IGNvaW5zLmdldCh0b2tlbk5hbWUpO1xuICAgIGlmICghKHRva2VuLmlzVG9rZW4gJiYgdG9rZW4gaW5zdGFuY2VvZiBTb2xDb2luKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRva2VuO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCEoZSBpbnN0YW5jZW9mIENvaW5Ob3REZWZpbmVkRXJyb3IpKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBzb2xhbmEgYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IGFkZHJlc3NcbiAqIEBwYXJhbSB0b2tlbkFkZHJlc3MgdG9rZW4gbWludCBhZGRyZXNzXG4gKiBAcGFyYW0gb3duZXJBZGRyZXNzIFRoZSBvd25lciBvZiB0aGUgYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50XG4gKiBAcmV0dXJucyBUaGUgYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IGFkZHJlc3NcbiAqICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QXNzb2NpYXRlZFRva2VuQWNjb3VudEFkZHJlc3MoXG4gIHRva2VuTWludEFkZHJlc3M6IHN0cmluZyxcbiAgb3duZXJBZGRyZXNzOiBzdHJpbmcsXG4gIGFsbG93T3duZXJPZmZDdXJ2ZSA9IGZhbHNlLFxuICBwcm9ncmFtSWQ/OiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IG1pbnRQdWJsaWNLZXkgPSBuZXcgUHVibGljS2V5KHRva2VuTWludEFkZHJlc3MpO1xuICBjb25zdCBvd25lclB1YmxpY0tleSA9IG5ldyBQdWJsaWNLZXkob3duZXJBZGRyZXNzKTtcblxuICAvLyB0b2tlbkFkZHJlc3MgYXJlIG5vdCBvbiBlZDI1NTE5IGN1cnZlLCBzbyB0aGV5IGNhbid0IGJlIHVzZWQgYXMgb3duZXJBZGRyZXNzXG4gIGlmICghYWxsb3dPd25lck9mZkN1cnZlICYmICFQdWJsaWNLZXkuaXNPbkN1cnZlKG93bmVyUHVibGljS2V5LnRvQnVmZmVyKCkpKSB7XG4gICAgdGhyb3cgbmV3IFV0aWxzRXJyb3IoJ0ludmFsaWQgb3duZXJBZGRyZXNzIC0gYWRkcmVzcyBvZmYgZWQyNTUxOSBjdXJ2ZSwgZ290OiAnICsgb3duZXJBZGRyZXNzKTtcbiAgfVxuXG4gIGlmICghcHJvZ3JhbUlkKSB7XG4gICAgY29uc3QgY29pbiA9IGdldFNvbFRva2VuRnJvbUFkZHJlc3NPbmx5KHRva2VuTWludEFkZHJlc3MpO1xuICAgIGlmIChjb2luICYmIGNvaW4gaW5zdGFuY2VvZiBTb2xDb2luICYmICdwcm9ncmFtSWQnIGluIGNvaW4gJiYgY29pbi5wcm9ncmFtSWQpIHtcbiAgICAgIHByb2dyYW1JZCA9IGNvaW4ucHJvZ3JhbUlkLnRvU3RyaW5nKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2dyYW1JZCA9IFRPS0VOX1BST0dSQU1fSUQudG9TdHJpbmcoKTtcbiAgICB9XG4gIH1cblxuICBsZXQgYXRhQWRkcmVzczogUHVibGljS2V5O1xuICBpZiAocHJvZ3JhbUlkID09PSBUT0tFTl8yMDIyX1BST0dSQU1fSUQudG9TdHJpbmcoKSkge1xuICAgIGF0YUFkZHJlc3MgPSBhd2FpdCBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzKFxuICAgICAgbWludFB1YmxpY0tleSxcbiAgICAgIG93bmVyUHVibGljS2V5LFxuICAgICAgYWxsb3dPd25lck9mZkN1cnZlLFxuICAgICAgVE9LRU5fMjAyMl9QUk9HUkFNX0lEXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBhdGFBZGRyZXNzID0gYXdhaXQgZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzcyhtaW50UHVibGljS2V5LCBvd25lclB1YmxpY0tleSwgYWxsb3dPd25lck9mZkN1cnZlKTtcbiAgfVxuICByZXR1cm4gYXRhQWRkcmVzcy50b1N0cmluZygpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVNaW50QWRkcmVzcyhtaW50QWRkcmVzczogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghbWludEFkZHJlc3MgfHwgIWlzVmFsaWRBZGRyZXNzKG1pbnRBZGRyZXNzKSkge1xuICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgb3IgbWlzc2luZyBtaW50QWRkcmVzcywgZ290OiAnICsgbWludEFkZHJlc3MpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU93bmVyQWRkcmVzcyhvd25lckFkZHJlc3M6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoIW93bmVyQWRkcmVzcyB8fCAhaXNWYWxpZEFkZHJlc3Mob3duZXJBZGRyZXNzKSkge1xuICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgb3IgbWlzc2luZyBvd25lckFkZHJlc3MsIGdvdDogJyArIG93bmVyQWRkcmVzcyk7XG4gIH1cbn1cblxuLyoqXG4gKiBUeXBlIHByZWRpY2F0ZSB0byBjaGVjayBpZiBhbiBpbnN0cnVjdGlvbiBpcyBhIGxlZ2FjeSBTb2xJbnN0cnVjdGlvbi5cbiAqIFVzZXMgJ3Byb2dyYW1JZCcgcHJvcGVydHkgYXMgdGhlIGRpc2NyaW1pbmF0b3Igc2luY2UgaXQncyB1bmlxdWUgdG8gbGVnYWN5IGluc3RydWN0aW9uc1xuICogVmVyc2lvbmVkIGluc3RydWN0aW9ucyBoYXZlICdwcm9ncmFtSWRJbmRleCcgcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIGluc3RydWN0aW9uIC0gVGhlIGluc3RydWN0aW9uIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBpbnN0cnVjdGlvbiBpcyBhIFNvbEluc3RydWN0aW9uIChoYXMgcHJvZ3JhbUlkIGZpZWxkKVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTb2xMZWdhY3lJbnN0cnVjdGlvbihcbiAgaW5zdHJ1Y3Rpb246IFNvbEluc3RydWN0aW9uIHwgU29sVmVyc2lvbmVkSW5zdHJ1Y3Rpb25cbik6IGluc3RydWN0aW9uIGlzIFNvbEluc3RydWN0aW9uIHtcbiAgcmV0dXJuICdwcm9ncmFtSWQnIGluIGluc3RydWN0aW9uO1xufVxuIl19
|
package/dist/src/sol.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @prettier
|
|
3
3
|
*/
|
|
4
|
-
import { BaseBroadcastTransactionOptions, BaseBroadcastTransactionResult, BaseCoin, ParseTransactionOptions as BaseParseTransactionOptions, TransactionPrebuild as BaseTransactionPrebuild, BitGoBase, KeyPair, Memo, MPCAlgorithm, MPCConsolidationRecoveryOptions, MPCRecoveryOptions, MPCSweepRecoveryOptions, MPCSweepTxs, MPCTx, MPCTxs, ParsedTransaction, PresignTransactionOptions, SignedTransaction, SignTransactionOptions, TokenEnablementConfig, TransactionExplanation, TransactionRecipient, VerifyAddressOptions, VerifyTransactionOptions, MultisigType, AuditDecryptedKeyParams } from '@bitgo-beta/sdk-core';
|
|
5
|
-
import { BaseNetwork, CoinFamily, BaseCoin as StaticsBaseCoin } from '@bitgo-beta/statics';
|
|
6
4
|
import * as request from 'superagent';
|
|
5
|
+
import { AuditDecryptedKeyParams, BaseBroadcastTransactionOptions, BaseBroadcastTransactionResult, BaseCoin, ParseTransactionOptions as BaseParseTransactionOptions, TransactionPrebuild as BaseTransactionPrebuild, BitGoBase, ITokenEnablement, KeyPair, Memo, MPCAlgorithm, MPCConsolidationRecoveryOptions, MPCRecoveryOptions, MPCSweepRecoveryOptions, MPCSweepTxs, MPCTx, MPCTxs, MultisigType, ParsedTransaction, PopulatedIntent, PrebuildTransactionWithIntentOptions, PresignTransactionOptions, SignedTransaction, SignTransactionOptions, TokenEnablement, TokenEnablementConfig, TransactionExplanation, TransactionParams, TransactionRecipient, VerifyTransactionOptions, TssVerifyAddressOptions } from '@bitgo-beta/sdk-core';
|
|
6
|
+
import { BaseNetwork, CoinFamily, BaseCoin as StaticsBaseCoin } from '@bitgo-beta/statics';
|
|
7
7
|
export declare const DEFAULT_SCAN_FACTOR = 20;
|
|
8
8
|
export interface TransactionFee {
|
|
9
9
|
fee: string;
|
|
@@ -84,6 +84,7 @@ export interface SolRecoveryOptions extends MPCRecoveryOptions {
|
|
|
84
84
|
closeAtaAddress?: string;
|
|
85
85
|
recoveryDestinationAtaAddress?: string;
|
|
86
86
|
programId?: string;
|
|
87
|
+
apiKey?: string;
|
|
87
88
|
}
|
|
88
89
|
export interface SolConsolidationRecoveryOptions extends MPCConsolidationRecoveryOptions {
|
|
89
90
|
durableNonces: {
|
|
@@ -91,6 +92,8 @@ export interface SolConsolidationRecoveryOptions extends MPCConsolidationRecover
|
|
|
91
92
|
secretKey: string;
|
|
92
93
|
};
|
|
93
94
|
tokenContractAddress?: string;
|
|
95
|
+
apiKey?: string;
|
|
96
|
+
programId?: string;
|
|
94
97
|
}
|
|
95
98
|
export declare class Sol extends BaseCoin {
|
|
96
99
|
protected readonly _staticsCoin: Readonly<StaticsBaseCoin>;
|
|
@@ -108,8 +111,26 @@ export declare class Sol extends BaseCoin {
|
|
|
108
111
|
getFullName(): string;
|
|
109
112
|
getNetwork(): BaseNetwork;
|
|
110
113
|
getBaseFactor(): string | number;
|
|
111
|
-
|
|
112
|
-
|
|
114
|
+
verifyTxType(expectedTypeFromUserParams: string, actualTypeFromDecoded: string | undefined): void;
|
|
115
|
+
throwIfMissingTokenEnablementsOrReturn(explanation: TransactionExplanation): ITokenEnablement[];
|
|
116
|
+
throwIfMissingEnableTokenConfigOrReturn(txParams: TransactionParams): TokenEnablement[];
|
|
117
|
+
verifyTokenName(tokenEnablementsPrebuild: ITokenEnablement[], enableTokensConfig: TokenEnablement[]): void;
|
|
118
|
+
verifyTokenAddress(tokenEnablementsPrebuild: ITokenEnablement[], enableTokensConfig: TokenEnablement[]): Promise<void>;
|
|
119
|
+
private hasSolVersionedTransactionData;
|
|
120
|
+
/**
|
|
121
|
+
* Verify a versioned Solana transaction with basic structural validation
|
|
122
|
+
* @param params - verification parameters
|
|
123
|
+
* @returns true if verification passes
|
|
124
|
+
*/
|
|
125
|
+
private verifyVersionedTransaction;
|
|
126
|
+
verifyTransaction(params: SolVerifyTransactionOptions): Promise<boolean>;
|
|
127
|
+
isWalletAddress(params: TssVerifyAddressOptions): Promise<boolean>;
|
|
128
|
+
/**
|
|
129
|
+
* Converts a Solana public key to an address
|
|
130
|
+
* @param publicKey Hex-encoded public key (64 hex characters = 32 bytes)
|
|
131
|
+
* @returns Base58-encoded Solana address
|
|
132
|
+
*/
|
|
133
|
+
getAddressFromPublicKey(publicKey: string): string;
|
|
113
134
|
/**
|
|
114
135
|
* Generate Solana key pair
|
|
115
136
|
*
|
|
@@ -149,21 +170,21 @@ export declare class Sol extends BaseCoin {
|
|
|
149
170
|
getSignablePayload(serializedTx: string): Promise<Buffer>;
|
|
150
171
|
/** @inheritDoc */
|
|
151
172
|
presignTransaction(params: PresignTransactionOptions): Promise<PresignTransactionOptions>;
|
|
152
|
-
protected getPublicNodeUrl(): string;
|
|
173
|
+
protected getPublicNodeUrl(apiKey?: string): string;
|
|
153
174
|
/**
|
|
154
175
|
* Make a request to one of the public SOL nodes available
|
|
155
176
|
* @param params.payload
|
|
156
177
|
*/
|
|
157
178
|
protected getDataFromNode(params: {
|
|
158
179
|
payload?: Record<string, unknown>;
|
|
159
|
-
}): Promise<request.Response>;
|
|
160
|
-
protected getBlockhash(): Promise<string>;
|
|
161
|
-
protected getFeeForMessage(message: string): Promise<number>;
|
|
162
|
-
protected getRentExemptAmount(): Promise<number>;
|
|
163
|
-
protected getAccountBalance(pubKey: string): Promise<number>;
|
|
164
|
-
protected getAccountInfo(pubKey: string): Promise<SolDurableNonceFromNode>;
|
|
165
|
-
protected getTokenAccountsByOwner(pubKey?: string, programId?: string): Promise<[] | TokenAccount[]>;
|
|
166
|
-
protected getTokenAccountInfo(pubKey: string): Promise<TokenAccount>;
|
|
180
|
+
}, apiKey?: string): Promise<request.Response>;
|
|
181
|
+
protected getBlockhash(apiKey?: string): Promise<string>;
|
|
182
|
+
protected getFeeForMessage(message: string, apiKey?: string): Promise<number>;
|
|
183
|
+
protected getRentExemptAmount(apiKey?: string): Promise<number>;
|
|
184
|
+
protected getAccountBalance(pubKey: string, apiKey?: string): Promise<number>;
|
|
185
|
+
protected getAccountInfo(pubKey: string, apiKey?: string): Promise<SolDurableNonceFromNode>;
|
|
186
|
+
protected getTokenAccountsByOwner(pubKey?: string, programId?: string, apiKey?: string): Promise<[] | TokenAccount[]>;
|
|
187
|
+
protected getTokenAccountInfo(pubKey: string, apiKey?: string): Promise<TokenAccount>;
|
|
167
188
|
/** inherited doc */
|
|
168
189
|
createBroadcastableSweepTransaction(params: MPCSweepRecoveryOptions): Promise<MPCTxs>;
|
|
169
190
|
/**
|
|
@@ -199,6 +220,8 @@ export declare class Sol extends BaseCoin {
|
|
|
199
220
|
broadcastTransaction({ serializedSignedTransaction, }: BaseBroadcastTransactionOptions): Promise<BaseBroadcastTransactionResult>;
|
|
200
221
|
/** @inheritDoc */
|
|
201
222
|
auditDecryptedKey({ prv, publicKey, multiSigType }: AuditDecryptedKeyParams): void;
|
|
223
|
+
/** @inheritDoc */
|
|
224
|
+
setCoinSpecificFieldsInIntent(intent: PopulatedIntent, params: PrebuildTransactionWithIntentOptions): void;
|
|
202
225
|
}
|
|
203
226
|
export {};
|
|
204
227
|
//# sourceMappingURL=sol.d.ts.map
|
package/dist/src/sol.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sol.d.ts","sourceRoot":"","sources":["../../src/sol.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"sol.d.ts","sourceRoot":"","sources":["../../src/sol.ts"],"names":[],"mappings":"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"}
|