PHP WebShell

Текущая директория: /opt/BitGoJS/modules/sdk-coin-sol/dist/src/lib

Просмотр файла: instructionParamsFactory.js

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.instructionParamsFactory = instructionParamsFactory;
const spl_token_1 = require("@solana/spl-token");
const web3_js_1 = require("@solana/web3.js");
const sdk_core_1 = require("@bitgo/sdk-core");
const statics_1 = require("@bitgo/statics");
const assert_1 = __importDefault(require("assert"));
const constants_1 = require("./constants");
const utils_1 = require("./utils");
/**
 * Construct instructions params from Solana instructions
 *
 * @param {TransactionType} type - the transaction type
 * @param {TransactionInstruction[]} instructions - solana instructions
 * @returns {InstructionParams[]} An array containing instruction params
 */
function instructionParamsFactory(type, instructions, coinName) {
    switch (type) {
        case sdk_core_1.TransactionType.WalletInitialization:
            return parseWalletInitInstructions(instructions);
        case sdk_core_1.TransactionType.Send:
            return parseSendInstructions(instructions);
        case sdk_core_1.TransactionType.StakingActivate:
            return parseStakingActivateInstructions(instructions);
        case sdk_core_1.TransactionType.StakingDeactivate:
            return parseStakingDeactivateInstructions(instructions, coinName);
        case sdk_core_1.TransactionType.StakingWithdraw:
            return parseStakingWithdrawInstructions(instructions);
        case sdk_core_1.TransactionType.AssociatedTokenAccountInitialization:
            return parseAtaInitInstructions(instructions);
        case sdk_core_1.TransactionType.CloseAssociatedTokenAccount:
            return parseAtaCloseInstructions(instructions);
        case sdk_core_1.TransactionType.StakingAuthorize:
            return parseStakingAuthorizeInstructions(instructions);
        case sdk_core_1.TransactionType.StakingAuthorizeRaw:
            return parseStakingAuthorizeRawInstructions(instructions);
        case sdk_core_1.TransactionType.StakingDelegate:
            return parseStakingDelegateInstructions(instructions);
        default:
            throw new sdk_core_1.NotSupported('Invalid transaction, transaction type not supported: ' + type);
    }
}
/**
 * Parses Solana instructions to Wallet initialization tx instructions params
 *
 * @param {TransactionInstruction[]} instructions - containing create and initialize nonce solana instructions
 * @returns {InstructionParams[]} An array containing instruction params for Wallet initialization tx
 */
function parseWalletInitInstructions(instructions) {
    const instructionData = [];
    const createInstruction = web3_js_1.SystemInstruction.decodeCreateAccount(instructions[constants_1.walletInitInstructionIndexes.Create]);
    const nonceInitInstruction = web3_js_1.SystemInstruction.decodeNonceInitialize(instructions[constants_1.walletInitInstructionIndexes.InitializeNonceAccount]);
    const walletInit = {
        type: constants_1.InstructionBuilderTypes.CreateNonceAccount,
        params: {
            fromAddress: createInstruction.fromPubkey.toString(),
            nonceAddress: nonceInitInstruction.noncePubkey.toString(),
            authAddress: nonceInitInstruction.authorizedPubkey.toString(),
            amount: createInstruction.lamports.toString(),
        },
    };
    instructionData.push(walletInit);
    const memo = getMemo(instructions, constants_1.walletInitInstructionIndexes);
    if (memo) {
        instructionData.push(memo);
    }
    return instructionData;
}
/**
 * Parses Solana instructions to Send tx instructions params
 * Only supports Memo, Transfer and Advance Nonce Solana instructions
 *
 * @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
 * @returns {InstructionParams[]} An array containing instruction params for Send tx
 */
function parseSendInstructions(instructions) {
    const instructionData = [];
    for (const instruction of instructions) {
        const type = (0, utils_1.getInstructionType)(instruction);
        switch (type) {
            case constants_1.ValidInstructionTypesEnum.Memo:
                const memo = { type: constants_1.InstructionBuilderTypes.Memo, params: { memo: instruction.data.toString() } };
                instructionData.push(memo);
                break;
            case constants_1.ValidInstructionTypesEnum.AdvanceNonceAccount:
                const advanceNonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instruction);
                const nonce = {
                    type: constants_1.InstructionBuilderTypes.NonceAdvance,
                    params: {
                        walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
                        authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
                    },
                };
                instructionData.push(nonce);
                break;
            case constants_1.ValidInstructionTypesEnum.Transfer:
                const transferInstruction = web3_js_1.SystemInstruction.decodeTransfer(instruction);
                const transfer = {
                    type: constants_1.InstructionBuilderTypes.Transfer,
                    params: {
                        fromAddress: transferInstruction.fromPubkey.toString(),
                        toAddress: transferInstruction.toPubkey.toString(),
                        amount: transferInstruction.lamports.toString(),
                    },
                };
                instructionData.push(transfer);
                break;
            case constants_1.ValidInstructionTypesEnum.TokenTransfer:
                const tokenTransferInstruction = (0, spl_token_1.decodeTransferCheckedInstruction)(instruction);
                const tokenName = findTokenName(tokenTransferInstruction.keys.mint.pubkey.toString());
                const tokenTransfer = {
                    type: constants_1.InstructionBuilderTypes.TokenTransfer,
                    params: {
                        fromAddress: tokenTransferInstruction.keys.owner.pubkey.toString(),
                        toAddress: tokenTransferInstruction.keys.destination.pubkey.toString(),
                        amount: tokenTransferInstruction.data.amount.toString(),
                        tokenName,
                        sourceAddress: tokenTransferInstruction.keys.source.pubkey.toString(),
                    },
                };
                instructionData.push(tokenTransfer);
                break;
            case constants_1.ValidInstructionTypesEnum.InitializeAssociatedTokenAccount:
                const mintAddress = instruction.keys[ataInitInstructionKeysIndexes.MintAddress].pubkey.toString();
                const mintTokenName = findTokenName(mintAddress);
                const ataInit = {
                    type: constants_1.InstructionBuilderTypes.CreateAssociatedTokenAccount,
                    params: {
                        mintAddress,
                        ataAddress: instruction.keys[ataInitInstructionKeysIndexes.ATAAddress].pubkey.toString(),
                        ownerAddress: instruction.keys[ataInitInstructionKeysIndexes.OwnerAddress].pubkey.toString(),
                        payerAddress: instruction.keys[ataInitInstructionKeysIndexes.PayerAddress].pubkey.toString(),
                        tokenName: mintTokenName,
                    },
                };
                instructionData.push(ataInit);
                break;
            case constants_1.ValidInstructionTypesEnum.CloseAssociatedTokenAccount:
                const accountAddress = instruction.keys[closeAtaInstructionKeysIndexes.AccountAddress].pubkey.toString();
                const destinationAddress = instruction.keys[closeAtaInstructionKeysIndexes.DestinationAddress].pubkey.toString();
                const authorityAddress = instruction.keys[closeAtaInstructionKeysIndexes.AuthorityAddress].pubkey.toString();
                const ataClose = {
                    type: constants_1.InstructionBuilderTypes.CloseAssociatedTokenAccount,
                    params: {
                        accountAddress,
                        destinationAddress,
                        authorityAddress,
                    },
                };
                instructionData.push(ataClose);
                break;
            case constants_1.ValidInstructionTypesEnum.SetPriorityFee:
                const setComputeUnitPriceParams = web3_js_1.ComputeBudgetInstruction.decodeSetComputeUnitPrice(instruction);
                const setPriorityFee = {
                    type: constants_1.InstructionBuilderTypes.SetPriorityFee,
                    params: {
                        fee: setComputeUnitPriceParams.microLamports,
                    },
                };
                instructionData.push(setPriorityFee);
                break;
            default:
                throw new sdk_core_1.NotSupported('Invalid transaction, instruction type not supported: ' + (0, utils_1.getInstructionType)(instruction));
        }
    }
    return instructionData;
}
/**
 * Parses Solana instructions to create staking tx and delegate tx instructions params
 * Only supports Nonce, StakingActivate and Memo Solana instructions
 *
 * @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
 * @returns {InstructionParams[]} An array containing instruction params for staking activate tx
 */
function parseStakingActivateInstructions(instructions) {
    const instructionData = [];
    const stakingInstructions = {};
    for (const instruction of instructions) {
        const type = (0, utils_1.getInstructionType)(instruction);
        switch (type) {
            case constants_1.ValidInstructionTypesEnum.AdvanceNonceAccount:
                const advanceNonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instruction);
                const nonce = {
                    type: constants_1.InstructionBuilderTypes.NonceAdvance,
                    params: {
                        walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
                        authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
                    },
                };
                instructionData.push(nonce);
                break;
            case constants_1.ValidInstructionTypesEnum.Memo:
                const memo = { type: constants_1.InstructionBuilderTypes.Memo, params: { memo: instruction.data.toString() } };
                instructionData.push(memo);
                break;
            case constants_1.ValidInstructionTypesEnum.Create:
                stakingInstructions.create = web3_js_1.SystemInstruction.decodeCreateAccount(instruction);
                break;
            case constants_1.ValidInstructionTypesEnum.StakingInitialize:
                stakingInstructions.initialize = web3_js_1.StakeInstruction.decodeInitialize(instruction);
                break;
            case constants_1.ValidInstructionTypesEnum.StakingDelegate:
                stakingInstructions.delegate = web3_js_1.StakeInstruction.decodeDelegate(instruction);
                break;
        }
    }
    validateStakingInstructions(stakingInstructions);
    const stakingActivate = {
        type: constants_1.InstructionBuilderTypes.StakingActivate,
        params: {
            fromAddress: stakingInstructions.create?.fromPubkey.toString() || '',
            stakingAddress: stakingInstructions.initialize?.stakePubkey.toString() || '',
            amount: stakingInstructions.create?.lamports.toString() || '',
            validator: stakingInstructions.delegate?.votePubkey.toString() ||
                stakingInstructions.initialize?.authorized.staker.toString() ||
                '',
            isMarinade: stakingInstructions.delegate === undefined,
        },
    };
    instructionData.push(stakingActivate);
    return instructionData;
}
/**
 * Parses Solana instructions to create delegate tx
 * Only supports Nonce, StakingDelegate
 *
 * @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
 * @returns {InstructionParams[]} An array containing instruction params for staking delegate tx
 */
