appium-adb 9.11.6 → 9.11.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
## [9.11.7](https://github.com/appium/appium-adb/compare/v9.11.6...v9.11.7) (2023-06-11)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* Streamline parameters validation for emulator commands ([#666](https://github.com/appium/appium-adb/issues/666)) ([70bdf96](https://github.com/appium/appium-adb/commit/70bdf96a5557a27fb2b035a9cc23fdb7a30db547))
|
|
7
|
+
|
|
1
8
|
## [9.11.6](https://github.com/appium/appium-adb/compare/v9.11.5...v9.11.6) (2023-06-07)
|
|
2
9
|
|
|
3
10
|
|
|
@@ -14,7 +14,6 @@ var _support = require("@appium/support");
|
|
|
14
14
|
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
15
15
|
var _path = _interopRequireDefault(require("path"));
|
|
16
16
|
var _ini = _interopRequireDefault(require("ini"));
|
|
17
|
-
const PHONE_NUMBER_PATTERN = /^[+]?[(]?[0-9]*[)]?[-\s.]?[0-9]*[-\s.]?[0-9]{2,}$/im;
|
|
18
17
|
const emuMethods = {};
|
|
19
18
|
emuMethods.POWER_AC_STATES = Object.freeze({
|
|
20
19
|
POWER_AC_ON: 'on',
|
|
@@ -139,7 +138,7 @@ emuMethods.sensorSet = async function sensorSet(sensor, value) {
|
|
|
139
138
|
emuMethods.powerCapacity = async function powerCapacity(percent = 100) {
|
|
140
139
|
percent = parseInt(percent, 10);
|
|
141
140
|
if (isNaN(percent) || percent < 0 || percent > 100) {
|
|
142
|
-
throw new
|
|
141
|
+
throw new TypeError(`The percentage value should be valid integer between 0 and 100`);
|
|
143
142
|
}
|
|
144
143
|
await this.adbExecEmu(['power', 'capacity', percent]);
|
|
145
144
|
};
|
|
@@ -148,42 +147,39 @@ emuMethods.powerOFF = async function powerOFF() {
|
|
|
148
147
|
await this.powerCapacity(0);
|
|
149
148
|
};
|
|
150
149
|
emuMethods.sendSMS = async function sendSMS(phoneNumber, message = '') {
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
throw new Error('Sending an SMS requires a message');
|
|
150
|
+
if (_lodash.default.isEmpty(message)) {
|
|
151
|
+
throw new TypeError('SMS message must not be empty');
|
|
154
152
|
}
|
|
155
|
-
phoneNumber
|
|
156
|
-
|
|
157
|
-
throw new Error(`Invalid sendSMS phoneNumber param ${phoneNumber}`);
|
|
153
|
+
if (!_lodash.default.isInteger(phoneNumber) && _lodash.default.isEmpty(phoneNumber)) {
|
|
154
|
+
throw new TypeError('Phone number most not be empty');
|
|
158
155
|
}
|
|
159
156
|
await this.adbExecEmu(['sms', 'send', phoneNumber, message]);
|
|
160
157
|
};
|
|
161
|
-
emuMethods.gsmCall = async function gsmCall(phoneNumber, action
|
|
162
|
-
if (_lodash.default.values(emuMethods.GSM_CALL_ACTIONS).
|
|
163
|
-
throw new
|
|
158
|
+
emuMethods.gsmCall = async function gsmCall(phoneNumber, action) {
|
|
159
|
+
if (!_lodash.default.values(emuMethods.GSM_CALL_ACTIONS).includes(action)) {
|
|
160
|
+
throw new TypeError(`Invalid gsm action param ${action}. Supported values: ${_lodash.default.values(emuMethods.GSM_CALL_ACTIONS)}`);
|
|
164
161
|
}
|
|
165
|
-
phoneNumber
|
|
166
|
-
|
|
167
|
-
throw new Error(`Invalid gsmCall phoneNumber param ${phoneNumber}`);
|
|
162
|
+
if (!_lodash.default.isInteger(phoneNumber) && _lodash.default.isEmpty(phoneNumber)) {
|
|
163
|
+
throw new TypeError('Phone number most not be empty');
|
|
168
164
|
}
|
|
169
165
|
await this.adbExecEmu(['gsm', action, phoneNumber]);
|
|
170
166
|
};
|
|
171
167
|
emuMethods.gsmSignal = async function gsmSignal(strength = 4) {
|
|
172
168
|
strength = parseInt(strength, 10);
|
|
173
|
-
if (emuMethods.GSM_SIGNAL_STRENGTHS.
|
|
174
|
-
throw new
|
|
169
|
+
if (!emuMethods.GSM_SIGNAL_STRENGTHS.includes(strength)) {
|
|
170
|
+
throw new TypeError(`Invalid signal strength param ${strength}. Supported values: ${_lodash.default.values(emuMethods.GSM_SIGNAL_STRENGTHS)}`);
|
|
175
171
|
}
|
|
176
172
|
_logger.default.info('gsm signal-profile <strength> changes the reported strength on next (15s) update.');
|
|
177
173
|
await this.adbExecEmu(['gsm', 'signal-profile', strength]);
|
|
178
174
|
};
|
|
179
175
|
emuMethods.gsmVoice = async function gsmVoice(state = 'on') {
|
|
180
|
-
if (_lodash.default.values(emuMethods.GSM_VOICE_STATES).
|
|
181
|
-
throw new
|
|
176
|
+
if (!_lodash.default.values(emuMethods.GSM_VOICE_STATES).includes(state)) {
|
|
177
|
+
throw new TypeError(`Invalid gsm voice state param ${state}. Supported values: ${_lodash.default.values(emuMethods.GSM_VOICE_STATES)}`);
|
|
182
178
|
}
|
|
183
179
|
await this.adbExecEmu(['gsm', 'voice', state]);
|
|
184
180
|
};
|
|
185
181
|
emuMethods.networkSpeed = async function networkSpeed(speed = 'full') {
|
|
186
|
-
if (_lodash.default.values(emuMethods.NETWORK_SPEED).
|
|
182
|
+
if (!_lodash.default.values(emuMethods.NETWORK_SPEED).includes(speed)) {
|
|
187
183
|
throw new Error(`Invalid network speed param ${speed}. Supported values: ${_lodash.default.values(emuMethods.NETWORK_SPEED)}`);
|
|
188
184
|
}
|
|
189
185
|
await this.adbExecEmu(['network', 'speed', speed]);
|
|
@@ -308,4 +304,4 @@ emuMethods.checkAvdExist = async function checkAvdExist(avdName) {
|
|
|
308
304
|
};
|
|
309
305
|
var _default = emuMethods;
|
|
310
306
|
exports.default = _default;
|
|
311
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9nZ2VyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfaGVscGVycyIsIl9sb2Rhc2giLCJfbmV0IiwiX3N1cHBvcnQiLCJfYmx1ZWJpcmQiLCJfcGF0aCIsIl9pbmkiLCJQSE9ORV9OVU1CRVJfUEFUVEVSTiIsImVtdU1ldGhvZHMiLCJQT1dFUl9BQ19TVEFURVMiLCJPYmplY3QiLCJmcmVlemUiLCJQT1dFUl9BQ19PTiIsIlBPV0VSX0FDX09GRiIsIkdTTV9DQUxMX0FDVElPTlMiLCJHU01fQ0FMTCIsIkdTTV9BQ0NFUFQiLCJHU01fQ0FOQ0VMIiwiR1NNX0hPTEQiLCJHU01fVk9JQ0VfU1RBVEVTIiwiR1NNX1ZPSUNFX1VOUkVHSVNURVJFRCIsIkdTTV9WT0lDRV9IT01FIiwiR1NNX1ZPSUNFX1JPQU1JTkciLCJHU01fVk9JQ0VfU0VBUkNISU5HIiwiR1NNX1ZPSUNFX0RFTklFRCIsIkdTTV9WT0lDRV9PRkYiLCJHU01fVk9JQ0VfT04iLCJHU01fU0lHTkFMX1NUUkVOR1RIUyIsIk5FVFdPUktfU1BFRUQiLCJHU00iLCJTQ1NEIiwiR1BSUyIsIkVER0UiLCJVTVRTIiwiSFNEUEEiLCJMVEUiLCJFVkRPIiwiRlVMTCIsIlNFTlNPUlMiLCJBQ0NFTEVSQVRJT04iLCJHWVJPU0NPUEUiLCJNQUdORVRJQ19GSUVMRCIsIk9SSUVOVEFUSU9OIiwiVEVNUEVSQVRVUkUiLCJQUk9YSU1JVFkiLCJMSUdIVCIsIlBSRVNTVVJFIiwiSFVNSURJVFkiLCJNQUdORVRJQ19GSUVMRF9VTkNBTElCUkFURUQiLCJHWVJPU0NPUEVfVU5DQUxJQlJBVEVEIiwiSElOR0VfQU5HTEUwIiwiSElOR0VfQU5HTEUxIiwiSElOR0VfQU5HTEUyIiwiSEVBUlRfUkFURSIsIlJHQkNfTElHSFQiLCJsaXN0RW11bGF0b3JzIiwiYXZkc1Jvb3QiLCJwcm9jZXNzIiwiZW52IiwiQU5EUk9JRF9BVkRfSE9NRSIsImRpckV4aXN0cyIsImdldEF2ZENvbmZpZ1BhdGhzIiwibG9nIiwid2FybiIsInByZWZzUm9vdCIsImdldEFuZHJvaWRQcmVmc1Jvb3QiLCJwYXRoIiwicmVzb2x2ZSIsImRlYnVnIiwiY29uZmlncyIsImZzIiwiZ2xvYiIsImN3ZCIsImFic29sdXRlIiwibWFwIiwiY29uZlBhdGgiLCJhdmROYW1lIiwiYmFzZW5hbWUiLCJzcGxpdCIsInNsaWNlIiwiam9pbiIsIm5hbWUiLCJjb25maWciLCJmaWx0ZXIiLCJfIiwidHJpbSIsImlzRW11bGF0b3JDb25uZWN0ZWQiLCJlbXVsYXRvcnMiLCJnZXRDb25uZWN0ZWRFbXVsYXRvcnMiLCJmaW5kIiwieCIsInVkaWQiLCJjdXJEZXZpY2VJZCIsInZlcmlmeUVtdWxhdG9yQ29ubmVjdGVkIiwiRXJyb3IiLCJmaW5nZXJwcmludCIsImZpbmdlcnByaW50SWQiLCJsZXZlbCIsImdldEFwaUxldmVsIiwiYWRiRXhlY0VtdSIsInJvdGF0ZSIsInBvd2VyQUMiLCJzdGF0ZSIsInZhbHVlcyIsImluZGV4T2YiLCJUeXBlRXJyb3IiLCJzZW5zb3JTZXQiLCJzZW5zb3IiLCJ2YWx1ZSIsImluY2x1ZGVzIiwiaXNOaWwiLCJwb3dlckNhcGFjaXR5IiwicGVyY2VudCIsInBhcnNlSW50IiwiaXNOYU4iLCJwb3dlck9GRiIsInNlbmRTTVMiLCJwaG9uZU51bWJlciIsIm1lc3NhZ2UiLCJyZXBsYWNlIiwidGVzdCIsImdzbUNhbGwiLCJhY3Rpb24iLCJnc21TaWduYWwiLCJzdHJlbmd0aCIsImluZm8iLCJnc21Wb2ljZSIsIm5ldHdvcmtTcGVlZCIsInNwZWVkIiwiZXhlY0VtdUNvbnNvbGVDb21tYW5kIiwiZXhlY1RlbG5ldCIsImNtZCIsIm9wdHMiLCJwb3J0IiwicG9ydE1hdGNoIiwiZXhlYyIsImhvc3QiLCJleGVjVGltZW91dCIsImNvbm5UaW1lb3V0IiwiaW5pdFRpbWVvdXQiLCJyZXNldFRlbG5ldEF1dGhUb2tlbiIsIm9rRmxhZyIsIm5va0ZsYWciLCJlb2wiLCJjbGllbnQiLCJuZXQiLCJjb25uZWN0IiwiQiIsInJlamVjdCIsImNvbm5UaW1lb3V0T2JqIiwic2V0VGltZW91dCIsImV4ZWNUaW1lb3V0T2JqIiwiaW5pdFRpbWVvdXRPYmoiLCJpc0NvbW1hbmRTZW50Iiwic2VydmVyUmVzcG9uc2UiLCJvbmNlIiwiZSIsImNsZWFyVGltZW91dCIsIm9uIiwiY2h1bmsiLCJwdXNoIiwib3V0cHV0IiwiQnVmZmVyIiwiY29uY2F0IiwidG9TdHJpbmciLCJjbWRTdHIiLCJpc0FycmF5IiwidXRpbCIsInF1b3RlIiwid3JpdGUiLCJlbmQiLCJvdXRwdXRBcnIiLCJsZW5ndGgiLCJsYXN0IiwiZ2V0RW11VmVyc2lvbkluZm8iLCJwcm9wc1BhdGgiLCJzZGtSb290IiwiZXhpc3RzIiwiY29udGVudCIsInJlYWRGaWxlIiwicmV2aXNpb25NYXRjaCIsInJlc3VsdCIsInJldmlzaW9uIiwiYnVpbGRJZE1hdGNoIiwiYnVpbGRJZCIsImdldEVtdUltYWdlUHJvcGVydGllcyIsImF2ZHMiLCJhdmQiLCJtc2ciLCJpc0VtcHR5IiwiaW5pIiwicGFyc2UiLCJjaGVja0F2ZEV4aXN0Iiwic29tZSIsIl9kZWZhdWx0IiwiZXhwb3J0cyIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvdG9vbHMvYWRiLWVtdS1jb21tYW5kcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbG9nIGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBnZXRBbmRyb2lkUHJlZnNSb290LCBkaXJFeGlzdHMgfSBmcm9tICcuLi9oZWxwZXJzJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbmV0IGZyb20gJ25ldCc7XG5pbXBvcnQgeyB1dGlsLCBmcyB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBpbmkgZnJvbSAnaW5pJztcblxuY29uc3QgUEhPTkVfTlVNQkVSX1BBVFRFUk4gPSAvXlsrXT9bKF0/WzAtOV0qWyldP1stXFxzLl0/WzAtOV0qWy1cXHMuXT9bMC05XXsyLH0kL2ltO1xuXG5jb25zdCBlbXVNZXRob2RzID0ge307XG5lbXVNZXRob2RzLlBPV0VSX0FDX1NUQVRFUyA9IE9iamVjdC5mcmVlemUoe1xuICBQT1dFUl9BQ19PTjogJ29uJyxcbiAgUE9XRVJfQUNfT0ZGOiAnb2ZmJ1xufSk7XG5lbXVNZXRob2RzLkdTTV9DQUxMX0FDVElPTlMgPSBPYmplY3QuZnJlZXplKHtcbiAgR1NNX0NBTEw6ICdjYWxsJyxcbiAgR1NNX0FDQ0VQVDogJ2FjY2VwdCcsXG4gIEdTTV9DQU5DRUw6ICdjYW5jZWwnLFxuICBHU01fSE9MRDogJ2hvbGQnXG59KTtcbmVtdU1ldGhvZHMuR1NNX1ZPSUNFX1NUQVRFUyA9IE9iamVjdC5mcmVlemUoe1xuICBHU01fVk9JQ0VfVU5SRUdJU1RFUkVEOiAndW5yZWdpc3RlcmVkJyxcbiAgR1NNX1ZPSUNFX0hPTUU6ICdob21lJyxcbiAgR1NNX1ZPSUNFX1JPQU1JTkc6ICdyb2FtaW5nJyxcbiAgR1NNX1ZPSUNFX1NFQVJDSElORzogJ3NlYXJjaGluZycsXG4gIEdTTV9WT0lDRV9ERU5JRUQ6ICdkZW5pZWQnLFxuICBHU01fVk9JQ0VfT0ZGOiAnb2ZmJyxcbiAgR1NNX1ZPSUNFX09OOiAnb24nXG59KTtcbmVtdU1ldGhvZHMuR1NNX1NJR05BTF9TVFJFTkdUSFMgPSBbMCwgMSwgMiwgMywgNF07XG5cbmVtdU1ldGhvZHMuTkVUV09SS19TUEVFRCA9IE9iamVjdC5mcmVlemUoe1xuICBHU006ICdnc20nLCAvLyBHU00vQ1NEICh1cDogMTQuNCwgZG93bjogMTQuNCkuXG4gIFNDU0Q6ICdzY3NkJywgLy8gSFNDU0QgKHVwOiAxNC40LCBkb3duOiA1Ny42KS5cbiAgR1BSUzogJ2dwcnMnLCAvLyBHUFJTICh1cDogMjguOCwgZG93bjogNTcuNikuXG4gIEVER0U6ICdlZGdlJywgLy8gRURHRS9FR1BSUyAodXA6IDQ3My42LCBkb3duOiA0NzMuNikuXG4gIFVNVFM6ICd1bXRzJywgLy8gVU1UUy8zRyAodXA6IDM4NC4wLCBkb3duOiAzODQuMCkuXG4gIEhTRFBBOiAnaHNkcGEnLCAvLyBIU0RQQSAodXA6IDU3NjAuMCwgZG93bjogMTMsOTgwLjApLlxuICBMVEU6ICdsdGUnLCAvLyBMVEUgKHVwOiA1OCwwMDAsIGRvd246IDE3MywwMDApLlxuICBFVkRPOiAnZXZkbycsIC8vIEVWRE8gKHVwOiA3NSwwMDAsIGRvd246IDI4MCwwMDApLlxuICBGVUxMOiAnZnVsbCcgLy8gTm8gbGltaXQsIHRoZSBkZWZhdWx0ICh1cDogMC4wLCBkb3duOiAwLjApLlxufSk7XG5cbmVtdU1ldGhvZHMuU0VOU09SUyA9IE9iamVjdC5mcmVlemUoe1xuICBBQ0NFTEVSQVRJT046ICdhY2NlbGVyYXRpb24nLFxuICBHWVJPU0NPUEU6ICdneXJvc2NvcGUnLFxuICBNQUdORVRJQ19GSUVMRDogJ21hZ25ldGljLWZpZWxkJyxcbiAgT1JJRU5UQVRJT046ICdvcmllbnRhdGlvbicsXG4gIFRFTVBFUkFUVVJFOiAndGVtcGVyYXR1cmUnLFxuICBQUk9YSU1JVFk6ICdwcm94aW1pdHknLFxuICBMSUdIVDogJ2xpZ2h0JyxcbiAgUFJFU1NVUkU6ICdwcmVzc3VyZScsXG4gIEhVTUlESVRZOiAnaHVtaWRpdHknLFxuICBNQUdORVRJQ19GSUVMRF9VTkNBTElCUkFURUQ6ICdtYWduZXRpYy1maWVsZC11bmNhbGlicmF0ZWQnLFxuICBHWVJPU0NPUEVfVU5DQUxJQlJBVEVEOiAnZ3lyb3Njb3BlLXVuY2FsaWJyYXRlZCcsXG4gIEhJTkdFX0FOR0xFMDogJ2hpbmdlLWFuZ2xlMCcsXG4gIEhJTkdFX0FOR0xFMTogJ2hpbmdlLWFuZ2xlMScsXG4gIEhJTkdFX0FOR0xFMjogJ2hpbmdlLWFuZ2xlMicsXG4gIEhFQVJUX1JBVEU6ICdoZWFydC1yYXRlJyxcbiAgUkdCQ19MSUdIVDogJ3JnYmMtbGlnaHQnLFxufSk7XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gRW11SW5mb1xuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgRW11bGF0b3IgbmFtZSwgZm9yIGV4YW1wbGUgYFBpeGVsX1hMX0FQSV8zMGBcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb25maWcgRnVsbCBwYXRoIHRvIHRoZSBlbXVsYXRvciBjb25maWcgLmluaSBmaWxlLFxuICogZm9yIGV4YW1wbGUgYC9Vc2Vycy91c2VyLy5hbmRyb2lkL2F2ZC9QaXhlbF9YTF9BUElfMzAuaW5pYFxuICovXG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBBbmRyb2lkIGVtdWxhdG9yc1xuICpcbiAqIEByZXR1cm5zIHtBcnJheTxFbXVJbmZvPn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbGlzdEVtdWxhdG9ycyAoKSB7XG4gIGxldCBhdmRzUm9vdCA9IHByb2Nlc3MuZW52LkFORFJPSURfQVZEX0hPTUU7XG4gIGlmIChhd2FpdCBkaXJFeGlzdHMoYXZkc1Jvb3QpKSB7XG4gICAgcmV0dXJuIGF3YWl0IGdldEF2ZENvbmZpZ1BhdGhzKGF2ZHNSb290KTtcbiAgfVxuXG4gIGlmIChhdmRzUm9vdCkge1xuICAgIGxvZy53YXJuKGBUaGUgdmFsdWUgb2YgdGhlIEFORFJPSURfQVZEX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgJyR7YXZkc1Jvb3R9JyBpcyBub3QgYW4gZXhpc3RpbmcgZGlyZWN0b3J5YCk7XG4gIH1cblxuICBjb25zdCBwcmVmc1Jvb3QgPSBhd2FpdCBnZXRBbmRyb2lkUHJlZnNSb290KCk7XG4gIGlmICghcHJlZnNSb290KSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgYXZkc1Jvb3QgPSBwYXRoLnJlc29sdmUocHJlZnNSb290LCAnYXZkJyk7XG4gIGlmICghYXdhaXQgZGlyRXhpc3RzKGF2ZHNSb290KSkge1xuICAgIGxvZy5kZWJ1ZyhgVmlydHVhbCBkZXZpY2VzIGNvbmZpZyByb290ICcke2F2ZHNSb290fScgaXMgbm90IGFuIGV4aXN0aW5nIGRpcmVjdG9yeWApO1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiBhd2FpdCBnZXRBdmRDb25maWdQYXRocyhhdmRzUm9vdCk7XG59XG5cbi8qKlxuICogR2V0IGNvbmZpZ3VyYXRpb24gcGF0aHMgb2YgYWxsIHZpcnR1YWwgZGV2aWNlc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhdmRzUm9vdCBQYXRoIHRvIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0aGUgQVZEIC5pbmkgZmlsZXNcbiAqIEByZXR1cm5zIHtBcnJheTxFbXVJbmZvPn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0QXZkQ29uZmlnUGF0aHMgKGF2ZHNSb290KSB7XG4gIGNvbnN0IGNvbmZpZ3MgPSBhd2FpdCBmcy5nbG9iKCcqLmluaScsIHtcbiAgICBjd2Q6IGF2ZHNSb290LFxuICAgIGFic29sdXRlOiB0cnVlLFxuICB9KTtcbiAgcmV0dXJuIGNvbmZpZ3MubWFwKChjb25mUGF0aCkgPT4ge1xuICAgIGNvbnN0IGF2ZE5hbWUgPSBwYXRoLmJhc2VuYW1lKGNvbmZQYXRoKS5zcGxpdCgnLicpLnNsaWNlKDAsIC0xKS5qb2luKCcuJyk7XG4gICAgcmV0dXJuIHtuYW1lOiBhdmROYW1lLCBjb25maWc6IGNvbmZQYXRofTtcbiAgfSkuZmlsdGVyKCh7bmFtZX0pID0+IF8udHJpbShuYW1lKSk7XG59XG5cbi8qKlxuICogQ2hlY2sgdGhlIGVtdWxhdG9yIHN0YXRlLlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgRW11bGF0b3IgaXMgdmlzaWJsZSB0byBhZGIuXG4gKi9cbmVtdU1ldGhvZHMuaXNFbXVsYXRvckNvbm5lY3RlZCA9IGFzeW5jIGZ1bmN0aW9uIGlzRW11bGF0b3JDb25uZWN0ZWQgKCkge1xuICBsZXQgZW11bGF0b3JzID0gYXdhaXQgdGhpcy5nZXRDb25uZWN0ZWRFbXVsYXRvcnMoKTtcbiAgcmV0dXJuICEhXy5maW5kKGVtdWxhdG9ycywgKHgpID0+IHggJiYgeC51ZGlkID09PSB0aGlzLmN1ckRldmljZUlkKTtcbn07XG5cbi8qKlxuICogVmVyaWZ5IHRoZSBlbXVsYXRvciBpcyBjb25uZWN0ZWQuXG4gKlxuICogQHRocm93cyB7ZXJyb3J9IElmIEVtdWxhdG9yIGlzIG5vdCB2aXNpYmxlIHRvIGFkYi5cbiAqL1xuZW11TWV0aG9kcy52ZXJpZnlFbXVsYXRvckNvbm5lY3RlZCA9IGFzeW5jIGZ1bmN0aW9uIHZlcmlmeUVtdWxhdG9yQ29ubmVjdGVkICgpIHtcbiAgaWYgKCEoYXdhaXQgdGhpcy5pc0VtdWxhdG9yQ29ubmVjdGVkKCkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgZW11bGF0b3IgXCIke3RoaXMuY3VyRGV2aWNlSWR9XCIgd2FzIHVuZXhwZWN0ZWRseSBkaXNjb25uZWN0ZWRgKTtcbiAgfVxufTtcblxuLyoqXG4gKiBFbXVsYXRlIGZpbmdlcnByaW50IHRvdWNoIGV2ZW50IG9uIHRoZSBjb25uZWN0ZWQgZW11bGF0b3IuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbmdlcnByaW50SWQgLSBUaGUgSUQgb2YgdGhlIGZpbmdlcnByaW50LlxuICovXG5lbXVNZXRob2RzLmZpbmdlcnByaW50ID0gYXN5bmMgZnVuY3Rpb24gZmluZ2VycHJpbnQgKGZpbmdlcnByaW50SWQpIHtcbiAgaWYgKCFmaW5nZXJwcmludElkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGaW5nZXJwcmludCBpZCBwYXJhbWV0ZXIgbXVzdCBiZSBkZWZpbmVkJyk7XG4gIH1cbiAgLy8gdGhlIG1ldGhvZCB1c2VkIG9ubHkgd29ya3MgZm9yIEFQSSBsZXZlbCAyMyBhbmQgYWJvdmVcbiAgbGV0IGxldmVsID0gYXdhaXQgdGhpcy5nZXRBcGlMZXZlbCgpO1xuICBpZiAobGV2ZWwgPCAyMykge1xuICAgIHRocm93IG5ldyBFcnJvcihgRGV2aWNlIEFQSSBMZXZlbCBtdXN0IGJlID49IDIzLiBDdXJyZW50IEFwaSBsZXZlbCAnJHtsZXZlbH0nYCk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGJFeGVjRW11KFsnZmluZ2VyJywgJ3RvdWNoJywgZmluZ2VycHJpbnRJZF0pO1xufTtcblxuLyoqXG4gKiBDaGFuZ2UgdGhlIGRpc3BsYXkgb3JpZW50YXRpb24gb24gdGhlIGNvbm5lY3RlZCBlbXVsYXRvci5cbiAqIFRoZSBvcmllbnRhdGlvbiBpcyBjaGFuZ2VkIChQSS8yIGlzIGFkZGVkKSBldmVyeSB0aW1lXG4gKiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuXG4gKi9cbmVtdU1ldGhvZHMucm90YXRlID0gYXN5bmMgZnVuY3Rpb24gcm90YXRlICgpIHtcbiAgYXdhaXQgdGhpcy5hZGJFeGVjRW11KFsncm90YXRlJ10pO1xufTtcblxuLyoqXG4gKiBFbXVsYXRlIHBvd2VyIHN0YXRlIGNoYW5nZSBvbiB0aGUgY29ubmVjdGVkIGVtdWxhdG9yLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdGF0ZSBbJ29uJ10gLSBFaXRoZXIgJ29uJyBvciAnb2ZmJy5cbiAqL1xuZW11TWV0aG9kcy5wb3dlckFDID0gYXN5bmMgZnVuY3Rpb24gcG93ZXJBQyAoc3RhdGUgPSAnb24nKSB7XG4gIGlmIChfLnZhbHVlcyhlbXVNZXRob2RzLlBPV0VSX0FDX1NUQVRFUykuaW5kZXhPZihzdGF0ZSkgPT09IC0xKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgV3JvbmcgcG93ZXIgQUMgc3RhdGUgc2VudCAnJHtzdGF0ZX0nLiBgXG4gICAgICArIGBTdXBwb3J0ZWQgdmFsdWVzOiAke18udmFsdWVzKGVtdU1ldGhvZHMuUE9XRVJfQUNfU1RBVEVTKX1dYCk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGJFeGVjRW11KFsncG93ZXInLCAnYWMnLCBzdGF0ZV0pO1xufTtcblxuLyoqXG4gKiBFbXVsYXRlIHNlbnNvcnMgdmFsdWVzIG9uIHRoZSBjb25uZWN0ZWQgZW11bGF0b3IuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNlbnNvciAtIFNlbnNvciB0eXBlIGRlY2xhcmVkIGluIFNFTlNPUlMgaXRlbXMuXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IHZhbHVlICAtIE51bWJlciB0byBzZXQgYXMgdGhlIHNlbnNvciB2YWx1ZS5cbiAqIEB0aHJvd3Mge0Vycm9yfSAtIElmIHNlbnNvciB0eXBlIG9yIHNlbnNvciB2YWx1ZSBpcyBub3QgZGVmaW5lZFxuICovXG5lbXVNZXRob2RzLnNlbnNvclNldCA9IGFzeW5jIGZ1bmN0aW9uIHNlbnNvclNldCAoc2Vuc29yLCB2YWx1ZSkge1xuICBpZiAoIV8uaW5jbHVkZXMoZW11TWV0aG9kcy5TRU5TT1JTLCBzZW5zb3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVW5zdXBwb3J0ZWQgc2Vuc29yIHNlbnQgJyR7c2Vuc29yfScuIGBcbiAgICAgICsgYFN1cHBvcnRlZCB2YWx1ZXM6ICR7Xy52YWx1ZXMoZW11TWV0aG9kcy5TRU5TT1JTKX1dYCk7XG4gIH1cbiAgaWYgKF8uaXNOaWwodmFsdWUpIHx8IHZhbHVlID09PSAnJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE1pc3NpbmcvaW52YWxpZCBzZW5zb3IgdmFsdWUgYXJndW1lbnQuIGBcbiAgICAgICsgYFlvdSBuZWVkIHRvIHByb3ZpZGUgYSB2YWxpZCB2YWx1ZSB0byBzZXQgdG8gdGhlIHNlbnNvciBpbiBgXG4gICAgICArIGBmb3JtYXQgPHZhbHVlLWE+Wzo8dmFsdWUtYj5bOjx2YWx1ZS1jPlsuLi5dXV0uYCk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGJFeGVjRW11KFsnc2Vuc29yJywgJ3NldCcsIHNlbnNvciwgdmFsdWVdKTtcbn07XG5cbi8qKlxuICogRW11bGF0ZSBwb3dlciBjYXBhY2l0eSBjaGFuZ2Ugb24gdGhlIGNvbm5lY3RlZCBlbXVsYXRvci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHBlcmNlbnQgWzEwMF0gLSBQZXJjZW50YWdlIHZhbHVlIGluIHJhbmdlIFswLCAxMDBdLlxuICovXG5lbXVNZXRob2RzLnBvd2VyQ2FwYWNpdHkgPSBhc3luYyBmdW5jdGlvbiBwb3dlckNhcGFjaXR5IChwZXJjZW50ID0gMTAwKSB7XG4gIHBlcmNlbnQgPSBwYXJzZUludChwZXJjZW50LCAxMCk7XG4gIGlmIChpc05hTihwZXJjZW50KSB8fCBwZXJjZW50IDwgMCB8fCBwZXJjZW50ID4gMTAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcGVyY2VudGFnZSB2YWx1ZSBzaG91bGQgYmUgdmFsaWQgaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDEwMGApO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiRXhlY0VtdShbJ3Bvd2VyJywgJ2NhcGFjaXR5JywgcGVyY2VudF0pO1xufTtcblxuLyoqXG4gKiBFbXVsYXRlIHBvd2VyIG9mZiBldmVudCBvbiB0aGUgY29ubmVjdGVkIGVtdWxhdG9yLlxuICovXG5lbXVNZXRob2RzLnBvd2VyT0ZGID0gYXN5bmMgZnVuY3Rpb24gcG93ZXJPRkYgKCkge1xuICBhd2FpdCB0aGlzLnBvd2VyQUMoZW11TWV0aG9kcy5QT1dFUl9BQ19TVEFURVMuUE9XRVJfQUNfT0ZGKTtcbiAgYXdhaXQgdGhpcy5wb3dlckNhcGFjaXR5KDApO1xufTtcblxuLyoqXG4gKiBFbXVsYXRlIHNlbmQgU01TIGV2ZW50IG9uIHRoZSBjb25uZWN0ZWQgZW11bGF0b3IuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBwaG9uZU51bWJlciAtIFRoZSBwaG9uZSBudW1iZXIgb2YgbWVzc2FnZSBzZW5kZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSBbJyddIC0gVGhlIG1lc3NhZ2UgY29udGVudC5cbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiBwaG9uZSBudW1iZXIgaGFzIGludmFsaWQgZm9ybWF0LlxuICovXG5lbXVNZXRob2RzLnNlbmRTTVMgPSBhc3luYyBmdW5jdGlvbiBzZW5kU01TIChwaG9uZU51bWJlciwgbWVzc2FnZSA9ICcnKSB7XG4gIG1lc3NhZ2UgPSBtZXNzYWdlLnRyaW0oKTtcbiAgaWYgKG1lc3NhZ2UgPT09ICcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTZW5kaW5nIGFuIFNNUyByZXF1aXJlcyBhIG1lc3NhZ2UnKTtcbiAgfVxuICBwaG9uZU51bWJlciA9IGAke3Bob25lTnVtYmVyfWAucmVwbGFjZSgvXFxzKi8sICcnKTtcbiAgaWYgKCFQSE9ORV9OVU1CRVJfUEFUVEVSTi50ZXN0KHBob25lTnVtYmVyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzZW5kU01TIHBob25lTnVtYmVyIHBhcmFtICR7cGhvbmVOdW1iZXJ9YCk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGJFeGVjRW11KFsnc21zJywgJ3NlbmQnLCBwaG9uZU51bWJlciwgbWVzc2FnZV0pO1xufTtcblxuLyoqXG4gKiBFbXVsYXRlIEdTTSBjYWxsIGV2ZW50IG9uIHRoZSBjb25uZWN0ZWQgZW11bGF0b3IuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBwaG9uZU51bWJlciAtIFRoZSBwaG9uZSBudW1iZXIgb2YgdGhlIGNhbGxlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpb24gWycnXSAtIE9uZSBvZiBhdmFpbGFibGUgR1NNIGNhbGwgYWN0aW9ucy5cbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiBwaG9uZSBudW1iZXIgaGFzIGludmFsaWQgZm9ybWF0LlxuICogQHRocm93cyB7ZXJyb3J9IElmIF9hY3Rpb25fIHZhbHVlIGlzIGludmFsaWQuXG4gKi9cbmVtdU1ldGhvZHMuZ3NtQ2FsbCA9IGFzeW5jIGZ1bmN0aW9uIGdzbUNhbGwgKHBob25lTnVtYmVyLCBhY3Rpb24gPSAnJykge1xuICBpZiAoXy52YWx1ZXMoZW11TWV0aG9kcy5HU01fQ0FMTF9BQ1RJT05TKS5pbmRleE9mKGFjdGlvbikgPT09IC0xKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGdzbSBhY3Rpb24gcGFyYW0gJHthY3Rpb259LiBTdXBwb3J0ZWQgdmFsdWVzOiAke18udmFsdWVzKGVtdU1ldGhvZHMuR1NNX0NBTExfQUNUSU9OUyl9YCk7XG4gIH1cbiAgcGhvbmVOdW1iZXIgPSBgJHtwaG9uZU51bWJlcn1gLnJlcGxhY2UoL1xccyovLCAnJyk7XG4gIGlmICghUEhPTkVfTlVNQkVSX1BBVFRFUk4udGVzdChwaG9uZU51bWJlcikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZ3NtQ2FsbCBwaG9uZU51bWJlciBwYXJhbSAke3Bob25lTnVtYmVyfWApO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiRXhlY0VtdShbJ2dzbScsIGFjdGlvbiwgcGhvbmVOdW1iZXJdKTtcbn07XG5cbi8qKlxuICogRW11bGF0ZSBHU00gc2lnbmFsIHN0cmVuZ3RoIGNoYW5nZSBldmVudCBvbiB0aGUgY29ubmVjdGVkIGVtdWxhdG9yLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gc3RyZW5ndGggWzRdIC0gQSBudW1iZXIgaW4gcmFuZ2UgWzAsIDRdO1xuICogQHRocm93cyB7ZXJyb3J9IElmIF9zdHJlbmd0aF8gdmFsdWUgaXMgaW52YWxpZC5cbiAqL1xuZW11TWV0aG9kcy5nc21TaWduYWwgPSBhc3luYyBmdW5jdGlvbiBnc21TaWduYWwgKHN0cmVuZ3RoID0gNCkge1xuICBzdHJlbmd0aCA9IHBhcnNlSW50KHN0cmVuZ3RoLCAxMCk7XG4gIGlmIChlbXVNZXRob2RzLkdTTV9TSUdOQUxfU1RSRU5HVEhTLmluZGV4T2Yoc3RyZW5ndGgpID09PSAtMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzaWduYWwgc3RyZW5ndGggcGFyYW0gJHtzdHJlbmd0aH0uIFN1cHBvcnRlZCB2YWx1ZXM6ICR7Xy52YWx1ZXMoZW11TWV0aG9kcy5HU01fU0lHTkFMX1NUUkVOR1RIUyl9YCk7XG4gIH1cbiAgbG9nLmluZm8oJ2dzbSBzaWduYWwtcHJvZmlsZSA8c3RyZW5ndGg+IGNoYW5nZXMgdGhlIHJlcG9ydGVkIHN0cmVuZ3RoIG9uIG5leHQgKDE1cykgdXBkYXRlLicpO1xuICBhd2FpdCB0aGlzLmFkYkV4ZWNFbXUoWydnc20nLCAnc2lnbmFsLXByb2ZpbGUnLCBzdHJlbmd0aF0pO1xufTtcblxuLyoqXG4gKiBFbXVsYXRlIEdTTSB2b2ljZSBldmVudCBvbiB0aGUgY29ubmVjdGVkIGVtdWxhdG9yLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdGF0ZSBbJ29uJ10gLSBFaXRoZXIgJ29uJyBvciAnb2ZmJy5cbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiBfc3RhdGVfIHZhbHVlIGlzIGludmFsaWQuXG4gKi9cbmVtdU1ldGhvZHMuZ3NtVm9pY2UgPSBhc3luYyBmdW5jdGlvbiBnc21Wb2ljZSAoc3RhdGUgPSAnb24nKSB7XG4gIC8vIGdzbSB2b2ljZSA8c3RhdGU+IGFsbG93cyB5b3UgdG8gY2hhbmdlIHRoZSBzdGF0ZSBvZiB5b3VyIEdQUlMgY29ubmVjdGlvblxuICBpZiAoXy52YWx1ZXMoZW11TWV0aG9kcy5HU01fVk9JQ0VfU1RBVEVTKS5pbmRleE9mKHN0YXRlKSA9PT0gLTEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZ3NtIHZvaWNlIHN0YXRlIHBhcmFtICR7c3RhdGV9LiBTdXBwb3J0ZWQgdmFsdWVzOiAke18udmFsdWVzKGVtdU1ldGhvZHMuR1NNX1ZPSUNFX1NUQVRFUyl9YCk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGJFeGVjRW11KFsnZ3NtJywgJ3ZvaWNlJywgc3RhdGVdKTtcbn07XG5cbi8qKlxuICogRW11bGF0ZSBuZXR3b3JrIHNwZWVkIGNoYW5nZSBldmVudCBvbiB0aGUgY29ubmVjdGVkIGVtdWxhdG9yLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzcGVlZCBbJ2Z1bGwnXSAtIE9uZSBvZiBwb3NzaWJsZSBORVRXT1JLX1NQRUVEIHZhbHVlcy5cbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiBfc3BlZWRfIHZhbHVlIGlzIGludmFsaWQuXG4gKi9cbmVtdU1ldGhvZHMubmV0d29ya1NwZWVkID0gYXN5bmMgZnVuY3Rpb24gbmV0d29ya1NwZWVkIChzcGVlZCA9ICdmdWxsJykge1xuICAvLyBuZXR3b3JrIHNwZWVkIDxzcGVlZD4gYWxsb3dzIHlvdSB0byBzZXQgdGhlIG5ldHdvcmsgc3BlZWQgZW11bGF0aW9uLlxuICBpZiAoXy52YWx1ZXMoZW11TWV0aG9kcy5ORVRXT1JLX1NQRUVEKS5pbmRleE9mKHNwZWVkKSA9PT0gLTEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbmV0d29yayBzcGVlZCBwYXJhbSAke3NwZWVkfS4gU3VwcG9ydGVkIHZhbHVlczogJHtfLnZhbHVlcyhlbXVNZXRob2RzLk5FVFdPUktfU1BFRUQpfWApO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiRXhlY0VtdShbJ25ldHdvcmsnLCAnc3BlZWQnLCBzcGVlZF0pO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBFeGVjVGVsbmV0T3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IGV4ZWNUaW1lb3V0IFs2MDAwMF0gQSB0aW1lb3V0IHVzZWQgdG8gd2FpdCBmb3IgYSBzZXJ2ZXJcbiAqIHJlcGx5IHRvIHRoZSBnaXZlbiBjb21tYW5kXG4gKiBAcHJvcGVydHkge251bWJlcn0gY29ublRpbWVvdXQgWzUwMDBdIENvbnNvbGUgY29ubmVjdGlvbiB0aW1lb3V0IGluIG1pbGxpc2Vjb25kc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IGluaXRUaW1lb3V0IFs1MDAwXSBUZWxuZXQgY29uc29sZSBpbml0aWFsaXphdGlvbiB0aW1lb3V0XG4gKiBpbiBtaWxsaXNlY29uZHMgKHRoZSB0aW1lIGJldHdlZW4gY29ubmVjdGlvbiBoYXBwZW5zIGFuZCB0aGUgY29tbWFuZCBwcm9tcHRcbiAqIGlzIGF2YWlsYWJsZSlcbiAqIEBwcm9wZXJ0eSB7P251bWJlcnxzdHJpbmd9IHBvcnQgVGhlIGVtdWxhdG9yIHBvcnQgbnVtYmVyLiBUaGUgbWV0aG9kIHdpbGwgdHJ5IHRvIHBhcnNlIGl0XG4gKiBmcm9tIHRoZSBjdXJyZW50IGRldmljZSBpZGVudGlmaWVyIGlmIHVuc2V0XG4gKi9cblxuLyoqXG4gKiBFeGVjdXRlcyBhIGNvbW1hbmQgdGhyb3VnaCBlbXVsYXRvciB0ZWxuZXQgY29uc29sZSBpbnRlcmZhY2UgYW5kIHJldHVybnMgaXRzIG91dHB1dFxuICpcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPnxzdHJpbmd9IGNtZCAtIFRoZSBhY3R1YWwgY29tbWFuZCB0byBleGVjdXRlLiBTZWVcbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3N0dWRpby9ydW4vZW11bGF0b3ItY29uc29sZSBmb3IgbW9yZSBkZXRhaWxzXG4gKiBvbiBhdmFpbGFibGUgY29tbWFuZHNcbiAqIEBwYXJhbSB7RXhlY1RlbG5ldE9wdGlvbnN9IG9wdHNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb21tYW5kIG91dHB1dFxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBjb25uZWN0aW5nIHRvIHRoZSBUZWxuZXQgY29uc29sZVxuICogb3IgaWYgdGhlIGdpdmVuIGNvbW1hbmQgcmV0dXJuZWQgbm9uLU9LIHJlc3BvbnNlXG4gKi9cbmVtdU1ldGhvZHMuZXhlY0VtdUNvbnNvbGVDb21tYW5kID0gYXN5bmMgZnVuY3Rpb24gZXhlY1RlbG5ldCAoY21kLCBvcHRzID0ge30pIHtcbiAgbGV0IHBvcnQgPSBwYXJzZUludChvcHRzLnBvcnQsIDEwKTtcbiAgaWYgKCFwb3J0KSB7XG4gICAgY29uc3QgcG9ydE1hdGNoID0gL2VtdWxhdG9yLShcXGQrKS9pLmV4ZWModGhpcy5jdXJEZXZpY2VJZCk7XG4gICAgaWYgKCFwb3J0TWF0Y2gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHBhcnNlIHRoZSBjb25zb2xlIHBvcnQgbnVtYmVyIGZyb20gdGhlIGRldmljZSBpZGVudGlmaWVyICcke3RoaXMuY3VyRGV2aWNlSWR9Jy4gYCArXG4gICAgICAgIGBJcyBpdCBhbiBlbXVsYXRvcj9gKTtcbiAgICB9XG4gICAgcG9ydCA9IHBhcnNlSW50KHBvcnRNYXRjaFsxXSwgMTApO1xuICB9XG4gIGNvbnN0IGhvc3QgPSAnMTI3LjAuMC4xJztcbiAgY29uc3Qge1xuICAgIGV4ZWNUaW1lb3V0ID0gNjAwMDAsXG4gICAgY29ublRpbWVvdXQgPSA1MDAwLFxuICAgIGluaXRUaW1lb3V0ID0gNTAwMCxcbiAgfSA9IG9wdHM7XG4gIGF3YWl0IHRoaXMucmVzZXRUZWxuZXRBdXRoVG9rZW4oKTtcblxuICBjb25zdCBva0ZsYWcgPSAvXk9LJC9tO1xuICBjb25zdCBub2tGbGFnID0gL15LT1xcYi9tO1xuICBjb25zdCBlb2wgPSAnXFxyXFxuJztcbiAgY29uc3QgY2xpZW50ID0gbmV0LmNvbm5lY3Qoe1xuICAgIGhvc3QsXG4gICAgcG9ydCxcbiAgfSk7XG5cbiAgcmV0dXJuIGF3YWl0IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBjb25uVGltZW91dE9iaiA9IHNldFRpbWVvdXQoXG4gICAgICAoKSA9PiByZWplY3QobmV3IEVycm9yKGBDYW5ub3QgY29ubmVjdCB0byB0aGUgRW11bGF0b3IgY29uc29sZSBhdCAke2hvc3R9OiR7cG9ydH0gYCArXG4gICAgICAgIGBhZnRlciAke2Nvbm5UaW1lb3V0fW1zYCkpLCBjb25uVGltZW91dCk7XG4gICAgbGV0IGV4ZWNUaW1lb3V0T2JqO1xuICAgIGxldCBpbml0VGltZW91dE9iajtcbiAgICBsZXQgaXNDb21tYW5kU2VudCA9IGZhbHNlO1xuICAgIGxldCBzZXJ2ZXJSZXNwb25zZSA9IFtdO1xuXG4gICAgY2xpZW50Lm9uY2UoJ2Vycm9yJywgKGUpID0+IHtcbiAgICAgIGNsZWFyVGltZW91dChjb25uVGltZW91dE9iaik7XG4gICAgICByZWplY3QobmV3IEVycm9yKGBDYW5ub3QgY29ubmVjdCB0byB0aGUgRW11bGF0b3IgY29uc29sZSBhdCAke2hvc3R9OiR7cG9ydH0uIGAgK1xuICAgICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApKTtcbiAgICB9KTtcblxuICAgIGNsaWVudC5vbmNlKCdjb25uZWN0JywgKCkgPT4ge1xuICAgICAgY2xlYXJUaW1lb3V0KGNvbm5UaW1lb3V0T2JqKTtcbiAgICAgIGluaXRUaW1lb3V0T2JqID0gc2V0VGltZW91dChcbiAgICAgICAgKCkgPT4gcmVqZWN0KG5ldyBFcnJvcihgRGlkIG5vdCBnZXQgdGhlIGluaXRpYWwgcmVzcG9uc2UgZnJvbSB0aGUgRW11bGF0b3IgY29uc29sZSBhdCAke2hvc3R9OiR7cG9ydH0gYCArXG4gICAgICAgICAgYGFmdGVyICR7aW5pdFRpbWVvdXR9bXNgKSksIGluaXRUaW1lb3V0KTtcbiAgICB9KTtcblxuICAgIGNsaWVudC5vbignZGF0YScsIChjaHVuaykgPT4ge1xuICAgICAgc2VydmVyUmVzcG9uc2UucHVzaChjaHVuayk7XG4gICAgICBjb25zdCBvdXRwdXQgPSBCdWZmZXIuY29uY2F0KHNlcnZlclJlc3BvbnNlKS50b1N0cmluZygndXRmOCcpLnRyaW0oKTtcbiAgICAgIGlmIChva0ZsYWcudGVzdChvdXRwdXQpKSB7XG4gICAgICAgIC8vIFRoZSBpbml0aWFsIGluY29taW5nIGRhdGEgY2h1bmsgY29uZmlybXMgdGhlIGludGVyZmFjZSBpcyByZWFkeSBmb3IgaW5wdXRcbiAgICAgICAgaWYgKCFpc0NvbW1hbmRTZW50KSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KGluaXRUaW1lb3V0T2JqKTtcbiAgICAgICAgICBzZXJ2ZXJSZXNwb25zZSA9IFtdO1xuICAgICAgICAgIGNvbnN0IGNtZFN0ciA9IF8uaXNBcnJheShjbWQpID8gdXRpbC5xdW90ZShjbWQpIDogYCR7Y21kfWA7XG4gICAgICAgICAgbG9nLmRlYnVnKGBFeGVjdXRpbmcgRW11bGF0b3IgY29uc29sZSBjb21tYW5kOiAke2NtZFN0cn1gKTtcbiAgICAgICAgICBjbGllbnQud3JpdGUoY21kU3RyKTtcbiAgICAgICAgICBjbGllbnQud3JpdGUoZW9sKTtcbiAgICAgICAgICBpc0NvbW1hbmRTZW50ID0gdHJ1ZTtcbiAgICAgICAgICBleGVjVGltZW91dE9iaiA9IHNldFRpbWVvdXQoXG4gICAgICAgICAgICAoKSA9PiByZWplY3QobmV3IEVycm9yKGBEaWQgbm90IGdldCBhbnkgcmVzcG9uc2UgZnJvbSB0aGUgRW11bGF0b3IgY29uc29sZSBhdCAke2hvc3R9OiR7cG9ydH0gYCArXG4gICAgICAgICAgICAgIGB0byAnJHtjbWR9JyBjb21tYW5kIGFmdGVyICR7ZXhlY1RpbWVvdXR9bXNgKSksIGV4ZWNUaW1lb3V0KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY2xlYXJUaW1lb3V0KGV4ZWNUaW1lb3V0T2JqKTtcbiAgICAgICAgY2xpZW50LmVuZCgpO1xuICAgICAgICBjb25zdCBvdXRwdXRBcnIgPSBvdXRwdXQuc3BsaXQoZW9sKTtcbiAgICAgICAgLy8gcmVtb3ZlIHRoZSByZWR1bmRhbnQgT0sgZmxhZyBmcm9tIHRoZSByZXN1bHRpbmcgY29tbWFuZCBvdXRwdXRcbiAgICAgICAgcmV0dXJuIHJlc29sdmUob3V0cHV0QXJyLnNsaWNlKDAsIG91dHB1dEFyci5sZW5ndGggLSAxKS5qb2luKCdcXG4nKS50cmltKCkpO1xuICAgICAgfSBlbHNlIGlmIChub2tGbGFnLnRlc3Qob3V0cHV0KSkge1xuICAgICAgICBjbGVhclRpbWVvdXQoaW5pdFRpbWVvdXRPYmopO1xuICAgICAgICBjbGVhclRpbWVvdXQoZXhlY1RpbWVvdXRPYmopO1xuICAgICAgICBjbGllbnQuZW5kKCk7XG4gICAgICAgIGNvbnN0IG91dHB1dEFyciA9IG91dHB1dC5zcGxpdChlb2wpO1xuICAgICAgICByZXR1cm4gcmVqZWN0KF8udHJpbShfLmxhc3Qob3V0cHV0QXJyKSkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gRW11VmVyc2lvbkluZm9cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gcmV2aXNpb24gVGhlIGFjdHVhbCByZXZpc2lvbiBudW1iZXIsIGZvciBleGFtcGxlICczMC4wLjUnXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IGJ1aWxkSWQgVGhlIGJ1aWxkIGlkZW50aWZpZXIsIGZvciBleGFtcGxlIDYzMDYwNDdcbiAqL1xuXG4vKipcbiAqIFJldHJpZXZlcyBlbXVsYXRvciB2ZXJzaW9uIGZyb20gdGhlIGZpbGUgc3lzdGVtXG4gKlxuICogQHJldHVybnMge0VtdVZlcnNpb25JbmZvfSBJZiBubyB2ZXJzaW9uIGluZm8gY291bGQgYmUgcGFyc2VkIHRoZW4gYW4gZW1wdHlcbiAqIG9iamVjdCBpcyByZXR1cm5lZFxuICovXG5lbXVNZXRob2RzLmdldEVtdVZlcnNpb25JbmZvID0gYXN5bmMgZnVuY3Rpb24gZ2V0RW11VmVyc2lvbkluZm8gKCkge1xuICBjb25zdCBwcm9wc1BhdGggPSBwYXRoLmpvaW4odGhpcy5zZGtSb290LCAnZW11bGF0b3InLCAnc291cmNlLnByb3BlcnRpZXMnKTtcbiAgaWYgKCFhd2FpdCBmcy5leGlzdHMocHJvcHNQYXRoKSkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShwcm9wc1BhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IHJldmlzaW9uTWF0Y2ggPSAvXlBrZ1xcLlJldmlzaW9uPShbXFxkLl0rKSQvbS5leGVjKGNvbnRlbnQpO1xuICBjb25zdCByZXN1bHQgPSB7fTtcbiAgaWYgKHJldmlzaW9uTWF0Y2gpIHtcbiAgICByZXN1bHQucmV2aXNpb24gPSByZXZpc2lvbk1hdGNoWzFdO1xuICB9XG4gIGNvbnN0IGJ1aWxkSWRNYXRjaCA9IC9eUGtnXFwuQnVpbGRJZD0oXFxkKykkL20uZXhlYyhjb250ZW50KTtcbiAgaWYgKGJ1aWxkSWRNYXRjaCkge1xuICAgIHJlc3VsdC5idWlsZElkID0gcGFyc2VJbnQoYnVpbGRJZE1hdGNoWzFdLCAxMCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogUmV0cmlldmVzIGVtdWxhdG9yIGltYWdlIHByb3BlcnRpZXMgZnJvbSB0aGUgbG9jYWwgZmlsZSBzeXN0ZW1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXZkTmFtZSBFbXVsYXRvciBuYW1lLiBTaG91bGQgTk9UIHN0YXJ0IHdpdGggJ0AnIGNoYXJhY3RlclxuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgZXh0cmFjdGluZyB0aGUgcHJvcGVydGllc1xuICogQHJldHVybnMge09iamVjdH0gVGhlIGNvbnRlbnQgb2YgZW11bGF0b3IgaW1hZ2UgcHJvcGVydGllcyBmaWxlLlxuICogVXN1YWxseSB0aGlzIGNvbmZpZ3VyYXRpb24gLmluaSBmaWxlIGhhcyB0aGUgZm9sbG93aW5nIGNvbnRlbnQ6XG4gKiAgIGF2ZC5pbmkuZW5jb2Rpbmc9VVRGLThcbiAqICAgcGF0aD0vVXNlcnMvdXNlcm5hbWUvLmFuZHJvaWQvYXZkL1BpeGVsX1hMX0FQSV8zMC5hdmRcbiAqICAgcGF0aC5yZWw9YXZkL1BpeGVsX1hMX0FQSV8zMC5hdmRcbiAqICAgdGFyZ2V0PWFuZHJvaWQtMzBcbiAqL1xuZW11TWV0aG9kcy5nZXRFbXVJbWFnZVByb3BlcnRpZXMgPSBhc3luYyBmdW5jdGlvbiBnZXRFbXVJbWFnZVByb3BlcnRpZXMgKGF2ZE5hbWUpIHtcbiAgY29uc3QgYXZkcyA9IGF3YWl0IGxpc3RFbXVsYXRvcnMoKTtcbiAgY29uc3QgYXZkID0gYXZkcy5maW5kKCh7bmFtZX0pID0+IG5hbWUgPT09IGF2ZE5hbWUpO1xuICBpZiAoIWF2ZCkge1xuICAgIGxldCBtc2cgPSBgQ2Fubm90IGZpbmQgJyR7YXZkTmFtZX0nIGVtdWxhdG9yLiBgO1xuICAgIGlmIChfLmlzRW1wdHkoYXZkcykpIHtcbiAgICAgIG1zZyArPSBgTm8gZW11bGF0b3JzIGhhdmUgYmVlbiBkZXRlY3RlZCBvbiB5b3VyIHN5c3RlbWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1zZyArPSBgQXZhaWxhYmxlIGF2ZCBuYW1lcyBhcmU6ICR7YXZkcy5tYXAoKHtuYW1lfSkgPT4gbmFtZSl9YDtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gIH1cbiAgcmV0dXJuIGluaS5wYXJzZShhd2FpdCBmcy5yZWFkRmlsZShhdmQuY29uZmlnLCAndXRmOCcpKTtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgZ2l2ZW4gZW11bGF0b3IgZXhpc3RzIGluIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBhdmRzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhdmROYW1lIC0gVGhlIG5hbWUgb2YgZW11bGF0b3IgdG8gdmVyaWZ5IGZvciBleGlzdGVuY2UuXG4gKiBTaG91bGQgTk9UIHN0YXJ0IHdpdGggJ0AnIGNoYXJhY3RlclxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBlbXVsYXRvciB3aXRoIGdpdmVuIG5hbWUgZG9lcyBub3QgZXhpc3QuXG4gKi9cbmVtdU1ldGhvZHMuY2hlY2tBdmRFeGlzdCA9IGFzeW5jIGZ1bmN0aW9uIGNoZWNrQXZkRXhpc3QgKGF2ZE5hbWUpIHtcbiAgY29uc3QgYXZkcyA9IGF3YWl0IGxpc3RFbXVsYXRvcnMoKTtcbiAgaWYgKCFhdmRzLnNvbWUoKHtuYW1lfSkgPT4gbmFtZSA9PT0gYXZkTmFtZSkpIHtcbiAgICBsZXQgbXNnID0gYEF2ZCAnJHthdmROYW1lfScgaXMgbm90IGF2YWlsYWJsZS4gYDtcbiAgICBpZiAoXy5pc0VtcHR5KGF2ZHMpKSB7XG4gICAgICBtc2cgKz0gYE5vIGVtdWxhdG9ycyBoYXZlIGJlZW4gZGV0ZWN0ZWQgb24geW91ciBzeXN0ZW1gO1xuICAgIH0gZWxzZSB7XG4gICAgICBtc2cgKz0gYFBsZWFzZSBzZWxlY3QgeW91ciBhdmQgbmFtZSBmcm9tIG9uZSBvZiB0aGVzZTogJyR7YXZkcy5tYXAoKHtuYW1lfSkgPT4gbmFtZSl9J2A7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZW11TWV0aG9kcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQSxJQUFBQSxPQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxRQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxPQUFBLEdB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
|
|
307
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9nZ2VyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfaGVscGVycyIsIl9sb2Rhc2giLCJfbmV0IiwiX3N1cHBvcnQiLCJfYmx1ZWJpcmQiLCJfcGF0aCIsIl9pbmkiLCJlbXVNZXRob2RzIiwiUE9XRVJfQUNfU1RBVEVTIiwiT2JqZWN0IiwiZnJlZXplIiwiUE9XRVJfQUNfT04iLCJQT1dFUl9BQ19PRkYiLCJHU01fQ0FMTF9BQ1RJT05TIiwiR1NNX0NBTEwiLCJHU01fQUNDRVBUIiwiR1NNX0NBTkNFTCIsIkdTTV9IT0xEIiwiR1NNX1ZPSUNFX1NUQVRFUyIsIkdTTV9WT0lDRV9VTlJFR0lTVEVSRUQiLCJHU01fVk9JQ0VfSE9NRSIsIkdTTV9WT0lDRV9ST0FNSU5HIiwiR1NNX1ZPSUNFX1NFQVJDSElORyIsIkdTTV9WT0lDRV9ERU5JRUQiLCJHU01fVk9JQ0VfT0ZGIiwiR1NNX1ZPSUNFX09OIiwiR1NNX1NJR05BTF9TVFJFTkdUSFMiLCJORVRXT1JLX1NQRUVEIiwiR1NNIiwiU0NTRCIsIkdQUlMiLCJFREdFIiwiVU1UUyIsIkhTRFBBIiwiTFRFIiwiRVZETyIsIkZVTEwiLCJTRU5TT1JTIiwiQUNDRUxFUkFUSU9OIiwiR1lST1NDT1BFIiwiTUFHTkVUSUNfRklFTEQiLCJPUklFTlRBVElPTiIsIlRFTVBFUkFUVVJFIiwiUFJPWElNSVRZIiwiTElHSFQiLCJQUkVTU1VSRSIsIkhVTUlESVRZIiwiTUFHTkVUSUNfRklFTERfVU5DQUxJQlJBVEVEIiwiR1lST1NDT1BFX1VOQ0FMSUJSQVRFRCIsIkhJTkdFX0FOR0xFMCIsIkhJTkdFX0FOR0xFMSIsIkhJTkdFX0FOR0xFMiIsIkhFQVJUX1JBVEUiLCJSR0JDX0xJR0hUIiwibGlzdEVtdWxhdG9ycyIsImF2ZHNSb290IiwicHJvY2VzcyIsImVudiIsIkFORFJPSURfQVZEX0hPTUUiLCJkaXJFeGlzdHMiLCJnZXRBdmRDb25maWdQYXRocyIsImxvZyIsIndhcm4iLCJwcmVmc1Jvb3QiLCJnZXRBbmRyb2lkUHJlZnNSb290IiwicGF0aCIsInJlc29sdmUiLCJkZWJ1ZyIsImNvbmZpZ3MiLCJmcyIsImdsb2IiLCJjd2QiLCJhYnNvbHV0ZSIsIm1hcCIsImNvbmZQYXRoIiwiYXZkTmFtZSIsImJhc2VuYW1lIiwic3BsaXQiLCJzbGljZSIsImpvaW4iLCJuYW1lIiwiY29uZmlnIiwiZmlsdGVyIiwiXyIsInRyaW0iLCJpc0VtdWxhdG9yQ29ubmVjdGVkIiwiZW11bGF0b3JzIiwiZ2V0Q29ubmVjdGVkRW11bGF0b3JzIiwiZmluZCIsIngiLCJ1ZGlkIiwiY3VyRGV2aWNlSWQiLCJ2ZXJpZnlFbXVsYXRvckNvbm5lY3RlZCIsIkVycm9yIiwiZmluZ2VycHJpbnQiLCJmaW5nZXJwcmludElkIiwibGV2ZWwiLCJnZXRBcGlMZXZlbCIsImFkYkV4ZWNFbXUiLCJyb3RhdGUiLCJwb3dlckFDIiwic3RhdGUiLCJ2YWx1ZXMiLCJpbmRleE9mIiwiVHlwZUVycm9yIiwic2Vuc29yU2V0Iiwic2Vuc29yIiwidmFsdWUiLCJpbmNsdWRlcyIsImlzTmlsIiwicG93ZXJDYXBhY2l0eSIsInBlcmNlbnQiLCJwYXJzZUludCIsImlzTmFOIiwicG93ZXJPRkYiLCJzZW5kU01TIiwicGhvbmVOdW1iZXIiLCJtZXNzYWdlIiwiaXNFbXB0eSIsImlzSW50ZWdlciIsImdzbUNhbGwiLCJhY3Rpb24iLCJnc21TaWduYWwiLCJzdHJlbmd0aCIsImluZm8iLCJnc21Wb2ljZSIsIm5ldHdvcmtTcGVlZCIsInNwZWVkIiwiZXhlY0VtdUNvbnNvbGVDb21tYW5kIiwiZXhlY1RlbG5ldCIsImNtZCIsIm9wdHMiLCJwb3J0IiwicG9ydE1hdGNoIiwiZXhlYyIsImhvc3QiLCJleGVjVGltZW91dCIsImNvbm5UaW1lb3V0IiwiaW5pdFRpbWVvdXQiLCJyZXNldFRlbG5ldEF1dGhUb2tlbiIsIm9rRmxhZyIsIm5va0ZsYWciLCJlb2wiLCJjbGllbnQiLCJuZXQiLCJjb25uZWN0IiwiQiIsInJlamVjdCIsImNvbm5UaW1lb3V0T2JqIiwic2V0VGltZW91dCIsImV4ZWNUaW1lb3V0T2JqIiwiaW5pdFRpbWVvdXRPYmoiLCJpc0NvbW1hbmRTZW50Iiwic2VydmVyUmVzcG9uc2UiLCJvbmNlIiwiZSIsImNsZWFyVGltZW91dCIsIm9uIiwiY2h1bmsiLCJwdXNoIiwib3V0cHV0IiwiQnVmZmVyIiwiY29uY2F0IiwidG9TdHJpbmciLCJ0ZXN0IiwiY21kU3RyIiwiaXNBcnJheSIsInV0aWwiLCJxdW90ZSIsIndyaXRlIiwiZW5kIiwib3V0cHV0QXJyIiwibGVuZ3RoIiwibGFzdCIsImdldEVtdVZlcnNpb25JbmZvIiwicHJvcHNQYXRoIiwic2RrUm9vdCIsImV4aXN0cyIsImNvbnRlbnQiLCJyZWFkRmlsZSIsInJldmlzaW9uTWF0Y2giLCJyZXN1bHQiLCJyZXZpc2lvbiIsImJ1aWxkSWRNYXRjaCIsImJ1aWxkSWQiLCJnZXRFbXVJbWFnZVByb3BlcnRpZXMiLCJhdmRzIiwiYXZkIiwibXNnIiwiaW5pIiwicGFyc2UiLCJjaGVja0F2ZEV4aXN0Iiwic29tZSIsIl9kZWZhdWx0IiwiZXhwb3J0cyIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvdG9vbHMvYWRiLWVtdS1jb21tYW5kcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbG9nIGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBnZXRBbmRyb2lkUHJlZnNSb290LCBkaXJFeGlzdHMgfSBmcm9tICcuLi9oZWxwZXJzJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbmV0IGZyb20gJ25ldCc7XG5pbXBvcnQgeyB1dGlsLCBmcyB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBpbmkgZnJvbSAnaW5pJztcblxuY29uc3QgZW11TWV0aG9kcyA9IHt9O1xuZW11TWV0aG9kcy5QT1dFUl9BQ19TVEFURVMgPSBPYmplY3QuZnJlZXplKHtcbiAgUE9XRVJfQUNfT046ICdvbicsXG4gIFBPV0VSX0FDX09GRjogJ29mZidcbn0pO1xuZW11TWV0aG9kcy5HU01fQ0FMTF9BQ1RJT05TID0gT2JqZWN0LmZyZWV6ZSh7XG4gIEdTTV9DQUxMOiAnY2FsbCcsXG4gIEdTTV9BQ0NFUFQ6ICdhY2NlcHQnLFxuICBHU01fQ0FOQ0VMOiAnY2FuY2VsJyxcbiAgR1NNX0hPTEQ6ICdob2xkJ1xufSk7XG5lbXVNZXRob2RzLkdTTV9WT0lDRV9TVEFURVMgPSBPYmplY3QuZnJlZXplKHtcbiAgR1NNX1ZPSUNFX1VOUkVHSVNURVJFRDogJ3VucmVnaXN0ZXJlZCcsXG4gIEdTTV9WT0lDRV9IT01FOiAnaG9tZScsXG4gIEdTTV9WT0lDRV9ST0FNSU5HOiAncm9hbWluZycsXG4gIEdTTV9WT0lDRV9TRUFSQ0hJTkc6ICdzZWFyY2hpbmcnLFxuICBHU01fVk9JQ0VfREVOSUVEOiAnZGVuaWVkJyxcbiAgR1NNX1ZPSUNFX09GRjogJ29mZicsXG4gIEdTTV9WT0lDRV9PTjogJ29uJ1xufSk7XG5lbXVNZXRob2RzLkdTTV9TSUdOQUxfU1RSRU5HVEhTID0gWzAsIDEsIDIsIDMsIDRdO1xuXG5lbXVNZXRob2RzLk5FVFdPUktfU1BFRUQgPSBPYmplY3QuZnJlZXplKHtcbiAgR1NNOiAnZ3NtJywgLy8gR1NNL0NTRCAodXA6IDE0LjQsIGRvd246IDE0LjQpLlxuICBTQ1NEOiAnc2NzZCcsIC8vIEhTQ1NEICh1cDogMTQuNCwgZG93bjogNTcuNikuXG4gIEdQUlM6ICdncHJzJywgLy8gR1BSUyAodXA6IDI4LjgsIGRvd246IDU3LjYpLlxuICBFREdFOiAnZWRnZScsIC8vIEVER0UvRUdQUlMgKHVwOiA0NzMuNiwgZG93bjogNDczLjYpLlxuICBVTVRTOiAndW10cycsIC8vIFVNVFMvM0cgKHVwOiAzODQuMCwgZG93bjogMzg0LjApLlxuICBIU0RQQTogJ2hzZHBhJywgLy8gSFNEUEEgKHVwOiA1NzYwLjAsIGRvd246IDEzLDk4MC4wKS5cbiAgTFRFOiAnbHRlJywgLy8gTFRFICh1cDogNTgsMDAwLCBkb3duOiAxNzMsMDAwKS5cbiAgRVZETzogJ2V2ZG8nLCAvLyBFVkRPICh1cDogNzUsMDAwLCBkb3duOiAyODAsMDAwKS5cbiAgRlVMTDogJ2Z1bGwnIC8vIE5vIGxpbWl0LCB0aGUgZGVmYXVsdCAodXA6IDAuMCwgZG93bjogMC4wKS5cbn0pO1xuXG5lbXVNZXRob2RzLlNFTlNPUlMgPSBPYmplY3QuZnJlZXplKHtcbiAgQUNDRUxFUkFUSU9OOiAnYWNjZWxlcmF0aW9uJyxcbiAgR1lST1NDT1BFOiAnZ3lyb3Njb3BlJyxcbiAgTUFHTkVUSUNfRklFTEQ6ICdtYWduZXRpYy1maWVsZCcsXG4gIE9SSUVOVEFUSU9OOiAnb3JpZW50YXRpb24nLFxuICBURU1QRVJBVFVSRTogJ3RlbXBlcmF0dXJlJyxcbiAgUFJPWElNSVRZOiAncHJveGltaXR5JyxcbiAgTElHSFQ6ICdsaWdodCcsXG4gIFBSRVNTVVJFOiAncHJlc3N1cmUnLFxuICBIVU1JRElUWTogJ2h1bWlkaXR5JyxcbiAgTUFHTkVUSUNfRklFTERfVU5DQUxJQlJBVEVEOiAnbWFnbmV0aWMtZmllbGQtdW5jYWxpYnJhdGVkJyxcbiAgR1lST1NDT1BFX1VOQ0FMSUJSQVRFRDogJ2d5cm9zY29wZS11bmNhbGlicmF0ZWQnLFxuICBISU5HRV9BTkdMRTA6ICdoaW5nZS1hbmdsZTAnLFxuICBISU5HRV9BTkdMRTE6ICdoaW5nZS1hbmdsZTEnLFxuICBISU5HRV9BTkdMRTI6ICdoaW5nZS1hbmdsZTInLFxuICBIRUFSVF9SQVRFOiAnaGVhcnQtcmF0ZScsXG4gIFJHQkNfTElHSFQ6ICdyZ2JjLWxpZ2h0Jyxcbn0pO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEVtdUluZm9cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIEVtdWxhdG9yIG5hbWUsIGZvciBleGFtcGxlIGBQaXhlbF9YTF9BUElfMzBgXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29uZmlnIEZ1bGwgcGF0aCB0byB0aGUgZW11bGF0b3IgY29uZmlnIC5pbmkgZmlsZSxcbiAqIGZvciBleGFtcGxlIGAvVXNlcnMvdXNlci8uYW5kcm9pZC9hdmQvUGl4ZWxfWExfQVBJXzMwLmluaWBcbiAqL1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbGlzdCBvZiBhdmFpbGFibGUgQW5kcm9pZCBlbXVsYXRvcnNcbiAqXG4gKiBAcmV0dXJucyB7QXJyYXk8RW11SW5mbz59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxpc3RFbXVsYXRvcnMgKCkge1xuICBsZXQgYXZkc1Jvb3QgPSBwcm9jZXNzLmVudi5BTkRST0lEX0FWRF9IT01FO1xuICBpZiAoYXdhaXQgZGlyRXhpc3RzKGF2ZHNSb290KSkge1xuICAgIHJldHVybiBhd2FpdCBnZXRBdmRDb25maWdQYXRocyhhdmRzUm9vdCk7XG4gIH1cblxuICBpZiAoYXZkc1Jvb3QpIHtcbiAgICBsb2cud2FybihgVGhlIHZhbHVlIG9mIHRoZSBBTkRST0lEX0FWRF9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlICcke2F2ZHNSb290fScgaXMgbm90IGFuIGV4aXN0aW5nIGRpcmVjdG9yeWApO1xuICB9XG5cbiAgY29uc3QgcHJlZnNSb290ID0gYXdhaXQgZ2V0QW5kcm9pZFByZWZzUm9vdCgpO1xuICBpZiAoIXByZWZzUm9vdCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGF2ZHNSb290ID0gcGF0aC5yZXNvbHZlKHByZWZzUm9vdCwgJ2F2ZCcpO1xuICBpZiAoIWF3YWl0IGRpckV4aXN0cyhhdmRzUm9vdCkpIHtcbiAgICBsb2cuZGVidWcoYFZpcnR1YWwgZGV2aWNlcyBjb25maWcgcm9vdCAnJHthdmRzUm9vdH0nIGlzIG5vdCBhbiBleGlzdGluZyBkaXJlY3RvcnlgKTtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICByZXR1cm4gYXdhaXQgZ2V0QXZkQ29uZmlnUGF0aHMoYXZkc1Jvb3QpO1xufVxuXG4vKipcbiAqIEdldCBjb25maWd1cmF0aW9uIHBhdGhzIG9mIGFsbCB2aXJ0dWFsIGRldmljZXNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXZkc1Jvb3QgUGF0aCB0byB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGhlIEFWRCAuaW5pIGZpbGVzXG4gKiBAcmV0dXJucyB7QXJyYXk8RW11SW5mbz59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEF2ZENvbmZpZ1BhdGhzIChhdmRzUm9vdCkge1xuICBjb25zdCBjb25maWdzID0gYXdhaXQgZnMuZ2xvYignKi5pbmknLCB7XG4gICAgY3dkOiBhdmRzUm9vdCxcbiAgICBhYnNvbHV0ZTogdHJ1ZSxcbiAgfSk7XG4gIHJldHVybiBjb25maWdzLm1hcCgoY29uZlBhdGgpID0+IHtcbiAgICBjb25zdCBhdmROYW1lID0gcGF0aC5iYXNlbmFtZShjb25mUGF0aCkuc3BsaXQoJy4nKS5zbGljZSgwLCAtMSkuam9pbignLicpO1xuICAgIHJldHVybiB7bmFtZTogYXZkTmFtZSwgY29uZmlnOiBjb25mUGF0aH07XG4gIH0pLmZpbHRlcigoe25hbWV9KSA9PiBfLnRyaW0obmFtZSkpO1xufVxuXG4vKipcbiAqIENoZWNrIHRoZSBlbXVsYXRvciBzdGF0ZS5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIEVtdWxhdG9yIGlzIHZpc2libGUgdG8gYWRiLlxuICovXG5lbXVNZXRob2RzLmlzRW11bGF0b3JDb25uZWN0ZWQgPSBhc3luYyBmdW5jdGlvbiBpc0VtdWxhdG9yQ29ubmVjdGVkICgpIHtcbiAgbGV0IGVtdWxhdG9ycyA9IGF3YWl0IHRoaXMuZ2V0Q29ubmVjdGVkRW11bGF0b3JzKCk7XG4gIHJldHVybiAhIV8uZmluZChlbXVsYXRvcnMsICh4KSA9PiB4ICYmIHgudWRpZCA9PT0gdGhpcy5jdXJEZXZpY2VJZCk7XG59O1xuXG4vKipcbiAqIFZlcmlmeSB0aGUgZW11bGF0b3IgaXMgY29ubmVjdGVkLlxuICpcbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiBFbXVsYXRvciBpcyBub3QgdmlzaWJsZSB0byBhZGIuXG4gKi9cbmVtdU1ldGhvZHMudmVyaWZ5RW11bGF0b3JDb25uZWN0ZWQgPSBhc3luYyBmdW5jdGlvbiB2ZXJpZnlFbXVsYXRvckNvbm5lY3RlZCAoKSB7XG4gIGlmICghKGF3YWl0IHRoaXMuaXNFbXVsYXRvckNvbm5lY3RlZCgpKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGVtdWxhdG9yIFwiJHt0aGlzLmN1ckRldmljZUlkfVwiIHdhcyB1bmV4cGVjdGVkbHkgZGlzY29ubmVjdGVkYCk7XG4gIH1cbn07XG5cbi8qKlxuICogRW11bGF0ZSBmaW5nZXJwcmludCB0b3VjaCBldmVudCBvbiB0aGUgY29ubmVjdGVkIGVtdWxhdG9yLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaW5nZXJwcmludElkIC0gVGhlIElEIG9mIHRoZSBmaW5nZXJwcmludC5cbiAqL1xuZW11TWV0aG9kcy5maW5nZXJwcmludCA9IGFzeW5jIGZ1bmN0aW9uIGZpbmdlcnByaW50IChmaW5nZXJwcmludElkKSB7XG4gIGlmICghZmluZ2VycHJpbnRJZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRmluZ2VycHJpbnQgaWQgcGFyYW1ldGVyIG11c3QgYmUgZGVmaW5lZCcpO1xuICB9XG4gIC8vIHRoZSBtZXRob2QgdXNlZCBvbmx5IHdvcmtzIGZvciBBUEkgbGV2ZWwgMjMgYW5kIGFib3ZlXG4gIGxldCBsZXZlbCA9IGF3YWl0IHRoaXMuZ2V0QXBpTGV2ZWwoKTtcbiAgaWYgKGxldmVsIDwgMjMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYERldmljZSBBUEkgTGV2ZWwgbXVzdCBiZSA+PSAyMy4gQ3VycmVudCBBcGkgbGV2ZWwgJyR7bGV2ZWx9J2ApO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiRXhlY0VtdShbJ2ZpbmdlcicsICd0b3VjaCcsIGZpbmdlcnByaW50SWRdKTtcbn07XG5cbi8qKlxuICogQ2hhbmdlIHRoZSBkaXNwbGF5IG9yaWVudGF0aW9uIG9uIHRoZSBjb25uZWN0ZWQgZW11bGF0b3IuXG4gKiBUaGUgb3JpZW50YXRpb24gaXMgY2hhbmdlZCAoUEkvMiBpcyBhZGRlZCkgZXZlcnkgdGltZVxuICogdGhpcyBtZXRob2QgaXMgY2FsbGVkLlxuICovXG5lbXVNZXRob2RzLnJvdGF0ZSA9IGFzeW5jIGZ1bmN0aW9uIHJvdGF0ZSAoKSB7XG4gIGF3YWl0IHRoaXMuYWRiRXhlY0VtdShbJ3JvdGF0ZSddKTtcbn07XG5cbi8qKlxuICogRW11bGF0ZSBwb3dlciBzdGF0ZSBjaGFuZ2Ugb24gdGhlIGNvbm5lY3RlZCBlbXVsYXRvci5cbiAqXG4gKiBAcGFyYW0ge29ufG9mZn0gc3RhdGUgWydvbiddIC0gRWl0aGVyICdvbicgb3IgJ29mZicuXG4gKi9cbmVtdU1ldGhvZHMucG93ZXJBQyA9IGFzeW5jIGZ1bmN0aW9uIHBvd2VyQUMgKHN0YXRlID0gJ29uJykge1xuICBpZiAoXy52YWx1ZXMoZW11TWV0aG9kcy5QT1dFUl9BQ19TVEFURVMpLmluZGV4T2Yoc3RhdGUpID09PSAtMSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFdyb25nIHBvd2VyIEFDIHN0YXRlIHNlbnQgJyR7c3RhdGV9Jy4gYFxuICAgICAgKyBgU3VwcG9ydGVkIHZhbHVlczogJHtfLnZhbHVlcyhlbXVNZXRob2RzLlBPV0VSX0FDX1NUQVRFUyl9XWApO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiRXhlY0VtdShbJ3Bvd2VyJywgJ2FjJywgc3RhdGVdKTtcbn07XG5cbi8qKlxuICogRW11bGF0ZSBzZW5zb3JzIHZhbHVlcyBvbiB0aGUgY29ubmVjdGVkIGVtdWxhdG9yLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZW5zb3IgLSBTZW5zb3IgdHlwZSBkZWNsYXJlZCBpbiBTRU5TT1JTIGl0ZW1zLlxuICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSB2YWx1ZSAgLSBOdW1iZXIgdG8gc2V0IGFzIHRoZSBzZW5zb3IgdmFsdWUuXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IC0gSWYgc2Vuc29yIHR5cGUgb3Igc2Vuc29yIHZhbHVlIGlzIG5vdCBkZWZpbmVkXG4gKi9cbmVtdU1ldGhvZHMuc2Vuc29yU2V0ID0gYXN5bmMgZnVuY3Rpb24gc2Vuc29yU2V0IChzZW5zb3IsIHZhbHVlKSB7XG4gIGlmICghXy5pbmNsdWRlcyhlbXVNZXRob2RzLlNFTlNPUlMsIHNlbnNvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBVbnN1cHBvcnRlZCBzZW5zb3Igc2VudCAnJHtzZW5zb3J9Jy4gYFxuICAgICAgKyBgU3VwcG9ydGVkIHZhbHVlczogJHtfLnZhbHVlcyhlbXVNZXRob2RzLlNFTlNPUlMpfV1gKTtcbiAgfVxuICBpZiAoXy5pc05pbCh2YWx1ZSkgfHwgdmFsdWUgPT09ICcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTWlzc2luZy9pbnZhbGlkIHNlbnNvciB2YWx1ZSBhcmd1bWVudC4gYFxuICAgICAgKyBgWW91IG5lZWQgdG8gcHJvdmlkZSBhIHZhbGlkIHZhbHVlIHRvIHNldCB0byB0aGUgc2Vuc29yIGluIGBcbiAgICAgICsgYGZvcm1hdCA8dmFsdWUtYT5bOjx2YWx1ZS1iPls6PHZhbHVlLWM+Wy4uLl1dXS5gKTtcbiAgfVxuICBhd2FpdCB0aGlzLmFkYkV4ZWNFbXUoWydzZW5zb3InLCAnc2V0Jywgc2Vuc29yLCB2YWx1ZV0pO1xufTtcblxuLyoqXG4gKiBFbXVsYXRlIHBvd2VyIGNhcGFjaXR5IGNoYW5nZSBvbiB0aGUgY29ubmVjdGVkIGVtdWxhdG9yLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gcGVyY2VudCBbMTAwXSAtIFBlcmNlbnRhZ2UgdmFsdWUgaW4gcmFuZ2UgWzAsIDEwMF0uXG4gKi9cbmVtdU1ldGhvZHMucG93ZXJDYXBhY2l0eSA9IGFzeW5jIGZ1bmN0aW9uIHBvd2VyQ2FwYWNpdHkgKHBlcmNlbnQgPSAxMDApIHtcbiAgcGVyY2VudCA9IHBhcnNlSW50KHBlcmNlbnQsIDEwKTtcbiAgaWYgKGlzTmFOKHBlcmNlbnQpIHx8IHBlcmNlbnQgPCAwIHx8IHBlcmNlbnQgPiAxMDApIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBUaGUgcGVyY2VudGFnZSB2YWx1ZSBzaG91bGQgYmUgdmFsaWQgaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDEwMGApO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiRXhlY0VtdShbJ3Bvd2VyJywgJ2NhcGFjaXR5JywgcGVyY2VudF0pO1xufTtcblxuLyoqXG4gKiBFbXVsYXRlIHBvd2VyIG9mZiBldmVudCBvbiB0aGUgY29ubmVjdGVkIGVtdWxhdG9yLlxuICovXG5lbXVNZXRob2RzLnBvd2VyT0ZGID0gYXN5bmMgZnVuY3Rpb24gcG93ZXJPRkYgKCkge1xuICBhd2FpdCB0aGlzLnBvd2VyQUMoZW11TWV0aG9kcy5QT1dFUl9BQ19TVEFURVMuUE9XRVJfQUNfT0ZGKTtcbiAgYXdhaXQgdGhpcy5wb3dlckNhcGFjaXR5KDApO1xufTtcblxuLyoqXG4gKiBFbXVsYXRlIHNlbmQgU01TIGV2ZW50IG9uIHRoZSBjb25uZWN0ZWQgZW11bGF0b3IuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBwaG9uZU51bWJlciAtIFRoZSBwaG9uZSBudW1iZXIgb2YgbWVzc2FnZSBzZW5kZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSBbJyddIC0gVGhlIG1lc3NhZ2UgY29udGVudC5cbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgcGhvbmUgbnVtYmVyIGhhcyBpbnZhbGlkIGZvcm1hdC5cbiAqL1xuZW11TWV0aG9kcy5zZW5kU01TID0gYXN5bmMgZnVuY3Rpb24gc2VuZFNNUyAocGhvbmVOdW1iZXIsIG1lc3NhZ2UgPSAnJykge1xuICBpZiAoXy5pc0VtcHR5KG1lc3NhZ2UpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignU01TIG1lc3NhZ2UgbXVzdCBub3QgYmUgZW1wdHknKTtcbiAgfVxuICBpZiAoIV8uaXNJbnRlZ2VyKHBob25lTnVtYmVyKSAmJiBfLmlzRW1wdHkocGhvbmVOdW1iZXIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUGhvbmUgbnVtYmVyIG1vc3Qgbm90IGJlIGVtcHR5Jyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGJFeGVjRW11KFsnc21zJywgJ3NlbmQnLCBwaG9uZU51bWJlciwgbWVzc2FnZV0pO1xufTtcblxuLyoqXG4gKiBFbXVsYXRlIEdTTSBjYWxsIGV2ZW50IG9uIHRoZSBjb25uZWN0ZWQgZW11bGF0b3IuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBwaG9uZU51bWJlciAtIFRoZSBwaG9uZSBudW1iZXIgb2YgdGhlIGNhbGxlci5cbiAqIEBwYXJhbSB7Y2FsbHxhY2NlcHR8Y2FuY2VsfGhvbGR9IGFjdGlvbiAtIE9uZSBvZiBhdmFpbGFibGUgR1NNIGNhbGwgYWN0aW9ucy5cbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgcGhvbmUgbnVtYmVyIGhhcyBpbnZhbGlkIGZvcm1hdC5cbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgX2FjdGlvbl8gdmFsdWUgaXMgaW52YWxpZC5cbiAqL1xuZW11TWV0aG9kcy5nc21DYWxsID0gYXN5bmMgZnVuY3Rpb24gZ3NtQ2FsbCAocGhvbmVOdW1iZXIsIGFjdGlvbikge1xuICBpZiAoIV8udmFsdWVzKGVtdU1ldGhvZHMuR1NNX0NBTExfQUNUSU9OUykuaW5jbHVkZXMoYWN0aW9uKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICBgSW52YWxpZCBnc20gYWN0aW9uIHBhcmFtICR7YWN0aW9ufS4gU3VwcG9ydGVkIHZhbHVlczogJHtfLnZhbHVlcyhlbXVNZXRob2RzLkdTTV9DQUxMX0FDVElPTlMpfWBcbiAgICApO1xuICB9XG4gIGlmICghXy5pc0ludGVnZXIocGhvbmVOdW1iZXIpICYmIF8uaXNFbXB0eShwaG9uZU51bWJlcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdQaG9uZSBudW1iZXIgbW9zdCBub3QgYmUgZW1wdHknKTtcbiAgfVxuICBhd2FpdCB0aGlzLmFkYkV4ZWNFbXUoWydnc20nLCBhY3Rpb24sIHBob25lTnVtYmVyXSk7XG59O1xuXG4vKipcbiAqIEVtdWxhdGUgR1NNIHNpZ25hbCBzdHJlbmd0aCBjaGFuZ2UgZXZlbnQgb24gdGhlIGNvbm5lY3RlZCBlbXVsYXRvci5cbiAqXG4gKiBAcGFyYW0gezB8MXwyfDN8NH0gc3RyZW5ndGggWzRdIC0gQSBudW1iZXIgaW4gcmFuZ2UgWzAsIDRdO1xuICogQHRocm93cyB7VHlwZUVycm9yfSBJZiBfc3RyZW5ndGhfIHZhbHVlIGlzIGludmFsaWQuXG4gKi9cbmVtdU1ldGhvZHMuZ3NtU2lnbmFsID0gYXN5bmMgZnVuY3Rpb24gZ3NtU2lnbmFsIChzdHJlbmd0aCA9IDQpIHtcbiAgc3RyZW5ndGggPSBwYXJzZUludChzdHJlbmd0aCwgMTApO1xuICBpZiAoIWVtdU1ldGhvZHMuR1NNX1NJR05BTF9TVFJFTkdUSFMuaW5jbHVkZXMoc3RyZW5ndGgpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgIGBJbnZhbGlkIHNpZ25hbCBzdHJlbmd0aCBwYXJhbSAke3N0cmVuZ3RofS4gU3VwcG9ydGVkIHZhbHVlczogJHtfLnZhbHVlcyhlbXVNZXRob2RzLkdTTV9TSUdOQUxfU1RSRU5HVEhTKX1gXG4gICAgKTtcbiAgfVxuICBsb2cuaW5mbygnZ3NtIHNpZ25hbC1wcm9maWxlIDxzdHJlbmd0aD4gY2hhbmdlcyB0aGUgcmVwb3J0ZWQgc3RyZW5ndGggb24gbmV4dCAoMTVzKSB1cGRhdGUuJyk7XG4gIGF3YWl0IHRoaXMuYWRiRXhlY0VtdShbJ2dzbScsICdzaWduYWwtcHJvZmlsZScsIHN0cmVuZ3RoXSk7XG59O1xuXG4vKipcbiAqIEVtdWxhdGUgR1NNIHZvaWNlIGV2ZW50IG9uIHRoZSBjb25uZWN0ZWQgZW11bGF0b3IuXG4gKlxuICogQHBhcmFtIHt1bnJlZ2lzdGVyZWR8aG9tZXxyb2FtaW5nfHNlYXJjaGluZ3xkZW5pZWR8b258b2ZmfSBzdGF0ZSBbJ29uJ10gLSBFaXRoZXIgJ29uJyBvciAnb2ZmJy5cbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgX3N0YXRlXyB2YWx1ZSBpcyBpbnZhbGlkLlxuICovXG5lbXVNZXRob2RzLmdzbVZvaWNlID0gYXN5bmMgZnVuY3Rpb24gZ3NtVm9pY2UgKHN0YXRlID0gJ29uJykge1xuICAvLyBnc20gdm9pY2UgPHN0YXRlPiBhbGxvd3MgeW91IHRvIGNoYW5nZSB0aGUgc3RhdGUgb2YgeW91ciBHUFJTIGNvbm5lY3Rpb25cbiAgaWYgKCFfLnZhbHVlcyhlbXVNZXRob2RzLkdTTV9WT0lDRV9TVEFURVMpLmluY2x1ZGVzKHN0YXRlKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICBgSW52YWxpZCBnc20gdm9pY2Ugc3RhdGUgcGFyYW0gJHtzdGF0ZX0uIFN1cHBvcnRlZCB2YWx1ZXM6ICR7Xy52YWx1ZXMoZW11TWV0aG9kcy5HU01fVk9JQ0VfU1RBVEVTKX1gXG4gICAgKTtcbiAgfVxuICBhd2FpdCB0aGlzLmFkYkV4ZWNFbXUoWydnc20nLCAndm9pY2UnLCBzdGF0ZV0pO1xufTtcblxuLyoqXG4gKiBFbXVsYXRlIG5ldHdvcmsgc3BlZWQgY2hhbmdlIGV2ZW50IG9uIHRoZSBjb25uZWN0ZWQgZW11bGF0b3IuXG4gKlxuICogQHBhcmFtIHtnc218c2NzZHxncHJzfGVkZ2V8dW10c3xoc3BkYXxsdGV8ZXZkb3xmdWxsfSBzcGVlZCBbJ2Z1bGwnXSAtIE9uZSBvZiBwb3NzaWJsZSBORVRXT1JLX1NQRUVEIHZhbHVlcy5cbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgX3NwZWVkXyB2YWx1ZSBpcyBpbnZhbGlkLlxuICovXG5lbXVNZXRob2RzLm5ldHdvcmtTcGVlZCA9IGFzeW5jIGZ1bmN0aW9uIG5ldHdvcmtTcGVlZCAoc3BlZWQgPSAnZnVsbCcpIHtcbiAgLy8gbmV0d29yayBzcGVlZCA8c3BlZWQ+IGFsbG93cyB5b3UgdG8gc2V0IHRoZSBuZXR3b3JrIHNwZWVkIGVtdWxhdGlvbi5cbiAgaWYgKCFfLnZhbHVlcyhlbXVNZXRob2RzLk5FVFdPUktfU1BFRUQpLmluY2x1ZGVzKHNwZWVkKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIG5ldHdvcmsgc3BlZWQgcGFyYW0gJHtzcGVlZH0uIFN1cHBvcnRlZCB2YWx1ZXM6ICR7Xy52YWx1ZXMoZW11TWV0aG9kcy5ORVRXT1JLX1NQRUVEKX1gXG4gICAgKTtcbiAgfVxuICBhd2FpdCB0aGlzLmFkYkV4ZWNFbXUoWyduZXR3b3JrJywgJ3NwZWVkJywgc3BlZWRdKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gRXhlY1RlbG5ldE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBleGVjVGltZW91dCBbNjAwMDBdIEEgdGltZW91dCB1c2VkIHRvIHdhaXQgZm9yIGEgc2VydmVyXG4gKiByZXBseSB0byB0aGUgZ2l2ZW4gY29tbWFuZFxuICogQHByb3BlcnR5IHtudW1iZXJ9IGNvbm5UaW1lb3V0IFs1MDAwXSBDb25zb2xlIGNvbm5lY3Rpb24gdGltZW91dCBpbiBtaWxsaXNlY29uZHNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBpbml0VGltZW91dCBbNTAwMF0gVGVsbmV0IGNvbnNvbGUgaW5pdGlhbGl6YXRpb24gdGltZW91dFxuICogaW4gbWlsbGlzZWNvbmRzICh0aGUgdGltZSBiZXR3ZWVuIGNvbm5lY3Rpb24gaGFwcGVucyBhbmQgdGhlIGNvbW1hbmQgcHJvbXB0XG4gKiBpcyBhdmFpbGFibGUpXG4gKiBAcHJvcGVydHkgez9udW1iZXJ8c3RyaW5nfSBwb3J0IFRoZSBlbXVsYXRvciBwb3J0IG51bWJlci4gVGhlIG1ldGhvZCB3aWxsIHRyeSB0byBwYXJzZSBpdFxuICogZnJvbSB0aGUgY3VycmVudCBkZXZpY2UgaWRlbnRpZmllciBpZiB1bnNldFxuICovXG5cbi8qKlxuICogRXhlY3V0ZXMgYSBjb21tYW5kIHRocm91Z2ggZW11bGF0b3IgdGVsbmV0IGNvbnNvbGUgaW50ZXJmYWNlIGFuZCByZXR1cm5zIGl0cyBvdXRwdXRcbiAqXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz58c3RyaW5nfSBjbWQgLSBUaGUgYWN0dWFsIGNvbW1hbmQgdG8gZXhlY3V0ZS4gU2VlXG4gKiBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9zdHVkaW8vcnVuL2VtdWxhdG9yLWNvbnNvbGUgZm9yIG1vcmUgZGV0YWlsc1xuICogb24gYXZhaWxhYmxlIGNvbW1hbmRzXG4gKiBAcGFyYW0ge0V4ZWNUZWxuZXRPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY29tbWFuZCBvdXRwdXRcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgY29ubmVjdGluZyB0byB0aGUgVGVsbmV0IGNvbnNvbGVcbiAqIG9yIGlmIHRoZSBnaXZlbiBjb21tYW5kIHJldHVybmVkIG5vbi1PSyByZXNwb25zZVxuICovXG5lbXVNZXRob2RzLmV4ZWNFbXVDb25zb2xlQ29tbWFuZCA9IGFzeW5jIGZ1bmN0aW9uIGV4ZWNUZWxuZXQgKGNtZCwgb3B0cyA9IHt9KSB7XG4gIGxldCBwb3J0ID0gcGFyc2VJbnQob3B0cy5wb3J0LCAxMCk7XG4gIGlmICghcG9ydCkge1xuICAgIGNvbnN0IHBvcnRNYXRjaCA9IC9lbXVsYXRvci0oXFxkKykvaS5leGVjKHRoaXMuY3VyRGV2aWNlSWQpO1xuICAgIGlmICghcG9ydE1hdGNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBwYXJzZSB0aGUgY29uc29sZSBwb3J0IG51bWJlciBmcm9tIHRoZSBkZXZpY2UgaWRlbnRpZmllciAnJHt0aGlzLmN1ckRldmljZUlkfScuIGAgK1xuICAgICAgICBgSXMgaXQgYW4gZW11bGF0b3I/YCk7XG4gICAgfVxuICAgIHBvcnQgPSBwYXJzZUludChwb3J0TWF0Y2hbMV0sIDEwKTtcbiAgfVxuICBjb25zdCBob3N0ID0gJzEyNy4wLjAuMSc7XG4gIGNvbnN0IHtcbiAgICBleGVjVGltZW91dCA9IDYwMDAwLFxuICAgIGNvbm5UaW1lb3V0ID0gNTAwMCxcbiAgICBpbml0VGltZW91dCA9IDUwMDAsXG4gIH0gPSBvcHRzO1xuICBhd2FpdCB0aGlzLnJlc2V0VGVsbmV0QXV0aFRva2VuKCk7XG5cbiAgY29uc3Qgb2tGbGFnID0gL15PSyQvbTtcbiAgY29uc3Qgbm9rRmxhZyA9IC9eS09cXGIvbTtcbiAgY29uc3QgZW9sID0gJ1xcclxcbic7XG4gIGNvbnN0IGNsaWVudCA9IG5ldC5jb25uZWN0KHtcbiAgICBob3N0LFxuICAgIHBvcnQsXG4gIH0pO1xuXG4gIHJldHVybiBhd2FpdCBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgY29ublRpbWVvdXRPYmogPSBzZXRUaW1lb3V0KFxuICAgICAgKCkgPT4gcmVqZWN0KG5ldyBFcnJvcihgQ2Fubm90IGNvbm5lY3QgdG8gdGhlIEVtdWxhdG9yIGNvbnNvbGUgYXQgJHtob3N0fToke3BvcnR9IGAgK1xuICAgICAgICBgYWZ0ZXIgJHtjb25uVGltZW91dH1tc2ApKSwgY29ublRpbWVvdXQpO1xuICAgIGxldCBleGVjVGltZW91dE9iajtcbiAgICBsZXQgaW5pdFRpbWVvdXRPYmo7XG4gICAgbGV0IGlzQ29tbWFuZFNlbnQgPSBmYWxzZTtcbiAgICBsZXQgc2VydmVyUmVzcG9uc2UgPSBbXTtcblxuICAgIGNsaWVudC5vbmNlKCdlcnJvcicsIChlKSA9PiB7XG4gICAgICBjbGVhclRpbWVvdXQoY29ublRpbWVvdXRPYmopO1xuICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQ2Fubm90IGNvbm5lY3QgdG8gdGhlIEVtdWxhdG9yIGNvbnNvbGUgYXQgJHtob3N0fToke3BvcnR9LiBgICtcbiAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKSk7XG4gICAgfSk7XG5cbiAgICBjbGllbnQub25jZSgnY29ubmVjdCcsICgpID0+IHtcbiAgICAgIGNsZWFyVGltZW91dChjb25uVGltZW91dE9iaik7XG4gICAgICBpbml0VGltZW91dE9iaiA9IHNldFRpbWVvdXQoXG4gICAgICAgICgpID0+IHJlamVjdChuZXcgRXJyb3IoYERpZCBub3QgZ2V0IHRoZSBpbml0aWFsIHJlc3BvbnNlIGZyb20gdGhlIEVtdWxhdG9yIGNvbnNvbGUgYXQgJHtob3N0fToke3BvcnR9IGAgK1xuICAgICAgICAgIGBhZnRlciAke2luaXRUaW1lb3V0fW1zYCkpLCBpbml0VGltZW91dCk7XG4gICAgfSk7XG5cbiAgICBjbGllbnQub24oJ2RhdGEnLCAoY2h1bmspID0+IHtcbiAgICAgIHNlcnZlclJlc3BvbnNlLnB1c2goY2h1bmspO1xuICAgICAgY29uc3Qgb3V0cHV0ID0gQnVmZmVyLmNvbmNhdChzZXJ2ZXJSZXNwb25zZSkudG9TdHJpbmcoJ3V0ZjgnKS50cmltKCk7XG4gICAgICBpZiAob2tGbGFnLnRlc3Qob3V0cHV0KSkge1xuICAgICAgICAvLyBUaGUgaW5pdGlhbCBpbmNvbWluZyBkYXRhIGNodW5rIGNvbmZpcm1zIHRoZSBpbnRlcmZhY2UgaXMgcmVhZHkgZm9yIGlucHV0XG4gICAgICAgIGlmICghaXNDb21tYW5kU2VudCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dChpbml0VGltZW91dE9iaik7XG4gICAgICAgICAgc2VydmVyUmVzcG9uc2UgPSBbXTtcbiAgICAgICAgICBjb25zdCBjbWRTdHIgPSBfLmlzQXJyYXkoY21kKSA/IHV0aWwucXVvdGUoY21kKSA6IGAke2NtZH1gO1xuICAgICAgICAgIGxvZy5kZWJ1ZyhgRXhlY3V0aW5nIEVtdWxhdG9yIGNvbnNvbGUgY29tbWFuZDogJHtjbWRTdHJ9YCk7XG4gICAgICAgICAgY2xpZW50LndyaXRlKGNtZFN0cik7XG4gICAgICAgICAgY2xpZW50LndyaXRlKGVvbCk7XG4gICAgICAgICAgaXNDb21tYW5kU2VudCA9IHRydWU7XG4gICAgICAgICAgZXhlY1RpbWVvdXRPYmogPSBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgKCkgPT4gcmVqZWN0KG5ldyBFcnJvcihgRGlkIG5vdCBnZXQgYW55IHJlc3BvbnNlIGZyb20gdGhlIEVtdWxhdG9yIGNvbnNvbGUgYXQgJHtob3N0fToke3BvcnR9IGAgK1xuICAgICAgICAgICAgICBgdG8gJyR7Y21kfScgY29tbWFuZCBhZnRlciAke2V4ZWNUaW1lb3V0fW1zYCkpLCBleGVjVGltZW91dCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNsZWFyVGltZW91dChleGVjVGltZW91dE9iaik7XG4gICAgICAgIGNsaWVudC5lbmQoKTtcbiAgICAgICAgY29uc3Qgb3V0cHV0QXJyID0gb3V0cHV0LnNwbGl0KGVvbCk7XG4gICAgICAgIC8vIHJlbW92ZSB0aGUgcmVkdW5kYW50IE9LIGZsYWcgZnJvbSB0aGUgcmVzdWx0aW5nIGNvbW1hbmQgb3V0cHV0XG4gICAgICAgIHJldHVybiByZXNvbHZlKG91dHB1dEFyci5zbGljZSgwLCBvdXRwdXRBcnIubGVuZ3RoIC0gMSkuam9pbignXFxuJykudHJpbSgpKTtcbiAgICAgIH0gZWxzZSBpZiAobm9rRmxhZy50ZXN0KG91dHB1dCkpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KGluaXRUaW1lb3V0T2JqKTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KGV4ZWNUaW1lb3V0T2JqKTtcbiAgICAgICAgY2xpZW50LmVuZCgpO1xuICAgICAgICBjb25zdCBvdXRwdXRBcnIgPSBvdXRwdXQuc3BsaXQoZW9sKTtcbiAgICAgICAgcmV0dXJuIHJlamVjdChfLnRyaW0oXy5sYXN0KG91dHB1dEFycikpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEVtdVZlcnNpb25JbmZvXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHJldmlzaW9uIFRoZSBhY3R1YWwgcmV2aXNpb24gbnVtYmVyLCBmb3IgZXhhbXBsZSAnMzAuMC41J1xuICogQHByb3BlcnR5IHs/bnVtYmVyfSBidWlsZElkIFRoZSBidWlsZCBpZGVudGlmaWVyLCBmb3IgZXhhbXBsZSA2MzA2MDQ3XG4gKi9cblxuLyoqXG4gKiBSZXRyaWV2ZXMgZW11bGF0b3IgdmVyc2lvbiBmcm9tIHRoZSBmaWxlIHN5c3RlbVxuICpcbiAqIEByZXR1cm5zIHtFbXVWZXJzaW9uSW5mb30gSWYgbm8gdmVyc2lvbiBpbmZvIGNvdWxkIGJlIHBhcnNlZCB0aGVuIGFuIGVtcHR5XG4gKiBvYmplY3QgaXMgcmV0dXJuZWRcbiAqL1xuZW11TWV0aG9kcy5nZXRFbXVWZXJzaW9uSW5mbyA9IGFzeW5jIGZ1bmN0aW9uIGdldEVtdVZlcnNpb25JbmZvICgpIHtcbiAgY29uc3QgcHJvcHNQYXRoID0gcGF0aC5qb2luKHRoaXMuc2RrUm9vdCwgJ2VtdWxhdG9yJywgJ3NvdXJjZS5wcm9wZXJ0aWVzJyk7XG4gIGlmICghYXdhaXQgZnMuZXhpc3RzKHByb3BzUGF0aCkpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUocHJvcHNQYXRoLCAndXRmOCcpO1xuICBjb25zdCByZXZpc2lvbk1hdGNoID0gL15Qa2dcXC5SZXZpc2lvbj0oW1xcZC5dKykkL20uZXhlYyhjb250ZW50KTtcbiAgY29uc3QgcmVzdWx0ID0ge307XG4gIGlmIChyZXZpc2lvbk1hdGNoKSB7XG4gICAgcmVzdWx0LnJldmlzaW9uID0gcmV2aXNpb25NYXRjaFsxXTtcbiAgfVxuICBjb25zdCBidWlsZElkTWF0Y2ggPSAvXlBrZ1xcLkJ1aWxkSWQ9KFxcZCspJC9tLmV4ZWMoY29udGVudCk7XG4gIGlmIChidWlsZElkTWF0Y2gpIHtcbiAgICByZXN1bHQuYnVpbGRJZCA9IHBhcnNlSW50KGJ1aWxkSWRNYXRjaFsxXSwgMTApO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyBlbXVsYXRvciBpbWFnZSBwcm9wZXJ0aWVzIGZyb20gdGhlIGxvY2FsIGZpbGUgc3lzdGVtXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGF2ZE5hbWUgRW11bGF0b3IgbmFtZS4gU2hvdWxkIE5PVCBzdGFydCB3aXRoICdAJyBjaGFyYWN0ZXJcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGVyZSB3YXMgYSBmYWlsdXJlIHdoaWxlIGV4dHJhY3RpbmcgdGhlIHByb3BlcnRpZXNcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBjb250ZW50IG9mIGVtdWxhdG9yIGltYWdlIHByb3BlcnRpZXMgZmlsZS5cbiAqIFVzdWFsbHkgdGhpcyBjb25maWd1cmF0aW9uIC5pbmkgZmlsZSBoYXMgdGhlIGZvbGxvd2luZyBjb250ZW50OlxuICogICBhdmQuaW5pLmVuY29kaW5nPVVURi04XG4gKiAgIHBhdGg9L1VzZXJzL3VzZXJuYW1lLy5hbmRyb2lkL2F2ZC9QaXhlbF9YTF9BUElfMzAuYXZkXG4gKiAgIHBhdGgucmVsPWF2ZC9QaXhlbF9YTF9BUElfMzAuYXZkXG4gKiAgIHRhcmdldD1hbmRyb2lkLTMwXG4gKi9cbmVtdU1ldGhvZHMuZ2V0RW11SW1hZ2VQcm9wZXJ0aWVzID0gYXN5bmMgZnVuY3Rpb24gZ2V0RW11SW1hZ2VQcm9wZXJ0aWVzIChhdmROYW1lKSB7XG4gIGNvbnN0IGF2ZHMgPSBhd2FpdCBsaXN0RW11bGF0b3JzKCk7XG4gIGNvbnN0IGF2ZCA9IGF2ZHMuZmluZCgoe25hbWV9KSA9PiBuYW1lID09PSBhdmROYW1lKTtcbiAgaWYgKCFhdmQpIHtcbiAgICBsZXQgbXNnID0gYENhbm5vdCBmaW5kICcke2F2ZE5hbWV9JyBlbXVsYXRvci4gYDtcbiAgICBpZiAoXy5pc0VtcHR5KGF2ZHMpKSB7XG4gICAgICBtc2cgKz0gYE5vIGVtdWxhdG9ycyBoYXZlIGJlZW4gZGV0ZWN0ZWQgb24geW91ciBzeXN0ZW1gO1xuICAgIH0gZWxzZSB7XG4gICAgICBtc2cgKz0gYEF2YWlsYWJsZSBhdmQgbmFtZXMgYXJlOiAke2F2ZHMubWFwKCh7bmFtZX0pID0+IG5hbWUpfWA7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICB9XG4gIHJldHVybiBpbmkucGFyc2UoYXdhaXQgZnMucmVhZEZpbGUoYXZkLmNvbmZpZywgJ3V0ZjgnKSk7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGdpdmVuIGVtdWxhdG9yIGV4aXN0cyBpbiB0aGUgbGlzdCBvZiBhdmFpbGFibGUgYXZkcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXZkTmFtZSAtIFRoZSBuYW1lIG9mIGVtdWxhdG9yIHRvIHZlcmlmeSBmb3IgZXhpc3RlbmNlLlxuICogU2hvdWxkIE5PVCBzdGFydCB3aXRoICdAJyBjaGFyYWN0ZXJcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgZW11bGF0b3Igd2l0aCBnaXZlbiBuYW1lIGRvZXMgbm90IGV4aXN0LlxuICovXG5lbXVNZXRob2RzLmNoZWNrQXZkRXhpc3QgPSBhc3luYyBmdW5jdGlvbiBjaGVja0F2ZEV4aXN0IChhdmROYW1lKSB7XG4gIGNvbnN0IGF2ZHMgPSBhd2FpdCBsaXN0RW11bGF0b3JzKCk7XG4gIGlmICghYXZkcy5zb21lKCh7bmFtZX0pID0+IG5hbWUgPT09IGF2ZE5hbWUpKSB7XG4gICAgbGV0IG1zZyA9IGBBdmQgJyR7YXZkTmFtZX0nIGlzIG5vdCBhdmFpbGFibGUuIGA7XG4gICAgaWYgKF8uaXNFbXB0eShhdmRzKSkge1xuICAgICAgbXNnICs9IGBObyBlbXVsYXRvcnMgaGF2ZSBiZWVuIGRldGVjdGVkIG9uIHlvdXIgc3lzdGVtYDtcbiAgICB9IGVsc2Uge1xuICAgICAgbXNnICs9IGBQbGVhc2Ugc2VsZWN0IHlvdXIgYXZkIG5hbWUgZnJvbSBvbmUgb2YgdGhlc2U6ICcke2F2ZHMubWFwKCh7bmFtZX0pID0+IG5hbWUpfSdgO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGVtdU1ldGhvZHM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsSUFBQUEsT0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsUUFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsT0FBQSxHQUFBSCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUcsSUFBQSxHQUFBSixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUksUUFBQSxHQUFBSixPQUFB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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adb-emu-commands.js","names":["_logger","_interopRequireDefault","require","_helpers","_lodash","_net","_support","_bluebird","_path","_ini","PHONE_NUMBER_PATTERN","emuMethods","POWER_AC_STATES","Object","freeze","POWER_AC_ON","POWER_AC_OFF","GSM_CALL_ACTIONS","GSM_CALL","GSM_ACCEPT","GSM_CANCEL","GSM_HOLD","GSM_VOICE_STATES","GSM_VOICE_UNREGISTERED","GSM_VOICE_HOME","GSM_VOICE_ROAMING","GSM_VOICE_SEARCHING","GSM_VOICE_DENIED","GSM_VOICE_OFF","GSM_VOICE_ON","GSM_SIGNAL_STRENGTHS","NETWORK_SPEED","GSM","SCSD","GPRS","EDGE","UMTS","HSDPA","LTE","EVDO","FULL","SENSORS","ACCELERATION","GYROSCOPE","MAGNETIC_FIELD","ORIENTATION","TEMPERATURE","PROXIMITY","LIGHT","PRESSURE","HUMIDITY","MAGNETIC_FIELD_UNCALIBRATED","GYROSCOPE_UNCALIBRATED","HINGE_ANGLE0","HINGE_ANGLE1","HINGE_ANGLE2","HEART_RATE","RGBC_LIGHT","listEmulators","avdsRoot","process","env","ANDROID_AVD_HOME","dirExists","getAvdConfigPaths","log","warn","prefsRoot","getAndroidPrefsRoot","path","resolve","debug","configs","fs","glob","cwd","absolute","map","confPath","avdName","basename","split","slice","join","name","config","filter","_","trim","isEmulatorConnected","emulators","getConnectedEmulators","find","x","udid","curDeviceId","verifyEmulatorConnected","Error","fingerprint","fingerprintId","level","getApiLevel","adbExecEmu","rotate","powerAC","state","values","indexOf","TypeError","sensorSet","sensor","value","includes","isNil","powerCapacity","percent","parseInt","isNaN","powerOFF","sendSMS","phoneNumber","message","replace","test","gsmCall","action","gsmSignal","strength","info","gsmVoice","networkSpeed","speed","execEmuConsoleCommand","execTelnet","cmd","opts","port","portMatch","exec","host","execTimeout","connTimeout","initTimeout","resetTelnetAuthToken","okFlag","nokFlag","eol","client","net","connect","B","reject","connTimeoutObj","setTimeout","execTimeoutObj","initTimeoutObj","isCommandSent","serverResponse","once","e","clearTimeout","on","chunk","push","output","Buffer","concat","toString","cmdStr","isArray","util","quote","write","end","outputArr","length","last","getEmuVersionInfo","propsPath","sdkRoot","exists","content","readFile","revisionMatch","result","revision","buildIdMatch","buildId","getEmuImageProperties","avds","avd","msg","isEmpty","ini","parse","checkAvdExist","some","_default","exports","default"],"sources":["../../../lib/tools/adb-emu-commands.js"],"sourcesContent":["import log from '../logger.js';\nimport { getAndroidPrefsRoot, dirExists } from '../helpers';\nimport _ from 'lodash';\nimport net from 'net';\nimport { util, fs } from '@appium/support';\nimport B from 'bluebird';\nimport path from 'path';\nimport ini from 'ini';\n\nconst PHONE_NUMBER_PATTERN = /^[+]?[(]?[0-9]*[)]?[-\\s.]?[0-9]*[-\\s.]?[0-9]{2,}$/im;\n\nconst emuMethods = {};\nemuMethods.POWER_AC_STATES = Object.freeze({\n POWER_AC_ON: 'on',\n POWER_AC_OFF: 'off'\n});\nemuMethods.GSM_CALL_ACTIONS = Object.freeze({\n GSM_CALL: 'call',\n GSM_ACCEPT: 'accept',\n GSM_CANCEL: 'cancel',\n GSM_HOLD: 'hold'\n});\nemuMethods.GSM_VOICE_STATES = Object.freeze({\n GSM_VOICE_UNREGISTERED: 'unregistered',\n GSM_VOICE_HOME: 'home',\n GSM_VOICE_ROAMING: 'roaming',\n GSM_VOICE_SEARCHING: 'searching',\n GSM_VOICE_DENIED: 'denied',\n GSM_VOICE_OFF: 'off',\n GSM_VOICE_ON: 'on'\n});\nemuMethods.GSM_SIGNAL_STRENGTHS = [0, 1, 2, 3, 4];\n\nemuMethods.NETWORK_SPEED = Object.freeze({\n GSM: 'gsm', // GSM/CSD (up: 14.4, down: 14.4).\n SCSD: 'scsd', // HSCSD (up: 14.4, down: 57.6).\n GPRS: 'gprs', // GPRS (up: 28.8, down: 57.6).\n EDGE: 'edge', // EDGE/EGPRS (up: 473.6, down: 473.6).\n UMTS: 'umts', // UMTS/3G (up: 384.0, down: 384.0).\n HSDPA: 'hsdpa', // HSDPA (up: 5760.0, down: 13,980.0).\n LTE: 'lte', // LTE (up: 58,000, down: 173,000).\n EVDO: 'evdo', // EVDO (up: 75,000, down: 280,000).\n FULL: 'full' // No limit, the default (up: 0.0, down: 0.0).\n});\n\nemuMethods.SENSORS = Object.freeze({\n ACCELERATION: 'acceleration',\n GYROSCOPE: 'gyroscope',\n MAGNETIC_FIELD: 'magnetic-field',\n ORIENTATION: 'orientation',\n TEMPERATURE: 'temperature',\n PROXIMITY: 'proximity',\n LIGHT: 'light',\n PRESSURE: 'pressure',\n HUMIDITY: 'humidity',\n MAGNETIC_FIELD_UNCALIBRATED: 'magnetic-field-uncalibrated',\n GYROSCOPE_UNCALIBRATED: 'gyroscope-uncalibrated',\n HINGE_ANGLE0: 'hinge-angle0',\n HINGE_ANGLE1: 'hinge-angle1',\n HINGE_ANGLE2: 'hinge-angle2',\n HEART_RATE: 'heart-rate',\n RGBC_LIGHT: 'rgbc-light',\n});\n\n/**\n * @typedef {Object} EmuInfo\n * @property {string} name Emulator name, for example `Pixel_XL_API_30`\n * @property {string} config Full path to the emulator config .ini file,\n * for example `/Users/user/.android/avd/Pixel_XL_API_30.ini`\n */\n\n/**\n * Retrieves the list of available Android emulators\n *\n * @returns {Array<EmuInfo>}\n */\nasync function listEmulators () {\n let avdsRoot = process.env.ANDROID_AVD_HOME;\n if (await dirExists(avdsRoot)) {\n return await getAvdConfigPaths(avdsRoot);\n }\n\n if (avdsRoot) {\n log.warn(`The value of the ANDROID_AVD_HOME environment variable '${avdsRoot}' is not an existing directory`);\n }\n\n const prefsRoot = await getAndroidPrefsRoot();\n if (!prefsRoot) {\n return [];\n }\n\n avdsRoot = path.resolve(prefsRoot, 'avd');\n if (!await dirExists(avdsRoot)) {\n log.debug(`Virtual devices config root '${avdsRoot}' is not an existing directory`);\n return [];\n }\n\n return await getAvdConfigPaths(avdsRoot);\n}\n\n/**\n * Get configuration paths of all virtual devices\n *\n * @param {string} avdsRoot Path to the directory that contains the AVD .ini files\n * @returns {Array<EmuInfo>}\n */\nasync function getAvdConfigPaths (avdsRoot) {\n const configs = await fs.glob('*.ini', {\n cwd: avdsRoot,\n absolute: true,\n });\n return configs.map((confPath) => {\n const avdName = path.basename(confPath).split('.').slice(0, -1).join('.');\n return {name: avdName, config: confPath};\n }).filter(({name}) => _.trim(name));\n}\n\n/**\n * Check the emulator state.\n *\n * @return {boolean} True if Emulator is visible to adb.\n */\nemuMethods.isEmulatorConnected = async function isEmulatorConnected () {\n let emulators = await this.getConnectedEmulators();\n return !!_.find(emulators, (x) => x && x.udid === this.curDeviceId);\n};\n\n/**\n * Verify the emulator is connected.\n *\n * @throws {error} If Emulator is not visible to adb.\n */\nemuMethods.verifyEmulatorConnected = async function verifyEmulatorConnected () {\n if (!(await this.isEmulatorConnected())) {\n throw new Error(`The emulator \"${this.curDeviceId}\" was unexpectedly disconnected`);\n }\n};\n\n/**\n * Emulate fingerprint touch event on the connected emulator.\n *\n * @param {string} fingerprintId - The ID of the fingerprint.\n */\nemuMethods.fingerprint = async function fingerprint (fingerprintId) {\n if (!fingerprintId) {\n throw new Error('Fingerprint id parameter must be defined');\n }\n // the method used only works for API level 23 and above\n let level = await this.getApiLevel();\n if (level < 23) {\n throw new Error(`Device API Level must be >= 23. Current Api level '${level}'`);\n }\n await this.adbExecEmu(['finger', 'touch', fingerprintId]);\n};\n\n/**\n * Change the display orientation on the connected emulator.\n * The orientation is changed (PI/2 is added) every time\n * this method is called.\n */\nemuMethods.rotate = async function rotate () {\n await this.adbExecEmu(['rotate']);\n};\n\n/**\n * Emulate power state change on the connected emulator.\n *\n * @param {string} state ['on'] - Either 'on' or 'off'.\n */\nemuMethods.powerAC = async function powerAC (state = 'on') {\n if (_.values(emuMethods.POWER_AC_STATES).indexOf(state) === -1) {\n throw new TypeError(`Wrong power AC state sent '${state}'. `\n + `Supported values: ${_.values(emuMethods.POWER_AC_STATES)}]`);\n }\n await this.adbExecEmu(['power', 'ac', state]);\n};\n\n/**\n * Emulate sensors values on the connected emulator.\n *\n * @param {string} sensor - Sensor type declared in SENSORS items.\n * @param {number|string} value - Number to set as the sensor value.\n * @throws {Error} - If sensor type or sensor value is not defined\n */\nemuMethods.sensorSet = async function sensorSet (sensor, value) {\n if (!_.includes(emuMethods.SENSORS, sensor)) {\n throw new TypeError(`Unsupported sensor sent '${sensor}'. `\n + `Supported values: ${_.values(emuMethods.SENSORS)}]`);\n }\n if (_.isNil(value) || value === '') {\n throw new TypeError(`Missing/invalid sensor value argument. `\n + `You need to provide a valid value to set to the sensor in `\n + `format <value-a>[:<value-b>[:<value-c>[...]]].`);\n }\n await this.adbExecEmu(['sensor', 'set', sensor, value]);\n};\n\n/**\n * Emulate power capacity change on the connected emulator.\n *\n * @param {string|number} percent [100] - Percentage value in range [0, 100].\n */\nemuMethods.powerCapacity = async function powerCapacity (percent = 100) {\n percent = parseInt(percent, 10);\n if (isNaN(percent) || percent < 0 || percent > 100) {\n throw new Error(`The percentage value should be valid integer between 0 and 100`);\n }\n await this.adbExecEmu(['power', 'capacity', percent]);\n};\n\n/**\n * Emulate power off event on the connected emulator.\n */\nemuMethods.powerOFF = async function powerOFF () {\n await this.powerAC(emuMethods.POWER_AC_STATES.POWER_AC_OFF);\n await this.powerCapacity(0);\n};\n\n/**\n * Emulate send SMS event on the connected emulator.\n *\n * @param {string|number} phoneNumber - The phone number of message sender.\n * @param {string} message [''] - The message content.\n * @throws {error} If phone number has invalid format.\n */\nemuMethods.sendSMS = async function sendSMS (phoneNumber, message = '') {\n message = message.trim();\n if (message === '') {\n throw new Error('Sending an SMS requires a message');\n }\n phoneNumber = `${phoneNumber}`.replace(/\\s*/, '');\n if (!PHONE_NUMBER_PATTERN.test(phoneNumber)) {\n throw new Error(`Invalid sendSMS phoneNumber param ${phoneNumber}`);\n }\n await this.adbExecEmu(['sms', 'send', phoneNumber, message]);\n};\n\n/**\n * Emulate GSM call event on the connected emulator.\n *\n * @param {string|number} phoneNumber - The phone number of the caller.\n * @param {string} action [''] - One of available GSM call actions.\n * @throws {error} If phone number has invalid format.\n * @throws {error} If _action_ value is invalid.\n */\nemuMethods.gsmCall = async function gsmCall (phoneNumber, action = '') {\n if (_.values(emuMethods.GSM_CALL_ACTIONS).indexOf(action) === -1) {\n throw new Error(`Invalid gsm action param ${action}. Supported values: ${_.values(emuMethods.GSM_CALL_ACTIONS)}`);\n }\n phoneNumber = `${phoneNumber}`.replace(/\\s*/, '');\n if (!PHONE_NUMBER_PATTERN.test(phoneNumber)) {\n throw new Error(`Invalid gsmCall phoneNumber param ${phoneNumber}`);\n }\n await this.adbExecEmu(['gsm', action, phoneNumber]);\n};\n\n/**\n * Emulate GSM signal strength change event on the connected emulator.\n *\n * @param {string|number} strength [4] - A number in range [0, 4];\n * @throws {error} If _strength_ value is invalid.\n */\nemuMethods.gsmSignal = async function gsmSignal (strength = 4) {\n strength = parseInt(strength, 10);\n if (emuMethods.GSM_SIGNAL_STRENGTHS.indexOf(strength) === -1) {\n throw new Error(`Invalid signal strength param ${strength}. Supported values: ${_.values(emuMethods.GSM_SIGNAL_STRENGTHS)}`);\n }\n log.info('gsm signal-profile <strength> changes the reported strength on next (15s) update.');\n await this.adbExecEmu(['gsm', 'signal-profile', strength]);\n};\n\n/**\n * Emulate GSM voice event on the connected emulator.\n *\n * @param {string} state ['on'] - Either 'on' or 'off'.\n * @throws {error} If _state_ value is invalid.\n */\nemuMethods.gsmVoice = async function gsmVoice (state = 'on') {\n // gsm voice <state> allows you to change the state of your GPRS connection\n if (_.values(emuMethods.GSM_VOICE_STATES).indexOf(state) === -1) {\n throw new Error(`Invalid gsm voice state param ${state}. Supported values: ${_.values(emuMethods.GSM_VOICE_STATES)}`);\n }\n await this.adbExecEmu(['gsm', 'voice', state]);\n};\n\n/**\n * Emulate network speed change event on the connected emulator.\n *\n * @param {string} speed ['full'] - One of possible NETWORK_SPEED values.\n * @throws {error} If _speed_ value is invalid.\n */\nemuMethods.networkSpeed = async function networkSpeed (speed = 'full') {\n // network speed <speed> allows you to set the network speed emulation.\n if (_.values(emuMethods.NETWORK_SPEED).indexOf(speed) === -1) {\n throw new Error(`Invalid network speed param ${speed}. Supported values: ${_.values(emuMethods.NETWORK_SPEED)}`);\n }\n await this.adbExecEmu(['network', 'speed', speed]);\n};\n\n/**\n * @typedef {Object} ExecTelnetOptions\n * @property {number} execTimeout [60000] A timeout used to wait for a server\n * reply to the given command\n * @property {number} connTimeout [5000] Console connection timeout in milliseconds\n * @property {number} initTimeout [5000] Telnet console initialization timeout\n * in milliseconds (the time between connection happens and the command prompt\n * is available)\n * @property {?number|string} port The emulator port number. The method will try to parse it\n * from the current device identifier if unset\n */\n\n/**\n * Executes a command through emulator telnet console interface and returns its output\n *\n * @param {Array<string>|string} cmd - The actual command to execute. See\n * https://developer.android.com/studio/run/emulator-console for more details\n * on available commands\n * @param {ExecTelnetOptions} opts\n * @returns {string} The command output\n * @throws {Error} If there was an error while connecting to the Telnet console\n * or if the given command returned non-OK response\n */\nemuMethods.execEmuConsoleCommand = async function execTelnet (cmd, opts = {}) {\n let port = parseInt(opts.port, 10);\n if (!port) {\n const portMatch = /emulator-(\\d+)/i.exec(this.curDeviceId);\n if (!portMatch) {\n throw new Error(`Cannot parse the console port number from the device identifier '${this.curDeviceId}'. ` +\n `Is it an emulator?`);\n }\n port = parseInt(portMatch[1], 10);\n }\n const host = '127.0.0.1';\n const {\n execTimeout = 60000,\n connTimeout = 5000,\n initTimeout = 5000,\n } = opts;\n await this.resetTelnetAuthToken();\n\n const okFlag = /^OK$/m;\n const nokFlag = /^KO\\b/m;\n const eol = '\\r\\n';\n const client = net.connect({\n host,\n port,\n });\n\n return await new B((resolve, reject) => {\n const connTimeoutObj = setTimeout(\n () => reject(new Error(`Cannot connect to the Emulator console at ${host}:${port} ` +\n `after ${connTimeout}ms`)), connTimeout);\n let execTimeoutObj;\n let initTimeoutObj;\n let isCommandSent = false;\n let serverResponse = [];\n\n client.once('error', (e) => {\n clearTimeout(connTimeoutObj);\n reject(new Error(`Cannot connect to the Emulator console at ${host}:${port}. ` +\n `Original error: ${e.message}`));\n });\n\n client.once('connect', () => {\n clearTimeout(connTimeoutObj);\n initTimeoutObj = setTimeout(\n () => reject(new Error(`Did not get the initial response from the Emulator console at ${host}:${port} ` +\n `after ${initTimeout}ms`)), initTimeout);\n });\n\n client.on('data', (chunk) => {\n serverResponse.push(chunk);\n const output = Buffer.concat(serverResponse).toString('utf8').trim();\n if (okFlag.test(output)) {\n // The initial incoming data chunk confirms the interface is ready for input\n if (!isCommandSent) {\n clearTimeout(initTimeoutObj);\n serverResponse = [];\n const cmdStr = _.isArray(cmd) ? util.quote(cmd) : `${cmd}`;\n log.debug(`Executing Emulator console command: ${cmdStr}`);\n client.write(cmdStr);\n client.write(eol);\n isCommandSent = true;\n execTimeoutObj = setTimeout(\n () => reject(new Error(`Did not get any response from the Emulator console at ${host}:${port} ` +\n `to '${cmd}' command after ${execTimeout}ms`)), execTimeout);\n return;\n }\n clearTimeout(execTimeoutObj);\n client.end();\n const outputArr = output.split(eol);\n // remove the redundant OK flag from the resulting command output\n return resolve(outputArr.slice(0, outputArr.length - 1).join('\\n').trim());\n } else if (nokFlag.test(output)) {\n clearTimeout(initTimeoutObj);\n clearTimeout(execTimeoutObj);\n client.end();\n const outputArr = output.split(eol);\n return reject(_.trim(_.last(outputArr)));\n }\n });\n });\n};\n\n/**\n * @typedef {Object} EmuVersionInfo\n * @property {?string} revision The actual revision number, for example '30.0.5'\n * @property {?number} buildId The build identifier, for example 6306047\n */\n\n/**\n * Retrieves emulator version from the file system\n *\n * @returns {EmuVersionInfo} If no version info could be parsed then an empty\n * object is returned\n */\nemuMethods.getEmuVersionInfo = async function getEmuVersionInfo () {\n const propsPath = path.join(this.sdkRoot, 'emulator', 'source.properties');\n if (!await fs.exists(propsPath)) {\n return {};\n }\n\n const content = await fs.readFile(propsPath, 'utf8');\n const revisionMatch = /^Pkg\\.Revision=([\\d.]+)$/m.exec(content);\n const result = {};\n if (revisionMatch) {\n result.revision = revisionMatch[1];\n }\n const buildIdMatch = /^Pkg\\.BuildId=(\\d+)$/m.exec(content);\n if (buildIdMatch) {\n result.buildId = parseInt(buildIdMatch[1], 10);\n }\n return result;\n};\n\n/**\n * Retrieves emulator image properties from the local file system\n *\n * @param {string} avdName Emulator name. Should NOT start with '@' character\n * @throws {Error} if there was a failure while extracting the properties\n * @returns {Object} The content of emulator image properties file.\n * Usually this configuration .ini file has the following content:\n * avd.ini.encoding=UTF-8\n * path=/Users/username/.android/avd/Pixel_XL_API_30.avd\n * path.rel=avd/Pixel_XL_API_30.avd\n * target=android-30\n */\nemuMethods.getEmuImageProperties = async function getEmuImageProperties (avdName) {\n const avds = await listEmulators();\n const avd = avds.find(({name}) => name === avdName);\n if (!avd) {\n let msg = `Cannot find '${avdName}' emulator. `;\n if (_.isEmpty(avds)) {\n msg += `No emulators have been detected on your system`;\n } else {\n msg += `Available avd names are: ${avds.map(({name}) => name)}`;\n }\n throw new Error(msg);\n }\n return ini.parse(await fs.readFile(avd.config, 'utf8'));\n};\n\n/**\n * Check if given emulator exists in the list of available avds.\n *\n * @param {string} avdName - The name of emulator to verify for existence.\n * Should NOT start with '@' character\n * @throws {Error} If the emulator with given name does not exist.\n */\nemuMethods.checkAvdExist = async function checkAvdExist (avdName) {\n const avds = await listEmulators();\n if (!avds.some(({name}) => name === avdName)) {\n let msg = `Avd '${avdName}' is not available. `;\n if (_.isEmpty(avds)) {\n msg += `No emulators have been detected on your system`;\n } else {\n msg += `Please select your avd name from one of these: '${avds.map(({name}) => name)}'`;\n }\n throw new Error(msg);\n }\n return true;\n};\n\nexport default emuMethods;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"adb-emu-commands.js","names":["_logger","_interopRequireDefault","require","_helpers","_lodash","_net","_support","_bluebird","_path","_ini","emuMethods","POWER_AC_STATES","Object","freeze","POWER_AC_ON","POWER_AC_OFF","GSM_CALL_ACTIONS","GSM_CALL","GSM_ACCEPT","GSM_CANCEL","GSM_HOLD","GSM_VOICE_STATES","GSM_VOICE_UNREGISTERED","GSM_VOICE_HOME","GSM_VOICE_ROAMING","GSM_VOICE_SEARCHING","GSM_VOICE_DENIED","GSM_VOICE_OFF","GSM_VOICE_ON","GSM_SIGNAL_STRENGTHS","NETWORK_SPEED","GSM","SCSD","GPRS","EDGE","UMTS","HSDPA","LTE","EVDO","FULL","SENSORS","ACCELERATION","GYROSCOPE","MAGNETIC_FIELD","ORIENTATION","TEMPERATURE","PROXIMITY","LIGHT","PRESSURE","HUMIDITY","MAGNETIC_FIELD_UNCALIBRATED","GYROSCOPE_UNCALIBRATED","HINGE_ANGLE0","HINGE_ANGLE1","HINGE_ANGLE2","HEART_RATE","RGBC_LIGHT","listEmulators","avdsRoot","process","env","ANDROID_AVD_HOME","dirExists","getAvdConfigPaths","log","warn","prefsRoot","getAndroidPrefsRoot","path","resolve","debug","configs","fs","glob","cwd","absolute","map","confPath","avdName","basename","split","slice","join","name","config","filter","_","trim","isEmulatorConnected","emulators","getConnectedEmulators","find","x","udid","curDeviceId","verifyEmulatorConnected","Error","fingerprint","fingerprintId","level","getApiLevel","adbExecEmu","rotate","powerAC","state","values","indexOf","TypeError","sensorSet","sensor","value","includes","isNil","powerCapacity","percent","parseInt","isNaN","powerOFF","sendSMS","phoneNumber","message","isEmpty","isInteger","gsmCall","action","gsmSignal","strength","info","gsmVoice","networkSpeed","speed","execEmuConsoleCommand","execTelnet","cmd","opts","port","portMatch","exec","host","execTimeout","connTimeout","initTimeout","resetTelnetAuthToken","okFlag","nokFlag","eol","client","net","connect","B","reject","connTimeoutObj","setTimeout","execTimeoutObj","initTimeoutObj","isCommandSent","serverResponse","once","e","clearTimeout","on","chunk","push","output","Buffer","concat","toString","test","cmdStr","isArray","util","quote","write","end","outputArr","length","last","getEmuVersionInfo","propsPath","sdkRoot","exists","content","readFile","revisionMatch","result","revision","buildIdMatch","buildId","getEmuImageProperties","avds","avd","msg","ini","parse","checkAvdExist","some","_default","exports","default"],"sources":["../../../lib/tools/adb-emu-commands.js"],"sourcesContent":["import log from '../logger.js';\nimport { getAndroidPrefsRoot, dirExists } from '../helpers';\nimport _ from 'lodash';\nimport net from 'net';\nimport { util, fs } from '@appium/support';\nimport B from 'bluebird';\nimport path from 'path';\nimport ini from 'ini';\n\nconst emuMethods = {};\nemuMethods.POWER_AC_STATES = Object.freeze({\n POWER_AC_ON: 'on',\n POWER_AC_OFF: 'off'\n});\nemuMethods.GSM_CALL_ACTIONS = Object.freeze({\n GSM_CALL: 'call',\n GSM_ACCEPT: 'accept',\n GSM_CANCEL: 'cancel',\n GSM_HOLD: 'hold'\n});\nemuMethods.GSM_VOICE_STATES = Object.freeze({\n GSM_VOICE_UNREGISTERED: 'unregistered',\n GSM_VOICE_HOME: 'home',\n GSM_VOICE_ROAMING: 'roaming',\n GSM_VOICE_SEARCHING: 'searching',\n GSM_VOICE_DENIED: 'denied',\n GSM_VOICE_OFF: 'off',\n GSM_VOICE_ON: 'on'\n});\nemuMethods.GSM_SIGNAL_STRENGTHS = [0, 1, 2, 3, 4];\n\nemuMethods.NETWORK_SPEED = Object.freeze({\n GSM: 'gsm', // GSM/CSD (up: 14.4, down: 14.4).\n SCSD: 'scsd', // HSCSD (up: 14.4, down: 57.6).\n GPRS: 'gprs', // GPRS (up: 28.8, down: 57.6).\n EDGE: 'edge', // EDGE/EGPRS (up: 473.6, down: 473.6).\n UMTS: 'umts', // UMTS/3G (up: 384.0, down: 384.0).\n HSDPA: 'hsdpa', // HSDPA (up: 5760.0, down: 13,980.0).\n LTE: 'lte', // LTE (up: 58,000, down: 173,000).\n EVDO: 'evdo', // EVDO (up: 75,000, down: 280,000).\n FULL: 'full' // No limit, the default (up: 0.0, down: 0.0).\n});\n\nemuMethods.SENSORS = Object.freeze({\n ACCELERATION: 'acceleration',\n GYROSCOPE: 'gyroscope',\n MAGNETIC_FIELD: 'magnetic-field',\n ORIENTATION: 'orientation',\n TEMPERATURE: 'temperature',\n PROXIMITY: 'proximity',\n LIGHT: 'light',\n PRESSURE: 'pressure',\n HUMIDITY: 'humidity',\n MAGNETIC_FIELD_UNCALIBRATED: 'magnetic-field-uncalibrated',\n GYROSCOPE_UNCALIBRATED: 'gyroscope-uncalibrated',\n HINGE_ANGLE0: 'hinge-angle0',\n HINGE_ANGLE1: 'hinge-angle1',\n HINGE_ANGLE2: 'hinge-angle2',\n HEART_RATE: 'heart-rate',\n RGBC_LIGHT: 'rgbc-light',\n});\n\n/**\n * @typedef {Object} EmuInfo\n * @property {string} name Emulator name, for example `Pixel_XL_API_30`\n * @property {string} config Full path to the emulator config .ini file,\n * for example `/Users/user/.android/avd/Pixel_XL_API_30.ini`\n */\n\n/**\n * Retrieves the list of available Android emulators\n *\n * @returns {Array<EmuInfo>}\n */\nasync function listEmulators () {\n let avdsRoot = process.env.ANDROID_AVD_HOME;\n if (await dirExists(avdsRoot)) {\n return await getAvdConfigPaths(avdsRoot);\n }\n\n if (avdsRoot) {\n log.warn(`The value of the ANDROID_AVD_HOME environment variable '${avdsRoot}' is not an existing directory`);\n }\n\n const prefsRoot = await getAndroidPrefsRoot();\n if (!prefsRoot) {\n return [];\n }\n\n avdsRoot = path.resolve(prefsRoot, 'avd');\n if (!await dirExists(avdsRoot)) {\n log.debug(`Virtual devices config root '${avdsRoot}' is not an existing directory`);\n return [];\n }\n\n return await getAvdConfigPaths(avdsRoot);\n}\n\n/**\n * Get configuration paths of all virtual devices\n *\n * @param {string} avdsRoot Path to the directory that contains the AVD .ini files\n * @returns {Array<EmuInfo>}\n */\nasync function getAvdConfigPaths (avdsRoot) {\n const configs = await fs.glob('*.ini', {\n cwd: avdsRoot,\n absolute: true,\n });\n return configs.map((confPath) => {\n const avdName = path.basename(confPath).split('.').slice(0, -1).join('.');\n return {name: avdName, config: confPath};\n }).filter(({name}) => _.trim(name));\n}\n\n/**\n * Check the emulator state.\n *\n * @return {boolean} True if Emulator is visible to adb.\n */\nemuMethods.isEmulatorConnected = async function isEmulatorConnected () {\n let emulators = await this.getConnectedEmulators();\n return !!_.find(emulators, (x) => x && x.udid === this.curDeviceId);\n};\n\n/**\n * Verify the emulator is connected.\n *\n * @throws {error} If Emulator is not visible to adb.\n */\nemuMethods.verifyEmulatorConnected = async function verifyEmulatorConnected () {\n if (!(await this.isEmulatorConnected())) {\n throw new Error(`The emulator \"${this.curDeviceId}\" was unexpectedly disconnected`);\n }\n};\n\n/**\n * Emulate fingerprint touch event on the connected emulator.\n *\n * @param {string} fingerprintId - The ID of the fingerprint.\n */\nemuMethods.fingerprint = async function fingerprint (fingerprintId) {\n if (!fingerprintId) {\n throw new Error('Fingerprint id parameter must be defined');\n }\n // the method used only works for API level 23 and above\n let level = await this.getApiLevel();\n if (level < 23) {\n throw new Error(`Device API Level must be >= 23. Current Api level '${level}'`);\n }\n await this.adbExecEmu(['finger', 'touch', fingerprintId]);\n};\n\n/**\n * Change the display orientation on the connected emulator.\n * The orientation is changed (PI/2 is added) every time\n * this method is called.\n */\nemuMethods.rotate = async function rotate () {\n await this.adbExecEmu(['rotate']);\n};\n\n/**\n * Emulate power state change on the connected emulator.\n *\n * @param {on|off} state ['on'] - Either 'on' or 'off'.\n */\nemuMethods.powerAC = async function powerAC (state = 'on') {\n if (_.values(emuMethods.POWER_AC_STATES).indexOf(state) === -1) {\n throw new TypeError(`Wrong power AC state sent '${state}'. `\n + `Supported values: ${_.values(emuMethods.POWER_AC_STATES)}]`);\n }\n await this.adbExecEmu(['power', 'ac', state]);\n};\n\n/**\n * Emulate sensors values on the connected emulator.\n *\n * @param {string} sensor - Sensor type declared in SENSORS items.\n * @param {number|string} value - Number to set as the sensor value.\n * @throws {TypeError} - If sensor type or sensor value is not defined\n */\nemuMethods.sensorSet = async function sensorSet (sensor, value) {\n if (!_.includes(emuMethods.SENSORS, sensor)) {\n throw new TypeError(`Unsupported sensor sent '${sensor}'. `\n + `Supported values: ${_.values(emuMethods.SENSORS)}]`);\n }\n if (_.isNil(value) || value === '') {\n throw new TypeError(`Missing/invalid sensor value argument. `\n + `You need to provide a valid value to set to the sensor in `\n + `format <value-a>[:<value-b>[:<value-c>[...]]].`);\n }\n await this.adbExecEmu(['sensor', 'set', sensor, value]);\n};\n\n/**\n * Emulate power capacity change on the connected emulator.\n *\n * @param {string|number} percent [100] - Percentage value in range [0, 100].\n */\nemuMethods.powerCapacity = async function powerCapacity (percent = 100) {\n percent = parseInt(percent, 10);\n if (isNaN(percent) || percent < 0 || percent > 100) {\n throw new TypeError(`The percentage value should be valid integer between 0 and 100`);\n }\n await this.adbExecEmu(['power', 'capacity', percent]);\n};\n\n/**\n * Emulate power off event on the connected emulator.\n */\nemuMethods.powerOFF = async function powerOFF () {\n await this.powerAC(emuMethods.POWER_AC_STATES.POWER_AC_OFF);\n await this.powerCapacity(0);\n};\n\n/**\n * Emulate send SMS event on the connected emulator.\n *\n * @param {string|number} phoneNumber - The phone number of message sender.\n * @param {string} message [''] - The message content.\n * @throws {TypeError} If phone number has invalid format.\n */\nemuMethods.sendSMS = async function sendSMS (phoneNumber, message = '') {\n if (_.isEmpty(message)) {\n throw new TypeError('SMS message must not be empty');\n }\n if (!_.isInteger(phoneNumber) && _.isEmpty(phoneNumber)) {\n throw new TypeError('Phone number most not be empty');\n }\n await this.adbExecEmu(['sms', 'send', phoneNumber, message]);\n};\n\n/**\n * Emulate GSM call event on the connected emulator.\n *\n * @param {string|number} phoneNumber - The phone number of the caller.\n * @param {call|accept|cancel|hold} action - One of available GSM call actions.\n * @throws {TypeError} If phone number has invalid format.\n * @throws {TypeError} If _action_ value is invalid.\n */\nemuMethods.gsmCall = async function gsmCall (phoneNumber, action) {\n if (!_.values(emuMethods.GSM_CALL_ACTIONS).includes(action)) {\n throw new TypeError(\n `Invalid gsm action param ${action}. Supported values: ${_.values(emuMethods.GSM_CALL_ACTIONS)}`\n );\n }\n if (!_.isInteger(phoneNumber) && _.isEmpty(phoneNumber)) {\n throw new TypeError('Phone number most not be empty');\n }\n await this.adbExecEmu(['gsm', action, phoneNumber]);\n};\n\n/**\n * Emulate GSM signal strength change event on the connected emulator.\n *\n * @param {0|1|2|3|4} strength [4] - A number in range [0, 4];\n * @throws {TypeError} If _strength_ value is invalid.\n */\nemuMethods.gsmSignal = async function gsmSignal (strength = 4) {\n strength = parseInt(strength, 10);\n if (!emuMethods.GSM_SIGNAL_STRENGTHS.includes(strength)) {\n throw new TypeError(\n `Invalid signal strength param ${strength}. Supported values: ${_.values(emuMethods.GSM_SIGNAL_STRENGTHS)}`\n );\n }\n log.info('gsm signal-profile <strength> changes the reported strength on next (15s) update.');\n await this.adbExecEmu(['gsm', 'signal-profile', strength]);\n};\n\n/**\n * Emulate GSM voice event on the connected emulator.\n *\n * @param {unregistered|home|roaming|searching|denied|on|off} state ['on'] - Either 'on' or 'off'.\n * @throws {TypeError} If _state_ value is invalid.\n */\nemuMethods.gsmVoice = async function gsmVoice (state = 'on') {\n // gsm voice <state> allows you to change the state of your GPRS connection\n if (!_.values(emuMethods.GSM_VOICE_STATES).includes(state)) {\n throw new TypeError(\n `Invalid gsm voice state param ${state}. Supported values: ${_.values(emuMethods.GSM_VOICE_STATES)}`\n );\n }\n await this.adbExecEmu(['gsm', 'voice', state]);\n};\n\n/**\n * Emulate network speed change event on the connected emulator.\n *\n * @param {gsm|scsd|gprs|edge|umts|hspda|lte|evdo|full} speed ['full'] - One of possible NETWORK_SPEED values.\n * @throws {TypeError} If _speed_ value is invalid.\n */\nemuMethods.networkSpeed = async function networkSpeed (speed = 'full') {\n // network speed <speed> allows you to set the network speed emulation.\n if (!_.values(emuMethods.NETWORK_SPEED).includes(speed)) {\n throw new Error(\n `Invalid network speed param ${speed}. Supported values: ${_.values(emuMethods.NETWORK_SPEED)}`\n );\n }\n await this.adbExecEmu(['network', 'speed', speed]);\n};\n\n/**\n * @typedef {Object} ExecTelnetOptions\n * @property {number} execTimeout [60000] A timeout used to wait for a server\n * reply to the given command\n * @property {number} connTimeout [5000] Console connection timeout in milliseconds\n * @property {number} initTimeout [5000] Telnet console initialization timeout\n * in milliseconds (the time between connection happens and the command prompt\n * is available)\n * @property {?number|string} port The emulator port number. The method will try to parse it\n * from the current device identifier if unset\n */\n\n/**\n * Executes a command through emulator telnet console interface and returns its output\n *\n * @param {Array<string>|string} cmd - The actual command to execute. See\n * https://developer.android.com/studio/run/emulator-console for more details\n * on available commands\n * @param {ExecTelnetOptions} opts\n * @returns {string} The command output\n * @throws {Error} If there was an error while connecting to the Telnet console\n * or if the given command returned non-OK response\n */\nemuMethods.execEmuConsoleCommand = async function execTelnet (cmd, opts = {}) {\n let port = parseInt(opts.port, 10);\n if (!port) {\n const portMatch = /emulator-(\\d+)/i.exec(this.curDeviceId);\n if (!portMatch) {\n throw new Error(`Cannot parse the console port number from the device identifier '${this.curDeviceId}'. ` +\n `Is it an emulator?`);\n }\n port = parseInt(portMatch[1], 10);\n }\n const host = '127.0.0.1';\n const {\n execTimeout = 60000,\n connTimeout = 5000,\n initTimeout = 5000,\n } = opts;\n await this.resetTelnetAuthToken();\n\n const okFlag = /^OK$/m;\n const nokFlag = /^KO\\b/m;\n const eol = '\\r\\n';\n const client = net.connect({\n host,\n port,\n });\n\n return await new B((resolve, reject) => {\n const connTimeoutObj = setTimeout(\n () => reject(new Error(`Cannot connect to the Emulator console at ${host}:${port} ` +\n `after ${connTimeout}ms`)), connTimeout);\n let execTimeoutObj;\n let initTimeoutObj;\n let isCommandSent = false;\n let serverResponse = [];\n\n client.once('error', (e) => {\n clearTimeout(connTimeoutObj);\n reject(new Error(`Cannot connect to the Emulator console at ${host}:${port}. ` +\n `Original error: ${e.message}`));\n });\n\n client.once('connect', () => {\n clearTimeout(connTimeoutObj);\n initTimeoutObj = setTimeout(\n () => reject(new Error(`Did not get the initial response from the Emulator console at ${host}:${port} ` +\n `after ${initTimeout}ms`)), initTimeout);\n });\n\n client.on('data', (chunk) => {\n serverResponse.push(chunk);\n const output = Buffer.concat(serverResponse).toString('utf8').trim();\n if (okFlag.test(output)) {\n // The initial incoming data chunk confirms the interface is ready for input\n if (!isCommandSent) {\n clearTimeout(initTimeoutObj);\n serverResponse = [];\n const cmdStr = _.isArray(cmd) ? util.quote(cmd) : `${cmd}`;\n log.debug(`Executing Emulator console command: ${cmdStr}`);\n client.write(cmdStr);\n client.write(eol);\n isCommandSent = true;\n execTimeoutObj = setTimeout(\n () => reject(new Error(`Did not get any response from the Emulator console at ${host}:${port} ` +\n `to '${cmd}' command after ${execTimeout}ms`)), execTimeout);\n return;\n }\n clearTimeout(execTimeoutObj);\n client.end();\n const outputArr = output.split(eol);\n // remove the redundant OK flag from the resulting command output\n return resolve(outputArr.slice(0, outputArr.length - 1).join('\\n').trim());\n } else if (nokFlag.test(output)) {\n clearTimeout(initTimeoutObj);\n clearTimeout(execTimeoutObj);\n client.end();\n const outputArr = output.split(eol);\n return reject(_.trim(_.last(outputArr)));\n }\n });\n });\n};\n\n/**\n * @typedef {Object} EmuVersionInfo\n * @property {?string} revision The actual revision number, for example '30.0.5'\n * @property {?number} buildId The build identifier, for example 6306047\n */\n\n/**\n * Retrieves emulator version from the file system\n *\n * @returns {EmuVersionInfo} If no version info could be parsed then an empty\n * object is returned\n */\nemuMethods.getEmuVersionInfo = async function getEmuVersionInfo () {\n const propsPath = path.join(this.sdkRoot, 'emulator', 'source.properties');\n if (!await fs.exists(propsPath)) {\n return {};\n }\n\n const content = await fs.readFile(propsPath, 'utf8');\n const revisionMatch = /^Pkg\\.Revision=([\\d.]+)$/m.exec(content);\n const result = {};\n if (revisionMatch) {\n result.revision = revisionMatch[1];\n }\n const buildIdMatch = /^Pkg\\.BuildId=(\\d+)$/m.exec(content);\n if (buildIdMatch) {\n result.buildId = parseInt(buildIdMatch[1], 10);\n }\n return result;\n};\n\n/**\n * Retrieves emulator image properties from the local file system\n *\n * @param {string} avdName Emulator name. Should NOT start with '@' character\n * @throws {Error} if there was a failure while extracting the properties\n * @returns {Object} The content of emulator image properties file.\n * Usually this configuration .ini file has the following content:\n * avd.ini.encoding=UTF-8\n * path=/Users/username/.android/avd/Pixel_XL_API_30.avd\n * path.rel=avd/Pixel_XL_API_30.avd\n * target=android-30\n */\nemuMethods.getEmuImageProperties = async function getEmuImageProperties (avdName) {\n const avds = await listEmulators();\n const avd = avds.find(({name}) => name === avdName);\n if (!avd) {\n let msg = `Cannot find '${avdName}' emulator. `;\n if (_.isEmpty(avds)) {\n msg += `No emulators have been detected on your system`;\n } else {\n msg += `Available avd names are: ${avds.map(({name}) => name)}`;\n }\n throw new Error(msg);\n }\n return ini.parse(await fs.readFile(avd.config, 'utf8'));\n};\n\n/**\n * Check if given emulator exists in the list of available avds.\n *\n * @param {string} avdName - The name of emulator to verify for existence.\n * Should NOT start with '@' character\n * @throws {Error} If the emulator with given name does not exist.\n */\nemuMethods.checkAvdExist = async function checkAvdExist (avdName) {\n const avds = await listEmulators();\n if (!avds.some(({name}) => name === avdName)) {\n let msg = `Avd '${avdName}' is not available. `;\n if (_.isEmpty(avds)) {\n msg += `No emulators have been detected on your system`;\n } else {\n msg += `Please select your avd name from one of these: '${avds.map(({name}) => name)}'`;\n }\n throw new Error(msg);\n }\n return true;\n};\n\nexport default emuMethods;\n"],"mappings":"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"}
|
|
@@ -7,8 +7,6 @@ import B from 'bluebird';
|
|
|
7
7
|
import path from 'path';
|
|
8
8
|
import ini from 'ini';
|
|
9
9
|
|
|
10
|
-
const PHONE_NUMBER_PATTERN = /^[+]?[(]?[0-9]*[)]?[-\s.]?[0-9]*[-\s.]?[0-9]{2,}$/im;
|
|
11
|
-
|
|
12
10
|
const emuMethods = {};
|
|
13
11
|
emuMethods.POWER_AC_STATES = Object.freeze({
|
|
14
12
|
POWER_AC_ON: 'on',
|
|
@@ -165,7 +163,7 @@ emuMethods.rotate = async function rotate () {
|
|
|
165
163
|
/**
|
|
166
164
|
* Emulate power state change on the connected emulator.
|
|
167
165
|
*
|
|
168
|
-
* @param {
|
|
166
|
+
* @param {on|off} state ['on'] - Either 'on' or 'off'.
|
|
169
167
|
*/
|
|
170
168
|
emuMethods.powerAC = async function powerAC (state = 'on') {
|
|
171
169
|
if (_.values(emuMethods.POWER_AC_STATES).indexOf(state) === -1) {
|
|
@@ -180,7 +178,7 @@ emuMethods.powerAC = async function powerAC (state = 'on') {
|
|
|
180
178
|
*
|
|
181
179
|
* @param {string} sensor - Sensor type declared in SENSORS items.
|
|
182
180
|
* @param {number|string} value - Number to set as the sensor value.
|
|
183
|
-
* @throws {
|
|
181
|
+
* @throws {TypeError} - If sensor type or sensor value is not defined
|
|
184
182
|
*/
|
|
185
183
|
emuMethods.sensorSet = async function sensorSet (sensor, value) {
|
|
186
184
|
if (!_.includes(emuMethods.SENSORS, sensor)) {
|
|
@@ -203,7 +201,7 @@ emuMethods.sensorSet = async function sensorSet (sensor, value) {
|
|
|
203
201
|
emuMethods.powerCapacity = async function powerCapacity (percent = 100) {
|
|
204
202
|
percent = parseInt(percent, 10);
|
|
205
203
|
if (isNaN(percent) || percent < 0 || percent > 100) {
|
|
206
|
-
throw new
|
|
204
|
+
throw new TypeError(`The percentage value should be valid integer between 0 and 100`);
|
|
207
205
|
}
|
|
208
206
|
await this.adbExecEmu(['power', 'capacity', percent]);
|
|
209
207
|
};
|
|
@@ -221,16 +219,14 @@ emuMethods.powerOFF = async function powerOFF () {
|
|
|
221
219
|
*
|
|
222
220
|
* @param {string|number} phoneNumber - The phone number of message sender.
|
|
223
221
|
* @param {string} message [''] - The message content.
|
|
224
|
-
* @throws {
|
|
222
|
+
* @throws {TypeError} If phone number has invalid format.
|
|
225
223
|
*/
|
|
226
224
|
emuMethods.sendSMS = async function sendSMS (phoneNumber, message = '') {
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
throw new Error('Sending an SMS requires a message');
|
|
225
|
+
if (_.isEmpty(message)) {
|
|
226
|
+
throw new TypeError('SMS message must not be empty');
|
|
230
227
|
}
|
|
231
|
-
phoneNumber
|
|
232
|
-
|
|
233
|
-
throw new Error(`Invalid sendSMS phoneNumber param ${phoneNumber}`);
|
|
228
|
+
if (!_.isInteger(phoneNumber) && _.isEmpty(phoneNumber)) {
|
|
229
|
+
throw new TypeError('Phone number most not be empty');
|
|
234
230
|
}
|
|
235
231
|
await this.adbExecEmu(['sms', 'send', phoneNumber, message]);
|
|
236
232
|
};
|
|
@@ -239,17 +235,18 @@ emuMethods.sendSMS = async function sendSMS (phoneNumber, message = '') {
|
|
|
239
235
|
* Emulate GSM call event on the connected emulator.
|
|
240
236
|
*
|
|
241
237
|
* @param {string|number} phoneNumber - The phone number of the caller.
|
|
242
|
-
* @param {
|
|
243
|
-
* @throws {
|
|
244
|
-
* @throws {
|
|
238
|
+
* @param {call|accept|cancel|hold} action - One of available GSM call actions.
|
|
239
|
+
* @throws {TypeError} If phone number has invalid format.
|
|
240
|
+
* @throws {TypeError} If _action_ value is invalid.
|
|
245
241
|
*/
|
|
246
|
-
emuMethods.gsmCall = async function gsmCall (phoneNumber, action
|
|
247
|
-
if (_.values(emuMethods.GSM_CALL_ACTIONS).
|
|
248
|
-
throw new
|
|
242
|
+
emuMethods.gsmCall = async function gsmCall (phoneNumber, action) {
|
|
243
|
+
if (!_.values(emuMethods.GSM_CALL_ACTIONS).includes(action)) {
|
|
244
|
+
throw new TypeError(
|
|
245
|
+
`Invalid gsm action param ${action}. Supported values: ${_.values(emuMethods.GSM_CALL_ACTIONS)}`
|
|
246
|
+
);
|
|
249
247
|
}
|
|
250
|
-
phoneNumber
|
|
251
|
-
|
|
252
|
-
throw new Error(`Invalid gsmCall phoneNumber param ${phoneNumber}`);
|
|
248
|
+
if (!_.isInteger(phoneNumber) && _.isEmpty(phoneNumber)) {
|
|
249
|
+
throw new TypeError('Phone number most not be empty');
|
|
253
250
|
}
|
|
254
251
|
await this.adbExecEmu(['gsm', action, phoneNumber]);
|
|
255
252
|
};
|
|
@@ -257,13 +254,15 @@ emuMethods.gsmCall = async function gsmCall (phoneNumber, action = '') {
|
|
|
257
254
|
/**
|
|
258
255
|
* Emulate GSM signal strength change event on the connected emulator.
|
|
259
256
|
*
|
|
260
|
-
* @param {
|
|
261
|
-
* @throws {
|
|
257
|
+
* @param {0|1|2|3|4} strength [4] - A number in range [0, 4];
|
|
258
|
+
* @throws {TypeError} If _strength_ value is invalid.
|
|
262
259
|
*/
|
|
263
260
|
emuMethods.gsmSignal = async function gsmSignal (strength = 4) {
|
|
264
261
|
strength = parseInt(strength, 10);
|
|
265
|
-
if (emuMethods.GSM_SIGNAL_STRENGTHS.
|
|
266
|
-
throw new
|
|
262
|
+
if (!emuMethods.GSM_SIGNAL_STRENGTHS.includes(strength)) {
|
|
263
|
+
throw new TypeError(
|
|
264
|
+
`Invalid signal strength param ${strength}. Supported values: ${_.values(emuMethods.GSM_SIGNAL_STRENGTHS)}`
|
|
265
|
+
);
|
|
267
266
|
}
|
|
268
267
|
log.info('gsm signal-profile <strength> changes the reported strength on next (15s) update.');
|
|
269
268
|
await this.adbExecEmu(['gsm', 'signal-profile', strength]);
|
|
@@ -272,13 +271,15 @@ emuMethods.gsmSignal = async function gsmSignal (strength = 4) {
|
|
|
272
271
|
/**
|
|
273
272
|
* Emulate GSM voice event on the connected emulator.
|
|
274
273
|
*
|
|
275
|
-
* @param {
|
|
276
|
-
* @throws {
|
|
274
|
+
* @param {unregistered|home|roaming|searching|denied|on|off} state ['on'] - Either 'on' or 'off'.
|
|
275
|
+
* @throws {TypeError} If _state_ value is invalid.
|
|
277
276
|
*/
|
|
278
277
|
emuMethods.gsmVoice = async function gsmVoice (state = 'on') {
|
|
279
278
|
// gsm voice <state> allows you to change the state of your GPRS connection
|
|
280
|
-
if (_.values(emuMethods.GSM_VOICE_STATES).
|
|
281
|
-
throw new
|
|
279
|
+
if (!_.values(emuMethods.GSM_VOICE_STATES).includes(state)) {
|
|
280
|
+
throw new TypeError(
|
|
281
|
+
`Invalid gsm voice state param ${state}. Supported values: ${_.values(emuMethods.GSM_VOICE_STATES)}`
|
|
282
|
+
);
|
|
282
283
|
}
|
|
283
284
|
await this.adbExecEmu(['gsm', 'voice', state]);
|
|
284
285
|
};
|
|
@@ -286,13 +287,15 @@ emuMethods.gsmVoice = async function gsmVoice (state = 'on') {
|
|
|
286
287
|
/**
|
|
287
288
|
* Emulate network speed change event on the connected emulator.
|
|
288
289
|
*
|
|
289
|
-
* @param {
|
|
290
|
-
* @throws {
|
|
290
|
+
* @param {gsm|scsd|gprs|edge|umts|hspda|lte|evdo|full} speed ['full'] - One of possible NETWORK_SPEED values.
|
|
291
|
+
* @throws {TypeError} If _speed_ value is invalid.
|
|
291
292
|
*/
|
|
292
293
|
emuMethods.networkSpeed = async function networkSpeed (speed = 'full') {
|
|
293
294
|
// network speed <speed> allows you to set the network speed emulation.
|
|
294
|
-
if (_.values(emuMethods.NETWORK_SPEED).
|
|
295
|
-
throw new Error(
|
|
295
|
+
if (!_.values(emuMethods.NETWORK_SPEED).includes(speed)) {
|
|
296
|
+
throw new Error(
|
|
297
|
+
`Invalid network speed param ${speed}. Supported values: ${_.values(emuMethods.NETWORK_SPEED)}`
|
|
298
|
+
);
|
|
296
299
|
}
|
|
297
300
|
await this.adbExecEmu(['network', 'speed', speed]);
|
|
298
301
|
};
|