UNPKG

webdriverio-automation

Version:

WebdriverIO-Automation android ios project

200 lines (150 loc) 21.2 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.helpers = exports.commands = void 0; require("source-map-support/register"); var _logger = _interopRequireDefault(require("../logger")); var _asyncbox = require("asyncbox"); var _bluebird = _interopRequireDefault(require("bluebird")); var _lodash = _interopRequireDefault(require("lodash")); var _appiumSupport = require("appium-support"); var _protocol = require("../../protocol"); let commands = {}, helpers = {}, extensions = {}; exports.helpers = helpers; exports.commands = commands; const MIN_TIMEOUT = 0; commands.timeouts = async function timeouts(type, ms, script, pageLoad, implicit) { if (_appiumSupport.util.hasValue(type) && _appiumSupport.util.hasValue(ms)) { _logger.default.debug(`MJSONWP timeout arguments: ${JSON.stringify({ type, ms })}}`); switch (type) { case 'command': await this.newCommandTimeout(ms); return; case 'implicit': await this.implicitWaitMJSONWP(ms); return; case 'page load': await this.pageLoadTimeoutMJSONWP(ms); return; case 'script': await this.scriptTimeoutMJSONWP(ms); return; default: throw new Error(`'${type}' type is not supported for MJSONWP timeout`); } } _logger.default.debug(`W3C timeout argument: ${JSON.stringify({ script, pageLoad, implicit })}}`); if (_appiumSupport.util.hasValue(script)) { await this.scriptTimeoutW3C(script); } if (_appiumSupport.util.hasValue(pageLoad)) { await this.pageLoadTimeoutW3C(pageLoad); } if (_appiumSupport.util.hasValue(implicit)) { await this.implicitWaitW3C(implicit); } }; commands.getTimeouts = async function getTimeouts() { return { command: this.newCommandTimeoutMs, implicit: this.implicitWaitMs }; }; commands.implicitWaitW3C = async function implicitWaitW3C(ms) { await this.implicitWait(ms); }; commands.implicitWaitMJSONWP = async function implicitWaitMJSONWP(ms) { await this.implicitWait(ms); }; commands.implicitWait = async function implicitWait(ms) { await this.setImplicitWait(this.parseTimeoutArgument(ms)); }; helpers.setImplicitWait = function setImplicitWait(ms) { this.implicitWaitMs = ms; _logger.default.debug(`Set implicit wait to ${ms}ms`); if (this.managedDrivers && this.managedDrivers.length) { _logger.default.debug('Setting implicit wait on managed drivers'); for (let driver of this.managedDrivers) { if (_lodash.default.isFunction(driver.setImplicitWait)) { driver.setImplicitWait(ms); } } } }; commands.pageLoadTimeoutW3C = async function pageLoadTimeoutW3C(ms) { throw new _protocol.errors.NotImplementedError('Not implemented yet for pageLoad.'); }; commands.pageLoadTimeoutMJSONWP = async function pageLoadTimeoutMJSONWP(ms) { throw new _protocol.errors.NotImplementedError('Not implemented yet for pageLoad.'); }; commands.scriptTimeoutW3C = async function scriptTimeoutW3C(ms) { throw new _protocol.errors.NotImplementedError('Not implemented yet for script.'); }; commands.scriptTimeoutMJSONWP = async function scriptTimeoutMJSONWP(ms) { throw new _protocol.errors.NotImplementedError('Not implemented yet for script.'); }; commands.newCommandTimeout = async function newCommandTimeout(ms) { this.setNewCommandTimeout(this.parseTimeoutArgument(ms)); }; helpers.setNewCommandTimeout = function setNewCommandTimeout(ms) { this.newCommandTimeoutMs = ms; _logger.default.debug(`Set new command timeout to ${ms}ms`); if (this.managedDrivers && this.managedDrivers.length) { _logger.default.debug('Setting new command timeout on managed drivers'); for (let driver of this.managedDrivers) { if (_lodash.default.isFunction(driver.setNewCommandTimeout)) { driver.setNewCommandTimeout(ms); } } } }; helpers.clearNewCommandTimeout = function clearNewCommandTimeout() { if (this.noCommandTimer) { this.noCommandTimer.cancel(); this.noCommandTimer = null; } }; helpers.startNewCommandTimeout = function startNewCommandTimeout() { this.clearNewCommandTimeout(); if (!this.newCommandTimeoutMs) return; this.noCommandTimer = _appiumSupport.util.cancellableDelay(this.newCommandTimeoutMs); this.noCommandTimer.then(async () => { _logger.default.warn(`Shutting down because we waited ` + `${this.newCommandTimeoutMs / 1000} seconds for a command`); let errorMessage = `New Command Timeout of ` + `${this.newCommandTimeoutMs / 1000} seconds ` + `expired. Try customizing the timeout using the ` + `'newCommandTimeout' desired capability`; await this.startUnexpectedShutdown(new Error(errorMessage)); }).catch(_bluebird.default.CancellationError, () => {}); }; helpers.implicitWaitForCondition = async function implicitWaitForCondition(condFn) { _logger.default.debug(`Waiting up to ${this.implicitWaitMs} ms for condition`); let wrappedCondFn = async (...args) => { this.clearNewCommandTimeout(); return await condFn(...args); }; return await (0, _asyncbox.waitForCondition)(wrappedCondFn, { waitMs: this.implicitWaitMs, intervalMs: 500, logger: _logger.default }); }; helpers.parseTimeoutArgument = function parseTimeoutArgument(ms) { let duration = parseInt(ms, 10); if (_lodash.default.isNaN(duration) || duration < MIN_TIMEOUT) { throw new _protocol.errors.UnknownError(`Invalid timeout value '${ms}'`); } return duration; }; Object.assign(extensions, commands, helpers); var _default = extensions; exports.default = _default;require('source-map-support').install(); //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9iYXNlZHJpdmVyL2NvbW1hbmRzL3RpbWVvdXQuanMiXSwibmFtZXMiOlsiY29tbWFuZHMiLCJoZWxwZXJzIiwiZXh0ZW5zaW9ucyIsIk1JTl9USU1FT1VUIiwidGltZW91dHMiLCJ0eXBlIiwibXMiLCJzY3JpcHQiLCJwYWdlTG9hZCIsImltcGxpY2l0IiwidXRpbCIsImhhc1ZhbHVlIiwibG9nIiwiZGVidWciLCJKU09OIiwic3RyaW5naWZ5IiwibmV3Q29tbWFuZFRpbWVvdXQiLCJpbXBsaWNpdFdhaXRNSlNPTldQIiwicGFnZUxvYWRUaW1lb3V0TUpTT05XUCIsInNjcmlwdFRpbWVvdXRNSlNPTldQIiwiRXJyb3IiLCJzY3JpcHRUaW1lb3V0VzNDIiwicGFnZUxvYWRUaW1lb3V0VzNDIiwiaW1wbGljaXRXYWl0VzNDIiwiZ2V0VGltZW91dHMiLCJjb21tYW5kIiwibmV3Q29tbWFuZFRpbWVvdXRNcyIsImltcGxpY2l0V2FpdE1zIiwiaW1wbGljaXRXYWl0Iiwic2V0SW1wbGljaXRXYWl0IiwicGFyc2VUaW1lb3V0QXJndW1lbnQiLCJtYW5hZ2VkRHJpdmVycyIsImxlbmd0aCIsImRyaXZlciIsIl8iLCJpc0Z1bmN0aW9uIiwiZXJyb3JzIiwiTm90SW1wbGVtZW50ZWRFcnJvciIsInNldE5ld0NvbW1hbmRUaW1lb3V0IiwiY2xlYXJOZXdDb21tYW5kVGltZW91dCIsIm5vQ29tbWFuZFRpbWVyIiwiY2FuY2VsIiwic3RhcnROZXdDb21tYW5kVGltZW91dCIsImNhbmNlbGxhYmxlRGVsYXkiLCJ0aGVuIiwid2FybiIsImVycm9yTWVzc2FnZSIsInN0YXJ0VW5leHBlY3RlZFNodXRkb3duIiwiY2F0Y2giLCJCIiwiQ2FuY2VsbGF0aW9uRXJyb3IiLCJpbXBsaWNpdFdhaXRGb3JDb25kaXRpb24iLCJjb25kRm4iLCJ3cmFwcGVkQ29uZEZuIiwiYXJncyIsIndhaXRNcyIsImludGVydmFsTXMiLCJsb2dnZXIiLCJkdXJhdGlvbiIsInBhcnNlSW50Iiwi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QyxNQUFQLENBQWM3RCxVQUFkLEVBQTBCRixRQUExQixFQUFvQ0MsT0FBcEM7ZUFFZUMsVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBsb2cgZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCB7IHdhaXRGb3JDb25kaXRpb24gfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ2FwcGl1bS1zdXBwb3J0JztcbmltcG9ydCB7IGVycm9ycyB9IGZyb20gJy4uLy4uL3Byb3RvY29sJztcblxuXG5sZXQgY29tbWFuZHMgPSB7fSwgaGVscGVycyA9IHt9LCBleHRlbnNpb25zID0ge307XG5cbmNvbnN0IE1JTl9USU1FT1VUID0gMDtcblxuY29tbWFuZHMudGltZW91dHMgPSBhc3luYyBmdW5jdGlvbiB0aW1lb3V0cyAodHlwZSwgbXMsIHNjcmlwdCwgcGFnZUxvYWQsIGltcGxpY2l0KSB7XG4gIGlmICh1dGlsLmhhc1ZhbHVlKHR5cGUpICYmIHV0aWwuaGFzVmFsdWUobXMpKSB7XG4gICAgbG9nLmRlYnVnKGBNSlNPTldQIHRpbWVvdXQgYXJndW1lbnRzOiAke0pTT04uc3RyaW5naWZ5KHt0eXBlLCBtc30pfX1gKTtcblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnY29tbWFuZCc6XG4gICAgICAgIGF3YWl0IHRoaXMubmV3Q29tbWFuZFRpbWVvdXQobXMpO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlICdpbXBsaWNpdCc6XG4gICAgICAgIGF3YWl0IHRoaXMuaW1wbGljaXRXYWl0TUpTT05XUChtcyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIGNhc2UgJ3BhZ2UgbG9hZCc6XG4gICAgICAgIGF3YWl0IHRoaXMucGFnZUxvYWRUaW1lb3V0TUpTT05XUChtcyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIGNhc2UgJ3NjcmlwdCc6XG4gICAgICAgIGF3YWl0IHRoaXMuc2NyaXB0VGltZW91dE1KU09OV1AobXMpO1xuICAgICAgICByZXR1cm47XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke3R5cGV9JyB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIE1KU09OV1AgdGltZW91dGApO1xuICAgIH1cbiAgfVxuXG4gIC8vIE90aGVyd2lzZSBhc3N1bWUgaXQgaXMgVzNDIHByb3RvY29sXG4gIGxvZy5kZWJ1ZyhgVzNDIHRpbWVvdXQgYXJndW1lbnQ6ICR7SlNPTi5zdHJpbmdpZnkoe3NjcmlwdCwgcGFnZUxvYWQsIGltcGxpY2l0fSl9fWApO1xuICBpZiAodXRpbC5oYXNWYWx1ZShzY3JpcHQpKSB7XG4gICAgYXdhaXQgdGhpcy5zY3JpcHRUaW1lb3V0VzNDKHNjcmlwdCk7XG4gIH1cbiAgaWYgKHV0aWwuaGFzVmFsdWUocGFnZUxvYWQpKSB7XG4gICAgYXdhaXQgdGhpcy5wYWdlTG9hZFRpbWVvdXRXM0MocGFnZUxvYWQpO1xuICB9XG4gIGlmICh1dGlsLmhhc1ZhbHVlKGltcGxpY2l0KSkge1xuICAgIGF3YWl0IHRoaXMuaW1wbGljaXRXYWl0VzNDKGltcGxpY2l0KTtcbiAgfVxufTtcblxuY29tbWFuZHMuZ2V0VGltZW91dHMgPSBhc3luYyBmdW5jdGlvbiBnZXRUaW1lb3V0cyAoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1hd2FpdFxuICByZXR1cm4ge1xuICAgIGNvbW1hbmQ6IHRoaXMubmV3Q29tbWFuZFRpbWVvdXRNcyxcbiAgICBpbXBsaWNpdDogdGhpcy5pbXBsaWNpdFdhaXRNcyxcbiAgfTtcbn07XG5cbi8vIGltcGxpY2l0XG5jb21tYW5kcy5pbXBsaWNpdFdhaXRXM0MgPSBhc3luYyBmdW5jdGlvbiBpbXBsaWNpdFdhaXRXM0MgKG1zKSB7XG4gIGF3YWl0IHRoaXMuaW1wbGljaXRXYWl0KG1zKTtcbn07XG5cbmNvbW1hbmRzLmltcGxpY2l0V2FpdE1KU09OV1AgPSBhc3luYyBmdW5jdGlvbiBpbXBsaWNpdFdhaXRNSlNPTldQIChtcykge1xuICBhd2FpdCB0aGlzLmltcGxpY2l0V2FpdChtcyk7XG59O1xuXG5jb21tYW5kcy5pbXBsaWNpdFdhaXQgPSBhc3luYyBmdW5jdGlvbiBpbXBsaWNpdFdhaXQgKG1zKSB7XG4gIGF3YWl0IHRoaXMuc2V0SW1wbGljaXRXYWl0KHRoaXMucGFyc2VUaW1lb3V0QXJndW1lbnQobXMpKTtcbn07XG5cbmhlbHBlcnMuc2V0SW1wbGljaXRXYWl0ID0gZnVuY3Rpb24gc2V0SW1wbGljaXRXYWl0IChtcykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtYXdhaXRcbiAgdGhpcy5pbXBsaWNpdFdhaXRNcyA9IG1zO1xuICBsb2cuZGVidWcoYFNldCBpbXBsaWNpdCB3YWl0IHRvICR7bXN9bXNgKTtcbiAgaWYgKHRoaXMubWFuYWdlZERyaXZlcnMgJiYgdGhpcy5tYW5hZ2VkRHJpdmVycy5sZW5ndGgpIHtcbiAgICBsb2cuZGVidWcoJ1NldHRpbmcgaW1wbGljaXQgd2FpdCBvbiBtYW5hZ2VkIGRyaXZlcnMnKTtcbiAgICBmb3IgKGxldCBkcml2ZXIgb2YgdGhpcy5tYW5hZ2VkRHJpdmVycykge1xuICAgICAgaWYgKF8uaXNGdW5jdGlvbihkcml2ZXIuc2V0SW1wbGljaXRXYWl0KSkge1xuICAgICAgICBkcml2ZXIuc2V0SW1wbGljaXRXYWl0KG1zKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbi8vIHBhZ2VMb2FkXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbmNvbW1hbmRzLnBhZ2VMb2FkVGltZW91dFczQyA9IGFzeW5jIGZ1bmN0aW9uIHBhZ2VMb2FkVGltZW91dFczQyAobXMpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWF3YWl0XG4gIHRocm93IG5ldyBlcnJvcnMuTm90SW1wbGVtZW50ZWRFcnJvcignTm90IGltcGxlbWVudGVkIHlldCBmb3IgcGFnZUxvYWQuJyk7XG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbmNvbW1hbmRzLnBhZ2VMb2FkVGltZW91dE1KU09OV1AgPSBhc3luYyBmdW5jdGlvbiBwYWdlTG9hZFRpbWVvdXRNSlNPTldQIChtcykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtYXdhaXRcbiAgdGhyb3cgbmV3IGVycm9ycy5Ob3RJbXBsZW1lbnRlZEVycm9yKCdOb3QgaW1wbGVtZW50ZWQgeWV0IGZvciBwYWdlTG9hZC4nKTtcbn07XG5cbi8vIHNjcmlwdFxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5jb21tYW5kcy5zY3JpcHRUaW1lb3V0VzNDID0gYXN5bmMgZnVuY3Rpb24gc2NyaXB0VGltZW91dFczQyAobXMpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWF3YWl0XG4gIHRocm93IG5ldyBlcnJvcnMuTm90SW1wbGVtZW50ZWRFcnJvcignTm90IGltcGxlbWVudGVkIHlldCBmb3Igc2NyaXB0LicpO1xufTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5jb21tYW5kcy5zY3JpcHRUaW1lb3V0TUpTT05XUCA9IGFzeW5jIGZ1bmN0aW9uIHNjcmlwdFRpbWVvdXRNSlNPTldQIChtcykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtYXdhaXRcbiAgdGhyb3cgbmV3IGVycm9ycy5Ob3RJbXBsZW1lbnRlZEVycm9yKCdOb3QgaW1wbGVtZW50ZWQgeWV0IGZvciBzY3JpcHQuJyk7XG59O1xuXG4vLyBjb21tYW5kXG5jb21tYW5kcy5uZXdDb21tYW5kVGltZW91dCA9IGFzeW5jIGZ1bmN0aW9uIG5ld0NvbW1hbmRUaW1lb3V0IChtcykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtYXdhaXRcbiAgdGhpcy5zZXROZXdDb21tYW5kVGltZW91dCh0aGlzLnBhcnNlVGltZW91dEFyZ3VtZW50KG1zKSk7XG59O1xuXG5oZWxwZXJzLnNldE5ld0NvbW1hbmRUaW1lb3V0ID0gZnVuY3Rpb24gc2V0TmV3Q29tbWFuZFRpbWVvdXQgKG1zKSB7XG4gIHRoaXMubmV3Q29tbWFuZFRpbWVvdXRNcyA9IG1zO1xuICBsb2cuZGVidWcoYFNldCBuZXcgY29tbWFuZCB0aW1lb3V0IHRvICR7bXN9bXNgKTtcbiAgaWYgKHRoaXMubWFuYWdlZERyaXZlcnMgJiYgdGhpcy5tYW5hZ2VkRHJpdmVycy5sZW5ndGgpIHtcbiAgICBsb2cuZGVidWcoJ1NldHRpbmcgbmV3IGNvbW1hbmQgdGltZW91dCBvbiBtYW5hZ2VkIGRyaXZlcnMnKTtcbiAgICBmb3IgKGxldCBkcml2ZXIgb2YgdGhpcy5tYW5hZ2VkRHJpdmVycykge1xuICAgICAgaWYgKF8uaXNGdW5jdGlvbihkcml2ZXIuc2V0TmV3Q29tbWFuZFRpbWVvdXQpKSB7XG4gICAgICAgIGRyaXZlci5zZXROZXdDb21tYW5kVGltZW91dChtcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5oZWxwZXJzLmNsZWFyTmV3Q29tbWFuZFRpbWVvdXQgPSBmdW5jdGlvbiBjbGVhck5ld0NvbW1hbmRUaW1lb3V0ICgpIHtcbiAgaWYgKHRoaXMubm9Db21tYW5kVGltZXIpIHtcbiAgICB0aGlzLm5vQ29tbWFuZFRpbWVyLmNhbmNlbCgpO1xuICAgIHRoaXMubm9Db21tYW5kVGltZXIgPSBudWxsO1xuICB9XG59O1xuXG5oZWxwZXJzLnN0YXJ0TmV3Q29tbWFuZFRpbWVvdXQgPSBmdW5jdGlvbiBzdGFydE5ld0NvbW1hbmRUaW1lb3V0ICgpIHtcbiAgLy8gbWFrZSBzdXJlIHRoZXJlIGFyZSBubyByb2d1ZSB0aW1lb3V0c1xuICB0aGlzLmNsZWFyTmV3Q29tbWFuZFRpbWVvdXQoKTtcblxuICAvLyBpZiBjb21tYW5kIHRpbWVvdXQgaXMgMCwgaXQgaXMgZGlzYWJsZWRcbiAgaWYgKCF0aGlzLm5ld0NvbW1hbmRUaW1lb3V0TXMpIHJldHVybjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjdXJseVxuXG4gIHRoaXMubm9Db21tYW5kVGltZXIgPSB1dGlsLmNhbmNlbGxhYmxlRGVsYXkodGhpcy5uZXdDb21tYW5kVGltZW91dE1zKTtcbiAgdGhpcy5ub0NvbW1hbmRUaW1lclxuICAgIC50aGVuKGFzeW5jICgpID0+IHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBwcm9taXNlL3ByZWZlci1hd2FpdC10by10aGVuXG4gICAgICBsb2cud2FybihgU2h1dHRpbmcgZG93biBiZWNhdXNlIHdlIHdhaXRlZCBgICtcbiAgICAgICAgICAgICAgIGAke3RoaXMubmV3Q29tbWFuZFRpbWVvdXRNcyAvIDEwMDB9IHNlY29uZHMgZm9yIGEgY29tbWFuZGApO1xuICAgICAgbGV0IGVycm9yTWVzc2FnZSA9IGBOZXcgQ29tbWFuZCBUaW1lb3V0IG9mIGAgK1xuICAgICAgICAgICAgICAgYCR7dGhpcy5uZXdDb21tYW5kVGltZW91dE1zIC8gMTAwMH0gc2Vjb25kcyBgICtcbiAgICAgICAgICAgICAgIGBleHBpcmVkLiBUcnkgY3VzdG9taXppbmcgdGhlIHRpbWVvdXQgdXNpbmcgdGhlIGAgK1xuICAgICAgICAgICAgICAgYCduZXdDb21tYW5kVGltZW91dCcgZGVzaXJlZCBjYXBhYmlsaXR5YDtcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRVbmV4cGVjdGVkU2h1dGRvd24obmV3IEVycm9yKGVycm9yTWVzc2FnZSkpO1xuICAgIH0pXG4gICAgLmNhdGNoKEIuQ2FuY2VsbGF0aW9uRXJyb3IsICgvKmVyciovKSA9PiB7XG4gICAgICAvLyBpZ25vcmVcbiAgICB9KTtcbn07XG5cbmhlbHBlcnMuaW1wbGljaXRXYWl0Rm9yQ29uZGl0aW9uID0gYXN5bmMgZnVuY3Rpb24gaW1wbGljaXRXYWl0Rm9yQ29uZGl0aW9uIChjb25kRm4pIHtcbiAgbG9nLmRlYnVnKGBXYWl0aW5nIHVwIHRvICR7dGhpcy5pbXBsaWNpdFdhaXRNc30gbXMgZm9yIGNvbmRpdGlvbmApO1xuICBsZXQgd3JhcHBlZENvbmRGbiA9IGFzeW5jICguLi5hcmdzKSA9PiB7XG4gICAgLy8gcmVzZXQgY29tbWFuZCB0aW1lb3V0XG4gICAgdGhpcy5jbGVhck5ld0NvbW1hbmRUaW1lb3V0KCk7XG5cbiAgICByZXR1cm4gYXdhaXQgY29uZEZuKC4uLmFyZ3MpO1xuICB9O1xuICByZXR1cm4gYXdhaXQgd2FpdEZvckNvbmRpdGlvbih3cmFwcGVkQ29uZEZuLCB7XG4gICAgd2FpdE1zOiB0aGlzLmltcGxpY2l0V2FpdE1zLCBpbnRlcnZhbE1zOiA1MDAsIGxvZ2dlcjogbG9nXG4gIH0pO1xufTtcblxuaGVscGVycy5wYXJzZVRpbWVvdXRBcmd1bWVudCA9IGZ1bmN0aW9uIHBhcnNlVGltZW91dEFyZ3VtZW50IChtcykge1xuICBsZXQgZHVyYXRpb24gPSBwYXJzZUludChtcywgMTApO1xuICBpZiAoXy5pc05hTihkdXJhdGlvbikgfHwgZHVyYXRpb24gPCBNSU5fVElNRU9VVCkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuVW5rbm93bkVycm9yKGBJbnZhbGlkIHRpbWVvdXQgdmFsdWUgJyR7bXN9J2ApO1xuICB9XG4gIHJldHVybiBkdXJhdGlvbjtcbn07XG5cbk9iamVjdC5hc3NpZ24oZXh0ZW5zaW9ucywgY29tbWFuZHMsIGhlbHBlcnMpO1xuZXhwb3J0IHsgY29tbWFuZHMsIGhlbHBlcnMgfTtcbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwiZmlsZSI6ImxpYi9iYXNlZHJpdmVyL2NvbW1hbmRzL3RpbWVvdXQuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4vLi4ifQ==