function parseStakingDelegateInstructions(instructions) {
    const instructionData = [];
    for (const instruction of instructions) {
        const type = (0, utils_1.getInstructionType)(instruction);
        switch (type) {
            case constants_1.ValidInstructionTypesEnum.AdvanceNonceAccount:
                const advanceNonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instruction);
                const nonce = {
                    type: constants_1.InstructionBuilderTypes.NonceAdvance,
                    params: {
                        walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
                        authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
                    },
                };
                instructionData.push(nonce);
                break;
            case constants_1.ValidInstructionTypesEnum.StakingDelegate:
                const stakingDelegateParams = web3_js_1.StakeInstruction.decodeDelegate(instruction);
                const stakingDelegate = {
                    type: constants_1.InstructionBuilderTypes.StakingDelegate,
                    params: {
                        fromAddress: stakingDelegateParams.authorizedPubkey.toString() || '',
                        stakingAddress: stakingDelegateParams.stakePubkey.toString() || '',
                        validator: stakingDelegateParams.votePubkey.toString() || '',
                    },
                };
                instructionData.push(stakingDelegate);
                break;
        }
    }
    return instructionData;
}
function validateStakingInstructions(stakingInstructions) {
    if (!stakingInstructions.create) {
        throw new sdk_core_1.NotSupported('Invalid staking activate transaction, missing create stake account instruction');
    }
    if (!stakingInstructions.initialize && stakingInstructions.delegate) {
        return;
    }
    else if (!stakingInstructions.delegate && stakingInstructions.initialize) {
        return;
    }
    else if (!stakingInstructions.delegate && !stakingInstructions.initialize) {
        // If both are missing something is wrong
        throw new sdk_core_1.NotSupported('Invalid staking activate transaction, missing initialize stake account/delegate instruction');
    }
}
/**
 * Parses Solana instructions to create deactivate stake tx instructions params. Supports full stake
 * account deactivation and partial stake account deactivation.
 *
 * When partially deactivating a stake account this method expects the following instructions: Allocate,
 * to allocate a new staking account, Assign, to assign the newly created staking account to the
 * Stake Program, Split, to split the current stake account, and StakingDeactivate to deactivate the
 * newly created stake account.
 *
 * Supports Nonce, StakingDeactivate, Memo, Allocate, Assign, and Split Solana instructions.
 *
 * @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
 * @returns {InstructionParams[]} An array containing instruction params for staking deactivate tx
 */
function parseStakingDeactivateInstructions(instructions, coinName) {
    const instructionData = [];
    const unstakingInstructions = [];
    for (const instruction of instructions) {
        const type = (0, utils_1.getInstructionType)(instruction);
        switch (type) {
            case constants_1.ValidInstructionTypesEnum.AdvanceNonceAccount:
                const advanceNonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instruction);
                const nonce = {
                    type: constants_1.InstructionBuilderTypes.NonceAdvance,
                    params: {
                        walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
                        authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
                    },
                };
                instructionData.push(nonce);
                break;
            case constants_1.ValidInstructionTypesEnum.Memo:
                const memo = {
                    type: constants_1.InstructionBuilderTypes.Memo,
                    params: { memo: instruction.data.toString() },
                };
                instructionData.push(memo);
                break;
            case constants_1.ValidInstructionTypesEnum.Allocate:
                if (unstakingInstructions.length > 0 &&
                    unstakingInstructions[unstakingInstructions.length - 1].allocate === undefined) {
                    unstakingInstructions[unstakingInstructions.length - 1].allocate =
                        web3_js_1.SystemInstruction.decodeAllocate(instruction);
                }
                else {
                    unstakingInstructions.push({
                        allocate: web3_js_1.SystemInstruction.decodeAllocate(instruction),
                    });
                }
                break;
            case constants_1.ValidInstructionTypesEnum.Assign:
                if (unstakingInstructions.length > 0 &&
                    unstakingInstructions[unstakingInstructions.length - 1].assign === undefined) {
                    unstakingInstructions[unstakingInstructions.length - 1].assign = web3_js_1.SystemInstruction.decodeAssign(instruction);
                }
                else {
                    unstakingInstructions.push({
                        assign: web3_js_1.SystemInstruction.decodeAssign(instruction),
                    });
                }
                break;
            case constants_1.ValidInstructionTypesEnum.Split:
                if (unstakingInstructions.length > 0 &&
                    unstakingInstructions[unstakingInstructions.length - 1].split === undefined) {
                    unstakingInstructions[unstakingInstructions.length - 1].split = web3_js_1.StakeInstruction.decodeSplit(instruction);
                }
                else {
                    unstakingInstructions.push({
                        split: web3_js_1.StakeInstruction.decodeSplit(instruction),
                    });
                }
                break;
            case constants_1.ValidInstructionTypesEnum.StakingDeactivate:
                if (unstakingInstructions.length > 0 &&
                    unstakingInstructions[unstakingInstructions.length - 1].deactivate === undefined) {
                    unstakingInstructions[unstakingInstructions.length - 1].deactivate =
                        web3_js_1.StakeInstruction.decodeDeactivate(instruction);
                }
                else {
                    unstakingInstructions.push({
                        deactivate: web3_js_1.StakeInstruction.decodeDeactivate(instruction),
                    });
                }
                break;
            case constants_1.ValidInstructionTypesEnum.Transfer:
                if (unstakingInstructions.length > 0 &&
                    unstakingInstructions[unstakingInstructions.length - 1].transfer === undefined) {
                    unstakingInstructions[unstakingInstructions.length - 1].transfer =
                        web3_js_1.SystemInstruction.decodeTransfer(instruction);
                }
                else {
                    unstakingInstructions.push({
                        transfer: web3_js_1.SystemInstruction.decodeTransfer(instruction),
                    });
                }
                break;
        }
    }
    for (const unstakingInstruction of unstakingInstructions) {
        validateUnstakingInstructions(unstakingInstruction);
        const stakingDeactivate = {
            type: constants_1.InstructionBuilderTypes.StakingDeactivate,
            params: {
                fromAddress: unstakingInstruction.deactivate?.authorizedPubkey.toString() || '',
                stakingAddress: unstakingInstruction.split?.stakePubkey.toString() ||
                    unstakingInstruction.deactivate?.stakePubkey.toString() ||
                    '',
                amount: unstakingInstruction.split?.lamports.toString(),
                unstakingAddress: unstakingInstruction.split?.splitStakePubkey.toString(),
                isMarinade: unstakingInstruction.deactivate === undefined,
                recipients: unstakingInstruction.deactivate === undefined
                    ? [
                        {
                            address: unstakingInstruction.transfer?.toPubkey.toString() || '',
                            amount: unstakingInstruction.transfer?.lamports.toString() || '',
                        },
                    ]
                    : undefined,
            },
        };
        instructionData.push(stakingDeactivate);
    }
    return instructionData;
}
function validateUnstakingInstructions(unstakingInstructions) {
    if (!unstakingInstructions.deactivate) {
        if (unstakingInstructions.transfer &&
            !unstakingInstructions.allocate &&
            !unstakingInstructions.assign &&
            !unstakingInstructions.split) {
            return;
        }
        throw new sdk_core_1.NotSupported('Invalid deactivate stake transaction, missing deactivate stake account instruction');
    }
    else if (unstakingInstructions.allocate ||
        unstakingInstructions.assign ||
        unstakingInstructions.split ||
        unstakingInstructions.transfer) {
        if (!unstakingInstructions.allocate) {
            throw new sdk_core_1.NotSupported('Invalid partial deactivate stake transaction, missing allocate unstake account instruction');
        }
        else if (!unstakingInstructions.assign) {
            throw new sdk_core_1.NotSupported('Invalid partial deactivate stake transaction, missing assign unstake account instruction');
        }
        else if (!unstakingInstructions.split) {
            throw new sdk_core_1.NotSupported('Invalid partial deactivate stake transaction, missing split stake account instruction');
        }
        else if (unstakingInstructions.allocate.accountPubkey.toString() !== unstakingInstructions.assign.accountPubkey.toString()) {
            throw new sdk_core_1.NotSupported('Invalid partial deactivate stake transaction, must allocate and assign the same public key');
        }
        else if (unstakingInstructions.allocate.space !== web3_js_1.StakeProgram.space) {
            throw new sdk_core_1.NotSupported(`Invalid partial deactivate stake transaction, unstaking account must allocate ${web3_js_1.StakeProgram.space} bytes`);
        }
        else if (unstakingInstructions.assign.programId.toString() !== web3_js_1.StakeProgram.programId.toString()) {
            throw new sdk_core_1.NotSupported('Invalid partial deactivate stake transaction, the unstake account must be assigned to the Stake Program');
        }
        else if (unstakingInstructions.allocate.accountPubkey.toString() !==
            unstakingInstructions.split.splitStakePubkey.toString()) {
            throw new sdk_core_1.NotSupported('Invalid partial deactivate stake transaction, must allocate the unstaking account');
        }
        else if (unstakingInstructions.split.stakePubkey.toString() === unstakingInstructions.split.splitStakePubkey.toString()) {
            throw new sdk_core_1.NotSupported('Invalid partial deactivate stake transaction, the unstaking account must be different from the Stake Account');
        }
        else if (!unstakingInstructions.transfer) {
            throw new sdk_core_1.NotSupported('Invalid partial deactivate stake transaction, missing funding of unstake address instruction');
        }
    }
}
/**
 * Parses Solana instructions to create staking  withdraw tx instructions params
 * Only supports Nonce, StakingWithdraw, and Memo Solana instructions
 *
 * @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
 * @returns {InstructionParams[]} An array containing instruction params for staking withdraw tx
 */
function parseStakingWithdrawInstructions(instructions) {
    const instructionData = [];
    for (const instruction of instructions) {
        const type = (0, utils_1.getInstructionType)(instruction);
        switch (type) {
            case constants_1.ValidInstructionTypesEnum.AdvanceNonceAccount:
                const advanceNonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instruction);
                const nonce = {
                    type: constants_1.InstructionBuilderTypes.NonceAdvance,
                    params: {
                        walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
                        authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
                    },
                };
                instructionData.push(nonce);
                break;
            case constants_1.ValidInstructionTypesEnum.Memo:
                const memo = {
                    type: constants_1.InstructionBuilderTypes.Memo,
                    params: { memo: instruction.data.toString() },
                };
                instructionData.push(memo);
                break;
            case constants_1.ValidInstructionTypesEnum.StakingWithdraw:
                const withdrawInstruction = web3_js_1.StakeInstruction.decodeWithdraw(instruction);
                const stakingWithdraw = {
                    type: constants_1.InstructionBuilderTypes.StakingWithdraw,
                    params: {
                        fromAddress: withdrawInstruction.authorizedPubkey.toString(),
                        stakingAddress: withdrawInstruction.stakePubkey.toString(),
                        amount: withdrawInstruction.lamports.toString(),
                    },
                };
                instructionData.push(stakingWithdraw);
                break;
        }
    }
    return instructionData;
}
/**
 * Get the memo object from instructions if it exists
 *
 * @param {TransactionInstruction[]} instructions - the array of supported Solana instructions to be parsed
 * @param {Record<string, number>} instructionIndexes - the instructions indexes of the current transaction
 * @returns {Memo | undefined} - memo object or undefined
 */
