appium-chromedriver 5.2.6 → 5.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"chromedriver.js","names":["NEW_CD_VERSION_FORMAT_MAJOR_VERSION","DEFAULT_HOST","MIN_CD_VERSION_WITH_W3C_SUPPORT","DEFAULT_PORT","CHROME_BUNDLE_ID","WEBVIEW_SHELL_BUNDLE_ID","WEBVIEW_BUNDLE_IDS","VERSION_PATTERN","CD_VERSION_TIMEOUT","Chromedriver","events","EventEmitter","constructor","args","host","port","useSystemExecutable","executable","executableDir","getChromedriverDir","bundleId","mappingPath","cmdArgs","adb","verbose","logPath","disableBuildCheck","details","isAutodownloadEnabled","_log","logger","getLogger","generateLogPrefix","proxyHost","proxyPort","proc","chromedriver","executableVerified","state","STATE_STOPPED","jwproxy","JWProxy","server","log","storageClient","ChromedriverStorageClient","chromedriverDir","capabilities","desiredProtocol","PROTOCOLS","MJSONWP","getDriversMapping","mapping","_","cloneDeep","CHROMEDRIVER_CHROME_MAPPING","debug","fs","exists","warn","info","JSON","parse","readFile","err","message","cdVersion","chromeVersion","toPairs","coercedVersion","semver","coerce","version","getChromedrivers","executables","glob","cwd","strict","nodir","absolute","util","pluralize","length","cds","asyncmap","logError","stdout","stderr","errMsg","path","basename","exec","timeout","includes","match","minChromeVersion","major","minor","filter","cd","sort","a","b","compareVersions","isEmpty","getChromeVersion","Browser","versionMatch","apiLevel","getApiLevel","updateDriversMapping","newMapping","shouldUpdateStaticMapping","writeFile","stringify","e","Object","assign","getCompatibleChromedriver","getChromedriverBinaryPath","values","didStorageSync","syncChromedrivers","retrievedMapping","retrieveMapping","driverKeys","syncDrivers","minBrowserVersion","synchronizedDriversMapping","reduce","acc","x","missingVersions","coercedVer","size","errorAndThrow","matchingDrivers","minChromeVersionS","gte","CD_CDN","stack","autodownloadSuggestion","Error","binPath","initChromedriverPath","syncProtocol","W3C","chromeOptions","getCapValue","w3c","toW3cCapNames","start","caps","emitStartingState","loggingPrefs","browser","changeState","STATE_STARTING","adbPort","push","isArray","startDetector","startsWith","processIsAlive","webviewVersion","killAll","SubProcess","on","out","line","trim","split","error","code","signal","STATE_STOPPING","STATE_RESTARTING","msg","join","waitForOnline","startSession","emit","EVENT_ERROR","stop","versionsSupportedByDriver","sessionId","STATE_ONLINE","restart","chromedriverStopped","retryInterval","getStatus","command","sessionCaps","alwaysMatch","desiredCapabilities","prefix","emitStates","runSafeStep","f","EVENT_CHANGED","sendCommand","url","method","body","proxyReq","req","res","proxyReqRes","cmd","system","isWindows","B","promisify","cp","udidIndex","defaultArgs","findIndex","item","udid","conn","getForwardList","params","removePortForward","replace","hasWorkingWebview"],"sources":["../../lib/chromedriver.js"],"sourcesContent":["// transpile:main\n\nimport events from 'events';\nimport { JWProxy, PROTOCOLS } from 'appium/driver';\nimport cp from 'child_process';\nimport { system, fs, logger, util } from 'appium/support';\nimport { retryInterval, asyncmap } from 'asyncbox';\nimport { SubProcess, exec } from 'teen_process';\nimport B from 'bluebird';\nimport {\n getChromeVersion, getChromedriverDir, CHROMEDRIVER_CHROME_MAPPING,\n getChromedriverBinaryPath, CD_CDN, generateLogPrefix\n} from './utils';\nimport semver from 'semver';\nimport _ from 'lodash';\nimport path from 'path';\nimport { compareVersions } from 'compare-versions';\nimport ChromedriverStorageClient from './storage-client';\nimport { toW3cCapNames, getCapValue } from './protocol-helpers';\n\nconst NEW_CD_VERSION_FORMAT_MAJOR_VERSION = 73;\nconst DEFAULT_HOST = '127.0.0.1';\nconst MIN_CD_VERSION_WITH_W3C_SUPPORT = 75;\nconst DEFAULT_PORT = 9515;\nconst CHROME_BUNDLE_ID = 'com.android.chrome';\nconst WEBVIEW_SHELL_BUNDLE_ID = 'org.chromium.webview_shell';\nconst WEBVIEW_BUNDLE_IDS = [\n 'com.google.android.webview',\n 'com.android.webview',\n];\nconst VERSION_PATTERN = /([\\d.]+)/;\n\nconst CD_VERSION_TIMEOUT = 5000;\n\nclass Chromedriver extends events.EventEmitter {\n constructor (args = {}) {\n super();\n\n const {\n host = DEFAULT_HOST,\n port = DEFAULT_PORT,\n useSystemExecutable = false,\n executable,\n executableDir = getChromedriverDir(),\n bundleId,\n mappingPath,\n cmdArgs,\n adb,\n verbose,\n logPath,\n disableBuildCheck,\n details,\n isAutodownloadEnabled = false,\n } = args;\n this._log = logger.getLogger(generateLogPrefix(this));\n\n this.proxyHost = host;\n this.proxyPort = port;\n this.adb = adb;\n this.cmdArgs = cmdArgs;\n this.proc = null;\n this.useSystemExecutable = useSystemExecutable;\n this.chromedriver = executable;\n this.executableDir = executableDir;\n this.mappingPath = mappingPath;\n this.bundleId = bundleId;\n this.executableVerified = false;\n this.state = Chromedriver.STATE_STOPPED;\n this.jwproxy = new JWProxy({\n server: this.proxyHost,\n port: this.proxyPort,\n log: this._log,\n });\n this.verbose = verbose;\n this.logPath = logPath;\n this.disableBuildCheck = !!disableBuildCheck;\n this.storageClient = isAutodownloadEnabled\n ? new ChromedriverStorageClient({ chromedriverDir: this.executableDir })\n : null;\n this.details = details;\n this.capabilities = {};\n this.desiredProtocol = PROTOCOLS.MJSONWP;\n }\n\n get log () {\n return this._log;\n }\n\n async getDriversMapping () {\n let mapping = _.cloneDeep(CHROMEDRIVER_CHROME_MAPPING);\n if (this.mappingPath) {\n this.log.debug(`Attempting to use Chromedriver->Chrome mapping from '${this.mappingPath}'`);\n if (!await fs.exists(this.mappingPath)) {\n this.log.warn(`No file found at '${this.mappingPath}'`);\n this.log.info('Defaulting to the static Chromedriver->Chrome mapping');\n } else {\n try {\n mapping = JSON.parse(await fs.readFile(this.mappingPath, 'utf8'));\n } catch (err) {\n this.log.warn(`Error parsing mapping from '${this.mappingPath}': ${err.message}`);\n this.log.info('Defaulting to the static Chromedriver->Chrome mapping');\n }\n }\n } else {\n this.log.debug('Using the static Chromedriver->Chrome mapping');\n }\n\n // make sure that the values for minimum chrome version are semver compliant\n for (const [cdVersion, chromeVersion] of _.toPairs(mapping)) {\n const coercedVersion = semver.coerce(chromeVersion);\n if (coercedVersion) {\n mapping[cdVersion] = coercedVersion.version;\n } else {\n this.log.info(`'${chromeVersion}' is not a valid version number. Skipping it`);\n }\n }\n return mapping;\n }\n\n async getChromedrivers (mapping) {\n // go through the versions available\n const executables = await fs.glob('*', {\n cwd: this.executableDir,\n strict: false,\n nodir: true,\n absolute: true,\n });\n this.log.debug(`Found ${util.pluralize('executable', executables.length, true)} ` +\n `in '${this.executableDir}'`);\n const cds = (await asyncmap(executables, async (executable) => {\n const logError = ({message, stdout = null, stderr = null}) => {\n let errMsg = `Cannot retrieve version number from '${path.basename(executable)}' Chromedriver binary. ` +\n `Make sure it returns a valid version string in response to '--version' command line argument. ${message}`;\n if (stdout) {\n errMsg += `\\nStdout: ${stdout}`;\n }\n if (stderr) {\n errMsg += `\\nStderr: ${stderr}`;\n }\n this.log.warn(errMsg);\n return null;\n };\n\n let stdout;\n let stderr;\n try {\n ({stdout, stderr} = await exec(executable, ['--version'], {\n timeout: CD_VERSION_TIMEOUT,\n }));\n } catch (err) {\n if (!(err.message || '').includes('timed out') && !(err.stdout || '').includes('Starting ChromeDriver')) {\n return logError(err);\n }\n\n // if this has timed out, it has actually started Chromedriver,\n // in which case there will also be the version string in the output\n stdout = err.stdout;\n }\n\n const match = /ChromeDriver\\s+\\(?v?([\\d.]+)\\)?/i.exec(stdout); // https://regex101.com/r/zpj5wA/1\n if (!match) {\n return logError({message: 'Cannot parse the version string', stdout, stderr});\n }\n let version = match[1];\n let minChromeVersion = mapping[version];\n const coercedVersion = semver.coerce(version);\n if (coercedVersion) {\n // before 2019-03-06 versions were of the form major.minor\n if (coercedVersion.major < NEW_CD_VERSION_FORMAT_MAJOR_VERSION) {\n version = `${coercedVersion.major}.${coercedVersion.minor}`;\n minChromeVersion = mapping[version];\n }\n if (!minChromeVersion && coercedVersion.major >= NEW_CD_VERSION_FORMAT_MAJOR_VERSION) {\n // Assume the major Chrome version is the same as the corresponding driver major version\n minChromeVersion = `${coercedVersion.major}`;\n }\n }\n return {\n executable,\n version,\n minChromeVersion,\n };\n }))\n .filter((cd) => !!cd)\n .sort((a, b) => compareVersions(b.version, a.version));\n if (_.isEmpty(cds)) {\n this.log.info(`No Chromedrivers were found in '${this.executableDir}'`);\n return cds;\n }\n this.log.debug(`The following Chromedriver executables were found:`);\n for (const cd of cds) {\n this.log.debug(` '${cd.executable}' (version '${cd.version}', minimum Chrome version '${cd.minChromeVersion ? cd.minChromeVersion : 'Unknown'}')`);\n }\n return cds;\n }\n\n async getChromeVersion () {\n // Try to retrieve the version from `details` property if it is set\n // The `info` item must contain the output of /json/version CDP command\n // where `Browser` field looks like `Chrome/72.0.3601.0``\n if (this.details?.info) {\n this.log.debug(`Browser version in the supplied details: ${this.details?.info?.Browser}`);\n }\n const versionMatch = VERSION_PATTERN.exec(this.details?.info?.Browser);\n if (versionMatch) {\n const coercedVersion = semver.coerce(versionMatch[1]);\n if (coercedVersion) {\n return coercedVersion;\n }\n }\n\n let chromeVersion;\n\n // in case of WebView Browser Tester, simply try to find the underlying webview\n if (this.bundleId === WEBVIEW_SHELL_BUNDLE_ID) {\n for (const bundleId of WEBVIEW_BUNDLE_IDS) {\n chromeVersion = await getChromeVersion(this.adb, bundleId);\n if (chromeVersion) {\n this.bundleId = bundleId;\n return semver.coerce(chromeVersion);\n }\n }\n return null;\n }\n\n // on Android 7-9 webviews are backed by the main Chrome, not the system webview\n if (this.adb) {\n const apiLevel = await this.adb.getApiLevel();\n if (apiLevel >= 24 && apiLevel <= 28 &&\n [WEBVIEW_SHELL_BUNDLE_ID, ...WEBVIEW_BUNDLE_IDS].includes(this.bundleId)) {\n this.bundleId = CHROME_BUNDLE_ID;\n }\n }\n\n // try out webviews when no bundle id is sent in\n if (!this.bundleId) {\n // default to the generic Chrome bundle\n this.bundleId = CHROME_BUNDLE_ID;\n\n // we have a webview of some sort, so try to find the bundle version\n for (const bundleId of WEBVIEW_BUNDLE_IDS) {\n chromeVersion = await getChromeVersion(this.adb, bundleId);\n if (chromeVersion) {\n this.bundleId = bundleId;\n break;\n }\n }\n }\n\n // if we do not have a chrome version, it must not be a webview\n if (!chromeVersion) {\n chromeVersion = await getChromeVersion(this.adb, this.bundleId);\n }\n\n // make sure it is semver, so later checks won't fail\n return chromeVersion ? semver.coerce(chromeVersion) : null;\n }\n\n async updateDriversMapping (newMapping) {\n let shouldUpdateStaticMapping = true;\n if (await fs.exists(this.mappingPath)) {\n try {\n await fs.writeFile(this.mappingPath, JSON.stringify(newMapping, null, 2), 'utf8');\n shouldUpdateStaticMapping = false;\n } catch (e) {\n this.log.warn(`Cannot store the updated chromedrivers mapping into '${this.mappingPath}'. ` +\n `This may reduce the performance of further executions. Original error: ${e.message}`);\n }\n }\n if (shouldUpdateStaticMapping) {\n Object.assign(CHROMEDRIVER_CHROME_MAPPING, newMapping);\n }\n }\n\n async getCompatibleChromedriver () {\n if (!this.adb) {\n return await getChromedriverBinaryPath();\n }\n\n const mapping = await this.getDriversMapping();\n if (!_.isEmpty(mapping)) {\n this.log.debug(`The most recent known Chrome version: ${_.values(mapping)[0]}`);\n }\n\n let didStorageSync = false;\n const syncChromedrivers = async (chromeVersion) => {\n didStorageSync = true;\n const retrievedMapping = await this.storageClient.retrieveMapping();\n this.log.debug('Got chromedrivers mapping from the storage: ' +\n JSON.stringify(retrievedMapping, null, 2));\n const driverKeys = await this.storageClient.syncDrivers({\n minBrowserVersion: chromeVersion.major,\n });\n if (_.isEmpty(driverKeys)) {\n return false;\n }\n const synchronizedDriversMapping = driverKeys.reduce((acc, x) => {\n const {version, minBrowserVersion} = retrievedMapping[x];\n acc[version] = minBrowserVersion;\n return acc;\n }, {});\n Object.assign(mapping, synchronizedDriversMapping);\n await this.updateDriversMapping(mapping);\n return true;\n };\n\n do {\n const cds = await this.getChromedrivers(mapping);\n\n const missingVersions = {};\n for (const {version, minChromeVersion} of cds) {\n if (!minChromeVersion || mapping[version]) {\n continue;\n }\n const coercedVer = semver.coerce(version);\n if (!coercedVer || coercedVer.major < NEW_CD_VERSION_FORMAT_MAJOR_VERSION) {\n continue;\n }\n\n missingVersions[version] = minChromeVersion;\n }\n if (!_.isEmpty(missingVersions)) {\n this.log.info(`Found ${util.pluralize('Chromedriver', _.size(missingVersions), true)}, ` +\n `which ${_.size(missingVersions) === 1 ? 'is' : 'are'} missing in the list of known versions: ` +\n JSON.stringify(missingVersions));\n await this.updateDriversMapping(Object.assign(mapping, missingVersions));\n }\n\n if (this.disableBuildCheck) {\n if (_.isEmpty(cds)) {\n this.log.errorAndThrow(`There must be at least one Chromedriver executable available for use if ` +\n `'chromedriverDisableBuildCheck' capability is set to 'true'`);\n }\n const {version, executable} = cds[0];\n this.log.warn(`Chrome build check disabled. Using most recent Chromedriver version (${version}, at '${executable}')`);\n this.log.warn(`If this is wrong, set 'chromedriverDisableBuildCheck' capability to 'false'`);\n return executable;\n }\n\n const chromeVersion = await this.getChromeVersion();\n if (!chromeVersion) {\n // unable to get the chrome version\n if (_.isEmpty(cds)) {\n this.log.errorAndThrow(`There must be at least one Chromedriver executable available for use if ` +\n `the current Chrome version cannot be determined`);\n }\n const {version, executable} = cds[0];\n this.log.warn(`Unable to discover Chrome version. Using Chromedriver ${version} at '${executable}'`);\n return executable;\n }\n this.log.debug(`Found Chrome bundle '${this.bundleId}' version '${chromeVersion}'`);\n\n const matchingDrivers = cds.filter(({minChromeVersion}) => {\n const minChromeVersionS = minChromeVersion && semver.coerce(minChromeVersion);\n if (!minChromeVersionS) {\n return false;\n }\n\n return chromeVersion.major > NEW_CD_VERSION_FORMAT_MAJOR_VERSION\n ? minChromeVersionS.major === chromeVersion.major\n : semver.gte(chromeVersion, minChromeVersionS);\n });\n if (_.isEmpty(matchingDrivers)) {\n if (this.storageClient && !didStorageSync) {\n try {\n if (await syncChromedrivers(chromeVersion)) {\n continue;\n }\n } catch (e) {\n this.log.warn(`Cannot synchronize local chromedrivers with the remote storage at ${CD_CDN}: ` +\n e.message);\n this.log.debug(e.stack);\n }\n }\n const autodownloadSuggestion =\n 'You could also try to enable automated chromedrivers download as ' +\n 'a possible workaround.';\n throw new Error(`No Chromedriver found that can automate Chrome '${chromeVersion}'.` +\n (this.storageClient ? '' : ` ${autodownloadSuggestion}`));\n }\n\n const binPath = matchingDrivers[0].executable;\n this.log.debug(`Found ${util.pluralize('executable', matchingDrivers.length, true)} ` +\n `capable of automating Chrome '${chromeVersion}'.\\nChoosing the most recent, '${binPath}'.`);\n this.log.debug('If a specific version is required, specify it with the `chromedriverExecutable`' +\n 'desired capability.');\n return binPath;\n // eslint-disable-next-line no-constant-condition\n } while (true);\n }\n\n async initChromedriverPath () {\n if (this.executableVerified) return; //eslint-disable-line curly\n\n // the executable might be set (if passed in)\n // or we might want to use the basic one installed with this driver\n // or we want to figure out the best one\n if (!this.chromedriver) {\n this.chromedriver = this.useSystemExecutable\n ? await getChromedriverBinaryPath()\n : await this.getCompatibleChromedriver();\n }\n\n if (!await fs.exists(this.chromedriver)) {\n throw new Error(`Trying to use a chromedriver binary at the path ` +\n `${this.chromedriver}, but it doesn't exist!`);\n }\n this.executableVerified = true;\n this.log.info(`Set chromedriver binary as: ${this.chromedriver}`);\n }\n\n syncProtocol (cdVersion = null) {\n const coercedVersion = semver.coerce(cdVersion);\n if (!coercedVersion || coercedVersion.major < MIN_CD_VERSION_WITH_W3C_SUPPORT) {\n this.log.debug(`Chromedriver v. ${cdVersion} does not fully support ${PROTOCOLS.W3C} protocol. ` +\n `Defaulting to ${PROTOCOLS.MJSONWP}`);\n return;\n }\n const chromeOptions = getCapValue(this.capabilities, 'chromeOptions', {});\n if (chromeOptions.w3c === false) {\n this.log.info(`Chromedriver v. ${cdVersion} supports ${PROTOCOLS.W3C} protocol, ` +\n `but ${PROTOCOLS.MJSONWP} one has been explicitly requested`);\n return;\n }\n this.desiredProtocol = PROTOCOLS.W3C;\n // given caps might not be properly prefixed\n // so we try to fix them in order to properly init\n // the new W3C session\n this.capabilities = toW3cCapNames(this.capabilities);\n }\n\n async start (caps, emitStartingState = true) {\n this.capabilities = _.cloneDeep(caps);\n\n // set the logging preferences to ALL the console logs\n this.capabilities.loggingPrefs = _.cloneDeep(getCapValue(caps, 'loggingPrefs', {}));\n if (_.isEmpty(this.capabilities.loggingPrefs.browser)) {\n this.capabilities.loggingPrefs.browser = 'ALL';\n }\n\n if (emitStartingState) {\n this.changeState(Chromedriver.STATE_STARTING);\n }\n\n const args = [`--port=${this.proxyPort}`];\n if (this.adb && this.adb.adbPort) {\n args.push(`--adb-port=${this.adb.adbPort}`);\n }\n if (_.isArray(this.cmdArgs)) {\n args.push(...this.cmdArgs);\n }\n if (this.logPath) {\n args.push(`--log-path=${this.logPath}`);\n }\n if (this.disableBuildCheck) {\n args.push('--disable-build-check');\n }\n args.push('--verbose');\n // what are the process stdout/stderr conditions wherein we know that\n // the process has started to our satisfaction?\n const startDetector = (stdout) => stdout.startsWith('Starting ');\n\n let processIsAlive = false;\n let webviewVersion;\n try {\n await this.initChromedriverPath();\n await this.killAll();\n\n // set up our subprocess object\n this.proc = new SubProcess(this.chromedriver, args);\n processIsAlive = true;\n\n // handle log output\n this.proc.on('output', (stdout, stderr) => {\n // if the cd output is not printed, find the chrome version and print\n // will get a response like\n // DevTools response: {\n // \"Android-Package\": \"io.appium.sampleapp\",\n // \"Browser\": \"Chrome/55.0.2883.91\",\n // \"Protocol-Version\": \"1.2\",\n // \"User-Agent\": \"...\",\n // \"WebKit-Version\": \"537.36\"\n // }\n const out = stdout + stderr;\n let match = /\"Browser\": \"(.*)\"/.exec(out);\n if (match) {\n webviewVersion = match[1];\n this.log.debug(`Webview version: '${webviewVersion}'`);\n }\n\n // also print chromedriver version to logs\n // will output something like\n // Starting ChromeDriver 2.33.506106 (8a06c39c4582fbfbab6966dbb1c38a9173bfb1a2) on port 9515\n match = /Starting ChromeDriver ([.\\d]+)/.exec(out);\n if (match) {\n this.log.debug(`Chromedriver version: '${match[1]}'`);\n this.syncProtocol(match[1]);\n }\n\n // give the output if it is requested\n if (this.verbose) {\n for (let line of (stdout || '').trim().split('\\n')) {\n if (!line.trim().length) continue; // eslint-disable-line curly\n this.log.debug(`[STDOUT] ${line}`);\n }\n for (let line of (stderr || '').trim().split('\\n')) {\n if (!line.trim().length) continue; // eslint-disable-line curly\n this.log.error(`[STDERR] ${line}`);\n }\n }\n });\n\n // handle out-of-bound exit by simply emitting a stopped state\n this.proc.on('exit', (code, signal) => {\n processIsAlive = false;\n if (this.state !== Chromedriver.STATE_STOPPED &&\n this.state !== Chromedriver.STATE_STOPPING &&\n this.state !== Chromedriver.STATE_RESTARTING) {\n const msg = `Chromedriver exited unexpectedly with code ${code}, signal ${signal}`;\n this.log.error(msg);\n this.changeState(Chromedriver.STATE_STOPPED);\n }\n });\n this.log.info(`Spawning chromedriver with: ${this.chromedriver} ${args.join(' ')}`);\n // start subproc and wait for startDetector\n await this.proc.start(startDetector);\n await this.waitForOnline();\n await this.startSession();\n } catch (e) {\n this.log.debug(e);\n this.emit(Chromedriver.EVENT_ERROR, e);\n // just because we had an error doesn't mean the chromedriver process\n // finished; we should clean up if necessary\n if (processIsAlive) {\n await this.proc.stop();\n }\n\n let message = '';\n // often the user's Chrome version is not supported by the version of Chromedriver\n if (e.message.includes('Chrome version must be')) {\n message += 'Unable to automate Chrome version because it is not supported by this version of Chromedriver.\\n';\n if (webviewVersion) {\n message += `Chrome version on the device: ${webviewVersion}\\n`;\n }\n const versionsSupportedByDriver = /Chrome version must be (.+)/.exec(e.message)?.[1] || '';\n if (versionsSupportedByDriver) {\n message += `Chromedriver supports Chrome version(s): ${versionsSupportedByDriver}\\n`;\n }\n message += 'Check the driver tutorial for troubleshooting.\\n';\n }\n\n message += e.message;\n this.log.errorAndThrow(message);\n }\n }\n\n sessionId () {\n return this.state === Chromedriver.STATE_ONLINE ? this.jwproxy.sessionId : null;\n }\n\n async restart () {\n this.log.info('Restarting chromedriver');\n if (this.state !== Chromedriver.STATE_ONLINE) {\n throw new Error(\"Can't restart when we're not online\");\n }\n this.changeState(Chromedriver.STATE_RESTARTING);\n await this.stop(false);\n await this.start(this.capabilities, false);\n }\n\n async waitForOnline () {\n // we need to make sure that CD hasn't crashed\n let chromedriverStopped = false;\n await retryInterval(20, 200, async () => {\n if (this.state === Chromedriver.STATE_STOPPED) {\n // we are either stopped or stopping, so something went wrong\n chromedriverStopped = true;\n return;\n }\n await this.getStatus();\n });\n if (chromedriverStopped) {\n throw new Error('ChromeDriver crashed during startup.');\n }\n }\n\n async getStatus () {\n return await this.jwproxy.command('/status', 'GET');\n }\n\n async startSession () {\n const sessionCaps = this.desiredProtocol === PROTOCOLS.W3C\n ? {capabilities: {alwaysMatch: this.capabilities}}\n : {desiredCapabilities: this.capabilities};\n this.log.info(`Starting ${this.desiredProtocol} Chromedriver session with capabilities: ` +\n JSON.stringify(sessionCaps, null, 2));\n await this.jwproxy.command('/session', 'POST', sessionCaps);\n this.log.prefix = generateLogPrefix(this, this.jwproxy.sessionId);\n this.changeState(Chromedriver.STATE_ONLINE);\n }\n\n async stop (emitStates = true) {\n if (emitStates) {\n this.changeState(Chromedriver.STATE_STOPPING);\n }\n const runSafeStep = async (f) => {\n try {\n return await f();\n } catch (e) {\n this.log.warn(e.message);\n this.log.debug(e.stack);\n }\n };\n await runSafeStep(() => this.jwproxy.command('', 'DELETE'));\n await runSafeStep(() => this.proc.stop('SIGTERM', 20000));\n this.log.prefix = generateLogPrefix(this);\n if (emitStates) {\n this.changeState(Chromedriver.STATE_STOPPED);\n }\n }\n\n changeState (state) {\n this.state = state;\n this.log.debug(`Changed state to '${state}'`);\n this.emit(Chromedriver.EVENT_CHANGED, {state});\n }\n\n async sendCommand (url, method, body) {\n return await this.jwproxy.command(url, method, body);\n }\n\n async proxyReq (req, res) {\n return await this.jwproxy.proxyReqRes(req, res);\n }\n\n async killAll () {\n let cmd = system.isWindows()\n ? `wmic process where \"commandline like '%chromedriver.exe%--port=${this.proxyPort}%'\" delete`\n : `pkill -15 -f \"${this.chromedriver}.*--port=${this.proxyPort}\"`;\n this.log.debug(`Killing any old chromedrivers, running: ${cmd}`);\n try {\n await (B.promisify(cp.exec))(cmd);\n this.log.debug('Successfully cleaned up old chromedrivers');\n } catch (err) {\n this.log.warn('No old chromedrivers seem to exist');\n }\n\n if (this.adb) {\n const udidIndex = this.adb.executable.defaultArgs.findIndex((item) => item === '-s');\n const udid = udidIndex > -1 ? this.adb.executable.defaultArgs[udidIndex + 1] : null;\n\n if (udid) {\n this.log.debug(`Cleaning this device's adb forwarded port socket connections: ${udid}`);\n } else {\n this.log.debug(`Cleaning any old adb forwarded port socket connections`);\n }\n\n try {\n for (let conn of await this.adb.getForwardList()) {\n // chromedriver will ask ADB to forward a port like \"deviceId tcp:port localabstract:webview_devtools_remote_port\"\n if (!(conn.includes('webview_devtools') && (!udid || conn.includes(udid)))) {\n continue;\n }\n\n let params = conn.split(/\\s+/);\n if (params.length > 1) {\n await this.adb.removePortForward(params[1].replace(/[\\D]*/, ''));\n }\n }\n } catch (err) {\n this.log.warn(`Unable to clean forwarded ports. Error: '${err.message}'. Continuing.`);\n }\n }\n }\n\n async hasWorkingWebview () {\n // sometimes chromedriver stops automating webviews. this method runs a\n // simple command to determine our state, and responds accordingly\n try {\n await this.jwproxy.command('/url', 'GET');\n return true;\n } catch (e) {\n return false;\n }\n }\n}\n\nChromedriver.EVENT_ERROR = 'chromedriver_error';\nChromedriver.EVENT_CHANGED = 'stateChanged';\nChromedriver.STATE_STOPPED = 'stopped';\nChromedriver.STATE_STARTING = 'starting';\nChromedriver.STATE_ONLINE = 'online';\nChromedriver.STATE_STOPPING = 'stopping';\nChromedriver.STATE_RESTARTING = 'restarting';\n\nexport { Chromedriver };\nexport default Chromedriver;\n"],"mappings":"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"}
1
+ {"version":3,"file":"chromedriver.js","names":["NEW_CD_VERSION_FORMAT_MAJOR_VERSION","DEFAULT_HOST","MIN_CD_VERSION_WITH_W3C_SUPPORT","DEFAULT_PORT","CHROME_BUNDLE_ID","WEBVIEW_SHELL_BUNDLE_ID","WEBVIEW_BUNDLE_IDS","VERSION_PATTERN","CD_VERSION_TIMEOUT","Chromedriver","events","EventEmitter","constructor","args","host","port","useSystemExecutable","executable","executableDir","getChromedriverDir","bundleId","mappingPath","cmdArgs","adb","verbose","logPath","disableBuildCheck","details","isAutodownloadEnabled","_log","logger","getLogger","generateLogPrefix","proxyHost","proxyPort","proc","chromedriver","executableVerified","state","STATE_STOPPED","jwproxy","JWProxy","server","log","storageClient","ChromedriverStorageClient","chromedriverDir","capabilities","desiredProtocol","PROTOCOLS","MJSONWP","getDriversMapping","mapping","_","cloneDeep","CHROMEDRIVER_CHROME_MAPPING","debug","fs","exists","warn","info","JSON","parse","readFile","err","message","cdVersion","chromeVersion","toPairs","coercedVersion","semver","coerce","version","getChromedrivers","executables","glob","cwd","strict","nodir","absolute","util","pluralize","length","cds","asyncmap","logError","stdout","stderr","errMsg","path","basename","exec","timeout","includes","match","minChromeVersion","major","minor","filter","cd","sort","a","b","compareVersions","isEmpty","getChromeVersion","Browser","versionMatch","apiLevel","getApiLevel","updateDriversMapping","newMapping","shouldUpdateStaticMapping","writeFile","stringify","e","Object","assign","getCompatibleChromedriver","getChromedriverBinaryPath","values","didStorageSync","syncChromedrivers","retrievedMapping","retrieveMapping","driverKeys","syncDrivers","minBrowserVersion","synchronizedDriversMapping","reduce","acc","x","missingVersions","coercedVer","size","errorAndThrow","matchingDrivers","minChromeVersionS","gte","CD_CDN","stack","autodownloadSuggestion","Error","binPath","initChromedriverPath","syncProtocol","W3C","chromeOptions","getCapValue","w3c","toW3cCapNames","start","caps","emitStartingState","loggingPrefs","browser","changeState","STATE_STARTING","adbPort","push","isArray","startDetector","startsWith","processIsAlive","webviewVersion","killAll","SubProcess","on","out","line","trim","split","error","code","signal","STATE_STOPPING","STATE_RESTARTING","msg","join","waitForOnline","startSession","emit","EVENT_ERROR","stop","versionsSupportedByDriver","sessionId","STATE_ONLINE","restart","chromedriverStopped","retryInterval","getStatus","command","sessionCaps","alwaysMatch","desiredCapabilities","prefix","emitStates","runSafeStep","f","EVENT_CHANGED","sendCommand","url","method","body","proxyReq","req","res","proxyReqRes","cmd","system","isWindows","B","promisify","cp","udidIndex","defaultArgs","findIndex","item","udid","conn","getForwardList","params","removePortForward","replace","hasWorkingWebview"],"sources":["../../lib/chromedriver.js"],"sourcesContent":["// transpile:main\n\nimport events from 'events';\nimport { JWProxy, PROTOCOLS } from '@appium/base-driver';\nimport cp from 'child_process';\nimport { system, fs, logger, util } from '@appium/support';\nimport { retryInterval, asyncmap } from 'asyncbox';\nimport { SubProcess, exec } from 'teen_process';\nimport B from 'bluebird';\nimport {\n getChromeVersion, getChromedriverDir, CHROMEDRIVER_CHROME_MAPPING,\n getChromedriverBinaryPath, CD_CDN, generateLogPrefix\n} from './utils';\nimport semver from 'semver';\nimport _ from 'lodash';\nimport path from 'path';\nimport { compareVersions } from 'compare-versions';\nimport ChromedriverStorageClient from './storage-client';\nimport { toW3cCapNames, getCapValue } from './protocol-helpers';\n\nconst NEW_CD_VERSION_FORMAT_MAJOR_VERSION = 73;\nconst DEFAULT_HOST = '127.0.0.1';\nconst MIN_CD_VERSION_WITH_W3C_SUPPORT = 75;\nconst DEFAULT_PORT = 9515;\nconst CHROME_BUNDLE_ID = 'com.android.chrome';\nconst WEBVIEW_SHELL_BUNDLE_ID = 'org.chromium.webview_shell';\nconst WEBVIEW_BUNDLE_IDS = [\n 'com.google.android.webview',\n 'com.android.webview',\n];\nconst VERSION_PATTERN = /([\\d.]+)/;\n\nconst CD_VERSION_TIMEOUT = 5000;\n\nclass Chromedriver extends events.EventEmitter {\n constructor (args = {}) {\n super();\n\n const {\n host = DEFAULT_HOST,\n port = DEFAULT_PORT,\n useSystemExecutable = false,\n executable,\n executableDir = getChromedriverDir(),\n bundleId,\n mappingPath,\n cmdArgs,\n adb,\n verbose,\n logPath,\n disableBuildCheck,\n details,\n isAutodownloadEnabled = false,\n } = args;\n this._log = logger.getLogger(generateLogPrefix(this));\n\n this.proxyHost = host;\n this.proxyPort = port;\n this.adb = adb;\n this.cmdArgs = cmdArgs;\n this.proc = null;\n this.useSystemExecutable = useSystemExecutable;\n this.chromedriver = executable;\n this.executableDir = executableDir;\n this.mappingPath = mappingPath;\n this.bundleId = bundleId;\n this.executableVerified = false;\n this.state = Chromedriver.STATE_STOPPED;\n this.jwproxy = new JWProxy({\n server: this.proxyHost,\n port: this.proxyPort,\n log: this._log,\n });\n this.verbose = verbose;\n this.logPath = logPath;\n this.disableBuildCheck = !!disableBuildCheck;\n this.storageClient = isAutodownloadEnabled\n ? new ChromedriverStorageClient({ chromedriverDir: this.executableDir })\n : null;\n this.details = details;\n this.capabilities = {};\n this.desiredProtocol = PROTOCOLS.MJSONWP;\n }\n\n get log () {\n return this._log;\n }\n\n async getDriversMapping () {\n let mapping = _.cloneDeep(CHROMEDRIVER_CHROME_MAPPING);\n if (this.mappingPath) {\n this.log.debug(`Attempting to use Chromedriver->Chrome mapping from '${this.mappingPath}'`);\n if (!await fs.exists(this.mappingPath)) {\n this.log.warn(`No file found at '${this.mappingPath}'`);\n this.log.info('Defaulting to the static Chromedriver->Chrome mapping');\n } else {\n try {\n mapping = JSON.parse(await fs.readFile(this.mappingPath, 'utf8'));\n } catch (err) {\n this.log.warn(`Error parsing mapping from '${this.mappingPath}': ${err.message}`);\n this.log.info('Defaulting to the static Chromedriver->Chrome mapping');\n }\n }\n } else {\n this.log.debug('Using the static Chromedriver->Chrome mapping');\n }\n\n // make sure that the values for minimum chrome version are semver compliant\n for (const [cdVersion, chromeVersion] of _.toPairs(mapping)) {\n const coercedVersion = semver.coerce(chromeVersion);\n if (coercedVersion) {\n mapping[cdVersion] = coercedVersion.version;\n } else {\n this.log.info(`'${chromeVersion}' is not a valid version number. Skipping it`);\n }\n }\n return mapping;\n }\n\n async getChromedrivers (mapping) {\n // go through the versions available\n const executables = await fs.glob('*', {\n cwd: this.executableDir,\n strict: false,\n nodir: true,\n absolute: true,\n });\n this.log.debug(`Found ${util.pluralize('executable', executables.length, true)} ` +\n `in '${this.executableDir}'`);\n const cds = (await asyncmap(executables, async (executable) => {\n const logError = ({message, stdout = null, stderr = null}) => {\n let errMsg = `Cannot retrieve version number from '${path.basename(executable)}' Chromedriver binary. ` +\n `Make sure it returns a valid version string in response to '--version' command line argument. ${message}`;\n if (stdout) {\n errMsg += `\\nStdout: ${stdout}`;\n }\n if (stderr) {\n errMsg += `\\nStderr: ${stderr}`;\n }\n this.log.warn(errMsg);\n return null;\n };\n\n let stdout;\n let stderr;\n try {\n ({stdout, stderr} = await exec(executable, ['--version'], {\n timeout: CD_VERSION_TIMEOUT,\n }));\n } catch (err) {\n if (!(err.message || '').includes('timed out') && !(err.stdout || '').includes('Starting ChromeDriver')) {\n return logError(err);\n }\n\n // if this has timed out, it has actually started Chromedriver,\n // in which case there will also be the version string in the output\n stdout = err.stdout;\n }\n\n const match = /ChromeDriver\\s+\\(?v?([\\d.]+)\\)?/i.exec(stdout); // https://regex101.com/r/zpj5wA/1\n if (!match) {\n return logError({message: 'Cannot parse the version string', stdout, stderr});\n }\n let version = match[1];\n let minChromeVersion = mapping[version];\n const coercedVersion = semver.coerce(version);\n if (coercedVersion) {\n // before 2019-03-06 versions were of the form major.minor\n if (coercedVersion.major < NEW_CD_VERSION_FORMAT_MAJOR_VERSION) {\n version = `${coercedVersion.major}.${coercedVersion.minor}`;\n minChromeVersion = mapping[version];\n }\n if (!minChromeVersion && coercedVersion.major >= NEW_CD_VERSION_FORMAT_MAJOR_VERSION) {\n // Assume the major Chrome version is the same as the corresponding driver major version\n minChromeVersion = `${coercedVersion.major}`;\n }\n }\n return {\n executable,\n version,\n minChromeVersion,\n };\n }))\n .filter((cd) => !!cd)\n .sort((a, b) => compareVersions(b.version, a.version));\n if (_.isEmpty(cds)) {\n this.log.info(`No Chromedrivers were found in '${this.executableDir}'`);\n return cds;\n }\n this.log.debug(`The following Chromedriver executables were found:`);\n for (const cd of cds) {\n this.log.debug(` '${cd.executable}' (version '${cd.version}', minimum Chrome version '${cd.minChromeVersion ? cd.minChromeVersion : 'Unknown'}')`);\n }\n return cds;\n }\n\n async getChromeVersion () {\n // Try to retrieve the version from `details` property if it is set\n // The `info` item must contain the output of /json/version CDP command\n // where `Browser` field looks like `Chrome/72.0.3601.0``\n if (this.details?.info) {\n this.log.debug(`Browser version in the supplied details: ${this.details?.info?.Browser}`);\n }\n const versionMatch = VERSION_PATTERN.exec(this.details?.info?.Browser);\n if (versionMatch) {\n const coercedVersion = semver.coerce(versionMatch[1]);\n if (coercedVersion) {\n return coercedVersion;\n }\n }\n\n let chromeVersion;\n\n // in case of WebView Browser Tester, simply try to find the underlying webview\n if (this.bundleId === WEBVIEW_SHELL_BUNDLE_ID) {\n for (const bundleId of WEBVIEW_BUNDLE_IDS) {\n chromeVersion = await getChromeVersion(this.adb, bundleId);\n if (chromeVersion) {\n this.bundleId = bundleId;\n return semver.coerce(chromeVersion);\n }\n }\n return null;\n }\n\n // on Android 7-9 webviews are backed by the main Chrome, not the system webview\n if (this.adb) {\n const apiLevel = await this.adb.getApiLevel();\n if (apiLevel >= 24 && apiLevel <= 28 &&\n [WEBVIEW_SHELL_BUNDLE_ID, ...WEBVIEW_BUNDLE_IDS].includes(this.bundleId)) {\n this.bundleId = CHROME_BUNDLE_ID;\n }\n }\n\n // try out webviews when no bundle id is sent in\n if (!this.bundleId) {\n // default to the generic Chrome bundle\n this.bundleId = CHROME_BUNDLE_ID;\n\n // we have a webview of some sort, so try to find the bundle version\n for (const bundleId of WEBVIEW_BUNDLE_IDS) {\n chromeVersion = await getChromeVersion(this.adb, bundleId);\n if (chromeVersion) {\n this.bundleId = bundleId;\n break;\n }\n }\n }\n\n // if we do not have a chrome version, it must not be a webview\n if (!chromeVersion) {\n chromeVersion = await getChromeVersion(this.adb, this.bundleId);\n }\n\n // make sure it is semver, so later checks won't fail\n return chromeVersion ? semver.coerce(chromeVersion) : null;\n }\n\n async updateDriversMapping (newMapping) {\n let shouldUpdateStaticMapping = true;\n if (await fs.exists(this.mappingPath)) {\n try {\n await fs.writeFile(this.mappingPath, JSON.stringify(newMapping, null, 2), 'utf8');\n shouldUpdateStaticMapping = false;\n } catch (e) {\n this.log.warn(`Cannot store the updated chromedrivers mapping into '${this.mappingPath}'. ` +\n `This may reduce the performance of further executions. Original error: ${e.message}`);\n }\n }\n if (shouldUpdateStaticMapping) {\n Object.assign(CHROMEDRIVER_CHROME_MAPPING, newMapping);\n }\n }\n\n async getCompatibleChromedriver () {\n if (!this.adb) {\n return await getChromedriverBinaryPath();\n }\n\n const mapping = await this.getDriversMapping();\n if (!_.isEmpty(mapping)) {\n this.log.debug(`The most recent known Chrome version: ${_.values(mapping)[0]}`);\n }\n\n let didStorageSync = false;\n const syncChromedrivers = async (chromeVersion) => {\n didStorageSync = true;\n const retrievedMapping = await this.storageClient.retrieveMapping();\n this.log.debug('Got chromedrivers mapping from the storage: ' +\n JSON.stringify(retrievedMapping, null, 2));\n const driverKeys = await this.storageClient.syncDrivers({\n minBrowserVersion: chromeVersion.major,\n });\n if (_.isEmpty(driverKeys)) {\n return false;\n }\n const synchronizedDriversMapping = driverKeys.reduce((acc, x) => {\n const {version, minBrowserVersion} = retrievedMapping[x];\n acc[version] = minBrowserVersion;\n return acc;\n }, {});\n Object.assign(mapping, synchronizedDriversMapping);\n await this.updateDriversMapping(mapping);\n return true;\n };\n\n do {\n const cds = await this.getChromedrivers(mapping);\n\n const missingVersions = {};\n for (const {version, minChromeVersion} of cds) {\n if (!minChromeVersion || mapping[version]) {\n continue;\n }\n const coercedVer = semver.coerce(version);\n if (!coercedVer || coercedVer.major < NEW_CD_VERSION_FORMAT_MAJOR_VERSION) {\n continue;\n }\n\n missingVersions[version] = minChromeVersion;\n }\n if (!_.isEmpty(missingVersions)) {\n this.log.info(`Found ${util.pluralize('Chromedriver', _.size(missingVersions), true)}, ` +\n `which ${_.size(missingVersions) === 1 ? 'is' : 'are'} missing in the list of known versions: ` +\n JSON.stringify(missingVersions));\n await this.updateDriversMapping(Object.assign(mapping, missingVersions));\n }\n\n if (this.disableBuildCheck) {\n if (_.isEmpty(cds)) {\n this.log.errorAndThrow(`There must be at least one Chromedriver executable available for use if ` +\n `'chromedriverDisableBuildCheck' capability is set to 'true'`);\n }\n const {version, executable} = cds[0];\n this.log.warn(`Chrome build check disabled. Using most recent Chromedriver version (${version}, at '${executable}')`);\n this.log.warn(`If this is wrong, set 'chromedriverDisableBuildCheck' capability to 'false'`);\n return executable;\n }\n\n const chromeVersion = await this.getChromeVersion();\n if (!chromeVersion) {\n // unable to get the chrome version\n if (_.isEmpty(cds)) {\n this.log.errorAndThrow(`There must be at least one Chromedriver executable available for use if ` +\n `the current Chrome version cannot be determined`);\n }\n const {version, executable} = cds[0];\n this.log.warn(`Unable to discover Chrome version. Using Chromedriver ${version} at '${executable}'`);\n return executable;\n }\n this.log.debug(`Found Chrome bundle '${this.bundleId}' version '${chromeVersion}'`);\n\n const matchingDrivers = cds.filter(({minChromeVersion}) => {\n const minChromeVersionS = minChromeVersion && semver.coerce(minChromeVersion);\n if (!minChromeVersionS) {\n return false;\n }\n\n return chromeVersion.major > NEW_CD_VERSION_FORMAT_MAJOR_VERSION\n ? minChromeVersionS.major === chromeVersion.major\n : semver.gte(chromeVersion, minChromeVersionS);\n });\n if (_.isEmpty(matchingDrivers)) {\n if (this.storageClient && !didStorageSync) {\n try {\n if (await syncChromedrivers(chromeVersion)) {\n continue;\n }\n } catch (e) {\n this.log.warn(`Cannot synchronize local chromedrivers with the remote storage at ${CD_CDN}: ` +\n e.message);\n this.log.debug(e.stack);\n }\n }\n const autodownloadSuggestion =\n 'You could also try to enable automated chromedrivers download as ' +\n 'a possible workaround.';\n throw new Error(`No Chromedriver found that can automate Chrome '${chromeVersion}'.` +\n (this.storageClient ? '' : ` ${autodownloadSuggestion}`));\n }\n\n const binPath = matchingDrivers[0].executable;\n this.log.debug(`Found ${util.pluralize('executable', matchingDrivers.length, true)} ` +\n `capable of automating Chrome '${chromeVersion}'.\\nChoosing the most recent, '${binPath}'.`);\n this.log.debug('If a specific version is required, specify it with the `chromedriverExecutable`' +\n 'desired capability.');\n return binPath;\n // eslint-disable-next-line no-constant-condition\n } while (true);\n }\n\n async initChromedriverPath () {\n if (this.executableVerified) return; //eslint-disable-line curly\n\n // the executable might be set (if passed in)\n // or we might want to use the basic one installed with this driver\n // or we want to figure out the best one\n if (!this.chromedriver) {\n this.chromedriver = this.useSystemExecutable\n ? await getChromedriverBinaryPath()\n : await this.getCompatibleChromedriver();\n }\n\n if (!await fs.exists(this.chromedriver)) {\n throw new Error(`Trying to use a chromedriver binary at the path ` +\n `${this.chromedriver}, but it doesn't exist!`);\n }\n this.executableVerified = true;\n this.log.info(`Set chromedriver binary as: ${this.chromedriver}`);\n }\n\n syncProtocol (cdVersion = null) {\n const coercedVersion = semver.coerce(cdVersion);\n if (!coercedVersion || coercedVersion.major < MIN_CD_VERSION_WITH_W3C_SUPPORT) {\n this.log.debug(`Chromedriver v. ${cdVersion} does not fully support ${PROTOCOLS.W3C} protocol. ` +\n `Defaulting to ${PROTOCOLS.MJSONWP}`);\n return;\n }\n const chromeOptions = getCapValue(this.capabilities, 'chromeOptions', {});\n if (chromeOptions.w3c === false) {\n this.log.info(`Chromedriver v. ${cdVersion} supports ${PROTOCOLS.W3C} protocol, ` +\n `but ${PROTOCOLS.MJSONWP} one has been explicitly requested`);\n return;\n }\n this.desiredProtocol = PROTOCOLS.W3C;\n // given caps might not be properly prefixed\n // so we try to fix them in order to properly init\n // the new W3C session\n this.capabilities = toW3cCapNames(this.capabilities);\n }\n\n async start (caps, emitStartingState = true) {\n this.capabilities = _.cloneDeep(caps);\n\n // set the logging preferences to ALL the console logs\n this.capabilities.loggingPrefs = _.cloneDeep(getCapValue(caps, 'loggingPrefs', {}));\n if (_.isEmpty(this.capabilities.loggingPrefs.browser)) {\n this.capabilities.loggingPrefs.browser = 'ALL';\n }\n\n if (emitStartingState) {\n this.changeState(Chromedriver.STATE_STARTING);\n }\n\n const args = [`--port=${this.proxyPort}`];\n if (this.adb && this.adb.adbPort) {\n args.push(`--adb-port=${this.adb.adbPort}`);\n }\n if (_.isArray(this.cmdArgs)) {\n args.push(...this.cmdArgs);\n }\n if (this.logPath) {\n args.push(`--log-path=${this.logPath}`);\n }\n if (this.disableBuildCheck) {\n args.push('--disable-build-check');\n }\n args.push('--verbose');\n // what are the process stdout/stderr conditions wherein we know that\n // the process has started to our satisfaction?\n const startDetector = (stdout) => stdout.startsWith('Starting ');\n\n let processIsAlive = false;\n let webviewVersion;\n try {\n await this.initChromedriverPath();\n await this.killAll();\n\n // set up our subprocess object\n this.proc = new SubProcess(this.chromedriver, args);\n processIsAlive = true;\n\n // handle log output\n this.proc.on('output', (stdout, stderr) => {\n // if the cd output is not printed, find the chrome version and print\n // will get a response like\n // DevTools response: {\n // \"Android-Package\": \"io.appium.sampleapp\",\n // \"Browser\": \"Chrome/55.0.2883.91\",\n // \"Protocol-Version\": \"1.2\",\n // \"User-Agent\": \"...\",\n // \"WebKit-Version\": \"537.36\"\n // }\n const out = stdout + stderr;\n let match = /\"Browser\": \"(.*)\"/.exec(out);\n if (match) {\n webviewVersion = match[1];\n this.log.debug(`Webview version: '${webviewVersion}'`);\n }\n\n // also print chromedriver version to logs\n // will output something like\n // Starting ChromeDriver 2.33.506106 (8a06c39c4582fbfbab6966dbb1c38a9173bfb1a2) on port 9515\n match = /Starting ChromeDriver ([.\\d]+)/.exec(out);\n if (match) {\n this.log.debug(`Chromedriver version: '${match[1]}'`);\n this.syncProtocol(match[1]);\n }\n\n // give the output if it is requested\n if (this.verbose) {\n for (let line of (stdout || '').trim().split('\\n')) {\n if (!line.trim().length) continue; // eslint-disable-line curly\n this.log.debug(`[STDOUT] ${line}`);\n }\n for (let line of (stderr || '').trim().split('\\n')) {\n if (!line.trim().length) continue; // eslint-disable-line curly\n this.log.error(`[STDERR] ${line}`);\n }\n }\n });\n\n // handle out-of-bound exit by simply emitting a stopped state\n this.proc.on('exit', (code, signal) => {\n processIsAlive = false;\n if (this.state !== Chromedriver.STATE_STOPPED &&\n this.state !== Chromedriver.STATE_STOPPING &&\n this.state !== Chromedriver.STATE_RESTARTING) {\n const msg = `Chromedriver exited unexpectedly with code ${code}, signal ${signal}`;\n this.log.error(msg);\n this.changeState(Chromedriver.STATE_STOPPED);\n }\n });\n this.log.info(`Spawning chromedriver with: ${this.chromedriver} ${args.join(' ')}`);\n // start subproc and wait for startDetector\n await this.proc.start(startDetector);\n await this.waitForOnline();\n await this.startSession();\n } catch (e) {\n this.log.debug(e);\n this.emit(Chromedriver.EVENT_ERROR, e);\n // just because we had an error doesn't mean the chromedriver process\n // finished; we should clean up if necessary\n if (processIsAlive) {\n await this.proc.stop();\n }\n\n let message = '';\n // often the user's Chrome version is not supported by the version of Chromedriver\n if (e.message.includes('Chrome version must be')) {\n message += 'Unable to automate Chrome version because it is not supported by this version of Chromedriver.\\n';\n if (webviewVersion) {\n message += `Chrome version on the device: ${webviewVersion}\\n`;\n }\n const versionsSupportedByDriver = /Chrome version must be (.+)/.exec(e.message)?.[1] || '';\n if (versionsSupportedByDriver) {\n message += `Chromedriver supports Chrome version(s): ${versionsSupportedByDriver}\\n`;\n }\n message += 'Check the driver tutorial for troubleshooting.\\n';\n }\n\n message += e.message;\n this.log.errorAndThrow(message);\n }\n }\n\n sessionId () {\n return this.state === Chromedriver.STATE_ONLINE ? this.jwproxy.sessionId : null;\n }\n\n async restart () {\n this.log.info('Restarting chromedriver');\n if (this.state !== Chromedriver.STATE_ONLINE) {\n throw new Error(\"Can't restart when we're not online\");\n }\n this.changeState(Chromedriver.STATE_RESTARTING);\n await this.stop(false);\n await this.start(this.capabilities, false);\n }\n\n async waitForOnline () {\n // we need to make sure that CD hasn't crashed\n let chromedriverStopped = false;\n await retryInterval(20, 200, async () => {\n if (this.state === Chromedriver.STATE_STOPPED) {\n // we are either stopped or stopping, so something went wrong\n chromedriverStopped = true;\n return;\n }\n await this.getStatus();\n });\n if (chromedriverStopped) {\n throw new Error('ChromeDriver crashed during startup.');\n }\n }\n\n async getStatus () {\n return await this.jwproxy.command('/status', 'GET');\n }\n\n async startSession () {\n const sessionCaps = this.desiredProtocol === PROTOCOLS.W3C\n ? {capabilities: {alwaysMatch: this.capabilities}}\n : {desiredCapabilities: this.capabilities};\n this.log.info(`Starting ${this.desiredProtocol} Chromedriver session with capabilities: ` +\n JSON.stringify(sessionCaps, null, 2));\n await this.jwproxy.command('/session', 'POST', sessionCaps);\n this.log.prefix = generateLogPrefix(this, this.jwproxy.sessionId);\n this.changeState(Chromedriver.STATE_ONLINE);\n }\n\n async stop (emitStates = true) {\n if (emitStates) {\n this.changeState(Chromedriver.STATE_STOPPING);\n }\n const runSafeStep = async (f) => {\n try {\n return await f();\n } catch (e) {\n this.log.warn(e.message);\n this.log.debug(e.stack);\n }\n };\n await runSafeStep(() => this.jwproxy.command('', 'DELETE'));\n await runSafeStep(() => this.proc.stop('SIGTERM', 20000));\n this.log.prefix = generateLogPrefix(this);\n if (emitStates) {\n this.changeState(Chromedriver.STATE_STOPPED);\n }\n }\n\n changeState (state) {\n this.state = state;\n this.log.debug(`Changed state to '${state}'`);\n this.emit(Chromedriver.EVENT_CHANGED, {state});\n }\n\n async sendCommand (url, method, body) {\n return await this.jwproxy.command(url, method, body);\n }\n\n async proxyReq (req, res) {\n return await this.jwproxy.proxyReqRes(req, res);\n }\n\n async killAll () {\n let cmd = system.isWindows()\n ? `wmic process where \"commandline like '%chromedriver.exe%--port=${this.proxyPort}%'\" delete`\n : `pkill -15 -f \"${this.chromedriver}.*--port=${this.proxyPort}\"`;\n this.log.debug(`Killing any old chromedrivers, running: ${cmd}`);\n try {\n await (B.promisify(cp.exec))(cmd);\n this.log.debug('Successfully cleaned up old chromedrivers');\n } catch (err) {\n this.log.warn('No old chromedrivers seem to exist');\n }\n\n if (this.adb) {\n const udidIndex = this.adb.executable.defaultArgs.findIndex((item) => item === '-s');\n const udid = udidIndex > -1 ? this.adb.executable.defaultArgs[udidIndex + 1] : null;\n\n if (udid) {\n this.log.debug(`Cleaning this device's adb forwarded port socket connections: ${udid}`);\n } else {\n this.log.debug(`Cleaning any old adb forwarded port socket connections`);\n }\n\n try {\n for (let conn of await this.adb.getForwardList()) {\n // chromedriver will ask ADB to forward a port like \"deviceId tcp:port localabstract:webview_devtools_remote_port\"\n if (!(conn.includes('webview_devtools') && (!udid || conn.includes(udid)))) {\n continue;\n }\n\n let params = conn.split(/\\s+/);\n if (params.length > 1) {\n await this.adb.removePortForward(params[1].replace(/[\\D]*/, ''));\n }\n }\n } catch (err) {\n this.log.warn(`Unable to clean forwarded ports. Error: '${err.message}'. Continuing.`);\n }\n }\n }\n\n async hasWorkingWebview () {\n // sometimes chromedriver stops automating webviews. this method runs a\n // simple command to determine our state, and responds accordingly\n try {\n await this.jwproxy.command('/url', 'GET');\n return true;\n } catch (e) {\n return false;\n }\n }\n}\n\nChromedriver.EVENT_ERROR = 'chromedriver_error';\nChromedriver.EVENT_CHANGED = 'stateChanged';\nChromedriver.STATE_STOPPED = 'stopped';\nChromedriver.STATE_STARTING = 'starting';\nChromedriver.STATE_ONLINE = 'online';\nChromedriver.STATE_STOPPING = 'stopping';\nChromedriver.STATE_RESTARTING = 'restarting';\n\nexport { Chromedriver };\nexport default Chromedriver;\n"],"mappings":"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"}
@@ -7,7 +7,7 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.doInstall = doInstall;
8
8
  exports.install = install;
