@appium/test-support 1.5.0 → 2.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.
@@ -1,77 +0,0 @@
1
- /**
2
- * Creates some helper functions for E2E tests to manage sessions.
3
- * @template [CommandData=unknown]
4
- * @template [ResponseData=any]
5
- * @param {number} port - Port on which the server is running. Typically this will be retrieved via `get-port` beforehand
6
- * @param {string} [address] - Address/host on which the server is running. Defaults to {@linkcode TEST_HOST}
7
- * @returns {SessionHelpers<CommandData, ResponseData>}
8
- */
9
- export function createSessionHelpers<CommandData = unknown, ResponseData = any>(port: number, address?: string | undefined): SessionHelpers<CommandData, ResponseData>;
10
- /**
11
- * Creates E2E test suites for a driver.
12
- * @template {Driver} P
13
- * @param {DriverClass<P>} DriverClass
14
- * @param {AppiumW3CCapabilities} [defaultCaps]
15
- */
16
- export function driverE2ETestSuite<P extends import("@appium/types").Driver>(DriverClass: DriverClass<P>, defaultCaps?: Partial<import("@wdio/types/build/Capabilities").Capabilities & import("@wdio/types/build/Capabilities").AppiumW3CCapabilities & {
17
- [x: `${string}:${string}`]: any;
18
- }> | undefined): void;
19
- /**
20
- * A {@linkcode DriverClass }, except using the base {@linkcode Driver } type instead of `ExternalDriver`.
21
- * This allows the suite to work for `BaseDriver`.
22
- */
23
- export type DriverClass<P extends import("@appium/types").Driver> = import('@appium/types').DriverClass<P>;
24
- export type Capabilities = import('@appium/types').Capabilities;
25
- export type Driver = import('@appium/types').Driver;
26
- export type DriverStatic = import('@appium/types').DriverStatic;
27
- export type AppiumW3CCapabilities = import('@appium/types').AppiumW3CCapabilities;
28
- export type AxiosRequestConfig = import('axios').AxiosRequestConfig;
29
- export type SingularSessionData = import('@appium/types').SingularSessionData;
30
- export type AxiosResponse<T, D> = import('axios').AxiosResponse<T, D>;
31
- export type NewSessionData = {
32
- capabilities: import('type-fest').RequireAtLeastOne<import('@appium/types').W3CCapabilities, 'firstMatch' | 'alwaysMatch'>;
33
- };
34
- export type NewSessionResponse = {
35
- /**
36
- * ,
37
- */
38
- sessionId: string;
39
- capabilities: import('@appium/types').Capabilities;
40
- };
41
- /**
42
- * Some E2E helpers for making requests and managing sessions
43
- * See {@linkcode createSessionHelpers }
44
- */
45
- export type SessionHelpers<CommandData = unknown, ResponseData = any> = {
46
- /**
47
- * - URL to create a new session. Can be used with raw `axios` requests to fully inspect raw response. Mostly, this will not be used.
48
- */
49
- newSessionURL: string;
50
- /**
51
- * - Begin a session
52
- */
53
- startSession: (data: NewSessionData, config?: AxiosRequestConfig) => Promise<NewSessionResponse>;
54
- /**
55
- * - End a session. _Note: resolves with raw response object_
56
- */
57
- endSession: (sessionId: string) => Promise<AxiosResponse<{
58
- value: {
59
- error?: string;
60
- } | null;
61
- }, {
62
- validateStatus: null;
63
- }>>;
64
- /**
65
- * - Get info about a session
66
- */
67
- getSession: (sessionId: string) => Promise<SingularSessionData>;
68
- /**
69
- * - Send an arbitrary command via `POST`.
70
- */
71
- postCommand: (sessionId: string, cmdName: string, data?: CommandData, config?: AxiosRequestConfig) => Promise<ResponseData>;
72
- /**
73
- * - Send an arbitrary command via `GET`. Optional `sessionId`.
74
- */
75
- getCommand: (sessionIdOrCmdName: string, cmdNameOrConfig: string | AxiosRequestConfig, config?: AxiosRequestConfig) => Promise<ResponseData>;
76
- };
77
- //# sourceMappingURL=driver-e2e-suite.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"driver-e2e-suite.d.ts","sourceRoot":"","sources":["../../lib/driver-e2e-suite.js"],"names":[],"mappings":"AAUA;;;;;;;GAOG;AACH,sFAJW,MAAM,2EAmFhB;AAED;;;;;GAKG;AACH;;sBAyTC;;;;;oEAMY,OAAO,eAAe,EAAE,WAAW,CAAC,CAAC,CAAC;2BAItC,OAAO,eAAe,EAAE,YAAY;qBACpC,OAAO,eAAe,EAAE,MAAM;2BAC9B,OAAO,eAAe,EAAE,YAAY;oCACpC,OAAO,eAAe,EAAE,qBAAqB;iCAC7C,OAAO,OAAO,EAAE,kBAAkB;kCAClC,OAAO,eAAe,EAAE,mBAAmB;kCAK3C,OAAO,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC;;kBAKlC,OAAO,WAAW,EAAE,iBAAiB,CAAC,OAAO,eAAe,EAAE,eAAe,EAAE,YAAY,GAAC,aAAa,CAAC;;;;;;eAK1G,MAAM;kBACN,OAAO,eAAe,EAAE,YAAY;;;;;;;;;;mBASpC,MAAM;;;;yBACC,cAAc,WAAW,kBAAkB,KAAK,QAAQ,kBAAkB,CAAC;;;;4BACtE,MAAM,KAAK,QAAQ,cAAc;QAAC,KAAK,EAAE;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAC,QAAC;KAAC,EAAE;QAAC,cAAc,EAAE,IAAI,CAAA;KAAC,CAAC,CAAC;;;;4BACrF,MAAM,KAAK,QAAQ,mBAAmB,CAAC;;;;6BACvC,MAAM,WAAW,MAAM,SAAS,WAAW,WAAW,kBAAkB,KAAK,QAAQ,YAAY,CAAC;;;;qCACzF,MAAM,mBAAmB,MAAM,GAAC,kBAAkB,WAAW,kBAAkB,KAAK,QAAQ,YAAY,CAAC"}
@@ -1,389 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.createSessionHelpers = createSessionHelpers;
9
- exports.driverE2ETestSuite = driverE2ETestSuite;
10
-
11
- require("source-map-support/register");
12
-
13
- var _lodash = _interopRequireDefault(require("lodash"));
14
-
15
- var _driver = require("appium/driver");
16
-
17
- var _axios = _interopRequireDefault(require("axios"));
18
-
19
- var _bluebird = _interopRequireDefault(require("bluebird"));
20
-
21
- var _helpers = require("./helpers");
22
-
23
- var _chai = _interopRequireDefault(require("chai"));
24
-
25
- var _sinon = _interopRequireDefault(require("sinon"));
26
-
27
- const should = _chai.default.should();
28
-
29
- function createSessionHelpers(port, address = _helpers.TEST_HOST) {
30
- const createAppiumTestURL = (0, _helpers.createAppiumURL)(address, port);
31
- const createSessionURL = createAppiumTestURL(_lodash.default, '');
32
- const newSessionURL = createAppiumTestURL('', 'session');
33
- return {
34
- newSessionURL,
35
- createAppiumTestURL,
36
- postCommand: async (sessionId, cmdName, data = {}, config = {}) => {
37
- var _response$data;
38
-
39
- const url = createAppiumTestURL(sessionId, cmdName);
40
- const response = await _axios.default.post(url, data, config);
41
- return (_response$data = response.data) === null || _response$data === void 0 ? void 0 : _response$data.value;
42
- },
43
- getCommand: async (sessionIdOrCmdName, cmdNameOrConfig, config = {}) => {
44
- var _response$data2;
45
-
46
- if (!_lodash.default.isString(cmdNameOrConfig)) {
47
- config = cmdNameOrConfig;
48
- cmdNameOrConfig = sessionIdOrCmdName;
49
- sessionIdOrCmdName = '';
50
- }
51
-
52
- const response = await (0, _axios.default)({
53
- url: createAppiumTestURL(sessionIdOrCmdName, cmdNameOrConfig),
54
- validateStatus: null,
55
- ...config
56
- });
57
- return (_response$data2 = response.data) === null || _response$data2 === void 0 ? void 0 : _response$data2.value;
58
- },
59
- startSession: async (data, config = {}) => {
60
- var _response$data3;
61
-
62
- data = _lodash.default.defaultsDeep(data, {
63
- capabilities: {
64
- alwaysMatch: {},
65
- firstMatch: [{}]
66
- }
67
- });
68
- const response = await _axios.default.post(newSessionURL, data, config);
69
- return (_response$data3 = response.data) === null || _response$data3 === void 0 ? void 0 : _response$data3.value;
70
- },
71
- endSession: async sessionId => await _axios.default.delete(createSessionURL(sessionId), {
72
- validateStatus: null
73
- }),
74
- getSession: async sessionId => {
75
- var _response$data4;
76
-
77
- const response = await (0, _axios.default)({
78
- url: createSessionURL(sessionId),
79
- validateStatus: null
80
- });
81
- return (_response$data4 = response.data) === null || _response$data4 === void 0 ? void 0 : _response$data4.value;
82
- }
83
- };
84
- }
85
-
86
- function driverE2ETestSuite(DriverClass, defaultCaps = {}) {
87
- let address = defaultCaps['appium:address'] ?? _helpers.TEST_HOST;
88
- let port = defaultCaps['appium:port'];
89
- const className = DriverClass.name || '(unknown driver)';
90
- describe(`BaseDriver E2E (as ${className})`, function () {
91
- let baseServer;
92
- let d;
93
- let newSessionURL;
94
- let startSession;
95
- let getSession;
96
- let endSession;
97
- let getCommand;
98
- let postCommand;
99
- before(async function () {
100
- port = port ?? (await (0, _helpers.getTestPort)());
101
- defaultCaps = { ...defaultCaps,
102
- 'appium:port': port
103
- };
104
- d = new DriverClass({
105
- port,
106
- address
107
- });
108
- baseServer = await (0, _driver.server)({
109
- routeConfiguringFunction: (0, _driver.routeConfiguringFunction)(d),
110
- port,
111
- hostname: address,
112
- cliArgs: {}
113
- });
114
- ({
115
- startSession,
116
- getSession,
117
- endSession,
118
- newSessionURL,
119
- getCommand,
120
- postCommand
121
- } = createSessionHelpers(port, address));
122
- });
123
- after(async function () {
124
- await baseServer.close();
125
- });
126
- describe('session handling', function () {
127
- it('should handle idempotency while creating sessions', async function () {
128
- const sessionIds = [];
129
- let times = 0;
130
-
131
- do {
132
- const {
133
- sessionId
134
- } = await startSession({
135
- capabilities: {
136
- alwaysMatch: defaultCaps
137
- }
138
- }, {
139
- headers: {
140
- 'X-Idempotency-Key': '123456'
141
- },
142
- simple: false,
143
- resolveWithFullResponse: true
144
- });
145
- sessionIds.push(sessionId);
146
- times++;
147
- } while (times < 2);
148
-
149
- _lodash.default.uniq(sessionIds).length.should.equal(1);
150
-
151
- const {
152
- status,
153
- data
154
- } = await endSession(sessionIds[0]);
155
- status.should.equal(200);
156
- should.equal(data.value, null);
157
- });
158
- it('should handle idempotency while creating parallel sessions', async function () {
159
- const reqs = [];
160
- let times = 0;
161
-
162
- do {
163
- reqs.push(startSession({
164
- capabilities: {
165
- alwaysMatch: defaultCaps
166
- }
167
- }, {
168
- headers: {
169
- 'X-Idempotency-Key': '12345'
170
- }
171
- }));
172
- times++;
173
- } while (times < 2);
174
-
175
- const sessionIds = _lodash.default.map(await _bluebird.default.all(reqs), 'sessionId');
176
-
177
- _lodash.default.uniq(sessionIds).length.should.equal(1);
178
-
179
- const {
180
- status,
181
- data
182
- } = await endSession(sessionIds[0]);
183
- status.should.equal(200);
184
- should.equal(data.value, null);
185
- });
186
- it('should create session and retrieve a session id, then delete it', async function () {
187
- let {
188
- status,
189
- data
190
- } = await _axios.default.post(newSessionURL, {
191
- capabilities: {
192
- alwaysMatch: defaultCaps
193
- }
194
- });
195
- status.should.equal(200);
196
- should.exist(data.value.sessionId);
197
- data.value.capabilities.platformName.should.equal(defaultCaps.platformName);
198
- data.value.capabilities.deviceName.should.equal(defaultCaps['appium:deviceName']);
199
- ({
200
- status,
201
- data
202
- } = await endSession(d.sessionId));
203
- status.should.equal(200);
204
- should.equal(data.value, null);
205
- should.equal(d.sessionId, null);
206
- });
207
- });
208
- it.skip('should throw NYI for commands not implemented', async function () {});
209
- describe('command timeouts', function () {
210
- let originalFindElement, originalFindElements;
211
-
212
- async function startTimeoutSession(timeout) {
213
- const caps = _lodash.default.cloneDeep(defaultCaps);
214
-
215
- caps['appium:newCommandTimeout'] = timeout;
216
- return await startSession({
217
- capabilities: {
218
- alwaysMatch: caps
219
- }
220
- });
221
- }
222
-
223
- before(function () {
224
- originalFindElement = d.findElement;
225
-
226
- d.findElement = function () {
227
- return 'foo';
228
- }.bind(d);
229
-
230
- originalFindElements = d.findElements;
231
-
232
- d.findElements = async function () {
233
- await _bluebird.default.delay(200);
234
- return ['foo'];
235
- }.bind(d);
236
- });
237
- after(function () {
238
- d.findElement = originalFindElement;
239
- d.findElements = originalFindElements;
240
- });
241
- it('should set a default commandTimeout', async function () {
242
- let newSession = await startTimeoutSession();
243
- d.newCommandTimeoutMs.should.be.above(0);
244
- await endSession(newSession.sessionId);
245
- });
246
- it('should timeout on commands using commandTimeout cap', async function () {
247
- let newSession = await startTimeoutSession(0.25);
248
- const sessionId = d.sessionId;
249
- await postCommand(sessionId, 'element', {
250
- using: 'name',
251
- value: 'foo'
252
- });
253
- await _bluebird.default.delay(400);
254
- const value = await getSession(sessionId);
255
- should.equal(value.error, 'invalid session id');
256
- should.equal(d.sessionId, null);
257
- const resp = (await endSession(newSession.sessionId)).data.value;
258
- should.equal(resp === null || resp === void 0 ? void 0 : resp.error, 'invalid session id');
259
- });
260
- it('should not timeout with commandTimeout of false', async function () {
261
- let newSession = await startTimeoutSession(0.1);
262
- let start = Date.now();
263
- const value = await postCommand(d.sessionId, 'elements', {
264
- using: 'name',
265
- value: 'foo'
266
- });
267
- (Date.now() - start).should.be.above(150);
268
- value.should.eql(['foo']);
269
- await endSession(newSession.sessionId);
270
- });
271
- it('should not timeout with commandTimeout of 0', async function () {
272
- var _value$platformName;
273
-
274
- d.newCommandTimeoutMs = 2;
275
- let newSession = await startTimeoutSession(0);
276
- await postCommand(d.sessionId, 'element', {
277
- using: 'name',
278
- value: 'foo'
279
- });
280
- await _bluebird.default.delay(400);
281
- const value = await getSession(d.sessionId);
282
- (_value$platformName = value.platformName) === null || _value$platformName === void 0 ? void 0 : _value$platformName.should.equal(defaultCaps.platformName);
283
- const resp = (await endSession(newSession.sessionId)).data.value;
284
- should.equal(resp, null);
285
- d.newCommandTimeoutMs = 60 * 1000;
286
- });
287
- it('should not timeout if its just the command taking awhile', async function () {
288
- let newSession = await startTimeoutSession(0.25);
289
- const {
290
- sessionId
291
- } = d;
292
- await postCommand(d.sessionId, 'element', {
293
- using: 'name',
294
- value: 'foo'
295
- });
296
- await _bluebird.default.delay(400);
297
- const value = await getSession(sessionId);
298
- value.error.should.equal('invalid session id');
299
- should.equal(d.sessionId, null);
300
- const resp = (await endSession(newSession.sessionId)).data.value;
301
- resp.error.should.equal('invalid session id');
302
- });
303
- it('should not have a timer running before or after a session', async function () {
304
- should.not.exist(d.noCommandTimer);
305
- let newSession = await startTimeoutSession(0.25);
306
- newSession.sessionId.should.equal(d.sessionId);
307
- should.exist(d.noCommandTimer);
308
- await endSession(newSession.sessionId);
309
- should.not.exist(d.noCommandTimer);
310
- });
311
- });
312
- describe('settings api', function () {
313
- before(function () {
314
- d.settings = new _driver.DeviceSettings({
315
- ignoreUnimportantViews: false
316
- });
317
- });
318
- it('should be able to get settings object', function () {
319
- d.settings.getSettings().ignoreUnimportantViews.should.be.false;
320
- });
321
- it('should not reject when `updateSettings` method is not provided', async function () {
322
- await d.settings.update({
323
- ignoreUnimportantViews: true
324
- }).should.not.be.rejected;
325
- });
326
- it('should reject for invalid update object', async function () {
327
- await d.settings.update('invalid json').should.be.rejectedWith('JSON');
328
- });
329
- });
330
- describe('unexpected exits', function () {
331
- let sandbox;
332
- beforeEach(function () {
333
- sandbox = _sinon.default.createSandbox();
334
- });
335
- afterEach(function () {
336
- sandbox.restore();
337
- });
338
- it('should reject a current command when the driver crashes', async function () {
339
- sandbox.stub(d, 'getStatus').callsFake(async function () {
340
- await _bluebird.default.delay(5000);
341
- });
342
- const reqPromise = getCommand('status', {
343
- validateStatus: null
344
- });
345
- await _bluebird.default.delay(100);
346
- const shutdownEventPromise = new _bluebird.default((resolve, reject) => {
347
- setTimeout(() => reject(new Error('onUnexpectedShutdown event is expected to be fired within 5 seconds timeout')), 5000);
348
- d.onUnexpectedShutdown(resolve);
349
- });
350
- d.startUnexpectedShutdown(new Error('Crashytimes'));
351
- const value = await reqPromise;
352
- value.message.should.contain('Crashytimes');
353
- await shutdownEventPromise;
354
- });
355
- });
356
- describe('event timings', function () {
357
- it('should not add timings if not using opt-in cap', async function () {
358
- const session = await startSession({
359
- capabilities: {
360
- alwaysMatch: defaultCaps
361
- }
362
- });
363
- const res = await getSession(session.sessionId);
364
- should.not.exist(res.events);
365
- await endSession(session.sessionId);
366
- });
367
- it('should add start session timings', async function () {
368
- var _res$events, _res$events2, _res$events3, _res$events4;
369
-
370
- const caps = { ...defaultCaps,
371
- 'appium:eventTimings': true
372
- };
373
- const session = await startSession({
374
- capabilities: {
375
- alwaysMatch: caps
376
- }
377
- });
378
- const res = await getSession(session.sessionId);
379
- should.exist(res.events);
380
- should.exist((_res$events = res.events) === null || _res$events === void 0 ? void 0 : _res$events.newSessionRequested);
381
- should.exist((_res$events2 = res.events) === null || _res$events2 === void 0 ? void 0 : _res$events2.newSessionStarted);
382
- (_res$events3 = res.events) === null || _res$events3 === void 0 ? void 0 : _res$events3.newSessionRequested[0].should.be.a('number');
383
- (_res$events4 = res.events) === null || _res$events4 === void 0 ? void 0 : _res$events4.newSessionStarted[0].should.be.a('number');
384
- await endSession(session.sessionId);
385
- });
386
- });
387
- });
388
- }
389
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJzaG91bGQiLCJjaGFpIiwiY3JlYXRlU2Vzc2lvbkhlbHBlcnMiLCJwb3J0IiwiYWRkcmVzcyIsIlRFU1RfSE9TVCIsImNyZWF0ZUFwcGl1bVRlc3RVUkwiLCJjcmVhdGVBcHBpdW1VUkwiLCJjcmVhdGVTZXNzaW9uVVJMIiwiXyIsIm5ld1Nlc3Npb25VUkwiLCJwb3N0Q29tbWFuZCIsInNlc3Npb25JZCIsImNtZE5hbWUiLCJkYXRhIiwiY29uZmlnIiwidXJsIiwicmVzcG9uc2UiLCJheGlvcyIsInBvc3QiLCJ2YWx1ZSIsImdldENvbW1hbmQiLCJzZXNzaW9uSWRPckNtZE5hbWUiLCJjbWROYW1lT3JDb25maWciLCJpc1N0cmluZyIsInZhbGlkYXRlU3RhdHVzIiwic3RhcnRTZXNzaW9uIiwiZGVmYXVsdHNEZWVwIiwiY2FwYWJpbGl0aWVzIiwiYWx3YXlzTWF0Y2giLCJmaXJzdE1hdGNoIiwiZW5kU2Vzc2lvbiIsImRlbGV0ZSIsImdldFNlc3Npb24iLCJkcml2ZXJFMkVUZXN0U3VpdGUiLCJEcml2ZXJDbGFzcyIsImRlZmF1bHRDYXBzIiwiY2xhc3NOYW1lIiwibmFtZSIsImRlc2NyaWJlIiwiYmFzZVNlcnZlciIsImQiLCJiZWZvcmUiLCJnZXRUZXN0UG9ydCIsInNlcnZlciIsInJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiIsImhvc3RuYW1lIiwiY2xpQXJncyIsImFmdGVyIiwiY2xvc2UiLCJpdCIsInNlc3Npb25JZHMiLCJ0aW1lcyIsImhlYWRlcnMiLCJzaW1wbGUiLCJyZXNvbHZlV2l0aEZ1bGxSZXNwb25zZSIsInB1c2giLCJ1bmlxIiwibGVuZ3RoIiwiZXF1YWwiLCJzdGF0dXMiLCJyZXFzIiwibWFwIiwiQiIsImFsbCIsImV4aXN0IiwicGxhdGZvcm1OYW1lIiwiZGV2aWNlTmFtZSIsInNraXAiLCJvcmlnaW5hbEZpbmRFbGVtZW50Iiwib3JpZ2luYWxGaW5kRWxlbWVudHMiLCJzdGFydFRpbWVvdXRTZXNzaW9uIiwidGltZW91dCIsImNhcHMiLCJjbG9uZURlZXAiLCJmaW5kRWxlbWVudCIsImJpbmQiLCJmaW5kRWxlbWVudHMiLCJkZWxheSIsIm5ld1Nlc3Npb24iLCJuZXdDb21tYW5kVGltZW91dE1zIiwiYmUiLCJhYm92ZSIsInVzaW5nIiwiZXJyb3IiLCJyZXNwIiwic3RhcnQiLCJEYXRlIiwibm93IiwiZXFsIiwibm90Iiwibm9Db21tYW5kVGltZXIiLCJzZXR0aW5ncyIsIkRldmljZVNldHRpbmdzIiwiaWdub3JlVW5pbXBvcnRhbnRWaWV3cyIsImdldFNldHRpbmdzIiwiZmFsc2UiLCJ1cGRhdGUiLCJyZWplY3RlZCIsInJlamVjdGVkV2l0aCIsInNhbmRib3giLCJiZWZvcmVFYWNoIiwic2lub24iLCJjcmVhdGVTYW5kYm94IiwiYWZ0ZXJFYWNoIiwicmVzdG9yZSIsInN0dWIiLCJjYWxsc0Zha2UiLCJyZXFQcm9taXNlIiwic2h1dGRvd25FdmVudFByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0Iiwic2V0VGltZW91dCIsIkVycm9yIiwib25VbmV4cGVjdGVkU2h1dGRvd24iLCJzdGFydFVuZXhwZWN0ZWRTaHV0ZG93biIsIm1lc3NhZ2UiLCJjb250YWluIiwic2Vzc2lvbiIsInJlcyIsImV2ZW50cyIsIm5ld1Nlc3Npb25SZXF1ZXN0ZWQiLCJuZXdTZXNzaW9uU3RhcnRlZCIsImEiXSwic291cmNlcyI6WyIuLi8uLi9saWIvZHJpdmVyLWUyZS1zdWl0ZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtzZXJ2ZXIsIHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiwgRGV2aWNlU2V0dGluZ3N9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7VEVTVF9IT1NULCBnZXRUZXN0UG9ydCwgY3JlYXRlQXBwaXVtVVJMfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IGNoYWkgZnJvbSAnY2hhaSc7XG5pbXBvcnQgc2lub24gZnJvbSAnc2lub24nO1xuXG5jb25zdCBzaG91bGQgPSBjaGFpLnNob3VsZCgpO1xuXG4vKipcbiAqIENyZWF0ZXMgc29tZSBoZWxwZXIgZnVuY3Rpb25zIGZvciBFMkUgdGVzdHMgdG8gbWFuYWdlIHNlc3Npb25zLlxuICogQHRlbXBsYXRlIFtDb21tYW5kRGF0YT11bmtub3duXVxuICogQHRlbXBsYXRlIFtSZXNwb25zZURhdGE9YW55XVxuICogQHBhcmFtIHtudW1iZXJ9IHBvcnQgLSBQb3J0IG9uIHdoaWNoIHRoZSBzZXJ2ZXIgaXMgcnVubmluZy4gVHlwaWNhbGx5IHRoaXMgd2lsbCBiZSByZXRyaWV2ZWQgdmlhIGBnZXQtcG9ydGAgYmVmb3JlaGFuZFxuICogQHBhcmFtIHtzdHJpbmd9IFthZGRyZXNzXSAtIEFkZHJlc3MvaG9zdCBvbiB3aGljaCB0aGUgc2VydmVyIGlzIHJ1bm5pbmcuIERlZmF1bHRzIHRvIHtAbGlua2NvZGUgVEVTVF9IT1NUfVxuICogQHJldHVybnMge1Nlc3Npb25IZWxwZXJzPENvbW1hbmREYXRhLCBSZXNwb25zZURhdGE+fVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2Vzc2lvbkhlbHBlcnMocG9ydCwgYWRkcmVzcyA9IFRFU1RfSE9TVCkge1xuICBjb25zdCBjcmVhdGVBcHBpdW1UZXN0VVJMID1cbiAgICAvKiogQHR5cGUge2ltcG9ydCgnbG9kYXNoJykuQ3VycmllZEZ1bmN0aW9uMjxzdHJpbmcsc3RyaW5nLHN0cmluZz59ICovIChcbiAgICAgIGNyZWF0ZUFwcGl1bVVSTChhZGRyZXNzLCBwb3J0KVxuICAgICk7XG5cbiAgY29uc3QgY3JlYXRlU2Vzc2lvblVSTCA9IGNyZWF0ZUFwcGl1bVRlc3RVUkwoXywgJycpO1xuICBjb25zdCBuZXdTZXNzaW9uVVJMID0gY3JlYXRlQXBwaXVtVGVzdFVSTCgnJywgJ3Nlc3Npb24nKTtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7U2Vzc2lvbkhlbHBlcnM8Q29tbWFuZERhdGEsIFJlc3BvbnNlRGF0YT59ICovICh7XG4gICAgbmV3U2Vzc2lvblVSTCxcbiAgICBjcmVhdGVBcHBpdW1UZXN0VVJMLFxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlc3Npb25JZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjbWROYW1lXG4gICAgICogQHBhcmFtIHthbnl9IFtkYXRhXVxuICAgICAqIEBwYXJhbSB7QXhpb3NSZXF1ZXN0Q29uZmlnfSBbY29uZmlnXVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAgICovXG4gICAgcG9zdENvbW1hbmQ6IGFzeW5jIChzZXNzaW9uSWQsIGNtZE5hbWUsIGRhdGEgPSB7fSwgY29uZmlnID0ge30pID0+IHtcbiAgICAgIGNvbnN0IHVybCA9IGNyZWF0ZUFwcGl1bVRlc3RVUkwoc2Vzc2lvbklkLCBjbWROYW1lKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3MucG9zdCh1cmwsIGRhdGEsIGNvbmZpZyk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YT8udmFsdWU7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZXNzaW9uSWRPckNtZE5hbWVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xBeGlvc1JlcXVlc3RDb25maWd9IGNtZE5hbWVPckNvbmZpZ1xuICAgICAqIEBwYXJhbSB7QXhpb3NSZXF1ZXN0Q29uZmlnfSBbY29uZmlnXVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAgICovXG4gICAgZ2V0Q29tbWFuZDogYXN5bmMgKHNlc3Npb25JZE9yQ21kTmFtZSwgY21kTmFtZU9yQ29uZmlnLCBjb25maWcgPSB7fSkgPT4ge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKGNtZE5hbWVPckNvbmZpZykpIHtcbiAgICAgICAgY29uZmlnID0gY21kTmFtZU9yQ29uZmlnO1xuICAgICAgICBjbWROYW1lT3JDb25maWcgPSBzZXNzaW9uSWRPckNtZE5hbWU7XG4gICAgICAgIHNlc3Npb25JZE9yQ21kTmFtZSA9ICcnO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvcyh7XG4gICAgICAgIHVybDogY3JlYXRlQXBwaXVtVGVzdFVSTChzZXNzaW9uSWRPckNtZE5hbWUsIGNtZE5hbWVPckNvbmZpZyksXG4gICAgICAgIHZhbGlkYXRlU3RhdHVzOiBudWxsLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhPy52YWx1ZTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtOZXdTZXNzaW9uRGF0YX0gZGF0YVxuICAgICAqIEBwYXJhbSB7QXhpb3NSZXF1ZXN0Q29uZmlnfSBbY29uZmlnXVxuICAgICAqL1xuICAgIHN0YXJ0U2Vzc2lvbjogYXN5bmMgKGRhdGEsIGNvbmZpZyA9IHt9KSA9PiB7XG4gICAgICBkYXRhID0gXy5kZWZhdWx0c0RlZXAoZGF0YSwge1xuICAgICAgICBjYXBhYmlsaXRpZXM6IHtcbiAgICAgICAgICBhbHdheXNNYXRjaDoge30sXG4gICAgICAgICAgZmlyc3RNYXRjaDogW3t9XSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvcy5wb3N0KG5ld1Nlc3Npb25VUkwsIGRhdGEsIGNvbmZpZyk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YT8udmFsdWU7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZXNzaW9uSWRcbiAgICAgKi9cbiAgICBlbmRTZXNzaW9uOiBhc3luYyAoc2Vzc2lvbklkKSA9PlxuICAgICAgYXdhaXQgYXhpb3MuZGVsZXRlKGNyZWF0ZVNlc3Npb25VUkwoc2Vzc2lvbklkKSwge1xuICAgICAgICB2YWxpZGF0ZVN0YXR1czogbnVsbCxcbiAgICAgIH0pLFxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZXNzaW9uSWRcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgICAqL1xuICAgIGdldFNlc3Npb246IGFzeW5jIChzZXNzaW9uSWQpID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3Moe1xuICAgICAgICB1cmw6IGNyZWF0ZVNlc3Npb25VUkwoc2Vzc2lvbklkKSxcbiAgICAgICAgdmFsaWRhdGVTdGF0dXM6IG51bGwsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhPy52YWx1ZTtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIEUyRSB0ZXN0IHN1aXRlcyBmb3IgYSBkcml2ZXIuXG4gKiBAdGVtcGxhdGUge0RyaXZlcn0gUFxuICogQHBhcmFtIHtEcml2ZXJDbGFzczxQPn0gRHJpdmVyQ2xhc3NcbiAqIEBwYXJhbSB7QXBwaXVtVzNDQ2FwYWJpbGl0aWVzfSBbZGVmYXVsdENhcHNdXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkcml2ZXJFMkVUZXN0U3VpdGUoRHJpdmVyQ2xhc3MsIGRlZmF1bHRDYXBzID0ge30pIHtcbiAgbGV0IGFkZHJlc3MgPSBkZWZhdWx0Q2Fwc1snYXBwaXVtOmFkZHJlc3MnXSA/PyBURVNUX0hPU1Q7XG4gIGxldCBwb3J0ID0gZGVmYXVsdENhcHNbJ2FwcGl1bTpwb3J0J107XG4gIGNvbnN0IGNsYXNzTmFtZSA9IERyaXZlckNsYXNzLm5hbWUgfHwgJyh1bmtub3duIGRyaXZlciknO1xuXG4gIGRlc2NyaWJlKGBCYXNlRHJpdmVyIEUyRSAoYXMgJHtjbGFzc05hbWV9KWAsIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgYmFzZVNlcnZlcjtcbiAgICAvKiogQHR5cGUge1B9ICovXG4gICAgbGV0IGQ7XG4gICAgLyoqXG4gICAgICogVGhpcyBVUkwgY3JlYXRlcyBhIG5ldyBzZXNzaW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiovXG4gICAgbGV0IG5ld1Nlc3Npb25VUkw7XG5cbiAgICAvKiogQHR5cGUge1Nlc3Npb25IZWxwZXJzWydzdGFydFNlc3Npb24nXX0gKi9cbiAgICBsZXQgc3RhcnRTZXNzaW9uO1xuICAgIC8qKiBAdHlwZSB7U2Vzc2lvbkhlbHBlcnNbJ2dldFNlc3Npb24nXX0gKi9cbiAgICBsZXQgZ2V0U2Vzc2lvbjtcbiAgICAvKiogQHR5cGUge1Nlc3Npb25IZWxwZXJzWydlbmRTZXNzaW9uJ119ICovXG4gICAgbGV0IGVuZFNlc3Npb247XG4gICAgLyoqIEB0eXBlIHtTZXNzaW9uSGVscGVyc1snZ2V0Q29tbWFuZCddfSAqL1xuICAgIGxldCBnZXRDb21tYW5kO1xuICAgIC8qKiBAdHlwZSB7U2Vzc2lvbkhlbHBlcnNbJ3Bvc3RDb21tYW5kJ119ICovXG4gICAgbGV0IHBvc3RDb21tYW5kO1xuICAgIGJlZm9yZShhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBwb3J0ID0gcG9ydCA/PyAoYXdhaXQgZ2V0VGVzdFBvcnQoKSk7XG4gICAgICBkZWZhdWx0Q2FwcyA9IHsuLi5kZWZhdWx0Q2FwcywgJ2FwcGl1bTpwb3J0JzogcG9ydH07XG4gICAgICBkID0gbmV3IERyaXZlckNsYXNzKHtwb3J0LCBhZGRyZXNzfSk7XG4gICAgICBiYXNlU2VydmVyID0gYXdhaXQgc2VydmVyKHtcbiAgICAgICAgcm91dGVDb25maWd1cmluZ0Z1bmN0aW9uOiByb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb24oZCksXG4gICAgICAgIHBvcnQsXG4gICAgICAgIGhvc3RuYW1lOiBhZGRyZXNzLFxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgIGNsaUFyZ3M6IHt9LFxuICAgICAgfSk7XG4gICAgICAoe3N0YXJ0U2Vzc2lvbiwgZ2V0U2Vzc2lvbiwgZW5kU2Vzc2lvbiwgbmV3U2Vzc2lvblVSTCwgZ2V0Q29tbWFuZCwgcG9zdENvbW1hbmR9ID1cbiAgICAgICAgY3JlYXRlU2Vzc2lvbkhlbHBlcnMocG9ydCwgYWRkcmVzcykpO1xuICAgIH0pO1xuXG4gICAgYWZ0ZXIoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgYmFzZVNlcnZlci5jbG9zZSgpO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3Nlc3Npb24gaGFuZGxpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIGhhbmRsZSBpZGVtcG90ZW5jeSB3aGlsZSBjcmVhdGluZyBzZXNzaW9ucycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgc2Vzc2lvbklkcyA9IFtdO1xuICAgICAgICBsZXQgdGltZXMgPSAwO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgY29uc3Qge3Nlc3Npb25JZH0gPSBhd2FpdCBzdGFydFNlc3Npb24oXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNhcGFiaWxpdGllczoge2Fsd2F5c01hdGNoOiBkZWZhdWx0Q2Fwc30sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgJ1gtSWRlbXBvdGVuY3ktS2V5JzogJzEyMzQ1NicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIC8vIFhYWDogSSdtIG5vdCBzdXJlIHdoYXQgdGhlc2UgYXJlLCBhcyB0aGV5IGFyZSBub3QgZG9jdW1lbnRlZCBheGlvcyBvcHRpb25zLFxuICAgICAgICAgICAgICAvLyBub3IgYXJlIHRoZXkgbWVudGlvbmVkIGluIG91ciBzb3VyY2VcbiAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgICBzaW1wbGU6IGZhbHNlLFxuICAgICAgICAgICAgICByZXNvbHZlV2l0aEZ1bGxSZXNwb25zZTogdHJ1ZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuXG4gICAgICAgICAgc2Vzc2lvbklkcy5wdXNoKHNlc3Npb25JZCk7XG4gICAgICAgICAgdGltZXMrKztcbiAgICAgICAgfSB3aGlsZSAodGltZXMgPCAyKTtcbiAgICAgICAgXy51bmlxKHNlc3Npb25JZHMpLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG5cbiAgICAgICAgY29uc3Qge3N0YXR1cywgZGF0YX0gPSBhd2FpdCBlbmRTZXNzaW9uKHNlc3Npb25JZHNbMF0pO1xuICAgICAgICBzdGF0dXMuc2hvdWxkLmVxdWFsKDIwMCk7XG4gICAgICAgIHNob3VsZC5lcXVhbChkYXRhLnZhbHVlLCBudWxsKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGhhbmRsZSBpZGVtcG90ZW5jeSB3aGlsZSBjcmVhdGluZyBwYXJhbGxlbCBzZXNzaW9ucycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgcmVxcyA9IFtdO1xuICAgICAgICBsZXQgdGltZXMgPSAwO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgcmVxcy5wdXNoKFxuICAgICAgICAgICAgc3RhcnRTZXNzaW9uKFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICAgICAgICAgICAgICBhbHdheXNNYXRjaDogZGVmYXVsdENhcHMsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICdYLUlkZW1wb3RlbmN5LUtleSc6ICcxMjM0NScsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgICAgdGltZXMrKztcbiAgICAgICAgfSB3aGlsZSAodGltZXMgPCAyKTtcbiAgICAgICAgY29uc3Qgc2Vzc2lvbklkcyA9IF8ubWFwKGF3YWl0IEIuYWxsKHJlcXMpLCAnc2Vzc2lvbklkJyk7XG4gICAgICAgIF8udW5pcShzZXNzaW9uSWRzKS5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuXG4gICAgICAgIGNvbnN0IHtzdGF0dXMsIGRhdGF9ID0gYXdhaXQgZW5kU2Vzc2lvbihzZXNzaW9uSWRzWzBdKTtcbiAgICAgICAgc3RhdHVzLnNob3VsZC5lcXVhbCgyMDApO1xuICAgICAgICBzaG91bGQuZXF1YWwoZGF0YS52YWx1ZSwgbnVsbCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBjcmVhdGUgc2Vzc2lvbiBhbmQgcmV0cmlldmUgYSBzZXNzaW9uIGlkLCB0aGVuIGRlbGV0ZSBpdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IHtzdGF0dXMsIGRhdGF9ID0gYXdhaXQgYXhpb3MucG9zdChuZXdTZXNzaW9uVVJMLCB7XG4gICAgICAgICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICAgICAgICBhbHdheXNNYXRjaDogZGVmYXVsdENhcHMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc3RhdHVzLnNob3VsZC5lcXVhbCgyMDApO1xuICAgICAgICBzaG91bGQuZXhpc3QoZGF0YS52YWx1ZS5zZXNzaW9uSWQpO1xuICAgICAgICBkYXRhLnZhbHVlLmNhcGFiaWxpdGllcy5wbGF0Zm9ybU5hbWUuc2hvdWxkLmVxdWFsKGRlZmF1bHRDYXBzLnBsYXRmb3JtTmFtZSk7XG4gICAgICAgIGRhdGEudmFsdWUuY2FwYWJpbGl0aWVzLmRldmljZU5hbWUuc2hvdWxkLmVxdWFsKGRlZmF1bHRDYXBzWydhcHBpdW06ZGV2aWNlTmFtZSddKTtcblxuICAgICAgICAoe3N0YXR1cywgZGF0YX0gPSBhd2FpdCBlbmRTZXNzaW9uKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZC5zZXNzaW9uSWQpKSk7XG5cbiAgICAgICAgc3RhdHVzLnNob3VsZC5lcXVhbCgyMDApO1xuICAgICAgICBzaG91bGQuZXF1YWwoZGF0YS52YWx1ZSwgbnVsbCk7XG4gICAgICAgIHNob3VsZC5lcXVhbChkLnNlc3Npb25JZCwgbnVsbCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0LnNraXAoJ3Nob3VsZCB0aHJvdyBOWUkgZm9yIGNvbW1hbmRzIG5vdCBpbXBsZW1lbnRlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHt9KTtcblxuICAgIGRlc2NyaWJlKCdjb21tYW5kIHRpbWVvdXRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IG9yaWdpbmFsRmluZEVsZW1lbnQsIG9yaWdpbmFsRmluZEVsZW1lbnRzO1xuXG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbdGltZW91dF1cbiAgICAgICAqL1xuICAgICAgYXN5bmMgZnVuY3Rpb24gc3RhcnRUaW1lb3V0U2Vzc2lvbih0aW1lb3V0KSB7XG4gICAgICAgIGNvbnN0IGNhcHMgPSBfLmNsb25lRGVlcChkZWZhdWx0Q2Fwcyk7XG4gICAgICAgIGNhcHNbJ2FwcGl1bTpuZXdDb21tYW5kVGltZW91dCddID0gdGltZW91dDtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHN0YXJ0U2Vzc2lvbih7Y2FwYWJpbGl0aWVzOiB7YWx3YXlzTWF0Y2g6IGNhcHN9fSk7XG4gICAgICB9XG5cbiAgICAgIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIG9yaWdpbmFsRmluZEVsZW1lbnQgPSBkLmZpbmRFbGVtZW50O1xuICAgICAgICBkLmZpbmRFbGVtZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiAnZm9vJztcbiAgICAgICAgfS5iaW5kKGQpO1xuXG4gICAgICAgIG9yaWdpbmFsRmluZEVsZW1lbnRzID0gZC5maW5kRWxlbWVudHM7XG4gICAgICAgIGQuZmluZEVsZW1lbnRzID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGF3YWl0IEIuZGVsYXkoMjAwKTtcbiAgICAgICAgICByZXR1cm4gWydmb28nXTtcbiAgICAgICAgfS5iaW5kKGQpO1xuICAgICAgfSk7XG5cbiAgICAgIGFmdGVyKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZC5maW5kRWxlbWVudCA9IG9yaWdpbmFsRmluZEVsZW1lbnQ7XG4gICAgICAgIGQuZmluZEVsZW1lbnRzID0gb3JpZ2luYWxGaW5kRWxlbWVudHM7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBzZXQgYSBkZWZhdWx0IGNvbW1hbmRUaW1lb3V0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgbmV3U2Vzc2lvbiA9IGF3YWl0IHN0YXJ0VGltZW91dFNlc3Npb24oKTtcbiAgICAgICAgZC5uZXdDb21tYW5kVGltZW91dE1zLnNob3VsZC5iZS5hYm92ZSgwKTtcbiAgICAgICAgYXdhaXQgZW5kU2Vzc2lvbihuZXdTZXNzaW9uLnNlc3Npb25JZCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCB0aW1lb3V0IG9uIGNvbW1hbmRzIHVzaW5nIGNvbW1hbmRUaW1lb3V0IGNhcCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IG5ld1Nlc3Npb24gPSBhd2FpdCBzdGFydFRpbWVvdXRTZXNzaW9uKDAuMjUpO1xuICAgICAgICBjb25zdCBzZXNzaW9uSWQgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKGQuc2Vzc2lvbklkKTtcbiAgICAgICAgYXdhaXQgcG9zdENvbW1hbmQoc2Vzc2lvbklkLCAnZWxlbWVudCcsIHtcbiAgICAgICAgICB1c2luZzogJ25hbWUnLFxuICAgICAgICAgIHZhbHVlOiAnZm9vJyxcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IEIuZGVsYXkoNDAwKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBnZXRTZXNzaW9uKHNlc3Npb25JZCk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh2YWx1ZS5lcnJvciwgJ2ludmFsaWQgc2Vzc2lvbiBpZCcpO1xuICAgICAgICBzaG91bGQuZXF1YWwoZC5zZXNzaW9uSWQsIG51bGwpO1xuICAgICAgICBjb25zdCByZXNwID0gKGF3YWl0IGVuZFNlc3Npb24obmV3U2Vzc2lvbi5zZXNzaW9uSWQpKS5kYXRhLnZhbHVlO1xuICAgICAgICBzaG91bGQuZXF1YWwocmVzcD8uZXJyb3IsICdpbnZhbGlkIHNlc3Npb24gaWQnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIG5vdCB0aW1lb3V0IHdpdGggY29tbWFuZFRpbWVvdXQgb2YgZmFsc2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBuZXdTZXNzaW9uID0gYXdhaXQgc3RhcnRUaW1lb3V0U2Vzc2lvbigwLjEpO1xuICAgICAgICBsZXQgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHBvc3RDb21tYW5kKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZC5zZXNzaW9uSWQpLCAnZWxlbWVudHMnLCB7XG4gICAgICAgICAgdXNpbmc6ICduYW1lJyxcbiAgICAgICAgICB2YWx1ZTogJ2ZvbycsXG4gICAgICAgIH0pO1xuICAgICAgICAoRGF0ZS5ub3coKSAtIHN0YXJ0KS5zaG91bGQuYmUuYWJvdmUoMTUwKTtcbiAgICAgICAgdmFsdWUuc2hvdWxkLmVxbChbJ2ZvbyddKTtcbiAgICAgICAgYXdhaXQgZW5kU2Vzc2lvbihuZXdTZXNzaW9uLnNlc3Npb25JZCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBub3QgdGltZW91dCB3aXRoIGNvbW1hbmRUaW1lb3V0IG9mIDAnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGQubmV3Q29tbWFuZFRpbWVvdXRNcyA9IDI7XG4gICAgICAgIGxldCBuZXdTZXNzaW9uID0gYXdhaXQgc3RhcnRUaW1lb3V0U2Vzc2lvbigwKTtcblxuICAgICAgICBhd2FpdCBwb3N0Q29tbWFuZCgvKiogQHR5cGUge3N0cmluZ30gKi8gKGQuc2Vzc2lvbklkKSwgJ2VsZW1lbnQnLCB7XG4gICAgICAgICAgdXNpbmc6ICduYW1lJyxcbiAgICAgICAgICB2YWx1ZTogJ2ZvbycsXG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCBCLmRlbGF5KDQwMCk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgZ2V0U2Vzc2lvbigvKiogQHR5cGUge3N0cmluZ30gKi8gKGQuc2Vzc2lvbklkKSk7XG4gICAgICAgIHZhbHVlLnBsYXRmb3JtTmFtZT8uc2hvdWxkLmVxdWFsKGRlZmF1bHRDYXBzLnBsYXRmb3JtTmFtZSk7XG4gICAgICAgIGNvbnN0IHJlc3AgPSAoYXdhaXQgZW5kU2Vzc2lvbihuZXdTZXNzaW9uLnNlc3Npb25JZCkpLmRhdGEudmFsdWU7XG4gICAgICAgIHNob3VsZC5lcXVhbChyZXNwLCBudWxsKTtcblxuICAgICAgICBkLm5ld0NvbW1hbmRUaW1lb3V0TXMgPSA2MCAqIDEwMDA7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBub3QgdGltZW91dCBpZiBpdHMganVzdCB0aGUgY29tbWFuZCB0YWtpbmcgYXdoaWxlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgbmV3U2Vzc2lvbiA9IGF3YWl0IHN0YXJ0VGltZW91dFNlc3Npb24oMC4yNSk7XG4gICAgICAgIC8vIFhYWDogcmFjZSBjb25kaXRpb246IHdlIG11c3QgYnVpbGQgdGhpcyBVUkwgYmVmb3JlIC4uLnNvbWV0aGluZyBoYXBwZW5zLi4uXG4gICAgICAgIC8vIHdoaWNoIGNhdXNlcyBgZC5zZXNzaW9uSWRgIHRvIGJlIG1pc3NpbmdcbiAgICAgICAgY29uc3Qge3Nlc3Npb25JZH0gPSBkO1xuXG4gICAgICAgIGF3YWl0IHBvc3RDb21tYW5kKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZC5zZXNzaW9uSWQpLCAnZWxlbWVudCcsIHtcbiAgICAgICAgICB1c2luZzogJ25hbWUnLFxuICAgICAgICAgIHZhbHVlOiAnZm9vJyxcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IEIuZGVsYXkoNDAwKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBnZXRTZXNzaW9uKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoc2Vzc2lvbklkKSk7XG4gICAgICAgIHZhbHVlLmVycm9yLnNob3VsZC5lcXVhbCgnaW52YWxpZCBzZXNzaW9uIGlkJyk7XG4gICAgICAgIHNob3VsZC5lcXVhbChkLnNlc3Npb25JZCwgbnVsbCk7XG4gICAgICAgIGNvbnN0IHJlc3AgPSAoYXdhaXQgZW5kU2Vzc2lvbihuZXdTZXNzaW9uLnNlc3Npb25JZCkpLmRhdGEudmFsdWU7XG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoLyoqIEB0eXBlIHsge2Vycm9yOiBzdHJpbmd9IH0gKi8gKHJlc3ApLmVycm9yKS5zaG91bGQuZXF1YWwoXG4gICAgICAgICAgJ2ludmFsaWQgc2Vzc2lvbiBpZCdcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIG5vdCBoYXZlIGEgdGltZXIgcnVubmluZyBiZWZvcmUgb3IgYWZ0ZXIgYSBzZXNzaW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgIHNob3VsZC5ub3QuZXhpc3QoZC5ub0NvbW1hbmRUaW1lcik7XG4gICAgICAgIGxldCBuZXdTZXNzaW9uID0gYXdhaXQgc3RhcnRUaW1lb3V0U2Vzc2lvbigwLjI1KTtcbiAgICAgICAgbmV3U2Vzc2lvbi5zZXNzaW9uSWQuc2hvdWxkLmVxdWFsKGQuc2Vzc2lvbklkKTtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICBzaG91bGQuZXhpc3QoZC5ub0NvbW1hbmRUaW1lcik7XG4gICAgICAgIGF3YWl0IGVuZFNlc3Npb24obmV3U2Vzc2lvbi5zZXNzaW9uSWQpO1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgIHNob3VsZC5ub3QuZXhpc3QoZC5ub0NvbW1hbmRUaW1lcik7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdzZXR0aW5ncyBhcGknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgICAgICBkLnNldHRpbmdzID0gbmV3IERldmljZVNldHRpbmdzKHtpZ25vcmVVbmltcG9ydGFudFZpZXdzOiBmYWxzZX0pO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIGJlIGFibGUgdG8gZ2V0IHNldHRpbmdzIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZC5zZXR0aW5ncy5nZXRTZXR0aW5ncygpLmlnbm9yZVVuaW1wb3J0YW50Vmlld3Muc2hvdWxkLmJlLmZhbHNlO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIG5vdCByZWplY3Qgd2hlbiBgdXBkYXRlU2V0dGluZ3NgIG1ldGhvZCBpcyBub3QgcHJvdmlkZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGF3YWl0IGQuc2V0dGluZ3MudXBkYXRlKHtpZ25vcmVVbmltcG9ydGFudFZpZXdzOiB0cnVlfSkuc2hvdWxkLm5vdC5iZS5yZWplY3RlZDtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCByZWplY3QgZm9yIGludmFsaWQgdXBkYXRlIG9iamVjdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYXdhaXQgZC5zZXR0aW5nc1xuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAudXBkYXRlKCdpbnZhbGlkIGpzb24nKVxuICAgICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdKU09OJyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd1bmV4cGVjdGVkIGV4aXRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoJ3Npbm9uJykuU2lub25TYW5kYm94fSAqL1xuICAgICAgbGV0IHNhbmRib3g7XG4gICAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2FuZGJveCA9IHNpbm9uLmNyZWF0ZVNhbmRib3goKTtcbiAgICAgIH0pO1xuXG4gICAgICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICBzYW5kYm94LnJlc3RvcmUoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHJlamVjdCBhIGN1cnJlbnQgY29tbWFuZCB3aGVuIHRoZSBkcml2ZXIgY3Jhc2hlcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2FuZGJveC5zdHViKGQsICdnZXRTdGF0dXMnKS5jYWxsc0Zha2UoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGF3YWl0IEIuZGVsYXkoNTAwMCk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCByZXFQcm9taXNlID0gZ2V0Q29tbWFuZCgnc3RhdHVzJywge3ZhbGlkYXRlU3RhdHVzOiBudWxsfSk7XG4gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoZSByZXF1ZXN0IGdldHMgdG8gdGhlIHNlcnZlciBiZWZvcmUgb3VyIHNodXRkb3duXG4gICAgICAgIGF3YWl0IEIuZGVsYXkoMTAwKTtcbiAgICAgICAgY29uc3Qgc2h1dGRvd25FdmVudFByb21pc2UgPSBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgc2V0VGltZW91dChcbiAgICAgICAgICAgICgpID0+XG4gICAgICAgICAgICAgIHJlamVjdChcbiAgICAgICAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAnb25VbmV4cGVjdGVkU2h1dGRvd24gZXZlbnQgaXMgZXhwZWN0ZWQgdG8gYmUgZmlyZWQgd2l0aGluIDUgc2Vjb25kcyB0aW1lb3V0J1xuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIDUwMDBcbiAgICAgICAgICApO1xuICAgICAgICAgIGQub25VbmV4cGVjdGVkU2h1dGRvd24ocmVzb2x2ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBkLnN0YXJ0VW5leHBlY3RlZFNodXRkb3duKG5ldyBFcnJvcignQ3Jhc2h5dGltZXMnKSk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgcmVxUHJvbWlzZTtcbiAgICAgICAgdmFsdWUubWVzc2FnZS5zaG91bGQuY29udGFpbignQ3Jhc2h5dGltZXMnKTtcbiAgICAgICAgYXdhaXQgc2h1dGRvd25FdmVudFByb21pc2U7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdldmVudCB0aW1pbmdzJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCBub3QgYWRkIHRpbWluZ3MgaWYgbm90IHVzaW5nIG9wdC1pbiBjYXAnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCBzdGFydFNlc3Npb24oe2NhcGFiaWxpdGllczoge2Fsd2F5c01hdGNoOiBkZWZhdWx0Q2Fwc319KTtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZ2V0U2Vzc2lvbihzZXNzaW9uLnNlc3Npb25JZCk7XG4gICAgICAgIHNob3VsZC5ub3QuZXhpc3QocmVzLmV2ZW50cyk7XG4gICAgICAgIGF3YWl0IGVuZFNlc3Npb24oc2Vzc2lvbi5zZXNzaW9uSWQpO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIGFkZCBzdGFydCBzZXNzaW9uIHRpbWluZ3MnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGNhcHMgPSB7Li4uZGVmYXVsdENhcHMsICdhcHBpdW06ZXZlbnRUaW1pbmdzJzogdHJ1ZX07XG4gICAgICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCBzdGFydFNlc3Npb24oe2NhcGFiaWxpdGllczoge2Fsd2F5c01hdGNoOiBjYXBzfX0pO1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBnZXRTZXNzaW9uKHNlc3Npb24uc2Vzc2lvbklkKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KHJlcy5ldmVudHMpO1xuICAgICAgICBzaG91bGQuZXhpc3QocmVzLmV2ZW50cz8ubmV3U2Vzc2lvblJlcXVlc3RlZCk7XG4gICAgICAgIHNob3VsZC5leGlzdChyZXMuZXZlbnRzPy5uZXdTZXNzaW9uU3RhcnRlZCk7XG4gICAgICAgIHJlcy5ldmVudHM/Lm5ld1Nlc3Npb25SZXF1ZXN0ZWRbMF0uc2hvdWxkLmJlLmEoJ251bWJlcicpO1xuICAgICAgICByZXMuZXZlbnRzPy5uZXdTZXNzaW9uU3RhcnRlZFswXS5zaG91bGQuYmUuYSgnbnVtYmVyJyk7XG4gICAgICAgIGF3YWl0IGVuZFNlc3Npb24oc2Vzc2lvbi5zZXNzaW9uSWQpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEEge0BsaW5rY29kZSBEcml2ZXJDbGFzc30sIGV4Y2VwdCB1c2luZyB0aGUgYmFzZSB7QGxpbmtjb2RlIERyaXZlcn0gdHlwZSBpbnN0ZWFkIG9mIGBFeHRlcm5hbERyaXZlcmAuXG4gKiBUaGlzIGFsbG93cyB0aGUgc3VpdGUgdG8gd29yayBmb3IgYEJhc2VEcml2ZXJgLlxuICogQHRlbXBsYXRlIHtEcml2ZXJ9IFBcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Ecml2ZXJDbGFzczxQPn0gRHJpdmVyQ2xhc3NcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5DYXBhYmlsaXRpZXN9IENhcGFiaWxpdGllc1xuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkRyaXZlcn0gRHJpdmVyXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRHJpdmVyU3RhdGljfSBEcml2ZXJTdGF0aWNcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5BcHBpdW1XM0NDYXBhYmlsaXRpZXN9IEFwcGl1bVczQ0NhcGFiaWxpdGllc1xuICogQHR5cGVkZWYge2ltcG9ydCgnYXhpb3MnKS5BeGlvc1JlcXVlc3RDb25maWd9IEF4aW9zUmVxdWVzdENvbmZpZ1xuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLlNpbmd1bGFyU2Vzc2lvbkRhdGF9IFNpbmd1bGFyU2Vzc2lvbkRhdGFcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBULERcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2F4aW9zJykuQXhpb3NSZXNwb25zZTxULCBEPn0gQXhpb3NSZXNwb25zZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTmV3U2Vzc2lvbkRhdGFcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KCd0eXBlLWZlc3QnKS5SZXF1aXJlQXRMZWFzdE9uZTxpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5XM0NDYXBhYmlsaXRpZXMsICdmaXJzdE1hdGNoJ3wnYWx3YXlzTWF0Y2gnPn0gY2FwYWJpbGl0aWVzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBOZXdTZXNzaW9uUmVzcG9uc2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzZXNzaW9uSWQsXG4gKiBAcHJvcGVydHkge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkNhcGFiaWxpdGllc30gY2FwYWJpbGl0aWVzXG4gKi9cblxuLyoqXG4gKiBTb21lIEUyRSBoZWxwZXJzIGZvciBtYWtpbmcgcmVxdWVzdHMgYW5kIG1hbmFnaW5nIHNlc3Npb25zXG4gKiBTZWUge0BsaW5rY29kZSBjcmVhdGVTZXNzaW9uSGVscGVyc31cbiAqIEB0ZW1wbGF0ZSBbQ29tbWFuZERhdGE9dW5rbm93bl1cbiAqIEB0ZW1wbGF0ZSBbUmVzcG9uc2VEYXRhPWFueV1cbiAqIEB0eXBlZGVmIFNlc3Npb25IZWxwZXJzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmV3U2Vzc2lvblVSTCAtIFVSTCB0byBjcmVhdGUgYSBuZXcgc2Vzc2lvbi4gQ2FuIGJlIHVzZWQgd2l0aCByYXcgYGF4aW9zYCByZXF1ZXN0cyB0byBmdWxseSBpbnNwZWN0IHJhdyByZXNwb25zZS4gIE1vc3RseSwgdGhpcyB3aWxsIG5vdCBiZSB1c2VkLlxuICogQHByb3BlcnR5IHsoZGF0YTogTmV3U2Vzc2lvbkRhdGEsIGNvbmZpZz86IEF4aW9zUmVxdWVzdENvbmZpZykgPT4gUHJvbWlzZTxOZXdTZXNzaW9uUmVzcG9uc2U+fSBzdGFydFNlc3Npb24gLSBCZWdpbiBhIHNlc3Npb25cbiAqIEBwcm9wZXJ0eSB7KHNlc3Npb25JZDogc3RyaW5nKSA9PiBQcm9taXNlPEF4aW9zUmVzcG9uc2U8e3ZhbHVlOiB7ZXJyb3I/OiBzdHJpbmd9P30sIHt2YWxpZGF0ZVN0YXR1czogbnVsbH0+Pn0gZW5kU2Vzc2lvbiAtIEVuZCBhIHNlc3Npb24uIF9Ob3RlOiByZXNvbHZlcyB3aXRoIHJhdyByZXNwb25zZSBvYmplY3RfXG4gKiBAcHJvcGVydHkgeyhzZXNzaW9uSWQ6IHN0cmluZykgPT4gUHJvbWlzZTxTaW5ndWxhclNlc3Npb25EYXRhPn0gZ2V0U2Vzc2lvbiAtIEdldCBpbmZvIGFib3V0IGEgc2Vzc2lvblxuICogQHByb3BlcnR5IHsoc2Vzc2lvbklkOiBzdHJpbmcsIGNtZE5hbWU6IHN0cmluZywgZGF0YT86IENvbW1hbmREYXRhLCBjb25maWc/OiBBeGlvc1JlcXVlc3RDb25maWcpID0+IFByb21pc2U8UmVzcG9uc2VEYXRhPn0gcG9zdENvbW1hbmQgLSBTZW5kIGFuIGFyYml0cmFyeSBjb21tYW5kIHZpYSBgUE9TVGAuXG4gKiBAcHJvcGVydHkgeyhzZXNzaW9uSWRPckNtZE5hbWU6IHN0cmluZywgY21kTmFtZU9yQ29uZmlnOiBzdHJpbmd8QXhpb3NSZXF1ZXN0Q29uZmlnLCBjb25maWc/OiBBeGlvc1JlcXVlc3RDb25maWcpID0+IFByb21pc2U8UmVzcG9uc2VEYXRhPn0gZ2V0Q29tbWFuZCAtIFNlbmQgYW4gYXJiaXRyYXJ5IGNvbW1hbmQgdmlhIGBHRVRgLiBPcHRpb25hbCBgc2Vzc2lvbklkYC5cbiAqL1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxNQUFNLEdBQUdDLGFBQUEsQ0FBS0QsTUFBTCxFQUFmOztBQVVPLFNBQVNFLG9CQUFULENBQThCQyxJQUE5QixFQUFvQ0MsT0FBTyxHQUFHQyxrQkFBOUMsRUFBeUQ7RUFDOUQsTUFBTUMsbUJBQW1CLEdBRXJCLElBQUFDLHdCQUFBLEVBQWdCSCxPQUFoQixFQUF5QkQsSUFBekIsQ0FGSjtFQUtBLE1BQU1LLGdCQUFn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
@@ -1,12 +0,0 @@
1
- /**
2
- * Creates unit test suites for a driver.
3
- * @param {DriverClass} DriverClass
4
- * @param {AppiumW3CCapabilities} [defaultCaps]
5
- */
6
- export function driverUnitTestSuite(DriverClass: DriverClass, defaultCaps?: Partial<import("@wdio/types/build/Capabilities").Capabilities & import("@wdio/types/build/Capabilities").AppiumW3CCapabilities & {
7
- [x: `${string}:${string}`]: any;
8
- }> | undefined): void;
9
- export type DriverClass = import('@appium/types').DriverClass;
10
- export type W3CCapabilities = import('@appium/types').W3CCapabilities;
11
- export type AppiumW3CCapabilities = import('@appium/types').AppiumW3CCapabilities;
12
- //# sourceMappingURL=driver-unit-suite.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"driver-unit-suite.d.ts","sourceRoot":"","sources":["../../lib/driver-unit-suite.js"],"names":[],"mappings":"AAaA;;;;GAIG;AAEH,iDAJW,WAAW;;sBA4mBrB;0BAGY,OAAO,eAAe,EAAE,WAAW;8BACnC,OAAO,eAAe,EAAE,eAAe;oCACvC,OAAO,eAAe,EAAE,qBAAqB"}