appium-android-driver 5.8.8 → 5.8.10

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.
Files changed (73) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/build/index.js +1 -1
  3. package/build/lib/android-helpers.js +8 -6
  4. package/build/lib/android-helpers.js.map +1 -1
  5. package/build/lib/bootstrap.js +1 -1
  6. package/build/lib/bootstrap.js.map +1 -1
  7. package/build/lib/commands/actions.js +1 -1
  8. package/build/lib/commands/actions.js.map +1 -1
  9. package/build/lib/commands/alert.js +1 -1
  10. package/build/lib/commands/alert.js.map +1 -1
  11. package/build/lib/commands/app-management.js +1 -1
  12. package/build/lib/commands/app-management.js.map +1 -1
  13. package/build/lib/commands/context.js +1 -1
  14. package/build/lib/commands/context.js.map +1 -1
  15. package/build/lib/commands/coverage.js +1 -1
  16. package/build/lib/commands/coverage.js.map +1 -1
  17. package/build/lib/commands/element.js +1 -1
  18. package/build/lib/commands/element.js.map +1 -1
  19. package/build/lib/commands/emu-console.js +1 -1
  20. package/build/lib/commands/emu-console.js.map +1 -1
  21. package/build/lib/commands/execute.js +1 -1
  22. package/build/lib/commands/execute.js.map +1 -1
  23. package/build/lib/commands/file-actions.js +1 -1
  24. package/build/lib/commands/file-actions.js.map +1 -1
  25. package/build/lib/commands/find.js +1 -1
  26. package/build/lib/commands/find.js.map +1 -1
  27. package/build/lib/commands/general.js +1 -1
  28. package/build/lib/commands/general.js.map +1 -1
  29. package/build/lib/commands/ime.js +1 -1
  30. package/build/lib/commands/ime.js.map +1 -1
  31. package/build/lib/commands/index.js +1 -1
  32. package/build/lib/commands/index.js.map +1 -1
  33. package/build/lib/commands/intent.js +1 -1
  34. package/build/lib/commands/intent.js.map +1 -1
  35. package/build/lib/commands/log.js +1 -1
  36. package/build/lib/commands/log.js.map +1 -1
  37. package/build/lib/commands/media-projection.js +1 -1
  38. package/build/lib/commands/media-projection.js.map +1 -1
  39. package/build/lib/commands/network.js +1 -1
  40. package/build/lib/commands/network.js.map +1 -1
  41. package/build/lib/commands/performance.js +1 -1
  42. package/build/lib/commands/performance.js.map +1 -1
  43. package/build/lib/commands/permissions.js +1 -1
  44. package/build/lib/commands/permissions.js.map +1 -1
  45. package/build/lib/commands/recordscreen.js +1 -1
  46. package/build/lib/commands/recordscreen.js.map +1 -1
  47. package/build/lib/commands/shell.js +1 -1
  48. package/build/lib/commands/shell.js.map +1 -1
  49. package/build/lib/commands/streamscreen.js +1 -1
  50. package/build/lib/commands/streamscreen.js.map +1 -1
  51. package/build/lib/commands/system-bars.js +1 -1
  52. package/build/lib/commands/system-bars.js.map +1 -1
  53. package/build/lib/commands/touch.js +1 -1
  54. package/build/lib/commands/touch.js.map +1 -1
  55. package/build/lib/desired-caps.js +1 -1
  56. package/build/lib/desired-caps.js.map +1 -1
  57. package/build/lib/driver.js +1 -1
  58. package/build/lib/driver.js.map +1 -1
  59. package/build/lib/logger.js +1 -1
  60. package/build/lib/logger.js.map +1 -1
  61. package/build/lib/method-map.js +1 -1
  62. package/build/lib/method-map.js.map +1 -1
  63. package/build/lib/uiautomator.js +1 -1
  64. package/build/lib/uiautomator.js.map +1 -1
  65. package/build/lib/unlock-helpers.js +1 -1
  66. package/build/lib/unlock-helpers.js.map +1 -1
  67. package/build/lib/utils.js +1 -1
  68. package/build/lib/utils.js.map +1 -1
  69. package/build/lib/webview-helpers.js +1 -1
  70. package/build/lib/webview-helpers.js.map +1 -1
  71. package/lib/android-helpers.js +12 -8
  72. package/lib/commands/performance.js +17 -0
  73. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"intent.js","names":["NO_VALUE_ARG_TYPE","SUPPORTED_EXTRA_TYPES","API_LEVEL_ANDROID_8","commands","parseIntentSpec","opts","intent","action","uri","mimeType","identifier","categories","component","extras","flags","resultArgs","push","_","isNil","isArray","flatMap","map","cName","package","errors","InvalidArgumentError","item","type","key","value","includes","isEmpty","isString","trim","JSON","stringify","isUndefined","mobileStartActivity","user","wait","stop","windowingMode","activityType","display","cmd","adb","getApiLevel","shell","mobileBroadcast","receiverPermission","allowBackgroundActivityStarts","mobileStartService","foreground","mobileStopService"],"sources":["../../../lib/commands/intent.js"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from 'appium/driver';\n\nconst NO_VALUE_ARG_TYPE = 'sn';\nconst SUPPORTED_EXTRA_TYPES = [\n 's', NO_VALUE_ARG_TYPE, 'z', 'i', 'l', 'f', 'u', 'cn',\n 'ia', 'ial', 'la', 'lal', 'fa', 'fal', 'sa', 'sal',\n];\nconst API_LEVEL_ANDROID_8 = 26;\n\nconst commands = {};\n\nfunction parseIntentSpec (opts = {}) {\n const {\n intent,\n action,\n uri,\n mimeType,\n identifier,\n categories,\n component,\n extras,\n flags,\n } = opts;\n const resultArgs = [];\n if (intent) {\n resultArgs.push(intent);\n }\n if (action) {\n resultArgs.push('-a', action);\n }\n if (uri) {\n resultArgs.push('-d', uri);\n }\n if (mimeType) {\n resultArgs.push('-t', mimeType);\n }\n if (!_.isNil(identifier)) {\n resultArgs.push('-i', identifier);\n }\n if (categories) {\n if (_.isArray(categories)) {\n resultArgs.push(...(_.flatMap(categories.map((cName) => ['-c', cName]))));\n } else {\n resultArgs.push('-c', categories);\n }\n }\n if (component) {\n resultArgs.push('-n', component);\n }\n if (opts.package) {\n resultArgs.push('-p', opts.package);\n }\n if (extras) {\n if (!_.isArray(extras)) {\n throw new errors.InvalidArgumentError(`'extras' must be an array`);\n }\n for (const item of extras) {\n if (!_.isArray(item)) {\n throw new errors.InvalidArgumentError(`Extra argument '${item}' must be an array`);\n }\n const [type, key, value] = item;\n if (!_.includes(SUPPORTED_EXTRA_TYPES, type)) {\n throw new errors.InvalidArgumentError(\n `Extra argument type '${type}' is not known. ` +\n `Supported intent argument types are: ${SUPPORTED_EXTRA_TYPES}`\n );\n }\n if (_.isEmpty(key) || (_.isString(key) && _.trim(key) === '')) {\n throw new errors.InvalidArgumentError(\n `Extra argument's key in '${JSON.stringify(item)}' must be a valid string identifier`\n );\n }\n if (type === NO_VALUE_ARG_TYPE) {\n resultArgs.push(`--e${type}`, key);\n } else if (_.isUndefined(value)) {\n throw new errors.InvalidArgumentError(\n `Intent argument type '${type}' in '${JSON.stringify(item)}' requires a ` +\n `valid value to be provided`\n );\n } else {\n resultArgs.push(`--e${type}`, key, value);\n }\n }\n }\n if (flags) {\n resultArgs.push('-f', flags);\n }\n return resultArgs;\n}\n\n/**\n * @typedef {Object} StartActivityOptions\n * @property {?string|number} user ['current'] - The user ID for which the service is started.\n * The `current` user id is used by default\n * @property {?boolean} wait [false] - Set it to `true` if you want to block the method call\n * until the activity manager's process returns the control to the system.\n * @property {?boolean} stop [false] - Set it to `true` to force stop the target\n * app before starting the activity\n * @property {?number|string} windowingMode - The windowing mode to launch the activity into.\n * Check https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/app/WindowConfiguration.java\n * for more details on possible windowing modes (constants starting with `WINDOWING_MODE_`).\n * @property {?number|string} activityType - The activity type to launch the activity as.\n * Check https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/app/WindowConfiguration.java\n * for more details on possible activity types (constants starting with `ACTIVITY_TYPE_`).\n * @property {?number|string} display - The display identifier to launch the activity into.\n * @property {?string} intent - The name of the activity intent to start, for example\n * `com.some.package.name/.YourServiceSubClassName`\n * @property {?string} action - Action name\n * @property {?string} package - Package name\n * @property {?string} uri - Unified resource identifier\n * @property {?string} mimeType - Mime type\n * @property {?string} identifier - Optional identifier\n * @property {?string|Array<string>} categories - One or more category names\n * @property {?string} component - Component name\n * @property {Array<string|Array<string>>} extras - Optional intent arguments. Must be represented\n * as array of arrays, where each subarray item contains two or three string items:\n * value type, key name and the value itself.\n * Supported value types are:\n * - s: string. Value must be a valid string\n * - sn: null. Value is ignored for this type\n * - z: boolean. Value must be either `true` or `false`\n * - i: integer. Value must be a valid 4-byte integer number\n * - l: long. Value must be a valid 8-byte long number\n * - f: float: Value must be a valid float number\n * - u: uri. Value must be a valid uniform resource identifier string\n * - cn: component name. Value must be a valid component name string\n * - ia: Integer[]. Value must be a string of comma-separated integers\n * - ial: List<Integer>. Value must be a string of comma-separated integers\n * - la: Long[]. Value must be a string of comma-separated long numbers\n * - lal: List<Long>. Value must be a string of comma-separated long numbers\n * - fa: Float[]. Value must be a string of comma-separated float numbers\n * - fal: List<Float>. Value must be a string of comma-separated float numbers\n * - sa: String[]. Value must be comma-separated strings. To embed a comma into a string,\n * escape it using \"\\,\"\n * - sal: List<String>. Value must be comma-separated strings. To embed a comma into a string,\n * escape it using \"\\,\"\n * For example: [['s', 'varName1', 'My String1'], ['s', 'varName2', 'My String2'], ['ia', 'arrName', '1,2,3,4']]\n * @property {?string} flags - Intent startup-specific flags as a hexadecimal string.\n * See https://developer.android.com/reference/android/content/Intent.html\n * for the list of available flag values (constants starting with FLAG_ACTIVITY_).\n * Flag values could be merged using the logical 'or' operation.\n * For example, 0x10200000 is the combination of two flags:\n * 0x10000000 `FLAG_ACTIVITY_NEW_TASK` | 0x00200000 `FLAG_ACTIVITY_RESET_TASK_IF_NEEDED`\n */\n\n/**\n * Starts the given activity intent.\n *\n * @param {StartActivityOptions} opts\n * @returns {string} The command output\n * @throws {Error} If there was a failure while starting the activity\n * or required options are missing\n */\ncommands.mobileStartActivity = async function mobileStartActivity (opts = {}) {\n const {\n user,\n wait,\n stop,\n windowingMode,\n activityType,\n display,\n } = opts;\n const cmd = [\n 'am', (await this.adb.getApiLevel() < API_LEVEL_ANDROID_8) ? 'start' : 'start-activity',\n ];\n if (!_.isNil(user)) {\n cmd.push('--user', user);\n }\n if (wait) {\n cmd.push('-W');\n }\n if (stop) {\n cmd.push('-S');\n }\n if (!_.isNil(windowingMode)) {\n cmd.push('--windowingMode', windowingMode);\n }\n if (!_.isNil(activityType)) {\n cmd.push('--activityType', activityType);\n }\n if (!_.isNil(display)) {\n cmd.push('--display', display);\n }\n cmd.push(...(parseIntentSpec(opts)));\n return await this.adb.shell(cmd);\n};\n\n/**\n * @typedef {Object} BroadcastOptions\n * @property {?string|number} user ['all'] - The user ID for which the broadcast is sent.\n * The `current` alias assumes the current user ID.\n * @property {?string} receiverPermission - Require receiver to hold the given permission.\n * @property {?boolean} allowBackgroundActivityStarts [false] - Whether the receiver may\n * start activities even if in the background.\n * @property {?string} intent - The name of the intent to broadcast to, for example\n * `com.some.package.name/.YourServiceSubClassName`.\n * @property {?string} action - Action name\n * @property {?string} uri - Unified resource identifier\n * @property {?string} mimeType - Mime type\n * @property {?string} identifier - Optional identifier\n * @property {?string|Array<string>} categories - One or more category names\n * @property {?string} component - Component name\n * @property {?string} package - Package name\n * @property {Array<Array<string>>} extras - Optional intent arguments.\n * See above for the detailed description.\n * @property {?string} flags - Intent startup-specific flags as a hexadecimal string.\n * See above for the detailed description.\n */\n\n\n/**\n * Send a broadcast intent.\n *\n * @param {BroadcastOptions} opts\n * @returns {string} The command output\n * @throws {Error} If there was a failure while starting the activity\n * or required options are missing\n */\ncommands.mobileBroadcast = async function mobileBroadcast (opts = {}) {\n const {\n user,\n receiverPermission,\n allowBackgroundActivityStarts,\n } = opts;\n const cmd = ['am', 'broadcast'];\n if (!_.isNil(user)) {\n cmd.push('--user', user);\n }\n if (receiverPermission) {\n cmd.push('--receiver-permission', receiverPermission);\n }\n if (allowBackgroundActivityStarts) {\n cmd.push('--allow-background-activity-starts');\n }\n cmd.push(...(parseIntentSpec(opts)));\n return await this.adb.shell(cmd);\n};\n\n/**\n * @typedef {Object} StartServiceOptions\n * @property {?string|number} user ['current'] - The user ID for which the service is started.\n * The `current` user id is used by default\n * @property {?boolean} foreground [false] - Set it to `true` if your service must be\n * started as foreground service. This option is ignored if the API level of the\n * device under test is below 26 (Android 8).\n * @property {?string} intent - The name of the service intent to start, for example\n * `com.some.package.name/.YourServiceSubClassName`.\n * @property {?string} action - Action name\n * @property {?string} uri - Unified resource identifier\n * @property {?string} mimeType - Mime type\n * @property {?string} identifier - Optional identifier\n * @property {?string|Array<string>} categories - One or more category names\n * @property {?string} component - Component name\n * @property {?string} package - Package name\n * @property {Array<Array<string>>} extras - Optional intent arguments.\n * See above for the detailed description.\n * @property {?string} flags - Intent startup-specific flags as a hexadecimal string.\n * See above for the detailed description.\n */\n\n/**\n * Starts the given service intent.\n *\n * @param {StartServiceOptions} opts\n * @returns {string} The command output\n * @throws {Error} If there was a failure while starting the service\n * or required options are missing\n */\ncommands.mobileStartService = async function mobileStartService (opts = {}) {\n const {\n user,\n foreground,\n } = opts;\n const cmd = ['am'];\n if (await this.adb.getApiLevel() < API_LEVEL_ANDROID_8) {\n cmd.push('startservice');\n } else {\n cmd.push(foreground ? 'start-foreground-service' : 'start-service');\n }\n if (!_.isNil(user)) {\n cmd.push('--user', user);\n }\n cmd.push(...(parseIntentSpec(opts)));\n return await this.adb.shell(cmd);\n};\n\n/**\n * @typedef {Object} StopServiceOptions\n * @property {string|number} user ['current'] - The user ID for which the service is running.\n * The `current` user id is used by default\n * @property {?string} intent - The name of the service intent to stop, for example\n * `com.some.package.name/.YourServiceSubClassName`.\n * @property {?string} action - Action name\n * @property {?string} uri - Unified resource identifier\n * @property {?string} mimeType - Mime type\n * @property {?string} identifier - Optional identifier\n * @property {?string|Array<string>} categories - One or more category names\n * @property {?string} component - Component name\n * @property {?string} package - Package name\n * @property {Array<Array<string>>} extras - Optional intent arguments.\n * See above for the detailed description.\n * @property {?string} flags - See above for the detailed description.\n */\n\n/**\n * Stops the given service intent.\n *\n * @param {StopServiceOptions} opts\n * @returns {string} The command output\n * @throws {Error} If there was a failure while stopping the service\n * or required options are missing\n */\ncommands.mobileStopService = async function mobileStopService (opts = {}) {\n const {\n user,\n } = opts;\n const cmd = [\n 'am',\n (await this.adb.getApiLevel() < API_LEVEL_ANDROID_8) ? 'stopservice' : 'stop-service'\n ];\n if (!_.isNil(user)) {\n cmd.push('--user', user);\n }\n cmd.push(...(parseIntentSpec(opts)));\n return await this.adb.shell(cmd);\n};\n\n\nexport { commands };\nexport default commands;\n"],"mappings":"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"}
1
+ {"version":3,"file":"intent.js","names":["_lodash","_interopRequireDefault","require","_driver","NO_VALUE_ARG_TYPE","SUPPORTED_EXTRA_TYPES","API_LEVEL_ANDROID_8","commands","exports","parseIntentSpec","opts","intent","action","uri","mimeType","identifier","categories","component","extras","flags","resultArgs","push","_","isNil","isArray","flatMap","map","cName","package","errors","InvalidArgumentError","item","type","key","value","includes","isEmpty","isString","trim","JSON","stringify","isUndefined","mobileStartActivity","user","wait","stop","windowingMode","activityType","display","cmd","adb","getApiLevel","shell","mobileBroadcast","receiverPermission","allowBackgroundActivityStarts","mobileStartService","foreground","mobileStopService","_default","default"],"sources":["../../../lib/commands/intent.js"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from 'appium/driver';\n\nconst NO_VALUE_ARG_TYPE = 'sn';\nconst SUPPORTED_EXTRA_TYPES = [\n 's', NO_VALUE_ARG_TYPE, 'z', 'i', 'l', 'f', 'u', 'cn',\n 'ia', 'ial', 'la', 'lal', 'fa', 'fal', 'sa', 'sal',\n];\nconst API_LEVEL_ANDROID_8 = 26;\n\nconst commands = {};\n\nfunction parseIntentSpec (opts = {}) {\n const {\n intent,\n action,\n uri,\n mimeType,\n identifier,\n categories,\n component,\n extras,\n flags,\n } = opts;\n const resultArgs = [];\n if (intent) {\n resultArgs.push(intent);\n }\n if (action) {\n resultArgs.push('-a', action);\n }\n if (uri) {\n resultArgs.push('-d', uri);\n }\n if (mimeType) {\n resultArgs.push('-t', mimeType);\n }\n if (!_.isNil(identifier)) {\n resultArgs.push('-i', identifier);\n }\n if (categories) {\n if (_.isArray(categories)) {\n resultArgs.push(...(_.flatMap(categories.map((cName) => ['-c', cName]))));\n } else {\n resultArgs.push('-c', categories);\n }\n }\n if (component) {\n resultArgs.push('-n', component);\n }\n if (opts.package) {\n resultArgs.push('-p', opts.package);\n }\n if (extras) {\n if (!_.isArray(extras)) {\n throw new errors.InvalidArgumentError(`'extras' must be an array`);\n }\n for (const item of extras) {\n if (!_.isArray(item)) {\n throw new errors.InvalidArgumentError(`Extra argument '${item}' must be an array`);\n }\n const [type, key, value] = item;\n if (!_.includes(SUPPORTED_EXTRA_TYPES, type)) {\n throw new errors.InvalidArgumentError(\n `Extra argument type '${type}' is not known. ` +\n `Supported intent argument types are: ${SUPPORTED_EXTRA_TYPES}`\n );\n }\n if (_.isEmpty(key) || (_.isString(key) && _.trim(key) === '')) {\n throw new errors.InvalidArgumentError(\n `Extra argument's key in '${JSON.stringify(item)}' must be a valid string identifier`\n );\n }\n if (type === NO_VALUE_ARG_TYPE) {\n resultArgs.push(`--e${type}`, key);\n } else if (_.isUndefined(value)) {\n throw new errors.InvalidArgumentError(\n `Intent argument type '${type}' in '${JSON.stringify(item)}' requires a ` +\n `valid value to be provided`\n );\n } else {\n resultArgs.push(`--e${type}`, key, value);\n }\n }\n }\n if (flags) {\n resultArgs.push('-f', flags);\n }\n return resultArgs;\n}\n\n/**\n * @typedef {Object} StartActivityOptions\n * @property {?string|number} user ['current'] - The user ID for which the service is started.\n * The `current` user id is used by default\n * @property {?boolean} wait [false] - Set it to `true` if you want to block the method call\n * until the activity manager's process returns the control to the system.\n * @property {?boolean} stop [false] - Set it to `true` to force stop the target\n * app before starting the activity\n * @property {?number|string} windowingMode - The windowing mode to launch the activity into.\n * Check https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/app/WindowConfiguration.java\n * for more details on possible windowing modes (constants starting with `WINDOWING_MODE_`).\n * @property {?number|string} activityType - The activity type to launch the activity as.\n * Check https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/app/WindowConfiguration.java\n * for more details on possible activity types (constants starting with `ACTIVITY_TYPE_`).\n * @property {?number|string} display - The display identifier to launch the activity into.\n * @property {?string} intent - The name of the activity intent to start, for example\n * `com.some.package.name/.YourServiceSubClassName`\n * @property {?string} action - Action name\n * @property {?string} package - Package name\n * @property {?string} uri - Unified resource identifier\n * @property {?string} mimeType - Mime type\n * @property {?string} identifier - Optional identifier\n * @property {?string|Array<string>} categories - One or more category names\n * @property {?string} component - Component name\n * @property {Array<string|Array<string>>} extras - Optional intent arguments. Must be represented\n * as array of arrays, where each subarray item contains two or three string items:\n * value type, key name and the value itself.\n * Supported value types are:\n * - s: string. Value must be a valid string\n * - sn: null. Value is ignored for this type\n * - z: boolean. Value must be either `true` or `false`\n * - i: integer. Value must be a valid 4-byte integer number\n * - l: long. Value must be a valid 8-byte long number\n * - f: float: Value must be a valid float number\n * - u: uri. Value must be a valid uniform resource identifier string\n * - cn: component name. Value must be a valid component name string\n * - ia: Integer[]. Value must be a string of comma-separated integers\n * - ial: List<Integer>. Value must be a string of comma-separated integers\n * - la: Long[]. Value must be a string of comma-separated long numbers\n * - lal: List<Long>. Value must be a string of comma-separated long numbers\n * - fa: Float[]. Value must be a string of comma-separated float numbers\n * - fal: List<Float>. Value must be a string of comma-separated float numbers\n * - sa: String[]. Value must be comma-separated strings. To embed a comma into a string,\n * escape it using \"\\,\"\n * - sal: List<String>. Value must be comma-separated strings. To embed a comma into a string,\n * escape it using \"\\,\"\n * For example: [['s', 'varName1', 'My String1'], ['s', 'varName2', 'My String2'], ['ia', 'arrName', '1,2,3,4']]\n * @property {?string} flags - Intent startup-specific flags as a hexadecimal string.\n * See https://developer.android.com/reference/android/content/Intent.html\n * for the list of available flag values (constants starting with FLAG_ACTIVITY_).\n * Flag values could be merged using the logical 'or' operation.\n * For example, 0x10200000 is the combination of two flags:\n * 0x10000000 `FLAG_ACTIVITY_NEW_TASK` | 0x00200000 `FLAG_ACTIVITY_RESET_TASK_IF_NEEDED`\n */\n\n/**\n * Starts the given activity intent.\n *\n * @param {StartActivityOptions} opts\n * @returns {string} The command output\n * @throws {Error} If there was a failure while starting the activity\n * or required options are missing\n */\ncommands.mobileStartActivity = async function mobileStartActivity (opts = {}) {\n const {\n user,\n wait,\n stop,\n windowingMode,\n activityType,\n display,\n } = opts;\n const cmd = [\n 'am', (await this.adb.getApiLevel() < API_LEVEL_ANDROID_8) ? 'start' : 'start-activity',\n ];\n if (!_.isNil(user)) {\n cmd.push('--user', user);\n }\n if (wait) {\n cmd.push('-W');\n }\n if (stop) {\n cmd.push('-S');\n }\n if (!_.isNil(windowingMode)) {\n cmd.push('--windowingMode', windowingMode);\n }\n if (!_.isNil(activityType)) {\n cmd.push('--activityType', activityType);\n }\n if (!_.isNil(display)) {\n cmd.push('--display', display);\n }\n cmd.push(...(parseIntentSpec(opts)));\n return await this.adb.shell(cmd);\n};\n\n/**\n * @typedef {Object} BroadcastOptions\n * @property {?string|number} user ['all'] - The user ID for which the broadcast is sent.\n * The `current` alias assumes the current user ID.\n * @property {?string} receiverPermission - Require receiver to hold the given permission.\n * @property {?boolean} allowBackgroundActivityStarts [false] - Whether the receiver may\n * start activities even if in the background.\n * @property {?string} intent - The name of the intent to broadcast to, for example\n * `com.some.package.name/.YourServiceSubClassName`.\n * @property {?string} action - Action name\n * @property {?string} uri - Unified resource identifier\n * @property {?string} mimeType - Mime type\n * @property {?string} identifier - Optional identifier\n * @property {?string|Array<string>} categories - One or more category names\n * @property {?string} component - Component name\n * @property {?string} package - Package name\n * @property {Array<Array<string>>} extras - Optional intent arguments.\n * See above for the detailed description.\n * @property {?string} flags - Intent startup-specific flags as a hexadecimal string.\n * See above for the detailed description.\n */\n\n\n/**\n * Send a broadcast intent.\n *\n * @param {BroadcastOptions} opts\n * @returns {string} The command output\n * @throws {Error} If there was a failure while starting the activity\n * or required options are missing\n */\ncommands.mobileBroadcast = async function mobileBroadcast (opts = {}) {\n const {\n user,\n receiverPermission,\n allowBackgroundActivityStarts,\n } = opts;\n const cmd = ['am', 'broadcast'];\n if (!_.isNil(user)) {\n cmd.push('--user', user);\n }\n if (receiverPermission) {\n cmd.push('--receiver-permission', receiverPermission);\n }\n if (allowBackgroundActivityStarts) {\n cmd.push('--allow-background-activity-starts');\n }\n cmd.push(...(parseIntentSpec(opts)));\n return await this.adb.shell(cmd);\n};\n\n/**\n * @typedef {Object} StartServiceOptions\n * @property {?string|number} user ['current'] - The user ID for which the service is started.\n * The `current` user id is used by default\n * @property {?boolean} foreground [false] - Set it to `true` if your service must be\n * started as foreground service. This option is ignored if the API level of the\n * device under test is below 26 (Android 8).\n * @property {?string} intent - The name of the service intent to start, for example\n * `com.some.package.name/.YourServiceSubClassName`.\n * @property {?string} action - Action name\n * @property {?string} uri - Unified resource identifier\n * @property {?string} mimeType - Mime type\n * @property {?string} identifier - Optional identifier\n * @property {?string|Array<string>} categories - One or more category names\n * @property {?string} component - Component name\n * @property {?string} package - Package name\n * @property {Array<Array<string>>} extras - Optional intent arguments.\n * See above for the detailed description.\n * @property {?string} flags - Intent startup-specific flags as a hexadecimal string.\n * See above for the detailed description.\n */\n\n/**\n * Starts the given service intent.\n *\n * @param {StartServiceOptions} opts\n * @returns {string} The command output\n * @throws {Error} If there was a failure while starting the service\n * or required options are missing\n */\ncommands.mobileStartService = async function mobileStartService (opts = {}) {\n const {\n user,\n foreground,\n } = opts;\n const cmd = ['am'];\n if (await this.adb.getApiLevel() < API_LEVEL_ANDROID_8) {\n cmd.push('startservice');\n } else {\n cmd.push(foreground ? 'start-foreground-service' : 'start-service');\n }\n if (!_.isNil(user)) {\n cmd.push('--user', user);\n }\n cmd.push(...(parseIntentSpec(opts)));\n return await this.adb.shell(cmd);\n};\n\n/**\n * @typedef {Object} StopServiceOptions\n * @property {string|number} user ['current'] - The user ID for which the service is running.\n * The `current` user id is used by default\n * @property {?string} intent - The name of the service intent to stop, for example\n * `com.some.package.name/.YourServiceSubClassName`.\n * @property {?string} action - Action name\n * @property {?string} uri - Unified resource identifier\n * @property {?string} mimeType - Mime type\n * @property {?string} identifier - Optional identifier\n * @property {?string|Array<string>} categories - One or more category names\n * @property {?string} component - Component name\n * @property {?string} package - Package name\n * @property {Array<Array<string>>} extras - Optional intent arguments.\n * See above for the detailed description.\n * @property {?string} flags - See above for the detailed description.\n */\n\n/**\n * Stops the given service intent.\n *\n * @param {StopServiceOptions} opts\n * @returns {string} The command output\n * @throws {Error} If there was a failure while stopping the service\n * or required options are missing\n */\ncommands.mobileStopService = async function mobileStopService (opts = {}) {\n const {\n user,\n } = opts;\n const cmd = [\n 'am',\n (await this.adb.getApiLevel() < API_LEVEL_ANDROID_8) ? 'stopservice' : 'stop-service'\n ];\n if (!_.isNil(user)) {\n cmd.push('--user', user);\n }\n cmd.push(...(parseIntentSpec(opts)));\n return await this.adb.shell(cmd);\n};\n\n\nexport { commands };\nexport default commands;\n"],"mappings":";;;;;;;;AAAA,IAAAA,OAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAEA,MAAME,iBAAiB,GAAG,IAAI;AAC9B,MAAMC,qBAAqB,GAAG,CAC5B,GAAG,EAAED,iBAAiB,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EACrD,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CACnD;AACD,MAAME,mBAAmB,GAAG,EAAE;AAE9B,MAAMC,QAAQ,GAAG,CAAC,CAAC;AAACC,OAAA,CAAAD,QAAA,GAAAA,QAAA;AAEpB,SAASE,eAAeA,CAAEC,IAAI,GAAG,CAAC,CAAC,EAAE;EACnC,MAAM;IACJC,MAAM;IACNC,MAAM;IACNC,GAAG;IACHC,QAAQ;IACRC,UAAU;IACVC,UAAU;IACVC,SAAS;IACTC,MAAM;IACNC;EACF,CAAC,GAAGT,IAAI;EACR,MAAMU,UAAU,GAAG,EAAE;EACrB,IAAIT,MAAM,EAAE;IACVS,UAAU,CAACC,IAAI,CAACV,MAAM,CAAC;EACzB;EACA,IAAIC,MAAM,EAAE;IACVQ,UAAU,CAACC,IAAI,CAAC,IAAI,EAAET,MAAM,CAAC;EAC/B;EACA,IAAIC,GAAG,EAAE;IACPO,UAAU,CAACC,IAAI,CAAC,IAAI,EAAER,GAAG,CAAC;EAC5B;EACA,IAAIC,QAAQ,EAAE;IACZM,UAAU,CAACC,IAAI,CAAC,IAAI,EAAEP,QAAQ,CAAC;EACjC;EACA,IAAI,CAACQ,eAAC,CAACC,KAAK,CAACR,UAAU,CAAC,EAAE;IACxBK,UAAU,CAACC,IAAI,CAAC,IAAI,EAAEN,UAAU,CAAC;EACnC;EACA,IAAIC,UAAU,EAAE;IACd,IAAIM,eAAC,CAACE,OAAO,CAACR,UAAU,CAAC,EAAE;MACzBI,UAAU,CAACC,IAAI,CAAC,GAAIC,eAAC,CAACG,OAAO,CAACT,UAAU,CAACU,GAAG,CAAEC,KAAK,IAAK,CAAC,IAAI,EAAEA,KAAK,CAAC,CAAC,CAAE,CAAC;IAC3E,CAAC,MAAM;MACLP,UAAU,CAACC,IAAI,CAAC,IAAI,EAAEL,UAAU,CAAC;IACnC;EACF;EACA,IAAIC,SAAS,EAAE;IACbG,UAAU,CAACC,IAAI,CAAC,IAAI,EAAEJ,SAAS,CAAC;EAClC;EACA,IAAIP,IAAI,CAACkB,OAAO,EAAE;IAChBR,UAAU,CAACC,IAAI,CAAC,IAAI,EAAEX,IAAI,CAACkB,OAAO,CAAC;EACrC;EACA,IAAIV,MAAM,EAAE;IACV,IAAI,CAACI,eAAC,CAACE,OAAO,CAACN,MAAM,CAAC,EAAE;MACtB,MAAM,IAAIW,cAAM,CAACC,oBAAoB,CAAE,2BAA0B,CAAC;IACpE;IACA,KAAK,MAAMC,IAAI,IAAIb,MAAM,EAAE;MACzB,IAAI,CAACI,eAAC,CAACE,OAAO,CAACO,IAAI,CAAC,EAAE;QACpB,MAAM,IAAIF,cAAM,CAACC,oBAAoB,CAAE,mBAAkBC,IAAK,oBAAmB,CAAC;MACpF;MACA,MAAM,CAACC,IAAI,EAAEC,GAAG,EAAEC,KAAK,CAAC,GAAGH,IAAI;MAC/B,IAAI,CAACT,eAAC,CAACa,QAAQ,CAAC9B,qBAAqB,EAAE2B,IAAI,CAAC,EAAE;QAC5C,MAAM,IAAIH,cAAM,CAACC,oBAAoB,CAClC,wBAAuBE,IAAK,kBAAiB,GAC7C,wCAAuC3B,qBAAsB,EAAC,CAChE;MACH;MACA,IAAIiB,eAAC,CAACc,OAAO,CAACH,GAAG,CAAC,IAAKX,eAAC,CAACe,QAAQ,CAACJ,GAAG,CAAC,IAAIX,eAAC,CAACgB,IAAI,CAACL,GAAG,CAAC,KAAK,EAAG,EAAE;QAC7D,MAAM,IAAIJ,cAAM,CAACC,oBAAoB,CAClC,4BAA2BS,IAAI,CAACC,SAAS,CAACT,IAAI,CAAE,qCAAoC,CACtF;MACH;MACA,IAAIC,IAAI,KAAK5B,iBAAiB,EAAE;QAC9BgB,UAAU,CAACC,IAAI,CAAE,MAAKW,IAAK,EAAC,EAAEC,GAAG,CAAC;MACpC,CAAC,MAAM,IAAIX,eAAC,CAACmB,WAAW,CAACP,KAAK,CAAC,EAAE;QAC/B,MAAM,IAAIL,cAAM,CAACC,oBAAoB,CAClC,yBAAwBE,IAAK,SAAQO,IAAI,CAACC,SAAS,CAACT,IAAI,CAAE,eAAc,GACxE,4BAA2B,CAC7B;MACH,CAAC,MAAM;QACLX,UAAU,CAACC,IAAI,CAAE,MAAKW,IAAK,EAAC,EAAEC,GAAG,EAAEC,KAAK,CAAC;MAC3C;IACF;EACF;EACA,IAAIf,KAAK,EAAE;IACTC,UAAU,CAACC,IAAI,CAAC,IAAI,EAAEF,KAAK,CAAC;EAC9B;EACA,OAAOC,UAAU;AACnB;AAiEAb,QAAQ,CAACmC,mBAAmB,GAAG,eAAeA,mBAAmBA,CAAEhC,IAAI,GAAG,CAAC,CAAC,EAAE;EAC5E,MAAM;IACJiC,IAAI;IACJC,IAAI;IACJC,IAAI;IACJC,aAAa;IACbC,YAAY;IACZC;EACF,CAAC,GAAGtC,IAAI;EACR,MAAMuC,GAAG,GAAG,CACV,IAAI,EAAG,OAAM,IAAI,CAACC,GAAG,CAACC,WAAW,EAAE,IAAG7C,mBAAmB,GAAI,OAAO,GAAG,gBAAgB,CACxF;EACD,IAAI,CAACgB,eAAC,CAACC,KAAK,CAACoB,IAAI,CAAC,EAAE;IAClBM,GAAG,CAAC5B,IAAI,CAAC,QAAQ,EAAEsB,IAAI,CAAC;EAC1B;EACA,IAAIC,IAAI,EAAE;IACRK,GAAG,CAAC5B,IAAI,CAAC,IAAI,CAAC;EAChB;EACA,IAAIwB,IAAI,EAAE;IACRI,GAAG,CAAC5B,IAAI,CAAC,IAAI,CAAC;EAChB;EACA,IAAI,CAACC,eAAC,CAACC,KAAK,CAACuB,aAAa,CAAC,EAAE;IAC3BG,GAAG,CAAC5B,IAAI,CAAC,iBAAiB,EAAEyB,aAAa,CAAC;EAC5C;EACA,IAAI,CAACxB,eAAC,CAACC,KAAK,CAACwB,YAAY,CAAC,EAAE;IAC1BE,GAAG,CAAC5B,IAAI,CAAC,gBAAgB,EAAE0B,YAAY,CAAC;EAC1C;EACA,IAAI,CAACzB,eAAC,CAACC,KAAK,CAACyB,OAAO,CAAC,EAAE;IACrBC,GAAG,CAAC5B,IAAI,CAAC,WAAW,EAAE2B,OAAO,CAAC;EAChC;EACAC,GAAG,CAAC5B,IAAI,CAAC,GAAIZ,eAAe,CAACC,IAAI,CAAE,CAAC;EACpC,OAAO,MAAM,IAAI,CAACwC,GAAG,CAACE,KAAK,CAACH,GAAG,CAAC;AAClC,CAAC;AAiCD1C,QAAQ,CAAC8C,eAAe,GAAG,eAAeA,eAAeA,CAAE3C,IAAI,GAAG,CAAC,CAAC,EAAE;EACpE,MAAM;IACJiC,IAAI;IACJW,kBAAkB;IAClBC;EACF,CAAC,GAAG7C,IAAI;EACR,MAAMuC,GAAG,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC;EAC/B,IAAI,CAAC3B,eAAC,CAACC,KAAK,CAACoB,IAAI,CAAC,EAAE;IAClBM,GAAG,CAAC5B,IAAI,CAAC,QAAQ,EAAEsB,IAAI,CAAC;EAC1B;EACA,IAAIW,kBAAkB,EAAE;IACtBL,GAAG,CAAC5B,IAAI,CAAC,uBAAuB,EAAEiC,kBAAkB,CAAC;EACvD;EACA,IAAIC,6BAA6B,EAAE;IACjCN,GAAG,CAAC5B,IAAI,CAAC,oCAAoC,CAAC;EAChD;EACA4B,GAAG,CAAC5B,IAAI,CAAC,GAAIZ,eAAe,CAACC,IAAI,CAAE,CAAC;EACpC,OAAO,MAAM,IAAI,CAACwC,GAAG,CAACE,KAAK,CAACH,GAAG,CAAC;AAClC,CAAC;AAgCD1C,QAAQ,CAACiD,kBAAkB,GAAG,eAAeA,kBAAkBA,CAAE9C,IAAI,GAAG,CAAC,CAAC,EAAE;EAC1E,MAAM;IACJiC,IAAI;IACJc;EACF,CAAC,GAAG/C,IAAI;EACR,MAAMuC,GAAG,GAAG,CAAC,IAAI,CAAC;EAClB,IAAI,OAAM,IAAI,CAACC,GAAG,CAACC,WAAW,EAAE,IAAG7C,mBAAmB,EAAE;IACtD2C,GAAG,CAAC5B,IAAI,CAAC,cAAc,CAAC;EAC1B,CAAC,MAAM;IACL4B,GAAG,CAAC5B,IAAI,CAACoC,UAAU,GAAG,0BAA0B,GAAG,eAAe,CAAC;EACrE;EACA,IAAI,CAACnC,eAAC,CAACC,KAAK,CAACoB,IAAI,CAAC,EAAE;IAClBM,GAAG,CAAC5B,IAAI,CAAC,QAAQ,EAAEsB,IAAI,CAAC;EAC1B;EACAM,GAAG,CAAC5B,IAAI,CAAC,GAAIZ,eAAe,CAACC,IAAI,CAAE,CAAC;EACpC,OAAO,MAAM,IAAI,CAACwC,GAAG,CAACE,KAAK,CAACH,GAAG,CAAC;AAClC,CAAC;AA4BD1C,QAAQ,CAACmD,iBAAiB,GAAG,eAAeA,iBAAiBA,CAAEhD,IAAI,GAAG,CAAC,CAAC,EAAE;EACxE,MAAM;IACJiC;EACF,CAAC,GAAGjC,IAAI;EACR,MAAMuC,GAAG,GAAG,CACV,IAAI,EACH,OAAM,IAAI,CAACC,GAAG,CAACC,WAAW,EAAE,IAAG7C,mBAAmB,GAAI,aAAa,GAAG,cAAc,CACtF;EACD,IAAI,CAACgB,eAAC,CAACC,KAAK,CAACoB,IAAI,CAAC,EAAE;IAClBM,GAAG,CAAC5B,IAAI,CAAC,QAAQ,EAAEsB,IAAI,CAAC;EAC1B;EACAM,GAAG,CAAC5B,IAAI,CAAC,GAAIZ,eAAe,CAACC,IAAI,CAAE,CAAC;EACpC,OAAO,MAAM,IAAI,CAACwC,GAAG,CAACE,KAAK,CAACH,GAAG,CAAC;AAClC,CAAC;AAAC,IAAAU,QAAA,GAIapD,QAAQ;AAAAC,OAAA,CAAAoD,OAAA,GAAAD,QAAA"}
@@ -119,4 +119,4 @@ commands.getLog = async function getLog(logType) {
119
119
  Object.assign(extensions, commands, helpers);
120
120
  var _default = extensions;
121
121
  exports.default = _default;
122
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJHRVRfU0VSVkVSX0xPR1NfRkVBVFVSRSIsImNvbW1hbmRzIiwiaGVscGVycyIsImV4dGVuc2lvbnMiLCJXRUJTT0NLRVRfRU5EUE9JTlQiLCJzZXNzaW9uSWQiLCJERUZBVUxUX1dTX1BBVEhOQU1FX1BSRUZJWCIsInRvTG9nUmVjb3JkIiwidGltZXN0YW1wIiwibGV2ZWwiLCJtZXNzYWdlIiwic3VwcG9ydGVkTG9nVHlwZXMiLCJsb2djYXQiLCJkZXNjcmlwdGlvbiIsImdldHRlciIsInNlbGYiLCJhZGIiLCJnZXRMb2djYXRMb2dzIiwiYnVncmVwb3J0Iiwib3V0cHV0IiwiRGF0ZSIsIm5vdyIsInNwbGl0Iiwib3MiLCJFT0wiLCJtYXAiLCJ4Iiwic2VydmVyIiwiZW5zdXJlRmVhdHVyZUVuYWJsZWQiLCJsb2ciLCJ1bndyYXAiLCJyZWNvcmQiLCJfIiwiaXNFbXB0eSIsInByZWZpeCIsIm1vYmlsZVN0YXJ0TG9nc0Jyb2FkY2FzdCIsInBhdGhuYW1lIiwiZ2V0V2ViU29ja2V0SGFuZGxlcnMiLCJkZWJ1ZyIsImluZm8iLCJKU09OIiwic3RyaW5naWZ5IiwiYWRkcmVzcyIsIndzcyIsIldlYlNvY2tldCIsIlNlcnZlciIsIm5vU2VydmVyIiwib24iLCJ3cyIsInJlcSIsInJlbW90ZUlwIiwiaGVhZGVycyIsImNvbm5lY3Rpb24iLCJyZW1vdGVBZGRyZXNzIiwiX2xvZ2NhdFdlYnNvY2tldExpc3RlbmVyIiwibG9nUmVjb3JkIiwicmVhZHlTdGF0ZSIsIk9QRU4iLCJzZW5kIiwic2V0TG9nY2F0TGlzdGVuZXIiLCJjb2RlIiwicmVhc29uIiwicmVtb3ZlTG9nY2F0TGlzdGVuZXIiLCJpZ24iLCJjbG9zZU1zZyIsInRvU3RyaW5nIiwiYWRkV2ViU29ja2V0SGFuZGxlciIsIm1vYmlsZVN0b3BMb2dzQnJvYWRjYXN0IiwicmVtb3ZlV2ViU29ja2V0SGFuZGxlciIsImdldExvZ1R5cGVzIiwibmF0aXZlTG9nVHlwZXMiLCJCYXNlRHJpdmVyIiwicHJvdG90eXBlIiwiY2FsbCIsImlzV2ViQ29udGV4dCIsIndlYkxvZ1R5cGVzIiwiY2hyb21lZHJpdmVyIiwiandwcm94eSIsImNvbW1hbmQiLCJnZXRMb2ciLCJsb2dUeXBlIiwia2V5cyIsImluY2x1ZGVzIiwidHlwZSIsIk9iamVjdCIsImFzc2lnbiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9sb2cuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgV2ViU29ja2V0IGZyb20gJ3dzJztcbmltcG9ydCB7IERFRkFVTFRfV1NfUEFUSE5BTUVfUFJFRklYLCBCYXNlRHJpdmVyIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5cbmNvbnN0IEdFVF9TRVJWRVJfTE9HU19GRUFUVVJFID0gJ2dldF9zZXJ2ZXJfbG9ncyc7XG5cbmxldCBjb21tYW5kcyA9IHt9LCBoZWxwZXJzID0ge30sIGV4dGVuc2lvbnMgPSB7fTtcblxuY29uc3QgV0VCU09DS0VUX0VORFBPSU5UID0gKHNlc3Npb25JZCkgPT4gYCR7REVGQVVMVF9XU19QQVRITkFNRV9QUkVGSVh9L3Nlc3Npb24vJHtzZXNzaW9uSWR9L2FwcGl1bS9kZXZpY2UvbG9nY2F0YDtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL1NlbGVuaXVtSFEvc2VsZW5pdW0vYmxvYi8wZDQyNTY3NmIzYzlkZjI2MWRkNjQxOTE3Zjg2N2Q0ZDVjZTc3NzRkL2phdmEvY2xpZW50L3NyYy9vcmcvb3BlbnFhL3NlbGVuaXVtL2xvZ2dpbmcvTG9nRW50cnkuamF2YVxuZnVuY3Rpb24gdG9Mb2dSZWNvcmQgKHRpbWVzdGFtcCwgbGV2ZWwsIG1lc3NhZ2UpIHtcbiAgcmV0dXJuIHtcbiAgICB0aW1lc3RhbXAsXG4gICAgbGV2ZWwsXG4gICAgbWVzc2FnZSxcbiAgfTtcbn1cblxuZXh0ZW5zaW9ucy5zdXBwb3J0ZWRMb2dUeXBlcyA9IHtcbiAgbG9nY2F0OiB7XG4gICAgZGVzY3JpcHRpb246ICdMb2dzIGZvciBBbmRyb2lkIGFwcGxpY2F0aW9ucyBvbiByZWFsIGRldmljZSBhbmQgZW11bGF0b3JzIHZpYSBBREInLFxuICAgIGdldHRlcjogYXN5bmMgKHNlbGYpID0+IGF3YWl0IHNlbGYuYWRiLmdldExvZ2NhdExvZ3MoKSxcbiAgfSxcbiAgYnVncmVwb3J0OiB7XG4gICAgZGVzY3JpcHRpb246IGAnYWRiIGJ1Z3JlcG9ydCcgb3V0cHV0IGZvciBhZHZhbmNlZCBpc3N1ZXMgZGlhZ25vc3RpY2AsXG4gICAgZ2V0dGVyOiBhc3luYyAoc2VsZikgPT4ge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgc2VsZi5hZGIuYnVncmVwb3J0KCk7XG4gICAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgICAgcmV0dXJuIG91dHB1dC5zcGxpdChvcy5FT0wpXG4gICAgICAgIC5tYXAoKHgpID0+IHRvTG9nUmVjb3JkKHRpbWVzdGFtcCwgJ0FMTCcsIHgpKTtcbiAgICB9LFxuICB9LFxuICBzZXJ2ZXI6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FwcGl1bSBzZXJ2ZXIgbG9ncycsXG4gICAgZ2V0dGVyOiAoc2VsZikgPT4ge1xuICAgICAgc2VsZi5lbnN1cmVGZWF0dXJlRW5hYmxlZChHRVRfU0VSVkVSX0xPR1NfRkVBVFVSRSk7XG4gICAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgICAgcmV0dXJuIGxvZy51bndyYXAoKS5yZWNvcmRcbiAgICAgICAgLm1hcCgoeCkgPT4gdG9Mb2dSZWNvcmQodGltZXN0YW1wLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQUxMJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5pc0VtcHR5KHgucHJlZml4KSA/IHgubWVzc2FnZSA6IGBbJHt4LnByZWZpeH1dICR7eC5tZXNzYWdlfWApXG4gICAgICAgICk7XG4gICAgfSxcbiAgfSxcbn07XG5cbi8qKlxuICogU3RhcnRzIEFuZHJvaWQgbG9nY2F0IGJyb2FkY2FzdCB3ZWJzb2NrZXQgb24gdGhlIHNhbWUgaG9zdCBhbmQgcG9ydFxuICogd2hlcmUgQXBwaXVtIHNlcnZlciBpcyBydW5uaW5nIGF0IGAvd3Mvc2Vzc2lvbi86c2Vzc2lvbklkOi9hcHBpdW0vbG9nY2F0YCBlbmRwb2ludC4gVGhlIG1ldGhvZFxuICogd2lsbCByZXR1cm4gaW1tZWRpYXRlbHkgaWYgdGhlIHdlYiBzb2NrZXQgaXMgYWxyZWFkeSBsaXN0ZW5pbmcuXG4gKlxuICogRWFjaCBjb25uZWN0ZWQgd2Vic29ja2V0IGxpc3RlbmVyIHdpbGwgcmVjZWl2ZSBsb2djYXQgbG9nIGxpbmVzXG4gKiBhcyBzb29uIGFzIHRoZXkgYXJlIHZpc2libGUgdG8gQXBwaXVtLlxuICovXG5jb21tYW5kcy5tb2JpbGVTdGFydExvZ3NCcm9hZGNhc3QgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVTdGFydExvZ3NCcm9hZGNhc3QgKCkge1xuICBjb25zdCBwYXRobmFtZSA9IFdFQlNPQ0tFVF9FTkRQT0lOVCh0aGlzLnNlc3Npb25JZCk7XG4gIGlmICghXy5pc0VtcHR5KGF3YWl0IHRoaXMuc2VydmVyLmdldFdlYlNvY2tldEhhbmRsZXJzKHBhdGhuYW1lKSkpIHtcbiAgICBsb2cuZGVidWcoYFRoZSBsb2djYXQgYnJvYWRjYXN0aW5nIHdlYiBzb2NrZXQgc2VydmVyIGlzIGFscmVhZHkgbGlzdGVuaW5nIGF0ICR7cGF0aG5hbWV9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbG9nLmluZm8oYFN0YXJ0aW5nIGxvZ2NhdCBicm9hZGNhc3Rpbmcgb24gd2ViIHNvY2tldCBzZXJ2ZXIgYCArXG4gICAgYCR7SlNPTi5zdHJpbmdpZnkodGhpcy5zZXJ2ZXIuYWRkcmVzcygpKX0gdG8gJHtwYXRobmFtZX1gKTtcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3dlYnNvY2tldHMvd3MvYmxvYi9tYXN0ZXIvZG9jL3dzLm1kXG4gIGNvbnN0IHdzcyA9IG5ldyBXZWJTb2NrZXQuU2VydmVyKHtcbiAgICBub1NlcnZlcjogdHJ1ZSxcbiAgfSk7XG4gIHdzcy5vbignY29ubmVjdGlvbicsICh3cywgcmVxKSA9PiB7XG4gICAgaWYgKHJlcSkge1xuICAgICAgY29uc3QgcmVtb3RlSXAgPSBfLmlzRW1wdHkocmVxLmhlYWRlcnNbJ3gtZm9yd2FyZGVkLWZvciddKVxuICAgICAgICA/IHJlcS5jb25uZWN0aW9uPy5yZW1vdGVBZGRyZXNzXG4gICAgICAgIDogcmVxLmhlYWRlcnNbJ3gtZm9yd2FyZGVkLWZvciddO1xuICAgICAgbG9nLmRlYnVnKGBFc3RhYmxpc2hlZCBhIG5ldyBsb2djYXQgbGlzdGVuZXIgd2ViIHNvY2tldCBjb25uZWN0aW9uIGZyb20gJHtyZW1vdGVJcH1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmRlYnVnKCdFc3RhYmxpc2hlZCBhIG5ldyBsb2djYXQgbGlzdGVuZXIgd2ViIHNvY2tldCBjb25uZWN0aW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKF8uaXNFbXB0eSh0aGlzLl9sb2djYXRXZWJzb2NrZXRMaXN0ZW5lcikpIHtcbiAgICAgIHRoaXMuX2xvZ2NhdFdlYnNvY2tldExpc3RlbmVyID0gKGxvZ1JlY29yZCkgPT4ge1xuICAgICAgICBpZiAod3M/LnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOKSB7XG4gICAgICAgICAgd3Muc2VuZChsb2dSZWNvcmQubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIHRoaXMuYWRiLnNldExvZ2NhdExpc3RlbmVyKHRoaXMuX2xvZ2NhdFdlYnNvY2tldExpc3RlbmVyKTtcblxuICAgIHdzLm9uKCdjbG9zZScsIChjb2RlLCByZWFzb24pID0+IHtcbiAgICAgIGlmICghXy5pc0VtcHR5KHRoaXMuX2xvZ2NhdFdlYnNvY2tldExpc3RlbmVyKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMuYWRiLnJlbW92ZUxvZ2NhdExpc3RlbmVyKHRoaXMuX2xvZ2NhdFdlYnNvY2tldExpc3RlbmVyKTtcbiAgICAgICAgfSBjYXRjaCAoaWduKSB7fVxuICAgICAgICB0aGlzLl9sb2djYXRXZWJzb2NrZXRMaXN0ZW5lciA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGxldCBjbG9zZU1zZyA9ICdMb2djYXQgbGlzdGVuZXIgd2ViIHNvY2tldCBpcyBjbG9zZWQuJztcbiAgICAgIGlmICghXy5pc0VtcHR5KGNvZGUpKSB7XG4gICAgICAgIGNsb3NlTXNnICs9IGAgQ29kZTogJHtjb2RlfS5gO1xuICAgICAgfVxuICAgICAgaWYgKCFfLmlzRW1wdHkocmVhc29uKSkge1xuICAgICAgICBjbG9zZU1zZyArPSBgIFJlYXNvbjogJHtyZWFzb24udG9TdHJpbmcoKX0uYDtcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhjbG9zZU1zZyk7XG4gICAgfSk7XG4gIH0pO1xuICBhd2FpdCB0aGlzLnNlcnZlci5hZGRXZWJTb2NrZXRIYW5kbGVyKHBhdGhuYW1lLCB3c3MpO1xufTtcblxuLyoqXG4gKiBTdG9wcyB0aGUgcHJldmlvdXNseSBzdGFydGVkIGxvZ2NhdCBicm9hZGNhc3Rpbmcgd2Vzb2NrZXQgc2VydmVyLlxuICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gaW1tZWRpYXRlbHkgaWYgbm8gc2VydmVyIGlzIHJ1bm5pbmcuXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVN0b3BMb2dzQnJvYWRjYXN0ID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU3RvcExvZ3NCcm9hZGNhc3QgKCkge1xuICBjb25zdCBwYXRobmFtZSA9IFdFQlNPQ0tFVF9FTkRQT0lOVCh0aGlzLnNlc3Npb25JZCk7XG4gIGlmIChfLmlzRW1wdHkoYXdhaXQgdGhpcy5zZXJ2ZXIuZ2V0V2ViU29ja2V0SGFuZGxlcnMocGF0aG5hbWUpKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxvZy5kZWJ1ZyhgU3RvcHBpbmcgbG9nY2F0IGJyb2FkY2FzdGluZyBvbiB3ZWIgc29ja2V0IHNlcnZlciBgICtcbiAgICBgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnNlcnZlci5hZGRyZXNzKCkpfSB0byAke3BhdGhuYW1lfWApO1xuICBhd2FpdCB0aGlzLnNlcnZlci5yZW1vdmVXZWJTb2NrZXRIYW5kbGVyKHBhdGhuYW1lKTtcbn07XG5cbmNvbW1hbmRzLmdldExvZ1R5cGVzID0gYXN5bmMgZnVuY3Rpb24gZ2V0TG9nVHlwZXMgKCkge1xuICBjb25zdCBuYXRpdmVMb2dUeXBlcyA9IGF3YWl0IEJhc2VEcml2ZXIucHJvdG90eXBlLmdldExvZ1R5cGVzLmNhbGwodGhpcyk7XG4gIGlmICh0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgY29uc3Qgd2ViTG9nVHlwZXMgPSBhd2FpdCB0aGlzLmNocm9tZWRyaXZlci5qd3Byb3h5LmNvbW1hbmQoJy9sb2cvdHlwZXMnLCAnR0VUJyk7XG4gICAgcmV0dXJuIFsuLi5uYXRpdmVMb2dUeXBlcywgLi4ud2ViTG9nVHlwZXNdO1xuICB9XG4gIHJldHVybiBuYXRpdmVMb2dUeXBlcztcbn07XG5cbmNvbW1hbmRzLmdldExvZyA9IGFzeW5jIGZ1bmN0aW9uIGdldExvZyAobG9nVHlwZSkge1xuICBpZiAodGhpcy5pc1dlYkNvbnRleHQoKSAmJiAhXy5rZXlzKHRoaXMuc3VwcG9ydGVkTG9nVHlwZXMpLmluY2x1ZGVzKGxvZ1R5cGUpKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY2hyb21lZHJpdmVyLmp3cHJveHkuY29tbWFuZCgnL2xvZycsICdQT1NUJywge3R5cGU6IGxvZ1R5cGV9KTtcbiAgfVxuICByZXR1cm4gYXdhaXQgQmFzZURyaXZlci5wcm90b3R5cGUuZ2V0TG9nLmNhbGwodGhpcywgbG9nVHlwZSk7XG59O1xuXG5PYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIGNvbW1hbmRzLCBoZWxwZXJzKTtcbmV4cG9ydCB7IGNvbW1hbmRzLCBoZWxwZXJzIH07XG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7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
122
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9nZ2VyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfb3MiLCJfbG9kYXNoIiwiX3dzIiwiX2RyaXZlciIsIkdFVF9TRVJWRVJfTE9HU19GRUFUVVJFIiwiY29tbWFuZHMiLCJoZWxwZXJzIiwiZXh0ZW5zaW9ucyIsImV4cG9ydHMiLCJXRUJTT0NLRVRfRU5EUE9JTlQiLCJzZXNzaW9uSWQiLCJERUZBVUxUX1dTX1BBVEhOQU1FX1BSRUZJWCIsInRvTG9nUmVjb3JkIiwidGltZXN0YW1wIiwibGV2ZWwiLCJtZXNzYWdlIiwic3VwcG9ydGVkTG9nVHlwZXMiLCJsb2djYXQiLCJkZXNjcmlwdGlvbiIsImdldHRlciIsInNlbGYiLCJhZGIiLCJnZXRMb2djYXRMb2dzIiwiYnVncmVwb3J0Iiwib3V0cHV0IiwiRGF0ZSIsIm5vdyIsInNwbGl0Iiwib3MiLCJFT0wiLCJtYXAiLCJ4Iiwic2VydmVyIiwiZW5zdXJlRmVhdHVyZUVuYWJsZWQiLCJsb2ciLCJ1bndyYXAiLCJyZWNvcmQiLCJfIiwiaXNFbXB0eSIsInByZWZpeCIsIm1vYmlsZVN0YXJ0TG9nc0Jyb2FkY2FzdCIsInBhdGhuYW1lIiwiZ2V0V2ViU29ja2V0SGFuZGxlcnMiLCJkZWJ1ZyIsImluZm8iLCJKU09OIiwic3RyaW5naWZ5IiwiYWRkcmVzcyIsIndzcyIsIldlYlNvY2tldCIsIlNlcnZlciIsIm5vU2VydmVyIiwib24iLCJ3cyIsInJlcSIsIl9yZXEkY29ubmVjdGlvbiIsInJlbW90ZUlwIiwiaGVhZGVycyIsImNvbm5lY3Rpb24iLCJyZW1vdGVBZGRyZXNzIiwiX2xvZ2NhdFdlYnNvY2tldExpc3RlbmVyIiwibG9nUmVjb3JkIiwicmVhZHlTdGF0ZSIsIk9QRU4iLCJzZW5kIiwic2V0TG9nY2F0TGlzdGVuZXIiLCJjb2RlIiwicmVhc29uIiwicmVtb3ZlTG9nY2F0TGlzdGVuZXIiLCJpZ24iLCJjbG9zZU1zZyIsInRvU3RyaW5nIiwiYWRkV2ViU29ja2V0SGFuZGxlciIsIm1vYmlsZVN0b3BMb2dzQnJvYWRjYXN0IiwicmVtb3ZlV2ViU29ja2V0SGFuZGxlciIsImdldExvZ1R5cGVzIiwibmF0aXZlTG9nVHlwZXMiLCJCYXNlRHJpdmVyIiwicHJvdG90eXBlIiwiY2FsbCIsImlzV2ViQ29udGV4dCIsIndlYkxvZ1R5cGVzIiwiY2hyb21lZHJpdmVyIiwiandwcm94eSIsImNvbW1hbmQiLCJnZXRMb2ciLCJsb2dUeXBlIiwia2V5cyIsImluY2x1ZGVzIiwidHlwZSIsIk9iamVjdCIsImFzc2lnbiIsIl9kZWZhdWx0IiwiZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9sb2cuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgV2ViU29ja2V0IGZyb20gJ3dzJztcbmltcG9ydCB7IERFRkFVTFRfV1NfUEFUSE5BTUVfUFJFRklYLCBCYXNlRHJpdmVyIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5cbmNvbnN0IEdFVF9TRVJWRVJfTE9HU19GRUFUVVJFID0gJ2dldF9zZXJ2ZXJfbG9ncyc7XG5cbmxldCBjb21tYW5kcyA9IHt9LCBoZWxwZXJzID0ge30sIGV4dGVuc2lvbnMgPSB7fTtcblxuY29uc3QgV0VCU09DS0VUX0VORFBPSU5UID0gKHNlc3Npb25JZCkgPT4gYCR7REVGQVVMVF9XU19QQVRITkFNRV9QUkVGSVh9L3Nlc3Npb24vJHtzZXNzaW9uSWR9L2FwcGl1bS9kZXZpY2UvbG9nY2F0YDtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL1NlbGVuaXVtSFEvc2VsZW5pdW0vYmxvYi8wZDQyNTY3NmIzYzlkZjI2MWRkNjQxOTE3Zjg2N2Q0ZDVjZTc3NzRkL2phdmEvY2xpZW50L3NyYy9vcmcvb3BlbnFhL3NlbGVuaXVtL2xvZ2dpbmcvTG9nRW50cnkuamF2YVxuZnVuY3Rpb24gdG9Mb2dSZWNvcmQgKHRpbWVzdGFtcCwgbGV2ZWwsIG1lc3NhZ2UpIHtcbiAgcmV0dXJuIHtcbiAgICB0aW1lc3RhbXAsXG4gICAgbGV2ZWwsXG4gICAgbWVzc2FnZSxcbiAgfTtcbn1cblxuZXh0ZW5zaW9ucy5zdXBwb3J0ZWRMb2dUeXBlcyA9IHtcbiAgbG9nY2F0OiB7XG4gICAgZGVzY3JpcHRpb246ICdMb2dzIGZvciBBbmRyb2lkIGFwcGxpY2F0aW9ucyBvbiByZWFsIGRldmljZSBhbmQgZW11bGF0b3JzIHZpYSBBREInLFxuICAgIGdldHRlcjogYXN5bmMgKHNlbGYpID0+IGF3YWl0IHNlbGYuYWRiLmdldExvZ2NhdExvZ3MoKSxcbiAgfSxcbiAgYnVncmVwb3J0OiB7XG4gICAgZGVzY3JpcHRpb246IGAnYWRiIGJ1Z3JlcG9ydCcgb3V0cHV0IGZvciBhZHZhbmNlZCBpc3N1ZXMgZGlhZ25vc3RpY2AsXG4gICAgZ2V0dGVyOiBhc3luYyAoc2VsZikgPT4ge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgc2VsZi5hZGIuYnVncmVwb3J0KCk7XG4gICAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgICAgcmV0dXJuIG91dHB1dC5zcGxpdChvcy5FT0wpXG4gICAgICAgIC5tYXAoKHgpID0+IHRvTG9nUmVjb3JkKHRpbWVzdGFtcCwgJ0FMTCcsIHgpKTtcbiAgICB9LFxuICB9LFxuICBzZXJ2ZXI6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FwcGl1bSBzZXJ2ZXIgbG9ncycsXG4gICAgZ2V0dGVyOiAoc2VsZikgPT4ge1xuICAgICAgc2VsZi5lbnN1cmVGZWF0dXJlRW5hYmxlZChHRVRfU0VSVkVSX0xPR1NfRkVBVFVSRSk7XG4gICAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgICAgcmV0dXJuIGxvZy51bndyYXAoKS5yZWNvcmRcbiAgICAgICAgLm1hcCgoeCkgPT4gdG9Mb2dSZWNvcmQodGltZXN0YW1wLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQUxMJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5pc0VtcHR5KHgucHJlZml4KSA/IHgubWVzc2FnZSA6IGBbJHt4LnByZWZpeH1dICR7eC5tZXNzYWdlfWApXG4gICAgICAgICk7XG4gICAgfSxcbiAgfSxcbn07XG5cbi8qKlxuICogU3RhcnRzIEFuZHJvaWQgbG9nY2F0IGJyb2FkY2FzdCB3ZWJzb2NrZXQgb24gdGhlIHNhbWUgaG9zdCBhbmQgcG9ydFxuICogd2hlcmUgQXBwaXVtIHNlcnZlciBpcyBydW5uaW5nIGF0IGAvd3Mvc2Vzc2lvbi86c2Vzc2lvbklkOi9hcHBpdW0vbG9nY2F0YCBlbmRwb2ludC4gVGhlIG1ldGhvZFxuICogd2lsbCByZXR1cm4gaW1tZWRpYXRlbHkgaWYgdGhlIHdlYiBzb2NrZXQgaXMgYWxyZWFkeSBsaXN0ZW5pbmcuXG4gKlxuICogRWFjaCBjb25uZWN0ZWQgd2Vic29ja2V0IGxpc3RlbmVyIHdpbGwgcmVjZWl2ZSBsb2djYXQgbG9nIGxpbmVzXG4gKiBhcyBzb29uIGFzIHRoZXkgYXJlIHZpc2libGUgdG8gQXBwaXVtLlxuICovXG5jb21tYW5kcy5tb2JpbGVTdGFydExvZ3NCcm9hZGNhc3QgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVTdGFydExvZ3NCcm9hZGNhc3QgKCkge1xuICBjb25zdCBwYXRobmFtZSA9IFdFQlNPQ0tFVF9FTkRQT0lOVCh0aGlzLnNlc3Npb25JZCk7XG4gIGlmICghXy5pc0VtcHR5KGF3YWl0IHRoaXMuc2VydmVyLmdldFdlYlNvY2tldEhhbmRsZXJzKHBhdGhuYW1lKSkpIHtcbiAgICBsb2cuZGVidWcoYFRoZSBsb2djYXQgYnJvYWRjYXN0aW5nIHdlYiBzb2NrZXQgc2VydmVyIGlzIGFscmVhZHkgbGlzdGVuaW5nIGF0ICR7cGF0aG5hbWV9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbG9nLmluZm8oYFN0YXJ0aW5nIGxvZ2NhdCBicm9hZGNhc3Rpbmcgb24gd2ViIHNvY2tldCBzZXJ2ZXIgYCArXG4gICAgYCR7SlNPTi5zdHJpbmdpZnkodGhpcy5zZXJ2ZXIuYWRkcmVzcygpKX0gdG8gJHtwYXRobmFtZX1gKTtcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3dlYnNvY2tldHMvd3MvYmxvYi9tYXN0ZXIvZG9jL3dzLm1kXG4gIGNvbnN0IHdzcyA9IG5ldyBXZWJTb2NrZXQuU2VydmVyKHtcbiAgICBub1NlcnZlcjogdHJ1ZSxcbiAgfSk7XG4gIHdzcy5vbignY29ubmVjdGlvbicsICh3cywgcmVxKSA9PiB7XG4gICAgaWYgKHJlcSkge1xuICAgICAgY29uc3QgcmVtb3RlSXAgPSBfLmlzRW1wdHkocmVxLmhlYWRlcnNbJ3gtZm9yd2FyZGVkLWZvciddKVxuICAgICAgICA/IHJlcS5jb25uZWN0aW9uPy5yZW1vdGVBZGRyZXNzXG4gICAgICAgIDogcmVxLmhlYWRlcnNbJ3gtZm9yd2FyZGVkLWZvciddO1xuICAgICAgbG9nLmRlYnVnKGBFc3RhYmxpc2hlZCBhIG5ldyBsb2djYXQgbGlzdGVuZXIgd2ViIHNvY2tldCBjb25uZWN0aW9uIGZyb20gJHtyZW1vdGVJcH1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmRlYnVnKCdFc3RhYmxpc2hlZCBhIG5ldyBsb2djYXQgbGlzdGVuZXIgd2ViIHNvY2tldCBjb25uZWN0aW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKF8uaXNFbXB0eSh0aGlzLl9sb2djYXRXZWJzb2NrZXRMaXN0ZW5lcikpIHtcbiAgICAgIHRoaXMuX2xvZ2NhdFdlYnNvY2tldExpc3RlbmVyID0gKGxvZ1JlY29yZCkgPT4ge1xuICAgICAgICBpZiAod3M/LnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOKSB7XG4gICAgICAgICAgd3Muc2VuZChsb2dSZWNvcmQubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIHRoaXMuYWRiLnNldExvZ2NhdExpc3RlbmVyKHRoaXMuX2xvZ2NhdFdlYnNvY2tldExpc3RlbmVyKTtcblxuICAgIHdzLm9uKCdjbG9zZScsIChjb2RlLCByZWFzb24pID0+IHtcbiAgICAgIGlmICghXy5pc0VtcHR5KHRoaXMuX2xvZ2NhdFdlYnNvY2tldExpc3RlbmVyKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMuYWRiLnJlbW92ZUxvZ2NhdExpc3RlbmVyKHRoaXMuX2xvZ2NhdFdlYnNvY2tldExpc3RlbmVyKTtcbiAgICAgICAgfSBjYXRjaCAoaWduKSB7fVxuICAgICAgICB0aGlzLl9sb2djYXRXZWJzb2NrZXRMaXN0ZW5lciA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGxldCBjbG9zZU1zZyA9ICdMb2djYXQgbGlzdGVuZXIgd2ViIHNvY2tldCBpcyBjbG9zZWQuJztcbiAgICAgIGlmICghXy5pc0VtcHR5KGNvZGUpKSB7XG4gICAgICAgIGNsb3NlTXNnICs9IGAgQ29kZTogJHtjb2RlfS5gO1xuICAgICAgfVxuICAgICAgaWYgKCFfLmlzRW1wdHkocmVhc29uKSkge1xuICAgICAgICBjbG9zZU1zZyArPSBgIFJlYXNvbjogJHtyZWFzb24udG9TdHJpbmcoKX0uYDtcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhjbG9zZU1zZyk7XG4gICAgfSk7XG4gIH0pO1xuICBhd2FpdCB0aGlzLnNlcnZlci5hZGRXZWJTb2NrZXRIYW5kbGVyKHBhdGhuYW1lLCB3c3MpO1xufTtcblxuLyoqXG4gKiBTdG9wcyB0aGUgcHJldmlvdXNseSBzdGFydGVkIGxvZ2NhdCBicm9hZGNhc3Rpbmcgd2Vzb2NrZXQgc2VydmVyLlxuICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gaW1tZWRpYXRlbHkgaWYgbm8gc2VydmVyIGlzIHJ1bm5pbmcuXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVN0b3BMb2dzQnJvYWRjYXN0ID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU3RvcExvZ3NCcm9hZGNhc3QgKCkge1xuICBjb25zdCBwYXRobmFtZSA9IFdFQlNPQ0tFVF9FTkRQT0lOVCh0aGlzLnNlc3Npb25JZCk7XG4gIGlmIChfLmlzRW1wdHkoYXdhaXQgdGhpcy5zZXJ2ZXIuZ2V0V2ViU29ja2V0SGFuZGxlcnMocGF0aG5hbWUpKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxvZy5kZWJ1ZyhgU3RvcHBpbmcgbG9nY2F0IGJyb2FkY2FzdGluZyBvbiB3ZWIgc29ja2V0IHNlcnZlciBgICtcbiAgICBgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnNlcnZlci5hZGRyZXNzKCkpfSB0byAke3BhdGhuYW1lfWApO1xuICBhd2FpdCB0aGlzLnNlcnZlci5yZW1vdmVXZWJTb2NrZXRIYW5kbGVyKHBhdGhuYW1lKTtcbn07XG5cbmNvbW1hbmRzLmdldExvZ1R5cGVzID0gYXN5bmMgZnVuY3Rpb24gZ2V0TG9nVHlwZXMgKCkge1xuICBjb25zdCBuYXRpdmVMb2dUeXBlcyA9IGF3YWl0IEJhc2VEcml2ZXIucHJvdG90eXBlLmdldExvZ1R5cGVzLmNhbGwodGhpcyk7XG4gIGlmICh0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgY29uc3Qgd2ViTG9nVHlwZXMgPSBhd2FpdCB0aGlzLmNocm9tZWRyaXZlci5qd3Byb3h5LmNvbW1hbmQoJy9sb2cvdHlwZXMnLCAnR0VUJyk7XG4gICAgcmV0dXJuIFsuLi5uYXRpdmVMb2dUeXBlcywgLi4ud2ViTG9nVHlwZXNdO1xuICB9XG4gIHJldHVybiBuYXRpdmVMb2dUeXBlcztcbn07XG5cbmNvbW1hbmRzLmdldExvZyA9IGFzeW5jIGZ1bmN0aW9uIGdldExvZyAobG9nVHlwZSkge1xuICBpZiAodGhpcy5pc1dlYkNvbnRleHQoKSAmJiAhXy5rZXlzKHRoaXMuc3VwcG9ydGVkTG9nVHlwZXMpLmluY2x1ZGVzKGxvZ1R5cGUpKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY2hyb21lZHJpdmVyLmp3cHJveHkuY29tbWFuZCgnL2xvZycsICdQT1NUJywge3R5cGU6IGxvZ1R5cGV9KTtcbiAgfVxuICByZXR1cm4gYXdhaXQgQmFzZURyaXZlci5wcm90b3R5cGUuZ2V0TG9nLmNhbGwodGhpcywgbG9nVHlwZSk7XG59O1xuXG5PYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIGNvbW1hbmRzLCBoZWxwZXJzKTtcbmV4cG9ydCB7IGNvbW1hbmRzLCBoZWxwZXJzIH07XG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLEdBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLE9BQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLEdBQUEsR0FBQUosc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFJLE9BQUEsR0FBQUosT0FBQTtBQUVBLE1BQU1LLHVCQUF1QixHQUFHLGlCQUFpQjtBQUVqRCxJQUFJQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0VBQUVDLE9BQU8sR0FBRyxDQUFDLENBQUM7RUFBRUMsVUFBVSxHQUFHLENBQUMsQ0FBQztBQUFDQyxPQUFBLENBQUFGLE9BQUEsR0FBQUEsT0FBQTtBQUFBRSxPQUFBLENBQUFILFFBQUEsR0FBQUEsUUFBQTtBQUVqRCxNQUFNSSxrQkFBa0IsR0FBSUMsU0FBUyxJQUFNLEdBQUVDLGtDQUEyQixZQUFXRCxTQUFVLHVCQUFzQjtBQUduSCxTQUFTRSxXQUFXQSxDQUFFQyxTQUFTLEVBQUVDLEtBQUssRUFBRUMsT0FBTyxFQUFFO0VBQy9DLE9BQU87SUFDTEYsU0FBUztJQUNUQyxLQUFLO0lBQ0xDO0VBQ0YsQ0FBQztBQUNIO0FBRUFSLFVBQVUsQ0FBQ1MsaUJBQWlCLEdBQUc7RUFDN0JDLE1BQU0sRUFBRTtJQUNOQyxXQUFXLEVBQUUsb0VBQW9FO0lBQ2pGQyxNQUFNLEVBQUUsTUFBT0MsSUFBSSxJQUFLLE1BQU1BLElBQUksQ0FBQ0MsR0FBRyxDQUFDQyxhQUFhO0VBQ3RELENBQUM7RUFDREMsU0FBUyxFQUFFO0lBQ1RMLFdBQVcsRUFBRyx1REFBc0Q7SUFDcEVDLE1BQU0sRUFBRSxNQUFPQyxJQUFJLElBQUs7TUFDdEIsTUFBTUksTUFBTSxHQUFHLE1BQU1K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
@@ -1 +1 @@
1
- {"version":3,"file":"log.js","names":["GET_SERVER_LOGS_FEATURE","commands","helpers","extensions","WEBSOCKET_ENDPOINT","sessionId","DEFAULT_WS_PATHNAME_PREFIX","toLogRecord","timestamp","level","message","supportedLogTypes","logcat","description","getter","self","adb","getLogcatLogs","bugreport","output","Date","now","split","os","EOL","map","x","server","ensureFeatureEnabled","log","unwrap","record","_","isEmpty","prefix","mobileStartLogsBroadcast","pathname","getWebSocketHandlers","debug","info","JSON","stringify","address","wss","WebSocket","Server","noServer","on","ws","req","remoteIp","headers","connection","remoteAddress","_logcatWebsocketListener","logRecord","readyState","OPEN","send","setLogcatListener","code","reason","removeLogcatListener","ign","closeMsg","toString","addWebSocketHandler","mobileStopLogsBroadcast","removeWebSocketHandler","getLogTypes","nativeLogTypes","BaseDriver","prototype","call","isWebContext","webLogTypes","chromedriver","jwproxy","command","getLog","logType","keys","includes","type","Object","assign"],"sources":["../../../lib/commands/log.js"],"sourcesContent":["import log from '../logger';\nimport os from 'os';\nimport _ from 'lodash';\nimport WebSocket from 'ws';\nimport { DEFAULT_WS_PATHNAME_PREFIX, BaseDriver } from 'appium/driver';\n\nconst GET_SERVER_LOGS_FEATURE = 'get_server_logs';\n\nlet commands = {}, helpers = {}, extensions = {};\n\nconst WEBSOCKET_ENDPOINT = (sessionId) => `${DEFAULT_WS_PATHNAME_PREFIX}/session/${sessionId}/appium/device/logcat`;\n\n// https://github.com/SeleniumHQ/selenium/blob/0d425676b3c9df261dd641917f867d4d5ce7774d/java/client/src/org/openqa/selenium/logging/LogEntry.java\nfunction toLogRecord (timestamp, level, message) {\n return {\n timestamp,\n level,\n message,\n };\n}\n\nextensions.supportedLogTypes = {\n logcat: {\n description: 'Logs for Android applications on real device and emulators via ADB',\n getter: async (self) => await self.adb.getLogcatLogs(),\n },\n bugreport: {\n description: `'adb bugreport' output for advanced issues diagnostic`,\n getter: async (self) => {\n const output = await self.adb.bugreport();\n const timestamp = Date.now();\n return output.split(os.EOL)\n .map((x) => toLogRecord(timestamp, 'ALL', x));\n },\n },\n server: {\n description: 'Appium server logs',\n getter: (self) => {\n self.ensureFeatureEnabled(GET_SERVER_LOGS_FEATURE);\n const timestamp = Date.now();\n return log.unwrap().record\n .map((x) => toLogRecord(timestamp,\n 'ALL',\n _.isEmpty(x.prefix) ? x.message : `[${x.prefix}] ${x.message}`)\n );\n },\n },\n};\n\n/**\n * Starts Android logcat broadcast websocket on the same host and port\n * where Appium server is running at `/ws/session/:sessionId:/appium/logcat` endpoint. The method\n * will return immediately if the web socket is already listening.\n *\n * Each connected websocket listener will receive logcat log lines\n * as soon as they are visible to Appium.\n */\ncommands.mobileStartLogsBroadcast = async function mobileStartLogsBroadcast () {\n const pathname = WEBSOCKET_ENDPOINT(this.sessionId);\n if (!_.isEmpty(await this.server.getWebSocketHandlers(pathname))) {\n log.debug(`The logcat broadcasting web socket server is already listening at ${pathname}`);\n return;\n }\n\n log.info(`Starting logcat broadcasting on web socket server ` +\n `${JSON.stringify(this.server.address())} to ${pathname}`);\n // https://github.com/websockets/ws/blob/master/doc/ws.md\n const wss = new WebSocket.Server({\n noServer: true,\n });\n wss.on('connection', (ws, req) => {\n if (req) {\n const remoteIp = _.isEmpty(req.headers['x-forwarded-for'])\n ? req.connection?.remoteAddress\n : req.headers['x-forwarded-for'];\n log.debug(`Established a new logcat listener web socket connection from ${remoteIp}`);\n } else {\n log.debug('Established a new logcat listener web socket connection');\n }\n\n if (_.isEmpty(this._logcatWebsocketListener)) {\n this._logcatWebsocketListener = (logRecord) => {\n if (ws?.readyState === WebSocket.OPEN) {\n ws.send(logRecord.message);\n }\n };\n }\n this.adb.setLogcatListener(this._logcatWebsocketListener);\n\n ws.on('close', (code, reason) => {\n if (!_.isEmpty(this._logcatWebsocketListener)) {\n try {\n this.adb.removeLogcatListener(this._logcatWebsocketListener);\n } catch (ign) {}\n this._logcatWebsocketListener = null;\n }\n\n let closeMsg = 'Logcat listener web socket is closed.';\n if (!_.isEmpty(code)) {\n closeMsg += ` Code: ${code}.`;\n }\n if (!_.isEmpty(reason)) {\n closeMsg += ` Reason: ${reason.toString()}.`;\n }\n log.debug(closeMsg);\n });\n });\n await this.server.addWebSocketHandler(pathname, wss);\n};\n\n/**\n * Stops the previously started logcat broadcasting wesocket server.\n * This method will return immediately if no server is running.\n */\ncommands.mobileStopLogsBroadcast = async function mobileStopLogsBroadcast () {\n const pathname = WEBSOCKET_ENDPOINT(this.sessionId);\n if (_.isEmpty(await this.server.getWebSocketHandlers(pathname))) {\n return;\n }\n\n log.debug(`Stopping logcat broadcasting on web socket server ` +\n `${JSON.stringify(this.server.address())} to ${pathname}`);\n await this.server.removeWebSocketHandler(pathname);\n};\n\ncommands.getLogTypes = async function getLogTypes () {\n const nativeLogTypes = await BaseDriver.prototype.getLogTypes.call(this);\n if (this.isWebContext()) {\n const webLogTypes = await this.chromedriver.jwproxy.command('/log/types', 'GET');\n return [...nativeLogTypes, ...webLogTypes];\n }\n return nativeLogTypes;\n};\n\ncommands.getLog = async function getLog (logType) {\n if (this.isWebContext() && !_.keys(this.supportedLogTypes).includes(logType)) {\n return await this.chromedriver.jwproxy.command('/log', 'POST', {type: logType});\n }\n return await BaseDriver.prototype.getLog.call(this, logType);\n};\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers };\nexport default extensions;\n"],"mappings":"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"}
1
+ {"version":3,"file":"log.js","names":["_logger","_interopRequireDefault","require","_os","_lodash","_ws","_driver","GET_SERVER_LOGS_FEATURE","commands","helpers","extensions","exports","WEBSOCKET_ENDPOINT","sessionId","DEFAULT_WS_PATHNAME_PREFIX","toLogRecord","timestamp","level","message","supportedLogTypes","logcat","description","getter","self","adb","getLogcatLogs","bugreport","output","Date","now","split","os","EOL","map","x","server","ensureFeatureEnabled","log","unwrap","record","_","isEmpty","prefix","mobileStartLogsBroadcast","pathname","getWebSocketHandlers","debug","info","JSON","stringify","address","wss","WebSocket","Server","noServer","on","ws","req","_req$connection","remoteIp","headers","connection","remoteAddress","_logcatWebsocketListener","logRecord","readyState","OPEN","send","setLogcatListener","code","reason","removeLogcatListener","ign","closeMsg","toString","addWebSocketHandler","mobileStopLogsBroadcast","removeWebSocketHandler","getLogTypes","nativeLogTypes","BaseDriver","prototype","call","isWebContext","webLogTypes","chromedriver","jwproxy","command","getLog","logType","keys","includes","type","Object","assign","_default","default"],"sources":["../../../lib/commands/log.js"],"sourcesContent":["import log from '../logger';\nimport os from 'os';\nimport _ from 'lodash';\nimport WebSocket from 'ws';\nimport { DEFAULT_WS_PATHNAME_PREFIX, BaseDriver } from 'appium/driver';\n\nconst GET_SERVER_LOGS_FEATURE = 'get_server_logs';\n\nlet commands = {}, helpers = {}, extensions = {};\n\nconst WEBSOCKET_ENDPOINT = (sessionId) => `${DEFAULT_WS_PATHNAME_PREFIX}/session/${sessionId}/appium/device/logcat`;\n\n// https://github.com/SeleniumHQ/selenium/blob/0d425676b3c9df261dd641917f867d4d5ce7774d/java/client/src/org/openqa/selenium/logging/LogEntry.java\nfunction toLogRecord (timestamp, level, message) {\n return {\n timestamp,\n level,\n message,\n };\n}\n\nextensions.supportedLogTypes = {\n logcat: {\n description: 'Logs for Android applications on real device and emulators via ADB',\n getter: async (self) => await self.adb.getLogcatLogs(),\n },\n bugreport: {\n description: `'adb bugreport' output for advanced issues diagnostic`,\n getter: async (self) => {\n const output = await self.adb.bugreport();\n const timestamp = Date.now();\n return output.split(os.EOL)\n .map((x) => toLogRecord(timestamp, 'ALL', x));\n },\n },\n server: {\n description: 'Appium server logs',\n getter: (self) => {\n self.ensureFeatureEnabled(GET_SERVER_LOGS_FEATURE);\n const timestamp = Date.now();\n return log.unwrap().record\n .map((x) => toLogRecord(timestamp,\n 'ALL',\n _.isEmpty(x.prefix) ? x.message : `[${x.prefix}] ${x.message}`)\n );\n },\n },\n};\n\n/**\n * Starts Android logcat broadcast websocket on the same host and port\n * where Appium server is running at `/ws/session/:sessionId:/appium/logcat` endpoint. The method\n * will return immediately if the web socket is already listening.\n *\n * Each connected websocket listener will receive logcat log lines\n * as soon as they are visible to Appium.\n */\ncommands.mobileStartLogsBroadcast = async function mobileStartLogsBroadcast () {\n const pathname = WEBSOCKET_ENDPOINT(this.sessionId);\n if (!_.isEmpty(await this.server.getWebSocketHandlers(pathname))) {\n log.debug(`The logcat broadcasting web socket server is already listening at ${pathname}`);\n return;\n }\n\n log.info(`Starting logcat broadcasting on web socket server ` +\n `${JSON.stringify(this.server.address())} to ${pathname}`);\n // https://github.com/websockets/ws/blob/master/doc/ws.md\n const wss = new WebSocket.Server({\n noServer: true,\n });\n wss.on('connection', (ws, req) => {\n if (req) {\n const remoteIp = _.isEmpty(req.headers['x-forwarded-for'])\n ? req.connection?.remoteAddress\n : req.headers['x-forwarded-for'];\n log.debug(`Established a new logcat listener web socket connection from ${remoteIp}`);\n } else {\n log.debug('Established a new logcat listener web socket connection');\n }\n\n if (_.isEmpty(this._logcatWebsocketListener)) {\n this._logcatWebsocketListener = (logRecord) => {\n if (ws?.readyState === WebSocket.OPEN) {\n ws.send(logRecord.message);\n }\n };\n }\n this.adb.setLogcatListener(this._logcatWebsocketListener);\n\n ws.on('close', (code, reason) => {\n if (!_.isEmpty(this._logcatWebsocketListener)) {\n try {\n this.adb.removeLogcatListener(this._logcatWebsocketListener);\n } catch (ign) {}\n this._logcatWebsocketListener = null;\n }\n\n let closeMsg = 'Logcat listener web socket is closed.';\n if (!_.isEmpty(code)) {\n closeMsg += ` Code: ${code}.`;\n }\n if (!_.isEmpty(reason)) {\n closeMsg += ` Reason: ${reason.toString()}.`;\n }\n log.debug(closeMsg);\n });\n });\n await this.server.addWebSocketHandler(pathname, wss);\n};\n\n/**\n * Stops the previously started logcat broadcasting wesocket server.\n * This method will return immediately if no server is running.\n */\ncommands.mobileStopLogsBroadcast = async function mobileStopLogsBroadcast () {\n const pathname = WEBSOCKET_ENDPOINT(this.sessionId);\n if (_.isEmpty(await this.server.getWebSocketHandlers(pathname))) {\n return;\n }\n\n log.debug(`Stopping logcat broadcasting on web socket server ` +\n `${JSON.stringify(this.server.address())} to ${pathname}`);\n await this.server.removeWebSocketHandler(pathname);\n};\n\ncommands.getLogTypes = async function getLogTypes () {\n const nativeLogTypes = await BaseDriver.prototype.getLogTypes.call(this);\n if (this.isWebContext()) {\n const webLogTypes = await this.chromedriver.jwproxy.command('/log/types', 'GET');\n return [...nativeLogTypes, ...webLogTypes];\n }\n return nativeLogTypes;\n};\n\ncommands.getLog = async function getLog (logType) {\n if (this.isWebContext() && !_.keys(this.supportedLogTypes).includes(logType)) {\n return await this.chromedriver.jwproxy.command('/log', 'POST', {type: logType});\n }\n return await BaseDriver.prototype.getLog.call(this, logType);\n};\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers };\nexport default extensions;\n"],"mappings":"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"}
@@ -189,4 +189,4 @@ commands.mobileStopMediaProjectionRecording = async function mobileStopMediaProj
189
189
  };
190
190
  var _default = commands;
191
191
  exports.default = _default;
192
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kcyIsIkRFRkFVTFRfRVhUIiwiUkVDT1JESU5HX1NUQVJUVVBfVElNRU9VVF9NUyIsIlJFQ09SRElOR19TVE9QX1RJTUVPVVRfTVMiLCJNSU5fQVBJX0xFVkVMIiwiUkVDT1JESU5HX1NFUlZJQ0VfTkFNRSIsIlNFVFRJTkdTX0hFTFBFUl9QS0dfSUQiLCJSRUNPUkRJTkdfQUNUSVZJVFlfTkFNRSIsIlJFQ09SRElOR19BQ1RJT05fU1RBUlQiLCJSRUNPUkRJTkdfQUNUSU9OX1NUT1AiLCJSRUNPUkRJTkdTX1JPT1QiLCJERUZBVUxUX0ZJTEVOQU1FX0ZPUk1BVCIsInVwbG9hZFJlY29yZGVkTWVkaWEiLCJsb2NhbEZpbGUiLCJyZW1vdGVQYXRoIiwidXBsb2FkT3B0aW9ucyIsIl8iLCJpc0VtcHR5IiwidXRpbCIsInRvSW5NZW1vcnlCYXNlNjQiLCJ0b1N0cmluZyIsInVzZXIiLCJwYXNzIiwibWV0aG9kIiwiaGVhZGVycyIsImZpbGVGaWVsZE5hbWUiLCJmb3JtRmllbGRzIiwib3B0aW9ucyIsImF1dGgiLCJuZXQiLCJ1cGxvYWRGaWxlIiwiYWRqdXN0TWVkaWFFeHRlbnNpb24iLCJuYW1lIiwidG9Mb3dlciIsImVuZHNXaXRoIiwidmVyaWZ5TWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nSXNTdXBwb3J0ZWQiLCJhZGIiLCJhcGlMZXZlbCIsImdldEFwaUxldmVsIiwiRXJyb3IiLCJNZWRpYVByb2plY3Rpb25SZWNvcmRlciIsImNvbnN0cnVjdG9yIiwiaXNSdW5uaW5nIiwic3Rkb3V0Iiwic2hlbGwiLCJpbmNsdWRlcyIsInN0YXJ0Iiwib3B0cyIsImNsZWFudXAiLCJmaWxlbmFtZSIsIm1heER1cmF0aW9uU2VjIiwicHJpb3JpdHkiLCJyZXNvbHV0aW9uIiwiYXJncyIsInB1c2giLCJCIiwicmVzb2x2ZSIsInJlamVjdCIsInNldFRpbWVvdXQiLCJwdWxsUmVjZW50IiwicmVjb3JkaW5ncyIsImxzIiwiZHN0UGF0aCIsInBhdGgiLCJqb2luIiwidGVtcERpciIsIm9wZW5EaXIiLCJwdWxsIiwic3RvcCIsIndhaXRGb3JDb25kaXRpb24iLCJ3YWl0TXMiLCJpbnRlcnZhbE1zIiwiZSIsIm1vYmlsZVN0YXJ0TWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nIiwicmVjb3JkZXIiLCJmbmFtZSIsIm1vbWVudCIsImZvcm1hdCIsImRpZFN0YXJ0IiwibG9nIiwiaW5mbyIsIm1vYmlsZUlzTWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nUnVubmluZyIsIm1vYmlsZVN0b3BNZWRpYVByb2plY3Rpb25SZWNvcmRpbmciLCJyZWNlbnRSZWNvcmRpbmdQYXRoIiwic2l6ZSIsImZzIiwic3RhdCIsImRlYnVnIiwidG9SZWFkYWJsZVNpemVTdHJpbmciLCJyaW1yYWYiLCJkaXJuYW1lIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL21lZGlhLXByb2plY3Rpb24uanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IHdhaXRGb3JDb25kaXRpb24gfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyB1dGlsLCBmcywgbmV0LCB0ZW1wRGlyIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHsgU0VUVElOR1NfSEVMUEVSX1BLR19JRCB9IGZyb20gJy4uL2FuZHJvaWQtaGVscGVycyc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cblxuY29uc3QgY29tbWFuZHMgPSB7fTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9pby5hcHBpdW0uc2V0dGluZ3MjaW50ZXJuYWwtYXVkaW8tLXZpZGVvLXJlY29yZGluZ1xuY29uc3QgREVGQVVMVF9FWFQgPSAnLm1wNCc7XG5jb25zdCBSRUNPUkRJTkdfU1RBUlRVUF9USU1FT1VUX01TID0gMyAqIDEwMDA7XG5jb25zdCBSRUNPUkRJTkdfU1RPUF9USU1FT1VUX01TID0gMyAqIDEwMDA7XG5jb25zdCBNSU5fQVBJX0xFVkVMID0gMjk7XG5jb25zdCBSRUNPUkRJTkdfU0VSVklDRV9OQU1FID0gYCR7U0VUVElOR1NfSEVMUEVSX1BLR19JRH0vLnJlY29yZGVyLlJlY29yZGVyU2VydmljZWA7XG5jb25zdCBSRUNPUkRJTkdfQUNUSVZJVFlfTkFNRSA9IGAke1NFVFRJTkdTX0hFTFBFUl9QS0dfSUR9L2lvLmFwcGl1bS5zZXR0aW5ncy5TZXR0aW5nc2A7XG5jb25zdCBSRUNPUkRJTkdfQUNUSU9OX1NUQVJUID0gYCR7U0VUVElOR1NfSEVMUEVSX1BLR19JRH0ucmVjb3JkaW5nLkFDVElPTl9TVEFSVGA7XG5jb25zdCBSRUNPUkRJTkdfQUNUSU9OX1NUT1AgPSBgJHtTRVRUSU5HU19IRUxQRVJfUEtHX0lEfS5yZWNvcmRpbmcuQUNUSU9OX1NUT1BgO1xuY29uc3QgUkVDT1JESU5HU19ST09UID0gYC9zdG9yYWdlL2VtdWxhdGVkLzAvQW5kcm9pZC9kYXRhLyR7U0VUVElOR1NfSEVMUEVSX1BLR19JRH0vZmlsZXNgO1xuY29uc3QgREVGQVVMVF9GSUxFTkFNRV9GT1JNQVQgPSAnWVlZWS1NTS1ERFRISC1tbS1zcyc7XG5cblxuYXN5bmMgZnVuY3Rpb24gdXBsb2FkUmVjb3JkZWRNZWRpYSAobG9jYWxGaWxlLCByZW1vdGVQYXRoID0gbnVsbCwgdXBsb2FkT3B0aW9ucyA9IHt9KSB7XG4gIGlmIChfLmlzRW1wdHkocmVtb3RlUGF0aCkpIHtcbiAgICByZXR1cm4gKGF3YWl0IHV0aWwudG9Jbk1lbW9yeUJhc2U2NChsb2NhbEZpbGUpKS50b1N0cmluZygpO1xuICB9XG5cbiAgY29uc3Qge3VzZXIsIHBhc3MsIG1ldGhvZCwgaGVhZGVycywgZmlsZUZpZWxkTmFtZSwgZm9ybUZpZWxkc30gPSB1cGxvYWRPcHRpb25zO1xuICBjb25zdCBvcHRpb25zID0ge1xuICAgIG1ldGhvZDogbWV0aG9kIHx8ICdQVVQnLFxuICAgIGhlYWRlcnMsXG4gICAgZmlsZUZpZWxkTmFtZSxcbiAgICBmb3JtRmllbGRzLFxuICB9O1xuICBpZiAodXNlciAmJiBwYXNzKSB7XG4gICAgb3B0aW9ucy5hdXRoID0ge3VzZXIsIHBhc3N9O1xuICB9XG4gIGF3YWl0IG5ldC51cGxvYWRGaWxlKGxvY2FsRmlsZSwgcmVtb3RlUGF0aCwgb3B0aW9ucyk7XG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gYWRqdXN0TWVkaWFFeHRlbnNpb24gKG5hbWUpIHtcbiAgcmV0dXJuIF8udG9Mb3dlcihuYW1lKS5lbmRzV2l0aChERUZBVUxUX0VYVCkgPyBuYW1lIDogYCR7bmFtZX0ke0RFRkFVTFRfRVhUfWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHZlcmlmeU1lZGlhUHJvamVjdGlvblJlY29yZGluZ0lzU3VwcG9ydGVkIChhZGIpIHtcbiAgY29uc3QgYXBpTGV2ZWwgPSBhd2FpdCBhZGIuZ2V0QXBpTGV2ZWwoKTtcbiAgaWYgKGFwaUxldmVsIDwgTUlOX0FQSV9MRVZFTCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWVkaWEgcHJvamVjdGlvbi1iYXNlZCByZWNvcmRpbmcgaXMgbm90IGF2YWlsYWJsZSBvbiBBUEkgTGV2ZWwgJHthcGlMZXZlbH0uIGAgK1xuICAgICAgYE1pbmltdW0gcmVxdWlyZWQgQVBJIExldmVsIGlzICR7TUlOX0FQSV9MRVZFTH0uYCk7XG4gIH1cbn1cblxuXG5jbGFzcyBNZWRpYVByb2plY3Rpb25SZWNvcmRlciB7XG4gIGNvbnN0cnVjdG9yIChhZGIpIHtcbiAgICB0aGlzLmFkYiA9IGFkYjtcbiAgfVxuXG4gIGFzeW5jIGlzUnVubmluZyAoKSB7XG4gICAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoW1xuICAgICAgJ2R1bXBzeXMnLCAnYWN0aXZpdHknLCAnc2VydmljZXMnLCBSRUNPUkRJTkdfU0VSVklDRV9OQU1FXG4gICAgXSk7XG4gICAgcmV0dXJuIHN0ZG91dC5pbmNsdWRlcyhSRUNPUkRJTkdfU0VSVklDRV9OQU1FKTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0IChvcHRzID0ge30pIHtcbiAgICBpZiAoYXdhaXQgdGhpcy5pc1J1bm5pbmcoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuY2xlYW51cCgpO1xuICAgIGNvbnN0IHtcbiAgICAgIGZpbGVuYW1lLFxuICAgICAgbWF4RHVyYXRpb25TZWMsXG4gICAgICBwcmlvcml0eSxcbiAgICAgIHJlc29sdXRpb24sXG4gICAgfSA9IG9wdHM7XG4gICAgY29uc3QgYXJncyA9IFtcbiAgICAgICdhbScsICdzdGFydCcsXG4gICAgICAnLW4nLCBSRUNPUkRJTkdfQUNUSVZJVFlfTkFNRSxcbiAgICAgICctYScsIFJFQ09SRElOR19BQ1RJT05fU1RBUlQsXG4gICAgXTtcbiAgICBpZiAoZmlsZW5hbWUpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1lcycsICdmaWxlbmFtZScsIGZpbGVuYW1lKTtcbiAgICB9XG4gICAgaWYgKG1heER1cmF0aW9uU2VjKSB7XG4gICAgICBhcmdzLnB1c2goJy0tZXMnLCAnbWF4X2R1cmF0aW9uX3NlYycsIGAke21heER1cmF0aW9uU2VjfWApO1xuICAgIH1cbiAgICBpZiAocHJpb3JpdHkpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1lcycsICdwcmlvcml0eScsIHByaW9yaXR5KTtcbiAgICB9XG4gICAgaWYgKHJlc29sdXRpb24pIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1lcycsICdyZXNvbHV0aW9uJywgcmVzb2x1dGlvbik7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKGFyZ3MpO1xuICAgIGF3YWl0IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoIWF3YWl0IHRoaXMuaXNSdW5uaW5nKCkpIHtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBUaGUgbWVkaWEgcHJvamVjdGlvbiByZWNvcmRpbmcgaXMgbm90IHJ1bm5pbmcgYWZ0ZXIgJHtSRUNPUkRJTkdfU1RBUlRVUF9USU1FT1VUX01TfW1zLiBgICtcbiAgICAgICAgICAgIGBQbGVhc2UgY2hlY2sgdGhlIGxvZ2NhdCBvdXRwdXQgZm9yIG1vcmUgZGV0YWlscy5gXG4gICAgICAgICAgKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSwgUkVDT1JESU5HX1NUQVJUVVBfVElNRU9VVF9NUyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBhc3luYyBjbGVhbnVwICgpIHtcbiAgICBhd2FpdCB0aGlzLmFkYi5zaGVsbChbYHJtIC1mICR7UkVDT1JESU5HU19ST09UfS8qYF0pO1xuICB9XG5cbiAgYXN5bmMgcHVsbFJlY2VudCAoKSB7XG4gICAgY29uc3QgcmVjb3JkaW5ncyA9IGF3YWl0IHRoaXMuYWRiLmxzKFJFQ09SRElOR1NfUk9PVCwgWyctdHInXSk7XG4gICAgaWYgKF8uaXNFbXB0eShyZWNvcmRpbmdzKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZHN0UGF0aCA9IHBhdGguam9pbihhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKSwgcmVjb3JkaW5nc1swXSk7XG4gICAgYXdhaXQgdGhpcy5hZGIucHVsbChgJHtSRUNPUkRJTkdTX1JPT1R9LyR7cmVjb3JkaW5nc1swXX1gLCBkc3RQYXRoKTtcbiAgICByZXR1cm4gZHN0UGF0aDtcbiAgfVxuXG4gIGFzeW5jIHN0b3AgKCkge1xuICAgIGlmICghYXdhaXQgdGhpcy5pc1J1bm5pbmcoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFtcbiAgICAgICdhbScsICdzdGFydCcsXG4gICAgICAnLW4nLCBSRUNPUkRJTkdfQUNUSVZJVFlfTkFNRSxcbiAgICAgICctYScsIFJFQ09SRElOR19BQ1RJT05fU1RPUCxcbiAgICBdKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiAhKGF3YWl0IHRoaXMuaXNSdW5uaW5nKCkpLCB7XG4gICAgICAgIHdhaXRNczogUkVDT1JESU5HX1NUT1BfVElNRU9VVF9NUyxcbiAgICAgICAgaW50ZXJ2YWxNczogNTAwLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhlIGF0dGVtcHQgdG8gc3RvcCB0aGUgY3VycmVudCBtZWRpYSBwcm9qZWN0aW9uIHJlY29yZGluZyB0aW1lZCBvdXQgYWZ0ZXIgYCArXG4gICAgICAgIGAke1JFQ09SRElOR19TVE9QX1RJTUVPVVRfTVN9bXNgXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU3RhcnRSZWNvcmRpbmdPcHRpb25zXG4gKlxuICogQHByb3BlcnR5IHtzdHJpbmc/fSByZXNvbHV0aW9uIE1heGltdW0gc3VwcG9ydGVkIHJlc29sdXRpb24gb24tZGV2aWNlIChEZXRlY3RlZFxuICogYXV0b21hdGljYWxseSBieSB0aGUgYXBwIGl0c2VsZiksIHdoaWNoIHVzdWFsbHkgZXF1YWxzIHRvIEZ1bGwgSEQgMTkyMHgxMDgwIG9uIG1vc3RcbiAqIHBob25lcyBob3dldmVyIHlvdSBjYW4gY2hhbmdlIGl0IHRvIGZvbGxvd2luZyBzdXBwb3J0ZWQgcmVzb2x1dGlvbnNcbiAqIGFzIHdlbGw6IFwiMTkyMHgxMDgwXCIsIFwiMTI4MHg3MjBcIiwgXCI3MjB4NDgwXCIsIFwiMzIweDI0MFwiLCBcIjE3NngxNDRcIi5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyP30gbWF4RHVyYXRpb25TZWMgWzkwMF0gRGVmYXVsdCB2YWx1ZTogOTAwIHNlY29uZHMgd2hpY2ggbWVhbnNcbiAqIG1heGltdW0gYWxsb3dlZCBkdXJhdGlvbiBpcyAxNSBtaW51dGUsIHlvdSBjYW4gaW5jcmVhc2UgaXQgaWYgeW91ciB0ZXN0IHRha2VzXG4gKiBsb25nZXIgdGhhbiB0aGF0LlxuICogQHByb3BlcnR5IHtzdHJpbmc/fSBwcmlvcml0eSBbaGlnaF0gTWVhbnMgcmVjb3JkaW5nIHRocmVhZCBwcmlvcml0eSBpcyBtYXhpbXVtXG4gKiBob3dldmVyIGlmIHlvdSBmYWNlIHBlcmZvcm1hbmNlIGRyb3BzIGR1cmluZyB0ZXN0aW5nIHdpdGggcmVjb3JkaW5nIGVuYWJsZWQsIHlvdVxuICogY2FuIHJlZHVjZSByZWNvcmRpbmcgcHJpb3JpdHkgdG8gXCJub3JtYWxcIiBvciBcImxvd1wiLlxuICogQHByb3BlcnR5IHtzdHJpbmc/fSBmaWxlbmFtZSBZb3UgY2FuIHR5cGUgcmVjb3JkaW5nIHZpZGVvIGZpbGUgbmFtZSBhcyB5b3Ugd2FudCxcbiAqIGJ1dCByZWNvcmRpbmcgY3VycmVudGx5IHN1cHBvcnRzIG9ubHkgXCJtcDRcIiBmb3JtYXQgc28geW91ciBmaWxlbmFtZSBtdXN0IGVuZCB3aXRoIFwiLm1wNFwiLlxuICogQW4gaW52YWxpZCBmaWxlIG5hbWUgd2lsbCBmYWlsIHRvIHN0YXJ0IHRoZSByZWNvcmRpbmcuXG4gKiBJZiBub3QgcHJvdmlkZWQgdGhlbiB0aGUgY3VycmVudCB0aW1lc3RhbXAgd2lsbCBiZSB1c2VkIGFzIGZpbGUgbmFtZS5cbiAqL1xuXG4vKipcbiAqIFJlY29yZCB0aGUgZGlzcGxheSBvZiBhIHJlYWwgZGV2aWNlcyBydW5uaW5nIEFuZHJvaWQgMTAgKEFQSSBsZXZlbCAyOSkgYW5kIGhpZ2hlci5cbiAqIFRoZSBzY3JlZW4gYWN0aXZpdHkgaXMgcmVjb3JkZWQgdG8gYSBNUEVHLTQgZmlsZS4gQXVkaW8gaXMgYWxzbyByZWNvcmRlZCBieSBkZWZhdWx0XG4gKiAob25seSBmb3IgYXBwcyB0aGF0IGFsbG93IGl0IGluIHRoZWlyIG1hbmlmZXN0cykuXG4gKiBJZiBhbm90aGVyIHJlY29yZGluZyBoYXMgYmVlbiBhbHJlYWR5IHN0YXJ0ZWQgdGhlbiB0aGUgY29tbWFuZCB3aWxsIGV4aXQgc2lsZW50bHkuXG4gKiBUaGUgcHJldmlvdXNseSByZWNvcmRlZCB2aWRlbyBmaWxlIGlzIGRlbGV0ZWQgd2hlbiBhIG5ldyByZWNvcmRpbmcgc2Vzc2lvbiBpcyBzdGFydGVkLlxuICogUmVjb3JkaW5nIGNvbnRpbnVlcyBpdCBpcyBzdG9wcGVkIGV4cGxpY2l0bHkgb3IgdW50aWwgdGhlIHRpbWVvdXQgaGFwcGVucy5cbiAqXG4gKiBAcGFyYW0gez9TdGFydFJlY29yZGluZ09wdGlvbnN9IG9wdGlvbnMgQXZhaWxhYmxlIG9wdGlvbnMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBhIG5ldyByZWNvcmRpbmcgaGFzIHN1Y2Nlc3NmdWxseSBzdGFydGVkLlxuICogQHRocm93cyB7RXJyb3J9IElmIHJlY29yZGluZyBoYXMgZmFpbGVkIHRvIHN0YXJ0IG9yIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5jb21tYW5kcy5tb2JpbGVTdGFydE1lZGlhUHJvamVjdGlvblJlY29yZGluZyA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVN0YXJ0TWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nIChvcHRpb25zID0ge30pIHtcbiAgYXdhaXQgdmVyaWZ5TWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nSXNTdXBwb3J0ZWQodGhpcy5hZGIpO1xuXG4gIGNvbnN0IHtyZXNvbHV0aW9uLCBwcmlvcml0eSwgbWF4RHVyYXRpb25TZWMsIGZpbGVuYW1lfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHJlY29yZGVyID0gbmV3IE1lZGlhUHJvamVjdGlvblJlY29yZGVyKHRoaXMuYWRiKTtcbiAgY29uc3QgZm5hbWUgPSBhZGp1c3RNZWRpYUV4dGVuc2lvbihmaWxlbmFtZSB8fCBtb21lbnQoKS5mb3JtYXQoREVGQVVMVF9GSUxFTkFNRV9GT1JNQVQpKTtcbiAgY29uc3QgZGlkU3RhcnQgPSBhd2FpdCByZWNvcmRlci5zdGFydCh7XG4gICAgcmVzb2x1dGlvbixcbiAgICBwcmlvcml0eSxcbiAgICBtYXhEdXJhdGlvblNlYyxcbiAgICBmaWxlbmFtZTogZm5hbWUsXG4gIH0pO1xuICBpZiAoZGlkU3RhcnQpIHtcbiAgICB0aGlzLmxvZy5pbmZvKGBBIG5ldyBtZWRpYSBwcm9qZWN0aW9uIHJlY29yZGluZyAnJHtmbmFtZX0nIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzdGFydGVkYCk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5sb2cuaW5mbygnQW5vdGhlciBtZWRpYSBwcm9qZWN0aW9uIHJlY29yZGluZyBpcyBhbHJlYWR5IGluIHByb2dyZXNzLiBUaGVyZSBpcyBub3RoaW5nIHRvIHN0YXJ0Jyk7XG4gIH1cbiAgcmV0dXJuIGRpZFN0YXJ0O1xufTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBtZWRpYSBwcm9qZWN0aW9uLWJhc2VkIHJlY29yZGluZyBpcyBjdXJyZW50bHkgcnVubmluZy5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBhIHJlY29yZGluZyBpcyBpbiBwcm9ncmVzcy5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBhIHJlY29yZGluZyBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xuY29tbWFuZHMubW9iaWxlSXNNZWRpYVByb2plY3Rpb25SZWNvcmRpbmdSdW5uaW5nID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlSXNNZWRpYVByb2plY3Rpb25SZWNvcmRpbmdSdW5uaW5nICgpIHtcbiAgYXdhaXQgdmVyaWZ5TWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nSXNTdXBwb3J0ZWQodGhpcy5hZGIpO1xuXG4gIGNvbnN0IHJlY29yZGVyID0gbmV3IE1lZGlhUHJvamVjdGlvblJlY29yZGVyKHRoaXMuYWRiKTtcbiAgcmV0dXJuIGF3YWl0IHJlY29yZGVyLmlzUnVubmluZygpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTdG9wUmVjb3JkaW5nT3B0aW9uc1xuICpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nP30gcmVtb3RlUGF0aCBUaGUgcGF0aCB0byB0aGUgcmVtb3RlIGxvY2F0aW9uLCB3aGVyZSB0aGUgcmVzdWx0aW5nIHZpZGVvIHNob3VsZCBiZSB1cGxvYWRlZC5cbiAqIFRoZSBmb2xsb3dpbmcgcHJvdG9jb2xzIGFyZSBzdXBwb3J0ZWQ6IGh0dHAvaHR0cHMsIGZ0cC5cbiAqIE51bGwgb3IgZW1wdHkgc3RyaW5nIHZhbHVlICh0aGUgZGVmYXVsdCBzZXR0aW5nKSBtZWFucyB0aGUgY29udGVudCBvZiByZXN1bHRpbmdcbiAqIGZpbGUgc2hvdWxkIGJlIGVuY29kZWQgYXMgQmFzZTY0IGFuZCBwYXNzZWQgYXMgdGhlIGVuZHBvb250IHJlc3BvbnNlIHZhbHVlLlxuICogQW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGlmIHRoZSBnZW5lcmF0ZWQgbWVkaWEgZmlsZSBpcyB0b28gYmlnIHRvXG4gKiBmaXQgaW50byB0aGUgYXZhaWxhYmxlIHByb2Nlc3MgbWVtb3J5LlxuICogQHByb3BlcnR5IHtzdHJpbmc/fSB1c2VyIFRoZSBuYW1lIG9mIHRoZSB1c2VyIGZvciB0aGUgcmVtb3RlIGF1dGhlbnRpY2F0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmc/fSBwYXNzIFRoZSBwYXNzd29yZCBmb3IgdGhlIHJlbW90ZSBhdXRoZW50aWNhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nP30gbWV0aG9kIFRoZSBodHRwIG11bHRpcGFydCB1cGxvYWQgbWV0aG9kIG5hbWUuIFRoZSAnUFVUJyBvbmUgaXMgdXNlZCBieSBkZWZhdWx0LlxuICogQHByb3BlcnR5IHtPYmplY3Q/fSBoZWFkZXJzIEFkZGl0aW9uYWwgaGVhZGVycyBtYXBwaW5nIGZvciBtdWx0aXBhcnQgaHR0cChzKSB1cGxvYWRzXG4gKiBAcHJvcGVydHkge3N0cmluZz99IGZpbGVGaWVsZE5hbWUgW2ZpbGVdIFRoZSBuYW1lIG9mIHRoZSBmb3JtIGZpZWxkLCB3aGVyZSB0aGUgZmlsZSBjb250ZW50IEJMT0Igc2hvdWxkIGJlIHN0b3JlZCBmb3JcbiAqIGh0dHAocykgdXBsb2Fkc1xuICogQHByb3BlcnR5IHtPYmplY3R8QXJyYXk8UGFpcj4/fSBmb3JtRmllbGRzIEFkZGl0aW9uYWwgZm9ybSBmaWVsZHMgZm9yIG11bHRpcGFydCBodHRwKHMpIHVwbG9hZHNcbiAqL1xuXG4vKipcbiAqIFN0b3AgYSBtZWRpYSBwcm9qZWN0aW9uLWJhc2VkIHJlY29yZGluZy5cbiAqIElmIG5vIHJlY29yZGluZyBoYXMgYmVlbiBzdGFydGVkIGJlZm9yZSB0aGVuIGFuIGVycm9yIGlzIHRocm93bi5cbiAqIElmIHRoZSByZWNvcmRpbmcgaGFzIGJlZW4gYWxyZWFkeSBmaW5pc2hlZCBiZWZvcmUgdGhpcyBBUEkgaGFzIGJlZW4gY2FsbGVkXG4gKiB0aGVuIHRoZSBtb3N0IHJlY2VudCByZWNvcmRlZCBmaWxlIGlzIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSB7P1N0b3BSZWNvcmRpbmdPcHRpb25zfSBvcHRpb25zIEF2YWlsYWJsZSBvcHRpb25zLlxuICogQHJldHVybnMge3N0cmluZ30gQmFzZTY0LWVuY29kZWQgY29udGVudCBvZiB0aGUgcmVjb3JkZWQgbWVkaWEgZmlsZSBpZiAncmVtb3RlUGF0aCdcbiAqIHBhcmFtZXRlciBpcyBmYWxzeSBvciBhbiBlbXB0eSBzdHJpbmcuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHN0b3BwaW5nIGEgcmVjb3JkaW5nLFxuICogZmV0Y2hpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIHJlbW90ZSBtZWRpYSBmaWxlLFxuICogb3IgaWYgYSByZWNvcmRpbmcgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVN0b3BNZWRpYVByb2plY3Rpb25SZWNvcmRpbmcgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVTdG9wTWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nIChvcHRpb25zID0ge30pIHtcbiAgYXdhaXQgdmVyaWZ5TWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nSXNTdXBwb3J0ZWQodGhpcy5hZGIpO1xuXG4gIGNvbnN0IHJlY29yZGVyID0gbmV3IE1lZGlhUHJvamVjdGlvblJlY29yZGVyKHRoaXMuYWRiKTtcbiAgaWYgKGF3YWl0IHJlY29yZGVyLnN0b3AoKSkge1xuICAgIHRoaXMubG9nLmluZm8oJ1N1Y2Nlc3NmdWxseSBzdG9wcGVkIGEgbWVkaWEgcHJvamVjdGlvbiByZWNvcmRpbmcuIFB1bGxpbmcgdGhlIHJlY29yZGVkIG1lZGlhJyk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5sb2cuaW5mbygnTWVkaWEgcHJvamVjdGlvbiByZWNvcmRpbmcgaXMgbm90IHJ1bm5pbmcuIFRoZXJlIGlzIG5vdGhpbmcgdG8gc3RvcCcpO1xuICB9XG4gIGNvbnN0IHJlY2VudFJlY29yZGluZ1BhdGggPSBhd2FpdCByZWNvcmRlci5wdWxsUmVjZW50KCk7XG4gIGlmICghcmVjZW50UmVjb3JkaW5nUGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gcmVjZW50IG1lZGlhIHByb2plY3Rpb24gcmVjb3JkaW5nIGhhdmUgYmVlbiBmb3VuZC4gRGlkIHlvdSBzdGFydCBhbnk/YCk7XG4gIH1cblxuICBjb25zdCB7cmVtb3RlUGF0aH0gPSBvcHRpb25zO1xuICBpZiAoXy5pc0VtcHR5KHJlbW90ZVBhdGgpKSB7XG4gICAgY29uc3Qge3NpemV9ID0gYXdhaXQgZnMuc3RhdChyZWNlbnRSZWNvcmRpbmdQYXRoKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgVGhlIHNpemUgb2YgdGhlIHJlc3VsdGluZyBtZWRpYSBwcm9qZWN0aW9uIHJlY29yZGluZyBpcyAke3V0aWwudG9SZWFkYWJsZVNpemVTdHJpbmcoc2l6ZSl9YCk7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgdXBsb2FkUmVjb3JkZWRNZWRpYShyZWNlbnRSZWNvcmRpbmdQYXRoLCByZW1vdGVQYXRoLCBvcHRpb25zKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBmcy5yaW1yYWYocGF0aC5kaXJuYW1lKHJlY2VudFJlY29yZGluZ1BhdGgpKTtcbiAgfVxufTtcblxuXG5leHBvcnQgeyBjb21tYW5kcyB9O1xuZXhwb3J0IGRlZmF1bHQgY29tbWFuZHM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQSxNQUFNQSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0FBQUM7QUFHcEIsTUFBTUMsV0FBVyxHQUFHLE1BQU07QUFDMUIsTUFBTUMsNEJBQTRCLEdBQUcsQ0FBQyxHQUFHLElBQUk7QUFDN0MsTUFBTUMseUJBQXlCLEdBQUcsQ0FBQyxHQUFHLElBQUk7QUFDMUMsTUFBTUMsYUFBYSxHQUFHLEVBQUU7QUFDeEIsTUFBTUMsc0JBQXNCLEdBQUksR0FBRUMsc0NBQXVCLDRCQUEyQjtBQUNwRixNQUFNQyx1QkFBdUIsR0FBSSxHQUFFRCxzQ0FBdUIsOEJBQTZCO0FBQ3ZGLE1BQU1FLHNCQUFzQixHQUFJLEdBQUVGLHNDQUF1Qix5QkFBd0I7QUFDakYsTUFBTUcscUJBQXFCLEdBQUksR0FBRUgsc0NBQXVCLHdCQUF1QjtBQUMvRSxNQUFNSSxlQUFlLEdBQUksb0NBQW1DSixzQ0FBdUIsUUFBTztBQUMxRixNQUFNSyx1QkFBdUIsR0FBRyxxQkFBcUI7QUFHckQsZUFBZUMsbUJBQW1CLENBQUVDLFNBQVMsRUFBRUMsVUFBVSxHQUFHLElBQUksRUFBRUMsYUFBYSxHQUFHLENBQUMsQ0FBQyxFQUFFO0VBQ3BGLElBQUlDLGVBQUMsQ0FBQ0MsT0FBTyxDQUFDSCxVQUFVLENBQUMsRUFBRTtJQUN6QixPQUFPLENBQUMsTUFBTUksYUFBSSxDQUFDQyxnQkFBZ0IsQ0FBQ04sU0FBUyxDQUFDLEVBQUVPLFFBQVEsRUFBRTtFQUM1RDtFQUVBLE1BQU07SUFBQ0MsSUFBSTtJQUFFQyxJQUFJO0lBQUVDLE1BQU07SUFBRUMsT0FBTztJQUFFQyxhQUFhO0lBQUVDO0VBQVUsQ0FBQyxHQUFHWCxhQUFhO0VBQzlFLE1BQU1ZLE9BQU8s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
192
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfYXN5bmNib3giLCJfc3VwcG9ydCIsIl9wYXRoIiwiX2JsdWViaXJkIiwiX2FuZHJvaWRIZWxwZXJzIiwiX21vbWVudCIsImNvbW1hbmRzIiwiZXhwb3J0cyIsIkRFRkFVTFRfRVhUIiwiUkVDT1JESU5HX1NUQVJUVVBfVElNRU9VVF9NUyIsIlJFQ09SRElOR19TVE9QX1RJTUVPVVRfTVMiLCJNSU5fQVBJX0xFVkVMIiwiUkVDT1JESU5HX1NFUlZJQ0VfTkFNRSIsIlNFVFRJTkdTX0hFTFBFUl9QS0dfSUQiLCJSRUNPUkRJTkdfQUNUSVZJVFlfTkFNRSIsIlJFQ09SRElOR19BQ1RJT05fU1RBUlQiLCJSRUNPUkRJTkdfQUNUSU9OX1NUT1AiLCJSRUNPUkRJTkdTX1JPT1QiLCJERUZBVUxUX0ZJTEVOQU1FX0ZPUk1BVCIsInVwbG9hZFJlY29yZGVkTWVkaWEiLCJsb2NhbEZpbGUiLCJyZW1vdGVQYXRoIiwidXBsb2FkT3B0aW9ucyIsIl8iLCJpc0VtcHR5IiwidXRpbCIsInRvSW5NZW1vcnlCYXNlNjQiLCJ0b1N0cmluZyIsInVzZXIiLCJwYXNzIiwibWV0aG9kIiwiaGVhZGVycyIsImZpbGVGaWVsZE5hbWUiLCJmb3JtRmllbGRzIiwib3B0aW9ucyIsImF1dGgiLCJuZXQiLCJ1cGxvYWRGaWxlIiwiYWRqdXN0TWVkaWFFeHRlbnNpb24iLCJuYW1lIiwidG9Mb3dlciIsImVuZHNXaXRoIiwidmVyaWZ5TWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nSXNTdXBwb3J0ZWQiLCJhZGIiLCJhcGlMZXZlbCIsImdldEFwaUxldmVsIiwiRXJyb3IiLCJNZWRpYVByb2plY3Rpb25SZWNvcmRlciIsImNvbnN0cnVjdG9yIiwiaXNSdW5uaW5nIiwic3Rkb3V0Iiwic2hlbGwiLCJpbmNsdWRlcyIsInN0YXJ0Iiwib3B0cyIsImNsZWFudXAiLCJmaWxlbmFtZSIsIm1heER1cmF0aW9uU2VjIiwicHJpb3JpdHkiLCJyZXNvbHV0aW9uIiwiYXJncyIsInB1c2giLCJCIiwicmVzb2x2ZSIsInJlamVjdCIsInNldFRpbWVvdXQiLCJwdWxsUmVjZW50IiwicmVjb3JkaW5ncyIsImxzIiwiZHN0UGF0aCIsInBhdGgiLCJqb2luIiwidGVtcERpciIsIm9wZW5EaXIiLCJwdWxsIiwic3RvcCIsIndhaXRGb3JDb25kaXRpb24iLCJ3YWl0TXMiLCJpbnRlcnZhbE1zIiwiZSIsIm1vYmlsZVN0YXJ0TWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nIiwicmVjb3JkZXIiLCJmbmFtZSIsIm1vbWVudCIsImZvcm1hdCIsImRpZFN0YXJ0IiwibG9nIiwiaW5mbyIsIm1vYmlsZUlzTWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nUnVubmluZyIsIm1vYmlsZVN0b3BNZWRpYVByb2plY3Rpb25SZWNvcmRpbmciLCJyZWNlbnRSZWNvcmRpbmdQYXRoIiwic2l6ZSIsImZzIiwic3RhdCIsImRlYnVnIiwidG9SZWFkYWJsZVNpemVTdHJpbmciLCJyaW1yYWYiLCJkaXJuYW1lIiwiX2RlZmF1bHQiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL21lZGlhLXByb2plY3Rpb24uanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IHdhaXRGb3JDb25kaXRpb24gfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyB1dGlsLCBmcywgbmV0LCB0ZW1wRGlyIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHsgU0VUVElOR1NfSEVMUEVSX1BLR19JRCB9IGZyb20gJy4uL2FuZHJvaWQtaGVscGVycyc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cblxuY29uc3QgY29tbWFuZHMgPSB7fTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9pby5hcHBpdW0uc2V0dGluZ3MjaW50ZXJuYWwtYXVkaW8tLXZpZGVvLXJlY29yZGluZ1xuY29uc3QgREVGQVVMVF9FWFQgPSAnLm1wNCc7XG5jb25zdCBSRUNPUkRJTkdfU1RBUlRVUF9USU1FT1VUX01TID0gMyAqIDEwMDA7XG5jb25zdCBSRUNPUkRJTkdfU1RPUF9USU1FT1VUX01TID0gMyAqIDEwMDA7XG5jb25zdCBNSU5fQVBJX0xFVkVMID0gMjk7XG5jb25zdCBSRUNPUkRJTkdfU0VSVklDRV9OQU1FID0gYCR7U0VUVElOR1NfSEVMUEVSX1BLR19JRH0vLnJlY29yZGVyLlJlY29yZGVyU2VydmljZWA7XG5jb25zdCBSRUNPUkRJTkdfQUNUSVZJVFlfTkFNRSA9IGAke1NFVFRJTkdTX0hFTFBFUl9QS0dfSUR9L2lvLmFwcGl1bS5zZXR0aW5ncy5TZXR0aW5nc2A7XG5jb25zdCBSRUNPUkRJTkdfQUNUSU9OX1NUQVJUID0gYCR7U0VUVElOR1NfSEVMUEVSX1BLR19JRH0ucmVjb3JkaW5nLkFDVElPTl9TVEFSVGA7XG5jb25zdCBSRUNPUkRJTkdfQUNUSU9OX1NUT1AgPSBgJHtTRVRUSU5HU19IRUxQRVJfUEtHX0lEfS5yZWNvcmRpbmcuQUNUSU9OX1NUT1BgO1xuY29uc3QgUkVDT1JESU5HU19ST09UID0gYC9zdG9yYWdlL2VtdWxhdGVkLzAvQW5kcm9pZC9kYXRhLyR7U0VUVElOR1NfSEVMUEVSX1BLR19JRH0vZmlsZXNgO1xuY29uc3QgREVGQVVMVF9GSUxFTkFNRV9GT1JNQVQgPSAnWVlZWS1NTS1ERFRISC1tbS1zcyc7XG5cblxuYXN5bmMgZnVuY3Rpb24gdXBsb2FkUmVjb3JkZWRNZWRpYSAobG9jYWxGaWxlLCByZW1vdGVQYXRoID0gbnVsbCwgdXBsb2FkT3B0aW9ucyA9IHt9KSB7XG4gIGlmIChfLmlzRW1wdHkocmVtb3RlUGF0aCkpIHtcbiAgICByZXR1cm4gKGF3YWl0IHV0aWwudG9Jbk1lbW9yeUJhc2U2NChsb2NhbEZpbGUpKS50b1N0cmluZygpO1xuICB9XG5cbiAgY29uc3Qge3VzZXIsIHBhc3MsIG1ldGhvZCwgaGVhZGVycywgZmlsZUZpZWxkTmFtZSwgZm9ybUZpZWxkc30gPSB1cGxvYWRPcHRpb25zO1xuICBjb25zdCBvcHRpb25zID0ge1xuICAgIG1ldGhvZDogbWV0aG9kIHx8ICdQVVQnLFxuICAgIGhlYWRlcnMsXG4gICAgZmlsZUZpZWxkTmFtZSxcbiAgICBmb3JtRmllbGRzLFxuICB9O1xuICBpZiAodXNlciAmJiBwYXNzKSB7XG4gICAgb3B0aW9ucy5hdXRoID0ge3VzZXIsIHBhc3N9O1xuICB9XG4gIGF3YWl0IG5ldC51cGxvYWRGaWxlKGxvY2FsRmlsZSwgcmVtb3RlUGF0aCwgb3B0aW9ucyk7XG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gYWRqdXN0TWVkaWFFeHRlbnNpb24gKG5hbWUpIHtcbiAgcmV0dXJuIF8udG9Mb3dlcihuYW1lKS5lbmRzV2l0aChERUZBVUxUX0VYVCkgPyBuYW1lIDogYCR7bmFtZX0ke0RFRkFVTFRfRVhUfWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHZlcmlmeU1lZGlhUHJvamVjdGlvblJlY29yZGluZ0lzU3VwcG9ydGVkIChhZGIpIHtcbiAgY29uc3QgYXBpTGV2ZWwgPSBhd2FpdCBhZGIuZ2V0QXBpTGV2ZWwoKTtcbiAgaWYgKGFwaUxldmVsIDwgTUlOX0FQSV9MRVZFTCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWVkaWEgcHJvamVjdGlvbi1iYXNlZCByZWNvcmRpbmcgaXMgbm90IGF2YWlsYWJsZSBvbiBBUEkgTGV2ZWwgJHthcGlMZXZlbH0uIGAgK1xuICAgICAgYE1pbmltdW0gcmVxdWlyZWQgQVBJIExldmVsIGlzICR7TUlOX0FQSV9MRVZFTH0uYCk7XG4gIH1cbn1cblxuXG5jbGFzcyBNZWRpYVByb2plY3Rpb25SZWNvcmRlciB7XG4gIGNvbnN0cnVjdG9yIChhZGIpIHtcbiAgICB0aGlzLmFkYiA9IGFkYjtcbiAgfVxuXG4gIGFzeW5jIGlzUnVubmluZyAoKSB7XG4gICAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoW1xuICAgICAgJ2R1bXBzeXMnLCAnYWN0aXZpdHknLCAnc2VydmljZXMnLCBSRUNPUkRJTkdfU0VSVklDRV9OQU1FXG4gICAgXSk7XG4gICAgcmV0dXJuIHN0ZG91dC5pbmNsdWRlcyhSRUNPUkRJTkdfU0VSVklDRV9OQU1FKTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0IChvcHRzID0ge30pIHtcbiAgICBpZiAoYXdhaXQgdGhpcy5pc1J1bm5pbmcoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuY2xlYW51cCgpO1xuICAgIGNvbnN0IHtcbiAgICAgIGZpbGVuYW1lLFxuICAgICAgbWF4RHVyYXRpb25TZWMsXG4gICAgICBwcmlvcml0eSxcbiAgICAgIHJlc29sdXRpb24sXG4gICAgfSA9IG9wdHM7XG4gICAgY29uc3QgYXJncyA9IFtcbiAgICAgICdhbScsICdzdGFydCcsXG4gICAgICAnLW4nLCBSRUNPUkRJTkdfQUNUSVZJVFlfTkFNRSxcbiAgICAgICctYScsIFJFQ09SRElOR19BQ1RJT05fU1RBUlQsXG4gICAgXTtcbiAgICBpZiAoZmlsZW5hbWUpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1lcycsICdmaWxlbmFtZScsIGZpbGVuYW1lKTtcbiAgICB9XG4gICAgaWYgKG1heER1cmF0aW9uU2VjKSB7XG4gICAgICBhcmdzLnB1c2goJy0tZXMnLCAnbWF4X2R1cmF0aW9uX3NlYycsIGAke21heER1cmF0aW9uU2VjfWApO1xuICAgIH1cbiAgICBpZiAocHJpb3JpdHkpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1lcycsICdwcmlvcml0eScsIHByaW9yaXR5KTtcbiAgICB9XG4gICAgaWYgKHJlc29sdXRpb24pIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1lcycsICdyZXNvbHV0aW9uJywgcmVzb2x1dGlvbik7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKGFyZ3MpO1xuICAgIGF3YWl0IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoIWF3YWl0IHRoaXMuaXNSdW5uaW5nKCkpIHtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBUaGUgbWVkaWEgcHJvamVjdGlvbiByZWNvcmRpbmcgaXMgbm90IHJ1bm5pbmcgYWZ0ZXIgJHtSRUNPUkRJTkdfU1RBUlRVUF9USU1FT1VUX01TfW1zLiBgICtcbiAgICAgICAgICAgIGBQbGVhc2UgY2hlY2sgdGhlIGxvZ2NhdCBvdXRwdXQgZm9yIG1vcmUgZGV0YWlscy5gXG4gICAgICAgICAgKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSwgUkVDT1JESU5HX1NUQVJUVVBfVElNRU9VVF9NUyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBhc3luYyBjbGVhbnVwICgpIHtcbiAgICBhd2FpdCB0aGlzLmFkYi5zaGVsbChbYHJtIC1mICR7UkVDT1JESU5HU19ST09UfS8qYF0pO1xuICB9XG5cbiAgYXN5bmMgcHVsbFJlY2VudCAoKSB7XG4gICAgY29uc3QgcmVjb3JkaW5ncyA9IGF3YWl0IHRoaXMuYWRiLmxzKFJFQ09SRElOR1NfUk9PVCwgWyctdHInXSk7XG4gICAgaWYgKF8uaXNFbXB0eShyZWNvcmRpbmdzKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZHN0UGF0aCA9IHBhdGguam9pbihhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKSwgcmVjb3JkaW5nc1swXSk7XG4gICAgYXdhaXQgdGhpcy5hZGIucHVsbChgJHtSRUNPUkRJTkdTX1JPT1R9LyR7cmVjb3JkaW5nc1swXX1gLCBkc3RQYXRoKTtcbiAgICByZXR1cm4gZHN0UGF0aDtcbiAgfVxuXG4gIGFzeW5jIHN0b3AgKCkge1xuICAgIGlmICghYXdhaXQgdGhpcy5pc1J1bm5pbmcoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFtcbiAgICAgICdhbScsICdzdGFydCcsXG4gICAgICAnLW4nLCBSRUNPUkRJTkdfQUNUSVZJVFlfTkFNRSxcbiAgICAgICctYScsIFJFQ09SRElOR19BQ1RJT05fU1RPUCxcbiAgICBdKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiAhKGF3YWl0IHRoaXMuaXNSdW5uaW5nKCkpLCB7XG4gICAgICAgIHdhaXRNczogUkVDT1JESU5HX1NUT1BfVElNRU9VVF9NUyxcbiAgICAgICAgaW50ZXJ2YWxNczogNTAwLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhlIGF0dGVtcHQgdG8gc3RvcCB0aGUgY3VycmVudCBtZWRpYSBwcm9qZWN0aW9uIHJlY29yZGluZyB0aW1lZCBvdXQgYWZ0ZXIgYCArXG4gICAgICAgIGAke1JFQ09SRElOR19TVE9QX1RJTUVPVVRfTVN9bXNgXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU3RhcnRSZWNvcmRpbmdPcHRpb25zXG4gKlxuICogQHByb3BlcnR5IHtzdHJpbmc/fSByZXNvbHV0aW9uIE1heGltdW0gc3VwcG9ydGVkIHJlc29sdXRpb24gb24tZGV2aWNlIChEZXRlY3RlZFxuICogYXV0b21hdGljYWxseSBieSB0aGUgYXBwIGl0c2VsZiksIHdoaWNoIHVzdWFsbHkgZXF1YWxzIHRvIEZ1bGwgSEQgMTkyMHgxMDgwIG9uIG1vc3RcbiAqIHBob25lcyBob3dldmVyIHlvdSBjYW4gY2hhbmdlIGl0IHRvIGZvbGxvd2luZyBzdXBwb3J0ZWQgcmVzb2x1dGlvbnNcbiAqIGFzIHdlbGw6IFwiMTkyMHgxMDgwXCIsIFwiMTI4MHg3MjBcIiwgXCI3MjB4NDgwXCIsIFwiMzIweDI0MFwiLCBcIjE3NngxNDRcIi5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyP30gbWF4RHVyYXRpb25TZWMgWzkwMF0gRGVmYXVsdCB2YWx1ZTogOTAwIHNlY29uZHMgd2hpY2ggbWVhbnNcbiAqIG1heGltdW0gYWxsb3dlZCBkdXJhdGlvbiBpcyAxNSBtaW51dGUsIHlvdSBjYW4gaW5jcmVhc2UgaXQgaWYgeW91ciB0ZXN0IHRha2VzXG4gKiBsb25nZXIgdGhhbiB0aGF0LlxuICogQHByb3BlcnR5IHtzdHJpbmc/fSBwcmlvcml0eSBbaGlnaF0gTWVhbnMgcmVjb3JkaW5nIHRocmVhZCBwcmlvcml0eSBpcyBtYXhpbXVtXG4gKiBob3dldmVyIGlmIHlvdSBmYWNlIHBlcmZvcm1hbmNlIGRyb3BzIGR1cmluZyB0ZXN0aW5nIHdpdGggcmVjb3JkaW5nIGVuYWJsZWQsIHlvdVxuICogY2FuIHJlZHVjZSByZWNvcmRpbmcgcHJpb3JpdHkgdG8gXCJub3JtYWxcIiBvciBcImxvd1wiLlxuICogQHByb3BlcnR5IHtzdHJpbmc/fSBmaWxlbmFtZSBZb3UgY2FuIHR5cGUgcmVjb3JkaW5nIHZpZGVvIGZpbGUgbmFtZSBhcyB5b3Ugd2FudCxcbiAqIGJ1dCByZWNvcmRpbmcgY3VycmVudGx5IHN1cHBvcnRzIG9ubHkgXCJtcDRcIiBmb3JtYXQgc28geW91ciBmaWxlbmFtZSBtdXN0IGVuZCB3aXRoIFwiLm1wNFwiLlxuICogQW4gaW52YWxpZCBmaWxlIG5hbWUgd2lsbCBmYWlsIHRvIHN0YXJ0IHRoZSByZWNvcmRpbmcuXG4gKiBJZiBub3QgcHJvdmlkZWQgdGhlbiB0aGUgY3VycmVudCB0aW1lc3RhbXAgd2lsbCBiZSB1c2VkIGFzIGZpbGUgbmFtZS5cbiAqL1xuXG4vKipcbiAqIFJlY29yZCB0aGUgZGlzcGxheSBvZiBhIHJlYWwgZGV2aWNlcyBydW5uaW5nIEFuZHJvaWQgMTAgKEFQSSBsZXZlbCAyOSkgYW5kIGhpZ2hlci5cbiAqIFRoZSBzY3JlZW4gYWN0aXZpdHkgaXMgcmVjb3JkZWQgdG8gYSBNUEVHLTQgZmlsZS4gQXVkaW8gaXMgYWxzbyByZWNvcmRlZCBieSBkZWZhdWx0XG4gKiAob25seSBmb3IgYXBwcyB0aGF0IGFsbG93IGl0IGluIHRoZWlyIG1hbmlmZXN0cykuXG4gKiBJZiBhbm90aGVyIHJlY29yZGluZyBoYXMgYmVlbiBhbHJlYWR5IHN0YXJ0ZWQgdGhlbiB0aGUgY29tbWFuZCB3aWxsIGV4aXQgc2lsZW50bHkuXG4gKiBUaGUgcHJldmlvdXNseSByZWNvcmRlZCB2aWRlbyBmaWxlIGlzIGRlbGV0ZWQgd2hlbiBhIG5ldyByZWNvcmRpbmcgc2Vzc2lvbiBpcyBzdGFydGVkLlxuICogUmVjb3JkaW5nIGNvbnRpbnVlcyBpdCBpcyBzdG9wcGVkIGV4cGxpY2l0bHkgb3IgdW50aWwgdGhlIHRpbWVvdXQgaGFwcGVucy5cbiAqXG4gKiBAcGFyYW0gez9TdGFydFJlY29yZGluZ09wdGlvbnN9IG9wdGlvbnMgQXZhaWxhYmxlIG9wdGlvbnMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBhIG5ldyByZWNvcmRpbmcgaGFzIHN1Y2Nlc3NmdWxseSBzdGFydGVkLlxuICogQHRocm93cyB7RXJyb3J9IElmIHJlY29yZGluZyBoYXMgZmFpbGVkIHRvIHN0YXJ0IG9yIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5jb21tYW5kcy5tb2JpbGVTdGFydE1lZGlhUHJvamVjdGlvblJlY29yZGluZyA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVN0YXJ0TWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nIChvcHRpb25zID0ge30pIHtcbiAgYXdhaXQgdmVyaWZ5TWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nSXNTdXBwb3J0ZWQodGhpcy5hZGIpO1xuXG4gIGNvbnN0IHtyZXNvbHV0aW9uLCBwcmlvcml0eSwgbWF4RHVyYXRpb25TZWMsIGZpbGVuYW1lfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHJlY29yZGVyID0gbmV3IE1lZGlhUHJvamVjdGlvblJlY29yZGVyKHRoaXMuYWRiKTtcbiAgY29uc3QgZm5hbWUgPSBhZGp1c3RNZWRpYUV4dGVuc2lvbihmaWxlbmFtZSB8fCBtb21lbnQoKS5mb3JtYXQoREVGQVVMVF9GSUxFTkFNRV9GT1JNQVQpKTtcbiAgY29uc3QgZGlkU3RhcnQgPSBhd2FpdCByZWNvcmRlci5zdGFydCh7XG4gICAgcmVzb2x1dGlvbixcbiAgICBwcmlvcml0eSxcbiAgICBtYXhEdXJhdGlvblNlYyxcbiAgICBmaWxlbmFtZTogZm5hbWUsXG4gIH0pO1xuICBpZiAoZGlkU3RhcnQpIHtcbiAgICB0aGlzLmxvZy5pbmZvKGBBIG5ldyBtZWRpYSBwcm9qZWN0aW9uIHJlY29yZGluZyAnJHtmbmFtZX0nIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzdGFydGVkYCk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5sb2cuaW5mbygnQW5vdGhlciBtZWRpYSBwcm9qZWN0aW9uIHJlY29yZGluZyBpcyBhbHJlYWR5IGluIHByb2dyZXNzLiBUaGVyZSBpcyBub3RoaW5nIHRvIHN0YXJ0Jyk7XG4gIH1cbiAgcmV0dXJuIGRpZFN0YXJ0O1xufTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBtZWRpYSBwcm9qZWN0aW9uLWJhc2VkIHJlY29yZGluZyBpcyBjdXJyZW50bHkgcnVubmluZy5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBhIHJlY29yZGluZyBpcyBpbiBwcm9ncmVzcy5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBhIHJlY29yZGluZyBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xuY29tbWFuZHMubW9iaWxlSXNNZWRpYVByb2plY3Rpb25SZWNvcmRpbmdSdW5uaW5nID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlSXNNZWRpYVByb2plY3Rpb25SZWNvcmRpbmdSdW5uaW5nICgpIHtcbiAgYXdhaXQgdmVyaWZ5TWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nSXNTdXBwb3J0ZWQodGhpcy5hZGIpO1xuXG4gIGNvbnN0IHJlY29yZGVyID0gbmV3IE1lZGlhUHJvamVjdGlvblJlY29yZGVyKHRoaXMuYWRiKTtcbiAgcmV0dXJuIGF3YWl0IHJlY29yZGVyLmlzUnVubmluZygpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTdG9wUmVjb3JkaW5nT3B0aW9uc1xuICpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nP30gcmVtb3RlUGF0aCBUaGUgcGF0aCB0byB0aGUgcmVtb3RlIGxvY2F0aW9uLCB3aGVyZSB0aGUgcmVzdWx0aW5nIHZpZGVvIHNob3VsZCBiZSB1cGxvYWRlZC5cbiAqIFRoZSBmb2xsb3dpbmcgcHJvdG9jb2xzIGFyZSBzdXBwb3J0ZWQ6IGh0dHAvaHR0cHMsIGZ0cC5cbiAqIE51bGwgb3IgZW1wdHkgc3RyaW5nIHZhbHVlICh0aGUgZGVmYXVsdCBzZXR0aW5nKSBtZWFucyB0aGUgY29udGVudCBvZiByZXN1bHRpbmdcbiAqIGZpbGUgc2hvdWxkIGJlIGVuY29kZWQgYXMgQmFzZTY0IGFuZCBwYXNzZWQgYXMgdGhlIGVuZHBvb250IHJlc3BvbnNlIHZhbHVlLlxuICogQW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGlmIHRoZSBnZW5lcmF0ZWQgbWVkaWEgZmlsZSBpcyB0b28gYmlnIHRvXG4gKiBmaXQgaW50byB0aGUgYXZhaWxhYmxlIHByb2Nlc3MgbWVtb3J5LlxuICogQHByb3BlcnR5IHtzdHJpbmc/fSB1c2VyIFRoZSBuYW1lIG9mIHRoZSB1c2VyIGZvciB0aGUgcmVtb3RlIGF1dGhlbnRpY2F0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmc/fSBwYXNzIFRoZSBwYXNzd29yZCBmb3IgdGhlIHJlbW90ZSBhdXRoZW50aWNhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nP30gbWV0aG9kIFRoZSBodHRwIG11bHRpcGFydCB1cGxvYWQgbWV0aG9kIG5hbWUuIFRoZSAnUFVUJyBvbmUgaXMgdXNlZCBieSBkZWZhdWx0LlxuICogQHByb3BlcnR5IHtPYmplY3Q/fSBoZWFkZXJzIEFkZGl0aW9uYWwgaGVhZGVycyBtYXBwaW5nIGZvciBtdWx0aXBhcnQgaHR0cChzKSB1cGxvYWRzXG4gKiBAcHJvcGVydHkge3N0cmluZz99IGZpbGVGaWVsZE5hbWUgW2ZpbGVdIFRoZSBuYW1lIG9mIHRoZSBmb3JtIGZpZWxkLCB3aGVyZSB0aGUgZmlsZSBjb250ZW50IEJMT0Igc2hvdWxkIGJlIHN0b3JlZCBmb3JcbiAqIGh0dHAocykgdXBsb2Fkc1xuICogQHByb3BlcnR5IHtPYmplY3R8QXJyYXk8UGFpcj4/fSBmb3JtRmllbGRzIEFkZGl0aW9uYWwgZm9ybSBmaWVsZHMgZm9yIG11bHRpcGFydCBodHRwKHMpIHVwbG9hZHNcbiAqL1xuXG4vKipcbiAqIFN0b3AgYSBtZWRpYSBwcm9qZWN0aW9uLWJhc2VkIHJlY29yZGluZy5cbiAqIElmIG5vIHJlY29yZGluZyBoYXMgYmVlbiBzdGFydGVkIGJlZm9yZSB0aGVuIGFuIGVycm9yIGlzIHRocm93bi5cbiAqIElmIHRoZSByZWNvcmRpbmcgaGFzIGJlZW4gYWxyZWFkeSBmaW5pc2hlZCBiZWZvcmUgdGhpcyBBUEkgaGFzIGJlZW4gY2FsbGVkXG4gKiB0aGVuIHRoZSBtb3N0IHJlY2VudCByZWNvcmRlZCBmaWxlIGlzIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSB7P1N0b3BSZWNvcmRpbmdPcHRpb25zfSBvcHRpb25zIEF2YWlsYWJsZSBvcHRpb25zLlxuICogQHJldHVybnMge3N0cmluZ30gQmFzZTY0LWVuY29kZWQgY29udGVudCBvZiB0aGUgcmVjb3JkZWQgbWVkaWEgZmlsZSBpZiAncmVtb3RlUGF0aCdcbiAqIHBhcmFtZXRlciBpcyBmYWxzeSBvciBhbiBlbXB0eSBzdHJpbmcuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHN0b3BwaW5nIGEgcmVjb3JkaW5nLFxuICogZmV0Y2hpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIHJlbW90ZSBtZWRpYSBmaWxlLFxuICogb3IgaWYgYSByZWNvcmRpbmcgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVN0b3BNZWRpYVByb2plY3Rpb25SZWNvcmRpbmcgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVTdG9wTWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nIChvcHRpb25zID0ge30pIHtcbiAgYXdhaXQgdmVyaWZ5TWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nSXNTdXBwb3J0ZWQodGhpcy5hZGIpO1xuXG4gIGNvbnN0IHJlY29yZGVyID0gbmV3IE1lZGlhUHJvamVjdGlvblJlY29yZGVyKHRoaXMuYWRiKTtcbiAgaWYgKGF3YWl0IHJlY29yZGVyLnN0b3AoKSkge1xuICAgIHRoaXMubG9nLmluZm8oJ1N1Y2Nlc3NmdWxseSBzdG9wcGVkIGEgbWVkaWEgcHJvamVjdGlvbiByZWNvcmRpbmcuIFB1bGxpbmcgdGhlIHJlY29yZGVkIG1lZGlhJyk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5sb2cuaW5mbygnTWVkaWEgcHJvamVjdGlvbiByZWNvcmRpbmcgaXMgbm90IHJ1bm5pbmcuIFRoZXJlIGlzIG5vdGhpbmcgdG8gc3RvcCcpO1xuICB9XG4gIGNvbnN0IHJlY2VudFJlY29yZGluZ1BhdGggPSBhd2FpdCByZWNvcmRlci5wdWxsUmVjZW50KCk7XG4gIGlmICghcmVjZW50UmVjb3JkaW5nUGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gcmVjZW50IG1lZGlhIHByb2plY3Rpb24gcmVjb3JkaW5nIGhhdmUgYmVlbiBmb3VuZC4gRGlkIHlvdSBzdGFydCBhbnk/YCk7XG4gIH1cblxuICBjb25zdCB7cmVtb3RlUGF0aH0gPSBvcHRpb25zO1xuICBpZiAoXy5pc0VtcHR5KHJlbW90ZVBhdGgpKSB7XG4gICAgY29uc3Qge3NpemV9ID0gYXdhaXQgZnMuc3RhdChyZWNlbnRSZWNvcmRpbmdQYXRoKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgVGhlIHNpemUgb2YgdGhlIHJlc3VsdGluZyBtZWRpYSBwcm9qZWN0aW9uIHJlY29yZGluZyBpcyAke3V0aWwudG9SZWFkYWJsZVNpemVTdHJpbmcoc2l6ZSl9YCk7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgdXBsb2FkUmVjb3JkZWRNZWRpYShyZWNlbnRSZWNvcmRpbmdQYXRoLCByZW1vdGVQYXRoLCBvcHRpb25zKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBmcy5yaW1yYWYocGF0aC5kaXJuYW1lKHJlY2VudFJlY29yZGluZ1BhdGgpKTtcbiAgfVxufTtcblxuXG5leHBvcnQgeyBjb21tYW5kcyB9O1xuZXhwb3J0IGRlZmF1bHQgY29tbWFuZHM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsSUFBQUEsT0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsU0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsUUFBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsS0FBQSxHQUFBSixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUksU0FBQSxHQUFBTCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUssZUFBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sT0FBQSxHQUFBUCxzQkFBQSxDQUFBQyxPQUFBO0FBR0EsTUFBTU8sUUFBUSxHQUFHLENBQUMsQ0FBQztBQUFDQyxPQUFBLENBQUFELFFBQUEsR0FBQUEsUUFBQTtBQUdwQixNQUFNRSxXQUFXLEdBQUcsTUFBTTtBQUMxQixNQUFNQyw0QkFBNEIsR0FBRyxDQUFDLEdBQUcsSUFBSTtBQUM3QyxNQUFNQyx5QkFBeUIsR0FBRyxDQUFDLEdBQUcsSUFBSTtBQUMxQyxNQUFNQyxhQUFhLEdBQUcsRUFBRTtBQUN4QixNQUFNQyxzQkFBc0IsR0FBSSxHQUFFQyxzQ0FBdUIsNEJBQTJCO0FBQ3BGLE1BQU1DLHVCQUF1QixHQUFJLEdBQUVELHNDQUF1Qiw4QkFBNkI7QUFDdkYsTUFBTUUsc0JBQXNCLEdBQUksR0FBRUYsc0NBQXVCLHlCQUF3QjtBQUNqRixNQUFNRyxxQkFBcUIsR0FBSSxHQUFFSCxzQ0FBdUIsd0JBQXVCO0FBQy9FLE1BQU1JLGVB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
@@ -1 +1 @@
1
- {"version":3,"file":"media-projection.js","names":["commands","DEFAULT_EXT","RECORDING_STARTUP_TIMEOUT_MS","RECORDING_STOP_TIMEOUT_MS","MIN_API_LEVEL","RECORDING_SERVICE_NAME","SETTINGS_HELPER_PKG_ID","RECORDING_ACTIVITY_NAME","RECORDING_ACTION_START","RECORDING_ACTION_STOP","RECORDINGS_ROOT","DEFAULT_FILENAME_FORMAT","uploadRecordedMedia","localFile","remotePath","uploadOptions","_","isEmpty","util","toInMemoryBase64","toString","user","pass","method","headers","fileFieldName","formFields","options","auth","net","uploadFile","adjustMediaExtension","name","toLower","endsWith","verifyMediaProjectionRecordingIsSupported","adb","apiLevel","getApiLevel","Error","MediaProjectionRecorder","constructor","isRunning","stdout","shell","includes","start","opts","cleanup","filename","maxDurationSec","priority","resolution","args","push","B","resolve","reject","setTimeout","pullRecent","recordings","ls","dstPath","path","join","tempDir","openDir","pull","stop","waitForCondition","waitMs","intervalMs","e","mobileStartMediaProjectionRecording","recorder","fname","moment","format","didStart","log","info","mobileIsMediaProjectionRecordingRunning","mobileStopMediaProjectionRecording","recentRecordingPath","size","fs","stat","debug","toReadableSizeString","rimraf","dirname"],"sources":["../../../lib/commands/media-projection.js"],"sourcesContent":["import _ from 'lodash';\nimport { waitForCondition } from 'asyncbox';\nimport { util, fs, net, tempDir } from '@appium/support';\nimport path from 'path';\nimport B from 'bluebird';\nimport { SETTINGS_HELPER_PKG_ID } from '../android-helpers';\nimport moment from 'moment';\n\n\nconst commands = {};\n\n// https://github.com/appium/io.appium.settings#internal-audio--video-recording\nconst DEFAULT_EXT = '.mp4';\nconst RECORDING_STARTUP_TIMEOUT_MS = 3 * 1000;\nconst RECORDING_STOP_TIMEOUT_MS = 3 * 1000;\nconst MIN_API_LEVEL = 29;\nconst RECORDING_SERVICE_NAME = `${SETTINGS_HELPER_PKG_ID}/.recorder.RecorderService`;\nconst RECORDING_ACTIVITY_NAME = `${SETTINGS_HELPER_PKG_ID}/io.appium.settings.Settings`;\nconst RECORDING_ACTION_START = `${SETTINGS_HELPER_PKG_ID}.recording.ACTION_START`;\nconst RECORDING_ACTION_STOP = `${SETTINGS_HELPER_PKG_ID}.recording.ACTION_STOP`;\nconst RECORDINGS_ROOT = `/storage/emulated/0/Android/data/${SETTINGS_HELPER_PKG_ID}/files`;\nconst DEFAULT_FILENAME_FORMAT = 'YYYY-MM-DDTHH-mm-ss';\n\n\nasync function uploadRecordedMedia (localFile, remotePath = null, uploadOptions = {}) {\n if (_.isEmpty(remotePath)) {\n return (await util.toInMemoryBase64(localFile)).toString();\n }\n\n const {user, pass, method, headers, fileFieldName, formFields} = uploadOptions;\n const options = {\n method: method || 'PUT',\n headers,\n fileFieldName,\n formFields,\n };\n if (user && pass) {\n options.auth = {user, pass};\n }\n await net.uploadFile(localFile, remotePath, options);\n return '';\n}\n\nfunction adjustMediaExtension (name) {\n return _.toLower(name).endsWith(DEFAULT_EXT) ? name : `${name}${DEFAULT_EXT}`;\n}\n\nasync function verifyMediaProjectionRecordingIsSupported (adb) {\n const apiLevel = await adb.getApiLevel();\n if (apiLevel < MIN_API_LEVEL) {\n throw new Error(`Media projection-based recording is not available on API Level ${apiLevel}. ` +\n `Minimum required API Level is ${MIN_API_LEVEL}.`);\n }\n}\n\n\nclass MediaProjectionRecorder {\n constructor (adb) {\n this.adb = adb;\n }\n\n async isRunning () {\n const stdout = await this.adb.shell([\n 'dumpsys', 'activity', 'services', RECORDING_SERVICE_NAME\n ]);\n return stdout.includes(RECORDING_SERVICE_NAME);\n }\n\n async start (opts = {}) {\n if (await this.isRunning()) {\n return false;\n }\n\n await this.cleanup();\n const {\n filename,\n maxDurationSec,\n priority,\n resolution,\n } = opts;\n const args = [\n 'am', 'start',\n '-n', RECORDING_ACTIVITY_NAME,\n '-a', RECORDING_ACTION_START,\n ];\n if (filename) {\n args.push('--es', 'filename', filename);\n }\n if (maxDurationSec) {\n args.push('--es', 'max_duration_sec', `${maxDurationSec}`);\n }\n if (priority) {\n args.push('--es', 'priority', priority);\n }\n if (resolution) {\n args.push('--es', 'resolution', resolution);\n }\n await this.adb.shell(args);\n await new B((resolve, reject) => {\n setTimeout(async () => {\n if (!await this.isRunning()) {\n return reject(new Error(\n `The media projection recording is not running after ${RECORDING_STARTUP_TIMEOUT_MS}ms. ` +\n `Please check the logcat output for more details.`\n ));\n }\n resolve();\n }, RECORDING_STARTUP_TIMEOUT_MS);\n });\n return true;\n }\n\n async cleanup () {\n await this.adb.shell([`rm -f ${RECORDINGS_ROOT}/*`]);\n }\n\n async pullRecent () {\n const recordings = await this.adb.ls(RECORDINGS_ROOT, ['-tr']);\n if (_.isEmpty(recordings)) {\n return null;\n }\n\n const dstPath = path.join(await tempDir.openDir(), recordings[0]);\n await this.adb.pull(`${RECORDINGS_ROOT}/${recordings[0]}`, dstPath);\n return dstPath;\n }\n\n async stop () {\n if (!await this.isRunning()) {\n return false;\n }\n\n await this.adb.shell([\n 'am', 'start',\n '-n', RECORDING_ACTIVITY_NAME,\n '-a', RECORDING_ACTION_STOP,\n ]);\n try {\n await waitForCondition(async () => !(await this.isRunning()), {\n waitMs: RECORDING_STOP_TIMEOUT_MS,\n intervalMs: 500,\n });\n } catch (e) {\n throw new Error(\n `The attempt to stop the current media projection recording timed out after ` +\n `${RECORDING_STOP_TIMEOUT_MS}ms`\n );\n }\n return true;\n }\n}\n\n\n/**\n * @typedef {Object} StartRecordingOptions\n *\n * @property {string?} resolution Maximum supported resolution on-device (Detected\n * automatically by the app itself), which usually equals to Full HD 1920x1080 on most\n * phones however you can change it to following supported resolutions\n * as well: \"1920x1080\", \"1280x720\", \"720x480\", \"320x240\", \"176x144\".\n * @property {number?} maxDurationSec [900] Default value: 900 seconds which means\n * maximum allowed duration is 15 minute, you can increase it if your test takes\n * longer than that.\n * @property {string?} priority [high] Means recording thread priority is maximum\n * however if you face performance drops during testing with recording enabled, you\n * can reduce recording priority to \"normal\" or \"low\".\n * @property {string?} filename You can type recording video file name as you want,\n * but recording currently supports only \"mp4\" format so your filename must end with \".mp4\".\n * An invalid file name will fail to start the recording.\n * If not provided then the current timestamp will be used as file name.\n */\n\n/**\n * Record the display of a real devices running Android 10 (API level 29) and higher.\n * The screen activity is recorded to a MPEG-4 file. Audio is also recorded by default\n * (only for apps that allow it in their manifests).\n * If another recording has been already started then the command will exit silently.\n * The previously recorded video file is deleted when a new recording session is started.\n * Recording continues it is stopped explicitly or until the timeout happens.\n *\n * @param {?StartRecordingOptions} options Available options.\n * @returns {boolean} True if a new recording has successfully started.\n * @throws {Error} If recording has failed to start or is not supported on the device under test.\n */\ncommands.mobileStartMediaProjectionRecording = async function mobileStartMediaProjectionRecording (options = {}) {\n await verifyMediaProjectionRecordingIsSupported(this.adb);\n\n const {resolution, priority, maxDurationSec, filename} = options;\n const recorder = new MediaProjectionRecorder(this.adb);\n const fname = adjustMediaExtension(filename || moment().format(DEFAULT_FILENAME_FORMAT));\n const didStart = await recorder.start({\n resolution,\n priority,\n maxDurationSec,\n filename: fname,\n });\n if (didStart) {\n this.log.info(`A new media projection recording '${fname}' has been successfully started`);\n } else {\n this.log.info('Another media projection recording is already in progress. There is nothing to start');\n }\n return didStart;\n};\n\n/**\n * Checks if a media projection-based recording is currently running.\n *\n * @returns {boolean} True if a recording is in progress.\n * @throws {Error} If a recording is not supported on the device under test.\n */\ncommands.mobileIsMediaProjectionRecordingRunning = async function mobileIsMediaProjectionRecordingRunning () {\n await verifyMediaProjectionRecordingIsSupported(this.adb);\n\n const recorder = new MediaProjectionRecorder(this.adb);\n return await recorder.isRunning();\n};\n\n/**\n * @typedef {Object} StopRecordingOptions\n *\n * @property {string?} remotePath The path to the remote location, where the resulting video should be uploaded.\n * The following protocols are supported: http/https, ftp.\n * Null or empty string value (the default setting) means the content of resulting\n * file should be encoded as Base64 and passed as the endpoont response value.\n * An exception will be thrown if the generated media file is too big to\n * fit into the available process memory.\n * @property {string?} user The name of the user for the remote authentication.\n * @property {string?} pass The password for the remote authentication.\n * @property {string?} method The http multipart upload method name. The 'PUT' one is used by default.\n * @property {Object?} headers Additional headers mapping for multipart http(s) uploads\n * @property {string?} fileFieldName [file] The name of the form field, where the file content BLOB should be stored for\n * http(s) uploads\n * @property {Object|Array<Pair>?} formFields Additional form fields for multipart http(s) uploads\n */\n\n/**\n * Stop a media projection-based recording.\n * If no recording has been started before then an error is thrown.\n * If the recording has been already finished before this API has been called\n * then the most recent recorded file is returned.\n *\n * @param {?StopRecordingOptions} options Available options.\n * @returns {string} Base64-encoded content of the recorded media file if 'remotePath'\n * parameter is falsy or an empty string.\n * @throws {Error} If there was an error while stopping a recording,\n * fetching the content of the remote media file,\n * or if a recording is not supported on the device under test.\n */\ncommands.mobileStopMediaProjectionRecording = async function mobileStopMediaProjectionRecording (options = {}) {\n await verifyMediaProjectionRecordingIsSupported(this.adb);\n\n const recorder = new MediaProjectionRecorder(this.adb);\n if (await recorder.stop()) {\n this.log.info('Successfully stopped a media projection recording. Pulling the recorded media');\n } else {\n this.log.info('Media projection recording is not running. There is nothing to stop');\n }\n const recentRecordingPath = await recorder.pullRecent();\n if (!recentRecordingPath) {\n throw new Error(`No recent media projection recording have been found. Did you start any?`);\n }\n\n const {remotePath} = options;\n if (_.isEmpty(remotePath)) {\n const {size} = await fs.stat(recentRecordingPath);\n this.log.debug(`The size of the resulting media projection recording is ${util.toReadableSizeString(size)}`);\n }\n try {\n return await uploadRecordedMedia(recentRecordingPath, remotePath, options);\n } finally {\n await fs.rimraf(path.dirname(recentRecordingPath));\n }\n};\n\n\nexport { commands };\nexport default commands;\n"],"mappings":"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"}
1
+ {"version":3,"file":"media-projection.js","names":["_lodash","_interopRequireDefault","require","_asyncbox","_support","_path","_bluebird","_androidHelpers","_moment","commands","exports","DEFAULT_EXT","RECORDING_STARTUP_TIMEOUT_MS","RECORDING_STOP_TIMEOUT_MS","MIN_API_LEVEL","RECORDING_SERVICE_NAME","SETTINGS_HELPER_PKG_ID","RECORDING_ACTIVITY_NAME","RECORDING_ACTION_START","RECORDING_ACTION_STOP","RECORDINGS_ROOT","DEFAULT_FILENAME_FORMAT","uploadRecordedMedia","localFile","remotePath","uploadOptions","_","isEmpty","util","toInMemoryBase64","toString","user","pass","method","headers","fileFieldName","formFields","options","auth","net","uploadFile","adjustMediaExtension","name","toLower","endsWith","verifyMediaProjectionRecordingIsSupported","adb","apiLevel","getApiLevel","Error","MediaProjectionRecorder","constructor","isRunning","stdout","shell","includes","start","opts","cleanup","filename","maxDurationSec","priority","resolution","args","push","B","resolve","reject","setTimeout","pullRecent","recordings","ls","dstPath","path","join","tempDir","openDir","pull","stop","waitForCondition","waitMs","intervalMs","e","mobileStartMediaProjectionRecording","recorder","fname","moment","format","didStart","log","info","mobileIsMediaProjectionRecordingRunning","mobileStopMediaProjectionRecording","recentRecordingPath","size","fs","stat","debug","toReadableSizeString","rimraf","dirname","_default","default"],"sources":["../../../lib/commands/media-projection.js"],"sourcesContent":["import _ from 'lodash';\nimport { waitForCondition } from 'asyncbox';\nimport { util, fs, net, tempDir } from '@appium/support';\nimport path from 'path';\nimport B from 'bluebird';\nimport { SETTINGS_HELPER_PKG_ID } from '../android-helpers';\nimport moment from 'moment';\n\n\nconst commands = {};\n\n// https://github.com/appium/io.appium.settings#internal-audio--video-recording\nconst DEFAULT_EXT = '.mp4';\nconst RECORDING_STARTUP_TIMEOUT_MS = 3 * 1000;\nconst RECORDING_STOP_TIMEOUT_MS = 3 * 1000;\nconst MIN_API_LEVEL = 29;\nconst RECORDING_SERVICE_NAME = `${SETTINGS_HELPER_PKG_ID}/.recorder.RecorderService`;\nconst RECORDING_ACTIVITY_NAME = `${SETTINGS_HELPER_PKG_ID}/io.appium.settings.Settings`;\nconst RECORDING_ACTION_START = `${SETTINGS_HELPER_PKG_ID}.recording.ACTION_START`;\nconst RECORDING_ACTION_STOP = `${SETTINGS_HELPER_PKG_ID}.recording.ACTION_STOP`;\nconst RECORDINGS_ROOT = `/storage/emulated/0/Android/data/${SETTINGS_HELPER_PKG_ID}/files`;\nconst DEFAULT_FILENAME_FORMAT = 'YYYY-MM-DDTHH-mm-ss';\n\n\nasync function uploadRecordedMedia (localFile, remotePath = null, uploadOptions = {}) {\n if (_.isEmpty(remotePath)) {\n return (await util.toInMemoryBase64(localFile)).toString();\n }\n\n const {user, pass, method, headers, fileFieldName, formFields} = uploadOptions;\n const options = {\n method: method || 'PUT',\n headers,\n fileFieldName,\n formFields,\n };\n if (user && pass) {\n options.auth = {user, pass};\n }\n await net.uploadFile(localFile, remotePath, options);\n return '';\n}\n\nfunction adjustMediaExtension (name) {\n return _.toLower(name).endsWith(DEFAULT_EXT) ? name : `${name}${DEFAULT_EXT}`;\n}\n\nasync function verifyMediaProjectionRecordingIsSupported (adb) {\n const apiLevel = await adb.getApiLevel();\n if (apiLevel < MIN_API_LEVEL) {\n throw new Error(`Media projection-based recording is not available on API Level ${apiLevel}. ` +\n `Minimum required API Level is ${MIN_API_LEVEL}.`);\n }\n}\n\n\nclass MediaProjectionRecorder {\n constructor (adb) {\n this.adb = adb;\n }\n\n async isRunning () {\n const stdout = await this.adb.shell([\n 'dumpsys', 'activity', 'services', RECORDING_SERVICE_NAME\n ]);\n return stdout.includes(RECORDING_SERVICE_NAME);\n }\n\n async start (opts = {}) {\n if (await this.isRunning()) {\n return false;\n }\n\n await this.cleanup();\n const {\n filename,\n maxDurationSec,\n priority,\n resolution,\n } = opts;\n const args = [\n 'am', 'start',\n '-n', RECORDING_ACTIVITY_NAME,\n '-a', RECORDING_ACTION_START,\n ];\n if (filename) {\n args.push('--es', 'filename', filename);\n }\n if (maxDurationSec) {\n args.push('--es', 'max_duration_sec', `${maxDurationSec}`);\n }\n if (priority) {\n args.push('--es', 'priority', priority);\n }\n if (resolution) {\n args.push('--es', 'resolution', resolution);\n }\n await this.adb.shell(args);\n await new B((resolve, reject) => {\n setTimeout(async () => {\n if (!await this.isRunning()) {\n return reject(new Error(\n `The media projection recording is not running after ${RECORDING_STARTUP_TIMEOUT_MS}ms. ` +\n `Please check the logcat output for more details.`\n ));\n }\n resolve();\n }, RECORDING_STARTUP_TIMEOUT_MS);\n });\n return true;\n }\n\n async cleanup () {\n await this.adb.shell([`rm -f ${RECORDINGS_ROOT}/*`]);\n }\n\n async pullRecent () {\n const recordings = await this.adb.ls(RECORDINGS_ROOT, ['-tr']);\n if (_.isEmpty(recordings)) {\n return null;\n }\n\n const dstPath = path.join(await tempDir.openDir(), recordings[0]);\n await this.adb.pull(`${RECORDINGS_ROOT}/${recordings[0]}`, dstPath);\n return dstPath;\n }\n\n async stop () {\n if (!await this.isRunning()) {\n return false;\n }\n\n await this.adb.shell([\n 'am', 'start',\n '-n', RECORDING_ACTIVITY_NAME,\n '-a', RECORDING_ACTION_STOP,\n ]);\n try {\n await waitForCondition(async () => !(await this.isRunning()), {\n waitMs: RECORDING_STOP_TIMEOUT_MS,\n intervalMs: 500,\n });\n } catch (e) {\n throw new Error(\n `The attempt to stop the current media projection recording timed out after ` +\n `${RECORDING_STOP_TIMEOUT_MS}ms`\n );\n }\n return true;\n }\n}\n\n\n/**\n * @typedef {Object} StartRecordingOptions\n *\n * @property {string?} resolution Maximum supported resolution on-device (Detected\n * automatically by the app itself), which usually equals to Full HD 1920x1080 on most\n * phones however you can change it to following supported resolutions\n * as well: \"1920x1080\", \"1280x720\", \"720x480\", \"320x240\", \"176x144\".\n * @property {number?} maxDurationSec [900] Default value: 900 seconds which means\n * maximum allowed duration is 15 minute, you can increase it if your test takes\n * longer than that.\n * @property {string?} priority [high] Means recording thread priority is maximum\n * however if you face performance drops during testing with recording enabled, you\n * can reduce recording priority to \"normal\" or \"low\".\n * @property {string?} filename You can type recording video file name as you want,\n * but recording currently supports only \"mp4\" format so your filename must end with \".mp4\".\n * An invalid file name will fail to start the recording.\n * If not provided then the current timestamp will be used as file name.\n */\n\n/**\n * Record the display of a real devices running Android 10 (API level 29) and higher.\n * The screen activity is recorded to a MPEG-4 file. Audio is also recorded by default\n * (only for apps that allow it in their manifests).\n * If another recording has been already started then the command will exit silently.\n * The previously recorded video file is deleted when a new recording session is started.\n * Recording continues it is stopped explicitly or until the timeout happens.\n *\n * @param {?StartRecordingOptions} options Available options.\n * @returns {boolean} True if a new recording has successfully started.\n * @throws {Error} If recording has failed to start or is not supported on the device under test.\n */\ncommands.mobileStartMediaProjectionRecording = async function mobileStartMediaProjectionRecording (options = {}) {\n await verifyMediaProjectionRecordingIsSupported(this.adb);\n\n const {resolution, priority, maxDurationSec, filename} = options;\n const recorder = new MediaProjectionRecorder(this.adb);\n const fname = adjustMediaExtension(filename || moment().format(DEFAULT_FILENAME_FORMAT));\n const didStart = await recorder.start({\n resolution,\n priority,\n maxDurationSec,\n filename: fname,\n });\n if (didStart) {\n this.log.info(`A new media projection recording '${fname}' has been successfully started`);\n } else {\n this.log.info('Another media projection recording is already in progress. There is nothing to start');\n }\n return didStart;\n};\n\n/**\n * Checks if a media projection-based recording is currently running.\n *\n * @returns {boolean} True if a recording is in progress.\n * @throws {Error} If a recording is not supported on the device under test.\n */\ncommands.mobileIsMediaProjectionRecordingRunning = async function mobileIsMediaProjectionRecordingRunning () {\n await verifyMediaProjectionRecordingIsSupported(this.adb);\n\n const recorder = new MediaProjectionRecorder(this.adb);\n return await recorder.isRunning();\n};\n\n/**\n * @typedef {Object} StopRecordingOptions\n *\n * @property {string?} remotePath The path to the remote location, where the resulting video should be uploaded.\n * The following protocols are supported: http/https, ftp.\n * Null or empty string value (the default setting) means the content of resulting\n * file should be encoded as Base64 and passed as the endpoont response value.\n * An exception will be thrown if the generated media file is too big to\n * fit into the available process memory.\n * @property {string?} user The name of the user for the remote authentication.\n * @property {string?} pass The password for the remote authentication.\n * @property {string?} method The http multipart upload method name. The 'PUT' one is used by default.\n * @property {Object?} headers Additional headers mapping for multipart http(s) uploads\n * @property {string?} fileFieldName [file] The name of the form field, where the file content BLOB should be stored for\n * http(s) uploads\n * @property {Object|Array<Pair>?} formFields Additional form fields for multipart http(s) uploads\n */\n\n/**\n * Stop a media projection-based recording.\n * If no recording has been started before then an error is thrown.\n * If the recording has been already finished before this API has been called\n * then the most recent recorded file is returned.\n *\n * @param {?StopRecordingOptions} options Available options.\n * @returns {string} Base64-encoded content of the recorded media file if 'remotePath'\n * parameter is falsy or an empty string.\n * @throws {Error} If there was an error while stopping a recording,\n * fetching the content of the remote media file,\n * or if a recording is not supported on the device under test.\n */\ncommands.mobileStopMediaProjectionRecording = async function mobileStopMediaProjectionRecording (options = {}) {\n await verifyMediaProjectionRecordingIsSupported(this.adb);\n\n const recorder = new MediaProjectionRecorder(this.adb);\n if (await recorder.stop()) {\n this.log.info('Successfully stopped a media projection recording. Pulling the recorded media');\n } else {\n this.log.info('Media projection recording is not running. There is nothing to stop');\n }\n const recentRecordingPath = await recorder.pullRecent();\n if (!recentRecordingPath) {\n throw new Error(`No recent media projection recording have been found. Did you start any?`);\n }\n\n const {remotePath} = options;\n if (_.isEmpty(remotePath)) {\n const {size} = await fs.stat(recentRecordingPath);\n this.log.debug(`The size of the resulting media projection recording is ${util.toReadableSizeString(size)}`);\n }\n try {\n return await uploadRecordedMedia(recentRecordingPath, remotePath, options);\n } finally {\n await fs.rimraf(path.dirname(recentRecordingPath));\n }\n};\n\n\nexport { commands };\nexport default commands;\n"],"mappings":"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"}
@@ -212,4 +212,4 @@ helpers.wrapBootstrapDisconnect = async function wrapBootstrapDisconnect(wrapped
212
212
  Object.assign(extensions, commands, helpers);
213
213
  var _default = extensions;
214
214
  exports.default = _default;
215
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kcyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwiQUlSUExBTkVfTU9ERV9NQVNLIiwiV0lGSV9NQVNLIiwiREFUQV9NQVNLIiwiR0VPX0VQU0lMT04iLCJOdW1iZXIiLCJNSU5fVkFMVUUiLCJnZXROZXR3b3JrQ29ubmVjdGlvbiIsImxvZyIsImluZm8iLCJhaXJwbGFuZU1vZGVPbiIsImFkYiIsImlzQWlycGxhbmVNb2RlT24iLCJjb25uZWN0aW9uIiwid2lmaU9uIiwiaXNXaWZpT24iLCJkYXRhT24iLCJpc0RhdGFPbiIsInNldE5ldHdvcmtDb25uZWN0aW9uIiwidHlwZSIsInNob3VsZEVuYWJsZUFpcnBsYW5lTW9kZSIsInNob3VsZEVuYWJsZVdpZmkiLCJzaG91bGRFbmFibGVEYXRhQ29ubmVjdGlvbiIsImN1cnJlbnRTdGF0ZSIsImlzQWlycGxhbmVNb2RlRW5hYmxlZCIsImlzV2lGaUVuYWJsZWQiLCJpc0RhdGFFbmFibGVkIiwid3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QiLCJzZXRBaXJwbGFuZU1vZGUiLCJicm9hZGNhc3RBaXJwbGFuZU1vZGUiLCJzZXRXaWZpU3RhdGUiLCJzZXREYXRhU3RhdGUiLCJpc0VtdWxhdG9yIiwid2lmaSIsInRvZ2dsZURhdGEiLCJkYXRhIiwic2V0V2lmaUFuZERhdGEiLCJ0b2dnbGVXaUZpIiwidG9nZ2xlRmxpZ2h0TW9kZSIsImZsaWdodE1vZGUiLCJzZXRHZW9Mb2NhdGlvbiIsImxvY2F0aW9uIiwiZ2V0R2VvTG9jYXRpb24iLCJlIiwid2FybiIsIm1lc3NhZ2UiLCJsYXRpdHVkZSIsImxvbmdpdHVkZSIsImFsdGl0dWRlIiwibW9iaWxlUmVmcmVzaEdwc0NhY2hlIiwib3B0cyIsInRpbWVvdXRNcyIsInJlZnJlc2hHZW9Mb2NhdGlvbkNhY2hlIiwicGFyc2VGbG9hdCIsIktleUNvZGUiLCJVUCIsIkRPV04iLCJSSUdIVCIsIkNFTlRFUiIsInRvZ2dsZUxvY2F0aW9uU2VydmljZXMiLCJhcGkiLCJnZXRBcGlMZXZlbCIsInByb3ZpZGVycyIsImdldExvY2F0aW9uUHJvdmlkZXJzIiwiaXNHcHNFbmFibGVkIiwiaW5kZXhPZiIsInRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIiLCJzZXEiLCJwdXNoIiwia2V5ZXZlbnQiLCJ0b2dnbGVTZXR0aW5nIiwiZXJyb3JzIiwiTm90WWV0SW1wbGVtZW50ZWRFcnJvciIsInNldHRpbmciLCJwcmVLZXlTZXEiLCJfIiwiaXNOdWxsIiwib3BlblNldHRpbmdzQWN0aXZpdHkiLCJrZXkiLCJkb0tleSIsImFwcFBhY2thZ2UiLCJhcHBBY3Rpdml0eSIsImdldEZvY3VzZWRQYWNrYWdlQW5kQWN0aXZpdHkiLCJ3YWl0Rm9yTm90QWN0aXZpdHkiLCJpZ24iLCJiYWNrIiwiQiIsImRlbGF5Iiwid3JhcHBlZCIsImJvb3RzdHJhcCIsImlnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93biIsInJlc3RhcnQiLCJzdGFydCIsImRpc2FibGVBbmRyb2lkV2F0Y2hlcnMiLCJhY2NlcHRTc2xDZXJ0cyIsIk9iamVjdCIsImFzc2lnbiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9uZXR3b3JrLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcblxubGV0IGNvbW1hbmRzID0ge30sIGhlbHBlcnMgPSB7fSwgZXh0ZW5zaW9ucyA9IHt9O1xuXG5jb25zdCBBSVJQTEFORV9NT0RFX01BU0sgPSAwYjAwMTtcbmNvbnN0IFdJRklfTUFTSyA9IDBiMDEwO1xuY29uc3QgREFUQV9NQVNLID0gMGIxMDA7XG4vLyBUaGUgdmFsdWUgY2xvc2UgdG8gemVybywgYnV0IG5vdCB6ZXJvLCBpcyBuZWVkZWRcbi8vIHRvIHRyaWNrIEpTT04gZ2VuZXJhdGlvbiBhbmQgc2VuZCBhIGZsb2F0IHZhbHVlIGluc3RlYWQgb2YgYW4gaW50ZWdlcixcbi8vIFRoaXMgYWxsb3dzIHN0cmljdGx5LXR5cGVkIGNsaWVudHMsIGxpa2UgSmF2YSwgdG8gcHJvcGVybHlcbi8vIHBhcnNlIGl0LiBPdGhlcndpc2UgZmxvYXQgMC4wIGlzIGFsd2F5cyByZXByZXNlbnRlZCBhcyBpbnRlZ2VyIDAgaW4gSlMuXG4vLyBUaGUgdmFsdWUgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIERCTF9FUFNJTE9OIChodHRwczovL29wZW5zb3VyY2UuYXBwbGUuY29tL3NvdXJjZS9MaWJjL0xpYmMtNDk4L2luY2x1ZGUvZmxvYXQuaClcbmNvbnN0IEdFT19FUFNJTE9OID0gTnVtYmVyLk1JTl9WQUxVRTtcblxuY29tbWFuZHMuZ2V0TmV0d29ya0Nvbm5lY3Rpb24gPSBhc3luYyBmdW5jdGlvbiBnZXROZXR3b3JrQ29ubmVjdGlvbiAoKSB7XG4gIHRoaXMubG9nLmluZm8oJ0dldHRpbmcgbmV0d29yayBjb25uZWN0aW9uJyk7XG4gIGxldCBhaXJwbGFuZU1vZGVPbiA9IGF3YWl0IHRoaXMuYWRiLmlzQWlycGxhbmVNb2RlT24oKTtcbiAgbGV0IGNvbm5lY3Rpb24gPSBhaXJwbGFuZU1vZGVPbiA/IEFJUlBMQU5FX01PREVfTUFTSyA6IDA7XG5cbiAgLy8gbm8gbmVlZCB0byBjaGVjayBhbnl0aGluZyBlbHNlIGlmIHdlIGFyZSBpbiBhaXJwbGFuZSBtb2RlXG4gIGlmICghYWlycGxhbmVNb2RlT24pIHtcbiAgICBsZXQgd2lmaU9uID0gYXdhaXQgdGhpcy5pc1dpZmlPbigpO1xuICAgIGNvbm5lY3Rpb24gfD0gKHdpZmlPbiA/IFdJRklfTUFTSyA6IDApO1xuICAgIGxldCBkYXRhT24gPSBhd2FpdCB0aGlzLmFkYi5pc0RhdGFPbigpO1xuICAgIGNvbm5lY3Rpb24gfD0gKGRhdGFPbiA/IERBVEFfTUFTSyA6IDApO1xuICB9XG5cbiAgcmV0dXJuIGNvbm5lY3Rpb247XG59O1xuXG4vKipcbiAqIGRlY291cGxpbmcgdG8gb3ZlcnJpZGUgdGhlIGJlaGF2aW91ciBpbiBvdGhlciBkcml2ZXJzIGxpa2UgVWlBdXRvbWF0b3IyLlxuICovXG5jb21tYW5kcy5pc1dpZmlPbiA9IGFzeW5jIGZ1bmN0aW9uIGlzV2lmaU9uICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLmlzV2lmaU9uKCk7XG59O1xuXG5jb21tYW5kcy5zZXROZXR3b3JrQ29ubmVjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIHNldE5ldHdvcmtDb25uZWN0aW9uICh0eXBlKSB7XG4gIHRoaXMubG9nLmluZm8oJ1NldHRpbmcgbmV0d29yayBjb25uZWN0aW9uJyk7XG4gIC8vIGRlY29kZSB0aGUgaW5wdXRcbiAgY29uc3Qgc2hvdWxkRW5hYmxlQWlycGxhbmVNb2RlID0gKHR5cGUgJiBBSVJQTEFORV9NT0RFX01BU0spICE9PSAwO1xuICBjb25zdCBzaG91bGRFbmFibGVXaWZpID0gKHR5cGUgJiBXSUZJX01BU0spICE9PSAwO1xuICBjb25zdCBzaG91bGRFbmFibGVEYXRhQ29ubmVjdGlvbiA9ICh0eXBlICYgREFUQV9NQVNLKSAhPT0gMDtcblxuICBjb25zdCBjdXJyZW50U3RhdGUgPSBhd2FpdCB0aGlzLmdldE5ldHdvcmtDb25uZWN0aW9uKCk7XG4gIGNvbnN0IGlzQWlycGxhbmVNb2RlRW5hYmxlZCA9IChjdXJyZW50U3RhdGUgJiBBSVJQTEFORV9NT0RFX01BU0spICE9PSAwO1xuICBjb25zdCBpc1dpRmlFbmFibGVkID0gKGN1cnJlbnRTdGF0ZSAmIFdJRklfTUFTSykgIT09IDA7XG4gIGNvbnN0IGlzRGF0YUVuYWJsZWQgPSAoY3VycmVudFN0YXRlICYgREFUQV9NQVNLKSAhPT0gMDtcblxuICBpZiAoc2hvdWxkRW5hYmxlQWlycGxhbmVNb2RlICE9PSBpc0FpcnBsYW5lTW9kZUVuYWJsZWQpIHtcbiAgICBhd2FpdCB0aGlzLndyYXBCb290c3RyYXBEaXNjb25uZWN0KGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEFpcnBsYW5lTW9kZShzaG91bGRFbmFibGVBaXJwbGFuZU1vZGUpO1xuICAgIH0pO1xuICAgIGF3YWl0IHRoaXMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5hZGIuYnJvYWRjYXN0QWlycGxhbmVNb2RlKHNob3VsZEVuYWJsZUFpcnBsYW5lTW9kZSk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5sb2cuaW5mbyhgTm90IGNoYW5naW5nIGFpcnBsYW5lIG1vZGUsIHNpbmNlIGl0IGlzIGFscmVhZHkgYCArXG4gICAgICAgICAgICAgYCR7c2hvdWxkRW5hYmxlQWlycGxhbmVNb2RlID8gJ2VuYWJsZWQnIDogJ2Rpc2FibGVkJ31gKTtcbiAgfVxuXG4gIGlmIChzaG91bGRFbmFibGVXaWZpID09PSBpc1dpRmlFbmFibGVkICYmIHNob3VsZEVuYWJsZURhdGFDb25uZWN0aW9uID09PSBpc0RhdGFFbmFibGVkKSB7XG4gICAgdGhpcy5sb2cuaW5mbygnTm90IGNoYW5naW5nIGRhdGEgY29ubmVjdGlvbi9XaS1GaSBzdGF0ZXMsIHNpbmNlIHRoZXkgYXJlIGFscmVhZHkgc2V0IHRvIGV4cGVjdGVkIHZhbHVlcycpO1xuICAgIGlmIChhd2FpdCB0aGlzLmFkYi5pc0FpcnBsYW5lTW9kZU9uKCkpIHtcbiAgICAgIHJldHVybiBBSVJQTEFORV9NT0RFX01BU0sgfCBjdXJyZW50U3RhdGU7XG4gICAgfVxuICAgIHJldHVybiB+QUlSUExBTkVfTU9ERV9NQVNLICYgY3VycmVudFN0YXRlO1xuICB9XG5cbiAgYXdhaXQgdGhpcy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdChhc3luYyAoKSA9PiB7XG4gICAgaWYgKHNob3VsZEVuYWJsZVdpZmkgIT09IGlzV2lGaUVuYWJsZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2V0V2lmaVN0YXRlKHNob3VsZEVuYWJsZVdpZmkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBOb3QgY2hhbmdpbmcgV2ktRmkgc3RhdGUsIHNpbmNlIGl0IGlzIGFscmVhZHkgYCArXG4gICAgICAgIGAke3Nob3VsZEVuYWJsZVdpZmkgPyAnZW5hYmxlZCcgOiAnZGlzYWJsZWQnfWApO1xuICAgIH1cblxuICAgIGlmIChzaG91bGRFbmFibGVBaXJwbGFuZU1vZGUpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ05vdCBjaGFuZ2luZyBkYXRhIGNvbm5lY3Rpb24gc3RhdGUsIGJlY2F1c2UgYWlycGxhbmUgbW9kZSBpcyBlbmFibGVkJyk7XG4gICAgfSBlbHNlIGlmIChzaG91bGRFbmFibGVEYXRhQ29ubmVjdGlvbiA9PT0gaXNEYXRhRW5hYmxlZCkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgTm90IGNoYW5naW5nIGRhdGEgY29ubmVjdGlvbiBzdGF0ZSwgc2luY2UgaXQgaXMgYWxyZWFkeSBgICtcbiAgICAgICAgYCR7c2hvdWxkRW5hYmxlRGF0YUNvbm5lY3Rpb24gPyAnZW5hYmxlZCcgOiAnZGlzYWJsZWQnfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zZXREYXRhU3RhdGUoc2hvdWxkRW5hYmxlRGF0YUNvbm5lY3Rpb24sIHRoaXMuaXNFbXVsYXRvcigpKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBhd2FpdCB0aGlzLmdldE5ldHdvcmtDb25uZWN0aW9uKCk7XG59O1xuXG4vKipcbiAqIGRlY291cGxpbmcgdG8gb3ZlcnJpZGUgYmVoYXZpb3VyIGluIG90aGVyIGRyaXZlcnMgbGlrZSBVaUF1dG9tYXRvcjIuXG4gKi9cbmNvbW1hbmRzLnNldFdpZmlTdGF0ZSA9IGFzeW5jIGZ1bmN0aW9uIHNldFdpZmlTdGF0ZSAod2lmaSkge1xuICBhd2FpdCB0aGlzLmFkYi5zZXRXaWZpU3RhdGUod2lmaSwgdGhpcy5pc0VtdWxhdG9yKCkpO1xufTtcblxuY29tbWFuZHMudG9nZ2xlRGF0YSA9IGFzeW5jIGZ1bmN0aW9uIHRvZ2dsZURhdGEgKCkge1xuICBsZXQgZGF0YSA9ICEoYXdhaXQgdGhpcy5hZGIuaXNEYXRhT24oKSk7XG4gIHRoaXMubG9nLmluZm8oYFR1cm5pbmcgbmV0d29yayBkYXRhICR7ZGF0YSA/ICdvbicgOiAnb2ZmJ31gKTtcbiAgYXdhaXQgdGhpcy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgdGhpcy5hZGIuc2V0V2lmaUFuZERhdGEoe2RhdGF9LCB0aGlzLmlzRW11bGF0b3IoKSk7XG4gIH0pO1xufTtcblxuY29tbWFuZHMudG9nZ2xlV2lGaSA9IGFzeW5jIGZ1bmN0aW9uIHRvZ2dsZVdpRmkgKCkge1xuICBsZXQgd2lmaSA9ICEoYXdhaXQgdGhpcy5hZGIuaXNXaWZpT24oKSk7XG4gIHRoaXMubG9nLmluZm8oYFR1cm5pbmcgV2lGaSAke3dpZmkgPyAnb24nIDogJ29mZid9YCk7XG4gIGF3YWl0IHRoaXMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QoYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHRoaXMuYWRiLnNldFdpZmlBbmREYXRhKHt3aWZpfSwgdGhpcy5pc0VtdWxhdG9yKCkpO1xuICB9KTtcbn07XG5cbmNvbW1hbmRzLnRvZ2dsZUZsaWdodE1vZGUgPSBhc3luYyBmdW5jdGlvbiB0b2dnbGVGbGlnaHRNb2RlICgpIHtcbiAgLypcbiAgICogVE9ETzogSW1wbGVtZW50IGlzUmVhbERldmljZSgpLiBUaGlzIG1ldGhvZCBmYWlscyBvblxuICAgKiByZWFsIGRldmljZXMsIGl0IHNob3VsZCB0aHJvdyBhIE5vdFlldEltcGxlbWVudGVkRXJyb3JcbiAgICovXG4gIGxldCBmbGlnaHRNb2RlID0gIShhd2FpdCB0aGlzLmFkYi5pc0FpcnBsYW5lTW9kZU9uKCkpO1xuICB0aGlzLmxvZy5pbmZvKGBUdXJuaW5nIGZsaWdodCBtb2RlICR7ZmxpZ2h0TW9kZSA/ICdvbicgOiAnb2ZmJ31gKTtcbiAgYXdhaXQgdGhpcy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgdGhpcy5hZGIuc2V0QWlycGxhbmVNb2RlKGZsaWdodE1vZGUpO1xuICB9KTtcbiAgYXdhaXQgdGhpcy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgdGhpcy5hZGIuYnJvYWRjYXN0QWlycGxhbmVNb2RlKGZsaWdodE1vZGUpO1xuICB9KTtcbn07XG5cbmNvbW1hbmRzLnNldEdlb0xvY2F0aW9uID0gYXN5bmMgZnVuY3Rpb24gc2V0R2VvTG9jYXRpb24gKGxvY2F0aW9uKSB7XG4gIGF3YWl0IHRoaXMuYWRiLnNldEdlb0xvY2F0aW9uKGxvY2F0aW9uLCB0aGlzLmlzRW11bGF0b3IoKSk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0R2VvTG9jYXRpb24oKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRoaXMubG9nLndhcm4oYENvdWxkIG5vdCBnZXQgdGhlIGN1cnJlbnQgZ2VvbG9jYXRpb24gaW5mbzogJHtlLm1lc3NhZ2V9YCk7XG4gICAgdGhpcy5sb2cud2FybihgUmV0dXJuaW5nIHRoZSBkZWZhdWx0IHplcm8nZWQgdmFsdWVzYCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhdGl0dWRlOiBHRU9fRVBTSUxPTixcbiAgICAgIGxvbmdpdHVkZTogR0VPX0VQU0lMT04sXG4gICAgICBhbHRpdHVkZTogR0VPX0VQU0lMT04sXG4gICAgfTtcbiAgfVxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBHcHNDYWNoZVJlZnJlc2hPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZW91dE1zIFsyMDAwMF0gVGhlIG1heGltdW0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kc1xuICogdG8gYmxvY2sgdW50aWwgR1BTIGNhY2hlIGlzIHJlZnJlc2hlZC4gUHJvdmlkaW5nIHplcm8gb3IgYSBuZWdhdGl2ZVxuICogdmFsdWUgdG8gaXQgc2tpcHMgd2FpdGluZyBjb21wbGV0ZWx5LlxuICovXG5cbi8qKlxuICogU2VuZHMgYW4gYXN5bmMgcmVxdWVzdCB0byByZWZyZXNoIHRoZSBHUFMgY2FjaGUuXG4gKiBUaGlzIGZlYXR1cmUgb25seSB3b3JrcyBpZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgaGFzXG4gKiBHb29nbGUgUGxheSBTZXJ2aWNlcyBpbnN0YWxsZWQuIEluIGNhc2UgdGhlIHZhbmlsbGFcbiAqIExvY2F0aW9uTWFuYWdlciBpcyB1c2VkIHRoZSBkZXZpY2UgQVBJIGxldmVsIG11c3QgYmUgYXRcbiAqIHZlcnNpb24gMzAgKEFuZHJvaWQgUikgb3IgaGlnaGVyLlxuICpcbiAqIEBwYXJhbSB7R3BzQ2FjaGVSZWZyZXNoT3B0aW9uc30gb3B0c1xuICovXG5jb21tYW5kcy5tb2JpbGVSZWZyZXNoR3BzQ2FjaGUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVSZWZyZXNoR3BzQ2FjaGUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7IHRpbWVvdXRNcyB9ID0gb3B0cztcbiAgYXdhaXQgdGhpcy5hZGIucmVmcmVzaEdlb0xvY2F0aW9uQ2FjaGUodGltZW91dE1zKTtcbn07XG5cbmNvbW1hbmRzLmdldEdlb0xvY2F0aW9uID0gYXN5bmMgZnVuY3Rpb24gZ2V0R2VvTG9jYXRpb24gKCkge1xuICBjb25zdCB7bGF0aXR1ZGUsIGxvbmdpdHVkZSwgYWx0aXR1ZGV9ID0gYXdhaXQgdGhpcy5hZGIuZ2V0R2VvTG9jYXRpb24oKTtcbiAgcmV0dXJuIHtcbiAgICBsYXRpdHVkZTogcGFyc2VGbG9hdChsYXRpdHVkZSkgfHwgR0VPX0VQU0lMT04sXG4gICAgbG9uZ2l0dWRlOiBwYXJzZUZsb2F0KGxvbmdpdHVkZSkgfHwgR0VPX0VQU0lMT04sXG4gICAgYWx0aXR1ZGU6IHBhcnNlRmxvYXQoYWx0aXR1ZGUpIHx8IEdFT19FUFNJTE9OLFxuICB9O1xufTtcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL3ZpZXcvS2V5RXZlbnQuaHRtbCNLRVlDT0RFX0RQQURfQ0VOVEVSXG4vLyBpbiB0aGUgYW5kcm9pZCBkb2NzLCB0aGlzIGlzIGhvdyB0aGUga2V5Y29kZXMgYXJlIGRlZmluZWRcbmNvbnN0IEtleUNvZGUgPSB7XG4gIFVQOiAxOSxcbiAgRE9XTjogMjAsXG4gIFJJR0hUOiAyMixcbiAgQ0VOVEVSOiAyM1xufTtcbmNvbW1hbmRzLnRvZ2dsZUxvY2F0aW9uU2VydmljZXMgPSBhc3luYyBmdW5jdGlvbiB0b2dnbGVMb2NhdGlvblNlcnZpY2VzICgpIHtcbiAgdGhpcy5sb2cuaW5mbygnVG9nZ2xpbmcgbG9jYXRpb24gc2VydmljZXMnKTtcbiAgbGV0IGFwaSA9IGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCk7XG4gIGlmICh0aGlzLmlzRW11bGF0b3IoKSkge1xuICAgIGxldCBwcm92aWRlcnMgPSBhd2FpdCB0aGlzLmFkYi5nZXRMb2NhdGlvblByb3ZpZGVycygpO1xuICAgIGxldCBpc0dwc0VuYWJsZWQgPSBwcm92aWRlcnMuaW5kZXhPZignZ3BzJykgIT09IC0xO1xuICAgIGF3YWl0IHRoaXMuYWRiLnRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIoIWlzR3BzRW5hYmxlZCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGFwaSA+IDE1KSB7XG4gICAgbGV0IHNlcSA9IFtLZXlDb2RlLlVQLCBLZXlDb2RlLlVQXTtcbiAgICBpZiAoYXBpID09PSAxNikge1xuICAgICAgLy8gVGhpcyB2ZXJzaW9uIG9mIEFuZHJvaWQgaGFzIGEgXCJwYXJlbnRcIiBidXR0b24gaW4gaXRzIGFjdGlvbiBiYXJcbiAgICAgIHNlcS5wdXNoKEtleUNvZGUuRE9XTik7XG4gICAgfSBlbHNlIGlmIChhcGkgPCAyOCkge1xuICAgICAgLy8gTmV3ZXIgdmVyc2lvbnMgb2YgQW5kcm9pZCBoYXZlIHRoZSB0b2dnbGUgaW4gdGhlIEFjdGlvbiBiYXJcbiAgICAgIHNlcSA9IFtLZXlDb2RlLlJJR0hULCBLZXlDb2RlLlJJR0hULCBLZXlDb2RlLlVQXTtcbiAgICAgIC8qXG4gICAgICAgKiBPbmNlIHRoZSBMb2NhdGlvbiBzZXJ2aWNlcyBzd2l0Y2ggaXMgT0ZGLCBpdCB3b24ndCByZWNlaXZlIGZvY3VzXG4gICAgICAgKiB3aGVuIGdvaW5nIGJhY2sgdG8gdGhlIExvY2F0aW9uIFNlcnZpY2VzIHNldHRpbmdzIHNjcmVlbiB1bmxlc3Mgd2VcbiAgICAgICAqIHNlbmQgYSBkdW1teSBrZXlldmVudCAoVVApICpiZWZvcmUqIG9wZW5pbmcgdGhlIHNldHRpbmdzIHNjcmVlblxuICAgICAgICovXG4gICAgICBhd2FpdCB0aGlzLmFkYi5rZXlldmVudChLZXlDb2RlLlVQKTtcbiAgICB9IGVsc2UgaWYgKGFwaSA+PSAyOCkge1xuICAgICAgLy8gRXZlbiBuZXdlciB2ZXJzaW9ucyBvZiBhbmRyb2lkIGhhdmUgdGhlIHRvZ2dsZSBpbiBhIGJhciBiZWxvdyB0aGUgYWN0aW9uIGJhclxuICAgICAgLy8gdGhpcyBtZWFucyBhIHNpbmdsZSByaWdodCBjbGljayB3aWxsIGNhdXNlIGl0IHRvIGJlIHNlbGVjdGVkLlxuICAgICAgc2VxID0gW0tleUNvZGUuUklHSFRdO1xuICAgICAgYXdhaXQgdGhpcy5hZGIua2V5ZXZlbnQoS2V5Q29kZS5VUCk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMudG9nZ2xlU2V0dGluZygnTE9DQVRJT05fU09VUkNFX1NFVFRJTkdTJywgc2VxKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBUaGVyZSdzIG5vIGdsb2JhbCBsb2NhdGlvbiBzZXJ2aWNlcyB0b2dnbGUgb24gb2xkZXIgQW5kcm9pZCB2ZXJzaW9uc1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm90WWV0SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG59O1xuXG5oZWxwZXJzLnRvZ2dsZVNldHRpbmcgPSBhc3luYyBmdW5jdGlvbiB0b2dnbGVTZXR0aW5nIChzZXR0aW5nLCBwcmVLZXlTZXEpIHtcbiAgLypcbiAgICogcHJlS2V5U2VxIGlzIHRoZSBrZXlldmVudCBzZXF1ZW5jZSB0byBzZW5kIG92ZXIgQURCIGluIG9yZGVyXG4gICAqIHRvIHBvc2l0aW9uIHRoZSBjdXJzb3Igb24gdGhlIHJpZ2h0IG9wdGlvbi5cbiAgICogQnkgZGVmYXVsdCBpdCdzIFt1cCwgdXAsIGRvd25dIGJlY2F1c2Ugd2UgdXN1YWxseSB0YXJnZXQgdGhlIDFzdCBpdGVtIGluXG4gICAqIHRoZSBzY3JlZW4sIGFuZCBzb21ldGltZXMgd2hlbiBvcGVuaW5nIHNldHRpbmdzIGFjdGl2aXRpZXMgdGhlIGN1cnNvciBpc1xuICAgKiBhbHJlYWR5IHBvc2l0aW9ubmVkIG9uIHRoZSAxc3QgaXRlbSwgYnV0IHdlIGNhbid0IGtub3cgZm9yIHN1cmVcbiAgICovXG4gIGlmIChfLmlzTnVsbChwcmVLZXlTZXEpKSB7XG4gICAgcHJlS2V5U2VxID0gW0tleUNvZGUuVVAsIEtleUNvZGUuVVAsIEtleUNvZGUuRE9XTl07XG4gIH1cblxuICBhd2FpdCB0aGlzLm9wZW5TZXR0aW5nc0FjdGl2aXR5KHNldHRpbmcpO1xuXG4gIGZvciAobGV0IGtleSBvZiBwcmVLZXlTZXEpIHtcbiAgICBhd2FpdCB0aGlzLmRvS2V5KGtleSk7XG4gIH1cblxuICBsZXQge2FwcFBhY2thZ2UsIGFwcEFjdGl2aXR5fSA9IGF3YWl0IHRoaXMuYWRiLmdldEZvY3VzZWRQYWNrYWdlQW5kQWN0aXZpdHkoKTtcblxuICAvKlxuICAgKiBDbGljayBhbmQgaGFuZGxlIHBvdGVudGlhbCBBREIgZGlzY29ubmVjdCB0aGF0IG9jY3VycyBvbiBvZmZpY2lhbFxuICAgKiBlbXVsYXRvciB3aGVuIHRoZSBuZXR3b3JrIGNvbm5lY3Rpb24gaXMgZGlzYWJsZWRcbiAgICovXG4gIGF3YWl0IHRoaXMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QoYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHRoaXMuZG9LZXkoS2V5Q29kZS5DRU5URVIpO1xuICB9KTtcblxuICAvKlxuICAgKiBJbiBvbmUgcGFydGljdWxhciBjYXNlIChlbmFibGUgTG9jYXRpb24gU2VydmljZXMpLCBhIHBvcC11cCBpc1xuICAgKiBkaXNwbGF5ZWQgb24gc29tZSBwbGF0Zm9ybXMgc28gdGhlIHVzZXIgYWNjZXB0cyBvciByZWZ1c2VzIHRoYXQgR29vZ2xlXG4gICAqIGNvbGxlY3RzIGxvY2F0aW9uIGRhdGEuIFNvIHdlIHdhaXQgZm9yIHRoYXQgcG9wLXVwIHRvIG9wZW4sIGlmIGl0XG4gICAqIGRvZXNuJ3QgdGhlbiBwcm9jZWVkXG4gICAqL1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuYWRiLndhaXRGb3JOb3RBY3Rpdml0eShhcHBQYWNrYWdlLCBhcHBBY3Rpdml0eSwgNTAwMCk7XG4gICAgYXdhaXQgdGhpcy5kb0tleShLZXlDb2RlLlJJR0hUKTtcbiAgICBhd2FpdCB0aGlzLmRvS2V5KEtleUNvZGUuQ0VOVEVSKTtcbiAgICBhd2FpdCB0aGlzLmFkYi53YWl0Rm9yTm90QWN0aXZpdHkoYXBwUGFja2FnZSwgYXBwQWN0aXZpdHksIDUwMDApO1xuICB9IGNhdGNoIChpZ24pIHt9XG5cbiAgYXdhaXQgdGhpcy5hZGIuYmFjaygpO1xufTtcblxuaGVscGVycy5kb0tleSA9IGFzeW5jIGZ1bmN0aW9uIGRvS2V5IChrZXkpIHtcbiAgLy8gVE9ETzogQ29uZmlybSB3ZSBuZWVkIHRoaXMgZGVsYXkuIFNlZW1zIHRvIHdvcmsgd2l0aG91dCBpdC5cbiAgYXdhaXQgQi5kZWxheSgyMDAwKTtcbiAgYXdhaXQgdGhpcy5hZGIua2V5ZXZlbnQoa2V5KTtcbn07XG5cbmhlbHBlcnMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QgPSBhc3luYyBmdW5jdGlvbiB3cmFwQm9vdHN0cmFwRGlzY29ubmVjdCAod3JhcHBlZCkge1xuICBpZiAoIXRoaXMuYm9vdHN0cmFwKSB7XG4gICAgcmV0dXJuIGF3YWl0IHdyYXBwZWQoKTtcbiAgfVxuXG4gIHRoaXMuYm9vdHN0cmFwLmlnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93biA9IHRydWU7XG4gIHRyeSB7XG4gICAgYXdhaXQgd3JhcHBlZCgpO1xuICAgIGF3YWl0IHRoaXMuYWRiLnJlc3RhcnQoKTtcbiAgICBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zdGFydCh0aGlzLm9wdHMuYXBwUGFja2FnZSwgdGhpcy5vcHRzLmRpc2FibGVBbmRyb2lkV2F0Y2hlcnMsIHRoaXMub3B0cy5hY2NlcHRTc2xDZXJ0cyk7XG4gIH0gZmluYWxseSB7XG4gICAgdGhpcy5ib290c3RyYXAuaWdub3JlVW5leHBlY3RlZFNodXRkb3duID0gZmFsc2U7XG4gIH1cbn07XG5cbk9iamVjdC5hc3NpZ24oZXh0ZW5zaW9ucywgY29tbWFuZHMsIGhlbHBlcnMpO1xuZXhwb3J0IHsgY29tbWFuZHMsIGhlbHBlcnMgfTtcbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBRUEsSUFBSUEsUUFBUSxHQUFHLENBQUMsQ0FBQztFQUFFQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0VBQUVDLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFBQztBQUFBO0FBRWpELE1BQU1DLGtCQUFrQixHQUFHLEtBQUs7QUFDaEMsTUFBTUMsU0FBUyxHQUFHLEtBQUs7QUFDdkIsTUFBTUMsU0FBUyxHQUFHLEtBQUs7QUFNdkIsTUFBTUMsV0FBVyxHQUFHQyxNQUFNLENBQUNDLFNBQVM7QUFFcENSLFFBQVEsQ0FBQ1Msb0JBQW9CLEdBQUcsZUFBZUEsb0JBQW9CLEdBQUk7RUFDckUsSUFBSSxDQUFDQyxHQUFHLENBQUNDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQztFQUMzQyxJQUFJQyxjQUFjLEdBQUcsTUFBTSxJQUFJLENBQUNDLEdBQUcsQ0FBQ0MsZ0JBQWdCLEVBQUU7RUFDdEQsSUFBSUMsVUFBVSxHQUFHSCxjQUFjLEdBQUdULGtCQUFrQixHQUFHLENBQUM7RUFHeEQsSUFBSSxDQUFDUyxjQUFjLEVBQUU7SUFDbkIsSUFBSUksTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDQyxRQUFRLEVBQUU7SUFDbENGLFVBQVUsSUFBS0MsTUFBTSxHQUFHWixTQUFTLEdBQUcsQ0FBRTtJQUN0QyxJQUFJYyxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUNMLEdBQUcsQ0FBQ00sUUFBUSxFQUFFO0lBQ3RDSixVQUFVLElBQUtHLE1BQU0sR0FBR2IsU0FB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
215
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZHJpdmVyIiwiX2JsdWViaXJkIiwiY29tbWFuZHMiLCJoZWxwZXJzIiwiZXh0ZW5zaW9ucyIsImV4cG9ydHMiLCJBSVJQTEFORV9NT0RFX01BU0siLCJXSUZJX01BU0siLCJEQVRBX01BU0siLCJHRU9fRVBTSUxPTiIsIk51bWJlciIsIk1JTl9WQUxVRSIsImdldE5ldHdvcmtDb25uZWN0aW9uIiwibG9nIiwiaW5mbyIsImFpcnBsYW5lTW9kZU9uIiwiYWRiIiwiaXNBaXJwbGFuZU1vZGVPbiIsImNvbm5lY3Rpb24iLCJ3aWZpT24iLCJpc1dpZmlPbiIsImRhdGFPbiIsImlzRGF0YU9uIiwic2V0TmV0d29ya0Nvbm5lY3Rpb24iLCJ0eXBlIiwic2hvdWxkRW5hYmxlQWlycGxhbmVNb2RlIiwic2hvdWxkRW5hYmxlV2lmaSIsInNob3VsZEVuYWJsZURhdGFDb25uZWN0aW9uIiwiY3VycmVudFN0YXRlIiwiaXNBaXJwbGFuZU1vZGVFbmFibGVkIiwiaXNXaUZpRW5hYmxlZCIsImlzRGF0YUVuYWJsZWQiLCJ3cmFwQm9vdHN0cmFwRGlzY29ubmVjdCIsInNldEFpcnBsYW5lTW9kZSIsImJyb2FkY2FzdEFpcnBsYW5lTW9kZSIsInNldFdpZmlTdGF0ZSIsInNldERhdGFTdGF0ZSIsImlzRW11bGF0b3IiLCJ3aWZpIiwidG9nZ2xlRGF0YSIsImRhdGEiLCJzZXRXaWZpQW5kRGF0YSIsInRvZ2dsZVdpRmkiLCJ0b2dnbGVGbGlnaHRNb2RlIiwiZmxpZ2h0TW9kZSIsInNldEdlb0xvY2F0aW9uIiwibG9jYXRpb24iLCJnZXRHZW9Mb2NhdGlvbiIsImUiLCJ3YXJuIiwibWVzc2FnZSIsImxhdGl0dWRlIiwibG9uZ2l0dWRlIiwiYWx0aXR1ZGUiLCJtb2JpbGVSZWZyZXNoR3BzQ2FjaGUiLCJvcHRzIiwidGltZW91dE1zIiwicmVmcmVzaEdlb0xvY2F0aW9uQ2FjaGUiLCJwYXJzZUZsb2F0IiwiS2V5Q29kZSIsIlVQIiwiRE9XTiIsIlJJR0hUIiwiQ0VOVEVSIiwidG9nZ2xlTG9jYXRpb25TZXJ2aWNlcyIsImFwaSIsImdldEFwaUxldmVsIiwicHJvdmlkZXJzIiwiZ2V0TG9jYXRpb25Qcm92aWRlcnMiLCJpc0dwc0VuYWJsZWQiLCJpbmRleE9mIiwidG9nZ2xlR1BTTG9jYXRpb25Qcm92aWRlciIsInNlcSIsInB1c2giLCJrZXlldmVudCIsInRvZ2dsZVNldHRpbmciLCJlcnJvcnMiLCJOb3RZZXRJbXBsZW1lbnRlZEVycm9yIiwic2V0dGluZyIsInByZUtleVNlcSIsIl8iLCJpc051bGwiLCJvcGVuU2V0dGluZ3NBY3Rpdml0eSIsImtleSIsImRvS2V5IiwiYXBwUGFja2FnZSIsImFwcEFjdGl2aXR5IiwiZ2V0Rm9jdXNlZFBhY2thZ2VBbmRBY3Rpdml0eSIsIndhaXRGb3JOb3RBY3Rpdml0eSIsImlnbiIsImJhY2siLCJCIiwiZGVsYXkiLCJ3cmFwcGVkIiwiYm9vdHN0cmFwIiwiaWdub3JlVW5leHBlY3RlZFNodXRkb3duIiwicmVzdGFydCIsInN0YXJ0IiwiZGlzYWJsZUFuZHJvaWRXYXRjaGVycyIsImFjY2VwdFNzbENlcnRzIiwiT2JqZWN0IiwiYXNzaWduIiwiX2RlZmF1bHQiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL25ldHdvcmsuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGVycm9ycyB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuXG5sZXQgY29tbWFuZHMgPSB7fSwgaGVscGVycyA9IHt9LCBleHRlbnNpb25zID0ge307XG5cbmNvbnN0IEFJUlBMQU5FX01PREVfTUFTSyA9IDBiMDAxO1xuY29uc3QgV0lGSV9NQVNLID0gMGIwMTA7XG5jb25zdCBEQVRBX01BU0sgPSAwYjEwMDtcbi8vIFRoZSB2YWx1ZSBjbG9zZSB0byB6ZXJvLCBidXQgbm90IHplcm8sIGlzIG5lZWRlZFxuLy8gdG8gdHJpY2sgSlNPTiBnZW5lcmF0aW9uIGFuZCBzZW5kIGEgZmxvYXQgdmFsdWUgaW5zdGVhZCBvZiBhbiBpbnRlZ2VyLFxuLy8gVGhpcyBhbGxvd3Mgc3RyaWN0bHktdHlwZWQgY2xpZW50cywgbGlrZSBKYXZhLCB0byBwcm9wZXJseVxuLy8gcGFyc2UgaXQuIE90aGVyd2lzZSBmbG9hdCAwLjAgaXMgYWx3YXlzIHJlcHJlc2VudGVkIGFzIGludGVnZXIgMCBpbiBKUy5cbi8vIFRoZSB2YWx1ZSBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gREJMX0VQU0lMT04gKGh0dHBzOi8vb3BlbnNvdXJjZS5hcHBsZS5jb20vc291cmNlL0xpYmMvTGliYy00OTgvaW5jbHVkZS9mbG9hdC5oKVxuY29uc3QgR0VPX0VQU0lMT04gPSBOdW1iZXIuTUlOX1ZBTFVFO1xuXG5jb21tYW5kcy5nZXROZXR3b3JrQ29ubmVjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIGdldE5ldHdvcmtDb25uZWN0aW9uICgpIHtcbiAgdGhpcy5sb2cuaW5mbygnR2V0dGluZyBuZXR3b3JrIGNvbm5lY3Rpb24nKTtcbiAgbGV0IGFpcnBsYW5lTW9kZU9uID0gYXdhaXQgdGhpcy5hZGIuaXNBaXJwbGFuZU1vZGVPbigpO1xuICBsZXQgY29ubmVjdGlvbiA9IGFpcnBsYW5lTW9kZU9uID8gQUlSUExBTkVfTU9ERV9NQVNLIDogMDtcblxuICAvLyBubyBuZWVkIHRvIGNoZWNrIGFueXRoaW5nIGVsc2UgaWYgd2UgYXJlIGluIGFpcnBsYW5lIG1vZGVcbiAgaWYgKCFhaXJwbGFuZU1vZGVPbikge1xuICAgIGxldCB3aWZpT24gPSBhd2FpdCB0aGlzLmlzV2lmaU9uKCk7XG4gICAgY29ubmVjdGlvbiB8PSAod2lmaU9uID8gV0lGSV9NQVNLIDogMCk7XG4gICAgbGV0IGRhdGFPbiA9IGF3YWl0IHRoaXMuYWRiLmlzRGF0YU9uKCk7XG4gICAgY29ubmVjdGlvbiB8PSAoZGF0YU9uID8gREFUQV9NQVNLIDogMCk7XG4gIH1cblxuICByZXR1cm4gY29ubmVjdGlvbjtcbn07XG5cbi8qKlxuICogZGVjb3VwbGluZyB0byBvdmVycmlkZSB0aGUgYmVoYXZpb3VyIGluIG90aGVyIGRyaXZlcnMgbGlrZSBVaUF1dG9tYXRvcjIuXG4gKi9cbmNvbW1hbmRzLmlzV2lmaU9uID0gYXN5bmMgZnVuY3Rpb24gaXNXaWZpT24gKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIuaXNXaWZpT24oKTtcbn07XG5cbmNvbW1hbmRzLnNldE5ldHdvcmtDb25uZWN0aW9uID0gYXN5bmMgZnVuY3Rpb24gc2V0TmV0d29ya0Nvbm5lY3Rpb24gKHR5cGUpIHtcbiAgdGhpcy5sb2cuaW5mbygnU2V0dGluZyBuZXR3b3JrIGNvbm5lY3Rpb24nKTtcbiAgLy8gZGVjb2RlIHRoZSBpbnB1dFxuICBjb25zdCBzaG91bGRFbmFibGVBaXJwbGFuZU1vZGUgPSAodHlwZSAmIEFJUlBMQU5FX01PREVfTUFTSykgIT09IDA7XG4gIGNvbnN0IHNob3VsZEVuYWJsZVdpZmkgPSAodHlwZSAmIFdJRklfTUFTSykgIT09IDA7XG4gIGNvbnN0IHNob3VsZEVuYWJsZURhdGFDb25uZWN0aW9uID0gKHR5cGUgJiBEQVRBX01BU0spICE9PSAwO1xuXG4gIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IGF3YWl0IHRoaXMuZ2V0TmV0d29ya0Nvbm5lY3Rpb24oKTtcbiAgY29uc3QgaXNBaXJwbGFuZU1vZGVFbmFibGVkID0gKGN1cnJlbnRTdGF0ZSAmIEFJUlBMQU5FX01PREVfTUFTSykgIT09IDA7XG4gIGNvbnN0IGlzV2lGaUVuYWJsZWQgPSAoY3VycmVudFN0YXRlICYgV0lGSV9NQVNLKSAhPT0gMDtcbiAgY29uc3QgaXNEYXRhRW5hYmxlZCA9IChjdXJyZW50U3RhdGUgJiBEQVRBX01BU0spICE9PSAwO1xuXG4gIGlmIChzaG91bGRFbmFibGVBaXJwbGFuZU1vZGUgIT09IGlzQWlycGxhbmVNb2RlRW5hYmxlZCkge1xuICAgIGF3YWl0IHRoaXMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0QWlycGxhbmVNb2RlKHNob3VsZEVuYWJsZUFpcnBsYW5lTW9kZSk7XG4gICAgfSk7XG4gICAgYXdhaXQgdGhpcy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdChhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5icm9hZGNhc3RBaXJwbGFuZU1vZGUoc2hvdWxkRW5hYmxlQWlycGxhbmVNb2RlKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmxvZy5pbmZvKGBOb3QgY2hhbmdpbmcgYWlycGxhbmUgbW9kZSwgc2luY2UgaXQgaXMgYWxyZWFkeSBgICtcbiAgICAgICAgICAgICBgJHtzaG91bGRFbmFibGVBaXJwbGFuZU1vZGUgPyAnZW5hYmxlZCcgOiAnZGlzYWJsZWQnfWApO1xuICB9XG5cbiAgaWYgKHNob3VsZEVuYWJsZVdpZmkgPT09IGlzV2lGaUVuYWJsZWQgJiYgc2hvdWxkRW5hYmxlRGF0YUNvbm5lY3Rpb24gPT09IGlzRGF0YUVuYWJsZWQpIHtcbiAgICB0aGlzLmxvZy5pbmZvKCdOb3QgY2hhbmdpbmcgZGF0YSBjb25uZWN0aW9uL1dpLUZpIHN0YXRlcywgc2luY2UgdGhleSBhcmUgYWxyZWFkeSBzZXQgdG8gZXhwZWN0ZWQgdmFsdWVzJyk7XG4gICAgaWYgKGF3YWl0IHRoaXMuYWRiLmlzQWlycGxhbmVNb2RlT24oKSkge1xuICAgICAgcmV0dXJuIEFJUlBMQU5FX01PREVfTUFTSyB8IGN1cnJlbnRTdGF0ZTtcbiAgICB9XG4gICAgcmV0dXJuIH5BSVJQTEFORV9NT0RFX01BU0sgJiBjdXJyZW50U3RhdGU7XG4gIH1cblxuICBhd2FpdCB0aGlzLndyYXBCb290c3RyYXBEaXNjb25uZWN0KGFzeW5jICgpID0+IHtcbiAgICBpZiAoc2hvdWxkRW5hYmxlV2lmaSAhPT0gaXNXaUZpRW5hYmxlZCkge1xuICAgICAgYXdhaXQgdGhpcy5zZXRXaWZpU3RhdGUoc2hvdWxkRW5hYmxlV2lmaSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYE5vdCBjaGFuZ2luZyBXaS1GaSBzdGF0ZSwgc2luY2UgaXQgaXMgYWxyZWFkeSBgICtcbiAgICAgICAgYCR7c2hvdWxkRW5hYmxlV2lmaSA/ICdlbmFibGVkJyA6ICdkaXNhYmxlZCd9YCk7XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZEVuYWJsZUFpcnBsYW5lTW9kZSkge1xuICAgICAgdGhpcy5sb2cuaW5mbygnTm90IGNoYW5naW5nIGRhdGEgY29ubmVjdGlvbiBzdGF0ZSwgYmVjYXVzZSBhaXJwbGFuZSBtb2RlIGlzIGVuYWJsZWQnKTtcbiAgICB9IGVsc2UgaWYgKHNob3VsZEVuYWJsZURhdGFDb25uZWN0aW9uID09PSBpc0RhdGFFbmFibGVkKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBOb3QgY2hhbmdpbmcgZGF0YSBjb25uZWN0aW9uIHN0YXRlLCBzaW5jZSBpdCBpcyBhbHJlYWR5IGAgK1xuICAgICAgICBgJHtzaG91bGRFbmFibGVEYXRhQ29ubmVjdGlvbiA/ICdlbmFibGVkJyA6ICdkaXNhYmxlZCd9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnNldERhdGFTdGF0ZShzaG91bGRFbmFibGVEYXRhQ29ubmVjdGlvbiwgdGhpcy5pc0VtdWxhdG9yKCkpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0TmV0d29ya0Nvbm5lY3Rpb24oKTtcbn07XG5cbi8qKlxuICogZGVjb3VwbGluZyB0byBvdmVycmlkZSBiZWhhdmlvdXIgaW4gb3RoZXIgZHJpdmVycyBsaWtlIFVpQXV0b21hdG9yMi5cbiAqL1xuY29tbWFuZHMuc2V0V2lmaVN0YXRlID0gYXN5bmMgZnVuY3Rpb24gc2V0V2lmaVN0YXRlICh3aWZpKSB7XG4gIGF3YWl0IHRoaXMuYWRiLnNldFdpZmlTdGF0ZSh3aWZpLCB0aGlzLmlzRW11bGF0b3IoKSk7XG59O1xuXG5jb21tYW5kcy50b2dnbGVEYXRhID0gYXN5bmMgZnVuY3Rpb24gdG9nZ2xlRGF0YSAoKSB7XG4gIGxldCBkYXRhID0gIShhd2FpdCB0aGlzLmFkYi5pc0RhdGFPbigpKTtcbiAgdGhpcy5sb2cuaW5mbyhgVHVybmluZyBuZXR3b3JrIGRhdGEgJHtkYXRhID8gJ29uJyA6ICdvZmYnfWApO1xuICBhd2FpdCB0aGlzLndyYXBCb290c3RyYXBEaXNjb25uZWN0KGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCB0aGlzLmFkYi5zZXRXaWZpQW5kRGF0YSh7ZGF0YX0sIHRoaXMuaXNFbXVsYXRvcigpKTtcbiAgfSk7XG59O1xuXG5jb21tYW5kcy50b2dnbGVXaUZpID0gYXN5bmMgZnVuY3Rpb24gdG9nZ2xlV2lGaSAoKSB7XG4gIGxldCB3aWZpID0gIShhd2FpdCB0aGlzLmFkYi5pc1dpZmlPbigpKTtcbiAgdGhpcy5sb2cuaW5mbyhgVHVybmluZyBXaUZpICR7d2lmaSA/ICdvbicgOiAnb2ZmJ31gKTtcbiAgYXdhaXQgdGhpcy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgdGhpcy5hZGIuc2V0V2lmaUFuZERhdGEoe3dpZml9LCB0aGlzLmlzRW11bGF0b3IoKSk7XG4gIH0pO1xufTtcblxuY29tbWFuZHMudG9nZ2xlRmxpZ2h0TW9kZSA9IGFzeW5jIGZ1bmN0aW9uIHRvZ2dsZUZsaWdodE1vZGUgKCkge1xuICAvKlxuICAgKiBUT0RPOiBJbXBsZW1lbnQgaXNSZWFsRGV2aWNlKCkuIFRoaXMgbWV0aG9kIGZhaWxzIG9uXG4gICAqIHJlYWwgZGV2aWNlcywgaXQgc2hvdWxkIHRocm93IGEgTm90WWV0SW1wbGVtZW50ZWRFcnJvclxuICAgKi9cbiAgbGV0IGZsaWdodE1vZGUgPSAhKGF3YWl0IHRoaXMuYWRiLmlzQWlycGxhbmVNb2RlT24oKSk7XG4gIHRoaXMubG9nLmluZm8oYFR1cm5pbmcgZmxpZ2h0IG1vZGUgJHtmbGlnaHRNb2RlID8gJ29uJyA6ICdvZmYnfWApO1xuICBhd2FpdCB0aGlzLndyYXBCb290c3RyYXBEaXNjb25uZWN0KGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCB0aGlzLmFkYi5zZXRBaXJwbGFuZU1vZGUoZmxpZ2h0TW9kZSk7XG4gIH0pO1xuICBhd2FpdCB0aGlzLndyYXBCb290c3RyYXBEaXNjb25uZWN0KGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCB0aGlzLmFkYi5icm9hZGNhc3RBaXJwbGFuZU1vZGUoZmxpZ2h0TW9kZSk7XG4gIH0pO1xufTtcblxuY29tbWFuZHMuc2V0R2VvTG9jYXRpb24gPSBhc3luYyBmdW5jdGlvbiBzZXRHZW9Mb2NhdGlvbiAobG9jYXRpb24pIHtcbiAgYXdhaXQgdGhpcy5hZGIuc2V0R2VvTG9jYXRpb24obG9jYXRpb24sIHRoaXMuaXNFbXVsYXRvcigpKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRHZW9Mb2NhdGlvbigpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhpcy5sb2cud2FybihgQ291bGQgbm90IGdldCB0aGUgY3VycmVudCBnZW9sb2NhdGlvbiBpbmZvOiAke2UubWVzc2FnZX1gKTtcbiAgICB0aGlzLmxvZy53YXJuKGBSZXR1cm5pbmcgdGhlIGRlZmF1bHQgemVybydlZCB2YWx1ZXNgKTtcbiAgICByZXR1cm4ge1xuICAgICAgbGF0aXR1ZGU6IEdFT19FUFNJTE9OLFxuICAgICAgbG9uZ2l0dWRlOiBHRU9fRVBTSUxPTixcbiAgICAgIGFsdGl0dWRlOiBHRU9fRVBTSUxPTixcbiAgICB9O1xuICB9XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEdwc0NhY2hlUmVmcmVzaE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lb3V0TXMgWzIwMDAwXSBUaGUgbWF4aW11bSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzXG4gKiB0byBibG9jayB1bnRpbCBHUFMgY2FjaGUgaXMgcmVmcmVzaGVkLiBQcm92aWRpbmcgemVybyBvciBhIG5lZ2F0aXZlXG4gKiB2YWx1ZSB0byBpdCBza2lwcyB3YWl0aW5nIGNvbXBsZXRlbHkuXG4gKi9cblxuLyoqXG4gKiBTZW5kcyBhbiBhc3luYyByZXF1ZXN0IHRvIHJlZnJlc2ggdGhlIEdQUyBjYWNoZS5cbiAqIFRoaXMgZmVhdHVyZSBvbmx5IHdvcmtzIGlmIHRoZSBkZXZpY2UgdW5kZXIgdGVzdCBoYXNcbiAqIEdvb2dsZSBQbGF5IFNlcnZpY2VzIGluc3RhbGxlZC4gSW4gY2FzZSB0aGUgdmFuaWxsYVxuICogTG9jYXRpb25NYW5hZ2VyIGlzIHVzZWQgdGhlIGRldmljZSBBUEkgbGV2ZWwgbXVzdCBiZSBhdFxuICogdmVyc2lvbiAzMCAoQW5kcm9pZCBSKSBvciBoaWdoZXIuXG4gKlxuICogQHBhcmFtIHtHcHNDYWNoZVJlZnJlc2hPcHRpb25zfSBvcHRzXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVJlZnJlc2hHcHNDYWNoZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVJlZnJlc2hHcHNDYWNoZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHsgdGltZW91dE1zIH0gPSBvcHRzO1xuICBhd2FpdCB0aGlzLmFkYi5yZWZyZXNoR2VvTG9jYXRpb25DYWNoZSh0aW1lb3V0TXMpO1xufTtcblxuY29tbWFuZHMuZ2V0R2VvTG9jYXRpb24gPSBhc3luYyBmdW5jdGlvbiBnZXRHZW9Mb2NhdGlvbiAoKSB7XG4gIGNvbnN0IHtsYXRpdHVkZSwgbG9uZ2l0dWRlLCBhbHRpdHVkZX0gPSBhd2FpdCB0aGlzLmFkYi5nZXRHZW9Mb2NhdGlvbigpO1xuICByZXR1cm4ge1xuICAgIGxhdGl0dWRlOiBwYXJzZUZsb2F0KGxhdGl0dWRlKSB8fCBHRU9fRVBTSUxPTixcbiAgICBsb25naXR1ZGU6IHBhcnNlRmxvYXQobG9uZ2l0dWRlKSB8fCBHRU9fRVBTSUxPTixcbiAgICBhbHRpdHVkZTogcGFyc2VGbG9hdChhbHRpdHVkZSkgfHwgR0VPX0VQU0lMT04sXG4gIH07XG59O1xuLy8gaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvdmlldy9LZXlFdmVudC5odG1sI0tFWUNPREVfRFBBRF9DRU5URVJcbi8vIGluIHRoZSBhbmRyb2lkIGRvY3MsIHRoaXMgaXMgaG93IHRoZSBrZXljb2RlcyBhcmUgZGVmaW5lZFxuY29uc3QgS2V5Q29kZSA9IHtcbiAgVVA6IDE5LFxuICBET1dOOiAyMCxcbiAgUklHSFQ6IDIyLFxuICBDRU5URVI6IDIzXG59O1xuY29tbWFuZHMudG9nZ2xlTG9jYXRpb25TZXJ2aWNlcyA9IGFzeW5jIGZ1bmN0aW9uIHRvZ2dsZUxvY2F0aW9uU2VydmljZXMgKCkge1xuICB0aGlzLmxvZy5pbmZvKCdUb2dnbGluZyBsb2NhdGlvbiBzZXJ2aWNlcycpO1xuICBsZXQgYXBpID0gYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKTtcbiAgaWYgKHRoaXMuaXNFbXVsYXRvcigpKSB7XG4gICAgbGV0IHByb3ZpZGVycyA9IGF3YWl0IHRoaXMuYWRiLmdldExvY2F0aW9uUHJvdmlkZXJzKCk7XG4gICAgbGV0IGlzR3BzRW5hYmxlZCA9IHByb3ZpZGVycy5pbmRleE9mKCdncHMnKSAhPT0gLTE7XG4gICAgYXdhaXQgdGhpcy5hZGIudG9nZ2xlR1BTTG9jYXRpb25Qcm92aWRlcighaXNHcHNFbmFibGVkKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoYXBpID4gMTUpIHtcbiAgICBsZXQgc2VxID0gW0tleUNvZGUuVVAsIEtleUNvZGUuVVBdO1xuICAgIGlmIChhcGkgPT09IDE2KSB7XG4gICAgICAvLyBUaGlzIHZlcnNpb24gb2YgQW5kcm9pZCBoYXMgYSBcInBhcmVudFwiIGJ1dHRvbiBpbiBpdHMgYWN0aW9uIGJhclxuICAgICAgc2VxLnB1c2goS2V5Q29kZS5ET1dOKTtcbiAgICB9IGVsc2UgaWYgKGFwaSA8IDI4KSB7XG4gICAgICAvLyBOZXdlciB2ZXJzaW9ucyBvZiBBbmRyb2lkIGhhdmUgdGhlIHRvZ2dsZSBpbiB0aGUgQWN0aW9uIGJhclxuICAgICAgc2VxID0gW0tleUNvZGUuUklHSFQsIEtleUNvZGUuUklHSFQsIEtleUNvZGUuVVBdO1xuICAgICAgLypcbiAgICAgICAqIE9uY2UgdGhlIExvY2F0aW9uIHNlcnZpY2VzIHN3aXRjaCBpcyBPRkYsIGl0IHdvbid0IHJlY2VpdmUgZm9jdXNcbiAgICAgICAqIHdoZW4gZ29pbmcgYmFjayB0byB0aGUgTG9jYXRpb24gU2VydmljZXMgc2V0dGluZ3Mgc2NyZWVuIHVubGVzcyB3ZVxuICAgICAgICogc2VuZCBhIGR1bW15IGtleWV2ZW50IChVUCkgKmJlZm9yZSogb3BlbmluZyB0aGUgc2V0dGluZ3Mgc2NyZWVuXG4gICAgICAgKi9cbiAgICAgIGF3YWl0IHRoaXMuYWRiLmtleWV2ZW50KEtleUNvZGUuVVApO1xuICAgIH0gZWxzZSBpZiAoYXBpID49IDI4KSB7XG4gICAgICAvLyBFdmVuIG5ld2VyIHZlcnNpb25zIG9mIGFuZHJvaWQgaGF2ZSB0aGUgdG9nZ2xlIGluIGEgYmFyIGJlbG93IHRoZSBhY3Rpb24gYmFyXG4gICAgICAvLyB0aGlzIG1lYW5zIGEgc2luZ2xlIHJpZ2h0IGNsaWNrIHdpbGwgY2F1c2UgaXQgdG8gYmUgc2VsZWN0ZWQuXG4gICAgICBzZXEgPSBbS2V5Q29kZS5SSUdIVF07XG4gICAgICBhd2FpdCB0aGlzLmFkYi5rZXlldmVudChLZXlDb2RlLlVQKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy50b2dnbGVTZXR0aW5nKCdMT0NBVElPTl9TT1VSQ0VfU0VUVElOR1MnLCBzZXEpO1xuICB9IGVsc2Uge1xuICAgIC8vIFRoZXJlJ3Mgbm8gZ2xvYmFsIGxvY2F0aW9uIHNlcnZpY2VzIHRvZ2dsZSBvbiBvbGRlciBBbmRyb2lkIHZlcnNpb25zXG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RZZXRJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cbn07XG5cbmhlbHBlcnMudG9nZ2xlU2V0dGluZyA9IGFzeW5jIGZ1bmN0aW9uIHRvZ2dsZVNldHRpbmcgKHNldHRpbmcsIHByZUtleVNlcSkge1xuICAvKlxuICAgKiBwcmVLZXlTZXEgaXMgdGhlIGtleWV2ZW50IHNlcXVlbmNlIHRvIHNlbmQgb3ZlciBBREIgaW4gb3JkZXJcbiAgICogdG8gcG9zaXRpb24gdGhlIGN1cnNvciBvbiB0aGUgcmlnaHQgb3B0aW9uLlxuICAgKiBCeSBkZWZhdWx0IGl0J3MgW3VwLCB1cCwgZG93bl0gYmVjYXVzZSB3ZSB1c3VhbGx5IHRhcmdldCB0aGUgMXN0IGl0ZW0gaW5cbiAgICogdGhlIHNjcmVlbiwgYW5kIHNvbWV0aW1lcyB3aGVuIG9wZW5pbmcgc2V0dGluZ3MgYWN0aXZpdGllcyB0aGUgY3Vyc29yIGlzXG4gICAqIGFscmVhZHkgcG9zaXRpb25uZWQgb24gdGhlIDFzdCBpdGVtLCBidXQgd2UgY2FuJ3Qga25vdyBmb3Igc3VyZVxuICAgKi9cbiAgaWYgKF8uaXNOdWxsKHByZUtleVNlcSkpIHtcbiAgICBwcmVLZXlTZXEgPSBbS2V5Q29kZS5VUCwgS2V5Q29kZS5VUCwgS2V5Q29kZS5ET1dOXTtcbiAgfVxuXG4gIGF3YWl0IHRoaXMub3BlblNldHRpbmdzQWN0aXZpdHkoc2V0dGluZyk7XG5cbiAgZm9yIChsZXQga2V5IG9mIHByZUtleVNlcSkge1xuICAgIGF3YWl0IHRoaXMuZG9LZXkoa2V5KTtcbiAgfVxuXG4gIGxldCB7YXBwUGFja2FnZSwgYXBwQWN0aXZpdHl9ID0gYXdhaXQgdGhpcy5hZGIuZ2V0Rm9jdXNlZFBhY2thZ2VBbmRBY3Rpdml0eSgpO1xuXG4gIC8qXG4gICAqIENsaWNrIGFuZCBoYW5kbGUgcG90ZW50aWFsIEFEQiBkaXNjb25uZWN0IHRoYXQgb2NjdXJzIG9uIG9mZmljaWFsXG4gICAqIGVtdWxhdG9yIHdoZW4gdGhlIG5ldHdvcmsgY29ubmVjdGlvbiBpcyBkaXNhYmxlZFxuICAgKi9cbiAgYXdhaXQgdGhpcy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgdGhpcy5kb0tleShLZXlDb2RlLkNFTlRFUik7XG4gIH0pO1xuXG4gIC8qXG4gICAqIEluIG9uZSBwYXJ0aWN1bGFyIGNhc2UgKGVuYWJsZSBMb2NhdGlvbiBTZXJ2aWNlcyksIGEgcG9wLXVwIGlzXG4gICAqIGRpc3BsYXllZCBvbiBzb21lIHBsYXRmb3JtcyBzbyB0aGUgdXNlciBhY2NlcHRzIG9yIHJlZnVzZXMgdGhhdCBHb29nbGVcbiAgICogY29sbGVjdHMgbG9jYXRpb24gZGF0YS4gU28gd2Ugd2FpdCBmb3IgdGhhdCBwb3AtdXAgdG8gb3BlbiwgaWYgaXRcbiAgICogZG9lc24ndCB0aGVuIHByb2NlZWRcbiAgICovXG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5hZGIud2FpdEZvck5vdEFjdGl2aXR5KGFwcFBhY2thZ2UsIGFwcEFjdGl2aXR5LCA1MDAwKTtcbiAgICBhd2FpdCB0aGlzLmRvS2V5KEtleUNvZGUuUklHSFQpO1xuICAgIGF3YWl0IHRoaXMuZG9LZXkoS2V5Q29kZS5DRU5URVIpO1xuICAgIGF3YWl0IHRoaXMuYWRiLndhaXRGb3JOb3RBY3Rpdml0eShhcHBQYWNrYWdlLCBhcHBBY3Rpdml0eSwgNTAwMCk7XG4gIH0gY2F0Y2ggKGlnbikge31cblxuICBhd2FpdCB0aGlzLmFkYi5iYWNrKCk7XG59O1xuXG5oZWxwZXJzLmRvS2V5ID0gYXN5bmMgZnVuY3Rpb24gZG9LZXkgKGtleSkge1xuICAvLyBUT0RPOiBDb25maXJtIHdlIG5lZWQgdGhpcyBkZWxheS4gU2VlbXMgdG8gd29yayB3aXRob3V0IGl0LlxuICBhd2FpdCBCLmRlbGF5KDIwMDApO1xuICBhd2FpdCB0aGlzLmFkYi5rZXlldmVudChrZXkpO1xufTtcblxuaGVscGVycy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdCA9IGFzeW5jIGZ1bmN0aW9uIHdyYXBCb290c3RyYXBEaXNjb25uZWN0ICh3cmFwcGVkKSB7XG4gIGlmICghdGhpcy5ib290c3RyYXApIHtcbiAgICByZXR1cm4gYXdhaXQgd3JhcHBlZCgpO1xuICB9XG5cbiAgdGhpcy5ib290c3RyYXAuaWdub3JlVW5leHBlY3RlZFNodXRkb3duID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB3cmFwcGVkKCk7XG4gICAgYXdhaXQgdGhpcy5hZGIucmVzdGFydCgpO1xuICAgIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnN0YXJ0KHRoaXMub3B0cy5hcHBQYWNrYWdlLCB0aGlzLm9wdHMuZGlzYWJsZUFuZHJvaWRXYXRjaGVycywgdGhpcy5vcHRzLmFjY2VwdFNzbENlcnRzKTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0aGlzLmJvb3RzdHJhcC5pZ25vcmVVbmV4cGVjdGVkU2h1dGRvd24gPSBmYWxzZTtcbiAgfVxufTtcblxuT2JqZWN0LmFzc2lnbihleHRlbnNpb25zLCBjb21tYW5kcywgaGVscGVycyk7XG5leHBvcnQgeyBjb21tYW5kcywgaGVscGVycyB9O1xuZXhwb3J0IGRlZmF1bHQgZXh0ZW5zaW9ucztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQSxJQUFBQSxPQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxTQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFFQSxJQUFJRyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0VBQUVDLE9BQU8sR0FBRyxDQUFDLENBQUM7RUFBRUMsVUFBVSxHQUFHLENBQUMsQ0FBQztBQUFDQyxPQUFBLENBQUFGLE9BQUEsR0FBQUEsT0FBQTtBQUFBRSxPQUFBLENBQUFILFFBQUEsR0FBQUEsUUFBQTtBQUVqRCxNQUFNSSxrQkFBa0IsR0FBRyxLQUFLO0FBQ2hDLE1BQU1DLFNBQVMsR0FBRyxLQUFLO0FBQ3ZCLE1BQU1DLFNBQVMsR0FBRyxLQUFLO0FBTXZCLE1BQU1DLFdBQVcsR0FBR0MsTUFBTSxDQUFDQyxTQUFTO0FBRXBDVCxRQUFRLENBQUNVLG9CQUFvQixHQUFHLGVBQWVBLG9CQUFvQkEsQ0FBQSxFQUFJO0VBQ3JFLElBQUksQ0FBQ0MsR0FBRyxDQUFDQyxJQUFJLENBQUMsNEJBQTRCLENBQUM7RUFDM0MsSUFBSUMsY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDQyxHQUFHLENBQUNDLGdCQUFnQixFQUFFO0VBQ3RELElBQUlD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