webdriverio-automation
Version:
WebdriverIO-Automation android ios project
211 lines (167 loc) • 27.9 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _logger = _interopRequireDefault(require("./logger"));
var _lodash = _interopRequireDefault(require("lodash"));
class RpcMessageHandler {
constructor(specialHandlers) {
this.setHandlers();
this.errorHandlers = {};
this.specialHandlers = _lodash.default.clone(specialHandlers);
this.dataHandlers = {};
this.willNavigateWithoutReload = false;
}
setDataMessageHandler(key, errorHandler, handler) {
this.errorHandlers[key] = errorHandler;
this.dataHandlers[key] = handler;
}
setSpecialMessageHandler(key, errorHandler, handler) {
this.errorHandlers[key] = errorHandler;
this.specialHandlers[key] = handler;
}
getSpecialMessageHandler(key) {
return this.specialHandlers[key];
}
setTimelineEventHandler(timelineEventHandler) {
this.timelineEventHandler = timelineEventHandler;
}
setConsoleLogEventHandler(consoleLogEventHandler) {
this.consoleLogEventHandler = consoleLogEventHandler;
}
setNetworkEventHandler(networkLogEventHandler) {
this.networkLogEventHandler = networkLogEventHandler;
}
hasErrorHandler(key) {
return _lodash.default.has(this.errorHandlers, key);
}
hasSpecialMessageHandler(key) {
return _lodash.default.has(this.specialHandlers, key);
}
allowNavigationWithoutReload(allow = true) {
this.willNavigateWithoutReload = allow;
}
handleMessage(plist) {
let handlerFor = plist.__selector;
if (!handlerFor) {
_logger.default.debug('Got an invalid plist');
return;
}
if (_lodash.default.has(this.handlers, handlerFor)) {
this.handlers[handlerFor](plist);
} else {
_logger.default.debug(`Debugger got a message for '${handlerFor}' and have no ` + `handler, doing nothing.`);
}
}
handleSpecialMessage(handler, ...args) {
const fn = this.specialHandlers[handler];
if (fn) {
if (handler !== '_rpc_forwardGetListing:' && handler !== '_rpc_applicationDisconnected:' && handler !== '_rpc_applicationConnected:' && handler !== '_rpc_applicationUpdated:' && handler !== '_rpc_reportConnectedDriverList:') {
this.specialHandlers[handler] = null;
}
fn(...args);
} else {
_logger.default.warn(`Tried to access special message handler '${handler}' ` + `but none was found`);
}
}
parseDataKey(plist) {
try {
return JSON.parse(plist.__argument.WIRMessageDataKey.toString('utf8'));
} catch (err) {
_logger.default.error(`Unparseable message data: ${_lodash.default.truncate(JSON.stringify(plist), {
length: 100
})}`);
throw new Error(`Unable to parse message data: ${err.message}`);
}
}
handleDataMessage(plist) {
var _this = this;
return (0, _asyncToGenerator2.default)(function* () {
const dataKey = _this.parseDataKey(plist);
const msgId = (dataKey.id || '').toString();
let result = dataKey.result;
let error = dataKey.error || null;
if (result && result.wasThrown) {
let message = result.result && (result.result.value || result.result.description) ? result.result.value || result.result.description : 'Error occurred in handling data message';
error = new Error(message);
}
if (error) {
if (_this.hasErrorHandler(msgId)) {
_this.errorHandlers[msgId](error);
} else {
_logger.default.error(`Error occurred in handling data message: ${error}`);
_logger.default.error('No error handler present, ignoring');
}
return;
}
if (dataKey.method === 'Profiler.resetProfiles') {
_logger.default.debug('Device is telling us to reset profiles. Should probably ' + 'do some kind of callback here');
} else if (dataKey.method === 'Page.frameNavigated') {
if (!_this.willNavigateWithoutReload && !_this.pageLoading) {
_logger.default.debug('Frame navigated, unloading page');
if (_lodash.default.isFunction(_this.specialHandlers['Page.frameNavigated'])) {
_this.specialHandlers['Page.frameNavigated']('remote-debugger');
_this.specialHandlers['Page.frameNavigated'] = null;
}
} else {
_logger.default.debug('Frame navigated but we were warned about it, not ' + 'considering page state unloaded');
_this.willNavigateWithoutReload = false;
}
} else if (dataKey.method === 'Page.loadEventFired' && _lodash.default.isFunction(_this.specialHandlers.pageLoad)) {
yield _this.specialHandlers.pageLoad();
} else if (dataKey.method === 'Page.frameDetached' && _lodash.default.isFunction(_this.specialHandlers.frameDetached)) {
yield _this.specialHandlers.frameDetached();
} else if (dataKey.method === 'Timeline.eventRecorded' && _lodash.default.isFunction(_this.timelineEventHandler)) {
_this.timelineEventHandler(dataKey.params.record);
} else if (dataKey.method === 'Console.messageAdded' && _lodash.default.isFunction(_this.consoleLogEventHandler)) {
_this.consoleLogEventHandler(dataKey.params.message);
} else if (dataKey.method && dataKey.method.startsWith('Network.') && _lodash.default.isFunction(_this.networkLogEventHandler)) {
_this.networkLogEventHandler(dataKey.method, dataKey.params);
} else if (_lodash.default.isFunction(_this.dataHandlers[msgId])) {
_logger.default.debug('Found data handler for response');
if (result.result && result.result.value) {
result = result.result.value;
}
_this.dataHandlers[msgId](result);
_this.dataHandlers[msgId] = null;
} else if (_this.dataHandlers[msgId] === null) {
_logger.default.error(`Debugger returned data for message ${msgId} ` + `but we already ran that callback! WTF??`);
} else {
if (msgId || result || error) {
_logger.default.error(`Debugger returned data for message '${msgId}' ` + `but we were not waiting for that message! ` + `result: '${JSON.stringify(result)}'; ` + `error: '${error}'`);
}
}
})();
}
setHandlers() {
this.handlers = {
'_rpc_reportSetup:': plist => {
this.handleSpecialMessage('_rpc_reportIdentifier:', plist.__argument.WIRSimulatorNameKey, plist.__argument.WIRSimulatorBuildKey, plist.__argument.WIRSimulatorProductVersionKey);
},
'_rpc_reportConnectedApplicationList:': plist => {
this.handleSpecialMessage('_rpc_reportConnectedApplicationList:', plist.__argument.WIRApplicationDictionaryKey);
},
'_rpc_applicationSentListing:': plist => {
this.handleSpecialMessage('_rpc_forwardGetListing:', plist.__argument.WIRApplicationIdentifierKey, plist.__argument.WIRListingKey);
},
'_rpc_applicationConnected:': plist => {
this.handleSpecialMessage('_rpc_applicationConnected:', plist.__argument);
},
'_rpc_applicationDisconnected:': plist => {
this.handleSpecialMessage('_rpc_applicationDisconnected:', plist.__argument);
},
'_rpc_applicationUpdated:': plist => {
this.handleSpecialMessage('_rpc_applicationUpdated:', plist.__argument);
},
'_rpc_reportConnectedDriverList:': plist => {
this.handleSpecialMessage('_rpc_reportConnectedDriverList:', plist.__argument);
},
'_rpc_applicationSentData:': this.handleDataMessage.bind(this)
};
}
}
exports.default = RpcMessageHandler;require('source-map-support').install();
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9yZW1vdGUtZGVidWdnZXItbWVzc2FnZS1oYW5kbGVyLmpzIl0sIm5hbWVzIjpbIlJwY01lc3NhZ2VIYW5kbGVyIiwiY29uc3RydWN0b3IiLCJzcGVjaWFsSGFuZGxlcnMiLCJzZXRIYW5kbGVycyIsImVycm9ySGFuZGxlcnMiLCJfIiwiY2xvbmUiLCJkYXRhSGFuZGxlcnMiLCJ3aWxsTmF2aWdhdGVXaXRob3V0UmVsb2FkIiwic2V0RGF0YU1lc3NhZ2VIYW5kbGVyIiwia2V5IiwiZXJyb3JIYW5kbGVyIiwiaGFuZGxlciIsInNldFNwZWNpYWxNZXNzYWdlSGFuZGxlciIsImdldFNwZWNpYWxNZXNzYWdlSGFuZGxlciIsInNldFRpbWVsaW5lRXZlbnRIYW5kbGVyIiwidGltZWxpbmVFdmVudEhhbmRsZXIiLCJzZXRDb25zb2xlTG9nRXZlbnRIYW5kbGVyIiwiY29uc29sZUxvZ0V2ZW50SGFuZGxlciIsInNldE5ldHdvcmtFdmVudEhhbmRsZXIiLCJuZXR3b3JrTG9nRXZlbnRIYW5kbGVyIiwiaGFzRXJyb3JIYW5kbGVyIiwiaGFzIiwiaGFzU3BlY2lhbE1lc3NhZ2VIYW5kbGVyIiwiYWxsb3dOYXZpZ2F0aW9uV2l0aG91dFJlbG9hZCIsImFsbG93IiwiaGFuZGxlTWVzc2FnZSIsInBsaXN0IiwiaGFuZGxlckZvciIsIl9fc2VsZWN0b3IiLCJsb2ciLCJkZWJ1ZyIsImhhbmRsZXJzIiwiaGFuZGxlU3BlY2lhbE1lc3NhZ2UiLCJhcmdzIiwiZm4iLCJ3YXJuIiwicGFyc2VEYXRhS2V5IiwiSlNPTiIsInBhcnNlIiwiX19hcmd1bWVudCIsIldJUk1lc3NhZ2VEYXRhS2V5IiwidG9TdHJpbmciLCJlcnIiLCJlcnJvciIsInRydW5jYXRlIiwic3RyaW5naWZ5IiwibGVuZ3RoIiwiRXJyb3IiLCJtZXNzYWdlIiwiaGFuZGxlRGF0YU1lc3NhZ2UiLCJkYXRhS2V5IiwibXNnSWQiLCJpZCIsInJlc3VsdCIsIndhc1Rocm93biIsInZhbHVlIiwiZGVzY3JpcHRpb24iLCJtZXRob2QiLCJwYWdlTG9hZGluZyIsImlzRnVuY3Rpb24iLCJwYWdlTG9hZCIsImZyYW1lRGV0YWNoZWQiLCJwYXJhbXMiLCJyZWNvcmQiLCJzdGFydHNXaXRoIiwiV0lSU2ltdWxhdG9yTmFtZUtleSIsIldJUlNpbXVsYXRvckJ1aWxkS2V5IiwiV0lSU2ltdWxhdG9yUHJvZHVjdFZlcnNpb25LZXkiLCJXSVJBcHBsaWNhdGlvbkRpY3Rpb25hcnlLZXkiLCJXSVJBcHBsaWNhdGlvbklkZW50aWZpZXJLZXkiLCJXSVJMaXN0aW5nS2V5IiwiYmluZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFHZSxNQUFNQSxpQkFBTixDQUF3QjtBQUNyQ0MsRUFBQUEsV0FBVyxDQUFFQyxlQUFGLEVBQW1CO0FBQzVCLFNBQUtDLFdBQUw7QUFDQSxTQUFLQyxhQUFMLEdBQXFCLEVBQXJCO0FBQ0EsU0FBS0YsZUFBTCxHQUF1QkcsZ0JBQUVDLEtBQUYsQ0FBUUosZUFBUixDQUF2QjtBQUNBLFNBQUtLLFlBQUwsR0FBb0IsRUFBcEI7QUFDQSxTQUFLQyx5QkFBTCxHQUFpQyxLQUFqQztBQUNEOztBQUVEQyxFQUFBQSxxQkFBcUIsQ0FBRUMsR0FBRixFQUFPQyxZQUFQLEVBQXFCQyxPQUFyQixFQUE4QjtBQUNqRCxTQUFLUixhQUFMLENBQW1CTSxHQUFuQixJQUEwQkMsWUFBMUI7QUFDQSxTQUFLSixZQUFMLENBQWtCRyxHQUFsQixJQUF5QkUsT0FBekI7QUFDRDs7QUFFREMsRUFBQUEsd0JBQXdCLENBQUVILEdBQUYsRUFBT0MsWUFBUCxFQUFxQkMsT0FBckIsRUFBOEI7QUFDcEQsU0FBS1IsYUFBTCxDQUFtQk0sR0FBbkIsSUFBMEJDLFlBQTFCO0FBQ0EsU0FBS1QsZUFBTCxDQUFxQlEsR0FBckIsSUFBNEJFLE9BQTVCO0FBQ0Q7O0FBRURFLEVBQUFBLHdCQUF3QixDQUFFSixHQUFGLEVBQU87QUFDN0IsV0FBTyxLQUFLUixlQUFMLENBQXFCUSxHQUFyQixDQUFQO0FBQ0Q7O0FBRURL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NEIsSUFBNUI7QUFoQ2YsS0FBaEI7QUFrQ0Q7O0FBek1vQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcblxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBScGNNZXNzYWdlSGFuZGxlciB7XG4gIGNvbnN0cnVjdG9yIChzcGVjaWFsSGFuZGxlcnMpIHtcbiAgICB0aGlzLnNldEhhbmRsZXJzKCk7XG4gICAgdGhpcy5lcnJvckhhbmRsZXJzID0ge307XG4gICAgdGhpcy5zcGVjaWFsSGFuZGxlcnMgPSBfLmNsb25lKHNwZWNpYWxIYW5kbGVycyk7XG4gICAgdGhpcy5kYXRhSGFuZGxlcnMgPSB7fTtcbiAgICB0aGlzLndpbGxOYXZpZ2F0ZVdpdGhvdXRSZWxvYWQgPSBmYWxzZTtcbiAgfVxuXG4gIHNldERhdGFNZXNzYWdlSGFuZGxlciAoa2V5LCBlcnJvckhhbmRsZXIsIGhhbmRsZXIpIHtcbiAgICB0aGlzLmVycm9ySGFuZGxlcnNba2V5XSA9IGVycm9ySGFuZGxlcjtcbiAgICB0aGlzLmRhdGFIYW5kbGVyc1trZXldID0gaGFuZGxlcjtcbiAgfVxuXG4gIHNldFNwZWNpYWxNZXNzYWdlSGFuZGxlciAoa2V5LCBlcnJvckhhbmRsZXIsIGhhbmRsZXIpIHtcbiAgICB0aGlzLmVycm9ySGFuZGxlcnNba2V5XSA9IGVycm9ySGFuZGxlcjtcbiAgICB0aGlzLnNwZWNpYWxIYW5kbGVyc1trZXldID0gaGFuZGxlcjtcbiAgfVxuXG4gIGdldFNwZWNpYWxNZXNzYWdlSGFuZGxlciAoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuc3BlY2lhbEhhbmRsZXJzW2tleV07XG4gIH1cblxuICBzZXRUaW1lbGluZUV2ZW50SGFuZGxlciAodGltZWxpbmVFdmVudEhhbmRsZXIpIHtcbiAgICB0aGlzLnRpbWVsaW5lRXZlbnRIYW5kbGVyID0gdGltZWxpbmVFdmVudEhhbmRsZXI7XG4gIH1cblxuICBzZXRDb25zb2xlTG9nRXZlbnRIYW5kbGVyIChjb25zb2xlTG9nRXZlbnRIYW5kbGVyKSB7XG4gICAgdGhpcy5jb25zb2xlTG9nRXZlbnRIYW5kbGVyID0gY29uc29sZUxvZ0V2ZW50SGFuZGxlcjtcbiAgfVxuXG4gIHNldE5ldHdvcmtFdmVudEhhbmRsZXIgKG5ldHdvcmtMb2dFdmVudEhhbmRsZXIpIHtcbiAgICB0aGlzLm5ldHdvcmtMb2dFdmVudEhhbmRsZXIgPSBuZXR3b3JrTG9nRXZlbnRIYW5kbGVyO1xuICB9XG5cbiAgaGFzRXJyb3JIYW5kbGVyIChrZXkpIHtcbiAgICByZXR1cm4gXy5oYXModGhpcy5lcnJvckhhbmRsZXJzLCBrZXkpO1xuICB9XG5cbiAgaGFzU3BlY2lhbE1lc3NhZ2VIYW5kbGVyIChrZXkpIHtcbiAgICByZXR1cm4gXy5oYXModGhpcy5zcGVjaWFsSGFuZGxlcnMsIGtleSk7XG4gIH1cblxuICBhbGxvd05hdmlnYXRpb25XaXRob3V0UmVsb2FkIChhbGxvdyA9IHRydWUpIHtcbiAgICB0aGlzLndpbGxOYXZpZ2F0ZVdpdGhvdXRSZWxvYWQgPSBhbGxvdztcbiAgfVxuXG4gIGhhbmRsZU1lc3NhZ2UgKHBsaXN0KSB7XG4gICAgbGV0IGhhbmRsZXJGb3IgPSBwbGlzdC5fX3NlbGVjdG9yO1xuICAgIGlmICghaGFuZGxlckZvcikge1xuICAgICAgbG9nLmRlYnVnKCdHb3QgYW4gaW52YWxpZCBwbGlzdCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChfLmhhcyh0aGlzLmhhbmRsZXJzLCBoYW5kbGVyRm9yKSkge1xuICAgICAgdGhpcy5oYW5kbGVyc1toYW5kbGVyRm9yXShwbGlzdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy5kZWJ1ZyhgRGVidWdnZXIgZ290IGEgbWVzc2FnZSBmb3IgJyR7aGFuZGxlckZvcn0nIGFuZCBoYXZlIG5vIGAgK1xuICAgICAgICAgICAgICAgIGBoYW5kbGVyLCBkb2luZyBub3RoaW5nLmApO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZVNwZWNpYWxNZXNzYWdlIChoYW5kbGVyLCAuLi5hcmdzKSB7XG4gICAgY29uc3QgZm4gPSB0aGlzLnNwZWNpYWxIYW5kbGVyc1toYW5kbGVyXTtcblxuICAgIGlmIChmbikge1xuICAgICAgLy8gbW9zdCByZXNwb25zZXMgYXJlIG9ubHkgdG8gYmUgY2FsbGVkIG9uY2UsIHRoZW5cbiAgICAgIC8vIHJlbW92ZWQuIEJ1dCBub3QgdGhlIG9uZXMgYmVsb3csIHdoaWNoIGhhbmRsZVxuICAgICAgLy8gcGFnZSBjaGFuZ2UgYW5kIGFwcCBjb25uZWN0L2Rpc2Nvbm5lY3RcbiAgICAgIGlmIChoYW5kbGVyICE9PSAnX3JwY19mb3J3YXJkR2V0TGlzdGluZzonICYmXG4gICAgICAgICAgaGFuZGxlciAhPT0gJ19ycGNfYXBwbGljYXRpb25EaXNjb25uZWN0ZWQ6JyAmJlxuICAgICAgICAgIGhhbmRsZXIgIT09ICdfcnBjX2FwcGxpY2F0aW9uQ29ubmVjdGVkOicgJiZcbiAgICAgICAgICBoYW5kbGVyICE9PSAnX3JwY19hcHBsaWNhdGlvblVwZGF0ZWQ6JyAmJlxuICAgICAgICAgIGhhbmRsZXIgIT09ICdfcnBjX3JlcG9ydENvbm5lY3RlZERyaXZlckxpc3Q6Jykge1xuICAgICAgICB0aGlzLnNwZWNpYWxIYW5kbGVyc1toYW5kbGVyXSA9IG51bGw7XG4gICAgICB9XG4gICAgICBmbiguLi5hcmdzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLndhcm4oYFRyaWVkIHRvIGFjY2VzcyBzcGVjaWFsIG1lc3NhZ2UgaGFuZGxlciAnJHtoYW5kbGVyfScgYCArXG4gICAgICAgICAgICAgICBgYnV0IG5vbmUgd2FzIGZvdW5kYCk7XG4gICAgfVxuICB9XG5cbiAgcGFyc2VEYXRhS2V5IChwbGlzdCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShwbGlzdC5fX2FyZ3VtZW50LldJUk1lc3NhZ2VEYXRhS2V5LnRvU3RyaW5nKCd1dGY4JykpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nLmVycm9yKGBVbnBhcnNlYWJsZSBtZXNzYWdlIGRhdGE6ICR7Xy50cnVuY2F0ZShKU09OLnN0cmluZ2lmeShwbGlzdCksIHtsZW5ndGg6IDEwMH0pfWApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcGFyc2UgbWVzc2FnZSBkYXRhOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGhhbmRsZURhdGFNZXNzYWdlIChwbGlzdCkge1xuICAgIGNvbnN0IGRhdGFLZXkgPSB0aGlzLnBhcnNlRGF0YUtleShwbGlzdCk7XG4gICAgY29uc3QgbXNnSWQgPSAoZGF0YUtleS5pZCB8fCAnJykudG9TdHJpbmcoKTtcbiAgICBsZXQgcmVzdWx0ID0gZGF0YUtleS5yZXN1bHQ7XG4gICAgbGV0IGVycm9yID0gZGF0YUtleS5lcnJvciB8fCBudWxsO1xuXG4gICAgLy8gd2UgY2FuIGdldCBhbiBlcnJvciwgb3Igd2UgY2FuIGdldCBhIHJlc3BvbnNlIHRoYXQgaXMgYW4gZXJyb3JcbiAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC53YXNUaHJvd24pIHtcbiAgICAgIGxldCBtZXNzYWdlID0gKHJlc3VsdC5yZXN1bHQgJiYgKHJlc3VsdC5yZXN1bHQudmFsdWUgfHwgcmVzdWx0LnJlc3VsdC5kZXNjcmlwdGlvbikpXG4gICAgICAgID8gKHJlc3VsdC5yZXN1bHQudmFsdWUgfHwgcmVzdWx0LnJlc3VsdC5kZXNjcmlwdGlvbilcbiAgICAgICAgOiAnRXJyb3Igb2NjdXJyZWQgaW4gaGFuZGxpbmcgZGF0YSBtZXNzYWdlJztcbiAgICAgIGVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGlmIChlcnJvcikge1xuICAgICAgaWYgKHRoaXMuaGFzRXJyb3JIYW5kbGVyKG1zZ0lkKSkge1xuICAgICAgICB0aGlzLmVycm9ySGFuZGxlcnNbbXNnSWRdKGVycm9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZy5lcnJvcihgRXJyb3Igb2NjdXJyZWQgaW4gaGFuZGxpbmcgZGF0YSBtZXNzYWdlOiAke2Vycm9yfWApO1xuICAgICAgICBsb2cuZXJyb3IoJ05vIGVycm9yIGhhbmRsZXIgcHJlc2VudCwgaWdub3JpbmcnKTtcbiAgICAgIH1cblxuICAgICAgLy8gc2hvcnQgY2lyY3VpdFxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChkYXRhS2V5Lm1ldGhvZCA9PT0gJ1Byb2ZpbGVyLnJlc2V0UHJvZmlsZXMnKSB7XG4gICAgICBsb2cuZGVidWcoJ0RldmljZSBpcyB0ZWxsaW5nIHVzIHRvIHJlc2V0IHByb2ZpbGVzLiBTaG91bGQgcHJvYmFibHkgJyArXG4gICAgICAgICAgICAgICAgJ2RvIHNvbWUga2luZCBvZiBjYWxsYmFjayBoZXJlJyk7XG4gICAgfSBlbHNlIGlmIChkYXRhS2V5Lm1ldGhvZCA9PT0gJ1BhZ2UuZnJhbWVOYXZpZ2F0ZWQnKSB7XG4gICAgICBpZiAoIXRoaXMud2lsbE5hdmlnYXRlV2l0aG91dFJlbG9hZCAmJiAhdGhpcy5wYWdlTG9hZGluZykge1xuICAgICAgICBsb2cuZGVidWcoJ0ZyYW1lIG5hdmlnYXRlZCwgdW5sb2FkaW5nIHBhZ2UnKTtcbiAgICAgICAgaWYgKF8uaXNGdW5jdGlvbih0aGlzLnNwZWNpYWxIYW5kbGVyc1snUGFnZS5mcmFtZU5hdmlnYXRlZCddKSkge1xuICAgICAgICAgIHRoaXMuc3BlY2lhbEhhbmRsZXJzWydQYWdlLmZyYW1lTmF2aWdhdGVkJ10oJ3JlbW90ZS1kZWJ1Z2dlcicpO1xuICAgICAgICAgIHRoaXMuc3BlY2lhbEhhbmRsZXJzWydQYWdlLmZyYW1lTmF2aWdhdGVkJ10gPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2cuZGVidWcoJ0ZyYW1lIG5hdmlnYXRlZCBidXQgd2Ugd2VyZSB3YXJuZWQgYWJvdXQgaXQsIG5vdCAnICtcbiAgICAgICAgICAgICAgICAgICdjb25zaWRlcmluZyBwYWdlIHN0YXRlIHVubG9hZGVkJyk7XG4gICAgICAgIHRoaXMud2lsbE5hdmlnYXRlV2l0aG91dFJlbG9hZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGF0YUtleS5tZXRob2QgPT09ICdQYWdlLmxvYWRFdmVudEZpcmVkJyAmJiBfLmlzRnVuY3Rpb24odGhpcy5zcGVjaWFsSGFuZGxlcnMucGFnZUxvYWQpKSB7XG4gICAgICBhd2FpdCB0aGlzLnNwZWNpYWxIYW5kbGVycy5wYWdlTG9hZCgpO1xuICAgIH0gZWxzZSBpZiAoZGF0YUtleS5tZXRob2QgPT09ICdQYWdlLmZyYW1lRGV0YWNoZWQnICYmIF8uaXNGdW5jdGlvbih0aGlzLnNwZWNpYWxIYW5kbGVycy5mcmFtZURldGFjaGVkKSkge1xuICAgICAgYXdhaXQgdGhpcy5zcGVjaWFsSGFuZGxlcnMuZnJhbWVEZXRhY2hlZCgpO1xuICAgIH0gZWxzZSBpZiAoZGF0YUtleS5tZXRob2QgPT09ICdUaW1lbGluZS5ldmVudFJlY29yZGVkJyAmJiBfLmlzRnVuY3Rpb24odGhpcy50aW1lbGluZUV2ZW50SGFuZGxlcikpIHtcbiAgICAgIHRoaXMudGltZWxpbmVFdmVudEhhbmRsZXIoZGF0YUtleS5wYXJhbXMucmVjb3JkKTtcbiAgICB9IGVsc2UgaWYgKGRhdGFLZXkubWV0aG9kID09PSAnQ29uc29sZS5tZXNzYWdlQWRkZWQnICYmIF8uaXNGdW5jdGlvbih0aGlzLmNvbnNvbGVMb2dFdmVudEhhbmRsZXIpKSB7XG4gICAgICB0aGlzLmNvbnNvbGVMb2dFdmVudEhhbmRsZXIoZGF0YUtleS5wYXJhbXMubWVzc2FnZSk7XG4gICAgfSBlbHNlIGlmIChkYXRhS2V5Lm1ldGhvZCAmJiBkYXRhS2V5Lm1ldGhvZC5zdGFydHNXaXRoKCdOZXR3b3JrLicpICYmIF8uaXNGdW5jdGlvbih0aGlzLm5ldHdvcmtMb2dFdmVudEhhbmRsZXIpKSB7XG4gICAgICB0aGlzLm5ldHdvcmtMb2dFdmVudEhhbmRsZXIoZGF0YUtleS5tZXRob2QsIGRhdGFLZXkucGFyYW1zKTtcbiAgICB9IGVsc2UgaWYgKF8uaXNGdW5jdGlvbih0aGlzLmRhdGFIYW5kbGVyc1ttc2dJZF0pKSB7XG4gICAgICBsb2cuZGVidWcoJ0ZvdW5kIGRhdGEgaGFuZGxlciBmb3IgcmVzcG9uc2UnKTtcbiAgICAgIC8vIHdlIHdpbGwgZWl0aGVyIGdldCBiYWNrIGEgcmVzdWx0IG9iamVjdCB0aGF0IGhhcyBhIHJlc3VsdC52YWx1ZVxuICAgICAgLy8gaW4gd2hpY2ggY2FzZSB0aGF0IGlzIHdoYXQgd2Ugd2FudCxcbiAgICAgIC8vIG9yIGVsc2Ugd2UgcmV0dXJuIHRoZSB3aG9sZSB0aGluZ1xuICAgICAgaWYgKHJlc3VsdC5yZXN1bHQgJiYgcmVzdWx0LnJlc3VsdC52YWx1ZSkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQucmVzdWx0LnZhbHVlO1xuICAgICAgfVxuICAgICAgdGhpcy5kYXRhSGFuZGxlcnNbbXNnSWRdKHJlc3VsdCk7XG4gICAgICB0aGlzLmRhdGFIYW5kbGVyc1ttc2dJZF0gPSBudWxsO1xuICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhSGFuZGxlcnNbbXNnSWRdID09PSBudWxsKSB7XG4gICAgICBsb2cuZXJyb3IoYERlYnVnZ2VyIHJldHVybmVkIGRhdGEgZm9yIG1lc3NhZ2UgJHttc2dJZH0gYCArXG4gICAgICAgICAgICAgICAgYGJ1dCB3ZSBhbHJlYWR5IHJhbiB0aGF0IGNhbGxiYWNrISBXVEY/P2ApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobXNnSWQgfHwgcmVzdWx0IHx8IGVycm9yKSB7XG4gICAgICAgIGxvZy5lcnJvcihgRGVidWdnZXIgcmV0dXJuZWQgZGF0YSBmb3IgbWVzc2FnZSAnJHttc2dJZH0nIGAgK1xuICAgICAgICAgICAgICAgICAgYGJ1dCB3ZSB3ZXJlIG5vdCB3YWl0aW5nIGZvciB0aGF0IG1lc3NhZ2UhIGAgK1xuICAgICAgICAgICAgICAgICAgYHJlc3VsdDogJyR7SlNPTi5zdHJpbmdpZnkocmVzdWx0KX0nOyBgICtcbiAgICAgICAgICAgICAgICAgIGBlcnJvcjogJyR7ZXJyb3J9J2ApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNldEhhbmRsZXJzICgpIHtcbiAgICB0aGlzLmhhbmRsZXJzID0ge1xuICAgICAgJ19ycGNfcmVwb3J0U2V0dXA6JzogKHBsaXN0KSA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlU3BlY2lhbE1lc3NhZ2UoJ19ycGNfcmVwb3J0SWRlbnRpZmllcjonLFxuICAgICAgICAgICAgcGxpc3QuX19hcmd1bWVudC5XSVJTaW11bGF0b3JOYW1lS2V5LFxuICAgICAgICAgICAgcGxpc3QuX19hcmd1bWVudC5XSVJTaW11bGF0b3JCdWlsZEtleSxcbiAgICAgICAgICAgIHBsaXN0Ll9fYXJndW1lbnQuV0lSU2ltdWxhdG9yUHJvZHVjdFZlcnNpb25LZXkpO1xuICAgICAgfSxcbiAgICAgICdfcnBjX3JlcG9ydENvbm5lY3RlZEFwcGxpY2F0aW9uTGlzdDonOiAocGxpc3QpID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVTcGVjaWFsTWVzc2FnZSgnX3JwY19yZXBvcnRDb25uZWN0ZWRBcHBsaWNhdGlvbkxpc3Q6JyxcbiAgICAgICAgICAgIHBsaXN0Ll9fYXJndW1lbnQuV0lSQXBwbGljYXRpb25EaWN0aW9uYXJ5S2V5KTtcbiAgICAgIH0sXG4gICAgICAnX3JwY19hcHBsaWNhdGlvblNlbnRMaXN0aW5nOic6IChwbGlzdCkgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZVNwZWNpYWxNZXNzYWdlKCdfcnBjX2ZvcndhcmRHZXRMaXN0aW5nOicsXG4gICAgICAgICAgICBwbGlzdC5fX2FyZ3VtZW50LldJUkFwcGxpY2F0aW9uSWRlbnRpZmllcktleSxcbiAgICAgICAgICAgIHBsaXN0Ll9fYXJndW1lbnQuV0lSTGlzdGluZ0tleSk7XG4gICAgICB9LFxuICAgICAgJ19ycGNfYXBwbGljYXRpb25Db25uZWN0ZWQ6JzogKHBsaXN0KSA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlU3BlY2lhbE1lc3NhZ2UoJ19ycGNfYXBwbGljYXRpb25Db25uZWN0ZWQ6JyxcbiAgICAgICAgICAgIHBsaXN0Ll9fYXJndW1lbnQpO1xuICAgICAgfSxcbiAgICAgICdfcnBjX2FwcGxpY2F0aW9uRGlzY29ubmVjdGVkOic6IChwbGlzdCkgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZVNwZWNpYWxNZXNzYWdlKCdfcnBjX2FwcGxpY2F0aW9uRGlzY29ubmVjdGVkOicsXG4gICAgICAgICAgICBwbGlzdC5fX2FyZ3VtZW50KTtcbiAgICAgIH0sXG4gICAgICAnX3JwY19hcHBsaWNhdGlvblVwZGF0ZWQ6JzogKHBsaXN0KSA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlU3BlY2lhbE1lc3NhZ2UoJ19ycGNfYXBwbGljYXRpb25VcGRhdGVkOicsXG4gICAgICAgICAgICBwbGlzdC5fX2FyZ3VtZW50KTtcbiAgICAgIH0sXG4gICAgICAnX3JwY19yZXBvcnRDb25uZWN0ZWREcml2ZXJMaXN0Oic6IChwbGlzdCkgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZVNwZWNpYWxNZXNzYWdlKCdfcnBjX3JlcG9ydENvbm5lY3RlZERyaXZlckxpc3Q6JyxcbiAgICAgICAgICAgIHBsaXN0Ll9fYXJndW1lbnQpO1xuICAgICAgfSxcbiAgICAgICdfcnBjX2FwcGxpY2F0aW9uU2VudERhdGE6JzogdGhpcy5oYW5kbGVEYXRhTWVzc2FnZS5iaW5kKHRoaXMpLFxuICAgIH07XG4gIH1cbn1cbiJdLCJmaWxlIjoibGliL3JlbW90ZS1kZWJ1Z2dlci1tZXNzYWdlLWhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==