appium-android-driver 5.8.4 → 5.8.5

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":"android-helpers.js","names":["MOCK_APP_IDS_STORE","PACKAGE_INSTALL_TIMEOUT","CHROME_BROWSER_PACKAGE_ACTIVITY","chrome","pkg","activity","chromium","chromebeta","browser","default","SETTINGS_HELPER_PKG_ID","SETTINGS_HELPER_UNLOCK_ACTIVITY","EMULATOR_PATTERN","APP_STATE","Object","freeze","NOT_INSTALLED","NOT_RUNNING","RUNNING_IN_BACKGROUND","RUNNING_IN_FOREGROUND","ensureNetworkSpeed","adb","networkSpeed","_","values","NETWORK_SPEED","includes","logger","warn","FULL","prepareAvdArgs","opts","isHeadless","avdArgs","result","isArray","push","util","shellParse","toCredentialType","unlockType","PIN_UNLOCK","PIN_UNLOCK_KEY_EVENT","PASSWORD_UNLOCK","PATTERN_UNLOCK","Error","helpers","createBaseADB","adbPort","suppressKillServer","remoteAdbHost","clearDeviceLogsOnStart","adbExecTimeout","useKeystore","keystorePath","keystorePassword","keyAlias","keyPassword","remoteAppsCacheLimit","buildToolsVersion","allowOfflineDevices","allowDelayAdb","ADB","createADB","prepareEmulator","avd","avdEnv","env","language","locale","country","avdLaunchTimeout","launchTimeout","avdReadyTimeout","readyTimeout","avdName","replace","isEmulatorRunning","getRunningAVDWithRetry","e","debug","message","args","killEmulator","launchAVD","ensureDeviceLocale","script","isString","setDeviceLanguageCountry","ensureCurrentLocale","getDeviceInfoFromCaps","udid","emPort","curDeviceId","emulatorPort","info","devices","getDevicesWithRetry","map","errorAndThrow","getPortFromEmulatorString","platformVersion","trim","semver","coerce","availDevices","partialMatchCandidate","device","setDeviceId","rawDeviceOS","getPlatformVersion","deviceOS","bothVersionsCanBeCoerced","valid","bothVersionsAreStrings","version","toLower","major","minor","gt","keys","join","setEmulatorPort","validatePackageActivityNames","key","name","match","exec","index","substring","getLaunchInfo","app","appPackage","appActivity","appWaitPackage","appWaitActivity","apkPackage","apkActivity","packageAndLaunchActivityFromManifest","resetApp","fastReset","fullReset","androidInstallTimeout","autoGrantPermissions","allowTestPackages","isInstalled","isAppInstalled","forceStop","ign","output","clear","toLowerCase","grantAllPermissions","error","uninstallApk","install","grantPermissions","timeout","installApk","enforceAppInstall","appState","wasUninstalled","installOrUpgrade","enforceCurrentBuild","isInstalledOverExistingApp","APP_INSTALL_STATE","installOtherApks","otherApps","B","all","otherApp","uninstallOtherPackages","appPackages","filterPackages","getThirdPartyPackages","packagesString","shell","appPackagesArray","split","EOL","difference","err","initUnicodeKeyboard","defaultIME","appiumIME","enableIME","setIME","setMockLocationApp","getApiLevel","pkgIds","fileExists","JSON","parse","tmpRoot","tempDir","openDir","srcPath","path","posix","basename","fs","writeFile","stringify","pushFile","rimraf","resetMockLocation","thirdPartyPkgIdsPromise","thirdPartyPkgIds","resultPkgs","intersection","size","pkgId","installHelperApp","apkPath","packageId","retry","retryInstallHelperApp","pushSettingsApp","throwError","settingsApkPath","processExists","apiLevel","perms","x","requireRunningSettingsApp","isEmulator","pushStrings","remoteDir","stringsJson","remoteFile","resolve","pullApk","tmpDir","isEmpty","exists","stringsTmpDir","apkStrings","localPath","extractStringsFromApk","unlockWithHelperApp","firstRun","launchHelper","isScreenLocked","delay","unlock","driver","capabilities","unlockKey","unlockStrategy","unlockSuccessTimeout","unlocker","validateUnlockCapabilities","FINGERPRINT_UNLOCK","isNil","isLockManagementSupported","fastUnlock","credential","credentialType","unlockMethod","pinUnlock","pinUnlockWithKeyEvent","passwordUnlock","patternUnlock","fingerprintUnlock","verifyUnlock","timeoutMs","waitForCondition","waitMs","intervalMs","initDevice","skipDeviceInitialization","localeScript","unicodeKeyboard","disableWindowAnimation","skipUnlock","mockLocationApp","skipLogcatCapture","logcatFormat","logcatFilterSpecs","waitForDevice","shouldThrowError","isUndefined","startLogcat","format","filterSpecs","removeNullProperties","obj","isNull","truncateDecimals","number","digits","multiplier","Math","pow","adjustedNum","truncatedNum","isChromeBrowser","getChromePkg","removeAllSessionWebSocketHandlers","server","sessionId","isFunction","getWebSocketHandlers","activeHandlers","pathname","removeWebSocketHandler","parseArray","cap","parsedCaps","validateDesiredCaps","caps","browserName","adjustBrowserSessionCaps","possibleNames","some","test","bootstrap","Bootstrap"],"sources":["../../lib/android-helpers.js"],"sourcesContent":["import _ from 'lodash';\nimport path from 'path';\nimport { retry, waitForCondition } from 'asyncbox';\nimport logger from './logger';\nimport { fs, util, tempDir } from '@appium/support';\nimport { path as settingsApkPath } from 'io.appium.settings';\nimport Bootstrap from './bootstrap';\nimport B from 'bluebird';\nimport ADB from 'appium-adb';\nimport {\n default as unlocker, PIN_UNLOCK, PIN_UNLOCK_KEY_EVENT,\n PASSWORD_UNLOCK, PATTERN_UNLOCK, FINGERPRINT_UNLOCK\n} from './unlock-helpers';\nimport { EOL } from 'os';\nimport semver from 'semver';\n\nconst MOCK_APP_IDS_STORE = '/data/local/tmp/mock_apps.json';\nconst PACKAGE_INSTALL_TIMEOUT = 90000; // milliseconds\n// https://cs.chromium.org/chromium/src/chrome/browser/devtools/device/android_device_info_query.cc\nconst CHROME_BROWSER_PACKAGE_ACTIVITY = {\n chrome: {\n pkg: 'com.android.chrome',\n activity: 'com.google.android.apps.chrome.Main',\n },\n chromium: {\n pkg: 'org.chromium.chrome.shell',\n activity: '.ChromeShellActivity',\n },\n chromebeta: {\n pkg: 'com.chrome.beta',\n activity: 'com.google.android.apps.chrome.Main',\n },\n browser: {\n pkg: 'com.android.browser',\n activity: 'com.android.browser.BrowserActivity',\n },\n 'chromium-browser': {\n pkg: 'org.chromium.chrome',\n activity: 'com.google.android.apps.chrome.Main',\n },\n 'chromium-webview': {\n pkg: 'org.chromium.webview_shell',\n activity: 'org.chromium.webview_shell.WebViewBrowserActivity',\n },\n default: {\n pkg: 'com.android.chrome',\n activity: 'com.google.android.apps.chrome.Main',\n },\n};\nconst SETTINGS_HELPER_PKG_ID = 'io.appium.settings';\nconst SETTINGS_HELPER_UNLOCK_ACTIVITY = '.Unlock';\nconst EMULATOR_PATTERN = /\\bemulator\\b/i;\n// These constants are in sync with\n// https://developer.apple.com/documentation/xctest/xcuiapplicationstate/xcuiapplicationstaterunningbackground?language=objc\nconst APP_STATE = Object.freeze({\n NOT_INSTALLED: 0,\n NOT_RUNNING: 1,\n RUNNING_IN_BACKGROUND: 3,\n RUNNING_IN_FOREGROUND: 4\n});\n\n\nfunction ensureNetworkSpeed (adb, networkSpeed) {\n if (_.values(adb.NETWORK_SPEED).includes(networkSpeed)) {\n return networkSpeed;\n }\n logger.warn(`Wrong network speed param '${networkSpeed}', using default: ${adb.NETWORK_SPEED.FULL}. ` +\n `Supported values: ${_.values(adb.NETWORK_SPEED)}`);\n return adb.NETWORK_SPEED.FULL;\n}\n\nfunction prepareAvdArgs (adb, opts) {\n const {\n networkSpeed,\n isHeadless,\n avdArgs,\n } = opts;\n const result = [];\n if (avdArgs) {\n if (_.isArray(avdArgs)) {\n result.push(...avdArgs);\n } else {\n result.push(...(util.shellParse(`${avdArgs}`)));\n }\n }\n if (networkSpeed) {\n result.push('-netspeed', ensureNetworkSpeed(adb, networkSpeed));\n }\n if (isHeadless) {\n result.push('-no-window');\n }\n return result;\n}\n\nfunction toCredentialType (unlockType) {\n const result = {\n [PIN_UNLOCK]: 'pin',\n [PIN_UNLOCK_KEY_EVENT]: 'pin',\n [PASSWORD_UNLOCK]: 'password',\n [PATTERN_UNLOCK]: 'pattern',\n }[unlockType];\n if (result) {\n return result;\n }\n throw new Error(`Unlock type '${unlockType}' is not known`);\n}\n\n\nconst helpers = {};\n\nhelpers.createBaseADB = async function createBaseADB (opts = {}) {\n // filter out any unwanted options sent in\n // this list should be updated as ADB takes more arguments\n const {\n adbPort,\n suppressKillServer,\n remoteAdbHost,\n clearDeviceLogsOnStart,\n adbExecTimeout,\n useKeystore,\n keystorePath,\n keystorePassword,\n keyAlias,\n keyPassword,\n remoteAppsCacheLimit,\n buildToolsVersion,\n allowOfflineDevices,\n allowDelayAdb,\n } = opts;\n return await ADB.createADB({\n adbPort,\n suppressKillServer,\n remoteAdbHost,\n clearDeviceLogsOnStart,\n adbExecTimeout,\n useKeystore,\n keystorePath,\n keystorePassword,\n keyAlias,\n keyPassword,\n remoteAppsCacheLimit,\n buildToolsVersion,\n allowOfflineDevices,\n allowDelayAdb,\n });\n};\n\nhelpers.prepareEmulator = async function prepareEmulator (adb, opts) {\n const {\n avd,\n avdEnv: env,\n language,\n locale: country,\n avdLaunchTimeout: launchTimeout,\n avdReadyTimeout: readyTimeout,\n } = opts;\n if (!avd) {\n throw new Error('Cannot launch AVD without AVD name');\n }\n\n const avdName = avd.replace('@', '');\n let isEmulatorRunning = true;\n try {\n await adb.getRunningAVDWithRetry(avdName, 5000);\n } catch (e) {\n logger.debug(`Emulator '${avdName}' is not running: ${e.message}`);\n isEmulatorRunning = false;\n }\n const args = prepareAvdArgs(adb, opts);\n if (isEmulatorRunning) {\n if (args.includes('-wipe-data')) {\n logger.debug(`Killing '${avdName}' because it needs to be wiped at start.`);\n await adb.killEmulator(avdName);\n } else {\n logger.debug('Not launching AVD because it is already running.');\n return;\n }\n }\n await adb.launchAVD(avd, {\n args,\n env,\n language,\n country,\n launchTimeout,\n readyTimeout,\n });\n};\n\n/**\n * Set and ensure the locale name of the device under test.\n *\n * @param {Object} adb - The adb module instance.\n * @param {string} language - Language. The language field is case insensitive, but Locale always canonicalizes to lower case.\n * format: [a-zA-Z]{2,8}. e.g. en, ja : https://developer.android.com/reference/java/util/Locale.html\n * @param {string} country - Country. The country (region) field is case insensitive, but Locale always canonicalizes to upper case.\n * format: [a-zA-Z]{2} | [0-9]{3}. e.g. US, JP : https://developer.android.com/reference/java/util/Locale.html\n * @param {?string} script - Script. The script field is case insensitive but Locale always canonicalizes to title case.\n * format: [a-zA-Z]{4}. e.g. Hans in zh-Hans-CN : https://developer.android.com/reference/java/util/Locale.html\n * @throws {Error} If it failed to set locale properly\n */\nhelpers.ensureDeviceLocale = async function ensureDeviceLocale (adb, language, country, script = null) {\n if (!_.isString(language) && !_.isString(country)) {\n logger.warn(`setDeviceLanguageCountry requires language or country.`);\n logger.warn(`Got language: '${language}' and country: '${country}'`);\n return;\n }\n\n await adb.setDeviceLanguageCountry(language, country, script);\n\n if (!await adb.ensureCurrentLocale(language, country, script)) {\n const message = script ? `language: ${language}, country: ${country} and script: ${script}` : `language: ${language} and country: ${country}`;\n throw new Error(`Failed to set ${message}`);\n }\n};\n\nhelpers.getDeviceInfoFromCaps = async function getDeviceInfoFromCaps (opts = {}) {\n // we can create a throwaway ADB instance here, so there is no dependency\n // on instantiating on earlier (at this point, we have no udid)\n // we can only use this ADB object for commands that would not be confused\n // if multiple devices are connected\n const adb = await helpers.createBaseADB(opts);\n let udid = opts.udid;\n let emPort = null;\n\n // a specific avd name was given. try to initialize with that\n if (opts.avd) {\n await helpers.prepareEmulator(adb, opts);\n udid = adb.curDeviceId;\n emPort = adb.emulatorPort;\n } else {\n // no avd given. lets try whatever's plugged in devices/emulators\n logger.info('Retrieving device list');\n let devices = await adb.getDevicesWithRetry();\n\n // udid was given, lets try to init with that device\n if (udid) {\n if (!_.includes(_.map(devices, 'udid'), udid)) {\n logger.errorAndThrow(`Device ${udid} was not in the list of connected devices`);\n }\n emPort = adb.getPortFromEmulatorString(udid);\n } else if (opts.platformVersion) {\n opts.platformVersion = `${opts.platformVersion}`.trim();\n\n // a platform version was given. lets try to find a device with the same os\n const platformVersion = semver.coerce(opts.platformVersion) || opts.platformVersion;\n logger.info(`Looking for a device with Android '${platformVersion}'`);\n\n // in case we fail to find something, give the user a useful log that has\n // the device udids and os versions so they know what's available\n const availDevices = [];\n let partialMatchCandidate = null;\n // first try started devices/emulators\n for (const device of devices) {\n // direct adb calls to the specific device\n await adb.setDeviceId(device.udid);\n const rawDeviceOS = await adb.getPlatformVersion();\n // The device OS could either be a number, like `6.0`\n // or an abbreviation, like `R`\n availDevices.push(`${device.udid} (${rawDeviceOS})`);\n const deviceOS = semver.coerce(rawDeviceOS) || rawDeviceOS;\n if (!deviceOS) {\n continue;\n }\n\n const bothVersionsCanBeCoerced = semver.valid(deviceOS) && semver.valid(platformVersion);\n const bothVersionsAreStrings = _.isString(deviceOS) && _.isString(platformVersion);\n if (bothVersionsCanBeCoerced && deviceOS.version === platformVersion.version\n || bothVersionsAreStrings && _.toLower(deviceOS) === _.toLower(platformVersion)) {\n // Got an exact match - proceed immediately\n udid = device.udid;\n break;\n } else if (!bothVersionsCanBeCoerced) {\n // There is no point to check for partial match if either of version numbers is not coercible\n continue;\n }\n\n if ((!_.includes(opts.platformVersion, '.') && platformVersion.major === deviceOS.major\n || platformVersion.major === deviceOS.major && platformVersion.minor === deviceOS.minor)\n // Got a partial match - make sure we consider the most recent\n // device version available on the host system\n && (partialMatchCandidate && semver.gt(deviceOS, _.values(partialMatchCandidate)[0])\n || !partialMatchCandidate)) {\n partialMatchCandidate = {[device.udid]: deviceOS};\n }\n }\n if (!udid && partialMatchCandidate) {\n udid = _.keys(partialMatchCandidate)[0];\n await adb.setDeviceId(udid);\n }\n\n if (!udid) {\n // we couldn't find anything! quit\n logger.errorAndThrow(`Unable to find an active device or emulator ` +\n `with OS ${opts.platformVersion}. The following are available: ` +\n availDevices.join(', '));\n }\n\n emPort = adb.getPortFromEmulatorString(udid);\n } else {\n // a udid was not given, grab the first device we see\n udid = devices[0].udid;\n emPort = adb.getPortFromEmulatorString(udid);\n }\n }\n\n logger.info(`Using device: ${udid}`);\n return {udid, emPort};\n};\n\n// returns a new adb instance with deviceId set\nhelpers.createADB = async function createADB (opts = {}) {\n const {udid, emPort} = opts;\n const adb = await helpers.createBaseADB(opts);\n adb.setDeviceId(udid);\n if (emPort) {\n adb.setEmulatorPort(emPort);\n }\n\n return adb;\n};\n\nhelpers.validatePackageActivityNames = function validatePackageActivityNames (opts) {\n for (const key of ['appPackage', 'appActivity', 'appWaitPackage', 'appWaitActivity']) {\n const name = opts[key];\n if (!name) {\n continue;\n }\n\n const match = /([^\\w.*,])+/.exec(name);\n if (!match) {\n continue;\n }\n\n logger.warn(`Capability '${key}' is expected to only include latin letters, digits, underscore, dot, comma and asterisk characters.`);\n logger.warn(`Current value '${name}' has non-matching character at index ${match.index}: '${name.substring(0, match.index + 1)}'`);\n }\n};\n\nhelpers.getLaunchInfo = async function getLaunchInfo (adb, opts) {\n let {app, appPackage, appActivity, appWaitPackage, appWaitActivity} = opts;\n if (!app) {\n logger.warn('No app sent in, not parsing package/activity');\n return;\n }\n\n this.validatePackageActivityNames(opts);\n\n if (appPackage && appActivity) {\n return;\n }\n\n logger.debug('Parsing package and activity from app manifest');\n let {apkPackage, apkActivity} =\n await adb.packageAndLaunchActivityFromManifest(app);\n if (apkPackage && !appPackage) {\n appPackage = apkPackage;\n }\n if (!appWaitPackage) {\n appWaitPackage = appPackage;\n }\n if (apkActivity && !appActivity) {\n appActivity = apkActivity;\n }\n if (!appWaitActivity) {\n appWaitActivity = appActivity;\n }\n logger.debug(`Parsed package and activity are: ${apkPackage}/${apkActivity}`);\n return {appPackage, appWaitPackage, appActivity, appWaitActivity};\n};\n\nhelpers.resetApp = async function resetApp (adb, opts = {}) {\n const {\n app,\n appPackage,\n fastReset,\n fullReset,\n androidInstallTimeout = PACKAGE_INSTALL_TIMEOUT,\n autoGrantPermissions,\n allowTestPackages\n } = opts;\n\n if (!appPackage) {\n throw new Error(\"'appPackage' option is required\");\n }\n\n const isInstalled = await adb.isAppInstalled(appPackage);\n\n if (isInstalled) {\n try {\n await adb.forceStop(appPackage);\n } catch (ign) {}\n // fullReset has priority over fastReset\n if (!fullReset && fastReset) {\n const output = await adb.clear(appPackage);\n if (_.isString(output) && output.toLowerCase().includes('failed')) {\n throw new Error(`Cannot clear the application data of '${appPackage}'. Original error: ${output}`);\n }\n // executing `shell pm clear` resets previously assigned application permissions as well\n if (autoGrantPermissions) {\n try {\n await adb.grantAllPermissions(appPackage);\n } catch (error) {\n logger.error(`Unable to grant permissions requested. Original error: ${error.message}`);\n }\n }\n logger.debug(`Performed fast reset on the installed '${appPackage}' application (stop and clear)`);\n return;\n }\n }\n\n if (!app) {\n throw new Error(`Either provide 'app' option to install '${appPackage}' or ` +\n `consider setting 'noReset' to 'true' if '${appPackage}' is supposed to be preinstalled.`);\n }\n\n logger.debug(`Running full reset on '${appPackage}' (reinstall)`);\n if (isInstalled) {\n await adb.uninstallApk(appPackage);\n }\n await adb.install(app, {\n grantPermissions: autoGrantPermissions,\n timeout: androidInstallTimeout,\n allowTestPackages,\n });\n};\n\nhelpers.installApk = async function installApk (adb, opts = {}) {\n const {\n app,\n appPackage,\n fastReset,\n fullReset,\n androidInstallTimeout = PACKAGE_INSTALL_TIMEOUT,\n autoGrantPermissions,\n allowTestPackages,\n enforceAppInstall,\n } = opts;\n\n if (!app || !appPackage) {\n throw new Error(\"'app' and 'appPackage' options are required\");\n }\n\n if (fullReset) {\n await this.resetApp(adb, opts);\n return;\n }\n\n const {\n appState,\n wasUninstalled\n } = await adb.installOrUpgrade(app, appPackage, {\n grantPermissions: autoGrantPermissions,\n timeout: androidInstallTimeout,\n allowTestPackages,\n enforceCurrentBuild: enforceAppInstall,\n });\n\n // There is no need to reset the newly installed app\n const isInstalledOverExistingApp = !wasUninstalled\n && appState !== adb.APP_INSTALL_STATE.NOT_INSTALLED;\n if (fastReset && isInstalledOverExistingApp) {\n logger.info(`Performing fast reset on '${appPackage}'`);\n await this.resetApp(adb, opts);\n }\n};\n\n/**\n * Installs an array of apks\n * @param {ADB} adb Instance of Appium ADB object\n * @param {Object} opts Opts defined in driver.js\n */\nhelpers.installOtherApks = async function installOtherApks (otherApps, adb, opts) {\n let {\n androidInstallTimeout = PACKAGE_INSTALL_TIMEOUT,\n autoGrantPermissions,\n allowTestPackages\n } = opts;\n\n // Install all of the APK's asynchronously\n await B.all(otherApps.map((otherApp) => {\n logger.debug(`Installing app: ${otherApp}`);\n return adb.installOrUpgrade(otherApp, null, {\n grantPermissions: autoGrantPermissions,\n timeout: androidInstallTimeout,\n allowTestPackages,\n });\n }));\n};\n\n/**\n * Uninstall an array of packages\n * @param {ADB} adb Instance of Appium ADB object\n * @param {Array<string>} appPackages An array of package names to uninstall. If this includes `'*'`, uninstall all of 3rd party apps\n * @param {Array<string>} filterPackages An array of packages does not uninstall when `*` is provided as `appPackages`\n */\nhelpers.uninstallOtherPackages = async function uninstallOtherPackages (adb, appPackages, filterPackages = []) {\n if (appPackages.includes('*')) {\n logger.debug('Uninstall third party packages');\n appPackages = await this.getThirdPartyPackages(adb, filterPackages);\n }\n\n logger.debug(`Uninstalling packages: ${appPackages}`);\n await B.all(appPackages.map((appPackage) => adb.uninstallApk(appPackage)));\n};\n\n/**\n * Get third party packages filtered with `filterPackages`\n * @param {ADB} adb Instance of Appium ADB object\n * @param {Array<string>} filterPackages An array of packages does not uninstall when `*` is provided as `appPackages`\n * @returns {Array<string>} An array of installed third pary packages\n */\nhelpers.getThirdPartyPackages = async function getThirdPartyPackages (adb, filterPackages = []) {\n try {\n const packagesString = await adb.shell(['pm', 'list', 'packages', '-3']);\n const appPackagesArray = packagesString.trim().replace(/package:/g, '').split(EOL);\n logger.debug(`'${appPackagesArray}' filtered with '${filterPackages}'`);\n return _.difference(appPackagesArray, filterPackages);\n } catch (err) {\n logger.warn(`Unable to get packages with 'adb shell pm list packages -3': ${err.message}`);\n return [];\n }\n};\n\nhelpers.initUnicodeKeyboard = async function initUnicodeKeyboard (adb) {\n logger.debug('Enabling Unicode keyboard support');\n\n // get the default IME so we can return back to it later if we want\n let defaultIME = await adb.defaultIME();\n\n logger.debug(`Unsetting previous IME ${defaultIME}`);\n const appiumIME = `${SETTINGS_HELPER_PKG_ID}/.UnicodeIME`;\n logger.debug(`Setting IME to '${appiumIME}'`);\n await adb.enableIME(appiumIME);\n await adb.setIME(appiumIME);\n return defaultIME;\n};\n\nhelpers.setMockLocationApp = async function setMockLocationApp (adb, app) {\n try {\n if (await adb.getApiLevel() < 23) {\n await adb.shell(['settings', 'put', 'secure', 'mock_location', '1']);\n } else {\n await adb.shell(['appops', 'set', app, 'android:mock_location', 'allow']);\n }\n } catch (err) {\n logger.warn(`Unable to set mock location for app '${app}': ${err.message}`);\n return;\n }\n try {\n let pkgIds = [];\n if (await adb.fileExists(MOCK_APP_IDS_STORE)) {\n try {\n pkgIds = JSON.parse(await adb.shell(['cat', MOCK_APP_IDS_STORE]));\n } catch (ign) {}\n }\n if (pkgIds.includes(app)) {\n return;\n }\n pkgIds.push(app);\n const tmpRoot = await tempDir.openDir();\n const srcPath = path.posix.join(tmpRoot, path.posix.basename(MOCK_APP_IDS_STORE));\n try {\n await fs.writeFile(srcPath, JSON.stringify(pkgIds), 'utf8');\n await adb.pushFile(srcPath, MOCK_APP_IDS_STORE);\n } finally {\n await fs.rimraf(tmpRoot);\n }\n } catch (e) {\n logger.warn(`Unable to persist mock location app id '${app}': ${e.message}`);\n }\n};\n\nhelpers.resetMockLocation = async function resetMockLocation (adb) {\n try {\n if (await adb.getApiLevel() < 23) {\n await adb.shell(['settings', 'put', 'secure', 'mock_location', '0']);\n return;\n }\n\n const thirdPartyPkgIdsPromise = helpers.getThirdPartyPackages(adb);\n let pkgIds = [];\n if (await adb.fileExists(MOCK_APP_IDS_STORE)) {\n try {\n pkgIds = JSON.parse(await adb.shell(['cat', MOCK_APP_IDS_STORE]));\n } catch (ign) {}\n }\n const thirdPartyPkgIds = await thirdPartyPkgIdsPromise;\n // Only include currently installed packages\n const resultPkgs = _.intersection(pkgIds, thirdPartyPkgIds);\n if (_.size(resultPkgs) <= 1) {\n await adb.shell(['appops', 'set', resultPkgs[0] ?? SETTINGS_HELPER_PKG_ID, 'android:mock_location', 'deny']);\n return;\n }\n\n logger.debug(`Resetting mock_location permission for the following apps: ${resultPkgs}`);\n await B.all(resultPkgs.map((pkgId) => (async () => {\n try {\n await adb.shell(['appops', 'set', pkgId, 'android:mock_location', 'deny']);\n } catch (ign) {}\n })()));\n } catch (err) {\n logger.warn(`Unable to reset mock location: ${err.message}`);\n }\n};\n\nhelpers.installHelperApp = async function installHelperApp (adb, apkPath, packageId) {\n // Sometimes adb push or adb instal take more time than expected to install an app\n // e.g. https://github.com/appium/io.appium.settings/issues/40#issuecomment-476593174\n await retry(2, async function retryInstallHelperApp () {\n await adb.installOrUpgrade(apkPath, packageId, {grantPermissions: true});\n });\n};\n\n/**\n * Pushes and installs io.appium.settings app.\n * Throws an error if the setting app is required\n *\n * @param {Adb} adb - The adb module instance.\n * @param {Object} opts - Driver options dictionary.\n * @param {boolean} throwError [false] - Whether throw an error if Settings app fails to start\n * @throws {Error} If throwError is true and something happens in installation step\n */\nhelpers.pushSettingsApp = async function pushSettingsApp (adb, throwError = false, opts = {}) {\n logger.debug('Pushing settings apk to device...');\n\n try {\n await helpers.installHelperApp(adb, settingsApkPath, SETTINGS_HELPER_PKG_ID, throwError);\n } catch (err) {\n if (throwError) {\n throw err;\n }\n\n logger.warn(`Ignored error while installing '${settingsApkPath}': ` +\n `'${err.message}'. Features that rely on this helper ` +\n 'require the apk such as toggle WiFi and getting location ' +\n 'will raise an error if you try to use them.');\n }\n\n // Reinstall would stop the settings helper process anyway, so\n // there is no need to continue if the application is still running\n if (await adb.processExists(SETTINGS_HELPER_PKG_ID)) {\n logger.debug(`${SETTINGS_HELPER_PKG_ID} is already running. ` +\n `There is no need to reset its permissions.`);\n return;\n }\n\n const apiLevel = await adb.getApiLevel();\n if (apiLevel >= 29) {\n // https://github.com/appium/io.appium.settings#internal-audio--video-recording\n try {\n await adb.shell(['appops', 'set', SETTINGS_HELPER_PKG_ID, 'PROJECT_MEDIA', 'allow']);\n } catch (err) {\n logger.debug(err);\n }\n }\n if (apiLevel <= 23) { // Android 6- devices should have granted permissions\n // https://github.com/appium/appium/pull/11640#issuecomment-438260477\n const perms = ['SET_ANIMATION_SCALE', 'CHANGE_CONFIGURATION', 'ACCESS_FINE_LOCATION'];\n logger.info(`Granting permissions ${perms} to '${SETTINGS_HELPER_PKG_ID}'`);\n await adb.grantPermissions(SETTINGS_HELPER_PKG_ID, perms.map((x) => `android.permission.${x}`));\n }\n\n // launch io.appium.settings app due to settings failing to be set\n // if the app is not launched prior to start the session on android 7+\n // see https://github.com/appium/appium/issues/8957\n try {\n await adb.requireRunningSettingsApp({\n timeout: helpers.isEmulator(adb, opts) ? 30000 : 5000\n });\n } catch (err) {\n logger.debug(err);\n if (throwError) {\n throw err;\n }\n }\n};\n\n/**\n * Extracts string.xml and converts it to string.json and pushes\n * it to /data/local/tmp/string.json on for use of bootstrap\n * If app is not present to extract string.xml it deletes remote strings.json\n * If app does not have strings.xml we push an empty json object to remote\n *\n * @param {?string} language - Language abbreviation, for example 'fr'. The default language\n * is used if this argument is not defined.\n * @param {Object} adb - The adb module instance.\n * @param {Object} opts - Driver options dictionary.\n * @returns {Object} The dictionary, where string resource identifiers are keys\n * along with their corresponding values for the given language or an empty object\n * if no matching resources were extracted.\n */\nhelpers.pushStrings = async function pushStrings (language, adb, opts) {\n const remoteDir = '/data/local/tmp';\n const stringsJson = 'strings.json';\n const remoteFile = path.posix.resolve(remoteDir, stringsJson);\n\n // clean up remote string.json if present\n await adb.rimraf(remoteFile);\n\n let app;\n try {\n app = opts.app || await adb.pullApk(opts.appPackage, opts.tmpDir);\n } catch (err) {\n logger.info(`Failed to pull an apk from '${opts.appPackage}' to '${opts.tmpDir}'. Original error: ${err.message}`);\n }\n\n if (_.isEmpty(opts.appPackage) || !(await fs.exists(app))) {\n logger.debug(`No app or package specified. Returning empty strings`);\n return {};\n }\n\n const stringsTmpDir = path.resolve(opts.tmpDir, opts.appPackage);\n try {\n logger.debug('Extracting strings from apk', app, language, stringsTmpDir);\n const {apkStrings, localPath} = await adb.extractStringsFromApk(app, language, stringsTmpDir);\n await adb.push(localPath, remoteDir);\n return apkStrings;\n } catch (err) {\n logger.warn(`Could not get strings, continuing anyway. Original error: ${err.message}`);\n await adb.shell('echo', [`'{}' > ${remoteFile}`]);\n } finally {\n await fs.rimraf(stringsTmpDir);\n }\n return {};\n};\n\nhelpers.unlockWithHelperApp = async function unlockWithHelperApp (adb) {\n logger.info('Unlocking screen');\n\n // Unlock succeed with a couple of retries.\n let firstRun = true;\n await retry(3, async function launchHelper () {\n // To reduce a time to call adb.isScreenLocked() since `adb shell dumpsys window` is easy to hang adb commands\n if (firstRun) {\n firstRun = false;\n } else {\n try {\n if (!(await adb.isScreenLocked())) {\n return;\n }\n } catch (e) {\n logger.warn(`Error in isScreenLocked: ${e.message}`);\n logger.warn('\"adb shell dumpsys window\" command has timed out.');\n logger.warn('The reason of this timeout is the delayed adb response. Resetting adb server can improve it.');\n }\n }\n\n logger.info(`Launching ${SETTINGS_HELPER_UNLOCK_ACTIVITY}`);\n await adb.shell([\n 'am', 'start',\n '-n', `${SETTINGS_HELPER_PKG_ID}/${SETTINGS_HELPER_UNLOCK_ACTIVITY}`,\n '-c', 'android.intent.category.LAUNCHER',\n '-a', 'android.intent.action.MAIN',\n '-f', '0x10200000',\n ]);\n await B.delay(1000);\n });\n};\n\nhelpers.unlock = async function unlock (driver, adb, capabilities) {\n if (!(await adb.isScreenLocked())) {\n logger.info('Screen already unlocked, doing nothing');\n return;\n }\n logger.debug('Screen is locked, trying to unlock');\n\n if (!capabilities.unlockType && !capabilities.unlockKey) {\n logger.warn('Using app unlock, this is going to be deprecated!');\n await helpers.unlockWithHelperApp(adb);\n return;\n }\n\n const {\n unlockType,\n unlockKey,\n unlockStrategy,\n unlockSuccessTimeout,\n } = unlocker.validateUnlockCapabilities(capabilities);\n if (unlockKey && unlockType !== FINGERPRINT_UNLOCK\n && (_.isNil(unlockStrategy) || _.toLower(unlockStrategy) === 'locksettings')\n && await adb.isLockManagementSupported()) {\n await unlocker.fastUnlock(adb, {\n credential: unlockKey,\n credentialType: toCredentialType(unlockType),\n });\n } else {\n const unlockMethod = {\n [PIN_UNLOCK]: unlocker.pinUnlock,\n [PIN_UNLOCK_KEY_EVENT]: unlocker.pinUnlockWithKeyEvent,\n [PASSWORD_UNLOCK]: unlocker.passwordUnlock,\n [PATTERN_UNLOCK]: unlocker.patternUnlock,\n [FINGERPRINT_UNLOCK]: unlocker.fingerprintUnlock,\n }[unlockType];\n await unlockMethod(adb, driver, capabilities);\n }\n await helpers.verifyUnlock(adb, unlockSuccessTimeout);\n};\n\nhelpers.verifyUnlock = async function verifyUnlock (adb, timeoutMs = null) {\n try {\n await waitForCondition(async () => !(await adb.isScreenLocked()), {\n waitMs: timeoutMs ?? 2000,\n intervalMs: 500,\n });\n } catch (ign) {\n throw new Error('The device has failed to be unlocked');\n }\n logger.info('The device has been successfully unlocked');\n};\n\nhelpers.initDevice = async function initDevice (adb, opts) {\n const {\n skipDeviceInitialization,\n locale,\n language,\n localeScript,\n unicodeKeyboard,\n disableWindowAnimation,\n skipUnlock,\n mockLocationApp,\n skipLogcatCapture,\n logcatFormat,\n logcatFilterSpecs,\n } = opts;\n\n if (skipDeviceInitialization) {\n logger.info(`'skipDeviceInitialization' is set. Skipping device initialization.`);\n } else {\n await adb.waitForDevice();\n // pushSettingsApp required before calling ensureDeviceLocale for API Level 24+\n\n // Some feature such as location/wifi are not necessary for all users,\n // but they require the settings app. So, try to configure it while Appium\n // does not throw error even if they fail.\n const shouldThrowError = language\n || locale\n || localeScript\n || unicodeKeyboard\n || disableWindowAnimation\n || !skipUnlock;\n await helpers.pushSettingsApp(adb, shouldThrowError, opts);\n }\n\n if (!helpers.isEmulator(adb, opts)) {\n if (mockLocationApp || _.isUndefined(mockLocationApp)) {\n await helpers.setMockLocationApp(adb, mockLocationApp || SETTINGS_HELPER_PKG_ID);\n } else {\n await helpers.resetMockLocation(adb);\n }\n }\n\n if (language || locale) {\n await helpers.ensureDeviceLocale(adb, language, locale, localeScript);\n }\n\n if (skipLogcatCapture) {\n logger.info(`'skipLogcatCapture' is set. Skipping starting logcat capture.`);\n } else {\n await adb.startLogcat({\n format: logcatFormat,\n filterSpecs: logcatFilterSpecs,\n });\n }\n\n if (unicodeKeyboard) {\n return await helpers.initUnicodeKeyboard(adb);\n }\n};\n\nhelpers.removeNullProperties = function removeNullProperties (obj) {\n for (let key of _.keys(obj)) {\n if (_.isNull(obj[key]) || _.isUndefined(obj[key])) {\n delete obj[key];\n }\n }\n};\n\nhelpers.truncateDecimals = function truncateDecimals (number, digits) {\n let multiplier = Math.pow(10, digits),\n adjustedNum = number * multiplier,\n truncatedNum = Math[adjustedNum < 0 ? 'ceil' : 'floor'](adjustedNum);\n\n return truncatedNum / multiplier;\n};\n\nhelpers.isChromeBrowser = function isChromeBrowser (browser) {\n return _.includes(Object.keys(CHROME_BROWSER_PACKAGE_ACTIVITY), (browser || '').toLowerCase());\n};\n\nhelpers.getChromePkg = function getChromePkg (browser) {\n return CHROME_BROWSER_PACKAGE_ACTIVITY[browser.toLowerCase()] || CHROME_BROWSER_PACKAGE_ACTIVITY.default;\n};\n\nhelpers.removeAllSessionWebSocketHandlers = async function removeAllSessionWebSocketHandlers (server, sessionId) {\n if (!server || !_.isFunction(server.getWebSocketHandlers)) {\n return;\n }\n\n const activeHandlers = await server.getWebSocketHandlers(sessionId);\n for (const pathname of _.keys(activeHandlers)) {\n await server.removeWebSocketHandler(pathname);\n }\n};\n\n/**\n * Takes a desired capability and tries to JSON.parse it as an array,\n * and either returns the parsed array or a singleton array.\n *\n * @param {any} cap A desired capability\n */\nhelpers.parseArray = function parseArray (cap) {\n let parsedCaps;\n try {\n parsedCaps = JSON.parse(cap);\n } catch (ign) { }\n\n if (_.isArray(parsedCaps)) {\n return parsedCaps;\n } else if (_.isString(cap)) {\n return [cap];\n }\n\n throw new Error(`must provide a string or JSON Array; received ${cap}`);\n};\n\n/**\n * Validate desired capabilities. Returns true if capability is valid\n *\n * @param {*} cap A desired capability\n * @return {boolean} Returns true if the capability is valid\n * @throws {Error} If the caps has invalid capability\n */\nhelpers.validateDesiredCaps = function validateDesiredCaps (caps) {\n if (caps.browserName) {\n if (caps.app) {\n // warn if the capabilities have both `app` and `browser, although this is common with selenium grid\n logger.warn(`The desired capabilities should generally not include both an 'app' and a 'browserName'`);\n }\n if (caps.appPackage) {\n logger.errorAndThrow(`The desired should not include both of an 'appPackage' and a 'browserName'`);\n }\n }\n\n if (caps.uninstallOtherPackages) {\n try {\n this.parseArray(caps.uninstallOtherPackages);\n } catch (e) {\n logger.errorAndThrow(`Could not parse \"uninstallOtherPackages\" capability: ${e.message}`);\n }\n }\n\n return true;\n};\n\n/**\n * Adjust the capabilities for a browser session\n *\n * @param {Object} caps - Current capabilities object\n * !!! The object is mutated by this method call !!!\n * @returns {Object} The same possibly mutated `opts` instance.\n * No mutation is happening is the current session if\n * appPackage/appActivity caps have already been provided.\n */\nhelpers.adjustBrowserSessionCaps = function adjustBrowserSessionCaps (caps = {}) {\n const { browserName } = caps;\n logger.info(`The current session is considered browser-based`);\n logger.info(`Supported browser names: ${JSON.stringify(_.keys(CHROME_BROWSER_PACKAGE_ACTIVITY))}`);\n if (caps.appPackage || caps.appActivity) {\n logger.info(`Not overriding appPackage/appActivity capability values for '${browserName}' ` +\n 'because some of them have been already provided');\n return caps;\n }\n\n const {pkg, activity} = this.getChromePkg(browserName);\n caps.appPackage = pkg;\n caps.appActivity = activity;\n logger.info(`appPackage/appActivity capabilities have been automatically set to ${pkg}/${activity} ` +\n `for '${browserName}'`);\n logger.info(`Consider changing the browserName to the one from the list of supported browser names ` +\n `or provide custom appPackage/appActivity capability values if the automatically assigned ones do ` +\n `not make sense`);\n return caps;\n};\n\n/**\n * Checks whether the current device under test is an emulator\n *\n * @param {ADB} adb - appium-adb instance\n * @param {Object} opts - driver options mapping\n * @returns {boolean} `true` if the device is an Android emulator\n */\nhelpers.isEmulator = function isEmulator (adb, opts) {\n const possibleNames = [opts.udid, adb?.curDeviceId];\n return !!opts.avd || possibleNames.some((x) => EMULATOR_PATTERN.test(x));\n};\n\nhelpers.bootstrap = Bootstrap;\nhelpers.unlocker = unlocker;\n\nexport { helpers, SETTINGS_HELPER_PKG_ID, APP_STATE, prepareAvdArgs, ensureNetworkSpeed };\nexport default helpers;\n"],"mappings":"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"}
1
+ {"version":3,"file":"android-helpers.js","names":["MOCK_APP_IDS_STORE","PACKAGE_INSTALL_TIMEOUT","CHROME_BROWSER_PACKAGE_ACTIVITY","chrome","pkg","activity","chromium","chromebeta","browser","default","SETTINGS_HELPER_PKG_ID","EMULATOR_PATTERN","APP_STATE","Object","freeze","NOT_INSTALLED","NOT_RUNNING","RUNNING_IN_BACKGROUND","RUNNING_IN_FOREGROUND","ensureNetworkSpeed","adb","networkSpeed","_","values","NETWORK_SPEED","includes","logger","warn","FULL","prepareAvdArgs","opts","isHeadless","avdArgs","result","isArray","push","util","shellParse","toCredentialType","unlockType","PIN_UNLOCK","PIN_UNLOCK_KEY_EVENT","PASSWORD_UNLOCK","PATTERN_UNLOCK","Error","helpers","createBaseADB","adbPort","suppressKillServer","remoteAdbHost","clearDeviceLogsOnStart","adbExecTimeout","useKeystore","keystorePath","keystorePassword","keyAlias","keyPassword","remoteAppsCacheLimit","buildToolsVersion","allowOfflineDevices","allowDelayAdb","ADB","createADB","prepareEmulator","avd","avdEnv","env","language","locale","country","avdLaunchTimeout","launchTimeout","avdReadyTimeout","readyTimeout","avdName","replace","isEmulatorRunning","getRunningAVDWithRetry","e","debug","message","args","killEmulator","launchAVD","ensureDeviceLocale","script","isString","setDeviceLanguageCountry","ensureCurrentLocale","getDeviceInfoFromCaps","udid","emPort","curDeviceId","emulatorPort","info","devices","getDevicesWithRetry","map","errorAndThrow","getPortFromEmulatorString","platformVersion","trim","semver","coerce","availDevices","partialMatchCandidate","device","setDeviceId","rawDeviceOS","getPlatformVersion","deviceOS","bothVersionsCanBeCoerced","valid","bothVersionsAreStrings","version","toLower","major","minor","gt","keys","join","setEmulatorPort","validatePackageActivityNames","key","name","match","exec","index","substring","getLaunchInfo","app","appPackage","appActivity","appWaitPackage","appWaitActivity","apkPackage","apkActivity","packageAndLaunchActivityFromManifest","resetApp","fastReset","fullReset","androidInstallTimeout","autoGrantPermissions","allowTestPackages","isInstalled","isAppInstalled","forceStop","ign","output","clear","toLowerCase","grantAllPermissions","error","uninstallApk","install","grantPermissions","timeout","installApk","enforceAppInstall","appState","wasUninstalled","installOrUpgrade","enforceCurrentBuild","isInstalledOverExistingApp","APP_INSTALL_STATE","installOtherApks","otherApps","B","all","otherApp","uninstallOtherPackages","appPackages","filterPackages","getThirdPartyPackages","packagesString","shell","appPackagesArray","split","EOL","difference","err","initUnicodeKeyboard","defaultIME","appiumIME","enableIME","setIME","setMockLocationApp","getApiLevel","pkgIds","fileExists","JSON","parse","tmpRoot","tempDir","openDir","srcPath","path","posix","basename","fs","writeFile","stringify","pushFile","rimraf","resetMockLocation","thirdPartyPkgIdsPromise","thirdPartyPkgIds","resultPkgs","intersection","size","pkgId","installHelperApp","apkPath","packageId","retry","retryInstallHelperApp","pushSettingsApp","throwError","settingsApkPath","processExists","apiLevel","perms","x","requireRunningSettingsApp","isEmulator","pushStrings","remoteDir","stringsJson","remoteFile","resolve","pullApk","tmpDir","isEmpty","exists","stringsTmpDir","apkStrings","localPath","extractStringsFromApk","unlock","driver","capabilities","isScreenLocked","unlockKey","dismissKeyguard","unlockStrategy","unlockSuccessTimeout","unlocker","validateUnlockCapabilities","FINGERPRINT_UNLOCK","isNil","isLockManagementSupported","fastUnlock","credential","credentialType","unlockMethod","pinUnlock","pinUnlockWithKeyEvent","passwordUnlock","patternUnlock","fingerprintUnlock","verifyUnlock","timeoutMs","waitForCondition","waitMs","intervalMs","initDevice","skipDeviceInitialization","localeScript","unicodeKeyboard","disableWindowAnimation","skipUnlock","mockLocationApp","skipLogcatCapture","logcatFormat","logcatFilterSpecs","waitForDevice","shouldThrowError","isUndefined","startLogcat","format","filterSpecs","removeNullProperties","obj","isNull","truncateDecimals","number","digits","multiplier","Math","pow","adjustedNum","truncatedNum","isChromeBrowser","getChromePkg","removeAllSessionWebSocketHandlers","server","sessionId","isFunction","getWebSocketHandlers","activeHandlers","pathname","removeWebSocketHandler","parseArray","cap","parsedCaps","validateDesiredCaps","caps","browserName","adjustBrowserSessionCaps","possibleNames","some","test","bootstrap","Bootstrap"],"sources":["../../lib/android-helpers.js"],"sourcesContent":["import _ from 'lodash';\nimport path from 'path';\nimport { retry, waitForCondition } from 'asyncbox';\nimport logger from './logger';\nimport { fs, util, tempDir } from '@appium/support';\nimport { path as settingsApkPath } from 'io.appium.settings';\nimport Bootstrap from './bootstrap';\nimport B from 'bluebird';\nimport ADB from 'appium-adb';\nimport {\n default as unlocker, PIN_UNLOCK, PIN_UNLOCK_KEY_EVENT,\n PASSWORD_UNLOCK, PATTERN_UNLOCK, FINGERPRINT_UNLOCK\n} from './unlock-helpers';\nimport { EOL } from 'os';\nimport semver from 'semver';\n\nconst MOCK_APP_IDS_STORE = '/data/local/tmp/mock_apps.json';\nconst PACKAGE_INSTALL_TIMEOUT = 90000; // milliseconds\n// https://cs.chromium.org/chromium/src/chrome/browser/devtools/device/android_device_info_query.cc\nconst CHROME_BROWSER_PACKAGE_ACTIVITY = {\n chrome: {\n pkg: 'com.android.chrome',\n activity: 'com.google.android.apps.chrome.Main',\n },\n chromium: {\n pkg: 'org.chromium.chrome.shell',\n activity: '.ChromeShellActivity',\n },\n chromebeta: {\n pkg: 'com.chrome.beta',\n activity: 'com.google.android.apps.chrome.Main',\n },\n browser: {\n pkg: 'com.android.browser',\n activity: 'com.android.browser.BrowserActivity',\n },\n 'chromium-browser': {\n pkg: 'org.chromium.chrome',\n activity: 'com.google.android.apps.chrome.Main',\n },\n 'chromium-webview': {\n pkg: 'org.chromium.webview_shell',\n activity: 'org.chromium.webview_shell.WebViewBrowserActivity',\n },\n default: {\n pkg: 'com.android.chrome',\n activity: 'com.google.android.apps.chrome.Main',\n },\n};\nconst SETTINGS_HELPER_PKG_ID = 'io.appium.settings';\nconst EMULATOR_PATTERN = /\\bemulator\\b/i;\n// These constants are in sync with\n// https://developer.apple.com/documentation/xctest/xcuiapplicationstate/xcuiapplicationstaterunningbackground?language=objc\nconst APP_STATE = Object.freeze({\n NOT_INSTALLED: 0,\n NOT_RUNNING: 1,\n RUNNING_IN_BACKGROUND: 3,\n RUNNING_IN_FOREGROUND: 4\n});\n\n\nfunction ensureNetworkSpeed (adb, networkSpeed) {\n if (_.values(adb.NETWORK_SPEED).includes(networkSpeed)) {\n return networkSpeed;\n }\n logger.warn(`Wrong network speed param '${networkSpeed}', using default: ${adb.NETWORK_SPEED.FULL}. ` +\n `Supported values: ${_.values(adb.NETWORK_SPEED)}`);\n return adb.NETWORK_SPEED.FULL;\n}\n\nfunction prepareAvdArgs (adb, opts) {\n const {\n networkSpeed,\n isHeadless,\n avdArgs,\n } = opts;\n const result = [];\n if (avdArgs) {\n if (_.isArray(avdArgs)) {\n result.push(...avdArgs);\n } else {\n result.push(...(util.shellParse(`${avdArgs}`)));\n }\n }\n if (networkSpeed) {\n result.push('-netspeed', ensureNetworkSpeed(adb, networkSpeed));\n }\n if (isHeadless) {\n result.push('-no-window');\n }\n return result;\n}\n\nfunction toCredentialType (unlockType) {\n const result = {\n [PIN_UNLOCK]: 'pin',\n [PIN_UNLOCK_KEY_EVENT]: 'pin',\n [PASSWORD_UNLOCK]: 'password',\n [PATTERN_UNLOCK]: 'pattern',\n }[unlockType];\n if (result) {\n return result;\n }\n throw new Error(`Unlock type '${unlockType}' is not known`);\n}\n\n\nconst helpers = {};\n\nhelpers.createBaseADB = async function createBaseADB (opts = {}) {\n // filter out any unwanted options sent in\n // this list should be updated as ADB takes more arguments\n const {\n adbPort,\n suppressKillServer,\n remoteAdbHost,\n clearDeviceLogsOnStart,\n adbExecTimeout,\n useKeystore,\n keystorePath,\n keystorePassword,\n keyAlias,\n keyPassword,\n remoteAppsCacheLimit,\n buildToolsVersion,\n allowOfflineDevices,\n allowDelayAdb,\n } = opts;\n return await ADB.createADB({\n adbPort,\n suppressKillServer,\n remoteAdbHost,\n clearDeviceLogsOnStart,\n adbExecTimeout,\n useKeystore,\n keystorePath,\n keystorePassword,\n keyAlias,\n keyPassword,\n remoteAppsCacheLimit,\n buildToolsVersion,\n allowOfflineDevices,\n allowDelayAdb,\n });\n};\n\nhelpers.prepareEmulator = async function prepareEmulator (adb, opts) {\n const {\n avd,\n avdEnv: env,\n language,\n locale: country,\n avdLaunchTimeout: launchTimeout,\n avdReadyTimeout: readyTimeout,\n } = opts;\n if (!avd) {\n throw new Error('Cannot launch AVD without AVD name');\n }\n\n const avdName = avd.replace('@', '');\n let isEmulatorRunning = true;\n try {\n await adb.getRunningAVDWithRetry(avdName, 5000);\n } catch (e) {\n logger.debug(`Emulator '${avdName}' is not running: ${e.message}`);\n isEmulatorRunning = false;\n }\n const args = prepareAvdArgs(adb, opts);\n if (isEmulatorRunning) {\n if (args.includes('-wipe-data')) {\n logger.debug(`Killing '${avdName}' because it needs to be wiped at start.`);\n await adb.killEmulator(avdName);\n } else {\n logger.debug('Not launching AVD because it is already running.');\n return;\n }\n }\n await adb.launchAVD(avd, {\n args,\n env,\n language,\n country,\n launchTimeout,\n readyTimeout,\n });\n};\n\n/**\n * Set and ensure the locale name of the device under test.\n *\n * @param {Object} adb - The adb module instance.\n * @param {string} language - Language. The language field is case insensitive, but Locale always canonicalizes to lower case.\n * format: [a-zA-Z]{2,8}. e.g. en, ja : https://developer.android.com/reference/java/util/Locale.html\n * @param {string} country - Country. The country (region) field is case insensitive, but Locale always canonicalizes to upper case.\n * format: [a-zA-Z]{2} | [0-9]{3}. e.g. US, JP : https://developer.android.com/reference/java/util/Locale.html\n * @param {?string} script - Script. The script field is case insensitive but Locale always canonicalizes to title case.\n * format: [a-zA-Z]{4}. e.g. Hans in zh-Hans-CN : https://developer.android.com/reference/java/util/Locale.html\n * @throws {Error} If it failed to set locale properly\n */\nhelpers.ensureDeviceLocale = async function ensureDeviceLocale (adb, language, country, script = null) {\n if (!_.isString(language) && !_.isString(country)) {\n logger.warn(`setDeviceLanguageCountry requires language or country.`);\n logger.warn(`Got language: '${language}' and country: '${country}'`);\n return;\n }\n\n await adb.setDeviceLanguageCountry(language, country, script);\n\n if (!await adb.ensureCurrentLocale(language, country, script)) {\n const message = script ? `language: ${language}, country: ${country} and script: ${script}` : `language: ${language} and country: ${country}`;\n throw new Error(`Failed to set ${message}`);\n }\n};\n\nhelpers.getDeviceInfoFromCaps = async function getDeviceInfoFromCaps (opts = {}) {\n // we can create a throwaway ADB instance here, so there is no dependency\n // on instantiating on earlier (at this point, we have no udid)\n // we can only use this ADB object for commands that would not be confused\n // if multiple devices are connected\n const adb = await helpers.createBaseADB(opts);\n let udid = opts.udid;\n let emPort = null;\n\n // a specific avd name was given. try to initialize with that\n if (opts.avd) {\n await helpers.prepareEmulator(adb, opts);\n udid = adb.curDeviceId;\n emPort = adb.emulatorPort;\n } else {\n // no avd given. lets try whatever's plugged in devices/emulators\n logger.info('Retrieving device list');\n let devices = await adb.getDevicesWithRetry();\n\n // udid was given, lets try to init with that device\n if (udid) {\n if (!_.includes(_.map(devices, 'udid'), udid)) {\n logger.errorAndThrow(`Device ${udid} was not in the list of connected devices`);\n }\n emPort = adb.getPortFromEmulatorString(udid);\n } else if (opts.platformVersion) {\n opts.platformVersion = `${opts.platformVersion}`.trim();\n\n // a platform version was given. lets try to find a device with the same os\n const platformVersion = semver.coerce(opts.platformVersion) || opts.platformVersion;\n logger.info(`Looking for a device with Android '${platformVersion}'`);\n\n // in case we fail to find something, give the user a useful log that has\n // the device udids and os versions so they know what's available\n const availDevices = [];\n let partialMatchCandidate = null;\n // first try started devices/emulators\n for (const device of devices) {\n // direct adb calls to the specific device\n await adb.setDeviceId(device.udid);\n const rawDeviceOS = await adb.getPlatformVersion();\n // The device OS could either be a number, like `6.0`\n // or an abbreviation, like `R`\n availDevices.push(`${device.udid} (${rawDeviceOS})`);\n const deviceOS = semver.coerce(rawDeviceOS) || rawDeviceOS;\n if (!deviceOS) {\n continue;\n }\n\n const bothVersionsCanBeCoerced = semver.valid(deviceOS) && semver.valid(platformVersion);\n const bothVersionsAreStrings = _.isString(deviceOS) && _.isString(platformVersion);\n if (bothVersionsCanBeCoerced && deviceOS.version === platformVersion.version\n || bothVersionsAreStrings && _.toLower(deviceOS) === _.toLower(platformVersion)) {\n // Got an exact match - proceed immediately\n udid = device.udid;\n break;\n } else if (!bothVersionsCanBeCoerced) {\n // There is no point to check for partial match if either of version numbers is not coercible\n continue;\n }\n\n if ((!_.includes(opts.platformVersion, '.') && platformVersion.major === deviceOS.major\n || platformVersion.major === deviceOS.major && platformVersion.minor === deviceOS.minor)\n // Got a partial match - make sure we consider the most recent\n // device version available on the host system\n && (partialMatchCandidate && semver.gt(deviceOS, _.values(partialMatchCandidate)[0])\n || !partialMatchCandidate)) {\n partialMatchCandidate = {[device.udid]: deviceOS};\n }\n }\n if (!udid && partialMatchCandidate) {\n udid = _.keys(partialMatchCandidate)[0];\n await adb.setDeviceId(udid);\n }\n\n if (!udid) {\n // we couldn't find anything! quit\n logger.errorAndThrow(`Unable to find an active device or emulator ` +\n `with OS ${opts.platformVersion}. The following are available: ` +\n availDevices.join(', '));\n }\n\n emPort = adb.getPortFromEmulatorString(udid);\n } else {\n // a udid was not given, grab the first device we see\n udid = devices[0].udid;\n emPort = adb.getPortFromEmulatorString(udid);\n }\n }\n\n logger.info(`Using device: ${udid}`);\n return {udid, emPort};\n};\n\n// returns a new adb instance with deviceId set\nhelpers.createADB = async function createADB (opts = {}) {\n const {udid, emPort} = opts;\n const adb = await helpers.createBaseADB(opts);\n adb.setDeviceId(udid);\n if (emPort) {\n adb.setEmulatorPort(emPort);\n }\n\n return adb;\n};\n\nhelpers.validatePackageActivityNames = function validatePackageActivityNames (opts) {\n for (const key of ['appPackage', 'appActivity', 'appWaitPackage', 'appWaitActivity']) {\n const name = opts[key];\n if (!name) {\n continue;\n }\n\n const match = /([^\\w.*,])+/.exec(name);\n if (!match) {\n continue;\n }\n\n logger.warn(`Capability '${key}' is expected to only include latin letters, digits, underscore, dot, comma and asterisk characters.`);\n logger.warn(`Current value '${name}' has non-matching character at index ${match.index}: '${name.substring(0, match.index + 1)}'`);\n }\n};\n\nhelpers.getLaunchInfo = async function getLaunchInfo (adb, opts) {\n let {app, appPackage, appActivity, appWaitPackage, appWaitActivity} = opts;\n if (!app) {\n logger.warn('No app sent in, not parsing package/activity');\n return;\n }\n\n this.validatePackageActivityNames(opts);\n\n if (appPackage && appActivity) {\n return;\n }\n\n logger.debug('Parsing package and activity from app manifest');\n let {apkPackage, apkActivity} =\n await adb.packageAndLaunchActivityFromManifest(app);\n if (apkPackage && !appPackage) {\n appPackage = apkPackage;\n }\n if (!appWaitPackage) {\n appWaitPackage = appPackage;\n }\n if (apkActivity && !appActivity) {\n appActivity = apkActivity;\n }\n if (!appWaitActivity) {\n appWaitActivity = appActivity;\n }\n logger.debug(`Parsed package and activity are: ${apkPackage}/${apkActivity}`);\n return {appPackage, appWaitPackage, appActivity, appWaitActivity};\n};\n\nhelpers.resetApp = async function resetApp (adb, opts = {}) {\n const {\n app,\n appPackage,\n fastReset,\n fullReset,\n androidInstallTimeout = PACKAGE_INSTALL_TIMEOUT,\n autoGrantPermissions,\n allowTestPackages\n } = opts;\n\n if (!appPackage) {\n throw new Error(\"'appPackage' option is required\");\n }\n\n const isInstalled = await adb.isAppInstalled(appPackage);\n\n if (isInstalled) {\n try {\n await adb.forceStop(appPackage);\n } catch (ign) {}\n // fullReset has priority over fastReset\n if (!fullReset && fastReset) {\n const output = await adb.clear(appPackage);\n if (_.isString(output) && output.toLowerCase().includes('failed')) {\n throw new Error(`Cannot clear the application data of '${appPackage}'. Original error: ${output}`);\n }\n // executing `shell pm clear` resets previously assigned application permissions as well\n if (autoGrantPermissions) {\n try {\n await adb.grantAllPermissions(appPackage);\n } catch (error) {\n logger.error(`Unable to grant permissions requested. Original error: ${error.message}`);\n }\n }\n logger.debug(`Performed fast reset on the installed '${appPackage}' application (stop and clear)`);\n return;\n }\n }\n\n if (!app) {\n throw new Error(`Either provide 'app' option to install '${appPackage}' or ` +\n `consider setting 'noReset' to 'true' if '${appPackage}' is supposed to be preinstalled.`);\n }\n\n logger.debug(`Running full reset on '${appPackage}' (reinstall)`);\n if (isInstalled) {\n await adb.uninstallApk(appPackage);\n }\n await adb.install(app, {\n grantPermissions: autoGrantPermissions,\n timeout: androidInstallTimeout,\n allowTestPackages,\n });\n};\n\nhelpers.installApk = async function installApk (adb, opts = {}) {\n const {\n app,\n appPackage,\n fastReset,\n fullReset,\n androidInstallTimeout = PACKAGE_INSTALL_TIMEOUT,\n autoGrantPermissions,\n allowTestPackages,\n enforceAppInstall,\n } = opts;\n\n if (!app || !appPackage) {\n throw new Error(\"'app' and 'appPackage' options are required\");\n }\n\n if (fullReset) {\n await this.resetApp(adb, opts);\n return;\n }\n\n const {\n appState,\n wasUninstalled\n } = await adb.installOrUpgrade(app, appPackage, {\n grantPermissions: autoGrantPermissions,\n timeout: androidInstallTimeout,\n allowTestPackages,\n enforceCurrentBuild: enforceAppInstall,\n });\n\n // There is no need to reset the newly installed app\n const isInstalledOverExistingApp = !wasUninstalled\n && appState !== adb.APP_INSTALL_STATE.NOT_INSTALLED;\n if (fastReset && isInstalledOverExistingApp) {\n logger.info(`Performing fast reset on '${appPackage}'`);\n await this.resetApp(adb, opts);\n }\n};\n\n/**\n * Installs an array of apks\n * @param {ADB} adb Instance of Appium ADB object\n * @param {Object} opts Opts defined in driver.js\n */\nhelpers.installOtherApks = async function installOtherApks (otherApps, adb, opts) {\n let {\n androidInstallTimeout = PACKAGE_INSTALL_TIMEOUT,\n autoGrantPermissions,\n allowTestPackages\n } = opts;\n\n // Install all of the APK's asynchronously\n await B.all(otherApps.map((otherApp) => {\n logger.debug(`Installing app: ${otherApp}`);\n return adb.installOrUpgrade(otherApp, null, {\n grantPermissions: autoGrantPermissions,\n timeout: androidInstallTimeout,\n allowTestPackages,\n });\n }));\n};\n\n/**\n * Uninstall an array of packages\n * @param {ADB} adb Instance of Appium ADB object\n * @param {Array<string>} appPackages An array of package names to uninstall. If this includes `'*'`, uninstall all of 3rd party apps\n * @param {Array<string>} filterPackages An array of packages does not uninstall when `*` is provided as `appPackages`\n */\nhelpers.uninstallOtherPackages = async function uninstallOtherPackages (adb, appPackages, filterPackages = []) {\n if (appPackages.includes('*')) {\n logger.debug('Uninstall third party packages');\n appPackages = await this.getThirdPartyPackages(adb, filterPackages);\n }\n\n logger.debug(`Uninstalling packages: ${appPackages}`);\n await B.all(appPackages.map((appPackage) => adb.uninstallApk(appPackage)));\n};\n\n/**\n * Get third party packages filtered with `filterPackages`\n * @param {ADB} adb Instance of Appium ADB object\n * @param {Array<string>} filterPackages An array of packages does not uninstall when `*` is provided as `appPackages`\n * @returns {Array<string>} An array of installed third pary packages\n */\nhelpers.getThirdPartyPackages = async function getThirdPartyPackages (adb, filterPackages = []) {\n try {\n const packagesString = await adb.shell(['pm', 'list', 'packages', '-3']);\n const appPackagesArray = packagesString.trim().replace(/package:/g, '').split(EOL);\n logger.debug(`'${appPackagesArray}' filtered with '${filterPackages}'`);\n return _.difference(appPackagesArray, filterPackages);\n } catch (err) {\n logger.warn(`Unable to get packages with 'adb shell pm list packages -3': ${err.message}`);\n return [];\n }\n};\n\nhelpers.initUnicodeKeyboard = async function initUnicodeKeyboard (adb) {\n logger.debug('Enabling Unicode keyboard support');\n\n // get the default IME so we can return back to it later if we want\n let defaultIME = await adb.defaultIME();\n\n logger.debug(`Unsetting previous IME ${defaultIME}`);\n const appiumIME = `${SETTINGS_HELPER_PKG_ID}/.UnicodeIME`;\n logger.debug(`Setting IME to '${appiumIME}'`);\n await adb.enableIME(appiumIME);\n await adb.setIME(appiumIME);\n return defaultIME;\n};\n\nhelpers.setMockLocationApp = async function setMockLocationApp (adb, app) {\n try {\n if (await adb.getApiLevel() < 23) {\n await adb.shell(['settings', 'put', 'secure', 'mock_location', '1']);\n } else {\n await adb.shell(['appops', 'set', app, 'android:mock_location', 'allow']);\n }\n } catch (err) {\n logger.warn(`Unable to set mock location for app '${app}': ${err.message}`);\n return;\n }\n try {\n let pkgIds = [];\n if (await adb.fileExists(MOCK_APP_IDS_STORE)) {\n try {\n pkgIds = JSON.parse(await adb.shell(['cat', MOCK_APP_IDS_STORE]));\n } catch (ign) {}\n }\n if (pkgIds.includes(app)) {\n return;\n }\n pkgIds.push(app);\n const tmpRoot = await tempDir.openDir();\n const srcPath = path.posix.join(tmpRoot, path.posix.basename(MOCK_APP_IDS_STORE));\n try {\n await fs.writeFile(srcPath, JSON.stringify(pkgIds), 'utf8');\n await adb.pushFile(srcPath, MOCK_APP_IDS_STORE);\n } finally {\n await fs.rimraf(tmpRoot);\n }\n } catch (e) {\n logger.warn(`Unable to persist mock location app id '${app}': ${e.message}`);\n }\n};\n\nhelpers.resetMockLocation = async function resetMockLocation (adb) {\n try {\n if (await adb.getApiLevel() < 23) {\n await adb.shell(['settings', 'put', 'secure', 'mock_location', '0']);\n return;\n }\n\n const thirdPartyPkgIdsPromise = helpers.getThirdPartyPackages(adb);\n let pkgIds = [];\n if (await adb.fileExists(MOCK_APP_IDS_STORE)) {\n try {\n pkgIds = JSON.parse(await adb.shell(['cat', MOCK_APP_IDS_STORE]));\n } catch (ign) {}\n }\n const thirdPartyPkgIds = await thirdPartyPkgIdsPromise;\n // Only include currently installed packages\n const resultPkgs = _.intersection(pkgIds, thirdPartyPkgIds);\n if (_.size(resultPkgs) <= 1) {\n await adb.shell(['appops', 'set', resultPkgs[0] ?? SETTINGS_HELPER_PKG_ID, 'android:mock_location', 'deny']);\n return;\n }\n\n logger.debug(`Resetting mock_location permission for the following apps: ${resultPkgs}`);\n await B.all(resultPkgs.map((pkgId) => (async () => {\n try {\n await adb.shell(['appops', 'set', pkgId, 'android:mock_location', 'deny']);\n } catch (ign) {}\n })()));\n } catch (err) {\n logger.warn(`Unable to reset mock location: ${err.message}`);\n }\n};\n\nhelpers.installHelperApp = async function installHelperApp (adb, apkPath, packageId) {\n // Sometimes adb push or adb instal take more time than expected to install an app\n // e.g. https://github.com/appium/io.appium.settings/issues/40#issuecomment-476593174\n await retry(2, async function retryInstallHelperApp () {\n await adb.installOrUpgrade(apkPath, packageId, {grantPermissions: true});\n });\n};\n\n/**\n * Pushes and installs io.appium.settings app.\n * Throws an error if the setting app is required\n *\n * @param {Adb} adb - The adb module instance.\n * @param {Object} opts - Driver options dictionary.\n * @param {boolean} throwError [false] - Whether throw an error if Settings app fails to start\n * @throws {Error} If throwError is true and something happens in installation step\n */\nhelpers.pushSettingsApp = async function pushSettingsApp (adb, throwError = false, opts = {}) {\n logger.debug('Pushing settings apk to device...');\n\n try {\n await helpers.installHelperApp(adb, settingsApkPath, SETTINGS_HELPER_PKG_ID, throwError);\n } catch (err) {\n if (throwError) {\n throw err;\n }\n\n logger.warn(`Ignored error while installing '${settingsApkPath}': ` +\n `'${err.message}'. Features that rely on this helper ` +\n 'require the apk such as toggle WiFi and getting location ' +\n 'will raise an error if you try to use them.');\n }\n\n // Reinstall would stop the settings helper process anyway, so\n // there is no need to continue if the application is still running\n if (await adb.processExists(SETTINGS_HELPER_PKG_ID)) {\n logger.debug(`${SETTINGS_HELPER_PKG_ID} is already running. ` +\n `There is no need to reset its permissions.`);\n return;\n }\n\n const apiLevel = await adb.getApiLevel();\n if (apiLevel >= 29) {\n // https://github.com/appium/io.appium.settings#internal-audio--video-recording\n try {\n await adb.shell(['appops', 'set', SETTINGS_HELPER_PKG_ID, 'PROJECT_MEDIA', 'allow']);\n } catch (err) {\n logger.debug(err);\n }\n }\n if (apiLevel <= 23) { // Android 6- devices should have granted permissions\n // https://github.com/appium/appium/pull/11640#issuecomment-438260477\n const perms = ['SET_ANIMATION_SCALE', 'CHANGE_CONFIGURATION', 'ACCESS_FINE_LOCATION'];\n logger.info(`Granting permissions ${perms} to '${SETTINGS_HELPER_PKG_ID}'`);\n await adb.grantPermissions(SETTINGS_HELPER_PKG_ID, perms.map((x) => `android.permission.${x}`));\n }\n\n // launch io.appium.settings app due to settings failing to be set\n // if the app is not launched prior to start the session on android 7+\n // see https://github.com/appium/appium/issues/8957\n try {\n await adb.requireRunningSettingsApp({\n timeout: helpers.isEmulator(adb, opts) ? 30000 : 5000\n });\n } catch (err) {\n logger.debug(err);\n if (throwError) {\n throw err;\n }\n }\n};\n\n/**\n * Extracts string.xml and converts it to string.json and pushes\n * it to /data/local/tmp/string.json on for use of bootstrap\n * If app is not present to extract string.xml it deletes remote strings.json\n * If app does not have strings.xml we push an empty json object to remote\n *\n * @param {?string} language - Language abbreviation, for example 'fr'. The default language\n * is used if this argument is not defined.\n * @param {Object} adb - The adb module instance.\n * @param {Object} opts - Driver options dictionary.\n * @returns {Object} The dictionary, where string resource identifiers are keys\n * along with their corresponding values for the given language or an empty object\n * if no matching resources were extracted.\n */\nhelpers.pushStrings = async function pushStrings (language, adb, opts) {\n const remoteDir = '/data/local/tmp';\n const stringsJson = 'strings.json';\n const remoteFile = path.posix.resolve(remoteDir, stringsJson);\n\n // clean up remote string.json if present\n await adb.rimraf(remoteFile);\n\n let app;\n try {\n app = opts.app || await adb.pullApk(opts.appPackage, opts.tmpDir);\n } catch (err) {\n logger.info(`Failed to pull an apk from '${opts.appPackage}' to '${opts.tmpDir}'. Original error: ${err.message}`);\n }\n\n if (_.isEmpty(opts.appPackage) || !(await fs.exists(app))) {\n logger.debug(`No app or package specified. Returning empty strings`);\n return {};\n }\n\n const stringsTmpDir = path.resolve(opts.tmpDir, opts.appPackage);\n try {\n logger.debug('Extracting strings from apk', app, language, stringsTmpDir);\n const {apkStrings, localPath} = await adb.extractStringsFromApk(app, language, stringsTmpDir);\n await adb.push(localPath, remoteDir);\n return apkStrings;\n } catch (err) {\n logger.warn(`Could not get strings, continuing anyway. Original error: ${err.message}`);\n await adb.shell('echo', [`'{}' > ${remoteFile}`]);\n } finally {\n await fs.rimraf(stringsTmpDir);\n }\n return {};\n};\n\nhelpers.unlock = async function unlock (driver, adb, capabilities) {\n if (!(await adb.isScreenLocked())) {\n logger.info('Screen already unlocked, doing nothing');\n return;\n }\n\n logger.debug('Screen is locked, trying to unlock');\n if (!capabilities.unlockType && !capabilities.unlockKey) {\n logger.info(`Neither 'unlockType' nor 'unlockKey' capability is provided. ` +\n `Assuming the device is locked with a simple lock screen.`);\n await adb.dismissKeyguard();\n return;\n }\n\n const {\n unlockType,\n unlockKey,\n unlockStrategy,\n unlockSuccessTimeout,\n } = unlocker.validateUnlockCapabilities(capabilities);\n if (unlockKey && unlockType !== FINGERPRINT_UNLOCK\n && (_.isNil(unlockStrategy) || _.toLower(unlockStrategy) === 'locksettings')\n && await adb.isLockManagementSupported()) {\n await unlocker.fastUnlock(adb, {\n credential: unlockKey,\n credentialType: toCredentialType(unlockType),\n });\n } else {\n const unlockMethod = {\n [PIN_UNLOCK]: unlocker.pinUnlock,\n [PIN_UNLOCK_KEY_EVENT]: unlocker.pinUnlockWithKeyEvent,\n [PASSWORD_UNLOCK]: unlocker.passwordUnlock,\n [PATTERN_UNLOCK]: unlocker.patternUnlock,\n [FINGERPRINT_UNLOCK]: unlocker.fingerprintUnlock,\n }[unlockType];\n await unlockMethod(adb, driver, capabilities);\n }\n await helpers.verifyUnlock(adb, unlockSuccessTimeout);\n};\n\nhelpers.verifyUnlock = async function verifyUnlock (adb, timeoutMs = null) {\n try {\n await waitForCondition(async () => !(await adb.isScreenLocked()), {\n waitMs: timeoutMs ?? 2000,\n intervalMs: 500,\n });\n } catch (ign) {\n throw new Error('The device has failed to be unlocked');\n }\n logger.info('The device has been successfully unlocked');\n};\n\nhelpers.initDevice = async function initDevice (adb, opts) {\n const {\n skipDeviceInitialization,\n locale,\n language,\n localeScript,\n unicodeKeyboard,\n disableWindowAnimation,\n skipUnlock,\n mockLocationApp,\n skipLogcatCapture,\n logcatFormat,\n logcatFilterSpecs,\n } = opts;\n\n if (skipDeviceInitialization) {\n logger.info(`'skipDeviceInitialization' is set. Skipping device initialization.`);\n } else {\n await adb.waitForDevice();\n // pushSettingsApp required before calling ensureDeviceLocale for API Level 24+\n\n // Some feature such as location/wifi are not necessary for all users,\n // but they require the settings app. So, try to configure it while Appium\n // does not throw error even if they fail.\n const shouldThrowError = language\n || locale\n || localeScript\n || unicodeKeyboard\n || disableWindowAnimation\n || !skipUnlock;\n await helpers.pushSettingsApp(adb, shouldThrowError, opts);\n }\n\n if (!helpers.isEmulator(adb, opts)) {\n if (mockLocationApp || _.isUndefined(mockLocationApp)) {\n await helpers.setMockLocationApp(adb, mockLocationApp || SETTINGS_HELPER_PKG_ID);\n } else {\n await helpers.resetMockLocation(adb);\n }\n }\n\n if (language || locale) {\n await helpers.ensureDeviceLocale(adb, language, locale, localeScript);\n }\n\n if (skipLogcatCapture) {\n logger.info(`'skipLogcatCapture' is set. Skipping starting logcat capture.`);\n } else {\n await adb.startLogcat({\n format: logcatFormat,\n filterSpecs: logcatFilterSpecs,\n });\n }\n\n if (unicodeKeyboard) {\n return await helpers.initUnicodeKeyboard(adb);\n }\n};\n\nhelpers.removeNullProperties = function removeNullProperties (obj) {\n for (let key of _.keys(obj)) {\n if (_.isNull(obj[key]) || _.isUndefined(obj[key])) {\n delete obj[key];\n }\n }\n};\n\nhelpers.truncateDecimals = function truncateDecimals (number, digits) {\n let multiplier = Math.pow(10, digits),\n adjustedNum = number * multiplier,\n truncatedNum = Math[adjustedNum < 0 ? 'ceil' : 'floor'](adjustedNum);\n\n return truncatedNum / multiplier;\n};\n\nhelpers.isChromeBrowser = function isChromeBrowser (browser) {\n return _.includes(Object.keys(CHROME_BROWSER_PACKAGE_ACTIVITY), (browser || '').toLowerCase());\n};\n\nhelpers.getChromePkg = function getChromePkg (browser) {\n return CHROME_BROWSER_PACKAGE_ACTIVITY[browser.toLowerCase()] || CHROME_BROWSER_PACKAGE_ACTIVITY.default;\n};\n\nhelpers.removeAllSessionWebSocketHandlers = async function removeAllSessionWebSocketHandlers (server, sessionId) {\n if (!server || !_.isFunction(server.getWebSocketHandlers)) {\n return;\n }\n\n const activeHandlers = await server.getWebSocketHandlers(sessionId);\n for (const pathname of _.keys(activeHandlers)) {\n await server.removeWebSocketHandler(pathname);\n }\n};\n\n/**\n * Takes a desired capability and tries to JSON.parse it as an array,\n * and either returns the parsed array or a singleton array.\n *\n * @param {any} cap A desired capability\n */\nhelpers.parseArray = function parseArray (cap) {\n let parsedCaps;\n try {\n parsedCaps = JSON.parse(cap);\n } catch (ign) { }\n\n if (_.isArray(parsedCaps)) {\n return parsedCaps;\n } else if (_.isString(cap)) {\n return [cap];\n }\n\n throw new Error(`must provide a string or JSON Array; received ${cap}`);\n};\n\n/**\n * Validate desired capabilities. Returns true if capability is valid\n *\n * @param {*} cap A desired capability\n * @return {boolean} Returns true if the capability is valid\n * @throws {Error} If the caps has invalid capability\n */\nhelpers.validateDesiredCaps = function validateDesiredCaps (caps) {\n if (caps.browserName) {\n if (caps.app) {\n // warn if the capabilities have both `app` and `browser, although this is common with selenium grid\n logger.warn(`The desired capabilities should generally not include both an 'app' and a 'browserName'`);\n }\n if (caps.appPackage) {\n logger.errorAndThrow(`The desired should not include both of an 'appPackage' and a 'browserName'`);\n }\n }\n\n if (caps.uninstallOtherPackages) {\n try {\n this.parseArray(caps.uninstallOtherPackages);\n } catch (e) {\n logger.errorAndThrow(`Could not parse \"uninstallOtherPackages\" capability: ${e.message}`);\n }\n }\n\n return true;\n};\n\n/**\n * Adjust the capabilities for a browser session\n *\n * @param {Object} caps - Current capabilities object\n * !!! The object is mutated by this method call !!!\n * @returns {Object} The same possibly mutated `opts` instance.\n * No mutation is happening is the current session if\n * appPackage/appActivity caps have already been provided.\n */\nhelpers.adjustBrowserSessionCaps = function adjustBrowserSessionCaps (caps = {}) {\n const { browserName } = caps;\n logger.info(`The current session is considered browser-based`);\n logger.info(`Supported browser names: ${JSON.stringify(_.keys(CHROME_BROWSER_PACKAGE_ACTIVITY))}`);\n if (caps.appPackage || caps.appActivity) {\n logger.info(`Not overriding appPackage/appActivity capability values for '${browserName}' ` +\n 'because some of them have been already provided');\n return caps;\n }\n\n const {pkg, activity} = this.getChromePkg(browserName);\n caps.appPackage = pkg;\n caps.appActivity = activity;\n logger.info(`appPackage/appActivity capabilities have been automatically set to ${pkg}/${activity} ` +\n `for '${browserName}'`);\n logger.info(`Consider changing the browserName to the one from the list of supported browser names ` +\n `or provide custom appPackage/appActivity capability values if the automatically assigned ones do ` +\n `not make sense`);\n return caps;\n};\n\n/**\n * Checks whether the current device under test is an emulator\n *\n * @param {ADB} adb - appium-adb instance\n * @param {Object} opts - driver options mapping\n * @returns {boolean} `true` if the device is an Android emulator\n */\nhelpers.isEmulator = function isEmulator (adb, opts) {\n const possibleNames = [opts.udid, adb?.curDeviceId];\n return !!opts.avd || possibleNames.some((x) => EMULATOR_PATTERN.test(x));\n};\n\nhelpers.bootstrap = Bootstrap;\nhelpers.unlocker = unlocker;\n\nexport { helpers, SETTINGS_HELPER_PKG_ID, APP_STATE, prepareAvdArgs, ensureNetworkSpeed };\nexport default helpers;\n"],"mappings":"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"}
@@ -201,7 +201,10 @@ class AndroidDriver extends _driver.BaseDriver {
201
201
  }