9
9
  require("source-map-support/register");
10
- var _support = require("appium/support");
10
+ var _support = require("@appium/support");
11
11
  var _storageClient = _interopRequireDefault(require("./storage-client"));
12
12
  var _utils = require("./utils");
13
13
  const DOWNLOAD_TIMEOUT_MS = 15 * 1000;
@@ -40,4 +40,4 @@ async function install() {
40
40
  async function doInstall() {
41
41
  await install();
42
42
  }
43
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJET1dOTE9BRF9USU1FT1VUX01TIiwiTEFURVNUX1ZFUlNJT04iLCJmb3JtYXRDZFZlcnNpb24iLCJ2ZXIiLCJyZXRyaWV2ZURhdGEiLCJDRF9DRE4iLCJhY2NlcHQiLCJ0aW1lb3V0IiwidHJpbSIsInByZXBhcmVDaHJvbWVkcml2ZXJEaXIiLCJwbGF0Zm9ybU5hbWUiLCJjaHJvbWVkcml2ZXJEaXIiLCJnZXRDaHJvbWVkcml2ZXJEaXIiLCJmcyIsImV4aXN0cyIsIm1rZGlycCIsImluc3RhbGwiLCJvc0luZm8iLCJnZXRPc0luZm8iLCJjbGllbnQiLCJDaHJvbWVkcml2ZXJTdG9yYWdlQ2xpZW50IiwibmFtZSIsInN5bmNEcml2ZXJzIiwidmVyc2lvbnMiLCJDRF9WRVIiLCJkb0luc3RhbGwiXSwic291cmNlcyI6WyIuLi8uLi9saWIvaW5zdGFsbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmcywgbWtkaXJwIH0gZnJvbSAnYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IENocm9tZWRyaXZlclN0b3JhZ2VDbGllbnQgZnJvbSAnLi9zdG9yYWdlLWNsaWVudCc7XG5pbXBvcnQge1xuICBDRF9DRE4sIENEX1ZFUiwgcmV0cmlldmVEYXRhLCBnZXRPc0luZm8sIGdldENocm9tZWRyaXZlckRpcixcbn0gZnJvbSAnLi91dGlscyc7XG5cblxuY29uc3QgRE9XTkxPQURfVElNRU9VVF9NUyA9IDE1ICogMTAwMDtcbmNvbnN0IExBVEVTVF9WRVJTSU9OID0gJ0xBVEVTVCc7XG5cbmFzeW5jIGZ1bmN0aW9uIGZvcm1hdENkVmVyc2lvbiAodmVyKSB7XG4gIHJldHVybiB2ZXIgPT09IExBVEVTVF9WRVJTSU9OXG4gICAgPyAoYXdhaXQgcmV0cmlldmVEYXRhKGAke0NEX0NETn0vTEFURVNUX1JFTEVBU0VgLCB7XG4gICAgICAndXNlci1hZ2VudCc6ICdhcHBpdW0nLFxuICAgICAgYWNjZXB0OiAnKi8qJyxcbiAgICB9LCB7IHRpbWVvdXQ6IERPV05MT0FEX1RJTUVPVVRfTVMgfSkpLnRyaW0oKVxuICAgIDogdmVyO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwcmVwYXJlQ2hyb21lZHJpdmVyRGlyIChwbGF0Zm9ybU5hbWUpIHtcbiAgY29uc3QgY2hyb21lZHJpdmVyRGlyID0gZ2V0Q2hyb21lZHJpdmVyRGlyKHBsYXRmb3JtTmFtZSk7XG4gIGlmICghYXdhaXQgZnMuZXhpc3RzKGNocm9tZWRyaXZlckRpcikpIHtcbiAgICBhd2FpdCBta2RpcnAoY2hyb21lZHJpdmVyRGlyKTtcbiAgfVxuICByZXR1cm4gY2hyb21lZHJpdmVyRGlyO1xufVxuXG5hc3luYyBmdW5jdGlvbiBpbnN0YWxsICgpIHtcbiAgY29uc3Qgb3NJbmZvID0gYXdhaXQgZ2V0T3NJbmZvKCk7XG4gIGNvbnN0IGNsaWVudCA9IG5ldyBDaHJvbWVkcml2ZXJTdG9yYWdlQ2xpZW50KHtcbiAgICBjaHJvbWVkcml2ZXJEaXI6IGF3YWl0IHByZXBhcmVDaHJvbWVkcml2ZXJEaXIob3NJbmZvLm5hbWUpLFxuICB9KTtcbiAgYXdhaXQgY2xpZW50LnN5bmNEcml2ZXJzKHtcbiAgICBvc0luZm8sXG4gICAgdmVyc2lvbnM6IFthd2FpdCBmb3JtYXRDZFZlcnNpb24oQ0RfVkVSKV0sXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkb0luc3RhbGwgKCkge1xuICBhd2FpdCBpbnN0YWxsKCk7XG59XG5cbmV4cG9ydCB7IGluc3RhbGwsIGRvSW5zdGFsbCB9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFLQSxNQUFNQSxtQkFBbUIsR0FBRyxFQUFFLEdBQUcsSUFBSTtBQUNyQyxNQUFNQyxjQUFjLEdBQUcsUUFBUTtBQUUvQixlQUFlQyxlQUFlLENBQUVDLEdBQUcsRUFBRTtFQUNuQyxPQUFPQSxHQUFHLEtBQUtGLGNBQWMsR0FDekIsQ0FBQyxNQUFNLElBQUFHLG1CQUFZLEVBQUUsR0FBRUMsYUFBTyxpQkFBZ0IsRUFBRTtJQUNoRCxZQUFZLEVBQUUsUUFBUTtJQUN0QkMsTUFBTSxFQUFFO0VBQ1YsQ0FBQyxFQUFFO0lBQUVDLE9BQU8sRUFBRVA7RUFBb0IsQ0FBQyxDQUFDLEVBQUVRLElBQUksRUFBRSxHQUMxQ0wsR0FBRztBQUNUO0FBRUEsZUFBZU0sc0JBQXNCLENBQUVDLFlBQVksRUFBRTtFQUNuRCxNQUFNQyxlQUFlLEdBQUcsSUFBQUMseUJBQWtCLEVBQUNGLFlBQVksQ0FBQztFQUN4RCxJQUFJLEVBQUMsTUFBTUcsV0FBRSxDQUFDQyxNQUFNLENBQUNILGVBQWUsQ0FBQyxHQUFFO0lBQ3JDLE1BQU0sSUFBQUksZUFBTSxFQUFDSixlQUFlLENBQUM7RUFDL0I7RUFDQSxPQUFPQSxlQUFlO0FBQ3hCO0FBRUEsZUFBZUssT0FBTyxHQUFJO0VBQ3hCLE1BQU1DLE1BQU0sR0FBRyxNQUFNLElBQUFDLGdCQUFTLEdBQUU7RUFDaEMsTUFBTUMsTUFBTSxHQUFHLElBQUlDLHNCQUF5QixDQUFDO0lBQzNDVCxlQUFlLEVBQUUsTUFBTUYsc0JBQXNCLENBQUNRLE1BQU0sQ0FBQ0ksSUFBSTtFQUMzRCxDQUFDLENBQUM7RUFDRixNQUFNRixNQUFNLENBQUNHLFdBQVcsQ0FBQztJQUN2QkwsTUFBTTtJQUNOTSxRQUFRLEVBQUUsQ0FBQyxNQUFNckIsZUFBZSxDQUFDc0IsYUFBTSxDQUFDO0VBQzFDLENBQUMsQ0FBQztBQUNKO0FBRUEsZUFBZUMsU0FBUyxHQUFJO0VBQzFCLE1BQU1ULE9BQU8sRUFBRTtBQUNqQiJ9
43
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJET1dOTE9BRF9USU1FT1VUX01TIiwiTEFURVNUX1ZFUlNJT04iLCJmb3JtYXRDZFZlcnNpb24iLCJ2ZXIiLCJyZXRyaWV2ZURhdGEiLCJDRF9DRE4iLCJhY2NlcHQiLCJ0aW1lb3V0IiwidHJpbSIsInByZXBhcmVDaHJvbWVkcml2ZXJEaXIiLCJwbGF0Zm9ybU5hbWUiLCJjaHJvbWVkcml2ZXJEaXIiLCJnZXRDaHJvbWVkcml2ZXJEaXIiLCJmcyIsImV4aXN0cyIsIm1rZGlycCIsImluc3RhbGwiLCJvc0luZm8iLCJnZXRPc0luZm8iLCJjbGllbnQiLCJDaHJvbWVkcml2ZXJTdG9yYWdlQ2xpZW50IiwibmFtZSIsInN5bmNEcml2ZXJzIiwidmVyc2lvbnMiLCJDRF9WRVIiLCJkb0luc3RhbGwiXSwic291cmNlcyI6WyIuLi8uLi9saWIvaW5zdGFsbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmcywgbWtkaXJwIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBDaHJvbWVkcml2ZXJTdG9yYWdlQ2xpZW50IGZyb20gJy4vc3RvcmFnZS1jbGllbnQnO1xuaW1wb3J0IHtcbiAgQ0RfQ0ROLCBDRF9WRVIsIHJldHJpZXZlRGF0YSwgZ2V0T3NJbmZvLCBnZXRDaHJvbWVkcml2ZXJEaXIsXG59IGZyb20gJy4vdXRpbHMnO1xuXG5cbmNvbnN0IERPV05MT0FEX1RJTUVPVVRfTVMgPSAxNSAqIDEwMDA7XG5jb25zdCBMQVRFU1RfVkVSU0lPTiA9ICdMQVRFU1QnO1xuXG5hc3luYyBmdW5jdGlvbiBmb3JtYXRDZFZlcnNpb24gKHZlcikge1xuICByZXR1cm4gdmVyID09PSBMQVRFU1RfVkVSU0lPTlxuICAgID8gKGF3YWl0IHJldHJpZXZlRGF0YShgJHtDRF9DRE59L0xBVEVTVF9SRUxFQVNFYCwge1xuICAgICAgJ3VzZXItYWdlbnQnOiAnYXBwaXVtJyxcbiAgICAgIGFjY2VwdDogJyovKicsXG4gICAgfSwgeyB0aW1lb3V0OiBET1dOTE9BRF9USU1FT1VUX01TIH0pKS50cmltKClcbiAgICA6IHZlcjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJlcGFyZUNocm9tZWRyaXZlckRpciAocGxhdGZvcm1OYW1lKSB7XG4gIGNvbnN0IGNocm9tZWRyaXZlckRpciA9IGdldENocm9tZWRyaXZlckRpcihwbGF0Zm9ybU5hbWUpO1xuICBpZiAoIWF3YWl0IGZzLmV4aXN0cyhjaHJvbWVkcml2ZXJEaXIpKSB7XG4gICAgYXdhaXQgbWtkaXJwKGNocm9tZWRyaXZlckRpcik7XG4gIH1cbiAgcmV0dXJuIGNocm9tZWRyaXZlckRpcjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaW5zdGFsbCAoKSB7XG4gIGNvbnN0IG9zSW5mbyA9IGF3YWl0IGdldE9zSW5mbygpO1xuICBjb25zdCBjbGllbnQgPSBuZXcgQ2hyb21lZHJpdmVyU3RvcmFnZUNsaWVudCh7XG4gICAgY2hyb21lZHJpdmVyRGlyOiBhd2FpdCBwcmVwYXJlQ2hyb21lZHJpdmVyRGlyKG9zSW5mby5uYW1lKSxcbiAgfSk7XG4gIGF3YWl0IGNsaWVudC5zeW5jRHJpdmVycyh7XG4gICAgb3NJbmZvLFxuICAgIHZlcnNpb25zOiBbYXdhaXQgZm9ybWF0Q2RWZXJzaW9uKENEX1ZFUildLFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZG9JbnN0YWxsICgpIHtcbiAgYXdhaXQgaW5zdGFsbCgpO1xufVxuXG5leHBvcnQgeyBpbnN0YWxsLCBkb0luc3RhbGwgfTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBS0EsTUFBTUEsbUJBQW1CLEdBQUcsRUFBRSxHQUFHLElBQUk7QUFDckMsTUFBTUMsY0FBYyxHQUFHLFFBQVE7QUFFL0IsZUFBZUMsZUFBZSxDQUFFQyxHQUFHLEVBQUU7RUFDbkMsT0FBT0EsR0FBRyxLQUFLRixjQUFjLEdBQ3pCLENBQUMsTUFBTSxJQUFBRyxtQkFBWSxFQUFFLEdBQUVDLGFBQU8saUJBQWdCLEVBQUU7SUFDaEQsWUFBWSxFQUFFLFFBQVE7SUFDdEJDLE1BQU0sRUFBRTtFQUNWLENBQUMsRUFBRTtJQUFFQyxPQUFPLEVBQUVQO0VBQW9CLENBQUMsQ0FBQyxFQUFFUSxJQUFJLEVBQUUsR0FDMUNMLEdBQUc7QUFDVDtBQUVBLGVBQWVNLHNCQUFzQixDQUFFQyxZQUFZLEVBQUU7RUFDbkQsTUFBTUMsZUFBZSxHQUFHLElBQUFDLHlCQUFrQixFQUFDRixZQUFZLENBQUM7RUFDeEQsSUFBSSxFQUFDLE1BQU1HLFdBQUUsQ0FBQ0MsTUFBTSxDQUFDSCxlQUFlLENBQUMsR0FBRTtJQUNyQyxNQUFNLElBQUFJLGVBQU0sRUFBQ0osZUFBZSxDQUFDO0VBQy9CO0VBQ0EsT0FBT0EsZUFBZTtBQUN4QjtBQUVBLGVBQWVLLE9BQU8sR0FBSTtFQUN4QixNQUFNQyxNQUFNLEdBQUcsTUFBTSxJQUFBQyxnQkFBUyxHQUFFO0VBQ2hDLE1BQU1DLE1BQU0sR0FBRyxJQUFJQyxzQkFBeUIsQ0FBQztJQUMzQ1QsZUFBZSxFQUFFLE1BQU1GLHNCQUFzQixDQUFDUSxNQUFNLENBQUNJLElBQUk7RUFDM0QsQ0FBQyxDQUFDO0VBQ0YsTUFBTUYsTUFBTSxDQUFDRyxXQUFXLENBQUM7SUFDdkJMLE1BQU07SUFDTk0sUUFBUSxFQUFFLENBQUMsTUFBTXJCLGVBQWUsQ0FBQ3NCLGFBQU0sQ0FBQztFQUMxQyxDQUFDLENBQUM7QUFDSjtBQUVBLGVBQWVDLFNBQVMsR0FBSTtFQUMxQixNQUFNVCxPQUFPLEVBQUU7QUFDakIifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"install.js","names":["DOWNLOAD_TIMEOUT_MS","LATEST_VERSION","formatCdVersion","ver","retrieveData","CD_CDN","accept","timeout","trim","prepareChromedriverDir","platformName","chromedriverDir","getChromedriverDir","fs","exists","mkdirp","install","osInfo","getOsInfo","client","ChromedriverStorageClient","name","syncDrivers","versions","CD_VER","doInstall"],"sources":["../../lib/install.js"],"sourcesContent":["import { fs, mkdirp } from 'appium/support';\nimport ChromedriverStorageClient from './storage-client';\nimport {\n CD_CDN, CD_VER, retrieveData, getOsInfo, getChromedriverDir,\n} from './utils';\n\n\nconst DOWNLOAD_TIMEOUT_MS = 15 * 1000;\nconst LATEST_VERSION = 'LATEST';\n\nasync function formatCdVersion (ver) {\n return ver === LATEST_VERSION\n ? (await retrieveData(`${CD_CDN}/LATEST_RELEASE`, {\n 'user-agent': 'appium',\n accept: '*/*',\n }, { timeout: DOWNLOAD_TIMEOUT_MS })).trim()\n : ver;\n}\n\nasync function prepareChromedriverDir (platformName) {\n const chromedriverDir = getChromedriverDir(platformName);\n if (!await fs.exists(chromedriverDir)) {\n await mkdirp(chromedriverDir);\n }\n return chromedriverDir;\n}\n\nasync function install () {\n const osInfo = await getOsInfo();\n const client = new ChromedriverStorageClient({\n chromedriverDir: await prepareChromedriverDir(osInfo.name),\n });\n await client.syncDrivers({\n osInfo,\n versions: [await formatCdVersion(CD_VER)],\n });\n}\n\nasync function doInstall () {\n await install();\n}\n\nexport { install, doInstall };\n"],"mappings":";;;;;;;;;AAAA;AACA;AACA;AAKA,MAAMA,mBAAmB,GAAG,EAAE,GAAG,IAAI;AACrC,MAAMC,cAAc,GAAG,QAAQ;AAE/B,eAAeC,eAAe,CAAEC,GAAG,EAAE;EACnC,OAAOA,GAAG,KAAKF,cAAc,GACzB,CAAC,MAAM,IAAAG,mBAAY,EAAE,GAAEC,aAAO,iBAAgB,EAAE;IAChD,YAAY,EAAE,QAAQ;IACtBC,MAAM,EAAE;EACV,CAAC,EAAE;IAAEC,OAAO,EAAEP;EAAoB,CAAC,CAAC,EAAEQ,IAAI,EAAE,GAC1CL,GAAG;AACT;AAEA,eAAeM,sBAAsB,CAAEC,YAAY,EAAE;EACnD,MAAMC,eAAe,GAAG,IAAAC,yBAAkB,EAACF,YAAY,CAAC;EACxD,IAAI,EAAC,MAAMG,WAAE,CAACC,MAAM,CAACH,eAAe,CAAC,GAAE;IACrC,MAAM,IAAAI,eAAM,EAACJ,eAAe,CAAC;EAC/B;EACA,OAAOA,eAAe;AACxB;AAEA,eAAeK,OAAO,GAAI;EACxB,MAAMC,MAAM,GAAG,MAAM,IAAAC,gBAAS,GAAE;EAChC,MAAMC,MAAM,GAAG,IAAIC,sBAAyB,CAAC;IAC3CT,eAAe,EAAE,MAAMF,sBAAsB,CAACQ,MAAM,CAACI,IAAI;EAC3D,CAAC,CAAC;EACF,MAAMF,MAAM,CAACG,WAAW,CAAC;IACvBL,MAAM;IACNM,QAAQ,EAAE,CAAC,MAAMrB,eAAe,CAACsB,aAAM,CAAC;EAC1C,CAAC,CAAC;AACJ;AAEA,eAAeC,SAAS,GAAI;EAC1B,MAAMT,OAAO,EAAE;AACjB"}
1
+ {"version":3,"file":"install.js","names":["DOWNLOAD_TIMEOUT_MS","LATEST_VERSION","formatCdVersion","ver","retrieveData","CD_CDN","accept","timeout","trim","prepareChromedriverDir","platformName","chromedriverDir","getChromedriverDir","fs","exists","mkdirp","install","osInfo","getOsInfo","client","ChromedriverStorageClient","name","syncDrivers","versions","CD_VER","doInstall"],"sources":["../../lib/install.js"],"sourcesContent":["import { fs, mkdirp } from '@appium/support';\nimport ChromedriverStorageClient from './storage-client';\nimport {\n CD_CDN, CD_VER, retrieveData, getOsInfo, getChromedriverDir,\n} from './utils';\n\n\nconst DOWNLOAD_TIMEOUT_MS = 15 * 1000;\nconst LATEST_VERSION = 'LATEST';\n\nasync function formatCdVersion (ver) {\n return ver === LATEST_VERSION\n ? (await retrieveData(`${CD_CDN}/LATEST_RELEASE`, {\n 'user-agent': 'appium',\n accept: '*/*',\n }, { timeout: DOWNLOAD_TIMEOUT_MS })).trim()\n : ver;\n}\n\nasync function prepareChromedriverDir (platformName) {\n const chromedriverDir = getChromedriverDir(platformName);\n if (!await fs.exists(chromedriverDir)) {\n await mkdirp(chromedriverDir);\n }\n return chromedriverDir;\n}\n\nasync function install () {\n const osInfo = await getOsInfo();\n const client = new ChromedriverStorageClient({\n chromedriverDir: await prepareChromedriverDir(osInfo.name),\n });\n await client.syncDrivers({\n osInfo,\n versions: [await formatCdVersion(CD_VER)],\n });\n}\n\nasync function doInstall () {\n await install();\n}\n\nexport { install, doInstall };\n"],"mappings":";;;;;;;;;AAAA;AACA;AACA;AAKA,MAAMA,mBAAmB,GAAG,EAAE,GAAG,IAAI;AACrC,MAAMC,cAAc,GAAG,QAAQ;AAE/B,eAAeC,eAAe,CAAEC,GAAG,EAAE;EACnC,OAAOA,GAAG,KAAKF,cAAc,GACzB,CAAC,MAAM,IAAAG,mBAAY,EAAE,GAAEC,aAAO,iBAAgB,EAAE;IAChD,YAAY,EAAE,QAAQ;IACtBC,MAAM,EAAE;EACV,CAAC,EAAE;IAAEC,OAAO,EAAEP;EAAoB,CAAC,CAAC,EAAEQ,IAAI,EAAE,GAC1CL,GAAG;AACT;AAEA,eAAeM,sBAAsB,CAAEC,YAAY,EAAE;EACnD,MAAMC,eAAe,GAAG,IAAAC,yBAAkB,EAACF,YAAY,CAAC;EACxD,IAAI,EAAC,MAAMG,WAAE,CAACC,MAAM,CAACH,eAAe,CAAC,GAAE;IACrC,MAAM,IAAAI,eAAM,EAACJ,eAAe,CAAC;EAC/B;EACA,OAAOA,eAAe;AACxB;AAEA,eAAeK,OAAO,GAAI;EACxB,MAAMC,MAAM,GAAG,MAAM,IAAAC,gBAAS,GAAE;EAChC,MAAMC,MAAM,GAAG,IAAIC,sBAAyB,CAAC;IAC3CT,eAAe,EAAE,MAAMF,sBAAsB,CAACQ,MAAM,CAACI,IAAI;EAC3D,CAAC,CAAC;EACF,MAAMF,MAAM,CAACG,WAAW,CAAC;IACvBL,MAAM;IACNM,QAAQ,EAAE,CAAC,MAAMrB,eAAe,CAACsB,aAAM,CAAC;EAC1C,CAAC,CAAC;AACJ;AAEA,eAAeC,SAAS,GAAI;EAC1B,MAAMT,OAAO,EAAE;AACjB"}
@@ -8,10 +8,10 @@ exports.getCapValue = getCapValue;
8
8
  exports.toW3cCapNames = toW3cCapNames;
