oxygen-cli 1.20.2 → 1.21.0-beta.12

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 (33) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/build/core/OxygenCore.js +4 -3
  3. package/build/errors/OxygenError.js +9 -5
  4. package/build/errors/helper.js +10 -5
  5. package/build/lib/util.js +5 -2
  6. package/build/ox_modules/module-db.js +2 -2
  7. package/build/ox_modules/module-email.js +97 -49
  8. package/build/ox_modules/module-eyes.js +4 -21
  9. package/build/ox_modules/module-http.js +148 -62
  10. package/build/ox_modules/module-mailinator.js +25 -32
  11. package/build/ox_modules/module-mob/commands/getDeviceLogs.js +4 -11
  12. package/build/ox_modules/module-mob/commands/selectWindow.js +4 -7
  13. package/build/ox_modules/module-mob/commands/sendKeys.js +2 -2
  14. package/build/ox_modules/module-mob.js +65 -52
  15. package/build/ox_modules/module-pdf.js +12 -32
  16. package/build/ox_modules/module-proxy.js +9 -9
  17. package/build/ox_modules/module-serial.js +14 -12
  18. package/build/ox_modules/module-soap.js +113 -77
  19. package/build/ox_modules/module-twilio.js +27 -27
  20. package/build/ox_modules/module-utils.js +43 -5
  21. package/build/ox_modules/module-web/commands/fullscreenWindow.js +24 -0
  22. package/build/ox_modules/module-web/commands/index.js +25 -1
  23. package/build/ox_modules/module-web/commands/isSelected.js +2 -2
  24. package/build/ox_modules/module-web/commands/maximizeWindow.js +24 -0
  25. package/build/ox_modules/module-web/commands/minimizeWindow.js +24 -0
  26. package/build/ox_modules/module-web/commands/selectWindow.js +4 -7
  27. package/build/ox_modules/module-web/commands/waitForNotExist.js +2 -3
  28. package/build/ox_modules/module-web.js +87 -64
  29. package/build/ox_modules/utils.js +40 -4
  30. package/build/ox_services/service-devtools/submodule-network.js +8 -8
  31. package/build/ox_services/service-devtools.js +3 -3
  32. package/build/runners/WorkerProcess.js +22 -20
  33. package/package.json +8 -5
@@ -7,7 +7,7 @@ exports.default = void 0;
7
7
 
8
8
  require("source-map-support/register");
9
9
 
10
- var _request = _interopRequireDefault(require("request"));
10
+ var _got = _interopRequireDefault(require("got"));
11
11
 
12
12
  var _OxygenModule = _interopRequireDefault(require("../core/OxygenModule"));
13
13
 
@@ -32,16 +32,26 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
32
32
  * @name http
33
33
  * @description Provides methods for working with HTTP(S)
34
34
  */
35
- const deasync = require('deasync');
36
-
37
35
  const MODULE_NAME = 'http';
38
36
  const RESPONSE_TIMEOUT = 1000 * 30; // in ms
39
37
 
38
+ const DAFAULT_HTTP2 = false;
40
39
  const DEFAULT_HTTP_OPTIONS = {
41
- json: true,
42
- gzip: true,
43
- timeout: RESPONSE_TIMEOUT,
44
- rejectUnauthorized: false
40
+ decompress: true,
41
+ responseType: 'text',
42
+ timeout: {
43
+ lookup: 1000,
44
+ connect: 500,
45
+ secureConnect: 500,
46
+ socket: 100000,
47
+ send: 100000,
48
+ response: RESPONSE_TIMEOUT
49
+ },
50
+ http2: DAFAULT_HTTP2,
51
+ https: {
52
+ rejectUnauthorized: false
53
+ },
54
+ dnsLookupIpVersion: 'ipv4'
45
55
  };
46
56
 
