PHP WebShell

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

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

"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    var desc = Object.getOwnPropertyDescriptor(m, k);
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
      desc = { enumerable: true, get: function() { return m[k]; } };
    }
    Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
    Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
    o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
    var ownKeys = function(o) {
        ownKeys = Object.getOwnPropertyNames || function (o) {
            var ar = [];
            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
            return ar;
        };
        return ownKeys(o);
    };
    return function (mod) {
        if (mod && mod.__esModule) return mod;
        var result = {};
        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
        __setModuleDefault(result, mod);
        return result;
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.assertBaseTx = assertBaseTx;
exports.assertTxInput = assertTxInput;
exports.assertBip322TxProof = assertBip322TxProof;
exports.assertBip322PsbtProof = assertBip322PsbtProof;
const assert = __importStar(require("assert"));
const utxolib = __importStar(require("@bitgo/utxo-lib"));
const toSpend_1 = require("./toSpend");
function assertBaseTx(tx) {
    assert.deepStrictEqual(tx.version, 0, 'Transaction version must be 0.');
    assert.deepStrictEqual(tx.locktime, 0, 'Transaction locktime must be 0.');
    assert.deepStrictEqual(tx.outs.length, 1, 'Transaction must have exactly 1 output.');
    assert.deepStrictEqual(tx.outs[0].value, BigInt(0), 'Transaction output value must be 0.');
    assert.deepStrictEqual(tx.outs[0].script.toString('hex'), '6a', 'Transaction output script must be OP_RETURN.');
}
function assertTxInput(tx, inputIndex, prevOuts, info, checkSignature) {
    assert.ok(inputIndex < tx.ins.length, `inputIndex ${inputIndex} is out of range for tx with ${tx.ins.length} inputs.`);
    const input = tx.ins[inputIndex];
    assert.deepStrictEqual(input.index, 0, `transaction input ${inputIndex} must have index=0.`);
    assert.deepStrictEqual(input.sequence, 0, `transaction input ${inputIndex} sequence must be 0.`);
    // Make sure that the message is correctly encoded into the input of the transaction and
    // verify that the message info corresponds
    const scriptPubKey = utxolib.bitgo.outputScripts.createOutputScript2of3(info.pubkeys.map((pubkey) => Buffer.from(pubkey, 'hex')), info.scriptType, tx.network).scriptPubKey;
    assert.deepStrictEqual(info.address, utxolib.address.fromOutputScript(scriptPubKey, tx.network).toString(), `Address does not match derived scriptPubKey for input ${inputIndex}.`);
    const txid = utxolib.bitgo.getOutputIdForInput(input).txid;
    const toSpendTx = (0, toSpend_1.buildToSpendTransaction)(scriptPubKey, info.message);
    assert.deepStrictEqual(txid, toSpendTx.getId(), `Input ${inputIndex} derived to_spend transaction is not encoded in the input.`);
    if (checkSignature) {
        const signatureScript = utxolib.bitgo.parseSignatureScript2Of3(input);
        const scriptType = signatureScript.scriptType === 'taprootKeyPathSpend'
            ? 'p2trMusig2'
            : signatureScript.scriptType === 'taprootScriptPathSpend'
                ? 'p2tr'
                : signatureScript.scriptType;
        assert.deepStrictEqual(scriptType, info.scriptType, 'Script type does not match.');
        utxolib.bitgo.verifySignatureWithPublicKeys(tx, inputIndex, prevOuts, info.pubkeys.map((pubkey) => Buffer.from(pubkey, 'hex')));
    }
}
function assertBip322TxProof(tx, messageInfo) {
    assertBaseTx(tx);
    assert.deepStrictEqual(tx.ins.length, messageInfo.length, 'Transaction must have the same number of inputs as messageInfo entries.');
    const prevOuts = messageInfo.map((info) => {
        return {
            value: 0n,
            script: utxolib.bitgo.outputScripts.createOutputScript2of3(info.pubkeys.map((pubkey) => Buffer.from(pubkey, 'hex')), info.scriptType, tx.network).scriptPubKey,
        };
    });
    tx.ins.forEach((input, inputIndex) => assertTxInput(tx, inputIndex, prevOuts, messageInfo[inputIndex], true));
}
function assertBip322PsbtProof(psbt, messageInfo) {
    const unsignedTx = psbt.getUnsignedTx();
    assertBaseTx(unsignedTx);
    assert.deepStrictEqual(psbt.data.inputs.length, messageInfo.length, 'PSBT must have the same number of inputs as messageInfo entries.');
    const prevOuts = psbt.data.inputs.map((input, inputIndex) => {
        assert.ok(input.witnessUtxo, `PSBT input ${inputIndex} is missing witnessUtxo`);
        return input.witnessUtxo;
    });
    psbt.data.inputs.forEach((input, inputIndex) => {
        // Check that the metadata in the PSBT matches the messageInfo, then check the input data
        const info = messageInfo[inputIndex];
        // Check that the to_spend transaction is encoded in the nonWitnessUtxo
        assert.ok(input.nonWitnessUtxo, `PSBT input ${inputIndex} is missing nonWitnessUtxo`);
        const toSpendTx = (0, toSpend_1.buildToSpendTransaction)(prevOuts[inputIndex].script, info.message);
        assert.deepStrictEqual(input.nonWitnessUtxo.toString('hex'), toSpendTx.toHex());
        if (input.bip32Derivation) {
            input.bip32Derivation.forEach((b) => {
                const pubkey = b.pubkey.toString('hex');
                assert.ok(info.pubkeys.includes(pubkey), `PSBT input ${inputIndex} has a pubkey in (tap)bip32Derivation that is not in messageInfo`);
            });
        }
        else if (!input.tapBip32Derivation) {
            throw new Error(`PSBT input ${inputIndex} is missing (tap)bip32Derivation when it should have it.`);
        }
        // Verify the signature on the input
        assert.ok(psbt.validateSignaturesOfInputCommon(inputIndex), `PSBT input ${inputIndex} has an invalid signature.`);
        // Do not check the signature when using the PSBT, the signature is not there. We are going
        // to signatures in the PSBT.
        assertTxInput(unsignedTx, inputIndex, prevOuts, info, false);
    });
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyaWZ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JpcDMyMi92ZXJpZnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFjQSxvQ0FNQztBQUVELHNDQW9EQztBQUVELGtEQWtCQztBQUVELHNEQTJDQztBQTNJRCwrQ0FBaUM7QUFFakMseURBQTJDO0FBRTNDLHVDQUFvRDtBQVVwRCxTQUFnQixZQUFZLENBQUMsRUFBeUM7SUFDcEUsTUFBTSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxnQ0FBZ0MsQ0FBQyxDQUFDO0lBQ3hFLE1BQU0sQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsaUNBQWlDLENBQUMsQ0FBQztJQUMxRSxNQUFNLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSx5Q0FBeUMsQ0FBQyxDQUFDO0lBQ3JGLE1BQU0sQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLHFDQUFxQyxDQUFDLENBQUM7SUFDM0YsTUFBTSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxFQUFFLDhDQUE4QyxDQUFDLENBQUM7QUFDbEgsQ0FBQztBQUVELFNBQWdCLGFBQWEsQ0FDM0IsRUFBeUMsRUFDekMsVUFBa0IsRUFDbEIsUUFBb0MsRUFDcEMsSUFBaUIsRUFDakIsY0FBdUI7SUFFdkIsTUFBTSxDQUFDLEVBQUUsQ0FDUCxVQUFVLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQzFCLGNBQWMsVUFBVSxnQ0FBZ0Ms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QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5cbmltcG9ydCB7IGJ1aWxkVG9TcGVuZFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90b1NwZW5kJztcblxuZXhwb3J0IHR5cGUgTWVzc2FnZUluZm8gPSB7XG4gIGFkZHJlc3M6IHN0cmluZztcbiAgbWVzc2FnZTogc3RyaW5nO1xuICAvLyBIZXggZW5jb2RlZCBwdWJrZXlzXG4gIHB1YmtleXM6IHN0cmluZ1tdO1xuICBzY3JpcHRUeXBlOiB1dHhvbGliLmJpdGdvLm91dHB1dFNjcmlwdHMuU2NyaXB0VHlwZTJPZjM7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0QmFzZVR4KHR4OiB1dHhvbGliLmJpdGdvLlV0eG9UcmFuc2FjdGlvbjxiaWdpbnQ+KTogdm9pZCB7XG4gIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwodHgudmVyc2lvbiwgMCwgJ1RyYW5zYWN0aW9uIHZlcnNpb24gbXVzdCBiZSAwLicpO1xuICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHR4LmxvY2t0aW1lLCAwLCAnVHJhbnNhY3Rpb24gbG9ja3RpbWUgbXVzdCBiZSAwLicpO1xuICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHR4Lm91dHMubGVuZ3RoLCAxLCAnVHJhbnNhY3Rpb24gbXVzdCBoYXZlIGV4YWN0bHkgMSBvdXRwdXQuJyk7XG4gIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwodHgub3V0c1swXS52YWx1ZSwgQmlnSW50KDApLCAnVHJhbnNhY3Rpb24gb3V0cHV0IHZhbHVlIG11c3QgYmUgMC4nKTtcbiAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbCh0eC5vdXRzWzBdLnNjcmlwdC50b1N0cmluZygnaGV4JyksICc2YScsICdUcmFuc2FjdGlvbiBvdXRwdXQgc2NyaXB0IG11c3QgYmUgT1BfUkVUVVJOLicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VHhJbnB1dChcbiAgdHg6IHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD4sXG4gIGlucHV0SW5kZXg6IG51bWJlcixcbiAgcHJldk91dHM6IHV0eG9saWIuVHhPdXRwdXQ8YmlnaW50PltdLFxuICBpbmZvOiBNZXNzYWdlSW5mbyxcbiAgY2hlY2tTaWduYXR1cmU6IGJvb2xlYW5cbik6IHZvaWQge1xuICBhc3NlcnQub2soXG4gICAgaW5wdXRJbmRleCA8IHR4Lmlucy5sZW5ndGgsXG4gICAgYGlucHV0SW5kZXggJHtpbnB1dEluZGV4fSBpcyBvdXQgb2YgcmFuZ2UgZm9yIHR4IHdpdGggJHt0eC5pbnMubGVuZ3RofSBpbnB1dHMuYFxuICApO1xuICBjb25zdCBpbnB1dCA9IHR4Lmluc1tpbnB1dEluZGV4XTtcbiAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChpbnB1dC5pbmRleCwgMCwgYHRyYW5zYWN0aW9uIGlucHV0ICR7aW5wdXRJbmRleH0gbXVzdCBoYXZlIGluZGV4PTAuYCk7XG4gIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoaW5wdXQuc2VxdWVuY2UsIDAsIGB0cmFuc2FjdGlvbiBpbnB1dCAke2lucHV0SW5kZXh9IHNlcXVlbmNlIG11c3QgYmUgMC5gKTtcblxuICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgbWVzc2FnZSBpcyBjb3JyZWN0bHkgZW5jb2RlZCBpbnRvIHRoZSBpbnB1dCBvZiB0aGUgdHJhbnNhY3Rpb24gYW5kXG4gIC8vIHZlcmlmeSB0aGF0IHRoZSBtZXNzYWdlIGluZm8gY29ycmVzcG9uZHNcbiAgY29uc3Qgc2NyaXB0UHViS2V5ID0gdXR4b2xpYi5iaXRnby5vdXRwdXRTY3JpcHRzLmNyZWF0ZU91dHB1dFNjcmlwdDJvZjMoXG4gICAgaW5mby5wdWJrZXlzLm1hcCgocHVia2V5KSA9PiBCdWZmZXIuZnJvbShwdWJrZXksICdoZXgnKSksXG4gICAgaW5mby5zY3JpcHRUeXBlLFxuICAgIHR4Lm5ldHdvcmtcbiAgKS5zY3JpcHRQdWJLZXk7XG4gIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoXG4gICAgaW5mby5hZGRyZXNzLFxuICAgIHV0eG9saWIuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KHNjcmlwdFB1YktleSwgdHgubmV0d29yaykudG9TdHJpbmcoKSxcbiAgICBgQWRkcmVzcyBkb2VzIG5vdCBtYXRjaCBkZXJpdmVkIHNjcmlwdFB1YktleSBmb3IgaW5wdXQgJHtpbnB1dEluZGV4fS5gXG4gICk7XG5cbiAgY29uc3QgdHhpZCA9IHV0eG9saWIuYml0Z28uZ2V0T3V0cHV0SWRGb3JJbnB1dChpbnB1dCkudHhpZDtcbiAgY29uc3QgdG9TcGVuZFR4ID0gYnVpbGRUb1NwZW5kVHJhbnNhY3Rpb24oc2NyaXB0UHViS2V5LCBpbmZvLm1lc3NhZ2UpO1xuICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKFxuICAgIHR4aWQsXG4gICAgdG9TcGVuZFR4LmdldElkKCksXG4gICAgYElucHV0ICR7aW5wdXRJbmRleH0gZGVyaXZlZCB0b19zcGVuZCB0cmFuc2FjdGlvbiBpcyBub3QgZW5jb2RlZCBpbiB0aGUgaW5wdXQuYFxuICApO1xuXG4gIGlmIChjaGVja1NpZ25hdHVyZSkge1xuICAgIGNvbnN0IHNpZ25hdHVyZVNjcmlwdCA9IHV0eG9saWIuYml0Z28ucGFyc2VTaWduYXR1cmVTY3JpcHQyT2YzKGlucHV0KTtcbiAgICBjb25zdCBzY3JpcHRUeXBlID1cbiAgICAgIHNpZ25hdHVyZVNjcmlwdC5zY3JpcHRUeXBlID09PSAndGFwcm9vdEtleVBhdGhTcGVuZCdcbiAgICAgICAgPyAncDJ0ck11c2lnMidcbiAgICAgICAgOiBzaWduYXR1cmVTY3JpcHQuc2NyaXB0VHlwZSA9PT0gJ3RhcHJvb3RTY3JpcHRQYXRoU3BlbmQnXG4gICAgICAgID8gJ3AydHInXG4gICAgICAgIDogc2lnbmF0dXJlU2NyaXB0LnNjcmlwdFR5cGU7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChzY3JpcHRUeXBlLCBpbmZvLnNjcmlwdFR5cGUsICdTY3JpcHQgdHlwZSBkb2VzIG5vdCBtYXRjaC4nKTtcbiAgICB1dHhvbGliLmJpdGdvLnZlcmlmeVNpZ25hdHVyZVdpdGhQdWJsaWNLZXlzKFxuICAgICAgdHgsXG4gICAgICBpbnB1dEluZGV4LFxuICAgICAgcHJldk91dHMsXG4gICAgICBpbmZvLnB1YmtleXMubWFwKChwdWJrZXkpID0+IEJ1ZmZlci5mcm9tKHB1YmtleSwgJ2hleCcpKVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEJpcDMyMlR4UHJvb2YodHg6IHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD4sIG1lc3NhZ2VJbmZvOiBNZXNzYWdlSW5mb1tdKTogdm9pZCB7XG4gIGFzc2VydEJhc2VUeCh0eCk7XG4gIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoXG4gICAgdHguaW5zLmxlbmd0aCxcbiAgICBtZXNzYWdlSW5mby5sZW5ndGgsXG4gICAgJ1RyYW5zYWN0aW9uIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgaW5wdXRzIGFzIG1lc3NhZ2VJbmZvIGVudHJpZXMuJ1xuICApO1xuICBjb25zdCBwcmV2T3V0cyA9IG1lc3NhZ2VJbmZvLm1hcCgoaW5mbykgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogMG4sXG4gICAgICBzY3JpcHQ6IHV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5jcmVhdGVPdXRwdXRTY3JpcHQyb2YzKFxuICAgICAgICBpbmZvLnB1YmtleXMubWFwKChwdWJrZXkpID0+IEJ1ZmZlci5mcm9tKHB1YmtleSwgJ2hleCcpKSxcbiAgICAgICAgaW5mby5zY3JpcHRUeXBlLFxuICAgICAgICB0eC5uZXR3b3JrXG4gICAgICApLnNjcmlwdFB1YktleSxcbiAgICB9O1xuICB9KTtcbiAgdHguaW5zLmZvckVhY2goKGlucHV0LCBpbnB1dEluZGV4KSA9PiBhc3NlcnRUeElucHV0KHR4LCBpbnB1dEluZGV4LCBwcmV2T3V0cywgbWVzc2FnZUluZm9baW5wdXRJbmRleF0sIHRydWUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEJpcDMyMlBzYnRQcm9vZihwc2J0OiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0LCBtZXNzYWdlSW5mbzogTWVzc2FnZUluZm9bXSk6IHZvaWQge1xuICBjb25zdCB1bnNpZ25lZFR4ID0gcHNidC5nZXRVbnNpZ25lZFR4KCk7XG5cbiAgYXNzZXJ0QmFzZVR4KHVuc2lnbmVkVHgpO1xuICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKFxuICAgIHBzYnQuZGF0YS5pbnB1dHMubGVuZ3RoLFxuICAgIG1lc3NhZ2VJbmZvLmxlbmd0aCxcbiAgICAnUFNCVCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGlucHV0cyBhcyBtZXNzYWdlSW5mbyBlbnRyaWVzLidcbiAgKTtcblxuICBjb25zdCBwcmV2T3V0cyA9IHBzYnQuZGF0YS5pbnB1dHMubWFwKChpbnB1dCwgaW5wdXRJbmRleCkgPT4ge1xuICAgIGFzc2VydC5vayhpbnB1dC53aXRuZXNzVXR4bywgYFBTQlQgaW5wdXQgJHtpbnB1dEluZGV4fSBpcyBtaXNzaW5nIHdpdG5lc3NVdHhvYCk7XG4gICAgcmV0dXJuIGlucHV0LndpdG5lc3NVdHhvO1xuICB9KTtcblxuICBwc2J0LmRhdGEuaW5wdXRzLmZvckVhY2goKGlucHV0LCBpbnB1dEluZGV4KSA9PiB7XG4gICAgLy8gQ2hlY2sgdGhhdCB0aGUgbWV0YWRhdGEgaW4gdGhlIFBTQlQgbWF0Y2hlcyB0aGUgbWVzc2FnZUluZm8sIHRoZW4gY2hlY2sgdGhlIGlucHV0IGRhdGFcbiAgICBjb25zdCBpbmZvID0gbWVzc2FnZUluZm9baW5wdXRJbmRleF07XG5cbiAgICAvLyBDaGVjayB0aGF0IHRoZSB0b19zcGVuZCB0cmFuc2FjdGlvbiBpcyBlbmNvZGVkIGluIHRoZSBub25XaXRuZXNzVXR4b1xuICAgIGFzc2VydC5vayhpbnB1dC5ub25XaXRuZXNzVXR4bywgYFBTQlQgaW5wdXQgJHtpbnB1dEluZGV4fSBpcyBtaXNzaW5nIG5vbldpdG5lc3NVdHhvYCk7XG4gICAgY29uc3QgdG9TcGVuZFR4ID0gYnVpbGRUb1NwZW5kVHJhbnNhY3Rpb24ocHJldk91dHNbaW5wdXRJbmRleF0uc2NyaXB0LCBpbmZvLm1lc3NhZ2UpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoaW5wdXQubm9uV2l0bmVzc1V0eG8udG9TdHJpbmcoJ2hleCcpLCB0b1NwZW5kVHgudG9IZXgoKSk7XG5cbiAgICBpZiAoaW5wdXQuYmlwMzJEZXJpdmF0aW9uKSB7XG4gICAgICBpbnB1dC5iaXAzMkRlcml2YXRpb24uZm9yRWFjaCgoYikgPT4ge1xuICAgICAgICBjb25zdCBwdWJrZXkgPSBiLnB1YmtleS50b1N0cmluZygnaGV4Jyk7XG4gICAgICAgIGFzc2VydC5vayhcbiAgICAgICAgICBpbmZvLnB1YmtleXMuaW5jbHVkZXMocHVia2V5KSxcbiAgICAgICAgICBgUFNCVCBpbnB1dCAke2lucHV0SW5kZXh9IGhhcyBhIHB1YmtleSBpbiAodGFwKWJpcDMyRGVyaXZhdGlvbiB0aGF0IGlzIG5vdCBpbiBtZXNzYWdlSW5mb2BcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoIWlucHV0LnRhcEJpcDMyRGVyaXZhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQU0JUIGlucHV0ICR7aW5wdXRJbmRleH0gaXMgbWlzc2luZyAodGFwKWJpcDMyRGVyaXZhdGlvbiB3aGVuIGl0IHNob3VsZCBoYXZlIGl0LmApO1xuICAgIH1cblxuICAgIC8vIFZlcmlmeSB0aGUgc2lnbmF0dXJlIG9uIHRoZSBpbnB1dFxuICAgIGFzc2VydC5vayhwc2J0LnZhbGlkYXRlU2lnbmF0dXJlc09mSW5wdXRDb21tb24oaW5wdXRJbmRleCksIGBQU0JUIGlucHV0ICR7aW5wdXRJbmRleH0gaGFzIGFuIGludmFsaWQgc2lnbmF0dXJlLmApO1xuXG4gICAgLy8gRG8gbm90IGNoZWNrIHRoZSBzaWduYXR1cmUgd2hlbiB1c2luZyB0aGUgUFNCVCwgdGhlIHNpZ25hdHVyZSBpcyBub3QgdGhlcmUuIFdlIGFyZSBnb2luZ1xuICAgIC8vIHRvIHNpZ25hdHVyZXMgaW4gdGhlIFBTQlQuXG4gICAgYXNzZXJ0VHhJbnB1dCh1bnNpZ25lZFR4LCBpbnB1dEluZGV4LCBwcmV2T3V0cywgaW5mbywgZmFsc2UpO1xuICB9KTtcbn1cbiJdfQ==

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


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