9
9
  require("source-map-support/register");
10
10
  var _lodash = _interopRequireDefault(require("lodash"));
11
- var _driver = require("appium/driver");
11
+ var _baseDriver = require("@appium/base-driver");
12
12
  const W3C_PREFIX = 'goog:';
13
13
  function toW3cCapName(capName) {
14
- return _lodash.default.isString(capName) && !capName.includes(':') && !(0, _driver.isStandardCap)(capName) ? `${W3C_PREFIX}${capName}` : capName;
14
+ return _lodash.default.isString(capName) && !capName.includes(':') && !(0, _baseDriver.isStandardCap)(capName) ? `${W3C_PREFIX}${capName}` : capName;
15
15
  }
16
16
  function getCapValue(allCaps = {}, rawCapName, defaultValue) {
17
17
  for (const [capName, capValue] of _lodash.default.toPairs(allCaps)) {
@@ -27,4 +27,4 @@ function toW3cCapNames(originalCaps = {}) {
27
27
  return acc;
28
28
  }, {});
29
29
  }
30
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJXM0NfUFJFRklYIiwidG9XM2NDYXBOYW1lIiwiY2FwTmFtZSIsIl8iLCJpc1N0cmluZyIsImluY2x1ZGVzIiwiaXNTdGFuZGFyZENhcCIsImdldENhcFZhbHVlIiwiYWxsQ2FwcyIsInJhd0NhcE5hbWUiLCJkZWZhdWx0VmFsdWUiLCJjYXBWYWx1ZSIsInRvUGFpcnMiLCJ0b1czY0NhcE5hbWVzIiwib3JpZ2luYWxDYXBzIiwicmVkdWNlIiwiYWNjIiwidmFsdWUiLCJrZXkiXSwic291cmNlcyI6WyIuLi8uLi9saWIvcHJvdG9jb2wtaGVscGVycy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgaXNTdGFuZGFyZENhcCB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuXG5jb25zdCBXM0NfUFJFRklYID0gJ2dvb2c6JztcblxuZnVuY3Rpb24gdG9XM2NDYXBOYW1lIChjYXBOYW1lKSB7XG4gIHJldHVybiAoXy5pc1N0cmluZyhjYXBOYW1lKSAmJiAhY2FwTmFtZS5pbmNsdWRlcygnOicpICYmICFpc1N0YW5kYXJkQ2FwKGNhcE5hbWUpKVxuICAgID8gYCR7VzNDX1BSRUZJWH0ke2NhcE5hbWV9YFxuICAgIDogY2FwTmFtZTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2FwVmFsdWUgKGFsbENhcHMgPSB7fSwgcmF3Q2FwTmFtZSwgZGVmYXVsdFZhbHVlKSB7XG4gIGZvciAoY29uc3QgW2NhcE5hbWUsIGNhcFZhbHVlXSBvZiBfLnRvUGFpcnMoYWxsQ2FwcykpIHtcbiAgICBpZiAodG9XM2NDYXBOYW1lKGNhcE5hbWUpID09PSB0b1czY0NhcE5hbWUocmF3Q2FwTmFtZSkpIHtcbiAgICAgIHJldHVybiBjYXBWYWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbn1cblxuZnVuY3Rpb24gdG9XM2NDYXBOYW1lcyAob3JpZ2luYWxDYXBzID0ge30pIHtcbiAgcmV0dXJuIF8ucmVkdWNlKG9yaWdpbmFsQ2FwcywgKGFjYywgdmFsdWUsIGtleSkgPT4ge1xuICAgIGFjY1t0b1czY0NhcE5hbWUoa2V5KV0gPSB2YWx1ZTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSk7XG59XG5cbmV4cG9ydCB7IHRvVzNjQ2FwTmFtZXMsIGdldENhcFZhbHVlIH07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFFQSxNQUFNQSxVQUFVLEdBQUcsT0FBTztBQUUxQixTQUFTQyxZQUFZLENBQUVDLE9BQU8sRUFBRTtFQUM5QixPQUFRQyxlQUFDLENBQUNDLFFBQVEsQ0FBQ0YsT0FBTyxDQUFDLElBQUksQ0FBQ0EsT0FBTyxDQUFDRyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFBQyxxQkFBYSxFQUFDSixPQUFPLENBQUMsR0FDM0UsR0FBRUYsVUFBVyxHQUFFRSxPQUFRLEVBQUMsR0FDekJBLE9BQU87QUFDYjtBQUVBLFNBQVNLLFdBQVcsQ0FBRUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFQyxVQUFVLEVBQUVDLFlBQVksRUFBRTtFQUM1RCxLQUFLLE1BQU0sQ0FBQ1IsT0FBTyxFQUFFUyxRQUFRLENBQUMsSUFBSVIsZUFBQyxDQUFDUyxPQUFPLENBQUNKLE9BQU8sQ0FBQyxFQUFFO0lBQ3BELElBQUlQLFlBQVksQ0FBQ0MsT0FBTyxDQUFDLEtBQUtELFlBQVksQ0FBQ1EsVUFBVSxDQUFDLEVBQUU7TUFDdEQsT0FBT0UsUUFBUTtJQUNqQjtFQUNGO0VBQ0EsT0FBT0QsWUFBWTtBQUNyQjtBQUVBLFNBQVNHLGFBQWEsQ0FBRUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxFQUFFO0VBQ3pDLE9BQU9YLGVBQUMsQ0FBQ1ksTUFBTSxDQUFDRCxZQUFZLEVBQUUsQ0FBQ0UsR0FBRyxFQUFFQyxLQUFLLEVBQUVDLEdBQUcsS0FBSztJQUNqREYsR0FBRyxDQUFDZixZQUFZLENBQUNpQixHQUFHLENBQUMsQ0FBQyxHQUFHRCxLQUFLO0lBQzlCLE9BQU9ELEdBQUc7RUFDWixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDUiJ9
30
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJXM0NfUFJFRklYIiwidG9XM2NDYXBOYW1lIiwiY2FwTmFtZSIsIl8iLCJpc1N0cmluZyIsImluY2x1ZGVzIiwiaXNTdGFuZGFyZENhcCIsImdldENhcFZhbHVlIiwiYWxsQ2FwcyIsInJhd0NhcE5hbWUiLCJkZWZhdWx0VmFsdWUiLCJjYXBWYWx1ZSIsInRvUGFpcnMiLCJ0b1czY0NhcE5hbWVzIiwib3JpZ2luYWxDYXBzIiwicmVkdWNlIiwiYWNjIiwidmFsdWUiLCJrZXkiXSwic291cmNlcyI6WyIuLi8uLi9saWIvcHJvdG9jb2wtaGVscGVycy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgaXNTdGFuZGFyZENhcCB9IGZyb20gJ0BhcHBpdW0vYmFzZS1kcml2ZXInO1xuXG5jb25zdCBXM0NfUFJFRklYID0gJ2dvb2c6JztcblxuZnVuY3Rpb24gdG9XM2NDYXBOYW1lIChjYXBOYW1lKSB7XG4gIHJldHVybiAoXy5pc1N0cmluZyhjYXBOYW1lKSAmJiAhY2FwTmFtZS5pbmNsdWRlcygnOicpICYmICFpc1N0YW5kYXJkQ2FwKGNhcE5hbWUpKVxuICAgID8gYCR7VzNDX1BSRUZJWH0ke2NhcE5hbWV9YFxuICAgIDogY2FwTmFtZTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2FwVmFsdWUgKGFsbENhcHMgPSB7fSwgcmF3Q2FwTmFtZSwgZGVmYXVsdFZhbHVlKSB7XG4gIGZvciAoY29uc3QgW2NhcE5hbWUsIGNhcFZhbHVlXSBvZiBfLnRvUGFpcnMoYWxsQ2FwcykpIHtcbiAgICBpZiAodG9XM2NDYXBOYW1lKGNhcE5hbWUpID09PSB0b1czY0NhcE5hbWUocmF3Q2FwTmFtZSkpIHtcbiAgICAgIHJldHVybiBjYXBWYWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbn1cblxuZnVuY3Rpb24gdG9XM2NDYXBOYW1lcyAob3JpZ2luYWxDYXBzID0ge30pIHtcbiAgcmV0dXJuIF8ucmVkdWNlKG9yaWdpbmFsQ2FwcywgKGFjYywgdmFsdWUsIGtleSkgPT4ge1xuICAgIGFjY1t0b1czY0NhcE5hbWUoa2V5KV0gPSB2YWx1ZTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSk7XG59XG5cbmV4cG9ydCB7IHRvVzNjQ2FwTmFtZXMsIGdldENhcFZhbHVlIH07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFFQSxNQUFNQSxVQUFVLEdBQUcsT0FBTztBQUUxQixTQUFTQyxZQUFZLENBQUVDLE9BQU8sRUFBRTtFQUM5QixPQUFRQyxlQUFDLENBQUNDLFFBQVEsQ0FBQ0YsT0FBTyxDQUFDLElBQUksQ0FBQ0EsT0FBTyxDQUFDRyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFBQyx5QkFBYSxFQUFDSixPQUFPLENBQUMsR0FDM0UsR0FBRUYsVUFBVyxHQUFFRSxPQUFRLEVBQUMsR0FDekJBLE9BQU87QUFDYjtBQUVBLFNBQVNLLFdBQVcsQ0FBRUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFQyxVQUFVLEVBQUVDLFlBQVksRUFBRTtFQUM1RCxLQUFLLE1BQU0sQ0FBQ1IsT0FBTyxFQUFFUyxRQUFRLENBQUMsSUFBSVIsZUFBQyxDQUFDUyxPQUFPLENBQUNKLE9BQU8sQ0FBQyxFQUFFO0lBQ3BELElBQUlQLFlBQVksQ0FBQ0MsT0FBTyxDQUFDLEtBQUtELFlBQVksQ0FBQ1EsVUFBVSxDQUFDLEVBQUU7TUFDdEQsT0FBT0UsUUFBUTtJQUNqQjtFQUNGO0VBQ0EsT0FBT0QsWUFBWTtBQUNyQjtBQUVBLFNBQVNHLGFBQWEsQ0FBRUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxFQUFFO0VBQ3pDLE9BQU9YLGVBQUMsQ0FBQ1ksTUFBTSxDQUFDRCxZQUFZLEVBQUUsQ0FBQ0UsR0FBRyxFQUFFQyxLQUFLLEVBQUVDLEdBQUcsS0FBSztJQUNqREYsR0FBRyxDQUFDZixZQUFZLENBQUNpQixHQUFHLENBQUMsQ0FBQyxHQUFHRCxLQUFLO0lBQzlCLE9BQU9ELEdBQUc7RUFDWixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDUiJ9
@@ -1 +1 @@
1
- {"version":3,"file":"protocol-helpers.js","names":["W3C_PREFIX","toW3cCapName","capName","_","isString","includes","isStandardCap","getCapValue","allCaps","rawCapName","defaultValue","capValue","toPairs","toW3cCapNames","originalCaps","reduce","acc","value","key"],"sources":["../../lib/protocol-helpers.js"],"sourcesContent":["import _ from 'lodash';\nimport { isStandardCap } from 'appium/driver';\n\nconst W3C_PREFIX = 'goog:';\n\nfunction toW3cCapName (capName) {\n return (_.isString(capName) && !capName.includes(':') && !isStandardCap(capName))\n ? `${W3C_PREFIX}${capName}`\n : capName;\n}\n\nfunction getCapValue (allCaps = {}, rawCapName, defaultValue) {\n for (const [capName, capValue] of _.toPairs(allCaps)) {\n if (toW3cCapName(capName) === toW3cCapName(rawCapName)) {\n return capValue;\n }\n }\n return defaultValue;\n}\n\nfunction toW3cCapNames (originalCaps = {}) {\n return _.reduce(originalCaps, (acc, value, key) => {\n acc[toW3cCapName(key)] = value;\n return acc;\n }, {});\n}\n\nexport { toW3cCapNames, getCapValue };\n"],"mappings":";;;;;;;;;AAAA;AACA;AAEA,MAAMA,UAAU,GAAG,OAAO;AAE1B,SAASC,YAAY,CAAEC,OAAO,EAAE;EAC9B,OAAQC,eAAC,CAACC,QAAQ,CAACF,OAAO,CAAC,IAAI,CAACA,OAAO,CAACG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAAC,qBAAa,EAACJ,OAAO,CAAC,GAC3E,GAAEF,UAAW,GAAEE,OAAQ,EAAC,GACzBA,OAAO;AACb;AAEA,SAASK,WAAW,CAAEC,OAAO,GAAG,CAAC,CAAC,EAAEC,UAAU,EAAEC,YAAY,EAAE;EAC5D,KAAK,MAAM,CAACR,OAAO,EAAES,QAAQ,CAAC,IAAIR,eAAC,CAACS,OAAO,CAACJ,OAAO,CAAC,EAAE;IACpD,IAAIP,YAAY,CAACC,OAAO,CAAC,KAAKD,YAAY,CAACQ,UAAU,CAAC,EAAE;MACtD,OAAOE,QAAQ;IACjB;EACF;EACA,OAAOD,YAAY;AACrB;AAEA,SAASG,aAAa,CAAEC,YAAY,GAAG,CAAC,CAAC,EAAE;EACzC,OAAOX,eAAC,CAACY,MAAM,CAACD,YAAY,EAAE,CAACE,GAAG,EAAEC,KAAK,EAAEC,GAAG,KAAK;IACjDF,GAAG,CAACf,YAAY,CAACiB,GAAG,CAAC,CAAC,GAAGD,KAAK;IAC9B,OAAOD,GAAG;EACZ,CAAC,EAAE,CAAC,CAAC,CAAC;AACR"}
1
+ {"version":3,"file":"protocol-helpers.js","names":["W3C_PREFIX","toW3cCapName","capName","_","isString","includes","isStandardCap","getCapValue","allCaps","rawCapName","defaultValue","capValue","toPairs","toW3cCapNames","originalCaps","reduce","acc","value","key"],"sources":["../../lib/protocol-helpers.js"],"sourcesContent":["import _ from 'lodash';\nimport { isStandardCap } from '@appium/base-driver';\n\nconst W3C_PREFIX = 'goog:';\n\nfunction toW3cCapName (capName) {\n return (_.isString(capName) && !capName.includes(':') && !isStandardCap(capName))\n ? `${W3C_PREFIX}${capName}`\n : capName;\n}\n\nfunction getCapValue (allCaps = {}, rawCapName, defaultValue) {\n for (const [capName, capValue] of _.toPairs(allCaps)) {\n if (toW3cCapName(capName) === toW3cCapName(rawCapName)) {\n return capValue;\n }\n }\n return defaultValue;\n}\n\nfunction toW3cCapNames (originalCaps = {}) {\n return _.reduce(originalCaps, (acc, value, key) => {\n acc[toW3cCapName(key)] = value;\n return acc;\n }, {});\n}\n\nexport { toW3cCapNames, getCapValue };\n"],"mappings":";;;;;;;;;AAAA;AACA;AAEA,MAAMA,UAAU,GAAG,OAAO;AAE1B,SAASC,YAAY,CAAEC,OAAO,EAAE;EAC9B,OAAQC,eAAC,CAACC,QAAQ,CAACF,OAAO,CAAC,IAAI,CAACA,OAAO,CAACG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAAC,yBAAa,EAACJ,OAAO,CAAC,GAC3E,GAAEF,UAAW,GAAEE,OAAQ,EAAC,GACzBA,OAAO;AACb;AAEA,SAASK,WAAW,CAAEC,OAAO,GAAG,CAAC,CAAC,EAAEC,UAAU,EAAEC,YAAY,EAAE;EAC5D,KAAK,MAAM,CAACR,OAAO,EAAES,QAAQ,CAAC,IAAIR,eAAC,CAACS,OAAO,CAACJ,OAAO,CAAC,EAAE;IACpD,IAAIP,YAAY,CAACC,OAAO,CAAC,KAAKD,YAAY,CAACQ,UAAU,CAAC,EAAE;MACtD,OAAOE,QAAQ;IACjB;EACF;EACA,OAAOD,YAAY;AACrB;AAEA,SAASG,aAAa,CAAEC,YAAY,GAAG,CAAC,CAAC,EAAE;EACzC,OAAOX,eAAC,CAACY,MAAM,CAACD,YAAY,EAAE,CAACE,GAAG,EAAEC,KAAK,EAAEC,GAAG,KAAK;IACjDF,GAAG,CAACf,YAAY,CAACiB,GAAG,CAAC,CAAC,GAAGD,KAAK;IAC9B,OAAOD,GAAG;EACZ,CAAC,EAAE,CAAC,CAAC,CAAC;AACR"}
@@ -12,7 +12,7 @@ var _xpath = _interopRequireDefault(require("xpath"));
12
12
  var _xmldom = require("@xmldom/xmldom");
