@appium/base-driver 8.2.2 → 8.3.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 (61) hide show
  1. package/build/lib/basedriver/capabilities.js +3 -1
  2. package/build/lib/basedriver/commands/find.js +4 -11
  3. package/build/lib/basedriver/commands/log.js +3 -6
  4. package/build/lib/basedriver/commands/session.js +18 -27
  5. package/build/lib/basedriver/commands/settings.js +4 -8
  6. package/build/lib/basedriver/commands/timeout.js +10 -15
  7. package/build/lib/basedriver/device-settings.js +14 -2
  8. package/build/lib/basedriver/driver.js +25 -23
  9. package/build/lib/basedriver/helpers.js +140 -84
  10. package/build/lib/express/express-logging.js +2 -2
  11. package/build/lib/express/idempotency.js +2 -2
  12. package/build/lib/helpers/capabilities.js +39 -0
  13. package/build/lib/index.js +7 -7
  14. package/build/lib/jsonwp-proxy/protocol-converter.js +19 -16
  15. package/build/lib/jsonwp-proxy/proxy.js +20 -16
  16. package/build/lib/protocol/errors.js +4 -2
  17. package/build/lib/protocol/helpers.js +3 -20
  18. package/build/lib/protocol/protocol.js +44 -45
  19. package/build/lib/protocol/routes.js +67 -1
  20. package/build/test/basedriver/capabilities-specs.js +43 -1
  21. package/build/test/basedriver/capability-specs.js +126 -167
  22. package/build/test/basedriver/commands/log-specs.js +12 -5
  23. package/build/test/basedriver/driver-tests.js +11 -14
  24. package/build/test/basedriver/helpers-specs.js +5 -1
  25. package/build/test/basedriver/timeout-specs.js +7 -9
  26. package/build/test/express/server-e2e-specs.js +10 -5
  27. package/build/test/express/server-specs.js +22 -16
  28. package/build/test/express/static-specs.js +10 -5
  29. package/build/test/jsonwp-proxy/proxy-e2e-specs.js +1 -2
  30. package/build/test/jsonwp-proxy/proxy-specs.js +1 -6
  31. package/build/test/protocol/fake-driver.js +12 -15
  32. package/build/test/protocol/protocol-e2e-specs.js +49 -103
  33. package/build/test/protocol/routes-specs.js +2 -2
  34. package/lib/basedriver/capabilities.js +3 -0
  35. package/lib/basedriver/commands/find.js +3 -6
  36. package/lib/basedriver/commands/log.js +2 -4
  37. package/lib/basedriver/commands/session.js +21 -22
  38. package/lib/basedriver/commands/settings.js +3 -5
  39. package/lib/basedriver/commands/timeout.js +9 -10
  40. package/lib/basedriver/device-settings.js +10 -1
  41. package/lib/basedriver/driver.js +29 -16
  42. package/lib/basedriver/helpers.js +201 -83
  43. package/lib/express/express-logging.js +1 -1
  44. package/lib/express/idempotency.js +1 -1
  45. package/lib/helpers/capabilities.js +25 -0
  46. package/lib/index.js +6 -4
  47. package/lib/jsonwp-proxy/protocol-converter.js +15 -18
  48. package/lib/jsonwp-proxy/proxy.js +17 -15
  49. package/lib/protocol/errors.js +1 -1
  50. package/lib/protocol/helpers.js +5 -25
  51. package/lib/protocol/protocol.js +43 -54
  52. package/lib/protocol/routes.js +60 -1
  53. package/package.json +29 -22
  54. package/test/basedriver/capabilities-specs.js +34 -2
  55. package/test/basedriver/capability-specs.js +120 -146
  56. package/test/basedriver/commands/log-specs.js +12 -3
  57. package/test/basedriver/driver-tests.js +12 -7
  58. package/test/basedriver/helpers-specs.js +4 -0
  59. package/test/basedriver/timeout-specs.js +6 -11
  60. package/build/lib/protocol/sessions-cache.js +0 -88
  61. package/lib/protocol/sessions-cache.js +0 -74
@@ -4,11 +4,13 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
 
5
5
  require("source-map-support/register");
6
6
 
7
+ var _bluebird = _interopRequireDefault(require("bluebird"));
8
+
7
9
  var _lib = _interopRequireWildcard(require("../../lib"));
8
10
 
9
11
  var _logger = _interopRequireDefault(require("../../lib/basedriver/logger"));
10
12
 
11
- var _sinon = _interopRequireDefault(require("sinon"));
13
+ var _sinon = require("sinon");
12
14
 
13
15
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
14
16
 
@@ -16,37 +18,27 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
16
18
 
17
19
  describe('Desired Capabilities', function () {
18
20
  let d;
21
+ let sandbox;
19
22
  beforeEach(function () {
20
23
  d = new _lib.default();
21
-
22
- _sinon.default.spy(_logger.default, 'warn');
24
+ sandbox = (0, _sinon.createSandbox)();
25
+ sandbox.spy(d.log, 'warn');
26
+ sandbox.spy(_logger.default, 'warn');
23
27
  });
24
28
  afterEach(function () {
25
- _logger.default.warn.restore();
29
+ sandbox.restore();
26
30
  });
27
31
  it('should require platformName and deviceName', async function () {
28
- try {
29
- await d.createSession(null, null, {});
30
- } catch (e) {
31
- e.should.be.instanceof(_lib.errors.SessionNotCreatedError);
32
- e.message.should.contain('platformName');
33
- return;
34
- }
35
-
36
- should.fail('error should have been thrown');
32
+ await d.createSession({
33
+ firstMatch: [{}]
34
+ }).should.eventually.be.rejectedWith(_lib.errors.SessionNotCreatedError, /platformName/);
37
35
  });
38
36
  it('should require platformName', async function () {
39
- try {
40
- await d.createSession(null, null, {
41
- 'deviceName': 'Delorean'
42
- });
43
- } catch (e) {
44
- e.should.be.instanceof(_lib.errors.SessionNotCreatedError);
45
- e.message.should.contain('platformName');
46
- return;
47
- }
48
-
49
- should.fail('error should have been thrown');
37
+ await d.createSession({
38
+ alwaysMatch: {
39
+ 'appium:deviceName': 'Delorean'
40
+ }
41
+ }).should.eventually.be.rejectedWith(_lib.errors.SessionNotCreatedError, /platformName/);
50
42
  });
51
43
  it('should not care about cap order', async function () {
52
44
  await d.createSession(null, null, {
@@ -54,7 +46,7 @@ describe('Desired Capabilities', function () {
54
46
  'appium:deviceName': 'Delorean',
55
47
  platformName: 'iOS'
56
48
  }
57
- });
49
+ }).should.eventually.be.fulfilled;
58
50
  });
59
51
  it('should check required caps which are added to driver', async function () {
60
52
  d.desiredCapConstraints = {
@@ -67,22 +59,12 @@ describe('Desired Capabilities', function () {
67
59
  inclusion: ['Delorean', 'Reventon']
68
60
  }
69
61
  };
70
-
71
- try {
72
- await d.createSession(null, null, {
73
- alwaysMatch: {
74
- 'platformName': 'iOS',
75
- 'appium:deviceName': 'Delorean'
76
- }
77
- });
78
- } catch (e) {
79
- e.should.be.instanceof(_lib.errors.SessionNotCreatedError);
80
- e.message.should.contain('necessary');
81
- e.message.should.contain('proper');
82
- return;
83
- }
84
-
85
- should.fail('error should have been thrown');
62
+ await d.createSession(null, null, {
63
+ alwaysMatch: {
64
+ 'platformName': 'iOS',
65
+ 'appium:deviceName': 'Delorean'
66
+ }
67
+ }).should.eventually.be.rejectedWith(_lib.errors.SessionNotCreatedError, /necessary.*proper/);
86
68
  });
87
69
  it('should check added required caps in addition to base', async function () {
88
70
  d.desiredCapConstraints = {
@@ -95,20 +77,11 @@ describe('Desired Capabilities', function () {
95
77
  inclusion: ['Delorean', 'Reventon']
96
78
  }
97
79
  };
98
-
99
- try {
100
- await d.createSession(null, null, {
101
- alwaysMatch: {
102
- 'appium:necessary': 'yup'
103
- }
104
- });
105
- } catch (e) {
106
- e.should.be.instanceof(_lib.errors.SessionNotCreatedError);
107
- e.message.should.contain('platformName');
108
- return;
109
- }
110
-
111
- should.fail('error should have been thrown');
80
+ await d.createSession(null, null, {
81
+ alwaysMatch: {
82
+ 'appium:necessary': 'yup'
83
+ }
84
+ }).should.eventually.be.rejectedWith(_lib.errors.SessionNotCreatedError, /platformName/);
112
85
  });
113
86
  it('should accept extra capabilities', async function () {
114
87
  await d.createSession(null, null, {
@@ -118,7 +91,7 @@ describe('Desired Capabilities', function () {
118
91
  'appium:extra': 'cheese',
119
92
  'appium:hold the': 'sauce'
120
93
  }
121
- });
94
+ }).should.eventually.be.fulfilled;
122
95
  });
123
96
  it('should log the use of extra caps', async function () {
124
97
  this.timeout(500);
@@ -130,24 +103,15 @@ describe('Desired Capabilities', function () {
130
103
  'appium:hold the': 'sauce'
131
104
  }
132
105
  });
133
-
134
- _logger.default.warn.callCount.should.be.above(0);
106
+ d.log.warn.should.have.been.called;
135
107
  });
136
108
  it('should be sensitive to the case of caps', async function () {
137
- try {
138
- await d.createSession(null, null, {
139
- alwaysMatch: {
140
- 'platformname': 'iOS',
141
- 'appium:deviceName': 'Delorean'
142
- }
143
- });
144
- } catch (e) {
145
- e.should.be.instanceof(_lib.errors.SessionNotCreatedError);
146
- e.message.should.contain('platformName');
147
- return;
148
- }
149
-
150
- should.fail('error should have been thrown');
109
+ await d.createSession(null, null, {
110
+ alwaysMatch: {
111
+ 'platformname': 'iOS',
112
+ 'appium:deviceName': 'Delorean'
113
+ }
114
+ }).should.eventually.be.rejectedWith(_lib.errors.SessionNotCreatedError, /platformName/);
151
115
  });
152
116
  describe('boolean capabilities', function () {
153
117
  it('should allow a string "false"', async function () {
@@ -158,9 +122,7 @@ describe('Desired Capabilities', function () {
158
122
  'appium:noReset': 'false'
159
123
  }
160
124
  });
161
-
162
- _logger.default.warn.callCount.should.be.above(0);
163
-
125
+ d.log.warn.should.have.been.called;
164
126
  let sessions = await d.getSessions();
165
127
  sessions[0].capabilities.noReset.should.eql(false);
166
128
  });
@@ -172,9 +134,7 @@ describe('Desired Capabilities', function () {
172
134
  'appium:noReset': 'true'
173
135
  }
174
136
  });
175
-
176
- _logger.default.warn.callCount.should.be.above(0);
177
-
137
+ d.log.warn.should.have.been.called;
178
138
  let sessions = await d.getSessions();
179
139
  sessions[0].capabilities.noReset.should.eql(true);
180
140
  });
@@ -186,9 +146,7 @@ describe('Desired Capabilities', function () {
186
146
  'appium:language': 'true'
187
147
  }
188
148
  });
189
-
190
- _logger.default.warn.callCount.should.equal(0);
191
-
149
+ d.log.warn.should.not.have.been.called;
192
150
  let sessions = await d.getSessions();
193
151
  sessions[0].capabilities.language.should.eql('true');
194
152
  });
@@ -202,9 +160,7 @@ describe('Desired Capabilities', function () {
202
160
  'appium:newCommandTimeout': '1'
203
161
  }
204
162
  });
205
-
206
- _logger.default.warn.callCount.should.be.above(0);
207
-
163
+ d.log.warn.should.have.been.called;
208
164
  let sessions = await d.getSessions();
209
165
  sessions[0].capabilities.newCommandTimeout.should.eql(1);
210
166
  });
@@ -216,9 +172,7 @@ describe('Desired Capabilities', function () {
216
172
  'appium:newCommandTimeout': '1.1'
217
173
  }
218
174
  });
219
-
220
- _logger.default.warn.callCount.should.be.above(0);
221
-
175
+ d.log.warn.should.have.been.called;
222
176
  let sessions = await d.getSessions();
223
177
  sessions[0].capabilities.newCommandTimeout.should.eql(1.1);
224
178
  });
@@ -230,30 +184,20 @@ describe('Desired Capabilities', function () {
230
184
  'appium:language': '1'
231
185
  }
232
186
  });
233
-
234
- _logger.default.warn.callCount.should.equal(0);
235
-
187
+ d.log.warn.should.not.have.been.called;
236
188
  let sessions = await d.getSessions();
237
189
  sessions[0].capabilities.language.should.eql('1');
238
190
  });
239
191
  });
240
192
  it('should error if objects in caps', async function () {
241
- try {
242
- await d.createSession(null, null, {
243
- alwaysMatch: {
244
- 'platformName': {
245
- a: 'iOS'
246
- },
247
- 'appium:deviceName': 'Delorean'
248
- }
249
- });
250
- } catch (e) {
251
- e.should.be.instanceof(_lib.errors.SessionNotCreatedError);
252
- e.message.should.contain('platformName');
253
- return;
254
- }
255
-
256
- should.fail('error should have been thrown');
193
+ await d.createSession(null, null, {
194
+ alwaysMatch: {
195
+ 'platformName': {
196
+ a: 'iOS'
197
+ },
198
+ 'appium:deviceName': 'Delorean'
199
+ }
200
+ }).should.eventually.be.rejectedWith(_lib.errors.SessionNotCreatedError, /platformName/i);
257
201
  });
