@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
@@ -32,19 +32,19 @@ const IPA_EXT = '.ipa';
32
32
  const ZIP_EXTS = ['.zip', IPA_EXT];
33
33
  const ZIP_MIME_TYPES = ['application/zip', 'application/x-zip-compressed', 'multipart/x-zip'];
34
34
  const CACHED_APPS_MAX_AGE = 1000 * 60 * 60 * 24;
35
+ const MAX_CACHED_APPS = 1024;
35
36
  const APPLICATIONS_CACHE = new _lruCache.default({
36
- maxAge: CACHED_APPS_MAX_AGE,
37
+ max: MAX_CACHED_APPS,
38
+ ttl: CACHED_APPS_MAX_AGE,
37
39
  updateAgeOnGet: true,
38
- dispose: async (app, {
40
+ dispose: (app, {
39
41
  fullPath
40
42
  }) => {
41
- if (!(await _support.fs.exists(fullPath))) {
42
- return;
43
- }
44
-
45
- _logger.default.info(`The application '${app}' cached at '${fullPath}' has expired`);
43
+ _logger.default.info(`The application '${app}' cached at '${fullPath}' has ` + `expired after ${CACHED_APPS_MAX_AGE}ms`);
46
44
 
47
- await _support.fs.rimraf(fullPath);
45
+ if (fullPath) {
46
+ _support.fs.rimraf(fullPath);
47
+ }
48
48
  },
49
49
  noDisposeOnSet: true
50
50
  });
@@ -53,11 +53,11 @@ const SANITIZE_REPLACEMENT = '-';
53
53
  const DEFAULT_BASENAME = 'appium-app';
54
54
  const APP_DOWNLOAD_TIMEOUT_MS = 120 * 1000;
55
55
  process.on('exit', () => {
56
- if (APPLICATIONS_CACHE.itemCount === 0) {
56
+ if (APPLICATIONS_CACHE.size === 0) {
57
57
  return;
58
58
  }
59
59
 
60
- const appPaths = APPLICATIONS_CACHE.values().map(({
60
+ const appPaths = [...APPLICATIONS_CACHE.values()].map(({
61
61
  fullPath
62
62
  }) => fullPath);
63
63
 
@@ -86,80 +86,116 @@ async function retrieveHeaders(link) {
86
86
  return {};
87
87
  }
88
88
 
89
- function getCachedApplicationPath(link, currentAppProps = {}) {
89
+ function getCachedApplicationPath(link, currentAppProps = {}, cachedAppInfo = {}) {
90
90
  const refresh = () => {
91
91
  _logger.default.debug(`A fresh copy of the application is going to be downloaded from ${link}`);
92
92
 
93
93
  return null;
94
94
  };
95
95
 
96
- if (APPLICATIONS_CACHE.has(link)) {
97
- const {
98
- lastModified: currentModified,
99
- immutable: currentImmutable,
100
- maxAge: currentMaxAge
101
- } = currentAppProps;
102
- const {
103
- lastModified,
104
- immutable,
105
- timestamp,
106
- fullPath
107
- } = APPLICATIONS_CACHE.get(link);
108
-
109
- if (lastModified && currentModified) {
110
- if (currentModified.getTime() <= lastModified.getTime()) {
111
- _logger.default.debug(`The application at ${link} has not been modified since ${lastModified}`);
112
-
113
- return fullPath;
114
- }
115
-
116
- _logger.default.debug(`The application at ${link} has been modified since ${lastModified}`);
96
+ if (!_lodash.default.isPlainObject(cachedAppInfo) || !_lodash.default.isPlainObject(currentAppProps)) {
97
+ return refresh();
98
+ }
117
99
 
118
- return refresh();
119
- }
100
+ const {
101
+ lastModified: currentModified,
102
+ immutable: currentImmutable,
103
+ maxAge: currentMaxAge
104
+ } = currentAppProps;
105
+ const {
106
+ lastModified,
107
+ immutable,
108
+ timestamp,
109
+ fullPath
110
+ } = cachedAppInfo;
120
111
 
121
- if (immutable && currentImmutable) {
122
- _logger.default.debug(`The application at ${link} is immutable`);
112
+ if (lastModified && currentModified) {
113
+ if (currentModified.getTime() <= lastModified.getTime()) {
114
+ _logger.default.debug(`The application at ${link} has not been modified since ${lastModified}`);
123
115
 
124
116
  return fullPath;
125
117
  }
126
118
 
127
- if (currentMaxAge && timestamp) {
128
- const msLeft = timestamp + currentMaxAge * 1000 - Date.now();
119
+ _logger.default.debug(`The application at ${link} has been modified since ${lastModified}`);
129
120
 
130
- if (msLeft > 0) {
131
- _logger.default.debug(`The cached application '${_path.default.basename(fullPath)}' will expire in ${msLeft / 1000}s`);
121
+ return refresh();
122
+ }
132
123
 
133
- return fullPath;
134
- }
124
+ if (immutable && currentImmutable) {
125
+ _logger.default.debug(`The application at ${link} is immutable`);
135
126
 
136
- _logger.default.debug(`The cached application '${_path.default.basename(fullPath)}' has expired`);
127
+ return fullPath;
128
+ }
129
+
130
+ if (currentMaxAge && timestamp) {
131
+ const msLeft = timestamp + currentMaxAge * 1000 - Date.now();
132
+
133
+ if (msLeft > 0) {
134
+ _logger.default.debug(`The cached application '${_path.default.basename(fullPath)}' will expire in ${msLeft / 1000}s`);
135
+
136
+ return fullPath;
137
137
  }
138
+
139
+ _logger.default.debug(`The cached application '${_path.default.basename(fullPath)}' has expired`);
138
140
  }
139
141
 
140
142
  return refresh();
141
143
  }
142
144
 
143
145
  function verifyAppExtension(app, supportedAppExtensions) {
144
- if (supportedAppExtensions.includes(_path.default.extname(app))) {
146
+ if (supportedAppExtensions.map(_lodash.default.toLower).includes(_lodash.default.toLower(_path.default.extname(app)))) {
145
147
  return app;
146
148
  }
147
149
 
148
150
  throw new Error(`New app path '${app}' did not have ` + `${_support.util.pluralize('extension', supportedAppExtensions.length, false)}: ` + supportedAppExtensions);
149
151
  }
150
152
 
151
- async function configureApp(app, supportedAppExtensions) {
153
+ async function calculateFolderIntegrity(folderPath) {
154
+ return (await _support.fs.glob('**/*', {
155
+ cwd: folderPath,
156
+ strict: false,
157
+ nosort: true
158
+ })).length;
159
+ }
160
+
161
+ async function calculateFileIntegrity(filePath) {
162
+ return await _support.fs.hash(filePath);
163
+ }
164
+
165
+ async function isAppIntegrityOk(currentPath, expectedIntegrity = {}) {
166
+ if (!(await _support.fs.exists(currentPath))) {
167
+ return false;
168
+ }
169
+
170
+ return (await _support.fs.stat(currentPath)).isDirectory() ? (await calculateFolderIntegrity(currentPath)) >= (expectedIntegrity === null || expectedIntegrity === void 0 ? void 0 : expectedIntegrity.folder) : (await calculateFileIntegrity(currentPath)) === (expectedIntegrity === null || expectedIntegrity === void 0 ? void 0 : expectedIntegrity.file);
171
+ }
172
+
173
+ async function configureApp(app, options = {}) {
152
174
  if (!_lodash.default.isString(app)) {
153
175
  return;
154
176
  }
155
177
 
156
- if (!_lodash.default.isArray(supportedAppExtensions)) {
157
- supportedAppExtensions = [supportedAppExtensions];
178
+ let supportedAppExtensions;
179
+ const {
180
+ onPostProcess
181
+ } = _lodash.default.isPlainObject(options) ? options : {};
182
+
183
+ if (_lodash.default.isString(options)) {
184
+ supportedAppExtensions = [options];
185
+ } else if (_lodash.default.isArray(options)) {
186
+ supportedAppExtensions = options;
187
+ } else if (_lodash.default.isPlainObject(options)) {
188
+ supportedAppExtensions = options.supportedExtensions;
189
+ }
190
+
191
+ if (_lodash.default.isEmpty(supportedAppExtensions)) {
192
+ throw new Error(`One or more supported app extensions must be provided`);
158
193
  }
159
194
 
160
195
  let newApp = app;
161
196
  let shouldUnzipApp = false;
162
- let archiveHash = null;
197
+ let packageHash = null;
198
+ let headers = null;
163
199
  const remoteAppProps = {
164
200
  lastModified: null,
165
201
  immutable: false,
@@ -172,11 +208,12 @@ async function configureApp(app, supportedAppExtensions) {
172
208
  } = _url.default.parse(newApp);
173
209
 
174
210
  const isUrl = ['http:', 'https:'].includes(protocol);
211
+ const cachedAppInfo = APPLICATIONS_CACHE.get(app);
175
212
  return await APPLICATIONS_CACHE_GUARD.acquire(app, async () => {
176
213
  if (isUrl) {
177
214
  _logger.default.info(`Using downloadable app '${newApp}'`);
178
215
 
179
- const headers = await retrieveHeaders(newApp);
216
+ headers = await retrieveHeaders(newApp);
180
217
 
181
218
  if (!_lodash.default.isEmpty(headers)) {
182
219
  if (headers['last-modified']) {
@@ -197,16 +234,16 @@ async function configureApp(app, supportedAppExtensions) {
197
234
  _logger.default.debug(`Cache-Control: ${headers['cache-control']}`);
198
235
  }
199
236
 
200
- const cachedPath = getCachedApplicationPath(app, remoteAppProps);
237
+ const cachedPath = getCachedApplicationPath(app, remoteAppProps, cachedAppInfo);
201
238
 
202
239
  if (cachedPath) {
203
- if (await _support.fs.exists(cachedPath)) {
240
+ if (await isAppIntegrityOk(cachedPath, cachedAppInfo === null || cachedAppInfo === void 0 ? void 0 : cachedAppInfo.integrity)) {
204
241
  _logger.default.info(`Reusing previously downloaded application at '${cachedPath}'`);
205
242
 
206
243
  return verifyAppExtension(cachedPath, supportedAppExtensions);
207
244
  }
208
245
 
209
- _logger.default.info(`The application at '${cachedPath}' does not exist anymore. Deleting it from the cache`);
246
+ _logger.default.info(`The application at '${cachedPath}' does not exist anymore ` + `or its integrity has been damaged. Deleting it from the internal cache`);
210
247
 
211
248
  APPLICATIONS_CACHE.del(app);
212
249
  }
@@ -283,16 +320,21 @@ async function configureApp(app, supportedAppExtensions) {
283
320
  throw new Error(errorMessage);
284
321
  }
285
322
 
286
- if (shouldUnzipApp) {
323
+ const isPackageAFile = (await _support.fs.stat(newApp)).isFile();
324
+
325
+ if (isPackageAFile) {
326
+ packageHash = await calculateFileIntegrity(newApp);
327
+ }
328
+
329
+ if (isPackageAFile && shouldUnzipApp && !_lodash.default.isFunction(onPostProcess)) {
287
330
  const archivePath = newApp;
288
- archiveHash = await _support.fs.hash(archivePath);
289
331
 
290
- if (APPLICATIONS_CACHE.has(app) && archiveHash === APPLICATIONS_CACHE.get(app).hash) {
332
+ if (packageHash === (cachedAppInfo === null || cachedAppInfo === void 0 ? void 0 : cachedAppInfo.packageHash)) {
291
333
  const {
292
334
  fullPath
293
- } = APPLICATIONS_CACHE.get(app);
335
+ } = cachedAppInfo;
294
336
 
295
- if (await _support.fs.exists(fullPath)) {
337
+ if (await isAppIntegrityOk(fullPath, cachedAppInfo === null || cachedAppInfo === void 0 ? void 0 : cachedAppInfo.integrity)) {
296
338
  if (archivePath !== app) {
297
339
  await _support.fs.rimraf(archivePath);
298
340
  }
@@ -302,7 +344,7 @@ async function configureApp(app, supportedAppExtensions) {
302
344
  return verifyAppExtension(fullPath, supportedAppExtensions);
303
345
  }
304
346
 
305
- _logger.default.info(`The application at '${fullPath}' does not exist anymore. Deleting it from the cache`);
347
+ _logger.default.info(`The application at '${fullPath}' does not exist anymore ` + `or its integrity has been damaged. Deleting it from the cache`);
306
348
 
307
349
  APPLICATIONS_CACHE.del(app);
308
350
  }
@@ -326,27 +368,42 @@ async function configureApp(app, supportedAppExtensions) {
326
368
  app = newApp;
327
369
  }
328
370
 
329
- verifyAppExtension(newApp, supportedAppExtensions);
371
+ const storeAppInCache = async appPathToCache => {
372
+ const cachedFullPath = cachedAppInfo === null || cachedAppInfo === void 0 ? void 0 : cachedAppInfo.fullPath;
330
373
 
331
- if (app !== newApp && (archiveHash || _lodash.default.values(remoteAppProps).some(Boolean))) {
332
- if (APPLICATIONS_CACHE.has(app)) {
333
- const {
334
- fullPath
335
- } = APPLICATIONS_CACHE.get(app);
374
+ if (cachedFullPath && cachedFullPath !== appPathToCache) {
375
+ await _support.fs.rimraf(cachedFullPath);
376
+ }
336
377
 
337
- if (fullPath !== newApp && (await _support.fs.exists(fullPath))) {
338
- await _support.fs.rimraf(fullPath);
339
- }
378
+ const integrity = {};
379
+
380
+ if ((await _support.fs.stat(appPathToCache)).isDirectory()) {
381
+ integrity.folder = await calculateFolderIntegrity(appPathToCache);
382
+ } else {
383
+ integrity.file = await calculateFileIntegrity(appPathToCache);
340
384
  }
341
385
 
342
386
  APPLICATIONS_CACHE.set(app, { ...remoteAppProps,
343
387
  timestamp: Date.now(),
344
- hash: archiveHash,
345
- fullPath: newApp
388
+ packageHash,
389
+ integrity,
390
+ fullPath: appPathToCache
391
+ });
392
+ return appPathToCache;
393
+ };
394
+
395
+ if (_lodash.default.isFunction(onPostProcess)) {
396
+ const result = await onPostProcess({
397
+ cachedAppInfo: _lodash.default.clone(cachedAppInfo),
398
+ isUrl,
399
+ headers: _lodash.default.clone(headers),
400
+ appPath: newApp
346
401
  });
402
+ return !(result !== null && result !== void 0 && result.appPath) || app === (result === null || result === void 0 ? void 0 : result.appPath) || !(await _support.fs.exists(result === null || result === void 0 ? void 0 : result.appPath)) ? newApp : await storeAppInCache(result.appPath);
347
403
  }
348
404
 
349
- return newApp;
405
+ verifyAppExtension(newApp, supportedAppExtensions);
406
+ return app !== newApp && (packageHash || _lodash.default.values(remoteAppProps).some(Boolean)) ? await storeAppInCache(newApp) : newApp;
350
407
  });
351
408
  }
352
409
 
@@ -392,22 +449,21 @@ async function unzipApp(zipPath, dstRoot, supportedAppExtensions) {
392
449
  }
393
450
 
394
451
  await _support.zip.extractAllTo(zipPath, tmpRoot, extractionOpts);
395
- const duration = timer.getDuration();
396
- const allExtractedItems = await _support.fs.glob('**', {
397
- cwd: tmpRoot
398
- });
399
-
400
- _logger.default.debug(`Extracted ${_support.util.pluralize('item', allExtractedItems.length, true)} ` + `from '${zipPath}' in ${Math.round(duration.asMilliSeconds)}ms`);
401
-
402
- const allBundleItems = allExtractedItems.filter(relativePath => supportedAppExtensions.includes(_path.default.extname(relativePath))).sort((a, b) => a.split(_path.default.sep).length - b.split(_path.default.sep).length);
403
-
404
- if (_lodash.default.isEmpty(allBundleItems)) {
405
- throw new Error(`App zip unzipped OK, but we could not find '${supportedAppExtensions}' ` + _support.util.pluralize('bundle', supportedAppExtensions.length, false) + ` in it. Make sure your archive contains at least one package having ` + `'${supportedAppExtensions}' ${_support.util.pluralize('extension', supportedAppExtensions.length, false)}`);
452
+ const globPattern = `**/*.+(${supportedAppExtensions.map(ext => ext.replace(/^\./, '')).join('|')})`;
453
+ const sortedBundleItems = (await _support.fs.glob(globPattern, {
454
+ cwd: tmpRoot,
455
+ strict: false
456
+ })).sort((a, b) => a.split(_path.default.sep).length - b.split(_path.default.sep).length);
457
+
458
+ if (_lodash.default.isEmpty(sortedBundleItems)) {
459
+ _logger.default.errorAndThrow(`App unzipped OK, but we could not find any '${supportedAppExtensions}' ` + _support.util.pluralize('bundle', supportedAppExtensions.length, false) + ` in it. Make sure your archive contains at least one package having ` + `'${supportedAppExtensions}' ${_support.util.pluralize('extension', supportedAppExtensions.length, false)}`);
406
460
  }
407
461
 
408
- const matchedBundle = _lodash.default.first(allBundleItems);
462
+ _logger.default.debug(`Extracted ${_support.util.pluralize('bundle item', sortedBundleItems.length, true)} ` + `from '${zipPath}' in ${Math.round(timer.getDuration().asMilliSeconds)}ms: ${sortedBundleItems}`);
463
+
464
+ const matchedBundle = _lodash.default.first(sortedBundleItems);
409
465
 
410
- _logger.default.debug(`Matched ${_support.util.pluralize('item', allBundleItems.length, true)} in the extracted archive. ` + `Assuming '${matchedBundle}' is the correct bundle`);
466
+ _logger.default.info(`Assuming '${matchedBundle}' is the correct bundle`);
411
467
 
412
468
  const dstPath = _path.default.resolve(dstRoot, _path.default.basename(matchedBundle));
413
469
 
@@ -475,4 +531,4 @@ function parseCapsArray(cap) {
475
531
  }require('source-map-support').install();
476
532
 
477
533
 
478
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9iYXNlZHJpdmVyL2hlbHBlcnMuanMiXSwibmFtZXMiOlsiSVBBX0VYVCIsIlpJUF9FWFRTIiwiWklQX01JTUVfVFlQRVMiLCJDQUNIRURfQVBQU19NQVhfQUdFIiwiQVBQTElDQVRJT05TX0NBQ0hFIiwiTFJVIiwibWF4QWdlIiwidXBkYXRlQWdlT25HZXQiLCJkaXNwb3NlIiwiYXBwIiwiZnVsbFBhdGgiLCJmcyIsImV4aXN0cyIsImxvZ2dlciIsImluZm8iLCJyaW1yYWYiLCJub0Rpc3Bvc2VPblNldCIsIkFQUExJQ0FUSU9OU19DQUNIRV9HVUFSRCIsIkFzeW5jTG9jayIsIlNBTklUSVpFX1JFUExBQ0VNRU5UIiwiREVGQVVMVF9CQVNFTkFNRSIsIkFQUF9ET1dOTE9BRF9USU1FT1VUX01TIiwicHJvY2VzcyIsIm9uIiwiaXRlbUNvdW50IiwiYXBwUGF0aHMiLCJ2YWx1ZXMiLCJtYXAiLCJkZWJ1ZyIsImxlbmd0aCIsInV0aWwiLCJwbHVyYWxpemUiLCJhcHBQYXRoIiwicmltcmFmU3luYyIsImUiLCJ3YXJuIiwibWVzc2FnZSIsInJldHJpZXZlSGVhZGVycyIsImxpbmsiLCJ1cmwiLCJtZXRob2QiLCJ0aW1lb3V0IiwiaGVhZGVycyIsImdldENhY2hlZEFwcGxpY2F0aW9uUGF0aCIsImN1cnJlbnRBcHBQcm9wcyIsInJlZnJlc2giLCJoYXMiLCJsYXN0TW9kaWZpZWQiLCJjdXJyZW50TW9kaWZpZWQiLCJpbW11dGFibGUiLCJjdXJyZW50SW1tdXRhYmxlIiwiY3VycmVudE1heEFnZSIsInRpbWVzdGFtcCIsImdldCIsImdldFRpbWUiLCJtc0xlZnQiLCJEYXRlIiwibm93IiwicGF0aCIsImJhc2VuYW1lIiwidmVyaWZ5QXBwRXh0ZW5zaW9uIiwic3VwcG9ydGVkQXBwRXh0ZW5zaW9ucyIsImluY2x1ZGVzIiwiZXh0bmFtZSIsIkVycm9yIiwiY29uZmlndXJlQXBwIiwiXyIsImlzU3RyaW5nIiwiaXNBcnJheSIsIm5ld0FwcCIsInNob3VsZFVuemlwQXBwIiwiYXJjaGl2ZUhhc2giLCJyZW1vdGVBcHBQcm9wcyIsInByb3RvY29sIiwicGF0aG5hbWUiLCJwYXJzZSIsImlzVXJsIiwiYWNxdWlyZSIsImlzRW1wdHkiLCJ0ZXN0IiwibWF4QWdlTWF0Y2giLCJleGVjIiwicGFyc2VJbnQiLCJjYWNoZWRQYXRoIiwiZGVsIiwiZmlsZU5hbWUiLCJzYW5pdGl6ZU5hbWUiLCJkZWNvZGVVUklDb21wb25lbnQiLCJyZXBsYWNlbWVudCIsImN0Iiwic29tZSIsIm1pbWVUeXBlIiwiUmVnRXhwIiwiZXNjYXBlUmVnRXhwIiwibWF0Y2giLCJyZXN1bHRpbmdOYW1lIiwic3Vic3RyaW5nIiwicmVzdWx0aW5nRXh0IiwiZmlyc3QiLCJ0YXJnZXRQYXRoIiwidGVtcERpciIsInByZWZpeCIsInN1ZmZpeCIsImRvd25sb2FkQXBwIiwiZXJyb3JNZXNzYWdlIiwiYXJjaGl2ZVBhdGgiLCJoYXNoIiwidG1wUm9vdCIsIm9wZW5EaXIiLCJ1bnppcEFwcCIsImlzQWJzb2x1dGUiLCJyZXNvbHZlIiwiY3dkIiwiQm9vbGVhbiIsInNldCIsImhyZWYiLCJuZXQiLCJkb3dubG9hZEZpbGUiLCJlcnIiLCJ6aXBQYXRoIiwiZHN0Um9vdCIsInppcCIsImFzc2VydFZhbGlkWmlwIiwidGltZXIiLCJ0aW1pbmciLCJUaW1lciIsInN0YXJ0IiwidXNlU3lzdGVtVW56aXBFbnYiLCJlbnYiLCJBUFBJVU1fUFJFRkVSX1NZU1RFTV9VTlpJUCIsInVzZVN5c3RlbVVuemlwIiwidG9Mb3dlciIsImV4dHJhY3Rpb25PcHRzIiwiZmlsZU5hbWVzRW5jb2RpbmciLCJleHRyYWN0QWxsVG8iLCJkdXJhdGlvbiIsImdldER1cmF0aW9uIiwiYWxsRXh0cmFjdGVkSXRlbXMiLCJnbG9iIiwiTWF0aCIsInJvdW5kIiwiYXNNaWxsaVNlY29uZHMiLCJhbGxCdW5kbGVJdGVtcyIsImZpbHRlciIsInJlbGF0aXZlUGF0aCIsInNvcnQiLCJhIiwiYiIsInNwbGl0Iiwic2VwIiwibWF0Y2hlZEJ1bmRsZSIsImRzdFBhdGgiLCJtdiIsIm1rZGlycCIsImlzUGFja2FnZU9yQnVuZGxlIiwiZHVwbGljYXRlS2V5cyIsImlucHV0IiwiZmlyc3RLZXkiLCJzZWNvbmRLZXkiLCJpdGVtIiwiaXNQbGFpbk9iamVjdCIsInJlc3VsdE9iaiIsImtleSIsInZhbHVlIiwidG9QYWlycyIsInJlY3Vyc2l2ZWx5Q2FsbGVkVmFsdWUiLCJwYXJzZUNhcHNBcnJheSIsImNhcCIsInBhcnNlZENhcHMiLCJKU09OIiwiaWduIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLE9BQU8sR0FBRyxNQUFoQjtBQUNBLE1BQU1DLFFBQVEsR0FBRyxDQUFDLE1BQUQsRUFBU0QsT0FBVCxDQUFqQjtBQUNBLE1BQU1FLGNBQWMsR0FBRyxDQUNyQixpQkFEcUIsRUFFckIsOEJBRnFCLEVBR3JCLGlCQUhxQixDQUF2QjtBQUtBLE1BQU1DLG1CQUFtQixHQUFHLE9BQU8sRUFBUCxHQUFZLEVBQVosR0FBaUIsRUFBN0M7QUFDQSxNQUFNQyxrQkFBa0IsR0FBRyxJQUFJQyxpQkFBSixDQUFRO0FBQ2pDQyxFQUFBQSxNQUFNLEVBQUVILG1CQUR5QjtBQUVqQ0ksRUFBQUEsY0FBYyxFQUFFLElBRmlCO0FBR2pDQyxFQUFBQSxPQUFPLEVBQUUsT0FBT0MsR0FBUCxFQUFZO0FBQUNDLElBQUFBO0FBQUQsR0FBWixLQUEyQjtBQUNsQyxRQUFJLEVBQUMsTUFBTUMsWUFBR0MsTUFBSCxDQUFVRixRQUFWLENBQVAsQ0FBSixFQUFnQztBQUM5QjtBQUNEOztBQUVERyxvQkFBT0MsSUFBUCxDQUFhLG9CQUFtQkwsR0FBSSxnQkFBZUMsUUFBUyxlQUE1RDs7QUFDQSxVQUFNQyxZQUFHSSxNQUFILENBQVVMLFFBQVYsQ0FBTjtBQUNELEdBVmdDO0FBV2pDTSxFQUFBQSxjQUFjLEVBQUU7QUFYaUIsQ0FBUixDQUEzQjtBQWFBLE1BQU1DLHdCQUF3QixH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QUlyRyxnQkFBRUUsT0FBRixDQUFVbUcsR0FBVixDQUFKLEVBQW9CO0FBQ2xCLFdBQU9BLEdBQVA7QUFDRDs7QUFFRCxNQUFJQyxVQUFKOztBQUNBLE1BQUk7QUFDRkEsSUFBQUEsVUFBVSxHQUFHQyxJQUFJLENBQUM5RixLQUFMLENBQVc0RixHQUFYLENBQWI7O0FBQ0EsUUFBSXJHLGdCQUFFRSxPQUFGLENBQVVvRyxVQUFWLENBQUosRUFBMkI7QUFDekIsYUFBT0EsVUFBUDtBQUNEO0FBQ0YsR0FMRCxDQUtFLE9BQU9FLEdBQVAsRUFBWTtBQUNaN0osb0JBQU9zQixJQUFQLENBQWEsMENBQWI7QUFDRDs7QUFDRCxNQUFJK0IsZ0JBQUVDLFFBQUYsQ0FBV29HLEdBQVgsQ0FBSixFQUFxQjtBQUNuQixXQUFPLENBQUNBLEdBQUQsQ0FBUDtBQUNEOztBQUNELFFBQU0sSUFBSXZHLEtBQUosQ0FBVyxpREFBZ0R1RyxHQUFJLEVBQS9ELENBQU47QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB1cmwgZnJvbSAndXJsJztcbmltcG9ydCBsb2dnZXIgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgdGVtcERpciwgZnMsIHV0aWwsIHppcCwgbmV0LCB0aW1pbmcgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IExSVSBmcm9tICdscnUtY2FjaGUnO1xuaW1wb3J0IEFzeW5jTG9jayBmcm9tICdhc3luYy1sb2NrJztcbmltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5cbmNvbnN0IElQQV9FWFQgPSAnLmlwYSc7XG5jb25zdCBaSVBfRVhUUyA9IFsnLnppcCcsIElQQV9FWFRdO1xuY29uc3QgWklQX01JTUVfVFlQRVMgPSBbXG4gICdhcHBsaWNhdGlvbi96aXAnLFxuICAnYXBwbGljYXRpb24veC16aXAtY29tcHJlc3NlZCcsXG4gICdtdWx0aXBhcnQveC16aXAnLFxuXTtcbmNvbnN0IENBQ0hFRF9BUFBTX01BWF9BR0UgPSAxMDAwICogNjAgKiA2MCAqIDI0OyAvLyBtc1xuY29uc3QgQVBQTElDQVRJT05TX0NBQ0hFID0gbmV3IExSVSh7XG4gIG1heEFnZTogQ0FDSEVEX0FQUFNfTUFYX0FHRSwgLy8gZXhwaXJlIGFmdGVyIDI0IGhvdXJzXG4gIHVwZGF0ZUFnZU9uR2V0OiB0cnVlLFxuICBkaXNwb3NlOiBhc3luYyAoYXBwLCB7ZnVsbFBhdGh9KSA9PiB7XG4gICAgaWYgKCFhd2FpdCBmcy5leGlzdHMoZnVsbFBhdGgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbG9nZ2VyLmluZm8oYFRoZSBhcHBsaWNhdGlvbiAnJHthcHB9JyBjYWNoZWQgYXQgJyR7ZnVsbFBhdGh9JyBoYXMgZXhwaXJlZGApO1xuICAgIGF3YWl0IGZzLnJpbXJhZihmdWxsUGF0aCk7XG4gIH0sXG4gIG5vRGlzcG9zZU9uU2V0OiB0cnVlLFxufSk7XG5jb25zdCBBUFBMSUNBVElPTlNfQ0FDSEVfR1VBUkQgPSBuZXcgQXN5bmNMb2NrKCk7XG5jb25zdCBTQU5JVElaRV9SRVBMQUNFTUVOVCA9ICctJztcbmNvbnN0IERFRkFVTFRfQkFTRU5BTUUgPSAnYXBwaXVtLWFwcCc7XG5jb25zdCBBUFBfRE9XTkxPQURfVElNRU9VVF9NUyA9IDEyMCAqIDEwMDA7XG5cbnByb2Nlc3Mub24oJ2V4aXQnLCAoKSA9PiB7XG4gIGlmIChBUFBMSUNBVElPTlNfQ0FDSEUuaXRlbUNvdW50ID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYXBwUGF0aHMgPSBBUFBMSUNBVElPTlNfQ0FDSEUudmFsdWVzKClcbiAgICAubWFwKCh7ZnVsbFBhdGh9KSA9PiBmdWxsUGF0aCk7XG4gIGxvZ2dlci5kZWJ1ZyhgUGVyZm9ybWluZyBjbGVhbnVwIG9mICR7YXBwUGF0aHMubGVuZ3RofSBjYWNoZWQgYCArXG4gICAgdXRpbC5wbHVyYWxpemUoJ2FwcGxpY2F0aW9uJywgYXBwUGF0aHMubGVuZ3RoKSk7XG4gIGZvciAoY29uc3QgYXBwUGF0aCBvZiBhcHBQYXRocykge1xuICAgIHRyeSB7XG4gICAgICAvLyBBc3luY2hyb25vdXMgY2FsbHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gb25FeGl0IGhhbmRsZXJcbiAgICAgIGZzLnJpbXJhZlN5bmMoYXBwUGF0aCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nZ2VyLndhcm4oZS5tZXNzYWdlKTtcbiAgICB9XG4gIH1cbn0pO1xuXG5cbmFzeW5jIGZ1bmN0aW9uIHJldHJpZXZlSGVhZGVycyAobGluaykge1xuICB0cnkge1xuICAgIHJldHVybiAoYXdhaXQgYXhpb3Moe1xuICAgICAgdXJsOiBsaW5rLFxuICAgICAgbWV0aG9kOiAnSEVBRCcsXG4gICAgICB0aW1lb3V0OiA1MDAwLFxuICAgIH0pKS5oZWFkZXJzO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nZ2VyLmluZm8oYENhbm5vdCBzZW5kIEhFQUQgcmVxdWVzdCB0byAnJHtsaW5rfScuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxuICByZXR1cm4ge307XG59XG5cbmZ1bmN0aW9uIGdldENhY2hlZEFwcGxpY2F0aW9uUGF0aCAobGluaywgY3VycmVudEFwcFByb3BzID0ge30pIHtcbiAgY29uc3QgcmVmcmVzaCA9ICgpID0+IHtcbiAgICBsb2dnZXIuZGVidWcoYEEgZnJlc2ggY29weSBvZiB0aGUgYXBwbGljYXRpb24gaXMgZ29pbmcgdG8gYmUgZG93bmxvYWRlZCBmcm9tICR7bGlua31gKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICBpZiAoQVBQTElDQVRJT05TX0NBQ0hFLmhhcyhsaW5rKSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGxhc3RNb2RpZmllZDogY3VycmVudE1vZGlmaWVkLFxuICAgICAgaW1tdXRhYmxlOiBjdXJyZW50SW1tdXRhYmxlLFxuICAgICAgLy8gbWF4QWdlIGlzIGluIHNlY29uZHNcbiAgICAgIG1heEFnZTogY3VycmVudE1heEFnZSxcbiAgICB9ID0gY3VycmVudEFwcFByb3BzO1xuICAgIGNvbnN0IHtcbiAgICAgIC8vIERhdGUgaW5zdGFuY2VcbiAgICAgIGxhc3RNb2RpZmllZCxcbiAgICAgIC8vIGJvb2xlYW5cbiAgICAgIGltbXV0YWJsZSxcbiAgICAgIC8vIFVuaXggdGltZSBpbiBtaWxsaXNlY29uZHNcbiAgICAgIHRpbWVzdGFtcCxcbiAgICAgIGZ1bGxQYXRoLFxuICAgIH0gPSBBUFBMSUNBVElPTlNfQ0FDSEUuZ2V0KGxpbmspO1xuICAgIGlmIChsYXN0TW9kaWZpZWQgJiYgY3VycmVudE1vZGlmaWVkKSB7XG4gICAgICBpZiAoY3VycmVudE1vZGlmaWVkLmdldFRpbWUoKSA8PSBsYXN0TW9kaWZpZWQuZ2V0VGltZSgpKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgVGhlIGFwcGxpY2F0aW9uIGF0ICR7bGlua30gaGFzIG5vdCBiZWVuIG1vZGlmaWVkIHNpbmNlICR7bGFzdE1vZGlmaWVkfWApO1xuICAgICAgICByZXR1cm4gZnVsbFBhdGg7XG4gICAgICB9XG4gICAgICBsb2dnZXIuZGVidWcoYFRoZSBhcHBsaWNhdGlvbiBhdCAke2xpbmt9IGhhcyBiZWVuIG1vZGlmaWVkIHNpbmNlICR7bGFzdE1vZGlmaWVkfWApO1xuICAgICAgcmV0dXJuIHJlZnJlc2goKTtcbiAgICB9XG4gICAgaWYgKGltbXV0YWJsZSAmJiBjdXJyZW50SW1tdXRhYmxlKSB7XG4gICAgICBsb2dnZXIuZGVidWcoYFRoZSBhcHBsaWNhdGlvbiBhdCAke2xpbmt9IGlzIGltbXV0YWJsZWApO1xuICAgICAgcmV0dXJuIGZ1bGxQYXRoO1xuICAgIH1cbiAgICBpZiAoY3VycmVudE1heEFnZSAmJiB0aW1lc3RhbXApIHtcbiAgICAgIGNvbnN0IG1zTGVmdCA9IHRpbWVzdGFtcCArIGN1cnJlbnRNYXhBZ2UgKiAxMDAwIC0gRGF0ZS5ub3coKTtcbiAgICAgIGlmIChtc0xlZnQgPiAwKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgVGhlIGNhY2hlZCBhcHBsaWNhdGlvbiAnJHtwYXRoLmJhc2VuYW1lKGZ1bGxQYXRoKX0nIHdpbGwgZXhwaXJlIGluICR7bXNMZWZ0IC8gMTAwMH1zYCk7XG4gICAgICAgIHJldHVybiBmdWxsUGF0aDtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5kZWJ1ZyhgVGhlIGNhY2hlZCBhcHBsaWNhdGlvbiAnJHtwYXRoLmJhc2VuYW1lKGZ1bGxQYXRoKX0nIGhhcyBleHBpcmVkYCk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZWZyZXNoKCk7XG59XG5cbmZ1bmN0aW9uIHZlcmlmeUFwcEV4dGVuc2lvbiAoYXBwLCBzdXBwb3J0ZWRBcHBFeHRlbnNpb25zKSB7XG4gIGlmIChzdXBwb3J0ZWRBcHBFeHRlbnNpb25zLmluY2x1ZGVzKHBhdGguZXh0bmFtZShhcHApKSkge1xuICAgIHJldHVybiBhcHA7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBOZXcgYXBwIHBhdGggJyR7YXBwfScgZGlkIG5vdCBoYXZlIGAgK1xuICAgIGAke3V0aWwucGx1cmFsaXplKCdleHRlbnNpb24nLCBzdXBwb3J0ZWRBcHBFeHRlbnNpb25zLmxlbmd0aCwgZmFsc2UpfTogYCArXG4gICAgc3VwcG9ydGVkQXBwRXh0ZW5zaW9ucyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbmZpZ3VyZUFwcCAoYXBwLCBzdXBwb3J0ZWRBcHBFeHRlbnNpb25zKSB7XG4gIGlmICghXy5pc1N0cmluZyhhcHApKSB7XG4gICAgLy8gaW1tZWRpYXRlbHkgc2hvcnRjaXJjdWl0IGlmIG5vdCBnaXZlbiBhbiBhcHBcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFfLmlzQXJyYXkoc3VwcG9ydGVkQXBwRXh0ZW5zaW9ucykpIHtcbiAgICBzdXBwb3J0ZWRBcHBFeHRlbnNpb25zID0gW3N1cHBvcnRlZEFwcEV4dGVuc2lvbnNdO1xuICB9XG5cbiAgbGV0IG5ld0FwcCA9IGFwcDtcbiAgbGV0IHNob3VsZFVuemlwQXBwID0gZmFsc2U7XG4gIGxldCBhcmNoaXZlSGFzaCA9IG51bGw7XG4gIGNvbnN0IHJlbW90ZUFwcFByb3BzID0ge1xuICAgIGxhc3RNb2RpZmllZDogbnVsbCxcbiAgICBpbW11dGFibGU6IGZhbHNlLFxuICAgIG1heEFnZTogbnVsbCxcbiAgfTtcbiAgY29uc3Qge3Byb3RvY29sLCBwYXRobmFtZX0gPSB1cmwucGFyc2UobmV3QXBwKTtcbiAgY29uc3QgaXNVcmwgPSBbJ2h0dHA6JywgJ2h0dHBzOiddLmluY2x1ZGVzKHByb3RvY29sKTtcblxuICByZXR1cm4gYXdhaXQgQVBQTElDQVRJT05TX0NBQ0hFX0dVQVJELmFjcXVpcmUoYXBwLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzVXJsKSB7XG4gICAgICAvLyBVc2UgdGhlIGFwcCBmcm9tIHJlbW90ZSBVUkxcbiAgICAgIGxvZ2dlci5pbmZvKGBVc2luZyBkb3dubG9hZGFibGUgYXBwICcke25ld0FwcH0nYCk7XG4gICAgICBjb25zdCBoZWFkZXJzID0gYXdhaXQgcmV0cmlldmVIZWFkZXJzKG5ld0FwcCk7XG4gICAgICBpZiAoIV8uaXNFbXB0eShoZWFkZXJzKSkge1xuICAgICAgICBpZiAoaGVhZGVyc1snbGFzdC1tb2RpZmllZCddKSB7XG4gICAgICAgICAgcmVtb3RlQXBwUHJvcHMubGFzdE1vZGlmaWVkID0gbmV3IERhdGUoaGVhZGVyc1snbGFzdC1tb2RpZmllZCddKTtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuZGVidWcoYExhc3QtTW9kaWZpZWQ6ICR7aGVhZGVyc1snbGFzdC1tb2RpZmllZCddfWApO1xuICAgICAgICBpZiAoaGVhZGVyc1snY2FjaGUtY29udHJvbCddKSB7XG4gICAgICAgICAgcmVtb3RlQXBwUHJvcHMuaW1tdXRhYmxlID0gL1xcYmltbXV0YWJsZVxcYi9pLnRlc3QoaGVhZGVyc1snY2FjaGUtY29udHJvbCddKTtcbiAgICAgICAgICBjb25zdCBtYXhBZ2VNYXRjaCA9IC9cXGJtYXgtYWdlPShcXGQrKVxcYi9pLmV4ZWMoaGVhZGVyc1snY2FjaGUtY29udHJvbCddKTtcbiAgICAgICAgICBpZiAobWF4QWdlTWF0Y2gpIHtcbiAgICAgICAgICAgIHJlbW90ZUFwcFByb3BzLm1heEFnZSA9IHBhcnNlSW50KG1heEFnZU1hdGNoWzFdLCAxMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgQ2FjaGUtQ29udHJvbDogJHtoZWFkZXJzWydjYWNoZS1jb250cm9sJ119YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBjYWNoZWRQYXRoID0gZ2V0Q2FjaGVkQXBwbGljYXRpb25QYXRoKGFwcCwgcmVtb3RlQXBwUHJvcHMpO1xuICAgICAgaWYgKGNhY2hlZFBhdGgpIHtcbiAgICAgICAgaWYgKGF3YWl0IGZzLmV4aXN0cyhjYWNoZWRQYXRoKSkge1xuICAgICAgICAgIGxvZ2dlci5pbmZvKGBSZXVzaW5nIHByZXZpb3VzbHkgZG93bmxvYWRlZCBhcHBsaWNhdGlvbiBhdCAnJHtjYWNoZWRQYXRofSdgKTtcbiAgICAgICAgICByZXR1cm4gdmVyaWZ5QXBwRXh0ZW5zaW9uKGNhY2hlZFBhdGgsIHN1cHBvcnRlZEFwcEV4dGVuc2lvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGxvZ2dlci5pbmZvKGBUaGUgYXBwbGljYXRpb24gYXQgJyR7Y2FjaGVkUGF0aH0nIGRvZXMgbm90IGV4aXN0IGFueW1vcmUuIERlbGV0aW5nIGl0IGZyb20gdGhlIGNhY2hlYCk7XG4gICAgICAgIEFQUExJQ0FUSU9OU19DQUNIRS5kZWwoYXBwKTtcbiAgICAgIH1cblxuICAgICAgbGV0IGZpbGVOYW1lID0gbnVsbDtcbiAgICAgIGNvbnN0IGJhc2VuYW1lID0gZnMuc2FuaXRpemVOYW1lKHBhdGguYmFzZW5hbWUoZGVjb2RlVVJJQ29tcG9uZW50KHBhdGhuYW1lKSksIHtcbiAgICAgICAgcmVwbGFjZW1lbnQ6IFNBTklUSVpFX1JFUExBQ0VNRU5UXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGV4dG5hbWUgPSBwYXRoLmV4dG5hbWUoYmFzZW5hbWUpO1xuICAgICAgLy8gdG8gZGV0ZXJtaW5lIGlmIHdlIG5lZWQgdG8gdW56aXAgdGhlIGFwcCwgd2UgaGF2ZSBhIG51bWJlciBvZiBwbGFjZXNcbiAgICAgIC8vIHRvIGxvb2s6IGNvbnRlbnQgdHlwZSwgY29udGVudCBkaXNwb3NpdGlvbiwgb3IgdGhlIGZpbGUgZXh0ZW5zaW9uXG4gICAgICBpZiAoWklQX0VYVFMuaW5jbHVkZXMoZXh0bmFtZSkpIHtcbiAgICAgICAgZmlsZU5hbWUgPSBiYXNlbmFtZTtcbiAgICAgICAgc2hvdWxkVW56aXBBcHAgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddKSB7XG4gICAgICAgIGNvbnN0IGN0ID0gaGVhZGVyc1snY29udGVudC10eXBlJ107XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgQ29udGVudC1UeXBlOiAke2N0fWApO1xuICAgICAgICAvLyB0aGUgZmlsZXR5cGUgbWF5IG5vdCBiZSBvYnZpb3VzIGZvciBjZXJ0YWluIHVybHMsIHNvIGNoZWNrIHRoZSBtaW1lIHR5cGUgdG9vXG4gICAgICAgIGlmIChaSVBfTUlNRV9UWVBFUy5zb21lKChtaW1lVHlwZSkgPT4gbmV3IFJlZ0V4cChgXFxcXGIke18uZXNjYXBlUmVnRXhwKG1pbWVUeXBlKX1cXFxcYmApLnRlc3QoY3QpKSkge1xuICAgICAgICAgIGlmICghZmlsZU5hbWUpIHtcbiAgICAgICAgICAgIGZpbGVOYW1lID0gYCR7REVGQVVMVF9CQVNFTkFNRX0uemlwYDtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2hvdWxkVW56aXBBcHAgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaGVhZGVyc1snY29udGVudC1kaXNwb3NpdGlvbiddICYmIC9eYXR0YWNobWVudC9pLnRlc3QoaGVhZGVyc1snY29udGVudC1kaXNwb3NpdGlvbiddKSkge1xuICAgICAgICBsb2dnZXIuZGVidWcoYENvbnRlbnQtRGlzcG9zaXRpb246ICR7aGVhZGVyc1snY29udGVudC1kaXNwb3NpdGlvbiddfWApO1xuICAgICAgICBjb25zdCBtYXRjaCA9IC9maWxlbmFtZT1cIihbXlwiXSspL2kuZXhlYyhoZWFkZXJzWydjb250ZW50LWRpc3Bvc2l0aW9uJ10pO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICBmaWxlTmFtZSA9IGZzLnNhbml0aXplTmFtZShtYXRjaFsxXSwge1xuICAgICAgICAgICAgcmVwbGFjZW1lbnQ6IFNBTklUSVpFX1JFUExBQ0VNRU5UXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgc2hvdWxkVW56aXBBcHAgPSBzaG91bGRVbnppcEFwcCB8fCBaSVBfRVhUUy5pbmNsdWRlcyhwYXRoLmV4dG5hbWUoZmlsZU5hbWUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFmaWxlTmFtZSkge1xuICAgICAgICAvLyBhc3NpZ24gdGhlIGRlZmF1bHQgZmlsZSBuYW1lIGFuZCB0aGUgZXh0ZW5zaW9uIGlmIG5vbmUgaGFzIGJlZW4gZGV0ZWN0ZWRcbiAgICAgICAgY29uc3QgcmVzdWx0aW5nTmFtZSA9IGJhc2VuYW1lXG4gICAgICAgICAgPyBiYXNlbmFtZS5zdWJzdHJpbmcoMCwgYmFzZW5hbWUubGVuZ3RoIC0gZXh0bmFtZS5sZW5ndGgpXG4gICAgICAgICAgOiBERUZBVUxUX0JBU0VOQU1FO1xuICAgICAgICBsZXQgcmVzdWx0aW5nRXh0ID0gZXh0bmFtZTtcbiAgICAgICAgaWYgKCFzdXBwb3J0ZWRBcHBFeHRlbnNpb25zLmluY2x1ZGVzKHJlc3VsdGluZ0V4dCkpIHtcbiAgICAgICAgICBsb2dnZXIuaW5mbyhgVGhlIGN1cnJlbnQgZmlsZSBleHRlbnNpb24gJyR7cmVzdWx0aW5nRXh0fScgaXMgbm90IHN1cHBvcnRlZC4gYCArXG4gICAgICAgICAgICBgRGVmYXVsdGluZyB0byAnJHtfLmZpcnN0KHN1cHBvcnRlZEFwcEV4dGVuc2lvbnMpfSdgKTtcbiAgICAgICAgICByZXN1bHRpbmdFeHQgPSBfLmZpcnN0KHN1cHBvcnRlZEFwcEV4dGVuc2lvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGZpbGVOYW1lID0gYCR7cmVzdWx0aW5nTmFtZX0ke3Jlc3VsdGluZ0V4dH1gO1xuICAgICAgfVxuICAgICAgY29uc3QgdGFyZ2V0UGF0aCA9IGF3YWl0IHRlbXBEaXIucGF0aCh7XG4gICAgICAgIHByZWZpeDogZmlsZU5hbWUsXG4gICAgICAgIHN1ZmZpeDogJycsXG4gICAgICB9KTtcbiAgICAgIG5ld0FwcCA9IGF3YWl0IGRvd25sb2FkQXBwKG5ld0FwcCwgdGFyZ2V0UGF0aCk7XG4gICAgfSBlbHNlIGlmIChhd2FpdCBmcy5leGlzdHMobmV3QXBwKSkge1xuICAgICAgLy8gVXNlIHRoZSBsb2NhbCBhcHBcbiAgICAgIGxvZ2dlci5pbmZvKGBVc2luZyBsb2NhbCBhcHAgJyR7bmV3QXBwfSdgKTtcbiAgICAgIHNob3VsZFVuemlwQXBwID0gWklQX0VYVFMuaW5jbHVkZXMocGF0aC5leHRuYW1lKG5ld0FwcCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZXJyb3JNZXNzYWdlID0gYFRoZSBhcHBsaWNhdGlvbiBhdCAnJHtuZXdBcHB9JyBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgYWNjZXNzaWJsZWA7XG4gICAgICAvLyBwcm90b2NvbCB2YWx1ZSBmb3IgJ0M6XFxcXHRlbXAnIGlzICdjOicsIHNvIHdlIGNoZWNrIHRoZSBsZW5ndGggYXMgd2VsbFxuICAgICAgaWYgKF8uaXNTdHJpbmcocHJvdG9jb2wpICYmIHByb3RvY29sLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgZXJyb3JNZXNzYWdlID0gYFRoZSBwcm90b2NvbCAnJHtwcm90b2NvbH0nIHVzZWQgaW4gJyR7bmV3QXBwfScgaXMgbm90IHN1cHBvcnRlZC4gYCArXG4gICAgICAgICAgYE9ubHkgaHR0cDogYW5kIGh0dHBzOiBwcm90b2NvbHMgYXJlIHN1cHBvcnRlZGA7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkVW56aXBBcHApIHtcbiAgICAgIGNvbnN0IGFyY2hpdmVQYXRoID0gbmV3QXBwO1xuICAgICAgYXJjaGl2ZUhhc2ggPSBhd2FpdCBmcy5oYXNoKGFyY2hpdmVQYXRoKTtcbiAgICAgIGlmIChBUFBMSUNBVElPTlNfQ0FDSEUuaGFzKGFwcCkgJiYgYXJjaGl2ZUhhc2ggPT09IEFQUExJQ0FUSU9OU19DQUNIRS5nZXQoYXBwKS5oYXNoKSB7XG4gICAgICAgIGNvbnN0IHtmdWxsUGF0aH0gPSBBUFBMSUNBVElPTlNfQ0FDSEUuZ2V0KGFwcCk7XG4gICAgICAgIGlmIChhd2FpdCBmcy5leGlzdHMoZnVsbFBhdGgpKSB7XG4gICAgICAgICAgaWYgKGFyY2hpdmVQYXRoICE9PSBhcHApIHtcbiAgICAgICAgICAgIGF3YWl0IGZzLnJpbXJhZihhcmNoaXZlUGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxvZ2dlci5pbmZvKGBXaWxsIHJldXNlIHByZXZpb3VzbHkgY2FjaGVkIGFwcGxpY2F0aW9uIGF0ICcke2Z1bGxQYXRofSdgKTtcbiAgICAgICAgICByZXR1cm4gdmVyaWZ5QXBwRXh0ZW5zaW9uKGZ1bGxQYXRoLCBzdXBwb3J0ZWRBcHBFeHRlbnNpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuaW5mbyhgVGhlIGFwcGxpY2F0aW9uIGF0ICcke2Z1bGxQYXRofScgZG9lcyBub3QgZXhpc3QgYW55bW9yZS4gRGVsZXRpbmcgaXQgZnJvbSB0aGUgY2FjaGVgKTtcbiAgICAgICAgQVBQTElDQVRJT05TX0NBQ0hFLmRlbChhcHApO1xuICAgICAgfVxuICAgICAgY29uc3QgdG1wUm9vdCA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbmV3QXBwID0gYXdhaXQgdW56aXBBcHAoYXJjaGl2ZVBhdGgsIHRtcFJvb3QsIHN1cHBvcnRlZEFwcEV4dGVuc2lvbnMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKG5ld0FwcCAhPT0gYXJjaGl2ZVBhdGggJiYgYXJjaGl2ZVBhdGggIT09IGFwcCkge1xuICAgICAgICAgIGF3YWl0IGZzLnJpbXJhZihhcmNoaXZlUGF0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxvZ2dlci5pbmZvKGBVbnppcHBlZCBsb2NhbCBhcHAgdG8gJyR7bmV3QXBwfSdgKTtcbiAgICB9IGVsc2UgaWYgKCFwYXRoLmlzQWJzb2x1dGUobmV3QXBwKSkge1xuICAgICAgbmV3QXBwID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIG5ld0FwcCk7XG4gICAgICBsb2dnZXIud2FybihgVGhlIGN1cnJlbnQgYXBwbGljYXRpb24gcGF0aCAnJHthcHB9JyBpcyBub3QgYWJzb2x1dGUgYCArXG4gICAgICAgIGBhbmQgaGFzIGJlZW4gcmV3cml0dGVuIHRvICcke25ld0FwcH0nLiBDb25zaWRlciB1c2luZyBhYnNvbHV0ZSBwYXRocyByYXRoZXIgdGhhbiByZWxhdGl2ZWApO1xuICAgICAgYXBwID0gbmV3QXBwO1xuICAgIH1cblxuICAgIHZlcmlmeUFwcEV4dGVuc2lvbihuZXdBcHAsIHN1cHBvcnRlZEFwcEV4dGVuc2lvbnMpO1xuXG4gICAgaWYgKGFwcCAhPT0gbmV3QXBwICYmIChhcmNoaXZlSGFzaCB8fCBfLnZhbHVlcyhyZW1vdGVBcHBQcm9wcykuc29tZShCb29sZWFuKSkpIHtcbiAgICAgIGlmIChBUFBMSUNBVElPTlNfQ0FDSEUuaGFzKGFwcCkpIHtcbiAgICAgICAgY29uc3Qge2Z1bGxQYXRofSA9IEFQUExJQ0FUSU9OU19DQUNIRS5nZXQoYXBwKTtcbiAgICAgICAgLy8gQ2xlYW4gdXAgdGhlIG9ic29sZXRlIGVudHJ5IGZpcnN0IGlmIG5lZWRlZFxuICAgICAgICBpZiAoZnVsbFBhdGggIT09IG5ld0FwcCAmJiBhd2FpdCBmcy5leGlzdHMoZnVsbFBhdGgpKSB7XG4gICAgICAgICAgYXdhaXQgZnMucmltcmFmKGZ1bGxQYXRoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgQVBQTElDQVRJT05TX0NBQ0hFLnNldChhcHAsIHtcbiAgICAgICAgLi4ucmVtb3RlQXBwUHJvcHMsXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgaGFzaDogYXJjaGl2ZUhhc2gsXG4gICAgICAgIGZ1bGxQYXRoOiBuZXdBcHAsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld0FwcDtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRvd25sb2FkQXBwIChhcHAsIHRhcmdldFBhdGgpIHtcbiAgY29uc3Qge2hyZWZ9ID0gdXJsLnBhcnNlKGFwcCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgbmV0LmRvd25sb2FkRmlsZShocmVmLCB0YXJnZXRQYXRoLCB7XG4gICAgICB0aW1lb3V0OiBBUFBfRE9XTkxPQURfVElNRU9VVF9NUyxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gZG93bmxvYWQgdGhlIGFwcDogJHtlcnIubWVzc2FnZX1gKTtcbiAgfVxuICByZXR1cm4gdGFyZ2V0UGF0aDtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgYnVuZGxlIGZyb20gYW4gYXJjaGl2ZSBpbnRvIHRoZSBnaXZlbiBmb2xkZXJcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gemlwUGF0aCBGdWxsIHBhdGggdG8gdGhlIGFyY2hpdmUgY29udGFpbmluZyB0aGUgYnVuZGxlXG4gKiBAcGFyYW0ge3N0cmluZ30gZHN0Um9vdCBGdWxsIHBhdGggdG8gdGhlIGZvbGRlciB3aGVyZSB0aGUgZXh0cmFjdGVkIGJ1bmRsZVxuICogc2hvdWxkIGJlIHBsYWNlZFxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fHN0cmluZ30gc3VwcG9ydGVkQXBwRXh0ZW5zaW9ucyBUaGUgbGlzdCBvZiBleHRlbnNpb25zXG4gKiB0aGUgdGFyZ2V0IGFwcGxpY2F0aW9uIGJ1bmRsZSBzdXBwb3J0cywgZm9yIGV4YW1wbGUgWycuYXBrJywgJy5hcGtzJ10gZm9yXG4gKiBBbmRyb2lkIHBhY2thZ2VzXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBGdWxsIHBhdGggdG8gdGhlIGJ1bmRsZSBpbiB0aGUgZGVzdGluYXRpb24gZm9sZGVyXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGdpdmVuIGFyY2hpdmUgaXMgaW52YWxpZCBvciBubyBhcHBsaWNhdGlvbiBidW5kbGVzXG4gKiBoYXZlIGJlZW4gZm91bmQgaW5zaWRlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHVuemlwQXBwICh6aXBQYXRoLCBkc3RSb290LCBzdXBwb3J0ZWRBcHBFeHRlbnNpb25zKSB7XG4gIGF3YWl0IHppcC5hc3NlcnRWYWxpZFppcCh6aXBQYXRoKTtcblxuICBpZiAoIV8uaXNBcnJheShzdXBwb3J0ZWRBcHBFeHRlbnNpb25zKSkge1xuICAgIHN1cHBvcnRlZEFwcEV4dGVuc2lvbnMgPSBbc3VwcG9ydGVkQXBwRXh0ZW5zaW9uc107XG4gIH1cblxuICBjb25zdCB0bXBSb290ID0gYXdhaXQgdGVtcERpci5vcGVuRGlyKCk7XG4gIHRyeSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBVbnppcHBpbmcgJyR7emlwUGF0aH0nYCk7XG4gICAgY29uc3QgdGltZXIgPSBuZXcgdGltaW5nLlRpbWVyKCkuc3RhcnQoKTtcbiAgICBjb25zdCB1c2VTeXN0ZW1VbnppcEVudiA9IHByb2Nlc3MuZW52LkFQUElVTV9QUkVGRVJfU1lTVEVNX1VOWklQO1xuICAgIGNvbnN0IHVzZVN5c3RlbVVuemlwID0gXy5pc0VtcHR5KHVzZVN5c3RlbVVuemlwRW52KVxuICAgICAgfHwgIVsnMCcsICdmYWxzZSddLmluY2x1ZGVzKF8udG9Mb3dlcih1c2VTeXN0ZW1VbnppcEVudikpO1xuICAgIC8qKlxuICAgICAqIEF0dGVtcHQgdG8gdXNlIHVzZSB0aGUgc3lzdGVtIGB1bnppcGAgKGUuZy4sIGAvdXNyL2Jpbi91bnppcGApIGR1ZVxuICAgICAqIHRvIHRoZSBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBpdCBwcm92aWRlcyBvdmVyIHRoZSBuYXRpdmVcbiAgICAgKiBKUyBcInVuemlwXCIgaW1wbGVtZW50YXRpb24uXG4gICAgICogQHR5cGUge2ltcG9ydCgnQGFwcGl1bS9zdXBwb3J0L2xpYi96aXAnKS5FeHRyYWN0QWxsT3B0aW9uc31cbiAgICAgKi9cbiAgICBjb25zdCBleHRyYWN0aW9uT3B0cyA9IHt1c2VTeXN0ZW1VbnppcH07XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzE0MTAwXG4gICAgaWYgKHBhdGguZXh0bmFtZSh6aXBQYXRoKSA9PT0gSVBBX0VYVCkge1xuICAgICAgbG9nZ2VyLmRlYnVnKGBFbmZvcmNpbmcgVVRGLTggZW5jb2Rpbmcgb24gdGhlIGV4dHJhY3RlZCBmaWxlIG5hbWVzIGZvciAnJHtwYXRoLmJhc2VuYW1lKHppcFBhdGgpfSdgKTtcbiAgICAgIGV4dHJhY3Rpb25PcHRzLmZpbGVOYW1lc0VuY29kaW5nID0gJ3V0ZjgnO1xuICAgIH1cbiAgICBhd2FpdCB6aXAuZXh0cmFjdEFsbFRvKHppcFBhdGgsIHRtcFJvb3QsIGV4dHJhY3Rpb25PcHRzKTtcbiAgICBjb25zdCBkdXJhdGlvbiA9IHRpbWVyLmdldER1cmF0aW9uKCk7XG4gICAgY29uc3QgYWxsRXh0cmFjdGVkSXRlbXMgPSBhd2FpdCBmcy5nbG9iKCcqKicsIHtjd2Q6IHRtcFJvb3R9KTtcbiAgICBsb2dnZXIuZGVidWcoYEV4dHJhY3RlZCAke3V0aWwucGx1cmFsaXplKCdpdGVtJywgYWxsRXh0cmFjdGVkSXRlbXMubGVuZ3RoLCB0cnVlKX0gYCArXG4gICAgICBgZnJvbSAnJHt6aXBQYXRofScgaW4gJHtNYXRoLnJvdW5kKGR1cmF0aW9uLmFzTWlsbGlTZWNvbmRzKX1tc2ApO1xuICAgIGNvbnN0IGFsbEJ1bmRsZUl0ZW1zID0gYWxsRXh0cmFjdGVkSXRlbXNcbiAgICAgIC5maWx0ZXIoKHJlbGF0aXZlUGF0aCkgPT4gc3VwcG9ydGVkQXBwRXh0ZW5zaW9ucy5pbmNsdWRlcyhwYXRoLmV4dG5hbWUocmVsYXRpdmVQYXRoKSkpXG4gICAgICAvLyBHZXQgdGhlIHRvcCBsZXZlbCBtYXRjaFxuICAgICAgLnNvcnQoKGEsIGIpID0+IGEuc3BsaXQocGF0aC5zZXApLmxlbmd0aCAtIGIuc3BsaXQocGF0aC5zZXApLmxlbmd0aCk7XG4gICAgaWYgKF8uaXNFbXB0eShhbGxCdW5kbGVJdGVtcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQXBwIHppcCB1bnppcHBlZCBPSywgYnV0IHdlIGNvdWxkIG5vdCBmaW5kICcke3N1cHBvcnRlZEFwcEV4dGVuc2lvbnN9JyBgICtcbiAgICAgICAgdXRpbC5wbHVyYWxpemUoJ2J1bmRsZScsIHN1cHBvcnRlZEFwcEV4dGVuc2lvbnMubGVuZ3RoLCBmYWxzZSkgK1xuICAgICAgICBgIGluIGl0LiBNYWtlIHN1cmUgeW91ciBhcmNoaXZlIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBwYWNrYWdlIGhhdmluZyBgICtcbiAgICAgICAgYCcke3N1cHBvcnRlZEFwcEV4dGVuc2lvbnN9JyAke3V0aWwucGx1cmFsaXplKCdleHRlbnNpb24nLCBzdXBwb3J0ZWRBcHBFeHRlbnNpb25zLmxlbmd0aCwgZmFsc2UpfWApO1xuICAgIH1cbiAgICBjb25zdCBtYXRjaGVkQnVuZGxlID0gXy5maXJzdChhbGxCdW5kbGVJdGVtcyk7XG4gICAgbG9nZ2VyLmRlYnVnKGBNYXRjaGVkICR7dXRpbC5wbHVyYWxpemUoJ2l0ZW0nLCBhbGxCdW5kbGVJdGVtcy5sZW5ndGgsIHRydWUpfSBpbiB0aGUgZXh0cmFjdGVkIGFyY2hpdmUuIGAgK1xuICAgICAgYEFzc3VtaW5nICcke21hdGNoZWRCdW5kbGV9JyBpcyB0aGUgY29ycmVjdCBidW5kbGVgKTtcbiAgICBjb25zdCBkc3RQYXRoID0gcGF0aC5yZXNvbHZlKGRzdFJvb3QsIHBhdGguYmFzZW5hbWUobWF0Y2hlZEJ1bmRsZSkpO1xuICAgIGF3YWl0IGZzLm12KHBhdGgucmVzb2x2ZSh0bXBSb290LCBtYXRjaGVkQnVuZGxlKSwgZHN0UGF0aCwge21rZGlycDogdHJ1ZX0pO1xuICAgIHJldHVybiBkc3RQYXRoO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IGZzLnJpbXJhZih0bXBSb290KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1BhY2thZ2VPckJ1bmRsZSAoYXBwKSB7XG4gIHJldHVybiAoL14oW2EtekEtWjAtOVxcLV9dK1xcLlthLXpBLVowLTlcXC1fXSspKyQvKS50ZXN0KGFwcCk7XG59XG5cbi8qKlxuICogRmluZHMgYWxsIGluc3RhbmNlcyAnZmlyc3RLZXknIGFuZCBjcmVhdGUgYSBkdXBsaWNhdGUgd2l0aCB0aGUga2V5ICdzZWNvbmRLZXknLFxuICogRG8gdGhlIHNhbWUgdGhpbmcgaW4gcmV2ZXJzZS4gSWYgd2UgZmluZCAnc2Vjb25kS2V5JywgY3JlYXRlIGEgZHVwbGljYXRlIHdpdGggdGhlIGtleSAnZmlyc3RLZXknLlxuICpcbiAqIFRoaXMgd2lsbCBjYXVzZSBrZXlzIHRvIGJlIG92ZXJ3cml0dGVuIGlmIHRoZSBvYmplY3QgY29udGFpbnMgJ2ZpcnN0S2V5JyBhbmQgJ3NlY29uZEtleScuXG5cbiAqIEBwYXJhbSB7Kn0gaW5wdXQgQW55IHR5cGUgb2YgaW5wdXRcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaXJzdEtleSBUaGUgZmlyc3Qga2V5IHRvIGR1cGxpY2F0ZVxuICogQHBhcmFtIHtTdHJpbmd9IHNlY29uZEtleSBUaGUgc2Vjb25kIGtleSB0byBkdXBsaWNhdGVcbiAqL1xuZnVuY3Rpb24gZHVwbGljYXRlS2V5cyAoaW5wdXQsIGZpcnN0S2V5LCBzZWNvbmRLZXkpIHtcbiAgLy8gSWYgYXJyYXkgcHJvdmlkZWQsIHJlY3Vyc2l2ZWx5IGNhbGwgb24gYWxsIGVsZW1lbnRzXG4gIGlmIChfLmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgcmV0dXJuIGlucHV0Lm1hcCgoaXRlbSkgPT4gZHVwbGljYXRlS2V5cyhpdGVtLCBmaXJzdEtleSwgc2Vjb25kS2V5KSk7XG4gIH1cblxuICAvLyBJZiBvYmplY3QsIGNyZWF0ZSBkdXBsaWNhdGVzIGZvciBrZXlzIGFuZCB0aGVuIHJlY3Vyc2l2ZWx5IGNhbGwgb24gdmFsdWVzXG4gIGlmIChfLmlzUGxhaW5PYmplY3QoaW5wdXQpKSB7XG4gICAgY29uc3QgcmVzdWx0T2JqID0ge307XG4gICAgZm9yIChsZXQgW2tleSwgdmFsdWVdIG9mIF8udG9QYWlycyhpbnB1dCkpIHtcbiAgICAgIGNvbnN0IHJlY3Vyc2l2ZWx5Q2FsbGVkVmFsdWUgPSBkdXBsaWNhdGVLZXlzKHZhbHVlLCBmaXJzdEtleSwgc2Vjb25kS2V5KTtcbiAgICAgIGlmIChrZXkgPT09IGZpcnN0S2V5KSB7XG4gICAgICAgIHJlc3VsdE9ialtzZWNvbmRLZXldID0gcmVjdXJzaXZlbHlDYWxsZWRWYWx1ZTtcbiAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSBzZWNvbmRLZXkpIHtcbiAgICAgICAgcmVzdWx0T2JqW2ZpcnN0S2V5XSA9IHJlY3Vyc2l2ZWx5Q2FsbGVkVmFsdWU7XG4gICAgICB9XG4gICAgICByZXN1bHRPYmpba2V5XSA9IHJlY3Vyc2l2ZWx5Q2FsbGVkVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRPYmo7XG4gIH1cblxuICAvLyBCYXNlIGNhc2UuIFJldHVybiBwcmltaXRpdmVzIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcuXG4gIHJldHVybiBpbnB1dDtcbn1cblxuLyoqXG4gKiBUYWtlcyBhIGRlc2lyZWQgY2FwYWJpbGl0eSBhbmQgdHJpZXMgdG8gSlNPTi5wYXJzZSBpdCBhcyBhbiBhcnJheSxcbiAqIGFuZCBlaXRoZXIgcmV0dXJucyB0aGUgcGFyc2VkIGFycmF5IG9yIGEgc2luZ2xldG9uIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfEFycmF5PFN0cmluZz59IGNhcCBBIGRlc2lyZWQgY2FwYWJpbGl0eVxuICovXG5mdW5jdGlvbiBwYXJzZUNhcHNBcnJheSAoY2FwKSB7XG4gIGlmIChfLmlzQXJyYXkoY2FwKSkge1xuICAgIHJldHVybiBjYXA7XG4gIH1cblxuICBsZXQgcGFyc2VkQ2FwcztcbiAgdHJ5IHtcbiAgICBwYXJzZWRDYXBzID0gSlNPTi5wYXJzZShjYXApO1xuICAgIGlmIChfLmlzQXJyYXkocGFyc2VkQ2FwcykpIHtcbiAgICAgIHJldHVybiBwYXJzZWRDYXBzO1xuICAgIH1cbiAgfSBjYXRjaCAoaWduKSB7XG4gICAgbG9nZ2VyLndhcm4oYEZhaWxlZCB0byBwYXJzZSBjYXBhYmlsaXR5IGFzIEpTT04gYXJyYXlgKTtcbiAgfVxuICBpZiAoXy5pc1N0cmluZyhjYXApKSB7XG4gICAgcmV0dXJuIFtjYXBdO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgbXVzdCBwcm92aWRlIGEgc3RyaW5nIG9yIEpTT04gQXJyYXk7IHJlY2VpdmVkICR7Y2FwfWApO1xufVxuXG5leHBvcnQge1xuICBjb25maWd1cmVBcHAsIGlzUGFja2FnZU9yQnVuZGxlLCBkdXBsaWNhdGVLZXlzLCBwYXJzZUNhcHNBcnJheVxufTtcbiJdLCJmaWxlIjoibGliL2Jhc2Vkcml2ZXIvaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
534
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9iYXNlZHJpdmVyL2hlbHBlcnMuanMiXSwibmFtZXMiOlsiSVBBX0VYVCIsIlpJUF9FWFRTIiwiWklQX01JTUVfVFlQRVMiLCJDQUNIRURfQVBQU19NQVhfQUdFIiwiTUFYX0NBQ0hFRF9BUFBTIiwiQVBQTElDQVRJT05TX0NBQ0hFIiwiTFJVIiwibWF4IiwidHRsIiwidXBkYXRlQWdlT25HZXQiLCJkaXNwb3NlIiwiYXBwIiwiZnVsbFBhdGgiLCJsb2dnZXIiLCJpbmZvIiwiZnMiLCJyaW1yYWYiLCJub0Rpc3Bvc2VPblNldCIsIkFQUExJQ0FUSU9OU19DQUNIRV9HVUFSRCIsIkFzeW5jTG9jayIsIlNBTklUSVpFX1JFUExBQ0VNRU5UIiwiREVGQVVMVF9CQVNFTkFNRSIsIkFQUF9ET1dOTE9BRF9USU1FT1VUX01TIiwicHJvY2VzcyIsIm9uIiwic2l6ZSIsImFwcFBhdGhzIiwidmFsdWVzIiwibWFwIiwiZGVidWciLCJsZW5ndGgiLCJ1dGlsIiwicGx1cmFsaXplIiwiYXBwUGF0aCIsInJpbXJhZlN5bmMiLCJlIiwid2FybiIsIm1lc3NhZ2UiLCJyZXRyaWV2ZUhlYWRlcnMiLCJsaW5rIiwidXJsIiwibWV0aG9kIiwidGltZW91dCIsImhlYWRlcnMiLCJnZXRDYWNoZWRBcHBsaWNhdGlvblBhdGgiLCJjdXJyZW50QXBwUHJvcHMiLCJjYWNoZWRBcHBJbmZvIiwicmVmcmVzaCIsIl8iLCJpc1BsYWluT2JqZWN0IiwibGFzdE1vZGlmaWVkIiwiY3VycmVudE1vZGlmaWVkIiwiaW1tdXRhYmxlIiwiY3VycmVudEltbXV0YWJsZSIsIm1heEFnZSIsImN1cnJlbnRNYXhBZ2UiLCJ0aW1lc3RhbXAiLCJnZXRUaW1lIiwibXNMZWZ0IiwiRGF0ZSIsIm5vdyIsInBhdGgiLCJiYXNlbmFtZSIsInZlcmlmeUFwcEV4dGVuc2lvbiIsInN1cHBvcnRlZEFwcEV4dGVuc2lvbnMiLCJ0b0xvd2VyIiwiaW5jbHVkZXMiLCJleHRuYW1lIiwiRXJyb3IiLCJjYWxjdWxhdGVGb2xkZXJJbnRlZ3JpdHkiLCJmb2xkZXJQYXRoIiwiZ2xvYiIsImN3ZCIsInN0cmljdCIsIm5vc29ydCIsImNhbGN1bGF0ZUZpbGVJbnRlZ3JpdHkiLCJmaWxlUGF0aCIsImhhc2giLCJpc0FwcEludGVncml0eU9rIiwiY3VycmVudFBhdGgiLCJleHBlY3RlZEludGVncml0eSIsImV4aXN0cyIsInN0YXQiLCJpc0RpcmVjdG9yeSIsImZvbGRlciIsImZpbGUiLCJjb25maWd1cmVBcHAiLCJvcHRpb25zIiwiaXNTdHJpbmciLCJvblBvc3RQcm9jZXNzIiwiaXNBcnJheSIsInN1cHBvcnRlZEV4dGVuc2lvbnMiLCJpc0VtcHR5IiwibmV3QXBwIiwic2hvdWxkVW56aXBBcHAiLCJwYWNrYWdlSGFzaCIsInJlbW90ZUFwcFByb3BzIiwicHJvdG9jb2wiLCJwYXRobmFtZSIsInBhcnNlIiwiaXNVcmwiLCJnZXQiLCJhY3F1aXJlIiwidGVzdCIsIm1heEFnZU1hdGNoIiwiZXhlYyIsInBhcnNlSW50IiwiY2FjaGVkUGF0aCIsImludGVncml0eSIsImRlbCIsImZpbGVOYW1lIiwic2FuaXRpemVOYW1lIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwicmVwbGFjZW1lbnQiLCJjdCIsInNvbWUiLCJtaW1lVHlwZSIsIlJlZ0V4cCIsImVzY2FwZVJlZ0V4cCIsIm1hdGNoIiwicmVzdWx0aW5nTmFtZSIsInN1YnN0cmluZyIsInJlc3VsdGluZ0V4dCIsImZpcnN0IiwidGFyZ2V0UGF0aCIsInRlbXBEaXIiLCJwcmVmaXgiLCJzdWZmaXgiLCJkb3dubG9hZEFwcCIsImVycm9yTWVzc2FnZSIsImlzUGFja2FnZUFGaWxlIiwiaXNGaWxlIiwiaXNGdW5jdGlvbiIsImFyY2hpdmVQYXRoIiwidG1wUm9vdCIsIm9wZW5EaXIiLCJ1bnppcEFwcCIsImlzQWJzb2x1dGUiLCJyZXNvbHZlIiwic3RvcmVBcHBJbkNhY2hlIiwiYXBwUGF0aFRvQ2FjaGUiLCJjYWNoZWRGdWxsUGF0aCIsInNldCIsInJlc3VsdCIsImNsb25lIiwiQm9vbGVhbiIsImhyZWYiLCJuZXQiLCJkb3dubG9hZEZpbGUiLCJlcnIiLCJ6aXBQYXRoIiwiZHN0Um9vdCIsInppcCIsImFzc2VydFZhbGlkWmlwIiwidGltZXIiLCJ0aW1pbmciLCJUaW1lciIsInN0YXJ0IiwidXNlU3lzdGVtVW56aXBFbnYiLCJlbnYiLCJBUFBJVU1fUFJFRkVSX1NZU1RFTV9VTlpJUCIsInVzZVN5c3RlbVVuemlwIiwiZXh0cmFjdGlvbk9wdHMiLCJmaWxlTmFtZXNFbmNvZGluZyIsImV4dHJhY3RBbGxUbyIsImdsb2JQYXR0ZXJuIiwiZXh0IiwicmVwbGFjZSIsImpvaW4iLCJzb3J0ZWRCdW5kbGVJdGVtcyIsInNvcnQiLCJhIiwiYiIsInNwbGl0Iiwic2VwIiwiZXJyb3JBbmRUaHJvdyIsIk1hdGgiLCJyb3VuZCIsImdldER1cmF0aW9uIiwiYXNNaWxsaVNlY29uZHMiLCJtYXRjaGVkQnVuZGxlIiwiZHN0UGF0aCIsIm12IiwibWtkaXJwIiwiaXNQYWNrYWdlT3JCdW5kbGUiLCJkdXBsaWNhdGVLZXlzIiwiaW5wdXQiLCJmaXJzdEtleSIsInNlY29uZEtleSIsIml0ZW0iLCJyZXN1bHRPYmoiLCJrZXkiLCJ2YWx1ZSIsInRvUGFpcnMiLCJyZWN1cnNpdmVseUNhbGxlZFZhbHVlIiwicGFyc2VDYXBzQXJyYXkiLCJjYXAiLCJwYXJzZWRDYXBzIiwiSlNPTiIsImlnbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxPQUFPLEdBQUcsTUFBaEI7QUFDQSxNQUFNQyxRQUFRLEdBQUcsQ0FBQyxNQUFELEVBQVNELE9BQVQsQ0FBakI7QUFDQSxNQUFNRSxjQUFjLEdBQUcsQ0FDckIsaUJBRHFCLEVBRXJCLDhCQUZxQixFQUdyQixpQkFIcUIsQ0FBdkI7QUFLQSxNQUFNQyxtQkFBbUIsR0FBRyxPQUFPLEVBQVAsR0FBWSxFQUFaLEdBQWlCLEVBQTdDO0FBQ0EsTUFBTUMsZUFB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OztBQVFELFNBQVNTLGNBQVQsQ0FBeUJDLEdBQXpCLEVBQThCO0FBQzVCLE1BQUlwSixnQkFBRTBDLE9BQUYsQ0FBVTBHLEdBQVYsQ0FBSixFQUFvQjtBQUNsQixXQUFPQSxHQUFQO0FBQ0Q7O0FBRUQsTUFBSUMsVUFBSjs7QUFDQSxNQUFJO0FBQ0ZBLElBQUFBLFVBQVUsR0FBR0MsSUFBSSxDQUFDbkcsS0FBTCxDQUFXaUcsR0FBWCxDQUFiOztBQUNBLFFBQUlwSixnQkFBRTBDLE9BQUYsQ0FBVTJHLFVBQVYsQ0FBSixFQUEyQjtBQUN6QixhQUFPQSxVQUFQO0FBQ0Q7QUFDRixHQUxELENBS0UsT0FBT0UsR0FBUCxFQUFZO0FBQ1oxTCxvQkFBT3VCLElBQVAsQ0FBYSwwQ0FBYjtBQUNEOztBQUNELE1BQUlZLGdCQUFFd0MsUUFBRixDQUFXNEcsR0FBWCxDQUFKLEVBQXFCO0FBQ25CLFdBQU8sQ0FBQ0EsR0FBRCxDQUFQO0FBQ0Q7O0FBQ0QsUUFBTSxJQUFJaEksS0FBSixDQUFXLGlEQUFnRGdJLEdBQUksRUFBL0QsQ0FBTjtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHVybCBmcm9tICd1cmwnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgeyB0ZW1wRGlyLCBmcywgdXRpbCwgemlwLCBuZXQsIHRpbWluZyB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgTFJVIGZyb20gJ2xydS1jYWNoZSc7XG5pbXBvcnQgQXN5bmNMb2NrIGZyb20gJ2FzeW5jLWxvY2snO1xuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcblxuY29uc3QgSVBBX0VYVCA9ICcuaXBhJztcbmNvbnN0IFpJUF9FWFRTID0gWycuemlwJywgSVBBX0VYVF07XG5jb25zdCBaSVBfTUlNRV9UWVBFUyA9IFtcbiAgJ2FwcGxpY2F0aW9uL3ppcCcsXG4gICdhcHBsaWNhdGlvbi94LXppcC1jb21wcmVzc2VkJyxcbiAgJ211bHRpcGFydC94LXppcCcsXG5dO1xuY29uc3QgQ0FDSEVEX0FQUFNfTUFYX0FHRSA9IDEwMDAgKiA2MCAqIDYwICogMjQ7IC8vIG1zXG5jb25zdCBNQVhfQ0FDSEVEX0FQUFMgPSAxMDI0O1xuY29uc3QgQVBQTElDQVRJT05TX0NBQ0hFID0gbmV3IExSVSh7XG4gIG1heDogTUFYX0NBQ0hFRF9BUFBTLFxuICB0dGw6IENBQ0hFRF9BUFBTX01BWF9BR0UsIC8vIGV4cGlyZSBhZnRlciAyNCBob3Vyc1xuICB1cGRhdGVBZ2VPbkdldDogdHJ1ZSxcbiAgZGlzcG9zZTogKGFwcCwge2Z1bGxQYXRofSkgPT4ge1xuICAgIGxvZ2dlci5pbmZvKGBUaGUgYXBwbGljYXRpb24gJyR7YXBwfScgY2FjaGVkIGF0ICcke2Z1bGxQYXRofScgaGFzIGAgK1xuICAgICAgYGV4cGlyZWQgYWZ0ZXIgJHtDQUNIRURfQVBQU19NQVhfQUdFfW1zYCk7XG4gICAgaWYgKGZ1bGxQYXRoKSB7XG4gICAgICBmcy5yaW1yYWYoZnVsbFBhdGgpO1xuICAgIH1cbiAgfSxcbiAgbm9EaXNwb3NlT25TZXQ6IHRydWUsXG59KTtcbmNvbnN0IEFQUExJQ0FUSU9OU19DQUNIRV9HVUFSRCA9IG5ldyBBc3luY0xvY2soKTtcbmNvbnN0IFNBTklUSVpFX1JFUExBQ0VNRU5UID0gJy0nO1xuY29uc3QgREVGQVVMVF9CQVNFTkFNRSA9ICdhcHBpdW0tYXBwJztcbmNvbnN0IEFQUF9ET1dOTE9BRF9USU1FT1VUX01TID0gMTIwICogMTAwMDtcblxucHJvY2Vzcy5vbignZXhpdCcsICgpID0+IHtcbiAgaWYgKEFQUExJQ0FUSU9OU19DQUNIRS5zaXplID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYXBwUGF0aHMgPSBbLi4uQVBQTElDQVRJT05TX0NBQ0hFLnZhbHVlcygpXVxuICAgIC5tYXAoKHtmdWxsUGF0aH0pID0+IGZ1bGxQYXRoKTtcbiAgbG9nZ2VyLmRlYnVnKGBQZXJmb3JtaW5nIGNsZWFudXAgb2YgJHthcHBQYXRocy5sZW5ndGh9IGNhY2hlZCBgICtcbiAgICB1dGlsLnBsdXJhbGl6ZSgnYXBwbGljYXRpb24nLCBhcHBQYXRocy5sZW5ndGgpKTtcbiAgZm9yIChjb25zdCBhcHBQYXRoIG9mIGFwcFBhdGhzKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEFzeW5jaHJvbm91cyBjYWxscyBhcmUgbm90IHN1cHBvcnRlZCBpbiBvbkV4aXQgaGFuZGxlclxuICAgICAgZnMucmltcmFmU3luYyhhcHBQYXRoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnZXIud2FybihlLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxufSk7XG5cblxuYXN5bmMgZnVuY3Rpb24gcmV0cmlldmVIZWFkZXJzIChsaW5rKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChhd2FpdCBheGlvcyh7XG4gICAgICB1cmw6IGxpbmssXG4gICAgICBtZXRob2Q6ICdIRUFEJyxcbiAgICAgIHRpbWVvdXQ6IDUwMDAsXG4gICAgfSkpLmhlYWRlcnM7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2dnZXIuaW5mbyhgQ2Fubm90IHNlbmQgSEVBRCByZXF1ZXN0IHRvICcke2xpbmt9Jy4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG4gIHJldHVybiB7fTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2FjaGVkQXBwbGljYXRpb25QYXRoIChsaW5rLCBjdXJyZW50QXBwUHJvcHMgPSB7fSwgY2FjaGVkQXBwSW5mbyA9IHt9KSB7XG4gIGNvbnN0IHJlZnJlc2ggPSAoKSA9PiB7XG4gICAgbG9nZ2VyLmRlYnVnKGBBIGZyZXNoIGNvcHkgb2YgdGhlIGFwcGxpY2F0aW9uIGlzIGdvaW5nIHRvIGJlIGRvd25sb2FkZWQgZnJvbSAke2xpbmt9YCk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgaWYgKCFfLmlzUGxhaW5PYmplY3QoY2FjaGVkQXBwSW5mbykgfHwgIV8uaXNQbGFpbk9iamVjdChjdXJyZW50QXBwUHJvcHMpKSB7XG4gICAgLy8gaWYgYW4gaW52YWxpZCBhcmcgaXMgcGFzc2VkIHRoZW4gYXNzdW1lIGNhY2hlIG1pc3NcbiAgICByZXR1cm4gcmVmcmVzaCgpO1xuICB9XG5cbiAgY29uc3Qge1xuICAgIGxhc3RNb2RpZmllZDogY3VycmVudE1vZGlmaWVkLFxuICAgIGltbXV0YWJsZTogY3VycmVudEltbXV0YWJsZSxcbiAgICAvLyBtYXhBZ2UgaXMgaW4gc2Vjb25kc1xuICAgIG1heEFnZTogY3VycmVudE1heEFnZSxcbiAgfSA9IGN1cnJlbnRBcHBQcm9wcztcbiAgY29uc3Qge1xuICAgIC8vIERhdGUgaW5zdGFuY2VcbiAgICBsYXN0TW9kaWZpZWQsXG4gICAgLy8gYm9vbGVhblxuICAgIGltbXV0YWJsZSxcbiAgICAvLyBVbml4IHRpbWUgaW4gbWlsbGlzZWNvbmRzXG4gICAgdGltZXN0YW1wLFxuICAgIGZ1bGxQYXRoLFxuICB9ID0gY2FjaGVkQXBwSW5mbztcbiAgaWYgKGxhc3RNb2RpZmllZCAmJiBjdXJyZW50TW9kaWZpZWQpIHtcbiAgICBpZiAoY3VycmVudE1vZGlmaWVkLmdldFRpbWUoKSA8PSBsYXN0TW9kaWZpZWQuZ2V0VGltZSgpKSB7XG4gICAgICBsb2dnZXIuZGVidWcoYFRoZSBhcHBsaWNhdGlvbiBhdCAke2xpbmt9IGhhcyBub3QgYmVlbiBtb2RpZmllZCBzaW5jZSAke2xhc3RNb2RpZmllZH1gKTtcbiAgICAgIHJldHVybiBmdWxsUGF0aDtcbiAgICB9XG4gICAgbG9nZ2VyLmRlYnVnKGBUaGUgYXBwbGljYXRpb24gYXQgJHtsaW5rfSBoYXMgYmVlbiBtb2RpZmllZCBzaW5jZSAke2xhc3RNb2RpZmllZH1gKTtcbiAgICByZXR1cm4gcmVmcmVzaCgpO1xuICB9XG4gIGlmIChpbW11dGFibGUgJiYgY3VycmVudEltbXV0YWJsZSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgVGhlIGFwcGxpY2F0aW9uIGF0ICR7bGlua30gaXMgaW1tdXRhYmxlYCk7XG4gICAgcmV0dXJuIGZ1bGxQYXRoO1xuICB9XG4gIGlmIChjdXJyZW50TWF4QWdlICYmIHRpbWVzdGFtcCkge1xuICAgIGNvbnN0IG1zTGVmdCA9IHRpbWVzdGFtcCArIGN1cnJlbnRNYXhBZ2UgKiAxMDAwIC0gRGF0ZS5ub3coKTtcbiAgICBpZiAobXNMZWZ0ID4gMCkge1xuICAgICAgbG9nZ2VyLmRlYnVnKGBUaGUgY2FjaGVkIGFwcGxpY2F0aW9uICcke3BhdGguYmFzZW5hbWUoZnVsbFBhdGgpfScgd2lsbCBleHBpcmUgaW4gJHttc0xlZnQgLyAxMDAwfXNgKTtcbiAgICAgIHJldHVybiBmdWxsUGF0aDtcbiAgICB9XG4gICAgbG9nZ2VyLmRlYnVnKGBUaGUgY2FjaGVkIGFwcGxpY2F0aW9uICcke3BhdGguYmFzZW5hbWUoZnVsbFBhdGgpfScgaGFzIGV4cGlyZWRgKTtcbiAgfVxuICByZXR1cm4gcmVmcmVzaCgpO1xufVxuXG5mdW5jdGlvbiB2ZXJpZnlBcHBFeHRlbnNpb24gKGFwcCwgc3VwcG9ydGVkQXBwRXh0ZW5zaW9ucykge1xuICBpZiAoc3VwcG9ydGVkQXBwRXh0ZW5zaW9ucy5tYXAoXy50b0xvd2VyKS5pbmNsdWRlcyhfLnRvTG93ZXIocGF0aC5leHRuYW1lKGFwcCkpKSkge1xuICAgIHJldHVybiBhcHA7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBOZXcgYXBwIHBhdGggJyR7YXBwfScgZGlkIG5vdCBoYXZlIGAgK1xuICAgIGAke3V0aWwucGx1cmFsaXplKCdleHRlbnNpb24nLCBzdXBwb3J0ZWRBcHBFeHRlbnNpb25zLmxlbmd0aCwgZmFsc2UpfTogYCArXG4gICAgc3VwcG9ydGVkQXBwRXh0ZW5zaW9ucyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNhbGN1bGF0ZUZvbGRlckludGVncml0eSAoZm9sZGVyUGF0aCkge1xuICByZXR1cm4gKGF3YWl0IGZzLmdsb2IoJyoqLyonLCB7Y3dkOiBmb2xkZXJQYXRoLCBzdHJpY3Q6IGZhbHNlLCBub3NvcnQ6IHRydWV9KSkubGVuZ3RoO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjYWxjdWxhdGVGaWxlSW50ZWdyaXR5IChmaWxlUGF0aCkge1xuICByZXR1cm4gYXdhaXQgZnMuaGFzaChmaWxlUGF0aCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGlzQXBwSW50ZWdyaXR5T2sgKGN1cnJlbnRQYXRoLCBleHBlY3RlZEludGVncml0eSA9IHt9KSB7XG4gIGlmICghYXdhaXQgZnMuZXhpc3RzKGN1cnJlbnRQYXRoKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIEZvbGRlciBpbnRlZ3JpdHkgY2hlY2sgaXMgc2ltcGxlOlxuICAvLyBWZXJpZnkgdGhlIHByZXZpb3VzIGFtb3VudCBvZiBmaWxlcyBpcyBub3QgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IG9uZS5cbiAgLy8gV2UgZG9uJ3Qgd2FudCB0byB1c2UgZXF1YWxpdHkgY29tcGFyaXNvbiBiZWNhdXNlIG9mIGFuIGFzc3VtcHRpb24gdGhhdCB0aGUgT1MgbWlnaHRcbiAgLy8gY3JlYXRlIHNvbWUgdW53YW50ZWQgc2VydmljZSBmaWxlcy9jYWNoZWQgaW5zaWRlIG9mIHRoYXQgZm9sZGVyIG9yIGl0cyBzdWJmb2xkZXJzLlxuICAvLyBPZmMsIHZhbGlkYXRpbmcgdGhlIGhhc2ggc3VtIG9mIGVhY2ggZmlsZSAob3IgYXQgbGVhc3Qgb2YgZmlsZSBwYXRoKSB3b3VsZCBiZSBtdWNoXG4gIC8vIG1vcmUgcHJlY2lzZSwgYnV0IHdlIGRvbid0IG5lZWQgdG8gYmUgdmVyeSBwcmVjaXNlIGhlcmUgYW5kIGFsc28gZG9uJ3Qgd2FudCB0b1xuICAvLyBvdmVydXNlIFJBTSBhbmQgaGF2ZSBhIHBlcmZvcm1hbmNlIGRyb3AuXG4gIHJldHVybiAoYXdhaXQgZnMuc3RhdChjdXJyZW50UGF0aCkpLmlzRGlyZWN0b3J5KClcbiAgICA/IGF3YWl0IGNhbGN1bGF0ZUZvbGRlckludGVncml0eShjdXJyZW50UGF0aCkgPj0gZXhwZWN0ZWRJbnRlZ3JpdHk/LmZvbGRlclxuICAgIDogYXdhaXQgY2FsY3VsYXRlRmlsZUludGVncml0eShjdXJyZW50UGF0aCkgPT09IGV4cGVjdGVkSW50ZWdyaXR5Py5maWxlO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIFBvc3RQcm9jZXNzT3B0aW9uc1xuICogQHByb3BlcnR5IHs/T2JqZWN0fSBjYWNoZWRBcHBJbmZvIFRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJldmlvdXNseSBjYWNoZWQgYXBwIGluc3RhbmNlIChpZiBleGlzdHMpOlxuICogICAgLSBwYWNrYWdlSGFzaDogU0hBMSBoYXNoIG9mIHRoZSBwYWNrYWdlIGlmIGl0IGlzIGEgZmlsZSBhbmQgbm90IGEgZm9sZGVyXG4gKiAgICAtIGxhc3RNb2RpZmllZDogT3B0aW9uYWwgRGF0ZSBpbnN0YW5jZSwgdGhlIHZhbHVlIG9mIGZpbGUncyBgTGFzdC1Nb2RpZmllZGAgaGVhZGVyXG4gKiAgICAtIGltbXV0YWJsZTogT3B0aW9uYWwgYm9vbGVhbiB2YWx1ZS4gQ29udGFpbnMgdHJ1ZSBpZiB0aGUgZmlsZSBoYXMgYW4gYGltbXV0YWJsZWAgbWFya1xuICogICAgICAgICAgICAgICAgIGluIGBDYWNoZS1jb250cm9sYCBoZWFkZXJcbiAqICAgIC0gbWF4QWdlOiBPcHRpb25hbCBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIGBtYXhBZ2VgIHBhcmFtZXRlciBpbiBgQ2FjaGUtY29udHJvbGAgaGVhZGVyXG4gKiAgICAtIHRpbWVzdGFtcDogVGhlIHRpbWVzdGFtcCB0aGlzIGl0ZW0gaGFzIGJlZW4gYWRkZWQgdG8gdGhlIGNhY2hlIChtZWFzdXJlZCBpbiBVbml4IGVwb2NoXG4gKiAgICAgICAgICAgICAgICAgbWlsbGlzZWNvbmRzKVxuICogICAgLSBpbnRlZ3JpdHk6IEFuIG9iamVjdCBjb250YWluaW5nIGVpdGhlciBgZmlsZWAgcHJvcGVydHkgd2l0aCBTSEExIGhhc2ggb2YgdGhlIGZpbGVcbiAqICAgICAgICAgICAgICAgICBvciBgZm9sZGVyYCBwcm9wZXJ0eSB3aXRoIHRvdGFsIGFtb3VudCBvZiBjYWNoZWQgZmlsZXMgYW5kIHN1YmZvbGRlcnNcbiAqICAgIC0gZnVsbFBhdGg6IHRoZSBmdWxsIHBhdGggdG8gdGhlIGNhY2hlZCBhcHBcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaXNVcmwgV2hldGhlciB0aGUgYXBwIGhhcyBiZWVuIGRvd25sb2FkZWQgZnJvbSBhIHJlbW90ZSBVUkxcbiAqIEBwcm9wZXJ0eSB7P09iamVjdH0gaGVhZGVycyBPcHRpb25hbCBoZWFkZXJzIG9iamVjdC4gT25seSBwcmVzZW50IGlmIGBpc1VybGAgaXMgdHJ1ZSBhbmQgaWYgdGhlIHNlcnZlclxuICogcmVzcG9uZHMgdG8gSEVBRCByZXF1ZXN0cy4gQWxsIGhlYWRlciBuYW1lcyBhcmUgbm9ybWFsaXplZCB0byBsb3dlcmNhc2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXBwUGF0aCBBIHN0cmluZyBjb250YWluaW5nIGZ1bGwgcGF0aCB0byB0aGUgcHJlcHJvY2Vzc2VkIGFwcGxpY2F0aW9uIHBhY2thZ2UgKGVpdGhlclxuICogZG93bmxvYWRlZCBvciBhIGxvY2FsIG9uZSlcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFBvc3RQcm9jZXNzUmVzdWx0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXBwUGF0aCBUaGUgZnVsbCBwYXN0IHRvIHRoZSBwb3N0LXByb2Nlc3NlZCBhcHBsaWNhdGlvbiBwYWNrYWdlIG9uIHRoZVxuICogbG9jYWwgZmlsZSBzeXN0ZW0gKG1pZ2h0IGJlIGEgZmlsZSBvciBhIGZvbGRlciBwYXRoKVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQ29uZmlndXJlQXBwT3B0aW9uc1xuICogQHByb3BlcnR5IHsob2JqOiBQb3N0UHJvY2Vzc09wdGlvbnMpID0+IChQcm9taXNlPFBvc3RQcm9jZXNzUmVzdWx0fHVuZGVmaW5lZD58UG9zdFByb2Nlc3NSZXN1bHR8dW5kZWZpbmVkKX0gb25Qb3N0UHJvY2Vzc1xuICogT3B0aW9uYWwgZnVuY3Rpb24sIHdoaWNoIHNob3VsZCBiZSBhcHBsaWVkXG4gKiB0byB0aGUgYXBwbGljYXRpb24gYWZ0ZXIgaXQgaXMgZG93bmxvYWRlZC9wcmVwcm9jZXNzZWQuIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGFzeW5jXG4gKiBhbmQgaXMgZXhwZWN0ZWQgdG8gYWNjZXB0IHNpbmdsZSBvYmplY3QgcGFyYW1ldGVyLlxuICogVGhlIGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvIGVpdGhlciByZXR1cm4gYSBmYWxzeSB2YWx1ZSwgd2hpY2ggbWVhbnMgdGhlIGFwcCBtdXN0IG5vdCBiZVxuICogY2FjaGVkIGFuZCBhIGZyZXNoIGNvcHkgb2YgaXQgaXMgZG93bmxvYWRlZCBlYWNoIHRpbWUuIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBvYmplY3RcbiAqIGNvbnRhaW5pbmcgYGFwcFBhdGhgIHByb3BlcnR5IHRoZW4gdGhlIGludGVncml0eSBvZiBpdCB3aWxsIGJlIHZlcmlmaWVkIGFuZCBzdG9yZWQgaW50b1xuICogdGhlIGNhY2hlLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gc3VwcG9ydGVkRXh0ZW5zaW9ucyBMaXN0IG9mIHN1cHBvcnRlZCBhcHBsaWNhdGlvbiBleHRlbnNpb25zIChcbiAqIGluY2x1ZGluZyBzdGFydGluZyBkb3RzKS4gVGhpcyBwcm9wZXJ0eSBpcyBtYW5kYXRvcnkgYW5kIG11c3Qgbm90IGJlIGVtcHR5LlxuICovXG5cbi8qKlxuICogUHJlcGFyZXMgYW4gYXBwIHRvIGJlIHVzZWQgaW4gYW4gYXV0b21hdGVkIHRlc3QuIFRoZSBhcHAgZ2V0cyBjYWNoZWQgYXV0b21hdGljYWxseVxuICogaWYgaXQgaXMgYW4gYXJjaGl2ZSBvciBpZiBpdCBpcyBkb3dubG9hZGVkIGZyb20gYW4gVVJMLlxuICogSWYgdGhlIGRvd25sb2FkZWQgYXBwIGhhcyBgLnppcGAgZXh0ZW5zaW9uLCB0aGlzIG1ldGhvZCB3aWxsIHVuemlwIGl0LlxuICogVGhlIHVuemlwIGRvZXMgbm90IHdvcmsgd2hlbiBgb25Qb3N0UHJvY2Vzc2AgaXMgcHJvdmlkZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcCBFaXRoZXIgYSBmdWxsIHBhdGggdG8gdGhlIGFwcCBvciBhIHJlbW90ZSBVUkxcbiAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfENvbmZpZ3VyZUFwcE9wdGlvbnN9IG9wdGlvbnNcbiAqIEByZXR1cm5zIFRoZSBmdWxsIHBhdGggdG8gdGhlIHJlc3VsdGluZyBhcHBsaWNhdGlvbiBidW5kbGVcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29uZmlndXJlQXBwIChhcHAsIG9wdGlvbnMgPSB7fSkge1xuICBpZiAoIV8uaXNTdHJpbmcoYXBwKSkge1xuICAgIC8vIGltbWVkaWF0ZWx5IHNob3J0Y2lyY3VpdCBpZiBub3QgZ2l2ZW4gYW4gYXBwXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IHN1cHBvcnRlZEFwcEV4dGVuc2lvbnM7XG4gIGNvbnN0IHtcbiAgICBvblBvc3RQcm9jZXNzLFxuICB9ID0gXy5pc1BsYWluT2JqZWN0KG9wdGlvbnMpID8gb3B0aW9ucyA6IHt9O1xuICBpZiAoXy5pc1N0cmluZyhvcHRpb25zKSkge1xuICAgIHN1cHBvcnRlZEFwcEV4dGVuc2lvbnMgPSBbb3B0aW9uc107XG4gIH0gZWxzZSBpZiAoXy5pc0FycmF5KG9wdGlvbnMpKSB7XG4gICAgc3VwcG9ydGVkQXBwRXh0ZW5zaW9ucyA9IG9wdGlvbnM7XG4gIH0gZWxzZSBpZiAoXy5pc1BsYWluT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgc3VwcG9ydGVkQXBwRXh0ZW5zaW9ucyA9IG9wdGlvbnMuc3VwcG9ydGVkRXh0ZW5zaW9ucztcbiAgfVxuICBpZiAoXy5pc0VtcHR5KHN1cHBvcnRlZEFwcEV4dGVuc2lvbnMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBPbmUgb3IgbW9yZSBzdXBwb3J0ZWQgYXBwIGV4dGVuc2lvbnMgbXVzdCBiZSBwcm92aWRlZGApO1xuICB9XG5cbiAgbGV0IG5ld0FwcCA9IGFwcDtcbiAgbGV0IHNob3VsZFVuemlwQXBwID0gZmFsc2U7XG4gIGxldCBwYWNrYWdlSGFzaCA9IG51bGw7XG4gIGxldCBoZWFkZXJzID0gbnVsbDtcbiAgY29uc3QgcmVtb3RlQXBwUHJvcHMgPSB7XG4gICAgbGFzdE1vZGlmaWVkOiBudWxsLFxuICAgIGltbXV0YWJsZTogZmFsc2UsXG4gICAgbWF4QWdlOiBudWxsLFxuICB9O1xuICBjb25zdCB7cHJvdG9jb2wsIHBhdGhuYW1lfSA9IHVybC5wYXJzZShuZXdBcHApO1xuICBjb25zdCBpc1VybCA9IFsnaHR0cDonLCAnaHR0cHM6J10uaW5jbHVkZXMocHJvdG9jb2wpO1xuXG4gIGNvbnN0IGNhY2hlZEFwcEluZm8gPSBBUFBMSUNBVElPTlNfQ0FDSEUuZ2V0KGFwcCk7XG5cbiAgcmV0dXJuIGF3YWl0IEFQUExJQ0FUSU9OU19DQUNIRV9HVUFSRC5hY3F1aXJlKGFwcCwgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChpc1VybCkge1xuICAgICAgLy8gVXNlIHRoZSBhcHAgZnJvbSByZW1vdGUgVVJMXG4gICAgICBsb2dnZXIuaW5mbyhgVXNpbmcgZG93bmxvYWRhYmxlIGFwcCAnJHtuZXdBcHB9J2ApO1xuICAgICAgaGVhZGVycyA9IGF3YWl0IHJldHJpZXZlSGVhZGVycyhuZXdBcHApO1xuICAgICAgaWYgKCFfLmlzRW1wdHkoaGVhZGVycykpIHtcbiAgICAgICAgaWYgKGhlYWRlcnNbJ2xhc3QtbW9kaWZpZWQnXSkge1xuICAgICAgICAgIHJlbW90ZUFwcFByb3BzLmxhc3RNb2RpZmllZCA9IG5ldyBEYXRlKGhlYWRlcnNbJ2xhc3QtbW9kaWZpZWQnXSk7XG4gICAgICAgIH1cbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBMYXN0LU1vZGlmaWVkOiAke2hlYWRlcnNbJ2xhc3QtbW9kaWZpZWQnXX1gKTtcbiAgICAgICAgaWYgKGhlYWRlcnNbJ2NhY2hlLWNvbnRyb2wnXSkge1xuICAgICAgICAgIHJlbW90ZUFwcFByb3BzLmltbXV0YWJsZSA9IC9cXGJpbW11dGFibGVcXGIvaS50ZXN0KGhlYWRlcnNbJ2NhY2hlLWNvbnRyb2wnXSk7XG4gICAgICAgICAgY29uc3QgbWF4QWdlTWF0Y2ggPSAvXFxibWF4LWFnZT0oXFxkKylcXGIvaS5leGVjKGhlYWRlcnNbJ2NhY2hlLWNvbnRyb2wnXSk7XG4gICAgICAgICAgaWYgKG1heEFnZU1hdGNoKSB7XG4gICAgICAgICAgICByZW1vdGVBcHBQcm9wcy5tYXhBZ2UgPSBwYXJzZUludChtYXhBZ2VNYXRjaFsxXSwgMTApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuZGVidWcoYENhY2hlLUNvbnRyb2w6ICR7aGVhZGVyc1snY2FjaGUtY29udHJvbCddfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgY2FjaGVkUGF0aCA9IGdldENhY2hlZEFwcGxpY2F0aW9uUGF0aChhcHAsIHJlbW90ZUFwcFByb3BzLCBjYWNoZWRBcHBJbmZvKTtcbiAgICAgIGlmIChjYWNoZWRQYXRoKSB7XG4gICAgICAgIGlmIChhd2FpdCBpc0FwcEludGVncml0eU9rKGNhY2hlZFBhdGgsIGNhY2hlZEFwcEluZm8/LmludGVncml0eSkpIHtcbiAgICAgICAgICBsb2dnZXIuaW5mbyhgUmV1c2luZyBwcmV2aW91c2x5IGRvd25sb2FkZWQgYXBwbGljYXRpb24gYXQgJyR7Y2FjaGVkUGF0aH0nYCk7XG4gICAgICAgICAgcmV0dXJuIHZlcmlmeUFwcEV4dGVuc2lvbihjYWNoZWRQYXRoLCBzdXBwb3J0ZWRBcHBFeHRlbnNpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuaW5mbyhgVGhlIGFwcGxpY2F0aW9uIGF0ICcke2NhY2hlZFBhdGh9JyBkb2VzIG5vdCBleGlzdCBhbnltb3JlIGAgK1xuICAgICAgICAgIGBvciBpdHMgaW50ZWdyaXR5IGhhcyBiZWVuIGRhbWFnZWQuIERlbGV0aW5nIGl0IGZyb20gdGhlIGludGVybmFsIGNhY2hlYCk7XG4gICAgICAgIEFQUExJQ0FUSU9OU19DQUNIRS5kZWwoYXBwKTtcbiAgICAgIH1cblxuICAgICAgbGV0IGZpbGVOYW1lID0gbnVsbDtcbiAgICAgIGNvbnN0IGJhc2VuYW1lID0gZnMuc2FuaXRpemVOYW1lKHBhdGguYmFzZW5hbWUoZGVjb2RlVVJJQ29tcG9uZW50KHBhdGhuYW1lKSksIHtcbiAgICAgICAgcmVwbGFjZW1lbnQ6IFNBTklUSVpFX1JFUExBQ0VNRU5UXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGV4dG5hbWUgPSBwYXRoLmV4dG5hbWUoYmFzZW5hbWUpO1xuICAgICAgLy8gdG8gZGV0ZXJtaW5lIGlmIHdlIG5lZWQgdG8gdW56aXAgdGhlIGFwcCwgd2UgaGF2ZSBhIG51bWJlciBvZiBwbGFjZXNcbiAgICAgIC8vIHRvIGxvb2s6IGNvbnRlbnQgdHlwZSwgY29udGVudCBkaXNwb3NpdGlvbiwgb3IgdGhlIGZpbGUgZXh0ZW5zaW9uXG4gICAgICBpZiAoWklQX0VYVFMuaW5jbHVkZXMoZXh0bmFtZSkpIHtcbiAgICAgICAgZmlsZU5hbWUgPSBiYXNlbmFtZTtcbiAgICAgICAgc2hvdWxkVW56aXBBcHAgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddKSB7XG4gICAgICAgIGNvbnN0IGN0ID0gaGVhZGVyc1snY29udGVudC10eXBlJ107XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgQ29udGVudC1UeXBlOiAke2N0fWApO1xuICAgICAgICAvLyB0aGUgZmlsZXR5cGUgbWF5IG5vdCBiZSBvYnZpb3VzIGZvciBjZXJ0YWluIHVybHMsIHNvIGNoZWNrIHRoZSBtaW1lIHR5cGUgdG9vXG4gICAgICAgIGlmIChaSVBfTUlNRV9UWVBFUy5zb21lKChtaW1lVHlwZSkgPT4gbmV3IFJlZ0V4cChgXFxcXGIke18uZXNjYXBlUmVnRXhwKG1pbWVUeXBlKX1cXFxcYmApLnRlc3QoY3QpKSkge1xuICAgICAgICAgIGlmICghZmlsZU5hbWUpIHtcbiAgICAgICAgICAgIGZpbGVOYW1lID0gYCR7REVGQVVMVF9CQVNFTkFNRX0uemlwYDtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2hvdWxkVW56aXBBcHAgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaGVhZGVyc1snY29udGVudC1kaXNwb3NpdGlvbiddICYmIC9eYXR0YWNobWVudC9pLnRlc3QoaGVhZGVyc1snY29udGVudC1kaXNwb3NpdGlvbiddKSkge1xuICAgICAgICBsb2dnZXIuZGVidWcoYENvbnRlbnQtRGlzcG9zaXRpb246ICR7aGVhZGVyc1snY29udGVudC1kaXNwb3NpdGlvbiddfWApO1xuICAgICAgICBjb25zdCBtYXRjaCA9IC9maWxlbmFtZT1cIihbXlwiXSspL2kuZXhlYyhoZWFkZXJzWydjb250ZW50LWRpc3Bvc2l0aW9uJ10pO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICBmaWxlTmFtZSA9IGZzLnNhbml0aXplTmFtZShtYXRjaFsxXSwge1xuICAgICAgICAgICAgcmVwbGFjZW1lbnQ6IFNBTklUSVpFX1JFUExBQ0VNRU5UXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgc2hvdWxkVW56aXBBcHAgPSBzaG91bGRVbnppcEFwcCB8fCBaSVBfRVhUUy5pbmNsdWRlcyhwYXRoLmV4dG5hbWUoZmlsZU5hbWUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFmaWxlTmFtZSkge1xuICAgICAgICAvLyBhc3NpZ24gdGhlIGRlZmF1bHQgZmlsZSBuYW1lIGFuZCB0aGUgZXh0ZW5zaW9uIGlmIG5vbmUgaGFzIGJlZW4gZGV0ZWN0ZWRcbiAgICAgICAgY29uc3QgcmVzdWx0aW5nTmFtZSA9IGJhc2VuYW1lXG4gICAgICAgICAgPyBiYXNlbmFtZS5zdWJzdHJpbmcoMCwgYmFzZW5hbWUubGVuZ3RoIC0gZXh0bmFtZS5sZW5ndGgpXG4gICAgICAgICAgOiBERUZBVUxUX0JBU0VOQU1FO1xuICAgICAgICBsZXQgcmVzdWx0aW5nRXh0ID0gZXh0bmFtZTtcbiAgICAgICAgaWYgKCFzdXBwb3J0ZWRBcHBFeHRlbnNpb25zLmluY2x1ZGVzKHJlc3VsdGluZ0V4dCkpIHtcbiAgICAgICAgICBsb2dnZXIuaW5mbyhgVGhlIGN1cnJlbnQgZmlsZSBleHRlbnNpb24gJyR7cmVzdWx0aW5nRXh0fScgaXMgbm90IHN1cHBvcnRlZC4gYCArXG4gICAgICAgICAgICBgRGVmYXVsdGluZyB0byAnJHtfLmZpcnN0KHN1cHBvcnRlZEFwcEV4dGVuc2lvbnMpfSdgKTtcbiAgICAgICAgICByZXN1bHRpbmdFeHQgPSBfLmZpcnN0KHN1cHBvcnRlZEFwcEV4dGVuc2lvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGZpbGVOYW1lID0gYCR7cmVzdWx0aW5nTmFtZX0ke3Jlc3VsdGluZ0V4dH1gO1xuICAgICAgfVxuICAgICAgY29uc3QgdGFyZ2V0UGF0aCA9IGF3YWl0IHRlbXBEaXIucGF0aCh7XG4gICAgICAgIHByZWZpeDogZmlsZU5hbWUsXG4gICAgICAgIHN1ZmZpeDogJycsXG4gICAgICB9KTtcbiAgICAgIG5ld0FwcCA9IGF3YWl0IGRvd25sb2FkQXBwKG5ld0FwcCwgdGFyZ2V0UGF0aCk7XG4gICAgfSBlbHNlIGlmIChhd2FpdCBmcy5leGlzdHMobmV3QXBwKSkge1xuICAgICAgLy8gVXNlIHRoZSBsb2NhbCBhcHBcbiAgICAgIGxvZ2dlci5pbmZvKGBVc2luZyBsb2NhbCBhcHAgJyR7bmV3QXBwfSdgKTtcbiAgICAgIHNob3VsZFVuemlwQXBwID0gWklQX0VYVFMuaW5jbHVkZXMocGF0aC5leHRuYW1lKG5ld0FwcCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZXJyb3JNZXNzYWdlID0gYFRoZSBhcHBsaWNhdGlvbiBhdCAnJHtuZXdBcHB9JyBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgYWNjZXNzaWJsZWA7XG4gICAgICAvLyBwcm90b2NvbCB2YWx1ZSBmb3IgJ0M6XFxcXHRlbXAnIGlzICdjOicsIHNvIHdlIGNoZWNrIHRoZSBsZW5ndGggYXMgd2VsbFxuICAgICAgaWYgKF8uaXNTdHJpbmcocHJvdG9jb2wpICYmIHByb3RvY29sLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgZXJyb3JNZXNzYWdlID0gYFRoZSBwcm90b2NvbCAnJHtwcm90b2NvbH0nIHVzZWQgaW4gJyR7bmV3QXBwfScgaXMgbm90IHN1cHBvcnRlZC4gYCArXG4gICAgICAgICAgYE9ubHkgaHR0cDogYW5kIGh0dHBzOiBwcm90b2NvbHMgYXJlIHN1cHBvcnRlZGA7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICB9XG5cbiAgICBjb25zdCBpc1BhY2thZ2VBRmlsZSA9IChhd2FpdCBmcy5zdGF0KG5ld0FwcCkpLmlzRmlsZSgpO1xuICAgIGlmIChpc1BhY2thZ2VBRmlsZSkge1xuICAgICAgcGFja2FnZUhhc2ggPSBhd2FpdCBjYWxjdWxhdGVGaWxlSW50ZWdyaXR5KG5ld0FwcCk7XG4gICAgfVxuXG4gICAgaWYgKGlzUGFja2FnZUFGaWxlICYmIHNob3VsZFVuemlwQXBwICYmICFfLmlzRnVuY3Rpb24ob25Qb3N0UHJvY2VzcykpIHtcbiAgICAgIGNvbnN0IGFyY2hpdmVQYXRoID0gbmV3QXBwO1xuICAgICAgaWYgKHBhY2thZ2VIYXNoID09PSBjYWNoZWRBcHBJbmZvPy5wYWNrYWdlSGFzaCkge1xuICAgICAgICBjb25zdCB7ZnVsbFBhdGh9ID0gY2FjaGVkQXBwSW5mbztcbiAgICAgICAgaWYgKGF3YWl0IGlzQXBwSW50ZWdyaXR5T2soZnVsbFBhdGgsIGNhY2hlZEFwcEluZm8/LmludGVncml0eSkpIHtcbiAgICAgICAgICBpZiAoYXJjaGl2ZVBhdGggIT09IGFwcCkge1xuICAgICAgICAgICAgYXdhaXQgZnMucmltcmFmKGFyY2hpdmVQYXRoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbG9nZ2VyLmluZm8oYFdpbGwgcmV1c2UgcHJldmlvdXNseSBjYWNoZWQgYXBwbGljYXRpb24gYXQgJyR7ZnVsbFBhdGh9J2ApO1xuICAgICAgICAgIHJldHVybiB2ZXJpZnlBcHBFeHRlbnNpb24oZnVsbFBhdGgsIHN1cHBvcnRlZEFwcEV4dGVuc2lvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGxvZ2dlci5pbmZvKGBUaGUgYXBwbGljYXRpb24gYXQgJyR7ZnVsbFBhdGh9JyBkb2VzIG5vdCBleGlzdCBhbnltb3JlIGAgK1xuICAgICAgICAgIGBvciBpdHMgaW50ZWdyaXR5IGhhcyBiZWVuIGRhbWFnZWQuIERlbGV0aW5nIGl0IGZyb20gdGhlIGNhY2hlYCk7XG4gICAgICAgIEFQUExJQ0FUSU9OU19DQUNIRS5kZWwoYXBwKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5ld0FwcCA9IGF3YWl0IHVuemlwQXBwKGFyY2hpdmVQYXRoLCB0bXBSb290LCBzdXBwb3J0ZWRBcHBFeHRlbnNpb25zKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChuZXdBcHAgIT09IGFyY2hpdmVQYXRoICYmIGFyY2hpdmVQYXRoICE9PSBhcHApIHtcbiAgICAgICAgICBhd2FpdCBmcy5yaW1yYWYoYXJjaGl2ZVBhdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsb2dnZXIuaW5mbyhgVW56aXBwZWQgbG9jYWwgYXBwIHRvICcke25ld0FwcH0nYCk7XG4gICAgfSBlbHNlIGlmICghcGF0aC5pc0Fic29sdXRlKG5ld0FwcCkpIHtcbiAgICAgIG5ld0FwcCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBuZXdBcHApO1xuICAgICAgbG9nZ2VyLndhcm4oYFRoZSBjdXJyZW50IGFwcGxpY2F0aW9uIHBhdGggJyR7YXBwfScgaXMgbm90IGFic29sdXRlIGAgK1xuICAgICAgICBgYW5kIGhhcyBiZWVuIHJld3JpdHRlbiB0byAnJHtuZXdBcHB9Jy4gQ29uc2lkZXIgdXNpbmcgYWJzb2x1dGUgcGF0aHMgcmF0aGVyIHRoYW4gcmVsYXRpdmVgKTtcbiAgICAgIGFwcCA9IG5ld0FwcDtcbiAgICB9XG5cbiAgICBjb25zdCBzdG9yZUFwcEluQ2FjaGUgPSBhc3luYyAoYXBwUGF0aFRvQ2FjaGUpID0+IHtcbiAgICAgIGNvbnN0IGNhY2hlZEZ1bGxQYXRoID0gY2FjaGVkQXBwSW5mbz8uZnVsbFBhdGg7XG4gICAgICBpZiAoY2FjaGVkRnVsbFBhdGggJiYgY2FjaGVkRnVsbFBhdGggIT09IGFwcFBhdGhUb0NhY2hlKSB7XG4gICAgICAgIGF3YWl0IGZzLnJpbXJhZihjYWNoZWRGdWxsUGF0aCk7XG4gICAgICB9XG4gICAgICBjb25zdCBpbnRlZ3JpdHkgPSB7fTtcbiAgICAgIGlmICgoYXdhaXQgZnMuc3RhdChhcHBQYXRoVG9DYWNoZSkpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgaW50ZWdyaXR5LmZvbGRlciA9IGF3YWl0IGNhbGN1bGF0ZUZvbGRlckludGVncml0eShhcHBQYXRoVG9DYWNoZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnRlZ3JpdHkuZmlsZSA9IGF3YWl0IGNhbGN1bGF0ZUZpbGVJbnRlZ3JpdHkoYXBwUGF0aFRvQ2FjaGUpO1xuICAgICAgfVxuICAgICAgQVBQTElDQVRJT05TX0NBQ0hFLnNldChhcHAsIHtcbiAgICAgICAgLi4ucmVtb3RlQXBwUHJvcHMsXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgcGFja2FnZUhhc2gsXG4gICAgICAgIGludGVncml0eSxcbiAgICAgICAgZnVsbFBhdGg6IGFwcFBhdGhUb0NhY2hlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gYXBwUGF0aFRvQ2FjaGU7XG4gICAgfTtcblxuICAgIGlmIChfLmlzRnVuY3Rpb24ob25Qb3N0UHJvY2VzcykpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG9uUG9zdFByb2Nlc3Moe1xuICAgICAgICBjYWNoZWRBcHBJbmZvOiBfLmNsb25lKGNhY2hlZEFwcEluZm8pLFxuICAgICAgICBpc1VybCxcbiAgICAgICAgaGVhZGVyczogXy5jbG9uZShoZWFkZXJzKSxcbiAgICAgICAgYXBwUGF0aDogbmV3QXBwLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gKCFyZXN1bHQ/LmFwcFBhdGggfHwgYXBwID09PSByZXN1bHQ/LmFwcFBhdGggfHwgIWF3YWl0IGZzLmV4aXN0cyhyZXN1bHQ/LmFwcFBhdGgpKVxuICAgICAgICA/IG5ld0FwcFxuICAgICAgICA6IGF3YWl0IHN0b3JlQXBwSW5DYWNoZShyZXN1bHQuYXBwUGF0aCk7XG4gICAgfVxuXG4gICAgdmVyaWZ5QXBwRXh0ZW5zaW9uKG5ld0FwcCwgc3VwcG9ydGVkQXBwRXh0ZW5zaW9ucyk7XG4gICAgcmV0dXJuIChhcHAgIT09IG5ld0FwcCAmJiAocGFja2FnZUhhc2ggfHwgXy52YWx1ZXMocmVtb3RlQXBwUHJvcHMpLnNvbWUoQm9vbGVhbikpKVxuICAgICAgPyBhd2FpdCBzdG9yZUFwcEluQ2FjaGUobmV3QXBwKVxuICAgICAgOiBuZXdBcHA7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkb3dubG9hZEFwcCAoYXBwLCB0YXJnZXRQYXRoKSB7XG4gIGNvbnN0IHtocmVmfSA9IHVybC5wYXJzZShhcHApO1xuICB0cnkge1xuICAgIGF3YWl0IG5ldC5kb3dubG9hZEZpbGUoaHJlZiwgdGFyZ2V0UGF0aCwge1xuICAgICAgdGltZW91dDogQVBQX0RPV05MT0FEX1RJTUVPVVRfTVMsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGRvd25sb2FkIHRoZSBhcHA6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gIH1cbiAgcmV0dXJuIHRhcmdldFBhdGg7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGJ1bmRsZSBmcm9tIGFuIGFyY2hpdmUgaW50byB0aGUgZ2l2ZW4gZm9sZGVyXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHppcFBhdGggRnVsbCBwYXRoIHRvIHRoZSBhcmNoaXZlIGNvbnRhaW5pbmcgdGhlIGJ1bmRsZVxuICogQHBhcmFtIHtzdHJpbmd9IGRzdFJvb3QgRnVsbCBwYXRoIHRvIHRoZSBmb2xkZXIgd2hlcmUgdGhlIGV4dHJhY3RlZCBidW5kbGVcbiAqIHNob3VsZCBiZSBwbGFjZWRcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPnxzdHJpbmd9IHN1cHBvcnRlZEFwcEV4dGVuc2lvbnMgVGhlIGxpc3Qgb2YgZXh0ZW5zaW9uc1xuICogdGhlIHRhcmdldCBhcHBsaWNhdGlvbiBidW5kbGUgc3VwcG9ydHMsIGZvciBleGFtcGxlIFsnLmFwaycsICcuYXBrcyddIGZvclxuICogQW5kcm9pZCBwYWNrYWdlc1xuICogQHJldHVybnMge3N0cmluZ30gRnVsbCBwYXRoIHRvIHRoZSBidW5kbGUgaW4gdGhlIGRlc3RpbmF0aW9uIGZvbGRlclxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBnaXZlbiBhcmNoaXZlIGlzIGludmFsaWQgb3Igbm8gYXBwbGljYXRpb24gYnVuZGxlc1xuICogaGF2ZSBiZWVuIGZvdW5kIGluc2lkZVxuICovXG5hc3luYyBmdW5jdGlvbiB1bnppcEFwcCAoemlwUGF0aCwgZHN0Um9vdCwgc3VwcG9ydGVkQXBwRXh0ZW5zaW9ucykge1xuICBhd2FpdCB6aXAuYXNzZXJ0VmFsaWRaaXAoemlwUGF0aCk7XG5cbiAgaWYgKCFfLmlzQXJyYXkoc3VwcG9ydGVkQXBwRXh0ZW5zaW9ucykpIHtcbiAgICBzdXBwb3J0ZWRBcHBFeHRlbnNpb25zID0gW3N1cHBvcnRlZEFwcEV4dGVuc2lvbnNdO1xuICB9XG5cbiAgY29uc3QgdG1wUm9vdCA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICB0cnkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgVW56aXBwaW5nICcke3ppcFBhdGh9J2ApO1xuICAgIGNvbnN0IHRpbWVyID0gbmV3IHRpbWluZy5UaW1lcigpLnN0YXJ0KCk7XG4gICAgY29uc3QgdXNlU3lzdGVtVW56aXBFbnYgPSBwcm9jZXNzLmVudi5BUFBJVU1fUFJFRkVSX1NZU1RFTV9VTlpJUDtcbiAgICBjb25zdCB1c2VTeXN0ZW1VbnppcCA9IF8uaXNFbXB0eSh1c2VTeXN0ZW1VbnppcEVudilcbiAgICAgIHx8ICFbJzAnLCAnZmFsc2UnXS5pbmNsdWRlcyhfLnRvTG93ZXIodXNlU3lzdGVtVW56aXBFbnYpKTtcbiAgICAvKipcbiAgICAgKiBBdHRlbXB0IHRvIHVzZSB1c2UgdGhlIHN5c3RlbSBgdW56aXBgIChlLmcuLCBgL3Vzci9iaW4vdW56aXBgKSBkdWVcbiAgICAgKiB0byB0aGUgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgaXQgcHJvdmlkZXMgb3ZlciB0aGUgbmF0aXZlXG4gICAgICogSlMgXCJ1bnppcFwiIGltcGxlbWVudGF0aW9uLlxuICAgICAqIEB0eXBlIHtpbXBvcnQoJ0BhcHBpdW0vc3VwcG9ydC9saWIvemlwJykuRXh0cmFjdEFsbE9wdGlvbnN9XG4gICAgICovXG4gICAgY29uc3QgZXh0cmFjdGlvbk9wdHMgPSB7dXNlU3lzdGVtVW56aXB9O1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy8xNDEwMFxuICAgIGlmIChwYXRoLmV4dG5hbWUoemlwUGF0aCkgPT09IElQQV9FWFQpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgRW5mb3JjaW5nIFVURi04IGVuY29kaW5nIG9uIHRoZSBleHRyYWN0ZWQgZmlsZSBuYW1lcyBmb3IgJyR7cGF0aC5iYXNlbmFtZSh6aXBQYXRoKX0nYCk7XG4gICAgICBleHRyYWN0aW9uT3B0cy5maWxlTmFtZXNFbmNvZGluZyA9ICd1dGY4JztcbiAgICB9XG4gICAgYXdhaXQgemlwLmV4dHJhY3RBbGxUbyh6aXBQYXRoLCB0bXBSb290LCBleHRyYWN0aW9uT3B0cyk7XG4gICAgY29uc3QgZ2xvYlBhdHRlcm4gPSBgKiovKi4rKCR7c3VwcG9ydGVkQXBwRXh0ZW5zaW9ucy5tYXAoKGV4dCkgPT4gZXh0LnJlcGxhY2UoL15cXC4vLCAnJykpLmpvaW4oJ3wnKX0pYDtcbiAgICBjb25zdCBzb3J0ZWRCdW5kbGVJdGVtcyA9IChhd2FpdCBmcy5nbG9iKGdsb2JQYXR0ZXJuLCB7XG4gICAgICBjd2Q6IHRtcFJvb3QsXG4gICAgICBzdHJpY3Q6IGZhbHNlLFxuICAgIC8vIEdldCB0aGUgdG9wIGxldmVsIG1hdGNoXG4gICAgfSkpLnNvcnQoKGEsIGIpID0+IGEuc3BsaXQocGF0aC5zZXApLmxlbmd0aCAtIGIuc3BsaXQocGF0aC5zZXApLmxlbmd0aCk7XG4gICAgaWYgKF8uaXNFbXB0eShzb3J0ZWRCdW5kbGVJdGVtcykpIHtcbiAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KGBBcHAgdW56aXBwZWQgT0ssIGJ1dCB3ZSBjb3VsZCBub3QgZmluZCBhbnkgJyR7c3VwcG9ydGVkQXBwRXh0ZW5zaW9uc30nIGAgK1xuICAgICAgICB1dGlsLnBsdXJhbGl6ZSgnYnVuZGxlJywgc3VwcG9ydGVkQXBwRXh0ZW5zaW9ucy5sZW5ndGgsIGZhbHNlKSArXG4gICAgICAgIGAgaW4gaXQuIE1ha2Ugc3VyZSB5b3VyIGFyY2hpdmUgY29udGFpbnMgYXQgbGVhc3Qgb25lIHBhY2thZ2UgaGF2aW5nIGAgK1xuICAgICAgICBgJyR7c3VwcG9ydGVkQXBwRXh0ZW5zaW9uc30nICR7dXRpbC5wbHVyYWxpemUoJ2V4dGVuc2lvbicsIHN1cHBvcnRlZEFwcEV4dGVuc2lvbnMubGVuZ3RoLCBmYWxzZSl9YCk7XG4gICAgfVxuICAgIGxvZ2dlci5kZWJ1ZyhgRXh0cmFjdGVkICR7dXRpbC5wbHVyYWxpemUoJ2J1bmRsZSBpdGVtJywgc29ydGVkQnVuZGxlSXRlbXMubGVuZ3RoLCB0cnVlKX0gYCArXG4gICAgICBgZnJvbSAnJHt6aXBQYXRofScgaW4gJHtNYXRoLnJvdW5kKHRpbWVyLmdldER1cmF0aW9uKCkuYXNNaWxsaVNlY29uZHMpfW1zOiAke3NvcnRlZEJ1bmRsZUl0ZW1zfWApO1xuICAgIGNvbnN0IG1hdGNoZWRCdW5kbGUgPSBfLmZpcnN0KHNvcnRlZEJ1bmRsZUl0ZW1zKTtcbiAgICBsb2dnZXIuaW5mbyhgQXNzdW1pbmcgJyR7bWF0Y2hlZEJ1bmRsZX0nIGlzIHRoZSBjb3JyZWN0IGJ1bmRsZWApO1xuICAgIGNvbnN0IGRzdFBhdGggPSBwYXRoLnJlc29sdmUoZHN0Um9vdCwgcGF0aC5iYXNlbmFtZShtYXRjaGVkQnVuZGxlKSk7XG4gICAgYXdhaXQgZnMubXYocGF0aC5yZXNvbHZlKHRtcFJvb3QsIG1hdGNoZWRCdW5kbGUpLCBkc3RQYXRoLCB7bWtkaXJwOiB0cnVlfSk7XG4gICAgcmV0dXJuIGRzdFBhdGg7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgZnMucmltcmFmKHRtcFJvb3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzUGFja2FnZU9yQnVuZGxlIChhcHApIHtcbiAgcmV0dXJuICgvXihbYS16QS1aMC05XFwtX10rXFwuW2EtekEtWjAtOVxcLV9dKykrJC8pLnRlc3QoYXBwKTtcbn1cblxuLyoqXG4gKiBGaW5kcyBhbGwgaW5zdGFuY2VzICdmaXJzdEtleScgYW5kIGNyZWF0ZSBhIGR1cGxpY2F0ZSB3aXRoIHRoZSBrZXkgJ3NlY29uZEtleScsXG4gKiBEbyB0aGUgc2FtZSB0aGluZyBpbiByZXZlcnNlLiBJZiB3ZSBmaW5kICdzZWNvbmRLZXknLCBjcmVhdGUgYSBkdXBsaWNhdGUgd2l0aCB0aGUga2V5ICdmaXJzdEtleScuXG4gKlxuICogVGhpcyB3aWxsIGNhdXNlIGtleXMgdG8gYmUgb3ZlcndyaXR0ZW4gaWYgdGhlIG9iamVjdCBjb250YWlucyAnZmlyc3RLZXknIGFuZCAnc2Vjb25kS2V5Jy5cblxuICogQHBhcmFtIHsqfSBpbnB1dCBBbnkgdHlwZSBvZiBpbnB1dFxuICogQHBhcmFtIHtTdHJpbmd9IGZpcnN0S2V5IFRoZSBmaXJzdCBrZXkgdG8gZHVwbGljYXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gc2Vjb25kS2V5IFRoZSBzZWNvbmQga2V5IHRvIGR1cGxpY2F0ZVxuICovXG5mdW5jdGlvbiBkdXBsaWNhdGVLZXlzIChpbnB1dCwgZmlyc3RLZXksIHNlY29uZEtleSkge1xuICAvLyBJZiBhcnJheSBwcm92aWRlZCwgcmVjdXJzaXZlbHkgY2FsbCBvbiBhbGwgZWxlbWVudHNcbiAgaWYgKF8uaXNBcnJheShpbnB1dCkpIHtcbiAgICByZXR1cm4gaW5wdXQubWFwKChpdGVtKSA9PiBkdXBsaWNhdGVLZXlzKGl0ZW0sIGZpcnN0S2V5LCBzZWNvbmRLZXkpKTtcbiAgfVxuXG4gIC8vIElmIG9iamVjdCwgY3JlYXRlIGR1cGxpY2F0ZXMgZm9yIGtleXMgYW5kIHRoZW4gcmVjdXJzaXZlbHkgY2FsbCBvbiB2YWx1ZXNcbiAgaWYgKF8uaXNQbGFpbk9iamVjdChpbnB1dCkpIHtcbiAgICBjb25zdCByZXN1bHRPYmogPSB7fTtcbiAgICBmb3IgKGxldCBba2V5LCB2YWx1ZV0gb2YgXy50b1BhaXJzKGlucHV0KSkge1xuICAgICAgY29uc3QgcmVjdXJzaXZlbHlDYWxsZWRWYWx1ZSA9IGR1cGxpY2F0ZUtleXModmFsdWUsIGZpcnN0S2V5LCBzZWNvbmRLZXkpO1xuICAgICAgaWYgKGtleSA9PT0gZmlyc3RLZXkpIHtcbiAgICAgICAgcmVzdWx0T2JqW3NlY29uZEtleV0gPSByZWN1cnNpdmVseUNhbGxlZFZhbHVlO1xuICAgICAgfSBlbHNlIGlmIChrZXkgPT09IHNlY29uZEtleSkge1xuICAgICAgICByZXN1bHRPYmpbZmlyc3RLZXldID0gcmVjdXJzaXZlbHlDYWxsZWRWYWx1ZTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdE9ialtrZXldID0gcmVjdXJzaXZlbHlDYWxsZWRWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdE9iajtcbiAgfVxuXG4gIC8vIEJhc2UgY2FzZS4gUmV0dXJuIHByaW1pdGl2ZXMgd2l0aG91dCBkb2luZyBhbnl0aGluZy5cbiAgcmV0dXJuIGlucHV0O1xufVxuXG4vKipcbiAqIFRha2VzIGEgZGVzaXJlZCBjYXBhYmlsaXR5IGFuZCB0cmllcyB0byBKU09OLnBhcnNlIGl0IGFzIGFuIGFycmF5LFxuICogYW5kIGVpdGhlciByZXR1cm5zIHRoZSBwYXJzZWQgYXJyYXkgb3IgYSBzaW5nbGV0b24gYXJyYXkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8QXJyYXk8U3RyaW5nPn0gY2FwIEEgZGVzaXJlZCBjYXBhYmlsaXR5XG4gKi9cbmZ1bmN0aW9uIHBhcnNlQ2Fwc0FycmF5IChjYXApIHtcbiAgaWYgKF8uaXNBcnJheShjYXApKSB7XG4gICAgcmV0dXJuIGNhcDtcbiAgfVxuXG4gIGxldCBwYXJzZWRDYXBzO1xuICB0cnkge1xuICAgIHBhcnNlZENhcHMgPSBKU09OLnBhcnNlKGNhcCk7XG4gICAgaWYgKF8uaXNBcnJheShwYXJzZWRDYXBzKSkge1xuICAgICAgcmV0dXJuIHBhcnNlZENhcHM7XG4gICAgfVxuICB9IGNhdGNoIChpZ24pIHtcbiAgICBsb2dnZXIud2FybihgRmFpbGVkIHRvIHBhcnNlIGNhcGFiaWxpdHkgYXMgSlNPTiBhcnJheWApO1xuICB9XG4gIGlmIChfLmlzU3RyaW5nKGNhcCkpIHtcbiAgICByZXR1cm4gW2NhcF07XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBtdXN0IHByb3ZpZGUgYSBzdHJpbmcgb3IgSlNPTiBBcnJheTsgcmVjZWl2ZWQgJHtjYXB9YCk7XG59XG5cbmV4cG9ydCB7XG4gIGNvbmZpZ3VyZUFwcCwgaXNQYWNrYWdlT3JCdW5kbGUsIGR1cGxpY2F0ZUtleXMsIHBhcnNlQ2Fwc0FycmF5XG59O1xuIl0sImZpbGUiOiJsaWIvYmFzZWRyaXZlci9oZWxwZXJzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
@@ -11,7 +11,7 @@ require("source-map-support/register");
11
11
 
12
12
  var _lodash = _interopRequireDefault(require("lodash"));
13
13
 
14
- require("colors");
14
+ require("@colors/colors");
15
15
 
16
16
  var _morgan = _interopRequireDefault(require("morgan"));
17
17
 
@@ -69,4 +69,4 @@ const startLogFormatter = (0, _morgan.default)((tokens, req, res) => {
69
69
  exports.startLogFormatter = startLogFormatter;require('source-map-support').install();
70
70
 
71
71
 
72
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9leHByZXNzL2V4cHJlc3MtbG9nZ2luZy5qcyJdLCJuYW1lcyI6WyJjb21waWxlIiwiZm10IiwicmVwbGFjZSIsIl8iLCJuYW1lIiwiYXJnIiwianMiLCJGdW5jdGlvbiIsInJlcXVlc3RFbmRMb2dnaW5nRm9ybWF0IiwidG9rZW5zIiwicmVxIiwicmVzIiwic3RhdHVzIiwic3RhdHVzQ29kZSIsInN0YXR1c1N0ciIsInJlZCIsInllbGxvdyIsImN5YW4iLCJncmVlbiIsImZuIiwid2hpdGUiLCJncmV5IiwiZW5kTG9nRm9ybWF0dGVyIiwibG9nIiwiaW5mbyIsImpzb25SZXNwIiwicmVxdWVzdFN0YXJ0TG9nZ2luZ0Zvcm1hdCIsInN0YXJ0TG9nRm9ybWF0dGVyIiwicmVxQm9keSIsImJvZHkiLCJ0cnVuY2F0ZSIsImlzU3RyaW5nIiwiSlNPTiIsInN0cmluZ2lmeSIsImxlbmd0aCIsIk1BWF9MT0dfQk9EWV9MRU5HVEgiLCJpZ24iLCJpbW1lZGlhdGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBS0EsU0FBU0EsT0FBVCxDQUFrQkMsR0FBbEIsRUFBdUI7QUFFckJBLEVBQUFBLEdBQUcsR0FBR0EsR0FBRyxDQUFDQyxPQUFKLENBQVksSUFBWixFQUFrQixLQUFsQixDQUFOO0FBQ0FELEVBQUFBLEdBQUcsR0FBR0EsR0FBRyxDQUFDQyxPQUFKLENBQVksZ0NBQVosRUFDSixTQUFTQSxPQUFULENBQWtCQyxDQUFsQixFQUFxQkMsSUFBckIsRUFBMkJDLEdBQTNCLEVBQWdDO0FBQzlCLFdBQVEscUJBQW9CRCxJQUFLLGlCQUFnQkMsR0FBSSxnQkFBckQ7QUFDRCxHQUhHLENBQU47QUFJQSxNQUFJQyxFQUFFLEdBQUksYUFBWUwsR0FBSSxJQUExQjtBQUNBLFNBQU8sSUFBSU0sUUFBSixDQUFhLGtCQUFiLEVBQWlDRCxFQUFqQyxDQUFQO0FBQ0Q7O0FBRUQsU0FBU0UsdUJBQVQsQ0FBa0NDLE1BQWxDLEVBQTBDQyxHQUExQyxFQUErQ0MsR0FBL0MsRUFBb0Q7QUFDbEQsTUFBSUMsTUFBTSxHQUFHRCxHQUFHLENBQUNFLFVBQWpCO0FBQ0EsTUFBSUMsU0FBUyxHQUFHLFNBQWhCOztBQUNBLE1BQUlGLE1BQU0sSUFBSSxHQUFkLEVBQW1CO0FBQ2pCRSxJQUFBQSxTQUFTLEdBQUdBLFNBQVMsQ0FBQ0MsR0FBdEI7QUFDRCxHQUZELE1BRU8sSUFBSUgsTUFBTSxJQUFJLEdBQWQsRUFBbUI7QUFDeEJFLElBQUFBLFNBQVMsR0FBR0EsU0FBUyxDQUFDRSxNQUF0QjtBQUNELEdBRk0sTUFFQSxJQUFJSixNQUFNLElBQUksR0FBZCxFQUFtQjtBQUN4QkUsSUFBQUEsU0FBUyxHQUFHQSxTQUFTLENBQUNHLElBQXRCO0FBQ0QsR0FGTSxNQUVBO0FBQ0xILElBQUFBLFNBQVMsR0FBR0EsU0FBUyxDQUFDSSxLQUF0QjtBQUNEOztBQUNELE1BQUlDLEVBQUUsR0FBR25CLE9BQU8sQ0FBRSxHQUFFLG9CQUFvQm9CLEtBQU0sR0FBRU4sU0FBVSxJQUFHLDJDQUEyQ08sSUFBSyxFQUE3RixDQUFoQjtBQUNBLFNBQU9GLEVBQUUsQ0FBQ1YsTUFBRCxFQUFTQyxHQUFULEVBQWNDLEdBQWQsQ0FBVDtBQUNEOztBQUVELE1BQU1XLGVBQWUsR0FBRyxxQkFBTyxDQUFDYixNQUFELEVBQVNDLEdBQVQsRUFBY0MsR0FBZCxLQUFzQjtBQUNuRFksa0JBQUlDLElBQUosQ0FBU2hCLHVCQUF1QixDQUFDQyxNQUFELEVBQVNDLEdBQVQsRUFBY0MsR0FBZCxDQUFoQyxFQUNFLENBQUNBLEdBQUcsQ0FBQ2MsUUFBSixJQUFnQixFQUFqQixFQUFxQkosSUFEdkI7QUFFRCxDQUh1QixDQUF4Qjs7QUFLQSxNQUFNSyx5QkFBeUIsR0FBRzFCLE9BQU8sQ0FBRSxHQUFFLE1BQU1vQixLQUFNLElBQUcsVUFBVUEsS0FBTSxJQUFHLE9BQU9BLEtBQU0sRUFBbkQsQ0FBekM7QUFFQSxNQUFNTyxpQkFBaUIsR0FBRyxxQkFBTyxDQUFDbEIsTUFBRCxFQUFTQyxHQUFULEVBQWNDLEdBQWQsS0FBc0I7QUFFckQsTUFBSWlCLE9BQU8sR0FBRyxFQUFkOztBQUNBLE1BQUlsQixHQUFHLENBQUNtQixJQUFSLEVBQWM7QUFDWixRQUFJO0FBQ0ZELE1BQUFBLE9BQU8sR0FBR3pCLGdCQUFFMkIsUUFBRixDQUFXM0IsZ0JBQUU0QixRQUFGLENBQVdyQixHQUFHLENBQUNtQixJQUFmLElBQXVCbkIsR0FBRyxDQUFDbUIsSUFBM0IsR0FBa0NHLElBQUksQ0FBQ0MsU0FBTCxDQUFldkIsR0FBRyxDQUFDbUIsSUFBbkIsQ0FBN0MsRUFBdUU7QUFDL0VLLFFBQUFBLE1BQU0sRUFBRUM7QUFEdUUsT0FBdkUsQ0FBVjtBQUdELEtBSkQsQ0FJRSxPQUFPQyxHQUFQLEVBQVksQ0FBRTtBQUNqQjs7QUFDRGIsa0JBQUlDLElBQUosQ0FBU0UseUJBQXlCLENBQUNqQixNQUFELEVBQVNDLEdBQVQsRUFBY0MsR0FBZCxDQUFsQyxFQUFzRGlCLE9BQU8sQ0FBQ1AsSUFBOUQ7QUFDRCxDQVh5QixFQVd2QjtBQUFDZ0IsRUFBQUEsU0FBUyxFQUFFO0FBQVosQ0FYdUIsQ0FBMUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0ICdjb2xvcnMnO1xuaW1wb3J0IG1vcmdhbiBmcm9tICdtb3JnYW4nO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgeyBNQVhfTE9HX0JPRFlfTEVOR1RIIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcblxuXG4vLyBDb3BpZWQgdGhlIG1vcmdhbiBjb21waWxlIGZ1bmN0aW9uIG92ZXIgc28gdGhhdCBjb29sZXIgZm9ybWF0c1xuLy8gbWF5IGJlIGNvbmZpZ3VyZWRcbmZ1bmN0aW9uIGNvbXBpbGUgKGZtdCkge1xuICAvLyBlc2NhcGUgcXVvdGVzXG4gIGZtdCA9IGZtdC5yZXBsYWNlKC9cIi9nLCAnXFxcXFwiJyk7XG4gIGZtdCA9IGZtdC5yZXBsYWNlKC86KFstXFx3XXsyLH0pKD86XFxbKFteXFxdXSspXFxdKT8vZyxcbiAgICBmdW5jdGlvbiByZXBsYWNlIChfLCBuYW1lLCBhcmcpIHtcbiAgICAgIHJldHVybiBgXCJcXG4gICAgKyAodG9rZW5zW1wiJHtuYW1lfVwiXShyZXEsIHJlcywgXCIke2FyZ31cIikgfHwgXCItXCIpICsgXCJgO1xuICAgIH0pO1xuICBsZXQganMgPSBgICByZXR1cm4gXCIke2ZtdH1cIjtgO1xuICByZXR1cm4gbmV3IEZ1bmN0aW9uKCd0b2tlbnMsIHJlcSwgcmVzJywganMpO1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0RW5kTG9nZ2luZ0Zvcm1hdCAodG9rZW5zLCByZXEsIHJlcykge1xuICBsZXQgc3RhdHVzID0gcmVzLnN0YXR1c0NvZGU7XG4gIGxldCBzdGF0dXNTdHIgPSAnOnN0YXR1cyc7XG4gIGlmIChzdGF0dXMgPj0gNTAwKSB7XG4gICAgc3RhdHVzU3RyID0gc3RhdHVzU3RyLnJlZDtcbiAgfSBlbHNlIGlmIChzdGF0dXMgPj0gNDAwKSB7XG4gICAgc3RhdHVzU3RyID0gc3RhdHVzU3RyLnllbGxvdztcbiAgfSBlbHNlIGlmIChzdGF0dXMgPj0gMzAwKSB7XG4gICAgc3RhdHVzU3RyID0gc3RhdHVzU3RyLmN5YW47XG4gIH0gZWxzZSB7XG4gICAgc3RhdHVzU3RyID0gc3RhdHVzU3RyLmdyZWVuO1xuICB9XG4gIGxldCBmbiA9IGNvbXBpbGUoYCR7JzwtLSA6bWV0aG9kIDp1cmwgJy53aGl0ZX0ke3N0YXR1c1N0cn0gJHsnOnJlc3BvbnNlLXRpbWUgbXMgLSA6cmVzW2NvbnRlbnQtbGVuZ3RoXScuZ3JleX1gKTtcbiAgcmV0dXJuIGZuKHRva2VucywgcmVxLCByZXMpO1xufVxuXG5jb25zdCBlbmRMb2dGb3JtYXR0ZXIgPSBtb3JnYW4oKHRva2VucywgcmVxLCByZXMpID0+IHtcbiAgbG9nLmluZm8ocmVxdWVzdEVuZExvZ2dpbmdGb3JtYXQodG9rZW5zLCByZXEsIHJlcyksXG4gICAgKHJlcy5qc29uUmVzcCB8fCAnJykuZ3JleSk7XG59KTtcblxuY29uc3QgcmVxdWVzdFN0YXJ0TG9nZ2luZ0Zvcm1hdCA9IGNvbXBpbGUoYCR7Jy0tPicud2hpdGV9ICR7JzptZXRob2QnLndoaXRlfSAkeyc6dXJsJy53aGl0ZX1gKTtcblxuY29uc3Qgc3RhcnRMb2dGb3JtYXR0ZXIgPSBtb3JnYW4oKHRva2VucywgcmVxLCByZXMpID0+IHtcbiAgLy8gbW9yZ2FuIG91dHB1dCBpcyByZWRpcmVjdGVkIHN0cmFpZ2h0IHRvIHdpbnN0b25cbiAgbGV0IHJlcUJvZHkgPSAnJztcbiAgaWYgKHJlcS5ib2R5KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlcUJvZHkgPSBfLnRydW5jYXRlKF8uaXNTdHJpbmcocmVxLmJvZHkpID8gcmVxLmJvZHkgOiBKU09OLnN0cmluZ2lmeShyZXEuYm9keSksIHtcbiAgICAgICAgbGVuZ3RoOiBNQVhfTE9HX0JPRFlfTEVOR1RILFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoaWduKSB7fVxuICB9XG4gIGxvZy5pbmZvKHJlcXVlc3RTdGFydExvZ2dpbmdGb3JtYXQodG9rZW5zLCByZXEsIHJlcyksIHJlcUJvZHkuZ3JleSk7XG59LCB7aW1tZWRpYXRlOiB0cnVlfSk7XG5cbmV4cG9ydCB7IGVuZExvZ0Zvcm1hdHRlciwgc3RhcnRMb2dGb3JtYXR0ZXIgfTtcbiJdLCJmaWxlIjoibGliL2V4cHJlc3MvZXhwcmVzcy1sb2dnaW5nLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
72
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9leHByZXNzL2V4cHJlc3MtbG9nZ2luZy5qcyJdLCJuYW1lcyI6WyJjb21waWxlIiwiZm10IiwicmVwbGFjZSIsIl8iLCJuYW1lIiwiYXJnIiwianMiLCJGdW5jdGlvbiIsInJlcXVlc3RFbmRMb2dnaW5nRm9ybWF0IiwidG9rZW5zIiwicmVxIiwicmVzIiwic3RhdHVzIiwic3RhdHVzQ29kZSIsInN0YXR1c1N0ciIsInJlZCIsInllbGxvdyIsImN5YW4iLCJncmVlbiIsImZuIiwid2hpdGUiLCJncmV5IiwiZW5kTG9nRm9ybWF0dGVyIiwibG9nIiwiaW5mbyIsImpzb25SZXNwIiwicmVxdWVzdFN0YXJ0TG9nZ2luZ0Zvcm1hdCIsInN0YXJ0TG9nRm9ybWF0dGVyIiwicmVxQm9keSIsImJvZHkiLCJ0cnVuY2F0ZSIsImlzU3RyaW5nIiwiSlNPTiIsInN0cmluZ2lmeSIsImxlbmd0aCIsIk1BWF9MT0dfQk9EWV9MRU5HVEgiLCJpZ24iLCJpbW1lZGlhdGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBS0EsU0FBU0EsT0FBVCxDQUFrQkMsR0FBbEIsRUFBdUI7QUFFckJBLEVBQUFBLEdBQUcsR0FBR0EsR0FBRyxDQUFDQyxPQUFKLENBQVksSUFBWixFQUFrQixLQUFsQixDQUFOO0FBQ0FELEVBQUFBLEdBQUcsR0FBR0EsR0FBRyxDQUFDQyxPQUFKLENBQVksZ0NBQVosRUFDSixTQUFTQSxPQUFULENBQWtCQyxDQUFsQixFQUFxQkMsSUFBckIsRUFBMkJDLEdBQTNCLEVBQWdDO0FBQzlCLFdBQVEscUJBQW9CRCxJQUFLLGlCQUFnQkMsR0FBSSxnQkFBckQ7QUFDRCxHQUhHLENBQU47QUFJQSxNQUFJQyxFQUFFLEdBQUksYUFBWUwsR0FBSSxJQUExQjtBQUNBLFNBQU8sSUFBSU0sUUFBSixDQUFhLGtCQUFiLEVBQWlDRCxFQUFqQyxDQUFQO0FBQ0Q7O0FBRUQsU0FBU0UsdUJBQVQsQ0FBa0NDLE1BQWxDLEVBQTBDQyxHQUExQyxFQUErQ0MsR0FBL0MsRUFBb0Q7QUFDbEQsTUFBSUMsTUFBTSxHQUFHRCxHQUFHLENBQUNFLFVBQWpCO0FBQ0EsTUFBSUMsU0FBUyxHQUFHLFNBQWhCOztBQUNBLE1BQUlGLE1BQU0sSUFBSSxHQUFkLEVBQW1CO0FBQ2pCRSxJQUFBQSxTQUFTLEdBQUdBLFNBQVMsQ0FBQ0MsR0FBdEI7QUFDRCxHQUZELE1BRU8sSUFBSUgsTUFBTSxJQUFJLEdBQWQsRUFBbUI7QUFDeEJFLElBQUFBLFNBQVMsR0FBR0EsU0FBUyxDQUFDRSxNQUF0QjtBQUNELEdBRk0sTUFFQSxJQUFJSixNQUFNLElBQUksR0FBZCxFQUFtQjtBQUN4QkUsSUFBQUEsU0FBUyxHQUFHQSxTQUFTLENBQUNHLElBQXRCO0FBQ0QsR0FGTSxNQUVBO0FBQ0xILElBQUFBLFNBQVMsR0FBR0EsU0FBUyxDQUFDSSxLQUF0QjtBQUNEOztBQUNELE1BQUlDLEVBQUUsR0FBR25CLE9BQU8sQ0FBRSxHQUFFLG9CQUFvQm9CLEtBQU0sR0FBRU4sU0FBVSxJQUFHLDJDQUEyQ08sSUFBSyxFQUE3RixDQUFoQjtBQUNBLFNBQU9GLEVBQUUsQ0FBQ1YsTUFBRCxFQUFTQyxHQUFULEVBQWNDLEdBQWQsQ0FBVDtBQUNEOztBQUVELE1BQU1XLGVBQWUsR0FBRyxxQkFBTyxDQUFDYixNQUFELEVBQVNDLEdBQVQsRUFBY0MsR0FBZCxLQUFzQjtBQUNuRFksa0JBQUlDLElBQUosQ0FBU2hCLHVCQUF1QixDQUFDQyxNQUFELEVBQVNDLEdBQVQsRUFBY0MsR0FBZCxDQUFoQyxFQUNFLENBQUNBLEdBQUcsQ0FBQ2MsUUFBSixJQUFnQixFQUFqQixFQUFxQkosSUFEdkI7QUFFRCxDQUh1QixDQUF4Qjs7QUFLQSxNQUFNSyx5QkFBeUIsR0FBRzFCLE9BQU8sQ0FBRSxHQUFFLE1BQU1vQixLQUFNLElBQUcsVUFBVUEsS0FBTSxJQUFHLE9BQU9BLEtBQU0sRUFBbkQsQ0FBekM7QUFFQSxNQUFNTyxpQkFBaUIsR0FBRyxxQkFBTyxDQUFDbEIsTUFBRCxFQUFTQyxHQUFULEVBQWNDLEdBQWQsS0FBc0I7QUFFckQsTUFBSWlCLE9BQU8sR0FBRyxFQUFkOztBQUNBLE1BQUlsQixHQUFHLENBQUNtQixJQUFSLEVBQWM7QUFDWixRQUFJO0FBQ0ZELE1BQUFBLE9BQU8sR0FBR3pCLGdCQUFFMkIsUUFBRixDQUFXM0IsZ0JBQUU0QixRQUFGLENBQVdyQixHQUFHLENBQUNtQixJQUFmLElBQXVCbkIsR0FBRyxDQUFDbUIsSUFBM0IsR0FBa0NHLElBQUksQ0FBQ0MsU0FBTCxDQUFldkIsR0FBRyxDQUFDbUIsSUFBbkIsQ0FBN0MsRUFBdUU7QUFDL0VLLFFBQUFBLE1BQU0sRUFBRUM7QUFEdUUsT0FBdkUsQ0FBVjtBQUdELEtBSkQsQ0FJRSxPQUFPQyxHQUFQLEVBQVksQ0FBRTtBQUNqQjs7QUFDRGIsa0JBQUlDLElBQUosQ0FBU0UseUJBQXlCLENBQUNqQixNQUFELEVBQVNDLEdBQVQsRUFBY0MsR0FBZCxDQUFsQyxFQUFzRGlCLE9BQU8sQ0FBQ1AsSUFBOUQ7QUFDRCxDQVh5QixFQVd2QjtBQUFDZ0IsRUFBQUEsU0FBUyxFQUFFO0FBQVosQ0FYdUIsQ0FBMUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0ICdAY29sb3JzL2NvbG9ycyc7XG5pbXBvcnQgbW9yZ2FuIGZyb20gJ21vcmdhbic7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCB7IE1BWF9MT0dfQk9EWV9MRU5HVEggfSBmcm9tICcuLi9jb25zdGFudHMnO1xuXG5cbi8vIENvcGllZCB0aGUgbW9yZ2FuIGNvbXBpbGUgZnVuY3Rpb24gb3ZlciBzbyB0aGF0IGNvb2xlciBmb3JtYXRzXG4vLyBtYXkgYmUgY29uZmlndXJlZFxuZnVuY3Rpb24gY29tcGlsZSAoZm10KSB7XG4gIC8vIGVzY2FwZSBxdW90ZXNcbiAgZm10ID0gZm10LnJlcGxhY2UoL1wiL2csICdcXFxcXCInKTtcbiAgZm10ID0gZm10LnJlcGxhY2UoLzooWy1cXHddezIsfSkoPzpcXFsoW15cXF1dKylcXF0pPy9nLFxuICAgIGZ1bmN0aW9uIHJlcGxhY2UgKF8sIG5hbWUsIGFyZykge1xuICAgICAgcmV0dXJuIGBcIlxcbiAgICArICh0b2tlbnNbXCIke25hbWV9XCJdKHJlcSwgcmVzLCBcIiR7YXJnfVwiKSB8fCBcIi1cIikgKyBcImA7XG4gICAgfSk7XG4gIGxldCBqcyA9IGAgIHJldHVybiBcIiR7Zm10fVwiO2A7XG4gIHJldHVybiBuZXcgRnVuY3Rpb24oJ3Rva2VucywgcmVxLCByZXMnLCBqcyk7XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RFbmRMb2dnaW5nRm9ybWF0ICh0b2tlbnMsIHJlcSwgcmVzKSB7XG4gIGxldCBzdGF0dXMgPSByZXMuc3RhdHVzQ29kZTtcbiAgbGV0IHN0YXR1c1N0ciA9ICc6c3RhdHVzJztcbiAgaWYgKHN0YXR1cyA+PSA1MDApIHtcbiAgICBzdGF0dXNTdHIgPSBzdGF0dXNTdHIucmVkO1xuICB9IGVsc2UgaWYgKHN0YXR1cyA+PSA0MDApIHtcbiAgICBzdGF0dXNTdHIgPSBzdGF0dXNTdHIueWVsbG93O1xuICB9IGVsc2UgaWYgKHN0YXR1cyA+PSAzMDApIHtcbiAgICBzdGF0dXNTdHIgPSBzdGF0dXNTdHIuY3lhbjtcbiAgfSBlbHNlIHtcbiAgICBzdGF0dXNTdHIgPSBzdGF0dXNTdHIuZ3JlZW47XG4gIH1cbiAgbGV0IGZuID0gY29tcGlsZShgJHsnPC0tIDptZXRob2QgOnVybCAnLndoaXRlfSR7c3RhdHVzU3RyfSAkeyc6cmVzcG9uc2UtdGltZSBtcyAtIDpyZXNbY29udGVudC1sZW5ndGhdJy5ncmV5fWApO1xuICByZXR1cm4gZm4odG9rZW5zLCByZXEsIHJlcyk7XG59XG5cbmNvbnN0IGVuZExvZ0Zvcm1hdHRlciA9IG1vcmdhbigodG9rZW5zLCByZXEsIHJlcykgPT4ge1xuICBsb2cuaW5mbyhyZXF1ZXN0RW5kTG9nZ2luZ0Zvcm1hdCh0b2tlbnMsIHJlcSwgcmVzKSxcbiAgICAocmVzLmpzb25SZXNwIHx8ICcnKS5ncmV5KTtcbn0pO1xuXG5jb25zdCByZXF1ZXN0U3RhcnRMb2dnaW5nRm9ybWF0ID0gY29tcGlsZShgJHsnLS0+Jy53aGl0ZX0gJHsnOm1ldGhvZCcud2hpdGV9ICR7Jzp1cmwnLndoaXRlfWApO1xuXG5jb25zdCBzdGFydExvZ0Zvcm1hdHRlciA9IG1vcmdhbigodG9rZW5zLCByZXEsIHJlcykgPT4ge1xuICAvLyBtb3JnYW4gb3V0cHV0IGlzIHJlZGlyZWN0ZWQgc3RyYWlnaHQgdG8gd2luc3RvblxuICBsZXQgcmVxQm9keSA9ICcnO1xuICBpZiAocmVxLmJvZHkpIHtcbiAgICB0cnkge1xuICAgICAgcmVxQm9keSA9IF8udHJ1bmNhdGUoXy5pc1N0cmluZyhyZXEuYm9keSkgPyByZXEuYm9keSA6IEpTT04uc3RyaW5naWZ5KHJlcS5ib2R5KSwge1xuICAgICAgICBsZW5ndGg6IE1BWF9MT0dfQk9EWV9MRU5HVEgsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChpZ24pIHt9XG4gIH1cbiAgbG9nLmluZm8ocmVxdWVzdFN0YXJ0TG9nZ2luZ0Zvcm1hdCh0b2tlbnMsIHJlcSwgcmVzKSwgcmVxQm9keS5ncmV5KTtcbn0sIHtpbW1lZGlhdGU6IHRydWV9KTtcblxuZXhwb3J0IHsgZW5kTG9nRm9ybWF0dGVyLCBzdGFydExvZ0Zvcm1hdHRlciB9O1xuIl0sImZpbGUiOiJsaWIvZXhwcmVzcy9leHByZXNzLWxvZ2dpbmcuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==