appium-android-driver 5.10.4 → 5.11.0
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 +7 -0
- package/build/lib/commands/actions.js +52 -1
- package/build/lib/commands/actions.js.map +1 -1
- package/build/lib/utils.js +1 -1
- package/build/lib/utils.js.map +1 -1
- package/lib/commands/actions.js +135 -0
- package/lib/utils.js +4 -3
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
## [5.11.0](https://github.com/appium/appium-android-driver/compare/v5.10.4...v5.11.0) (2023-04-28)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* Add mobile wrapper for emulator helper functions ([#805](https://github.com/appium/appium-android-driver/issues/805)) ([59197f9](https://github.com/appium/appium-android-driver/commit/59197f93e3b46e756a379159e97735f103613a8f))
|
|
7
|
+
|
|
1
8
|
## [5.10.4](https://github.com/appium/appium-android-driver/compare/v5.10.3...v5.10.4) (2023-04-20)
|
|
2
9
|
|
|
3
10
|
|
|
@@ -12,6 +12,7 @@ var _path = _interopRequireDefault(require("path"));
|
|
|
12
12
|
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
13
13
|
var _jimp = _interopRequireDefault(require("jimp"));
|
|
14
14
|
var _teen_process = require("teen_process");
|
|
15
|
+
var _utils = require("../utils");
|
|
15
16
|
const swipeStepsPerSec = 28;
|
|
16
17
|
const dragStepsPerSec = 40;
|
|
17
18
|
let commands = {},
|
|
@@ -165,48 +166,98 @@ commands.fingerprint = async function fingerprint(fingerprintId) {
|
|
|
165
166
|
}
|
|
166
167
|
await this.adb.fingerprint(fingerprintId);
|
|
167
168
|
};
|
|
169
|
+
commands.mobileFingerprint = async function mobileFingerprint(opts = {}) {
|
|
170
|
+
const {
|
|
171
|
+
fingerprintId
|
|
172
|
+
} = (0, _utils.requireArgs)('fingerprintId', opts);
|
|
173
|
+
await this.fingerprint(fingerprintId);
|
|
174
|
+
};
|
|
168
175
|
commands.sendSMS = async function sendSMS(phoneNumber, message) {
|
|
169
176
|
if (!this.isEmulator()) {
|
|
170
177
|
this.log.errorAndThrow('sendSMS method is only available for emulators');
|
|
171
178
|
}
|
|
172
179
|
await this.adb.sendSMS(phoneNumber, message);
|
|
173
180
|
};
|
|
181
|
+
commands.mobileSendSms = async function mobileSendSms(opts = {}) {
|
|
182
|
+
const {
|
|
183
|
+
phoneNumber,
|
|
184
|
+
message
|
|
185
|
+
} = (0, _utils.requireArgs)(['phoneNumber', 'message'], opts);
|
|
186
|
+
await this.sendSMS(phoneNumber, message);
|
|
187
|
+
};
|
|
174
188
|
commands.gsmCall = async function gsmCall(phoneNumber, action) {
|
|
175
189
|
if (!this.isEmulator()) {
|
|
176
190
|
this.log.errorAndThrow('gsmCall method is only available for emulators');
|
|
177
191
|
}
|
|
178
192
|
await this.adb.gsmCall(phoneNumber, action);
|
|
179
193
|
};
|
|
194
|
+
commands.mobileGsmCall = async function mobileGsmCall(opts = {}) {
|
|
195
|
+
const {
|
|
196
|
+
phoneNumber,
|
|
197
|
+
action
|
|
198
|
+
} = (0, _utils.requireArgs)(['phoneNumber', 'action'], opts);
|
|
199
|
+
await this.gsmCall(phoneNumber, action);
|
|
200
|
+
};
|
|
180
201
|
commands.gsmSignal = async function gsmSignal(signalStrengh) {
|
|
181
202
|
if (!this.isEmulator()) {
|
|
182
203
|
this.log.errorAndThrow('gsmSignal method is only available for emulators');
|
|
183
204
|
}
|
|
184
205
|
await this.adb.gsmSignal(signalStrengh);
|
|
185
206
|
};
|
|
207
|
+
commands.mobileGsmSignal = async function mobileGsmSignal(opts = {}) {
|
|
208
|
+
const {
|
|
209
|
+
strength
|
|
210
|
+
} = (0, _utils.requireArgs)('strength', opts);
|
|
211
|
+
await this.gsmSignal(strength);
|
|
212
|
+
};
|
|
186
213
|
commands.gsmVoice = async function gsmVoice(state) {
|
|
187
214
|
if (!this.isEmulator()) {
|
|
188
215
|
this.log.errorAndThrow('gsmVoice method is only available for emulators');
|
|
189
216
|
}
|
|
190
217
|
await this.adb.gsmVoice(state);
|
|
191
218
|
};
|
|
219
|
+
commands.mobileGsmVoice = async function mobileGsmVoice(opts = {}) {
|
|
220
|
+
const {
|
|
221
|
+
state
|
|
222
|
+
} = (0, _utils.requireArgs)('state', opts);
|
|
223
|
+
await this.gsmVoice(state);
|
|
224
|
+
};
|
|
192
225
|
commands.powerAC = async function powerAC(state) {
|
|
193
226
|
if (!this.isEmulator()) {
|
|
194
227
|
this.log.errorAndThrow('powerAC method is only available for emulators');
|
|
195
228
|
}
|
|
196
229
|
await this.adb.powerAC(state);
|
|
197
230
|
};
|
|
231
|
+
commands.mobilePowerAc = async function mobilePowerAc(opts = {}) {
|
|
232
|
+
const {
|
|
233
|
+
state
|
|
234
|
+
} = (0, _utils.requireArgs)('state', opts);
|
|
235
|
+
await this.powerAC(state);
|
|
236
|
+
};
|
|
198
237
|
commands.powerCapacity = async function powerCapacity(batteryPercent) {
|
|
199
238
|
if (!this.isEmulator()) {
|
|
200
239
|
this.log.errorAndThrow('powerCapacity method is only available for emulators');
|
|
201
240
|
}
|
|
202
241
|
await this.adb.powerCapacity(batteryPercent);
|
|
203
242
|
};
|
|
243
|
+
commands.mobilePowerCapacity = async function mobilePowerCapacity(opts = {}) {
|
|
244
|
+
const {
|
|
245
|
+
percent
|
|
246
|
+
} = (0, _utils.requireArgs)('percent', opts);
|
|
247
|
+
await this.powerCapacity(percent);
|
|
248
|
+
};
|
|
204
249
|
commands.networkSpeed = async function networkSpeed(networkSpeed) {
|
|
205
250
|
if (!this.isEmulator()) {
|
|
206
251
|
this.log.errorAndThrow('networkSpeed method is only available for emulators');
|
|
207
252
|
}
|
|
208
253
|
await this.adb.networkSpeed(networkSpeed);
|
|
209
254
|
};
|
|
255
|
+
commands.mobileNetworkSpeed = async function mobileNetworkSpeed(opts = {}) {
|
|
256
|
+
const {
|
|
257
|
+
speed
|
|
258
|
+
} = (0, _utils.requireArgs)('speed', opts);
|
|
259
|
+
await this.networkSpeed(speed);
|
|
260
|
+
};
|
|
210
261
|
commands.sensorSet = async function sensorSet(sensor = {}) {
|
|
211
262
|
const {
|
|
212
263
|
sensorType,
|
|
@@ -299,4 +350,4 @@ commands.getScreenshot = async function getScreenshot() {
|
|
|
299
350
|
Object.assign(extensions, commands, helpers);
|
|
300
351
|
var _default = extensions;
|
|
301
352
|
exports.default = _default;
|
|
302
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYW5kcm9pZEhlbHBlcnMiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9zdXBwb3J0IiwiX3BhdGgiLCJfYmx1ZWJpcmQiLCJfamltcCIsIl90ZWVuX3Byb2Nlc3MiLCJzd2lwZVN0ZXBzUGVyU2VjIiwiZHJhZ1N0ZXBzUGVyU2VjIiwiY29tbWFuZHMiLCJoZWxwZXJzIiwiZXh0ZW5zaW9ucyIsImV4cG9ydHMiLCJrZXlldmVudCIsImtleWNvZGUiLCJtZXRhc3RhdGUiLCJsb2ciLCJ3YXJuIiwicHJlc3NLZXlDb2RlIiwiYm9vdHN0cmFwIiwic2VuZEFjdGlvbiIsImxvbmdQcmVzc0tleUNvZGUiLCJnZXRPcmllbnRhdGlvbiIsInBhcmFtcyIsIm5hdHVyYWxPcmllbnRhdGlvbiIsIm9wdHMiLCJhbmRyb2lkTmF0dXJhbE9yaWVudGF0aW9uIiwib3JpZW50YXRpb24iLCJ0b1VwcGVyQ2FzZSIsInNldE9yaWVudGF0aW9uIiwiZmFrZUZsaWNrIiwieFNwZWVkIiwieVNwZWVkIiwiZmFrZUZsaWNrRWxlbWVudCIsImVsZW1lbnRJZCIsInhvZmZzZXQiLCJ5b2Zmc2V0Iiwic3BlZWQiLCJzd2lwZSIsInN0YXJ0WCIsInN0YXJ0WSIsImVuZFgiLCJlbmRZIiwiZHVyYXRpb24iLCJ0b3VjaENvdW50IiwiZWxJZCIsInN3aXBlT3B0cyIsInN0ZXBzIiwiTWF0aCIsInJvdW5kIiwidXRpbCIsImhhc1ZhbHVlIiwiZG9Td2lwZSIsInBpbmNoQ2xvc2UiLCJwZXJjZW50IiwicGluY2hPcHRzIiwiZGlyZWN0aW9uIiwicGluY2hPcGVuIiwiZmxpY2siLCJlbGVtZW50IiwieE9mZnNldCIsInlPZmZzZXQiLCJkcmFnIiwiZGVzdEVsSWQiLCJkcmFnT3B0cyIsImRvRHJhZyIsImxvY2siLCJzZWNvbmRzIiwiYWRiIiwiaXNOYU4iLCJmbG9hdFNlY29uZHMiLCJwYXJzZUZsb2F0IiwiQiIsImRlbGF5IiwidW5sb2NrIiwiaXNMb2NrZWQiLCJpc1NjcmVlbkxvY2tlZCIsImFuZHJvaWRIZWxwZXJzIiwiY2FwcyIsIm9wZW5Ob3RpZmljYXRpb25zIiwic2V0TG9jYXRpb24iLCJsYXRpdHVkZSIsImxvbmdpdHVkZSIsInNlbmRUZWxuZXRDb21tYW5kIiwiZmluZ2VycHJpbnQiLCJmaW5nZXJwcmludElkIiwiaXNFbXVsYXRvciIsImVycm9yQW5kVGhyb3ciLCJzZW5kU01TIiwicGhvbmVOdW1iZXIiLCJtZXNzYWdlIiwiZ3NtQ2FsbCIsImFjdGlvbiIsImdzbVNpZ25hbCIsInNpZ25hbFN0cmVuZ2giLCJnc21Wb2ljZSIsInN0YXRlIiwicG93ZXJBQyIsInBvd2VyQ2FwYWNpdHkiLCJiYXR0ZXJ5UGVyY2VudCIsIm5ldHdvcmtTcGVlZCIsInNlbnNvclNldCIsInNlbnNvciIsInNlbnNvclR5cGUiLCJ2YWx1ZSIsImdldFNjcmVlbnNob3REYXRhV2l0aEFkYlNoZWxsIiwibG9jYWxGaWxlIiwidGVtcERpciIsInBhdGgiLCJwcmVmaXgiLCJzdWZmaXgiLCJmcyIsImV4aXN0cyIsInVubGluayIsInBuZ0RpciIsImFuZHJvaWRTY3JlZW5zaG90UGF0aCIsInBuZyIsInBvc2l4IiwicmVzb2x2ZSIsImNtZCIsInNoZWxsIiwiZmlsZVNpemUiLCJFcnJvciIsInB1bGwiLCJqaW1wIiwicmVhZCIsImdldFNjcmVlbnNob3REYXRhV2l0aEFkYkV4ZWNPdXQiLCJzdGRvdXQiLCJzdGRlcnIiLCJjb2RlIiwiZXhlYyIsImV4ZWN1dGFibGUiLCJkZWZhdWx0QXJncyIsImNvbmNhdCIsImVuY29kaW5nIiwiaXNCdWZmZXIiLCJsZW5ndGgiLCJ0b1N0cmluZyIsImdldFNjcmVlbnNob3QiLCJhcGlMZXZlbCIsImdldEFwaUxldmVsIiwiaW1hZ2UiLCJlIiwiaW5mbyIsImVyciIsInNjcmVlbk9yaWVudGF0aW9uIiwiZ2V0U2NyZWVuT3JpZW50YXRpb24iLCJyb3RhdGUiLCJnZXRCdWZmZXIiLCJwcm9taXNpZnkiLCJjb250ZXh0IiwiaW1nQnVmZmVyIiwiTUlNRV9QTkciLCJPYmplY3QiLCJhc3NpZ24iLCJfZGVmYXVsdCIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvYWN0aW9ucy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYW5kcm9pZEhlbHBlcnMgZnJvbSAnLi4vYW5kcm9pZC1oZWxwZXJzJztcbmltcG9ydCB7IGZzLCB1dGlsLCB0ZW1wRGlyfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgamltcCBmcm9tICdqaW1wJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuXG5jb25zdCBzd2lwZVN0ZXBzUGVyU2VjID0gMjg7XG5jb25zdCBkcmFnU3RlcHNQZXJTZWMgPSA0MDtcblxubGV0IGNvbW1hbmRzID0ge30sIGhlbHBlcnMgPSB7fSwgZXh0ZW5zaW9ucyA9IHt9O1xuXG5jb21tYW5kcy5rZXlldmVudCA9IGFzeW5jIGZ1bmN0aW9uIGtleWV2ZW50IChrZXljb2RlLCBtZXRhc3RhdGUgPSBudWxsKSB7XG4gIC8vIFRPRE8gZGVwcmVjYXRlIGtleWV2ZW50OyBjdXJyZW50bHkgd2Qgb25seSBpbXBsZW1lbnRzIGtleWV2ZW50XG4gIHRoaXMubG9nLndhcm4oJ2tleWV2ZW50IHdpbGwgYmUgZGVwcmVjYXRlZCB1c2UgcHJlc3NLZXlDb2RlJyk7XG4gIHJldHVybiBhd2FpdCB0aGlzLnByZXNzS2V5Q29kZShrZXljb2RlLCBtZXRhc3RhdGUpO1xufTtcblxuY29tbWFuZHMucHJlc3NLZXlDb2RlID0gYXN5bmMgZnVuY3Rpb24gcHJlc3NLZXlDb2RlIChrZXljb2RlLCBtZXRhc3RhdGUgPSBudWxsKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdwcmVzc0tleUNvZGUnLCB7a2V5Y29kZSwgbWV0YXN0YXRlfSk7XG59O1xuXG5jb21tYW5kcy5sb25nUHJlc3NLZXlDb2RlID0gYXN5bmMgZnVuY3Rpb24gbG9uZ1ByZXNzS2V5Q29kZSAoa2V5Y29kZSwgbWV0YXN0YXRlID0gbnVsbCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignbG9uZ1ByZXNzS2V5Q29kZScsIHtrZXljb2RlLCBtZXRhc3RhdGV9KTtcbn07XG5cbmNvbW1hbmRzLmdldE9yaWVudGF0aW9uID0gYXN5bmMgZnVuY3Rpb24gZ2V0T3JpZW50YXRpb24gKCkge1xuICBsZXQgcGFyYW1zID0ge1xuICAgIG5hdHVyYWxPcmllbnRhdGlvbjogISF0aGlzLm9wdHMuYW5kcm9pZE5hdHVyYWxPcmllbnRhdGlvbixcbiAgfTtcbiAgbGV0IG9yaWVudGF0aW9uID0gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignb3JpZW50YXRpb24nLCBwYXJhbXMpO1xuICByZXR1cm4gb3JpZW50YXRpb24udG9VcHBlckNhc2UoKTtcbn07XG5cbmNvbW1hbmRzLnNldE9yaWVudGF0aW9uID0gYXN5bmMgZnVuY3Rpb24gc2V0T3JpZW50YXRpb24gKG9yaWVudGF0aW9uKSB7XG4gIG9yaWVudGF0aW9uID0gb3JpZW50YXRpb24udG9VcHBlckNhc2UoKTtcbiAgbGV0IHBhcmFtcyA9IHtcbiAgICBvcmllbnRhdGlvbixcbiAgICBuYXR1cmFsT3JpZW50YXRpb246ICEhdGhpcy5vcHRzLmFuZHJvaWROYXR1cmFsT3JpZW50YXRpb24sXG4gIH07XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdvcmllbnRhdGlvbicsIHBhcmFtcyk7XG59O1xuXG5jb21tYW5kcy5mYWtlRmxpY2sgPSBhc3luYyBmdW5jdGlvbiBmYWtlRmxpY2sgKHhTcGVlZCwgeVNwZWVkKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdmbGljaycsIHt4U3BlZWQsIHlTcGVlZH0pO1xufTtcblxuY29tbWFuZHMuZmFrZUZsaWNrRWxlbWVudCA9IGFzeW5jIGZ1bmN0aW9uIGZha2VGbGlja0VsZW1lbnQgKGVsZW1lbnRJZCwgeG9mZnNldCwgeW9mZnNldCwgc3BlZWQpIHtcbiAgbGV0IHBhcmFtcyA9IHt4b2Zmc2V0LCB5b2Zmc2V0LCBzcGVlZCwgZWxlbWVudElkfTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2VsZW1lbnQ6ZmxpY2snLCBwYXJhbXMpO1xufTtcblxuY29tbWFuZHMuc3dpcGUgPSBhc3luYyBmdW5jdGlvbiBzd2lwZSAoc3RhcnRYLCBzdGFydFksIGVuZFgsIGVuZFksIGR1cmF0aW9uLCB0b3VjaENvdW50LCBlbElkKSB7XG4gIGlmIChzdGFydFggPT09ICdudWxsJykge1xuICAgIHN0YXJ0WCA9IDAuNTtcbiAgfVxuICBpZiAoc3RhcnRZID09PSAnbnVsbCcpIHtcbiAgICBzdGFydFkgPSAwLjU7XG4gIH1cbiAgbGV0IHN3aXBlT3B0cyA9IHtzdGFydFgsIHN0YXJ0WSwgZW5kWCwgZW5kWSxcbiAgICAgICAgICAgICAgICAgICBzdGVwczogTWF0aC5yb3VuZChkdXJhdGlvbiAqIHN3aXBlU3RlcHNQZXJTZWMpfTtcbiAgLy8gZ29pbmcgdGhlIGxvbmcgd2F5IGFuZCBjaGVja2luZyBmb3IgdW5kZWZpbmVkIGFuZCBudWxsIHNpbmNlXG4gIC8vIHdlIGNhbid0IGJlIGFzc3VyZWQgYGVsSWRgIGlzIGEgc3RyaW5nIGFuZCBub3QgYW4gaW50XG4gIGlmICh1dGlsLmhhc1ZhbHVlKGVsSWQpKSB7XG4gICAgc3dpcGVPcHRzLmVsZW1lbnRJZCA9IGVsSWQ7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IHRoaXMuZG9Td2lwZShzd2lwZU9wdHMpO1xufTtcblxuY29tbWFuZHMuZG9Td2lwZSA9IGFzeW5jIGZ1bmN0aW9uIGRvU3dpcGUgKHN3aXBlT3B0cykge1xuICBpZiAodXRpbC5oYXNWYWx1ZShzd2lwZU9wdHMuZWxlbWVudElkKSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdlbGVtZW50OnN3aXBlJywgc3dpcGVPcHRzKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignc3dpcGUnLCBzd2lwZU9wdHMpO1xuICB9XG59O1xuXG5jb21tYW5kcy5waW5jaENsb3NlID0gYXN5bmMgZnVuY3Rpb24gcGluY2hDbG9zZSAoc3RhcnRYLCBzdGFydFksIGVuZFgsIGVuZFksIGR1cmF0aW9uLCBwZXJjZW50LCBzdGVwcywgZWxJZCkge1xuICBsZXQgcGluY2hPcHRzID0ge1xuICAgIGRpcmVjdGlvbjogJ2luJyxcbiAgICBlbGVtZW50SWQ6IGVsSWQsXG4gICAgcGVyY2VudCxcbiAgICBzdGVwc1xuICB9O1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignZWxlbWVudDpwaW5jaCcsIHBpbmNoT3B0cyk7XG59O1xuXG5jb21tYW5kcy5waW5jaE9wZW4gPSBhc3luYyBmdW5jdGlvbiBwaW5jaE9wZW4gKHN0YXJ0WCwgc3RhcnRZLCBlbmRYLCBlbmRZLCBkdXJhdGlvbiwgcGVyY2VudCwgc3RlcHMsIGVsSWQpIHtcbiAgbGV0IHBpbmNoT3B0cyA9IHtkaXJlY3Rpb246ICdvdXQnLCBlbGVtZW50SWQ6IGVsSWQsIHBlcmNlbnQsIHN0ZXBzfTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2VsZW1lbnQ6cGluY2gnLCBwaW5jaE9wdHMpO1xufTtcblxuY29tbWFuZHMuZmxpY2sgPSBhc3luYyBmdW5jdGlvbiBmbGljayAoZWxlbWVudCwgeFNwZWVkLCB5U3BlZWQsIHhPZmZzZXQsIHlPZmZzZXQsIHNwZWVkKSB7XG4gIGlmIChlbGVtZW50KSB7XG4gICAgYXdhaXQgdGhpcy5mYWtlRmxpY2tFbGVtZW50KGVsZW1lbnQsIHhPZmZzZXQsIHlPZmZzZXQsIHNwZWVkKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCB0aGlzLmZha2VGbGljayh4U3BlZWQsIHlTcGVlZCk7XG4gIH1cbn07XG5cbmNvbW1hbmRzLmRyYWcgPSBhc3luYyBmdW5jdGlvbiBkcmFnIChzdGFydFgsIHN0YXJ0WSwgZW5kWCwgZW5kWSwgZHVyYXRpb24sIHRvdWNoQ291bnQsIGVsZW1lbnRJZCwgZGVzdEVsSWQpIHtcbiAgbGV0IGRyYWdPcHRzID0ge1xuICAgIGVsZW1lbnRJZCwgZGVzdEVsSWQsIHN0YXJ0WCwgc3RhcnRZLCBlbmRYLCBlbmRZLFxuICAgIHN0ZXBzOiBNYXRoLnJvdW5kKGR1cmF0aW9uICogZHJhZ1N0ZXBzUGVyU2VjKVxuICB9O1xuICByZXR1cm4gYXdhaXQgdGhpcy5kb0RyYWcoZHJhZ09wdHMpO1xuXG59O1xuXG5jb21tYW5kcy5kb0RyYWcgPSBhc3luYyBmdW5jdGlvbiBkb0RyYWcgKGRyYWdPcHRzKSB7XG4gIGlmICh1dGlsLmhhc1ZhbHVlKGRyYWdPcHRzLmVsZW1lbnRJZCkpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignZWxlbWVudDpkcmFnJywgZHJhZ09wdHMpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdkcmFnJywgZHJhZ09wdHMpO1xuICB9XG59O1xuXG5jb21tYW5kcy5sb2NrID0gYXN5bmMgZnVuY3Rpb24gbG9jayAoc2Vjb25kcykge1xuICBhd2FpdCB0aGlzLmFkYi5sb2NrKCk7XG4gIGlmIChpc05hTihzZWNvbmRzKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGZsb2F0U2Vjb25kcyA9IHBhcnNlRmxvYXQoc2Vjb25kcyk7XG4gIGlmIChmbG9hdFNlY29uZHMgPD0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICBhd2FpdCBCLmRlbGF5KDEwMDAgKiBmbG9hdFNlY29uZHMpO1xuICBhd2FpdCB0aGlzLnVubG9jaygpO1xufTtcblxuY29tbWFuZHMuaXNMb2NrZWQgPSBhc3luYyBmdW5jdGlvbiBpc0xvY2tlZCAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5pc1NjcmVlbkxvY2tlZCgpO1xufTtcblxuY29tbWFuZHMudW5sb2NrID0gYXN5bmMgZnVuY3Rpb24gdW5sb2NrICgpIHtcbiAgcmV0dXJuIGF3YWl0IGFuZHJvaWRIZWxwZXJzLnVubG9jayh0aGlzLCB0aGlzLmFkYiwgdGhpcy5jYXBzKTtcbn07XG5cbmNvbW1hbmRzLm9wZW5Ob3RpZmljYXRpb25zID0gYXN5bmMgZnVuY3Rpb24gb3Blbk5vdGlmaWNhdGlvbnMgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignb3Blbk5vdGlmaWNhdGlvbicpO1xufTtcblxuY29tbWFuZHMuc2V0TG9jYXRpb24gPSBhc3luYyBmdW5jdGlvbiBzZXRMb2NhdGlvbiAobGF0aXR1ZGUsIGxvbmdpdHVkZSkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIuc2VuZFRlbG5ldENvbW1hbmQoYGdlbyBmaXggJHtsb25naXR1ZGV9ICR7bGF0aXR1ZGV9YCk7XG59O1xuXG5jb21tYW5kcy5maW5nZXJwcmludCA9IGFzeW5jIGZ1bmN0aW9uIGZpbmdlcnByaW50IChmaW5nZXJwcmludElkKSB7XG4gIGlmICghdGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdmaW5nZXJwcmludCBtZXRob2QgaXMgb25seSBhdmFpbGFibGUgZm9yIGVtdWxhdG9ycycpO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiLmZpbmdlcnByaW50KGZpbmdlcnByaW50SWQpO1xufTtcblxuY29tbWFuZHMuc2VuZFNNUyA9IGFzeW5jIGZ1bmN0aW9uIHNlbmRTTVMgKHBob25lTnVtYmVyLCBtZXNzYWdlKSB7XG4gIGlmICghdGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdzZW5kU01TIG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzJyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGIuc2VuZFNNUyhwaG9uZU51bWJlciwgbWVzc2FnZSk7XG59O1xuXG5jb21tYW5kcy5nc21DYWxsID0gYXN5bmMgZnVuY3Rpb24gZ3NtQ2FsbCAocGhvbmVOdW1iZXIsIGFjdGlvbikge1xuICBpZiAoIXRoaXMuaXNFbXVsYXRvcigpKSB7XG4gICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnZ3NtQ2FsbCBtZXRob2QgaXMgb25seSBhdmFpbGFibGUgZm9yIGVtdWxhdG9ycycpO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiLmdzbUNhbGwocGhvbmVOdW1iZXIsIGFjdGlvbik7XG59O1xuXG5jb21tYW5kcy5nc21TaWduYWwgPSBhc3luYyBmdW5jdGlvbiBnc21TaWduYWwgKHNpZ25hbFN0cmVuZ2gpIHtcbiAgaWYgKCF0aGlzLmlzRW11bGF0b3IoKSkge1xuICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ2dzbVNpZ25hbCBtZXRob2QgaXMgb25seSBhdmFpbGFibGUgZm9yIGVtdWxhdG9ycycpO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiLmdzbVNpZ25hbChzaWduYWxTdHJlbmdoKTtcbn07XG5cbmNvbW1hbmRzLmdzbVZvaWNlID0gYXN5bmMgZnVuY3Rpb24gZ3NtVm9pY2UgKHN0YXRlKSB7XG4gIGlmICghdGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdnc21Wb2ljZSBtZXRob2QgaXMgb25seSBhdmFpbGFibGUgZm9yIGVtdWxhdG9ycycpO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiLmdzbVZvaWNlKHN0YXRlKTtcbn07XG5cbmNvbW1hbmRzLnBvd2VyQUMgPSBhc3luYyBmdW5jdGlvbiBwb3dlckFDIChzdGF0ZSkge1xuICBpZiAoIXRoaXMuaXNFbXVsYXRvcigpKSB7XG4gICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygncG93ZXJBQyBtZXRob2QgaXMgb25seSBhdmFpbGFibGUgZm9yIGVtdWxhdG9ycycpO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiLnBvd2VyQUMoc3RhdGUpO1xufTtcblxuY29tbWFuZHMucG93ZXJDYXBhY2l0eSA9IGFzeW5jIGZ1bmN0aW9uIHBvd2VyQ2FwYWNpdHkgKGJhdHRlcnlQZXJjZW50KSB7XG4gIGlmICghdGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdwb3dlckNhcGFjaXR5IG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzJyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGIucG93ZXJDYXBhY2l0eShiYXR0ZXJ5UGVyY2VudCk7XG59O1xuXG5jb21tYW5kcy5uZXR3b3JrU3BlZWQgPSBhc3luYyBmdW5jdGlvbiBuZXR3b3JrU3BlZWQgKG5ldHdvcmtTcGVlZCkge1xuICBpZiAoIXRoaXMuaXNFbXVsYXRvcigpKSB7XG4gICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnbmV0d29ya1NwZWVkIG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzJyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGIubmV0d29ya1NwZWVkKG5ldHdvcmtTcGVlZCk7XG59O1xuXG4vKipcbiAqIEVtdWxhdGUgc2Vuc29ycyB2YWx1ZXMgb24gdGhlIGNvbm5lY3RlZCBlbXVsYXRvci5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTZW5zb3JcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzZW5zb3JUeXBlIC0gc2Vuc29yIHR5cGUgZGVjbGFyZWQgaW4gYWRiLlNFTlNPUlNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2YWx1ZSAtIHZhbHVlIHRvIHNldCB0byB0aGUgc2Vuc29yXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFNlbnNvclxuICogQHRocm93cyB7RXJyb3J9IC0gSWYgc2Vuc29yVHlwZSBpcyBub3QgZGVmaW5lZFxuICogQHRocm93cyB7RXJyb3J9IC0gSWYgdmFsdWUgZm9yIHRoZSBzZSBzb3IgaXMgbm90IGRlZmluZWRcbiAqIEB0aHJvd3Mge0Vycm9yfSAtIElmIGRldmljZVR5cGUgaXMgbm90IGFuIGVtdWxhdG9yXG4gKi9cbmNvbW1hbmRzLnNlbnNvclNldCA9IGFzeW5jIGZ1bmN0aW9uIHNlbnNvclNldCAoc2Vuc29yID0ge30pIHtcbiAgY29uc3Qge3NlbnNvclR5cGUsIHZhbHVlfSA9IHNlbnNvcjtcbiAgaWYgKCF1dGlsLmhhc1ZhbHVlKHNlbnNvclR5cGUpKSB7XG4gICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgJ3NlbnNvclR5cGUnIGFyZ3VtZW50IGlzIHJlcXVpcmVkYCk7XG4gIH1cbiAgaWYgKCF1dGlsLmhhc1ZhbHVlKHZhbHVlKSkge1xuICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYCd2YWx1ZScgYXJndW1lbnQgaXMgcmVxdWlyZWRgKTtcbiAgfVxuICBpZiAoIXRoaXMuaXNFbXVsYXRvcigpKSB7XG4gICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnc2Vuc29yU2V0IG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzJyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGIuc2Vuc29yU2V0KHNlbnNvclR5cGUsIHZhbHVlKTtcbn07XG5cbmhlbHBlcnMuZ2V0U2NyZWVuc2hvdERhdGFXaXRoQWRiU2hlbGwgPSBhc3luYyBmdW5jdGlvbiBnZXRTY3JlZW5zaG90RGF0YVdpdGhBZGJTaGVsbCAoYWRiLCBvcHRzKSB7XG4gIGNvbnN0IGxvY2FsRmlsZSA9IGF3YWl0IHRlbXBEaXIucGF0aCh7cHJlZml4OiAnYXBwaXVtJywgc3VmZml4OiAnLnBuZyd9KTtcbiAgaWYgKGF3YWl0IGZzLmV4aXN0cyhsb2NhbEZpbGUpKSB7XG4gICAgYXdhaXQgZnMudW5saW5rKGxvY2FsRmlsZSk7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBwbmdEaXIgPSBvcHRzLmFuZHJvaWRTY3JlZW5zaG90UGF0aCB8fCAnL2RhdGEvbG9jYWwvdG1wLyc7XG4gICAgY29uc3QgcG5nID0gcGF0aC5wb3NpeC5yZXNvbHZlKHBuZ0RpciwgJ3NjcmVlbnNob3QucG5nJyk7XG4gICAgY29uc3QgY21kID0gWycvc3lzdGVtL2Jpbi9ybScsIGAke3BuZ307YCwgJy9zeXN0ZW0vYmluL3NjcmVlbmNhcCcsICctcCcsIHBuZ107XG4gICAgYXdhaXQgYWRiLnNoZWxsKGNtZCk7XG4gICAgaWYgKCFhd2FpdCBhZGIuZmlsZVNpemUocG5nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgc2l6ZSBvZiB0aGUgdGFrZW4gc2NyZWVuc2hvdCBlcXVhbHMgdG8gemVyby4nKTtcbiAgICB9XG4gICAgYXdhaXQgYWRiLnB1bGwocG5nLCBsb2NhbEZpbGUpO1xuICAgIHJldHVybiBhd2FpdCBqaW1wLnJlYWQobG9jYWxGaWxlKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKGxvY2FsRmlsZSkpIHtcbiAgICAgIGF3YWl0IGZzLnVubGluayhsb2NhbEZpbGUpO1xuICAgIH1cbiAgfVxufTtcblxuaGVscGVycy5nZXRTY3JlZW5zaG90RGF0YVdpdGhBZGJFeGVjT3V0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0U2NyZWVuc2hvdERhdGFXaXRoQWRiRXhlY091dCAoYWRiKSB7XG4gIGxldCB7c3Rkb3V0LCBzdGRlcnIsIGNvZGV9ID0gYXdhaXQgZXhlYyhhZGIuZXhlY3V0YWJsZS5wYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRiLmV4ZWN1dGFibGUuZGVmYXVsdEFyZ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbmNhdChbJ2V4ZWMtb3V0JywgJy9zeXN0ZW0vYmluL3NjcmVlbmNhcCcsICctcCddKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtlbmNvZGluZzogJ2JpbmFyeScsIGlzQnVmZmVyOiB0cnVlfSk7XG4gIC8vIGlmIHRoZXJlIGlzIGFuIGVycm9yLCB0aHJvd1xuICBpZiAoY29kZSB8fCBzdGRlcnIubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBTY3JlZW5zaG90IHJldHVybmVkIGVycm9yLCBjb2RlOiAnJHtjb2RlfScsIHN0ZGVycjogJyR7c3RkZXJyLnRvU3RyaW5nKCl9J2ApO1xuICB9XG4gIC8vIGlmIHdlIGRvbid0IGdldCBhbnl0aGluZyBhdCBhbGwsIHRocm93XG4gIGlmICghc3Rkb3V0Lmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2NyZWVuc2hvdCByZXR1cm5lZCBubyBkYXRhJyk7XG4gIH1cblxuICByZXR1cm4gYXdhaXQgamltcC5yZWFkKHN0ZG91dCk7XG59O1xuXG5jb21tYW5kcy5nZXRTY3JlZW5zaG90ID0gYXN5bmMgZnVuY3Rpb24gZ2V0U2NyZWVuc2hvdCAoKSB7XG4gIGNvbnN0IGFwaUxldmVsID0gYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKTtcbiAgbGV0IGltYWdlID0gbnVsbDtcbiAgaWYgKGFwaUxldmVsID4gMjApIHtcbiAgICB0cnkge1xuICAgICAgLy8gVGhpcyBzY3JlZW5zaG90aW5nIGFwcHJvYWNoIGlzIHdheSBmYXN0ZXIsIHNpbmNlIGl0IHJlcXVpcmVzIGxlc3MgZXh0ZXJuYWwgY29tbWFuZHNcbiAgICAgIC8vIHRvIGJlIGV4ZWN1dGVkLiBVbmZvcnR1bmF0ZWx5LCBleGVjLW91dCBvcHRpb24gaXMgb25seSBzdXBwb3J0ZWQgYnkgbmV3ZXIgQW5kcm9pZC9TREsgdmVyc2lvbnMgKDUuMCBhbmQgbGF0ZXIpXG4gICAgICBpbWFnZSA9IGF3YWl0IHRoaXMuZ2V0U2NyZWVuc2hvdERhdGFXaXRoQWRiRXhlY091dCh0aGlzLmFkYik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgQ2Fubm90IGdldCBzY3JlZW5zaG90IGRhdGEgd2l0aCAnYWRiIGV4ZWMtb3V0JyBiZWNhdXNlIG9mICcke2UubWVzc2FnZX0nLiBgICtcbiAgICAgICAgYERlZmF1bHRpbmcgdG8gJ2FkYiBzaGVsbCcgY2FsbGApO1xuICAgIH1cbiAgfVxuICBpZiAoIWltYWdlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGltYWdlID0gYXdhaXQgdGhpcy5nZXRTY3JlZW5zaG90RGF0YVdpdGhBZGJTaGVsbCh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zdCBlcnIgPSBgQ2Fubm90IGdldCBzY3JlZW5zaG90IGRhdGEgYmVjYXVzZSBvZiAnJHtlLm1lc3NhZ2V9Jy4gYCArXG4gICAgICAgIGBNYWtlIHN1cmUgdGhlICdMYXlvdXRQYXJhbXMuRkxBR19TRUNVUkUnIGlzIG5vdCBzZXQgZm9yIGAgK1xuICAgICAgICBgdGhlIGN1cnJlbnQgdmlld2A7XG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGVycik7XG4gICAgfVxuICB9XG4gIGlmIChhcGlMZXZlbCA8IDIzKSB7XG4gICAgLy8gQW5kcm9pZCBidWcgODQzMzc0MiAtIHJvdGF0ZSBzY3JlZW5zaG90IGlmIHNjcmVlbiBpcyByb3RhdGVkXG4gICAgbGV0IHNjcmVlbk9yaWVudGF0aW9uID0gYXdhaXQgdGhpcy5hZGIuZ2V0U2NyZWVuT3JpZW50YXRpb24oKTtcbiAgICB0cnkge1xuICAgICAgaW1hZ2UgPSBhd2FpdCBpbWFnZS5yb3RhdGUoLTkwICogc2NyZWVuT3JpZW50YXRpb24pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5sb2cud2FybihgQ291bGQgbm90IHJvdGF0ZSBzY3JlZW5zaG90IGR1ZSB0byBlcnJvcjogJHtlcnJ9YCk7XG4gICAgfVxuICB9XG4gIGNvbnN0IGdldEJ1ZmZlciA9IEIucHJvbWlzaWZ5KGltYWdlLmdldEJ1ZmZlciwge2NvbnRleHQ6IGltYWdlfSk7XG4gIGNvbnN0IGltZ0J1ZmZlciA9IGF3YWl0IGdldEJ1ZmZlcihqaW1wLk1JTUVfUE5HKTtcbiAgcmV0dXJuIGltZ0J1ZmZlci50b1N0cmluZygnYmFzZTY0Jyk7XG59O1xuXG5PYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIGNvbW1hbmRzLCBoZWxwZXJzKTtcbmV4cG9ydCB7IGNvbW1hbmRzLCBoZWxwZXJzIH07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
|
|
353
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYW5kcm9pZEhlbHBlcnMiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9zdXBwb3J0IiwiX3BhdGgiLCJfYmx1ZWJpcmQiLCJfamltcCIsIl90ZWVuX3Byb2Nlc3MiLCJfdXRpbHMiLCJzd2lwZVN0ZXBzUGVyU2VjIiwiZHJhZ1N0ZXBzUGVyU2VjIiwiY29tbWFuZHMiLCJoZWxwZXJzIiwiZXh0ZW5zaW9ucyIsImV4cG9ydHMiLCJrZXlldmVudCIsImtleWNvZGUiLCJtZXRhc3RhdGUiLCJsb2ciLCJ3YXJuIiwicHJlc3NLZXlDb2RlIiwiYm9vdHN0cmFwIiwic2VuZEFjdGlvbiIsImxvbmdQcmVzc0tleUNvZGUiLCJnZXRPcmllbnRhdGlvbiIsInBhcmFtcyIsIm5hdHVyYWxPcmllbnRhdGlvbiIsIm9wdHMiLCJhbmRyb2lkTmF0dXJhbE9yaWVudGF0aW9uIiwib3JpZW50YXRpb24iLCJ0b1VwcGVyQ2FzZSIsInNldE9yaWVudGF0aW9uIiwiZmFrZUZsaWNrIiwieFNwZWVkIiwieVNwZWVkIiwiZmFrZUZsaWNrRWxlbWVudCIsImVsZW1lbnRJZCIsInhvZmZzZXQiLCJ5b2Zmc2V0Iiwic3BlZWQiLCJzd2lwZSIsInN0YXJ0WCIsInN0YXJ0WSIsImVuZFgiLCJlbmRZIiwiZHVyYXRpb24iLCJ0b3VjaENvdW50IiwiZWxJZCIsInN3aXBlT3B0cyIsInN0ZXBzIiwiTWF0aCIsInJvdW5kIiwidXRpbCIsImhhc1ZhbHVlIiwiZG9Td2lwZSIsInBpbmNoQ2xvc2UiLCJwZXJjZW50IiwicGluY2hPcHRzIiwiZGlyZWN0aW9uIiwicGluY2hPcGVuIiwiZmxpY2siLCJlbGVtZW50IiwieE9mZnNldCIsInlPZmZzZXQiLCJkcmFnIiwiZGVzdEVsSWQiLCJkcmFnT3B0cyIsImRvRHJhZyIsImxvY2siLCJzZWNvbmRzIiwiYWRiIiwiaXNOYU4iLCJmbG9hdFNlY29uZHMiLCJwYXJzZUZsb2F0IiwiQiIsImRlbGF5IiwidW5sb2NrIiwiaXNMb2NrZWQiLCJpc1NjcmVlbkxvY2tlZCIsImFuZHJvaWRIZWxwZXJzIiwiY2FwcyIsIm9wZW5Ob3RpZmljYXRpb25zIiwic2V0TG9jYXRpb24iLCJsYXRpdHVkZSIsImxvbmdpdHVkZSIsInNlbmRUZWxuZXRDb21tYW5kIiwiZmluZ2VycHJpbnQiLCJmaW5nZXJwcmludElkIiwiaXNFbXVsYXRvciIsImVycm9yQW5kVGhyb3ciLCJtb2JpbGVGaW5nZXJwcmludCIsInJlcXVpcmVBcmdzIiwic2VuZFNNUyIsInBob25lTnVtYmVyIiwibWVzc2FnZSIsIm1vYmlsZVNlbmRTbXMiLCJnc21DYWxsIiwiYWN0aW9uIiwibW9iaWxlR3NtQ2FsbCIsImdzbVNpZ25hbCIsInNpZ25hbFN0cmVuZ2giLCJtb2JpbGVHc21TaWduYWwiLCJzdHJlbmd0aCIsImdzbVZvaWNlIiwic3RhdGUiLCJtb2JpbGVHc21Wb2ljZSIsInBvd2VyQUMiLCJtb2JpbGVQb3dlckFjIiwicG93ZXJDYXBhY2l0eSIsImJhdHRlcnlQZXJjZW50IiwibW9iaWxlUG93ZXJDYXBhY2l0eSIsIm5ldHdvcmtTcGVlZCIsIm1vYmlsZU5ldHdvcmtTcGVlZCIsInNlbnNvclNldCIsInNlbnNvciIsInNlbnNvclR5cGUiLCJ2YWx1ZSIsImdldFNjcmVlbnNob3REYXRhV2l0aEFkYlNoZWxsIiwibG9jYWxGaWxlIiwidGVtcERpciIsInBhdGgiLCJwcmVmaXgiLCJzdWZmaXgiLCJmcyIsImV4aXN0cyIsInVubGluayIsInBuZ0RpciIsImFuZHJvaWRTY3JlZW5zaG90UGF0aCIsInBuZyIsInBvc2l4IiwicmVzb2x2ZSIsImNtZCIsInNoZWxsIiwiZmlsZVNpemUiLCJFcnJvciIsInB1bGwiLCJqaW1wIiwicmVhZCIsImdldFNjcmVlbnNob3REYXRhV2l0aEFkYkV4ZWNPdXQiLCJzdGRvdXQiLCJzdGRlcnIiLCJjb2RlIiwiZXhlYyIsImV4ZWN1dGFibGUiLCJkZWZhdWx0QXJncyIsImNvbmNhdCIsImVuY29kaW5nIiwiaXNCdWZmZXIiLCJsZW5ndGgiLCJ0b1N0cmluZyIsImdldFNjcmVlbnNob3QiLCJhcGlMZXZlbCIsImdldEFwaUxldmVsIiwiaW1hZ2UiLCJlIiwiaW5mbyIsImVyciIsInNjcmVlbk9yaWVudGF0aW9uIiwiZ2V0U2NyZWVuT3JpZW50YXRpb24iLCJyb3RhdGUiLCJnZXRCdWZmZXIiLCJwcm9taXNpZnkiLCJjb250ZXh0IiwiaW1nQnVmZmVyIiwiTUlNRV9QTkciLCJPYmplY3QiLCJhc3NpZ24iLCJfZGVmYXVsdCIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvYWN0aW9ucy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYW5kcm9pZEhlbHBlcnMgZnJvbSAnLi4vYW5kcm9pZC1oZWxwZXJzJztcbmltcG9ydCB7IGZzLCB1dGlsLCB0ZW1wRGlyfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgamltcCBmcm9tICdqaW1wJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgcmVxdWlyZUFyZ3MgfSBmcm9tICcuLi91dGlscyc7XG5cbmNvbnN0IHN3aXBlU3RlcHNQZXJTZWMgPSAyODtcbmNvbnN0IGRyYWdTdGVwc1BlclNlYyA9IDQwO1xuXG5sZXQgY29tbWFuZHMgPSB7fSwgaGVscGVycyA9IHt9LCBleHRlbnNpb25zID0ge307XG5cbmNvbW1hbmRzLmtleWV2ZW50ID0gYXN5bmMgZnVuY3Rpb24ga2V5ZXZlbnQgKGtleWNvZGUsIG1ldGFzdGF0ZSA9IG51bGwpIHtcbiAgLy8gVE9ETyBkZXByZWNhdGUga2V5ZXZlbnQ7IGN1cnJlbnRseSB3ZCBvbmx5IGltcGxlbWVudHMga2V5ZXZlbnRcbiAgdGhpcy5sb2cud2Fybigna2V5ZXZlbnQgd2lsbCBiZSBkZXByZWNhdGVkIHVzZSBwcmVzc0tleUNvZGUnKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMucHJlc3NLZXlDb2RlKGtleWNvZGUsIG1ldGFzdGF0ZSk7XG59O1xuXG5jb21tYW5kcy5wcmVzc0tleUNvZGUgPSBhc3luYyBmdW5jdGlvbiBwcmVzc0tleUNvZGUgKGtleWNvZGUsIG1ldGFzdGF0ZSA9IG51bGwpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ3ByZXNzS2V5Q29kZScsIHtrZXljb2RlLCBtZXRhc3RhdGV9KTtcbn07XG5cbmNvbW1hbmRzLmxvbmdQcmVzc0tleUNvZGUgPSBhc3luYyBmdW5jdGlvbiBsb25nUHJlc3NLZXlDb2RlIChrZXljb2RlLCBtZXRhc3RhdGUgPSBudWxsKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdsb25nUHJlc3NLZXlDb2RlJywge2tleWNvZGUsIG1ldGFzdGF0ZX0pO1xufTtcblxuY29tbWFuZHMuZ2V0T3JpZW50YXRpb24gPSBhc3luYyBmdW5jdGlvbiBnZXRPcmllbnRhdGlvbiAoKSB7XG4gIGxldCBwYXJhbXMgPSB7XG4gICAgbmF0dXJhbE9yaWVudGF0aW9uOiAhIXRoaXMub3B0cy5hbmRyb2lkTmF0dXJhbE9yaWVudGF0aW9uLFxuICB9O1xuICBsZXQgb3JpZW50YXRpb24gPSBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdvcmllbnRhdGlvbicsIHBhcmFtcyk7XG4gIHJldHVybiBvcmllbnRhdGlvbi50b1VwcGVyQ2FzZSgpO1xufTtcblxuY29tbWFuZHMuc2V0T3JpZW50YXRpb24gPSBhc3luYyBmdW5jdGlvbiBzZXRPcmllbnRhdGlvbiAob3JpZW50YXRpb24pIHtcbiAgb3JpZW50YXRpb24gPSBvcmllbnRhdGlvbi50b1VwcGVyQ2FzZSgpO1xuICBsZXQgcGFyYW1zID0ge1xuICAgIG9yaWVudGF0aW9uLFxuICAgIG5hdHVyYWxPcmllbnRhdGlvbjogISF0aGlzLm9wdHMuYW5kcm9pZE5hdHVyYWxPcmllbnRhdGlvbixcbiAgfTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ29yaWVudGF0aW9uJywgcGFyYW1zKTtcbn07XG5cbmNvbW1hbmRzLmZha2VGbGljayA9IGFzeW5jIGZ1bmN0aW9uIGZha2VGbGljayAoeFNwZWVkLCB5U3BlZWQpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2ZsaWNrJywge3hTcGVlZCwgeVNwZWVkfSk7XG59O1xuXG5jb21tYW5kcy5mYWtlRmxpY2tFbGVtZW50ID0gYXN5bmMgZnVuY3Rpb24gZmFrZUZsaWNrRWxlbWVudCAoZWxlbWVudElkLCB4b2Zmc2V0LCB5b2Zmc2V0LCBzcGVlZCkge1xuICBsZXQgcGFyYW1zID0ge3hvZmZzZXQsIHlvZmZzZXQsIHNwZWVkLCBlbGVtZW50SWR9O1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignZWxlbWVudDpmbGljaycsIHBhcmFtcyk7XG59O1xuXG5jb21tYW5kcy5zd2lwZSA9IGFzeW5jIGZ1bmN0aW9uIHN3aXBlIChzdGFydFgsIHN0YXJ0WSwgZW5kWCwgZW5kWSwgZHVyYXRpb24sIHRvdWNoQ291bnQsIGVsSWQpIHtcbiAgaWYgKHN0YXJ0WCA9PT0gJ251bGwnKSB7XG4gICAgc3RhcnRYID0gMC41O1xuICB9XG4gIGlmIChzdGFydFkgPT09ICdudWxsJykge1xuICAgIHN0YXJ0WSA9IDAuNTtcbiAgfVxuICBsZXQgc3dpcGVPcHRzID0ge3N0YXJ0WCwgc3RhcnRZLCBlbmRYLCBlbmRZLFxuICAgICAgICAgICAgICAgICAgIHN0ZXBzOiBNYXRoLnJvdW5kKGR1cmF0aW9uICogc3dpcGVTdGVwc1BlclNlYyl9O1xuICAvLyBnb2luZyB0aGUgbG9uZyB3YXkgYW5kIGNoZWNraW5nIGZvciB1bmRlZmluZWQgYW5kIG51bGwgc2luY2VcbiAgLy8gd2UgY2FuJ3QgYmUgYXNzdXJlZCBgZWxJZGAgaXMgYSBzdHJpbmcgYW5kIG5vdCBhbiBpbnRcbiAgaWYgKHV0aWwuaGFzVmFsdWUoZWxJZCkpIHtcbiAgICBzd2lwZU9wdHMuZWxlbWVudElkID0gZWxJZDtcbiAgfVxuICByZXR1cm4gYXdhaXQgdGhpcy5kb1N3aXBlKHN3aXBlT3B0cyk7XG59O1xuXG5jb21tYW5kcy5kb1N3aXBlID0gYXN5bmMgZnVuY3Rpb24gZG9Td2lwZSAoc3dpcGVPcHRzKSB7XG4gIGlmICh1dGlsLmhhc1ZhbHVlKHN3aXBlT3B0cy5lbGVtZW50SWQpKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2VsZW1lbnQ6c3dpcGUnLCBzd2lwZU9wdHMpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdzd2lwZScsIHN3aXBlT3B0cyk7XG4gIH1cbn07XG5cbmNvbW1hbmRzLnBpbmNoQ2xvc2UgPSBhc3luYyBmdW5jdGlvbiBwaW5jaENsb3NlIChzdGFydFgsIHN0YXJ0WSwgZW5kWCwgZW5kWSwgZHVyYXRpb24sIHBlcmNlbnQsIHN0ZXBzLCBlbElkKSB7XG4gIGxldCBwaW5jaE9wdHMgPSB7XG4gICAgZGlyZWN0aW9uOiAnaW4nLFxuICAgIGVsZW1lbnRJZDogZWxJZCxcbiAgICBwZXJjZW50LFxuICAgIHN0ZXBzXG4gIH07XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdlbGVtZW50OnBpbmNoJywgcGluY2hPcHRzKTtcbn07XG5cbmNvbW1hbmRzLnBpbmNoT3BlbiA9IGFzeW5jIGZ1bmN0aW9uIHBpbmNoT3BlbiAoc3RhcnRYLCBzdGFydFksIGVuZFgsIGVuZFksIGR1cmF0aW9uLCBwZXJjZW50LCBzdGVwcywgZWxJZCkge1xuICBsZXQgcGluY2hPcHRzID0ge2RpcmVjdGlvbjogJ291dCcsIGVsZW1lbnRJZDogZWxJZCwgcGVyY2VudCwgc3RlcHN9O1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignZWxlbWVudDpwaW5jaCcsIHBpbmNoT3B0cyk7XG59O1xuXG5jb21tYW5kcy5mbGljayA9IGFzeW5jIGZ1bmN0aW9uIGZsaWNrIChlbGVtZW50LCB4U3BlZWQsIHlTcGVlZCwgeE9mZnNldCwgeU9mZnNldCwgc3BlZWQpIHtcbiAgaWYgKGVsZW1lbnQpIHtcbiAgICBhd2FpdCB0aGlzLmZha2VGbGlja0VsZW1lbnQoZWxlbWVudCwgeE9mZnNldCwgeU9mZnNldCwgc3BlZWQpO1xuICB9IGVsc2Uge1xuICAgIGF3YWl0IHRoaXMuZmFrZUZsaWNrKHhTcGVlZCwgeVNwZWVkKTtcbiAgfVxufTtcblxuY29tbWFuZHMuZHJhZyA9IGFzeW5jIGZ1bmN0aW9uIGRyYWcgKHN0YXJ0WCwgc3RhcnRZLCBlbmRYLCBlbmRZLCBkdXJhdGlvbiwgdG91Y2hDb3VudCwgZWxlbWVudElkLCBkZXN0RWxJZCkge1xuICBsZXQgZHJhZ09wdHMgPSB7XG4gICAgZWxlbWVudElkLCBkZXN0RWxJZCwgc3RhcnRYLCBzdGFydFksIGVuZFgsIGVuZFksXG4gICAgc3RlcHM6IE1hdGgucm91bmQoZHVyYXRpb24gKiBkcmFnU3RlcHNQZXJTZWMpXG4gIH07XG4gIHJldHVybiBhd2FpdCB0aGlzLmRvRHJhZyhkcmFnT3B0cyk7XG5cbn07XG5cbmNvbW1hbmRzLmRvRHJhZyA9IGFzeW5jIGZ1bmN0aW9uIGRvRHJhZyAoZHJhZ09wdHMpIHtcbiAgaWYgKHV0aWwuaGFzVmFsdWUoZHJhZ09wdHMuZWxlbWVudElkKSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdlbGVtZW50OmRyYWcnLCBkcmFnT3B0cyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2RyYWcnLCBkcmFnT3B0cyk7XG4gIH1cbn07XG5cbmNvbW1hbmRzLmxvY2sgPSBhc3luYyBmdW5jdGlvbiBsb2NrIChzZWNvbmRzKSB7XG4gIGF3YWl0IHRoaXMuYWRiLmxvY2soKTtcbiAgaWYgKGlzTmFOKHNlY29uZHMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZmxvYXRTZWNvbmRzID0gcGFyc2VGbG9hdChzZWNvbmRzKTtcbiAgaWYgKGZsb2F0U2Vjb25kcyA8PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGF3YWl0IEIuZGVsYXkoMTAwMCAqIGZsb2F0U2Vjb25kcyk7XG4gIGF3YWl0IHRoaXMudW5sb2NrKCk7XG59O1xuXG5jb21tYW5kcy5pc0xvY2tlZCA9IGFzeW5jIGZ1bmN0aW9uIGlzTG9ja2VkICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLmlzU2NyZWVuTG9ja2VkKCk7XG59O1xuXG5jb21tYW5kcy51bmxvY2sgPSBhc3luYyBmdW5jdGlvbiB1bmxvY2sgKCkge1xuICByZXR1cm4gYXdhaXQgYW5kcm9pZEhlbHBlcnMudW5sb2NrKHRoaXMsIHRoaXMuYWRiLCB0aGlzLmNhcHMpO1xufTtcblxuY29tbWFuZHMub3Blbk5vdGlmaWNhdGlvbnMgPSBhc3luYyBmdW5jdGlvbiBvcGVuTm90aWZpY2F0aW9ucyAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdvcGVuTm90aWZpY2F0aW9uJyk7XG59O1xuXG5jb21tYW5kcy5zZXRMb2NhdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIHNldExvY2F0aW9uIChsYXRpdHVkZSwgbG9uZ2l0dWRlKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5zZW5kVGVsbmV0Q29tbWFuZChgZ2VvIGZpeCAke2xvbmdpdHVkZX0gJHtsYXRpdHVkZX1gKTtcbn07XG5cbmNvbW1hbmRzLmZpbmdlcnByaW50ID0gYXN5bmMgZnVuY3Rpb24gZmluZ2VycHJpbnQgKGZpbmdlcnByaW50SWQpIHtcbiAgaWYgKCF0aGlzLmlzRW11bGF0b3IoKSkge1xuICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ2ZpbmdlcnByaW50IG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzJyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGIuZmluZ2VycHJpbnQoZmluZ2VycHJpbnRJZCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEZpbmdlcnByaW50T3B0c1xuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBmaW5nZXJwcmludElkIFRoZSB2YWx1ZSBpcyB0aGUgZmluZ2VyX2lkIGZvciB0aGUgZmluZ2VyIHRoYXRcbiAqIHdhcyBcInNjYW5uZWRcIi4gSXQgaXMgYSB1bmlxdWUgaW50ZWdlciB0aGF0IHlvdSBhc3NpZ24gZm9yIGVhY2ggdmlydHVhbCBmaW5nZXJwcmludC5cbiAqIFdoZW4gdGhlIGFwcCBpcyBydW5uaW5nIHlvdSBjYW4gcnVuIHRoaXMgc2FtZSBjb21tYW5kIGVhY2ggdGltZSB0aGVcbiAqIGVtdWxhdG9yIHByb21wdHMgeW91IGZvciBhIGZpbmdlcnByaW50LCB5b3UgY2FuIHJ1biB0aGUgYWRiIGNvbW1hbmQgYW5kIHBhc3MgaXRcbiAqIHRoZSBmaW5nZXJfaWQgdG8gc2ltdWxhdGUgdGhlIGZpbmdlcnByaW50IHNjYW4uXG4gKi9cblxuLyoqXG4gKiBFbXVsYXRlIGZpbmdlcnByaW50IG9uIEFuZHJvaWQgRW11bGF0b3IuXG4gKiBPbmx5IHdvcmtzIG9uIEFQSSAyMytcbiAqXG4gKiBAcGFyYW0ge0ZpbmdlcnByaW50T3B0c30gb3B0c1xuICovXG5jb21tYW5kcy5tb2JpbGVGaW5nZXJwcmludCA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUZpbmdlcnByaW50KG9wdHMgPSB7fSkge1xuICBjb25zdCB7ZmluZ2VycHJpbnRJZH0gPSByZXF1aXJlQXJncygnZmluZ2VycHJpbnRJZCcsIG9wdHMpO1xuICBhd2FpdCB0aGlzLmZpbmdlcnByaW50KGZpbmdlcnByaW50SWQpO1xufTtcblxuY29tbWFuZHMuc2VuZFNNUyA9IGFzeW5jIGZ1bmN0aW9uIHNlbmRTTVMgKHBob25lTnVtYmVyLCBtZXNzYWdlKSB7XG4gIGlmICghdGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdzZW5kU01TIG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzJyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGIuc2VuZFNNUyhwaG9uZU51bWJlciwgbWVzc2FnZSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNlbmRTbXNPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGhvbmVOdW1iZXIgVGhlIHBob25lIG51bWJlciB0byBzZW5kIFNNUyB0b1xuICogQHByb3BlcnR5IHtzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgcGF5bG9hZFxuICovXG5cbi8qKlxuICogRW11bGF0ZSBzZW5kaW5nIGFuIFNNUyB0byB0aGUgZ2l2ZW4gcGhvbmUgbnVtYmVyLlxuICogT25seSB3b3JrcyBvbiBlbXVsYXRvcnMuXG4gKlxuICogQHBhcmFtIHtTZW5kU21zT3B0aW9uc30gb3B0c1xuICovXG5jb21tYW5kcy5tb2JpbGVTZW5kU21zID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU2VuZFNtcyhvcHRzID0ge30pIHtcbiAgY29uc3Qge3Bob25lTnVtYmVyLCBtZXNzYWdlfSA9IHJlcXVpcmVBcmdzKFsncGhvbmVOdW1iZXInLCAnbWVzc2FnZSddLCBvcHRzKTtcbiAgYXdhaXQgdGhpcy5zZW5kU01TKHBob25lTnVtYmVyLCBtZXNzYWdlKTtcbn07XG5cbmNvbW1hbmRzLmdzbUNhbGwgPSBhc3luYyBmdW5jdGlvbiBnc21DYWxsIChwaG9uZU51bWJlciwgYWN0aW9uKSB7XG4gIGlmICghdGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdnc21DYWxsIG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzJyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGIuZ3NtQ2FsbChwaG9uZU51bWJlciwgYWN0aW9uKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gR3NtQ2FsbE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwaG9uZU51bWJlciBUaGUgcGhvbmUgbnVtYmVyIHRvIGNhbGwgdG9cbiAqIEBwcm9wZXJ0eSB7Y2FsbHxhY2NlcHR8Y2FuY2VsfGhvbGR9IGFjdGlvbiBPbmUgb2YgcG9zc2libGUgYWN0aW9ucyB0byB0YWtlXG4gKi9cblxuLyoqXG4gKiBFbXVsYXRlIGEgR1NNIGNhbGwgdG8gdGhlIGdpdmVuIHBob25lIG51bWJlci5cbiAqIE9ubHkgd29ya3Mgb24gZW11bGF0b3JzLlxuICpcbiAqIEBwYXJhbSB7R3NtQ2FsbE9wdGlvbnN9IG9wdHNcbiAqL1xuY29tbWFuZHMubW9iaWxlR3NtQ2FsbCA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUdzbUNhbGwob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtwaG9uZU51bWJlciwgYWN0aW9ufSA9IHJlcXVpcmVBcmdzKFsncGhvbmVOdW1iZXInLCAnYWN0aW9uJ10sIG9wdHMpO1xuICBhd2FpdCB0aGlzLmdzbUNhbGwocGhvbmVOdW1iZXIsIGFjdGlvbik7XG59O1xuXG5jb21tYW5kcy5nc21TaWduYWwgPSBhc3luYyBmdW5jdGlvbiBnc21TaWduYWwgKHNpZ25hbFN0cmVuZ2gpIHtcbiAgaWYgKCF0aGlzLmlzRW11bGF0b3IoKSkge1xuICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ2dzbVNpZ25hbCBtZXRob2QgaXMgb25seSBhdmFpbGFibGUgZm9yIGVtdWxhdG9ycycpO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiLmdzbVNpZ25hbChzaWduYWxTdHJlbmdoKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gR3NtU2lnbmFsT3B0aW9uc1xuICogQHByb3BlcnR5IHswfDF8MnwzfDR9IHN0cmVuZ3RoIE9uZSBvZiBwb3NzaWJsZSBzaWduYWwgc3RyZW5ndGggdmFsdWVzLCB3aGVyZSA0IGlzIHRoZSBiZXN0IHNpZ25hbC5cbiAqL1xuXG4vKipcbiAqIEVtdWxhdGUgR1NNIHNpZ25hbCBzdHJlbmd0aCBjaGFuZ2UgZXZlbnQuXG4gKiBPbmx5IHdvcmtzIG9uIGVtdWxhdG9ycy5cbiAqXG4gKiBAcGFyYW0ge0dzbVNpZ25hbE9wdGlvbnN9IG9wdHNcbiAqL1xuY29tbWFuZHMubW9iaWxlR3NtU2lnbmFsID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlR3NtU2lnbmFsKG9wdHMgPSB7fSkge1xuICBjb25zdCB7c3RyZW5ndGh9ID0gcmVxdWlyZUFyZ3MoJ3N0cmVuZ3RoJywgb3B0cyk7XG4gIGF3YWl0IHRoaXMuZ3NtU2lnbmFsKHN0cmVuZ3RoKTtcbn07XG5cbmNvbW1hbmRzLmdzbVZvaWNlID0gYXN5bmMgZnVuY3Rpb24gZ3NtVm9pY2UgKHN0YXRlKSB7XG4gIGlmICghdGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdnc21Wb2ljZSBtZXRob2QgaXMgb25seSBhdmFpbGFibGUgZm9yIGVtdWxhdG9ycycpO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiLmdzbVZvaWNlKHN0YXRlKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gR3NtVm9pY2VPcHRpb25zXG4gKiBAcHJvcGVydHkge29ufG9mZn0gc3RhdGVcbiAqL1xuXG4vKipcbiAqIEVtdWxhdGUgR1NNIHZvaWNlIHN0YXRlIGNoYW5nZSBldmVudC5cbiAqIE9ubHkgd29ya3Mgb24gZW11bGF0b3JzLlxuICpcbiAqIEBwYXJhbSB7R3NtVm9pY2VPcHRpb25zfSBvcHRzXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUdzbVZvaWNlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlR3NtVm9pY2Uob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtzdGF0ZX0gPSByZXF1aXJlQXJncygnc3RhdGUnLCBvcHRzKTtcbiAgYXdhaXQgdGhpcy5nc21Wb2ljZShzdGF0ZSk7XG59O1xuXG5jb21tYW5kcy5wb3dlckFDID0gYXN5bmMgZnVuY3Rpb24gcG93ZXJBQyAoc3RhdGUpIHtcbiAgaWYgKCF0aGlzLmlzRW11bGF0b3IoKSkge1xuICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ3Bvd2VyQUMgbWV0aG9kIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBlbXVsYXRvcnMnKTtcbiAgfVxuICBhd2FpdCB0aGlzLmFkYi5wb3dlckFDKHN0YXRlKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUG93ZXJBY09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7b258b2ZmfSBzdGF0ZVxuICovXG5cbi8qKlxuICogRW11bGF0ZSBBQyBwb3dlciBzdGF0ZSBjaGFuZ2UuXG4gKiBPbmx5IHdvcmtzIG9uIGVtdWxhdG9ycy5cbiAqXG4gKiBAcGFyYW0ge0dzbVZvaWNlT3B0aW9uc30gb3B0c1xuICovXG5jb21tYW5kcy5tb2JpbGVQb3dlckFjID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlUG93ZXJBYyhvcHRzID0ge30pIHtcbiAgY29uc3Qge3N0YXRlfSA9IHJlcXVpcmVBcmdzKCdzdGF0ZScsIG9wdHMpO1xuICBhd2FpdCB0aGlzLnBvd2VyQUMoc3RhdGUpO1xufTtcblxuY29tbWFuZHMucG93ZXJDYXBhY2l0eSA9IGFzeW5jIGZ1bmN0aW9uIHBvd2VyQ2FwYWNpdHkgKGJhdHRlcnlQZXJjZW50KSB7XG4gIGlmICghdGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdwb3dlckNhcGFjaXR5IG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZW11bGF0b3JzJyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGIucG93ZXJDYXBhY2l0eShiYXR0ZXJ5UGVyY2VudCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBvd2VyQ2FwYWNpdHlPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gcGVyY2VudCAtIFBlcmNlbnRhZ2UgdmFsdWUgaW4gcmFuZ2UgWzAsIDEwMF1cbiAqL1xuXG4vKipcbiAqIEVtdWxhdGUgcG93ZXIgY2FwYWNpdHkgY2hhbmdlLlxuICogT25seSB3b3JrcyBvbiBlbXVsYXRvcnMuXG4gKlxuICogQHBhcmFtIHtQb3dlckNhcGFjaXR5T3B0aW9uc30gb3B0c1xuICovXG5jb21tYW5kcy5tb2JpbGVQb3dlckNhcGFjaXR5ID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlUG93ZXJDYXBhY2l0eShvcHRzID0ge30pIHtcbiAgY29uc3Qge3BlcmNlbnR9ID0gcmVxdWlyZUFyZ3MoJ3BlcmNlbnQnLCBvcHRzKTtcbiAgYXdhaXQgdGhpcy5wb3dlckNhcGFjaXR5KHBlcmNlbnQpO1xufTtcblxuY29tbWFuZHMubmV0d29ya1NwZWVkID0gYXN5bmMgZnVuY3Rpb24gbmV0d29ya1NwZWVkIChuZXR3b3JrU3BlZWQpIHtcbiAgaWYgKCF0aGlzLmlzRW11bGF0b3IoKSkge1xuICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ25ldHdvcmtTcGVlZCBtZXRob2QgaXMgb25seSBhdmFpbGFibGUgZm9yIGVtdWxhdG9ycycpO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiLm5ldHdvcmtTcGVlZChuZXR3b3JrU3BlZWQpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBOZXR3b3JrU3BlZWRPcHRpb25zXG4gKiBAcHJvcGVydHkge2dzbXxzY3NkfGdwcnN8ZWRnZXx1bXRzfGhzZHBhfGx0ZXxldmRvfGZ1bGx9IHNwZWVkXG4gKi9cblxuLyoqXG4gKiBFbXVsYXRlIGRpZmZlcmVudCBuZXR3b3JrIGNvbm5lY3Rpb24gc3BlZWQgbW9kZXMuXG4gKiBPbmx5IHdvcmtzIG9uIGVtdWxhdG9ycy5cbiAqXG4gKiBAcGFyYW0ge05ldHdvcmtTcGVlZE9wdGlvbnN9IG9wdHNcbiAqL1xuY29tbWFuZHMubW9iaWxlTmV0d29ya1NwZWVkID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlTmV0d29ya1NwZWVkKG9wdHMgPSB7fSkge1xuICBjb25zdCB7c3BlZWR9ID0gcmVxdWlyZUFyZ3MoJ3NwZWVkJywgb3B0cyk7XG4gIGF3YWl0IHRoaXMubmV0d29ya1NwZWVkKHNwZWVkKTtcbn07XG5cbi8qKlxuICogRW11bGF0ZSBzZW5zb3JzIHZhbHVlcyBvbiB0aGUgY29ubmVjdGVkIGVtdWxhdG9yLlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNlbnNvclxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNlbnNvclR5cGUgLSBzZW5zb3IgdHlwZSBkZWNsYXJlZCBpbiBhZGIuU0VOU09SU1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHZhbHVlIC0gdmFsdWUgdG8gc2V0IHRvIHRoZSBzZW5zb3JcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gU2Vuc29yXG4gKiBAdGhyb3dzIHtFcnJvcn0gLSBJZiBzZW5zb3JUeXBlIGlzIG5vdCBkZWZpbmVkXG4gKiBAdGhyb3dzIHtFcnJvcn0gLSBJZiB2YWx1ZSBmb3IgdGhlIHNlIHNvciBpcyBub3QgZGVmaW5lZFxuICogQHRocm93cyB7RXJyb3J9IC0gSWYgZGV2aWNlVHlwZSBpcyBub3QgYW4gZW11bGF0b3JcbiAqL1xuY29tbWFuZHMuc2Vuc29yU2V0ID0gYXN5bmMgZnVuY3Rpb24gc2Vuc29yU2V0IChzZW5zb3IgPSB7fSkge1xuICBjb25zdCB7c2Vuc29yVHlwZSwgdmFsdWV9ID0gc2Vuc29yO1xuICBpZiAoIXV0aWwuaGFzVmFsdWUoc2Vuc29yVHlwZSkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGAnc2Vuc29yVHlwZScgYXJndW1lbnQgaXMgcmVxdWlyZWRgKTtcbiAgfVxuICBpZiAoIXV0aWwuaGFzVmFsdWUodmFsdWUpKSB7XG4gICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgJ3ZhbHVlJyBhcmd1bWVudCBpcyByZXF1aXJlZGApO1xuICB9XG4gIGlmICghdGhpcy5pc0VtdWxhdG9yKCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KCdzZW5zb3JTZXQgbWV0aG9kIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBlbXVsYXRvcnMnKTtcbiAgfVxuICBhd2FpdCB0aGlzLmFkYi5zZW5zb3JTZXQoc2Vuc29yVHlwZSwgdmFsdWUpO1xufTtcblxuaGVscGVycy5nZXRTY3JlZW5zaG90RGF0YVdpdGhBZGJTaGVsbCA9IGFzeW5jIGZ1bmN0aW9uIGdldFNjcmVlbnNob3REYXRhV2l0aEFkYlNoZWxsIChhZGIsIG9wdHMpIHtcbiAgY29uc3QgbG9jYWxGaWxlID0gYXdhaXQgdGVtcERpci5wYXRoKHtwcmVmaXg6ICdhcHBpdW0nLCBzdWZmaXg6ICcucG5nJ30pO1xuICBpZiAoYXdhaXQgZnMuZXhpc3RzKGxvY2FsRmlsZSkpIHtcbiAgICBhd2FpdCBmcy51bmxpbmsobG9jYWxGaWxlKTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IHBuZ0RpciA9IG9wdHMuYW5kcm9pZFNjcmVlbnNob3RQYXRoIHx8ICcvZGF0YS9sb2NhbC90bXAvJztcbiAgICBjb25zdCBwbmcgPSBwYXRoLnBvc2l4LnJlc29sdmUocG5nRGlyLCAnc2NyZWVuc2hvdC5wbmcnKTtcbiAgICBjb25zdCBjbWQgPSBbJy9zeXN0ZW0vYmluL3JtJywgYCR7cG5nfTtgLCAnL3N5c3RlbS9iaW4vc2NyZWVuY2FwJywgJy1wJywgcG5nXTtcbiAgICBhd2FpdCBhZGIuc2hlbGwoY21kKTtcbiAgICBpZiAoIWF3YWl0IGFkYi5maWxlU2l6ZShwbmcpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBzaXplIG9mIHRoZSB0YWtlbiBzY3JlZW5zaG90IGVxdWFscyB0byB6ZXJvLicpO1xuICAgIH1cbiAgICBhd2FpdCBhZGIucHVsbChwbmcsIGxvY2FsRmlsZSk7XG4gICAgcmV0dXJuIGF3YWl0IGppbXAucmVhZChsb2NhbEZpbGUpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChhd2FpdCBmcy5leGlzdHMobG9jYWxGaWxlKSkge1xuICAgICAgYXdhaXQgZnMudW5saW5rKGxvY2FsRmlsZSk7XG4gICAgfVxuICB9XG59O1xuXG5oZWxwZXJzLmdldFNjcmVlbnNob3REYXRhV2l0aEFkYkV4ZWNPdXQgPSBhc3luYyBmdW5jdGlvbiBnZXRTY3JlZW5zaG90RGF0YVdpdGhBZGJFeGVjT3V0IChhZGIpIHtcbiAgbGV0IHtzdGRvdXQsIHN0ZGVyciwgY29kZX0gPSBhd2FpdCBleGVjKGFkYi5leGVjdXRhYmxlLnBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGIuZXhlY3V0YWJsZS5kZWZhdWx0QXJnc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29uY2F0KFsnZXhlYy1vdXQnLCAnL3N5c3RlbS9iaW4vc2NyZWVuY2FwJywgJy1wJ10pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2VuY29kaW5nOiAnYmluYXJ5JywgaXNCdWZmZXI6IHRydWV9KTtcbiAgLy8gaWYgdGhlcmUgaXMgYW4gZXJyb3IsIHRocm93XG4gIGlmIChjb2RlIHx8IHN0ZGVyci5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNjcmVlbnNob3QgcmV0dXJuZWQgZXJyb3IsIGNvZGU6ICcke2NvZGV9Jywgc3RkZXJyOiAnJHtzdGRlcnIudG9TdHJpbmcoKX0nYCk7XG4gIH1cbiAgLy8gaWYgd2UgZG9uJ3QgZ2V0IGFueXRoaW5nIGF0IGFsbCwgdGhyb3dcbiAgaWYgKCFzdGRvdXQubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTY3JlZW5zaG90IHJldHVybmVkIG5vIGRhdGEnKTtcbiAgfVxuXG4gIHJldHVybiBhd2FpdCBqaW1wLnJlYWQoc3Rkb3V0KTtcbn07XG5cbmNvbW1hbmRzLmdldFNjcmVlbnNob3QgPSBhc3luYyBmdW5jdGlvbiBnZXRTY3JlZW5zaG90ICgpIHtcbiAgY29uc3QgYXBpTGV2ZWwgPSBhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpO1xuICBsZXQgaW1hZ2UgPSBudWxsO1xuICBpZiAoYXBpTGV2ZWwgPiAyMCkge1xuICAgIHRyeSB7XG4gICAgICAvLyBUaGlzIHNjcmVlbnNob3RpbmcgYXBwcm9hY2ggaXMgd2F5IGZhc3Rlciwgc2luY2UgaXQgcmVxdWlyZXMgbGVzcyBleHRlcm5hbCBjb21tYW5kc1xuICAgICAgLy8gdG8gYmUgZXhlY3V0ZWQuIFVuZm9ydHVuYXRlbHksIGV4ZWMtb3V0IG9wdGlvbiBpcyBvbmx5IHN1cHBvcnRlZCBieSBuZXdlciBBbmRyb2lkL1NESyB2ZXJzaW9ucyAoNS4wIGFuZCBsYXRlcilcbiAgICAgIGltYWdlID0gYXdhaXQgdGhpcy5nZXRTY3JlZW5zaG90RGF0YVdpdGhBZGJFeGVjT3V0KHRoaXMuYWRiKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBDYW5ub3QgZ2V0IHNjcmVlbnNob3QgZGF0YSB3aXRoICdhZGIgZXhlYy1vdXQnIGJlY2F1c2Ugb2YgJyR7ZS5tZXNzYWdlfScuIGAgK1xuICAgICAgICBgRGVmYXVsdGluZyB0byAnYWRiIHNoZWxsJyBjYWxsYCk7XG4gICAgfVxuICB9XG4gIGlmICghaW1hZ2UpIHtcbiAgICB0cnkge1xuICAgICAgaW1hZ2UgPSBhd2FpdCB0aGlzLmdldFNjcmVlbnNob3REYXRhV2l0aEFkYlNoZWxsKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnN0IGVyciA9IGBDYW5ub3QgZ2V0IHNjcmVlbnNob3QgZGF0YSBiZWNhdXNlIG9mICcke2UubWVzc2FnZX0nLiBgICtcbiAgICAgICAgYE1ha2Ugc3VyZSB0aGUgJ0xheW91dFBhcmFtcy5GTEFHX1NFQ1VSRScgaXMgbm90IHNldCBmb3IgYCArXG4gICAgICAgIGB0aGUgY3VycmVudCB2aWV3YDtcbiAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coZXJyKTtcbiAgICB9XG4gIH1cbiAgaWYgKGFwaUxldmVsIDwgMjMpIHtcbiAgICAvLyBBbmRyb2lkIGJ1ZyA4NDMzNzQyIC0gcm90YXRlIHNjcmVlbnNob3QgaWYgc2NyZWVuIGlzIHJvdGF0ZWRcbiAgICBsZXQgc2NyZWVuT3JpZW50YXRpb24gPSBhd2FpdCB0aGlzLmFkYi5nZXRTY3JlZW5PcmllbnRhdGlvbigpO1xuICAgIHRyeSB7XG4gICAgICBpbWFnZSA9IGF3YWl0IGltYWdlLnJvdGF0ZSgtOTAgKiBzY3JlZW5PcmllbnRhdGlvbik7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKGBDb3VsZCBub3Qgcm90YXRlIHNjcmVlbnNob3QgZHVlIHRvIGVycm9yOiAke2Vycn1gKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgZ2V0QnVmZmVyID0gQi5wcm9taXNpZnkoaW1hZ2UuZ2V0QnVmZmVyLCB7Y29udGV4dDogaW1hZ2V9KTtcbiAgY29uc3QgaW1nQnVmZmVyID0gYXdhaXQgZ2V0QnVmZmVyKGppbXAuTUlNRV9QTkcpO1xuICByZXR1cm4gaW1nQnVmZmVyLnRvU3RyaW5nKCdiYXNlNjQnKTtcbn07XG5cbk9iamVjdC5hc3NpZ24oZXh0ZW5zaW9ucywgY29tbWFuZHMsIGhlbHBlcnMpO1xuZXhwb3J0IHsgY29tbWFuZHMsIGhlbHBlcnMgfTtcbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsSUFBQUEsZUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsUUFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsS0FBQSxHQUFBSCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUcsU0FBQSxHQUFBSixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUksS0FBQSxHQUFBTCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUssYUFBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sTUFBQSxHQUFBTixPQUFBO0FBRUEsTUFBTU8sZ0JBQWdCLEdBQUcsRUFBRTtBQUMzQixNQUFNQyxlQUFlLEdBQUcsRUFBRTtBQUUxQixJQUFJQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0VBQUVDLE9BQU8sR0FBRyxDQUFDLENBQUM7RUFBRUMsVUFBVSxHQUFHLENBQUMsQ0FBQztBQUFDQyxPQUFBLENBQUFGLE9BQUEsR0FBQUEsT0FBQTtBQUFBRSxPQUFBLENBQUFILFFBQUEsR0FBQUEsUUFBQTtBQUVqREEsUUFBUSxDQUFDSSxRQUFRLEdBQUcsZUFBZUEsUUFBUUEsQ0FBRUMsT0FBTyxFQUFFQyxT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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.js","names":["_androidHelpers","_interopRequireDefault","require","_support","_path","_bluebird","_jimp","_teen_process","swipeStepsPerSec","dragStepsPerSec","commands","helpers","extensions","exports","keyevent","keycode","metastate","log","warn","pressKeyCode","bootstrap","sendAction","longPressKeyCode","getOrientation","params","naturalOrientation","opts","androidNaturalOrientation","orientation","toUpperCase","setOrientation","fakeFlick","xSpeed","ySpeed","fakeFlickElement","elementId","xoffset","yoffset","speed","swipe","startX","startY","endX","endY","duration","touchCount","elId","swipeOpts","steps","Math","round","util","hasValue","doSwipe","pinchClose","percent","pinchOpts","direction","pinchOpen","flick","element","xOffset","yOffset","drag","destElId","dragOpts","doDrag","lock","seconds","adb","isNaN","floatSeconds","parseFloat","B","delay","unlock","isLocked","isScreenLocked","androidHelpers","caps","openNotifications","setLocation","latitude","longitude","sendTelnetCommand","fingerprint","fingerprintId","isEmulator","errorAndThrow","sendSMS","phoneNumber","message","gsmCall","action","gsmSignal","signalStrengh","gsmVoice","state","powerAC","powerCapacity","batteryPercent","networkSpeed","sensorSet","sensor","sensorType","value","getScreenshotDataWithAdbShell","localFile","tempDir","path","prefix","suffix","fs","exists","unlink","pngDir","androidScreenshotPath","png","posix","resolve","cmd","shell","fileSize","Error","pull","jimp","read","getScreenshotDataWithAdbExecOut","stdout","stderr","code","exec","executable","defaultArgs","concat","encoding","isBuffer","length","toString","getScreenshot","apiLevel","getApiLevel","image","e","info","err","screenOrientation","getScreenOrientation","rotate","getBuffer","promisify","context","imgBuffer","MIME_PNG","Object","assign","_default","default"],"sources":["../../../lib/commands/actions.js"],"sourcesContent":["import androidHelpers from '../android-helpers';\nimport { fs, util, tempDir} from '@appium/support';\nimport path from 'path';\nimport B from 'bluebird';\nimport jimp from 'jimp';\nimport { exec } from 'teen_process';\n\nconst swipeStepsPerSec = 28;\nconst dragStepsPerSec = 40;\n\nlet commands = {}, helpers = {}, extensions = {};\n\ncommands.keyevent = async function keyevent (keycode, metastate = null) {\n // TODO deprecate keyevent; currently wd only implements keyevent\n this.log.warn('keyevent will be deprecated use pressKeyCode');\n return await this.pressKeyCode(keycode, metastate);\n};\n\ncommands.pressKeyCode = async function pressKeyCode (keycode, metastate = null) {\n return await this.bootstrap.sendAction('pressKeyCode', {keycode, metastate});\n};\n\ncommands.longPressKeyCode = async function longPressKeyCode (keycode, metastate = null) {\n return await this.bootstrap.sendAction('longPressKeyCode', {keycode, metastate});\n};\n\ncommands.getOrientation = async function getOrientation () {\n let params = {\n naturalOrientation: !!this.opts.androidNaturalOrientation,\n };\n let orientation = await this.bootstrap.sendAction('orientation', params);\n return orientation.toUpperCase();\n};\n\ncommands.setOrientation = async function setOrientation (orientation) {\n orientation = orientation.toUpperCase();\n let params = {\n orientation,\n naturalOrientation: !!this.opts.androidNaturalOrientation,\n };\n return await this.bootstrap.sendAction('orientation', params);\n};\n\ncommands.fakeFlick = async function fakeFlick (xSpeed, ySpeed) {\n return await this.bootstrap.sendAction('flick', {xSpeed, ySpeed});\n};\n\ncommands.fakeFlickElement = async function fakeFlickElement (elementId, xoffset, yoffset, speed) {\n let params = {xoffset, yoffset, speed, elementId};\n return await this.bootstrap.sendAction('element:flick', params);\n};\n\ncommands.swipe = async function swipe (startX, startY, endX, endY, duration, touchCount, elId) {\n if (startX === 'null') {\n startX = 0.5;\n }\n if (startY === 'null') {\n startY = 0.5;\n }\n let swipeOpts = {startX, startY, endX, endY,\n steps: Math.round(duration * swipeStepsPerSec)};\n // going the long way and checking for undefined and null since\n // we can't be assured `elId` is a string and not an int\n if (util.hasValue(elId)) {\n swipeOpts.elementId = elId;\n }\n return await this.doSwipe(swipeOpts);\n};\n\ncommands.doSwipe = async function doSwipe (swipeOpts) {\n if (util.hasValue(swipeOpts.elementId)) {\n return await this.bootstrap.sendAction('element:swipe', swipeOpts);\n } else {\n return await this.bootstrap.sendAction('swipe', swipeOpts);\n }\n};\n\ncommands.pinchClose = async function pinchClose (startX, startY, endX, endY, duration, percent, steps, elId) {\n let pinchOpts = {\n direction: 'in',\n elementId: elId,\n percent,\n steps\n };\n return await this.bootstrap.sendAction('element:pinch', pinchOpts);\n};\n\ncommands.pinchOpen = async function pinchOpen (startX, startY, endX, endY, duration, percent, steps, elId) {\n let pinchOpts = {direction: 'out', elementId: elId, percent, steps};\n return await this.bootstrap.sendAction('element:pinch', pinchOpts);\n};\n\ncommands.flick = async function flick (element, xSpeed, ySpeed, xOffset, yOffset, speed) {\n if (element) {\n await this.fakeFlickElement(element, xOffset, yOffset, speed);\n } else {\n await this.fakeFlick(xSpeed, ySpeed);\n }\n};\n\ncommands.drag = async function drag (startX, startY, endX, endY, duration, touchCount, elementId, destElId) {\n let dragOpts = {\n elementId, destElId, startX, startY, endX, endY,\n steps: Math.round(duration * dragStepsPerSec)\n };\n return await this.doDrag(dragOpts);\n\n};\n\ncommands.doDrag = async function doDrag (dragOpts) {\n if (util.hasValue(dragOpts.elementId)) {\n return await this.bootstrap.sendAction('element:drag', dragOpts);\n } else {\n return await this.bootstrap.sendAction('drag', dragOpts);\n }\n};\n\ncommands.lock = async function lock (seconds) {\n await this.adb.lock();\n if (isNaN(seconds)) {\n return;\n }\n\n const floatSeconds = parseFloat(seconds);\n if (floatSeconds <= 0) {\n return;\n }\n await B.delay(1000 * floatSeconds);\n await this.unlock();\n};\n\ncommands.isLocked = async function isLocked () {\n return await this.adb.isScreenLocked();\n};\n\ncommands.unlock = async function unlock () {\n return await androidHelpers.unlock(this, this.adb, this.caps);\n};\n\ncommands.openNotifications = async function openNotifications () {\n return await this.bootstrap.sendAction('openNotification');\n};\n\ncommands.setLocation = async function setLocation (latitude, longitude) {\n return await this.adb.sendTelnetCommand(`geo fix ${longitude} ${latitude}`);\n};\n\ncommands.fingerprint = async function fingerprint (fingerprintId) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('fingerprint method is only available for emulators');\n }\n await this.adb.fingerprint(fingerprintId);\n};\n\ncommands.sendSMS = async function sendSMS (phoneNumber, message) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('sendSMS method is only available for emulators');\n }\n await this.adb.sendSMS(phoneNumber, message);\n};\n\ncommands.gsmCall = async function gsmCall (phoneNumber, action) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('gsmCall method is only available for emulators');\n }\n await this.adb.gsmCall(phoneNumber, action);\n};\n\ncommands.gsmSignal = async function gsmSignal (signalStrengh) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('gsmSignal method is only available for emulators');\n }\n await this.adb.gsmSignal(signalStrengh);\n};\n\ncommands.gsmVoice = async function gsmVoice (state) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('gsmVoice method is only available for emulators');\n }\n await this.adb.gsmVoice(state);\n};\n\ncommands.powerAC = async function powerAC (state) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('powerAC method is only available for emulators');\n }\n await this.adb.powerAC(state);\n};\n\ncommands.powerCapacity = async function powerCapacity (batteryPercent) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('powerCapacity method is only available for emulators');\n }\n await this.adb.powerCapacity(batteryPercent);\n};\n\ncommands.networkSpeed = async function networkSpeed (networkSpeed) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('networkSpeed method is only available for emulators');\n }\n await this.adb.networkSpeed(networkSpeed);\n};\n\n/**\n * Emulate sensors values on the connected emulator.\n *\n * @typedef {Object} Sensor\n * @property {string} sensorType - sensor type declared in adb.SENSORS\n * @property {string} value - value to set to the sensor\n *\n * @param {Object} Sensor\n * @throws {Error} - If sensorType is not defined\n * @throws {Error} - If value for the se sor is not defined\n * @throws {Error} - If deviceType is not an emulator\n */\ncommands.sensorSet = async function sensorSet (sensor = {}) {\n const {sensorType, value} = sensor;\n if (!util.hasValue(sensorType)) {\n this.log.errorAndThrow(`'sensorType' argument is required`);\n }\n if (!util.hasValue(value)) {\n this.log.errorAndThrow(`'value' argument is required`);\n }\n if (!this.isEmulator()) {\n this.log.errorAndThrow('sensorSet method is only available for emulators');\n }\n await this.adb.sensorSet(sensorType, value);\n};\n\nhelpers.getScreenshotDataWithAdbShell = async function getScreenshotDataWithAdbShell (adb, opts) {\n const localFile = await tempDir.path({prefix: 'appium', suffix: '.png'});\n if (await fs.exists(localFile)) {\n await fs.unlink(localFile);\n }\n try {\n const pngDir = opts.androidScreenshotPath || '/data/local/tmp/';\n const png = path.posix.resolve(pngDir, 'screenshot.png');\n const cmd = ['/system/bin/rm', `${png};`, '/system/bin/screencap', '-p', png];\n await adb.shell(cmd);\n if (!await adb.fileSize(png)) {\n throw new Error('The size of the taken screenshot equals to zero.');\n }\n await adb.pull(png, localFile);\n return await jimp.read(localFile);\n } finally {\n if (await fs.exists(localFile)) {\n await fs.unlink(localFile);\n }\n }\n};\n\nhelpers.getScreenshotDataWithAdbExecOut = async function getScreenshotDataWithAdbExecOut (adb) {\n let {stdout, stderr, code} = await exec(adb.executable.path,\n adb.executable.defaultArgs\n .concat(['exec-out', '/system/bin/screencap', '-p']),\n {encoding: 'binary', isBuffer: true});\n // if there is an error, throw\n if (code || stderr.length) {\n throw new Error(`Screenshot returned error, code: '${code}', stderr: '${stderr.toString()}'`);\n }\n // if we don't get anything at all, throw\n if (!stdout.length) {\n throw new Error('Screenshot returned no data');\n }\n\n return await jimp.read(stdout);\n};\n\ncommands.getScreenshot = async function getScreenshot () {\n const apiLevel = await this.adb.getApiLevel();\n let image = null;\n if (apiLevel > 20) {\n try {\n // This screenshoting approach is way faster, since it requires less external commands\n // to be executed. Unfortunately, exec-out option is only supported by newer Android/SDK versions (5.0 and later)\n image = await this.getScreenshotDataWithAdbExecOut(this.adb);\n } catch (e) {\n this.log.info(`Cannot get screenshot data with 'adb exec-out' because of '${e.message}'. ` +\n `Defaulting to 'adb shell' call`);\n }\n }\n if (!image) {\n try {\n image = await this.getScreenshotDataWithAdbShell(this.adb, this.opts);\n } catch (e) {\n const err = `Cannot get screenshot data because of '${e.message}'. ` +\n `Make sure the 'LayoutParams.FLAG_SECURE' is not set for ` +\n `the current view`;\n this.log.errorAndThrow(err);\n }\n }\n if (apiLevel < 23) {\n // Android bug 8433742 - rotate screenshot if screen is rotated\n let screenOrientation = await this.adb.getScreenOrientation();\n try {\n image = await image.rotate(-90 * screenOrientation);\n } catch (err) {\n this.log.warn(`Could not rotate screenshot due to error: ${err}`);\n }\n }\n const getBuffer = B.promisify(image.getBuffer, {context: image});\n const imgBuffer = await getBuffer(jimp.MIME_PNG);\n return imgBuffer.toString('base64');\n};\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers };\nexport default extensions;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"actions.js","names":["_androidHelpers","_interopRequireDefault","require","_support","_path","_bluebird","_jimp","_teen_process","_utils","swipeStepsPerSec","dragStepsPerSec","commands","helpers","extensions","exports","keyevent","keycode","metastate","log","warn","pressKeyCode","bootstrap","sendAction","longPressKeyCode","getOrientation","params","naturalOrientation","opts","androidNaturalOrientation","orientation","toUpperCase","setOrientation","fakeFlick","xSpeed","ySpeed","fakeFlickElement","elementId","xoffset","yoffset","speed","swipe","startX","startY","endX","endY","duration","touchCount","elId","swipeOpts","steps","Math","round","util","hasValue","doSwipe","pinchClose","percent","pinchOpts","direction","pinchOpen","flick","element","xOffset","yOffset","drag","destElId","dragOpts","doDrag","lock","seconds","adb","isNaN","floatSeconds","parseFloat","B","delay","unlock","isLocked","isScreenLocked","androidHelpers","caps","openNotifications","setLocation","latitude","longitude","sendTelnetCommand","fingerprint","fingerprintId","isEmulator","errorAndThrow","mobileFingerprint","requireArgs","sendSMS","phoneNumber","message","mobileSendSms","gsmCall","action","mobileGsmCall","gsmSignal","signalStrengh","mobileGsmSignal","strength","gsmVoice","state","mobileGsmVoice","powerAC","mobilePowerAc","powerCapacity","batteryPercent","mobilePowerCapacity","networkSpeed","mobileNetworkSpeed","sensorSet","sensor","sensorType","value","getScreenshotDataWithAdbShell","localFile","tempDir","path","prefix","suffix","fs","exists","unlink","pngDir","androidScreenshotPath","png","posix","resolve","cmd","shell","fileSize","Error","pull","jimp","read","getScreenshotDataWithAdbExecOut","stdout","stderr","code","exec","executable","defaultArgs","concat","encoding","isBuffer","length","toString","getScreenshot","apiLevel","getApiLevel","image","e","info","err","screenOrientation","getScreenOrientation","rotate","getBuffer","promisify","context","imgBuffer","MIME_PNG","Object","assign","_default","default"],"sources":["../../../lib/commands/actions.js"],"sourcesContent":["import androidHelpers from '../android-helpers';\nimport { fs, util, tempDir} from '@appium/support';\nimport path from 'path';\nimport B from 'bluebird';\nimport jimp from 'jimp';\nimport { exec } from 'teen_process';\nimport { requireArgs } from '../utils';\n\nconst swipeStepsPerSec = 28;\nconst dragStepsPerSec = 40;\n\nlet commands = {}, helpers = {}, extensions = {};\n\ncommands.keyevent = async function keyevent (keycode, metastate = null) {\n // TODO deprecate keyevent; currently wd only implements keyevent\n this.log.warn('keyevent will be deprecated use pressKeyCode');\n return await this.pressKeyCode(keycode, metastate);\n};\n\ncommands.pressKeyCode = async function pressKeyCode (keycode, metastate = null) {\n return await this.bootstrap.sendAction('pressKeyCode', {keycode, metastate});\n};\n\ncommands.longPressKeyCode = async function longPressKeyCode (keycode, metastate = null) {\n return await this.bootstrap.sendAction('longPressKeyCode', {keycode, metastate});\n};\n\ncommands.getOrientation = async function getOrientation () {\n let params = {\n naturalOrientation: !!this.opts.androidNaturalOrientation,\n };\n let orientation = await this.bootstrap.sendAction('orientation', params);\n return orientation.toUpperCase();\n};\n\ncommands.setOrientation = async function setOrientation (orientation) {\n orientation = orientation.toUpperCase();\n let params = {\n orientation,\n naturalOrientation: !!this.opts.androidNaturalOrientation,\n };\n return await this.bootstrap.sendAction('orientation', params);\n};\n\ncommands.fakeFlick = async function fakeFlick (xSpeed, ySpeed) {\n return await this.bootstrap.sendAction('flick', {xSpeed, ySpeed});\n};\n\ncommands.fakeFlickElement = async function fakeFlickElement (elementId, xoffset, yoffset, speed) {\n let params = {xoffset, yoffset, speed, elementId};\n return await this.bootstrap.sendAction('element:flick', params);\n};\n\ncommands.swipe = async function swipe (startX, startY, endX, endY, duration, touchCount, elId) {\n if (startX === 'null') {\n startX = 0.5;\n }\n if (startY === 'null') {\n startY = 0.5;\n }\n let swipeOpts = {startX, startY, endX, endY,\n steps: Math.round(duration * swipeStepsPerSec)};\n // going the long way and checking for undefined and null since\n // we can't be assured `elId` is a string and not an int\n if (util.hasValue(elId)) {\n swipeOpts.elementId = elId;\n }\n return await this.doSwipe(swipeOpts);\n};\n\ncommands.doSwipe = async function doSwipe (swipeOpts) {\n if (util.hasValue(swipeOpts.elementId)) {\n return await this.bootstrap.sendAction('element:swipe', swipeOpts);\n } else {\n return await this.bootstrap.sendAction('swipe', swipeOpts);\n }\n};\n\ncommands.pinchClose = async function pinchClose (startX, startY, endX, endY, duration, percent, steps, elId) {\n let pinchOpts = {\n direction: 'in',\n elementId: elId,\n percent,\n steps\n };\n return await this.bootstrap.sendAction('element:pinch', pinchOpts);\n};\n\ncommands.pinchOpen = async function pinchOpen (startX, startY, endX, endY, duration, percent, steps, elId) {\n let pinchOpts = {direction: 'out', elementId: elId, percent, steps};\n return await this.bootstrap.sendAction('element:pinch', pinchOpts);\n};\n\ncommands.flick = async function flick (element, xSpeed, ySpeed, xOffset, yOffset, speed) {\n if (element) {\n await this.fakeFlickElement(element, xOffset, yOffset, speed);\n } else {\n await this.fakeFlick(xSpeed, ySpeed);\n }\n};\n\ncommands.drag = async function drag (startX, startY, endX, endY, duration, touchCount, elementId, destElId) {\n let dragOpts = {\n elementId, destElId, startX, startY, endX, endY,\n steps: Math.round(duration * dragStepsPerSec)\n };\n return await this.doDrag(dragOpts);\n\n};\n\ncommands.doDrag = async function doDrag (dragOpts) {\n if (util.hasValue(dragOpts.elementId)) {\n return await this.bootstrap.sendAction('element:drag', dragOpts);\n } else {\n return await this.bootstrap.sendAction('drag', dragOpts);\n }\n};\n\ncommands.lock = async function lock (seconds) {\n await this.adb.lock();\n if (isNaN(seconds)) {\n return;\n }\n\n const floatSeconds = parseFloat(seconds);\n if (floatSeconds <= 0) {\n return;\n }\n await B.delay(1000 * floatSeconds);\n await this.unlock();\n};\n\ncommands.isLocked = async function isLocked () {\n return await this.adb.isScreenLocked();\n};\n\ncommands.unlock = async function unlock () {\n return await androidHelpers.unlock(this, this.adb, this.caps);\n};\n\ncommands.openNotifications = async function openNotifications () {\n return await this.bootstrap.sendAction('openNotification');\n};\n\ncommands.setLocation = async function setLocation (latitude, longitude) {\n return await this.adb.sendTelnetCommand(`geo fix ${longitude} ${latitude}`);\n};\n\ncommands.fingerprint = async function fingerprint (fingerprintId) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('fingerprint method is only available for emulators');\n }\n await this.adb.fingerprint(fingerprintId);\n};\n\n/**\n * @typedef {Object} FingerprintOpts\n * @param {string|number} fingerprintId The value is the finger_id for the finger that\n * was \"scanned\". It is a unique integer that you assign for each virtual fingerprint.\n * When the app is running you can run this same command each time the\n * emulator prompts you for a fingerprint, you can run the adb command and pass it\n * the finger_id to simulate the fingerprint scan.\n */\n\n/**\n * Emulate fingerprint on Android Emulator.\n * Only works on API 23+\n *\n * @param {FingerprintOpts} opts\n */\ncommands.mobileFingerprint = async function mobileFingerprint(opts = {}) {\n const {fingerprintId} = requireArgs('fingerprintId', opts);\n await this.fingerprint(fingerprintId);\n};\n\ncommands.sendSMS = async function sendSMS (phoneNumber, message) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('sendSMS method is only available for emulators');\n }\n await this.adb.sendSMS(phoneNumber, message);\n};\n\n/**\n * @typedef {Object} SendSmsOptions\n * @property {string} phoneNumber The phone number to send SMS to\n * @property {string} message The message payload\n */\n\n/**\n * Emulate sending an SMS to the given phone number.\n * Only works on emulators.\n *\n * @param {SendSmsOptions} opts\n */\ncommands.mobileSendSms = async function mobileSendSms(opts = {}) {\n const {phoneNumber, message} = requireArgs(['phoneNumber', 'message'], opts);\n await this.sendSMS(phoneNumber, message);\n};\n\ncommands.gsmCall = async function gsmCall (phoneNumber, action) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('gsmCall method is only available for emulators');\n }\n await this.adb.gsmCall(phoneNumber, action);\n};\n\n/**\n * @typedef {Object} GsmCallOptions\n * @property {string} phoneNumber The phone number to call to\n * @property {call|accept|cancel|hold} action One of possible actions to take\n */\n\n/**\n * Emulate a GSM call to the given phone number.\n * Only works on emulators.\n *\n * @param {GsmCallOptions} opts\n */\ncommands.mobileGsmCall = async function mobileGsmCall(opts = {}) {\n const {phoneNumber, action} = requireArgs(['phoneNumber', 'action'], opts);\n await this.gsmCall(phoneNumber, action);\n};\n\ncommands.gsmSignal = async function gsmSignal (signalStrengh) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('gsmSignal method is only available for emulators');\n }\n await this.adb.gsmSignal(signalStrengh);\n};\n\n/**\n * @typedef {Object} GsmSignalOptions\n * @property {0|1|2|3|4} strength One of possible signal strength values, where 4 is the best signal.\n */\n\n/**\n * Emulate GSM signal strength change event.\n * Only works on emulators.\n *\n * @param {GsmSignalOptions} opts\n */\ncommands.mobileGsmSignal = async function mobileGsmSignal(opts = {}) {\n const {strength} = requireArgs('strength', opts);\n await this.gsmSignal(strength);\n};\n\ncommands.gsmVoice = async function gsmVoice (state) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('gsmVoice method is only available for emulators');\n }\n await this.adb.gsmVoice(state);\n};\n\n/**\n * @typedef {Object} GsmVoiceOptions\n * @property {on|off} state\n */\n\n/**\n * Emulate GSM voice state change event.\n * Only works on emulators.\n *\n * @param {GsmVoiceOptions} opts\n */\ncommands.mobileGsmVoice = async function mobileGsmVoice(opts = {}) {\n const {state} = requireArgs('state', opts);\n await this.gsmVoice(state);\n};\n\ncommands.powerAC = async function powerAC (state) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('powerAC method is only available for emulators');\n }\n await this.adb.powerAC(state);\n};\n\n/**\n * @typedef {Object} PowerAcOptions\n * @property {on|off} state\n */\n\n/**\n * Emulate AC power state change.\n * Only works on emulators.\n *\n * @param {GsmVoiceOptions} opts\n */\ncommands.mobilePowerAc = async function mobilePowerAc(opts = {}) {\n const {state} = requireArgs('state', opts);\n await this.powerAC(state);\n};\n\ncommands.powerCapacity = async function powerCapacity (batteryPercent) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('powerCapacity method is only available for emulators');\n }\n await this.adb.powerCapacity(batteryPercent);\n};\n\n/**\n * @typedef {Object} PowerCapacityOptions\n * @property {number} percent - Percentage value in range [0, 100]\n */\n\n/**\n * Emulate power capacity change.\n * Only works on emulators.\n *\n * @param {PowerCapacityOptions} opts\n */\ncommands.mobilePowerCapacity = async function mobilePowerCapacity(opts = {}) {\n const {percent} = requireArgs('percent', opts);\n await this.powerCapacity(percent);\n};\n\ncommands.networkSpeed = async function networkSpeed (networkSpeed) {\n if (!this.isEmulator()) {\n this.log.errorAndThrow('networkSpeed method is only available for emulators');\n }\n await this.adb.networkSpeed(networkSpeed);\n};\n\n/**\n * @typedef {Object} NetworkSpeedOptions\n * @property {gsm|scsd|gprs|edge|umts|hsdpa|lte|evdo|full} speed\n */\n\n/**\n * Emulate different network connection speed modes.\n * Only works on emulators.\n *\n * @param {NetworkSpeedOptions} opts\n */\ncommands.mobileNetworkSpeed = async function mobileNetworkSpeed(opts = {}) {\n const {speed} = requireArgs('speed', opts);\n await this.networkSpeed(speed);\n};\n\n/**\n * Emulate sensors values on the connected emulator.\n *\n * @typedef {Object} Sensor\n * @property {string} sensorType - sensor type declared in adb.SENSORS\n * @property {string} value - value to set to the sensor\n *\n * @param {Object} Sensor\n * @throws {Error} - If sensorType is not defined\n * @throws {Error} - If value for the se sor is not defined\n * @throws {Error} - If deviceType is not an emulator\n */\ncommands.sensorSet = async function sensorSet (sensor = {}) {\n const {sensorType, value} = sensor;\n if (!util.hasValue(sensorType)) {\n this.log.errorAndThrow(`'sensorType' argument is required`);\n }\n if (!util.hasValue(value)) {\n this.log.errorAndThrow(`'value' argument is required`);\n }\n if (!this.isEmulator()) {\n this.log.errorAndThrow('sensorSet method is only available for emulators');\n }\n await this.adb.sensorSet(sensorType, value);\n};\n\nhelpers.getScreenshotDataWithAdbShell = async function getScreenshotDataWithAdbShell (adb, opts) {\n const localFile = await tempDir.path({prefix: 'appium', suffix: '.png'});\n if (await fs.exists(localFile)) {\n await fs.unlink(localFile);\n }\n try {\n const pngDir = opts.androidScreenshotPath || '/data/local/tmp/';\n const png = path.posix.resolve(pngDir, 'screenshot.png');\n const cmd = ['/system/bin/rm', `${png};`, '/system/bin/screencap', '-p', png];\n await adb.shell(cmd);\n if (!await adb.fileSize(png)) {\n throw new Error('The size of the taken screenshot equals to zero.');\n }\n await adb.pull(png, localFile);\n return await jimp.read(localFile);\n } finally {\n if (await fs.exists(localFile)) {\n await fs.unlink(localFile);\n }\n }\n};\n\nhelpers.getScreenshotDataWithAdbExecOut = async function getScreenshotDataWithAdbExecOut (adb) {\n let {stdout, stderr, code} = await exec(adb.executable.path,\n adb.executable.defaultArgs\n .concat(['exec-out', '/system/bin/screencap', '-p']),\n {encoding: 'binary', isBuffer: true});\n // if there is an error, throw\n if (code || stderr.length) {\n throw new Error(`Screenshot returned error, code: '${code}', stderr: '${stderr.toString()}'`);\n }\n // if we don't get anything at all, throw\n if (!stdout.length) {\n throw new Error('Screenshot returned no data');\n }\n\n return await jimp.read(stdout);\n};\n\ncommands.getScreenshot = async function getScreenshot () {\n const apiLevel = await this.adb.getApiLevel();\n let image = null;\n if (apiLevel > 20) {\n try {\n // This screenshoting approach is way faster, since it requires less external commands\n // to be executed. Unfortunately, exec-out option is only supported by newer Android/SDK versions (5.0 and later)\n image = await this.getScreenshotDataWithAdbExecOut(this.adb);\n } catch (e) {\n this.log.info(`Cannot get screenshot data with 'adb exec-out' because of '${e.message}'. ` +\n `Defaulting to 'adb shell' call`);\n }\n }\n if (!image) {\n try {\n image = await this.getScreenshotDataWithAdbShell(this.adb, this.opts);\n } catch (e) {\n const err = `Cannot get screenshot data because of '${e.message}'. ` +\n `Make sure the 'LayoutParams.FLAG_SECURE' is not set for ` +\n `the current view`;\n this.log.errorAndThrow(err);\n }\n }\n if (apiLevel < 23) {\n // Android bug 8433742 - rotate screenshot if screen is rotated\n let screenOrientation = await this.adb.getScreenOrientation();\n try {\n image = await image.rotate(-90 * screenOrientation);\n } catch (err) {\n this.log.warn(`Could not rotate screenshot due to error: ${err}`);\n }\n }\n const getBuffer = B.promisify(image.getBuffer, {context: image});\n const imgBuffer = await getBuffer(jimp.MIME_PNG);\n return imgBuffer.toString('base64');\n};\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers };\nexport default extensions;\n"],"mappings":"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"}
|
package/build/lib/utils.js
CHANGED
|
@@ -19,4 +19,4 @@ function requireArgs(argNames, opts = {}) {
|
|
|
19
19
|
}
|
|
20
20
|
return opts;
|
|
21
21
|
}
|
|
22
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
22
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZHJpdmVyIiwiQURCX1NIRUxMX0ZFQVRVUkUiLCJleHBvcnRzIiwicmVxdWlyZUFyZ3MiLCJhcmdOYW1lcyIsIm9wdHMiLCJhcmdOYW1lIiwiXyIsImlzQXJyYXkiLCJoYXMiLCJlcnJvcnMiLCJJbnZhbGlkQXJndW1lbnRFcnJvciJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi91dGlscy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5cbmV4cG9ydCBjb25zdCBBREJfU0hFTExfRkVBVFVSRSA9ICdhZGJfc2hlbGwnO1xuXG4vKipcbiAqIEFzc2VydCB0aGUgcHJlc2VuY2Ugb2YgcGFydGljdWxhciBrZXlzIGluIHRoZSBnaXZlbiBvYmplY3RcbiAqXG4gKiBAdGVtcGxhdGUge09iamVjdH0gVFxuICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IGFyZ05hbWVzIG9uZSBvciBtb3JlIGtleSBuYW1lc1xuICogQHBhcmFtIHtUfSBvcHRzIHRoZSBvYmplY3QgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtUfSB0aGUgc2FtZSBnaXZlbiBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVBcmdzIChhcmdOYW1lcywgb3B0cyA9IHt9KSB7XG4gIGZvciAoY29uc3QgYXJnTmFtZSBvZiAoXy5pc0FycmF5KGFyZ05hbWVzKSA/IGFyZ05hbWVzIDogW2FyZ05hbWVzXSkpIHtcbiAgICBpZiAoIV8uaGFzKG9wdHMsIGFyZ05hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGAnJHthcmdOYW1lfScgYXJndW1lbnQgbXVzdCBiZSBwcm92aWRlZGApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3B0cztcbn0iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUVPLE1BQU1FLGlCQUFpQixHQUFHLFdBQVc7QUFBQ0MsT0FBQSxDQUFBRCxpQkFBQSxHQUFBQSxpQkFBQTtBQVV0QyxTQUFTRSxXQUFXQSxDQUFFQyxRQUFRLEVBQUVDLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRTtFQUNoRCxLQUFLLE1BQU1DLE9BQU8sSUFBS0MsZUFBQyxDQUFDQyxPQUFPLENBQUNKLFFBQVEsQ0FBQyxHQUFHQSxRQUFRLEdBQUcsQ0FBQ0EsUUFBUSxDQUFDLEVBQUc7SUFDbkUsSUFBSSxDQUFDRyxlQUFDLENBQUNFLEdBQUcsQ0FBQ0osSUFBSSxFQUFFQyxPQUFPLENBQUMsRUFBRTtNQUN6QixNQUFNLElBQUlJLGNBQU0sQ0FBQ0Msb0JBQW9CLENBQUUsSUFBR0wsT0FBUSw2QkFBNEIsQ0FBQztJQUNqRjtFQUNGO0VBQ0EsT0FBT0QsSUFBSTtBQUNiIn0=
|
package/build/lib/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","names":["_lodash","_interopRequireDefault","require","_driver","ADB_SHELL_FEATURE","exports","requireArgs","argNames","opts","argName","_","isArray","has","errors","InvalidArgumentError"],"sources":["../../lib/utils.js"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from 'appium/driver';\n\nexport const ADB_SHELL_FEATURE = 'adb_shell';\n\n/**\n * Assert the presence of particular keys in the given object\n *\n * @param {string|
|
|
1
|
+
{"version":3,"file":"utils.js","names":["_lodash","_interopRequireDefault","require","_driver","ADB_SHELL_FEATURE","exports","requireArgs","argNames","opts","argName","_","isArray","has","errors","InvalidArgumentError"],"sources":["../../lib/utils.js"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from 'appium/driver';\n\nexport const ADB_SHELL_FEATURE = 'adb_shell';\n\n/**\n * Assert the presence of particular keys in the given object\n *\n * @template {Object} T\n * @param {string|string[]} argNames one or more key names\n * @param {T} opts the object to check\n * @returns {T} the same given object\n */\nexport function requireArgs (argNames, opts = {}) {\n for (const argName of (_.isArray(argNames) ? argNames : [argNames])) {\n if (!_.has(opts, argName)) {\n throw new errors.InvalidArgumentError(`'${argName}' argument must be provided`);\n }\n }\n return opts;\n}"],"mappings":";;;;;;;;;AAAA,IAAAA,OAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAEO,MAAME,iBAAiB,GAAG,WAAW;AAACC,OAAA,CAAAD,iBAAA,GAAAA,iBAAA;AAUtC,SAASE,WAAWA,CAAEC,QAAQ,EAAEC,IAAI,GAAG,CAAC,CAAC,EAAE;EAChD,KAAK,MAAMC,OAAO,IAAKC,eAAC,CAACC,OAAO,CAACJ,QAAQ,CAAC,GAAGA,QAAQ,GAAG,CAACA,QAAQ,CAAC,EAAG;IACnE,IAAI,CAACG,eAAC,CAACE,GAAG,CAACJ,IAAI,EAAEC,OAAO,CAAC,EAAE;MACzB,MAAM,IAAII,cAAM,CAACC,oBAAoB,CAAE,IAAGL,OAAQ,6BAA4B,CAAC;IACjF;EACF;EACA,OAAOD,IAAI;AACb"}
|
package/lib/commands/actions.js
CHANGED
|
@@ -4,6 +4,7 @@ import path from 'path';
|
|
|
4
4
|
import B from 'bluebird';
|
|
5
5
|
import jimp from 'jimp';
|
|
6
6
|
import { exec } from 'teen_process';
|
|
7
|
+
import { requireArgs } from '../utils';
|
|
7
8
|
|
|
8
9
|
const swipeStepsPerSec = 28;
|
|
9
10
|
const dragStepsPerSec = 40;
|
|
@@ -152,6 +153,26 @@ commands.fingerprint = async function fingerprint (fingerprintId) {
|
|
|
152
153
|
await this.adb.fingerprint(fingerprintId);
|
|
153
154
|
};
|
|
154
155
|
|
|
156
|
+
/**
|
|
157
|
+
* @typedef {Object} FingerprintOpts
|
|
158
|
+
* @param {string|number} fingerprintId The value is the finger_id for the finger that
|
|
159
|
+
* was "scanned". It is a unique integer that you assign for each virtual fingerprint.
|
|
160
|
+
* When the app is running you can run this same command each time the
|
|
161
|
+
* emulator prompts you for a fingerprint, you can run the adb command and pass it
|
|
162
|
+
* the finger_id to simulate the fingerprint scan.
|
|
163
|
+
*/
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Emulate fingerprint on Android Emulator.
|
|
167
|
+
* Only works on API 23+
|
|
168
|
+
*
|
|
169
|
+
* @param {FingerprintOpts} opts
|
|
170
|
+
*/
|
|
171
|
+
commands.mobileFingerprint = async function mobileFingerprint(opts = {}) {
|
|
172
|
+
const {fingerprintId} = requireArgs('fingerprintId', opts);
|
|
173
|
+
await this.fingerprint(fingerprintId);
|
|
174
|
+
};
|
|
175
|
+
|
|
155
176
|
commands.sendSMS = async function sendSMS (phoneNumber, message) {
|
|
156
177
|
if (!this.isEmulator()) {
|
|
157
178
|
this.log.errorAndThrow('sendSMS method is only available for emulators');
|
|
@@ -159,6 +180,23 @@ commands.sendSMS = async function sendSMS (phoneNumber, message) {
|
|
|
159
180
|
await this.adb.sendSMS(phoneNumber, message);
|
|
160
181
|
};
|
|
161
182
|
|
|
183
|
+
/**
|
|
184
|
+
* @typedef {Object} SendSmsOptions
|
|
185
|
+
* @property {string} phoneNumber The phone number to send SMS to
|
|
186
|
+
* @property {string} message The message payload
|
|
187
|
+
*/
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Emulate sending an SMS to the given phone number.
|
|
191
|
+
* Only works on emulators.
|
|
192
|
+
*
|
|
193
|
+
* @param {SendSmsOptions} opts
|
|
194
|
+
*/
|
|
195
|
+
commands.mobileSendSms = async function mobileSendSms(opts = {}) {
|
|
196
|
+
const {phoneNumber, message} = requireArgs(['phoneNumber', 'message'], opts);
|
|
197
|
+
await this.sendSMS(phoneNumber, message);
|
|
198
|
+
};
|
|
199
|
+
|
|
162
200
|
commands.gsmCall = async function gsmCall (phoneNumber, action) {
|
|
163
201
|
if (!this.isEmulator()) {
|
|
164
202
|
this.log.errorAndThrow('gsmCall method is only available for emulators');
|
|
@@ -166,6 +204,23 @@ commands.gsmCall = async function gsmCall (phoneNumber, action) {
|
|
|
166
204
|
await this.adb.gsmCall(phoneNumber, action);
|
|
167
205
|
};
|
|
168
206
|
|
|
207
|
+
/**
|
|
208
|
+
* @typedef {Object} GsmCallOptions
|
|
209
|
+
* @property {string} phoneNumber The phone number to call to
|
|
210
|
+
* @property {call|accept|cancel|hold} action One of possible actions to take
|
|
211
|
+
*/
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Emulate a GSM call to the given phone number.
|
|
215
|
+
* Only works on emulators.
|
|
216
|
+
*
|
|
217
|
+
* @param {GsmCallOptions} opts
|
|
218
|
+
*/
|
|
219
|
+
commands.mobileGsmCall = async function mobileGsmCall(opts = {}) {
|
|
220
|
+
const {phoneNumber, action} = requireArgs(['phoneNumber', 'action'], opts);
|
|
221
|
+
await this.gsmCall(phoneNumber, action);
|
|
222
|
+
};
|
|
223
|
+
|
|
169
224
|
commands.gsmSignal = async function gsmSignal (signalStrengh) {
|
|
170
225
|
if (!this.isEmulator()) {
|
|
171
226
|
this.log.errorAndThrow('gsmSignal method is only available for emulators');
|
|
@@ -173,6 +228,22 @@ commands.gsmSignal = async function gsmSignal (signalStrengh) {
|
|
|
173
228
|
await this.adb.gsmSignal(signalStrengh);
|
|
174
229
|
};
|
|
175
230
|
|
|
231
|
+
/**
|
|
232
|
+
* @typedef {Object} GsmSignalOptions
|
|
233
|
+
* @property {0|1|2|3|4} strength One of possible signal strength values, where 4 is the best signal.
|
|
234
|
+
*/
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Emulate GSM signal strength change event.
|
|
238
|
+
* Only works on emulators.
|
|
239
|
+
*
|
|
240
|
+
* @param {GsmSignalOptions} opts
|
|
241
|
+
*/
|
|
242
|
+
commands.mobileGsmSignal = async function mobileGsmSignal(opts = {}) {
|
|
243
|
+
const {strength} = requireArgs('strength', opts);
|
|
244
|
+
await this.gsmSignal(strength);
|
|
245
|
+
};
|
|
246
|
+
|
|
176
247
|
commands.gsmVoice = async function gsmVoice (state) {
|
|
177
248
|
if (!this.isEmulator()) {
|
|
178
249
|
this.log.errorAndThrow('gsmVoice method is only available for emulators');
|
|
@@ -180,6 +251,22 @@ commands.gsmVoice = async function gsmVoice (state) {
|
|
|
180
251
|
await this.adb.gsmVoice(state);
|
|
181
252
|
};
|
|
182
253
|
|
|
254
|
+
/**
|
|
255
|
+
* @typedef {Object} GsmVoiceOptions
|
|
256
|
+
* @property {on|off} state
|
|
257
|
+
*/
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Emulate GSM voice state change event.
|
|
261
|
+
* Only works on emulators.
|
|
262
|
+
*
|
|
263
|
+
* @param {GsmVoiceOptions} opts
|
|
264
|
+
*/
|
|
265
|
+
commands.mobileGsmVoice = async function mobileGsmVoice(opts = {}) {
|
|
266
|
+
const {state} = requireArgs('state', opts);
|
|
267
|
+
await this.gsmVoice(state);
|
|
268
|
+
};
|
|
269
|
+
|
|
183
270
|
commands.powerAC = async function powerAC (state) {
|
|
184
271
|
if (!this.isEmulator()) {
|
|
185
272
|
this.log.errorAndThrow('powerAC method is only available for emulators');
|
|
@@ -187,6 +274,22 @@ commands.powerAC = async function powerAC (state) {
|
|
|
187
274
|
await this.adb.powerAC(state);
|
|
188
275
|
};
|
|
189
276
|
|
|
277
|
+
/**
|
|
278
|
+
* @typedef {Object} PowerAcOptions
|
|
279
|
+
* @property {on|off} state
|
|
280
|
+
*/
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Emulate AC power state change.
|
|
284
|
+
* Only works on emulators.
|
|
285
|
+
*
|
|
286
|
+
* @param {GsmVoiceOptions} opts
|
|
287
|
+
*/
|
|
288
|
+
commands.mobilePowerAc = async function mobilePowerAc(opts = {}) {
|
|
289
|
+
const {state} = requireArgs('state', opts);
|
|
290
|
+
await this.powerAC(state);
|
|
291
|
+
};
|
|
292
|
+
|
|
190
293
|
commands.powerCapacity = async function powerCapacity (batteryPercent) {
|
|
191
294
|
if (!this.isEmulator()) {
|
|
192
295
|
this.log.errorAndThrow('powerCapacity method is only available for emulators');
|
|
@@ -194,6 +297,22 @@ commands.powerCapacity = async function powerCapacity (batteryPercent) {
|
|
|
194
297
|
await this.adb.powerCapacity(batteryPercent);
|
|
195
298
|
};
|
|
196
299
|
|
|
300
|
+
/**
|
|
301
|
+
* @typedef {Object} PowerCapacityOptions
|
|
302
|
+
* @property {number} percent - Percentage value in range [0, 100]
|
|
303
|
+
*/
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* Emulate power capacity change.
|
|
307
|
+
* Only works on emulators.
|
|
308
|
+
*
|
|
309
|
+
* @param {PowerCapacityOptions} opts
|
|
310
|
+
*/
|
|
311
|
+
commands.mobilePowerCapacity = async function mobilePowerCapacity(opts = {}) {
|
|
312
|
+
const {percent} = requireArgs('percent', opts);
|
|
313
|
+
await this.powerCapacity(percent);
|
|
314
|
+
};
|
|
315
|
+
|
|
197
316
|
commands.networkSpeed = async function networkSpeed (networkSpeed) {
|
|
198
317
|
if (!this.isEmulator()) {
|
|
199
318
|
this.log.errorAndThrow('networkSpeed method is only available for emulators');
|
|
@@ -201,6 +320,22 @@ commands.networkSpeed = async function networkSpeed (networkSpeed) {
|
|
|
201
320
|
await this.adb.networkSpeed(networkSpeed);
|
|
202
321
|
};
|
|
203
322
|
|
|
323
|
+
/**
|
|
324
|
+
* @typedef {Object} NetworkSpeedOptions
|
|
325
|
+
* @property {gsm|scsd|gprs|edge|umts|hsdpa|lte|evdo|full} speed
|
|
326
|
+
*/
|
|
327
|
+
|
|
328
|
+
/**
|
|
329
|
+
* Emulate different network connection speed modes.
|
|
330
|
+
* Only works on emulators.
|
|
331
|
+
*
|
|
332
|
+
* @param {NetworkSpeedOptions} opts
|
|
333
|
+
*/
|
|
334
|
+
commands.mobileNetworkSpeed = async function mobileNetworkSpeed(opts = {}) {
|
|
335
|
+
const {speed} = requireArgs('speed', opts);
|
|
336
|
+
await this.networkSpeed(speed);
|
|
337
|
+
};
|
|
338
|
+
|
|
204
339
|
/**
|
|
205
340
|
* Emulate sensors values on the connected emulator.
|
|
206
341
|
*
|
package/lib/utils.js
CHANGED
|
@@ -6,9 +6,10 @@ export const ADB_SHELL_FEATURE = 'adb_shell';
|
|
|
6
6
|
/**
|
|
7
7
|
* Assert the presence of particular keys in the given object
|
|
8
8
|
*
|
|
9
|
-
* @
|
|
10
|
-
* @param {
|
|
11
|
-
* @
|
|
9
|
+
* @template {Object} T
|
|
10
|
+
* @param {string|string[]} argNames one or more key names
|
|
11
|
+
* @param {T} opts the object to check
|
|
12
|
+
* @returns {T} the same given object
|
|
12
13
|
*/
|
|
13
14
|
export function requireArgs (argNames, opts = {}) {
|
|
14
15
|
for (const argName of (_.isArray(argNames) ? argNames : [argNames])) {
|