47
57
  class HttpModule extends _OxygenModule.default {
@@ -65,9 +75,9 @@ class HttpModule extends _OxygenModule.default {
65
75
  return MODULE_NAME;
66
76
  }
67
77
  /**
68
- * @summary Sets user defined HTTP options (such as proxy, gzip and etc.)
69
- * @function options
70
- * @param {Object} opts - HTTP request options object, see [Request Options](https://github.com/request/request#requestoptions-callback).
78
+ * @summary Sets user defined HTTP options (such as proxy, decompress and etc.)
79
+ * @function setOptions
80
+ * @param {Object} opts - HTTP request options object, see [Request Options](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md).
71
81
  * In addition to the options listed in the linked document, 'deflateRaw' option can be used when server returns Deflate-compressed stream without headers.
72
82
  */
73
83
 
@@ -76,8 +86,7 @@ class HttpModule extends _OxygenModule.default {
76
86
  this._userHttpOptions = opts;
77
87
 
78
88
  if (opts.deflateRaw) {
79
- this._userHttpOptions.encoding = null;
80
- this._userHttpOptions.gzip = false; // gzip=true in default options so we override it
89
+ this._userHttpOptions.decompress = false; // decompress=true in default options so we override it
81
90
  }
82
91
  }
83
92
  /**
@@ -89,11 +98,32 @@ class HttpModule extends _OxygenModule.default {
89
98
 
90
99
  setProxy(url) {
91
100
  if (url) {
92
- this._userHttpOptions = { ...(this._userHttpOptions || {}),
93
- proxy: url
94
- };
95
- } else if (this._userHttpOptions && this._userHttpOptions.proxy) {
96
- delete this._userHttpOptions.proxy;
101
+ const {
102
+ bootstrap
103
+ } = require('global-agent');
104
+
105
+ const {
106
+ parse
107
+ } = require('url');
108
+
109
+ const parsedUrl = parse(url);
110
+
111
+ if (!parsedUrl.hostname) {
112
+ throw new _OxygenError.default(_helper.default.errorCode.HTTP_ERROR, 'Hostname in undefined');
113
+ }
114
+
115
+ if (!parsedUrl.port) {
116
+ throw new _OxygenError.default(_helper.default.errorCode.HTTP_ERROR, 'Port in undefined');
117
+ }
118
+
119
+ if (!parsedUrl.protocol) {
120
+ throw new _OxygenError.default(_helper.default.errorCode.HTTP_ERROR, 'Protocol in undefined');
121
+ }
122
+
123
+ bootstrap();
124
+ global.GLOBAL_AGENT.HTTP_PROXY = url;
125
+ } else {
126
+ global.GLOBAL_AGENT.HTTP_PROXY = false;
97
127
  }
98
128
  }
99
129
  /**
@@ -121,14 +151,14 @@ class HttpModule extends _OxygenModule.default {
121
151
  */
122
152
 
123
153
 
124
- get(url, headers) {
154
+ async get(url, headers) {
125
155
  const httpOpts = { ...DEFAULT_HTTP_OPTIONS,
126
156
  ...(this._userHttpOptions || {}),
127
157
  url: url,
128
158
  method: 'GET',
129
159
  headers: headers || {}
130
160
  };
131
- return this._httpRequestSync(httpOpts);
161
+ return await this._httpRequestSync(httpOpts);
132
162
  }
133
163
  /**
134
164
  * @summary Performs HTTP POST
@@ -140,15 +170,17 @@ class HttpModule extends _OxygenModule.default {
140
170
  */
141
171
 
142
172
 
143
- post(url, data, headers) {
173
+ async post(url, data, headers) {
174
+ const resolvedData = this._resolveData(data);
175
+
144
176
  const httpOpts = { ...DEFAULT_HTTP_OPTIONS,
145
177
  ...(this._userHttpOptions || {}),
146
178
  url: url,
147
179
  method: 'POST',
148
- body: data,
149
- headers: headers || {}
180
+ headers: headers || {},
181
+ ...resolvedData
150
182
  };
151
- return this._httpRequestSync(httpOpts);
183
+ return await this._httpRequestSync(httpOpts);
152
184
  }
153
185
  /**
154
186
  * @summary Performs HTTP PUT
@@ -160,15 +192,17 @@ class HttpModule extends _OxygenModule.default {
160
192
  */
161
193
 
162
194
 
163
- put(url, data, headers) {
195
+ async put(url, data, headers) {
196
+ const resolvedData = this._resolveData(data);
197
+
164
198
  const httpOpts = { ...DEFAULT_HTTP_OPTIONS,
165
199
  ...(this._userHttpOptions || {}),
166
200
  url: url,
167
201
  method: 'PUT',
168
- body: data,
169
- headers: headers || {}
202
+ headers: headers || {},
203
+ ...resolvedData
170
204
  };
171
- return this._httpRequestSync(httpOpts);
205
+ return await this._httpRequestSync(httpOpts);
172
206
  }
173
207
  /**
174
208
  * @summary Performs HTTP PATCH
@@ -180,33 +214,39 @@ class HttpModule extends _OxygenModule.default {
180
214
  */
181
215
 
182
216
 
183
- patch(url, data, headers) {
217
+ async patch(url, data, headers) {
218
+ const resolvedData = this._resolveData(data);
219
+
184
220
  const httpOpts = { ...DEFAULT_HTTP_OPTIONS,
185
221
  ...(this._userHttpOptions || {}),
186
222
  url: url,
187
223
  method: 'PATCH',
188
- body: data,
189
- headers: headers || {}
224
+ headers: headers || {},
225
+ ...resolvedData
190
226
  };
191
- return this._httpRequestSync(httpOpts);
227
+ return await this._httpRequestSync(httpOpts);
192
228
  }
193
229
  /**
194
230
  * @summary Performs HTTP DELETE
195
231
  * @function delete
196
232
  * @param {String} url - URL.
197
233
  * @param {Object=} headers - HTTP headers.
234
+ * @param {Object} data - Data.
198
235
  * @return {Object} Response object.
199
236
  */
200
237
 
201
238
 
202
- delete(url, headers) {
239
+ async delete(url, headers, data) {
240
+ const resolvedData = this._resolveData(data);
241
+
203
242
  const httpOpts = { ...DEFAULT_HTTP_OPTIONS,
204
243
  ...(this._userHttpOptions || {}),
205
244
  url: url,
206
245
  method: 'DELETE',
207
- headers: headers || {}
246
+ headers: headers || {},
247
+ ...resolvedData
208
248
  };
209
- return this._httpRequestSync(httpOpts);
249
+ return await this._httpRequestSync(httpOpts);
210
250
  }
211
251
  /**
212
252
  * @summary Returns last response object
@@ -374,42 +414,88 @@ class HttpModule extends _OxygenModule.default {
374
414
  global._lastTransactionName = name;
375
415
  }
376
416
 
377
- _httpRequestSync(httpOpts) {
417
+ _resolveData(data) {
418
+ const dataResolver = {};
419
+
420
+ if (data instanceof Object) {
421
+ _utils.default.assertCircular(data);
422
+
423
+ dataResolver.json = data;
424
+ } else {
425
+ dataResolver.body = data;
426
+ }
427
+
428
+ return dataResolver;
429
+ }
430
+
431
+ async _httpRequestSync(httpOpts) {
378
432
  let result;
379
- (0, _request.default)(httpOpts, (err, res, body) => {
380
- // support for raw (without headers) content-encoding: deflate
381
- // https://github.com/request/request/issues/2197
382
- if (httpOpts.deflateRaw && !err) {
383
- var zlib = require('zlib');
384
-
385
- if (res.headers['content-encoding'] === 'deflate') {
386
- let decomp = zlib.createInflateRaw();
387
- decomp.write(res.body);
388
- decomp.on('data', data => {
389
- res.body = data.toString();
390
-
391
- if (res.headers['content-type'] === 'application/json') {
392
- try {
393
- res.body = JSON.parse(res.body);
394
- } catch (e) {// if parsing fails just return the original string
433
+
434
+ try {
435
+ result = await (0, _got.default)(httpOpts);
436
+
437
+ if (httpOpts.deflateRaw && result.headers['content-encoding'] === 'deflate') {
438
+ const zlib = require('zlib');
439
+
440
+ const decomp = zlib.createInflateRaw();
441
+ decomp.write(result.body);
442
+ await (() => {
443
+ return new Promise((resolve, reject) => {
444
+ decomp.on('data', data => {
445
+ result.body = data.toString();
446
+
447
+ if (result.headers['content-type'].includes('application/json')) {
448
+ try {
449
+ result.body = JSON.parse(result.body);
450
+ } catch (e) {// if parsing fails just return the original string
451
+ }
395
452
  }
396
- }
397
453
 
398
- result = res;
454
+ resolve();
455
+ });
399
456
  });
400
- } else {
401
- result = res;
402
- }
457
+ })();
403
458
  } else {
404
- result = err || res;
459
+ if (result.headers['content-type'].includes('application/json')) {
460
+ try {
461
+ result.body = JSON.parse(result.body);
462
+ } catch (e) {// if parsing fails just return the original string
463
+ }
464
+ }
405
465
  }
406
- });
407
- deasync.loopWhile(() => !result); // store last response to allow further assertions and validations
466
+ } catch (e) {
467
+ result = e;
468
+ } // store last response to allow further assertions and validations
469
+
408
470
 
409
471
  this._lastResponse = result;
410
472
 
411
- if (result instanceof Error && this.options && !this.options.httpAutoThrowError) {
412
- throw new _OxygenError.default(_helper.default.errorCode.HTTP_ERROR, result.message);
473
+ if (result instanceof Error) {
474
+ result = {
475
+ errorMessage: result.message,
476
+ headers: result.response ? result.response.headers : null,
477
+ statusCode: result.response ? result.response.statusCode : null,
478
+ statusMessage: result.response ? result.response.statusMessage : null,
479
+ rawBody: result.response ? result.response.rawBody : null,
480
+ body: result.response ? result.response.body : null
481
+ };
482
+ } else {
483
+ result = {
484
+ httpVersion: result.httpVersion,
485
+ headers: result.headers,
486
+ upgrade: result.upgrade,
487
+ url: result.url,
488
+ method: result.method,
489
+ statusCode: result.statusCode,
490
+ statusMessage: result.statusMessage,
491
+ timings: result.timings,
492
+ requestUrl: result.requestUrl,
493
+ redirectUrls: result.redirectUrls,
494
+ isFromCache: result.isFromCache,
495
+ ip: result.ip,
496
+ retryCount: result.retryCount,
497
+ body: result.body
498
+ };
413
499
  }
414
500
 
415
501
  return result;
@@ -418,4 +504,4 @@ class HttpModule extends _OxygenModule.default {
418
504
  }
419
505
 
420
506
  exports.default = HttpModule;
421
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS1odHRwLmpzIl0sIm5hbWVzIjpbImRlYXN5bmMiLCJyZXF1aXJlIiwiTU9EVUxFX05BTUUiLCJSRVNQT05TRV9USU1FT1VUIiwiREVGQVVMVF9IVFRQX09QVElPTlMiLCJqc29uIiwiZ3ppcCIsInRpbWVvdXQiLCJyZWplY3RVbmF1dGhvcml6ZWQiLCJIdHRwTW9kdWxlIiwiT3h5Z2VuTW9kdWxlIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwiY29udGV4dCIsInJzIiwibG9nZ2VyIiwibW9kdWxlcyIsInNlcnZpY2VzIiwiX2Fsd2F5c0luaXRpYWxpemVkIiwiX2xhc3RSZXNwb25zZSIsIl9iYXNlVXJsIiwiX3VzZXJIdHRwT3B0aW9ucyIsIl9pc0luaXRpYWxpemVkIiwibmFtZSIsInNldE9wdGlvbnMiLCJvcHRzIiwiZGVmbGF0ZVJhdyIsImVuY29kaW5nIiwic2V0UHJveHkiLCJ1cmwiLCJwcm94eSIsImdldCIsImhlYWRlcnMiLCJodHRwT3B0cyIsIm1ldGhvZCIsIl9odHRwUmVxdWVzdFN5bmMiLCJwb3N0IiwiZGF0YSIsImJvZHkiLCJwdXQiLCJwYXRjaCIsImRlbGV0ZSIsImdldFJlc3BvbnNlIiwiZ2V0UmVzcG9uc2VCb2R5IiwiZ2V0UmVzcG9uc2VIZWFkZXJzIiwiZ2V0UmVzcG9uc2VVcmwiLCJhc3NlcnRUZXh0IiwicGF0dGVybiIsIk94RXJyb3IiLCJlcnJIZWxwZXIiLCJlcnJvckNvZGUiLCJBU1NFUlRfRVJST1IiLCJyZXNwQ29udGVudCIsIkpTT04iLCJzdHJpbmdpZnkiLCJtb2RVdGlscyIsIm1hdGNoUGF0dGVybiIsImFzc2VydFJlc3BvbnNlVGltZSIsIm1heFRpbWUiLCJFcnJvciIsImFzc2VydEhlYWRlciIsImhlYWRlck5hbWUiLCJoZWFkZXJWYWx1ZVBhdHRlcm4iLCJsZW5ndGgiLCJ0b0xvd2VyQ2FzZSIsImFjdHVhbEhlYWRlclZhbHVlIiwiYXNzZXJ0Q29va2llIiwiY29va2llTmFtZSIsImNvb2tpZVZhbHVlUGF0dGVybiIsImFzc2VydFN0YXR1cyIsImNvZGVMaXN0IiwiQXJyYXkiLCJpc0FycmF5Iiwic3RhdHVzQ29kZSIsImluY2x1ZGVzIiwiYXNzZXJ0U3RhdHVzT2siLCJ0cmFuc2FjdGlvbiIsImdsb2JhbCIsIl9sYXN0VHJhbnNhY3Rpb25OYW1lIiwicmVzdWx0IiwiZXJyIiwicmVzIiwiemxpYiIsImRlY29tcCIsImNyZWF0ZUluZmxhdGVSYXciLCJ3cml0ZSIsIm9uIiwidG9TdHJpbmciLCJwYXJzZSIsImUiLCJsb29wV2hpbGUiLCJodHRwQXV0b1Rocm93RXJyb3IiLCJIVFRQX0VSUk9SIiwibWVzc2FnZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBYUE7O0FBR0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBLE1BQU1BLE9BQU8sR0FBR0MsT0FBTyxDQUFDLFNBQUQsQ0FBdkI7O0FBT0EsTUFBTUMsV0FBVyxHQUFHLE1BQXBCO0FBQ0EsTUFBTUMsZ0JBQWdCLEdBQUcsT0FBTyxFQUFoQyxDLENBQXNDOztBQUN0QyxNQUFNQyxvQkFBb0IsR0FBRztBQUN6QkMsRUFBQUEsSUFBSSxFQUFFLElBRG1CO0FBRXpCQyxFQUFBQSxJQUFJLEVBQUUsSUFGbUI7QUFHekJDLEVBQUFBLE9BQU8sRUFBRUosZ0JBSGdCO0FBSXpCSyxFQUFBQSxrQkFBa0IsRUFBRTtBQUpLLENBQTdCOztBQU9lLE1BQU1DLFVBQU4sU0FBeUJDLHFCQUF6QixDQUFzQztBQUNqREMsRUFBQUEsV0FBVyxDQUFDQyxPQUFELEVBQVVDLE9BQVYsRUFBbUJDLEVBQW5CLEVBQXVCQyxNQUF2QixFQUErQkMsT0FBL0IsRUFBd0NDLFFBQXhDLEVBQWtEO0FBQ3pELFVBQU1MLE9BQU4sRUFBZUMsT0FBZixFQUF3QkMsRUFBeEIsRUFBNEJDLE1BQTVCLEVBQW9DQyxPQUFwQyxFQUE2Q0MsUUFB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QkFBSixDQUFZQyxnQkFBVUMsU0FBVixDQUFvQjBDLFVBQWhDLEVBQTRDYixNQUFNLENBQUNjLE9BQW5ELENBQU47QUFDSDs7QUFDRCxXQUFPZCxNQUFQO0FBQ0g7O0FBdlZnRCIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIENvcHlyaWdodCAoQykgMjAxNS1wcmVzZW50IENsb3VkQmVhdCBMaW1pdGVkXHJcbiAqXHJcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XHJcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XHJcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXHJcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lIGh0dHBcclxuICogQGRlc2NyaXB0aW9uIFByb3ZpZGVzIG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCBIVFRQKFMpXHJcbiAqL1xyXG5pbXBvcnQgcmVxdWVzdCBmcm9tICdyZXF1ZXN0JztcclxuY29uc3QgZGVhc3luYyA9IHJlcXVpcmUoJ2RlYXN5bmMnKTtcclxuXHJcbmltcG9ydCBPeHlnZW5Nb2R1bGUgZnJvbSAnLi4vY29yZS9PeHlnZW5Nb2R1bGUnO1xyXG5pbXBvcnQgT3hFcnJvciBmcm9tICcuLi9lcnJvcnMvT3h5Z2VuRXJyb3InO1xyXG5pbXBvcnQgZXJySGVscGVyIGZyb20gJy4uL2Vycm9ycy9oZWxwZXInO1xyXG5pbXBvcnQgbW9kVXRpbHMgZnJvbSAnLi91dGlscyc7XHJcblxyXG5jb25zdCBNT0RVTEVfTkFNRSA9ICdodHRwJztcclxuY29uc3QgUkVTUE9OU0VfVElNRU9VVCA9IDEwMDAgKiAzMDsgICAvLyBpbiBtc1xyXG5jb25zdCBERUZBVUxUX0hUVFBfT1BUSU9OUyA9IHtcclxuICAgIGpzb246IHRydWUsXHJcbiAgICBnemlwOiB0cnVlLFxyXG4gICAgdGltZW91dDogUkVTUE9OU0VfVElNRU9VVCxcclxuICAgIHJlamVjdFVuYXV0aG9yaXplZDogZmFsc2VcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEh0dHBNb2R1bGUgZXh0ZW5kcyBPeHlnZW5Nb2R1bGUge1xyXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucywgY29udGV4dCwgcnMsIGxvZ2dlciwgbW9kdWxlcywgc2VydmljZXMpIHtcclxuICAgICAgICBzdXBlcihvcHRpb25zLCBjb250ZXh0LCBycywgbG9nZ2VyLCBtb2R1bGVzLCBzZXJ2aWNlcyk7XHJcbiAgICAgICAgdGhpcy5fYWx3YXlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2xhc3RSZXNwb25zZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fYmFzZVVybCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fdXNlckh0dHBPcHRpb25zID0ge307XHJcbiAgICAgICAgLy8gcHJlLWluaXRpYWxpemUgdGhlIG1vZHVsZVxyXG4gICAgICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qXHJcbiAgICAgKiBAc3VtbWFyeSBHZXRzIG1vZHVsZSBuYW1lXHJcbiAgICAgKiBAZnVuY3Rpb24gbmFtZVxyXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBDb25zdGFudCB2YWx1ZSBcImh0dHBcIi5cclxuICAgICAqL1xyXG4gICAgZ2V0IG5hbWUoKSB7XHJcbiAgICAgICAgcmV0dXJuIE1PRFVMRV9OQU1FO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgU2V0cyB1c2VyIGRlZmluZWQgSFRUUCBvcHRpb25zIChzdWNoIGFzIHByb3h5LCBnemlwIGFuZCBldGMuKVxyXG4gICAgICogQGZ1bmN0aW9uIG9wdGlvbnNcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gSFRUUCByZXF1ZXN0IG9wdGlvbnMgb2JqZWN0LCBzZWUgW1JlcXVlc3QgT3B0aW9uc10oaHR0cHM6Ly9naXRodWIuY29tL3JlcXVlc3QvcmVxdWVzdCNyZXF1ZXN0b3B0aW9ucy1jYWxsYmFjaykuIFxyXG4gICAgICogSW4gYWRkaXRpb24gdG8gdGhlIG9wdGlvbnMgbGlzdGVkIGluIHRoZSBsaW5rZWQgZG9jdW1lbnQsICdkZWZsYXRlUmF3JyBvcHRpb24gY2FuIGJlIHVzZWQgd2hlbiBzZXJ2ZXIgcmV0dXJucyBEZWZsYXRlLWNvbXByZXNzZWQgc3RyZWFtIHdpdGhvdXQgaGVhZGVycy5cclxuICAgICAqL1xyXG4gICAgc2V0T3B0aW9ucyhvcHRzKSB7XHJcbiAgICAgICAgdGhpcy5fdXNlckh0dHBPcHRpb25zID0gb3B0cztcclxuICAgICAgICBpZiAob3B0cy5kZWZsYXRlUmF3KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3VzZXJIdHRwT3B0aW9ucy5lbmNvZGluZyA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuX3VzZXJIdHRwT3B0aW9ucy5nemlwID0gZmFsc2U7ICAgICAvLyBnemlwPXRydWUgaW4gZGVmYXVsdCBvcHRpb25zIHNvIHdlIG92ZXJyaWRlIGl0XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgU2V0cyBwcm94eSB1cmwgdG8gYmUgdXNlZCBmb3IgY29ubmVjdGlvbnMgd2l0aCB0aGUgc2VydmljZS5cclxuICAgICAqIEBmdW5jdGlvbiBzZXRQcm94eVxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCAtIFByb3h5IHNlcnZlciBVUkwuIE5vdCBwYXNzaW5nIHRoaXMgYXJndW1lbnQgd2lsbCByZXNldCB0aGUgcHJveHkgc2V0dGluZ3MuXHJcbiAgICAgKi9cclxuICAgIHNldFByb3h5KHVybCkge1xyXG4gICAgICAgIGlmICh1cmwpIHtcclxuICAgICAgICAgICAgdGhpcy5fdXNlckh0dHBPcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgLi4udGhpcy5fdXNlckh0dHBPcHRpb25zIHx8IHt9LFxyXG4gICAgICAgICAgICAgICAgcHJveHk6ICB1cmxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3VzZXJIdHRwT3B0aW9ucyAmJiB0aGlzLl91c2VySHR0cE9wdGlvbnMucHJveHkpIHtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX3VzZXJIdHRwT3B0aW9ucy5wcm94eTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBQZXJmb3JtcyBIVFRQIEdFVFxyXG4gICAgICogQGZ1bmN0aW9uIGdldFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCAtIFVSTC5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gaGVhZGVycyAtIEhUVFAgaGVhZGVycy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gUmVzcG9uc2Ugb2JqZWN0LlxyXG4gICAgICogQGV4YW1wbGUgPGNhcHRpb24+W2phdmFzY3JpcHRdIFVzYWdlIGV4YW1wbGU8L2NhcHRpb24+XHJcbiAgICAgKiAvLyBCYXNpYyB1c2FnZSBleGFtcGxlOlxyXG4gICAgICogdmFyIHJlc3BvbnNlID0gaHR0cC5nZXQoXHJcbiAgICAgKiAnaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9veHlnZW5ocS9veHlnZW4taWRlL3JlbGVhc2VzJywgXHJcbiAgICAgKiB7XHJcbiAgICAgKiAgICdBY2NlcHQtRW5jb2RpbmcnOiAnZ3ppcCwgZGVmbGF0ZScsXHJcbiAgICAgKiAgICdVc2VyLUFnZW50JzogJ01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQ7IHJ2Ojg2LjApIEdlY2tvLzIwMTAwMTAxIEZpcmVmb3gvODYuMCdcclxuICAgICAqIH0pO1xyXG4gICAgICogbG9nLmluZm8ocmVzcG9uc2UuYm9keSk7XHJcbiAgICAgKlxyXG4gICAgICogLy8gSWYgc2VydmVyIHJldHVybnMgRGVmbGF0ZS1jb21wcmVzc2VkIHN0cmVhbSB3aXRob3V0IGhlYWRlcnMsIGBkZWZsYXRlUmF3YCBjYW4gYmUgdXNlZCB0byBkZWNvbXByZXNzIHRoZSBjb250ZW50LlxyXG4gICAgICogaHR0cC5zZXRPcHRpb25zKHtcclxuICAgICAqICAgZGVmbGF0ZVJhdzogdHJ1ZVxyXG4gICAgICogfSk7XHJcbiAgICAgKiB2YXIgcmVzcG9uc2UgPSBodHRwLmdldCgnaHR0cHM6Ly9GT08uQkFSJyk7XHJcbiAgICAgKiBsb2cuaW5mbyhyZXNwb25zZS5ib2R5KTtcclxuICAgICAqL1xyXG4gICAgZ2V0KHVybCwgaGVhZGVycykge1xyXG4gICAgICAgIGNvbnN0IGh0dHBPcHRzID0ge1xyXG4gICAgICAgICAgICAuLi5ERUZBVUxUX0hUVFBfT1BUSU9OUyxcclxuICAgICAgICAgICAgLi4udGhpcy5fdXNlckh0dHBPcHRpb25zIHx8IHt9LFxyXG4gICAgICAgICAgICB1cmw6IHVybCxcclxuICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcclxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyB8fCB7fVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHBSZXF1ZXN0U3luYyhodHRwT3B0cyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBQZXJmb3JtcyBIVFRQIFBPU1RcclxuICAgICAqIEBmdW5jdGlvbiBwb3N0XHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0gVVJMLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBEYXRhLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3Q9fSBoZWFkZXJzIC0gSFRUUCBoZWFkZXJzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXNwb25zZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHBvc3QodXJsLCBkYXRhLCBoZWFkZXJzKSB7XHJcbiAgICAgICAgY29uc3QgaHR0cE9wdHMgPSB7XHJcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfSFRUUF9PUFRJT05TLFxyXG4gICAgICAgICAgICAuLi50aGlzLl91c2VySHR0cE9wdGlvbnMgfHwge30sXHJcbiAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgICAgICAgYm9keTogZGF0YSxcclxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyB8fCB7fVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHBSZXF1ZXN0U3luYyhodHRwT3B0cyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBQZXJmb3JtcyBIVFRQIFBVVFxyXG4gICAgICogQGZ1bmN0aW9uIHB1dFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCAtIFVSTC5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gRGF0YS5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gaGVhZGVycyAtIEhUVFAgaGVhZGVycy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gUmVzcG9uc2Ugb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdXQodXJsLCBkYXRhLCBoZWFkZXJzKSB7XHJcbiAgICAgICAgY29uc3QgaHR0cE9wdHMgPSB7XHJcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfSFRUUF9PUFRJT05TLFxyXG4gICAgICAgICAgICAuLi50aGlzLl91c2VySHR0cE9wdGlvbnMgfHwge30sXHJcbiAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICBtZXRob2Q6ICdQVVQnLFxyXG4gICAgICAgICAgICBib2R5OiBkYXRhLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzIHx8IHt9XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gdGhpcy5faHR0cFJlcXVlc3RTeW5jKGh0dHBPcHRzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFBlcmZvcm1zIEhUVFAgUEFUQ0hcclxuICAgICAqIEBmdW5jdGlvbiBwYXRjaFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCAtIFVSTC5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gRGF0YS5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gaGVhZGVycyAtIEhUVFAgaGVhZGVycy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gUmVzcG9uc2Ugb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwYXRjaCh1cmwsIGRhdGEsIGhlYWRlcnMpIHtcclxuICAgICAgICBjb25zdCBodHRwT3B0cyA9IHtcclxuICAgICAgICAgICAgLi4uREVGQVVMVF9IVFRQX09QVElPTlMsXHJcbiAgICAgICAgICAgIC4uLnRoaXMuX3VzZXJIdHRwT3B0aW9ucyB8fCB7fSxcclxuICAgICAgICAgICAgdXJsOiB1cmwsXHJcbiAgICAgICAgICAgIG1ldGhvZDogJ1BBVENIJyxcclxuICAgICAgICAgICAgYm9keTogZGF0YSxcclxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyB8fCB7fVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHBSZXF1ZXN0U3luYyhodHRwT3B0cyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBQZXJmb3JtcyBIVFRQIERFTEVURVxyXG4gICAgICogQGZ1bmN0aW9uIGRlbGV0ZVxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCAtIFVSTC5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gaGVhZGVycyAtIEhUVFAgaGVhZGVycy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gUmVzcG9uc2Ugb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBkZWxldGUodXJsLCBoZWFkZXJzKSB7XHJcbiAgICAgICAgY29uc3QgaHR0cE9wdHMgPSB7XHJcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfSFRUUF9PUFRJT05TLFxyXG4gICAgICAgICAgICAuLi50aGlzLl91c2VySHR0cE9wdGlvbnMgfHwge30sXHJcbiAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICBtZXRob2Q6ICdERUxFVEUnLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzIHx8IHt9XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gdGhpcy5faHR0cFJlcXVlc3RTeW5jKGh0dHBPcHRzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFJldHVybnMgbGFzdCByZXNwb25zZSBvYmplY3RcclxuICAgICAqIEBmdW5jdGlvbiBnZXRSZXNwb25zZVxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXNwb25zZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGdldFJlc3BvbnNlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9sYXN0UmVzcG9uc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIGxhc3QgcmVzcG9uc2UgYm9keVxyXG4gICAgICogQGZ1bmN0aW9uIGdldFJlc3BvbnNlQm9keVxyXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBSZXNwb25zZSBib2R5LlxyXG4gICAgICovXHJcbiAgICBnZXRSZXNwb25zZUJvZHkoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhc3RSZXNwb25zZSAmJiB0aGlzLl9sYXN0UmVzcG9uc2UuYm9keSA/IHRoaXMuX2xhc3RSZXNwb25zZS5ib2R5IDogbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFJldHVybnMgcmVzcG9uc2UgaGVhZGVyc1xyXG4gICAgICogQGZ1bmN0aW9uIGdldFJlc3BvbnNlSGVhZGVyc1xyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXNwb25zZSBoZWFkZXJzLlxyXG4gICAgICovXHJcbiAgICBnZXRSZXNwb25zZUhlYWRlcnMoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9sYXN0UmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9sYXN0UmVzcG9uc2UuaGVhZGVycztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFJldHVybnMgcmVzcG9uc2UgVVJMXHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0UmVzcG9uc2VVcmxcclxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gUmVzcG9uc2UgVVJMLlxyXG4gICAgICovXHJcbiAgICBnZXRSZXNwb25zZVVybCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2xhc3RSZXNwb25zZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhc3RSZXNwb25zZS51cmw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBBc3NlcnQgd2hldGhlciB0aGUgc3BlY2lmaWVkIHBhdHRlcm4gaXMgcHJlc2VudCBpbiB0aGUgcmVzcG9uc2UgYm9keS5cclxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRUZXh0XHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcGF0dGVybiAtIFBhdHRlcm4gdG8gYXNzZXJ0LlxyXG4gICAgICovXHJcbiAgICBhc3NlcnRUZXh0KHBhdHRlcm4pIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2xhc3RSZXNwb25zZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5fbGFzdFJlc3BvbnNlLmJvZHkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsICdSZXNwb25zZSBib2R5IGlzIGVtcHR5Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJlc3BDb250ZW50ID0gdHlwZW9mIHRoaXMuX2xhc3RSZXNwb25zZS5ib2R5ID09PSAnc3RyaW5nJyA/IHRoaXMuX2xhc3RSZXNwb25zZS5ib2R5IDogSlNPTi5zdHJpbmdpZnkodGhpcy5fbGFzdFJlc3BvbnNlLmJvZHkpO1xyXG4gICAgICAgIGlmICghbW9kVXRpbHMubWF0Y2hQYXR0ZXJuKHJlc3BDb250ZW50LCBwYXR0ZXJuKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgYEV4cGVjdGVkIEhUVFAgcmVzcG9uc2UgY29udGVudCB0byBtYXRjaDogXCIke3BhdHRlcm59XCIgYnV0IGdvdDogXCIke3Jlc3BDb250ZW50fVwiYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IHJlc3BvbnNlIHRpbWVcclxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRSZXNwb25zZVRpbWVcclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBtYXhUaW1lIC0gTWF4aW11bSByZXNwb25zZSB0aW1lIGluIG1pbGxpc2Vjb25kcy5cclxuICAgICAqL1xyXG4gICAgYXNzZXJ0UmVzcG9uc2VUaW1lKG1heFRpbWUpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IGlmIEhUVFAgaGVhZGVyIGlzIHByZXNlbnRlZCBpbiB0aGUgcmVzcG9uc2VcclxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRIZWFkZXJcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBoZWFkZXJOYW1lIC0gQSBIVFRQIGhlYWRlciBuYW1lLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBoZWFkZXJWYWx1ZVBhdHRlcm4gLSBBbiBvcHRpb25hbCBIVFRQIGhlYWRlciB2YWx1ZSBwYXR0ZXJuLlxyXG4gICAgICovXHJcbiAgICBhc3NlcnRIZWFkZXIoaGVhZGVyTmFtZSwgaGVhZGVyVmFsdWVQYXR0ZXJuID0gbnVsbCkge1xyXG4gICAgICAgIGlmICghaGVhZGVyTmFtZSB8fCB0eXBlb2YgaGVhZGVyTmFtZSAhPT0gJ3N0cmluZycgfHwgaGVhZGVyTmFtZS5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGhlYWRlck5hbWUgPSBoZWFkZXJOYW1lLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMuX2xhc3RSZXNwb25zZS5oZWFkZXJzO1xyXG4gICAgICAgIGlmICghaGVhZGVyc1toZWFkZXJOYW1lXSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgJ0V4cGVjdGVkIEhUVFAgaGVhZGVyIFwiJHtoZWFkZXJOYW1lfVwiIHRvIGJlIHByZXNlbnQnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoaGVhZGVyVmFsdWVQYXR0ZXJuICYmIHR5cGVvZiBoZWFkZXJWYWx1ZVBhdHRlcm4gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdHVhbEhlYWRlclZhbHVlID0gaGVhZGVyc1toZWFkZXJOYW1lXTtcclxuICAgICAgICAgICAgaWYgKCFtb2RVdGlscy5tYXRjaFBhdHRlcm4oYWN0dWFsSGVhZGVyVmFsdWUsIGhlYWRlclZhbHVlUGF0dGVybikpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBgRXhwZWN0ZWQgSFRUUCBoZWFkZXIgXCIke2hlYWRlck5hbWV9XCIgdmFsdWUgdG8gbWF0Y2g6IFwiJHtoZWFkZXJWYWx1ZVBhdHRlcm59XCIgYnV0IGdvdDogXCIke2FjdHVhbEhlYWRlclZhbHVlfVwiYCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBBc3NlcnQgaWYgSFRUUCBjb29raWUgaXMgcHJlc2VudGVkIGluIHRoZSByZXNwb25zZVxyXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydENvb2tpZVxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGNvb2tpZU5hbWUgLSBBIEhUVFAgY29va2llIG5hbWUuXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IGNvb2tpZVZhbHVlUGF0dGVybiAtIEFuIG9wdGlvbmFsIEhUVFAgY29va2llIHZhbHVlIHBhdHRlcm4uXHJcbiAgICAgKi9cclxuICAgIGFzc2VydENvb2tpZShjb29raWVOYW1lLCBjb29raWVWYWx1ZVBhdHRlcm4pIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IHRoZSBsYXN0IEhUVFAgcmVzcG9uc2UncyBzdGF0dXMgY29kZVxyXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydFN0YXR1c1xyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ8QXJyYXl9IGNvZGVMaXN0IC0gQSBzaW5nbGUgc3RhdHVzIGNvZGUgb3IgYSBsaXN0IG9mIGNvZGVzLlxyXG4gICAgICovXHJcbiAgICBhc3NlcnRTdGF0dXMoY29kZUxpc3QpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2xhc3RSZXNwb25zZSB8fCAhY29kZUxpc3QpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBpZiB3ZSBnb3QgYSBzaW5nbGUgdmFsdWUsIHRoZW4gY29udmVydCBpdCB0byBhbiBhcnJheVxyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb2RlTGlzdCkpIHtcclxuICAgICAgICAgICAgY29kZUxpc3QgPSBbY29kZUxpc3RdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBzdGF0dXNDb2RlID0gdGhpcy5fbGFzdFJlc3BvbnNlLnN0YXR1c0NvZGU7XHJcbiAgICAgICAgaWYgKCFjb2RlTGlzdC5pbmNsdWRlcyhzdGF0dXNDb2RlKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgYEV4cGVjdGVkIEhUVFAgc3RhdHVzIHRvIGJlOiBcIiR7Y29kZUxpc3R9XCIgYnV0IGdvdDogXCIke3N0YXR1c0NvZGV9XCJgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBBc3NlcnQgSFRUUCAyMDAgT0sgc3RhdHVzXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0U3RhdHVzT2tcclxuICAgICAqL1xyXG4gICAgYXNzZXJ0U3RhdHVzT2soKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYXNzZXJ0U3RhdHVzKDIwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBPcGVucyBuZXcgdHJhbnNhY3Rpb24uXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gVGhlIHRyYW5zYWN0aW9uIHdpbGwgcGVyc2lzdCB0aWxsIGEgbmV3IG9uZSBpcyBvcGVuZWQuIFRyYW5zYWN0aW9uIG5hbWVzIG11c3QgYmVcclxuICAgICAqICAgICAgICAgICAgICB1bmlxdWUuXHJcbiAgICAgKiBAZnVuY3Rpb24gdHJhbnNhY3Rpb25cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIC0gVGhlIHRyYW5zYWN0aW9uIG5hbWUuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHRyYW5zYWN0aW9uKG5hbWUpIHtcclxuICAgICAgICBnbG9iYWwuX2xhc3RUcmFuc2FjdGlvbk5hbWUgPSBuYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIF9odHRwUmVxdWVzdFN5bmMoaHR0cE9wdHMpIHtcclxuICAgICAgICBsZXQgcmVzdWx0O1xyXG4gICAgICAgIHJlcXVlc3QoaHR0cE9wdHMsXHJcbiAgICAgICAgICAgIChlcnIsIHJlcywgYm9keSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3IgcmF3ICh3aXRob3V0IGhlYWRlcnMpIGNvbnRlbnQtZW5jb2Rpbmc6IGRlZmxhdGVcclxuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9yZXF1ZXN0L3JlcXVlc3QvaXNzdWVzLzIxOTdcclxuICAgICAgICAgICAgICAgIGlmIChodHRwT3B0cy5kZWZsYXRlUmF3ICYmICFlcnIpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgemxpYiA9IHJlcXVpcmUoJ3psaWInKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzLmhlYWRlcnNbJ2NvbnRlbnQtZW5jb2RpbmcnXSA9PT0gJ2RlZmxhdGUnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkZWNvbXAgPSB6bGliLmNyZWF0ZUluZmxhdGVSYXcoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVjb21wLndyaXRlKHJlcy5ib2R5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVjb21wLm9uKCdkYXRhJywgKGRhdGEpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5ib2R5ID0gZGF0YS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5oZWFkZXJzWydjb250ZW50LXR5cGUnXSA9PT0gJ2FwcGxpY2F0aW9uL2pzb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmJvZHkgPSBKU09OLnBhcnNlKHJlcy5ib2R5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHBhcnNpbmcgZmFpbHMganVzdCByZXR1cm4gdGhlIG9yaWdpbmFsIHN0cmluZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZXJyIHx8IHJlcztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgZGVhc3luYy5sb29wV2hpbGUoKCkgPT4gIXJlc3VsdCk7XHJcbiAgICAgICAgLy8gc3RvcmUgbGFzdCByZXNwb25zZSB0byBhbGxvdyBmdXJ0aGVyIGFzc2VydGlvbnMgYW5kIHZhbGlkYXRpb25zXHJcbiAgICAgICAgdGhpcy5fbGFzdFJlc3BvbnNlID0gcmVzdWx0O1xyXG5cclxuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IgJiYgdGhpcy5vcHRpb25zICYmICF0aGlzLm9wdGlvbnMuaHR0cEF1dG9UaHJvd0Vycm9yKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuSFRUUF9FUlJPUiwgcmVzdWx0Lm1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
507
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS1odHRwLmpzIl0sIm5hbWVzIjpbIk1PRFVMRV9OQU1FIiwiUkVTUE9OU0VfVElNRU9VVCIsIkRBRkFVTFRfSFRUUDIiLCJERUZBVUxUX0hUVFBfT1BUSU9OUyIsImRlY29tcHJlc3MiLCJyZXNwb25zZVR5cGUiLCJ0aW1lb3V0IiwibG9va3VwIiwiY29ubmVjdCIsInNlY3VyZUNvbm5lY3QiLCJzb2NrZXQiLCJzZW5kIiwicmVzcG9uc2UiLCJodHRwMiIsImh0dHBzIiwicmVqZWN0VW5hdXRob3JpemVkIiwiZG5zTG9va3VwSXBWZXJzaW9uIiwiSHR0cE1vZHVsZSIsIk94eWdlbk1vZHVsZSIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsImNvbnRleHQiLCJycyIsImxvZ2dlciIsIm1vZHVsZXMiLCJzZXJ2aWNlcyIsIl9hbHdheXNJbml0aWFsaXplZCIsIl9sYXN0UmVzcG9uc2UiLCJfYmFzZVVybCIsIl91c2VySHR0cE9wdGlvbnMiLCJfaXNJbml0aWFsaXplZCIsIm5hbWUiLCJzZXRPcHRpb25zIiwib3B0cyIsImRlZmxhdGVSYXciLCJzZXRQcm94eSIsInVybCIsImJvb3RzdHJhcCIsInJlcXVpcmUiLCJwYXJzZSIsInBhcnNlZFVybCIsImhvc3RuYW1lIiwiT3hFcnJvciIsImVyckhlbHBlciIsImVycm9yQ29kZSIsIkhUVFBfRVJST1IiLCJwb3J0IiwicHJvdG9jb2wiLCJnbG9iYWwiLCJHTE9CQUxfQUdFTlQiLCJIVFRQX1BST1hZIiwiZ2V0IiwiaGVhZGVycyIsImh0dHBPcHRzIiwibWV0aG9kIiwiX2h0dHBSZXF1ZXN0U3luYyIsInBvc3QiLCJkYXRhIiwicmVzb2x2ZWREYXRhIiwiX3Jlc29sdmVEYXRhIiwicHV0IiwicGF0Y2giLCJkZWxldGUiLCJnZXRSZXNwb25zZSIsImdldFJlc3BvbnNlQm9keSIsImJvZHkiLCJnZXRSZXNwb25zZUhlYWRlcnMiLCJnZXRSZXNwb25zZVVybCIsImFzc2VydFRleHQiLCJwYXR0ZXJuIiwiQVNTRVJUX0VSUk9SIiwicmVzcENvbnRlbnQiLCJKU09OIiwic3RyaW5naWZ5IiwibW9kVXRpbHMiLCJtYXRjaFBhdHRlcm4iLCJhc3NlcnRSZXNwb25zZVRpbWUiLCJtYXhUaW1lIiwiRXJyb3IiLCJhc3NlcnRIZWFkZXIiLCJoZWFkZXJOYW1lIiwiaGVhZGVyVmFsdWVQYXR0ZXJuIiwibGVuZ3RoIiwidG9Mb3dlckNhc2UiLCJhY3R1YWxIZWFkZXJWYWx1ZSIsImFzc2VydENvb2tpZSIsImNvb2tpZU5hbWUiLCJjb29raWVWYWx1ZVBhdHRlcm4iLCJhc3NlcnRTdGF0dXMiLCJjb2RlTGlzdCIsIkFycmF5IiwiaXNBcnJheSIsInN0YXR1c0NvZGUiLCJpbmNsdWRlcyIsImFzc2VydFN0YXR1c09rIiwidHJhbnNhY3Rpb24iLCJfbGFzdFRyYW5zYWN0aW9uTmFtZSIsImRhdGFSZXNvbHZlciIsIk9iamVjdCIsImFzc2VydENpcmN1bGFyIiwianNvbiIsInJlc3VsdCIsInpsaWIiLCJkZWNvbXAiLCJjcmVhdGVJbmZsYXRlUmF3Iiwid3JpdGUiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIm9uIiwidG9TdHJpbmciLCJlIiwiZXJyb3JNZXNzYWdlIiwibWVzc2FnZSIsInN0YXR1c01lc3NhZ2UiLCJyYXdCb2R5IiwiaHR0cFZlcnNpb24iLCJ1cGdyYWRlIiwidGltaW5ncyIsInJlcXVlc3RVcmwiLCJyZWRpcmVjdFVybHMiLCJpc0Zyb21DYWNoZSIsImlwIiwicmV0cnlDb3VudCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBYUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQU9BLE1BQU1BLFdBQVcsR0FBRyxNQUFwQjtBQUNBLE1BQU1DLGdCQUFnQixHQUFHLE9BQU8sRUFBaEMsQyxDQUFzQzs7QUFDdEMsTUFBTUMsYUFBYSxHQUFHLEtBQXRC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QUFNLENBQUNxQixFQVpOO0FBYUxDLFFBQUFBLFVBQVUsRUFBRXRCLE1BQU0sQ0FBQ3NCLFVBYmQ7QUFjTDFELFFBQUFBLElBQUksRUFBRW9DLE1BQU0sQ0FBQ3BDO0FBZFIsT0FBVDtBQWdCSDs7QUFFRCxXQUFPb0MsTUFBUDtBQUNIOztBQTFaZ0QiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUtcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZSBodHRwXHJcbiAqIEBkZXNjcmlwdGlvbiBQcm92aWRlcyBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggSFRUUChTKVxyXG4gKi9cclxuaW1wb3J0IGdvdCBmcm9tICdnb3QnO1xyXG5pbXBvcnQgT3h5Z2VuTW9kdWxlIGZyb20gJy4uL2NvcmUvT3h5Z2VuTW9kdWxlJztcclxuaW1wb3J0IE94RXJyb3IgZnJvbSAnLi4vZXJyb3JzL094eWdlbkVycm9yJztcclxuaW1wb3J0IGVyckhlbHBlciBmcm9tICcuLi9lcnJvcnMvaGVscGVyJztcclxuaW1wb3J0IG1vZFV0aWxzIGZyb20gJy4vdXRpbHMnO1xyXG5cclxuY29uc3QgTU9EVUxFX05BTUUgPSAnaHR0cCc7XHJcbmNvbnN0IFJFU1BPTlNFX1RJTUVPVVQgPSAxMDAwICogMzA7ICAgLy8gaW4gbXNcclxuY29uc3QgREFGQVVMVF9IVFRQMiA9IGZhbHNlO1xyXG5jb25zdCBERUZBVUxUX0hUVFBfT1BUSU9OUyA9IHtcclxuICAgIGRlY29tcHJlc3M6IHRydWUsXHJcbiAgICByZXNwb25zZVR5cGU6ICd0ZXh0JyxcclxuICAgIHRpbWVvdXQ6IHtcclxuICAgICAgICBsb29rdXA6IDEwMDAsXHJcbiAgICAgICAgY29ubmVjdDogNTAwLFxyXG4gICAgICAgIHNlY3VyZUNvbm5lY3Q6IDUwMCxcclxuICAgICAgICBzb2NrZXQ6IDEwMDAwMCxcclxuICAgICAgICBzZW5kOiAxMDAwMDAsXHJcbiAgICAgICAgcmVzcG9uc2U6IFJFU1BPTlNFX1RJTUVPVVRcclxuICAgIH0sXHJcbiAgICBodHRwMjogREFGQVVMVF9IVFRQMixcclxuICAgIGh0dHBzOiB7XHJcbiAgICAgICAgcmVqZWN0VW5hdXRob3JpemVkOiBmYWxzZVxyXG4gICAgfSxcclxuICAgIGRuc0xvb2t1cElwVmVyc2lvbjogJ2lwdjQnXHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIdHRwTW9kdWxlIGV4dGVuZHMgT3h5Z2VuTW9kdWxlIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMsIGNvbnRleHQsIHJzLCBsb2dnZXIsIG1vZHVsZXMsIHNlcnZpY2VzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0aW9ucywgY29udGV4dCwgcnMsIGxvZ2dlciwgbW9kdWxlcywgc2VydmljZXMpO1xyXG4gICAgICAgIHRoaXMuX2Fsd2F5c0luaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9sYXN0UmVzcG9uc2UgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2Jhc2VVcmwgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX3VzZXJIdHRwT3B0aW9ucyA9IHt9O1xyXG4gICAgICAgIC8vIHByZS1pbml0aWFsaXplIHRoZSBtb2R1bGVcclxuICAgICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKlxyXG4gICAgICogQHN1bW1hcnkgR2V0cyBtb2R1bGUgbmFtZVxyXG4gICAgICogQGZ1bmN0aW9uIG5hbWVcclxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gQ29uc3RhbnQgdmFsdWUgXCJodHRwXCIuXHJcbiAgICAgKi9cclxuICAgIGdldCBuYW1lKCkge1xyXG4gICAgICAgIHJldHVybiBNT0RVTEVfTkFNRTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFNldHMgdXNlciBkZWZpbmVkIEhUVFAgb3B0aW9ucyAoc3VjaCBhcyBwcm94eSwgZGVjb21wcmVzcyBhbmQgZXRjLilcclxuICAgICAqIEBmdW5jdGlvbiBzZXRPcHRpb25zXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIEhUVFAgcmVxdWVzdCBvcHRpb25zIG9iamVjdCwgc2VlIFtSZXF1ZXN0IE9wdGlvbnNdKGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvZ290L2Jsb2IvbWFpbi9kb2N1bWVudGF0aW9uLzItb3B0aW9ucy5tZCkuIFxyXG4gICAgICogSW4gYWRkaXRpb24gdG8gdGhlIG9wdGlvbnMgbGlzdGVkIGluIHRoZSBsaW5rZWQgZG9jdW1lbnQsICdkZWZsYXRlUmF3JyBvcHRpb24gY2FuIGJlIHVzZWQgd2hlbiBzZXJ2ZXIgcmV0dXJucyBEZWZsYXRlLWNvbXByZXNzZWQgc3RyZWFtIHdpdGhvdXQgaGVhZGVycy5cclxuICAgICAqL1xyXG4gICAgc2V0T3B0aW9ucyhvcHRzKSB7XHJcbiAgICAgICAgdGhpcy5fdXNlckh0dHBPcHRpb25zID0gb3B0cztcclxuICAgICAgICBpZiAob3B0cy5kZWZsYXRlUmF3KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3VzZXJIdHRwT3B0aW9ucy5kZWNvbXByZXNzID0gZmFsc2U7ICAgICAvLyBkZWNvbXByZXNzPXRydWUgaW4gZGVmYXVsdCBvcHRpb25zIHNvIHdlIG92ZXJyaWRlIGl0XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgU2V0cyBwcm94eSB1cmwgdG8gYmUgdXNlZCBmb3IgY29ubmVjdGlvbnMgd2l0aCB0aGUgc2VydmljZS5cclxuICAgICAqIEBmdW5jdGlvbiBzZXRQcm94eVxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCAtIFByb3h5IHNlcnZlciBVUkwuIE5vdCBwYXNzaW5nIHRoaXMgYXJndW1lbnQgd2lsbCByZXNldCB0aGUgcHJveHkgc2V0dGluZ3MuXHJcbiAgICAgKi9cclxuICAgIHNldFByb3h5KHVybCkge1xyXG4gICAgICAgIGlmICh1cmwpIHtcclxuICAgICAgICAgICAgY29uc3Qge1xyXG4gICAgICAgICAgICAgICAgYm9vdHN0cmFwXHJcbiAgICAgICAgICAgIH0gPSByZXF1aXJlKCdnbG9iYWwtYWdlbnQnKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHsgcGFyc2UgfSA9IHJlcXVpcmUoJ3VybCcpO1xyXG4gICAgICAgICAgICBjb25zdCBwYXJzZWRVcmwgPSBwYXJzZSh1cmwpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFwYXJzZWRVcmwuaG9zdG5hbWUpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuSFRUUF9FUlJPUiwgJ0hvc3RuYW1lIGluIHVuZGVmaW5lZCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghcGFyc2VkVXJsLnBvcnQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuSFRUUF9FUlJPUiwgJ1BvcnQgaW4gdW5kZWZpbmVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFwYXJzZWRVcmwucHJvdG9jb2wpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuSFRUUF9FUlJPUiwgJ1Byb3RvY29sIGluIHVuZGVmaW5lZCcpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBib290c3RyYXAoKTtcclxuICAgICAgICAgICAgZ2xvYmFsLkdMT0JBTF9BR0VOVC5IVFRQX1BST1hZID0gdXJsO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5HTE9CQUxfQUdFTlQuSFRUUF9QUk9YWSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFBlcmZvcm1zIEhUVFAgR0VUXHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0XHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0gVVJMLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3Q9fSBoZWFkZXJzIC0gSFRUUCBoZWFkZXJzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXNwb25zZSBvYmplY3QuXHJcbiAgICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5bamF2YXNjcmlwdF0gVXNhZ2UgZXhhbXBsZTwvY2FwdGlvbj5cclxuICAgICAqIC8vIEJhc2ljIHVzYWdlIGV4YW1wbGU6XHJcbiAgICAgKiB2YXIgcmVzcG9uc2UgPSBodHRwLmdldChcclxuICAgICAqICdodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL294eWdlbmhxL294eWdlbi1pZGUvcmVsZWFzZXMnLCBcclxuICAgICAqIHtcclxuICAgICAqICAgJ0FjY2VwdC1FbmNvZGluZyc6ICdnemlwLCBkZWZsYXRlJyxcclxuICAgICAqICAgJ1VzZXItQWdlbnQnOiAnTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NDsgcnY6ODYuMCkgR2Vja28vMjAxMDAxMDEgRmlyZWZveC84Ni4wJ1xyXG4gICAgICogfSk7XHJcbiAgICAgKiBsb2cuaW5mbyhyZXNwb25zZS5ib2R5KTtcclxuICAgICAqXHJcbiAgICAgKiAvLyBJZiBzZXJ2ZXIgcmV0dXJucyBEZWZsYXRlLWNvbXByZXNzZWQgc3RyZWFtIHdpdGhvdXQgaGVhZGVycywgYGRlZmxhdGVSYXdgIGNhbiBiZSB1c2VkIHRvIGRlY29tcHJlc3MgdGhlIGNvbnRlbnQuXHJcbiAgICAgKiBodHRwLnNldE9wdGlvbnMoe1xyXG4gICAgICogICBkZWZsYXRlUmF3OiB0cnVlXHJcbiAgICAgKiB9KTtcclxuICAgICAqIHZhciByZXNwb25zZSA9IGh0dHAuZ2V0KCdodHRwczovL0ZPTy5CQVInKTtcclxuICAgICAqIGxvZy5pbmZvKHJlc3BvbnNlLmJvZHkpO1xyXG4gICAgICovXHJcbiAgICBhc3luYyBnZXQodXJsLCBoZWFkZXJzKSB7XHJcbiAgICAgICAgY29uc3QgaHR0cE9wdHMgPSB7XHJcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfSFRUUF9PUFRJT05TLFxyXG4gICAgICAgICAgICAuLi50aGlzLl91c2VySHR0cE9wdGlvbnMgfHwge30sXHJcbiAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzIHx8IHt9XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5faHR0cFJlcXVlc3RTeW5jKGh0dHBPcHRzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFBlcmZvcm1zIEhUVFAgUE9TVFxyXG4gICAgICogQGZ1bmN0aW9uIHBvc3RcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgLSBVUkwuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIERhdGEuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdD19IGhlYWRlcnMgLSBIVFRQIGhlYWRlcnMuXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJlc3BvbnNlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgcG9zdCh1cmwsIGRhdGEsIGhlYWRlcnMpIHtcclxuICAgICAgICBjb25zdCByZXNvbHZlZERhdGEgPSB0aGlzLl9yZXNvbHZlRGF0YShkYXRhKTtcclxuXHJcbiAgICAgICAgY29uc3QgaHR0cE9wdHMgPSB7XHJcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfSFRUUF9PUFRJT05TLFxyXG4gICAgICAgICAgICAuLi50aGlzLl91c2VySHR0cE9wdGlvbnMgfHwge30sXHJcbiAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyB8fCB7fSxcclxuICAgICAgICAgICAgLi4ucmVzb2x2ZWREYXRhXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5faHR0cFJlcXVlc3RTeW5jKGh0dHBPcHRzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFBlcmZvcm1zIEhUVFAgUFVUXHJcbiAgICAgKiBAZnVuY3Rpb24gcHV0XHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0gVVJMLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBEYXRhLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3Q9fSBoZWFkZXJzIC0gSFRUUCBoZWFkZXJzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXNwb25zZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHB1dCh1cmwsIGRhdGEsIGhlYWRlcnMpIHtcclxuICAgICAgICBjb25zdCByZXNvbHZlZERhdGEgPSB0aGlzLl9yZXNvbHZlRGF0YShkYXRhKTtcclxuXHJcbiAgICAgICAgY29uc3QgaHR0cE9wdHMgPSB7XHJcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfSFRUUF9PUFRJT05TLFxyXG4gICAgICAgICAgICAuLi50aGlzLl91c2VySHR0cE9wdGlvbnMgfHwge30sXHJcbiAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICBtZXRob2Q6ICdQVVQnLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzIHx8IHt9LFxyXG4gICAgICAgICAgICAuLi5yZXNvbHZlZERhdGFcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9odHRwUmVxdWVzdFN5bmMoaHR0cE9wdHMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUGVyZm9ybXMgSFRUUCBQQVRDSFxyXG4gICAgICogQGZ1bmN0aW9uIHBhdGNoXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0gVVJMLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBEYXRhLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3Q9fSBoZWFkZXJzIC0gSFRUUCBoZWFkZXJzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXNwb25zZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHBhdGNoKHVybCwgZGF0YSwgaGVhZGVycykge1xyXG4gICAgICAgIGNvbnN0IHJlc29sdmVkRGF0YSA9IHRoaXMuX3Jlc29sdmVEYXRhKGRhdGEpO1xyXG5cclxuICAgICAgICBjb25zdCBodHRwT3B0cyA9IHtcclxuICAgICAgICAgICAgLi4uREVGQVVMVF9IVFRQX09QVElPTlMsXHJcbiAgICAgICAgICAgIC4uLnRoaXMuX3VzZXJIdHRwT3B0aW9ucyB8fCB7fSxcclxuICAgICAgICAgICAgdXJsOiB1cmwsXHJcbiAgICAgICAgICAgIG1ldGhvZDogJ1BBVENIJyxcclxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyB8fCB7fSxcclxuICAgICAgICAgICAgLi4ucmVzb2x2ZWREYXRhXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5faHR0cFJlcXVlc3RTeW5jKGh0dHBPcHRzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFBlcmZvcm1zIEhUVFAgREVMRVRFXHJcbiAgICAgKiBAZnVuY3Rpb24gZGVsZXRlXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0gVVJMLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3Q9fSBoZWFkZXJzIC0gSFRUUCBoZWFkZXJzLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBEYXRhLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXNwb25zZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGRlbGV0ZSh1cmwsIGhlYWRlcnMsIGRhdGEpIHtcclxuICAgICAgICBjb25zdCByZXNvbHZlZERhdGEgPSB0aGlzLl9yZXNvbHZlRGF0YShkYXRhKTtcclxuICAgICAgICBjb25zdCBodHRwT3B0cyA9IHtcclxuICAgICAgICAgICAgLi4uREVGQVVMVF9IVFRQX09QVElPTlMsXHJcbiAgICAgICAgICAgIC4uLnRoaXMuX3VzZXJIdHRwT3B0aW9ucyB8fCB7fSxcclxuICAgICAgICAgICAgdXJsOiB1cmwsXHJcbiAgICAgICAgICAgIG1ldGhvZDogJ0RFTEVURScsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMgfHwge30sXHJcbiAgICAgICAgICAgIC4uLnJlc29sdmVkRGF0YVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2h0dHBSZXF1ZXN0U3luYyhodHRwT3B0cyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIGxhc3QgcmVzcG9uc2Ugb2JqZWN0XHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0UmVzcG9uc2VcclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gUmVzcG9uc2Ugb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBnZXRSZXNwb25zZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbGFzdFJlc3BvbnNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyBsYXN0IHJlc3BvbnNlIGJvZHlcclxuICAgICAqIEBmdW5jdGlvbiBnZXRSZXNwb25zZUJvZHlcclxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gUmVzcG9uc2UgYm9keS5cclxuICAgICAqL1xyXG4gICAgZ2V0UmVzcG9uc2VCb2R5KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9sYXN0UmVzcG9uc2UgJiYgdGhpcy5fbGFzdFJlc3BvbnNlLmJvZHkgPyB0aGlzLl9sYXN0UmVzcG9uc2UuYm9keSA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIHJlc3BvbnNlIGhlYWRlcnNcclxuICAgICAqIEBmdW5jdGlvbiBnZXRSZXNwb25zZUhlYWRlcnNcclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gUmVzcG9uc2UgaGVhZGVycy5cclxuICAgICAqL1xyXG4gICAgZ2V0UmVzcG9uc2VIZWFkZXJzKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fbGFzdFJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5fbGFzdFJlc3BvbnNlLmhlYWRlcnM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIHJlc3BvbnNlIFVSTFxyXG4gICAgICogQGZ1bmN0aW9uIGdldFJlc3BvbnNlVXJsXHJcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFJlc3BvbnNlIFVSTC5cclxuICAgICAqL1xyXG4gICAgZ2V0UmVzcG9uc2VVcmwoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9sYXN0UmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9sYXN0UmVzcG9uc2UudXJsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwYXR0ZXJuIGlzIHByZXNlbnQgaW4gdGhlIHJlc3BvbnNlIGJvZHkuXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0VGV4dFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdHRlcm4gLSBQYXR0ZXJuIHRvIGFzc2VydC5cclxuICAgICAqL1xyXG4gICAgYXNzZXJ0VGV4dChwYXR0ZXJuKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9sYXN0UmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuX2xhc3RSZXNwb25zZS5ib2R5KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCAnUmVzcG9uc2UgYm9keSBpcyBlbXB0eScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCByZXNwQ29udGVudCA9IHR5cGVvZiB0aGlzLl9sYXN0UmVzcG9uc2UuYm9keSA9PT0gJ3N0cmluZycgPyB0aGlzLl9sYXN0UmVzcG9uc2UuYm9keSA6IEpTT04uc3RyaW5naWZ5KHRoaXMuX2xhc3RSZXNwb25zZS5ib2R5KTtcclxuICAgICAgICBpZiAoIW1vZFV0aWxzLm1hdGNoUGF0dGVybihyZXNwQ29udGVudCwgcGF0dGVybikpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGBFeHBlY3RlZCBIVFRQIHJlc3BvbnNlIGNvbnRlbnQgdG8gbWF0Y2g6IFwiJHtwYXR0ZXJufVwiIGJ1dCBnb3Q6IFwiJHtyZXNwQ29udGVudH1cImApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCByZXNwb25zZSB0aW1lXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0UmVzcG9uc2VUaW1lXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gbWF4VGltZSAtIE1heGltdW0gcmVzcG9uc2UgdGltZSBpbiBtaWxsaXNlY29uZHMuXHJcbiAgICAgKi9cclxuICAgIGFzc2VydFJlc3BvbnNlVGltZShtYXhUaW1lKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCBpZiBIVFRQIGhlYWRlciBpcyBwcmVzZW50ZWQgaW4gdGhlIHJlc3BvbnNlXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0SGVhZGVyXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaGVhZGVyTmFtZSAtIEEgSFRUUCBoZWFkZXIgbmFtZS5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nPX0gaGVhZGVyVmFsdWVQYXR0ZXJuIC0gQW4gb3B0aW9uYWwgSFRUUCBoZWFkZXIgdmFsdWUgcGF0dGVybi5cclxuICAgICAqL1xyXG4gICAgYXNzZXJ0SGVhZGVyKGhlYWRlck5hbWUsIGhlYWRlclZhbHVlUGF0dGVybiA9IG51bGwpIHtcclxuICAgICAgICBpZiAoIWhlYWRlck5hbWUgfHwgdHlwZW9mIGhlYWRlck5hbWUgIT09ICdzdHJpbmcnIHx8IGhlYWRlck5hbWUubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBoZWFkZXJOYW1lID0gaGVhZGVyTmFtZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLl9sYXN0UmVzcG9uc2UuaGVhZGVycztcclxuICAgICAgICBpZiAoIWhlYWRlcnNbaGVhZGVyTmFtZV0pIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsICdFeHBlY3RlZCBIVFRQIGhlYWRlciBcIiR7aGVhZGVyTmFtZX1cIiB0byBiZSBwcmVzZW50Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGhlYWRlclZhbHVlUGF0dGVybiAmJiB0eXBlb2YgaGVhZGVyVmFsdWVQYXR0ZXJuID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBjb25zdCBhY3R1YWxIZWFkZXJWYWx1ZSA9IGhlYWRlcnNbaGVhZGVyTmFtZV07XHJcbiAgICAgICAgICAgIGlmICghbW9kVXRpbHMubWF0Y2hQYXR0ZXJuKGFjdHVhbEhlYWRlclZhbHVlLCBoZWFkZXJWYWx1ZVBhdHRlcm4pKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgYEV4cGVjdGVkIEhUVFAgaGVhZGVyIFwiJHtoZWFkZXJOYW1lfVwiIHZhbHVlIHRvIG1hdGNoOiBcIiR7aGVhZGVyVmFsdWVQYXR0ZXJufVwiIGJ1dCBnb3Q6IFwiJHthY3R1YWxIZWFkZXJWYWx1ZX1cImApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IGlmIEhUVFAgY29va2llIGlzIHByZXNlbnRlZCBpbiB0aGUgcmVzcG9uc2VcclxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRDb29raWVcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb29raWVOYW1lIC0gQSBIVFRQIGNvb2tpZSBuYW1lLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBjb29raWVWYWx1ZVBhdHRlcm4gLSBBbiBvcHRpb25hbCBIVFRQIGNvb2tpZSB2YWx1ZSBwYXR0ZXJuLlxyXG4gICAgICovXHJcbiAgICBhc3NlcnRDb29raWUoY29va2llTmFtZSwgY29va2llVmFsdWVQYXR0ZXJuKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCB0aGUgbGFzdCBIVFRQIHJlc3BvbnNlJ3Mgc3RhdHVzIGNvZGVcclxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRTdGF0dXNcclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfEFycmF5fSBjb2RlTGlzdCAtIEEgc2luZ2xlIHN0YXR1cyBjb2RlIG9yIGEgbGlzdCBvZiBjb2Rlcy5cclxuICAgICAqL1xyXG4gICAgYXNzZXJ0U3RhdHVzKGNvZGVMaXN0KSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9sYXN0UmVzcG9uc2UgfHwgIWNvZGVMaXN0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWYgd2UgZ290IGEgc2luZ2xlIHZhbHVlLCB0aGVuIGNvbnZlcnQgaXQgdG8gYW4gYXJyYXlcclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29kZUxpc3QpKSB7XHJcbiAgICAgICAgICAgIGNvZGVMaXN0ID0gW2NvZGVMaXN0XTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc3RhdHVzQ29kZSA9IHRoaXMuX2xhc3RSZXNwb25zZS5zdGF0dXNDb2RlO1xyXG4gICAgICAgIGlmICghY29kZUxpc3QuaW5jbHVkZXMoc3RhdHVzQ29kZSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGBFeHBlY3RlZCBIVFRQIHN0YXR1cyB0byBiZTogXCIke2NvZGVMaXN0fVwiIGJ1dCBnb3Q6IFwiJHtzdGF0dXNDb2RlfVwiYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IEhUVFAgMjAwIE9LIHN0YXR1c1xyXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydFN0YXR1c09rXHJcbiAgICAgKi9cclxuICAgIGFzc2VydFN0YXR1c09rKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFzc2VydFN0YXR1cygyMDApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgT3BlbnMgbmV3IHRyYW5zYWN0aW9uLlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFRoZSB0cmFuc2FjdGlvbiB3aWxsIHBlcnNpc3QgdGlsbCBhIG5ldyBvbmUgaXMgb3BlbmVkLiBUcmFuc2FjdGlvbiBuYW1lcyBtdXN0IGJlXHJcbiAgICAgKiAgICAgICAgICAgICAgdW5pcXVlLlxyXG4gICAgICogQGZ1bmN0aW9uIHRyYW5zYWN0aW9uXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSAtIFRoZSB0cmFuc2FjdGlvbiBuYW1lLlxyXG4gICAgICovXHJcbiAgICBhc3luYyB0cmFuc2FjdGlvbihuYW1lKSB7XHJcbiAgICAgICAgZ2xvYmFsLl9sYXN0VHJhbnNhY3Rpb25OYW1lID0gbmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBfcmVzb2x2ZURhdGEoZGF0YSkge1xyXG4gICAgICAgIGNvbnN0IGRhdGFSZXNvbHZlciA9IHt9O1xyXG5cclxuICAgICAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIE9iamVjdCkge1xyXG4gICAgICAgICAgICBtb2RVdGlscy5hc3NlcnRDaXJjdWxhcihkYXRhKTtcclxuICAgICAgICAgICAgZGF0YVJlc29sdmVyLmpzb24gPSBkYXRhO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGRhdGFSZXNvbHZlci5ib2R5ID0gZGF0YTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBkYXRhUmVzb2x2ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX2h0dHBSZXF1ZXN0U3luYyhodHRwT3B0cykge1xyXG4gICAgICAgIGxldCByZXN1bHQ7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IGdvdChodHRwT3B0cyk7XHJcbiAgICAgICAgICAgIGlmIChodHRwT3B0cy5kZWZsYXRlUmF3ICYmIHJlc3VsdC5oZWFkZXJzWydjb250ZW50LWVuY29kaW5nJ10gPT09ICdkZWZsYXRlJykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgemxpYiA9IHJlcXVpcmUoJ3psaWInKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRlY29tcCA9IHpsaWIuY3JlYXRlSW5mbGF0ZVJhdygpO1xyXG4gICAgICAgICAgICAgICAgZGVjb21wLndyaXRlKHJlc3VsdC5ib2R5KTtcclxuICAgICAgICAgICAgICAgIGF3YWl0ICgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVjb21wLm9uKCdkYXRhJywgKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ib2R5ID0gZGF0YS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5oZWFkZXJzWydjb250ZW50LXR5cGUnXS5pbmNsdWRlcygnYXBwbGljYXRpb24vanNvbicpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmJvZHkgPSBKU09OLnBhcnNlKHJlc3VsdC5ib2R5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHBhcnNpbmcgZmFpbHMganVzdCByZXR1cm4gdGhlIG9yaWdpbmFsIHN0cmluZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KSgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5oZWFkZXJzWydjb250ZW50LXR5cGUnXS5pbmNsdWRlcygnYXBwbGljYXRpb24vanNvbicpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmJvZHkgPSBKU09OLnBhcnNlKHJlc3VsdC5ib2R5KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHBhcnNpbmcgZmFpbHMganVzdCByZXR1cm4gdGhlIG9yaWdpbmFsIHN0cmluZ1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBzdG9yZSBsYXN0IHJlc3BvbnNlIHRvIGFsbG93IGZ1cnRoZXIgYXNzZXJ0aW9ucyBhbmQgdmFsaWRhdGlvbnNcclxuICAgICAgICB0aGlzLl9sYXN0UmVzcG9uc2UgPSByZXN1bHQ7XHJcblxyXG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xyXG4gICAgICAgICAgICByZXN1bHQgPSB7XHJcbiAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IHJlc3VsdC5tZXNzYWdlLFxyXG4gICAgICAgICAgICAgICAgaGVhZGVyczogcmVzdWx0LnJlc3BvbnNlID8gcmVzdWx0LnJlc3BvbnNlLmhlYWRlcnMgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgc3RhdHVzQ29kZTogcmVzdWx0LnJlc3BvbnNlID8gcmVzdWx0LnJlc3BvbnNlLnN0YXR1c0NvZGUgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgc3RhdHVzTWVzc2FnZTogcmVzdWx0LnJlc3BvbnNlID8gcmVzdWx0LnJlc3BvbnNlLnN0YXR1c01lc3NhZ2UgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgcmF3Qm9keTogcmVzdWx0LnJlc3BvbnNlID8gcmVzdWx0LnJlc3BvbnNlLnJhd0JvZHkgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgYm9keTogcmVzdWx0LnJlc3BvbnNlID8gcmVzdWx0LnJlc3BvbnNlLmJvZHkgOiBudWxsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmVzdWx0ID0ge1xyXG4gICAgICAgICAgICAgICAgaHR0cFZlcnNpb246IHJlc3VsdC5odHRwVmVyc2lvbixcclxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlc3VsdC5oZWFkZXJzLFxyXG4gICAgICAgICAgICAgICAgdXBncmFkZTogcmVzdWx0LnVwZ3JhZGUsXHJcbiAgICAgICAgICAgICAgICB1cmw6IHJlc3VsdC51cmwsXHJcbiAgICAgICAgICAgICAgICBtZXRob2Q6IHJlc3VsdC5tZXRob2QsXHJcbiAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiByZXN1bHQuc3RhdHVzQ29kZSxcclxuICAgICAgICAgICAgICAgIHN0YXR1c01lc3NhZ2U6IHJlc3VsdC5zdGF0dXNNZXNzYWdlLFxyXG4gICAgICAgICAgICAgICAgdGltaW5nczogcmVzdWx0LnRpbWluZ3MsXHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0VXJsOiByZXN1bHQucmVxdWVzdFVybCxcclxuICAgICAgICAgICAgICAgIHJlZGlyZWN0VXJsczogcmVzdWx0LnJlZGlyZWN0VXJscyxcclxuICAgICAgICAgICAgICAgIGlzRnJvbUNhY2hlOiByZXN1bHQuaXNGcm9tQ2FjaGUsXHJcbiAgICAgICAgICAgICAgICBpcDogcmVzdWx0LmlwLFxyXG4gICAgICAgICAgICAgICAgcmV0cnlDb3VudDogcmVzdWx0LnJldHJ5Q291bnQsXHJcbiAgICAgICAgICAgICAgICBib2R5OiByZXN1bHQuYm9keVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxufSJdfQ==
@@ -4,6 +4,8 @@ require("source-map-support/register");
4
4
 
5
5
  var _OxygenError = _interopRequireDefault(require("../errors/OxygenError"));
6
6
 
7
+ var _util = _interopRequireDefault(require("../lib/util"));
8
+
7
9
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
8
10
 
9
11
  /*
@@ -24,8 +26,6 @@ var errHelper = require('../errors/helper');
24
26
  module.exports = function () {
25
27
  var request = require('request');
26
28
 
27
- var deasync = require('deasync');
28
-
29
29
  const apiBase = 'https://api.mailinator.com/api';
30
30
 
31
31
  const _responseTimeout = 1000 * 30; // in ms
@@ -39,28 +39,13 @@ module.exports = function () {
39
39
 
40
40
  var _privateDomain;
41
41
 
42
- var _currentTry; // wait synchronously in a non-blocking manner
43
-
44
-
45
- function wait() {
46
- var isDone = false;
47
- var start = new Date().getTime();
48
- var interval = setInterval(() => {
49
- var now = new Date().getTime();
50
-
51
- if (now - start >= _retryInterval) {
52
- clearInterval(interval);
53
- isDone = true;
54
- }
55
- }, 50);
56
- deasync.loopWhile(() => !isDone);
57
- }
42
+ var _currentTry;
58
43
 
59
44
  function apiSettings() {
60
45
  return 'token=' + _token + (_privateDomain ? '&private_domain=true' : '');
61
46
  }
62
47
 
63
- function invoke(url) {
48
+ async function invoke(url) {
64
49
  var result = null;
65
50
  var options = {
66
51
  url: url,
@@ -68,15 +53,23 @@ module.exports = function () {
68
53
  json: true,
69
54
  timeout: _responseTimeout
70
55
  };
71
- request(options, (err, res, body) => {
72
- result = err || res;
73
- });
74
- deasync.loopWhile(() => !result); // retry
56
+ await (() => {
57
+ return new Promise((resolve, reject) => {
58
+ try {
59
+ request(options, (err, res, body) => {
60
+ result = err || res;
61
+ resolve();
62
+ });
63
+ } catch (e) {
64
+ reject(e);
65
+ }
66
+ });
67
+ })(); // retry
75
68
 
76
69
  if (_currentTry < _retries && (!result.statusCode || result.statusCode >= 500)) {
77
70
  _currentTry++;
78
- wait();
79
- result = invoke(url);
71
+ await _util.default.sleep(_retryInterval);
72
+ result = await invoke(url);
80
73
  }
81
74
 
82
75
  if (result.statusCode !== 200) {
@@ -125,9 +118,9 @@ module.exports = function () {
125
118
  */
126
119
 
127
120
 
128
- module.list = function (inbox) {
121
+ module.list = async function (inbox) {
129
122
  _currentTry = 0;
130
- return invoke(apiBase + '/inbox?' + apiSettings() + (inbox ? '&to=' + inbox : ''));
123
+ return await invoke(apiBase + '/inbox?' + apiSettings() + (inbox ? '&to=' + inbox : ''));
131
124
  };
132
125
  /**
133
126
  * @summary Fetches specific email.
@@ -164,9 +157,9 @@ module.exports = function () {
164
157
  */
165
158
 
166
159
 
167
- module.fetch = function (id) {
160
+ module.fetch = async function (id) {
168
161
  _currentTry = 0;
169
- return invoke(apiBase + '/email?' + apiSettings() + '&id=' + id);
162
+ return await invoke(apiBase + '/email?' + apiSettings() + '&id=' + id);
170
163
  };
171
164
  /**
172
165
  * @summary Extracts email's subject.
@@ -204,11 +197,11 @@ module.exports = function () {
204
197
  */
205
198
 
206
199
 
207
- module.delete = function (id) {
200
+ module.delete = async function (id) {
208
201
  _currentTry = 0;
209
- return invoke(apiBase + '/delete?' + apiSettings() + '&id=' + id);
202
+ return await invoke(apiBase + '/delete?' + apiSettings() + '&id=' + id);
210
203
  };
211
204
 
212
205
  return module;
213
206
  };
214
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS1tYWlsaW5hdG9yLmpzIl0sIm5hbWVzIjpbImVyckhlbHBlciIsInJlcXVpcmUiLCJtb2R1bGUiLCJleHBvcnRzIiwicmVxdWVzdCIsImRlYXN5bmMiLCJhcGlCYXNlIiwiX3Jlc3BvbnNlVGltZW91dCIsIl9yZXRyaWVzIiwiX3JldHJ5SW50ZXJ2YWwiLCJfdG9rZW4iLCJfcHJpdmF0ZURvbWFpbiIsIl9jdXJyZW50VHJ5Iiwid2FpdCIsImlzRG9uZSIsInN0YXJ0IiwiRGF0ZSIsImdldFRpbWUiLCJpbnRlcnZhbCIsInNldEludGVydmFsIiwibm93IiwiY2xlYXJJbnRlcnZhbCIsImxvb3BXaGlsZSIsImFwaVNldHRpbmdzIiwiaW52b2tlIiwidXJsIiwicmVzdWx0Iiwib3B0aW9ucyIsIm1ldGhvZCIsImpzb24iLCJ0aW1lb3V0IiwiZXJyIiwicmVzIiwiYm9keSIsInN0YXR1c0NvZGUiLCJtc2ciLCJKU09OIiwic3RyaW5naWZ5IiwiT3hFcnJvciIsImVycm9yQ29kZSIsIk1BSUxJTkFUT1JfRVJST1IiLCJpc0luaXRpYWxpemVkIiwidW5kZWZpbmVkIiwiaW5pdCIsInRva2VuIiwicHJpdmF0ZURvbWFpbiIsImxpc3QiLCJpbmJveCIsImZldGNoIiwiaWQiLCJnZXRTdWJqZWN0IiwiZW1haWxPYmoiLCJjb25zb2xlIiwibG9nIiwiZGF0YSIsInN1YmplY3QiLCJnZXRCb2R5IiwicGFydHMiLCJkZWxldGUiXSwibWFwcGluZ3MiOiI7Ozs7QUFjQTs7OztBQWRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQSxJQUFJQSxTQUFTLEdBQUdDLE9BQU8sQ0FBQyxrQkFBRCxDQUF2Qjs7QUFFQUMsTUFBTSxDQUFDQyxPQUFQLEdBQWlCLFlBQVc7QUFDeEIsTUFBSUMsT0FBTyxHQUFHSCxPQUFPLENBQUMsU0FBRCxDQUFyQjs7QUFDQSxNQUFJSSxP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QUNBO0FBQ0E7QUFDQTs7O0FBQ0lyRCxFQUFBQSxNQUFNLENBQUNzRCxPQUFQLEdBQWlCLFVBQVNMLFFBQVQsRUFBbUI7QUFDaENDLElBQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFZRixRQUFRLENBQUNHLElBQVQsQ0FBY0csS0FBZCxDQUFvQixDQUFwQixFQUF1QnhCLElBQW5DO0FBQ0EsV0FBT2tCLFFBQVEsQ0FBQ0csSUFBVCxDQUFjRyxLQUFkLENBQW9CLENBQXBCLEVBQXVCeEIsSUFBOUI7QUFDSCxHQUhEO0FBS0E7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNJL0IsRUFBQUEsTUFBTSxDQUFDd0QsTUFBUCxHQUFnQixVQUFTVCxFQUFULEVBQWE7QUFDekJyQyxJQUFBQSxXQUFXLEdBQUcsQ0FBZDtBQUNBLFdBQU9ZLE1BQU0sQ0FBQ2xCLE9BQU8sR0FBRyxVQUFWLEdBQXVCaUIsV0FBVyxFQUFsQyxHQUF1QyxNQUF2QyxHQUFnRDBCLEVBQWpELENBQWI7QUFDSCxHQUhEOztBQUtBLFNBQU8vQyxNQUFQO0FBQ0gsQ0FwTEQiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxOCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZSBtYWlsaW5hdG9yXHJcbiAqIEBkZXNjcmlwdGlvbiBQcm92aWRlcyBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggTWFpbGluYXRvciBzZXJ2aWNlIC0gd3d3Lm1haWxpbmF0b3IuY29tXHJcbiAqL1xyXG5cclxuaW1wb3J0IE94RXJyb3IgZnJvbSAnLi4vZXJyb3JzL094eWdlbkVycm9yJztcclxudmFyIGVyckhlbHBlciA9IHJlcXVpcmUoJy4uL2Vycm9ycy9oZWxwZXInKTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7XHJcbiAgICB2YXIgcmVxdWVzdCA9IHJlcXVpcmUoJ3JlcXVlc3QnKTtcclxuICAgIHZhciBkZWFzeW5jID0gcmVxdWlyZSgnZGVhc3luYycpO1xyXG5cclxuICAgIGNvbnN0IGFwaUJhc2UgPSAnaHR0cHM6Ly9hcGkubWFpbGluYXRvci5jb20vYXBpJztcclxuXHJcbiAgICBjb25zdCBfcmVzcG9uc2VUaW1lb3V0ID0gMTAwMCAqIDMwOyAgIC8vIGluIG1zXHJcbiAgICBjb25zdCBfcmV0cmllcyA9IDI7ICAgICAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiByZXRyaWVzXHJcbiAgICBjb25zdCBfcmV0cnlJbnRlcnZhbCA9IDEwMDA7ICAgICAgICAgIC8vIGluIG1zXHJcblxyXG4gICAgdmFyIF90b2tlbjtcclxuICAgIHZhciBfcHJpdmF0ZURvbWFpbjtcclxuXHJcbiAgICB2YXIgX2N1cnJlbnRUcnk7XHJcblxyXG4gICAgLy8gd2FpdCBzeW5jaHJvbm91c2x5IGluIGEgbm9uLWJsb2NraW5nIG1hbm5lclxyXG4gICAgZnVuY3Rpb24gd2FpdCgpIHtcclxuICAgICAgICB2YXIgaXNEb25lID0gZmFsc2U7XHJcbiAgICAgICAgdmFyIHN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcblxyXG4gICAgICAgIHZhciBpbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgICAgICAgdmFyIG5vdyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgICAgICAgICBpZiAoKG5vdyAtIHN0YXJ0KSA+PSBfcmV0cnlJbnRlcnZhbCkge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XHJcbiAgICAgICAgICAgICAgICBpc0RvbmUgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgNTApO1xyXG5cclxuICAgICAgICBkZWFzeW5jLmxvb3BXaGlsZSgoKSA9PiAhaXNEb25lKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBhcGlTZXR0aW5ncygpIHtcclxuICAgICAgICByZXR1cm4gJ3Rva2VuPScgKyBfdG9rZW4gKyAoX3ByaXZhdGVEb21haW4gPyAnJnByaXZhdGVfZG9tYWluPXRydWUnIDogJycpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGludm9rZSh1cmwpIHtcclxuICAgICAgICB2YXIgcmVzdWx0ID0gbnVsbDtcclxuXHJcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxyXG4gICAgICAgICAgICBqc29uOiB0cnVlLFxyXG4gICAgICAgICAgICB0aW1lb3V0OiBfcmVzcG9uc2VUaW1lb3V0XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmVxdWVzdChvcHRpb25zLCAoZXJyLCByZXMsIGJvZHkpID0+IHsgcmVzdWx0ID0gZXJyIHx8IHJlczsgfSk7XHJcbiAgICAgICAgZGVhc3luYy5sb29wV2hpbGUoKCkgPT4gIXJlc3VsdCk7XHJcblxyXG4gICAgICAgIC8vIHJldHJ5XHJcbiAgICAgICAgaWYgKF9jdXJyZW50VHJ5IDwgX3JldHJpZXMgJiYgKCFyZXN1bHQuc3RhdHVzQ29kZSB8fCByZXN1bHQuc3RhdHVzQ29kZSA+PSA1MDApKSB7XHJcbiAgICAgICAgICAgIF9jdXJyZW50VHJ5Kys7XHJcbiAgICAgICAgICAgIHdhaXQoKTtcclxuICAgICAgICAgICAgcmVzdWx0ID0gaW52b2tlKHVybCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocmVzdWx0LnN0YXR1c0NvZGUgIT09IDIwMCkge1xyXG4gICAgICAgICAgICB2YXIgbXNnID0gcmVzdWx0LnN0YXR1c0NvZGUgPyAnU3RhdHVzIENvZGUgLSAnICsgcmVzdWx0LnN0YXR1c0NvZGUgOiAnRXJyb3IgLSAnICsgSlNPTi5zdHJpbmdpZnkocmVzdWx0KTtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NQUlMSU5BVE9SX0VSUk9SLCBtc2cpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5ib2R5O1xyXG4gICAgfVxyXG5cclxuICAgIG1vZHVsZS5pc0luaXRpYWxpemVkID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIF90b2tlbiAhPT0gdW5kZWZpbmVkO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIG1haWxpbmF0b3IgbW9kdWxlLlxyXG4gICAgICogQGZ1bmN0aW9uIGluaXRcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0b2tlbiAtIEFQSSB0b2tlbi5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nPX0gcHJpdmF0ZURvbWFpbiAtIFNwZWNpZmllcyB3aGV0aGVyIHRvIHVzZSBhIHByaXZhdGUgZG9tYWluLlxyXG4gICAgICovXHJcbiAgICBtb2R1bGUuaW5pdCA9IGZ1bmN0aW9uKHRva2VuLCBwcml2YXRlRG9tYWluKSB7XHJcbiAgICAgICAgX3Rva2VuID0gdG9rZW47XHJcbiAgICAgICAgX3ByaXZhdGVEb21haW4gPSBwcml2YXRlRG9tYWluO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEZldGNoZXMgaW5ib3ggbWVzc2FnZXMgb3IgYWxsIHNhdmVkIG1lc3NhZ2VzLlxyXG4gICAgICogQGZ1bmN0aW9uIGxpc3RcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nPX0gaW5ib3ggLSBJbmJveCBuYW1lLiBJZiBvbW1pdGVkIHNhdmVkIG1lc3NhZ2VzIHdpbGwgYmUgZmV0Y2hlZCBpbnN0ZWFkLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBMaXN0IGNvbnRhaW5pbmcgbWVzc2FnZSBkZXRhaWxzLlxyXG4gICAgICogQGV4YW1wbGUgPGNhcHRpb24+W2pzb25dIEV4YW1wbGUgb2YgdGhlIHJldHVybmVkIG9iamVjdDwvY2FwdGlvbj5cclxuICAgICAqIHtcclxuICAgICAqICAgXCJtZXNzYWdlc1wiOiBbXHJcbiAgICAgKiAgICAge1xyXG4gICAgICogICAgICAgXCJmcm9tZnVsbFwiOiBcIm5vcmVwbHlAZXhhbXBsZS5jb21cIixcclxuICAgICAqICAgICAgIFwic3ViamVjdFwiOiBcIlN1YmplY3RcIixcclxuICAgICAqICAgICAgIFwiZnJvbVwiOiBcIlRlc3QgVGVzdGVyXCIsXHJcbiAgICAgKiAgICAgICBcIm9yaWdmcm9tXCI6IFwiVGVzdCBUZXN0ZXIgbm9yZXBseUBleGFtcGxlLmNvbVwiLFxyXG4gICAgICogICAgICAgXCJ0b1wiOiBcImluYm94LW5hbWVcIixcclxuICAgICAqICAgICAgIFwiaWRcIjogXCJSQU5ET01MWSBHRU5FUkFURUQgSURcIixcclxuICAgICAqICAgICAgIFwidGltZVwiOiAxNDkxMjAwMDMwMDAwLFxyXG4gICAgICogICAgICAgXCJzZWNvbmRzX2Fnb1wiOiAyMzRcclxuICAgICAqICAgICB9LFxyXG4gICAgICogICBdXHJcbiAgICAgKiB9XHJcbiAgICAgKi9cclxuICAgIG1vZHVsZS5saXN0ID0gZnVuY3Rpb24oaW5ib3gpIHtcclxuICAgICAgICBfY3VycmVudFRyeSA9IDA7XHJcbiAgICAgICAgcmV0dXJuIGludm9rZShhcGlCYXNlICsgJy9pbmJveD8nICsgYXBpU2V0dGluZ3MoKSArIChpbmJveCA/ICcmdG89JyArIGluYm94IDogJycpKTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBGZXRjaGVzIHNwZWNpZmljIGVtYWlsLlxyXG4gICAgICogQGZ1bmN0aW9uIGZldGNoXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgLSBNZXNzYWdlIElELlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBFbWFpbCBkZXRhaWxzLiBFLmcuXHJcbiAgICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5banNvbl0gRXhhbXBsZSBvZiB0aGUgcmV0dXJuZWQgb2JqZWN0PC9jYXB0aW9uPlxyXG4gICAgICoge1xyXG4gICAgICogICBcImRhdGFcIjpcclxuICAgICAqICAgICB7XHJcbiAgICAgKiAgICAgICBcImZyb21mdWxsXCI6XCJub3JlcGx5QGV4YW1wbGUuY29tXCIsXHJcbiAgICAgKiAgICAgICBcImhlYWRlcnNcIjogeyAuLi4gZW1haWwgaGVhZGVycyAuLi4gfSxcclxuICAgICAqICAgICAgIFwic3ViamVjdFwiOlwidGVzdCBzdWJqZWN0XCIsXHJcbiAgICAgKiAgICAgICBcInJlcXVlc3RJZFwiOlwiUkVRVUVTVCBJRFwiLFxyXG4gICAgICogICAgICAgXCJwYXJ0c1wiOiBbXHJcbiAgICAgKiAgICAgICAgIHtcclxuICAgICAqICAgICAgICAgICBcImhlYWRlcnNcIjp7IFwiY29udGVudC10eXBlXCI6XCJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04XCIgfSxcclxuICAgICAqICAgICAgICAgICBcImJvZHlcIjpcIkVNQUlMIEJPRFkgKFRFWFQpXCJcclxuICAgICAqICAgICAgICAgfSxcclxuICAgICAqICAgICAgICAge1xyXG4gICAgICogICAgICAgICAgIFwiaGVhZGVyc1wiOnsgXCJjb250ZW50LXR5cGVcIjpcInRleHQvaHRtbDsgY2hhcnNldD11dGYtOFwiIH0sXHJcbiAgICAgKiAgICAgICAgICAgXCJib2R5XCI6XCJFTUFJTCBCT0RZIChIVE1MKVwiXHJcbiAgICAgKiAgICAgICAgIH1cclxuICAgICAqICAgICAgIF0sXHJcbiAgICAgKiAgICAgICBcImZyb21cIjpcIlRlc3QgVGVzdGVyXCIsXHJcbiAgICAgKiAgICAgICBcIm9yaWdmcm9tXCI6XCJUZXN0IFRlc3RlciBub3JlcGx5QGV4YW1wbGUuY29tXCIsXHJcbiAgICAgKiAgICAgICBcInRvXCI6XCJjYi10ZXN0LTJcIixcclxuICAgICAqICAgICAgIFwiaWRcIjpcIlJBTkRPTUxZIEdFTkVSQVRFRCBJRFwiLFxyXG4gICAgICogICAgICAgXCJ0aW1lXCI6MTQ5MTIwMDAzMDAwMCxcclxuICAgICAqICAgICAgIFwic2Vjb25kc19hZ29cIjoxMTc0XHJcbiAgICAgKiAgICB9LFxyXG4gICAgICogICBcImFwaUVtYWlsRmV0Y2hlc0xlZnRcIjoxOTk5XHJcbiAgICAgKiB9XHJcbiAgICAgKi9cclxuICAgIG1vZHVsZS5mZXRjaCA9IGZ1bmN0aW9uKGlkKSB7XHJcbiAgICAgICAgX2N1cnJlbnRUcnkgPSAwO1xyXG4gICAgICAgIHJldHVybiBpbnZva2UoYXBpQmFzZSArICcvZW1haWw/JyArIGFwaVNldHRpbmdzKCkgKyAnJmlkPScgKyBpZCk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgRXh0cmFjdHMgZW1haWwncyBzdWJqZWN0LlxyXG4gICAgICogQGZ1bmN0aW9uIGdldFN1YmplY3RcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbWFpbE9iaiAtIEVtYWlsIG9iamVjdCByZXR1cm5lZCBieSBtYWlsaW5pYXRvci5mZXRjaFxyXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBFbWFpbCBzdWJqZWN0LlxyXG4gICAgICovXHJcbiAgICBtb2R1bGUuZ2V0U3ViamVjdCA9IGZ1bmN0aW9uKGVtYWlsT2JqKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZW1haWxPYmouZGF0YS5zdWJqZWN0KTtcclxuICAgICAgICByZXR1cm4gZW1haWxPYmouZGF0YS5zdWJqZWN0O1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEV4dHJhY3RzIGZpcnN0IGF2YWlsYWJsZSBlbWFpbCBib2R5LlxyXG4gICAgICogQGZ1bmN0aW9uIGdldEJvZHlcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbWFpbE9iaiAtIEVtYWlsIG9iamVjdCByZXR1cm5lZCBieSBtYWlsaW5pYXRvci5mZXRjaFxyXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBFbWFpbCBib2R5LlxyXG4gICAgICovXHJcbiAgICBtb2R1bGUuZ2V0Qm9keSA9IGZ1bmN0aW9uKGVtYWlsT2JqKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZW1haWxPYmouZGF0YS5wYXJ0c1swXS5ib2R5KTtcclxuICAgICAgICByZXR1cm4gZW1haWxPYmouZGF0YS5wYXJ0c1swXS5ib2R5O1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IERlbGV0ZXMgc2VwY2lmaWMgZW1haWwuXHJcbiAgICAgKiBAZnVuY3Rpb24gZGVsZXRlXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgLSBNZXNzYWdlIElELlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBTdGF0dXMuXHJcbiAgICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5banNvbl0gRXhhbXBsZSBvZiB0aGUgcmV0dXJuZWQgb2JqZWN0PC9jYXB0aW9uPlxyXG4gICAgICoge1xyXG4gICAgICogICBcInN0YXR1c1wiOiBcIm9rXCJcclxuICAgICAqIH1cclxuICAgICAqL1xyXG4gICAgbW9kdWxlLmRlbGV0ZSA9IGZ1bmN0aW9uKGlkKSB7XHJcbiAgICAgICAgX2N1cnJlbnRUcnkgPSAwO1xyXG4gICAgICAgIHJldHVybiBpbnZva2UoYXBpQmFzZSArICcvZGVsZXRlPycgKyBhcGlTZXR0aW5ncygpICsgJyZpZD0nICsgaWQpO1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gbW9kdWxlO1xyXG59O1xyXG4iXX0=
207
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS1tYWlsaW5hdG9yLmpzIl0sIm5hbWVzIjpbImVyckhlbHBlciIsInJlcXVpcmUiLCJtb2R1bGUiLCJleHBvcnRzIiwicmVxdWVzdCIsImFwaUJhc2UiLCJfcmVzcG9uc2VUaW1lb3V0IiwiX3JldHJpZXMiLCJfcmV0cnlJbnRlcnZhbCIsIl90b2tlbiIsIl9wcml2YXRlRG9tYWluIiwiX2N1cnJlbnRUcnkiLCJhcGlTZXR0aW5ncyIsImludm9rZSIsInVybCIsInJlc3VsdCIsIm9wdGlvbnMiLCJtZXRob2QiLCJqc29uIiwidGltZW91dCIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiZXJyIiwicmVzIiwiYm9keSIsImUiLCJzdGF0dXNDb2RlIiwibGliVXRpbHMiLCJzbGVlcCIsIm1zZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJPeEVycm9yIiwiZXJyb3JDb2RlIiwiTUFJTElOQVRPUl9FUlJPUiIsImlzSW5pdGlhbGl6ZWQiLCJ1bmRlZmluZWQiLCJpbml0IiwidG9rZW4iLCJwcml2YXRlRG9tYWluIiwibGlzdCIsImluYm94IiwiZmV0Y2giLCJpZCIsImdldFN1YmplY3QiLCJlbWFpbE9iaiIsImNvbnNvbGUiLCJsb2ciLCJkYXRhIiwic3ViamVjdCIsImdldEJvZHkiLCJwYXJ0cyIsImRlbGV0ZSJdLCJtYXBwaW5ncyI6Ijs7OztBQWNBOztBQUVBOzs7O0FBaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQSxJQUFJQSxTQUFTLEdBQUdDLE9BQU8sQ0FBQyxrQkFBRCxDQUF2Qjs7QUFHQUMsTUFBTSxDQUFDQyxPQUFQLEdBQWlCLFlBQVc7QUFDeEIsTUFBSUMsT0FBTyxHQUFHSCxPQUFPLENBQUMsU0FBRCxDQUFyQjs7QUFFQSxRQUFNSSxPQUFPLEdBQUcsZ0NBQWhCOztBQUVBLFFBQU1DLGdCQUFnQixHQUFHLE9BQU8sRUFBaEMsQ0FMd0IsQ0FLYzs7O0FBQ3RDLFFBQU1DLFFBQVEsR0FBRyxDQUFqQixDQU53QixDQU1jOztBQUN0QyxRQUFNQyxjQUFjLEdBQUcsSUFBdkIsQ0FQd0IsQ0FPYzs7QUFFdEMsTUFBSUMsTUFBSjs7QUFDQSxNQUFJQyxjQUFKOztBQUVBLE1BQUlDLFdBQUo7O0FBRUEsV0FBU0MsV0FBVCxHQUF1QjtBQUNuQixXQUFPLFdBQVdILE1BQVgsSUFBcUJDLGNBQWMsR0FBRyxzQkFBSCxHQUE0QixFQUEvRCxDQUFQO0FBQ0g7O0FBRUQsaUJBQWVHLE1BQWYsQ0FBc0JDLEdBQXRCLEVBQTJCO0FBQ3ZCLFFBQUlDLE1BQU0sR0FBRyxJQUFiO0FBRUEsUUFBSUMsT0FBTyxHQUFHO0FBQ1ZGLE1BQUFBLEdBQUcsRUFBRUEsR0FESztBQUVWRyxNQUFBQSxNQUFNLEVBQUUsS0FGRTtBQUdWQyxNQUFBQSxJQUFJLEVBQUUsSUFISTtBQUlWQyxNQUFBQSxPQUFPLEVBQUViO0FBSkMsS0FBZDtBQU9BLFVBQU0sQ0FBQyxNQUFNO0FBQ1QsYUFBTyxJQUFJYyxPQUFKLENBQVksQ0FBQ0MsT0FBRCxFQUFVQyxNQUFWLEtBQXFCO0FBQ3BDLFlBQUk7QUFDQWxCLFVBQUFBLE9BQU8sQ0FBQ1ksT0FBRCxFQUFVLENBQUNPLEdBQUQsRUFBTUMsR0FBTixFQUFXQyxJQUFYLEtBQW9CO0FBQ2pDVixZQUFBQSxNQUFNLEdBQUdRLEdBQUcsSUFBSUMsR0FBaEI7QUFDQUgsWUFBQUEsT0FBTztBQUNWLFdBSE0sQ0FBUDtBQUlILFNBTEQsQ0FLRSxPQUFPSyxDQUFQLEVBQVU7QUFDUkosVUFBQUEsTUFBTSxDQUFDSSxDQUFELENBQU47QUFDSDtBQUNKLE9BVE0sQ0FBUDtBQVVILEtBWEssR0FBTixDQVZ1QixDQXVCdkI7O0FBQ0EsUUFBSWYsV0FBVyxHQUFHSixRQUFkLEtBQTJCLENBQUNRLE1BQU0sQ0FBQ1ksVUFBUixJQUFzQlosTUFBTSxDQUFDWSxVQUFQLElBQXFCLEdBQXRFLENBQUosRUFBZ0Y7QUFDNUVoQixNQUFBQSxXQUFXO0FBQ1gsWUFBTWlCLGNBQVNDLEtBQVQsQ0FBZXJCLGNBQWYsQ0FBTjtBQUNBTyxNQUFBQSxNQUFNLEdBQUcsTUFBTUYsTUFBTSxDQUFDQyxHQUFELENBQXJCO0FBQ0g7O0FBRUQsUUFBSUMsTUFBTSxDQUFDWSxVQUFQLEtBQXNCLEdBQTFCLEVBQStCO0FBQzNCLFVBQUlHLEdBQUcsR0FBR2YsTUFBTSxDQUFDWSxVQUFQLEdBQW9CLG1CQUFtQlosTUFBTSxDQUFDWSxVQUE5QyxHQUEyRCxhQUFhSSxJQUFJLENBQUNDLFNBQUwsQ0FBZWpCLE1BQWYsQ0FBbEY7QUFDQSxZQUFNLElBQUlrQixvQkFBSixDQUFZakMsU0FBUyxDQUFDa0MsU0FBVixDQUFvQkMsZ0JBQWhDLEVBQWtETCxHQUFsRCxDQUFOO0FBQ0g7O0FBRUQsV0FBT2YsTUFBTSxDQUFDVSxJQUFkO0FBQ0g7O0FBRUR2QixFQUFBQSxNQUFNLENBQUNrQyxhQUFQLEdBQXVCLFlBQVc7QUFDOUIsV0FBTzNCLE1BQU0sS0FBSzRCLFNBQWxCO0FBQ0gsR0FGRDtBQUlBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0luQyxFQUFBQSxNQUFNLENBQUNvQyxJQUFQLEdBQWMsVUFBU0MsS0FBVCxFQUFnQkMsYUFBaEIsRUFBK0I7QUFDekMvQixJQUFBQSxNQUFNLEdBQUc4QixLQUFUO0FBQ0E3QixJQUFBQSxjQUFjLEdBQUc4QixhQUFqQjtBQUNILEdBSEQ7QUFLQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNJdEMsRUFBQUEsTUFBTSxDQUFDdUMsSUFBUCxHQUFjLGdCQUFlQyxLQUFmLEVBQXNCO0FBQ2hDL0IsSUFBQUEsV0FBVyxHQUFHLENBQWQ7QUFDQSxXQUFPLE1BQU1FLE1BQU0sQ0FBQ1IsT0FBTyxHQUFHLFNBQVYsR0FBc0JPLFdBQVcsRUFBakMsSUFBdUM4QixLQUFLLEdBQUcsU0FBU0EsS0FBWixHQUFvQixFQUFoRSxDQUFELENBQW5CO0FBQ0gsR0FIRDtBQUtBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0l4QyxFQUFBQSxNQUFNLENBQUN5QyxLQUFQLEdBQWUsZ0JBQWVDLEVBQWYsRUFBbUI7QUFDOUJqQyxJQUFBQSxXQUFXLEdBQUcsQ0FBZDtBQUNBLFdBQU8sTUFBTUUsTUFBTSxDQUFDUixPQUFPLEdBQUcsU0FBVixHQUFzQk8sV0FBVyxFQUFqQyxHQUFzQyxNQUF0QyxHQUErQ2dDLEVBQWhELENBQW5CO0FBQ0gsR0FIRDtBQUtBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0kxQyxFQUFBQSxNQUFNLENBQUMyQyxVQUFQLEdBQW9CLFVBQVNDLFFBQVQsRUFBbUI7QUFDbkNDLElBQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFZRixRQUFRLENBQUNHLElBQVQsQ0FBY0MsT0FBMUI7QUFDQSxXQUFPSixRQUFRLENBQUNHLElBQVQsQ0FBY0MsT0FBckI7QUFDSCxHQUhEO0FBS0E7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDSWhELEVBQUFBLE1BQU0sQ0FBQ2lELE9BQVAsR0FBaUIsVUFBU0wsUUFBVCxFQUFtQjtBQUNoQ0MsSUFBQUEsT0FBTyxDQUFDQyxHQUFSLENBQVlGLFFBQVEsQ0FBQ0csSUFBVCxDQUFjRyxLQUFkLENBQW9CLENBQXBCLEVBQXVCM0IsSUFBbkM7QUFDQSxXQUFPcUIsUUFBUSxDQUFDRyxJQUFULENBQWNHLEtBQWQsQ0FBb0IsQ0FBcEIsRUFBdUIzQixJQUE5QjtBQUNILEdBSEQ7QUFLQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0l2QixFQUFBQSxNQUFNLENBQUNtRCxNQUFQLEdBQWdCLGdCQUFlVCxFQUFmLEVBQW1CO0FBQy9CakMsSUFBQUEsV0FBVyxHQUFHLENBQWQ7QUFDQSxXQUFPLE1BQU1FLE1BQU0sQ0FBQ1IsT0FBTyxHQUFHLFVBQVYsR0FBdUJPLFdBQVcsRUFBbEMsR0FBdUMsTUFBdkMsR0FBZ0RnQyxFQUFqRCxDQUFuQjtBQUNILEdBSEQ7O0FBS0EsU0FBTzFDLE1BQVA7QUFDSCxDQTdLRCIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE4IENsb3VkQmVhdCBMaW1pdGVkXHJcbiAqXHJcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XHJcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XHJcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXHJcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lIG1haWxpbmF0b3JcclxuICogQGRlc2NyaXB0aW9uIFByb3ZpZGVzIG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCBNYWlsaW5hdG9yIHNlcnZpY2UgLSB3d3cubWFpbGluYXRvci5jb21cclxuICovXHJcblxyXG5pbXBvcnQgT3hFcnJvciBmcm9tICcuLi9lcnJvcnMvT3h5Z2VuRXJyb3InO1xyXG52YXIgZXJySGVscGVyID0gcmVxdWlyZSgnLi4vZXJyb3JzL2hlbHBlcicpO1xyXG5pbXBvcnQgbGliVXRpbHMgZnJvbSAnLi4vbGliL3V0aWwnO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcclxuICAgIHZhciByZXF1ZXN0ID0gcmVxdWlyZSgncmVxdWVzdCcpO1xyXG5cclxuICAgIGNvbnN0IGFwaUJhc2UgPSAnaHR0cHM6Ly9hcGkubWFpbGluYXRvci5jb20vYXBpJztcclxuXHJcbiAgICBjb25zdCBfcmVzcG9uc2VUaW1lb3V0ID0gMTAwMCAqIDMwOyAgIC8vIGluIG1zXHJcbiAgICBjb25zdCBfcmV0cmllcyA9IDI7ICAgICAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiByZXRyaWVzXHJcbiAgICBjb25zdCBfcmV0cnlJbnRlcnZhbCA9IDEwMDA7ICAgICAgICAgIC8vIGluIG1zXHJcblxyXG4gICAgdmFyIF90b2tlbjtcclxuICAgIHZhciBfcHJpdmF0ZURvbWFpbjtcclxuXHJcbiAgICB2YXIgX2N1cnJlbnRUcnk7XHJcblxyXG4gICAgZnVuY3Rpb24gYXBpU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgcmV0dXJuICd0b2tlbj0nICsgX3Rva2VuICsgKF9wcml2YXRlRG9tYWluID8gJyZwcml2YXRlX2RvbWFpbj10cnVlJyA6ICcnKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBmdW5jdGlvbiBpbnZva2UodXJsKSB7XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9IG51bGw7XHJcblxyXG4gICAgICAgIHZhciBvcHRpb25zID0ge1xyXG4gICAgICAgICAgICB1cmw6IHVybCxcclxuICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcclxuICAgICAgICAgICAganNvbjogdHJ1ZSxcclxuICAgICAgICAgICAgdGltZW91dDogX3Jlc3BvbnNlVGltZW91dFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGF3YWl0ICgoKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3Qob3B0aW9ucywgKGVyciwgcmVzLCBib2R5KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGVyciB8fCByZXM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pKCk7XHJcblxyXG4gICAgICAgIC8vIHJldHJ5XHJcbiAgICAgICAgaWYgKF9jdXJyZW50VHJ5IDwgX3JldHJpZXMgJiYgKCFyZXN1bHQuc3RhdHVzQ29kZSB8fCByZXN1bHQuc3RhdHVzQ29kZSA+PSA1MDApKSB7XHJcbiAgICAgICAgICAgIF9jdXJyZW50VHJ5Kys7XHJcbiAgICAgICAgICAgIGF3YWl0IGxpYlV0aWxzLnNsZWVwKF9yZXRyeUludGVydmFsKTtcclxuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgaW52b2tlKHVybCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocmVzdWx0LnN0YXR1c0NvZGUgIT09IDIwMCkge1xyXG4gICAgICAgICAgICB2YXIgbXNnID0gcmVzdWx0LnN0YXR1c0NvZGUgPyAnU3RhdHVzIENvZGUgLSAnICsgcmVzdWx0LnN0YXR1c0NvZGUgOiAnRXJyb3IgLSAnICsgSlNPTi5zdHJpbmdpZnkocmVzdWx0KTtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NQUlMSU5BVE9SX0VSUk9SLCBtc2cpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5ib2R5O1xyXG4gICAgfVxyXG5cclxuICAgIG1vZHVsZS5pc0luaXRpYWxpemVkID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIF90b2tlbiAhPT0gdW5kZWZpbmVkO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIG1haWxpbmF0b3IgbW9kdWxlLlxyXG4gICAgICogQGZ1bmN0aW9uIGluaXRcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0b2tlbiAtIEFQSSB0b2tlbi5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nPX0gcHJpdmF0ZURvbWFpbiAtIFNwZWNpZmllcyB3aGV0aGVyIHRvIHVzZSBhIHByaXZhdGUgZG9tYWluLlxyXG4gICAgICovXHJcbiAgICBtb2R1bGUuaW5pdCA9IGZ1bmN0aW9uKHRva2VuLCBwcml2YXRlRG9tYWluKSB7XHJcbiAgICAgICAgX3Rva2VuID0gdG9rZW47XHJcbiAgICAgICAgX3ByaXZhdGVEb21haW4gPSBwcml2YXRlRG9tYWluO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEZldGNoZXMgaW5ib3ggbWVzc2FnZXMgb3IgYWxsIHNhdmVkIG1lc3NhZ2VzLlxyXG4gICAgICogQGZ1bmN0aW9uIGxpc3RcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nPX0gaW5ib3ggLSBJbmJveCBuYW1lLiBJZiBvbW1pdGVkIHNhdmVkIG1lc3NhZ2VzIHdpbGwgYmUgZmV0Y2hlZCBpbnN0ZWFkLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBMaXN0IGNvbnRhaW5pbmcgbWVzc2FnZSBkZXRhaWxzLlxyXG4gICAgICogQGV4YW1wbGUgPGNhcHRpb24+W2pzb25dIEV4YW1wbGUgb2YgdGhlIHJldHVybmVkIG9iamVjdDwvY2FwdGlvbj5cclxuICAgICAqIHtcclxuICAgICAqICAgXCJtZXNzYWdlc1wiOiBbXHJcbiAgICAgKiAgICAge1xyXG4gICAgICogICAgICAgXCJmcm9tZnVsbFwiOiBcIm5vcmVwbHlAZXhhbXBsZS5jb21cIixcclxuICAgICAqICAgICAgIFwic3ViamVjdFwiOiBcIlN1YmplY3RcIixcclxuICAgICAqICAgICAgIFwiZnJvbVwiOiBcIlRlc3QgVGVzdGVyXCIsXHJcbiAgICAgKiAgICAgICBcIm9yaWdmcm9tXCI6IFwiVGVzdCBUZXN0ZXIgbm9yZXBseUBleGFtcGxlLmNvbVwiLFxyXG4gICAgICogICAgICAgXCJ0b1wiOiBcImluYm94LW5hbWVcIixcclxuICAgICAqICAgICAgIFwiaWRcIjogXCJSQU5ET01MWSBHRU5FUkFURUQgSURcIixcclxuICAgICAqICAgICAgIFwidGltZVwiOiAxNDkxMjAwMDMwMDAwLFxyXG4gICAgICogICAgICAgXCJzZWNvbmRzX2Fnb1wiOiAyMzRcclxuICAgICAqICAgICB9LFxyXG4gICAgICogICBdXHJcbiAgICAgKiB9XHJcbiAgICAgKi9cclxuICAgIG1vZHVsZS5saXN0ID0gYXN5bmMgZnVuY3Rpb24oaW5ib3gpIHtcclxuICAgICAgICBfY3VycmVudFRyeSA9IDA7XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IGludm9rZShhcGlCYXNlICsgJy9pbmJveD8nICsgYXBpU2V0dGluZ3MoKSArIChpbmJveCA/ICcmdG89JyArIGluYm94IDogJycpKTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBGZXRjaGVzIHNwZWNpZmljIGVtYWlsLlxyXG4gICAgICogQGZ1bmN0aW9uIGZldGNoXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgLSBNZXNzYWdlIElELlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBFbWFpbCBkZXRhaWxzLiBFLmcuXHJcbiAgICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5banNvbl0gRXhhbXBsZSBvZiB0aGUgcmV0dXJuZWQgb2JqZWN0PC9jYXB0aW9uPlxyXG4gICAgICoge1xyXG4gICAgICogICBcImRhdGFcIjpcclxuICAgICAqICAgICB7XHJcbiAgICAgKiAgICAgICBcImZyb21mdWxsXCI6XCJub3JlcGx5QGV4YW1wbGUuY29tXCIsXHJcbiAgICAgKiAgICAgICBcImhlYWRlcnNcIjogeyAuLi4gZW1haWwgaGVhZGVycyAuLi4gfSxcclxuICAgICAqICAgICAgIFwic3ViamVjdFwiOlwidGVzdCBzdWJqZWN0XCIsXHJcbiAgICAgKiAgICAgICBcInJlcXVlc3RJZFwiOlwiUkVRVUVTVCBJRFwiLFxyXG4gICAgICogICAgICAgXCJwYXJ0c1wiOiBbXHJcbiAgICAgKiAgICAgICAgIHtcclxuICAgICAqICAgICAgICAgICBcImhlYWRlcnNcIjp7IFwiY29udGVudC10eXBlXCI6XCJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04XCIgfSxcclxuICAgICAqICAgICAgICAgICBcImJvZHlcIjpcIkVNQUlMIEJPRFkgKFRFWFQpXCJcclxuICAgICAqICAgICAgICAgfSxcclxuICAgICAqICAgICAgICAge1xyXG4gICAgICogICAgICAgICAgIFwiaGVhZGVyc1wiOnsgXCJjb250ZW50LXR5cGVcIjpcInRleHQvaHRtbDsgY2hhcnNldD11dGYtOFwiIH0sXHJcbiAgICAgKiAgICAgICAgICAgXCJib2R5XCI6XCJFTUFJTCBCT0RZIChIVE1MKVwiXHJcbiAgICAgKiAgICAgICAgIH1cclxuICAgICAqICAgICAgIF0sXHJcbiAgICAgKiAgICAgICBcImZyb21cIjpcIlRlc3QgVGVzdGVyXCIsXHJcbiAgICAgKiAgICAgICBcIm9yaWdmcm9tXCI6XCJUZXN0IFRlc3RlciBub3JlcGx5QGV4YW1wbGUuY29tXCIsXHJcbiAgICAgKiAgICAgICBcInRvXCI6XCJjYi10ZXN0LTJcIixcclxuICAgICAqICAgICAgIFwiaWRcIjpcIlJBTkRPTUxZIEdFTkVSQVRFRCBJRFwiLFxyXG4gICAgICogICAgICAgXCJ0aW1lXCI6MTQ5MTIwMDAzMDAwMCxcclxuICAgICAqICAgICAgIFwic2Vjb25kc19hZ29cIjoxMTc0XHJcbiAgICAgKiAgICB9LFxyXG4gICAgICogICBcImFwaUVtYWlsRmV0Y2hlc0xlZnRcIjoxOTk5XHJcbiAgICAgKiB9XHJcbiAgICAgKi9cclxuICAgIG1vZHVsZS5mZXRjaCA9IGFzeW5jIGZ1bmN0aW9uKGlkKSB7XHJcbiAgICAgICAgX2N1cnJlbnRUcnkgPSAwO1xyXG4gICAgICAgIHJldHVybiBhd2FpdCBpbnZva2UoYXBpQmFzZSArICcvZW1haWw/JyArIGFwaVNldHRpbmdzKCkgKyAnJmlkPScgKyBpZCk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgRXh0cmFjdHMgZW1haWwncyBzdWJqZWN0LlxyXG4gICAgICogQGZ1bmN0aW9uIGdldFN1YmplY3RcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbWFpbE9iaiAtIEVtYWlsIG9iamVjdCByZXR1cm5lZCBieSBtYWlsaW5pYXRvci5mZXRjaFxyXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBFbWFpbCBzdWJqZWN0LlxyXG4gICAgICovXHJcbiAgICBtb2R1bGUuZ2V0U3ViamVjdCA9IGZ1bmN0aW9uKGVtYWlsT2JqKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZW1haWxPYmouZGF0YS5zdWJqZWN0KTtcclxuICAgICAgICByZXR1cm4gZW1haWxPYmouZGF0YS5zdWJqZWN0O1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEV4dHJhY3RzIGZpcnN0IGF2YWlsYWJsZSBlbWFpbCBib2R5LlxyXG4gICAgICogQGZ1bmN0aW9uIGdldEJvZHlcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbWFpbE9iaiAtIEVtYWlsIG9iamVjdCByZXR1cm5lZCBieSBtYWlsaW5pYXRvci5mZXRjaFxyXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBFbWFpbCBib2R5LlxyXG4gICAgICovXHJcbiAgICBtb2R1bGUuZ2V0Qm9keSA9IGZ1bmN0aW9uKGVtYWlsT2JqKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZW1haWxPYmouZGF0YS5wYXJ0c1swXS5ib2R5KTtcclxuICAgICAgICByZXR1cm4gZW1haWxPYmouZGF0YS5wYXJ0c1swXS5ib2R5O1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IERlbGV0ZXMgc2VwY2lmaWMgZW1haWwuXHJcbiAgICAgKiBAZnVuY3Rpb24gZGVsZXRlXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgLSBNZXNzYWdlIElELlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBTdGF0dXMuXHJcbiAgICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5banNvbl0gRXhhbXBsZSBvZiB0aGUgcmV0dXJuZWQgb2JqZWN0PC9jYXB0aW9uPlxyXG4gICAgICoge1xyXG4gICAgICogICBcInN0YXR1c1wiOiBcIm9rXCJcclxuICAgICAqIH1cclxuICAgICAqL1xyXG4gICAgbW9kdWxlLmRlbGV0ZSA9IGFzeW5jIGZ1bmN0aW9uKGlkKSB7XHJcbiAgICAgICAgX2N1cnJlbnRUcnkgPSAwO1xyXG4gICAgICAgIHJldHVybiBhd2FpdCBpbnZva2UoYXBpQmFzZSArICcvZGVsZXRlPycgKyBhcGlTZXR0aW5ncygpICsgJyZpZD0nICsgaWQpO1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gbW9kdWxlO1xyXG59O1xyXG4iXX0=