PHP WebShell

Текущая директория: /usr/lib/node_modules/bitgo/node_modules/@bitgo/sdk-core/dist/src/bitgo/tss/ecdsa

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

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getSignatureShareRoundOne = getSignatureShareRoundOne;
exports.getSignatureShareRoundTwo = getSignatureShareRoundTwo;
exports.getSignatureShareRoundThree = getSignatureShareRoundThree;
exports.verifyBitGoMessagesAndSignaturesRoundOne = verifyBitGoMessagesAndSignaturesRoundOne;
exports.verifyBitGoMessagesAndSignaturesRoundTwo = verifyBitGoMessagesAndSignaturesRoundTwo;
exports.getBitGoPartyGpgKey = getBitGoPartyGpgKey;
exports.getUserPartyGpgKey = getUserPartyGpgKey;
const utils_1 = require("../../utils");
const sdk_lib_mpc_1 = require("@bitgo/sdk-lib-mpc");
const public_types_1 = require("@bitgo/public-types");
const assert_1 = __importDefault(require("assert"));
function partyIdToSignatureShareType(partyId) {
    (0, assert_1.default)(partyId === 0 || partyId === 1 || partyId === 2, 'Invalid partyId for MPCv2 signing');
    switch (partyId) {
        case 0:
            return utils_1.SignatureShareType.USER;
        case 1:
            return utils_1.SignatureShareType.BACKUP;
        case 2:
            return utils_1.SignatureShareType.BITGO;
    }
}
/**
 Helpers in this take care of all interaction with WP API's
**/
async function getSignatureShareRoundOne(round1Message, userGpgKey, partyId = 0, otherSignerPartyId = 2) {
    const serializedMessages = sdk_lib_mpc_1.DklsTypes.serializeMessages({
        broadcastMessages: [round1Message],
        p2pMessages: [],
    });
    const authEncBroadcastMessage = (await sdk_lib_mpc_1.DklsComms.encryptAndAuthOutgoingMessages(serializedMessages, [], // Broadcast message so doesn't need to encrypt to BitGo's GPG key
    [getUserPartyGpgKey(userGpgKey, partyId)])).broadcastMessages[0];
    // Share type expected by Wallet Platform's API
    (0, assert_1.default)(public_types_1.MPCv2PartyFromStringOrNumber.is(authEncBroadcastMessage.from));
    const share = {
        type: 'round1Input',
        data: {
            msg1: {
                from: authEncBroadcastMessage.from,
                message: authEncBroadcastMessage.payload.message,
                signature: authEncBroadcastMessage.payload.signature,
            },
        },
    };
    const serializedShare = JSON.stringify(share);
    return {
        from: partyIdToSignatureShareType(partyId),
        to: partyIdToSignatureShareType(otherSignerPartyId),
        share: serializedShare,
    };
}
async function getSignatureShareRoundTwo(userToBitGoMessages2, userToBitGoMessages3, userGpgKey, otherPartyGpgKey, partyId = 0, otherSignerPartyId = 2) {
    const userToBitGoEncryptedMsg2 = await sdk_lib_mpc_1.DklsComms.encryptAndAuthOutgoingMessages(sdk_lib_mpc_1.DklsTypes.serializeMessages(userToBitGoMessages2), [getBitGoPartyGpgKey(otherPartyGpgKey, otherSignerPartyId)], [getUserPartyGpgKey(userGpgKey, partyId)]);
    const userToBitGoEncryptedMsg3 = await sdk_lib_mpc_1.DklsComms.encryptAndAuthOutgoingMessages(sdk_lib_mpc_1.DklsTypes.serializeMessages(userToBitGoMessages3), [getBitGoPartyGpgKey(otherPartyGpgKey, otherSignerPartyId)], [getUserPartyGpgKey(userGpgKey, partyId)]);
    (0, assert_1.default)(userToBitGoEncryptedMsg2.p2pMessages.length, 'User to BitGo messages 2 not present.');
    (0, assert_1.default)(userToBitGoEncryptedMsg3.p2pMessages.length, 'User to BitGo messages 3 not present.');
    (0, assert_1.default)(public_types_1.MPCv2PartyFromStringOrNumber.is(userToBitGoEncryptedMsg2.p2pMessages[0].from));
    (0, assert_1.default)(public_types_1.MPCv2PartyFromStringOrNumber.is(userToBitGoEncryptedMsg2.p2pMessages[0].to));
    (0, assert_1.default)(public_types_1.MPCv2PartyFromStringOrNumber.is(userToBitGoEncryptedMsg3.p2pMessages[0].from));
    (0, assert_1.default)(public_types_1.MPCv2PartyFromStringOrNumber.is(userToBitGoEncryptedMsg3.p2pMessages[0].to));
    const share = {
        type: 'round2Input',
        data: {
            msg2: {
                from: userToBitGoEncryptedMsg2.p2pMessages[0].from,
                to: userToBitGoEncryptedMsg2.p2pMessages[0].to,
                encryptedMessage: userToBitGoEncryptedMsg2.p2pMessages[0].payload.encryptedMessage,
                signature: userToBitGoEncryptedMsg2.p2pMessages[0].payload.signature,
            },
            msg3: {
                from: userToBitGoEncryptedMsg3.p2pMessages[0].from,
                to: userToBitGoEncryptedMsg3.p2pMessages[0].to,
                encryptedMessage: userToBitGoEncryptedMsg3.p2pMessages[0].payload.encryptedMessage,
                signature: userToBitGoEncryptedMsg3.p2pMessages[0].payload.signature,
            },
        },
    };
    return {
        from: partyIdToSignatureShareType(partyId),
        to: partyIdToSignatureShareType(otherSignerPartyId),
        share: JSON.stringify(share),
    };
}
async function getSignatureShareRoundThree(userToBitGoMessages4, userGpgKey, bitgoGpgKey, partyId = 0, otherSignerPartyId = 2) {
    const userToBitGoEncryptedMsg4 = await sdk_lib_mpc_1.DklsComms.encryptAndAuthOutgoingMessages(sdk_lib_mpc_1.DklsTypes.serializeMessages(userToBitGoMessages4), [getBitGoPartyGpgKey(bitgoGpgKey, otherSignerPartyId)], [getUserPartyGpgKey(userGpgKey, partyId)]);
    (0, assert_1.default)(public_types_1.MPCv2PartyFromStringOrNumber.is(userToBitGoEncryptedMsg4.broadcastMessages[0].from));
    if (!userToBitGoEncryptedMsg4.broadcastMessages[0].signatureR?.message) {
        throw Error('signatureR should be defined');
    }
    const share = {
        type: 'round3Input',
        data: {
            msg4: {
                from: userToBitGoEncryptedMsg4.broadcastMessages[0].from,
                message: userToBitGoEncryptedMsg4.broadcastMessages[0].payload.message,
                signature: userToBitGoEncryptedMsg4.broadcastMessages[0].payload.signature,
                signatureR: userToBitGoEncryptedMsg4.broadcastMessages[0].signatureR.message,
            },
        },
    };
    return {
        from: partyIdToSignatureShareType(partyId),
        to: partyIdToSignatureShareType(otherSignerPartyId),
        share: JSON.stringify(share),
    };
}
async function verifyBitGoMessagesAndSignaturesRoundOne(parsedSignatureShare, userGpgKey, bitgoGpgKey, partyId = 0) {
    return await sdk_lib_mpc_1.DklsComms.decryptAndVerifyIncomingMessages({
        p2pMessages: [
            {
                from: parsedSignatureShare.data.msg2.from,
                to: parsedSignatureShare.data.msg2.to,
                payload: {
                    encryptedMessage: parsedSignatureShare.data.msg2.encryptedMessage,
                    signature: parsedSignatureShare.data.msg2.signature,
                },
            },
        ],
        broadcastMessages: [
            {
                from: parsedSignatureShare.data.msg1.from,
                payload: {
                    message: parsedSignatureShare.data.msg1.message,
                    signature: parsedSignatureShare.data.msg1.signature,
                },
            },
        ],
    }, [getBitGoPartyGpgKey(bitgoGpgKey)], [getUserPartyGpgKey(userGpgKey, partyId)]);
}
async function verifyBitGoMessagesAndSignaturesRoundTwo(parsedSignatureShare, userGpgKey, bitgoGpgKey, partyId = 0) {
    return await sdk_lib_mpc_1.DklsComms.decryptAndVerifyIncomingMessages({
        p2pMessages: [
            {
                from: parsedSignatureShare.data.msg3.from,
                to: parsedSignatureShare.data.msg3.to,
                payload: {
                    encryptedMessage: parsedSignatureShare.data.msg3.encryptedMessage,
                    signature: parsedSignatureShare.data.msg3.signature,
                },
            },
        ],
        broadcastMessages: [],
    }, [getBitGoPartyGpgKey(bitgoGpgKey)], [getUserPartyGpgKey(userGpgKey, partyId)]);
}
function getBitGoPartyGpgKey(key, partyId = 2) {
    return {
        partyId: partyId,
        gpgKey: key.armor(),
    };
}
function getUserPartyGpgKey(key, partyId = 0) {
    return {
        partyId: partyId,
        gpgKey: key.privateKey,
    };
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNkc2FNUEN2Mi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9iaXRnby90c3MvZWNkc2EvZWNkc2FNUEN2Mi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQTZCQSw4REFtQ0M7QUFFRCw4REErQ0M7QUFFRCxrRUFnQ0M7QUFFRCw0RkErQkM7QUFFRCw0RkF1QkM7QUFFRCxrREFLQztBQUVELGdEQUtDO0FBM05ELHVDQUF1RTtBQUV2RSxvREFBMEQ7QUFDMUQsc0RBTzZCO0FBQzdCLG9EQUE0QjtBQUU1QixTQUFTLDJCQUEyQixDQUFDLE9BQWtCO0lBQ3JELElBQUEsZ0JBQU0sRUFBQyxPQUFPLEtBQUssQ0FBQyxJQUFJLE9BQU8sS0FBSyxDQUFDLElBQUksT0FBTyxLQUFLLENBQUMsRUFBRSxtQ0FBbUMsQ0FBQyxDQUFDO0lBQzdGLFFBQVEsT0FBTyxFQUFFLENBQUM7UUFDaEIsS0FBSyxDQUFDO1lBQ0osT0FBTywwQkFBa0IsQ0FBQyxJQUFJLENBQUM7UUFDakMsS0FBSyxDQUFDO1lBQ0osT0FBTywwQkFBa0IsQ0FBQyxNQUFNLENBQUM7UUFDbkMsS0FBSyxDQUFDO1lBQ0osT0FBTywwQkFBa0IsQ0FBQyxLQUFLLENBQUM7SUFDcEMsQ0FBQztBQUNILENBQUM7QUFFRDs7R0FFRztBQUVJLEtBQUssVUFBVSx5QkFBeUIsQ0FDN0MsYUFBcUQsRUFDckQsVUFBNkMsRUFDN0MsVUFBaUIsQ0FBQyxFQUNsQixxQkFBZ0MsQ0FBQztJQUVqQyxNQUFNLGtCQUFrQixHQUFHLHVCQUFTLENBQUMsaUJBQWlCLENBQUM7UUFDckQsaUJBQWlCLEVBQUUsQ0FBQyxhQUFhLENBQUM7UUFDbEMsV0FBVyxFQUFFLEVBQUU7S0FDaEIsQ0FBQyxDQUFDO0lBQ0gsTUFBTSx1QkFBdUIsR0FBRyxDQUM5QixNQUFNLHVCQUFTLENBQUMsOEJBQThCLENBQzVDLGtCQUFrQixFQUNsQixFQUFFLEVBQUUsa0VBQWtFO0lBQ3RFLENB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LG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUztpQkFDcEQ7YUFDRjtTQUNGO1FBQ0QsaUJBQWlCLEVBQUUsRUFBRTtLQUN0QixFQUNELENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLENBQUMsRUFDbEMsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FDMUMsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFnQixtQkFBbUIsQ0FBQyxHQUFnQixFQUFFLFVBQXFCLENBQUM7SUFDMUUsT0FBTztRQUNMLE9BQU8sRUFBRSxPQUFPO1FBQ2hCLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFFO0tBQ3BCLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBZ0Isa0JBQWtCLENBQUMsR0FBc0MsRUFBRSxVQUFpQixDQUFDO0lBQzNGLE9BQU87UUFDTCxPQUFPLEVBQUUsT0FBTztRQUNoQixNQUFNLEVBQUUsR0FBRyxDQUFDLFVBQVU7S0FDdkIsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTaWduYXR1cmVTaGFyZVJlY29yZCwgU2lnbmF0dXJlU2hhcmVUeXBlIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IG9wZW5wZ3AgZnJvbSAnb3BlbnBncCc7XG5pbXBvcnQgeyBEa2xzQ29tbXMsIERrbHNUeXBlcyB9IGZyb20gJ0BiaXRnby9zZGstbGliLW1wYyc7XG5pbXBvcnQge1xuICBNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQxSW5wdXQsXG4gIE1QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDFPdXRwdXQsXG4gIE1QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDJJbnB1dCxcbiAgTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kMk91dHB1dCxcbiAgTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kM0lucHV0LFxuICBNUEN2MlBhcnR5RnJvbVN0cmluZ09yTnVtYmVyLFxufSBmcm9tICdAYml0Z28vcHVibGljLXR5cGVzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuZnVuY3Rpb24gcGFydHlJZFRvU2lnbmF0dXJlU2hhcmVUeXBlKHBhcnR5SWQ6IDAgfCAxIHwgMik6IFNpZ25hdHVyZVNoYXJlVHlwZSB7XG4gIGFzc2VydChwYXJ0eUlkID09PSAwIHx8IHBhcnR5SWQgPT09IDEgfHwgcGFydHlJZCA9PT0gMiwgJ0ludmFsaWQgcGFydHlJZCBmb3IgTVBDdjIgc2lnbmluZycpO1xuICBzd2l0Y2ggKHBhcnR5SWQpIHtcbiAgICBjYXNlIDA6XG4gICAgICByZXR1cm4gU2lnbmF0dXJlU2hhcmVUeXBlLlVTRVI7XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIFNpZ25hdHVyZVNoYXJlVHlwZS5CQUNLVVA7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIFNpZ25hdHVyZVNoYXJlVHlwZS5CSVRHTztcbiAgfVxufVxuXG4vKipcbiBIZWxwZXJzIGluIHRoaXMgdGFrZSBjYXJlIG9mIGFsbCBpbnRlcmFjdGlvbiB3aXRoIFdQIEFQSSdzXG4qKi9cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFNpZ25hdHVyZVNoYXJlUm91bmRPbmUoXG4gIHJvdW5kMU1lc3NhZ2U6IERrbHNUeXBlcy5EZXNlcmlhbGl6ZWRCcm9hZGNhc3RNZXNzYWdlLFxuICB1c2VyR3BnS2V5OiBvcGVucGdwLlNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz4sXG4gIHBhcnR5SWQ6IDAgfCAxID0gMCxcbiAgb3RoZXJTaWduZXJQYXJ0eUlkOiAwIHwgMSB8IDIgPSAyXG4pOiBQcm9taXNlPFNpZ25hdHVyZVNoYXJlUmVjb3JkPiB7XG4gIGNvbnN0IHNlcmlhbGl6ZWRNZXNzYWdlcyA9IERrbHNUeXBlcy5zZXJpYWxpemVNZXNzYWdlcyh7XG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtyb3VuZDFNZXNzYWdlXSxcbiAgICBwMnBNZXNzYWdlczogW10sXG4gIH0pO1xuICBjb25zdCBhdXRoRW5jQnJvYWRjYXN0TWVzc2FnZSA9IChcbiAgICBhd2FpdCBEa2xzQ29tbXMuZW5jcnlwdEFuZEF1dGhPdXRnb2luZ01lc3NhZ2VzKFxuICAgICAgc2VyaWFsaXplZE1lc3NhZ2VzLFxuICAgICAgW10sIC8vIEJyb2FkY2FzdCBtZXNzYWdlIHNvIGRvZXNuJ3QgbmVlZCB0byBlbmNyeXB0IHRvIEJpdEdvJ3MgR1BHIGtleVxuICAgICAgW2dldFVzZXJQYXJ0eUdwZ0tleSh1c2VyR3BnS2V5LCBwYXJ0eUlkKV1cbiAgICApXG4gICkuYnJvYWRjYXN0TWVzc2FnZXNbMF07XG4gIC8vIFNoYXJlIHR5cGUgZXhwZWN0ZWQgYnkgV2FsbGV0IFBsYXRmb3JtJ3MgQVBJXG4gIGFzc2VydChNUEN2MlBhcnR5RnJvbVN0cmluZ09yTnVtYmVyLmlzKGF1dGhFbmNCcm9hZGNhc3RNZXNzYWdlLmZyb20pKTtcbiAgY29uc3Qgc2hhcmU6IE1QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDFJbnB1dCA9IHtcbiAgICB0eXBlOiAncm91bmQxSW5wdXQnLFxuICAgIGRhdGE6IHtcbiAgICAgIG1zZzE6IHtcbiAgICAgICAgZnJvbTogYXV0aEVuY0Jyb2FkY2FzdE1lc3NhZ2UuZnJvbSxcbiAgICAgICAgbWVzc2FnZTogYXV0aEVuY0Jyb2FkY2FzdE1lc3NhZ2UucGF5bG9hZC5tZXNzYWdlLFxuICAgICAgICBzaWduYXR1cmU6IGF1dGhFbmNCcm9hZGNhc3RNZXNzYWdlLnBheWxvYWQuc2lnbmF0dXJlLFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xuICBjb25zdCBzZXJpYWxpemVkU2hhcmUgPSBKU09OLnN0cmluZ2lmeShzaGFyZSk7XG4gIHJldHVybiB7XG4gICAgZnJvbTogcGFydHlJZFRvU2lnbmF0dXJlU2hhcmVUeXBlKHBhcnR5SWQpLFxuICAgIHRvOiBwYXJ0eUlkVG9TaWduYXR1cmVTaGFyZVR5cGUob3RoZXJTaWduZXJQYXJ0eUlkKSxcbiAgICBzaGFyZTogc2VyaWFsaXplZFNoYXJlLFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZFR3byhcbiAgdXNlclRvQml0R29NZXNzYWdlczI6IERrbHNUeXBlcy5EZXNlcmlhbGl6ZWRNZXNzYWdlcyxcbiAgdXNlclRvQml0R29NZXNzYWdlczM6IERrbHNUeXBlcy5EZXNlcmlhbGl6ZWRNZXNzYWdlcyxcbiAgdXNlckdwZ0tleTogb3BlbnBncC5TZXJpYWxpemVkS2V5UGFpcjxzdHJpbmc+LFxuICBvdGhlclBhcnR5R3BnS2V5OiBvcGVucGdwLktleSxcbiAgcGFydHlJZDogMCB8IDEgPSAwLFxuICBvdGhlclNpZ25lclBhcnR5SWQ6IDAgfCAxIHwgMiA9IDJcbik6IFByb21pc2U8U2lnbmF0dXJlU2hhcmVSZWNvcmQ+IHtcbiAgY29uc3QgdXNlclRvQml0R29FbmNyeXB0ZWRNc2cyID0gYXdhaXQgRGtsc0NvbW1zLmVuY3J5cHRBbmRBdXRoT3V0Z29pbmdNZXNzYWdlcyhcbiAgICBEa2xzVHlwZXMuc2VyaWFsaXplTWVzc2FnZXModXNlclRvQml0R29NZXNzYWdlczIpLFxuICAgIFtnZXRCaXRHb1BhcnR5R3BnS2V5KG90aGVyUGFydHlHcGdLZXksIG90aGVyU2lnbmVyUGFydHlJZCldLFxuICAgIFtnZXRVc2VyUGFydHlHcGdLZXkodXNlckdwZ0tleSwgcGFydHlJZCldXG4gICk7XG5cbiAgY29uc3QgdXNlclRvQml0R29FbmNyeXB0ZWRNc2czID0gYXdhaXQgRGtsc0NvbW1zLmVuY3J5cHRBbmRBdXRoT3V0Z29pbmdNZXNzYWdlcyhcbiAgICBEa2xzVHlwZXMuc2VyaWFsaXplTWVzc2FnZXModXNlclRvQml0R29NZXNzYWdlczMpLFxuICAgIFtnZXRCaXRHb1BhcnR5R3BnS2V5KG90aGVyUGFydHlHcGdLZXksIG90aGVyU2lnbmVyUGFydHlJZCldLFxuICAgIFtnZXRVc2VyUGFydHlHcGdLZXkodXNlckdwZ0tleSwgcGFydHlJZCldXG4gICk7XG4gIGFzc2VydCh1c2VyVG9CaXRHb0VuY3J5cHRlZE1zZzIucDJwTWVzc2FnZXMubGVuZ3RoLCAnVXNlciB0byBCaXRHbyBtZXNzYWdlcyAyIG5vdCBwcmVzZW50LicpO1xuICBhc3NlcnQodXNlclRvQml0R29FbmNyeXB0ZWRNc2czLnAycE1lc3NhZ2VzLmxlbmd0aCwgJ1VzZXIgdG8gQml0R28gbWVzc2FnZXMgMyBub3QgcHJlc2VudC4nKTtcbiAgYXNzZXJ0KE1QQ3YyUGFydHlGcm9tU3RyaW5nT3JOdW1iZXIuaXModXNlclRvQml0R29FbmNyeXB0ZWRNc2cyLnAycE1lc3NhZ2VzWzBdLmZyb20pKTtcbiAgYXNzZXJ0KE1QQ3YyUGFydHlGcm9tU3RyaW5nT3JOdW1iZXIuaXModXNlclRvQml0R29FbmNyeXB0ZWRNc2cyLnAycE1lc3NhZ2VzWzBdLnRvKSk7XG4gIGFzc2VydChNUEN2MlBhcnR5RnJvbVN0cmluZ09yTnVtYmVyLmlzKHVzZXJUb0JpdEdvRW5jcnlwdGVkTXNnMy5wMnBNZXNzYWdlc1swXS5mcm9tKSk7XG4gIGFzc2VydChNUEN2MlBhcnR5RnJvbVN0cmluZ09yTnVtYmVyLmlzKHVzZXJUb0JpdEdvRW5jcnlwdGVkTXNnMy5wMnBNZXNzYWdlc1swXS50bykpO1xuICBjb25zdCBzaGFyZTogTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kMklucHV0ID0ge1xuICAgIHR5cGU6ICdyb3VuZDJJbnB1dCcsXG4gICAgZGF0YToge1xuICAgICAgbXNnMjoge1xuICAgICAgICBmcm9tOiB1c2VyVG9CaXRHb0VuY3J5cHRlZE1zZzIucDJwTWVzc2FnZXNbMF0uZnJvbSxcbiAgICAgICAgdG86IHVzZXJUb0JpdEdvRW5jcnlwdGVkTXNnMi5wMnBNZXNzYWdlc1swXS50byxcbiAgICAgICAgZW5jcnlwdGVkTWVzc2FnZTogdXNlclRvQml0R29FbmNyeXB0ZWRNc2cyLnAycE1lc3NhZ2VzWzBdLnBheWxvYWQuZW5jcnlwdGVkTWVzc2FnZSxcbiAgICAgICAgc2lnbmF0dXJlOiB1c2VyVG9CaXRHb0VuY3J5cHRlZE1zZzIucDJwTWVzc2FnZXNbMF0ucGF5bG9hZC5zaWduYXR1cmUsXG4gICAgICB9LFxuICAgICAgbXNnMzoge1xuICAgICAgICBmcm9tOiB1c2VyVG9CaXRHb0VuY3J5cHRlZE1zZzMucDJwTWVzc2FnZXNbMF0uZnJvbSxcbiAgICAgICAgdG86IHVzZXJUb0JpdEdvRW5jcnlwdGVkTXNnMy5wMnBNZXNzYWdlc1swXS50byxcbiAgICAgICAgZW5jcnlwdGVkTWVzc2FnZTogdXNlclRvQml0R29FbmNyeXB0ZWRNc2czLnAycE1lc3NhZ2VzWzBdLnBheWxvYWQuZW5jcnlwdGVkTWVzc2FnZSxcbiAgICAgICAgc2lnbmF0dXJlOiB1c2VyVG9CaXRHb0VuY3J5cHRlZE1zZzMucDJwTWVzc2FnZXNbMF0ucGF5bG9hZC5zaWduYXR1cmUsXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG4gIHJldHVybiB7XG4gICAgZnJvbTogcGFydHlJZFRvU2lnbmF0dXJlU2hhcmVUeXBlKHBhcnR5SWQpLFxuICAgIHRvOiBwYXJ0eUlkVG9TaWduYXR1cmVTaGFyZVR5cGUob3RoZXJTaWduZXJQYXJ0eUlkKSxcbiAgICBzaGFyZTogSlNPTi5zdHJpbmdpZnkoc2hhcmUpLFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZFRocmVlKFxuICB1c2VyVG9CaXRHb01lc3NhZ2VzNDogRGtsc1R5cGVzLkRlc2VyaWFsaXplZE1lc3NhZ2VzLFxuICB1c2VyR3BnS2V5OiBvcGVucGdwLlNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz4sXG4gIGJpdGdvR3BnS2V5OiBvcGVucGdwLktleSxcbiAgcGFydHlJZDogMCB8IDEgPSAwLFxuICBvdGhlclNpZ25lclBhcnR5SWQ6IDAgfCAxIHwgMiA9IDJcbik6IFByb21pc2U8U2lnbmF0dXJlU2hhcmVSZWNvcmQ+IHtcbiAgY29uc3QgdXNlclRvQml0R29FbmNyeXB0ZWRNc2c0ID0gYXdhaXQgRGtsc0NvbW1zLmVuY3J5cHRBbmRBdXRoT3V0Z29pbmdNZXNzYWdlcyhcbiAgICBEa2xzVHlwZXMuc2VyaWFsaXplTWVzc2FnZXModXNlclRvQml0R29NZXNzYWdlczQpLFxuICAgIFtnZXRCaXRHb1BhcnR5R3BnS2V5KGJpdGdvR3BnS2V5LCBvdGhlclNpZ25lclBhcnR5SWQpXSxcbiAgICBbZ2V0VXNlclBhcnR5R3BnS2V5KHVzZXJHcGdLZXksIHBhcnR5SWQpXVxuICApO1xuICBhc3NlcnQoTVBDdjJQYXJ0eUZyb21TdHJpbmdPck51bWJlci5pcyh1c2VyVG9CaXRHb0VuY3J5cHRlZE1zZzQuYnJvYWRjYXN0TWVzc2FnZXNbMF0uZnJvbSkpO1xuICBpZiAoIXVzZXJUb0JpdEdvRW5jcnlwdGVkTXNnNC5icm9hZGNhc3RNZXNzYWdlc1swXS5zaWduYXR1cmVSPy5tZXNzYWdlKSB7XG4gICAgdGhyb3cgRXJyb3IoJ3NpZ25hdHVyZVIgc2hvdWxkIGJlIGRlZmluZWQnKTtcbiAgfVxuICBjb25zdCBzaGFyZTogTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kM0lucHV0ID0ge1xuICAgIHR5cGU6ICdyb3VuZDNJbnB1dCcsXG4gICAgZGF0YToge1xuICAgICAgbXNnNDoge1xuICAgICAgICBmcm9tOiB1c2VyVG9CaXRHb0VuY3J5cHRlZE1zZzQuYnJvYWRjYXN0TWVzc2FnZXNbMF0uZnJvbSxcbiAgICAgICAgbWVzc2FnZTogdXNlclRvQml0R29FbmNyeXB0ZWRNc2c0LmJyb2FkY2FzdE1lc3NhZ2VzWzBdLnBheWxvYWQubWVzc2FnZSxcbiAgICAgICAgc2lnbmF0dXJlOiB1c2VyVG9CaXRHb0VuY3J5cHRlZE1zZzQuYnJvYWRjYXN0TWVzc2FnZXNbMF0ucGF5bG9hZC5zaWduYXR1cmUsXG4gICAgICAgIHNpZ25hdHVyZVI6IHVzZXJUb0JpdEdvRW5jcnlwdGVkTXNnNC5icm9hZGNhc3RNZXNzYWdlc1swXS5zaWduYXR1cmVSLm1lc3NhZ2UsXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG4gIHJldHVybiB7XG4gICAgZnJvbTogcGFydHlJZFRvU2lnbmF0dXJlU2hhcmVUeXBlKHBhcnR5SWQpLFxuICAgIHRvOiBwYXJ0eUlkVG9TaWduYXR1cmVTaGFyZVR5cGUob3RoZXJTaWduZXJQYXJ0eUlkKSxcbiAgICBzaGFyZTogSlNPTi5zdHJpbmdpZnkoc2hhcmUpLFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5Qml0R29NZXNzYWdlc0FuZFNpZ25hdHVyZXNSb3VuZE9uZShcbiAgcGFyc2VkU2lnbmF0dXJlU2hhcmU6IE1QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDFPdXRwdXQsXG4gIHVzZXJHcGdLZXk6IG9wZW5wZ3AuU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPixcbiAgYml0Z29HcGdLZXk6IG9wZW5wZ3AuS2V5LFxuICBwYXJ0eUlkOiAwIHwgMSA9IDBcbik6IFByb21pc2U8RGtsc1R5cGVzLlNlcmlhbGl6ZWRNZXNzYWdlcz4ge1xuICByZXR1cm4gYXdhaXQgRGtsc0NvbW1zLmRlY3J5cHRBbmRWZXJpZnlJbmNvbWluZ01lc3NhZ2VzKFxuICAgIHtcbiAgICAgIHAycE1lc3NhZ2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBmcm9tOiBwYXJzZWRTaWduYXR1cmVTaGFyZS5kYXRhLm1zZzIuZnJvbSxcbiAgICAgICAgICB0bzogcGFyc2VkU2lnbmF0dXJlU2hhcmUuZGF0YS5tc2cyLnRvLFxuICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgIGVuY3J5cHRlZE1lc3NhZ2U6IHBhcnNlZFNpZ25hdHVyZVNoYXJlLmRhdGEubXNnMi5lbmNyeXB0ZWRNZXNzYWdlLFxuICAgICAgICAgICAgc2lnbmF0dXJlOiBwYXJzZWRTaWduYXR1cmVTaGFyZS5kYXRhLm1zZzIuc2lnbmF0dXJlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGZyb206IHBhcnNlZFNpZ25hdHVyZVNoYXJlLmRhdGEubXNnMS5mcm9tLFxuICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IHBhcnNlZFNpZ25hdHVyZVNoYXJlLmRhdGEubXNnMS5tZXNzYWdlLFxuICAgICAgICAgICAgc2lnbmF0dXJlOiBwYXJzZWRTaWduYXR1cmVTaGFyZS5kYXRhLm1zZzEuc2lnbmF0dXJlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAgW2dldEJpdEdvUGFydHlHcGdLZXkoYml0Z29HcGdLZXkpXSxcbiAgICBbZ2V0VXNlclBhcnR5R3BnS2V5KHVzZXJHcGdLZXksIHBhcnR5SWQpXVxuICApO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5Qml0R29NZXNzYWdlc0FuZFNpZ25hdHVyZXNSb3VuZFR3byhcbiAgcGFyc2VkU2lnbmF0dXJlU2hhcmU6IE1QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDJPdXRwdXQsXG4gIHVzZXJHcGdLZXk6IG9wZW5wZ3AuU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPixcbiAgYml0Z29HcGdLZXk6IG9wZW5wZ3AuS2V5LFxuICBwYXJ0eUlkOiAwIHwgMSA9IDBcbik6IFByb21pc2U8RGtsc1R5cGVzLlNlcmlhbGl6ZWRNZXNzYWdlcz4ge1xuICByZXR1cm4gYXdhaXQgRGtsc0NvbW1zLmRlY3J5cHRBbmRWZXJpZnlJbmNvbWluZ01lc3NhZ2VzKFxuICAgIHtcbiAgICAgIHAycE1lc3NhZ2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBmcm9tOiBwYXJzZWRTaWduYXR1cmVTaGFyZS5kYXRhLm1zZzMuZnJvbSxcbiAgICAgICAgICB0bzogcGFyc2VkU2lnbmF0dXJlU2hhcmUuZGF0YS5tc2czLnRvLFxuICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgIGVuY3J5cHRlZE1lc3NhZ2U6IHBhcnNlZFNpZ25hdHVyZVNoYXJlLmRhdGEubXNnMy5lbmNyeXB0ZWRNZXNzYWdlLFxuICAgICAgICAgICAgc2lnbmF0dXJlOiBwYXJzZWRTaWduYXR1cmVTaGFyZS5kYXRhLm1zZzMuc2lnbmF0dXJlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICAgIH0sXG4gICAgW2dldEJpdEdvUGFydHlHcGdLZXkoYml0Z29HcGdLZXkpXSxcbiAgICBbZ2V0VXNlclBhcnR5R3BnS2V5KHVzZXJHcGdLZXksIHBhcnR5SWQpXVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Qml0R29QYXJ0eUdwZ0tleShrZXk6IG9wZW5wZ3AuS2V5LCBwYXJ0eUlkOiAwIHwgMSB8IDIgPSAyKTogRGtsc1R5cGVzLlBhcnR5R3BnS2V5IHtcbiAgcmV0dXJuIHtcbiAgICBwYXJ0eUlkOiBwYXJ0eUlkLFxuICAgIGdwZ0tleToga2V5LmFybW9yKCksXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRVc2VyUGFydHlHcGdLZXkoa2V5OiBvcGVucGdwLlNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz4sIHBhcnR5SWQ6IDAgfCAxID0gMCk6IERrbHNUeXBlcy5QYXJ0eUdwZ0tleSB7XG4gIHJldHVybiB7XG4gICAgcGFydHlJZDogcGFydHlJZCxcbiAgICBncGdLZXk6IGtleS5wcml2YXRlS2V5LFxuICB9O1xufVxuIl19

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


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