PHP WebShell

Текущая директория: /usr/lib/node_modules/bitgo/node_modules/avalanche/typings/tests/apis/avm

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

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const bn_js_1 = __importDefault(require("bn.js"));
const buffer_1 = require("buffer/");
const bintools_1 = __importDefault(require("../../../src/utils/bintools"));
const outputs_1 = require("../../../src/apis/avm/outputs");
const output_1 = require("../../../src/common/output");
const outputs_2 = require("../../../src/apis/avm/outputs");
const avm_1 = require("../../../src/apis/avm");
const bintools = bintools_1.default.getInstance();
describe("Outputs", () => {
    const codecID_zero = 0;
    const codecID_one = 1;
    describe("NFTMintOutput", () => {
        const addrs = [
            bintools.cb58Decode("B6D4v1VtPYLbiUvYXtW4Px8oE9imC2vGW"),
            bintools.cb58Decode("P5wdRuZeaDt28eHMP5S3w9ZdoBfo7wuzF"),
            bintools.cb58Decode("6Y3kysjF9jnHnYkdS9yGAuoHyae2eNmeV")
        ].sort();
        const locktime = new bn_js_1.default(54321);
        const addrpay = [addrs[0], addrs[1]];
        const fallLocktime = locktime.add(new bn_js_1.default(50));
        test("SelectOutputClass", () => {
            const goodout = new outputs_1.NFTMintOutput(0, addrpay, fallLocktime, 1);
            const outpayment = (0, outputs_1.SelectOutputClass)(goodout.getOutputID());
            expect(outpayment).toBeInstanceOf(outputs_1.NFTMintOutput);
            expect(() => {
                (0, outputs_1.SelectOutputClass)(99);
            }).toThrow("Error - SelectOutputClass: unknown outputid");
        });
        test("comparator", () => {
            const outpayment1 = new outputs_1.NFTMintOutput(1, addrs, fallLocktime, 1);
            const outpayment2 = new outputs_1.NFTMintOutput(2, addrs, fallLocktime, 1);
            const outpayment3 = new outputs_1.NFTMintOutput(0, addrs, fallLocktime, 1);
            const cmp = output_1.Output.comparator();
            expect(cmp(outpayment1, outpayment1)).toBe(0);
            expect(cmp(outpayment2, outpayment2)).toBe(0);
            expect(cmp(outpayment3, outpayment3)).toBe(0);
            expect(cmp(outpayment1, outpayment2)).toBe(-1);
            expect(cmp(outpayment1, outpayment3)).toBe(1);
        });
        test("NFTMintOutput codecIDs", () => {
            const nftMintOutput = new outputs_1.NFTMintOutput(1, addrs, fallLocktime, 1);
            expect(nftMintOutput.getCodecID()).toBe(codecID_zero);
            expect(nftMintOutput.getOutputID()).toBe(avm_1.AVMConstants.NFTMINTOUTPUTID);
            nftMintOutput.setCodecID(codecID_one);
            expect(nftMintOutput.getCodecID()).toBe(codecID_one);
            expect(nftMintOutput.getOutputID()).toBe(avm_1.AVMConstants.NFTMINTOUTPUTID_CODECONE);
            nftMintOutput.setCodecID(codecID_zero);
            expect(nftMintOutput.getCodecID()).toBe(codecID_zero);
            expect(nftMintOutput.getOutputID()).toBe(avm_1.AVMConstants.NFTMINTOUTPUTID);
        });
        test("Invalid NFTMintOutput codecID", () => {
            const nftMintOutput = new outputs_1.NFTMintOutput(1, addrs, fallLocktime, 1);
            expect(() => {
                nftMintOutput.setCodecID(2);
            }).toThrow("Error - NFTMintOutput.setCodecID: invalid codecID. Valid codecIDs are 0 and 1.");
        });
        test("Functionality", () => {
            const out = new outputs_1.NFTMintOutput(0, addrs, fallLocktime, 3);
            expect(out.getOutputID()).toBe(10);
            expect(JSON.stringify(out.getAddresses().sort())).toStrictEqual(JSON.stringify(addrs.sort()));
            expect(out.getThreshold()).toBe(3);
            // expect(out.getLocktime().toNumber()).toBe(locktime.toNumber())
            const r = out.getAddressIdx(addrs[2]);
            expect(out.getAddress(r)).toStrictEqual(addrs[2]);
            expect(() => {
                out.getAddress(400);
            }).toThrow();
            const b = out.toBuffer();
            expect(out.toString()).toBe(bintools.bufferToB58(b));
            const s = out.getSpenders(addrs);
            expect(JSON.stringify(s.sort())).toBe(JSON.stringify(addrs.sort()));
            const m1 = out.meetsThreshold([addrs[0]]);
            expect(m1).toBe(false);
            const m2 = out.meetsThreshold(addrs, new bn_js_1.default(100));
            expect(m2).toBe(false);
            const m3 = out.meetsThreshold(addrs);
            expect(m3).toBe(true);
            const m4 = out.meetsThreshold(addrs, locktime.add(new bn_js_1.default(100)));
            expect(m4).toBe(true);
        });
    });
    describe("SECPTransferOutput", () => {
        const addrs = [
            bintools.cb58Decode("B6D4v1VtPYLbiUvYXtW4Px8oE9imC2vGW"),
            bintools.cb58Decode("P5wdRuZeaDt28eHMP5S3w9ZdoBfo7wuzF"),
            bintools.cb58Decode("6Y3kysjF9jnHnYkdS9yGAuoHyae2eNmeV")
        ].sort();
        const locktime = new bn_js_1.default(54321);
        const addrpay = [addrs[0], addrs[1]];
        const fallLocktime = locktime.add(new bn_js_1.default(50));
        test("SelectOutputClass", () => {
            const goodout = new outputs_1.SECPTransferOutput(new bn_js_1.default(2600), addrpay, fallLocktime, 1);
            const outpayment = (0, outputs_1.SelectOutputClass)(goodout.getOutputID());
            expect(outpayment).toBeInstanceOf(outputs_1.SECPTransferOutput);
            expect(() => {
                (0, outputs_1.SelectOutputClass)(99);
            }).toThrow("Error - SelectOutputClass: unknown outputid");
        });
        test("comparator", () => {
            const outpayment1 = new outputs_1.SECPTransferOutput(new bn_js_1.default(10000), addrs, locktime, 3);
            const outpayment2 = new outputs_1.SECPTransferOutput(new bn_js_1.default(10001), addrs, locktime, 3);
            const outpayment3 = new outputs_1.SECPTransferOutput(new bn_js_1.default(9999), addrs, locktime, 3);
            const cmp = output_1.Output.comparator();
            expect(cmp(outpayment1, outpayment1)).toBe(0);
            expect(cmp(outpayment2, outpayment2)).toBe(0);
            expect(cmp(outpayment3, outpayment3)).toBe(0);
            expect(cmp(outpayment1, outpayment2)).toBe(-1);
            expect(cmp(outpayment1, outpayment3)).toBe(1);
        });
        test("SECPTransferOutput", () => {
            const out = new outputs_1.SECPTransferOutput(new bn_js_1.default(10000), addrs, locktime, 3);
            expect(out.getOutputID()).toBe(7);
            expect(JSON.stringify(out.getAddresses().sort())).toStrictEqual(JSON.stringify(addrs.sort()));
            expect(out.getThreshold()).toBe(3);
            expect(out.getLocktime().toNumber()).toBe(locktime.toNumber());
            const r = out.getAddressIdx(addrs[2]);
            expect(out.getAddress(r)).toStrictEqual(addrs[2]);
            expect(() => {
                out.getAddress(400);
            }).toThrow();
            expect(out.getAmount().toNumber()).toBe(10000);
            const b = out.toBuffer();
            expect(out.toString()).toBe(bintools.bufferToB58(b));
            const s = out.getSpenders(addrs);
            expect(JSON.stringify(s.sort())).toBe(JSON.stringify(addrs.sort()));
            const m1 = out.meetsThreshold([addrs[0]]);
            expect(m1).toBe(false);
            const m2 = out.meetsThreshold(addrs, new bn_js_1.default(100));
            expect(m2).toBe(false);
            const m3 = out.meetsThreshold(addrs);
            expect(m3).toBe(true);
            const m4 = out.meetsThreshold(addrs, locktime.add(new bn_js_1.default(100)));
            expect(m4).toBe(true);
        });
        test("SECPTransferOutput codecIDs", () => {
            const secPTransferOutput = new outputs_1.SECPTransferOutput(new bn_js_1.default(10000), addrs, locktime, 3);
            expect(secPTransferOutput.getCodecID()).toBe(codecID_zero);
            expect(secPTransferOutput.getOutputID()).toBe(avm_1.AVMConstants.SECPXFEROUTPUTID);
            secPTransferOutput.setCodecID(codecID_one);
            expect(secPTransferOutput.getCodecID()).toBe(codecID_one);
            expect(secPTransferOutput.getOutputID()).toBe(avm_1.AVMConstants.SECPXFEROUTPUTID_CODECONE);
            secPTransferOutput.setCodecID(codecID_zero);
            expect(secPTransferOutput.getCodecID()).toBe(codecID_zero);
            expect(secPTransferOutput.getOutputID()).toBe(avm_1.AVMConstants.SECPXFEROUTPUTID);
        });
        test("Invalid SECPTransferOutput codecID", () => {
            const secPTransferOutput = new outputs_1.SECPTransferOutput(new bn_js_1.default(10000), addrs, locktime, 3);
            expect(() => {
                secPTransferOutput.setCodecID(2);
            }).toThrow("Error - SECPTransferOutput.setCodecID: invalid codecID. Valid codecIDs are 0 and 1.");
        });
        test("SECPMintOutput", () => {
            const out = new outputs_2.SECPMintOutput(addrs, locktime, 3);
            expect(out.getOutputID()).toBe(6);
            expect(JSON.stringify(out.getAddresses().sort())).toStrictEqual(JSON.stringify(addrs.sort()));
            expect(out.getThreshold()).toBe(3);
            expect(out.getLocktime().toNumber()).toBe(locktime.toNumber());
            const r = out.getAddressIdx(addrs[2]);
            expect(out.getAddress(r)).toStrictEqual(addrs[2]);
            expect(() => {
                out.getAddress(400);
            }).toThrow();
            const b = out.toBuffer();
            expect(out.toString()).toBe(bintools.bufferToB58(b));
            const s = out.getSpenders(addrs);
            expect(JSON.stringify(s.sort())).toBe(JSON.stringify(addrs.sort()));
            const m1 = out.meetsThreshold([addrs[0]]);
            expect(m1).toBe(false);
            const m2 = out.meetsThreshold(addrs, new bn_js_1.default(100));
            expect(m2).toBe(false);
            const m3 = out.meetsThreshold(addrs);
            expect(m3).toBe(true);
            const m4 = out.meetsThreshold(addrs, locktime.add(new bn_js_1.default(100)));
            expect(m4).toBe(true);
        });
        test("SECPMintOutput bad address", () => {
            const badAddress = buffer_1.Buffer.from("adfasdfsas", "hex");
            expect(() => {
                new outputs_2.SECPMintOutput([badAddress], locktime, 3);
            }).toThrow("Error - NBytes.fromBuffer: Error: Error - NBytes.fromBuffer: not enough space available in buffer.");
        });
        test("SECPMintOutput codecIDs", () => {
            const secpMintOutput = new outputs_2.SECPMintOutput(addrs, locktime, 3);
            expect(secpMintOutput.getCodecID()).toBe(codecID_zero);
            expect(secpMintOutput.getOutputID()).toBe(avm_1.AVMConstants.SECPMINTOUTPUTID);
            secpMintOutput.setCodecID(codecID_one);
            expect(secpMintOutput.getCodecID()).toBe(codecID_one);
            expect(secpMintOutput.getOutputID()).toBe(avm_1.AVMConstants.SECPMINTOUTPUTID_CODECONE);
            secpMintOutput.setCodecID(codecID_zero);
            expect(secpMintOutput.getCodecID()).toBe(codecID_zero);
            expect(secpMintOutput.getOutputID()).toBe(avm_1.AVMConstants.SECPMINTOUTPUTID);
        });
        test("Invalid SECPMintOutput codecID", () => {
            const secpMintOutput = new outputs_2.SECPMintOutput(addrs, locktime, 3);
            expect(() => {
                secpMintOutput.setCodecID(2);
            }).toThrow("Error - SECPMintOutput.setCodecID: invalid codecID. Valid codecIDs are 0 and 1.");
        });
    });
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0cHV0cy50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdHMvYXBpcy9hdm0vb3V0cHV0cy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsa0RBQXNCO0FBQ3RCLG9DQUFnQztBQUNoQywyRUFBa0Q7QUFDbEQsMkRBSXNDO0FBQ3RDLHVEQUFtRDtBQUNuRCwyREFBOEQ7QUFDOUQsK0NBQW9EO0FBRXBELE1BQU0sUUFBUSxHQUFhLGtCQUFRLENBQUMsV0FBVyxFQUFFLENBQUE7QUFFakQsUUFBUSxDQUFDLFNBQVMsRUFBRSxHQUFTLEVBQUU7SUFDN0IsTUFBTSxZQUFZLEdBQVcsQ0FBQyxDQUFBO0lBQzlCLE1BQU0sV0FBVyxHQUFXLENBQUMsQ0FBQTtJQUM3QixRQUFRLENBQUMsZUFBZSxFQUFFLEdBQVMsRUFBRTtRQUNuQyxNQUFNLEtBQUssR0FBYTtZQUN0QixRQUFRLENBQUMsVUFBVSxDQUFDLG1DQUFtQyxDQUFDO1lBQ3hELFFBQVEsQ0FBQyxVQUFVLENBQUMsbUNBQW1DLENBQUM7WUFDeEQsUUFBUSxDQUFDLFVBQVUsQ0FBQyxtQ0FBbUMsQ0FBQztTQUN6RCxDQUFDLElBQUksRUFBRSxDQUFBO1FBRVIsTUFBTSxRQUFRLEdBQU8sSUFBSSxlQUFFLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDbEMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDcEMsTUFBTSxZQUFZLEdBQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLGVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBRWpELElBQUksQ0FBQyxtQkFBbUIsRUFBRSxHQUFTLEVBQUU7WUFDbkMsTUFBTSxPQUFPLEdBQWtCLElBQUksdUJBQWEsQ0FDOUMsQ0FBQyxFQUNELE9BQU8sRUFDUCxZQUFZLEVBQ1osQ0FBQyxDQUNGLENBQUE7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QkFDVixjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQzlCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FDUixpRkFBaUYsQ0FDbEYsQ0FBQTtRQUNILENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCTiBmcm9tIFwiYm4uanNcIlxuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSBcImJ1ZmZlci9cIlxuaW1wb3J0IEJpblRvb2xzIGZyb20gXCIuLi8uLi8uLi9zcmMvdXRpbHMvYmludG9vbHNcIlxuaW1wb3J0IHtcbiAgU0VDUFRyYW5zZmVyT3V0cHV0LFxuICBTZWxlY3RPdXRwdXRDbGFzcyxcbiAgTkZUTWludE91dHB1dFxufSBmcm9tIFwiLi4vLi4vLi4vc3JjL2FwaXMvYXZtL291dHB1dHNcIlxuaW1wb3J0IHsgT3V0cHV0IH0gZnJvbSBcIi4uLy4uLy4uL3NyYy9jb21tb24vb3V0cHV0XCJcbmltcG9ydCB7IFNFQ1BNaW50T3V0cHV0IH0gZnJvbSBcIi4uLy4uLy4uL3NyYy9hcGlzL2F2bS9vdXRwdXRzXCJcbmltcG9ydCB7IEFWTUNvbnN0YW50cyB9IGZyb20gXCIuLi8uLi8uLi9zcmMvYXBpcy9hdm1cIlxuXG5jb25zdCBiaW50b29sczogQmluVG9vbHMgPSBCaW5Ub29scy5nZXRJbnN0YW5jZSgpXG5cbmRlc2NyaWJlKFwiT3V0cHV0c1wiLCAoKTogdm9pZCA9PiB7XG4gIGNvbnN0IGNvZGVjSURfemVybzogbnVtYmVyID0gMFxuICBjb25zdCBjb2RlY0lEX29uZTogbnVtYmVyID0gMVxuICBkZXNjcmliZShcIk5GVE1pbnRPdXRwdXRcIiwgKCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGFkZHJzOiBCdWZmZXJbXSA9IFtcbiAgICAgIGJpbnRvb2xzLmNiNThEZWNvZGUoXCJCNkQ0djFWdFBZTGJpVXZZWHRXNFB4OG9FOWltQzJ2R1dcIiksXG4gICAgICBiaW50b29scy5jYjU4RGVjb2RlKFwiUDV3ZFJ1WmVhRHQyOGVITVA1UzN3OVpkb0Jmbzd3dXpGXCIpLFxuICAgICAgYmludG9vbHMuY2I1OERlY29kZShcIjZZM2t5c2pGOWpuSG5Za2RTOXlHQXVvSHlhZTJlTm1lVlwiKVxuICAgIF0uc29ydCgpXG5cbiAgICBjb25zdCBsb2NrdGltZTogQk4gPSBuZXcgQk4oNTQzMjEpXG4gICAgY29uc3QgYWRkcnBheSA9IFthZGRyc1swXSwgYWRkcnNbMV1dXG4gICAgY29uc3QgZmFsbExvY2t0aW1lOiBCTiA9IGxvY2t0aW1lLmFkZChuZXcgQk4oNTApKVxuXG4gICAgdGVzdChcIlNlbGVjdE91dHB1dENsYXNzXCIsICgpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGdvb2RvdXQ6IE5GVE1pbnRPdXRwdXQgPSBuZXcgTkZUTWludE91dHB1dChcbiAgICAgICAgMCxcbiAgICAgICAgYWRkcnBheSxcbiAgICAgICAgZmFsbExvY2t0aW1lLFxuICAgICAgICAxXG4gICAgICApXG4gICAgICBjb25zdCBvdXRwYXltZW50OiBPdXRwdXQgPSBTZWxlY3RPdXRwdXRDbGFzcyhnb29kb3V0LmdldE91dHB1dElEKCkpXG4gICAgICBleHBlY3Qob3V0cGF5bWVudCkudG9CZUluc3RhbmNlT2YoTkZUTWludE91dHB1dClcbiAgICAgIGV4cGVjdCgoKTogdm9pZCA9PiB7XG4gICAgICAgIFNlbGVjdE91dHB1dENsYXNzKDk5KVxuICAgICAgfSkudG9UaHJvdyhcIkVycm9yIC0gU2VsZWN0T3V0cHV0Q2xhc3M6IHVua25vd24gb3V0cHV0aWRcIilcbiAgICB9KVxuXG4gICAgdGVzdChcImNvbXBhcmF0b3JcIiwgKCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3Qgb3V0cGF5bWVudDE6IE91dHB1dCA9IG5ldyBORlRNaW50T3V0cHV0KDEsIGFkZHJzLCBmYWxsTG9ja3RpbWUsIDEpXG4gICAgICBjb25zdCBvdXRwYXltZW50MjogT3V0cHV0ID0gbmV3IE5GVE1pbnRPdXRwdXQoMiwgYWRkcnMsIGZhbGxMb2NrdGltZSwgMSlcbiAgICAgIGNvbnN0IG91dHBheW1lbnQzOiBPdXRwdXQgPSBuZXcgTkZUTWludE91dHB1dCgwLCBhZGRycywgZmFsbExvY2t0aW1lLCAxKVxuICAgICAgY29uc3QgY21wID0gT3V0cHV0LmNvbXBhcmF0b3IoKVxuICAgICAgZXhwZWN0KGNtcChvdXRwYXltZW50MSwgb3V0cGF5bWVudDEpKS50b0JlKDApXG4gICAgICBleHBlY3QoY21wKG91dHBheW1lbnQyLCBvdXRwYXltZW50MikpLnRvQmUoMClcbiAgICAgIGV4cGVjdChjbXAob3V0cGF5bWVudDMsIG91dHBheW1lbnQzKSkudG9CZSgwKVxuICAgICAgZXhwZWN0KGNtcChvdXRwYXltZW50MSwgb3V0cGF5bWVudDIpKS50b0JlKC0xKVxuICAgICAgZXhwZWN0KGNtcChvdXRwYXltZW50MSwgb3V0cGF5bWVudDMpKS50b0JlKDEpXG4gICAgfSlcblxuICAgIHRlc3QoXCJORlRNaW50T3V0cHV0IGNvZGVjSURzXCIsICgpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IG5mdE1pbnRPdXRwdXQ6IE5GVE1pbnRPdXRwdXQgPSBuZXcgTkZUTWludE91dHB1dChcbiAgICAgICAgMSxcbiAgICAgICAgYWRkcnMsXG4gICAgICAgIGZhbGxMb2NrdGltZSxcbiAgICAgICAgMVxuICAgICAgKVxuXG4gICAgICBleHBlY3QobmZ0TWludE91dHB1dC5nZXRDb2RlY0lEKCkpLnRvQmUoY29kZWNJRF96ZXJvKVxuICAgICAgZXhwZWN0KG5mdE1pbnRPdXRwdXQuZ2V0T3V0cHV0SUQoKSkudG9CZShBVk1Db25zdGFudHMuTkZUTUlOVE9VVFBVVElEKVxuICAgICAgbmZ0TWludE91dHB1dC5zZXRDb2RlY0lEKGNvZGVjSURfb25lKVxuICAgICAgZXhwZWN0KG5mdE1pbnRPdXRwdXQuZ2V0Q29kZWNJRCgpKS50b0JlKGNvZGVjSURfb25lKVxuICAgICAgZXhwZWN0KG5mdE1pbnRPdXRwdXQuZ2V0T3V0cHV0SUQoKSkudG9CZShcbiAgICAgICAgQVZNQ29uc3RhbnRzLk5GVE1JTlRPVVRQVVRJRF9DT0RFQ09ORVxuICAgICAgKVxuICAgICAgbmZ0TWludE91dHB1dC5zZXRDb2RlY0lEKGNvZGVjSURfemVybylcbiAgICAgIGV4cGVjdChuZnRNaW50T3V0cHV0LmdldENvZGVjSUQoKSkudG9CZShjb2RlY0lEX3plcm8pXG4gICAgICBleHBlY3QobmZ0TWludE91dHB1dC5nZXRPdXRwdXRJRCgpKS50b0JlKEFWTUNvbnN0YW50cy5ORlRNSU5UT1VUUFVUSUQpXG4gICAgfSlcblxuICAgIHRlc3QoXCJJbnZhbGlkIE5GVE1pbnRPdXRwdXQgY29kZWNJRFwiLCAoKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBuZnRNaW50T3V0cHV0OiBORlRNaW50T3V0cHV0ID0gbmV3IE5GVE1pbnRPdXRwdXQoXG4gICAgICAgIDEsXG4gICAgICAgIGFkZHJzLFxuICAgICAgICBmYWxsTG9ja3RpbWUsXG4gICAgICAgIDFcbiAgICAgIClcbiAgICAgIGV4cGVjdCgoKTogdm9pZCA9PiB7XG4gICAgICAgIG5mdE1pbnRPdXRwdXQuc2V0Q29kZWNJRCgyKVxuICAgICAgfSkudG9UaHJvdyhcbiAgICAgICAgXCJFcnJvciAtIE5GVE1pbnRPdXRwdXQuc2V0Q29kZWNJRDogaW52YWxpZCBjb2RlY0lELiBWYWxpZCBjb2RlY0lEcyBhcmUgMCBhbmQgMS5cIlxuICAgICAgKVxuICAgIH0pXG5cbiAgICB0ZXN0KFwiRnVuY3Rpb25hbGl0eVwiLCAoKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBvdXQ6IE5GVE1pbnRPdXRwdXQgPSBuZXcgTkZUTWludE91dHB1dCgwLCBhZGRycywgZmFsbExvY2t0aW1lLCAzKVxuICAgICAgZXhwZWN0KG91dC5nZXRPdXRwdXRJRCgpKS50b0JlKDEwKVxuICAgICAgZXhwZWN0KEpTT04uc3RyaW5naWZ5KG91dC5nZXRBZGRyZXNzZXMoKS5zb3J0KCkpKS50b1N0cmljdEVxdWFsKFxuICAgICAgICBKU09OLnN0cmluZ2lmeShhZGRycy5zb3J0KCkpXG4gICAgICApXG5cbiAgICAgIGV4cGVjdChvdXQuZ2V0VGhyZXNob2xkKCkpLnRvQmUoMylcbiAgICAgIC8vIGV4cGVjdChvdXQuZ2V0TG9ja3RpbWUoKS50b051bWJlcigpKS50b0JlKGxvY2t0aW1lLnRvTnVtYmVyKCkpXG5cbiAgICAgIGNvbnN0IHIgPSBvdXQuZ2V0QWRkcmVzc0lkeChhZGRyc1syXSlcbiAgICAgIGV4cGVjdChvdXQuZ2V0QWRkcmVzcyhyKSkudG9TdHJpY3RFcXVhbChhZGRyc1syXSlcbiAgICAgIGV4cGVjdCgoKTogdm9pZCA9PiB7XG4gICAgICAgIG91dC5nZXRBZGRyZXNzKDQwMClcbiAgICAgIH0pLnRvVGhyb3coKVxuXG4gICAgICBjb25zdCBiOiBCdWZmZXIgPSBvdXQudG9CdWZmZXIoKVxuICAgICAgZXhwZWN0KG91dC50b1N0cmluZygpKS50b0JlKGJpbnRvb2xzLmJ1ZmZlclRvQjU4KGIpKVxuXG4gICAgICBjb25zdCBzOiBCdWZmZXJbXSA9IG91dC5nZXRTcGVuZGVycyhhZGRycylcbiAgICAgIGV4cGVjdChKU09OLnN0cmluZ2lmeShzLnNvcnQoKSkpLnRvQmUoSlNPTi5zdHJpbmdpZnkoYWRkcnMuc29ydCgpKSlcblxuICAgICAgY29uc3QgbTE6IGJvb2xlYW4gPSBvdXQubWVldHNUaHJlc2hvbGQoW2FkZHJzWzBdXSlcbiAgICAgIGV4cGVjdChtMSkudG9CZShmYWxzZSlcbiAgICAgIGNvbnN0IG0yOiBib29sZWFuID0gb3V0Lm1lZXRzVGhyZXNob2xkKGFkZHJzLCBuZXcgQk4oMTAwKSlcbiAgICAgIGV4cGVjdChtMikudG9CZShmYWxzZSlcbiAgICAgIGNvbnN0IG0zOiBib29sZWFuID0gb3V0Lm1lZXRzVGhyZXNob2xkKGFkZHJzKVxuICAgICAgZXhwZWN0KG0zKS50b0JlKHRydWUpXG4gICAgICBjb25zdCBtNDogYm9vbGVhbiA9IG91dC5tZWV0c1RocmVzaG9sZChhZGRycywgbG9ja3RpbWUuYWRkKG5ldyBCTigxMDApKSlcbiAgICAgIGV4cGVjdChtNCkudG9CZSh0cnVlKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoXCJTRUNQVHJhbnNmZXJPdXRwdXRcIiwgKCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGFkZHJzOiBCdWZmZXJbXSA9IFtcbiAgICAgIGJpbnRvb2xzLmNiNThEZWNvZGUoXCJCNkQ0djFWdFBZTGJpVXZZWHRXNFB4OG9FOWltQzJ2R1dcIiksXG4gICAgICBiaW50b29scy5jYjU4RGVjb2RlKFwiUDV3ZFJ1WmVhRHQyOGVITVA1UzN3OVpkb0Jmbzd3dXpGXCIpLFxuICAgICAgYmludG9vbHMuY2I1OERlY29kZShcIjZZM2t5c2pGOWpuSG5Za2RTOXlHQXVvSHlhZTJlTm1lVlwiKVxuICAgIF0uc29ydCgpXG5cbiAgICBjb25zdCBsb2NrdGltZTogQk4gPSBuZXcgQk4oNTQzMjEpXG4gICAgY29uc3QgYWRkcnBheTogQnVmZmVyW10gPSBbYWRkcnNbMF0sIGFkZHJzWzFdXVxuICAgIGNvbnN0IGZhbGxMb2NrdGltZTogQk4gPSBsb2NrdGltZS5hZGQobmV3IEJOKDUwKSlcblxuICAgIHRlc3QoXCJTZWxlY3RPdXRwdXRDbGFzc1wiLCAoKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBnb29kb3V0OiBTRUNQVHJhbnNmZXJPdXRwdXQgPSBuZXcgU0VDUFRyYW5zZmVyT3V0cHV0KFxuICAgICAgICBuZXcgQk4oMjYwMCksXG4gICAgICAgIGFkZHJwYXksXG4gICAgICAgIGZhbGxMb2NrdGltZSxcbiAgICAgICAgMVxuICAgICAgKVxuICAgICAgY29uc3Qgb3V0cGF5bWVudDogT3V0cHV0ID0gU2VsZWN0T3V0cHV0Q2xhc3MoZ29vZG91dC5nZXRPdXRwdXRJRCgpKVxuICAgICAgZXhwZWN0KG91dHBheW1lbnQpLnRvQmVJbnN0YW5jZU9mKFNFQ1BUcmFuc2Zlck91dHB1dClcbiAgICAgIGV4cGVjdCgoKTogdm9pZCA9PiB7XG4gICAgICAgIFNlbGVjdE91dHB1dENsYXNzKDk5KVxuICAgICAgfSkudG9UaHJvdyhcIkVycm9yIC0gU2VsZWN0T3V0cHV0Q2xhc3M6IHVua25vd24gb3V0cHV0aWRcIilcbiAgICB9KVxuXG4gICAgdGVzdChcImNvbXBhcmF0b3JcIiwgKCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3Qgb3V0cGF5bWVudDE6IE91dHB1dCA9IG5ldyBTRUNQVHJhbnNmZXJPdXRwdXQoXG4gICAgICAgIG5ldyBCTigxMDAwMCksXG4gICAgICAgIGFkZHJzLFxuICAgICAgICBsb2NrdGltZSxcbiAgICAgICAgM1xuICAgICAgKVxuICAgICAgY29uc3Qgb3V0cGF5bWVudDI6IE91dHB1dCA9IG5ldyBTRUNQVHJhbnNmZXJPdXRwdXQoXG4gICAgICAgIG5ldyBCTigxMDAwMSksXG4gICAgICAgIGFkZHJzLFxuICAgICAgICBsb2NrdGltZSxcbiAgICAgICAgM1xuICAgICAgKVxuICAgICAgY29uc3Qgb3V0cGF5bWVudDM6IE91dHB1dCA9IG5ldyBTRUNQVHJhbnNmZXJPdXRwdXQoXG4gICAgICAgIG5ldyBCTig5OTk5KSxcbiAgICAgICAgYWRkcnMsXG4gICAgICAgIGxvY2t0aW1lLFxuICAgICAgICAzXG4gICAgICApXG4gICAgICBjb25zdCBjbXAgPSBPdXRwdXQuY29tcGFyYXRvcigpXG4gICAgICBleHBlY3QoY21wKG91dHBheW1lbnQxLCBvdXRwYXltZW50MSkpLnRvQmUoMClcbiAgICAgIGV4cGVjdChjbXAob3V0cGF5bWVudDIsIG91dHBheW1lbnQyKSkudG9CZSgwKVxuICAgICAgZXhwZWN0KGNtcChvdXRwYXltZW50Mywgb3V0cGF5bWVudDMpKS50b0JlKDApXG4gICAgICBleHBlY3QoY21wKG91dHBheW1lbnQxLCBvdXRwYXltZW50MikpLnRvQmUoLTEpXG4gICAgICBleHBlY3QoY21wKG91dHBheW1lbnQxLCBvdXRwYXltZW50MykpLnRvQmUoMSlcbiAgICB9KVxuXG4gICAgdGVzdChcIlNFQ1BUcmFuc2Zlck91dHB1dFwiLCAoKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBvdXQ6IFNFQ1BUcmFuc2Zlck91dHB1dCA9IG5ldyBTRUNQVHJhbnNmZXJPdXRwdXQoXG4gICAgICAgIG5ldyBCTigxMDAwMCksXG4gICAgICAgIGFkZHJzLFxuICAgICAgICBsb2NrdGltZSxcbiAgICAgICAgM1xuICAgICAgKVxuICAgICAgZXhwZWN0KG91dC5nZXRPdXRwdXRJRCgpKS50b0JlKDcpXG4gICAgICBleHBlY3QoSlNPTi5zdHJpbmdpZnkob3V0LmdldEFkZHJlc3NlcygpLnNvcnQoKSkpLnRvU3RyaWN0RXF1YWwoXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KGFkZHJzLnNvcnQoKSlcbiAgICAgIClcblxuICAgICAgZXhwZWN0KG91dC5nZXRUaHJlc2hvbGQoKSkudG9CZSgzKVxuICAgICAgZXhwZWN0KG91dC5nZXRMb2NrdGltZSgpLnRvTnVtYmVyKCkpLnRvQmUobG9ja3RpbWUudG9OdW1iZXIoKSlcblxuICAgICAgY29uc3QgcjogbnVtYmVyID0gb3V0LmdldEFkZHJlc3NJZHgoYWRkcnNbMl0pXG4gICAgICBleHBlY3Qob3V0LmdldEFkZHJlc3MocikpLnRvU3RyaWN0RXF1YWwoYWRkcnNbMl0pXG4gICAgICBleHBlY3QoKCk6IHZvaWQgPT4ge1xuICAgICAgICBvdXQuZ2V0QWRkcmVzcyg0MDApXG4gICAgICB9KS50b1Rocm93KClcblxuICAgICAgZXhwZWN0KG91dC5nZXRBbW91bnQoKS50b051bWJlcigpKS50b0JlKDEwMDAwKVxuXG4gICAgICBjb25zdCBiOiBCdWZmZXIgPSBvdXQudG9CdWZmZXIoKVxuICAgICAgZXhwZWN0KG91dC50b1N0cmluZygpKS50b0JlKGJpbnRvb2xzLmJ1ZmZlclRvQjU4KGIpKVxuXG4gICAgICBjb25zdCBzOiBCdWZmZXJbXSA9IG91dC5nZXRTcGVuZGVycyhhZGRycylcbiAgICAgIGV4cGVjdChKU09OLnN0cmluZ2lmeShzLnNvcnQoKSkpLnRvQmUoSlNPTi5zdHJpbmdpZnkoYWRkcnMuc29ydCgpKSlcblxuICAgICAgY29uc3QgbTE6IGJvb2xlYW4gPSBvdXQubWVldHNUaHJlc2hvbGQoW2FkZHJzWzBdXSlcbiAgICAgIGV4cGVjdChtMSkudG9CZShmYWxzZSlcbiAgICAgIGNvbnN0IG0yOiBib29sZWFuID0gb3V0Lm1lZXRzVGhyZXNob2xkKGFkZHJzLCBuZXcgQk4oMTAwKSlcbiAgICAgIGV4cGVjdChtMikudG9CZShmYWxzZSlcbiAgICAgIGNvbnN0IG0zOiBib29sZWFuID0gb3V0Lm1lZXRzVGhyZXNob2xkKGFkZHJzKVxuICAgICAgZXhwZWN0KG0zKS50b0JlKHRydWUpXG4gICAgICBjb25zdCBtNDogYm9vbGVhbiA9IG91dC5tZWV0c1RocmVzaG9sZChhZGRycywgbG9ja3RpbWUuYWRkKG5ldyBCTigxMDApKSlcbiAgICAgIGV4cGVjdChtNCkudG9CZSh0cnVlKVxuICAgIH0pXG5cbiAgICB0ZXN0KFwiU0VDUFRyYW5zZmVyT3V0cHV0IGNvZGVjSURzXCIsICgpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IHNlY1BUcmFuc2Zlck91dHB1dDogU0VDUFRyYW5zZmVyT3V0cHV0ID0gbmV3IFNFQ1BUcmFuc2Zlck91dHB1dChcbiAgICAgICAgbmV3IEJOKDEwMDAwKSxcbiAgICAgICAgYWRkcnMsXG4gICAgICAgIGxvY2t0aW1lLFxuICAgICAgICAzXG4gICAgICApXG4gICAgICBleHBlY3Qoc2VjUFRyYW5zZmVyT3V0cHV0LmdldENvZGVjSUQoKSkudG9CZShjb2RlY0lEX3plcm8pXG4gICAgICBleHBlY3Qoc2VjUFRyYW5zZmVyT3V0cHV0LmdldE91dHB1dElEKCkpLnRvQmUoXG4gICAgICAgIEFWTUNvbnN0YW50cy5TRUNQWEZFUk9VVFBVVElEXG4gICAgICApXG4gICAgICBzZWNQVHJhbnNmZXJPdXRwdXQuc2V0Q29kZWNJRChjb2RlY0lEX29uZSlcbiAgICAgIGV4cGVjdChzZWNQVHJhbnNmZXJPdXRwdXQuZ2V0Q29kZWNJRCgpKS50b0JlKGNvZGVjSURfb25lKVxuICAgICAgZXhwZWN0KHNlY1BUcmFuc2Zlck91dHB1dC5nZXRPdXRwdXRJRCgpKS50b0JlKFxuICAgICAgICBBVk1Db25zdGFudHMuU0VDUFhGRVJPVVRQVVRJRF9DT0RFQ09ORVxuICAgICAgKVxuICAgICAgc2VjUFRyYW5zZmVyT3V0cHV0LnNldENvZGVjSUQoY29kZWNJRF96ZXJvKVxuICAgICAgZXhwZWN0KHNlY1BUcmFuc2Zlck91dHB1dC5nZXRDb2RlY0lEKCkpLnRvQmUoY29kZWNJRF96ZXJvKVxuICAgICAgZXhwZWN0KHNlY1BUcmFuc2Zlck91dHB1dC5nZXRPdXRwdXRJRCgpKS50b0JlKFxuICAgICAgICBBVk1Db25zdGFudHMuU0VDUFhGRVJPVVRQVVRJRFxuICAgICAgKVxuICAgIH0pXG5cbiAgICB0ZXN0KFwiSW52YWxpZCBTRUNQVHJhbnNmZXJPdXRwdXQgY29kZWNJRFwiLCAoKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBzZWNQVHJhbnNmZXJPdXRwdXQ6IFNFQ1BUcmFuc2Zlck91dHB1dCA9IG5ldyBTRUNQVHJhbnNmZXJPdXRwdXQoXG4gICAgICAgIG5ldyBCTigxMDAwMCksXG4gICAgICAgIGFkZHJzLFxuICAgICAgICBsb2NrdGltZSxcbiAgICAgICAgM1xuICAgICAgKVxuICAgICAgZXhwZWN0KCgpOiB2b2lkID0+IHtcbiAgICAgICAgc2VjUFRyYW5zZmVyT3V0cHV0LnNldENvZGVjSUQoMilcbiAgICAgIH0pLnRvVGhyb3coXG4gICAgICAgIFwiRXJyb3IgLSBTRUNQVHJhbnNmZXJPdXRwdXQuc2V0Q29kZWNJRDogaW52YWxpZCBjb2RlY0lELiBWYWxpZCBjb2RlY0lEcyBhcmUgMCBhbmQgMS5cIlxuICAgICAgKVxuICAgIH0pXG5cbiAgICB0ZXN0KFwiU0VDUE1pbnRPdXRwdXRcIiwgKCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3Qgb3V0OiBTRUNQTWludE91dHB1dCA9IG5ldyBTRUNQTWludE91dHB1dChhZGRycywgbG9ja3RpbWUsIDMpXG4gICAgICBleHBlY3Qob3V0LmdldE91dHB1dElEKCkpLnRvQmUoNilcbiAgICAgIGV4cGVjdChKU09OLnN0cmluZ2lmeShvdXQuZ2V0QWRkcmVzc2VzKCkuc29ydCgpKSkudG9TdHJpY3RFcXVhbChcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoYWRkcnMuc29ydCgpKVxuICAgICAgKVxuICAgICAgZXhwZWN0KG91dC5nZXRUaHJlc2hvbGQoKSkudG9CZSgzKVxuICAgICAgZXhwZWN0KG91dC5nZXRMb2NrdGltZSgpLnRvTnVtYmVyKCkpLnRvQmUobG9ja3RpbWUudG9OdW1iZXIoKSlcbiAgICAgIGNvbnN0IHI6IG51bWJlciA9IG91dC5nZXRBZGRyZXNzSWR4KGFkZHJzWzJdKVxuICAgICAgZXhwZWN0KG91dC5nZXRBZGRyZXNzKHIpKS50b1N0cmljdEVxdWFsKGFkZHJzWzJdKVxuICAgICAgZXhwZWN0KCgpID0+IHtcbiAgICAgICAgb3V0LmdldEFkZHJlc3MoNDAwKVxuICAgICAgfSkudG9UaHJvdygpXG4gICAgICBjb25zdCBiOiBCdWZmZXIgPSBvdXQudG9CdWZmZXIoKVxuICAgICAgZXhwZWN0KG91dC50b1N0cmluZygpKS50b0JlKGJpbnRvb2xzLmJ1ZmZlclRvQjU4KGIpKVxuICAgICAgY29uc3QgczogQnVmZmVyW10gPSBvdXQuZ2V0U3BlbmRlcnMoYWRkcnMpXG4gICAgICBleHBlY3QoSlNPTi5zdHJpbmdpZnkocy5zb3J0KCkpKS50b0JlKEpTT04uc3RyaW5naWZ5KGFkZHJzLnNvcnQoKSkpXG4gICAgICBjb25zdCBtMTogYm9vbGVhbiA9IG91dC5tZWV0c1RocmVzaG9sZChbYWRkcnNbMF1dKVxuICAgICAgZXhwZWN0KG0xKS50b0JlKGZhbHNlKVxuICAgICAgY29uc3QgbTI6IGJvb2xlYW4gPSBvdXQubWVldHNUaHJlc2hvbGQoYWRkcnMsIG5ldyBCTigxMDApKVxuICAgICAgZXhwZWN0KG0yKS50b0JlKGZhbHNlKVxuICAgICAgY29uc3QgbTM6IGJvb2xlYW4gPSBvdXQubWVldHNUaHJlc2hvbGQoYWRkcnMpXG4gICAgICBleHBlY3QobTMpLnRvQmUodHJ1ZSlcbiAgICAgIGNvbnN0IG00OiBib29sZWFuID0gb3V0Lm1lZXRzVGhyZXNob2xkKGFkZHJzLCBsb2NrdGltZS5hZGQobmV3IEJOKDEwMCkpKVxuICAgICAgZXhwZWN0KG00KS50b0JlKHRydWUpXG4gICAgfSlcblxuICAgIHRlc3QoXCJTRUNQTWludE91dHB1dCBiYWQgYWRkcmVzc1wiLCAoKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBiYWRBZGRyZXNzID0gQnVmZmVyLmZyb20oXCJhZGZhc2Rmc2FzXCIsIFwiaGV4XCIpXG5cbiAgICAgIGV4cGVjdCgoKTogdm9pZCA9PiB7XG4gICAgICAgIG5ldyBTRUNQTWludE91dHB1dChbYmFkQWRkcmVzc10sIGxvY2t0aW1lLCAzKVxuICAgICAgfSkudG9UaHJvdyhcbiAgICAgICAgXCJFcnJvciAtIE5CeXRlcy5mcm9tQnVmZmVyOiBFcnJvcjogRXJyb3IgLSBOQnl0ZXMuZnJvbUJ1ZmZlcjogbm90IGVub3VnaCBzcGFjZSBhdmFpbGFibGUgaW4gYnVmZmVyLlwiXG4gICAgICApXG4gICAgfSlcblxuICAgIHRlc3QoXCJTRUNQTWludE91dHB1dCBjb2RlY0lEc1wiLCAoKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBzZWNwTWludE91dHB1dDogU0VDUE1pbnRPdXRwdXQgPSBuZXcgU0VDUE1pbnRPdXRwdXQoXG4gICAgICAgIGFkZHJzLFxuICAgICAgICBsb2NrdGltZSxcbiAgICAgICAgM1xuICAgICAgKVxuICAgICAgZXhwZWN0KHNlY3BNaW50T3V0cHV0LmdldENvZGVjSUQoKSkudG9CZShjb2RlY0lEX3plcm8pXG4gICAgICBleHBlY3Qoc2VjcE1pbnRPdXRwdXQuZ2V0T3V0cHV0SUQoKSkudG9CZShBVk1Db25zdGFudHMuU0VDUE1JTlRPVVRQVVRJRClcbiAgICAgIHNlY3BNaW50T3V0cHV0LnNldENvZGVjSUQoY29kZWNJRF9vbmUpXG4gICAgICBleHBlY3Qoc2VjcE1pbnRPdXRwdXQuZ2V0Q29kZWNJRCgpKS50b0JlKGNvZGVjSURfb25lKVxuICAgICAgZXhwZWN0KHNlY3BNaW50T3V0cHV0LmdldE91dHB1dElEKCkpLnRvQmUoXG4gICAgICAgIEFWTUNvbnN0YW50cy5TRUNQTUlOVE9VVFBVVElEX0NPREVDT05FXG4gICAgICApXG4gICAgICBzZWNwTWludE91dHB1dC5zZXRDb2RlY0lEKGNvZGVjSURfemVybylcbiAgICAgIGV4cGVjdChzZWNwTWludE91dHB1dC5nZXRDb2RlY0lEKCkpLnRvQmUoY29kZWNJRF96ZXJvKVxuICAgICAgZXhwZWN0KHNlY3BNaW50T3V0cHV0LmdldE91dHB1dElEKCkpLnRvQmUoQVZNQ29uc3RhbnRzLlNFQ1BNSU5UT1VUUFVUSUQpXG4gICAgfSlcblxuICAgIHRlc3QoXCJJbnZhbGlkIFNFQ1BNaW50T3V0cHV0IGNvZGVjSURcIiwgKCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3Qgc2VjcE1pbnRPdXRwdXQ6IFNFQ1BNaW50T3V0cHV0ID0gbmV3IFNFQ1BNaW50T3V0cHV0KFxuICAgICAgICBhZGRycyxcbiAgICAgICAgbG9ja3RpbWUsXG4gICAgICAgIDNcbiAgICAgIClcbiAgICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICAgIHNlY3BNaW50T3V0cHV0LnNldENvZGVjSUQoMilcbiAgICAgIH0pLnRvVGhyb3coXG4gICAgICAgIFwiRXJyb3IgLSBTRUNQTWludE91dHB1dC5zZXRDb2RlY0lEOiBpbnZhbGlkIGNvZGVjSUQuIFZhbGlkIGNvZGVjSURzIGFyZSAwIGFuZCAxLlwiXG4gICAgICApXG4gICAgfSlcbiAgfSlcbn0pXG4iXX0=

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


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