appium-android-driver 5.4.2 → 5.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/build/index.js +1 -9
  2. package/build/lib/android-helpers.js +10 -194
  3. package/build/lib/android-helpers.js.map +1 -1
  4. package/build/lib/bootstrap.js +4 -45
  5. package/build/lib/bootstrap.js.map +1 -1
  6. package/build/lib/commands/actions.js +3 -78
  7. package/build/lib/commands/actions.js.map +1 -1
  8. package/build/lib/commands/alert.js +3 -10
  9. package/build/lib/commands/alert.js.map +1 -1
  10. package/build/lib/commands/app-management.js +4 -32
  11. package/build/lib/commands/app-management.js.map +1 -1
  12. package/build/lib/commands/context.js +6 -78
  13. package/build/lib/commands/context.js.map +1 -1
  14. package/build/lib/commands/coverage.js +1 -6
  15. package/build/lib/commands/coverage.js.map +1 -1
  16. package/build/lib/commands/element.js +4 -47
  17. package/build/lib/commands/element.js.map +1 -1
  18. package/build/lib/commands/emu-console.js +2 -7
  19. package/build/lib/commands/emu-console.js.map +1 -1
  20. package/build/lib/commands/execute.js +1 -13
  21. package/build/lib/commands/execute.js.map +1 -1
  22. package/build/lib/commands/file-actions.js +3 -44
  23. package/build/lib/commands/file-actions.js.map +1 -1
  24. package/build/lib/commands/find.js +3 -16
  25. package/build/lib/commands/find.js.map +1 -1
  26. package/build/lib/commands/general.js +4 -78
  27. package/build/lib/commands/general.js.map +1 -1
  28. package/build/lib/commands/ime.js +3 -14
  29. package/build/lib/commands/ime.js.map +1 -1
  30. package/build/lib/commands/index.js +3 -27
  31. package/build/lib/commands/index.js.map +1 -1
  32. package/build/lib/commands/intent.js +1 -40
  33. package/build/lib/commands/intent.js.map +1 -1
  34. package/build/lib/commands/log.js +3 -35
  35. package/build/lib/commands/log.js.map +1 -1
  36. package/build/lib/commands/media-projection.js +2 -47
  37. package/build/lib/commands/media-projection.js.map +1 -1
  38. package/build/lib/commands/network.js +4 -40
  39. package/build/lib/commands/network.js.map +1 -1
  40. package/build/lib/commands/performance.js +5 -57
  41. package/build/lib/commands/performance.js.map +1 -1
  42. package/build/lib/commands/recordscreen.js +1 -59
  43. package/build/lib/commands/recordscreen.js.map +1 -1
  44. package/build/lib/commands/shell.js +1 -15
  45. package/build/lib/commands/shell.js.map +1 -1
  46. package/build/lib/commands/streamscreen.js +7 -74
  47. package/build/lib/commands/streamscreen.js.map +1 -1
  48. package/build/lib/commands/system-bars.js +1 -23
  49. package/build/lib/commands/system-bars.js.map +1 -1
  50. package/build/lib/commands/touch.js +13 -79
  51. package/build/lib/commands/touch.js.map +1 -1
  52. package/build/lib/desired-caps.js +3 -4
  53. package/build/lib/desired-caps.js.map +1 -1
  54. package/build/lib/driver.js +8 -97
  55. package/build/lib/driver.js.map +1 -1
  56. package/build/lib/logger.js +1 -5
  57. package/build/lib/logger.js.map +1 -1
  58. package/build/lib/uiautomator.js +3 -24
  59. package/build/lib/uiautomator.js.map +1 -1
  60. package/build/lib/unlock-helpers.js +1 -61
  61. package/build/lib/unlock-helpers.js.map +1 -1
  62. package/build/lib/utils.js +1 -7
  63. package/build/lib/utils.js.map +1 -1
  64. package/build/lib/webview-helpers.js +1 -94
  65. package/build/lib/webview-helpers.js.map +1 -1
  66. package/lib/android-helpers.js +2 -1
  67. package/package.json +2 -2
@@ -1,22 +1,15 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.helpers = exports.default = exports.PIN_UNLOCK_KEY_EVENT = exports.PIN_UNLOCK = exports.PATTERN_UNLOCK = exports.PASSWORD_UNLOCK = exports.FINGERPRINT_UNLOCK = void 0;
9
-
10
8
  require("source-map-support/register");
11
-
12
9
  var _logger = _interopRequireDefault(require("./logger"));
13
-
14
10
  var _asyncbox = require("asyncbox");
15
-
16
11
  var _lodash = _interopRequireDefault(require("lodash"));
17
-
18
12
  var _support = require("appium/support");
19
-
20
13
  const PIN_UNLOCK = 'pin';
21
14
  exports.PIN_UNLOCK = PIN_UNLOCK;
22
15
  const PIN_UNLOCK_KEY_EVENT = 'pinWithKeyEvent';
@@ -34,17 +27,14 @@ const INPUT_KEYS_WAIT_TIME = 100;
34
27
  const NUMBER_ZERO_KEYCODE = 7;
35
28
  const helpers = {};
36
29
  exports.helpers = helpers;
