PHP WebShell
Текущая директория: /opt/BitGoJS/modules/express/dist/test/unit
Просмотр файла: config.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
// eslint-disable-next-line
/// <reference types="mocha" />
// eslint-disable-next-line
/// <reference types="node" />
const should = require("should");
const sinon = require("sinon");
const config_1 = require("../../src/config");
const args = require("../../src/args");
describe('Config:', () => {
it('should take command line config options', () => {
const argStub = sinon.stub(args, 'args').returns({ port: 12345 });
(0, config_1.config)().port.should.equal(12345);
argStub.restore();
});
it('should take environment variable config options', () => {
const argStub = sinon.stub(args, 'args').returns({});
const envStub = sinon.stub(process, 'env').value({ BITGO_PORT: '12345' });
(0, config_1.config)().port.should.equal(12345);
argStub.restore();
envStub.restore();
});
it('should fall back to default config options', () => {
const argStub = sinon.stub(args, 'args').returns({});
(0, config_1.config)().port.should.equal(config_1.DefaultConfig.port);
argStub.restore();
});
it('should correctly handle config precedence', () => {
const argStub = sinon.stub(args, 'args').returns({ port: 23456 });
const envStub = sinon.stub(process, 'env').value({ BITGO_PORT: '12345' });
(0, config_1.config)().port.should.equal(23456);
argStub.restore();
envStub.restore();
});
it('should transform urls to secure urls when disableSSL is undefined', () => {
const argStub = sinon.stub(args, 'args').returns({ disableSSL: undefined, customrooturi: 'test.com' });
const envStub = sinon
.stub(process, 'env')
.value({ BITGO_DISABLE_SSL: undefined, BITGO_CUSTOM_ROOT_URI: 'test.com' });
(0, config_1.config)().disableSSL.should.equal(false);
(0, config_1.config)().should.have.property('customRootUri', 'https://test.com');
argStub.restore();
envStub.restore();
});
it('should transform urls to secure urls when disableSSL is false', () => {
const argStub = sinon.stub(args, 'args').returns({ disableSSL: false, customrooturi: 'test.com' });
const envStub = sinon.stub(process, 'env').value({ BITGO_DISABLE_SSL: false, BITGO_CUSTOM_ROOT_URI: 'test.com' });
(0, config_1.config)().disableSSL.should.equal(false);
(0, config_1.config)().should.have.property('customRootUri', 'https://test.com');
argStub.restore();
envStub.restore();
});
it('should not transform urls to secure urls when disableSSL is true', () => {
const argStub = sinon.stub(args, 'args').returns({ disableSSL: true, customrooturi: 'test.com' });
const envStub = sinon.stub(process, 'env').value({ BITGO_DISABLE_SSL: true, BITGO_CUSTOM_ROOT_URI: 'test.com' });
(0, config_1.config)().disableSSL.should.equal(true);
(0, config_1.config)().should.have.property('customRootUri', 'test.com');
argStub.restore();
envStub.restore();
});
it('should correctly handle config precedence for a complete config', () => {
const argStub = sinon.stub(args, 'args').returns({
port: 23456,
bind: 'argbind',
ipc: 'argipc',
env: 'argenv',
debugnamespace: 'argdebug',
keypath: 'argkeypath',
crtpath: 'argcrtpath',
logfile: 'arglogfile',
disablessl: 'argdisableSSL',
disableproxy: 'argdisableProxy',
disableenvcheck: 'argdisableEnvCheck',
timeout: 'argtimeout',
customrooturi: 'argcustomRootUri',
custombitcoinnetwork: 'argcustomBitcoinNetwork',
externalSignerUrl: 'argexternalSignerUrl',
signerMode: 'argsignerMode',
signerFileSystemPath: 'argsignerFileSystemPath',
lightningSignerFileSystemPath: 'arglightningSignerFileSystemPath',
keepalivetimeout: 'argkeepalivetimeout',
headerstimeout: 'argheaderstimeout',
});
const envStub = sinon.stub(process, 'env').value({
BITGO_PORT: 'env12345',
BITGO_BIND: 'envbind',
BITGO_IPC: 'envipc',
BITGO_ENV: 'envenv',
BITGO_DEBUG_NAMESPACE: 'envdebug',
BITGO_KEYPATH: 'envkeypath',
BITGO_CRTPATH: 'envcrtpath',
BITGO_SSL_KEY: 'sslkey',
BITGO_SSL_CERT: 'sslcert',
BITGO_LOGFILE: 'envlogfile',
BITGO_DISABLE_SSL: 'envdisableSSL',
BITGO_DISABLE_PROXY: 'envdisableProxy',
BITGO_DISABLE_ENV_CHECK: 'envdisableEnvCheck',
BITGO_TIMEOUT: 'envtimeout',
BITGO_CUSTOM_ROOT_URI: 'envcustomRootUri',
BITGO_CUSTOM_BITCOIN_NETWORK: 'envcustomBitcoinNetwork',
BITGO_EXTERNAL_SIGNER_URL: 'envexternalSignerUrl',
BITGO_SIGNER_MODE: 'envsignerMode',
BITGO_SIGNER_FILE_SYSTEM_PATH: 'envsignerFileSystemPath',
BITGO_LIGHTNING_SIGNER_FILE_SYSTEM_PATH: 'envlightningSignerFileSystemPath',
BITGO_KEEP_ALIVE_TIMETOUT: 'envkeepalivetimeout',
BITGO_HEADERS_TIMETOUT: 'envheaderstimeout',
});
(0, config_1.config)().should.eql({
port: 23456,
bind: 'argbind',
ipc: 'argipc',
env: 'argenv',
debugNamespace: 'argdebug',
keyPath: 'argkeypath',
crtPath: 'argcrtpath',
sslKey: 'sslkey',
sslCert: 'sslcert',
logFile: 'arglogfile',
disableSSL: 'argdisableSSL',
disableProxy: 'argdisableProxy',
disableEnvCheck: 'argdisableEnvCheck',
timeout: 'argtimeout',
customRootUri: 'https://argcustomRootUri',
customBitcoinNetwork: 'argcustomBitcoinNetwork',
authVersion: 2,
externalSignerUrl: 'https://argexternalSignerUrl',
signerMode: 'argsignerMode',
signerFileSystemPath: 'argsignerFileSystemPath',
lightningSignerFileSystemPath: 'arglightningSignerFileSystemPath',
keepAliveTimeout: 'argkeepalivetimeout',
headersTimeout: 'argheaderstimeout',
});
argStub.restore();
envStub.restore();
});
it('should correctly handle boolean config precedence', () => {
const argStub = sinon.stub(args, 'args').returns({ disablessl: true });
const envStub = sinon.stub(process, 'env').value({ BITGO_DISABLE_SSL: undefined });
(0, config_1.config)().disableSSL.should.equal(true);
argStub.restore();
envStub.restore();
});
it('should allow all DISABLE_SSL option forms, including deprecated', () => {
const optionForms = [
{ deprecated: true, DISABLESSL: true },
{ deprecated: true, DISABLE_SSL: true },
{ BITGO_DISABLE_SSL: true },
{ deprecated: true, BITGO_DISABLESSL: true },
];
for (const { deprecated, ...form } of optionForms) {
const argStub = sinon.stub(args, 'args').returns({});
const envStub = sinon.stub(process, 'env').value(form);
const consoleStub = sinon.stub(console, 'warn').returns(undefined);
(0, config_1.config)().disableSSL.should.equal(true);
argStub.restore();
envStub.restore();
consoleStub.restore();
if (deprecated) {
consoleStub.calledOnceWithExactly(sinon.match(/deprecated environment variable/)).should.be.true();
}
}
});
it('should allow all DISABLE_PROXY option forms, including deprecated', () => {
const optionForms = [{ deprecated: true, DISABLE_PROXY: true }, { BITGO_DISABLE_PROXY: true }];
for (const { deprecated = false, ...form } of optionForms) {
const argStub = sinon.stub(args, 'args').returns({});
const envStub = sinon.stub(process, 'env').value(form);
const consoleStub = sinon.stub(console, 'warn').returns(undefined);
(0, config_1.config)().disableProxy.should.equal(true);
argStub.restore();
envStub.restore();
consoleStub.restore();
if (deprecated) {
consoleStub.calledOnceWithExactly(sinon.match(/deprecated environment variable/)).should.be.true();
}
}
});
it('should allow all DISABLE_ENV_CHECK option forms, including deprecated', () => {
const optionForms = [{ BITGO_DISABLE_ENV_CHECK: true }, { deprecated: true, DISABLE_ENV_CHECK: true }];
for (const { deprecated = false, ...form } of optionForms) {
const argStub = sinon.stub(args, 'args').returns({});
const envStub = sinon.stub(process, 'env').value(form);
const consoleStub = sinon.stub(console, 'warn').returns(undefined);
(0, config_1.config)().disableEnvCheck.should.equal(true);
argStub.restore();
envStub.restore();
consoleStub.restore();
if (deprecated) {
consoleStub.calledOnceWithExactly(sinon.match(/deprecated environment variable/)).should.be.true();
}
}
});
it('should set omitted boolean command line args to null and not false', () => {
const argvStub = sinon.stub(process, 'argv').value([process.argv[0]]);
const parsed = args.args();
should.not.exist(parsed.disablessl);
should.not.exist(parsed.disableenvcheck);
should.not.exist(parsed.disableproxy);
argvStub.restore();
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDJCQUEyQjtBQUMzQiwrQkFBK0I7QUFDL0IsMkJBQTJCO0FBQzNCLDhCQUE4QjtBQUM5QixpQ0FBaUM7QUFDakMsK0JBQStCO0FBRS9CLDZDQUF5RDtBQUN6RCx1Q0FBdUM7QUFFdkMsUUFBUSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUU7SUFDdkIsRUFBRSxDQUFDLHlDQUF5QyxFQUFFLEdBQUcsRUFBRTtRQUNqRCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNsRSxJQUFBLGVBQU0sR0FBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNwQixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxpREFBaUQsRUFBRSxHQUFHLEVBQUU7UUFDekQsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQzFFLElBQUEsZUFBTSxHQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2xCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJ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QUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDM0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN6QyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdEMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3JCLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwibW9jaGFcIiAvPlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4vLy8gPHJlZmVyZW5jZSB0eXBlcz1cIm5vZGVcIiAvPlxuaW1wb3J0ICogYXMgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgKiBhcyBzaW5vbiBmcm9tICdzaW5vbic7XG5cbmltcG9ydCB7IGNvbmZpZywgRGVmYXVsdENvbmZpZyB9IGZyb20gJy4uLy4uL3NyYy9jb25maWcnO1xuaW1wb3J0ICogYXMgYXJncyBmcm9tICcuLi8uLi9zcmMvYXJncyc7XG5cbmRlc2NyaWJlKCdDb25maWc6JywgKCkgPT4ge1xuICBpdCgnc2hvdWxkIHRha2UgY29tbWFuZCBsaW5lIGNvbmZpZyBvcHRpb25zJywgKCkgPT4ge1xuICAgIGNvbnN0IGFyZ1N0dWIgPSBzaW5vbi5zdHViKGFyZ3MsICdhcmdzJykucmV0dXJucyh7IHBvcnQ6IDEyMzQ1IH0pO1xuICAgIGNvbmZpZygpLnBvcnQuc2hvdWxkLmVxdWFsKDEyMzQ1KTtcbiAgICBhcmdTdHViLnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0YWtlIGVudmlyb25tZW50IHZhcmlhYmxlIGNvbmZpZyBvcHRpb25zJywgKCkgPT4ge1xuICAgIGNvbnN0IGFyZ1N0dWIgPSBzaW5vbi5zdHViKGFyZ3MsICdhcmdzJykucmV0dXJucyh7fSk7XG4gICAgY29uc3QgZW52U3R1YiA9IHNpbm9uLnN0dWIocHJvY2VzcywgJ2VudicpLnZhbHVlKHsgQklUR09fUE9SVDogJzEyMzQ1JyB9KTtcbiAgICBjb25maWcoKS5wb3J0LnNob3VsZC5lcXVhbCgxMjM0NSk7XG4gICAgYXJnU3R1Yi5yZXN0b3JlKCk7XG4gICAgZW52U3R1Yi5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZmFsbCBiYWNrIHRvIGRlZmF1bHQgY29uZmlnIG9wdGlvbnMnLCAoKSA9PiB7XG4gICAgY29uc3QgYXJnU3R1YiA9IHNpbm9uLnN0dWIoYXJncywgJ2FyZ3MnKS5yZXR1cm5zKHt9KTtcbiAgICBjb25maWcoKS5wb3J0LnNob3VsZC5lcXVhbChEZWZhdWx0Q29uZmlnLnBvcnQpO1xuICAgIGFyZ1N0dWIucmVzdG9yZSgpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGNvcnJlY3RseSBoYW5kbGUgY29uZmlnIHByZWNlZGVuY2UnLCAoKSA9PiB7XG4gICAgY29uc3QgYXJnU3R1YiA9IHNpbm9uLnN0dWIoYXJncywgJ2FyZ3MnKS5yZXR1cm5zKHsgcG9ydDogMjM0NTYgfSk7XG4gICAgY29uc3QgZW52U3R1YiA9IHNpbm9uLnN0dWIocHJvY2VzcywgJ2VudicpLnZhbHVlKHsgQklUR09fUE9SVDogJzEyMzQ1JyB9KTtcbiAgICBjb25maWcoKS5wb3J0LnNob3VsZC5lcXVhbCgyMzQ1Nik7XG4gICAgYXJnU3R1Yi5yZXN0b3JlKCk7XG4gICAgZW52U3R1Yi5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdHJhbnNmb3JtIHVybHMgdG8gc2VjdXJlIHVybHMgd2hlbiBkaXNhYmxlU1NMIGlzIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICBjb25zdCBhcmdTdHViID0gc2lub24uc3R1YihhcmdzLCAnYXJncycpLnJldHVybnMoeyBkaXNhYmxlU1NMOiB1bmRlZmluZWQsIGN1c3RvbXJvb3R1cmk6ICd0ZXN0LmNvbScgfSk7XG4gICAgY29uc3QgZW52U3R1YiA9IHNpbm9uXG4gICAgICAuc3R1Yihwcm9jZXNzLCAnZW52JylcbiAgICAgIC52YWx1ZSh7IEJJVEdPX0RJU0FCTEVfU1NMOiB1bmRlZmluZWQsIEJJVEdPX0NVU1RPTV9ST09UX1VSSTogJ3Rlc3QuY29tJyB9KTtcbiAgICBjb25maWcoKS5kaXNhYmxlU1NMLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgY29uZmlnKCkuc2hvdWxkLmhhdmUucHJvcGVydHkoJ2N1c3RvbVJvb3RVcmknLCAnaHR0cHM6Ly90ZXN0LmNvbScpO1xuICAgIGFyZ1N0dWIucmVzdG9yZSgpO1xuICAgIGVudlN0dWIucmVzdG9yZSgpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHRyYW5zZm9ybSB1cmxzIHRvIHNlY3VyZSB1cmxzIHdoZW4gZGlzYWJsZVNTTCBpcyBmYWxzZScsICgpID0+IHtcbiAgICBjb25zdCBhcmdTdHViID0gc2lub24uc3R1YihhcmdzLCAnYXJncycpLnJldHVybnMoeyBkaXNhYmxlU1NMOiBmYWxzZSwgY3VzdG9tcm9vdHVyaTogJ3Rlc3QuY29tJyB9KTtcbiAgICBjb25zdCBlbnZTdHViID0gc2lub24uc3R1Yihwcm9jZXNzLCAnZW52JykudmFsdWUoeyBCSVRHT19ESVNBQkxFX1NTTDogZmFsc2UsIEJJVEdPX0NVU1RPTV9ST09UX1VSSTogJ3Rlc3QuY29tJyB9KTtcbiAgICBjb25maWcoKS5kaXNhYmxlU1NMLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgY29uZmlnKCkuc2hvdWxkLmhhdmUucHJvcGVydHkoJ2N1c3RvbVJvb3RVcmknLCAnaHR0cHM6Ly90ZXN0LmNvbScpO1xuICAgIGFyZ1N0dWIucmVzdG9yZSgpO1xuICAgIGVudlN0dWIucmVzdG9yZSgpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIG5vdCB0cmFuc2Zvcm0gdXJscyB0byBzZWN1cmUgdXJscyB3aGVuIGRpc2FibGVTU0wgaXMgdHJ1ZScsICgpID0+IHtcbiAgICBjb25zdCBhcmdTdHViID0gc2lub24uc3R1YihhcmdzLCAnYXJncycpLnJldHVybnMoeyBkaXNhYmxlU1NMOiB0cnVlLCBjdXN0b21yb290dXJpOiAndGVzdC5jb20nIH0pO1xuICAgIGNvbnN0IGVudlN0dWIgPSBzaW5vbi5zdHViKHByb2Nlc3MsICdlbnYnKS52YWx1ZSh7IEJJVEdPX0RJU0FCTEVfU1NMOiB0cnVlLCBCSVRHT19DVVNUT01fUk9PVF9VUkk6ICd0ZXN0LmNvbScgfSk7XG4gICAgY29uZmlnKCkuZGlzYWJsZVNTTC5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgY29uZmlnKCkuc2hvdWxkLmhhdmUucHJvcGVydHkoJ2N1c3RvbVJvb3RVcmknLCAndGVzdC5jb20nKTtcbiAgICBhcmdTdHViLnJlc3RvcmUoKTtcbiAgICBlbnZTdHViLnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgaGFuZGxlIGNvbmZpZyBwcmVjZWRlbmNlIGZvciBhIGNvbXBsZXRlIGNvbmZpZycsICgpID0+IHtcbiAgICBjb25zdCBhcmdTdHViID0gc2lub24uc3R1YihhcmdzLCAnYXJncycpLnJldHVybnMoe1xuICAgICAgcG9ydDogMjM0NTYsXG4gICAgICBiaW5kOiAnYXJnYmluZCcsXG4gICAgICBpcGM6ICdhcmdpcGMnLFxuICAgICAgZW52OiAnYXJnZW52JyxcbiAgICAgIGRlYnVnbmFtZXNwYWNlOiAnYXJnZGVidWcnLFxuICAgICAga2V5cGF0aDogJ2FyZ2tleXBhdGgnLFxuICAgICAgY3J0cGF0aDogJ2FyZ2NydHBhdGgnLFxuICAgICAgbG9nZmlsZTogJ2FyZ2xvZ2ZpbGUnLFxuICAgICAgZGlzYWJsZXNzbDogJ2FyZ2Rpc2FibGVTU0wnLFxuICAgICAgZGlzYWJsZXByb3h5OiAnYXJnZGlzYWJsZVByb3h5JyxcbiAgICAgIGRpc2FibGVlbnZjaGVjazogJ2FyZ2Rpc2FibGVFbnZDaGVjaycsXG4gICAgICB0aW1lb3V0OiAnYXJndGltZW91dCcsXG4gICAgICBjdXN0b21yb290dXJpOiAnYXJnY3VzdG9tUm9vdFVyaScsXG4gICAgICBjdXN0b21iaXRjb2lubmV0d29yazogJ2FyZ2N1c3RvbUJpdGNvaW5OZXR3b3JrJyxcbiAgICAgIGV4dGVybmFsU2lnbmVyVXJsOiAnYXJnZXh0ZXJuYWxTaWduZXJVcmwnLFxuICAgICAgc2lnbmVyTW9kZTogJ2FyZ3NpZ25lck1vZGUnLFxuICAgICAgc2lnbmVyRmlsZVN5c3RlbVBhdGg6ICdhcmdzaWduZXJGaWxlU3lzdGVtUGF0aCcsXG4gICAgICBsaWdodG5pbmdTaWduZXJGaWxlU3lzdGVtUGF0aDogJ2FyZ2xpZ2h0bmluZ1NpZ25lckZpbGVTeXN0ZW1QYXRoJyxcbiAgICAgIGtlZXBhbGl2ZXRpbWVvdXQ6ICdhcmdrZWVwYWxpdmV0aW1lb3V0JyxcbiAgICAgIGhlYWRlcnN0aW1lb3V0OiAnYXJnaGVhZGVyc3RpbWVvdXQnLFxuICAgIH0pO1xuICAgIGNvbnN0IGVudlN0dWIgPSBzaW5vbi5zdHViKHByb2Nlc3MsICdlbnYnKS52YWx1ZSh7XG4gICAgICBCSVRHT19QT1JUOiAnZW52MTIzNDUnLFxuICAgICAgQklUR09fQklORDogJ2VudmJpbmQnLFxuICAgICAgQklUR09fSVBDOiAnZW52aXBjJyxcbiAgICAgIEJJVEdPX0VOVjogJ2VudmVudicsXG4gICAgICBCSVRHT19ERUJVR19OQU1FU1BBQ0U6ICdlbnZkZWJ1ZycsXG4gICAgICBCSVRHT19LRVlQQVRIOiAnZW52a2V5cGF0aCcsXG4gICAgICBCSVRHT19DUlRQQVRIOiAnZW52Y3J0cGF0aCcsXG4gICAgICBCSVRHT19TU0xfS0VZOiAnc3Nsa2V5JyxcbiAgICAgIEJJVEdPX1NTTF9DRVJUOiAnc3NsY2VydCcsXG4gICAgICBCSVRHT19MT0dGSUxFOiAnZW52bG9nZmlsZScsXG4gICAgICBCSVRHT19ESVNBQkxFX1NTTDogJ2VudmRpc2FibGVTU0wnLFxuICAgICAgQklUR09fRElTQUJMRV9QUk9YWTogJ2VudmRpc2FibGVQcm94eScsXG4gICAgICBCSVRHT19ESVNBQkxFX0VOVl9DSEVDSzogJ2VudmRpc2FibGVFbnZDaGVjaycsXG4gICAgICBCSVRHT19USU1FT1VUOiAnZW52dGltZW91dCcsXG4gICAgICBCSVRHT19DVVNUT01fUk9PVF9VUkk6ICdlbnZjdXN0b21Sb290VXJpJyxcbiAgICAgIEJJVEdPX0NVU1RPTV9CSVRDT0lOX05FVFdPUks6ICdlbnZjdXN0b21CaXRjb2luTmV0d29yaycsXG4gICAgICBCSVRHT19FWFRFUk5BTF9TSUdORVJfVVJMOiAnZW52ZXh0ZXJuYWxTaWduZXJVcmwnLFxuICAgICAgQklUR09fU0lHTkVSX01PREU6ICdlbnZzaWduZXJNb2RlJyxcbiAgICAgIEJJVEdPX1NJR05FUl9GSUxFX1NZU1RFTV9QQVRIOiAnZW52c2lnbmVyRmlsZVN5c3RlbVBhdGgnLFxuICAgICAgQklUR09fTElHSFROSU5HX1NJR05FUl9GSUxFX1NZU1RFTV9QQVRIOiAnZW52bGlnaHRuaW5nU2lnbmVyRmlsZVN5c3RlbVBhdGgnLFxuICAgICAgQklUR09fS0VFUF9BTElWRV9USU1FVE9VVDogJ2VudmtlZXBhbGl2ZXRpbWVvdXQnLFxuICAgICAgQklUR09fSEVBREVSU19USU1FVE9VVDogJ2VudmhlYWRlcnN0aW1lb3V0JyxcbiAgICB9KTtcbiAgICBjb25maWcoKS5zaG91bGQuZXFsKHtcbiAgICAgIHBvcnQ6IDIzNDU2LFxuICAgICAgYmluZDogJ2FyZ2JpbmQnLFxuICAgICAgaXBjOiAnYXJnaXBjJyxcbiAgICAgIGVudjogJ2FyZ2VudicsXG4gICAgICBkZWJ1Z05hbWVzcGFjZTogJ2FyZ2RlYnVnJyxcbiAgICAgIGtleVBhdGg6ICdhcmdrZXlwYXRoJyxcbiAgICAgIGNydFBhdGg6ICdhcmdjcnRwYXRoJyxcbiAgICAgIHNzbEtleTogJ3NzbGtleScsXG4gICAgICBzc2xDZXJ0OiAnc3NsY2VydCcsXG4gICAgICBsb2dGaWxlOiAnYXJnbG9nZmlsZScsXG4gICAgICBkaXNhYmxlU1NMOiAnYXJnZGlzYWJsZVNTTCcsXG4gICAgICBkaXNhYmxlUHJveHk6ICdhcmdkaXNhYmxlUHJveHknLFxuICAgICAgZGlzYWJsZUVudkNoZWNrOiAnYXJnZGlzYWJsZUVudkNoZWNrJyxcbiAgICAgIHRpbWVvdXQ6ICdhcmd0aW1lb3V0JyxcbiAgICAgIGN1c3RvbVJvb3RVcmk6ICdodHRwczovL2FyZ2N1c3RvbVJvb3RVcmknLFxuICAgICAgY3VzdG9tQml0Y29pbk5ldHdvcms6ICdhcmdjdXN0b21CaXRjb2luTmV0d29yaycsXG4gICAgICBhdXRoVmVyc2lvbjogMixcbiAgICAgIGV4dGVybmFsU2lnbmVyVXJsOiAnaHR0cHM6Ly9hcmdleHRlcm5hbFNpZ25lclVybCcsXG4gICAgICBzaWduZXJNb2RlOiAnYXJnc2lnbmVyTW9kZScsXG4gICAgICBzaWduZXJGaWxlU3lzdGVtUGF0aDogJ2FyZ3NpZ25lckZpbGVTeXN0ZW1QYXRoJyxcbiAgICAgIGxpZ2h0bmluZ1NpZ25lckZpbGVTeXN0ZW1QYXRoOiAnYXJnbGlnaHRuaW5nU2lnbmVyRmlsZVN5c3RlbVBhdGgnLFxuICAgICAga2VlcEFsaXZlVGltZW91dDogJ2FyZ2tlZXBhbGl2ZXRpbWVvdXQnLFxuICAgICAgaGVhZGVyc1RpbWVvdXQ6ICdhcmdoZWFkZXJzdGltZW91dCcsXG4gICAgfSk7XG4gICAgYXJnU3R1Yi5yZXN0b3JlKCk7XG4gICAgZW52U3R1Yi5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgY29ycmVjdGx5IGhhbmRsZSBib29sZWFuIGNvbmZpZyBwcmVjZWRlbmNlJywgKCkgPT4ge1xuICAgIGNvbnN0IGFyZ1N0dWIgPSBzaW5vbi5zdHViKGFyZ3MsICdhcmdzJykucmV0dXJucyh7IGRpc2FibGVzc2w6IHRydWUgfSk7XG4gICAgY29uc3QgZW52U3R1YiA9IHNpbm9uLnN0dWIocHJvY2VzcywgJ2VudicpLnZhbHVlKHsgQklUR09fRElTQUJMRV9TU0w6IHVuZGVmaW5lZCB9KTtcbiAgICBjb25maWcoKS5kaXNhYmxlU1NMLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICBhcmdTdHViLnJlc3RvcmUoKTtcbiAgICBlbnZTdHViLnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBhbGxvdyBhbGwgRElTQUJMRV9TU0wgb3B0aW9uIGZvcm1zLCBpbmNsdWRpbmcgZGVwcmVjYXRlZCcsICgpID0+IHtcbiAgICBjb25zdCBvcHRpb25Gb3JtcyA9IFtcbiAgICAgIHsgZGVwcmVjYXRlZDogdHJ1ZSwgRElTQUJMRVNTTDogdHJ1ZSB9LFxuICAgICAgeyBkZXByZWNhdGVkOiB0cnVlLCBESVNBQkxFX1NTTDogdHJ1ZSB9LFxuICAgICAgeyBCSVRHT19ESVNBQkxFX1NTTDogdHJ1ZSB9LFxuICAgICAgeyBkZXByZWNhdGVkOiB0cnVlLCBCSVRHT19ESVNBQkxFU1NMOiB0cnVlIH0sXG4gICAgXTtcblxuICAgIGZvciAoY29uc3QgeyBkZXByZWNhdGVkLCAuLi5mb3JtIH0gb2Ygb3B0aW9uRm9ybXMpIHtcbiAgICAgIGNvbnN0IGFyZ1N0dWIgPSBzaW5vbi5zdHViKGFyZ3MsICdhcmdzJykucmV0dXJucyh7fSk7XG4gICAgICBjb25zdCBlbnZTdHViID0gc2lub24uc3R1Yihwcm9jZXNzLCAnZW52JykudmFsdWUoZm9ybSk7XG4gICAgICBjb25zdCBjb25zb2xlU3R1YiA9IHNpbm9uLnN0dWIoY29uc29sZSwgJ3dhcm4nKS5yZXR1cm5zKHVuZGVmaW5lZCk7XG4gICAgICBjb25maWcoKS5kaXNhYmxlU1NMLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgIGFyZ1N0dWIucmVzdG9yZSgpO1xuICAgICAgZW52U3R1Yi5yZXN0b3JlKCk7XG4gICAgICBjb25zb2xlU3R1Yi5yZXN0b3JlKCk7XG4gICAgICBpZiAoZGVwcmVjYXRlZCkge1xuICAgICAgICBjb25zb2xlU3R1Yi5jYWxsZWRPbmNlV2l0aEV4YWN0bHkoc2lub24ubWF0Y2goL2RlcHJlY2F0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGUvKSkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYWxsb3cgYWxsIERJU0FCTEVfUFJPWFkgb3B0aW9uIGZvcm1zLCBpbmNsdWRpbmcgZGVwcmVjYXRlZCcsICgpID0+IHtcbiAgICBjb25zdCBvcHRpb25Gb3JtcyA9IFt7IGRlcHJlY2F0ZWQ6IHRydWUsIERJU0FCTEVfUFJPWFk6IHRydWUgfSwgeyBCSVRHT19ESVNBQkxFX1BST1hZOiB0cnVlIH1dO1xuXG4gICAgZm9yIChjb25zdCB7IGRlcHJlY2F0ZWQgPSBmYWxzZSwgLi4uZm9ybSB9IG9mIG9wdGlvbkZvcm1zKSB7XG4gICAgICBjb25zdCBhcmdTdHViID0gc2lub24uc3R1YihhcmdzLCAnYXJncycpLnJldHVybnMoe30pO1xuICAgICAgY29uc3QgZW52U3R1YiA9IHNpbm9uLnN0dWIocHJvY2VzcywgJ2VudicpLnZhbHVlKGZvcm0pO1xuICAgICAgY29uc3QgY29uc29sZVN0dWIgPSBzaW5vbi5zdHViKGNvbnNvbGUsICd3YXJuJykucmV0dXJucyh1bmRlZmluZWQpO1xuICAgICAgY29uZmlnKCkuZGlzYWJsZVByb3h5LnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgIGFyZ1N0dWIucmVzdG9yZSgpO1xuICAgICAgZW52U3R1Yi5yZXN0b3JlKCk7XG4gICAgICBjb25zb2xlU3R1Yi5yZXN0b3JlKCk7XG4gICAgICBpZiAoZGVwcmVjYXRlZCkge1xuICAgICAgICBjb25zb2xlU3R1Yi5jYWxsZWRPbmNlV2l0aEV4YWN0bHkoc2lub24ubWF0Y2goL2RlcHJlY2F0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGUvKSkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYWxsb3cgYWxsIERJU0FCTEVfRU5WX0NIRUNLIG9wdGlvbiBmb3JtcywgaW5jbHVkaW5nIGRlcHJlY2F0ZWQnLCAoKSA9PiB7XG4gICAgY29uc3Qgb3B0aW9uRm9ybXMgPSBbeyBCSVRHT19ESVNBQkxFX0VOVl9DSEVDSzogdHJ1ZSB9LCB7IGRlcHJlY2F0ZWQ6IHRydWUsIERJU0FCTEVfRU5WX0NIRUNLOiB0cnVlIH1dO1xuXG4gICAgZm9yIChjb25zdCB7IGRlcHJlY2F0ZWQgPSBmYWxzZSwgLi4uZm9ybSB9IG9mIG9wdGlvbkZvcm1zKSB7XG4gICAgICBjb25zdCBhcmdTdHViID0gc2lub24uc3R1YihhcmdzLCAnYXJncycpLnJldHVybnMoe30pO1xuICAgICAgY29uc3QgZW52U3R1YiA9IHNpbm9uLnN0dWIocHJvY2VzcywgJ2VudicpLnZhbHVlKGZvcm0pO1xuICAgICAgY29uc3QgY29uc29sZVN0dWIgPSBzaW5vbi5zdHViKGNvbnNvbGUsICd3YXJuJykucmV0dXJucyh1bmRlZmluZWQpO1xuICAgICAgY29uZmlnKCkuZGlzYWJsZUVudkNoZWNrLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgIGFyZ1N0dWIucmVzdG9yZSgpO1xuICAgICAgZW52U3R1Yi5yZXN0b3JlKCk7XG4gICAgICBjb25zb2xlU3R1Yi5yZXN0b3JlKCk7XG4gICAgICBpZiAoZGVwcmVjYXRlZCkge1xuICAgICAgICBjb25zb2xlU3R1Yi5jYWxsZWRPbmNlV2l0aEV4YWN0bHkoc2lub24ubWF0Y2goL2RlcHJlY2F0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGUvKSkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgc2V0IG9taXR0ZWQgYm9vbGVhbiBjb21tYW5kIGxpbmUgYXJncyB0byBudWxsIGFuZCBub3QgZmFsc2UnLCAoKSA9PiB7XG4gICAgY29uc3QgYXJndlN0dWIgPSBzaW5vbi5zdHViKHByb2Nlc3MsICdhcmd2JykudmFsdWUoW3Byb2Nlc3MuYXJndlswXV0pO1xuICAgIGNvbnN0IHBhcnNlZCA9IGFyZ3MuYXJncygpO1xuICAgIHNob3VsZC5ub3QuZXhpc3QocGFyc2VkLmRpc2FibGVzc2wpO1xuICAgIHNob3VsZC5ub3QuZXhpc3QocGFyc2VkLmRpc2FibGVlbnZjaGVjayk7XG4gICAgc2hvdWxkLm5vdC5leGlzdChwYXJzZWQuZGlzYWJsZXByb3h5KTtcbiAgICBhcmd2U3R1Yi5yZXN0b3JlKCk7XG4gIH0pO1xufSk7XG4iXX0=Выполнить команду
Для локальной разработки. Не используйте в интернете!