appium-adb 9.10.11 → 9.10.13

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 (35) hide show
  1. package/build/index.js +1 -5
  2. package/build/lib/adb.js +1 -26
  3. package/build/lib/adb.js.map +1 -1
  4. package/build/lib/helpers.js +7 -211
  5. package/build/lib/helpers.js.map +1 -1
  6. package/build/lib/logcat.js +1 -46
  7. package/build/lib/logcat.js.map +1 -1
  8. package/build/lib/logger.js +1 -5
  9. package/build/lib/logger.js.map +1 -1
  10. package/build/lib/tools/aab-utils.js +1 -42
  11. package/build/lib/tools/aab-utils.js.map +1 -1
  12. package/build/lib/tools/adb-commands.js +6 -163
  13. package/build/lib/tools/adb-commands.js.map +1 -1
  14. package/build/lib/tools/adb-emu-commands.js +2 -66
  15. package/build/lib/tools/adb-emu-commands.js.map +1 -1
  16. package/build/lib/tools/android-manifest.js +1 -60
  17. package/build/lib/tools/android-manifest.js.map +1 -1
  18. package/build/lib/tools/apk-signing.js +1 -77
  19. package/build/lib/tools/apk-signing.js.map +1 -1
  20. package/build/lib/tools/apk-utils.js +4 -229
  21. package/build/lib/tools/apk-utils.js.map +1 -1
  22. package/build/lib/tools/apks-utils.js +1 -53
  23. package/build/lib/tools/apks-utils.js.map +1 -1
  24. package/build/lib/tools/index.js +1 -17
  25. package/build/lib/tools/index.js.map +1 -1
  26. package/build/lib/tools/keyboard-commands.js +1 -12
  27. package/build/lib/tools/keyboard-commands.js.map +1 -1
  28. package/build/lib/tools/lockmgmt.js +1 -46
  29. package/build/lib/tools/lockmgmt.js.map +1 -1
  30. package/build/lib/tools/settings-client-commands.js +3 -71
  31. package/build/lib/tools/settings-client-commands.js.map +1 -1
  32. package/build/lib/tools/system-calls.js +5 -190
  33. package/build/lib/tools/system-calls.js.map +1 -1
  34. package/lib/tools/settings-client-commands.js +2 -2
  35. package/package.json +1 -1
@@ -1,34 +1,21 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.default = void 0;
9
-
10
8
  require("source-map-support/register");
11
-
12
9
  var _logger = _interopRequireDefault(require("../logger.js"));
13
-
14
10
  var _helpers = require("../helpers.js");
15
-
16
11
  var _path = _interopRequireDefault(require("path"));
17
-
18
12
  var _lodash = _interopRequireDefault(require("lodash"));
19
-
20
13
  var _support = require("@appium/support");
21
-
22
14
  var _os = require("os");
23
-
24
15
  var _logcat = _interopRequireDefault(require("../logcat"));
25
-
26
16
  var _asyncbox = require("asyncbox");
27
-
28
17
  var _teen_process = require("teen_process");
29
-
30
18
  var _bluebird = _interopRequireDefault(require("bluebird"));
31
-
32
19
  const MAX_SHELL_BUFFER_LENGTH = 1000;
33
20
  const NOT_CHANGEABLE_PERM_ERROR = /not a changeable permission type/i;
34
21
  const IGNORED_PERM_ERRORS = [NOT_CHANGEABLE_PERM_ERROR, /Unknown permission/i];
@@ -43,34 +30,25 @@ const methods = {};
43
30
  methods.shellChunks = async function shellChunks(argTransformer, args) {
44
31
  const commands = [];
45
32
  let cmdChunk = [];
46
-
47
33
  for (const arg of args) {
48
34
  const nextCmd = argTransformer(arg);
49
-
50
35
  if (!_lodash.default.isArray(nextCmd)) {
51
36
  throw new Error('Argument transformer must result in an array');
52
37
  }
53
-
54
38
  if (_lodash.default.last(nextCmd) !== ';') {
55
39
  nextCmd.push(';');
56
40
  }
57
-
58
41
  if (nextCmd.join(' ').length + cmdChunk.join(' ').length >= MAX_SHELL_BUFFER_LENGTH) {
59
42
  commands.push(cmdChunk);
60
43
  cmdChunk = [];
61
44
  }
62
-
63
45
  cmdChunk = [...cmdChunk, ...nextCmd];
64
46
  }
65
-
66
47
  if (!_lodash.default.isEmpty(cmdChunk)) {
67
48
  commands.push(cmdChunk);
68
49
  }
69
-
70
50
  _logger.default.debug(`Got the following command chunks to execute: ${JSON.stringify(commands)}`);
71
-
72
51
  let lastError = null;
73
-
74
52
  for (const cmd of commands) {
75
53
  try {
76
54
  await this.shell(cmd);
@@ -78,7 +56,6 @@ methods.shellChunks = async function shellChunks(argTransformer, args) {
78
56
  lastError = e;
79
57
  }
80
58
  }
81
-
82
59
  if (lastError) {
83
60
  throw lastError;
84
61
  }
@@ -114,20 +91,16 @@ methods.getApiLevel = async function getApiLevel() {
114
91
  try {
115
92
  const strOutput = await this.getDeviceProperty('ro.build.version.sdk');
116
93
  let apiLevel = parseInt(strOutput.trim(), 10);
94
+
117
95
  const charCodeQ = 'q'.charCodeAt(0);
118
96
  const apiLevelDiff = apiLevel - 28;
119
97
  const codename = String.fromCharCode(charCodeQ + apiLevelDiff);
120
-
121
98
  if (apiLevelDiff >= 0 && (await this.getPlatformVersion()).toLowerCase() === codename) {
122
99
  _logger.default.debug(`Release version is ${codename.toUpperCase()} but found API Level ${apiLevel}. Setting API Level to ${apiLevel + 1}`);
123
-
124
100
  apiLevel++;
125
101
  }
126
-
127
102
  this._apiLevel = apiLevel;
128
-
129
103
  _logger.default.debug(`Device API level: ${this._apiLevel}`);
130
-
131
104
  if (isNaN(this._apiLevel)) {
132
105
  throw new Error(`The actual output '${strOutput}' cannot be converted to an integer`);
133
106
  }
@@ -135,13 +108,11 @@ methods.getApiLevel = async function getApiLevel() {
135
108
  throw new Error(`Error getting device API level. Original error: ${e.message}`);
136
109
  }
137
110
  }
138
-
139
111
  return this._apiLevel;
140
112
  };
141
113
 
142
114
  methods.getPlatformVersion = async function getPlatformVersion() {
143
115
  _logger.default.info('Getting device platform version');
144
-
145
116
  try {
146
117
  return await this.getDeviceProperty('ro.build.version.release');
147
118
  } catch (e) {
@@ -166,23 +137,17 @@ methods.resolveLaunchableActivity = async function resolveLaunchableActivity(pkg
166
137
  const {
167
138
  preferCmd = true
168
139
  } = opts;
169
-
170
140
  if (!preferCmd || (await this.getApiLevel()) < 24) {
171
141
  const stdout = await this.shell(['dumpsys', 'package', pkg]);
172
142
  const names = (0, _helpers.parseLaunchableActivityNames)(stdout);
173
-
174
143
  if (_lodash.default.isEmpty(names)) {
175
144
  _logger.default.debug(stdout);
176
-
177
145
  throw new Error(`Unable to resolve the launchable activity of '${pkg}'. Is it installed on the device?`);
178
146
  }
179
-
180
147
  if (names.length === 1) {
181
148
  return names[0];
182
149
  }
183
-
184
150
  const tmpRoot = await _support.tempDir.openDir();
185
-
186
151
  try {
187
152
  const tmpApp = await this.pullApk(pkg, tmpRoot);
188
153
  const {
@@ -191,28 +156,23 @@ methods.resolveLaunchableActivity = async function resolveLaunchableActivity(pkg
191
156
  return apkActivity;
192
157
  } catch (e) {
193
158
  _logger.default.debug(e.stack);
194
-
195
159
  _logger.default.warn(`Unable to resolve the launchable activity of '${pkg}'. ` + `The very first match of the dumpsys output is going to be used. ` + `Original error: ${e.message}`);
196
-
197
160
  return names[0];
198
161
  } finally {
199
162
  await _support.fs.rimraf(tmpRoot);
200
163
  }
201
164
  }
202
-
203
165
  const {
204
166
  stdout,
205
167
  stderr
206
168
  } = await this.shell(['cmd', 'package', 'resolve-activity', '--brief', pkg], {
207
169
  outputFormat: this.EXEC_OUTPUT_FORMAT.FULL
208
170
  });
209
-
210
171
  for (const line of (stdout || '').split('\n').map(_lodash.default.trim)) {
211
172
  if (this.isValidClass(line)) {
212
173
  return line;
213
174
  }
214
175
  }
215
-
216
176
  throw new Error(`Unable to resolve the launchable activity of '${pkg}'. Original error: ${stderr || stdout}`);
217
177
  };
218
178
 
@@ -232,7 +192,6 @@ methods.grantAllPermissions = async function grantAllPermissions(pkg, apk) {
232
192
  const apiLevel = await this.getApiLevel();
233
193
  let targetSdk = 0;
234
194
  let dumpsysOutput = null;
235
-
236
195
  try {
237
196
  if (!apk) {
238
197
  dumpsysOutput = await this.shell(['dumpsys', 'package', pkg]);
@@ -243,14 +202,11 @@ methods.grantAllPermissions = async function grantAllPermissions(pkg, apk) {
243
202
  } catch (e) {
244
203
  _logger.default.warn(`Ran into problem getting target SDK version; ignoring...`);
245
204
  }
246
-
247
205
  if (apiLevel >= MIN_API_LEVEL_WITH_PERMS_SUPPORT && targetSdk >= MIN_API_LEVEL_WITH_PERMS_SUPPORT) {
248
206
  dumpsysOutput = dumpsysOutput || (await this.shell(['dumpsys', 'package', pkg]));
249
207
  const requestedPermissions = await this.getReqPermissions(pkg, dumpsysOutput);
250
208
  const grantedPermissions = await this.getGrantedPermissions(pkg, dumpsysOutput);
251
-
252
209
  const permissionsToGrant = _lodash.default.difference(requestedPermissions, grantedPermissions);
253
-
254
210
  if (_lodash.default.isEmpty(permissionsToGrant)) {
255
211
  _logger.default.info(`${pkg} contains no permissions available for granting`);
256
212
  } else {
@@ -265,7 +221,6 @@ methods.grantAllPermissions = async function grantAllPermissions(pkg, apk) {
265
221
 
266
222
  methods.grantPermissions = async function grantPermissions(pkg, permissions) {
267
223
  _logger.default.debug(`Granting permissions ${JSON.stringify(permissions)} to '${pkg}'`);
268
-
269
224
  try {
270
225
  await this.shellChunks(perm => ['pm', 'grant', pkg, perm], permissions);
271
226
  } catch (e) {
@@ -297,21 +252,18 @@ methods.revokePermission = async function revokePermission(pkg, permission) {
297
252
 
298
253
  methods.getGrantedPermissions = async function getGrantedPermissions(pkg, cmdOutput = null) {
299
254
  _logger.default.debug('Retrieving granted permissions');
300
-
301
255
  const stdout = cmdOutput || (await this.shell(['dumpsys', 'package', pkg]));
302
256
  return (0, _helpers.extractMatchingPermissions)(stdout, ['install', 'runtime'], true);
303
257
  };
304
258
 
305
259
  methods.getDeniedPermissions = async function getDeniedPermissions(pkg, cmdOutput = null) {
306
260
  _logger.default.debug('Retrieving denied permissions');
307
-
308
261
  const stdout = cmdOutput || (await this.shell(['dumpsys', 'package', pkg]));
309
262
  return (0, _helpers.extractMatchingPermissions)(stdout, ['install', 'runtime'], false);
310
263
  };
311
264
 
312
265
  methods.getReqPermissions = async function getReqPermissions(pkg, cmdOutput = null) {
313
266
  _logger.default.debug('Retrieving requested permissions');
314
-
315
267
  const stdout = cmdOutput || (await this.shell(['dumpsys', 'package', pkg]));
316
268
  return (0, _helpers.extractMatchingPermissions)(stdout, ['requested']);
317
269
  };
@@ -332,7 +284,6 @@ methods.setHiddenApiPolicy = async function setHiddenApiPolicy(value, ignoreErro
332
284
  if (!ignoreError) {
333
285
  throw e;
334
286
  }
335
-
336
287
  _logger.default.info(`Failed to set setting keys '${HIDDEN_API_POLICY_KEYS}' to '${value}'. Original error: ${e.message}`);
337
288
  }
338
289
  };
@@ -344,7 +295,6 @@ methods.setDefaultHiddenApiPolicy = async function setDefaultHiddenApiPolicy(ign
344
295
  if (!ignoreError) {
345
296
  throw e;
346
297
  }
347
-
348
298
  _logger.default.info(`Failed to delete keys '${HIDDEN_API_POLICY_KEYS}'. Original error: ${e.message}`);
349
299
  }
350
300
  };
@@ -389,11 +339,9 @@ methods.setIME = async function setIME(imeId) {
389
339
  methods.defaultIME = async function defaultIME() {
390
340
  try {
391
341
  let engine = await this.getSetting('secure', 'default_input_method');
392
-
393
342
  if (engine === 'null') {
394
343
  return null;
395
344
  }
396
-
397
345
  return engine.trim();
398
346
  } catch (e) {
399
347
  throw new Error(`Error getting default IME. Original error: ${e.message}`);
@@ -409,52 +357,40 @@ methods.inputText = async function inputText(text) {
409
357
  if (text === '') {
410
358
  return;
411
359
  }
412
-
413
360
  const originalStr = `${text}`;
414
361
  const escapedText = originalStr.replace(/\$/g, '\\$').replace(/ /g, '%s');
415
362
  let args = ['input', 'text', originalStr];
416
363
  const adbInputEscapePattern = /[()<>|;&*\\~^"']/g;
417
-
418
364
  if (escapedText !== originalStr || adbInputEscapePattern.test(originalStr)) {
419
365
  if (_lodash.default.every(['"', `'`], c => originalStr.includes(c))) {
420
366
  throw new Error(`Did not know how to escape a string that contains both types of quotes (" and ')`);
421
367
  }
422
-
423
368
  const q = originalStr.includes('"') ? `'` : '"';
424
369
  args = [`input text ${q}${escapedText}${q}`];
425
370
  }
426
-
427
371
  await this.shell(args);
428
372
  };
429
373
 
430
374
  methods.clearTextField = async function clearTextField(length = 100) {
431
375
  _logger.default.debug(`Clearing up to ${length} characters`);
432
-
433
376
  if (length === 0) {
434
377
  return;
435
378
  }
436
-
437
379
  let args = ['input', 'keyevent'];
438
-
439
380
  for (let i = 0; i < length; i++) {
440
381
  args.push('67', '112');
441
382
  }
442
-
443
383
  await this.shell(args);
444
384
  };
445
385
 
446
386
  methods.lock = async function lock() {
447
387
  if (await this.isScreenLocked()) {
448
388
  _logger.default.debug('Screen is already locked. Doing nothing.');
449
-
450
389
  return;
451
390
  }
452
-
453
391
  _logger.default.debug('Pressing the KEYCODE_POWER button to lock screen');
454
-
455
392
  await this.keyevent(26);
456
393
  const timeoutMs = 5000;
457
-
458
394
  try {
459
395
  await (0, _asyncbox.waitForCondition)(async () => await this.isScreenLocked(), {
460
396
  waitMs: timeoutMs,
@@ -467,13 +403,11 @@ methods.lock = async function lock() {
467
403
 
468
404
  methods.back = async function back() {
469
405
  _logger.default.debug('Pressing the BACK button');
470
-
471
406
  await this.keyevent(4);
472
407
  };
473
408
 
474
409
  methods.goToHome = async function goToHome() {
475
410
  _logger.default.debug('Pressing the HOME button');
476
-
477
411
  await this.keyevent(3);
478
412
  };
479
413
 
@@ -503,7 +437,6 @@ methods.setAirplaneMode = async function setAirplaneMode(on) {
503
437
 
504
438
  methods.broadcastAirplaneMode = async function broadcastAirplaneMode(on) {
505
439
  const args = ['am', 'broadcast', '-a', 'android.intent.action.AIRPLANE_MODE', '--ez', 'state', on ? 'true' : 'false'];
506
-
507
440
  try {
508
441
  await this.shell(args);
509
442
  } catch (e) {
@@ -515,7 +448,6 @@ methods.broadcastAirplaneMode = async function broadcastAirplaneMode(on) {
515
448
  return;
516
449
  } catch (ign) {}
517
450
  }
518
-
519
451
  throw e;
520
452
  }
521
453
  };
@@ -537,7 +469,6 @@ methods.setWifiAndData = async function setWifiAndData({
537
469
  if (_support.util.hasValue(wifi)) {
538
470
  await this.setWifiState(wifi, isEmulator);
539
471
  }
540
-
541
472
  if (_support.util.hasValue(data)) {
542
473
  await this.setDataState(data, isEmulator);
543
474
  }
@@ -560,7 +491,8 @@ methods.push = async function push(localPath, remotePath, opts) {
560
491
  };
561
492
 
562
493
  methods.pull = async function pull(remotePath, localPath, opts = {}) {
563
- await this.adbExec(['pull', remotePath, localPath], { ...opts,
494
+ await this.adbExec(['pull', remotePath, localPath], {
495
+ ...opts,
564
496
  timeout: opts.timeout ?? 60000
565
497
  });
566
498
  };
@@ -571,55 +503,46 @@ methods.processExists = async function processExists(processName) {
571
503
 
572
504
  methods.getForwardList = async function getForwardList() {
573
505
  _logger.default.debug(`List forwarding ports`);
574
-
575
506
  const connections = await this.adbExec(['forward', '--list']);
576
507
  return connections.split(_os.EOL).filter(line => Boolean(line.trim()));
577
508
  };
578
509
 
579
510
  methods.forwardPort = async function forwardPort(systemPort, devicePort) {
580
511
  _logger.default.debug(`Forwarding system: ${systemPort} to device: ${devicePort}`);
581
-
582
512
  await this.adbExec(['forward', `tcp:${systemPort}`, `tcp:${devicePort}`]);
583
513
  };
584
514
 
585
515
  methods.removePortForward = async function removePortForward(systemPort) {
586
516
  _logger.default.debug(`Removing forwarded port socket connection: ${systemPort} `);
587
-
588
517
  await this.adbExec(['forward', `--remove`, `tcp:${systemPort}`]);
589
518
  };
590
519
 
591
520
  methods.getReverseList = async function getReverseList() {
592
521
  _logger.default.debug(`List reverse forwarding ports`);
593
-
594
522
  const connections = await this.adbExec(['reverse', '--list']);
595
523
  return connections.split(_os.EOL).filter(line => Boolean(line.trim()));
596
524
  };
597
525
 
598
526
  methods.reversePort = async function reversePort(devicePort, systemPort) {
599
527
  _logger.default.debug(`Forwarding device: ${devicePort} to system: ${systemPort}`);
600
-
601
528
  await this.adbExec(['reverse', `tcp:${devicePort}`, `tcp:${systemPort}`]);
602
529
  };
603
530
 
604
531
  methods.removePortReverse = async function removePortReverse(devicePort) {
605
532
  _logger.default.debug(`Removing reverse forwarded port socket connection: ${devicePort} `);
606
-
607
533
  await this.adbExec(['reverse', `--remove`, `tcp:${devicePort}`]);
608
534
  };
609
535
 
610
536
  methods.forwardAbstractPort = async function forwardAbstractPort(systemPort, devicePort) {
611
537
  _logger.default.debug(`Forwarding system: ${systemPort} to abstract device: ${devicePort}`);
612
-
613
538
  await this.adbExec(['forward', `tcp:${systemPort}`, `localabstract:${devicePort}`]);
614
539
  };
615
540
 
616
541
  methods.ping = async function ping() {
617
542
  let stdout = await this.shell(['echo', 'ping']);
618
-
619
543
  if (stdout.indexOf('ping') === 0) {
620
544
  return true;
621
545
  }
622
-
623
546
  throw new Error(`ADB ping failed, returned ${stdout}`);
624
547
  };
625
548
 
@@ -638,7 +561,6 @@ methods.startLogcat = async function startLogcat(opts = {}) {
638
561
  if (!_lodash.default.isEmpty(this.logcat)) {
639
562
  throw new Error("Trying to start logcat capture but it's already started!");
640
563
  }
641
-
642
564
  this.logcat = new _logcat.default({
643
565
  adb: this.executable,
644
566
  debug: false,
@@ -653,7 +575,6 @@ methods.stopLogcat = async function stopLogcat() {
653
575
  if (_lodash.default.isEmpty(this.logcat)) {
654
576
  return;
655
577
  }
656
-
657
578
  try {
658
579
  await this.logcat.stopCapture();
659
580
  } finally {
@@ -665,7 +586,6 @@ methods.getLogcatLogs = function getLogcatLogs() {
665
586
  if (_lodash.default.isEmpty(this.logcat)) {
666
587
  throw new Error("Can't get logcat logs since logcat hasn't started");
667
588
  }
668
-
669
589
  return this.logcat.getLogs();
670
590
  };
671
591
 
@@ -673,7 +593,6 @@ methods.setLogcatListener = function setLogcatListener(listener) {
673
593
  if (_lodash.default.isEmpty(this.logcat)) {
674
594
  throw new Error("Logcat process hasn't been started");
675
595
  }
676
-
677
596
  this.logcat.on('output', listener);
678
597
  };
679
598
 
@@ -681,7 +600,6 @@ methods.removeLogcatListener = function removeLogcatListener(listener) {
681
600
  if (_lodash.default.isEmpty(this.logcat)) {
682
601
  throw new Error("Logcat process hasn't been started");
683
602
  }
684
-
685
603
  this.logcat.removeListener('output', listener);
686
604
  };
687
605
 
@@ -691,11 +609,9 @@ methods.listProcessStatus = async function listProcessStatus() {
691
609
  this._doesPsSupportAOption = /^-A\b/m.test(await this.shell(['ps', '--help']));
692
610
  } catch (e) {
693
611
  _logger.default.debug(e.stack);
694
-
695
612
  this._doesPsSupportAOption = false;
696
613
  }
697
614
  }
698
-
699
615
  return await this.shell(this._doesPsSupportAOption ? ['ps', '-A'] : ['ps']);
700
616
  };
701
617
 
@@ -703,66 +619,52 @@ methods.getNameByPid = async function getNameByPid(pid) {
703
619
  if (isNaN(pid)) {
704
620
  throw new Error(`The PID value must be a valid number. '${pid}' is given instead`);
705
621
  }
706
-
707
622
  pid = parseInt(pid, 10);
708
623
  const stdout = await this.listProcessStatus();
709
624
  const titleMatch = PS_TITLE_PATTERN.exec(stdout);
710
-
711
625
  if (!titleMatch) {
712
626
  _logger.default.debug(stdout);
713
-
714
627
  throw new Error(`Could not get the process name for PID '${pid}'`);
715
628
  }
716
-
717
629
  const allTitles = titleMatch[1].trim().split(/\s+/);
718
630
  const pidIndex = allTitles.indexOf(PID_COLUMN_TITLE);
719
631
  const nameOffset = allTitles.indexOf(PROCESS_NAME_COLUMN_TITLE) - allTitles.length;
720
632
  const pidRegex = new RegExp(`^(.*\\b${pid}\\b.*)$`, 'gm');
721
633
  let matchedLine;
722
-
723
634
  while (matchedLine = pidRegex.exec(stdout)) {
724
635
  const items = matchedLine[1].trim().split(/\s+/);
725
-
726
636
  if (parseInt(items[pidIndex], 10) === pid && items[items.length + nameOffset]) {
727
637
  return items[items.length + nameOffset];
728
638
  }
729
639
  }
730
-
731
640
  _logger.default.debug(stdout);
732
-
733
641
  throw new Error(`Could not get the process name for PID '${pid}'`);
734
642
  };
735
643
 
736
644
  methods.getPIDsByName = async function getPIDsByName(name) {
737
645
  _logger.default.debug(`Getting IDs of all '${name}' processes`);
738
-
739
646
  if (!this.isValidClass(name)) {
740
647
  throw new Error(`Invalid process name: '${name}'`);
741
648
  }
742
-
743
649
  if ((await this.getApiLevel()) >= 23) {
744
650
  if (!_lodash.default.isBoolean(this._isPgrepAvailable)) {
745
651
  const pgrepOutput = _lodash.default.trim(await this.shell(['pgrep --help; echo $?']));
746
-
747
652
  this._isPgrepAvailable = parseInt(_lodash.default.last(pgrepOutput.split(/\s+/)), 10) === 0;
748
-
749
653
  if (this._isPgrepAvailable) {
750
654
  this._canPgrepUseFullCmdLineSearch = /^-f\b/m.test(pgrepOutput);
751
655
  } else {
752
656
  this._isPidofAvailable = parseInt(await this.shell(['pidof --help > /dev/null; echo $?']), 10) === 0;
753
657
  }
754
658
  }
755
-
756
659
  if (this._isPgrepAvailable || this._isPidofAvailable) {
757
- const shellCommand = this._isPgrepAvailable ? this._canPgrepUseFullCmdLineSearch ? ['pgrep', '-f', _lodash.default.escapeRegExp(`([[:blank:]]|^)${name}([[:blank:]]|$)`)] : [`pgrep ^${_lodash.default.escapeRegExp(name.slice(-MAX_PGREP_PATTERN_LEN))}$ ` + `|| pgrep ^${_lodash.default.escapeRegExp(name.slice(0, MAX_PGREP_PATTERN_LEN))}$`] : ['pidof', name];
758
-
660
+ const shellCommand = this._isPgrepAvailable ? this._canPgrepUseFullCmdLineSearch ? ['pgrep', '-f', _lodash.default.escapeRegExp(`([[:blank:]]|^)${name}([[:blank:]]|$)`)]
661
+ : [`pgrep ^${_lodash.default.escapeRegExp(name.slice(-MAX_PGREP_PATTERN_LEN))}$ ` + `|| pgrep ^${_lodash.default.escapeRegExp(name.slice(0, MAX_PGREP_PATTERN_LEN))}$`] : ['pidof', name];
759
662
  try {
760
663
  return (await this.shell(shellCommand)).split(/\s+/).map(x => parseInt(x, 10)).filter(x => _lodash.default.isInteger(x));
761
664
  } catch (e) {
762
665
  if (e.code !== 1) {
763
666
  throw new Error(`Could not extract process ID of '${name}': ${e.message}`);
764
667
  }
765
-
766
668
  if (_lodash.default.includes(e.stderr || e.stdout, 'syntax error')) {
767
669
  _logger.default.warn(`Got an unexpected response from the shell interpreter: ${e.stderr || e.stdout}`);
768
670
  } else {
@@ -771,45 +673,33 @@ methods.getPIDsByName = async function getPIDsByName(name) {
771
673
  }
772
674
  }
773
675
  }
774
-
775
676
  _logger.default.debug('Using ps-based PID detection');
776
-
777
677
  const stdout = await this.listProcessStatus();
778
678
  const titleMatch = PS_TITLE_PATTERN.exec(stdout);
779
-
780
679
  if (!titleMatch) {
781
680
  _logger.default.debug(stdout);
782
-
783
681
  throw new Error(`Could not extract PID of '${name}' from ps output`);
784
682
  }
785
-
786
683
  const allTitles = titleMatch[1].trim().split(/\s+/);
787
684
  const pidIndex = allTitles.indexOf(PID_COLUMN_TITLE);
788
685
  const pids = [];
789
686
  const processNameRegex = new RegExp(`^(.*\\b\\d+\\b.*\\b${_lodash.default.escapeRegExp(name)}\\b.*)$`, 'gm');
790
687
  let matchedLine;
791
-
792
688
  while (matchedLine = processNameRegex.exec(stdout)) {
793
689
  const items = matchedLine[1].trim().split(/\s+/);
794
-
795
690
  if (pidIndex >= allTitles.length || isNaN(items[pidIndex])) {
796
691
  _logger.default.debug(stdout);
797
-
798
692
  throw new Error(`Could not extract PID of '${name}' from '${matchedLine[1].trim()}'`);
799
693
  }
800
-
801
694
  pids.push(parseInt(items[pidIndex], 10));
802
695
  }
803
-
804
696
  return pids;
805
697
  };
806
698
 
807
699
  methods.killProcessesByName = async function killProcessesByName(name) {
808
700
  try {
809
701
  _logger.default.debug(`Attempting to kill all ${name} processes`);
810
-
811
702
  const pids = await this.getPIDsByName(name);
812
-
813
703
  if (_lodash.default.isEmpty(pids)) {
814
704
  _logger.default.info(`No '${name}' process has been found`);
815
705
  } else {
@@ -822,22 +712,17 @@ methods.killProcessesByName = async function killProcessesByName(name) {
822
712
 
823
713
  methods.killProcessByPID = async function killProcessByPID(pid) {
824
714
  _logger.default.debug(`Attempting to kill process ${pid}`);
825
-
826
715
  const noProcessFlag = 'No such process';
827
-
828
716
  try {
829
717
  await this.shell(['kill', pid]);
830
718
  } catch (e) {
831
719
  if (_lodash.default.includes(e.stderr, noProcessFlag)) {
832
720
  return;
833
721
  }
834
-
835
722
  if (!_lodash.default.includes(e.stderr, 'Operation not permitted')) {
836
723
  throw e;
837
724
  }
838
-
839
725
  _logger.default.info(`Cannot kill PID ${pid} due to insufficient permissions. Retrying as root`);
840
-
841
726
  try {
842
727
  await this.shell(['kill', pid], {
843
728
  privileged: true
@@ -846,7 +731,6 @@ methods.killProcessByPID = async function killProcessByPID(pid) {
846
731
  if (_lodash.default.includes(e1.stderr, noProcessFlag)) {
847
732
  return;
848
733
  }
849
-
850
734
  throw e1;
851
735
  }
852
736
  }
@@ -856,17 +740,14 @@ methods.broadcastProcessEnd = async function broadcastProcessEnd(intent, process
856
740
  this.broadcast(intent);
857
741
  let start = Date.now();
858
742
  let timeoutMs = 40000;
859
-
860
743
  try {
861
744
  while (Date.now() - start < timeoutMs) {
862
745
  if (await this.processExists(processName)) {
863
746
  await (0, _asyncbox.sleep)(400);
864
747
  continue;
865
748
  }
866
-
867
749
  return;
868
750
  }
869
-
870
751
  throw new Error(`Process never died within ${timeoutMs} ms`);
871
752
  } catch (e) {
872
753
  throw new Error(`Unable to broadcast process end. Original error: ${e.message}`);
@@ -877,9 +758,7 @@ methods.broadcast = async function broadcast(intent) {
877
758
  if (!this.isValidClass(intent)) {
878
759
  throw new Error(`Invalid intent ${intent}`);
879
760
  }
880
-
881
761
  _logger.default.debug(`Broadcasting: ${intent}`);
882
-
883
762
  await this.shell(['am', 'broadcast', '-a', intent]);
884
763
  };
885
764
 
@@ -893,10 +772,8 @@ methods.instrument = async function instrument(pkg, activity, instrumentWith) {
893
772
  if (activity[0] !== '.') {
894
773
  pkg = '';
895
774
  }
896
-
897
775
  let pkgActivity = (pkg + activity).replace(/\.+/g, '.');
898
776
  let stdout = await this.shell(['am', 'instrument', '-e', 'main_activity', pkgActivity, instrumentWith]);
899
-
900
777
  if (stdout.indexOf('Exception') !== -1) {
901
778
  throw new Error(`Unknown exception during instrumentation. Original error ${stdout.split('\n')[0]}`);
902
779
  }
@@ -906,12 +783,9 @@ methods.androidCoverage = async function androidCoverage(instrumentClass, waitPk
906
783
  if (!this.isValidClass(instrumentClass)) {
907
784
  throw new Error(`Invalid class ${instrumentClass}`);
908
785
  }
909
-
910
786
  return await new _bluebird.default(async (resolve, reject) => {
911
787
  let args = this.executable.defaultArgs.concat(['shell', 'am', 'instrument', '-e', 'coverage', 'true', '-w']).concat([instrumentClass]);
912
-
913
788
  _logger.default.debug(`Collecting coverage data with: ${[this.executable.path].concat(args).join(' ')}`);
914
-
915
789
  try {
916
790
  this.instrumentProc = new _teen_process.SubProcess(this.executable.path, args);
917
791
  await this.instrumentProc.start(0);
@@ -931,9 +805,7 @@ methods.androidCoverage = async function androidCoverage(instrumentClass, waitPk
931
805
  methods.getDeviceProperty = async function getDeviceProperty(property) {
932
806
  let stdout = await this.shell(['getprop', property]);
933
807
  let val = stdout.trim();
934
-
935
808
  _logger.default.debug(`Current device property '${property}': ${val}`);
936
-
937
809
  return val;
938
810
  };
939
811
 
@@ -941,9 +813,7 @@ methods.setDeviceProperty = async function setDeviceProperty(prop, val, opts = {
941
813
  const {
942
814
  privileged = true
943
815
  } = opts;
944
-
945
816
  _logger.default.debug(`Setting device property '${prop}' to '${val}'`);
946
-
947
817
  await this.shell(['setprop', prop, val], {
948
818
  privileged
949
819
  });
@@ -984,39 +854,31 @@ methods.getManufacturer = async function getManufacturer() {
984
854
  methods.getScreenSize = async function getScreenSize() {
985
855
  let stdout = await this.shell(['wm', 'size']);
986
856
  let size = new RegExp(/Physical size: ([^\r?\n]+)*/g).exec(stdout);
987
-
988
857
  if (size && size.length >= 2) {
989
858
  return size[1].trim();
990
859
  }
991
-
992
860
  return null;
993
861
  };
994
862
 
995
863
  methods.getScreenDensity = async function getScreenDensity() {
996
864
  let stdout = await this.shell(['wm', 'density']);
997
865
  let density = new RegExp(/Physical density: ([^\r?\n]+)*/g).exec(stdout);
998
-
999
866
  if (density && density.length >= 2) {
1000
867
  let densityNumber = parseInt(density[1].trim(), 10);
1001
868
  return isNaN(densityNumber) ? null : densityNumber;
1002
869
  }
1003
-
1004
870
  return null;
1005
871
  };
1006
872
 
1007
873
  methods.setHttpProxy = async function setHttpProxy(proxyHost, proxyPort) {
1008
874
  let proxy = `${proxyHost}:${proxyPort}`;
1009
-
1010
875
  if (_lodash.default.isUndefined(proxyHost)) {
1011
876
  throw new Error(`Call to setHttpProxy method with undefined proxy_host: ${proxy}`);
1012
877
  }
1013
-
1014
878
  if (_lodash.default.isUndefined(proxyPort)) {
1015
879
  throw new Error(`Call to setHttpProxy method with undefined proxy_port ${proxy}`);
1016
880
  }
1017
-
1018
881
  const httpProxySettins = [['http_proxy', proxy], ['global_http_proxy_host', proxyHost], ['global_http_proxy_port', proxyPort]];
1019
-
1020
882
  for (const [settingKey, settingValue] of httpProxySettins) {
1021
883
  await this.setSetting('global', settingKey, settingValue);
1022
884
  }
@@ -1052,34 +914,26 @@ methods.screenrecord = function screenrecord(destination, options = {}) {
1052
914
  timeLimit,
1053
915
  bugReport
1054
916
  } = options;
1055
-
1056
917
  if (_support.util.hasValue(videoSize)) {
1057
918
  cmd.push('--size', videoSize);
1058
919
  }
1059
-
1060
920
  if (_support.util.hasValue(timeLimit)) {
1061
921
  cmd.push('--time-limit', timeLimit);
1062
922
  }
1063
-
1064
923
  if (_support.util.hasValue(bitRate)) {
1065
924
  cmd.push('--bit-rate', bitRate);
1066
925
  }
1067
-
1068
926
  if (bugReport) {
1069
927
  cmd.push('--bugreport');
1070
928
  }
1071
-
1072
929
  cmd.push(destination);
1073
930
  const fullCmd = [...this.executable.defaultArgs, 'shell', ...cmd];
1074
-
1075
931
  _logger.default.debug(`Building screenrecord process with the command line: adb ${_support.util.quote(fullCmd)}`);
1076
-
1077
932
  return new _teen_process.SubProcess(this.executable.path, fullCmd);
1078
933
  };
1079
934
 
1080
935
  methods.runInImeContext = async function runInImeContext(ime, fn) {
1081
936
  const originalIme = await this.defaultIME();
1082
-
1083
937
  if (originalIme === ime) {
1084
938
  _logger.default.debug(`The original IME is the same as '${ime}'. There is no need to reset it`);
1085
939
  } else {
@@ -1087,7 +941,6 @@ methods.runInImeContext = async function runInImeContext(ime, fn) {
1087
941
  await this.setIME(ime);
1088
942
  await _bluebird.default.delay(500);
1089
943
  }
1090
-
1091
944
  try {
1092
945
  return await fn();
1093
946
  } finally {
@@ -1099,7 +952,6 @@ methods.runInImeContext = async function runInImeContext(ime, fn) {
1099
952
 
1100
953
  methods.getTimeZone = async function getTimeZone() {
1101
954
  _logger.default.debug('Getting current timezone');
1102
-
1103
955
  try {
1104
956
  return await this.getDeviceProperty('persist.sys.timezone');
1105
957
  } catch (e) {
@@ -1109,14 +961,12 @@ methods.getTimeZone = async function getTimeZone() {
1109
961
 
1110
962
  methods.listFeatures = async function listFeatures() {
1111
963
  this._memoizedFeatures = this._memoizedFeatures || _lodash.default.memoize(async () => await this.adbExec(['features']), () => this.curDeviceId);
1112
-
1113
964
  try {
1114
965
  return (await this._memoizedFeatures()).split(/\s+/).map(x => x.trim()).filter(Boolean);
1115
966
  } catch (e) {
1116
967
  if (_lodash.default.includes(e.stderr, 'unknown command')) {
1117
968
  return [];
1118
969
  }
1119
-
1120
970
  throw e;
1121
971
  }
1122
972
  };
@@ -1131,11 +981,9 @@ methods.isIncrementalInstallSupported = async function isIncrementalInstallSuppo
1131
981
  const {
1132
982
  binary
1133
983
  } = await this.getVersion();
1134
-
1135
984
  if (!binary) {
1136
985
  return false;
1137
986
  }
1138
-
1139
987
  return _support.util.compareVersions(binary.version, '>=', '30.0.1') && (await this.listFeatures()).includes('abb_exec');
1140
988
  };
1141
989
 
@@ -1143,9 +991,7 @@ methods.getDeviceIdleWhitelist = async function getDeviceIdleWhitelist() {
1143
991
  if ((await this.getApiLevel()) < 23) {
1144
992
  return [];
1145
993
  }
1146
-
1147
994
  _logger.default.info('Listing packages in Doze whitelist');
1148
-
1149
995
  const output = await this.shell(['dumpsys', 'deviceidle', 'whitelist']);
1150
996
  return _lodash.default.trim(output).split(/\n/).map(line => _lodash.default.trim(line)).filter(Boolean);
1151
997
  };
@@ -1154,13 +1000,10 @@ methods.addToDeviceIdleWhitelist = async function addToDeviceIdleWhitelist(...pa
1154
1000
  if (_lodash.default.isEmpty(packages) || (await this.getApiLevel()) < 23) {
1155
1001
  return false;
1156
1002
  }
1157
-
1158
1003
  _logger.default.info(`Adding ${_support.util.pluralize('package', packages.length)} ${JSON.stringify(packages)} to Doze whitelist`);
1159
-
1160
1004
  await this.shellChunks(pkg => ['dumpsys', 'deviceidle', 'whitelist', `+${pkg}`], packages);
1161
1005
  return true;
1162
1006
  };
1163
-
1164
1007
  var _default = methods;
1165
1008
  exports.default = _default;
1166
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNQVhfU0hFTExfQlVGRkVSX0xFTkdUSCIsIk5PVF9DSEFOR0VBQkxFX1BFUk1fRVJST1IiLCJJR05PUkVEX1BFUk1fRVJST1JTIiwiTUFYX1BHUkVQX1BBVFRFUk5fTEVOIiwiSElEREVOX0FQSV9QT0xJQ1lfS0VZUyIsIlBJRF9DT0xVTU5fVElUTEUiLCJQUk9DRVNTX05BTUVfQ09MVU1OX1RJVExFIiwiUFNfVElUTEVfUEFUVEVSTiIsIlJlZ0V4cCIsIk1JTl9BUElfTEVWRUxfV0lUSF9QRVJNU19TVVBQT1JUIiwibWV0aG9kcyIsInNoZWxsQ2h1bmtzIiwiYXJnVHJhbnNmb3JtZXIiLCJhcmdzIiwiY29tbWFuZHMiLCJjbWRDaHVuayIsImFyZyIsIm5leHRDbWQiLCJfIiwiaXNBcnJheSIsIkVycm9yIiwibGFzdCIsInB1c2giLCJqb2luIiwibGVuZ3RoIiwiaXNFbXB0eSIsImxvZyIsImRlYnVnIiwiSlNPTiIsInN0cmluZ2lmeSIsImxhc3RFcnJvciIsImNtZCIsInNoZWxsIiwiZSIsImdldEFkYldpdGhDb3JyZWN0QWRiUGF0aCIsImV4ZWN1dGFibGUiLCJwYXRoIiwiZ2V0U2RrQmluYXJ5UGF0aCIsImFkYiIsImluaXRBYXB0IiwiaW5pdEFhcHQyIiwiaW5pdFppcEFsaWduIiwiaW5pdEJ1bmRsZXRvb2wiLCJiaW5hcmllcyIsImJ1bmRsZXRvb2wiLCJmcyIsIndoaWNoIiwiZXJyIiwiZ2V0QXBpTGV2ZWwiLCJpc0ludGVnZXIiLCJfYXBpTGV2ZWwiLCJzdHJPdXRwdXQiLCJnZXREZXZpY2VQcm9wZXJ0eSIsImFwaUxldmVsIiwicGFyc2VJbnQiLCJ0cmltIiwiY2hhckNvZGVRIiwiY2hhckNvZGVBdCIsImFwaUxldmVsRGlmZiIsImNvZGVuYW1lIiwiU3RyaW5nIiwiZnJvbUNoYXJDb2RlIiwiZ2V0UGxhdGZvcm1WZXJzaW9uIiwidG9Mb3dlckNhc2UiLCJ0b1VwcGVyQ2FzZSIsImlzTmFOIiwibWVzc2FnZSIsImluZm8iLCJpc0RldmljZUNvbm5lY3RlZCIsImRldmljZXMiLCJnZXRDb25uZWN0ZWREZXZpY2VzIiwibWtkaXIiLCJyZW1vdGVQYXRoIiwiaXNWYWxpZENsYXNzIiwiY2xhc3NTdHJpbmciLCJtYXRjaENvbXBvbmVudE5hbWUiLCJyZXNvbHZlTGF1bmNoYWJsZUFjdGl2aXR5IiwicGtnIiwib3B0cyIsInByZWZlckNtZCIsInN0ZG91dCIsIm5hbWVzIiwicGFyc2VMYXVuY2hhYmxlQWN0aXZpdHlOYW1lcyIsInRtcFJvb3QiLCJ0ZW1wRGlyIiwib3BlbkRpciIsInRtcEFwcCIsInB1bGxBcGsiLCJhcGtBY3Rpdml0eSIsInBhY2thZ2VBbmRMYXVuY2hBY3Rpdml0eUZyb21NYW5pZmVzdCIsInN0YWNrIiwid2FybiIsInJpbXJhZiIsInN0ZGVyciIsIm91dHB1dEZvcm1hdCIsIkVYRUNfT1VUUFVUX0ZPUk1BVCIsIkZVTEwiLCJsaW5lIiwic3BsaXQiLCJtYXAiLCJmb3JjZVN0b3AiLCJraWxsUGFja2FnZSIsImNsZWFyIiwiZ3JhbnRBbGxQZXJtaXNzaW9ucyIsImFwayIsInRhcmdldFNkayIsImR1bXBzeXNPdXRwdXQiLCJ0YXJnZXRTZGtWZXJzaW9uVXNpbmdQS0ciLCJ0YXJnZXRTZGtWZXJzaW9uRnJvbU1hbmlmZXN0IiwicmVxdWVzdGVkUGVybWlzc2lvbnMiLCJnZXRSZXFQZXJtaXNzaW9ucyIsImdyYW50ZWRQZXJtaXNzaW9ucyIsImdldEdyYW50ZWRQZXJtaXNzaW9ucyIsInBlcm1pc3Npb25zVG9HcmFudCIsImRpZmZlcmVuY2UiLCJncmFudFBlcm1pc3Npb25zIiwicGVybWlzc2lvbnMiLCJwZXJtIiwic29tZSIsInBhdHRlcm4iLCJ0ZXN0IiwiZ3JhbnRQZXJtaXNzaW9uIiwicGVybWlzc2lvbiIsInJldm9rZVBlcm1pc3Npb24iLCJjbWRPdXRwdXQiLCJleHRyYWN0TWF0Y2hpbmdQZXJtaXNzaW9ucyIsImdldERlbmllZFBlcm1pc3Npb25zIiwiZ2V0TG9jYXRpb25Qcm92aWRlcnMiLCJnZXRTZXR0aW5nIiwicCIsImZpbHRlciIsIkJvb2xlYW4iLCJ0b2dnbGVHUFNMb2NhdGlvblByb3ZpZGVyIiwiZW5hYmxlZCIsInNldFNldHRpbmciLCJzZXRIaWRkZW5BcGlQb2xpY3kiLCJ2YWx1ZSIsImlnbm9yZUVycm9yIiwiayIsInNldERlZmF1bHRIaWRkZW5BcGlQb2xpY3kiLCJzdG9wQW5kQ2xlYXIiLCJhdmFpbGFibGVJTUVzIiwiZ2V0SU1FTGlzdEZyb21PdXRwdXQiLCJlbmFibGVkSU1FcyIsImVuYWJsZUlNRSIsImltZUlkIiwiZGlzYWJsZUlNRSIsInNldElNRSIsImRlZmF1bHRJTUUiLCJlbmdpbmUiLCJrZXlldmVudCIsImtleWNvZGUiLCJjb2RlIiwiaW5wdXRUZXh0IiwidGV4dCIsIm9yaWdpbmFsU3RyIiwiZXNjYXBlZFRleHQiLCJyZXBsYWNlIiwiYWRiSW5wdXRFc2NhcGVQYXR0ZXJuIiwiZXZlcnkiLCJjIiwiaW5jbHVkZXMiLCJxIiwiY2xlYXJUZXh0RmllbGQiLCJpIiwibG9jayIsImlzU2NyZWVuTG9ja2VkIiwidGltZW91dE1zIiwid2FpdEZvckNvbmRpdGlvbiIsIndhaXRNcyIsImludGVydmFsTXMiLCJiYWNrIiwiZ29Ub0hvbWUiLCJnZXRBZGJQYXRoIiwiZ2V0U2NyZWVuT3JpZW50YXRpb24iLCJnZXRTdXJmYWNlT3JpZW50YXRpb24iLCJzZW5kVGVsbmV0Q29tbWFuZCIsImNvbW1hbmQiLCJleGVjRW11Q29uc29sZUNvbW1hbmQiLCJwb3J0IiwiZ2V0RW11bGF0b3JQb3J0IiwiaXNBaXJwbGFuZU1vZGVPbiIsInNldEFpcnBsYW5lTW9kZSIsIm9uIiwiYnJvYWRjYXN0QWlycGxhbmVNb2RlIiwicHJpdmlsZWdlZCIsImlnbiIsImlzV2lmaU9uIiwiaXNEYXRhT24iLCJzZXRXaWZpQW5kRGF0YSIsIndpZmkiLCJkYXRhIiwiaXNFbXVsYXRvciIsInV0aWwiLCJoYXNWYWx1ZSIsInNldFdpZmlTdGF0ZSIsInNldERhdGFTdGF0ZSIsImlzQW5pbWF0aW9uT24iLCJhbmltYXRvcl9kdXJhdGlvbl9zY2FsZSIsInRyYW5zaXRpb25fYW5pbWF0aW9uX3NjYWxlIiwid2luZG93X2FuaW1hdGlvbl9zY2FsZSIsInNldHRpbmciLCJsb2NhbFBhdGgiLCJwb3NpeCIsImRpcm5hbWUiLCJhZGJFeGVjIiwicHVsbCIsInRpbWVvdXQiLCJwcm9jZXNzRXhpc3RzIiwicHJvY2Vzc05hbWUiLCJnZXRQSURzQnlOYW1lIiwiZ2V0Rm9yd2FyZExpc3QiLCJjb25uZWN0aW9ucyIsIkVPTCIsImZvcndhcmRQb3J0Iiwic3lzdGVtUG9ydCIsImRldmljZVBvcnQiLCJyZW1vdmVQb3J0Rm9yd2FyZCIsImdldFJldmVyc2VMaXN0IiwicmV2ZXJzZVBvcnQiLCJyZW1vdmVQb3J0UmV2ZXJzZSIsImZvcndhcmRBYnN0cmFjdFBvcnQiLCJwaW5nIiwiaW5kZXhPZiIsInJlc3RhcnQiLCJzdG9wTG9nY2F0IiwicmVzdGFydEFkYiIsIndhaXRGb3JEZXZpY2UiLCJzdGFydExvZ2NhdCIsIl9sb2djYXRTdGFydHVwUGFyYW1zIiwibG9nY2F0IiwiTG9nY2F0IiwiZGVidWdUcmFjZSIsImNsZWFyRGV2aWNlTG9nc09uU3RhcnQiLCJzdGFydENhcHR1cmUiLCJzdG9wQ2FwdHVyZSIsImdldExvZ2NhdExvZ3MiLCJnZXRMb2dzIiwic2V0TG9nY2F0TGlzdGVuZXIiLCJsaXN0ZW5lciIsInJlbW92ZUxvZ2NhdExpc3RlbmVyIiwicmVtb3ZlTGlzdGVuZXIiLCJsaXN0UHJvY2Vzc1N0YXR1cyIsImlzQm9vbGVhbiIsIl9kb2VzUHNTdXBwb3J0QU9wdGlvbiIsImdldE5hbWVCeVBpZCIsInBpZCIsInRpdGxlTWF0Y2giLCJleGVjIiwiYWxsVGl0bGVzIiwicGlkSW5kZXgiLCJuYW1lT2Zmc2V0IiwicGlkUmVnZXgiLCJtYXRjaGVkTGluZSIsIml0ZW1zIiwibmFtZSIsIl9pc1BncmVwQXZhaWxhYmxlIiwicGdyZXBPdXRwdXQiLCJfY2FuUGdyZXBVc2VGdWxsQ21kTGluZVNlYXJjaCIsIl9pc1BpZG9mQXZhaWxhYmxlIiwic2hlbGxDb21tYW5kIiwiZXNjYXBlUmVnRXhwIiwic2xpY2UiLCJ4IiwicGlkcyIsInByb2Nlc3NOYW1lUmVnZXgiLCJraWxsUHJvY2Vzc2VzQnlOYW1lIiwiQiIsImFsbCIsImtpbGxQcm9jZXNzQnlQSUQiLCJub1Byb2Nlc3NGbGFnIiwiZTEiLCJicm9hZGNhc3RQcm9jZXNzRW5kIiwiaW50ZW50IiwiYnJvYWRjYXN0Iiwic3RhcnQiLCJEYXRlIiwibm93Iiwic2xlZXAiLCJlbmRBbmRyb2lkQ292ZXJhZ2UiLCJpbnN0cnVtZW50UHJvYyIsImlzUnVubmluZyIsInN0b3AiLCJpbnN0cnVtZW50IiwiYWN0aXZpdHkiLCJpbnN0cnVtZW50V2l0aCIsInBrZ0FjdGl2aXR5IiwiYW5kcm9pZENvdmVyYWdlIiwiaW5zdHJ1bWVudENsYXNzIiwid2FpdFBrZyIsIndhaXRBY3Rpdml0eSIsInJlc29sdmUiLCJyZWplY3QiLCJkZWZhdWx0QXJncyIsImNvbmNhdCIsIlN1YlByb2Nlc3MiLCJ3YWl0Rm9yQWN0aXZpdHkiLCJwcm9wZXJ0eSIsInZhbCIsInNldERldmljZVByb3BlcnR5IiwicHJvcCIsImdldERldmljZVN5c0xhbmd1YWdlIiwiZ2V0RGV2aWNlU3lzQ291bnRyeSIsImdldERldmljZVN5c0xvY2FsZSIsImdldERldmljZVByb2R1Y3RMYW5ndWFnZSIsImdldERldmljZVByb2R1Y3RDb3VudHJ5IiwiZ2V0RGV2aWNlUHJvZHVjdExvY2FsZSIsImdldE1vZGVsIiwiZ2V0TWFudWZhY3R1cmVyIiwiZ2V0U2NyZWVuU2l6ZSIsInNpemUiLCJnZXRTY3JlZW5EZW5zaXR5IiwiZGVuc2l0eSIsImRlbnNpdHlOdW1iZXIiLCJzZXRIdHRwUHJveHkiLCJwcm94eUhvc3QiLCJwcm94eVBvcnQiLCJwcm94eSIsImlzVW5kZWZpbmVkIiwiaHR0cFByb3h5U2V0dGlucyIsInNldHRpbmdLZXkiLCJzZXR0aW5nVmFsdWUiLCJkZWxldGVIdHRwUHJveHkiLCJuYW1lc3BhY2UiLCJidWdyZXBvcnQiLCJzY3JlZW5yZWNvcmQiLCJkZXN0aW5hdGlvbiIsIm9wdGlvbnMiLCJ2aWRlb1NpemUiLCJiaXRSYXRlIiwidGltZUxpbWl0IiwiYnVnUmVwb3J0IiwiZnVsbENtZCIsInF1b3RlIiwicnVuSW5JbWVDb250ZXh0IiwiaW1lIiwiZm4iLCJvcmlnaW5hbEltZSIsImRlbGF5IiwiZ2V0VGltZVpvbmUiLCJsaXN0RmVhdHVyZXMiLCJfbWVtb2l6ZWRGZWF0dXJlcyIsIm1lbW9pemUiLCJjdXJEZXZpY2VJZCIsImlzU3RyZWFtZWRJbnN0YWxsU3VwcG9ydGVkIiwicHJvdG8iLCJPYmplY3QiLCJnZXRQcm90b3R5cGVPZiIsIl9oZWxwT3V0cHV0IiwiaXNJbmNyZW1lbnRhbEluc3RhbGxTdXBwb3J0ZWQiLCJiaW5hcnkiLCJnZXRWZXJzaW9uIiwiY29tcGFyZVZlcnNpb25zIiwidmVyc2lvbiIsImdldERldmljZUlkbGVXaGl0ZWxpc3QiLCJvdXRwdXQiLCJhZGRUb0RldmljZUlkbGVXaGl0ZWxpc3QiLCJwYWNrYWdlcyIsInBsdXJhbGl6ZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi90b29scy9hZGItY29tbWFuZHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHtcbiAgZ2V0SU1FTGlzdEZyb21PdXRwdXQsIGdldFN1cmZhY2VPcmllbnRhdGlvbiwgZXh0cmFjdE1hdGNoaW5nUGVybWlzc2lvbnMsXG4gIHBhcnNlTGF1bmNoYWJsZUFjdGl2aXR5TmFtZXMsIG1hdGNoQ29tcG9uZW50TmFtZSxcbn0gZnJvbSAnLi4vaGVscGVycy5qcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBmcywgdXRpbCwgdGVtcERpciB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBFT0wgfSBmcm9tICdvcyc7XG5pbXBvcnQgTG9nY2F0IGZyb20gJy4uL2xvZ2NhdCc7XG5pbXBvcnQgeyBzbGVlcCwgd2FpdEZvckNvbmRpdGlvbiB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IFN1YlByb2Nlc3MgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuXG5jb25zdCBNQVhfU0hFTExfQlVGRkVSX0xFTkdUSCA9IDEwMDA7XG5jb25zdCBOT1RfQ0hBTkdFQUJMRV9QRVJNX0VSUk9SID0gL25vdCBhIGNoYW5nZWFibGUgcGVybWlzc2lvbiB0eXBlL2k7XG5jb25zdCBJR05PUkVEX1BFUk1fRVJST1JTID0gW1xuICBOT1RfQ0hBTkdFQUJMRV9QRVJNX0VSUk9SLFxuICAvVW5rbm93biBwZXJtaXNzaW9uL2ksXG5dO1xuY29uc3QgTUFYX1BHUkVQX1BBVFRFUk5fTEVOID0gMTU7XG5jb25zdCBISURERU5fQVBJX1BPTElDWV9LRVlTID0gW1xuICAnaGlkZGVuX2FwaV9wb2xpY3lfcHJlX3BfYXBwcycsXG4gICdoaWRkZW5fYXBpX3BvbGljeV9wX2FwcHMnLFxuICAnaGlkZGVuX2FwaV9wb2xpY3knXG5dO1xuY29uc3QgUElEX0NPTFVNTl9USVRMRSA9ICdQSUQnO1xuY29uc3QgUFJPQ0VTU19OQU1FX0NPTFVNTl9USVRMRSA9ICdOQU1FJztcbmNvbnN0IFBTX1RJVExFX1BBVFRFUk4gPSBuZXcgUmVnRXhwKGBeKC4qXFxcXGIke1BJRF9DT0xVTU5fVElUTEV9XFxcXGIuKlxcXFxiJHtQUk9DRVNTX05BTUVfQ09MVU1OX1RJVExFfVxcXFxiLiopJGAsICdtJyk7XG5jb25zdCBNSU5fQVBJX0xFVkVMX1dJVEhfUEVSTVNfU1VQUE9SVCA9IDIzO1xuXG5jb25zdCBtZXRob2RzID0ge307XG5cbi8qKlxuICogQ3JlYXRlcyBjaHVua3MgZm9yIHRoZSBnaXZlbiBhcmd1bWVudHMgYW5kIGV4ZWN1dGVzIHRoZW0gaW4gYGFkYiBzaGVsbGAuXG4gKiBUaGlzIGlzIGZhc3RlciB0aGFuIGNhbGxpbmcgYGFkYiBzaGVsbGAgc2VwYXJhdGVseSBmb3IgZWFjaCBhcmcsIGhvd2V2ZXJcbiAqIHRoZXJlIGlzIGEgbGltaXQgZm9yIGEgbWF4aW11bSBsZW5ndGggb2YgYSBzaW5nbGUgYWRiIGNvbW1hbmQuIHRoYXQgaXMgd2h5XG4gKiB3ZSBuZWVkIGFsbCB0aGlzIGNvbXBsaWNhdGVkIGxvZ2ljLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGFyZ1RyYW5zZm9ybWVyIEEgZnVuY3Rpb24sIHRoYXQgcmVjZWl2ZXMgc2luZ2xlIGFyZ3VtZW50XG4gKiBmcm9tIHRoZSBgYXJnc2AgYXJyYXkgYW5kIHRyYW5zZm9ybXMgaXQgaW50byBhIHNoZWxsIGNvbW1hbmQuIFRoZSByZXN1bHRcbiAqIG9mIHRoZSBmdW5jdGlvbiBtdXN0IGJlIGFuIGFycmF5LCB3aGVyZSBlYWNoIGl0ZW0gaXMgYSBwYXJ0IG9mIGEgc2luZ2xlIGNvbW1hbmQuXG4gKiBUaGUgbGFzdCBpdGVtIG9mIHRoZSBhcnJheSBjb3VsZCBiZSAnOycuIElmIHRoaXMgaXMgbm90IGEgc2VtaWNvbG9uIHRoZW4gaXQgaXMgZ29pbmcgdG9cbiAqIGJlIGFkZGVkIGF1dG9tYXRpY2FsbHkuXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcnxzdHJpbmc+fSBhcmdzIEFycmF5IG9mIGFyZ3VtZW50IHZhbHVlcyB0byBjcmVhdGUgY2h1bmtzIGZvclxuICogQHRocm93cyB7RXJyb3J9IElmIGFueSBvZiB0aGUgY2h1bmtzIHJldHVybnMgbm9uLXplcm8gZXhpdCBjb2RlIGFmdGVyIGJlaW5nIGV4ZWN1dGVkXG4gKi9cbm1ldGhvZHMuc2hlbGxDaHVua3MgPSBhc3luYyBmdW5jdGlvbiBzaGVsbENodW5rcyAoYXJnVHJhbnNmb3JtZXIsIGFyZ3MpIHtcbiAgY29uc3QgY29tbWFuZHMgPSBbXTtcbiAgbGV0IGNtZENodW5rID0gW107XG4gIGZvciAoY29uc3QgYXJnIG9mIGFyZ3MpIHtcbiAgICBjb25zdCBuZXh0Q21kID0gYXJnVHJhbnNmb3JtZXIoYXJnKTtcbiAgICBpZiAoIV8uaXNBcnJheShuZXh0Q21kKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcmd1bWVudCB0cmFuc2Zvcm1lciBtdXN0IHJlc3VsdCBpbiBhbiBhcnJheScpO1xuICAgIH1cbiAgICBpZiAoXy5sYXN0KG5leHRDbWQpICE9PSAnOycpIHtcbiAgICAgIG5leHRDbWQucHVzaCgnOycpO1xuICAgIH1cbiAgICBpZiAobmV4dENtZC5qb2luKCcgJykubGVuZ3RoICsgY21kQ2h1bmsuam9pbignICcpLmxlbmd0aCA+PSBNQVhfU0hFTExfQlVGRkVSX0xFTkdUSCkge1xuICAgICAgY29tbWFuZHMucHVzaChjbWRDaHVuayk7XG4gICAgICBjbWRDaHVuayA9IFtdO1xuICAgIH1cbiAgICBjbWRDaHVuayA9IFsuLi5jbWRDaHVuaywgLi4ubmV4dENtZF07XG4gIH1cbiAgaWYgKCFfLmlzRW1wdHkoY21kQ2h1bmspKSB7XG4gICAgY29tbWFuZHMucHVzaChjbWRDaHVuayk7XG4gIH1cbiAgbG9nLmRlYnVnKGBHb3QgdGhlIGZvbGxvd2luZyBjb21tYW5kIGNodW5rcyB0byBleGVjdXRlOiAke0pTT04uc3RyaW5naWZ5KGNvbW1hbmRzKX1gKTtcbiAgbGV0IGxhc3RFcnJvciA9IG51bGw7XG4gIGZvciAoY29uc3QgY21kIG9mIGNvbW1hbmRzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuc2hlbGwoY21kKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsYXN0RXJyb3IgPSBlO1xuICAgIH1cbiAgfVxuICBpZiAobGFzdEVycm9yKSB7XG4gICAgdGhyb3cgbGFzdEVycm9yO1xuICB9XG59O1xuXG4vKipcbiAqIEdldCB0aGUgcGF0aCB0byBhZGIgZXhlY3V0YWJsZSBhbWQgYXNzaWduIGl0XG4gKiB0byB0aGlzLmV4ZWN1dGFibGUucGF0aCBhbmQgdGhpcy5iaW5hcmllcy5hZGIgcHJvcGVydGllcy5cbiAqXG4gKiBAcmV0dXJuIHtBREJ9IEFEQiBpbnN0YW5jZS5cbiAqL1xubWV0aG9kcy5nZXRBZGJXaXRoQ29ycmVjdEFkYlBhdGggPSBhc3luYyBmdW5jdGlvbiBnZXRBZGJXaXRoQ29ycmVjdEFkYlBhdGggKCkge1xuICB0aGlzLmV4ZWN1dGFibGUucGF0aCA9IGF3YWl0IHRoaXMuZ2V0U2RrQmluYXJ5UGF0aCgnYWRiJyk7XG4gIHJldHVybiB0aGlzLmFkYjtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBmdWxsIHBhdGggdG8gYWFwdCB0b29sIGFuZCBhc3NpZ24gaXQgdG9cbiAqIHRoaXMuYmluYXJpZXMuYWFwdCBwcm9wZXJ0eVxuICovXG5tZXRob2RzLmluaXRBYXB0ID0gYXN5bmMgZnVuY3Rpb24gaW5pdEFhcHQgKCkge1xuICBhd2FpdCB0aGlzLmdldFNka0JpbmFyeVBhdGgoJ2FhcHQnKTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBmdWxsIHBhdGggdG8gYWFwdDIgdG9vbCBhbmQgYXNzaWduIGl0IHRvXG4gKiB0aGlzLmJpbmFyaWVzLmFhcHQyIHByb3BlcnR5XG4gKi9cbm1ldGhvZHMuaW5pdEFhcHQyID0gYXN5bmMgZnVuY3Rpb24gaW5pdEFhcHQyICgpIHtcbiAgYXdhaXQgdGhpcy5nZXRTZGtCaW5hcnlQYXRoKCdhYXB0MicpO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGZ1bGwgcGF0aCB0byB6aXBhbGlnbiB0b29sIGFuZCBhc3NpZ24gaXQgdG9cbiAqIHRoaXMuYmluYXJpZXMuemlwYWxpZ24gcHJvcGVydHlcbiAqL1xubWV0aG9kcy5pbml0WmlwQWxpZ24gPSBhc3luYyBmdW5jdGlvbiBpbml0WmlwQWxpZ24gKCkge1xuICBhd2FpdCB0aGlzLmdldFNka0JpbmFyeVBhdGgoJ3ppcGFsaWduJyk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgZnVsbCBwYXRoIHRvIGJ1bmRsZXRvb2wgYmluYXJ5IGFuZCBhc3NpZ24gaXQgdG9cbiAqIHRoaXMuYmluYXJpZXMuYnVuZGxldG9vbCBwcm9wZXJ0eVxuICovXG5tZXRob2RzLmluaXRCdW5kbGV0b29sID0gYXN5bmMgZnVuY3Rpb24gaW5pdEJ1bmRsZXRvb2wgKCkge1xuICB0cnkge1xuICAgIHRoaXMuYmluYXJpZXMuYnVuZGxldG9vbCA9IGF3YWl0IGZzLndoaWNoKCdidW5kbGV0b29sLmphcicpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2J1bmRsZXRvb2wuamFyIGJpbmFyeSBpcyBleHBlY3RlZCB0byBiZSBwcmVzZW50IGluIFBBVEguICcgK1xuICAgICAgJ1Zpc2l0IGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvYnVuZGxldG9vbCBmb3IgbW9yZSBkZXRhaWxzLicpO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBBUEkgbGV2ZWwgb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIEFQSSBsZXZlbCBhcyBpbnRlZ2VyIG51bWJlciwgZm9yIGV4YW1wbGUgMjEgZm9yXG4gKiAgICAgICAgICAgICAgICAgIEFuZHJvaWQgTG9sbGlwb3AuIFRoZSByZXN1bHQgb2YgdGhpcyBtZXRob2QgaXMgY2FjaGVkLCBzbyBhbGwgdGhlIGZ1cnRoZXJcbiAqIGNhbGxzIHJldHVybiB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgZmlyc3Qgb25lLlxuICovXG5tZXRob2RzLmdldEFwaUxldmVsID0gYXN5bmMgZnVuY3Rpb24gZ2V0QXBpTGV2ZWwgKCkge1xuICBpZiAoIV8uaXNJbnRlZ2VyKHRoaXMuX2FwaUxldmVsKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdHJPdXRwdXQgPSBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdyby5idWlsZC52ZXJzaW9uLnNkaycpO1xuICAgICAgbGV0IGFwaUxldmVsID0gcGFyc2VJbnQoc3RyT3V0cHV0LnRyaW0oKSwgMTApO1xuXG4gICAgICAvLyBXb3JrYXJvdW5kIGZvciBwcmV2aWV3L2JldGEgcGxhdGZvcm0gQVBJIGxldmVsXG4gICAgICBjb25zdCBjaGFyQ29kZVEgPSAncScuY2hhckNvZGVBdCgwKTtcbiAgICAgIC8vIDI4IGlzIHRoZSBmaXJzdCBBUEkgTGV2ZWwsIHdoZXJlIEFuZHJvaWQgU0RLIHN0YXJ0ZWQgcmV0dXJuaW5nIGxldHRlcnMgaW4gcmVzcG9uc2UgdG8gZ2V0UGxhdGZvcm1WZXJzaW9uXG4gICAgICBjb25zdCBhcGlMZXZlbERpZmYgPSBhcGlMZXZlbCAtIDI4O1xuICAgICAgY29uc3QgY29kZW5hbWUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2RlUSArIGFwaUxldmVsRGlmZik7XG4gICAgICBpZiAoYXBpTGV2ZWxEaWZmID49IDAgJiYgKGF3YWl0IHRoaXMuZ2V0UGxhdGZvcm1WZXJzaW9uKCkpLnRvTG93ZXJDYXNlKCkgPT09IGNvZGVuYW1lKSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhgUmVsZWFzZSB2ZXJzaW9uIGlzICR7Y29kZW5hbWUudG9VcHBlckNhc2UoKX0gYnV0IGZvdW5kIEFQSSBMZXZlbCAke2FwaUxldmVsfS4gU2V0dGluZyBBUEkgTGV2ZWwgdG8gJHthcGlMZXZlbCArIDF9YCk7XG4gICAgICAgIGFwaUxldmVsKys7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2FwaUxldmVsID0gYXBpTGV2ZWw7XG4gICAgICBsb2cuZGVidWcoYERldmljZSBBUEkgbGV2ZWw6ICR7dGhpcy5fYXBpTGV2ZWx9YCk7XG4gICAgICBpZiAoaXNOYU4odGhpcy5fYXBpTGV2ZWwpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGFjdHVhbCBvdXRwdXQgJyR7c3RyT3V0cHV0fScgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBhbiBpbnRlZ2VyYCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBnZXR0aW5nIGRldmljZSBBUEkgbGV2ZWwuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXMuX2FwaUxldmVsO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgcGxhdGZvcm0gdmVyc2lvbiBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgcGxhdGZvcm0gdmVyc2lvbiBhcyBhIHN0cmluZywgZm9yIGV4YW1wbGUgJzUuMCcgZm9yXG4gKiBBbmRyb2lkIExvbGxpcG9wLlxuICovXG5tZXRob2RzLmdldFBsYXRmb3JtVmVyc2lvbiA9IGFzeW5jIGZ1bmN0aW9uIGdldFBsYXRmb3JtVmVyc2lvbiAoKSB7XG4gIGxvZy5pbmZvKCdHZXR0aW5nIGRldmljZSBwbGF0Zm9ybSB2ZXJzaW9uJyk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3JvLmJ1aWxkLnZlcnNpb24ucmVsZWFzZScpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBnZXR0aW5nIGRldmljZSBwbGF0Zm9ybSB2ZXJzaW9uLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogVmVyaWZ5IHdoZXRoZXIgYSBkZXZpY2UgaXMgY29ubmVjdGVkLlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYXQgbGVhc3Qgb25lIGRldmljZSBpcyB2aXNpYmxlIHRvIGFkYi5cbiAqL1xubWV0aG9kcy5pc0RldmljZUNvbm5lY3RlZCA9IGFzeW5jIGZ1bmN0aW9uIGlzRGV2aWNlQ29ubmVjdGVkICgpIHtcbiAgbGV0IGRldmljZXMgPSBhd2FpdCB0aGlzLmdldENvbm5lY3RlZERldmljZXMoKTtcbiAgcmV0dXJuIGRldmljZXMubGVuZ3RoID4gMDtcbn07XG5cbi8qKlxuICogUmVjdXJzaXZlbHkgY3JlYXRlIGEgbmV3IGZvbGRlciBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggLSBUaGUgbmV3IHBhdGggdG8gYmUgY3JlYXRlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gbWtkaXIgY29tbWFuZCBvdXRwdXQuXG4gKi9cbm1ldGhvZHMubWtkaXIgPSBhc3luYyBmdW5jdGlvbiBta2RpciAocmVtb3RlUGF0aCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5zaGVsbChbJ21rZGlyJywgJy1wJywgcmVtb3RlUGF0aF0pO1xufTtcblxuLyoqXG4gKiBWZXJpZnkgd2hldGhlciB0aGUgZ2l2ZW4gYXJndW1lbnQgaXMgYVxuICogdmFsaWQgY2xhc3MgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NTdHJpbmcgLSBUaGUgYWN0dWFsIGNsYXNzIG5hbWUgdG8gYmUgdmVyaWZpZWQuXG4gKiBAcmV0dXJuIHs/QXJyYXkuPE1hdGNoPn0gVGhlIHJlc3VsdCBvZiBSZWdleHAuZXhlYyBvcGVyYXRpb25cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBvciBfbnVsbF8gaWYgbm8gbWF0Y2hlcyBhcmUgZm91bmQuXG4gKi9cbm1ldGhvZHMuaXNWYWxpZENsYXNzID0gZnVuY3Rpb24gaXNWYWxpZENsYXNzIChjbGFzc1N0cmluZykge1xuICAvLyBzb21lLnBhY2thZ2Uvc29tZS5wYWNrYWdlLkFjdGl2aXR5XG4gIHJldHVybiBtYXRjaENvbXBvbmVudE5hbWUoY2xhc3NTdHJpbmcpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBSZXNvbHZlQWN0aXZpdHlPcHRpb25zXG4gKiBAcHJvcGVydHkge2Jvb2xlYW4/fSBwcmVmZXJDbWQgW3RydWVdIFdoZXRoZXIgdG8gcHJlZmVyIGBjbWRgIHRvb2wgdXNhZ2UgZm9yXG4gKiBsYXVuY2hhYmxlIGFjdGl2aXR5IG5hbWUgZGV0ZWN0aW9uLiBJdCBtaWdodCBiZSB1c2VmdWwgdG8gZGlzYWJsZSBpdCBpZlxuICogYGNtZCBwYWNrYWdlIHJlc29sdmUtYWN0aXZpdHlgIHJldHVybnMgJ2FuZHJvaWQvY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLlJlc29sdmVyQWN0aXZpdHknLFxuICogd2hpY2ggbWVhbnMgdGhlIGFwcCBoYXMgbm8gZGVmYXVsdCBoYW5kbGVyIHNldCBpbiBzeXN0ZW0gc2V0dGluZ3MuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzE3MTI4IGZvciBtb3JlIGRldGFpbHMuXG4gKiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IGlmIHRoZSB0YXJnZXQgQW5kcm9pZCB2ZXJzaW9uIGlzIGJlbG93IDI0IGFzIHRoZXJlXG4gKiB0aGUgY29ycmVzcG9uZGluZyBgY21kYCBzdWJjb21tYW5kIGlzIG5vdCBpbXBsZW1lbnRlZCBhbmQgZHVtcHN5cyB1c2FnZSBpcyB0aGUgb25seVxuICogcG9zc2libGUgd2F5IHRvIGRldGVjdCB0aGUgbGF1bmNoYWJsZSBhY3Rpdml0eSBuYW1lLlxuICovXG5cbi8qKlxuICogRmV0Y2hlcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGxhdW5jaGFibGUgYWN0aXZpdHkgZm9yIHRoZVxuICogZ2l2ZW4gcGFja2FnZS4gSXQgaXMgZXhwZWN0ZWQgdGhlIHBhY2thZ2UgaXMgYWxyZWFkeSBpbnN0YWxsZWQgb25cbiAqIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHRhcmdldCBwYWNrYWdlIGlkZW50aWZpZXJcbiAqIEBwYXJhbSB7UmVzb2x2ZUFjdGl2aXR5T3B0aW9ucz99IG9wdHNcbiAqIEByZXR1cm4ge3N0cmluZ30gRnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGxhdW5jaGFibGUgYWN0aXZpdHlcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgcmVzb2x2aW5nIHRoZSBhY3Rpdml0eSBuYW1lXG4gKi9cbm1ldGhvZHMucmVzb2x2ZUxhdW5jaGFibGVBY3Rpdml0eSA9IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVMYXVuY2hhYmxlQWN0aXZpdHkgKHBrZywgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHsgcHJlZmVyQ21kID0gdHJ1ZSB9ID0gb3B0cztcbiAgaWYgKCFwcmVmZXJDbWQgfHwgYXdhaXQgdGhpcy5nZXRBcGlMZXZlbCgpIDwgMjQpIHtcbiAgICBjb25zdCBzdGRvdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICdwYWNrYWdlJywgcGtnXSk7XG4gICAgY29uc3QgbmFtZXMgPSBwYXJzZUxhdW5jaGFibGVBY3Rpdml0eU5hbWVzKHN0ZG91dCk7XG4gICAgaWYgKF8uaXNFbXB0eShuYW1lcykpIHtcbiAgICAgIGxvZy5kZWJ1ZyhzdGRvdXQpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcmVzb2x2ZSB0aGUgbGF1bmNoYWJsZSBhY3Rpdml0eSBvZiAnJHtwa2d9Jy4gSXMgaXQgaW5zdGFsbGVkIG9uIHRoZSBkZXZpY2U/YCk7XG4gICAgfVxuICAgIGlmIChuYW1lcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiBuYW1lc1swXTtcbiAgICB9XG5cbiAgICBjb25zdCB0bXBSb290ID0gYXdhaXQgdGVtcERpci5vcGVuRGlyKCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRtcEFwcCA9IGF3YWl0IHRoaXMucHVsbEFwayhwa2csIHRtcFJvb3QpO1xuICAgICAgY29uc3Qge2Fwa0FjdGl2aXR5fSA9IGF3YWl0IHRoaXMucGFja2FnZUFuZExhdW5jaEFjdGl2aXR5RnJvbU1hbmlmZXN0KHRtcEFwcCk7XG4gICAgICByZXR1cm4gYXBrQWN0aXZpdHk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nLmRlYnVnKGUuc3RhY2spO1xuICAgICAgbG9nLndhcm4oYFVuYWJsZSB0byByZXNvbHZlIHRoZSBsYXVuY2hhYmxlIGFjdGl2aXR5IG9mICcke3BrZ30nLiBgICtcbiAgICAgICAgYFRoZSB2ZXJ5IGZpcnN0IG1hdGNoIG9mIHRoZSBkdW1wc3lzIG91dHB1dCBpcyBnb2luZyB0byBiZSB1c2VkLiBgICtcbiAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICAgIHJldHVybiBuYW1lc1swXTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZnMucmltcmFmKHRtcFJvb3QpO1xuICAgIH1cbiAgfVxuICBjb25zdCB7c3Rkb3V0LCBzdGRlcnJ9ID0gYXdhaXQgdGhpcy5zaGVsbChbJ2NtZCcsICdwYWNrYWdlJywgJ3Jlc29sdmUtYWN0aXZpdHknLCAnLS1icmllZicsIHBrZ10sIHtcbiAgICBvdXRwdXRGb3JtYXQ6IHRoaXMuRVhFQ19PVVRQVVRfRk9STUFULkZVTExcbiAgfSk7XG4gIGZvciAoY29uc3QgbGluZSBvZiAoc3Rkb3V0IHx8ICcnKS5zcGxpdCgnXFxuJykubWFwKF8udHJpbSkpIHtcbiAgICBpZiAodGhpcy5pc1ZhbGlkQ2xhc3MobGluZSkpIHtcbiAgICAgIHJldHVybiBsaW5lO1xuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byByZXNvbHZlIHRoZSBsYXVuY2hhYmxlIGFjdGl2aXR5IG9mICcke3BrZ30nLiBPcmlnaW5hbCBlcnJvcjogJHtzdGRlcnIgfHwgc3Rkb3V0fWApO1xufTtcblxuLyoqXG4gKiBGb3JjZSBhcHBsaWNhdGlvbiB0byBzdG9wIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBzdG9wcGVkLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgb3V0cHV0IG9mIHRoZSBjb3JyZXNwb25kaW5nIGFkYiBjb21tYW5kLlxuICovXG5tZXRob2RzLmZvcmNlU3RvcCA9IGFzeW5jIGZ1bmN0aW9uIGZvcmNlU3RvcCAocGtnKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnNoZWxsKFsnYW0nLCAnZm9yY2Utc3RvcCcsIHBrZ10pO1xufTtcblxuLypcbiAqIEtpbGwgYXBwbGljYXRpb25cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBzdG9wcGVkLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgb3V0cHV0IG9mIHRoZSBjb3JyZXNwb25kaW5nIGFkYiBjb21tYW5kLlxuICovXG5tZXRob2RzLmtpbGxQYWNrYWdlID0gYXN5bmMgZnVuY3Rpb24ga2lsbFBhY2thZ2UgKHBrZykge1xuICByZXR1cm4gYXdhaXQgdGhpcy5zaGVsbChbJ2FtJywgJ2tpbGwnLCBwa2ddKTtcbn07XG5cbi8qKlxuICogQ2xlYXIgdGhlIHVzZXIgZGF0YSBvZiB0aGUgcGFydGljdWxhciBhcHBsaWNhdGlvbiBvbiB0aGUgZGV2aWNlXG4gKiB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIGNsZWFyZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBvdXRwdXQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYWRiIGNvbW1hbmQuXG4gKi9cbm1ldGhvZHMuY2xlYXIgPSBhc3luYyBmdW5jdGlvbiBjbGVhciAocGtnKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnNoZWxsKFsncG0nLCAnY2xlYXInLCBwa2ddKTtcbn07XG5cbi8qKlxuICogR3JhbnQgYWxsIHBlcm1pc3Npb25zIHJlcXVlc3RlZCBieSB0aGUgcGFydGljdWxhciBwYWNrYWdlLlxuICogVGhpcyBtZXRob2QgaXMgb25seSB1c2VmdWwgb24gQW5kcm9pZCA2LjArIGFuZCBmb3IgYXBwbGljYXRpb25zXG4gKiB0aGF0IHN1cHBvcnQgY29tcG9uZW50cy1iYXNlZCBwZXJtaXNzaW9ucyBzZXR0aW5nLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcGsgLSBUaGUgcGF0aCB0byB0aGUgYWN0dWFsIGFwayBmaWxlLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBncmFudGluZyBwZXJtaXNzaW9uc1xuICovXG5tZXRob2RzLmdyYW50QWxsUGVybWlzc2lvbnMgPSBhc3luYyBmdW5jdGlvbiBncmFudEFsbFBlcm1pc3Npb25zIChwa2csIGFwaykge1xuICBjb25zdCBhcGlMZXZlbCA9IGF3YWl0IHRoaXMuZ2V0QXBpTGV2ZWwoKTtcbiAgbGV0IHRhcmdldFNkayA9IDA7XG4gIGxldCBkdW1wc3lzT3V0cHV0ID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBpZiAoIWFwaykge1xuICAgICAgLyoqXG4gICAgICAgKiBJZiBhcGsgbm90IHByb3ZpZGVkLCBjb25zaWRlcmluZyBhcGsgYWxyZWFkeSBpbnN0YWxsZWQgb24gdGhlIGRldmljZVxuICAgICAgICogYW5kIGZldGNoaW5nIHRhcmdldFNkayB1c2luZyBwYWNrYWdlIG5hbWUuXG4gICAgICAgKi9cbiAgICAgIGR1bXBzeXNPdXRwdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICdwYWNrYWdlJywgcGtnXSk7XG4gICAgICB0YXJnZXRTZGsgPSBhd2FpdCB0aGlzLnRhcmdldFNka1ZlcnNpb25Vc2luZ1BLRyhwa2csIGR1bXBzeXNPdXRwdXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXRTZGsgPSBhd2FpdCB0aGlzLnRhcmdldFNka1ZlcnNpb25Gcm9tTWFuaWZlc3QoYXBrKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvL2F2b2lkaW5nIGxvZ2dpbmcgZXJyb3Igc3RhY2ssIGFzIGNhbGxpbmcgbGlicmFyeSBmdW5jdGlvbiB3b3VsZCBoYXZlIGxvZ2dlZFxuICAgIGxvZy53YXJuKGBSYW4gaW50byBwcm9ibGVtIGdldHRpbmcgdGFyZ2V0IFNESyB2ZXJzaW9uOyBpZ25vcmluZy4uLmApO1xuICB9XG4gIGlmIChhcGlMZXZlbCA+PSBNSU5fQVBJX0xFVkVMX1dJVEhfUEVSTVNfU1VQUE9SVCAmJiB0YXJnZXRTZGsgPj0gTUlOX0FQSV9MRVZFTF9XSVRIX1BFUk1TX1NVUFBPUlQpIHtcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgZGV2aWNlIGlzIHJ1bm5pbmcgQW5kcm9pZCA2LjAoQVBJIDIzKSBvciBoaWdoZXIsIGFuZCB5b3VyIGFwcCdzIHRhcmdldCBTREsgaXMgMjMgb3IgaGlnaGVyOlxuICAgICAqIFRoZSBhcHAgaGFzIHRvIGxpc3QgdGhlIHBlcm1pc3Npb25zIGluIHRoZSBtYW5pZmVzdC5cbiAgICAgKiByZWZlcjogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vdHJhaW5pbmcvcGVybWlzc2lvbnMvcmVxdWVzdGluZy5odG1sXG4gICAgICovXG4gICAgZHVtcHN5c091dHB1dCA9IGR1bXBzeXNPdXRwdXQgfHwgYXdhaXQgdGhpcy5zaGVsbChbJ2R1bXBzeXMnLCAncGFja2FnZScsIHBrZ10pO1xuICAgIGNvbnN0IHJlcXVlc3RlZFBlcm1pc3Npb25zID0gYXdhaXQgdGhpcy5nZXRSZXFQZXJtaXNzaW9ucyhwa2csIGR1bXBzeXNPdXRwdXQpO1xuICAgIGNvbnN0IGdyYW50ZWRQZXJtaXNzaW9ucyA9IGF3YWl0IHRoaXMuZ2V0R3JhbnRlZFBlcm1pc3Npb25zKHBrZywgZHVtcHN5c091dHB1dCk7XG4gICAgY29uc3QgcGVybWlzc2lvbnNUb0dyYW50ID0gXy5kaWZmZXJlbmNlKHJlcXVlc3RlZFBlcm1pc3Npb25zLCBncmFudGVkUGVybWlzc2lvbnMpO1xuICAgIGlmIChfLmlzRW1wdHkocGVybWlzc2lvbnNUb0dyYW50KSkge1xuICAgICAgbG9nLmluZm8oYCR7cGtnfSBjb250YWlucyBubyBwZXJtaXNzaW9ucyBhdmFpbGFibGUgZm9yIGdyYW50aW5nYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuZ3JhbnRQZXJtaXNzaW9ucyhwa2csIHBlcm1pc3Npb25zVG9HcmFudCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHRhcmdldFNkayA8IE1JTl9BUElfTEVWRUxfV0lUSF9QRVJNU19TVVBQT1JUKSB7XG4gICAgbG9nLmluZm8oYEl0IGlzIG9ubHkgcG9zc2libGUgdG8gZ3JhbnQgcGVybWlzc2lvbnMgaW4gcnVudGltZSBmb3IgYCArXG4gICAgICBgYXBwcyB3aG9zZSB0YXJnZXRTZGtWZXJzaW9uIGluIHRoZSBtYW5pZmVzdCBpcyBzZXQgdG8gJHtNSU5fQVBJX0xFVkVMX1dJVEhfUEVSTVNfU1VQUE9SVH0gb3IgYWJvdmUuIGAgK1xuICAgICAgYFRoZSBjdXJyZW50ICR7cGtnfSB0YXJnZXRTZGtWZXJzaW9uIGlzICR7dGFyZ2V0U2RrIHx8ICd1bnNldCd9LmApO1xuICB9IGVsc2UgaWYgKGFwaUxldmVsIDwgTUlOX0FQSV9MRVZFTF9XSVRIX1BFUk1TX1NVUFBPUlQpIHtcbiAgICBsb2cuaW5mbyhgVGhlIGRldmljZSdzIE9TIEFQSSBsZXZlbCBpcyAke2FwaUxldmVsfS4gYCArXG4gICAgICBgSXQgaXMgb25seSBwb3NzaWJsZSB0byBncmFudCBwZXJtaXNzaW9ucyBvbiBkZXZpY2VzIHJ1bm5pbmcgQW5kcm9pZCA2IG9yIGFib3ZlLmApO1xuICB9XG59O1xuXG4vKipcbiAqIEdyYW50IG11bHRpcGxlIHBlcm1pc3Npb25zIGZvciB0aGUgcGFydGljdWxhciBwYWNrYWdlLlxuICogVGhpcyBjYWxsIGlzIG1vcmUgcGVyZm9ybWFudCB0aGFuIGBncmFudFBlcm1pc3Npb25gIG9uZSwgc2luY2UgaXQgY29tYmluZXNcbiAqIG11bHRpcGxlIGBhZGIgc2hlbGxgIGNhbGxzIGludG8gYSBzaW5nbGUgY29tbWFuZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IHBlcm1pc3Npb25zIC0gVGhlIGxpc3Qgb2YgcGVybWlzc2lvbnMgdG8gYmUgZ3JhbnRlZC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgY2hhbmdpbmcgcGVybWlzc2lvbnMuXG4gKi9cbm1ldGhvZHMuZ3JhbnRQZXJtaXNzaW9ucyA9IGFzeW5jIGZ1bmN0aW9uIGdyYW50UGVybWlzc2lvbnMgKHBrZywgcGVybWlzc2lvbnMpIHtcbiAgLy8gQXMgaXQgY29uc3VtZXMgbW9yZSB0aW1lIGZvciBncmFudGluZyBlYWNoIHBlcm1pc3Npb24sXG4gIC8vIHRyeWluZyB0byBncmFudCBhbGwgcGVybWlzc2lvbiBieSBmb3JtaW5nIGVxdWl2YWxlbnQgY29tbWFuZC5cbiAgLy8gQWxzbywgaXQgaXMgbmVjZXNzYXJ5IHRvIHNwbGl0IGxvbmcgY29tbWFuZHMgaW50byBjaHVua3MsIHNpbmNlIHRoZSBtYXhpbXVtIGxlbmd0aCBvZlxuICAvLyBhZGIgc2hlbGwgYnVmZmVyIGlzIGxpbWl0ZWRcbiAgbG9nLmRlYnVnKGBHcmFudGluZyBwZXJtaXNzaW9ucyAke0pTT04uc3RyaW5naWZ5KHBlcm1pc3Npb25zKX0gdG8gJyR7cGtnfSdgKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLnNoZWxsQ2h1bmtzKChwZXJtKSA9PiBbJ3BtJywgJ2dyYW50JywgcGtnLCBwZXJtXSwgcGVybWlzc2lvbnMpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCFJR05PUkVEX1BFUk1fRVJST1JTLnNvbWUoKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChlLnN0ZGVyciB8fCBlLm1lc3NhZ2UpKSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogR3JhbnQgc2luZ2xlIHBlcm1pc3Npb24gZm9yIHRoZSBwYXJ0aWN1bGFyIHBhY2thZ2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtzdHJpbmd9IHBlcm1pc3Npb24gLSBUaGUgZnVsbCBuYW1lIG9mIHRoZSBwZXJtaXNzaW9uIHRvIGJlIGdyYW50ZWQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGNoYW5naW5nIHBlcm1pc3Npb25zLlxuICovXG5tZXRob2RzLmdyYW50UGVybWlzc2lvbiA9IGFzeW5jIGZ1bmN0aW9uIGdyYW50UGVybWlzc2lvbiAocGtnLCBwZXJtaXNzaW9uKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5zaGVsbChbJ3BtJywgJ2dyYW50JywgcGtnLCBwZXJtaXNzaW9uXSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoIU5PVF9DSEFOR0VBQkxFX1BFUk1fRVJST1IudGVzdChlLnN0ZGVyciB8fCBlLm1lc3NhZ2UpKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBSZXZva2Ugc2luZ2xlIHBlcm1pc3Npb24gZnJvbSB0aGUgcGFydGljdWxhciBwYWNrYWdlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwZXJtaXNzaW9uIC0gVGhlIGZ1bGwgbmFtZSBvZiB0aGUgcGVybWlzc2lvbiB0byBiZSByZXZva2VkLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBjaGFuZ2luZyBwZXJtaXNzaW9ucy5cbiAqL1xubWV0aG9kcy5yZXZva2VQZXJtaXNzaW9uID0gYXN5bmMgZnVuY3Rpb24gcmV2b2tlUGVybWlzc2lvbiAocGtnLCBwZXJtaXNzaW9uKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5zaGVsbChbJ3BtJywgJ3Jldm9rZScsIHBrZywgcGVybWlzc2lvbl0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCFOT1RfQ0hBTkdFQUJMRV9QRVJNX0VSUk9SLnRlc3QoZS5zdGRlcnIgfHwgZS5tZXNzYWdlKSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGxpc3Qgb2YgZ3JhbnRlZCBwZXJtaXNzaW9ucyBmb3IgdGhlIHBhcnRpY3VsYXIgcGFja2FnZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gY21kT3V0cHV0IFtudWxsXSAtIE9wdGlvbmFsIHBhcmFtZXRlciBjb250YWluaW5nIGNvbW1hbmQgb3V0cHV0IG9mXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kdW1wc3lzIHBhY2thZ2VfIGNvbW1hbmQuIEl0IG1heSBzcGVlZCB1cCB0aGUgbWV0aG9kIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm4ge0FycmF5PFN0cmluZz59IFRoZSBsaXN0IG9mIGdyYW50ZWQgcGVybWlzc2lvbnMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgY2hhbmdpbmcgcGVybWlzc2lvbnMuXG4gKi9cbm1ldGhvZHMuZ2V0R3JhbnRlZFBlcm1pc3Npb25zID0gYXN5bmMgZnVuY3Rpb24gZ2V0R3JhbnRlZFBlcm1pc3Npb25zIChwa2csIGNtZE91dHB1dCA9IG51bGwpIHtcbiAgbG9nLmRlYnVnKCdSZXRyaWV2aW5nIGdyYW50ZWQgcGVybWlzc2lvbnMnKTtcbiAgY29uc3Qgc3Rkb3V0ID0gY21kT3V0cHV0IHx8IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ3BhY2thZ2UnLCBwa2ddKTtcbiAgcmV0dXJuIGV4dHJhY3RNYXRjaGluZ1Blcm1pc3Npb25zKHN0ZG91dCwgWydpbnN0YWxsJywgJ3J1bnRpbWUnXSwgdHJ1ZSk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIGRlbmllZCBwZXJtaXNzaW9ucyBmb3IgdGhlIHBhcnRpY3VsYXIgcGFja2FnZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gY21kT3V0cHV0IFtudWxsXSAtIE9wdGlvbmFsIHBhcmFtZXRlciBjb250YWluaW5nIGNvbW1hbmQgb3V0cHV0IG9mXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kdW1wc3lzIHBhY2thZ2VfIGNvbW1hbmQuIEl0IG1heSBzcGVlZCB1cCB0aGUgbWV0aG9kIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm4ge0FycmF5PFN0cmluZz59IFRoZSBsaXN0IG9mIGRlbmllZCBwZXJtaXNzaW9ucyBvciBhbiBlbXB0eSBsaXN0LlxuICovXG5tZXRob2RzLmdldERlbmllZFBlcm1pc3Npb25zID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGVuaWVkUGVybWlzc2lvbnMgKHBrZywgY21kT3V0cHV0ID0gbnVsbCkge1xuICBsb2cuZGVidWcoJ1JldHJpZXZpbmcgZGVuaWVkIHBlcm1pc3Npb25zJyk7XG4gIGNvbnN0IHN0ZG91dCA9IGNtZE91dHB1dCB8fCBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICdwYWNrYWdlJywgcGtnXSk7XG4gIHJldHVybiBleHRyYWN0TWF0Y2hpbmdQZXJtaXNzaW9ucyhzdGRvdXQsIFsnaW5zdGFsbCcsICdydW50aW1lJ10sIGZhbHNlKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGxpc3Qgb2YgcmVxdWVzdGVkIHBlcm1pc3Npb25zIGZvciB0aGUgcGFydGljdWxhciBwYWNrYWdlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjbWRPdXRwdXQgW251bGxdIC0gT3B0aW9uYWwgcGFyYW1ldGVyIGNvbnRhaW5pbmcgY29tbWFuZCBvdXRwdXQgb2ZcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2R1bXBzeXMgcGFja2FnZV8gY29tbWFuZC4gSXQgbWF5IHNwZWVkIHVwIHRoZSBtZXRob2QgZXhlY3V0aW9uLlxuICogQHJldHVybiB7QXJyYXk8U3RyaW5nPn0gVGhlIGxpc3Qgb2YgcmVxdWVzdGVkIHBlcm1pc3Npb25zIG9yIGFuIGVtcHR5IGxpc3QuXG4gKi9cbm1ldGhvZHMuZ2V0UmVxUGVybWlzc2lvbnMgPSBhc3luYyBmdW5jdGlvbiBnZXRSZXFQZXJtaXNzaW9ucyAocGtnLCBjbWRPdXRwdXQgPSBudWxsKSB7XG4gIGxvZy5kZWJ1ZygnUmV0cmlldmluZyByZXF1ZXN0ZWQgcGVybWlzc2lvbnMnKTtcbiAgY29uc3Qgc3Rkb3V0ID0gY21kT3V0cHV0IHx8IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ3BhY2thZ2UnLCBwa2ddKTtcbiAgcmV0dXJuIGV4dHJhY3RNYXRjaGluZ1Blcm1pc3Npb25zKHN0ZG91dCwgWydyZXF1ZXN0ZWQnXSk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIGxvY2F0aW9uIHByb3ZpZGVycyBmb3IgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge0FycmF5LjxTdHJpbmc+fSBUaGUgbGlzdCBvZiBhdmFpbGFibGUgbG9jYXRpb24gcHJvdmlkZXJzIG9yIGFuIGVtcHR5IGxpc3QuXG4gKi9cbm1ldGhvZHMuZ2V0TG9jYXRpb25Qcm92aWRlcnMgPSBhc3luYyBmdW5jdGlvbiBnZXRMb2NhdGlvblByb3ZpZGVycyAoKSB7XG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLmdldFNldHRpbmcoJ3NlY3VyZScsICdsb2NhdGlvbl9wcm92aWRlcnNfYWxsb3dlZCcpO1xuICByZXR1cm4gc3Rkb3V0LnRyaW0oKS5zcGxpdCgnLCcpXG4gICAgLm1hcCgocCkgPT4gcC50cmltKCkpXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbn07XG5cbi8qKlxuICogVG9nZ2xlIHRoZSBzdGF0ZSBvZiBHUFMgbG9jYXRpb24gcHJvdmlkZXIuXG4gKlxuICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkIC0gV2hldGhlciB0byBlbmFibGUgKHRydWUpIG9yIGRpc2FibGUgKGZhbHNlKSB0aGUgR1BTIHByb3ZpZGVyLlxuICovXG5tZXRob2RzLnRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIgPSBhc3luYyBmdW5jdGlvbiB0b2dnbGVHUFNMb2NhdGlvblByb3ZpZGVyIChlbmFibGVkKSB7XG4gIGF3YWl0IHRoaXMuc2V0U2V0dGluZygnc2VjdXJlJywgJ2xvY2F0aW9uX3Byb3ZpZGVyc19hbGxvd2VkJywgYCR7ZW5hYmxlZCA/ICcrJyA6ICctJ31ncHNgKTtcbn07XG5cbi8qKlxuICogU2V0IGhpZGRlbiBhcGkgcG9saWN5IHRvIG1hbmFnZSBhY2Nlc3MgdG8gbm9uLVNESyBBUElzLlxuICogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcHJldmlldy9yZXN0cmljdGlvbnMtbm9uLXNkay1pbnRlcmZhY2VzXG4gKlxuICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSB2YWx1ZSAtIFRoZSBBUEkgZW5mb3JjZW1lbnQgcG9saWN5LlxuICogICAgIEZvciBBbmRyb2lkIFBcbiAqICAgICAwOiBEaXNhYmxlIG5vbi1TREsgQVBJIHVzYWdlIGRldGVjdGlvbi4gVGhpcyB3aWxsIGFsc28gZGlzYWJsZSBsb2dnaW5nLCBhbmQgYWxzbyBicmVhayB0aGUgc3RyaWN0IG1vZGUgQVBJLFxuICogICAgICAgIGRldGVjdE5vblNka0FwaVVzYWdlKCkuIE5vdCByZWNvbW1lbmRlZC5cbiAqICAgICAxOiBcIkp1c3Qgd2FyblwiIC0gcGVybWl0IGFjY2VzcyB0byBhbGwgbm9uLVNESyBBUElzLCBidXQga2VlcCB3YXJuaW5ncyBpbiB0aGUgbG9nLlxuICogICAgICAgIFRoZSBzdHJpY3QgbW9kZSBBUEkgd2lsbCBrZWVwIHdvcmtpbmcuXG4gKiAgICAgMjogRGlzYWxsb3cgdXNhZ2Ugb2YgZGFyayBncmV5IGFuZCBibGFjayBsaXN0ZWQgQVBJcy5cbiAqICAgICAzOiBEaXNhbGxvdyB1c2FnZSBvZiBibGFja2xpc3RlZCBBUElzLCBidXQgYWxsb3cgdXNhZ2Ugb2YgZGFyayBncmV5IGxpc3RlZCBBUElzLlxuICpcbiAqICAgICBGb3IgQW5kcm9pZCBRXG4gKiAgICAgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcHJldmlldy9ub24tc2RrLXEjZW5hYmxlLW5vbi1zZGstYWNjZXNzXG4gKiAgICAgMDogRGlzYWJsZSBhbGwgZGV0ZWN0aW9uIG9mIG5vbi1TREsgaW50ZXJmYWNlcy4gVXNpbmcgdGhpcyBzZXR0aW5nIGRpc2FibGVzIGFsbCBsb2cgbWVzc2FnZXMgZm9yIG5vbi1TREsgaW50ZXJmYWNlIHVzYWdlXG4gKiAgICAgICAgYW5kIHByZXZlbnRzIHlvdSBmcm9tIHRlc3RpbmcgeW91ciBhcHAgdXNpbmcgdGhlIFN0cmljdE1vZGUgQVBJLiBUaGlzIHNldHRpbmcgaXMgbm90IHJlY29tbWVuZGVkLlxuICogICAgIDE6IEVuYWJsZSBhY2Nlc3MgdG8gYWxsIG5vbi1TREsgaW50ZXJmYWNlcywgYnV0IHByaW50IGxvZyBtZXNzYWdlcyB3aXRoIHdhcm5pbmdzIGZvciBhbnkgbm9uLVNESyBpbnRlcmZhY2UgdXNhZ2UuXG4gKiAgICAgICAgVXNpbmcgdGhpcyBzZXR0aW5nIGFsc28gYWxsb3dzIHlvdSB0byB0ZXN0IHlvdXIgYXBwIHVzaW5nIHRoZSBTdHJpY3RNb2RlIEFQSS5cbiAqICAgICAyOiBEaXNhbGxvdyB1c2FnZSBvZiBub24tU0RLIGludGVyZmFjZXMgdGhhdCBiZWxvbmcgdG8gZWl0aGVyIHRoZSBibGFjayBsaXN0XG4gKiAgICAgICAgb3IgdG8gYSByZXN0cmljdGVkIGdyZXlsaXN0IGZvciB5b3VyIHRhcmdldCBBUEkgbGV2ZWwuXG4gKlxuICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVFcnJvciBbZmFsc2VdIFdoZXRoZXIgdG8gaWdub3JlIGFuIGV4Y2VwdGlvbiBpbiAnYWRiIHNoZWxsIHNldHRpbmdzIHB1dCBnbG9iYWwnIGNvbW1hbmRcbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgYW5kIGlnbm9yZUVycm9yIHdhcyB0cnVlIHdoaWxlIGV4ZWN1dGluZyAnYWRiIHNoZWxsIHNldHRpbmdzIHB1dCBnbG9iYWwnXG4gKiAgICAgICAgICAgICAgICAgY29tbWFuZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuc2V0SGlkZGVuQXBpUG9saWN5ID0gYXN5bmMgZnVuY3Rpb24gc2V0SGlkZGVuQXBpUG9saWN5ICh2YWx1ZSwgaWdub3JlRXJyb3IgPSBmYWxzZSkge1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuc2hlbGwoSElEREVOX0FQSV9QT0xJQ1lfS0VZUy5tYXAoKGspID0+IGBzZXR0aW5ncyBwdXQgZ2xvYmFsICR7a30gJHt2YWx1ZX1gKS5qb2luKCc7JykpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCFpZ25vcmVFcnJvcikge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgbG9nLmluZm8oYEZhaWxlZCB0byBzZXQgc2V0dGluZyBrZXlzICcke0hJRERFTl9BUElfUE9MSUNZX0tFWVN9JyB0byAnJHt2YWx1ZX0nLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogUmVzZXQgYWNjZXNzIHRvIG5vbi1TREsgQVBJcyB0byBpdHMgZGVmYXVsdCBzZXR0aW5nLlxuICogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcHJldmlldy9yZXN0cmljdGlvbnMtbm9uLXNkay1pbnRlcmZhY2VzXG4gKlxuICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVFcnJvciBbZmFsc2VdIFdoZXRoZXIgdG8gaWdub3JlIGFuIGV4Y2VwdGlvbiBpbiAnYWRiIHNoZWxsIHNldHRpbmdzIGRlbGV0ZSBnbG9iYWwnIGNvbW1hbmRcbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgYW5kIGlnbm9yZUVycm9yIHdhcyB0cnVlIHdoaWxlIGV4ZWN1dGluZyAnYWRiIHNoZWxsIHNldHRpbmdzIGRlbGV0ZSBnbG9iYWwnXG4gKiAgICAgICAgICAgICAgICAgY29tbWFuZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuc2V0RGVmYXVsdEhpZGRlbkFwaVBvbGljeSA9IGFzeW5jIGZ1bmN0aW9uIHNldERlZmF1bHRIaWRkZW5BcGlQb2xpY3kgKGlnbm9yZUVycm9yID0gZmFsc2UpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLnNoZWxsKEhJRERFTl9BUElfUE9MSUNZX0tFWVMubWFwKChrKSA9PiBgc2V0dGluZ3MgZGVsZXRlIGdsb2JhbCAke2t9YCkuam9pbignOycpKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghaWdub3JlRXJyb3IpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIGxvZy5pbmZvKGBGYWlsZWQgdG8gZGVsZXRlIGtleXMgJyR7SElEREVOX0FQSV9QT0xJQ1lfS0VZU30nLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogU3RvcCB0aGUgcGFydGljdWxhciBwYWNrYWdlIGlmIGl0IGlzIHJ1bm5pbmcgYW5kIGNsZWFycyBpdHMgYXBwbGljYXRpb24gZGF0YS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBwcm9jZXNzZWQuXG4gKi9cbm1ldGhvZHMuc3RvcEFuZENsZWFyID0gYXN5bmMgZnVuY3Rpb24gc3RvcEFuZENsZWFyIChwa2cpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLmZvcmNlU3RvcChwa2cpO1xuICAgIGF3YWl0IHRoaXMuY2xlYXIocGtnKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHN0b3AgYW5kIGNsZWFyICR7cGtnfS4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBpbnB1dCBtZXRob2RzIChJTUVzKSBmb3IgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge0FycmF5LjxTdHJpbmc+fSBUaGUgbGlzdCBvZiBJTUUgbmFtZXMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqL1xubWV0aG9kcy5hdmFpbGFibGVJTUVzID0gYXN5bmMgZnVuY3Rpb24gYXZhaWxhYmxlSU1FcyAoKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGdldElNRUxpc3RGcm9tT3V0cHV0KGF3YWl0IHRoaXMuc2hlbGwoWydpbWUnLCAnbGlzdCcsICctYSddKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGdldHRpbmcgYXZhaWxhYmxlIElNRSdzLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGxpc3Qgb2YgZW5hYmxlZCBpbnB1dCBtZXRob2RzIChJTUVzKSBmb3IgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge0FycmF5LjxTdHJpbmc+fSBUaGUgbGlzdCBvZiBlbmFibGVkIElNRSBuYW1lcyBvciBhbiBlbXB0eSBsaXN0LlxuICovXG5tZXRob2RzLmVuYWJsZWRJTUVzID0gYXN5bmMgZnVuY3Rpb24gZW5hYmxlZElNRXMgKCkge1xuICB0cnkge1xuICAgIHJldHVybiBnZXRJTUVMaXN0RnJvbU91dHB1dChhd2FpdCB0aGlzLnNoZWxsKFsnaW1lJywgJ2xpc3QnXSkpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBnZXR0aW5nIGVuYWJsZWQgSU1FJ3MuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBFbmFibGUgdGhlIHBhcnRpY3VsYXIgaW5wdXQgbWV0aG9kIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW1lSWQgLSBPbmUgb2YgZXhpc3RpbmcgSU1FIGlkcy5cbiAqL1xubWV0aG9kcy5lbmFibGVJTUUgPSBhc3luYyBmdW5jdGlvbiBlbmFibGVJTUUgKGltZUlkKSB7XG4gIGF3YWl0IHRoaXMuc2hlbGwoWydpbWUnLCAnZW5hYmxlJywgaW1lSWRdKTtcbn07XG5cbi8qKlxuICogRGlzYWJsZSB0aGUgcGFydGljdWxhciBpbnB1dCBtZXRob2Qgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbWVJZCAtIE9uZSBvZiBleGlzdGluZyBJTUUgaWRzLlxuICovXG5tZXRob2RzLmRpc2FibGVJTUUgPSBhc3luYyBmdW5jdGlvbiBkaXNhYmxlSU1FIChpbWVJZCkge1xuICBhd2FpdCB0aGlzLnNoZWxsKFsnaW1lJywgJ2Rpc2FibGUnLCBpbWVJZF0pO1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIHBhcnRpY3VsYXIgaW5wdXQgbWV0aG9kIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW1lSWQgLSBPbmUgb2YgZXhpc3RpbmcgSU1FIGlkcy5cbiAqL1xubWV0aG9kcy5zZXRJTUUgPSBhc3luYyBmdW5jdGlvbiBzZXRJTUUgKGltZUlkKSB7XG4gIGF3YWl0IHRoaXMuc2hlbGwoWydpbWUnLCAnc2V0JywgaW1lSWRdKTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBkZWZhdWx0IGlucHV0IG1ldGhvZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7P3N0cmluZ30gVGhlIG5hbWUgb2YgdGhlIGRlZmF1bHQgaW5wdXQgbWV0aG9kXG4gKi9cbm1ldGhvZHMuZGVmYXVsdElNRSA9IGFzeW5jIGZ1bmN0aW9uIGRlZmF1bHRJTUUgKCkge1xuICB0cnkge1xuICAgIGxldCBlbmdpbmUgPSBhd2FpdCB0aGlzLmdldFNldHRpbmcoJ3NlY3VyZScsICdkZWZhdWx0X2lucHV0X21ldGhvZCcpO1xuICAgIGlmIChlbmdpbmUgPT09ICdudWxsJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBlbmdpbmUudHJpbSgpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBnZXR0aW5nIGRlZmF1bHQgSU1FLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogU2VuZCB0aGUgcGFydGljdWxhciBrZXljb2RlIHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGtleWNvZGUgLSBUaGUgYWN0dWFsIGtleSBjb2RlIHRvIGJlIHNlbnQuXG4gKi9cbm1ldGhvZHMua2V5ZXZlbnQgPSBhc3luYyBmdW5jdGlvbiBrZXlldmVudCAoa2V5Y29kZSkge1xuICAvLyBrZXljb2RlIG11c3QgYmUgYW4gaW50LlxuICBsZXQgY29kZSA9IHBhcnNlSW50KGtleWNvZGUsIDEwKTtcbiAgYXdhaXQgdGhpcy5zaGVsbChbJ2lucHV0JywgJ2tleWV2ZW50JywgY29kZV0pO1xufTtcblxuLyoqXG4gKiBTZW5kIHRoZSBwYXJ0aWN1bGFyIHRleHQgb3IgYSBudW1iZXIgdG8gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogVGhlIHRleHQgZ2V0cyBwcm9wZXJseSBlc2NhcGVkIGJlZm9yZSBiZWluZyBwYXNzZWQgdG8gQURCLlxuICogTm9vcCBpZiB0aGUgdGV4dCBpcyBlbXB0eS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHRleHQgLSBUaGUgYWN0dWFsIHRleHQgdG8gYmUgc2VudC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBpdCBpcyBpbXBvc3NpYmxlIHRvIGVzY2FwZSB0aGUgZ2l2ZW4gc3RyaW5nXG4gKi9cbm1ldGhvZHMuaW5wdXRUZXh0ID0gYXN5bmMgZnVuY3Rpb24gaW5wdXRUZXh0ICh0ZXh0KSB7XG4gIGlmICh0ZXh0ID09PSAnJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG9yaWdpbmFsU3RyID0gYCR7dGV4dH1gO1xuICBjb25zdCBlc2NhcGVkVGV4dCA9IG9yaWdpbmFsU3RyLnJlcGxhY2UoL1xcJC9nLCAnXFxcXCQnKS5yZXBsYWNlKC8gL2csICclcycpO1xuICBsZXQgYXJncyA9IFsnaW5wdXQnLCAndGV4dCcsIG9yaWdpbmFsU3RyXTtcbiAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjU3OTE0MjMvYWRiLXNoZWxsLWlucHV0LXRleHQtZG9lcy1ub3QtdGFrZS1hbXBlcnNhbmQtY2hhcmFjdGVyLzI1NzkxNDk4XG4gIGNvbnN0IGFkYklucHV0RXNjYXBlUGF0dGVybiA9IC9bKCk8Pnw7JipcXFxcfl5cIiddL2c7XG4gIGlmIChlc2NhcGVkVGV4dCAhPT0gb3JpZ2luYWxTdHIgfHwgYWRiSW5wdXRFc2NhcGVQYXR0ZXJuLnRlc3Qob3JpZ2luYWxTdHIpKSB7XG4gICAgaWYgKF8uZXZlcnkoWydcIicsIGAnYF0sIChjKSA9PiBvcmlnaW5hbFN0ci5pbmNsdWRlcyhjKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYERpZCBub3Qga25vdyBob3cgdG8gZXNjYXBlIGEgc3RyaW5nIHRoYXQgY29udGFpbnMgYm90aCB0eXBlcyBvZiBxdW90ZXMgKFwiIGFuZCAnKWBcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHEgPSBvcmlnaW5hbFN0ci5pbmNsdWRlcygnXCInKSA/IGAnYCA6ICdcIic7XG4gICAgYXJncyA9IFtgaW5wdXQgdGV4dCAke3F9JHtlc2NhcGVkVGV4dH0ke3F9YF07XG4gIH1cbiAgYXdhaXQgdGhpcy5zaGVsbChhcmdzKTtcbn07XG5cbi8qKlxuICogQ2xlYXIgdGhlIGFjdGl2ZSB0ZXh0IGZpZWxkIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdCBieSBzZW5kaW5nXG4gKiBzcGVjaWFsIGtleWV2ZW50cyB0byBpdC5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIFsxMDBdIC0gVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSB0ZXh0IGluIHRoZSBmaWVsZCB0byBiZSBjbGVhcmVkLlxuICovXG5tZXRob2RzLmNsZWFyVGV4dEZpZWxkID0gYXN5bmMgZnVuY3Rpb24gY2xlYXJUZXh0RmllbGQgKGxlbmd0aCA9IDEwMCkge1xuICAvLyBhc3N1bWVzIHRoYXQgdGhlIEVkaXRUZXh0IGZpZWxkIGFscmVhZHkgaGFzIGZvY3VzXG4gIGxvZy5kZWJ1ZyhgQ2xlYXJpbmcgdXAgdG8gJHtsZW5ndGh9IGNoYXJhY3RlcnNgKTtcbiAgaWYgKGxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICBsZXQgYXJncyA9IFsnaW5wdXQnLCAna2V5ZXZlbnQnXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIC8vIHdlIGNhbm5vdCBrbm93IHdoZXJlIHRoZSBjdXJzb3IgaXMgaW4gdGhlIHRleHQgZmllbGQsIHNvIGRlbGV0ZSBib3RoIGJlZm9yZVxuICAgIC8vIGFuZCBhZnRlciBzbyB0aGF0IHdlIGdldCByaWQgb2YgZXZlcnl0aGluZ1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL3ZpZXcvS2V5RXZlbnQuaHRtbCNLRVlDT0RFX0RFTFxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL3ZpZXcvS2V5RXZlbnQuaHRtbCNLRVlDT0RFX0ZPUldBUkRfREVMXG4gICAgYXJncy5wdXNoKCc2NycsICcxMTInKTtcbiAgfVxuICBhd2FpdCB0aGlzLnNoZWxsKGFyZ3MpO1xufTtcblxuLyoqXG4gKiBTZW5kIHRoZSBzcGVjaWFsIGtleWNvZGUgdG8gdGhlIGRldmljZSB1bmRlciB0ZXN0IGluIG9yZGVyIHRvIGxvY2sgaXQuXG4gKi9cbm1ldGhvZHMubG9jayA9IGFzeW5jIGZ1bmN0aW9uIGxvY2sgKCkge1xuICBpZiAoYXdhaXQgdGhpcy5pc1NjcmVlbkxvY2tlZCgpKSB7XG4gICAgbG9nLmRlYnVnKCdTY3JlZW4gaXMgYWxyZWFkeSBsb2NrZWQuIERvaW5nIG5vdGhpbmcuJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxvZy5kZWJ1ZygnUHJlc3NpbmcgdGhlIEtFWUNPREVfUE9XRVIgYnV0dG9uIHRvIGxvY2sgc2NyZWVuJyk7XG4gIGF3YWl0IHRoaXMua2V5ZXZlbnQoMjYpO1xuXG4gIGNvbnN0IHRpbWVvdXRNcyA9IDUwMDA7XG4gIHRyeSB7XG4gICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmlzU2NyZWVuTG9ja2VkKCksIHtcbiAgICAgIHdhaXRNczogdGltZW91dE1zLFxuICAgICAgaW50ZXJ2YWxNczogNTAwLFxuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgZGV2aWNlIHNjcmVlbiBpcyBzdGlsbCBsb2NrZWQgYWZ0ZXIgJHt0aW1lb3V0TXN9bXMgdGltZW91dGApO1xuICB9XG59O1xuXG4vKipcbiAqIFNlbmQgdGhlIHNwZWNpYWwga2V5Y29kZSB0byB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgaW4gb3JkZXIgdG8gZW11bGF0ZVxuICogQmFjayBidXR0b24gdGFwLlxuICovXG5tZXRob2RzLmJhY2sgPSBhc3luYyBmdW5jdGlvbiBiYWNrICgpIHtcbiAgbG9nLmRlYnVnKCdQcmVzc2luZyB0aGUgQkFDSyBidXR0b24nKTtcbiAgYXdhaXQgdGhpcy5rZXlldmVudCg0KTtcbn07XG5cbi8qKlxuICogU2VuZCB0aGUgc3BlY2lhbCBrZXljb2RlIHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdCBpbiBvcmRlciB0byBlbXVsYXRlXG4gKiBIb21lIGJ1dHRvbiB0YXAuXG4gKi9cbm1ldGhvZHMuZ29Ub0hvbWUgPSBhc3luYyBmdW5jdGlvbiBnb1RvSG9tZSAoKSB7XG4gIGxvZy5kZWJ1ZygnUHJlc3NpbmcgdGhlIEhPTUUgYnV0dG9uJyk7XG4gIGF3YWl0IHRoaXMua2V5ZXZlbnQoMyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gdGhlIGFjdHVhbCBwYXRoIHRvIGFkYiBleGVjdXRhYmxlLlxuICovXG5tZXRob2RzLmdldEFkYlBhdGggPSBmdW5jdGlvbiBnZXRBZGJQYXRoICgpIHtcbiAgcmV0dXJuIHRoaXMuZXhlY3V0YWJsZS5wYXRoO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSBjdXJyZW50IHNjcmVlbiBvcmllbnRhdGlvbiBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgY3VycmVudCBvcmllbnRhdGlvbiBlbmNvZGVkIGFzIGFuIGludGVnZXIgbnVtYmVyLlxuICovXG5tZXRob2RzLmdldFNjcmVlbk9yaWVudGF0aW9uID0gYXN5bmMgZnVuY3Rpb24gZ2V0U2NyZWVuT3JpZW50YXRpb24gKCkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5zaGVsbChbJ2R1bXBzeXMnLCAnaW5wdXQnXSk7XG4gIHJldHVybiBnZXRTdXJmYWNlT3JpZW50YXRpb24oc3Rkb3V0KTtcbn07XG5cbi8qKlxuICogU2VuZCBhbiBhcmJpdHJhcnkgVGVsbmV0IGNvbW1hbmQgdG8gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgdG8gYmUgc2VudC5cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBhY3R1YWwgb3V0cHV0IG9mIHRoZSBnaXZlbiBjb21tYW5kLlxuICovXG5tZXRob2RzLnNlbmRUZWxuZXRDb21tYW5kID0gYXN5bmMgZnVuY3Rpb24gc2VuZFRlbG5ldENvbW1hbmQgKGNvbW1hbmQpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY0VtdUNvbnNvbGVDb21tYW5kKGNvbW1hbmQsIHtwb3J0OiBhd2FpdCB0aGlzLmdldEVtdWxhdG9yUG9ydCgpfSk7XG59O1xuXG4vKipcbiAqIENoZWNrIHRoZSBzdGF0ZSBvZiBBaXJwbGFuZSBtb2RlIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIEFpcnBsYW5lIG1vZGUgaXMgZW5hYmxlZC5cbiAqL1xubWV0aG9kcy5pc0FpcnBsYW5lTW9kZU9uID0gYXN5bmMgZnVuY3Rpb24gaXNBaXJwbGFuZU1vZGVPbiAoKSB7XG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLmdldFNldHRpbmcoJ2dsb2JhbCcsICdhaXJwbGFuZV9tb2RlX29uJyk7XG4gIHJldHVybiBwYXJzZUludChzdGRvdXQsIDEwKSAhPT0gMDtcbn07XG5cbi8qKlxuICogQ2hhbmdlIHRoZSBzdGF0ZSBvZiBBaXJwbGFuZSBtb2RlIGluIFNldHRpbmdzIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9uIC0gVHJ1ZSB0byBlbmFibGUgdGhlIEFpcnBsYW5lIG1vZGUgaW4gU2V0dGluZ3MgYW5kIGZhbHNlIHRvIGRpc2FibGUgaXQuXG4gKi9cbm1ldGhvZHMuc2V0QWlycGxhbmVNb2RlID0gYXN5bmMgZnVuY3Rpb24gc2V0QWlycGxhbmVNb2RlIChvbikge1xuICBhd2FpdCB0aGlzLnNldFNldHRpbmcoJ2dsb2JhbCcsICdhaXJwbGFuZV9tb2RlX29uJywgb24gPyAxIDogMCk7XG59O1xuXG4vKipcbiAqIEJyb2FkY2FzdCB0aGUgc3RhdGUgb2YgQWlycGxhbmUgbW9kZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHtAbGluayAjc2V0QWlycGxhbmVNb2RlfSwgb3RoZXJ3aXNlXG4gKiB0aGUgbW9kZSBjaGFuZ2UgaXMgbm90IGdvaW5nIHRvIGJlIGFwcGxpZWQgZm9yIHRoZSBkZXZpY2UuXG4gKlxuICogQHBhcmFtIHtib29sZWFufSBvbiAtIFRydWUgdG8gYnJvYWRjYXN0IGVuYWJsZSBhbmQgZmFsc2UgdG8gYnJvYWRjYXN0IGRpc2FibGUuXG4gKi9cbm1ldGhvZHMuYnJvYWRjYXN0QWlycGxhbmVNb2RlID0gYXN5bmMgZnVuY3Rpb24gYnJvYWRjYXN0QWlycGxhbmVNb2RlIChvbikge1xuICBjb25zdCBhcmdzID0gW1xuICAgICdhbScsICdicm9hZGNhc3QnLFxuICAgICctYScsICdhbmRyb2lkLmludGVudC5hY3Rpb24uQUlSUExBTkVfTU9ERScsXG4gICAgJy0tZXonLCAnc3RhdGUnLCBvbiA/ICd0cnVlJyA6ICdmYWxzZScsXG4gIF07XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5zaGVsbChhcmdzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy8xNzQyMlxuICAgIGlmIChfLmluY2x1ZGVzKGUuc3RkZXJyLCAnU2VjdXJpdHlFeGNlcHRpb24nKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zaGVsbChhcmdzLCB7cHJpdmlsZWdlZDogdHJ1ZX0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgfVxuICAgIHRocm93IGU7XG4gIH1cbn07XG5cbi8qKlxuICogQ2hlY2sgdGhlIHN0YXRlIG9mIFdpRmkgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgV2lGaSBpcyBlbmFibGVkLlxuICovXG5tZXRob2RzLmlzV2lmaU9uID0gYXN5bmMgZnVuY3Rpb24gaXNXaWZpT24gKCkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5nKCdnbG9iYWwnLCAnd2lmaV9vbicpO1xuICByZXR1cm4gKHBhcnNlSW50KHN0ZG91dCwgMTApICE9PSAwKTtcbn07XG5cbi8qKlxuICogQ2hlY2sgdGhlIHN0YXRlIG9mIERhdGEgdHJhbnNmZXIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgRGF0YSB0cmFuc2ZlciBpcyBlbmFibGVkLlxuICovXG5tZXRob2RzLmlzRGF0YU9uID0gYXN5bmMgZnVuY3Rpb24gaXNEYXRhT24gKCkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5nKCdnbG9iYWwnLCAnbW9iaWxlX2RhdGEnKTtcbiAgcmV0dXJuIChwYXJzZUludChzdGRvdXQsIDEwKSAhPT0gMCk7XG59O1xuXG4vKipcbiAqIENoYW5nZSB0aGUgc3RhdGUgb2YgV2lGaSBhbmQvb3IgRGF0YSB0cmFuc2ZlciBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtib29sZWFufSB3aWZpIC0gVHJ1ZSB0byBlbmFibGUgYW5kIGZhbHNlIHRvIGRpc2FibGUgV2lGaS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gZGF0YSAtIFRydWUgdG8gZW5hYmxlIGFuZCBmYWxzZSB0byBkaXNhYmxlIERhdGEgdHJhbnNmZXIuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzRW11bGF0b3IgW2ZhbHNlXSAtIFNldCBpdCB0byB0cnVlIGlmIHRoZSBkZXZpY2UgdW5kZXIgdGVzdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBhbiBlbXVsYXRvciByYXRoZXIgdGhhbiBhIHJlYWwgZGV2aWNlLlxuICovXG5tZXRob2RzLnNldFdpZmlBbmREYXRhID0gYXN5bmMgZnVuY3Rpb24gc2V0V2lmaUFuZERhdGEgKHt3aWZpLCBkYXRhfSwgaXNFbXVsYXRvciA9IGZhbHNlKSB7XG4gIGlmICh1dGlsLmhhc1ZhbHVlKHdpZmkpKSB7XG4gICAgYXdhaXQgdGhpcy5zZXRXaWZpU3RhdGUod2lmaSwgaXNFbXVsYXRvcik7XG4gIH1cbiAgaWYgKHV0aWwuaGFzVmFsdWUoZGF0YSkpIHtcbiAgICBhd2FpdCB0aGlzLnNldERhdGFTdGF0ZShkYXRhLCBpc0VtdWxhdG9yKTtcbiAgfVxufTtcblxuLyoqXG4gKiBDaGVjayB0aGUgc3RhdGUgb2YgYW5pbWF0aW9uIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGF0IGxlYXN0IG9uZSBvZiBhbmltYXRpb24gc2NhbGUgc2V0dGluZ3NcbiAqICAgICAgICAgICAgICAgICAgIGlzIG5vdCBlcXVhbCB0byAnMC4wJy5cbiAqL1xubWV0aG9kcy5pc0FuaW1hdGlvbk9uID0gYXN5bmMgZnVuY3Rpb24gaXNBbmltYXRpb25PbiAoKSB7XG4gIGxldCBhbmltYXRvcl9kdXJhdGlvbl9zY2FsZSA9IGF3YWl0IHRoaXMuZ2V0U2V0dGluZygnZ2xvYmFsJywgJ2FuaW1hdG9yX2R1cmF0aW9uX3NjYWxlJyk7XG4gIGxldCB0cmFuc2l0aW9uX2FuaW1hdGlvbl9zY2FsZSA9IGF3YWl0IHRoaXMuZ2V0U2V0dGluZygnZ2xvYmFsJywgJ3RyYW5zaXRpb25fYW5pbWF0aW9uX3NjYWxlJyk7XG4gIGxldCB3aW5kb3dfYW5pbWF0aW9uX3NjYWxlID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5nKCdnbG9iYWwnLCAnd2luZG93X2FuaW1hdGlvbl9zY2FsZScpO1xuICByZXR1cm4gXy5zb21lKFthbmltYXRvcl9kdXJhdGlvbl9zY2FsZSwgdHJhbnNpdGlvbl9hbmltYXRpb25fc2NhbGUsIHdpbmRvd19hbmltYXRpb25fc2NhbGVdLFxuICAgICAgICAgICAgICAgIChzZXR0aW5nKSA9PiBzZXR0aW5nICE9PSAnMC4wJyk7XG59O1xuXG4vKipcbiAqIEZvcmNlZnVsbHkgcmVjdXJzaXZlbHkgcmVtb3ZlIGEgcGF0aCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKiBCZSBjYXJlZnVsIHdoaWxlIGNhbGxpbmcgdGhpcyBtZXRob2QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBUaGUgcGF0aCB0byBiZSByZW1vdmVkIHJlY3Vyc2l2ZWx5LlxuICovXG5tZXRob2RzLnJpbXJhZiA9IGFzeW5jIGZ1bmN0aW9uIHJpbXJhZiAocGF0aCkge1xuICBhd2FpdCB0aGlzLnNoZWxsKFsncm0nLCAnLXJmJywgcGF0aF0pO1xufTtcblxuLyoqXG4gKiBTZW5kIGEgZmlsZSB0byB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2FsUGF0aCAtIFRoZSBwYXRoIHRvIHRoZSBmaWxlIG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS5cbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVQYXRoIC0gVGhlIGRlc3RpbmF0aW9uIHBhdGggb24gdGhlIHJlbW90ZSBkZXZpY2UuXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0cyAtIEFkZGl0aW9uYWwgb3B0aW9ucyBtYXBwaW5nLiBTZWVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9ub2RlLXRlZW5fcHJvY2VzcyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgX2V4ZWNfIG1ldGhvZCBvcHRpb25zLCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhdmFpbGFibGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5cbiAqL1xubWV0aG9kcy5wdXNoID0gYXN5bmMgZnVuY3Rpb24gcHVzaCAobG9jYWxQYXRoLCByZW1vdGVQYXRoLCBvcHRzKSB7XG4gIGF3YWl0IHRoaXMubWtkaXIocGF0aC5wb3NpeC5kaXJuYW1lKHJlbW90ZVBhdGgpKTtcbiAgYXdhaXQgdGhpcy5hZGJFeGVjKFsncHVzaCcsIGxvY2FsUGF0aCwgcmVtb3RlUGF0aF0sIG9wdHMpO1xufTtcblxuLyoqXG4gKiBSZWNlaXZlIGEgZmlsZSBmcm9tIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCAtIFRoZSBzb3VyY2UgcGF0aCBvbiB0aGUgcmVtb3RlIGRldmljZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhbFBhdGggLSBUaGUgZGVzdGluYXRpb24gcGF0aCB0byB0aGUgZmlsZSBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0cyAtIEFkZGl0aW9uYWwgb3B0aW9ucyBtYXBwaW5nLiBTZWVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9ub2RlLXRlZW5fcHJvY2VzcyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgX2V4ZWNfIG1ldGhvZCBvcHRpb25zLCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhdmFpbGFibGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5cbiAqL1xubWV0aG9kcy5wdWxsID0gYXN5bmMgZnVuY3Rpb24gcHVsbCAocmVtb3RlUGF0aCwgbG9jYWxQYXRoLCBvcHRzID0ge30pIHtcbiAgLy8gcHVsbCBmb2xkZXIgY2FuIHRha2UgbW9yZSB0aW1lLCBpbmNyZWFzaW5nIHRpbWUgb3V0IHRvIDYwIHNlY3NcbiAgYXdhaXQgdGhpcy5hZGJFeGVjKFsncHVsbCcsIHJlbW90ZVBhdGgsIGxvY2FsUGF0aF0sIHsuLi5vcHRzLCB0aW1lb3V0OiBvcHRzLnRpbWVvdXQgPz8gNjAwMDB9KTtcbn07XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgcHJvY2VzcyB3aXRoIHRoZSBwYXJ0aWN1bGFyIG5hbWUgaXMgcnVubmluZyBvbiB0aGUgZGV2aWNlXG4gKiB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9jZXNzTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9jZXNzIHRvIGJlIGNoZWNrZWQuXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBnaXZlbiBwcm9jZXNzIGlzIHJ1bm5pbmcuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGdpdmVuIHByb2Nlc3MgbmFtZSBpcyBub3QgYSB2YWxpZCBjbGFzcyBuYW1lLlxuICovXG5tZXRob2RzLnByb2Nlc3NFeGlzdHMgPSBhc3luYyBmdW5jdGlvbiBwcm9jZXNzRXhpc3RzIChwcm9jZXNzTmFtZSkge1xuICByZXR1cm4gIV8uaXNFbXB0eShhd2FpdCB0aGlzLmdldFBJRHNCeU5hbWUocHJvY2Vzc05hbWUpKTtcbn07XG5cbi8qKlxuICogR2V0IFRDUCBwb3J0IGZvcndhcmRpbmcgd2l0aCBhZGIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogQHJldHVybiB7QXJyYXkuPFN0cmluZz59IFRoZSBvdXRwdXQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYWRiIGNvbW1hbmQuIEFuIGFycmF5IGNvbnRhaW5zIGVhY2ggZm9yd2FyZGluZyBsaW5lIG9mIG91dHB1dFxuICovXG5tZXRob2RzLmdldEZvcndhcmRMaXN0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0Rm9yd2FyZExpc3QgKCkge1xuICBsb2cuZGVidWcoYExpc3QgZm9yd2FyZGluZyBwb3J0c2ApO1xuICBjb25zdCBjb25uZWN0aW9ucyA9IGF3YWl0IHRoaXMuYWRiRXhlYyhbJ2ZvcndhcmQnLCAnLS1saXN0J10pO1xuICByZXR1cm4gY29ubmVjdGlvbnMuc3BsaXQoRU9MKS5maWx0ZXIoKGxpbmUpID0+IEJvb2xlYW4obGluZS50cmltKCkpKTtcbn07XG5cbi8qKlxuICogU2V0dXAgVENQIHBvcnQgZm9yd2FyZGluZyB3aXRoIGFkYiBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBzeXN0ZW1Qb3J0IC0gVGhlIG51bWJlciBvZiB0aGUgbG9jYWwgc3lzdGVtIHBvcnQuXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGRldmljZVBvcnQgLSBUaGUgbnVtYmVyIG9mIHRoZSByZW1vdGUgZGV2aWNlIHBvcnQuXG4gKi9cbm1ldGhvZHMuZm9yd2FyZFBvcnQgPSBhc3luYyBmdW5jdGlvbiBmb3J3YXJkUG9ydCAoc3lzdGVtUG9ydCwgZGV2aWNlUG9ydCkge1xuICBsb2cuZGVidWcoYEZvcndhcmRpbmcgc3lzdGVtOiAke3N5c3RlbVBvcnR9IHRvIGRldmljZTogJHtkZXZpY2VQb3J0fWApO1xuICBhd2FpdCB0aGlzLmFkYkV4ZWMoWydmb3J3YXJkJywgYHRjcDoke3N5c3RlbVBvcnR9YCwgYHRjcDoke2RldmljZVBvcnR9YF0pO1xufTtcblxuLyoqXG4gKiBSZW1vdmUgVENQIHBvcnQgZm9yd2FyZGluZyB3aXRoIGFkYiBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuIFRoZSBmb3J3YXJkaW5nXG4gKiBmb3IgdGhlIGdpdmVuIHBvcnQgc2hvdWxkIGJlIHNldHVwIHdpdGgge0BsaW5rICNmb3J3YXJkUG9ydH0gZmlyc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBzeXN0ZW1Qb3J0IC0gVGhlIG51bWJlciBvZiB0aGUgbG9jYWwgc3lzdGVtIHBvcnRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHJlbW92ZSBmb3J3YXJkaW5nIG9uLlxuICovXG5tZXRob2RzLnJlbW92ZVBvcnRGb3J3YXJkID0gYXN5bmMgZnVuY3Rpb24gcmVtb3ZlUG9ydEZvcndhcmQgKHN5c3RlbVBvcnQpIHtcbiAgbG9nLmRlYnVnKGBSZW1vdmluZyBmb3J3YXJkZWQgcG9ydCBzb2NrZXQgY29ubmVjdGlvbjogJHtzeXN0ZW1Qb3J0fSBgKTtcbiAgYXdhaXQgdGhpcy5hZGJFeGVjKFsnZm9yd2FyZCcsIGAtLXJlbW92ZWAsIGB0Y3A6JHtzeXN0ZW1Qb3J0fWBdKTtcbn07XG5cbi8qKlxuICogR2V0IFRDUCBwb3J0IGZvcndhcmRpbmcgd2l0aCBhZGIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogQHJldHVybiB7QXJyYXkuPFN0cmluZz59IFRoZSBvdXRwdXQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYWRiIGNvbW1hbmQuIEFuIGFycmF5IGNvbnRhaW5zIGVhY2ggZm9yd2FyZGluZyBsaW5lIG9mIG91dHB1dFxuICovXG5tZXRob2RzLmdldFJldmVyc2VMaXN0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0UmV2ZXJzZUxpc3QgKCkge1xuICBsb2cuZGVidWcoYExpc3QgcmV2ZXJzZSBmb3J3YXJkaW5nIHBvcnRzYCk7XG4gIGNvbnN0IGNvbm5lY3Rpb25zID0gYXdhaXQgdGhpcy5hZGJFeGVjKFsncmV2ZXJzZScsICctLWxpc3QnXSk7XG4gIHJldHVybiBjb25uZWN0aW9ucy5zcGxpdChFT0wpLmZpbHRlcigobGluZSkgPT4gQm9vbGVhbihsaW5lLnRyaW0oKSkpO1xufTtcblxuLyoqXG4gKiBTZXR1cCBUQ1AgcG9ydCBmb3J3YXJkaW5nIHdpdGggYWRiIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqIE9ubHkgYXZhaWxhYmxlIGZvciBBUEkgMjErLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gZGV2aWNlUG9ydCAtIFRoZSBudW1iZXIgb2YgdGhlIHJlbW90ZSBkZXZpY2UgcG9ydC5cbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gc3lzdGVtUG9ydCAtIFRoZSBudW1iZXIgb2YgdGhlIGxvY2FsIHN5c3RlbSBwb3J0LlxuICovXG5tZXRob2RzLnJldmVyc2VQb3J0ID0gYXN5bmMgZnVuY3Rpb24gcmV2ZXJzZVBvcnQgKGRldmljZVBvcnQsIHN5c3RlbVBvcnQpIHtcbiAgbG9nLmRlYnVnKGBGb3J3YXJkaW5nIGRldmljZTogJHtkZXZpY2VQb3J0fSB0byBzeXN0ZW06ICR7c3lzdGVtUG9ydH1gKTtcbiAgYXdhaXQgdGhpcy5hZGJFeGVjKFsncmV2ZXJzZScsIGB0Y3A6JHtkZXZpY2VQb3J0fWAsIGB0Y3A6JHtzeXN0ZW1Qb3J0fWBdKTtcbn07XG5cbi8qKlxuICogUmVtb3ZlIFRDUCBwb3J0IGZvcndhcmRpbmcgd2l0aCBhZGIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LiBUaGUgZm9yd2FyZGluZ1xuICogZm9yIHRoZSBnaXZlbiBwb3J0IHNob3VsZCBiZSBzZXR1cCB3aXRoIHtAbGluayAjZm9yd2FyZFBvcnR9IGZpcnN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gZGV2aWNlUG9ydCAtIFRoZSBudW1iZXIgb2YgdGhlIHJlbW90ZSBkZXZpY2UgcG9ydFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gcmVtb3ZlIGZvcndhcmRpbmcgb24uXG4gKi9cbm1ldGhvZHMucmVtb3ZlUG9ydFJldmVyc2UgPSBhc3luYyBmdW5jdGlvbiByZW1vdmVQb3J0UmV2ZXJzZSAoZGV2aWNlUG9ydCkge1xuICBsb2cuZGVidWcoYFJlbW92aW5nIHJldmVyc2UgZm9yd2FyZGVkIHBvcnQgc29ja2V0IGNvbm5lY3Rpb246ICR7ZGV2aWNlUG9ydH0gYCk7XG4gIGF3YWl0IHRoaXMuYWRiRXhlYyhbJ3JldmVyc2UnLCBgLS1yZW1vdmVgLCBgdGNwOiR7ZGV2aWNlUG9ydH1gXSk7XG59O1xuXG4vKipcbiAqIFNldHVwIFRDUCBwb3J0IGZvcndhcmRpbmcgd2l0aCBhZGIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LiBUaGUgZGlmZmVyZW5jZVxuICogYmV0d2VlbiB7QGxpbmsgI2ZvcndhcmRQb3J0fSBpcyB0aGF0IHRoaXMgbWV0aG9kIGRvZXMgc2V0dXAgZm9yIGFuIGFic3RyYWN0XG4gKiBsb2NhbCBwb3J0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gc3lzdGVtUG9ydCAtIFRoZSBudW1iZXIgb2YgdGhlIGxvY2FsIHN5c3RlbSBwb3J0LlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBkZXZpY2VQb3J0IC0gVGhlIG51bWJlciBvZiB0aGUgcmVtb3RlIGRldmljZSBwb3J0LlxuICovXG5tZXRob2RzLmZvcndhcmRBYnN0cmFjdFBvcnQgPSBhc3luYyBmdW5jdGlvbiBmb3J3YXJkQWJzdHJhY3RQb3J0IChzeXN0ZW1Qb3J0LCBkZXZpY2VQb3J0KSB7XG4gIGxvZy5kZWJ1ZyhgRm9yd2FyZGluZyBzeXN0ZW06ICR7c3lzdGVtUG9ydH0gdG8gYWJzdHJhY3QgZGV2aWNlOiAke2RldmljZVBvcnR9YCk7XG4gIGF3YWl0IHRoaXMuYWRiRXhlYyhbJ2ZvcndhcmQnLCBgdGNwOiR7c3lzdGVtUG9ydH1gLCBgbG9jYWxhYnN0cmFjdDoke2RldmljZVBvcnR9YF0pO1xufTtcblxuLyoqXG4gKiBFeGVjdXRlIHBpbmcgc2hlbGwgY29tbWFuZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgY29tbWFuZCBvdXRwdXQgY29udGFpbnMgJ3BpbmcnIHN1YnN0cmluZy5cbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgZXhlY3V0aW5nICdwaW5nJyBjb21tYW5kIG9uIHRoZVxuICogICAgICAgICAgICAgICAgIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLnBpbmcgPSBhc3luYyBmdW5jdGlvbiBwaW5nICgpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuc2hlbGwoWydlY2hvJywgJ3BpbmcnXSk7XG4gIGlmIChzdGRvdXQuaW5kZXhPZigncGluZycpID09PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBBREIgcGluZyBmYWlsZWQsIHJldHVybmVkICR7c3Rkb3V0fWApO1xufTtcblxuLyoqXG4gKiBSZXN0YXJ0IHRoZSBkZXZpY2UgdW5kZXIgdGVzdCB1c2luZyBhZGIgY29tbWFuZHMuXG4gKlxuICogQHRocm93cyB7ZXJyb3J9IElmIHN0YXJ0IGZhaWxzLlxuICovXG5tZXRob2RzLnJlc3RhcnQgPSBhc3luYyBmdW5jdGlvbiByZXN0YXJ0ICgpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLnN0b3BMb2djYXQoKTtcbiAgICBhd2FpdCB0aGlzLnJlc3RhcnRBZGIoKTtcbiAgICBhd2FpdCB0aGlzLndhaXRGb3JEZXZpY2UoNjApO1xuICAgIGF3YWl0IHRoaXMuc3RhcnRMb2djYXQodGhpcy5fbG9nY2F0U3RhcnR1cFBhcmFtcyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFJlc3RhcnQgZmFpbGVkLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTG9nY2F0T3B0c1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGZvcm1hdCBUaGUgbG9nIHByaW50IGZvcm1hdCwgd2hlcmUgPGZvcm1hdD4gaXMgb25lIG9mOlxuICogICBicmllZiBwcm9jZXNzIHRhZyB0aHJlYWQgcmF3IHRpbWUgdGhyZWFkdGltZSBsb25nXG4gKiBgdGhyZWFkdGltZWAgaXMgdGhlIGRlZmF1bHQgdmFsdWUuXG4gKiBAcHJvcGVydHkge0FycmF5PHN0cmluZz59IGZpbHRlclNwZWNzIFNlcmllcyBvZiA8dGFnPls6cHJpb3JpdHldXG4gKiB3aGVyZSA8dGFnPiBpcyBhIGxvZyBjb21wb25lbnQgdGFnIChvciAqIGZvciBhbGwpIGFuZCBwcmlvcml0eSBpczpcbiAqICBWICAgIFZlcmJvc2VcbiAqICBEICAgIERlYnVnXG4gKiAgSSAgICBJbmZvXG4gKiAgVyAgICBXYXJuXG4gKiAgRSAgICBFcnJvclxuICogIEYgICAgRmF0YWxcbiAqICBTICAgIFNpbGVudCAoc3VwcmVzcyBhbGwgb3V0cHV0KVxuICpcbiAqICcqJyBtZWFucyAnKjpkJyBhbmQgPHRhZz4gYnkgaXRzZWxmIG1lYW5zIDx0YWc+OnZcbiAqXG4gKiBJZiBub3Qgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kbGluZSwgZmlsdGVyc3BlYyBpcyBzZXQgZnJvbSBBTkRST0lEX0xPR19UQUdTLlxuICogSWYgbm8gZmlsdGVyc3BlYyBpcyBmb3VuZCwgZmlsdGVyIGRlZmF1bHRzIHRvICcqOkknXG4gKi9cblxuLyoqXG4gKiBTdGFydCB0aGUgbG9nY2F0IHByb2Nlc3MgdG8gZ2F0aGVyIGxvZ3MuXG4gKlxuICogQHBhcmFtIHs/TG9nY2F0T3B0c30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IElmIHJlc3RhcnQgZmFpbHMuXG4gKi9cbm1ldGhvZHMuc3RhcnRMb2djYXQgPSBhc3luYyBmdW5jdGlvbiBzdGFydExvZ2NhdCAob3B0cyA9IHt9KSB7XG4gIGlmICghXy5pc0VtcHR5KHRoaXMubG9nY2F0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlRyeWluZyB0byBzdGFydCBsb2djYXQgY2FwdHVyZSBidXQgaXQncyBhbHJlYWR5IHN0YXJ0ZWQhXCIpO1xuICB9XG5cbiAgdGhpcy5sb2djYXQgPSBuZXcgTG9nY2F0KHtcbiAgICBhZGI6IHRoaXMuZXhlY3V0YWJsZSxcbiAgICBkZWJ1ZzogZmFsc2UsXG4gICAgZGVidWdUcmFjZTogZmFsc2UsXG4gICAgY2xlYXJEZXZpY2VMb2dzT25TdGFydDogISF0aGlzLmNsZWFyRGV2aWNlTG9nc09uU3RhcnQsXG4gIH0pO1xuICBhd2FpdCB0aGlzLmxvZ2NhdC5zdGFydENhcHR1cmUob3B0cyk7XG4gIHRoaXMuX2xvZ2NhdFN0YXJ0dXBQYXJhbXMgPSBvcHRzO1xufTtcblxuLyoqXG4gKiBTdG9wIHRoZSBhY3RpdmUgbG9nY2F0IHByb2Nlc3Mgd2hpY2ggZ2F0aGVycyBsb2dzLlxuICogVGhlIGNhbGwgd2lsbCBiZSBpZ25vcmVkIGlmIG5vIGxvZ2NhdCBwcm9jZXNzIGlzIHJ1bm5pbmcuXG4gKi9cbm1ldGhvZHMuc3RvcExvZ2NhdCA9IGFzeW5jIGZ1bmN0aW9uIHN0b3BMb2djYXQgKCkge1xuICBpZiAoXy5pc0VtcHR5KHRoaXMubG9nY2F0KSkge1xuICAgIHJldHVybjtcbiAgfVxuICB0cnkge1xuICAgIGF3YWl0IHRoaXMubG9nY2F0LnN0b3BDYXB0dXJlKCk7XG4gIH0gZmluYWxseSB7XG4gICAgdGhpcy5sb2djYXQgPSBudWxsO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBvdXRwdXQgZnJvbSB0aGUgY3VycmVudGx5IHJ1bm5pbmcgbG9nY2F0IHByb2Nlc3MuXG4gKiBUaGUgbG9nY2F0IHByb2Nlc3Mgc2hvdWxkIGJlIGV4ZWN1dGVkIGJ5IHsybGluayAjc3RhcnRMb2djYXR9IG1ldGhvZC5cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjb2xsZWN0ZWQgbG9nY2F0IG91dHB1dC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBsb2djYXQgcHJvY2VzcyBpcyBub3QgcnVubmluZy5cbiAqL1xubWV0aG9kcy5nZXRMb2djYXRMb2dzID0gZnVuY3Rpb24gZ2V0TG9nY2F0TG9ncyAoKSB7XG4gIGlmIChfLmlzRW1wdHkodGhpcy5sb2djYXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgZ2V0IGxvZ2NhdCBsb2dzIHNpbmNlIGxvZ2NhdCBoYXNuJ3Qgc3RhcnRlZFwiKTtcbiAgfVxuICByZXR1cm4gdGhpcy5sb2djYXQuZ2V0TG9ncygpO1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIGNhbGxiYWNrIGZvciB0aGUgbG9nY2F0IG91dHB1dCBldmVudC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciAtIFRoZSBsaXN0ZW5lciBmdW5jdGlvbiwgd2hpY2ggYWNjZXB0cyBvbmUgYXJndW1lbnQuIFRoZSBhcmd1bWVudCBpc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIGxvZyByZWNvcmQgb2JqZWN0IHdpdGggYHRpbWVzdGFtcGAsIGBsZXZlbGAgYW5kIGBtZXNzYWdlYCBwcm9wZXJ0aWVzLlxuICogQHRocm93cyB7RXJyb3J9IElmIGxvZ2NhdCBwcm9jZXNzIGlzIG5vdCBydW5uaW5nLlxuICovXG5tZXRob2RzLnNldExvZ2NhdExpc3RlbmVyID0gZnVuY3Rpb24gc2V0TG9nY2F0TGlzdGVuZXIgKGxpc3RlbmVyKSB7XG4gIGlmIChfLmlzRW1wdHkodGhpcy5sb2djYXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTG9nY2F0IHByb2Nlc3MgaGFzbid0IGJlZW4gc3RhcnRlZFwiKTtcbiAgfVxuICB0aGlzLmxvZ2NhdC5vbignb3V0cHV0JywgbGlzdGVuZXIpO1xufTtcblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBwcmV2aW91c2x5IHNldCBjYWxsYmFjayBmb3IgdGhlIGxvZ2NhdCBvdXRwdXQgZXZlbnQuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgLSBUaGUgbGlzdGVuZXIgZnVuY3Rpb24sIHdoaWNoIGhhcyBiZWVuIHByZXZpb3VzbHlcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkIHRvIGBzZXRMb2djYXRMaXN0ZW5lcmBcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBsb2djYXQgcHJvY2VzcyBpcyBub3QgcnVubmluZy5cbiAqL1xubWV0aG9kcy5yZW1vdmVMb2djYXRMaXN0ZW5lciA9IGZ1bmN0aW9uIHJlbW92ZUxvZ2NhdExpc3RlbmVyIChsaXN0ZW5lcikge1xuICBpZiAoXy5pc0VtcHR5KHRoaXMubG9nY2F0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkxvZ2NhdCBwcm9jZXNzIGhhc24ndCBiZWVuIHN0YXJ0ZWRcIik7XG4gIH1cbiAgdGhpcy5sb2djYXQucmVtb3ZlTGlzdGVuZXIoJ291dHB1dCcsIGxpc3RlbmVyKTtcbn07XG5cbi8qKlxuICogQXQgc29tZSBwb2ludCBvZiB0aW1lIEdvb2dsZSBoYXMgY2hhbmdlZCB0aGUgZGVmYXVsdCBgcHNgIGJlaGF2aW91ciwgc28gaXQgb25seVxuICogbGlzdHMgcHJvY2Vzc2VzIHRoYXQgYmVsb25nIHRvIHRoZSBjdXJyZW50IHNoZWxsIHVzZXIgcmF0aGVyIHRvIGFsbFxuICogdXNlcnMuIEl0IGlzIG5lY2Vzc2FyeSB0byBleGVjdXRlIHBzIHdpdGggLUEgY29tbWFuZCBsaW5lIGFyZ3VtZW50XG4gKiB0byBtaW1pYyB0aGUgcHJldmlvdXMgYmVoYXZpb3VyLlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBvdXRwdXQgb2YgYHBzYCBjb21tYW5kIHdoZXJlIGFsbCBwcm9jZXNzZXMgYXJlIGluY2x1ZGVkXG4gKi9cbm1ldGhvZHMubGlzdFByb2Nlc3NTdGF0dXMgPSBhc3luYyBmdW5jdGlvbiBsaXN0UHJvY2Vzc1N0YXR1cyAoKSB7XG4gIGlmICghXy5pc0Jvb2xlYW4odGhpcy5fZG9lc1BzU3VwcG9ydEFPcHRpb24pKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX2RvZXNQc1N1cHBvcnRBT3B0aW9uID0gL14tQVxcYi9tLnRlc3QoYXdhaXQgdGhpcy5zaGVsbChbJ3BzJywgJy0taGVscCddKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nLmRlYnVnKGUuc3RhY2spO1xuICAgICAgdGhpcy5fZG9lc1BzU3VwcG9ydEFPcHRpb24gPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGF3YWl0IHRoaXMuc2hlbGwodGhpcy5fZG9lc1BzU3VwcG9ydEFPcHRpb24gPyBbJ3BzJywgJy1BJ10gOiBbJ3BzJ10pO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHByb2Nlc3MgbmFtZSBmb3IgdGhlIGdpdmVuIHByb2Nlc3MgaWRlbnRpZmllclxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gcGlkIC0gVGhlIHZhbGlkIHByb2Nlc3MgaWRlbnRpZmllclxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBnaXZlbiBQSUQgaXMgZWl0aGVyIGludmFsaWQgb3IgaXMgbm90IHByZXNlbnRcbiAqIGluIHRoZSBhY3RpdmUgcHJvY2Vzc2VzIGxpc3RcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBwcm9jZXNzIG5hbWVcbiAqL1xubWV0aG9kcy5nZXROYW1lQnlQaWQgPSBhc3luYyBmdW5jdGlvbiBnZXROYW1lQnlQaWQgKHBpZCkge1xuICBpZiAoaXNOYU4ocGlkKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIFBJRCB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgbnVtYmVyLiAnJHtwaWR9JyBpcyBnaXZlbiBpbnN0ZWFkYCk7XG4gIH1cbiAgcGlkID0gcGFyc2VJbnQocGlkLCAxMCk7XG5cbiAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgdGhpcy5saXN0UHJvY2Vzc1N0YXR1cygpO1xuICBjb25zdCB0aXRsZU1hdGNoID0gUFNfVElUTEVfUEFUVEVSTi5leGVjKHN0ZG91dCk7XG4gIGlmICghdGl0bGVNYXRjaCkge1xuICAgIGxvZy5kZWJ1ZyhzdGRvdXQpO1xuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGdldCB0aGUgcHJvY2VzcyBuYW1lIGZvciBQSUQgJyR7cGlkfSdgKTtcbiAgfVxuICBjb25zdCBhbGxUaXRsZXMgPSB0aXRsZU1hdGNoWzFdLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICBjb25zdCBwaWRJbmRleCA9IGFsbFRpdGxlcy5pbmRleE9mKFBJRF9DT0xVTU5fVElUTEUpO1xuICAvLyBpdCBtaWdodCBub3QgYmUgc3RhYmxlIHRvIHRha2UgTkFNRSBieSBpbmRleCwgYmVjYXVzZSBkZXBlbmRpbmcgb24gdGhlXG4gIC8vIGFjdHVhbCBTREsgdGhlIHBzIG91dHB1dCBtaWdodCBub3QgY29udGFpbiBhbiBhYmJyZXZpYXRpb24gZm9yIHRoZSBTIGZsYWc6XG4gIC8vIFVTRVIgICAgIFBJRCAgIFBQSUQgIFZTSVpFICBSU1MgICAgIFdDSEFOICAgIFBDICAgICAgICBOQU1FXG4gIC8vIFVTRVIgICAgIFBJRCAgIFBQSUQgIFZTSVpFICBSU1MgICAgIFdDSEFOICAgIFBDICAgUyAgICBOQU1FXG4gIGNvbnN0IG5hbWVPZmZzZXQgPSBhbGxUaXRsZXMuaW5kZXhPZihQUk9DRVNTX05BTUVfQ09MVU1OX1RJVExFKSAtIGFsbFRpdGxlcy5sZW5ndGg7XG4gIGNvbnN0IHBpZFJlZ2V4ID0gbmV3IFJlZ0V4cChgXiguKlxcXFxiJHtwaWR9XFxcXGIuKikkYCwgJ2dtJyk7XG4gIGxldCBtYXRjaGVkTGluZTtcbiAgd2hpbGUgKChtYXRjaGVkTGluZSA9IHBpZFJlZ2V4LmV4ZWMoc3Rkb3V0KSkpIHtcbiAgICBjb25zdCBpdGVtcyA9IG1hdGNoZWRMaW5lWzFdLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICAgIGlmIChwYXJzZUludChpdGVtc1twaWRJbmRleF0sIDEwKSA9PT0gcGlkICYmIGl0ZW1zW2l0ZW1zLmxlbmd0aCArIG5hbWVPZmZzZXRdKSB7XG4gICAgICByZXR1cm4gaXRlbXNbaXRlbXMubGVuZ3RoICsgbmFtZU9mZnNldF07XG4gICAgfVxuICB9XG4gIGxvZy5kZWJ1ZyhzdGRvdXQpO1xuICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBnZXQgdGhlIHByb2Nlc3MgbmFtZSBmb3IgUElEICcke3BpZH0nYCk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgbGlzdCBvZiBwcm9jZXNzIGlkcyBmb3IgdGhlIHBhcnRpY3VsYXIgcHJvY2VzcyBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgcGFydCBvZiBwcm9jZXNzIG5hbWUuXG4gKiBAcmV0dXJuIHtBcnJheS48bnVtYmVyPn0gVGhlIGxpc3Qgb2YgbWF0Y2hlZCBwcm9jZXNzIElEcyBvciBhbiBlbXB0eSBsaXN0LlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBwYXNzZWQgcHJvY2VzcyBuYW1lIGlzIG5vdCBhIHZhbGlkIG9uZVxuICovXG5tZXRob2RzLmdldFBJRHNCeU5hbWUgPSBhc3luYyBmdW5jdGlvbiBnZXRQSURzQnlOYW1lIChuYW1lKSB7XG4gIGxvZy5kZWJ1ZyhgR2V0dGluZyBJRHMgb2YgYWxsICcke25hbWV9JyBwcm9jZXNzZXNgKTtcbiAgaWYgKCF0aGlzLmlzVmFsaWRDbGFzcyhuYW1lKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwcm9jZXNzIG5hbWU6ICcke25hbWV9J2ApO1xuICB9XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy8xMzU2N1xuICBpZiAoYXdhaXQgdGhpcy5nZXRBcGlMZXZlbCgpID49IDIzKSB7XG4gICAgaWYgKCFfLmlzQm9vbGVhbih0aGlzLl9pc1BncmVwQXZhaWxhYmxlKSkge1xuICAgICAgLy8gcGdyZXAgaXMgaW4gcHJpb3JpdHksIHNpbmNlIHBpZG9mIGhhcyBiZWVuIHJlcG9ydGVkIG9mIGhhdmluZyBidWdzIG9uIHNvbWUgcGxhdGZvcm1zXG4gICAgICBjb25zdCBwZ3JlcE91dHB1dCA9IF8udHJpbShhd2FpdCB0aGlzLnNoZWxsKFsncGdyZXAgLS1oZWxwOyBlY2hvICQ/J10pKTtcbiAgICAgIHRoaXMuX2lzUGdyZXBBdmFpbGFibGUgPSBwYXJzZUludChfLmxhc3QocGdyZXBPdXRwdXQuc3BsaXQoL1xccysvKSksIDEwKSA9PT0gMDtcbiAgICAgIGlmICh0aGlzLl9pc1BncmVwQXZhaWxhYmxlKSB7XG4gICAgICAgIHRoaXMuX2NhblBncmVwVXNlRnVsbENtZExpbmVTZWFyY2ggPSAvXi1mXFxiL20udGVzdChwZ3JlcE91dHB1dCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9pc1BpZG9mQXZhaWxhYmxlID0gcGFyc2VJbnQoYXdhaXQgdGhpcy5zaGVsbChbJ3BpZG9mIC0taGVscCA+IC9kZXYvbnVsbDsgZWNobyAkPyddKSwgMTApID09PSAwO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5faXNQZ3JlcEF2YWlsYWJsZSB8fCB0aGlzLl9pc1BpZG9mQXZhaWxhYmxlKSB7XG4gICAgICBjb25zdCBzaGVsbENvbW1hbmQgPSB0aGlzLl9pc1BncmVwQXZhaWxhYmxlXG4gICAgICAgID8gKHRoaXMuX2NhblBncmVwVXNlRnVsbENtZExpbmVTZWFyY2hcbiAgICAgICAgICA/IFsncGdyZXAnLCAnLWYnLCBfLmVzY2FwZVJlZ0V4cChgKFtbOmJsYW5rOl1dfF4pJHtuYW1lfShbWzpibGFuazpdXXwkKWApXVxuICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy8xMzg3MlxuICAgICAgICAgIDogW2BwZ3JlcCBeJHtfLmVzY2FwZVJlZ0V4cChuYW1lLnNsaWNlKC1NQVhfUEdSRVBfUEFUVEVSTl9MRU4pKX0kIGAgK1xuICAgICAgICAgICAgICBgfHwgcGdyZXAgXiR7Xy5lc2NhcGVSZWdFeHAobmFtZS5zbGljZSgwLCBNQVhfUEdSRVBfUEFUVEVSTl9MRU4pKX0kYF0pXG4gICAgICAgIDogWydwaWRvZicsIG5hbWVdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLnNoZWxsKHNoZWxsQ29tbWFuZCkpXG4gICAgICAgICAgLnNwbGl0KC9cXHMrLylcbiAgICAgICAgICAubWFwKCh4KSA9PiBwYXJzZUludCh4LCAxMCkpXG4gICAgICAgICAgLmZpbHRlcigoeCkgPT4gXy5pc0ludGVnZXIoeCkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBlcnJvciBjb2RlIDEgaXMgcmV0dXJuZWQgaWYgdGhlIHV0aWxpdHkgZGlkIG5vdCBmaW5kIGFueSBwcm9jZXNzZXNcbiAgICAgICAgLy8gd2l0aCB0aGUgZ2l2ZW4gbmFtZVxuICAgICAgICBpZiAoZS5jb2RlICE9PSAxKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZXh0cmFjdCBwcm9jZXNzIElEIG9mICcke25hbWV9JzogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF8uaW5jbHVkZXMoZS5zdGRlcnIgfHwgZS5zdGRvdXQsICdzeW50YXggZXJyb3InKSkge1xuICAgICAgICAgIGxvZy53YXJuKGBHb3QgYW4gdW5leHBlY3RlZCByZXNwb25zZSBmcm9tIHRoZSBzaGVsbCBpbnRlcnByZXRlcjogJHtlLnN0ZGVyciB8fCBlLnN0ZG91dH1gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsb2cuZGVidWcoJ1VzaW5nIHBzLWJhc2VkIFBJRCBkZXRlY3Rpb24nKTtcbiAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgdGhpcy5saXN0UHJvY2Vzc1N0YXR1cygpO1xuICBjb25zdCB0aXRsZU1hdGNoID0gUFNfVElUTEVfUEFUVEVSTi5leGVjKHN0ZG91dCk7XG4gIGlmICghdGl0bGVNYXRjaCkge1xuICAgIGxvZy5kZWJ1ZyhzdGRvdXQpO1xuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGV4dHJhY3QgUElEIG9mICcke25hbWV9JyBmcm9tIHBzIG91dHB1dGApO1xuICB9XG4gIGNvbnN0IGFsbFRpdGxlcyA9IHRpdGxlTWF0Y2hbMV0udHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gIGNvbnN0IHBpZEluZGV4ID0gYWxsVGl0bGVzLmluZGV4T2YoUElEX0NPTFVNTl9USVRMRSk7XG4gIGNvbnN0IHBpZHMgPSBbXTtcbiAgY29uc3QgcHJvY2Vzc05hbWVSZWdleCA9IG5ldyBSZWdFeHAoYF4oLipcXFxcYlxcXFxkK1xcXFxiLipcXFxcYiR7Xy5lc2NhcGVSZWdFeHAobmFtZSl9XFxcXGIuKikkYCwgJ2dtJyk7XG4gIGxldCBtYXRjaGVkTGluZTtcbiAgd2hpbGUgKChtYXRjaGVkTGluZSA9IHByb2Nlc3NOYW1lUmVnZXguZXhlYyhzdGRvdXQpKSkge1xuICAgIGNvbnN0IGl0ZW1zID0gbWF0Y2hlZExpbmVbMV0udHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgaWYgKHBpZEluZGV4ID49IGFsbFRpdGxlcy5sZW5ndGggfHwgaXNOYU4oaXRlbXNbcGlkSW5kZXhdKSkge1xuICAgICAgbG9nLmRlYnVnKHN0ZG91dCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBleHRyYWN0IFBJRCBvZiAnJHtuYW1lfScgZnJvbSAnJHttYXRjaGVkTGluZVsxXS50cmltKCl9J2ApO1xuICAgIH1cbiAgICBwaWRzLnB1c2gocGFyc2VJbnQoaXRlbXNbcGlkSW5kZXhdLCAxMCkpO1xuICB9XG4gIHJldHVybiBwaWRzO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGxpc3Qgb2YgcHJvY2VzcyBpZHMgZm9yIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3Mgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIHBhcnQgb2YgcHJvY2VzcyBuYW1lLlxuICogQHJldHVybiB7QXJyYXkuPG51bWJlcj59IFRoZSBsaXN0IG9mIG1hdGNoZWQgcHJvY2VzcyBJRHMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqL1xubWV0aG9kcy5raWxsUHJvY2Vzc2VzQnlOYW1lID0gYXN5bmMgZnVuY3Rpb24ga2lsbFByb2Nlc3Nlc0J5TmFtZSAobmFtZSkge1xuICB0cnkge1xuICAgIGxvZy5kZWJ1ZyhgQXR0ZW1wdGluZyB0byBraWxsIGFsbCAke25hbWV9IHByb2Nlc3Nlc2ApO1xuICAgIGNvbnN0IHBpZHMgPSBhd2FpdCB0aGlzLmdldFBJRHNCeU5hbWUobmFtZSk7XG4gICAgaWYgKF8uaXNFbXB0eShwaWRzKSkge1xuICAgICAgbG9nLmluZm8oYE5vICcke25hbWV9JyBwcm9jZXNzIGhhcyBiZWVuIGZvdW5kYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IEIuYWxsKHBpZHMubWFwKChwKSA9PiB0aGlzLmtpbGxQcm9jZXNzQnlQSUQocCkpKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBraWxsICR7bmFtZX0gcHJvY2Vzc2VzLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogS2lsbCB0aGUgcGFydGljdWxhciBwcm9jZXNzIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqIFRoZSBjdXJyZW50IHVzZXIgaXMgYXV0b21hdGljYWxseSBzd2l0Y2hlZCB0byByb290IGlmIG5lY2Vzc2FyeSBpbiBvcmRlclxuICogdG8gcHJvcGVybHkga2lsbCB0aGUgcHJvY2Vzcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHBpZCAtIFRoZSBJRCBvZiB0aGUgcHJvY2VzcyB0byBiZSBraWxsZWQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHByb2Nlc3MgY2Fubm90IGJlIGtpbGxlZC5cbiAqL1xubWV0aG9kcy5raWxsUHJvY2Vzc0J5UElEID0gYXN5bmMgZnVuY3Rpb24ga2lsbFByb2Nlc3NCeVBJRCAocGlkKSB7XG4gIGxvZy5kZWJ1ZyhgQXR0ZW1wdGluZyB0byBraWxsIHByb2Nlc3MgJHtwaWR9YCk7XG4gIGNvbnN0IG5vUHJvY2Vzc0ZsYWcgPSAnTm8gc3VjaCBwcm9jZXNzJztcbiAgdHJ5IHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcHJvY2VzcyBleGlzdHMgYW5kIHRocm93IGFuIGV4Y2VwdGlvbiBvdGhlcndpc2VcbiAgICBhd2FpdCB0aGlzLnNoZWxsKFsna2lsbCcsIHBpZF0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKF8uaW5jbHVkZXMoZS5zdGRlcnIsIG5vUHJvY2Vzc0ZsYWcpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghXy5pbmNsdWRlcyhlLnN0ZGVyciwgJ09wZXJhdGlvbiBub3QgcGVybWl0dGVkJykpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIGxvZy5pbmZvKGBDYW5ub3Qga2lsbCBQSUQgJHtwaWR9IGR1ZSB0byBpbnN1ZmZpY2llbnQgcGVybWlzc2lvbnMuIFJldHJ5aW5nIGFzIHJvb3RgKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5zaGVsbChbJ2tpbGwnLCBwaWRdLCB7XG4gICAgICAgIHByaXZpbGVnZWQ6IHRydWVcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUxKSB7XG4gICAgICBpZiAoXy5pbmNsdWRlcyhlMS5zdGRlcnIsIG5vUHJvY2Vzc0ZsYWcpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRocm93IGUxO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBCcm9hZGNhc3QgcHJvY2VzcyBraWxsaW5nIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW50ZW50IC0gVGhlIG5hbWUgb2YgdGhlIGludGVudCB0byBicm9hZGNhc3QgdG8uXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvY2Vzc05hbWUgLSBUaGUgbmFtZSBvZiB0aGUga2lsbGVkIHByb2Nlc3MuXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgdGhlIHByb2Nlc3Mgd2FzIG5vdCBraWxsZWQuXG4gKi9cbm1ldGhvZHMuYnJvYWRjYXN0UHJvY2Vzc0VuZCA9IGFzeW5jIGZ1bmN0aW9uIGJyb2FkY2FzdFByb2Nlc3NFbmQgKGludGVudCwgcHJvY2Vzc05hbWUpIHtcbiAgLy8gc3RhcnQgdGhlIGJyb2FkY2FzdCB3aXRob3V0IHdhaXRpbmcgZm9yIGl0IHRvIGZpbmlzaC5cbiAgdGhpcy5icm9hZGNhc3QoaW50ZW50KTtcbiAgLy8gd2FpdCBmb3IgdGhlIHByb2Nlc3MgdG8gZW5kXG4gIGxldCBzdGFydCA9IERhdGUubm93KCk7XG4gIGxldCB0aW1lb3V0TXMgPSA0MDAwMDtcbiAgdHJ5IHtcbiAgICB3aGlsZSAoKERhdGUubm93KCkgLSBzdGFydCkgPCB0aW1lb3V0TXMpIHtcbiAgICAgIGlmIChhd2FpdCB0aGlzLnByb2Nlc3NFeGlzdHMocHJvY2Vzc05hbWUpKSB7XG4gICAgICAgIC8vIGNvb2wgZG93blxuICAgICAgICBhd2FpdCBzbGVlcCg0MDApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBQcm9jZXNzIG5ldmVyIGRpZWQgd2l0aGluICR7dGltZW91dE1zfSBtc2ApO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gYnJvYWRjYXN0IHByb2Nlc3MgZW5kLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogQnJvYWRjYXN0IGEgbWVzc2FnZSB0byB0aGUgZ2l2ZW4gaW50ZW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnRlbnQgLSBUaGUgbmFtZSBvZiB0aGUgaW50ZW50IHRvIGJyb2FkY2FzdCB0by5cbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiBpbnRlbnQgbmFtZSBpcyBub3QgYSB2YWxpZCBjbGFzcyBuYW1lLlxuICovXG5tZXRob2RzLmJyb2FkY2FzdCA9IGFzeW5jIGZ1bmN0aW9uIGJyb2FkY2FzdCAoaW50ZW50KSB7XG4gIGlmICghdGhpcy5pc1ZhbGlkQ2xhc3MoaW50ZW50KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBpbnRlbnQgJHtpbnRlbnR9YCk7XG4gIH1cbiAgbG9nLmRlYnVnKGBCcm9hZGNhc3Rpbmc6ICR7aW50ZW50fWApO1xuICBhd2FpdCB0aGlzLnNoZWxsKFsnYW0nLCAnYnJvYWRjYXN0JywgJy1hJywgaW50ZW50XSk7XG59O1xuXG4vKipcbiAqIEtpbGwgQW5kcm9pZCBpbnN0cnVtZW50cyBpZiB0aGV5IGFyZSBjdXJyZW50bHkgcnVubmluZy5cbiAqL1xubWV0aG9kcy5lbmRBbmRyb2lkQ292ZXJhZ2UgPSBhc3luYyBmdW5jdGlvbiBlbmRBbmRyb2lkQ292ZXJhZ2UgKCkge1xuICBpZiAodGhpcy5pbnN0cnVtZW50UHJvYyAmJiB0aGlzLmluc3RydW1lbnRQcm9jLmlzUnVubmluZykge1xuICAgIGF3YWl0IHRoaXMuaW5zdHJ1bWVudFByb2Muc3RvcCgpO1xuICB9XG59O1xuXG4vKipcbiAqIEluc3RydW1lbnQgdGhlIHBhcnRpY3VsYXIgYWN0aXZpdHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIGJlIGluc3RydW1lbnRlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpdml0eSAtIFRoZSBuYW1lIG9mIHRoZSBtYWluIGFjdGl2aXR5IGluIHRoaXMgcGFja2FnZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnN0cnVtZW50V2l0aCAtIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIGluc3RydW1lbnRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhY3Rpdml0eSB3aXRoLlxuICogQHRocm93cyB7ZXJyb3J9IElmIGFueSBleGNlcHRpb24gaXMgcmVwb3J0ZWQgYnkgYWRiIHNoZWxsLlxuICovXG5tZXRob2RzLmluc3RydW1lbnQgPSBhc3luYyBmdW5jdGlvbiBpbnN0cnVtZW50IChwa2csIGFjdGl2aXR5LCBpbnN0cnVtZW50V2l0aCkge1xuICBpZiAoYWN0aXZpdHlbMF0gIT09ICcuJykge1xuICAgIHBrZyA9ICcnO1xuICB9XG4gIGxldCBwa2dBY3Rpdml0eSA9IChwa2cgKyBhY3Rpdml0eSkucmVwbGFjZSgvXFwuKy9nLCAnLicpOyAvLyBGaXggcGtnLi5hY3Rpdml0eSBlcnJvclxuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5zaGVsbChbXG4gICAgJ2FtJywgJ2luc3RydW1lbnQnLFxuICAgICctZScsICdtYWluX2FjdGl2aXR5JyxcbiAgICBwa2dBY3Rpdml0eSxcbiAgICBpbnN0cnVtZW50V2l0aCxcbiAgXSk7XG4gIGlmIChzdGRvdXQuaW5kZXhPZignRXhjZXB0aW9uJykgIT09IC0xKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGV4Y2VwdGlvbiBkdXJpbmcgaW5zdHJ1bWVudGF0aW9uLiBPcmlnaW5hbCBlcnJvciAke3N0ZG91dC5zcGxpdCgnXFxuJylbMF19YCk7XG4gIH1cbn07XG5cbi8qKlxuICogQ29sbGVjdCBBbmRyb2lkIGNvdmVyYWdlIGJ5IGluc3RydW1lbnRpbmcgdGhlIHBhcnRpY3VsYXIgYWN0aXZpdHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGluc3RydW1lbnRDbGFzcyAtIFRoZSBuYW1lIG9mIHRoZSBpbnN0cnVtZW50YXRpb24gY2xhc3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gd2FpdFBrZyAtIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIGJlIGluc3RydW1lbnRlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB3YWl0QWN0aXZpdHkgLSBUaGUgbmFtZSBvZiB0aGUgbWFpbiBhY3Rpdml0eSBpbiB0aGlzIHBhY2thZ2UuXG4gKlxuICogQHJldHVybiB7cHJvbWlzZX0gVGhlIHByb21pc2UgaXMgc3VjY2Vzc2Z1bGx5IHJlc29sdmVkIGlmIHRoZSBpbnN0cnVtZW50YXRpb24gc3RhcnRzXG4gKiAgICAgICAgICAgICAgICAgICB3aXRob3V0IGVycm9ycy5cbiAqL1xubWV0aG9kcy5hbmRyb2lkQ292ZXJhZ2UgPSBhc3luYyBmdW5jdGlvbiBhbmRyb2lkQ292ZXJhZ2UgKGluc3RydW1lbnRDbGFzcywgd2FpdFBrZywgd2FpdEFjdGl2aXR5KSB7XG4gIGlmICghdGhpcy5pc1ZhbGlkQ2xhc3MoaW5zdHJ1bWVudENsYXNzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjbGFzcyAke2luc3RydW1lbnRDbGFzc31gKTtcbiAgfVxuICByZXR1cm4gYXdhaXQgbmV3IEIoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGxldCBhcmdzID0gdGhpcy5leGVjdXRhYmxlLmRlZmF1bHRBcmdzXG4gICAgICAuY29uY2F0KFsnc2hlbGwnLCAnYW0nLCAnaW5zdHJ1bWVudCcsICctZScsICdjb3ZlcmFnZScsICd0cnVlJywgJy13J10pXG4gICAgICAuY29uY2F0KFtpbnN0cnVtZW50Q2xhc3NdKTtcbiAgICBsb2cuZGVidWcoYENvbGxlY3RpbmcgY292ZXJhZ2UgZGF0YSB3aXRoOiAke1t0aGlzLmV4ZWN1dGFibGUucGF0aF0uY29uY2F0KGFyZ3MpLmpvaW4oJyAnKX1gKTtcbiAgICB0cnkge1xuICAgICAgLy8gYW0gaW5zdHJ1bWVudCBydW5zIGZvciB0aGUgbGlmZSBvZiB0aGUgYXBwIHByb2Nlc3MuXG4gICAgICB0aGlzLmluc3RydW1lbnRQcm9jID0gbmV3IFN1YlByb2Nlc3ModGhpcy5leGVjdXRhYmxlLnBhdGgsIGFyZ3MpO1xuICAgICAgYXdhaXQgdGhpcy5pbnN0cnVtZW50UHJvYy5zdGFydCgwKTtcbiAgICAgIHRoaXMuaW5zdHJ1bWVudFByb2Mub24oJ291dHB1dCcsIChzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgICAgICBpZiAoc3RkZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIHJ1biBpbnN0cnVtZW50YXRpb24uIE9yaWdpbmFsIGVycm9yOiAke3N0ZGVycn1gKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yQWN0aXZpdHkod2FpdFBrZywgd2FpdEFjdGl2aXR5KTtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZWplY3QobmV3IEVycm9yKGBBbmRyb2lkIGNvdmVyYWdlIGZhaWxlZC4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApKTtcbiAgICB9XG4gIH0pO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIHBhcnRpY3VsYXIgcHJvcGVydHkgb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4gVGhpcyBuYW1lIHNob3VsZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUga25vd24gdG8gX2FkYiBzaGVsbCBnZXRwcm9wXyB0b29sLlxuICpcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAqL1xubWV0aG9kcy5nZXREZXZpY2VQcm9wZXJ0eSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVByb3BlcnR5IChwcm9wZXJ0eSkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5zaGVsbChbJ2dldHByb3AnLCBwcm9wZXJ0eV0pO1xuICBsZXQgdmFsID0gc3Rkb3V0LnRyaW0oKTtcbiAgbG9nLmRlYnVnKGBDdXJyZW50IGRldmljZSBwcm9wZXJ0eSAnJHtwcm9wZXJ0eX0nOiAke3ZhbH1gKTtcbiAgcmV0dXJuIHZhbDtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gc2V0UHJvcE9wdHNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcHJpdmlsZWdlZCAtIERvIHdlIHJ1biBzZXRQcm9wIGFzIGEgcHJpdmlsZWdlZCBjb21tYW5kPyBEZWZhdWx0IHRydWUuXG4gKi9cblxuLyoqXG4gKiBTZXQgdGhlIHBhcnRpY3VsYXIgcHJvcGVydHkgb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4gVGhpcyBuYW1lIHNob3VsZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUga25vd24gdG8gX2FkYiBzaGVsbCBzZXRwcm9wXyB0b29sLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbCAtIFRoZSBuZXcgcHJvcGVydHkgdmFsdWUuXG4gKiBAcGFyYW0ge3NldFByb3BPcHRzfSBvcHRzXG4gKlxuICogQHRocm93cyB7ZXJyb3J9IElmIF9zZXRwcm9wXyB1dGlsaXR5IGZhaWxzIHRvIGNoYW5nZSBwcm9wZXJ0eSB2YWx1ZS5cbiAqL1xubWV0aG9kcy5zZXREZXZpY2VQcm9wZXJ0eSA9IGFzeW5jIGZ1bmN0aW9uIHNldERldmljZVByb3BlcnR5IChwcm9wLCB2YWwsIG9wdHMgPSB7fSkge1xuICBjb25zdCB7cHJpdmlsZWdlZCA9IHRydWV9ID0gb3B0cztcbiAgbG9nLmRlYnVnKGBTZXR0aW5nIGRldmljZSBwcm9wZXJ0eSAnJHtwcm9wfScgdG8gJyR7dmFsfSdgKTtcbiAgYXdhaXQgdGhpcy5zaGVsbChbJ3NldHByb3AnLCBwcm9wLCB2YWxdLCB7XG4gICAgcHJpdmlsZWdlZCxcbiAgfSk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gQ3VycmVudCBzeXN0ZW0gbGFuZ3VhZ2Ugb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLmdldERldmljZVN5c0xhbmd1YWdlID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlU3lzTGFuZ3VhZ2UgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncGVyc2lzdC5zeXMubGFuZ3VhZ2UnKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfSBDdXJyZW50IGNvdW50cnkgbmFtZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuZ2V0RGV2aWNlU3lzQ291bnRyeSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVN5c0NvdW50cnkgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncGVyc2lzdC5zeXMuY291bnRyeScpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEN1cnJlbnQgc3lzdGVtIGxvY2FsZSBuYW1lIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5nZXREZXZpY2VTeXNMb2NhbGUgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VTeXNMb2NhbGUgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncGVyc2lzdC5zeXMubG9jYWxlJyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gQ3VycmVudCBwcm9kdWN0IGxhbmd1YWdlIG5hbWUgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLmdldERldmljZVByb2R1Y3RMYW5ndWFnZSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVByb2R1Y3RMYW5ndWFnZSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdyby5wcm9kdWN0LmxvY2FsZS5sYW5ndWFnZScpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEN1cnJlbnQgcHJvZHVjdCBjb3VudHJ5IG5hbWUgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLmdldERldmljZVByb2R1Y3RDb3VudHJ5ID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlUHJvZHVjdENvdW50cnkgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncm8ucHJvZHVjdC5sb2NhbGUucmVnaW9uJyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gQ3VycmVudCBwcm9kdWN0IGxvY2FsZSBuYW1lIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5nZXREZXZpY2VQcm9kdWN0TG9jYWxlID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlUHJvZHVjdExvY2FsZSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdyby5wcm9kdWN0LmxvY2FsZScpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBtb2RlbCBuYW1lIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5nZXRNb2RlbCA9IGFzeW5jIGZ1bmN0aW9uIGdldE1vZGVsICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3JvLnByb2R1Y3QubW9kZWwnKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgbWFudWZhY3R1cmVyIG5hbWUgb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLmdldE1hbnVmYWN0dXJlciA9IGFzeW5jIGZ1bmN0aW9uIGdldE1hbnVmYWN0dXJlciAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdyby5wcm9kdWN0Lm1hbnVmYWN0dXJlcicpO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGN1cnJlbnQgc2NyZWVuIHNpemUuXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSBEZXZpY2Ugc2NyZWVuIHNpemUgYXMgc3RyaW5nIGluIGZvcm1hdCAnV3hIJyBvclxuICogICAgICAgICAgICAgICAgICBfbnVsbF8gaWYgaXQgY2Fubm90IGJlIGRldGVybWluZWQuXG4gKi9cbm1ldGhvZHMuZ2V0U2NyZWVuU2l6ZSA9IGFzeW5jIGZ1bmN0aW9uIGdldFNjcmVlblNpemUgKCkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5zaGVsbChbJ3dtJywgJ3NpemUnXSk7XG4gIGxldCBzaXplID0gbmV3IFJlZ0V4cCgvUGh5c2ljYWwgc2l6ZTogKFteXFxyP1xcbl0rKSovZykuZXhlYyhzdGRvdXQpO1xuICBpZiAoc2l6ZSAmJiBzaXplLmxlbmd0aCA+PSAyKSB7XG4gICAgcmV0dXJuIHNpemVbMV0udHJpbSgpO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGN1cnJlbnQgc2NyZWVuIGRlbnNpdHkgaW4gZHBpXG4gKlxuICogQHJldHVybiB7P251bWJlcn0gRGV2aWNlIHNjcmVlbiBkZW5zaXR5IGFzIGEgbnVtYmVyIG9yIF9udWxsXyBpZiBpdFxuICogICAgICAgICAgICAgICAgICBjYW5ub3QgYmUgZGV0ZXJtaW5lZFxuICovXG5tZXRob2RzLmdldFNjcmVlbkRlbnNpdHkgPSBhc3luYyBmdW5jdGlvbiBnZXRTY3JlZW5EZW5zaXR5ICgpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuc2hlbGwoWyd3bScsICdkZW5zaXR5J10pO1xuICBsZXQgZGVuc2l0eSA9IG5ldyBSZWdFeHAoL1BoeXNpY2FsIGRlbnNpdHk6IChbXlxccj9cXG5dKykqL2cpLmV4ZWMoc3Rkb3V0KTtcbiAgaWYgKGRlbnNpdHkgJiYgZGVuc2l0eS5sZW5ndGggPj0gMikge1xuICAgIGxldCBkZW5zaXR5TnVtYmVyID0gcGFyc2VJbnQoZGVuc2l0eVsxXS50cmltKCksIDEwKTtcbiAgICByZXR1cm4gaXNOYU4oZGVuc2l0eU51bWJlcikgPyBudWxsIDogZGVuc2l0eU51bWJlcjtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbi8qKlxuICogU2V0dXAgSFRUUCBwcm94eSBpbiBkZXZpY2UgZ2xvYmFsIHNldHRpbmdzLlxuICogUmVhZCBodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9mcmFtZXdvcmtzL2Jhc2UvKy9hbmRyb2lkLTkuMC4wX3IyMS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5qYXZhIGZvciBlYWNoIHByb3BlcnR5XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3h5SG9zdCAtIFRoZSBob3N0IG5hbWUgb2YgdGhlIHByb3h5LlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBwcm94eVBvcnQgLSBUaGUgcG9ydCBudW1iZXIgdG8gYmUgc2V0LlxuICovXG5tZXRob2RzLnNldEh0dHBQcm94eSA9IGFzeW5jIGZ1bmN0aW9uIHNldEh0dHBQcm94eSAocHJveHlIb3N0LCBwcm94eVBvcnQpIHtcbiAgbGV0IHByb3h5ID0gYCR7cHJveHlIb3N0fToke3Byb3h5UG9ydH1gO1xuICBpZiAoXy5pc1VuZGVmaW5lZChwcm94eUhvc3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYWxsIHRvIHNldEh0dHBQcm94eSBtZXRob2Qgd2l0aCB1bmRlZmluZWQgcHJveHlfaG9zdDogJHtwcm94eX1gKTtcbiAgfVxuICBpZiAoXy5pc1VuZGVmaW5lZChwcm94eVBvcnQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYWxsIHRvIHNldEh0dHBQcm94eSBtZXRob2Qgd2l0aCB1bmRlZmluZWQgcHJveHlfcG9ydCAke3Byb3h5fWApO1xuICB9XG5cbiAgY29uc3QgaHR0cFByb3h5U2V0dGlucyA9IFtcbiAgICBbJ2h0dHBfcHJveHknLCBwcm94eV0sXG4gICAgWydnbG9iYWxfaHR0cF9wcm94eV9ob3N0JywgcHJveHlIb3N0XSxcbiAgICBbJ2dsb2JhbF9odHRwX3Byb3h5X3BvcnQnLCBwcm94eVBvcnRdXG4gIF07XG4gIGZvciAoY29uc3QgW3NldHRpbmdLZXksIHNldHRpbmdWYWx1ZV0gb2YgaHR0cFByb3h5U2V0dGlucykge1xuICAgIGF3YWl0IHRoaXMuc2V0U2V0dGluZygnZ2xvYmFsJywgc2V0dGluZ0tleSwgc2V0dGluZ1ZhbHVlKTtcbiAgfVxufTtcblxuLyoqXG4gKiBEZWxldGUgSFRUUCBwcm94eSBpbiBkZXZpY2UgZ2xvYmFsIHNldHRpbmdzLlxuICogUmVib290aW5nIHRoZSB0ZXN0IGRldmljZSBpcyBuZWNlc3NhcnkgdG8gYXBwbHkgdGhlIGNoYW5nZS5cbiAqL1xubWV0aG9kcy5kZWxldGVIdHRwUHJveHkgPSBhc3luYyBmdW5jdGlvbiBkZWxldGVIdHRwUHJveHkgKCkge1xuICBjb25zdCBodHRwUHJveHlTZXR0aW5zID0gW1xuICAgICdodHRwX3Byb3h5JyxcbiAgICAnZ2xvYmFsX2h0dHBfcHJveHlfaG9zdCcsXG4gICAgJ2dsb2JhbF9odHRwX3Byb3h5X3BvcnQnLFxuICAgICdnbG9iYWxfaHR0cF9wcm94eV9leGNsdXNpb25fbGlzdCcgLy8gYGdsb2JhbF9odHRwX3Byb3h5X2V4Y2x1c2lvbl9saXN0PWAgd2FzIGdlbmVyYXRlZCBieSBgc2V0dGluZ3MgZ2xvYmFsIGh0dG9fcHJveHkgeHh4eGBcbiAgXTtcbiAgZm9yIChjb25zdCBzZXR0aW5nIG9mIGh0dHBQcm94eVNldHRpbnMpIHtcbiAgICBhd2FpdCB0aGlzLnNoZWxsKFsnc2V0dGluZ3MnLCAnZGVsZXRlJywgJ2dsb2JhbCcsIHNldHRpbmddKTtcbiAgfVxufTtcblxuLyoqXG4gKiBTZXQgZGV2aWNlIHByb3BlcnR5LlxuICogW2FuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3Nde0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLmh0bWx9XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVzcGFjZSAtIG9uZSBvZiB7c3lzdGVtLCBzZWN1cmUsIGdsb2JhbH0sIGNhc2UtaW5zZW5zaXRpdmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc2V0dGluZyAtIHByb3BlcnR5IG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHZhbHVlIC0gcHJvcGVydHkgdmFsdWUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IGNvbW1hbmQgb3V0cHV0LlxuICovXG5tZXRob2RzLnNldFNldHRpbmcgPSBhc3luYyBmdW5jdGlvbiBzZXRTZXR0aW5nIChuYW1lc3BhY2UsIHNldHRpbmcsIHZhbHVlKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnNoZWxsKFsnc2V0dGluZ3MnLCAncHV0JywgbmFtZXNwYWNlLCBzZXR0aW5nLCB2YWx1ZV0pO1xufTtcblxuLyoqXG4gKiBHZXQgZGV2aWNlIHByb3BlcnR5LlxuICogW2FuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3Nde0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLmh0bWx9XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVzcGFjZSAtIG9uZSBvZiB7c3lzdGVtLCBzZWN1cmUsIGdsb2JhbH0sIGNhc2UtaW5zZW5zaXRpdmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc2V0dGluZyAtIHByb3BlcnR5IG5hbWUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHByb3BlcnR5IHZhbHVlLlxuICovXG5tZXRob2RzLmdldFNldHRpbmcgPSBhc3luYyBmdW5jdGlvbiBnZXRTZXR0aW5nIChuYW1lc3BhY2UsIHNldHRpbmcpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuc2hlbGwoWydzZXR0aW5ncycsICdnZXQnLCBuYW1lc3BhY2UsIHNldHRpbmddKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGBhZGIgYnVncmVwb3J0YCBjb21tYW5kIG91dHB1dC4gVGhpc1xuICogb3BlcmF0aW9uIG1heSB0YWtlIHVwIHRvIHNldmVyYWwgbWludXRlcy5cbiAqXG4gKiBAcGFyYW0gez9udW1iZXJ9IHRpbWVvdXQgWzEyMDAwMF0gLSBDb21tYW5kIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBDb21tYW5kIHN0ZG91dFxuICovXG5tZXRob2RzLmJ1Z3JlcG9ydCA9IGFzeW5jIGZ1bmN0aW9uIGJ1Z3JlcG9ydCAodGltZW91dCA9IDEyMDAwMCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGJFeGVjKFsnYnVncmVwb3J0J10sIHt0aW1lb3V0fSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNjcmVlbnJlY29yZE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdmlkZW9TaXplIC0gVGhlIGZvcm1hdCBpcyB3aWR0aHhoZWlnaHQuXG4gKiAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRoZSBkZXZpY2UncyBuYXRpdmUgZGlzcGxheSByZXNvbHV0aW9uIChpZiBzdXBwb3J0ZWQpLFxuICogICAgICAgICAgICAgICAgICAxMjgweDcyMCBpZiBub3QuIEZvciBiZXN0IHJlc3VsdHMsXG4gKiAgICAgICAgICAgICAgICAgIHVzZSBhIHNpemUgc3VwcG9ydGVkIGJ5IHlvdXIgZGV2aWNlJ3MgQWR2YW5jZWQgVmlkZW8gQ29kaW5nIChBVkMpIGVuY29kZXIuXG4gKiAgICAgICAgICAgICAgICAgIEZvciBleGFtcGxlLCBcIjEyODB4NzIwXCJcbiAqIEBwcm9wZXJ0eSB7P2Jvb2xlYW59IGJ1Z1JlcG9ydCAtIFNldCBpdCB0byBgdHJ1ZWAgaW4gb3JkZXIgdG8gZGlzcGxheSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIHRoZSB2aWRlbyBvdmVybGF5LFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjaCBhcyBhIHRpbWVzdGFtcCwgdGhhdCBpcyBoZWxwZnVsIGluIHZpZGVvcyBjYXB0dXJlZCB0byBpbGx1c3RyYXRlIGJ1Z3MuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbiBpcyBvbmx5IHN1cHBvcnRlZCBzaW5jZSBBUEkgbGV2ZWwgMjcgKEFuZHJvaWQgUCkuXG4gKiBAcHJvcGVydHkgez9zdHJpbmd8bnVtYmVyfSB0aW1lTGltaXQgLSBUaGUgbWF4aW11bSByZWNvcmRpbmcgdGltZSwgaW4gc2Vjb25kcy5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IChhbmQgbWF4aW11bSkgdmFsdWUgaXMgMTgwICgzIG1pbnV0ZXMpLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfG51bWJlcn0gYml0UmF0ZSAtIFRoZSB2aWRlbyBiaXQgcmF0ZSBmb3IgdGhlIHZpZGVvLCBpbiBtZWdhYml0cyBwZXIgc2Vjb25kLlxuICogICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgNC4gWW91IGNhbiBpbmNyZWFzZSB0aGUgYml0IHJhdGUgdG8gaW1wcm92ZSB2aWRlbyBxdWFsaXR5LFxuICogICAgICAgICAgICAgICAgYnV0IGRvaW5nIHNvIHJlc3VsdHMgaW4gbGFyZ2VyIG1vdmllIGZpbGVzLlxuICovXG5cbi8qKlxuICogSW5pdGlhdGUgc2NyZWVucmVjb3JkIHV0aWxpdHkgb24gdGhlIGRldmljZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXN0aW5hdGlvbiAtIEZ1bGwgcGF0aCB0byB0aGUgd3JpdGFibGUgbWVkaWEgZmlsZSBkZXN0aW5hdGlvblxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gdGhlIGRldmljZSBmaWxlIHN5c3RlbS5cbiAqIEBwYXJhbSB7P1NjcmVlbnJlY29yZE9wdGlvbnN9IG9wdGlvbnMgW3t9XVxuICogQHJldHVybnMge1N1YlByb2Nlc3N9IHNjcmVlbnJlY29yZCBwcm9jZXNzLCB3aGljaCBjYW4gYmUgdGhlbiBjb250cm9sbGVkIGJ5IHRoZSBjbGllbnQgY29kZVxuICovXG5tZXRob2RzLnNjcmVlbnJlY29yZCA9IGZ1bmN0aW9uIHNjcmVlbnJlY29yZCAoZGVzdGluYXRpb24sIG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCBjbWQgPSBbJ3NjcmVlbnJlY29yZCddO1xuICBjb25zdCB7XG4gICAgdmlkZW9TaXplLFxuICAgIGJpdFJhdGUsXG4gICAgdGltZUxpbWl0LFxuICAgIGJ1Z1JlcG9ydCxcbiAgfSA9IG9wdGlvbnM7XG4gIGlmICh1dGlsLmhhc1ZhbHVlKHZpZGVvU2l6ZSkpIHtcbiAgICBjbWQucHVzaCgnLS1zaXplJywgdmlkZW9TaXplKTtcbiAgfVxuICBpZiAodXRpbC5oYXNWYWx1ZSh0aW1lTGltaXQpKSB7XG4gICAgY21kLnB1c2goJy0tdGltZS1saW1pdCcsIHRpbWVMaW1pdCk7XG4gIH1cbiAgaWYgKHV0aWwuaGFzVmFsdWUoYml0UmF0ZSkpIHtcbiAgICBjbWQucHVzaCgnLS1iaXQtcmF0ZScsIGJpdFJhdGUpO1xuICB9XG4gIGlmIChidWdSZXBvcnQpIHtcbiAgICBjbWQucHVzaCgnLS1idWdyZXBvcnQnKTtcbiAgfVxuICBjbWQucHVzaChkZXN0aW5hdGlvbik7XG5cbiAgY29uc3QgZnVsbENtZCA9IFtcbiAgICAuLi50aGlzLmV4ZWN1dGFibGUuZGVmYXVsdEFyZ3MsXG4gICAgJ3NoZWxsJyxcbiAgICAuLi5jbWRcbiAgXTtcbiAgbG9nLmRlYnVnKGBCdWlsZGluZyBzY3JlZW5yZWNvcmQgcHJvY2VzcyB3aXRoIHRoZSBjb21tYW5kIGxpbmU6IGFkYiAke3V0aWwucXVvdGUoZnVsbENtZCl9YCk7XG4gIHJldHVybiBuZXcgU3ViUHJvY2Vzcyh0aGlzLmV4ZWN1dGFibGUucGF0aCwgZnVsbENtZCk7XG59O1xuXG4vKipcbiAqIEV4ZWN1dGVzIHRoZSBnaXZlbiBmdW5jdGlvbiB3aXRoIHRoZSBnaXZlbiBpbnB1dCBtZXRob2QgY29udGV4dFxuICogYW5kIHRoZW4gcmVzdG9yZXMgdGhlIElNRSB0byB0aGUgb3JpZ2luYWwgdmFsdWVcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW1lIC0gVmFsaWQgSU1FIGlkZW50aWZpZXJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gRnVuY3Rpb24gdG8gZXhlY3V0ZVxuICogQHJldHVybnMgeyp9IFRoZSByZXN1bHQgb2YgdGhlIGdpdmVuIGZ1bmN0aW9uXG4gKi9cbm1ldGhvZHMucnVuSW5JbWVDb250ZXh0ID0gYXN5bmMgZnVuY3Rpb24gcnVuSW5JbWVDb250ZXh0IChpbWUsIGZuKSB7XG4gIGNvbnN0IG9yaWdpbmFsSW1lID0gYXdhaXQgdGhpcy5kZWZhdWx0SU1FKCk7XG4gIGlmIChvcmlnaW5hbEltZSA9PT0gaW1lKSB7XG4gICAgbG9nLmRlYnVnKGBUaGUgb3JpZ2luYWwgSU1FIGlzIHRoZSBzYW1lIGFzICcke2ltZX0nLiBUaGVyZSBpcyBubyBuZWVkIHRvIHJlc2V0IGl0YCk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgdGhpcy5lbmFibGVJTUUoaW1lKTtcbiAgICBhd2FpdCB0aGlzLnNldElNRShpbWUpO1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy8xNTk0M1xuICAgIGF3YWl0IEIuZGVsYXkoNTAwKTtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChvcmlnaW5hbEltZSAhPT0gaW1lKSB7XG4gICAgICBhd2FpdCB0aGlzLnNldElNRShvcmlnaW5hbEltZSk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEdldCB0eiBkYXRhYmFzZSB0aW1lIHpvbmUgZm9ybWF0dGVkIHRpbWV6b25lXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVFogZGF0YWJhc2UgVGltZSBab25lcyBmb3JtYXRcbiAqXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgYW55IGV4Y2VwdGlvbiBpcyByZXBvcnRlZCBieSBhZGIgc2hlbGwuXG4gKi9cbm1ldGhvZHMuZ2V0VGltZVpvbmUgPSBhc3luYyBmdW5jdGlvbiBnZXRUaW1lWm9uZSAoKSB7XG4gIGxvZy5kZWJ1ZygnR2V0dGluZyBjdXJyZW50IHRpbWV6b25lJyk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3BlcnNpc3Quc3lzLnRpbWV6b25lJyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGdldHRpbmcgdGltZXpvbmUuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGxpc3Qgb2YgZmVhdHVyZXMgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UgdW5kZXIgdGVzdFxuICpcbiAqIEByZXR1cm5zIHtBcnJheTxzdHJpbmc+fSB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgZmVhdHVyZSBuYW1lcyBvciBhbiBlbXB0eSBsaXN0LlxuICogQW4gZXhhbXBsZSBhZGIgY29tbWFuZCBvdXRwdXQ6XG4gKiBgYGBcbiAqIGNtZFxuICogbHNfdjJcbiAqIGZpeGVkX3B1c2hfbWtkaXJcbiAqIHNoZWxsX3YyXG4gKiBhYmJcbiAqIHN0YXRfdjJcbiAqIGFwZXhcbiAqIGFiYl9leGVjXG4gKiByZW1vdW50X3NoZWxsXG4gKiBmaXhlZF9wdXNoX3N5bWxpbmtfdGltZXN0YW1wXG4gKiBgYGBcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgcmV0cmlldmluZyB0aGUgbGlzdFxuICovXG5tZXRob2RzLmxpc3RGZWF0dXJlcyA9IGFzeW5jIGZ1bmN0aW9uIGxpc3RGZWF0dXJlcyAoKSB7XG4gIHRoaXMuX21lbW9pemVkRmVhdHVyZXMgPSB0aGlzLl9tZW1vaXplZEZlYXR1cmVzXG4gICAgfHwgXy5tZW1vaXplKGFzeW5jICgpID0+IGF3YWl0IHRoaXMuYWRiRXhlYyhbJ2ZlYXR1cmVzJ10pLCAoKSA9PiB0aGlzLmN1ckRldmljZUlkKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuX21lbW9pemVkRmVhdHVyZXMoKSlcbiAgICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgICAubWFwKCh4KSA9PiB4LnRyaW0oKSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoXy5pbmNsdWRlcyhlLnN0ZGVyciwgJ3Vua25vd24gY29tbWFuZCcpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHRocm93IGU7XG4gIH1cbn07XG5cbi8qKlxuICogQ2hlY2tzIHRoZSBzdGF0ZSBvZiBzdHJlYW1lZCBpbnN0YWxsIGZlYXR1cmUuXG4gKiBUaGlzIGZlYXR1cmUgYWxsb3dzIHRvIHNwZWVkIHVwIGFwayBpbnN0YWxsYXRpb25cbiAqIHNpbmNlIGl0IGRvZXMgbm90IHJlcXVpcmUgdGhlIG9yaWdpbmFsIGFwayB0byBiZSBwdXNoZWQgdG9cbiAqIHRoZSBkZXZpY2UgdW5kZXIgdGVzdCBmaXJzdCwgd2hpY2ggYWxzbyBzYXZlcyBzcGFjZS5cbiAqIEFsdGhvdWdoLCBpdCBpcyByZXF1aXJlZCB0aGF0IGJvdGggdGhlIGRldmljZSB1bmRlciB0ZXN0XG4gKiBhbmQgdGhlIGFkYiBzZXJ2ZXIgaGF2ZSB0aGUgbWVudGlvbmVkIGZ1bmN0aW9uYWxpdHkuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2Fvc3AtbWlycm9yL3BsYXRmb3JtX3N5c3RlbV9jb3JlL2Jsb2IvbWFzdGVyL2FkYi9jbGllbnQvYWRiX2luc3RhbGwuY3BwXG4gKiBmb3IgbW9yZSBkZXRhaWxzXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgYm90aCBhZGIgYW5kIHRoZVxuICogZGV2aWNlIHVuZGVyIHRlc3RcbiAqL1xubWV0aG9kcy5pc1N0cmVhbWVkSW5zdGFsbFN1cHBvcnRlZCA9IGFzeW5jIGZ1bmN0aW9uIGlzU3RyZWFtZWRJbnN0YWxsU3VwcG9ydGVkICgpIHtcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcyk7XG4gIHByb3RvLl9oZWxwT3V0cHV0ID0gcHJvdG8uX2hlbHBPdXRwdXQgfHwgYXdhaXQgdGhpcy5hZGJFeGVjKFsnaGVscCddKTtcbiAgcmV0dXJuIHByb3RvLl9oZWxwT3V0cHV0LmluY2x1ZGVzKCctLXN0cmVhbWluZycpXG4gICAgJiYgKGF3YWl0IHRoaXMubGlzdEZlYXR1cmVzKCkpLmluY2x1ZGVzKCdjbWQnKTtcbn07XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgaW5jcmVtZW50YWwgaW5zdGFsbCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSBBREIuXG4gKiBSZWFkIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3ByZXZpZXcvZmVhdHVyZXMjaW5jcmVtZW50YWxcbiAqIGZvciBtb3JlIGRldGFpbHMgb24gaXQuXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgYm90aCBhZGIgYW5kIHRoZVxuICogZGV2aWNlIHVuZGVyIHRlc3RcbiAqL1xubWV0aG9kcy5pc0luY3JlbWVudGFsSW5zdGFsbFN1cHBvcnRlZCA9IGFzeW5jIGZ1bmN0aW9uIGlzSW5jcmVtZW50YWxJbnN0YWxsU3VwcG9ydGVkICgpIHtcbiAgY29uc3Qge2JpbmFyeX0gPSBhd2FpdCB0aGlzLmdldFZlcnNpb24oKTtcbiAgaWYgKCFiaW5hcnkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHV0aWwuY29tcGFyZVZlcnNpb25zKGJpbmFyeS52ZXJzaW9uLCAnPj0nLCAnMzAuMC4xJylcbiAgICAmJiAoYXdhaXQgdGhpcy5saXN0RmVhdHVyZXMoKSkuaW5jbHVkZXMoJ2FiYl9leGVjJyk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbGlzdCBvZiBwYWNrYWdlcyBmcm9tIERvemUgd2hpdGVsaXN0IG9uIEFuZHJvaWQgOCtcbiAqXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gVGhlIGxpc3Qgb2Ygd2hpdGVsaXN0ZWQgcGFja2FnZXMuIEFuIGV4YW1wbGUgb3V0cHV0OlxuICogc3lzdGVtLGNvbS5hbmRyb2lkLnNoZWxsLDIwMDBcbiAqIHN5c3RlbSxjb20uZ29vZ2xlLmFuZHJvaWQuY2VsbGJyb2FkY2FzdHJlY2VpdmVyLDEwMTQzXG4gKiB1c2VyLGlvLmFwcGl1bS5zZXR0aW5ncywxMDE1N1xuICovXG5tZXRob2RzLmdldERldmljZUlkbGVXaGl0ZWxpc3QgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VJZGxlV2hpdGVsaXN0ICgpIHtcbiAgaWYgKGF3YWl0IHRoaXMuZ2V0QXBpTGV2ZWwoKSA8IDIzKSB7XG4gICAgLy8gRG96ZSBtb2RlIGhhcyBvbmx5IGJlZW4gYWRkZWQgc2luY2UgQW5kcm9pZCA2XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgbG9nLmluZm8oJ0xpc3RpbmcgcGFja2FnZXMgaW4gRG96ZSB3aGl0ZWxpc3QnKTtcbiAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgdGhpcy5zaGVsbChbJ2R1bXBzeXMnLCAnZGV2aWNlaWRsZScsICd3aGl0ZWxpc3QnXSk7XG4gIHJldHVybiBfLnRyaW0ob3V0cHV0KS5zcGxpdCgvXFxuLylcbiAgICAubWFwKChsaW5lKSA9PiBfLnRyaW0obGluZSkpXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbn07XG5cbi8qKlxuICogQWRkcyBhbiBleGlzdGluZyBwYWNrYWdlKHMpIGludG8gdGhlIERvemUgd2hpdGVsaXN0IG9uIEFuZHJvaWQgOCtcbiAqXG4gKiBAcGFyYW0gIHsuLi5zdHJpbmd9IHBhY2thZ2VzIE9uZSBvciBtb3JlIHBhY2thZ2VzIHRvIGFkZC4gSWYgdGhlIHBhY2thZ2VcbiAqIGFscmVhZHkgZXhpc3RzIGluIHRoZSB3aGl0ZWxpc3QgdGhlbiBpdCBpcyBvbmx5IGdvaW5nIHRvIGJlIGFkZGVkIG9uY2UuXG4gKiBJZiB0aGUgcGFja2FnZSB3aXRoIHRoZSBnaXZlbiBuYW1lIGlzIG5vdCBpbnN0YWxsZWQvbm90IGtub3duIHRoZW4gYW4gZXJyb3JcbiAqIHdpbGwgYmUgdGhyb3duLlxuICogQHJldHVybnMge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgY29tbWFuZCB0byBhZGQgcGFja2FnZShzKSBoYXMgYmVlbiBleGVjdXRlZFxuICovXG5tZXRob2RzLmFkZFRvRGV2aWNlSWRsZVdoaXRlbGlzdCA9IGFzeW5jIGZ1bmN0aW9uIGFkZFRvRGV2aWNlSWRsZVdoaXRlbGlzdCAoLi4ucGFja2FnZXMpIHtcbiAgaWYgKF8uaXNFbXB0eShwYWNrYWdlcykgfHwgYXdhaXQgdGhpcy5nZXRBcGlMZXZlbCgpIDwgMjMpIHtcbiAgICAvLyBEb3plIG1vZGUgaGFzIG9ubHkgYmVlbiBhZGRlZCBzaW5jZSBBbmRyb2lkIDZcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBsb2cuaW5mbyhgQWRkaW5nICR7dXRpbC5wbHVyYWxpemUoJ3BhY2thZ2UnLCBwYWNrYWdlcy5sZW5ndGgpfSAke0pTT04uc3RyaW5naWZ5KHBhY2thZ2VzKX0gdG8gRG96ZSB3aGl0ZWxpc3RgKTtcbiAgYXdhaXQgdGhpcy5zaGVsbENodW5rcygocGtnKSA9PiBbJ2R1bXBzeXMnLCAnZGV2aWNlaWRsZScsICd3aGl0ZWxpc3QnLCBgKyR7cGtnfWBdLCBwYWNrYWdlcyk7XG4gIHJldHVybiB0cnVlO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgbWV0aG9kcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFJQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSx1QkFBdUIsR0FBRyxJQUFoQztBQUNBLE1BQU1DLHlCQUF5QixHQUFHLG1DQUFsQztBQUNBLE1BQU1DLG1CQUFtQixHQUFHLENBQzFCRCx5QkFEMEIsRUFFMUIscUJBRjBCLENBQTVCO0FBSUEsTUFBTUUscUJBQXFCLEdBQUcsRUFBOUI7QUFDQSxNQUFNQyxzQkFBc0IsR0FBRyxDQUM3Qiw4QkFENkIsRUFFN0IsMEJBRjZCLEVBRzdCLG1CQUg2QixDQUEvQjtBQUtBLE1BQU1DLGdCQUFnQixHQUFHLEtBQXpCO0FBQ0EsTUFBTUMseUJBQXlCLEdBQUcsTUFBbEM7QUFDQSxNQUFNQyxnQkFBZ0IsR0FBRyxJQUFJQyxNQUFKLENBQVksVUFBU0gsZ0JBQWlCLFdBQVVDLHlCQUEwQixTQUExRSxFQUFvRixHQUFwRixDQUF6QjtBQUNBLE1BQU1HLGdDQUFnQyxHQUFHLEVBQXpDO0FBRUEsTUFBTUMsT0FBTyxHQUFHLEVBQWhCOztBQWdCQUEsT0FBTyxDQUFDQyxXQUFSLEdBQXNCLGVBQWVBLFdBQWYsQ0FBNEJDLGNBQTVCLEVBQTRDQyxJQUE1QyxFQUFrRDtFQUN0RSxNQUFNQyxRQUFRLEdBQUcsRUFBakI7RUFDQSxJQUFJQyxRQUFRLEdBQUcsRUFBZjs7RUFDQSxLQUFLLE1BQU1DLEdBQVgsSUFBa0JILElBQWxCLEVBQXdCO0lBQ3RCLE1BQU1JLE9BQU8sR0FBR0wsY0FBYyxDQUFDSSxHQUFELENBQTlCOztJQUNBLElB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
1009
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNQVhfU0hFTExfQlVGRkVSX0xFTkdUSCIsIk5PVF9DSEFOR0VBQkxFX1BFUk1fRVJST1IiLCJJR05PUkVEX1BFUk1fRVJST1JTIiwiTUFYX1BHUkVQX1BBVFRFUk5fTEVOIiwiSElEREVOX0FQSV9QT0xJQ1lfS0VZUyIsIlBJRF9DT0xVTU5fVElUTEUiLCJQUk9DRVNTX05BTUVfQ09MVU1OX1RJVExFIiwiUFNfVElUTEVfUEFUVEVSTiIsIlJlZ0V4cCIsIk1JTl9BUElfTEVWRUxfV0lUSF9QRVJNU19TVVBQT1JUIiwibWV0aG9kcyIsInNoZWxsQ2h1bmtzIiwiYXJnVHJhbnNmb3JtZXIiLCJhcmdzIiwiY29tbWFuZHMiLCJjbWRDaHVuayIsImFyZyIsIm5leHRDbWQiLCJfIiwiaXNBcnJheSIsIkVycm9yIiwibGFzdCIsInB1c2giLCJqb2luIiwibGVuZ3RoIiwiaXNFbXB0eSIsImxvZyIsImRlYnVnIiwiSlNPTiIsInN0cmluZ2lmeSIsImxhc3RFcnJvciIsImNtZCIsInNoZWxsIiwiZSIsImdldEFkYldpdGhDb3JyZWN0QWRiUGF0aCIsImV4ZWN1dGFibGUiLCJwYXRoIiwiZ2V0U2RrQmluYXJ5UGF0aCIsImFkYiIsImluaXRBYXB0IiwiaW5pdEFhcHQyIiwiaW5pdFppcEFsaWduIiwiaW5pdEJ1bmRsZXRvb2wiLCJiaW5hcmllcyIsImJ1bmRsZXRvb2wiLCJmcyIsIndoaWNoIiwiZXJyIiwiZ2V0QXBpTGV2ZWwiLCJpc0ludGVnZXIiLCJfYXBpTGV2ZWwiLCJzdHJPdXRwdXQiLCJnZXREZXZpY2VQcm9wZXJ0eSIsImFwaUxldmVsIiwicGFyc2VJbnQiLCJ0cmltIiwiY2hhckNvZGVRIiwiY2hhckNvZGVBdCIsImFwaUxldmVsRGlmZiIsImNvZGVuYW1lIiwiU3RyaW5nIiwiZnJvbUNoYXJDb2RlIiwiZ2V0UGxhdGZvcm1WZXJzaW9uIiwidG9Mb3dlckNhc2UiLCJ0b1VwcGVyQ2FzZSIsImlzTmFOIiwibWVzc2FnZSIsImluZm8iLCJpc0RldmljZUNvbm5lY3RlZCIsImRldmljZXMiLCJnZXRDb25uZWN0ZWREZXZpY2VzIiwibWtkaXIiLCJyZW1vdGVQYXRoIiwiaXNWYWxpZENsYXNzIiwiY2xhc3NTdHJpbmciLCJtYXRjaENvbXBvbmVudE5hbWUiLCJyZXNvbHZlTGF1bmNoYWJsZUFjdGl2aXR5IiwicGtnIiwib3B0cyIsInByZWZlckNtZCIsInN0ZG91dCIsIm5hbWVzIiwicGFyc2VMYXVuY2hhYmxlQWN0aXZpdHlOYW1lcyIsInRtcFJvb3QiLCJ0ZW1wRGlyIiwib3BlbkRpciIsInRtcEFwcCIsInB1bGxBcGsiLCJhcGtBY3Rpdml0eSIsInBhY2thZ2VBbmRMYXVuY2hBY3Rpdml0eUZyb21NYW5pZmVzdCIsInN0YWNrIiwid2FybiIsInJpbXJhZiIsInN0ZGVyciIsIm91dHB1dEZvcm1hdCIsIkVYRUNfT1VUUFVUX0ZPUk1BVCIsIkZVTEwiLCJsaW5lIiwic3BsaXQiLCJtYXAiLCJmb3JjZVN0b3AiLCJraWxsUGFja2FnZSIsImNsZWFyIiwiZ3JhbnRBbGxQZXJtaXNzaW9ucyIsImFwayIsInRhcmdldFNkayIsImR1bXBzeXNPdXRwdXQiLCJ0YXJnZXRTZGtWZXJzaW9uVXNpbmdQS0ciLCJ0YXJnZXRTZGtWZXJzaW9uRnJvbU1hbmlmZXN0IiwicmVxdWVzdGVkUGVybWlzc2lvbnMiLCJnZXRSZXFQZXJtaXNzaW9ucyIsImdyYW50ZWRQZXJtaXNzaW9ucyIsImdldEdyYW50ZWRQZXJtaXNzaW9ucyIsInBlcm1pc3Npb25zVG9HcmFudCIsImRpZmZlcmVuY2UiLCJncmFudFBlcm1pc3Npb25zIiwicGVybWlzc2lvbnMiLCJwZXJtIiwic29tZSIsInBhdHRlcm4iLCJ0ZXN0IiwiZ3JhbnRQZXJtaXNzaW9uIiwicGVybWlzc2lvbiIsInJldm9rZVBlcm1pc3Npb24iLCJjbWRPdXRwdXQiLCJleHRyYWN0TWF0Y2hpbmdQZXJtaXNzaW9ucyIsImdldERlbmllZFBlcm1pc3Npb25zIiwiZ2V0TG9jYXRpb25Qcm92aWRlcnMiLCJnZXRTZXR0aW5nIiwicCIsImZpbHRlciIsIkJvb2xlYW4iLCJ0b2dnbGVHUFNMb2NhdGlvblByb3ZpZGVyIiwiZW5hYmxlZCIsInNldFNldHRpbmciLCJzZXRIaWRkZW5BcGlQb2xpY3kiLCJ2YWx1ZSIsImlnbm9yZUVycm9yIiwiayIsInNldERlZmF1bHRIaWRkZW5BcGlQb2xpY3kiLCJzdG9wQW5kQ2xlYXIiLCJhdmFpbGFibGVJTUVzIiwiZ2V0SU1FTGlzdEZyb21PdXRwdXQiLCJlbmFibGVkSU1FcyIsImVuYWJsZUlNRSIsImltZUlkIiwiZGlzYWJsZUlNRSIsInNldElNRSIsImRlZmF1bHRJTUUiLCJlbmdpbmUiLCJrZXlldmVudCIsImtleWNvZGUiLCJjb2RlIiwiaW5wdXRUZXh0IiwidGV4dCIsIm9yaWdpbmFsU3RyIiwiZXNjYXBlZFRleHQiLCJyZXBsYWNlIiwiYWRiSW5wdXRFc2NhcGVQYXR0ZXJuIiwiZXZlcnkiLCJjIiwiaW5jbHVkZXMiLCJxIiwiY2xlYXJUZXh0RmllbGQiLCJpIiwibG9jayIsImlzU2NyZWVuTG9ja2VkIiwidGltZW91dE1zIiwid2FpdEZvckNvbmRpdGlvbiIsIndhaXRNcyIsImludGVydmFsTXMiLCJiYWNrIiwiZ29Ub0hvbWUiLCJnZXRBZGJQYXRoIiwiZ2V0U2NyZWVuT3JpZW50YXRpb24iLCJnZXRTdXJmYWNlT3JpZW50YXRpb24iLCJzZW5kVGVsbmV0Q29tbWFuZCIsImNvbW1hbmQiLCJleGVjRW11Q29uc29sZUNvbW1hbmQiLCJwb3J0IiwiZ2V0RW11bGF0b3JQb3J0IiwiaXNBaXJwbGFuZU1vZGVPbiIsInNldEFpcnBsYW5lTW9kZSIsIm9uIiwiYnJvYWRjYXN0QWlycGxhbmVNb2RlIiwicHJpdmlsZWdlZCIsImlnbiIsImlzV2lmaU9uIiwiaXNEYXRhT24iLCJzZXRXaWZpQW5kRGF0YSIsIndpZmkiLCJkYXRhIiwiaXNFbXVsYXRvciIsInV0aWwiLCJoYXNWYWx1ZSIsInNldFdpZmlTdGF0ZSIsInNldERhdGFTdGF0ZSIsImlzQW5pbWF0aW9uT24iLCJhbmltYXRvcl9kdXJhdGlvbl9zY2FsZSIsInRyYW5zaXRpb25fYW5pbWF0aW9uX3NjYWxlIiwid2luZG93X2FuaW1hdGlvbl9zY2FsZSIsInNldHRpbmciLCJsb2NhbFBhdGgiLCJwb3NpeCIsImRpcm5hbWUiLCJhZGJFeGVjIiwicHVsbCIsInRpbWVvdXQiLCJwcm9jZXNzRXhpc3RzIiwicHJvY2Vzc05hbWUiLCJnZXRQSURzQnlOYW1lIiwiZ2V0Rm9yd2FyZExpc3QiLCJjb25uZWN0aW9ucyIsIkVPTCIsImZvcndhcmRQb3J0Iiwic3lzdGVtUG9ydCIsImRldmljZVBvcnQiLCJyZW1vdmVQb3J0Rm9yd2FyZCIsImdldFJldmVyc2VMaXN0IiwicmV2ZXJzZVBvcnQiLCJyZW1vdmVQb3J0UmV2ZXJzZSIsImZvcndhcmRBYnN0cmFjdFBvcnQiLCJwaW5nIiwiaW5kZXhPZiIsInJlc3RhcnQiLCJzdG9wTG9nY2F0IiwicmVzdGFydEFkYiIsIndhaXRGb3JEZXZpY2UiLCJzdGFydExvZ2NhdCIsIl9sb2djYXRTdGFydHVwUGFyYW1zIiwibG9nY2F0IiwiTG9nY2F0IiwiZGVidWdUcmFjZSIsImNsZWFyRGV2aWNlTG9nc09uU3RhcnQiLCJzdGFydENhcHR1cmUiLCJzdG9wQ2FwdHVyZSIsImdldExvZ2NhdExvZ3MiLCJnZXRMb2dzIiwic2V0TG9nY2F0TGlzdGVuZXIiLCJsaXN0ZW5lciIsInJlbW92ZUxvZ2NhdExpc3RlbmVyIiwicmVtb3ZlTGlzdGVuZXIiLCJsaXN0UHJvY2Vzc1N0YXR1cyIsImlzQm9vbGVhbiIsIl9kb2VzUHNTdXBwb3J0QU9wdGlvbiIsImdldE5hbWVCeVBpZCIsInBpZCIsInRpdGxlTWF0Y2giLCJleGVjIiwiYWxsVGl0bGVzIiwicGlkSW5kZXgiLCJuYW1lT2Zmc2V0IiwicGlkUmVnZXgiLCJtYXRjaGVkTGluZSIsIml0ZW1zIiwibmFtZSIsIl9pc1BncmVwQXZhaWxhYmxlIiwicGdyZXBPdXRwdXQiLCJfY2FuUGdyZXBVc2VGdWxsQ21kTGluZVNlYXJjaCIsIl9pc1BpZG9mQXZhaWxhYmxlIiwic2hlbGxDb21tYW5kIiwiZXNjYXBlUmVnRXhwIiwic2xpY2UiLCJ4IiwicGlkcyIsInByb2Nlc3NOYW1lUmVnZXgiLCJraWxsUHJvY2Vzc2VzQnlOYW1lIiwiQiIsImFsbCIsImtpbGxQcm9jZXNzQnlQSUQiLCJub1Byb2Nlc3NGbGFnIiwiZTEiLCJicm9hZGNhc3RQcm9jZXNzRW5kIiwiaW50ZW50IiwiYnJvYWRjYXN0Iiwic3RhcnQiLCJEYXRlIiwibm93Iiwic2xlZXAiLCJlbmRBbmRyb2lkQ292ZXJhZ2UiLCJpbnN0cnVtZW50UHJvYyIsImlzUnVubmluZyIsInN0b3AiLCJpbnN0cnVtZW50IiwiYWN0aXZpdHkiLCJpbnN0cnVtZW50V2l0aCIsInBrZ0FjdGl2aXR5IiwiYW5kcm9pZENvdmVyYWdlIiwiaW5zdHJ1bWVudENsYXNzIiwid2FpdFBrZyIsIndhaXRBY3Rpdml0eSIsInJlc29sdmUiLCJyZWplY3QiLCJkZWZhdWx0QXJncyIsImNvbmNhdCIsIlN1YlByb2Nlc3MiLCJ3YWl0Rm9yQWN0aXZpdHkiLCJwcm9wZXJ0eSIsInZhbCIsInNldERldmljZVByb3BlcnR5IiwicHJvcCIsImdldERldmljZVN5c0xhbmd1YWdlIiwiZ2V0RGV2aWNlU3lzQ291bnRyeSIsImdldERldmljZVN5c0xvY2FsZSIsImdldERldmljZVByb2R1Y3RMYW5ndWFnZSIsImdldERldmljZVByb2R1Y3RDb3VudHJ5IiwiZ2V0RGV2aWNlUHJvZHVjdExvY2FsZSIsImdldE1vZGVsIiwiZ2V0TWFudWZhY3R1cmVyIiwiZ2V0U2NyZWVuU2l6ZSIsInNpemUiLCJnZXRTY3JlZW5EZW5zaXR5IiwiZGVuc2l0eSIsImRlbnNpdHlOdW1iZXIiLCJzZXRIdHRwUHJveHkiLCJwcm94eUhvc3QiLCJwcm94eVBvcnQiLCJwcm94eSIsImlzVW5kZWZpbmVkIiwiaHR0cFByb3h5U2V0dGlucyIsInNldHRpbmdLZXkiLCJzZXR0aW5nVmFsdWUiLCJkZWxldGVIdHRwUHJveHkiLCJuYW1lc3BhY2UiLCJidWdyZXBvcnQiLCJzY3JlZW5yZWNvcmQiLCJkZXN0aW5hdGlvbiIsIm9wdGlvbnMiLCJ2aWRlb1NpemUiLCJiaXRSYXRlIiwidGltZUxpbWl0IiwiYnVnUmVwb3J0IiwiZnVsbENtZCIsInF1b3RlIiwicnVuSW5JbWVDb250ZXh0IiwiaW1lIiwiZm4iLCJvcmlnaW5hbEltZSIsImRlbGF5IiwiZ2V0VGltZVpvbmUiLCJsaXN0RmVhdHVyZXMiLCJfbWVtb2l6ZWRGZWF0dXJlcyIsIm1lbW9pemUiLCJjdXJEZXZpY2VJZCIsImlzU3RyZWFtZWRJbnN0YWxsU3VwcG9ydGVkIiwicHJvdG8iLCJPYmplY3QiLCJnZXRQcm90b3R5cGVPZiIsIl9oZWxwT3V0cHV0IiwiaXNJbmNyZW1lbnRhbEluc3RhbGxTdXBwb3J0ZWQiLCJiaW5hcnkiLCJnZXRWZXJzaW9uIiwiY29tcGFyZVZlcnNpb25zIiwidmVyc2lvbiIsImdldERldmljZUlkbGVXaGl0ZWxpc3QiLCJvdXRwdXQiLCJhZGRUb0RldmljZUlkbGVXaGl0ZWxpc3QiLCJwYWNrYWdlcyIsInBsdXJhbGl6ZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi90b29scy9hZGItY29tbWFuZHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHtcbiAgZ2V0SU1FTGlzdEZyb21PdXRwdXQsIGdldFN1cmZhY2VPcmllbnRhdGlvbiwgZXh0cmFjdE1hdGNoaW5nUGVybWlzc2lvbnMsXG4gIHBhcnNlTGF1bmNoYWJsZUFjdGl2aXR5TmFtZXMsIG1hdGNoQ29tcG9uZW50TmFtZSxcbn0gZnJvbSAnLi4vaGVscGVycy5qcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBmcywgdXRpbCwgdGVtcERpciB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBFT0wgfSBmcm9tICdvcyc7XG5pbXBvcnQgTG9nY2F0IGZyb20gJy4uL2xvZ2NhdCc7XG5pbXBvcnQgeyBzbGVlcCwgd2FpdEZvckNvbmRpdGlvbiB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IFN1YlByb2Nlc3MgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuXG5jb25zdCBNQVhfU0hFTExfQlVGRkVSX0xFTkdUSCA9IDEwMDA7XG5jb25zdCBOT1RfQ0hBTkdFQUJMRV9QRVJNX0VSUk9SID0gL25vdCBhIGNoYW5nZWFibGUgcGVybWlzc2lvbiB0eXBlL2k7XG5jb25zdCBJR05PUkVEX1BFUk1fRVJST1JTID0gW1xuICBOT1RfQ0hBTkdFQUJMRV9QRVJNX0VSUk9SLFxuICAvVW5rbm93biBwZXJtaXNzaW9uL2ksXG5dO1xuY29uc3QgTUFYX1BHUkVQX1BBVFRFUk5fTEVOID0gMTU7XG5jb25zdCBISURERU5fQVBJX1BPTElDWV9LRVlTID0gW1xuICAnaGlkZGVuX2FwaV9wb2xpY3lfcHJlX3BfYXBwcycsXG4gICdoaWRkZW5fYXBpX3BvbGljeV9wX2FwcHMnLFxuICAnaGlkZGVuX2FwaV9wb2xpY3knXG5dO1xuY29uc3QgUElEX0NPTFVNTl9USVRMRSA9ICdQSUQnO1xuY29uc3QgUFJPQ0VTU19OQU1FX0NPTFVNTl9USVRMRSA9ICdOQU1FJztcbmNvbnN0IFBTX1RJVExFX1BBVFRFUk4gPSBuZXcgUmVnRXhwKGBeKC4qXFxcXGIke1BJRF9DT0xVTU5fVElUTEV9XFxcXGIuKlxcXFxiJHtQUk9DRVNTX05BTUVfQ09MVU1OX1RJVExFfVxcXFxiLiopJGAsICdtJyk7XG5jb25zdCBNSU5fQVBJX0xFVkVMX1dJVEhfUEVSTVNfU1VQUE9SVCA9IDIzO1xuXG5jb25zdCBtZXRob2RzID0ge307XG5cbi8qKlxuICogQ3JlYXRlcyBjaHVua3MgZm9yIHRoZSBnaXZlbiBhcmd1bWVudHMgYW5kIGV4ZWN1dGVzIHRoZW0gaW4gYGFkYiBzaGVsbGAuXG4gKiBUaGlzIGlzIGZhc3RlciB0aGFuIGNhbGxpbmcgYGFkYiBzaGVsbGAgc2VwYXJhdGVseSBmb3IgZWFjaCBhcmcsIGhvd2V2ZXJcbiAqIHRoZXJlIGlzIGEgbGltaXQgZm9yIGEgbWF4aW11bSBsZW5ndGggb2YgYSBzaW5nbGUgYWRiIGNvbW1hbmQuIHRoYXQgaXMgd2h5XG4gKiB3ZSBuZWVkIGFsbCB0aGlzIGNvbXBsaWNhdGVkIGxvZ2ljLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGFyZ1RyYW5zZm9ybWVyIEEgZnVuY3Rpb24sIHRoYXQgcmVjZWl2ZXMgc2luZ2xlIGFyZ3VtZW50XG4gKiBmcm9tIHRoZSBgYXJnc2AgYXJyYXkgYW5kIHRyYW5zZm9ybXMgaXQgaW50byBhIHNoZWxsIGNvbW1hbmQuIFRoZSByZXN1bHRcbiAqIG9mIHRoZSBmdW5jdGlvbiBtdXN0IGJlIGFuIGFycmF5LCB3aGVyZSBlYWNoIGl0ZW0gaXMgYSBwYXJ0IG9mIGEgc2luZ2xlIGNvbW1hbmQuXG4gKiBUaGUgbGFzdCBpdGVtIG9mIHRoZSBhcnJheSBjb3VsZCBiZSAnOycuIElmIHRoaXMgaXMgbm90IGEgc2VtaWNvbG9uIHRoZW4gaXQgaXMgZ29pbmcgdG9cbiAqIGJlIGFkZGVkIGF1dG9tYXRpY2FsbHkuXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcnxzdHJpbmc+fSBhcmdzIEFycmF5IG9mIGFyZ3VtZW50IHZhbHVlcyB0byBjcmVhdGUgY2h1bmtzIGZvclxuICogQHRocm93cyB7RXJyb3J9IElmIGFueSBvZiB0aGUgY2h1bmtzIHJldHVybnMgbm9uLXplcm8gZXhpdCBjb2RlIGFmdGVyIGJlaW5nIGV4ZWN1dGVkXG4gKi9cbm1ldGhvZHMuc2hlbGxDaHVua3MgPSBhc3luYyBmdW5jdGlvbiBzaGVsbENodW5rcyAoYXJnVHJhbnNmb3JtZXIsIGFyZ3MpIHtcbiAgY29uc3QgY29tbWFuZHMgPSBbXTtcbiAgbGV0IGNtZENodW5rID0gW107XG4gIGZvciAoY29uc3QgYXJnIG9mIGFyZ3MpIHtcbiAgICBjb25zdCBuZXh0Q21kID0gYXJnVHJhbnNmb3JtZXIoYXJnKTtcbiAgICBpZiAoIV8uaXNBcnJheShuZXh0Q21kKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcmd1bWVudCB0cmFuc2Zvcm1lciBtdXN0IHJlc3VsdCBpbiBhbiBhcnJheScpO1xuICAgIH1cbiAgICBpZiAoXy5sYXN0KG5leHRDbWQpICE9PSAnOycpIHtcbiAgICAgIG5leHRDbWQucHVzaCgnOycpO1xuICAgIH1cbiAgICBpZiAobmV4dENtZC5qb2luKCcgJykubGVuZ3RoICsgY21kQ2h1bmsuam9pbignICcpLmxlbmd0aCA+PSBNQVhfU0hFTExfQlVGRkVSX0xFTkdUSCkge1xuICAgICAgY29tbWFuZHMucHVzaChjbWRDaHVuayk7XG4gICAgICBjbWRDaHVuayA9IFtdO1xuICAgIH1cbiAgICBjbWRDaHVuayA9IFsuLi5jbWRDaHVuaywgLi4ubmV4dENtZF07XG4gIH1cbiAgaWYgKCFfLmlzRW1wdHkoY21kQ2h1bmspKSB7XG4gICAgY29tbWFuZHMucHVzaChjbWRDaHVuayk7XG4gIH1cbiAgbG9nLmRlYnVnKGBHb3QgdGhlIGZvbGxvd2luZyBjb21tYW5kIGNodW5rcyB0byBleGVjdXRlOiAke0pTT04uc3RyaW5naWZ5KGNvbW1hbmRzKX1gKTtcbiAgbGV0IGxhc3RFcnJvciA9IG51bGw7XG4gIGZvciAoY29uc3QgY21kIG9mIGNvbW1hbmRzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuc2hlbGwoY21kKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsYXN0RXJyb3IgPSBlO1xuICAgIH1cbiAgfVxuICBpZiAobGFzdEVycm9yKSB7XG4gICAgdGhyb3cgbGFzdEVycm9yO1xuICB9XG59O1xuXG4vKipcbiAqIEdldCB0aGUgcGF0aCB0byBhZGIgZXhlY3V0YWJsZSBhbWQgYXNzaWduIGl0XG4gKiB0byB0aGlzLmV4ZWN1dGFibGUucGF0aCBhbmQgdGhpcy5iaW5hcmllcy5hZGIgcHJvcGVydGllcy5cbiAqXG4gKiBAcmV0dXJuIHtBREJ9IEFEQiBpbnN0YW5jZS5cbiAqL1xubWV0aG9kcy5nZXRBZGJXaXRoQ29ycmVjdEFkYlBhdGggPSBhc3luYyBmdW5jdGlvbiBnZXRBZGJXaXRoQ29ycmVjdEFkYlBhdGggKCkge1xuICB0aGlzLmV4ZWN1dGFibGUucGF0aCA9IGF3YWl0IHRoaXMuZ2V0U2RrQmluYXJ5UGF0aCgnYWRiJyk7XG4gIHJldHVybiB0aGlzLmFkYjtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBmdWxsIHBhdGggdG8gYWFwdCB0b29sIGFuZCBhc3NpZ24gaXQgdG9cbiAqIHRoaXMuYmluYXJpZXMuYWFwdCBwcm9wZXJ0eVxuICovXG5tZXRob2RzLmluaXRBYXB0ID0gYXN5bmMgZnVuY3Rpb24gaW5pdEFhcHQgKCkge1xuICBhd2FpdCB0aGlzLmdldFNka0JpbmFyeVBhdGgoJ2FhcHQnKTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBmdWxsIHBhdGggdG8gYWFwdDIgdG9vbCBhbmQgYXNzaWduIGl0IHRvXG4gKiB0aGlzLmJpbmFyaWVzLmFhcHQyIHByb3BlcnR5XG4gKi9cbm1ldGhvZHMuaW5pdEFhcHQyID0gYXN5bmMgZnVuY3Rpb24gaW5pdEFhcHQyICgpIHtcbiAgYXdhaXQgdGhpcy5nZXRTZGtCaW5hcnlQYXRoKCdhYXB0MicpO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGZ1bGwgcGF0aCB0byB6aXBhbGlnbiB0b29sIGFuZCBhc3NpZ24gaXQgdG9cbiAqIHRoaXMuYmluYXJpZXMuemlwYWxpZ24gcHJvcGVydHlcbiAqL1xubWV0aG9kcy5pbml0WmlwQWxpZ24gPSBhc3luYyBmdW5jdGlvbiBpbml0WmlwQWxpZ24gKCkge1xuICBhd2FpdCB0aGlzLmdldFNka0JpbmFyeVBhdGgoJ3ppcGFsaWduJyk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgZnVsbCBwYXRoIHRvIGJ1bmRsZXRvb2wgYmluYXJ5IGFuZCBhc3NpZ24gaXQgdG9cbiAqIHRoaXMuYmluYXJpZXMuYnVuZGxldG9vbCBwcm9wZXJ0eVxuICovXG5tZXRob2RzLmluaXRCdW5kbGV0b29sID0gYXN5bmMgZnVuY3Rpb24gaW5pdEJ1bmRsZXRvb2wgKCkge1xuICB0cnkge1xuICAgIHRoaXMuYmluYXJpZXMuYnVuZGxldG9vbCA9IGF3YWl0IGZzLndoaWNoKCdidW5kbGV0b29sLmphcicpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2J1bmRsZXRvb2wuamFyIGJpbmFyeSBpcyBleHBlY3RlZCB0byBiZSBwcmVzZW50IGluIFBBVEguICcgK1xuICAgICAgJ1Zpc2l0IGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvYnVuZGxldG9vbCBmb3IgbW9yZSBkZXRhaWxzLicpO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBBUEkgbGV2ZWwgb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIEFQSSBsZXZlbCBhcyBpbnRlZ2VyIG51bWJlciwgZm9yIGV4YW1wbGUgMjEgZm9yXG4gKiAgICAgICAgICAgICAgICAgIEFuZHJvaWQgTG9sbGlwb3AuIFRoZSByZXN1bHQgb2YgdGhpcyBtZXRob2QgaXMgY2FjaGVkLCBzbyBhbGwgdGhlIGZ1cnRoZXJcbiAqIGNhbGxzIHJldHVybiB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgZmlyc3Qgb25lLlxuICovXG5tZXRob2RzLmdldEFwaUxldmVsID0gYXN5bmMgZnVuY3Rpb24gZ2V0QXBpTGV2ZWwgKCkge1xuICBpZiAoIV8uaXNJbnRlZ2VyKHRoaXMuX2FwaUxldmVsKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdHJPdXRwdXQgPSBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdyby5idWlsZC52ZXJzaW9uLnNkaycpO1xuICAgICAgbGV0IGFwaUxldmVsID0gcGFyc2VJbnQoc3RyT3V0cHV0LnRyaW0oKSwgMTApO1xuXG4gICAgICAvLyBXb3JrYXJvdW5kIGZvciBwcmV2aWV3L2JldGEgcGxhdGZvcm0gQVBJIGxldmVsXG4gICAgICBjb25zdCBjaGFyQ29kZVEgPSAncScuY2hhckNvZGVBdCgwKTtcbiAgICAgIC8vIDI4IGlzIHRoZSBmaXJzdCBBUEkgTGV2ZWwsIHdoZXJlIEFuZHJvaWQgU0RLIHN0YXJ0ZWQgcmV0dXJuaW5nIGxldHRlcnMgaW4gcmVzcG9uc2UgdG8gZ2V0UGxhdGZvcm1WZXJzaW9uXG4gICAgICBjb25zdCBhcGlMZXZlbERpZmYgPSBhcGlMZXZlbCAtIDI4O1xuICAgICAgY29uc3QgY29kZW5hbWUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2RlUSArIGFwaUxldmVsRGlmZik7XG4gICAgICBpZiAoYXBpTGV2ZWxEaWZmID49IDAgJiYgKGF3YWl0IHRoaXMuZ2V0UGxhdGZvcm1WZXJzaW9uKCkpLnRvTG93ZXJDYXNlKCkgPT09IGNvZGVuYW1lKSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhgUmVsZWFzZSB2ZXJzaW9uIGlzICR7Y29kZW5hbWUudG9VcHBlckNhc2UoKX0gYnV0IGZvdW5kIEFQSSBMZXZlbCAke2FwaUxldmVsfS4gU2V0dGluZyBBUEkgTGV2ZWwgdG8gJHthcGlMZXZlbCArIDF9YCk7XG4gICAgICAgIGFwaUxldmVsKys7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2FwaUxldmVsID0gYXBpTGV2ZWw7XG4gICAgICBsb2cuZGVidWcoYERldmljZSBBUEkgbGV2ZWw6ICR7dGhpcy5fYXBpTGV2ZWx9YCk7XG4gICAgICBpZiAoaXNOYU4odGhpcy5fYXBpTGV2ZWwpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGFjdHVhbCBvdXRwdXQgJyR7c3RyT3V0cHV0fScgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBhbiBpbnRlZ2VyYCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBnZXR0aW5nIGRldmljZSBBUEkgbGV2ZWwuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXMuX2FwaUxldmVsO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgcGxhdGZvcm0gdmVyc2lvbiBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgcGxhdGZvcm0gdmVyc2lvbiBhcyBhIHN0cmluZywgZm9yIGV4YW1wbGUgJzUuMCcgZm9yXG4gKiBBbmRyb2lkIExvbGxpcG9wLlxuICovXG5tZXRob2RzLmdldFBsYXRmb3JtVmVyc2lvbiA9IGFzeW5jIGZ1bmN0aW9uIGdldFBsYXRmb3JtVmVyc2lvbiAoKSB7XG4gIGxvZy5pbmZvKCdHZXR0aW5nIGRldmljZSBwbGF0Zm9ybSB2ZXJzaW9uJyk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3JvLmJ1aWxkLnZlcnNpb24ucmVsZWFzZScpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBnZXR0aW5nIGRldmljZSBwbGF0Zm9ybSB2ZXJzaW9uLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogVmVyaWZ5IHdoZXRoZXIgYSBkZXZpY2UgaXMgY29ubmVjdGVkLlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYXQgbGVhc3Qgb25lIGRldmljZSBpcyB2aXNpYmxlIHRvIGFkYi5cbiAqL1xubWV0aG9kcy5pc0RldmljZUNvbm5lY3RlZCA9IGFzeW5jIGZ1bmN0aW9uIGlzRGV2aWNlQ29ubmVjdGVkICgpIHtcbiAgbGV0IGRldmljZXMgPSBhd2FpdCB0aGlzLmdldENvbm5lY3RlZERldmljZXMoKTtcbiAgcmV0dXJuIGRldmljZXMubGVuZ3RoID4gMDtcbn07XG5cbi8qKlxuICogUmVjdXJzaXZlbHkgY3JlYXRlIGEgbmV3IGZvbGRlciBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggLSBUaGUgbmV3IHBhdGggdG8gYmUgY3JlYXRlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gbWtkaXIgY29tbWFuZCBvdXRwdXQuXG4gKi9cbm1ldGhvZHMubWtkaXIgPSBhc3luYyBmdW5jdGlvbiBta2RpciAocmVtb3RlUGF0aCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5zaGVsbChbJ21rZGlyJywgJy1wJywgcmVtb3RlUGF0aF0pO1xufTtcblxuLyoqXG4gKiBWZXJpZnkgd2hldGhlciB0aGUgZ2l2ZW4gYXJndW1lbnQgaXMgYVxuICogdmFsaWQgY2xhc3MgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NTdHJpbmcgLSBUaGUgYWN0dWFsIGNsYXNzIG5hbWUgdG8gYmUgdmVyaWZpZWQuXG4gKiBAcmV0dXJuIHs/QXJyYXkuPE1hdGNoPn0gVGhlIHJlc3VsdCBvZiBSZWdleHAuZXhlYyBvcGVyYXRpb25cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBvciBfbnVsbF8gaWYgbm8gbWF0Y2hlcyBhcmUgZm91bmQuXG4gKi9cbm1ldGhvZHMuaXNWYWxpZENsYXNzID0gZnVuY3Rpb24gaXNWYWxpZENsYXNzIChjbGFzc1N0cmluZykge1xuICAvLyBzb21lLnBhY2thZ2Uvc29tZS5wYWNrYWdlLkFjdGl2aXR5XG4gIHJldHVybiBtYXRjaENvbXBvbmVudE5hbWUoY2xhc3NTdHJpbmcpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBSZXNvbHZlQWN0aXZpdHlPcHRpb25zXG4gKiBAcHJvcGVydHkge2Jvb2xlYW4/fSBwcmVmZXJDbWQgW3RydWVdIFdoZXRoZXIgdG8gcHJlZmVyIGBjbWRgIHRvb2wgdXNhZ2UgZm9yXG4gKiBsYXVuY2hhYmxlIGFjdGl2aXR5IG5hbWUgZGV0ZWN0aW9uLiBJdCBtaWdodCBiZSB1c2VmdWwgdG8gZGlzYWJsZSBpdCBpZlxuICogYGNtZCBwYWNrYWdlIHJlc29sdmUtYWN0aXZpdHlgIHJldHVybnMgJ2FuZHJvaWQvY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLlJlc29sdmVyQWN0aXZpdHknLFxuICogd2hpY2ggbWVhbnMgdGhlIGFwcCBoYXMgbm8gZGVmYXVsdCBoYW5kbGVyIHNldCBpbiBzeXN0ZW0gc2V0dGluZ3MuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzE3MTI4IGZvciBtb3JlIGRldGFpbHMuXG4gKiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IGlmIHRoZSB0YXJnZXQgQW5kcm9pZCB2ZXJzaW9uIGlzIGJlbG93IDI0IGFzIHRoZXJlXG4gKiB0aGUgY29ycmVzcG9uZGluZyBgY21kYCBzdWJjb21tYW5kIGlzIG5vdCBpbXBsZW1lbnRlZCBhbmQgZHVtcHN5cyB1c2FnZSBpcyB0aGUgb25seVxuICogcG9zc2libGUgd2F5IHRvIGRldGVjdCB0aGUgbGF1bmNoYWJsZSBhY3Rpdml0eSBuYW1lLlxuICovXG5cbi8qKlxuICogRmV0Y2hlcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGxhdW5jaGFibGUgYWN0aXZpdHkgZm9yIHRoZVxuICogZ2l2ZW4gcGFja2FnZS4gSXQgaXMgZXhwZWN0ZWQgdGhlIHBhY2thZ2UgaXMgYWxyZWFkeSBpbnN0YWxsZWQgb25cbiAqIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHRhcmdldCBwYWNrYWdlIGlkZW50aWZpZXJcbiAqIEBwYXJhbSB7UmVzb2x2ZUFjdGl2aXR5T3B0aW9ucz99IG9wdHNcbiAqIEByZXR1cm4ge3N0cmluZ30gRnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGxhdW5jaGFibGUgYWN0aXZpdHlcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgcmVzb2x2aW5nIHRoZSBhY3Rpdml0eSBuYW1lXG4gKi9cbm1ldGhvZHMucmVzb2x2ZUxhdW5jaGFibGVBY3Rpdml0eSA9IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVMYXVuY2hhYmxlQWN0aXZpdHkgKHBrZywgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHsgcHJlZmVyQ21kID0gdHJ1ZSB9ID0gb3B0cztcbiAgaWYgKCFwcmVmZXJDbWQgfHwgYXdhaXQgdGhpcy5nZXRBcGlMZXZlbCgpIDwgMjQpIHtcbiAgICBjb25zdCBzdGRvdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICdwYWNrYWdlJywgcGtnXSk7XG4gICAgY29uc3QgbmFtZXMgPSBwYXJzZUxhdW5jaGFibGVBY3Rpdml0eU5hbWVzKHN0ZG91dCk7XG4gICAgaWYgKF8uaXNFbXB0eShuYW1lcykpIHtcbiAgICAgIGxvZy5kZWJ1ZyhzdGRvdXQpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcmVzb2x2ZSB0aGUgbGF1bmNoYWJsZSBhY3Rpdml0eSBvZiAnJHtwa2d9Jy4gSXMgaXQgaW5zdGFsbGVkIG9uIHRoZSBkZXZpY2U/YCk7XG4gICAgfVxuICAgIGlmIChuYW1lcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiBuYW1lc1swXTtcbiAgICB9XG5cbiAgICBjb25zdCB0bXBSb290ID0gYXdhaXQgdGVtcERpci5vcGVuRGlyKCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRtcEFwcCA9IGF3YWl0IHRoaXMucHVsbEFwayhwa2csIHRtcFJvb3QpO1xuICAgICAgY29uc3Qge2Fwa0FjdGl2aXR5fSA9IGF3YWl0IHRoaXMucGFja2FnZUFuZExhdW5jaEFjdGl2aXR5RnJvbU1hbmlmZXN0KHRtcEFwcCk7XG4gICAgICByZXR1cm4gYXBrQWN0aXZpdHk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nLmRlYnVnKGUuc3RhY2spO1xuICAgICAgbG9nLndhcm4oYFVuYWJsZSB0byByZXNvbHZlIHRoZSBsYXVuY2hhYmxlIGFjdGl2aXR5IG9mICcke3BrZ30nLiBgICtcbiAgICAgICAgYFRoZSB2ZXJ5IGZpcnN0IG1hdGNoIG9mIHRoZSBkdW1wc3lzIG91dHB1dCBpcyBnb2luZyB0byBiZSB1c2VkLiBgICtcbiAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICAgIHJldHVybiBuYW1lc1swXTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZnMucmltcmFmKHRtcFJvb3QpO1xuICAgIH1cbiAgfVxuICBjb25zdCB7c3Rkb3V0LCBzdGRlcnJ9ID0gYXdhaXQgdGhpcy5zaGVsbChbJ2NtZCcsICdwYWNrYWdlJywgJ3Jlc29sdmUtYWN0aXZpdHknLCAnLS1icmllZicsIHBrZ10sIHtcbiAgICBvdXRwdXRGb3JtYXQ6IHRoaXMuRVhFQ19PVVRQVVRfRk9STUFULkZVTExcbiAgfSk7XG4gIGZvciAoY29uc3QgbGluZSBvZiAoc3Rkb3V0IHx8ICcnKS5zcGxpdCgnXFxuJykubWFwKF8udHJpbSkpIHtcbiAgICBpZiAodGhpcy5pc1ZhbGlkQ2xhc3MobGluZSkpIHtcbiAgICAgIHJldHVybiBsaW5lO1xuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byByZXNvbHZlIHRoZSBsYXVuY2hhYmxlIGFjdGl2aXR5IG9mICcke3BrZ30nLiBPcmlnaW5hbCBlcnJvcjogJHtzdGRlcnIgfHwgc3Rkb3V0fWApO1xufTtcblxuLyoqXG4gKiBGb3JjZSBhcHBsaWNhdGlvbiB0byBzdG9wIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBzdG9wcGVkLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgb3V0cHV0IG9mIHRoZSBjb3JyZXNwb25kaW5nIGFkYiBjb21tYW5kLlxuICovXG5tZXRob2RzLmZvcmNlU3RvcCA9IGFzeW5jIGZ1bmN0aW9uIGZvcmNlU3RvcCAocGtnKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnNoZWxsKFsnYW0nLCAnZm9yY2Utc3RvcCcsIHBrZ10pO1xufTtcblxuLypcbiAqIEtpbGwgYXBwbGljYXRpb25cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBzdG9wcGVkLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgb3V0cHV0IG9mIHRoZSBjb3JyZXNwb25kaW5nIGFkYiBjb21tYW5kLlxuICovXG5tZXRob2RzLmtpbGxQYWNrYWdlID0gYXN5bmMgZnVuY3Rpb24ga2lsbFBhY2thZ2UgKHBrZykge1xuICByZXR1cm4gYXdhaXQgdGhpcy5zaGVsbChbJ2FtJywgJ2tpbGwnLCBwa2ddKTtcbn07XG5cbi8qKlxuICogQ2xlYXIgdGhlIHVzZXIgZGF0YSBvZiB0aGUgcGFydGljdWxhciBhcHBsaWNhdGlvbiBvbiB0aGUgZGV2aWNlXG4gKiB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIGNsZWFyZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBvdXRwdXQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYWRiIGNvbW1hbmQuXG4gKi9cbm1ldGhvZHMuY2xlYXIgPSBhc3luYyBmdW5jdGlvbiBjbGVhciAocGtnKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnNoZWxsKFsncG0nLCAnY2xlYXInLCBwa2ddKTtcbn07XG5cbi8qKlxuICogR3JhbnQgYWxsIHBlcm1pc3Npb25zIHJlcXVlc3RlZCBieSB0aGUgcGFydGljdWxhciBwYWNrYWdlLlxuICogVGhpcyBtZXRob2QgaXMgb25seSB1c2VmdWwgb24gQW5kcm9pZCA2LjArIGFuZCBmb3IgYXBwbGljYXRpb25zXG4gKiB0aGF0IHN1cHBvcnQgY29tcG9uZW50cy1iYXNlZCBwZXJtaXNzaW9ucyBzZXR0aW5nLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcGsgLSBUaGUgcGF0aCB0byB0aGUgYWN0dWFsIGFwayBmaWxlLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBncmFudGluZyBwZXJtaXNzaW9uc1xuICovXG5tZXRob2RzLmdyYW50QWxsUGVybWlzc2lvbnMgPSBhc3luYyBmdW5jdGlvbiBncmFudEFsbFBlcm1pc3Npb25zIChwa2csIGFwaykge1xuICBjb25zdCBhcGlMZXZlbCA9IGF3YWl0IHRoaXMuZ2V0QXBpTGV2ZWwoKTtcbiAgbGV0IHRhcmdldFNkayA9IDA7XG4gIGxldCBkdW1wc3lzT3V0cHV0ID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBpZiAoIWFwaykge1xuICAgICAgLyoqXG4gICAgICAgKiBJZiBhcGsgbm90IHByb3ZpZGVkLCBjb25zaWRlcmluZyBhcGsgYWxyZWFkeSBpbnN0YWxsZWQgb24gdGhlIGRldmljZVxuICAgICAgICogYW5kIGZldGNoaW5nIHRhcmdldFNkayB1c2luZyBwYWNrYWdlIG5hbWUuXG4gICAgICAgKi9cbiAgICAgIGR1bXBzeXNPdXRwdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICdwYWNrYWdlJywgcGtnXSk7XG4gICAgICB0YXJnZXRTZGsgPSBhd2FpdCB0aGlzLnRhcmdldFNka1ZlcnNpb25Vc2luZ1BLRyhwa2csIGR1bXBzeXNPdXRwdXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXRTZGsgPSBhd2FpdCB0aGlzLnRhcmdldFNka1ZlcnNpb25Gcm9tTWFuaWZlc3QoYXBrKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvL2F2b2lkaW5nIGxvZ2dpbmcgZXJyb3Igc3RhY2ssIGFzIGNhbGxpbmcgbGlicmFyeSBmdW5jdGlvbiB3b3VsZCBoYXZlIGxvZ2dlZFxuICAgIGxvZy53YXJuKGBSYW4gaW50byBwcm9ibGVtIGdldHRpbmcgdGFyZ2V0IFNESyB2ZXJzaW9uOyBpZ25vcmluZy4uLmApO1xuICB9XG4gIGlmIChhcGlMZXZlbCA+PSBNSU5fQVBJX0xFVkVMX1dJVEhfUEVSTVNfU1VQUE9SVCAmJiB0YXJnZXRTZGsgPj0gTUlOX0FQSV9MRVZFTF9XSVRIX1BFUk1TX1NVUFBPUlQpIHtcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgZGV2aWNlIGlzIHJ1bm5pbmcgQW5kcm9pZCA2LjAoQVBJIDIzKSBvciBoaWdoZXIsIGFuZCB5b3VyIGFwcCdzIHRhcmdldCBTREsgaXMgMjMgb3IgaGlnaGVyOlxuICAgICAqIFRoZSBhcHAgaGFzIHRvIGxpc3QgdGhlIHBlcm1pc3Npb25zIGluIHRoZSBtYW5pZmVzdC5cbiAgICAgKiByZWZlcjogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vdHJhaW5pbmcvcGVybWlzc2lvbnMvcmVxdWVzdGluZy5odG1sXG4gICAgICovXG4gICAgZHVtcHN5c091dHB1dCA9IGR1bXBzeXNPdXRwdXQgfHwgYXdhaXQgdGhpcy5zaGVsbChbJ2R1bXBzeXMnLCAncGFja2FnZScsIHBrZ10pO1xuICAgIGNvbnN0IHJlcXVlc3RlZFBlcm1pc3Npb25zID0gYXdhaXQgdGhpcy5nZXRSZXFQZXJtaXNzaW9ucyhwa2csIGR1bXBzeXNPdXRwdXQpO1xuICAgIGNvbnN0IGdyYW50ZWRQZXJtaXNzaW9ucyA9IGF3YWl0IHRoaXMuZ2V0R3JhbnRlZFBlcm1pc3Npb25zKHBrZywgZHVtcHN5c091dHB1dCk7XG4gICAgY29uc3QgcGVybWlzc2lvbnNUb0dyYW50ID0gXy5kaWZmZXJlbmNlKHJlcXVlc3RlZFBlcm1pc3Npb25zLCBncmFudGVkUGVybWlzc2lvbnMpO1xuICAgIGlmIChfLmlzRW1wdHkocGVybWlzc2lvbnNUb0dyYW50KSkge1xuICAgICAgbG9nLmluZm8oYCR7cGtnfSBjb250YWlucyBubyBwZXJtaXNzaW9ucyBhdmFpbGFibGUgZm9yIGdyYW50aW5nYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuZ3JhbnRQZXJtaXNzaW9ucyhwa2csIHBlcm1pc3Npb25zVG9HcmFudCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHRhcmdldFNkayA8IE1JTl9BUElfTEVWRUxfV0lUSF9QRVJNU19TVVBQT1JUKSB7XG4gICAgbG9nLmluZm8oYEl0IGlzIG9ubHkgcG9zc2libGUgdG8gZ3JhbnQgcGVybWlzc2lvbnMgaW4gcnVudGltZSBmb3IgYCArXG4gICAgICBgYXBwcyB3aG9zZSB0YXJnZXRTZGtWZXJzaW9uIGluIHRoZSBtYW5pZmVzdCBpcyBzZXQgdG8gJHtNSU5fQVBJX0xFVkVMX1dJVEhfUEVSTVNfU1VQUE9SVH0gb3IgYWJvdmUuIGAgK1xuICAgICAgYFRoZSBjdXJyZW50ICR7cGtnfSB0YXJnZXRTZGtWZXJzaW9uIGlzICR7dGFyZ2V0U2RrIHx8ICd1bnNldCd9LmApO1xuICB9IGVsc2UgaWYgKGFwaUxldmVsIDwgTUlOX0FQSV9MRVZFTF9XSVRIX1BFUk1TX1NVUFBPUlQpIHtcbiAgICBsb2cuaW5mbyhgVGhlIGRldmljZSdzIE9TIEFQSSBsZXZlbCBpcyAke2FwaUxldmVsfS4gYCArXG4gICAgICBgSXQgaXMgb25seSBwb3NzaWJsZSB0byBncmFudCBwZXJtaXNzaW9ucyBvbiBkZXZpY2VzIHJ1bm5pbmcgQW5kcm9pZCA2IG9yIGFib3ZlLmApO1xuICB9XG59O1xuXG4vKipcbiAqIEdyYW50IG11bHRpcGxlIHBlcm1pc3Npb25zIGZvciB0aGUgcGFydGljdWxhciBwYWNrYWdlLlxuICogVGhpcyBjYWxsIGlzIG1vcmUgcGVyZm9ybWFudCB0aGFuIGBncmFudFBlcm1pc3Npb25gIG9uZSwgc2luY2UgaXQgY29tYmluZXNcbiAqIG11bHRpcGxlIGBhZGIgc2hlbGxgIGNhbGxzIGludG8gYSBzaW5nbGUgY29tbWFuZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IHBlcm1pc3Npb25zIC0gVGhlIGxpc3Qgb2YgcGVybWlzc2lvbnMgdG8gYmUgZ3JhbnRlZC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgY2hhbmdpbmcgcGVybWlzc2lvbnMuXG4gKi9cbm1ldGhvZHMuZ3JhbnRQZXJtaXNzaW9ucyA9IGFzeW5jIGZ1bmN0aW9uIGdyYW50UGVybWlzc2lvbnMgKHBrZywgcGVybWlzc2lvbnMpIHtcbiAgLy8gQXMgaXQgY29uc3VtZXMgbW9yZSB0aW1lIGZvciBncmFudGluZyBlYWNoIHBlcm1pc3Npb24sXG4gIC8vIHRyeWluZyB0byBncmFudCBhbGwgcGVybWlzc2lvbiBieSBmb3JtaW5nIGVxdWl2YWxlbnQgY29tbWFuZC5cbiAgLy8gQWxzbywgaXQgaXMgbmVjZXNzYXJ5IHRvIHNwbGl0IGxvbmcgY29tbWFuZHMgaW50byBjaHVua3MsIHNpbmNlIHRoZSBtYXhpbXVtIGxlbmd0aCBvZlxuICAvLyBhZGIgc2hlbGwgYnVmZmVyIGlzIGxpbWl0ZWRcbiAgbG9nLmRlYnVnKGBHcmFudGluZyBwZXJtaXNzaW9ucyAke0pTT04uc3RyaW5naWZ5KHBlcm1pc3Npb25zKX0gdG8gJyR7cGtnfSdgKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLnNoZWxsQ2h1bmtzKChwZXJtKSA9PiBbJ3BtJywgJ2dyYW50JywgcGtnLCBwZXJtXSwgcGVybWlzc2lvbnMpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCFJR05PUkVEX1BFUk1fRVJST1JTLnNvbWUoKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChlLnN0ZGVyciB8fCBlLm1lc3NhZ2UpKSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogR3JhbnQgc2luZ2xlIHBlcm1pc3Npb24gZm9yIHRoZSBwYXJ0aWN1bGFyIHBhY2thZ2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtzdHJpbmd9IHBlcm1pc3Npb24gLSBUaGUgZnVsbCBuYW1lIG9mIHRoZSBwZXJtaXNzaW9uIHRvIGJlIGdyYW50ZWQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGNoYW5naW5nIHBlcm1pc3Npb25zLlxuICovXG5tZXRob2RzLmdyYW50UGVybWlzc2lvbiA9IGFzeW5jIGZ1bmN0aW9uIGdyYW50UGVybWlzc2lvbiAocGtnLCBwZXJtaXNzaW9uKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5zaGVsbChbJ3BtJywgJ2dyYW50JywgcGtnLCBwZXJtaXNzaW9uXSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoIU5PVF9DSEFOR0VBQkxFX1BFUk1fRVJST1IudGVzdChlLnN0ZGVyciB8fCBlLm1lc3NhZ2UpKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBSZXZva2Ugc2luZ2xlIHBlcm1pc3Npb24gZnJvbSB0aGUgcGFydGljdWxhciBwYWNrYWdlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwZXJtaXNzaW9uIC0gVGhlIGZ1bGwgbmFtZSBvZiB0aGUgcGVybWlzc2lvbiB0byBiZSByZXZva2VkLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBjaGFuZ2luZyBwZXJtaXNzaW9ucy5cbiAqL1xubWV0aG9kcy5yZXZva2VQZXJtaXNzaW9uID0gYXN5bmMgZnVuY3Rpb24gcmV2b2tlUGVybWlzc2lvbiAocGtnLCBwZXJtaXNzaW9uKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5zaGVsbChbJ3BtJywgJ3Jldm9rZScsIHBrZywgcGVybWlzc2lvbl0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCFOT1RfQ0hBTkdFQUJMRV9QRVJNX0VSUk9SLnRlc3QoZS5zdGRlcnIgfHwgZS5tZXNzYWdlKSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGxpc3Qgb2YgZ3JhbnRlZCBwZXJtaXNzaW9ucyBmb3IgdGhlIHBhcnRpY3VsYXIgcGFja2FnZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gY21kT3V0cHV0IFtudWxsXSAtIE9wdGlvbmFsIHBhcmFtZXRlciBjb250YWluaW5nIGNvbW1hbmQgb3V0cHV0IG9mXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kdW1wc3lzIHBhY2thZ2VfIGNvbW1hbmQuIEl0IG1heSBzcGVlZCB1cCB0aGUgbWV0aG9kIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm4ge0FycmF5PFN0cmluZz59IFRoZSBsaXN0IG9mIGdyYW50ZWQgcGVybWlzc2lvbnMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgY2hhbmdpbmcgcGVybWlzc2lvbnMuXG4gKi9cbm1ldGhvZHMuZ2V0R3JhbnRlZFBlcm1pc3Npb25zID0gYXN5bmMgZnVuY3Rpb24gZ2V0R3JhbnRlZFBlcm1pc3Npb25zIChwa2csIGNtZE91dHB1dCA9IG51bGwpIHtcbiAgbG9nLmRlYnVnKCdSZXRyaWV2aW5nIGdyYW50ZWQgcGVybWlzc2lvbnMnKTtcbiAgY29uc3Qgc3Rkb3V0ID0gY21kT3V0cHV0IHx8IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ3BhY2thZ2UnLCBwa2ddKTtcbiAgcmV0dXJuIGV4dHJhY3RNYXRjaGluZ1Blcm1pc3Npb25zKHN0ZG91dCwgWydpbnN0YWxsJywgJ3J1bnRpbWUnXSwgdHJ1ZSk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIGRlbmllZCBwZXJtaXNzaW9ucyBmb3IgdGhlIHBhcnRpY3VsYXIgcGFja2FnZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gY21kT3V0cHV0IFtudWxsXSAtIE9wdGlvbmFsIHBhcmFtZXRlciBjb250YWluaW5nIGNvbW1hbmQgb3V0cHV0IG9mXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kdW1wc3lzIHBhY2thZ2VfIGNvbW1hbmQuIEl0IG1heSBzcGVlZCB1cCB0aGUgbWV0aG9kIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm4ge0FycmF5PFN0cmluZz59IFRoZSBsaXN0IG9mIGRlbmllZCBwZXJtaXNzaW9ucyBvciBhbiBlbXB0eSBsaXN0LlxuICovXG5tZXRob2RzLmdldERlbmllZFBlcm1pc3Npb25zID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGVuaWVkUGVybWlzc2lvbnMgKHBrZywgY21kT3V0cHV0ID0gbnVsbCkge1xuICBsb2cuZGVidWcoJ1JldHJpZXZpbmcgZGVuaWVkIHBlcm1pc3Npb25zJyk7XG4gIGNvbnN0IHN0ZG91dCA9IGNtZE91dHB1dCB8fCBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICdwYWNrYWdlJywgcGtnXSk7XG4gIHJldHVybiBleHRyYWN0TWF0Y2hpbmdQZXJtaXNzaW9ucyhzdGRvdXQsIFsnaW5zdGFsbCcsICdydW50aW1lJ10sIGZhbHNlKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGxpc3Qgb2YgcmVxdWVzdGVkIHBlcm1pc3Npb25zIGZvciB0aGUgcGFydGljdWxhciBwYWNrYWdlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjbWRPdXRwdXQgW251bGxdIC0gT3B0aW9uYWwgcGFyYW1ldGVyIGNvbnRhaW5pbmcgY29tbWFuZCBvdXRwdXQgb2ZcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2R1bXBzeXMgcGFja2FnZV8gY29tbWFuZC4gSXQgbWF5IHNwZWVkIHVwIHRoZSBtZXRob2QgZXhlY3V0aW9uLlxuICogQHJldHVybiB7QXJyYXk8U3RyaW5nPn0gVGhlIGxpc3Qgb2YgcmVxdWVzdGVkIHBlcm1pc3Npb25zIG9yIGFuIGVtcHR5IGxpc3QuXG4gKi9cbm1ldGhvZHMuZ2V0UmVxUGVybWlzc2lvbnMgPSBhc3luYyBmdW5jdGlvbiBnZXRSZXFQZXJtaXNzaW9ucyAocGtnLCBjbWRPdXRwdXQgPSBudWxsKSB7XG4gIGxvZy5kZWJ1ZygnUmV0cmlldmluZyByZXF1ZXN0ZWQgcGVybWlzc2lvbnMnKTtcbiAgY29uc3Qgc3Rkb3V0ID0gY21kT3V0cHV0IHx8IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ3BhY2thZ2UnLCBwa2ddKTtcbiAgcmV0dXJuIGV4dHJhY3RNYXRjaGluZ1Blcm1pc3Npb25zKHN0ZG91dCwgWydyZXF1ZXN0ZWQnXSk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIGxvY2F0aW9uIHByb3ZpZGVycyBmb3IgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge0FycmF5LjxTdHJpbmc+fSBUaGUgbGlzdCBvZiBhdmFpbGFibGUgbG9jYXRpb24gcHJvdmlkZXJzIG9yIGFuIGVtcHR5IGxpc3QuXG4gKi9cbm1ldGhvZHMuZ2V0TG9jYXRpb25Qcm92aWRlcnMgPSBhc3luYyBmdW5jdGlvbiBnZXRMb2NhdGlvblByb3ZpZGVycyAoKSB7XG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLmdldFNldHRpbmcoJ3NlY3VyZScsICdsb2NhdGlvbl9wcm92aWRlcnNfYWxsb3dlZCcpO1xuICByZXR1cm4gc3Rkb3V0LnRyaW0oKS5zcGxpdCgnLCcpXG4gICAgLm1hcCgocCkgPT4gcC50cmltKCkpXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbn07XG5cbi8qKlxuICogVG9nZ2xlIHRoZSBzdGF0ZSBvZiBHUFMgbG9jYXRpb24gcHJvdmlkZXIuXG4gKlxuICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkIC0gV2hldGhlciB0byBlbmFibGUgKHRydWUpIG9yIGRpc2FibGUgKGZhbHNlKSB0aGUgR1BTIHByb3ZpZGVyLlxuICovXG5tZXRob2RzLnRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIgPSBhc3luYyBmdW5jdGlvbiB0b2dnbGVHUFNMb2NhdGlvblByb3ZpZGVyIChlbmFibGVkKSB7XG4gIGF3YWl0IHRoaXMuc2V0U2V0dGluZygnc2VjdXJlJywgJ2xvY2F0aW9uX3Byb3ZpZGVyc19hbGxvd2VkJywgYCR7ZW5hYmxlZCA/ICcrJyA6ICctJ31ncHNgKTtcbn07XG5cbi8qKlxuICogU2V0IGhpZGRlbiBhcGkgcG9saWN5IHRvIG1hbmFnZSBhY2Nlc3MgdG8gbm9uLVNESyBBUElzLlxuICogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcHJldmlldy9yZXN0cmljdGlvbnMtbm9uLXNkay1pbnRlcmZhY2VzXG4gKlxuICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSB2YWx1ZSAtIFRoZSBBUEkgZW5mb3JjZW1lbnQgcG9saWN5LlxuICogICAgIEZvciBBbmRyb2lkIFBcbiAqICAgICAwOiBEaXNhYmxlIG5vbi1TREsgQVBJIHVzYWdlIGRldGVjdGlvbi4gVGhpcyB3aWxsIGFsc28gZGlzYWJsZSBsb2dnaW5nLCBhbmQgYWxzbyBicmVhayB0aGUgc3RyaWN0IG1vZGUgQVBJLFxuICogICAgICAgIGRldGVjdE5vblNka0FwaVVzYWdlKCkuIE5vdCByZWNvbW1lbmRlZC5cbiAqICAgICAxOiBcIkp1c3Qgd2FyblwiIC0gcGVybWl0IGFjY2VzcyB0byBhbGwgbm9uLVNESyBBUElzLCBidXQga2VlcCB3YXJuaW5ncyBpbiB0aGUgbG9nLlxuICogICAgICAgIFRoZSBzdHJpY3QgbW9kZSBBUEkgd2lsbCBrZWVwIHdvcmtpbmcuXG4gKiAgICAgMjogRGlzYWxsb3cgdXNhZ2Ugb2YgZGFyayBncmV5IGFuZCBibGFjayBsaXN0ZWQgQVBJcy5cbiAqICAgICAzOiBEaXNhbGxvdyB1c2FnZSBvZiBibGFja2xpc3RlZCBBUElzLCBidXQgYWxsb3cgdXNhZ2Ugb2YgZGFyayBncmV5IGxpc3RlZCBBUElzLlxuICpcbiAqICAgICBGb3IgQW5kcm9pZCBRXG4gKiAgICAgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcHJldmlldy9ub24tc2RrLXEjZW5hYmxlLW5vbi1zZGstYWNjZXNzXG4gKiAgICAgMDogRGlzYWJsZSBhbGwgZGV0ZWN0aW9uIG9mIG5vbi1TREsgaW50ZXJmYWNlcy4gVXNpbmcgdGhpcyBzZXR0aW5nIGRpc2FibGVzIGFsbCBsb2cgbWVzc2FnZXMgZm9yIG5vbi1TREsgaW50ZXJmYWNlIHVzYWdlXG4gKiAgICAgICAgYW5kIHByZXZlbnRzIHlvdSBmcm9tIHRlc3RpbmcgeW91ciBhcHAgdXNpbmcgdGhlIFN0cmljdE1vZGUgQVBJLiBUaGlzIHNldHRpbmcgaXMgbm90IHJlY29tbWVuZGVkLlxuICogICAgIDE6IEVuYWJsZSBhY2Nlc3MgdG8gYWxsIG5vbi1TREsgaW50ZXJmYWNlcywgYnV0IHByaW50IGxvZyBtZXNzYWdlcyB3aXRoIHdhcm5pbmdzIGZvciBhbnkgbm9uLVNESyBpbnRlcmZhY2UgdXNhZ2UuXG4gKiAgICAgICAgVXNpbmcgdGhpcyBzZXR0aW5nIGFsc28gYWxsb3dzIHlvdSB0byB0ZXN0IHlvdXIgYXBwIHVzaW5nIHRoZSBTdHJpY3RNb2RlIEFQSS5cbiAqICAgICAyOiBEaXNhbGxvdyB1c2FnZSBvZiBub24tU0RLIGludGVyZmFjZXMgdGhhdCBiZWxvbmcgdG8gZWl0aGVyIHRoZSBibGFjayBsaXN0XG4gKiAgICAgICAgb3IgdG8gYSByZXN0cmljdGVkIGdyZXlsaXN0IGZvciB5b3VyIHRhcmdldCBBUEkgbGV2ZWwuXG4gKlxuICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVFcnJvciBbZmFsc2VdIFdoZXRoZXIgdG8gaWdub3JlIGFuIGV4Y2VwdGlvbiBpbiAnYWRiIHNoZWxsIHNldHRpbmdzIHB1dCBnbG9iYWwnIGNvbW1hbmRcbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgYW5kIGlnbm9yZUVycm9yIHdhcyB0cnVlIHdoaWxlIGV4ZWN1dGluZyAnYWRiIHNoZWxsIHNldHRpbmdzIHB1dCBnbG9iYWwnXG4gKiAgICAgICAgICAgICAgICAgY29tbWFuZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuc2V0SGlkZGVuQXBpUG9saWN5ID0gYXN5bmMgZnVuY3Rpb24gc2V0SGlkZGVuQXBpUG9saWN5ICh2YWx1ZSwgaWdub3JlRXJyb3IgPSBmYWxzZSkge1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuc2hlbGwoSElEREVOX0FQSV9QT0xJQ1lfS0VZUy5tYXAoKGspID0+IGBzZXR0aW5ncyBwdXQgZ2xvYmFsICR7a30gJHt2YWx1ZX1gKS5qb2luKCc7JykpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCFpZ25vcmVFcnJvcikge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgbG9nLmluZm8oYEZhaWxlZCB0byBzZXQgc2V0dGluZyBrZXlzICcke0hJRERFTl9BUElfUE9MSUNZX0tFWVN9JyB0byAnJHt2YWx1ZX0nLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogUmVzZXQgYWNjZXNzIHRvIG5vbi1TREsgQVBJcyB0byBpdHMgZGVmYXVsdCBzZXR0aW5nLlxuICogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcHJldmlldy9yZXN0cmljdGlvbnMtbm9uLXNkay1pbnRlcmZhY2VzXG4gKlxuICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVFcnJvciBbZmFsc2VdIFdoZXRoZXIgdG8gaWdub3JlIGFuIGV4Y2VwdGlvbiBpbiAnYWRiIHNoZWxsIHNldHRpbmdzIGRlbGV0ZSBnbG9iYWwnIGNvbW1hbmRcbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgYW5kIGlnbm9yZUVycm9yIHdhcyB0cnVlIHdoaWxlIGV4ZWN1dGluZyAnYWRiIHNoZWxsIHNldHRpbmdzIGRlbGV0ZSBnbG9iYWwnXG4gKiAgICAgICAgICAgICAgICAgY29tbWFuZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuc2V0RGVmYXVsdEhpZGRlbkFwaVBvbGljeSA9IGFzeW5jIGZ1bmN0aW9uIHNldERlZmF1bHRIaWRkZW5BcGlQb2xpY3kgKGlnbm9yZUVycm9yID0gZmFsc2UpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLnNoZWxsKEhJRERFTl9BUElfUE9MSUNZX0tFWVMubWFwKChrKSA9PiBgc2V0dGluZ3MgZGVsZXRlIGdsb2JhbCAke2t9YCkuam9pbignOycpKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghaWdub3JlRXJyb3IpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIGxvZy5pbmZvKGBGYWlsZWQgdG8gZGVsZXRlIGtleXMgJyR7SElEREVOX0FQSV9QT0xJQ1lfS0VZU30nLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogU3RvcCB0aGUgcGFydGljdWxhciBwYWNrYWdlIGlmIGl0IGlzIHJ1bm5pbmcgYW5kIGNsZWFycyBpdHMgYXBwbGljYXRpb24gZGF0YS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBwcm9jZXNzZWQuXG4gKi9cbm1ldGhvZHMuc3RvcEFuZENsZWFyID0gYXN5bmMgZnVuY3Rpb24gc3RvcEFuZENsZWFyIChwa2cpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLmZvcmNlU3RvcChwa2cpO1xuICAgIGF3YWl0IHRoaXMuY2xlYXIocGtnKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHN0b3AgYW5kIGNsZWFyICR7cGtnfS4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBpbnB1dCBtZXRob2RzIChJTUVzKSBmb3IgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge0FycmF5LjxTdHJpbmc+fSBUaGUgbGlzdCBvZiBJTUUgbmFtZXMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqL1xubWV0aG9kcy5hdmFpbGFibGVJTUVzID0gYXN5bmMgZnVuY3Rpb24gYXZhaWxhYmxlSU1FcyAoKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGdldElNRUxpc3RGcm9tT3V0cHV0KGF3YWl0IHRoaXMuc2hlbGwoWydpbWUnLCAnbGlzdCcsICctYSddKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGdldHRpbmcgYXZhaWxhYmxlIElNRSdzLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGxpc3Qgb2YgZW5hYmxlZCBpbnB1dCBtZXRob2RzIChJTUVzKSBmb3IgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge0FycmF5LjxTdHJpbmc+fSBUaGUgbGlzdCBvZiBlbmFibGVkIElNRSBuYW1lcyBvciBhbiBlbXB0eSBsaXN0LlxuICovXG5tZXRob2RzLmVuYWJsZWRJTUVzID0gYXN5bmMgZnVuY3Rpb24gZW5hYmxlZElNRXMgKCkge1xuICB0cnkge1xuICAgIHJldHVybiBnZXRJTUVMaXN0RnJvbU91dHB1dChhd2FpdCB0aGlzLnNoZWxsKFsnaW1lJywgJ2xpc3QnXSkpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBnZXR0aW5nIGVuYWJsZWQgSU1FJ3MuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBFbmFibGUgdGhlIHBhcnRpY3VsYXIgaW5wdXQgbWV0aG9kIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW1lSWQgLSBPbmUgb2YgZXhpc3RpbmcgSU1FIGlkcy5cbiAqL1xubWV0aG9kcy5lbmFibGVJTUUgPSBhc3luYyBmdW5jdGlvbiBlbmFibGVJTUUgKGltZUlkKSB7XG4gIGF3YWl0IHRoaXMuc2hlbGwoWydpbWUnLCAnZW5hYmxlJywgaW1lSWRdKTtcbn07XG5cbi8qKlxuICogRGlzYWJsZSB0aGUgcGFydGljdWxhciBpbnB1dCBtZXRob2Qgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbWVJZCAtIE9uZSBvZiBleGlzdGluZyBJTUUgaWRzLlxuICovXG5tZXRob2RzLmRpc2FibGVJTUUgPSBhc3luYyBmdW5jdGlvbiBkaXNhYmxlSU1FIChpbWVJZCkge1xuICBhd2FpdCB0aGlzLnNoZWxsKFsnaW1lJywgJ2Rpc2FibGUnLCBpbWVJZF0pO1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIHBhcnRpY3VsYXIgaW5wdXQgbWV0aG9kIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW1lSWQgLSBPbmUgb2YgZXhpc3RpbmcgSU1FIGlkcy5cbiAqL1xubWV0aG9kcy5zZXRJTUUgPSBhc3luYyBmdW5jdGlvbiBzZXRJTUUgKGltZUlkKSB7XG4gIGF3YWl0IHRoaXMuc2hlbGwoWydpbWUnLCAnc2V0JywgaW1lSWRdKTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBkZWZhdWx0IGlucHV0IG1ldGhvZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7P3N0cmluZ30gVGhlIG5hbWUgb2YgdGhlIGRlZmF1bHQgaW5wdXQgbWV0aG9kXG4gKi9cbm1ldGhvZHMuZGVmYXVsdElNRSA9IGFzeW5jIGZ1bmN0aW9uIGRlZmF1bHRJTUUgKCkge1xuICB0cnkge1xuICAgIGxldCBlbmdpbmUgPSBhd2FpdCB0aGlzLmdldFNldHRpbmcoJ3NlY3VyZScsICdkZWZhdWx0X2lucHV0X21ldGhvZCcpO1xuICAgIGlmIChlbmdpbmUgPT09ICdudWxsJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBlbmdpbmUudHJpbSgpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBnZXR0aW5nIGRlZmF1bHQgSU1FLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogU2VuZCB0aGUgcGFydGljdWxhciBrZXljb2RlIHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGtleWNvZGUgLSBUaGUgYWN0dWFsIGtleSBjb2RlIHRvIGJlIHNlbnQuXG4gKi9cbm1ldGhvZHMua2V5ZXZlbnQgPSBhc3luYyBmdW5jdGlvbiBrZXlldmVudCAoa2V5Y29kZSkge1xuICAvLyBrZXljb2RlIG11c3QgYmUgYW4gaW50LlxuICBsZXQgY29kZSA9IHBhcnNlSW50KGtleWNvZGUsIDEwKTtcbiAgYXdhaXQgdGhpcy5zaGVsbChbJ2lucHV0JywgJ2tleWV2ZW50JywgY29kZV0pO1xufTtcblxuLyoqXG4gKiBTZW5kIHRoZSBwYXJ0aWN1bGFyIHRleHQgb3IgYSBudW1iZXIgdG8gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogVGhlIHRleHQgZ2V0cyBwcm9wZXJseSBlc2NhcGVkIGJlZm9yZSBiZWluZyBwYXNzZWQgdG8gQURCLlxuICogTm9vcCBpZiB0aGUgdGV4dCBpcyBlbXB0eS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHRleHQgLSBUaGUgYWN0dWFsIHRleHQgdG8gYmUgc2VudC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBpdCBpcyBpbXBvc3NpYmxlIHRvIGVzY2FwZSB0aGUgZ2l2ZW4gc3RyaW5nXG4gKi9cbm1ldGhvZHMuaW5wdXRUZXh0ID0gYXN5bmMgZnVuY3Rpb24gaW5wdXRUZXh0ICh0ZXh0KSB7XG4gIGlmICh0ZXh0ID09PSAnJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG9yaWdpbmFsU3RyID0gYCR7dGV4dH1gO1xuICBjb25zdCBlc2NhcGVkVGV4dCA9IG9yaWdpbmFsU3RyLnJlcGxhY2UoL1xcJC9nLCAnXFxcXCQnKS5yZXBsYWNlKC8gL2csICclcycpO1xuICBsZXQgYXJncyA9IFsnaW5wdXQnLCAndGV4dCcsIG9yaWdpbmFsU3RyXTtcbiAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjU3OTE0MjMvYWRiLXNoZWxsLWlucHV0LXRleHQtZG9lcy1ub3QtdGFrZS1hbXBlcnNhbmQtY2hhcmFjdGVyLzI1NzkxNDk4XG4gIGNvbnN0IGFkYklucHV0RXNjYXBlUGF0dGVybiA9IC9bKCk8Pnw7JipcXFxcfl5cIiddL2c7XG4gIGlmIChlc2NhcGVkVGV4dCAhPT0gb3JpZ2luYWxTdHIgfHwgYWRiSW5wdXRFc2NhcGVQYXR0ZXJuLnRlc3Qob3JpZ2luYWxTdHIpKSB7XG4gICAgaWYgKF8uZXZlcnkoWydcIicsIGAnYF0sIChjKSA9PiBvcmlnaW5hbFN0ci5pbmNsdWRlcyhjKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYERpZCBub3Qga25vdyBob3cgdG8gZXNjYXBlIGEgc3RyaW5nIHRoYXQgY29udGFpbnMgYm90aCB0eXBlcyBvZiBxdW90ZXMgKFwiIGFuZCAnKWBcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHEgPSBvcmlnaW5hbFN0ci5pbmNsdWRlcygnXCInKSA/IGAnYCA6ICdcIic7XG4gICAgYXJncyA9IFtgaW5wdXQgdGV4dCAke3F9JHtlc2NhcGVkVGV4dH0ke3F9YF07XG4gIH1cbiAgYXdhaXQgdGhpcy5zaGVsbChhcmdzKTtcbn07XG5cbi8qKlxuICogQ2xlYXIgdGhlIGFjdGl2ZSB0ZXh0IGZpZWxkIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdCBieSBzZW5kaW5nXG4gKiBzcGVjaWFsIGtleWV2ZW50cyB0byBpdC5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIFsxMDBdIC0gVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSB0ZXh0IGluIHRoZSBmaWVsZCB0byBiZSBjbGVhcmVkLlxuICovXG5tZXRob2RzLmNsZWFyVGV4dEZpZWxkID0gYXN5bmMgZnVuY3Rpb24gY2xlYXJUZXh0RmllbGQgKGxlbmd0aCA9IDEwMCkge1xuICAvLyBhc3N1bWVzIHRoYXQgdGhlIEVkaXRUZXh0IGZpZWxkIGFscmVhZHkgaGFzIGZvY3VzXG4gIGxvZy5kZWJ1ZyhgQ2xlYXJpbmcgdXAgdG8gJHtsZW5ndGh9IGNoYXJhY3RlcnNgKTtcbiAgaWYgKGxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICBsZXQgYXJncyA9IFsnaW5wdXQnLCAna2V5ZXZlbnQnXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIC8vIHdlIGNhbm5vdCBrbm93IHdoZXJlIHRoZSBjdXJzb3IgaXMgaW4gdGhlIHRleHQgZmllbGQsIHNvIGRlbGV0ZSBib3RoIGJlZm9yZVxuICAgIC8vIGFuZCBhZnRlciBzbyB0aGF0IHdlIGdldCByaWQgb2YgZXZlcnl0aGluZ1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL3ZpZXcvS2V5RXZlbnQuaHRtbCNLRVlDT0RFX0RFTFxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL3ZpZXcvS2V5RXZlbnQuaHRtbCNLRVlDT0RFX0ZPUldBUkRfREVMXG4gICAgYXJncy5wdXNoKCc2NycsICcxMTInKTtcbiAgfVxuICBhd2FpdCB0aGlzLnNoZWxsKGFyZ3MpO1xufTtcblxuLyoqXG4gKiBTZW5kIHRoZSBzcGVjaWFsIGtleWNvZGUgdG8gdGhlIGRldmljZSB1bmRlciB0ZXN0IGluIG9yZGVyIHRvIGxvY2sgaXQuXG4gKi9cbm1ldGhvZHMubG9jayA9IGFzeW5jIGZ1bmN0aW9uIGxvY2sgKCkge1xuICBpZiAoYXdhaXQgdGhpcy5pc1NjcmVlbkxvY2tlZCgpKSB7XG4gICAgbG9nLmRlYnVnKCdTY3JlZW4gaXMgYWxyZWFkeSBsb2NrZWQuIERvaW5nIG5vdGhpbmcuJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxvZy5kZWJ1ZygnUHJlc3NpbmcgdGhlIEtFWUNPREVfUE9XRVIgYnV0dG9uIHRvIGxvY2sgc2NyZWVuJyk7XG4gIGF3YWl0IHRoaXMua2V5ZXZlbnQoMjYpO1xuXG4gIGNvbnN0IHRpbWVvdXRNcyA9IDUwMDA7XG4gIHRyeSB7XG4gICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmlzU2NyZWVuTG9ja2VkKCksIHtcbiAgICAgIHdhaXRNczogdGltZW91dE1zLFxuICAgICAgaW50ZXJ2YWxNczogNTAwLFxuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgZGV2aWNlIHNjcmVlbiBpcyBzdGlsbCBsb2NrZWQgYWZ0ZXIgJHt0aW1lb3V0TXN9bXMgdGltZW91dGApO1xuICB9XG59O1xuXG4vKipcbiAqIFNlbmQgdGhlIHNwZWNpYWwga2V5Y29kZSB0byB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgaW4gb3JkZXIgdG8gZW11bGF0ZVxuICogQmFjayBidXR0b24gdGFwLlxuICovXG5tZXRob2RzLmJhY2sgPSBhc3luYyBmdW5jdGlvbiBiYWNrICgpIHtcbiAgbG9nLmRlYnVnKCdQcmVzc2luZyB0aGUgQkFDSyBidXR0b24nKTtcbiAgYXdhaXQgdGhpcy5rZXlldmVudCg0KTtcbn07XG5cbi8qKlxuICogU2VuZCB0aGUgc3BlY2lhbCBrZXljb2RlIHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdCBpbiBvcmRlciB0byBlbXVsYXRlXG4gKiBIb21lIGJ1dHRvbiB0YXAuXG4gKi9cbm1ldGhvZHMuZ29Ub0hvbWUgPSBhc3luYyBmdW5jdGlvbiBnb1RvSG9tZSAoKSB7XG4gIGxvZy5kZWJ1ZygnUHJlc3NpbmcgdGhlIEhPTUUgYnV0dG9uJyk7XG4gIGF3YWl0IHRoaXMua2V5ZXZlbnQoMyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gdGhlIGFjdHVhbCBwYXRoIHRvIGFkYiBleGVjdXRhYmxlLlxuICovXG5tZXRob2RzLmdldEFkYlBhdGggPSBmdW5jdGlvbiBnZXRBZGJQYXRoICgpIHtcbiAgcmV0dXJuIHRoaXMuZXhlY3V0YWJsZS5wYXRoO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSBjdXJyZW50IHNjcmVlbiBvcmllbnRhdGlvbiBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgY3VycmVudCBvcmllbnRhdGlvbiBlbmNvZGVkIGFzIGFuIGludGVnZXIgbnVtYmVyLlxuICovXG5tZXRob2RzLmdldFNjcmVlbk9yaWVudGF0aW9uID0gYXN5bmMgZnVuY3Rpb24gZ2V0U2NyZWVuT3JpZW50YXRpb24gKCkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5zaGVsbChbJ2R1bXBzeXMnLCAnaW5wdXQnXSk7XG4gIHJldHVybiBnZXRTdXJmYWNlT3JpZW50YXRpb24oc3Rkb3V0KTtcbn07XG5cbi8qKlxuICogU2VuZCBhbiBhcmJpdHJhcnkgVGVsbmV0IGNvbW1hbmQgdG8gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgdG8gYmUgc2VudC5cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBhY3R1YWwgb3V0cHV0IG9mIHRoZSBnaXZlbiBjb21tYW5kLlxuICovXG5tZXRob2RzLnNlbmRUZWxuZXRDb21tYW5kID0gYXN5bmMgZnVuY3Rpb24gc2VuZFRlbG5ldENvbW1hbmQgKGNvbW1hbmQpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY0VtdUNvbnNvbGVDb21tYW5kKGNvbW1hbmQsIHtwb3J0OiBhd2FpdCB0aGlzLmdldEVtdWxhdG9yUG9ydCgpfSk7XG59O1xuXG4vKipcbiAqIENoZWNrIHRoZSBzdGF0ZSBvZiBBaXJwbGFuZSBtb2RlIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIEFpcnBsYW5lIG1vZGUgaXMgZW5hYmxlZC5cbiAqL1xubWV0aG9kcy5pc0FpcnBsYW5lTW9kZU9uID0gYXN5bmMgZnVuY3Rpb24gaXNBaXJwbGFuZU1vZGVPbiAoKSB7XG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLmdldFNldHRpbmcoJ2dsb2JhbCcsICdhaXJwbGFuZV9tb2RlX29uJyk7XG4gIHJldHVybiBwYXJzZUludChzdGRvdXQsIDEwKSAhPT0gMDtcbn07XG5cbi8qKlxuICogQ2hhbmdlIHRoZSBzdGF0ZSBvZiBBaXJwbGFuZSBtb2RlIGluIFNldHRpbmdzIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9uIC0gVHJ1ZSB0byBlbmFibGUgdGhlIEFpcnBsYW5lIG1vZGUgaW4gU2V0dGluZ3MgYW5kIGZhbHNlIHRvIGRpc2FibGUgaXQuXG4gKi9cbm1ldGhvZHMuc2V0QWlycGxhbmVNb2RlID0gYXN5bmMgZnVuY3Rpb24gc2V0QWlycGxhbmVNb2RlIChvbikge1xuICBhd2FpdCB0aGlzLnNldFNldHRpbmcoJ2dsb2JhbCcsICdhaXJwbGFuZV9tb2RlX29uJywgb24gPyAxIDogMCk7XG59O1xuXG4vKipcbiAqIEJyb2FkY2FzdCB0aGUgc3RhdGUgb2YgQWlycGxhbmUgbW9kZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHtAbGluayAjc2V0QWlycGxhbmVNb2RlfSwgb3RoZXJ3aXNlXG4gKiB0aGUgbW9kZSBjaGFuZ2UgaXMgbm90IGdvaW5nIHRvIGJlIGFwcGxpZWQgZm9yIHRoZSBkZXZpY2UuXG4gKlxuICogQHBhcmFtIHtib29sZWFufSBvbiAtIFRydWUgdG8gYnJvYWRjYXN0IGVuYWJsZSBhbmQgZmFsc2UgdG8gYnJvYWRjYXN0IGRpc2FibGUuXG4gKi9cbm1ldGhvZHMuYnJvYWRjYXN0QWlycGxhbmVNb2RlID0gYXN5bmMgZnVuY3Rpb24gYnJvYWRjYXN0QWlycGxhbmVNb2RlIChvbikge1xuICBjb25zdCBhcmdzID0gW1xuICAgICdhbScsICdicm9hZGNhc3QnLFxuICAgICctYScsICdhbmRyb2lkLmludGVudC5hY3Rpb24uQUlSUExBTkVfTU9ERScsXG4gICAgJy0tZXonLCAnc3RhdGUnLCBvbiA/ICd0cnVlJyA6ICdmYWxzZScsXG4gIF07XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5zaGVsbChhcmdzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy8xNzQyMlxuICAgIGlmIChfLmluY2x1ZGVzKGUuc3RkZXJyLCAnU2VjdXJpdHlFeGNlcHRpb24nKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zaGVsbChhcmdzLCB7cHJpdmlsZWdlZDogdHJ1ZX0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgfVxuICAgIHRocm93IGU7XG4gIH1cbn07XG5cbi8qKlxuICogQ2hlY2sgdGhlIHN0YXRlIG9mIFdpRmkgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgV2lGaSBpcyBlbmFibGVkLlxuICovXG5tZXRob2RzLmlzV2lmaU9uID0gYXN5bmMgZnVuY3Rpb24gaXNXaWZpT24gKCkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5nKCdnbG9iYWwnLCAnd2lmaV9vbicpO1xuICByZXR1cm4gKHBhcnNlSW50KHN0ZG91dCwgMTApICE9PSAwKTtcbn07XG5cbi8qKlxuICogQ2hlY2sgdGhlIHN0YXRlIG9mIERhdGEgdHJhbnNmZXIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgRGF0YSB0cmFuc2ZlciBpcyBlbmFibGVkLlxuICovXG5tZXRob2RzLmlzRGF0YU9uID0gYXN5bmMgZnVuY3Rpb24gaXNEYXRhT24gKCkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5nKCdnbG9iYWwnLCAnbW9iaWxlX2RhdGEnKTtcbiAgcmV0dXJuIChwYXJzZUludChzdGRvdXQsIDEwKSAhPT0gMCk7XG59O1xuXG4vKipcbiAqIENoYW5nZSB0aGUgc3RhdGUgb2YgV2lGaSBhbmQvb3IgRGF0YSB0cmFuc2ZlciBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtib29sZWFufSB3aWZpIC0gVHJ1ZSB0byBlbmFibGUgYW5kIGZhbHNlIHRvIGRpc2FibGUgV2lGaS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gZGF0YSAtIFRydWUgdG8gZW5hYmxlIGFuZCBmYWxzZSB0byBkaXNhYmxlIERhdGEgdHJhbnNmZXIuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzRW11bGF0b3IgW2ZhbHNlXSAtIFNldCBpdCB0byB0cnVlIGlmIHRoZSBkZXZpY2UgdW5kZXIgdGVzdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBhbiBlbXVsYXRvciByYXRoZXIgdGhhbiBhIHJlYWwgZGV2aWNlLlxuICovXG5tZXRob2RzLnNldFdpZmlBbmREYXRhID0gYXN5bmMgZnVuY3Rpb24gc2V0V2lmaUFuZERhdGEgKHt3aWZpLCBkYXRhfSwgaXNFbXVsYXRvciA9IGZhbHNlKSB7XG4gIGlmICh1dGlsLmhhc1ZhbHVlKHdpZmkpKSB7XG4gICAgYXdhaXQgdGhpcy5zZXRXaWZpU3RhdGUod2lmaSwgaXNFbXVsYXRvcik7XG4gIH1cbiAgaWYgKHV0aWwuaGFzVmFsdWUoZGF0YSkpIHtcbiAgICBhd2FpdCB0aGlzLnNldERhdGFTdGF0ZShkYXRhLCBpc0VtdWxhdG9yKTtcbiAgfVxufTtcblxuLyoqXG4gKiBDaGVjayB0aGUgc3RhdGUgb2YgYW5pbWF0aW9uIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGF0IGxlYXN0IG9uZSBvZiBhbmltYXRpb24gc2NhbGUgc2V0dGluZ3NcbiAqICAgICAgICAgICAgICAgICAgIGlzIG5vdCBlcXVhbCB0byAnMC4wJy5cbiAqL1xubWV0aG9kcy5pc0FuaW1hdGlvbk9uID0gYXN5bmMgZnVuY3Rpb24gaXNBbmltYXRpb25PbiAoKSB7XG4gIGxldCBhbmltYXRvcl9kdXJhdGlvbl9zY2FsZSA9IGF3YWl0IHRoaXMuZ2V0U2V0dGluZygnZ2xvYmFsJywgJ2FuaW1hdG9yX2R1cmF0aW9uX3NjYWxlJyk7XG4gIGxldCB0cmFuc2l0aW9uX2FuaW1hdGlvbl9zY2FsZSA9IGF3YWl0IHRoaXMuZ2V0U2V0dGluZygnZ2xvYmFsJywgJ3RyYW5zaXRpb25fYW5pbWF0aW9uX3NjYWxlJyk7XG4gIGxldCB3aW5kb3dfYW5pbWF0aW9uX3NjYWxlID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5nKCdnbG9iYWwnLCAnd2luZG93X2FuaW1hdGlvbl9zY2FsZScpO1xuICByZXR1cm4gXy5zb21lKFthbmltYXRvcl9kdXJhdGlvbl9zY2FsZSwgdHJhbnNpdGlvbl9hbmltYXRpb25fc2NhbGUsIHdpbmRvd19hbmltYXRpb25fc2NhbGVdLFxuICAgICAgICAgICAgICAgIChzZXR0aW5nKSA9PiBzZXR0aW5nICE9PSAnMC4wJyk7XG59O1xuXG4vKipcbiAqIEZvcmNlZnVsbHkgcmVjdXJzaXZlbHkgcmVtb3ZlIGEgcGF0aCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKiBCZSBjYXJlZnVsIHdoaWxlIGNhbGxpbmcgdGhpcyBtZXRob2QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBUaGUgcGF0aCB0byBiZSByZW1vdmVkIHJlY3Vyc2l2ZWx5LlxuICovXG5tZXRob2RzLnJpbXJhZiA9IGFzeW5jIGZ1bmN0aW9uIHJpbXJhZiAocGF0aCkge1xuICBhd2FpdCB0aGlzLnNoZWxsKFsncm0nLCAnLXJmJywgcGF0aF0pO1xufTtcblxuLyoqXG4gKiBTZW5kIGEgZmlsZSB0byB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2FsUGF0aCAtIFRoZSBwYXRoIHRvIHRoZSBmaWxlIG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS5cbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVQYXRoIC0gVGhlIGRlc3RpbmF0aW9uIHBhdGggb24gdGhlIHJlbW90ZSBkZXZpY2UuXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0cyAtIEFkZGl0aW9uYWwgb3B0aW9ucyBtYXBwaW5nLiBTZWVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9ub2RlLXRlZW5fcHJvY2VzcyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgX2V4ZWNfIG1ldGhvZCBvcHRpb25zLCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhdmFpbGFibGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5cbiAqL1xubWV0aG9kcy5wdXNoID0gYXN5bmMgZnVuY3Rpb24gcHVzaCAobG9jYWxQYXRoLCByZW1vdGVQYXRoLCBvcHRzKSB7XG4gIGF3YWl0IHRoaXMubWtkaXIocGF0aC5wb3NpeC5kaXJuYW1lKHJlbW90ZVBhdGgpKTtcbiAgYXdhaXQgdGhpcy5hZGJFeGVjKFsncHVzaCcsIGxvY2FsUGF0aCwgcmVtb3RlUGF0aF0sIG9wdHMpO1xufTtcblxuLyoqXG4gKiBSZWNlaXZlIGEgZmlsZSBmcm9tIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCAtIFRoZSBzb3VyY2UgcGF0aCBvbiB0aGUgcmVtb3RlIGRldmljZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhbFBhdGggLSBUaGUgZGVzdGluYXRpb24gcGF0aCB0byB0aGUgZmlsZSBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0cyAtIEFkZGl0aW9uYWwgb3B0aW9ucyBtYXBwaW5nLiBTZWVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9ub2RlLXRlZW5fcHJvY2VzcyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgX2V4ZWNfIG1ldGhvZCBvcHRpb25zLCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhdmFpbGFibGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5cbiAqL1xubWV0aG9kcy5wdWxsID0gYXN5bmMgZnVuY3Rpb24gcHVsbCAocmVtb3RlUGF0aCwgbG9jYWxQYXRoLCBvcHRzID0ge30pIHtcbiAgLy8gcHVsbCBmb2xkZXIgY2FuIHRha2UgbW9yZSB0aW1lLCBpbmNyZWFzaW5nIHRpbWUgb3V0IHRvIDYwIHNlY3NcbiAgYXdhaXQgdGhpcy5hZGJFeGVjKFsncHVsbCcsIHJlbW90ZVBhdGgsIGxvY2FsUGF0aF0sIHsuLi5vcHRzLCB0aW1lb3V0OiBvcHRzLnRpbWVvdXQgPz8gNjAwMDB9KTtcbn07XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgcHJvY2VzcyB3aXRoIHRoZSBwYXJ0aWN1bGFyIG5hbWUgaXMgcnVubmluZyBvbiB0aGUgZGV2aWNlXG4gKiB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9jZXNzTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9jZXNzIHRvIGJlIGNoZWNrZWQuXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBnaXZlbiBwcm9jZXNzIGlzIHJ1bm5pbmcuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGdpdmVuIHByb2Nlc3MgbmFtZSBpcyBub3QgYSB2YWxpZCBjbGFzcyBuYW1lLlxuICovXG5tZXRob2RzLnByb2Nlc3NFeGlzdHMgPSBhc3luYyBmdW5jdGlvbiBwcm9jZXNzRXhpc3RzIChwcm9jZXNzTmFtZSkge1xuICByZXR1cm4gIV8uaXNFbXB0eShhd2FpdCB0aGlzLmdldFBJRHNCeU5hbWUocHJvY2Vzc05hbWUpKTtcbn07XG5cbi8qKlxuICogR2V0IFRDUCBwb3J0IGZvcndhcmRpbmcgd2l0aCBhZGIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogQHJldHVybiB7QXJyYXkuPFN0cmluZz59IFRoZSBvdXRwdXQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYWRiIGNvbW1hbmQuIEFuIGFycmF5IGNvbnRhaW5zIGVhY2ggZm9yd2FyZGluZyBsaW5lIG9mIG91dHB1dFxuICovXG5tZXRob2RzLmdldEZvcndhcmRMaXN0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0Rm9yd2FyZExpc3QgKCkge1xuICBsb2cuZGVidWcoYExpc3QgZm9yd2FyZGluZyBwb3J0c2ApO1xuICBjb25zdCBjb25uZWN0aW9ucyA9IGF3YWl0IHRoaXMuYWRiRXhlYyhbJ2ZvcndhcmQnLCAnLS1saXN0J10pO1xuICByZXR1cm4gY29ubmVjdGlvbnMuc3BsaXQoRU9MKS5maWx0ZXIoKGxpbmUpID0+IEJvb2xlYW4obGluZS50cmltKCkpKTtcbn07XG5cbi8qKlxuICogU2V0dXAgVENQIHBvcnQgZm9yd2FyZGluZyB3aXRoIGFkYiBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBzeXN0ZW1Qb3J0IC0gVGhlIG51bWJlciBvZiB0aGUgbG9jYWwgc3lzdGVtIHBvcnQuXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGRldmljZVBvcnQgLSBUaGUgbnVtYmVyIG9mIHRoZSByZW1vdGUgZGV2aWNlIHBvcnQuXG4gKi9cbm1ldGhvZHMuZm9yd2FyZFBvcnQgPSBhc3luYyBmdW5jdGlvbiBmb3J3YXJkUG9ydCAoc3lzdGVtUG9ydCwgZGV2aWNlUG9ydCkge1xuICBsb2cuZGVidWcoYEZvcndhcmRpbmcgc3lzdGVtOiAke3N5c3RlbVBvcnR9IHRvIGRldmljZTogJHtkZXZpY2VQb3J0fWApO1xuICBhd2FpdCB0aGlzLmFkYkV4ZWMoWydmb3J3YXJkJywgYHRjcDoke3N5c3RlbVBvcnR9YCwgYHRjcDoke2RldmljZVBvcnR9YF0pO1xufTtcblxuLyoqXG4gKiBSZW1vdmUgVENQIHBvcnQgZm9yd2FyZGluZyB3aXRoIGFkYiBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuIFRoZSBmb3J3YXJkaW5nXG4gKiBmb3IgdGhlIGdpdmVuIHBvcnQgc2hvdWxkIGJlIHNldHVwIHdpdGgge0BsaW5rICNmb3J3YXJkUG9ydH0gZmlyc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBzeXN0ZW1Qb3J0IC0gVGhlIG51bWJlciBvZiB0aGUgbG9jYWwgc3lzdGVtIHBvcnRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHJlbW92ZSBmb3J3YXJkaW5nIG9uLlxuICovXG5tZXRob2RzLnJlbW92ZVBvcnRGb3J3YXJkID0gYXN5bmMgZnVuY3Rpb24gcmVtb3ZlUG9ydEZvcndhcmQgKHN5c3RlbVBvcnQpIHtcbiAgbG9nLmRlYnVnKGBSZW1vdmluZyBmb3J3YXJkZWQgcG9ydCBzb2NrZXQgY29ubmVjdGlvbjogJHtzeXN0ZW1Qb3J0fSBgKTtcbiAgYXdhaXQgdGhpcy5hZGJFeGVjKFsnZm9yd2FyZCcsIGAtLXJlbW92ZWAsIGB0Y3A6JHtzeXN0ZW1Qb3J0fWBdKTtcbn07XG5cbi8qKlxuICogR2V0IFRDUCBwb3J0IGZvcndhcmRpbmcgd2l0aCBhZGIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogQHJldHVybiB7QXJyYXkuPFN0cmluZz59IFRoZSBvdXRwdXQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYWRiIGNvbW1hbmQuIEFuIGFycmF5IGNvbnRhaW5zIGVhY2ggZm9yd2FyZGluZyBsaW5lIG9mIG91dHB1dFxuICovXG5tZXRob2RzLmdldFJldmVyc2VMaXN0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0UmV2ZXJzZUxpc3QgKCkge1xuICBsb2cuZGVidWcoYExpc3QgcmV2ZXJzZSBmb3J3YXJkaW5nIHBvcnRzYCk7XG4gIGNvbnN0IGNvbm5lY3Rpb25zID0gYXdhaXQgdGhpcy5hZGJFeGVjKFsncmV2ZXJzZScsICctLWxpc3QnXSk7XG4gIHJldHVybiBjb25uZWN0aW9ucy5zcGxpdChFT0wpLmZpbHRlcigobGluZSkgPT4gQm9vbGVhbihsaW5lLnRyaW0oKSkpO1xufTtcblxuLyoqXG4gKiBTZXR1cCBUQ1AgcG9ydCBmb3J3YXJkaW5nIHdpdGggYWRiIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqIE9ubHkgYXZhaWxhYmxlIGZvciBBUEkgMjErLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gZGV2aWNlUG9ydCAtIFRoZSBudW1iZXIgb2YgdGhlIHJlbW90ZSBkZXZpY2UgcG9ydC5cbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gc3lzdGVtUG9ydCAtIFRoZSBudW1iZXIgb2YgdGhlIGxvY2FsIHN5c3RlbSBwb3J0LlxuICovXG5tZXRob2RzLnJldmVyc2VQb3J0ID0gYXN5bmMgZnVuY3Rpb24gcmV2ZXJzZVBvcnQgKGRldmljZVBvcnQsIHN5c3RlbVBvcnQpIHtcbiAgbG9nLmRlYnVnKGBGb3J3YXJkaW5nIGRldmljZTogJHtkZXZpY2VQb3J0fSB0byBzeXN0ZW06ICR7c3lzdGVtUG9ydH1gKTtcbiAgYXdhaXQgdGhpcy5hZGJFeGVjKFsncmV2ZXJzZScsIGB0Y3A6JHtkZXZpY2VQb3J0fWAsIGB0Y3A6JHtzeXN0ZW1Qb3J0fWBdKTtcbn07XG5cbi8qKlxuICogUmVtb3ZlIFRDUCBwb3J0IGZvcndhcmRpbmcgd2l0aCBhZGIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LiBUaGUgZm9yd2FyZGluZ1xuICogZm9yIHRoZSBnaXZlbiBwb3J0IHNob3VsZCBiZSBzZXR1cCB3aXRoIHtAbGluayAjZm9yd2FyZFBvcnR9IGZpcnN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gZGV2aWNlUG9ydCAtIFRoZSBudW1iZXIgb2YgdGhlIHJlbW90ZSBkZXZpY2UgcG9ydFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gcmVtb3ZlIGZvcndhcmRpbmcgb24uXG4gKi9cbm1ldGhvZHMucmVtb3ZlUG9ydFJldmVyc2UgPSBhc3luYyBmdW5jdGlvbiByZW1vdmVQb3J0UmV2ZXJzZSAoZGV2aWNlUG9ydCkge1xuICBsb2cuZGVidWcoYFJlbW92aW5nIHJldmVyc2UgZm9yd2FyZGVkIHBvcnQgc29ja2V0IGNvbm5lY3Rpb246ICR7ZGV2aWNlUG9ydH0gYCk7XG4gIGF3YWl0IHRoaXMuYWRiRXhlYyhbJ3JldmVyc2UnLCBgLS1yZW1vdmVgLCBgdGNwOiR7ZGV2aWNlUG9ydH1gXSk7XG59O1xuXG4vKipcbiAqIFNldHVwIFRDUCBwb3J0IGZvcndhcmRpbmcgd2l0aCBhZGIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LiBUaGUgZGlmZmVyZW5jZVxuICogYmV0d2VlbiB7QGxpbmsgI2ZvcndhcmRQb3J0fSBpcyB0aGF0IHRoaXMgbWV0aG9kIGRvZXMgc2V0dXAgZm9yIGFuIGFic3RyYWN0XG4gKiBsb2NhbCBwb3J0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gc3lzdGVtUG9ydCAtIFRoZSBudW1iZXIgb2YgdGhlIGxvY2FsIHN5c3RlbSBwb3J0LlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBkZXZpY2VQb3J0IC0gVGhlIG51bWJlciBvZiB0aGUgcmVtb3RlIGRldmljZSBwb3J0LlxuICovXG5tZXRob2RzLmZvcndhcmRBYnN0cmFjdFBvcnQgPSBhc3luYyBmdW5jdGlvbiBmb3J3YXJkQWJzdHJhY3RQb3J0IChzeXN0ZW1Qb3J0LCBkZXZpY2VQb3J0KSB7XG4gIGxvZy5kZWJ1ZyhgRm9yd2FyZGluZyBzeXN0ZW06ICR7c3lzdGVtUG9ydH0gdG8gYWJzdHJhY3QgZGV2aWNlOiAke2RldmljZVBvcnR9YCk7XG4gIGF3YWl0IHRoaXMuYWRiRXhlYyhbJ2ZvcndhcmQnLCBgdGNwOiR7c3lzdGVtUG9ydH1gLCBgbG9jYWxhYnN0cmFjdDoke2RldmljZVBvcnR9YF0pO1xufTtcblxuLyoqXG4gKiBFeGVjdXRlIHBpbmcgc2hlbGwgY29tbWFuZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgY29tbWFuZCBvdXRwdXQgY29udGFpbnMgJ3BpbmcnIHN1YnN0cmluZy5cbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgZXhlY3V0aW5nICdwaW5nJyBjb21tYW5kIG9uIHRoZVxuICogICAgICAgICAgICAgICAgIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLnBpbmcgPSBhc3luYyBmdW5jdGlvbiBwaW5nICgpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuc2hlbGwoWydlY2hvJywgJ3BpbmcnXSk7XG4gIGlmIChzdGRvdXQuaW5kZXhPZigncGluZycpID09PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBBREIgcGluZyBmYWlsZWQsIHJldHVybmVkICR7c3Rkb3V0fWApO1xufTtcblxuLyoqXG4gKiBSZXN0YXJ0IHRoZSBkZXZpY2UgdW5kZXIgdGVzdCB1c2luZyBhZGIgY29tbWFuZHMuXG4gKlxuICogQHRocm93cyB7ZXJyb3J9IElmIHN0YXJ0IGZhaWxzLlxuICovXG5tZXRob2RzLnJlc3RhcnQgPSBhc3luYyBmdW5jdGlvbiByZXN0YXJ0ICgpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLnN0b3BMb2djYXQoKTtcbiAgICBhd2FpdCB0aGlzLnJlc3RhcnRBZGIoKTtcbiAgICBhd2FpdCB0aGlzLndhaXRGb3JEZXZpY2UoNjApO1xuICAgIGF3YWl0IHRoaXMuc3RhcnRMb2djYXQodGhpcy5fbG9nY2F0U3RhcnR1cFBhcmFtcyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFJlc3RhcnQgZmFpbGVkLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTG9nY2F0T3B0c1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGZvcm1hdCBUaGUgbG9nIHByaW50IGZvcm1hdCwgd2hlcmUgPGZvcm1hdD4gaXMgb25lIG9mOlxuICogICBicmllZiBwcm9jZXNzIHRhZyB0aHJlYWQgcmF3IHRpbWUgdGhyZWFkdGltZSBsb25nXG4gKiBgdGhyZWFkdGltZWAgaXMgdGhlIGRlZmF1bHQgdmFsdWUuXG4gKiBAcHJvcGVydHkge0FycmF5PHN0cmluZz59IGZpbHRlclNwZWNzIFNlcmllcyBvZiA8dGFnPls6cHJpb3JpdHldXG4gKiB3aGVyZSA8dGFnPiBpcyBhIGxvZyBjb21wb25lbnQgdGFnIChvciAqIGZvciBhbGwpIGFuZCBwcmlvcml0eSBpczpcbiAqICBWICAgIFZlcmJvc2VcbiAqICBEICAgIERlYnVnXG4gKiAgSSAgICBJbmZvXG4gKiAgVyAgICBXYXJuXG4gKiAgRSAgICBFcnJvclxuICogIEYgICAgRmF0YWxcbiAqICBTICAgIFNpbGVudCAoc3VwcmVzcyBhbGwgb3V0cHV0KVxuICpcbiAqICcqJyBtZWFucyAnKjpkJyBhbmQgPHRhZz4gYnkgaXRzZWxmIG1lYW5zIDx0YWc+OnZcbiAqXG4gKiBJZiBub3Qgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kbGluZSwgZmlsdGVyc3BlYyBpcyBzZXQgZnJvbSBBTkRST0lEX0xPR19UQUdTLlxuICogSWYgbm8gZmlsdGVyc3BlYyBpcyBmb3VuZCwgZmlsdGVyIGRlZmF1bHRzIHRvICcqOkknXG4gKi9cblxuLyoqXG4gKiBTdGFydCB0aGUgbG9nY2F0IHByb2Nlc3MgdG8gZ2F0aGVyIGxvZ3MuXG4gKlxuICogQHBhcmFtIHs/TG9nY2F0T3B0c30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IElmIHJlc3RhcnQgZmFpbHMuXG4gKi9cbm1ldGhvZHMuc3RhcnRMb2djYXQgPSBhc3luYyBmdW5jdGlvbiBzdGFydExvZ2NhdCAob3B0cyA9IHt9KSB7XG4gIGlmICghXy5pc0VtcHR5KHRoaXMubG9nY2F0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlRyeWluZyB0byBzdGFydCBsb2djYXQgY2FwdHVyZSBidXQgaXQncyBhbHJlYWR5IHN0YXJ0ZWQhXCIpO1xuICB9XG5cbiAgdGhpcy5sb2djYXQgPSBuZXcgTG9nY2F0KHtcbiAgICBhZGI6IHRoaXMuZXhlY3V0YWJsZSxcbiAgICBkZWJ1ZzogZmFsc2UsXG4gICAgZGVidWdUcmFjZTogZmFsc2UsXG4gICAgY2xlYXJEZXZpY2VMb2dzT25TdGFydDogISF0aGlzLmNsZWFyRGV2aWNlTG9nc09uU3RhcnQsXG4gIH0pO1xuICBhd2FpdCB0aGlzLmxvZ2NhdC5zdGFydENhcHR1cmUob3B0cyk7XG4gIHRoaXMuX2xvZ2NhdFN0YXJ0dXBQYXJhbXMgPSBvcHRzO1xufTtcblxuLyoqXG4gKiBTdG9wIHRoZSBhY3RpdmUgbG9nY2F0IHByb2Nlc3Mgd2hpY2ggZ2F0aGVycyBsb2dzLlxuICogVGhlIGNhbGwgd2lsbCBiZSBpZ25vcmVkIGlmIG5vIGxvZ2NhdCBwcm9jZXNzIGlzIHJ1bm5pbmcuXG4gKi9cbm1ldGhvZHMuc3RvcExvZ2NhdCA9IGFzeW5jIGZ1bmN0aW9uIHN0b3BMb2djYXQgKCkge1xuICBpZiAoXy5pc0VtcHR5KHRoaXMubG9nY2F0KSkge1xuICAgIHJldHVybjtcbiAgfVxuICB0cnkge1xuICAgIGF3YWl0IHRoaXMubG9nY2F0LnN0b3BDYXB0dXJlKCk7XG4gIH0gZmluYWxseSB7XG4gICAgdGhpcy5sb2djYXQgPSBudWxsO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBvdXRwdXQgZnJvbSB0aGUgY3VycmVudGx5IHJ1bm5pbmcgbG9nY2F0IHByb2Nlc3MuXG4gKiBUaGUgbG9nY2F0IHByb2Nlc3Mgc2hvdWxkIGJlIGV4ZWN1dGVkIGJ5IHsybGluayAjc3RhcnRMb2djYXR9IG1ldGhvZC5cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjb2xsZWN0ZWQgbG9nY2F0IG91dHB1dC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBsb2djYXQgcHJvY2VzcyBpcyBub3QgcnVubmluZy5cbiAqL1xubWV0aG9kcy5nZXRMb2djYXRMb2dzID0gZnVuY3Rpb24gZ2V0TG9nY2F0TG9ncyAoKSB7XG4gIGlmIChfLmlzRW1wdHkodGhpcy5sb2djYXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgZ2V0IGxvZ2NhdCBsb2dzIHNpbmNlIGxvZ2NhdCBoYXNuJ3Qgc3RhcnRlZFwiKTtcbiAgfVxuICByZXR1cm4gdGhpcy5sb2djYXQuZ2V0TG9ncygpO1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIGNhbGxiYWNrIGZvciB0aGUgbG9nY2F0IG91dHB1dCBldmVudC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciAtIFRoZSBsaXN0ZW5lciBmdW5jdGlvbiwgd2hpY2ggYWNjZXB0cyBvbmUgYXJndW1lbnQuIFRoZSBhcmd1bWVudCBpc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIGxvZyByZWNvcmQgb2JqZWN0IHdpdGggYHRpbWVzdGFtcGAsIGBsZXZlbGAgYW5kIGBtZXNzYWdlYCBwcm9wZXJ0aWVzLlxuICogQHRocm93cyB7RXJyb3J9IElmIGxvZ2NhdCBwcm9jZXNzIGlzIG5vdCBydW5uaW5nLlxuICovXG5tZXRob2RzLnNldExvZ2NhdExpc3RlbmVyID0gZnVuY3Rpb24gc2V0TG9nY2F0TGlzdGVuZXIgKGxpc3RlbmVyKSB7XG4gIGlmIChfLmlzRW1wdHkodGhpcy5sb2djYXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTG9nY2F0IHByb2Nlc3MgaGFzbid0IGJlZW4gc3RhcnRlZFwiKTtcbiAgfVxuICB0aGlzLmxvZ2NhdC5vbignb3V0cHV0JywgbGlzdGVuZXIpO1xufTtcblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBwcmV2aW91c2x5IHNldCBjYWxsYmFjayBmb3IgdGhlIGxvZ2NhdCBvdXRwdXQgZXZlbnQuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgLSBUaGUgbGlzdGVuZXIgZnVuY3Rpb24sIHdoaWNoIGhhcyBiZWVuIHByZXZpb3VzbHlcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkIHRvIGBzZXRMb2djYXRMaXN0ZW5lcmBcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBsb2djYXQgcHJvY2VzcyBpcyBub3QgcnVubmluZy5cbiAqL1xubWV0aG9kcy5yZW1vdmVMb2djYXRMaXN0ZW5lciA9IGZ1bmN0aW9uIHJlbW92ZUxvZ2NhdExpc3RlbmVyIChsaXN0ZW5lcikge1xuICBpZiAoXy5pc0VtcHR5KHRoaXMubG9nY2F0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkxvZ2NhdCBwcm9jZXNzIGhhc24ndCBiZWVuIHN0YXJ0ZWRcIik7XG4gIH1cbiAgdGhpcy5sb2djYXQucmVtb3ZlTGlzdGVuZXIoJ291dHB1dCcsIGxpc3RlbmVyKTtcbn07XG5cbi8qKlxuICogQXQgc29tZSBwb2ludCBvZiB0aW1lIEdvb2dsZSBoYXMgY2hhbmdlZCB0aGUgZGVmYXVsdCBgcHNgIGJlaGF2aW91ciwgc28gaXQgb25seVxuICogbGlzdHMgcHJvY2Vzc2VzIHRoYXQgYmVsb25nIHRvIHRoZSBjdXJyZW50IHNoZWxsIHVzZXIgcmF0aGVyIHRvIGFsbFxuICogdXNlcnMuIEl0IGlzIG5lY2Vzc2FyeSB0byBleGVjdXRlIHBzIHdpdGggLUEgY29tbWFuZCBsaW5lIGFyZ3VtZW50XG4gKiB0byBtaW1pYyB0aGUgcHJldmlvdXMgYmVoYXZpb3VyLlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBvdXRwdXQgb2YgYHBzYCBjb21tYW5kIHdoZXJlIGFsbCBwcm9jZXNzZXMgYXJlIGluY2x1ZGVkXG4gKi9cbm1ldGhvZHMubGlzdFByb2Nlc3NTdGF0dXMgPSBhc3luYyBmdW5jdGlvbiBsaXN0UHJvY2Vzc1N0YXR1cyAoKSB7XG4gIGlmICghXy5pc0Jvb2xlYW4odGhpcy5fZG9lc1BzU3VwcG9ydEFPcHRpb24pKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX2RvZXNQc1N1cHBvcnRBT3B0aW9uID0gL14tQVxcYi9tLnRlc3QoYXdhaXQgdGhpcy5zaGVsbChbJ3BzJywgJy0taGVscCddKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nLmRlYnVnKGUuc3RhY2spO1xuICAgICAgdGhpcy5fZG9lc1BzU3VwcG9ydEFPcHRpb24gPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGF3YWl0IHRoaXMuc2hlbGwodGhpcy5fZG9lc1BzU3VwcG9ydEFPcHRpb24gPyBbJ3BzJywgJy1BJ10gOiBbJ3BzJ10pO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHByb2Nlc3MgbmFtZSBmb3IgdGhlIGdpdmVuIHByb2Nlc3MgaWRlbnRpZmllclxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gcGlkIC0gVGhlIHZhbGlkIHByb2Nlc3MgaWRlbnRpZmllclxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBnaXZlbiBQSUQgaXMgZWl0aGVyIGludmFsaWQgb3IgaXMgbm90IHByZXNlbnRcbiAqIGluIHRoZSBhY3RpdmUgcHJvY2Vzc2VzIGxpc3RcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBwcm9jZXNzIG5hbWVcbiAqL1xubWV0aG9kcy5nZXROYW1lQnlQaWQgPSBhc3luYyBmdW5jdGlvbiBnZXROYW1lQnlQaWQgKHBpZCkge1xuICBpZiAoaXNOYU4ocGlkKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIFBJRCB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgbnVtYmVyLiAnJHtwaWR9JyBpcyBnaXZlbiBpbnN0ZWFkYCk7XG4gIH1cbiAgcGlkID0gcGFyc2VJbnQocGlkLCAxMCk7XG5cbiAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgdGhpcy5saXN0UHJvY2Vzc1N0YXR1cygpO1xuICBjb25zdCB0aXRsZU1hdGNoID0gUFNfVElUTEVfUEFUVEVSTi5leGVjKHN0ZG91dCk7XG4gIGlmICghdGl0bGVNYXRjaCkge1xuICAgIGxvZy5kZWJ1ZyhzdGRvdXQpO1xuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGdldCB0aGUgcHJvY2VzcyBuYW1lIGZvciBQSUQgJyR7cGlkfSdgKTtcbiAgfVxuICBjb25zdCBhbGxUaXRsZXMgPSB0aXRsZU1hdGNoWzFdLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICBjb25zdCBwaWRJbmRleCA9IGFsbFRpdGxlcy5pbmRleE9mKFBJRF9DT0xVTU5fVElUTEUpO1xuICAvLyBpdCBtaWdodCBub3QgYmUgc3RhYmxlIHRvIHRha2UgTkFNRSBieSBpbmRleCwgYmVjYXVzZSBkZXBlbmRpbmcgb24gdGhlXG4gIC8vIGFjdHVhbCBTREsgdGhlIHBzIG91dHB1dCBtaWdodCBub3QgY29udGFpbiBhbiBhYmJyZXZpYXRpb24gZm9yIHRoZSBTIGZsYWc6XG4gIC8vIFVTRVIgICAgIFBJRCAgIFBQSUQgIFZTSVpFICBSU1MgICAgIFdDSEFOICAgIFBDICAgICAgICBOQU1FXG4gIC8vIFVTRVIgICAgIFBJRCAgIFBQSUQgIFZTSVpFICBSU1MgICAgIFdDSEFOICAgIFBDICAgUyAgICBOQU1FXG4gIGNvbnN0IG5hbWVPZmZzZXQgPSBhbGxUaXRsZXMuaW5kZXhPZihQUk9DRVNTX05BTUVfQ09MVU1OX1RJVExFKSAtIGFsbFRpdGxlcy5sZW5ndGg7XG4gIGNvbnN0IHBpZFJlZ2V4ID0gbmV3IFJlZ0V4cChgXiguKlxcXFxiJHtwaWR9XFxcXGIuKikkYCwgJ2dtJyk7XG4gIGxldCBtYXRjaGVkTGluZTtcbiAgd2hpbGUgKChtYXRjaGVkTGluZSA9IHBpZFJlZ2V4LmV4ZWMoc3Rkb3V0KSkpIHtcbiAgICBjb25zdCBpdGVtcyA9IG1hdGNoZWRMaW5lWzFdLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICAgIGlmIChwYXJzZUludChpdGVtc1twaWRJbmRleF0sIDEwKSA9PT0gcGlkICYmIGl0ZW1zW2l0ZW1zLmxlbmd0aCArIG5hbWVPZmZzZXRdKSB7XG4gICAgICByZXR1cm4gaXRlbXNbaXRlbXMubGVuZ3RoICsgbmFtZU9mZnNldF07XG4gICAgfVxuICB9XG4gIGxvZy5kZWJ1ZyhzdGRvdXQpO1xuICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBnZXQgdGhlIHByb2Nlc3MgbmFtZSBmb3IgUElEICcke3BpZH0nYCk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgbGlzdCBvZiBwcm9jZXNzIGlkcyBmb3IgdGhlIHBhcnRpY3VsYXIgcHJvY2VzcyBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgcGFydCBvZiBwcm9jZXNzIG5hbWUuXG4gKiBAcmV0dXJuIHtBcnJheS48bnVtYmVyPn0gVGhlIGxpc3Qgb2YgbWF0Y2hlZCBwcm9jZXNzIElEcyBvciBhbiBlbXB0eSBsaXN0LlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBwYXNzZWQgcHJvY2VzcyBuYW1lIGlzIG5vdCBhIHZhbGlkIG9uZVxuICovXG5tZXRob2RzLmdldFBJRHNCeU5hbWUgPSBhc3luYyBmdW5jdGlvbiBnZXRQSURzQnlOYW1lIChuYW1lKSB7XG4gIGxvZy5kZWJ1ZyhgR2V0dGluZyBJRHMgb2YgYWxsICcke25hbWV9JyBwcm9jZXNzZXNgKTtcbiAgaWYgKCF0aGlzLmlzVmFsaWRDbGFzcyhuYW1lKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwcm9jZXNzIG5hbWU6ICcke25hbWV9J2ApO1xuICB9XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy8xMzU2N1xuICBpZiAoYXdhaXQgdGhpcy5nZXRBcGlMZXZlbCgpID49IDIzKSB7XG4gICAgaWYgKCFfLmlzQm9vbGVhbih0aGlzLl9pc1BncmVwQXZhaWxhYmxlKSkge1xuICAgICAgLy8gcGdyZXAgaXMgaW4gcHJpb3JpdHksIHNpbmNlIHBpZG9mIGhhcyBiZWVuIHJlcG9ydGVkIG9mIGhhdmluZyBidWdzIG9uIHNvbWUgcGxhdGZvcm1zXG4gICAgICBjb25zdCBwZ3JlcE91dHB1dCA9IF8udHJpbShhd2FpdCB0aGlzLnNoZWxsKFsncGdyZXAgLS1oZWxwOyBlY2hvICQ/J10pKTtcbiAgICAgIHRoaXMuX2lzUGdyZXBBdmFpbGFibGUgPSBwYXJzZUludChfLmxhc3QocGdyZXBPdXRwdXQuc3BsaXQoL1xccysvKSksIDEwKSA9PT0gMDtcbiAgICAgIGlmICh0aGlzLl9pc1BncmVwQXZhaWxhYmxlKSB7XG4gICAgICAgIHRoaXMuX2NhblBncmVwVXNlRnVsbENtZExpbmVTZWFyY2ggPSAvXi1mXFxiL20udGVzdChwZ3JlcE91dHB1dCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9pc1BpZG9mQXZhaWxhYmxlID0gcGFyc2VJbnQoYXdhaXQgdGhpcy5zaGVsbChbJ3BpZG9mIC0taGVscCA+IC9kZXYvbnVsbDsgZWNobyAkPyddKSwgMTApID09PSAwO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5faXNQZ3JlcEF2YWlsYWJsZSB8fCB0aGlzLl9pc1BpZG9mQXZhaWxhYmxlKSB7XG4gICAgICBjb25zdCBzaGVsbENvbW1hbmQgPSB0aGlzLl9pc1BncmVwQXZhaWxhYmxlXG4gICAgICAgID8gKHRoaXMuX2NhblBncmVwVXNlRnVsbENtZExpbmVTZWFyY2hcbiAgICAgICAgICA/IFsncGdyZXAnLCAnLWYnLCBfLmVzY2FwZVJlZ0V4cChgKFtbOmJsYW5rOl1dfF4pJHtuYW1lfShbWzpibGFuazpdXXwkKWApXVxuICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy8xMzg3MlxuICAgICAgICAgIDogW2BwZ3JlcCBeJHtfLmVzY2FwZVJlZ0V4cChuYW1lLnNsaWNlKC1NQVhfUEdSRVBfUEFUVEVSTl9MRU4pKX0kIGAgK1xuICAgICAgICAgICAgICBgfHwgcGdyZXAgXiR7Xy5lc2NhcGVSZWdFeHAobmFtZS5zbGljZSgwLCBNQVhfUEdSRVBfUEFUVEVSTl9MRU4pKX0kYF0pXG4gICAgICAgIDogWydwaWRvZicsIG5hbWVdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLnNoZWxsKHNoZWxsQ29tbWFuZCkpXG4gICAgICAgICAgLnNwbGl0KC9cXHMrLylcbiAgICAgICAgICAubWFwKCh4KSA9PiBwYXJzZUludCh4LCAxMCkpXG4gICAgICAgICAgLmZpbHRlcigoeCkgPT4gXy5pc0ludGVnZXIoeCkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBlcnJvciBjb2RlIDEgaXMgcmV0dXJuZWQgaWYgdGhlIHV0aWxpdHkgZGlkIG5vdCBmaW5kIGFueSBwcm9jZXNzZXNcbiAgICAgICAgLy8gd2l0aCB0aGUgZ2l2ZW4gbmFtZVxuICAgICAgICBpZiAoZS5jb2RlICE9PSAxKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZXh0cmFjdCBwcm9jZXNzIElEIG9mICcke25hbWV9JzogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF8uaW5jbHVkZXMoZS5zdGRlcnIgfHwgZS5zdGRvdXQsICdzeW50YXggZXJyb3InKSkge1xuICAgICAgICAgIGxvZy53YXJuKGBHb3QgYW4gdW5leHBlY3RlZCByZXNwb25zZSBmcm9tIHRoZSBzaGVsbCBpbnRlcnByZXRlcjogJHtlLnN0ZGVyciB8fCBlLnN0ZG91dH1gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsb2cuZGVidWcoJ1VzaW5nIHBzLWJhc2VkIFBJRCBkZXRlY3Rpb24nKTtcbiAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgdGhpcy5saXN0UHJvY2Vzc1N0YXR1cygpO1xuICBjb25zdCB0aXRsZU1hdGNoID0gUFNfVElUTEVfUEFUVEVSTi5leGVjKHN0ZG91dCk7XG4gIGlmICghdGl0bGVNYXRjaCkge1xuICAgIGxvZy5kZWJ1ZyhzdGRvdXQpO1xuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGV4dHJhY3QgUElEIG9mICcke25hbWV9JyBmcm9tIHBzIG91dHB1dGApO1xuICB9XG4gIGNvbnN0IGFsbFRpdGxlcyA9IHRpdGxlTWF0Y2hbMV0udHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gIGNvbnN0IHBpZEluZGV4ID0gYWxsVGl0bGVzLmluZGV4T2YoUElEX0NPTFVNTl9USVRMRSk7XG4gIGNvbnN0IHBpZHMgPSBbXTtcbiAgY29uc3QgcHJvY2Vzc05hbWVSZWdleCA9IG5ldyBSZWdFeHAoYF4oLipcXFxcYlxcXFxkK1xcXFxiLipcXFxcYiR7Xy5lc2NhcGVSZWdFeHAobmFtZSl9XFxcXGIuKikkYCwgJ2dtJyk7XG4gIGxldCBtYXRjaGVkTGluZTtcbiAgd2hpbGUgKChtYXRjaGVkTGluZSA9IHByb2Nlc3NOYW1lUmVnZXguZXhlYyhzdGRvdXQpKSkge1xuICAgIGNvbnN0IGl0ZW1zID0gbWF0Y2hlZExpbmVbMV0udHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgaWYgKHBpZEluZGV4ID49IGFsbFRpdGxlcy5sZW5ndGggfHwgaXNOYU4oaXRlbXNbcGlkSW5kZXhdKSkge1xuICAgICAgbG9nLmRlYnVnKHN0ZG91dCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBleHRyYWN0IFBJRCBvZiAnJHtuYW1lfScgZnJvbSAnJHttYXRjaGVkTGluZVsxXS50cmltKCl9J2ApO1xuICAgIH1cbiAgICBwaWRzLnB1c2gocGFyc2VJbnQoaXRlbXNbcGlkSW5kZXhdLCAxMCkpO1xuICB9XG4gIHJldHVybiBwaWRzO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGxpc3Qgb2YgcHJvY2VzcyBpZHMgZm9yIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3Mgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIHBhcnQgb2YgcHJvY2VzcyBuYW1lLlxuICogQHJldHVybiB7QXJyYXkuPG51bWJlcj59IFRoZSBsaXN0IG9mIG1hdGNoZWQgcHJvY2VzcyBJRHMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqL1xubWV0aG9kcy5raWxsUHJvY2Vzc2VzQnlOYW1lID0gYXN5bmMgZnVuY3Rpb24ga2lsbFByb2Nlc3Nlc0J5TmFtZSAobmFtZSkge1xuICB0cnkge1xuICAgIGxvZy5kZWJ1ZyhgQXR0ZW1wdGluZyB0byBraWxsIGFsbCAke25hbWV9IHByb2Nlc3Nlc2ApO1xuICAgIGNvbnN0IHBpZHMgPSBhd2FpdCB0aGlzLmdldFBJRHNCeU5hbWUobmFtZSk7XG4gICAgaWYgKF8uaXNFbXB0eShwaWRzKSkge1xuICAgICAgbG9nLmluZm8oYE5vICcke25hbWV9JyBwcm9jZXNzIGhhcyBiZWVuIGZvdW5kYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IEIuYWxsKHBpZHMubWFwKChwKSA9PiB0aGlzLmtpbGxQcm9jZXNzQnlQSUQocCkpKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBraWxsICR7bmFtZX0gcHJvY2Vzc2VzLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogS2lsbCB0aGUgcGFydGljdWxhciBwcm9jZXNzIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqIFRoZSBjdXJyZW50IHVzZXIgaXMgYXV0b21hdGljYWxseSBzd2l0Y2hlZCB0byByb290IGlmIG5lY2Vzc2FyeSBpbiBvcmRlclxuICogdG8gcHJvcGVybHkga2lsbCB0aGUgcHJvY2Vzcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHBpZCAtIFRoZSBJRCBvZiB0aGUgcHJvY2VzcyB0byBiZSBraWxsZWQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHByb2Nlc3MgY2Fubm90IGJlIGtpbGxlZC5cbiAqL1xubWV0aG9kcy5raWxsUHJvY2Vzc0J5UElEID0gYXN5bmMgZnVuY3Rpb24ga2lsbFByb2Nlc3NCeVBJRCAocGlkKSB7XG4gIGxvZy5kZWJ1ZyhgQXR0ZW1wdGluZyB0byBraWxsIHByb2Nlc3MgJHtwaWR9YCk7XG4gIGNvbnN0IG5vUHJvY2Vzc0ZsYWcgPSAnTm8gc3VjaCBwcm9jZXNzJztcbiAgdHJ5IHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcHJvY2VzcyBleGlzdHMgYW5kIHRocm93IGFuIGV4Y2VwdGlvbiBvdGhlcndpc2VcbiAgICBhd2FpdCB0aGlzLnNoZWxsKFsna2lsbCcsIHBpZF0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKF8uaW5jbHVkZXMoZS5zdGRlcnIsIG5vUHJvY2Vzc0ZsYWcpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghXy5pbmNsdWRlcyhlLnN0ZGVyciwgJ09wZXJhdGlvbiBub3QgcGVybWl0dGVkJykpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIGxvZy5pbmZvKGBDYW5ub3Qga2lsbCBQSUQgJHtwaWR9IGR1ZSB0byBpbnN1ZmZpY2llbnQgcGVybWlzc2lvbnMuIFJldHJ5aW5nIGFzIHJvb3RgKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5zaGVsbChbJ2tpbGwnLCBwaWRdLCB7XG4gICAgICAgIHByaXZpbGVnZWQ6IHRydWVcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUxKSB7XG4gICAgICBpZiAoXy5pbmNsdWRlcyhlMS5zdGRlcnIsIG5vUHJvY2Vzc0ZsYWcpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRocm93IGUxO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBCcm9hZGNhc3QgcHJvY2VzcyBraWxsaW5nIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW50ZW50IC0gVGhlIG5hbWUgb2YgdGhlIGludGVudCB0byBicm9hZGNhc3QgdG8uXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvY2Vzc05hbWUgLSBUaGUgbmFtZSBvZiB0aGUga2lsbGVkIHByb2Nlc3MuXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgdGhlIHByb2Nlc3Mgd2FzIG5vdCBraWxsZWQuXG4gKi9cbm1ldGhvZHMuYnJvYWRjYXN0UHJvY2Vzc0VuZCA9IGFzeW5jIGZ1bmN0aW9uIGJyb2FkY2FzdFByb2Nlc3NFbmQgKGludGVudCwgcHJvY2Vzc05hbWUpIHtcbiAgLy8gc3RhcnQgdGhlIGJyb2FkY2FzdCB3aXRob3V0IHdhaXRpbmcgZm9yIGl0IHRvIGZpbmlzaC5cbiAgdGhpcy5icm9hZGNhc3QoaW50ZW50KTtcbiAgLy8gd2FpdCBmb3IgdGhlIHByb2Nlc3MgdG8gZW5kXG4gIGxldCBzdGFydCA9IERhdGUubm93KCk7XG4gIGxldCB0aW1lb3V0TXMgPSA0MDAwMDtcbiAgdHJ5IHtcbiAgICB3aGlsZSAoKERhdGUubm93KCkgLSBzdGFydCkgPCB0aW1lb3V0TXMpIHtcbiAgICAgIGlmIChhd2FpdCB0aGlzLnByb2Nlc3NFeGlzdHMocHJvY2Vzc05hbWUpKSB7XG4gICAgICAgIC8vIGNvb2wgZG93blxuICAgICAgICBhd2FpdCBzbGVlcCg0MDApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBQcm9jZXNzIG5ldmVyIGRpZWQgd2l0aGluICR7dGltZW91dE1zfSBtc2ApO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gYnJvYWRjYXN0IHByb2Nlc3MgZW5kLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogQnJvYWRjYXN0IGEgbWVzc2FnZSB0byB0aGUgZ2l2ZW4gaW50ZW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnRlbnQgLSBUaGUgbmFtZSBvZiB0aGUgaW50ZW50IHRvIGJyb2FkY2FzdCB0by5cbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiBpbnRlbnQgbmFtZSBpcyBub3QgYSB2YWxpZCBjbGFzcyBuYW1lLlxuICovXG5tZXRob2RzLmJyb2FkY2FzdCA9IGFzeW5jIGZ1bmN0aW9uIGJyb2FkY2FzdCAoaW50ZW50KSB7XG4gIGlmICghdGhpcy5pc1ZhbGlkQ2xhc3MoaW50ZW50KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBpbnRlbnQgJHtpbnRlbnR9YCk7XG4gIH1cbiAgbG9nLmRlYnVnKGBCcm9hZGNhc3Rpbmc6ICR7aW50ZW50fWApO1xuICBhd2FpdCB0aGlzLnNoZWxsKFsnYW0nLCAnYnJvYWRjYXN0JywgJy1hJywgaW50ZW50XSk7XG59O1xuXG4vKipcbiAqIEtpbGwgQW5kcm9pZCBpbnN0cnVtZW50cyBpZiB0aGV5IGFyZSBjdXJyZW50bHkgcnVubmluZy5cbiAqL1xubWV0aG9kcy5lbmRBbmRyb2lkQ292ZXJhZ2UgPSBhc3luYyBmdW5jdGlvbiBlbmRBbmRyb2lkQ292ZXJhZ2UgKCkge1xuICBpZiAodGhpcy5pbnN0cnVtZW50UHJvYyAmJiB0aGlzLmluc3RydW1lbnRQcm9jLmlzUnVubmluZykge1xuICAgIGF3YWl0IHRoaXMuaW5zdHJ1bWVudFByb2Muc3RvcCgpO1xuICB9XG59O1xuXG4vKipcbiAqIEluc3RydW1lbnQgdGhlIHBhcnRpY3VsYXIgYWN0aXZpdHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIGJlIGluc3RydW1lbnRlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpdml0eSAtIFRoZSBuYW1lIG9mIHRoZSBtYWluIGFjdGl2aXR5IGluIHRoaXMgcGFja2FnZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnN0cnVtZW50V2l0aCAtIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIGluc3RydW1lbnRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhY3Rpdml0eSB3aXRoLlxuICogQHRocm93cyB7ZXJyb3J9IElmIGFueSBleGNlcHRpb24gaXMgcmVwb3J0ZWQgYnkgYWRiIHNoZWxsLlxuICovXG5tZXRob2RzLmluc3RydW1lbnQgPSBhc3luYyBmdW5jdGlvbiBpbnN0cnVtZW50IChwa2csIGFjdGl2aXR5LCBpbnN0cnVtZW50V2l0aCkge1xuICBpZiAoYWN0aXZpdHlbMF0gIT09ICcuJykge1xuICAgIHBrZyA9ICcnO1xuICB9XG4gIGxldCBwa2dBY3Rpdml0eSA9IChwa2cgKyBhY3Rpdml0eSkucmVwbGFjZSgvXFwuKy9nLCAnLicpOyAvLyBGaXggcGtnLi5hY3Rpdml0eSBlcnJvclxuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5zaGVsbChbXG4gICAgJ2FtJywgJ2luc3RydW1lbnQnLFxuICAgICctZScsICdtYWluX2FjdGl2aXR5JyxcbiAgICBwa2dBY3Rpdml0eSxcbiAgICBpbnN0cnVtZW50V2l0aCxcbiAgXSk7XG4gIGlmIChzdGRvdXQuaW5kZXhPZignRXhjZXB0aW9uJykgIT09IC0xKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGV4Y2VwdGlvbiBkdXJpbmcgaW5zdHJ1bWVudGF0aW9uLiBPcmlnaW5hbCBlcnJvciAke3N0ZG91dC5zcGxpdCgnXFxuJylbMF19YCk7XG4gIH1cbn07XG5cbi8qKlxuICogQ29sbGVjdCBBbmRyb2lkIGNvdmVyYWdlIGJ5IGluc3RydW1lbnRpbmcgdGhlIHBhcnRpY3VsYXIgYWN0aXZpdHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGluc3RydW1lbnRDbGFzcyAtIFRoZSBuYW1lIG9mIHRoZSBpbnN0cnVtZW50YXRpb24gY2xhc3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gd2FpdFBrZyAtIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIGJlIGluc3RydW1lbnRlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB3YWl0QWN0aXZpdHkgLSBUaGUgbmFtZSBvZiB0aGUgbWFpbiBhY3Rpdml0eSBpbiB0aGlzIHBhY2thZ2UuXG4gKlxuICogQHJldHVybiB7cHJvbWlzZX0gVGhlIHByb21pc2UgaXMgc3VjY2Vzc2Z1bGx5IHJlc29sdmVkIGlmIHRoZSBpbnN0cnVtZW50YXRpb24gc3RhcnRzXG4gKiAgICAgICAgICAgICAgICAgICB3aXRob3V0IGVycm9ycy5cbiAqL1xubWV0aG9kcy5hbmRyb2lkQ292ZXJhZ2UgPSBhc3luYyBmdW5jdGlvbiBhbmRyb2lkQ292ZXJhZ2UgKGluc3RydW1lbnRDbGFzcywgd2FpdFBrZywgd2FpdEFjdGl2aXR5KSB7XG4gIGlmICghdGhpcy5pc1ZhbGlkQ2xhc3MoaW5zdHJ1bWVudENsYXNzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjbGFzcyAke2luc3RydW1lbnRDbGFzc31gKTtcbiAgfVxuICByZXR1cm4gYXdhaXQgbmV3IEIoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGxldCBhcmdzID0gdGhpcy5leGVjdXRhYmxlLmRlZmF1bHRBcmdzXG4gICAgICAuY29uY2F0KFsnc2hlbGwnLCAnYW0nLCAnaW5zdHJ1bWVudCcsICctZScsICdjb3ZlcmFnZScsICd0cnVlJywgJy13J10pXG4gICAgICAuY29uY2F0KFtpbnN0cnVtZW50Q2xhc3NdKTtcbiAgICBsb2cuZGVidWcoYENvbGxlY3RpbmcgY292ZXJhZ2UgZGF0YSB3aXRoOiAke1t0aGlzLmV4ZWN1dGFibGUucGF0aF0uY29uY2F0KGFyZ3MpLmpvaW4oJyAnKX1gKTtcbiAgICB0cnkge1xuICAgICAgLy8gYW0gaW5zdHJ1bWVudCBydW5zIGZvciB0aGUgbGlmZSBvZiB0aGUgYXBwIHByb2Nlc3MuXG4gICAgICB0aGlzLmluc3RydW1lbnRQcm9jID0gbmV3IFN1YlByb2Nlc3ModGhpcy5leGVjdXRhYmxlLnBhdGgsIGFyZ3MpO1xuICAgICAgYXdhaXQgdGhpcy5pbnN0cnVtZW50UHJvYy5zdGFydCgwKTtcbiAgICAgIHRoaXMuaW5zdHJ1bWVudFByb2Mub24oJ291dHB1dCcsIChzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgICAgICBpZiAoc3RkZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIHJ1biBpbnN0cnVtZW50YXRpb24uIE9yaWdpbmFsIGVycm9yOiAke3N0ZGVycn1gKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yQWN0aXZpdHkod2FpdFBrZywgd2FpdEFjdGl2aXR5KTtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZWplY3QobmV3IEVycm9yKGBBbmRyb2lkIGNvdmVyYWdlIGZhaWxlZC4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApKTtcbiAgICB9XG4gIH0pO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIHBhcnRpY3VsYXIgcHJvcGVydHkgb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4gVGhpcyBuYW1lIHNob3VsZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUga25vd24gdG8gX2FkYiBzaGVsbCBnZXRwcm9wXyB0b29sLlxuICpcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAqL1xubWV0aG9kcy5nZXREZXZpY2VQcm9wZXJ0eSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVByb3BlcnR5IChwcm9wZXJ0eSkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5zaGVsbChbJ2dldHByb3AnLCBwcm9wZXJ0eV0pO1xuICBsZXQgdmFsID0gc3Rkb3V0LnRyaW0oKTtcbiAgbG9nLmRlYnVnKGBDdXJyZW50IGRldmljZSBwcm9wZXJ0eSAnJHtwcm9wZXJ0eX0nOiAke3ZhbH1gKTtcbiAgcmV0dXJuIHZhbDtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gc2V0UHJvcE9wdHNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcHJpdmlsZWdlZCAtIERvIHdlIHJ1biBzZXRQcm9wIGFzIGEgcHJpdmlsZWdlZCBjb21tYW5kPyBEZWZhdWx0IHRydWUuXG4gKi9cblxuLyoqXG4gKiBTZXQgdGhlIHBhcnRpY3VsYXIgcHJvcGVydHkgb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4gVGhpcyBuYW1lIHNob3VsZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUga25vd24gdG8gX2FkYiBzaGVsbCBzZXRwcm9wXyB0b29sLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbCAtIFRoZSBuZXcgcHJvcGVydHkgdmFsdWUuXG4gKiBAcGFyYW0ge3NldFByb3BPcHRzfSBvcHRzXG4gKlxuICogQHRocm93cyB7ZXJyb3J9IElmIF9zZXRwcm9wXyB1dGlsaXR5IGZhaWxzIHRvIGNoYW5nZSBwcm9wZXJ0eSB2YWx1ZS5cbiAqL1xubWV0aG9kcy5zZXREZXZpY2VQcm9wZXJ0eSA9IGFzeW5jIGZ1bmN0aW9uIHNldERldmljZVByb3BlcnR5IChwcm9wLCB2YWwsIG9wdHMgPSB7fSkge1xuICBjb25zdCB7cHJpdmlsZWdlZCA9IHRydWV9ID0gb3B0cztcbiAgbG9nLmRlYnVnKGBTZXR0aW5nIGRldmljZSBwcm9wZXJ0eSAnJHtwcm9wfScgdG8gJyR7dmFsfSdgKTtcbiAgYXdhaXQgdGhpcy5zaGVsbChbJ3NldHByb3AnLCBwcm9wLCB2YWxdLCB7XG4gICAgcHJpdmlsZWdlZCxcbiAgfSk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gQ3VycmVudCBzeXN0ZW0gbGFuZ3VhZ2Ugb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLmdldERldmljZVN5c0xhbmd1YWdlID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlU3lzTGFuZ3VhZ2UgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncGVyc2lzdC5zeXMubGFuZ3VhZ2UnKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfSBDdXJyZW50IGNvdW50cnkgbmFtZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuZ2V0RGV2aWNlU3lzQ291bnRyeSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVN5c0NvdW50cnkgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncGVyc2lzdC5zeXMuY291bnRyeScpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEN1cnJlbnQgc3lzdGVtIGxvY2FsZSBuYW1lIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5nZXREZXZpY2VTeXNMb2NhbGUgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VTeXNMb2NhbGUgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncGVyc2lzdC5zeXMubG9jYWxlJyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gQ3VycmVudCBwcm9kdWN0IGxhbmd1YWdlIG5hbWUgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLmdldERldmljZVByb2R1Y3RMYW5ndWFnZSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVByb2R1Y3RMYW5ndWFnZSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdyby5wcm9kdWN0LmxvY2FsZS5sYW5ndWFnZScpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEN1cnJlbnQgcHJvZHVjdCBjb3VudHJ5IG5hbWUgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLmdldERldmljZVByb2R1Y3RDb3VudHJ5ID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlUHJvZHVjdENvdW50cnkgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncm8ucHJvZHVjdC5sb2NhbGUucmVnaW9uJyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gQ3VycmVudCBwcm9kdWN0IGxvY2FsZSBuYW1lIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5nZXREZXZpY2VQcm9kdWN0TG9jYWxlID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlUHJvZHVjdExvY2FsZSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdyby5wcm9kdWN0LmxvY2FsZScpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBtb2RlbCBuYW1lIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5nZXRNb2RlbCA9IGFzeW5jIGZ1bmN0aW9uIGdldE1vZGVsICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3JvLnByb2R1Y3QubW9kZWwnKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgbWFudWZhY3R1cmVyIG5hbWUgb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLmdldE1hbnVmYWN0dXJlciA9IGFzeW5jIGZ1bmN0aW9uIGdldE1hbnVmYWN0dXJlciAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdyby5wcm9kdWN0Lm1hbnVmYWN0dXJlcicpO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGN1cnJlbnQgc2NyZWVuIHNpemUuXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSBEZXZpY2Ugc2NyZWVuIHNpemUgYXMgc3RyaW5nIGluIGZvcm1hdCAnV3hIJyBvclxuICogICAgICAgICAgICAgICAgICBfbnVsbF8gaWYgaXQgY2Fubm90IGJlIGRldGVybWluZWQuXG4gKi9cbm1ldGhvZHMuZ2V0U2NyZWVuU2l6ZSA9IGFzeW5jIGZ1bmN0aW9uIGdldFNjcmVlblNpemUgKCkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5zaGVsbChbJ3dtJywgJ3NpemUnXSk7XG4gIGxldCBzaXplID0gbmV3IFJlZ0V4cCgvUGh5c2ljYWwgc2l6ZTogKFteXFxyP1xcbl0rKSovZykuZXhlYyhzdGRvdXQpO1xuICBpZiAoc2l6ZSAmJiBzaXplLmxlbmd0aCA+PSAyKSB7XG4gICAgcmV0dXJuIHNpemVbMV0udHJpbSgpO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGN1cnJlbnQgc2NyZWVuIGRlbnNpdHkgaW4gZHBpXG4gKlxuICogQHJldHVybiB7P251bWJlcn0gRGV2aWNlIHNjcmVlbiBkZW5zaXR5IGFzIGEgbnVtYmVyIG9yIF9udWxsXyBpZiBpdFxuICogICAgICAgICAgICAgICAgICBjYW5ub3QgYmUgZGV0ZXJtaW5lZFxuICovXG5tZXRob2RzLmdldFNjcmVlbkRlbnNpdHkgPSBhc3luYyBmdW5jdGlvbiBnZXRTY3JlZW5EZW5zaXR5ICgpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuc2hlbGwoWyd3bScsICdkZW5zaXR5J10pO1xuICBsZXQgZGVuc2l0eSA9IG5ldyBSZWdFeHAoL1BoeXNpY2FsIGRlbnNpdHk6IChbXlxccj9cXG5dKykqL2cpLmV4ZWMoc3Rkb3V0KTtcbiAgaWYgKGRlbnNpdHkgJiYgZGVuc2l0eS5sZW5ndGggPj0gMikge1xuICAgIGxldCBkZW5zaXR5TnVtYmVyID0gcGFyc2VJbnQoZGVuc2l0eVsxXS50cmltKCksIDEwKTtcbiAgICByZXR1cm4gaXNOYU4oZGVuc2l0eU51bWJlcikgPyBudWxsIDogZGVuc2l0eU51bWJlcjtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbi8qKlxuICogU2V0dXAgSFRUUCBwcm94eSBpbiBkZXZpY2UgZ2xvYmFsIHNldHRpbmdzLlxuICogUmVhZCBodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9mcmFtZXdvcmtzL2Jhc2UvKy9hbmRyb2lkLTkuMC4wX3IyMS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5qYXZhIGZvciBlYWNoIHByb3BlcnR5XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3h5SG9zdCAtIFRoZSBob3N0IG5hbWUgb2YgdGhlIHByb3h5LlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBwcm94eVBvcnQgLSBUaGUgcG9ydCBudW1iZXIgdG8gYmUgc2V0LlxuICovXG5tZXRob2RzLnNldEh0dHBQcm94eSA9IGFzeW5jIGZ1bmN0aW9uIHNldEh0dHBQcm94eSAocHJveHlIb3N0LCBwcm94eVBvcnQpIHtcbiAgbGV0IHByb3h5ID0gYCR7cHJveHlIb3N0fToke3Byb3h5UG9ydH1gO1xuICBpZiAoXy5pc1VuZGVmaW5lZChwcm94eUhvc3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYWxsIHRvIHNldEh0dHBQcm94eSBtZXRob2Qgd2l0aCB1bmRlZmluZWQgcHJveHlfaG9zdDogJHtwcm94eX1gKTtcbiAgfVxuICBpZiAoXy5pc1VuZGVmaW5lZChwcm94eVBvcnQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYWxsIHRvIHNldEh0dHBQcm94eSBtZXRob2Qgd2l0aCB1bmRlZmluZWQgcHJveHlfcG9ydCAke3Byb3h5fWApO1xuICB9XG5cbiAgY29uc3QgaHR0cFByb3h5U2V0dGlucyA9IFtcbiAgICBbJ2h0dHBfcHJveHknLCBwcm94eV0sXG4gICAgWydnbG9iYWxfaHR0cF9wcm94eV9ob3N0JywgcHJveHlIb3N0XSxcbiAgICBbJ2dsb2JhbF9odHRwX3Byb3h5X3BvcnQnLCBwcm94eVBvcnRdXG4gIF07XG4gIGZvciAoY29uc3QgW3NldHRpbmdLZXksIHNldHRpbmdWYWx1ZV0gb2YgaHR0cFByb3h5U2V0dGlucykge1xuICAgIGF3YWl0IHRoaXMuc2V0U2V0dGluZygnZ2xvYmFsJywgc2V0dGluZ0tleSwgc2V0dGluZ1ZhbHVlKTtcbiAgfVxufTtcblxuLyoqXG4gKiBEZWxldGUgSFRUUCBwcm94eSBpbiBkZXZpY2UgZ2xvYmFsIHNldHRpbmdzLlxuICogUmVib290aW5nIHRoZSB0ZXN0IGRldmljZSBpcyBuZWNlc3NhcnkgdG8gYXBwbHkgdGhlIGNoYW5nZS5cbiAqL1xubWV0aG9kcy5kZWxldGVIdHRwUHJveHkgPSBhc3luYyBmdW5jdGlvbiBkZWxldGVIdHRwUHJveHkgKCkge1xuICBjb25zdCBodHRwUHJveHlTZXR0aW5zID0gW1xuICAgICdodHRwX3Byb3h5JyxcbiAgICAnZ2xvYmFsX2h0dHBfcHJveHlfaG9zdCcsXG4gICAgJ2dsb2JhbF9odHRwX3Byb3h5X3BvcnQnLFxuICAgICdnbG9iYWxfaHR0cF9wcm94eV9leGNsdXNpb25fbGlzdCcgLy8gYGdsb2JhbF9odHRwX3Byb3h5X2V4Y2x1c2lvbl9saXN0PWAgd2FzIGdlbmVyYXRlZCBieSBgc2V0dGluZ3MgZ2xvYmFsIGh0dG9fcHJveHkgeHh4eGBcbiAgXTtcbiAgZm9yIChjb25zdCBzZXR0aW5nIG9mIGh0dHBQcm94eVNldHRpbnMpIHtcbiAgICBhd2FpdCB0aGlzLnNoZWxsKFsnc2V0dGluZ3MnLCAnZGVsZXRlJywgJ2dsb2JhbCcsIHNldHRpbmddKTtcbiAgfVxufTtcblxuLyoqXG4gKiBTZXQgZGV2aWNlIHByb3BlcnR5LlxuICogW2FuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3Nde0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLmh0bWx9XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVzcGFjZSAtIG9uZSBvZiB7c3lzdGVtLCBzZWN1cmUsIGdsb2JhbH0sIGNhc2UtaW5zZW5zaXRpdmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc2V0dGluZyAtIHByb3BlcnR5IG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHZhbHVlIC0gcHJvcGVydHkgdmFsdWUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IGNvbW1hbmQgb3V0cHV0LlxuICovXG5tZXRob2RzLnNldFNldHRpbmcgPSBhc3luYyBmdW5jdGlvbiBzZXRTZXR0aW5nIChuYW1lc3BhY2UsIHNldHRpbmcsIHZhbHVlKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnNoZWxsKFsnc2V0dGluZ3MnLCAncHV0JywgbmFtZXNwYWNlLCBzZXR0aW5nLCB2YWx1ZV0pO1xufTtcblxuLyoqXG4gKiBHZXQgZGV2aWNlIHByb3BlcnR5LlxuICogW2FuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3Nde0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLmh0bWx9XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVzcGFjZSAtIG9uZSBvZiB7c3lzdGVtLCBzZWN1cmUsIGdsb2JhbH0sIGNhc2UtaW5zZW5zaXRpdmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc2V0dGluZyAtIHByb3BlcnR5IG5hbWUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHByb3BlcnR5IHZhbHVlLlxuICovXG5tZXRob2RzLmdldFNldHRpbmcgPSBhc3luYyBmdW5jdGlvbiBnZXRTZXR0aW5nIChuYW1lc3BhY2UsIHNldHRpbmcpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuc2hlbGwoWydzZXR0aW5ncycsICdnZXQnLCBuYW1lc3BhY2UsIHNldHRpbmddKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGBhZGIgYnVncmVwb3J0YCBjb21tYW5kIG91dHB1dC4gVGhpc1xuICogb3BlcmF0aW9uIG1heSB0YWtlIHVwIHRvIHNldmVyYWwgbWludXRlcy5cbiAqXG4gKiBAcGFyYW0gez9udW1iZXJ9IHRpbWVvdXQgWzEyMDAwMF0gLSBDb21tYW5kIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBDb21tYW5kIHN0ZG91dFxuICovXG5tZXRob2RzLmJ1Z3JlcG9ydCA9IGFzeW5jIGZ1bmN0aW9uIGJ1Z3JlcG9ydCAodGltZW91dCA9IDEyMDAwMCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGJFeGVjKFsnYnVncmVwb3J0J10sIHt0aW1lb3V0fSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNjcmVlbnJlY29yZE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdmlkZW9TaXplIC0gVGhlIGZvcm1hdCBpcyB3aWR0aHhoZWlnaHQuXG4gKiAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRoZSBkZXZpY2UncyBuYXRpdmUgZGlzcGxheSByZXNvbHV0aW9uIChpZiBzdXBwb3J0ZWQpLFxuICogICAgICAgICAgICAgICAgICAxMjgweDcyMCBpZiBub3QuIEZvciBiZXN0IHJlc3VsdHMsXG4gKiAgICAgICAgICAgICAgICAgIHVzZSBhIHNpemUgc3VwcG9ydGVkIGJ5IHlvdXIgZGV2aWNlJ3MgQWR2YW5jZWQgVmlkZW8gQ29kaW5nIChBVkMpIGVuY29kZXIuXG4gKiAgICAgICAgICAgICAgICAgIEZvciBleGFtcGxlLCBcIjEyODB4NzIwXCJcbiAqIEBwcm9wZXJ0eSB7P2Jvb2xlYW59IGJ1Z1JlcG9ydCAtIFNldCBpdCB0byBgdHJ1ZWAgaW4gb3JkZXIgdG8gZGlzcGxheSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIHRoZSB2aWRlbyBvdmVybGF5LFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjaCBhcyBhIHRpbWVzdGFtcCwgdGhhdCBpcyBoZWxwZnVsIGluIHZpZGVvcyBjYXB0dXJlZCB0byBpbGx1c3RyYXRlIGJ1Z3MuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbiBpcyBvbmx5IHN1cHBvcnRlZCBzaW5jZSBBUEkgbGV2ZWwgMjcgKEFuZHJvaWQgUCkuXG4gKiBAcHJvcGVydHkgez9zdHJpbmd8bnVtYmVyfSB0aW1lTGltaXQgLSBUaGUgbWF4aW11bSByZWNvcmRpbmcgdGltZSwgaW4gc2Vjb25kcy5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IChhbmQgbWF4aW11bSkgdmFsdWUgaXMgMTgwICgzIG1pbnV0ZXMpLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfG51bWJlcn0gYml0UmF0ZSAtIFRoZSB2aWRlbyBiaXQgcmF0ZSBmb3IgdGhlIHZpZGVvLCBpbiBtZWdhYml0cyBwZXIgc2Vjb25kLlxuICogICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgNC4gWW91IGNhbiBpbmNyZWFzZSB0aGUgYml0IHJhdGUgdG8gaW1wcm92ZSB2aWRlbyBxdWFsaXR5LFxuICogICAgICAgICAgICAgICAgYnV0IGRvaW5nIHNvIHJlc3VsdHMgaW4gbGFyZ2VyIG1vdmllIGZpbGVzLlxuICovXG5cbi8qKlxuICogSW5pdGlhdGUgc2NyZWVucmVjb3JkIHV0aWxpdHkgb24gdGhlIGRldmljZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXN0aW5hdGlvbiAtIEZ1bGwgcGF0aCB0byB0aGUgd3JpdGFibGUgbWVkaWEgZmlsZSBkZXN0aW5hdGlvblxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gdGhlIGRldmljZSBmaWxlIHN5c3RlbS5cbiAqIEBwYXJhbSB7P1NjcmVlbnJlY29yZE9wdGlvbnN9IG9wdGlvbnMgW3t9XVxuICogQHJldHVybnMge1N1YlByb2Nlc3N9IHNjcmVlbnJlY29yZCBwcm9jZXNzLCB3aGljaCBjYW4gYmUgdGhlbiBjb250cm9sbGVkIGJ5IHRoZSBjbGllbnQgY29kZVxuICovXG5tZXRob2RzLnNjcmVlbnJlY29yZCA9IGZ1bmN0aW9uIHNjcmVlbnJlY29yZCAoZGVzdGluYXRpb24sIG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCBjbWQgPSBbJ3NjcmVlbnJlY29yZCddO1xuICBjb25zdCB7XG4gICAgdmlkZW9TaXplLFxuICAgIGJpdFJhdGUsXG4gICAgdGltZUxpbWl0LFxuICAgIGJ1Z1JlcG9ydCxcbiAgfSA9IG9wdGlvbnM7XG4gIGlmICh1dGlsLmhhc1ZhbHVlKHZpZGVvU2l6ZSkpIHtcbiAgICBjbWQucHVzaCgnLS1zaXplJywgdmlkZW9TaXplKTtcbiAgfVxuICBpZiAodXRpbC5oYXNWYWx1ZSh0aW1lTGltaXQpKSB7XG4gICAgY21kLnB1c2goJy0tdGltZS1saW1pdCcsIHRpbWVMaW1pdCk7XG4gIH1cbiAgaWYgKHV0aWwuaGFzVmFsdWUoYml0UmF0ZSkpIHtcbiAgICBjbWQucHVzaCgnLS1iaXQtcmF0ZScsIGJpdFJhdGUpO1xuICB9XG4gIGlmIChidWdSZXBvcnQpIHtcbiAgICBjbWQucHVzaCgnLS1idWdyZXBvcnQnKTtcbiAgfVxuICBjbWQucHVzaChkZXN0aW5hdGlvbik7XG5cbiAgY29uc3QgZnVsbENtZCA9IFtcbiAgICAuLi50aGlzLmV4ZWN1dGFibGUuZGVmYXVsdEFyZ3MsXG4gICAgJ3NoZWxsJyxcbiAgICAuLi5jbWRcbiAgXTtcbiAgbG9nLmRlYnVnKGBCdWlsZGluZyBzY3JlZW5yZWNvcmQgcHJvY2VzcyB3aXRoIHRoZSBjb21tYW5kIGxpbmU6IGFkYiAke3V0aWwucXVvdGUoZnVsbENtZCl9YCk7XG4gIHJldHVybiBuZXcgU3ViUHJvY2Vzcyh0aGlzLmV4ZWN1dGFibGUucGF0aCwgZnVsbENtZCk7XG59O1xuXG4vKipcbiAqIEV4ZWN1dGVzIHRoZSBnaXZlbiBmdW5jdGlvbiB3aXRoIHRoZSBnaXZlbiBpbnB1dCBtZXRob2QgY29udGV4dFxuICogYW5kIHRoZW4gcmVzdG9yZXMgdGhlIElNRSB0byB0aGUgb3JpZ2luYWwgdmFsdWVcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW1lIC0gVmFsaWQgSU1FIGlkZW50aWZpZXJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gRnVuY3Rpb24gdG8gZXhlY3V0ZVxuICogQHJldHVybnMgeyp9IFRoZSByZXN1bHQgb2YgdGhlIGdpdmVuIGZ1bmN0aW9uXG4gKi9cbm1ldGhvZHMucnVuSW5JbWVDb250ZXh0ID0gYXN5bmMgZnVuY3Rpb24gcnVuSW5JbWVDb250ZXh0IChpbWUsIGZuKSB7XG4gIGNvbnN0IG9yaWdpbmFsSW1lID0gYXdhaXQgdGhpcy5kZWZhdWx0SU1FKCk7XG4gIGlmIChvcmlnaW5hbEltZSA9PT0gaW1lKSB7XG4gICAgbG9nLmRlYnVnKGBUaGUgb3JpZ2luYWwgSU1FIGlzIHRoZSBzYW1lIGFzICcke2ltZX0nLiBUaGVyZSBpcyBubyBuZWVkIHRvIHJlc2V0IGl0YCk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgdGhpcy5lbmFibGVJTUUoaW1lKTtcbiAgICBhd2FpdCB0aGlzLnNldElNRShpbWUpO1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy8xNTk0M1xuICAgIGF3YWl0IEIuZGVsYXkoNTAwKTtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChvcmlnaW5hbEltZSAhPT0gaW1lKSB7XG4gICAgICBhd2FpdCB0aGlzLnNldElNRShvcmlnaW5hbEltZSk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEdldCB0eiBkYXRhYmFzZSB0aW1lIHpvbmUgZm9ybWF0dGVkIHRpbWV6b25lXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVFogZGF0YWJhc2UgVGltZSBab25lcyBmb3JtYXRcbiAqXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgYW55IGV4Y2VwdGlvbiBpcyByZXBvcnRlZCBieSBhZGIgc2hlbGwuXG4gKi9cbm1ldGhvZHMuZ2V0VGltZVpvbmUgPSBhc3luYyBmdW5jdGlvbiBnZXRUaW1lWm9uZSAoKSB7XG4gIGxvZy5kZWJ1ZygnR2V0dGluZyBjdXJyZW50IHRpbWV6b25lJyk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3BlcnNpc3Quc3lzLnRpbWV6b25lJyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGdldHRpbmcgdGltZXpvbmUuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGxpc3Qgb2YgZmVhdHVyZXMgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UgdW5kZXIgdGVzdFxuICpcbiAqIEByZXR1cm5zIHtBcnJheTxzdHJpbmc+fSB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgZmVhdHVyZSBuYW1lcyBvciBhbiBlbXB0eSBsaXN0LlxuICogQW4gZXhhbXBsZSBhZGIgY29tbWFuZCBvdXRwdXQ6XG4gKiBgYGBcbiAqIGNtZFxuICogbHNfdjJcbiAqIGZpeGVkX3B1c2hfbWtkaXJcbiAqIHNoZWxsX3YyXG4gKiBhYmJcbiAqIHN0YXRfdjJcbiAqIGFwZXhcbiAqIGFiYl9leGVjXG4gKiByZW1vdW50X3NoZWxsXG4gKiBmaXhlZF9wdXNoX3N5bWxpbmtfdGltZXN0YW1wXG4gKiBgYGBcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgcmV0cmlldmluZyB0aGUgbGlzdFxuICovXG5tZXRob2RzLmxpc3RGZWF0dXJlcyA9IGFzeW5jIGZ1bmN0aW9uIGxpc3RGZWF0dXJlcyAoKSB7XG4gIHRoaXMuX21lbW9pemVkRmVhdHVyZXMgPSB0aGlzLl9tZW1vaXplZEZlYXR1cmVzXG4gICAgfHwgXy5tZW1vaXplKGFzeW5jICgpID0+IGF3YWl0IHRoaXMuYWRiRXhlYyhbJ2ZlYXR1cmVzJ10pLCAoKSA9PiB0aGlzLmN1ckRldmljZUlkKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuX21lbW9pemVkRmVhdHVyZXMoKSlcbiAgICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgICAubWFwKCh4KSA9PiB4LnRyaW0oKSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoXy5pbmNsdWRlcyhlLnN0ZGVyciwgJ3Vua25vd24gY29tbWFuZCcpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHRocm93IGU7XG4gIH1cbn07XG5cbi8qKlxuICogQ2hlY2tzIHRoZSBzdGF0ZSBvZiBzdHJlYW1lZCBpbnN0YWxsIGZlYXR1cmUuXG4gKiBUaGlzIGZlYXR1cmUgYWxsb3dzIHRvIHNwZWVkIHVwIGFwayBpbnN0YWxsYXRpb25cbiAqIHNpbmNlIGl0IGRvZXMgbm90IHJlcXVpcmUgdGhlIG9yaWdpbmFsIGFwayB0byBiZSBwdXNoZWQgdG9cbiAqIHRoZSBkZXZpY2UgdW5kZXIgdGVzdCBmaXJzdCwgd2hpY2ggYWxzbyBzYXZlcyBzcGFjZS5cbiAqIEFsdGhvdWdoLCBpdCBpcyByZXF1aXJlZCB0aGF0IGJvdGggdGhlIGRldmljZSB1bmRlciB0ZXN0XG4gKiBhbmQgdGhlIGFkYiBzZXJ2ZXIgaGF2ZSB0aGUgbWVudGlvbmVkIGZ1bmN0aW9uYWxpdHkuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2Fvc3AtbWlycm9yL3BsYXRmb3JtX3N5c3RlbV9jb3JlL2Jsb2IvbWFzdGVyL2FkYi9jbGllbnQvYWRiX2luc3RhbGwuY3BwXG4gKiBmb3IgbW9yZSBkZXRhaWxzXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgYm90aCBhZGIgYW5kIHRoZVxuICogZGV2aWNlIHVuZGVyIHRlc3RcbiAqL1xubWV0aG9kcy5pc1N0cmVhbWVkSW5zdGFsbFN1cHBvcnRlZCA9IGFzeW5jIGZ1bmN0aW9uIGlzU3RyZWFtZWRJbnN0YWxsU3VwcG9ydGVkICgpIHtcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcyk7XG4gIHByb3RvLl9oZWxwT3V0cHV0ID0gcHJvdG8uX2hlbHBPdXRwdXQgfHwgYXdhaXQgdGhpcy5hZGJFeGVjKFsnaGVscCddKTtcbiAgcmV0dXJuIHByb3RvLl9oZWxwT3V0cHV0LmluY2x1ZGVzKCctLXN0cmVhbWluZycpXG4gICAgJiYgKGF3YWl0IHRoaXMubGlzdEZlYXR1cmVzKCkpLmluY2x1ZGVzKCdjbWQnKTtcbn07XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgaW5jcmVtZW50YWwgaW5zdGFsbCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSBBREIuXG4gKiBSZWFkIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3ByZXZpZXcvZmVhdHVyZXMjaW5jcmVtZW50YWxcbiAqIGZvciBtb3JlIGRldGFpbHMgb24gaXQuXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgYm90aCBhZGIgYW5kIHRoZVxuICogZGV2aWNlIHVuZGVyIHRlc3RcbiAqL1xubWV0aG9kcy5pc0luY3JlbWVudGFsSW5zdGFsbFN1cHBvcnRlZCA9IGFzeW5jIGZ1bmN0aW9uIGlzSW5jcmVtZW50YWxJbnN0YWxsU3VwcG9ydGVkICgpIHtcbiAgY29uc3Qge2JpbmFyeX0gPSBhd2FpdCB0aGlzLmdldFZlcnNpb24oKTtcbiAgaWYgKCFiaW5hcnkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHV0aWwuY29tcGFyZVZlcnNpb25zKGJpbmFyeS52ZXJzaW9uLCAnPj0nLCAnMzAuMC4xJylcbiAgICAmJiAoYXdhaXQgdGhpcy5saXN0RmVhdHVyZXMoKSkuaW5jbHVkZXMoJ2FiYl9leGVjJyk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbGlzdCBvZiBwYWNrYWdlcyBmcm9tIERvemUgd2hpdGVsaXN0IG9uIEFuZHJvaWQgOCtcbiAqXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gVGhlIGxpc3Qgb2Ygd2hpdGVsaXN0ZWQgcGFja2FnZXMuIEFuIGV4YW1wbGUgb3V0cHV0OlxuICogc3lzdGVtLGNvbS5hbmRyb2lkLnNoZWxsLDIwMDBcbiAqIHN5c3RlbSxjb20uZ29vZ2xlLmFuZHJvaWQuY2VsbGJyb2FkY2FzdHJlY2VpdmVyLDEwMTQzXG4gKiB1c2VyLGlvLmFwcGl1bS5zZXR0aW5ncywxMDE1N1xuICovXG5tZXRob2RzLmdldERldmljZUlkbGVXaGl0ZWxpc3QgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VJZGxlV2hpdGVsaXN0ICgpIHtcbiAgaWYgKGF3YWl0IHRoaXMuZ2V0QXBpTGV2ZWwoKSA8IDIzKSB7XG4gICAgLy8gRG96ZSBtb2RlIGhhcyBvbmx5IGJlZW4gYWRkZWQgc2luY2UgQW5kcm9pZCA2XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgbG9nLmluZm8oJ0xpc3RpbmcgcGFja2FnZXMgaW4gRG96ZSB3aGl0ZWxpc3QnKTtcbiAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgdGhpcy5zaGVsbChbJ2R1bXBzeXMnLCAnZGV2aWNlaWRsZScsICd3aGl0ZWxpc3QnXSk7XG4gIHJldHVybiBfLnRyaW0ob3V0cHV0KS5zcGxpdCgvXFxuLylcbiAgICAubWFwKChsaW5lKSA9PiBfLnRyaW0obGluZSkpXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbn07XG5cbi8qKlxuICogQWRkcyBhbiBleGlzdGluZyBwYWNrYWdlKHMpIGludG8gdGhlIERvemUgd2hpdGVsaXN0IG9uIEFuZHJvaWQgOCtcbiAqXG4gKiBAcGFyYW0gIHsuLi5zdHJpbmd9IHBhY2thZ2VzIE9uZSBvciBtb3JlIHBhY2thZ2VzIHRvIGFkZC4gSWYgdGhlIHBhY2thZ2VcbiAqIGFscmVhZHkgZXhpc3RzIGluIHRoZSB3aGl0ZWxpc3QgdGhlbiBpdCBpcyBvbmx5IGdvaW5nIHRvIGJlIGFkZGVkIG9uY2UuXG4gKiBJZiB0aGUgcGFja2FnZSB3aXRoIHRoZSBnaXZlbiBuYW1lIGlzIG5vdCBpbnN0YWxsZWQvbm90IGtub3duIHRoZW4gYW4gZXJyb3JcbiAqIHdpbGwgYmUgdGhyb3duLlxuICogQHJldHVybnMge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgY29tbWFuZCB0byBhZGQgcGFja2FnZShzKSBoYXMgYmVlbiBleGVjdXRlZFxuICovXG5tZXRob2RzLmFkZFRvRGV2aWNlSWRsZVdoaXRlbGlzdCA9IGFzeW5jIGZ1bmN0aW9uIGFkZFRvRGV2aWNlSWRsZVdoaXRlbGlzdCAoLi4ucGFja2FnZXMpIHtcbiAgaWYgKF8uaXNFbXB0eShwYWNrYWdlcykgfHwgYXdhaXQgdGhpcy5nZXRBcGlMZXZlbCgpIDwgMjMpIHtcbiAgICAvLyBEb3plIG1vZGUgaGFzIG9ubHkgYmVlbiBhZGRlZCBzaW5jZSBBbmRyb2lkIDZcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBsb2cuaW5mbyhgQWRkaW5nICR7dXRpbC5wbHVyYWxpemUoJ3BhY2thZ2UnLCBwYWNrYWdlcy5sZW5ndGgpfSAke0pTT04uc3RyaW5naWZ5KHBhY2thZ2VzKX0gdG8gRG96ZSB3aGl0ZWxpc3RgKTtcbiAgYXdhaXQgdGhpcy5zaGVsbENodW5rcygocGtnKSA9PiBbJ2R1bXBzeXMnLCAnZGV2aWNlaWRsZScsICd3aGl0ZWxpc3QnLCBgKyR7cGtnfWBdLCBwYWNrYWdlcyk7XG4gIHJldHVybiB0cnVlO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgbWV0aG9kcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBLE1BQU1BLHVCQUF1QixHQUFHLElBQUk7QUFDcEMsTUFBTUMseUJBQXlCLEdBQUcsbUNBQW1DO0FBQ3JFLE1BQU1DLG1CQUFtQixHQUFHLENBQzFCRCx5QkFBeUIsRUFDekIscUJBQXFCLENBQ3RCO0FBQ0QsTUFBTUUscUJBQXFCLEdBQUcsRUFBRTtBQUNoQyxNQUFNQyxzQkFBc0IsR0FBRyxDQUM3Qiw4QkFBOEIsRUFDOUIsMEJBQTBCLEVBQzFCLG1CQUFtQixDQUNwQjtBQUNELE1BQU1DLGdCQUFnQixHQUFHLEtBQUs7QUFDOUIsTUFBTUMseUJBQXlCLEdBQUcsTUFBTTtBQUN4QyxNQUFNQyxnQkFBZ0IsR0FBRyxJQUFJQyxNQUFNLENBQUUsVUFBU0gsZ0JBQWlCLFdBQVVDLHlCQUEwQixTQUFRLEVBQUUsR0FBRyxDQUFDO0FBQ2pILE1BQU1HLGdDQUFnQyxHQUFHLEVBQUU7QUFFM0MsTUFBTUMsT0FBTyxHQUFHLENBQUMsQ0FBQzs7QUFnQmxCQSxPQUFPLENBQUNDLFdBQVcsR0FBRyxlQUFlQSxXQUFXLENBQUVDLGNBQWMsRUFBRUMsSUFBSSxFQUFFO0VBQ3RFLE1BQU1DLFFBQVEsR0FBRyxFQUFFO0VBQ25CLElBQUlDLFFBQVEsR0FBRyxFQUFFO0VBQ2pCLEtBQUssTUFBTUMsR0FBRyxJQUFJSCxJQUFJLEVBQUU7SUFDdEIsTUFBTUksT0FBTyxHQUFHTCxjQUFjLENBQUNJLEdBQUcsQ0FBQztJQUNuQyxJQUFJLENBQUNFLGVBQUMsQ0FBQ0Ms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