@testim/testim-cli
Version:
Command line interface for running Testing on you CI
272 lines (239 loc) • 32.4 kB
JavaScript
'use strict';
var _getIterator = require('babel-runtime/core-js/get-iterator')['default'];
var _interopRequireDefault = require('babel-runtime/helpers/interop-require-default')['default'];
var _path = require('path');
var _path2 = _interopRequireDefault(_path);
var _fs = require('fs');
var _fs2 = _interopRequireDefault(_fs);
var _ejs = require('ejs');
var _ejs2 = _interopRequireDefault(_ejs);
var _inquirer = require('inquirer');
var _inquirer2 = _interopRequireDefault(_inquirer);
var _optimist = require('optimist');
var _optimist2 = _interopRequireDefault(_optimist);
var _launcher = require('./launcher');
var _launcher2 = _interopRequireDefault(_launcher);
var _packageJson = require('../package.json');
var _packageJson2 = _interopRequireDefault(_packageJson);
var VERSION = _packageJson2['default'].version;
var ALLOWED_ARGV = ['host', 'port', 'path', 'user', 'key', 'updateJob', 'logLevel', 'coloredLogs', 'screenshotPath', 'baseUrl', 'waitforTimeout', 'framework', 'reporter', 'cucumberOpts', 'jasmineOpts', 'mochaOpts'];
_optimist2['default'].usage('WebdriverIO CLI runner\n\n' + 'Usage: wdio [options] [configFile]\n' + 'config file defaults to wdio.conf.js\n' + 'The [options] object will override values from the config file.').describe('help', 'prints WebdriverIO help menu').alias('help', 'h').describe('version', 'prints WebdriverIO version').alias('version', 'v').describe('host', 'Selenium server host address').describe('port', 'Selenium server port').describe('path', 'Selenium server path (default: /wd/hub)').describe('user', 'username if using a cloud service as Selenium backend').alias('user', 'u').describe('key', 'corresponding access key to the user').alias('key', 'k').describe('updateJob', 'if true update job properties for Sauce Labs job (default: true)').describe('logLevel', 'level of logging verbosity (default: silent)').alias('logLevel', 'l').describe('coloredLogs', 'if true enables colors for log output (default: true)').alias('coloredLogs', 'c').describe('screenshotPath', 'saves a screenshot to a given path if a command fails').alias('screenshotPath', 's').describe('baseUrl', 'shorten url command calls by setting a base url').alias('baseUrl', 'b').describe('waitforTimeout', 'timeout for all waitForXXX commands (default: 500ms)').alias('waitforTimeout', 'w').describe('framework', 'defines the framework (Mocha, Jasmine or Cucumber) to run the specs (default: mocha)').alias('framework', 'f').describe('reporter', 'reporter to print out the results on stdout').alias('reporter', 'r').describe('cucumberOpts.tags', 'run only certain scenarios annotated by tags').describe('cucumberOpts.ignoreUndefinedDefinitions', 'ignore undefined step definitions').describe('cucumberOpts.require', 'specify where your step definitions are located').describe('jasmineOpts.defaultTimeoutInterval', 'Jasmine default timeout').describe('mochaOpts.ui', 'specify user-interface').describe('mochaOpts.timeout', 'set test-case timeout in milliseconds').describe('mochaOpts.require', 'require the given module').describe('mochaOpts.compilers', 'use the given module(s) to compile files').check(function (arg) {
if (arg._.length > 1) {
throw new Error('Error: more than one config file specified');
}
});
var argv = _optimist2['default'].parse(process.argv.slice(2));
if (argv.help) {
_optimist2['default'].showHelp();
process.exit(0);
}
if (argv.version) {
console.log('v' + VERSION);
process.exit(0);
}
if (argv._[0] === 'config') {
console.log('\n=========================\nWDIO Configuration Helper\n=========================\n');
_inquirer2['default'].prompt([{
type: 'list',
name: 'backend',
message: 'Where do you want to execute your tests?',
choices: ['On my local machine', 'In the cloud using Sauce Labs, Browsertack or Testingbot', 'In the cloud using a different service', 'I have my own Selenium cloud']
}, {
type: 'input',
name: 'host',
message: 'What is the host address of that cloud service?',
when: function when(answers) {
return answers.backend.indexOf('different service') > -1;
}
}, {
type: 'input',
name: 'port',
message: 'What is the port on which that service is running?',
'default': '80',
when: function when(answers) {
return answers.backend.indexOf('different service') > -1;
}
}, {
type: 'input',
name: 'env_user',
message: 'Environment letiable for username',
'default': 'SAUCE_USERNAME',
when: function when(answers) {
return answers.backend.indexOf('In the cloud') > -1;
}
}, {
type: 'input',
name: 'env_key',
message: 'Environment letiable for access key',
'default': 'SAUCE_ACCESS_KEY',
when: function when(answers) {
return answers.backend.indexOf('In the cloud') > -1;
}
}, {
type: 'input',
name: 'host',
message: 'What is the IP or URI to your Selenium standalone server?',
'default': '0.0.0.0',
when: function when(answers) {
return answers.backend.indexOf('own Selenium cloud') > -1;
}
}, {
type: 'input',
name: 'port',
message: 'What is the port which your Selenium standalone server is running on?',
'default': '4444',
when: function when(answers) {
return answers.backend.indexOf('own Selenium cloud') > -1;
}
}, {
type: 'input',
name: 'path',
message: 'What is the path to your Selenium standalone server?',
'default': '/wd/hub',
when: function when(answers) {
return answers.backend.indexOf('own Selenium cloud') > -1;
}
}, {
type: 'list',
name: 'framework',
message: 'Which framework do you want to use?',
choices: ['mocha', 'jasmine', 'cucumber']
}, {
type: 'input',
name: 'specs',
message: 'Where are your test specs located?',
'default': './test/specs/**/*.js',
when: function when(answers) {
return answers.framework.match(/(mocha|jasmine)/);
}
}, {
type: 'input',
name: 'specs',
message: 'Where are your feature files located?',
'default': './features/**/*.feature',
when: function when(answers) {
return answers.framework === 'cucumber';
}
}, {
type: 'input',
name: 'stepDefinitions',
message: 'Where are your step definitions located?',
'default': './features/step-definitions/**/*.js',
when: function when(answers) {
return answers.framework === 'cucumber';
}
}, {
type: 'list',
name: 'reporter',
message: 'Which reporter do you want to use? (see http://webdriver.io/guide/testrunner/reporters.html)',
choices: ['dot', 'spec', 'xunit']
}, {
type: 'input',
name: 'outputDir',
message: 'In which directory should the xunit reports get stored?',
'default': './',
when: function when(answers) {
return answers.reporter === 'xunit';
}
}, {
type: 'list',
name: 'logLevel',
message: 'Level of logging verbosity',
'default': 'silent',
choices: ['silent', 'verbose', 'command', 'data', 'result', 'error']
}, {
type: 'input',
name: 'screenshotPath',
message: 'In which directory should screenshots gets saved if a command fails?',
'default': './errorShots/'
}, {
type: 'input',
name: 'baseUrl',
message: 'What is the base url?',
'default': 'http://localhost'
}], function (answers) {
var tpl = _fs2['default'].readFileSync(__dirname + '/helpers/wdio.conf.ejs', 'utf8');
var renderedTpl = _ejs2['default'].render(tpl, {
answers: answers
});
_fs2['default'].writeFileSync(_path2['default'].join(process.cwd(), 'wdio.conf.js'), renderedTpl);
console.log('\nConfiguration file was created successfully!\nTo run your tests, execute:\n\n $ wdio wdio.conf.js\n');
process.exit(0);
});
}
/**
* sanitize cucumberOpts
*/
if (argv.cucumberOpts) {
if (argv.cucumberOpts.tags) {
argv.cucumberOpts.tags = argv.cucumberOpts.tags.split(',');
}
if (argv.cucumberOpts.ignoreUndefinedDefinitions) {
argv.cucumberOpts.ignoreUndefinedDefinitions = argv.cucumberOpts.ignoreUndefinedDefinitions === 'true';
}
if (argv.cucumberOpts.require) {
argv.cucumberOpts.require = argv.cucumberOpts.require.split(',');
}
}
/**
* sanitize jasmineOpts
*/
if (argv.jasmineOpts && argv.jasmineOpts.defaultTimeoutInterval) {
argv.jasmineOpts.defaultTimeoutInterval = parseInt(argv.jasmineOpts.defaultTimeoutInterval, 10);
}
/**
* sanitize mochaOpts
*/
if (argv.mochaOpts) {
if (argv.mochaOpts.timeout) {
argv.mochaOpts.timeout = parseInt(argv.mochaOpts.timeout, 10);
}
if (argv.mochaOpts.compilers) {
argv.mochaOpts.compilers = argv.mochaOpts.compilers.split(',');
}
if (argv.mochaOpts.require) {
argv.mochaOpts.require = argv.mochaOpts.require.split(',');
}
}
// Use default configuration, if it exists.
var configFile = argv._[0];
if (!configFile) {
if (_fs2['default'].existsSync('./wdio.conf.js')) {
configFile = './wdio.conf.js';
}
}
var args = {};
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = _getIterator(ALLOWED_ARGV), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var key = _step.value;
if (argv[key]) {
args[key] = argv[key];
}
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator['return']) {
_iterator['return']();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
var launcher = new _launcher2['default'](configFile, args);
launcher.run().then(function (exitCode) {
if (exitCode instanceof Error) {
return process.nextTick(function () {
throw exitCode;
});
}
process.exit(exitCode);
});
//# sourceMappingURL=data:application/json;base64,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QUFJLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFO0FBQ3hCLFlBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtLQUM3RDtDQUNKOzs7QUFHRCxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQzFCLElBQUksQ0FBQyxVQUFVLEVBQUU7QUFDYixRQUFJLGdCQUFHLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO0FBQ2pDLGtCQUFVLEdBQUcsZ0JBQWdCLENBQUE7S0FDaEM7Q0FDSjs7QUFFRCxJQUFJLElBQUksR0FBRyxFQUFFLENBQUE7Ozs7OztBQUNiLHNDQUFnQixZQUFZLDRHQUFFO1lBQXJCLEdBQUc7O0FBQ1IsWUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFDWCxnQkFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtTQUN4QjtLQUNKOzs7Ozs7Ozs7Ozs7Ozs7O0FBRUQsSUFBSSxRQUFRLEdBQUcsMEJBQWEsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFBO0FBQzdDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBQyxRQUFRLEVBQUs7QUFDOUIsUUFBSSxRQUFRLFlBQVksS0FBSyxFQUFFO0FBQzNCLGVBQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxZQUFNO0FBQUUsa0JBQU0sUUFBUSxDQUFBO1NBQUUsQ0FBQyxDQUFBO0tBQ3BEOztBQUVELFdBQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7Q0FDekIsQ0FBQyxDQUFBIiwiZmlsZSI6ImNsaS5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuaW1wb3J0IGZzIGZyb20gJ2ZzJ1xuaW1wb3J0IGVqcyBmcm9tICdlanMnXG5pbXBvcnQgaW5xdWlyZXIgZnJvbSAnaW5xdWlyZXInXG5pbXBvcnQgb3B0aW1pc3QgZnJvbSAnb3B0aW1pc3QnXG5cbmltcG9ydCBMYXVuY2hlciBmcm9tICcuL2xhdW5jaGVyJ1xuaW1wb3J0IHBrZyBmcm9tICcuLi9wYWNrYWdlLmpzb24nXG5cbmNvbnN0IFZFUlNJT04gPSBwa2cudmVyc2lvblxuY29uc3QgQUxMT1dFRF9BUkdWID0gWydob3N0JywgJ3BvcnQnLCAncGF0aCcsICd1c2VyJywgJ2tleScsICd1cGRhdGVKb2InLCAnbG9nTGV2ZWwnLCAnY29sb3JlZExvZ3MnLCAnc2NyZWVuc2hvdFBhdGgnLFxuICAgICAgICAgICAgICAgICAgICAgICdiYXNlVXJsJywgJ3dhaXRmb3JUaW1lb3V0JywgJ2ZyYW1ld29yaycsICdyZXBvcnRlcicsICdjdWN1bWJlck9wdHMnLCAnamFzbWluZU9wdHMnLCAnbW9jaGFPcHRzJ11cblxub3B0aW1pc3RcbiAgICAudXNhZ2UoJ1dlYmRyaXZlcklPIENMSSBydW5uZXJcXG5cXG4nICtcbiAgICAgICAgJ1VzYWdlOiB3ZGlvIFtvcHRpb25zXSBbY29uZmlnRmlsZV1cXG4nICtcbiAgICAgICAgJ2NvbmZpZyBmaWxlIGRlZmF1bHRzIHRvIHdkaW8uY29uZi5qc1xcbicgK1xuICAgICAgICAnVGhlIFtvcHRpb25zXSBvYmplY3Qgd2lsbCBvdmVycmlkZSB2YWx1ZXMgZnJvbSB0aGUgY29uZmlnIGZpbGUuJylcblxuICAgIC5kZXNjcmliZSgnaGVscCcsICdwcmludHMgV2ViZHJpdmVySU8gaGVscCBtZW51JylcbiAgICAuYWxpYXMoJ2hlbHAnLCAnaCcpXG4gICAgLmRlc2NyaWJlKCd2ZXJzaW9uJywgJ3ByaW50cyBXZWJkcml2ZXJJTyB2ZXJzaW9uJylcbiAgICAuYWxpYXMoJ3ZlcnNpb24nLCAndicpXG4gICAgLmRlc2NyaWJlKCdob3N0JywgJ1NlbGVuaXVtIHNlcnZlciBob3N0IGFkZHJlc3MnKVxuICAgIC5kZXNjcmliZSgncG9ydCcsICdTZWxlbml1bSBzZXJ2ZXIgcG9ydCcpXG4gICAgLmRlc2NyaWJlKCdwYXRoJywgJ1NlbGVuaXVtIHNlcnZlciBwYXRoIChkZWZhdWx0OiAvd2QvaHViKScpXG4gICAgLmRlc2NyaWJlKCd1c2VyJywgJ3VzZXJuYW1lIGlmIHVzaW5nIGEgY2xvdWQgc2VydmljZSBhcyBTZWxlbml1bSBiYWNrZW5kJylcbiAgICAuYWxpYXMoJ3VzZXInLCAndScpXG4gICAgLmRlc2NyaWJlKCdrZXknLCAnY29ycmVzcG9uZGluZyBhY2Nlc3Mga2V5IHRvIHRoZSB1c2VyJylcbiAgICAuYWxpYXMoJ2tleScsICdrJylcbiAgICAuZGVzY3JpYmUoJ3VwZGF0ZUpvYicsICdpZiB0cnVlIHVwZGF0ZSBqb2IgcHJvcGVydGllcyBmb3IgU2F1Y2UgTGFicyBqb2IgKGRlZmF1bHQ6IHRydWUpJylcbiAgICAuZGVzY3JpYmUoJ2xvZ0xldmVsJywgJ2xldmVsIG9mIGxvZ2dpbmcgdmVyYm9zaXR5IChkZWZhdWx0OiBzaWxlbnQpJylcbiAgICAuYWxpYXMoJ2xvZ0xldmVsJywgJ2wnKVxuICAgIC5kZXNjcmliZSgnY29sb3JlZExvZ3MnLCAnaWYgdHJ1ZSBlbmFibGVzIGNvbG9ycyBmb3IgbG9nIG91dHB1dCAoZGVmYXVsdDogdHJ1ZSknKVxuICAgIC5hbGlhcygnY29sb3JlZExvZ3MnLCAnYycpXG4gICAgLmRlc2NyaWJlKCdzY3JlZW5zaG90UGF0aCcsICdzYXZlcyBhIHNjcmVlbnNob3QgdG8gYSBnaXZlbiBwYXRoIGlmIGEgY29tbWFuZCBmYWlscycpXG4gICAgLmFsaWFzKCdzY3JlZW5zaG90UGF0aCcsICdzJylcbiAgICAuZGVzY3JpYmUoJ2Jhc2VVcmwnLCAnc2hvcnRlbiB1cmwgY29tbWFuZCBjYWxscyBieSBzZXR0aW5nIGEgYmFzZSB1cmwnKVxuICAgIC5hbGlhcygnYmFzZVVybCcsICdiJylcbiAgICAuZGVzY3JpYmUoJ3dhaXRmb3JUaW1lb3V0JywgJ3RpbWVvdXQgZm9yIGFsbCB3YWl0Rm9yWFhYIGNvbW1hbmRzIChkZWZhdWx0OiA1MDBtcyknKVxuICAgIC5hbGlhcygnd2FpdGZvclRpbWVvdXQnLCAndycpXG4gICAgLmRlc2NyaWJlKCdmcmFtZXdvcmsnLCAnZGVmaW5lcyB0aGUgZnJhbWV3b3JrIChNb2NoYSwgSmFzbWluZSBvciBDdWN1bWJlcikgdG8gcnVuIHRoZSBzcGVjcyAoZGVmYXVsdDogbW9jaGEpJylcbiAgICAuYWxpYXMoJ2ZyYW1ld29yaycsICdmJylcbiAgICAuZGVzY3JpYmUoJ3JlcG9ydGVyJywgJ3JlcG9ydGVyIHRvIHByaW50IG91dCB0aGUgcmVzdWx0cyBvbiBzdGRvdXQnKVxuICAgIC5hbGlhcygncmVwb3J0ZXInLCAncicpXG4gICAgLmRlc2NyaWJlKCdjdWN1bWJlck9wdHMudGFncycsICdydW4gb25seSBjZXJ0YWluIHNjZW5hcmlvcyBhbm5vdGF0ZWQgYnkgdGFncycpXG4gICAgLmRlc2NyaWJlKCdjdWN1bWJlck9wdHMuaWdub3JlVW5kZWZpbmVkRGVmaW5pdGlvbnMnLCAnaWdub3JlIHVuZGVmaW5lZCBzdGVwIGRlZmluaXRpb25zJylcbiAgICAuZGVzY3JpYmUoJ2N1Y3VtYmVyT3B0cy5yZXF1aXJlJywgJ3NwZWNpZnkgd2hlcmUgeW91ciBzdGVwIGRlZmluaXRpb25zIGFyZSBsb2NhdGVkJylcbiAgICAuZGVzY3JpYmUoJ2phc21pbmVPcHRzLmRlZmF1bHRUaW1lb3V0SW50ZXJ2YWwnLCAnSmFzbWluZSBkZWZhdWx0IHRpbWVvdXQnKVxuICAgIC5kZXNjcmliZSgnbW9jaGFPcHRzLnVpJywgJ3NwZWNpZnkgdXNlci1pbnRlcmZhY2UnKVxuICAgIC5kZXNjcmliZSgnbW9jaGFPcHRzLnRpbWVvdXQnLCAnc2V0IHRlc3QtY2FzZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcycpXG4gICAgLmRlc2NyaWJlKCdtb2NoYU9wdHMucmVxdWlyZScsICdyZXF1aXJlIHRoZSBnaXZlbiBtb2R1bGUnKVxuICAgIC5kZXNjcmliZSgnbW9jaGFPcHRzLmNvbXBpbGVycycsICd1c2UgdGhlIGdpdmVuIG1vZHVsZShzKSB0byBjb21waWxlIGZpbGVzJylcblxuICAgIC5jaGVjaygoYXJnKSA9PiB7XG4gICAgICAgIGlmIChhcmcuXy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yOiBtb3JlIHRoYW4gb25lIGNvbmZpZyBmaWxlIHNwZWNpZmllZCcpXG4gICAgICAgIH1cbiAgICB9KVxuXG5sZXQgYXJndiA9IG9wdGltaXN0LnBhcnNlKHByb2Nlc3MuYXJndi5zbGljZSgyKSlcblxuaWYgKGFyZ3YuaGVscCkge1xuICAgIG9wdGltaXN0LnNob3dIZWxwKClcbiAgICBwcm9jZXNzLmV4aXQoMClcbn1cblxuaWYgKGFyZ3YudmVyc2lvbikge1xuICAgIGNvbnNvbGUubG9nKGB2JHtWRVJTSU9OfWApXG4gICAgcHJvY2Vzcy5leGl0KDApXG59XG5cbmlmIChhcmd2Ll9bMF0gPT09ICdjb25maWcnKSB7XG4gICAgY29uc29sZS5sb2coYFxuPT09PT09PT09PT09PT09PT09PT09PT09PVxuV0RJTyBDb25maWd1cmF0aW9uIEhlbHBlclxuPT09PT09PT09PT09PT09PT09PT09PT09PVxuYClcbiAgICBpbnF1aXJlci5wcm9tcHQoW3tcbiAgICAgICAgdHlwZTogJ2xpc3QnLFxuICAgICAgICBuYW1lOiAnYmFja2VuZCcsXG4gICAgICAgIG1lc3NhZ2U6ICdXaGVyZSBkbyB5b3Ugd2FudCB0byBleGVjdXRlIHlvdXIgdGVzdHM/JyxcbiAgICAgICAgY2hvaWNlczogW1xuICAgICAgICAgICAgJ09uIG15IGxvY2FsIG1hY2hpbmUnLFxuICAgICAgICAgICAgJ0luIHRoZSBjbG91ZCB1c2luZyBTYXVjZSBMYWJzLCBCcm93c2VydGFjayBvciBUZXN0aW5nYm90JyxcbiAgICAgICAgICAgICdJbiB0aGUgY2xvdWQgdXNpbmcgYSBkaWZmZXJlbnQgc2VydmljZScsXG4gICAgICAgICAgICAnSSBoYXZlIG15IG93biBTZWxlbml1bSBjbG91ZCdcbiAgICAgICAgXVxuICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ2lucHV0JyxcbiAgICAgICAgbmFtZTogJ2hvc3QnLFxuICAgICAgICBtZXNzYWdlOiAnV2hhdCBpcyB0aGUgaG9zdCBhZGRyZXNzIG9mIHRoYXQgY2xvdWQgc2VydmljZT8nLFxuICAgICAgICB3aGVuOiBhbnN3ZXJzID0+IGFuc3dlcnMuYmFja2VuZC5pbmRleE9mKCdkaWZmZXJlbnQgc2VydmljZScpID4gLTFcbiAgICB9LCB7XG4gICAgICAgIHR5cGU6ICdpbnB1dCcsXG4gICAgICAgIG5hbWU6ICdwb3J0JyxcbiAgICAgICAgbWVzc2FnZTogJ1doYXQgaXMgdGhlIHBvcnQgb24gd2hpY2ggdGhhdCBzZXJ2aWNlIGlzIHJ1bm5pbmc/JyxcbiAgICAgICAgZGVmYXVsdDogJzgwJyxcbiAgICAgICAgd2hlbjogYW5zd2VycyA9PiBhbnN3ZXJzLmJhY2tlbmQuaW5kZXhPZignZGlmZmVyZW50IHNlcnZpY2UnKSA+IC0xXG4gICAgfSwge1xuICAgICAgICB0eXBlOiAnaW5wdXQnLFxuICAgICAgICBuYW1lOiAnZW52X3VzZXInLFxuICAgICAgICBtZXNzYWdlOiAnRW52aXJvbm1lbnQgbGV0aWFibGUgZm9yIHVzZXJuYW1lJyxcbiAgICAgICAgZGVmYXVsdDogJ1NBVUNFX1VTRVJOQU1FJyxcbiAgICAgICAgd2hlbjogYW5zd2VycyA9PiBhbnN3ZXJzLmJhY2tlbmQuaW5kZXhPZignSW4gdGhlIGNsb3VkJykgPiAtMVxuICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ2lucHV0JyxcbiAgICAgICAgbmFtZTogJ2Vudl9rZXknLFxuICAgICAgICBtZXNzYWdlOiAnRW52aXJvbm1lbnQgbGV0aWFibGUgZm9yIGFjY2VzcyBrZXknLFxuICAgICAgICBkZWZhdWx0OiAnU0FVQ0VfQUNDRVNTX0tFWScsXG4gICAgICAgIHdoZW46IGFuc3dlcnMgPT4gYW5zd2Vycy5iYWNrZW5kLmluZGV4T2YoJ0luIHRoZSBjbG91ZCcpID4gLTFcbiAgICB9LCB7XG4gICAgICAgIHR5cGU6ICdpbnB1dCcsXG4gICAgICAgIG5hbWU6ICdob3N0JyxcbiAgICAgICAgbWVzc2FnZTogJ1doYXQgaXMgdGhlIElQIG9yIFVSSSB0byB5b3VyIFNlbGVuaXVtIHN0YW5kYWxvbmUgc2VydmVyPycsXG4gICAgICAgIGRlZmF1bHQ6ICcwLjAuMC4wJyxcbiAgICAgICAgd2hlbjogYW5zd2VycyA9PiBhbnN3ZXJzLmJhY2tlbmQuaW5kZXhPZignb3duIFNlbGVuaXVtIGNsb3VkJykgPiAtMVxuICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ2lucHV0JyxcbiAgICAgICAgbmFtZTogJ3BvcnQnLFxuICAgICAgICBtZXNzYWdlOiAnV2hhdCBpcyB0aGUgcG9ydCB3aGljaCB5b3VyIFNlbGVuaXVtIHN0YW5kYWxvbmUgc2VydmVyIGlzIHJ1bm5pbmcgb24/JyxcbiAgICAgICAgZGVmYXVsdDogJzQ0NDQnLFxuICAgICAgICB3aGVuOiBhbnN3ZXJzID0+IGFuc3dlcnMuYmFja2VuZC5pbmRleE9mKCdvd24gU2VsZW5pdW0gY2xvdWQnKSA+IC0xXG4gICAgfSwge1xuICAgICAgICB0eXBlOiAnaW5wdXQnLFxuICAgICAgICBuYW1lOiAncGF0aCcsXG4gICAgICAgIG1lc3NhZ2U6ICdXaGF0IGlzIHRoZSBwYXRoIHRvIHlvdXIgU2VsZW5pdW0gc3RhbmRhbG9uZSBzZXJ2ZXI/JyxcbiAgICAgICAgZGVmYXVsdDogJy93ZC9odWInLFxuICAgICAgICB3aGVuOiBhbnN3ZXJzID0+IGFuc3dlcnMuYmFja2VuZC5pbmRleE9mKCdvd24gU2VsZW5pdW0gY2xvdWQnKSA+IC0xXG4gICAgfSwge1xuICAgICAgICB0eXBlOiAnbGlzdCcsXG4gICAgICAgIG5hbWU6ICdmcmFtZXdvcmsnLFxuICAgICAgICBtZXNzYWdlOiAnV2hpY2ggZnJhbWV3b3JrIGRvIHlvdSB3YW50IHRvIHVzZT8nLFxuICAgICAgICBjaG9pY2VzOiBbJ21vY2hhJywgJ2phc21pbmUnLCAnY3VjdW1iZXInXVxuICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ2lucHV0JyxcbiAgICAgICAgbmFtZTogJ3NwZWNzJyxcbiAgICAgICAgbWVzc2FnZTogJ1doZXJlIGFyZSB5b3VyIHRlc3Qgc3BlY3MgbG9jYXRlZD8nLFxuICAgICAgICBkZWZhdWx0OiAnLi90ZXN0L3NwZWNzLyoqLyouanMnLFxuICAgICAgICB3aGVuOiBhbnN3ZXJzID0+IGFuc3dlcnMuZnJhbWV3b3JrLm1hdGNoKC8obW9jaGF8amFzbWluZSkvKVxuICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ2lucHV0JyxcbiAgICAgICAgbmFtZTogJ3NwZWNzJyxcbiAgICAgICAgbWVzc2FnZTogJ1doZXJlIGFyZSB5b3VyIGZlYXR1cmUgZmlsZXMgbG9jYXRlZD8nLFxuICAgICAgICBkZWZhdWx0OiAnLi9mZWF0dXJlcy8qKi8qLmZlYXR1cmUnLFxuICAgICAgICB3aGVuOiBhbnN3ZXJzID0+IGFuc3dlcnMuZnJhbWV3b3JrID09PSAnY3VjdW1iZXInXG4gICAgfSwge1xuICAgICAgICB0eXBlOiAnaW5wdXQnLFxuICAgICAgICBuYW1lOiAnc3RlcERlZmluaXRpb25zJyxcbiAgICAgICAgbWVzc2FnZTogJ1doZXJlIGFyZSB5b3VyIHN0ZXAgZGVmaW5pdGlvbnMgbG9jYXRlZD8nLFxuICAgICAgICBkZWZhdWx0OiAnLi9mZWF0dXJlcy9zdGVwLWRlZmluaXRpb25zLyoqLyouanMnLFxuICAgICAgICB3aGVuOiBhbnN3ZXJzID0+IGFuc3dlcnMuZnJhbWV3b3JrID09PSAnY3VjdW1iZXInXG4gICAgfSwge1xuICAgICAgICB0eXBlOiAnbGlzdCcsXG4gICAgICAgIG5hbWU6ICdyZXBvcnRlcicsXG4gICAgICAgIG1lc3NhZ2U6ICdXaGljaCByZXBvcnRlciBkbyB5b3Ugd2FudCB0byB1c2U/IChzZWUgaHR0cDovL3dlYmRyaXZlci5pby9ndWlkZS90ZXN0cnVubmVyL3JlcG9ydGVycy5odG1sKScsXG4gICAgICAgIGNob2ljZXM6IFsnZG90JywgJ3NwZWMnLCAneHVuaXQnXVxuICAgIH0sIHtcbiAgICAgICAgdHlwZTogJ2lucHV0JyxcbiAgICAgICAgbmFtZTogJ291dHB1dERpcicsXG4gICAgICAgIG1lc3NhZ2U6ICdJbiB3aGljaCBkaXJlY3Rvcnkgc2hvdWxkIHRoZSB4dW5pdCByZXBvcnRzIGdldCBzdG9yZWQ/JyxcbiAgICAgICAgZGVmYXVsdDogJy4vJyxcbiAgICAgICAgd2hlbjogYW5zd2VycyA9PiBhbnN3ZXJzLnJlcG9ydGVyID09PSAneHVuaXQnXG4gICAgfSwge1xuICAgICAgICB0eXBlOiAnbGlzdCcsXG4gICAgICAgIG5hbWU6ICdsb2dMZXZlbCcsXG4gICAgICAgIG1lc3NhZ2U6ICdMZXZlbCBvZiBsb2dnaW5nIHZlcmJvc2l0eScsXG4gICAgICAgIGRlZmF1bHQ6ICdzaWxlbnQnLFxuICAgICAgICBjaG9pY2VzOiBbXG4gICAgICAgICAgICAnc2lsZW50JyxcbiAgICAgICAgICAgICd2ZXJib3NlJyxcbiAgICAgICAgICAgICdjb21tYW5kJyxcbiAgICAgICAgICAgICdkYXRhJyxcbiAgICAgICAgICAgICdyZXN1bHQnLFxuICAgICAgICAgICAgJ2Vycm9yJ1xuICAgICAgICBdXG4gICAgfSwge1xuICAgICAgICB0eXBlOiAnaW5wdXQnLFxuICAgICAgICBuYW1lOiAnc2NyZWVuc2hvdFBhdGgnLFxuICAgICAgICBtZXNzYWdlOiAnSW4gd2hpY2ggZGlyZWN0b3J5IHNob3VsZCBzY3JlZW5zaG90cyBnZXRzIHNhdmVkIGlmIGEgY29tbWFuZCBmYWlscz8nLFxuICAgICAgICBkZWZhdWx0OiAnLi9lcnJvclNob3RzLydcbiAgICB9LCB7XG4gICAgICAgIHR5cGU6ICdpbnB1dCcsXG4gICAgICAgIG5hbWU6ICdiYXNlVXJsJyxcbiAgICAgICAgbWVzc2FnZTogJ1doYXQgaXMgdGhlIGJhc2UgdXJsPycsXG4gICAgICAgIGRlZmF1bHQ6ICdodHRwOi8vbG9jYWxob3N0J1xuICAgIH1dLCAoYW5zd2VycykgPT4ge1xuICAgICAgICBsZXQgdHBsID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvaGVscGVycy93ZGlvLmNvbmYuZWpzJywgJ3V0ZjgnKVxuICAgICAgICBsZXQgcmVuZGVyZWRUcGwgPSBlanMucmVuZGVyKHRwbCwge1xuICAgICAgICAgICAgYW5zd2VyczogYW5zd2Vyc1xuICAgICAgICB9KVxuXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICd3ZGlvLmNvbmYuanMnKSwgcmVuZGVyZWRUcGwpXG4gICAgICAgIGNvbnNvbGUubG9nKGBcbkNvbmZpZ3VyYXRpb24gZmlsZSB3YXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkhXG5UbyBydW4geW91ciB0ZXN0cywgZXhlY3V0ZTpcblxuICAgICQgd2RpbyB3ZGlvLmNvbmYuanNcbmApXG4gICAgICAgIHByb2Nlc3MuZXhpdCgwKVxuICAgIH0pXG59XG5cbi8qKlxuICogc2FuaXRpemUgY3VjdW1iZXJPcHRzXG4gKi9cbmlmIChhcmd2LmN1Y3VtYmVyT3B0cykge1xuICAgIGlmIChhcmd2LmN1Y3VtYmVyT3B0cy50YWdzKSB7XG4gICAgICAgIGFyZ3YuY3VjdW1iZXJPcHRzLnRhZ3MgPSBhcmd2LmN1Y3VtYmVyT3B0cy50YWdzLnNwbGl0KCcsJylcbiAgICB9XG4gICAgaWYgKGFyZ3YuY3VjdW1iZXJPcHRzLmlnbm9yZVVuZGVmaW5lZERlZmluaXRpb25zKSB7XG4gICAgICAgIGFyZ3YuY3VjdW1iZXJPcHRzLmlnbm9yZVVuZGVmaW5lZERlZmluaXRpb25zID0gYXJndi5jdWN1bWJlck9wdHMuaWdub3JlVW5kZWZpbmVkRGVmaW5pdGlvbnMgPT09ICd0cnVlJ1xuICAgIH1cbiAgICBpZiAoYXJndi5jdWN1bWJlck9wdHMucmVxdWlyZSkge1xuICAgICAgICBhcmd2LmN1Y3VtYmVyT3B0cy5yZXF1aXJlID0gYXJndi5jdWN1bWJlck9wdHMucmVxdWlyZS5zcGxpdCgnLCcpXG4gICAgfVxufVxuXG4vKipcbiAqIHNhbml0aXplIGphc21pbmVPcHRzXG4gKi9cbmlmIChhcmd2Lmphc21pbmVPcHRzICYmIGFyZ3YuamFzbWluZU9wdHMuZGVmYXVsdFRpbWVvdXRJbnRlcnZhbCkge1xuICAgIGFyZ3YuamFzbWluZU9wdHMuZGVmYXVsdFRpbWVvdXRJbnRlcnZhbCA9IHBhcnNlSW50KGFyZ3YuamFzbWluZU9wdHMuZGVmYXVsdFRpbWVvdXRJbnRlcnZhbCwgMTApXG59XG5cbi8qKlxuICogc2FuaXRpemUgbW9jaGFPcHRzXG4gKi9cbmlmIChhcmd2Lm1vY2hhT3B0cykge1xuICAgIGlmIChhcmd2Lm1vY2hhT3B0cy50aW1lb3V0KSB7XG4gICAgICAgIGFyZ3YubW9jaGFPcHRzLnRpbWVvdXQgPSBwYXJzZUludChhcmd2Lm1vY2hhT3B0cy50aW1lb3V0LCAxMClcbiAgICB9XG4gICAgaWYgKGFyZ3YubW9jaGFPcHRzLmNvbXBpbGVycykge1xuICAgICAgICBhcmd2Lm1vY2hhT3B0cy5jb21waWxlcnMgPSBhcmd2Lm1vY2hhT3B0cy5jb21waWxlcnMuc3BsaXQoJywnKVxuICAgIH1cbiAgICBpZiAoYXJndi5tb2NoYU9wdHMucmVxdWlyZSkge1xuICAgICAgICBhcmd2Lm1vY2hhT3B0cy5yZXF1aXJlID0gYXJndi5tb2NoYU9wdHMucmVxdWlyZS5zcGxpdCgnLCcpXG4gICAgfVxufVxuXG4vLyBVc2UgZGVmYXVsdCBjb25maWd1cmF0aW9uLCBpZiBpdCBleGlzdHMuXG5sZXQgY29uZmlnRmlsZSA9IGFyZ3YuX1swXVxuaWYgKCFjb25maWdGaWxlKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoJy4vd2Rpby5jb25mLmpzJykpIHtcbiAgICAgICAgY29uZmlnRmlsZSA9ICcuL3dkaW8uY29uZi5qcydcbiAgICB9XG59XG5cbmxldCBhcmdzID0ge31cbmZvciAobGV0IGtleSBvZiBBTExPV0VEX0FSR1YpIHtcbiAgICBpZiAoYXJndltrZXldKSB7XG4gICAgICAgIGFyZ3Nba2V5XSA9IGFyZ3Zba2V5XVxuICAgIH1cbn1cblxubGV0IGxhdW5jaGVyID0gbmV3IExhdW5jaGVyKGNvbmZpZ0ZpbGUsIGFyZ3MpXG5sYXVuY2hlci5ydW4oKS50aGVuKChleGl0Q29kZSkgPT4ge1xuICAgIGlmIChleGl0Q29kZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHsgdGhyb3cgZXhpdENvZGUgfSlcbiAgICB9XG5cbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpXG59KVxuIl19