@tuki-io/tuki-widgets 0.0.205 → 0.0.207

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 (28) hide show
  1. package/esm2020/contact-center/cc-script-editor/components/node-details-sidebar/node-details-sidebar.component.mjs +3 -3
  2. package/esm2020/user-device-manage/src/device-info/device-info.component.mjs +3 -3
  3. package/esm2020/user-manage/src/classes/device.mjs +2 -1
  4. package/esm2020/user-manage/src/device-list/device-row/device-row.component.mjs +3 -3
  5. package/esm2020/users-list/src/app.constants.mjs +3 -1
  6. package/esm2020/users-list/src/services/user.service.mjs +14 -6
  7. package/esm2020/users-list/src/users-list.component.mjs +186 -12
  8. package/fesm2015/tuki-io-tuki-widgets-contact-center.mjs +2 -2
  9. package/fesm2015/tuki-io-tuki-widgets-contact-center.mjs.map +1 -1
  10. package/fesm2015/tuki-io-tuki-widgets-user-device-manage.mjs +2 -2
  11. package/fesm2015/tuki-io-tuki-widgets-user-device-manage.mjs.map +1 -1
  12. package/fesm2015/tuki-io-tuki-widgets-user-manage.mjs +10 -9
  13. package/fesm2015/tuki-io-tuki-widgets-user-manage.mjs.map +1 -1
  14. package/fesm2015/tuki-io-tuki-widgets-users-list.mjs +201 -15
  15. package/fesm2015/tuki-io-tuki-widgets-users-list.mjs.map +1 -1
  16. package/fesm2020/tuki-io-tuki-widgets-contact-center.mjs +2 -2
  17. package/fesm2020/tuki-io-tuki-widgets-contact-center.mjs.map +1 -1
  18. package/fesm2020/tuki-io-tuki-widgets-user-device-manage.mjs +2 -2
  19. package/fesm2020/tuki-io-tuki-widgets-user-device-manage.mjs.map +1 -1
  20. package/fesm2020/tuki-io-tuki-widgets-user-manage.mjs +10 -9
  21. package/fesm2020/tuki-io-tuki-widgets-user-manage.mjs.map +1 -1
  22. package/fesm2020/tuki-io-tuki-widgets-users-list.mjs +199 -15
  23. package/fesm2020/tuki-io-tuki-widgets-users-list.mjs.map +1 -1
  24. package/package.json +1 -1
  25. package/user-manage/src/classes/device.d.ts +1 -0
  26. package/users-list/src/app.constants.d.ts +2 -0
  27. package/users-list/src/services/user.service.d.ts +2 -1
  28. package/users-list/src/users-list.component.d.ts +10 -1
@@ -1,5 +1,5 @@
1
1
  import { Component, EventEmitter, Input, Output, } from '@angular/core';
2
- import { Subject, switchMap, takeUntil, takeWhile, timer } from 'rxjs';
2
+ import { EMPTY, map, Subject, switchMap, takeUntil, takeWhile, timer } from 'rxjs';
3
3
  import { MatTableDataSource } from '@angular/material/table';
4
4
  import { ON_PREM_ID, USER_TYPES_MAP } from './app.constants';
5
5
  import { UserListConfirmDialogComponent } from './user-list-confirm-dialog/user-list-confirm-dialog.component';
@@ -121,11 +121,14 @@ export class UsersListComponent {
121
121
  }
122
122
  this.openUser.emit(user);
123
123
  }
124
- moveUserToMT(user, index) {
124
+ moveUserToMT(user) {
125
125
  if (user && user.siteId && user.userid) {
126
126
  this.moveUserPending = true;
127
127
  this.moveInProgressUserId = user.userid;
128
- this.setStatusToUser(index, 'In Progress');
128
+ const currentIndex = this.getUserIndexById(user.userid);
129
+ if (currentIndex > -1) {
130
+ this.setStatusToUser(currentIndex, 'In Progress');
131
+ }
129
132
  localStorage.setItem(LOCAL_STORAGE.USER_IN_MIGRATION, user.userid);
130
133
  const subscription = this.userService
131
134
  .moveUserToMT(this.customerId, user)
@@ -134,14 +137,14 @@ export class UsersListComponent {
134
137
  this.moveUserIndex = null;
135
138
  if (formId) {
136
139
  localStorage.setItem(LOCAL_STORAGE.MIGRATION_FORM_ID, String(formId));
137
- this.pollMigrationFormStatus(formId, index, () => this.getMigratedUsers());
140
+ this.pollMigrationFormStatusByUserId(formId, user.userid, () => this.getMigratedUsers());
138
141
  }
139
142
  else {
140
143
  this.getMigratedUsers();
141
144
  }
142
145
  }, () => {
143
146
  this.removeUserInMigrationProgress();
144
- this.setStatusToUser(index, 'Migration Error');
147
+ this.setStatusToUser(this.getUserIndexById(user.userid), 'Migration Error');
145
148
  });
146
149
  this.subscriptions.push(subscription);
147
150
  }
@@ -294,7 +297,7 @@ export class UsersListComponent {
294
297
  if (result) {
295
298
  switch (type) {
296
299
  case 'QuickMove':
297
- this.moveUserToMT(user, index);
300
+ this.moveUserToMT(user);
298
301
  break;
299
302
  case 'MT':
300
303
  this.moveUser = user;
@@ -401,6 +404,128 @@ export class UsersListComponent {
401
404
  const value = user?.webexUUID;
402
405
  return value !== null && value !== undefined && String(value).trim().length > 0;
403
406
  }
407
+ buildFirmwareDeviceMap(entity, user) {
408
+ const deviceMap = {};
409
+ const mappedDevices = this.getActivationDevices(entity, user);
410
+ console.log(mappedDevices);
411
+ const devices = [];
412
+ mappedDevices.forEach((rawDevice) => {
413
+ const device = rawDevice;
414
+ // @ts-ignore
415
+ const isEligible = device.isRegistered || device.deviceToUpgrade || device.isEligible;
416
+ devices.push({
417
+ userId: user.userid,
418
+ deviceName: device.name || '',
419
+ deviceType: device.product || device.model || '',
420
+ status: isEligible ? 'ELIGIBLE_TO_UPGRADE' : 'UNREGISTERED',
421
+ errorDescription: '',
422
+ cucmId: user.cucmId,
423
+ feature: 'PERSON',
424
+ selectable: true,
425
+ disabledReason: false ? 'FIRMWARE_UPGRADE.DEVICE_NOT_MIGRATED' : '',
426
+ });
427
+ });
428
+ if (!Object.keys(deviceMap).length) {
429
+ console.debug('Firmware activation: no usable devices found to build deviceMap.');
430
+ }
431
+ devices.forEach((device) => {
432
+ if (!deviceMap[device.cucmId]) {
433
+ deviceMap[device.cucmId] = {};
434
+ }
435
+ if (!deviceMap[device.cucmId][device.feature]) {
436
+ deviceMap[device.cucmId][device.feature] = [];
437
+ }
438
+ deviceMap[device.cucmId][device.feature].push(device.deviceName);
439
+ });
440
+ console.log("dev map ==> ", deviceMap);
441
+ return deviceMap;
442
+ }
443
+ getActivationDevices(entity, user) {
444
+ const migratedEntityDevices = Array.isArray(entity?.devices)
445
+ ? (entity?.devices ?? [])
446
+ : [];
447
+ const entityDevices = Array.isArray(entity?.webexMigrationDevices)
448
+ ? (entity?.webexMigrationDevices ?? [])
449
+ : [];
450
+ const allEntityDevices = [...migratedEntityDevices, ...entityDevices];
451
+ if (allEntityDevices.length) {
452
+ return allEntityDevices;
453
+ }
454
+ // Fallback for partial responses where only list-user devices are available.
455
+ return [
456
+ ...(Array.isArray(user?.devices) ? user.devices : []),
457
+ ...(Array.isArray(user?.deviceProfiles) ? user.deviceProfiles : []),
458
+ ];
459
+ }
460
+ unwrapMigratedDevice(rawDevice) {
461
+ const candidate = rawDevice;
462
+ if (candidate?.device) {
463
+ return {
464
+ ...candidate.device,
465
+ ...candidate,
466
+ };
467
+ }
468
+ return candidate || {};
469
+ }
470
+ isMigratedDeviceEligible(device) {
471
+ const hasEligibilitySignal = device?.isRegistered !== undefined
472
+ || device?.deviceToUpgrade !== undefined
473
+ || device?.isEligible !== undefined;
474
+ if (!hasEligibilitySignal) {
475
+ return true;
476
+ }
477
+ return !!(device?.isRegistered || device?.deviceToUpgrade || device?.isEligible);
478
+ }
479
+ extractCucmId(entity, device, user) {
480
+ const deviceCucmId = Number(device?.cucmId);
481
+ if (Number.isFinite(deviceCucmId) && deviceCucmId > 0) {
482
+ return deviceCucmId;
483
+ }
484
+ const userCucmId = Number(user?.cucmId);
485
+ if (Number.isFinite(userCucmId)) {
486
+ return userCucmId;
487
+ }
488
+ const entityCucmId = Number(entity?.cucmId);
489
+ if (Number.isFinite(entityCucmId)) {
490
+ return entityCucmId;
491
+ }
492
+ return null;
493
+ }
494
+ resolveMigratedDeviceKey(device) {
495
+ return String(device?.name ||
496
+ device?.mac ||
497
+ device?.deviceId ||
498
+ device?.cisUuid ||
499
+ device?.id ||
500
+ '').trim();
501
+ }
502
+ extractMigratedDeviceLines(device) {
503
+ const values = new Set();
504
+ const lineAssociations = Array.isArray(device?.lineAssociations) ? device.lineAssociations : [];
505
+ lineAssociations.forEach((lineAssociation) => {
506
+ const directoryNumber = lineAssociation?.directoryNumber?.directoryNumber;
507
+ const templateDirectoryNumber = lineAssociation?.directoryNumber?.templateDirectoryNumber;
508
+ const e164Mask = lineAssociation?.e164Mask;
509
+ [directoryNumber, templateDirectoryNumber, e164Mask].forEach((value) => {
510
+ const normalized = String(value || '').trim();
511
+ if (normalized) {
512
+ values.add(normalized);
513
+ }
514
+ });
515
+ });
516
+ const lines = Array.isArray(device?.lines) ? device.lines : [];
517
+ lines.forEach((line) => {
518
+ const directoryNumber = line?.directoryNumber?.directoryNumber;
519
+ const templateDirectoryNumber = line?.directoryNumber?.templateDirectoryNumber;
520
+ [directoryNumber, templateDirectoryNumber].forEach((value) => {
521
+ const normalized = String(value || '').trim();
522
+ if (normalized) {
523
+ values.add(normalized);
524
+ }
525
+ });
526
+ });
527
+ return Array.from(values);
528
+ }
404
529
  onFirmwareUpgradeClicked(user) {
405
530
  if (!this.isValidWebexUuid(user) || user.status !== 'Inactive') {
406
531
  return;
@@ -417,9 +542,21 @@ export class UsersListComponent {
417
542
  dialogRef.beforeClosed().subscribe((result) => {
418
543
  if (result) {
419
544
  this.setUserPendingStatus(user, 'Pending Activation');
420
- // TODO: Replace with activation API once available.
421
- timer(1500)
422
- .pipe(takeUntil(this.destroy$))
545
+ this.userService
546
+ .getMigratedMigrationFormEntities(this.customerId, user.webexUUID || '', 'PERSON')
547
+ .pipe(takeUntil(this.destroy$), map((entities) => {
548
+ return Array.isArray(entities) ? entities[0] : entities || null;
549
+ }), switchMap((entity) => {
550
+ const formId = entity?.migrationFormId ?? entity?.id ?? null;
551
+ if (!formId) {
552
+ this.setUserPendingStatus(user, 'Inactive');
553
+ this.notifications.error('Activation failed. Migration form not found.');
554
+ return EMPTY;
555
+ }
556
+ const deviceMap = this.buildFirmwareDeviceMap(entity, user);
557
+ console.log('device map ==> ', deviceMap);
558
+ return this.userService.triggerFirmwareUpgrade(this.customerId, Number(formId), deviceMap);
559
+ }), switchMap(() => timer(120000)))
423
560
  .subscribe({
424
561
  next: () => {
425
562
  this.setUserPendingStatus(user, 'Active');
@@ -437,8 +574,7 @@ export class UsersListComponent {
437
574
  onRevertClicked(user) {
438
575
  if (user?.webexUUID) {
439
576
  this.setUserPendingStatus(user, 'Pending Deactivation');
440
- this.userService.swapStatuses(this.customerId, user.email || '')
441
- // this.userService.revertMigration(this.customerId, user.webexUUID)
577
+ this.userService.revertMigration(this.customerId, user.webexUUID)
442
578
  .pipe(takeUntil(this.destroy$), switchMap(() => timer(2000)))
443
579
  .subscribe({
444
580
  next: () => {
@@ -482,6 +618,44 @@ export class UsersListComponent {
482
618
  });
483
619
  this.subscriptions.push(subscription);
484
620
  }
621
+ pollMigrationFormStatusByUserId(formId, userId, onCompleted) {
622
+ const subscription = timer(0, 5000)
623
+ .pipe(switchMap(() => this.userService.getMigrationFormStatus(this.customerId, formId)), takeUntil(this.destroy$), takeWhile((response) => {
624
+ const status = response?.status;
625
+ return !this.isMigrationStatusCompleted(status) && !this.isMigrationStatusFailed(status);
626
+ }, true))
627
+ .subscribe({
628
+ next: (response) => {
629
+ const status = response?.status;
630
+ const index = this.getUserIndexById(userId);
631
+ if (this.isMigrationStatusFailed(status)) {
632
+ this.removeUserInMigrationProgress();
633
+ if (index > -1) {
634
+ this.setStatusToUser(index, 'Migration Error');
635
+ }
636
+ return;
637
+ }
638
+ if (this.isMigrationStatusCompleted(status)) {
639
+ this.removeUserInMigrationProgress();
640
+ if (index > -1) {
641
+ this.setStatusToUser(index, 'Active');
642
+ }
643
+ onCompleted();
644
+ }
645
+ },
646
+ error: () => {
647
+ const index = this.getUserIndexById(userId);
648
+ this.removeUserInMigrationProgress();
649
+ if (index > -1) {
650
+ this.setStatusToUser(index, 'Migration Error');
651
+ }
652
+ },
653
+ });
654
+ this.subscriptions.push(subscription);
655
+ }
656
+ getUserIndexById(userId) {
657
+ return this.users?.findIndex((user) => user.userid === userId) ?? -1;
658
+ }
485
659
  setOriginalUserStatus(email = '', status) {
486
660
  const originalUser = this.users.find((user) => user.email === email && !user.webexUUID);
487
661
  if (originalUser) {
@@ -511,4 +685,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
511
685
  }], host: [{
512
686
  type: Input
513
687
  }] } });
514
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlcnMtbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90dWtpL3dpZGdldHMvdXNlcnMtbGlzdC9zcmMvdXNlcnMtbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90dWtpL3dpZGdldHMvdXNlcnMtbGlzdC9zcmMvdXNlcnMtbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBS3ZCLE9BQU8sRUFBZ0IsT0FBTyxFQUFnQixTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHbkcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHN0QsT0FBTyxFQUFlLFVBQVUsRUFBRSxjQUFjLEVBQW1CLE1BQU0saUJBQWlCLENBQUM7QUFFM0YsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sK0RBQStELENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUUvRyxNQUFNLGNBQWMsR0FBRztJQUNyQixNQUFNO0lBQ04sT0FBTztJQUNQLFFBQVE7SUFDUixrQkFBa0I7SUFDbEIsTUFBTTtJQUNOLFFBQVE7SUFDUixTQUFTO0NBQ1YsQ0FBQztBQUNGLE1BQU0sYUFBYSxHQUFHO0lBQ3BCLGlCQUFpQixFQUFFLG1CQUFtQjtJQUN0QyxpQkFBaUIsRUFBRSxpQkFBaUI7Q0FDckMsQ0FBQztBQU9GLE1BQU0sT0FBTyxrQkFBa0I7SUE0QjdCLGlCQUFpQjtRQUNmLE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdkIsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNqQyxN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QUNFLGdCQUFnQjtvUEFLakIsS0FBSztzQkFBYixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUVJLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFFRSxJQUFJO3NCQUFaLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3VzZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IEFQSVNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2FwaS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvbm90aWZpY2F0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgc3dpdGNoTWFwLCB0YWtlVW50aWwsIHRha2VXaGlsZSwgdGltZXIgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgVXNlcnNTZWFyY2hTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy91c2Vycy1zZWFyY2guc2VydmljZSc7XHJcbmltcG9ydCB7IExpc3RVc2VyIH0gZnJvbSAnLi9jbGFzc2VzL3VzZXItbGlzdCc7XHJcbmltcG9ydCB7IE1hdFRhYmxlRGF0YVNvdXJjZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcclxuaW1wb3J0IHsgUGFnZUV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcclxuaW1wb3J0IHsgQXBpV2ViZXhTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9hcGktd2ViZXguc2VydmljZSc7XHJcbmltcG9ydCB7IE1BWF9JTlRFR0VSLCBPTl9QUkVNX0lELCBVU0VSX1RZUEVTX01BUCwgVVNFUl9UWVBFU19UWVBFIH0gZnJvbSAnLi9hcHAuY29uc3RhbnRzJztcclxuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgVXNlckxpc3RDb25maXJtRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi91c2VyLWxpc3QtY29uZmlybS1kaWFsb2cvdXNlci1saXN0LWNvbmZpcm0tZGlhbG9nLmNvbXBvbmVudCc7XHJcblxyXG5jb25zdCBESVNQTEFZRURfQ09MUyA9IFtcclxuICAnbmFtZScsXHJcbiAgJ2VtYWlsJyxcclxuICAnc3RhdHVzJyxcclxuICAnbGFzdC1hY3RpdmUtdGltZScsXHJcbiAgJ3JvbGUnLFxyXG4gICdzb3VyY2UnLFxyXG4gICdhY3Rpb25zJyxcclxuXTtcclxuY29uc3QgTE9DQUxfU1RPUkFHRSA9IHtcclxuICBVU0VSX0lOX01JR1JBVElPTjogJ3VzZXJJZEluTWlncmF0aW9uJyxcclxuICBNSUdSQVRJT05fRk9STV9JRDogJ21pZ3JhdGlvbkZvcm1JZCcsXHJcbn07XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC11c2Vycy1saXN0JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdXNlcnMtbGlzdC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdXNlcnMtbGlzdC5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVXNlcnNMaXN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBJbnB1dCgpIHRva2VuITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGN1c3RvbWVySWQhOiBudW1iZXI7XHJcbiAgQElucHV0KCkgc2l0ZUlkITogbnVtYmVyO1xyXG5cclxuICBAT3V0cHV0KCkgb3BlblVzZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIHVzZXJNb3ZlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgc3dpdGNoVG9XaXphcmQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIGNyZWF0ZVVzZXJSZXF1ZXN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gIEBJbnB1dCgpIGhvc3QhOiBzdHJpbmc7XHJcblxyXG4gIGRhdGFQZW5kaW5nITogYm9vbGVhbjtcclxuICBtb3ZlSW5Qcm9ncmVzc1VzZXJJZCE6IHN0cmluZztcclxuICB1c2VycyE6IExpc3RVc2VyW107XHJcbiAgZGF0YVNvdXJjZSE6IE1hdFRhYmxlRGF0YVNvdXJjZTxMaXN0VXNlcj47XHJcbiAgZGlzcGxheWVkQ29sdW1ucyA9IERJU1BMQVlFRF9DT0xTO1xyXG4gIG1vdmVVc2VyOiBhbnk7XHJcbiAgbW92ZVVzZXJJbmRleDogYW55O1xyXG4gIHNob3dNb3ZlVXNlcldpemFyZCA9IGZhbHNlO1xyXG4gIG1vdmVVc2VyUGVuZGluZyA9IGZhbHNlO1xyXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcclxuXHJcbiAgcHVibGljIHJlYWRvbmx5IE9OX1BSRU1fSUQgPSBPTl9QUkVNX0lEO1xyXG5cclxuICB0b3RhbFVzZXJzQ291bnQ6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIGdldFRvZGF5U2hvcnREYXRlKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xyXG4gICAgY29uc3QgbW9udGggPSBub3cuZ2V0TW9udGgoKSArIDE7XHJcbiAgICBjb25zdCBkYXkgPSBub3cuZ2V0RGF0ZSgpO1xyXG4gICAgY29uc3QgeWVhciA9IG5vdy5nZXRGdWxsWWVhcigpICUgMTAwO1xyXG4gICAgcmV0dXJuIGAke21vbnRofS8ke2RheX0vJHt5ZWFyLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKX1gO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc01pZ3JhdGlvblN0YXR1c0NvbXBsZXRlZChzdGF0dXM6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoc3RhdHVzIHx8ICcnKS50b1VwcGVyQ2FzZSgpID09PSAnQ09NUExFVEVEJztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNNaWdyYXRpb25TdGF0dXNGYWlsZWQoc3RhdHVzOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBub3JtYWxpemVkID0gKHN0YXR1cyB8fCAnJykudG9VcHBlckNhc2UoKTtcclxuICAgIHJldHVybiBub3JtYWxpemVkID09PSAnRkFJTEVEJyB8fCBub3JtYWxpemVkID09PSAnRVJST1InO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZvcm0oKTogRm9ybUdyb3VwIHtcclxuICAgIHJldHVybiB0aGlzLnVzZXJTZXJ2aWNlPy51c2VyPy5mb3JtO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBhcGlTZXJ2aWNlOiBBUElTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBhcGlXZWJleFNlcnZpY2U6IEFwaVdlYmV4U2VydmljZSxcclxuICAgIHByaXZhdGUgbm90aWZpY2F0aW9uczogTm90aWZpY2F0aW9uU2VydmljZSxcclxuICAgIHB1YmxpYyB1c2Vyc1NlYXJjaFNlcnZpY2U6IFVzZXJzU2VhcmNoU2VydmljZSxcclxuICAgIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csXHJcbiAgKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnVzZXJzU2VhcmNoU2VydmljZS5zZXREZWZhdWx0VmFsdWVzKCk7XHJcbiAgICB0aGlzLnVzZXJzU2VhcmNoU2VydmljZS5jdXN0b21lcklkID0gdGhpcy5jdXN0b21lcklkO1xyXG4gICAgdGhpcy51c2Vyc1NlYXJjaFNlcnZpY2Uuc2l0ZUlkID0gdGhpcy5zaXRlSWQ7XHJcbiAgICB0aGlzLmFwaVNlcnZpY2UudG9rZW4gPSB0aGlzLnRva2VuO1xyXG4gICAgdGhpcy5hcGlXZWJleFNlcnZpY2UudG9rZW4gPSB0aGlzLnRva2VuO1xyXG4gICAgdGhpcy5hcGlTZXJ2aWNlLmFwaVVybCA9IHRoaXMuaG9zdCArICcvZGNwJztcclxuICAgIHRoaXMuYXBpV2ViZXhTZXJ2aWNlLmFwaVVybCA9IHRoaXMuaG9zdCArICcvd2ViZXgnO1xyXG5cclxuICAgIHRoaXMuZ2V0TWlncmF0ZWRVc2VycygpO1xyXG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gdGhpcy51c2Vyc1NlYXJjaFNlcnZpY2UuZm91bmRVc2VycyQuc3Vic2NyaWJlKFxyXG4gICAgICAodXNlcnM6IExpc3RVc2VyW10pID0+IHtcclxuICAgICAgICB0aGlzLmluaXRpYWxpemVEYXRhU291cmNlKHVzZXJzKTtcclxuICAgICAgfSxcclxuICAgICk7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChzdWJzY3JpcHRpb24pO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKCd1c2VycyBsaXN0IHBhcmlzIDc3NzMnKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9ucz8ubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzdWJzY3JpcHRpb24pID0+IHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpKTtcclxuICAgIH1cclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgcGFnZU51bWJlckNoYW5nZUV2ZW50KHBlclBhZ2VOdW1iZXI6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy51c2Vyc1NlYXJjaFNlcnZpY2UucGFnZVNpemUgPSBwZXJQYWdlTnVtYmVyO1xyXG4gICAgdGhpcy51c2Vyc1NlYXJjaFNlcnZpY2UucGFnZUluZGV4ID0gMDtcclxuICAgIHRoaXMucnVuU2VhcmNoKCk7XHJcbiAgfVxyXG5cclxuICBjbG9zZU1vdmVVc2VyV2l6YXJkKGFmdGVyVXNlck1vdmU/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLm1vdmVVc2VyID0gbnVsbDtcclxuICAgIHRoaXMubW92ZVVzZXJJbmRleCA9IG51bGw7XHJcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShMT0NBTF9TVE9SQUdFLlVTRVJfSU5fTUlHUkFUSU9OKTtcclxuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKExPQ0FMX1NUT1JBR0UuTUlHUkFUSU9OX0ZPUk1fSUQpO1xyXG4gICAgdGhpcy5zaG93TW92ZVVzZXJXaXphcmQgPSBmYWxzZTtcclxuICAgIHRoaXMuc3dpdGNoVG9XaXphcmQuZW1pdChmYWxzZSk7XHJcbiAgICBpZiAoYWZ0ZXJVc2VyTW92ZSkge1xyXG4gICAgICB0aGlzLmdldE1pZ3JhdGVkVXNlcnMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHBhZ2VFdmVudChldmVudDogUGFnZUV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLnVzZXJzU2VhcmNoU2VydmljZS5wYWdlU2l6ZSA9IGV2ZW50LnBhZ2VTaXplO1xyXG4gICAgdGhpcy51c2Vyc1NlYXJjaFNlcnZpY2UucGFnZUluZGV4ID0gZXZlbnQucGFnZUluZGV4O1xyXG4gICAgdGhpcy5ydW5TZWFyY2goKTtcclxuICB9XHJcblxyXG4gIG9uVXNlckNsaWNrKHVzZXI6IExpc3RVc2VyKTogdm9pZCB7XHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnaXNXZWJleCcsIFN0cmluZyghIXVzZXIud2ViZXhVVUlEKSk7XHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnd2ViZXhVVUlEJywgJ251bGwnKTtcclxuICAgIGlmICh1c2VyLndlYmV4VVVJRCkge1xyXG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnd2ViZXhVVUlEJywgU3RyaW5nKHVzZXIud2ViZXhVVUlEKSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLm9wZW5Vc2VyLmVtaXQodXNlcik7XHJcbiAgfVxyXG5cclxuICBtb3ZlVXNlclRvTVQodXNlcjogTGlzdFVzZXIsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh1c2VyICYmIHVzZXIuc2l0ZUlkICYmIHVzZXIudXNlcmlkKSB7XHJcbiAgICAgIHRoaXMubW92ZVVzZXJQZW5kaW5nID0gdHJ1ZTtcclxuICAgICAgdGhpcy5tb3ZlSW5Qcm9ncmVzc1VzZXJJZCA9IHVzZXIudXNlcmlkO1xyXG4gICAgICB0aGlzLnNldFN0YXR1c1RvVXNlcihpbmRleCwgJ0luIFByb2dyZXNzJyk7XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKExPQ0FMX1NUT1JBR0UuVVNFUl9JTl9NSUdSQVRJT04sIHVzZXIudXNlcmlkKTtcclxuXHJcbiAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHRoaXMudXNlclNlcnZpY2VcclxuICAgICAgICAubW92ZVVzZXJUb01UKHRoaXMuY3VzdG9tZXJJZCwgdXNlcilcclxuICAgICAgICAuc3Vic2NyaWJlKFxyXG4gICAgICAgICAgKGZvcm1JZDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubW92ZVVzZXIgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLm1vdmVVc2VySW5kZXggPSBudWxsO1xyXG4gICAgICAgICAgICBpZiAoZm9ybUlkKSB7XHJcbiAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oTE9DQUxfU1RPUkFHRS5NSUdSQVRJT05fRk9STV9JRCwgU3RyaW5nKGZvcm1JZCkpO1xyXG4gICAgICAgICAgICAgIHRoaXMucG9sbE1pZ3JhdGlvbkZvcm1TdGF0dXMoZm9ybUlkLCBpbmRleCwgKCkgPT4gdGhpcy5nZXRNaWdyYXRlZFVzZXJzKCkpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMuZ2V0TWlncmF0ZWRVc2VycygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZVVzZXJJbk1pZ3JhdGlvblByb2dyZXNzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdHVzVG9Vc2VyKGluZGV4LCAnTWlncmF0aW9uIEVycm9yJyk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICk7XHJcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHN1YnNjcmlwdGlvbik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBtb3ZlVXNlclRvREkodXNlcjogTGlzdFVzZXIsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh1c2VyICYmIHVzZXIuc2l0ZUlkICYmIHVzZXIud2ViZXhVVUlEKSB7XHJcbiAgICAgIHRoaXMubW92ZVVzZXJQZW5kaW5nID0gdHJ1ZTtcclxuICAgICAgdGhpcy5tb3ZlSW5Qcm9ncmVzc1VzZXJJZCA9IHVzZXIudXNlcmlkO1xyXG4gICAgICB0aGlzLnVzZXJzW2luZGV4XS5zdGF0dXMgPSAnSW4gUHJvZ3Jlc3MnO1xyXG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShMT0NBTF9TVE9SQUdFLlVTRVJfSU5fTUlHUkFUSU9OLCB1c2VyLnVzZXJpZCk7XHJcblxyXG4gICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSB0aGlzLnVzZXJTZXJ2aWNlXHJcbiAgICAgICAgLm1vdmVVc2VyVG9ESSh0aGlzLmN1c3RvbWVySWQsIHVzZXIpXHJcbiAgICAgICAgLnN1YnNjcmliZShcclxuICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVVc2VySW5NaWdyYXRpb25Qcm9ncmVzcygpO1xyXG4gICAgICAgICAgICB0aGlzLnNldFN0YXR1c1RvVXNlcihpbmRleCwgJ0FjdGl2ZScpO1xyXG4gICAgICAgICAgICB0aGlzLnVzZXJzW2luZGV4XS53ZWJleFVVSUQgPSAnJztcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgIHRoaXMudXNlcnNTZWFyY2hTZXJ2aWNlLm1pZ3JhdGVkVXNlcnMgJiZcclxuICAgICAgICAgICAgICB0aGlzLnVzZXJzU2VhcmNoU2VydmljZS5taWdyYXRlZFVzZXJzLmxlbmd0aFxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICB0aGlzLnVzZXJzU2VhcmNoU2VydmljZS5taWdyYXRlZFVzZXJzID1cclxuICAgICAgICAgICAgICAgIHRoaXMudXNlcnNTZWFyY2hTZXJ2aWNlLm1pZ3JhdGVkVXNlcnMuZmlsdGVyKFxyXG4gICAgICAgICAgICAgICAgICAobWlncmF0ZWRVc2VyOiBhbnkpID0+IG1pZ3JhdGVkVXNlci51c2VyaWQgIT09IHVzZXIuZW1haWwsXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZVVzZXJJbk1pZ3JhdGlvblByb2dyZXNzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdHVzVG9Vc2VyKGluZGV4LCAnTWlncmF0aW9uIEVycm9yJyk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChzdWJzY3JpcHRpb24pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW1vdmVVc2VySW5NaWdyYXRpb25Qcm9ncmVzcygpOiB2b2lkIHtcclxuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKExPQ0FMX1NUT1JBR0UuVVNFUl9JTl9NSUdSQVRJT04pO1xyXG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oTE9DQUxfU1RPUkFHRS5NSUdSQVRJT05fRk9STV9JRCk7XHJcbiAgICB0aGlzLm1vdmVJblByb2dyZXNzVXNlcklkID0gJyc7XHJcbiAgICB0aGlzLm1vdmVVc2VyUGVuZGluZyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRTdGF0dXNUb1VzZXIoaW5kZXg6IG51bWJlciwgc3RhdHVzOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnVzZXJzICYmIHRoaXMudXNlcnNbaW5kZXhdKSB7XHJcbiAgICAgIHRoaXMudXNlcnNbaW5kZXhdLnN0YXR1cyA9IHN0YXR1cztcclxuICAgICAgLy8gaWYgKHN0YXR1cyA9PT0gJ01pZ3JhdGVkJykge1xyXG4gICAgICAvLyAgIHRoaXMudXNlcnNbaW5kZXhdLnJvbGVOYW1lID0gJyc7XHJcbiAgICAgIC8vICAgdGhpcy51c2Vyc1tpbmRleF0uaXNNaWdyYXRlZCA9IHRydWU7XHJcbiAgICAgIC8vICAgdGhpcy51c2Vyc1tpbmRleF0uc3RhdHVzID0gc3RhdHVzO1xyXG4gICAgICAvLyB9IGVsc2Uge1xyXG4gICAgICAvLyAgIHRoaXMudXNlcnNbaW5kZXhdLnJvbGVOYW1lID0gJ0RlZGljYXRlZCBJbnN0YW5jZSBDYWxsaW5nIHVzZXInO1xyXG4gICAgICAvLyAgIHRoaXMudXNlcnNbaW5kZXhdLmlzTWlncmF0ZWQgPSBmYWxzZTtcclxuICAgICAgLy8gICB0aGlzLnVzZXJzW2luZGV4XS5zdGF0dXMgPSBzdGF0dXM7XHJcbiAgICAgIC8vIH1cclxuICAgIH1cclxuICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UodGhpcy51c2Vycyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRpYWxpemVEYXRhU291cmNlKHVzZXJzOiBMaXN0VXNlcltdKTogdm9pZCB7XHJcbiAgICBpZiAodXNlcnM/Lmxlbmd0aCkge1xyXG4gICAgICAvLyB0aGlzLnNldFJhbmRvbVVzZXJSb2xlKHVzZXJzKTtcclxuICAgICAgdGhpcy51c2VycyA9IHVzZXJzO1xyXG4gICAgICAvLyBzZXQgdG90YWwgcm93cyBjb3VudCBmb3IgdG9vbGJhci9wYWdpbmF0aW9uIGZyb20gc2VydmVyLXNpZGUgcGFnaW5hdGlvbiB3aGVuIGF2YWlsYWJsZVxyXG4gICAgICB0aGlzLnRvdGFsVXNlcnNDb3VudCA9IHRoaXMudXNlcnNTZWFyY2hTZXJ2aWNlPy50b3RhbCB8fCB1c2Vycy5sZW5ndGg7XHJcbiAgICAgIHRoaXMuc2V0VXNlck1pZ3JhdGlvblByb2dyZXNzKCk7XHJcbiAgICAgIHRoaXMudXNlcnNTZWFyY2hTZXJ2aWNlLnNldE1pZ3JhdGVkUHJvcFRvVXNlcnModGhpcy51c2Vycyk7XHJcbiAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UodXNlcnMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRVc2VyUm9sZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnVzZXJzPy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy51c2Vycy5mb3JFYWNoKCh1c2VyKSA9PiB7XHJcbiAgICAgICAgaWYgKCF1c2VyLmlzTWlncmF0ZWQpIHtcclxuICAgICAgICAgIHVzZXIucm9sZU5hbWUgPSAnRGVkaWNhdGVkIEluc3RhbmNlIENhbGxpbmcgdXNlcic7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0UmFuZG9tVXNlclJvbGUodXNlcnM6IExpc3RVc2VyW10pOiB2b2lkIHtcclxuICAgIGNvbnN0IG1heCA9IE1hdGgucm91bmQoXHJcbiAgICAgIHRoaXMudXNlcnNTZWFyY2hTZXJ2aWNlLnBhZ2VTaXplIC0gdGhpcy51c2Vyc1NlYXJjaFNlcnZpY2UucGFnZVNpemUgLyA0LFxyXG4gICAgKTtcclxuICAgIGNvbnN0IG1pbiA9IE1hdGgucm91bmQodGhpcy51c2Vyc1NlYXJjaFNlcnZpY2UucGFnZVNpemUgLyAyKTtcclxuICAgIGNvbnN0IHJhbmRvbUFtb3VudCA9IE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4pICsgbWluKTtcclxuICAgIGNvbnN0IGluZGV4ZXMgPSB0aGlzLmdldEFycmF5T2ZSYW5kb21Vc2VySW5kZXhlcyhyYW5kb21BbW91bnQpO1xyXG4gICAgaW5kZXhlcy5mb3JFYWNoKChpbmRleCkgPT4ge1xyXG4gICAgICBpZiAodXNlcnNbaW5kZXhdKSB7XHJcbiAgICAgICAgdXNlcnNbaW5kZXhdLnJvbGVOYW1lID0gJ0RlZGljYXRlZCBJbnN0YW5jZSBDYWxsaW5nIHVzZXInO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0QXJyYXlPZlJhbmRvbVVzZXJJbmRleGVzKHJhbmRvbUFtb3VudDogbnVtYmVyKTogbnVtYmVyW10ge1xyXG4gICAgY29uc3QgaW5kZXhlcyA9IFtdO1xyXG4gICAgd2hpbGUgKHJhbmRvbUFtb3VudCA+IDApIHtcclxuICAgICAgY29uc3QgaW5kZXggPSBNYXRoLnJvdW5kKFxyXG4gICAgICAgIE1hdGgucmFuZG9tKCkgKiAodGhpcy51c2Vyc1NlYXJjaFNlcnZpY2UucGFnZVNpemUgLSAxKSxcclxuICAgICAgKTtcclxuICAgICAgaW5kZXhlcy5wdXNoKGluZGV4KTtcclxuICAgICAgcmFuZG9tQW1vdW50LS07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaW5kZXhlcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcnVuU2VhcmNoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kYXRhUGVuZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLnVzZXJzU2VhcmNoU2VydmljZS5xdWlja1JlZ3VsYXJVc2Vyc1NlYXJjaCgpLnN1YnNjcmliZShcclxuICAgICAgKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGF0YVBlbmRpbmcgPSBmYWxzZTtcclxuICAgICAgfSxcclxuICAgICAgKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGF0YVBlbmRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnMuZXJyb3IoJ1RoZSBkYXRhIGNhbiBub3QgYmUgcmVjZWl2ZWQnKTtcclxuICAgICAgfSxcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldFVzZXJNaWdyYXRpb25Qcm9ncmVzcygpOiB2b2lkIHtcclxuICAgIGNvbnN0IHVzZXJJZEluTWlncmF0aW9uID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXHJcbiAgICAgIExPQ0FMX1NUT1JBR0UuVVNFUl9JTl9NSUdSQVRJT04sXHJcbiAgICApO1xyXG4gICAgY29uc3QgbWlncmF0aW9uRm9ybUlkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXHJcbiAgICAgIExPQ0FMX1NUT1JBR0UuTUlHUkFUSU9OX0ZPUk1fSUQsXHJcbiAgICApO1xyXG4gICAgaWYgKHVzZXJJZEluTWlncmF0aW9uKSB7XHJcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy51c2Vycy5maW5kSW5kZXgoXHJcbiAgICAgICAgKHVzZXIpID0+IHVzZXIudXNlcmlkID09PSB1c2VySWRJbk1pZ3JhdGlvbixcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5tb3ZlSW5Qcm9ncmVzc1VzZXJJZCA9IGluZGV4ID4gLTEgPyB0aGlzLnVzZXJzW2luZGV4XS51c2VyaWQgOiAnJztcclxuICAgICAgdGhpcy5tb3ZlVXNlclBlbmRpbmcgPSBpbmRleCA+IC0xO1xyXG4gICAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdHVzVG9Vc2VyKGluZGV4LCAnSW4gUHJvZ3Jlc3MnKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobWlncmF0aW9uRm9ybUlkKSB7XHJcbiAgICAgICAgdGhpcy5wb2xsTWlncmF0aW9uRm9ybVN0YXR1cyhOdW1iZXIobWlncmF0aW9uRm9ybUlkKSwgaW5kZXgsICgpID0+IHRoaXMuZ2V0TWlncmF0ZWRVc2VycygpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRNaWdyYXRlZFVzZXJzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kYXRhUGVuZGluZyA9IHRydWU7XHJcbiAgICBjb25zdCBzZWFyY2hQYXJhbXMgPSB7XHJcbiAgICAgIGN1c3RvbWVyaWQ6IHRoaXMuY3VzdG9tZXJJZCxcclxuICAgICAgc2l0ZWlkOiB0aGlzLnNpdGVJZCxcclxuICAgICAgJ2Nsb3VkLW9ubHknOiAndHJ1ZScsXHJcbiAgICB9O1xyXG4gICAgLy8gdGhpcy51c2Vyc1NlYXJjaFNlcnZpY2UucXVpY2tXZWJleFVzZXJzU2VhcmNoKHNlYXJjaFBhcmFtcywgdHJ1ZSwgTUFYX0lOVEVHRVIpXHJcbiAgICB0aGlzLnVzZXJzU2VhcmNoU2VydmljZVxyXG4gICAgICAuZ2V0TWlncmF0ZWRVc2Vycyh0aGlzLmN1c3RvbWVySWQpXHJcbiAgICAgIC8vIHRoaXMudXNlcnNTZWFyY2hTZXJ2aWNlLmdldE1pZ3JhdGVkV2ViZXhVc2Vycyh0aGlzLmN1c3RvbWVySWQpXHJcbiAgICAgIC5zdWJzY3JpYmUoXHJcbiAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgdXNlcklkSW5NaWdyYXRpb24gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcclxuICAgICAgICAgICAgTE9DQUxfU1RPUkFHRS5VU0VSX0lOX01JR1JBVElPTixcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHVzZXJJZEluTWlncmF0aW9uICYmXHJcbiAgICAgICAgICAgIHRoaXMudXNlcnNTZWFyY2hTZXJ2aWNlLm1pZ3JhdGVkVXNlcnMuZmlsdGVyKFxyXG4gICAgICAgICAgICAgIChtaWdyYXRlZFVzZXI6IGFueSkgPT4gbWlncmF0ZWRVc2VyLnVzZXJpZCA9PT0gdXNlcklkSW5NaWdyYXRpb24sXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShMT0NBTF9TVE9SQUdFLlVTRVJfSU5fTUlHUkFUSU9OKTtcclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oTE9DQUxfU1RPUkFHRS5NSUdSQVRJT05fRk9STV9JRCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnJ1blNlYXJjaCgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5kYXRhUGVuZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zLmVycm9yKCdUaGUgZGF0YSBjYW4gbm90IGJlIHJlY2VpdmVkJyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIG9uTW92ZVVzZXIodXNlcjogTGlzdFVzZXIsIGluZGV4OiBudW1iZXIsIHR5cGU6IHN0cmluZywgdGl0bGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihVc2VyTGlzdENvbmZpcm1EaWFsb2dDb21wb25lbnQsIHtcclxuICAgICAgZGF0YToge1xyXG4gICAgICAgIHRpdGxlOiBgVXBncmFkZSB1c2VyICR7dXNlci51c2VyaWR9IHRvIE11bHRpIFRlbmFudD9gLFxyXG4gICAgICAgIG1lc3NhZ2U6IGA8cD5VcGdyYWRpbmcgdGhpcyB1c2VyIHdpbGwgcHJlcGFyZSB0aGUgYWNjb3VudCBmb3IgbWlncmF0aW9uIHRvIE11bHRpIFRlbmFudC48L3A+XHJcbiAgICAgICAgICA8cD5EdXJpbmcgdGhpcyBwcm9jZXNzLCB0aGUgdXNlciBjb25maWd1cmF0aW9uIHdpbGwgYmUgY29waWVkIHRvIHRoZSBNdWx0aSBUZW5hbnQgZW52aXJvbm1lbnQuXHJcbiAgICAgICAgICBUaGUgdXNlciB3aWxsIHJlbWFpbiBhY3RpdmUgb24gdGhlIGN1cnJlbnQgc3lzdGVtIHVudGlsIHRoZSBBY3RpdmF0ZSBzdGVwIGlzIGNvbXBsZXRlZC48L3A+XHJcbiAgICAgICAgICA8cD5EbyB5b3Ugd2FudCB0byBjb250aW51ZT88L3A+YCxcclxuICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ1llcywgdXBncmFkZScsXHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICAgIGRpYWxvZ1JlZi5iZWZvcmVDbG9zZWQoKS5zdWJzY3JpYmUoKHJlc3VsdDogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgICAgIGNhc2UgJ1F1aWNrTW92ZSc6XHJcbiAgICAgICAgICAgIHRoaXMubW92ZVVzZXJUb01UKHVzZXIsIGluZGV4KTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlICdNVCc6XHJcbiAgICAgICAgICAgIHRoaXMubW92ZVVzZXIgPSB1c2VyO1xyXG4gICAgICAgICAgICB0aGlzLm1vdmVVc2VySW5kZXggPSBpbmRleDtcclxuICAgICAgICAgICAgdGhpcy5zaG93TW92ZVVzZXJXaXphcmQgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLnN3aXRjaFRvV2l6YXJkLmVtaXQodHJ1ZSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSAnREknOlxyXG4gICAgICAgICAgICB0aGlzLm1vdmVVc2VyVG9ESSh1c2VyLCBpbmRleCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBydW5Nb3ZlVXNlclRvTVQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5tb3ZlVXNlciAmJiB0aGlzLm1vdmVVc2VyLnNpdGVJZCAmJiB0aGlzLm1vdmVVc2VyLnVzZXJpZCkge1xyXG4gICAgICB0aGlzLnVzZXJTZXJ2aWNlLm1vdmVVc2VyUGVuZGluZyA9IHRydWU7XHJcbiAgICAgIHRoaXMubW92ZUluUHJvZ3Jlc3NVc2VySWQgPSB0aGlzLm1vdmVVc2VyLnVzZXJpZDtcclxuICAgICAgdGhpcy5zZXRTdGF0dXNUb1VzZXIodGhpcy5tb3ZlVXNlckluZGV4LCAnSW4gUHJvZ3Jlc3MnKTtcclxuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXHJcbiAgICAgICAgTE9DQUxfU1RPUkFHRS5VU0VSX0lOX01JR1JBVElPTixcclxuICAgICAgICB0aGlzLm1vdmVVc2VyLnVzZXJpZCxcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzdWJzY3JpcHRpb24gPSB0aGlzLnVzZXJTZXJ2aWNlXHJcbiAgICAgIC5tb3ZlVXNlclRvTVQodGhpcy5jdXN0b21lcklkLCB0aGlzLm1vdmVVc2VyKVxyXG4gICAgICAuc3Vic2NyaWJlKFxyXG4gICAgICAgIChmb3JtSWQ6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgaWYgKGZvcm1JZCkge1xyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShMT0NBTF9TVE9SQUdFLk1JR1JBVElPTl9GT1JNX0lELCBTdHJpbmcoZm9ybUlkKSk7XHJcbiAgICAgICAgICAgIHRoaXMucG9sbE1pZ3JhdGlvbkZvcm1TdGF0dXMoZm9ybUlkLCB0aGlzLm1vdmVVc2VySW5kZXgsICgpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLnVzZXJTZXJ2aWNlLnVzZXJNb3ZlZCQubmV4dCh0cnVlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnVzZXJTZXJ2aWNlLnVzZXJNb3ZlZCQubmV4dCh0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgICgpID0+IHtcclxuICAgICAgICAgIHRoaXMucmVtb3ZlVXNlckluTWlncmF0aW9uUHJvZ3Jlc3MoKTtcclxuICAgICAgICAgIHRoaXMuc2V0U3RhdHVzVG9Vc2VyKHRoaXMubW92ZVVzZXJJbmRleCwgJ01pZ3JhdGlvbiBFcnJvcicpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICk7XHJcblxyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goc3Vic2NyaXB0aW9uKTtcclxuICB9XHJcblxyXG4gIHNlYXJjaFVzZXJzKHRva2VuOiBzdHJpbmcsIHR5cGU/OiBVU0VSX1RZUEVTX1RZUEUpOiB2b2lkIHtcclxuICAgIC8vIGlmIHRva2VuIGlzIGVtcHR5IOKAlCByZXN0b3JlIGN1cnJlbnQgcGFnZSBkYXRhc291cmNlXHJcbiAgICBpZiAoIXRva2VuICYmICF0eXBlKSB7XHJcbiAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UodGhpcy51c2Vycyk7XHJcbiAgICAgIHRoaXMudG90YWxVc2Vyc0NvdW50ID0gdGhpcy51c2Vyc1NlYXJjaFNlcnZpY2U/LnRvdGFsIHx8IHRoaXMudXNlcnMubGVuZ3RoO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZmV0Y2ggYWxsIHVzZXJzIChzZXJ2ZXItc2lkZSkgYW5kIGZpbHRlciBsb2NhbGx5IGFjcm9zcyB0aGUgd2hvbGUgZGF0YXNldFxyXG4gICAgdGhpcy5kYXRhUGVuZGluZyA9IHRydWU7XHJcbiAgICBjb25zdCBzdWJzY3JpcHRpb24gPSB0aGlzLnVzZXJzU2VhcmNoU2VydmljZS5nZXRBbGxSZWd1bGFyVXNlcnMoKVxyXG4gICAgICAuc3Vic2NyaWJlKFxyXG4gICAgICAgIChhbGxVc2VyczogTGlzdFVzZXJbXSkgPT4ge1xyXG4gICAgICAgICAgbGV0IGZpbHRlcmVkOiBMaXN0VXNlcltdO1xyXG4gICAgICAgICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBmaWx0ZXJlZCA9IHRoaXMuZmlsdGVyQnlUb2tlbihhbGxVc2VycywgdG9rZW4pO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZmlsdGVyZWQgPSB0aGlzLmZpbHRlckJ5VHlwZShhbGxVc2VycywgdHlwZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKGZpbHRlcmVkKTtcclxuICAgICAgICAgIHRoaXMudG90YWxVc2Vyc0NvdW50ID0gZmlsdGVyZWQubGVuZ3RoO1xyXG4gICAgICAgICAgdGhpcy5kYXRhUGVuZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5kYXRhUGVuZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zLmVycm9yKCdUaGUgZGF0YSBjYW4gbm90IGJlIHJlY2VpdmVkJyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgKTtcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHN1YnNjcmlwdGlvbik7XHJcbiAgfVxyXG5cclxuICBzZWFyY2hCeVR5cGUodXNlclR5cGU6IFVTRVJfVFlQRVNfVFlQRSkge1xyXG4gICAgdGhpcy5zZWFyY2hVc2VycygnJywgdXNlclR5cGUpO1xyXG4gIH1cclxuXHJcbiAgb25DcmVhdGVVc2VyUmVxdWVzdGVkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jcmVhdGVVc2VyUmVxdWVzdGVkLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmlsdGVyQnlUb2tlbih1c2VyczogTGlzdFVzZXJbXSwgdG9rZW46IHN0cmluZyk6IExpc3RVc2VyW10ge1xyXG4gICAgY29uc3QgdG9rID0gKHRva2VuIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgY29uc3QgZmlsdGVyZWQgPSAodXNlcnMgfHwgW10pLmZpbHRlcigodXNlcjogTGlzdFVzZXIpID0+IHtcclxuICAgICAgY29uc3QgZmlyc3ROYW1lID0gKHVzZXI/LmZpcnN0TmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKTtcclxuICAgICAgY29uc3QgbGFzdE5hbWUgPSAodXNlcj8ubGFzdE5hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIGNvbnN0IGZ1bGxOYW1lID0gYCR7Zmlyc3ROYW1lfSAke2xhc3ROYW1lfWAudHJpbSgpO1xyXG4gICAgICBjb25zdCBlbWFpbCA9ICh1c2VyPy5lbWFpbCB8fCAnJykudG9Mb3dlckNhc2UoKTtcclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICBmaXJzdE5hbWUuaW5jbHVkZXModG9rKSB8fFxyXG4gICAgICAgIGxhc3ROYW1lLmluY2x1ZGVzKHRvaykgfHxcclxuICAgICAgICBmdWxsTmFtZS5pbmNsdWRlcyh0b2spIHx8XHJcbiAgICAgICAgZW1haWwuaW5jbHVkZXModG9rKVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGZpbHRlcmVkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmaWx0ZXJCeVR5cGUodXNlcnM6IExpc3RVc2VyW10sIHVzZXJUeXBlOiBVU0VSX1RZUEVTX1RZUEUpOiBMaXN0VXNlcltdIHtcclxuICAgIGxldCBmaWx0ZXJlZFVzZXJzOiBMaXN0VXNlcltdO1xyXG4gICAgaWYgKHVzZXJUeXBlID09PSBVU0VSX1RZUEVTX01BUC5DVUNNKSB7XHJcbiAgICAgIGZpbHRlcmVkVXNlcnMgPSB1c2Vycy5maWx0ZXIoKHVzZXIpID0+ICF1c2VyLndlYmV4VVVJRCAmJiB1c2VyLmN1Y21JZCAhPSBPTl9QUkVNX0lEKTtcclxuICAgIH0gZWxzZSBpZiAodXNlclR5cGUgPT09IFVTRVJfVFlQRVNfTUFQLldFQkVYKSB7XHJcbiAgICAgIGZpbHRlcmVkVXNlcnMgPSB1c2Vycy5maWx0ZXIoKHVzZXIpID0+IHVzZXIud2ViZXhVVUlEICE9PSBudWxsICYmIHVzZXIud2ViZXhVVUlEICE9PSB1bmRlZmluZWQpO1xyXG4gICAgfSBlbHNlIGlmICh1c2VyVHlwZSA9PT0gVVNFUl9UWVBFU19NQVAuT05QUkVNKSB7XHJcbiAgICAgIGZpbHRlcmVkVXNlcnMgPSB1c2Vycy5maWx0ZXIoKHVzZXIpID0+ICF1c2VyLndlYmV4VVVJRCAmJiB1c2VyLmN1Y21JZCA9PSBPTl9QUkVNX0lEKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGZpbHRlcmVkVXNlcnMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmlsdGVyZWRVc2VycztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc1ZhbGlkV2ViZXhVdWlkKHVzZXI6IExpc3RVc2VyKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCB2YWx1ZSA9IHVzZXI/LndlYmV4VVVJRDtcclxuICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIFN0cmluZyh2YWx1ZSkudHJpbSgpLmxlbmd0aCA+IDA7XHJcbiAgfVxyXG5cclxuICBvbkZpcm13YXJlVXBncmFkZUNsaWNrZWQodXNlcjogTGlzdFVzZXIpIHtcclxuICAgIGlmICghdGhpcy5pc1ZhbGlkV2ViZXhVdWlkKHVzZXIpIHx8IHVzZXIuc3RhdHVzICE9PSAnSW5hY3RpdmUnKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oVXNlckxpc3RDb25maXJtRGlhbG9nQ29tcG9uZW50LCB7XHJcbiAgICAgIGRhdGE6IHtcclxuICAgICAgICB0aXRsZTogYEFjdGl2YXRlIHVzZXIgJHt1c2VyLnVzZXJpZH0gb24gTXVsdGkgVGVuYW50P2AsXHJcbiAgICAgICAgbWVzc2FnZTogYDxwPkFjdGl2YXRpbmcgdGhpcyB1c2VyIHdpbGwgcGVyZm9ybSB0aGUgY3V0b3ZlciB0byBNdWx0aSBUZW5hbnQgYW5kIGNvbXBsZXRlIHRoZSBtaWdyYXRpb24gcHJvY2Vzcy48L3A+XHJcbiAgICAgICAgICA8cD5BZnRlciBhY3RpdmF0aW9uLCB0aGUgdXNlciB3aWxsIGJlY29tZSBhY3RpdmUgb24gTXVsdGkgVGVuYW50IGFuZCB0aGUgb3JpZ2luYWwgdXNlciB3aWxsIGJlY29tZSBpbmFjdGl2ZS48L3A+XHJcbiAgICAgICAgICA8cD5EbyB5b3Ugd2FudCB0byBjb250aW51ZT88L3A+YCxcclxuICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ0FjdGl2YXRlJyxcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG5cclxuICAgIGRpYWxvZ1JlZi5iZWZvcmVDbG9zZWQoKS5zdWJzY3JpYmUoKHJlc3VsdDogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICB0aGlzLnNldFVzZXJQZW5kaW5nU3RhdHVzKHVzZXIsICdQZW5kaW5nIEFjdGl2YXRpb24nKTtcclxuICAgICAgICAvLyBUT0RPOiBSZXBsYWNlIHdpdGggYWN0aXZhdGlvbiBBUEkgb25jZSBhdmFpbGFibGUuXHJcbiAgICAgICAgdGltZXIoMTUwMClcclxuICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICBuZXh0OiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZXRVc2VyUGVuZGluZ1N0YXR1cyh1c2VyLCAnQWN0aXZlJyk7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZXRPcmlnaW5hbFVzZXJTdGF0dXModXNlci5lbWFpbCwgJ0luYWN0aXZlJyk7XHJcbiAgICAgICAgICAgICAgLy8gdGhpcy5ub3RpZmljYXRpb25zLnN1Y2Nlc3MoYCR7dXNlci51c2VyaWR9IHN1Y2Nlc3NmdWxseSBhY3RpdmF0ZWRgKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3I6ICgpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLnNldFVzZXJQZW5kaW5nU3RhdHVzKHVzZXIsICdJbmFjdGl2ZScpO1xyXG4gICAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9ucy5lcnJvcignQWN0aXZhdGlvbiBmYWlsZWQuIFBsZWFzZSB0cnkgYWdhaW4uJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uUmV2ZXJ0Q2xpY2tlZCh1c2VyOiBMaXN0VXNlcikge1xyXG4gICAgaWYgKHVzZXI/LndlYmV4VVVJRCkge1xyXG4gICAgICB0aGlzLnNldFVzZXJQZW5kaW5nU3RhdHVzKHVzZXIsICdQZW5kaW5nIERlYWN0aXZhdGlvbicpO1xyXG4gICAgICB0aGlzLnVzZXJTZXJ2aWNlLnN3YXBTdGF0dXNlcyh0aGlzLmN1c3RvbWVySWQsIHVzZXIuZW1haWwgfHwgJycpXHJcbiAgICAgICAgLy8gdGhpcy51c2VyU2VydmljZS5yZXZlcnRNaWdyYXRpb24odGhpcy5jdXN0b21lcklkLCB1c2VyLndlYmV4VVVJRClcclxuICAgICAgICAucGlwZShcclxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcclxuICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aW1lcigyMDAwKSlcclxuICAgICAgICApXHJcbiAgICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICBuZXh0OiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0VXNlclBlbmRpbmdTdGF0dXModXNlciwgJ0luYWN0aXZlJyk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0T3JpZ2luYWxVc2VyU3RhdHVzKHVzZXIuZW1haWwsICdBY3RpdmUnKTtcclxuICAgICAgICAgICAgLy8gdGhpcy5ub3RpZmljYXRpb25zLnN1Y2Nlc3MoYCR7dXNlci51c2VyaWR9IHN1Y2Nlc3NmdWxseSBkZWFjdGl2YXRlZGApO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGVycm9yOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0VXNlclBlbmRpbmdTdGF0dXModXNlciwgJ0FjdGl2ZScpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRVc2VyUGVuZGluZ1N0YXR1cyh1c2VyOiBMaXN0VXNlciwgc3RhdHVzOiBzdHJpbmcpIHtcclxuICAgIHVzZXIuc3RhdHVzID0gc3RhdHVzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwb2xsTWlncmF0aW9uRm9ybVN0YXR1cyhcclxuICAgIGZvcm1JZDogbnVtYmVyLFxyXG4gICAgaW5kZXg6IG51bWJlcixcclxuICAgIG9uQ29tcGxldGVkOiAoKSA9PiB2b2lkLFxyXG4gICk6IHZvaWQge1xyXG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gdGltZXIoMCwgNTAwMClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMudXNlclNlcnZpY2UuZ2V0TWlncmF0aW9uRm9ybVN0YXR1cyh0aGlzLmN1c3RvbWVySWQsIGZvcm1JZCkpLFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcclxuICAgICAgICB0YWtlV2hpbGUoKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlPy5zdGF0dXM7XHJcbiAgICAgICAgICByZXR1cm4gIXRoaXMuaXNNaWdyYXRpb25TdGF0dXNDb21wbGV0ZWQoc3RhdHVzKSAmJiAhdGhpcy5pc01pZ3JhdGlvblN0YXR1c0ZhaWxlZChzdGF0dXMpO1xyXG4gICAgICAgIH0sIHRydWUpLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZT8uc3RhdHVzO1xyXG4gICAgICAgICAgaWYgKHRoaXMuaXNNaWdyYXRpb25TdGF0dXNGYWlsZWQoc3RhdHVzKSkge1xyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZVVzZXJJbk1pZ3JhdGlvblByb2dyZXNzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdHVzVG9Vc2VyKGluZGV4LCAnTWlncmF0aW9uIEVycm9yJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICh0aGlzLmlzTWlncmF0aW9uU3RhdHVzQ29tcGxldGVkKHN0YXR1cykpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVVc2VySW5NaWdyYXRpb25Qcm9ncmVzcygpO1xyXG4gICAgICAgICAgICB0aGlzLnNldFN0YXR1c1RvVXNlcihpbmRleCwgJ0FjdGl2ZScpO1xyXG4gICAgICAgICAgICBvbkNvbXBsZXRlZCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMucmVtb3ZlVXNlckluTWlncmF0aW9uUHJvZ3Jlc3MoKTtcclxuICAgICAgICAgIHRoaXMuc2V0U3RhdHVzVG9Vc2VyKGluZGV4LCAnTWlncmF0aW9uIEVycm9yJyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcblxyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goc3Vic2NyaXB0aW9uKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0T3JpZ2luYWxVc2VyU3RhdHVzKGVtYWlsID0gJycsIHN0YXR1czogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBvcmlnaW5hbFVzZXIgPSB0aGlzLnVzZXJzLmZpbmQoKHVzZXIpID0+IHVzZXIuZW1haWwgPT09IGVtYWlsICYmICF1c2VyLndlYmV4VVVJRCk7XHJcbiAgICBpZiAob3JpZ2luYWxVc2VyKSB7XHJcbiAgICAgIG9yaWdpbmFsVXNlci5zdGF0dXMgPSBzdGF0dXM7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxhcHAtbG9hZGVyICpuZ0lmPVwiZGF0YVBlbmRpbmdcIj48L2FwcC1sb2FkZXI+XHJcbjxkaXYgKm5nSWY9XCIhc2hvd01vdmVVc2VyV2l6YXJkXCIgaWQ9XCJ1c2Vycy1saXN0XCI+XHJcbiAgPHRrLXVzZXJzLXRhYmxlLXRvb2xiYXJcclxuICAgIFt0b3RhbFVzZXJzQ291bnRdPVwidG90YWxVc2Vyc0NvdW50XCJcclxuICAgIChzZWFyY2hDaGFuZ2UpPVwic2VhcmNoVXNlcnMoJGV2ZW50KVwiXHJcbiAgICAoc2VhcmNoQnlUeXBlKT1cInNlYXJjaEJ5VHlwZSgkZXZlbnQpXCJcclxuICAgIChhZGRVc2VyKT1cIm9uQ3JlYXRlVXNlclJlcXVlc3RlZCgpXCJcclxuICA+PC90ay11c2Vycy10YWJsZS10b29sYmFyPlxyXG4gIDx0YWJsZVxyXG4gICAgY2xhc3M9XCJ3ZWJleC10YWJsZVwiXHJcbiAgICBtYXQtdGFibGVcclxuICAgICpuZ0lmPVwidXNlcnM/Lmxlbmd0aFwiXHJcbiAgICAjdGFibGVcclxuICAgIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIlxyXG4gID5cclxuICAgIDwhLS0gPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJ1c2VyLWljb25cIj5cclxuICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cIndlYmV4LXRhYmxlLXRoXCI+PC90aD5cclxuICAgICAgPHRkIGNsYXNzPVwidXNlci1zaXRlXCIgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgdXNlclwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7J2Rpc2FibGVkLXVzZXItcm93JzogbW92ZVVzZXJQZW5kaW5nICYmIG1vdmVJblByb2dyZXNzVXNlcklkICYmIG1vdmVJblByb2dyZXNzVXNlcklkID09PSB1c2VyPy51c2VyaWR9XCJcclxuICAgICAgICAgIChjbGljayk9XCJvblVzZXJDbGljayh1c2VyKVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbi13ZWJleC1ib3hcIj48c3BhbiBjbGFzcz1cImljb24td2ViZXggaWNvbi13ZWJleC11c2VyXCI+PC9zcGFuPjwvc3Bhbj5cclxuICAgICAgPC90ZD5cclxuICAgIDwvbmctY29udGFpbmVyPiAtLT5cclxuXHJcbiAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIm5hbWVcIj5cclxuICAgICAgPHRoXHJcbiAgICAgICAgbWF0LWhlYWRlci1jZWxsXHJcbiAgICAgICAgKm1hdEhlYWRlckNlbGxEZWZcclxuICAgICAgICBjbGFzcz1cIndlYmV4LXRhYmxlLXRoXCJcclxuICAgICAgICBzdHlsZT1cInBhZGRpbmctbGVmdDogNjBweFwiXHJcbiAgICAgID5cclxuICAgICAgICBEaXNwbGF5IG5hbWVcclxuICAgICAgPC90aD5cclxuICAgICAgPHRkXHJcbiAgICAgICAgY2xhc3M9XCJ1c2VyLXNpdGVcIlxyXG4gICAgICAgIG1hdC1jZWxsXHJcbiAgICAgICAgKm1hdENlbGxEZWY9XCJsZXQgdXNlclwiXHJcbiAgICAgICAgKGNsaWNrKT1cIm9uVXNlckNsaWNrKHVzZXIpXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkaXNwbGF5LW5hbWUtd3JhcHBlclwiPlxyXG4gICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgY2xhc3M9XCJ1c2VyLW5hbWUtdGV4dFwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2luYWN0aXZlLXVzZXItcm93JzogdXNlci5zdGF0dXMgIT09ICdBY3RpdmUnIH1cIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyB1c2VyLmZpcnN0TmFtZSB9fSB7eyB1c2VyLmxhc3ROYW1lIH19XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb24td2ViZXgtYm94XCJcclxuICAgICAgICAgICAgPjxzcGFuIGNsYXNzPVwiaWNvbi13ZWJleCBpY29uLXdlYmV4LXVzZXJcIj48L3NwYW5cclxuICAgICAgICAgID48L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvdGQ+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImVtYWlsXCI+XHJcbiAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJ3ZWJleC10YWJsZS10aFwiPkVtYWlsPC90aD5cclxuICAgICAgPHRkXHJcbiAgICAgICAgY2xhc3M9XCJ1c2VyLXNpdGVcIlxyXG4gICAgICAgIG1hdC1jZWxsXHJcbiAgICAgICAgKm1hdENlbGxEZWY9XCJsZXQgdXNlclwiXHJcbiAgICAgICAgKGNsaWNrKT1cIm9uVXNlckNsaWNrKHVzZXIpXCJcclxuICAgICAgPlxyXG4gICAgICAgIHt7IHVzZXIuZW1haWwgfX1cclxuICAgICAgPC90ZD5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic3RhdHVzXCI+XHJcbiAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJ3ZWJleC10YWJsZS10aFwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZGVyLXdpdGgtaW5mb1wiPlxyXG4gICAgICAgICAgU3RhdHVzXHJcbiAgICAgICAgICA8aW1nIHNyYz1cImFzc2V0cy9pY29ucy9pbmZvLWNpcmNsZS1yZWd1bGFyLnN2Z1wiIHdpZHRoPVwiMTZcIiBhbHQ9XCJcIiAvPlxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC90aD5cclxuICAgICAgPHRkXHJcbiAgICAgICAgY2xhc3M9XCJ1c2VyLXNpdGVcIlxyXG4gICAgICAgIG1hdC1jZWxsXHJcbiAgICAgICAgKm1hdENlbGxEZWY9XCJsZXQgdXNlclwiXHJcbiAgICAgICAgKGNsaWNrKT1cIm9uVXNlckNsaWNrKHVzZXIpXCJcclxuICAgICAgICBbbWF0VG9vbHRpcF09XCJcclxuICAgICAgICAgIHVzZXIuc3RhdHVzICE9PSAnQWN0aXZlJyAmJiB1c2VyLndlYmV4VVVJRFxyXG4gICAgICAgICAgICA/ICdQZW5kaW5nIGN1dG92ZXIgdG8gTVQuIFBsZWFzZSBjb250YWN0IHlvdXIgYWRtaW5pc3RyYXRvciBmb3IgZGV0YWlscy4nXHJcbiAgICAgICAgICAgIDogJydcclxuICAgICAgICBcIlxyXG4gICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxzcGFuXHJcbiAgICAgICAgICBjbGFzcz1cImljb24tdXNlci1zdGF0dXNcIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwieyAnaWNvbi11c2VyLXN0YXR1cy1hY3RpdmUnOiB1c2VyLnN0YXR1cyA9PT0gJ0FjdGl2ZScgfVwiXHJcbiAgICAgICAgPjwvc3BhblxyXG4gICAgICAgID57eyB1c2VyLnN0YXR1cyB9fVxyXG4gICAgICA8L3RkPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJhY3Rpb25zXCI+XHJcbiAgICAgIDx0aFxyXG4gICAgICAgIG1hdC1oZWFkZXItY2VsbFxyXG4gICAgICAgICptYXRIZWFkZXJDZWxsRGVmXHJcbiAgICAgICAgY2xhc3M9XCJ3ZWJleC10YWJsZS10aFwiXHJcbiAgICAgICAgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6IDI0cHg7IHBhZGRpbmctdG9wOiA0cHhcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGltZyBzcmM9XCJhc3NldHMvaWNvbnMvc2V0dGluZ3MtcmVndWxhci5zdmdcIiB3aWR0aD1cIjE2XCIgYWx0PVwiXCIgLz5cclxuICAgICAgPC90aD5cclxuICAgICAgPHRkXHJcbiAgICAgICAgY2xhc3M9XCJ1c2VyLXNpdGUgYWN0aW9ucy1jZWxsXCJcclxuICAgICAgICBtYXQtY2VsbFxyXG4gICAgICAgICptYXRDZWxsRGVmPVwibGV0IHVzZXI7IGxldCBpID0gaW5kZXhcIlxyXG4gICAgICAgIHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxtYXQtcHJvZ3Jlc3Mtc3Bpbm5lclxyXG4gICAgICAgICAgY2xhc3M9XCJmaWVsZC1zcGlubmVyXCJcclxuICAgICAgICAgIFtkaWFtZXRlcl09XCIzMFwiXHJcbiAgICAgICAgICBzdHJva2VXaWR0aD1cIjNcIlxyXG4gICAgICAgICAgbW9kZT1cImluZGV0ZXJtaW5hdGVcIlxyXG4gICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgdXNlci5zdGF0dXMgPT09ICdJbiBQcm9ncmVzcycgfHxcclxuICAgICAgICAgICAgdXNlci5zdGF0dXMgPT09ICdQZW5kaW5nIEFjdGl2YXRpb24nIHx8XHJcbiAgICAgICAgICAgIHVzZXIuc3RhdHVzID09PSAnUGVuZGluZyBEZWFjdGl2YXRpb24nXHJcbiAgICAgICAgICBcIlxyXG4gICAgICAgID48L21hdC1wcm9ncmVzcy1zcGlubmVyPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICEoXHJcbiAgICAgICAgICAgICAgdXNlci5zdGF0dXMgPT09ICdJbiBQcm9ncmVzcycgfHxcclxuICAgICAgICAgICAgICB1c2VyLnN0YXR1cyA9PT0gJ1BlbmRpbmcgQWN0aXZhdGlvbicgfHxcclxuICAgICAgICAgICAgICB1c2VyLnN0YXR1cyA9PT0gJ1BlbmRpbmcgRGVhY3RpdmF0aW9uJ1xyXG4gICAgICAgICAgICApICYmXHJcbiAgICAgICAgICAgICEoXHJcbiAgICAgICAgICAgICAgbW92ZVVzZXJQZW5kaW5nICYmXHJcbiAgICAgICAgICAgICAgbW92ZUluUHJvZ3Jlc3NVc2VySWQgJiZcclxuICAgICAgICAgICAgICBtb3ZlSW5Qcm9ncmVzc1VzZXJJZCA9PT0gdXNlcj8udXNlcmlkXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgIFwiXHJcbiAgICAgICAgICBjbGFzcz1cImJ1dHRvbi1hY3Rpb24tZG90XCJcclxuICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgW21hdE1lbnVUcmlnZ2VyRm9yXT1cIm1lbnVcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpY29uLWFjdGlvbnMtZG90c1wiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb24tZG90XCI+Ljwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uLWRvdFwiPi48L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbi1kb3RcIj4uPC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPG1hdC1tZW51ICNtZW51PVwibWF0TWVudVwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIFtkaXNhYmxlZF09XCJ0cnVlXCI+UmVzZW5kIEludml0YXRpb248L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSBbZGlzYWJsZWRdPVwidHJ1ZVwiPlJlc2V0IFBhc3N3b3JkPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICpuZ0lmPVwiIXVzZXIud2ViZXhVVUlEICYmIHVzZXIuY3VjbUlkID09IE9OX1BSRU1fSURcIlxyXG4gICAgICAgICAgICBtYXQtbWVudS1pdGVtXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkNvbWluZyBzb29uXCJcclxuICAgICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwicmlnaHRcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICBFbmFibGUgQUkgVHJhbnNjcmliZVxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ1c2VyLndlYmV4VVVJRCB8fCB1c2VyLnN0YXR1cyAhPT0gJ0FjdGl2ZSdcIlxyXG4gICAgICAgICAgICAqbmdJZj1cIiF1c2VyLmlzTWlncmF0ZWRcIlxyXG4gICAgICAgICAgICBtYXQtbWVudS1pdGVtXHJcbiAgICAgICAgICAgIChjbGljayk9XCJvbk1vdmVVc2VyKHVzZXIsIGksICdRdWlja01vdmUnLCAnTVQnKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIFF1aWNrIFVwZ3JhZGUgVXNlciB0byBNVFxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ1c2VyLndlYmV4VVVJRCB8fCB1c2VyLnN0YXR1cyAhPT0gJ0FjdGl2ZSdcIlxyXG4gICAgICAgICAgICAqbmdJZj1cIiF1c2VyLmlzTWlncmF0ZWRcIlxyXG4gICAgICAgICAgICBtYXQtbWVudS1pdGVtXHJcbiAgICAgICAgICAgIChjbGljayk9XCJvbk1vdmVVc2VyKHVzZXIsIGksICdNVCcsICdNVCcpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgVXBncmFkZSBVc2VyIHRvIE1UXHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgKm5nSWY9XCJ1c2VyLmlzTWlncmF0ZWRcIlxyXG4gICAgICAgICAgICBtYXQtbWVudS1pdGVtXHJcbiAgICAgICAgICAgIChjbGljayk9XCJvbk1vdmVVc2VyKHVzZXIsIGksICdESScsICdESScpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgUmV2ZXJ0IFVzZXIgdG8gVUNNL0RJXHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgbWF0LW1lbnUtaXRlbVxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzVmFsaWRXZWJleFV1aWQodXNlcikgfHwgdXNlci5zdGF0dXMgIT09ICdJbmFjdGl2ZSdcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwib25GaXJtd2FyZVVwZ3JhZGVDbGlja2VkKHVzZXIpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgQWN0aXZhdGUgVXNlclxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIG1hdC1tZW51LWl0ZW1cclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiF1c2VyLndlYmV4VVVJRCB8fCB1c2VyLnN0YXR1cyAhPT0gJ0FjdGl2ZSdcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwib25SZXZlcnRDbGlja2VkKHVzZXIpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgUmV2ZXJ0XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSBbZGlzYWJsZWRdPVwidHJ1ZVwiPkRlbGV0ZSBVc2VyPC9idXR0b24+XHJcbiAgICAgICAgPC9tYXQtbWVudT5cclxuICAgICAgPC90ZD5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwicm9sZVwiPlxyXG4gICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwid2ViZXgtdGFibGUtdGhcIj5cclxuICAgICAgICBBZG1pbiByb2xlc1xyXG4gICAgICA8L3RoPlxyXG4gICAgICA8dGRcclxuICAgICAgICBjbGFzcz1cInVzZXItc2l0ZVwiXHJcbiAgICAgICAgbWF0LWNlbGxcclxuICAgICAgICAqbWF0Q2VsbERlZj1cImxldCB1c2VyXCJcclxuICAgICAgICBbbmdDbGFzc109XCJ7ICdpbmFjdGl2ZS11c2VyLXJvdyc6IHVzZXIuc3RhdHVzICE9PSAnQWN0aXZlJyB9XCJcclxuICAgICAgICAoY2xpY2spPVwib25Vc2VyQ2xpY2sodXNlcilcIlxyXG4gICAgICA+XHJcbiAgICAgICAge3sgdXNlci5yb2xlTmFtZSB8fCBcIi1cIiB9fVxyXG4gICAgICA8L3RkPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJzb3VyY2VcIj5cclxuICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cIndlYmV4LXRhYmxlLXRoXCI+XHJcbiAgICAgICAgUHJvdmlzaW9uaW5nIFR5cGVcclxuICAgICAgPC90aD5cclxuICAgICAgPHRkXHJcbiAgICAgICAgY2xhc3M9XCJ1c2VyLXByb3Zpc2lvbmluZy10eXBlXCJcclxuICAgICAgICBtYXQtY2VsbFxyXG4gICAgICAgICptYXRDZWxsRGVmPVwibGV0IHVzZXJcIlxyXG4gICAgICAgIChjbGljayk9XCJvblVzZXJDbGljayh1c2VyKVwiXHJcbiAgICAgID5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidXNlci53ZWJleFVVSURcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbi13cmFwcGVyXCJcclxuICAgICAgICAgICAgPjxpbWdcclxuICAgICAgICAgICAgICBzcmM9XCJhc3NldHMvaWNvbnMvd2ViZXguc3ZnXCJcclxuICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCInTXVsdGktVGVuYW50J1wiXHJcbiAgICAgICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwicmlnaHRcIlxyXG4gICAgICAgICAgICAgIHdpZHRoPVwiMjBcIlxyXG4gICAgICAgICAgICAgIGFsdD1cIlwiXHJcbiAgICAgICAgICAvPjwvc3Bhbj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXVzZXIud2ViZXhVVUlEXCI+XHJcbiAgICAgICAgICA8c3BhbiAqbmdJZj1cInVzZXIuY3VjbUlkID09IE9OX1BSRU1fSURcIiBjbGFzcz1cImljb24td3JhcHBlclwiXHJcbiAgICAgICAgICAgID48aW1nXHJcbiAgICAgICAgICAgICAgc3JjPVwiYXNzZXRzL2ljb25zL2xvY2FsXzI0LnN2Z1wiXHJcbiAgICAgICAgICAgICAgd2lkdGg9XCIyMFwiXHJcbiAgICAgICAgICAgICAgYWx0PVwiXCJcclxuICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCInVUNNJ1wiXHJcbiAgICAgICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwicmlnaHRcIlxyXG4gICAgICAgICAgLz48L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiAqbmdJZj1cInVzZXIuY3VjbUlkICE9IE9OX1BSRU1fSURcIiBjbGFzcz1cImljb24td3JhcHBlclwiXHJcbiAgICAgICAgICAgID48aW1nXHJcbiAgICAgICAgICAgICAgc3JjPVwiYXNzZXRzL2ljb25zL2RpX2Nsb3VkXzI0LnN2Z1wiXHJcbiAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiJ0RlZGljYXRlZCBJbnN0YW5jZSdcIlxyXG4gICAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cInJpZ2h0XCJcclxuICAgICAgICAgICAgICB3aWR0aD1cIjIwXCJcclxuICAgICAgICAgICAgICBhbHQ9XCJcIlxyXG4gICAgICAgICAgLz48L3NwYW4+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvdGQ+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImxhc3QtYWN0aXZlLXRpbWVcIj5cclxuICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cIndlYmV4LXRhYmxlLXRoXCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWFkZXItd2l0aC1pbmZvXCI+XHJcbiAgICAgICAgICBMYXN0IGFjdGl2ZSB0aW1lXHJcbiAgICAgICAgICA8IS0tIDxtYXQtaWNvbiBjbGFzcz1cImluZm8taWNvblwiPmluZm88L21hdC1pY29uPiAtLT5cclxuICAgICAgICAgIDxpbWcgc3JjPVwiYXNzZXRzL2ljb25zL2luZm8tY2lyY2xlLXJlZ3VsYXIuc3ZnXCIgd2lkdGg9XCIxNlwiIGFsdD1cIlwiIC8+XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L3RoPlxyXG4gICAgICA8dGRcclxuICAgICAgICBjbGFzcz1cInVzZXItc2l0ZVwiXHJcbiAgICAgICAgbWF0LWNlbGxcclxuICAgICAgICAqbWF0Q2VsbERlZj1cImxldCB1c2VyXCJcclxuICAgICAgICBbbmdDbGFzc109XCJ7ICdpbmFjdGl2ZS11c2VyLXJvdyc6IHVzZXIuc3RhdHVzICE9PSAnQWN0aXZlJyB9XCJcclxuICAgICAgICAoY2xpY2spPVwib25Vc2VyQ2xpY2sodXNlcilcIlxyXG4gICAgICA+XHJcbiAgICAgICAge3sgZ2V0VG9kYXlTaG9ydERhdGUoKSB9fVxyXG4gICAgICA8L3RkPlxyXG4gICAgICAvXHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnNcIj48L3RyPlxyXG4gICAgPHRyXHJcbiAgICAgIG1hdC1yb3dcclxuICAgICAgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGRpc3BsYXllZENvbHVtbnNcIlxyXG4gICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgJ2Rpc2FibGVkLXVzZXItcm93JzpcclxuICAgICAgICAgIG1vdmVVc2VyUGVuZGluZyAmJlxyXG4gICAgICAgICAgbW92ZUluUHJvZ3Jlc3NVc2VySWQgJiZcclxuICAgICAgICAgIG1vdmVJblByb2dyZXNzVXNlcklkID09PSByb3c/LnVzZXJpZCxcclxuICAgICAgICAnaW5hY3RpdmUtdXNlci1yb3cnOiByb3cuc3RhdHVzICE9PSAnQWN0aXZlJyxcclxuICAgICAgfVwiXHJcbiAgICA+PC90cj5cclxuICA8L3RhYmxlPlxyXG5cclxuICA8YXBwLXBhZ2luYXRpb25cclxuICAgIFtwYWdpbmF0aW9uXT1cInVzZXJzU2VhcmNoU2VydmljZS5nZXRQYWdpbmF0aW9uKClcIlxyXG4gICAgW3Nob3dQYWdlU2l6ZU9wdGlvbnNdPVwidHJ1ZVwiXHJcbiAgICAocGFnZU51bWJlckNoYW5nZUVtaXR0ZXIpPVwicGFnZU51bWJlckNoYW5nZUV2ZW50KCRldmVudClcIlxyXG4gICAgKHBhZ2VFbWl0dGVyKT1cInBhZ2VFdmVudCgkZXZlbnQpXCJcclxuICA+XHJcbiAgPC9hcHAtcGFnaW5hdGlvbj5cclxuPC9kaXY+XHJcblxyXG48YXBwLW1vdmUtdXNlci13aXphcmRcclxuICAqbmdJZj1cInNob3dNb3ZlVXNlcldpemFyZFwiXHJcbiAgW3VzZXJdPVwibW92ZVVzZXJcIlxyXG4gIChkb25lKT1cImNsb3NlTW92ZVVzZXJXaXphcmQodHJ1ZSlcIlxyXG4gIFtjdXN0b21lcklkXT1cImN1c3RvbWVySWRcIlxyXG4gIChydW5Nb3ZlVXNlcik9XCJydW5Nb3ZlVXNlclRvTVQoKVwiXHJcbiAgKGNsb3NlTW92ZVVzZXJXaXphcmQpPVwiY2xvc2VNb3ZlVXNlcldpemFyZChmYWxzZSlcIlxyXG4+PC9hcHAtbW92ZS11c2VyLXdpemFyZD5cclxuIl19
688
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlcnMtbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90dWtpL3dpZGdldHMvdXNlcnMtbGlzdC9zcmMvdXNlcnMtbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90dWtpL3dpZGdldHMvdXNlcnMtbGlzdC9zcmMvdXNlcnMtbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBS3ZCLE9BQU8sRUFBZ0IsS0FBSyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQWdCLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUcvRyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUc3RCxPQUFPLEVBQXFDLFVBQVUsRUFBRSxjQUFjLEVBQW1CLE1BQU0saUJBQWlCLENBQUM7QUFFakgsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sK0RBQStELENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUUvRyxNQUFNLGNBQWMsR0FBRztJQUNyQixNQUFNO0lBQ04sT0FBTztJQUNQLFFBQVE7SUFDUixrQkFBa0I7SUFDbEIsTUFBTTtJQUNOLFFBQVE7SUFDUixTQUFTO0NBQ1YsQ0FBQztBQUNGLE1BQU0sYUFBYSxHQUFHO0lBQ3BCLGlCQUFpQixFQUFFLG1CQUFtQjtJQUN0QyxpQkFBaUIsRUFBRSxpQkFBaUI7Q0FDckMsQ0FBQztBQThDRixNQUFNLE9BQU8sa0JBQWtCO0lBNEI3QixpQkFBaUI7UUFDZixNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxRQUFRLEVBQUUs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QUMsQ0FBQztpQkFDaEQ7WUFDSCxDQUFDO1NBQ0YsQ0FBQyxDQUFDO1FBRUwsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVPLGdCQUFnQixDQUFDLE1BQWM7UUFDckMsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRU8scUJBQXFCLENBQUMsS0FBSyxHQUFHLEVBQUUsRUFBRSxNQUFjO1FBQ3RELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN4RixJQUFJLFlBQVksRUFBRTtZQUNoQixZQUFZLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztTQUM5QjtJQUNILENBQUM7O2dIQXh4QlUsa0JBQWtCO29HQUFsQixrQkFBa0IscVJDaEYvQixxdFVBOFNBOzRGRDlOYSxrQkFBa0I7a0JBTDlCLFNBQVM7K0JBQ0UsZ0JBQWdCO29QQUtqQixLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBRUksUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQUVFLElBQUk7c0JBQVosS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbnB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvdXNlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQVBJU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvYXBpLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9ub3RpZmljYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgRU1QVFksIG1hcCwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCBzd2l0Y2hNYXAsIHRha2VVbnRpbCwgdGFrZVdoaWxlLCB0aW1lciB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBVc2Vyc1NlYXJjaFNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3VzZXJzLXNlYXJjaC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTGlzdFVzZXIgfSBmcm9tICcuL2NsYXNzZXMvdXNlci1saXN0JztcclxuaW1wb3J0IHsgTWF0VGFibGVEYXRhU291cmNlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xyXG5pbXBvcnQgeyBQYWdlRXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xyXG5pbXBvcnQgeyBBcGlXZWJleFNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2FwaS13ZWJleC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ1VTVE9NRVJfREVTVElOQVRJT04sIE1BWF9JTlRFR0VSLCBPTl9QUkVNX0lELCBVU0VSX1RZUEVTX01BUCwgVVNFUl9UWVBFU19UWVBFIH0gZnJvbSAnLi9hcHAuY29uc3RhbnRzJztcclxuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgVXNlckxpc3RDb25maXJtRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi91c2VyLWxpc3QtY29uZmlybS1kaWFsb2cvdXNlci1saXN0LWNvbmZpcm0tZGlhbG9nLmNvbXBvbmVudCc7XHJcblxyXG5jb25zdCBESVNQTEFZRURfQ09MUyA9IFtcclxuICAnbmFtZScsXHJcbiAgJ2VtYWlsJyxcclxuICAnc3RhdHVzJyxcclxuICAnbGFzdC1hY3RpdmUtdGltZScsXHJcbiAgJ3JvbGUnLFxyXG4gICdzb3VyY2UnLFxyXG4gICdhY3Rpb25zJyxcclxuXTtcclxuY29uc3QgTE9DQUxfU1RPUkFHRSA9IHtcclxuICBVU0VSX0lOX01JR1JBVElPTjogJ3VzZXJJZEluTWlncmF0aW9uJyxcclxuICBNSUdSQVRJT05fRk9STV9JRDogJ21pZ3JhdGlvbkZvcm1JZCcsXHJcbn07XHJcblxyXG50eXBlIEZpcm13YXJlRGV2aWNlTWFwID0gUmVjb3JkPG51bWJlciwgUmVjb3JkPHN0cmluZywgc3RyaW5nW10+PjtcclxuXHJcbmludGVyZmFjZSBNaWdyYXRlZEVudGl0eUxpa2Uge1xyXG4gIGlkPzogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbDtcclxuICBjdWNtSWQ/OiBudW1iZXIgfCBzdHJpbmcgfCBudWxsO1xyXG4gIGRldmljZXM/OiB1bmtub3duW107XHJcbiAgc291cmNlU2l0ZT86IHtcclxuICAgIGlkPzogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbDtcclxuICAgIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xyXG4gIH0gfCBudWxsO1xyXG4gIHdlYmV4TWlncmF0aW9uRGV2aWNlcz86IHVua25vd25bXTtcclxufVxyXG5cclxuaW50ZXJmYWNlIE1pZ3JhdGVkRGV2aWNlTGlrZSB7XHJcbiAgZGV2aWNlPzogTWlncmF0ZWREZXZpY2VMaWtlO1xyXG4gIGlkPzogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbDtcclxuICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcclxuICBtYWM/OiBzdHJpbmcgfCBudWxsO1xyXG4gIGRldmljZUlkPzogc3RyaW5nIHwgbnVsbDtcclxuICBjaXNVdWlkPzogc3RyaW5nIHwgbnVsbDtcclxuICBjdWNtSWQ/OiBudW1iZXIgfCBzdHJpbmcgfCBudWxsO1xyXG4gIGlzUmVnaXN0ZXJlZD86IGJvb2xlYW4gfCBudWxsO1xyXG4gIGRldmljZVRvVXBncmFkZT86IGJvb2xlYW4gfCBudWxsO1xyXG4gIGlzRWxpZ2libGU/OiBib29sZWFuIHwgbnVsbDtcclxuICBsaW5lQXNzb2NpYXRpb25zPzogQXJyYXk8e1xyXG4gICAgZGlyZWN0b3J5TnVtYmVyPzoge1xyXG4gICAgICBkaXJlY3RvcnlOdW1iZXI/OiBzdHJpbmcgfCBudWxsO1xyXG4gICAgICB0ZW1wbGF0ZURpcmVjdG9yeU51bWJlcj86IHN0cmluZyB8IG51bGw7XHJcbiAgICB9IHwgbnVsbDtcclxuICAgIGUxNjRNYXNrPzogc3RyaW5nIHwgbnVsbDtcclxuICB9PjtcclxuICBsaW5lcz86IEFycmF5PHtcclxuICAgIGRpcmVjdG9yeU51bWJlcj86IHtcclxuICAgICAgZGlyZWN0b3J5TnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcclxuICAgICAgdGVtcGxhdGVEaXJlY3RvcnlOdW1iZXI/OiBzdHJpbmcgfCBudWxsO1xyXG4gICAgfSB8IG51bGw7XHJcbiAgfT47XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLXVzZXJzLWxpc3QnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi91c2Vycy1saXN0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi91c2Vycy1saXN0LmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBVc2Vyc0xpc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgQElucHV0KCkgdG9rZW4hOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgY3VzdG9tZXJJZCE6IG51bWJlcjtcclxuICBASW5wdXQoKSBzaXRlSWQhOiBudW1iZXI7XHJcblxyXG4gIEBPdXRwdXQoKSBvcGVuVXNlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgdXNlck1vdmVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBzd2l0Y2hUb1dpemFyZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgY3JlYXRlVXNlclJlcXVlc3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgQElucHV0KCkgaG9zdCE6IHN0cmluZztcclxuXHJcbiAgZGF0YVBlbmRpbmchOiBib29sZWFuO1xyXG4gIG1vdmVJblByb2dyZXNzVXNlcklkITogc3RyaW5nO1xyXG4gIHVzZXJzITogTGlzdFVzZXJbXTtcclxuICBkYXRhU291cmNlITogTWF0VGFibGVEYXRhU291cmNlPExpc3RVc2VyPjtcclxuICBkaXNwbGF5ZWRDb2x1bW5zID0gRElTUExBWUVEX0NPTFM7XHJcbiAgbW92ZVVzZXI6IGFueTtcclxuICBtb3ZlVXNlckluZGV4OiBhbnk7XHJcbiAgc2hvd01vdmVVc2VyV2l6YXJkID0gZmFsc2U7XHJcbiAgbW92ZVVzZXJQZW5kaW5nID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xyXG5cclxuICBwdWJsaWMgcmVhZG9ubHkgT05fUFJFTV9JRCA9IE9OX1BSRU1fSUQ7XHJcblxyXG4gIHRvdGFsVXNlcnNDb3VudDogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgZ2V0VG9kYXlTaG9ydERhdGUoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XHJcbiAgICBjb25zdCBtb250aCA9IG5vdy5nZXRNb250aCgpICsgMTtcclxuICAgIGNvbnN0IGRheSA9IG5vdy5nZXREYXRlKCk7XHJcbiAgICBjb25zdCB5ZWFyID0gbm93LmdldEZ1bGxZZWFyKCkgJSAxMDA7XHJcbiAgICByZXR1cm4gYCR7bW9udGh9LyR7ZGF5fS8ke3llYXIudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfWA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzTWlncmF0aW9uU3RhdHVzQ29tcGxldGVkKHN0YXR1czogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIChzdGF0dXMgfHwgJycpLnRvVXBwZXJDYXNlKCkgPT09ICdDT01QTEVURUQnO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc01pZ3JhdGlvblN0YXR1c0ZhaWxlZChzdGF0dXM6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSAoc3RhdHVzIHx8ICcnKS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWQgPT09ICdGQUlMRUQnIHx8IG5vcm1hbGl6ZWQgPT09ICdFUlJPUic7XHJcbiAgfVxyXG5cclxuICBnZXQgZm9ybSgpOiBGb3JtR3JvdXAge1xyXG4gICAgcmV0dXJuIHRoaXMudXNlclNlcnZpY2U/LnVzZXI/LmZvcm07XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyB1c2VyU2VydmljZTogVXNlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGFwaVNlcnZpY2U6IEFQSVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGFwaVdlYmV4U2VydmljZTogQXBpV2ViZXhTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBub3RpZmljYXRpb25zOiBOb3RpZmljYXRpb25TZXJ2aWNlLFxyXG4gICAgcHVibGljIHVzZXJzU2VhcmNoU2VydmljZTogVXNlcnNTZWFyY2hTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZyxcclxuICApIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMudXNlcnNTZWFyY2hTZXJ2aWNlLnNldERlZmF1bHRWYWx1ZXMoKTtcclxuICAgIHRoaXMudXNlcnNTZWFyY2hTZXJ2aWNlLmN1c3RvbWVySWQgPSB0aGlzLmN1c3RvbWVySWQ7XHJcbiAgICB0aGlzLnVzZXJzU2VhcmNoU2VydmljZS5zaXRlSWQgPSB0aGlzLnNpdGVJZDtcclxuICAgIHRoaXMuYXBpU2VydmljZS50b2tlbiA9IHRoaXMudG9rZW47XHJcbiAgICB0aGlzLmFwaVdlYmV4U2VydmljZS50b2tlbiA9IHRoaXMudG9rZW47XHJcbiAgICB0aGlzLmFwaVNlcnZpY2UuYXBpVXJsID0gdGhpcy5ob3N0ICsgJy9kY3AnO1xyXG4gICAgdGhpcy5hcGlXZWJleFNlcnZpY2UuYXBpVXJsID0gdGhpcy5ob3N0ICsgJy93ZWJleCc7XHJcblxyXG4gICAgdGhpcy5nZXRNaWdyYXRlZFVzZXJzKCk7XHJcbiAgICBjb25zdCBzdWJzY3JpcHRpb24gPSB0aGlzLnVzZXJzU2VhcmNoU2VydmljZS5mb3VuZFVzZXJzJC5zdWJzY3JpYmUoXHJcbiAgICAgICh1c2VyczogTGlzdFVzZXJbXSkgPT4ge1xyXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZURhdGFTb3VyY2UodXNlcnMpO1xyXG4gICAgICB9LFxyXG4gICAgKTtcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHN1YnNjcmlwdGlvbik7XHJcblxyXG4gICAgY29uc29sZS5sb2coJ3VzZXJzIGxpc3QgcGFyaXMgNzc3MycpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICBpZiAodGhpcy5zdWJzY3JpcHRpb25zPy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goKHN1YnNjcmlwdGlvbikgPT4gc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCkpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICBwYWdlTnVtYmVyQ2hhbmdlRXZlbnQocGVyUGFnZU51bWJlcjogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLnVzZXJzU2VhcmNoU2VydmljZS5wYWdlU2l6ZSA9IHBlclBhZ2VOdW1iZXI7XHJcbiAgICB0aGlzLnVzZXJzU2VhcmNoU2VydmljZS5wYWdlSW5kZXggPSAwO1xyXG4gICAgdGhpcy5ydW5TZWFyY2goKTtcclxuICB9XHJcblxyXG4gIGNsb3NlTW92ZVVzZXJXaXphcmQoYWZ0ZXJVc2VyTW92ZT86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMubW92ZVVzZXIgPSBudWxsO1xyXG4gICAgdGhpcy5tb3ZlVXNlckluZGV4ID0gbnVsbDtcclxuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKExPQ0FMX1NUT1JBR0UuVVNFUl9JTl9NSUdSQVRJT04pO1xyXG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oTE9DQUxfU1RPUkFHRS5NSUdSQVRJT05fRk9STV9JRCk7XHJcbiAgICB0aGlzLnNob3dNb3ZlVXNlcldpemFyZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5zd2l0Y2hUb1dpemFyZC5lbWl0KGZhbHNlKTtcclxuICAgIGlmIChhZnRlclVzZXJNb3ZlKSB7XHJcbiAgICAgIHRoaXMuZ2V0TWlncmF0ZWRVc2VycygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcGFnZUV2ZW50KGV2ZW50OiBQYWdlRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMudXNlcnNTZWFyY2hTZXJ2aWNlLnBhZ2VTaXplID0gZXZlbnQucGFnZVNpemU7XHJcbiAgICB0aGlzLnVzZXJzU2VhcmNoU2VydmljZS5wYWdlSW5kZXggPSBldmVudC5wYWdlSW5kZXg7XHJcbiAgICB0aGlzLnJ1blNlYXJjaCgpO1xyXG4gIH1cclxuXHJcbiAgb25Vc2VyQ2xpY2sodXNlcjogTGlzdFVzZXIpOiB2b2lkIHtcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdpc1dlYmV4JywgU3RyaW5nKCEhdXNlci53ZWJleFVVSUQpKTtcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd3ZWJleFVVSUQnLCAnbnVsbCcpO1xyXG4gICAgaWYgKHVzZXIud2ViZXhVVUlEKSB7XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd3ZWJleFVVSUQnLCBTdHJpbmcodXNlci53ZWJleFVVSUQpKTtcclxuICAgIH1cclxuICAgIHRoaXMub3BlblVzZXIuZW1pdCh1c2VyKTtcclxuICB9XHJcblxyXG4gIG1vdmVVc2VyVG9NVCh1c2VyOiBMaXN0VXNlcik6IHZvaWQge1xyXG4gICAgaWYgKHVzZXIgJiYgdXNlci5zaXRlSWQgJiYgdXNlci51c2VyaWQpIHtcclxuICAgICAgdGhpcy5tb3ZlVXNlclBlbmRpbmcgPSB0cnVlO1xyXG4gICAgICB0aGlzLm1vdmVJblByb2dyZXNzVXNlcklkID0gdXNlci51c2VyaWQ7XHJcbiAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHRoaXMuZ2V0VXNlckluZGV4QnlJZCh1c2VyLnVzZXJpZCk7XHJcbiAgICAgIGlmIChjdXJyZW50SW5kZXggPiAtMSkge1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdHVzVG9Vc2VyKGN1cnJlbnRJbmRleCwgJ0luIFByb2dyZXNzJyk7XHJcbiAgICAgIH1cclxuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oTE9DQUxfU1RPUkFHRS5VU0VSX0lOX01JR1JBVElPTiwgdXNlci51c2VyaWQpO1xyXG5cclxuICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gdGhpcy51c2VyU2VydmljZVxyXG4gICAgICAgIC5tb3ZlVXNlclRvTVQodGhpcy5jdXN0b21lcklkLCB1c2VyKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAoZm9ybUlkOiBudW1iZXIpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5tb3ZlVXNlciA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMubW92ZVVzZXJJbmRleCA9IG51bGw7XHJcbiAgICAgICAgICAgIGlmIChmb3JtSWQpIHtcclxuICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShMT0NBTF9TVE9SQUdFLk1JR1JBVElPTl9GT1JNX0lELCBTdHJpbmcoZm9ybUlkKSk7XHJcbiAgICAgICAgICAgICAgdGhpcy5wb2xsTWlncmF0aW9uRm9ybVN0YXR1c0J5VXNlcklkKGZvcm1JZCwgdXNlci51c2VyaWQsICgpID0+IHRoaXMuZ2V0TWlncmF0ZWRVc2VycygpKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLmdldE1pZ3JhdGVkVXNlcnMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVVc2VySW5NaWdyYXRpb25Qcm9ncmVzcygpO1xyXG4gICAgICAgICAgICB0aGlzLnNldFN0YXR1c1RvVXNlcih0aGlzLmdldFVzZXJJbmRleEJ5SWQodXNlci51c2VyaWQpLCAnTWlncmF0aW9uIEVycm9yJyk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICk7XHJcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHN1YnNjcmlwdGlvbik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBtb3ZlVXNlclRvREkodXNlcjogTGlzdFVzZXIsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh1c2VyICYmIHVzZXIuc2l0ZUlkICYmIHVzZXIud2ViZXhVVUlEKSB7XHJcbiAgICAgIHRoaXMubW92ZVVzZXJQZW5kaW5nID0gdHJ1ZTtcclxuICAgICAgdGhpcy5tb3ZlSW5Qcm9ncmVzc1VzZXJJZCA9IHVzZXIudXNlcmlkO1xyXG4gICAgICB0aGlzLnVzZXJzW2luZGV4XS5zdGF0dXMgPSAnSW4gUHJvZ3Jlc3MnO1xyXG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShMT0NBTF9TVE9SQUdFLlVTRVJfSU5fTUlHUkFUSU9OLCB1c2VyLnVzZXJpZCk7XHJcblxyXG4gICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSB0aGlzLnVzZXJTZXJ2aWNlXHJcbiAgICAgICAgLm1vdmVVc2VyVG9ESSh0aGlzLmN1c3RvbWVySWQsIHVzZXIpXHJcbiAgICAgICAgLnN1YnNjcmliZShcclxuICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVVc2VySW5NaWdyYXRpb25Qcm9ncmVzcygpO1xyXG4gICAgICAgICAgICB0aGlzLnNldFN0YXR1c1RvVXNlcihpbmRleCwgJ0FjdGl2ZScpO1xyXG4gICAgICAgICAgICB0aGlzLnVzZXJzW2luZGV4XS53ZWJleFVVSUQgPSAnJztcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgIHRoaXMudXNlcnNTZWFyY2hTZXJ2aWNlLm1pZ3JhdGVkVXNlcnMgJiZcclxuICAgICAgICAgICAgICB0aGlzLnVzZXJzU2VhcmNoU2VydmljZS5taWdyYXRlZFVzZXJzLmxlbmd0aFxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICB0aGlzLnVzZXJzU2VhcmNoU2VydmljZS5taWdyYXRlZFVzZXJzID1cclxuICAgICAgICAgICAgICAgIHRoaXMudXNlcnNTZWFyY2hTZXJ2aWNlLm1pZ3JhdGVkVXNlcnMuZmlsdGVyKFxyXG4gICAgICAgICAgICAgICAgICAobWlncmF0ZWRVc2VyOiBhbnkpID0+IG1pZ3JhdGVkVXNlci51c2VyaWQgIT09IHVzZXIuZW1haWwsXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZVVzZXJJbk1pZ3JhdGlvblByb2dyZXNzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdHVzVG9Vc2VyKGluZGV4LCAnTWlncmF0aW9uIEVycm9yJyk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChzdWJzY3JpcHRpb24pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW1vdmVVc2VySW5NaWdyYXRpb25Qcm9ncmVzcygpOiB2b2lkIHtcclxuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKExPQ0FMX1NUT1JBR0UuVVNFUl9JTl9NSUdSQVRJT04pO1xyXG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oTE9DQUxfU1RPUkFHRS5NSUdSQVRJT05fRk9STV9JRCk7XHJcbiAgICB0aGlzLm1vdmVJblByb2dyZXNzVXNlcklkID0gJyc7XHJcbiAgICB0aGlzLm1vdmVVc2VyUGVuZGluZyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRTdGF0dXNUb1VzZXIoaW5kZXg6IG51bWJlciwgc3RhdHVzOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnVzZXJzICYmIHRoaXMudXNlcnNbaW5kZXhdKSB7XHJcbiAgICAgIHRoaXMudXNlcnNbaW5kZXhdLnN0YXR1cyA9IHN0YXR1cztcclxuICAgICAgLy8gaWYgKHN0YXR1cyA9PT0gJ01pZ3JhdGVkJykge1xyXG4gICAgICAvLyAgIHRoaXMudXNlcnNbaW5kZXhdLnJvbGVOYW1lID0gJyc7XHJcbiAgICAgIC8vICAgdGhpcy51c2Vyc1tpbmRleF0uaXNNaWdyYXRlZCA9IHRydWU7XHJcbiAgICAgIC8vICAgdGhpcy51c2Vyc1tpbmRleF0uc3RhdHVzID0gc3RhdHVzO1xyXG4gICAgICAvLyB9IGVsc2Uge1xyXG4gICAgICAvLyAgIHRoaXMudXNlcnNbaW5kZXhdLnJvbGVOYW1lID0gJ0RlZGljYXRlZCBJbnN0YW5jZSBDYWxsaW5nIHVzZXInO1xyXG4gICAgICAvLyAgIHRoaXMudXNlcnNbaW5kZXhdLmlzTWlncmF0ZWQgPSBmYWxzZTtcclxuICAgICAgLy8gICB0aGlzLnVzZXJzW2luZGV4XS5zdGF0dXMgPSBzdGF0dXM7XHJcbiAgICAgIC8vIH1cclxuICAgIH1cclxuICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UodGhpcy51c2Vycyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRpYWxpemVEYXRhU291cmNlKHVzZXJzOiBMaXN0VXNlcltdKTogdm9pZCB7XHJcbiAgICBpZiAodXNlcnM/Lmxlbmd0aCkge1xyXG4gICAgICAvLyB0aGlzLnNldFJhbmRvbVVzZXJSb2xlKHVzZXJzKTtcclxuICAgICAgdGhpcy51c2VycyA9IHVzZXJzO1xyXG4gICAgICAvLyBzZXQgdG90YWwgcm93cyBjb3VudCBmb3IgdG9vbGJhci9wYWdpbmF0aW9uIGZyb20gc2VydmVyLXNpZGUgcGFnaW5hdGlvbiB3aGVuIGF2YWlsYWJsZVxyXG4gICAgICB0aGlzLnRvdGFsVXNlcnNDb3VudCA9IHRoaXMudXNlcnNTZWFyY2hTZXJ2aWNlPy50b3RhbCB8fCB1c2Vycy5sZW5ndGg7XHJcbiAgICAgIHRoaXMuc2V0VXNlck1pZ3JhdGlvblByb2dyZXNzKCk7XHJcbiAgICAgIHRoaXMudXNlcnNTZWFyY2hTZXJ2aWNlLnNldE1pZ3JhdGVkUHJvcFRvVXNlcnModGhpcy51c2Vycyk7XHJcbiAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UodXNlcnMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRVc2VyUm9sZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnVzZXJzPy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy51c2Vycy5mb3JFYWNoKCh1c2VyKSA9PiB7XHJcbiAgICAgICAgaWYgKCF1c2VyLmlzTWlncmF0ZWQpIHtcclxuICAgICAgICAgIHVzZXIucm9sZU5hbWUgPSAnRGVkaWNhdGVkIEluc3RhbmNlIENhbGxpbmcgdXNlcic7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0UmFuZG9tVXNlclJvbGUodXNlcnM6IExpc3RVc2VyW10pOiB2b2lkIHtcclxuICAgIGNvbnN0IG1heCA9IE1hdGgucm91bmQoXHJcbiAgICAgIHRoaXMudXNlcnNTZWFyY2hTZXJ2aWNlLnBhZ2VTaXplIC0gdGhpcy51c2Vyc1NlYXJjaFNlcnZpY2UucGFnZVNpemUgLyA0LFxyXG4gICAgKTtcclxuICAgIGNvbnN0IG1pbiA9IE1hdGgucm91bmQodGhpcy51c2Vyc1NlYXJjaFNlcnZpY2UucGFnZVNpemUgLyAyKTtcclxuICAgIGNvbnN0IHJhbmRvbUFtb3VudCA9IE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4pICsgbWluKTtcclxuICAgIGNvbnN0IGluZGV4ZXMgPSB0aGlzLmdldEFycmF5T2ZSYW5kb21Vc2VySW5kZXhlcyhyYW5kb21BbW91bnQpO1xyXG4gICAgaW5kZXhlcy5mb3JFYWNoKChpbmRleCkgPT4ge1xyXG4gICAgICBpZiAodXNlcnNbaW5kZXhdKSB7XHJcbiAgICAgICAgdXNlcnNbaW5kZXhdLnJvbGVOYW1lID0gJ0RlZGljYXRlZCBJbnN0YW5jZSBDYWxsaW5nIHVzZXInO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0QXJyYXlPZlJhbmRvbVVzZXJJbmRleGVzKHJhbmRvbUFtb3VudDogbnVtYmVyKTogbnVtYmVyW10ge1xyXG4gICAgY29uc3QgaW5kZXhlcyA9IFtdO1xyXG4gICAgd2hpbGUgKHJhbmRvbUFtb3VudCA+IDApIHtcclxuICAgICAgY29uc3QgaW5kZXggPSBNYXRoLnJvdW5kKFxyXG4gICAgICAgIE1hdGgucmFuZG9tKCkgKiAodGhpcy51c2Vyc1NlYXJjaFNlcnZpY2UucGFnZVNpemUgLSAxKSxcclxuICAgICAgKTtcclxuICAgICAgaW5kZXhlcy5wdXNoKGluZGV4KTtcclxuICAgICAgcmFuZG9tQW1vdW50LS07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaW5kZXhlcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcnVuU2VhcmNoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kYXRhUGVuZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLnVzZXJzU2VhcmNoU2VydmljZS5xdWlja1JlZ3VsYXJVc2Vyc1NlYXJjaCgpLnN1YnNjcmliZShcclxuICAgICAgKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGF0YVBlbmRpbmcgPSBmYWxzZTtcclxuICAgICAgfSxcclxuICAgICAgKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGF0YVBlbmRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnMuZXJyb3IoJ1RoZSBkYXRhIGNhbiBub3QgYmUgcmVjZWl2ZWQnKTtcclxuICAgICAgfSxcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldFVzZXJNaWdyYXRpb25Qcm9ncmVzcygpOiB2b2lkIHtcclxuICAgIGNvbnN0IHVzZXJJZEluTWlncmF0aW9uID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXHJcbiAgICAgIExPQ0FMX1NUT1JBR0UuVVNFUl9JTl9NSUdSQVRJT04sXHJcbiAgICApO1xyXG4gICAgY29uc3QgbWlncmF0aW9uRm9ybUlkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXHJcbiAgICAgIExPQ0FMX1NUT1JBR0UuTUlHUkFUSU9OX0ZPUk1fSUQsXHJcbiAgICApO1xyXG4gICAgaWYgKHVzZXJJZEluTWlncmF0aW9uKSB7XHJcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy51c2Vycy5maW5kSW5kZXgoXHJcbiAgICAgICAgKHVzZXIpID0+IHVzZXIudXNlcmlkID09PSB1c2VySWRJbk1pZ3JhdGlvbixcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5tb3ZlSW5Qcm9ncmVzc1VzZXJJZCA9IGluZGV4ID4gLTEgPyB0aGlzLnVzZXJzW2luZGV4XS51c2VyaWQgOiAnJztcclxuICAgICAgdGhpcy5tb3ZlVXNlclBlbmRpbmcgPSBpbmRleCA+IC0xO1xyXG4gICAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdHVzVG9Vc2VyKGluZGV4LCAnSW4gUHJvZ3Jlc3MnKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobWlncmF0aW9uRm9ybUlkKSB7XHJcbiAgICAgICAgdGhpcy5wb2xsTWlncmF0aW9uRm9ybVN0YXR1cyhOdW1iZXIobWlncmF0aW9uRm9ybUlkKSwgaW5kZXgsICgpID0+IHRoaXMuZ2V0TWlncmF0ZWRVc2VycygpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRNaWdyYXRlZFVzZXJzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kYXRhUGVuZGluZyA9IHRydWU7XHJcbiAgICBjb25zdCBzZWFyY2hQYXJhbXMgPSB7XHJcbiAgICAgIGN1c3RvbWVyaWQ6IHRoaXMuY3VzdG9tZXJJZCxcclxuICAgICAgc2l0ZWlkOiB0aGlzLnNpdGVJZCxcclxuICAgICAgJ2Nsb3VkLW9ubHknOiAndHJ1ZScsXHJcbiAgICB9O1xyXG4gICAgLy8gdGhpcy51c2Vyc1NlYXJjaFNlcnZpY2UucXVpY2tXZWJleFVzZXJzU2VhcmNoKHNlYXJjaFBhcmFtcywgdHJ1ZSwgTUFYX0lOVEVHRVIpXHJcbiAgICB0aGlzLnVzZXJzU2VhcmNoU2VydmljZVxyXG4gICAgICAuZ2V0TWlncmF0ZWRVc2Vycyh0aGlzLmN1c3RvbWVySWQpXHJcbiAgICAgIC8vIHRoaXMudXNlcnNTZWFyY2hTZXJ2aWNlLmdldE1pZ3JhdGVkV2ViZXhVc2Vycyh0aGlzLmN1c3RvbWVySWQpXHJcbiAgICAgIC5zdWJzY3JpYmUoXHJcbiAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgdXNlcklkSW5NaWdyYXRpb24gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcclxuICAgICAgICAgICAgTE9DQUxfU1RPUkFHRS5VU0VSX0lOX01JR1JBVElPTixcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHVzZXJJZEluTWlncmF0aW9uICYmXHJcbiAgICAgICAgICAgIHRoaXMudXNlcnNTZWFyY2hTZXJ2aWNlLm1pZ3JhdGVkVXNlcnMuZmlsdGVyKFxyXG4gICAgICAgICAgICAgIChtaWdyYXRlZFVzZXI6IGFueSkgPT4gbWlncmF0ZWRVc2VyLnVzZXJpZCA9PT0gdXNlcklkSW5NaWdyYXRpb24sXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShMT0NBTF9TVE9SQUdFLlVTRVJfSU5fTUlHUkFUSU9OKTtcclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oTE9DQUxfU1RPUkFHRS5NSUdSQVRJT05fRk9STV9JRCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnJ1blNlYXJjaCgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5kYXRhUGVuZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zLmVycm9yKCdUaGUgZGF0YSBjYW4gbm90IGJlIHJlY2VpdmVkJyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIG9uTW92ZVVzZXIodXNlcjogTGlzdFVzZXIsIGluZGV4OiBudW1iZXIsIHR5cGU6IHN0cmluZywgdGl0bGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihVc2VyTGlzdENvbmZpcm1EaWFsb2dDb21wb25lbnQsIHtcclxuICAgICAgZGF0YToge1xyXG4gICAgICAgIHRpdGxlOiBgVXBncmFkZSB1c2VyICR7dXNlci51c2VyaWR9IHRvIE11bHRpIFRlbmFudD9gLFxyXG4gICAgICAgIG1lc3NhZ2U6IGA8cD5VcGdyYWRpbmcgdGhpcyB1c2VyIHdpbGwgcHJlcGFyZSB0aGUgYWNjb3VudCBmb3IgbWlncmF0aW9uIHRvIE11bHRpIFRlbmFudC48L3A+XHJcbiAgICAgICAgICA8cD5EdXJpbmcgdGhpcyBwcm9jZXNzLCB0aGUgdXNlciBjb25maWd1cmF0aW9uIHdpbGwgYmUgY29waWVkIHRvIHRoZSBNdWx0aSBUZW5hbnQgZW52aXJvbm1lbnQuXHJcbiAgICAgICAgICBUaGUgdXNlciB3aWxsIHJlbWFpbiBhY3RpdmUgb24gdGhlIGN1cnJlbnQgc3lzdGVtIHVudGlsIHRoZSBBY3RpdmF0ZSBzdGVwIGlzIGNvbXBsZXRlZC48L3A+XHJcbiAgICAgICAgICA8cD5EbyB5b3Ugd2FudCB0byBjb250aW51ZT88L3A+YCxcclxuICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ1llcywgdXBncmFkZScsXHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICAgIGRpYWxvZ1JlZi5iZWZvcmVDbG9zZWQoKS5zdWJzY3JpYmUoKHJlc3VsdDogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgICAgIGNhc2UgJ1F1aWNrTW92ZSc6XHJcbiAgICAgICAgICAgIHRoaXMubW92ZVVzZXJUb01UKHVzZXIpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgJ01UJzpcclxuICAgICAgICAgICAgdGhpcy5tb3ZlVXNlciA9IHVzZXI7XHJcbiAgICAgICAgICAgIHRoaXMubW92ZVVzZXJJbmRleCA9IGluZGV4O1xyXG4gICAgICAgICAgICB0aGlzLnNob3dNb3ZlVXNlcldpemFyZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuc3dpdGNoVG9XaXphcmQuZW1pdCh0cnVlKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlICdESSc6XHJcbiAgICAgICAgICAgIHRoaXMubW92ZVVzZXJUb0RJKHVzZXIsIGluZGV4KTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHJ1bk1vdmVVc2VyVG9NVCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLm1vdmVVc2VyICYmIHRoaXMubW92ZVVzZXIuc2l0ZUlkICYmIHRoaXMubW92ZVVzZXIudXNlcmlkKSB7XHJcbiAgICAgIHRoaXMudXNlclNlcnZpY2UubW92ZVVzZXJQZW5kaW5nID0gdHJ1ZTtcclxuICAgICAgdGhpcy5tb3ZlSW5Qcm9ncmVzc1VzZXJJZCA9IHRoaXMubW92ZVVzZXIudXNlcmlkO1xyXG4gICAgICB0aGlzLnNldFN0YXR1c1RvVXNlcih0aGlzLm1vdmVVc2VySW5kZXgsICdJbiBQcm9ncmVzcycpO1xyXG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcclxuICAgICAgICBMT0NBTF9TVE9SQUdFLlVTRVJfSU5fTUlHUkFUSU9OLFxyXG4gICAgICAgIHRoaXMubW92ZVVzZXIudXNlcmlkLFxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHRoaXMudXNlclNlcnZpY2VcclxuICAgICAgLm1vdmVVc2VyVG9NVCh0aGlzLmN1c3RvbWVySWQsIHRoaXMubW92ZVVzZXIpXHJcbiAgICAgIC5zdWJzY3JpYmUoXHJcbiAgICAgICAgKGZvcm1JZDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICBpZiAoZm9ybUlkKSB7XHJcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKExPQ0FMX1NUT1JBR0UuTUlHUkFUSU9OX0ZPUk1fSUQsIFN0cmluZyhmb3JtSWQpKTtcclxuICAgICAgICAgICAgdGhpcy5wb2xsTWlncmF0aW9uRm9ybVN0YXR1cyhmb3JtSWQsIHRoaXMubW92ZVVzZXJJbmRleCwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMudXNlclNlcnZpY2UudXNlck1vdmVkJC5uZXh0KHRydWUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMudXNlclNlcnZpY2UudXNlck1vdmVkJC5uZXh0KHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5yZW1vdmVVc2VySW5NaWdyYXRpb25Qcm9ncmVzcygpO1xyXG4gICAgICAgICAgdGhpcy5zZXRTdGF0dXNUb1VzZXIodGhpcy5tb3ZlVXNlckluZGV4LCAnTWlncmF0aW9uIEVycm9yJyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgKTtcclxuXHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChzdWJzY3JpcHRpb24pO1xyXG4gIH1cclxuXHJcbiAgc2VhcmNoVXNlcnModG9rZW46IHN0cmluZywgdHlwZT86IFVTRVJfVFlQRVNfVFlQRSk6IHZvaWQge1xyXG4gICAgLy8gaWYgdG9rZW4gaXMgZW1wdHkg4oCUIHJlc3RvcmUgY3VycmVudCBwYWdlIGRhdGFzb3VyY2VcclxuICAgIGlmICghdG9rZW4gJiYgIXR5cGUpIHtcclxuICAgICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZSh0aGlzLnVzZXJzKTtcclxuICAgICAgdGhpcy50b3RhbFVzZXJzQ291bnQgPSB0aGlzLnVzZXJzU2VhcmNoU2VydmljZT8udG90YWwgfHwgdGhpcy51c2Vycy5sZW5ndGg7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBmZXRjaCBhbGwgdXNlcnMgKHNlcnZlci1zaWRlKSBhbmQgZmlsdGVyIGxvY2FsbHkgYWNyb3NzIHRoZSB3aG9sZSBkYXRhc2V0XHJcbiAgICB0aGlzLmRhdGFQZW5kaW5nID0gdHJ1ZTtcclxuICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHRoaXMudXNlcnNTZWFyY2hTZXJ2aWNlLmdldEFsbFJlZ3VsYXJVc2VycygpXHJcbiAgICAgIC5zdWJzY3JpYmUoXHJcbiAgICAgICAgKGFsbFVzZXJzOiBMaXN0VXNlcltdKSA9PiB7XHJcbiAgICAgICAgICBsZXQgZmlsdGVyZWQ6IExpc3RVc2VyW107XHJcbiAgICAgICAgICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGZpbHRlcmVkID0gdGhpcy5maWx0ZXJCeVRva2VuKGFsbFVzZXJzLCB0b2tlbik7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBmaWx0ZXJlZCA9IHRoaXMuZmlsdGVyQnlUeXBlKGFsbFVzZXJzLCB0eXBlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UoZmlsdGVyZWQpO1xyXG4gICAgICAgICAgdGhpcy50b3RhbFVzZXJzQ291bnQgPSBmaWx0ZXJlZC5sZW5ndGg7XHJcbiAgICAgICAgICB0aGlzLmRhdGFQZW5kaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmRhdGFQZW5kaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnMuZXJyb3IoJ1RoZSBkYXRhIGNhbiBub3QgYmUgcmVjZWl2ZWQnKTtcclxuICAgICAgICB9LFxyXG4gICAgICApO1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goc3Vic2NyaXB0aW9uKTtcclxuICB9XHJcblxyXG4gIHNlYXJjaEJ5VHlwZSh1c2VyVHlwZTogVVNFUl9UWVBFU19UWVBFKSB7XHJcbiAgICB0aGlzLnNlYXJjaFVzZXJzKCcnLCB1c2VyVHlwZSk7XHJcbiAgfVxyXG5cclxuICBvbkNyZWF0ZVVzZXJSZXF1ZXN0ZWQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNyZWF0ZVVzZXJSZXF1ZXN0ZWQuZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmaWx0ZXJCeVRva2VuKHVzZXJzOiBMaXN0VXNlcltdLCB0b2tlbjogc3RyaW5nKTogTGlzdFVzZXJbXSB7XHJcbiAgICBjb25zdCB0b2sgPSAodG9rZW4gfHwgJycpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBjb25zdCBmaWx0ZXJlZCA9ICh1c2VycyB8fCBbXSkuZmlsdGVyKCh1c2VyOiBMaXN0VXNlcikgPT4ge1xyXG4gICAgICBjb25zdCBmaXJzdE5hbWUgPSAodXNlcj8uZmlyc3ROYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICBjb25zdCBsYXN0TmFtZSA9ICh1c2VyPy5sYXN0TmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKTtcclxuICAgICAgY29uc3QgZnVsbE5hbWUgPSBgJHtmaXJzdE5hbWV9ICR7bGFzdE5hbWV9YC50cmltKCk7XHJcbiAgICAgIGNvbnN0IGVtYWlsID0gKHVzZXI/LmVtYWlsIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICByZXR1cm4gKFxyXG4gICAgICAgIGZpcnN0TmFtZS5pbmNsdWRlcyh0b2spIHx8XHJcbiAgICAgICAgbGFzdE5hbWUuaW5jbHVkZXModG9rKSB8fFxyXG4gICAgICAgIGZ1bGxOYW1lLmluY2x1ZGVzKHRvaykgfHxcclxuICAgICAgICBlbWFpbC5pbmNsdWRlcyh0b2spXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gZmlsdGVyZWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZpbHRlckJ5VHlwZSh1c2VyczogTGlzdFVzZXJbXSwgdXNlclR5cGU6IFVTRVJfVFlQRVNfVFlQRSk6IExpc3RVc2VyW10ge1xyXG4gICAgbGV0IGZpbHRlcmVkVXNlcnM6IExpc3RVc2VyW107XHJcbiAgICBpZiAodXNlclR5cGUgPT09IFVTRVJfVFlQRVNfTUFQLkNVQ00pIHtcclxuICAgICAgZmlsdGVyZWRVc2VycyA9IHVzZXJzLmZpbHRlcigodXNlcikgPT4gIXVzZXIud2ViZXhVVUlEICYmIHVzZXIuY3VjbUlkICE9IE9OX1BSRU1fSUQpO1xyXG4gICAgfSBlbHNlIGlmICh1c2VyVHlwZSA9PT0gVVNFUl9UWVBFU19NQVAuV0VCRVgpIHtcclxuICAgICAgZmlsdGVyZWRVc2VycyA9IHVzZXJzLmZpbHRlcigodXNlcikgPT4gdXNlci53ZWJleFVVSUQgIT09IG51bGwgJiYgdXNlci53ZWJleFVVSUQgIT09IHVuZGVmaW5lZCk7XHJcbiAgICB9IGVsc2UgaWYgKHVzZXJUeXBlID09PSBVU0VSX1RZUEVTX01BUC5PTlBSRU0pIHtcclxuICAgICAgZmlsdGVyZWRVc2VycyA9IHVzZXJzLmZpbHRlcigodXNlcikgPT4gIXVzZXIud2ViZXhVVUlEICYmIHVzZXIuY3VjbUlkID09IE9OX1BSRU1fSUQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZmlsdGVyZWRVc2VycyA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmaWx0ZXJlZFVzZXJzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzVmFsaWRXZWJleFV1aWQodXNlcjogTGlzdFVzZXIpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHZhbHVlID0gdXNlcj8ud2ViZXhVVUlEO1xyXG4gICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgU3RyaW5nKHZhbHVlKS50cmltKCkubGVuZ3RoID4gMDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnVpbGRGaXJtd2FyZURldmljZU1hcChlbnRpdHk6IE1pZ3JhdGVkRW50aXR5TGlrZSB8IG51bGwsIHVzZXI6IExpc3RVc2VyKTogRmlybXdhcmVEZXZpY2VNYXAge1xyXG4gICAgY29uc3QgZGV2aWNlTWFwOiBGaXJtd2FyZURldmljZU1hcCA9IHt9O1xyXG4gICAgY29uc3QgbWFwcGVkRGV2aWNlcyA9IHRoaXMuZ2V0QWN0aXZhdGlvbkRldmljZXMoZW50aXR5LCB1c2VyKTtcclxuXHJcbiAgICBjb25zb2xlLmxvZyhtYXBwZWREZXZpY2VzKVxyXG5cclxuICAgIGNvbnN0IGRldmljZXM6IGFueSA9IFtdO1xyXG5cclxuICAgIG1hcHBlZERldmljZXMuZm9yRWFjaCgocmF3RGV2aWNlOiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgZGV2aWNlID0gcmF3RGV2aWNlO1xyXG4gICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgIGNvbnN0IGlzRWxpZ2libGUgPSBkZXZpY2UuaXNSZWdpc3RlcmVkIHx8IGRldmljZS5kZXZpY2VUb1VwZ3JhZGUgfHwgZGV2aWNlLmlzRWxpZ2libGU7XHJcblxyXG4gICAgICBkZXZpY2VzLnB1c2goe1xyXG4gICAgICAgIHVzZXJJZDogdXNlci51c2VyaWQsXHJcbiAgICAgICAgZGV2aWNlTmFtZTogZGV2aWNlLm5hbWUgfHwgJycsXHJcbiAgICAgICAgZGV2aWNlVHlwZTogZGV2aWNlLnByb2R1Y3QgfHwgZGV2aWNlLm1vZGVsIHx8ICcnLFxyXG4gICAgICAgIHN0YXR1czogaXNFbGlnaWJsZSA/ICdFTElHSUJMRV9UT19VUEdSQURFJyA6ICdVTlJFR0lTVEVSRUQnLFxyXG4gICAgICAgIGVycm9yRGVzY3JpcHRpb246ICcnLFxyXG4gICAgICAgIGN1Y21JZDogdXNlci5jdWNtSWQsXHJcbiAgICAgICAgZmVhdHVyZTogJ1BFUlNPTicsXHJcbiAgICAgICAgc2VsZWN0YWJsZTogdHJ1ZSxcclxuICAgICAgICBkaXNhYmxlZFJlYXNvbjogZmFsc2UgPyAnRklSTVdBUkVfVVBHUkFERS5ERVZJQ0VfTk9UX01JR1JBVEVEJyA6ICcnLFxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICghT2JqZWN0LmtleXMoZGV2aWNlTWFwKS5sZW5ndGgpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZygnRmlybXdhcmUgYWN0aXZhdGlvbjogbm8gdXNhYmxlIGRldmljZXMgZm91bmQgdG8gYnVpbGQgZGV2aWNlTWFwLicpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBkZXZpY2VzLmZvckVhY2goKGRldmljZTogYW55KSA9PiB7XHJcbiAgICAgIGlmICghZGV2aWNlTWFwW2RldmljZS5jdWNtSWRdKSB7XHJcbiAgICAgICAgZGV2aWNlTWFwW2RldmljZS5jdWNtSWRdID0ge307XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFkZXZpY2VNYXBbZGV2aWNlLmN1Y21JZF1bZGV2aWNlLmZlYXR1cmVdKSB7XHJcbiAgICAgICAgZGV2aWNlTWFwW2RldmljZS5jdWNtSWRdW2RldmljZS5mZWF0dXJlXSA9IFtdO1xyXG4gICAgICB9XHJcbiAgICAgIGRldmljZU1hcFtkZXZpY2UuY3VjbUlkXVtkZXZpY2UuZmVhdHVyZV0ucHVzaChkZXZpY2UuZGV2aWNlTmFtZSlcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKFwiZGV2IG1hcCA9PT4gXCIsIGRldmljZU1hcCk7XHJcblxyXG5cclxuICAgIHJldHVybiBkZXZpY2VNYXA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEFjdGl2YXRpb25EZXZpY2VzKGVudGl0eTogTWlncmF0ZWRFbnRpdHlMaWtlIHwgbnVsbCwgdXNlcjogTGlzdFVzZXIpOiB1bmtub3duW10ge1xyXG4gICAgY29uc3QgbWlncmF0ZWRFbnRpdHlEZXZpY2VzOiB1bmtub3duW10gPSBBcnJheS5pc0FycmF5KGVudGl0eT8uZGV2aWNlcylcclxuICAgICAgPyAoZW50aXR5Py5kZXZpY2VzID8/IFtdKVxyXG4gICAgICA6IFtdO1xyXG5cclxuICAgIGNvbnN0IGVudGl0eURldmljZXM6IHVua25vd25bXSA9IEFycmF5LmlzQXJyYXkoZW50aXR5Py53ZWJleE1pZ3JhdGlvbkRldmljZXMpXHJcbiAgICAgID8gKGVudGl0eT8ud2ViZXhNaWdyYXRpb25EZXZpY2VzID8/IFtdKVxyXG4gICAgICA6IFtdO1xyXG5cclxuICAgIGNvbnN0IGFsbEVudGl0eURldmljZXMgPSBbLi4ubWlncmF0ZWRFbnRpdHlEZXZpY2VzLCAuLi5lbnRpdHlEZXZpY2VzXTtcclxuICAgIGlmIChhbGxFbnRpdHlEZXZpY2VzLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm4gYWxsRW50aXR5RGV2aWNlcztcclxuICAgIH1cclxuXHJcbiAgICAvLyBGYWxsYmFjayBmb3IgcGFydGlhbCByZXNwb25zZXMgd2hlcmUgb25seSBsaXN0LXVzZXIgZGV2aWNlcyBhcmUgYXZhaWxhYmxlLlxyXG4gICAgcmV0dXJuIFtcclxuICAgICAgLi4uKEFycmF5LmlzQXJyYXkodXNlcj8uZGV2aWNlcykgPyB1c2VyLmRldmljZXMgOiBbXSksXHJcbiAgICAgIC4uLihBcnJheS5pc0FycmF5KHVzZXI/LmRldmljZVByb2ZpbGVzKSA/IHVzZXIuZGV2aWNlUHJvZmlsZXMgOiBbXSksXHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1bndyYXBNaWdyYXRlZERldmljZShyYXdEZXZpY2U6IHVua25vd24pOiBNaWdyYXRlZERldmljZUxpa2Uge1xyXG4gICAgY29uc3QgY2FuZGlkYXRlID0gcmF3RGV2aWNlIGFzIE1pZ3JhdGVkRGV2aWNlTGlrZTtcclxuICAgIGlmIChjYW5kaWRhdGU/LmRldmljZSkge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIC4uLmNhbmRpZGF0ZS5kZXZpY2UsXHJcbiAgICAgICAgLi4uY2FuZGlkYXRlLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNhbmRpZGF0ZSB8fCB7fTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNNaWdyYXRlZERldmljZUVsaWdpYmxlKGRldmljZTogTWlncmF0ZWREZXZpY2VMaWtlKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBoYXNFbGlnaWJpbGl0eVNpZ25hbCA9IGRldmljZT8uaXNSZWdpc3RlcmVkICE9PSB1bmRlZmluZWRcclxuICAgICAgfHwgZGV2aWNlPy5kZXZpY2VUb1VwZ3JhZGUgIT09IHVuZGVmaW5lZFxyXG4gICAgICB8fCBkZXZpY2U/LmlzRWxpZ2libGUgIT09IHVuZGVmaW5lZDtcclxuXHJcbiAgICBpZiAoIWhhc0VsaWdpYmlsaXR5U2lnbmFsKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAhIShkZXZpY2U/LmlzUmVnaXN0ZXJlZCB8fCBkZXZpY2U/LmRldmljZVRvVXBncmFkZSB8fCBkZXZpY2U/LmlzRWxpZ2libGUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBleHRyYWN0Q3VjbUlkKFxyXG4gICAgZW50aXR5OiBNaWdyYXRlZEVudGl0eUxpa2UgfCBudWxsLFxyXG4gICAgZGV2aWNlOiBNaWdyYXRlZERldmljZUxpa2UsXHJcbiAgICB1c2VyOiBMaXN0VXNlclxyXG4gICk6IG51bWJlciB8IG51bGwge1xyXG4gICAgY29uc3QgZGV2aWNlQ3VjbUlkID0gTnVtYmVyKGRldmljZT8uY3VjbUlkKTtcclxuICAgIGlmIChOdW1iZXIuaXNGaW5pdGUoZGV2aWNlQ3VjbUlkKSAmJiBkZXZpY2VDdWNtSWQgPiAwKSB7XHJcbiAgICAgIHJldHVybiBkZXZpY2VDdWNtSWQ7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdXNlckN1Y21JZCA9IE51bWJlcih1c2VyPy5jdWNtSWQpO1xyXG4gICAgaWYgKE51bWJlci5pc0Zpbml0ZSh1c2VyQ3VjbUlkKSkge1xyXG4gICAgICByZXR1cm4gdXNlckN1Y21JZDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBlbnRpdHlDdWNtSWQgPSBOdW1iZXIoZW50aXR5Py5jdWNtSWQpO1xyXG4gICAgaWYgKE51bWJlci5pc0Zpbml0ZShlbnRpdHlDdWNtSWQpKSB7XHJcbiAgICAgIHJldHVybiBlbnRpdHlDdWNtSWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc29sdmVNaWdyYXRlZERldmljZUtleShkZXZpY2U6IE1pZ3JhdGVkRGV2aWNlTGlrZSk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gU3RyaW5nKFxyXG4gICAgICBkZXZpY2U/Lm5hbWUgfHxcclxuICAgICAgZGV2aWNlPy5tYWMgfHxcclxuICAgICAgZGV2aWNlPy5kZXZpY2VJZCB8fFxyXG4gICAgICBkZXZpY2U/LmNpc1V1aWQgfHxcclxuICAgICAgZGV2aWNlPy5pZCB8fFxyXG4gICAgICAnJ1xyXG4gICAgKS50cmltKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGV4dHJhY3RNaWdyYXRlZERldmljZUxpbmVzKGRldmljZTogTWlncmF0ZWREZXZpY2VMaWtlKTogc3RyaW5nW10ge1xyXG4gICAgY29uc3QgdmFsdWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcblxyXG4gICAgY29uc3QgbGluZUFzc29jaWF0aW9ucyA9IEFycmF5LmlzQXJyYXkoZGV2aWNlPy5saW5lQXNzb2NpYXRpb25zKSA/IGRldmljZS5saW5lQXNzb2NpYXRpb25zIDogW107XHJcbiAgICBsaW5lQXNzb2NpYXRpb25zLmZvckVhY2goKGxpbmVBc3NvY2lhdGlvbikgPT4ge1xyXG4gICAgICBjb25zdCBkaXJlY3RvcnlOdW1iZXIgPSBsaW5lQXNzb2NpYXRpb24/LmRpcmVjdG9yeU51bWJlcj8uZGlyZWN0b3J5TnVtYmVyO1xyXG4gICAgICBjb25zdCB0ZW1wbGF0ZURpcmVjdG9yeU51bWJlciA9IGxpbmVBc3NvY2lhdGlvbj8uZGlyZWN0b3J5TnVtYmVyPy50ZW1wbGF0ZURpcmVjdG9yeU51bWJlcjtcclxuICAgICAgY29uc3QgZTE2NE1hc2sgPSBsaW5lQXNzb2NpYXRpb24/LmUxNjRNYXNrO1xyXG5cclxuICAgICAgW2RpcmVjdG9yeU51bWJlciwgdGVtcGxhdGVEaXJlY3RvcnlOdW1iZXIsIGUxNjRNYXNrXS5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBTdHJpbmcodmFsdWUgfHwgJycpLnRyaW0oKTtcclxuICAgICAgICBpZiAobm9ybWFsaXplZCkge1xyXG4gICAgICAgICAgdmFsdWVzLmFkZChub3JtYWxpemVkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgbGluZXMgPSBBcnJheS5pc0FycmF5KGRldmljZT8ubGluZXMpID8gZGV2aWNlLmxpbmVzIDogW107XHJcbiAgICBsaW5lcy5mb3JFYWNoKChsaW5lKSA9PiB7XHJcbiAgICAgIGNvbnN0IGRpcmVjdG9yeU51bWJlciA9IGxpbmU/LmRpcmVjdG9yeU51bWJlcj8uZGlyZWN0b3J5TnVtYmVyO1xyXG4gICAgICBjb25zdCB0ZW1wbGF0ZURpcmVjdG9yeU51bWJlciA9IGxpbmU/LmRpcmVjdG9yeU51bWJlcj8udGVtcGxhdGVEaXJlY3RvcnlOdW1iZXI7XHJcbiAgICAgIFtkaXJlY3RvcnlOdW1iZXIsIHRlbXBsYXRlRGlyZWN0b3J5TnVtYmVyXS5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBTdHJpbmcodmFsdWUgfHwgJycpLnRyaW0oKTtcclxuICAgICAgICBpZiAobm9ybWFsaXplZCkge1xyXG4gICAgICAgICAgdmFsdWVzLmFkZChub3JtYWxpemVkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIEFycmF5LmZyb20odmFsdWVzKTtcclxuICB9XHJcblxyXG4gIG9uRmlybXdhcmVVcGdyYWRlQ2xpY2tlZCh1c2VyOiBMaXN0VXNlcikge1xyXG4gICAgaWYgKCF0aGlzLmlzVmFsaWRXZWJleFV1aWQodXNlcikgfHwgdXNlci5zdGF0dXMgIT09ICdJbmFjdGl2ZScpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihVc2VyTGlzdENvbmZpcm1EaWFsb2dDb21wb25lbnQsIHtcclxuICAgICAgZGF0YToge1xyXG4gICAgICAgIHRpdGxlOiBgQWN0aXZhdGUgdXNlciAke3VzZXIudXNlcmlkfSBvbiBNdWx0aSBUZW5hbnQ/YCxcclxuICAgICAgICBtZXNzYWdlOiBgPHA+QWN0aXZhdGluZyB0aGlzIHVzZXIgd2lsbCBwZXJmb3JtIHRoZSBjdXRvdmVyIHRvIE11bHRpIFRlbmFudCBhbmQgY29tcGxldGUgdGhlIG1pZ3JhdGlvbiBwcm9jZXNzLjwvcD5cclxuICAgICAgICAgIDxwPkFmdGVyIGFjdGl2YXRpb24sIHRoZSB1c2VyIHdpbGwgYmVjb21lIGFjdGl2ZSBvbiBNdWx0aSBUZW5hbnQgYW5kIHRoZSBvcmlnaW5hbCB1c2VyIHdpbGwgYmVjb21lIGluYWN0aXZlLjwvcD5cclxuICAgICAgICAgIDxwPkRvIHlvdSB3YW50IHRvIGNvbnRpbnVlPzwvcD5gLFxyXG4gICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAnQWN0aXZhdGUnLFxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcblxyXG4gICAgZGlhbG9nUmVmLmJlZm9yZUNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0OiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgIHRoaXMuc2V0VXNlclBlbmRpbmdTdGF0dXModXNlciwgJ1BlbmRpbmcgQWN0aXZhdGlvbicpO1xyXG4gICAgICAgIHRoaXMudXNlclNlcnZpY2VcclxuICAgICAgICAgIC5nZXRNaWdyYXRlZE1pZ3JhdGlvbkZvcm1FbnRpdGllcyh0aGlzLmN1c3RvbWVySWQsIHVzZXIud2ViZXhVVUlEIHx8ICcnLCAnUEVSU09OJylcclxuICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXHJcbiAgICAgICAgICAgIG1hcCgoZW50aXRpZXM6IGFueVtdKSA9PiB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZW50aXRpZXMpID8gZW50aXRpZXNbMF0gOiBlbnRpdGllcyB8fCBudWxsO1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgc3dpdGNoTWFwKChlbnRpdHk6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGZvcm1JZCA9IGVudGl0eT8ubWlncmF0aW9uRm9ybUlkID8/IGVudGl0eT8uaWQgPz8gbnVsbDtcclxuICAgICAgICAgICAgICBpZiAoIWZvcm1JZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRVc2VyUGVuZGluZ1N0YXR1cyh1c2VyLCAnSW5hY3RpdmUnKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9ucy5lcnJvcignQWN0aXZhdGlvbiBmYWlsZWQuIE1pZ3JhdGlvbiBmb3JtIG5vdCBmb3VuZC4nKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBFTVBUWTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgY29uc3QgZGV2aWNlTWFwID0gdGhpcy5idWlsZEZpcm13YXJlRGV2aWNlTWFwKGVudGl0eSBhcyBNaWdyYXRlZEVudGl0eUxpa2UsIHVzZXIpO1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdkZXZpY2UgbWFwID09PiAnLCBkZXZpY2VNYXApO1xyXG5cclxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy51c2VyU2VydmljZS50cmlnZ2VyRmlybXdhcmVVcGdyYWRlKHRoaXMuY3VzdG9tZXJJZCwgTnVtYmVyKGZvcm1JZCksIGRldmljZU1hcCk7XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGltZXIoMTIwMDAwKSlcclxuICAgICAgICAgIClcclxuICAgICAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICBuZXh0OiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZXRVc2VyUGVuZGluZ1N0YXR1cyh1c2VyLCAnQWN0aXZlJyk7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZXRPcmlnaW5hbFVzZXJTdGF0dXModXNlci5lbWFpbCwgJ0luYWN0aXZlJyk7XHJcbiAgICAgICAgICAgICAgLy8gdGhpcy5ub3RpZmljYXRpb25zLnN1Y2Nlc3MoYCR7dXNlci51c2VyaWR9IHN1Y2Nlc3NmdWxseSBhY3RpdmF0ZWRgKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3I6ICgpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLnNldFVzZXJQZW5kaW5nU3RhdHVzKHVzZXIsICdJbmFjdGl2ZScpO1xyXG4gICAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9ucy5lcnJvcignQWN0aXZhdGlvbiBmYWlsZWQuIFBsZWFzZSB0cnkgYWdhaW4uJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uUmV2ZXJ0Q2xpY2tlZCh1c2VyOiBMaXN0VXNlcikge1xyXG4gICAgaWYgKHVzZXI/LndlYmV4VVVJRCkge1xyXG4gICAgICB0aGlzLnNldFVzZXJQZW5kaW5nU3RhdHVzKHVzZXIsICdQZW5kaW5nIERlYWN0aXZhdGlvbicpO1xyXG4gICAgICB0aGlzLnVzZXJTZXJ2aWNlLnJldmVydE1pZ3JhdGlvbih0aGlzLmN1c3RvbWVySWQsIHVzZXIud2ViZXhVVUlEKVxyXG4gICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxyXG4gICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRpbWVyKDIwMDApKVxyXG4gICAgICAgIClcclxuICAgICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICAgIG5leHQ6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zZXRVc2VyUGVuZGluZ1N0YXR1cyh1c2VyLCAnSW5hY3RpdmUnKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRPcmlnaW5hbFVzZXJTdGF0dXModXNlci5lbWFpbCwgJ0FjdGl2ZScpO1xyXG4gICAgICAgICAgICAvLyB0aGlzLm5vdGlmaWNhdGlvbnMuc3VjY2VzcyhgJHt1c2VyLnVzZXJpZH0gc3VjY2Vzc2Z1bGx5IGRlYWN0aXZhdGVkYCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZXJyb3I6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zZXRVc2VyUGVuZGluZ1N0YXR1cyh1c2VyLCAnQWN0aXZlJyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldFVzZXJQZW5kaW5nU3RhdHVzKHVzZXI6IExpc3RVc2VyLCBzdGF0dXM6IHN0cmluZykge1xyXG4gICAgdXNlci5zdGF0dXMgPSBzdGF0dXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHBvbGxNaWdyYXRpb25Gb3JtU3RhdHVzKFxyXG4gICAgZm9ybUlkOiBudW1iZXIsXHJcbiAgICBpbmRleDogbnVtYmVyLFxyXG4gICAgb25Db21wbGV0ZWQ6ICgpID0+IHZvaWQsXHJcbiAgKTogdm9pZCB7XHJcbiAgICBjb25zdCBzdWJzY3JpcHRpb24gPSB0aW1lcigwLCA1MDAwKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy51c2VyU2VydmljZS5nZXRNaWdyYXRpb25Gb3JtU3RhdHVzKHRoaXMuY3VzdG9tZXJJZCwgZm9ybUlkKSksXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxyXG4gICAgICAgIHRha2VXaGlsZSgocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2U/LnN0YXR1cztcclxuICAgICAgICAgIHJldHVybiAhdGhpcy5pc01pZ3JhdGlvblN0YXR1c0NvbXBsZXRlZChzdGF0dXMpICYmICF0aGlzLmlzTWlncmF0aW9uU3RhdHVzRmFpbGVkKHN0YXR1cyk7XHJcbiAgICAgICAgfSwgdHJ1ZSksXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlPy5zdGF0dXM7XHJcbiAgICAgICAgICBpZiAodGhpcy5pc01pZ3JhdGlvblN0YXR1c0ZhaWxlZChzdGF0dXMpKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlVXNlckluTWlncmF0aW9uUHJvZ3Jlc3MoKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0dXNUb1VzZXIoaW5kZXgsICdNaWdyYXRpb24gRXJyb3InKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHRoaXMuaXNNaWdyYXRpb25TdGF0dXNDb21wbGV0ZWQoc3RhdHVzKSkge1xyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZVVzZXJJbk1pZ3JhdGlvblByb2dyZXNzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdHVzVG9Vc2VyKGluZGV4LCAnQWN0aXZlJyk7XHJcbiAgICAgICAgICAgIG9uQ29tcGxldGVkKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5yZW1vdmVVc2VySW5NaWdyYXRpb25Qcm9ncmVzcygpO1xyXG4gICAgICAgICAgdGhpcy5zZXRTdGF0dXNUb1VzZXIoaW5kZXgsICdNaWdyYXRpb24gRXJyb3InKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuXHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChzdWJzY3JpcHRpb24pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwb2xsTWlncmF0aW9uRm9ybVN0YXR1c0J5VXNlcklkKFxyXG4gICAgZm9ybUlkOiBudW1iZXIsXHJcbiAgICB1c2VySWQ6IHN0cmluZyxcclxuICAgIG9uQ29tcGxldGVkOiAoKSA9PiB2b2lkLFxyXG4gICk6IHZvaWQge1xyXG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gdGltZXIoMCwgNTAwMClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMudXNlclNlcnZpY2UuZ2V0TWlncmF0aW9uRm9ybVN0YXR1cyh0aGlzLmN1c3RvbWVySWQsIGZvcm1JZCkpLFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcclxuICAgICAgICB0YWtlV2hpbGUoKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlPy5zdGF0dXM7XHJcbiAgICAgICAgICByZXR1cm4gIXRoaXMuaXNNaWdyYXRpb25TdGF0dXNDb21wbGV0ZWQoc3RhdHVzKSAmJiAhdGhpcy5pc01pZ3JhdGlvblN0YXR1c0ZhaWxlZChzdGF0dXMpO1xyXG4gICAgICAgIH0sIHRydWUpLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZT8uc3RhdHVzO1xyXG4gICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmdldFVzZXJJbmRleEJ5SWQodXNlcklkKTtcclxuICAgICAgICAgIGlmICh0aGlzLmlzTWlncmF0aW9uU3RhdHVzRmFpbGVkKHN0YXR1cykpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVVc2VySW5NaWdyYXRpb25Qcm9ncmVzcygpO1xyXG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2V0U3RhdHVzVG9Vc2VyKGluZGV4LCAnTWlncmF0aW9uIEVycm9yJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHRoaXMuaXNNaWdyYXRpb25TdGF0dXNDb21wbGV0ZWQoc3RhdHVzKSkge1xyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZVVzZXJJbk1pZ3JhdGlvblByb2dyZXNzKCk7XHJcbiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0dXNUb1VzZXIoaW5kZXgsICdBY3RpdmUnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvbkNvbXBsZXRlZCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6ICgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5nZXRVc2VySW5kZXhCeUlkKHVzZXJJZCk7XHJcbiAgICAgICAgICB0aGlzLnJlbW92ZVVzZXJJbk1pZ3JhdGlvblByb2dyZXNzKCk7XHJcbiAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLnNldFN0YXR1c1RvVXNlcihpbmRleCwgJ01pZ3JhdGlvbiBFcnJvcicpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHN1YnNjcmlwdGlvbik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFVzZXJJbmRleEJ5SWQodXNlcklkOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMudXNlcnM/LmZpbmRJbmRleCgodXNlcikgPT4gdXNlci51c2VyaWQgPT09IHVzZXJJZCkgPz8gLTE7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldE9yaWdpbmFsVXNlclN0YXR1cyhlbWFpbCA9ICcnLCBzdGF0dXM6IHN0cmluZykge1xyXG4gICAgY29uc3Qgb3JpZ2luYWxVc2VyID0gdGhpcy51c2Vycy5maW5kKCh1c2VyKSA9PiB1c2VyLmVtYWlsID09PSBlbWFpbCAmJiAhdXNlci53ZWJleFVVSUQpO1xyXG4gICAgaWYgKG9yaWdpbmFsVXNlcikge1xyXG4gICAgICBvcmlnaW5hbFVzZXIuc3RhdHVzID0gc3RhdHVzO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8YXBwLWxvYWRlciAqbmdJZj1cImRhdGFQZW5kaW5nXCI+PC9hcHAtbG9hZGVyPlxyXG48ZGl2ICpuZ0lmPVwiIXNob3dNb3ZlVXNlcldpemFyZFwiIGlkPVwidXNlcnMtbGlzdFwiPlxyXG4gIDx0ay11c2Vycy10YWJsZS10b29sYmFyXHJcbiAgICBbdG90YWxVc2Vyc0NvdW50XT1cInRvdGFsVXNlcnNDb3VudFwiXHJcbiAgICAoc2VhcmNoQ2hhbmdlKT1cInNlYXJjaFVzZXJzKCRldmVudClcIlxyXG4gICAgKHNlYXJjaEJ5VHlwZSk9XCJzZWFyY2hCeVR5cGUoJGV2ZW50KVwiXHJcbiAgICAoYWRkVXNlcik9XCJvbkNyZWF0ZVVzZXJSZXF1ZXN0ZWQoKVwiXHJcbiAgPjwvdGstdXNlcnMtdGFibGUtdG9vbGJhcj5cclxuICA8dGFibGVcclxuICAgIGNsYXNzPVwid2ViZXgtdGFibGVcIlxyXG4gICAgbWF0LXRhYmxlXHJcbiAgICAqbmdJZj1cInVzZXJzPy5sZW5ndGhcIlxyXG4gICAgI3RhYmxlXHJcbiAgICBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCJcclxuICA+XHJcbiAgICA8IS0tIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwidXNlci1pY29uXCI+XHJcbiAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJ3ZWJleC10YWJsZS10aFwiPjwvdGg+XHJcbiAgICAgIDx0ZCBjbGFzcz1cInVzZXItc2l0ZVwiIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHVzZXJcIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwieydkaXNhYmxlZC11c2VyLXJvdyc6IG1vdmVVc2VyUGVuZGluZyAmJiBtb3ZlSW5Qcm9ncmVzc1VzZXJJZCAmJiBtb3ZlSW5Qcm9ncmVzc1VzZXJJZCA9PT0gdXNlcj8udXNlcmlkfVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwib25Vc2VyQ2xpY2sodXNlcilcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImljb24td2ViZXgtYm94XCI+PHNwYW4gY2xhc3M9XCJpY29uLXdlYmV4IGljb24td2ViZXgtdXNlclwiPjwvc3Bhbj48L3NwYW4+XHJcbiAgICAgIDwvdGQ+XHJcbiAgICA8L25nLWNvbnRhaW5lcj4gLS0+XHJcblxyXG4gICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJuYW1lXCI+XHJcbiAgICAgIDx0aFxyXG4gICAgICAgIG1hdC1oZWFkZXItY2VsbFxyXG4gICAgICAgICptYXRIZWFkZXJDZWxsRGVmXHJcbiAgICAgICAgY2xhc3M9XCJ3ZWJleC10YWJsZS10aFwiXHJcbiAgICAgICAgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6IDYwcHhcIlxyXG4gICAgICA+XHJcbiAgICAgICAgRGlzcGxheSBuYW1lXHJcbiAgICAgIDwvdGg+XHJcbiAgICAgIDx0ZFxyXG4gICAgICAgIGNsYXNzPVwidXNlci1zaXRlXCJcclxuICAgICAgICBtYXQtY2VsbFxyXG4gICAgICAgICptYXRDZWxsRGVmPVwibGV0IHVzZXJcIlxyXG4gICAgICAgIChjbGljayk9XCJvblVzZXJDbGljayh1c2VyKVwiXHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGlzcGxheS1uYW1lLXdyYXBwZXJcIj5cclxuICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgIGNsYXNzPVwidXNlci1uYW1lLXRleHRcIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpbmFjdGl2ZS11c2VyLXJvdyc6IHVzZXIuc3RhdHVzICE9PSAnQWN0aXZlJyB9XCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgdXNlci5maXJzdE5hbWUgfX0ge3sgdXNlci5sYXN0TmFtZSB9fVxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uLXdlYmV4LWJveFwiXHJcbiAgICAgICAgICAgID48c3BhbiBjbGFzcz1cImljb24td2ViZXggaWNvbi13ZWJleC11c2VyXCI+PC9zcGFuXHJcbiAgICAgICAgICA+PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L3RkPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJlbWFpbFwiPlxyXG4gICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwid2ViZXgtdGFibGUtdGhcIj5FbWFpbDwvdGg+XHJcbiAgICAgIDx0ZFxyXG4gICAgICAgIGNsYXNzPVwidXNlci1zaXRlXCJcclxuICAgICAgICBtYXQtY2VsbFxyXG4gICAgICAgICptYXRDZWxsRGVmPVwibGV0IHVzZXJcIlxyXG4gICAgICAgIChjbGljayk9XCJvblVzZXJDbGljayh1c2VyKVwiXHJcbiAgICAgID5cclxuICAgICAgICB7eyB1c2VyLmVtYWlsIH19XHJcbiAgICAgIDwvdGQ+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInN0YXR1c1wiPlxyXG4gICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwid2ViZXgtdGFibGUtdGhcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImhlYWRlci13aXRoLWluZm9cIj5cclxuICAgICAgICAgIFN0YXR1c1xyXG4gICAgICAgICAgPGltZyBzcmM9XCJhc3NldHMvaWNvbnMvaW5mby1jaXJjbGUtcmVndWxhci5zdmdcIiB3aWR0aD1cIjE2XCIgYWx0PVwiXCIgLz5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvdGg+XHJcbiAgICAgIDx0ZFxyXG4gICAgICAgIGNsYXNzPVwidXNlci1zaXRlXCJcclxuICAgICAgICBtYXQtY2VsbFxyXG4gICAgICAgICptYXRDZWxsRGVmPVwibGV0IHVzZXJcIlxyXG4gICAgICAgIChjbGljayk9XCJvblVzZXJDbGljayh1c2VyKVwiXHJcbiAgICAgICAgW21hdFRvb2x0aXBdPVwiXHJcbiAgICAgICAgICB1c2VyLnN0YXR1cyAhPT0gJ0FjdGl2ZScgJiYgdXNlci53ZWJleFVVSURcclxuICAgICAgICAgICAgPyAnUGVuZGluZyBjdXRvdmVyIHRvIE1ULiBQbGVhc2UgY29udGFjdCB5b3VyIGFkbWluaXN0cmF0b3IgZm9yIGRldGFpbHMuJ1xyXG4gICAgICAgICAgICA6ICcnXHJcbiAgICAgICAgXCJcclxuICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiXHJcbiAgICAgID5cclxuICAgICAgICA8c3BhblxyXG4gICAgICAgICAgY2xhc3M9XCJpY29uLXVzZXItc3RhdHVzXCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2ljb24tdXNlci1zdGF0dXMtYWN0aXZlJzogdXNlci5zdGF0dXMgPT09ICdBY3RpdmUnIH1cIlxyXG4gICAgICAgID48L3NwYW5cclxuICAgICAgICA+e3sgdXNlci5zdGF0dXMgfX1cclxuICAgICAgPC90ZD5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiYWN0aW9uc1wiPlxyXG4gICAgICA8dGhcclxuICAgICAgICBtYXQtaGVhZGVyLWNlbGxcclxuICAgICAgICAqbWF0SGVhZGVyQ2VsbERlZlxyXG4gICAgICAgIGNsYXNzPVwid2ViZXgtdGFibGUtdGhcIlxyXG4gICAgICAgIHN0eWxlPVwicGFkZGluZy1sZWZ0OiAyNHB4OyBwYWRkaW5nLXRvcDogNHB4XCJcclxuICAgICAgPlxyXG4gICAgICAgIDxpbWcgc3JjPVwiYXNzZXRzL2ljb25zL3NldHRpbmdzLXJlZ3VsYXIuc3ZnXCIgd2lkdGg9XCIxNlwiIGFsdD1cIlwiIC8+XHJcbiAgICAgIDwvdGg+XHJcbiAgICAgIDx0ZFxyXG4gICAgICAgIGNsYXNzPVwidXNlci1zaXRlIGFjdGlvbnMtY2VsbFwiXHJcbiAgICAgICAgbWF0LWNlbGxcclxuICAgICAgICAqbWF0Q2VsbERlZj1cImxldCB1c2VyOyBsZXQgaSA9IGluZGV4XCJcclxuICAgICAgICBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZVwiXHJcbiAgICAgID5cclxuICAgICAgICA8bWF0LXByb2dyZXNzLXNwaW5uZXJcclxuICAgICAgICAgIGNsYXNzPVwiZmllbGQtc3Bpbm5lclwiXHJcbiAgICAgICAgICBbZGlhbWV0ZXJdPVwiMzBcIlxyXG4gICAgICAgICAgc3Ryb2tlV2lkdGg9XCIzXCJcclxuICAgICAgICAgIG1vZGU9XCJpbmRldGVybWluYXRlXCJcclxuICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgIHVzZXIuc3RhdHVzID09PSAnSW4gUHJvZ3Jlc3MnIHx8XHJcbiAgICAgICAgICAgIHVzZXIuc3RhdHVzID09PSAnUGVuZGluZyBBY3RpdmF0aW9uJyB8fFxyXG4gICAgICAgICAgICB1c2VyLnN0YXR1cyA9PT0gJ1BlbmRpbmcgRGVhY3RpdmF0aW9uJ1xyXG4gICAgICAgICAgXCJcclxuICAgICAgICA+PC9tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcj5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgICAhKFxyXG4gICAgICAgICAgICAgIHVzZXIuc3RhdHVzID09PSAnSW4gUHJvZ3Jlc3MnIHx8XHJcbiAgICAgICAgICAgICAgdXNlci5zdGF0dXMgPT09ICdQZW5kaW5nIEFjdGl2YXRpb24nIHx8XHJcbiAgICAgICAgICAgICAgdXNlci5zdGF0dXMgPT09ICdQZW5kaW5nIERlYWN0aXZhdGlvbidcclxuICAgICAgICAgICAgKSAmJlxyXG4gICAgICAgICAgICAhKFxyXG4gICAgICAgICAgICAgIG1vdmVVc2VyUGVuZGluZyAmJlxyXG4gICAgICAgICAgICAgIG1vdmVJblByb2dyZXNzVXNlcklkICYmXHJcbiAgICAgICAgICAgICAgbW92ZUluUHJvZ3Jlc3NVc2VySWQgPT09IHVzZXI/LnVzZXJpZFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICBcIlxyXG4gICAgICAgICAgY2xhc3M9XCJidXR0b24tYWN0aW9uLWRvdFwiXHJcbiAgICAgICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgICAgIFttYXRNZW51VHJpZ2dlckZvcl09XCJtZW51XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvbi1hY3Rpb25zLWRvdHNcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uLWRvdFwiPi48L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbi1kb3RcIj4uPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb24tZG90XCI+Ljwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxtYXQtbWVudSAjbWVudT1cIm1hdE1lbnVcIj5cclxuICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSBbZGlzYWJsZWRdPVwidHJ1ZVwiPlJlc2VuZCBJbnZpdGF0aW9uPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gW2Rpc2FibGVkXT1cInRydWVcIj5SZXNldCBQYXNzd29yZDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAqbmdJZj1cIiF1c2VyLndlYmV4VVVJRCAmJiB1c2VyLmN1Y21JZCA9PSBPTl9QUkVNX0lEXCJcclxuICAgICAgICAgICAgbWF0LW1lbnUtaXRlbVxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJDb21pbmcgc29vblwiXHJcbiAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cInJpZ2h0XCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgRW5hYmxlIEFJIFRyYW5zY3JpYmVcclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwidXNlci53ZWJleFVVSUQgfHwgdXNlci5zdGF0dXMgIT09ICdBY3RpdmUnXCJcclxuICAgICAgICAgICAgKm5nSWY9XCIhdXNlci5pc01pZ3JhdGVkXCJcclxuICAgICAgICAgICAgbWF0LW1lbnUtaXRlbVxyXG4gICAgICAgICAgICAoY2xpY2spPVwib25Nb3ZlVXNlcih1c2VyLCBpLCAnUXVpY2tNb3ZlJywgJ01UJylcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICBRdWljayBVcGdyYWRlIFVzZXIgdG8gTVRcclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwidXNlci53ZWJleFVVSUQgfHwgdXNlci5zdGF0dXMgIT09ICdBY3RpdmUnXCJcclxuICAgICAgICAgICAgKm5nSWY9XCIhdXNlci5pc01pZ3JhdGVkXCJcclxuICAgICAgICAgICAgbWF0LW1lbnUtaXRlbVxyXG4gICAgICAgICAgICAoY2xpY2spPVwib25Nb3ZlVXNlcih1c2VyLCBpLCAnTVQnLCAnTVQnKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIFVwZ3JhZGUgVXNlciB0byBNVFxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICpuZ0lmPVwidXNlci5pc01pZ3JhdGVkXCJcclxuICAgICAgICAgICAgbWF0LW1lbnUtaXRlbVxyXG4gICAgICAgICAgICAoY2xpY2spPVwib25Nb3ZlVXNlcih1c2VyLCBpLCAnREknLCAnREknKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIFJldmVydCBVc2VyIHRvIFVDTS9ESVxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIG1hdC1tZW51LWl0ZW1cclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFpc1ZhbGlkV2ViZXhVdWlkKHVzZXIpIHx8IHVzZXIuc3RhdHVzICE9PSAnSW5hY3RpdmUnXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uRmlybXdhcmVVcGdyYWRlQ2xpY2tlZCh1c2VyKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIEFjdGl2YXRlIFVzZXJcclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICBtYXQtbWVudS1pdGVtXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhdXNlci53ZWJleFVVSUQgfHwgdXNlci5zdGF0dXMgIT09ICdBY3RpdmUnXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uUmV2ZXJ0Q2xpY2tlZCh1c2VyKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIFJldmVydFxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gW2Rpc2FibGVkXT1cInRydWVcIj5EZWxldGUgVXNlcjwvYnV0dG9uPlxyXG4gICAgICAgIDwvbWF0LW1lbnU+XHJcbiAgICAgIDwvdGQ+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInJvbGVcIj5cclxuICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cIndlYmV4LXRhYmxlLXRoXCI+XHJcbiAgICAgICAgQWRtaW4gcm9sZXNcclxuICAgICAgPC90aD5cclxuICAgICAgPHRkXHJcbiAgICAgICAgY2xhc3M9XCJ1c2VyLXNpdGVcIlxyXG4gICAgICAgIG1hdC1jZWxsXHJcbiAgICAgICAgKm1hdENlbGxEZWY9XCJsZXQgdXNlclwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwieyAnaW5hY3RpdmUtdXNlci1yb3cnOiB1c2VyLnN0YXR1cyAhPT0gJ0FjdGl2ZScgfVwiXHJcbiAgICAgICAgKGNsaWNrKT1cIm9uVXNlckNsaWNrKHVzZXIpXCJcclxuICAgICAgPlxyXG4gICAgICAgIHt7IHVzZXIucm9sZU5hbWUgfHwgXCItXCIgfX1cclxuICAgICAgPC90ZD5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic291cmNlXCI+XHJcbiAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJ3ZWJleC10YWJsZS10aFwiPlxyXG4gICAgICAgIFByb3Zpc2lvbmluZyBUeXBlXHJcbiAgICAgIDwvdGg+XHJcbiAgICAgIDx0ZFxyXG4gICAgICAgIGNsYXNzPVwidXNlci1wcm92aXNpb25pbmctdHlwZVwiXHJcbiAgICAgICAgbWF0LWNlbGxcclxuICAgICAgICAqbWF0Q2VsbERlZj1cImxldCB1c2VyXCJcclxuICAgICAgICAoY2xpY2spPVwib25Vc2VyQ2xpY2sodXNlcilcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInVzZXIud2ViZXhVVUlEXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb24td3JhcHBlclwiXHJcbiAgICAgICAgICAgID48aW1nXHJcbiAgICAgICAgICAgICAgc3JjPVwiYXNzZXRzL2ljb25zL3dlYmV4LnN2Z1wiXHJcbiAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiJ011bHRpLVRlbmFudCdcIlxyXG4gICAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cInJpZ2h0XCJcclxuICAgICAgICAgICAgICB3aWR0aD1cIjIwXCJcclxuICAgICAgICAgICAgICBhbHQ9XCJcIlxyXG4gICAgICAgICAgLz48L3NwYW4+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF1c2VyLndlYmV4VVVJRFwiPlxyXG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJ1c2VyLmN1Y21JZCA9PSBPTl9QUkVNX0lEXCIgY2xhc3M9XCJpY29uLXdyYXBwZXJcIlxyXG4gICAgICAgICAgICA+PGltZ1xyXG4gICAgICAgICAgICAgIHNyYz1cImFzc2V0cy9pY29ucy9sb2NhbF8yNC5zdmdcIlxyXG4gICAgICAgICAgICAgIHdpZHRoPVwiMjBcIlxyXG4gICAgICAgICAgICAgIGFsdD1cIlwiXHJcbiAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiJ1VDTSdcIlxyXG4gICAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cInJpZ2h0XCJcclxuICAgICAgICAgIC8+PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJ1c2VyLmN1Y21JZCAhPSBPTl9QUkVNX0lEXCIgY2xhc3M9XCJpY29uLXdyYXBwZXJcIlxyXG4gICAgICAgICAgICA+PGltZ1xyXG4gICAgICAgICAgICAgIHNyYz1cImFzc2V0cy9pY29ucy9kaV9jbG91ZF8yNC5zdmdcIlxyXG4gICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cIidEZWRpY2F0ZWQgSW5zdGFuY2UnXCJcclxuICAgICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJyaWdodFwiXHJcbiAgICAgICAgICAgICAgd2lkdGg9XCIyMFwiXHJcbiAgICAgICAgICAgICAgYWx0PVwiXCJcclxuICAgICAgICAgIC8+PC9zcGFuPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L3RkPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJsYXN0LWFjdGl2ZS10aW1lXCI+XHJcbiAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJ3ZWJleC10YWJsZS10aFwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZGVyLXdpdGgtaW5mb1wiPlxyXG4gICAgICAgICAgTGFzdCBhY3RpdmUgdGltZVxyXG4gICAgICAgICAgPCEtLSA8bWF0LWljb24gY2xhc3M9XCJpbmZvLWljb25cIj5pbmZvPC9tYXQtaWNvbj4gLS0+XHJcbiAgICAgICAgICA8aW1nIHNyYz1cImFzc2V0cy9pY29ucy9pbmZvLWNpcmNsZS1yZWd1bGFyLnN2Z1wiIHdpZHRoPVwiMTZcIiBhbHQ9XCJcIiAvPlxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC90aD5cclxuICAgICAgPHRkXHJcbiAgICAgICAgY2xhc3M9XCJ1c2VyLXNpdGVcIlxyXG4gICAgICAgIG1hdC1jZWxsXHJcbiAgICAgICAgKm1hdENlbGxEZWY9XCJsZXQgdXNlclwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwieyAnaW5hY3RpdmUtdXNlci1yb3cnOiB1c2VyLnN0YXR1cyAhPT0gJ0FjdGl2ZScgfVwiXHJcbiAgICAgICAgKGNsaWNrKT1cIm9uVXNlckNsaWNrKHVzZXIpXCJcclxuICAgICAgPlxyXG4gICAgICAgIHt7IGdldFRvZGF5U2hvcnREYXRlKCkgfX1cclxuICAgICAgPC90ZD5cclxuICAgICAgL1xyXG4gICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zXCI+PC90cj5cclxuICAgIDx0clxyXG4gICAgICBtYXQtcm93XHJcbiAgICAgICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zXCJcclxuICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICdkaXNhYmxlZC11c2VyLXJvdyc6XHJcbiAgICAgICAgICBtb3ZlVXNlclBlbmRpbmcgJiZcclxuICAgICAgICAgIG1vdmVJblByb2dyZXNzVXNlcklkICYmXHJcbiAgICAgICAgICBtb3ZlSW5Qcm9ncmVzc1VzZXJJZCA9PT0gcm93Py51c2VyaWQsXHJcbiAgICAgICAgJ2luYWN0aXZlLXVzZXItcm93Jzogcm93LnN0YXR1cyAhPT0gJ0FjdGl2ZScsXHJcbiAgICAgIH1cIlxyXG4gICAgPjwvdHI+XHJcbiAgPC90YWJsZT5cclxuXHJcbiAgPGFwcC1wYWdpbmF0aW9uXHJcbiAgICBbcGFnaW5hdGlvbl09XCJ1c2Vyc1NlYXJjaFNlcnZpY2UuZ2V0UGFnaW5hdGlvbigpXCJcclxuICAgIFtzaG93UGFnZVNpemVPcHRpb25zXT1cInRydWVcIlxyXG4gICAgKHBhZ2VOdW1iZXJDaGFuZ2VFbWl0dGVyKT1cInBhZ2VOdW1iZXJDaGFuZ2VFdmVudCgkZXZlbnQpXCJcclxuICAgIChwYWdlRW1pdHRlcik9XCJwYWdlRXZlbnQoJGV2ZW50KVwiXHJcbiAgPlxyXG4gIDwvYXBwLXBhZ2luYXRpb24+XHJcbjwvZGl2PlxyXG5cclxuPGFwcC1tb3ZlLXVzZXItd2l6YXJkXHJcbiAgKm5nSWY9XCJzaG93TW92ZVVzZXJXaXphcmRcIlxyXG4gIFt1c2VyXT1cIm1vdmVVc2VyXCJcclxuICAoZG9uZSk9XCJjbG9zZU1vdmVVc2VyV2l6YXJkKHRydWUpXCJcclxuICBbY3VzdG9tZXJJZF09XCJjdXN0b21lcklkXCJcclxuICAocnVuTW92ZVVzZXIpPVwicnVuTW92ZVVzZXJUb01UKClcIlxyXG4gIChjbG9zZU1vdmVVc2VyV2l6YXJkKT1cImNsb3NlTW92ZVVzZXJXaXphcmQoZmFsc2UpXCJcclxuPjwvYXBwLW1vdmUtdXNlci13aXphcmQ+XHJcbiJdfQ==