258
202
  it('should check for deprecated caps', async function () {
259
203
  this.timeout(500);
@@ -269,8 +213,7 @@ describe('Desired Capabilities', function () {
269
213
  'appium:lynx-version': 5
270
214
  }
271
215
  });
272
-
273
- _logger.default.warn.callCount.should.be.above(0);
216
+ _logger.default.warn.should.have.been.called;
274
217
  });
275
218
  it('should not warn if deprecated=false', async function () {
276
219
  this.timeout(500);
@@ -286,8 +229,7 @@ describe('Desired Capabilities', function () {
286
229
  'appium:lynx-version': 5
287
230
  }
288
231
  });
289
-
290
- _logger.default.warn.callCount.should.equal(0);
232
+ d.log.warn.should.not.have.been.called;
291
233
  });
292
234
  it('should not validate against null/undefined caps', async function () {
293
235
  d.desiredCapConstraints = {
@@ -295,14 +237,19 @@ describe('Desired Capabilities', function () {
295
237
  isString: true
296
238
  }
297
239
  };
298
- await d.createSession(null, null, {
299
- alwaysMatch: {
300
- platformName: 'iOS',
301
- 'appium:deviceName': 'Dumb',
302
- 'appium:foo': null
303
- }
304
- });
305
- await d.deleteSession();
240
+
241
+ try {
242
+ await d.createSession(null, null, {
243
+ alwaysMatch: {
244
+ platformName: 'iOS',
245
+ 'appium:deviceName': 'Dumb',
246
+ 'appium:foo': null
247
+ }
248
+ });
249
+ } finally {
250
+ await d.deleteSession();
251
+ }
252
+
306
253
  await d.createSession(null, null, {
307
254
  alwaysMatch: {
308
255
  platformName: 'iOS',
@@ -310,22 +257,30 @@ describe('Desired Capabilities', function () {
310
257
  'appium:foo': 1
311
258
  }
312
259
  }).should.eventually.be.rejectedWith(/'foo' must be of type string/);
313
- await d.createSession(null, null, {
314
- alwaysMatch: {
315
- platformName: 'iOS',
316
- 'appium:deviceName': 'Dumb',
317
- 'appium:foo': undefined
318
- }
319
- });
320
- await d.deleteSession();
321
- await d.createSession(null, null, {
322
- alwaysMatch: {
323
- platformName: 'iOS',
324
- 'appium:deviceName': 'Dumb',
325
- 'appium:foo': ''
326
- }
327
- });
328
- await d.deleteSession();
260
+
261
+ try {
262
+ await d.createSession(null, null, {
263
+ alwaysMatch: {
264
+ platformName: 'iOS',
265
+ 'appium:deviceName': 'Dumb',
266
+ 'appium:foo': undefined
267
+ }
268
+ });
269
+ } finally {
270
+ await d.deleteSession();
271
+ }
272
+
273
+ try {
274
+ await d.createSession(null, null, {
275
+ alwaysMatch: {
276
+ platformName: 'iOS',
277
+ 'appium:deviceName': 'Dumb',
278
+ 'appium:foo': ''
279
+ }
280
+ });
281
+ } finally {
282
+ await d.deleteSession();
283
+ }
329
284
  });
330
285
  it('should still validate null/undefined/empty caps whose presence is required', async function () {
331
286
  d.desiredCapConstraints = {
@@ -340,25 +295,33 @@ describe('Desired Capabilities', function () {
340
295
  'appium:foo': null
341
296
  }
342
297
  }).should.eventually.be.rejectedWith(/blank/);
343
- await d.createSession(null, null, {
344
- platformName: 'iOS',
345
- 'appium:deviceName': 'Dumb',
346
- 'appium:foo': ''
298
+ await d.createSession(null, {
299
+ alwaysMatch: {
300
+ platformName: 'iOS',
301
+ 'appium:deviceName': 'Dumb',
302
+ 'appium:foo': ''
303
+ }
347
304
  }).should.eventually.be.rejectedWith(/blank/);
348
- await d.createSession(null, null, {
349
- platformName: 'iOS',
350
- 'appium:deviceName': 'Dumb',
351
- 'appium:foo': {}
305
+ await d.createSession({
306
+ firstMatch: [{
307
+ platformName: 'iOS',
308
+ 'appium:deviceName': 'Dumb',
309
+ 'appium:foo': {}
310
+ }]
352
311
  }).should.eventually.be.rejectedWith(/blank/);
353
- await d.createSession(null, null, {
354
- platformName: 'iOS',
355
- 'appium:deviceName': 'Dumb',
356
- 'appium:foo': []
312
+ await d.createSession({
313
+ alwaysMatch: {
314
+ platformName: 'iOS',
315
+ 'appium:deviceName': 'Dumb',
316
+ 'appium:foo': []
317
+ }
357
318
  }).should.eventually.be.rejectedWith(/blank/);
358
- await d.createSession(null, null, {
359
- platformName: 'iOS',
360
- 'appium:deviceName': 'Dumb',
361
- 'appium:foo': ' '
319
+ await d.createSession({
320
+ alwaysMatch: {
321
+ platformName: 'iOS',
322
+ 'appium:deviceName': 'Dumb',
323
+ 'appium:foo': ' '
324
+ }
362
325
  }).should.eventually.be.rejectedWith(/blank/);
363
326
  });
364
327
  describe('w3c', function () {
@@ -370,27 +333,23 @@ describe('Desired Capabilities', function () {
370
333
  },
371
334
  firstMatch: [{}]
372
335
  });
373
- sessionId.should.exist;
374
- caps.should.eql({
375
- platformName: 'iOS',
376
- deviceName: 'Delorean'
377
- });
378
- await d.deleteSession();
379
- });
380
- it('should raise an error if w3c capabilities is not a plain JSON object', async function () {
381
- for (const val of [true, 'string', [], 100]) {
382
- try {
383
- await d.createSession(null, null, val);
384
- } catch (e) {
385
- e.should.be.instanceof(_lib.errors.SessionNotCreatedError);
386
- continue;
387
- }
388
336
 
389
- should.fail('error should have been thrown');
337
+ try {
338
+ sessionId.should.exist;
339
+ caps.should.eql({
340
+ platformName: 'iOS',
341
+ deviceName: 'Delorean'
342
+ });
343
+ } finally {
344
+ await d.deleteSession();
390
345
  }
391
346
  });
347
+ it('should raise an error if w3c capabilities is not a plain JSON object', async function () {
348
+ const testValues = [true, 'string', [], 100];
349
+ await _bluebird.default.map(testValues, val => d.createSession(null, null, val).should.eventually.be.rejectedWith(_lib.errors.SessionNotCreatedError));
350
+ });
392
351
  });
393
352
  });require('source-map-support').install();
394
353
 
395
354
 
396
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvYmFzZWRyaXZlci9jYXBhYmlsaXR5LXNwZWNzLmpzIl0sIm5hbWVzIjpbImRlc2NyaWJlIiwiZCIsImJlZm9yZUVhY2giLCJCYXNlRHJpdmVyIiwic2lub24iLCJzcHkiLCJsb2dnZXIiLCJhZnRlckVhY2giLCJ3YXJuIiwicmVzdG9yZSIsIml0IiwiY3JlYXRlU2Vzc2lvbiIsImUiLCJzaG91bGQiLCJiZSIsImluc3RhbmNlb2YiLCJlcnJvcnMiLCJTZXNzaW9uTm90Q3JlYXRlZEVycm9yIiwibWVzc2FnZSIsImNvbnRhaW4iLCJmYWlsIiwiYWx3YXlzTWF0Y2giLCJwbGF0Zm9ybU5hbWUiLCJkZXNpcmVkQ2FwQ29uc3RyYWludHMiLCJuZWNlc3NhcnkiLCJwcmVzZW5jZSIsInByb3BlciIsImlzU3RyaW5nIiwiaW5jbHVzaW9uIiwidGltZW91dCIsImNhbGxDb3VudCIsImFib3ZlIiwic2Vzc2lvbnMiLCJnZXRTZXNzaW9ucyIsImNhcGFiaWxpdGllcyIsIm5vUmVzZXQiLCJlcWwiLCJlcXVhbCIsImxhbmd1YWdlIiwibmV3Q29tbWFuZFRpbWVvdXQiLCJhIiwiZGVwcmVjYXRlZCIsImRlbGV0ZVNlc3Npb24iLCJldmVudHVhbGx5IiwicmVqZWN0ZWRXaXRoIiwidW5kZWZpbmVkIiwiZm9vIiwic2Vzc2lvbklkIiwiY2FwcyIsImZpcnN0TWF0Y2giLCJleGlzdCIsImRldmljZU5hbWUiLCJ2YWwiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOztBQUNBOztBQUNBOzs7Ozs7QUFHQUEsUUFBUSxDQUFDLHNCQUFELEVBQXlCLFlBQVk7QUFDM0MsTUFBSUMsQ0FBSjtBQUVBQyxFQUFBQSxVQUFVLENBQUMsWUFBWTtBQUNyQkQsSUFBQUEsQ0FBQyxHQUFHLElBQUlFLFlBQUosRUFBSjs7QUFDQUMsbUJBQU1DLEdBQU4sQ0FBVUMsZUFBVixFQUFrQixNQUFsQjtBQUNELEdBSFMsQ0FBVjtBQUtBQyxFQUFBQSxTQUFTLENBQUMsWUFBWTtBQUNwQkQsb0JB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SUFBRCxFQUFPLFFBQVAsRUFBaUIsRUFBakIsRUFBcUIsR0FBckIsQ0FBbEIsRUFBNkM7QUFDM0MsWUFBSTtBQUNGLGdCQUFNbkQsQ0FBQyxDQUFDVSxhQUFGLENBQWdCLElBQWhCLEVBQXNCLElBQXRCLEVBQTRCeUMsR0FBNUIsQ0FBTjtBQUNELFNBRkQsQ0FFRSxPQUFPeEMsQ0FBUCxFQUFVO0FBQ1ZBLFVBQUFBLENBQUMsQ0FBQ0MsTUFBRixDQUFTQyxFQUFULENBQVlDLFVBQVosQ0FBdUJDLFlBQU9DLHNCQUE5QjtBQUNBO0FBQ0Q7O0FBQ0RKLFFBQUFBLE1BQU0sQ0FBQ08sSUFBUCxDQUFZLCtCQUFaO0FBQ0Q7QUFDRixLQVZDLENBQUY7QUFXRCxHQTNCTyxDQUFSO0FBNEJELENBblpPLENBQVIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZWZhdWx0IGFzIEJhc2VEcml2ZXIsIGVycm9ycyB9IGZyb20gJy4uLy4uL2xpYic7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4uLy4uL2xpYi9iYXNlZHJpdmVyL2xvZ2dlcic7XG5pbXBvcnQgc2lub24gZnJvbSAnc2lub24nO1xuXG5cbmRlc2NyaWJlKCdEZXNpcmVkIENhcGFiaWxpdGllcycsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IGQ7XG5cbiAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgZCA9IG5ldyBCYXNlRHJpdmVyKCk7XG4gICAgc2lub24uc3B5KGxvZ2dlciwgJ3dhcm4nKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBsb2dnZXIud2Fybi5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmVxdWlyZSBwbGF0Zm9ybU5hbWUgYW5kIGRldmljZU5hbWUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGQuY3JlYXRlU2Vzc2lvbihudWxsLCBudWxsLCB7fSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZS5zaG91bGQuYmUuaW5zdGFuY2VvZihlcnJvcnMuU2Vzc2lvbk5vdENyZWF0ZWRFcnJvcik7XG4gICAgICBlLm1lc3NhZ2Uuc2hvdWxkLmNvbnRhaW4oJ3BsYXRmb3JtTmFtZScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNob3VsZC5mYWlsKCdlcnJvciBzaG91bGQgaGF2ZSBiZWVuIHRocm93bicpO1xuICB9KTtcblxuXG4gIGl0KCdzaG91bGQgcmVxdWlyZSBwbGF0Zm9ybU5hbWUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGQuY3JlYXRlU2Vzc2lvbihudWxsLCBudWxsLCB7J2RldmljZU5hbWUnOiAnRGVsb3JlYW4nfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZS5zaG91bGQuYmUuaW5zdGFuY2VvZihlcnJvcnMuU2Vzc2lvbk5vdENyZWF0ZWRFcnJvcik7XG4gICAgICBlLm1lc3NhZ2Uuc2hvdWxkLmNvbnRhaW4oJ3BsYXRmb3JtTmFtZScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNob3VsZC5mYWlsKCdlcnJvciBzaG91bGQgaGF2ZSBiZWVuIHRocm93bicpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIG5vdCBjYXJlIGFib3V0IGNhcCBvcmRlcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcblxuICAgIGF3YWl0IGQuY3JlYXRlU2Vzc2lvbihudWxsLCBudWxsLCB7XG4gICAgICBhbHdheXNNYXRjaDoge1xuICAgICAgICAnYXBwaXVtOmRldmljZU5hbWUnOiAnRGVsb3JlYW4nLFxuICAgICAgICBwbGF0Zm9ybU5hbWU6ICdpT1MnXG4gICAgICB9XG4gICAgfSk7XG5cbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBjaGVjayByZXF1aXJlZCBjYXBzIHdoaWNoIGFyZSBhZGRlZCB0byBkcml2ZXInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgZC5kZXNpcmVkQ2FwQ29uc3RyYWludHMgPSB7XG4gICAgICBuZWNlc3Nhcnk6IHtcbiAgICAgICAgcHJlc2VuY2U6IHRydWVcbiAgICAgIH0sXG4gICAgICBwcm9wZXI6IHtcbiAgICAgICAgcHJlc2VuY2U6IHRydWUsXG4gICAgICAgIGlzU3RyaW5nOiB0cnVlLFxuICAgICAgICBpbmNsdXNpb246IFsnRGVsb3JlYW4nLCAnUmV2ZW50b24nXVxuICAgICAgfVxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZC5jcmVhdGVTZXNzaW9uKG51bGwsIG51bGwsIHtcbiAgICAgICAgYWx3YXlzTWF0Y2g6IHtcbiAgICAgICAgICAncGxhdGZvcm1OYW1lJzogJ2lPUycsXG4gICAgICAgICAgJ2FwcGl1bTpkZXZpY2VOYW1lJzogJ0RlbG9yZWFuJ1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlLnNob3VsZC5iZS5pbnN0YW5jZW9mKGVycm9ycy5TZXNzaW9uTm90Q3JlYXRlZEVycm9yKTtcbiAgICAgIGUubWVzc2FnZS5zaG91bGQuY29udGFpbignbmVjZXNzYXJ5Jyk7XG4gICAgICBlLm1lc3NhZ2Uuc2hvdWxkLmNvbnRhaW4oJ3Byb3BlcicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNob3VsZC5mYWlsKCdlcnJvciBzaG91bGQgaGF2ZSBiZWVuIHRocm93bicpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGNoZWNrIGFkZGVkIHJlcXVpcmVkIGNhcHMgaW4gYWRkaXRpb24gdG8gYmFzZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBkLmRlc2lyZWRDYXBDb25zdHJhaW50cyA9IHtcbiAgICAgIG5lY2Vzc2FyeToge1xuICAgICAgICBwcmVzZW5jZTogdHJ1ZVxuICAgICAgfSxcbiAgICAgIHByb3Blcjoge1xuICAgICAgICBwcmVzZW5jZTogdHJ1ZSxcbiAgICAgICAgaXNTdHJpbmc6IHRydWUsXG4gICAgICAgIGluY2x1c2lvbjogWydEZWxvcmVhbicsICdSZXZlbnRvbiddXG4gICAgICB9XG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBkLmNyZWF0ZVNlc3Npb24obnVsbCwgbnVsbCwge1xuICAgICAgICBhbHdheXNNYXRjaDoge1xuICAgICAgICAgICdhcHBpdW06bmVjZXNzYXJ5JzogJ3l1cCdcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZS5zaG91bGQuYmUuaW5zdGFuY2VvZihlcnJvcnMuU2Vzc2lvbk5vdENyZWF0ZWRFcnJvcik7XG4gICAgICBlLm1lc3NhZ2Uuc2hvdWxkLmNvbnRhaW4oJ3BsYXRmb3JtTmFtZScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNob3VsZC5mYWlsKCdlcnJvciBzaG91bGQgaGF2ZSBiZWVuIHRocm93bicpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGFjY2VwdCBleHRyYSBjYXBhYmlsaXRpZXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgYXdhaXQgZC5jcmVhdGVTZXNzaW9uKG51bGwsIG51bGwsIHtcbiAgICAgIGFsd2F5c01hdGNoOiB7XG4gICAgICAgICdwbGF0Zm9ybU5hbWUnOiAnaU9TJyxcbiAgICAgICAgJ2FwcGl1bTpkZXZpY2VOYW1lJzogJ0RlbG9yZWFuJyxcbiAgICAgICAgJ2FwcGl1bTpleHRyYSc6ICdjaGVlc2UnLFxuICAgICAgICAnYXBwaXVtOmhvbGQgdGhlJzogJ3NhdWNlJ1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGxvZyB0aGUgdXNlIG9mIGV4dHJhIGNhcHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy50aW1lb3V0KDUwMCk7XG5cbiAgICBhd2FpdCBkLmNyZWF0ZVNlc3Npb24obnVsbCwgbnVsbCwge1xuICAgICAgYWx3YXlzTWF0Y2g6IHtcbiAgICAgICAgJ3BsYXRmb3JtTmFtZSc6ICdpT1MnLFxuICAgICAgICAnYXBwaXVtOmRldmljZU5hbWUnOiAnRGVsb3JlYW4nLFxuICAgICAgICAnYXBwaXVtOmV4dHJhJzogJ2NoZWVzZScsXG4gICAgICAgICdhcHBpdW06aG9sZCB0aGUnOiAnc2F1Y2UnXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBsb2dnZXIud2Fybi5jYWxsQ291bnQuc2hvdWxkLmJlLmFib3ZlKDApO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGJlIHNlbnNpdGl2ZSB0byB0aGUgY2FzZSBvZiBjYXBzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBkLmNyZWF0ZVNlc3Npb24obnVsbCwgbnVsbCwge1xuICAgICAgICBhbHdheXNNYXRjaDoge1xuICAgICAgICAgICdwbGF0Zm9ybW5hbWUnOiAnaU9TJyxcbiAgICAgICAgICAnYXBwaXVtOmRldmljZU5hbWUnOiAnRGVsb3JlYW4nXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGUuc2hvdWxkLmJlLmluc3RhbmNlb2YoZXJyb3JzLlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IpO1xuICAgICAgZS5tZXNzYWdlLnNob3VsZC5jb250YWluKCdwbGF0Zm9ybU5hbWUnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzaG91bGQuZmFpbCgnZXJyb3Igc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24nKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2Jvb2xlYW4gY2FwYWJpbGl0aWVzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgYWxsb3cgYSBzdHJpbmcgXCJmYWxzZVwiJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgZC5jcmVhdGVTZXNzaW9uKG51bGwsIG51bGwsIHtcbiAgICAgICAgYWx3YXlzTWF0Y2g6IHtcbiAgICAgICAgICAncGxhdGZvcm1OYW1lJzogJ2lPUycsXG4gICAgICAgICAgJ2FwcGl1bTpkZXZpY2VOYW1lJzogJ0RlbG9yZWFuJyxcbiAgICAgICAgICAnYXBwaXVtOm5vUmVzZXQnOiAnZmFsc2UnXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgbG9nZ2VyLndhcm4uY2FsbENvdW50LnNob3VsZC5iZS5hYm92ZSgwKTtcblxuICAgICAgbGV0IHNlc3Npb25zID0gYXdhaXQgZC5nZXRTZXNzaW9ucygpO1xuICAgICAgc2Vzc2lvbnNbMF0uY2FwYWJpbGl0aWVzLm5vUmVzZXQuc2hvdWxkLmVxbChmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFsbG93IGEgc3RyaW5nIFwidHJ1ZVwiJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgZC5jcmVhdGVTZXNzaW9uKG51bGwsIG51bGwsIHtcbiAgICAgICAgYWx3YXlzTWF0Y2g6IHtcbiAgICAgICAgICAncGxhdGZvcm1OYW1lJzogJ2lPUycsXG4gICAgICAgICAgJ2FwcGl1bTpkZXZpY2VOYW1lJzogJ0RlbG9yZWFuJyxcbiAgICAgICAgICAnYXBwaXVtOm5vUmVzZXQnOiAndHJ1ZSdcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBsb2dnZXIud2Fybi5jYWxsQ291bnQuc2hvdWxkLmJlLmFib3ZlKDApO1xuXG4gICAgICBsZXQgc2Vzc2lvbnMgPSBhd2FpdCBkLmdldFNlc3Npb25zKCk7XG4gICAgICBzZXNzaW9uc1swXS5jYXBhYmlsaXRpZXMubm9SZXNldC5zaG91bGQuZXFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhbGxvdyBhIHN0cmluZyBcInRydWVcIiBpbiBzdHJpbmcgY2FwYWJpbGl0aWVzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgZC5jcmVhdGVTZXNzaW9uKG51bGwsIG51bGwsIHtcbiAgICAgICAgYWx3YXlzTWF0Y2g6IHtcbiAgICAgICAgICAncGxhdGZvcm1OYW1lJzogJ2lPUycsXG4gICAgICAgICAgJ2FwcGl1bTpkZXZpY2VOYW1lJzogJ0RlbG9yZWFuJyxcbiAgICAgICAgICAnYXBwaXVtOmxhbmd1YWdlJzogJ3RydWUnXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgbG9nZ2VyLndhcm4uY2FsbENvdW50LnNob3VsZC5lcXVhbCgwKTtcblxuICAgICAgbGV0IHNlc3Npb25zID0gYXdhaXQgZC5nZXRTZXNzaW9ucygpO1xuICAgICAgc2Vzc2lvbnNbMF0uY2FwYWJpbGl0aWVzLmxhbmd1YWdlLnNob3VsZC5lcWwoJ3RydWUnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ251bWJlciBjYXBhYmlsaXRpZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBhbGxvdyBhIHN0cmluZyBcIjFcIicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGQuY3JlYXRlU2Vzc2lvbihudWxsLCBudWxsLCB7XG4gICAgICAgIGFsd2F5c01hdGNoOiB7XG4gICAgICAgICAgJ3BsYXRmb3JtTmFtZSc6ICdpT1MnLFxuICAgICAgICAgICdhcHBpdW06ZGV2aWNlTmFtZSc6ICdEZWxvcmVhbicsXG4gICAgICAgICAgJ2FwcGl1bTpuZXdDb21tYW5kVGltZW91dCc6ICcxJ1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGxvZ2dlci53YXJuLmNhbGxDb3VudC5zaG91bGQuYmUuYWJvdmUoMCk7XG5cbiAgICAgIGxldCBzZXNzaW9ucyA9IGF3YWl0IGQuZ2V0U2Vzc2lvbnMoKTtcbiAgICAgIHNlc3Npb25zWzBdLmNhcGFiaWxpdGllcy5uZXdDb21tYW5kVGltZW91dC5zaG91bGQuZXFsKDEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhbGxvdyBhIHN0cmluZyBcIjEuMVwiJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgZC5jcmVhdGVTZXNzaW9uKG51bGwsIG51bGwsIHtcbiAgICAgICAgYWx3YXlzTWF0Y2g6IHtcbiAgICAgICAgICAncGxhdGZvcm1OYW1lJzogJ2lPUycsXG4gICAgICAgICAgJ2FwcGl1bTpkZXZpY2VOYW1lJzogJ0RlbG9yZWFuJyxcbiAgICAgICAgICAnYXBwaXVtOm5ld0NvbW1hbmRUaW1lb3V0JzogJzEuMSdcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBsb2dnZXIud2Fybi5jYWxsQ291bnQuc2hvdWxkLmJlLmFib3ZlKDApO1xuXG4gICAgICBsZXQgc2Vzc2lvbnMgPSBhd2FpdCBkLmdldFNlc3Npb25zKCk7XG4gICAgICBzZXNzaW9uc1swXS5jYXBhYmlsaXRpZXMubmV3Q29tbWFuZFRpbWVvdXQuc2hvdWxkLmVxbCgxLjEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhbGxvdyBhIHN0cmluZyBcIjFcIiBpbiBzdHJpbmcgY2FwYWJpbGl0aWVzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgZC5jcmVhdGVTZXNzaW9uKG51bGwsIG51bGwsIHtcbiAgICAgICAgYWx3YXlzTWF0Y2g6IHtcbiAgICAgICAgICAncGxhdGZvcm1OYW1lJzogJ2lPUycsXG4gICAgICAgICAgJ2FwcGl1bTpkZXZpY2VOYW1lJzogJ0RlbG9yZWFuJyxcbiAgICAgICAgICAnYXBwaXVtOmxhbmd1YWdlJzogJzEnXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgbG9nZ2VyLndhcm4uY2FsbENvdW50LnNob3VsZC5lcXVhbCgwKTtcblxuICAgICAgbGV0IHNlc3Npb25zID0gYXdhaXQgZC5nZXRTZXNzaW9ucygpO1xuICAgICAgc2Vzc2lvbnNbMF0uY2FwYWJpbGl0aWVzLmxhbmd1YWdlLnNob3VsZC5lcWwoJzEnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQgKCdzaG91bGQgZXJyb3IgaWYgb2JqZWN0cyBpbiBjYXBzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBkLmNyZWF0ZVNlc3Npb24obnVsbCwgbnVsbCwge1xuICAgICAgICBhbHdheXNNYXRjaDoge1xuICAgICAgICAgICdwbGF0Zm9ybU5hbWUnOiB7YTogJ2lPUyd9LFxuICAgICAgICAgICdhcHBpdW06ZGV2aWNlTmFtZSc6ICdEZWxvcmVhbidcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZS5zaG91bGQuYmUuaW5zdGFuY2VvZihlcnJvcnMuU2Vzc2lvbk5vdENyZWF0ZWRFcnJvcik7XG4gICAgICBlLm1lc3NhZ2Uuc2hvdWxkLmNvbnRhaW4oJ3BsYXRmb3JtTmFtZScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNob3VsZC5mYWlsKCdlcnJvciBzaG91bGQgaGF2ZSBiZWVuIHRocm93bicpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGNoZWNrIGZvciBkZXByZWNhdGVkIGNhcHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy50aW1lb3V0KDUwMCk7XG5cbiAgICBkLmRlc2lyZWRDYXBDb25zdHJhaW50cyA9IHtcbiAgICAgICdseW54LXZlcnNpb24nOiB7XG4gICAgICAgIGRlcHJlY2F0ZWQ6IHRydWVcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgYXdhaXQgZC5jcmVhdGVTZXNzaW9uKG51bGwsIG51bGwsIHtcbiAgICAgIGFsd2F5c01hdGNoOiB7XG4gICAgICAgICdwbGF0Zm9ybU5hbWUnOiAnaU9TJyxcbiAgICAgICAgJ2FwcGl1bTpkZXZpY2VOYW1lJzogJ0RlbG9yZWFuJyxcbiAgICAgICAgJ2FwcGl1bTpseW54LXZlcnNpb24nOiA1XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBsb2dnZXIud2Fybi5jYWxsQ291bnQuc2hvdWxkLmJlLmFib3ZlKDApO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIG5vdCB3YXJuIGlmIGRlcHJlY2F0ZWQ9ZmFsc2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy50aW1lb3V0KDUwMCk7XG5cbiAgICBkLmRlc2lyZWRDYXBDb25zdHJhaW50cyA9IHtcbiAgICAgICdseW54LXZlcnNpb24nOiB7XG4gICAgICAgIGRlcHJlY2F0ZWQ6IGZhbHNlXG4gICAgICB9XG4gICAgfTtcblxuICAgIGF3YWl0IGQuY3JlYXRlU2Vzc2lvbihudWxsLCBudWxsLCB7XG4gICAgICBhbHdheXNNYXRjaDoge1xuICAgICAgICAncGxhdGZvcm1OYW1lJzogJ2lPUycsXG4gICAgICAgICdhcHBpdW06ZGV2aWNlTmFtZSc6ICdEZWxvcmVhbicsXG4gICAgICAgICdhcHBpdW06bHlueC12ZXJzaW9uJzogNVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbG9nZ2VyLndhcm4uY2FsbENvdW50LnNob3VsZC5lcXVhbCgwKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBub3QgdmFsaWRhdGUgYWdhaW5zdCBudWxsL3VuZGVmaW5lZCBjYXBzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGQuZGVzaXJlZENhcENvbnN0cmFpbnRzID0ge1xuICAgICAgJ2Zvbyc6IHtcbiAgICAgICAgaXNTdHJpbmc6IHRydWVcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgYXdhaXQgZC5jcmVhdGVTZXNzaW9uKG51bGwsIG51bGwsIHtcbiAgICAgIGFsd2F5c01hdGNoOiB7XG4gICAgICAgIHBsYXRmb3JtTmFtZTogJ2lPUycsXG4gICAgICAgICdhcHBpdW06ZGV2aWNlTmFtZSc6ICdEdW1iJyxcbiAgICAgICAgJ2FwcGl1bTpmb28nOiBudWxsXG4gICAgICB9XG4gICAgfSk7XG4gICAgYXdhaXQgZC5kZWxldGVTZXNzaW9uKCk7XG5cbiAgICBhd2FpdCBkLmNyZWF0ZVNlc3Npb24obnVsbCwgbnVsbCwge1xuICAgICAgYWx3YXlzTWF0Y2g6IHtcbiAgICAgICAgcGxhdGZvcm1OYW1lOiAnaU9TJyxcbiAgICAgICAgJ2FwcGl1bTpkZXZpY2VOYW1lJzogJ0R1bWInLFxuICAgICAgICAnYXBwaXVtOmZvbyc6IDFcbiAgICAgIH1cbiAgICB9KS5zaG91bGQuZXZlbnR1YWxseS5iZS5yZWplY3RlZFdpdGgoLydmb28nIG11c3QgYmUgb2YgdHlwZSBzdHJpbmcvKTtcblxuICAgIGF3YWl0IGQuY3JlYXRlU2Vzc2lvbihudWxsLCBudWxsLCB7XG4gICAgICBhbHdheXNNYXRjaDoge1xuICAgICAgICBwbGF0Zm9ybU5hbWU6ICdpT1MnLFxuICAgICAgICAnYXBwaXVtOmRldmljZU5hbWUnOiAnRHVtYicsXG4gICAgICAgICdhcHBpdW06Zm9vJzogdW5kZWZpbmVkXG4gICAgICB9XG4gICAgfSk7XG4gICAgYXdhaXQgZC5kZWxldGVTZXNzaW9uKCk7XG5cbiAgICBhd2FpdCBkLmNyZWF0ZVNlc3Npb24obnVsbCwgbnVsbCwge1xuICAgICAgYWx3YXlzTWF0Y2g6IHtcbiAgICAgICAgcGxhdGZvcm1OYW1lOiAnaU9TJyxcbiAgICAgICAgJ2FwcGl1bTpkZXZpY2VOYW1lJzogJ0R1bWInLFxuICAgICAgICAnYXBwaXVtOmZvbyc6ICcnXG4gICAgICB9XG4gICAgfSk7XG4gICAgYXdhaXQgZC5kZWxldGVTZXNzaW9uKCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgc3RpbGwgdmFsaWRhdGUgbnVsbC91bmRlZmluZWQvZW1wdHkgY2FwcyB3aG9zZSBwcmVzZW5jZSBpcyByZXF1aXJlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBkLmRlc2lyZWRDYXBDb25zdHJhaW50cyA9IHtcbiAgICAgIGZvbzoge1xuICAgICAgICBwcmVzZW5jZTogdHJ1ZVxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgYXdhaXQgZC5jcmVhdGVTZXNzaW9uKG51bGwsIG51bGwsIHtcbiAgICAgIGFsd2F5c01hdGNoOiB7XG4gICAgICAgIHBsYXRmb3JtTmFtZTogJ2lPUycsXG4gICAgICAgICdhcHBpdW06ZGV2aWNlTmFtZSc6ICdEdW1iJyxcbiAgICAgICAgJ2FwcGl1bTpmb28nOiBudWxsXG4gICAgICB9XG4gICAgfSkuc2hvdWxkLmV2ZW50dWFsbHkuYmUucmVqZWN0ZWRXaXRoKC9ibGFuay8pO1xuXG4gICAgYXdhaXQgZC5jcmVhdGVTZXNzaW9uKG51bGwsIG51bGwsIHtcbiAgICAgIHBsYXRmb3JtTmFtZTogJ2lPUycsXG4gICAgICAnYXBwaXVtOmRldmljZU5hbWUnOiAnRHVtYicsXG4gICAgICAnYXBwaXVtOmZvbyc6ICcnXG4gICAgfSkuc2hvdWxkLmV2ZW50dWFsbHkuYmUucmVqZWN0ZWRXaXRoKC9ibGFuay8pO1xuXG4gICAgYXdhaXQgZC5jcmVhdGVTZXNzaW9uKG51bGwsIG51bGwsIHtcbiAgICAgIHBsYXRmb3JtTmFtZTogJ2lPUycsXG4gICAgICAnYXBwaXVtOmRldmljZU5hbWUnOiAnRHVtYicsXG4gICAgICAnYXBwaXVtOmZvbyc6IHt9XG4gICAgfSkuc2hvdWxkLmV2ZW50dWFsbHkuYmUucmVqZWN0ZWRXaXRoKC9ibGFuay8pO1xuXG4gICAgYXdhaXQgZC5jcmVhdGVTZXNzaW9uKG51bGwsIG51bGwsIHtcbiAgICAgIHBsYXRmb3JtTmFtZTogJ2lPUycsXG4gICAgICAnYXBwaXVtOmRldmljZU5hbWUnOiAnRHVtYicsXG4gICAgICAnYXBwaXVtOmZvbyc6IFtdXG4gICAgfSkuc2hvdWxkLmV2ZW50dWFsbHkuYmUucmVqZWN0ZWRXaXRoKC9ibGFuay8pO1xuXG4gICAgYXdhaXQgZC5jcmVhdGVTZXNzaW9uKG51bGwsIG51bGwsIHtcbiAgICAgIHBsYXRmb3JtTmFtZTogJ2lPUycsXG4gICAgICAnYXBwaXVtOmRldmljZU5hbWUnOiAnRHVtYicsXG4gICAgICAnYXBwaXVtOmZvbyc6ICcgICdcbiAgICB9KS5zaG91bGQuZXZlbnR1YWxseS5iZS5yZWplY3RlZFdpdGgoL2JsYW5rLyk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd3M2MnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgdzNjIGNhcGFiaWxpdGllcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IFtzZXNzaW9uSWQsIGNhcHNdID0gYXdhaXQgZC5jcmVhdGVTZXNzaW9uKG51bGwsIG51bGwsIHtcbiAgICAgICAgYWx3YXlzTWF0Y2g6IHtcbiAgICAgICAgICBwbGF0Zm9ybU5hbWU6ICdpT1MnLFxuICAgICAgICAgICdhcHBpdW06ZGV2aWNlTmFtZSc6ICdEZWxvcmVhbidcbiAgICAgICAgfSwgZmlyc3RNYXRjaDogW3t9XSxcbiAgICAgIH0pO1xuICAgICAgc2Vzc2lvbklkLnNob3VsZC5leGlzdDtcbiAgICAgIGNhcHMuc2hvdWxkLmVxbCh7XG4gICAgICAgIHBsYXRmb3JtTmFtZTogJ2lPUycsXG4gICAgICAgIGRldmljZU5hbWU6ICdEZWxvcmVhbicsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGQuZGVsZXRlU2Vzc2lvbigpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByYWlzZSBhbiBlcnJvciBpZiB3M2MgY2FwYWJpbGl0aWVzIGlzIG5vdCBhIHBsYWluIEpTT04gb2JqZWN0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgZm9yIChjb25zdCB2YWwgb2YgW3RydWUsICdzdHJpbmcnLCBbXSwgMTAwXSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGQuY3JlYXRlU2Vzc2lvbihudWxsLCBudWxsLCB2YWwpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgZS5zaG91bGQuYmUuaW5zdGFuY2VvZihlcnJvcnMuU2Vzc2lvbk5vdENyZWF0ZWRFcnJvcik7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgc2hvdWxkLmZhaWwoJ2Vycm9yIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwiZmlsZSI6InRlc3QvYmFzZWRyaXZlci9jYXBhYmlsaXR5LXNwZWNzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
355
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvYmFzZWRyaXZlci9jYXBhYmlsaXR5LXNwZWNzLmpzIl0sIm5hbWVzIjpbImRlc2NyaWJlIiwiZCIsInNhbmRib3giLCJiZWZvcmVFYWNoIiwiQmFzZURyaXZlciIsInNweSIsImxvZyIsImxvZ2dlciIsImFmdGVyRWFjaCIsInJlc3RvcmUiLCJpdCIsImNyZWF0ZVNlc3Npb24iLCJmaXJzdE1hdGNoIiwic2hvdWxkIiwiZXZlbnR1YWxseSIsImJlIiwicmVqZWN0ZWRXaXRoIiwiZXJyb3JzIiwiU2Vzc2lvbk5vdENyZWF0ZWRFcnJvciIsImFsd2F5c01hdGNoIiwicGxhdGZvcm1OYW1lIiwiZnVsZmlsbGVkIiwiZGVzaXJlZENhcENvbnN0cmFpbnRzIiwibmVjZXNzYXJ5IiwicHJlc2VuY2UiLCJwcm9wZXIiLCJpc1N0cmluZyIsImluY2x1c2lvbiIsInRpbWVvdXQiLCJ3YXJuIiwiaGF2ZSIsImJlZW4iLCJjYWxsZWQiLCJzZXNzaW9ucyIsImdldFNlc3Npb25zIiwiY2FwYWJpbGl0aWVzIiwibm9SZXNldCIsImVxbCIsIm5vdCIsImxhbmd1YWdlIiwibmV3Q29tbWFuZFRpbWVvdXQiLCJhIiwiZGVwcmVjYXRlZCIsImRlbGV0ZVNlc3Npb24iLCJ1bmRlZmluZWQiLCJmb28iLCJzZXNzaW9uSWQiLCJjYXBzIiwiZXhpc3QiLCJkZXZpY2VOYW1lIiwidGVzdFZhbHVlcyIsIkIiLCJtYXAiLCJ2YWwiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUVBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7QUFFQUEsUUFBUSxDQUFDLHNCQUFELEVBQXlCLFlBQVk7QUFDM0MsTUFBSUMsQ0FBSjtBQUNBLE1BQUlDLE9BQUo7QUFFQUMsRUFBQUEsVUFBVSxDQUFDLFlBQVk7QUFDckJGLElBQUFBLENBQUMsR0FBRyxJQUFJRyxZQUFKLEVBQUo7QUFDQUYsSUFBQUEsT0FBTyxHQUFHLDJCQUFWO0FBQ0FBLElBQUFBLE9BQU8sQ0FBQ0csR0FBUixDQUFZSixDQUFDLENBQUNL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QUFBLFdBQVcsRUFBRTtBQUNYQyxVQUFBQSxZQUFZLEVBQUUsS0FESDtBQUVYLCtCQUFxQjtBQUZWLFNBRDZDO0FBSXZEUixRQUFBQSxVQUFVLEVBQUUsQ0FBQyxFQUFEO0FBSjJDLE9BQTVCLENBQWhDOztBQU1BLFVBQUk7QUFDRmtDLFFBQUFBLFNBQVMsQ0FBQ2pDLE1BQVYsQ0FBaUJtQyxLQUFqQjtBQUNBRCxRQUFBQSxJQUFJLENBQUNsQyxNQUFMLENBQVl3QixHQUFaLENBQWdCO0FBQ2RqQixVQUFBQSxZQUFZLEVBQUUsS0FEQTtBQUVkNkIsVUFBQUEsVUFBVSxFQUFFO0FBRkUsU0FBaEI7QUFJRCxPQU5ELFNBTVU7QUFDUixjQUFNaEQsQ0FBQyxDQUFDMEMsYUFBRixFQUFOO0FBQ0Q7QUFDRixLQWhCQyxDQUFGO0FBa0JBakMsSUFBQUEsRUFBRSxDQUFDLHNFQUFELEVBQXlFLGtCQUFrQjtBQUMzRixZQUFNd0MsVUFBVSxHQUFHLENBQUMsSUFBRCxFQUFPLFFBQVAsRUFBaUIsRUFBakIsRUFBcUIsR0FBckIsQ0FBbkI7QUFFQSxZQUFNQyxrQkFBRUMsR0FBRixDQUFNRixVQUFOLEVBQW1CRyxHQUFELElBQVNwRCxDQUFDLENBQUNVLGFBQUYsQ0FBZ0IsSUFBaEIsRUFBc0IsSUFBdEIsRUFBNEIwQyxHQUE1QixFQUFpQ3hDLE1BQWpDLENBQXdDQyxVQUF4QyxDQUFtREMsRUFBbkQsQ0FBc0RDLFlBQXRELENBQW1FQyxZQUFPQyxzQkFBMUUsQ0FBM0IsQ0FBTjtBQUNELEtBSkMsQ0FBRjtBQUtELEdBeEJPLENBQVI7QUF5QkQsQ0F2WE8sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyBkZWZhdWx0IGFzIEJhc2VEcml2ZXIsIGVycm9ycyB9IGZyb20gJy4uLy4uL2xpYic7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4uLy4uL2xpYi9iYXNlZHJpdmVyL2xvZ2dlcic7XG5pbXBvcnQgeyBjcmVhdGVTYW5kYm94IH0gZnJvbSAnc2lub24nO1xuXG5kZXNjcmliZSgnRGVzaXJlZCBDYXBhYmlsaXRpZXMnLCBmdW5jdGlvbiAoKSB7XG4gIGxldCBkO1xuICBsZXQgc2FuZGJveDtcblxuICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBkID0gbmV3IEJhc2VEcml2ZXIoKTtcbiAgICBzYW5kYm94ID0gY3JlYXRlU2FuZGJveCgpO1xuICAgIHNhbmRib3guc3B5KGQubG9nLCAnd2FybicpO1xuICAgIHNhbmRib3guc3B5KGxvZ2dlciwgJ3dhcm4nKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzYW5kYm94LnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCByZXF1aXJlIHBsYXRmb3JtTmFtZSBhbmQgZGV2aWNlTmFtZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBhd2FpdCBkLmNyZWF0ZVNlc3Npb24oe1xuICAgICAgZmlyc3RNYXRjaDogW3t9XVxuICAgIH0pLnNob3VsZC5ldmVudHVhbGx5LmJlLnJlamVjdGVkV2l0aChlcnJvcnMuU2Vzc2lvbk5vdENyZWF0ZWRFcnJvciwgL3BsYXRmb3JtTmFtZS8pO1xuICB9KTtcblxuXG4gIGl0KCdzaG91bGQgcmVxdWlyZSBwbGF0Zm9ybU5hbWUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgYXdhaXQgZC5jcmVhdGVTZXNzaW9uKHtcbiAgICAgIGFsd2F5c01hdGNoOiB7XG4gICAgICAgICdhcHBpdW06ZGV2aWNlTmFtZSc6ICdEZWxvcmVhbidcbiAgICAgIH1cbiAgICB9KS5zaG91bGQuZXZlbnR1YWxseS5iZS5yZWplY3RlZFdpdGgoZXJyb3JzLlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IsIC9wbGF0Zm9ybU5hbWUvKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBub3QgY2FyZSBhYm91dCBjYXAgb3JkZXInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgYXdhaXQgZC5jcmVhdGVTZXNzaW9uKG51bGwsIG51bGwsIHtcbiAgICAgIGFsd2F5c01hdGNoOiB7XG4gICAgICAgICdhcHBpdW06ZGV2aWNlTmFtZSc6ICdEZWxvcmVhbicsXG4gICAgICAgIHBsYXRmb3JtTmFtZTogJ2lPUydcbiAgICAgIH1cbiAgICB9KS5zaG91bGQuZXZlbnR1YWxseS5iZS5mdWxmaWxsZWQ7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgY2hlY2sgcmVxdWlyZWQgY2FwcyB3aGljaCBhcmUgYWRkZWQgdG8gZHJpdmVyJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGQuZGVzaXJlZENhcENvbnN0cmFpbnRzID0ge1xuICAgICAgbmVjZXNzYXJ5OiB7XG4gICAgICAgIHByZXNlbmNlOiB0cnVlXG4gICAgICB9LFxuICAgICAgcHJvcGVyOiB7XG4gICAgICAgIHByZXNlbmNlOiB0cnVlLFxuICAgICAgICBpc1N0cmluZzogdHJ1ZSxcbiAgICAgICAgaW5jbHVzaW9uOiBbJ0RlbG9yZWFuJywgJ1JldmVudG9uJ11cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgYXdhaXQgZC5jcmVhdGVTZXNzaW9uKG51bGwsIG51bGwsIHtcbiAgICAgIGFsd2F5c01hdGNoOiB7XG4gICAgICAgICdwbGF0Zm9ybU5hbWUnOiAnaU9TJyxcbiAgICAgICAgJ2FwcGl1bTpkZXZpY2VOYW1lJzogJ0RlbG9yZWFuJ1xuICAgICAgfVxuICAgIH0pLnNob3VsZC5ldmVudHVhbGx5LmJlLnJlamVjdGVkV2l0aChlcnJvcnMuU2Vzc2lvbk5vdENyZWF0ZWRFcnJvciwgL25lY2Vzc2FyeS4qcHJvcGVyLyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgY2hlY2sgYWRkZWQgcmVxdWlyZWQgY2FwcyBpbiBhZGRpdGlvbiB0byBiYXNlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGQuZGVzaXJlZENhcENvbnN0cmFpbnRzID0ge1xuICAgICAgbmVjZXNzYXJ5OiB7XG4gICAgICAgIHByZXNlbmNlOiB0cnVlXG4gICAgICB9LFxuICAgICAgcHJvcGVyOiB7XG4gICAgICAgIHByZXNlbmNlOiB0cnVlLFxuICAgICAgICBpc1N0cmluZzogdHJ1ZSxcbiAgICAgICAgaW5jbHVzaW9uOiBbJ0RlbG9yZWFuJywgJ1JldmVudG9uJ11cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgYXdhaXQgZC5jcmVhdGVTZXNzaW9uKG51bGwsIG51bGwsIHtcbiAgICAgIGFsd2F5c01hdGNoOiB7XG4gICAgICAgICdhcHBpdW06bmVjZXNzYXJ5JzogJ3l1cCdcbiAgICAgIH1cbiAgICB9KS5zaG91bGQuZXZlbnR1YWxseS5iZS5yZWplY3RlZFdpdGgoZXJyb3JzLlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IsIC9wbGF0Zm9ybU5hbWUvKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBhY2NlcHQgZXh0cmEgY2FwYWJpbGl0aWVzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGF3YWl0IGQuY3JlYXRlU2Vzc2lvbihudWxsLCBudWxsLCB7XG4gICAgICBhbHdheXNNYXRjaDoge1xuICAgICAgICAncGxhdGZvcm1OYW1lJzogJ2lPUycsXG4gICAgICAgICdhcHBpdW06ZGV2aWNlTmFtZSc6ICdEZWxvcmVhbicsXG4gICAgICAgICdhcHBpdW06ZXh0cmEnOiAnY2hlZXNlJyxcbiAgICAgICAgJ2FwcGl1bTpob2xkIHRoZSc6ICdzYXVjZSdcbiAgICAgIH1cbiAgICB9KS5zaG91bGQuZXZlbnR1YWxseS5iZS5mdWxmaWxsZWQ7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgbG9nIHRoZSB1c2Ugb2YgZXh0cmEgY2FwcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnRpbWVvdXQoNTAwKTtcblxuICAgIGF3YWl0IGQuY3JlYXRlU2Vzc2lvbihudWxsLCBudWxsLCB7XG4gICAgICBhbHdheXNNYXRjaDoge1xuICAgICAgICAncGxhdGZvcm1OYW1lJzogJ2lPUycsXG4gICAgICAgICdhcHBpdW06ZGV2aWNlTmFtZSc6ICdEZWxvcmVhbicsXG4gICAgICAgICdhcHBpdW06ZXh0cmEnOiAnY2hlZXNlJyxcbiAgICAgICAgJ2FwcGl1bTpob2xkIHRoZSc6ICdzYXVjZSdcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGQubG9nLndhcm4uc2hvdWxkLmhhdmUuYmVlbi5jYWxsZWQ7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYmUgc2Vuc2l0aXZlIHRvIHRoZSBjYXNlIG9mIGNhcHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgYXdhaXQgZC5jcmVhdGVTZXNzaW9uKG51bGwsIG51bGwsIHtcbiAgICAgIGFsd2F5c01hdGNoOiB7XG4gICAgICAgICdwbGF0Zm9ybW5hbWUnOiAnaU9TJyxcbiAgICAgICAgJ2FwcGl1bTpkZXZpY2VOYW1lJzogJ0RlbG9yZWFuJ1xuICAgICAgfVxuICAgIH0pLnNob3VsZC5ldmVudHVhbGx5LmJlLnJlamVjdGVkV2l0aChlcnJvcnMuU2Vzc2lvbk5vdENyZWF0ZWRFcnJvciwgL3BsYXRmb3JtTmFtZS8pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYm9vbGVhbiBjYXBhYmlsaXRpZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBhbGxvdyBhIHN0cmluZyBcImZhbHNlXCInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBkLmNyZWF0ZVNlc3Npb24obnVsbCwgbnVsbCwge1xuICAgICAgICBhbHdheXNNYXRjaDoge1xuICAgICAgICAgICdwbGF0Zm9ybU5hbWUnOiAnaU9TJyxcbiAgICAgICAgICAnYXBwaXVtOmRldmljZU5hbWUnOiAnRGVsb3JlYW4nLFxuICAgICAgICAgICdhcHBpdW06bm9SZXNldCc6ICdmYWxzZSdcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBkLmxvZy53YXJuLnNob3VsZC5oYXZlLmJlZW4uY2FsbGVkO1xuXG4gICAgICBsZXQgc2Vzc2lvbnMgPSBhd2FpdCBkLmdldFNlc3Npb25zKCk7XG4gICAgICBzZXNzaW9uc1swXS5jYXBhYmlsaXRpZXMubm9SZXNldC5zaG91bGQuZXFsKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWxsb3cgYSBzdHJpbmcgXCJ0cnVlXCInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBkLmNyZWF0ZVNlc3Npb24obnVsbCwgbnVsbCwge1xuICAgICAgICBhbHdheXNNYXRjaDoge1xuICAgICAgICAgICdwbGF0Zm9ybU5hbWUnOiAnaU9TJyxcbiAgICAgICAgICAnYXBwaXVtOmRldmljZU5hbWUnOiAnRGVsb3JlYW4nLFxuICAgICAgICAgICdhcHBpdW06bm9SZXNldCc6ICd0cnVlJ1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGQubG9nLndhcm4uc2hvdWxkLmhhdmUuYmVlbi5jYWxsZWQ7XG5cbiAgICAgIGxldCBzZXNzaW9ucyA9IGF3YWl0IGQuZ2V0U2Vzc2lvbnMoKTtcbiAgICAgIHNlc3Npb25zWzBdLmNhcGFiaWxpdGllcy5ub1Jlc2V0LnNob3VsZC5lcWwodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFsbG93IGEgc3RyaW5nIFwidHJ1ZVwiIGluIHN0cmluZyBjYXBhYmlsaXRpZXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBkLmNyZWF0ZVNlc3Npb24obnVsbCwgbnVsbCwge1xuICAgICAgICBhbHdheXNNYXRjaDoge1xuICAgICAgICAgICdwbGF0Zm9ybU5hbWUnOiAnaU9TJyxcbiAgICAgICAgICAnYXBwaXVtOmRldmljZU5hbWUnOiAnRGVsb3JlYW4nLFxuICAgICAgICAgICdhcHBpdW06bGFuZ3VhZ2UnOiAndHJ1ZSdcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBkLmxvZy53YXJuLnNob3VsZC5ub3QuaGF2ZS5iZWVuLmNhbGxlZDtcblxuICAgICAgbGV0IHNlc3Npb25zID0gYXdhaXQgZC5nZXRTZXNzaW9ucygpO1xuICAgICAgc2Vzc2lvbnNbMF0uY2FwYWJpbGl0aWVzLmxhbmd1YWdlLnNob3VsZC5lcWwoJ3RydWUnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ251bWJlciBjYXBhYmlsaXRpZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBhbGxvdyBhIHN0cmluZyBcIjFcIicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGQuY3JlYXRlU2Vzc2lvbihudWxsLCBudWxsLCB7XG4gICAgICAgIGFsd2F5c01hdGNoOiB7XG4gICAgICAgICAgJ3BsYXRmb3JtTmFtZSc6ICdpT1MnLFxuICAgICAgICAgICdhcHBpdW06ZGV2aWNlTmFtZSc6ICdEZWxvcmVhbicsXG4gICAgICAgICAgJ2FwcGl1bTpuZXdDb21tYW5kVGltZW91dCc6ICcxJ1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGQubG9nLndhcm4uc2hvdWxkLmhhdmUuYmVlbi5jYWxsZWQ7XG5cbiAgICAgIGxldCBzZXNzaW9ucyA9IGF3YWl0IGQuZ2V0U2Vzc2lvbnMoKTtcbiAgICAgIHNlc3Npb25zWzBdLmNhcGFiaWxpdGllcy5uZXdDb21tYW5kVGltZW91dC5zaG91bGQuZXFsKDEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhbGxvdyBhIHN0cmluZyBcIjEuMVwiJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgZC5jcmVhdGVTZXNzaW9uKG51bGwsIG51bGwsIHtcbiAgICAgICAgYWx3YXlzTWF0Y2g6IHtcbiAgICAgICAgICAncGxhdGZvcm1OYW1lJzogJ2lPUycsXG4gICAgICAgICAgJ2FwcGl1bTpkZXZpY2VOYW1lJzogJ0RlbG9yZWFuJyxcbiAgICAgICAgICAnYXBwaXVtOm5ld0NvbW1hbmRUaW1lb3V0JzogJzEuMSdcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBkLmxvZy53YXJuLnNob3VsZC5oYXZlLmJlZW4uY2FsbGVkO1xuXG4gICAgICBsZXQgc2Vzc2lvbnMgPSBhd2FpdCBkLmdldFNlc3Npb25zKCk7XG4gICAgICBzZXNzaW9uc1swXS5jYXBhYmlsaXRpZXMubmV3Q29tbWFuZFRpbWVvdXQuc2hvdWxkLmVxbCgxLjEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhbGxvdyBhIHN0cmluZyBcIjFcIiBpbiBzdHJpbmcgY2FwYWJpbGl0aWVzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgZC5jcmVhdGVTZXNzaW9uKG51bGwsIG51bGwsIHtcbiAgICAgICAgYWx3YXlzTWF0Y2g6IHtcbiAgICAgICAgICAncGxhdGZvcm1OYW1lJzogJ2lPUycsXG4gICAgICAgICAgJ2FwcGl1bTpkZXZpY2VOYW1lJzogJ0RlbG9yZWFuJyxcbiAgICAgICAgICAnYXBwaXVtOmxhbmd1YWdlJzogJzEnXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgZC5sb2cud2Fybi5zaG91bGQubm90LmhhdmUuYmVlbi5jYWxsZWQ7XG5cbiAgICAgIGxldCBzZXNzaW9ucyA9IGF3YWl0IGQuZ2V0U2Vzc2lvbnMoKTtcbiAgICAgIHNlc3Npb25zWzBdLmNhcGFiaWxpdGllcy5sYW5ndWFnZS5zaG91bGQuZXFsKCcxJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0ICgnc2hvdWxkIGVycm9yIGlmIG9iamVjdHMgaW4gY2FwcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBhd2FpdCBkLmNyZWF0ZVNlc3Npb24obnVsbCwgbnVsbCwge1xuICAgICAgYWx3YXlzTWF0Y2g6IHtcbiAgICAgICAgJ3BsYXRmb3JtTmFtZSc6IHthOiAnaU9TJ30sXG4gICAgICAgICdhcHBpdW06ZGV2aWNlTmFtZSc6ICdEZWxvcmVhbidcbiAgICAgIH1cbiAgICB9KS5zaG91bGQuZXZlbnR1YWxseS5iZS5yZWplY3RlZFdpdGgoZXJyb3JzLlNlc3Npb25Ob3RDcmVhdGVkRXJyb3IsIC9wbGF0Zm9ybU5hbWUvaSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgY2hlY2sgZm9yIGRlcHJlY2F0ZWQgY2FwcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnRpbWVvdXQoNTAwKTtcblxuICAgIGQuZGVzaXJlZENhcENvbnN0cmFpbnRzID0ge1xuICAgICAgJ2x5bngtdmVyc2lvbic6IHtcbiAgICAgICAgZGVwcmVjYXRlZDogdHJ1ZVxuICAgICAgfVxuICAgIH07XG5cbiAgICBhd2FpdCBkLmNyZWF0ZVNlc3Npb24obnVsbCwgbnVsbCwge1xuICAgICAgYWx3YXlzTWF0Y2g6IHtcbiAgICAgICAgJ3BsYXRmb3JtTmFtZSc6ICdpT1MnLFxuICAgICAgICAnYXBwaXVtOmRldmljZU5hbWUnOiAnRGVsb3JlYW4nLFxuICAgICAgICAnYXBwaXVtOmx5bngtdmVyc2lvbic6IDVcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGxvZ2dlci53YXJuLnNob3VsZC5oYXZlLmJlZW4uY2FsbGVkO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIG5vdCB3YXJuIGlmIGRlcHJlY2F0ZWQ9ZmFsc2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy50aW1lb3V0KDUwMCk7XG5cbiAgICBkLmRlc2lyZWRDYXBDb25zdHJhaW50cyA9IHtcbiAgICAgICdseW54LXZlcnNpb24nOiB7XG4gICAgICAgIGRlcHJlY2F0ZWQ6IGZhbHNlXG4gICAgICB9XG4gICAgfTtcblxuICAgIGF3YWl0IGQuY3JlYXRlU2Vzc2lvbihudWxsLCBudWxsLCB7XG4gICAgICBhbHdheXNNYXRjaDoge1xuICAgICAgICAncGxhdGZvcm1OYW1lJzogJ2lPUycsXG4gICAgICAgICdhcHBpdW06ZGV2aWNlTmFtZSc6ICdEZWxvcmVhbicsXG4gICAgICAgICdhcHBpdW06bHlueC12ZXJzaW9uJzogNVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZC5sb2cud2Fybi5zaG91bGQubm90LmhhdmUuYmVlbi5jYWxsZWQ7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgbm90IHZhbGlkYXRlIGFnYWluc3QgbnVsbC91bmRlZmluZWQgY2FwcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBkLmRlc2lyZWRDYXBDb25zdHJhaW50cyA9IHtcbiAgICAgICdmb28nOiB7XG4gICAgICAgIGlzU3RyaW5nOiB0cnVlXG4gICAgICB9XG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBkLmNyZWF0ZVNlc3Npb24obnVsbCwgbnVsbCwge1xuICAgICAgICBhbHdheXNNYXRjaDoge1xuICAgICAgICAgIHBsYXRmb3JtTmFtZTogJ2lPUycsXG4gICAgICAgICAgJ2FwcGl1bTpkZXZpY2VOYW1lJzogJ0R1bWInLFxuICAgICAgICAgICdhcHBpdW06Zm9vJzogbnVsbFxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZC5kZWxldGVTZXNzaW9uKCk7XG4gICAgfVxuXG4gICAgYXdhaXQgZC5jcmVhdGVTZXNzaW9uKG51bGwsIG51bGwsIHtcbiAgICAgIGFsd2F5c01hdGNoOiB7XG4gICAgICAgIHBsYXRmb3JtTmFtZTogJ2lPUycsXG4gICAgICAgICdhcHBpdW06ZGV2aWNlTmFtZSc6ICdEdW1iJyxcbiAgICAgICAgJ2FwcGl1bTpmb28nOiAxXG4gICAgICB9XG4gICAgfSkuc2hvdWxkLmV2ZW50dWFsbHkuYmUucmVqZWN0ZWRXaXRoKC8nZm9vJyBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLyk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZC5jcmVhdGVTZXNzaW9uKG51bGwsIG51bGwsIHtcbiAgICAgICAgYWx3YXlzTWF0Y2g6IHtcbiAgICAgICAgICBwbGF0Zm9ybU5hbWU6ICdpT1MnLFxuICAgICAgICAgICdhcHBpdW06ZGV2aWNlTmFtZSc6ICdEdW1iJyxcbiAgICAgICAgICAnYXBwaXVtOmZvbyc6IHVuZGVmaW5lZFxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZC5kZWxldGVTZXNzaW9uKCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGQuY3JlYXRlU2Vzc2lvbihudWxsLCBudWxsLCB7XG4gICAgICAgIGFsd2F5c01hdGNoOiB7XG4gICAgICAgICAgcGxhdGZvcm1OYW1lOiAnaU9TJyxcbiAgICAgICAgICAnYXBwaXVtOmRldmljZU5hbWUnOiAnRHVtYicsXG4gICAgICAgICAgJ2FwcGl1bTpmb28nOiAnJ1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZC5kZWxldGVTZXNzaW9uKCk7XG4gICAgfVxuICB9KTtcblxuICBpdCgnc2hvdWxkIHN0aWxsIHZhbGlkYXRlIG51bGwvdW5kZWZpbmVkL2VtcHR5IGNhcHMgd2hvc2UgcHJlc2VuY2UgaXMgcmVxdWlyZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgZC5kZXNpcmVkQ2FwQ29uc3RyYWludHMgPSB7XG4gICAgICBmb286IHtcbiAgICAgICAgcHJlc2VuY2U6IHRydWVcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGF3YWl0IGQuY3JlYXRlU2Vzc2lvbihudWxsLCBudWxsLCB7XG4gICAgICBhbHdheXNNYXRjaDoge1xuICAgICAgICBwbGF0Zm9ybU5hbWU6ICdpT1MnLFxuICAgICAgICAnYXBwaXVtOmRldmljZU5hbWUnOiAnRHVtYicsXG4gICAgICAgICdhcHBpdW06Zm9vJzogbnVsbFxuICAgICAgfVxuICAgIH0pLnNob3VsZC5ldmVudHVhbGx5LmJlLnJlamVjdGVkV2l0aCgvYmxhbmsvKTtcblxuICAgIGF3YWl0IGQuY3JlYXRlU2Vzc2lvbihudWxsLCB7XG4gICAgICBhbHdheXNNYXRjaDoge1xuICAgICAgICBwbGF0Zm9ybU5hbWU6ICdpT1MnLFxuICAgICAgICAnYXBwaXVtOmRldmljZU5hbWUnOiAnRHVtYicsXG4gICAgICAgICdhcHBpdW06Zm9vJzogJydcbiAgICAgIH1cbiAgICB9KS5zaG91bGQuZXZlbnR1YWxseS5iZS5yZWplY3RlZFdpdGgoL2JsYW5rLyk7XG5cbiAgICBhd2FpdCBkLmNyZWF0ZVNlc3Npb24oe1xuICAgICAgZmlyc3RNYXRjaDogW3tcbiAgICAgICAgcGxhdGZvcm1OYW1lOiAnaU9TJyxcbiAgICAgICAgJ2FwcGl1bTpkZXZpY2VOYW1lJzogJ0R1bWInLFxuICAgICAgICAnYXBwaXVtOmZvbyc6IHt9XG4gICAgICB9XVxuICAgIH0pLnNob3VsZC5ldmVudHVhbGx5LmJlLnJlamVjdGVkV2l0aCgvYmxhbmsvKTtcblxuICAgIGF3YWl0IGQuY3JlYXRlU2Vzc2lvbih7XG4gICAgICBhbHdheXNNYXRjaDoge1xuICAgICAgICBwbGF0Zm9ybU5hbWU6ICdpT1MnLFxuICAgICAgICAnYXBwaXVtOmRldmljZU5hbWUnOiAnRHVtYicsXG4gICAgICAgICdhcHBpdW06Zm9vJzogW11cbiAgICAgIH1cbiAgICB9KS5zaG91bGQuZXZlbnR1YWxseS5iZS5yZWplY3RlZFdpdGgoL2JsYW5rLyk7XG5cbiAgICBhd2FpdCBkLmNyZWF0ZVNlc3Npb24oe1xuICAgICAgYWx3YXlzTWF0Y2g6IHtcbiAgICAgICAgcGxhdGZvcm1OYW1lOiAnaU9TJyxcbiAgICAgICAgJ2FwcGl1bTpkZXZpY2VOYW1lJzogJ0R1bWInLFxuICAgICAgICAnYXBwaXVtOmZvbyc6ICcgICdcbiAgICAgIH1cbiAgICB9KS5zaG91bGQuZXZlbnR1YWxseS5iZS5yZWplY3RlZFdpdGgoL2JsYW5rLyk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd3M2MnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgdzNjIGNhcGFiaWxpdGllcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IFtzZXNzaW9uSWQsIGNhcHNdID0gYXdhaXQgZC5jcmVhdGVTZXNzaW9uKG51bGwsIG51bGwsIHtcbiAgICAgICAgYWx3YXlzTWF0Y2g6IHtcbiAgICAgICAgICBwbGF0Zm9ybU5hbWU6ICdpT1MnLFxuICAgICAgICAgICdhcHBpdW06ZGV2aWNlTmFtZSc6ICdEZWxvcmVhbidcbiAgICAgICAgfSwgZmlyc3RNYXRjaDogW3t9XSxcbiAgICAgIH0pO1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2Vzc2lvbklkLnNob3VsZC5leGlzdDtcbiAgICAgICAgY2Fwcy5zaG91bGQuZXFsKHtcbiAgICAgICAgICBwbGF0Zm9ybU5hbWU6ICdpT1MnLFxuICAgICAgICAgIGRldmljZU5hbWU6ICdEZWxvcmVhbicsXG4gICAgICAgIH0pO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYXdhaXQgZC5kZWxldGVTZXNzaW9uKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJhaXNlIGFuIGVycm9yIGlmIHczYyBjYXBhYmlsaXRpZXMgaXMgbm90IGEgcGxhaW4gSlNPTiBvYmplY3QnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0ZXN0VmFsdWVzID0gW3RydWUsICdzdHJpbmcnLCBbXSwgMTAwXTtcbiAgICAgIC8vIHRoaXMgbG9vcCBydW5zIGluIHBhcmFsbGVsLCBhbmQgZG9lcyBub3QgZ3VhcmFudGVlIGFsbCBhc3NlcnRpb25zIHdpbGwgYmUgbWFkZVxuICAgICAgYXdhaXQgQi5tYXAodGVzdFZhbHVlcywgKHZhbCkgPT4gZC5jcmVhdGVTZXNzaW9uKG51bGwsIG51bGwsIHZhbCkuc2hvdWxkLmV2ZW50dWFsbHkuYmUucmVqZWN0ZWRXaXRoKGVycm9ycy5TZXNzaW9uTm90Q3JlYXRlZEVycm9yKSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwiZmlsZSI6InRlc3QvYmFzZWRyaXZlci9jYXBhYmlsaXR5LXNwZWNzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
@@ -6,7 +6,7 @@ require("source-map-support/register");
6
6
 
7
7
  var _log = _interopRequireDefault(require("../../../lib/basedriver/commands/log"));
8
8
 
9
- var _sinon = _interopRequireDefault(require("sinon"));
9
+ var _sinon = require("sinon");
10
10
 
11
11
  var _lodash = _interopRequireDefault(require("lodash"));
12
12
 
@@ -24,8 +24,16 @@ const SUPPORTED_LOG_TYPES = {
24
24
  }
25
25
  };
26
26
  describe('log commands -', function () {
27
+ let sandbox;
27
28
  beforeEach(function () {
29
+ sandbox = (0, _sinon.createSandbox)();
28
30
  _log.default.supportedLogTypes = {};
31
+ _log.default.log = {
32
+ debug: _lodash.default.noop
33
+ };
34
+ });
35
+ afterEach(function () {
36
+ sandbox.restore();
29
37
  });
30
38
  describe('getLogTypes', function () {
31
39
  it('should return empty array when no supported log types', async function () {
@@ -38,9 +46,8 @@ describe('log commands -', function () {
38
46
  });
39
47
  describe('getLog', function () {
40
48
  beforeEach(function () {
41
- _sinon.default.spy(SUPPORTED_LOG_TYPES.one, 'getter');
42
-
43
- _sinon.default.spy(SUPPORTED_LOG_TYPES.two, 'getter');
49
+ sandbox.spy(SUPPORTED_LOG_TYPES.one, 'getter');
50
+ sandbox.spy(SUPPORTED_LOG_TYPES.two, 'getter');
44
51
  });
45
52
  afterEach(function () {
46
53
  SUPPORTED_LOG_TYPES.one.getter.restore();
@@ -77,4 +84,4 @@ describe('log commands -', function () {
77
84
  });require('source-map-support').install();
78
85
 
79
86
 
80
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvYmFzZWRyaXZlci9jb21tYW5kcy9sb2ctc3BlY3MuanMiXSwibmFtZXMiOlsiZXhwZWN0IiwiY2hhaSIsIkZJUlNUX0xPR1MiLCJTRUNPTkRfTE9HUyIsIlNVUFBPUlRFRF9MT0dfVFlQRVMiLCJvbmUiLCJkZXNjcmlwdGlvbiIsImdldHRlciIsIl8iLCJjbG9uZSIsInR3byIsImRlc2NyaWJlIiwiYmVmb3JlRWFjaCIsImxvZ0NvbW1hbmRzIiwic3VwcG9ydGVkTG9nVHlwZXMiLCJpdCIsImdldExvZ1R5cGVzIiwic2hvdWxkIiwiZXFsIiwic2lub24iLCJzcHkiLCJhZnRlckVhY2giLCJyZXN0b3JlIiwiZ2V0TG9nIiwiZXZlbnR1YWxseSIsImJlIiwicmVqZWN0ZWQiLCJjYWxsZWQiLCJmYWxzZSIsImVyciIsIl9lcnIiLCJ0byIsImV4aXN0IiwibWVzc2FnZSIsImxvZ3MiLCJ0cnVlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFHQSxNQUFNQSxNQUFNLEdBQUdDLElBQUksQ0FBQ0QsTUFBcEI7QUFFQSxNQUFNRSxVQUFVLEdBQUcsQ0FBQyxPQUFELEVBQVUsTUFBVixDQUFuQjtBQUNBLE1BQU1DLFdBQVcsR0FBRyxDQUFDLFFBQUQsRUFBVyxNQUFYLENBQXBCO0FBQ0EsTUFBTUMsbUJBQW1CLEdBQUc7QUFDMUJDLEVBQUFBLEdBQUcsRUFBRTtBQUNIQyxJQUFBQSxXQUFXLEVBQUUsWUFEVjtBQUVIQyxJQUFBQSxNQUFNLEVBQUUsTUFBTUMsZ0JBQUVDLEtBQUYsQ0FBUVAsVUFBUjtBQUZYLEdBRHFCO0FBSzFCUSxFQUFBQSxHQUFHLEVBQUU7QUFDSEosSUFBQUEsV0FBVyxFQUFFLGNBRFY7QUFFSEMsSUFBQUEsTUFBTSxFQUFFLE1BQU1DLGdCQUFFQyxLQUFGLENBQVFOLFdBQVI7QUFGWDtBQUxxQixDQUE1QjtBQVdBUSxRQUFRLENBQUMsZ0JBQUQsRUFBbUIsWUFBWTtBQUNyQ0MsRUFBQUEsVUFBVSxDQUFDLFlB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LE1BQUwsQ0FBWUMsR0FBWixDQUFnQmhCLFVBQWhCO0FBQ0FFLE1BQUFBLG1CQUFtQixDQUFDQyxHQUFwQixDQUF3QkUsTUFBeEIsQ0FBK0JvQixNQUEvQixDQUFzQ1YsTUFBdEMsQ0FBNkNRLEVBQTdDLENBQWdEVSxJQUFoRDtBQUNBL0IsTUFBQUEsbUJBQW1CLENBQUNNLEdBQXBCLENBQXdCSCxNQUF4QixDQUErQm9CLE1BQS9CLENBQXNDVixNQUF0QyxDQUE2Q1EsRUFBN0MsQ0FBZ0RHLEtBQWhEO0FBQ0QsS0FOQyxDQUFGO0FBT0QsR0FsQ08sQ0FBUjtBQW1DRCxDQWpETyxDQUFSIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGxvZ0NvbW1hbmRzIGZyb20gJy4uLy4uLy4uL2xpYi9iYXNlZHJpdmVyL2NvbW1hbmRzL2xvZyc7XG5pbXBvcnQgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcblxuXG5jb25zdCBleHBlY3QgPSBjaGFpLmV4cGVjdDtcblxuY29uc3QgRklSU1RfTE9HUyA9IFsnZmlyc3QnLCAnbG9ncyddO1xuY29uc3QgU0VDT05EX0xPR1MgPSBbJ3NlY29uZCcsICdsb2dzJ107XG5jb25zdCBTVVBQT1JURURfTE9HX1RZUEVTID0ge1xuICBvbmU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0ZpcnN0IGxvZ3MnLFxuICAgIGdldHRlcjogKCkgPT4gXy5jbG9uZShGSVJTVF9MT0dTKSxcbiAgfSxcbiAgdHdvOiB7XG4gICAgZGVzY3JpcHRpb246ICdTZWNvbmRzIGxvZ3MnLFxuICAgIGdldHRlcjogKCkgPT4gXy5jbG9uZShTRUNPTkRfTE9HUyksXG4gIH0sXG59O1xuXG5kZXNjcmliZSgnbG9nIGNvbW1hbmRzIC0nLCBmdW5jdGlvbiAoKSB7XG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIC8vIHJlc2V0IHRoZSBzdXBwb3J0ZWQgbG9nIHR5cGVzXG4gICAgbG9nQ29tbWFuZHMuc3VwcG9ydGVkTG9nVHlwZXMgPSB7fTtcbiAgfSk7XG4gIGRlc2NyaWJlKCdnZXRMb2dUeXBlcycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBlbXB0eSBhcnJheSB3aGVuIG5vIHN1cHBvcnRlZCBsb2cgdHlwZXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAoYXdhaXQgbG9nQ29tbWFuZHMuZ2V0TG9nVHlwZXMoKSkuc2hvdWxkLmVxbChbXSk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4ga2V5cyB0byBsb2cgdHlwZSBvYmplY3QnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBsb2dDb21tYW5kcy5zdXBwb3J0ZWRMb2dUeXBlcyA9IFNVUFBPUlRFRF9MT0dfVFlQRVM7XG4gICAgICAoYXdhaXQgbG9nQ29tbWFuZHMuZ2V0TG9nVHlwZXMoKSkuc2hvdWxkLmVxbChbJ29uZScsICd0d28nXSk7XG4gICAgfSk7XG4gIH0pO1xuICBkZXNjcmliZSgnZ2V0TG9nJywgZnVuY3Rpb24gKCkge1xuICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgc2lub24uc3B5KFNVUFBPUlRFRF9MT0dfVFlQRVMub25lLCAnZ2V0dGVyJyk7XG4gICAgICBzaW5vbi5zcHkoU1VQUE9SVEVEX0xPR19UWVBFUy50d28sICdnZXR0ZXInKTtcbiAgICB9KTtcbiAgICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgU1VQUE9SVEVEX0xPR19UWVBFUy5vbmUuZ2V0dGVyLnJlc3RvcmUoKTtcbiAgICAgIFNVUFBPUlRFRF9MT0dfVFlQRVMudHdvLmdldHRlci5yZXN0b3JlKCk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBpZiBsb2cgdHlwZSBub3Qgc3VwcG9ydGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgbG9nQ29tbWFuZHMuZ2V0TG9nKCdvbmUnKS5zaG91bGQuZXZlbnR1YWxseS5iZS5yZWplY3RlZDtcbiAgICAgIFNVUFBPUlRFRF9MT0dfVFlQRVMub25lLmdldHRlci5jYWxsZWQuc2hvdWxkLmJlLmZhbHNlO1xuICAgICAgU1VQUE9SVEVEX0xPR19UWVBFUy50d28uZ2V0dGVyLmNhbGxlZC5zaG91bGQuYmUuZmFsc2U7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBhbiBlcnJvciB3aXRoIGF2YWlsYWJsZSBsb2cgdHlwZXMgaWYgbG9nIHR5cGUgbm90IHN1cHBvcnRlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxvZ0NvbW1hbmRzLnN1cHBvcnRlZExvZ1R5cGVzID0gU1VQUE9SVEVEX0xPR19UWVBFUztcbiAgICAgIGxldCBlcnI7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBsb2dDb21tYW5kcy5nZXRMb2coJ3RocmVlJyk7XG4gICAgICB9IGNhdGNoIChfZXJyKSB7XG4gICAgICAgIGVyciA9IF9lcnI7XG4gICAgICB9XG4gICAgICBleHBlY3QoZXJyKS50by5leGlzdDtcbiAgICAgIGVyci5tZXNzYWdlLnNob3VsZC5lcWwoYFVuc3VwcG9ydGVkIGxvZyB0eXBlICd0aHJlZScuIFN1cHBvcnRlZCB0eXBlczoge1wib25lXCI6XCJGaXJzdCBsb2dzXCIsXCJ0d29cIjpcIlNlY29uZHMgbG9nc1wifWApO1xuICAgICAgU1VQUE9SVEVEX0xPR19UWVBFUy5vbmUuZ2V0dGVyLmNhbGxlZC5zaG91bGQuYmUuZmFsc2U7XG4gICAgICBTVVBQT1JURURfTE9HX1RZUEVTLnR3by5nZXR0ZXIuY2FsbGVkLnNob3VsZC5iZS5mYWxzZTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGNhbGwgZ2V0dGVyIG9uIGFwcHJvcHJpYXRlIGxvZyB3aGVuIGZvdW5kJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbG9nQ29tbWFuZHMuc3VwcG9ydGVkTG9nVHlwZXMgPSBTVVBQT1JURURfTE9HX1RZUEVTO1xuICAgICAgbGV0IGxvZ3MgPSBhd2FpdCBsb2dDb21tYW5kcy5nZXRMb2coJ29uZScpO1xuICAgICAgbG9ncy5zaG91bGQuZXFsKEZJUlNUX0xPR1MpO1xuICAgICAgU1VQUE9SVEVEX0xPR19UWVBFUy5vbmUuZ2V0dGVyLmNhbGxlZC5zaG91bGQuYmUudHJ1ZTtcbiAgICAgIFNVUFBPUlRFRF9MT0dfVFlQRVMudHdvLmdldHRlci5jYWxsZWQuc2hvdWxkLmJlLmZhbHNlO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl0sImZpbGUiOiJ0ZXN0L2Jhc2Vkcml2ZXIvY29tbWFuZHMvbG9nLXNwZWNzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uLy4uIn0=
87
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvYmFzZWRyaXZlci9jb21tYW5kcy9sb2ctc3BlY3MuanMiXSwibmFtZXMiOlsiZXhwZWN0IiwiY2hhaSIsIkZJUlNUX0xPR1MiLCJTRUNPTkRfTE9HUyIsIlNVUFBPUlRFRF9MT0dfVFlQRVMiLCJvbmUiLCJkZXNjcmlwdGlvbiIsImdldHRlciIsIl8iLCJjbG9uZSIsInR3byIsImRlc2NyaWJlIiwic2FuZGJveCIsImJlZm9yZUVhY2giLCJsb2dDb21tYW5kcyIsInN1cHBvcnRlZExvZ1R5cGVzIiwibG9nIiwiZGVidWciLCJub29wIiwiYWZ0ZXJFYWNoIiwicmVzdG9yZSIsIml0IiwiZ2V0TG9nVHlwZXMiLCJzaG91bGQiLCJlcWwiLCJzcHkiLCJnZXRMb2ciLCJldmVudHVhbGx5IiwiYmUiLCJyZWplY3RlZCIsImNhbGxlZCIsImZhbHNlIiwiZXJyIiwiX2VyciIsInRvIiwiZXhpc3QiLCJtZXNzYWdlIiwibG9ncyIsInRydWUiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUdBLE1BQU1BLE1BQU0sR0FBR0MsSUFBSSxDQUFDRCxNQUFwQjtBQUVBLE1BQU1FLFVBQVUsR0FBRyxDQUFDLE9BQUQsRUFBVSxNQUFWLENBQW5CO0FBQ0EsTUFBTUMsV0FBVyxHQUFHLENBQUMsUUFBRCxFQUFXLE1BQVgsQ0FBcEI7QUFDQSxNQUFNQyxtQkFBbUIsR0FBRztBQUMxQkMsRUFBQUEsR0FBRyxFQUFFO0FBQ0hDLElBQUFBLFdBQVcsRUFBRSxZQURWO0FBRUhDLElBQUFBLE1BQU0sRUFBRSxNQUFNQyxnQkFBRUMsS0FBRixDQUFRUCxVQUFSO0FBRlgsR0FEcUI7QUFLMUJRLEVBQUFBLEdBQUcsRUFBRTtBQUNISixJQUFBQSxXQUFXLEVBQUUsY0FEVjtBQUVIQyxJQUFBQSxNQUFNLEVBQUUsTUFBTUMsZ0JBQUVDLEtBQUYsQ0FBUU4sV0FBUjtBQUZYO0FBTHFCLENBQTVCO0FBV0FRLFFBQVEsQ0FBQyxnQkFBRCxFQUFtQixZQUFZO0FBQ3JDLE1BQUlDLE9BQUo7QUFFQUMsRUFBQUEsVUFBVSxDQUFDLFlBQVk7QUFDckJELElBQUFBLE9BQU8sR0FBRywyQkFBVjtBQUVBRSxpQkFBWUMsaUJBQVosR0FBZ0MsRUFBaEM7QUFDQUQsaUJBQVlFLEdBQVosR0FBa0I7QUFBQ0MsTUFBQUEsS0FBSyxFQUFFVCxnQkFBRVU7QUFBVixLQUFsQjtBQUNELEdBTFMsQ0FBVjtBQU9BQyxFQUFBQSxTQUFTLENBQUMsWUFBWTtBQUNwQlAsSUFBQUEsT0FBTyxDQUFDUSxPQUFSO0FBQ0QsR0FGUSxDQUFUO0FBSUFULEVBQUFBLFFBQVEsQ0FBQyxhQUFELEVBQWdCLFlBQVk7QUFDbENVLElBQUFBLEVBQUUsQ0FBQyx1REFBRCxFQUEwRCxrQkFBa0I7QUFDNUUsT0FBQyxNQUFNUCxhQUFZUSxXQUFaLEVBQVAsRUFBa0NDLE1BQWxDLENBQXlDQyxHQUF6QyxDQUE2QyxFQUE3QztBQUNELEtBRkMsQ0FBRjtBQUdBSCxJQUFBQSxFQUFFLENBQUMsdUNBQUQsRUFBMEMsa0JBQWtCO0FBQzVEUCxtQkFBWUMsaUJBQVosR0FBZ0NYLG1CQUFoQztBQUNBLE9BQUMsTUFBTVUsYUFBWVEsV0FBWixFQUFQLEVBQWtDQyxNQUFsQyxDQUF5Q0MsR0FBekMsQ0FBNkMsQ0FBQyxLQUFELEVBQVEsS0FBUixDQUE3QztBQUNELEtBSEMsQ0FBRjtBQUlELEdBUk8sQ0FBUjtBQVNBYixFQUFBQSxRQUFRLENBQUMsUUFBRCxFQUFXLFlBQVk7QUFDN0JFLElBQUFBLFVBQVUsQ0FBQyxZQUFZO0FBQ3JCRCxNQUFBQSxPQUFPLENBQUNhLEdBQVIsQ0FBWXJCLG1CQUFtQixDQUFDQyxHQUFoQyxFQUFxQyxRQUFyQztBQUNBTyxNQUFBQSxPQUFPLENBQUNhLEdBQVIsQ0FBWXJCLG1CQUFtQixDQUFDTSxHQUFoQyxFQUFxQyxRQUFyQztBQUNELEtBSFMsQ0FBVjtBQUlBUyxJQUFBQSxTQUFTLENBQUMsWUFBWTtBQUNwQmYsTUFBQUEsbUJBQW1CLENBQUNDLEdBQXBCLENBQXdCRSxNQUF4QixDQUErQmEsT0FBL0I7QUFDQWhCLE1BQUFBLG1CQUFtQixDQUFDTSxHQUFwQixDQUF3QkgsTUFBeEIsQ0FBK0JhLE9BQS9CO0FBQ0QsS0FIUSxDQUFUO0FBSUFDLElBQUFBLEVBQUUsQ0FBQyw4Q0FBRCxFQUFpRCxrQkFBa0I7QUFDbkUsWUFBTVAsYUFBWVksTUFBWixDQUFtQixLQUFuQixFQUEwQkgsTUFBMUIsQ0FBaUNJLFVBQWpDLENBQTRDQyxFQUE1QyxDQUErQ0MsUUFBckQ7QUFDQXpCLE1BQUFBLG1CQUFtQixDQUFDQyxHQUFwQixDQUF3QkUsTUFBeEIsQ0FBK0J1QixNQUEvQixDQUFzQ1AsTUFBdEMsQ0FBNkNLLEVBQTdDLENBQWdERyxLQUFoRDtBQUNBM0IsTUFBQUEsbUJBQW1CLENBQUNNLEdBQXBCLENBQXdCSCxNQUF4QixDQUErQnVCLE1BQS9CLENBQXNDUCxNQUF0QyxDQUE2Q0ssRUFBN0MsQ0FBZ0RHLEtBQWhEO0FBQ0QsS0FKQyxDQUFGO0FBS0FWLElBQUFBLEVBQUUsQ0FBQywwRUFBRCxFQUE2RSxrQkFBa0I7QUFDL0ZQLG1CQUFZQyxpQkFBWixHQUFnQ1gsbUJBQWhDO0FBQ0EsVUFBSTRCLEdBQUo7O0FBQ0EsVUFBSTtBQUNGLGNBQU1sQixhQUFZWSxNQUFaLENBQW1CLE9BQW5CLENBQU47QUFDRCxPQUZELENBRUUsT0FBT08sSUFBUCxFQUFhO0FBQ2JELFFBQUFBLEdBQUcsR0FBR0MsSUFBTjtBQUNEOztBQUNEakMsTUFBQUEsTUFBTSxDQUFDZ0MsR0FBRCxDQUFOLENBQVlFLEVBQVosQ0FBZUMsS0FBZjtBQUNBSCxNQUFBQSxHQUFHLENBQUNJLE9BQUosQ0FBWWIsTUFBWixDQUFtQkMsR0FBbkIsQ0FBd0IsMEZBQXhCO0FBQ0FwQixNQUFBQSxtQkFBbUIsQ0FBQ0MsR0FBcEIsQ0FBd0JFLE1BQXhCLENBQStCdUIsTUFBL0IsQ0FBc0NQLE1BQXRDLENBQTZDSyxFQUE3QyxDQUFnREcsS0FBaEQ7QUFDQTNCLE1BQUFBLG1CQUFtQixDQUFDTSxHQUFwQixDQUF3QkgsTUFBeEIsQ0FBK0J1QixNQUEvQixDQUFzQ1AsTUFBdEMsQ0FBNkNLLEVBQTdDLENBQWdERyxLQUFoRDtBQUNELEtBWkMsQ0FBRjtBQWFBVixJQUFBQSxFQUFFLENBQUMsa0RBQUQsRUFBcUQsa0JBQWtCO0FBQ3ZFUCxtQkFBWUMsaUJBQVosR0FBZ0NYLG1CQUFoQztBQUNBLFVBQUlpQyxJQUFJLEdBQUcsTUFBTXZCLGFBQVlZLE1BQVosQ0FBbUIsS0FBbkIsQ0FBakI7QUFDQVcsTUFBQUEsSUFBSSxDQUFDZCxNQUFMLENBQVlDLEdBQVosQ0FBZ0J0QixVQUFoQjtBQUNBRSxNQUFBQSxtQkFBbUIsQ0FBQ0MsR0FBcEIsQ0FBd0JFLE1BQXhCLENBQStCdUIsTUFBL0IsQ0FBc0NQLE1BQXRDLENBQTZDSyxFQUE3QyxDQUFnRFUsSUFBaEQ7QUFDQWxDLE1BQUFBLG1CQUFtQixDQUFDTSxHQUFwQixDQUF3QkgsTUFBeEIsQ0FBK0J1QixNQUEvQixDQUFzQ1AsTUFBdEMsQ0FBNkNLLEVBQTdDLENBQWdERyxLQUFoRDtBQUNELEtBTkMsQ0FBRjtBQU9ELEdBbENPLENBQVI7QUFtQ0QsQ0ExRE8sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBsb2dDb21tYW5kcyBmcm9tICcuLi8uLi8uLi9saWIvYmFzZWRyaXZlci9jb21tYW5kcy9sb2cnO1xuaW1wb3J0IHsgY3JlYXRlU2FuZGJveCB9IGZyb20gJ3Npbm9uJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5cblxuY29uc3QgZXhwZWN0ID0gY2hhaS5leHBlY3Q7XG5cbmNvbnN0IEZJUlNUX0xPR1MgPSBbJ2ZpcnN0JywgJ2xvZ3MnXTtcbmNvbnN0IFNFQ09ORF9MT0dTID0gWydzZWNvbmQnLCAnbG9ncyddO1xuY29uc3QgU1VQUE9SVEVEX0xPR19UWVBFUyA9IHtcbiAgb25lOiB7XG4gICAgZGVzY3JpcHRpb246ICdGaXJzdCBsb2dzJyxcbiAgICBnZXR0ZXI6ICgpID0+IF8uY2xvbmUoRklSU1RfTE9HUyksXG4gIH0sXG4gIHR3bzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU2Vjb25kcyBsb2dzJyxcbiAgICBnZXR0ZXI6ICgpID0+IF8uY2xvbmUoU0VDT05EX0xPR1MpLFxuICB9LFxufTtcblxuZGVzY3JpYmUoJ2xvZyBjb21tYW5kcyAtJywgZnVuY3Rpb24gKCkge1xuICBsZXQgc2FuZGJveDtcblxuICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzYW5kYm94ID0gY3JlYXRlU2FuZGJveCgpO1xuICAgIC8vIHJlc2V0IHRoZSBzdXBwb3J0ZWQgbG9nIHR5cGVzXG4gICAgbG9nQ29tbWFuZHMuc3VwcG9ydGVkTG9nVHlwZXMgPSB7fTtcbiAgICBsb2dDb21tYW5kcy5sb2cgPSB7ZGVidWc6IF8ubm9vcH07XG4gIH0pO1xuXG4gIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgc2FuZGJveC5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRMb2dUeXBlcycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBlbXB0eSBhcnJheSB3aGVuIG5vIHN1cHBvcnRlZCBsb2cgdHlwZXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAoYXdhaXQgbG9nQ29tbWFuZHMuZ2V0TG9nVHlwZXMoKSkuc2hvdWxkLmVxbChbXSk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4ga2V5cyB0byBsb2cgdHlwZSBvYmplY3QnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBsb2dDb21tYW5kcy5zdXBwb3J0ZWRMb2dUeXBlcyA9IFNVUFBPUlRFRF9MT0dfVFlQRVM7XG4gICAgICAoYXdhaXQgbG9nQ29tbWFuZHMuZ2V0TG9nVHlwZXMoKSkuc2hvdWxkLmVxbChbJ29uZScsICd0d28nXSk7XG4gICAgfSk7XG4gIH0pO1xuICBkZXNjcmliZSgnZ2V0TG9nJywgZnVuY3Rpb24gKCkge1xuICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgc2FuZGJveC5zcHkoU1VQUE9SVEVEX0xPR19UWVBFUy5vbmUsICdnZXR0ZXInKTtcbiAgICAgIHNhbmRib3guc3B5KFNVUFBPUlRFRF9MT0dfVFlQRVMudHdvLCAnZ2V0dGVyJyk7XG4gICAgfSk7XG4gICAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIFNVUFBPUlRFRF9MT0dfVFlQRVMub25lLmdldHRlci5yZXN0b3JlKCk7XG4gICAgICBTVVBQT1JURURfTE9HX1RZUEVTLnR3by5nZXR0ZXIucmVzdG9yZSgpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgaWYgbG9nIHR5cGUgbm90IHN1cHBvcnRlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGxvZ0NvbW1hbmRzLmdldExvZygnb25lJykuc2hvdWxkLmV2ZW50dWFsbHkuYmUucmVqZWN0ZWQ7XG4gICAgICBTVVBQT1JURURfTE9HX1RZUEVTLm9uZS5nZXR0ZXIuY2FsbGVkLnNob3VsZC5iZS5mYWxzZTtcbiAgICAgIFNVUFBPUlRFRF9MT0dfVFlQRVMudHdvLmdldHRlci5jYWxsZWQuc2hvdWxkLmJlLmZhbHNlO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgdGhyb3cgYW4gZXJyb3Igd2l0aCBhdmFpbGFibGUgbG9nIHR5cGVzIGlmIGxvZyB0eXBlIG5vdCBzdXBwb3J0ZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBsb2dDb21tYW5kcy5zdXBwb3J0ZWRMb2dUeXBlcyA9IFNVUFBPUlRFRF9MT0dfVFlQRVM7XG4gICAgICBsZXQgZXJyO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgbG9nQ29tbWFuZHMuZ2V0TG9nKCd0aHJlZScpO1xuICAgICAgfSBjYXRjaCAoX2Vycikge1xuICAgICAgICBlcnIgPSBfZXJyO1xuICAgICAgfVxuICAgICAgZXhwZWN0KGVycikudG8uZXhpc3Q7XG4gICAgICBlcnIubWVzc2FnZS5zaG91bGQuZXFsKGBVbnN1cHBvcnRlZCBsb2cgdHlwZSAndGhyZWUnLiBTdXBwb3J0ZWQgdHlwZXM6IHtcIm9uZVwiOlwiRmlyc3QgbG9nc1wiLFwidHdvXCI6XCJTZWNvbmRzIGxvZ3NcIn1gKTtcbiAgICAgIFNVUFBPUlRFRF9MT0dfVFlQRVMub25lLmdldHRlci5jYWxsZWQuc2hvdWxkLmJlLmZhbHNlO1xuICAgICAgU1VQUE9SVEVEX0xPR19UWVBFUy50d28uZ2V0dGVyLmNhbGxlZC5zaG91bGQuYmUuZmFsc2U7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBjYWxsIGdldHRlciBvbiBhcHByb3ByaWF0ZSBsb2cgd2hlbiBmb3VuZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxvZ0NvbW1hbmRzLnN1cHBvcnRlZExvZ1R5cGVzID0gU1VQUE9SVEVEX0xPR19UWVBFUztcbiAgICAgIGxldCBsb2dzID0gYXdhaXQgbG9nQ29tbWFuZHMuZ2V0TG9nKCdvbmUnKTtcbiAgICAgIGxvZ3Muc2hvdWxkLmVxbChGSVJTVF9MT0dTKTtcbiAgICAgIFNVUFBPUlRFRF9MT0dfVFlQRVMub25lLmdldHRlci5jYWxsZWQuc2hvdWxkLmJlLnRydWU7XG4gICAgICBTVVBQT1JURURfTE9HX1RZUEVTLnR3by5nZXR0ZXIuY2FsbGVkLnNob3VsZC5iZS5mYWxzZTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJmaWxlIjoidGVzdC9iYXNlZHJpdmVyL2NvbW1hbmRzL2xvZy1zcGVjcy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLiJ9