PHP WebShell

Текущая директория: /opt/BitGoJS/modules/account-lib/dist/test/unit/mpc/tss/eddsa

Просмотр файла: eddsa.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;
    };
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
/**
 * @prettier
 */
require("should");
const assert_1 = __importDefault(require("assert"));
const bs58 = __importStar(require("bs58"));
const crypto_1 = require("crypto");
const sol = __importStar(require("@solana/web3.js"));
const src_1 = require("../../../../../src");
const sdk_core_1 = require("@bitgo/sdk-core");
describe('TSS EDDSA key generation and signing', function () {
    let MPC;
    let hdTree;
    before('initialize modules', async function () {
        hdTree = await sdk_core_1.Ed25519BIP32.initialize();
        MPC = await sdk_core_1.Eddsa.initialize(hdTree);
    });
    it('should fail to generate keys with invalid config', function () {
        assert_1.default.throws(() => MPC.keyShare(0, 2, 3), /Invalid KeyShare config/);
        assert_1.default.throws(() => MPC.keyShare(5, 2, 3), /Invalid KeyShare config/);
    });
    it('should sign and verify signature for low number public key', function () {
        // We use little endian encoding. This means that the following value is a number that is shorter than 32 Bytes when
        // leading zeroes are cut off. This is exactly what happened when we passed it to the sodium library for verifying
        // the signature against the public key.
        const y = '991b12a1b41b966a3382db32fe9b7fa9f80433940d0b17a1759f1e45ada83f00';
        const R = 'b14386bb518b675357a4c79d2439166a5fc5a3a0e1c579c7b829eff1e7a7d967';
        const signableHex = '01000307991b12a1b41b966a3382db32fe9b7fa9f80433940d0b17a1759f1e45ada83f0041536a20902b6d253b111fe5abe87757c123c28cc5fe4eb0da11b5857f3f38e65290384154058de76870e94672fc02e5f96f23e99307f08c56073ebea94cbc57d4d6429b650666264cbcdfe6070749d586d32781608958931e9b8d01636c4f320000000000000000000000000000000000000000000000000000000000000000b43af3bab20c3f39ef3c148c85640614a41043eeb306de5996380f10ec105a8e06ddf6e1d765a193d9cbe146ceeb79ac1cb485ed5f5b37913a8cf5857eff00a91073eab4660e8e3a957c7820d52df6338a8c7b60103bf903cb5f82118430922b02040200030c020000005819b217000000000604010502000a0cf40100000000000009';
        const userToBitgoGShare = {
            i: 1,
            y,
            R,
            gamma: 'fcfd96d4ee4f3399b728b3c820a8eed4a6fa496828e84af2756197993b5df30b',
        };
        const bitgoToUserGShare = {
            i: 3,
            y,
            R,
            gamma: '89d5e45641dc93539a32a6651eaae2448db4d44f6d3040a1390beb14d0225c00',
        };
        const signature = MPC.signCombine([userToBitgoGShare, bitgoToUserGShare]);
        const signablePayloadBuffer = Buffer.from(signableHex, 'hex');
        const verificationResult = MPC.verify(signablePayloadBuffer, signature);
        verificationResult.should.be.true();
    });
    it('should generate keys and sign message', function () {
        const A = MPC.keyShare(1, 2, 3);
        const B = MPC.keyShare(2, 2, 3);
        const C = MPC.keyShare(3, 2, 3);
        const A_combine = MPC.keyCombine(A.uShare, [B.yShares[1], C.yShares[1]]);
        const B_combine = MPC.keyCombine(B.uShare, [A.yShares[2], C.yShares[2]]);
        const C_combine = MPC.keyCombine(C.uShare, [A.yShares[3], B.yShares[3]]);
        const message = 'MPC on a Friday night';
        const message_buffer = Buffer.from(message);
        const incorrect_message = 'MPC on a Monday night';
        const incorrect_message_buffer = Buffer.from(incorrect_message);
        // signing with A and B
        let A_sign_share = MPC.signShare(message_buffer, A_combine.pShare, [A_combine.jShares[2]]);
        let B_sign_share = MPC.signShare(message_buffer, B_combine.pShare, [B_combine.jShares[1]]);
        let A_sign = MPC.sign(message_buffer, A_sign_share.xShare, [B_sign_share.rShares[1]], [C.yShares[1]]);
        let B_sign = MPC.sign(message_buffer, B_sign_share.xShare, [A_sign_share.rShares[2]], [C.yShares[2]]);
        let signature = MPC.signCombine([A_sign, B_sign]);
        let result = MPC.verify(message_buffer, signature);
        result.should.equal(true);
        let resultTwo = MPC.verify(incorrect_message_buffer, signature);
        resultTwo.should.equal(false);
        // signing with A and C
        A_sign_share = MPC.signShare(message_buffer, A_combine.pShare, [A_combine.jShares[3]]);
        let C_sign_share = MPC.signShare(message_buffer, C_combine.pShare, [C_combine.jShares[1]]);
        A_sign = MPC.sign(message_buffer, A_sign_share.xShare, [C_sign_share.rShares[1]], [B.yShares[1]]);
        let C_sign = MPC.sign(message_buffer, C_sign_share.xShare, [A_sign_share.rShares[3]], [B.yShares[3]]);
        signature = MPC.signCombine([A_sign, C_sign]);
        result = MPC.verify(message_buffer, signature);
        result.should.equal(true);
        resultTwo = MPC.verify(incorrect_message_buffer, signature);
        resultTwo.should.equal(false);
        // signing with B and C
        B_sign_share = MPC.signShare(message_buffer, B_combine.pShare, [B_combine.jShares[3]]);
        C_sign_share = MPC.signShare(message_buffer, C_combine.pShare, [C_combine.jShares[2]]);
        B_sign = MPC.sign(message_buffer, B_sign_share.xShare, [C_sign_share.rShares[2]], [A.yShares[2]]);
        C_sign = MPC.sign(message_buffer, C_sign_share.xShare, [B_sign_share.rShares[3]], [A.yShares[3]]);
        signature = MPC.signCombine([B_sign, C_sign]);
        result = MPC.verify(message_buffer, signature);
        result.should.equal(true);
        resultTwo = MPC.verify(incorrect_message_buffer, signature);
        resultTwo.should.equal(false);
    });
    it('should verify BIP32 subkey signature', function () {
        const path = 'm/0/1/2';
        const A = MPC.keyShare(1, 2, 3);
        const B = MPC.keyShare(2, 2, 3);
        const C = MPC.keyShare(3, 2, 3);
        // Combine shares to common base address.
        const A_combine = MPC.keyCombine(A.uShare, [B.yShares[1], C.yShares[1]]);
        const B_combine = MPC.keyCombine(B.uShare, [A.yShares[2], C.yShares[2]]);
        // Party A derives subkey P share and new Y shares.
        const A_subkey = MPC.keyDerive(A.uShare, [B.yShares[1], C.yShares[1]], path);
        // Party B calculates new P share using party A's subkey Y shares.
        const B_subkey = MPC.keyCombine(B.uShare, [A_subkey.yShares[2], C.yShares[2]]);
        // Derive the public subkeychain separately using the common keychain.
        const subkey = hdTree.publicDerive({
            pk: (0, sdk_core_1.bigIntFromBufferLE)(Buffer.from(A_combine.pShare.y, 'hex')),
            chaincode: (0, sdk_core_1.bigIntFromBufferBE)(Buffer.from(A_combine.pShare.chaincode, 'hex')),
        }, path);
        const y = (0, sdk_core_1.bigIntToBufferLE)(subkey.pk, 32).toString('hex');
        const chaincode = (0, sdk_core_1.bigIntToBufferBE)(subkey.chaincode, 32).toString('hex');
        // Verify the keychain in the subkey P shares equals the separately derived public subkeychain.
        A_subkey.pShare.y.should.equal(y);
        A_subkey.pShare.chaincode.should.equal(chaincode);
        B_subkey.pShare.y.should.equal(y);
        B_subkey.pShare.chaincode.should.equal(chaincode);
        const message = 'MPC on a Friday night';
        const message_buffer = Buffer.from(message);
        // Signing with A and B using subkey P shares.
        const A_sign_share = MPC.signShare(message_buffer, A_subkey.pShare, [A_combine.jShares[2]]);
        const B_sign_share = MPC.signShare(message_buffer, B_subkey.pShare, [B_combine.jShares[1]]);
        const A_sign = MPC.sign(message_buffer, A_sign_share.xShare, [B_sign_share.rShares[1]], [C.yShares[1]]);
        const B_sign = MPC.sign(message_buffer, B_sign_share.xShare, [A_sign_share.rShares[2]], [C.yShares[2]]);
        const signature = MPC.signCombine([A_sign, B_sign]);
        const result = MPC.verify(message_buffer, signature);
        result.should.equal(true);
        // Verify the public key in the signature equals the separately derived public subkey.
        signature.y.should.equal(y);
    });
    it('should derive unhardened child keys', function () {
        const A = MPC.keyShare(1, 2, 3);
        const B = MPC.keyShare(2, 2, 3);
        const C = MPC.keyShare(3, 2, 3);
        const A_combine = MPC.keyCombine(A.uShare, [B.yShares[1], C.yShares[1]]);
        const commonKeychain = A_combine.pShare.y + A_combine.pShare.chaincode;
        for (let index = 0; index < 10; index++) {
            const path = `m/0/0/${index}`;
            const derive1 = MPC.deriveUnhardened(commonKeychain, path);
            const subkey = MPC.keyDerive(A.uShare, [B.yShares[1], C.yShares[1]], path);
            const derive2 = MPC.deriveUnhardened(commonKeychain, path);
            const derivedPk = derive1.slice(0, 64);
            (subkey.pShare.y + subkey.pShare.chaincode).should.equal(derive1);
            derive1.should.equal(derive2, 'derivation should be deterministic');
            const solAddress = bs58.encode(Buffer.from(derivedPk, 'hex'));
            src_1.Sol.Utils.isValidPublicKey(solAddress).should.be.true();
            const solPk = new sol.PublicKey(solAddress);
            solPk.toBuffer().toString('hex').should.equal(derivedPk);
        }
        const rootPath = 'm/0';
        const rootKeychain = MPC.deriveUnhardened(commonKeychain, rootPath);
        const rootPublicKey = Buffer.from(rootKeychain, 'hex').slice(0, 32).toString('hex');
        const solPk = new sol.PublicKey(bs58.encode(Buffer.from(rootPublicKey, 'hex')));
        solPk.toBuffer().toString('hex').should.equal(rootPublicKey);
    });
    it('should derive unhardened valid dot child keys', function () {
        const A = MPC.keyShare(1, 2, 3);
        const B = MPC.keyShare(2, 2, 3);
        const C = MPC.keyShare(3, 2, 3);
        const A_combine = MPC.keyCombine(A.uShare, [B.yShares[1], C.yShares[1]]);
        const commonKeychain = A_combine.pShare.y + A_combine.pShare.chaincode;
        for (let index = 0; index < 10; index++) {
            const path = `m/0/0/${index}`;
            const derive1 = MPC.deriveUnhardened(commonKeychain, path);
            const derive2 = MPC.deriveUnhardened(commonKeychain, path);
            const derivedPk = Buffer.from(derive1, 'hex').slice(0, 32).toString('hex');
            derive1.should.equal(derive2, 'derivation should be deterministic');
            const pubKeyPair = new src_1.Dot.KeyPair({ pub: derivedPk });
            pubKeyPair.getKeys().pub.should.equal(derivedPk);
        }
        const rootPath = 'm/';
        const rootKeychain = MPC.deriveUnhardened(commonKeychain, rootPath);
        const rootPublicKey = Buffer.from(rootKeychain, 'hex').slice(0, 32).toString('hex');
        const pubKeyPair = new src_1.Dot.KeyPair({ pub: rootPublicKey });
        pubKeyPair.getKeys().pub.should.equal(rootPublicKey);
    });
    it('should fail signing without meeting threshold', function () {
        const A = MPC.keyShare(1, 2, 3);
        const B = MPC.keyShare(2, 2, 3);
        const C = MPC.keyShare(3, 2, 3);
        const A_combine = MPC.keyCombine(A.uShare, [B.yShares[1], C.yShares[1]]);
        const B_combine = MPC.keyCombine(B.uShare, [A.yShares[2], C.yShares[2]]);
        const message = 'MPC on a Friday night';
        const message_buffer = Buffer.from(message, 'utf-8');
        const A_sign_share = MPC.signShare(message_buffer, A_combine.pShare, [A_combine.jShares[2]]);
        const B_sign_share = MPC.signShare(message_buffer, B_combine.pShare, [B_combine.jShares[1]]);
        const A_sign = MPC.sign(message_buffer, A_sign_share.xShare, [B_sign_share.rShares[1]]);
        const signature = MPC.signCombine([A_sign]);
        MPC.verify(message_buffer, signature).should.equal(false);
    });
    describe('with specific seed', function () {
        it('should generate keys and sign message', function () {
            const seed = (0, crypto_1.randomBytes)(64);
            const A = MPC.keyShare(1, 2, 3, seed);
            const B = MPC.keyShare(2, 2, 3, seed);
            const C = MPC.keyShare(3, 2, 3, seed);
            // Keys should be deterministic when using seed
            MPC.keyShare(1, 2, 3, seed).should.deepEqual(A);
            MPC.keyShare(2, 2, 3, seed).should.deepEqual(B);
            MPC.keyShare(3, 2, 3, seed).should.deepEqual(C);
            const A_combine = MPC.keyCombine(A.uShare, [B.yShares[1], C.yShares[1]]);
            const B_combine = MPC.keyCombine(B.uShare, [A.yShares[2], C.yShares[2]]);
            const C_combine = MPC.keyCombine(C.uShare, [A.yShares[3], B.yShares[3]]);
            const message = 'MPC on a Friday night';
            const message_buffer = Buffer.from(message);
            // signing with A and B
            let A_sign_share = MPC.signShare(message_buffer, A_combine.pShare, [A_combine.jShares[2]], seed);
            let B_sign_share = MPC.signShare(message_buffer, B_combine.pShare, [B_combine.jShares[1]], seed);
            let A_sign = MPC.sign(message_buffer, A_sign_share.xShare, [B_sign_share.rShares[1]], [C.yShares[1]]);
            let B_sign = MPC.sign(message_buffer, B_sign_share.xShare, [A_sign_share.rShares[2]], [C.yShares[2]]);
            let signature = MPC.signCombine([A_sign, B_sign]);
            let result = MPC.verify(message_buffer, signature);
            result.should.equal(true);
            // signing with A and C
            A_sign_share = MPC.signShare(message_buffer, A_combine.pShare, [A_combine.jShares[3]], seed);
            let C_sign_share = MPC.signShare(message_buffer, C_combine.pShare, [C_combine.jShares[1]], seed);
            A_sign = MPC.sign(message_buffer, A_sign_share.xShare, [C_sign_share.rShares[1]], [B.yShares[1]]);
            let C_sign = MPC.sign(message_buffer, C_sign_share.xShare, [A_sign_share.rShares[3]], [B.yShares[3]]);
            signature = MPC.signCombine([A_sign, C_sign]);
            result = MPC.verify(message_buffer, signature);
            result.should.equal(true);
            // signing with B and C
            B_sign_share = MPC.signShare(message_buffer, B_combine.pShare, [B_combine.jShares[3]], seed);
            C_sign_share = MPC.signShare(message_buffer, C_combine.pShare, [C_combine.jShares[2]], seed);
            B_sign = MPC.sign(message_buffer, B_sign_share.xShare, [C_sign_share.rShares[2]], [A.yShares[2]]);
            C_sign = MPC.sign(message_buffer, C_sign_share.xShare, [B_sign_share.rShares[3]], [A.yShares[3]]);
            signature = MPC.signCombine([B_sign, C_sign]);
            result = MPC.verify(message_buffer, signature);
            result.should.equal(true);
        });
        it('should verify BIP32 subkey signature', function () {
            const seed = (0, crypto_1.randomBytes)(64);
            const path = 'm/0/1/2';
            const A = MPC.keyShare(1, 2, 3, seed);
            const B = MPC.keyShare(2, 2, 3, seed);
            const C = MPC.keyShare(3, 2, 3, seed);
            // Keys should be deterministic when using seed
            MPC.keyShare(1, 2, 3, seed).should.deepEqual(A);
            MPC.keyShare(2, 2, 3, seed).should.deepEqual(B);
            MPC.keyShare(3, 2, 3, seed).should.deepEqual(C);
            // Combine shares to common base address.
            const A_combine = MPC.keyCombine(A.uShare, [B.yShares[1], C.yShares[1]]);
            const B_combine = MPC.keyCombine(B.uShare, [A.yShares[2], C.yShares[2]]);
            // Party A derives subkey P share and new Y shares.
            const A_subkey = MPC.keyDerive(A.uShare, [B.yShares[1], C.yShares[1]], path);
            // Party B calculates new P share using party A's subkey Y shares.
            const B_subkey = MPC.keyCombine(B.uShare, [A_subkey.yShares[2], C.yShares[2]]);
            // Derive the public subkeychain separately using the common keychain.
            const subkey = hdTree.publicDerive({
                pk: (0, sdk_core_1.bigIntFromBufferLE)(Buffer.from(A_combine.pShare.y, 'hex')),
                chaincode: (0, sdk_core_1.bigIntFromBufferBE)(Buffer.from(A_combine.pShare.chaincode, 'hex')),
            }, path);
            const y = (0, sdk_core_1.bigIntToBufferLE)(subkey.pk, 32).toString('hex');
            const chaincode = (0, sdk_core_1.bigIntToBufferBE)(subkey.chaincode, 32).toString('hex');
            // Verify the keychain in the subkey P shares equals the separately derived public subkeychain.
            A_subkey.pShare.y.should.equal(y);
            A_subkey.pShare.chaincode.should.equal(chaincode);
            B_subkey.pShare.y.should.equal(y);
            B_subkey.pShare.chaincode.should.equal(chaincode);
            const message = 'MPC on a Friday night';
            const message_buffer = Buffer.from(message);
            // Signing with A and B using subkey P shares.
            const A_sign_share = MPC.signShare(message_buffer, A_subkey.pShare, [A_combine.jShares[2]]);
            const B_sign_share = MPC.signShare(message_buffer, B_subkey.pShare, [B_combine.jShares[1]]);
            const A_sign = MPC.sign(message_buffer, A_sign_share.xShare, [B_sign_share.rShares[1]], [C.yShares[1]]);
            const B_sign = MPC.sign(message_buffer, B_sign_share.xShare, [A_sign_share.rShares[2]], [C.yShares[2]]);
            const signature = MPC.signCombine([A_sign, B_sign]);
            const result = MPC.verify(message_buffer, signature);
            result.should.equal(true);
            // Verify the public key in the signature equals the separately derived public subkey.
            signature.y.should.equal(y);
        });
        it('should fail if seed is not length 64', function () {
            assert_1.default.throws(() => MPC.keyShare(1, 2, 3, (0, crypto_1.randomBytes)(33)), /Seed must have length 64/);
            assert_1.default.throws(() => MPC.keyShare(1, 2, 3, (0, crypto_1.randomBytes)(66)), /Seed must have length 64/);
            const fakePShare = {
                i: 1,
                t: 3,
                n: 2,
                y: 'yString',
                u: 'uString',
                prefix: 'prefix',
                chaincode: 'chaincode',
            };
            assert_1.default.throws(() => MPC.signShare(Buffer.from('abcd', 'hex'), fakePShare, [], (0, crypto_1.randomBytes)(33)), /Seed must have length 64/);
            assert_1.default.throws(() => MPC.signShare(Buffer.from('abcd', 'hex'), fakePShare, [], (0, crypto_1.randomBytes)(66)), /Seed must have length 64/);
        });
    });
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRkc2EuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvbXBjL3Rzcy9lZGRzYS9lZGRzYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztHQUVHO0FBQ0gsa0JBQWdCO0FBQ2hCLG9EQUE0QjtBQUM1QiwyQ0FBNkI7QUFDN0IsbUNBQXFDO0FBQ3JDLHFEQUF1QztBQUV2Qyw0Q0FBOEM7QUFFOUMsOENBUXlCO0FBRXpCLFFBQVEsQ0FBQyxzQ0FBc0MsRUFBRTtJQUMvQyxJQUFJLEdBQVUsQ0FBQztJQUNmLElBQUksTUFBYyxDQUFDO0lBRW5CLE1BQU0sQ0FBQyxvQkFBb0IsRUFBRSxLQUFLO1FBQ2hDLE1BQU0sR0FBRyxNQUFNLHVCQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDekMsR0FBRyxHQUFHLE1BQU0sZ0JBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsa0RBQWtELEVBQUU7UUFDckQsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLHlCQUF5QixDQUFDLENBQUM7UUFDdEUsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLHlCQUF5QixDQUFDLENBQUM7SUFDeEUsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsNERBQTRELEVBQUU7UUFDL0Qsb0hBQW9IO1FBQ3BILGtIQUFrSDtRQUNsSCx3Q0FBd0M7UUFDeEMsTUFBTSxDQUFDLEdBQUcsa0VBQWtFLENBQUM7UUFDN0UsTUFBTSxDQUFDLEdBQUcsa0VB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Iiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqL1xuaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0ICogYXMgYnM1OCBmcm9tICdiczU4JztcbmltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCAqIGFzIHNvbCBmcm9tICdAc29sYW5hL3dlYjMuanMnO1xuXG5pbXBvcnQgeyBEb3QsIFNvbCB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3NyYyc7XG5cbmltcG9ydCB7XG4gIGJpZ0ludEZyb21CdWZmZXJMRSxcbiAgYmlnSW50VG9CdWZmZXJMRSxcbiAgYmlnSW50RnJvbUJ1ZmZlckJFLFxuICBiaWdJbnRUb0J1ZmZlckJFLFxuICBFZDI1NTE5QklQMzIsXG4gIEVkZHNhLFxuICBIRFRyZWUsXG59IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5cbmRlc2NyaWJlKCdUU1MgRUREU0Ega2V5IGdlbmVyYXRpb24gYW5kIHNpZ25pbmcnLCBmdW5jdGlvbiAoKSB7XG4gIGxldCBNUEM6IEVkZHNhO1xuICBsZXQgaGRUcmVlOiBIRFRyZWU7XG5cbiAgYmVmb3JlKCdpbml0aWFsaXplIG1vZHVsZXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgaGRUcmVlID0gYXdhaXQgRWQyNTUxOUJJUDMyLmluaXRpYWxpemUoKTtcbiAgICBNUEMgPSBhd2FpdCBFZGRzYS5pbml0aWFsaXplKGhkVHJlZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZmFpbCB0byBnZW5lcmF0ZSBrZXlzIHdpdGggaW52YWxpZCBjb25maWcnLCBmdW5jdGlvbiAoKSB7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBNUEMua2V5U2hhcmUoMCwgMiwgMyksIC9JbnZhbGlkIEtleVNoYXJlIGNvbmZpZy8pO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gTVBDLmtleVNoYXJlKDUsIDIsIDMpLCAvSW52YWxpZCBLZXlTaGFyZSBjb25maWcvKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBzaWduIGFuZCB2ZXJpZnkgc2lnbmF0dXJlIGZvciBsb3cgbnVtYmVyIHB1YmxpYyBrZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgLy8gV2UgdXNlIGxpdHRsZSBlbmRpYW4gZW5jb2RpbmcuIFRoaXMgbWVhbnMgdGhhdCB0aGUgZm9sbG93aW5nIHZhbHVlIGlzIGEgbnVtYmVyIHRoYXQgaXMgc2hvcnRlciB0aGFuIDMyIEJ5dGVzIHdoZW5cbiAgICAvLyBsZWFkaW5nIHplcm9lcyBhcmUgY3V0IG9mZi4gVGhpcyBpcyBleGFjdGx5IHdoYXQgaGFwcGVuZWQgd2hlbiB3ZSBwYXNzZWQgaXQgdG8gdGhlIHNvZGl1bSBsaWJyYXJ5IGZvciB2ZXJpZnlpbmdcbiAgICAvLyB0aGUgc2lnbmF0dXJlIGFnYWluc3QgdGhlIHB1YmxpYyBrZXkuXG4gICAgY29uc3QgeSA9ICc5OTFiMTJhMWI0MWI5NjZhMzM4MmRiMzJmZTliN2ZhOWY4MDQzMzk0MGQwYjE3YTE3NTlmMWU0NWFkYTgzZjAwJztcbiAgICBjb25zdCBSID0gJ2IxNDM4NmJiNTE4YjY3NTM1N2E0Yzc5ZDI0MzkxNjZhNWZjNWEzYTBlMWM1NzljN2I4MjllZmYxZTdhN2Q5NjcnO1xuICAgIGNvbnN0IHNpZ25hYmxlSGV4ID1cbiAgICAgICcwMTAwMDMwNzk5MWIxMmExYjQxYjk2NmEzMzgyZGIzMmZlOWI3ZmE5ZjgwNDMzOTQwZDBiMTdhMTc1OWYxZTQ1YWRhODNmMDA0MTUzNmEyMDkwMmI2ZDI1M2IxMTFmZTVhYmU4Nzc1N2MxMjNjMjhjYzVmZTRlYjBkYTExYjU4NTdmM2YzOGU2NTI5MDM4NDE1NDA1OGRlNzY4NzBlOTQ2NzJmYzAyZTVmOTZmMjNlOTkzMDdmMDhjNTYwNzNlYmVhOTRjYmM1N2Q0ZDY0MjliNjUwNjY2MjY0Y2JjZGZlNjA3MDc0OWQ1ODZkMzI3ODE2MDg5NTg5MzFlOWI4ZDAxNjM2YzRmMzIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwYjQzYWYzYmFiMjBjM2YzOWVmM2MxNDhjODU2NDA2MTRhNDEwNDNlZWIzMDZkZTU5OTYzODBmMTBlYzEwNWE4ZTA2ZGRmNmUxZDc2NWExOTNkOWNiZTE0NmNlZWI3OWFjMWNiNDg1ZWQ1ZjViMzc5MTNhOGNmNTg1N2VmZjAwYTkxMDczZWFiNDY2MGU4ZTNhOTU3Yzc4MjBkNTJkZjYzMzhhOGM3YjYwMTAzYmY5MDNjYjVmODIxMTg0MzA5MjJiMDIwNDAyMDAwMzBjMDIwMDAwMDA1ODE5YjIxNzAwMDAwMDAwMDYwNDAxMDUwMjAwMGEwY2Y0MDEwMDAwMDAwMDAwMDAwOSc7XG4gICAgY29uc3QgdXNlclRvQml0Z29HU2hhcmUgPSB7XG4gICAgICBpOiAxLFxuICAgICAgeSxcbiAgICAgIFIsXG4gICAgICBnYW1tYTogJ2ZjZmQ5NmQ0ZWU0ZjMzOTliNzI4YjNjODIwYThlZWQ0YTZmYTQ5NjgyOGU4NGFmMjc1NjE5Nzk5M2I1ZGYzMGInLFxuICAgIH07XG4gICAgY29uc3QgYml0Z29Ub1VzZXJHU2hhcmUgPSB7XG4gICAgICBpOiAzLFxuICAgICAgeSxcbiAgICAgIFIsXG4gICAgICBnYW1tYTogJzg5ZDVlNDU2NDFkYzkzNTM5YTMyYTY2NTFlYWFlMjQ0OGRiNGQ0NGY2ZDMwNDBhMTM5MGJlYjE0ZDAyMjVjMDAnLFxuICAgIH07XG5cbiAgICBjb25zdCBzaWduYXR1cmUgPSBNUEMuc2lnbkNvbWJpbmUoW3VzZXJUb0JpdGdvR1NoYXJlLCBiaXRnb1RvVXNlckdTaGFyZV0pO1xuICAgIGNvbnN0IHNpZ25hYmxlUGF5bG9hZEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHNpZ25hYmxlSGV4LCAnaGV4Jyk7XG4gICAgY29uc3QgdmVyaWZpY2F0aW9uUmVzdWx0ID0gTVBDLnZlcmlmeShzaWduYWJsZVBheWxvYWRCdWZmZXIsIHNpZ25hdHVyZSk7XG4gICAgdmVyaWZpY2F0aW9uUmVzdWx0LnNob3VsZC5iZS50cnVlKCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZ2VuZXJhdGUga2V5cyBhbmQgc2lnbiBtZXNzYWdlJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IEEgPSBNUEMua2V5U2hhcmUoMSwgMiwgMyk7XG4gICAgY29uc3QgQiA9IE1QQy5rZXlTaGFyZSgyLCAyLCAzKTtcbiAgICBjb25zdCBDID0gTVBDLmtleVNoYXJlKDMsIDIsIDMpO1xuXG4gICAgY29uc3QgQV9jb21iaW5lID0gTVBDLmtleUNvbWJpbmUoQS51U2hhcmUsIFtCLnlTaGFyZXNbMV0sIEMueVNoYXJlc1sxXV0pO1xuICAgIGNvbnN0IEJfY29tYmluZSA9IE1QQy5rZXlDb21iaW5lKEIudVNoYXJlLCBbQS55U2hhcmVzWzJdLCBDLnlTaGFyZXNbMl1dKTtcbiAgICBjb25zdCBDX2NvbWJpbmUgPSBNUEMua2V5Q29tYmluZShDLnVTaGFyZSwgW0EueVNoYXJlc1szXSwgQi55U2hhcmVzWzNdXSk7XG5cbiAgICBjb25zdCBtZXNzYWdlID0gJ01QQyBvbiBhIEZyaWRheSBuaWdodCc7XG4gICAgY29uc3QgbWVzc2FnZV9idWZmZXIgPSBCdWZmZXIuZnJvbShtZXNzYWdlKTtcblxuICAgIGNvbnN0IGluY29ycmVjdF9tZXNzYWdlID0gJ01QQyBvbiBhIE1vbmRheSBuaWdodCc7XG4gICAgY29uc3QgaW5jb3JyZWN0X21lc3NhZ2VfYnVmZmVyID0gQnVmZmVyLmZyb20oaW5jb3JyZWN0X21lc3NhZ2UpO1xuXG4gICAgLy8gc2lnbmluZyB3aXRoIEEgYW5kIEJcbiAgICBsZXQgQV9zaWduX3NoYXJlID0gTVBDLnNpZ25TaGFyZShtZXNzYWdlX2J1ZmZlciwgQV9jb21iaW5lLnBTaGFyZSwgW0FfY29tYmluZS5qU2hhcmVzWzJdXSk7XG4gICAgbGV0IEJfc2lnbl9zaGFyZSA9IE1QQy5zaWduU2hhcmUobWVzc2FnZV9idWZmZXIsIEJfY29tYmluZS5wU2hhcmUsIFtCX2NvbWJpbmUualNoYXJlc1sxXV0pO1xuICAgIGxldCBBX3NpZ24gPSBNUEMuc2lnbihtZXNzYWdlX2J1ZmZlciwgQV9zaWduX3NoYXJlLnhTaGFyZSwgW0Jfc2lnbl9zaGFyZS5yU2hhcmVzWzFdXSwgW0MueVNoYXJlc1sxXV0pO1xuICAgIGxldCBCX3NpZ24gPSBNUEMuc2lnbihtZXNzYWdlX2J1ZmZlciwgQl9zaWduX3NoYXJlLnhTaGFyZSwgW0Ffc2lnbl9zaGFyZS5yU2hhcmVzWzJdXSwgW0MueVNoYXJlc1syXV0pO1xuICAgIGxldCBzaWduYXR1cmUgPSBNUEMuc2lnbkNvbWJpbmUoW0Ffc2lnbiwgQl9zaWduXSk7XG4gICAgbGV0IHJlc3VsdCA9IE1QQy52ZXJpZnkobWVzc2FnZV9idWZmZXIsIHNpZ25hdHVyZSk7XG4gICAgcmVzdWx0LnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICBsZXQgcmVzdWx0VHdvID0gTVBDLnZlcmlmeShpbmNvcnJlY3RfbWVzc2FnZV9idWZmZXIsIHNpZ25hdHVyZSk7XG4gICAgcmVzdWx0VHdvLnNob3VsZC5lcXVhbChmYWxzZSk7XG5cbiAgICAvLyBzaWduaW5nIHdpdGggQSBhbmQgQ1xuICAgIEFfc2lnbl9zaGFyZSA9IE1QQy5zaWduU2hhcmUobWVzc2FnZV9idWZmZXIsIEFfY29tYmluZS5wU2hhcmUsIFtBX2NvbWJpbmUualNoYXJlc1szXV0pO1xuICAgIGxldCBDX3NpZ25fc2hhcmUgPSBNUEMuc2lnblNoYXJlKG1lc3NhZ2VfYnVmZmVyLCBDX2NvbWJpbmUucFNoYXJlLCBbQ19jb21iaW5lLmpTaGFyZXNbMV1dKTtcbiAgICBBX3NpZ24gPSBNUEMuc2lnbihtZXNzYWdlX2J1ZmZlciwgQV9zaWduX3NoYXJlLnhTaGFyZSwgW0Nfc2lnbl9zaGFyZS5yU2hhcmVzWzFdXSwgW0IueVNoYXJlc1sxXV0pO1xuICAgIGxldCBDX3NpZ24gPSBNUEMuc2lnbihtZXNzYWdlX2J1ZmZlciwgQ19zaWduX3NoYXJlLnhTaGFyZSwgW0Ffc2lnbl9zaGFyZS5yU2hhcmVzWzNdXSwgW0IueVNoYXJlc1szXV0pO1xuICAgIHNpZ25hdHVyZSA9IE1QQy5zaWduQ29tYmluZShbQV9zaWduLCBDX3NpZ25dKTtcbiAgICByZXN1bHQgPSBNUEMudmVyaWZ5KG1lc3NhZ2VfYnVmZmVyLCBzaWduYXR1cmUpO1xuICAgIHJlc3VsdC5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgcmVzdWx0VHdvID0gTVBDLnZlcmlmeShpbmNvcnJlY3RfbWVzc2FnZV9idWZmZXIsIHNpZ25hdHVyZSk7XG4gICAgcmVzdWx0VHdvLnNob3VsZC5lcXVhbChmYWxzZSk7XG5cbiAgICAvLyBzaWduaW5nIHdpdGggQiBhbmQgQ1xuICAgIEJfc2lnbl9zaGFyZSA9IE1QQy5zaWduU2hhcmUobWVzc2FnZV9idWZmZXIsIEJfY29tYmluZS5wU2hhcmUsIFtCX2NvbWJpbmUualNoYXJlc1szXV0pO1xuICAgIENfc2lnbl9zaGFyZSA9IE1QQy5zaWduU2hhcmUobWVzc2FnZV9idWZmZXIsIENfY29tYmluZS5wU2hhcmUsIFtDX2NvbWJpbmUualNoYXJlc1syXV0pO1xuICAgIEJfc2lnbiA9IE1QQy5zaWduKG1lc3NhZ2VfYnVmZmVyLCBCX3NpZ25fc2hhcmUueFNoYXJlLCBbQ19zaWduX3NoYXJlLnJTaGFyZXNbMl1dLCBbQS55U2hhcmVzWzJdXSk7XG4gICAgQ19zaWduID0gTVBDLnNpZ24obWVzc2FnZV9idWZmZXIsIENfc2lnbl9zaGFyZS54U2hhcmUsIFtCX3NpZ25fc2hhcmUuclNoYXJlc1szXV0sIFtBLnlTaGFyZXNbM11dKTtcbiAgICBzaWduYXR1cmUgPSBNUEMuc2lnbkNvbWJpbmUoW0Jfc2lnbiwgQ19zaWduXSk7XG4gICAgcmVzdWx0ID0gTVBDLnZlcmlmeShtZXNzYWdlX2J1ZmZlciwgc2lnbmF0dXJlKTtcbiAgICByZXN1bHQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIHJlc3VsdFR3byA9IE1QQy52ZXJpZnkoaW5jb3JyZWN0X21lc3NhZ2VfYnVmZmVyLCBzaWduYXR1cmUpO1xuICAgIHJlc3VsdFR3by5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHZlcmlmeSBCSVAzMiBzdWJrZXkgc2lnbmF0dXJlJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHBhdGggPSAnbS8wLzEvMic7XG4gICAgY29uc3QgQSA9IE1QQy5rZXlTaGFyZSgxLCAyLCAzKTtcbiAgICBjb25zdCBCID0gTVBDLmtleVNoYXJlKDIsIDIsIDMpO1xuICAgIGNvbnN0IEMgPSBNUEMua2V5U2hhcmUoMywgMiwgMyk7XG5cbiAgICAvLyBDb21iaW5lIHNoYXJlcyB0byBjb21tb24gYmFzZSBhZGRyZXNzLlxuICAgIGNvbnN0IEFfY29tYmluZSA9IE1QQy5rZXlDb21iaW5lKEEudVNoYXJlLCBbQi55U2hhcmVzWzFdLCBDLnlTaGFyZXNbMV1dKTtcbiAgICBjb25zdCBCX2NvbWJpbmUgPSBNUEMua2V5Q29tYmluZShCLnVTaGFyZSwgW0EueVNoYXJlc1syXSwgQy55U2hhcmVzWzJdXSk7XG5cbiAgICAvLyBQYXJ0eSBBIGRlcml2ZXMgc3Via2V5IFAgc2hhcmUgYW5kIG5ldyBZIHNoYXJlcy5cbiAgICBjb25zdCBBX3N1YmtleSA9IE1QQy5rZXlEZXJpdmUoQS51U2hhcmUsIFtCLnlTaGFyZXNbMV0sIEMueVNoYXJlc1sxXV0sIHBhdGgpO1xuXG4gICAgLy8gUGFydHkgQiBjYWxjdWxhdGVzIG5ldyBQIHNoYXJlIHVzaW5nIHBhcnR5IEEncyBzdWJrZXkgWSBzaGFyZXMuXG4gICAgY29uc3QgQl9zdWJrZXkgPSBNUEMua2V5Q29tYmluZShCLnVTaGFyZSwgW0Ffc3Via2V5LnlTaGFyZXNbMl0sIEMueVNoYXJlc1syXV0pO1xuXG4gICAgLy8gRGVyaXZlIHRoZSBwdWJsaWMgc3Via2V5Y2hhaW4gc2VwYXJhdGVseSB1c2luZyB0aGUgY29tbW9uIGtleWNoYWluLlxuICAgIGNvbnN0IHN1YmtleSA9IGhkVHJlZS5wdWJsaWNEZXJpdmUoXG4gICAgICB7XG4gICAgICAgIHBrOiBiaWdJbnRGcm9tQnVmZmVyTEUoQnVmZmVyLmZyb20oQV9jb21iaW5lLnBTaGFyZS55LCAnaGV4JykpLFxuICAgICAgICBjaGFpbmNvZGU6IGJpZ0ludEZyb21CdWZmZXJCRShCdWZmZXIuZnJvbShBX2NvbWJpbmUucFNoYXJlLmNoYWluY29kZSwgJ2hleCcpKSxcbiAgICAgIH0sXG4gICAgICBwYXRoLFxuICAgICk7XG4gICAgY29uc3QgeSA9IGJpZ0ludFRvQnVmZmVyTEUoc3Via2V5LnBrLCAzMikudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IGNoYWluY29kZSA9IGJpZ0ludFRvQnVmZmVyQkUoc3Via2V5LmNoYWluY29kZSwgMzIpLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgIC8vIFZlcmlmeSB0aGUga2V5Y2hhaW4gaW4gdGhlIHN1YmtleSBQIHNoYXJlcyBlcXVhbHMgdGhlIHNlcGFyYXRlbHkgZGVyaXZlZCBwdWJsaWMgc3Via2V5Y2hhaW4uXG4gICAgQV9zdWJrZXkucFNoYXJlLnkuc2hvdWxkLmVxdWFsKHkpO1xuICAgIEFfc3Via2V5LnBTaGFyZS5jaGFpbmNvZGUuc2hvdWxkLmVxdWFsKGNoYWluY29kZSk7XG4gICAgQl9zdWJrZXkucFNoYXJlLnkuc2hvdWxkLmVxdWFsKHkpO1xuICAgIEJfc3Via2V5LnBTaGFyZS5jaGFpbmNvZGUuc2hvdWxkLmVxdWFsKGNoYWluY29kZSk7XG5cbiAgICBjb25zdCBtZXNzYWdlID0gJ01QQyBvbiBhIEZyaWRheSBuaWdodCc7XG4gICAgY29uc3QgbWVzc2FnZV9idWZmZXIgPSBCdWZmZXIuZnJvbShtZXNzYWdlKTtcblxuICAgIC8vIFNpZ25pbmcgd2l0aCBBIGFuZCBCIHVzaW5nIHN1YmtleSBQIHNoYXJlcy5cbiAgICBjb25zdCBBX3NpZ25fc2hhcmUgPSBNUEMuc2lnblNoYXJlKG1lc3NhZ2VfYnVmZmVyLCBBX3N1YmtleS5wU2hhcmUsIFtBX2NvbWJpbmUualNoYXJlc1syXV0pO1xuICAgIGNvbnN0IEJfc2lnbl9zaGFyZSA9IE1QQy5zaWduU2hhcmUobWVzc2FnZV9idWZmZXIsIEJfc3Via2V5LnBTaGFyZSwgW0JfY29tYmluZS5qU2hhcmVzWzFdXSk7XG4gICAgY29uc3QgQV9zaWduID0gTVBDLnNpZ24obWVzc2FnZV9idWZmZXIsIEFfc2lnbl9zaGFyZS54U2hhcmUsIFtCX3NpZ25fc2hhcmUuclNoYXJlc1sxXV0sIFtDLnlTaGFyZXNbMV1dKTtcbiAgICBjb25zdCBCX3NpZ24gPSBNUEMuc2lnbihtZXNzYWdlX2J1ZmZlciwgQl9zaWduX3NoYXJlLnhTaGFyZSwgW0Ffc2lnbl9zaGFyZS5yU2hhcmVzWzJdXSwgW0MueVNoYXJlc1syXV0pO1xuICAgIGNvbnN0IHNpZ25hdHVyZSA9IE1QQy5zaWduQ29tYmluZShbQV9zaWduLCBCX3NpZ25dKTtcbiAgICBjb25zdCByZXN1bHQgPSBNUEMudmVyaWZ5KG1lc3NhZ2VfYnVmZmVyLCBzaWduYXR1cmUpO1xuICAgIHJlc3VsdC5zaG91bGQuZXF1YWwodHJ1ZSk7XG5cbiAgICAvLyBWZXJpZnkgdGhlIHB1YmxpYyBrZXkgaW4gdGhlIHNpZ25hdHVyZSBlcXVhbHMgdGhlIHNlcGFyYXRlbHkgZGVyaXZlZCBwdWJsaWMgc3Via2V5LlxuICAgIHNpZ25hdHVyZS55LnNob3VsZC5lcXVhbCh5KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBkZXJpdmUgdW5oYXJkZW5lZCBjaGlsZCBrZXlzJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IEEgPSBNUEMua2V5U2hhcmUoMSwgMiwgMyk7XG4gICAgY29uc3QgQiA9IE1QQy5rZXlTaGFyZSgyLCAyLCAzKTtcbiAgICBjb25zdCBDID0gTVBDLmtleVNoYXJlKDMsIDIsIDMpO1xuXG4gICAgY29uc3QgQV9jb21iaW5lID0gTVBDLmtleUNvbWJpbmUoQS51U2hhcmUsIFtCLnlTaGFyZXNbMV0sIEMueVNoYXJlc1sxXV0pO1xuXG4gICAgY29uc3QgY29tbW9uS2V5Y2hhaW4gPSBBX2NvbWJpbmUucFNoYXJlLnkgKyBBX2NvbWJpbmUucFNoYXJlLmNoYWluY29kZTtcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCAxMDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgcGF0aCA9IGBtLzAvMC8ke2luZGV4fWA7XG4gICAgICBjb25zdCBkZXJpdmUxID0gTVBDLmRlcml2ZVVuaGFyZGVuZWQoY29tbW9uS2V5Y2hhaW4sIHBhdGgpO1xuICAgICAgY29uc3Qgc3Via2V5ID0gTVBDLmtleURlcml2ZShBLnVTaGFyZSwgW0IueVNoYXJlc1sxXSwgQy55U2hhcmVzWzFdXSwgcGF0aCk7XG4gICAgICBjb25zdCBkZXJpdmUyID0gTVBDLmRlcml2ZVVuaGFyZGVuZWQoY29tbW9uS2V5Y2hhaW4sIHBhdGgpO1xuICAgICAgY29uc3QgZGVyaXZlZFBrID0gZGVyaXZlMS5zbGljZSgwLCA2NCk7XG5cbiAgICAgIChzdWJrZXkucFNoYXJlLnkgKyBzdWJrZXkucFNoYXJlLmNoYWluY29kZSkuc2hvdWxkLmVxdWFsKGRlcml2ZTEpO1xuICAgICAgZGVyaXZlMS5zaG91bGQuZXF1YWwoZGVyaXZlMiwgJ2Rlcml2YXRpb24gc2hvdWxkIGJlIGRldGVybWluaXN0aWMnKTtcblxuICAgICAgY29uc3Qgc29sQWRkcmVzcyA9IGJzNTguZW5jb2RlKEJ1ZmZlci5mcm9tKGRlcml2ZWRQaywgJ2hleCcpKTtcbiAgICAgIFNvbC5VdGlscy5pc1ZhbGlkUHVibGljS2V5KHNvbEFkZHJlc3MpLnNob3VsZC5iZS50cnVlKCk7XG5cbiAgICAgIGNvbnN0IHNvbFBrID0gbmV3IHNvbC5QdWJsaWNLZXkoc29sQWRkcmVzcyk7XG4gICAgICBzb2xQay50b0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKS5zaG91bGQuZXF1YWwoZGVyaXZlZFBrKTtcbiAgICB9XG5cbiAgICBjb25zdCByb290UGF0aCA9ICdtLzAnO1xuICAgIGNvbnN0IHJvb3RLZXljaGFpbiA9IE1QQy5kZXJpdmVVbmhhcmRlbmVkKGNvbW1vbktleWNoYWluLCByb290UGF0aCk7XG4gICAgY29uc3Qgcm9vdFB1YmxpY0tleSA9IEJ1ZmZlci5mcm9tKHJvb3RLZXljaGFpbiwgJ2hleCcpLnNsaWNlKDAsIDMyKS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3Qgc29sUGsgPSBuZXcgc29sLlB1YmxpY0tleShiczU4LmVuY29kZShCdWZmZXIuZnJvbShyb290UHVibGljS2V5LCAnaGV4JykpKTtcbiAgICBzb2xQay50b0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKS5zaG91bGQuZXF1YWwocm9vdFB1YmxpY0tleSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZGVyaXZlIHVuaGFyZGVuZWQgdmFsaWQgZG90IGNoaWxkIGtleXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgQSA9IE1QQy5rZXlTaGFyZSgxLCAyLCAzKTtcbiAgICBjb25zdCBCID0gTVBDLmtleVNoYXJlKDIsIDIsIDMpO1xuICAgIGNvbnN0IEMgPSBNUEMua2V5U2hhcmUoMywgMiwgMyk7XG5cbiAgICBjb25zdCBBX2NvbWJpbmUgPSBNUEMua2V5Q29tYmluZShBLnVTaGFyZSwgW0IueVNoYXJlc1sxXSwgQy55U2hhcmVzWzFdXSk7XG5cbiAgICBjb25zdCBjb21tb25LZXljaGFpbiA9IEFfY29tYmluZS5wU2hhcmUueSArIEFfY29tYmluZS5wU2hhcmUuY2hhaW5jb2RlO1xuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IDEwOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBwYXRoID0gYG0vMC8wLyR7aW5kZXh9YDtcbiAgICAgIGNvbnN0IGRlcml2ZTEgPSBNUEMuZGVyaXZlVW5oYXJkZW5lZChjb21tb25LZXljaGFpbiwgcGF0aCk7XG4gICAgICBjb25zdCBkZXJpdmUyID0gTVBDLmRlcml2ZVVuaGFyZGVuZWQoY29tbW9uS2V5Y2hhaW4sIHBhdGgpO1xuICAgICAgY29uc3QgZGVyaXZlZFBrID0gQnVmZmVyLmZyb20oZGVyaXZlMSwgJ2hleCcpLnNsaWNlKDAsIDMyKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICAgIGRlcml2ZTEuc2hvdWxkLmVxdWFsKGRlcml2ZTIsICdkZXJpdmF0aW9uIHNob3VsZCBiZSBkZXRlcm1pbmlzdGljJyk7XG5cbiAgICAgIGNvbnN0IHB1YktleVBhaXIgPSBuZXcgRG90LktleVBhaXIoeyBwdWI6IGRlcml2ZWRQayB9KTtcbiAgICAgIHB1YktleVBhaXIuZ2V0S2V5cygpLnB1Yi5zaG91bGQuZXF1YWwoZGVyaXZlZFBrKTtcbiAgICB9XG5cbiAgICBjb25zdCByb290UGF0aCA9ICdtLyc7XG4gICAgY29uc3Qgcm9vdEtleWNoYWluID0gTVBDLmRlcml2ZVVuaGFyZGVuZWQoY29tbW9uS2V5Y2hhaW4sIHJvb3RQYXRoKTtcbiAgICBjb25zdCByb290UHVibGljS2V5ID0gQnVmZmVyLmZyb20ocm9vdEtleWNoYWluLCAnaGV4Jykuc2xpY2UoMCwgMzIpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjb25zdCBwdWJLZXlQYWlyID0gbmV3IERvdC5LZXlQYWlyKHsgcHViOiByb290UHVibGljS2V5IH0pO1xuICAgIHB1YktleVBhaXIuZ2V0S2V5cygpLnB1Yi5zaG91bGQuZXF1YWwocm9vdFB1YmxpY0tleSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZmFpbCBzaWduaW5nIHdpdGhvdXQgbWVldGluZyB0aHJlc2hvbGQnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgQSA9IE1QQy5rZXlTaGFyZSgxLCAyLCAzKTtcbiAgICBjb25zdCBCID0gTVBDLmtleVNoYXJlKDIsIDIsIDMpO1xuICAgIGNvbnN0IEMgPSBNUEMua2V5U2hhcmUoMywgMiwgMyk7XG5cbiAgICBjb25zdCBBX2NvbWJpbmUgPSBNUEMua2V5Q29tYmluZShBLnVTaGFyZSwgW0IueVNoYXJlc1sxXSwgQy55U2hhcmVzWzFdXSk7XG4gICAgY29uc3QgQl9jb21iaW5lID0gTVBDLmtleUNvbWJpbmUoQi51U2hhcmUsIFtBLnlTaGFyZXNbMl0sIEMueVNoYXJlc1syXV0pO1xuXG4gICAgY29uc3QgbWVzc2FnZSA9ICdNUEMgb24gYSBGcmlkYXkgbmlnaHQnO1xuICAgIGNvbnN0IG1lc3NhZ2VfYnVmZmVyID0gQnVmZmVyLmZyb20obWVzc2FnZSwgJ3V0Zi04Jyk7XG4gICAgY29uc3QgQV9zaWduX3NoYXJlID0gTVBDLnNpZ25TaGFyZShtZXNzYWdlX2J1ZmZlciwgQV9jb21iaW5lLnBTaGFyZSwgW0FfY29tYmluZS5qU2hhcmVzWzJdXSk7XG4gICAgY29uc3QgQl9zaWduX3NoYXJlID0gTVBDLnNpZ25TaGFyZShtZXNzYWdlX2J1ZmZlciwgQl9jb21iaW5lLnBTaGFyZSwgW0JfY29tYmluZS5qU2hhcmVzWzFdXSk7XG5cbiAgICBjb25zdCBBX3NpZ24gPSBNUEMuc2lnbihtZXNzYWdlX2J1ZmZlciwgQV9zaWduX3NoYXJlLnhTaGFyZSwgW0Jfc2lnbl9zaGFyZS5yU2hhcmVzWzFdXSk7XG4gICAgY29uc3Qgc2lnbmF0dXJlID0gTVBDLnNpZ25Db21iaW5lKFtBX3NpZ25dKTtcbiAgICBNUEMudmVyaWZ5KG1lc3NhZ2VfYnVmZmVyLCBzaWduYXR1cmUpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd3aXRoIHNwZWNpZmljIHNlZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSBrZXlzIGFuZCBzaWduIG1lc3NhZ2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzZWVkID0gcmFuZG9tQnl0ZXMoNjQpO1xuXG4gICAgICBjb25zdCBBID0gTVBDLmtleVNoYXJlKDEsIDIsIDMsIHNlZWQpO1xuICAgICAgY29uc3QgQiA9IE1QQy5rZXlTaGFyZSgyLCAyLCAzLCBzZWVkKTtcbiAgICAgIGNvbnN0IEMgPSBNUEMua2V5U2hhcmUoMywgMiwgMywgc2VlZCk7XG5cbiAgICAgIC8vIEtleXMgc2hvdWxkIGJlIGRldGVybWluaXN0aWMgd2hlbiB1c2luZyBzZWVkXG4gICAgICBNUEMua2V5U2hhcmUoMSwgMiwgMywgc2VlZCkuc2hvdWxkLmRlZXBFcXVhbChBKTtcbiAgICAgIE1QQy5rZXlTaGFyZSgyLCAyLCAzLCBzZWVkKS5zaG91bGQuZGVlcEVxdWFsKEIpO1xuICAgICAgTVBDLmtleVNoYXJlKDMsIDIsIDMsIHNlZWQpLnNob3VsZC5kZWVwRXF1YWwoQyk7XG5cbiAgICAgIGNvbnN0IEFfY29tYmluZSA9IE1QQy5rZXlDb21iaW5lKEEudVNoYXJlLCBbQi55U2hhcmVzWzFdLCBDLnlTaGFyZXNbMV1dKTtcbiAgICAgIGNvbnN0IEJfY29tYmluZSA9IE1QQy5rZXlDb21iaW5lKEIudVNoYXJlLCBbQS55U2hhcmVzWzJdLCBDLnlTaGFyZXNbMl1dKTtcbiAgICAgIGNvbnN0IENfY29tYmluZSA9IE1QQy5rZXlDb21iaW5lKEMudVNoYXJlLCBbQS55U2hhcmVzWzNdLCBCLnlTaGFyZXNbM11dKTtcblxuICAgICAgY29uc3QgbWVzc2FnZSA9ICdNUEMgb24gYSBGcmlkYXkgbmlnaHQnO1xuICAgICAgY29uc3QgbWVzc2FnZV9idWZmZXIgPSBCdWZmZXIuZnJvbShtZXNzYWdlKTtcblxuICAgICAgLy8gc2lnbmluZyB3aXRoIEEgYW5kIEJcbiAgICAgIGxldCBBX3NpZ25fc2hhcmUgPSBNUEMuc2lnblNoYXJlKG1lc3NhZ2VfYnVmZmVyLCBBX2NvbWJpbmUucFNoYXJlLCBbQV9jb21iaW5lLmpTaGFyZXNbMl1dLCBzZWVkKTtcbiAgICAgIGxldCBCX3NpZ25fc2hhcmUgPSBNUEMuc2lnblNoYXJlKG1lc3NhZ2VfYnVmZmVyLCBCX2NvbWJpbmUucFNoYXJlLCBbQl9jb21iaW5lLmpTaGFyZXNbMV1dLCBzZWVkKTtcbiAgICAgIGxldCBBX3NpZ24gPSBNUEMuc2lnbihtZXNzYWdlX2J1ZmZlciwgQV9zaWduX3NoYXJlLnhTaGFyZSwgW0Jfc2lnbl9zaGFyZS5yU2hhcmVzWzFdXSwgW0MueVNoYXJlc1sxXV0pO1xuICAgICAgbGV0IEJfc2lnbiA9IE1QQy5zaWduKG1lc3NhZ2VfYnVmZmVyLCBCX3NpZ25fc2hhcmUueFNoYXJlLCBbQV9zaWduX3NoYXJlLnJTaGFyZXNbMl1dLCBbQy55U2hhcmVzWzJdXSk7XG4gICAgICBsZXQgc2lnbmF0dXJlID0gTVBDLnNpZ25Db21iaW5lKFtBX3NpZ24sIEJfc2lnbl0pO1xuICAgICAgbGV0IHJlc3VsdCA9IE1QQy52ZXJpZnkobWVzc2FnZV9idWZmZXIsIHNpZ25hdHVyZSk7XG4gICAgICByZXN1bHQuc2hvdWxkLmVxdWFsKHRydWUpO1xuXG4gICAgICAvLyBzaWduaW5nIHdpdGggQSBhbmQgQ1xuICAgICAgQV9zaWduX3NoYXJlID0gTVBDLnNpZ25TaGFyZShtZXNzYWdlX2J1ZmZlciwgQV9jb21iaW5lLnBTaGFyZSwgW0FfY29tYmluZS5qU2hhcmVzWzNdXSwgc2VlZCk7XG4gICAgICBsZXQgQ19zaWduX3NoYXJlID0gTVBDLnNpZ25TaGFyZShtZXNzYWdlX2J1ZmZlciwgQ19jb21iaW5lLnBTaGFyZSwgW0NfY29tYmluZS5qU2hhcmVzWzFdXSwgc2VlZCk7XG4gICAgICBBX3NpZ24gPSBNUEMuc2lnbihtZXNzYWdlX2J1ZmZlciwgQV9zaWduX3NoYXJlLnhTaGFyZSwgW0Nfc2lnbl9zaGFyZS5yU2hhcmVzWzFdXSwgW0IueVNoYXJlc1sxXV0pO1xuICAgICAgbGV0IENfc2lnbiA9IE1QQy5zaWduKG1lc3NhZ2VfYnVmZmVyLCBDX3NpZ25fc2hhcmUueFNoYXJlLCBbQV9zaWduX3NoYXJlLnJTaGFyZXNbM11dLCBbQi55U2hhcmVzWzNdXSk7XG4gICAgICBzaWduYXR1cmUgPSBNUEMuc2lnbkNvbWJpbmUoW0Ffc2lnbiwgQ19zaWduXSk7XG4gICAgICByZXN1bHQgPSBNUEMudmVyaWZ5KG1lc3NhZ2VfYnVmZmVyLCBzaWduYXR1cmUpO1xuICAgICAgcmVzdWx0LnNob3VsZC5lcXVhbCh0cnVlKTtcblxuICAgICAgLy8gc2lnbmluZyB3aXRoIEIgYW5kIENcbiAgICAgIEJfc2lnbl9zaGFyZSA9IE1QQy5zaWduU2hhcmUobWVzc2FnZV9idWZmZXIsIEJfY29tYmluZS5wU2hhcmUsIFtCX2NvbWJpbmUualNoYXJlc1szXV0sIHNlZWQpO1xuICAgICAgQ19zaWduX3NoYXJlID0gTVBDLnNpZ25TaGFyZShtZXNzYWdlX2J1ZmZlciwgQ19jb21iaW5lLnBTaGFyZSwgW0NfY29tYmluZS5qU2hhcmVzWzJdXSwgc2VlZCk7XG4gICAgICBCX3NpZ24gPSBNUEMuc2lnbihtZXNzYWdlX2J1ZmZlciwgQl9zaWduX3NoYXJlLnhTaGFyZSwgW0Nfc2lnbl9zaGFyZS5yU2hhcmVzWzJdXSwgW0EueVNoYXJlc1syXV0pO1xuICAgICAgQ19zaWduID0gTVBDLnNpZ24obWVzc2FnZV9idWZmZXIsIENfc2lnbl9zaGFyZS54U2hhcmUsIFtCX3NpZ25fc2hhcmUuclNoYXJlc1szXV0sIFtBLnlTaGFyZXNbM11dKTtcbiAgICAgIHNpZ25hdHVyZSA9IE1QQy5zaWduQ29tYmluZShbQl9zaWduLCBDX3NpZ25dKTtcbiAgICAgIHJlc3VsdCA9IE1QQy52ZXJpZnkobWVzc2FnZV9idWZmZXIsIHNpZ25hdHVyZSk7XG4gICAgICByZXN1bHQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2ZXJpZnkgQklQMzIgc3Via2V5IHNpZ25hdHVyZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNlZWQgPSByYW5kb21CeXRlcyg2NCk7XG4gICAgICBjb25zdCBwYXRoID0gJ20vMC8xLzInO1xuXG4gICAgICBjb25zdCBBID0gTVBDLmtleVNoYXJlKDEsIDIsIDMsIHNlZWQpO1xuICAgICAgY29uc3QgQiA9IE1QQy5rZXlTaGFyZSgyLCAyLCAzLCBzZWVkKTtcbiAgICAgIGNvbnN0IEMgPSBNUEMua2V5U2hhcmUoMywgMiwgMywgc2VlZCk7XG5cbiAgICAgIC8vIEtleXMgc2hvdWxkIGJlIGRldGVybWluaXN0aWMgd2hlbiB1c2luZyBzZWVkXG4gICAgICBNUEMua2V5U2hhcmUoMSwgMiwgMywgc2VlZCkuc2hvdWxkLmRlZXBFcXVhbChBKTtcbiAgICAgIE1QQy5rZXlTaGFyZSgyLCAyLCAzLCBzZWVkKS5zaG91bGQuZGVlcEVxdWFsKEIpO1xuICAgICAgTVBDLmtleVNoYXJlKDMsIDIsIDMsIHNlZWQpLnNob3VsZC5kZWVwRXF1YWwoQyk7XG5cbiAgICAgIC8vIENvbWJpbmUgc2hhcmVzIHRvIGNvbW1vbiBiYXNlIGFkZHJlc3MuXG4gICAgICBjb25zdCBBX2NvbWJpbmUgPSBNUEMua2V5Q29tYmluZShBLnVTaGFyZSwgW0IueVNoYXJlc1sxXSwgQy55U2hhcmVzWzFdXSk7XG4gICAgICBjb25zdCBCX2NvbWJpbmUgPSBNUEMua2V5Q29tYmluZShCLnVTaGFyZSwgW0EueVNoYXJlc1syXSwgQy55U2hhcmVzWzJdXSk7XG5cbiAgICAgIC8vIFBhcnR5IEEgZGVyaXZlcyBzdWJrZXkgUCBzaGFyZSBhbmQgbmV3IFkgc2hhcmVzLlxuICAgICAgY29uc3QgQV9zdWJrZXkgPSBNUEMua2V5RGVyaXZlKEEudVNoYXJlLCBbQi55U2hhcmVzWzFdLCBDLnlTaGFyZXNbMV1dLCBwYXRoKTtcblxuICAgICAgLy8gUGFydHkgQiBjYWxjdWxhdGVzIG5ldyBQIHNoYXJlIHVzaW5nIHBhcnR5IEEncyBzdWJrZXkgWSBzaGFyZXMuXG4gICAgICBjb25zdCBCX3N1YmtleSA9IE1QQy5rZXlDb21iaW5lKEIudVNoYXJlLCBbQV9zdWJrZXkueVNoYXJlc1syXSwgQy55U2hhcmVzWzJdXSk7XG5cbiAgICAgIC8vIERlcml2ZSB0aGUgcHVibGljIHN1YmtleWNoYWluIHNlcGFyYXRlbHkgdXNpbmcgdGhlIGNvbW1vbiBrZXljaGFpbi5cbiAgICAgIGNvbnN0IHN1YmtleSA9IGhkVHJlZS5wdWJsaWNEZXJpdmUoXG4gICAgICAgIHtcbiAgICAgICAgICBwazogYmlnSW50RnJvbUJ1ZmZlckxFKEJ1ZmZlci5mcm9tKEFfY29tYmluZS5wU2hhcmUueSwgJ2hleCcpKSxcbiAgICAgICAgICBjaGFpbmNvZGU6IGJpZ0ludEZyb21CdWZmZXJCRShCdWZmZXIuZnJvbShBX2NvbWJpbmUucFNoYXJlLmNoYWluY29kZSwgJ2hleCcpKSxcbiAgICAgICAgfSxcbiAgICAgICAgcGF0aCxcbiAgICAgICk7XG4gICAgICBjb25zdCB5ID0gYmlnSW50VG9CdWZmZXJMRShzdWJrZXkucGssIDMyKS50b1N0cmluZygnaGV4Jyk7XG4gICAgICBjb25zdCBjaGFpbmNvZGUgPSBiaWdJbnRUb0J1ZmZlckJFKHN1YmtleS5jaGFpbmNvZGUsIDMyKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICAgIC8vIFZlcmlmeSB0aGUga2V5Y2hhaW4gaW4gdGhlIHN1YmtleSBQIHNoYXJlcyBlcXVhbHMgdGhlIHNlcGFyYXRlbHkgZGVyaXZlZCBwdWJsaWMgc3Via2V5Y2hhaW4uXG4gICAgICBBX3N1YmtleS5wU2hhcmUueS5zaG91bGQuZXF1YWwoeSk7XG4gICAgICBBX3N1YmtleS5wU2hhcmUuY2hhaW5jb2RlLnNob3VsZC5lcXVhbChjaGFpbmNvZGUpO1xuICAgICAgQl9zdWJrZXkucFNoYXJlLnkuc2hvdWxkLmVxdWFsKHkpO1xuICAgICAgQl9zdWJrZXkucFNoYXJlLmNoYWluY29kZS5zaG91bGQuZXF1YWwoY2hhaW5jb2RlKTtcblxuICAgICAgY29uc3QgbWVzc2FnZSA9ICdNUEMgb24gYSBGcmlkYXkgbmlnaHQnO1xuICAgICAgY29uc3QgbWVzc2FnZV9idWZmZXIgPSBCdWZmZXIuZnJvbShtZXNzYWdlKTtcblxuICAgICAgLy8gU2lnbmluZyB3aXRoIEEgYW5kIEIgdXNpbmcgc3Via2V5IFAgc2hhcmVzLlxuICAgICAgY29uc3QgQV9zaWduX3NoYXJlID0gTVBDLnNpZ25TaGFyZShtZXNzYWdlX2J1ZmZlciwgQV9zdWJrZXkucFNoYXJlLCBbQV9jb21iaW5lLmpTaGFyZXNbMl1dKTtcbiAgICAgIGNvbnN0IEJfc2lnbl9zaGFyZSA9IE1QQy5zaWduU2hhcmUobWVzc2FnZV9idWZmZXIsIEJfc3Via2V5LnBTaGFyZSwgW0JfY29tYmluZS5qU2hhcmVzWzFdXSk7XG4gICAgICBjb25zdCBBX3NpZ24gPSBNUEMuc2lnbihtZXNzYWdlX2J1ZmZlciwgQV9zaWduX3NoYXJlLnhTaGFyZSwgW0Jfc2lnbl9zaGFyZS5yU2hhcmVzWzFdXSwgW0MueVNoYXJlc1sxXV0pO1xuICAgICAgY29uc3QgQl9zaWduID0gTVBDLnNpZ24obWVzc2FnZV9idWZmZXIsIEJfc2lnbl9zaGFyZS54U2hhcmUsIFtBX3NpZ25fc2hhcmUuclNoYXJlc1syXV0sIFtDLnlTaGFyZXNbMl1dKTtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IE1QQy5zaWduQ29tYmluZShbQV9zaWduLCBCX3NpZ25dKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IE1QQy52ZXJpZnkobWVzc2FnZV9idWZmZXIsIHNpZ25hdHVyZSk7XG4gICAgICByZXN1bHQuc2hvdWxkLmVxdWFsKHRydWUpO1xuXG4gICAgICAvLyBWZXJpZnkgdGhlIHB1YmxpYyBrZXkgaW4gdGhlIHNpZ25hdHVyZSBlcXVhbHMgdGhlIHNlcGFyYXRlbHkgZGVyaXZlZCBwdWJsaWMgc3Via2V5LlxuICAgICAgc2lnbmF0dXJlLnkuc2hvdWxkLmVxdWFsKHkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIGlmIHNlZWQgaXMgbm90IGxlbmd0aCA2NCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gTVBDLmtleVNoYXJlKDEsIDIsIDMsIHJhbmRvbUJ5dGVzKDMzKSksIC9TZWVkIG11c3QgaGF2ZSBsZW5ndGggNjQvKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gTVBDLmtleVNoYXJlKDEsIDIsIDMsIHJhbmRvbUJ5dGVzKDY2KSksIC9TZWVkIG11c3QgaGF2ZSBsZW5ndGggNjQvKTtcblxuICAgICAgY29uc3QgZmFrZVBTaGFyZSA9IHtcbiAgICAgICAgaTogMSxcbiAgICAgICAgdDogMyxcbiAgICAgICAgbjogMixcbiAgICAgICAgeTogJ3lTdHJpbmcnLFxuICAgICAgICB1OiAndVN0cmluZycsXG4gICAgICAgIHByZWZpeDogJ3ByZWZpeCcsXG4gICAgICAgIGNoYWluY29kZTogJ2NoYWluY29kZScsXG4gICAgICB9O1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gTVBDLnNpZ25TaGFyZShCdWZmZXIuZnJvbSgnYWJjZCcsICdoZXgnKSwgZmFrZVBTaGFyZSwgW10sIHJhbmRvbUJ5dGVzKDMzKSksXG4gICAgICAgIC9TZWVkIG11c3QgaGF2ZSBsZW5ndGggNjQvLFxuICAgICAgKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IE1QQy5zaWduU2hhcmUoQnVmZmVyLmZyb20oJ2FiY2QnLCAnaGV4JyksIGZha2VQU2hhcmUsIFtdLCByYW5kb21CeXRlcyg2NikpLFxuICAgICAgICAvU2VlZCBtdXN0IGhhdmUgbGVuZ3RoIDY0LyxcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=

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


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