function getMemo(instructions, instructionIndexes) {
    const instructionsLength = Object.keys(instructionIndexes).length;
    if (instructions.length === instructionsLength && instructions[instructionIndexes.Memo]) {
        return {
            type: constants_1.InstructionBuilderTypes.Memo,
            params: { memo: instructions[instructionIndexes.Memo].data.toString() },
        };
    }
}
const ataInitInstructionKeysIndexes = {
    PayerAddress: 0,
    ATAAddress: 1,
    OwnerAddress: 2,
    MintAddress: 3,
};
const closeAtaInstructionKeysIndexes = {
    AccountAddress: 0,
    DestinationAddress: 1,
    AuthorityAddress: 2,
};
/**
 * Parses Solana instructions to initialize associated token account tx instructions params
 *
 * @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
 * @returns {InstructionParams[]} An array containing instruction params for Send tx
 */
function parseAtaInitInstructions(instructions) {
    const instructionData = [];
    let memo;
    for (const instruction of instructions) {
        const type = (0, utils_1.getInstructionType)(instruction);
        switch (type) {
            case constants_1.ValidInstructionTypesEnum.Memo:
                memo = { type: constants_1.InstructionBuilderTypes.Memo, params: { memo: instruction.data.toString() } };
                break;
            case constants_1.ValidInstructionTypesEnum.AdvanceNonceAccount:
                const advanceNonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instruction);
                const nonce = {
                    type: constants_1.InstructionBuilderTypes.NonceAdvance,
                    params: {
                        walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
                        authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
                    },
                };
                instructionData.push(nonce);
                break;
            case constants_1.ValidInstructionTypesEnum.InitializeAssociatedTokenAccount:
                const mintAddress = instruction.keys[ataInitInstructionKeysIndexes.MintAddress].pubkey.toString();
                const tokenName = findTokenName(mintAddress);
                const ataInit = {
                    type: constants_1.InstructionBuilderTypes.CreateAssociatedTokenAccount,
                    params: {
                        mintAddress,
                        ataAddress: instruction.keys[ataInitInstructionKeysIndexes.ATAAddress].pubkey.toString(),
                        ownerAddress: instruction.keys[ataInitInstructionKeysIndexes.OwnerAddress].pubkey.toString(),
                        payerAddress: instruction.keys[ataInitInstructionKeysIndexes.PayerAddress].pubkey.toString(),
                        tokenName,
                    },
                };
                instructionData.push(ataInit);
                break;
            default:
                throw new sdk_core_1.NotSupported('Invalid transaction, instruction type not supported: ' + (0, utils_1.getInstructionType)(instruction));
        }
    }
    if (memo) {
        instructionData.push(memo);
    }
    return instructionData;
}
const ataCloseInstructionKeysIndexes = {
    AccountAddress: 0,
    DestinationAddress: 1,
    AuthorityAddress: 2,
};
/**
 * Parses Solana instructions to close associated token account tx instructions params
 *
 * @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
 * @returns {InstructionParams[]} An array containing instruction params for Send tx
 */
function parseAtaCloseInstructions(instructions) {
    const instructionData = [];
    for (const instruction of instructions) {
        const type = (0, utils_1.getInstructionType)(instruction);
        switch (type) {
            case constants_1.ValidInstructionTypesEnum.AdvanceNonceAccount:
                const advanceNonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instruction);
                const nonce = {
                    type: constants_1.InstructionBuilderTypes.NonceAdvance,
                    params: {
                        walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
                        authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
                    },
                };
                instructionData.push(nonce);
                break;
            case constants_1.ValidInstructionTypesEnum.CloseAssociatedTokenAccount:
                const ataClose = {
                    type: constants_1.InstructionBuilderTypes.CloseAssociatedTokenAccount,
                    params: {
                        accountAddress: instruction.keys[ataCloseInstructionKeysIndexes.AccountAddress].pubkey.toString(),
                        destinationAddress: instruction.keys[ataCloseInstructionKeysIndexes.DestinationAddress].pubkey.toString(),
                        authorityAddress: instruction.keys[ataCloseInstructionKeysIndexes.AuthorityAddress].pubkey.toString(),
                    },
                };
                instructionData.push(ataClose);
                break;
            default:
                throw new sdk_core_1.NotSupported('Invalid transaction, instruction type not supported: ' + (0, utils_1.getInstructionType)(instruction));
        }
    }
    return instructionData;
}
/**
 * Parses Solana instructions to authorized staking account params
 * Only supports Nonce, Authorize instructions
 *
 * @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
 * @returns {InstructionParams[]} An array containing instruction params for staking authorize tx
 */
function parseStakingAuthorizeInstructions(instructions) {
    const instructionData = [];
    for (const instruction of instructions) {
        const type = (0, utils_1.getInstructionType)(instruction);
        switch (type) {
            case constants_1.ValidInstructionTypesEnum.AdvanceNonceAccount:
                const advanceNonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instruction);
                const nonce = {
                    type: constants_1.InstructionBuilderTypes.NonceAdvance,
                    params: {
                        walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
                        authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
                    },
                };
                instructionData.push(nonce);
                break;
            case constants_1.ValidInstructionTypesEnum.Memo:
                const memo = { type: constants_1.InstructionBuilderTypes.Memo, params: { memo: instruction.data.toString() } };
                instructionData.push(memo);
                break;
            case constants_1.ValidInstructionTypesEnum.Authorize:
                const authorize = web3_js_1.StakeInstruction.decodeAuthorize(instruction);
                instructionData.push({
                    type: constants_1.InstructionBuilderTypes.StakingAuthorize,
                    params: {
                        stakingAddress: authorize.stakePubkey.toString(),
                        oldAuthorizeAddress: authorize.authorizedPubkey.toString(),
                        newAuthorizeAddress: authorize.newAuthorizedPubkey.toString(),
                        newWithdrawAddress: authorize.custodianPubkey?.toString() || '',
                    },
                });
                break;
        }
    }
    return instructionData;
}
/**
 * Parses Solana instructions to authorized staking account params
 * Only supports Nonce, Authorize instructions
 *
 * @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
 * @returns {InstructionParams[]} An array containing instruction params for staking authorize tx
 */
