PHP WebShell
Текущая директория: /usr/lib/node_modules/bitgo/node_modules/@bitgo/sdk-lib-mpc/dist/src/curves
Просмотр файла: ed25519Bip32HdTree.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Ed25519Bip32HdTree = void 0;
const crypto_1 = require("crypto");
const util_1 = require("../util");
const ed25519_1 = require("./ed25519");
const util_2 = require("./util");
const constant_1 = require("./constant");
class Ed25519Bip32HdTree {
static async initialize() {
if (!Ed25519Bip32HdTree.initialized) {
await ed25519_1.Ed25519Curve.initialize();
Ed25519Bip32HdTree.initialized = true;
}
return new Ed25519Bip32HdTree();
}
publicDerive(keychain, path) {
const indices = (0, util_2.pathToIndices)(path);
function deriveIndex(acc, index) {
const [pk, chaincode] = acc;
const [zout, iout] = deriveEd25519Helper(index, chaincode, pk);
const zl = zout.slice(0, 32);
// left = kl + 8 * trunc28(zl)
const t = BigInt(8) * (0, util_1.bigIntFromBufferLE)(zl.slice(0, 28));
const left = Ed25519Bip32HdTree.curve.pointAdd(pk, Ed25519Bip32HdTree.curve.basePointMult(t));
return [left, (0, util_1.bigIntFromBufferBE)(iout.slice(32))];
}
const subkey = indices.reduce(deriveIndex, deriveIndex([keychain.pk, keychain.chaincode], indices.shift()));
return { pk: subkey[0], chaincode: subkey[1] };
}
privateDerive(keychain, path) {
const indices = (0, util_2.pathToIndices)(path);
function deriveIndex(acc, index) {
const [pk, sk, prefix, chaincode] = acc;
const [zout, iout] = deriveEd25519Helper(index, chaincode, pk, sk);
const zl = zout.slice(0, 32);
const zr = zout.slice(32);
// left = kl + 8 * trunc28(zl)
const t = BigInt(8) * (0, util_1.bigIntFromBufferLE)(zl.slice(0, 28));
const left_pk = Ed25519Bip32HdTree.curve.pointAdd(pk, Ed25519Bip32HdTree.curve.basePointMult(t));
const left_sk = Ed25519Bip32HdTree.curve.scalarAdd(sk, t);
// right = zr + kr
const right = (prefix + (0, util_1.bigIntFromBufferBE)(zr)) % constant_1.chaincodeBase;
return [left_pk, left_sk, right, (0, util_1.bigIntFromBufferBE)(iout.slice(32))];
}
const [pk, sk, prefix, chaincode] = indices.reduce(deriveIndex, deriveIndex([keychain.pk, keychain.sk, keychain.prefix, keychain.chaincode], indices.shift()));
return { pk, sk, prefix, chaincode };
}
}
exports.Ed25519Bip32HdTree = Ed25519Bip32HdTree;
Ed25519Bip32HdTree.curve = new ed25519_1.Ed25519Curve();
Ed25519Bip32HdTree.initialized = false;
function deriveEd25519Helper(index = 0, chaincode, pk, sk) {
const zmac = (0, crypto_1.createHmac)('sha512', (0, util_1.bigIntToBufferBE)(chaincode, 32));
const imac = (0, crypto_1.createHmac)('sha512', (0, util_1.bigIntToBufferBE)(chaincode, 32));
const seri = Buffer.alloc(4);
seri.writeUInt32LE(index, 0);
if (((index >>> 0) & 0x80000000) === 0) {
// Normal derivation:
// Z = HMAC-SHA512(Key = cpar, Data = 0x02 || serP(point(kpar)) || ser32(i)).
// I = HMAC-SHA512(Key = cpar, Data = 0x03 || serP(point(kpar)) || ser32(i)).
zmac.update('\x02');
zmac.update((0, util_1.bigIntToBufferLE)(pk, 32));
zmac.update(seri);
imac.update('\x03');
imac.update((0, util_1.bigIntToBufferLE)(pk, 32));
imac.update(seri);
}
else {
if (sk === undefined) {
throw new Error("Can't performed hardened derivation without private key");
}
// Hardened derivation:
// Z = HMAC-SHA512(Key = cpar, Data = 0x00 || ser256(left(kpar)) || ser32(i)).
// I = HMAC-SHA512(Key = cpar, Data = 0x01 || ser256(left(kpar)) || ser32(i)).
zmac.update('\x00');
zmac.update((0, util_1.bigIntToBufferLE)(sk, 32));
zmac.update(seri);
imac.update('\x01');
imac.update((0, util_1.bigIntToBufferLE)(sk, 32));
imac.update(seri);
}
return [zmac.digest(), imac.digest()];
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWQyNTUxOUJpcDMySGRUcmVlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2N1cnZlcy9lZDI1NTE5QmlwMzJIZFRyZWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQW9DO0FBQ3BDLGtDQUFxRztBQUNyRyx1Q0FBeUM7QUFFekMsaUNBQXVDO0FBQ3ZDLHlDQUEyQztBQUUzQyxNQUFhLGtCQUFrQjtJQUk3QixNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVU7UUFDckIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sc0JBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNoQyxrQkFBa0IsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3hDLENBQUM7UUFFRCxPQUFPLElBQUksa0JBQWtCLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRUQsWUFBWSxDQUFDLFFBQXdCLEVBQUUsSUFBWTtRQUNqRCxNQUFNLE9BQU8sR0FBRyxJQUFBLG9CQUFhLEVBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsU0FBUyxXQUFXLENBQUMsR0FBYSxFQUFFLEtBQXlCO1lBQzNELE1BQU0sQ0FBQyxFQUFFLEVBQUUsU0FBUyxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQzVCLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMvRCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM3Qiw4QkFBOEI7WUFDOUIsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUEseUJBQWtCLEVBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMxRCxNQUFNLElBQUksR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUYsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFBLHlCQUFrQixFQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzVHLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNqRCxDQUFDO0lBRUQsYUFBYSxDQUFDLFFBQXlCLEVBQUUsSUFBWTtRQUNuRCxNQUFNLE9BQU8sR0FBRyxJQUFBLG9CQUFhLEVBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsU0FBUyxXQUFXLENBQUMsR0FBYSxFQUFFLEtBQXlCO1lBQzNELE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDeEMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNuRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM3QixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzFCLDhCQUE4QjtZQUM5QixNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBQSx5QkFBa0IsRUFBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzFELE1BQU0sT0FBTyxHQUFHLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqRyxNQUFNLE9BQU8sR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMxRCxrQkFBa0I7WUFDbEIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBQSx5QkFBa0IsRUFBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLHdCQUFhLENBQUM7WUFDaEUsT0FBTyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUEseUJBQWtCLEVBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkUsQ0FBQztRQUNELE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUNoRCxXQUFXLEVBQ1gsV0FBVyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxNQUFPLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUMvRixDQUFDO1FBQ0YsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7O0FBaERILGdEQWlEQztBQWhEUSx3QkFBSyxHQUFpQixJQUFJLHNCQUFZLEVBQUUsQ0FBQztBQUN6Qyw4QkFBVyxHQUFHLEtBQUssQ0FBQztBQWlEN0IsU0FBUyxtQkFBbUIsQ0FBQyxRQUE0QixDQUFDLEVBQUUsU0FBaUIsRUFBRSxFQUFVLEVBQUUsRUFBVztJQUNwRyxNQUFNLElBQUksR0FBRyxJQUFBLG1CQUFVLEVBQUMsUUFBUSxFQUFFLElBQUEsdUJBQWdCLEVBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbkUsTUFBTSxJQUFJLEdBQUcsSUFBQSxtQkFBVSxFQUFDLFFBQVEsRUFBRSxJQUFBLHVCQUFnQixFQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25FLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDN0IsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLHFCQUFxQjtRQUNyQiw2RUFBNkU7UUFDN0UsNkVBQTZFO1FBQzdFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFBLHVCQUFnQixFQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUEsdUJBQWdCLEVBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQixDQUFDO1NBQU0sQ0FBQztRQUNOLElBQUksRUFBRSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMseURBQXlELENBQUMsQ0FBQztRQUM3RSxDQUFDO1FBQ0QsdUJBQXVCO1FBQ3ZCLDhFQUE4RTtRQUM5RSw4RUFBOEU7UUFDOUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUEsdUJBQWdCLEVBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBQSx1QkFBZ0IsRUFBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVIbWFjIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IGJpZ0ludEZyb21CdWZmZXJCRSwgYmlnSW50RnJvbUJ1ZmZlckxFLCBiaWdJbnRUb0J1ZmZlckJFLCBiaWdJbnRUb0J1ZmZlckxFIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBFZDI1NTE5Q3VydmUgfSBmcm9tICcuL2VkMjU1MTknO1xuaW1wb3J0IHsgUHJpdmF0ZUtleWNoYWluLCBQdWJsaWNLZXljaGFpbiB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgcGF0aFRvSW5kaWNlcyB9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgeyBjaGFpbmNvZGVCYXNlIH0gZnJvbSAnLi9jb25zdGFudCc7XG5cbmV4cG9ydCBjbGFzcyBFZDI1NTE5QmlwMzJIZFRyZWUge1xuICBzdGF0aWMgY3VydmU6IEVkMjU1MTlDdXJ2ZSA9IG5ldyBFZDI1NTE5Q3VydmUoKTtcbiAgc3RhdGljIGluaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgc3RhdGljIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTxFZDI1NTE5QmlwMzJIZFRyZWU+IHtcbiAgICBpZiAoIUVkMjU1MTlCaXAzMkhkVHJlZS5pbml0aWFsaXplZCkge1xuICAgICAgYXdhaXQgRWQyNTUxOUN1cnZlLmluaXRpYWxpemUoKTtcbiAgICAgIEVkMjU1MTlCaXAzMkhkVHJlZS5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBFZDI1NTE5QmlwMzJIZFRyZWUoKTtcbiAgfVxuXG4gIHB1YmxpY0Rlcml2ZShrZXljaGFpbjogUHVibGljS2V5Y2hhaW4sIHBhdGg6IHN0cmluZyk6IFB1YmxpY0tleWNoYWluIHtcbiAgICBjb25zdCBpbmRpY2VzID0gcGF0aFRvSW5kaWNlcyhwYXRoKTtcbiAgICBmdW5jdGlvbiBkZXJpdmVJbmRleChhY2M6IGJpZ2ludFtdLCBpbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkKTogYmlnaW50W10ge1xuICAgICAgY29uc3QgW3BrLCBjaGFpbmNvZGVdID0gYWNjO1xuICAgICAgY29uc3QgW3pvdXQsIGlvdXRdID0gZGVyaXZlRWQyNTUxOUhlbHBlcihpbmRleCwgY2hhaW5jb2RlLCBwayk7XG4gICAgICBjb25zdCB6bCA9IHpvdXQuc2xpY2UoMCwgMzIpO1xuICAgICAgLy8gbGVmdCA9IGtsICsgOCAqIHRydW5jMjgoemwpXG4gICAgICBjb25zdCB0ID0gQmlnSW50KDgpICogYmlnSW50RnJvbUJ1ZmZlckxFKHpsLnNsaWNlKDAsIDI4KSk7XG4gICAgICBjb25zdCBsZWZ0ID0gRWQyNTUxOUJpcDMySGRUcmVlLmN1cnZlLnBvaW50QWRkKHBrLCBFZDI1NTE5QmlwMzJIZFRyZWUuY3VydmUuYmFzZVBvaW50TXVsdCh0KSk7XG4gICAgICByZXR1cm4gW2xlZnQsIGJpZ0ludEZyb21CdWZmZXJCRShpb3V0LnNsaWNlKDMyKSldO1xuICAgIH1cbiAgICBjb25zdCBzdWJrZXkgPSBpbmRpY2VzLnJlZHVjZShkZXJpdmVJbmRleCwgZGVyaXZlSW5kZXgoW2tleWNoYWluLnBrLCBrZXljaGFpbi5jaGFpbmNvZGVdLCBpbmRpY2VzLnNoaWZ0KCkpKTtcbiAgICByZXR1cm4geyBwazogc3Via2V5WzBdLCBjaGFpbmNvZGU6IHN1YmtleVsxXSB9O1xuICB9XG5cbiAgcHJpdmF0ZURlcml2ZShrZXljaGFpbjogUHJpdmF0ZUtleWNoYWluLCBwYXRoOiBzdHJpbmcpOiBQcml2YXRlS2V5Y2hhaW4ge1xuICAgIGNvbnN0IGluZGljZXMgPSBwYXRoVG9JbmRpY2VzKHBhdGgpO1xuICAgIGZ1bmN0aW9uIGRlcml2ZUluZGV4KGFjYzogYmlnaW50W10sIGluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQpOiBiaWdpbnRbXSB7XG4gICAgICBjb25zdCBbcGssIHNrLCBwcmVmaXgsIGNoYWluY29kZV0gPSBhY2M7XG4gICAgICBjb25zdCBbem91dCwgaW91dF0gPSBkZXJpdmVFZDI1NTE5SGVscGVyKGluZGV4LCBjaGFpbmNvZGUsIHBrLCBzayk7XG4gICAgICBjb25zdCB6bCA9IHpvdXQuc2xpY2UoMCwgMzIpO1xuICAgICAgY29uc3QgenIgPSB6b3V0LnNsaWNlKDMyKTtcbiAgICAgIC8vIGxlZnQgPSBrbCArIDggKiB0cnVuYzI4KHpsKVxuICAgICAgY29uc3QgdCA9IEJpZ0ludCg4KSAqIGJpZ0ludEZyb21CdWZmZXJMRSh6bC5zbGljZSgwLCAyOCkpO1xuICAgICAgY29uc3QgbGVmdF9wayA9IEVkMjU1MTlCaXAzMkhkVHJlZS5jdXJ2ZS5wb2ludEFkZChwaywgRWQyNTUxOUJpcDMySGRUcmVlLmN1cnZlLmJhc2VQb2ludE11bHQodCkpO1xuICAgICAgY29uc3QgbGVmdF9zayA9IEVkMjU1MTlCaXAzMkhkVHJlZS5jdXJ2ZS5zY2FsYXJBZGQoc2ssIHQpO1xuICAgICAgLy8gcmlnaHQgPSB6ciArIGtyXG4gICAgICBjb25zdCByaWdodCA9IChwcmVmaXggKyBiaWdJbnRGcm9tQnVmZmVyQkUoenIpKSAlIGNoYWluY29kZUJhc2U7XG4gICAgICByZXR1cm4gW2xlZnRfcGssIGxlZnRfc2ssIHJpZ2h0LCBiaWdJbnRGcm9tQnVmZmVyQkUoaW91dC5zbGljZSgzMikpXTtcbiAgICB9XG4gICAgY29uc3QgW3BrLCBzaywgcHJlZml4LCBjaGFpbmNvZGVdID0gaW5kaWNlcy5yZWR1Y2UoXG4gICAgICBkZXJpdmVJbmRleCxcbiAgICAgIGRlcml2ZUluZGV4KFtrZXljaGFpbi5waywga2V5Y2hhaW4uc2ssIGtleWNoYWluLnByZWZpeCEsIGtleWNoYWluLmNoYWluY29kZV0sIGluZGljZXMuc2hpZnQoKSlcbiAgICApO1xuICAgIHJldHVybiB7IHBrLCBzaywgcHJlZml4LCBjaGFpbmNvZGUgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkZXJpdmVFZDI1NTE5SGVscGVyKGluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQgPSAwLCBjaGFpbmNvZGU6IGJpZ2ludCwgcGs6IGJpZ2ludCwgc2s/OiBiaWdpbnQpOiBCdWZmZXJbXSB7XG4gIGNvbnN0IHptYWMgPSBjcmVhdGVIbWFjKCdzaGE1MTInLCBiaWdJbnRUb0J1ZmZlckJFKGNoYWluY29kZSwgMzIpKTtcbiAgY29uc3QgaW1hYyA9IGNyZWF0ZUhtYWMoJ3NoYTUxMicsIGJpZ0ludFRvQnVmZmVyQkUoY2hhaW5jb2RlLCAzMikpO1xuICBjb25zdCBzZXJpID0gQnVmZmVyLmFsbG9jKDQpO1xuICBzZXJpLndyaXRlVUludDMyTEUoaW5kZXgsIDApO1xuICBpZiAoKChpbmRleCA+Pj4gMCkgJiAweDgwMDAwMDAwKSA9PT0gMCkge1xuICAgIC8vIE5vcm1hbCBkZXJpdmF0aW9uOlxuICAgIC8vIFogPSBITUFDLVNIQTUxMihLZXkgPSBjcGFyLCBEYXRhID0gMHgwMiB8fCBzZXJQKHBvaW50KGtwYXIpKSB8fCBzZXIzMihpKSkuXG4gICAgLy8gSSA9IEhNQUMtU0hBNTEyKEtleSA9IGNwYXIsIERhdGEgPSAweDAzIHx8IHNlclAocG9pbnQoa3BhcikpIHx8IHNlcjMyKGkpKS5cbiAgICB6bWFjLnVwZGF0ZSgnXFx4MDInKTtcbiAgICB6bWFjLnVwZGF0ZShiaWdJbnRUb0J1ZmZlckxFKHBrLCAzMikpO1xuICAgIHptYWMudXBkYXRlKHNlcmkpO1xuICAgIGltYWMudXBkYXRlKCdcXHgwMycpO1xuICAgIGltYWMudXBkYXRlKGJpZ0ludFRvQnVmZmVyTEUocGssIDMyKSk7XG4gICAgaW1hYy51cGRhdGUoc2VyaSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHNrID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IHBlcmZvcm1lZCBoYXJkZW5lZCBkZXJpdmF0aW9uIHdpdGhvdXQgcHJpdmF0ZSBrZXlcIik7XG4gICAgfVxuICAgIC8vIEhhcmRlbmVkIGRlcml2YXRpb246XG4gICAgLy8gWiA9IEhNQUMtU0hBNTEyKEtleSA9IGNwYXIsIERhdGEgPSAweDAwIHx8IHNlcjI1NihsZWZ0KGtwYXIpKSB8fCBzZXIzMihpKSkuXG4gICAgLy8gSSA9IEhNQUMtU0hBNTEyKEtleSA9IGNwYXIsIERhdGEgPSAweDAxIHx8IHNlcjI1NihsZWZ0KGtwYXIpKSB8fCBzZXIzMihpKSkuXG4gICAgem1hYy51cGRhdGUoJ1xceDAwJyk7XG4gICAgem1hYy51cGRhdGUoYmlnSW50VG9CdWZmZXJMRShzaywgMzIpKTtcbiAgICB6bWFjLnVwZGF0ZShzZXJpKTtcbiAgICBpbWFjLnVwZGF0ZSgnXFx4MDEnKTtcbiAgICBpbWFjLnVwZGF0ZShiaWdJbnRUb0J1ZmZlckxFKHNrLCAzMikpO1xuICAgIGltYWMudXBkYXRlKHNlcmkpO1xuICB9XG4gIHJldHVybiBbem1hYy5kaWdlc3QoKSwgaW1hYy5kaWdlc3QoKV07XG59XG4iXX0=Выполнить команду
Для локальной разработки. Не используйте в интернете!