PHP WebShell
Текущая директория: /opt/BitGoJS/modules/bitgo/dist/test/v2/unit
Просмотр файла: unspents.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const nock = require("nock");
const sinon = require("sinon");
const sdk_core_1 = require("@bitgo/sdk-core");
const sdk_test_1 = require("@bitgo/sdk-test");
const src_1 = require("../../../src");
describe('Verify string type is used for value of unspent', function () {
const bitgo = sdk_test_1.TestBitGo.decorate(src_1.BitGo, { env: 'test' });
bitgo.initializeTestVars();
const basecoin = bitgo.coin('tdoge');
const walletData = {
id: '5b34252f1bf349930e34020a00000000',
coin: 'tdoge',
keys: ['5b3424f91bf349930e34017500000000', '5b3424f91bf349930e34017600000000', '5b3424f91bf349930e34017700000000'],
coinSpecific: {},
};
const wallet = new sdk_core_1.Wallet(bitgo, basecoin, walletData);
const bgUrl = sdk_core_1.common.Environments[bitgo.getEnv()].uri;
const highPrecisionBigInt = BigInt(1e16) + BigInt(1);
function matchMinMaxValue(minValue, maxValue) {
return minValue === '1' && maxValue === highPrecisionBigInt.toString();
}
function assertIsString(val) {
if (typeof val !== 'string') {
throw new Error('Expected string');
}
}
describe('unspents APIs with string type minValue and maxValue', function () {
after(function () {
nock.cleanAll();
});
['consolidate', 'fanout'].forEach((manageUnspentType) => {
it(manageUnspentType + ' should handle string type minValue and maxValue', async function () {
const params = { minValue: '1', maxValue: highPrecisionBigInt.toString() };
const consolidateUnspentsScope = nock(bgUrl)
.post(`/api/v2/${wallet.coin()}/wallet/${wallet.id()}/${manageUnspentType}Unspents`, (body) => {
return matchMinMaxValue(body.minValue, body.maxValue);
})
.reply(200, {
txInfo: {
unspents: [
{
id: 123,
address: 'sfajlkjad',
value: 1242123,
valueString: '1242123',
},
],
},
});
wallet
.keyIds()
.forEach((keyId) => nock(bgUrl).get(`/api/v2/${wallet.coin()}/key/${keyId}`).reply(200, { id: keyId, pub: 'pub' }));
sinon.stub(wallet, 'signTransaction').resolves({});
const sendScope = nock(bgUrl)
.post(`/api/v2/${wallet.coin()}/wallet/${wallet.id()}/tx/send`, { type: manageUnspentType })
.reply(200, {});
await wallet[manageUnspentType + 'Unspents'](params);
consolidateUnspentsScope.done();
sendScope.done();
sinon.restore();
});
});
it('maximumSpendable should handle string type minValue and maxValue', async function () {
const params = {
minValue: '1',
maxValue: highPrecisionBigInt.toString(),
target: highPrecisionBigInt.toString(),
};
const maximumSpendableScope = nock(bgUrl)
.get(`/api/v2/${wallet.coin()}/wallet/${wallet.id()}/maximumSpendable`)
.query((queryParams) => {
assertIsString(queryParams.minValue);
assertIsString(queryParams.maxValue);
return matchMinMaxValue(queryParams.minValue, queryParams.maxValue);
})
.reply(200, {});
await wallet.maximumSpendable(params);
maximumSpendableScope.done();
});
it('get unspents should handle string type minValue and maxValue', async function () {
const params = {
minValue: '1',
maxValue: highPrecisionBigInt.toString(),
target: highPrecisionBigInt.toString(),
};
const unspentsScope = nock(bgUrl)
.get(`/api/v2/${wallet.coin()}/wallet/${wallet.id()}/unspents`)
.query((queryParams) => {
assertIsString(queryParams.minValue);
assertIsString(queryParams.maxValue);
return matchMinMaxValue(queryParams.minValue, queryParams.maxValue);
})
.reply(200, {});
await wallet.unspents(params);
unspentsScope.done();
});
});
describe('build and send transaction APIs with string type minValue and maxValue', function () {
after(function () {
nock.cleanAll();
});
it('sendmany should handle string type minValue and maxValue', async function () {
const params = { minValue: '1', maxValue: highPrecisionBigInt.toString() };
const sendScope = nock(bgUrl)
.post(`/api/v2/${wallet.coin()}/wallet/${wallet.id()}/tx/send`, (body) => {
return matchMinMaxValue(body.minValue, body.maxValue);
})
.reply(200, {});
const prebuildAndSignTransactionStub = sinon.stub(wallet, 'prebuildAndSignTransaction').resolves({});
await wallet.sendMany(params);
prebuildAndSignTransactionStub.should.calledOnce();
sendScope.done();
});
it('prebuildTransaction should handle string type minValue and maxValue', async function () {
const params = { minValue: '1', maxValue: highPrecisionBigInt.toString() };
const buildScope = nock(bgUrl)
.post(`/api/v2/${wallet.coin()}/wallet/${wallet.id()}/tx/build`, (body) => {
return matchMinMaxValue(body.minValue, body.maxValue);
})
.reply(200, {
txHex: '010000000197c9d011880ce52e1730d7e18d4877db343b61c7369e3274b9c0f176349137840000000000ffffffff0132000000000000001976a9146ba5752fb24f37d99db121975d8d68f0c6204d9188ac00000000',
});
nock(bgUrl).get(`/api/v2/${wallet.coin()}/public/block/latest`).twice().reply(200, {});
await wallet.prebuildTransaction(params);
buildScope.done();
});
});
describe('Unspent Reservations', function () {
after(nock.cleanAll);
it('should only pass through the whitelisted properties', async function () {
const unspentIds = ['test-test'];
const expireTime = 'boogie';
// Create
const createScope = nock(bgUrl)
.post(`/api/v2/wallet/${wallet.id()}/reservedunspents`, { unspentIds, expireTime })
.reply(200, {});
await wallet.manageUnspentReservations({
create: { unspentIds, expireTime, dontIncludeThis: 'this' },
});
// Modify
const modifyScope = nock(bgUrl)
.put(`/api/v2/wallet/${wallet.id()}/reservedunspents`, { unspentIds, changes: { expireTime } })
.reply(200, {});
await wallet.manageUnspentReservations({
modify: { unspentIds, changes: { expireTime }, dontIncludeThis: 'this' },
});
// Delete
const deleteScope = nock(bgUrl)
.delete(`/api/v2/wallet/${wallet.id()}/reservedunspents?id=test-test`)
.reply(200, {});
await wallet.manageUnspentReservations({
delete: { id: unspentIds[0], dontIncludeThis: 'this' },
});
createScope.done();
modifyScope.done();
deleteScope.done();
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5zcGVudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3YyL3VuaXQvdW5zcGVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw2QkFBNkI7QUFDN0IsK0JBQStCO0FBQy9CLDhDQUFpRDtBQUNqRCw4Q0FBNEM7QUFDNUMsc0NBQXFDO0FBRXJDLFFBQVEsQ0FBQyxpREFBaUQsRUFBRTtJQUMxRCxNQUFNLEtBQUssR0FBRyxvQkFBUyxDQUFDLFFBQVEsQ0FBQyxXQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUN6RCxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUMzQixNQUFNLFFBQVEsR0FBUSxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFDLE1BQU0sVUFBVSxHQUFHO1FBQ2pCLEVBQUUsRUFBRSxrQ0FBa0M7UUFDdEMsSUFBSSxFQUFFLE9BQU87UUFDYixJQUFJLEVBQUUsQ0FBQyxrQ0FBa0MsRUFBRSxrQ0FBa0MsRUFBRSxrQ0FBa0MsQ0FBQztRQUNsSCxZQUFZLEVBQUUsRUFBRTtLQUNqQixDQUFDO0lBQ0YsTUFBTSxNQUFNLEdBQUcsSUFBSSxpQkFBTSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDdkQsTUFBTSxLQUFLLEdBQUcsaUJBQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQ3RELE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVyRCxTQUFTLGdCQUFnQixDQUFDLFFBQWdCLEVBQUUsUUFBZ0I7UUFDMUQsT0FBTyxRQUFRLEtBQUssR0FBRyxJQUFJLFFBQVEsS0FBSyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN6RSxDQUFDO0lBQ0QsU0FB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QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIG5vY2sgZnJvbSAnbm9jayc7XG5pbXBvcnQgKiBhcyBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgeyBjb21tb24sIFdhbGxldCB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBUZXN0Qml0R28gfSBmcm9tICdAYml0Z28vc2RrLXRlc3QnO1xuaW1wb3J0IHsgQml0R28gfSBmcm9tICcuLi8uLi8uLi9zcmMnO1xuXG5kZXNjcmliZSgnVmVyaWZ5IHN0cmluZyB0eXBlIGlzIHVzZWQgZm9yIHZhbHVlIG9mIHVuc3BlbnQnLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvLCB7IGVudjogJ3Rlc3QnIH0pO1xuICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgY29uc3QgYmFzZWNvaW46IGFueSA9IGJpdGdvLmNvaW4oJ3Rkb2dlJyk7XG4gIGNvbnN0IHdhbGxldERhdGEgPSB7XG4gICAgaWQ6ICc1YjM0MjUyZjFiZjM0OTkzMGUzNDAyMGEwMDAwMDAwMCcsXG4gICAgY29pbjogJ3Rkb2dlJyxcbiAgICBrZXlzOiBbJzViMzQyNGY5MWJmMzQ5OTMwZTM0MDE3NTAwMDAwMDAwJywgJzViMzQyNGY5MWJmMzQ5OTMwZTM0MDE3NjAwMDAwMDAwJywgJzViMzQyNGY5MWJmMzQ5OTMwZTM0MDE3NzAwMDAwMDAwJ10sXG4gICAgY29pblNwZWNpZmljOiB7fSxcbiAgfTtcbiAgY29uc3Qgd2FsbGV0ID0gbmV3IFdhbGxldChiaXRnbywgYmFzZWNvaW4sIHdhbGxldERhdGEpO1xuICBjb25zdCBiZ1VybCA9IGNvbW1vbi5FbnZpcm9ubWVudHNbYml0Z28uZ2V0RW52KCldLnVyaTtcbiAgY29uc3QgaGlnaFByZWNpc2lvbkJpZ0ludCA9IEJpZ0ludCgxZTE2KSArIEJpZ0ludCgxKTtcblxuICBmdW5jdGlvbiBtYXRjaE1pbk1heFZhbHVlKG1pblZhbHVlOiBzdHJpbmcsIG1heFZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gbWluVmFsdWUgPT09ICcxJyAmJiBtYXhWYWx1ZSA9PT0gaGlnaFByZWNpc2lvbkJpZ0ludC50b1N0cmluZygpO1xuICB9XG4gIGZ1bmN0aW9uIGFzc2VydElzU3RyaW5nKHZhbDogdW5rbm93bik6IGFzc2VydHMgdmFsIGlzIHN0cmluZyB7XG4gICAgaWYgKHR5cGVvZiB2YWwgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHN0cmluZycpO1xuICAgIH1cbiAgfVxuXG4gIGRlc2NyaWJlKCd1bnNwZW50cyBBUElzIHdpdGggc3RyaW5nIHR5cGUgbWluVmFsdWUgYW5kIG1heFZhbHVlJywgZnVuY3Rpb24gKCkge1xuICAgIGFmdGVyKGZ1bmN0aW9uICgpIHtcbiAgICAgIG5vY2suY2xlYW5BbGwoKTtcbiAgICB9KTtcblxuICAgIFsnY29uc29saWRhdGUnLCAnZmFub3V0J10uZm9yRWFjaCgobWFuYWdlVW5zcGVudFR5cGUpID0+IHtcbiAgICAgIGl0KG1hbmFnZVVuc3BlbnRUeXBlICsgJyBzaG91bGQgaGFuZGxlIHN0cmluZyB0eXBlIG1pblZhbHVlIGFuZCBtYXhWYWx1ZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgcGFyYW1zID0geyBtaW5WYWx1ZTogJzEnLCBtYXhWYWx1ZTogaGlnaFByZWNpc2lvbkJpZ0ludC50b1N0cmluZygpIH07XG5cbiAgICAgICAgY29uc3QgY29uc29saWRhdGVVbnNwZW50c1Njb3BlID0gbm9jayhiZ1VybClcbiAgICAgICAgICAucG9zdChgL2FwaS92Mi8ke3dhbGxldC5jb2luKCl9L3dhbGxldC8ke3dhbGxldC5pZCgpfS8ke21hbmFnZVVuc3BlbnRUeXBlfVVuc3BlbnRzYCwgKGJvZHkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaE1pbk1heFZhbHVlKGJvZHkubWluVmFsdWUsIGJvZHkubWF4VmFsdWUpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnJlcGx5KDIwMCwge1xuICAgICAgICAgICAgdHhJbmZvOiB7XG4gICAgICAgICAgICAgIHVuc3BlbnRzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaWQ6IDEyMyxcbiAgICAgICAgICAgICAgICAgIGFkZHJlc3M6ICdzZmFqbGtqYWQnLFxuICAgICAgICAgICAgICAgICAgdmFsdWU6IDEyNDIxMjMsXG4gICAgICAgICAgICAgICAgICB2YWx1ZVN0cmluZzogJzEyNDIxMjMnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgIHdhbGxldFxuICAgICAgICAgIC5rZXlJZHMoKVxuICAgICAgICAgIC5mb3JFYWNoKChrZXlJZCkgPT5cbiAgICAgICAgICAgIG5vY2soYmdVcmwpLmdldChgL2FwaS92Mi8ke3dhbGxldC5jb2luKCl9L2tleS8ke2tleUlkfWApLnJlcGx5KDIwMCwgeyBpZDoga2V5SWQsIHB1YjogJ3B1YicgfSlcbiAgICAgICAgICApO1xuXG4gICAgICAgIHNpbm9uLnN0dWIod2FsbGV0LCAnc2lnblRyYW5zYWN0aW9uJykucmVzb2x2ZXMoe30pO1xuXG4gICAgICAgIGNvbnN0IHNlbmRTY29wZSA9IG5vY2soYmdVcmwpXG4gICAgICAgICAgLnBvc3QoYC9hcGkvdjIvJHt3YWxsZXQuY29pbigpfS93YWxsZXQvJHt3YWxsZXQuaWQoKX0vdHgvc2VuZGAsIHsgdHlwZTogbWFuYWdlVW5zcGVudFR5cGUgfSlcbiAgICAgICAgICAucmVwbHkoMjAwLCB7fSk7XG5cbiAgICAgICAgYXdhaXQgd2FsbGV0W21hbmFnZVVuc3BlbnRUeXBlICsgJ1Vuc3BlbnRzJ10ocGFyYW1zKTtcblxuICAgICAgICBjb25zb2xpZGF0ZVVuc3BlbnRzU2NvcGUuZG9uZSgpO1xuICAgICAgICBzZW5kU2NvcGUuZG9uZSgpO1xuICAgICAgICBzaW5vbi5yZXN0b3JlKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdtYXhpbXVtU3BlbmRhYmxlIHNob3VsZCBoYW5kbGUgc3RyaW5nIHR5cGUgbWluVmFsdWUgYW5kIG1heFZhbHVlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICBtaW5WYWx1ZTogJzEnLFxuICAgICAgICBtYXhWYWx1ZTogaGlnaFByZWNpc2lvbkJpZ0ludC50b1N0cmluZygpLFxuICAgICAgICB0YXJnZXQ6IGhpZ2hQcmVjaXNpb25CaWdJbnQudG9TdHJpbmcoKSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG1heGltdW1TcGVuZGFibGVTY29wZSA9IG5vY2soYmdVcmwpXG4gICAgICAgIC5nZXQoYC9hcGkvdjIvJHt3YWxsZXQuY29pbigpfS93YWxsZXQvJHt3YWxsZXQuaWQoKX0vbWF4aW11bVNwZW5kYWJsZWApXG4gICAgICAgIC5xdWVyeSgocXVlcnlQYXJhbXMpID0+IHtcbiAgICAgICAgICBhc3NlcnRJc1N0cmluZyhxdWVyeVBhcmFtcy5taW5WYWx1ZSk7XG4gICAgICAgICAgYXNzZXJ0SXNTdHJpbmcocXVlcnlQYXJhbXMubWF4VmFsdWUpO1xuICAgICAgICAgIHJldHVybiBtYXRjaE1pbk1heFZhbHVlKHF1ZXJ5UGFyYW1zLm1pblZhbHVlLCBxdWVyeVBhcmFtcy5tYXhWYWx1ZSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5yZXBseSgyMDAsIHt9KTtcblxuICAgICAgYXdhaXQgd2FsbGV0Lm1heGltdW1TcGVuZGFibGUocGFyYW1zKTtcblxuICAgICAgbWF4aW11bVNwZW5kYWJsZVNjb3BlLmRvbmUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdnZXQgdW5zcGVudHMgc2hvdWxkIGhhbmRsZSBzdHJpbmcgdHlwZSBtaW5WYWx1ZSBhbmQgbWF4VmFsdWUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgIG1pblZhbHVlOiAnMScsXG4gICAgICAgIG1heFZhbHVlOiBoaWdoUHJlY2lzaW9uQmlnSW50LnRvU3RyaW5nKCksXG4gICAgICAgIHRhcmdldDogaGlnaFByZWNpc2lvbkJpZ0ludC50b1N0cmluZygpLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgdW5zcGVudHNTY29wZSA9IG5vY2soYmdVcmwpXG4gICAgICAgIC5nZXQoYC9hcGkvdjIvJHt3YWxsZXQuY29pbigpfS93YWxsZXQvJHt3YWxsZXQuaWQoKX0vdW5zcGVudHNgKVxuICAgICAgICAucXVlcnkoKHF1ZXJ5UGFyYW1zKSA9PiB7XG4gICAgICAgICAgYXNzZXJ0SXNTdHJpbmcocXVlcnlQYXJhbXMubWluVmFsdWUpO1xuICAgICAgICAgIGFzc2VydElzU3RyaW5nKHF1ZXJ5UGFyYW1zLm1heFZhbHVlKTtcbiAgICAgICAgICByZXR1cm4gbWF0Y2hNaW5NYXhWYWx1ZShxdWVyeVBhcmFtcy5taW5WYWx1ZSBhcyBzdHJpbmcsIHF1ZXJ5UGFyYW1zLm1heFZhbHVlKTtcbiAgICAgICAgfSlcbiAgICAgICAgLnJlcGx5KDIwMCwge30pO1xuXG4gICAgICBhd2FpdCB3YWxsZXQudW5zcGVudHMocGFyYW1zKTtcblxuICAgICAgdW5zcGVudHNTY29wZS5kb25lKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdidWlsZCBhbmQgc2VuZCB0cmFuc2FjdGlvbiBBUElzIHdpdGggc3RyaW5nIHR5cGUgbWluVmFsdWUgYW5kIG1heFZhbHVlJywgZnVuY3Rpb24gKCkge1xuICAgIGFmdGVyKGZ1bmN0aW9uICgpIHtcbiAgICAgIG5vY2suY2xlYW5BbGwoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzZW5kbWFueSBzaG91bGQgaGFuZGxlIHN0cmluZyB0eXBlIG1pblZhbHVlIGFuZCBtYXhWYWx1ZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHsgbWluVmFsdWU6ICcxJywgbWF4VmFsdWU6IGhpZ2hQcmVjaXNpb25CaWdJbnQudG9TdHJpbmcoKSB9O1xuXG4gICAgICBjb25zdCBzZW5kU2NvcGUgPSBub2NrKGJnVXJsKVxuICAgICAgICAucG9zdChgL2FwaS92Mi8ke3dhbGxldC5jb2luKCl9L3dhbGxldC8ke3dhbGxldC5pZCgpfS90eC9zZW5kYCwgKGJvZHkpID0+IHtcbiAgICAgICAgICByZXR1cm4gbWF0Y2hNaW5NYXhWYWx1ZShib2R5Lm1pblZhbHVlLCBib2R5Lm1heFZhbHVlKTtcbiAgICAgICAgfSlcbiAgICAgICAgLnJlcGx5KDIwMCwge30pO1xuXG4gICAgICBjb25zdCBwcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvblN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCwgJ3ByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uJykucmVzb2x2ZXMoe30pO1xuXG4gICAgICBhd2FpdCB3YWxsZXQuc2VuZE1hbnkocGFyYW1zKTtcblxuICAgICAgcHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb25TdHViLnNob3VsZC5jYWxsZWRPbmNlKCk7XG4gICAgICBzZW5kU2NvcGUuZG9uZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3ByZWJ1aWxkVHJhbnNhY3Rpb24gc2hvdWxkIGhhbmRsZSBzdHJpbmcgdHlwZSBtaW5WYWx1ZSBhbmQgbWF4VmFsdWUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSB7IG1pblZhbHVlOiAnMScsIG1heFZhbHVlOiBoaWdoUHJlY2lzaW9uQmlnSW50LnRvU3RyaW5nKCkgfTtcblxuICAgICAgY29uc3QgYnVpbGRTY29wZSA9IG5vY2soYmdVcmwpXG4gICAgICAgIC5wb3N0KGAvYXBpL3YyLyR7d2FsbGV0LmNvaW4oKX0vd2FsbGV0LyR7d2FsbGV0LmlkKCl9L3R4L2J1aWxkYCwgKGJvZHkpID0+IHtcbiAgICAgICAgICByZXR1cm4gbWF0Y2hNaW5NYXhWYWx1ZShib2R5Lm1pblZhbHVlLCBib2R5Lm1heFZhbHVlKTtcbiAgICAgICAgfSlcbiAgICAgICAgLnJlcGx5KDIwMCwge1xuICAgICAgICAgIHR4SGV4OlxuICAgICAgICAgICAgJzAxMDAwMDAwMDE5N2M5ZDAxMTg4MGNlNTJlMTczMGQ3ZTE4ZDQ4NzdkYjM0M2I2MWM3MzY5ZTMyNzRiOWMwZjE3NjM0OTEzNzg0MDAwMDAwMDAwMGZmZmZmZmZmMDEzMjAwMDAwMDAwMDAwMDAwMTk3NmE5MTQ2YmE1NzUyZmIyNGYzN2Q5OWRiMTIxOTc1ZDhkNjhmMGM2MjA0ZDkxODhhYzAwMDAwMDAwJyxcbiAgICAgICAgfSk7XG5cbiAgICAgIG5vY2soYmdVcmwpLmdldChgL2FwaS92Mi8ke3dhbGxldC5jb2luKCl9L3B1YmxpYy9ibG9jay9sYXRlc3RgKS50d2ljZSgpLnJlcGx5KDIwMCwge30pO1xuXG4gICAgICBhd2FpdCB3YWxsZXQucHJlYnVpbGRUcmFuc2FjdGlvbihwYXJhbXMpO1xuXG4gICAgICBidWlsZFNjb3BlLmRvbmUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1Vuc3BlbnQgUmVzZXJ2YXRpb25zJywgZnVuY3Rpb24gKCkge1xuICAgIGFmdGVyKG5vY2suY2xlYW5BbGwpO1xuXG4gICAgaXQoJ3Nob3VsZCBvbmx5IHBhc3MgdGhyb3VnaCB0aGUgd2hpdGVsaXN0ZWQgcHJvcGVydGllcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHVuc3BlbnRJZHMgPSBbJ3Rlc3QtdGVzdCddO1xuICAgICAgY29uc3QgZXhwaXJlVGltZSA9ICdib29naWUnO1xuXG4gICAgICAvLyBDcmVhdGVcbiAgICAgIGNvbnN0IGNyZWF0ZVNjb3BlID0gbm9jayhiZ1VybClcbiAgICAgICAgLnBvc3QoYC9hcGkvdjIvd2FsbGV0LyR7d2FsbGV0LmlkKCl9L3Jlc2VydmVkdW5zcGVudHNgLCB7IHVuc3BlbnRJZHMsIGV4cGlyZVRpbWUgfSlcbiAgICAgICAgLnJlcGx5KDIwMCwge30pO1xuICAgICAgYXdhaXQgd2FsbGV0Lm1hbmFnZVVuc3BlbnRSZXNlcnZhdGlvbnMoe1xuICAgICAgICBjcmVhdGU6IHsgdW5zcGVudElkcywgZXhwaXJlVGltZSwgZG9udEluY2x1ZGVUaGlzOiAndGhpcycgfSBhcyB1bmtub3duIGFzIHtcbiAgICAgICAgICB1bnNwZW50SWRzOiBzdHJpbmdbXTtcbiAgICAgICAgICBleHBpcmVUaW1lOiBzdHJpbmc7XG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgLy8gTW9kaWZ5XG4gICAgICBjb25zdCBtb2RpZnlTY29wZSA9IG5vY2soYmdVcmwpXG4gICAgICAgIC5wdXQoYC9hcGkvdjIvd2FsbGV0LyR7d2FsbGV0LmlkKCl9L3Jlc2VydmVkdW5zcGVudHNgLCB7IHVuc3BlbnRJZHMsIGNoYW5nZXM6IHsgZXhwaXJlVGltZSB9IH0pXG4gICAgICAgIC5yZXBseSgyMDAsIHt9KTtcbiAgICAgIGF3YWl0IHdhbGxldC5tYW5hZ2VVbnNwZW50UmVzZXJ2YXRpb25zKHtcbiAgICAgICAgbW9kaWZ5OiB7IHVuc3BlbnRJZHMsIGNoYW5nZXM6IHsgZXhwaXJlVGltZSB9LCBkb250SW5jbHVkZVRoaXM6ICd0aGlzJyB9IGFzIHVua25vd24gYXMge1xuICAgICAgICAgIHVuc3BlbnRJZHM6IHN0cmluZ1tdO1xuICAgICAgICAgIGNoYW5nZXM6IHsgZXhwaXJlVGltZTogc3RyaW5nIH07XG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgLy8gRGVsZXRlXG4gICAgICBjb25zdCBkZWxldGVTY29wZSA9IG5vY2soYmdVcmwpXG4gICAgICAgIC5kZWxldGUoYC9hcGkvdjIvd2FsbGV0LyR7d2FsbGV0LmlkKCl9L3Jlc2VydmVkdW5zcGVudHM/aWQ9dGVzdC10ZXN0YClcbiAgICAgICAgLnJlcGx5KDIwMCwge30pO1xuICAgICAgYXdhaXQgd2FsbGV0Lm1hbmFnZVVuc3BlbnRSZXNlcnZhdGlvbnMoe1xuICAgICAgICBkZWxldGU6IHsgaWQ6IHVuc3BlbnRJZHNbMF0sIGRvbnRJbmNsdWRlVGhpczogJ3RoaXMnIH0gYXMgdW5rbm93biBhcyB7IGlkOiBzdHJpbmcgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjcmVhdGVTY29wZS5kb25lKCk7XG4gICAgICBtb2RpZnlTY29wZS5kb25lKCk7XG4gICAgICBkZWxldGVTY29wZS5kb25lKCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=Выполнить команду
Для локальной разработки. Не используйте в интернете!