@appium/base-driver 8.7.3 → 9.0.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.
Files changed (121) hide show
  1. package/build/lib/basedriver/capabilities.d.ts +11 -163
  2. package/build/lib/basedriver/capabilities.d.ts.map +1 -1
  3. package/build/lib/basedriver/capabilities.js +354 -236
  4. package/build/lib/basedriver/capabilities.js.map +1 -1
  5. package/build/lib/basedriver/commands/event.d.ts +7 -6
  6. package/build/lib/basedriver/commands/event.d.ts.map +1 -1
  7. package/build/lib/basedriver/commands/event.js +55 -35
  8. package/build/lib/basedriver/commands/event.js.map +1 -1
  9. package/build/lib/basedriver/commands/execute.d.ts +7 -6
  10. package/build/lib/basedriver/commands/execute.d.ts.map +1 -1
  11. package/build/lib/basedriver/commands/execute.js +66 -58
  12. package/build/lib/basedriver/commands/execute.js.map +1 -1
  13. package/build/lib/basedriver/commands/find.d.ts +9 -7
  14. package/build/lib/basedriver/commands/find.d.ts.map +1 -1
  15. package/build/lib/basedriver/commands/find.js +102 -54
  16. package/build/lib/basedriver/commands/find.js.map +1 -1
  17. package/build/lib/basedriver/commands/index.d.ts +3 -7
  18. package/build/lib/basedriver/commands/index.d.ts.map +1 -1
  19. package/build/lib/basedriver/commands/index.js +30 -33
  20. package/build/lib/basedriver/commands/index.js.map +1 -1
  21. package/build/lib/basedriver/commands/log.d.ts +8 -9
  22. package/build/lib/basedriver/commands/log.d.ts.map +1 -1
  23. package/build/lib/basedriver/commands/log.js +54 -38
  24. package/build/lib/basedriver/commands/log.js.map +1 -1
  25. package/build/lib/basedriver/commands/session.d.ts +7 -6
  26. package/build/lib/basedriver/commands/session.d.ts.map +1 -1
  27. package/build/lib/basedriver/commands/session.js +46 -39
  28. package/build/lib/basedriver/commands/session.js.map +1 -1
  29. package/build/lib/basedriver/commands/settings.d.ts +7 -7
  30. package/build/lib/basedriver/commands/settings.d.ts.map +1 -1
  31. package/build/lib/basedriver/commands/settings.js +35 -28
  32. package/build/lib/basedriver/commands/settings.js.map +1 -1
  33. package/build/lib/basedriver/commands/timeout.d.ts +7 -5
  34. package/build/lib/basedriver/commands/timeout.d.ts.map +1 -1
  35. package/build/lib/basedriver/commands/timeout.js +144 -162
  36. package/build/lib/basedriver/commands/timeout.js.map +1 -1
  37. package/build/lib/basedriver/core.d.ts +6 -157
  38. package/build/lib/basedriver/core.d.ts.map +1 -1
  39. package/build/lib/basedriver/core.js +361 -230
  40. package/build/lib/basedriver/core.js.map +1 -1
  41. package/build/lib/basedriver/desired-caps.js +80 -110
  42. package/build/lib/basedriver/desired-caps.js.map +1 -1
  43. package/build/lib/basedriver/device-settings.js +57 -62
  44. package/build/lib/basedriver/device-settings.js.map +1 -1
  45. package/build/lib/basedriver/driver.d.ts +11 -262
  46. package/build/lib/basedriver/driver.d.ts.map +1 -1
  47. package/build/lib/basedriver/driver.js +362 -262
  48. package/build/lib/basedriver/driver.js.map +1 -1
  49. package/build/lib/basedriver/helpers.js +500 -495
  50. package/build/lib/basedriver/helpers.js.map +1 -1
  51. package/build/lib/basedriver/logger.d.ts +1 -1
  52. package/build/lib/basedriver/logger.d.ts.map +1 -1
  53. package/build/lib/basedriver/logger.js +5 -15
  54. package/build/lib/basedriver/logger.js.map +1 -1
  55. package/build/lib/constants.js +14 -14
  56. package/build/lib/constants.js.map +1 -1
  57. package/build/lib/express/crash.js +8 -15
  58. package/build/lib/express/crash.js.map +1 -1
  59. package/build/lib/express/express-logging.js +49 -59
  60. package/build/lib/express/express-logging.js.map +1 -1
  61. package/build/lib/express/idempotency.js +125 -177
  62. package/build/lib/express/idempotency.js.map +1 -1
  63. package/build/lib/express/logger.d.ts +1 -1
  64. package/build/lib/express/logger.d.ts.map +1 -1
  65. package/build/lib/express/logger.js +5 -15
  66. package/build/lib/express/logger.js.map +1 -1
  67. package/build/lib/express/middleware.js +82 -107
  68. package/build/lib/express/middleware.js.map +1 -1
  69. package/build/lib/express/server.d.ts +17 -5
  70. package/build/lib/express/server.d.ts.map +1 -1
  71. package/build/lib/express/server.js +259 -224
  72. package/build/lib/express/server.js.map +1 -1
  73. package/build/lib/express/static.js +64 -81
  74. package/build/lib/express/static.js.map +1 -1
  75. package/build/lib/express/websocket.js +115 -87
  76. package/build/lib/express/websocket.js.map +1 -1
  77. package/build/lib/helpers/capabilities.d.ts +1 -59
  78. package/build/lib/helpers/capabilities.d.ts.map +1 -1
  79. package/build/lib/helpers/capabilities.js +72 -69
  80. package/build/lib/helpers/capabilities.js.map +1 -1
  81. package/build/lib/index.js +64 -180
  82. package/build/lib/index.js.map +1 -1
  83. package/build/lib/jsonwp-proxy/protocol-converter.js +215 -227
  84. package/build/lib/jsonwp-proxy/protocol-converter.js.map +1 -1
  85. package/build/lib/jsonwp-proxy/proxy.d.ts.map +1 -1
  86. package/build/lib/jsonwp-proxy/proxy.js +355 -393
  87. package/build/lib/jsonwp-proxy/proxy.js.map +1 -1
  88. package/build/lib/jsonwp-status/status.js +119 -130
  89. package/build/lib/jsonwp-status/status.js.map +1 -1
  90. package/build/lib/protocol/errors.d.ts +135 -32
  91. package/build/lib/protocol/errors.d.ts.map +1 -1
  92. package/build/lib/protocol/errors.js +871 -919
  93. package/build/lib/protocol/errors.js.map +1 -1
  94. package/build/lib/protocol/helpers.js +37 -37
  95. package/build/lib/protocol/helpers.js.map +1 -1
  96. package/build/lib/protocol/index.js +22 -109
  97. package/build/lib/protocol/index.js.map +1 -1
  98. package/build/lib/protocol/protocol.js +394 -350
  99. package/build/lib/protocol/protocol.js.map +1 -1
  100. package/build/lib/protocol/routes.d.ts +1238 -4
  101. package/build/lib/protocol/routes.d.ts.map +1 -1
  102. package/build/lib/protocol/routes.js +964 -1327
  103. package/build/lib/protocol/routes.js.map +1 -1
  104. package/build/lib/protocol/validators.js +32 -39
  105. package/build/lib/protocol/validators.js.map +1 -1
  106. package/build/tsconfig.tsbuildinfo +1 -1
  107. package/lib/basedriver/capabilities.js +80 -39
  108. package/lib/basedriver/commands/event.js +10 -5
  109. package/lib/basedriver/commands/execute.js +14 -9
  110. package/lib/basedriver/commands/find.js +18 -12
  111. package/lib/basedriver/commands/index.js +21 -16
  112. package/lib/basedriver/commands/log.js +24 -18
  113. package/lib/basedriver/commands/session.js +10 -5
  114. package/lib/basedriver/commands/settings.js +9 -6
  115. package/lib/basedriver/commands/timeout.js +10 -4
  116. package/lib/basedriver/core.js +2 -3
  117. package/lib/basedriver/driver.js +12 -16
  118. package/lib/express/server.js +6 -3
  119. package/lib/protocol/errors.js +155 -44
  120. package/lib/protocol/routes.js +11 -7
  121. package/package.json +14 -16
@@ -1,1351 +1,988 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.NO_SESSION_ID_COMMANDS = exports.METHOD_MAP = exports.ALL_COMMANDS = void 0;
7
- exports.routeToCommandName = routeToCommandName;
8
-
9
- require("source-map-support/register");
10
-
11
- var _lodash = _interopRequireDefault(require("lodash"));
12
-
13
- var _support = require("@appium/support");
14
-
15
- var _constants = require("../constants");
16
-
17
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
18
-
2
+ // @ts-check
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.routeToCommandName = exports.NO_SESSION_ID_COMMANDS = exports.ALL_COMMANDS = exports.METHOD_MAP = void 0;
8
+ const lodash_1 = __importDefault(require("lodash"));
9
+ const support_1 = require("@appium/support");
10
+ const constants_1 = require("../constants");
19
11
  const SET_ALERT_TEXT_PAYLOAD_PARAMS = {
20
- validate: jsonObj => !_support.util.hasValue(jsonObj.value) && !_support.util.hasValue(jsonObj.text) && 'either "text" or "value" must be set',
21
- optional: ['value', 'text'],
22
- makeArgs: jsonObj => [jsonObj.value || jsonObj.text]
12
+ validate: (jsonObj) => !support_1.util.hasValue(jsonObj.value) &&
13
+ !support_1.util.hasValue(jsonObj.text) &&
14
+ 'either "text" or "value" must be set',
15
+ optional: ['value', 'text'],
16
+ // Prefer 'value' since it's more backward-compatible.
17
+ makeArgs: (jsonObj) => [jsonObj.value || jsonObj.text],
23
18
  };