37
-
38
30
  helpers.validateUnlockCapabilities = function validateUnlockCapabilities(caps = {}) {
39
31
  const {
40
32
  unlockKey,
41
33
  unlockType
42
34
  } = caps;
43
-
44
35
  if (_lodash.default.isNil(unlockKey) || unlockKey === '') {
45
36
  throw new Error('A non-empty unlock key value must be provided');
46
37
  }
47
-
48
38
  if ([PIN_UNLOCK, PIN_UNLOCK_KEY_EVENT, FINGERPRINT_UNLOCK].includes(unlockType)) {
49
39
  if (!/^[0-9]+$/.test(_lodash.default.trim(unlockKey))) {
50
40
  throw new Error(`Unlock key value '${unlockKey}' must only consist of digits`);
@@ -53,7 +43,6 @@ helpers.validateUnlockCapabilities = function validateUnlockCapabilities(caps =
53
43
  if (!/^[1-9]{2,9}$/.test(_lodash.default.trim(unlockKey))) {
54
44
  throw new Error(`Unlock key value '${unlockKey}' must only include from two to nine digits in range 1..9`);
55
45
  }
56
-
57
46
  if (/([1-9]).*?\1/.test(_lodash.default.trim(unlockKey))) {
58
47
  throw new Error(`Unlock key value '${unlockKey}' must define a valid pattern where repeats are not allowed`);
59
48
  }
@@ -64,27 +53,21 @@ helpers.validateUnlockCapabilities = function validateUnlockCapabilities(caps =
64
53
  } else {
65
54
  throw new Error(`Invalid unlock type '${unlockType}'. ` + `Only the following unlock types are supported: ${UNLOCK_TYPES}`);
66
55
  }
67
-
68
56
  return caps;
69
57
  };
70
-
71
58
  helpers.fastUnlock = async function fastUnlock(adb, opts = {}) {
72
59
  const {
73
60
  credential,
74
61
  credentialType
75
62
  } = opts;
76
-
77
63
  _logger.default.info(`Unlocking the device via ADB using ${credentialType} credential '${credential}'`);
78
-
79
64
  const wasLockEnabled = await adb.isLockEnabled();
80
-
81
65
  if (wasLockEnabled) {
82
66
  await adb.clearLockCredential(credential);
83
67
  await adb.cycleWakeUp();
84
68
  } else {
85
69
  _logger.default.info('No active lock has been detected. Proceeding to the keyguard dismissal');
86
70
  }
87
-
88
71
  try {
89
72
  await adb.dismissKeyguard();
90
73
  } finally {
@@ -93,44 +76,33 @@ helpers.fastUnlock = async function fastUnlock(adb, opts = {}) {
93
76
  }
94
77
  }
95
78
  };
96
-
97
79
  helpers.encodePassword = function encodePassword(key) {
98
80
  return `${key}`.replace(/\s/ig, '%s');
99
81
  };
100
-
101
82
  helpers.stringKeyToArr = function stringKeyToArr(key) {
102
83
  return `${key}`.trim().replace(/\s+/g, '').split(/\s*/);
103
84
  };
104
-
105
85
  helpers.fingerprintUnlock = async function fingerprintUnlock(adb, driver, capabilities) {
106
86
  if ((await adb.getApiLevel()) < 23) {
107
87
  throw new Error('Fingerprint unlock only works for Android 6+ emulators');
108
88
  }
109
-
110
89
  await adb.fingerprint(capabilities.unlockKey);
111
90
  await (0, _asyncbox.sleep)(UNLOCK_WAIT_TIME);
112
91
  };
113
-
114
92
  helpers.pinUnlock = async function pinUnlock(adb, driver, capabilities) {
115
93
  _logger.default.info(`Trying to unlock device using pin ${capabilities.unlockKey}`);
116
-
117
94
  await adb.dismissKeyguard();
118
95
  const keys = helpers.stringKeyToArr(capabilities.unlockKey);
119
-
120
96
  if ((await adb.getApiLevel()) >= 21) {
121
97
  const els = await driver.findElOrEls('id', 'com.android.systemui:id/digit_text', true);
122
-
123
98
  if (_lodash.default.isEmpty(els)) {
124
99
  return await helpers.pinUnlockWithKeyEvent(adb, driver, capabilities);
125
100
  }
126
-
127
101
  const pins = {};
128
-
129
102
  for (const el of els) {
130
103
  const text = await driver.getAttribute('text', _support.util.unwrapElement(el));
131
104
  pins[text] = el;
132
105
  }
133
-
134
106
  for (const pin of keys) {
135
107
  const el = pins[pin];
136
108
  await driver.click(_support.util.unwrapElement(el));
@@ -138,49 +110,38 @@ helpers.pinUnlock = async function pinUnlock(adb, driver, capabilities) {
138
110
  } else {
139
111
  for (const pin of keys) {
140
112
  const el = await driver.findElOrEls('id', `com.android.keyguard:id/key${pin}`, false);
141
-
142
113
  if (el === null) {
143
114
  return await helpers.pinUnlockWithKeyEvent(adb, driver, capabilities);
144
115
  }
145
-
146
116
  await driver.click(_support.util.unwrapElement(el));
147
117
  }
148
118
  }
149
-
150
119
  await waitForUnlock(adb);
151
120
  };
152
121
 
153
122
  async function waitForUnlock(adb) {
154
123
  await (0, _asyncbox.sleep)(UNLOCK_WAIT_TIME);
155
-
156
124
  if (!(await adb.isScreenLocked())) {
157
125
  return;
158
126
  }
159
-
160
127
  await adb.keyevent(KEYCODE_NUMPAD_ENTER);
161
128
  await (0, _asyncbox.sleep)(UNLOCK_WAIT_TIME);
162
129
  }
163
-
164
130
  helpers.pinUnlockWithKeyEvent = async function pinUnlockWithKeyEvent(adb, driver, capabilities) {
165
131
  _logger.default.info(`Trying to unlock device using pin with keycode ${capabilities.unlockKey}`);
166
-
167
132
  await adb.dismissKeyguard();
168
133
  const keys = helpers.stringKeyToArr(capabilities.unlockKey);
169
134
 
170
135
  for (const pin of keys) {
171
136
  await adb.shell(['input', 'keyevent', parseInt(pin, 10) + NUMBER_ZERO_KEYCODE]);
172
137
  }
173
-
174
138
  await waitForUnlock(adb, driver);
175
139
  };
176
-
177
140
  helpers.passwordUnlock = async function passwordUnlock(adb, driver, capabilities) {
178
141
  const {
179
142
  unlockKey
180
143
  } = capabilities;
181
-
182
144
  _logger.default.info(`Trying to unlock device using password ${unlockKey}`);
183
-
184
145
  await adb.dismissKeyguard();
185
146
  const key = helpers.encodePassword(unlockKey);
186
147
  await adb.shell(['input', 'text', key]);
@@ -188,28 +149,21 @@ helpers.passwordUnlock = async function passwordUnlock(adb, driver, capabilities
188
149
  await adb.shell(['input', 'keyevent', KEYCODE_NUMPAD_ENTER]);
189
150
  await waitForUnlock(adb, driver);
190
151
  };
191
-
192
152
  helpers.getPatternKeyPosition = function getPatternKeyPosition(key, initPos, piece) {
193
153
  const cols = 3;
194
154
  const pins = 9;
195
-
196
155
  const xPos = (key, x, piece) => Math.round(x + (key % cols || cols) * piece - piece / 2);
197
-
198
156
  const yPos = (key, y, piece) => Math.round(y + (Math.ceil((key % pins || pins) / cols) * piece - piece / 2));
199
-
200
157
  return {
201
158
  x: xPos(key, initPos.x, piece),
202
159
  y: yPos(key, initPos.y, piece)
203
160
  };
204
161
  };
205
-
206
162
  helpers.getPatternActions = function getPatternActions(keys, initPos, piece) {
207
163
  const actions = [];
208
164
  let lastPos;
209
-
210
165
  for (let key of keys) {
211
166
  const keyPos = helpers.getPatternKeyPosition(key, initPos, piece);
212
-
213
167
  if (key === keys[0]) {
214
168
  actions.push({
215
169
  action: 'press',
@@ -222,43 +176,34 @@ helpers.getPatternActions = function getPatternActions(keys, initPos, piece) {
222
176
  lastPos = keyPos;
223
177
  continue;
224
178
  }
225
-
226
179
  const moveTo = {
227
180
  x: 0,
228
181
  y: 0
229
182
  };
230
183
  const diffX = keyPos.x - lastPos.x;
231
-
232
184
  if (diffX > 0) {
233
185
  moveTo.x = piece;
234
-
235
186
  if (Math.abs(diffX) > piece) {
236
187
  moveTo.x += piece;
237
188
  }
238
189
  } else if (diffX < 0) {
239
190
  moveTo.x = -1 * piece;
240
-
241
191
  if (Math.abs(diffX) > piece) {
242
192
  moveTo.x -= piece;
243
193
  }
244
194
  }
245
-
246
195
  const diffY = keyPos.y - lastPos.y;
247
-
248
196
  if (diffY > 0) {
249
197
  moveTo.y = piece;
250
-
251
198
  if (Math.abs(diffY) > piece) {
252
199
  moveTo.y += piece;
253
200
  }
254
201
  } else if (diffY < 0) {
255
202
  moveTo.y = -1 * piece;
256
-
257
203
  if (Math.abs(diffY) > piece) {
258
204
  moveTo.y -= piece;
259
205
  }
260
206
  }
261
-
262
207
  actions.push({
263
208
  action: 'moveTo',
264
209
  options: {
@@ -269,20 +214,16 @@ helpers.getPatternActions = function getPatternActions(keys, initPos, piece) {
269
214
  });
270
215
  lastPos = keyPos;
271
216
  }
272
-
273
217
  actions.push({
274
218
  action: 'release'
275
219
  });
276
220
  return actions;
277
221
  };
278
-
279
222
  helpers.patternUnlock = async function patternUnlock(adb, driver, capabilities) {
280
223
  const {
281
224
  unlockKey
282
225
  } = capabilities;
283
-
284
226
  _logger.default.info(`Trying to unlock device using pattern ${unlockKey}`);
285
-
286
227
  await adb.dismissKeyguard();
287
228
  const keys = helpers.stringKeyToArr(unlockKey);
288
229
  const apiLevel = await adb.getApiLevel();
@@ -293,7 +234,6 @@ helpers.patternUnlock = async function patternUnlock(adb, driver, capabilities)
293
234
  await driver.performTouch(actions);
294
235
  await (0, _asyncbox.sleep)(UNLOCK_WAIT_TIME);
295
236
  };
296
-
297
237
  helpers.PIN_UNLOCK = PIN_UNLOCK;
298
238
  helpers.PIN_UNLOCK_KEY_EVENT = PIN_UNLOCK_KEY_EVENT;
299
239
  helpers.PASSWORD_UNLOCK = PASSWORD_UNLOCK;
@@ -301,4 +241,4 @@ helpers.PATTERN_UNLOCK = PATTERN_UNLOCK;
301
241
  helpers.FINGERPRINT_UNLOCK = FINGERPRINT_UNLOCK;
302
242
  var _default = helpers;
303
243
  exports.default = _default;
304
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQSU5fVU5MT0NLIiwiUElOX1VOTE9DS19LRVlfRVZFTlQiLCJQQVNTV09SRF9VTkxPQ0siLCJQQVRURVJOX1VOTE9DSyIsIkZJTkdFUlBSSU5UX1VOTE9DSyIsIlVOTE9DS19UWVBFUyIsIktFWUNPREVfTlVNUEFEX0VOVEVSIiwiVU5MT0NLX1dBSVRfVElNRSIsIklOUFVUX0tFWVNfV0FJVF9USU1FIiwiTlVNQkVSX1pFUk9fS0VZQ09ERSIsImhlbHBlcnMiLCJ2YWxpZGF0ZVVubG9ja0NhcGFiaWxpdGllcyIsImNhcHMiLCJ1bmxvY2tLZXkiLCJ1bmxvY2tUeXBlIiwiXyIsImlzTmlsIiwiRXJyb3IiLCJpbmNsdWRlcyIsInRlc3QiLCJ0cmltIiwiZmFzdFVubG9jayIsImFkYiIsIm9wdHMiLCJjcmVkZW50aWFsIiwiY3JlZGVudGlhbFR5cGUiLCJsb2dnZXIiLCJpbmZvIiwid2FzTG9ja0VuYWJsZWQiLCJpc0xvY2tFbmFibGVkIiwiY2xlYXJMb2NrQ3JlZGVudGlhbCIsImN5Y2xlV2FrZVVwIiwiZGlzbWlzc0tleWd1YXJkIiwic2V0TG9ja0NyZWRlbnRpYWwiLCJlbmNvZGVQYXNzd29yZCIsImtleSIsInJlcGxhY2UiLCJzdHJpbmdLZXlUb0FyciIsInNwbGl0IiwiZmluZ2VycHJpbnRVbmxvY2siLCJkcml2ZXIiLCJjYXBhYmlsaXRpZXMiLCJnZXRBcGlMZXZlbCIsImZpbmdlcnByaW50Iiwic2xlZXAiLCJwaW5VbmxvY2siLCJrZXlzIiwiZWxzIiwiZmluZEVsT3JFbHMiLCJpc0VtcHR5IiwicGluVW5sb2NrV2l0aEtleUV2ZW50IiwicGlucyIsImVsIiwidGV4dCIsImdldEF0dHJpYnV0ZSIsInV0aWwiLCJ1bndyYXBFbGVtZW50IiwicGluIiwiY2xpY2siLCJ3YWl0Rm9yVW5sb2NrIiwiaXNTY3JlZW5Mb2NrZWQiLCJrZXlldmVudCIsInNoZWxsIiwicGFyc2VJbnQiLCJwYXNzd29yZFVubG9jayIsImdldFBhdHRlcm5LZXlQb3NpdGlvbiIsImluaXRQb3MiLCJwaWVjZSIsImNvbHMiLCJ4UG9zIiwieCIsIk1hdGgiLCJyb3VuZCIsInlQb3MiLCJ5IiwiY2VpbCIsImdldFBhdHRlcm5BY3Rpb25zIiwiYWN0aW9ucyIsImxhc3RQb3MiLCJrZXlQb3MiLCJwdXNoIiwiYWN0aW9uIiwib3B0aW9ucyIsImVsZW1lbnQiLCJtb3ZlVG8iLCJkaWZmWCIsImFicyIsImRpZmZZIiwicGF0dGVyblVubG9jayIsImFwaUxldmVsIiwiZ2V0TG9jYXRpb24iLCJzaXplIiwiZ2V0U2l6ZSIsIndpZHRoIiwicGVyZm9ybVRvdWNoIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3VubG9jay1oZWxwZXJzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBsb2dnZXIgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgc2xlZXAgfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcblxuY29uc3QgUElOX1VOTE9DSyA9ICdwaW4nO1xuY29uc3QgUElOX1VOTE9DS19LRVlfRVZFTlQgPSAncGluV2l0aEtleUV2ZW50JztcbmNvbnN0IFBBU1NXT1JEX1VOTE9DSyA9ICdwYXNzd29yZCc7XG5jb25zdCBQQVRURVJOX1VOTE9DSyA9ICdwYXR0ZXJuJztcbmNvbnN0IEZJTkdFUlBSSU5UX1VOTE9DSyA9ICdmaW5nZXJwcmludCc7XG5jb25zdCBVTkxPQ0tfVFlQRVMgPSBbXG4gIFBJTl9VTkxPQ0ssIFBJTl9VTkxPQ0tfS0VZX0VWRU5ULCBQQVNTV09SRF9VTkxPQ0ssXG4gIFBBVFRFUk5fVU5MT0NLLCBGSU5HRVJQUklOVF9VTkxPQ0tcbl07XG5jb25zdCBLRVlDT0RFX05VTVBBRF9FTlRFUiA9IDY2O1xuY29uc3QgVU5MT0NLX1dBSVRfVElNRSA9IDEwMDtcbmNvbnN0IElOUFVUX0tFWVNfV0FJVF9USU1FID0gMTAwO1xuY29uc3QgTlVNQkVSX1pFUk9fS0VZQ09ERSA9IDc7XG5cbmNvbnN0IGhlbHBlcnMgPSB7fTtcblxuaGVscGVycy52YWxpZGF0ZVVubG9ja0NhcGFiaWxpdGllcyA9IGZ1bmN0aW9uIHZhbGlkYXRlVW5sb2NrQ2FwYWJpbGl0aWVzIChjYXBzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHVubG9ja0tleSxcbiAgICB1bmxvY2tUeXBlLFxuICB9ID0gY2FwcztcbiAgaWYgKF8uaXNOaWwodW5sb2NrS2V5KSB8fCB1bmxvY2tLZXkgPT09ICcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdBIG5vbi1lbXB0eSB1bmxvY2sga2V5IHZhbHVlIG11c3QgYmUgcHJvdmlkZWQnKTtcbiAgfVxuXG4gIGlmIChbUElOX1VOTE9DSywgUElOX1VOTE9DS19LRVlfRVZFTlQsIEZJTkdFUlBSSU5UX1VOTE9DS10uaW5jbHVkZXModW5sb2NrVHlwZSkpIHtcbiAgICBpZiAoIS9eWzAtOV0rJC8udGVzdChfLnRyaW0odW5sb2NrS2V5KSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5sb2NrIGtleSB2YWx1ZSAnJHt1bmxvY2tLZXl9JyBtdXN0IG9ubHkgY29uc2lzdCBvZiBkaWdpdHNgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodW5sb2NrVHlwZSA9PT0gUEFUVEVSTl9VTkxPQ0spIHtcbiAgICBpZiAoIS9eWzEtOV17Miw5fSQvLnRlc3QoXy50cmltKHVubG9ja0tleSkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVubG9jayBrZXkgdmFsdWUgJyR7dW5sb2NrS2V5fScgbXVzdCBvbmx5IGluY2x1ZGUgZnJvbSB0d28gdG8gbmluZSBkaWdpdHMgaW4gcmFuZ2UgMS4uOWApO1xuICAgIH1cbiAgICBpZiAoLyhbMS05XSkuKj9cXDEvLnRlc3QoXy50cmltKHVubG9ja0tleSkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVubG9jayBrZXkgdmFsdWUgJyR7dW5sb2NrS2V5fScgbXVzdCBkZWZpbmUgYSB2YWxpZCBwYXR0ZXJuIHdoZXJlIHJlcGVhdHMgYXJlIG5vdCBhbGxvd2VkYCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHVubG9ja1R5cGUgPT09IFBBU1NXT1JEX1VOTE9DSykge1xuICAgIC8vIERvbnQgdHJpbSBwYXNzd29yZCBrZXksIHlvdSBjYW4gdXNlIGJsYW5rIHNwYWNlcyBpbiB5b3VyIGFuZHJvaWQgcGFzc3dvcmRcbiAgICAvLyDCr1xcXyjjg4QpXy/Cr1xuICAgIGlmICghLy57NCx9L2cudGVzdCh1bmxvY2tLZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBtaW5pbXVtIGFsbG93ZWQgbGVuZ3RoIG9mIHVubG9jayBrZXkgdmFsdWUgJyR7dW5sb2NrS2V5fScgaXMgNCBjaGFyYWN0ZXJzYCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB1bmxvY2sgdHlwZSAnJHt1bmxvY2tUeXBlfScuIGAgK1xuICAgICAgYE9ubHkgdGhlIGZvbGxvd2luZyB1bmxvY2sgdHlwZXMgYXJlIHN1cHBvcnRlZDogJHtVTkxPQ0tfVFlQRVN9YCk7XG4gIH1cbiAgcmV0dXJuIGNhcHM7XG59O1xuXG5oZWxwZXJzLmZhc3RVbmxvY2sgPSBhc3luYyBmdW5jdGlvbiBmYXN0VW5sb2NrIChhZGIsIG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgY3JlZGVudGlhbCxcbiAgICBjcmVkZW50aWFsVHlwZSxcbiAgfSA9IG9wdHM7XG4gIGxvZ2dlci5pbmZvKGBVbmxvY2tpbmcgdGhlIGRldmljZSB2aWEgQURCIHVzaW5nICR7Y3JlZGVudGlhbFR5cGV9IGNyZWRlbnRpYWwgJyR7Y3JlZGVudGlhbH0nYCk7XG4gIGNvbnN0IHdhc0xvY2tFbmFibGVkID0gYXdhaXQgYWRiLmlzTG9ja0VuYWJsZWQoKTtcbiAgaWYgKHdhc0xvY2tFbmFibGVkKSB7XG4gICAgYXdhaXQgYWRiLmNsZWFyTG9ja0NyZWRlbnRpYWwoY3JlZGVudGlhbCk7XG4gICAgLy8gbm90IHN1cmUgd2h5LCBidXQgdGhlIGRldmljZSdzIHNjcmVlbiBzdGlsbCByZW1haW5zIGxvY2tlZFxuICAgIC8vIGlmIGEgcHJlbGltaW5hcnkgd2FrZSB1cCBjeWNsZSBoYXMgbm90IGJlZW4gcGVyZm9ybWVkXG4gICAgYXdhaXQgYWRiLmN5Y2xlV2FrZVVwKCk7XG4gIH0gZWxzZSB7XG4gICAgbG9nZ2VyLmluZm8oJ05vIGFjdGl2ZSBsb2NrIGhhcyBiZWVuIGRldGVjdGVkLiBQcm9jZWVkaW5nIHRvIHRoZSBrZXlndWFyZCBkaXNtaXNzYWwnKTtcbiAgfVxuICB0cnkge1xuICAgIGF3YWl0IGFkYi5kaXNtaXNzS2V5Z3VhcmQoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAod2FzTG9ja0VuYWJsZWQpIHtcbiAgICAgIGF3YWl0IGFkYi5zZXRMb2NrQ3JlZGVudGlhbChjcmVkZW50aWFsVHlwZSwgY3JlZGVudGlhbCk7XG4gICAgfVxuICB9XG59O1xuXG5oZWxwZXJzLmVuY29kZVBhc3N3b3JkID0gZnVuY3Rpb24gZW5jb2RlUGFzc3dvcmQgKGtleSkge1xuICByZXR1cm4gYCR7a2V5fWAucmVwbGFjZSgvXFxzL2lnLCAnJXMnKTtcbn07XG5cbmhlbHBlcnMuc3RyaW5nS2V5VG9BcnIgPSBmdW5jdGlvbiBzdHJpbmdLZXlUb0FyciAoa2V5KSB7XG4gIHJldHVybiBgJHtrZXl9YC50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnJykuc3BsaXQoL1xccyovKTtcbn07XG5cbmhlbHBlcnMuZmluZ2VycHJpbnRVbmxvY2sgPSBhc3luYyBmdW5jdGlvbiBmaW5nZXJwcmludFVubG9jayAoYWRiLCBkcml2ZXIsIGNhcGFiaWxpdGllcykge1xuICBpZiAoYXdhaXQgYWRiLmdldEFwaUxldmVsKCkgPCAyMykge1xuICAgIHRocm93IG5ldyBFcnJvcignRmluZ2VycHJpbnQgdW5sb2NrIG9ubHkgd29ya3MgZm9yIEFuZHJvaWQgNisgZW11bGF0b3JzJyk7XG4gIH1cbiAgYXdhaXQgYWRiLmZpbmdlcnByaW50KGNhcGFiaWxpdGllcy51bmxvY2tLZXkpO1xuICBhd2FpdCBzbGVlcChVTkxPQ0tfV0FJVF9USU1FKTtcbn07XG5cbmhlbHBlcnMucGluVW5sb2NrID0gYXN5bmMgZnVuY3Rpb24gcGluVW5sb2NrIChhZGIsIGRyaXZlciwgY2FwYWJpbGl0aWVzKSB7XG4gIGxvZ2dlci5pbmZvKGBUcnlpbmcgdG8gdW5sb2NrIGRldmljZSB1c2luZyBwaW4gJHtjYXBhYmlsaXRpZXMudW5sb2NrS2V5fWApO1xuICBhd2FpdCBhZGIuZGlzbWlzc0tleWd1YXJkKCk7XG4gIGNvbnN0IGtleXMgPSBoZWxwZXJzLnN0cmluZ0tleVRvQXJyKGNhcGFiaWxpdGllcy51bmxvY2tLZXkpO1xuICBpZiAoYXdhaXQgYWRiLmdldEFwaUxldmVsKCkgPj0gMjEpIHtcbiAgICBjb25zdCBlbHMgPSBhd2FpdCBkcml2ZXIuZmluZEVsT3JFbHMoJ2lkJywgJ2NvbS5hbmRyb2lkLnN5c3RlbXVpOmlkL2RpZ2l0X3RleHQnLCB0cnVlKTtcbiAgICBpZiAoXy5pc0VtcHR5KGVscykpIHtcbiAgICAgIC8vIGZhbGxiYWNrIHRvIHBpbiB3aXRoIGtleSBldmVudFxuICAgICAgcmV0dXJuIGF3YWl0IGhlbHBlcnMucGluVW5sb2NrV2l0aEtleUV2ZW50KGFkYiwgZHJpdmVyLCBjYXBhYmlsaXRpZXMpO1xuICAgIH1cbiAgICBjb25zdCBwaW5zID0ge307XG4gICAgZm9yIChjb25zdCBlbCBvZiBlbHMpIHtcbiAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCBkcml2ZXIuZ2V0QXR0cmlidXRlKCd0ZXh0JywgdXRpbC51bndyYXBFbGVtZW50KGVsKSk7XG4gICAgICBwaW5zW3RleHRdID0gZWw7XG4gICAgfVxuICAgIGZvciAoY29uc3QgcGluIG9mIGtleXMpIHtcbiAgICAgIGNvbnN0IGVsID0gcGluc1twaW5dO1xuICAgICAgYXdhaXQgZHJpdmVyLmNsaWNrKHV0aWwudW53cmFwRWxlbWVudChlbCkpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGNvbnN0IHBpbiBvZiBrZXlzKSB7XG4gICAgICBjb25zdCBlbCA9IGF3YWl0IGRyaXZlci5maW5kRWxPckVscygnaWQnLCBgY29tLmFuZHJvaWQua2V5Z3VhcmQ6aWQva2V5JHtwaW59YCwgZmFsc2UpO1xuICAgICAgaWYgKGVsID09PSBudWxsKSB7XG4gICAgICAgIC8vIGZhbGxiYWNrIHRvIHBpbiB3aXRoIGtleSBldmVudFxuICAgICAgICByZXR1cm4gYXdhaXQgaGVscGVycy5waW5VbmxvY2tXaXRoS2V5RXZlbnQoYWRiLCBkcml2ZXIsIGNhcGFiaWxpdGllcyk7XG4gICAgICB9XG4gICAgICBhd2FpdCBkcml2ZXIuY2xpY2sodXRpbC51bndyYXBFbGVtZW50KGVsKSk7XG4gICAgfVxuICB9XG4gIGF3YWl0IHdhaXRGb3JVbmxvY2soYWRiKTtcbn07XG5cbi8qKlxuICogV2FpdCBmb3IgdGhlIGRpc3BsYXkgdG8gYmUgdW5sb2NrZWQuXG4gKiBTb21lIGRldmljZXMgYXV0b21hdGljYWxseSBhY2NlcHQgdHlwZWQgJ3BpbicgYW5kICdwYXNzd29yZCcgY29kZVxuICogd2l0aG91dCBwcmVzc2luZyB0aGUgRW50ZXIga2V5LiBCdXQgc29tZSBkZXZpY2VzIG5lZWQgaXQuXG4gKiBUaGlzIG1ldGhvZCB3YWl0cyBhIGZldyBzZWNvbmRzIGZpcnN0IGZvciBzdWNoIGF1dG9tYXRpYyBhY2NlcHRhbmNlIGNhc2UuXG4gKiBJZiB0aGUgZGV2aWNlIGlzIHN0aWxsIGxvY2tlZCwgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHRyeSB0byBzZW5kXG4gKiB0aGUgZW50ZXIga2V5IGNvZGUuXG4gKlxuICogQHBhcmFtIHtBREJ9IGFkYiBUaGUgaW5zdGFuY2Ugb2YgQURCXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JVbmxvY2sgKGFkYikge1xuICBhd2FpdCBzbGVlcChVTkxPQ0tfV0FJVF9USU1FKTtcbiAgaWYgKCFhd2FpdCBhZGIuaXNTY3JlZW5Mb2NrZWQoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IGFkYi5rZXlldmVudChLRVlDT0RFX05VTVBBRF9FTlRFUik7XG4gIGF3YWl0IHNsZWVwKFVOTE9DS19XQUlUX1RJTUUpO1xufVxuXG5oZWxwZXJzLnBpblVubG9ja1dpdGhLZXlFdmVudCA9IGFzeW5jIGZ1bmN0aW9uIHBpblVubG9ja1dpdGhLZXlFdmVudCAoYWRiLCBkcml2ZXIsIGNhcGFiaWxpdGllcykge1xuICBsb2dnZXIuaW5mbyhgVHJ5aW5nIHRvIHVubG9jayBkZXZpY2UgdXNpbmcgcGluIHdpdGgga2V5Y29kZSAke2NhcGFiaWxpdGllcy51bmxvY2tLZXl9YCk7XG4gIGF3YWl0IGFkYi5kaXNtaXNzS2V5Z3VhcmQoKTtcbiAgY29uc3Qga2V5cyA9IGhlbHBlcnMuc3RyaW5nS2V5VG9BcnIoY2FwYWJpbGl0aWVzLnVubG9ja0tleSk7XG5cbiAgLy8gU29tZSBkZXZpY2UgZG9lcyBub3QgaGF2ZSBzeXN0ZW0ga2V5IGlkcyBsaWtlICdjb20uYW5kcm9pZC5rZXlndWFyZDppZC9rZXknXG4gIC8vIFRoZW4sIHNlbmRpbmcga2V5ZXZlbnRzIGFyZSBtb3JlIHJlbGlhYmxlIHRvIHVubG9jayB0aGUgc2NyZWVuLlxuICBmb3IgKGNvbnN0IHBpbiBvZiBrZXlzKSB7XG4gICAgLy8gJ3BpbicgaXMgbnVtYmVyICgwLTkpIGluIHN0cmluZy5cbiAgICAvLyBOdW1iZXIgJzAnIGlzIGtleWNvZGUgJzcnLiBudW1iZXIgJzknIGlzIGtleWNvZGUgJzE2Jy5cbiAgICBhd2FpdCBhZGIuc2hlbGwoWydpbnB1dCcsICdrZXlldmVudCcsIHBhcnNlSW50KHBpbiwgMTApICsgTlVNQkVSX1pFUk9fS0VZQ09ERV0pO1xuICB9XG4gIGF3YWl0IHdhaXRGb3JVbmxvY2soYWRiLCBkcml2ZXIpO1xufTtcblxuaGVscGVycy5wYXNzd29yZFVubG9jayA9IGFzeW5jIGZ1bmN0aW9uIHBhc3N3b3JkVW5sb2NrIChhZGIsIGRyaXZlciwgY2FwYWJpbGl0aWVzKSB7XG4gIGNvbnN0IHsgdW5sb2NrS2V5IH0gPSBjYXBhYmlsaXRpZXM7XG4gIGxvZ2dlci5pbmZvKGBUcnlpbmcgdG8gdW5sb2NrIGRldmljZSB1c2luZyBwYXNzd29yZCAke3VubG9ja0tleX1gKTtcbiAgYXdhaXQgYWRiLmRpc21pc3NLZXlndWFyZCgpO1xuICAvLyBSZXBsYWNlIGJsYW5rIHNwYWNlcyB3aXRoICVzXG4gIGNvbnN0IGtleSA9IGhlbHBlcnMuZW5jb2RlUGFzc3dvcmQodW5sb2NrS2V5KTtcbiAgLy8gV2h5IGFkYiA/IEl0IHdhcyBsZXNzIGZsYWt5XG4gIGF3YWl0IGFkYi5zaGVsbChbJ2lucHV0JywgJ3RleHQnLCBrZXldKTtcbiAgLy8gV2h5IHNsZWVwcyA/IEF2b2lkIHNvbWUgZmxha3luZXNzIHdhaXRpbmcgZm9yIHRoZSBpbnB1dCB0byByZWNlaXZlIHRoZSBrZXlzXG4gIGF3YWl0IHNsZWVwKElOUFVUX0tFWVNfV0FJVF9USU1FKTtcbiAgYXdhaXQgYWRiLnNoZWxsKFsnaW5wdXQnLCAna2V5ZXZlbnQnLCBLRVlDT0RFX05VTVBBRF9FTlRFUl0pO1xuICAvLyBXYWl0cyBhIGJpdCBmb3IgdGhlIGRldmljZSB0byBiZSB1bmxvY2tlZFxuICBhd2FpdCB3YWl0Rm9yVW5sb2NrKGFkYiwgZHJpdmVyKTtcbn07XG5cbmhlbHBlcnMuZ2V0UGF0dGVybktleVBvc2l0aW9uID0gZnVuY3Rpb24gZ2V0UGF0dGVybktleVBvc2l0aW9uIChrZXksIGluaXRQb3MsIHBpZWNlKSB7XG4gIC8qXG4gIEhvdyB0aGUgbWF0aCB3b3JrczpcbiAgV2UgaGF2ZSA5IGJ1dHRvbnMgZGl2aWRlZCBpbiAzIGNvbHVtbnMgYW5kIDMgcm93cyBpbnNpZGUgdGhlIGxvY2tQYXR0ZXJuVmlldyxcbiAgZXZlcnkgYnV0dG9uIGhhcyBhIHBvc2l0aW9uIG9uIHRoZSBzY3JlZW4gY29ycmVzcG9uZGluZyB0byB0aGUgbG9ja1BhdHRlcm5WaWV3IHNpbmNlXG4gIGl0IGlzIHRoZSBwYXJlbnQgdmlldyByaWdodCBhdCB0aGUgbWlkZGxlIG9mIGVhY2ggY29sdW1uIG9yIHJvdy5cbiAgKi9cbiAgY29uc3QgY29scyA9IDM7XG4gIGNvbnN0IHBpbnMgPSA5O1xuICBjb25zdCB4UG9zID0gKGtleSwgeCwgcGllY2UpID0+IE1hdGgucm91bmQoeCArICgoa2V5ICUgY29scykgfHwgY29scykgKiBwaWVjZSAtIHBpZWNlIC8gMik7XG4gIGNvbnN0IHlQb3MgPSAoa2V5LCB5LCBwaWVjZSkgPT4gTWF0aC5yb3VuZCh5ICsgKE1hdGguY2VpbCgoKGtleSAlIHBpbnMpIHx8IHBpbnMpIC8gY29scykgKiBwaWVjZSAtIHBpZWNlIC8gMikpO1xuICByZXR1cm4ge1xuICAgIHg6IHhQb3Moa2V5LCBpbml0UG9zLngsIHBpZWNlKSxcbiAgICB5OiB5UG9zKGtleSwgaW5pdFBvcy55LCBwaWVjZSlcbiAgfTtcbn07XG5cbmhlbHBlcnMuZ2V0UGF0dGVybkFjdGlvbnMgPSBmdW5jdGlvbiBnZXRQYXR0ZXJuQWN0aW9ucyAoa2V5cywgaW5pdFBvcywgcGllY2UpIHtcbiAgY29uc3QgYWN0aW9ucyA9IFtdO1xuICBsZXQgbGFzdFBvcztcbiAgZm9yIChsZXQga2V5IG9mIGtleXMpIHtcbiAgICBjb25zdCBrZXlQb3MgPSBoZWxwZXJzLmdldFBhdHRlcm5LZXlQb3NpdGlvbihrZXksIGluaXRQb3MsIHBpZWNlKTtcbiAgICBpZiAoa2V5ID09PSBrZXlzWzBdKSB7XG4gICAgICBhY3Rpb25zLnB1c2goe2FjdGlvbjogJ3ByZXNzJywgb3B0aW9uczoge2VsZW1lbnQ6IG51bGwsIHg6IGtleVBvcy54LCB5OiBrZXlQb3MueX19KTtcbiAgICAgIGxhc3RQb3MgPSBrZXlQb3M7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgbW92ZVRvID0ge3g6IDAsIHk6IDB9O1xuICAgIGNvbnN0IGRpZmZYID0ga2V5UG9zLnggLSBsYXN0UG9zLng7XG4gICAgaWYgKGRpZmZYID4gMCkge1xuICAgICAgbW92ZVRvLnggPSBwaWVjZTtcbiAgICAgIGlmIChNYXRoLmFicyhkaWZmWCkgPiBwaWVjZSkge1xuICAgICAgICBtb3ZlVG8ueCArPSBwaWVjZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRpZmZYIDwgMCkge1xuICAgICAgbW92ZVRvLnggPSAtMSAqIHBpZWNlO1xuICAgICAgaWYgKE1hdGguYWJzKGRpZmZYKSA+IHBpZWNlKSB7XG4gICAgICAgIG1vdmVUby54IC09IHBpZWNlO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBkaWZmWSA9IGtleVBvcy55IC0gbGFzdFBvcy55O1xuICAgIGlmIChkaWZmWSA+IDApIHtcbiAgICAgIG1vdmVUby55ID0gcGllY2U7XG4gICAgICBpZiAoTWF0aC5hYnMoZGlmZlkpID4gcGllY2UpIHtcbiAgICAgICAgbW92ZVRvLnkgKz0gcGllY2U7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChkaWZmWSA8IDApIHtcbiAgICAgIG1vdmVUby55ID0gLTEgKiBwaWVjZTtcbiAgICAgIGlmIChNYXRoLmFicyhkaWZmWSkgPiBwaWVjZSkge1xuICAgICAgICBtb3ZlVG8ueSAtPSBwaWVjZTtcbiAgICAgIH1cbiAgICB9XG4gICAgYWN0aW9ucy5wdXNoKHtcbiAgICAgIGFjdGlvbjogJ21vdmVUbycsXG4gICAgICBvcHRpb25zOiB7ZWxlbWVudDogbnVsbCwgeDogbW92ZVRvLnggKyBsYXN0UG9zLngsIHk6IG1vdmVUby55ICsgbGFzdFBvcy55fVxuICAgIH0pO1xuICAgIGxhc3RQb3MgPSBrZXlQb3M7XG4gIH1cbiAgYWN0aW9ucy5wdXNoKHthY3Rpb246ICdyZWxlYXNlJ30pO1xuICByZXR1cm4gYWN0aW9ucztcbn07XG5cbmhlbHBlcnMucGF0dGVyblVubG9jayA9IGFzeW5jIGZ1bmN0aW9uIHBhdHRlcm5VbmxvY2sgKGFkYiwgZHJpdmVyLCBjYXBhYmlsaXRpZXMpIHtcbiAgY29uc3QgeyB1bmxvY2tLZXkgfSA9IGNhcGFiaWxpdGllcztcbiAgbG9nZ2VyLmluZm8oYFRyeWluZyB0byB1bmxvY2sgZGV2aWNlIHVzaW5nIHBhdHRlcm4gJHt1bmxvY2tLZXl9YCk7XG4gIGF3YWl0IGFkYi5kaXNtaXNzS2V5Z3VhcmQoKTtcbiAgY29uc3Qga2V5cyA9IGhlbHBlcnMuc3RyaW5nS2V5VG9BcnIodW5sb2NrS2V5KTtcbiAgLyogV2Ugc2V0IHRoZSBkZXZpY2UgcGF0dGVybiBidXR0b25zIGFzIG51bWJlciBvZiBhIHJlZ3VsYXIgcGhvbmVcbiAgICogIHwg4oCiIOKAoiDigKIgfCAgICAgfCAxIDIgMyB8XG4gICAqICB8IOKAoiDigKIg4oCiIHwgLS0+IHwgNCA1IDYgfFxuICAgKiAgfCDigKIg4oCiIOKAoiB8ICAgICB8IDcgOCA5IHxcblxuICBUaGUgcGF0dGVybiB2aWV3IGJ1dHRvbnMgYXJlIG5vdCBzZWVpbmcgYnkgdGhlIHVpYXV0b21hdG9yIHNpbmNlIHRoZXkgYXJlXG4gIGluY2x1ZGVkIGluc2lkZSBhIEZyYW1lTGF5b3V0LCBzbyB3ZSBhcmUgZ29pbmcgdG8gdHJ5IGNsaWNraW5nIG9uIHRoZSBidXR0b25zXG4gIHVzaW5nIHRoZSBwYXJlbnQgdmlldyBib3VuZHMgYW5kIG1hdGguXG4gICovXG4gIGNvbnN0IGFwaUxldmVsID0gYXdhaXQgYWRiLmdldEFwaUxldmVsKCk7XG4gIGNvbnN0IGVsID0gYXdhaXQgZHJpdmVyLmZpbmRFbE9yRWxzKCdpZCcsXG4gICAgYGNvbS5hbmRyb2lkLiR7YXBpTGV2ZWwgPj0gMjEgPyAnc3lzdGVtdWknIDogJ2tleWd1YXJkJ306aWQvbG9ja1BhdHRlcm5WaWV3YCxcbiAgICBmYWxzZVxuICApO1xuICBjb25zdCBpbml0UG9zID0gYXdhaXQgZHJpdmVyLmdldExvY2F0aW9uKHV0aWwudW53cmFwRWxlbWVudChlbCkpO1xuICBjb25zdCBzaXplID0gYXdhaXQgZHJpdmVyLmdldFNpemUodXRpbC51bndyYXBFbGVtZW50KGVsKSk7XG4gIC8vIEdldCBhY3Rpb25zIHRvIHBlcmZvcm1cbiAgY29uc3QgYWN0aW9ucyA9IGhlbHBlcnMuZ2V0UGF0dGVybkFjdGlvbnMoa2V5cywgaW5pdFBvcywgc2l6ZS53aWR0aCAvIDMpO1xuICAvLyBQZXJmb3JtIGdlc3R1cmVcbiAgYXdhaXQgZHJpdmVyLnBlcmZvcm1Ub3VjaChhY3Rpb25zKTtcbiAgLy8gV2FpdHMgYSBiaXQgZm9yIHRoZSBkZXZpY2UgdG8gYmUgdW5sb2NrZWRcbiAgYXdhaXQgc2xlZXAoVU5MT0NLX1dBSVRfVElNRSk7XG59O1xuXG5oZWxwZXJzLlBJTl9VTkxPQ0sgPSBQSU5fVU5MT0NLO1xuaGVscGVycy5QSU5fVU5MT0NLX0tFWV9FVkVOVCA9IFBJTl9VTkxPQ0tfS0VZX0VWRU5UO1xuaGVscGVycy5QQVNTV09SRF9VTkxPQ0sgPSBQQVNTV09SRF9VTkxPQ0s7XG5oZWxwZXJzLlBBVFRFUk5fVU5MT0NLID0gUEFUVEVSTl9VTkxPQ0s7XG5oZWxwZXJzLkZJTkdFUlBSSU5UX1VOTE9DSyA9IEZJTkdFUlBSSU5UX1VOTE9DSztcblxuZXhwb3J0IHtcbiAgUElOX1VOTE9DSywgUElOX1VOTE9DS19LRVlfRVZFTlQsIFBBU1NXT1JEX1VOTE9DSywgUEFUVEVSTl9VTkxPQ0ssXG4gIEZJTkdFUlBSSU5UX1VOTE9DSywgaGVscGVyc1xufTtcbmV4cG9ydCBkZWZhdWx0IGhlbHBlcnM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsVUFBVSxHQUFHLEtBQW5COztBQUNBLE1BQU1DLG9CQUFvQixHQUFHLGlCQUE3Qjs7QUFDQSxNQUFNQyxlQUFlLEdBQUcsVUFBeEI7O0FBQ0EsTUFBTUMsY0FBYyxHQUFHLFNBQXZCOztBQUNBLE1BQU1DLGtCQUFrQixHQUFHLGFBQTNCOztBQUNBLE1BQU1DLFlBQVksR0FBRyxDQUNuQkwsVUFEbUIsRUFDUEMsb0JBRE8sRUFDZUMsZUFEZixFQUVuQkMsY0FGbUIsRUFFSEMsa0JBRkcsQ0FBckI7QUFJQSxNQUFNRSxvQkFBb0IsR0FBRyxFQUE3QjtBQUNBLE1BQU1DLGdCQUFnQixHQUFHLEdBQXpCO0FBQ0EsTUFBTUMsb0JBQW9CLEdBQUcsR0FBN0I7QUFDQSxNQUFNQyxtQkFBbUIsR0FBRyxDQUE1QjtBQUVBLE1BQU1DLE9BQU8sR0FBRyxFQUFoQjs7O0FBRUFBLE9BQU8sQ0FBQ0MsMEJBQVIsR0FBcUMsU0FBU0EsMEJBQVQsQ0FBcUNDLElBQUksR0FBRyxFQUE1QyxFQUFnRDtFQUNuRixNQUFNO0lBQ0pDLFNBREk7SUFFSkM7RUFGSSxJQUdGRixJQUhKOztFQUlBLElBQUlHLGVBQUEsQ0FBRUMsS0FBRixDQUFRSCxTQUFSLEtBQXNCQSxTQUFTLEtBQUssRUFBeEMsRUFBNEM7SUFDMUMsTUFBTSxJQUFJSSxLQUFKLENBQVUsK0NBQVYsQ0FBTjtFQUNEOztFQUVELElBQUksQ0FBQ2pCLFVBQUQsRUFBYUMsb0JBQWIsRUFBbUNHLGtCQUFuQyxFQUF1RGMsUUFBdkQsQ0FBZ0VKLFVBQWhFLENBQUosRUFBaUY7SUFDL0UsSUFBSSxDQUFDLFdBQVdLLElBQVgsQ0FBZ0JKLGVBQUEsQ0FBRUssSUFBRixDQUFPUCxTQUFQLENBQWhCLENBQUwsRUFBeUM7TUFDdkMsTUFBTSxJQUFJSSxLQUFKLENBQVcscUJBQW9CSixTQUFVLCtCQUF6QyxDQUFOO0lBQ0Q7RUFDRixDQUpELE1BSU8sSUFBSUMsVUFBVSxLQUFLWCxjQUFuQixFQUFtQztJQUN4QyxJQUFJLENBQUMsZUFBZWdCLElBQWYsQ0FBb0JKLGVBQUEsQ0FBRUssSUFBRixDQUFPUCxTQUFQLENBQXBCLENBQUwsRUFBNkM7TUFDM0MsTUFBTSxJQUFJSSxLQUFKLENBQVcscUJBQW9CSixTQUFVLDJEQUF6QyxDQUFOO0lBQ0Q7O0lBQ0QsSUFBSSxlQUFlTSxJQUFmLENBQW9CSixlQUFBLENBQUVLLElBQUYsQ0FBT1AsU0FBUCxDQUFwQixDQUFKLEVBQTRDO01BQzFDLE1BQU0sSUFBSUksS0FBSixDQUFXLHFCQUFvQkosU0FBVSw2REFBekMsQ0FBTjtJQUNEO0VBQ0YsQ0FQTSxNQU9BLElBQUlDLFVBQVUsS0FBS1osZUFBbkIsRUFBb0M7SUFHekMsSUFBSSxDQUFDLFNBQVNpQixJQUFULENBQWNOLFNBQWQsQ0FBTCxFQUErQjtNQUM3QixNQUFNLElBQUlJLEtBQUosQ0FBVyxtREFBa0RKLFNBQVUsbUJBQXZFLENBQU47SUFDRDtFQUNGLENBTk0sTUFNQTtJQUNMLE1BQU0sSUFBSUksS0FBSixDQUFXLHdCQUF1QkgsVUFBVyxLQUFuQyxHQUNiLGtEQUFpRFQsWUFBYSxFQUQzRCxDQUFOO0VBRUQ7O0VBQ0QsT0FBT08sSUFBUDtBQUNELENBL0JEOztBQWlDQUYsT0FBTyxDQUFDVyxVQUFSLEdBQXFCLGVBQWVBLFVBQWYsQ0FBMkJDLEdBQTNCLEVBQWdDQyxJQUFJLEdBQUcsRUFBdkMsRUFBMkM7RUFDOUQsTUFBTTtJQUNKQyxVQURJO0lBRUpDO0VBRkksSUFHRkYsSUFISjs7RUFJQUcsZUFBQSxDQUFPQyxJQUFQLENBQWEsc0NBQXFDRixjQUFlLGdCQUFlRCxVQUFXLEdBQTNGOztFQUNBLE1BQU1JLGNBQWMsR0FBRyxNQUFNTixHQUFHLENBQUNPLGFBQUosRUFBN0I7O0VBQ0EsSUFBSUQsY0FBSixFQUFvQjtJQUNsQixNQUFNTixHQUFHLENBQUNRLG1CQUFKLENBQXdCTixVQUF4QixDQUFOO0lBR0EsTUFBTUYsR0FBRyxDQUFDUyxXQUFKLEVBQU47RUFDRCxDQUxELE1BS087SUFDTEwsZUFBQSxDQUFPQyxJQUFQLENBQVksd0VBQVo7RUFDRDs7RUFDRCxJQUFJO0lBQ0YsTUFBTUwsR0FBRyxDQUFDVSxlQUFKLEVBQU47RUFDRCxDQUZELFNBRVU7SUFDUixJQUFJSixjQUFKLEVBQW9CO01BQ2xCLE1BQU1OLEdBQUcsQ0FBQ1csaUJBQUosQ0FBc0JSLGNBQXRCLEVBQXNDRCxVQUF0QyxDQUFOO0lBQ0Q7RUFDRjtBQUNGLENBdEJEOztBQXdCQWQsT0FBTyxDQUFDd0IsY0FBUixHQUF5QixTQUFTQSxjQUFULENBQXlCQyxHQUF6QixFQUE4QjtFQUNyRCxPQUFRLEdBQUVBLEdBQUksRUFBUCxDQUFTQyxPQUFULENBQWlCLE1BQWpCLEVBQXlCLElBQXpCLENBQVA7QUFDRCxDQUZEOztBQUlBMUIsT0FBTyxDQUFDMkIsY0FBUixHQUF5QixTQUFTQSxjQUFULENBQXlCRixHQUF6QixFQUE4QjtFQUNyRCxPQUFRLEdBQUVBLEdBQUksRUFBUCxDQUFTZixJQUFULEdBQWdCZ0IsT0FBaEIsQ0FBd0IsTUFBeEIsRUFBZ0MsRUFBaEMsRUFBb0NFLEtBQXBDLENBQTBDLEtBQTFDLENBQVA7QUFDRCxDQUZEOztBQUlBNUIsT0FBTyxDQUFDNkIsaUJBQVIsR0FBNEIsZUFBZUEsaUJBQWYsQ0FBa0NqQixHQUFsQyxFQUF1Q2tCLE1BQXZDLEVBQStDQyxZQUEvQyxFQUE2RDtFQUN2RixJQUFJLE9BQU1uQixHQUFHLENBQUNvQixXQUFKLEVBQU4sSUFBMEIsRUFBOUIsRUFBa0M7SUFDaEMsTUFBTSxJQUFJekIsS0FBSixDQUFVLHdEQUFWLENBQU47RUFDRDs7RUFDRCxNQUFNSyxHQUFHLENBQUNxQixXQUFKLENBQWdCRixZQUFZLENBQUM1QixTQUE3QixDQUFOO0VBQ0EsTUFBTSxJQUFBK0IsZUFBQSxFQUFNckMsZ0JBQU4sQ0FBTjtBQUNELENBTkQ7O0FBUUFHLE9BQU8sQ0FBQ21DLFNBQVIsR0FBb0IsZUFBZUEsU0FBZixDQUEwQnZCLEdBQTFCLEVBQStCa0IsTUFBL0IsRUFBdUNDLFlBQXZDLEVBQXFEO0VBQ3ZFZixlQUFBLENBQU9DLElBQVAsQ0FBYSxxQ0FBb0NjLFlBQVksQ0FBQzVCLFNBQVUsRUFBeEU7O0VBQ0EsTUFBTVMsR0FBRyxDQUFDVSxlQUFKLEVBQU47RUFDQSxNQUFNYyxJQUFJLEdBQUdwQyxPQUFPLENBQUMyQixjQUFSLENBQXVCSSxZQUFZLENBQUM1QixTQUFwQyxDQUFiOztFQUNBLElBQUksT0FBTVMsR0FBRyxDQUFDb0IsV0FBSixFQUFOLEtBQTJCLEVBQS9CLEVBQW1DO0lBQ2pDLE1BQU1LLEdBQUcsR0FBRyxNQUFNUCxNQUFNLENBQUNRLFdBQVAsQ0FBbUIsSUFBbkIsRUFBeUIsb0NBQXpCLEVBQStELElBQS9ELENBQWxCOztJQUNBLElBQUlqQyxlQUFBLENBQUVrQyxPQUFGLENBQVVGLEdBQVYsQ0FBSixFQUFvQjtNQUVsQixPQUFPLE1BQU1yQyxPQUFPLENBQUN3QyxxQkFBUixDQUE4QjVCLEdBQTlCLEVBQW1Da0IsTUFBbkMsRUFBMkNDLFlBQTNDLENBQWI7SUFDRDs7SUFDRCxNQUFNVSxJQUFJLEdBQUcsRUFBYjs7SUFDQSxLQUFLLE1BQU1DLEVBQVgsSUFBaUJMLEdBQWpCLEVBQXNCO01BQ3BCLE1BQU1NLElBQUksR0FBRyxNQUFNYixNQUFNLENBQUNjLFlBQVAsQ0FBb0IsTUFBcEIsRUFBNEJDLGFBQUEsQ0FBS0MsYUFBTCxDQUFtQkosRUFBbkIsQ0FBNUIsQ0FBbkI7TUFDQUQsSUFBSSxDQUFDRSxJQUFELENBQUosR0FBYUQsRUFBYjtJQUNEOztJQUNELEtBQUssTUFBTUssR0FBWCxJQUFrQlgsSUFBbEIsRUFBd0I7TUFDdEIsTUFBTU0sRUFBRSxHQUFHRCxJQUFJLENBQUNNLEdBQUQsQ0FBZjtNQUNBLE1BQU1qQixNQUFNLENBQUNrQixLQUFQLENBQWFILGFBQUEsQ0FBS0MsYUFBTCxDQUFtQkosRUFBbkIsQ0FBYixDQUFOO0lBQ0Q7RUFDRixDQWZELE1BZU87SUFDTCxLQUFLLE1BQU1LLEdBQVgsSUFBa0JYLElBQWxCLEVBQXdCO01BQ3RCLE1BQU1NLEVBQUUsR0FBRyxNQUFNWixNQUFNLENBQUNRLFdBQVAsQ0FBbUIsSUFBbkIsRUFBMEIsOEJBQTZCUyxHQUFJLEVBQTNELEVBQThELEtBQTlELENBQWpCOztNQUNBLElBQUlMLEVBQUUsS0FBSyxJQUFYLEVBQWlCO1FBRWYsT0FBTyxNQUFNMUMsT0FBTyxDQUFDd0MscUJBQVIsQ0FBOEI1QixHQUE5QixFQUFtQ2tCLE1BQW5DLEVBQTJDQyxZQUEzQyxDQUFiO01BQ0Q7O01BQ0QsTUFBTUQsTUFBTSxDQUFDa0IsS0FBUCxDQUFhSCxhQUFBLENBQUtDLGFBQUwsQ0FBbUJKLEVBQW5CLENBQWIsQ0FBTjtJQUNEO0VBQ0Y7O0VBQ0QsTUFBTU8sYUFBYSxDQUFDckMsR0FBRCxDQUFuQjtBQUNELENBOUJEOztBQTBDQSxlQUFlcUMsYUFBZixDQUE4QnJDLEdBQTlCLEVBQW1DO0VBQ2pDLE1BQU0sSUFBQXNCLGVBQUEsRUFBTXJDLGdCQUFOLENBQU47O0VBQ0EsSUFBSSxFQUFDLE1BQU1lLEdBQUcsQ0FBQ3NDLGNBQUosRUFBUCxDQUFKLEVBQWlDO0lBQy9CO0VBQ0Q7O0VBRUQsTUFBTXRDLEdBQUcsQ0FBQ3VDLFFBQUosQ0FBYXZELG9CQUFiLENBQU47RUFDQSxNQUFNLElBQUFzQyxlQUFBLEVBQU1yQyxnQkFBTixDQUFOO0FBQ0Q7O0FBRURHLE9BQU8sQ0FBQ3dDLHFCQUFSLEdBQWdDLGVBQWVBLHFCQUFmLENBQXNDNUIsR0FBdEMsRUFBMkNrQixNQUEzQyxFQUFtREMsWUFBbkQsRUFBaUU7RUFDL0ZmLGVBQUEsQ0FBT0MsSUFBUCxDQUFhLGtEQUFpRGMsWUFBWSxDQUFDNUIsU0FBVSxFQUFyRjs7RUFDQSxNQUFNUyxHQUFHLENBQUNVLGVBQUosRUFBTjtFQUNBLE1BQU1jLElBQUksR0FBR3BDLE9BQU8sQ0FBQzJCLGNBQVIsQ0FBdUJJLFlBQVksQ0FBQzVCLFNBQXBDLENBQWI7O0VBSUEsS0FBSyxNQUFNNEMsR0FBWCxJQUFrQlgsSUFBbEIsRUFBd0I7SUFHdEIsTUFBTXhCLEdBQUcsQ0FBQ3dDLEtBQUosQ0FBVSxDQUFDLE9BQUQsRUFBVSxVQUFWLEVBQXNCQyxRQUFRLENBQUNOLEdBQUQsRUFBTSxFQUFOLENBQVIsR0FBb0JoRCxtQkFBMUMsQ0FBVixDQUFOO0VBQ0Q7O0VBQ0QsTUFBTWtELGFBQWEsQ0FBQ3JDLEdBQUQsRUFBTWtCLE1BQU4sQ0FBbkI7QUFDRCxDQWJEOztBQWVBOUIsT0FBTyxDQUFDc0QsY0FBUixHQUF5QixlQUFlQSxjQUFmLENBQStCMUMsR0FBL0IsRUFBb0NrQixNQUFwQyxFQUE0Q0MsWUFBNUMsRUFBMEQ7RUFDakYsTUFBTTtJQUFFNUI7RUFBRixJQUFnQjRCLFlBQXRCOztFQUNBZixlQUFBLENBQU9DLElBQVAsQ0FBYSwwQ0FBeUNkLFNBQVUsRUFBaEU7O0VBQ0EsTUFBTVMsR0FBRyxDQUFDVSxlQUFKLEVBQU47RUFFQSxNQUFNRyxHQUFHLEdBQUd6QixPQUFPLENBQUN3QixjQUFSLENBQXVCckIsU0FBdkIsQ0FBWjtFQUVBLE1BQU1TLEdBQUcsQ0FBQ3dDLEtBQUosQ0FBVSxDQUFDLE9BQUQsRUFBVSxNQUFWLEVBQWtCM0IsR0FBbEIsQ0FBVixDQUFOO0VBRUEsTUFBTSxJQUFBUyxlQUFBLEVBQU1wQyxvQkFBTixDQUFOO0VBQ0EsTUFBTWMsR0FBRyxDQUFDd0MsS0FBSixDQUFVLENBQUMsT0FBRCxFQUFVLFVBQVYsRUFBc0J4RCxvQkFBdEIsQ0FBVixDQUFOO0VBRUEsTUFBTXFELGFBQWEsQ0FBQ3JDLEdBQUQsRUFBTWtCLE1BQU4sQ0FBbkI7QUFDRCxDQWJEOztBQWVBOUIsT0FBTyxDQUFDdUQscUJBQVIsR0FBZ0MsU0FBU0EscUJBQVQsQ0FBZ0M5QixHQUFoQyxFQUFxQytCLE9BQXJDLEVBQThDQyxLQUE5QyxFQUFxRDtFQU9uRixNQUFNQyxJQUFJLEdBQUcsQ0FBYjtFQUNBLE1BQU1qQixJQUFJLEdBQUcsQ0FBYjs7RUFDQSxNQUFNa0IsSUFBSSxHQUFHLENBQUNsQyxHQUFELEVBQU1tQyxDQUFOLEVBQVNILEtBQVQsS0FBbUJJLElBQUksQ0FBQ0MsS0FBTCxDQUFXRixDQUFDLEdBQUcsQ0FBRW5DLEdBQUcsR0FBR2lDLElBQVAsSUFBZ0JBLElBQWpCLElBQXlCRCxLQUE3QixHQUFxQ0EsS0FBSyxHQUFHLENBQXhELENBQWhDOztFQUNBLE1BQU1NLElBQUksR0FBRyxDQUFDdEMsR0FBRCxFQUFNdUMsQ0FBTixFQUFTUCxLQUFULEtBQW1CSSxJQUFJLENBQUNDLEtBQUwsQ0FBV0UsQ0FBQyxJQUFJSCxJQUFJLENBQUNJLElBQUwsQ0FBVSxDQUFFeEMsR0FBRyxHQUFHZ0IsSUFBUCxJQUFnQkEsSUFBakIsSUFBeUJpQixJQUFuQyxJQUEyQ0QsS0FBM0MsR0FBbURBLEtBQUssR0FBRyxDQUEvRCxDQUFaLENBQWhDOztFQUNBLE9BQU87SUFDTEcsQ0FBQyxFQUFFRCxJQUFJLENBQUNsQyxHQUFELEVBQU0rQixPQUFPLENBQUNJLENBQWQsRUFBaUJILEtBQWpCLENBREY7SUFFTE8sQ0FBQyxFQUFFRCxJQUFJLENBQUN0QyxHQUFELEVBQU0rQixPQUFPLENBQUNRLENBQWQsRUFBaUJQLEtBQWpCO0VBRkYsQ0FBUDtBQUlELENBZkQ7O0FBaUJBekQsT0FBTyxDQUFDa0UsaUJBQVIsR0FBNEIsU0FBU0EsaUJBQVQsQ0FBNEI5QixJQUE1QixFQUFrQ29CLE9BQWxDLEVBQTJDQyxLQUEzQyxFQUFrRDtFQUM1RSxNQUFNVSxPQUFPLEdBQUcsRUFBaEI7RUFDQSxJQUFJQyxPQUFKOztFQUNBLEtBQUssSUFBSTNDLEdBQVQsSUFBZ0JXLElBQWhCLEVBQXNCO0lBQ3BCLE1BQU1pQyxNQUFNLEdBQUdyRSxPQUFPLENBQUN1RCxxQkFBUixDQUE4QjlCLEdBQTlCLEVBQW1DK0IsT0FBbkMsRUFBNENDLEtBQTVDLENBQWY7O0lBQ0EsSUFBSWhDLEdBQUcsS0FBS1csSUFBSSxDQUFDLENBQUQsQ0FBaEIsRUFBcUI7TUFDbkIrQixPQUFPLENBQUNHLElBQVIsQ0FBYTtRQUFDQyxNQUFNLEVBQUUsT0FBVDtRQUFrQkMsT0FBTyxFQUFFO1VBQUNDLE9BQU8sRUFBRSxJQUFWO1VBQWdCYixDQUFDLEVBQUVTLE1BQU0sQ0FBQ1QsQ0FBMUI7VUFBNkJJLENBQUMsRUFBRUssTUFBTSxDQUFDTDtRQUF2QztNQUEzQixDQUFiO01BQ0FJLE9BQU8sR0FBR0MsTUFBVjtNQUNBO0lBQ0Q7O0lBQ0QsTUFBTUssTUFBTSxHQUFHO01BQUNkLENBQUMsRUFBRSxDQUFKO01BQU9JLENBQUMsRUFBRTtJQUFWLENBQWY7SUFDQSxNQUFNVyxLQUFLLEdBQUdOLE1BQU0sQ0FBQ1QsQ0FBUCxHQUFXUSxPQUFPLENBQUNSLENBQWpDOztJQUNBLElBQUllLEtBQUssR0FBRyxDQUFaLEVBQWU7TUFDYkQsTUFBTSxDQUFDZCxDQUFQLEdBQVdILEtBQVg7O01BQ0EsSUFBSUksSUFBSSxDQUFDZSxHQUFMLENBQVNELEtBQVQsSUFBa0JsQixLQUF0QixFQUE2QjtRQUMzQmlCLE1BQU0sQ0FBQ2QsQ0FBUCxJQUFZSCxLQUFaO01BQ0Q7SUFDRixDQUxELE1BS08sSUFBSWtCLEtBQUssR0FBRyxDQUFaLEVBQWU7TUFDcEJELE1BQU0sQ0FBQ2QsQ0FBUCxHQUFXLENBQUMsQ0FBRCxHQUFLSCxLQUFoQjs7TUFDQSxJQUFJSSxJQUFJLENBQUNlLEdBQUwsQ0FBU0QsS0FBVCxJQUFrQmxCLEtBQXRCLEVBQTZCO1FBQzNCaUIsTUFBTSxDQUFDZCxDQUFQLElBQVlILEtBQVo7TUFDRDtJQUNGOztJQUNELE1BQU1vQixLQUFLLEdBQUdSLE1BQU0sQ0FBQ0wsQ0FBUCxHQUFXSSxPQUFPLENBQUNKLENBQWpDOztJQUNBLElBQUlhLEtBQUssR0FBRyxDQUFaLEVBQWU7TUFDYkgsTUFBTSxDQUFDVixDQUFQLEdBQVdQLEtBQVg7O01BQ0EsSUFBSUksSUFBSSxDQUFDZSxHQUFMLENBQVNDLEtBQVQsSUFBa0JwQixLQUF0QixFQUE2QjtRQUMzQmlCLE1BQU0sQ0FBQ1YsQ0FBUCxJQUFZUCxLQUFaO01BQ0Q7SUFDRixDQUxELE1BS08sSUFBSW9CLEtBQUssR0FBRyxDQUFaLEVBQWU7TUFDcEJILE1BQU0sQ0FBQ1YsQ0FBUCxHQUFXLENBQUMsQ0FBRCxHQUFLUCxLQUFoQjs7TUFDQSxJQUFJSSxJQUFJLENBQUNlLEdBQUwsQ0FBU0MsS0FBVCxJQUFrQnBCLEtBQXRCLEVBQTZCO1FBQzNCaUIsTUFBTSxDQUFDVixDQUFQLElBQVlQLEtBQVo7TUFDRDtJQUNGOztJQUNEVSxPQUFPLENBQUNHLElBQVIsQ0FBYTtNQUNYQyxNQUFNLEVBQUUsUUFERztNQUVYQyxPQUFPLEVBQUU7UUFBQ0MsT0FBTyxFQUFFLElBQVY7UUFBZ0JiLENBQUMsRUFBRWMsTUFBTSxDQUFDZCxDQUFQLEdBQVdRLE9BQU8sQ0FBQ1IsQ0FBdEM7UUFBeUNJLENBQUMsRUFBRVUsTUFBTSxDQUFDVixDQUFQLEdBQVdJLE9BQU8sQ0FBQ0o7TUFBL0Q7SUFGRSxDQUFiO0lBSUFJLE9BQU8sR0FBR0MsTUFBVjtFQUNEOztFQUNERixPQUFPLENBQUNHLElBQVIsQ0FBYTtJQUFDQyxNQUFNLEVBQUU7RUFBVCxDQUFiO0VBQ0EsT0FBT0osT0FBUDtBQUNELENBM0NEOztBQTZDQW5FLE9BQU8sQ0FBQzhFLGFBQVIsR0FBd0IsZUFBZUEsYUFBZixDQUE4QmxFLEdBQTlCLEVBQW1Da0IsTUFBbkMsRUFBMkNDLFlBQTNDLEVBQXlEO0VBQy9FLE1BQU07SUFBRTVCO0VBQUYsSUFBZ0I0QixZQUF0Qjs7RUFDQWYsZUFBQSxDQUFPQyxJQUFQLENBQWEseUNBQXdDZCxTQUFVLEVBQS9EOztFQUNBLE1BQU1TLEdBQUcsQ0FBQ1UsZUFBSixFQUFOO0VBQ0EsTUFBTWMsSUFBSSxHQUFHcEMsT0FBTyxDQUFDMkIsY0FBUixDQUF1QnhCLFNBQXZCLENBQWI7RUFVQSxNQUFNNEUsUUFBUSxHQUFHLE1BQU1uRSxHQUFHLENBQUNvQixXQUFKLEVBQXZCO0VBQ0EsTUFBTVUsRUFBRSxHQUFHLE1BQU1aLE1BQU0sQ0FBQ1EsV0FBUCxDQUFtQixJQUFuQixFQUNkLGVBQWN5QyxRQUFRLElBQUksRUFBWixHQUFpQixVQUFqQixHQUE4QixVQUFXLHFCQUR6QyxFQUVmLEtBRmUsQ0FBakI7RUFJQSxNQUFNdkIsT0FBTyxHQUFHLE1BQU0xQixNQUFNLENBQUNrRCxXQUFQLENBQW1CbkMsYUFBQSxDQUFLQyxhQUFMLENBQW1CSixFQUFuQixDQUFuQixDQUF0QjtFQUNBLE1BQU11QyxJQUFJLEdBQUcsTUFBTW5ELE1BQU0sQ0FBQ29ELE9BQVAsQ0FBZXJDLGFBQUEsQ0FBS0MsYUFBTCxDQUFtQkosRUFBbkIsQ0FBZixDQUFuQjtFQUVBLE1BQU15QixPQUFPLEdBQUduRSxPQUFPLENBQUNrRSxpQkFBUixDQUEwQjlCLElBQTFCLEVBQWdDb0IsT0FBaEMsRUFBeUN5QixJQUFJLENBQUNFLEtBQUwsR0FBYSxDQUF0RCxDQUFoQjtFQUVBLE1BQU1yRCxNQUFNLENBQUNzRCxZQUFQLENBQW9CakIsT0FBcEIsQ0FBTjtFQUVBLE1BQU0sSUFBQWpDLGVBQUEsRUFBTXJDLGdCQUFOLENBQU47QUFDRCxDQTNCRDs7QUE2QkFHLE9BQU8sQ0FBQ1YsVUFBUixHQUFxQkEsVUFBckI7QUFDQVUsT0FBTyxDQUFDVCxvQkFBUixHQUErQkEsb0JBQS9CO0FBQ0FTLE9BQU8sQ0FBQ1IsZUFBUixHQUEwQkEsZUFBMUI7QUFDQVEsT0FBTyxDQUFDUCxjQUFSLEdBQXlCQSxjQUF6QjtBQUNBTyxPQUFPLENBQUNOLGtCQUFSLEdBQTZCQSxrQkFBN0I7ZUFNZU0sTyJ9
244
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQSU5fVU5MT0NLIiwiUElOX1VOTE9DS19LRVlfRVZFTlQiLCJQQVNTV09SRF9VTkxPQ0siLCJQQVRURVJOX1VOTE9DSyIsIkZJTkdFUlBSSU5UX1VOTE9DSyIsIlVOTE9DS19UWVBFUyIsIktFWUNPREVfTlVNUEFEX0VOVEVSIiwiVU5MT0NLX1dBSVRfVElNRSIsIklOUFVUX0tFWVNfV0FJVF9USU1FIiwiTlVNQkVSX1pFUk9fS0VZQ09ERSIsImhlbHBlcnMiLCJ2YWxpZGF0ZVVubG9ja0NhcGFiaWxpdGllcyIsImNhcHMiLCJ1bmxvY2tLZXkiLCJ1bmxvY2tUeXBlIiwiXyIsImlzTmlsIiwiRXJyb3IiLCJpbmNsdWRlcyIsInRlc3QiLCJ0cmltIiwiZmFzdFVubG9jayIsImFkYiIsIm9wdHMiLCJjcmVkZW50aWFsIiwiY3JlZGVudGlhbFR5cGUiLCJsb2dnZXIiLCJpbmZvIiwid2FzTG9ja0VuYWJsZWQiLCJpc0xvY2tFbmFibGVkIiwiY2xlYXJMb2NrQ3JlZGVudGlhbCIsImN5Y2xlV2FrZVVwIiwiZGlzbWlzc0tleWd1YXJkIiwic2V0TG9ja0NyZWRlbnRpYWwiLCJlbmNvZGVQYXNzd29yZCIsImtleSIsInJlcGxhY2UiLCJzdHJpbmdLZXlUb0FyciIsInNwbGl0IiwiZmluZ2VycHJpbnRVbmxvY2siLCJkcml2ZXIiLCJjYXBhYmlsaXRpZXMiLCJnZXRBcGlMZXZlbCIsImZpbmdlcnByaW50Iiwic2xlZXAiLCJwaW5VbmxvY2siLCJrZXlzIiwiZWxzIiwiZmluZEVsT3JFbHMiLCJpc0VtcHR5IiwicGluVW5sb2NrV2l0aEtleUV2ZW50IiwicGlucyIsImVsIiwidGV4dCIsImdldEF0dHJpYnV0ZSIsInV0aWwiLCJ1bndyYXBFbGVtZW50IiwicGluIiwiY2xpY2siLCJ3YWl0Rm9yVW5sb2NrIiwiaXNTY3JlZW5Mb2NrZWQiLCJrZXlldmVudCIsInNoZWxsIiwicGFyc2VJbnQiLCJwYXNzd29yZFVubG9jayIsImdldFBhdHRlcm5LZXlQb3NpdGlvbiIsImluaXRQb3MiLCJwaWVjZSIsImNvbHMiLCJ4UG9zIiwieCIsIk1hdGgiLCJyb3VuZCIsInlQb3MiLCJ5IiwiY2VpbCIsImdldFBhdHRlcm5BY3Rpb25zIiwiYWN0aW9ucyIsImxhc3RQb3MiLCJrZXlQb3MiLCJwdXNoIiwiYWN0aW9uIiwib3B0aW9ucyIsImVsZW1lbnQiLCJtb3ZlVG8iLCJkaWZmWCIsImFicyIsImRpZmZZIiwicGF0dGVyblVubG9jayIsImFwaUxldmVsIiwiZ2V0TG9jYXRpb24iLCJzaXplIiwiZ2V0U2l6ZSIsIndpZHRoIiwicGVyZm9ybVRvdWNoIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3VubG9jay1oZWxwZXJzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBsb2dnZXIgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgc2xlZXAgfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcblxuY29uc3QgUElOX1VOTE9DSyA9ICdwaW4nO1xuY29uc3QgUElOX1VOTE9DS19LRVlfRVZFTlQgPSAncGluV2l0aEtleUV2ZW50JztcbmNvbnN0IFBBU1NXT1JEX1VOTE9DSyA9ICdwYXNzd29yZCc7XG5jb25zdCBQQVRURVJOX1VOTE9DSyA9ICdwYXR0ZXJuJztcbmNvbnN0IEZJTkdFUlBSSU5UX1VOTE9DSyA9ICdmaW5nZXJwcmludCc7XG5jb25zdCBVTkxPQ0tfVFlQRVMgPSBbXG4gIFBJTl9VTkxPQ0ssIFBJTl9VTkxPQ0tfS0VZX0VWRU5ULCBQQVNTV09SRF9VTkxPQ0ssXG4gIFBBVFRFUk5fVU5MT0NLLCBGSU5HRVJQUklOVF9VTkxPQ0tcbl07XG5jb25zdCBLRVlDT0RFX05VTVBBRF9FTlRFUiA9IDY2O1xuY29uc3QgVU5MT0NLX1dBSVRfVElNRSA9IDEwMDtcbmNvbnN0IElOUFVUX0tFWVNfV0FJVF9USU1FID0gMTAwO1xuY29uc3QgTlVNQkVSX1pFUk9fS0VZQ09ERSA9IDc7XG5cbmNvbnN0IGhlbHBlcnMgPSB7fTtcblxuaGVscGVycy52YWxpZGF0ZVVubG9ja0NhcGFiaWxpdGllcyA9IGZ1bmN0aW9uIHZhbGlkYXRlVW5sb2NrQ2FwYWJpbGl0aWVzIChjYXBzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHVubG9ja0tleSxcbiAgICB1bmxvY2tUeXBlLFxuICB9ID0gY2FwcztcbiAgaWYgKF8uaXNOaWwodW5sb2NrS2V5KSB8fCB1bmxvY2tLZXkgPT09ICcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdBIG5vbi1lbXB0eSB1bmxvY2sga2V5IHZhbHVlIG11c3QgYmUgcHJvdmlkZWQnKTtcbiAgfVxuXG4gIGlmIChbUElOX1VOTE9DSywgUElOX1VOTE9DS19LRVlfRVZFTlQsIEZJTkdFUlBSSU5UX1VOTE9DS10uaW5jbHVkZXModW5sb2NrVHlwZSkpIHtcbiAgICBpZiAoIS9eWzAtOV0rJC8udGVzdChfLnRyaW0odW5sb2NrS2V5KSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5sb2NrIGtleSB2YWx1ZSAnJHt1bmxvY2tLZXl9JyBtdXN0IG9ubHkgY29uc2lzdCBvZiBkaWdpdHNgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodW5sb2NrVHlwZSA9PT0gUEFUVEVSTl9VTkxPQ0spIHtcbiAgICBpZiAoIS9eWzEtOV17Miw5fSQvLnRlc3QoXy50cmltKHVubG9ja0tleSkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVubG9jayBrZXkgdmFsdWUgJyR7dW5sb2NrS2V5fScgbXVzdCBvbmx5IGluY2x1ZGUgZnJvbSB0d28gdG8gbmluZSBkaWdpdHMgaW4gcmFuZ2UgMS4uOWApO1xuICAgIH1cbiAgICBpZiAoLyhbMS05XSkuKj9cXDEvLnRlc3QoXy50cmltKHVubG9ja0tleSkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVubG9jayBrZXkgdmFsdWUgJyR7dW5sb2NrS2V5fScgbXVzdCBkZWZpbmUgYSB2YWxpZCBwYXR0ZXJuIHdoZXJlIHJlcGVhdHMgYXJlIG5vdCBhbGxvd2VkYCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHVubG9ja1R5cGUgPT09IFBBU1NXT1JEX1VOTE9DSykge1xuICAgIC8vIERvbnQgdHJpbSBwYXNzd29yZCBrZXksIHlvdSBjYW4gdXNlIGJsYW5rIHNwYWNlcyBpbiB5b3VyIGFuZHJvaWQgcGFzc3dvcmRcbiAgICAvLyDCr1xcXyjjg4QpXy/Cr1xuICAgIGlmICghLy57NCx9L2cudGVzdCh1bmxvY2tLZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBtaW5pbXVtIGFsbG93ZWQgbGVuZ3RoIG9mIHVubG9jayBrZXkgdmFsdWUgJyR7dW5sb2NrS2V5fScgaXMgNCBjaGFyYWN0ZXJzYCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB1bmxvY2sgdHlwZSAnJHt1bmxvY2tUeXBlfScuIGAgK1xuICAgICAgYE9ubHkgdGhlIGZvbGxvd2luZyB1bmxvY2sgdHlwZXMgYXJlIHN1cHBvcnRlZDogJHtVTkxPQ0tfVFlQRVN9YCk7XG4gIH1cbiAgcmV0dXJuIGNhcHM7XG59O1xuXG5oZWxwZXJzLmZhc3RVbmxvY2sgPSBhc3luYyBmdW5jdGlvbiBmYXN0VW5sb2NrIChhZGIsIG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgY3JlZGVudGlhbCxcbiAgICBjcmVkZW50aWFsVHlwZSxcbiAgfSA9IG9wdHM7XG4gIGxvZ2dlci5pbmZvKGBVbmxvY2tpbmcgdGhlIGRldmljZSB2aWEgQURCIHVzaW5nICR7Y3JlZGVudGlhbFR5cGV9IGNyZWRlbnRpYWwgJyR7Y3JlZGVudGlhbH0nYCk7XG4gIGNvbnN0IHdhc0xvY2tFbmFibGVkID0gYXdhaXQgYWRiLmlzTG9ja0VuYWJsZWQoKTtcbiAgaWYgKHdhc0xvY2tFbmFibGVkKSB7XG4gICAgYXdhaXQgYWRiLmNsZWFyTG9ja0NyZWRlbnRpYWwoY3JlZGVudGlhbCk7XG4gICAgLy8gbm90IHN1cmUgd2h5LCBidXQgdGhlIGRldmljZSdzIHNjcmVlbiBzdGlsbCByZW1haW5zIGxvY2tlZFxuICAgIC8vIGlmIGEgcHJlbGltaW5hcnkgd2FrZSB1cCBjeWNsZSBoYXMgbm90IGJlZW4gcGVyZm9ybWVkXG4gICAgYXdhaXQgYWRiLmN5Y2xlV2FrZVVwKCk7XG4gIH0gZWxzZSB7XG4gICAgbG9nZ2VyLmluZm8oJ05vIGFjdGl2ZSBsb2NrIGhhcyBiZWVuIGRldGVjdGVkLiBQcm9jZWVkaW5nIHRvIHRoZSBrZXlndWFyZCBkaXNtaXNzYWwnKTtcbiAgfVxuICB0cnkge1xuICAgIGF3YWl0IGFkYi5kaXNtaXNzS2V5Z3VhcmQoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAod2FzTG9ja0VuYWJsZWQpIHtcbiAgICAgIGF3YWl0IGFkYi5zZXRMb2NrQ3JlZGVudGlhbChjcmVkZW50aWFsVHlwZSwgY3JlZGVudGlhbCk7XG4gICAgfVxuICB9XG59O1xuXG5oZWxwZXJzLmVuY29kZVBhc3N3b3JkID0gZnVuY3Rpb24gZW5jb2RlUGFzc3dvcmQgKGtleSkge1xuICByZXR1cm4gYCR7a2V5fWAucmVwbGFjZSgvXFxzL2lnLCAnJXMnKTtcbn07XG5cbmhlbHBlcnMuc3RyaW5nS2V5VG9BcnIgPSBmdW5jdGlvbiBzdHJpbmdLZXlUb0FyciAoa2V5KSB7XG4gIHJldHVybiBgJHtrZXl9YC50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnJykuc3BsaXQoL1xccyovKTtcbn07XG5cbmhlbHBlcnMuZmluZ2VycHJpbnRVbmxvY2sgPSBhc3luYyBmdW5jdGlvbiBmaW5nZXJwcmludFVubG9jayAoYWRiLCBkcml2ZXIsIGNhcGFiaWxpdGllcykge1xuICBpZiAoYXdhaXQgYWRiLmdldEFwaUxldmVsKCkgPCAyMykge1xuICAgIHRocm93IG5ldyBFcnJvcignRmluZ2VycHJpbnQgdW5sb2NrIG9ubHkgd29ya3MgZm9yIEFuZHJvaWQgNisgZW11bGF0b3JzJyk7XG4gIH1cbiAgYXdhaXQgYWRiLmZpbmdlcnByaW50KGNhcGFiaWxpdGllcy51bmxvY2tLZXkpO1xuICBhd2FpdCBzbGVlcChVTkxPQ0tfV0FJVF9USU1FKTtcbn07XG5cbmhlbHBlcnMucGluVW5sb2NrID0gYXN5bmMgZnVuY3Rpb24gcGluVW5sb2NrIChhZGIsIGRyaXZlciwgY2FwYWJpbGl0aWVzKSB7XG4gIGxvZ2dlci5pbmZvKGBUcnlpbmcgdG8gdW5sb2NrIGRldmljZSB1c2luZyBwaW4gJHtjYXBhYmlsaXRpZXMudW5sb2NrS2V5fWApO1xuICBhd2FpdCBhZGIuZGlzbWlzc0tleWd1YXJkKCk7XG4gIGNvbnN0IGtleXMgPSBoZWxwZXJzLnN0cmluZ0tleVRvQXJyKGNhcGFiaWxpdGllcy51bmxvY2tLZXkpO1xuICBpZiAoYXdhaXQgYWRiLmdldEFwaUxldmVsKCkgPj0gMjEpIHtcbiAgICBjb25zdCBlbHMgPSBhd2FpdCBkcml2ZXIuZmluZEVsT3JFbHMoJ2lkJywgJ2NvbS5hbmRyb2lkLnN5c3RlbXVpOmlkL2RpZ2l0X3RleHQnLCB0cnVlKTtcbiAgICBpZiAoXy5pc0VtcHR5KGVscykpIHtcbiAgICAgIC8vIGZhbGxiYWNrIHRvIHBpbiB3aXRoIGtleSBldmVudFxuICAgICAgcmV0dXJuIGF3YWl0IGhlbHBlcnMucGluVW5sb2NrV2l0aEtleUV2ZW50KGFkYiwgZHJpdmVyLCBjYXBhYmlsaXRpZXMpO1xuICAgIH1cbiAgICBjb25zdCBwaW5zID0ge307XG4gICAgZm9yIChjb25zdCBlbCBvZiBlbHMpIHtcbiAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCBkcml2ZXIuZ2V0QXR0cmlidXRlKCd0ZXh0JywgdXRpbC51bndyYXBFbGVtZW50KGVsKSk7XG4gICAgICBwaW5zW3RleHRdID0gZWw7XG4gICAgfVxuICAgIGZvciAoY29uc3QgcGluIG9mIGtleXMpIHtcbiAgICAgIGNvbnN0IGVsID0gcGluc1twaW5dO1xuICAgICAgYXdhaXQgZHJpdmVyLmNsaWNrKHV0aWwudW53cmFwRWxlbWVudChlbCkpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGNvbnN0IHBpbiBvZiBrZXlzKSB7XG4gICAgICBjb25zdCBlbCA9IGF3YWl0IGRyaXZlci5maW5kRWxPckVscygnaWQnLCBgY29tLmFuZHJvaWQua2V5Z3VhcmQ6aWQva2V5JHtwaW59YCwgZmFsc2UpO1xuICAgICAgaWYgKGVsID09PSBudWxsKSB7XG4gICAgICAgIC8vIGZhbGxiYWNrIHRvIHBpbiB3aXRoIGtleSBldmVudFxuICAgICAgICByZXR1cm4gYXdhaXQgaGVscGVycy5waW5VbmxvY2tXaXRoS2V5RXZlbnQoYWRiLCBkcml2ZXIsIGNhcGFiaWxpdGllcyk7XG4gICAgICB9XG4gICAgICBhd2FpdCBkcml2ZXIuY2xpY2sodXRpbC51bndyYXBFbGVtZW50KGVsKSk7XG4gICAgfVxuICB9XG4gIGF3YWl0IHdhaXRGb3JVbmxvY2soYWRiKTtcbn07XG5cbi8qKlxuICogV2FpdCBmb3IgdGhlIGRpc3BsYXkgdG8gYmUgdW5sb2NrZWQuXG4gKiBTb21lIGRldmljZXMgYXV0b21hdGljYWxseSBhY2NlcHQgdHlwZWQgJ3BpbicgYW5kICdwYXNzd29yZCcgY29kZVxuICogd2l0aG91dCBwcmVzc2luZyB0aGUgRW50ZXIga2V5LiBCdXQgc29tZSBkZXZpY2VzIG5lZWQgaXQuXG4gKiBUaGlzIG1ldGhvZCB3YWl0cyBhIGZldyBzZWNvbmRzIGZpcnN0IGZvciBzdWNoIGF1dG9tYXRpYyBhY2NlcHRhbmNlIGNhc2UuXG4gKiBJZiB0aGUgZGV2aWNlIGlzIHN0aWxsIGxvY2tlZCwgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHRyeSB0byBzZW5kXG4gKiB0aGUgZW50ZXIga2V5IGNvZGUuXG4gKlxuICogQHBhcmFtIHtBREJ9IGFkYiBUaGUgaW5zdGFuY2Ugb2YgQURCXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JVbmxvY2sgKGFkYikge1xuICBhd2FpdCBzbGVlcChVTkxPQ0tfV0FJVF9USU1FKTtcbiAgaWYgKCFhd2FpdCBhZGIuaXNTY3JlZW5Mb2NrZWQoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IGFkYi5rZXlldmVudChLRVlDT0RFX05VTVBBRF9FTlRFUik7XG4gIGF3YWl0IHNsZWVwKFVOTE9DS19XQUlUX1RJTUUpO1xufVxuXG5oZWxwZXJzLnBpblVubG9ja1dpdGhLZXlFdmVudCA9IGFzeW5jIGZ1bmN0aW9uIHBpblVubG9ja1dpdGhLZXlFdmVudCAoYWRiLCBkcml2ZXIsIGNhcGFiaWxpdGllcykge1xuICBsb2dnZXIuaW5mbyhgVHJ5aW5nIHRvIHVubG9jayBkZXZpY2UgdXNpbmcgcGluIHdpdGgga2V5Y29kZSAke2NhcGFiaWxpdGllcy51bmxvY2tLZXl9YCk7XG4gIGF3YWl0IGFkYi5kaXNtaXNzS2V5Z3VhcmQoKTtcbiAgY29uc3Qga2V5cyA9IGhlbHBlcnMuc3RyaW5nS2V5VG9BcnIoY2FwYWJpbGl0aWVzLnVubG9ja0tleSk7XG5cbiAgLy8gU29tZSBkZXZpY2UgZG9lcyBub3QgaGF2ZSBzeXN0ZW0ga2V5IGlkcyBsaWtlICdjb20uYW5kcm9pZC5rZXlndWFyZDppZC9rZXknXG4gIC8vIFRoZW4sIHNlbmRpbmcga2V5ZXZlbnRzIGFyZSBtb3JlIHJlbGlhYmxlIHRvIHVubG9jayB0aGUgc2NyZWVuLlxuICBmb3IgKGNvbnN0IHBpbiBvZiBrZXlzKSB7XG4gICAgLy8gJ3BpbicgaXMgbnVtYmVyICgwLTkpIGluIHN0cmluZy5cbiAgICAvLyBOdW1iZXIgJzAnIGlzIGtleWNvZGUgJzcnLiBudW1iZXIgJzknIGlzIGtleWNvZGUgJzE2Jy5cbiAgICBhd2FpdCBhZGIuc2hlbGwoWydpbnB1dCcsICdrZXlldmVudCcsIHBhcnNlSW50KHBpbiwgMTApICsgTlVNQkVSX1pFUk9fS0VZQ09ERV0pO1xuICB9XG4gIGF3YWl0IHdhaXRGb3JVbmxvY2soYWRiLCBkcml2ZXIpO1xufTtcblxuaGVscGVycy5wYXNzd29yZFVubG9jayA9IGFzeW5jIGZ1bmN0aW9uIHBhc3N3b3JkVW5sb2NrIChhZGIsIGRyaXZlciwgY2FwYWJpbGl0aWVzKSB7XG4gIGNvbnN0IHsgdW5sb2NrS2V5IH0gPSBjYXBhYmlsaXRpZXM7XG4gIGxvZ2dlci5pbmZvKGBUcnlpbmcgdG8gdW5sb2NrIGRldmljZSB1c2luZyBwYXNzd29yZCAke3VubG9ja0tleX1gKTtcbiAgYXdhaXQgYWRiLmRpc21pc3NLZXlndWFyZCgpO1xuICAvLyBSZXBsYWNlIGJsYW5rIHNwYWNlcyB3aXRoICVzXG4gIGNvbnN0IGtleSA9IGhlbHBlcnMuZW5jb2RlUGFzc3dvcmQodW5sb2NrS2V5KTtcbiAgLy8gV2h5IGFkYiA/IEl0IHdhcyBsZXNzIGZsYWt5XG4gIGF3YWl0IGFkYi5zaGVsbChbJ2lucHV0JywgJ3RleHQnLCBrZXldKTtcbiAgLy8gV2h5IHNsZWVwcyA/IEF2b2lkIHNvbWUgZmxha3luZXNzIHdhaXRpbmcgZm9yIHRoZSBpbnB1dCB0byByZWNlaXZlIHRoZSBrZXlzXG4gIGF3YWl0IHNsZWVwKElOUFVUX0tFWVNfV0FJVF9USU1FKTtcbiAgYXdhaXQgYWRiLnNoZWxsKFsnaW5wdXQnLCAna2V5ZXZlbnQnLCBLRVlDT0RFX05VTVBBRF9FTlRFUl0pO1xuICAvLyBXYWl0cyBhIGJpdCBmb3IgdGhlIGRldmljZSB0byBiZSB1bmxvY2tlZFxuICBhd2FpdCB3YWl0Rm9yVW5sb2NrKGFkYiwgZHJpdmVyKTtcbn07XG5cbmhlbHBlcnMuZ2V0UGF0dGVybktleVBvc2l0aW9uID0gZnVuY3Rpb24gZ2V0UGF0dGVybktleVBvc2l0aW9uIChrZXksIGluaXRQb3MsIHBpZWNlKSB7XG4gIC8qXG4gIEhvdyB0aGUgbWF0aCB3b3JrczpcbiAgV2UgaGF2ZSA5IGJ1dHRvbnMgZGl2aWRlZCBpbiAzIGNvbHVtbnMgYW5kIDMgcm93cyBpbnNpZGUgdGhlIGxvY2tQYXR0ZXJuVmlldyxcbiAgZXZlcnkgYnV0dG9uIGhhcyBhIHBvc2l0aW9uIG9uIHRoZSBzY3JlZW4gY29ycmVzcG9uZGluZyB0byB0aGUgbG9ja1BhdHRlcm5WaWV3IHNpbmNlXG4gIGl0IGlzIHRoZSBwYXJlbnQgdmlldyByaWdodCBhdCB0aGUgbWlkZGxlIG9mIGVhY2ggY29sdW1uIG9yIHJvdy5cbiAgKi9cbiAgY29uc3QgY29scyA9IDM7XG4gIGNvbnN0IHBpbnMgPSA5O1xuICBjb25zdCB4UG9zID0gKGtleSwgeCwgcGllY2UpID0+IE1hdGgucm91bmQoeCArICgoa2V5ICUgY29scykgfHwgY29scykgKiBwaWVjZSAtIHBpZWNlIC8gMik7XG4gIGNvbnN0IHlQb3MgPSAoa2V5LCB5LCBwaWVjZSkgPT4gTWF0aC5yb3VuZCh5ICsgKE1hdGguY2VpbCgoKGtleSAlIHBpbnMpIHx8IHBpbnMpIC8gY29scykgKiBwaWVjZSAtIHBpZWNlIC8gMikpO1xuICByZXR1cm4ge1xuICAgIHg6IHhQb3Moa2V5LCBpbml0UG9zLngsIHBpZWNlKSxcbiAgICB5OiB5UG9zKGtleSwgaW5pdFBvcy55LCBwaWVjZSlcbiAgfTtcbn07XG5cbmhlbHBlcnMuZ2V0UGF0dGVybkFjdGlvbnMgPSBmdW5jdGlvbiBnZXRQYXR0ZXJuQWN0aW9ucyAoa2V5cywgaW5pdFBvcywgcGllY2UpIHtcbiAgY29uc3QgYWN0aW9ucyA9IFtdO1xuICBsZXQgbGFzdFBvcztcbiAgZm9yIChsZXQga2V5IG9mIGtleXMpIHtcbiAgICBjb25zdCBrZXlQb3MgPSBoZWxwZXJzLmdldFBhdHRlcm5LZXlQb3NpdGlvbihrZXksIGluaXRQb3MsIHBpZWNlKTtcbiAgICBpZiAoa2V5ID09PSBrZXlzWzBdKSB7XG4gICAgICBhY3Rpb25zLnB1c2goe2FjdGlvbjogJ3ByZXNzJywgb3B0aW9uczoge2VsZW1lbnQ6IG51bGwsIHg6IGtleVBvcy54LCB5OiBrZXlQb3MueX19KTtcbiAgICAgIGxhc3RQb3MgPSBrZXlQb3M7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgbW92ZVRvID0ge3g6IDAsIHk6IDB9O1xuICAgIGNvbnN0IGRpZmZYID0ga2V5UG9zLnggLSBsYXN0UG9zLng7XG4gICAgaWYgKGRpZmZYID4gMCkge1xuICAgICAgbW92ZVRvLnggPSBwaWVjZTtcbiAgICAgIGlmIChNYXRoLmFicyhkaWZmWCkgPiBwaWVjZSkge1xuICAgICAgICBtb3ZlVG8ueCArPSBwaWVjZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRpZmZYIDwgMCkge1xuICAgICAgbW92ZVRvLnggPSAtMSAqIHBpZWNlO1xuICAgICAgaWYgKE1hdGguYWJzKGRpZmZYKSA+IHBpZWNlKSB7XG4gICAgICAgIG1vdmVUby54IC09IHBpZWNlO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBkaWZmWSA9IGtleVBvcy55IC0gbGFzdFBvcy55O1xuICAgIGlmIChkaWZmWSA+IDApIHtcbiAgICAgIG1vdmVUby55ID0gcGllY2U7XG4gICAgICBpZiAoTWF0aC5hYnMoZGlmZlkpID4gcGllY2UpIHtcbiAgICAgICAgbW92ZVRvLnkgKz0gcGllY2U7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChkaWZmWSA8IDApIHtcbiAgICAgIG1vdmVUby55ID0gLTEgKiBwaWVjZTtcbiAgICAgIGlmIChNYXRoLmFicyhkaWZmWSkgPiBwaWVjZSkge1xuICAgICAgICBtb3ZlVG8ueSAtPSBwaWVjZTtcbiAgICAgIH1cbiAgICB9XG4gICAgYWN0aW9ucy5wdXNoKHtcbiAgICAgIGFjdGlvbjogJ21vdmVUbycsXG4gICAgICBvcHRpb25zOiB7ZWxlbWVudDogbnVsbCwgeDogbW92ZVRvLnggKyBsYXN0UG9zLngsIHk6IG1vdmVUby55ICsgbGFzdFBvcy55fVxuICAgIH0pO1xuICAgIGxhc3RQb3MgPSBrZXlQb3M7XG4gIH1cbiAgYWN0aW9ucy5wdXNoKHthY3Rpb246ICdyZWxlYXNlJ30pO1xuICByZXR1cm4gYWN0aW9ucztcbn07XG5cbmhlbHBlcnMucGF0dGVyblVubG9jayA9IGFzeW5jIGZ1bmN0aW9uIHBhdHRlcm5VbmxvY2sgKGFkYiwgZHJpdmVyLCBjYXBhYmlsaXRpZXMpIHtcbiAgY29uc3QgeyB1bmxvY2tLZXkgfSA9IGNhcGFiaWxpdGllcztcbiAgbG9nZ2VyLmluZm8oYFRyeWluZyB0byB1bmxvY2sgZGV2aWNlIHVzaW5nIHBhdHRlcm4gJHt1bmxvY2tLZXl9YCk7XG4gIGF3YWl0IGFkYi5kaXNtaXNzS2V5Z3VhcmQoKTtcbiAgY29uc3Qga2V5cyA9IGhlbHBlcnMuc3RyaW5nS2V5VG9BcnIodW5sb2NrS2V5KTtcbiAgLyogV2Ugc2V0IHRoZSBkZXZpY2UgcGF0dGVybiBidXR0b25zIGFzIG51bWJlciBvZiBhIHJlZ3VsYXIgcGhvbmVcbiAgICogIHwg4oCiIOKAoiDigKIgfCAgICAgfCAxIDIgMyB8XG4gICAqICB8IOKAoiDigKIg4oCiIHwgLS0+IHwgNCA1IDYgfFxuICAgKiAgfCDigKIg4oCiIOKAoiB8ICAgICB8IDcgOCA5IHxcblxuICBUaGUgcGF0dGVybiB2aWV3IGJ1dHRvbnMgYXJlIG5vdCBzZWVpbmcgYnkgdGhlIHVpYXV0b21hdG9yIHNpbmNlIHRoZXkgYXJlXG4gIGluY2x1ZGVkIGluc2lkZSBhIEZyYW1lTGF5b3V0LCBzbyB3ZSBhcmUgZ29pbmcgdG8gdHJ5IGNsaWNraW5nIG9uIHRoZSBidXR0b25zXG4gIHVzaW5nIHRoZSBwYXJlbnQgdmlldyBib3VuZHMgYW5kIG1hdGguXG4gICovXG4gIGNvbnN0IGFwaUxldmVsID0gYXdhaXQgYWRiLmdldEFwaUxldmVsKCk7XG4gIGNvbnN0IGVsID0gYXdhaXQgZHJpdmVyLmZpbmRFbE9yRWxzKCdpZCcsXG4gICAgYGNvbS5hbmRyb2lkLiR7YXBpTGV2ZWwgPj0gMjEgPyAnc3lzdGVtdWknIDogJ2tleWd1YXJkJ306aWQvbG9ja1BhdHRlcm5WaWV3YCxcbiAgICBmYWxzZVxuICApO1xuICBjb25zdCBpbml0UG9zID0gYXdhaXQgZHJpdmVyLmdldExvY2F0aW9uKHV0aWwudW53cmFwRWxlbWVudChlbCkpO1xuICBjb25zdCBzaXplID0gYXdhaXQgZHJpdmVyLmdldFNpemUodXRpbC51bndyYXBFbGVtZW50KGVsKSk7XG4gIC8vIEdldCBhY3Rpb25zIHRvIHBlcmZvcm1cbiAgY29uc3QgYWN0aW9ucyA9IGhlbHBlcnMuZ2V0UGF0dGVybkFjdGlvbnMoa2V5cywgaW5pdFBvcywgc2l6ZS53aWR0aCAvIDMpO1xuICAvLyBQZXJmb3JtIGdlc3R1cmVcbiAgYXdhaXQgZHJpdmVyLnBlcmZvcm1Ub3VjaChhY3Rpb25zKTtcbiAgLy8gV2FpdHMgYSBiaXQgZm9yIHRoZSBkZXZpY2UgdG8gYmUgdW5sb2NrZWRcbiAgYXdhaXQgc2xlZXAoVU5MT0NLX1dBSVRfVElNRSk7XG59O1xuXG5oZWxwZXJzLlBJTl9VTkxPQ0sgPSBQSU5fVU5MT0NLO1xuaGVscGVycy5QSU5fVU5MT0NLX0tFWV9FVkVOVCA9IFBJTl9VTkxPQ0tfS0VZX0VWRU5UO1xuaGVscGVycy5QQVNTV09SRF9VTkxPQ0sgPSBQQVNTV09SRF9VTkxPQ0s7XG5oZWxwZXJzLlBBVFRFUk5fVU5MT0NLID0gUEFUVEVSTl9VTkxPQ0s7XG5oZWxwZXJzLkZJTkdFUlBSSU5UX1VOTE9DSyA9IEZJTkdFUlBSSU5UX1VOTE9DSztcblxuZXhwb3J0IHtcbiAgUElOX1VOTE9DSywgUElOX1VOTE9DS19LRVlfRVZFTlQsIFBBU1NXT1JEX1VOTE9DSywgUEFUVEVSTl9VTkxPQ0ssXG4gIEZJTkdFUlBSSU5UX1VOTE9DSywgaGVscGVyc1xufTtcbmV4cG9ydCBkZWZhdWx0IGhlbHBlcnM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQSxNQUFNQSxVQUFVLEdBQUcsS0FBSztBQUFDO0FBQ3pCLE1BQU1DLG9CQUFvQixHQUFHLGlCQUFpQjtBQUFDO0FBQy9DLE1BQU1DLGVBQWUsR0FBRyxVQUFVO0FBQUM7QUFDbkMsTUFBTUMsY0FBYyxHQUFHLFNBQVM7QUFBQztBQUNqQyxNQUFNQyxrQkFBa0IsR0FBRyxhQUFhO0FBQUM7QUFDekMsTUFBTUMsWUFBWSxHQUFHLENBQ25CTCxVQUFVLEVBQUVDLG9CQUFvQixFQUFFQyxlQUFlLEVBQ2pEQyxjQUFjLEVBQUVDLGtCQUFrQixDQUNuQztBQUNELE1BQU1FLG9CQUFvQixHQUFHLEVBQUU7QUFDL0IsTUFBTUMsZ0JBQWdCLEdBQUcsR0FBRztBQUM1QixNQUFNQyxvQkFBb0IsR0FBRyxHQUFHO0FBQ2hDLE1BQU1DLG1CQUFtQixH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
@@ -1 +1 @@
1
- {"version":3,"file":"unlock-helpers.js","names":["PIN_UNLOCK","PIN_UNLOCK_KEY_EVENT","PASSWORD_UNLOCK","PATTERN_UNLOCK","FINGERPRINT_UNLOCK","UNLOCK_TYPES","KEYCODE_NUMPAD_ENTER","UNLOCK_WAIT_TIME","INPUT_KEYS_WAIT_TIME","NUMBER_ZERO_KEYCODE","helpers","validateUnlockCapabilities","caps","unlockKey","unlockType","_","isNil","Error","includes","test","trim","fastUnlock","adb","opts","credential","credentialType","logger","info","wasLockEnabled","isLockEnabled","clearLockCredential","cycleWakeUp","dismissKeyguard","setLockCredential","encodePassword","key","replace","stringKeyToArr","split","fingerprintUnlock","driver","capabilities","getApiLevel","fingerprint","sleep","pinUnlock","keys","els","findElOrEls","isEmpty","pinUnlockWithKeyEvent","pins","el","text","getAttribute","util","unwrapElement","pin","click","waitForUnlock","isScreenLocked","keyevent","shell","parseInt","passwordUnlock","getPatternKeyPosition","initPos","piece","cols","xPos","x","Math","round","yPos","y","ceil","getPatternActions","actions","lastPos","keyPos","push","action","options","element","moveTo","diffX","abs","diffY","patternUnlock","apiLevel","getLocation","size","getSize","width","performTouch"],"sources":["../../lib/unlock-helpers.js"],"sourcesContent":["import logger from './logger';\nimport { sleep } from 'asyncbox';\nimport _ from 'lodash';\nimport { util } from 'appium/support';\n\nconst PIN_UNLOCK = 'pin';\nconst PIN_UNLOCK_KEY_EVENT = 'pinWithKeyEvent';\nconst PASSWORD_UNLOCK = 'password';\nconst PATTERN_UNLOCK = 'pattern';\nconst FINGERPRINT_UNLOCK = 'fingerprint';\nconst UNLOCK_TYPES = [\n PIN_UNLOCK, PIN_UNLOCK_KEY_EVENT, PASSWORD_UNLOCK,\n PATTERN_UNLOCK, FINGERPRINT_UNLOCK\n];\nconst KEYCODE_NUMPAD_ENTER = 66;\nconst UNLOCK_WAIT_TIME = 100;\nconst INPUT_KEYS_WAIT_TIME = 100;\nconst NUMBER_ZERO_KEYCODE = 7;\n\nconst helpers = {};\n\nhelpers.validateUnlockCapabilities = function validateUnlockCapabilities (caps = {}) {\n const {\n unlockKey,\n unlockType,\n } = caps;\n if (_.isNil(unlockKey) || unlockKey === '') {\n throw new Error('A non-empty unlock key value must be provided');\n }\n\n if ([PIN_UNLOCK, PIN_UNLOCK_KEY_EVENT, FINGERPRINT_UNLOCK].includes(unlockType)) {\n if (!/^[0-9]+$/.test(_.trim(unlockKey))) {\n throw new Error(`Unlock key value '${unlockKey}' must only consist of digits`);\n }\n } else if (unlockType === PATTERN_UNLOCK) {\n if (!/^[1-9]{2,9}$/.test(_.trim(unlockKey))) {\n throw new Error(`Unlock key value '${unlockKey}' must only include from two to nine digits in range 1..9`);\n }\n if (/([1-9]).*?\\1/.test(_.trim(unlockKey))) {\n throw new Error(`Unlock key value '${unlockKey}' must define a valid pattern where repeats are not allowed`);\n }\n } else if (unlockType === PASSWORD_UNLOCK) {\n // Dont trim password key, you can use blank spaces in your android password\n // ¯\\_(ツ)_/¯\n if (!/.{4,}/g.test(unlockKey)) {\n throw new Error(`The minimum allowed length of unlock key value '${unlockKey}' is 4 characters`);\n }\n } else {\n throw new Error(`Invalid unlock type '${unlockType}'. ` +\n `Only the following unlock types are supported: ${UNLOCK_TYPES}`);\n }\n return caps;\n};\n\nhelpers.fastUnlock = async function fastUnlock (adb, opts = {}) {\n const {\n credential,\n credentialType,\n } = opts;\n logger.info(`Unlocking the device via ADB using ${credentialType} credential '${credential}'`);\n const wasLockEnabled = await adb.isLockEnabled();\n if (wasLockEnabled) {\n await adb.clearLockCredential(credential);\n // not sure why, but the device's screen still remains locked\n // if a preliminary wake up cycle has not been performed\n await adb.cycleWakeUp();\n } else {\n logger.info('No active lock has been detected. Proceeding to the keyguard dismissal');\n }\n try {\n await adb.dismissKeyguard();\n } finally {\n if (wasLockEnabled) {\n await adb.setLockCredential(credentialType, credential);\n }\n }\n};\n\nhelpers.encodePassword = function encodePassword (key) {\n return `${key}`.replace(/\\s/ig, '%s');\n};\n\nhelpers.stringKeyToArr = function stringKeyToArr (key) {\n return `${key}`.trim().replace(/\\s+/g, '').split(/\\s*/);\n};\n\nhelpers.fingerprintUnlock = async function fingerprintUnlock (adb, driver, capabilities) {\n if (await adb.getApiLevel() < 23) {\n throw new Error('Fingerprint unlock only works for Android 6+ emulators');\n }\n await adb.fingerprint(capabilities.unlockKey);\n await sleep(UNLOCK_WAIT_TIME);\n};\n\nhelpers.pinUnlock = async function pinUnlock (adb, driver, capabilities) {\n logger.info(`Trying to unlock device using pin ${capabilities.unlockKey}`);\n await adb.dismissKeyguard();\n const keys = helpers.stringKeyToArr(capabilities.unlockKey);\n if (await adb.getApiLevel() >= 21) {\n const els = await driver.findElOrEls('id', 'com.android.systemui:id/digit_text', true);\n if (_.isEmpty(els)) {\n // fallback to pin with key event\n return await helpers.pinUnlockWithKeyEvent(adb, driver, capabilities);\n }\n const pins = {};\n for (const el of els) {\n const text = await driver.getAttribute('text', util.unwrapElement(el));\n pins[text] = el;\n }\n for (const pin of keys) {\n const el = pins[pin];\n await driver.click(util.unwrapElement(el));\n }\n } else {\n for (const pin of keys) {\n const el = await driver.findElOrEls('id', `com.android.keyguard:id/key${pin}`, false);\n if (el === null) {\n // fallback to pin with key event\n return await helpers.pinUnlockWithKeyEvent(adb, driver, capabilities);\n }\n await driver.click(util.unwrapElement(el));\n }\n }\n await waitForUnlock(adb);\n};\n\n/**\n * Wait for the display to be unlocked.\n * Some devices automatically accept typed 'pin' and 'password' code\n * without pressing the Enter key. But some devices need it.\n * This method waits a few seconds first for such automatic acceptance case.\n * If the device is still locked, then this method will try to send\n * the enter key code.\n *\n * @param {ADB} adb The instance of ADB\n */\nasync function waitForUnlock (adb) {\n await sleep(UNLOCK_WAIT_TIME);\n if (!await adb.isScreenLocked()) {\n return;\n }\n\n await adb.keyevent(KEYCODE_NUMPAD_ENTER);\n await sleep(UNLOCK_WAIT_TIME);\n}\n\nhelpers.pinUnlockWithKeyEvent = async function pinUnlockWithKeyEvent (adb, driver, capabilities) {\n logger.info(`Trying to unlock device using pin with keycode ${capabilities.unlockKey}`);\n await adb.dismissKeyguard();\n const keys = helpers.stringKeyToArr(capabilities.unlockKey);\n\n // Some device does not have system key ids like 'com.android.keyguard:id/key'\n // Then, sending keyevents are more reliable to unlock the screen.\n for (const pin of keys) {\n // 'pin' is number (0-9) in string.\n // Number '0' is keycode '7'. number '9' is keycode '16'.\n await adb.shell(['input', 'keyevent', parseInt(pin, 10) + NUMBER_ZERO_KEYCODE]);\n }\n await waitForUnlock(adb, driver);\n};\n\nhelpers.passwordUnlock = async function passwordUnlock (adb, driver, capabilities) {\n const { unlockKey } = capabilities;\n logger.info(`Trying to unlock device using password ${unlockKey}`);\n await adb.dismissKeyguard();\n // Replace blank spaces with %s\n const key = helpers.encodePassword(unlockKey);\n // Why adb ? It was less flaky\n await adb.shell(['input', 'text', key]);\n // Why sleeps ? Avoid some flakyness waiting for the input to receive the keys\n await sleep(INPUT_KEYS_WAIT_TIME);\n await adb.shell(['input', 'keyevent', KEYCODE_NUMPAD_ENTER]);\n // Waits a bit for the device to be unlocked\n await waitForUnlock(adb, driver);\n};\n\nhelpers.getPatternKeyPosition = function getPatternKeyPosition (key, initPos, piece) {\n /*\n How the math works:\n We have 9 buttons divided in 3 columns and 3 rows inside the lockPatternView,\n every button has a position on the screen corresponding to the lockPatternView since\n it is the parent view right at the middle of each column or row.\n */\n const cols = 3;\n const pins = 9;\n const xPos = (key, x, piece) => Math.round(x + ((key % cols) || cols) * piece - piece / 2);\n const yPos = (key, y, piece) => Math.round(y + (Math.ceil(((key % pins) || pins) / cols) * piece - piece / 2));\n return {\n x: xPos(key, initPos.x, piece),\n y: yPos(key, initPos.y, piece)\n };\n};\n\nhelpers.getPatternActions = function getPatternActions (keys, initPos, piece) {\n const actions = [];\n let lastPos;\n for (let key of keys) {\n const keyPos = helpers.getPatternKeyPosition(key, initPos, piece);\n if (key === keys[0]) {\n actions.push({action: 'press', options: {element: null, x: keyPos.x, y: keyPos.y}});\n lastPos = keyPos;\n continue;\n }\n const moveTo = {x: 0, y: 0};\n const diffX = keyPos.x - lastPos.x;\n if (diffX > 0) {\n moveTo.x = piece;\n if (Math.abs(diffX) > piece) {\n moveTo.x += piece;\n }\n } else if (diffX < 0) {\n moveTo.x = -1 * piece;\n if (Math.abs(diffX) > piece) {\n moveTo.x -= piece;\n }\n }\n const diffY = keyPos.y - lastPos.y;\n if (diffY > 0) {\n moveTo.y = piece;\n if (Math.abs(diffY) > piece) {\n moveTo.y += piece;\n }\n } else if (diffY < 0) {\n moveTo.y = -1 * piece;\n if (Math.abs(diffY) > piece) {\n moveTo.y -= piece;\n }\n }\n actions.push({\n action: 'moveTo',\n options: {element: null, x: moveTo.x + lastPos.x, y: moveTo.y + lastPos.y}\n });\n lastPos = keyPos;\n }\n actions.push({action: 'release'});\n return actions;\n};\n\nhelpers.patternUnlock = async function patternUnlock (adb, driver, capabilities) {\n const { unlockKey } = capabilities;\n logger.info(`Trying to unlock device using pattern ${unlockKey}`);\n await adb.dismissKeyguard();\n const keys = helpers.stringKeyToArr(unlockKey);\n /* We set the device pattern buttons as number of a regular phone\n * | • • • | | 1 2 3 |\n * | • • • | --> | 4 5 6 |\n * | • • • | | 7 8 9 |\n\n The pattern view buttons are not seeing by the uiautomator since they are\n included inside a FrameLayout, so we are going to try clicking on the buttons\n using the parent view bounds and math.\n */\n const apiLevel = await adb.getApiLevel();\n const el = await driver.findElOrEls('id',\n `com.android.${apiLevel >= 21 ? 'systemui' : 'keyguard'}:id/lockPatternView`,\n false\n );\n const initPos = await driver.getLocation(util.unwrapElement(el));\n const size = await driver.getSize(util.unwrapElement(el));\n // Get actions to perform\n const actions = helpers.getPatternActions(keys, initPos, size.width / 3);\n // Perform gesture\n await driver.performTouch(actions);\n // Waits a bit for the device to be unlocked\n await sleep(UNLOCK_WAIT_TIME);\n};\n\nhelpers.PIN_UNLOCK = PIN_UNLOCK;\nhelpers.PIN_UNLOCK_KEY_EVENT = PIN_UNLOCK_KEY_EVENT;\nhelpers.PASSWORD_UNLOCK = PASSWORD_UNLOCK;\nhelpers.PATTERN_UNLOCK = PATTERN_UNLOCK;\nhelpers.FINGERPRINT_UNLOCK = FINGERPRINT_UNLOCK;\n\nexport {\n PIN_UNLOCK, PIN_UNLOCK_KEY_EVENT, PASSWORD_UNLOCK, PATTERN_UNLOCK,\n FINGERPRINT_UNLOCK, helpers\n};\nexport default helpers;\n"],"mappings":"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"}
1
+ {"version":3,"file":"unlock-helpers.js","names":["PIN_UNLOCK","PIN_UNLOCK_KEY_EVENT","PASSWORD_UNLOCK","PATTERN_UNLOCK","FINGERPRINT_UNLOCK","UNLOCK_TYPES","KEYCODE_NUMPAD_ENTER","UNLOCK_WAIT_TIME","INPUT_KEYS_WAIT_TIME","NUMBER_ZERO_KEYCODE","helpers","validateUnlockCapabilities","caps","unlockKey","unlockType","_","isNil","Error","includes","test","trim","fastUnlock","adb","opts","credential","credentialType","logger","info","wasLockEnabled","isLockEnabled","clearLockCredential","cycleWakeUp","dismissKeyguard","setLockCredential","encodePassword","key","replace","stringKeyToArr","split","fingerprintUnlock","driver","capabilities","getApiLevel","fingerprint","sleep","pinUnlock","keys","els","findElOrEls","isEmpty","pinUnlockWithKeyEvent","pins","el","text","getAttribute","util","unwrapElement","pin","click","waitForUnlock","isScreenLocked","keyevent","shell","parseInt","passwordUnlock","getPatternKeyPosition","initPos","piece","cols","xPos","x","Math","round","yPos","y","ceil","getPatternActions","actions","lastPos","keyPos","push","action","options","element","moveTo","diffX","abs","diffY","patternUnlock","apiLevel","getLocation","size","getSize","width","performTouch"],"sources":["../../lib/unlock-helpers.js"],"sourcesContent":["import logger from './logger';\nimport { sleep } from 'asyncbox';\nimport _ from 'lodash';\nimport { util } from 'appium/support';\n\nconst PIN_UNLOCK = 'pin';\nconst PIN_UNLOCK_KEY_EVENT = 'pinWithKeyEvent';\nconst PASSWORD_UNLOCK = 'password';\nconst PATTERN_UNLOCK = 'pattern';\nconst FINGERPRINT_UNLOCK = 'fingerprint';\nconst UNLOCK_TYPES = [\n PIN_UNLOCK, PIN_UNLOCK_KEY_EVENT, PASSWORD_UNLOCK,\n PATTERN_UNLOCK, FINGERPRINT_UNLOCK\n];\nconst KEYCODE_NUMPAD_ENTER = 66;\nconst UNLOCK_WAIT_TIME = 100;\nconst INPUT_KEYS_WAIT_TIME = 100;\nconst NUMBER_ZERO_KEYCODE = 7;\n\nconst helpers = {};\n\nhelpers.validateUnlockCapabilities = function validateUnlockCapabilities (caps = {}) {\n const {\n unlockKey,\n unlockType,\n } = caps;\n if (_.isNil(unlockKey) || unlockKey === '') {\n throw new Error('A non-empty unlock key value must be provided');\n }\n\n if ([PIN_UNLOCK, PIN_UNLOCK_KEY_EVENT, FINGERPRINT_UNLOCK].includes(unlockType)) {\n if (!/^[0-9]+$/.test(_.trim(unlockKey))) {\n throw new Error(`Unlock key value '${unlockKey}' must only consist of digits`);\n }\n } else if (unlockType === PATTERN_UNLOCK) {\n if (!/^[1-9]{2,9}$/.test(_.trim(unlockKey))) {\n throw new Error(`Unlock key value '${unlockKey}' must only include from two to nine digits in range 1..9`);\n }\n if (/([1-9]).*?\\1/.test(_.trim(unlockKey))) {\n throw new Error(`Unlock key value '${unlockKey}' must define a valid pattern where repeats are not allowed`);\n }\n } else if (unlockType === PASSWORD_UNLOCK) {\n // Dont trim password key, you can use blank spaces in your android password\n // ¯\\_(ツ)_/¯\n if (!/.{4,}/g.test(unlockKey)) {\n throw new Error(`The minimum allowed length of unlock key value '${unlockKey}' is 4 characters`);\n }\n } else {\n throw new Error(`Invalid unlock type '${unlockType}'. ` +\n `Only the following unlock types are supported: ${UNLOCK_TYPES}`);\n }\n return caps;\n};\n\nhelpers.fastUnlock = async function fastUnlock (adb, opts = {}) {\n const {\n credential,\n credentialType,\n } = opts;\n logger.info(`Unlocking the device via ADB using ${credentialType} credential '${credential}'`);\n const wasLockEnabled = await adb.isLockEnabled();\n if (wasLockEnabled) {\n await adb.clearLockCredential(credential);\n // not sure why, but the device's screen still remains locked\n // if a preliminary wake up cycle has not been performed\n await adb.cycleWakeUp();\n } else {\n logger.info('No active lock has been detected. Proceeding to the keyguard dismissal');\n }\n try {\n await adb.dismissKeyguard();\n } finally {\n if (wasLockEnabled) {\n await adb.setLockCredential(credentialType, credential);\n }\n }\n};\n\nhelpers.encodePassword = function encodePassword (key) {\n return `${key}`.replace(/\\s/ig, '%s');\n};\n\nhelpers.stringKeyToArr = function stringKeyToArr (key) {\n return `${key}`.trim().replace(/\\s+/g, '').split(/\\s*/);\n};\n\nhelpers.fingerprintUnlock = async function fingerprintUnlock (adb, driver, capabilities) {\n if (await adb.getApiLevel() < 23) {\n throw new Error('Fingerprint unlock only works for Android 6+ emulators');\n }\n await adb.fingerprint(capabilities.unlockKey);\n await sleep(UNLOCK_WAIT_TIME);\n};\n\nhelpers.pinUnlock = async function pinUnlock (adb, driver, capabilities) {\n logger.info(`Trying to unlock device using pin ${capabilities.unlockKey}`);\n await adb.dismissKeyguard();\n const keys = helpers.stringKeyToArr(capabilities.unlockKey);\n if (await adb.getApiLevel() >= 21) {\n const els = await driver.findElOrEls('id', 'com.android.systemui:id/digit_text', true);\n if (_.isEmpty(els)) {\n // fallback to pin with key event\n return await helpers.pinUnlockWithKeyEvent(adb, driver, capabilities);\n }\n const pins = {};\n for (const el of els) {\n const text = await driver.getAttribute('text', util.unwrapElement(el));\n pins[text] = el;\n }\n for (const pin of keys) {\n const el = pins[pin];\n await driver.click(util.unwrapElement(el));\n }\n } else {\n for (const pin of keys) {\n const el = await driver.findElOrEls('id', `com.android.keyguard:id/key${pin}`, false);\n if (el === null) {\n // fallback to pin with key event\n return await helpers.pinUnlockWithKeyEvent(adb, driver, capabilities);\n }\n await driver.click(util.unwrapElement(el));\n }\n }\n await waitForUnlock(adb);\n};\n\n/**\n * Wait for the display to be unlocked.\n * Some devices automatically accept typed 'pin' and 'password' code\n * without pressing the Enter key. But some devices need it.\n * This method waits a few seconds first for such automatic acceptance case.\n * If the device is still locked, then this method will try to send\n * the enter key code.\n *\n * @param {ADB} adb The instance of ADB\n */\nasync function waitForUnlock (adb) {\n await sleep(UNLOCK_WAIT_TIME);\n if (!await adb.isScreenLocked()) {\n return;\n }\n\n await adb.keyevent(KEYCODE_NUMPAD_ENTER);\n await sleep(UNLOCK_WAIT_TIME);\n}\n\nhelpers.pinUnlockWithKeyEvent = async function pinUnlockWithKeyEvent (adb, driver, capabilities) {\n logger.info(`Trying to unlock device using pin with keycode ${capabilities.unlockKey}`);\n await adb.dismissKeyguard();\n const keys = helpers.stringKeyToArr(capabilities.unlockKey);\n\n // Some device does not have system key ids like 'com.android.keyguard:id/key'\n // Then, sending keyevents are more reliable to unlock the screen.\n for (const pin of keys) {\n // 'pin' is number (0-9) in string.\n // Number '0' is keycode '7'. number '9' is keycode '16'.\n await adb.shell(['input', 'keyevent', parseInt(pin, 10) + NUMBER_ZERO_KEYCODE]);\n }\n await waitForUnlock(adb, driver);\n};\n\nhelpers.passwordUnlock = async function passwordUnlock (adb, driver, capabilities) {\n const { unlockKey } = capabilities;\n logger.info(`Trying to unlock device using password ${unlockKey}`);\n await adb.dismissKeyguard();\n // Replace blank spaces with %s\n const key = helpers.encodePassword(unlockKey);\n // Why adb ? It was less flaky\n await adb.shell(['input', 'text', key]);\n // Why sleeps ? Avoid some flakyness waiting for the input to receive the keys\n await sleep(INPUT_KEYS_WAIT_TIME);\n await adb.shell(['input', 'keyevent', KEYCODE_NUMPAD_ENTER]);\n // Waits a bit for the device to be unlocked\n await waitForUnlock(adb, driver);\n};\n\nhelpers.getPatternKeyPosition = function getPatternKeyPosition (key, initPos, piece) {\n /*\n How the math works:\n We have 9 buttons divided in 3 columns and 3 rows inside the lockPatternView,\n every button has a position on the screen corresponding to the lockPatternView since\n it is the parent view right at the middle of each column or row.\n */\n const cols = 3;\n const pins = 9;\n const xPos = (key, x, piece) => Math.round(x + ((key % cols) || cols) * piece - piece / 2);\n const yPos = (key, y, piece) => Math.round(y + (Math.ceil(((key % pins) || pins) / cols) * piece - piece / 2));\n return {\n x: xPos(key, initPos.x, piece),\n y: yPos(key, initPos.y, piece)\n };\n};\n\nhelpers.getPatternActions = function getPatternActions (keys, initPos, piece) {\n const actions = [];\n let lastPos;\n for (let key of keys) {\n const keyPos = helpers.getPatternKeyPosition(key, initPos, piece);\n if (key === keys[0]) {\n actions.push({action: 'press', options: {element: null, x: keyPos.x, y: keyPos.y}});\n lastPos = keyPos;\n continue;\n }\n const moveTo = {x: 0, y: 0};\n const diffX = keyPos.x - lastPos.x;\n if (diffX > 0) {\n moveTo.x = piece;\n if (Math.abs(diffX) > piece) {\n moveTo.x += piece;\n }\n } else if (diffX < 0) {\n moveTo.x = -1 * piece;\n if (Math.abs(diffX) > piece) {\n moveTo.x -= piece;\n }\n }\n const diffY = keyPos.y - lastPos.y;\n if (diffY > 0) {\n moveTo.y = piece;\n if (Math.abs(diffY) > piece) {\n moveTo.y += piece;\n }\n } else if (diffY < 0) {\n moveTo.y = -1 * piece;\n if (Math.abs(diffY) > piece) {\n moveTo.y -= piece;\n }\n }\n actions.push({\n action: 'moveTo',\n options: {element: null, x: moveTo.x + lastPos.x, y: moveTo.y + lastPos.y}\n });\n lastPos = keyPos;\n }\n actions.push({action: 'release'});\n return actions;\n};\n\nhelpers.patternUnlock = async function patternUnlock (adb, driver, capabilities) {\n const { unlockKey } = capabilities;\n logger.info(`Trying to unlock device using pattern ${unlockKey}`);\n await adb.dismissKeyguard();\n const keys = helpers.stringKeyToArr(unlockKey);\n /* We set the device pattern buttons as number of a regular phone\n * | • • • | | 1 2 3 |\n * | • • • | --> | 4 5 6 |\n * | • • • | | 7 8 9 |\n\n The pattern view buttons are not seeing by the uiautomator since they are\n included inside a FrameLayout, so we are going to try clicking on the buttons\n using the parent view bounds and math.\n */\n const apiLevel = await adb.getApiLevel();\n const el = await driver.findElOrEls('id',\n `com.android.${apiLevel >= 21 ? 'systemui' : 'keyguard'}:id/lockPatternView`,\n false\n );\n const initPos = await driver.getLocation(util.unwrapElement(el));\n const size = await driver.getSize(util.unwrapElement(el));\n // Get actions to perform\n const actions = helpers.getPatternActions(keys, initPos, size.width / 3);\n // Perform gesture\n await driver.performTouch(actions);\n // Waits a bit for the device to be unlocked\n await sleep(UNLOCK_WAIT_TIME);\n};\n\nhelpers.PIN_UNLOCK = PIN_UNLOCK;\nhelpers.PIN_UNLOCK_KEY_EVENT = PIN_UNLOCK_KEY_EVENT;\nhelpers.PASSWORD_UNLOCK = PASSWORD_UNLOCK;\nhelpers.PATTERN_UNLOCK = PATTERN_UNLOCK;\nhelpers.FINGERPRINT_UNLOCK = FINGERPRINT_UNLOCK;\n\nexport {\n PIN_UNLOCK, PIN_UNLOCK_KEY_EVENT, PASSWORD_UNLOCK, PATTERN_UNLOCK,\n FINGERPRINT_UNLOCK, helpers\n};\nexport default helpers;\n"],"mappings":"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"}
@@ -1,25 +1,19 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.requireArgs = requireArgs;
9
-
10
8
  require("source-map-support/register");
11
-
12
9
  var _lodash = _interopRequireDefault(require("lodash"));
13
-
14
10
  var _driver = require("appium/driver");
15
-
16
11
  function requireArgs(argNames, opts = {}) {
17
12
  for (const argName of _lodash.default.isArray(argNames) ? argNames : [argNames]) {
18
13
  if (!_lodash.default.has(opts, argName)) {
19
14
  throw new _driver.errors.InvalidArgumentError(`'${argName}' argument must be provided`);
20
15
  }
21
16
  }
22
-
23
17
  return opts;
24
18
  }
25
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZXF1aXJlQXJncyIsImFyZ05hbWVzIiwib3B0cyIsImFyZ05hbWUiLCJfIiwiaXNBcnJheSIsImhhcyIsImVycm9ycyIsIkludmFsaWRBcmd1bWVudEVycm9yIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3V0aWxzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcblxuXG4vKipcbiAqIEFzc2VydCB0aGUgcHJlc2VuY2Ugb2YgcGFydGljdWxhciBrZXlzIGluIHRoZSBnaXZlbiBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xBcnJheTxzdHJpbmc+fSBhcmdOYW1lcyBvbmUgb3IgbW9yZSBrZXkgbmFtZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIHRoZSBvYmplY3QgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtPYmplY3R9IHRoZSBzYW1lIGdpdmVuIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZUFyZ3MgKGFyZ05hbWVzLCBvcHRzID0ge30pIHtcbiAgZm9yIChjb25zdCBhcmdOYW1lIG9mIChfLmlzQXJyYXkoYXJnTmFtZXMpID8gYXJnTmFtZXMgOiBbYXJnTmFtZXNdKSkge1xuICAgIGlmICghXy5oYXMob3B0cywgYXJnTmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYCcke2FyZ05hbWV9JyBhcmd1bWVudCBtdXN0IGJlIHByb3ZpZGVkYCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvcHRzO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQVVPLFNBQVNBLFdBQVQsQ0FBc0JDLFFBQXRCLEVBQWdDQyxJQUFJLEdBQUcsRUFBdkMsRUFBMkM7RUFDaEQsS0FBSyxNQUFNQyxPQUFYLElBQXVCQyxlQUFBLENBQUVDLE9BQUYsQ0FBVUosUUFBVixJQUFzQkEsUUFBdEIsR0FBaUMsQ0FBQ0EsUUFBRCxDQUF4RCxFQUFxRTtJQUNuRSxJQUFJLENBQUNHLGVBQUEsQ0FBRUUsR0FBRixDQUFNSixJQUFOLEVBQVlDLE9BQVosQ0FBTCxFQUEyQjtNQUN6QixNQUFNLElBQUlJLGNBQUEsQ0FBT0Msb0JBQVgsQ0FBaUMsSUFBR0wsT0FBUSw2QkFBNUMsQ0FBTjtJQUNEO0VBQ0Y7O0VBQ0QsT0FBT0QsSUFBUDtBQUNEIn0=
19
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZXF1aXJlQXJncyIsImFyZ05hbWVzIiwib3B0cyIsImFyZ05hbWUiLCJfIiwiaXNBcnJheSIsImhhcyIsImVycm9ycyIsIkludmFsaWRBcmd1bWVudEVycm9yIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3V0aWxzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcblxuXG4vKipcbiAqIEFzc2VydCB0aGUgcHJlc2VuY2Ugb2YgcGFydGljdWxhciBrZXlzIGluIHRoZSBnaXZlbiBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xBcnJheTxzdHJpbmc+fSBhcmdOYW1lcyBvbmUgb3IgbW9yZSBrZXkgbmFtZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIHRoZSBvYmplY3QgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtPYmplY3R9IHRoZSBzYW1lIGdpdmVuIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZUFyZ3MgKGFyZ05hbWVzLCBvcHRzID0ge30pIHtcbiAgZm9yIChjb25zdCBhcmdOYW1lIG9mIChfLmlzQXJyYXkoYXJnTmFtZXMpID8gYXJnTmFtZXMgOiBbYXJnTmFtZXNdKSkge1xuICAgIGlmICghXy5oYXMob3B0cywgYXJnTmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYCcke2FyZ05hbWV9JyBhcmd1bWVudCBtdXN0IGJlIHByb3ZpZGVkYCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvcHRzO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFVTyxTQUFTQSxXQUFXLENBQUVDLFFBQVEsRUFBRUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFO0VBQ2hELEtBQUssTUFBTUMsT0FBTyxJQUFLQyxlQUFDLENBQUNDLE9BQU8sQ0FBQ0osUUFBUSxDQUFDLEdBQUdBLFFBQVEsR0FBRyxDQUFDQSxRQUFRLENBQUMsRUFBRztJQUNuRSxJQUFJLENBQUNHLGVBQUMsQ0FBQ0UsR0FBRyxDQUFDSixJQUFJLEVBQUVDLE9BQU8sQ0FBQyxFQUFFO01BQ3pCLE1BQU0sSUFBSUksY0FBTSxDQUFDQyxvQkFBb0IsQ0FBRSxJQUFHTCxPQUFRLDZCQUE0QixDQUFDO0lBQ2pGO0VBQ0Y7RUFDQSxPQUFPRCxJQUFJO0FBQ2IifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":["requireArgs","argNames","opts","argName","_","isArray","has","errors","InvalidArgumentError"],"sources":["../../lib/utils.js"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from 'appium/driver';\n\n\n/**\n * Assert the presence of particular keys in the given object\n *\n * @param {string|Array<string>} argNames one or more key names\n * @param {Object} opts the object to check\n * @returns {Object} 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}\n"],"mappings":";;;;;;;;;;;AAAA;;AACA;;AAUO,SAASA,WAAT,CAAsBC,QAAtB,EAAgCC,IAAI,GAAG,EAAvC,EAA2C;EAChD,KAAK,MAAMC,OAAX,IAAuBC,eAAA,CAAEC,OAAF,CAAUJ,QAAV,IAAsBA,QAAtB,GAAiC,CAACA,QAAD,CAAxD,EAAqE;IACnE,IAAI,CAACG,eAAA,CAAEE,GAAF,CAAMJ,IAAN,EAAYC,OAAZ,CAAL,EAA2B;MACzB,MAAM,IAAII,cAAA,CAAOC,oBAAX,CAAiC,IAAGL,OAAQ,6BAA5C,CAAN;IACD;EACF;;EACD,OAAOD,IAAP;AACD"}
1
+ {"version":3,"file":"utils.js","names":["requireArgs","argNames","opts","argName","_","isArray","has","errors","InvalidArgumentError"],"sources":["../../lib/utils.js"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from 'appium/driver';\n\n\n/**\n * Assert the presence of particular keys in the given object\n *\n * @param {string|Array<string>} argNames one or more key names\n * @param {Object} opts the object to check\n * @returns {Object} 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}\n"],"mappings":";;;;;;;;AAAA;AACA;AAUO,SAASA,WAAW,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"}