@testim/testim-cli
Version:
Command line interface for running Testing on you CI
187 lines (162 loc) • 18.5 kB
JavaScript
;
var _getIterator = require('babel-runtime/core-js/get-iterator')['default'];
var _interopRequireDefault = require('babel-runtime/helpers/interop-require-default')['default'];
Object.defineProperty(exports, '__esModule', {
value: true
});
var _helpersFindElementStrategy = require('../helpers/findElementStrategy');
var _helpersFindElementStrategy2 = _interopRequireDefault(_helpersFindElementStrategy);
/**
* Returns the script to execute in the browser, in string format.
* @param {Function|String} fn - function to execute in the browser
* @param {Array.<String>} selectors - the selectors to resolve and pass to fn, each in its own array
* @param {Array} args - the arguments to pass to fn (after resolved selectors)
* @param {Function} callback
* @returns {string}
*/
var createSelectorScript = function createSelectorScript(fn, selectors, args) {
var strArgs = [];
var foundSel = [];
if (typeof fn === 'function' || this.inMultibrowserMode && fn.indexOf('function (') === 0) {
// Handle function script
strArgs.push(fn.toString());
} else if (typeof fn === 'string') {
// Handle string script
strArgs.push('function(){' + fn + '}');
}
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = _getIterator(selectors), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var selector = _step.value;
var val = (0, _helpersFindElementStrategy2['default'])(selector);
foundSel.push(val.using, val.value);
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator['return']) {
_iterator['return']();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
strArgs.push(JSON.stringify(foundSel));
var i = -1;
while (++i < args.length) {
if (typeof args[i] === 'function' || this.inMultibrowserMode && (typeof args[i] === 'string' && args[i].indexOf('function (') === 0)) {
args[i] = args[i].toString();
} else {
args[i] = JSON.stringify(args[i]);
}
}
strArgs.push('[' + args.join(',') + ']');
return ('return (' + executeClientSide + ')(' + strArgs.join(',') + ', arguments[arguments.length - 1]);').replace(/(\s{4}|\t)+/g, ' ');
};
/**
* Helper that resolves selectors client side and returns the result in the given fn.
* Every resolved selector is prepended to the function's arguments.
* Each resolved selector yields a single array.
*
* @param {Function} fn - the function to execute client side that will receive the resolved selectors
* @param {Array.<String>} sArr - a series of usage, value pairs from find-element-strategy
* @param {Array} args - any other arguments to pass to fn
* @returns {*} the return value of fn
* @example
* var helper = require('./executeClientSideSelector');
* // Execute in the browser
* helper(fn, ['xpath', '//body', 'css', '[id="what"]'], [1, 2, 3]);
* // Assuming fn is...
* fn = function(xpathResult, cssResult, one, two, three) {
* console.log(xpathResult.length); // 1
* console.log(xpathResult[0]); // <body.../>
* console.log(cssResult.length); // 0
* console.log(one, two, three); // 1 2 3
* }
*/
var executeClientSide = function executeClientSide(fn, sArr, args) {
var cb = arguments[arguments.length - 1],
i = 0,
sArgs = [],
use,
value,
xp,
cs,
tn,
res,
j,
arg;
if (typeof document.querySelectorAll === 'undefined') {
document.querySelectorAll = function (selector) {
var doc = document,
head = doc.documentElement.firstChild,
styleTag = doc.createElement('STYLE');
head.appendChild(styleTag);
doc.__qsaels = [];
styleTag.styleSheet.cssText = selector + '{x:expression(document.__qsaels.push(this))}';
window.scrollBy(0, 0);
return doc.__qsaels;
};
}
while ((use = sArr[i++]) && (value = sArr[i++])) {
arg = [];
xp = cs = tn = null;
switch (use) {
case 'partial link text':
xp = '//a[contains(text(),"' + value + '")]';
break;
case 'link text':
xp = '//a[text()="' + value + '"]';
break;
case 'xpath':
xp = value;
break;
case 'id':
cs = '#' + value;
break;
case 'name':
cs = '[name="' + value + '"]';
break;
case 'tag name':
tn = value;
break;
case 'css selector':
cs = value;
break;
default:
throw new Error('Could not evaluate selector: Invalid strategy ' + use);
}
if (xp) {
res = document.evaluate(xp, document, null, 0, null);
value = res.iterateNext();
while (value) {
arg.push(value);
value = res.iterateNext();
}
} else if (tn || cs) {
res = tn ? document.getElementsByTagName(tn) : document.querySelectorAll(cs);
for (j = 0; j < res.length; ++j) {
arg.push(res[j]);
}
}
sArgs.push(arg);
}
var parameter = args && sArgs.concat(args) || sArgs;
if (parameter.length === 0 || parameter.length === 1 && parameter[0].length === 0) {
if (typeof cb === 'function') {
return cb('NoSuchElement') && new Error('NoSuchElement');
}
return new Error('NoSuchElement');
}
parameter.push(arguments[arguments.length - 1]);
return fn.apply(window, parameter);
};
exports['default'] = createSelectorScript;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9zY3JpcHRzL2NyZWF0ZVNlbGVjdG9yU2NyaXB0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7MENBQXlCLGdDQUFnQzs7Ozs7Ozs7Ozs7O0FBVXpELElBQUksb0JBQW9CLEdBQUcsU0FBdkIsb0JBQW9CLENBQWEsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUU7QUFDdEQsUUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFBO0FBQ2hCLFFBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQTs7QUFFakIsUUFBSSxPQUFPLEVBQUUsS0FBSyxVQUFVLElBQUssSUFBSSxDQUFDLGtCQUFrQixJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxBQUFDLEVBQUU7O0FBRXpGLGVBQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUE7S0FDOUIsTUFBTSxJQUFJLE9BQU8sRUFBRSxLQUFLLFFBQVEsRUFBRTs7QUFFL0IsZUFBTyxDQUFDLElBQUksaUJBQWUsRUFBRSxPQUFJLENBQUE7S0FDcEM7Ozs7Ozs7QUFFRCwwQ0FBcUIsU0FBUyw0R0FBRTtnQkFBdkIsUUFBUTs7QUFDYixnQkFBSSxHQUFHLEdBQUcsNkNBQWEsUUFBUSxDQUFDLENBQUE7QUFDaEMsb0JBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUE7U0FDdEM7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFRCxXQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQTs7QUFFdEMsUUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7QUFDVixXQUFPLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUU7QUFDdEIsWUFBSSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxVQUFVLElBQUssSUFBSSxDQUFDLGtCQUFrQixLQUFLLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQSxBQUFDLEFBQUMsRUFBRTtBQUNwSSxnQkFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQTtTQUMvQixNQUFNO0FBQ0gsZ0JBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1NBQ3BDO0tBQ0o7QUFDRCxXQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFBOztBQUV4QyxXQUFPLGNBQVksaUJBQWlCLFVBQUssT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsMENBQXVDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUE7Q0FDaEksQ0FBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkQsSUFBSSxpQkFBaUIsR0FBRyxTQUFwQixpQkFBaUIsQ0FBYSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRTtBQUM5QyxRQUFJLEVBQUUsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDcEMsQ0FBQyxHQUFHLENBQUM7UUFBRSxLQUFLLEdBQUcsRUFBRTtRQUNqQixHQUFHO1FBQUUsS0FBSztRQUFFLEVBQUU7UUFBRSxFQUFFO1FBQUUsRUFBRTtRQUN0QixHQUFHO1FBQUUsQ0FBQztRQUFFLEdBQUcsQ0FBQzs7QUFFaEIsUUFBSSxPQUFPLFFBQVEsQ0FBQyxnQkFBZ0IsS0FBSyxXQUFXLEVBQUU7QUFDbEQsZ0JBQVEsQ0FBQyxnQkFBZ0IsR0FBRyxVQUFTLFFBQVEsRUFBRTtBQUMzQyxnQkFBSSxHQUFHLEdBQUcsUUFBUTtnQkFDZCxJQUFJLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQyxVQUFVO2dCQUNyQyxRQUFRLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUMxQyxnQkFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMzQixlQUFHLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQzs7QUFFbEIsb0JBQVEsQ0FBQyxVQUFVLENBQUMsT0FBTyxHQUFHLFFBQVEsR0FBRyw4Q0FBOEMsQ0FBQztBQUN4RixrQkFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7O0FBRXRCLG1CQUFPLEdBQUcsQ0FBQyxRQUFRLENBQUM7U0FDdkIsQ0FBQztLQUNMOztBQUVELFdBQU8sQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUEsS0FBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUEsQUFBQyxFQUFFO0FBQzdDLFdBQUcsR0FBRyxFQUFFLENBQUM7QUFDVCxVQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDcEIsZ0JBQVEsR0FBRztBQUNQLGlCQUFLLG1CQUFtQjtBQUNwQixrQkFBRSxHQUFHLHVCQUF1QixHQUFHLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDN0Msc0JBQU07QUFBQSxBQUNWLGlCQUFLLFdBQVc7QUFDWixrQkFBRSxHQUFHLGNBQWMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ25DLHNCQUFNO0FBQUEsQUFDVixpQkFBSyxPQUFPO0FBQ1Isa0JBQUUsR0FBRyxLQUFLLENBQUM7QUFDWCxzQkFBTTtBQUFBLEFBQ1YsaUJBQUssSUFBSTtBQUNMLGtCQUFFLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQztBQUNqQixzQkFBTTtBQUFBLEFBQ1YsaUJBQUssTUFBTTtBQUNQLGtCQUFFLEdBQUcsU0FBUyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUM7QUFDOUIsc0JBQU07QUFBQSxBQUNWLGlCQUFLLFVBQVU7QUFDWCxrQkFBRSxHQUFHLEtBQUssQ0FBQztBQUNYLHNCQUFNO0FBQUEsQUFDVixpQkFBSyxjQUFjO0FBQ2Ysa0JBQUUsR0FBRyxLQUFLLENBQUM7QUFDWCxzQkFBTTtBQUFBLEFBQ1Y7QUFBUyxzQkFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUFBLFNBQ3BGOztBQUVELFlBQUksRUFBRSxFQUFFO0FBQ0osZUFBRyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDOztBQUVyRCxpQkFBSyxHQUFHLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUMxQixtQkFBTyxLQUFLLEVBQUU7QUFDVixtQkFBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNoQixxQkFBSyxHQUFHLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQzthQUM3QjtTQUNKLE1BQU0sSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFO0FBQ2pCLGVBQUcsR0FBRyxFQUFFLEdBQUcsUUFBUSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM3RSxpQkFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO0FBQzVCLG1CQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3BCO1NBQ0o7QUFDRCxhQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQ25COztBQUVELFFBQUksU0FBUyxHQUFHLElBQUksSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQztBQUNwRCxRQUFHLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFLLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxBQUFDLEVBQUU7QUFDaEYsWUFBRyxPQUFPLEVBQUUsS0FBSyxVQUFVLEVBQUU7QUFDekIsbUJBQU8sRUFBRSxDQUFDLGVBQWUsQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQzVEO0FBQ0QsZUFBTyxJQUFJLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztLQUNyQzs7QUFFRCxhQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7O0FBRWhELFdBQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7Q0FDdEMsQ0FBQzs7cUJBRWEsb0JBQW9CIiwiZmlsZSI6ImNyZWF0ZVNlbGVjdG9yU2NyaXB0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZpbmRTdHJhdGVneSBmcm9tICcuLi9oZWxwZXJzL2ZpbmRFbGVtZW50U3RyYXRlZ3knXG5cbi8qKlxuICogUmV0dXJucyB0aGUgc2NyaXB0IHRvIGV4ZWN1dGUgaW4gdGhlIGJyb3dzZXIsIGluIHN0cmluZyBmb3JtYXQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufFN0cmluZ30gZm4gLSBmdW5jdGlvbiB0byBleGVjdXRlIGluIHRoZSBicm93c2VyXG4gKiBAcGFyYW0ge0FycmF5LjxTdHJpbmc+fSBzZWxlY3RvcnMgLSB0aGUgc2VsZWN0b3JzIHRvIHJlc29sdmUgYW5kIHBhc3MgdG8gZm4sIGVhY2ggaW4gaXRzIG93biBhcnJheVxuICogQHBhcmFtIHtBcnJheX0gYXJncyAtIHRoZSBhcmd1bWVudHMgdG8gcGFzcyB0byBmbiAoYWZ0ZXIgcmVzb2x2ZWQgc2VsZWN0b3JzKVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmxldCBjcmVhdGVTZWxlY3RvclNjcmlwdCA9IGZ1bmN0aW9uIChmbiwgc2VsZWN0b3JzLCBhcmdzKSB7XG4gICAgbGV0IHN0ckFyZ3MgPSBbXVxuICAgIGxldCBmb3VuZFNlbCA9IFtdXG5cbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nIHx8ICh0aGlzLmluTXVsdGlicm93c2VyTW9kZSAmJiBmbi5pbmRleE9mKCdmdW5jdGlvbiAoJykgPT09IDApKSB7XG4gICAgICAgIC8vIEhhbmRsZSBmdW5jdGlvbiBzY3JpcHRcbiAgICAgICAgc3RyQXJncy5wdXNoKGZuLnRvU3RyaW5nKCkpXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZm4gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIC8vIEhhbmRsZSBzdHJpbmcgc2NyaXB0XG4gICAgICAgIHN0ckFyZ3MucHVzaChgZnVuY3Rpb24oKXske2ZufX1gKVxuICAgIH1cblxuICAgIGZvciAobGV0IHNlbGVjdG9yIG9mIHNlbGVjdG9ycykge1xuICAgICAgICBsZXQgdmFsID0gZmluZFN0cmF0ZWd5KHNlbGVjdG9yKVxuICAgICAgICBmb3VuZFNlbC5wdXNoKHZhbC51c2luZywgdmFsLnZhbHVlKVxuICAgIH1cblxuICAgIHN0ckFyZ3MucHVzaChKU09OLnN0cmluZ2lmeShmb3VuZFNlbCkpXG5cbiAgICB2YXIgaSA9IC0xXG4gICAgd2hpbGUgKCsraSA8IGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYXJnc1tpXSA9PT0gJ2Z1bmN0aW9uJyB8fCAodGhpcy5pbk11bHRpYnJvd3Nlck1vZGUgJiYgKHR5cGVvZiBhcmdzW2ldID09PSAnc3RyaW5nJyAmJiBhcmdzW2ldLmluZGV4T2YoJ2Z1bmN0aW9uICgnKSA9PT0gMCkpKSB7XG4gICAgICAgICAgICBhcmdzW2ldID0gYXJnc1tpXS50b1N0cmluZygpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhcmdzW2ldID0gSlNPTi5zdHJpbmdpZnkoYXJnc1tpXSlcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdHJBcmdzLnB1c2goJ1snICsgYXJncy5qb2luKCcsJykgKyAnXScpXG5cbiAgICByZXR1cm4gKGByZXR1cm4gKCR7ZXhlY3V0ZUNsaWVudFNpZGV9KSgke3N0ckFyZ3Muam9pbignLCcpfSwgYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXSk7YCkucmVwbGFjZSgvKFxcc3s0fXxcXHQpKy9nLCAnICcpXG59XG5cbi8qKlxuICogSGVscGVyIHRoYXQgcmVzb2x2ZXMgc2VsZWN0b3JzIGNsaWVudCBzaWRlIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgaW4gdGhlIGdpdmVuIGZuLlxuICogRXZlcnkgcmVzb2x2ZWQgc2VsZWN0b3IgaXMgcHJlcGVuZGVkIHRvIHRoZSBmdW5jdGlvbidzIGFyZ3VtZW50cy5cbiAqIEVhY2ggcmVzb2x2ZWQgc2VsZWN0b3IgeWllbGRzIGEgc2luZ2xlIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gdGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgY2xpZW50IHNpZGUgdGhhdCB3aWxsIHJlY2VpdmUgdGhlIHJlc29sdmVkIHNlbGVjdG9yc1xuICogQHBhcmFtIHtBcnJheS48U3RyaW5nPn0gc0FyciAtIGEgc2VyaWVzIG9mIHVzYWdlLCB2YWx1ZSBwYWlycyBmcm9tIGZpbmQtZWxlbWVudC1zdHJhdGVneVxuICogQHBhcmFtIHtBcnJheX0gYXJncyAtIGFueSBvdGhlciBhcmd1bWVudHMgdG8gcGFzcyB0byBmblxuICogQHJldHVybnMgeyp9IHRoZSByZXR1cm4gdmFsdWUgb2YgZm5cbiAqIEBleGFtcGxlXG4gKiB2YXIgaGVscGVyID0gcmVxdWlyZSgnLi9leGVjdXRlQ2xpZW50U2lkZVNlbGVjdG9yJyk7XG4gKiAvLyBFeGVjdXRlIGluIHRoZSBicm93c2VyXG4gKiBoZWxwZXIoZm4sIFsneHBhdGgnLCAnLy9ib2R5JywgJ2NzcycsICdbaWQ9XCJ3aGF0XCJdJ10sIFsxLCAyLCAzXSk7XG4gKiAvLyBBc3N1bWluZyBmbiBpcy4uLlxuICogZm4gPSBmdW5jdGlvbih4cGF0aFJlc3VsdCwgY3NzUmVzdWx0LCBvbmUsIHR3bywgdGhyZWUpIHtcbiAqICAgICBjb25zb2xlLmxvZyh4cGF0aFJlc3VsdC5sZW5ndGgpOyAvLyAxXG4gKiAgICAgY29uc29sZS5sb2coeHBhdGhSZXN1bHRbMF0pOyAgICAgLy8gPGJvZHkuLi4vPlxuICogICAgIGNvbnNvbGUubG9nKGNzc1Jlc3VsdC5sZW5ndGgpOyAgIC8vIDBcbiAqICAgICBjb25zb2xlLmxvZyhvbmUsIHR3bywgdGhyZWUpOyAgICAvLyAxIDIgM1xuICogfVxuICovXG52YXIgZXhlY3V0ZUNsaWVudFNpZGUgPSBmdW5jdGlvbiAoZm4sIHNBcnIsIGFyZ3MpIHtcbiAgICB2YXIgY2IgPSBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdLFxuICAgICAgICBpID0gMCwgc0FyZ3MgPSBbXSxcbiAgICAgICAgdXNlLCB2YWx1ZSwgeHAsIGNzLCB0bixcbiAgICAgICAgcmVzLCBqLCBhcmc7XG5cbiAgICBpZiAodHlwZW9mIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwgPSBmdW5jdGlvbihzZWxlY3Rvcikge1xuICAgICAgICAgICAgdmFyIGRvYyA9IGRvY3VtZW50LFxuICAgICAgICAgICAgICAgIGhlYWQgPSBkb2MuZG9jdW1lbnRFbGVtZW50LmZpcnN0Q2hpbGQsXG4gICAgICAgICAgICAgICAgc3R5bGVUYWcgPSBkb2MuY3JlYXRlRWxlbWVudCgnU1RZTEUnKTtcbiAgICAgICAgICAgIGhlYWQuYXBwZW5kQ2hpbGQoc3R5bGVUYWcpO1xuICAgICAgICAgICAgZG9jLl9fcXNhZWxzID0gW107XG5cbiAgICAgICAgICAgIHN0eWxlVGFnLnN0eWxlU2hlZXQuY3NzVGV4dCA9IHNlbGVjdG9yICsgJ3t4OmV4cHJlc3Npb24oZG9jdW1lbnQuX19xc2FlbHMucHVzaCh0aGlzKSl9JztcbiAgICAgICAgICAgIHdpbmRvdy5zY3JvbGxCeSgwLCAwKTtcblxuICAgICAgICAgICAgcmV0dXJuIGRvYy5fX3FzYWVscztcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICB3aGlsZSAoKHVzZSA9IHNBcnJbaSsrXSkgJiYgKHZhbHVlID0gc0FycltpKytdKSkge1xuICAgICAgICBhcmcgPSBbXTtcbiAgICAgICAgeHAgPSBjcyA9IHRuID0gbnVsbDtcbiAgICAgICAgc3dpdGNoICh1c2UpIHtcbiAgICAgICAgICAgIGNhc2UgJ3BhcnRpYWwgbGluayB0ZXh0JzpcbiAgICAgICAgICAgICAgICB4cCA9ICcvL2FbY29udGFpbnModGV4dCgpLFwiJyArIHZhbHVlICsgJ1wiKV0nO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbGluayB0ZXh0JzpcbiAgICAgICAgICAgICAgICB4cCA9ICcvL2FbdGV4dCgpPVwiJyArIHZhbHVlICsgJ1wiXSc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICd4cGF0aCc6XG4gICAgICAgICAgICAgICAgeHAgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2lkJzpcbiAgICAgICAgICAgICAgICBjcyA9ICcjJyArIHZhbHVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbmFtZSc6XG4gICAgICAgICAgICAgICAgY3MgPSAnW25hbWU9XCInICsgdmFsdWUgKyAnXCJdJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3RhZyBuYW1lJzpcbiAgICAgICAgICAgICAgICB0biA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnY3NzIHNlbGVjdG9yJzpcbiAgICAgICAgICAgICAgICBjcyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZXZhbHVhdGUgc2VsZWN0b3I6IEludmFsaWQgc3RyYXRlZ3kgJyArIHVzZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoeHApIHtcbiAgICAgICAgICAgIHJlcyA9IGRvY3VtZW50LmV2YWx1YXRlKHhwLCBkb2N1bWVudCwgbnVsbCwgMCwgbnVsbCk7XG5cbiAgICAgICAgICAgIHZhbHVlID0gcmVzLml0ZXJhdGVOZXh0KCk7XG4gICAgICAgICAgICB3aGlsZSAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBhcmcucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSByZXMuaXRlcmF0ZU5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0biB8fCBjcykge1xuICAgICAgICAgICAgcmVzID0gdG4gPyBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSh0bikgOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGNzKTtcbiAgICAgICAgICAgIGZvcihqID0gMDsgaiA8IHJlcy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgICAgIGFyZy5wdXNoKHJlc1tqXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc0FyZ3MucHVzaChhcmcpO1xuICAgIH1cblxuICAgIHZhciBwYXJhbWV0ZXIgPSBhcmdzICYmIHNBcmdzLmNvbmNhdChhcmdzKSB8fCBzQXJncztcbiAgICBpZihwYXJhbWV0ZXIubGVuZ3RoID09PSAwIHx8IChwYXJhbWV0ZXIubGVuZ3RoID09PSAxICYmIHBhcmFtZXRlclswXS5sZW5ndGggPT09IDApKSB7XG4gICAgICAgIGlmKHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIGNiKCdOb1N1Y2hFbGVtZW50JykgJiYgbmV3IEVycm9yKCdOb1N1Y2hFbGVtZW50Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBFcnJvcignTm9TdWNoRWxlbWVudCcpO1xuICAgIH1cblxuICAgIHBhcmFtZXRlci5wdXNoKGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoIC0gMV0pO1xuXG4gICAgcmV0dXJuIGZuLmFwcGx5KHdpbmRvdywgcGFyYW1ldGVyKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZVNlbGVjdG9yU2NyaXB0XG4iXX0=