24
- const METHOD_MAP = {
25
- '/status': {
26
- GET: {
27
- command: 'getStatus'
28
- }
29
- },
30
- '/session': {
31
- POST: {
32
- command: 'createSession',
33
- payloadParams: {
34
- validate: jsonObj => !jsonObj.capabilities && !jsonObj.desiredCapabilities && 'we require one of "desiredCapabilities" or "capabilities" object',
35
- optional: ['desiredCapabilities', 'requiredCapabilities', 'capabilities']
36
- }
37
- }
38
- },
39
- '/sessions': {
40
- GET: {
41
- command: 'getSessions'
42
- }
43
- },
44
- '/session/:sessionId': {
45
- GET: {
46
- command: 'getSession'
19
+ /**
20
+ * define the routes, mapping of HTTP methods to particular driver commands, and
21
+ * any parameters that are expected in a request parameters can be `required` or
22
+ * `optional`
23
+ */
24
+ const METHOD_MAP = /** @type {const} */ ({
25
+ '/status': {
26
+ GET: { command: 'getStatus' },
47
27
  },
48
- DELETE: {
49
- command: 'deleteSession'
50
- }
51
- },
52
- '/session/:sessionId/timeouts': {
53
- GET: {
54
- command: 'getTimeouts'
55
- },
56
- POST: {
57
- command: 'timeouts',
58
- payloadParams: {
59
- validate: (jsonObj, protocolName) => {
60
- if (protocolName === _constants.PROTOCOLS.W3C) {
61
- if (!_support.util.hasValue(jsonObj.script) && !_support.util.hasValue(jsonObj.pageLoad) && !_support.util.hasValue(jsonObj.implicit)) {
62
- return 'W3C protocol expects any of script, pageLoad or implicit to be set';
63
- }
64
- } else {
65
- if (!_support.util.hasValue(jsonObj.type) || !_support.util.hasValue(jsonObj.ms)) {
66
- return 'MJSONWP protocol requires type and ms';
67
- }
68
- }
28
+ '/session': {
29
+ POST: {
30
+ command: 'createSession',
31
+ payloadParams: {
32
+ validate: (jsonObj) => !jsonObj.capabilities &&
33
+ !jsonObj.desiredCapabilities &&
34
+ 'we require one of "desiredCapabilities" or "capabilities" object',
35
+ optional: ['desiredCapabilities', 'requiredCapabilities', 'capabilities'],
36
+ },
69
37
  },
70
- optional: ['type', 'ms', 'script', 'pageLoad', 'implicit']
71
- }
72
- }
73
- },
74
- '/session/:sessionId/timeouts/async_script': {
75
- POST: {
76
- command: 'asyncScriptTimeout',
77
- payloadParams: {
78
- required: ['ms']
79
- }
80
- }
81
- },
82
- '/session/:sessionId/timeouts/implicit_wait': {
83
- POST: {
84
- command: 'implicitWait',
85
- payloadParams: {
86
- required: ['ms']
87
- }
88
- }
89
- },
90
- '/session/:sessionId/window_handle': {
91
- GET: {
92
- command: 'getWindowHandle'
93
- }
94
- },
95
- '/session/:sessionId/window/handle': {
96
- GET: {
97
- command: 'getWindowHandle'
98
- }
99
- },
100
- '/session/:sessionId/window_handles': {
101
- GET: {
102
- command: 'getWindowHandles'
103
- }
104
- },
105
- '/session/:sessionId/window/handles': {
106
- GET: {
107
- command: 'getWindowHandles'
108
- }
109
- },
110
- '/session/:sessionId/url': {
111
- GET: {
112
- command: 'getUrl'
113
- },
114
- POST: {
115
- command: 'setUrl',
116
- payloadParams: {
117
- required: ['url']
118
- }
119
- }
120
- },
121
- '/session/:sessionId/forward': {
122
- POST: {
123
- command: 'forward'
124
- }
125
- },
126
- '/session/:sessionId/back': {
127
- POST: {
128
- command: 'back'
129
- }
130
- },
131
- '/session/:sessionId/refresh': {
132
- POST: {
133
- command: 'refresh'
134
- }
135
- },
136
- '/session/:sessionId/execute': {
137
- POST: {
138
- command: 'execute',
139
- payloadParams: {
140
- required: ['script', 'args']
141
- }
142
- }
143
- },
144
- '/session/:sessionId/execute_async': {
145
- POST: {
146
- command: 'executeAsync',
147
- payloadParams: {
148
- required: ['script', 'args']
149
- }
150
- }
151
- },
152
- '/session/:sessionId/screenshot': {
153
- GET: {
154
- command: 'getScreenshot'
155
- }
156
- },
157
- '/session/:sessionId/ime/available_engines': {
158
- GET: {
159
- command: 'availableIMEEngines'
160
- }
161
- },
162
- '/session/:sessionId/ime/active_engine': {
163
- GET: {
164
- command: 'getActiveIMEEngine'
165
- }
166
- },
167
- '/session/:sessionId/ime/activated': {
168
- GET: {
169
- command: 'isIMEActivated'
170
- }
171
- },
172
- '/session/:sessionId/ime/deactivate': {
173
- POST: {
174
- command: 'deactivateIMEEngine'
175
- }
176
- },
177
- '/session/:sessionId/ime/activate': {
178
- POST: {
179
- command: 'activateIMEEngine',
180
- payloadParams: {
181
- required: ['engine']
182
- }
183
- }
184
- },
185
- '/session/:sessionId/frame': {
186
- POST: {
187
- command: 'setFrame',
188
- payloadParams: {
189
- required: ['id']
190
- }
191
- }
192
- },
193
- '/session/:sessionId/frame/parent': {
194
- POST: {}
195
- },
196
- '/session/:sessionId/window': {
197
- GET: {
198
- command: 'getWindowHandle'
199
- },
200
- POST: {
201
- command: 'setWindow',
202
- payloadParams: {
203
- optional: ['name', 'handle'],
204
- makeArgs: jsonObj => {
205
- if (_support.util.hasValue(jsonObj.handle) && !_support.util.hasValue(jsonObj.name)) {
206
- return [jsonObj.handle, jsonObj.handle];
207
- }
208
-
209
- if (_support.util.hasValue(jsonObj.name) && !_support.util.hasValue(jsonObj.handle)) {
210
- return [jsonObj.name, jsonObj.name];
211
- }
212
-
213
- return [jsonObj.name, jsonObj.handle];
38
+ },
39
+ '/sessions': {
40
+ GET: { command: 'getSessions' },
41
+ },
42
+ '/session/:sessionId': {
43
+ GET: { command: 'getSession' },
44
+ DELETE: { command: 'deleteSession' },
45
+ },
46
+ '/session/:sessionId/timeouts': {
47
+ GET: { command: 'getTimeouts' },
48
+ POST: {
49
+ command: 'timeouts',
50
+ payloadParams: {
51
+ validate: (jsonObj, protocolName) => {
52
+ if (protocolName === constants_1.PROTOCOLS.W3C) {
53
+ if (!support_1.util.hasValue(jsonObj.script) &&
54
+ !support_1.util.hasValue(jsonObj.pageLoad) &&
55
+ !support_1.util.hasValue(jsonObj.implicit)) {
56
+ return 'W3C protocol expects any of script, pageLoad or implicit to be set';
57
+ }
58
+ }
59
+ else {
60
+ // MJSONWP
61
+ if (!support_1.util.hasValue(jsonObj.type) || !support_1.util.hasValue(jsonObj.ms)) {
62
+ return 'MJSONWP protocol requires type and ms';
63
+ }
64
+ }
65
+ },
66
+ optional: ['type', 'ms', 'script', 'pageLoad', 'implicit'],
67
+ },
214
68
  },
215
- validate: jsonObj => !_support.util.hasValue(jsonObj.name) && !_support.util.hasValue(jsonObj.handle) && 'we require one of "name" or "handle" to be set'
216
- }
217
69
  },
218
- DELETE: {
219
- command: 'closeWindow'
220
- }
221
- },
222
- '/session/:sessionId/window/:windowhandle/size': {
223
- GET: {
224
- command: 'getWindowSize'
225
- },
226
- POST: {}
227
- },
228
- '/session/:sessionId/window/:windowhandle/position': {
229
- POST: {},
230
- GET: {}
231
- },
232
- '/session/:sessionId/window/:windowhandle/maximize': {
233
- POST: {
234
- command: 'maximizeWindow'
235
- }
236
- },
237
- '/session/:sessionId/cookie': {
238
- GET: {
239
- command: 'getCookies'
240
- },
241
- POST: {
242
- command: 'setCookie',
243
- payloadParams: {
244
- required: ['cookie']
245
- }
246
- },
247
- DELETE: {
248
- command: 'deleteCookies'
249
- }
250
- },
251
- '/session/:sessionId/cookie/:name': {
252
- GET: {
253
- command: 'getCookie'
70
+ '/session/:sessionId/timeouts/async_script': {
71
+ POST: { command: 'asyncScriptTimeout', payloadParams: { required: ['ms'] } },
254
72
  },
255
- DELETE: {
256
- command: 'deleteCookie'
257
- }
258
- },
259
- '/session/:sessionId/source': {
260
- GET: {
261
- command: 'getPageSource'
262
- }
263
- },
264
- '/session/:sessionId/title': {
265
- GET: {
266
- command: 'title'
267
- }
268
- },
269
- '/session/:sessionId/element': {
270
- POST: {
271
- command: 'findElement',
272
- payloadParams: {
273
- required: ['using', 'value']
274
- }
275
- }
276
- },
277
- '/session/:sessionId/elements': {
278
- POST: {
279
- command: 'findElements',
280
- payloadParams: {
281
- required: ['using', 'value']
282
- }
283
- }
284
- },
285
- '/session/:sessionId/element/active': {
286
- GET: {
287
- command: 'active'
73
+ '/session/:sessionId/timeouts/implicit_wait': {
74
+ POST: { command: 'implicitWait', payloadParams: { required: ['ms'] } },
288
75
  },
289
- POST: {
290
- command: 'active'
291
- }
292
- },
293
- '/session/:sessionId/element/:elementId': {
294
- GET: {}
295
- },
296
- '/session/:sessionId/element/:elementId/element': {
297
- POST: {
298
- command: 'findElementFromElement',
299
- payloadParams: {
300
- required: ['using', 'value']
301
- }
302
- }
303
- },
304
- '/session/:sessionId/element/:elementId/elements': {
305
- POST: {
306
- command: 'findElementsFromElement',
307
- payloadParams: {
308
- required: ['using', 'value']
309
- }
310
- }
311
- },
312
- '/session/:sessionId/element/:elementId/click': {
313
- POST: {
314
- command: 'click'
315
- }
316
- },
317
- '/session/:sessionId/element/:elementId/submit': {
318
- POST: {
319
- command: 'submit'
320
- }
321
- },
322
- '/session/:sessionId/element/:elementId/text': {
323
- GET: {
324
- command: 'getText'
325
- }
326
- },
327
- '/session/:sessionId/element/:elementId/value': {
328
- POST: {
329
- command: 'setValue',
330
- payloadParams: {
331
- validate: jsonObj => !_support.util.hasValue(jsonObj.value) && !_support.util.hasValue(jsonObj.text) && 'we require one of "text" or "value" params',
332
- optional: ['value', 'text'],
333
- makeArgs: jsonObj => [jsonObj.value || jsonObj.text]
334
- }
335
- }
336
- },
337
- '/session/:sessionId/keys': {
338
- POST: {
339
- command: 'keys',
340
- payloadParams: {
341
- required: ['value']
342
- }
343
- }
344
- },
345
- '/session/:sessionId/element/:elementId/name': {
346
- GET: {
347
- command: 'getName'
348
- }
349
- },
350
- '/session/:sessionId/element/:elementId/clear': {
351
- POST: {
352
- command: 'clear'
353
- }
354
- },
355
- '/session/:sessionId/element/:elementId/selected': {
356
- GET: {
357
- command: 'elementSelected'
358
- }
359
- },
360
- '/session/:sessionId/element/:elementId/enabled': {
361
- GET: {
362
- command: 'elementEnabled'
363
- }
364
- },
365
- '/session/:sessionId/element/:elementId/attribute/:name': {
366
- GET: {
367
- command: 'getAttribute'
368
- }
369
- },
370
- '/session/:sessionId/element/:elementId/equals/:otherId': {
371
- GET: {
372
- command: 'equalsElement'
373
- }
374
- },
375
- '/session/:sessionId/element/:elementId/displayed': {
376
- GET: {
377
- command: 'elementDisplayed'
378
- }
379
- },
380
- '/session/:sessionId/element/:elementId/location': {
381
- GET: {
382
- command: 'getLocation'
383
- }
384
- },
385
- '/session/:sessionId/element/:elementId/location_in_view': {
386
- GET: {
387
- command: 'getLocationInView'
388
- }
389
- },
390
- '/session/:sessionId/element/:elementId/size': {
391
- GET: {
392
- command: 'getSize'
393
- }
394
- },
395
- '/session/:sessionId/element/:elementId/shadow': {
396
- GET: {
397
- command: 'elementShadowRoot'
398
- }
399
- },
400
- '/session/:sessionId/shadow/:shadowId/element': {
401
- POST: {
402
- command: 'findElementFromShadowRoot',
403
- payloadParams: {
404
- required: ['using', 'value']
405
- }
406
- }
407
- },
408
- '/session/:sessionId/shadow/:shadowId/elements': {
409
- POST: {
410
- command: 'findElementsFromShadowRoot',
411
- payloadParams: {
412
- required: ['using', 'value']
413
- }
414
- }
415
- },
416
- '/session/:sessionId/element/:elementId/css/:propertyName': {
417
- GET: {
418
- command: 'getCssProperty'
419
- }
420
- },
421
- '/session/:sessionId/orientation': {
422
- GET: {
423
- command: 'getOrientation'
424
- },
425
- POST: {
426
- command: 'setOrientation',
427
- payloadParams: {
428
- required: ['orientation']
429
- }
430
- }
431
- },
432
- '/session/:sessionId/rotation': {
433
- GET: {
434
- command: 'getRotation'
435
- },
436
- POST: {
437
- command: 'setRotation',
438
- payloadParams: {
439
- required: ['x', 'y', 'z']
440
- }
441
- }
442
- },
443
- '/session/:sessionId/moveto': {
444
- POST: {
445
- command: 'moveTo',
446
- payloadParams: {
447
- optional: ['element', 'xoffset', 'yoffset']
448
- }
449
- }
450
- },
451
- '/session/:sessionId/click': {
452
- POST: {
453
- command: 'clickCurrent',
454
- payloadParams: {
455
- optional: ['button']
456
- }
457
- }
458
- },
459
- '/session/:sessionId/buttondown': {
460
- POST: {
461
- command: 'buttonDown',
462
- payloadParams: {
463
- optional: ['button']
464
- }
465
- }
466
- },
467
- '/session/:sessionId/buttonup': {
468
- POST: {
469
- command: 'buttonUp',
470
- payloadParams: {
471
- optional: ['button']
472
- }
473
- }
474
- },
475
- '/session/:sessionId/doubleclick': {
476
- POST: {
477
- command: 'doubleClick'
478
- }
479
- },
480
- '/session/:sessionId/touch/click': {
481
- POST: {
482
- command: 'click',
483
- payloadParams: {
484
- required: ['element']
485
- }
486
- }
487
- },
488
- '/session/:sessionId/touch/down': {
489
- POST: {
490
- command: 'touchDown',
491
- payloadParams: {
492
- required: ['x', 'y']
493
- }
494
- }
495
- },
496
- '/session/:sessionId/touch/up': {
497
- POST: {
498
- command: 'touchUp',
499
- payloadParams: {
500
- required: ['x', 'y']
501
- }
502
- }
503
- },
504
- '/session/:sessionId/touch/move': {
505
- POST: {
506
- command: 'touchMove',
507
- payloadParams: {
508
- required: ['x', 'y']
509
- }
510
- }
511
- },
512
- '/session/:sessionId/touch/scroll': {
513
- POST: {}
514
- },
515
- '/session/:sessionId/touch/doubleclick': {
516
- POST: {}
517
- },
518
- '/session/:sessionId/actions': {
519
- POST: {
520
- command: 'performActions',
521
- payloadParams: {
522
- required: ['actions']
523
- }
524
- },
525
- DELETE: {
526
- command: 'releaseActions'
527
- }
528
- },
529
- '/session/:sessionId/touch/longclick': {
530
- POST: {
531
- command: 'touchLongClick',
532
- payloadParams: {
533
- required: ['elements']
534
- }
535
- }
536
- },
537
- '/session/:sessionId/touch/flick': {
538
- POST: {
539
- command: 'flick',
540
- payloadParams: {
541
- optional: ['element', 'xspeed', 'yspeed', 'xoffset', 'yoffset', 'speed']
542
- }
543
- }
544
- },
545
- '/session/:sessionId/location': {
546
- GET: {
547
- command: 'getGeoLocation'
548
- },
549
- POST: {
550
- command: 'setGeoLocation',
551
- payloadParams: {
552
- required: ['location']
553
- }
554
- }
555
- },
556
- '/session/:sessionId/local_storage': {
557
- GET: {},
558
- POST: {},
559
- DELETE: {}
560
- },
561
- '/session/:sessionId/local_storage/key/:key': {
562
- GET: {},
563
- DELETE: {}
564
- },
565
- '/session/:sessionId/local_storage/size': {
566
- GET: {}
567
- },
568
- '/session/:sessionId/session_storage': {
569
- GET: {},
570
- POST: {},
571
- DELETE: {}
572
- },
573
- '/session/:sessionId/session_storage/key/:key': {
574
- GET: {},
575
- DELETE: {}
576
- },
577
- '/session/:sessionId/session_storage/size': {
578
- GET: {}
579
- },
580
- '/session/:sessionId/se/log': {
581
- POST: {
582
- command: 'getLog',
583
- payloadParams: {
584
- required: ['type']
585
- }
586
- }
587
- },
588
- '/session/:sessionId/se/log/types': {
589
- GET: {
590
- command: 'getLogTypes'
591
- }
592
- },
593
- '/session/:sessionId/log': {
594
- POST: {
595
- command: 'getLog',
596
- payloadParams: {
597
- required: ['type']
598
- }
599
- }
600
- },
601
- '/session/:sessionId/log/types': {
602
- GET: {
603
- command: 'getLogTypes'
604
- }
605
- },
606
- '/session/:sessionId/application_cache/status': {
607
- GET: {}
608
- },
609
- '/session/:sessionId/context': {
610
- GET: {
611
- command: 'getCurrentContext'
612
- },
613
- POST: {
614
- command: 'setContext',
615
- payloadParams: {
616
- required: ['name']
617
- }
618
- }
619
- },
620
- '/session/:sessionId/contexts': {
621
- GET: {
622
- command: 'getContexts'
623
- }
624
- },
625
- '/session/:sessionId/element/:elementId/pageIndex': {
626
- GET: {
627
- command: 'getPageIndex'
628
- }
629
- },
630
- '/session/:sessionId/network_connection': {
631
- GET: {
632
- command: 'getNetworkConnection'
633
- },
634
- POST: {
635
- command: 'setNetworkConnection',
636
- payloadParams: {
637
- unwrap: 'parameters',
638
- required: ['type']
639
- }
640
- }
641
- },
642
- '/session/:sessionId/touch/perform': {
643
- POST: {
644
- command: 'performTouch',
645
- payloadParams: {
646
- wrap: 'actions',
647
- required: ['actions']
648
- }
649
- }
650
- },
651
- '/session/:sessionId/touch/multi/perform': {
652
- POST: {
653
- command: 'performMultiAction',
654
- payloadParams: {
655
- required: ['actions'],
656
- optional: ['elementId']
657
- }
658
- }
659
- },
660
- '/session/:sessionId/receive_async_response': {
661
- POST: {
662
- command: 'receiveAsyncResponse',
663
- payloadParams: {
664
- required: ['status', 'value']
665
- }
666
- }
667
- },
668
- '/session/:sessionId/appium/device/shake': {
669
- POST: {
670
- command: 'mobileShake'
671
- }
672
- },
673
- '/session/:sessionId/appium/device/system_time': {
674
- GET: {
675
- command: 'getDeviceTime',
676
- payloadParams: {
677
- optional: ['format']
678
- }
679
- },
680
- POST: {
681
- command: 'getDeviceTime',
682
- payloadParams: {
683
- optional: ['format']
684
- }
685
- }
686
- },
687
- '/session/:sessionId/appium/device/lock': {
688
- POST: {
689
- command: 'lock',
690
- payloadParams: {
691
- optional: ['seconds']
692
- }
693
- }
694
- },
695
- '/session/:sessionId/appium/device/unlock': {
696
- POST: {
697
- command: 'unlock'
698
- }
699
- },
700
- '/session/:sessionId/appium/device/is_locked': {
701
- POST: {
702
- command: 'isLocked'
703
- }
704
- },
705
- '/session/:sessionId/appium/start_recording_screen': {
706
- POST: {
707
- command: 'startRecordingScreen',
708
- payloadParams: {
709
- optional: ['options']
710
- }
711
- }
712
- },
713
- '/session/:sessionId/appium/stop_recording_screen': {
714
- POST: {
715
- command: 'stopRecordingScreen',
716
- payloadParams: {
717
- optional: ['options']
718
- }
719
- }
720
- },
721
- '/session/:sessionId/appium/performanceData/types': {
722
- POST: {
723
- command: 'getPerformanceDataTypes'
724
- }
725
- },
726
- '/session/:sessionId/appium/getPerformanceData': {
727
- POST: {
728
- command: 'getPerformanceData',
729
- payloadParams: {
730
- required: ['packageName', 'dataType'],
731
- optional: ['dataReadTimeout']
732
- }
733
- }
734
- },
735
- '/session/:sessionId/appium/device/press_keycode': {
736
- POST: {
737
- command: 'pressKeyCode',
738
- payloadParams: {
739
- required: ['keycode'],
740
- optional: ['metastate', 'flags']
741
- }
742
- }
743
- },
744
- '/session/:sessionId/appium/device/long_press_keycode': {
745
- POST: {
746
- command: 'longPressKeyCode',
747
- payloadParams: {
748
- required: ['keycode'],
749
- optional: ['metastate', 'flags']
750
- }
751
- }
752
- },
753
- '/session/:sessionId/appium/device/finger_print': {
754
- POST: {
755
- command: 'fingerprint',
756
- payloadParams: {
757
- required: ['fingerprintId']
758
- }
759
- }
760
- },
761
- '/session/:sessionId/appium/device/send_sms': {
762
- POST: {
763
- command: 'sendSMS',
764
- payloadParams: {
765
- required: ['phoneNumber', 'message']
766
- }
767
- }
768
- },
769
- '/session/:sessionId/appium/device/gsm_call': {
770
- POST: {
771
- command: 'gsmCall',
772
- payloadParams: {
773
- required: ['phoneNumber', 'action']
774
- }
775
- }
776
- },
777
- '/session/:sessionId/appium/device/gsm_signal': {
778
- POST: {
779
- command: 'gsmSignal',
780
- payloadParams: {
781
- validate: jsonObj => !_support.util.hasValue(jsonObj.signalStrength) && !_support.util.hasValue(jsonObj.signalStrengh) && 'we require one of "signalStrength" or "signalStrengh" params',
782
- optional: ['signalStrength', 'signalStrengh'],
783
- makeArgs: jsonObj => [_support.util.hasValue(jsonObj.signalStrength) ? jsonObj.signalStrength : jsonObj.signalStrengh]
784
- }
785
- }
786
- },
787
- '/session/:sessionId/appium/device/gsm_voice': {
788
- POST: {
789
- command: 'gsmVoice',
790
- payloadParams: {
791
- required: ['state']
792
- }
793
- }
794
- },
795
- '/session/:sessionId/appium/device/power_capacity': {
796
- POST: {
797
- command: 'powerCapacity',
798
- payloadParams: {
799
- required: ['percent']
800
- }
801
- }
802
- },
803
- '/session/:sessionId/appium/device/power_ac': {
804
- POST: {
805
- command: 'powerAC',
806
- payloadParams: {
807
- required: ['state']
808
- }
809
- }
810
- },
811
- '/session/:sessionId/appium/device/network_speed': {
812
- POST: {
813
- command: 'networkSpeed',
814
- payloadParams: {
815
- required: ['netspeed']
816
- }
817
- }
818
- },
819
- '/session/:sessionId/appium/device/keyevent': {
820
- POST: {
821
- command: 'keyevent',
822
- payloadParams: {
823
- required: ['keycode'],
824
- optional: ['metastate']
825
- }
826
- }
827
- },
828
- '/session/:sessionId/appium/device/rotate': {
829
- POST: {
830
- command: 'mobileRotation',
831
- payloadParams: {
832
- required: ['x', 'y', 'radius', 'rotation', 'touchCount', 'duration'],
833
- optional: ['element']
834
- }
835
- }
836
- },
837
- '/session/:sessionId/appium/device/current_activity': {
838
- GET: {
839
- command: 'getCurrentActivity'
840
- }
841
- },
842
- '/session/:sessionId/appium/device/current_package': {
843
- GET: {
844
- command: 'getCurrentPackage'
845
- }
846
- },
847
- '/session/:sessionId/appium/device/install_app': {
848
- POST: {
849
- command: 'installApp',
850
- payloadParams: {
851
- required: ['appPath'],
852
- optional: ['options']
853
- }
854
- }
855
- },
856
- '/session/:sessionId/appium/device/activate_app': {
857
- POST: {
858
- command: 'activateApp',
859
- payloadParams: {
860
- required: [['appId'], ['bundleId']],
861
- optional: ['options']
862
- }
863
- }
864
- },
865
- '/session/:sessionId/appium/device/remove_app': {
866
- POST: {
867
- command: 'removeApp',
868
- payloadParams: {
869
- required: [['appId'], ['bundleId']],
870
- optional: ['options']
871
- }
872
- }
873
- },
874
- '/session/:sessionId/appium/device/terminate_app': {
875
- POST: {
876
- command: 'terminateApp',
877
- payloadParams: {
878
- required: [['appId'], ['bundleId']],
879
- optional: ['options']
880
- }
881
- }
882
- },
883
- '/session/:sessionId/appium/device/app_installed': {
884
- POST: {
885
- command: 'isAppInstalled',
886
- payloadParams: {
887
- required: [['appId'], ['bundleId']]
888
- }
889
- }
890
- },
891
- '/session/:sessionId/appium/device/app_state': {
892
- GET: {
893
- command: 'queryAppState',
894
- payloadParams: {
895
- required: [['appId'], ['bundleId']]
896
- }
897
- },
898
- POST: {
899
- command: 'queryAppState',
900
- payloadParams: {
901
- required: [['appId'], ['bundleId']]
902
- }
903
- }
904
- },
905
- '/session/:sessionId/appium/device/hide_keyboard': {
906
- POST: {
907
- command: 'hideKeyboard',
908
- payloadParams: {
909
- optional: ['strategy', 'key', 'keyCode', 'keyName']
910
- }
911
- }
912
- },
913
- '/session/:sessionId/appium/device/is_keyboard_shown': {
914
- GET: {
915
- command: 'isKeyboardShown'
916
- }
917
- },
918
- '/session/:sessionId/appium/device/push_file': {
919
- POST: {
920
- command: 'pushFile',
921
- payloadParams: {
922
- required: ['path', 'data']
923
- }
924
- }
925
- },
926
- '/session/:sessionId/appium/device/pull_file': {
927
- POST: {
928
- command: 'pullFile',
929
- payloadParams: {
930
- required: ['path']
931
- }
932
- }
933
- },
934
- '/session/:sessionId/appium/device/pull_folder': {
935
- POST: {
936
- command: 'pullFolder',
937
- payloadParams: {
938
- required: ['path']
939
- }
940
- }
941
- },
942
- '/session/:sessionId/appium/device/toggle_airplane_mode': {
943
- POST: {
944
- command: 'toggleFlightMode'
945
- }
946
- },
947
- '/session/:sessionId/appium/device/toggle_data': {
948
- POST: {
949
- command: 'toggleData'
950
- }
951
- },
952
- '/session/:sessionId/appium/device/toggle_wifi': {
953
- POST: {
954
- command: 'toggleWiFi'
955
- }
956
- },
957
- '/session/:sessionId/appium/device/toggle_location_services': {
958
- POST: {
959
- command: 'toggleLocationServices'
960
- }
961
- },
962
- '/session/:sessionId/appium/device/open_notifications': {
963
- POST: {
964
- command: 'openNotifications'
965
- }
966
- },
967
- '/session/:sessionId/appium/device/start_activity': {
968
- POST: {
969
- command: 'startActivity',
970
- payloadParams: {
971
- required: ['appPackage', 'appActivity'],
972
- optional: ['appWaitPackage', 'appWaitActivity', 'intentAction', 'intentCategory', 'intentFlags', 'optionalIntentArguments', 'dontStopAppOnReset']
973
- }
974
- }
975
- },
976
- '/session/:sessionId/appium/device/system_bars': {
977
- GET: {
978
- command: 'getSystemBars'
979
- }
980
- },
981
- '/session/:sessionId/appium/device/display_density': {
982
- GET: {
983
- command: 'getDisplayDensity'
984
- }
985
- },
986
- '/session/:sessionId/appium/simulator/touch_id': {
987
- POST: {
988
- command: 'touchId',
989
- payloadParams: {
990
- required: ['match']
991
- }
992
- }
993
- },
994
- '/session/:sessionId/appium/simulator/toggle_touch_id_enrollment': {
995
- POST: {
996
- command: 'toggleEnrollTouchId',
997
- payloadParams: {
998
- optional: ['enabled']
999
- }
1000
- }
1001
- },
1002
- '/session/:sessionId/appium/app/launch': {
1003
- POST: {
1004
- command: 'launchApp'
1005
- }
1006
- },
1007
- '/session/:sessionId/appium/app/close': {
1008
- POST: {
1009
- command: 'closeApp'
1010
- }
1011
- },
1012
- '/session/:sessionId/appium/app/reset': {
1013
- POST: {
1014
- command: 'reset'
1015
- }
1016
- },
1017
- '/session/:sessionId/appium/app/background': {
1018
- POST: {
1019
- command: 'background',
1020
- payloadParams: {
1021
- required: ['seconds']
1022
- }
1023
- }
1024
- },
1025
- '/session/:sessionId/appium/app/end_test_coverage': {
1026
- POST: {
1027
- command: 'endCoverage',
1028
- payloadParams: {
1029
- required: ['intent', 'path']
1030
- }
1031
- }
1032
- },
1033
- '/session/:sessionId/appium/app/strings': {
1034
- POST: {
1035
- command: 'getStrings',
1036
- payloadParams: {
1037
- optional: ['language', 'stringFile']
1038
- }
1039
- }
1040
- },
1041
- '/session/:sessionId/appium/element/:elementId/value': {
1042
- POST: {
1043
- command: 'setValueImmediate',
1044
- payloadParams: {
1045
- validate: jsonObj => !_support.util.hasValue(jsonObj.value) && !_support.util.hasValue(jsonObj.text) && 'we require one of "text" or "value" params',
1046
- optional: ['value', 'text'],
1047
- makeArgs: jsonObj => [jsonObj.value || jsonObj.text]
1048
- }
1049
- }
1050
- },
1051
- '/session/:sessionId/appium/element/:elementId/replace_value': {
1052
- POST: {
1053
- command: 'replaceValue',
1054
- payloadParams: {
1055
- validate: jsonObj => !_support.util.hasValue(jsonObj.value) && !_support.util.hasValue(jsonObj.text) && 'we require one of "text" or "value" params',
1056
- optional: ['value', 'text'],
1057
- makeArgs: jsonObj => [jsonObj.value ?? jsonObj.text ?? '']
1058
- }
1059
- }
1060
- },
1061
- '/session/:sessionId/appium/settings': {
1062
- POST: {
1063
- command: 'updateSettings',
1064
- payloadParams: {
1065
- required: ['settings']
1066
- }
1067
- },
1068
- GET: {
1069
- command: 'getSettings'
1070
- }
1071
- },
1072
- '/session/:sessionId/appium/receive_async_response': {
1073
- POST: {
1074
- command: 'receiveAsyncResponse',
1075
- payloadParams: {
1076
- required: ['response']
1077
- }
1078
- }
1079
- },
1080
- '/session/:sessionId/appium/events': {
1081
- POST: {
1082
- command: 'getLogEvents',
1083
- payloadParams: {
1084
- optional: ['type']
1085
- }
1086
- }
1087
- },
1088
- '/session/:sessionId/appium/log_event': {
1089
- POST: {
1090
- command: 'logCustomEvent',
1091
- payloadParams: {
1092
- required: ['vendor', 'event']
1093
- }
1094
- }
1095
- },
1096
- '/session/:sessionId/alert_text': {
1097
- GET: {
1098
- command: 'getAlertText'
1099
- },
1100
- POST: {
1101
- command: 'setAlertText',
1102
- payloadParams: SET_ALERT_TEXT_PAYLOAD_PARAMS
1103
- }
1104
- },
1105
- '/session/:sessionId/accept_alert': {
1106
- POST: {
1107
- command: 'postAcceptAlert'
1108
- }
1109
- },
1110
- '/session/:sessionId/dismiss_alert': {
1111
- POST: {
1112
- command: 'postDismissAlert'
1113
- }
1114
- },
1115
- '/session/:sessionId/alert/text': {
1116
- GET: {
1117
- command: 'getAlertText'
1118
- },
1119
- POST: {
1120
- command: 'setAlertText',
1121
- payloadParams: SET_ALERT_TEXT_PAYLOAD_PARAMS
1122
- }
1123
- },
1124
- '/session/:sessionId/alert/accept': {
1125
- POST: {
1126
- command: 'postAcceptAlert'
1127
- }
1128
- },
1129
- '/session/:sessionId/alert/dismiss': {
1130
- POST: {
1131
- command: 'postDismissAlert'
1132
- }
1133
- },
1134
- '/session/:sessionId/element/:elementId/rect': {
1135
- GET: {
1136
- command: 'getElementRect'
1137
- }
1138
- },
1139
- '/session/:sessionId/execute/sync': {
1140
- POST: {
1141
- command: 'execute',
1142
- payloadParams: {
1143
- required: ['script', 'args']
1144
- }
1145
- }
1146
- },
1147
- '/session/:sessionId/execute/async': {
1148
- POST: {
1149
- command: 'executeAsync',
1150
- payloadParams: {
1151
- required: ['script', 'args']
1152
- }
1153
- }
1154
- },
1155
- '/session/:sessionId/screenshot/:elementId': {
1156
- GET: {
1157
- command: 'getElementScreenshot'
1158
- }
1159
- },
1160
- '/session/:sessionId/element/:elementId/screenshot': {
1161
- GET: {
1162
- command: 'getElementScreenshot'
1163
- }
1164
- },
1165
- '/session/:sessionId/window/rect': {
1166
- GET: {
1167
- command: 'getWindowRect'
1168
- },
1169
- POST: {
1170
- command: 'setWindowRect',
1171
- payloadParams: {
1172
- required: ['x', 'y', 'width', 'height']
1173
- }
1174
- }
1175
- },
1176
- '/session/:sessionId/window/maximize': {
1177
- POST: {
1178
- command: 'maximizeWindow'
1179
- }
1180
- },
1181
- '/session/:sessionId/window/minimize': {
1182
- POST: {
1183
- command: 'minimizeWindow'
1184
- }
1185
- },
1186
- '/session/:sessionId/window/fullscreen': {
1187
- POST: {
1188
- command: 'fullScreenWindow'
1189
- }
1190
- },
1191
- '/session/:sessionId/window/new': {
1192
- POST: {
1193
- command: 'createNewWindow',
1194
- payloadParams: {
1195
- optional: ['type']
1196
- }
1197
- }
1198
- },
1199
- '/session/:sessionId/element/:elementId/property/:name': {
1200
- GET: {
1201
- command: 'getProperty'
1202
- }
1203
- },
1204
- '/session/:sessionId/appium/device/set_clipboard': {
1205
- POST: {
1206
- command: 'setClipboard',
1207
- payloadParams: {
1208
- required: ['content'],
1209
- optional: ['contentType', 'label']
1210
- }
1211
- }
1212
- },
1213
- '/session/:sessionId/appium/device/get_clipboard': {
1214
- POST: {
1215
- command: 'getClipboard',
1216
- payloadParams: {
1217
- optional: ['contentType']
1218
- }
1219
- }
1220
- },
1221
- '/session/:sessionId/:vendor/cdp/execute': {
1222
- POST: {
1223
- command: 'executeCdp',
1224
- payloadParams: {
1225
- required: ['cmd', 'params']
1226
- }
1227
- }
1228
- },
1229
- '/session/:sessionId/webauthn/authenticator': {
1230
- POST: {
1231
- command: 'addVirtualAuthenticator',
1232
- payloadParams: {
1233
- required: ['protocol', 'transport'],
1234
- optional: ['hasResidentKey', 'hasUserVerification', 'isUserConsenting', 'isUserVerified']
1235
- }
1236
- }
1237
- },
1238
- '/session/:sessionId/webauthn/authenticator/:authenticatorId': {
1239
- DELETE: {
1240
- command: 'removeVirtualAuthenticator'
1241
- }
1242
- },
1243
- '/session/:sessionId/webauthn/authenticator/:authenticatorId/credential': {
1244
- POST: {
1245
- command: 'addAuthCredential',
1246
- payloadParams: {
1247
- required: ['credentialId', 'isResidentCredential', 'rpId', 'privateKey'],
1248
- optional: ['userHandle', 'signCount']
1249
- }
1250
- }
1251
- },
1252
- '/session/:sessionId/webauthn/authenticator/:authenticatorId/credentials': {
1253
- GET: {
1254
- command: 'getAuthCredential'
76
+ // JSONWP
77
+ '/session/:sessionId/window_handle': {
78
+ GET: { command: 'getWindowHandle' },
1255
79
  },
1256
- DELETE: {
1257
- command: 'removeAllAuthCredentials'
1258
- }
1259
- },
1260
- '/session/:sessionId/webauthn/authenticator/:authenticatorId/credentials/:credentialId': {
1261
- DELETE: {
1262
- command: 'removeAuthCredential'
1263
- }
1264
- },
1265
- '/session/:sessionId/webauthn/authenticator/:authenticatorId/uv': {
1266
- POST: {
1267
- command: 'setUserAuthVerified',
1268
- payloadParams: {
1269
- required: ['isUserVerified']
1270
- }
1271
- }
1272
- }
1273
- };
80
+ // W3C
81
+ '/session/:sessionId/window/handle': {
82
+ GET: { command: 'getWindowHandle' },
83
+ },
84
+ // JSONWP
85
+ '/session/:sessionId/window_handles': {
86
+ GET: { command: 'getWindowHandles' },
87
+ },
88
+ // W3C
89
+ '/session/:sessionId/window/handles': {
90
+ GET: { command: 'getWindowHandles' },
91
+ },
92
+ '/session/:sessionId/url': {
93
+ GET: { command: 'getUrl' },
94
+ POST: { command: 'setUrl', payloadParams: { required: ['url'] } },
95
+ },
96
+ '/session/:sessionId/forward': {
97
+ POST: { command: 'forward' },
98
+ },
99
+ '/session/:sessionId/back': {
100
+ POST: { command: 'back' },
101
+ },
102
+ '/session/:sessionId/refresh': {
103
+ POST: { command: 'refresh' },
104
+ },
105
+ // MJSONWP
106
+ '/session/:sessionId/execute': {
107
+ POST: { command: 'execute', payloadParams: { required: ['script', 'args'] } },
108
+ },
109
+ // MJSONWP
110
+ '/session/:sessionId/execute_async': {
111
+ POST: {
112
+ command: 'executeAsync',
113
+ payloadParams: { required: ['script', 'args'] },
114
+ },
115
+ },
116
+ '/session/:sessionId/screenshot': {
117
+ GET: { command: 'getScreenshot' },
118
+ },
119
+ '/session/:sessionId/ime/available_engines': {
120
+ GET: { command: 'availableIMEEngines' },
121
+ },
122
+ '/session/:sessionId/ime/active_engine': {
123
+ GET: { command: 'getActiveIMEEngine' },
124
+ },
125
+ '/session/:sessionId/ime/activated': {
126
+ GET: { command: 'isIMEActivated' },
127
+ },
128
+ '/session/:sessionId/ime/deactivate': {
129
+ POST: { command: 'deactivateIMEEngine' },
130
+ },
131
+ '/session/:sessionId/ime/activate': {
132
+ POST: { command: 'activateIMEEngine', payloadParams: { required: ['engine'] } },
133
+ },
134
+ '/session/:sessionId/frame': {
135
+ POST: { command: 'setFrame', payloadParams: { required: ['id'] } },
136
+ },
137
+ '/session/:sessionId/frame/parent': {
138
+ POST: {},
139
+ },
140
+ '/session/:sessionId/window': {
141
+ GET: { command: 'getWindowHandle' },
142
+ POST: {
143
+ command: 'setWindow',
144
+ payloadParams: {
145
+ optional: ['name', 'handle'],
146
+ // Return both values to match W3C and JSONWP protocols
147
+ makeArgs: (jsonObj) => {
148
+ if (support_1.util.hasValue(jsonObj.handle) && !support_1.util.hasValue(jsonObj.name)) {
149
+ return [jsonObj.handle, jsonObj.handle];
150
+ }
151
+ if (support_1.util.hasValue(jsonObj.name) && !support_1.util.hasValue(jsonObj.handle)) {
152
+ return [jsonObj.name, jsonObj.name];
153
+ }
154
+ return [jsonObj.name, jsonObj.handle];
155
+ },
156
+ validate: (jsonObj) => !support_1.util.hasValue(jsonObj.name) &&
157
+ !support_1.util.hasValue(jsonObj.handle) &&
158
+ 'we require one of "name" or "handle" to be set',
159
+ },
160
+ },
161
+ DELETE: { command: 'closeWindow' },
162
+ },
163
+ '/session/:sessionId/window/:windowhandle/size': {
164
+ GET: { command: 'getWindowSize' },
165
+ POST: {},
166
+ },
167
+ '/session/:sessionId/window/:windowhandle/position': {
168
+ POST: {},
169
+ GET: {},
170
+ },
171
+ '/session/:sessionId/window/:windowhandle/maximize': {
172
+ POST: { command: 'maximizeWindow' },
173
+ },
174
+ '/session/:sessionId/cookie': {
175
+ GET: { command: 'getCookies' },
176
+ POST: { command: 'setCookie', payloadParams: { required: ['cookie'] } },
177
+ DELETE: { command: 'deleteCookies' },
178
+ },
179
+ '/session/:sessionId/cookie/:name': {
180
+ GET: { command: 'getCookie' },
181
+ DELETE: { command: 'deleteCookie' },
182
+ },
183
+ '/session/:sessionId/source': {
184
+ GET: { command: 'getPageSource' },
185
+ },
186
+ '/session/:sessionId/title': {
187
+ GET: { command: 'title' },
188
+ },
189
+ '/session/:sessionId/element': {
190
+ POST: {
191
+ command: 'findElement',
192
+ payloadParams: { required: ['using', 'value'] },
193
+ },
194
+ },
195
+ '/session/:sessionId/elements': {
196
+ POST: {
197
+ command: 'findElements',
198
+ payloadParams: { required: ['using', 'value'] },
199
+ },
200
+ },
201
+ '/session/:sessionId/element/active': {
202
+ GET: { command: 'active' },
203
+ POST: { command: 'active' },
204
+ },
205
+ '/session/:sessionId/element/:elementId': {
206
+ GET: {},
207
+ },
208
+ '/session/:sessionId/element/:elementId/element': {
209
+ POST: {
210
+ command: 'findElementFromElement',
211
+ payloadParams: { required: ['using', 'value'] },
212
+ },
213
+ },
214
+ '/session/:sessionId/element/:elementId/elements': {
215
+ POST: {
216
+ command: 'findElementsFromElement',
217
+ payloadParams: { required: ['using', 'value'] },
218
+ },
219
+ },
220
+ '/session/:sessionId/element/:elementId/click': {
221
+ POST: { command: 'click' },
222
+ },
223
+ '/session/:sessionId/element/:elementId/submit': {
224
+ POST: { command: 'submit' },
225
+ },
226
+ '/session/:sessionId/element/:elementId/text': {
227
+ GET: { command: 'getText' },
228
+ },
229
+ '/session/:sessionId/element/:elementId/value': {
230
+ POST: {
231
+ command: 'setValue',
232
+ payloadParams: {
233
+ validate: (jsonObj) => !support_1.util.hasValue(jsonObj.value) &&
234
+ !support_1.util.hasValue(jsonObj.text) &&
235
+ 'we require one of "text" or "value" params',
236
+ optional: ['value', 'text'],
237
+ // override the default argument constructor because of the special
238
+ // logic here. Basically we want to accept either a value (old JSONWP)
239
+ // or a text (new W3C) parameter, but only send one of them to the
240
+ // command (not both). Prefer 'value' since it's more
241
+ // backward-compatible.
242
+ makeArgs: (jsonObj) => [jsonObj.value || jsonObj.text],
243
+ },
244
+ },
245
+ },
246
+ '/session/:sessionId/keys': {
247
+ POST: { command: 'keys', payloadParams: { required: ['value'] } },
248
+ },
249
+ '/session/:sessionId/element/:elementId/name': {
250
+ GET: { command: 'getName' },
251
+ },
252
+ '/session/:sessionId/element/:elementId/clear': {
253
+ POST: { command: 'clear' },
254
+ },
255
+ '/session/:sessionId/element/:elementId/selected': {
256
+ GET: { command: 'elementSelected' },
257
+ },
258
+ '/session/:sessionId/element/:elementId/enabled': {
259
+ GET: { command: 'elementEnabled' },
260
+ },
261
+ '/session/:sessionId/element/:elementId/attribute/:name': {
262
+ GET: { command: 'getAttribute' },
263
+ },
264
+ '/session/:sessionId/element/:elementId/equals/:otherId': {
265
+ GET: { command: 'equalsElement' },
266
+ },
267
+ '/session/:sessionId/element/:elementId/displayed': {
268
+ GET: { command: 'elementDisplayed' },
269
+ },
270
+ '/session/:sessionId/element/:elementId/location': {
271
+ GET: { command: 'getLocation' },
272
+ },
273
+ '/session/:sessionId/element/:elementId/location_in_view': {
274
+ GET: { command: 'getLocationInView' },
275
+ },
276
+ '/session/:sessionId/element/:elementId/size': {
277
+ GET: { command: 'getSize' },
278
+ },
279
+ '/session/:sessionId/element/:elementId/shadow': {
280
+ GET: { command: 'elementShadowRoot' },
281
+ },
282
+ '/session/:sessionId/shadow/:shadowId/element': {
283
+ POST: {
284
+ command: 'findElementFromShadowRoot',
285
+ payloadParams: { required: ['using', 'value'] },
286
+ },
287
+ },
288
+ '/session/:sessionId/shadow/:shadowId/elements': {
289
+ POST: {
290
+ command: 'findElementsFromShadowRoot',
291
+ payloadParams: { required: ['using', 'value'] },
292
+ },
293
+ },
294
+ '/session/:sessionId/element/:elementId/css/:propertyName': {
295
+ GET: { command: 'getCssProperty' },
296
+ },
297
+ '/session/:sessionId/orientation': {
298
+ GET: { command: 'getOrientation' },
299
+ POST: {
300
+ command: 'setOrientation',
301
+ payloadParams: { required: ['orientation'] },
302
+ },
303
+ },
304
+ '/session/:sessionId/rotation': {
305
+ GET: { command: 'getRotation' },
306
+ POST: { command: 'setRotation', payloadParams: { required: ['x', 'y', 'z'] } },
307
+ },
308
+ '/session/:sessionId/moveto': {
309
+ POST: {
310
+ command: 'moveTo',
311
+ payloadParams: { optional: ['element', 'xoffset', 'yoffset'] },
312
+ },
313
+ },
314
+ '/session/:sessionId/click': {
315
+ POST: { command: 'clickCurrent', payloadParams: { optional: ['button'] } },
316
+ },
317
+ '/session/:sessionId/buttondown': {
318
+ POST: { command: 'buttonDown', payloadParams: { optional: ['button'] } },
319
+ },
320
+ '/session/:sessionId/buttonup': {
321
+ POST: { command: 'buttonUp', payloadParams: { optional: ['button'] } },
322
+ },
323
+ '/session/:sessionId/doubleclick': {
324
+ POST: { command: 'doubleClick' },
325
+ },
326
+ '/session/:sessionId/touch/click': {
327
+ POST: { command: 'click', payloadParams: { required: ['element'] } },
328
+ },
329
+ '/session/:sessionId/touch/down': {
330
+ POST: { command: 'touchDown', payloadParams: { required: ['x', 'y'] } },
331
+ },
332
+ '/session/:sessionId/touch/up': {
333
+ POST: { command: 'touchUp', payloadParams: { required: ['x', 'y'] } },
334
+ },
335
+ '/session/:sessionId/touch/move': {
336
+ POST: { command: 'touchMove', payloadParams: { required: ['x', 'y'] } },
337
+ },
338
+ '/session/:sessionId/touch/scroll': {
339
+ POST: {},
340
+ },
341
+ '/session/:sessionId/touch/doubleclick': {
342
+ POST: {},
343
+ },
344
+ '/session/:sessionId/actions': {
345
+ POST: { command: 'performActions', payloadParams: { required: ['actions'] } },
346
+ DELETE: { command: 'releaseActions' },
347
+ },
348
+ '/session/:sessionId/touch/longclick': {
349
+ POST: { command: 'touchLongClick', payloadParams: { required: ['elements'] } },
350
+ },
351
+ '/session/:sessionId/touch/flick': {
352
+ POST: {
353
+ command: 'flick',
354
+ payloadParams: {
355
+ optional: ['element', 'xspeed', 'yspeed', 'xoffset', 'yoffset', 'speed'],
356
+ },
357
+ },
358
+ },
359
+ '/session/:sessionId/location': {
360
+ GET: { command: 'getGeoLocation' },
361
+ POST: { command: 'setGeoLocation', payloadParams: { required: ['location'] } },
362
+ },
363
+ '/session/:sessionId/local_storage': {
364
+ GET: {},
365
+ POST: {},
366
+ DELETE: {},
367
+ },
368
+ '/session/:sessionId/local_storage/key/:key': {
369
+ GET: {},
370
+ DELETE: {},
371
+ },
372
+ '/session/:sessionId/local_storage/size': {
373
+ GET: {},
374
+ },
375
+ '/session/:sessionId/session_storage': {
376
+ GET: {},
377
+ POST: {},
378
+ DELETE: {},
379
+ },
380
+ '/session/:sessionId/session_storage/key/:key': {
381
+ GET: {},
382
+ DELETE: {},
383
+ },
384
+ '/session/:sessionId/session_storage/size': {
385
+ GET: {},
386
+ },
387
+ // Selenium 4 clients
388
+ '/session/:sessionId/se/log': {
389
+ POST: { command: 'getLog', payloadParams: { required: ['type'] } },
390
+ },
391
+ // Selenium 4 clients
392
+ '/session/:sessionId/se/log/types': {
393
+ GET: { command: 'getLogTypes' },
394
+ },
395
+ // mjsonwire, appium clients
396
+ '/session/:sessionId/log': {
397
+ POST: { command: 'getLog', payloadParams: { required: ['type'] } },
398
+ },
399
+ // mjsonwire, appium clients
400
+ '/session/:sessionId/log/types': {
401
+ GET: { command: 'getLogTypes' },
402
+ },
403
+ '/session/:sessionId/application_cache/status': {
404
+ GET: {},
405
+ },
406
+ //
407
+ // mjsonwire
408
+ //
409
+ '/session/:sessionId/context': {
410
+ GET: { command: 'getCurrentContext' },
411
+ POST: { command: 'setContext', payloadParams: { required: ['name'] } },
412
+ },
413
+ '/session/:sessionId/contexts': {
414
+ GET: { command: 'getContexts' },
415
+ },
416
+ '/session/:sessionId/element/:elementId/pageIndex': {
417
+ GET: { command: 'getPageIndex' },
418
+ },
419
+ '/session/:sessionId/network_connection': {
420
+ GET: { command: 'getNetworkConnection' },
421
+ POST: {
422
+ command: 'setNetworkConnection',
423
+ payloadParams: { unwrap: 'parameters', required: ['type'] },
424
+ },
425
+ },
426
+ '/session/:sessionId/touch/perform': {
427
+ POST: {
428
+ command: 'performTouch',
429
+ payloadParams: { wrap: 'actions', required: ['actions'] },
430
+ },
431
+ },
432
+ '/session/:sessionId/touch/multi/perform': {
433
+ POST: {
434
+ command: 'performMultiAction',
435
+ payloadParams: { required: ['actions'], optional: ['elementId'] },
436
+ },
437
+ },
438
+ '/session/:sessionId/receive_async_response': {
439
+ POST: {
440
+ command: 'receiveAsyncResponse',
441
+ payloadParams: { required: ['status', 'value'] },
442
+ },
443
+ },
444
+ '/session/:sessionId/appium/device/shake': {
445
+ POST: { command: 'mobileShake' },
446
+ },
447
+ '/session/:sessionId/appium/device/system_time': {
448
+ GET: { command: 'getDeviceTime', payloadParams: { optional: ['format'] } },
449
+ POST: { command: 'getDeviceTime', payloadParams: { optional: ['format'] } },
450
+ },
451
+ '/session/:sessionId/appium/device/lock': {
452
+ POST: { command: 'lock', payloadParams: { optional: ['seconds'] } },
453
+ },
454
+ '/session/:sessionId/appium/device/unlock': {
455
+ POST: { command: 'unlock' },
456
+ },
457
+ '/session/:sessionId/appium/device/is_locked': {
458
+ POST: { command: 'isLocked' },
459
+ },
460
+ '/session/:sessionId/appium/start_recording_screen': {
461
+ POST: {
462
+ command: 'startRecordingScreen',
463
+ payloadParams: { optional: ['options'] },
464
+ },
465
+ },
466
+ '/session/:sessionId/appium/stop_recording_screen': {
467
+ POST: {
468
+ command: 'stopRecordingScreen',
469
+ payloadParams: { optional: ['options'] },
470
+ },
471
+ },
472
+ '/session/:sessionId/appium/performanceData/types': {
473
+ POST: { command: 'getPerformanceDataTypes' },
474
+ },
475
+ '/session/:sessionId/appium/getPerformanceData': {
476
+ POST: {
477
+ command: 'getPerformanceData',
478
+ payloadParams: {
479
+ required: ['packageName', 'dataType'],
480
+ optional: ['dataReadTimeout'],
481
+ },
482
+ },
483
+ },
484
+ '/session/:sessionId/appium/device/press_keycode': {
485
+ POST: {
486
+ command: 'pressKeyCode',
487
+ payloadParams: { required: ['keycode'], optional: ['metastate', 'flags'] },
488
+ },
489
+ },
490
+ '/session/:sessionId/appium/device/long_press_keycode': {
491
+ POST: {
492
+ command: 'longPressKeyCode',
493
+ payloadParams: { required: ['keycode'], optional: ['metastate', 'flags'] },
494
+ },
495
+ },
496
+ '/session/:sessionId/appium/device/finger_print': {
497
+ POST: {
498
+ command: 'fingerprint',
499
+ payloadParams: { required: ['fingerprintId'] },
500
+ },
501
+ },
502
+ '/session/:sessionId/appium/device/send_sms': {
503
+ POST: {
504
+ command: 'sendSMS',
505
+ payloadParams: { required: ['phoneNumber', 'message'] },
506
+ },
507
+ },
508
+ '/session/:sessionId/appium/device/gsm_call': {
509
+ POST: {
510
+ command: 'gsmCall',
511
+ payloadParams: { required: ['phoneNumber', 'action'] },
512
+ },
513
+ },
514
+ '/session/:sessionId/appium/device/gsm_signal': {
515
+ POST: {
516
+ command: 'gsmSignal',
517
+ payloadParams: {
518
+ validate: (jsonObj) => !support_1.util.hasValue(jsonObj.signalStrength) &&
519
+ !support_1.util.hasValue(jsonObj.signalStrengh) &&
520
+ 'we require one of "signalStrength" or "signalStrengh" params',
521
+ optional: ['signalStrength', 'signalStrengh'],
522
+ // backward-compatible. sonObj.signalStrength can be 0
523
+ makeArgs: (jsonObj) => [
524
+ support_1.util.hasValue(jsonObj.signalStrength) ? jsonObj.signalStrength : jsonObj.signalStrengh,
525
+ ],
526
+ },
527
+ },
528
+ },
529
+ '/session/:sessionId/appium/device/gsm_voice': {
530
+ POST: { command: 'gsmVoice', payloadParams: { required: ['state'] } },
531
+ },
532
+ '/session/:sessionId/appium/device/power_capacity': {
533
+ POST: { command: 'powerCapacity', payloadParams: { required: ['percent'] } },
534
+ },
535
+ '/session/:sessionId/appium/device/power_ac': {
536
+ POST: { command: 'powerAC', payloadParams: { required: ['state'] } },
537
+ },
538
+ '/session/:sessionId/appium/device/network_speed': {
539
+ POST: { command: 'networkSpeed', payloadParams: { required: ['netspeed'] } },
540
+ },
541
+ '/session/:sessionId/appium/device/keyevent': {
542
+ POST: {
543
+ command: 'keyevent',
544
+ payloadParams: { required: ['keycode'], optional: ['metastate'] },
545
+ },
546
+ },
547
+ '/session/:sessionId/appium/device/rotate': {
548
+ POST: {
549
+ command: 'mobileRotation',
550
+ payloadParams: {
551
+ required: ['x', 'y', 'radius', 'rotation', 'touchCount', 'duration'],
552
+ optional: ['element'],
553
+ },
554
+ },
555
+ },
556
+ '/session/:sessionId/appium/device/current_activity': {
557
+ GET: { command: 'getCurrentActivity' },
558
+ },
559
+ '/session/:sessionId/appium/device/current_package': {
560
+ GET: { command: 'getCurrentPackage' },
561
+ },
562
+ //region Applications Management
563
+ '/session/:sessionId/appium/device/install_app': {
564
+ POST: {
565
+ command: 'installApp',
566
+ payloadParams: {
567
+ required: ['appPath'],
568
+ optional: ['options'],
569
+ },
570
+ },
571
+ },
572
+ '/session/:sessionId/appium/device/activate_app': {
573
+ POST: {
574
+ command: 'activateApp',
575
+ payloadParams: {
576
+ required: [['appId'], ['bundleId']],
577
+ optional: ['options'],
578
+ },
579
+ },
580
+ },
581
+ '/session/:sessionId/appium/device/remove_app': {
582
+ POST: {
583
+ command: 'removeApp',
584
+ payloadParams: {
585
+ required: [['appId'], ['bundleId']],
586
+ optional: ['options'],
587
+ },
588
+ },
589
+ },
590
+ '/session/:sessionId/appium/device/terminate_app': {
591
+ POST: {
592
+ command: 'terminateApp',
593
+ payloadParams: {
594
+ required: [['appId'], ['bundleId']],
595
+ optional: ['options'],
596
+ },
597
+ },
598
+ },
599
+ '/session/:sessionId/appium/device/app_installed': {
600
+ POST: {
601
+ command: 'isAppInstalled',
602
+ payloadParams: {
603
+ required: [['appId'], ['bundleId']],
604
+ },
605
+ },
606
+ },
607
+ '/session/:sessionId/appium/device/app_state': {
608
+ GET: {
609
+ command: 'queryAppState',
610
+ payloadParams: {
611
+ required: [['appId'], ['bundleId']],
612
+ },
613
+ },
614
+ POST: {
615
+ command: 'queryAppState',
616
+ payloadParams: {
617
+ required: [['appId'], ['bundleId']],
618
+ },
619
+ },
620
+ },
621
+ //endregion
622
+ '/session/:sessionId/appium/device/hide_keyboard': {
623
+ POST: {
624
+ command: 'hideKeyboard',
625
+ payloadParams: { optional: ['strategy', 'key', 'keyCode', 'keyName'] },
626
+ },
627
+ },
628
+ '/session/:sessionId/appium/device/is_keyboard_shown': {
629
+ GET: { command: 'isKeyboardShown' },
630
+ },
631
+ '/session/:sessionId/appium/device/push_file': {
632
+ POST: { command: 'pushFile', payloadParams: { required: ['path', 'data'] } },
633
+ },
634
+ '/session/:sessionId/appium/device/pull_file': {
635
+ POST: { command: 'pullFile', payloadParams: { required: ['path'] } },
636
+ },
637
+ '/session/:sessionId/appium/device/pull_folder': {
638
+ POST: { command: 'pullFolder', payloadParams: { required: ['path'] } },
639
+ },
640
+ '/session/:sessionId/appium/device/toggle_airplane_mode': {
641
+ POST: { command: 'toggleFlightMode' },
642
+ },
643
+ '/session/:sessionId/appium/device/toggle_data': {
644
+ POST: { command: 'toggleData' },
645
+ },
646
+ '/session/:sessionId/appium/device/toggle_wifi': {
647
+ POST: { command: 'toggleWiFi' },
648
+ },
649
+ '/session/:sessionId/appium/device/toggle_location_services': {
650
+ POST: { command: 'toggleLocationServices' },
651
+ },
652
+ '/session/:sessionId/appium/device/open_notifications': {
653
+ POST: { command: 'openNotifications' },
654
+ },
655
+ '/session/:sessionId/appium/device/start_activity': {
656
+ POST: {
657
+ command: 'startActivity',
658
+ payloadParams: {
659
+ required: ['appPackage', 'appActivity'],
660
+ optional: [
661
+ 'appWaitPackage',
662
+ 'appWaitActivity',
663
+ 'intentAction',
664
+ 'intentCategory',
665
+ 'intentFlags',
666
+ 'optionalIntentArguments',
667
+ 'dontStopAppOnReset',
668
+ ],
669
+ },
670
+ },
671
+ },
672
+ '/session/:sessionId/appium/device/system_bars': {
673
+ GET: { command: 'getSystemBars' },
674
+ },
675
+ '/session/:sessionId/appium/device/display_density': {
676
+ GET: { command: 'getDisplayDensity' },
677
+ },
678
+ '/session/:sessionId/appium/simulator/touch_id': {
679
+ POST: { command: 'touchId', payloadParams: { required: ['match'] } },
680
+ },
681
+ '/session/:sessionId/appium/simulator/toggle_touch_id_enrollment': {
682
+ POST: {
683
+ command: 'toggleEnrollTouchId',
684
+ payloadParams: { optional: ['enabled'] },
685
+ },
686
+ },
687
+ '/session/:sessionId/appium/app/launch': {
688
+ POST: { command: 'launchApp' },
689
+ },
690
+ '/session/:sessionId/appium/app/close': {
691
+ POST: { command: 'closeApp' },
692
+ },
693
+ '/session/:sessionId/appium/app/reset': {
694
+ POST: { command: 'reset' },
695
+ },
696
+ '/session/:sessionId/appium/app/background': {
697
+ POST: { command: 'background', payloadParams: { required: ['seconds'] } },
698
+ },
699
+ '/session/:sessionId/appium/app/end_test_coverage': {
700
+ POST: {
701
+ command: 'endCoverage',
702
+ payloadParams: { required: ['intent', 'path'] },
703
+ },
704
+ },
705
+ '/session/:sessionId/appium/app/strings': {
706
+ POST: {
707
+ command: 'getStrings',
708
+ payloadParams: { optional: ['language', 'stringFile'] },
709
+ },
710
+ },
711
+ '/session/:sessionId/appium/element/:elementId/value': {
712
+ POST: {
713
+ command: 'setValueImmediate',
714
+ payloadParams: {
715
+ validate: (jsonObj) => !support_1.util.hasValue(jsonObj.value) &&
716
+ !support_1.util.hasValue(jsonObj.text) &&
717
+ 'we require one of "text" or "value" params',
718
+ optional: ['value', 'text'],
719
+ // We want to either a value (old JSONWP) or a text (new W3C) parameter,
720
+ // but only send one of them to the command (not both).
721
+ // Prefer 'value' since it's more backward-compatible.
722
+ makeArgs: (jsonObj) => [jsonObj.value || jsonObj.text],
723
+ },
724
+ },
725
+ },
726
+ '/session/:sessionId/appium/element/:elementId/replace_value': {
727
+ POST: {
728
+ command: 'replaceValue',
729
+ payloadParams: {
730
+ validate: (jsonObj) => !support_1.util.hasValue(jsonObj.value) &&
731
+ !support_1.util.hasValue(jsonObj.text) &&
732
+ 'we require one of "text" or "value" params',
733
+ optional: ['value', 'text'],
734
+ // We want to either a value (old JSONWP) or a text (new W3C) parameter,
735
+ // but only send one of them to the command (not both).
736
+ // Prefer 'value' since it's more backward-compatible.
737
+ makeArgs: (jsonObj) => [jsonObj.value ?? jsonObj.text ?? ''],
738
+ },
739
+ },
740
+ },
741
+ '/session/:sessionId/appium/settings': {
742
+ POST: { command: 'updateSettings', payloadParams: { required: ['settings'] } },
743
+ GET: { command: 'getSettings' },
744
+ },
745
+ '/session/:sessionId/appium/receive_async_response': {
746
+ POST: {
747
+ command: 'receiveAsyncResponse',
748
+ payloadParams: { required: ['response'] },
749
+ },
750
+ },
751
+ '/session/:sessionId/appium/events': {
752
+ POST: { command: 'getLogEvents', payloadParams: { optional: ['type'] } },
753
+ },
754
+ '/session/:sessionId/appium/log_event': {
755
+ POST: {
756
+ command: 'logCustomEvent',
757
+ payloadParams: { required: ['vendor', 'event'] },
758
+ },
759
+ },
760
+ /*
761
+ * The W3C spec has some changes to the wire protocol.
762
+ * https://w3c.github.io/webdriver/webdriver-spec.html
763
+ * Begin to add those changes here, keeping the old version
764
+ * since clients still implement them.
765
+ */
766
+ // MJSONWP
767
+ '/session/:sessionId/alert_text': {
768
+ GET: { command: 'getAlertText' },
769
+ POST: {
770
+ command: 'setAlertText',
771
+ payloadParams: SET_ALERT_TEXT_PAYLOAD_PARAMS,
772
+ },
773
+ },
774
+ // MJSONWP
775
+ '/session/:sessionId/accept_alert': {
776
+ POST: { command: 'postAcceptAlert' },
777
+ },
778
+ // MJSONWP
779
+ '/session/:sessionId/dismiss_alert': {
780
+ POST: { command: 'postDismissAlert' },
781
+ },
782
+ // https://w3c.github.io/webdriver/webdriver-spec.html#user-prompts
783
+ '/session/:sessionId/alert/text': {
784
+ GET: { command: 'getAlertText' },
785
+ POST: {
786
+ command: 'setAlertText',
787
+ payloadParams: SET_ALERT_TEXT_PAYLOAD_PARAMS,
788
+ },
789
+ },
790
+ '/session/:sessionId/alert/accept': {
791
+ POST: { command: 'postAcceptAlert' },
792
+ },
793
+ '/session/:sessionId/alert/dismiss': {
794
+ POST: { command: 'postDismissAlert' },
795
+ },
796
+ // https://w3c.github.io/webdriver/webdriver-spec.html#get-element-rect
797
+ '/session/:sessionId/element/:elementId/rect': {
798
+ GET: { command: 'getElementRect' },
799
+ },
800
+ '/session/:sessionId/execute/sync': {
801
+ POST: { command: 'execute', payloadParams: { required: ['script', 'args'] } },
802
+ },
803
+ '/session/:sessionId/execute/async': {
804
+ POST: {
805
+ command: 'executeAsync',
806
+ payloadParams: { required: ['script', 'args'] },
807
+ },
808
+ },
809
+ // Pre-W3C endpoint for element screenshot
810
+ '/session/:sessionId/screenshot/:elementId': {
811
+ GET: { command: 'getElementScreenshot' },
812
+ },
813
+ '/session/:sessionId/element/:elementId/screenshot': {
814
+ GET: { command: 'getElementScreenshot' },
815
+ },
816
+ '/session/:sessionId/window/rect': {
817
+ GET: { command: 'getWindowRect' },
818
+ POST: {
819
+ command: 'setWindowRect',
820
+ payloadParams: { required: ['x', 'y', 'width', 'height'] },
821
+ },
822
+ },
823
+ '/session/:sessionId/window/maximize': {
824
+ POST: { command: 'maximizeWindow' },
825
+ },
826
+ '/session/:sessionId/window/minimize': {
827
+ POST: { command: 'minimizeWindow' },
828
+ },
829
+ '/session/:sessionId/window/fullscreen': {
830
+ POST: { command: 'fullScreenWindow' },
831
+ },
832
+ '/session/:sessionId/window/new': {
833
+ POST: { command: 'createNewWindow', payloadParams: { optional: ['type'] } },
834
+ },
835
+ '/session/:sessionId/element/:elementId/property/:name': {
836
+ GET: { command: 'getProperty' },
837
+ },
838
+ '/session/:sessionId/appium/device/set_clipboard': {
839
+ POST: {
840
+ command: 'setClipboard',
841
+ payloadParams: {
842
+ required: ['content'],
843
+ optional: ['contentType', 'label'],
844
+ },
845
+ },
846
+ },
847
+ '/session/:sessionId/appium/device/get_clipboard': {
848
+ POST: {
849
+ command: 'getClipboard',
850
+ payloadParams: {
851
+ optional: ['contentType'],
852
+ },
853
+ },
854
+ },
855
+ // chromium devtools
856
+ // https://chromium.googlesource.com/chromium/src/+/master/chrome/test/chromedriver/server/http_handler.cc
857
+ '/session/:sessionId/:vendor/cdp/execute': {
858
+ POST: { command: 'executeCdp', payloadParams: { required: ['cmd', 'params'] } },
859
+ },
860
+ //region Webauthn
861
+ // https://www.w3.org/TR/webauthn-2/#sctn-automation-add-virtual-authenticator
862
+ '/session/:sessionId/webauthn/authenticator': {
863
+ POST: {
864
+ command: 'addVirtualAuthenticator',
865
+ payloadParams: {
866
+ required: ['protocol', 'transport'],
867
+ optional: ['hasResidentKey', 'hasUserVerification', 'isUserConsenting', 'isUserVerified'],
868
+ },
869
+ },
870
+ },
871
+ '/session/:sessionId/webauthn/authenticator/:authenticatorId': {
872
+ DELETE: {
873
+ command: 'removeVirtualAuthenticator',
874
+ },
875
+ },
876
+ '/session/:sessionId/webauthn/authenticator/:authenticatorId/credential': {
877
+ POST: {
878
+ command: 'addAuthCredential',
879
+ payloadParams: {
880
+ required: ['credentialId', 'isResidentCredential', 'rpId', 'privateKey'],
881
+ optional: ['userHandle', 'signCount'],
882
+ },
883
+ },
884
+ },
885
+ '/session/:sessionId/webauthn/authenticator/:authenticatorId/credentials': {
886
+ GET: { command: 'getAuthCredential' },
887
+ DELETE: { command: 'removeAllAuthCredentials' },
888
+ },
889
+ '/session/:sessionId/webauthn/authenticator/:authenticatorId/credentials/:credentialId': {
890
+ DELETE: { command: 'removeAuthCredential' },
891
+ },
892
+ '/session/:sessionId/webauthn/authenticator/:authenticatorId/uv': {
893
+ POST: {
894
+ command: 'setUserAuthVerified',
895
+ payloadParams: {
896
+ required: ['isUserVerified'],
897
+ },
898
+ },
899
+ },
900
+ //endregion
901
+ });
1274
902
  exports.METHOD_MAP = METHOD_MAP;
903
+ // driver command names
1275
904
  let ALL_COMMANDS = [];
1276
905
  exports.ALL_COMMANDS = ALL_COMMANDS;
1277
-
1278
- for (let v of _lodash.default.values(METHOD_MAP)) {
1279
- for (let m of _lodash.default.values(v)) {
1280
- if (m.command) {
1281
- ALL_COMMANDS.push(m.command);
906
+ for (let v of lodash_1.default.values(METHOD_MAP)) {
907
+ for (let m of lodash_1.default.values(v)) {
908
+ if (m.command) {
909
+ ALL_COMMANDS.push(m.command);
910
+ }
1282
911
  }
1283
- }
1284
912
  }
1285
-
1286
913
  const RE_ESCAPE = /[-[\]{}()+?.,\\^$|#\s]/g;
1287
914
  const RE_PARAM = /([:*])(\w+)/g;
1288
-
1289
915
  class Route {
1290
- constructor(route) {
1291
- this.paramNames = [];
1292
- let reStr = route.replace(RE_ESCAPE, '\\$&');
1293
- reStr = reStr.replace(RE_PARAM, (_, mode, name) => {
1294
- this.paramNames.push(name);
1295
- return mode === ':' ? '([^/]*)' : '(.*)';
1296
- });
1297
- this.routeRegexp = new RegExp(`^${reStr}$`);
1298
- }
1299
-
1300
- parse(url) {
1301
- let matches = url.match(this.routeRegexp);
1302
- if (!matches) return;
1303
- let i = 0;
1304
- let params = {};
1305
-
1306
- while (i < this.paramNames.length) {
1307
- const paramName = this.paramNames[i++];
1308
- params[paramName] = matches[i];
916
+ constructor(route) {
917
+ this.paramNames = [];
918
+ let reStr = route.replace(RE_ESCAPE, '\\$&');
919
+ reStr = reStr.replace(RE_PARAM, (_, mode, name) => {
920
+ this.paramNames.push(name);
921
+ return mode === ':' ? '([^/]*)' : '(.*)';
922
+ });
923
+ this.routeRegexp = new RegExp(`^${reStr}$`);
924
+ }
925
+ parse(url) {
926
+ //if (url.indexOf('timeouts') !== -1 && this.routeRegexp.toString().indexOf('timeouts') !== -1) {
927
+ //debugger;
928
+ //}
929
+ let matches = url.match(this.routeRegexp);
930
+ if (!matches)
931
+ return; // eslint-disable-line curly
932
+ let i = 0;
933
+ let params = {};
934
+ while (i < this.paramNames.length) {
935
+ const paramName = this.paramNames[i++];
936
+ params[paramName] = matches[i];
937
+ }
938
+ return params;
1309
939
  }
1310
-
1311
- return params;
1312
- }
1313
-
1314
940
  }
1315
-
1316
- function routeToCommandName(endpoint, method, basePath = _constants.DEFAULT_BASE_PATH) {
1317
- let dstRoute = null;
1318
-
1319
- if (endpoint.includes('?')) {
1320
- endpoint = endpoint.slice(0, endpoint.indexOf('?'));
1321
- }
1322
-
1323
- const actualEndpoint = endpoint === '/' ? '' : _lodash.default.startsWith(endpoint, '/') ? endpoint : `/${endpoint}`;
1324
-
1325
- for (let currentRoute of _lodash.default.keys(METHOD_MAP)) {
1326
- const route = new Route(`${basePath}${currentRoute}`);
1327
-
1328
- if (route.parse(`${basePath}/session/ignored-session-id${actualEndpoint}`) || route.parse(`${basePath}${actualEndpoint}`) || route.parse(actualEndpoint)) {
1329
- dstRoute = currentRoute;
1330
- break;
1331
- }
1332
- }
1333
-
1334
- if (!dstRoute) return;
1335
-
1336
- const methods = _lodash.default.get(METHOD_MAP, dstRoute);
1337
-
1338
- method = _lodash.default.toUpper(method);
1339
-
1340
- if (_lodash.default.has(methods, method)) {
1341
- const dstMethod = _lodash.default.get(methods, method);
1342
-
1343
- if (dstMethod.command) {
1344
- return dstMethod.command;
941
+ /**
942
+ *
943
+ * @param {string} endpoint
944
+ * @param {import('@appium/types').HTTPMethod} method
945
+ * @param {string} [basePath]
946
+ * @returns {string|undefined}
947
+ */
948
+ function routeToCommandName(endpoint, method, basePath = constants_1.DEFAULT_BASE_PATH) {
949
+ let dstRoute = null;
950
+ // remove any query string
951
+ // TODO: would this be better handled as a `URL` object?
952
+ if (endpoint.includes('?')) {
953
+ endpoint = endpoint.slice(0, endpoint.indexOf('?'));
954
+ }
955
+ const actualEndpoint = endpoint === '/' ? '' : lodash_1.default.startsWith(endpoint, '/') ? endpoint : `/${endpoint}`;
956
+ for (let currentRoute of lodash_1.default.keys(METHOD_MAP)) {
957
+ const route = new Route(`${basePath}${currentRoute}`);
958
+ // we don't care about the actual session id for matching
959
+ if (route.parse(`${basePath}/session/ignored-session-id${actualEndpoint}`) ||
960
+ route.parse(`${basePath}${actualEndpoint}`) ||
961
+ route.parse(actualEndpoint)) {
962
+ dstRoute = currentRoute;
963
+ break;
964
+ }
965
+ }
966
+ if (!dstRoute)
967
+ return; // eslint-disable-line curly
968
+ const methods = METHOD_MAP[dstRoute];
969
+ method = /** @type {Uppercase<typeof method>} */ (lodash_1.default.toUpper(method));
970
+ if (method in methods) {
971
+ const dstMethod = lodash_1.default.get(methods, method);
972
+ if (dstMethod.command) {
973
+ return dstMethod.command;
974
+ }
1345
975
  }
1346
- }
1347
976
  }
1348
-
977
+ exports.routeToCommandName = routeToCommandName;
978
+ // driver commands that do not require a session to already exist
1349
979
  const NO_SESSION_ID_COMMANDS = ['createSession', 'getStatus', 'getSessions'];
1350
980
  exports.NO_SESSION_ID_COMMANDS = NO_SESSION_ID_COMMANDS;
1351
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTRVRfQUxFUlRfVEVYVF9QQVlMT0FEX1BBUkFNUyIsInZhbGlkYXRlIiwianNvbk9iaiIsInV0aWwiLCJoYXNWYWx1ZSIsInZhbHVlIiwidGV4dCIsIm9wdGlvbmFsIiwibWFrZUFyZ3MiLCJNRVRIT0RfTUFQIiwiR0VUIiwiY29tbWFuZCIsIlBPU1QiLCJwYXlsb2FkUGFyYW1zIiwiY2FwYWJpbGl0aWVzIiwiZGVzaXJlZENhcGFiaWxpdGllcyIsIkRFTEVURSIsInByb3RvY29sTmFtZSIsIlBST1RPQ09MUyIsIlczQyIsInNjcmlwdCIsInBhZ2VMb2FkIiwiaW1wbGljaXQiLCJ0eXBlIiwibXMiLCJyZXF1aXJlZCIsImhhbmRsZSIsIm5hbWUiLCJ1bndyYXAiLCJ3cmFwIiwic2lnbmFsU3RyZW5ndGgiLCJzaWduYWxTdHJlbmdoIiwiQUxMX0NPTU1BTkRTIiwidiIsIl8iLCJ2YWx1ZXMiLCJtIiwicHVzaCIsIlJFX0VTQ0FQRSIsIlJFX1BBUkFNIiwiUm91dGUiLCJjb25zdHJ1Y3RvciIsInJvdXRlIiwicGFyYW1OYW1lcyIsInJlU3RyIiwicmVwbGFjZSIsIm1vZGUiLCJyb3V0ZVJlZ2V4cCIsIlJlZ0V4cCIsInBhcnNlIiwidXJsIiwibWF0Y2hlcyIsIm1hdGNoIiwiaSIsInBhcmFtcyIsImxlbmd0aCIsInBhcmFtTmFtZSIsInJvdXRlVG9Db21tYW5kTmFtZSIsImVuZHBvaW50IiwibWV0aG9kIiwiYmFzZVBhdGgiLCJERUZBVUxUX0JBU0VfUEFUSCIsImRzdFJvdXRlIiwiaW5jbHVkZXMiLCJzbGljZSIsImluZGV4T2YiLCJhY3R1YWxFbmRwb2ludCIsInN0YXJ0c1dpdGgiLCJjdXJyZW50Um91dGUiLCJrZXlzIiwibWV0aG9kcyIsImdldCIsInRvVXBwZXIiLCJoYXMiLCJkc3RNZXRob2QiLCJOT19TRVNTSU9OX0lEX0NPTU1BTkRTIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL3Byb3RvY29sL3JvdXRlcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7dXRpbH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7UFJPVE9DT0xTLCBERUZBVUxUX0JBU0VfUEFUSH0gZnJvbSAnLi4vY29uc3RhbnRzJztcblxuY29uc3QgU0VUX0FMRVJUX1RFWFRfUEFZTE9BRF9QQVJBTVMgPSB7XG4gIHZhbGlkYXRlOiAoanNvbk9iaikgPT5cbiAgICAhdXRpbC5oYXNWYWx1ZShqc29uT2JqLnZhbHVlKSAmJlxuICAgICF1dGlsLmhhc1ZhbHVlKGpzb25PYmoudGV4dCkgJiZcbiAgICAnZWl0aGVyIFwidGV4dFwiIG9yIFwidmFsdWVcIiBtdXN0IGJlIHNldCcsXG4gIG9wdGlvbmFsOiBbJ3ZhbHVlJywgJ3RleHQnXSxcbiAgLy8gUHJlZmVyICd2YWx1ZScgc2luY2UgaXQncyBtb3JlIGJhY2t3YXJkLWNvbXBhdGlibGUuXG4gIG1ha2VBcmdzOiAoanNvbk9iaikgPT4gW2pzb25PYmoudmFsdWUgfHwganNvbk9iai50ZXh0XSxcbn07XG5cbi8qKlxuICogZGVmaW5lIHRoZSByb3V0ZXMsIG1hcHBpbmcgb2YgSFRUUCBtZXRob2RzIHRvIHBhcnRpY3VsYXIgZHJpdmVyIGNvbW1hbmRzLCBhbmRcbiAqIGFueSBwYXJhbWV0ZXJzIHRoYXQgYXJlIGV4cGVjdGVkIGluIGEgcmVxdWVzdCBwYXJhbWV0ZXJzIGNhbiBiZSBgcmVxdWlyZWRgIG9yXG4gKiBgb3B0aW9uYWxgXG4gKiBAdHlwZSB7TWV0aG9kTWFwfVxuICovXG5jb25zdCBNRVRIT0RfTUFQID0ge1xuICAnL3N0YXR1cyc6IHtcbiAgICBHRVQ6IHtjb21tYW5kOiAnZ2V0U3RhdHVzJ30sXG4gIH0sXG4gICcvc2Vzc2lvbic6IHtcbiAgICBQT1NUOiB7XG4gICAgICBjb21tYW5kOiAnY3JlYXRlU2Vzc2lvbicsXG4gICAgICBwYXlsb2FkUGFyYW1zOiB7XG4gICAgICAgIHZhbGlkYXRlOiAoanNvbk9iaikgPT5cbiAgICAgICAgICAhanNvbk9iai5jYXBhYmlsaXRpZXMgJiZcbiAgICAgICAgICAhanNvbk9iai5kZXNpcmVkQ2FwYWJpbGl0aWVzICYmXG4gICAgICAgICAgJ3dlIHJlcXVpcmUgb25lIG9mIFwiZGVzaXJlZENhcGFiaWxpdGllc1wiIG9yIFwiY2FwYWJpbGl0aWVzXCIgb2JqZWN0JyxcbiAgICAgICAgb3B0aW9uYWw6IFsnZGVzaXJlZENhcGFiaWxpdGllcycsICdyZXF1aXJlZENhcGFiaWxpdGllcycsICdjYXBhYmlsaXRpZXMnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJy9zZXNzaW9ucyc6IHtcbiAgICBHRVQ6IHtjb21tYW5kOiAnZ2V0U2Vzc2lvbnMnfSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQnOiB7XG4gICAgR0VUOiB7Y29tbWFuZDogJ2dldFNlc3Npb24nfSxcbiAgICBERUxFVEU6IHtjb21tYW5kOiAnZGVsZXRlU2Vzc2lvbid9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC90aW1lb3V0cyc6IHtcbiAgICBHRVQ6IHtjb21tYW5kOiAnZ2V0VGltZW91dHMnfSwgLy8gVzNDIHJvdXRlXG4gICAgUE9TVDoge1xuICAgICAgY29tbWFuZDogJ3RpbWVvdXRzJyxcbiAgICAgIHBheWxvYWRQYXJhbXM6IHtcbiAgICAgICAgdmFsaWRhdGU6IChqc29uT2JqLCBwcm90b2NvbE5hbWUpID0+IHtcbiAgICAgICAgICBpZiAocHJvdG9jb2xOYW1lID09PSBQUk9UT0NPTFMuVzNDKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICF1dGlsLmhhc1ZhbHVlKGpzb25PYmouc2NyaXB0KSAmJlxuICAgICAgICAgICAgICAhdXRpbC5oYXNWYWx1ZShqc29uT2JqLnBhZ2VMb2FkKSAmJlxuICAgICAgICAgICAgICAhdXRpbC5oYXNWYWx1ZShqc29uT2JqLmltcGxpY2l0KVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHJldHVybiAnVzNDIHByb3RvY29sIGV4cGVjdHMgYW55IG9mIHNjcmlwdCwgcGFnZUxvYWQgb3IgaW1wbGljaXQgdG8gYmUgc2V0JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTUpTT05XUFxuICAgICAgICAgICAgaWYgKCF1dGlsLmhhc1ZhbHVlKGpzb25PYmoudHlwZSkgfHwgIXV0aWwuaGFzVmFsdWUoanNvbk9iai5tcykpIHtcbiAgICAgICAgICAgICAgcmV0dXJuICdNSlNPTldQIHByb3RvY29sIHJlcXVpcmVzIHR5cGUgYW5kIG1zJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG9wdGlvbmFsOiBbJ3R5cGUnLCAnbXMnLCAnc2NyaXB0JywgJ3BhZ2VMb2FkJywgJ2ltcGxpY2l0J10sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL3RpbWVvdXRzL2FzeW5jX3NjcmlwdCc6IHtcbiAgICBQT1NUOiB7Y29tbWFuZDogJ2FzeW5jU2NyaXB0VGltZW91dCcsIHBheWxvYWRQYXJhbXM6IHtyZXF1aXJlZDogWydtcyddfX0sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL3RpbWVvdXRzL2ltcGxpY2l0X3dhaXQnOiB7XG4gICAgUE9TVDoge2NvbW1hbmQ6ICdpbXBsaWNpdFdhaXQnLCBwYXlsb2FkUGFyYW1zOiB7cmVxdWlyZWQ6IFsnbXMnXX19LFxuICB9LFxuICAvLyBKU09OV1BcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvd2luZG93X2hhbmRsZSc6IHtcbiAgICBHRVQ6IHtjb21tYW5kOiAnZ2V0V2luZG93SGFuZGxlJ30sXG4gIH0sXG4gIC8vIFczQ1xuICAnL3Nlc3Npb24vOnNlc3Npb25JZC93aW5kb3cvaGFuZGxlJzoge1xuICAgIEdFVDoge2NvbW1hbmQ6ICdnZXRXaW5kb3dIYW5kbGUnfSxcbiAgfSxcbiAgLy8gSlNPTldQXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL3dpbmRvd19oYW5kbGVzJzoge1xuICAgIEdFVDoge2NvbW1hbmQ6ICdnZXRXaW5kb3dIYW5kbGVzJ30sXG4gIH0sXG4gIC8vIFczQ1xuICAnL3Nlc3Npb24vOnNlc3Npb25JZC93aW5kb3cvaGFuZGxlcyc6IHtcbiAgICBHRVQ6IHtjb21tYW5kOiAnZ2V0V2luZG93SGFuZGxlcyd9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC91cmwnOiB7XG4gICAgR0VUOiB7Y29tbWFuZDogJ2dldFVybCd9LFxuICAgIFBPU1Q6IHtjb21tYW5kOiAnc2V0VXJsJywgcGF5bG9hZFBhcmFtczoge3JlcXVpcmVkOiBbJ3VybCddfX0sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL2ZvcndhcmQnOiB7XG4gICAgUE9TVDoge2NvbW1hbmQ6ICdmb3J3YXJkJ30sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL2JhY2snOiB7XG4gICAgUE9TVDoge2NvbW1hbmQ6ICdiYWNrJ30sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL3JlZnJlc2gnOiB7XG4gICAgUE9TVDoge2NvbW1hbmQ6ICdyZWZyZXNoJ30sXG4gIH0sXG4gIC8vIE1KU09OV1BcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvZXhlY3V0ZSc6IHtcbiAgICBQT1NUOiB7Y29tbWFuZDogJ2V4ZWN1dGUnLCBwYXlsb2FkUGFyYW1zOiB7cmVxdWlyZWQ6IFsnc2NyaXB0JywgJ2FyZ3MnXX19LFxuICB9LFxuICAvLyBNSlNPTldQXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL2V4ZWN1dGVfYXN5bmMnOiB7XG4gICAgUE9TVDoge1xuICAgICAgY29tbWFuZDogJ2V4ZWN1dGVBc3luYycsXG4gICAgICBwYXlsb2FkUGFyYW1zOiB7cmVxdWlyZWQ6IFsnc2NyaXB0JywgJ2FyZ3MnXX0sXG4gICAgfSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvc2NyZWVuc2hvdCc6IHtcbiAgICBHRVQ6IHtjb21tYW5kOiAnZ2V0U2NyZWVuc2hvdCd9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9pbWUvYXZhaWxhYmxlX2VuZ2luZXMnOiB7XG4gICAgR0VUOiB7Y29tbWFuZDogJ2F2YWlsYWJsZUlNRUVuZ2luZXMnfSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvaW1lL2FjdGl2ZV9lbmdpbmUnOiB7XG4gICAgR0VUOiB7Y29tbWFuZDogJ2dldEFjdGl2ZUlNRUVuZ2luZSd9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9pbWUvYWN0aXZhdGVkJzoge1xuICAgIEdFVDoge2NvbW1hbmQ6ICdpc0lNRUFjdGl2YXRlZCd9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9pbWUvZGVhY3RpdmF0ZSc6IHtcbiAgICBQT1NUOiB7Y29tbWFuZDogJ2RlYWN0aXZhdGVJTUVFbmdpbmUnfSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvaW1lL2FjdGl2YXRlJzoge1xuICAgIFBPU1Q6IHtjb21tYW5kOiAnYWN0aXZhdGVJTUVFbmdpbmUnLCBwYXlsb2FkUGFyYW1zOiB7cmVxdWlyZWQ6IFsnZW5naW5lJ119fSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvZnJhbWUnOiB7XG4gICAgUE9TVDoge2NvbW1hbmQ6ICdzZXRGcmFtZScsIHBheWxvYWRQYXJhbXM6IHtyZXF1aXJlZDogWydpZCddfX0sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL2ZyYW1lL3BhcmVudCc6IHtcbiAgICBQT1NUOiB7fSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvd2luZG93Jzoge1xuICAgIEdFVDoge2NvbW1hbmQ6ICdnZXRXaW5kb3dIYW5kbGUnfSxcbiAgICBQT1NUOiB7XG4gICAgICBjb21tYW5kOiAnc2V0V2luZG93JyxcbiAgICAgIHBheWxvYWRQYXJhbXM6IHtcbiAgICAgICAgb3B0aW9uYWw6IFsnbmFtZScsICdoYW5kbGUnXSxcbiAgICAgICAgLy8gUmV0dXJuIGJvdGggdmFsdWVzIHRvIG1hdGNoIFczQyBhbmQgSlNPTldQIHByb3RvY29sc1xuICAgICAgICBtYWtlQXJnczogKGpzb25PYmopID0+IHtcbiAgICAgICAgICBpZiAodXRpbC5oYXNWYWx1ZShqc29uT2JqLmhhbmRsZSkgJiYgIXV0aWwuaGFzVmFsdWUoanNvbk9iai5uYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtqc29uT2JqLmhhbmRsZSwganNvbk9iai5oYW5kbGVdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodXRpbC5oYXNWYWx1ZShqc29uT2JqLm5hbWUpICYmICF1dGlsLmhhc1ZhbHVlKGpzb25PYmouaGFuZGxlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtqc29uT2JqLm5hbWUsIGpzb25PYmoubmFtZV07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBbanNvbk9iai5uYW1lLCBqc29uT2JqLmhhbmRsZV07XG4gICAgICAgIH0sXG4gICAgICAgIHZhbGlkYXRlOiAoanNvbk9iaikgPT5cbiAgICAgICAgICAhdXRpbC5oYXNWYWx1ZShqc29uT2JqLm5hbWUpICYmXG4gICAgICAgICAgIXV0aWwuaGFzVmFsdWUoanNvbk9iai5oYW5kbGUpICYmXG4gICAgICAgICAgJ3dlIHJlcXVpcmUgb25lIG9mIFwibmFtZVwiIG9yIFwiaGFuZGxlXCIgdG8gYmUgc2V0JyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBERUxFVEU6IHtjb21tYW5kOiAnY2xvc2VXaW5kb3cnfSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvd2luZG93Lzp3aW5kb3doYW5kbGUvc2l6ZSc6IHtcbiAgICBHRVQ6IHtjb21tYW5kOiAnZ2V0V2luZG93U2l6ZSd9LFxuICAgIFBPU1Q6IHt9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC93aW5kb3cvOndpbmRvd2hhbmRsZS9wb3NpdGlvbic6IHtcbiAgICBQT1NUOiB7fSxcbiAgICBHRVQ6IHt9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC93aW5kb3cvOndpbmRvd2hhbmRsZS9tYXhpbWl6ZSc6IHtcbiAgICBQT1NUOiB7Y29tbWFuZDogJ21heGltaXplV2luZG93J30sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL2Nvb2tpZSc6IHtcbiAgICBHRVQ6IHtjb21tYW5kOiAnZ2V0Q29va2llcyd9LFxuICAgIFBPU1Q6IHtjb21tYW5kOiAnc2V0Q29va2llJywgcGF5bG9hZFBhcmFtczoge3JlcXVpcmVkOiBbJ2Nvb2tpZSddfX0sXG4gICAgREVMRVRFOiB7Y29tbWFuZDogJ2RlbGV0ZUNvb2tpZXMnfSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvY29va2llLzpuYW1lJzoge1xuICAgIEdFVDoge2NvbW1hbmQ6ICdnZXRDb29raWUnfSxcbiAgICBERUxFVEU6IHtjb21tYW5kOiAnZGVsZXRlQ29va2llJ30sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL3NvdXJjZSc6IHtcbiAgICBHRVQ6IHtjb21tYW5kOiAnZ2V0UGFnZVNvdXJjZSd9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC90aXRsZSc6IHtcbiAgICBHRVQ6IHtjb21tYW5kOiAndGl0bGUnfSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvZWxlbWVudCc6IHtcbiAgICBQT1NUOiB7XG4gICAgICBjb21tYW5kOiAnZmluZEVsZW1lbnQnLFxuICAgICAgcGF5bG9hZFBhcmFtczoge3JlcXVpcmVkOiBbJ3VzaW5nJywgJ3ZhbHVlJ119LFxuICAgIH0sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL2VsZW1lbnRzJzoge1xuICAgIFBPU1Q6IHtcbiAgICAgIGNvbW1hbmQ6ICdmaW5kRWxlbWVudHMnLFxuICAgICAgcGF5bG9hZFBhcmFtczoge3JlcXVpcmVkOiBbJ3VzaW5nJywgJ3ZhbHVlJ119LFxuICAgIH0sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL2VsZW1lbnQvYWN0aXZlJzoge1xuICAgIEdFVDoge2NvbW1hbmQ6ICdhY3RpdmUnfSwgLy8gVzNDOiBodHRwczovL3czYy5naXRodWIuaW8vd2ViZHJpdmVyL3dlYmRyaXZlci1zcGVjLmh0bWwjZGZuLWdldC1hY3RpdmUtZWxlbWVudFxuICAgIFBPU1Q6IHtjb21tYW5kOiAnYWN0aXZlJ30sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL2VsZW1lbnQvOmVsZW1lbnRJZCc6IHtcbiAgICBHRVQ6IHt9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9lbGVtZW50LzplbGVtZW50SWQvZWxlbWVudCc6IHtcbiAgICBQT1NUOiB7XG4gICAgICBjb21tYW5kOiAnZmluZEVsZW1lbnRGcm9tRWxlbWVudCcsXG4gICAgICBwYXlsb2FkUGFyYW1zOiB7cmVxdWlyZWQ6IFsndXNpbmcnLCAndmFsdWUnXX0sXG4gICAgfSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvZWxlbWVudC86ZWxlbWVudElkL2VsZW1lbnRzJzoge1xuICAgIFBPU1Q6IHtcbiAgICAgIGNvbW1hbmQ6ICdmaW5kRWxlbWVudHNGcm9tRWxlbWVudCcsXG4gICAgICBwYXlsb2FkUGFyYW1zOiB7cmVxdWlyZWQ6IFsndXNpbmcnLCAndmFsdWUnXX0sXG4gICAgfSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvZWxlbWVudC86ZWxlbWVudElkL2NsaWNrJzoge1xuICAgIFBPU1Q6IHtjb21tYW5kOiAnY2xpY2snfSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvZWxlbWVudC86ZWxlbWVudElkL3N1Ym1pdCc6IHtcbiAgICBQT1NUOiB7Y29tbWFuZDogJ3N1Ym1pdCd9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9lbGVtZW50LzplbGVtZW50SWQvdGV4dCc6IHtcbiAgICBHRVQ6IHtjb21tYW5kOiAnZ2V0VGV4dCd9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9lbGVtZW50LzplbGVtZW50SWQvdmFsdWUnOiB7XG4gICAgUE9TVDoge1xuICAgICAgY29tbWFuZDogJ3NldFZhbHVlJyxcbiAgICAgIHBheWxvYWRQYXJhbXM6IHtcbiAgICAgICAgdmFsaWRhdGU6IChqc29uT2JqKSA9PlxuICAgICAgICAgICF1dGlsLmhhc1ZhbHVlKGpzb25PYmoudmFsdWUpICYmXG4gICAgICAgICAgIXV0aWwuaGFzVmFsdWUoanNvbk9iai50ZXh0KSAmJlxuICAgICAgICAgICd3ZSByZXF1aXJlIG9uZSBvZiBcInRleHRcIiBvciBcInZhbHVlXCIgcGFyYW1zJyxcbiAgICAgICAgb3B0aW9uYWw6IFsndmFsdWUnLCAndGV4dCddLFxuICAgICAgICAvLyBvdmVycmlkZSB0aGUgZGVmYXVsdCBhcmd1bWVudCBjb25zdHJ1Y3RvciBiZWNhdXNlIG9mIHRoZSBzcGVjaWFsXG4gICAgICAgIC8vIGxvZ2ljIGhlcmUuIEJhc2ljYWxseSB3ZSB3YW50IHRvIGFjY2VwdCBlaXRoZXIgYSB2YWx1ZSAob2xkIEpTT05XUClcbiAgICAgICAgLy8gb3IgYSB0ZXh0IChuZXcgVzNDKSBwYXJhbWV0ZXIsIGJ1dCBvbmx5IHNlbmQgb25lIG9mIHRoZW0gdG8gdGhlXG4gICAgICAgIC8vIGNvbW1hbmQgKG5vdCBib3RoKS4gUHJlZmVyICd2YWx1ZScgc2luY2UgaXQncyBtb3JlXG4gICAgICAgIC8vIGJhY2t3YXJkLWNvbXBhdGlibGUuXG4gICAgICAgIG1ha2VBcmdzOiAoanNvbk9iaikgPT4gW2pzb25PYmoudmFsdWUgfHwganNvbk9iai50ZXh0XSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQva2V5cyc6IHtcbiAgICBQT1NUOiB7Y29tbWFuZDogJ2tleXMnLCBwYXlsb2FkUGFyYW1zOiB7cmVxdWlyZWQ6IFsndmFsdWUnXX19LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9lbGVtZW50LzplbGVtZW50SWQvbmFtZSc6IHtcbiAgICBHRVQ6IHtjb21tYW5kOiAnZ2V0TmFtZSd9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9lbGVtZW50LzplbGVtZW50SWQvY2xlYXInOiB7XG4gICAgUE9TVDoge2NvbW1hbmQ6ICdjbGVhcid9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9lbGVtZW50LzplbGVtZW50SWQvc2VsZWN0ZWQnOiB7XG4gICAgR0VUOiB7Y29tbWFuZDogJ2VsZW1lbnRTZWxlY3RlZCd9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9lbGVtZW50LzplbGVtZW50SWQvZW5hYmxlZCc6IHtcbiAgICBHRVQ6IHtjb21tYW5kOiAnZWxlbWVudEVuYWJsZWQnfSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvZWxlbWVudC86ZWxlbWVudElkL2F0dHJpYnV0ZS86bmFtZSc6IHtcbiAgICBHRVQ6IHtjb21tYW5kOiAnZ2V0QXR0cmlidXRlJ30sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL2VsZW1lbnQvOmVsZW1lbnRJZC9lcXVhbHMvOm90aGVySWQnOiB7XG4gICAgR0VUOiB7Y29tbWFuZDogJ2VxdWFsc0VsZW1lbnQnfSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvZWxlbWVudC86ZWxlbWVudElkL2Rpc3BsYXllZCc6IHtcbiAgICBHRVQ6IHtjb21tYW5kOiAnZWxlbWVudERpc3BsYXllZCd9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9lbGVtZW50LzplbGVtZW50SWQvbG9jYXRpb24nOiB7XG4gICAgR0VUOiB7Y29tbWFuZDogJ2dldExvY2F0aW9uJ30sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL2VsZW1lbnQvOmVsZW1lbnRJZC9sb2NhdGlvbl9pbl92aWV3Jzoge1xuICAgIEdFVDoge2NvbW1hbmQ6ICdnZXRMb2NhdGlvbkluVmlldyd9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9lbGVtZW50LzplbGVtZW50SWQvc2l6ZSc6IHtcbiAgICBHRVQ6IHtjb21tYW5kOiAnZ2V0U2l6ZSd9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9lbGVtZW50LzplbGVtZW50SWQvc2hhZG93Jzoge1xuICAgIEdFVDoge2NvbW1hbmQ6ICdlbGVtZW50U2hhZG93Um9vdCd9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9zaGFkb3cvOnNoYWRvd0lkL2VsZW1lbnQnOiB7XG4gICAgUE9TVDoge1xuICAgICAgY29tbWFuZDogJ2ZpbmRFbGVtZW50RnJvbVNoYWRvd1Jvb3QnLFxuICAgICAgcGF5bG9hZFBhcmFtczoge3JlcXVpcmVkOiBbJ3VzaW5nJywgJ3ZhbHVlJ119LFxuICAgIH0sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL3NoYWRvdy86c2hhZG93SWQvZWxlbWVudHMnOiB7XG4gICAgUE9TVDoge1xuICAgICAgY29tbWFuZDogJ2ZpbmRFbGVtZW50c0Zyb21TaGFkb3dSb290JyxcbiAgICAgIHBheWxvYWRQYXJhbXM6IHtyZXF1aXJlZDogWyd1c2luZycsICd2YWx1ZSddfSxcbiAgICB9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9lbGVtZW50LzplbGVtZW50SWQvY3NzLzpwcm9wZXJ0eU5hbWUnOiB7XG4gICAgR0VUOiB7Y29tbWFuZDogJ2dldENzc1Byb3BlcnR5J30sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL29yaWVudGF0aW9uJzoge1xuICAgIEdFVDoge2NvbW1hbmQ6ICdnZXRPcmllbnRhdGlvbid9LFxuICAgIFBPU1Q6IHtcbiAgICAgIGNvbW1hbmQ6ICdzZXRPcmllbnRhdGlvbicsXG4gICAgICBwYXlsb2FkUGFyYW1zOiB7cmVxdWlyZWQ6IFsnb3JpZW50YXRpb24nXX0sXG4gICAgfSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvcm90YXRpb24nOiB7XG4gICAgR0VUOiB7Y29tbWFuZDogJ2dldFJvdGF0aW9uJ30sXG4gICAgUE9TVDoge2NvbW1hbmQ6ICdzZXRSb3RhdGlvbicsIHBheWxvYWRQYXJhbXM6IHtyZXF1aXJlZDogWyd4JywgJ3knLCAneiddfX0sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL21vdmV0byc6IHtcbiAgICBQT1NUOiB7XG4gICAgICBjb21tYW5kOiAnbW92ZVRvJyxcbiAgICAgIHBheWxvYWRQYXJhbXM6IHtvcHRpb25hbDogWydlbGVtZW50JywgJ3hvZmZzZXQnLCAneW9mZnNldCddfSxcbiAgICB9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9jbGljayc6IHtcbiAgICBQT1NUOiB7Y29tbWFuZDogJ2NsaWNrQ3VycmVudCcsIHBheWxvYWRQYXJhbXM6IHtvcHRpb25hbDogWydidXR0b24nXX19LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9idXR0b25kb3duJzoge1xuICAgIFBPU1Q6IHtjb21tYW5kOiAnYnV0dG9uRG93bicsIHBheWxvYWRQYXJhbXM6IHtvcHRpb25hbDogWydidXR0b24nXX19LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9idXR0b251cCc6IHtcbiAgICBQT1NUOiB7Y29tbWFuZDogJ2J1dHRvblVwJywgcGF5bG9hZFBhcmFtczoge29wdGlvbmFsOiBbJ2J1dHRvbiddfX0sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL2RvdWJsZWNsaWNrJzoge1xuICAgIFBPU1Q6IHtjb21tYW5kOiAnZG91YmxlQ2xpY2snfSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvdG91Y2gvY2xpY2snOiB7XG4gICAgUE9TVDoge2NvbW1hbmQ6ICdjbGljaycsIHBheWxvYWRQYXJhbXM6IHtyZXF1aXJlZDogWydlbGVtZW50J119fSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvdG91Y2gvZG93bic6IHtcbiAgICBQT1NUOiB7Y29tbWFuZDogJ3RvdWNoRG93bicsIHBheWxvYWRQYXJhbXM6IHtyZXF1aXJlZDogWyd4JywgJ3knXX19LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC90b3VjaC91cCc6IHtcbiAgICBQT1NUOiB7Y29tbWFuZDogJ3RvdWNoVXAnLCBwYXlsb2FkUGFyYW1zOiB7cmVxdWlyZWQ6IFsneCcsICd5J119fSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvdG91Y2gvbW92ZSc6IHtcbiAgICBQT1NUOiB7Y29tbWFuZDogJ3RvdWNoTW92ZScsIHBheWxvYWRQYXJhbXM6IHtyZXF1aXJlZDogWyd4JywgJ3knXX19LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC90b3VjaC9zY3JvbGwnOiB7XG4gICAgUE9TVDoge30sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL3RvdWNoL2RvdWJsZWNsaWNrJzoge1xuICAgIFBPU1Q6IHt9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9hY3Rpb25zJzoge1xuICAgIFBPU1Q6IHtjb21tYW5kOiAncGVyZm9ybUFjdGlvbnMnLCBwYXlsb2FkUGFyYW1zOiB7cmVxdWlyZWQ6IFsnYWN0aW9ucyddfX0sXG4gICAgREVMRVRFOiB7Y29tbWFuZDogJ3JlbGVhc2VBY3Rpb25zJ30sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL3RvdWNoL2xvbmdjbGljayc6IHtcbiAgICBQT1NUOiB7Y29tbWFuZDogJ3RvdWNoTG9uZ0NsaWNrJywgcGF5bG9hZFBhcmFtczoge3JlcXVpcmVkOiBbJ2VsZW1lbnRzJ119fSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvdG91Y2gvZmxpY2snOiB7XG4gICAgUE9TVDoge1xuICAgICAgY29tbWFuZDogJ2ZsaWNrJyxcbiAgICAgIHBheWxvYWRQYXJhbXM6IHtcbiAgICAgICAgb3B0aW9uYWw6IFsnZWxlbWVudCcsICd4c3BlZWQnLCAneXNwZWVkJywgJ3hvZmZzZXQnLCAneW9mZnNldCcsICdzcGVlZCddLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9sb2NhdGlvbic6IHtcbiAgICBHRVQ6IHtjb21tYW5kOiAnZ2V0R2VvTG9jYXRpb24nfSxcbiAgICBQT1NUOiB7Y29tbWFuZDogJ3NldEdlb0xvY2F0aW9uJywgcGF5bG9hZFBhcmFtczoge3JlcXVpcmVkOiBbJ2xvY2F0aW9uJ119fSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvbG9jYWxfc3RvcmFnZSc6IHtcbiAgICBHRVQ6IHt9LFxuICAgIFBPU1Q6IHt9LFxuICAgIERFTEVURToge30sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL2xvY2FsX3N0b3JhZ2Uva2V5LzprZXknOiB7XG4gICAgR0VUOiB7fSxcbiAgICBERUxFVEU6IHt9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9sb2NhbF9zdG9yYWdlL3NpemUnOiB7XG4gICAgR0VUOiB7fSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvc2Vzc2lvbl9zdG9yYWdlJzoge1xuICAgIEdFVDoge30sXG4gICAgUE9TVDoge30sXG4gICAgREVMRVRFOiB7fSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvc2Vzc2lvbl9zdG9yYWdlL2tleS86a2V5Jzoge1xuICAgIEdFVDoge30sXG4gICAgREVMRVRFOiB7fSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvc2Vzc2lvbl9zdG9yYWdlL3NpemUnOiB7XG4gICAgR0VUOiB7fSxcbiAgfSxcbiAgLy8gU2VsZW5pdW0gNCBjbGllbnRzXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL3NlL2xvZyc6IHtcbiAgICBQT1NUOiB7Y29tbWFuZDogJ2dldExvZycsIHBheWxvYWRQYXJhbXM6IHtyZXF1aXJlZDogWyd0eXBlJ119fSxcbiAgfSxcbiAgLy8gU2VsZW5pdW0gNCBjbGllbnRzXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL3NlL2xvZy90eXBlcyc6IHtcbiAgICBHRVQ6IHtjb21tYW5kOiAnZ2V0TG9nVHlwZXMnfSxcbiAgfSxcbiAgLy8gbWpzb253aXJlLCBhcHBpdW0gY2xpZW50c1xuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9sb2cnOiB7XG4gICAgUE9TVDoge2NvbW1hbmQ6ICdnZXRMb2cnLCBwYXlsb2FkUGFyYW1zOiB7cmVxdWlyZWQ6IFsndHlwZSddfX0sXG4gIH0sXG4gIC8vIG1qc29ud2lyZSwgYXBwaXVtIGNsaWVudHNcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvbG9nL3R5cGVzJzoge1xuICAgIEdFVDoge2NvbW1hbmQ6ICdnZXRMb2dUeXBlcyd9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9hcHBsaWNhdGlvbl9jYWNoZS9zdGF0dXMnOiB7XG4gICAgR0VUOiB7fSxcbiAgfSxcblxuICAvL1xuICAvLyBtanNvbndpcmVcbiAgLy9cbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvY29udGV4dCc6IHtcbiAgICBHRVQ6IHtjb21tYW5kOiAnZ2V0Q3VycmVudENvbnRleHQnfSxcbiAgICBQT1NUOiB7Y29tbWFuZDogJ3NldENvbnRleHQnLCBwYXlsb2FkUGFyYW1zOiB7cmVxdWlyZWQ6IFsnbmFtZSddfX0sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL2NvbnRleHRzJzoge1xuICAgIEdFVDoge2NvbW1hbmQ6ICdnZXRDb250ZXh0cyd9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9lbGVtZW50LzplbGVtZW50SWQvcGFnZUluZGV4Jzoge1xuICAgIEdFVDoge2NvbW1hbmQ6ICdnZXRQYWdlSW5kZXgnfSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvbmV0d29ya19jb25uZWN0aW9uJzoge1xuICAgIEdFVDoge2NvbW1hbmQ6ICdnZXROZXR3b3JrQ29ubmVjdGlvbid9LFxuICAgIFBPU1Q6IHtcbiAgICAgIGNvbW1hbmQ6ICdzZXROZXR3b3JrQ29ubmVjdGlvbicsXG4gICAgICBwYXlsb2FkUGFyYW1zOiB7dW53cmFwOiAncGFyYW1ldGVycycsIHJlcXVpcmVkOiBbJ3R5cGUnXX0sXG4gICAgfSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvdG91Y2gvcGVyZm9ybSc6IHtcbiAgICBQT1NUOiB7XG4gICAgICBjb21tYW5kOiAncGVyZm9ybVRvdWNoJyxcbiAgICAgIHBheWxvYWRQYXJhbXM6IHt3cmFwOiAnYWN0aW9ucycsIHJlcXVpcmVkOiBbJ2FjdGlvbnMnXX0sXG4gICAgfSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvdG91Y2gvbXVsdGkvcGVyZm9ybSc6IHtcbiAgICBQT1NUOiB7XG4gICAgICBjb21tYW5kOiAncGVyZm9ybU11bHRpQWN0aW9uJyxcbiAgICAgIHBheWxvYWRQYXJhbXM6IHtyZXF1aXJlZDogWydhY3Rpb25zJ10sIG9wdGlvbmFsOiBbJ2VsZW1lbnRJZCddfSxcbiAgICB9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9yZWNlaXZlX2FzeW5jX3Jlc3BvbnNlJzoge1xuICAgIFBPU1Q6IHtcbiAgICAgIGNvbW1hbmQ6ICdyZWNlaXZlQXN5bmNSZXNwb25zZScsXG4gICAgICBwYXlsb2FkUGFyYW1zOiB7cmVxdWlyZWQ6IFsnc3RhdHVzJywgJ3ZhbHVlJ119LFxuICAgIH0sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL2FwcGl1bS9kZXZpY2Uvc2hha2UnOiB7XG4gICAgUE9TVDoge2NvbW1hbmQ6ICdtb2JpbGVTaGFrZSd9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9hcHBpdW0vZGV2aWNlL3N5c3RlbV90aW1lJzoge1xuICAgIEdFVDoge2NvbW1hbmQ6ICdnZXREZXZpY2VUaW1lJywgcGF5bG9hZFBhcmFtczoge29wdGlvbmFsOiBbJ2Zvcm1hdCddfX0sXG4gICAgUE9TVDoge2NvbW1hbmQ6ICdnZXREZXZpY2VUaW1lJywgcGF5bG9hZFBhcmFtczoge29wdGlvbmFsOiBbJ2Zvcm1hdCddfX0sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL2FwcGl1bS9kZXZpY2UvbG9jayc6IHtcbiAgICBQT1NUOiB7Y29tbWFuZDogJ2xvY2snLCBwYXlsb2FkUGFyYW1zOiB7b3B0aW9uYWw6IFsnc2Vjb25kcyddfX0sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL2FwcGl1bS9kZXZpY2UvdW5sb2NrJzoge1xuICAgIFBPU1Q6IHtjb21tYW5kOiAndW5sb2NrJ30sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL2FwcGl1bS9kZXZpY2UvaXNfbG9ja2VkJzoge1xuICAgIFBPU1Q6IHtjb21tYW5kOiAnaXNMb2NrZWQnfSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvYXBwaXVtL3N0YXJ0X3JlY29yZGluZ19zY3JlZW4nOiB7XG4gICAgUE9TVDoge1xuICAgICAgY29tbWFuZDogJ3N0YXJ0UmVjb3JkaW5nU2NyZWVuJyxcbiAgICAgIHBheWxvYWRQYXJhbXM6IHtvcHRpb25hbDogWydvcHRpb25zJ119LFxuICAgIH0sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL2FwcGl1bS9zdG9wX3JlY29yZGluZ19zY3JlZW4nOiB7XG4gICAgUE9TVDoge1xuICAgICAgY29tbWFuZDogJ3N0b3BSZWNvcmRpbmdTY3JlZW4nLFxuICAgICAgcGF5bG9hZFBhcmFtczoge29wdGlvbmFsOiBbJ29wdGlvbnMnXX0sXG4gICAgfSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvYXBwaXVtL3BlcmZvcm1hbmNlRGF0YS90eXBlcyc6IHtcbiAgICBQT1NUOiB7Y29tbWFuZDogJ2dldFBlcmZvcm1hbmNlRGF0YVR5cGVzJ30sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL2FwcGl1bS9nZXRQZXJmb3JtYW5jZURhdGEnOiB7XG4gICAgUE9TVDoge1xuICAgICAgY29tbWFuZDogJ2dldFBlcmZvcm1hbmNlRGF0YScsXG4gICAgICBwYXlsb2FkUGFyYW1zOiB7XG4gICAgICAgIHJlcXVpcmVkOiBbJ3BhY2thZ2VOYW1lJywgJ2RhdGFUeXBlJ10sXG4gICAgICAgIG9wdGlvbmFsOiBbJ2RhdGFSZWFkVGltZW91dCddLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9hcHBpdW0vZGV2aWNlL3ByZXNzX2tleWNvZGUnOiB7XG4gICAgUE9TVDoge1xuICAgICAgY29tbWFuZDogJ3ByZXNzS2V5Q29kZScsXG4gICAgICBwYXlsb2FkUGFyYW1zOiB7cmVxdWlyZWQ6IFsna2V5Y29kZSddLCBvcHRpb25hbDogWydtZXRhc3RhdGUnLCAnZmxhZ3MnXX0sXG4gICAgfSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvYXBwaXVtL2RldmljZS9sb25nX3ByZXNzX2tleWNvZGUnOiB7XG4gICAgUE9TVDoge1xuICAgICAgY29tbWFuZDogJ2xvbmdQcmVzc0tleUNvZGUnLFxuICAgICAgcGF5bG9hZFBhcmFtczoge3JlcXVpcmVkOiBbJ2tleWNvZGUnXSwgb3B0aW9uYWw6IFsnbWV0YXN0YXRlJywgJ2ZsYWdzJ119LFxuICAgIH0sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL2FwcGl1bS9kZXZpY2UvZmluZ2VyX3ByaW50Jzoge1xuICAgIFBPU1Q6IHtcbiAgICAgIGNvbW1hbmQ6ICdmaW5nZXJwcmludCcsXG4gICAgICBwYXlsb2FkUGFyYW1zOiB7cmVxdWlyZWQ6IFsnZmluZ2VycHJpbnRJZCddfSxcbiAgICB9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9hcHBpdW0vZGV2aWNlL3NlbmRfc21zJzoge1xuICAgIFBPU1Q6IHtcbiAgICAgIGNvbW1hbmQ6ICdzZW5kU01TJyxcbiAgICAgIHBheWxvYWRQYXJhbXM6IHtyZXF1aXJlZDogWydwaG9uZU51bWJlcicsICdtZXNzYWdlJ119LFxuICAgIH0sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL2FwcGl1bS9kZXZpY2UvZ3NtX2NhbGwnOiB7XG4gICAgUE9TVDoge1xuICAgICAgY29tbWFuZDogJ2dzbUNhbGwnLFxuICAgICAgcGF5bG9hZFBhcmFtczoge3JlcXVpcmVkOiBbJ3Bob25lTnVtYmVyJywgJ2FjdGlvbiddfSxcbiAgICB9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9hcHBpdW0vZGV2aWNlL2dzbV9zaWduYWwnOiB7XG4gICAgUE9TVDoge1xuICAgICAgY29tbWFuZDogJ2dzbVNpZ25hbCcsXG4gICAgICBwYXlsb2FkUGFyYW1zOiB7XG4gICAgICAgIHZhbGlkYXRlOiAoanNvbk9iaikgPT5cbiAgICAgICAgICAhdXRpbC5oYXNWYWx1ZShqc29uT2JqLnNpZ25hbFN0cmVuZ3RoKSAmJlxuICAgICAgICAgICF1dGlsLmhhc1ZhbHVlKGpzb25PYmouc2lnbmFsU3RyZW5naCkgJiZcbiAgICAgICAgICAnd2UgcmVxdWlyZSBvbmUgb2YgXCJzaWduYWxTdHJlbmd0aFwiIG9yIFwic2lnbmFsU3RyZW5naFwiIHBhcmFtcycsXG4gICAgICAgIG9wdGlvbmFsOiBbJ3NpZ25hbFN0cmVuZ3RoJywgJ3NpZ25hbFN0cmVuZ2gnXSxcbiAgICAgICAgLy8gYmFja3dhcmQtY29tcGF0aWJsZS4gc29uT2JqLnNpZ25hbFN0cmVuZ3RoIGNhbiBiZSAwXG4gICAgICAgIG1ha2VBcmdzOiAoanNvbk9iaikgPT4gW1xuICAgICAgICAgIHV0aWwuaGFzVmFsdWUoanNvbk9iai5zaWduYWxTdHJlbmd0aCkgPyBqc29uT2JqLnNpZ25hbFN0cmVuZ3RoIDoganNvbk9iai5zaWduYWxTdHJlbmdoLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9hcHBpdW0vZGV2aWNlL2dzbV92b2ljZSc6IHtcbiAgICBQT1NUOiB7Y29tbWFuZDogJ2dzbVZvaWNlJywgcGF5bG9hZFBhcmFtczoge3JlcXVpcmVkOiBbJ3N0YXRlJ119fSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvYXBwaXVtL2RldmljZS9wb3dlcl9jYXBhY2l0eSc6IHtcbiAgICBQT1NUOiB7Y29tbWFuZDogJ3Bvd2VyQ2FwYWNpdHknLCBwYXlsb2FkUGFyYW1zOiB7cmVxdWlyZWQ6IFsncGVyY2VudCddfX0sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL2FwcGl1bS9kZXZpY2UvcG93ZXJfYWMnOiB7XG4gICAgUE9TVDoge2NvbW1hbmQ6ICdwb3dlckFDJywgcGF5bG9hZFBhcmFtczoge3JlcXVpcmVkOiBbJ3N0YXRlJ119fSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvYXBwaXVtL2RldmljZS9uZXR3b3JrX3NwZWVkJzoge1xuICAgIFBPU1Q6IHtjb21tYW5kOiAnbmV0d29ya1NwZWVkJywgcGF5bG9hZFBhcmFtczoge3JlcXVpcmVkOiBbJ25ldHNwZWVkJ119fSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvYXBwaXVtL2RldmljZS9rZXlldmVudCc6IHtcbiAgICBQT1NUOiB7XG4gICAgICBjb21tYW5kOiAna2V5ZXZlbnQnLFxuICAgICAgcGF5bG9hZFBhcmFtczoge3JlcXVpcmVkOiBbJ2tleWNvZGUnXSwgb3B0aW9uYWw6IFsnbWV0YXN0YXRlJ119LFxuICAgIH0sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL2FwcGl1bS9kZXZpY2Uvcm90YXRlJzoge1xuICAgIFBPU1Q6IHtcbiAgICAgIGNvbW1hbmQ6ICdtb2JpbGVSb3RhdGlvbicsXG4gICAgICBwYXlsb2FkUGFyYW1zOiB7XG4gICAgICAgIHJlcXVpcmVkOiBbJ3gnLCAneScsICdyYWRpdXMnLCAncm90YXRpb24nLCAndG91Y2hDb3VudCcsICdkdXJhdGlvbiddLFxuICAgICAgICBvcHRpb25hbDogWydlbGVtZW50J10sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL2FwcGl1bS9kZXZpY2UvY3VycmVudF9hY3Rpdml0eSc6IHtcbiAgICBHRVQ6IHtjb21tYW5kOiAnZ2V0Q3VycmVudEFjdGl2aXR5J30sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL2FwcGl1bS9kZXZpY2UvY3VycmVudF9wYWNrYWdlJzoge1xuICAgIEdFVDoge2NvbW1hbmQ6ICdnZXRDdXJyZW50UGFja2FnZSd9LFxuICB9LFxuICAvL3JlZ2lvbiBBcHBsaWNhdGlvbnMgTWFuYWdlbWVudFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9hcHBpdW0vZGV2aWNlL2luc3RhbGxfYXBwJzoge1xuICAgIFBPU1Q6IHtcbiAgICAgIGNvbW1hbmQ6ICdpbnN0YWxsQXBwJyxcbiAgICAgIHBheWxvYWRQYXJhbXM6IHtcbiAgICAgICAgcmVxdWlyZWQ6IFsnYXBwUGF0aCddLFxuICAgICAgICBvcHRpb25hbDogWydvcHRpb25zJ10sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL2FwcGl1bS9kZXZpY2UvYWN0aXZhdGVfYXBwJzoge1xuICAgIFBPU1Q6IHtcbiAgICAgIGNvbW1hbmQ6ICdhY3RpdmF0ZUFwcCcsXG4gICAgICBwYXlsb2FkUGFyYW1zOiB7XG4gICAgICAgIHJlcXVpcmVkOiBbWydhcHBJZCddLCBbJ2J1bmRsZUlkJ11dLFxuICAgICAgICBvcHRpb25hbDogWydvcHRpb25zJ10sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL2FwcGl1bS9kZXZpY2UvcmVtb3ZlX2FwcCc6IHtcbiAgICBQT1NUOiB7XG4gICAgICBjb21tYW5kOiAncmVtb3ZlQXBwJyxcbiAgICAgIHBheWxvYWRQYXJhbXM6IHtcbiAgICAgICAgcmVxdWlyZWQ6IFtbJ2FwcElkJ10sIFsnYnVuZGxlSWQnXV0sXG4gICAgICAgIG9wdGlvbmFsOiBbJ29wdGlvbnMnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvYXBwaXVtL2RldmljZS90ZXJtaW5hdGVfYXBwJzoge1xuICAgIFBPU1Q6IHtcbiAgICAgIGNvbW1hbmQ6ICd0ZXJtaW5hdGVBcHAnLFxuICAgICAgcGF5bG9hZFBhcmFtczoge1xuICAgICAgICByZXF1aXJlZDogW1snYXBwSWQnXSwgWydidW5kbGVJZCddXSxcbiAgICAgICAgb3B0aW9uYWw6IFsnb3B0aW9ucyddLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9hcHBpdW0vZGV2aWNlL2FwcF9pbnN0YWxsZWQnOiB7XG4gICAgUE9TVDoge1xuICAgICAgY29tbWFuZDogJ2lzQXBwSW5zdGFsbGVkJyxcbiAgICAgIHBheWxvYWRQYXJhbXM6IHtcbiAgICAgICAgcmVxdWlyZWQ6IFtbJ2FwcElkJ10sIFsnYnVuZGxlSWQnXV0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL2FwcGl1bS9kZXZpY2UvYXBwX3N0YXRlJzoge1xuICAgIEdFVDoge1xuICAgICAgY29tbWFuZDogJ3F1ZXJ5QXBwU3RhdGUnLFxuICAgICAgcGF5bG9hZFBhcmFtczoge1xuICAgICAgICByZXF1aXJlZDogW1snYXBwSWQnXSwgWydidW5kbGVJZCddXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBQT1NUOiB7XG4gICAgICBjb21tYW5kOiAncXVlcnlBcHBTdGF0ZScsXG4gICAgICBwYXlsb2FkUGFyYW1zOiB7XG4gICAgICAgIHJlcXVpcmVkOiBbWydhcHBJZCddLCBbJ2J1bmRsZUlkJ11dLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAvL2VuZHJlZ2lvblxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9hcHBpdW0vZGV2aWNlL2hpZGVfa2V5Ym9hcmQnOiB7XG4gICAgUE9TVDoge1xuICAgICAgY29tbWFuZDogJ2hpZGVLZXlib2FyZCcsXG4gICAgICBwYXlsb2FkUGFyYW1zOiB7b3B0aW9uYWw6IFsnc3RyYXRlZ3knLCAna2V5JywgJ2tleUNvZGUnLCAna2V5TmFtZSddfSxcbiAgICB9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9hcHBpdW0vZGV2aWNlL2lzX2tleWJvYXJkX3Nob3duJzoge1xuICAgIEdFVDoge2NvbW1hbmQ6ICdpc0tleWJvYXJkU2hvd24nfSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvYXBwaXVtL2RldmljZS9wdXNoX2ZpbGUnOiB7XG4gICAgUE9TVDoge2NvbW1hbmQ6ICdwdXNoRmlsZScsIHBheWxvYWRQYXJhbXM6IHtyZXF1aXJlZDogWydwYXRoJywgJ2RhdGEnXX19LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9hcHBpdW0vZGV2aWNlL3B1bGxfZmlsZSc6IHtcbiAgICBQT1NUOiB7Y29tbWFuZDogJ3B1bGxGaWxlJywgcGF5bG9hZFBhcmFtczoge3JlcXVpcmVkOiBbJ3BhdGgnXX19LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9hcHBpdW0vZGV2aWNlL3B1bGxfZm9sZGVyJzoge1xuICAgIFBPU1Q6IHtjb21tYW5kOiAncHVsbEZvbGRlcicsIHBheWxvYWRQYXJhbXM6IHtyZXF1aXJlZDogWydwYXRoJ119fSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvYXBwaXVtL2RldmljZS90b2dnbGVfYWlycGxhbmVfbW9kZSc6IHtcbiAgICBQT1NUOiB7Y29tbWFuZDogJ3RvZ2dsZUZsaWdodE1vZGUnfSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvYXBwaXVtL2RldmljZS90b2dnbGVfZGF0YSc6IHtcbiAgICBQT1NUOiB7Y29tbWFuZDogJ3RvZ2dsZURhdGEnfSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvYXBwaXVtL2RldmljZS90b2dnbGVfd2lmaSc6IHtcbiAgICBQT1NUOiB7Y29tbWFuZDogJ3RvZ2dsZVdpRmknfSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvYXBwaXVtL2RldmljZS90b2dnbGVfbG9jYXRpb25fc2VydmljZXMnOiB7XG4gICAgUE9TVDoge2NvbW1hbmQ6ICd0b2dnbGVMb2NhdGlvblNlcnZpY2VzJ30sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL2FwcGl1bS9kZXZpY2Uvb3Blbl9ub3RpZmljYXRpb25zJzoge1xuICAgIFBPU1Q6IHtjb21tYW5kOiAnb3Blbk5vdGlmaWNhdGlvbnMnfSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvYXBwaXVtL2RldmljZS9zdGFydF9hY3Rpdml0eSc6IHtcbiAgICBQT1NUOiB7XG4gICAgICBjb21tYW5kOiAnc3RhcnRBY3Rpdml0eScsXG4gICAgICBwYXlsb2FkUGFyYW1zOiB7XG4gICAgICAgIHJlcXVpcmVkOiBbJ2FwcFBhY2thZ2UnLCAnYXBwQWN0aXZpdHknXSxcbiAgICAgICAgb3B0aW9uYWw6IFtcbiAgICAgICAgICAnYXBwV2FpdFBhY2thZ2UnLFxuICAgICAgICAgICdhcHBXYWl0QWN0aXZpdHknLFxuICAgICAgICAgICdpbnRlbnRBY3Rpb24nLFxuICAgICAgICAgICdpbnRlbnRDYXRlZ29yeScsXG4gICAgICAgICAgJ2ludGVudEZsYWdzJyxcbiAgICAgICAgICAnb3B0aW9uYWxJbnRlbnRBcmd1bWVudHMnLFxuICAgICAgICAgICdkb250U3RvcEFwcE9uUmVzZXQnLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9hcHBpdW0vZGV2aWNlL3N5c3RlbV9iYXJzJzoge1xuICAgIEdFVDoge2NvbW1hbmQ6ICdnZXRTeXN0ZW1CYXJzJ30sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL2FwcGl1bS9kZXZpY2UvZGlzcGxheV9kZW5zaXR5Jzoge1xuICAgIEdFVDoge2NvbW1hbmQ6ICdnZXREaXNwbGF5RGVuc2l0eSd9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9hcHBpdW0vc2ltdWxhdG9yL3RvdWNoX2lkJzoge1xuICAgIFBPU1Q6IHtjb21tYW5kOiAndG91Y2hJZCcsIHBheWxvYWRQYXJhbXM6IHtyZXF1aXJlZDogWydtYXRjaCddfX0sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL2FwcGl1bS9zaW11bGF0b3IvdG9nZ2xlX3RvdWNoX2lkX2Vucm9sbG1lbnQnOiB7XG4gICAgUE9TVDoge1xuICAgICAgY29tbWFuZDogJ3RvZ2dsZUVucm9sbFRvdWNoSWQnLFxuICAgICAgcGF5bG9hZFBhcmFtczoge29wdGlvbmFsOiBbJ2VuYWJsZWQnXX0sXG4gICAgfSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvYXBwaXVtL2FwcC9sYXVuY2gnOiB7XG4gICAgUE9TVDoge2NvbW1hbmQ6ICdsYXVuY2hBcHAnfSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvYXBwaXVtL2FwcC9jbG9zZSc6IHtcbiAgICBQT1NUOiB7Y29tbWFuZDogJ2Nsb3NlQXBwJ30sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL2FwcGl1bS9hcHAvcmVzZXQnOiB7XG4gICAgUE9TVDoge2NvbW1hbmQ6ICdyZXNldCd9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9hcHBpdW0vYXBwL2JhY2tncm91bmQnOiB7XG4gICAgUE9TVDoge2NvbW1hbmQ6ICdiYWNrZ3JvdW5kJywgcGF5bG9hZFBhcmFtczoge3JlcXVpcmVkOiBbJ3NlY29uZHMnXX19LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9hcHBpdW0vYXBwL2VuZF90ZXN0X2NvdmVyYWdlJzoge1xuICAgIFBPU1Q6IHtcbiAgICAgIGNvbW1hbmQ6ICdlbmRDb3ZlcmFnZScsXG4gICAgICBwYXlsb2FkUGFyYW1zOiB7cmVxdWlyZWQ6IFsnaW50ZW50JywgJ3BhdGgnXX0sXG4gICAgfSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvYXBwaXVtL2FwcC9zdHJpbmdzJzoge1xuICAgIFBPU1Q6IHtcbiAgICAgIGNvbW1hbmQ6ICdnZXRTdHJpbmdzJyxcbiAgICAgIHBheWxvYWRQYXJhbXM6IHtvcHRpb25hbDogWydsYW5ndWFnZScsICdzdHJpbmdGaWxlJ119LFxuICAgIH0sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL2FwcGl1bS9lbGVtZW50LzplbGVtZW50SWQvdmFsdWUnOiB7XG4gICAgUE9TVDoge1xuICAgICAgY29tbWFuZDogJ3NldFZhbHVlSW1tZWRpYXRlJyxcbiAgICAgIHBheWxvYWRQYXJhbXM6IHtcbiAgICAgICAgdmFsaWRhdGU6IChqc29uT2JqKSA9PlxuICAgICAgICAgICF1dGlsLmhhc1ZhbHVlKGpzb25PYmoudmFsdWUpICYmXG4gICAgICAgICAgIXV0aWwuaGFzVmFsdWUoanNvbk9iai50ZXh0KSAmJlxuICAgICAgICAgICd3ZSByZXF1aXJlIG9uZSBvZiBcInRleHRcIiBvciBcInZhbHVlXCIgcGFyYW1zJyxcbiAgICAgICAgb3B0aW9uYWw6IFsndmFsdWUnLCAndGV4dCddLFxuICAgICAgICAvLyBXZSB3YW50IHRvIGVpdGhlciBhIHZhbHVlIChvbGQgSlNPTldQKSBvciBhIHRleHQgKG5ldyBXM0MpIHBhcmFtZXRlcixcbiAgICAgICAgLy8gYnV0IG9ubHkgc2VuZCBvbmUgb2YgdGhlbSB0byB0aGUgY29tbWFuZCAobm90IGJvdGgpLlxuICAgICAgICAvLyBQcmVmZXIgJ3ZhbHVlJyBzaW5jZSBpdCdzIG1vcmUgYmFja3dhcmQtY29tcGF0aWJsZS5cbiAgICAgICAgbWFrZUFyZ3M6IChqc29uT2JqKSA9PiBbanNvbk9iai52YWx1ZSB8fCBqc29uT2JqLnRleHRdLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9hcHBpdW0vZWxlbWVudC86ZWxlbWVudElkL3JlcGxhY2VfdmFsdWUnOiB7XG4gICAgUE9TVDoge1xuICAgICAgY29tbWFuZDogJ3JlcGxhY2VWYWx1ZScsXG4gICAgICBwYXlsb2FkUGFyYW1zOiB7XG4gICAgICAgIHZhbGlkYXRlOiAoanNvbk9iaikgPT5cbiAgICAgICAgICAhdXRpbC5oYXNWYWx1ZShqc29uT2JqLnZhbHVlKSAmJlxuICAgICAgICAgICF1dGlsLmhhc1ZhbHVlKGpzb25PYmoudGV4dCkgJiZcbiAgICAgICAgICAnd2UgcmVxdWlyZSBvbmUgb2YgXCJ0ZXh0XCIgb3IgXCJ2YWx1ZVwiIHBhcmFtcycsXG4gICAgICAgIG9wdGlvbmFsOiBbJ3ZhbHVlJywgJ3RleHQnXSxcbiAgICAgICAgLy8gV2Ugd2FudCB0byBlaXRoZXIgYSB2YWx1ZSAob2xkIEpTT05XUCkgb3IgYSB0ZXh0IChuZXcgVzNDKSBwYXJhbWV0ZXIsXG4gICAgICAgIC8vIGJ1dCBvbmx5IHNlbmQgb25lIG9mIHRoZW0gdG8gdGhlIGNvbW1hbmQgKG5vdCBib3RoKS5cbiAgICAgICAgLy8gUHJlZmVyICd2YWx1ZScgc2luY2UgaXQncyBtb3JlIGJhY2t3YXJkLWNvbXBhdGlibGUuXG4gICAgICAgIG1ha2VBcmdzOiAoanNvbk9iaikgPT4gW2pzb25PYmoudmFsdWUgPz8ganNvbk9iai50ZXh0ID8/ICcnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvYXBwaXVtL3NldHRpbmdzJzoge1xuICAgIFBPU1Q6IHtjb21tYW5kOiAndXBkYXRlU2V0dGluZ3MnLCBwYXlsb2FkUGFyYW1zOiB7cmVxdWlyZWQ6IFsnc2V0dGluZ3MnXX19LFxuICAgIEdFVDoge2NvbW1hbmQ6ICdnZXRTZXR0aW5ncyd9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9hcHBpdW0vcmVjZWl2ZV9hc3luY19yZXNwb25zZSc6IHtcbiAgICBQT1NUOiB7XG4gICAgICBjb21tYW5kOiAncmVjZWl2ZUFzeW5jUmVzcG9uc2UnLFxuICAgICAgcGF5bG9hZFBhcmFtczoge3JlcXVpcmVkOiBbJ3Jlc3BvbnNlJ119LFxuICAgIH0sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL2FwcGl1bS9ldmVudHMnOiB7XG4gICAgUE9TVDoge2NvbW1hbmQ6ICdnZXRMb2dFdmVudHMnLCBwYXlsb2FkUGFyYW1zOiB7b3B0aW9uYWw6IFsndHlwZSddfX0sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL2FwcGl1bS9sb2dfZXZlbnQnOiB7XG4gICAgUE9TVDoge1xuICAgICAgY29tbWFuZDogJ2xvZ0N1c3RvbUV2ZW50JyxcbiAgICAgIHBheWxvYWRQYXJhbXM6IHtyZXF1aXJlZDogWyd2ZW5kb3InLCAnZXZlbnQnXX0sXG4gICAgfSxcbiAgfSxcblxuICAvKlxuICAgKiBUaGUgVzNDIHNwZWMgaGFzIHNvbWUgY2hhbmdlcyB0byB0aGUgd2lyZSBwcm90b2NvbC5cbiAgICogaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmRyaXZlci93ZWJkcml2ZXItc3BlYy5odG1sXG4gICAqIEJlZ2luIHRvIGFkZCB0aG9zZSBjaGFuZ2VzIGhlcmUsIGtlZXBpbmcgdGhlIG9sZCB2ZXJzaW9uXG4gICAqIHNpbmNlIGNsaWVudHMgc3RpbGwgaW1wbGVtZW50IHRoZW0uXG4gICAqL1xuICAvLyBNSlNPTldQXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL2FsZXJ0X3RleHQnOiB7XG4gICAgR0VUOiB7Y29tbWFuZDogJ2dldEFsZXJ0VGV4dCd9LFxuICAgIFBPU1Q6IHtcbiAgICAgIGNvbW1hbmQ6ICdzZXRBbGVydFRleHQnLFxuICAgICAgcGF5bG9hZFBhcmFtczogU0VUX0FMRVJUX1RFWFRfUEFZTE9BRF9QQVJBTVMsXG4gICAgfSxcbiAgfSxcbiAgLy8gTUpTT05XUFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9hY2NlcHRfYWxlcnQnOiB7XG4gICAgUE9TVDoge2NvbW1hbmQ6ICdwb3N0QWNjZXB0QWxlcnQnfSxcbiAgfSxcbiAgLy8gTUpTT05XUFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9kaXNtaXNzX2FsZXJ0Jzoge1xuICAgIFBPU1Q6IHtjb21tYW5kOiAncG9zdERpc21pc3NBbGVydCd9LFxuICB9LFxuICAvLyBodHRwczovL3czYy5naXRodWIuaW8vd2ViZHJpdmVyL3dlYmRyaXZlci1zcGVjLmh0bWwjdXNlci1wcm9tcHRzXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL2FsZXJ0L3RleHQnOiB7XG4gICAgR0VUOiB7Y29tbWFuZDogJ2dldEFsZXJ0VGV4dCd9LFxuICAgIFBPU1Q6IHtcbiAgICAgIGNvbW1hbmQ6ICdzZXRBbGVydFRleHQnLFxuICAgICAgcGF5bG9hZFBhcmFtczogU0VUX0FMRVJUX1RFWFRfUEFZTE9BRF9QQVJBTVMsXG4gICAgfSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvYWxlcnQvYWNjZXB0Jzoge1xuICAgIFBPU1Q6IHtjb21tYW5kOiAncG9zdEFjY2VwdEFsZXJ0J30sXG4gIH0sXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL2FsZXJ0L2Rpc21pc3MnOiB7XG4gICAgUE9TVDoge2NvbW1hbmQ6ICdwb3N0RGlzbWlzc0FsZXJ0J30sXG4gIH0sXG4gIC8vIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJkcml2ZXIvd2ViZHJpdmVyLXNwZWMuaHRtbCNnZXQtZWxlbWVudC1yZWN0XG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL2VsZW1lbnQvOmVsZW1lbnRJZC9yZWN0Jzoge1xuICAgIEdFVDoge2NvbW1hbmQ6ICdnZXRFbGVtZW50UmVjdCd9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9leGVjdXRlL3N5bmMnOiB7XG4gICAgUE9TVDoge2NvbW1hbmQ6ICdleGVjdXRlJywgcGF5bG9hZFBhcmFtczoge3JlcXVpcmVkOiBbJ3NjcmlwdCcsICdhcmdzJ119fSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvZXhlY3V0ZS9hc3luYyc6IHtcbiAgICBQT1NUOiB7XG4gICAgICBjb21tYW5kOiAnZXhlY3V0ZUFzeW5jJyxcbiAgICAgIHBheWxvYWRQYXJhbXM6IHtyZXF1aXJlZDogWydzY3JpcHQnLCAnYXJncyddfSxcbiAgICB9LFxuICB9LFxuICAvLyBQcmUtVzNDIGVuZHBvaW50IGZvciBlbGVtZW50IHNjcmVlbnNob3RcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvc2NyZWVuc2hvdC86ZWxlbWVudElkJzoge1xuICAgIEdFVDoge2NvbW1hbmQ6ICdnZXRFbGVtZW50U2NyZWVuc2hvdCd9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9lbGVtZW50LzplbGVtZW50SWQvc2NyZWVuc2hvdCc6IHtcbiAgICBHRVQ6IHtjb21tYW5kOiAnZ2V0RWxlbWVudFNjcmVlbnNob3QnfSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvd2luZG93L3JlY3QnOiB7XG4gICAgR0VUOiB7Y29tbWFuZDogJ2dldFdpbmRvd1JlY3QnfSxcbiAgICBQT1NUOiB7XG4gICAgICBjb21tYW5kOiAnc2V0V2luZG93UmVjdCcsXG4gICAgICBwYXlsb2FkUGFyYW1zOiB7cmVxdWlyZWQ6IFsneCcsICd5JywgJ3dpZHRoJywgJ2hlaWdodCddfSxcbiAgICB9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC93aW5kb3cvbWF4aW1pemUnOiB7XG4gICAgUE9TVDoge2NvbW1hbmQ6ICdtYXhpbWl6ZVdpbmRvdyd9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC93aW5kb3cvbWluaW1pemUnOiB7XG4gICAgUE9TVDoge2NvbW1hbmQ6ICdtaW5pbWl6ZVdpbmRvdyd9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC93aW5kb3cvZnVsbHNjcmVlbic6IHtcbiAgICBQT1NUOiB7Y29tbWFuZDogJ2Z1bGxTY3JlZW5XaW5kb3cnfSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvd2luZG93L25ldyc6IHtcbiAgICBQT1NUOiB7Y29tbWFuZDogJ2NyZWF0ZU5ld1dpbmRvdycsIHBheWxvYWRQYXJhbXM6IHtvcHRpb25hbDogWyd0eXBlJ119fSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvZWxlbWVudC86ZWxlbWVudElkL3Byb3BlcnR5LzpuYW1lJzoge1xuICAgIEdFVDoge2NvbW1hbmQ6ICdnZXRQcm9wZXJ0eSd9LFxuICB9LFxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC9hcHBpdW0vZGV2aWNlL3NldF9jbGlwYm9hcmQnOiB7XG4gICAgUE9TVDoge1xuICAgICAgY29tbWFuZDogJ3NldENsaXBib2FyZCcsXG4gICAgICBwYXlsb2FkUGFyYW1zOiB7XG4gICAgICAgIHJlcXVpcmVkOiBbJ2NvbnRlbnQnXSxcbiAgICAgICAgb3B0aW9uYWw6IFsnY29udGVudFR5cGUnLCAnbGFiZWwnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvYXBwaXVtL2RldmljZS9nZXRfY2xpcGJvYXJkJzoge1xuICAgIFBPU1Q6IHtcbiAgICAgIGNvbW1hbmQ6ICdnZXRDbGlwYm9hcmQnLFxuICAgICAgcGF5bG9hZFBhcmFtczoge1xuICAgICAgICBvcHRpb25hbDogWydjb250ZW50VHlwZSddLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuXG4gIC8vIGNocm9taXVtIGRldnRvb2xzXG4gIC8vIGh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMvKy9tYXN0ZXIvY2hyb21lL3Rlc3QvY2hyb21lZHJpdmVyL3NlcnZlci9odHRwX2hhbmRsZXIuY2NcbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvOnZlbmRvci9jZHAvZXhlY3V0ZSc6IHtcbiAgICBQT1NUOiB7Y29tbWFuZDogJ2V4ZWN1dGVDZHAnLCBwYXlsb2FkUGFyYW1zOiB7cmVxdWlyZWQ6IFsnY21kJywgJ3BhcmFtcyddfX0sXG4gIH0sXG5cbiAgLy9yZWdpb24gV2ViYXV0aG5cbiAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dlYmF1dGhuLTIvI3NjdG4tYXV0b21hdGlvbi1hZGQtdmlydHVhbC1hdXRoZW50aWNhdG9yXG5cbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvd2ViYXV0aG4vYXV0aGVudGljYXRvcic6IHtcbiAgICBQT1NUOiB7XG4gICAgICBjb21tYW5kOiAnYWRkVmlydHVhbEF1dGhlbnRpY2F0b3InLFxuICAgICAgcGF5bG9hZFBhcmFtczoge1xuICAgICAgICByZXF1aXJlZDogWydwcm90b2NvbCcsICd0cmFuc3BvcnQnXSxcbiAgICAgICAgb3B0aW9uYWw6IFsnaGFzUmVzaWRlbnRLZXknLCAnaGFzVXNlclZlcmlmaWNhdGlvbicsICdpc1VzZXJDb25zZW50aW5nJywgJ2lzVXNlclZlcmlmaWVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG5cbiAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvd2ViYXV0aG4vYXV0aGVudGljYXRvci86YXV0aGVudGljYXRvcklkJzoge1xuICAgIERFTEVURToge1xuICAgICAgY29tbWFuZDogJ3JlbW92ZVZpcnR1YWxBdXRoZW50aWNhdG9yJyxcbiAgICB9LFxuICB9LFxuXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL3dlYmF1dGhuL2F1dGhlbnRpY2F0b3IvOmF1dGhlbnRpY2F0b3JJZC9jcmVkZW50aWFsJzoge1xuICAgIFBPU1Q6IHtcbiAgICAgIGNvbW1hbmQ6ICdhZGRBdXRoQ3JlZGVudGlhbCcsXG4gICAgICBwYXlsb2FkUGFyYW1zOiB7XG4gICAgICAgIHJlcXVpcmVkOiBbJ2NyZWRlbnRpYWxJZCcsICdpc1Jlc2lkZW50Q3JlZGVudGlhbCcsICdycElkJywgJ3ByaXZhdGVLZXknXSxcbiAgICAgICAgb3B0aW9uYWw6IFsndXNlckhhbmRsZScsICdzaWduQ291bnQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcblxuICAnL3Nlc3Npb24vOnNlc3Npb25JZC93ZWJhdXRobi9hdXRoZW50aWNhdG9yLzphdXRoZW50aWNhdG9ySWQvY3JlZGVudGlhbHMnOiB7XG4gICAgR0VUOiB7Y29tbWFuZDogJ2dldEF1dGhDcmVkZW50aWFsJ30sXG4gICAgREVMRVRFOiB7Y29tbWFuZDogJ3JlbW92ZUFsbEF1dGhDcmVkZW50aWFscyd9LFxuICB9LFxuXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL3dlYmF1dGhuL2F1dGhlbnRpY2F0b3IvOmF1dGhlbnRpY2F0b3JJZC9jcmVkZW50aWFscy86Y3JlZGVudGlhbElkJzoge1xuICAgIERFTEVURToge2NvbW1hbmQ6ICdyZW1vdmVBdXRoQ3JlZGVudGlhbCd9LFxuICB9LFxuXG4gICcvc2Vzc2lvbi86c2Vzc2lvbklkL3dlYmF1dGhuL2F1dGhlbnRpY2F0b3IvOmF1dGhlbnRpY2F0b3JJZC91dic6IHtcbiAgICBQT1NUOiB7XG4gICAgICBjb21tYW5kOiAnc2V0VXNlckF1dGhWZXJpZmllZCcsXG4gICAgICBwYXlsb2FkUGFyYW1zOiB7XG4gICAgICAgIHJlcXVpcmVkOiBbJ2lzVXNlclZlcmlmaWVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG5cbiAgLy9lbmRyZWdpb25cbn07XG5cbi8vIGRyaXZlciBjb21tYW5kIG5hbWVzXG5sZXQgQUxMX0NPTU1BTkRTID0gW107XG5mb3IgKGxldCB2IG9mIF8udmFsdWVzKE1FVEhPRF9NQVApKSB7XG4gIGZvciAobGV0IG0gb2YgXy52YWx1ZXModikpIHtcbiAgICBpZiAobS5jb21tYW5kKSB7XG4gICAgICBBTExfQ09NTUFORFMucHVzaChtLmNvbW1hbmQpO1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCBSRV9FU0NBUEUgPSAvWy1bXFxde30oKSs/LixcXFxcXiR8I1xcc10vZztcbmNvbnN0IFJFX1BBUkFNID0gLyhbOipdKShcXHcrKS9nO1xuXG5jbGFzcyBSb3V0ZSB7XG4gIGNvbnN0cnVjdG9yKHJvdXRlKSB7XG4gICAgdGhpcy5wYXJhbU5hbWVzID0gW107XG5cbiAgICBsZXQgcmVTdHIgPSByb3V0ZS5yZXBsYWNlKFJFX0VTQ0FQRSwgJ1xcXFwkJicpO1xuICAgIHJlU3RyID0gcmVTdHIucmVwbGFjZShSRV9QQVJBTSwgKF8sIG1vZGUsIG5hbWUpID0+IHtcbiAgICAgIHRoaXMucGFyYW1OYW1lcy5wdXNoKG5hbWUpO1xuICAgICAgcmV0dXJuIG1vZGUgPT09ICc6JyA/ICcoW14vXSopJyA6ICcoLiopJztcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlUmVnZXhwID0gbmV3IFJlZ0V4cChgXiR7cmVTdHJ9JGApO1xuICB9XG5cbiAgcGFyc2UodXJsKSB7XG4gICAgLy9pZiAodXJsLmluZGV4T2YoJ3RpbWVvdXRzJykgIT09IC0xICYmIHRoaXMucm91dGVSZWdleHAudG9TdHJpbmcoKS5pbmRleE9mKCd0aW1lb3V0cycpICE9PSAtMSkge1xuICAgIC8vZGVidWdnZXI7XG4gICAgLy99XG4gICAgbGV0IG1hdGNoZXMgPSB1cmwubWF0Y2godGhpcy5yb3V0ZVJlZ2V4cCk7XG4gICAgaWYgKCFtYXRjaGVzKSByZXR1cm47IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgY3VybHlcbiAgICBsZXQgaSA9IDA7XG4gICAgbGV0IHBhcmFtcyA9IHt9O1xuICAgIHdoaWxlIChpIDwgdGhpcy5wYXJhbU5hbWVzLmxlbmd0aCkge1xuICAgICAgY29uc3QgcGFyYW1OYW1lID0gdGhpcy5wYXJhbU5hbWVzW2krK107XG4gICAgICBwYXJhbXNbcGFyYW1OYW1lXSA9IG1hdGNoZXNbaV07XG4gICAgfVxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuZHBvaW50XG4gKiBAcGFyYW0ge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkhUVFBNZXRob2R9IG1ldGhvZFxuICogQHBhcmFtIHtzdHJpbmd9IFtiYXNlUGF0aF1cbiAqIEByZXR1cm5zIHtzdHJpbmd8dW5kZWZpbmVkfVxuICovXG5mdW5jdGlvbiByb3V0ZVRvQ29tbWFuZE5hbWUoZW5kcG9pbnQsIG1ldGhvZCwgYmFzZVBhdGggPSBERUZBVUxUX0JBU0VfUEFUSCkge1xuICBsZXQgZHN0Um91dGUgPSBudWxsO1xuXG4gIC8vIHJlbW92ZSBhbnkgcXVlcnkgc3RyaW5nXG4gIC8vIFRPRE86IHdvdWxkIHRoaXMgYmUgYmV0dGVyIGhhbmRsZWQgYXMgYSBgVVJMYCBvYmplY3Q/XG4gIGlmIChlbmRwb2ludC5pbmNsdWRlcygnPycpKSB7XG4gICAgZW5kcG9pbnQgPSBlbmRwb2ludC5zbGljZSgwLCBlbmRwb2ludC5pbmRleE9mKCc/JykpO1xuICB9XG5cbiAgY29uc3QgYWN0dWFsRW5kcG9pbnQgPVxuICAgIGVuZHBvaW50ID09PSAnLycgPyAnJyA6IF8uc3RhcnRzV2l0aChlbmRwb2ludCwgJy8nKSA/IGVuZHBvaW50IDogYC8ke2VuZHBvaW50fWA7XG5cbiAgZm9yIChsZXQgY3VycmVudFJvdXRlIG9mIF8ua2V5cyhNRVRIT0RfTUFQKSkge1xuICAgIGNvbnN0IHJvdXRlID0gbmV3IFJvdXRlKGAke2Jhc2VQYXRofSR7Y3VycmVudFJvdXRlfWApO1xuICAgIC8vIHdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIGFjdHVhbCBzZXNzaW9uIGlkIGZvciBtYXRjaGluZ1xuICAgIGlmIChcbiAgICAgIHJvdXRlLnBhcnNlKGAke2Jhc2VQYXRofS9zZXNzaW9uL2lnbm9yZWQtc2Vzc2lvbi1pZCR7YWN0dWFsRW5kcG9pbnR9YCkgfHxcbiAgICAgIHJvdXRlLnBhcnNlKGAke2Jhc2VQYXRofSR7YWN0dWFsRW5kcG9pbnR9YCkgfHxcbiAgICAgIHJvdXRlLnBhcnNlKGFjdHVhbEVuZHBvaW50KVxuICAgICkge1xuICAgICAgZHN0Um91dGUgPSBjdXJyZW50Um91dGU7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKCFkc3RSb3V0ZSkgcmV0dXJuOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGN1cmx5XG5cbiAgY29uc3QgbWV0aG9kcyA9IF8uZ2V0KE1FVEhPRF9NQVAsIGRzdFJvdXRlKTtcbiAgbWV0aG9kID0gLyoqIEB0eXBlIHtVcHBlcmNhc2U8dHlwZW9mIG1ldGhvZD59ICovIChfLnRvVXBwZXIobWV0aG9kKSk7XG4gIGlmIChfLmhhcyhtZXRob2RzLCBtZXRob2QpKSB7XG4gICAgY29uc3QgZHN0TWV0aG9kID0gXy5nZXQobWV0aG9kcywgbWV0aG9kKTtcbiAgICBpZiAoZHN0TWV0aG9kLmNvbW1hbmQpIHtcbiAgICAgIHJldHVybiBkc3RNZXRob2QuY29tbWFuZDtcbiAgICB9XG4gIH1cbn1cblxuLy8gZHJpdmVyIGNvbW1hbmRzIHRoYXQgZG8gbm90IHJlcXVpcmUgYSBzZXNzaW9uIHRvIGFscmVhZHkgZXhpc3RcbmNvbnN0IE5PX1NFU1NJT05fSURfQ09NTUFORFMgPSBbJ2NyZWF0ZVNlc3Npb24nLCAnZ2V0U3RhdHVzJywgJ2dldFNlc3Npb25zJ107XG5cbmV4cG9ydCB7TUVUSE9EX01BUCwgQUxMX0NPTU1BTkRTLCBOT19TRVNTSU9OX0lEX0NPTU1BTkRTLCByb3V0ZVRvQ29tbWFuZE5hbWV9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Ecml2ZXJ9IERyaXZlclxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLk1ldGhvZE1hcH0gTWV0aG9kTWFwXG4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUVBOztBQUNBOztBQUNBOzs7O0FBRUEsTUFBTUEsNkJBQTZCLEdBQUc7RUFDcENDLFFBQVEsRUFBR0MsT0FBRCxJQUNSLENBQUNDLGFBQUEsQ0FBS0MsUUFBTCxDQUFjRixPQUFPLENBQUNHLEtBQXRCLENBQUQsSUFDQSxDQUFDRixhQUFBLENBQUtDLFFBQUwsQ0FBY0YsT0FBTyxDQUFDSSxJQUF0QixDQURELElBRUEsc0NBSmtDO0VBS3BDQyxRQUFRLEVBQUUsQ0FBQyxPQUFELEVBQVUsTUFBVixDQUwwQjtFQU9wQ0MsUUFBUSxFQUFHTixPQUFELElBQWEsQ0FBQ0EsT0FBTyxDQUFDRyxLQUFSLElBQWlCSCxPQUFPLENBQUNJLElBQTFCO0FBUGEsQ0FBdEM7QUFnQkEsTUFBTUcsVUFBVSxHQUFHO0VBQ2pCLFdBQVc7SUFDVEMsR0FBRyxFQUFFO01BQUNDLE9BQU8sRUFBRTtJQUFWO0VBREksQ0FETTtFQUlqQixZQUFZO0lBQ1ZDLElBQUksRUFBRTtNQUNKRCxPQUFPLEVBQUUsZUFETDtNQUVKRSxhQUFhLEVBQUU7UUFDYlosUUFBUSxFQUFHQyxPQUFELElBQ1IsQ0FBQ0EsT0FBTyxDQUFDWSxZQUFULElBQ0EsQ0FBQ1osT0FBTyxDQUFDYSxtQkFEVCxJQUVBLGtFQUpXO1FBS2JSLFFBQVEsRUFBRSxDQUFDLHFCQUFELEVBQXdCLHNCQUF4QixFQUFnRCxjQUFoRDtNQUxHO0lBRlg7RUFESSxDQUpLO0VBZ0JqQixhQUFhO0lBQ1hHLEdBQUcsRUFBRTtNQUFDQyxPQUFPLEVBQUU7SUFBVjtFQURNLENBaEJJO0VBbUJqQix1QkFBdUI7SUFDckJELEdBQUcsRUFBRTtNQUFDQyxPQUFPLEVBQUU7SUFBVixDQURnQjtJQUVyQkssTUFBTSxF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
981
+ /**
982
+ * This checks compat with the `MethodMap` interface.
983
+ * @ignore
984
+ */
985
+ // eslint-disable-next-line no-unused-vars
986
+ const _validMethodMap =
987
+ /** @type {import('@appium/types').MethodMap<import('@appium/types').ExternalDriver<import('@appium/types').BaseDriverCapConstraints>>} */ (METHOD_MAP);
988
+ //# sourceMappingURL=routes.js.map