gst-atom-xcuitest-driver
Version:
ATOM driver for iOS using XCUITest for backend
292 lines (225 loc) • 32.7 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = exports.commands = void 0;
require("source-map-support/register");
var _lodash = _interopRequireDefault(require("lodash"));
var _gstAtomBaseDriver = require("gst-atom-base-driver");
var _gstAtomIosDriver = require("gst-atom-ios-driver");
var _appiumSupport = require("appium-support");
var _logger = _interopRequireDefault(require("../logger"));
let commands = {},
extensions = {};
exports.commands = commands;
Object.assign(extensions, _gstAtomIosDriver.iosCommands.element);
commands.getNativeAttribute = async function getNativeAttribute(attribute, el) {
if (attribute === 'contentSize') {
return await this.getContentSize(el);
}
el = _appiumSupport.util.unwrapElement(el);
let value = await this.proxyCommand(`/element/${el}/attribute/${attribute}`, 'GET');
if ([0, 1].includes(value)) {
value = !!value;
}
return _lodash.default.isNull(value) || _lodash.default.isString(value) ? value : JSON.stringify(value);
};
commands.getAttribute = async function getAttribute(attribute, el) {
el = _appiumSupport.util.unwrapElement(el);
if (!this.isWebContext()) {
return await this.getNativeAttribute(attribute, el);
}
const atomsElement = this.getAtomsElement(el);
if (_lodash.default.isNull(atomsElement)) {
throw new _gstAtomBaseDriver.errors.UnknownError(`Error converting element ID for using in WD atoms: '${el}`);
}
return await this.executeAtom('get_attribute_value', [atomsElement, attribute]);
};
commands.getText = async function getText(el) {
el = _appiumSupport.util.unwrapElement(el);
if (!this.isWebContext()) {
return await this.proxyCommand(`/element/${el}/text`, 'GET');
}
let atomsElement = this.useAtomsElement(el);
return await this.executeAtom('get_text', [atomsElement]);
};
commands.getElementRect = async function getElementRect(el) {
if (this.isWebContext()) {
const {
x,
y
} = await this.getLocation(el);
const {
width,
height
} = await this.getSize(el);
return {
x,
y,
width,
height
};
}
el = _appiumSupport.util.unwrapElement(el);
return await this.getNativeRect(el);
};
extensions.getNativeRect = async function getNativeRect(el) {
return await this.proxyCommand(`/element/${el}/rect`, 'GET');
};
commands.getLocation = async function getLocation(el) {
el = _appiumSupport.util.unwrapElement(el);
if (this.isWebContext()) {
const atomsElement = await this.useAtomsElement(el);
let loc = await this.executeAtom('get_top_left_coordinates', [atomsElement]);
if (this.opts.absoluteWebLocations) {
const script = 'return [document.body.scrollLeft, document.body.scrollTop];';
const [xOffset, yOffset] = await this.execute(script);
loc.x += xOffset;
loc.y += yOffset;
}
return loc;
}
const rect = await this.getElementRect(el);
return {
x: rect.x,
y: rect.y
};
};
commands.getLocationInView = async function getLocationInView(el) {
return await this.getLocation(el);
};
commands.getSize = async function getSize(el) {
el = _appiumSupport.util.unwrapElement(el);
if (this.isWebContext()) {
let atomsElement = this.getAtomsElement(el);
if (atomsElement === null) {
throw new _gstAtomBaseDriver.errors.UnknownError(`Error converting element ID for using in WD atoms: '${el}'`);
}
return await this.executeAtom('get_size', [atomsElement]);
}
const rect = await this.getElementRect(el);
return {
width: rect.width,
height: rect.height
};
};
function prepareInputValue(inp) {
if (![_lodash.default.isArray, _lodash.default.isString, _lodash.default.isFinite].some(f => f(inp))) {
throw new Error(`Only strings, numbers and arrays are supported as input arguments. ` + `Received: ${JSON.stringify(inp)}`);
}
if (_lodash.default.isArray(inp)) {
inp = inp.join('');
} else if (_lodash.default.isFinite(inp)) {
inp = `${inp}`;
}
return [...inp].map(k => {
if (['\uE006', '\uE007'].includes(k)) {
return '\n';
}
if (['\uE003', '\ue017'].includes(k)) {
return '\b';
}
return k;
});
}
commands.setValueImmediate = async function setValueImmediate(value, el) {
_logger.default.info('There is currently no way to bypass typing using XCUITest. Setting value through keyboard');
await this.setValue(value, el);
};
commands.setValue = async function setValue(value, el) {
el = _appiumSupport.util.unwrapElement(el);
if (!this.isWebContext()) {
await this.proxyCommand(`/element/${el}/value`, 'POST', {
value: prepareInputValue(value)
});
return;
}
const atomsElement = this.useAtomsElement(el);
await this.executeAtom('click', [atomsElement]);
await this.executeAtom('type', [atomsElement, value]);
};
commands.keys = async function keys(value) {
await this.proxyCommand('/wda/keys', 'POST', {
value: prepareInputValue(value)
});
};
commands.clear = async function clear(el) {
el = _appiumSupport.util.unwrapElement(el);
if (this.isWebContext()) {
const atomsElement = this.useAtomsElement(el);
await this.executeAtom('clear', [atomsElement]);
return;
}
await this.proxyCommand(`/element/${el}/clear`, 'POST');
};
commands.getContentSize = async function getContentSize(el) {
if (this.isWebContext()) {
throw new _gstAtomBaseDriver.errors.NotYetImplementedError('Support for getContentSize for web context is not yet implemented. Please contact an Appium dev');
}
const type = await this.getAttribute('type', el);
if (type !== 'XCUIElementTypeTable' && type !== 'XCUIElementTypeCollectionView') {
throw new Error(`Can't get content size for type '${type}', only for ` + `tables and collection views`);
}
let locator = '*';
if (type === 'XCUIElementTypeTable') {
locator = 'XCUIElementTypeCell';
}
let contentHeight = 0;
const children = await this.findElOrEls(`class chain`, locator, true, el);
if (children.length === 1) {
const rect = await this.getElementRect(_lodash.default.head(children));
contentHeight = rect.height;
} else if (children.length) {
switch (type) {
case 'XCUIElementTypeTable':
{
const firstRect = await this.getElementRect(_lodash.default.head(children));
const lastRect = await this.getElementRect(_lodash.default.last(children));
contentHeight = lastRect.y + lastRect.height - firstRect.y;
break;
}
case 'XCUIElementTypeCollectionView':
{
let elsInRow = 1;
let firstRect = await this.getElementRect(_lodash.default.head(children));
let initialRects = [firstRect];
for (let i = 1; i < children.length; i++) {
const rect = await this.getElementRect(children[i]);
initialRects.push(rect);
if (rect.y !== firstRect.y) {
elsInRow = i;
break;
}
}
const spaceBetweenEls = initialRects[elsInRow].y - initialRects[elsInRow - 1].y - initialRects[elsInRow - 1].height;
const numRows = Math.ceil(children.length / elsInRow);
contentHeight = numRows * firstRect.height + spaceBetweenEls * (numRows - 1);
break;
}
default:
throw new Error(`Programming error: type '${type}' was not ` + `valid but should have already been rejected`);
}
}
const size = await this.getSize(el);
const origin = await this.getLocationInView(el);
return JSON.stringify({
width: size.width,
height: size.height,
top: origin.y,
left: origin.x,
scrollableOffset: contentHeight
});
};
commands.isKeyboardShown = async function isKeyboardShown() {
try {
await this.findNativeElementOrElements('class name', 'XCUIElementTypeKeyboard', false);
return true;
} catch (ign) {
return false;
}
};
Object.assign(extensions, commands);
var _default = extensions;
exports.default = _default;require('source-map-support').install();
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9lbGVtZW50LmpzIl0sIm5hbWVzIjpbImNvbW1hbmRzIiwiZXh0ZW5zaW9ucyIsIk9iamVjdCIsImFzc2lnbiIsImlvc0NvbW1hbmRzIiwiZWxlbWVudCIsImdldE5hdGl2ZUF0dHJpYnV0ZSIsImF0dHJpYnV0ZSIsImVsIiwiZ2V0Q29udGVudFNpemUiLCJ1dGlsIiwidW53cmFwRWxlbWVudCIsInZhbHVlIiwicHJveHlDb21tYW5kIiwiaW5jbHVkZXMiLCJfIiwiaXNOdWxsIiwiaXNTdHJpbmciLCJKU09OIiwic3RyaW5naWZ5IiwiZ2V0QXR0cmlidXRlIiwiaXNXZWJDb250ZXh0IiwiYXRvbXNFbGVtZW50IiwiZ2V0QXRvbXNFbGVtZW50IiwiZXJyb3JzIiwiVW5rbm93bkVycm9yIiwiZXhlY3V0ZUF0b20iLCJnZXRUZXh0IiwidXNlQXRvbXNFbGVtZW50IiwiZ2V0RWxlbWVudFJlY3QiLCJ4IiwieSIsImdldExvY2F0aW9uIiwid2lkdGgiLCJoZWlnaHQiLCJnZXRTaXplIiwiZ2V0TmF0aXZlUmVjdCIsImxvYyIsIm9wdHMiLCJhYnNvbHV0ZVdlYkxvY2F0aW9ucyIsInNjcmlwdCIsInhPZmZzZXQiLCJ5T2Zmc2V0IiwiZXhlY3V0ZSIsInJlY3QiLCJnZXRMb2NhdGlvbkluVmlldyIsInByZXBhcmVJbnB1dFZhbHVlIiwiaW5wIiwiaXNBcnJheSIsImlzRmluaXRlIiwic29tZSIsImYiLCJFcnJvciIsImpvaW4iLCJtYXAiLCJrIiwic2V0VmFsdWVJbW1lZGlhdGUiLCJsb2ciLCJpbmZvIiwic2V0VmFsdWUiLCJrZXlzIiwiY2xlYXIiLCJOb3RZZXRJbXBsZW1lbnRlZEVycm9yIiwidHlwZSIsImxvY2F0b3IiLCJjb250ZW50SGVpZ2h0IiwiY2hpbGRyZW4iLCJmaW5kRWxPckVscyIsImxlbmd0aCIsImhlYWQiLCJmaXJzdFJlY3QiLCJsYXN0UmVjdCIsImxhc3QiLCJlbHNJblJvdyIsImluaXRpYWxSZWN0cyIsImkiLCJwdXNoIiwic3BhY2VCZXR3ZWVuRWxzIiwibnVtUm93cyIsIk1hdGgiLCJjZWlsIiwic2l6ZSIsIm9yaWdpbiIsInRvcCIsImxlZnQiLCJzY3JvbGxhYmxlT2Zmc2V0IiwiaXNLZXlib2FyZFNob3duIiwiZmluZE5hdGl2ZUVsZW1lbnRPckVsZW1lbnRzIiwiaWduIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUdBLElBQUlBLFFBQVEsR0FBRyxFQUFmO0FBQUEsSUFBbUJDLFVBQVUsR0FBRyxFQUFoQzs7QUFJQUMsTUFBTSxDQUFDQyxNQUFQLENBQWNGLFVBQWQsRUFBMEJHLDhCQUFZQyxPQUF0Qzs7QUFFQUwsUUFBUSxDQUFDTSxrQkFBVCxHQUE4QixlQUFlQSxrQkFBZixDQUFtQ0MsU0FBbkMsRUFBOENDLEVBQTlDLEVBQWtEO0FBQzlFLE1BQUlELFNBQVMsS0FBSyxhQUFsQixFQUFpQztBQUUvQixXQUFPLE1BQU0sS0FBS0UsY0FBTCxDQUFvQkQsRUFBcEIsQ0FBYjtBQUNEOztBQUVEQSxFQUFBQSxFQUFFLEdBQUdFLG9CQUFLQyxhQUFMLENBQW1CSCxFQUFuQixDQUFMO0FBR0EsTUFBSUksS0FBSyxHQUFHLE1BQU0sS0FBS0MsWUFBTCxDQUFtQixZQUFXTCxFQUFHLGNBQWFELFNBQVUsRUFBeEQsRUFBMkQsS0FBM0QsQ0FBbEI7O0FBRUEsTUFBSSxDQUFDLENBQUQsRUFBSSxDQUFKLEVBQU9PLFFBQVAsQ0FBZ0JGLEtBQWhCLENBQUosRUFBNEI7QUFDMUJBLElBQUFBLEtBQUssR0FBRyxDQUFDLENBQUNBLEtBQVY7QUFDRDs7QUFFRCxTQUFRRyxnQkFBRUMsTUFBRixDQUFTSixLQUFULEtBQW1CRyxnQkFBRUUsUUFBRixDQUFXTCxLQUFYLENBQXBCLEdBQXlDQSxLQUF6QyxHQUFpRE0sSUFBSSxDQUFDQyxTQUFMLENBQWVQLEtBQWYsQ0FBeEQ7QUFDRCxDQWhCRDs7QUFrQkFaLFFBQVEsQ0FBQ29CLFlBQVQsR0FBd0IsZUFBZUEsWUFBZixDQUE2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R0FIRCxDQUdFLE9BQU9DLEdBQVAsRUFBWTtBQUNaLFdBQU8sS0FBUDtBQUNEO0FBQ0YsQ0FQRDs7QUFTQXRGLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjRixVQUFkLEVBQTBCRCxRQUExQjtlQUVlQyxVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGVycm9ycyB9IGZyb20gJ2dzdC1hdG9tLWJhc2UtZHJpdmVyJztcbmltcG9ydCB7IGlvc0NvbW1hbmRzIH0gZnJvbSAnZ3N0LWF0b20taW9zLWRyaXZlcic7XG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXInO1xuXG5cbmxldCBjb21tYW5kcyA9IHt9LCBleHRlbnNpb25zID0ge307XG5cbi8vIHB1bGwgaW4gYWxsIHRoZSBlbGVtZW50IGNvbW1hbmRzIGFuZCBoZWxwZXJzIGZyb20gaW9zLWRyaXZlcixcbi8vIHRoZW4gb3ZlcnJpZGUgYW55dGhpbmcgd2Ugd2FudCBiZWxvd1xuT2JqZWN0LmFzc2lnbihleHRlbnNpb25zLCBpb3NDb21tYW5kcy5lbGVtZW50KTtcblxuY29tbWFuZHMuZ2V0TmF0aXZlQXR0cmlidXRlID0gYXN5bmMgZnVuY3Rpb24gZ2V0TmF0aXZlQXR0cmlidXRlIChhdHRyaWJ1dGUsIGVsKSB7XG4gIGlmIChhdHRyaWJ1dGUgPT09ICdjb250ZW50U2l6ZScpIHtcbiAgICAvLyBkb24ndCBwcm94eSByZXF1ZXN0cyBmb3IgdGhlIGNvbnRlbnQgc2l6ZSBvZiBhIHNjcm9sbGFibGUgZWxlbWVudFxuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldENvbnRlbnRTaXplKGVsKTtcbiAgfVxuXG4gIGVsID0gdXRpbC51bndyYXBFbGVtZW50KGVsKTtcblxuICAvLyBvdGhlcndpc2UgbGV0IFdEQSBoYW5kbGUgYXR0cmlidXRlIHJlcXVlc3RzXG4gIGxldCB2YWx1ZSA9IGF3YWl0IHRoaXMucHJveHlDb21tYW5kKGAvZWxlbWVudC8ke2VsfS9hdHRyaWJ1dGUvJHthdHRyaWJ1dGV9YCwgJ0dFVCcpO1xuICAvLyBUcmFuc2Zvcm0gdGhlIHJlc3VsdCBmb3IgdGhlIGNhc2Ugd2hlbiBXREEgcmV0dXJucyBhbiBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIGZvciBhIGJvb2xlYW4gdmFsdWVcbiAgaWYgKFswLCAxXS5pbmNsdWRlcyh2YWx1ZSkpIHtcbiAgICB2YWx1ZSA9ICEhdmFsdWU7XG4gIH1cbiAgLy8gVGhlIHJldHVybmVkIHZhbHVlIG11c3QgYmUgb2YgdHlwZSBzdHJpbmcgYWNjb3JkaW5nIHRvIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJkcml2ZXIvI2dldC1lbGVtZW50LWF0dHJpYnV0ZVxuICByZXR1cm4gKF8uaXNOdWxsKHZhbHVlKSB8fCBfLmlzU3RyaW5nKHZhbHVlKSkgPyB2YWx1ZSA6IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbn07XG5cbmNvbW1hbmRzLmdldEF0dHJpYnV0ZSA9IGFzeW5jIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZSAoYXR0cmlidXRlLCBlbCkge1xuICBlbCA9IHV0aWwudW53cmFwRWxlbWVudChlbCk7XG4gIGlmICghdGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldE5hdGl2ZUF0dHJpYnV0ZShhdHRyaWJ1dGUsIGVsKTtcbiAgfVxuICBjb25zdCBhdG9tc0VsZW1lbnQgPSB0aGlzLmdldEF0b21zRWxlbWVudChlbCk7XG4gIGlmIChfLmlzTnVsbChhdG9tc0VsZW1lbnQpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Vbmtub3duRXJyb3IoYEVycm9yIGNvbnZlcnRpbmcgZWxlbWVudCBJRCBmb3IgdXNpbmcgaW4gV0QgYXRvbXM6ICcke2VsfWApO1xuICB9XG4gIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKCdnZXRfYXR0cmlidXRlX3ZhbHVlJywgW2F0b21zRWxlbWVudCwgYXR0cmlidXRlXSk7XG59O1xuXG5jb21tYW5kcy5nZXRUZXh0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0VGV4dCAoZWwpIHtcbiAgZWwgPSB1dGlsLnVud3JhcEVsZW1lbnQoZWwpO1xuICBpZiAoIXRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoYC9lbGVtZW50LyR7ZWx9L3RleHRgLCAnR0VUJyk7XG4gIH1cbiAgbGV0IGF0b21zRWxlbWVudCA9IHRoaXMudXNlQXRvbXNFbGVtZW50KGVsKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ2dldF90ZXh0JywgW2F0b21zRWxlbWVudF0pO1xufTtcblxuY29tbWFuZHMuZ2V0RWxlbWVudFJlY3QgPSBhc3luYyBmdW5jdGlvbiBnZXRFbGVtZW50UmVjdCAoZWwpIHtcbiAgaWYgKHRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICAvLyBNb2JpbGUgc2FmYXJpIGRvZXNuJ3Qgc3VwcG9ydCByZWN0XG4gICAgY29uc3Qge3gsIHl9ID0gYXdhaXQgdGhpcy5nZXRMb2NhdGlvbihlbCk7XG4gICAgY29uc3Qge3dpZHRoLCBoZWlnaHR9ID0gYXdhaXQgdGhpcy5nZXRTaXplKGVsKTtcbiAgICByZXR1cm4ge3gsIHksIHdpZHRoLCBoZWlnaHR9O1xuICB9XG5cbiAgZWwgPSB1dGlsLnVud3JhcEVsZW1lbnQoZWwpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXROYXRpdmVSZWN0KGVsKTtcbn07XG5cbmV4dGVuc2lvbnMuZ2V0TmF0aXZlUmVjdCA9IGFzeW5jIGZ1bmN0aW9uIGdldE5hdGl2ZVJlY3QgKGVsKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChgL2VsZW1lbnQvJHtlbH0vcmVjdGAsICdHRVQnKTtcbn07XG5cbmNvbW1hbmRzLmdldExvY2F0aW9uID0gYXN5bmMgZnVuY3Rpb24gZ2V0TG9jYXRpb24gKGVsKSB7XG4gIGVsID0gdXRpbC51bndyYXBFbGVtZW50KGVsKTtcbiAgaWYgKHRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICBjb25zdCBhdG9tc0VsZW1lbnQgPSBhd2FpdCB0aGlzLnVzZUF0b21zRWxlbWVudChlbCk7XG4gICAgbGV0IGxvYyA9IGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ2dldF90b3BfbGVmdF9jb29yZGluYXRlcycsIFthdG9tc0VsZW1lbnRdKTtcbiAgICBpZiAodGhpcy5vcHRzLmFic29sdXRlV2ViTG9jYXRpb25zKSB7XG4gICAgICBjb25zdCBzY3JpcHQgPSAncmV0dXJuIFtkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQsIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wXTsnO1xuICAgICAgY29uc3QgW3hPZmZzZXQsIHlPZmZzZXRdID0gYXdhaXQgdGhpcy5leGVjdXRlKHNjcmlwdCk7XG4gICAgICBsb2MueCArPSB4T2Zmc2V0O1xuICAgICAgbG9jLnkgKz0geU9mZnNldDtcbiAgICB9XG4gICAgcmV0dXJuIGxvYztcbiAgfVxuXG4gIGNvbnN0IHJlY3QgPSBhd2FpdCB0aGlzLmdldEVsZW1lbnRSZWN0KGVsKTtcbiAgcmV0dXJuIHt4OiByZWN0LngsIHk6IHJlY3QueX07XG59O1xuXG5jb21tYW5kcy5nZXRMb2NhdGlvbkluVmlldyA9IGFzeW5jIGZ1bmN0aW9uIGdldExvY2F0aW9uSW5WaWV3IChlbCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXRMb2NhdGlvbihlbCk7XG59O1xuXG5jb21tYW5kcy5nZXRTaXplID0gYXN5bmMgZnVuY3Rpb24gZ2V0U2l6ZSAoZWwpIHtcbiAgZWwgPSB1dGlsLnVud3JhcEVsZW1lbnQoZWwpO1xuICBpZiAodGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIGxldCBhdG9tc0VsZW1lbnQgPSB0aGlzLmdldEF0b21zRWxlbWVudChlbCk7XG4gICAgaWYgKGF0b21zRWxlbWVudCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5Vbmtub3duRXJyb3IoYEVycm9yIGNvbnZlcnRpbmcgZWxlbWVudCBJRCBmb3IgdXNpbmcgaW4gV0QgYXRvbXM6ICcke2VsfSdgKTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ2dldF9zaXplJywgW2F0b21zRWxlbWVudF0pO1xuICB9XG5cbiAgY29uc3QgcmVjdCA9IGF3YWl0IHRoaXMuZ2V0RWxlbWVudFJlY3QoZWwpO1xuICByZXR1cm4ge3dpZHRoOiByZWN0LndpZHRoLCBoZWlnaHQ6IHJlY3QuaGVpZ2h0fTtcbn07XG5cbi8qKlxuICogUHJlcGFyZXMgdGhlIGlucHV0IHZhbHVlIHRvIGJlIHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byBXREEuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8QXJyYXk8c3RyaW5nPnxudW1iZXJ9IGlucCBUaGUgYWN0dWFsIHRleHQgdG8gdHlwZS5cbiAqIEFjY2VwdGFibGUgdmFsdWVzIG9mIGBpbnBgOlxuICogICBbJ3NvbWUgdGV4dCddXG4gKiAgIFsncycsICdvJywgJ20nLCAnZScsICcgJywgJ3QnLCAnZScsICd4JywgJ3QnXVxuICogICAnc29tZSB0ZXh0J1xuICogICAxMjM0XG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHZhbHVlIGlzIG5vdCBhY2NlcHRhYmxlIGZvciBpbnB1dFxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IFRoZSBwcmVwcm9jZXNzZWQgdmFsdWVcbiAqL1xuZnVuY3Rpb24gcHJlcGFyZUlucHV0VmFsdWUgKGlucCkge1xuICBpZiAoIVtfLmlzQXJyYXksIF8uaXNTdHJpbmcsIF8uaXNGaW5pdGVdLnNvbWUoKGYpID0+IGYoaW5wKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE9ubHkgc3RyaW5ncywgbnVtYmVycyBhbmQgYXJyYXlzIGFyZSBzdXBwb3J0ZWQgYXMgaW5wdXQgYXJndW1lbnRzLiBgICtcbiAgICAgIGBSZWNlaXZlZDogJHtKU09OLnN0cmluZ2lmeShpbnApfWApO1xuICB9XG5cbiAgLy8gbWFrZSBpdCBpbnRvIGEgc3RyaW5nLCBzbyB0aGVuIHdlIGFzc3VyZVxuICAvLyB0aGUgYXJyYXkgaXRlbXMgYXJlIHNpbmdsZSBjaGFyYWN0ZXJzXG4gIGlmIChfLmlzQXJyYXkoaW5wKSkge1xuICAgIGlucCA9IGlucC5qb2luKCcnKTtcbiAgfSBlbHNlIGlmIChfLmlzRmluaXRlKGlucCkpIHtcbiAgICBpbnAgPSBgJHtpbnB9YDtcbiAgfVxuICAvLyBUaGUgYHNwbGl0YCBtZXRob2QgbXVzdCBub3QgYmUgdXNlZCBvbiB0aGUgc3RyaW5nXG4gIC8vIHRvIHByb3Blcmx5IGhhbmRsZSBhbGwgVW5pY29kZSBjb2RlIHBvaW50c1xuICByZXR1cm4gWy4uLmlucF0ubWFwKChrKSA9PiB7XG4gICAgaWYgKFsnXFx1RTAwNicsICdcXHVFMDA3J10uaW5jbHVkZXMoaykpIHsgLy8gUkVUVVJOIG9yIEVOVEVSXG4gICAgICByZXR1cm4gJ1xcbic7XG4gICAgfVxuICAgIGlmIChbJ1xcdUUwMDMnLCAnXFx1ZTAxNyddLmluY2x1ZGVzKGspKSB7IC8vIEJBQ0tTUEFDRSBvciBERUxFVEVcbiAgICAgIHJldHVybiAnXFxiJztcbiAgICB9XG4gICAgcmV0dXJuIGs7XG4gIH0pO1xufVxuXG5jb21tYW5kcy5zZXRWYWx1ZUltbWVkaWF0ZSA9IGFzeW5jIGZ1bmN0aW9uIHNldFZhbHVlSW1tZWRpYXRlICh2YWx1ZSwgZWwpIHtcbiAgLy8gV0RBIGRvZXMgbm90IHByb3ZpZGUgbm8gd2F5IHRvIHNldCB0aGUgdmFsdWUgZGlyZWN0bHlcbiAgbG9nLmluZm8oJ1RoZXJlIGlzIGN1cnJlbnRseSBubyB3YXkgdG8gYnlwYXNzIHR5cGluZyB1c2luZyBYQ1VJVGVzdC4gU2V0dGluZyB2YWx1ZSB0aHJvdWdoIGtleWJvYXJkJyk7XG4gIGF3YWl0IHRoaXMuc2V0VmFsdWUodmFsdWUsIGVsKTtcbn07XG5cbmNvbW1hbmRzLnNldFZhbHVlID0gYXN5bmMgZnVuY3Rpb24gc2V0VmFsdWUgKHZhbHVlLCBlbCkge1xuICBlbCA9IHV0aWwudW53cmFwRWxlbWVudChlbCk7XG4gIGlmICghdGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKGAvZWxlbWVudC8ke2VsfS92YWx1ZWAsICdQT1NUJywge1xuICAgICAgdmFsdWU6IHByZXBhcmVJbnB1dFZhbHVlKHZhbHVlKSxcbiAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBhdG9tc0VsZW1lbnQgPSB0aGlzLnVzZUF0b21zRWxlbWVudChlbCk7XG4gIGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ2NsaWNrJywgW2F0b21zRWxlbWVudF0pO1xuICBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKCd0eXBlJywgW2F0b21zRWxlbWVudCwgdmFsdWVdKTtcbn07XG5cbmNvbW1hbmRzLmtleXMgPSBhc3luYyBmdW5jdGlvbiBrZXlzICh2YWx1ZSkge1xuICBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZCgnL3dkYS9rZXlzJywgJ1BPU1QnLCB7XG4gICAgdmFsdWU6IHByZXBhcmVJbnB1dFZhbHVlKHZhbHVlKSxcbiAgfSk7XG59O1xuXG5jb21tYW5kcy5jbGVhciA9IGFzeW5jIGZ1bmN0aW9uIGNsZWFyIChlbCkge1xuICBlbCA9IHV0aWwudW53cmFwRWxlbWVudChlbCk7XG4gIGlmICh0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgY29uc3QgYXRvbXNFbGVtZW50ID0gdGhpcy51c2VBdG9tc0VsZW1lbnQoZWwpO1xuICAgIGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ2NsZWFyJywgW2F0b21zRWxlbWVudF0pO1xuICAgIHJldHVybjtcbiAgfVxuICBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChgL2VsZW1lbnQvJHtlbH0vY2xlYXJgLCAnUE9TVCcpO1xufTtcblxuY29tbWFuZHMuZ2V0Q29udGVudFNpemUgPSBhc3luYyBmdW5jdGlvbiBnZXRDb250ZW50U2l6ZSAoZWwpIHtcbiAgaWYgKHRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLk5vdFlldEltcGxlbWVudGVkRXJyb3IoJ1N1cHBvcnQgZm9yIGdldENvbnRlbnRTaXplIGZvciB3ZWIgY29udGV4dCBpcyBub3QgeWV0IGltcGxlbWVudGVkLiBQbGVhc2UgY29udGFjdCBhbiBBcHBpdW0gZGV2Jyk7XG4gIH1cblxuICBjb25zdCB0eXBlID0gYXdhaXQgdGhpcy5nZXRBdHRyaWJ1dGUoJ3R5cGUnLCBlbCk7XG5cbiAgaWYgKHR5cGUgIT09ICdYQ1VJRWxlbWVudFR5cGVUYWJsZScgJiZcbiAgICAgIHR5cGUgIT09ICdYQ1VJRWxlbWVudFR5cGVDb2xsZWN0aW9uVmlldycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IGdldCBjb250ZW50IHNpemUgZm9yIHR5cGUgJyR7dHlwZX0nLCBvbmx5IGZvciBgICtcbiAgICAgICAgICAgICAgICAgICAgYHRhYmxlcyBhbmQgY29sbGVjdGlvbiB2aWV3c2ApO1xuICB9XG4gIGxldCBsb2NhdG9yID0gJyonO1xuICBpZiAodHlwZSA9PT0gJ1hDVUlFbGVtZW50VHlwZVRhYmxlJykge1xuICAgIC8vIG9ubHkgZmluZCB0YWJsZSBjZWxscywgbm90IGp1c3QgYW55IGNoaWxkcmVuXG4gICAgbG9jYXRvciA9ICdYQ1VJRWxlbWVudFR5cGVDZWxsJztcbiAgfVxuXG4gIGxldCBjb250ZW50SGVpZ2h0ID0gMDtcbiAgY29uc3QgY2hpbGRyZW4gPSBhd2FpdCB0aGlzLmZpbmRFbE9yRWxzKGBjbGFzcyBjaGFpbmAsIGxvY2F0b3IsIHRydWUsIGVsKTtcbiAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMSkge1xuICAgIC8vIGlmIHdlIGtub3cgdGhlcmUncyBvbmx5IG9uZSBlbGVtZW50LCB3ZSBjYW4gb3B0aW1pemUgdG8gbWFrZSBqdXN0IG9uZVxuICAgIC8vIGNhbGwgdG8gV0RBXG4gICAgY29uc3QgcmVjdCA9IGF3YWl0IHRoaXMuZ2V0RWxlbWVudFJlY3QoXy5oZWFkKGNoaWxkcmVuKSk7XG4gICAgY29udGVudEhlaWdodCA9IHJlY3QuaGVpZ2h0O1xuICB9IGVsc2UgaWYgKGNoaWxkcmVuLmxlbmd0aCkge1xuICAgIC8vIG90aGVyd2lzZSBpZiB3ZSBoYXZlIG11bHRpcGxlIGVsZW1lbnRzLCBsb2dpYyBkaWZmZXJzIGJhc2VkIG9uIGVsZW1lbnRcbiAgICAvLyB0eXBlXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdYQ1VJRWxlbWVudFR5cGVUYWJsZSc6IHtcbiAgICAgICAgY29uc3QgZmlyc3RSZWN0ID0gYXdhaXQgdGhpcy5nZXRFbGVtZW50UmVjdChfLmhlYWQoY2hpbGRyZW4pKTtcbiAgICAgICAgY29uc3QgbGFzdFJlY3QgPSBhd2FpdCB0aGlzLmdldEVsZW1lbnRSZWN0KF8ubGFzdChjaGlsZHJlbikpO1xuICAgICAgICBjb250ZW50SGVpZ2h0ID0gbGFzdFJlY3QueSArIGxhc3RSZWN0LmhlaWdodCAtIGZpcnN0UmVjdC55O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ1hDVUlFbGVtZW50VHlwZUNvbGxlY3Rpb25WaWV3Jzoge1xuICAgICAgICBsZXQgZWxzSW5Sb3cgPSAxOyAvLyB3ZSBrbm93IHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGVsZW1lbnQgaW4gdGhlIHJvd1xuICAgICAgICBsZXQgZmlyc3RSZWN0ID0gYXdhaXQgdGhpcy5nZXRFbGVtZW50UmVjdChfLmhlYWQoY2hpbGRyZW4pKTtcbiAgICAgICAgbGV0IGluaXRpYWxSZWN0cyA9IFtmaXJzdFJlY3RdO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgcmVjdCA9IGF3YWl0IHRoaXMuZ2V0RWxlbWVudFJlY3QoY2hpbGRyZW5baV0pO1xuICAgICAgICAgIGluaXRpYWxSZWN0cy5wdXNoKHJlY3QpO1xuICAgICAgICAgIGlmIChyZWN0LnkgIT09IGZpcnN0UmVjdC55KSB7XG4gICAgICAgICAgICBlbHNJblJvdyA9IGk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3BhY2VCZXR3ZWVuRWxzID0gaW5pdGlhbFJlY3RzW2Vsc0luUm93XS55IC0gaW5pdGlhbFJlY3RzW2Vsc0luUm93IC0gMV0ueSAtIGluaXRpYWxSZWN0c1tlbHNJblJvdyAtIDFdLmhlaWdodDtcbiAgICAgICAgY29uc3QgbnVtUm93cyA9IE1hdGguY2VpbChjaGlsZHJlbi5sZW5ndGggLyBlbHNJblJvdyk7XG5cbiAgICAgICAgLy8gYXNzdW1lIGFsbCBjZWxscyBhcmUgdGhlIHNhbWUgaGVpZ2h0XG4gICAgICAgIGNvbnRlbnRIZWlnaHQgPSAobnVtUm93cyAqIGZpcnN0UmVjdC5oZWlnaHQpICsgKHNwYWNlQmV0d2VlbkVscyAqIChudW1Sb3dzIC0gMSkpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcihgUHJvZ3JhbW1pbmcgZXJyb3I6IHR5cGUgJyR7dHlwZX0nIHdhcyBub3QgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYHZhbGlkIGJ1dCBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gcmVqZWN0ZWRgKTtcbiAgICB9XG4gIH1cbiAgY29uc3Qgc2l6ZSA9IGF3YWl0IHRoaXMuZ2V0U2l6ZShlbCk7XG4gIGNvbnN0IG9yaWdpbiA9IGF3YWl0IHRoaXMuZ2V0TG9jYXRpb25JblZpZXcoZWwpO1xuICAvLyBhdHRyaWJ1dGVzIGhhdmUgdG8gYmUgc3RyaW5ncywgc28gc3RyaW5naWZ5IHRoaXMgdXBcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICB3aWR0aDogc2l6ZS53aWR0aCxcbiAgICBoZWlnaHQ6IHNpemUuaGVpZ2h0LFxuICAgIHRvcDogb3JpZ2luLnksXG4gICAgbGVmdDogb3JpZ2luLngsXG4gICAgc2Nyb2xsYWJsZU9mZnNldDogY29udGVudEhlaWdodFxuICB9KTtcbn07XG5cbmNvbW1hbmRzLmlzS2V5Ym9hcmRTaG93biA9IGFzeW5jIGZ1bmN0aW9uIGlzS2V5Ym9hcmRTaG93biAoKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5maW5kTmF0aXZlRWxlbWVudE9yRWxlbWVudHMoJ2NsYXNzIG5hbWUnLCAnWENVSUVsZW1lbnRUeXBlS2V5Ym9hcmQnLCBmYWxzZSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGlnbikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuT2JqZWN0LmFzc2lnbihleHRlbnNpb25zLCBjb21tYW5kcyk7XG5leHBvcnQgeyBjb21tYW5kcyB9O1xuZXhwb3J0IGRlZmF1bHQgZXh0ZW5zaW9ucztcbiJdLCJmaWxlIjoibGliL2NvbW1hbmRzL2VsZW1lbnQuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==