202
202
  }
203
203
  })();
204
- if (!this.opts.skipUnlock) {
204
+ if (this.opts.skipUnlock) {
205
+ this.log.info('Skipping lockscreen check');
206
+ } else {
207
+ this.log.info('Checking for lockscreen presence. ' + `This could be skipped by setting the 'appium:skipUnlock' capability to true.`);
205
208
  await _androidHelpers.helpers.unlock(this, this.adb, this.caps);
206
209
  }
207
210
  if (this.opts.ignoreUnimportantViews) {
@@ -401,4 +404,4 @@ class AndroidDriver extends _driver.BaseDriver {
401
404
  exports.AndroidDriver = AndroidDriver;
402
405
  var _default = AndroidDriver;
403
406
  exports.default = _default;
404
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBUFBfRVhURU5TSU9OIiwiREVWSUNFX1BPUlQiLCJOT19QUk9YWSIsIlJlZ0V4cCIsIkFuZHJvaWREcml2ZXIiLCJCYXNlRHJpdmVyIiwiY29uc3RydWN0b3IiLCJvcHRzIiwic2hvdWxkVmFsaWRhdGVDYXBzIiwibG9jYXRvclN0cmF0ZWdpZXMiLCJkZXNpcmVkQ2FwQ29uc3RyYWludHMiLCJkZXNpcmVkQ29uc3RyYWludHMiLCJzZXNzaW9uQ2hyb21lZHJpdmVycyIsImp3cFByb3h5QWN0aXZlIiwiandwUHJveHlBdm9pZCIsIl8iLCJjbG9uZSIsInNldHRpbmdzIiwiRGV2aWNlU2V0dGluZ3MiLCJpZ25vcmVVbmltcG9ydGFudFZpZXdzIiwib25TZXR0aW5nc1VwZGF0ZSIsImJpbmQiLCJjaHJvbWVkcml2ZXIiLCJhcGtTdHJpbmdzIiwidW5sb2NrZXIiLCJoZWxwZXJzIiwiY21kIiwiZm4iLCJ0b1BhaXJzIiwiY29tbWFuZHMiLCJwcm90b3R5cGUiLCJjdXJDb250ZXh0IiwiZGVmYXVsdENvbnRleHROYW1lIiwiY3JlYXRlU2Vzc2lvbiIsImFyZ3MiLCJzZXNzaW9uSWQiLCJjYXBzIiwic2VydmVyRGV0YWlscyIsInBsYXRmb3JtIiwid2ViU3RvcmFnZUVuYWJsZWQiLCJ0YWtlc1NjcmVlbnNob3QiLCJqYXZhc2NyaXB0RW5hYmxlZCIsImRhdGFiYXNlRW5hYmxlZCIsIm5ldHdvcmtDb25uZWN0aW9uRW5hYmxlZCIsImxvY2F0aW9uQ29udGV4dEVuYWJsZWQiLCJ3YXJuaW5ncyIsImRlc2lyZWQiLCJPYmplY3QiLCJhc3NpZ24iLCJkZWZhdWx0T3B0cyIsImFjdGlvbiIsImNhdGVnb3J5IiwiZmxhZ3MiLCJkaXNhYmxlQW5kcm9pZFdhdGNoZXJzIiwidG1wRGlyIiwidGVtcERpciIsInN0YXRpY0RpciIsImZ1bGxSZXNldCIsImF1dG9MYXVuY2giLCJhZGJQb3J0IiwiREVGQVVMVF9BREJfUE9SVCIsImJvb3RzdHJhcFBvcnQiLCJhbmRyb2lkSW5zdGFsbFRpbWVvdXQiLCJkZWZhdWx0cyIsInVzZVVubG9ja0hlbHBlckFwcCIsImlzVW5kZWZpbmVkIiwidW5sb2NrVHlwZSIsIm5vUmVzZXQiLCJmYXN0UmVzZXQiLCJza2lwVW5pbnN0YWxsIiwiaXNDaHJvbWVTZXNzaW9uIiwiYWRqdXN0QnJvd3NlclNlc3Npb25DYXBzIiwibmF0aXZlV2ViU2NyZWVuc2hvdCIsInB1c2giLCJyZWJvb3QiLCJzZXRBdmRGcm9tQ2FwYWJpbGl0aWVzIiwidWRpZCIsImVtUG9ydCIsImdldERldmljZUluZm9Gcm9tQ2FwcyIsImFkYiIsImNyZWF0ZUFEQiIsInN1cHByZXNzS2lsbFNlcnZlciIsInJlbW90ZUFkYkhvc3QiLCJjbGVhckRldmljZUxvZ3NPblN0YXJ0IiwiYWRiRXhlY1RpbWVvdXQiLCJhbGxvd09mZmxpbmVEZXZpY2VzIiwiZ2V0QXBpTGV2ZWwiLCJsb2ciLCJ3YXJuIiwiaXNQYWNrYWdlT3JCdW5kbGUiLCJhcHAiLCJhcHBQYWNrYWdlIiwiY29uZmlndXJlQXBwIiwiY2hlY2tBcHBQcmVzZW50IiwiYXBwT25EZXZpY2UiLCJpbmZvIiwiY2hlY2tQYWNrYWdlUHJlc2VudCIsInV0aWwiLCJoYXNWYWx1ZSIsIm5ldHdvcmtTcGVlZCIsImlzRW11bGF0b3IiLCJlbnN1cmVOZXR3b3JrU3BlZWQiLCJncHNFbmFibGVkIiwidG9nZ2xlR1BTTG9jYXRpb25Qcm92aWRlciIsInN0YXJ0QW5kcm9pZFNlc3Npb24iLCJlIiwiZGVsZXRlU2Vzc2lvbiIsImlnbiIsImF2ZCIsImRldmljZU5hbWUiLCJlcnJvckFuZFRocm93IiwicGxhdGZvcm1WZXJzaW9uIiwiYXZkRGV2aWNlIiwicmVwbGFjZSIsImlzQ2hyb21lQnJvd3NlciIsImJyb3dzZXJOYW1lIiwia2V5IiwidmFsdWUiLCJzZXRDb21wcmVzc2VkTGF5b3V0SGllcmFyY2h5IiwiZGVmYXVsdElNRSIsImluaXREZXZpY2UiLCJjdXJEZXZpY2VJZCIsImRldmljZVVESUQiLCJnZXRQbGF0Zm9ybVZlcnNpb24iLCJkZXZpY2VTY3JlZW5TaXplIiwiZ2V0U2NyZWVuU2l6ZSIsImRldmljZU1vZGVsIiwiZ2V0TW9kZWwiLCJkZXZpY2VNYW51ZmFjdHVyZXIiLCJnZXRNYW51ZmFjdHVyZXIiLCJkaXNhYmxlV2luZG93QW5pbWF0aW9uIiwiaXNBbmltYXRpb25PbiIsInNldEhpZGRlbkFwaVBvbGljeSIsImlnbm9yZUhpZGRlbkFwaVBvbGljeUVycm9yIiwic2V0QW5pbWF0aW9uU3RhdGUiLCJfd2FzV2luZG93QW5pbWF0aW9uRGlzYWJsZWQiLCJpbml0QVVUIiwiYm9vdHN0cmFwIiwid2Vic29ja2V0Iiwic3RhcnQiLCJhY2NlcHRTc2xDZXJ0cyIsIm9uVW5leHBlY3RlZFNodXRkb3duIiwiZXJyIiwiaWdub3JlVW5leHBlY3RlZFNodXRkb3duIiwic3RhcnRVbmV4cGVjdGVkU2h1dGRvd24iLCJza2lwVW5sb2NrIiwidW5sb2NrIiwidXBkYXRlIiwic3RhcnRDaHJvbWVTZXNzaW9uIiwic3RhcnRBVVQiLCJvcmllbnRhdGlvbiIsImRlYnVnIiwic2V0T3JpZW50YXRpb24iLCJpbml0QXV0b1dlYnZpZXciLCJhdXRvV2VidmlldyIsInZpZXdOYW1lIiwiZGVmYXVsdFdlYnZpZXdOYW1lIiwidGltZW91dCIsImF1dG9XZWJ2aWV3VGltZW91dCIsInJldHJ5SW50ZXJ2YWwiLCJzZXRDb250ZXh0IiwibGF1bmNoSW5mbyIsImdldExhdW5jaEluZm8iLCJ1bmluc3RhbGxPdGhlclBhY2thZ2VzIiwidmFsaWRhdGVEZXNpcmVkQ2FwcyIsInBhcnNlQXJyYXkiLCJTRVRUSU5HU19IRUxQRVJfUEtHX0lEIiwib3RoZXJBcHBzIiwibWVzc2FnZSIsIkIiLCJhbGwiLCJtYXAiLCJpbnN0YWxsT3RoZXJBcGtzIiwicmVzZXRBcHAiLCJ1bmluc3RhbGxBcGsiLCJpbnN0YWxsQXBrIiwiYXBrU3RyaW5nc0Zvckxhbmd1YWdlIiwicHVzaFN0cmluZ3MiLCJsYW5ndWFnZSIsInNoYXJlZFByZWZlcmVuY2VzIiwic2V0U2hhcmVkUHJlZmVyZW5jZXMiLCJmcyIsImV4aXN0cyIsInNoZWxsIiwiY29tcHJlc3MiLCJzZW5kQWN0aW9uIiwiY29tcHJlc3NMYXlvdXQiLCJpc0VtcHR5IiwiX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMiLCJzdG9wUmVjb3JkaW5nU2NyZWVuIiwicmVtb3ZlQWxsU2Vzc2lvbldlYlNvY2tldEhhbmRsZXJzIiwic2VydmVyIiwibW9iaWxlU3RvcFNjcmVlblN0cmVhbWluZyIsInN0b3BDaHJvbWVkcml2ZXJQcm94aWVzIiwidW5pY29kZUtleWJvYXJkIiwicmVzZXRLZXlib2FyZCIsInNldElNRSIsImRvbnRTdG9wQXBwT25SZXNldCIsImZvcmNlU3RvcCIsImdvVG9Ib21lIiwic2h1dGRvd24iLCJzdG9wTG9nY2F0Iiwic2V0RGVmYXVsdEhpZGRlbkFwaVBvbGljeSIsImF2ZE5hbWUiLCJraWxsRW11bGF0b3IiLCJzaGFyZWRQcmVmcyIsIm5hbWUiLCJKU09OIiwic3RyaW5naWZ5IiwicmVtb3RlUGF0aCIsInJlbW90ZUZpbGUiLCJsb2NhbFBhdGgiLCJidWlsZGVyIiwiZ2V0UHJlZnNCdWlsZGVyIiwiYnVpbGQiLCJwcmVmcyIsInRvRmlsZSIsInVubGluayIsIlNoYXJlZFByZWZzQnVpbGRlciIsInByb3h5QWN0aXZlIiwiZ2V0UHJveHlBdm9pZExpc3QiLCJjYW5Qcm94eSIsImlzRnVuY3Rpb24iLCJwcm94eVJlcVJlcyJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9kcml2ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZURyaXZlciwgRGV2aWNlU2V0dGluZ3MgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcbmltcG9ydCBkZXNpcmVkQ29uc3RyYWludHMgZnJvbSAnLi9kZXNpcmVkLWNhcHMnO1xuaW1wb3J0IGNvbW1hbmRzIGZyb20gJy4vY29tbWFuZHMvaW5kZXgnO1xuaW1wb3J0IHtcbiAgaGVscGVycywgZW5zdXJlTmV0d29ya1NwZWVkLFxuICBTRVRUSU5HU19IRUxQRVJfUEtHX0lELFxufSBmcm9tICcuL2FuZHJvaWQtaGVscGVycyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgREVGQVVMVF9BREJfUE9SVCB9IGZyb20gJ2FwcGl1bS1hZGInO1xuaW1wb3J0IHsgZnMsIHRlbXBEaXIsIHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgcmV0cnlJbnRlcnZhbCB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IFNoYXJlZFByZWZzQnVpbGRlciB9IGZyb20gJ3NoYXJlZC1wcmVmZXJlbmNlcy1idWlsZGVyJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcblxuY29uc3QgQVBQX0VYVEVOU0lPTiA9ICcuYXBrJztcbmNvbnN0IERFVklDRV9QT1JUID0gNDcyNDtcblxuLy8gVGhpcyBpcyBhIHNldCBvZiBtZXRob2RzIGFuZCBwYXRocyB0aGF0IHdlIG5ldmVyIHdhbnQgdG8gcHJveHkgdG9cbi8vIENocm9tZWRyaXZlclxuY29uc3QgTk9fUFJPWFkgPSBbXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy90b3VjaC9wZXJmb3JtJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdG91Y2gvbXVsdGkvcGVyZm9ybScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL29yaWVudGF0aW9uJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9vcmllbnRhdGlvbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlL3N5bmMnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL25ldHdvcmtfY29ubmVjdGlvbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL25ldHdvcmtfY29ubmVjdGlvbicpXSxcbl07XG5cbmNsYXNzIEFuZHJvaWREcml2ZXIgZXh0ZW5kcyBCYXNlRHJpdmVyIHtcbiAgY29uc3RydWN0b3IgKG9wdHMgPSB7fSwgc2hvdWxkVmFsaWRhdGVDYXBzID0gdHJ1ZSkge1xuICAgIHN1cGVyKG9wdHMsIHNob3VsZFZhbGlkYXRlQ2Fwcyk7XG5cbiAgICB0aGlzLmxvY2F0b3JTdHJhdGVnaWVzID0gW1xuICAgICAgJ3hwYXRoJyxcbiAgICAgICdpZCcsXG4gICAgICAnY2xhc3MgbmFtZScsXG4gICAgICAnYWNjZXNzaWJpbGl0eSBpZCcsXG4gICAgICAnLWFuZHJvaWQgdWlhdXRvbWF0b3InXG4gICAgXTtcbiAgICB0aGlzLmRlc2lyZWRDYXBDb25zdHJhaW50cyA9IGRlc2lyZWRDb25zdHJhaW50cztcbiAgICB0aGlzLnNlc3Npb25DaHJvbWVkcml2ZXJzID0ge307XG4gICAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuandwUHJveHlBdm9pZCA9IF8uY2xvbmUoTk9fUFJPWFkpO1xuICAgIHRoaXMuc2V0dGluZ3MgPSBuZXcgRGV2aWNlU2V0dGluZ3Moe2lnbm9yZVVuaW1wb3J0YW50Vmlld3M6IGZhbHNlfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25TZXR0aW5nc1VwZGF0ZS5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLmNocm9tZWRyaXZlciA9IG51bGw7XG4gICAgdGhpcy5hcGtTdHJpbmdzID0ge307XG4gICAgdGhpcy51bmxvY2tlciA9IGhlbHBlcnMudW5sb2NrZXI7XG5cbiAgICBmb3IgKGxldCBbY21kLCBmbl0gb2YgXy50b1BhaXJzKGNvbW1hbmRzKSkge1xuICAgICAgQW5kcm9pZERyaXZlci5wcm90b3R5cGVbY21kXSA9IGZuO1xuICAgIH1cblxuICAgIC8vIG5lZWRzIHRvIGJlIGFmdGVyIHRoZSBsaW5lIHdoaWNoIGFzc2lnbnMgY29tbWFuZHMgdG8gQW5kcm9pZERyaXZlci5wcm90b3R5cGUsIHNvIHRoYXQgYHRoaXMuZGVmYXVsdENvbnRleHROYW1lYCBpcyBkZWZpbmVkLlxuICAgIHRoaXMuY3VyQ29udGV4dCA9IHRoaXMuZGVmYXVsdENvbnRleHROYW1lKCk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVTZXNzaW9uICguLi5hcmdzKSB7XG4gICAgLy8gdGhlIHdob2xlIGNyZWF0ZVNlc3Npb24gZmxvdyBpcyBzdXJyb3VuZGVkIGluIGEgdHJ5LWNhdGNoIHN0YXRlbWVudFxuICAgIC8vIGlmIGNyZWF0aW5nIGEgc2Vzc2lvbiBmYWlscyBhdCBhbnkgcG9pbnQsIHdlIHRlYXJkb3duIGV2ZXJ5dGhpbmcgd2VcbiAgICAvLyBzZXQgdXAgYmVmb3JlIHRocm93aW5nIHRoZSBlcnJvci5cbiAgICB0cnkge1xuICAgICAgbGV0IFtzZXNzaW9uSWQsIGNhcHNdID0gYXdhaXQgc3VwZXIuY3JlYXRlU2Vzc2lvbiguLi5hcmdzKTtcblxuICAgICAgbGV0IHNlcnZlckRldGFpbHMgPSB7XG4gICAgICAgIHBsYXRmb3JtOiAnTElOVVgnLFxuICAgICAgICB3ZWJTdG9yYWdlRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHRha2VzU2NyZWVuc2hvdDogdHJ1ZSxcbiAgICAgICAgamF2YXNjcmlwdEVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGRhdGFiYXNlRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIG5ldHdvcmtDb25uZWN0aW9uRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgbG9jYXRpb25Db250ZXh0RW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHdhcm5pbmdzOiB7fSxcbiAgICAgICAgZGVzaXJlZDogdGhpcy5jYXBzXG4gICAgICB9O1xuXG4gICAgICB0aGlzLmNhcHMgPSBPYmplY3QuYXNzaWduKHNlcnZlckRldGFpbHMsIHRoaXMuY2Fwcyk7XG5cbiAgICAgIC8vIGFzc2lnbmluZyBkZWZhdWx0c1xuICAgICAgbGV0IGRlZmF1bHRPcHRzID0ge1xuICAgICAgICBhY3Rpb246ICdhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTicsXG4gICAgICAgIGNhdGVnb3J5OiAnYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVInLFxuICAgICAgICBmbGFnczogJzB4MTAyMDAwMDAnLFxuICAgICAgICBkaXNhYmxlQW5kcm9pZFdhdGNoZXJzOiBmYWxzZSxcbiAgICAgICAgdG1wRGlyOiBhd2FpdCB0ZW1wRGlyLnN0YXRpY0RpcigpLFxuICAgICAgICBmdWxsUmVzZXQ6IGZhbHNlLFxuICAgICAgICBhdXRvTGF1bmNoOiB0cnVlLFxuICAgICAgICBhZGJQb3J0OiBERUZBVUxUX0FEQl9QT1JULFxuICAgICAgICBib290c3RyYXBQb3J0OiBERVZJQ0VfUE9SVCxcbiAgICAgICAgYW5kcm9pZEluc3RhbGxUaW1lb3V0OiA5MDAwMCxcbiAgICAgIH07XG4gICAgICBfLmRlZmF1bHRzKHRoaXMub3B0cywgZGVmYXVsdE9wdHMpO1xuICAgICAgdGhpcy51c2VVbmxvY2tIZWxwZXJBcHAgPSBfLmlzVW5kZWZpbmVkKHRoaXMuY2Fwcy51bmxvY2tUeXBlKTtcblxuICAgICAgLy8gbm90IHVzZXIgdmlzaWJsZSB2aWEgY2Fwc1xuICAgICAgaWYgKHRoaXMub3B0cy5ub1Jlc2V0ID09PSB0cnVlKSB7XG4gICAgICAgIHRoaXMub3B0cy5mdWxsUmVzZXQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm9wdHMuZnVsbFJlc2V0ID09PSB0cnVlKSB7XG4gICAgICAgIHRoaXMub3B0cy5ub1Jlc2V0ID0gZmFsc2U7XG4gICAgICB9XG4gICAgICB0aGlzLm9wdHMuZmFzdFJlc2V0ID0gIXRoaXMub3B0cy5mdWxsUmVzZXQgJiYgIXRoaXMub3B0cy5ub1Jlc2V0O1xuICAgICAgdGhpcy5vcHRzLnNraXBVbmluc3RhbGwgPSB0aGlzLm9wdHMuZmFzdFJlc2V0IHx8IHRoaXMub3B0cy5ub1Jlc2V0O1xuXG4gICAgICBpZiAodGhpcy5pc0Nocm9tZVNlc3Npb24pIHtcbiAgICAgICAgaGVscGVycy5hZGp1c3RCcm93c2VyU2Vzc2lvbkNhcHModGhpcy5vcHRzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3B0cy5uYXRpdmVXZWJTY3JlZW5zaG90KSB7XG4gICAgICAgIHRoaXMuandwUHJveHlBdm9pZC5wdXNoKFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3NjcmVlbnNob3QnKV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRzLnJlYm9vdCkge1xuICAgICAgICB0aGlzLnNldEF2ZEZyb21DYXBhYmlsaXRpZXMoY2Fwcyk7XG4gICAgICB9XG5cbiAgICAgIC8vIGdldCBkZXZpY2UgdWRpZCBmb3IgdGhpcyBzZXNzaW9uXG4gICAgICBsZXQge3VkaWQsIGVtUG9ydH0gPSBhd2FpdCBoZWxwZXJzLmdldERldmljZUluZm9Gcm9tQ2Fwcyh0aGlzLm9wdHMpO1xuICAgICAgdGhpcy5vcHRzLnVkaWQgPSB1ZGlkO1xuICAgICAgdGhpcy5vcHRzLmVtUG9ydCA9IGVtUG9ydDtcblxuICAgICAgLy8gc2V0IHVwIGFuIGluc3RhbmNlIG9mIEFEQlxuICAgICAgdGhpcy5hZGIgPSBhd2FpdCBoZWxwZXJzLmNyZWF0ZUFEQih7XG4gICAgICAgIHVkaWQ6IHRoaXMub3B0cy51ZGlkLFxuICAgICAgICBlbVBvcnQ6IHRoaXMub3B0cy5lbVBvcnQsXG4gICAgICAgIGFkYlBvcnQ6IHRoaXMub3B0cy5hZGJQb3J0LFxuICAgICAgICBzdXBwcmVzc0tpbGxTZXJ2ZXI6IHRoaXMub3B0cy5zdXBwcmVzc0tpbGxTZXJ2ZXIsXG4gICAgICAgIHJlbW90ZUFkYkhvc3Q6IHRoaXMub3B0cy5yZW1vdGVBZGJIb3N0LFxuICAgICAgICBjbGVhckRldmljZUxvZ3NPblN0YXJ0OiB0aGlzLm9wdHMuY2xlYXJEZXZpY2VMb2dzT25TdGFydCxcbiAgICAgICAgYWRiRXhlY1RpbWVvdXQ6IHRoaXMub3B0cy5hZGJFeGVjVGltZW91dCxcbiAgICAgICAgYWxsb3dPZmZsaW5lRGV2aWNlczogdGhpcy5vcHRzLmFsbG93T2ZmbGluZURldmljZXMsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPj0gMjMpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihcIkNvbnNpZGVyIHNldHRpbmcgJ2F1dG9tYXRpb25OYW1lJyBjYXBhYmlsaXR5IHRvIFwiICtcbiAgICAgICAgICBcIid1aWF1dG9tYXRvcjInIG9uIEFuZHJvaWQgPj0gNiwgc2luY2UgVUlBdXRvbWF0b3IgZnJhbWV3b3JrIFwiICtcbiAgICAgICAgICAnaXMgbm90IG1haW50YWluZWQgYW55bW9yZSBieSB0aGUgT1MgdmVuZG9yLicpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5oZWxwZXJzLmlzUGFja2FnZU9yQnVuZGxlKHRoaXMub3B0cy5hcHApKSB7XG4gICAgICAgIC8vIHVzZXIgcHJvdmlkZWQgcGFja2FnZSBpbnN0ZWFkIG9mIGFwcCBmb3IgJ2FwcCcgY2FwYWJpbGl0eSwgbWFzc2FnZSBvcHRpb25zXG4gICAgICAgIHRoaXMub3B0cy5hcHBQYWNrYWdlID0gdGhpcy5vcHRzLmFwcDtcbiAgICAgICAgdGhpcy5vcHRzLmFwcCA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9wdHMuYXBwKSB7XG4gICAgICAgIC8vIGZpbmQgYW5kIGNvcHksIG9yIGRvd25sb2FkIGFuZCB1bnppcCBhbiBhcHAgdXJsIG9yIHBhdGhcbiAgICAgICAgdGhpcy5vcHRzLmFwcCA9IGF3YWl0IHRoaXMuaGVscGVycy5jb25maWd1cmVBcHAodGhpcy5vcHRzLmFwcCwgQVBQX0VYVEVOU0lPTik7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tBcHBQcmVzZW50KCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuYXBwT25EZXZpY2UpIHtcbiAgICAgICAgLy8gdGhlIGFwcCBpc24ndCBhbiBhY3R1YWwgYXBwIGZpbGUgYnV0IHJhdGhlciBzb21ldGhpbmcgd2Ugd2FudCB0b1xuICAgICAgICAvLyBhc3N1bWUgaXMgb24gdGhlIGRldmljZSBhbmQganVzdCBsYXVuY2ggdmlhIHRoZSBhcHBQYWNrYWdlXG4gICAgICAgIHRoaXMubG9nLmluZm8oYEFwcCBmaWxlIHdhcyBub3QgbGlzdGVkLCBpbnN0ZWFkIHdlJ3JlIGdvaW5nIHRvIHJ1biBgICtcbiAgICAgICAgICBgJHt0aGlzLm9wdHMuYXBwUGFja2FnZX0gZGlyZWN0bHkgb24gdGhlIGRldmljZWApO1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrUGFja2FnZVByZXNlbnQoKTtcbiAgICAgIH1cblxuICAgICAgLy8gU29tZSBjbG91ZCBzZXJ2aWNlcyB1c2luZyBhcHBpdW0gbGF1bmNoIHRoZSBhdmQgdGhlbXNlbHZlcywgc28gd2UgZW5zdXJlIG5ldHNwZWVkXG4gICAgICAvLyBpcyBzZXQgZm9yIGVtdWxhdG9ycyBieSBjYWxsaW5nIGFkYi5uZXR3b3JrU3BlZWQgYmVmb3JlIHJ1bm5pbmcgdGhlIGFwcFxuICAgICAgaWYgKHV0aWwuaGFzVmFsdWUodGhpcy5vcHRzLm5ldHdvcmtTcGVlZCkpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRW11bGF0b3IoKSkge1xuICAgICAgICAgIHRoaXMubG9nLndhcm4oJ1NvcnJ5LCBuZXR3b3JrU3BlZWQgY2FwYWJpbGl0eSBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgbmV0d29ya1NwZWVkID0gZW5zdXJlTmV0d29ya1NwZWVkKHRoaXMuYWRiLCB0aGlzLm9wdHMubmV0d29ya1NwZWVkKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkYi5uZXR3b3JrU3BlZWQobmV0d29ya1NwZWVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gY2hlY2sgaWYgd2UgaGF2ZSB0byBlbmFibGUvZGlzYWJsZSBncHMgYmVmb3JlIHJ1bm5pbmcgdGhlIGFwcGxpY2F0aW9uXG4gICAgICBpZiAodXRpbC5oYXNWYWx1ZSh0aGlzLm9wdHMuZ3BzRW5hYmxlZCkpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNFbXVsYXRvcigpKSB7XG4gICAgICAgICAgdGhpcy5sb2cuaW5mbyhgVHJ5aW5nIHRvICR7dGhpcy5vcHRzLmdwc0VuYWJsZWQgPyAnZW5hYmxlJyA6ICdkaXNhYmxlJ30gZ3BzIGxvY2F0aW9uIHByb3ZpZGVyYCk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5hZGIudG9nZ2xlR1BTTG9jYXRpb25Qcm92aWRlcih0aGlzLm9wdHMuZ3BzRW5hYmxlZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5sb2cud2FybignU29ycnkhIGdwc0VuYWJsZWQgY2FwYWJpbGl0eSBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5zdGFydEFuZHJvaWRTZXNzaW9uKHRoaXMub3B0cyk7XG4gICAgICByZXR1cm4gW3Nlc3Npb25JZCwgdGhpcy5jYXBzXTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBpZ25vcmluZyBkZWxldGUgc2Vzc2lvbiBleGNlcHRpb24gaWYgYW55IGFuZCB0aHJvdyB0aGUgcmVhbCBlcnJvclxuICAgICAgLy8gdGhhdCBoYXBwZW5lZCB3aGlsZSBjcmVhdGluZyB0aGUgc2Vzc2lvbi5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlU2Vzc2lvbigpO1xuICAgICAgfSBjYXRjaCAoaWduKSB7fVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICBpc0VtdWxhdG9yICgpIHtcbiAgICByZXR1cm4gaGVscGVycy5pc0VtdWxhdG9yKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICB9XG5cbiAgc2V0QXZkRnJvbUNhcGFiaWxpdGllcyAoY2Fwcykge1xuICAgIGlmICh0aGlzLm9wdHMuYXZkKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdhdmQgbmFtZSBkZWZpbmVkLCBpZ25vcmluZyBkZXZpY2UgbmFtZSBhbmQgcGxhdGZvcm0gdmVyc2lvbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWNhcHMuZGV2aWNlTmFtZSkge1xuICAgICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdhdmQgb3IgZGV2aWNlTmFtZSBzaG91bGQgYmUgc3BlY2lmaWVkIHdoZW4gcmVib290IG9wdGlvbiBpcyBlbmFibGVzJyk7XG4gICAgICB9XG4gICAgICBpZiAoIWNhcHMucGxhdGZvcm1WZXJzaW9uKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ2F2ZCBvciBwbGF0Zm9ybVZlcnNpb24gc2hvdWxkIGJlIHNwZWNpZmllZCB3aGVuIHJlYm9vdCBvcHRpb24gaXMgZW5hYmxlZCcpO1xuICAgICAgfVxuICAgICAgbGV0IGF2ZERldmljZSA9IGNhcHMuZGV2aWNlTmFtZS5yZXBsYWNlKC9bXmEtekEtWjAtOV8uXS9nLCAnLScpO1xuICAgICAgdGhpcy5vcHRzLmF2ZCA9IGAke2F2ZERldmljZX1fXyR7Y2Fwcy5wbGF0Zm9ybVZlcnNpb259YDtcbiAgICB9XG4gIH1cblxuICBnZXQgYXBwT25EZXZpY2UgKCkge1xuICAgIHJldHVybiB0aGlzLmhlbHBlcnMuaXNQYWNrYWdlT3JCdW5kbGUodGhpcy5vcHRzLmFwcCkgfHwgKCF0aGlzLm9wdHMuYXBwICYmXG4gICAgICAgICAgIHRoaXMuaGVscGVycy5pc1BhY2thZ2VPckJ1bmRsZSh0aGlzLm9wdHMuYXBwUGFja2FnZSkpO1xuICB9XG5cbiAgZ2V0IGlzQ2hyb21lU2Vzc2lvbiAoKSB7XG4gICAgcmV0dXJuIGhlbHBlcnMuaXNDaHJvbWVCcm93c2VyKHRoaXMub3B0cy5icm93c2VyTmFtZSk7XG4gIH1cblxuICBhc3luYyBvblNldHRpbmdzVXBkYXRlIChrZXksIHZhbHVlKSB7XG4gICAgaWYgKGtleSA9PT0gJ2lnbm9yZVVuaW1wb3J0YW50Vmlld3MnKSB7XG4gICAgICBhd2FpdCB0aGlzLnNldENvbXByZXNzZWRMYXlvdXRIaWVyYXJjaHkodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0YXJ0QW5kcm9pZFNlc3Npb24gKCkge1xuICAgIHRoaXMubG9nLmluZm8oYFN0YXJ0aW5nIEFuZHJvaWQgc2Vzc2lvbmApO1xuICAgIC8vIHNldCB1cCB0aGUgZGV2aWNlIHRvIHJ1biBvbiAocmVhbCBvciBlbXVsYXRvciwgZXRjKVxuICAgIHRoaXMuZGVmYXVsdElNRSA9IGF3YWl0IGhlbHBlcnMuaW5pdERldmljZSh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcblxuICAgIC8vIHNldCBhY3R1YWwgZGV2aWNlIG5hbWUsIHVkaWQsIHBsYXRmb3JtIHZlcnNpb24sIHNjcmVlbiBzaXplLCBtb2RlbCBhbmQgbWFudWZhY3R1cmVyIGRldGFpbHMuXG4gICAgdGhpcy5jYXBzLmRldmljZU5hbWUgPSB0aGlzLmFkYi5jdXJEZXZpY2VJZDtcbiAgICB0aGlzLmNhcHMuZGV2aWNlVURJRCA9IHRoaXMub3B0cy51ZGlkO1xuICAgIHRoaXMuY2Fwcy5wbGF0Zm9ybVZlcnNpb24gPSBhd2FpdCB0aGlzLmFkYi5nZXRQbGF0Zm9ybVZlcnNpb24oKTtcbiAgICB0aGlzLmNhcHMuZGV2aWNlU2NyZWVuU2l6ZSA9IGF3YWl0IHRoaXMuYWRiLmdldFNjcmVlblNpemUoKTtcbiAgICB0aGlzLmNhcHMuZGV2aWNlTW9kZWwgPSBhd2FpdCB0aGlzLmFkYi5nZXRNb2RlbCgpO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VNYW51ZmFjdHVyZXIgPSBhd2FpdCB0aGlzLmFkYi5nZXRNYW51ZmFjdHVyZXIoKTtcblxuICAgIGlmICh0aGlzLm9wdHMuZGlzYWJsZVdpbmRvd0FuaW1hdGlvbikge1xuICAgICAgaWYgKGF3YWl0IHRoaXMuYWRiLmlzQW5pbWF0aW9uT24oKSkge1xuICAgICAgICBpZiAoYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKSA+PSAyOCkgeyAvLyBBUEkgbGV2ZWwgMjggaXMgQW5kcm9pZCBQXG4gICAgICAgICAgLy8gRG9uJ3QgZm9yZ2V0IHRvIHJlc2V0IHRoZSByZWxheGluZyBpbiBkZWxldGUgc2Vzc2lvblxuICAgICAgICAgIHRoaXMubG9nLndhcm4oJ1JlbGF4aW5nIGhpZGRlbiBhcGkgcG9saWN5IHRvIG1hbmFnZSBhbmltYXRpb24gc2NhbGUnKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkYi5zZXRIaWRkZW5BcGlQb2xpY3koJzEnLCAhIXRoaXMub3B0cy5pZ25vcmVIaWRkZW5BcGlQb2xpY3lFcnJvcik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvZy5pbmZvKCdEaXNhYmxpbmcgd2luZG93IGFuaW1hdGlvbiBhcyBpdCBpcyByZXF1ZXN0ZWQgYnkgXCJkaXNhYmxlV2luZG93QW5pbWF0aW9uXCIgY2FwYWJpbGl0eScpO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5zZXRBbmltYXRpb25TdGF0ZShmYWxzZSk7XG4gICAgICAgIHRoaXMuX3dhc1dpbmRvd0FuaW1hdGlvbkRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oJ1dpbmRvdyBhbmltYXRpb24gaXMgYWxyZWFkeSBkaXNhYmxlZCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNldCB1cCBhcHAgdW5kZXIgdGVzdFxuICAgIGF3YWl0IHRoaXMuaW5pdEFVVCgpO1xuXG4gICAgLy8gc3RhcnQgVWlBdXRvbWF0b3JcbiAgICB0aGlzLmJvb3RzdHJhcCA9IG5ldyBoZWxwZXJzLmJvb3RzdHJhcCh0aGlzLmFkYiwgdGhpcy5vcHRzLmJvb3RzdHJhcFBvcnQsIHRoaXMub3B0cy53ZWJzb2NrZXQpO1xuICAgIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnN0YXJ0KHRoaXMub3B0cy5hcHBQYWNrYWdlLCB0aGlzLm9wdHMuZGlzYWJsZUFuZHJvaWRXYXRjaGVycywgdGhpcy5vcHRzLmFjY2VwdFNzbENlcnRzKTtcbiAgICAvLyBoYW5kbGluZyB1bmV4cGVjdGVkIHNodXRkb3duXG4gICAgKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYm9vdHN0cmFwLm9uVW5leHBlY3RlZFNodXRkb3duO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmICghdGhpcy5ib290c3RyYXAuaWdub3JlVW5leHBlY3RlZFNodXRkb3duKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5zdGFydFVuZXhwZWN0ZWRTaHV0ZG93bihlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkoKTtcblxuXG4gICAgaWYgKCF0aGlzLm9wdHMuc2tpcFVubG9jaykge1xuICAgICAgLy8gTGV0J3MgdHJ5IHRvIHVubG9jayB0aGUgZGV2aWNlXG4gICAgICBhd2FpdCBoZWxwZXJzLnVubG9jayh0aGlzLCB0aGlzLmFkYiwgdGhpcy5jYXBzKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgQ29tcHJlc3NlZExheW91dEhpZXJhcmNoeSBvbiB0aGUgZGV2aWNlIGJhc2VkIG9uIGN1cnJlbnQgc2V0dGluZ3Mgb2JqZWN0XG4gICAgLy8gdGhpcyBoYXMgdG8gaGFwcGVuIF9hZnRlcl8gYm9vdHN0cmFwIGlzIGluaXRpYWxpemVkXG4gICAgaWYgKHRoaXMub3B0cy5pZ25vcmVVbmltcG9ydGFudFZpZXdzKSB7XG4gICAgICBhd2FpdCB0aGlzLnNldHRpbmdzLnVwZGF0ZSh7aWdub3JlVW5pbXBvcnRhbnRWaWV3czogdGhpcy5vcHRzLmlnbm9yZVVuaW1wb3J0YW50Vmlld3N9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0Nocm9tZVNlc3Npb24pIHtcbiAgICAgIC8vIHN0YXJ0IGEgY2hyb21lZHJpdmVyIHNlc3Npb24gYW5kIHByb3h5IHRvIGl0XG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0Q2hyb21lU2Vzc2lvbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5vcHRzLmF1dG9MYXVuY2gpIHtcbiAgICAgICAgLy8gc3RhcnQgYXBwXG4gICAgICAgIGF3YWl0IHRoaXMuc3RhcnRBVVQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodXRpbC5oYXNWYWx1ZSh0aGlzLm9wdHMub3JpZW50YXRpb24pKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBpbml0aWFsIG9yaWVudGF0aW9uIHRvICcke3RoaXMub3B0cy5vcmllbnRhdGlvbn0nYCk7XG4gICAgICBhd2FpdCB0aGlzLnNldE9yaWVudGF0aW9uKHRoaXMub3B0cy5vcmllbnRhdGlvbik7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5pbml0QXV0b1dlYnZpZXcoKTtcbiAgfVxuXG4gIGFzeW5jIGluaXRBdXRvV2VidmlldyAoKSB7XG4gICAgaWYgKHRoaXMub3B0cy5hdXRvV2Vidmlldykge1xuICAgICAgbGV0IHZpZXdOYW1lID0gdGhpcy5kZWZhdWx0V2Vidmlld05hbWUoKTtcbiAgICAgIGxldCB0aW1lb3V0ID0gKHRoaXMub3B0cy5hdXRvV2Vidmlld1RpbWVvdXQpIHx8IDIwMDA7XG5cbiAgICAgIHRoaXMubG9nLmluZm8oYFNldHRpbmcgYXV0byB3ZWJ2aWV3IHRvIGNvbnRleHQgJyR7dmlld05hbWV9JyB3aXRoIHRpbWVvdXQgJHt0aW1lb3V0fW1zYCk7XG5cbiAgICAgIC8vIHRyeSBldmVyeSA1MDBtcyB1bnRpbCB0aW1lb3V0IGlzIG92ZXJcbiAgICAgIGF3YWl0IHJldHJ5SW50ZXJ2YWwodGltZW91dCAvIDUwMCwgNTAwLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0Q29udGV4dCh2aWV3TmFtZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBpbml0QVVUICgpIHtcbiAgICAvLyBwb3B1bGF0ZSBhcHBQYWNrYWdlLCBhcHBBY3Rpdml0eSwgYXBwV2FpdFBhY2thZ2UsIGFwcFdhaXRBY3Rpdml0eSxcbiAgICAvLyBhbmQgdGhlIGRldmljZSBiZWluZyB1c2VkXG4gICAgLy8gaW4gdGhlIG9wdHMgYW5kIGNhcHMgKHNvIGl0IGdldHMgYmFjayB0byB0aGUgdXNlciBvbiBzZXNzaW9uIGNyZWF0aW9uKVxuICAgIGxldCBsYXVuY2hJbmZvID0gYXdhaXQgaGVscGVycy5nZXRMYXVuY2hJbmZvKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5vcHRzLCBsYXVuY2hJbmZvKTtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMuY2FwcywgbGF1bmNoSW5mbyk7XG5cbiAgICAvLyBVbmluc3RhbGwgYW55IHVuaW5zdGFsbE90aGVyUGFja2FnZXMgd2hpY2ggd2VyZSBzcGVjaWZpZWQgaW4gY2Fwc1xuICAgIGlmICh0aGlzLm9wdHMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcykge1xuICAgICAgaGVscGVycy52YWxpZGF0ZURlc2lyZWRDYXBzKHRoaXMub3B0cyk7XG4gICAgICAvLyBPbmx5IFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQgcGFja2FnZSBpcyB1c2VkIGJ5IFVJQTFcbiAgICAgIGF3YWl0IGhlbHBlcnMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcyhcbiAgICAgICAgdGhpcy5hZGIsXG4gICAgICAgIGhlbHBlcnMucGFyc2VBcnJheSh0aGlzLm9wdHMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcyksXG4gICAgICAgIFtTRVRUSU5HU19IRUxQRVJfUEtHX0lEXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBJbnN0YWxsIGFueSBcIm90aGVyQXBwc1wiIHRoYXQgd2VyZSBzcGVjaWZpZWQgaW4gY2Fwc1xuICAgIGlmICh0aGlzLm9wdHMub3RoZXJBcHBzKSB7XG4gICAgICBsZXQgb3RoZXJBcHBzO1xuICAgICAgdHJ5IHtcbiAgICAgICAgb3RoZXJBcHBzID0gaGVscGVycy5wYXJzZUFycmF5KHRoaXMub3B0cy5vdGhlckFwcHMpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBDb3VsZCBub3QgcGFyc2UgXCJvdGhlckFwcHNcIiBjYXBhYmlsaXR5OiAke2UubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICAgIG90aGVyQXBwcyA9IGF3YWl0IEIuYWxsKG90aGVyQXBwcy5tYXAoKGFwcCkgPT4gdGhpcy5oZWxwZXJzLmNvbmZpZ3VyZUFwcChhcHAsIEFQUF9FWFRFTlNJT04pKSk7XG4gICAgICBhd2FpdCBoZWxwZXJzLmluc3RhbGxPdGhlckFwa3Mob3RoZXJBcHBzLCB0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICB9XG5cbiAgICAvLyBpbnN0YWxsIGFwcFxuICAgIGlmICghdGhpcy5vcHRzLmFwcCkge1xuICAgICAgaWYgKHRoaXMub3B0cy5mdWxsUmVzZXQpIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnRnVsbCByZXNldCByZXF1aXJlcyBhbiBhcHAgY2FwYWJpbGl0eSwgdXNlIGZhc3RSZXNldCBpZiBhcHAgaXMgbm90IHByb3ZpZGVkJyk7XG4gICAgICB9XG4gICAgICB0aGlzLmxvZy5kZWJ1ZygnTm8gYXBwIGNhcGFiaWxpdHkuIEFzc3VtaW5nIGl0IGlzIGFscmVhZHkgb24gdGhlIGRldmljZScpO1xuICAgICAgaWYgKHRoaXMub3B0cy5mYXN0UmVzZXQpIHtcbiAgICAgICAgYXdhaXQgaGVscGVycy5yZXNldEFwcCh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCkge1xuICAgICAgYXdhaXQgdGhpcy5hZGIudW5pbnN0YWxsQXBrKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgICB9XG4gICAgYXdhaXQgaGVscGVycy5pbnN0YWxsQXBrKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgIGNvbnN0IGFwa1N0cmluZ3NGb3JMYW5ndWFnZSA9IGF3YWl0IGhlbHBlcnMucHVzaFN0cmluZ3ModGhpcy5vcHRzLmxhbmd1YWdlLCB0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICBpZiAodGhpcy5vcHRzLmxhbmd1YWdlKSB7XG4gICAgICB0aGlzLmFwa1N0cmluZ3NbdGhpcy5vcHRzLmxhbmd1YWdlXSA9IGFwa1N0cmluZ3NGb3JMYW5ndWFnZTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIG11c3QgcnVuIGFmdGVyIGluc3RhbGxpbmcgdGhlIGFwaywgb3RoZXJ3aXNlIGl0IHdvdWxkIGNhdXNlIHRoZVxuICAgIC8vIGluc3RhbGwgdG8gZmFpbC4gQW5kIGJlZm9yZSBydW5uaW5nIHRoZSBhcHAuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHRoaXMub3B0cy5zaGFyZWRQcmVmZXJlbmNlcykpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2V0U2hhcmVkUHJlZmVyZW5jZXModGhpcy5vcHRzKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjaGVja0FwcFByZXNlbnQgKCkge1xuICAgIHRoaXMubG9nLmRlYnVnKCdDaGVja2luZyB3aGV0aGVyIGFwcCBpcyBhY3R1YWxseSBwcmVzZW50Jyk7XG4gICAgaWYgKCEoYXdhaXQgZnMuZXhpc3RzKHRoaXMub3B0cy5hcHApKSkge1xuICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgQ291bGQgbm90IGZpbmQgYXBwIGFwayBhdCAke3RoaXMub3B0cy5hcHB9YCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgY2hlY2tQYWNrYWdlUHJlc2VudCAoKSB7XG4gICAgdGhpcy5sb2cuZGVidWcoJ0NoZWNraW5nIHdoZXRoZXIgcGFja2FnZSBpcyBwcmVzZW50IG9uIHRoZSBkZXZpY2UnKTtcbiAgICBpZiAoIShhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ3BtJywgJ2xpc3QnLCAncGFja2FnZXMnLCB0aGlzLm9wdHMuYXBwUGFja2FnZV0pKSkge1xuICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgQ291bGQgbm90IGZpbmQgcGFja2FnZSAke3RoaXMub3B0cy5hcHBQYWNrYWdlfSBvbiB0aGUgZGV2aWNlYCk7XG4gICAgfVxuICB9XG5cbiAgLy8gU2V0IENvbXByZXNzZWRMYXlvdXRIaWVyYXJjaHkgb24gdGhlIGRldmljZVxuICBhc3luYyBzZXRDb21wcmVzc2VkTGF5b3V0SGllcmFyY2h5IChjb21wcmVzcykge1xuICAgIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2NvbXByZXNzZWRMYXlvdXRIaWVyYXJjaHknLCB7Y29tcHJlc3NMYXlvdXQ6IGNvbXByZXNzfSk7XG4gIH1cblxuICBhc3luYyBkZWxldGVTZXNzaW9uICgpIHtcbiAgICB0aGlzLmxvZy5kZWJ1ZygnU2h1dHRpbmcgZG93biBBbmRyb2lkIGRyaXZlcicpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmICghXy5pc0VtcHR5KHRoaXMuX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcFJlY29yZGluZ1NjcmVlbigpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGlnbikge31cblxuICAgIGF3YWl0IGhlbHBlcnMucmVtb3ZlQWxsU2Vzc2lvbldlYlNvY2tldEhhbmRsZXJzKHRoaXMuc2VydmVyLCB0aGlzLnNlc3Npb25JZCk7XG5cbiAgICBhd2FpdCB0aGlzLm1vYmlsZVN0b3BTY3JlZW5TdHJlYW1pbmcoKTtcblxuICAgIGF3YWl0IHN1cGVyLmRlbGV0ZVNlc3Npb24oKTtcblxuICAgIGlmICh0aGlzLmJvb3RzdHJhcCkge1xuICAgICAgLy8gY2VydGFpbiBjbGVhbnVwIHdlIG9ubHkgY2FyZSB0byBkbyBpZiB0aGUgYm9vdHN0cmFwIHdhcyBldmVyIHJ1blxuICAgICAgYXdhaXQgdGhpcy5zdG9wQ2hyb21lZHJpdmVyUHJveGllcygpO1xuICAgICAgaWYgKHRoaXMub3B0cy51bmljb2RlS2V5Ym9hcmQgJiYgdGhpcy5vcHRzLnJlc2V0S2V5Ym9hcmQgJiYgdGhpcy5kZWZhdWx0SU1FKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBSZXNldHRpbmcgSU1FIHRvICR7dGhpcy5kZWZhdWx0SU1FfWApO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYj8uc2V0SU1FKHRoaXMuZGVmYXVsdElNRSk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuaXNDaHJvbWVTZXNzaW9uICYmICF0aGlzLm9wdHMuZG9udFN0b3BBcHBPblJlc2V0KSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiPy5mb3JjZVN0b3AodGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5hZGI/LmdvVG9Ib21lKCk7XG4gICAgICBpZiAodGhpcy5vcHRzLmZ1bGxSZXNldCAmJiAhdGhpcy5vcHRzLnNraXBVbmluc3RhbGwgJiYgIXRoaXMuYXBwT25EZXZpY2UpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGI/LnVuaW5zdGFsbEFwayh0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zaHV0ZG93bigpO1xuICAgICAgdGhpcy5ib290c3RyYXAgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcIkNhbGxlZCBkZWxldGVTZXNzaW9uIGJ1dCBib290c3RyYXAgd2Fzbid0IGFjdGl2ZVwiKTtcbiAgICB9XG4gICAgLy8gc29tZSBjbGVhbnVwIHdlIHdhbnQgdG8gZG8gcmVnYXJkbGVzcywgaW4gY2FzZSB3ZSBhcmUgc2h1dHRpbmcgZG93blxuICAgIC8vIG1pZC1zdGFydHVwXG4gICAgYXdhaXQgdGhpcy5hZGI/LnN0b3BMb2djYXQoKTtcbiAgICBpZiAodGhpcy51c2VVbmxvY2tIZWxwZXJBcHApIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiPy5mb3JjZVN0b3AoJ2lvLmFwcGl1bS51bmxvY2snKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3dhc1dpbmRvd0FuaW1hdGlvbkRpc2FibGVkKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdSZXN0b3Jpbmcgd2luZG93IGFuaW1hdGlvbiBzdGF0ZScpO1xuICAgICAgYXdhaXQgdGhpcy5hZGI/LnNldEFuaW1hdGlvblN0YXRlKHRydWUpO1xuXG4gICAgICAvLyBUaGlzIHdhcyBuZWNlc3NhcnkgdG8gY2hhbmdlIGFuaW1hdGlvbiBzY2FsZSBvdmVyIEFuZHJvaWQgUC4gV2UgbXVzdCByZXNldCB0aGUgcG9saWN5IGZvciB0aGUgc2VjdXJpdHkuXG4gICAgICBpZiAoYXdhaXQgdGhpcy5hZGI/LmdldEFwaUxldmVsKCkgPj0gMjgpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbygnUmVzdG9yaW5nIGhpZGRlbiBhcGkgcG9saWN5IHRvIHRoZSBkZXZpY2UgZGVmYXVsdCBjb25maWd1cmF0aW9uJyk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiPy5zZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5KCEhdGhpcy5vcHRzLmlnbm9yZUhpZGRlbkFwaVBvbGljeUVycm9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRzLnJlYm9vdCkge1xuICAgICAgbGV0IGF2ZE5hbWUgPSB0aGlzLm9wdHMuYXZkLnJlcGxhY2UoJ0AnLCAnJyk7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgY2xvc2luZyBlbXVsYXRvciAnJHthdmROYW1lfSdgKTtcbiAgICAgIGF3YWl0IHRoaXMuYWRiPy5raWxsRW11bGF0b3IoYXZkTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc2V0U2hhcmVkUHJlZmVyZW5jZXMgKCkge1xuICAgIGxldCBzaGFyZWRQcmVmcyA9IHRoaXMub3B0cy5zaGFyZWRQcmVmZXJlbmNlcztcbiAgICB0aGlzLmxvZy5pbmZvKCdUcnlpbmcgdG8gc2V0IHNoYXJlZCBwcmVmZXJlbmNlcycpO1xuICAgIGxldCBuYW1lID0gc2hhcmVkUHJlZnMubmFtZTtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChuYW1lKSkge1xuICAgICAgdGhpcy5sb2cud2FybihgU2tpcHBpbmcgc2V0dGluZyBTaGFyZWQgcHJlZmVyZW5jZXMsIG5hbWUgaXMgdW5kZWZpbmVkOiAke0pTT04uc3RyaW5naWZ5KHNoYXJlZFByZWZzKX1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbGV0IHJlbW90ZVBhdGggPSBgL2RhdGEvZGF0YS8ke3RoaXMub3B0cy5hcHBQYWNrYWdlfS9zaGFyZWRfcHJlZnNgO1xuICAgIGxldCByZW1vdGVGaWxlID0gYCR7cmVtb3RlUGF0aH0vJHtuYW1lfS54bWxgO1xuICAgIGxldCBsb2NhbFBhdGggPSBgL3RtcC8ke25hbWV9LnhtbGA7XG4gICAgbGV0IGJ1aWxkZXIgPSB0aGlzLmdldFByZWZzQnVpbGRlcigpO1xuICAgIGJ1aWxkZXIuYnVpbGQoc2hhcmVkUHJlZnMucHJlZnMpO1xuICAgIHRoaXMubG9nLmluZm8oYENyZWF0aW5nIHRlbXBvcmFyeSBzaGFyZWQgcHJlZmVyZW5jZXM6ICR7bG9jYWxQYXRofWApO1xuICAgIGJ1aWxkZXIudG9GaWxlKGxvY2FsUGF0aCk7XG4gICAgdGhpcy5sb2cuaW5mbyhgQ3JlYXRpbmcgc2hhcmVkX3ByZWZzIHJlbW90ZSBmb2xkZXI6ICR7cmVtb3RlUGF0aH1gKTtcbiAgICBhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ21rZGlyJywgJy1wJywgcmVtb3RlUGF0aF0pO1xuICAgIHRoaXMubG9nLmluZm8oYFB1c2hpbmcgc2hhcmVkX3ByZWZzIHRvICR7cmVtb3RlRmlsZX1gKTtcbiAgICBhd2FpdCB0aGlzLmFkYi5wdXNoKGxvY2FsUGF0aCwgcmVtb3RlRmlsZSk7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMubG9nLmluZm8oYFRyeWluZyB0byByZW1vdmUgc2hhcmVkIHByZWZlcmVuY2VzIHRlbXBvcmFyeSBmaWxlYCk7XG4gICAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKGxvY2FsUGF0aCkpIHtcbiAgICAgICAgYXdhaXQgZnMudW5saW5rKGxvY2FsUGF0aCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5sb2cud2FybihgRXJyb3IgdHJ5aW5nIHRvIHJlbW92ZSB0ZW1wb3JhcnkgZmlsZSAke2xvY2FsUGF0aH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBnZXRQcmVmc0J1aWxkZXIgKCkge1xuICAgIC8qIEFkZCB0aGlzIG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgU2hhcmVkUHJlZnNCdWlsZGVyIGluc3RlYWQgb2ZcbiAgICAgKiBkaXJlY3RseSBjcmVhdGluZyB0aGUgb2JqZWN0IG9uIHNldFNoYXJlZFByZWZlcmVuY2VzIGZvciB0ZXN0aW5nIHB1cnBvc2VzXG4gICAgKi9cbiAgICByZXR1cm4gbmV3IFNoYXJlZFByZWZzQnVpbGRlcigpO1xuICB9XG5cbiAgdmFsaWRhdGVEZXNpcmVkQ2FwcyAoY2Fwcykge1xuICAgIGlmICghc3VwZXIudmFsaWRhdGVEZXNpcmVkQ2FwcyhjYXBzKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoKCFjYXBzLmJyb3dzZXJOYW1lIHx8ICFoZWxwZXJzLmlzQ2hyb21lQnJvd3NlcihjYXBzLmJyb3dzZXJOYW1lKSkgJiYgIWNhcHMuYXBwICYmICFjYXBzLmFwcFBhY2thZ2UpIHtcbiAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ1RoZSBkZXNpcmVkIGNhcGFiaWxpdGllcyBtdXN0IGluY2x1ZGUgZWl0aGVyIGFuIGFwcCwgYXBwUGFja2FnZSBvciBicm93c2VyTmFtZScpO1xuICAgIH1cbiAgICByZXR1cm4gaGVscGVycy52YWxpZGF0ZURlc2lyZWRDYXBzKGNhcHMpO1xuICB9XG5cbiAgcHJveHlBY3RpdmUgKHNlc3Npb25JZCkge1xuICAgIHN1cGVyLnByb3h5QWN0aXZlKHNlc3Npb25JZCk7XG5cbiAgICByZXR1cm4gdGhpcy5qd3BQcm94eUFjdGl2ZTtcbiAgfVxuXG4gIGdldFByb3h5QXZvaWRMaXN0IChzZXNzaW9uSWQpIHtcbiAgICBzdXBlci5nZXRQcm94eUF2b2lkTGlzdChzZXNzaW9uSWQpO1xuXG4gICAgcmV0dXJuIHRoaXMuandwUHJveHlBdm9pZDtcbiAgfVxuXG4gIGNhblByb3h5IChzZXNzaW9uSWQpIHtcbiAgICBzdXBlci5jYW5Qcm94eShzZXNzaW9uSWQpO1xuXG4gICAgLy8gdGhpcyB3aWxsIGNoYW5nZSBkZXBlbmRpbmcgb24gQ2hyb21lRHJpdmVyIHN0YXR1c1xuICAgIHJldHVybiBfLmlzRnVuY3Rpb24odGhpcy5wcm94eVJlcVJlcyk7XG4gIH1cbn1cblxuZXhwb3J0IHsgQW5kcm9pZERyaXZlciB9O1xuZXhwb3J0IGRlZmF1bHQgQW5kcm9pZERyaXZlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBLE1BQU1BLGFBQWEsR0FBRyxNQUFNO0FBQzVCLE1BQU1DLFdBQVcsR0FBRyxJQUFJO0FBSXhCLE1BQU1DLFFBQVEsR0FBRyxDQUNmLENBQUMsTUFBTSxFQUFFLElBQUlDLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLEVBQy9DLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLEVBQzlDLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLEVBQzlDLENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLEVBQzdDLENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQywrQkFBK0IsQ0FBQyxDQUFDLEVBQ3JELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDLEVBQzNELENBQUMsTUFBTSxFQUFFLElBQUlBLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLEVBQ25ELENBQUMsS0FBSyxFQUFFLElBQUlBLE1BQU0s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
407
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBUFBfRVhURU5TSU9OIiwiREVWSUNFX1BPUlQiLCJOT19QUk9YWSIsIlJlZ0V4cCIsIkFuZHJvaWREcml2ZXIiLCJCYXNlRHJpdmVyIiwiY29uc3RydWN0b3IiLCJvcHRzIiwic2hvdWxkVmFsaWRhdGVDYXBzIiwibG9jYXRvclN0cmF0ZWdpZXMiLCJkZXNpcmVkQ2FwQ29uc3RyYWludHMiLCJkZXNpcmVkQ29uc3RyYWludHMiLCJzZXNzaW9uQ2hyb21lZHJpdmVycyIsImp3cFByb3h5QWN0aXZlIiwiandwUHJveHlBdm9pZCIsIl8iLCJjbG9uZSIsInNldHRpbmdzIiwiRGV2aWNlU2V0dGluZ3MiLCJpZ25vcmVVbmltcG9ydGFudFZpZXdzIiwib25TZXR0aW5nc1VwZGF0ZSIsImJpbmQiLCJjaHJvbWVkcml2ZXIiLCJhcGtTdHJpbmdzIiwidW5sb2NrZXIiLCJoZWxwZXJzIiwiY21kIiwiZm4iLCJ0b1BhaXJzIiwiY29tbWFuZHMiLCJwcm90b3R5cGUiLCJjdXJDb250ZXh0IiwiZGVmYXVsdENvbnRleHROYW1lIiwiY3JlYXRlU2Vzc2lvbiIsImFyZ3MiLCJzZXNzaW9uSWQiLCJjYXBzIiwic2VydmVyRGV0YWlscyIsInBsYXRmb3JtIiwid2ViU3RvcmFnZUVuYWJsZWQiLCJ0YWtlc1NjcmVlbnNob3QiLCJqYXZhc2NyaXB0RW5hYmxlZCIsImRhdGFiYXNlRW5hYmxlZCIsIm5ldHdvcmtDb25uZWN0aW9uRW5hYmxlZCIsImxvY2F0aW9uQ29udGV4dEVuYWJsZWQiLCJ3YXJuaW5ncyIsImRlc2lyZWQiLCJPYmplY3QiLCJhc3NpZ24iLCJkZWZhdWx0T3B0cyIsImFjdGlvbiIsImNhdGVnb3J5IiwiZmxhZ3MiLCJkaXNhYmxlQW5kcm9pZFdhdGNoZXJzIiwidG1wRGlyIiwidGVtcERpciIsInN0YXRpY0RpciIsImZ1bGxSZXNldCIsImF1dG9MYXVuY2giLCJhZGJQb3J0IiwiREVGQVVMVF9BREJfUE9SVCIsImJvb3RzdHJhcFBvcnQiLCJhbmRyb2lkSW5zdGFsbFRpbWVvdXQiLCJkZWZhdWx0cyIsInVzZVVubG9ja0hlbHBlckFwcCIsImlzVW5kZWZpbmVkIiwidW5sb2NrVHlwZSIsIm5vUmVzZXQiLCJmYXN0UmVzZXQiLCJza2lwVW5pbnN0YWxsIiwiaXNDaHJvbWVTZXNzaW9uIiwiYWRqdXN0QnJvd3NlclNlc3Npb25DYXBzIiwibmF0aXZlV2ViU2NyZWVuc2hvdCIsInB1c2giLCJyZWJvb3QiLCJzZXRBdmRGcm9tQ2FwYWJpbGl0aWVzIiwidWRpZCIsImVtUG9ydCIsImdldERldmljZUluZm9Gcm9tQ2FwcyIsImFkYiIsImNyZWF0ZUFEQiIsInN1cHByZXNzS2lsbFNlcnZlciIsInJlbW90ZUFkYkhvc3QiLCJjbGVhckRldmljZUxvZ3NPblN0YXJ0IiwiYWRiRXhlY1RpbWVvdXQiLCJhbGxvd09mZmxpbmVEZXZpY2VzIiwiZ2V0QXBpTGV2ZWwiLCJsb2ciLCJ3YXJuIiwiaXNQYWNrYWdlT3JCdW5kbGUiLCJhcHAiLCJhcHBQYWNrYWdlIiwiY29uZmlndXJlQXBwIiwiY2hlY2tBcHBQcmVzZW50IiwiYXBwT25EZXZpY2UiLCJpbmZvIiwiY2hlY2tQYWNrYWdlUHJlc2VudCIsInV0aWwiLCJoYXNWYWx1ZSIsIm5ldHdvcmtTcGVlZCIsImlzRW11bGF0b3IiLCJlbnN1cmVOZXR3b3JrU3BlZWQiLCJncHNFbmFibGVkIiwidG9nZ2xlR1BTTG9jYXRpb25Qcm92aWRlciIsInN0YXJ0QW5kcm9pZFNlc3Npb24iLCJlIiwiZGVsZXRlU2Vzc2lvbiIsImlnbiIsImF2ZCIsImRldmljZU5hbWUiLCJlcnJvckFuZFRocm93IiwicGxhdGZvcm1WZXJzaW9uIiwiYXZkRGV2aWNlIiwicmVwbGFjZSIsImlzQ2hyb21lQnJvd3NlciIsImJyb3dzZXJOYW1lIiwia2V5IiwidmFsdWUiLCJzZXRDb21wcmVzc2VkTGF5b3V0SGllcmFyY2h5IiwiZGVmYXVsdElNRSIsImluaXREZXZpY2UiLCJjdXJEZXZpY2VJZCIsImRldmljZVVESUQiLCJnZXRQbGF0Zm9ybVZlcnNpb24iLCJkZXZpY2VTY3JlZW5TaXplIiwiZ2V0U2NyZWVuU2l6ZSIsImRldmljZU1vZGVsIiwiZ2V0TW9kZWwiLCJkZXZpY2VNYW51ZmFjdHVyZXIiLCJnZXRNYW51ZmFjdHVyZXIiLCJkaXNhYmxlV2luZG93QW5pbWF0aW9uIiwiaXNBbmltYXRpb25PbiIsInNldEhpZGRlbkFwaVBvbGljeSIsImlnbm9yZUhpZGRlbkFwaVBvbGljeUVycm9yIiwic2V0QW5pbWF0aW9uU3RhdGUiLCJfd2FzV2luZG93QW5pbWF0aW9uRGlzYWJsZWQiLCJpbml0QVVUIiwiYm9vdHN0cmFwIiwid2Vic29ja2V0Iiwic3RhcnQiLCJhY2NlcHRTc2xDZXJ0cyIsIm9uVW5leHBlY3RlZFNodXRkb3duIiwiZXJyIiwiaWdub3JlVW5leHBlY3RlZFNodXRkb3duIiwic3RhcnRVbmV4cGVjdGVkU2h1dGRvd24iLCJza2lwVW5sb2NrIiwidW5sb2NrIiwidXBkYXRlIiwic3RhcnRDaHJvbWVTZXNzaW9uIiwic3RhcnRBVVQiLCJvcmllbnRhdGlvbiIsImRlYnVnIiwic2V0T3JpZW50YXRpb24iLCJpbml0QXV0b1dlYnZpZXciLCJhdXRvV2VidmlldyIsInZpZXdOYW1lIiwiZGVmYXVsdFdlYnZpZXdOYW1lIiwidGltZW91dCIsImF1dG9XZWJ2aWV3VGltZW91dCIsInJldHJ5SW50ZXJ2YWwiLCJzZXRDb250ZXh0IiwibGF1bmNoSW5mbyIsImdldExhdW5jaEluZm8iLCJ1bmluc3RhbGxPdGhlclBhY2thZ2VzIiwidmFsaWRhdGVEZXNpcmVkQ2FwcyIsInBhcnNlQXJyYXkiLCJTRVRUSU5HU19IRUxQRVJfUEtHX0lEIiwib3RoZXJBcHBzIiwibWVzc2FnZSIsIkIiLCJhbGwiLCJtYXAiLCJpbnN0YWxsT3RoZXJBcGtzIiwicmVzZXRBcHAiLCJ1bmluc3RhbGxBcGsiLCJpbnN0YWxsQXBrIiwiYXBrU3RyaW5nc0Zvckxhbmd1YWdlIiwicHVzaFN0cmluZ3MiLCJsYW5ndWFnZSIsInNoYXJlZFByZWZlcmVuY2VzIiwic2V0U2hhcmVkUHJlZmVyZW5jZXMiLCJmcyIsImV4aXN0cyIsInNoZWxsIiwiY29tcHJlc3MiLCJzZW5kQWN0aW9uIiwiY29tcHJlc3NMYXlvdXQiLCJpc0VtcHR5IiwiX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMiLCJzdG9wUmVjb3JkaW5nU2NyZWVuIiwicmVtb3ZlQWxsU2Vzc2lvbldlYlNvY2tldEhhbmRsZXJzIiwic2VydmVyIiwibW9iaWxlU3RvcFNjcmVlblN0cmVhbWluZyIsInN0b3BDaHJvbWVkcml2ZXJQcm94aWVzIiwidW5pY29kZUtleWJvYXJkIiwicmVzZXRLZXlib2FyZCIsInNldElNRSIsImRvbnRTdG9wQXBwT25SZXNldCIsImZvcmNlU3RvcCIsImdvVG9Ib21lIiwic2h1dGRvd24iLCJzdG9wTG9nY2F0Iiwic2V0RGVmYXVsdEhpZGRlbkFwaVBvbGljeSIsImF2ZE5hbWUiLCJraWxsRW11bGF0b3IiLCJzaGFyZWRQcmVmcyIsIm5hbWUiLCJKU09OIiwic3RyaW5naWZ5IiwicmVtb3RlUGF0aCIsInJlbW90ZUZpbGUiLCJsb2NhbFBhdGgiLCJidWlsZGVyIiwiZ2V0UHJlZnNCdWlsZGVyIiwiYnVpbGQiLCJwcmVmcyIsInRvRmlsZSIsInVubGluayIsIlNoYXJlZFByZWZzQnVpbGRlciIsInByb3h5QWN0aXZlIiwiZ2V0UHJveHlBdm9pZExpc3QiLCJjYW5Qcm94eSIsImlzRnVuY3Rpb24iLCJwcm94eVJlcVJlcyJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9kcml2ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZURyaXZlciwgRGV2aWNlU2V0dGluZ3MgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcbmltcG9ydCBkZXNpcmVkQ29uc3RyYWludHMgZnJvbSAnLi9kZXNpcmVkLWNhcHMnO1xuaW1wb3J0IGNvbW1hbmRzIGZyb20gJy4vY29tbWFuZHMvaW5kZXgnO1xuaW1wb3J0IHtcbiAgaGVscGVycywgZW5zdXJlTmV0d29ya1NwZWVkLFxuICBTRVRUSU5HU19IRUxQRVJfUEtHX0lELFxufSBmcm9tICcuL2FuZHJvaWQtaGVscGVycyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgREVGQVVMVF9BREJfUE9SVCB9IGZyb20gJ2FwcGl1bS1hZGInO1xuaW1wb3J0IHsgZnMsIHRlbXBEaXIsIHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgcmV0cnlJbnRlcnZhbCB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IFNoYXJlZFByZWZzQnVpbGRlciB9IGZyb20gJ3NoYXJlZC1wcmVmZXJlbmNlcy1idWlsZGVyJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcblxuY29uc3QgQVBQX0VYVEVOU0lPTiA9ICcuYXBrJztcbmNvbnN0IERFVklDRV9QT1JUID0gNDcyNDtcblxuLy8gVGhpcyBpcyBhIHNldCBvZiBtZXRob2RzIGFuZCBwYXRocyB0aGF0IHdlIG5ldmVyIHdhbnQgdG8gcHJveHkgdG9cbi8vIENocm9tZWRyaXZlclxuY29uc3QgTk9fUFJPWFkgPSBbXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9jb250ZXh0JyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9hcHBpdW0nKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy90b3VjaC9wZXJmb3JtJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvdG91Y2gvbXVsdGkvcGVyZm9ybScpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL29yaWVudGF0aW9uJyldLFxuICBbJ0dFVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9vcmllbnRhdGlvbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL2V4ZWN1dGUnKV0sXG4gIFsnUE9TVCcsIG5ldyBSZWdFeHAoJ14vc2Vzc2lvbi9bXi9dKy9leGVjdXRlL3N5bmMnKV0sXG4gIFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL25ldHdvcmtfY29ubmVjdGlvbicpXSxcbiAgWydQT1NUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL25ldHdvcmtfY29ubmVjdGlvbicpXSxcbl07XG5cbmNsYXNzIEFuZHJvaWREcml2ZXIgZXh0ZW5kcyBCYXNlRHJpdmVyIHtcbiAgY29uc3RydWN0b3IgKG9wdHMgPSB7fSwgc2hvdWxkVmFsaWRhdGVDYXBzID0gdHJ1ZSkge1xuICAgIHN1cGVyKG9wdHMsIHNob3VsZFZhbGlkYXRlQ2Fwcyk7XG5cbiAgICB0aGlzLmxvY2F0b3JTdHJhdGVnaWVzID0gW1xuICAgICAgJ3hwYXRoJyxcbiAgICAgICdpZCcsXG4gICAgICAnY2xhc3MgbmFtZScsXG4gICAgICAnYWNjZXNzaWJpbGl0eSBpZCcsXG4gICAgICAnLWFuZHJvaWQgdWlhdXRvbWF0b3InXG4gICAgXTtcbiAgICB0aGlzLmRlc2lyZWRDYXBDb25zdHJhaW50cyA9IGRlc2lyZWRDb25zdHJhaW50cztcbiAgICB0aGlzLnNlc3Npb25DaHJvbWVkcml2ZXJzID0ge307XG4gICAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuandwUHJveHlBdm9pZCA9IF8uY2xvbmUoTk9fUFJPWFkpO1xuICAgIHRoaXMuc2V0dGluZ3MgPSBuZXcgRGV2aWNlU2V0dGluZ3Moe2lnbm9yZVVuaW1wb3J0YW50Vmlld3M6IGZhbHNlfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25TZXR0aW5nc1VwZGF0ZS5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLmNocm9tZWRyaXZlciA9IG51bGw7XG4gICAgdGhpcy5hcGtTdHJpbmdzID0ge307XG4gICAgdGhpcy51bmxvY2tlciA9IGhlbHBlcnMudW5sb2NrZXI7XG5cbiAgICBmb3IgKGxldCBbY21kLCBmbl0gb2YgXy50b1BhaXJzKGNvbW1hbmRzKSkge1xuICAgICAgQW5kcm9pZERyaXZlci5wcm90b3R5cGVbY21kXSA9IGZuO1xuICAgIH1cblxuICAgIC8vIG5lZWRzIHRvIGJlIGFmdGVyIHRoZSBsaW5lIHdoaWNoIGFzc2lnbnMgY29tbWFuZHMgdG8gQW5kcm9pZERyaXZlci5wcm90b3R5cGUsIHNvIHRoYXQgYHRoaXMuZGVmYXVsdENvbnRleHROYW1lYCBpcyBkZWZpbmVkLlxuICAgIHRoaXMuY3VyQ29udGV4dCA9IHRoaXMuZGVmYXVsdENvbnRleHROYW1lKCk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVTZXNzaW9uICguLi5hcmdzKSB7XG4gICAgLy8gdGhlIHdob2xlIGNyZWF0ZVNlc3Npb24gZmxvdyBpcyBzdXJyb3VuZGVkIGluIGEgdHJ5LWNhdGNoIHN0YXRlbWVudFxuICAgIC8vIGlmIGNyZWF0aW5nIGEgc2Vzc2lvbiBmYWlscyBhdCBhbnkgcG9pbnQsIHdlIHRlYXJkb3duIGV2ZXJ5dGhpbmcgd2VcbiAgICAvLyBzZXQgdXAgYmVmb3JlIHRocm93aW5nIHRoZSBlcnJvci5cbiAgICB0cnkge1xuICAgICAgbGV0IFtzZXNzaW9uSWQsIGNhcHNdID0gYXdhaXQgc3VwZXIuY3JlYXRlU2Vzc2lvbiguLi5hcmdzKTtcblxuICAgICAgbGV0IHNlcnZlckRldGFpbHMgPSB7XG4gICAgICAgIHBsYXRmb3JtOiAnTElOVVgnLFxuICAgICAgICB3ZWJTdG9yYWdlRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHRha2VzU2NyZWVuc2hvdDogdHJ1ZSxcbiAgICAgICAgamF2YXNjcmlwdEVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGRhdGFiYXNlRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIG5ldHdvcmtDb25uZWN0aW9uRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgbG9jYXRpb25Db250ZXh0RW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHdhcm5pbmdzOiB7fSxcbiAgICAgICAgZGVzaXJlZDogdGhpcy5jYXBzXG4gICAgICB9O1xuXG4gICAgICB0aGlzLmNhcHMgPSBPYmplY3QuYXNzaWduKHNlcnZlckRldGFpbHMsIHRoaXMuY2Fwcyk7XG5cbiAgICAgIC8vIGFzc2lnbmluZyBkZWZhdWx0c1xuICAgICAgbGV0IGRlZmF1bHRPcHRzID0ge1xuICAgICAgICBhY3Rpb246ICdhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTicsXG4gICAgICAgIGNhdGVnb3J5OiAnYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVInLFxuICAgICAgICBmbGFnczogJzB4MTAyMDAwMDAnLFxuICAgICAgICBkaXNhYmxlQW5kcm9pZFdhdGNoZXJzOiBmYWxzZSxcbiAgICAgICAgdG1wRGlyOiBhd2FpdCB0ZW1wRGlyLnN0YXRpY0RpcigpLFxuICAgICAgICBmdWxsUmVzZXQ6IGZhbHNlLFxuICAgICAgICBhdXRvTGF1bmNoOiB0cnVlLFxuICAgICAgICBhZGJQb3J0OiBERUZBVUxUX0FEQl9QT1JULFxuICAgICAgICBib290c3RyYXBQb3J0OiBERVZJQ0VfUE9SVCxcbiAgICAgICAgYW5kcm9pZEluc3RhbGxUaW1lb3V0OiA5MDAwMCxcbiAgICAgIH07XG4gICAgICBfLmRlZmF1bHRzKHRoaXMub3B0cywgZGVmYXVsdE9wdHMpO1xuICAgICAgdGhpcy51c2VVbmxvY2tIZWxwZXJBcHAgPSBfLmlzVW5kZWZpbmVkKHRoaXMuY2Fwcy51bmxvY2tUeXBlKTtcblxuICAgICAgLy8gbm90IHVzZXIgdmlzaWJsZSB2aWEgY2Fwc1xuICAgICAgaWYgKHRoaXMub3B0cy5ub1Jlc2V0ID09PSB0cnVlKSB7XG4gICAgICAgIHRoaXMub3B0cy5mdWxsUmVzZXQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm9wdHMuZnVsbFJlc2V0ID09PSB0cnVlKSB7XG4gICAgICAgIHRoaXMub3B0cy5ub1Jlc2V0ID0gZmFsc2U7XG4gICAgICB9XG4gICAgICB0aGlzLm9wdHMuZmFzdFJlc2V0ID0gIXRoaXMub3B0cy5mdWxsUmVzZXQgJiYgIXRoaXMub3B0cy5ub1Jlc2V0O1xuICAgICAgdGhpcy5vcHRzLnNraXBVbmluc3RhbGwgPSB0aGlzLm9wdHMuZmFzdFJlc2V0IHx8IHRoaXMub3B0cy5ub1Jlc2V0O1xuXG4gICAgICBpZiAodGhpcy5pc0Nocm9tZVNlc3Npb24pIHtcbiAgICAgICAgaGVscGVycy5hZGp1c3RCcm93c2VyU2Vzc2lvbkNhcHModGhpcy5vcHRzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3B0cy5uYXRpdmVXZWJTY3JlZW5zaG90KSB7XG4gICAgICAgIHRoaXMuandwUHJveHlBdm9pZC5wdXNoKFsnR0VUJywgbmV3IFJlZ0V4cCgnXi9zZXNzaW9uL1teL10rL3NjcmVlbnNob3QnKV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRzLnJlYm9vdCkge1xuICAgICAgICB0aGlzLnNldEF2ZEZyb21DYXBhYmlsaXRpZXMoY2Fwcyk7XG4gICAgICB9XG5cbiAgICAgIC8vIGdldCBkZXZpY2UgdWRpZCBmb3IgdGhpcyBzZXNzaW9uXG4gICAgICBsZXQge3VkaWQsIGVtUG9ydH0gPSBhd2FpdCBoZWxwZXJzLmdldERldmljZUluZm9Gcm9tQ2Fwcyh0aGlzLm9wdHMpO1xuICAgICAgdGhpcy5vcHRzLnVkaWQgPSB1ZGlkO1xuICAgICAgdGhpcy5vcHRzLmVtUG9ydCA9IGVtUG9ydDtcblxuICAgICAgLy8gc2V0IHVwIGFuIGluc3RhbmNlIG9mIEFEQlxuICAgICAgdGhpcy5hZGIgPSBhd2FpdCBoZWxwZXJzLmNyZWF0ZUFEQih7XG4gICAgICAgIHVkaWQ6IHRoaXMub3B0cy51ZGlkLFxuICAgICAgICBlbVBvcnQ6IHRoaXMub3B0cy5lbVBvcnQsXG4gICAgICAgIGFkYlBvcnQ6IHRoaXMub3B0cy5hZGJQb3J0LFxuICAgICAgICBzdXBwcmVzc0tpbGxTZXJ2ZXI6IHRoaXMub3B0cy5zdXBwcmVzc0tpbGxTZXJ2ZXIsXG4gICAgICAgIHJlbW90ZUFkYkhvc3Q6IHRoaXMub3B0cy5yZW1vdGVBZGJIb3N0LFxuICAgICAgICBjbGVhckRldmljZUxvZ3NPblN0YXJ0OiB0aGlzLm9wdHMuY2xlYXJEZXZpY2VMb2dzT25TdGFydCxcbiAgICAgICAgYWRiRXhlY1RpbWVvdXQ6IHRoaXMub3B0cy5hZGJFeGVjVGltZW91dCxcbiAgICAgICAgYWxsb3dPZmZsaW5lRGV2aWNlczogdGhpcy5vcHRzLmFsbG93T2ZmbGluZURldmljZXMsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPj0gMjMpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihcIkNvbnNpZGVyIHNldHRpbmcgJ2F1dG9tYXRpb25OYW1lJyBjYXBhYmlsaXR5IHRvIFwiICtcbiAgICAgICAgICBcIid1aWF1dG9tYXRvcjInIG9uIEFuZHJvaWQgPj0gNiwgc2luY2UgVUlBdXRvbWF0b3IgZnJhbWV3b3JrIFwiICtcbiAgICAgICAgICAnaXMgbm90IG1haW50YWluZWQgYW55bW9yZSBieSB0aGUgT1MgdmVuZG9yLicpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5oZWxwZXJzLmlzUGFja2FnZU9yQnVuZGxlKHRoaXMub3B0cy5hcHApKSB7XG4gICAgICAgIC8vIHVzZXIgcHJvdmlkZWQgcGFja2FnZSBpbnN0ZWFkIG9mIGFwcCBmb3IgJ2FwcCcgY2FwYWJpbGl0eSwgbWFzc2FnZSBvcHRpb25zXG4gICAgICAgIHRoaXMub3B0cy5hcHBQYWNrYWdlID0gdGhpcy5vcHRzLmFwcDtcbiAgICAgICAgdGhpcy5vcHRzLmFwcCA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9wdHMuYXBwKSB7XG4gICAgICAgIC8vIGZpbmQgYW5kIGNvcHksIG9yIGRvd25sb2FkIGFuZCB1bnppcCBhbiBhcHAgdXJsIG9yIHBhdGhcbiAgICAgICAgdGhpcy5vcHRzLmFwcCA9IGF3YWl0IHRoaXMuaGVscGVycy5jb25maWd1cmVBcHAodGhpcy5vcHRzLmFwcCwgQVBQX0VYVEVOU0lPTik7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tBcHBQcmVzZW50KCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuYXBwT25EZXZpY2UpIHtcbiAgICAgICAgLy8gdGhlIGFwcCBpc24ndCBhbiBhY3R1YWwgYXBwIGZpbGUgYnV0IHJhdGhlciBzb21ldGhpbmcgd2Ugd2FudCB0b1xuICAgICAgICAvLyBhc3N1bWUgaXMgb24gdGhlIGRldmljZSBhbmQganVzdCBsYXVuY2ggdmlhIHRoZSBhcHBQYWNrYWdlXG4gICAgICAgIHRoaXMubG9nLmluZm8oYEFwcCBmaWxlIHdhcyBub3QgbGlzdGVkLCBpbnN0ZWFkIHdlJ3JlIGdvaW5nIHRvIHJ1biBgICtcbiAgICAgICAgICBgJHt0aGlzLm9wdHMuYXBwUGFja2FnZX0gZGlyZWN0bHkgb24gdGhlIGRldmljZWApO1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrUGFja2FnZVByZXNlbnQoKTtcbiAgICAgIH1cblxuICAgICAgLy8gU29tZSBjbG91ZCBzZXJ2aWNlcyB1c2luZyBhcHBpdW0gbGF1bmNoIHRoZSBhdmQgdGhlbXNlbHZlcywgc28gd2UgZW5zdXJlIG5ldHNwZWVkXG4gICAgICAvLyBpcyBzZXQgZm9yIGVtdWxhdG9ycyBieSBjYWxsaW5nIGFkYi5uZXR3b3JrU3BlZWQgYmVmb3JlIHJ1bm5pbmcgdGhlIGFwcFxuICAgICAgaWYgKHV0aWwuaGFzVmFsdWUodGhpcy5vcHRzLm5ldHdvcmtTcGVlZCkpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRW11bGF0b3IoKSkge1xuICAgICAgICAgIHRoaXMubG9nLndhcm4oJ1NvcnJ5LCBuZXR3b3JrU3BlZWQgY2FwYWJpbGl0eSBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgbmV0d29ya1NwZWVkID0gZW5zdXJlTmV0d29ya1NwZWVkKHRoaXMuYWRiLCB0aGlzLm9wdHMubmV0d29ya1NwZWVkKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkYi5uZXR3b3JrU3BlZWQobmV0d29ya1NwZWVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gY2hlY2sgaWYgd2UgaGF2ZSB0byBlbmFibGUvZGlzYWJsZSBncHMgYmVmb3JlIHJ1bm5pbmcgdGhlIGFwcGxpY2F0aW9uXG4gICAgICBpZiAodXRpbC5oYXNWYWx1ZSh0aGlzLm9wdHMuZ3BzRW5hYmxlZCkpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNFbXVsYXRvcigpKSB7XG4gICAgICAgICAgdGhpcy5sb2cuaW5mbyhgVHJ5aW5nIHRvICR7dGhpcy5vcHRzLmdwc0VuYWJsZWQgPyAnZW5hYmxlJyA6ICdkaXNhYmxlJ30gZ3BzIGxvY2F0aW9uIHByb3ZpZGVyYCk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5hZGIudG9nZ2xlR1BTTG9jYXRpb25Qcm92aWRlcih0aGlzLm9wdHMuZ3BzRW5hYmxlZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5sb2cud2FybignU29ycnkhIGdwc0VuYWJsZWQgY2FwYWJpbGl0eSBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5zdGFydEFuZHJvaWRTZXNzaW9uKHRoaXMub3B0cyk7XG4gICAgICByZXR1cm4gW3Nlc3Npb25JZCwgdGhpcy5jYXBzXTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBpZ25vcmluZyBkZWxldGUgc2Vzc2lvbiBleGNlcHRpb24gaWYgYW55IGFuZCB0aHJvdyB0aGUgcmVhbCBlcnJvclxuICAgICAgLy8gdGhhdCBoYXBwZW5lZCB3aGlsZSBjcmVhdGluZyB0aGUgc2Vzc2lvbi5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlU2Vzc2lvbigpO1xuICAgICAgfSBjYXRjaCAoaWduKSB7fVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICBpc0VtdWxhdG9yICgpIHtcbiAgICByZXR1cm4gaGVscGVycy5pc0VtdWxhdG9yKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICB9XG5cbiAgc2V0QXZkRnJvbUNhcGFiaWxpdGllcyAoY2Fwcykge1xuICAgIGlmICh0aGlzLm9wdHMuYXZkKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdhdmQgbmFtZSBkZWZpbmVkLCBpZ25vcmluZyBkZXZpY2UgbmFtZSBhbmQgcGxhdGZvcm0gdmVyc2lvbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWNhcHMuZGV2aWNlTmFtZSkge1xuICAgICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdhdmQgb3IgZGV2aWNlTmFtZSBzaG91bGQgYmUgc3BlY2lmaWVkIHdoZW4gcmVib290IG9wdGlvbiBpcyBlbmFibGVzJyk7XG4gICAgICB9XG4gICAgICBpZiAoIWNhcHMucGxhdGZvcm1WZXJzaW9uKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ2F2ZCBvciBwbGF0Zm9ybVZlcnNpb24gc2hvdWxkIGJlIHNwZWNpZmllZCB3aGVuIHJlYm9vdCBvcHRpb24gaXMgZW5hYmxlZCcpO1xuICAgICAgfVxuICAgICAgbGV0IGF2ZERldmljZSA9IGNhcHMuZGV2aWNlTmFtZS5yZXBsYWNlKC9bXmEtekEtWjAtOV8uXS9nLCAnLScpO1xuICAgICAgdGhpcy5vcHRzLmF2ZCA9IGAke2F2ZERldmljZX1fXyR7Y2Fwcy5wbGF0Zm9ybVZlcnNpb259YDtcbiAgICB9XG4gIH1cblxuICBnZXQgYXBwT25EZXZpY2UgKCkge1xuICAgIHJldHVybiB0aGlzLmhlbHBlcnMuaXNQYWNrYWdlT3JCdW5kbGUodGhpcy5vcHRzLmFwcCkgfHwgKCF0aGlzLm9wdHMuYXBwICYmXG4gICAgICAgICAgIHRoaXMuaGVscGVycy5pc1BhY2thZ2VPckJ1bmRsZSh0aGlzLm9wdHMuYXBwUGFja2FnZSkpO1xuICB9XG5cbiAgZ2V0IGlzQ2hyb21lU2Vzc2lvbiAoKSB7XG4gICAgcmV0dXJuIGhlbHBlcnMuaXNDaHJvbWVCcm93c2VyKHRoaXMub3B0cy5icm93c2VyTmFtZSk7XG4gIH1cblxuICBhc3luYyBvblNldHRpbmdzVXBkYXRlIChrZXksIHZhbHVlKSB7XG4gICAgaWYgKGtleSA9PT0gJ2lnbm9yZVVuaW1wb3J0YW50Vmlld3MnKSB7XG4gICAgICBhd2FpdCB0aGlzLnNldENvbXByZXNzZWRMYXlvdXRIaWVyYXJjaHkodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0YXJ0QW5kcm9pZFNlc3Npb24gKCkge1xuICAgIHRoaXMubG9nLmluZm8oYFN0YXJ0aW5nIEFuZHJvaWQgc2Vzc2lvbmApO1xuICAgIC8vIHNldCB1cCB0aGUgZGV2aWNlIHRvIHJ1biBvbiAocmVhbCBvciBlbXVsYXRvciwgZXRjKVxuICAgIHRoaXMuZGVmYXVsdElNRSA9IGF3YWl0IGhlbHBlcnMuaW5pdERldmljZSh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcblxuICAgIC8vIHNldCBhY3R1YWwgZGV2aWNlIG5hbWUsIHVkaWQsIHBsYXRmb3JtIHZlcnNpb24sIHNjcmVlbiBzaXplLCBtb2RlbCBhbmQgbWFudWZhY3R1cmVyIGRldGFpbHMuXG4gICAgdGhpcy5jYXBzLmRldmljZU5hbWUgPSB0aGlzLmFkYi5jdXJEZXZpY2VJZDtcbiAgICB0aGlzLmNhcHMuZGV2aWNlVURJRCA9IHRoaXMub3B0cy51ZGlkO1xuICAgIHRoaXMuY2Fwcy5wbGF0Zm9ybVZlcnNpb24gPSBhd2FpdCB0aGlzLmFkYi5nZXRQbGF0Zm9ybVZlcnNpb24oKTtcbiAgICB0aGlzLmNhcHMuZGV2aWNlU2NyZWVuU2l6ZSA9IGF3YWl0IHRoaXMuYWRiLmdldFNjcmVlblNpemUoKTtcbiAgICB0aGlzLmNhcHMuZGV2aWNlTW9kZWwgPSBhd2FpdCB0aGlzLmFkYi5nZXRNb2RlbCgpO1xuICAgIHRoaXMuY2Fwcy5kZXZpY2VNYW51ZmFjdHVyZXIgPSBhd2FpdCB0aGlzLmFkYi5nZXRNYW51ZmFjdHVyZXIoKTtcblxuICAgIGlmICh0aGlzLm9wdHMuZGlzYWJsZVdpbmRvd0FuaW1hdGlvbikge1xuICAgICAgaWYgKGF3YWl0IHRoaXMuYWRiLmlzQW5pbWF0aW9uT24oKSkge1xuICAgICAgICBpZiAoYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKSA+PSAyOCkgeyAvLyBBUEkgbGV2ZWwgMjggaXMgQW5kcm9pZCBQXG4gICAgICAgICAgLy8gRG9uJ3QgZm9yZ2V0IHRvIHJlc2V0IHRoZSByZWxheGluZyBpbiBkZWxldGUgc2Vzc2lvblxuICAgICAgICAgIHRoaXMubG9nLndhcm4oJ1JlbGF4aW5nIGhpZGRlbiBhcGkgcG9saWN5IHRvIG1hbmFnZSBhbmltYXRpb24gc2NhbGUnKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkYi5zZXRIaWRkZW5BcGlQb2xpY3koJzEnLCAhIXRoaXMub3B0cy5pZ25vcmVIaWRkZW5BcGlQb2xpY3lFcnJvcik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvZy5pbmZvKCdEaXNhYmxpbmcgd2luZG93IGFuaW1hdGlvbiBhcyBpdCBpcyByZXF1ZXN0ZWQgYnkgXCJkaXNhYmxlV2luZG93QW5pbWF0aW9uXCIgY2FwYWJpbGl0eScpO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5zZXRBbmltYXRpb25TdGF0ZShmYWxzZSk7XG4gICAgICAgIHRoaXMuX3dhc1dpbmRvd0FuaW1hdGlvbkRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oJ1dpbmRvdyBhbmltYXRpb24gaXMgYWxyZWFkeSBkaXNhYmxlZCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNldCB1cCBhcHAgdW5kZXIgdGVzdFxuICAgIGF3YWl0IHRoaXMuaW5pdEFVVCgpO1xuXG4gICAgLy8gc3RhcnQgVWlBdXRvbWF0b3JcbiAgICB0aGlzLmJvb3RzdHJhcCA9IG5ldyBoZWxwZXJzLmJvb3RzdHJhcCh0aGlzLmFkYiwgdGhpcy5vcHRzLmJvb3RzdHJhcFBvcnQsIHRoaXMub3B0cy53ZWJzb2NrZXQpO1xuICAgIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnN0YXJ0KHRoaXMub3B0cy5hcHBQYWNrYWdlLCB0aGlzLm9wdHMuZGlzYWJsZUFuZHJvaWRXYXRjaGVycywgdGhpcy5vcHRzLmFjY2VwdFNzbENlcnRzKTtcbiAgICAvLyBoYW5kbGluZyB1bmV4cGVjdGVkIHNodXRkb3duXG4gICAgKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYm9vdHN0cmFwLm9uVW5leHBlY3RlZFNodXRkb3duO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmICghdGhpcy5ib290c3RyYXAuaWdub3JlVW5leHBlY3RlZFNodXRkb3duKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5zdGFydFVuZXhwZWN0ZWRTaHV0ZG93bihlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkoKTtcblxuXG4gICAgaWYgKHRoaXMub3B0cy5za2lwVW5sb2NrKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdTa2lwcGluZyBsb2Nrc2NyZWVuIGNoZWNrJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ0NoZWNraW5nIGZvciBsb2Nrc2NyZWVuIHByZXNlbmNlLiAnICtcbiAgICAgICAgYFRoaXMgY291bGQgYmUgc2tpcHBlZCBieSBzZXR0aW5nIHRoZSAnYXBwaXVtOnNraXBVbmxvY2snIGNhcGFiaWxpdHkgdG8gdHJ1ZS5gKTtcbiAgICAgIGF3YWl0IGhlbHBlcnMudW5sb2NrKHRoaXMsIHRoaXMuYWRiLCB0aGlzLmNhcHMpO1xuICAgIH1cblxuICAgIC8vIFNldCBDb21wcmVzc2VkTGF5b3V0SGllcmFyY2h5IG9uIHRoZSBkZXZpY2UgYmFzZWQgb24gY3VycmVudCBzZXR0aW5ncyBvYmplY3RcbiAgICAvLyB0aGlzIGhhcyB0byBoYXBwZW4gX2FmdGVyXyBib290c3RyYXAgaXMgaW5pdGlhbGl6ZWRcbiAgICBpZiAodGhpcy5vcHRzLmlnbm9yZVVuaW1wb3J0YW50Vmlld3MpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2V0dGluZ3MudXBkYXRlKHtpZ25vcmVVbmltcG9ydGFudFZpZXdzOiB0aGlzLm9wdHMuaWdub3JlVW5pbXBvcnRhbnRWaWV3c30pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzQ2hyb21lU2Vzc2lvbikge1xuICAgICAgLy8gc3RhcnQgYSBjaHJvbWVkcml2ZXIgc2Vzc2lvbiBhbmQgcHJveHkgdG8gaXRcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRDaHJvbWVTZXNzaW9uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLm9wdHMuYXV0b0xhdW5jaCkge1xuICAgICAgICAvLyBzdGFydCBhcHBcbiAgICAgICAgYXdhaXQgdGhpcy5zdGFydEFVVCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh1dGlsLmhhc1ZhbHVlKHRoaXMub3B0cy5vcmllbnRhdGlvbikpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGluaXRpYWwgb3JpZW50YXRpb24gdG8gJyR7dGhpcy5vcHRzLm9yaWVudGF0aW9ufSdgKTtcbiAgICAgIGF3YWl0IHRoaXMuc2V0T3JpZW50YXRpb24odGhpcy5vcHRzLm9yaWVudGF0aW9uKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmluaXRBdXRvV2VidmlldygpO1xuICB9XG5cbiAgYXN5bmMgaW5pdEF1dG9XZWJ2aWV3ICgpIHtcbiAgICBpZiAodGhpcy5vcHRzLmF1dG9XZWJ2aWV3KSB7XG4gICAgICBsZXQgdmlld05hbWUgPSB0aGlzLmRlZmF1bHRXZWJ2aWV3TmFtZSgpO1xuICAgICAgbGV0IHRpbWVvdXQgPSAodGhpcy5vcHRzLmF1dG9XZWJ2aWV3VGltZW91dCkgfHwgMjAwMDtcblxuICAgICAgdGhpcy5sb2cuaW5mbyhgU2V0dGluZyBhdXRvIHdlYnZpZXcgdG8gY29udGV4dCAnJHt2aWV3TmFtZX0nIHdpdGggdGltZW91dCAke3RpbWVvdXR9bXNgKTtcblxuICAgICAgLy8gdHJ5IGV2ZXJ5IDUwMG1zIHVudGlsIHRpbWVvdXQgaXMgb3ZlclxuICAgICAgYXdhaXQgcmV0cnlJbnRlcnZhbCh0aW1lb3V0IC8gNTAwLCA1MDAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRDb250ZXh0KHZpZXdOYW1lKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGluaXRBVVQgKCkge1xuICAgIC8vIHBvcHVsYXRlIGFwcFBhY2thZ2UsIGFwcEFjdGl2aXR5LCBhcHBXYWl0UGFja2FnZSwgYXBwV2FpdEFjdGl2aXR5LFxuICAgIC8vIGFuZCB0aGUgZGV2aWNlIGJlaW5nIHVzZWRcbiAgICAvLyBpbiB0aGUgb3B0cyBhbmQgY2FwcyAoc28gaXQgZ2V0cyBiYWNrIHRvIHRoZSB1c2VyIG9uIHNlc3Npb24gY3JlYXRpb24pXG4gICAgbGV0IGxhdW5jaEluZm8gPSBhd2FpdCBoZWxwZXJzLmdldExhdW5jaEluZm8odGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdHMsIGxhdW5jaEluZm8pO1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5jYXBzLCBsYXVuY2hJbmZvKTtcblxuICAgIC8vIFVuaW5zdGFsbCBhbnkgdW5pbnN0YWxsT3RoZXJQYWNrYWdlcyB3aGljaCB3ZXJlIHNwZWNpZmllZCBpbiBjYXBzXG4gICAgaWYgKHRoaXMub3B0cy51bmluc3RhbGxPdGhlclBhY2thZ2VzKSB7XG4gICAgICBoZWxwZXJzLnZhbGlkYXRlRGVzaXJlZENhcHModGhpcy5vcHRzKTtcbiAgICAgIC8vIE9ubHkgU0VUVElOR1NfSEVMUEVSX1BLR19JRCBwYWNrYWdlIGlzIHVzZWQgYnkgVUlBMVxuICAgICAgYXdhaXQgaGVscGVycy51bmluc3RhbGxPdGhlclBhY2thZ2VzKFxuICAgICAgICB0aGlzLmFkYixcbiAgICAgICAgaGVscGVycy5wYXJzZUFycmF5KHRoaXMub3B0cy51bmluc3RhbGxPdGhlclBhY2thZ2VzKSxcbiAgICAgICAgW1NFVFRJTkdTX0hFTFBFUl9QS0dfSURdXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEluc3RhbGwgYW55IFwib3RoZXJBcHBzXCIgdGhhdCB3ZXJlIHNwZWNpZmllZCBpbiBjYXBzXG4gICAgaWYgKHRoaXMub3B0cy5vdGhlckFwcHMpIHtcbiAgICAgIGxldCBvdGhlckFwcHM7XG4gICAgICB0cnkge1xuICAgICAgICBvdGhlckFwcHMgPSBoZWxwZXJzLnBhcnNlQXJyYXkodGhpcy5vcHRzLm90aGVyQXBwcyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYENvdWxkIG5vdCBwYXJzZSBcIm90aGVyQXBwc1wiIGNhcGFiaWxpdHk6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgICAgb3RoZXJBcHBzID0gYXdhaXQgQi5hbGwob3RoZXJBcHBzLm1hcCgoYXBwKSA9PiB0aGlzLmhlbHBlcnMuY29uZmlndXJlQXBwKGFwcCwgQVBQX0VYVEVOU0lPTikpKTtcbiAgICAgIGF3YWl0IGhlbHBlcnMuaW5zdGFsbE90aGVyQXBrcyhvdGhlckFwcHMsIHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgIH1cblxuICAgIC8vIGluc3RhbGwgYXBwXG4gICAgaWYgKCF0aGlzLm9wdHMuYXBwKSB7XG4gICAgICBpZiAodGhpcy5vcHRzLmZ1bGxSZXNldCkge1xuICAgICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdGdWxsIHJlc2V0IHJlcXVpcmVzIGFuIGFwcCBjYXBhYmlsaXR5LCB1c2UgZmFzdFJlc2V0IGlmIGFwcCBpcyBub3QgcHJvdmlkZWQnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9nLmRlYnVnKCdObyBhcHAgY2FwYWJpbGl0eS4gQXNzdW1pbmcgaXQgaXMgYWxyZWFkeSBvbiB0aGUgZGV2aWNlJyk7XG4gICAgICBpZiAodGhpcy5vcHRzLmZhc3RSZXNldCkge1xuICAgICAgICBhd2FpdCBoZWxwZXJzLnJlc2V0QXBwKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMub3B0cy5za2lwVW5pbnN0YWxsKSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi51bmluc3RhbGxBcGsodGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAgIH1cbiAgICBhd2FpdCBoZWxwZXJzLmluc3RhbGxBcGsodGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gICAgY29uc3QgYXBrU3RyaW5nc0Zvckxhbmd1YWdlID0gYXdhaXQgaGVscGVycy5wdXNoU3RyaW5ncyh0aGlzLm9wdHMubGFuZ3VhZ2UsIHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgIGlmICh0aGlzLm9wdHMubGFuZ3VhZ2UpIHtcbiAgICAgIHRoaXMuYXBrU3RyaW5nc1t0aGlzLm9wdHMubGFuZ3VhZ2VdID0gYXBrU3RyaW5nc0Zvckxhbmd1YWdlO1xuICAgIH1cblxuICAgIC8vIFRoaXMgbXVzdCBydW4gYWZ0ZXIgaW5zdGFsbGluZyB0aGUgYXBrLCBvdGhlcndpc2UgaXQgd291bGQgY2F1c2UgdGhlXG4gICAgLy8gaW5zdGFsbCB0byBmYWlsLiBBbmQgYmVmb3JlIHJ1bm5pbmcgdGhlIGFwcC5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQodGhpcy5vcHRzLnNoYXJlZFByZWZlcmVuY2VzKSkge1xuICAgICAgYXdhaXQgdGhpcy5zZXRTaGFyZWRQcmVmZXJlbmNlcyh0aGlzLm9wdHMpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNoZWNrQXBwUHJlc2VudCAoKSB7XG4gICAgdGhpcy5sb2cuZGVidWcoJ0NoZWNraW5nIHdoZXRoZXIgYXBwIGlzIGFjdHVhbGx5IHByZXNlbnQnKTtcbiAgICBpZiAoIShhd2FpdCBmcy5leGlzdHModGhpcy5vcHRzLmFwcCkpKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBDb3VsZCBub3QgZmluZCBhcHAgYXBrIGF0ICR7dGhpcy5vcHRzLmFwcH1gKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjaGVja1BhY2thZ2VQcmVzZW50ICgpIHtcbiAgICB0aGlzLmxvZy5kZWJ1ZygnQ2hlY2tpbmcgd2hldGhlciBwYWNrYWdlIGlzIHByZXNlbnQgb24gdGhlIGRldmljZScpO1xuICAgIGlmICghKGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsncG0nLCAnbGlzdCcsICdwYWNrYWdlcycsIHRoaXMub3B0cy5hcHBQYWNrYWdlXSkpKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBDb3VsZCBub3QgZmluZCBwYWNrYWdlICR7dGhpcy5vcHRzLmFwcFBhY2thZ2V9IG9uIHRoZSBkZXZpY2VgKTtcbiAgICB9XG4gIH1cblxuICAvLyBTZXQgQ29tcHJlc3NlZExheW91dEhpZXJhcmNoeSBvbiB0aGUgZGV2aWNlXG4gIGFzeW5jIHNldENvbXByZXNzZWRMYXlvdXRIaWVyYXJjaHkgKGNvbXByZXNzKSB7XG4gICAgYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignY29tcHJlc3NlZExheW91dEhpZXJhcmNoeScsIHtjb21wcmVzc0xheW91dDogY29tcHJlc3N9KTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZVNlc3Npb24gKCkge1xuICAgIHRoaXMubG9nLmRlYnVnKCdTaHV0dGluZyBkb3duIEFuZHJvaWQgZHJpdmVyJyk7XG5cbiAgICB0cnkge1xuICAgICAgaWYgKCFfLmlzRW1wdHkodGhpcy5fc2NyZWVuUmVjb3JkaW5nUHJvcGVydGllcykpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zdG9wUmVjb3JkaW5nU2NyZWVuKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoaWduKSB7fVxuXG4gICAgYXdhaXQgaGVscGVycy5yZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnModGhpcy5zZXJ2ZXIsIHRoaXMuc2Vzc2lvbklkKTtcblxuICAgIGF3YWl0IHRoaXMubW9iaWxlU3RvcFNjcmVlblN0cmVhbWluZygpO1xuXG4gICAgYXdhaXQgc3VwZXIuZGVsZXRlU2Vzc2lvbigpO1xuXG4gICAgaWYgKHRoaXMuYm9vdHN0cmFwKSB7XG4gICAgICAvLyBjZXJ0YWluIGNsZWFudXAgd2Ugb25seSBjYXJlIHRvIGRvIGlmIHRoZSBib290c3RyYXAgd2FzIGV2ZXIgcnVuXG4gICAgICBhd2FpdCB0aGlzLnN0b3BDaHJvbWVkcml2ZXJQcm94aWVzKCk7XG4gICAgICBpZiAodGhpcy5vcHRzLnVuaWNvZGVLZXlib2FyZCAmJiB0aGlzLm9wdHMucmVzZXRLZXlib2FyZCAmJiB0aGlzLmRlZmF1bHRJTUUpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFJlc2V0dGluZyBJTUUgdG8gJHt0aGlzLmRlZmF1bHRJTUV9YCk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiPy5zZXRJTUUodGhpcy5kZWZhdWx0SU1FKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5pc0Nocm9tZVNlc3Npb24gJiYgIXRoaXMub3B0cy5kb250U3RvcEFwcE9uUmVzZXQpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGI/LmZvcmNlU3RvcCh0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmFkYj8uZ29Ub0hvbWUoKTtcbiAgICAgIGlmICh0aGlzLm9wdHMuZnVsbFJlc2V0ICYmICF0aGlzLm9wdHMuc2tpcFVuaW5zdGFsbCAmJiAhdGhpcy5hcHBPbkRldmljZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmFkYj8udW5pbnN0YWxsQXBrKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNodXRkb3duKCk7XG4gICAgICB0aGlzLmJvb3RzdHJhcCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFwiQ2FsbGVkIGRlbGV0ZVNlc3Npb24gYnV0IGJvb3RzdHJhcCB3YXNuJ3QgYWN0aXZlXCIpO1xuICAgIH1cbiAgICAvLyBzb21lIGNsZWFudXAgd2Ugd2FudCB0byBkbyByZWdhcmRsZXNzLCBpbiBjYXNlIHdlIGFyZSBzaHV0dGluZyBkb3duXG4gICAgLy8gbWlkLXN0YXJ0dXBcbiAgICBhd2FpdCB0aGlzLmFkYj8uc3RvcExvZ2NhdCgpO1xuICAgIGlmICh0aGlzLnVzZVVubG9ja0hlbHBlckFwcCkge1xuICAgICAgYXdhaXQgdGhpcy5hZGI/LmZvcmNlU3RvcCgnaW8uYXBwaXVtLnVubG9jaycpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fd2FzV2luZG93QW5pbWF0aW9uRGlzYWJsZWQpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ1Jlc3RvcmluZyB3aW5kb3cgYW5pbWF0aW9uIHN0YXRlJyk7XG4gICAgICBhd2FpdCB0aGlzLmFkYj8uc2V0QW5pbWF0aW9uU3RhdGUodHJ1ZSk7XG5cbiAgICAgIC8vIFRoaXMgd2FzIG5lY2Vzc2FyeSB0byBjaGFuZ2UgYW5pbWF0aW9uIHNjYWxlIG92ZXIgQW5kcm9pZCBQLiBXZSBtdXN0IHJlc2V0IHRoZSBwb2xpY3kgZm9yIHRoZSBzZWN1cml0eS5cbiAgICAgIGlmIChhd2FpdCB0aGlzLmFkYj8uZ2V0QXBpTGV2ZWwoKSA+PSAyOCkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKCdSZXN0b3JpbmcgaGlkZGVuIGFwaSBwb2xpY3kgdG8gdGhlIGRldmljZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24nKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGI/LnNldERlZmF1bHRIaWRkZW5BcGlQb2xpY3koISF0aGlzLm9wdHMuaWdub3JlSGlkZGVuQXBpUG9saWN5RXJyb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdHMucmVib290KSB7XG4gICAgICBsZXQgYXZkTmFtZSA9IHRoaXMub3B0cy5hdmQucmVwbGFjZSgnQCcsICcnKTtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBjbG9zaW5nIGVtdWxhdG9yICcke2F2ZE5hbWV9J2ApO1xuICAgICAgYXdhaXQgdGhpcy5hZGI/LmtpbGxFbXVsYXRvcihhdmROYW1lKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzZXRTaGFyZWRQcmVmZXJlbmNlcyAoKSB7XG4gICAgbGV0IHNoYXJlZFByZWZzID0gdGhpcy5vcHRzLnNoYXJlZFByZWZlcmVuY2VzO1xuICAgIHRoaXMubG9nLmluZm8oJ1RyeWluZyB0byBzZXQgc2hhcmVkIHByZWZlcmVuY2VzJyk7XG4gICAgbGV0IG5hbWUgPSBzaGFyZWRQcmVmcy5uYW1lO1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKG5hbWUpKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKGBTa2lwcGluZyBzZXR0aW5nIFNoYXJlZCBwcmVmZXJlbmNlcywgbmFtZSBpcyB1bmRlZmluZWQ6ICR7SlNPTi5zdHJpbmdpZnkoc2hhcmVkUHJlZnMpfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsZXQgcmVtb3RlUGF0aCA9IGAvZGF0YS9kYXRhLyR7dGhpcy5vcHRzLmFwcFBhY2thZ2V9L3NoYXJlZF9wcmVmc2A7XG4gICAgbGV0IHJlbW90ZUZpbGUgPSBgJHtyZW1vdGVQYXRofS8ke25hbWV9LnhtbGA7XG4gICAgbGV0IGxvY2FsUGF0aCA9IGAvdG1wLyR7bmFtZX0ueG1sYDtcbiAgICBsZXQgYnVpbGRlciA9IHRoaXMuZ2V0UHJlZnNCdWlsZGVyKCk7XG4gICAgYnVpbGRlci5idWlsZChzaGFyZWRQcmVmcy5wcmVmcyk7XG4gICAgdGhpcy5sb2cuaW5mbyhgQ3JlYXRpbmcgdGVtcG9yYXJ5IHNoYXJlZCBwcmVmZXJlbmNlczogJHtsb2NhbFBhdGh9YCk7XG4gICAgYnVpbGRlci50b0ZpbGUobG9jYWxQYXRoKTtcbiAgICB0aGlzLmxvZy5pbmZvKGBDcmVhdGluZyBzaGFyZWRfcHJlZnMgcmVtb3RlIGZvbGRlcjogJHtyZW1vdGVQYXRofWApO1xuICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsnbWtkaXInLCAnLXAnLCByZW1vdGVQYXRoXSk7XG4gICAgdGhpcy5sb2cuaW5mbyhgUHVzaGluZyBzaGFyZWRfcHJlZnMgdG8gJHtyZW1vdGVGaWxlfWApO1xuICAgIGF3YWl0IHRoaXMuYWRiLnB1c2gobG9jYWxQYXRoLCByZW1vdGVGaWxlKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgVHJ5aW5nIHRvIHJlbW92ZSBzaGFyZWQgcHJlZmVyZW5jZXMgdGVtcG9yYXJ5IGZpbGVgKTtcbiAgICAgIGlmIChhd2FpdCBmcy5leGlzdHMobG9jYWxQYXRoKSkge1xuICAgICAgICBhd2FpdCBmcy51bmxpbmsobG9jYWxQYXRoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKGBFcnJvciB0cnlpbmcgdG8gcmVtb3ZlIHRlbXBvcmFyeSBmaWxlICR7bG9jYWxQYXRofWApO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGdldFByZWZzQnVpbGRlciAoKSB7XG4gICAgLyogQWRkIHRoaXMgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBTaGFyZWRQcmVmc0J1aWxkZXIgaW5zdGVhZCBvZlxuICAgICAqIGRpcmVjdGx5IGNyZWF0aW5nIHRoZSBvYmplY3Qgb24gc2V0U2hhcmVkUHJlZmVyZW5jZXMgZm9yIHRlc3RpbmcgcHVycG9zZXNcbiAgICAqL1xuICAgIHJldHVybiBuZXcgU2hhcmVkUHJlZnNCdWlsZGVyKCk7XG4gIH1cblxuICB2YWxpZGF0ZURlc2lyZWRDYXBzIChjYXBzKSB7XG4gICAgaWYgKCFzdXBlci52YWxpZGF0ZURlc2lyZWRDYXBzKGNhcHMpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICgoIWNhcHMuYnJvd3Nlck5hbWUgfHwgIWhlbHBlcnMuaXNDaHJvbWVCcm93c2VyKGNhcHMuYnJvd3Nlck5hbWUpKSAmJiAhY2Fwcy5hcHAgJiYgIWNhcHMuYXBwUGFja2FnZSkge1xuICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnVGhlIGRlc2lyZWQgY2FwYWJpbGl0aWVzIG11c3QgaW5jbHVkZSBlaXRoZXIgYW4gYXBwLCBhcHBQYWNrYWdlIG9yIGJyb3dzZXJOYW1lJyk7XG4gICAgfVxuICAgIHJldHVybiBoZWxwZXJzLnZhbGlkYXRlRGVzaXJlZENhcHMoY2Fwcyk7XG4gIH1cblxuICBwcm94eUFjdGl2ZSAoc2Vzc2lvbklkKSB7XG4gICAgc3VwZXIucHJveHlBY3RpdmUoc2Vzc2lvbklkKTtcblxuICAgIHJldHVybiB0aGlzLmp3cFByb3h5QWN0aXZlO1xuICB9XG5cbiAgZ2V0UHJveHlBdm9pZExpc3QgKHNlc3Npb25JZCkge1xuICAgIHN1cGVyLmdldFByb3h5QXZvaWRMaXN0KHNlc3Npb25JZCk7XG5cbiAgICByZXR1cm4gdGhpcy5qd3BQcm94eUF2b2lkO1xuICB9XG5cbiAgY2FuUHJveHkgKHNlc3Npb25JZCkge1xuICAgIHN1cGVyLmNhblByb3h5KHNlc3Npb25JZCk7XG5cbiAgICAvLyB0aGlzIHdpbGwgY2hhbmdlIGRlcGVuZGluZyBvbiBDaHJvbWVEcml2ZXIgc3RhdHVzXG4gICAgcmV0dXJuIF8uaXNGdW5jdGlvbih0aGlzLnByb3h5UmVxUmVzKTtcbiAgfVxufVxuXG5leHBvcnQgeyBBbmRyb2lkRHJpdmVyIH07XG5leHBvcnQgZGVmYXVsdCBBbmRyb2lkRHJpdmVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUEsTUFBTUEsYUFBYSxHQUFHLE1BQU07QUFDNUIsTUFBTUMsV0FBVyxHQUFHLElBQUk7QUFJeEIsTUFBTUMsUUFBUSxHQUFHLENBQ2YsQ0FBQyxNQUFNLEVBQUUsSUFBSUMsTUFBTSxDQUFDLHlCQUF5QixDQUFDLENBQUMsRUFDL0MsQ0FBQyxLQUFLLEVBQUUsSUFBSUEsTUFBTSxDQUFDLHlCQUF5QixDQUFDLENBQUMsRUFDOUMsQ0FBQyxNQUFNLEVBQUUsSUFBSUEsTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUMsRUFDOUMsQ0FBQyxLQUFLLEVBQUUsSUFBSUEsTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUMsRUFDN0MsQ0FBQyxNQUFNLEVBQUUs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