webdriverio-automation
Version:
WebdriverIO-Automation android ios project
228 lines (178 loc) • 26.1 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getImgElFromArgs = getImgElFromArgs;
exports.makeImageElementCache = makeImageElementCache;
exports.DEFAULT_TEMPLATE_IMAGE_SCALE = exports.IMAGE_EL_TAP_STRATEGY_W3C = exports.IMAGE_EL_TAP_STRATEGY_MJSONWP = exports.ImageElement = void 0;
require("source-map-support/register");
var _lodash = _interopRequireDefault(require("lodash"));
var _2 = require("../..");
var _lruCache = _interopRequireDefault(require("lru-cache"));
var _protocol = require("../protocol/protocol");
var _logger = _interopRequireDefault(require("./logger"));
var _uuidJs = _interopRequireDefault(require("uuid-js"));
const MAX_CACHE_SIZE = 1024 * 1024 * 40;
const TAP_DURATION_MS = 125;
const IMAGE_EL_TAP_STRATEGY_W3C = 'w3cActions';
exports.IMAGE_EL_TAP_STRATEGY_W3C = IMAGE_EL_TAP_STRATEGY_W3C;
const IMAGE_EL_TAP_STRATEGY_MJSONWP = 'touchActions';
exports.IMAGE_EL_TAP_STRATEGY_MJSONWP = IMAGE_EL_TAP_STRATEGY_MJSONWP;
const IMAGE_TAP_STRATEGIES = [IMAGE_EL_TAP_STRATEGY_MJSONWP, IMAGE_EL_TAP_STRATEGY_W3C];
const DEFAULT_TEMPLATE_IMAGE_SCALE = 1.0;
exports.DEFAULT_TEMPLATE_IMAGE_SCALE = DEFAULT_TEMPLATE_IMAGE_SCALE;
class ImageElement {
constructor(b64Template, rect, b64Result = null) {
this.template = b64Template;
this.rect = rect;
this.id = `${_protocol.IMAGE_ELEMENT_PREFIX}${_uuidJs.default.create().hex}`;
this.b64MatchedImage = b64Result;
}
get size() {
return {
width: this.rect.width,
height: this.rect.height
};
}
get location() {
return {
x: this.rect.x,
y: this.rect.y
};
}
get center() {
return {
x: this.rect.x + this.rect.width / 2,
y: this.rect.y + this.rect.height / 2
};
}
get matchedImage() {
return this.b64MatchedImage;
}
asElement(protocolKey) {
return {
[protocolKey]: this.id
};
}
equals(other) {
return this.rect.x === other.rect.x && this.rect.y === other.rect.y && this.rect.width === other.rect.width && this.rect.height === other.rect.height;
}
async click(driver) {
let newImgEl;
const {
autoUpdateImageElementPosition: updatePos,
checkForImageElementStaleness,
imageElementTapStrategy
} = driver.settings.getSettings();
if (!IMAGE_TAP_STRATEGIES.includes(imageElementTapStrategy)) {
throw new Error(`Incorrect imageElementTapStrategy setting ` + `'${imageElementTapStrategy}'. Must be one of ` + JSON.stringify(IMAGE_TAP_STRATEGIES));
}
if (checkForImageElementStaleness || updatePos) {
_logger.default.info('Checking image element for staleness before clicking');
try {
newImgEl = await driver.findByImage(this.template, {
shouldCheckStaleness: true,
ignoreDefaultImageTemplateScale: true
});
} catch (err) {
throw new _2.errors.StaleElementReferenceError();
}
if (!this.equals(newImgEl)) {
_logger.default.warn(`When trying to click on an image element, the image changed ` + `position from where it was originally found. It is now at ` + `${JSON.stringify(newImgEl.rect)} and was originally at ` + `${JSON.stringify(this.rect)}.`);
if (updatePos) {
_logger.default.warn('Click will proceed at new coordinates');
this.rect = _lodash.default.clone(newImgEl.rect);
} else {
_logger.default.warn('Click will take place at original coordinates. If you ' + 'would like Appium to automatically click the new ' + "coordinates, set the 'autoUpdateImageElementPosition' " + 'setting to true');
}
}
}
const {
x,
y
} = this.center;
_logger.default.info(`Will tap on image element at coordinate [${x}, ${y}]`);
if (imageElementTapStrategy === IMAGE_EL_TAP_STRATEGY_W3C) {
_logger.default.info('Will tap using W3C actions');
const action = {
type: 'pointer',
id: 'mouse',
parameters: {
pointerType: 'touch'
},
actions: [{
type: 'pointerMove',
x,
y,
duration: 0
}, {
type: 'pointerDown'
}, {
type: 'pause',
duration: TAP_DURATION_MS
}, {
type: 'pointerUp'
}]
};
if (driver.performActions) {
return await driver.performActions([action]);
}
_logger.default.warn('Driver does not seem to implement W3C actions, falling back ' + 'to TouchActions');
}
_logger.default.info('Will tap using MJSONWP TouchActions');
const action = {
action: 'tap',
options: {
x,
y
}
};
if (driver.performTouch) {
return await driver.performTouch([action]);
}
throw new Error("Driver did not implement the 'performTouch' command. " + 'For drivers to support finding image elements, they ' + "should support 'performTouch' and 'performActions'");
}
static async execute(driver, cmd, imgElId, ...args) {
if (!driver._imgElCache.has(imgElId)) {
throw new _2.errors.NoSuchElementError();
}
const imgEl = driver._imgElCache.get(imgElId);
switch (cmd) {
case 'click':
return await imgEl.click(driver);
case 'elementDisplayed':
return true;
case 'getSize':
return imgEl.size;
case 'getLocation':
case 'getLocationInView':
return imgEl.location;
case 'getElementRect':
return imgEl.rect;
case 'getAttribute':
if (args[0] === 'visual') {
return imgEl.matchedImage;
} else {
throw new _2.errors.NotYetImplementedError();
}
default:
throw new _2.errors.NotYetImplementedError();
}
}
}
exports.ImageElement = ImageElement;
function makeImageElementCache(max = MAX_CACHE_SIZE) {
return new _lruCache.default({
max,
length: el => el.template.length
});
}
function getImgElFromArgs(args) {
for (let arg of args) {
if (_lodash.default.isString(arg) && arg.startsWith(_protocol.IMAGE_ELEMENT_PREFIX)) {
return arg;
}
}
}require('source-map-support').install();
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9iYXNlZHJpdmVyL2ltYWdlLWVsZW1lbnQuanMiXSwibmFtZXMiOlsiTUFYX0NBQ0hFX1NJWkUiLCJUQVBfRFVSQVRJT05fTVMiLCJJTUFHRV9FTF9UQVBfU1RSQVRFR1lfVzNDIiwiSU1BR0VfRUxfVEFQX1NUUkFURUdZX01KU09OV1AiLCJJTUFHRV9UQVBfU1RSQVRFR0lFUyIsIkRFRkFVTFRfVEVNUExBVEVfSU1BR0VfU0NBTEUiLCJJbWFnZUVsZW1lbnQiLCJjb25zdHJ1Y3RvciIsImI2NFRlbXBsYXRlIiwicmVjdCIsImI2NFJlc3VsdCIsInRlbXBsYXRlIiwiaWQiLCJJTUFHRV9FTEVNRU5UX1BSRUZJWCIsIlVVSUQiLCJjcmVhdGUiLCJoZXgiLCJiNjRNYXRjaGVkSW1hZ2UiLCJzaXplIiwid2lkdGgiLCJoZWlnaHQiLCJsb2NhdGlvbiIsIngiLCJ5IiwiY2VudGVyIiwibWF0Y2hlZEltYWdlIiwiYXNFbGVtZW50IiwicHJvdG9jb2xLZXkiLCJlcXVhbHMiLCJvdGhlciIsImNsaWNrIiwiZHJpdmVyIiwibmV3SW1nRWwiLCJhdXRvVXBkYXRlSW1hZ2VFbGVtZW50UG9zaXRpb24iLCJ1cGRhdGVQb3MiLCJjaGVja0ZvckltYWdlRWxlbWVudFN0YWxlbmVzcyIsImltYWdlRWxlbWVudFRhcFN0cmF0ZWd5Iiwic2V0dGluZ3MiLCJnZXRTZXR0aW5ncyIsImluY2x1ZGVzIiwiRXJyb3IiLCJKU09OIiwic3RyaW5naWZ5IiwibG9nIiwiaW5mbyIsImZpbmRCeUltYWdlIiwic2hvdWxkQ2hlY2tTdGFsZW5lc3MiLCJpZ25vcmVEZWZhdWx0SW1hZ2VUZW1wbGF0ZVNjYWxlIiwiZXJyIiwiZXJyb3JzIiwiU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3IiLCJ3YXJuIiwiXyIsImNsb25lIiwiYWN0aW9uIiwidHlwZSIsInBhcmFtZXRlcnMiLCJwb2ludGVyVHlwZSIsImFjdGlvbnMiLCJkdXJhdGlvbiIsInBlcmZvcm1BY3Rpb25zIiwib3B0aW9ucyIsInBlcmZvcm1Ub3VjaCIsImV4ZWN1dGUiLCJjbWQiLCJpbWdFbElkIiwiYXJncyIsIl9pbWdFbENhY2hlIiwiaGFzIiwiTm9TdWNoRWxlbWVudEVycm9yIiwiaW1nRWwiLCJnZXQiLCJOb3RZZXRJbXBsZW1lbnRlZEVycm9yIiwibWFrZUltYWdlRWxlbWVudENhY2hlIiwibWF4IiwiTFJVIiwibGVuZ3RoIiwiZWwiLCJnZXRJbWdFbEZyb21BcmdzIiwiYXJnIiwiaXNTdHJpbmciLCJzdGFydHNXaXRoIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsY0FBYyxHQUFHLE9BQU8sSUFBUCxHQUFjLEVBQXJDO0FBQ0EsTUFBTUMsZUFBZSxHQUFHLEdBQXhCO0FBQ0EsTUFBTUMseUJBQXlCLEdBQUcsWUFBbEM7O0FBQ0EsTUFBTUMsNkJBQTZCLEdBQUcsY0FBdEM7O0FBQ0EsTUFBTUMsb0JBQW9CLEdBQUcsQ0FDM0JELDZCQUQyQixFQUUzQkQseUJBRjJCLENBQTdCO0FBSUEsTUFBTUcsNEJBQTRCLEdBQUcsR0FBckM7OztBQTBCQSxNQUFNQyxZQUFOLENBQW1CO0FBV2pCQyxFQUFBQSxXQUFXLENBQUVDLFdBQUYsRUFBZUMsSUFBZixFQUFxQkMsU0FBUyxHQUFHLElBQWpDLEVBQXVDO0FBQ2hELFNBQUtDLFFBQUwsR0FBZ0JILFdBQWhCO0FBQ0EsU0FBS0MsSUFBTCxHQUFZQSxJQUFaO0FBQ0EsU0FBS0csRUFBTCxHQUFXLEdBQUVDLDhCQUFxQixHQUFFQyxnQkFBS0MsTUFBTCxHQUFjQyxHQUFJLEVBQXREO0FBQ0EsU0FBS0MsZUFBTCxHQUF1QlAsU0FBdkI7QUFDRDs7QUFLRCxNQUFJUSxJQUFKLEdBQVk7QUFDVixXQUFPO0FBQUNDLE1BQUFBLEtBQUssRUFBRSxLQUFLVixJQUFMLENBQVVVLEtBQWxCO0FBQXlCQyxNQUFBQSxNQUFNLEVBQUUsS0FBS1gsSUFBTCxDQUFVVztBQUEzQyxLQUFQO0FBQ0Q7O0FBS0QsTUFB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QXJCWDtBQXVCRDs7QUFsTmdCOzs7O0FBcU5uQixTQUFTQyxxQkFBVCxDQUFnQ0MsR0FBRyxHQUFHMUUsY0FBdEMsRUFBc0Q7QUFDcEQsU0FBTyxJQUFJMkUsaUJBQUosQ0FBUTtBQUNiRCxJQUFBQSxHQURhO0FBRWJFLElBQUFBLE1BQU0sRUFBR0MsRUFBRCxJQUFRQSxFQUFFLENBQUNsRSxRQUFILENBQVlpRTtBQUZmLEdBQVIsQ0FBUDtBQUlEOztBQUVELFNBQVNFLGdCQUFULENBQTJCWixJQUEzQixFQUFpQztBQUMvQixPQUFLLElBQUlhLEdBQVQsSUFBZ0JiLElBQWhCLEVBQXNCO0FBQ3BCLFFBQUlkLGdCQUFFNEIsUUFBRixDQUFXRCxHQUFYLEtBQW1CQSxHQUFHLENBQUNFLFVBQUosQ0FBZXBFLDhCQUFmLENBQXZCLEVBQTZEO0FBQzNELGFBQU9rRSxHQUFQO0FBQ0Q7QUFDRjtBQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGVycm9ycyB9IGZyb20gJy4uLy4uJztcbmltcG9ydCBMUlUgZnJvbSAnbHJ1LWNhY2hlJztcbmltcG9ydCB7IElNQUdFX0VMRU1FTlRfUFJFRklYIH0gZnJvbSAnLi4vcHJvdG9jb2wvcHJvdG9jb2wnO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgVVVJRCBmcm9tICd1dWlkLWpzJztcblxuY29uc3QgTUFYX0NBQ0hFX1NJWkUgPSAxMDI0ICogMTAyNCAqIDQwOyAvLyA0MG1iXG5jb25zdCBUQVBfRFVSQVRJT05fTVMgPSAxMjU7XG5jb25zdCBJTUFHRV9FTF9UQVBfU1RSQVRFR1lfVzNDID0gJ3czY0FjdGlvbnMnO1xuY29uc3QgSU1BR0VfRUxfVEFQX1NUUkFURUdZX01KU09OV1AgPSAndG91Y2hBY3Rpb25zJztcbmNvbnN0IElNQUdFX1RBUF9TVFJBVEVHSUVTID0gW1xuICBJTUFHRV9FTF9UQVBfU1RSQVRFR1lfTUpTT05XUCxcbiAgSU1BR0VfRUxfVEFQX1NUUkFURUdZX1czQ1xuXTtcbmNvbnN0IERFRkFVTFRfVEVNUExBVEVfSU1BR0VfU0NBTEUgPSAxLjA7XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUmVjdFxuICogQHByb3BlcnR5IHtpbnR9IHggLSB4LWNvb3JkaW5hdGUgb2YgdG9wLWxlZnQgY29ybmVyXG4gKiBAcHJvcGVydHkge2ludH0geSAtIHktY29vcmRpbmF0ZSBvZiB0b3AtbGVmdCBjb3JuZXJcbiAqIEBwcm9wZXJ0eSB7aW50fSB3aWR0aCAtIHdpZHRoIG9mIHJlY3RcbiAqIEBwcm9wZXJ0eSB7aW50fSBoZWlnaHQgLSBoZWlnaHQgb2YgcmVjdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gRGltZW5zaW9uXG4gKiBAcHJvcGVydHkge2ludH0gd2lkdGggLSB3aWR0aCBvZiByZWN0XG4gKiBAcHJvcGVydHkge2ludH0gaGVpZ2h0IC0gaGVpZ2h0IG9mIHJlY3RcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBvc2l0aW9uXG4gKiBAcHJvcGVydHkge2ludH0geCAtIHggY29vcmRpbmF0ZVxuICogQHByb3BlcnR5IHtpbnR9IHkgLSB5IGNvb3JkaW5hdGVcbiAqL1xuXG4vKipcbiAqIFJlcHJlc2VudGF0aW9uIG9mIGFuIFwiaW1hZ2UgZWxlbWVudFwiLCB3aGljaCBpcyBzaW1wbHkgYSBzZXQgb2YgY29vcmRpbmF0ZXNcbiAqIGFuZCBtZXRob2RzIHRoYXQgY2FuIGJlIHVzZWQgb24gdGhhdCBzZXQgb2YgY29vcmRpbmF0ZXMgdmlhIHRoZSBkcml2ZXJcbiAqL1xuY2xhc3MgSW1hZ2VFbGVtZW50IHtcblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGI2NFRlbXBsYXRlIC0gdGhlIGJhc2U2NC1lbmNvZGVkIGltYWdlIHdoaWNoIHdhcyB1c2VkIHRvXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmQgdGhpcyBJbWFnZUVsZW1lbnRcbiAgICogQHBhcmFtIHtSZWN0fSByZWN0IC0gYm91bmRzIG9mIG1hdGNoZWQgaW1hZ2UgZWxlbWVudFxuICAgKiBAcGFyYW0gez9zdHJpbmd9IGI2NFJlc3VsdCAtIHRoZSBiYXNlNjQtZW5jb2RlZCBpbWFnZSB3aGljaCBoYXMgbWF0Y2hlZCBtYXJrcy5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byBudWxsLlxuICAgKlxuICAgKiBAcmV0dXJucyB7SW1hZ2VFbGVtZW50fVxuICAgKi9cbiAgY29uc3RydWN0b3IgKGI2NFRlbXBsYXRlLCByZWN0LCBiNjRSZXN1bHQgPSBudWxsKSB7XG4gICAgdGhpcy50ZW1wbGF0ZSA9IGI2NFRlbXBsYXRlO1xuICAgIHRoaXMucmVjdCA9IHJlY3Q7XG4gICAgdGhpcy5pZCA9IGAke0lNQUdFX0VMRU1FTlRfUFJFRklYfSR7VVVJRC5jcmVhdGUoKS5oZXh9YDtcbiAgICB0aGlzLmI2NE1hdGNoZWRJbWFnZSA9IGI2NFJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7RGltZW5zaW9ufSAtIGRpbWVuc2lvbiBvZiBlbGVtZW50XG4gICAqL1xuICBnZXQgc2l6ZSAoKSB7XG4gICAgcmV0dXJuIHt3aWR0aDogdGhpcy5yZWN0LndpZHRoLCBoZWlnaHQ6IHRoaXMucmVjdC5oZWlnaHR9O1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQb3NpdGlvbn0gLSBjb29yZGluYXRlcyBvZiB0b3AtbGVmdCBjb3JuZXIgb2YgZWxlbWVudFxuICAgKi9cbiAgZ2V0IGxvY2F0aW9uICgpIHtcbiAgICByZXR1cm4ge3g6IHRoaXMucmVjdC54LCB5OiB0aGlzLnJlY3QueX07XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Bvc2l0aW9ufSAtIGNvb3JkaW5hdGVzIG9mIGNlbnRlciBvZiBlbGVtZW50XG4gICAqL1xuICBnZXQgY2VudGVyICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgeDogdGhpcy5yZWN0LnggKyB0aGlzLnJlY3Qud2lkdGggLyAyLFxuICAgICAgeTogdGhpcy5yZWN0LnkgKyB0aGlzLnJlY3QuaGVpZ2h0IC8gMixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHs/c3RyaW5nfSAtIHRoZSBiYXNlNjQtZW5jb2RlZCBpbWFnZSB3aGljaCBoYXMgbWF0Y2hlZCBtYXJrc1xuICAgKi9cbiAgZ2V0IG1hdGNoZWRJbWFnZSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuYjY0TWF0Y2hlZEltYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcm90b2NvbEtleSAtIHRoZSBwcm90b2NvbC1zcGVjaWZpYyBKU09OIGtleSBmb3JcbiAgICogYSBXZWJFbGVtZW50XG4gICAqXG4gICAqIEByZXR1cm5zIHtXZWJFbGVtZW50fSAtIHRoaXMgaW1hZ2UgZWxlbWVudCBhcyBhIFdlYkVsZW1lbnRcbiAgICovXG4gIGFzRWxlbWVudCAocHJvdG9jb2xLZXkpIHtcbiAgICByZXR1cm4ge1twcm90b2NvbEtleV06IHRoaXMuaWR9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SW1hZ2VFbGVtZW50fSBvdGhlciAtIGFuIEltYWdlRWxlbWVudCB0byBjb21wYXJlIHdpdGggdGhpcyBvbmVcbiAgICpcbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gd2hldGhlciB0aGUgb3RoZXIgZWxlbWVudCBhbmQgdGhpcyBvbmUgaGF2ZSB0aGUgc2FtZVxuICAgKiBwcm9wZXJ0aWVzXG4gICAqL1xuICBlcXVhbHMgKG90aGVyKSB7XG4gICAgcmV0dXJuIHRoaXMucmVjdC54ID09PSBvdGhlci5yZWN0LnggJiZcbiAgICAgICAgICAgdGhpcy5yZWN0LnkgPT09IG90aGVyLnJlY3QueSAmJlxuICAgICAgICAgICB0aGlzLnJlY3Qud2lkdGggPT09IG90aGVyLnJlY3Qud2lkdGggJiZcbiAgICAgICAgICAgdGhpcy5yZWN0LmhlaWdodCA9PT0gb3RoZXIucmVjdC5oZWlnaHQ7XG4gIH1cblxuICAvKipcbiAgICogVXNlIGEgZHJpdmVyIHRvIHRhcCB0aGUgc2NyZWVuIGF0IHRoZSBjZW50ZXIgb2YgdGhpcyBJbWFnZUVsZW1lbnQnc1xuICAgKiBwb3NpdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge0Jhc2VEcml2ZXJ9IGRyaXZlciAtIGRyaXZlciBmb3IgY2FsbGluZyBhY3Rpb25zIHdpdGhcbiAgICovXG4gIGFzeW5jIGNsaWNrIChkcml2ZXIpIHtcbiAgICAvLyBiZWZvcmUgd2UgY2xpY2sgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlIGVsZW1lbnQgaXMgYWN0dWFsbHkgc3RpbGwgdGhlcmVcbiAgICAvLyB3aGVyZSB3ZSBleHBlY3QgaXQgdG8gYmVcbiAgICBsZXQgbmV3SW1nRWw7XG4gICAgY29uc3Qge1xuICAgICAgYXV0b1VwZGF0ZUltYWdlRWxlbWVudFBvc2l0aW9uOiB1cGRhdGVQb3MsXG4gICAgICBjaGVja0ZvckltYWdlRWxlbWVudFN0YWxlbmVzcyxcbiAgICAgIGltYWdlRWxlbWVudFRhcFN0cmF0ZWd5LFxuICAgIH0gPSBkcml2ZXIuc2V0dGluZ3MuZ2V0U2V0dGluZ3MoKTtcblxuICAgIC8vIHZhbGlkYXRlIHRhcCBzdHJhdGVneVxuICAgIGlmICghSU1BR0VfVEFQX1NUUkFURUdJRVMuaW5jbHVkZXMoaW1hZ2VFbGVtZW50VGFwU3RyYXRlZ3kpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEluY29ycmVjdCBpbWFnZUVsZW1lbnRUYXBTdHJhdGVneSBzZXR0aW5nIGAgK1xuICAgICAgICAgICAgICAgICAgICAgIGAnJHtpbWFnZUVsZW1lbnRUYXBTdHJhdGVneX0nLiBNdXN0IGJlIG9uZSBvZiBgICtcbiAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShJTUFHRV9UQVBfU1RSQVRFR0lFUykpO1xuICAgIH1cblxuICAgIGlmIChjaGVja0ZvckltYWdlRWxlbWVudFN0YWxlbmVzcyB8fCB1cGRhdGVQb3MpIHtcbiAgICAgIGxvZy5pbmZvKCdDaGVja2luZyBpbWFnZSBlbGVtZW50IGZvciBzdGFsZW5lc3MgYmVmb3JlIGNsaWNraW5nJyk7XG4gICAgICB0cnkge1xuICAgICAgICBuZXdJbWdFbCA9IGF3YWl0IGRyaXZlci5maW5kQnlJbWFnZSh0aGlzLnRlbXBsYXRlLCB7XG4gICAgICAgICAgc2hvdWxkQ2hlY2tTdGFsZW5lc3M6IHRydWUsXG4gICAgICAgICAgLy8gU2V0IGlnbm9yZURlZmF1bHRJbWFnZVRlbXBsYXRlU2NhbGUgYmVjYXVzZSB0aGlzLnRlbXBsYXRlIGlzIGRldmljZSBzY3JlZW5zaG90IGJhc2VkIGltYWdlXG4gICAgICAgICAgLy8gbWFuYWdlZCBpbnNpZGUgQXBwaXVtIGFmdGVyIGZpbmlkbmcgaW1hZ2UgYnkgdGVtcGxhdGUgd2hpY2ggbWFuYWdlZCBieSBhIHVzZXJcbiAgICAgICAgICBpZ25vcmVEZWZhdWx0SW1hZ2VUZW1wbGF0ZVNjYWxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3IoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLmVxdWFscyhuZXdJbWdFbCkpIHtcbiAgICAgICAgbG9nLndhcm4oYFdoZW4gdHJ5aW5nIHRvIGNsaWNrIG9uIGFuIGltYWdlIGVsZW1lbnQsIHRoZSBpbWFnZSBjaGFuZ2VkIGAgK1xuICAgICAgICAgICAgICAgICBgcG9zaXRpb24gZnJvbSB3aGVyZSBpdCB3YXMgb3JpZ2luYWxseSBmb3VuZC4gSXQgaXMgbm93IGF0IGAgK1xuICAgICAgICAgICAgICAgICBgJHtKU09OLnN0cmluZ2lmeShuZXdJbWdFbC5yZWN0KX0gYW5kIHdhcyBvcmlnaW5hbGx5IGF0IGAgK1xuICAgICAgICAgICAgICAgICBgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnJlY3QpfS5gKTtcbiAgICAgICAgaWYgKHVwZGF0ZVBvcykge1xuICAgICAgICAgIGxvZy53YXJuKCdDbGljayB3aWxsIHByb2NlZWQgYXQgbmV3IGNvb3JkaW5hdGVzJyk7XG4gICAgICAgICAgdGhpcy5yZWN0ID0gXy5jbG9uZShuZXdJbWdFbC5yZWN0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2cud2FybignQ2xpY2sgd2lsbCB0YWtlIHBsYWNlIGF0IG9yaWdpbmFsIGNvb3JkaW5hdGVzLiBJZiB5b3UgJyArXG4gICAgICAgICAgICAgICAgICAgJ3dvdWxkIGxpa2UgQXBwaXVtIHRvIGF1dG9tYXRpY2FsbHkgY2xpY2sgdGhlIG5ldyAnICtcbiAgICAgICAgICAgICAgICAgICBcImNvb3JkaW5hdGVzLCBzZXQgdGhlICdhdXRvVXBkYXRlSW1hZ2VFbGVtZW50UG9zaXRpb24nIFwiICtcbiAgICAgICAgICAgICAgICAgICAnc2V0dGluZyB0byB0cnVlJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB7eCwgeX0gPSB0aGlzLmNlbnRlcjtcbiAgICBsb2cuaW5mbyhgV2lsbCB0YXAgb24gaW1hZ2UgZWxlbWVudCBhdCBjb29yZGluYXRlIFske3h9LCAke3l9XWApO1xuXG4gICAgaWYgKGltYWdlRWxlbWVudFRhcFN0cmF0ZWd5ID09PSBJTUFHRV9FTF9UQVBfU1RSQVRFR1lfVzNDKSB7XG4gICAgICAvLyBzZXQgdXAgYSBXM0MgYWN0aW9uIHRvIGNsaWNrIG9uIHRoZSBpbWFnZSBieSBwb3NpdGlvblxuICAgICAgbG9nLmluZm8oJ1dpbGwgdGFwIHVzaW5nIFczQyBhY3Rpb25zJyk7XG4gICAgICBjb25zdCBhY3Rpb24gPSB7XG4gICAgICAgIHR5cGU6ICdwb2ludGVyJyxcbiAgICAgICAgaWQ6ICdtb3VzZScsXG4gICAgICAgIHBhcmFtZXRlcnM6IHtwb2ludGVyVHlwZTogJ3RvdWNoJ30sXG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICB7dHlwZTogJ3BvaW50ZXJNb3ZlJywgeCwgeSwgZHVyYXRpb246IDB9LFxuICAgICAgICAgIHt0eXBlOiAncG9pbnRlckRvd24nfSxcbiAgICAgICAgICB7dHlwZTogJ3BhdXNlJywgZHVyYXRpb246IFRBUF9EVVJBVElPTl9NU30sXG4gICAgICAgICAge3R5cGU6ICdwb2ludGVyVXAnfSxcbiAgICAgICAgXVxuICAgICAgfTtcblxuICAgICAgLy8gY2hlY2sgaWYgdGhlIGRyaXZlciBoYXMgdGhlIGFwcHJvcHJpYXRlIHBlcmZvcm1BY3Rpb25zIG1ldGhvZFxuICAgICAgaWYgKGRyaXZlci5wZXJmb3JtQWN0aW9ucykge1xuICAgICAgICByZXR1cm4gYXdhaXQgZHJpdmVyLnBlcmZvcm1BY3Rpb25zKFthY3Rpb25dKTtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgbm90LCB3YXJuIGFuZCBmYWxsIGJhY2sgdG8gdGhlIG90aGVyIG1ldGhvZFxuICAgICAgbG9nLndhcm4oJ0RyaXZlciBkb2VzIG5vdCBzZWVtIHRvIGltcGxlbWVudCBXM0MgYWN0aW9ucywgZmFsbGluZyBiYWNrICcgK1xuICAgICAgICAgICAgICAgJ3RvIFRvdWNoQWN0aW9ucycpO1xuICAgIH1cblxuICAgIC8vIGlmIHRoZSB3M2Mgc3RyYXRlZ3kgd2FzIG5vdCByZXF1ZXN0ZWQsIGRvIHRoZSBvbmx5IG90aGVyIG9wdGlvbiAobWpzb253cFxuICAgIC8vIHRvdWNoIGFjdGlvbnMpXG4gICAgbG9nLmluZm8oJ1dpbGwgdGFwIHVzaW5nIE1KU09OV1AgVG91Y2hBY3Rpb25zJyk7XG4gICAgY29uc3QgYWN0aW9uID0ge1xuICAgICAgYWN0aW9uOiAndGFwJyxcbiAgICAgIG9wdGlvbnM6IHt4LCB5fVxuICAgIH07XG5cbiAgICBpZiAoZHJpdmVyLnBlcmZvcm1Ub3VjaCkge1xuICAgICAgcmV0dXJuIGF3YWl0IGRyaXZlci5wZXJmb3JtVG91Y2goW2FjdGlvbl0pO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcIkRyaXZlciBkaWQgbm90IGltcGxlbWVudCB0aGUgJ3BlcmZvcm1Ub3VjaCcgY29tbWFuZC4gXCIgK1xuICAgICAgICAgICAgICAgICAgICAnRm9yIGRyaXZlcnMgdG8gc3VwcG9ydCBmaW5kaW5nIGltYWdlIGVsZW1lbnRzLCB0aGV5ICcgK1xuICAgICAgICAgICAgICAgICAgICBcInNob3VsZCBzdXBwb3J0ICdwZXJmb3JtVG91Y2gnIGFuZCAncGVyZm9ybUFjdGlvbnMnXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB2YXJpb3VzIEFwcGl1bSBjb21tYW5kcyB0aGF0IGludm9sdmUgYW4gaW1hZ2UgZWxlbWVudFxuICAgKlxuICAgKiBAcGFyYW0ge0Jhc2VEcml2ZXJ9IGRyaXZlciAtIHRoZSBkcml2ZXIgdG8gdXNlIGZvciBjb21tYW5kc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY21kIC0gdGhlIG5hbWUgb2YgdGhlIGRyaXZlciBjb21tYW5kXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbWdFbElkIC0gdGhlIGlkIG9mIHRoZSBJbWFnZUVsZW1lbnQgdG8gd29yayB3aXRoXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgLSBSZXN0IG9mIGFyZ3VtZW50cyBmb3IgZXhlY3V0ZVNjcmlwdHNcbiAgICpcbiAgICogQHJldHVybnMge09iamVjdH0gLSB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgYSBjb21tYW5kXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZXhlY3V0ZSAoZHJpdmVyLCBjbWQsIGltZ0VsSWQsIC4uLmFyZ3MpIHtcbiAgICBpZiAoIWRyaXZlci5faW1nRWxDYWNoZS5oYXMoaW1nRWxJZCkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuTm9TdWNoRWxlbWVudEVycm9yKCk7XG4gICAgfVxuXG4gICAgY29uc3QgaW1nRWwgPSBkcml2ZXIuX2ltZ0VsQ2FjaGUuZ2V0KGltZ0VsSWQpO1xuXG4gICAgc3dpdGNoIChjbWQpIHtcbiAgICAgIGNhc2UgJ2NsaWNrJzpcbiAgICAgICAgcmV0dXJuIGF3YWl0IGltZ0VsLmNsaWNrKGRyaXZlcik7XG4gICAgICBjYXNlICdlbGVtZW50RGlzcGxheWVkJzpcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBjYXNlICdnZXRTaXplJzpcbiAgICAgICAgcmV0dXJuIGltZ0VsLnNpemU7XG4gICAgICBjYXNlICdnZXRMb2NhdGlvbic6XG4gICAgICBjYXNlICdnZXRMb2NhdGlvbkluVmlldyc6XG4gICAgICAgIHJldHVybiBpbWdFbC5sb2NhdGlvbjtcbiAgICAgIGNhc2UgJ2dldEVsZW1lbnRSZWN0JzpcbiAgICAgICAgcmV0dXJuIGltZ0VsLnJlY3Q7XG4gICAgICBjYXNlICdnZXRBdHRyaWJ1dGUnOlxuICAgICAgICAvLyAvd2QvaHViL3Nlc3Npb24vOnNlc3Npb25JZC9lbGVtZW50LzplbGVtZW50SWQvYXR0cmlidXRlLzpuYW1lXG4gICAgICAgIC8vIC93ZC9odWIvc2Vzc2lvbi86c2Vzc2lvbklkL2VsZW1lbnQvOmVsZW1lbnRJZC9hdHRyaWJ1dGUvdmlzdWFsIHNob3VsZCByZXR1biB0aGUgdmlzdWFsIGRhdGFcbiAgICAgICAgLy8gZS5nLiBbXCJjb250ZW50LWRlc2NcIixcImFwcGl1bS1pbWFnZS1lbGVtZW50LXh4eHh4XCIsXCJ4eHh4eFwiXSwgW1widmlzdWFsXCIsXCJhcHBpdW0taW1hZ2UtZWxlbWVudC14eHh4eFwiLFwieHh4eHhcIl1cbiAgICAgICAgaWYgKGFyZ3NbMF0gPT09ICd2aXN1YWwnKSB7XG4gICAgICAgICAgcmV0dXJuIGltZ0VsLm1hdGNoZWRJbWFnZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLk5vdFlldEltcGxlbWVudGVkRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDogdGhyb3cgbmV3IGVycm9ycy5Ob3RZZXRJbXBsZW1lbnRlZEVycm9yKCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1ha2VJbWFnZUVsZW1lbnRDYWNoZSAobWF4ID0gTUFYX0NBQ0hFX1NJWkUpIHtcbiAgcmV0dXJuIG5ldyBMUlUoe1xuICAgIG1heCxcbiAgICBsZW5ndGg6IChlbCkgPT4gZWwudGVtcGxhdGUubGVuZ3RoLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0SW1nRWxGcm9tQXJncyAoYXJncykge1xuICBmb3IgKGxldCBhcmcgb2YgYXJncykge1xuICAgIGlmIChfLmlzU3RyaW5nKGFyZykgJiYgYXJnLnN0YXJ0c1dpdGgoSU1BR0VfRUxFTUVOVF9QUkVGSVgpKSB7XG4gICAgICByZXR1cm4gYXJnO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQge1xuICBJbWFnZUVsZW1lbnQsIGdldEltZ0VsRnJvbUFyZ3MsIG1ha2VJbWFnZUVsZW1lbnRDYWNoZSxcbiAgSU1BR0VfRUxfVEFQX1NUUkFURUdZX01KU09OV1AsIElNQUdFX0VMX1RBUF9TVFJBVEVHWV9XM0MsXG4gIERFRkFVTFRfVEVNUExBVEVfSU1BR0VfU0NBTEVcbn07XG4iXSwiZmlsZSI6ImxpYi9iYXNlZHJpdmVyL2ltYWdlLWVsZW1lbnQuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==