13
13
  var _bluebird = _interopRequireDefault(require("bluebird"));
14
14
  var _path = _interopRequireDefault(require("path"));
15
- var _support = require("appium/support");
15
+ var _support = require("@appium/support");
16
16
  const TIMEOUT_MS = 15000;
17
17
  const MAX_PARALLEL_DOWNLOADS = 5;
18
18
  const log = _support.logger.getLogger('ChromedriverStorageClient');
@@ -300,4 +300,4 @@ class ChromedriverStorageClient {
300
300
  }
301
301
  var _default = ChromedriverStorageClient;
302
302
  exports.default = _default;
303
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJUSU1FT1VUX01TIiwiTUFYX1BBUkFMTEVMX0RPV05MT0FEUyIsImxvZyIsImxvZ2dlciIsImdldExvZ2dlciIsImlzQ3JjT2siLCJzcmMiLCJjaGVja3N1bSIsIm1kNSIsImZzIiwiaGFzaCIsIl8iLCJ0b0xvd2VyIiwiZmluZENoaWxkTm9kZSIsInBhcmVudCIsImNoaWxkTmFtZSIsInRleHQiLCJoYXNDaGlsZE5vZGVzIiwiY2hpbGROb2RlSWR4IiwiY2hpbGROb2RlcyIsImxlbmd0aCIsImNoaWxkTm9kZSIsImxvY2FsTmFtZSIsImNoaWxkVGV4dCIsImV4dHJhY3ROb2RlVGV4dCIsIm5vZGUiLCJmaXJzdENoaWxkIiwidXRpbCIsImhhc1ZhbHVlIiwibm9kZVZhbHVlIiwiQ2hyb21lZHJpdmVyU3RvcmFnZUNsaWVudCIsImNvbnN0cnVjdG9yIiwiYXJncyIsImNocm9tZWRyaXZlckRpciIsImdldENocm9tZWRyaXZlckRpciIsInRpbWVvdXQiLCJtYXBwaW5nIiwicGFyc2VOb3RlcyIsImNvbnRlbnQiLCJyZXN1bHQiLCJ2ZXJzaW9uTWF0Y2giLCJleGVjIiwidmVyc2lvbiIsIm1pbkJyb3dzZXJWZXJzaW9uTWF0Y2giLCJtaW5Ccm93c2VyVmVyc2lvbiIsInJldHJpZXZlQWRkaXRpb25hbERyaXZlckluZm8iLCJkcml2ZXJLZXkiLCJub3Rlc1VybCIsImluZm9EaWN0Iiwibm90ZXMiLCJyZXRyaWV2ZURhdGEiLCJhY2NlcHQiLCJkZWJ1ZyIsInBhcnNlU3RvcmFnZVhtbCIsImRvYyIsInNob3VsZFBhcnNlTm90ZXMiLCJkcml2ZXJOb2RlcyIsInhwYXRoIiwic2VsZWN0IiwiaXNFbXB0eSIsInByb21pc2VzIiwiZHJpdmVyTm9kZSIsImtleSIsImluY2x1ZGVzIiwiZXRhZyIsImNkSW5mbyIsInVybCIsIkNEX0NETiIsInRyaW0iLCJmaXJzdCIsInNwbGl0Iiwibm90ZXNQYXRoIiwiaXNOb3Rlc1ByZXNlbnQiLCJyZWR1Y2UiLCJhY2MiLCJpbmZvIiwicHVzaCIsIkIiLCJhbGwiLCJzaXplIiwicmV0cmlldmVNYXBwaW5nIiwieG1sIiwiRE9NUGFyc2VyIiwicGFyc2VGcm9tU3RyaW5nIiwiY2xvbmVEZWVwIiwidW56aXBEcml2ZXIiLCJkc3QiLCJ0bXBSb290IiwidGVtcERpciIsIm9wZW5EaXIiLCJ6aXAiLCJleHRyYWN0QWxsVG8iLCJjaHJvbWVkcml2ZXJQYXRoIiwid2Fsa0RpciIsIml0ZW1QYXRoIiwiaXNEaXJlY3RvcnkiLCJwYXRoIiwicGFyc2UiLCJuYW1lIiwiRXJyb3IiLCJiYXNlbmFtZSIsIm12IiwibWtkaXJwIiwicmltcmFmIiwic2VsZWN0TWF0Y2hpbmdEcml2ZXJzIiwib3NJbmZvIiwib3B0cyIsInZlcnNpb25zIiwiZHJpdmVyc1RvU3luYyIsImtleXMiLCJmaWx0ZXIiLCJjZE5hbWUiLCJwbHVyYWxpemUiLCJpc05hTiIsIm1pbkJyb3dzZXJWZXJzaW9uSW50IiwicGFyc2VJbnQiLCJjbG9zZXN0TWF0Y2hlZFZlcnNpb25OdW1iZXIiLCJjdXJyZW50TWluQnJvd3NlclZlcnNpb24iLCJ1bmlxIiwibWFwIiwiYXJjaCIsImhhcmR3YXJlTmFtZSIsIlg2NCIsInNvbWUiLCJYODYiLCJPUyIsIm1hYyIsIk0xX0FSQ0hfU1VGRklYIiwicGxhdGZvcm1SZSIsIlJlZ0V4cCIsInRlc3QiLCJyZXRyaWV2ZURyaXZlciIsImluZGV4IiwiYXJjaGl2ZXNSb290IiwiaXNTdHJpY3QiLCJhcmNoaXZlUGF0aCIsInJlc29sdmUiLCJuZXQiLCJkb3dubG9hZEZpbGUiLCJpc01ldGVyZWQiLCJlIiwibXNnIiwibWVzc2FnZSIsImVycm9yIiwiZmlsZU5hbWUiLCJzeXN0ZW0iLCJpc1dpbmRvd3MiLCJ0YXJnZXRQYXRoIiwiY2htb2QiLCJzeW5jRHJpdmVycyIsImdldE9zSW5mbyIsIkpTT04iLCJzdHJpbmdpZnkiLCJzeW5jaHJvbml6ZWREcml2ZXJzIiwiaWR4IiwiZW50cmllcyJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9zdG9yYWdlLWNsaWVudC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBnZXRDaHJvbWVkcml2ZXJEaXIsIENEX0NETiwgcmV0cmlldmVEYXRhLCBnZXRPc0luZm8sXG4gIE9TLCBYNjQsIFg4NiwgTTFfQVJDSF9TVUZGSVgsXG59IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB4cGF0aCBmcm9tICd4cGF0aCc7XG5pbXBvcnQgeyBET01QYXJzZXIgfSBmcm9tICdAeG1sZG9tL3htbGRvbSc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IHN5c3RlbSwgZnMsIGxvZ2dlciwgdGVtcERpciwgemlwLCB1dGlsLCBuZXQgfSBmcm9tICdhcHBpdW0vc3VwcG9ydCc7XG5cblxuY29uc3QgVElNRU9VVF9NUyA9IDE1MDAwO1xuY29uc3QgTUFYX1BBUkFMTEVMX0RPV05MT0FEUyA9IDU7XG5cbmNvbnN0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ0Nocm9tZWRyaXZlclN0b3JhZ2VDbGllbnQnKTtcblxuXG5hc3luYyBmdW5jdGlvbiBpc0NyY09rIChzcmMsIGNoZWNrc3VtKSB7XG4gIGNvbnN0IG1kNSA9IGF3YWl0IGZzLmhhc2goc3JjLCAnbWQ1Jyk7XG4gIHJldHVybiBfLnRvTG93ZXIobWQ1KSA9PT0gXy50b0xvd2VyKGNoZWNrc3VtKTtcbn1cblxuZnVuY3Rpb24gZmluZENoaWxkTm9kZSAocGFyZW50LCBjaGlsZE5hbWUgPSBudWxsLCB0ZXh0ID0gbnVsbCkge1xuICBpZiAoIWNoaWxkTmFtZSAmJiAhdGV4dCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmICghcGFyZW50Lmhhc0NoaWxkTm9kZXMoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZm9yIChsZXQgY2hpbGROb2RlSWR4ID0gMDsgY2hpbGROb2RlSWR4IDwgcGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoOyBjaGlsZE5vZGVJZHgrKykge1xuICAgIGNvbnN0IGNoaWxkTm9kZSA9IHBhcmVudC5jaGlsZE5vZGVzW2NoaWxkTm9kZUlkeF07XG4gICAgaWYgKGNoaWxkTmFtZSAmJiAhdGV4dCAmJiBjaGlsZE5hbWUgPT09IGNoaWxkTm9kZS5sb2NhbE5hbWUpIHtcbiAgICAgIHJldHVybiBjaGlsZE5vZGU7XG4gICAgfVxuICAgIGlmICh0ZXh0KSB7XG4gICAgICBjb25zdCBjaGlsZFRleHQgPSBleHRyYWN0Tm9kZVRleHQoY2hpbGROb2RlKTtcbiAgICAgIGlmICghY2hpbGRUZXh0KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNoaWxkTmFtZSAmJiBjaGlsZE5hbWUgPT09IGNoaWxkTm9kZS5sb2NhbE5hbWUgJiYgdGV4dCA9PT0gY2hpbGRUZXh0KSB7XG4gICAgICAgIHJldHVybiBjaGlsZE5vZGU7XG4gICAgICB9XG4gICAgICBpZiAoIWNoaWxkTmFtZSAmJiB0ZXh0ID09PSBjaGlsZFRleHQpIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkTm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3ROb2RlVGV4dCAobm9kZSkge1xuICByZXR1cm4gKCFub2RlIHx8ICFub2RlLmZpcnN0Q2hpbGQgfHwgIXV0aWwuaGFzVmFsdWUobm9kZS5maXJzdENoaWxkLm5vZGVWYWx1ZSkpXG4gICAgPyBudWxsXG4gICAgOiBub2RlLmZpcnN0Q2hpbGQubm9kZVZhbHVlO1xufVxuXG5cbmNsYXNzIENocm9tZWRyaXZlclN0b3JhZ2VDbGllbnQge1xuICBjb25zdHJ1Y3RvciAoYXJncyA9IHt9KSB7XG4gICAgY29uc3Qge1xuICAgICAgY2hyb21lZHJpdmVyRGlyID0gZ2V0Q2hyb21lZHJpdmVyRGlyKCksXG4gICAgICB0aW1lb3V0ID0gVElNRU9VVF9NUyxcbiAgICB9ID0gYXJncztcbiAgICB0aGlzLmNocm9tZWRyaXZlckRpciA9IGNocm9tZWRyaXZlckRpcjtcbiAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0O1xuICAgIHRoaXMubWFwcGluZyA9IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEFkZGl0aW9uYWxEcml2ZXJEZXRhaWxzXG4gICAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdmVyc2lvbiAtIENocm9tZWRyaXZlciB2ZXJzaW9uXG4gICAqIG9yIGBudWxsYCBpZiBpdCBjYW5ub3QgYmUgZm91bmRcbiAgICogQHByb3BlcnR5IHs/c3RyaW5nfSBtaW5Ccm93c2VyVmVyc2lvbiAtIFRoZSBtaW5pbXVtIGJyb3dzZXIgdmVyc2lvblxuICAgKiBzdXBwb3J0ZWQgYnkgY2hyb21lZHJpdmVyIG9yIGBudWxsYCBpZiBpdCBjYW5ub3QgYmUgZm91bmRcbiAgICovXG5cbiAgLyoqXG4gICAqIEdldHMgYWRkaXRpb25hbCBjaHJvbWVkcml2ZXIgZGV0YWlscyBmcm9tIGNocm9tZWRyaXZlclxuICAgKiByZWxlYXNlIG5vdGVzXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IC0gUmVsZWFzZSBub3RlcyBvZiB0aGUgY29ycmVzcG9uZGluZyBjaHJvbWVkcml2ZXJcbiAgICogQHJldHVybnMge0FkZGl0aW9uYWxEcml2ZXJEZXRhaWxzfVxuICAgKi9cbiAgcGFyc2VOb3RlcyAoY29udGVudCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGNvbnN0IHZlcnNpb25NYXRjaCA9IC9eXFxzKlstXStDaHJvbWVEcml2ZXJbXFxEXSsoW1xcZC5dKykvaW0uZXhlYyhjb250ZW50KTtcbiAgICBpZiAodmVyc2lvbk1hdGNoKSB7XG4gICAgICByZXN1bHQudmVyc2lvbiA9IHZlcnNpb25NYXRjaFsxXTtcbiAgICB9XG4gICAgY29uc3QgbWluQnJvd3NlclZlcnNpb25NYXRjaCA9IC9eXFxzKlN1cHBvcnRzIENocm9tZVtcXERdKyhcXGQrKS9pbS5leGVjKGNvbnRlbnQpO1xuICAgIGlmIChtaW5Ccm93c2VyVmVyc2lvbk1hdGNoKSB7XG4gICAgICByZXN1bHQubWluQnJvd3NlclZlcnNpb24gPSBtaW5Ccm93c2VyVmVyc2lvbk1hdGNoWzFdO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIERvd25sb2FkcyBjaHJvbWVkcml2ZXIgcmVsZWFzZSBub3RlcyBhbmQgcHV0cyB0aGVtXG4gICAqIGludG8gdGhlIGRpY3Rpb25hcnkgYXJndW1lbnRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRyaXZlcktleSAtIERyaXZlciB2ZXJzaW9uIHBsdXMgYXJjaGl2ZSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBub3Rlc1VybCAtIFRoZSBVUkwgb2YgY2hyb21lZHJpdmVyIG5vdGVzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBpbmZvRGljdCAtIFRoZSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgZHJpdmVyIGluZm8uXG4gICAqIFRoZSBtZXRob2QgY2FsbCBtdXRhdGVzIGJ5IG1lcmdpbmcgYEFkZGl0aW9uYWxEcml2ZXJEZXRhaWxzYFxuICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIHJlbGVhc2Ugbm90ZXMgY2Fubm90IGJlIGRvd25sb2FkZWRcbiAgICovXG4gIGFzeW5jIHJldHJpZXZlQWRkaXRpb25hbERyaXZlckluZm8gKGRyaXZlcktleSwgbm90ZXNVcmwsIGluZm9EaWN0KSB7XG4gICAgY29uc3Qgbm90ZXMgPSBhd2FpdCByZXRyaWV2ZURhdGEobm90ZXNVcmwsIHtcbiAgICAgICd1c2VyLWFnZW50JzogJ2FwcGl1bScsXG4gICAgICBhY2NlcHQ6ICcqLyonLFxuICAgIH0sIHsgdGltZW91dDogdGhpcy50aW1lb3V0IH0pO1xuICAgIGNvbnN0IHsgbWluQnJvd3NlclZlcnNpb24gfSA9IHRoaXMucGFyc2VOb3Rlcyhub3Rlcyk7XG4gICAgaWYgKCFtaW5Ccm93c2VyVmVyc2lvbikge1xuICAgICAgbG9nLmRlYnVnKGBUaGUgZHJpdmVyICcke2RyaXZlcktleX0nIGRvZXMgbm90IGNvbnRhaW4gdmFsaWQgcmVsZWFzZSBub3RlcyBhdCAke25vdGVzVXJsfS4gYCArXG4gICAgICAgIGBTa2lwcGluZyBpdGApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpbmZvRGljdC5taW5Ccm93c2VyVmVyc2lvbiA9IG1pbkJyb3dzZXJWZXJzaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBjaHJvbWVkcml2ZXIgc3RvcmFnZSBYTUwgYW5kIHN0b3Jlc1xuICAgKiB0aGUgcGFyc2VkIHJlc3VsdHMgaW50byBgdGhpcy5tYXBwaW5nYFxuICAgKlxuICAgKiBAcGFyYW0ge0RPTURvY3VtZW50fSBkb2MgLSBUaGUgRE9NIHJlcHJlc2VudGF0aW9uXG4gICAqIG9mIHRoZSBjaHJvbWVkcml2ZXIgc3RvcmFnZSBYTUxcbiAgICogQHBhcmFtIHtib29sZWFufSBzaG91bGRQYXJzZU5vdGVzIFt0cnVlXSAtIElmIHNldCB0byBgdHJ1ZWBcbiAgICogdGhlbiBhZGRpdGlvbmFsIGRyaXZlcnMgaW5mb3JtYXRpb24gaXMgZ29pbmcgdG8gYmUgcGFyc2VkXG4gICAqIGFuZCBhc3NpZ25lZCB0byBgdGhpcy5tYXBwaW5nYFxuICAgKi9cbiAgYXN5bmMgcGFyc2VTdG9yYWdlWG1sIChkb2MsIHNob3VsZFBhcnNlTm90ZXMgPSB0cnVlKSB7XG4gICAgY29uc3QgZHJpdmVyTm9kZXMgPSB4cGF0aC5zZWxlY3QoYC8vKltsb2NhbC1uYW1lKC4pPSdDb250ZW50cyddYCwgZG9jKTtcbiAgICBsb2cuZGVidWcoYFBhcnNlZCAke2RyaXZlck5vZGVzLmxlbmd0aH0gZW50cmllcyBmcm9tIHN0b3JhZ2UgWE1MYCk7XG4gICAgaWYgKF8uaXNFbXB0eShkcml2ZXJOb2RlcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICAgIGZvciAoY29uc3QgZHJpdmVyTm9kZSBvZiBkcml2ZXJOb2Rlcykge1xuICAgICAgY29uc3Qga2V5ID0gZXh0cmFjdE5vZGVUZXh0KGZpbmRDaGlsZE5vZGUoZHJpdmVyTm9kZSwgJ0tleScpKTtcbiAgICAgIGlmICghXy5pbmNsdWRlcyhrZXksICcvY2hyb21lZHJpdmVyXycpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBldGFnID0gZXh0cmFjdE5vZGVUZXh0KGZpbmRDaGlsZE5vZGUoZHJpdmVyTm9kZSwgJ0VUYWcnKSk7XG4gICAgICBpZiAoIWV0YWcpIHtcbiAgICAgICAgbG9nLmRlYnVnKGBUaGUgZW50cnkgJyR7a2V5fScgZG9lcyBub3QgY29udGFpbiB0aGUgY2hlY2tzdW0uIFNraXBwaW5nIGl0YCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjZEluZm8gPSB7XG4gICAgICAgIHVybDogYCR7Q0RfQ0ROfS8ke2tleX1gLFxuICAgICAgICBldGFnOiBfLnRyaW0oZXRhZywgJ1wiJyksXG4gICAgICAgIHZlcnNpb246IF8uZmlyc3Qoa2V5LnNwbGl0KCcvJykpLFxuICAgICAgfTtcbiAgICAgIHRoaXMubWFwcGluZ1trZXldID0gY2RJbmZvO1xuXG4gICAgICBjb25zdCBub3Rlc1BhdGggPSBgJHtjZEluZm8udmVyc2lvbn0vbm90ZXMudHh0YDtcbiAgICAgIGNvbnN0IGlzTm90ZXNQcmVzZW50ID0gISFkcml2ZXJOb2Rlc1xuICAgICAgICAucmVkdWNlKChhY2MsIG5vZGUpID0+IGFjYyB8fCBmaW5kQ2hpbGROb2RlKG5vZGUsICdLZXknLCBub3Rlc1BhdGgpLCBmYWxzZSk7XG4gICAgICBpZiAoIWlzTm90ZXNQcmVzZW50KSB7XG4gICAgICAgIGNkSW5mby5taW5Ccm93c2VyVmVyc2lvbiA9IG51bGw7XG4gICAgICAgIGlmIChzaG91bGRQYXJzZU5vdGVzKSB7XG4gICAgICAgICAgbG9nLmluZm8oYFRoZSBlbnRyeSAnJHtrZXl9JyBkb2VzIG5vdCBjb250YWluIGFueSBub3Rlcy4gU2tpcHBpbmcgaXRgKTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSBpZiAoIXNob3VsZFBhcnNlTm90ZXMpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHByb21pc2VzLnB1c2godGhpcy5yZXRyaWV2ZUFkZGl0aW9uYWxEcml2ZXJJbmZvKGtleSwgYCR7Q0RfQ0ROfS8ke25vdGVzUGF0aH1gLCBjZEluZm8pKTtcbiAgICAgIGlmIChwcm9taXNlcy5sZW5ndGggJSBNQVhfUEFSQUxMRUxfRE9XTkxPQURTID09PSAwKSB7XG4gICAgICAgIGF3YWl0IEIuYWxsKHByb21pc2VzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgQi5hbGwocHJvbWlzZXMpO1xuICAgIGxvZy5pbmZvKGBUaGUgdG90YWwgY291bnQgb2YgZW50cmllcyBpbiB0aGUgbWFwcGluZzogJHtfLnNpemUodGhpcy5tYXBwaW5nKX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBEcml2ZXJEZXRhaWxzXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cmwgLSBUaGUgZnVsbCB1cmwgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZHJpdmVyIGluXG4gICAqIHRoZSByZW1vdGUgc3RvcmFnZVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gZXRhZyAtIFRoZSBDUkMgb2YgdGhlIGRyaXZlciBhcmNoaXZlXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2ZXJzaW9uIC0gQ2hyb21lZHJpdmVyIHZlcnNpb25cbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IENocm9tZWRyaXZlcnNNYXBwaW5nXG4gICAqIEBwcm9wZXJ0eSB7RHJpdmVyRGV0YWlsc30gLSBUaGUga2V5cyBhcmUgdW5pcXVlIGRyaXZlciBpZGVudGlmaWVyc1xuICAgKiAodmVyc2lvbi9hcmNoaXZlIG5hbWUpLiBUaGUgY29ycmVzcG9uZGluZyB2YWx1ZXMgaGF2ZSBgRHJpdmVyRGV0YWlsc2BcbiAgICogY29udGFpbmluZyBjaHJvbWVkcml2ZXIgZGV0YWlsc1xuICAgKi9cblxuICAvKipcbiAgICogUmV0cmlldmVzIGNocm9tZWRyaXZlciBtYXBwaW5nIGZyb20gdGhlIHN0b3JhZ2VcbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBzaG91bGRQYXJzZU5vdGVzIFt0cnVlXSAtIGlmIHNldCB0byBgdHJ1ZWBcbiAgICogdGhlbiBhZGRpdGlvbmFsIGNocm9tZWRyaXZlcnMgaW5mbyBpcyBnb2luZyB0byBiZSByZXRyaWV2ZWQgYW5kXG4gICAqIHBhcnNlZCBmcm9tIHJlbGVhc2Ugbm90ZXNcbiAgICogQHJldHVybnMge0Nocm9tZWRyaXZlcnNNYXBwaW5nfVxuICAgKi9cbiAgYXN5bmMgcmV0cmlldmVNYXBwaW5nIChzaG91bGRQYXJzZU5vdGVzID0gdHJ1ZSkge1xuICAgIGNvbnN0IHhtbCA9IGF3YWl0IHJldHJpZXZlRGF0YShDRF9DRE4sIHtcbiAgICAgICd1c2VyLWFnZW50JzogJ2FwcGl1bScsXG4gICAgICBhY2NlcHQ6ICdhcHBsaWNhdGlvbi94bWwsICovKicsXG4gICAgfSwgeyB0aW1lb3V0OiB0aGlzLnRpbWVvdXQgfSk7XG4gICAgY29uc3QgZG9jID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyh4bWwpO1xuICAgIGF3YWl0IHRoaXMucGFyc2VTdG9yYWdlWG1sKGRvYywgc2hvdWxkUGFyc2VOb3Rlcyk7XG4gICAgcmV0dXJuIF8uY2xvbmVEZWVwKHRoaXMubWFwcGluZyk7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdHMgZG93bmxvYWRlZCBjaHJvbWVkcml2ZXIgYXJjaGl2ZVxuICAgKiBpbnRvIHRoZSBnaXZlbiBkZXN0aW5hdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3JjIC0gVGhlIHNvdXJjZSBhcmNoaXZlIHBhdGhcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRzdCAtIFRoZSBkZXN0aW5hdGlvbiBjaHJvbWVkcml2ZXIgcGF0aFxuICAgKi9cbiAgYXN5bmMgdW56aXBEcml2ZXIgKHNyYywgZHN0KSB7XG4gICAgY29uc3QgdG1wUm9vdCA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB6aXAuZXh0cmFjdEFsbFRvKHNyYywgdG1wUm9vdCk7XG4gICAgICBjb25zdCBjaHJvbWVkcml2ZXJQYXRoID0gYXdhaXQgZnMud2Fsa0Rpcih0bXBSb290LCB0cnVlLCAoaXRlbVBhdGgsIGlzRGlyZWN0b3J5KSA9PlxuICAgICAgICAhaXNEaXJlY3RvcnkgJiYgXy50b0xvd2VyKHBhdGgucGFyc2UoaXRlbVBhdGgpLm5hbWUpID09PSAnY2hyb21lZHJpdmVyJyk7XG4gICAgICBpZiAoIWNocm9tZWRyaXZlclBhdGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgYXJjaGl2ZSB3YXMgdW56aXBwZWQgcHJvcGVybHksIGJ1dCB3ZSBjb3VsZCBub3QgZmluZCBhbnkgY2hyb21lZHJpdmVyIGV4ZWN1dGFibGUnKTtcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhgTW92aW5nIHRoZSBleHRyYWN0ZWQgJyR7cGF0aC5iYXNlbmFtZShjaHJvbWVkcml2ZXJQYXRoKX0nIHRvICcke2RzdH0nYCk7XG4gICAgICBhd2FpdCBmcy5tdihjaHJvbWVkcml2ZXJQYXRoLCBkc3QsIHtcbiAgICAgICAgbWtkaXJwOiB0cnVlXG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZnMucmltcmFmKHRtcFJvb3QpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBPU0luZm9cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgaG9zdCBPU1xuICAgKiBDYW4gYmUgZWl0aGVyIGBtYWNgLCBgd2luZG93c2Agb3IgYGxpbnV4YFxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gYXJjaCAtIFRoZSBhcmNoaXRlY3R1cmUgb2YgdGhlIGhvc3QgT0QuXG4gICAqIENhbiBiZSBlaXRoZXIgYDMyYCBvciBgNjRgXG4gICAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gaGFyZHdhcmVOYW1lIC0gVGhlIG91dHB1dCBvZiBgdW5hbWUgLW1gIGNvbW1hbmRcbiAgICogb24gbGludXggYW5kIG1hYyBzeXN0ZW1zLiBgbnVsbGAgb24gV2luZG93c1xuICAgKi9cblxuICAvKipcbiAgICogRmlsdGVycyBgdGhpcy5tYXBwaW5nYCB0byBvbmx5IHNlbGVjdCBtYXRjaGluZ1xuICAgKiBjaHJvbWVkcml2ZXIgZW50cmllcyBieSBvcGVyYXRpbmcgc3lzdGVtIGluZm9ybWF0aW9uXG4gICAqIGFuZC9vciBhZGRpdGlvbmFsIHN5bmNocm9uaXphdGlvbiBvcHRpb25zIChpZiBwcm92aWRlZClcbiAgICpcbiAgICogQHBhcmFtIHs/T1NJbmZvfSBvc0luZm9cbiAgICogQHBhcmFtIHs/U3luY09wdGlvbnN9IG9wdHNcbiAgICogQHJldHVybnMge0FycmF5PFN0cmluZz59IFRoZSBsaXN0IG9mIGZpbHRlcmVkIGNocm9tZWRyaXZlclxuICAgKiBlbnRyeSBuYW1lcyAodmVyc2lvbi9hcmNoaXZlIG5hbWUpXG4gICAqL1xuICBzZWxlY3RNYXRjaGluZ0RyaXZlcnMgKG9zSW5mbywgb3B0cyA9IHt9KSB7XG4gICAgY29uc3Qge1xuICAgICAgbWluQnJvd3NlclZlcnNpb24sXG4gICAgICB2ZXJzaW9ucyA9IFtdLFxuICAgIH0gPSBvcHRzO1xuICAgIGxldCBkcml2ZXJzVG9TeW5jID0gXy5rZXlzKHRoaXMubWFwcGluZyk7XG5cbiAgICBpZiAoIV8uaXNFbXB0eSh2ZXJzaW9ucykpIHtcbiAgICAgIC8vIEhhbmRsZSBvbmx5IHNlbGVjdGVkIHZlcnNpb25zIGlmIHJlcXVlc3RlZFxuICAgICAgbG9nLmRlYnVnKGBTZWxlY3RpbmcgY2hyb21lZHJpdmVycyB3aG9zZSB2ZXJzaW9ucyBtYXRjaCB0byAke3ZlcnNpb25zfWApO1xuICAgICAgZHJpdmVyc1RvU3luYyA9IGRyaXZlcnNUb1N5bmNcbiAgICAgICAgLmZpbHRlcigoY2ROYW1lKSA9PiB2ZXJzaW9ucy5pbmNsdWRlcyhgJHt0aGlzLm1hcHBpbmdbY2ROYW1lXS52ZXJzaW9ufWApKTtcblxuICAgICAgbG9nLmRlYnVnKGBHb3QgJHt1dGlsLnBsdXJhbGl6ZSgnaXRlbScsIGRyaXZlcnNUb1N5bmMubGVuZ3RoLCB0cnVlKX1gKTtcbiAgICAgIGlmIChfLmlzRW1wdHkoZHJpdmVyc1RvU3luYykpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghaXNOYU4obWluQnJvd3NlclZlcnNpb24pKSB7XG4gICAgICAvLyBPbmx5IHNlbGVjdCBkcml2ZXJzIHRoYXQgc3VwcG9ydCB0aGUgY3VycmVudCBicm93c2VyIHdob3NlIG1ham9yIHZlcnNpb24gbnVtYmVyIGVxdWFscyB0byBgbWluQnJvd3NlclZlcnNpb25gXG4gICAgICBjb25zdCBtaW5Ccm93c2VyVmVyc2lvbkludCA9IHBhcnNlSW50KG1pbkJyb3dzZXJWZXJzaW9uLCAxMCk7XG4gICAgICBsb2cuZGVidWcoYFNlbGVjdGluZyBjaHJvbWVkcml2ZXJzIHdob3NlIG1pbmltdW0gc3VwcG9ydGVkIGJyb3dzZXIgdmVyc2lvbiBtYXRjaGVzIHRvICR7bWluQnJvd3NlclZlcnNpb25JbnR9YCk7XG4gICAgICBsZXQgY2xvc2VzdE1hdGNoZWRWZXJzaW9uTnVtYmVyID0gMDtcbiAgICAgIC8vIFNlbGVjdCB0aGUgbmV3ZXN0IGF2YWlsYWJsZSBhbmQgY29tcGF0aWJsZSBjaHJvbWVkcml2ZXJcbiAgICAgIGZvciAoY29uc3QgY2ROYW1lIG9mIGRyaXZlcnNUb1N5bmMpIHtcbiAgICAgICAgY29uc3QgY3VycmVudE1pbkJyb3dzZXJWZXJzaW9uID0gcGFyc2VJbnQodGhpcy5tYXBwaW5nW2NkTmFtZV0ubWluQnJvd3NlclZlcnNpb24sIDEwKTtcbiAgICAgICAgaWYgKCFpc05hTihjdXJyZW50TWluQnJvd3NlclZlcnNpb24pXG4gICAgICAgICAgICAmJiBjdXJyZW50TWluQnJvd3NlclZlcnNpb24gPD0gbWluQnJvd3NlclZlcnNpb25JbnRcbiAgICAgICAgICAgICYmIGNsb3Nlc3RNYXRjaGVkVmVyc2lvbk51bWJlciA8IGN1cnJlbnRNaW5Ccm93c2VyVmVyc2lvbikge1xuICAgICAgICAgIGNsb3Nlc3RNYXRjaGVkVmVyc2lvbk51bWJlciA9IGN1cnJlbnRNaW5Ccm93c2VyVmVyc2lvbjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZHJpdmVyc1RvU3luYyA9IGRyaXZlcnNUb1N5bmMuZmlsdGVyKChjZE5hbWUpID0+IGAke3RoaXMubWFwcGluZ1tjZE5hbWVdLm1pbkJyb3dzZXJWZXJzaW9ufWAgPT09XG4gICAgICAgIGAke2Nsb3Nlc3RNYXRjaGVkVmVyc2lvbk51bWJlciA+IDAgPyBjbG9zZXN0TWF0Y2hlZFZlcnNpb25OdW1iZXIgOiBtaW5Ccm93c2VyVmVyc2lvbkludH1gKTtcblxuICAgICAgbG9nLmRlYnVnKGBHb3QgJHt1dGlsLnBsdXJhbGl6ZSgnaXRlbScsIGRyaXZlcnNUb1N5bmMubGVuZ3RoLCB0cnVlKX1gKTtcbiAgICAgIGlmIChfLmlzRW1wdHkoZHJpdmVyc1RvU3luYykpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgbG9nLmRlYnVnKGBXaWxsIHNlbGVjdCBjYW5kaWRhdGUgJHt1dGlsLnBsdXJhbGl6ZSgnZHJpdmVyJywgZHJpdmVyc1RvU3luYy5sZW5ndGgpfSBgICtcbiAgICAgICAgYHZlcnNpb25lZCBhcyAnJHtfLnVuaXEoZHJpdmVyc1RvU3luYy5tYXAoKGNkTmFtZSkgPT4gdGhpcy5tYXBwaW5nW2NkTmFtZV0udmVyc2lvbikpfSdgKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNFbXB0eShvc0luZm8pKSB7XG4gICAgICAvLyBGaWx0ZXIgb3V0IGRyaXZlcnMgZm9yIHVuc3VwcG9ydGVkIHN5c3RlbSBhcmNoaXRlY3R1cmVzXG4gICAgICBsZXQge25hbWUsIGFyY2gsIGhhcmR3YXJlTmFtZX0gPSBvc0luZm87XG4gICAgICBpZiAoYXJjaCA9PT0gWDY0ICYmICFkcml2ZXJzVG9TeW5jLnNvbWUoKGNkTmFtZSkgPT4gY2ROYW1lLmluY2x1ZGVzKGBfJHtuYW1lfSR7WDY0fWApKSkge1xuICAgICAgICAvLyBGYWxsIGJhY2sgdG8geDg2IGJ1aWxkIGlmIHg2NCBvbmUgaXMgbm90IGF2YWlsYWJsZSBmb3IgdGhlIGdpdmVuIE9TXG4gICAgICAgIGFyY2ggPSBYODY7XG4gICAgICB9XG4gICAgICBpZiAobmFtZSA9PT0gT1MubWFjICYmIF8uaW5jbHVkZXMoaGFyZHdhcmVOYW1lLCAnYXJtJylcbiAgICAgICAgICAmJiBkcml2ZXJzVG9TeW5jLnNvbWUoKGNkTmFtZSkgPT4gY2ROYW1lLmluY2x1ZGVzKE0xX0FSQ0hfU1VGRklYKSkpIHtcbiAgICAgICAgLy8gcHJlZmVyIGV4ZWN1dGFibGUgZm9yIE0xIGFyY2ggaWYgcHJlc2VudFxuICAgICAgICBhcmNoICs9IE0xX0FSQ0hfU1VGRklYO1xuICAgICAgfVxuICAgICAgbG9nLmRlYnVnKGBTZWxlY3RpbmcgY2hyb21lZHJpdmVycyB3aG9zZSBwbGF0Zm9ybSBtYXRjaGVzIHRvICR7bmFtZX0ke2FyY2h9YCk7XG4gICAgICBjb25zdCBwbGF0Zm9ybVJlID0gbmV3IFJlZ0V4cChgKFxcXFxifF8pJHtuYW1lfSR7YXJjaH1cXFxcYmApO1xuICAgICAgZHJpdmVyc1RvU3luYyA9IGRyaXZlcnNUb1N5bmMuZmlsdGVyKChjZE5hbWUpID0+IHBsYXRmb3JtUmUudGVzdChjZE5hbWUpKTtcbiAgICAgIGxvZy5kZWJ1ZyhgR290ICR7dXRpbC5wbHVyYWxpemUoJ2l0ZW0nLCBkcml2ZXJzVG9TeW5jLmxlbmd0aCwgdHJ1ZSl9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRyaXZlcnNUb1N5bmM7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBnaXZlbiBjaHJvbWVkcml2ZXIgZnJvbSB0aGUgc3RvcmFnZVxuICAgKiBhbmQgdW5wYWNrcyBpdCBpbnRvIGB0aGlzLmNocm9tZWRyaXZlckRpcmAgZm9sZGVyXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSB1bmlxdWUgZHJpdmVyIGluZGV4XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkcml2ZXJLZXkgLSBUaGUgZHJpdmVyIGtleSBpbiBgdGhpcy5tYXBwaW5nYFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJjaGl2ZXNSb290IC0gVGhlIHRlbXBvcmFyeSBmb2xkZXIgcGF0aCB0byBleHRyYWN0XG4gICAqIGRvd25sb2FkZWQgYXJjaGl2ZXMgdG9cbiAgICogQHBhcmFtIHtib29sZWFufSBpc1N0cmljdCBbdHJ1ZV0gLSBXaGV0aGVyIHRvIHRocm93IGFuIGVycm9yIChgdHJ1ZWApXG4gICAqIG9yIHJldHVybiBhIGJvb2xlYW4gcmVzdWx0IGlmIHRoZSBkcml2ZXIgcmV0cmlldmFsIHByb2Nlc3MgZmFpbHNcbiAgICogQHRocm93cyB7RXJyb3J9IGlmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgcmV0cmlldmluZyB0aGUgZHJpdmVyXG4gICAqIGFuZCBgaXNTdHJpY3RgIGlzIHNldCB0byBgdHJ1ZWBcbiAgICogQHJldHVybnMge2Jvb2xlYW59IGlmIGB0cnVlYCB0aGVuIHRoZSBjaHJvbWVkcml2ZXIgaXMgc3VjY2Vzc2Z1bGx5XG4gICAqIGRvd25sb2FkZWQgYW5kIGV4dHJhY3RlZC5cbiAgICovXG4gIGFzeW5jIHJldHJpZXZlRHJpdmVyIChpbmRleCwgZHJpdmVyS2V5LCBhcmNoaXZlc1Jvb3QsIGlzU3RyaWN0ID0gZmFsc2UpIHtcbiAgICBjb25zdCB7IHVybCwgZXRhZywgdmVyc2lvbiB9ID0gdGhpcy5tYXBwaW5nW2RyaXZlcktleV07XG4gICAgY29uc3QgYXJjaGl2ZVBhdGggPSBwYXRoLnJlc29sdmUoYXJjaGl2ZXNSb290LCBgJHtpbmRleH0uemlwYCk7XG4gICAgbG9nLmRlYnVnKGBSZXRyaWV2aW5nICcke3VybH0nIHRvICcke2FyY2hpdmVQYXRofSdgKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgbmV0LmRvd25sb2FkRmlsZSh1cmwsIGFyY2hpdmVQYXRoLCB7XG4gICAgICAgIGlzTWV0ZXJlZDogZmFsc2UsXG4gICAgICAgIHRpbWVvdXQ6IFRJTUVPVVRfTVNcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnN0IG1zZyA9IGBDYW5ub3QgZG93bmxvYWQgY2hyb21lZHJpdmVyIGFyY2hpdmUuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gO1xuICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfVxuICAgICAgbG9nLmVycm9yKG1zZyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghYXdhaXQgaXNDcmNPayhhcmNoaXZlUGF0aCwgZXRhZykpIHtcbiAgICAgIGNvbnN0IG1zZyA9IGBUaGUgY2hlY2tzdW0gZm9yIHRoZSBkb3dubG9hZGVkIGNocm9tZWRyaXZlciAnJHtkcml2ZXJLZXl9JyBkaWQgbm90IG1hdGNoYDtcbiAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH1cbiAgICAgIGxvZy5lcnJvcihtc2cpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBmaWxlTmFtZSA9IGAke3BhdGgucGFyc2UodXJsKS5uYW1lfV92JHt2ZXJzaW9ufWAgK1xuICAgICAgKHN5c3RlbS5pc1dpbmRvd3MoKSA/ICcuZXhlJyA6ICcnKTtcbiAgICBjb25zdCB0YXJnZXRQYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMuY2hyb21lZHJpdmVyRGlyLCBmaWxlTmFtZSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMudW56aXBEcml2ZXIoYXJjaGl2ZVBhdGgsIHRhcmdldFBhdGgpO1xuICAgICAgYXdhaXQgZnMuY2htb2QodGFyZ2V0UGF0aCwgMG83NTUpO1xuICAgICAgbG9nLmRlYnVnKGBQZXJtaXNzaW9ucyBvZiB0aGUgZmlsZSAnJHt0YXJnZXRQYXRofScgaGF2ZSBiZWVuIGNoYW5nZWQgdG8gNzU1YCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICBsb2cuZXJyb3IoZS5tZXNzYWdlKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gU3luY09wdGlvbnNcbiAgICogQHByb3BlcnR5IHtBcnJheTxTdHJpbmc+fSB2ZXJzaW9ucyAtIFRoZSBsaXN0IG9mIGNocm9tZWRyaXZlclxuICAgKiB2ZXJzaW9ucyB0byBzeW5jLiBJZiBlbXB0eSAodGhlIGRlZmF1bHQgdmFsdWUpIHRoZW4gYWxsIGF2YWlsYWJsZVxuICAgKiBjaHJvbWVkcml2ZXJzIGFyZSBnb2luZyB0byBiZSBkb3dubG9hZGVkIGFuZCBleHRyYWN0ZWRcbiAgICogQHByb3BlcnR5IHtzdHJpbmd8bnVtYmVyfSBtaW5Ccm93c2VyVmVyc2lvbiAtIFRoZSBtaW51bXVtIHN1cHBvcnRlZFxuICAgKiBDaHJvbWUgdmVyc2lvbiB0aGF0IGRvd25sb2FkZWQgY2hyb21lZHJpdmVycyBzaG91bGQgc3VwcG9ydC4gQ2FuIG1hdGNoXG4gICAqIG11bHRpcGxlIGRyaXZlcnMuXG4gICAqIEBwcm9wZXJ0eSB7P09TSW5mb30gb3NJbmZvIC0gU3lzdGVtIGluZm9ybWF0aW9uIHVzZWQgdG8gZmlsdGVyIG91dFxuICAgKiB0aGUgbGlzdCBvZiB0aGUgcmV0cmlldmVkIGRyaXZlcnMuIElmIG5vdCBwcm92aWRlZCB0aGVuIHRoZSBzY3JpcHRcbiAgICogd2lsbCB0cnkgdG8gcmV0cmlldmUgaXQuXG4gICAqL1xuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgY2hyb21lZHJpdmVycyBmcm9tIHRoZSByZW1vdGUgc3RvcmFnZVxuICAgKiB0byB0aGUgbG9jYWwgZmlsZSBzeXN0ZW1cbiAgICpcbiAgICogQHBhcmFtIHs/U3luY09wdGlvbnN9IG9wdHNcbiAgICogQHRocm93cyB7RXJyb3J9IGlmIHRoZXJlIHdhcyBhIHByb2JsZW0gd2hpbGUgcmV0cmlldmluZ1xuICAgKiB0aGUgZHJpdmVyc1xuICAgKiBAcmV0dXJucyB7QXJyYXk8U3RyaW5nfSBUaGUgbGlzdCBvZiBzdWNjZXNzZnVsbHkgc3luY2hyb25pemVkIGRyaXZlciBrZXlzXG4gICAqL1xuICBhc3luYyBzeW5jRHJpdmVycyAob3B0cyA9IHt9KSB7XG4gICAgaWYgKF8uaXNFbXB0eSh0aGlzLm1hcHBpbmcpKSB7XG4gICAgICBhd2FpdCB0aGlzLnJldHJpZXZlTWFwcGluZyghIW9wdHMubWluQnJvd3NlclZlcnNpb24pO1xuICAgIH1cbiAgICBpZiAoXy5pc0VtcHR5KHRoaXMubWFwcGluZykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJldHJpZXZlIGNocm9tZWRyaXZlcnMgbWFwcGluZyBmcm9tIEdvb2dsZSBzdG9yYWdlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZHJpdmVyc1RvU3luYyA9IHRoaXMuc2VsZWN0TWF0Y2hpbmdEcml2ZXJzKG9wdHMub3NJbmZvID8/IGF3YWl0IGdldE9zSW5mbygpLCBvcHRzKTtcbiAgICBpZiAoXy5pc0VtcHR5KGRyaXZlcnNUb1N5bmMpKSB7XG4gICAgICBsb2cuZGVidWcoYFRoZXJlIGFyZSBubyBkcml2ZXJzIHRvIHN5bmMuIEV4aXRpbmdgKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgbG9nLmRlYnVnKGBHb3QgJHt1dGlsLnBsdXJhbGl6ZSgnZHJpdmVyJywgZHJpdmVyc1RvU3luYy5sZW5ndGgsIHRydWUpfSB0byBzeW5jOiBgICtcbiAgICAgIEpTT04uc3RyaW5naWZ5KGRyaXZlcnNUb1N5bmMsIG51bGwsIDIpKTtcblxuICAgIGNvbnN0IHN5bmNocm9uaXplZERyaXZlcnMgPSBbXTtcbiAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICAgIGNvbnN0IGFyY2hpdmVzUm9vdCA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IFtpZHgsIGRyaXZlcktleV0gb2YgZHJpdmVyc1RvU3luYy5lbnRyaWVzKCkpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaCgoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGlmIChhd2FpdCB0aGlzLnJldHJpZXZlRHJpdmVyKGlkeCwgZHJpdmVyS2V5LCBhcmNoaXZlc1Jvb3QsICFfLmlzRW1wdHkob3B0cykpKSB7XG4gICAgICAgICAgICBzeW5jaHJvbml6ZWREcml2ZXJzLnB1c2goZHJpdmVyS2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKCkpO1xuXG4gICAgICAgIGlmIChwcm9taXNlcy5sZW5ndGggJSBNQVhfUEFSQUxMRUxfRE9XTkxPQURTID09PSAwKSB7XG4gICAgICAgICAgYXdhaXQgQi5hbGwocHJvbWlzZXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhd2FpdCBCLmFsbChwcm9taXNlcyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGZzLnJpbXJhZihhcmNoaXZlc1Jvb3QpO1xuICAgIH1cbiAgICBpZiAoIV8uaXNFbXB0eShzeW5jaHJvbml6ZWREcml2ZXJzKSkge1xuICAgICAgbG9nLmluZm8oYFN1Y2Nlc3NmdWxseSBzeW5jaHJvbml6ZWQgYCArXG4gICAgICAgIGAke3V0aWwucGx1cmFsaXplKCdjaHJvbWVkcml2ZXInLCBzeW5jaHJvbml6ZWREcml2ZXJzLmxlbmd0aCwgdHJ1ZSl9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy5pbmZvKGBObyBjaHJvbWVkcml2ZXJzIHdlcmUgc3luY2hyb25pemVkYCk7XG4gICAgfVxuICAgIHJldHVybiBzeW5jaHJvbml6ZWREcml2ZXJzO1xuICB9XG59XG5cblxuZXhwb3J0IGRlZmF1bHQgQ2hyb21lZHJpdmVyU3RvcmFnZUNsaWVu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
303
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJUSU1FT1VUX01TIiwiTUFYX1BBUkFMTEVMX0RPV05MT0FEUyIsImxvZyIsImxvZ2dlciIsImdldExvZ2dlciIsImlzQ3JjT2siLCJzcmMiLCJjaGVja3N1bSIsIm1kNSIsImZzIiwiaGFzaCIsIl8iLCJ0b0xvd2VyIiwiZmluZENoaWxkTm9kZSIsInBhcmVudCIsImNoaWxkTmFtZSIsInRleHQiLCJoYXNDaGlsZE5vZGVzIiwiY2hpbGROb2RlSWR4IiwiY2hpbGROb2RlcyIsImxlbmd0aCIsImNoaWxkTm9kZSIsImxvY2FsTmFtZSIsImNoaWxkVGV4dCIsImV4dHJhY3ROb2RlVGV4dCIsIm5vZGUiLCJmaXJzdENoaWxkIiwidXRpbCIsImhhc1ZhbHVlIiwibm9kZVZhbHVlIiwiQ2hyb21lZHJpdmVyU3RvcmFnZUNsaWVudCIsImNvbnN0cnVjdG9yIiwiYXJncyIsImNocm9tZWRyaXZlckRpciIsImdldENocm9tZWRyaXZlckRpciIsInRpbWVvdXQiLCJtYXBwaW5nIiwicGFyc2VOb3RlcyIsImNvbnRlbnQiLCJyZXN1bHQiLCJ2ZXJzaW9uTWF0Y2giLCJleGVjIiwidmVyc2lvbiIsIm1pbkJyb3dzZXJWZXJzaW9uTWF0Y2giLCJtaW5Ccm93c2VyVmVyc2lvbiIsInJldHJpZXZlQWRkaXRpb25hbERyaXZlckluZm8iLCJkcml2ZXJLZXkiLCJub3Rlc1VybCIsImluZm9EaWN0Iiwibm90ZXMiLCJyZXRyaWV2ZURhdGEiLCJhY2NlcHQiLCJkZWJ1ZyIsInBhcnNlU3RvcmFnZVhtbCIsImRvYyIsInNob3VsZFBhcnNlTm90ZXMiLCJkcml2ZXJOb2RlcyIsInhwYXRoIiwic2VsZWN0IiwiaXNFbXB0eSIsInByb21pc2VzIiwiZHJpdmVyTm9kZSIsImtleSIsImluY2x1ZGVzIiwiZXRhZyIsImNkSW5mbyIsInVybCIsIkNEX0NETiIsInRyaW0iLCJmaXJzdCIsInNwbGl0Iiwibm90ZXNQYXRoIiwiaXNOb3Rlc1ByZXNlbnQiLCJyZWR1Y2UiLCJhY2MiLCJpbmZvIiwicHVzaCIsIkIiLCJhbGwiLCJzaXplIiwicmV0cmlldmVNYXBwaW5nIiwieG1sIiwiRE9NUGFyc2VyIiwicGFyc2VGcm9tU3RyaW5nIiwiY2xvbmVEZWVwIiwidW56aXBEcml2ZXIiLCJkc3QiLCJ0bXBSb290IiwidGVtcERpciIsIm9wZW5EaXIiLCJ6aXAiLCJleHRyYWN0QWxsVG8iLCJjaHJvbWVkcml2ZXJQYXRoIiwid2Fsa0RpciIsIml0ZW1QYXRoIiwiaXNEaXJlY3RvcnkiLCJwYXRoIiwicGFyc2UiLCJuYW1lIiwiRXJyb3IiLCJiYXNlbmFtZSIsIm12IiwibWtkaXJwIiwicmltcmFmIiwic2VsZWN0TWF0Y2hpbmdEcml2ZXJzIiwib3NJbmZvIiwib3B0cyIsInZlcnNpb25zIiwiZHJpdmVyc1RvU3luYyIsImtleXMiLCJmaWx0ZXIiLCJjZE5hbWUiLCJwbHVyYWxpemUiLCJpc05hTiIsIm1pbkJyb3dzZXJWZXJzaW9uSW50IiwicGFyc2VJbnQiLCJjbG9zZXN0TWF0Y2hlZFZlcnNpb25OdW1iZXIiLCJjdXJyZW50TWluQnJvd3NlclZlcnNpb24iLCJ1bmlxIiwibWFwIiwiYXJjaCIsImhhcmR3YXJlTmFtZSIsIlg2NCIsInNvbWUiLCJYODYiLCJPUyIsIm1hYyIsIk0xX0FSQ0hfU1VGRklYIiwicGxhdGZvcm1SZSIsIlJlZ0V4cCIsInRlc3QiLCJyZXRyaWV2ZURyaXZlciIsImluZGV4IiwiYXJjaGl2ZXNSb290IiwiaXNTdHJpY3QiLCJhcmNoaXZlUGF0aCIsInJlc29sdmUiLCJuZXQiLCJkb3dubG9hZEZpbGUiLCJpc01ldGVyZWQiLCJlIiwibXNnIiwibWVzc2FnZSIsImVycm9yIiwiZmlsZU5hbWUiLCJzeXN0ZW0iLCJpc1dpbmRvd3MiLCJ0YXJnZXRQYXRoIiwiY2htb2QiLCJzeW5jRHJpdmVycyIsImdldE9zSW5mbyIsIkpTT04iLCJzdHJpbmdpZnkiLCJzeW5jaHJvbml6ZWREcml2ZXJzIiwiaWR4IiwiZW50cmllcyJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9zdG9yYWdlLWNsaWVudC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBnZXRDaHJvbWVkcml2ZXJEaXIsIENEX0NETiwgcmV0cmlldmVEYXRhLCBnZXRPc0luZm8sXG4gIE9TLCBYNjQsIFg4NiwgTTFfQVJDSF9TVUZGSVgsXG59IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB4cGF0aCBmcm9tICd4cGF0aCc7XG5pbXBvcnQgeyBET01QYXJzZXIgfSBmcm9tICdAeG1sZG9tL3htbGRvbSc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IHN5c3RlbSwgZnMsIGxvZ2dlciwgdGVtcERpciwgemlwLCB1dGlsLCBuZXQgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuXG5cbmNvbnN0IFRJTUVPVVRfTVMgPSAxNTAwMDtcbmNvbnN0IE1BWF9QQVJBTExFTF9ET1dOTE9BRFMgPSA1O1xuXG5jb25zdCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdDaHJvbWVkcml2ZXJTdG9yYWdlQ2xpZW50Jyk7XG5cblxuYXN5bmMgZnVuY3Rpb24gaXNDcmNPayAoc3JjLCBjaGVja3N1bSkge1xuICBjb25zdCBtZDUgPSBhd2FpdCBmcy5oYXNoKHNyYywgJ21kNScpO1xuICByZXR1cm4gXy50b0xvd2VyKG1kNSkgPT09IF8udG9Mb3dlcihjaGVja3N1bSk7XG59XG5cbmZ1bmN0aW9uIGZpbmRDaGlsZE5vZGUgKHBhcmVudCwgY2hpbGROYW1lID0gbnVsbCwgdGV4dCA9IG51bGwpIHtcbiAgaWYgKCFjaGlsZE5hbWUgJiYgIXRleHQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAoIXBhcmVudC5oYXNDaGlsZE5vZGVzKCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGZvciAobGV0IGNoaWxkTm9kZUlkeCA9IDA7IGNoaWxkTm9kZUlkeCA8IHBhcmVudC5jaGlsZE5vZGVzLmxlbmd0aDsgY2hpbGROb2RlSWR4KyspIHtcbiAgICBjb25zdCBjaGlsZE5vZGUgPSBwYXJlbnQuY2hpbGROb2Rlc1tjaGlsZE5vZGVJZHhdO1xuICAgIGlmIChjaGlsZE5hbWUgJiYgIXRleHQgJiYgY2hpbGROYW1lID09PSBjaGlsZE5vZGUubG9jYWxOYW1lKSB7XG4gICAgICByZXR1cm4gY2hpbGROb2RlO1xuICAgIH1cbiAgICBpZiAodGV4dCkge1xuICAgICAgY29uc3QgY2hpbGRUZXh0ID0gZXh0cmFjdE5vZGVUZXh0KGNoaWxkTm9kZSk7XG4gICAgICBpZiAoIWNoaWxkVGV4dCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGlsZE5hbWUgJiYgY2hpbGROYW1lID09PSBjaGlsZE5vZGUubG9jYWxOYW1lICYmIHRleHQgPT09IGNoaWxkVGV4dCkge1xuICAgICAgICByZXR1cm4gY2hpbGROb2RlO1xuICAgICAgfVxuICAgICAgaWYgKCFjaGlsZE5hbWUgJiYgdGV4dCA9PT0gY2hpbGRUZXh0KSB7XG4gICAgICAgIHJldHVybiBjaGlsZE5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0Tm9kZVRleHQgKG5vZGUpIHtcbiAgcmV0dXJuICghbm9kZSB8fCAhbm9kZS5maXJzdENoaWxkIHx8ICF1dGlsLmhhc1ZhbHVlKG5vZGUuZmlyc3RDaGlsZC5ub2RlVmFsdWUpKVxuICAgID8gbnVsbFxuICAgIDogbm9kZS5maXJzdENoaWxkLm5vZGVWYWx1ZTtcbn1cblxuXG5jbGFzcyBDaHJvbWVkcml2ZXJTdG9yYWdlQ2xpZW50IHtcbiAgY29uc3RydWN0b3IgKGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGNocm9tZWRyaXZlckRpciA9IGdldENocm9tZWRyaXZlckRpcigpLFxuICAgICAgdGltZW91dCA9IFRJTUVPVVRfTVMsXG4gICAgfSA9IGFyZ3M7XG4gICAgdGhpcy5jaHJvbWVkcml2ZXJEaXIgPSBjaHJvbWVkcml2ZXJEaXI7XG4gICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDtcbiAgICB0aGlzLm1hcHBpbmcgPSB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBBZGRpdGlvbmFsRHJpdmVyRGV0YWlsc1xuICAgKiBAcHJvcGVydHkgez9zdHJpbmd9IHZlcnNpb24gLSBDaHJvbWVkcml2ZXIgdmVyc2lvblxuICAgKiBvciBgbnVsbGAgaWYgaXQgY2Fubm90IGJlIGZvdW5kXG4gICAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gbWluQnJvd3NlclZlcnNpb24gLSBUaGUgbWluaW11bSBicm93c2VyIHZlcnNpb25cbiAgICogc3VwcG9ydGVkIGJ5IGNocm9tZWRyaXZlciBvciBgbnVsbGAgaWYgaXQgY2Fubm90IGJlIGZvdW5kXG4gICAqL1xuXG4gIC8qKlxuICAgKiBHZXRzIGFkZGl0aW9uYWwgY2hyb21lZHJpdmVyIGRldGFpbHMgZnJvbSBjaHJvbWVkcml2ZXJcbiAgICogcmVsZWFzZSBub3Rlc1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCAtIFJlbGVhc2Ugbm90ZXMgb2YgdGhlIGNvcnJlc3BvbmRpbmcgY2hyb21lZHJpdmVyXG4gICAqIEByZXR1cm5zIHtBZGRpdGlvbmFsRHJpdmVyRGV0YWlsc31cbiAgICovXG4gIHBhcnNlTm90ZXMgKGNvbnRlbnQpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBjb25zdCB2ZXJzaW9uTWF0Y2ggPSAvXlxccypbLV0rQ2hyb21lRHJpdmVyW1xcRF0rKFtcXGQuXSspL2ltLmV4ZWMoY29udGVudCk7XG4gICAgaWYgKHZlcnNpb25NYXRjaCkge1xuICAgICAgcmVzdWx0LnZlcnNpb24gPSB2ZXJzaW9uTWF0Y2hbMV07XG4gICAgfVxuICAgIGNvbnN0IG1pbkJyb3dzZXJWZXJzaW9uTWF0Y2ggPSAvXlxccypTdXBwb3J0cyBDaHJvbWVbXFxEXSsoXFxkKykvaW0uZXhlYyhjb250ZW50KTtcbiAgICBpZiAobWluQnJvd3NlclZlcnNpb25NYXRjaCkge1xuICAgICAgcmVzdWx0Lm1pbkJyb3dzZXJWZXJzaW9uID0gbWluQnJvd3NlclZlcnNpb25NYXRjaFsxXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEb3dubG9hZHMgY2hyb21lZHJpdmVyIHJlbGVhc2Ugbm90ZXMgYW5kIHB1dHMgdGhlbVxuICAgKiBpbnRvIHRoZSBkaWN0aW9uYXJ5IGFyZ3VtZW50XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkcml2ZXJLZXkgLSBEcml2ZXIgdmVyc2lvbiBwbHVzIGFyY2hpdmUgbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbm90ZXNVcmwgLSBUaGUgVVJMIG9mIGNocm9tZWRyaXZlciBub3Rlc1xuICAgKiBAcGFyYW0ge09iamVjdH0gaW5mb0RpY3QgLSBUaGUgZGljdGlvbmFyeSBjb250YWluaW5nIGRyaXZlciBpbmZvLlxuICAgKiBUaGUgbWV0aG9kIGNhbGwgbXV0YXRlcyBieSBtZXJnaW5nIGBBZGRpdGlvbmFsRHJpdmVyRGV0YWlsc2BcbiAgICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSByZWxlYXNlIG5vdGVzIGNhbm5vdCBiZSBkb3dubG9hZGVkXG4gICAqL1xuICBhc3luYyByZXRyaWV2ZUFkZGl0aW9uYWxEcml2ZXJJbmZvIChkcml2ZXJLZXksIG5vdGVzVXJsLCBpbmZvRGljdCkge1xuICAgIGNvbnN0IG5vdGVzID0gYXdhaXQgcmV0cmlldmVEYXRhKG5vdGVzVXJsLCB7XG4gICAgICAndXNlci1hZ2VudCc6ICdhcHBpdW0nLFxuICAgICAgYWNjZXB0OiAnKi8qJyxcbiAgICB9LCB7IHRpbWVvdXQ6IHRoaXMudGltZW91dCB9KTtcbiAgICBjb25zdCB7IG1pbkJyb3dzZXJWZXJzaW9uIH0gPSB0aGlzLnBhcnNlTm90ZXMobm90ZXMpO1xuICAgIGlmICghbWluQnJvd3NlclZlcnNpb24pIHtcbiAgICAgIGxvZy5kZWJ1ZyhgVGhlIGRyaXZlciAnJHtkcml2ZXJLZXl9JyBkb2VzIG5vdCBjb250YWluIHZhbGlkIHJlbGVhc2Ugbm90ZXMgYXQgJHtub3Rlc1VybH0uIGAgK1xuICAgICAgICBgU2tpcHBpbmcgaXRgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaW5mb0RpY3QubWluQnJvd3NlclZlcnNpb24gPSBtaW5Ccm93c2VyVmVyc2lvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgY2hyb21lZHJpdmVyIHN0b3JhZ2UgWE1MIGFuZCBzdG9yZXNcbiAgICogdGhlIHBhcnNlZCByZXN1bHRzIGludG8gYHRoaXMubWFwcGluZ2BcbiAgICpcbiAgICogQHBhcmFtIHtET01Eb2N1bWVudH0gZG9jIC0gVGhlIERPTSByZXByZXNlbnRhdGlvblxuICAgKiBvZiB0aGUgY2hyb21lZHJpdmVyIHN0b3JhZ2UgWE1MXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2hvdWxkUGFyc2VOb3RlcyBbdHJ1ZV0gLSBJZiBzZXQgdG8gYHRydWVgXG4gICAqIHRoZW4gYWRkaXRpb25hbCBkcml2ZXJzIGluZm9ybWF0aW9uIGlzIGdvaW5nIHRvIGJlIHBhcnNlZFxuICAgKiBhbmQgYXNzaWduZWQgdG8gYHRoaXMubWFwcGluZ2BcbiAgICovXG4gIGFzeW5jIHBhcnNlU3RvcmFnZVhtbCAoZG9jLCBzaG91bGRQYXJzZU5vdGVzID0gdHJ1ZSkge1xuICAgIGNvbnN0IGRyaXZlck5vZGVzID0geHBhdGguc2VsZWN0KGAvLypbbG9jYWwtbmFtZSguKT0nQ29udGVudHMnXWAsIGRvYyk7XG4gICAgbG9nLmRlYnVnKGBQYXJzZWQgJHtkcml2ZXJOb2Rlcy5sZW5ndGh9IGVudHJpZXMgZnJvbSBzdG9yYWdlIFhNTGApO1xuICAgIGlmIChfLmlzRW1wdHkoZHJpdmVyTm9kZXMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGRyaXZlck5vZGUgb2YgZHJpdmVyTm9kZXMpIHtcbiAgICAgIGNvbnN0IGtleSA9IGV4dHJhY3ROb2RlVGV4dChmaW5kQ2hpbGROb2RlKGRyaXZlck5vZGUsICdLZXknKSk7XG4gICAgICBpZiAoIV8uaW5jbHVkZXMoa2V5LCAnL2Nocm9tZWRyaXZlcl8nKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXRhZyA9IGV4dHJhY3ROb2RlVGV4dChmaW5kQ2hpbGROb2RlKGRyaXZlck5vZGUsICdFVGFnJykpO1xuICAgICAgaWYgKCFldGFnKSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhgVGhlIGVudHJ5ICcke2tleX0nIGRvZXMgbm90IGNvbnRhaW4gdGhlIGNoZWNrc3VtLiBTa2lwcGluZyBpdGApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2RJbmZvID0ge1xuICAgICAgICB1cmw6IGAke0NEX0NETn0vJHtrZXl9YCxcbiAgICAgICAgZXRhZzogXy50cmltKGV0YWcsICdcIicpLFxuICAgICAgICB2ZXJzaW9uOiBfLmZpcnN0KGtleS5zcGxpdCgnLycpKSxcbiAgICAgIH07XG4gICAgICB0aGlzLm1hcHBpbmdba2V5XSA9IGNkSW5mbztcblxuICAgICAgY29uc3Qgbm90ZXNQYXRoID0gYCR7Y2RJbmZvLnZlcnNpb259L25vdGVzLnR4dGA7XG4gICAgICBjb25zdCBpc05vdGVzUHJlc2VudCA9ICEhZHJpdmVyTm9kZXNcbiAgICAgICAgLnJlZHVjZSgoYWNjLCBub2RlKSA9PiBhY2MgfHwgZmluZENoaWxkTm9kZShub2RlLCAnS2V5Jywgbm90ZXNQYXRoKSwgZmFsc2UpO1xuICAgICAgaWYgKCFpc05vdGVzUHJlc2VudCkge1xuICAgICAgICBjZEluZm8ubWluQnJvd3NlclZlcnNpb24gPSBudWxsO1xuICAgICAgICBpZiAoc2hvdWxkUGFyc2VOb3Rlcykge1xuICAgICAgICAgIGxvZy5pbmZvKGBUaGUgZW50cnkgJyR7a2V5fScgZG9lcyBub3QgY29udGFpbiBhbnkgbm90ZXMuIFNraXBwaW5nIGl0YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9IGVsc2UgaWYgKCFzaG91bGRQYXJzZU5vdGVzKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBwcm9taXNlcy5wdXNoKHRoaXMucmV0cmlldmVBZGRpdGlvbmFsRHJpdmVySW5mbyhrZXksIGAke0NEX0NETn0vJHtub3Rlc1BhdGh9YCwgY2RJbmZvKSk7XG4gICAgICBpZiAocHJvbWlzZXMubGVuZ3RoICUgTUFYX1BBUkFMTEVMX0RPV05MT0FEUyA9PT0gMCkge1xuICAgICAgICBhd2FpdCBCLmFsbChwcm9taXNlcyk7XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IEIuYWxsKHByb21pc2VzKTtcbiAgICBsb2cuaW5mbyhgVGhlIHRvdGFsIGNvdW50IG9mIGVudHJpZXMgaW4gdGhlIG1hcHBpbmc6ICR7Xy5zaXplKHRoaXMubWFwcGluZyl9YCk7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gRHJpdmVyRGV0YWlsc1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdXJsIC0gVGhlIGZ1bGwgdXJsIHRvIHRoZSBjb3JyZXNwb25kaW5nIGRyaXZlciBpblxuICAgKiB0aGUgcmVtb3RlIHN0b3JhZ2VcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGV0YWcgLSBUaGUgQ1JDIG9mIHRoZSBkcml2ZXIgYXJjaGl2ZVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdmVyc2lvbiAtIENocm9tZWRyaXZlciB2ZXJzaW9uXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBDaHJvbWVkcml2ZXJzTWFwcGluZ1xuICAgKiBAcHJvcGVydHkge0RyaXZlckRldGFpbHN9IC0gVGhlIGtleXMgYXJlIHVuaXF1ZSBkcml2ZXIgaWRlbnRpZmllcnNcbiAgICogKHZlcnNpb24vYXJjaGl2ZSBuYW1lKS4gVGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGhhdmUgYERyaXZlckRldGFpbHNgXG4gICAqIGNvbnRhaW5pbmcgY2hyb21lZHJpdmVyIGRldGFpbHNcbiAgICovXG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBjaHJvbWVkcml2ZXIgbWFwcGluZyBmcm9tIHRoZSBzdG9yYWdlXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2hvdWxkUGFyc2VOb3RlcyBbdHJ1ZV0gLSBpZiBzZXQgdG8gYHRydWVgXG4gICAqIHRoZW4gYWRkaXRpb25hbCBjaHJvbWVkcml2ZXJzIGluZm8gaXMgZ29pbmcgdG8gYmUgcmV0cmlldmVkIGFuZFxuICAgKiBwYXJzZWQgZnJvbSByZWxlYXNlIG5vdGVzXG4gICAqIEByZXR1cm5zIHtDaHJvbWVkcml2ZXJzTWFwcGluZ31cbiAgICovXG4gIGFzeW5jIHJldHJpZXZlTWFwcGluZyAoc2hvdWxkUGFyc2VOb3RlcyA9IHRydWUpIHtcbiAgICBjb25zdCB4bWwgPSBhd2FpdCByZXRyaWV2ZURhdGEoQ0RfQ0ROLCB7XG4gICAgICAndXNlci1hZ2VudCc6ICdhcHBpdW0nLFxuICAgICAgYWNjZXB0OiAnYXBwbGljYXRpb24veG1sLCAqLyonLFxuICAgIH0sIHsgdGltZW91dDogdGhpcy50aW1lb3V0IH0pO1xuICAgIGNvbnN0IGRvYyA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoeG1sKTtcbiAgICBhd2FpdCB0aGlzLnBhcnNlU3RvcmFnZVhtbChkb2MsIHNob3VsZFBhcnNlTm90ZXMpO1xuICAgIHJldHVybiBfLmNsb25lRGVlcCh0aGlzLm1hcHBpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3RzIGRvd25sb2FkZWQgY2hyb21lZHJpdmVyIGFyY2hpdmVcbiAgICogaW50byB0aGUgZ2l2ZW4gZGVzdGluYXRpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNyYyAtIFRoZSBzb3VyY2UgYXJjaGl2ZSBwYXRoXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkc3QgLSBUaGUgZGVzdGluYXRpb24gY2hyb21lZHJpdmVyIHBhdGhcbiAgICovXG4gIGFzeW5jIHVuemlwRHJpdmVyIChzcmMsIGRzdCkge1xuICAgIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgemlwLmV4dHJhY3RBbGxUbyhzcmMsIHRtcFJvb3QpO1xuICAgICAgY29uc3QgY2hyb21lZHJpdmVyUGF0aCA9IGF3YWl0IGZzLndhbGtEaXIodG1wUm9vdCwgdHJ1ZSwgKGl0ZW1QYXRoLCBpc0RpcmVjdG9yeSkgPT5cbiAgICAgICAgIWlzRGlyZWN0b3J5ICYmIF8udG9Mb3dlcihwYXRoLnBhcnNlKGl0ZW1QYXRoKS5uYW1lKSA9PT0gJ2Nocm9tZWRyaXZlcicpO1xuICAgICAgaWYgKCFjaHJvbWVkcml2ZXJQYXRoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGFyY2hpdmUgd2FzIHVuemlwcGVkIHByb3Blcmx5LCBidXQgd2UgY291bGQgbm90IGZpbmQgYW55IGNocm9tZWRyaXZlciBleGVjdXRhYmxlJyk7XG4gICAgICB9XG4gICAgICBsb2cuZGVidWcoYE1vdmluZyB0aGUgZXh0cmFjdGVkICcke3BhdGguYmFzZW5hbWUoY2hyb21lZHJpdmVyUGF0aCl9JyB0byAnJHtkc3R9J2ApO1xuICAgICAgYXdhaXQgZnMubXYoY2hyb21lZHJpdmVyUGF0aCwgZHN0LCB7XG4gICAgICAgIG1rZGlycDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGZzLnJpbXJhZih0bXBSb290KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gT1NJbmZvXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGhvc3QgT1NcbiAgICogQ2FuIGJlIGVpdGhlciBgbWFjYCwgYHdpbmRvd3NgIG9yIGBsaW51eGBcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGFyY2ggLSBUaGUgYXJjaGl0ZWN0dXJlIG9mIHRoZSBob3N0IE9ELlxuICAgKiBDYW4gYmUgZWl0aGVyIGAzMmAgb3IgYDY0YFxuICAgKiBAcHJvcGVydHkgez9zdHJpbmd9IGhhcmR3YXJlTmFtZSAtIFRoZSBvdXRwdXQgb2YgYHVuYW1lIC1tYCBjb21tYW5kXG4gICAqIG9uIGxpbnV4IGFuZCBtYWMgc3lzdGVtcy4gYG51bGxgIG9uIFdpbmRvd3NcbiAgICovXG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYHRoaXMubWFwcGluZ2AgdG8gb25seSBzZWxlY3QgbWF0Y2hpbmdcbiAgICogY2hyb21lZHJpdmVyIGVudHJpZXMgYnkgb3BlcmF0aW5nIHN5c3RlbSBpbmZvcm1hdGlvblxuICAgKiBhbmQvb3IgYWRkaXRpb25hbCBzeW5jaHJvbml6YXRpb24gb3B0aW9ucyAoaWYgcHJvdmlkZWQpXG4gICAqXG4gICAqIEBwYXJhbSB7P09TSW5mb30gb3NJbmZvXG4gICAqIEBwYXJhbSB7P1N5bmNPcHRpb25zfSBvcHRzXG4gICAqIEByZXR1cm5zIHtBcnJheTxTdHJpbmc+fSBUaGUgbGlzdCBvZiBmaWx0ZXJlZCBjaHJvbWVkcml2ZXJcbiAgICogZW50cnkgbmFtZXMgKHZlcnNpb24vYXJjaGl2ZSBuYW1lKVxuICAgKi9cbiAgc2VsZWN0TWF0Y2hpbmdEcml2ZXJzIChvc0luZm8sIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IHtcbiAgICAgIG1pbkJyb3dzZXJWZXJzaW9uLFxuICAgICAgdmVyc2lvbnMgPSBbXSxcbiAgICB9ID0gb3B0cztcbiAgICBsZXQgZHJpdmVyc1RvU3luYyA9IF8ua2V5cyh0aGlzLm1hcHBpbmcpO1xuXG4gICAgaWYgKCFfLmlzRW1wdHkodmVyc2lvbnMpKSB7XG4gICAgICAvLyBIYW5kbGUgb25seSBzZWxlY3RlZCB2ZXJzaW9ucyBpZiByZXF1ZXN0ZWRcbiAgICAgIGxvZy5kZWJ1ZyhgU2VsZWN0aW5nIGNocm9tZWRyaXZlcnMgd2hvc2UgdmVyc2lvbnMgbWF0Y2ggdG8gJHt2ZXJzaW9uc31gKTtcbiAgICAgIGRyaXZlcnNUb1N5bmMgPSBkcml2ZXJzVG9TeW5jXG4gICAgICAgIC5maWx0ZXIoKGNkTmFtZSkgPT4gdmVyc2lvbnMuaW5jbHVkZXMoYCR7dGhpcy5tYXBwaW5nW2NkTmFtZV0udmVyc2lvbn1gKSk7XG5cbiAgICAgIGxvZy5kZWJ1ZyhgR290ICR7dXRpbC5wbHVyYWxpemUoJ2l0ZW0nLCBkcml2ZXJzVG9TeW5jLmxlbmd0aCwgdHJ1ZSl9YCk7XG4gICAgICBpZiAoXy5pc0VtcHR5KGRyaXZlcnNUb1N5bmMpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWlzTmFOKG1pbkJyb3dzZXJWZXJzaW9uKSkge1xuICAgICAgLy8gT25seSBzZWxlY3QgZHJpdmVycyB0aGF0IHN1cHBvcnQgdGhlIGN1cnJlbnQgYnJvd3NlciB3aG9zZSBtYWpvciB2ZXJzaW9uIG51bWJlciBlcXVhbHMgdG8gYG1pbkJyb3dzZXJWZXJzaW9uYFxuICAgICAgY29uc3QgbWluQnJvd3NlclZlcnNpb25JbnQgPSBwYXJzZUludChtaW5Ccm93c2VyVmVyc2lvbiwgMTApO1xuICAgICAgbG9nLmRlYnVnKGBTZWxlY3RpbmcgY2hyb21lZHJpdmVycyB3aG9zZSBtaW5pbXVtIHN1cHBvcnRlZCBicm93c2VyIHZlcnNpb24gbWF0Y2hlcyB0byAke21pbkJyb3dzZXJWZXJzaW9uSW50fWApO1xuICAgICAgbGV0IGNsb3Nlc3RNYXRjaGVkVmVyc2lvbk51bWJlciA9IDA7XG4gICAgICAvLyBTZWxlY3QgdGhlIG5ld2VzdCBhdmFpbGFibGUgYW5kIGNvbXBhdGlibGUgY2hyb21lZHJpdmVyXG4gICAgICBmb3IgKGNvbnN0IGNkTmFtZSBvZiBkcml2ZXJzVG9TeW5jKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRNaW5Ccm93c2VyVmVyc2lvbiA9IHBhcnNlSW50KHRoaXMubWFwcGluZ1tjZE5hbWVdLm1pbkJyb3dzZXJWZXJzaW9uLCAxMCk7XG4gICAgICAgIGlmICghaXNOYU4oY3VycmVudE1pbkJyb3dzZXJWZXJzaW9uKVxuICAgICAgICAgICAgJiYgY3VycmVudE1pbkJyb3dzZXJWZXJzaW9uIDw9IG1pbkJyb3dzZXJWZXJzaW9uSW50XG4gICAgICAgICAgICAmJiBjbG9zZXN0TWF0Y2hlZFZlcnNpb25OdW1iZXIgPCBjdXJyZW50TWluQnJvd3NlclZlcnNpb24pIHtcbiAgICAgICAgICBjbG9zZXN0TWF0Y2hlZFZlcnNpb25OdW1iZXIgPSBjdXJyZW50TWluQnJvd3NlclZlcnNpb247XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRyaXZlcnNUb1N5bmMgPSBkcml2ZXJzVG9TeW5jLmZpbHRlcigoY2ROYW1lKSA9PiBgJHt0aGlzLm1hcHBpbmdbY2ROYW1lXS5taW5Ccm93c2VyVmVyc2lvbn1gID09PVxuICAgICAgICBgJHtjbG9zZXN0TWF0Y2hlZFZlcnNpb25OdW1iZXIgPiAwID8gY2xvc2VzdE1hdGNoZWRWZXJzaW9uTnVtYmVyIDogbWluQnJvd3NlclZlcnNpb25JbnR9YCk7XG5cbiAgICAgIGxvZy5kZWJ1ZyhgR290ICR7dXRpbC5wbHVyYWxpemUoJ2l0ZW0nLCBkcml2ZXJzVG9TeW5jLmxlbmd0aCwgdHJ1ZSl9YCk7XG4gICAgICBpZiAoXy5pc0VtcHR5KGRyaXZlcnNUb1N5bmMpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhgV2lsbCBzZWxlY3QgY2FuZGlkYXRlICR7dXRpbC5wbHVyYWxpemUoJ2RyaXZlcicsIGRyaXZlcnNUb1N5bmMubGVuZ3RoKX0gYCArXG4gICAgICAgIGB2ZXJzaW9uZWQgYXMgJyR7Xy51bmlxKGRyaXZlcnNUb1N5bmMubWFwKChjZE5hbWUpID0+IHRoaXMubWFwcGluZ1tjZE5hbWVdLnZlcnNpb24pKX0nYCk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzRW1wdHkob3NJbmZvKSkge1xuICAgICAgLy8gRmlsdGVyIG91dCBkcml2ZXJzIGZvciB1bnN1cHBvcnRlZCBzeXN0ZW0gYXJjaGl0ZWN0dXJlc1xuICAgICAgbGV0IHtuYW1lLCBhcmNoLCBoYXJkd2FyZU5hbWV9ID0gb3NJbmZvO1xuICAgICAgaWYgKGFyY2ggPT09IFg2NCAmJiAhZHJpdmVyc1RvU3luYy5zb21lKChjZE5hbWUpID0+IGNkTmFtZS5pbmNsdWRlcyhgXyR7bmFtZX0ke1g2NH1gKSkpIHtcbiAgICAgICAgLy8gRmFsbCBiYWNrIHRvIHg4NiBidWlsZCBpZiB4NjQgb25lIGlzIG5vdCBhdmFpbGFibGUgZm9yIHRoZSBnaXZlbiBPU1xuICAgICAgICBhcmNoID0gWDg2O1xuICAgICAgfVxuICAgICAgaWYgKG5hbWUgPT09IE9TLm1hYyAmJiBfLmluY2x1ZGVzKGhhcmR3YXJlTmFtZSwgJ2FybScpXG4gICAgICAgICAgJiYgZHJpdmVyc1RvU3luYy5zb21lKChjZE5hbWUpID0+IGNkTmFtZS5pbmNsdWRlcyhNMV9BUkNIX1NVRkZJWCkpKSB7XG4gICAgICAgIC8vIHByZWZlciBleGVjdXRhYmxlIGZvciBNMSBhcmNoIGlmIHByZXNlbnRcbiAgICAgICAgYXJjaCArPSBNMV9BUkNIX1NVRkZJWDtcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhgU2VsZWN0aW5nIGNocm9tZWRyaXZlcnMgd2hvc2UgcGxhdGZvcm0gbWF0Y2hlcyB0byAke25hbWV9JHthcmNofWApO1xuICAgICAgY29uc3QgcGxhdGZvcm1SZSA9IG5ldyBSZWdFeHAoYChcXFxcYnxfKSR7bmFtZX0ke2FyY2h9XFxcXGJgKTtcbiAgICAgIGRyaXZlcnNUb1N5bmMgPSBkcml2ZXJzVG9TeW5jLmZpbHRlcigoY2ROYW1lKSA9PiBwbGF0Zm9ybVJlLnRlc3QoY2ROYW1lKSk7XG4gICAgICBsb2cuZGVidWcoYEdvdCAke3V0aWwucGx1cmFsaXplKCdpdGVtJywgZHJpdmVyc1RvU3luYy5sZW5ndGgsIHRydWUpfWApO1xuICAgIH1cblxuICAgIHJldHVybiBkcml2ZXJzVG9TeW5jO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgZ2l2ZW4gY2hyb21lZHJpdmVyIGZyb20gdGhlIHN0b3JhZ2VcbiAgICogYW5kIHVucGFja3MgaXQgaW50byBgdGhpcy5jaHJvbWVkcml2ZXJEaXJgIGZvbGRlclxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgdW5pcXVlIGRyaXZlciBpbmRleFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZHJpdmVyS2V5IC0gVGhlIGRyaXZlciBrZXkgaW4gYHRoaXMubWFwcGluZ2BcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyY2hpdmVzUm9vdCAtIFRoZSB0ZW1wb3JhcnkgZm9sZGVyIHBhdGggdG8gZXh0cmFjdFxuICAgKiBkb3dubG9hZGVkIGFyY2hpdmVzIHRvXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNTdHJpY3QgW3RydWVdIC0gV2hldGhlciB0byB0aHJvdyBhbiBlcnJvciAoYHRydWVgKVxuICAgKiBvciByZXR1cm4gYSBib29sZWFuIHJlc3VsdCBpZiB0aGUgZHJpdmVyIHJldHJpZXZhbCBwcm9jZXNzIGZhaWxzXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGVyZSB3YXMgYSBmYWlsdXJlIHdoaWxlIHJldHJpZXZpbmcgdGhlIGRyaXZlclxuICAgKiBhbmQgYGlzU3RyaWN0YCBpcyBzZXQgdG8gYHRydWVgXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBpZiBgdHJ1ZWAgdGhlbiB0aGUgY2hyb21lZHJpdmVyIGlzIHN1Y2Nlc3NmdWxseVxuICAgKiBkb3dubG9hZGVkIGFuZCBleHRyYWN0ZWQuXG4gICAqL1xuICBhc3luYyByZXRyaWV2ZURyaXZlciAoaW5kZXgsIGRyaXZlcktleSwgYXJjaGl2ZXNSb290LCBpc1N0cmljdCA9IGZhbHNlKSB7XG4gICAgY29uc3QgeyB1cmwsIGV0YWcsIHZlcnNpb24gfSA9IHRoaXMubWFwcGluZ1tkcml2ZXJLZXldO1xuICAgIGNvbnN0IGFyY2hpdmVQYXRoID0gcGF0aC5yZXNvbHZlKGFyY2hpdmVzUm9vdCwgYCR7aW5kZXh9LnppcGApO1xuICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmluZyAnJHt1cmx9JyB0byAnJHthcmNoaXZlUGF0aH0nYCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG5ldC5kb3dubG9hZEZpbGUodXJsLCBhcmNoaXZlUGF0aCwge1xuICAgICAgICBpc01ldGVyZWQ6IGZhbHNlLFxuICAgICAgICB0aW1lb3V0OiBUSU1FT1VUX01TXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zdCBtc2cgPSBgQ2Fubm90IGRvd25sb2FkIGNocm9tZWRyaXZlciBhcmNoaXZlLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YDtcbiAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH1cbiAgICAgIGxvZy5lcnJvcihtc2cpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIWF3YWl0IGlzQ3JjT2soYXJjaGl2ZVBhdGgsIGV0YWcpKSB7XG4gICAgICBjb25zdCBtc2cgPSBgVGhlIGNoZWNrc3VtIGZvciB0aGUgZG93bmxvYWRlZCBjaHJvbWVkcml2ZXIgJyR7ZHJpdmVyS2V5fScgZGlkIG5vdCBtYXRjaGA7XG4gICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICB9XG4gICAgICBsb2cuZXJyb3IobXNnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgZmlsZU5hbWUgPSBgJHtwYXRoLnBhcnNlKHVybCkubmFtZX1fdiR7dmVyc2lvbn1gICtcbiAgICAgIChzeXN0ZW0uaXNXaW5kb3dzKCkgPyAnLmV4ZScgOiAnJyk7XG4gICAgY29uc3QgdGFyZ2V0UGF0aCA9IHBhdGgucmVzb2x2ZSh0aGlzLmNocm9tZWRyaXZlckRpciwgZmlsZU5hbWUpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnVuemlwRHJpdmVyKGFyY2hpdmVQYXRoLCB0YXJnZXRQYXRoKTtcbiAgICAgIGF3YWl0IGZzLmNobW9kKHRhcmdldFBhdGgsIDBvNzU1KTtcbiAgICAgIGxvZy5kZWJ1ZyhgUGVybWlzc2lvbnMgb2YgdGhlIGZpbGUgJyR7dGFyZ2V0UGF0aH0nIGhhdmUgYmVlbiBjaGFuZ2VkIHRvIDc1NWApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgbG9nLmVycm9yKGUubWVzc2FnZSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IFN5bmNPcHRpb25zXG4gICAqIEBwcm9wZXJ0eSB7QXJyYXk8U3RyaW5nPn0gdmVyc2lvbnMgLSBUaGUgbGlzdCBvZiBjaHJvbWVkcml2ZXJcbiAgICogdmVyc2lvbnMgdG8gc3luYy4gSWYgZW1wdHkgKHRoZSBkZWZhdWx0IHZhbHVlKSB0aGVuIGFsbCBhdmFpbGFibGVcbiAgICogY2hyb21lZHJpdmVycyBhcmUgZ29pbmcgdG8gYmUgZG93bmxvYWRlZCBhbmQgZXh0cmFjdGVkXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bWJlcn0gbWluQnJvd3NlclZlcnNpb24gLSBUaGUgbWludW11bSBzdXBwb3J0ZWRcbiAgICogQ2hyb21lIHZlcnNpb24gdGhhdCBkb3dubG9hZGVkIGNocm9tZWRyaXZlcnMgc2hvdWxkIHN1cHBvcnQuIENhbiBtYXRjaFxuICAgKiBtdWx0aXBsZSBkcml2ZXJzLlxuICAgKiBAcHJvcGVydHkgez9PU0luZm99IG9zSW5mbyAtIFN5c3RlbSBpbmZvcm1hdGlvbiB1c2VkIHRvIGZpbHRlciBvdXRcbiAgICogdGhlIGxpc3Qgb2YgdGhlIHJldHJpZXZlZCBkcml2ZXJzLiBJZiBub3QgcHJvdmlkZWQgdGhlbiB0aGUgc2NyaXB0XG4gICAqIHdpbGwgdHJ5IHRvIHJldHJpZXZlIGl0LlxuICAgKi9cblxuICAvKipcbiAgICogUmV0cmlldmVzIGNocm9tZWRyaXZlcnMgZnJvbSB0aGUgcmVtb3RlIHN0b3JhZ2VcbiAgICogdG8gdGhlIGxvY2FsIGZpbGUgc3lzdGVtXG4gICAqXG4gICAqIEBwYXJhbSB7P1N5bmNPcHRpb25zfSBvcHRzXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGVyZSB3YXMgYSBwcm9ibGVtIHdoaWxlIHJldHJpZXZpbmdcbiAgICogdGhlIGRyaXZlcnNcbiAgICogQHJldHVybnMge0FycmF5PFN0cmluZ30gVGhlIGxpc3Qgb2Ygc3VjY2Vzc2Z1bGx5IHN5bmNocm9uaXplZCBkcml2ZXIga2V5c1xuICAgKi9cbiAgYXN5bmMgc3luY0RyaXZlcnMgKG9wdHMgPSB7fSkge1xuICAgIGlmIChfLmlzRW1wdHkodGhpcy5tYXBwaW5nKSkge1xuICAgICAgYXdhaXQgdGhpcy5yZXRyaWV2ZU1hcHBpbmcoISFvcHRzLm1pbkJyb3dzZXJWZXJzaW9uKTtcbiAgICB9XG4gICAgaWYgKF8uaXNFbXB0eSh0aGlzLm1hcHBpbmcpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZXRyaWV2ZSBjaHJvbWVkcml2ZXJzIG1hcHBpbmcgZnJvbSBHb29nbGUgc3RvcmFnZScpO1xuICAgIH1cblxuICAgIGNvbnN0IGRyaXZlcnNUb1N5bmMgPSB0aGlzLnNlbGVjdE1hdGNoaW5nRHJpdmVycyhvcHRzLm9zSW5mbyA/PyBhd2FpdCBnZXRPc0luZm8oKSwgb3B0cyk7XG4gICAgaWYgKF8uaXNFbXB0eShkcml2ZXJzVG9TeW5jKSkge1xuICAgICAgbG9nLmRlYnVnKGBUaGVyZSBhcmUgbm8gZHJpdmVycyB0byBzeW5jLiBFeGl0aW5nYCk7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGxvZy5kZWJ1ZyhgR290ICR7dXRpbC5wbHVyYWxpemUoJ2RyaXZlcicsIGRyaXZlcnNUb1N5bmMubGVuZ3RoLCB0cnVlKX0gdG8gc3luYzogYCArXG4gICAgICBKU09OLnN0cmluZ2lmeShkcml2ZXJzVG9TeW5jLCBudWxsLCAyKSk7XG5cbiAgICBjb25zdCBzeW5jaHJvbml6ZWREcml2ZXJzID0gW107XG4gICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcbiAgICBjb25zdCBhcmNoaXZlc1Jvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBbaWR4LCBkcml2ZXJLZXldIG9mIGRyaXZlcnNUb1N5bmMuZW50cmllcygpKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBpZiAoYXdhaXQgdGhpcy5yZXRyaWV2ZURyaXZlcihpZHgsIGRyaXZlcktleSwgYXJjaGl2ZXNSb290LCAhXy5pc0VtcHR5KG9wdHMpKSkge1xuICAgICAgICAgICAgc3luY2hyb25pemVkRHJpdmVycy5wdXNoKGRyaXZlcktleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSgpKTtcblxuICAgICAgICBpZiAocHJvbWlzZXMubGVuZ3RoICUgTUFYX1BBUkFMTEVMX0RPV05MT0FEUyA9PT0gMCkge1xuICAgICAgICAgIGF3YWl0IEIuYWxsKHByb21pc2VzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYXdhaXQgQi5hbGwocHJvbWlzZXMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBmcy5yaW1yYWYoYXJjaGl2ZXNSb290KTtcbiAgICB9XG4gICAgaWYgKCFfLmlzRW1wdHkoc3luY2hyb25pemVkRHJpdmVycykpIHtcbiAgICAgIGxvZy5pbmZvKGBTdWNjZXNzZnVsbHkgc3luY2hyb25pemVkIGAgK1xuICAgICAgICBgJHt1dGlsLnBsdXJhbGl6ZSgnY2hyb21lZHJpdmVyJywgc3luY2hyb25pemVkRHJpdmVycy5sZW5ndGgsIHRydWUpfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cuaW5mbyhgTm8gY2hyb21lZHJpdmVycyB3ZXJlIHN5bmNocm9uaXplZGApO1xuICAgIH1cbiAgICByZXR1cm4gc3luY2hyb25pemVkRHJpdmVycztcbiAgfVxufVxuXG5cbmV4cG9ydCBkZWZhdWx0IENocm9tZWRyaXZlclN0b3JhZ2VDbGll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