helpers.js
86.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getAndroidPlatformAndPath = getAndroidPlatformAndPath;
exports.unzipFile = unzipFile;
exports.getIMEListFromOutput = getIMEListFromOutput;
exports.isShowingLockscreen = isShowingLockscreen;
exports.isCurrentFocusOnKeyguard = isCurrentFocusOnKeyguard;
exports.getSurfaceOrientation = getSurfaceOrientation;
exports.isScreenOnFully = isScreenOnFully;
exports.buildStartCmd = buildStartCmd;
exports.getApksignerForOs = getApksignerForOs;
exports.getApkanalyzerForOs = getApkanalyzerForOs;
exports.buildInstallArgs = buildInstallArgs;
exports.parseManifest = parseManifest;
exports.parseAaptStrings = parseAaptStrings;
exports.parseAapt2Strings = parseAapt2Strings;
exports.formatConfigMarker = formatConfigMarker;
exports.parseJsonData = parseJsonData;
exports.unsignApk = unsignApk;
exports.DEFAULT_ADB_EXEC_TIMEOUT = exports.APK_EXTENSION = exports.APKS_INSTALL_TIMEOUT = exports.APK_INSTALL_TIMEOUT = exports.APKS_EXTENSION = exports.extractMatchingPermissions = exports.getOpenSslForOs = exports.getBuildToolsDirs = exports.getSdkToolsVersion = exports.rootDir = exports.getJavaHome = exports.getJavaForOs = void 0;
require("source-map-support/register");
var _path = _interopRequireDefault(require("path"));
var _appiumSupport = require("appium-support");
var _logger = _interopRequireDefault(require("./logger.js"));
var _lodash = _interopRequireDefault(require("lodash"));
var _bluebird = _interopRequireDefault(require("bluebird"));
var _semver = _interopRequireDefault(require("semver"));
var _os = _interopRequireDefault(require("os"));
const rootDir = _path.default.resolve(__dirname, process.env.NO_PRECOMPILE ? '..' : '../..');
exports.rootDir = rootDir;
const APKS_EXTENSION = '.apks';
exports.APKS_EXTENSION = APKS_EXTENSION;
const APK_EXTENSION = '.apk';
exports.APK_EXTENSION = APK_EXTENSION;
const APK_INSTALL_TIMEOUT = 60000;
exports.APK_INSTALL_TIMEOUT = APK_INSTALL_TIMEOUT;
const APKS_INSTALL_TIMEOUT = APK_INSTALL_TIMEOUT * 2;
exports.APKS_INSTALL_TIMEOUT = APKS_INSTALL_TIMEOUT;
const DEFAULT_ADB_EXEC_TIMEOUT = 20000;
exports.DEFAULT_ADB_EXEC_TIMEOUT = DEFAULT_ADB_EXEC_TIMEOUT;
async function getAndroidPlatformAndPath() {
const sdkRoot = process.env.ANDROID_HOME || process.env.ANDROID_SDK_ROOT;
if (_lodash.default.isEmpty(sdkRoot)) {
throw new Error('Neither ANDROID_HOME nor ANDROID_SDK_ROOT environment variable was exported');
}
const propsPaths = await _appiumSupport.fs.glob('*/build.prop', {
cwd: _path.default.resolve(sdkRoot, 'platforms'),
absolute: true
});
const platformsMapping = {};
for (const propsPath of propsPaths) {
const propsContent = await _appiumSupport.fs.readFile(propsPath, 'utf-8');
const platformPath = _path.default.dirname(propsPath);
const platform = _path.default.basename(platformPath);
const match = /ro\.build\.version\.sdk=(\d+)/.exec(propsContent);
if (!match) {
_logger.default.warn(`Cannot read the SDK version from '${propsPath}'. Skipping '${platform}'`);
continue;
}
platformsMapping[parseInt(match[1], 10)] = {
platform,
platformPath
};
}
if (_lodash.default.isEmpty(platformsMapping)) {
_logger.default.warn(`Found zero platform folders at '${_path.default.resolve(sdkRoot, 'platforms')}'. ` + `Do you have any Android SDKs installed?`);
return {
platform: null,
platformPath: null
};
}
const recentSdkVersion = _lodash.default.keys(platformsMapping).sort().reverse()[0];
const result = platformsMapping[recentSdkVersion];
_logger.default.debug(`Found the most recent Android platform: ${JSON.stringify(result)}`);
return result;
}
async function unzipFile(zipPath, dstRoot = _path.default.dirname(zipPath)) {
_logger.default.debug(`Unzipping '${zipPath}' to '${dstRoot}'`);
await _appiumSupport.zip.assertValidZip(zipPath);
await _appiumSupport.zip.extractAllTo(zipPath, dstRoot);
_logger.default.debug('Unzip successful');
}
async function unsignApk(apkPath) {
const tmpRoot = await _appiumSupport.tempDir.openDir();
const metaInfFolderName = 'META-INF';
try {
let hasMetaInf = false;
await _appiumSupport.zip.readEntries(apkPath, ({
entry
}) => {
hasMetaInf = entry.fileName.startsWith(`${metaInfFolderName}/`);
return !hasMetaInf;
});
if (!hasMetaInf) {
return false;
}
const tmpZipRoot = _path.default.resolve(tmpRoot, 'apk');
await _appiumSupport.zip.extractAllTo(apkPath, tmpZipRoot);
await _appiumSupport.fs.rimraf(_path.default.resolve(tmpZipRoot, metaInfFolderName));
const tmpResultPath = _path.default.resolve(tmpRoot, _path.default.basename(apkPath));
await _appiumSupport.zip.toArchive(tmpResultPath, {
cwd: tmpZipRoot
});
await _appiumSupport.fs.unlink(apkPath);
await _appiumSupport.fs.mv(tmpResultPath, apkPath);
return true;
} finally {
await _appiumSupport.fs.rimraf(tmpRoot);
}
}
function getIMEListFromOutput(stdout) {
let engines = [];
for (let line of stdout.split('\n')) {
if (line.length > 0 && line[0] !== ' ') {
engines.push(line.trim().replace(/:$/, ''));
}
}
return engines;
}
const getJavaHome = _lodash.default.memoize(async function getJavaHome() {
const result = process.env.JAVA_HOME;
if (!result) {
throw new Error('The JAVA_HOME environment variable must be set for Android Tools to work properly');
}
if (!(await _appiumSupport.fs.exists(result))) {
throw new Error(`The JAVA_HOME location '${result}' must exist`);
}
const stats = await _appiumSupport.fs.stat(result);
if (!stats.isDirectory()) {
throw new Error(`The JAVA_HOME location '${result}' must be a valid folder`);
}
return result;
});
exports.getJavaHome = getJavaHome;
const getJavaForOs = _lodash.default.memoize(async function getJavaForOs() {
return _path.default.resolve(await getJavaHome(), 'bin', `java${_appiumSupport.system.isWindows() ? '.exe' : ''}`);
});
exports.getJavaForOs = getJavaForOs;
const getOpenSslForOs = async function () {
const binaryName = `openssl${_appiumSupport.system.isWindows() ? '.exe' : ''}`;
try {
return await _appiumSupport.fs.which(binaryName);
} catch (err) {
throw new Error('The openssl tool must be installed on the system and available on the path');
}
};
exports.getOpenSslForOs = getOpenSslForOs;
async function getApksignerForOs(sysHelpers) {
return await sysHelpers.getBinaryFromSdkRoot('apksigner.jar');
}
async function getApkanalyzerForOs(sysHelpers) {
return await sysHelpers.getBinaryFromSdkRoot('apkanalyzer');
}
function isShowingLockscreen(dumpsys) {
return /(mShowingLockscreen=true|mDreamingLockscreen=true)/gi.test(dumpsys);
}
function isCurrentFocusOnKeyguard(dumpsys) {
let m = /mCurrentFocus.+Keyguard/gi.exec(dumpsys);
return m && m.length && m[0] ? true : false;
}
function getSurfaceOrientation(dumpsys) {
let m = /SurfaceOrientation: \d/gi.exec(dumpsys);
return m && parseInt(m[0].split(':')[1], 10);
}
function isScreenOnFully(dumpsys) {
let m = /mScreenOnFully=\w+/gi.exec(dumpsys);
return !m || m && m.length > 0 && m[0].split('=')[1] === 'true' || false;
}
function buildStartCmd(startAppOptions, apiLevel) {
const {
user,
waitForLaunch,
pkg,
activity,
action,
category,
stopApp,
flags
} = startAppOptions;
const cmd = ['am', 'start'];
if (_appiumSupport.util.hasValue(user)) {
cmd.push('--user', user);
}
if (waitForLaunch) {
cmd.push('-W');
}
if (activity && pkg) {
cmd.push('-n', `${pkg}/${activity}`);
}
if (stopApp && apiLevel >= 15) {
cmd.push('-S');
}
if (action) {
cmd.push('-a', action);
}
if (category) {
cmd.push('-c', category);
}
if (flags) {
cmd.push('-f', flags);
}
if (startAppOptions.optionalIntentArguments) {
let parseKeyValue = function (str) {
str = str.trim();
let space = str.indexOf(' ');
if (space === -1) {
return str.length ? [str] : [];
} else {
return [str.substring(0, space).trim(), str.substring(space + 1).trim()];
}
};
let optionalIntentArguments = ` ${startAppOptions.optionalIntentArguments}`;
let re = / (-[^\s]+) (.+)/;
while (true) {
let args = re.exec(optionalIntentArguments);
if (!args) {
if (optionalIntentArguments.length) {
cmd.push.apply(cmd, parseKeyValue(optionalIntentArguments));
}
break;
}
let flag = args[1];
let flagPos = optionalIntentArguments.indexOf(flag);
if (flagPos !== 0) {
let prevArgs = optionalIntentArguments.substring(0, flagPos);
cmd.push.apply(cmd, parseKeyValue(prevArgs));
}
cmd.push(flag);
optionalIntentArguments = args[2];
}
}
return cmd;
}
const getSdkToolsVersion = _lodash.default.memoize(async function getSdkToolsVersion() {
const androidHome = process.env.ANDROID_HOME;
if (!androidHome) {
throw new Error('ANDROID_HOME environment variable is expected to be set');
}
const propertiesPath = _path.default.resolve(androidHome, 'tools', 'source.properties');
if (!(await _appiumSupport.fs.exists(propertiesPath))) {
_logger.default.warn(`Cannot find ${propertiesPath} file to read SDK version from`);
return;
}
const propertiesContent = await _appiumSupport.fs.readFile(propertiesPath, 'utf8');
const versionMatcher = new RegExp(/Pkg\.Revision=(\d+)\.?(\d+)?\.?(\d+)?/);
const match = versionMatcher.exec(propertiesContent);
if (match) {
return {
major: parseInt(match[1], 10),
minor: match[2] ? parseInt(match[2], 10) : 0,
build: match[3] ? parseInt(match[3], 10) : 0
};
}
_logger.default.warn(`Cannot parse "Pkg.Revision" value from ${propertiesPath}`);
});
exports.getSdkToolsVersion = getSdkToolsVersion;
const getBuildToolsDirs = _lodash.default.memoize(async function getBuildToolsDirs(sdkRoot) {
let buildToolsDirs = await _appiumSupport.fs.glob('*/', {
cwd: _path.default.resolve(sdkRoot, 'build-tools'),
absolute: true
});
try {
buildToolsDirs = buildToolsDirs.map(dir => [_path.default.basename(dir), dir]).sort((a, b) => _semver.default.rcompare(a[0], b[0])).map(pair => pair[1]);
} catch (err) {
_logger.default.warn(`Cannot sort build-tools folders ${JSON.stringify(buildToolsDirs.map(dir => _path.default.basename(dir)))} ` + `by semantic version names.`);
_logger.default.warn(`Falling back to sorting by modification date. Original error: ${err.message}`);
const pairs = await _bluebird.default.map(buildToolsDirs, async dir => [(await _appiumSupport.fs.stat(dir)).mtime.valueOf(), dir]);
buildToolsDirs = pairs.sort((a, b) => a[0] < b[0]).map(pair => pair[1]);
}
_logger.default.info(`Found ${buildToolsDirs.length} 'build-tools' folders under '${sdkRoot}' (newest first):`);
for (let dir of buildToolsDirs) {
_logger.default.info(` ${dir}`);
}
return buildToolsDirs;
});
exports.getBuildToolsDirs = getBuildToolsDirs;
const extractMatchingPermissions = function (dumpsysOutput, groupNames, grantedState = null) {
const groupPatternByName = groupName => new RegExp(`^(\\s*${_lodash.default.escapeRegExp(groupName)} permissions:[\\s\\S]+)`, 'm');
const indentPattern = /\S|$/;
const permissionNamePattern = /android\.\w*\.?permission\.\w+/;
const grantedStatePattern = /\bgranted=(\w+)/;
const result = [];
for (const groupName of groupNames) {
const groupMatch = groupPatternByName(groupName).exec(dumpsysOutput);
if (!groupMatch) {
continue;
}
const lines = groupMatch[1].split('\n');
if (lines.length < 2) {
continue;
}
const titleIndent = lines[0].search(indentPattern);
for (const line of lines.slice(1)) {
const currentIndent = line.search(indentPattern);
if (currentIndent <= titleIndent) {
break;
}
const permissionNameMatch = permissionNamePattern.exec(line);
if (!permissionNameMatch) {
continue;
}
const item = {
permission: permissionNameMatch[0]
};
const grantedStateMatch = grantedStatePattern.exec(line);
if (grantedStateMatch) {
item.granted = grantedStateMatch[1] === 'true';
}
result.push(item);
}
}
const filteredResult = result.filter(item => !_lodash.default.isBoolean(grantedState) || item.granted === grantedState).map(item => item.permission);
_logger.default.debug(`Retrieved ${_appiumSupport.util.pluralize('permission', filteredResult.length, true)} ` + `from ${groupNames} ${_appiumSupport.util.pluralize('group', groupNames.length, false)}`);
return filteredResult;
};
exports.extractMatchingPermissions = extractMatchingPermissions;
function buildInstallArgs(apiLevel, options = {}) {
const result = [];
if (!_appiumSupport.util.hasValue(options.replace) || options.replace) {
result.push('-r');
}
if (options.allowTestPackages) {
result.push('-t');
}
if (options.useSdcard) {
result.push('-s');
}
if (options.grantPermissions) {
if (apiLevel < 23) {
_logger.default.debug(`Skipping permissions grant option, since ` + `the current API level ${apiLevel} does not support applications ` + `permissions customization`);
} else {
result.push('-g');
}
}
return result;
}
function parseManifest(manifest) {
const result = {
pkg: manifest.package,
versionCode: parseInt(manifest.versionCode, 10),
versionName: manifest.versionName || null
};
if (!manifest.application) {
return result;
}
for (const activity of [...manifest.application.activities, ...manifest.application.activityAliases]) {
if (activity.enabled === false || _lodash.default.isEmpty(activity.intentFilters)) {
continue;
}
for (const {
actions,
categories
} of activity.intentFilters) {
if (_lodash.default.isEmpty(actions) || _lodash.default.isEmpty(categories)) {
continue;
}
const isMainAction = actions.some(({
name
}) => name === 'android.intent.action.MAIN');
const isLauncherCategory = categories.some(({
name
}) => name === 'android.intent.category.LAUNCHER');
if (isMainAction && isLauncherCategory) {
result.activity = activity.name;
return result;
}
}
}
return result;
}
function parseAaptStrings(rawOutput, configMarker) {
const normalizeStringMatch = function (s) {
return s.replace(/"$/, '').replace(/^"/, '').replace(/\\"/g, '"');
};
const apkStrings = {};
let isInConfig = false;
let currentResourceId = null;
let isInPluralGroup = false;
const quotedStringPattern = /"[^"\\]*(?:\\.[^"\\]*)*"/;
for (const line of rawOutput.split(_os.default.EOL)) {
const trimmedLine = line.trim();
if (_lodash.default.isEmpty(trimmedLine)) {
continue;
}
if (['config', 'type', 'spec', 'Package'].some(x => trimmedLine.startsWith(x))) {
isInConfig = trimmedLine.startsWith(`config ${configMarker}:`);
currentResourceId = null;
isInPluralGroup = false;
continue;
}
if (!isInConfig) {
continue;
}
if (trimmedLine.startsWith('resource')) {
isInPluralGroup = false;
currentResourceId = null;
if (trimmedLine.includes(':string/')) {
const match = /:string\/(\S+):/.exec(trimmedLine);
if (match) {
currentResourceId = match[1];
}
} else if (trimmedLine.includes(':plurals/')) {
const match = /:plurals\/(\S+):/.exec(trimmedLine);
if (match) {
currentResourceId = match[1];
isInPluralGroup = true;
}
}
continue;
}
if (currentResourceId && trimmedLine.startsWith('(string')) {
const match = quotedStringPattern.exec(trimmedLine);
if (match) {
apkStrings[currentResourceId] = normalizeStringMatch(match[0]);
}
currentResourceId = null;
continue;
}
if (currentResourceId && isInPluralGroup && trimmedLine.includes(': (string')) {
const match = quotedStringPattern.exec(trimmedLine);
if (match) {
apkStrings[currentResourceId] = [...(apkStrings[currentResourceId] || []), normalizeStringMatch(match[0])];
}
continue;
}
}
return apkStrings;
}
function parseAapt2Strings(rawOutput, configMarker) {
const allLines = rawOutput.split(_os.default.EOL);
function extractContent(startIdx) {
let idx = startIdx;
const startCharPos = allLines[startIdx].indexOf('"');
if (startCharPos < 0) {
return [null, idx];
}
let result = '';
while (idx < allLines.length) {
const terminationCharMatch = /"$/.exec(allLines[idx]);
if (terminationCharMatch) {
const terminationCharPos = terminationCharMatch.index;
if (startIdx === idx) {
return [allLines[idx].substring(startCharPos + 1, terminationCharPos), idx];
}
return [`${result}\\n${_lodash.default.trimStart(allLines[idx].substring(0, terminationCharPos))}`, idx];
}
if (idx > startIdx) {
result += `\\n${_lodash.default.trimStart(allLines[idx])}`;
} else {
result += allLines[idx].substring(startCharPos + 1);
}
++idx;
}
return [result, idx];
}
const apkStrings = {};
let currentResourceId = null;
let isInPluralGroup = false;
let isInCurrentConfig = false;
let lineIndex = 0;
while (lineIndex < allLines.length) {
const trimmedLine = allLines[lineIndex].trim();
if (_lodash.default.isEmpty(trimmedLine)) {
++lineIndex;
continue;
}
if (['type', 'Package'].some(x => trimmedLine.startsWith(x))) {
currentResourceId = null;
isInPluralGroup = false;
isInCurrentConfig = false;
++lineIndex;
continue;
}
if (trimmedLine.startsWith('resource')) {
isInPluralGroup = false;
currentResourceId = null;
isInCurrentConfig = false;
if (trimmedLine.includes('string/')) {
const match = /string\/(\S+)/.exec(trimmedLine);
if (match) {
currentResourceId = match[1];
}
} else if (trimmedLine.includes('plurals/')) {
const match = /plurals\/(\S+)/.exec(trimmedLine);
if (match) {
currentResourceId = match[1];
isInPluralGroup = true;
}
}
++lineIndex;
continue;
}
if (currentResourceId) {
if (isInPluralGroup) {
if (trimmedLine.startsWith('(')) {
isInCurrentConfig = trimmedLine.startsWith(`(${configMarker})`);
++lineIndex;
continue;
}
if (isInCurrentConfig) {
const [content, idx] = extractContent(lineIndex);
lineIndex = idx;
if (_lodash.default.isString(content)) {
apkStrings[currentResourceId] = [...(apkStrings[currentResourceId] || []), content];
}
}
} else if (trimmedLine.startsWith(`(${configMarker})`)) {
const [content, idx] = extractContent(lineIndex);
lineIndex = idx;
if (_lodash.default.isString(content)) {
apkStrings[currentResourceId] = content;
}
currentResourceId = null;
}
}
++lineIndex;
}
return apkStrings;
}
async function formatConfigMarker(configsGetter, desiredMarker, defaultMarker) {
let configMarker = desiredMarker || defaultMarker;
if (configMarker.includes('-') && !configMarker.includes('-r')) {
configMarker = configMarker.replace('-', '-r');
}
const configs = await configsGetter();
_logger.default.debug(`Resource configurations: ${JSON.stringify(configs)}`);
if (configMarker.toLowerCase().startsWith('en') && !configs.some(x => x.trim() === configMarker)) {
_logger.default.debug(`Resource configuration name '${configMarker}' is unknown. ` + `Replacing it with '${defaultMarker}'`);
configMarker = defaultMarker;
} else {
_logger.default.debug(`Selected configuration: '${configMarker}'`);
}
return configMarker;
}
function parseJsonData(output, entityName) {
if (!/\bresult=-1\b/.test(output) || !/\bdata="/.test(output)) {
_logger.default.debug(output);
throw new Error(`Cannot retrieve ${entityName} from the device. ` + 'Check the server log for more details');
}
const match = /\bdata=(".+)/.exec(output);
if (!match) {
_logger.default.debug(output);
throw new Error(`Cannot parse ${entityName} from the command output. ` + 'Check the server log for more details');
}
const jsonStr = _lodash.default.trim(match[1]).replace(/(^")|("$)/g, '');
try {
return JSON.parse(jsonStr);
} catch (e) {
_logger.default.debug(jsonStr);
throw new Error(`Cannot parse ${entityName} from the resulting data string. ` + 'Check the server log for more details');
}
}require('source-map-support').install();
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9oZWxwZXJzLmpzIl0sIm5hbWVzIjpbInJvb3REaXIiLCJwYXRoIiwicmVzb2x2ZSIsIl9fZGlybmFtZSIsInByb2Nlc3MiLCJlbnYiLCJOT19QUkVDT01QSUxFIiwiQVBLU19FWFRFTlNJT04iLCJBUEtfRVhURU5TSU9OIiwiQVBLX0lOU1RBTExfVElNRU9VVCIsIkFQS1NfSU5TVEFMTF9USU1FT1VUIiwiREVGQVVMVF9BREJfRVhFQ19USU1FT1VUIiwiZ2V0QW5kcm9pZFBsYXRmb3JtQW5kUGF0aCIsInNka1Jvb3QiLCJBTkRST0lEX0hPTUUiLCJBTkRST0lEX1NES19ST09UIiwiXyIsImlzRW1wdHkiLCJFcnJvciIsInByb3BzUGF0aHMiLCJmcyIsImdsb2IiLCJjd2QiLCJhYnNvbHV0ZSIsInBsYXRmb3Jtc01hcHBpbmciLCJwcm9wc1BhdGgiLCJwcm9wc0NvbnRlbnQiLCJyZWFkRmlsZSIsInBsYXRmb3JtUGF0aCIsImRpcm5hbWUiLCJwbGF0Zm9ybSIsImJhc2VuYW1lIiwibWF0Y2giLCJleGVjIiwibG9nIiwid2FybiIsInBhcnNlSW50IiwicmVjZW50U2RrVmVyc2lvbiIsImtleXMiLCJzb3J0IiwicmV2ZXJzZSIsInJlc3VsdCIsImRlYnVnIiwiSlNPTiIsInN0cmluZ2lmeSIsInVuemlwRmlsZSIsInppcFBhdGgiLCJkc3RSb290IiwiemlwIiwiYXNzZXJ0VmFsaWRaaXAiLCJleHRyYWN0QWxsVG8iLCJ1bnNpZ25BcGsiLCJhcGtQYXRoIiwidG1wUm9vdCIsInRlbXBEaXIiLCJvcGVuRGlyIiwibWV0YUluZkZvbGRlck5hbWUiLCJoYXNNZXRhSW5mIiwicmVhZEVudHJpZXMiLCJlbnRyeSIsImZpbGVOYW1lIiwic3RhcnRzV2l0aCIsInRtcFppcFJvb3QiLCJyaW1yYWYiLCJ0bXBSZXN1bHRQYXRoIiwidG9BcmNoaXZlIiwidW5saW5rIiwibXYiLCJnZXRJTUVMaXN0RnJvbU91dHB1dCIsInN0ZG91dCIsImVuZ2luZXMiLCJsaW5lIiwic3BsaXQiLCJsZW5ndGgiLCJwdXNoIiwidHJpbSIsInJlcGxhY2UiLCJnZXRKYXZhSG9tZSIsIm1lbW9pemUiLCJKQVZBX0hPTUUiLCJleGlzdHMiLCJzdGF0cyIsInN0YXQiLCJpc0RpcmVjdG9yeSIsImdldEphdmFGb3JPcyIsInN5c3RlbSIsImlzV2luZG93cyIsImdldE9wZW5Tc2xGb3JPcyIsImJpbmFyeU5hbWUiLCJ3aGljaCIsImVyciIsImdldEFwa3NpZ25lckZvck9zIiwic3lzSGVscGVycyIsImdldEJpbmFyeUZyb21TZGtSb290IiwiZ2V0QXBrYW5hbHl6ZXJGb3JPcyIsImlzU2hvd2luZ0xvY2tzY3JlZW4iLCJkdW1wc3lzIiwidGVzdCIsImlzQ3VycmVudEZvY3VzT25LZXlndWFyZCIsIm0iLCJnZXRTdXJmYWNlT3JpZW50YXRpb24iLCJpc1NjcmVlbk9uRnVsbHkiLCJidWlsZFN0YXJ0Q21kIiwic3RhcnRBcHBPcHRpb25zIiwiYXBpTGV2ZWwiLCJ1c2VyIiwid2FpdEZvckxhdW5jaCIsInBrZyIsImFjdGl2aXR5IiwiYWN0aW9uIiwiY2F0ZWdvcnkiLCJzdG9wQXBwIiwiZmxhZ3MiLCJjbWQiLCJ1dGlsIiwiaGFzVmFsdWUiLCJvcHRpb25hbEludGVudEFyZ3VtZW50cyIsInBhcnNlS2V5VmFsdWUiLCJzdHIiLCJzcGFjZSIsImluZGV4T2YiLCJzdWJzdHJpbmciLCJyZSIsImFyZ3MiLCJhcHBseSIsImZsYWciLCJmbGFnUG9zIiwicHJldkFyZ3MiLCJnZXRTZGtUb29sc1ZlcnNpb24iLCJhbmRyb2lkSG9tZSIsInByb3BlcnRpZXNQYXRoIiwicHJvcGVydGllc0NvbnRlbnQiLCJ2ZXJzaW9uTWF0Y2hlciIsIlJlZ0V4cCIsIm1ham9yIiwibWlub3IiLCJidWlsZCIsImdldEJ1aWxkVG9vbHNEaXJzIiwiYnVpbGRUb29sc0RpcnMiLCJtYXAiLCJkaXIiLCJhIiwiYiIsInNlbXZlciIsInJjb21wYXJlIiwicGFpciIsIm1lc3NhZ2UiLCJwYWlycyIsIkIiLCJtdGltZSIsInZhbHVlT2YiLCJpbmZvIiwiZXh0cmFjdE1hdGNoaW5nUGVybWlzc2lvbnMiLCJkdW1wc3lzT3V0cHV0IiwiZ3JvdXBOYW1lcyIsImdyYW50ZWRTdGF0ZSIsImdyb3VwUGF0dGVybkJ5TmFtZSIsImdyb3VwTmFtZSIsImVzY2FwZVJlZ0V4cCIsImluZGVudFBhdHRlcm4iLCJwZXJtaXNzaW9uTmFtZVBhdHRlcm4iLCJncmFudGVkU3RhdGVQYXR0ZXJuIiwiZ3JvdXBNYXRjaCIsImxpbmVzIiwidGl0bGVJbmRlbnQiLCJzZWFyY2giLCJzbGljZSIsImN1cnJlbnRJbmRlbnQiLCJwZXJtaXNzaW9uTmFtZU1hdGNoIiwiaXRlbSIsInBlcm1pc3Npb24iLCJncmFudGVkU3RhdGVNYXRjaCIsImdyYW50ZWQiLCJmaWx0ZXJlZFJlc3VsdCIsImZpbHRlciIsImlzQm9vbGVhbiIsInBsdXJhbGl6ZSIsImJ1aWxkSW5zdGFsbEFyZ3MiLCJvcHRpb25zIiwiYWxsb3dUZXN0UGFja2FnZXMiLCJ1c2VTZGNhcmQiLCJncmFudFBlcm1pc3Npb25zIiwicGFyc2VNYW5pZmVzdCIsIm1hbmlmZXN0IiwicGFja2FnZSIsInZlcnNpb25Db2RlIiwidmVyc2lvbk5hbWUiLCJhcHBsaWNhdGlvbiIsImFjdGl2aXRpZXMiLCJhY3Rpdml0eUFsaWFzZXMiLCJlbmFibGVkIiwiaW50ZW50RmlsdGVycyIsImFjdGlvbnMiLCJjYXRlZ29yaWVzIiwiaXNNYWluQWN0aW9uIiwic29tZSIsIm5hbWUiLCJpc0xhdW5jaGVyQ2F0ZWdvcnkiLCJwYXJzZUFhcHRTdHJpbmdzIiwicmF3T3V0cHV0IiwiY29uZmlnTWFya2VyIiwibm9ybWFsaXplU3RyaW5nTWF0Y2giLCJzIiwiYXBrU3RyaW5ncyIsImlzSW5Db25maWciLCJjdXJyZW50UmVzb3VyY2VJZCIsImlzSW5QbHVyYWxHcm91cCIsInF1b3RlZFN0cmluZ1BhdHRlcm4iLCJvcyIsIkVPTCIsInRyaW1tZWRMaW5lIiwieCIsImluY2x1ZGVzIiwicGFyc2VBYXB0MlN0cmluZ3MiLCJhbGxMaW5lcyIsImV4dHJhY3RDb250ZW50Iiwic3RhcnRJZHgiLCJpZHgiLCJzdGFydENoYXJQb3MiLCJ0ZXJtaW5hdGlvbkNoYXJNYXRjaCIsInRlcm1pbmF0aW9uQ2hhclBvcyIsImluZGV4IiwidHJpbVN0YXJ0IiwiaXNJbkN1cnJlbnRDb25maWciLCJsaW5lSW5kZXgiLCJjb250ZW50IiwiaXNTdHJpbmciLCJmb3JtYXRDb25maWdNYXJrZXIiLCJjb25maWdzR2V0dGVyIiwiZGVzaXJlZE1hcmtlciIsImRlZmF1bHRNYXJrZXIiLCJjb25maWdzIiwidG9Mb3dlckNhc2UiLCJwYXJzZUpzb25EYXRhIiwib3V0cHV0IiwiZW50aXR5TmFtZSIsImpzb25TdHIiLCJwYXJzZSIsImUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxPQUFPLEdBQUdDLGNBQUtDLE9BQUwsQ0FBYUMsU0FBYixFQUF3QkMsT0FBTyxDQUFDQyxHQUFSLENBQVlDLGFBQVosR0FBNEIsSUFBNUIsR0FBbUMsT0FBM0QsQ0FBaEI7OztBQUNBLE1BQU1DLGNBQWMsR0FBRyxPQUF2Qjs7QUFDQSxNQUFNQyxhQUFhLEdBQUcsTUFBdEI7O0FBQ0EsTUFBTUMsbUJBQW1CLEdBQUcsS0FBNUI7O0FBQ0EsTUFBTUMsb0JBQW9CLEdBQUdELG1CQUFtQixHQUFHLENBQW5EOztBQUNBLE1BQU1FLHdCQUF3QixHQUFHLEtBQWpDOzs7QUFlQSxlQUFlQyx5QkFBZixHQUE0QztBQUMxQyxRQUFNQyxPQUFPLEdBQUdULE9BQU8sQ0FBQ0MsR0FBUixDQUFZUyxZQUFaLElBQTRCVixPQUFPLENBQUNDLEdBQVIsQ0FBWVUsZ0JBQXhEOztBQUNBLE1BQUlDLGdCQUFFQyxPQUFGLENBQVVKLE9BQVYsQ0FBSixFQUF3QjtBQUN0QixVQUFNLElBQUlLLEtBQUosQ0FBVSw2RUFBVixDQUFOO0FBQ0Q7O0FBRUQsUUFBTUMsVUFBVSxHQUFHLE1BQU1D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S087QUFDTHBNLG9CQUFJUSxLQUFKLENBQVcsNEJBQTJCOEosWUFBYSxHQUFuRDtBQUNEOztBQUNELFNBQU9BLFlBQVA7QUFDRDs7QUFhRCxTQUFTaUMsYUFBVCxDQUF3QkMsTUFBeEIsRUFBZ0NDLFVBQWhDLEVBQTRDO0FBQzFDLE1BQUksQ0FBQyxnQkFBZ0IxSSxJQUFoQixDQUFxQnlJLE1BQXJCLENBQUQsSUFBaUMsQ0FBQyxXQUFXekksSUFBWCxDQUFnQnlJLE1BQWhCLENBQXRDLEVBQStEO0FBQzdEeE0sb0JBQUlRLEtBQUosQ0FBVWdNLE1BQVY7O0FBQ0EsVUFBTSxJQUFJeE4sS0FBSixDQUFXLG1CQUFrQnlOLFVBQVcsb0JBQTlCLEdBQ2QsdUNBREksQ0FBTjtBQUVEOztBQUNELFFBQU0zTSxLQUFLLEdBQUcsZUFBZUMsSUFBZixDQUFvQnlNLE1BQXBCLENBQWQ7O0FBQ0EsTUFBSSxDQUFDMU0sS0FBTCxFQUFZO0FBQ1ZFLG9CQUFJUSxLQUFKLENBQVVnTSxNQUFWOztBQUNBLFVBQU0sSUFBSXhOLEtBQUosQ0FBVyxnQkFBZXlOLFVBQVcsNEJBQTNCLEdBQ2QsdUNBREksQ0FBTjtBQUVEOztBQUNELFFBQU1DLE9BQU8sR0FBRzVOLGdCQUFFMkQsSUFBRixDQUFPM0MsS0FBSyxDQUFDLENBQUQsQ0FBWixFQUFpQjRDLE9BQWpCLENBQXlCLFlBQXpCLEVBQXVDLEVBQXZDLENBQWhCOztBQUNBLE1BQUk7QUFDRixXQUFPakMsSUFBSSxDQUFDa00sS0FBTCxDQUFXRCxPQUFYLENBQVA7QUFDRCxHQUZELENBRUUsT0FBT0UsQ0FBUCxFQUFVO0FBQ1Y1TSxvQkFBSVEsS0FBSixDQUFVa00sT0FBVjs7QUFDQSxVQUFNLElBQUkxTixLQUFKLENBQVcsZ0JBQWV5TixVQUFXLG1DQUEzQixHQUNkLHVDQURJLENBQU47QUFFRDtBQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBzeXN0ZW0sIGZzLCB6aXAsIHV0aWwsIHRlbXBEaXIgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyLmpzJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuXG5jb25zdCByb290RGlyID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgcHJvY2Vzcy5lbnYuTk9fUFJFQ09NUElMRSA/ICcuLicgOiAnLi4vLi4nKTtcbmNvbnN0IEFQS1NfRVhURU5TSU9OID0gJy5hcGtzJztcbmNvbnN0IEFQS19FWFRFTlNJT04gPSAnLmFwayc7XG5jb25zdCBBUEtfSU5TVEFMTF9USU1FT1VUID0gNjAwMDA7XG5jb25zdCBBUEtTX0lOU1RBTExfVElNRU9VVCA9IEFQS19JTlNUQUxMX1RJTUVPVVQgKiAyO1xuY29uc3QgREVGQVVMVF9BREJfRVhFQ19USU1FT1VUID0gMjAwMDA7IC8vIGluIG1pbGxpc2Vjb25kc1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBsYXRmb3JtSW5mb1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSBwbGF0Zm9ybSAtIFRoZSBwbGF0Zm9ybSBuYW1lLCBmb3IgZXhhbXBsZSBgYW5kcm9pZC0yNGBcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBgbnVsbGAgaWYgaXQgY2Fubm90IGJlIGZvdW5kXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHBsYXRmb3JtUGF0aCAtIEZ1bGwgcGF0aCB0byB0aGUgcGxhdGZvcm0gU0RLIGZvbGRlclxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBgbnVsbGAgaWYgaXQgY2Fubm90IGJlIGZvdW5kXG4gKi9cblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgcGF0aCB0byB0aGUgcmVjZW50IGluc3RhbGxlZCBBbmRyb2lkIHBsYXRmb3JtLlxuICpcbiAqIEByZXR1cm4ge1BsYXRmb3JtSW5mb30gVGhlIHJlc3VsdGluZyBwYXRoIHRvIHRoZSBuZXdlc3QgaW5zdGFsbGVkIHBsYXRmb3JtLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRBbmRyb2lkUGxhdGZvcm1BbmRQYXRoICgpIHtcbiAgY29uc3Qgc2RrUm9vdCA9IHByb2Nlc3MuZW52LkFORFJPSURfSE9NRSB8fCBwcm9jZXNzLmVudi5BTkRST0lEX1NES19ST09UO1xuICBpZiAoXy5pc0VtcHR5KHNka1Jvb3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdOZWl0aGVyIEFORFJPSURfSE9NRSBub3IgQU5EUk9JRF9TREtfUk9PVCBlbnZpcm9ubWVudCB2YXJpYWJsZSB3YXMgZXhwb3J0ZWQnKTtcbiAgfVxuXG4gIGNvbnN0IHByb3BzUGF0aHMgPSBhd2FpdCBmcy5nbG9iKCcqL2J1aWxkLnByb3AnLCB7XG4gICAgY3dkOiBwYXRoLnJlc29sdmUoc2RrUm9vdCwgJ3BsYXRmb3JtcycpLFxuICAgIGFic29sdXRlOiB0cnVlLFxuICB9KTtcbiAgY29uc3QgcGxhdGZvcm1zTWFwcGluZyA9IHt9O1xuICBmb3IgKGNvbnN0IHByb3BzUGF0aCBvZiBwcm9wc1BhdGhzKSB7XG4gICAgY29uc3QgcHJvcHNDb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUocHJvcHNQYXRoLCAndXRmLTgnKTtcbiAgICBjb25zdCBwbGF0Zm9ybVBhdGggPSBwYXRoLmRpcm5hbWUocHJvcHNQYXRoKTtcbiAgICBjb25zdCBwbGF0Zm9ybSA9IHBhdGguYmFzZW5hbWUocGxhdGZvcm1QYXRoKTtcbiAgICBjb25zdCBtYXRjaCA9IC9yb1xcLmJ1aWxkXFwudmVyc2lvblxcLnNkaz0oXFxkKykvLmV4ZWMocHJvcHNDb250ZW50KTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICBsb2cud2FybihgQ2Fubm90IHJlYWQgdGhlIFNESyB2ZXJzaW9uIGZyb20gJyR7cHJvcHNQYXRofScuIFNraXBwaW5nICcke3BsYXRmb3JtfSdgKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBwbGF0Zm9ybXNNYXBwaW5nW3BhcnNlSW50KG1hdGNoWzFdLCAxMCldID0ge1xuICAgICAgcGxhdGZvcm0sXG4gICAgICBwbGF0Zm9ybVBhdGgsXG4gICAgfTtcbiAgfVxuICBpZiAoXy5pc0VtcHR5KHBsYXRmb3Jtc01hcHBpbmcpKSB7XG4gICAgbG9nLndhcm4oYEZvdW5kIHplcm8gcGxhdGZvcm0gZm9sZGVycyBhdCAnJHtwYXRoLnJlc29sdmUoc2RrUm9vdCwgJ3BsYXRmb3JtcycpfScuIGAgK1xuICAgICAgYERvIHlvdSBoYXZlIGFueSBBbmRyb2lkIFNES3MgaW5zdGFsbGVkP2ApO1xuICAgIHJldHVybiB7XG4gICAgICBwbGF0Zm9ybTogbnVsbCxcbiAgICAgIHBsYXRmb3JtUGF0aDogbnVsbCxcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgcmVjZW50U2RrVmVyc2lvbiA9IF8ua2V5cyhwbGF0Zm9ybXNNYXBwaW5nKS5zb3J0KCkucmV2ZXJzZSgpWzBdO1xuICBjb25zdCByZXN1bHQgPSBwbGF0Zm9ybXNNYXBwaW5nW3JlY2VudFNka1ZlcnNpb25dO1xuICBsb2cuZGVidWcoYEZvdW5kIHRoZSBtb3N0IHJlY2VudCBBbmRyb2lkIHBsYXRmb3JtOiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVuemlwRmlsZSAoemlwUGF0aCwgZHN0Um9vdCA9IHBhdGguZGlybmFtZSh6aXBQYXRoKSkge1xuICBsb2cuZGVidWcoYFVuemlwcGluZyAnJHt6aXBQYXRofScgdG8gJyR7ZHN0Um9vdH0nYCk7XG4gIGF3YWl0IHppcC5hc3NlcnRWYWxpZFppcCh6aXBQYXRoKTtcbiAgYXdhaXQgemlwLmV4dHJhY3RBbGxUbyh6aXBQYXRoLCBkc3RSb290KTtcbiAgbG9nLmRlYnVnKCdVbnppcCBzdWNjZXNzZnVsJyk7XG59XG5cbi8qKlxuICogVW5zaWducyB0aGUgZ2l2ZW4gYXBrIGJ5IHJlbW92aW5nIHRoZVxuICogTUVUQS1JTkYgZm9sZGVyIHJlY3Vyc2l2ZWx5IGZyb20gdGhlIGFyY2hpdmUuXG4gKiAhISEgVGhlIGZ1bmN0aW9uIG92ZXJ3cml0ZXMgdGhlIGdpdmVuIGFwayBhZnRlciBzdWNjZXNzZnVsIHVuc2lnbmluZyAhISFcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBrUGF0aCBUaGUgcGF0aCB0byB0aGUgYXBrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBhcGsgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5XG4gKiB1bnNpZ25lZCBhbmQgb3ZlcndyaXR0ZW5cbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgZHVyaW5nIHRoZSB1bnNpZ24gb3BlcmF0aW9uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHVuc2lnbkFwayAoYXBrUGF0aCkge1xuICBjb25zdCB0bXBSb290ID0gYXdhaXQgdGVtcERpci5vcGVuRGlyKCk7XG4gIGNvbnN0IG1ldGFJbmZGb2xkZXJOYW1lID0gJ01FVEEtSU5GJztcbiAgdHJ5IHtcbiAgICBsZXQgaGFzTWV0YUluZiA9IGZhbHNlO1xuICAgIGF3YWl0IHppcC5yZWFkRW50cmllcyhhcGtQYXRoLCAoe2VudHJ5fSkgPT4ge1xuICAgICAgaGFzTWV0YUluZiA9IGVudHJ5LmZpbGVOYW1lLnN0YXJ0c1dpdGgoYCR7bWV0YUluZkZvbGRlck5hbWV9L2ApO1xuICAgICAgLy8gZW50cmllcyBpdGVyYXRpb24gc3RvcHMgYWZ0ZXIgYGZhbHNlYCBpcyByZXR1cm5lZFxuICAgICAgcmV0dXJuICFoYXNNZXRhSW5mO1xuICAgIH0pO1xuICAgIGlmICghaGFzTWV0YUluZikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB0bXBaaXBSb290ID0gcGF0aC5yZXNvbHZlKHRtcFJvb3QsICdhcGsnKTtcbiAgICBhd2FpdCB6aXAuZXh0cmFjdEFsbFRvKGFwa1BhdGgsIHRtcFppcFJvb3QpO1xuICAgIGF3YWl0IGZzLnJpbXJhZihwYXRoLnJlc29sdmUodG1wWmlwUm9vdCwgbWV0YUluZkZvbGRlck5hbWUpKTtcbiAgICBjb25zdCB0bXBSZXN1bHRQYXRoID0gcGF0aC5yZXNvbHZlKHRtcFJvb3QsIHBhdGguYmFzZW5hbWUoYXBrUGF0aCkpO1xuICAgIGF3YWl0IHppcC50b0FyY2hpdmUodG1wUmVzdWx0UGF0aCwge1xuICAgICAgY3dkOiB0bXBaaXBSb290LFxuICAgIH0pO1xuICAgIGF3YWl0IGZzLnVubGluayhhcGtQYXRoKTtcbiAgICBhd2FpdCBmcy5tdih0bXBSZXN1bHRQYXRoLCBhcGtQYXRoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBmcy5yaW1yYWYodG1wUm9vdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0SU1FTGlzdEZyb21PdXRwdXQgKHN0ZG91dCkge1xuICBsZXQgZW5naW5lcyA9IFtdO1xuICBmb3IgKGxldCBsaW5lIG9mIHN0ZG91dC5zcGxpdCgnXFxuJykpIHtcbiAgICBpZiAobGluZS5sZW5ndGggPiAwICYmIGxpbmVbMF0gIT09ICcgJykge1xuICAgICAgLy8gcmVtb3ZlIG5ld2xpbmUgYW5kIHRyYWlsaW5nIGNvbG9uLCBhbmQgYWRkIHRvIHRoZSBsaXN0XG4gICAgICBlbmdpbmVzLnB1c2gobGluZS50cmltKCkucmVwbGFjZSgvOiQvLCAnJykpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZW5naW5lcztcbn1cblxuY29uc3QgZ2V0SmF2YUhvbWUgPSBfLm1lbW9pemUoYXN5bmMgZnVuY3Rpb24gZ2V0SmF2YUhvbWUgKCkge1xuICBjb25zdCByZXN1bHQgPSBwcm9jZXNzLmVudi5KQVZBX0hPTUU7XG4gIGlmICghcmVzdWx0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgSkFWQV9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIG11c3QgYmUgc2V0IGZvciBBbmRyb2lkIFRvb2xzIHRvIHdvcmsgcHJvcGVybHknKTtcbiAgfVxuICBpZiAoIWF3YWl0IGZzLmV4aXN0cyhyZXN1bHQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgSkFWQV9IT01FIGxvY2F0aW9uICcke3Jlc3VsdH0nIG11c3QgZXhpc3RgKTtcbiAgfVxuICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQocmVzdWx0KTtcbiAgaWYgKCFzdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgSkFWQV9IT01FIGxvY2F0aW9uICcke3Jlc3VsdH0nIG11c3QgYmUgYSB2YWxpZCBmb2xkZXJgKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufSk7XG5cbmNvbnN0IGdldEphdmFGb3JPcyA9IF8ubWVtb2l6ZShhc3luYyBmdW5jdGlvbiBnZXRKYXZhRm9yT3MgKCkge1xuICByZXR1cm4gcGF0aC5yZXNvbHZlKGF3YWl0IGdldEphdmFIb21lKCksICdiaW4nLFxuICAgIGBqYXZhJHtzeXN0ZW0uaXNXaW5kb3dzKCkgPyAnLmV4ZScgOiAnJ31gKTtcbn0pO1xuXG5jb25zdCBnZXRPcGVuU3NsRm9yT3MgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGJpbmFyeU5hbWUgPSBgb3BlbnNzbCR7c3lzdGVtLmlzV2luZG93cygpID8gJy5leGUnIDogJyd9YDtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZnMud2hpY2goYmluYXJ5TmFtZSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIG9wZW5zc2wgdG9vbCBtdXN0IGJlIGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtIGFuZCBhdmFpbGFibGUgb24gdGhlIHBhdGgnKTtcbiAgfVxufTtcblxuLyoqXG4gKiBHZXQgdGhlIGFic29sdXRlIHBhdGggdG8gYXBrc2lnbmVyIHRvb2xcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc3lzSGVscGVycyAtIEFuIGluc3RhbmNlIGNvbnRhaW5pbmcgc3lzdGVtQ2FsbE1ldGhvZHMgaGVscGVyIG1ldGhvZHNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEFuIGFic29sdXRlIHBhdGggdG8gYXBrc2lnbmVyIHRvb2wuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRvb2wgaXMgbm90IHByZXNlbnQgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRBcGtzaWduZXJGb3JPcyAoc3lzSGVscGVycykge1xuICByZXR1cm4gYXdhaXQgc3lzSGVscGVycy5nZXRCaW5hcnlGcm9tU2RrUm9vdCgnYXBrc2lnbmVyLmphcicpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgYWJzb2x1dGUgcGF0aCB0byBhcGthbmFseXplciB0b29sLlxuICogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vc3R1ZGlvL2NvbW1hbmQtbGluZS9hcGthbmFseXplci5odG1sXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN5c0hlbHBlcnMgLSBBbiBpbnN0YW5jZSBjb250YWluaW5nIHN5c3RlbUNhbGxNZXRob2RzIGhlbHBlciBtZXRob2RzXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBBbiBhYnNvbHV0ZSBwYXRoIHRvIGFwa2FuYWx5emVyIHRvb2wuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRvb2wgaXMgbm90IHByZXNlbnQgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRBcGthbmFseXplckZvck9zIChzeXNIZWxwZXJzKSB7XG4gIHJldHVybiBhd2FpdCBzeXNIZWxwZXJzLmdldEJpbmFyeUZyb21TZGtSb290KCdhcGthbmFseXplcicpO1xufVxuXG4vKipcbiAqIENoZWNrcyBtU2hvd2luZ0xvY2tzY3JlZW4gb3IgbURyZWFtaW5nTG9ja3NjcmVlbiBpbiBkdW1wc3lzIG91dHB1dCB0byBkZXRlcm1pbmVcbiAqIGlmIGxvY2sgc2NyZWVuIGlzIHNob3dpbmdcbiAqXG4gKiBBIG5vdGU6IGBhZGIgc2hlbGwgZHVtcHN5cyB0cnVzdGAgcGVyZm9ybXMgYmV0dGVyIHdoaWxlIGRldGVjdGluZyB0aGUgbG9ja2VkIHNjcmVlbiBzdGF0ZVxuICogaW4gY29tcGFyaXNvbiB0byBgYWRiIGR1bXBzeXMgd2luZG93YCBvdXRwdXQgcGFyc2luZy5cbiAqIEJ1dCB0aGUgdHJ1c3QgY29tbWFuZCBkb2VzIG5vdCB3b3JrIGZvciBgU3dpcGVgIHVubG9jayBwYXR0ZXJuLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBkdW1wc3lzIC0gVGhlIG91dHB1dCBvZiBkdW1wc3lzIHdpbmRvdyBjb21tYW5kLlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBsb2NrIHNjcmVlbiBpcyBzaG93aW5nLlxuICovXG5mdW5jdGlvbiBpc1Nob3dpbmdMb2Nrc2NyZWVuIChkdW1wc3lzKSB7XG4gIHJldHVybiAvKG1TaG93aW5nTG9ja3NjcmVlbj10cnVlfG1EcmVhbWluZ0xvY2tzY3JlZW49dHJ1ZSkvZ2kudGVzdChkdW1wc3lzKTtcbn1cblxuLypcbiAqIENoZWNrcyBtQ3VycmVudEZvY3VzIGluIGR1bXBzeXMgb3V0cHV0IHRvIGRldGVybWluZSBpZiBLZXlndWFyZCBpcyBhY3RpdmF0ZWRcbiAqL1xuZnVuY3Rpb24gaXNDdXJyZW50Rm9jdXNPbktleWd1YXJkIChkdW1wc3lzKSB7XG4gIGxldCBtID0gL21DdXJyZW50Rm9jdXMuK0tleWd1YXJkL2dpLmV4ZWMoZHVtcHN5cyk7XG4gIHJldHVybiAobSAmJiBtLmxlbmd0aCAmJiBtWzBdKSA/IHRydWUgOiBmYWxzZTtcbn1cblxuLypcbiAqIFJlYWRzIFN1cmZhY2VPcmllbnRhdGlvbiBpbiBkdW1wc3lzIG91dHB1dFxuICovXG5mdW5jdGlvbiBnZXRTdXJmYWNlT3JpZW50YXRpb24gKGR1bXBzeXMpIHtcbiAgbGV0IG0gPSAvU3VyZmFjZU9yaWVudGF0aW9uOiBcXGQvZ2kuZXhlYyhkdW1wc3lzKTtcbiAgcmV0dXJuIG0gJiYgcGFyc2VJbnQobVswXS5zcGxpdCgnOicpWzFdLCAxMCk7XG59XG5cbi8qXG4gKiBDaGVja3MgbVNjcmVlbk9uRnVsbHkgaW4gZHVtcHN5cyBvdXRwdXQgdG8gZGV0ZXJtaW5lIGlmIHNjcmVlbiBpcyBzaG93aW5nXG4gKiBEZWZhdWx0IGlzIHRydWVcbiAqL1xuZnVuY3Rpb24gaXNTY3JlZW5PbkZ1bGx5IChkdW1wc3lzKSB7XG4gIGxldCBtID0gL21TY3JlZW5PbkZ1bGx5PVxcdysvZ2kuZXhlYyhkdW1wc3lzKTtcbiAgcmV0dXJuICFtIHx8IC8vIGlmIGluZm9ybWF0aW9uIGlzIG1pc3Npbmcgd2UgYXNzdW1lIHNjcmVlbiBpcyBmdWxseSBvblxuICAgICAgICAgKG0gJiYgbS5sZW5ndGggPiAwICYmIG1bMF0uc3BsaXQoJz0nKVsxXSA9PT0gJ3RydWUnKSB8fCBmYWxzZTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgY29tbWFuZCBsaW5lIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgZ2l2ZW5cbiAqIGFwcGxpY2F0aW9uIHN0YXJ0dXAgb3B0aW9uc1xuICpcbiAqIEBwYXJhbSB7U3RhcnRBcHBPcHRpb25zfSBzdGFydEFwcE9wdGlvbnMgLSBBcHBsaWNhdGlvbiBvcHRpb25zIG1hcHBpbmdcbiAqIEBwYXJhbSB7bnVtYmVyfSBhcGlMZXZlbCAtIFRoZSBhY3R1YWwgT1MgQVBJIGxldmVsXG4gKiBAcmV0dXJucyB7QXJyYXk8U3RyaW5nPn0gVGhlIGFjdHVhbCBjb21tYW5kIGxpbmUgYXJyYXlcbiAqL1xuZnVuY3Rpb24gYnVpbGRTdGFydENtZCAoc3RhcnRBcHBPcHRpb25zLCBhcGlMZXZlbCkge1xuICBjb25zdCB7XG4gICAgdXNlcixcbiAgICB3YWl0Rm9yTGF1bmNoLFxuICAgIHBrZyxcbiAgICBhY3Rpdml0eSxcbiAgICBhY3Rpb24sXG4gICAgY2F0ZWdvcnksXG4gICAgc3RvcEFwcCxcbiAgICBmbGFncyxcbiAgfSA9IHN0YXJ0QXBwT3B0aW9ucztcbiAgY29uc3QgY21kID0gWydhbScsICdzdGFydCddO1xuICBpZiAodXRpbC5oYXNWYWx1ZSh1c2VyKSkge1xuICAgIGNtZC5wdXNoKCctLXVzZXInLCB1c2VyKTtcbiAgfVxuICBpZiAod2FpdEZvckxhdW5jaCkge1xuICAgIGNtZC5wdXNoKCctVycpO1xuICB9XG4gIGlmIChhY3Rpdml0eSAmJiBwa2cpIHtcbiAgICBjbWQucHVzaCgnLW4nLCBgJHtwa2d9LyR7YWN0aXZpdHl9YCk7XG4gIH1cbiAgaWYgKHN0b3BBcHAgJiYgYXBpTGV2ZWwgPj0gMTUpIHtcbiAgICBjbWQucHVzaCgnLVMnKTtcbiAgfVxuICBpZiAoYWN0aW9uKSB7XG4gICAgY21kLnB1c2goJy1hJywgYWN0aW9uKTtcbiAgfVxuICBpZiAoY2F0ZWdvcnkpIHtcbiAgICBjbWQucHVzaCgnLWMnLCBjYXRlZ29yeSk7XG4gIH1cbiAgaWYgKGZsYWdzKSB7XG4gICAgY21kLnB1c2goJy1mJywgZmxhZ3MpO1xuICB9XG4gIGlmIChzdGFydEFwcE9wdGlvbnMub3B0aW9uYWxJbnRlbnRBcmd1bWVudHMpIHtcbiAgICAvLyBleHBlY3Qgb3B0aW9uYWxJbnRlbnRBcmd1bWVudHMgdG8gYmUgYSBzaW5nbGUgc3RyaW5nIG9mIHRoZSBmb3JtOlxuICAgIC8vICAgICBcIi1mbGFnIGtleVwiXG4gICAgLy8gICAgIFwiLWZsYWcga2V5IHZhbHVlXCJcbiAgICAvLyBvciBhIGNvbWJpbmF0aW9uIG9mIHRoZXNlIChlLmcuLCBcIi1mbGFnMSBrZXkxIC1mbGFnMiBrZXkyIHZhbHVlMlwiKVxuXG4gICAgLy8gdGFrZSBhIHN0cmluZyBhbmQgcGFyc2Ugb3V0IHRoZSBwYXJ0IGJlZm9yZSBhbnkgc3BhY2VzLCBhbmQgYW55dGhpbmcgYWZ0ZXJcbiAgICAvLyB0aGUgZmlyc3Qgc3BhY2VcbiAgICBsZXQgcGFyc2VLZXlWYWx1ZSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgIHN0ciA9IHN0ci50cmltKCk7XG4gICAgICBsZXQgc3BhY2UgPSBzdHIuaW5kZXhPZignICcpO1xuICAgICAgaWYgKHNwYWNlID09PSAtMSkge1xuICAgICAgICByZXR1cm4gc3RyLmxlbmd0aCA/IFtzdHJdIDogW107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gW3N0ci5zdWJzdHJpbmcoMCwgc3BhY2UpLnRyaW0oKSwgc3RyLnN1YnN0cmluZyhzcGFjZSArIDEpLnRyaW0oKV07XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIGN5Y2xlIHRocm91Z2ggdGhlIG9wdGlvbmFsSW50ZW50QXJndW1lbnRzIGFuZCBwdWxsIG91dCB0aGUgYXJndW1lbnRzXG4gICAgLy8gYWRkIGEgc3BhY2UgaW5pdGlhbGx5IHNvIGZsYWdzIGNhbiBiZSBkaXN0aW5ndWlzaGVkIGZyb20gYXJndW1lbnRzIHRoYXRcbiAgICAvLyBoYXZlIGludGVybmFsIGh5cGhlbnNcbiAgICBsZXQgb3B0aW9uYWxJbnRlbnRBcmd1bWVudHMgPSBgICR7c3RhcnRBcHBPcHRpb25zLm9wdGlvbmFsSW50ZW50QXJndW1lbnRzfWA7XG4gICAgbGV0IHJlID0gLyAoLVteXFxzXSspICguKykvO1xuICAgIHdoaWxlICh0cnVlKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc3RhbnQtY29uZGl0aW9uXG4gICAgICBsZXQgYXJncyA9IHJlLmV4ZWMob3B0aW9uYWxJbnRlbnRBcmd1bWVudHMpO1xuICAgICAgaWYgKCFhcmdzKSB7XG4gICAgICAgIGlmIChvcHRpb25hbEludGVudEFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAvLyBubyBtb3JlIGZsYWdzLCBzbyB0aGUgcmVtYWluZGVyIGNhbiBiZSB0cmVhdGVkIGFzICdrZXknIG9yICdrZXkgdmFsdWUnXG4gICAgICAgICAgY21kLnB1c2guYXBwbHkoY21kLCBwYXJzZUtleVZhbHVlKG9wdGlvbmFsSW50ZW50QXJndW1lbnRzKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gd2UgYXJlIGRvbmVcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIC8vIHRha2UgdGhlIGZsYWcgYW5kIHNlZSBpZiBpdCBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmdcbiAgICAgIC8vIGlmIGl0IGlzIG5vdCwgdGhlbiBpdCBtZWFucyB3ZSBoYXZlIGJlZW4gdGhyb3VnaCBhbHJlYWR5LCBhbmRcbiAgICAgIC8vIHdoYXQgaXMgYmVmb3JlIHRoZSBmbGFnIGlzIHRoZSBhcmd1bWVudCBmb3IgdGhlIHByZXZpb3VzIGZsYWdcbiAgICAgIGxldCBmbGFnID0gYXJnc1sxXTtcbiAgICAgIGxldCBmbGFnUG9zID0gb3B0aW9uYWxJbnRlbnRBcmd1bWVudHMuaW5kZXhPZihmbGFnKTtcbiAgICAgIGlmIChmbGFnUG9zICE9PSAwKSB7XG4gICAgICAgIGxldCBwcmV2QXJncyA9IG9wdGlvbmFsSW50ZW50QXJndW1lbnRzLnN1YnN0cmluZygwLCBmbGFnUG9zKTtcbiAgICAgICAgY21kLnB1c2guYXBwbHkoY21kLCBwYXJzZUtleVZhbHVlKHByZXZBcmdzKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGFkZCB0aGUgZmxhZywgYXMgdGhlcmUgYXJlIG5vIG1vcmUgZWFybGllciBhcmd1bWVudHNcbiAgICAgIGNtZC5wdXNoKGZsYWcpO1xuXG4gICAgICAvLyBtYWtlIG9wdGlvbmFsSW50ZW50QXJndW1lbnRzIGhvbGQgdGhlIHJlbWFpbmRlclxuICAgICAgb3B0aW9uYWxJbnRlbnRBcmd1bWVudHMgPSBhcmdzWzJdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY21kO1xufVxuXG5jb25zdCBnZXRTZGtUb29sc1ZlcnNpb24gPSBfLm1lbW9pemUoYXN5bmMgZnVuY3Rpb24gZ2V0U2RrVG9vbHNWZXJzaW9uICgpIHtcbiAgY29uc3QgYW5kcm9pZEhvbWUgPSBwcm9jZXNzLmVudi5BTkRST0lEX0hPTUU7XG4gIGlmICghYW5kcm9pZEhvbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0FORFJPSURfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBleHBlY3RlZCB0byBiZSBzZXQnKTtcbiAgfVxuICBjb25zdCBwcm9wZXJ0aWVzUGF0aCA9IHBhdGgucmVzb2x2ZShhbmRyb2lkSG9tZSwgJ3Rvb2xzJywgJ3NvdXJjZS5wcm9wZXJ0aWVzJyk7XG4gIGlmICghYXdhaXQgZnMuZXhpc3RzKHByb3BlcnRpZXNQYXRoKSkge1xuICAgIGxvZy53YXJuKGBDYW5ub3QgZmluZCAke3Byb3BlcnRpZXNQYXRofSBmaWxlIHRvIHJlYWQgU0RLIHZlcnNpb24gZnJvbWApO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBwcm9wZXJ0aWVzQ29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKHByb3BlcnRpZXNQYXRoLCAndXRmOCcpO1xuICBjb25zdCB2ZXJzaW9uTWF0Y2hlciA9IG5ldyBSZWdFeHAoL1BrZ1xcLlJldmlzaW9uPShcXGQrKVxcLj8oXFxkKyk/XFwuPyhcXGQrKT8vKTtcbiAgY29uc3QgbWF0Y2ggPSB2ZXJzaW9uTWF0Y2hlci5leGVjKHByb3BlcnRpZXNDb250ZW50KTtcbiAgaWYgKG1hdGNoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1ham9yOiBwYXJzZUludChtYXRjaFsxXSwgMTApLFxuICAgICAgbWlub3I6IG1hdGNoWzJdID8gcGFyc2VJbnQobWF0Y2hbMl0sIDEwKSA6IDAsXG4gICAgICBidWlsZDogbWF0Y2hbM10gPyBwYXJzZUludChtYXRjaFszXSwgMTApIDogMFxuICAgIH07XG4gIH1cbiAgbG9nLndhcm4oYENhbm5vdCBwYXJzZSBcIlBrZy5SZXZpc2lvblwiIHZhbHVlIGZyb20gJHtwcm9wZXJ0aWVzUGF0aH1gKTtcbn0pO1xuXG4vKipcbiAqIFJldHJpZXZlcyBmdWxsIHBhdGhzIHRvIGFsbCAnYnVpbGQtdG9vbHMnIHN1YmZvbGRlcnMgdW5kZXIgdGhlIHBhcnRpY3VsYXJcbiAqIFNESyByb290IGZvbGRlclxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZGtSb290IC0gVGhlIGZ1bGwgcGF0aCB0byB0aGUgQW5kcm9pZCBTREsgcm9vdCBmb2xkZXJcbiAqIEByZXR1cm5zIHtBcnJheTxzdHJpbmc+fSBUaGUgZnVsbCBwYXRocyB0byB0aGUgcmVzdWx0aW5nIGZvbGRlcnMgc29ydGVkIGJ5XG4gKiBtb2RpZmljYXRpb24gZGF0ZSAodGhlIG5ld2VzdCBjb21lcyBmaXJzdCkgb3IgYW4gZW1wdHkgbGlzdCBpZiBubyBtYWN0aGVzIHdlcmUgZm91bmRcbiAqL1xuY29uc3QgZ2V0QnVpbGRUb29sc0RpcnMgPSBfLm1lbW9pemUoYXN5bmMgZnVuY3Rpb24gZ2V0QnVpbGRUb29sc0RpcnMgKHNka1Jvb3QpIHtcbiAgbGV0IGJ1aWxkVG9vbHNEaXJzID0gYXdhaXQgZnMuZ2xvYignKi8nLCB7XG4gICAgY3dkOiBwYXRoLnJlc29sdmUoc2RrUm9vdCwgJ2J1aWxkLXRvb2xzJyksXG4gICAgYWJzb2x1dGU6IHRydWUsXG4gIH0pO1xuICB0cnkge1xuICAgIGJ1aWxkVG9vbHNEaXJzID0gYnVpbGRUb29sc0RpcnNcbiAgICAgIC5tYXAoKGRpcikgPT4gW3BhdGguYmFzZW5hbWUoZGlyKSwgZGlyXSlcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBzZW12ZXIucmNvbXBhcmUoYVswXSwgYlswXSkpXG4gICAgICAubWFwKChwYWlyKSA9PiBwYWlyWzFdKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLndhcm4oYENhbm5vdCBzb3J0IGJ1aWxkLXRvb2xzIGZvbGRlcnMgJHtKU09OLnN0cmluZ2lmeShidWlsZFRvb2xzRGlycy5tYXAoKGRpcikgPT4gcGF0aC5iYXNlbmFtZShkaXIpKSl9IGAgK1xuICAgICAgYGJ5IHNlbWFudGljIHZlcnNpb24gbmFtZXMuYCk7XG4gICAgbG9nLndhcm4oYEZhbGxpbmcgYmFjayB0byBzb3J0aW5nIGJ5IG1vZGlmaWNhdGlvbiBkYXRlLiBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICBjb25zdCBwYWlycyA9IGF3YWl0IEIubWFwKGJ1aWxkVG9vbHNEaXJzLCBhc3luYyAoZGlyKSA9PiBbKGF3YWl0IGZzLnN0YXQoZGlyKSkubXRpbWUudmFsdWVPZigpLCBkaXJdKTtcbiAgICBidWlsZFRvb2xzRGlycyA9IHBhaXJzXG4gICAgICAuc29ydCgoYSwgYikgPT4gYVswXSA8IGJbMF0pXG4gICAgICAubWFwKChwYWlyKSA9PiBwYWlyWzFdKTtcbiAgfVxuICBsb2cuaW5mbyhgRm91bmQgJHtidWlsZFRvb2xzRGlycy5sZW5ndGh9ICdidWlsZC10b29scycgZm9sZGVycyB1bmRlciAnJHtzZGtSb290fScgKG5ld2VzdCBmaXJzdCk6YCk7XG4gIGZvciAobGV0IGRpciBvZiBidWlsZFRvb2xzRGlycykge1xuICAgIGxvZy5pbmZvKGAgICAgJHtkaXJ9YCk7XG4gIH1cbiAgcmV0dXJuIGJ1aWxkVG9vbHNEaXJzO1xufSk7XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBsaXN0IG9mIHBlcm1pc3Npb24gbmFtZXMgZW5jb2RlZCBpbiBgZHVtcHN5cyBwYWNrYWdlYCBjb21tYW5kIG91dHB1dC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZHVtcHN5c091dHB1dCAtIFRoZSBhY3R1YWwgY29tbWFuZCBvdXRwdXQuXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGdyb3VwTmFtZXMgLSBUaGUgbGlzdCBvZiBncm91cCBuYW1lcyB0byBsaXN0IHBlcm1pc3Npb25zIGZvci5cbiAqIEBwYXJhbSB7P2Jvb2xlYW59IGdyYW50ZWRTdGF0ZSAtIFRoZSBleHBlY3RlZCBzdGF0ZSBvZiBgZ3JhbnRlZGAgYXR0cmlidXRlIHRvIGZpbHRlciB3aXRoLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gZmlsdGVyaW5nIGlzIGRvbmUgaWYgdGhlIHBhcmFtZXRlciBpcyBub3Qgc2V0LlxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IFRoZSBsaXN0IG9mIG1hdGNoZWQgcGVybWlzc2lvbiBuYW1lcyBvciBhbiBlbXB0eSBsaXN0IGlmIG5vIG1hdGNoZXMgd2VyZSBmb3VuZC5cbiAqL1xuY29uc3QgZXh0cmFjdE1hdGNoaW5nUGVybWlzc2lvbnMgPSBmdW5jdGlvbiAoZHVtcHN5c091dHB1dCwgZ3JvdXBOYW1lcywgZ3JhbnRlZFN0YXRlID0gbnVsbCkge1xuICBjb25zdCBncm91cFBhdHRlcm5CeU5hbWUgPSAoZ3JvdXBOYW1lKSA9PiBuZXcgUmVnRXhwKGBeKFxcXFxzKiR7Xy5lc2NhcGVSZWdFeHAoZ3JvdXBOYW1lKX0gcGVybWlzc2lvbnM6W1xcXFxzXFxcXFNdKylgLCAnbScpO1xuICBjb25zdCBpbmRlbnRQYXR0ZXJuID0gL1xcU3wkLztcbiAgY29uc3QgcGVybWlzc2lvbk5hbWVQYXR0ZXJuID0gL2FuZHJvaWRcXC5cXHcqXFwuP3Blcm1pc3Npb25cXC5cXHcrLztcbiAgY29uc3QgZ3JhbnRlZFN0YXRlUGF0dGVybiA9IC9cXGJncmFudGVkPShcXHcrKS87XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IGdyb3VwTmFtZSBvZiBncm91cE5hbWVzKSB7XG4gICAgY29uc3QgZ3JvdXBNYXRjaCA9IGdyb3VwUGF0dGVybkJ5TmFtZShncm91cE5hbWUpLmV4ZWMoZHVtcHN5c091dHB1dCk7XG4gICAgaWYgKCFncm91cE1hdGNoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBsaW5lcyA9IGdyb3VwTWF0Y2hbMV0uc3BsaXQoJ1xcbicpO1xuICAgIGlmIChsaW5lcy5sZW5ndGggPCAyKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCB0aXRsZUluZGVudCA9IGxpbmVzWzBdLnNlYXJjaChpbmRlbnRQYXR0ZXJuKTtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMuc2xpY2UoMSkpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRJbmRlbnQgPSBsaW5lLnNlYXJjaChpbmRlbnRQYXR0ZXJuKTtcbiAgICAgIGlmIChjdXJyZW50SW5kZW50IDw9IHRpdGxlSW5kZW50KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwZXJtaXNzaW9uTmFtZU1hdGNoID0gcGVybWlzc2lvbk5hbWVQYXR0ZXJuLmV4ZWMobGluZSk7XG4gICAgICBpZiAoIXBlcm1pc3Npb25OYW1lTWF0Y2gpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBpdGVtID0ge1xuICAgICAgICBwZXJtaXNzaW9uOiBwZXJtaXNzaW9uTmFtZU1hdGNoWzBdLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGdyYW50ZWRTdGF0ZU1hdGNoID0gZ3JhbnRlZFN0YXRlUGF0dGVybi5leGVjKGxpbmUpO1xuICAgICAgaWYgKGdyYW50ZWRTdGF0ZU1hdGNoKSB7XG4gICAgICAgIGl0ZW0uZ3JhbnRlZCA9IGdyYW50ZWRTdGF0ZU1hdGNoWzFdID09PSAndHJ1ZSc7XG4gICAgICB9XG4gICAgICByZXN1bHQucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBmaWx0ZXJlZFJlc3VsdCA9IHJlc3VsdFxuICAgIC5maWx0ZXIoKGl0ZW0pID0+ICFfLmlzQm9vbGVhbihncmFudGVkU3RhdGUpIHx8IGl0ZW0uZ3JhbnRlZCA9PT0gZ3JhbnRlZFN0YXRlKVxuICAgIC5tYXAoKGl0ZW0pID0+IGl0ZW0ucGVybWlzc2lvbik7XG4gIGxvZy5kZWJ1ZyhgUmV0cmlldmVkICR7dXRpbC5wbHVyYWxpemUoJ3Blcm1pc3Npb24nLCBmaWx0ZXJlZFJlc3VsdC5sZW5ndGgsIHRydWUpfSBgICtcbiAgICBgZnJvbSAke2dyb3VwTmFtZXN9ICR7dXRpbC5wbHVyYWxpemUoJ2dyb3VwJywgZ3JvdXBOYW1lcy5sZW5ndGgsIGZhbHNlKX1gKTtcbiAgcmV0dXJuIGZpbHRlcmVkUmVzdWx0O1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBJbnN0YWxsT3B0aW9uc1xuICogQHByb3BlcnR5IHtib29sZWFufSBhbGxvd1Rlc3RQYWNrYWdlcyBbZmFsc2VdIC0gU2V0IHRvIHRydWUgaW4gb3JkZXIgdG8gYWxsb3cgdGVzdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZXMgaW5zdGFsbGF0aW9uLlxuICogQHByb3BlcnR5IHtib29sZWFufSB1c2VTZGNhcmQgW2ZhbHNlXSAtIFNldCB0byB0cnVlIHRvIGluc3RhbGwgdGhlIGFwcCBvbiBzZGNhcmRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0ZWFkIG9mIHRoZSBkZXZpY2UgbWVtb3J5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBncmFudFBlcm1pc3Npb25zIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSBpbiBvcmRlciB0byBncmFudCBhbGwgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zIHJlcXVlc3RlZCBpbiB0aGUgYXBwbGljYXRpb24ncyBtYW5pZmVzdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IGFmdGVyIHRoZSBpbnN0YWxsYXRpb24gaXMgY29tcGxldGVkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVyIEFuZHJvaWQgNisuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHJlcGxhY2UgW3RydWVdIC0gU2V0IGl0IHRvIGZhbHNlIGlmIHlvdSBkb24ndCB3YW50XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIHVwZ3JhZGVkL3JlaW5zdGFsbGVkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgaXQgaXMgYWxyZWFkeSBwcmVzZW50IG9uIHRoZSBkZXZpY2UuXG4gKi9cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIGdpdmVuIG9wdGlvbnMgaW50byB0aGUgbGlzdCBvZiBgYWRiIGluc3RhbGwuaW5zdGFsbC1tdWx0aXBsZWAgY29tbWFuZCBhcmd1bWVudHNcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gYXBpTGV2ZWwgLSBUaGUgY3VycmVudCBBUEkgbGV2ZWxcbiAqIEBwYXJhbSB7P0luc3RhbGxPcHRpb25zfSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgbWFwcGluZyB0byB0cmFuc2Zvcm1cbiAqIEByZXR1cm5zIHtBcnJheTxTdHJpbmc+fSBUaGUgYXJyYXkgb2YgYXJndW1lbnRzXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkSW5zdGFsbEFyZ3MgKGFwaUxldmVsLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG5cbiAgaWYgKCF1dGlsLmhhc1ZhbHVlKG9wdGlvbnMucmVwbGFjZSkgfHwgb3B0aW9ucy5yZXBsYWNlKSB7XG4gICAgcmVzdWx0LnB1c2goJy1yJyk7XG4gIH1cbiAgaWYgKG9wdGlvbnMuYWxsb3dUZXN0UGFja2FnZXMpIHtcbiAgICByZXN1bHQucHVzaCgnLXQnKTtcbiAgfVxuICBpZiAob3B0aW9ucy51c2VTZGNhcmQpIHtcbiAgICByZXN1bHQucHVzaCgnLXMnKTtcbiAgfVxuICBpZiAob3B0aW9ucy5ncmFudFBlcm1pc3Npb25zKSB7XG4gICAgaWYgKGFwaUxldmVsIDwgMjMpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgU2tpcHBpbmcgcGVybWlzc2lvbnMgZ3JhbnQgb3B0aW9uLCBzaW5jZSBgICtcbiAgICAgICAgICAgICAgICBgdGhlIGN1cnJlbnQgQVBJIGxldmVsICR7YXBpTGV2ZWx9IGRvZXMgbm90IHN1cHBvcnQgYXBwbGljYXRpb25zIGAgK1xuICAgICAgICAgICAgICAgIGBwZXJtaXNzaW9ucyBjdXN0b21pemF0aW9uYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5wdXNoKCctZycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTWFuaWZlc3RJbmZvXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGtnIC0gVGhlIGFwcGxpY2F0aW9uIGlkZW50aWZpZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhY3Rpdml0eSAtIFRoZSBuYW1lIG9mIHRoZSBtYWluIHBhY2thZ2UgYWN0aXZpdHlcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gdmVyc2lvbkNvZGUgLSBUaGUgdmVyc2lvbiBjb2RlIG51bWJlciAobWlnaHQgYmUgYE5hTmApXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHZlcnNpb25OYW1lIC0gVGhlIHZlcnNpb24gbmFtZSAobWlnaHQgYmUgYG51bGxgKVxuICovXG5cbi8qKlxuICogUGVyZm9ybSBwYXJzaW5nIG9mIHRoZSBtYW5pZmVzdCBvYmplY3QgaW4gb3JkZXJcbiAqIHRvIGV4dHJhY3Qgc29tZSB2aXRhbCB2YWx1ZXMgZnJvbSBpdFxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBtYW5pZmVzdCBUaGUgbWFuaWZlc3QgY29udGVudCBmb3JtYXR0ZWQgYXMgSlNPTlxuICogU2VlIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2FkYmtpdC1hcGtyZWFkZXIgZm9yIGRldGFpbGVkIGZvcm1hdCBkZXNjcmlwdGlvblxuICogQHJldHVybnMge01hbmlmZXN0SW5mb31cbiAqL1xuZnVuY3Rpb24gcGFyc2VNYW5pZmVzdCAobWFuaWZlc3QpIHtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIHBrZzogbWFuaWZlc3QucGFja2FnZSxcbiAgICB2ZXJzaW9uQ29kZTogcGFyc2VJbnQobWFuaWZlc3QudmVyc2lvbkNvZGUsIDEwKSxcbiAgICB2ZXJzaW9uTmFtZTogbWFuaWZlc3QudmVyc2lvbk5hbWUgfHwgbnVsbCxcbiAgfTtcbiAgaWYgKCFtYW5pZmVzdC5hcHBsaWNhdGlvbikge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBMb29rIGZvciBlbmFibGVkIGFjdGl2aXR5IG9yIGFjdGl2aXR5LWFsaWFzIHdpdGhcbiAgLy8gYWN0aW9uID09IGFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIGFuZFxuICAvLyBjYXRlZ29yeSA9PSBhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUlxuICBmb3IgKGNvbnN0IGFjdGl2aXR5IG9mIFtcbiAgICAuLi5tYW5pZmVzdC5hcHBsaWNhdGlvbi5hY3Rpdml0aWVzLFxuICAgIC4uLm1hbmlmZXN0LmFwcGxpY2F0aW9uLmFjdGl2aXR5QWxpYXNlcyxcbiAgXSkge1xuICAgIGlmIChhY3Rpdml0eS5lbmFibGVkID09PSBmYWxzZSB8fCBfLmlzRW1wdHkoYWN0aXZpdHkuaW50ZW50RmlsdGVycykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qge2FjdGlvbnMsIGNhdGVnb3JpZXN9IG9mIGFjdGl2aXR5LmludGVudEZpbHRlcnMpIHtcbiAgICAgIGlmIChfLmlzRW1wdHkoYWN0aW9ucykgfHwgXy5pc0VtcHR5KGNhdGVnb3JpZXMpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpc01haW5BY3Rpb24gPSBhY3Rpb25zXG4gICAgICAgIC5zb21lKCh7bmFtZX0pID0+IG5hbWUgPT09ICdhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTicpO1xuICAgICAgY29uc3QgaXNMYXVuY2hlckNhdGVnb3J5ID0gY2F0ZWdvcmllc1xuICAgICAgICAuc29tZSgoe25hbWV9KSA9PiBuYW1lID09PSAnYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVInKTtcbiAgICAgIGlmIChpc01haW5BY3Rpb24gJiYgaXNMYXVuY2hlckNhdGVnb3J5KSB7XG4gICAgICAgIHJlc3VsdC5hY3Rpdml0eSA9IGFjdGl2aXR5Lm5hbWU7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogUGFyc2VzIGFwayBzdHJpbmdzIGZyb20gYWFwdCB0b29sIG91dHB1dFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByYXdPdXRwdXQgVGhlIGFjdHVhbCB0b29sIG91dHB1dFxuICogQHBhcmFtIHtzdHJpbmd9IGNvbmZpZ01hcmtlciBUaGUgY29uZmlnIG1hcmtlci4gVXN1YWxseVxuICogYSBsYW5ndWFnZSBhYmJyZXZpYXRpb24gb3IgYChkZWZhdWx0KWBcbiAqIEByZXR1cm5zIHtPYmplY3R9IFN0cmluZ3MgaWRzIHRvIHZhbHVlcyBtYXBwaW5nLiBQbHVyYWxcbiAqIHZhbHVlcyBhcmUgcmVwcmVzZW50ZWQgYXMgYXJyYXlzLiBJZiBubyBjb25maWcgZm91bmQgZm9yIHRoZVxuICogZ2l2ZW4gbWFya2VyIHRoZW4gYW4gZW1wdHkgbWFwcGluZyBpcyByZXR1cm5lZC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VBYXB0U3RyaW5ncyAocmF3T3V0cHV0LCBjb25maWdNYXJrZXIpIHtcbiAgY29uc3Qgbm9ybWFsaXplU3RyaW5nTWF0Y2ggPSBmdW5jdGlvbiAocykge1xuICAgIHJldHVybiBzLnJlcGxhY2UoL1wiJC8sICcnKS5yZXBsYWNlKC9eXCIvLCAnJykucmVwbGFjZSgvXFxcXFwiL2csICdcIicpO1xuICB9O1xuXG4gIGNvbnN0IGFwa1N0cmluZ3MgPSB7fTtcbiAgbGV0IGlzSW5Db25maWcgPSBmYWxzZTtcbiAgbGV0IGN1cnJlbnRSZXNvdXJjZUlkID0gbnVsbDtcbiAgbGV0IGlzSW5QbHVyYWxHcm91cCA9IGZhbHNlO1xuICAvLyBUaGUgcGF0dGVybiBtYXRjaGVzIGFueSBxdW90ZWQgY29udGVudCBpbmNsdWRpbmcgZXNjYXBlZCBxdW90ZXNcbiAgY29uc3QgcXVvdGVkU3RyaW5nUGF0dGVybiA9IC9cIlteXCJcXFxcXSooPzpcXFxcLlteXCJcXFxcXSopKlwiLztcbiAgZm9yIChjb25zdCBsaW5lIG9mIHJhd091dHB1dC5zcGxpdChvcy5FT0wpKSB7XG4gICAgY29uc3QgdHJpbW1lZExpbmUgPSBsaW5lLnRyaW0oKTtcbiAgICBpZiAoXy5pc0VtcHR5KHRyaW1tZWRMaW5lKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKFsnY29uZmlnJywgJ3R5cGUnLCAnc3BlYycsICdQYWNrYWdlJ10uc29tZSgoeCkgPT4gdHJpbW1lZExpbmUuc3RhcnRzV2l0aCh4KSkpIHtcbiAgICAgIGlzSW5Db25maWcgPSB0cmltbWVkTGluZS5zdGFydHNXaXRoKGBjb25maWcgJHtjb25maWdNYXJrZXJ9OmApO1xuICAgICAgY3VycmVudFJlc291cmNlSWQgPSBudWxsO1xuICAgICAgaXNJblBsdXJhbEdyb3VwID0gZmFsc2U7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoIWlzSW5Db25maWcpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICh0cmltbWVkTGluZS5zdGFydHNXaXRoKCdyZXNvdXJjZScpKSB7XG4gICAgICBpc0luUGx1cmFsR3JvdXAgPSBmYWxzZTtcbiAgICAgIGN1cnJlbnRSZXNvdXJjZUlkID0gbnVsbDtcblxuICAgICAgaWYgKHRyaW1tZWRMaW5lLmluY2x1ZGVzKCc6c3RyaW5nLycpKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gLzpzdHJpbmdcXC8oXFxTKyk6Ly5leGVjKHRyaW1tZWRMaW5lKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgY3VycmVudFJlc291cmNlSWQgPSBtYXRjaFsxXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0cmltbWVkTGluZS5pbmNsdWRlcygnOnBsdXJhbHMvJykpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSAvOnBsdXJhbHNcXC8oXFxTKyk6Ly5leGVjKHRyaW1tZWRMaW5lKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgY3VycmVudFJlc291cmNlSWQgPSBtYXRjaFsxXTtcbiAgICAgICAgICBpc0luUGx1cmFsR3JvdXAgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFJlc291cmNlSWQgJiYgdHJpbW1lZExpbmUuc3RhcnRzV2l0aCgnKHN0cmluZycpKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IHF1b3RlZFN0cmluZ1BhdHRlcm4uZXhlYyh0cmltbWVkTGluZSk7XG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgYXBrU3RyaW5nc1tjdXJyZW50UmVzb3VyY2VJZF0gPSBub3JtYWxpemVTdHJpbmdNYXRjaChtYXRjaFswXSk7XG4gICAgICB9XG4gICAgICBjdXJyZW50UmVzb3VyY2VJZCA9IG51bGw7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFJlc291cmNlSWQgJiYgaXNJblBsdXJhbEdyb3VwICYmIHRyaW1tZWRMaW5lLmluY2x1ZGVzKCc6IChzdHJpbmcnKSkge1xuICAgICAgY29uc3QgbWF0Y2ggPSBxdW90ZWRTdHJpbmdQYXR0ZXJuLmV4ZWModHJpbW1lZExpbmUpO1xuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIGFwa1N0cmluZ3NbY3VycmVudFJlc291cmNlSWRdID0gW1xuICAgICAgICAgIC4uLihhcGtTdHJpbmdzW2N1cnJlbnRSZXNvdXJjZUlkXSB8fCBbXSksXG4gICAgICAgICAgbm9ybWFsaXplU3RyaW5nTWF0Y2gobWF0Y2hbMF0pLFxuICAgICAgICBdO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBhcGtTdHJpbmdzO1xufVxuXG4vKipcbiAqIFBhcnNlcyBhcGsgc3RyaW5ncyBmcm9tIGFhcHQyIHRvb2wgb3V0cHV0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJhd091dHB1dCBUaGUgYWN0dWFsIHRvb2wgb3V0cHV0XG4gKiBAcGFyYW0ge3N0cmluZ30gY29uZmlnTWFya2VyIFRoZSBjb25maWcgbWFya2VyLiBVc3VhbGx5XG4gKiBhIGxhbmd1YWdlIGFiYnJldmlhdGlvbiBvciBhbiBlbXB0eSBzdHJpbmcgZm9yIHRoZSBkZWZhdWx0IG9uZVxuICogQHJldHVybnMge09iamVjdH0gU3RyaW5ncyBpZHMgdG8gdmFsdWVzIG1hcHBpbmcuIFBsdXJhbFxuICogdmFsdWVzIGFyZSByZXByZXNlbnRlZCBhcyBhcnJheXMuIElmIG5vIGNvbmZpZyBmb3VuZCBmb3IgdGhlXG4gKiBnaXZlbiBtYXJrZXIgdGhlbiBhbiBlbXB0eSBtYXBwaW5nIGlzIHJldHVybmVkLlxuICovXG5mdW5jdGlvbiBwYXJzZUFhcHQyU3RyaW5ncyAocmF3T3V0cHV0LCBjb25maWdNYXJrZXIpIHtcbiAgY29uc3QgYWxsTGluZXMgPSByYXdPdXRwdXQuc3BsaXQob3MuRU9MKTtcbiAgZnVuY3Rpb24gZXh0cmFjdENvbnRlbnQgKHN0YXJ0SWR4KSB7XG4gICAgbGV0IGlkeCA9IHN0YXJ0SWR4O1xuICAgIGNvbnN0IHN0YXJ0Q2hhclBvcyA9IGFsbExpbmVzW3N0YXJ0SWR4XS5pbmRleE9mKCdcIicpO1xuICAgIGlmIChzdGFydENoYXJQb3MgPCAwKSB7XG4gICAgICByZXR1cm4gW251bGwsIGlkeF07XG4gICAgfVxuICAgIGxldCByZXN1bHQgPSAnJztcbiAgICB3aGlsZSAoaWR4IDwgYWxsTGluZXMubGVuZ3RoKSB7XG4gICAgICBjb25zdCB0ZXJtaW5hdGlvbkNoYXJNYXRjaCA9IC9cIiQvLmV4ZWMoYWxsTGluZXNbaWR4XSk7XG4gICAgICBpZiAodGVybWluYXRpb25DaGFyTWF0Y2gpIHtcbiAgICAgICAgY29uc3QgdGVybWluYXRpb25DaGFyUG9zID0gdGVybWluYXRpb25DaGFyTWF0Y2guaW5kZXg7XG4gICAgICAgIGlmIChzdGFydElkeCA9PT0gaWR4KSB7XG4gICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIGFsbExpbmVzW2lkeF0uc3Vic3RyaW5nKHN0YXJ0Q2hhclBvcyArIDEsIHRlcm1pbmF0aW9uQ2hhclBvcyksXG4gICAgICAgICAgICBpZHhcbiAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgYCR7cmVzdWx0fVxcXFxuJHtfLnRyaW1TdGFydChhbGxMaW5lc1tpZHhdLnN1YnN0cmluZygwLCB0ZXJtaW5hdGlvbkNoYXJQb3MpKX1gLFxuICAgICAgICAgIGlkeCxcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICAgIGlmIChpZHggPiBzdGFydElkeCkge1xuICAgICAgICByZXN1bHQgKz0gYFxcXFxuJHtfLnRyaW1TdGFydChhbGxMaW5lc1tpZHhdKX1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ICs9IGFsbExpbmVzW2lkeF0uc3Vic3RyaW5nKHN0YXJ0Q2hhclBvcyArIDEpO1xuICAgICAgfVxuICAgICAgKytpZHg7XG4gICAgfVxuICAgIHJldHVybiBbcmVzdWx0LCBpZHhdO1xuICB9XG5cbiAgY29uc3QgYXBrU3RyaW5ncyA9IHt9O1xuICBsZXQgY3VycmVudFJlc291cmNlSWQgPSBudWxsO1xuICBsZXQgaXNJblBsdXJhbEdyb3VwID0gZmFsc2U7XG4gIGxldCBpc0luQ3VycmVudENvbmZpZyA9IGZhbHNlO1xuICBsZXQgbGluZUluZGV4ID0gMDtcbiAgd2hpbGUgKGxpbmVJbmRleCA8IGFsbExpbmVzLmxlbmd0aCkge1xuICAgIGNvbnN0IHRyaW1tZWRMaW5lID0gYWxsTGluZXNbbGluZUluZGV4XS50cmltKCk7XG4gICAgaWYgKF8uaXNFbXB0eSh0cmltbWVkTGluZSkpIHtcbiAgICAgICsrbGluZUluZGV4O1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKFsndHlwZScsICdQYWNrYWdlJ10uc29tZSgoeCkgPT4gdHJpbW1lZExpbmUuc3RhcnRzV2l0aCh4KSkpIHtcbiAgICAgIGN1cnJlbnRSZXNvdXJjZUlkID0gbnVsbDtcbiAgICAgIGlzSW5QbHVyYWxHcm91cCA9IGZhbHNlO1xuICAgICAgaXNJbkN1cnJlbnRDb25maWcgPSBmYWxzZTtcbiAgICAgICsrbGluZUluZGV4O1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHRyaW1tZWRMaW5lLnN0YXJ0c1dpdGgoJ3Jlc291cmNlJykpIHtcbiAgICAgIGlzSW5QbHVyYWxHcm91cCA9IGZhbHNlO1xuICAgICAgY3VycmVudFJlc291cmNlSWQgPSBudWxsO1xuICAgICAgaXNJbkN1cnJlbnRDb25maWcgPSBmYWxzZTtcblxuICAgICAgaWYgKHRyaW1tZWRMaW5lLmluY2x1ZGVzKCdzdHJpbmcvJykpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSAvc3RyaW5nXFwvKFxcUyspLy5leGVjKHRyaW1tZWRMaW5lKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgY3VycmVudFJlc291cmNlSWQgPSBtYXRjaFsxXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0cmltbWVkTGluZS5pbmNsdWRlcygncGx1cmFscy8nKSkge1xuICAgICAgICBjb25zdCBtYXRjaCA9IC9wbHVyYWxzXFwvKFxcUyspLy5leGVjKHRyaW1tZWRMaW5lKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgY3VycmVudFJlc291cmNlSWQgPSBtYXRjaFsxXTtcbiAgICAgICAgICBpc0luUGx1cmFsR3JvdXAgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICArK2xpbmVJbmRleDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50UmVzb3VyY2VJZCkge1xuICAgICAgaWYgKGlzSW5QbHVyYWxHcm91cCkge1xuICAgICAgICBpZiAodHJpbW1lZExpbmUuc3RhcnRzV2l0aCgnKCcpKSB7XG4gICAgICAgICAgaXNJbkN1cnJlbnRDb25maWcgPSB0cmltbWVkTGluZS5zdGFydHNXaXRoKGAoJHtjb25maWdNYXJrZXJ9KWApO1xuICAgICAgICAgICsrbGluZUluZGV4O1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0luQ3VycmVudENvbmZpZykge1xuICAgICAgICAgIGNvbnN0IFtjb250ZW50LCBpZHhdID0gZXh0cmFjdENvbnRlbnQobGluZUluZGV4KTtcbiAgICAgICAgICBsaW5lSW5kZXggPSBpZHg7XG4gICAgICAgICAgaWYgKF8uaXNTdHJpbmcoY29udGVudCkpIHtcbiAgICAgICAgICAgIGFwa1N0cmluZ3NbY3VycmVudFJlc291cmNlSWRdID0gW1xuICAgICAgICAgICAgICAuLi4oYXBrU3RyaW5nc1tjdXJyZW50UmVzb3VyY2VJZF0gfHwgW10pLFxuICAgICAgICAgICAgICBjb250ZW50LFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHJpbW1lZExpbmUuc3RhcnRzV2l0aChgKCR7Y29uZmlnTWFya2VyfSlgKSkge1xuICAgICAgICBjb25zdCBbY29udGVudCwgaWR4XSA9IGV4dHJhY3RDb250ZW50KGxpbmVJbmRleCk7XG4gICAgICAgIGxpbmVJbmRleCA9IGlkeDtcbiAgICAgICAgaWYgKF8uaXNTdHJpbmcoY29udGVudCkpIHtcbiAgICAgICAgICBhcGtTdHJpbmdzW2N1cnJlbnRSZXNvdXJjZUlkXSA9IGNvbnRlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudFJlc291cmNlSWQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICArK2xpbmVJbmRleDtcbiAgfVxuICByZXR1cm4gYXBrU3RyaW5ncztcbn1cblxuLyoqXG4gKiBGb3JtYXRzIHRoZSBjb25maWcgbWFya2VyLCB3aGljaCBpcyB0aGVuIHBhc3NlZCB0byBwYXJzZS4uIG1ldGhvZHNcbiAqIHRvIG1ha2UgaXQgY29tcGF0aWJsZSB3aXRoIHJlc291cmNlIGZvcm1hdHMgZ2VuZXJhdGVkIGJ5IGFhcHQoMikgdG9vbFxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbmZpZ3NHZXR0ZXIgVGhlIGZ1bmN0aW9uIHdob3NlIHJlc3VsdCBpcyBhIGxpc3RcbiAqIG9mIGFwayBjb25maWdzXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzaXJlZE1hcmtlciBUaGUgZGVzaXJlZCBjb25maWcgbWFya2VyIHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVmYXVsdE1hcmtlciBUaGUgZGVmYXVsdCBjb25maWcgbWFya2VyIHZhbHVlXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBmb3JtYXR0ZWQgY29uZmlnIG1hcmtlclxuICovXG5hc3luYyBmdW5jdGlvbiBmb3JtYXRDb25maWdNYXJrZXIgKGNvbmZpZ3NHZXR0ZXIsIGRlc2lyZWRNYXJrZXIsIGRlZmF1bHRNYXJrZXIpIHtcbiAgbGV0IGNvbmZpZ01hcmtlciA9IGRlc2lyZWRNYXJrZXIgfHwgZGVmYXVsdE1hcmtlcjtcbiAgaWYgKGNvbmZpZ01hcmtlci5pbmNsdWRlcygnLScpICYmICFjb25maWdNYXJrZXIuaW5jbHVkZXMoJy1yJykpIHtcbiAgICBjb25maWdNYXJrZXIgPSBjb25maWdNYXJrZXIucmVwbGFjZSgnLScsICctcicpO1xuICB9XG4gIGNvbnN0IGNvbmZpZ3MgPSBhd2FpdCBjb25maWdzR2V0dGVyKCk7XG4gIGxvZy5kZWJ1ZyhgUmVzb3VyY2UgY29uZmlndXJhdGlvbnM6ICR7SlNPTi5zdHJpbmdpZnkoY29uZmlncyl9YCk7XG4gIC8vIEFzc3VtZSB0aGUgJ2VuJyBjb25maWd1cmF0aW9uIGlzIHRoZSBkZWZhdWx0IG9uZVxuICBpZiAoY29uZmlnTWFya2VyLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgnZW4nKVxuICAgICYmICFjb25maWdzLnNvbWUoKHgpID0+IHgudHJpbSgpID09PSBjb25maWdNYXJrZXIpKSB7XG4gICAgbG9nLmRlYnVnKGBSZXNvdXJjZSBjb25maWd1cmF0aW9uIG5hbWUgJyR7Y29uZmlnTWFya2VyfScgaXMgdW5rbm93bi4gYCArXG4gICAgICBgUmVwbGFjaW5nIGl0IHdpdGggJyR7ZGVmYXVsdE1hcmtlcn0nYCk7XG4gICAgY29uZmlnTWFya2VyID0gZGVmYXVsdE1hcmtlcjtcbiAgfSBlbHNlIHtcbiAgICBsb2cuZGVidWcoYFNlbGVjdGVkIGNvbmZpZ3VyYXRpb246ICcke2NvbmZpZ01hcmtlcn0nYCk7XG4gIH1cbiAgcmV0dXJuIGNvbmZpZ01hcmtlcjtcbn1cblxuLyoqXG4gKiBQYXJzZXMgdGhlIG91dHB1dCBpbiBKU09OIGZvcm1hdCByZXRyaWV2ZWQgZnJvbVxuICogdGhlIGNvcnJlc3BvbmRpbmcgQXBwaXVtIFNldHRpbmdzIGJyb2FkY2FzdCBjYWxsc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBvdXRwdXQgVGhlIGFjdHVhbCBjb21tYW5kIG91dHB1dFxuICogQHBhcmFtIHtzdHJpbmd9IGVudGl0eU5hbWUgVGhlIG5hbWUgb2YgdGhlIGVudGl0eSB3aGljaCBpc1xuICogZ29pbmcgdG8gYmUgcGFyc2VkXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgcGFyc2VkIEpTT04gb2JqZWN0XG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIG91dHB1dCBjYW5ub3QgYmUgcGFyc2VkXG4gKiBhcyBhIHZhbGlkIEpTT05cbiAqL1xuZnVuY3Rpb24gcGFyc2VKc29uRGF0YSAob3V0cHV0LCBlbnRpdHlOYW1lKSB7XG4gIGlmICghL1xcYnJlc3VsdD0tMVxcYi8udGVzdChvdXRwdXQpIHx8ICEvXFxiZGF0YT1cIi8udGVzdChvdXRwdXQpKSB7XG4gICAgbG9nLmRlYnVnKG91dHB1dCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmV0cmlldmUgJHtlbnRpdHlOYW1lfSBmcm9tIHRoZSBkZXZpY2UuIGAgK1xuICAgICAgJ0NoZWNrIHRoZSBzZXJ2ZXIgbG9nIGZvciBtb3JlIGRldGFpbHMnKTtcbiAgfVxuICBjb25zdCBtYXRjaCA9IC9cXGJkYXRhPShcIi4rKS8uZXhlYyhvdXRwdXQpO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgbG9nLmRlYnVnKG91dHB1dCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcGFyc2UgJHtlbnRpdHlOYW1lfSBmcm9tIHRoZSBjb21tYW5kIG91dHB1dC4gYCArXG4gICAgICAnQ2hlY2sgdGhlIHNlcnZlciBsb2cgZm9yIG1vcmUgZGV0YWlscycpO1xuICB9XG4gIGNvbnN0IGpzb25TdHIgPSBfLnRyaW0obWF0Y2hbMV0pLnJlcGxhY2UoLyheXCIpfChcIiQpL2csICcnKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShqc29uU3RyKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy5kZWJ1Zyhqc29uU3RyKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBwYXJzZSAke2VudGl0eU5hbWV9IGZyb20gdGhlIHJlc3VsdGluZyBkYXRhIHN0cmluZy4gYCArXG4gICAgICAnQ2hlY2sgdGhlIHNlcnZlciBsb2cgZm9yIG1vcmUgZGV0YWlscycpO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIGdldEFuZHJvaWRQbGF0Zm9ybUFuZFBhdGgsIHVuemlwRmlsZSxcbiAgZ2V0SU1FTGlzdEZyb21PdXRwdXQsIGdldEphdmFGb3JPcywgaXNTaG93aW5nTG9ja3NjcmVlbiwgaXNDdXJyZW50Rm9jdXNPbktleWd1YXJkLFxuICBnZXRTdXJmYWNlT3JpZW50YXRpb24sIGlzU2NyZWVuT25GdWxseSwgYnVpbGRTdGFydENtZCwgZ2V0SmF2YUhvbWUsXG4gIHJvb3REaXIsIGdldFNka1Rvb2xzVmVyc2lvbiwgZ2V0QXBrc2lnbmVyRm9yT3MsIGdldEJ1aWxkVG9vbHNEaXJzLFxuICBnZXRBcGthbmFseXplckZvck9zLCBnZXRPcGVuU3NsRm9yT3MsIGV4dHJhY3RNYXRjaGluZ1Blcm1pc3Npb25zLCBBUEtTX0VYVEVOU0lPTixcbiAgQVBLX0lOU1RBTExfVElNRU9VVCwgQVBLU19JTlNUQUxMX1RJTUVPVVQsIGJ1aWxkSW5zdGFsbEFyZ3MsIEFQS19FWFRFTlNJT04sXG4gIERFRkFVTFRfQURCX0VYRUNfVElNRU9VVCwgcGFyc2VNYW5pZmVzdCwgcGFyc2VBYXB0U3RyaW5ncywgcGFyc2VBYXB0MlN0cmluZ3MsXG4gIGZvcm1hdENvbmZpZ01hcmtlciwgcGFyc2VKc29uRGF0YSwgdW5zaWduQXBrLFxufTtcbiJdLCJmaWxlIjoibGliL2hlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==