function parseStakingAuthorizeRawInstructions(instructions) {
    const instructionData = [];
    (0, assert_1.default)(instructions.length === 2, 'Invalid number of instructions');
    const advanceNonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instructions[0]);
    const nonce = {
        type: constants_1.InstructionBuilderTypes.NonceAdvance,
        params: {
            walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
            authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
        },
    };
    instructionData.push(nonce);
    const authorize = instructions[1];
    (0, assert_1.default)(authorize.keys.length === 5, 'Invalid number of keys in authorize instruction');
    instructionData.push({
        type: constants_1.InstructionBuilderTypes.StakingAuthorize,
        params: {
            stakingAddress: authorize.keys[0].pubkey.toString(),
            oldAuthorizeAddress: authorize.keys[2].pubkey.toString(),
            newAuthorizeAddress: authorize.keys[3].pubkey.toString(),
            custodianAddress: authorize.keys[4].pubkey.toString(),
        },
    });
    return instructionData;
}
function findTokenName(mintAddress) {
    let token;
    statics_1.coins.forEach((value, key) => {
        if (value instanceof statics_1.SolCoin && value.tokenAddress === mintAddress) {
            token = value.name;
        }
    });
    (0, assert_1.default)(token);
    return token;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1Y3Rpb25QYXJhbXNGYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9pbnN0cnVjdGlvblBhcmFtc0ZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUErQ0EsNERBNkJDO0FBNUVELGlEQUFxRTtBQUNyRSw2Q0FleUI7QUFFekIsOENBQWdFO0FBQ2hFLDRDQUFnRDtBQUNoRCxvREFBNEI7QUFDNUIsMkNBQStHO0FBaUIvRyxtQ0FBNkM7QUFFN0M7Ozs7OztHQU1HO0FBQ0gsU0FBZ0Isd0JBQXdCLENBQ3RDLElBQXFCLEVBQ3JCLFlBQXNDLEVBQ3RDLFFBQWlCO0lBRWpCLFFBQVEsSUFBSSxFQUFFLENBQUM7UUFDYixLQUFLLDBCQUFlLENBQUMsb0JBQW9CO1lBQ3ZDLE9BQU8sMkJBQTJCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbkQsS0FBSywwQkFBZSxDQUFDLElBQUk7WUFDdkIsT0FBTyxxQkFBcUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM3QyxLQUFLLDBCQUFlLENBQUMsZUFBZTtZQUNsQyxPQUFPLGdDQUFnQyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3hELEtBQUssMEJBQWUsQ0FBQyxpQkFBaUI7WUFDcEMsT0FBTyxrQ0FBa0MsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDcEUsS0FBSywwQkFBZSxDQUFDLGVBQWU7WUFDbEMsT0FBTyxnQ0FBZ0MsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN4RCxLQUFLLDBCQUFlLENBQUMsb0NBQW9DO1lBQ3ZELE9BQU8sd0JBQXdCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDaEQsS0FBSywwQkFBZSxDQUFDLDJCQUEyQjtZQUM5QyxPQUFPLHlCQUF5QixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2pELEtBQUssMEJBQWUsQ0FBQyxnQkFBZ0I7WUFDbkMsT0FBTyxpQ0FBaUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN6RCxL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Q0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFO1lBQ25ELG1CQUFtQixFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRTtZQUN4RCxtQkFBbUIsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUU7WUFDeEQsZ0JBQWdCLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFO1NBQ3REO0tBQ0YsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxlQUFlLENBQUM7QUFDekIsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFDLFdBQW1CO0lBQ3hDLElBQUksS0FBeUIsQ0FBQztJQUU5QixlQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQzNCLElBQUksS0FBSyxZQUFZLGlCQUFPLElBQUksS0FBSyxDQUFDLFlBQVksS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNuRSxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztRQUNyQixDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFBLGdCQUFNLEVBQUMsS0FBSyxDQUFDLENBQUM7SUFFZCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZWNvZGVUcmFuc2ZlckNoZWNrZWRJbnN0cnVjdGlvbiB9IGZyb20gJ0Bzb2xhbmEvc3BsLXRva2VuJztcbmltcG9ydCB7XG4gIEFsbG9jYXRlUGFyYW1zLFxuICBBc3NpZ25QYXJhbXMsXG4gIEF1dGhvcml6ZVN0YWtlUGFyYW1zLFxuICBDcmVhdGVBY2NvdW50UGFyYW1zLFxuICBEZWFjdGl2YXRlU3Rha2VQYXJhbXMsXG4gIERlY29kZWRUcmFuc2Zlckluc3RydWN0aW9uLFxuICBEZWxlZ2F0ZVN0YWtlUGFyYW1zLFxuICBJbml0aWFsaXplU3Rha2VQYXJhbXMsXG4gIFNwbGl0U3Rha2VQYXJhbXMsXG4gIFN0YWtlSW5zdHJ1Y3Rpb24sXG4gIFN0YWtlUHJvZ3JhbSxcbiAgU3lzdGVtSW5zdHJ1Y3Rpb24sXG4gIFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24sXG4gIENvbXB1dGVCdWRnZXRJbnN0cnVjdGlvbixcbn0gZnJvbSAnQHNvbGFuYS93ZWIzLmpzJztcblxuaW1wb3J0IHsgTm90U3VwcG9ydGVkLCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgY29pbnMsIFNvbENvaW4gfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcywgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bSwgd2FsbGV0SW5pdEluc3RydWN0aW9uSW5kZXhlcyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7XG4gIEF0YUNsb3NlLFxuICBBdGFJbml0LFxuICBJbnN0cnVjdGlvblBhcmFtcyxcbiAgTWVtbyxcbiAgTm9uY2UsXG4gIFN0YWtpbmdBY3RpdmF0ZSxcbiAgU3Rha2luZ0F1dGhvcml6ZSxcbiAgU3Rha2luZ0RlYWN0aXZhdGUsXG4gIFN0YWtpbmdEZWxlZ2F0ZSxcbiAgU3Rha2luZ1dpdGhkcmF3LFxuICBUb2tlblRyYW5zZmVyLFxuICBUcmFuc2ZlcixcbiAgV2FsbGV0SW5pdCxcbiAgU2V0UHJpb3JpdHlGZWUsXG59IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgZ2V0SW5zdHJ1Y3Rpb25UeXBlIH0gZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogQ29uc3RydWN0IGluc3RydWN0aW9ucyBwYXJhbXMgZnJvbSBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvblR5cGV9IHR5cGUgLSB0aGUgdHJhbnNhY3Rpb24gdHlwZVxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIHNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zdHJ1Y3Rpb25QYXJhbXNGYWN0b3J5KFxuICB0eXBlOiBUcmFuc2FjdGlvblR5cGUsXG4gIGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdLFxuICBjb2luTmFtZT86IHN0cmluZ1xuKTogSW5zdHJ1Y3Rpb25QYXJhbXNbXSB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uOlxuICAgICAgcmV0dXJuIHBhcnNlV2FsbGV0SW5pdEluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMpO1xuICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlNlbmQ6XG4gICAgICByZXR1cm4gcGFyc2VTZW5kSW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucyk7XG4gICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0FjdGl2YXRlOlxuICAgICAgcmV0dXJuIHBhcnNlU3Rha2luZ0FjdGl2YXRlSW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucyk7XG4gICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0RlYWN0aXZhdGU6XG4gICAgICByZXR1cm4gcGFyc2VTdGFraW5nRGVhY3RpdmF0ZUluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMsIGNvaW5OYW1lKTtcbiAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nV2l0aGRyYXc6XG4gICAgICByZXR1cm4gcGFyc2VTdGFraW5nV2l0aGRyYXdJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zKTtcbiAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5Bc3NvY2lhdGVkVG9rZW5BY2NvdW50SW5pdGlhbGl6YXRpb246XG4gICAgICByZXR1cm4gcGFyc2VBdGFJbml0SW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucyk7XG4gICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuQ2xvc2VBc3NvY2lhdGVkVG9rZW5BY2NvdW50OlxuICAgICAgcmV0dXJuIHBhcnNlQXRhQ2xvc2VJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zKTtcbiAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQXV0aG9yaXplOlxuICAgICAgcmV0dXJuIHBhcnNlU3Rha2luZ0F1dGhvcml6ZUluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMpO1xuICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBdXRob3JpemVSYXc6XG4gICAgICByZXR1cm4gcGFyc2VTdGFraW5nQXV0aG9yaXplUmF3SW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucyk7XG4gICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0RlbGVnYXRlOlxuICAgICAgcmV0dXJuIHBhcnNlU3Rha2luZ0RlbGVnYXRlSW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucyk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ0ludmFsaWQgdHJhbnNhY3Rpb24sIHRyYW5zYWN0aW9uIHR5cGUgbm90IHN1cHBvcnRlZDogJyArIHR5cGUpO1xuICB9XG59XG5cbi8qKlxuICogUGFyc2VzIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gV2FsbGV0IGluaXRpYWxpemF0aW9uIHR4IGluc3RydWN0aW9ucyBwYXJhbXNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gY29udGFpbmluZyBjcmVhdGUgYW5kIGluaXRpYWxpemUgbm9uY2Ugc29sYW5hIGluc3RydWN0aW9uc1xuICogQHJldHVybnMge0luc3RydWN0aW9uUGFyYW1zW119IEFuIGFycmF5IGNvbnRhaW5pbmcgaW5zdHJ1Y3Rpb24gcGFyYW1zIGZvciBXYWxsZXQgaW5pdGlhbGl6YXRpb24gdHhcbiAqL1xuZnVuY3Rpb24gcGFyc2VXYWxsZXRJbml0SW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdKTogQXJyYXk8V2FsbGV0SW5pdCB8IE1lbW8+IHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhOiBBcnJheTxXYWxsZXRJbml0IHwgTWVtbz4gPSBbXTtcbiAgY29uc3QgY3JlYXRlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVDcmVhdGVBY2NvdW50KGluc3RydWN0aW9uc1t3YWxsZXRJbml0SW5zdHJ1Y3Rpb25JbmRleGVzLkNyZWF0ZV0pO1xuICBjb25zdCBub25jZUluaXRJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZU5vbmNlSW5pdGlhbGl6ZShcbiAgICBpbnN0cnVjdGlvbnNbd2FsbGV0SW5pdEluc3RydWN0aW9uSW5kZXhlcy5Jbml0aWFsaXplTm9uY2VBY2NvdW50XVxuICApO1xuXG4gIGNvbnN0IHdhbGxldEluaXQ6IFdhbGxldEluaXQgPSB7XG4gICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3JlYXRlTm9uY2VBY2NvdW50LFxuICAgIHBhcmFtczoge1xuICAgICAgZnJvbUFkZHJlc3M6IGNyZWF0ZUluc3RydWN0aW9uLmZyb21QdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgIG5vbmNlQWRkcmVzczogbm9uY2VJbml0SW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgIGF1dGhBZGRyZXNzOiBub25jZUluaXRJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICBhbW91bnQ6IGNyZWF0ZUluc3RydWN0aW9uLmxhbXBvcnRzLnRvU3RyaW5nKCksXG4gICAgfSxcbiAgfTtcbiAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2god2FsbGV0SW5pdCk7XG5cbiAgY29uc3QgbWVtbyA9IGdldE1lbW8oaW5zdHJ1Y3Rpb25zLCB3YWxsZXRJbml0SW5zdHJ1Y3Rpb25JbmRleGVzKTtcbiAgaWYgKG1lbW8pIHtcbiAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChtZW1vKTtcbiAgfVxuXG4gIHJldHVybiBpbnN0cnVjdGlvbkRhdGE7XG59XG5cbi8qKlxuICogUGFyc2VzIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gU2VuZCB0eCBpbnN0cnVjdGlvbnMgcGFyYW1zXG4gKiBPbmx5IHN1cHBvcnRzIE1lbW8sIFRyYW5zZmVyIGFuZCBBZHZhbmNlIE5vbmNlIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gYW4gYXJyYXkgb2Ygc3VwcG9ydGVkIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtcyBmb3IgU2VuZCB0eFxuICovXG5mdW5jdGlvbiBwYXJzZVNlbmRJbnN0cnVjdGlvbnMoXG4gIGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdXG4pOiBBcnJheTxOb25jZSB8IE1lbW8gfCBUcmFuc2ZlciB8IFRva2VuVHJhbnNmZXIgfCBBdGFJbml0IHwgQXRhQ2xvc2UgfCBTZXRQcmlvcml0eUZlZT4ge1xuICBjb25zdCBpbnN0cnVjdGlvbkRhdGE6IEFycmF5PE5vbmNlIHwgTWVtbyB8IFRyYW5zZmVyIHwgVG9rZW5UcmFuc2ZlciB8IEF0YUluaXQgfCBBdGFDbG9zZSB8IFNldFByaW9yaXR5RmVlPiA9IFtdO1xuICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgIGNvbnN0IHR5cGUgPSBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLk1lbW86XG4gICAgICAgIGNvbnN0IG1lbW86IE1lbW8gPSB7IHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk1lbW8sIHBhcmFtczogeyBtZW1vOiBpbnN0cnVjdGlvbi5kYXRhLnRvU3RyaW5nKCkgfSB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChtZW1vKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQWR2YW5jZU5vbmNlQWNjb3VudDpcbiAgICAgICAgY29uc3QgYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVOb25jZUFkdmFuY2UoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBub25jZTogTm9uY2UgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChub25jZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlRyYW5zZmVyOlxuICAgICAgICBjb25zdCB0cmFuc2Zlckluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlVHJhbnNmZXIoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCB0cmFuc2ZlcjogVHJhbnNmZXIgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuVHJhbnNmZXIsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBmcm9tQWRkcmVzczogdHJhbnNmZXJJbnN0cnVjdGlvbi5mcm9tUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0b0FkZHJlc3M6IHRyYW5zZmVySW5zdHJ1Y3Rpb24udG9QdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGFtb3VudDogdHJhbnNmZXJJbnN0cnVjdGlvbi5sYW1wb3J0cy50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKHRyYW5zZmVyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uVG9rZW5UcmFuc2ZlcjpcbiAgICAgICAgY29uc3QgdG9rZW5UcmFuc2Zlckluc3RydWN0aW9uID0gZGVjb2RlVHJhbnNmZXJDaGVja2VkSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCB0b2tlbk5hbWUgPSBmaW5kVG9rZW5OYW1lKHRva2VuVHJhbnNmZXJJbnN0cnVjdGlvbi5rZXlzLm1pbnQucHVia2V5LnRvU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCB0b2tlblRyYW5zZmVyOiBUb2tlblRyYW5zZmVyID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlRva2VuVHJhbnNmZXIsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBmcm9tQWRkcmVzczogdG9rZW5UcmFuc2Zlckluc3RydWN0aW9uLmtleXMub3duZXIucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0b0FkZHJlc3M6IHRva2VuVHJhbnNmZXJJbnN0cnVjdGlvbi5rZXlzLmRlc3RpbmF0aW9uLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYW1vdW50OiB0b2tlblRyYW5zZmVySW5zdHJ1Y3Rpb24uZGF0YS5hbW91bnQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHRva2VuTmFtZSxcbiAgICAgICAgICAgIHNvdXJjZUFkZHJlc3M6IHRva2VuVHJhbnNmZXJJbnN0cnVjdGlvbi5rZXlzLnNvdXJjZS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaCh0b2tlblRyYW5zZmVyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uSW5pdGlhbGl6ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQ6XG4gICAgICAgIGNvbnN0IG1pbnRBZGRyZXNzID0gaW5zdHJ1Y3Rpb24ua2V5c1thdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5NaW50QWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IG1pbnRUb2tlbk5hbWUgPSBmaW5kVG9rZW5OYW1lKG1pbnRBZGRyZXNzKTtcblxuICAgICAgICBjb25zdCBhdGFJbml0OiBBdGFJbml0ID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgICAgIGF0YUFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuQVRBQWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBvd25lckFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuT3duZXJBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHBheWVyQWRkcmVzczogaW5zdHJ1Y3Rpb24ua2V5c1thdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5QYXllckFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgdG9rZW5OYW1lOiBtaW50VG9rZW5OYW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKGF0YUluaXQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5DbG9zZUFzc29jaWF0ZWRUb2tlbkFjY291bnQ6XG4gICAgICAgIGNvbnN0IGFjY291bnRBZGRyZXNzID0gaW5zdHJ1Y3Rpb24ua2V5c1tjbG9zZUF0YUluc3RydWN0aW9uS2V5c0luZGV4ZXMuQWNjb3VudEFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpO1xuICAgICAgICBjb25zdCBkZXN0aW5hdGlvbkFkZHJlc3MgPVxuICAgICAgICAgIGluc3RydWN0aW9uLmtleXNbY2xvc2VBdGFJbnN0cnVjdGlvbktleXNJbmRleGVzLkRlc3RpbmF0aW9uQWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IGF1dGhvcml0eUFkZHJlc3MgPSBpbnN0cnVjdGlvbi5rZXlzW2Nsb3NlQXRhSW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5BdXRob3JpdHlBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKTtcblxuICAgICAgICBjb25zdCBhdGFDbG9zZTogQXRhQ2xvc2UgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ2xvc2VBc3NvY2lhdGVkVG9rZW5BY2NvdW50LFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgYWNjb3VudEFkZHJlc3MsXG4gICAgICAgICAgICBkZXN0aW5hdGlvbkFkZHJlc3MsXG4gICAgICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKGF0YUNsb3NlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uU2V0UHJpb3JpdHlGZWU6XG4gICAgICAgIGNvbnN0IHNldENvbXB1dGVVbml0UHJpY2VQYXJhbXMgPSBDb21wdXRlQnVkZ2V0SW5zdHJ1Y3Rpb24uZGVjb2RlU2V0Q29tcHV0ZVVuaXRQcmljZShpbnN0cnVjdGlvbik7XG4gICAgICAgIGNvbnN0IHNldFByaW9yaXR5RmVlOiBTZXRQcmlvcml0eUZlZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TZXRQcmlvcml0eUZlZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIGZlZTogc2V0Q29tcHV0ZVVuaXRQcmljZVBhcmFtcy5taWNyb0xhbXBvcnRzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKHNldFByaW9yaXR5RmVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgICAgICdJbnZhbGlkIHRyYW5zYWN0aW9uLCBpbnN0cnVjdGlvbiB0eXBlIG5vdCBzdXBwb3J0ZWQ6ICcgKyBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pXG4gICAgICAgICk7XG4gICAgfVxuICB9XG4gIHJldHVybiBpbnN0cnVjdGlvbkRhdGE7XG59XG5cbi8qKlxuICogUGFyc2VzIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gY3JlYXRlIHN0YWtpbmcgdHggYW5kIGRlbGVnYXRlIHR4IGluc3RydWN0aW9ucyBwYXJhbXNcbiAqIE9ubHkgc3VwcG9ydHMgTm9uY2UsIFN0YWtpbmdBY3RpdmF0ZSBhbmQgTWVtbyBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIGFuIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXMgZm9yIHN0YWtpbmcgYWN0aXZhdGUgdHhcbiAqL1xuZnVuY3Rpb24gcGFyc2VTdGFraW5nQWN0aXZhdGVJbnN0cnVjdGlvbnMoXG4gIGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdXG4pOiBBcnJheTxOb25jZSB8IFN0YWtpbmdBY3RpdmF0ZSB8IE1lbW8+IHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhOiBBcnJheTxOb25jZSB8IFN0YWtpbmdBY3RpdmF0ZSB8IE1lbW8+ID0gW107XG4gIGNvbnN0IHN0YWtpbmdJbnN0cnVjdGlvbnMgPSB7fSBhcyBTdGFraW5nSW5zdHJ1Y3Rpb25zO1xuICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgIGNvbnN0IHR5cGUgPSBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkFkdmFuY2VOb25jZUFjY291bnQ6XG4gICAgICAgIGNvbnN0IGFkdmFuY2VOb25jZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VBZHZhbmNlKGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3Qgbm9uY2U6IE5vbmNlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk5vbmNlQWR2YW5jZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobm9uY2UpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLk1lbW86XG4gICAgICAgIGNvbnN0IG1lbW86IE1lbW8gPSB7IHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk1lbW8sIHBhcmFtczogeyBtZW1vOiBpbnN0cnVjdGlvbi5kYXRhLnRvU3RyaW5nKCkgfSB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChtZW1vKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5DcmVhdGU6XG4gICAgICAgIHN0YWtpbmdJbnN0cnVjdGlvbnMuY3JlYXRlID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlQ3JlYXRlQWNjb3VudChpbnN0cnVjdGlvbik7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uU3Rha2luZ0luaXRpYWxpemU6XG4gICAgICAgIHN0YWtpbmdJbnN0cnVjdGlvbnMuaW5pdGlhbGl6ZSA9IFN0YWtlSW5zdHJ1Y3Rpb24uZGVjb2RlSW5pdGlhbGl6ZShpbnN0cnVjdGlvbik7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uU3Rha2luZ0RlbGVnYXRlOlxuICAgICAgICBzdGFraW5nSW5zdHJ1Y3Rpb25zLmRlbGVnYXRlID0gU3Rha2VJbnN0cnVjdGlvbi5kZWNvZGVEZWxlZ2F0ZShpbnN0cnVjdGlvbik7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlU3Rha2luZ0luc3RydWN0aW9ucyhzdGFraW5nSW5zdHJ1Y3Rpb25zKTtcbiAgY29uc3Qgc3Rha2luZ0FjdGl2YXRlOiBTdGFraW5nQWN0aXZhdGUgPSB7XG4gICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ0FjdGl2YXRlLFxuICAgIHBhcmFtczoge1xuICAgICAgZnJvbUFkZHJlc3M6IHN0YWtpbmdJbnN0cnVjdGlvbnMuY3JlYXRlPy5mcm9tUHVia2V5LnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICBzdGFraW5nQWRkcmVzczogc3Rha2luZ0luc3RydWN0aW9ucy5pbml0aWFsaXplPy5zdGFrZVB1YmtleS50b1N0cmluZygpIHx8ICcnLFxuICAgICAgYW1vdW50OiBzdGFraW5nSW5zdHJ1Y3Rpb25zLmNyZWF0ZT8ubGFtcG9ydHMudG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgIHZhbGlkYXRvcjpcbiAgICAgICAgc3Rha2luZ0luc3RydWN0aW9ucy5kZWxlZ2F0ZT8udm90ZVB1YmtleS50b1N0cmluZygpIHx8XG4gICAgICAgIHN0YWtpbmdJbnN0cnVjdGlvbnMuaW5pdGlhbGl6ZT8uYXV0aG9yaXplZC5zdGFrZXIudG9TdHJpbmcoKSB8fFxuICAgICAgICAnJyxcbiAgICAgIGlzTWFyaW5hZGU6IHN0YWtpbmdJbnN0cnVjdGlvbnMuZGVsZWdhdGUgPT09IHVuZGVmaW5lZCxcbiAgICB9LFxuICB9O1xuICBpbnN0cnVjdGlvbkRhdGEucHVzaChzdGFraW5nQWN0aXZhdGUpO1xuXG4gIHJldHVybiBpbnN0cnVjdGlvbkRhdGE7XG59XG4vKipcbiAqIFBhcnNlcyBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGNyZWF0ZSBkZWxlZ2F0ZSB0eFxuICogT25seSBzdXBwb3J0cyBOb25jZSwgU3Rha2luZ0RlbGVnYXRlXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIGFuIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXMgZm9yIHN0YWtpbmcgZGVsZWdhdGUgdHhcbiAqL1xuZnVuY3Rpb24gcGFyc2VTdGFraW5nRGVsZWdhdGVJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10pOiBBcnJheTxOb25jZSB8IFN0YWtpbmdEZWxlZ2F0ZT4ge1xuICBjb25zdCBpbnN0cnVjdGlvbkRhdGE6IEFycmF5PE5vbmNlIHwgU3Rha2luZ0RlbGVnYXRlPiA9IFtdO1xuICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgIGNvbnN0IHR5cGUgPSBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkFkdmFuY2VOb25jZUFjY291bnQ6XG4gICAgICAgIGNvbnN0IGFkdmFuY2VOb25jZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VBZHZhbmNlKGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3Qgbm9uY2U6IE5vbmNlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk5vbmNlQWR2YW5jZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobm9uY2UpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlN0YWtpbmdEZWxlZ2F0ZTpcbiAgICAgICAgY29uc3Qgc3Rha2luZ0RlbGVnYXRlUGFyYW1zID0gU3Rha2VJbnN0cnVjdGlvbi5kZWNvZGVEZWxlZ2F0ZShpbnN0cnVjdGlvbik7XG4gICAgICAgIGNvbnN0IHN0YWtpbmdEZWxlZ2F0ZTogU3Rha2luZ0RlbGVnYXRlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdEZWxlZ2F0ZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIGZyb21BZGRyZXNzOiBzdGFraW5nRGVsZWdhdGVQYXJhbXMuYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpIHx8ICcnLFxuICAgICAgICAgICAgc3Rha2luZ0FkZHJlc3M6IHN0YWtpbmdEZWxlZ2F0ZVBhcmFtcy5zdGFrZVB1YmtleS50b1N0cmluZygpIHx8ICcnLFxuICAgICAgICAgICAgdmFsaWRhdG9yOiBzdGFraW5nRGVsZWdhdGVQYXJhbXMudm90ZVB1YmtleS50b1N0cmluZygpIHx8ICcnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKHN0YWtpbmdEZWxlZ2F0ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaW5zdHJ1Y3Rpb25EYXRhO1xufVxuXG5pbnRlcmZhY2UgU3Rha2luZ0luc3RydWN0aW9ucyB7XG4gIGNyZWF0ZT86IENyZWF0ZUFjY291bnRQYXJhbXM7XG4gIGluaXRpYWxpemU/OiBJbml0aWFsaXplU3Rha2VQYXJhbXM7XG4gIGRlbGVnYXRlPzogRGVsZWdhdGVTdGFrZVBhcmFtcztcbiAgYXV0aG9yaXplPzogQXV0aG9yaXplU3Rha2VQYXJhbXNbXTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTdGFraW5nSW5zdHJ1Y3Rpb25zKHN0YWtpbmdJbnN0cnVjdGlvbnM6IFN0YWtpbmdJbnN0cnVjdGlvbnMpIHtcbiAgaWYgKCFzdGFraW5nSW5zdHJ1Y3Rpb25zLmNyZWF0ZSkge1xuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ0ludmFsaWQgc3Rha2luZyBhY3RpdmF0ZSB0cmFuc2FjdGlvbiwgbWlzc2luZyBjcmVhdGUgc3Rha2UgYWNjb3VudCBpbnN0cnVjdGlvbicpO1xuICB9XG5cbiAgaWYgKCFzdGFraW5nSW5zdHJ1Y3Rpb25zLmluaXRpYWxpemUgJiYgc3Rha2luZ0luc3RydWN0aW9ucy5kZWxlZ2F0ZSkge1xuICAgIHJldHVybjtcbiAgfSBlbHNlIGlmICghc3Rha2luZ0luc3RydWN0aW9ucy5kZWxlZ2F0ZSAmJiBzdGFraW5nSW5zdHJ1Y3Rpb25zLmluaXRpYWxpemUpIHtcbiAgICByZXR1cm47XG4gIH0gZWxzZSBpZiAoIXN0YWtpbmdJbnN0cnVjdGlvbnMuZGVsZWdhdGUgJiYgIXN0YWtpbmdJbnN0cnVjdGlvbnMuaW5pdGlhbGl6ZSkge1xuICAgIC8vIElmIGJvdGggYXJlIG1pc3Npbmcgc29tZXRoaW5nIGlzIHdyb25nXG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICdJbnZhbGlkIHN0YWtpbmcgYWN0aXZhdGUgdHJhbnNhY3Rpb24sIG1pc3NpbmcgaW5pdGlhbGl6ZSBzdGFrZSBhY2NvdW50L2RlbGVnYXRlIGluc3RydWN0aW9uJ1xuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZXMgU29sYW5hIGluc3RydWN0aW9ucyB0byBjcmVhdGUgZGVhY3RpdmF0ZSBzdGFrZSB0eCBpbnN0cnVjdGlvbnMgcGFyYW1zLiBTdXBwb3J0cyBmdWxsIHN0YWtlXG4gKiBhY2NvdW50IGRlYWN0aXZhdGlvbiBhbmQgcGFydGlhbCBzdGFrZSBhY2NvdW50IGRlYWN0aXZhdGlvbi5cbiAqXG4gKiBXaGVuIHBhcnRpYWxseSBkZWFjdGl2YXRpbmcgYSBzdGFrZSBhY2NvdW50IHRoaXMgbWV0aG9kIGV4cGVjdHMgdGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnM6IEFsbG9jYXRlLFxuICogdG8gYWxsb2NhdGUgYSBuZXcgc3Rha2luZyBhY2NvdW50LCBBc3NpZ24sIHRvIGFzc2lnbiB0aGUgbmV3bHkgY3JlYXRlZCBzdGFraW5nIGFjY291bnQgdG8gdGhlXG4gKiBTdGFrZSBQcm9ncmFtLCBTcGxpdCwgdG8gc3BsaXQgdGhlIGN1cnJlbnQgc3Rha2UgYWNjb3VudCwgYW5kIFN0YWtpbmdEZWFjdGl2YXRlIHRvIGRlYWN0aXZhdGUgdGhlXG4gKiBuZXdseSBjcmVhdGVkIHN0YWtlIGFjY291bnQuXG4gKlxuICogU3VwcG9ydHMgTm9uY2UsIFN0YWtpbmdEZWFjdGl2YXRlLCBNZW1vLCBBbGxvY2F0ZSwgQXNzaWduLCBhbmQgU3BsaXQgU29sYW5hIGluc3RydWN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gYW4gYXJyYXkgb2Ygc3VwcG9ydGVkIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtcyBmb3Igc3Rha2luZyBkZWFjdGl2YXRlIHR4XG4gKi9cbmZ1bmN0aW9uIHBhcnNlU3Rha2luZ0RlYWN0aXZhdGVJbnN0cnVjdGlvbnMoXG4gIGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdLFxuICBjb2luTmFtZT86IHN0cmluZ1xuKTogQXJyYXk8Tm9uY2UgfCBTdGFraW5nRGVhY3RpdmF0ZSB8IE1lbW8+IHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhOiBBcnJheTxOb25jZSB8IFN0YWtpbmdEZWFjdGl2YXRlIHwgTWVtbz4gPSBbXTtcbiAgY29uc3QgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zOiBVbnN0YWtpbmdJbnN0cnVjdGlvbnNbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgIGNvbnN0IHR5cGUgPSBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkFkdmFuY2VOb25jZUFjY291bnQ6XG4gICAgICAgIGNvbnN0IGFkdmFuY2VOb25jZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VBZHZhbmNlKGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3Qgbm9uY2U6IE5vbmNlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk5vbmNlQWR2YW5jZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobm9uY2UpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLk1lbW86XG4gICAgICAgIGNvbnN0IG1lbW86IE1lbW8gPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTWVtbyxcbiAgICAgICAgICBwYXJhbXM6IHsgbWVtbzogaW5zdHJ1Y3Rpb24uZGF0YS50b1N0cmluZygpIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG1lbW8pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkFsbG9jYXRlOlxuICAgICAgICBpZiAoXG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnNbdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmFsbG9jYXRlID09PSB1bmRlZmluZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zW3Vuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggLSAxXS5hbGxvY2F0ZSA9XG4gICAgICAgICAgICBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVBbGxvY2F0ZShpbnN0cnVjdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgYWxsb2NhdGU6IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZUFsbG9jYXRlKGluc3RydWN0aW9uKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkFzc2lnbjpcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zW3Vuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggLSAxXS5hc3NpZ24gPT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnNbdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmFzc2lnbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZUFzc2lnbihpbnN0cnVjdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgYXNzaWduOiBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVBc3NpZ24oaW5zdHJ1Y3Rpb24pLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uU3BsaXQ6XG4gICAgICAgIGlmIChcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9uc1t1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uc3BsaXQgPT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnNbdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLnNwbGl0ID0gU3Rha2VJbnN0cnVjdGlvbi5kZWNvZGVTcGxpdChpbnN0cnVjdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgc3BsaXQ6IFN0YWtlSW5zdHJ1Y3Rpb24uZGVjb2RlU3BsaXQoaW5zdHJ1Y3Rpb24pLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uU3Rha2luZ0RlYWN0aXZhdGU6XG4gICAgICAgIGlmIChcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9uc1t1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uZGVhY3RpdmF0ZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9uc1t1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uZGVhY3RpdmF0ZSA9XG4gICAgICAgICAgICBTdGFrZUluc3RydWN0aW9uLmRlY29kZURlYWN0aXZhdGUoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIGRlYWN0aXZhdGU6IFN0YWtlSW5zdHJ1Y3Rpb24uZGVjb2RlRGVhY3RpdmF0ZShpbnN0cnVjdGlvbiksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5UcmFuc2ZlcjpcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zW3Vuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggLSAxXS50cmFuc2ZlciA9PT0gdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9uc1t1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0udHJhbnNmZXIgPVxuICAgICAgICAgICAgU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlVHJhbnNmZXIoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIHRyYW5zZmVyOiBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVUcmFuc2ZlcihpbnN0cnVjdGlvbiksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCB1bnN0YWtpbmdJbnN0cnVjdGlvbiBvZiB1bnN0YWtpbmdJbnN0cnVjdGlvbnMpIHtcbiAgICB2YWxpZGF0ZVVuc3Rha2luZ0luc3RydWN0aW9ucyh1bnN0YWtpbmdJbnN0cnVjdGlvbik7XG4gICAgY29uc3Qgc3Rha2luZ0RlYWN0aXZhdGU6IFN0YWtpbmdEZWFjdGl2YXRlID0ge1xuICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ0RlYWN0aXZhdGUsXG4gICAgICBwYXJhbXM6IHtcbiAgICAgICAgZnJvbUFkZHJlc3M6IHVuc3Rha2luZ0luc3RydWN0aW9uLmRlYWN0aXZhdGU/LmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgc3Rha2luZ0FkZHJlc3M6XG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb24uc3BsaXQ/LnN0YWtlUHVia2V5LnRvU3RyaW5nKCkgfHxcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbi5kZWFjdGl2YXRlPy5zdGFrZVB1YmtleS50b1N0cmluZygpIHx8XG4gICAgICAgICAgJycsXG4gICAgICAgIGFtb3VudDogdW5zdGFraW5nSW5zdHJ1Y3Rpb24uc3BsaXQ/LmxhbXBvcnRzLnRvU3RyaW5nKCksXG4gICAgICAgIHVuc3Rha2luZ0FkZHJlc3M6IHVuc3Rha2luZ0luc3RydWN0aW9uLnNwbGl0Py5zcGxpdFN0YWtlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgIGlzTWFyaW5hZGU6IHVuc3Rha2luZ0luc3RydWN0aW9uLmRlYWN0aXZhdGUgPT09IHVuZGVmaW5lZCxcbiAgICAgICAgcmVjaXBpZW50czpcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbi5kZWFjdGl2YXRlID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IHVuc3Rha2luZ0luc3RydWN0aW9uLnRyYW5zZmVyPy50b1B1YmtleS50b1N0cmluZygpIHx8ICcnLFxuICAgICAgICAgICAgICAgICAgYW1vdW50OiB1bnN0YWtpbmdJbnN0cnVjdGlvbi50cmFuc2Zlcj8ubGFtcG9ydHMudG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChzdGFraW5nRGVhY3RpdmF0ZSk7XG4gIH1cblxuICByZXR1cm4gaW5zdHJ1Y3Rpb25EYXRhO1xufVxuXG5pbnRlcmZhY2UgVW5zdGFraW5nSW5zdHJ1Y3Rpb25zIHtcbiAgYWxsb2NhdGU/OiBBbGxvY2F0ZVBhcmFtcztcbiAgYXNzaWduPzogQXNzaWduUGFyYW1zO1xuICBzcGxpdD86IFNwbGl0U3Rha2VQYXJhbXM7XG4gIGRlYWN0aXZhdGU/OiBEZWFjdGl2YXRlU3Rha2VQYXJhbXM7XG4gIHRyYW5zZmVyPzogRGVjb2RlZFRyYW5zZmVySW5zdHJ1Y3Rpb247XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKHVuc3Rha2luZ0luc3RydWN0aW9uczogVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKSB7XG4gIGlmICghdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmRlYWN0aXZhdGUpIHtcbiAgICBpZiAoXG4gICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMudHJhbnNmZXIgJiZcbiAgICAgICF1bnN0YWtpbmdJbnN0cnVjdGlvbnMuYWxsb2NhdGUgJiZcbiAgICAgICF1bnN0YWtpbmdJbnN0cnVjdGlvbnMuYXNzaWduICYmXG4gICAgICAhdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLnNwbGl0XG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ0ludmFsaWQgZGVhY3RpdmF0ZSBzdGFrZSB0cmFuc2FjdGlvbiwgbWlzc2luZyBkZWFjdGl2YXRlIHN0YWtlIGFjY291bnQgaW5zdHJ1Y3Rpb24nKTtcbiAgfSBlbHNlIGlmIChcbiAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMuYWxsb2NhdGUgfHxcbiAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMuYXNzaWduIHx8XG4gICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLnNwbGl0IHx8XG4gICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLnRyYW5zZmVyXG4gICkge1xuICAgIGlmICghdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmFsbG9jYXRlKSB7XG4gICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgICAnSW52YWxpZCBwYXJ0aWFsIGRlYWN0aXZhdGUgc3Rha2UgdHJhbnNhY3Rpb24sIG1pc3NpbmcgYWxsb2NhdGUgdW5zdGFrZSBhY2NvdW50IGluc3RydWN0aW9uJ1xuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKCF1bnN0YWtpbmdJbnN0cnVjdGlvbnMuYXNzaWduKSB7XG4gICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgICAnSW52YWxpZCBwYXJ0aWFsIGRlYWN0aXZhdGUgc3Rha2UgdHJhbnNhY3Rpb24sIG1pc3NpbmcgYXNzaWduIHVuc3Rha2UgYWNjb3VudCBpbnN0cnVjdGlvbidcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICghdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLnNwbGl0KSB7XG4gICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdJbnZhbGlkIHBhcnRpYWwgZGVhY3RpdmF0ZSBzdGFrZSB0cmFuc2FjdGlvbiwgbWlzc2luZyBzcGxpdCBzdGFrZSBhY2NvdW50IGluc3RydWN0aW9uJyk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5hbGxvY2F0ZS5hY2NvdW50UHVia2V5LnRvU3RyaW5nKCkgIT09IHVuc3Rha2luZ0luc3RydWN0aW9ucy5hc3NpZ24uYWNjb3VudFB1YmtleS50b1N0cmluZygpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgICAnSW52YWxpZCBwYXJ0aWFsIGRlYWN0aXZhdGUgc3Rha2UgdHJhbnNhY3Rpb24sIG11c3QgYWxsb2NhdGUgYW5kIGFzc2lnbiB0aGUgc2FtZSBwdWJsaWMga2V5J1xuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHVuc3Rha2luZ0luc3RydWN0aW9ucy5hbGxvY2F0ZS5zcGFjZSAhPT0gU3Rha2VQcm9ncmFtLnNwYWNlKSB7XG4gICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgICBgSW52YWxpZCBwYXJ0aWFsIGRlYWN0aXZhdGUgc3Rha2UgdHJhbnNhY3Rpb24sIHVuc3Rha2luZyBhY2NvdW50IG11c3QgYWxsb2NhdGUgJHtTdGFrZVByb2dyYW0uc3BhY2V9IGJ5dGVzYFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHVuc3Rha2luZ0luc3RydWN0aW9ucy5hc3NpZ24ucHJvZ3JhbUlkLnRvU3RyaW5nKCkgIT09IFN0YWtlUHJvZ3JhbS5wcm9ncmFtSWQudG9TdHJpbmcoKSkge1xuICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICAgJ0ludmFsaWQgcGFydGlhbCBkZWFjdGl2YXRlIHN0YWtlIHRyYW5zYWN0aW9uLCB0aGUgdW5zdGFrZSBhY2NvdW50IG11c3QgYmUgYXNzaWduZWQgdG8gdGhlIFN0YWtlIFByb2dyYW0nXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMuYWxsb2NhdGUuYWNjb3VudFB1YmtleS50b1N0cmluZygpICE9PVxuICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLnNwbGl0LnNwbGl0U3Rha2VQdWJrZXkudG9TdHJpbmcoKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZCgnSW52YWxpZCBwYXJ0aWFsIGRlYWN0aXZhdGUgc3Rha2UgdHJhbnNhY3Rpb24sIG11c3QgYWxsb2NhdGUgdGhlIHVuc3Rha2luZyBhY2NvdW50Jyk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5zcGxpdC5zdGFrZVB1YmtleS50b1N0cmluZygpID09PSB1bnN0YWtpbmdJbnN0cnVjdGlvbnMuc3BsaXQuc3BsaXRTdGFrZVB1YmtleS50b1N0cmluZygpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgICAnSW52YWxpZCBwYXJ0aWFsIGRlYWN0aXZhdGUgc3Rha2UgdHJhbnNhY3Rpb24sIHRoZSB1bnN0YWtpbmcgYWNjb3VudCBtdXN0IGJlIGRpZmZlcmVudCBmcm9tIHRoZSBTdGFrZSBBY2NvdW50J1xuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKCF1bnN0YWtpbmdJbnN0cnVjdGlvbnMudHJhbnNmZXIpIHtcbiAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoXG4gICAgICAgICdJbnZhbGlkIHBhcnRpYWwgZGVhY3RpdmF0ZSBzdGFrZSB0cmFuc2FjdGlvbiwgbWlzc2luZyBmdW5kaW5nIG9mIHVuc3Rha2UgYWRkcmVzcyBpbnN0cnVjdGlvbidcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUGFyc2VzIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gY3JlYXRlIHN0YWtpbmcgIHdpdGhkcmF3IHR4IGluc3RydWN0aW9ucyBwYXJhbXNcbiAqIE9ubHkgc3VwcG9ydHMgTm9uY2UsIFN0YWtpbmdXaXRoZHJhdywgYW5kIE1lbW8gU29sYW5hIGluc3RydWN0aW9uc1xuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSBhbiBhcnJheSBvZiBzdXBwb3J0ZWQgU29sYW5hIGluc3RydWN0aW9uc1xuICogQHJldHVybnMge0luc3RydWN0aW9uUGFyYW1zW119IEFuIGFycmF5IGNvbnRhaW5pbmcgaW5zdHJ1Y3Rpb24gcGFyYW1zIGZvciBzdGFraW5nIHdpdGhkcmF3IHR4XG4gKi9cbmZ1bmN0aW9uIHBhcnNlU3Rha2luZ1dpdGhkcmF3SW5zdHJ1Y3Rpb25zKFxuICBpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXVxuKTogQXJyYXk8Tm9uY2UgfCBTdGFraW5nV2l0aGRyYXcgfCBNZW1vPiB7XG4gIGNvbnN0IGluc3RydWN0aW9uRGF0YTogQXJyYXk8Tm9uY2UgfCBTdGFraW5nV2l0aGRyYXcgfCBNZW1vPiA9IFtdO1xuICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgIGNvbnN0IHR5cGUgPSBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkFkdmFuY2VOb25jZUFjY291bnQ6XG4gICAgICAgIGNvbnN0IGFkdmFuY2VOb25jZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VBZHZhbmNlKGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3Qgbm9uY2U6IE5vbmNlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk5vbmNlQWR2YW5jZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobm9uY2UpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLk1lbW86XG4gICAgICAgIGNvbnN0IG1lbW86IE1lbW8gPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTWVtbyxcbiAgICAgICAgICBwYXJhbXM6IHsgbWVtbzogaW5zdHJ1Y3Rpb24uZGF0YS50b1N0cmluZygpIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG1lbW8pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlN0YWtpbmdXaXRoZHJhdzpcbiAgICAgICAgY29uc3Qgd2l0aGRyYXdJbnN0cnVjdGlvbiA9IFN0YWtlSW5zdHJ1Y3Rpb24uZGVjb2RlV2l0aGRyYXcoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBzdGFraW5nV2l0aGRyYXc6IFN0YWtpbmdXaXRoZHJhdyA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nV2l0aGRyYXcsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBmcm9tQWRkcmVzczogd2l0aGRyYXdJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBzdGFraW5nQWRkcmVzczogd2l0aGRyYXdJbnN0cnVjdGlvbi5zdGFrZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYW1vdW50OiB3aXRoZHJhd0luc3RydWN0aW9uLmxhbXBvcnRzLnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goc3Rha2luZ1dpdGhkcmF3KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGluc3RydWN0aW9uRGF0YTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIG1lbW8gb2JqZWN0IGZyb20gaW5zdHJ1Y3Rpb25zIGlmIGl0IGV4aXN0c1xuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSB0aGUgYXJyYXkgb2Ygc3VwcG9ydGVkIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gYmUgcGFyc2VkXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIG51bWJlcj59IGluc3RydWN0aW9uSW5kZXhlcyAtIHRoZSBpbnN0cnVjdGlvbnMgaW5kZXhlcyBvZiB0aGUgY3VycmVudCB0cmFuc2FjdGlvblxuICogQHJldHVybnMge01lbW8gfCB1bmRlZmluZWR9IC0gbWVtbyBvYmplY3Qgb3IgdW5kZWZpbmVkXG4gKi9cbmZ1bmN0aW9uIGdldE1lbW8oaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10sIGluc3RydWN0aW9uSW5kZXhlczogUmVjb3JkPHN0cmluZywgbnVtYmVyPik6IE1lbW8gfCB1bmRlZmluZWQge1xuICBjb25zdCBpbnN0cnVjdGlvbnNMZW5ndGggPSBPYmplY3Qua2V5cyhpbnN0cnVjdGlvbkluZGV4ZXMpLmxlbmd0aDtcbiAgaWYgKGluc3RydWN0aW9ucy5sZW5ndGggPT09IGluc3RydWN0aW9uc0xlbmd0aCAmJiBpbnN0cnVjdGlvbnNbaW5zdHJ1Y3Rpb25JbmRleGVzLk1lbW9dKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk1lbW8sXG4gICAgICBwYXJhbXM6IHsgbWVtbzogaW5zdHJ1Y3Rpb25zW2luc3RydWN0aW9uSW5kZXhlcy5NZW1vXS5kYXRhLnRvU3RyaW5nKCkgfSxcbiAgICB9O1xuICB9XG59XG5cbmNvbnN0IGF0YUluaXRJbnN0cnVjdGlvbktleXNJbmRleGVzID0ge1xuICBQYXllckFkZHJlc3M6IDAsXG4gIEFUQUFkZHJlc3M6IDEsXG4gIE93bmVyQWRkcmVzczogMixcbiAgTWludEFkZHJlc3M6IDMsXG59O1xuXG5jb25zdCBjbG9zZUF0YUluc3RydWN0aW9uS2V5c0luZGV4ZXMgPSB7XG4gIEFjY291bnRBZGRyZXNzOiAwLFxuICBEZXN0aW5hdGlvbkFkZHJlc3M6IDEsXG4gIEF1dGhvcml0eUFkZHJlc3M6IDIsXG59O1xuXG4vKipcbiAqIFBhcnNlcyBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGluaXRpYWxpemUgYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IHR4IGluc3RydWN0aW9ucyBwYXJhbXNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gYW4gYXJyYXkgb2Ygc3VwcG9ydGVkIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtcyBmb3IgU2VuZCB0eFxuICovXG5mdW5jdGlvbiBwYXJzZUF0YUluaXRJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10pOiBBcnJheTxBdGFJbml0IHwgTWVtbyB8IE5vbmNlPiB7XG4gIGNvbnN0IGluc3RydWN0aW9uRGF0YTogQXJyYXk8QXRhSW5pdCB8IE1lbW8gfCBOb25jZT4gPSBbXTtcbiAgbGV0IG1lbW86IE1lbW8gfCB1bmRlZmluZWQ7XG5cbiAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHtcbiAgICBjb25zdCB0eXBlID0gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5NZW1vOlxuICAgICAgICBtZW1vID0geyB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5NZW1vLCBwYXJhbXM6IHsgbWVtbzogaW5zdHJ1Y3Rpb24uZGF0YS50b1N0cmluZygpIH0gfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQWR2YW5jZU5vbmNlQWNjb3VudDpcbiAgICAgICAgY29uc3QgYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVOb25jZUFkdmFuY2UoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBub25jZTogTm9uY2UgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChub25jZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkluaXRpYWxpemVBc3NvY2lhdGVkVG9rZW5BY2NvdW50OlxuICAgICAgICBjb25zdCBtaW50QWRkcmVzcyA9IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuTWludEFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpO1xuICAgICAgICBjb25zdCB0b2tlbk5hbWUgPSBmaW5kVG9rZW5OYW1lKG1pbnRBZGRyZXNzKTtcblxuICAgICAgICBjb25zdCBhdGFJbml0OiBBdGFJbml0ID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgICAgIGF0YUFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuQVRBQWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBvd25lckFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuT3duZXJBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHBheWVyQWRkcmVzczogaW5zdHJ1Y3Rpb24ua2V5c1thdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5QYXllckFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgdG9rZW5OYW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKGF0YUluaXQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoXG4gICAgICAgICAgJ0ludmFsaWQgdHJhbnNhY3Rpb24sIGluc3RydWN0aW9uIHR5cGUgbm90IHN1cHBvcnRlZDogJyArIGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbilcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cbiAgaWYgKG1lbW8pIHtcbiAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChtZW1vKTtcbiAgfVxuICByZXR1cm4gaW5zdHJ1Y3Rpb25EYXRhO1xufVxuXG5jb25zdCBhdGFDbG9zZUluc3RydWN0aW9uS2V5c0luZGV4ZXMgPSB7XG4gIEFjY291bnRBZGRyZXNzOiAwLFxuICBEZXN0aW5hdGlvbkFkZHJlc3M6IDEsXG4gIEF1dGhvcml0eUFkZHJlc3M6IDIsXG59O1xuXG4vKipcbiAqIFBhcnNlcyBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGNsb3NlIGFzc29jaWF0ZWQgdG9rZW4gYWNjb3VudCB0eCBpbnN0cnVjdGlvbnMgcGFyYW1zXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIGFuIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXMgZm9yIFNlbmQgdHhcbiAqL1xuZnVuY3Rpb24gcGFyc2VBdGFDbG9zZUluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSk6IEFycmF5PEF0YUNsb3NlIHwgTm9uY2U+IHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhOiBBcnJheTxBdGFDbG9zZSB8IE5vbmNlPiA9IFtdO1xuICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgIGNvbnN0IHR5cGUgPSBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkFkdmFuY2VOb25jZUFjY291bnQ6XG4gICAgICAgIGNvbnN0IGFkdmFuY2VOb25jZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VBZHZhbmNlKGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3Qgbm9uY2U6IE5vbmNlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk5vbmNlQWR2YW5jZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobm9uY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5DbG9zZUFzc29jaWF0ZWRUb2tlbkFjY291bnQ6XG4gICAgICAgIGNvbnN0IGF0YUNsb3NlOiBBdGFDbG9zZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DbG9zZUFzc29jaWF0ZWRUb2tlbkFjY291bnQsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBhY2NvdW50QWRkcmVzczogaW5zdHJ1Y3Rpb24ua2V5c1thdGFDbG9zZUluc3RydWN0aW9uS2V5c0luZGV4ZXMuQWNjb3VudEFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgZGVzdGluYXRpb25BZGRyZXNzOiBpbnN0cnVjdGlvbi5rZXlzW2F0YUNsb3NlSW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5EZXN0aW5hdGlvbkFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYXV0aG9yaXR5QWRkcmVzczogaW5zdHJ1Y3Rpb24ua2V5c1thdGFDbG9zZUluc3RydWN0aW9uS2V5c0luZGV4ZXMuQXV0aG9yaXR5QWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goYXRhQ2xvc2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoXG4gICAgICAgICAgJ0ludmFsaWQgdHJhbnNhY3Rpb24sIGluc3RydWN0aW9uIHR5cGUgbm90IHN1cHBvcnRlZDogJyArIGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbilcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGluc3RydWN0aW9uRGF0YTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgU29sYW5hIGluc3RydWN0aW9ucyB0byBhdXRob3JpemVkIHN0YWtpbmcgYWNjb3VudCBwYXJhbXNcbiAqIE9ubHkgc3VwcG9ydHMgTm9uY2UsIEF1dGhvcml6ZSBpbnN0cnVjdGlvbnNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gYW4gYXJyYXkgb2Ygc3VwcG9ydGVkIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtcyBmb3Igc3Rha2luZyBhdXRob3JpemUgdHhcbiAqL1xuZnVuY3Rpb24gcGFyc2VTdGFraW5nQXV0aG9yaXplSW5zdHJ1Y3Rpb25zKFxuICBpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXVxuKTogQXJyYXk8Tm9uY2UgfCBTdGFraW5nQXV0aG9yaXplIHwgTWVtbz4ge1xuICBjb25zdCBpbnN0cnVjdGlvbkRhdGE6IEFycmF5PE5vbmNlIHwgU3Rha2luZ0F1dGhvcml6ZSB8IE1lbW8+ID0gW107XG4gIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb25zKSB7XG4gICAgY29uc3QgdHlwZSA9IGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbik7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQWR2YW5jZU5vbmNlQWNjb3VudDpcbiAgICAgICAgY29uc3QgYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVOb25jZUFkdmFuY2UoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBub25jZTogTm9uY2UgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChub25jZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uTWVtbzpcbiAgICAgICAgY29uc3QgbWVtbzogTWVtbyA9IHsgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTWVtbywgcGFyYW1zOiB7IG1lbW86IGluc3RydWN0aW9uLmRhdGEudG9TdHJpbmcoKSB9IH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG1lbW8pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkF1dGhvcml6ZTpcbiAgICAgICAgY29uc3QgYXV0aG9yaXplID0gU3Rha2VJbnN0cnVjdGlvbi5kZWNvZGVBdXRob3JpemUoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaCh7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ0F1dGhvcml6ZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHN0YWtpbmdBZGRyZXNzOiBhdXRob3JpemUuc3Rha2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG9sZEF1dGhvcml6ZUFkZHJlc3M6IGF1dGhvcml6ZS5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBuZXdBdXRob3JpemVBZGRyZXNzOiBhdXRob3JpemUubmV3QXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgbmV3V2l0aGRyYXdBZGRyZXNzOiBhdXRob3JpemUuY3VzdG9kaWFuUHVia2V5Py50b1N0cmluZygpIHx8ICcnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaW5zdHJ1Y3Rpb25EYXRhO1xufVxuXG4vKipcbiAqIFBhcnNlcyBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGF1dGhvcml6ZWQgc3Rha2luZyBhY2NvdW50IHBhcmFtc1xuICogT25seSBzdXBwb3J0cyBOb25jZSwgQXV0aG9yaXplIGluc3RydWN0aW9uc1xuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSBhbiBhcnJheSBvZiBzdXBwb3J0ZWQgU29sYW5hIGluc3RydWN0aW9uc1xuICogQHJldHVybnMge0luc3RydWN0aW9uUGFyYW1zW119IEFuIGFycmF5IGNvbnRhaW5pbmcgaW5zdHJ1Y3Rpb24gcGFyYW1zIGZvciBzdGFraW5nIGF1dGhvcml6ZSB0eFxuICovXG5mdW5jdGlvbiBwYXJzZVN0YWtpbmdBdXRob3JpemVSYXdJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10pOiBBcnJheTxOb25jZSB8IFN0YWtpbmdBdXRob3JpemU+IHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhOiBBcnJheTxOb25jZSB8IFN0YWtpbmdBdXRob3JpemU+ID0gW107XG4gIGFzc2VydChpbnN0cnVjdGlvbnMubGVuZ3RoID09PSAyLCAnSW52YWxpZCBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zJyk7XG4gIGNvbnN0IGFkdmFuY2VOb25jZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VBZHZhbmNlKGluc3RydWN0aW9uc1swXSk7XG4gIGNvbnN0IG5vbmNlOiBOb25jZSA9IHtcbiAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ob25jZUFkdmFuY2UsXG4gICAgcGFyYW1zOiB7XG4gICAgICB3YWxsZXROb25jZUFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLm5vbmNlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICBhdXRoV2FsbGV0QWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24uYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgIH0sXG4gIH07XG4gIGluc3RydWN0aW9uRGF0YS5wdXNoKG5vbmNlKTtcbiAgY29uc3QgYXV0aG9yaXplID0gaW5zdHJ1Y3Rpb25zWzFdO1xuICBhc3NlcnQoYXV0aG9yaXplLmtleXMubGVuZ3RoID09PSA1LCAnSW52YWxpZCBudW1iZXIgb2Yga2V5cyBpbiBhdXRob3JpemUgaW5zdHJ1Y3Rpb24nKTtcbiAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goe1xuICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdBdXRob3JpemUsXG4gICAgcGFyYW1zOiB7XG4gICAgICBzdGFraW5nQWRkcmVzczogYXV0aG9yaXplLmtleXNbMF0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICBvbGRBdXRob3JpemVBZGRyZXNzOiBhdXRob3JpemUua2V5c1syXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgIG5ld0F1dGhvcml6ZUFkZHJlc3M6IGF1dGhvcml6ZS5rZXlzWzNdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgY3VzdG9kaWFuQWRkcmVzczogYXV0aG9yaXplLmtleXNbNF0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiBpbnN0cnVjdGlvbkRhdGE7XG59XG5cbmZ1bmN0aW9uIGZpbmRUb2tlbk5hbWUobWludEFkZHJlc3M6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCB0b2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGNvaW5zLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTb2xDb2luICYmIHZhbHVlLnRva2VuQWRkcmVzcyA9PT0gbWludEFkZHJlc3MpIHtcbiAgICAgIHRva2VuID0gdmFsdWUubmFtZTtcbiAgICB9XG4gIH0pO1xuXG4gIGFzc2VydCh0b2tlbik7XG5cbiAgcmV0dXJuIHRva2VuO1xufVxuIl19

Выполнить команду


Для локальной разработки. Не используйте в интернете!