PHP WebShell
Текущая директория: /opt/BitGoJS/modules/utxo-lib/dist/test/bitgo/psbt
Просмотр файла: signingAndValidation.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const assert = require("assert");
const mocha_1 = require("mocha");
const bs58check = require("bs58check");
const testutil_1 = require("../../../src/testutil");
const bitgo_1 = require("../../../src/bitgo");
const src_1 = require("../../../src");
const outputScripts_1 = require("../../../src/bitgo/outputScripts");
function getScriptTypes() {
return [...bitgo_1.outputScripts.scriptTypes2Of3, 'p2shP2pk'];
}
const walletKeys = (0, testutil_1.getDefaultWalletKeys)();
function runTest(scriptType, signerName, cosignerName, network) {
const signer = walletKeys[signerName];
const cosigner = walletKeys[cosignerName];
const networkName = (0, src_1.getNetworkName)(network);
const signingKeys = [
signerName === 'user' || (cosignerName === 'user' && scriptType !== 'p2shP2pk'),
signerName === 'backup' || (cosignerName === 'backup' && scriptType !== 'p2shP2pk'),
signerName === 'bitgo' || (cosignerName === 'bitgo' && scriptType !== 'p2shP2pk'),
];
(0, mocha_1.describe)(`UtxoPsbt ${[
`scriptType=${scriptType}`,
`network=${networkName}`,
`signer=${signerName}`,
`cosigner=${cosignerName}`,
].join(',')}`, function () {
let psbt;
before('create transaction', async function () {
// Build a fully hydrated UtxoPsbt
psbt = (0, bitgo_1.createPsbtForNetwork)({ network });
psbt.updateGlobal({
globalXpub: walletKeys.triple.map((bip32) => {
const extendedPubkey = bip32.neutered().toBase58();
return {
extendedPubkey: bs58check.decode(extendedPubkey),
masterFingerprint: bip32.fingerprint,
path: 'm',
};
}),
});
// Add the inputs
if (scriptType === 'p2shP2pk') {
const unspent = (0, testutil_1.mockReplayProtectionUnspent)(network, BigInt(1e8), { key: signer });
const { redeemScript } = (0, outputScripts_1.createOutputScriptP2shP2pk)(signer.publicKey);
assert(redeemScript);
(0, bitgo_1.addReplayProtectionUnspentToPsbt)(psbt, unspent, redeemScript);
}
else {
const unspents = (0, testutil_1.mockUnspents)(walletKeys, [scriptType], BigInt(1e8), network);
unspents.forEach((unspent) => (0, bitgo_1.addWalletUnspentToPsbt)(psbt, unspent, walletKeys, signerName, cosignerName, {
isReplaceableByFee: true,
}));
}
// Add the outputs
(0, bitgo_1.addWalletOutputToPsbt)(psbt, walletKeys, (0, bitgo_1.getInternalChainCode)('p2sh'), 0, BigInt(1e8 - 10000));
});
(0, mocha_1.it)('can go from unsigned to fully signed', async function () {
if (scriptType === 'p2trMusig2' && signerName === 'user' && cosignerName === 'bitgo') {
psbt.setAllInputsMusig2NonceHD(signer);
psbt.setAllInputsMusig2NonceHD(cosigner);
}
assert.ok(psbt.getSignatureValidationArray(0, { rootNodes: walletKeys.triple }).every((res) => !res));
if (scriptType === 'p2shP2pk') {
psbt.signAllInputs(signer);
}
else {
psbt.signAllInputsHD(signer);
psbt.signAllInputsHD(cosigner);
}
assert(psbt.validateSignaturesOfAllInputs());
assert.deepStrictEqual(psbt.getSignatureValidationArray(0, { rootNodes: walletKeys.triple }), signingKeys);
psbt.finalizeAllInputs();
const tx = psbt.extractTransaction();
assert(tx);
if (scriptType === 'p2shP2pk') {
tx.ins.forEach((input) => assert.strictEqual(input.sequence, bitgo_1.TX_INPUT_SEQUENCE_NUMBER_FINAL));
}
else {
tx.ins.forEach((input) => assert.strictEqual(input.sequence, bitgo_1.MAX_BIP125_RBF_SEQUENCE));
}
});
});
}
getScriptTypes().forEach((t) => {
runTest(t, 'user', 'bitgo', src_1.networks.bitcoin);
runTest(t, 'backup', 'user', src_1.networks.bitcoin);
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmluZ0FuZFZhbGlkYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L2JpdGdvL3BzYnQvc2lnbmluZ0FuZFZhbGlkYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxpQ0FBaUM7QUFDakMsaUNBQXFDO0FBQ3JDLHVDQUF1QztBQUV2QyxvREFBd0c7QUFDeEcsOENBWTRCO0FBQzVCLHNDQUFpRTtBQUNqRSxvRUFBOEU7QUFFOUUsU0FBUyxjQUFjO0lBQ3JCLE9BQU8sQ0FBQyxHQUFHLHFCQUFhLENBQUMsZUFBZSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ3hELENBQUM7QUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFBLCtCQUFvQixHQUFFLENBQUM7QUFDMUMsU0FBUyxPQUFPLENBQUMsVUFBb0MsRUFBRSxVQUFtQixFQUFFLFlBQXFCLEVBQUUsT0FBZ0I7SUFDakgsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUUxQyxNQUFNLFdBQVcsR0FBRyxJQUFBLG9CQUFjLEVBQUMsT0FBTyxDQUFDLENBQUM7SUFDNUMsTUFBTSxXQUFXLEdBQUc7UUFDbEIsVUFBVSxLQUFLLE1BQU0sSUFBSSxDQUFDLFlBQVksS0FBSyxNQUFNLElBQUksVUFBVSxLQUFLLFVBQVUsQ0FBQztRQUMvRSxVQUFVLEtBQUssUUFBUSxJQUFJLENBQUMsWUFBWSxLQUFLLFFBQVEsSUFBSSxVQUFVLEtBQUssVUFBVSxDQUFDO1FBQ25GLFVBQVUsS0FBSyxPQUFPLElBQUksQ0FBQyxZQUFZLEtBQUssT0FBTyxJQUFJLFVBQVUsS0FBSyxVQUFVLENBQUM7S0FDbEYsQ0FBQztJQUVGLElBQUEsZ0JBQVEsRUFBQyxZQUFZO1FBQ25CLGNBQWMsVUFBVSxFQUFFO1FBQzFCLFdBQVcsV0FBVyxFQUFFO1FBQ3hCLFVBQVUsVUFBVSxFQUFFO1FBQ3RCLFlBQVksWUFBWSxFQUFFO0tBQzNCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUU7UUFDYixJQUFJLElBQWMsQ0FBQztRQUNuQixNQUFNLENBQUMsb0JBQW9CLEVBQUUsS0FBSztZQUNoQyxrQ0FBa0M7WUFDbEMsSUFBSSxHQUFHLElBQUEsNEJBQW9CLEVBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxZQUFZLENBQUM7Z0JBQ2hCLFVBQVUsRUFBRSxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO29CQUMxQyxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ25ELE9BQU87d0JBQ0wsY0FBYyxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDO3dCQUNoRCxpQkFBaUIsRUFBRSxLQUFLLENBQUMsV0FBVzt3QkFDcEMsSUFBSSxFQUFFLEdBQUc7cUJBQ1YsQ0FBQztnQkFDSixDQUFDLENBQUM7YUFDSCxDQUFDLENBQUM7WUFFSCxpQkFBaUI7WUFDakIsSUFBSSxVQUFVLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQzlCLE1BQU0sT0FBTyxHQUFHLElBQUEsc0NBQTJCLEVBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO2dCQUNuRixNQUFNLEVBQUUsWUFBWSxFQUFFLEdBQUcsSUFBQSwwQ0FBMEIsRUFBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3RFLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDckIsSUFBQSx3Q0FBZ0MsRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQ2hFLENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLFFBQVEsR0FBRyxJQUFBLHVCQUFZLEVBQUMsVUFBVSxFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBNEIsQ0FBQztnQkFDekcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQzNCLElBQUEsOEJBQXNCLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRTtvQkFDMUUsa0JBQWtCLEVBQUUsSUFBSTtpQkFDekIsQ0FBQyxDQUNILENBQUM7WUFDSixDQUFDO1lBRUQsa0JBQWtCO1lBQ2xCLElBQUEsNkJBQXFCLEVBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFBLDRCQUFvQixFQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDaEcsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFBLFVBQUUsRUFBQyxzQ0FBc0MsRUFBRSxLQUFLO1lBQzlDLElBQUksVUFBVSxLQUFLLFlBQVksSUFBSSxVQUFVLEtBQUssTUFBTSxJQUFJLFlBQVksS0FBSyxPQUFPLEVBQUUsQ0FBQztnQkFDckYsSUFBSSxDQUFDLHlCQUF5QixDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN2QyxJQUFJLENBQUMseUJBQXlCLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDM0MsQ0FBQztZQUNELE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN0RyxJQUFJLFVBQVUsS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDOUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM3QixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNqQyxDQUFDO1lBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFDLENBQUM7WUFDN0MsTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQzNHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNYLElBQUksVUFBVSxLQUFLLFVBQVUsRUFBRSxDQUFDO2dCQUM5QixFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLHNDQUE4QixDQUFDLENBQUMsQ0FBQztZQUNoRyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSwrQkFBdUIsQ0FBQyxDQUFDLENBQUM7WUFDekYsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsY0FBYyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7SUFDN0IsT0FBTyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLGNBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5QyxPQUFPLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsY0FBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ2pELENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBkZXNjcmliZSwgaXQgfSBmcm9tICdtb2NoYSc7XG5pbXBvcnQgKiBhcyBiczU4Y2hlY2sgZnJvbSAnYnM1OGNoZWNrJztcblxuaW1wb3J0IHsgZ2V0RGVmYXVsdFdhbGxldEtleXMsIG1vY2tSZXBsYXlQcm90ZWN0aW9uVW5zcGVudCwgbW9ja1Vuc3BlbnRzIH0gZnJvbSAnLi4vLi4vLi4vc3JjL3Rlc3R1dGlsJztcbmltcG9ydCB7XG4gIGFkZFJlcGxheVByb3RlY3Rpb25VbnNwZW50VG9Qc2J0LFxuICBhZGRXYWxsZXRPdXRwdXRUb1BzYnQsXG4gIGFkZFdhbGxldFVuc3BlbnRUb1BzYnQsXG4gIGNyZWF0ZVBzYnRGb3JOZXR3b3JrLFxuICBNQVhfQklQMTI1X1JCRl9TRVFVRU5DRSxcbiAgVFhfSU5QVVRfU0VRVUVOQ0VfTlVNQkVSX0ZJTkFMLFxuICBnZXRJbnRlcm5hbENoYWluQ29kZSxcbiAgS2V5TmFtZSxcbiAgb3V0cHV0U2NyaXB0cyxcbiAgVXR4b1BzYnQsXG4gIFdhbGxldFVuc3BlbnQsXG59IGZyb20gJy4uLy4uLy4uL3NyYy9iaXRnbyc7XG5pbXBvcnQgeyBnZXROZXR3b3JrTmFtZSwgTmV0d29yaywgbmV0d29ya3MgfSBmcm9tICcuLi8uLi8uLi9zcmMnO1xuaW1wb3J0IHsgY3JlYXRlT3V0cHV0U2NyaXB0UDJzaFAycGsgfSBmcm9tICcuLi8uLi8uLi9zcmMvYml0Z28vb3V0cHV0U2NyaXB0cyc7XG5cbmZ1bmN0aW9uIGdldFNjcmlwdFR5cGVzKCk6IG91dHB1dFNjcmlwdHMuU2NyaXB0VHlwZVtdIHtcbiAgcmV0dXJuIFsuLi5vdXRwdXRTY3JpcHRzLnNjcmlwdFR5cGVzMk9mMywgJ3Ayc2hQMnBrJ107XG59XG5cbmNvbnN0IHdhbGxldEtleXMgPSBnZXREZWZhdWx0V2FsbGV0S2V5cygpO1xuZnVuY3Rpb24gcnVuVGVzdChzY3JpcHRUeXBlOiBvdXRwdXRTY3JpcHRzLlNjcmlwdFR5cGUsIHNpZ25lck5hbWU6IEtleU5hbWUsIGNvc2lnbmVyTmFtZTogS2V5TmFtZSwgbmV0d29yazogTmV0d29yaykge1xuICBjb25zdCBzaWduZXIgPSB3YWxsZXRLZXlzW3NpZ25lck5hbWVdO1xuICBjb25zdCBjb3NpZ25lciA9IHdhbGxldEtleXNbY29zaWduZXJOYW1lXTtcblxuICBjb25zdCBuZXR3b3JrTmFtZSA9IGdldE5ldHdvcmtOYW1lKG5ldHdvcmspO1xuICBjb25zdCBzaWduaW5nS2V5cyA9IFtcbiAgICBzaWduZXJOYW1lID09PSAndXNlcicgfHwgKGNvc2lnbmVyTmFtZSA9PT0gJ3VzZXInICYmIHNjcmlwdFR5cGUgIT09ICdwMnNoUDJwaycpLFxuICAgIHNpZ25lck5hbWUgPT09ICdiYWNrdXAnIHx8IChjb3NpZ25lck5hbWUgPT09ICdiYWNrdXAnICYmIHNjcmlwdFR5cGUgIT09ICdwMnNoUDJwaycpLFxuICAgIHNpZ25lck5hbWUgPT09ICdiaXRnbycgfHwgKGNvc2lnbmVyTmFtZSA9PT0gJ2JpdGdvJyAmJiBzY3JpcHRUeXBlICE9PSAncDJzaFAycGsnKSxcbiAgXTtcblxuICBkZXNjcmliZShgVXR4b1BzYnQgJHtbXG4gICAgYHNjcmlwdFR5cGU9JHtzY3JpcHRUeXBlfWAsXG4gICAgYG5ldHdvcms9JHtuZXR3b3JrTmFtZX1gLFxuICAgIGBzaWduZXI9JHtzaWduZXJOYW1lfWAsXG4gICAgYGNvc2lnbmVyPSR7Y29zaWduZXJOYW1lfWAsXG4gIF0uam9pbignLCcpfWAsIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgcHNidDogVXR4b1BzYnQ7XG4gICAgYmVmb3JlKCdjcmVhdGUgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBCdWlsZCBhIGZ1bGx5IGh5ZHJhdGVkIFV0eG9Qc2J0XG4gICAgICBwc2J0ID0gY3JlYXRlUHNidEZvck5ldHdvcmsoeyBuZXR3b3JrIH0pO1xuICAgICAgcHNidC51cGRhdGVHbG9iYWwoe1xuICAgICAgICBnbG9iYWxYcHViOiB3YWxsZXRLZXlzLnRyaXBsZS5tYXAoKGJpcDMyKSA9PiB7XG4gICAgICAgICAgY29uc3QgZXh0ZW5kZWRQdWJrZXkgPSBiaXAzMi5uZXV0ZXJlZCgpLnRvQmFzZTU4KCk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGV4dGVuZGVkUHVia2V5OiBiczU4Y2hlY2suZGVjb2RlKGV4dGVuZGVkUHVia2V5KSxcbiAgICAgICAgICAgIG1hc3RlckZpbmdlcnByaW50OiBiaXAzMi5maW5nZXJwcmludCxcbiAgICAgICAgICAgIHBhdGg6ICdtJyxcbiAgICAgICAgICB9O1xuICAgICAgICB9KSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBBZGQgdGhlIGlucHV0c1xuICAgICAgaWYgKHNjcmlwdFR5cGUgPT09ICdwMnNoUDJwaycpIHtcbiAgICAgICAgY29uc3QgdW5zcGVudCA9IG1vY2tSZXBsYXlQcm90ZWN0aW9uVW5zcGVudChuZXR3b3JrLCBCaWdJbnQoMWU4KSwgeyBrZXk6IHNpZ25lciB9KTtcbiAgICAgICAgY29uc3QgeyByZWRlZW1TY3JpcHQgfSA9IGNyZWF0ZU91dHB1dFNjcmlwdFAyc2hQMnBrKHNpZ25lci5wdWJsaWNLZXkpO1xuICAgICAgICBhc3NlcnQocmVkZWVtU2NyaXB0KTtcbiAgICAgICAgYWRkUmVwbGF5UHJvdGVjdGlvblVuc3BlbnRUb1BzYnQocHNidCwgdW5zcGVudCwgcmVkZWVtU2NyaXB0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHVuc3BlbnRzID0gbW9ja1Vuc3BlbnRzKHdhbGxldEtleXMsIFtzY3JpcHRUeXBlXSwgQmlnSW50KDFlOCksIG5ldHdvcmspIGFzIFdhbGxldFVuc3BlbnQ8YmlnaW50PltdO1xuICAgICAgICB1bnNwZW50cy5mb3JFYWNoKCh1bnNwZW50KSA9PlxuICAgICAgICAgIGFkZFdhbGxldFVuc3BlbnRUb1BzYnQocHNidCwgdW5zcGVudCwgd2FsbGV0S2V5cywgc2lnbmVyTmFtZSwgY29zaWduZXJOYW1lLCB7XG4gICAgICAgICAgICBpc1JlcGxhY2VhYmxlQnlGZWU6IHRydWUsXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIHRoZSBvdXRwdXRzXG4gICAgICBhZGRXYWxsZXRPdXRwdXRUb1BzYnQocHNidCwgd2FsbGV0S2V5cywgZ2V0SW50ZXJuYWxDaGFpbkNvZGUoJ3Ayc2gnKSwgMCwgQmlnSW50KDFlOCAtIDEwMDAwKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2FuIGdvIGZyb20gdW5zaWduZWQgdG8gZnVsbHkgc2lnbmVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHNjcmlwdFR5cGUgPT09ICdwMnRyTXVzaWcyJyAmJiBzaWduZXJOYW1lID09PSAndXNlcicgJiYgY29zaWduZXJOYW1lID09PSAnYml0Z28nKSB7XG4gICAgICAgIHBzYnQuc2V0QWxsSW5wdXRzTXVzaWcyTm9uY2VIRChzaWduZXIpO1xuICAgICAgICBwc2J0LnNldEFsbElucHV0c011c2lnMk5vbmNlSEQoY29zaWduZXIpO1xuICAgICAgfVxuICAgICAgYXNzZXJ0Lm9rKHBzYnQuZ2V0U2lnbmF0dXJlVmFsaWRhdGlvbkFycmF5KDAsIHsgcm9vdE5vZGVzOiB3YWxsZXRLZXlzLnRyaXBsZSB9KS5ldmVyeSgocmVzKSA9PiAhcmVzKSk7XG4gICAgICBpZiAoc2NyaXB0VHlwZSA9PT0gJ3Ayc2hQMnBrJykge1xuICAgICAgICBwc2J0LnNpZ25BbGxJbnB1dHMoc2lnbmVyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBzYnQuc2lnbkFsbElucHV0c0hEKHNpZ25lcik7XG4gICAgICAgIHBzYnQuc2lnbkFsbElucHV0c0hEKGNvc2lnbmVyKTtcbiAgICAgIH1cbiAgICAgIGFzc2VydChwc2J0LnZhbGlkYXRlU2lnbmF0dXJlc09mQWxsSW5wdXRzKCkpO1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChwc2J0LmdldFNpZ25hdHVyZVZhbGlkYXRpb25BcnJheSgwLCB7IHJvb3ROb2Rlczogd2FsbGV0S2V5cy50cmlwbGUgfSksIHNpZ25pbmdLZXlzKTtcbiAgICAgIHBzYnQuZmluYWxpemVBbGxJbnB1dHMoKTtcbiAgICAgIGNvbnN0IHR4ID0gcHNidC5leHRyYWN0VHJhbnNhY3Rpb24oKTtcbiAgICAgIGFzc2VydCh0eCk7XG4gICAgICBpZiAoc2NyaXB0VHlwZSA9PT0gJ3Ayc2hQMnBrJykge1xuICAgICAgICB0eC5pbnMuZm9yRWFjaCgoaW5wdXQpID0+IGFzc2VydC5zdHJpY3RFcXVhbChpbnB1dC5zZXF1ZW5jZSwgVFhfSU5QVVRfU0VRVUVOQ0VfTlVNQkVSX0ZJTkFMKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0eC5pbnMuZm9yRWFjaCgoaW5wdXQpID0+IGFzc2VydC5zdHJpY3RFcXVhbChpbnB1dC5zZXF1ZW5jZSwgTUFYX0JJUDEyNV9SQkZfU0VRVUVOQ0UpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbmdldFNjcmlwdFR5cGVzKCkuZm9yRWFjaCgodCkgPT4ge1xuICBydW5UZXN0KHQsICd1c2VyJywgJ2JpdGdvJywgbmV0d29ya3MuYml0Y29pbik7XG4gIHJ1blRlc3QodCwgJ2JhY2t1cCcsICd1c2VyJywgbmV0d29ya3MuYml0Y29pbik7XG59KTtcbiJdfQ==Выполнить команду
Для локальной разработки. Не используйте в интернете!