appium-doctor
Version:
Test environment for fitness to run Appium
554 lines (436 loc) • 27.3 kB
JavaScript
var _get = require('babel-runtime/helpers/get')['default'];
var _inherits = require('babel-runtime/helpers/inherits')['default'];
var _classCallCheck = require('babel-runtime/helpers/class-call-check')['default'];
var _createClass = require('babel-runtime/helpers/create-class')['default'];
var _regeneratorRuntime = require('babel-runtime/regenerator')['default'];
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
});
require('colors');
var _lodash = require('lodash');
var _lodash2 = _interopRequireDefault(_lodash);
var _logger = require('./logger');
var _logger2 = _interopRequireDefault(_logger);
var _packageJson = require('../../package.json');
// eslint-disable-line import/no-unresolved
var FixSkippedError = (function (_Error) {
_inherits(FixSkippedError, _Error);
function FixSkippedError() {
_classCallCheck(this, FixSkippedError);
_get(Object.getPrototypeOf(FixSkippedError.prototype), 'constructor', this).apply(this, arguments);
}
return FixSkippedError;
})(Error);
var DoctorCheck = (function () {
function DoctorCheck() {
var opts = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
_classCallCheck(this, DoctorCheck);
this.autofix = !!opts.autofix;
}
_createClass(DoctorCheck, [{
key: 'diagnose',
value: function diagnose() {
throw new Error('Not Implemented!');
}
}, {
key: 'fix',
value: function fix() {
// return string for manual fixes.
throw new Error('Not Implemented!');
}
}]);
return DoctorCheck;
})();
var Doctor = (function () {
function Doctor() {
_classCallCheck(this, Doctor);
this.checks = [];
this.toFix = [];
}
_createClass(Doctor, [{
key: 'register',
value: function register(checks) {
checks = Array.isArray(checks) ? checks : [checks];
this.checks = this.checks.concat(checks);
}
}, {
key: 'diagnose',
value: function diagnose() {
var _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, check, res, errorMessage, fixMessage;
return _regeneratorRuntime.async(function diagnose$(context$2$0) {
while (1) switch (context$2$0.prev = context$2$0.next) {
case 0:
_logger2['default'].info('### Diagnostic starting ###');
this.toFix = [];
_iteratorNormalCompletion = true;
_didIteratorError = false;
_iteratorError = undefined;
context$2$0.prev = 5;
_iterator = _getIterator(this.checks);
case 7:
if (_iteratorNormalCompletion = (_step = _iterator.next()).done) {
context$2$0.next = 16;
break;
}
check = _step.value;
context$2$0.next = 11;
return _regeneratorRuntime.awrap(check.diagnose());
case 11:
res = context$2$0.sent;
if (res.ok) {
_logger2['default'].info(' ' + '✔'.green + ' ' + res.message);
} else {
errorMessage = ' ' + '✖'.red + ' ' + res.message;
_logger2['default'].warn(errorMessage);
this.toFix.push({
error: errorMessage,
check: check
});
}
case 13:
_iteratorNormalCompletion = true;
context$2$0.next = 7;
break;
case 16:
context$2$0.next = 22;
break;
case 18:
context$2$0.prev = 18;
context$2$0.t0 = context$2$0['catch'](5);
_didIteratorError = true;
_iteratorError = context$2$0.t0;
case 22:
context$2$0.prev = 22;
context$2$0.prev = 23;
if (!_iteratorNormalCompletion && _iterator['return']) {
_iterator['return']();
}
case 25:
context$2$0.prev = 25;
if (!_didIteratorError) {
context$2$0.next = 28;
break;
}
throw _iteratorError;
case 28:
return context$2$0.finish(25);
case 29:
return context$2$0.finish(22);
case 30:
fixMessage = undefined;
context$2$0.t1 = this.toFix.length;
context$2$0.next = context$2$0.t1 === 0 ? 34 : context$2$0.t1 === 1 ? 36 : 38;
break;
case 34:
fixMessage = 'no fix needed';
return context$2$0.abrupt('break', 39);
case 36:
fixMessage = 'one fix needed';
return context$2$0.abrupt('break', 39);
case 38:
fixMessage = this.toFix.length + ' fixes needed';
case 39:
_logger2['default'].info('### Diagnostic completed, ' + fixMessage + '. ###');
_logger2['default'].info('');
case 41:
case 'end':
return context$2$0.stop();
}
}, null, this, [[5, 18, 22, 30], [23,, 25, 29]]);
}
}, {
key: 'reportSuccess',
value: function reportSuccess() {
return _regeneratorRuntime.async(function reportSuccess$(context$2$0) {
while (1) switch (context$2$0.prev = context$2$0.next) {
case 0:
if (!(this.toFix.length === 0)) {
context$2$0.next = 6;
break;
}
_logger2['default'].info('Everything looks good, bye!');
_logger2['default'].info('');
return context$2$0.abrupt('return', true);
case 6:
return context$2$0.abrupt('return', false);
case 7:
case 'end':
return context$2$0.stop();
}
}, null, this);
}
}, {
key: 'reportManualFixes',
value: function reportManualFixes() {
var manualFixes, fixMessages, _iteratorNormalCompletion2, _didIteratorError2, _iteratorError2, _iterator2, _step2, f, _iteratorNormalCompletion3, _didIteratorError3, _iteratorError3, _iterator3, _step3, m;
return _regeneratorRuntime.async(function reportManualFixes$(context$2$0) {
while (1) switch (context$2$0.prev = context$2$0.next) {
case 0:
manualFixes = _lodash2['default'].filter(this.toFix, function (f) {
return !f.check.autofix;
});
if (!(manualFixes.length > 0)) {
context$2$0.next = 60;
break;
}
_logger2['default'].info('### Manual Fixes Needed ###');
_logger2['default'].info('The configuration cannot be automatically fixed, please do the following first:');
// for manual fixes, the fix method always return a string
fixMessages = [];
_iteratorNormalCompletion2 = true;
_didIteratorError2 = false;
_iteratorError2 = undefined;
context$2$0.prev = 8;
_iterator2 = _getIterator(manualFixes);
case 10:
if (_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done) {
context$2$0.next = 20;
break;
}
f = _step2.value;
context$2$0.t0 = fixMessages;
context$2$0.next = 15;
return _regeneratorRuntime.awrap(f.check.fix());
case 15:
context$2$0.t1 = context$2$0.sent;
context$2$0.t0.push.call(context$2$0.t0, context$2$0.t1);
case 17:
_iteratorNormalCompletion2 = true;
context$2$0.next = 10;
break;
case 20:
context$2$0.next = 26;
break;
case 22:
context$2$0.prev = 22;
context$2$0.t2 = context$2$0['catch'](8);
_didIteratorError2 = true;
_iteratorError2 = context$2$0.t2;
case 26:
context$2$0.prev = 26;
context$2$0.prev = 27;
if (!_iteratorNormalCompletion2 && _iterator2['return']) {
_iterator2['return']();
}
case 29:
context$2$0.prev = 29;
if (!_didIteratorError2) {
context$2$0.next = 32;
break;
}
throw _iteratorError2;
case 32:
return context$2$0.finish(29);
case 33:
return context$2$0.finish(26);
case 34:
_iteratorNormalCompletion3 = true;
_didIteratorError3 = false;
_iteratorError3 = undefined;
context$2$0.prev = 37;
for (_iterator3 = _getIterator(_lodash2['default'].uniq(fixMessages)); !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
m = _step3.value;
_logger2['default'].warn('- ' + m);
}
context$2$0.next = 45;
break;
case 41:
context$2$0.prev = 41;
context$2$0.t3 = context$2$0['catch'](37);
_didIteratorError3 = true;
_iteratorError3 = context$2$0.t3;
case 45:
context$2$0.prev = 45;
context$2$0.prev = 46;
if (!_iteratorNormalCompletion3 && _iterator3['return']) {
_iterator3['return']();
}
case 48:
context$2$0.prev = 48;
if (!_didIteratorError3) {
context$2$0.next = 51;
break;
}
throw _iteratorError3;
case 51:
return context$2$0.finish(48);
case 52:
return context$2$0.finish(45);
case 53:
_logger2['default'].info('###');
_logger2['default'].info('');
_logger2['default'].info('Bye! Run appium-doctor again when all manual fixes have been applied!');
_logger2['default'].info('');
return context$2$0.abrupt('return', true);
case 60:
return context$2$0.abrupt('return', false);
case 61:
case 'end':
return context$2$0.stop();
}
}, null, this, [[8, 22, 26, 34], [27,, 29, 33], [37, 41, 45, 53], [46,, 48, 52]]);
}
}, {
key: 'runAutoFix',
value: function runAutoFix(f) {
var res;
return _regeneratorRuntime.async(function runAutoFix$(context$2$0) {
while (1) switch (context$2$0.prev = context$2$0.next) {
case 0:
_logger2['default'].info('### Fixing: ' + f.error + ' ###');
context$2$0.prev = 1;
context$2$0.next = 4;
return _regeneratorRuntime.awrap(f.check.fix());
case 4:
context$2$0.next = 16;
break;
case 6:
context$2$0.prev = 6;
context$2$0.t0 = context$2$0['catch'](1);
if (!(context$2$0.t0 instanceof FixSkippedError)) {
context$2$0.next = 13;
break;
}
_logger2['default'].info('### Skipped fix ###');
return context$2$0.abrupt('return');
case 13:
_logger2['default'].warn(('' + context$2$0.t0).replace(/\n$/g, ''));
_logger2['default'].info('### Fix did not succeed ###');
return context$2$0.abrupt('return');
case 16:
_logger2['default'].info('Checking if this was fixed:');
context$2$0.next = 19;
return _regeneratorRuntime.awrap(f.check.diagnose());
case 19:
res = context$2$0.sent;
if (res.ok) {
f.fixed = true;
_logger2['default'].info(' ' + '✔'.green + ' ' + res.message);
_logger2['default'].info('### Fix was successfully applied ###');
} else {
_logger2['default'].info(' ' + '✖'.red + ' ' + res.message);
_logger2['default'].info('### Fix was applied but issue remains ###');
}
case 21:
case 'end':
return context$2$0.stop();
}
}, null, this, [[1, 6]]);
}
}, {
key: 'runAutoFixes',
value: function runAutoFixes() {
var autoFixes, _iteratorNormalCompletion4, _didIteratorError4, _iteratorError4, _iterator4, _step4, f;
return _regeneratorRuntime.async(function runAutoFixes$(context$2$0) {
while (1) switch (context$2$0.prev = context$2$0.next) {
case 0:
autoFixes = _lodash2['default'].filter(this.toFix, function (f) {
return f.check.autofix;
});
_iteratorNormalCompletion4 = true;
_didIteratorError4 = false;
_iteratorError4 = undefined;
context$2$0.prev = 4;
_iterator4 = _getIterator(autoFixes);
case 6:
if (_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done) {
context$2$0.next = 14;
break;
}
f = _step4.value;
context$2$0.next = 10;
return _regeneratorRuntime.awrap(this.runAutoFix(f));
case 10:
_logger2['default'].info('');
case 11:
_iteratorNormalCompletion4 = true;
context$2$0.next = 6;
break;
case 14:
context$2$0.next = 20;
break;
case 16:
context$2$0.prev = 16;
context$2$0.t0 = context$2$0['catch'](4);
_didIteratorError4 = true;
_iteratorError4 = context$2$0.t0;
case 20:
context$2$0.prev = 20;
context$2$0.prev = 21;
if (!_iteratorNormalCompletion4 && _iterator4['return']) {
_iterator4['return']();
}
case 23:
context$2$0.prev = 23;
if (!_didIteratorError4) {
context$2$0.next = 26;
break;
}
throw _iteratorError4;
case 26:
return context$2$0.finish(23);
case 27:
return context$2$0.finish(20);
case 28:
if (_lodash2['default'].find(autoFixes, function (f) {
return !f.fixed;
})) {
// a few issues remain.
_logger2['default'].info('Bye! A few issues remain, fix manually and/or rerun appium-doctor!');
} else {
// nothing left to fix.
_logger2['default'].info('Bye! All issues have been fixed!');
}
_logger2['default'].info('');
case 30:
case 'end':
return context$2$0.stop();
}
}, null, this, [[4, 16, 20, 28], [21,, 23, 27]]);
}
}, {
key: 'run',
value: function run() {
return _regeneratorRuntime.async(function run$(context$2$0) {
while (1) switch (context$2$0.prev = context$2$0.next) {
case 0:
_logger2['default'].info('Appium Doctor v.' + _packageJson.version);
context$2$0.next = 3;
return _regeneratorRuntime.awrap(this.diagnose());
case 3:
context$2$0.next = 5;
return _regeneratorRuntime.awrap(this.reportSuccess());
case 5:
if (!context$2$0.sent) {
context$2$0.next = 7;
break;
}
return context$2$0.abrupt('return');
case 7:
context$2$0.next = 9;
return _regeneratorRuntime.awrap(this.reportManualFixes());
case 9:
if (!context$2$0.sent) {
context$2$0.next = 11;
break;
}
return context$2$0.abrupt('return');
case 11:
context$2$0.next = 13;
return _regeneratorRuntime.awrap(this.runAutoFixes());
case 13:
case 'end':
return context$2$0.stop();
}
}, null, this);
}
}]);
return Doctor;
})();
exports.Doctor = Doctor;
exports.DoctorCheck = DoctorCheck;
exports.FixSkippedError = FixSkippedError;
//# sourceMappingURL=data:application/json;charset=utf8;base64,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QyxDQUFDLENBQUMsS0FBSyxDQUFDO2FBQUUsQ0FBQyxFQUFFOztBQUVsRCxrQ0FBSSxJQUFJLENBQUMsb0VBQW9FLENBQUMsQ0FBQzthQUNoRixNQUFNOztBQUVMLGtDQUFJLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO2FBQzlDO0FBQ0QsZ0NBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDOzs7Ozs7O0tBQ2Q7OztXQUVTOzs7O0FBQ1IsZ0NBQUksSUFBSSwyQ0FBOEIsQ0FBQzs7NkNBQ2pDLElBQUksQ0FBQyxRQUFRLEVBQUU7Ozs7NkNBQ1gsSUFBSSxDQUFDLGFBQWEsRUFBRTs7Ozs7Ozs7Ozs7OzZDQUdwQixJQUFJLENBQUMsaUJBQWlCLEVBQUU7Ozs7Ozs7Ozs7Ozs2Q0FHNUIsSUFBSSxDQUFDLFlBQVksRUFBRTs7Ozs7OztLQUMxQjs7O1NBL0hHLE1BQU07OztRQWtJSCxNQUFNLEdBQU4sTUFBTTtRQUFFLFdBQVcsR0FBWCxXQUFXO1FBQUUsZUFBZSxHQUFmLGVBQWUiLCJmaWxlIjoibGliL2RvY3Rvci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnY29sb3JzJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tICcuLi8uLi9wYWNrYWdlLmpzb24nOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGltcG9ydC9uby11bnJlc29sdmVkXG5cblxuY2xhc3MgRml4U2tpcHBlZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xufVxuXG5jbGFzcyBEb2N0b3JDaGVjayB7XG4gIGNvbnN0cnVjdG9yIChvcHRzPXt9KSB7XG4gICAgdGhpcy5hdXRvZml4ID0gISFvcHRzLmF1dG9maXg7XG4gIH1cblxuICBkaWFnbm9zZSAoKSB7IHRocm93IG5ldyBFcnJvcignTm90IEltcGxlbWVudGVkIScpOyB9XG5cbiAgZml4ICgpIHtcbiAgICAvLyByZXR1cm4gc3RyaW5nIGZvciBtYW51YWwgZml4ZXMuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgSW1wbGVtZW50ZWQhJyk7XG4gIH1cbn1cblxuY2xhc3MgRG9jdG9yIHtcbiAgY29uc3RydWN0b3IgKCkge1xuICAgIHRoaXMuY2hlY2tzID0gW107XG4gICAgdGhpcy50b0ZpeCA9IFtdO1xuICB9XG5cbiAgcmVnaXN0ZXIgKGNoZWNrcykge1xuICAgIGNoZWNrcyA9IEFycmF5LmlzQXJyYXkoY2hlY2tzKSA/IGNoZWNrcyA6IFtjaGVja3NdO1xuICAgIHRoaXMuY2hlY2tzID0gdGhpcy5jaGVja3MuY29uY2F0KGNoZWNrcyk7XG4gIH1cblxuICBhc3luYyBkaWFnbm9zZSAoKSB7XG4gICAgbG9nLmluZm8oJyMjIyBEaWFnbm9zdGljIHN0YXJ0aW5nICMjIycpO1xuICAgIHRoaXMudG9GaXggPSBbXTtcbiAgICBmb3IgKGxldCBjaGVjayBvZiB0aGlzLmNoZWNrcykge1xuICAgICAgbGV0IHJlcyA9IGF3YWl0IGNoZWNrLmRpYWdub3NlKCk7XG4gICAgICBpZiAocmVzLm9rKSB7XG4gICAgICAgIGxvZy5pbmZvKGAgJHsnXFx1MjcxNCcuZ3JlZW59ICR7cmVzLm1lc3NhZ2V9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgZXJyb3JNZXNzYWdlID0gYCAkeydcXHUyNzE2Jy5yZWR9ICR7cmVzLm1lc3NhZ2V9YDtcbiAgICAgICAgbG9nLndhcm4oZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgdGhpcy50b0ZpeC5wdXNoKHtcbiAgICAgICAgICBlcnJvcjogZXJyb3JNZXNzYWdlLFxuICAgICAgICAgIGNoZWNrXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBsZXQgZml4TWVzc2FnZTtcbiAgICBzd2l0Y2ggKHRoaXMudG9GaXgubGVuZ3RoKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIGZpeE1lc3NhZ2UgPSAnbm8gZml4IG5lZWRlZCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxOlxuICAgICAgICBmaXhNZXNzYWdlID0gJ29uZSBmaXggbmVlZGVkJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBmaXhNZXNzYWdlID0gYCR7dGhpcy50b0ZpeC5sZW5ndGh9IGZpeGVzIG5lZWRlZGA7XG4gICAgfVxuICAgIGxvZy5pbmZvKGAjIyMgRGlhZ25vc3RpYyBjb21wbGV0ZWQsICR7Zml4TWVzc2FnZX0uICMjI2ApO1xuICAgIGxvZy5pbmZvKCcnKTtcbiAgfVxuXG4gIGFzeW5jIHJlcG9ydFN1Y2Nlc3MgKCkge1xuICAgIGlmICh0aGlzLnRvRml4Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgbG9nLmluZm8oJ0V2ZXJ5dGhpbmcgbG9va3MgZ29vZCwgYnllIScpO1xuICAgICAgbG9nLmluZm8oJycpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyByZXBvcnRNYW51YWxGaXhlcyAoKSB7XG4gICAgbGV0IG1hbnVhbEZpeGVzID0gXy5maWx0ZXIodGhpcy50b0ZpeCwgKGYpID0+IHtyZXR1cm4gIWYuY2hlY2suYXV0b2ZpeDt9KTtcbiAgICBpZiAobWFudWFsRml4ZXMubGVuZ3RoID4wKSB7XG4gICAgICBsb2cuaW5mbygnIyMjIE1hbnVhbCBGaXhlcyBOZWVkZWQgIyMjJyk7XG4gICAgICBsb2cuaW5mbygnVGhlIGNvbmZpZ3VyYXRpb24gY2Fubm90IGJlIGF1dG9tYXRpY2FsbHkgZml4ZWQsIHBsZWFzZSBkbyB0aGUgZm9sbG93aW5nIGZpcnN0OicpO1xuICAgICAgLy8gZm9yIG1hbnVhbCBmaXhlcywgdGhlIGZpeCBtZXRob2QgYWx3YXlzIHJldHVybiBhIHN0cmluZ1xuICAgICAgbGV0IGZpeE1lc3NhZ2VzID0gW107XG4gICAgICBmb3IgKGxldCBmIG9mIG1hbnVhbEZpeGVzKSB7XG4gICAgICAgIGZpeE1lc3NhZ2VzLnB1c2goYXdhaXQgZi5jaGVjay5maXgoKSk7XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBtIG9mIF8udW5pcShmaXhNZXNzYWdlcykpIHtcbiAgICAgICAgbG9nLndhcm4oYC0gJHttfWApO1xuICAgICAgfVxuICAgICAgbG9nLmluZm8oJyMjIycpO1xuICAgICAgbG9nLmluZm8oJycpO1xuICAgICAgbG9nLmluZm8oJ0J5ZSEgUnVuIGFwcGl1bS1kb2N0b3IgYWdhaW4gd2hlbiBhbGwgbWFudWFsIGZpeGVzIGhhdmUgYmVlbiBhcHBsaWVkIScpO1xuICAgICAgbG9nLmluZm8oJycpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBydW5BdXRvRml4IChmKSB7XG4gICAgbG9nLmluZm8oYCMjIyBGaXhpbmc6ICR7Zi5lcnJvcn0gIyMjYCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGYuY2hlY2suZml4KCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgRml4U2tpcHBlZEVycm9yKSB7XG4gICAgICAgIGxvZy5pbmZvKGAjIyMgU2tpcHBlZCBmaXggIyMjYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZy53YXJuKGAke2Vycn1gLnJlcGxhY2UoL1xcbiQvZywgJycpKTtcbiAgICAgICAgbG9nLmluZm8oYCMjIyBGaXggZGlkIG5vdCBzdWNjZWVkICMjI2ApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGxvZy5pbmZvKCdDaGVja2luZyBpZiB0aGlzIHdhcyBmaXhlZDonKTtcbiAgICBsZXQgcmVzID0gYXdhaXQgZi5jaGVjay5kaWFnbm9zZSgpO1xuICAgIGlmIChyZXMub2spIHtcbiAgICAgIGYuZml4ZWQgPSB0cnVlO1xuICAgICAgbG9nLmluZm8oYCAkeydcXHUyNzE0Jy5ncmVlbn0gJHtyZXMubWVzc2FnZX1gKTtcbiAgICAgIGxvZy5pbmZvKGAjIyMgRml4IHdhcyBzdWNjZXNzZnVsbHkgYXBwbGllZCAjIyNgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmluZm8oYCAkeydcXHUyNzE2Jy5yZWR9ICR7cmVzLm1lc3NhZ2V9YCk7XG4gICAgICBsb2cuaW5mbyhgIyMjIEZpeCB3YXMgYXBwbGllZCBidXQgaXNzdWUgcmVtYWlucyAjIyNgKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBydW5BdXRvRml4ZXMgKCkge1xuICAgIGxldCBhdXRvRml4ZXMgPSBfLmZpbHRlcih0aGlzLnRvRml4LCAoZikgPT4ge3JldHVybiBmLmNoZWNrLmF1dG9maXg7fSk7XG4gICAgZm9yIChsZXQgZiBvZiBhdXRvRml4ZXMpIHtcbiAgICAgIGF3YWl0IHRoaXMucnVuQXV0b0ZpeChmKTtcbiAgICAgIGxvZy5pbmZvKCcnKTtcbiAgICB9XG4gICAgaWYgKF8uZmluZChhdXRvRml4ZXMsIChmKSA9PiB7IHJldHVybiAhZi5maXhlZDsgfSkpIHtcbiAgICAgIC8vIGEgZmV3IGlzc3VlcyByZW1haW4uXG4gICAgICBsb2cuaW5mbygnQnllISBBIGZldyBpc3N1ZXMgcmVtYWluLCBmaXggbWFudWFsbHkgYW5kL29yIHJlcnVuIGFwcGl1bS1kb2N0b3IhJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG5vdGhpbmcgbGVmdCB0byBmaXguXG4gICAgICBsb2cuaW5mbygnQnllISBBbGwgaXNzdWVzIGhhdmUgYmVlbiBmaXhlZCEnKTtcbiAgICB9XG4gICAgbG9nLmluZm8oJycpO1xuICB9XG5cbiAgYXN5bmMgcnVuICgpIHtcbiAgICBsb2cuaW5mbyhgQXBwaXVtIERvY3RvciB2LiR7dmVyc2lvbn1gKTtcbiAgICBhd2FpdCB0aGlzLmRpYWdub3NlKCk7XG4gICAgaWYgKGF3YWl0IHRoaXMucmVwb3J0U3VjY2VzcygpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChhd2FpdCB0aGlzLnJlcG9ydE1hbnVhbEZpeGVzKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5ydW5BdXRvRml4ZXMoKTtcbiAgfVxufVxuXG5leHBvcnQgeyBEb2N0b3IsIERvY3RvckNoZWNrLCBGaXhTa2lwcGVkRXJyb3IgfTtcbiJdLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
;