PHP WebShell
Текущая директория: /opt/BitGoJS/modules/sdk-coin-sol/dist/test/unit
Просмотр файла: solInstructionFactory.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 });
const should_1 = __importDefault(require("should"));
const testData = __importStar(require("../resources/sol"));
const solInstructionFactory_1 = require("../../src/lib/solInstructionFactory");
const constants_1 = require("../../src/lib/constants");
const web3_js_1 = require("@solana/web3.js");
const spl_token_1 = require("@solana/spl-token");
const bignumber_js_1 = __importDefault(require("bignumber.js"));
describe('Instruction Builder Tests: ', function () {
describe('Succeed ', function () {
it('Memo', () => {
const memo = 'test memo';
const memoParams = {
type: constants_1.InstructionBuilderTypes.Memo,
params: { memo },
};
const result = (0, solInstructionFactory_1.solInstructionFactory)(memoParams);
should_1.default.deepEqual(result, [
new web3_js_1.TransactionInstruction({
keys: [],
programId: new web3_js_1.PublicKey(constants_1.MEMO_PROGRAM_PK),
data: Buffer.from(memo),
}),
]);
});
it('Transfer', () => {
const fromAddress = testData.authAccount.pub;
const toAddress = testData.nonceAccount.pub;
const amount = '100000';
const transferParams = {
type: constants_1.InstructionBuilderTypes.Transfer,
params: { fromAddress, toAddress, amount },
};
const result = (0, solInstructionFactory_1.solInstructionFactory)(transferParams);
should_1.default.deepEqual(result, [
web3_js_1.SystemProgram.transfer({
fromPubkey: new web3_js_1.PublicKey(fromAddress),
toPubkey: new web3_js_1.PublicKey(toAddress),
lamports: new bignumber_js_1.default(amount).toNumber(),
}),
]);
});
it('Advance nonce', () => {
const authWalletAddress = testData.authAccount.pub;
const walletNonceAddress = testData.nonceAccount.pub;
const nonceAdvanceParams = {
type: constants_1.InstructionBuilderTypes.NonceAdvance,
params: { walletNonceAddress, authWalletAddress },
};
const result = (0, solInstructionFactory_1.solInstructionFactory)(nonceAdvanceParams);
should_1.default.deepEqual(result, [
web3_js_1.SystemProgram.nonceAdvance({
noncePubkey: new web3_js_1.PublicKey(walletNonceAddress),
authorizedPubkey: new web3_js_1.PublicKey(authWalletAddress),
}),
]);
});
it('Create and Nonce initialize', () => {
const fromAddress = testData.authAccount.pub;
const nonceAddress = testData.nonceAccount.pub;
const authAddress = testData.authAccount.pub;
const amount = '100000';
const createNonceAccountParams = {
type: constants_1.InstructionBuilderTypes.CreateNonceAccount,
params: { fromAddress, nonceAddress, authAddress, amount },
};
const result = (0, solInstructionFactory_1.solInstructionFactory)(createNonceAccountParams);
should_1.default.deepEqual(result, web3_js_1.SystemProgram.createNonceAccount({
fromPubkey: new web3_js_1.PublicKey(fromAddress),
noncePubkey: new web3_js_1.PublicKey(nonceAddress),
authorizedPubkey: new web3_js_1.PublicKey(authAddress),
lamports: new bignumber_js_1.default(amount).toNumber(),
}).instructions);
});
it('Create associated token account', () => {
const mintAddress = testData.associatedTokenAccounts.mintId;
const ataAddress = testData.associatedTokenAccounts.accounts[0].ata;
const ownerAddress = testData.associatedTokenAccounts.accounts[0].pub;
const payerAddress = testData.associatedTokenAccounts.accounts[0].pub;
const createATAParams = {
type: constants_1.InstructionBuilderTypes.CreateAssociatedTokenAccount,
params: {
mintAddress,
ataAddress,
ownerAddress,
payerAddress,
tokenName: testData.associatedTokenAccounts.mint,
},
};
const result = (0, solInstructionFactory_1.solInstructionFactory)(createATAParams);
should_1.default.deepEqual(result, [
(0, spl_token_1.createAssociatedTokenAccountInstruction)(new web3_js_1.PublicKey(payerAddress), new web3_js_1.PublicKey(ataAddress), new web3_js_1.PublicKey(ownerAddress), new web3_js_1.PublicKey(mintAddress)),
]);
});
it('Token Transfer', () => {
const fromAddress = testData.authAccount.pub;
const toAddress = testData.nonceAccount.pub;
const amount = '100000';
const mintAddress = testData.tokenTransfers.mintUSDC;
const sourceAddress = testData.associatedTokenAccounts.accounts[0].pub;
const coinName = testData.tokenTransfers.nameUSDC;
const transferParams = {
type: constants_1.InstructionBuilderTypes.TokenTransfer,
params: {
fromAddress: fromAddress,
toAddress: toAddress,
amount: amount,
tokenName: coinName,
sourceAddress: sourceAddress,
},
};
const result = (0, solInstructionFactory_1.solInstructionFactory)(transferParams);
should_1.default.deepEqual(result, [
(0, spl_token_1.createTransferCheckedInstruction)(new web3_js_1.PublicKey(sourceAddress), new web3_js_1.PublicKey(mintAddress), new web3_js_1.PublicKey(toAddress), new web3_js_1.PublicKey(fromAddress), BigInt(amount), 9),
]);
});
});
describe('Fail ', function () {
it('Invalid type', () => {
// @ts-expect-error Testing for an invalid type, should throw error
(0, should_1.default)(() => (0, solInstructionFactory_1.solInstructionFactory)({ type: 'random', params: {} })).throwError('Invalid instruction type or not supported');
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29sSW5zdHJ1Y3Rpb25GYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L3NvbEluc3RydWN0aW9uRmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QiwyREFBNkM7QUFDN0MsK0VBQTRFO0FBQzVFLHVEQUFtRjtBQUVuRiw2Q0FBbUY7QUFDbkYsaURBQThHO0FBQzlHLGdFQUFxQztBQUVyQyxRQUFRLENBQUMsNkJBQTZCLEVBQUU7SUFDdEMsUUFBUSxDQUFDLFVBQVUsRUFBRTtRQUNuQixFQUFFLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRTtZQUNkLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQztZQUN6QixNQUFNLFVBQVUsR0FBc0I7Z0JBQ3BDLElBQUksRUFBRSxtQ0FBdUIsQ0FBQyxJQUFJO2dCQUNsQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUU7YUFDakIsQ0FBQztZQUVGLE1BQU0sTUFBTSxHQUFHLElBQUEsNkNBQXFCLEVBQUMsVUFBVSxDQUFDLENBQUM7WUFDakQsZ0JBQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFO2dCQUN2QixJQUFJLGdDQUFzQixDQUFDO29CQUN6QixJQUFJLEVBQUUsRUFBRTtvQkFDUixTQUFTLEVBQUUsSUFBSSxtQkFBUyxDQUFDLDJCQUFlLENBQUM7b0JBQ3pDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztpQkFDeEIsQ0FBQzthQUNILENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUU7WUFDbEIsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUM7WUFDN0MsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUM7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Q0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi9yZXNvdXJjZXMvc29sJztcbmltcG9ydCB7IHNvbEluc3RydWN0aW9uRmFjdG9yeSB9IGZyb20gJy4uLy4uL3NyYy9saWIvc29sSW5zdHJ1Y3Rpb25GYWN0b3J5JztcbmltcG9ydCB7IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLCBNRU1PX1BST0dSQU1fUEsgfSBmcm9tICcuLi8uLi9zcmMvbGliL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBJbnN0cnVjdGlvblBhcmFtcyB9IGZyb20gJy4uLy4uL3NyYy9saWIvaWZhY2UnO1xuaW1wb3J0IHsgUHVibGljS2V5LCBTeXN0ZW1Qcm9ncmFtLCBUcmFuc2FjdGlvbkluc3RydWN0aW9uIH0gZnJvbSAnQHNvbGFuYS93ZWIzLmpzJztcbmltcG9ydCB7IGNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnRJbnN0cnVjdGlvbiwgY3JlYXRlVHJhbnNmZXJDaGVja2VkSW5zdHJ1Y3Rpb24gfSBmcm9tICdAc29sYW5hL3NwbC10b2tlbic7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5cbmRlc2NyaWJlKCdJbnN0cnVjdGlvbiBCdWlsZGVyIFRlc3RzOiAnLCBmdW5jdGlvbiAoKSB7XG4gIGRlc2NyaWJlKCdTdWNjZWVkICcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnTWVtbycsICgpID0+IHtcbiAgICAgIGNvbnN0IG1lbW8gPSAndGVzdCBtZW1vJztcbiAgICAgIGNvbnN0IG1lbW9QYXJhbXM6IEluc3RydWN0aW9uUGFyYW1zID0ge1xuICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5NZW1vLFxuICAgICAgICBwYXJhbXM6IHsgbWVtbyB9LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gc29sSW5zdHJ1Y3Rpb25GYWN0b3J5KG1lbW9QYXJhbXMpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbChyZXN1bHQsIFtcbiAgICAgICAgbmV3IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24oe1xuICAgICAgICAgIGtleXM6IFtdLFxuICAgICAgICAgIHByb2dyYW1JZDogbmV3IFB1YmxpY0tleShNRU1PX1BST0dSQU1fUEspLFxuICAgICAgICAgIGRhdGE6IEJ1ZmZlci5mcm9tKG1lbW8pLFxuICAgICAgICB9KSxcbiAgICAgIF0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ1RyYW5zZmVyJywgKCkgPT4ge1xuICAgICAgY29uc3QgZnJvbUFkZHJlc3MgPSB0ZXN0RGF0YS5hdXRoQWNjb3VudC5wdWI7XG4gICAgICBjb25zdCB0b0FkZHJlc3MgPSB0ZXN0RGF0YS5ub25jZUFjY291bnQucHViO1xuICAgICAgY29uc3QgYW1vdW50ID0gJzEwMDAwMCc7XG4gICAgICBjb25zdCB0cmFuc2ZlclBhcmFtczogSW5zdHJ1Y3Rpb25QYXJhbXMgPSB7XG4gICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlRyYW5zZmVyLFxuICAgICAgICBwYXJhbXM6IHsgZnJvbUFkZHJlc3MsIHRvQWRkcmVzcywgYW1vdW50IH0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBzb2xJbnN0cnVjdGlvbkZhY3RvcnkodHJhbnNmZXJQYXJhbXMpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbChyZXN1bHQsIFtcbiAgICAgICAgU3lzdGVtUHJvZ3JhbS50cmFuc2Zlcih7XG4gICAgICAgICAgZnJvbVB1YmtleTogbmV3IFB1YmxpY0tleShmcm9tQWRkcmVzcyksXG4gICAgICAgICAgdG9QdWJrZXk6IG5ldyBQdWJsaWNLZXkodG9BZGRyZXNzKSxcbiAgICAgICAgICBsYW1wb3J0czogbmV3IEJpZ051bWJlcihhbW91bnQpLnRvTnVtYmVyKCksXG4gICAgICAgIH0pLFxuICAgICAgXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnQWR2YW5jZSBub25jZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGF1dGhXYWxsZXRBZGRyZXNzID0gdGVzdERhdGEuYXV0aEFjY291bnQucHViO1xuICAgICAgY29uc3Qgd2FsbGV0Tm9uY2VBZGRyZXNzID0gdGVzdERhdGEubm9uY2VBY2NvdW50LnB1YjtcbiAgICAgIGNvbnN0IG5vbmNlQWR2YW5jZVBhcmFtczogSW5zdHJ1Y3Rpb25QYXJhbXMgPSB7XG4gICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk5vbmNlQWR2YW5jZSxcbiAgICAgICAgcGFyYW1zOiB7IHdhbGxldE5vbmNlQWRkcmVzcywgYXV0aFdhbGxldEFkZHJlc3MgfSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHNvbEluc3RydWN0aW9uRmFjdG9yeShub25jZUFkdmFuY2VQYXJhbXMpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbChyZXN1bHQsIFtcbiAgICAgICAgU3lzdGVtUHJvZ3JhbS5ub25jZUFkdmFuY2Uoe1xuICAgICAgICAgIG5vbmNlUHVia2V5OiBuZXcgUHVibGljS2V5KHdhbGxldE5vbmNlQWRkcmVzcyksXG4gICAgICAgICAgYXV0aG9yaXplZFB1YmtleTogbmV3IFB1YmxpY0tleShhdXRoV2FsbGV0QWRkcmVzcyksXG4gICAgICAgIH0pLFxuICAgICAgXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnQ3JlYXRlIGFuZCBOb25jZSBpbml0aWFsaXplJywgKCkgPT4ge1xuICAgICAgY29uc3QgZnJvbUFkZHJlc3MgPSB0ZXN0RGF0YS5hdXRoQWNjb3VudC5wdWI7XG4gICAgICBjb25zdCBub25jZUFkZHJlc3MgPSB0ZXN0RGF0YS5ub25jZUFjY291bnQucHViO1xuICAgICAgY29uc3QgYXV0aEFkZHJlc3MgPSB0ZXN0RGF0YS5hdXRoQWNjb3VudC5wdWI7XG4gICAgICBjb25zdCBhbW91bnQgPSAnMTAwMDAwJztcbiAgICAgIGNvbnN0IGNyZWF0ZU5vbmNlQWNjb3VudFBhcmFtczogSW5zdHJ1Y3Rpb25QYXJhbXMgPSB7XG4gICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNyZWF0ZU5vbmNlQWNjb3VudCxcbiAgICAgICAgcGFyYW1zOiB7IGZyb21BZGRyZXNzLCBub25jZUFkZHJlc3MsIGF1dGhBZGRyZXNzLCBhbW91bnQgfSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHNvbEluc3RydWN0aW9uRmFjdG9yeShjcmVhdGVOb25jZUFjY291bnRQYXJhbXMpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbChcbiAgICAgICAgcmVzdWx0LFxuICAgICAgICBTeXN0ZW1Qcm9ncmFtLmNyZWF0ZU5vbmNlQWNjb3VudCh7XG4gICAgICAgICAgZnJvbVB1YmtleTogbmV3IFB1YmxpY0tleShmcm9tQWRkcmVzcyksXG4gICAgICAgICAgbm9uY2VQdWJrZXk6IG5ldyBQdWJsaWNLZXkobm9uY2VBZGRyZXNzKSxcbiAgICAgICAgICBhdXRob3JpemVkUHVia2V5OiBuZXcgUHVibGljS2V5KGF1dGhBZGRyZXNzKSxcbiAgICAgICAgICBsYW1wb3J0czogbmV3IEJpZ051bWJlcihhbW91bnQpLnRvTnVtYmVyKCksXG4gICAgICAgIH0pLmluc3RydWN0aW9uc1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdDcmVhdGUgYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgbWludEFkZHJlc3MgPSB0ZXN0RGF0YS5hc3NvY2lhdGVkVG9rZW5BY2NvdW50cy5taW50SWQ7XG4gICAgICBjb25zdCBhdGFBZGRyZXNzID0gdGVzdERhdGEuYXNzb2NpYXRlZFRva2VuQWNjb3VudHMuYWNjb3VudHNbMF0uYXRhO1xuICAgICAgY29uc3Qgb3duZXJBZGRyZXNzID0gdGVzdERhdGEuYXNzb2NpYXRlZFRva2VuQWNjb3VudHMuYWNjb3VudHNbMF0ucHViO1xuICAgICAgY29uc3QgcGF5ZXJBZGRyZXNzID0gdGVzdERhdGEuYXNzb2NpYXRlZFRva2VuQWNjb3VudHMuYWNjb3VudHNbMF0ucHViO1xuICAgICAgY29uc3QgY3JlYXRlQVRBUGFyYW1zOiBJbnN0cnVjdGlvblBhcmFtcyA9IHtcbiAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudCxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgbWludEFkZHJlc3MsXG4gICAgICAgICAgYXRhQWRkcmVzcyxcbiAgICAgICAgICBvd25lckFkZHJlc3MsXG4gICAgICAgICAgcGF5ZXJBZGRyZXNzLFxuICAgICAgICAgIHRva2VuTmFtZTogdGVzdERhdGEuYXNzb2NpYXRlZFRva2VuQWNjb3VudHMubWludCxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHNvbEluc3RydWN0aW9uRmFjdG9yeShjcmVhdGVBVEFQYXJhbXMpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbChyZXN1bHQsIFtcbiAgICAgICAgY3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudEluc3RydWN0aW9uKFxuICAgICAgICAgIG5ldyBQdWJsaWNLZXkocGF5ZXJBZGRyZXNzKSxcbiAgICAgICAgICBuZXcgUHVibGljS2V5KGF0YUFkZHJlc3MpLFxuICAgICAgICAgIG5ldyBQdWJsaWNLZXkob3duZXJBZGRyZXNzKSxcbiAgICAgICAgICBuZXcgUHVibGljS2V5KG1pbnRBZGRyZXNzKVxuICAgICAgICApLFxuICAgICAgXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnVG9rZW4gVHJhbnNmZXInLCAoKSA9PiB7XG4gICAgICBjb25zdCBmcm9tQWRkcmVzcyA9IHRlc3REYXRhLmF1dGhBY2NvdW50LnB1YjtcbiAgICAgIGNvbnN0IHRvQWRkcmVzcyA9IHRlc3REYXRhLm5vbmNlQWNjb3VudC5wdWI7XG4gICAgICBjb25zdCBhbW91bnQgPSAnMTAwMDAwJztcbiAgICAgIGNvbnN0IG1pbnRBZGRyZXNzID0gdGVzdERhdGEudG9rZW5UcmFuc2ZlcnMubWludFVTREM7XG4gICAgICBjb25zdCBzb3VyY2VBZGRyZXNzID0gdGVzdERhdGEuYXNzb2NpYXRlZFRva2VuQWNjb3VudHMuYWNjb3VudHNbMF0ucHViO1xuICAgICAgY29uc3QgY29pbk5hbWUgPSB0ZXN0RGF0YS50b2tlblRyYW5zZmVycy5uYW1lVVNEQztcblxuICAgICAgY29uc3QgdHJhbnNmZXJQYXJhbXM6IEluc3RydWN0aW9uUGFyYW1zID0ge1xuICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ub2tlblRyYW5zZmVyLFxuICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICBmcm9tQWRkcmVzczogZnJvbUFkZHJlc3MsXG4gICAgICAgICAgdG9BZGRyZXNzOiB0b0FkZHJlc3MsXG4gICAgICAgICAgYW1vdW50OiBhbW91bnQsXG4gICAgICAgICAgdG9rZW5OYW1lOiBjb2luTmFtZSxcbiAgICAgICAgICBzb3VyY2VBZGRyZXNzOiBzb3VyY2VBZGRyZXNzLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gc29sSW5zdHJ1Y3Rpb25GYWN0b3J5KHRyYW5zZmVyUGFyYW1zKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwocmVzdWx0LCBbXG4gICAgICAgIGNyZWF0ZVRyYW5zZmVyQ2hlY2tlZEluc3RydWN0aW9uKFxuICAgICAgICAgIG5ldyBQdWJsaWNLZXkoc291cmNlQWRkcmVzcyksXG4gICAgICAgICAgbmV3IFB1YmxpY0tleShtaW50QWRkcmVzcyksXG4gICAgICAgICAgbmV3IFB1YmxpY0tleSh0b0FkZHJlc3MpLFxuICAgICAgICAgIG5ldyBQdWJsaWNLZXkoZnJvbUFkZHJlc3MpLFxuICAgICAgICAgIEJpZ0ludChhbW91bnQpLFxuICAgICAgICAgIDlcbiAgICAgICAgKSxcbiAgICAgIF0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRmFpbCAnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ0ludmFsaWQgdHlwZScsICgpID0+IHtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVGVzdGluZyBmb3IgYW4gaW52YWxpZCB0eXBlLCBzaG91bGQgdGhyb3cgZXJyb3JcbiAgICAgIHNob3VsZCgoKSA9PiBzb2xJbnN0cnVjdGlvbkZhY3RvcnkoeyB0eXBlOiAncmFuZG9tJywgcGFyYW1zOiB7fSB9KSkudGhyb3dFcnJvcihcbiAgICAgICAgJ0ludmFsaWQgaW5zdHJ1Y3Rpb24gdHlwZSBvciBub3Qgc3VwcG9ydGVkJ1xuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==Выполнить команду
Для локальной разработки. Не используйте в интернете!