speechrecorderng 2.22.1 → 2.22.5

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.
@@ -1,4 +1,3 @@
1
- import { Action } from '../../action/action';
2
1
  import { AudioCapture } from '../../audio/capture/capture';
3
2
  import { EventType } from '../../audio/playback/player';
4
3
  import { WavWriter } from '../../audio/impl/wavwriter';
@@ -8,18 +7,15 @@ import { Upload } from '../../net/uploader';
8
7
  import { Component, HostListener, Inject, Input, ViewChild } from "@angular/core";
9
8
  import { SessionService } from "./session.service";
10
9
  import { SPEECHRECORDER_CONFIG } from "../../spr.config";
11
- import { MIN_DB_LEVEL } from "../../ui/recordingitem_display";
12
- import { LevelMeasure, StreamLevelMeasure } from "../../audio/dsp/level_measure";
13
10
  import { Prompting } from "./prompting";
14
11
  import { SequenceAudioFloat32ChunkerOutStream } from "../../audio/io/stream";
15
- import { TransportActions } from "./controlpanel";
16
12
  import { SessionFinishedDialog } from "./session_finished_dialog";
17
13
  import { MessageDialog } from "../../ui/message_dialog";
18
14
  import { AudioContextProvider } from "../../audio/context";
19
15
  import { AudioClip } from "../../audio/persistor";
20
16
  import { Item } from "./item";
21
- import { Browser, UserAgentBuilder } from "../../utils/ua-parser";
22
17
  import { LevelBar } from "../../audio/ui/livelevel";
18
+ import { BasicRecorder, LEVEL_BAR_INTERVALL_SECONDS, MAX_RECORDING_TIME_MS, RECFILE_API_CTX } from "./basicrecorder";
23
19
  import * as i0 from "@angular/core";
24
20
  import * as i1 from "@angular/material/dialog";
25
21
  import * as i2 from "./session.service";
@@ -35,16 +31,11 @@ import * as i11 from "@angular/flex-layout/extended";
35
31
  import * as i12 from "@angular/flex-layout/flex";
36
32
  import * as i13 from "@angular/common";
37
33
  import * as i14 from "../../spr.config";
38
- export const FORCE_REQUEST_AUDIO_PERMISSIONS = false;
39
- export const RECFILE_API_CTX = 'recfile';
40
- const MAX_RECORDING_TIME_MS = 1000 * 60 * 60 * 60; // 1 hour
41
34
  const DEFAULT_PRE_REC_DELAY = 1000;
42
35
  const DEFAULT_POST_REC_DELAY = 500;
43
- const LEVEL_BAR_INTERVALL_SECONDS = 0.1; // 100ms
44
- // TODO enum not possible in template language , use string for now
45
- //export enum StatusAlertType {INFO,WARN,ERROR};
46
- export class SessionManager {
36
+ export class SessionManager extends BasicRecorder {
47
37
  constructor(changeDetectorRef, renderer, dialog, sessionService, recFileService, uploader, config) {
38
+ super(dialog, sessionService);
48
39
  this.changeDetectorRef = changeDetectorRef;
49
40
  this.renderer = renderer;
50
41
  this.dialog = dialog;
@@ -55,9 +46,6 @@ export class SessionManager {
55
46
  this.enableUploadRecordings = true;
56
47
  this.enableDownloadRecordings = false;
57
48
  this.status = 0 /* BLOCKED */;
58
- this.ac = null;
59
- this._channelCount = 2; //TODO define constant for default format
60
- this._selectedDeviceId = undefined;
61
49
  this.dataSaved = true;
62
50
  this.preRecTimerId = null;
63
51
  this.preRecTimerRunning = null;
@@ -65,32 +53,12 @@ export class SessionManager {
65
53
  this.postRecTimerRunning = null;
66
54
  this.maxRecTimerId = null;
67
55
  this.maxRecTimerRunning = null;
68
- this._session = null;
69
56
  this._promptIndex = 0;
70
57
  this.items = null;
71
58
  //selectedItemIdx: number;
72
59
  this._displayRecFile = null;
73
- this.displayAudioClip = null;
74
- this.displayLevelInfos = null;
75
- this.peakLevelInDb = MIN_DB_LEVEL;
76
- this.readonly = false;
77
- this.processingRecording = false;
78
- this.uploadProgress = 100;
79
- this.uploadStatus = 'ok';
80
- this.audioSignalCollapsed = true;
81
- this.audioFetchSubscription = null;
82
- this.destroyed = false;
83
- this.navigationDisabled = true;
84
60
  this.status = 1 /* IDLE */;
85
- this.transportActions = new TransportActions();
86
- this.playStartAction = new Action('Play');
87
61
  this.audio = document.getElementById('audio');
88
- this.selCaptureDeviceId = null;
89
- this.levelMeasure = new LevelMeasure();
90
- this.streamLevelMeasure = new StreamLevelMeasure();
91
- this.userAgent = UserAgentBuilder.userAgent();
92
- console.debug("Detected platform: " + this.userAgent.detectedPlatform);
93
- console.debug("Detected browser: " + this.userAgent.detectedBrowser);
94
62
  if (this.config && this.config.enableUploadRecordings !== undefined) {
95
63
  this.enableUploadRecordings = this.config.enableUploadRecordings;
96
64
  }
@@ -204,10 +172,17 @@ export class SessionManager {
204
172
  }
205
173
  }
206
174
  onKeyDown(ke) {
207
- if (ke.key == ' ' || ke.key == 'Escape') {
175
+ if (ke.key == ' ') {
208
176
  this.transportActions.stopAction.perform();
209
177
  }
210
- if (ke.key == 'p' || ke.key == 'Escape') {
178
+ if (ke.key == 'p') {
179
+ this.transportActions.pauseAction.perform();
180
+ }
181
+ if (ke.key == 'Escape') {
182
+ if (!this.audioSignalCollapsed) {
183
+ this.audioSignalCollapsed = true;
184
+ }
185
+ this.transportActions.stopAction.perform();
211
186
  this.transportActions.pauseAction.perform();
212
187
  }
213
188
  if (ke.key == 'MediaPlayPause') {
@@ -248,22 +223,10 @@ export class SessionManager {
248
223
  get controlAudioPlayer() {
249
224
  return this._controlAudioPlayer;
250
225
  }
251
- set session(session) {
252
- this._session = session;
253
- }
254
226
  set script(script) {
255
227
  this._script = script;
256
228
  this.loadScript();
257
229
  }
258
- set channelCount(channelCount) {
259
- this._channelCount = channelCount;
260
- }
261
- set audioDevices(audioDevices) {
262
- this._audioDevices = audioDevices;
263
- }
264
- set autoGainControlConfigs(autoGainControlConfigs) {
265
- this._autoGainControlConfigs = autoGainControlConfigs;
266
- }
267
230
  update(e) {
268
231
  if (e.type == EventType.STARTED) {
269
232
  this.playStartAction.disabled = true;
@@ -551,210 +514,7 @@ export class SessionManager {
551
514
  this.updateNavigationActions();
552
515
  }
553
516
  start() {
554
- this.statusAlertType = 'info';
555
- this.statusMsg = 'Starting session...';
556
- this.statusWaiting = false;
557
- if (this._session) {
558
- if (this._session.sealed) {
559
- this.readonly = true;
560
- this.statusMsg = 'Session sealed!';
561
- //let dialogRef = this.dialog.open(SessionSealedDialog, {});
562
- this.dialog.open(MessageDialog, {
563
- data: {
564
- type: 'error',
565
- title: 'Error',
566
- msg: "This session is sealed. Recordings cannot be added anymore.",
567
- advise: 'Please ask your experimenter what to do (e.g start a new session).',
568
- }
569
- });
570
- }
571
- else {
572
- let body = {};
573
- if (this._session.status === "CREATED") {
574
- this._session.status = "LOADED";
575
- body.status = this._session.status;
576
- if (!this._session.loadedDate) {
577
- this._session.loadedDate = new Date();
578
- body.loadedDate = this._session.loadedDate;
579
- }
580
- }
581
- else {
582
- this._session.restartedDate = new Date();
583
- body.restartedDate = this._session.restartedDate;
584
- }
585
- this.sessionService.patchSessionObserver(this._session, body).subscribe();
586
- }
587
- }
588
- // Check browser compatibility
589
- if (this.userAgent.detectedBrowser === Browser.Safari && this._channelCount > 1) {
590
- let eMsg = "Error: Safari browser does not support stereo recordings.";
591
- console.error(eMsg);
592
- this.dialog.open(MessageDialog, {
593
- data: {
594
- type: 'error',
595
- title: 'Browser not supported',
596
- msg: eMsg,
597
- advice: "Please use a supported browser, e.g. Mozilla Firefox."
598
- }
599
- });
600
- }
601
- //console.log("Session ID: "+this._session.session+ " status: "+this._session.status)
602
- this._selectedDeviceId = undefined;
603
- if (!this.readonly && this.ac && (FORCE_REQUEST_AUDIO_PERMISSIONS || (this._audioDevices && this._audioDevices.length > 0))) {
604
- this.statusMsg = 'Requesting audio permissions...';
605
- this.statusAlertType = 'info';
606
- this.ac.deviceInfos((mdis) => {
607
- let audioCaptureDeviceAvail = false;
608
- let audioPlayDeviceAvail = false;
609
- if (mdis) {
610
- if (this.ac) {
611
- this.ac.printDevices(mdis);
612
- }
613
- if (mdis.length > 0) {
614
- for (let mdii = 0; mdii < mdis.length; mdii++) {
615
- let mdi = mdis[mdii];
616
- let kind = mdi.kind;
617
- if (kind === "audioinput") {
618
- audioCaptureDeviceAvail = true;
619
- }
620
- else if (kind === "audiooutput") {
621
- audioPlayDeviceAvail = true;
622
- }
623
- }
624
- }
625
- if (this._session && this._session.type !== 'TEST_DEF_A' && this._audioDevices && this._audioDevices.length > 0) {
626
- let fdi = null;
627
- for (let adI = 0; adI < this._audioDevices.length; adI++) {
628
- let ad = this._audioDevices[adI];
629
- if (ad.playback) {
630
- // project audio device config for playback device
631
- // not used for now
632
- continue;
633
- }
634
- for (let mdii = 0; mdii < mdis.length; mdii++) {
635
- let mdi = mdis[mdii];
636
- let kind = mdi.kind;
637
- if (kind === "audioinput") {
638
- audioCaptureDeviceAvail = true;
639
- }
640
- else if (kind === "audiooutput") {
641
- audioPlayDeviceAvail = true;
642
- }
643
- if (ad.regex) {
644
- //console.log("Match?: \'"+mdi.label+"\' \'"+ad.name+"\'");
645
- if (mdi.label.match(ad.name)) {
646
- fdi = mdi;
647
- //console.log("Match!");
648
- }
649
- }
650
- else {
651
- if (mdi.label.trim() === ad.name.trim()) {
652
- fdi = mdi;
653
- }
654
- }
655
- if (fdi) {
656
- break;
657
- }
658
- }
659
- if (fdi) {
660
- break;
661
- }
662
- }
663
- if (fdi) {
664
- // matching device found
665
- // Not able to open device here since Chrome 71
666
- // Chrome 71 requires a user gesture before the AudioContext can be resumed
667
- // sessionmanager.ts:712 Open session with default audio device for 1 channels
668
- // capture.ts:128 The AudioContext was not allowed to start. It must be resumed (or created) after a user gesture on the page. https://goo.gl/7K7WLu
669
- // push../projects/speechrecorderng/src/lib/audio/capture/capture.ts.AudioCapture.open @ capture.ts:128
670
- //this.ac.open(this._channelCount, fdi.deviceId);
671
- console.info("Set selected audio device: \'" + fdi.label + "\' Id: \'" + fdi.deviceId + "\'");
672
- this._selectedDeviceId = fdi.deviceId;
673
- this.enableStartUserGesture();
674
- }
675
- else {
676
- // device not found
677
- this.statusMsg = 'ERROR: Required audio device not available!';
678
- this.statusAlertType = 'error';
679
- this.readonly = true;
680
- this.dialog.open(MessageDialog, {
681
- data: {
682
- type: 'error',
683
- title: 'Required audio device',
684
- msg: "Required audio device not found",
685
- advice: "Please connect a suitable audio device for this project and retry (press the browser reload button)."
686
- }
687
- });
688
- }
689
- }
690
- else {
691
- if (!audioCaptureDeviceAvail && !audioPlayDeviceAvail) {
692
- // no device found
693
- this.statusMsg = 'ERROR: No audio device available!';
694
- this.statusAlertType = 'warn';
695
- //this.readonly = true;
696
- this.dialog.open(MessageDialog, {
697
- data: {
698
- type: 'warn',
699
- title: 'No audio device',
700
- msg: "No audio device found",
701
- advice: "Please connect an audio device and retry (press the browser reload button) or try to continue anyway."
702
- }
703
- });
704
- }
705
- else {
706
- if (!this.readonly && !audioCaptureDeviceAvail) {
707
- // no device found
708
- this.statusMsg = 'WARNING: No audio capture device available!';
709
- this.statusAlertType = 'warning';
710
- //this.readonly = true;
711
- this.dialog.open(MessageDialog, {
712
- data: {
713
- type: 'warning',
714
- title: 'No audio capture device',
715
- msg: "No audio capture device found",
716
- advice: "Please connect an audio capture device and retry (press the browser reload button) or try to continue anyway."
717
- }
718
- });
719
- }
720
- // Safari does not list playback devices
721
- if (!audioPlayDeviceAvail) {
722
- // Firefox does not enumerate audiooutput devices
723
- // Do not show this warning, because it would always appear on Firefox
724
- // When https://bugzilla.mozilla.org/show_bug.cgi?id=1498512 is fixed the warning can be enabled for Firefox as well
725
- // It is already implemneted but kept behind a preference setting https://bugzilla.mozilla.org/show_bug.cgi?id=1152401
726
- // Output devices are listed if about:config media.setsinkid.enabled=true
727
- // but default setting is false
728
- // Same problem with Safari
729
- if (!(this.userAgent.detectedBrowser === Browser.Safari || this.userAgent.detectedBrowser === Browser.Firefox)) {
730
- // no device found
731
- this.statusMsg = 'WARNING: No audio playback device available!';
732
- this.statusAlertType = 'warn';
733
- //this.readonly = true;
734
- this.dialog.open(MessageDialog, {
735
- data: {
736
- type: 'warn',
737
- title: 'No audio playback device',
738
- msg: "No audio playback device found",
739
- advice: "Please connect an audio playback device and retry (press the browser reload button) or try to continue anyway."
740
- }
741
- });
742
- }
743
- }
744
- }
745
- // Not able to open device here since Chrome 71
746
- // Chrome 71 requires a user gesture before the AudioContext can be resumed
747
- // sessionmanager.ts:712 Open session with default audio device for 1 channels
748
- // capture.ts:128 The AudioContext was not allowed to start. It must be resumed (or created) after a user gesture on the page. https://goo.gl/7K7WLu
749
- // push../projects/speechrecorderng/src/lib/audio/capture/capture.ts.AudioCapture.open @ capture.ts:128
750
- //console.log("Open session with default audio device for "+this._channelCount+" channels");
751
- //this.ac.open(this._channelCount);
752
- // enable start gesture anyway
753
- this.enableStartUserGesture();
754
- }
755
- }
756
- });
757
- }
517
+ super.start();
758
518
  if (this.promptItemCount > 0) {
759
519
  this.promptIndex = 0;
760
520
  }
@@ -812,9 +572,7 @@ export class SessionManager {
812
572
  }
813
573
  }
814
574
  enableStartUserGesture() {
815
- this.statusAlertType = 'info';
816
- this.statusMsg = 'Ready.';
817
- //this.updateStartActionDisableState()
575
+ super.enableStartUserGesture();
818
576
  this.transportActions.startAction.disabled = !(this.ac && this.isRecordingItem());
819
577
  }
820
578
  enableNavigation() {
@@ -822,11 +580,6 @@ export class SessionManager {
822
580
  this.updateNavigationActions();
823
581
  }
824
582
  opened() {
825
- // this.statusAlertType = 'info';
826
- // this.statusMsg = 'Ready.';
827
- // this.updateStartActionDisableState()
828
- // this.transportActions.fwdAction.disabled = false
829
- // this.transportActions.bwdAction.disabled = false
830
583
  if (this.ac) {
831
584
  this.ac.start();
832
585
  }
@@ -1111,25 +864,9 @@ export class SessionManager {
1111
864
  this.changeDetectorRef.detectChanges();
1112
865
  }
1113
866
  }
1114
- closed() {
1115
- this.statusAlertType = 'info';
1116
- this.statusMsg = 'Session closed.';
1117
- }
1118
- error(msg = 'An unknown error occured during recording.', advice = 'Please retry.') {
1119
- this.statusMsg = 'ERROR: Recording.';
1120
- this.statusAlertType = 'error';
1121
- this.dialog.open(MessageDialog, {
1122
- data: {
1123
- type: 'error',
1124
- title: 'Recording error',
1125
- msg: msg,
1126
- advice: advice
1127
- }
1128
- });
1129
- }
1130
867
  }
1131
868
  SessionManager.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.1", ngImport: i0, type: SessionManager, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }, { token: i1.MatDialog }, { token: i2.SessionService }, { token: i3.RecordingService }, { token: i4.SpeechRecorderUploader }, { token: SPEECHRECORDER_CONFIG }], target: i0.ɵɵFactoryTarget.Component });
1132
- SessionManager.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.1", type: SessionManager, selector: "app-sprrecordingsession", inputs: { projectName: "projectName", dataSaved: "dataSaved" }, host: { listeners: { "window:keypress": "onKeyPress($event)", "window:keydown": "onKeyDown($event)" } }, providers: [SessionService], viewQueries: [{ propertyName: "prompting", first: true, predicate: Prompting, descendants: true, static: true }, { propertyName: "liveLevelDisplay", first: true, predicate: LevelBar, descendants: true, static: true }], ngImport: i0, template: `
869
+ SessionManager.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.1", type: SessionManager, selector: "app-sprrecordingsession", inputs: { projectName: "projectName", dataSaved: "dataSaved" }, host: { listeners: { "window:keypress": "onKeyPress($event)", "window:keydown": "onKeyDown($event)" } }, providers: [SessionService], viewQueries: [{ propertyName: "prompting", first: true, predicate: Prompting, descendants: true, static: true }, { propertyName: "liveLevelDisplay", first: true, predicate: LevelBar, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
1133
870
  <app-warningbar [show]="isTestSession()" warningText="Test recording only!"></app-warningbar>
1134
871
  <app-warningbar [show]="isDefaultAudioTestSession()" warningText="This test uses default audio device! Regular sessions may require a particular audio device (microphone)!"></app-warningbar>
1135
872
  <app-sprprompting [projectName]="projectName"
@@ -1271,4 +1008,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.1", ngImpor
1271
1008
  type: HostListener,
1272
1009
  args: ['window:keydown', ['$event']]
1273
1010
  }] } });
1274
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbm1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvc3BlZWNocmVjb3JkZXIvc2Vzc2lvbi9zZXNzaW9ubWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0scUJBQXFCLENBQUE7QUFDMUMsT0FBTyxFQUFDLFlBQVksRUFBdUIsTUFBTSw2QkFBNkIsQ0FBQztBQUMvRSxPQUFPLEVBQWdDLFNBQVMsRUFBQyxNQUFNLDZCQUE2QixDQUFBO0FBQ3BGLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQTtBQUNwRCxPQUFPLEVBQW9CLGNBQWMsRUFBa0IsTUFBTSxrQkFBa0IsQ0FBQztBQUNwRixPQUFPLEVBQUMsZ0JBQWdCLEVBQThCLE1BQU0sY0FBYyxDQUFBO0FBQzFFLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUMxQyxPQUFPLEVBR0wsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUdMLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFJakQsT0FBTyxFQUFDLHFCQUFxQixFQUF1QixNQUFNLGtCQUFrQixDQUFDO0FBRzdFLE9BQU8sRUFBQyxZQUFZLEVBQXVCLE1BQU0sZ0NBQWdDLENBQUM7QUFDbEYsT0FBTyxFQUFZLFlBQVksRUFBRSxrQkFBa0IsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQzFGLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDdEMsT0FBTyxFQUFDLG9DQUFvQyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDM0UsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FB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QWMsQ0FBQyxxRUFrRmhCLFNBQVMsaUdBQ1QsUUFBUSw4REFsRlQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZDVDsyRkEwQlUsY0FBYztrQkEzRTFCLFNBQVM7bUJBQUM7b0JBRVQsUUFBUSxFQUFFLHlCQUF5QjtvQkFDbkMsU0FBUyxFQUFFLENBQUMsY0FBYyxDQUFDO29CQUMzQixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZDVDtvQkFDRCxNQUFNLEVBQUUsQ0FBQzs7Ozs7Ozs7Ozs7SUFXUCxFQUFDOzs7O01BSUMsRUFBQzs7SUFFSCxFQUFDOzs7Ozs7SUFNRCxDQUFDO2lCQUNKOzswQkFpR2MsTUFBTTsyQkFBQyxxQkFBcUI7NENBOUZoQyxXQUFXO3NCQUFuQixLQUFLO2dCQVFrQyxTQUFTO3NCQUFoRCxTQUFTO3VCQUFDLFNBQVMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ0MsZ0JBQWdCO3NCQUF0RCxTQUFTO3VCQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBRTVCLFNBQVM7c0JBQWpCLEtBQUs7Z0JBNE1OLFVBQVU7c0JBRFQsWUFBWTt1QkFBQyxpQkFBaUIsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFTM0MsU0FBUztzQkFEUixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBY3Rpb259IGZyb20gJy4uLy4uL2FjdGlvbi9hY3Rpb24nXHJcbmltcG9ydCB7QXVkaW9DYXB0dXJlLCBBdWRpb0NhcHR1cmVMaXN0ZW5lcn0gZnJvbSAnLi4vLi4vYXVkaW8vY2FwdHVyZS9jYXB0dXJlJztcclxuaW1wb3J0IHtBdWRpb1BsYXllciwgQXVkaW9QbGF5ZXJFdmVudCwgRXZlbnRUeXBlfSBmcm9tICcuLi8uLi9hdWRpby9wbGF5YmFjay9wbGF5ZXInXHJcbmltcG9ydCB7V2F2V3JpdGVyfSBmcm9tICcuLi8uLi9hdWRpby9pbXBsL3dhdndyaXRlcidcclxuaW1wb3J0IHtHcm91cCwgUHJvbXB0SXRlbSwgUHJvbXB0aXRlbVV0aWwsIFNjcmlwdCwgU2VjdGlvbn0gZnJvbSAnLi4vc2NyaXB0L3NjcmlwdCc7XHJcbmltcG9ydCB7U3ByUmVjb3JkaW5nRmlsZSwgUmVjb3JkaW5nRmlsZURlc2NyaXB0b3JJbXBsfSBmcm9tICcuLi9yZWNvcmRpbmcnXHJcbmltcG9ydCB7VXBsb2FkfSBmcm9tICcuLi8uLi9uZXQvdXBsb2FkZXInO1xyXG5pbXBvcnQge1xyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbmplY3QsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIFJlbmRlcmVyMixcclxuICBWaWV3Q2hpbGRcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge1Nlc3Npb25TZXJ2aWNlfSBmcm9tIFwiLi9zZXNzaW9uLnNlcnZpY2VcIjtcclxuaW1wb3J0IHtTdGF0ZSBhcyBTdGFydFN0b3BTaWduYWxTdGF0ZX0gZnJvbSBcIi4uL3N0YXJ0c3RvcHNpZ25hbC9zdGFydHN0b3BzaWduYWxcIjtcclxuaW1wb3J0IHtNYXREaWFsb2d9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2dcIjtcclxuaW1wb3J0IHtTcGVlY2hSZWNvcmRlclVwbG9hZGVyfSBmcm9tIFwiLi4vc3BydXBsb2FkZXJcIjtcclxuaW1wb3J0IHtTUEVFQ0hSRUNPUkRFUl9DT05GSUcsIFNwZWVjaFJlY29yZGVyQ29uZmlnfSBmcm9tIFwiLi4vLi4vc3ByLmNvbmZpZ1wiO1xyXG5pbXBvcnQge1Nlc3Npb259IGZyb20gXCIuL3Nlc3Npb25cIjtcclxuaW1wb3J0IHtBdWRpb0RldmljZSwgQXV0b0dhaW5Db250cm9sQ29uZmlnfSBmcm9tIFwiLi4vcHJvamVjdC9wcm9qZWN0XCI7XHJcbmltcG9ydCB7TUlOX0RCX0xFVkVMLCBSZWNvcmRpbmdJdGVtRGlzcGxheX0gZnJvbSBcIi4uLy4uL3VpL3JlY29yZGluZ2l0ZW1fZGlzcGxheVwiO1xyXG5pbXBvcnQge0xldmVsSW5mb3MsTGV2ZWxNZWFzdXJlLCBTdHJlYW1MZXZlbE1lYXN1cmV9IGZyb20gXCIuLi8uLi9hdWRpby9kc3AvbGV2ZWxfbWVhc3VyZVwiO1xyXG5pbXBvcnQge1Byb21wdGluZ30gZnJvbSBcIi4vcHJvbXB0aW5nXCI7XHJcbmltcG9ydCB7U2VxdWVuY2VBdWRpb0Zsb2F0MzJDaHVua2VyT3V0U3RyZWFtfSBmcm9tIFwiLi4vLi4vYXVkaW8vaW8vc3RyZWFtXCI7XHJcbmltcG9ydCB7VHJhbnNwb3J0QWN0aW9uc30gZnJvbSBcIi4vY29udHJvbHBhbmVsXCI7XHJcbmltcG9ydCB7U2Vzc2lvbkZpbmlzaGVkRGlhbG9nfSBmcm9tIFwiLi9zZXNzaW9uX2ZpbmlzaGVkX2RpYWxvZ1wiO1xyXG5pbXBvcnQge01lc3NhZ2VEaWFsb2d9IGZyb20gXCIuLi8uLi91aS9tZXNzYWdlX2RpYWxvZ1wiO1xyXG5pbXBvcnQge1JlY29yZGluZ1NlcnZpY2V9IGZyb20gXCIuLi9yZWNvcmRpbmdzL3JlY29yZGluZ3Muc2VydmljZVwiO1xyXG5pbXBvcnQge1N1YnNjcmlwdGlvbn0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHtBdWRpb0NvbnRleHRQcm92aWRlcn0gZnJvbSBcIi4uLy4uL2F1ZGlvL2NvbnRleHRcIjtcclxuaW1wb3J0IHtBdWRpb0NsaXB9IGZyb20gXCIuLi8uLi9hdWRpby9wZXJzaXN0b3JcIjtcclxuaW1wb3J0IHtJdGVtfSBmcm9tIFwiLi9pdGVtXCI7XHJcbmltcG9ydCB7QnJvd3NlciwgVXNlckFnZW50LCBVc2VyQWdlbnRCdWlsZGVyfSBmcm9tIFwiLi4vLi4vdXRpbHMvdWEtcGFyc2VyXCI7XHJcbmltcG9ydCB7TGV2ZWxCYXJ9IGZyb20gXCIuLi8uLi9hdWRpby91aS9saXZlbGV2ZWxcIjtcclxuXHJcblxyXG5leHBvcnQgY29uc3QgRk9SQ0VfUkVRVUVTVF9BVURJT19QRVJNSVNTSU9OUz1mYWxzZTtcclxuZXhwb3J0IGNvbnN0IFJFQ0ZJTEVfQVBJX0NUWCA9ICdyZWNmaWxlJztcclxuXHJcblxyXG5jb25zdCBNQVhfUkVDT1JESU5HX1RJTUVfTVMgPSAxMDAwICogNjAgKiA2MCAqIDYwOyAvLyAxIGhvdXJcclxuY29uc3QgREVGQVVMVF9QUkVfUkVDX0RFTEFZPTEwMDA7XHJcbmNvbnN0IERFRkFVTFRfUE9TVF9SRUNfREVMQVk9NTAwO1xyXG5cclxuY29uc3QgTEVWRUxfQkFSX0lOVEVSVkFMTF9TRUNPTkRTID0gMC4xOyAgLy8gMTAwbXNcclxuZXhwb3J0IGNvbnN0IGVudW0gTW9kZSB7U0VSVkVSX0JPVU5ELCBTVEFORF9BTE9ORX1cclxuXHJcbmV4cG9ydCBjb25zdCBlbnVtIFN0YXR1cyB7XHJcbiAgQkxPQ0tFRCwgSURMRSwgUFJFX1JFQ09SRElORywgUkVDT1JESU5HLCBQT1NUX1JFQ19TVE9QLCBQT1NUX1JFQ19QQVVTRSwgU1RPUFBJTkdfU1RPUCwgU1RPUFBJTkdfUEFVU0UsIEVSUk9SXHJcbn1cclxuXHJcblxyXG5cclxuLy8gVE9ETyBlbnVtIG5vdCBwb3NzaWJsZSBpbiB0ZW1wbGF0ZSBsYW5ndWFnZSAsIHVzZSBzdHJpbmcgZm9yIG5vd1xyXG4vL2V4cG9ydCBlbnVtIFN0YXR1c0FsZXJ0VHlwZSB7SU5GTyxXQVJOLEVSUk9SfTtcclxuXHJcbkBDb21wb25lbnQoe1xyXG5cclxuICBzZWxlY3RvcjogJ2FwcC1zcHJyZWNvcmRpbmdzZXNzaW9uJyxcclxuICBwcm92aWRlcnM6IFtTZXNzaW9uU2VydmljZV0sXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxhcHAtd2FybmluZ2JhciBbc2hvd109XCJpc1Rlc3RTZXNzaW9uKClcIiB3YXJuaW5nVGV4dD1cIlRlc3QgcmVjb3JkaW5nIG9ubHkhXCI+PC9hcHAtd2FybmluZ2Jhcj5cclxuICAgIDxhcHAtd2FybmluZ2JhciBbc2hvd109XCJpc0RlZmF1bHRBdWRpb1Rlc3RTZXNzaW9uKClcIiB3YXJuaW5nVGV4dD1cIlRoaXMgdGVzdCB1c2VzIGRlZmF1bHQgYXVkaW8gZGV2aWNlISBSZWd1bGFyIHNlc3Npb25zIG1heSByZXF1aXJlIGEgcGFydGljdWxhciBhdWRpbyBkZXZpY2UgKG1pY3JvcGhvbmUpIVwiPjwvYXBwLXdhcm5pbmdiYXI+XHJcbiAgICAgIDxhcHAtc3BycHJvbXB0aW5nIFtwcm9qZWN0TmFtZV09XCJwcm9qZWN0TmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdGFydFN0b3BTaWduYWxTdGF0ZV09XCJzdGFydFN0b3BTaWduYWxTdGF0ZVwiIFtwcm9tcHRJdGVtXT1cInByb21wdEl0ZW1cIiBbc2hvd1Byb21wdF09XCJzaG93UHJvbXB0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cIml0ZW1zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3RyYW5zcG9ydEFjdGlvbnNdPVwidHJhbnNwb3J0QWN0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZEl0ZW1JZHhdPVwicHJvbXB0SW5kZXhcIiAob25JdGVtU2VsZWN0KT1cIml0ZW1TZWxlY3QoJGV2ZW50KVwiIChvbk5leHRJdGVtKT1cIm5leHRJdGVtKClcIiAob25QcmV2SXRlbSk9XCJwcmV2SXRlbSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2F1ZGlvU2lnbmFsQ29sbGFwc2VkXT1cImF1ZGlvU2lnbmFsQ29sbGFwc2VkXCIgW2Rpc3BsYXlBdWRpb0NsaXBdPVwiZGlzcGxheUF1ZGlvQ2xpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwbGF5U3RhcnRBY3Rpb25dPVwiY29udHJvbEF1ZGlvUGxheWVyPy5zdGFydEFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwbGF5U2VsZWN0aW9uQWN0aW9uXT1cImNvbnRyb2xBdWRpb1BsYXllcj8uc3RhcnRTZWxlY3Rpb25BY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXV0b1BsYXlPblNlbGVjdFRvZ2dsZUFjdGlvbl09XCJjb250cm9sQXVkaW9QbGF5ZXI/LmF1dG9QbGF5T25TZWxlY3RUb2dnbGVBY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcGxheVN0b3BBY3Rpb25dPVwiY29udHJvbEF1ZGlvUGxheWVyPy5zdG9wQWN0aW9uXCI+XHJcblxyXG4gICAgPC9hcHAtc3BycHJvbXB0aW5nPlxyXG4gICAgPG1hdC1wcm9ncmVzcy1iYXIgW3ZhbHVlXT1cInByb2dyZXNzUGVyY2VudFZhbHVlKClcIiBmeFNob3c9XCJmYWxzZVwiIGZ4U2hvdy54cz1cInRydWVcIiA+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxyXG5cclxuXHJcbiAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXQueHM9XCJjb2x1bW5cIiBbbmdTdHlsZV09XCJ7J2hlaWdodC5weCc6MTAwLCdtaW4taGVpZ2h0LnB4JzogMTAwfVwiIFtuZ1N0eWxlLnhzXT1cInsnaGVpZ2h0LnB4JzoxMjUsJ21pbi1oZWlnaHQucHgnOiAxMjV9XCI+XHJcbiAgICAgIDxhdWRpby1sZXZlbGJhciBmeEZsZXg9XCIxIDAgMVwiIFtzdHJlYW1pbmdNb2RlXT1cImlzUmVjb3JkaW5nKClcIiBbZGlzcGxheUxldmVsSW5mb3NdPVwiZGlzcGxheUxldmVsSW5mb3NcIj48L2F1ZGlvLWxldmVsYmFyPlxyXG4gICAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCI+XHJcbiAgICAgIDxzcHItcmVjb3JkaW5naXRlbWNvbnRyb2xzIGZ4RmxleD1cIjEwIDAgMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdWRpb0xvYWRlZF09XCJkaXNwbGF5QXVkaW9DbGlwPy5idWZmZXIhPT1udWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYXlTdGFydEFjdGlvbl09XCJjb250cm9sQXVkaW9QbGF5ZXI/LnN0YXJ0QWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYXlTdG9wQWN0aW9uXT1cImNvbnRyb2xBdWRpb1BsYXllcj8uc3RvcEFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwZWFrRGJMdmxdPVwicGVha0xldmVsSW5EYlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthZ2NdPVwidGhpcy5hYz8uYWdjU3RhdHVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uU2hvd1JlY29yZGluZ0RldGFpbHMpPVwiYXVkaW9TaWduYWxDb2xsYXBzZWQ9IWF1ZGlvU2lnbmFsQ29sbGFwc2VkXCI+XHJcbiAgICAgIDwvc3ByLXJlY29yZGluZ2l0ZW1jb250cm9scz5cclxuICAgICAgPGFwcC11cGxvYWRzdGF0dXMgY2xhc3M9XCJyaWNvbnRyb2xzIGRhcmtcIiBmeEhpZGUgZnhTaG93LnhzICBmeEZsZXg9XCIwIDAgMFwiICpuZ0lmPVwiZW5hYmxlVXBsb2FkUmVjb3JkaW5nc1wiIFt2YWx1ZV09XCJ1cGxvYWRQcm9ncmVzc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3RhdHVzXT1cInVwbG9hZFN0YXR1c1wiIFthd2FpdE5ld1VwbG9hZF09XCJwcm9jZXNzaW5nUmVjb3JkaW5nXCI+PC9hcHAtdXBsb2Fkc3RhdHVzPlxyXG4gICAgICA8YXBwLXJlYWR5c3RhdGVpbmRpY2F0b3IgY2xhc3M9XCJyaWNvbnRyb2xzIGRhcmtcIiAgZnhIaWRlIGZ4U2hvdy54cyBmeEZsZXg9XCIwIDAgMFwiIFtyZWFkeV09XCJkYXRhU2F2ZWQgJiYgIWlzQWN0aXZlKClcIj48L2FwcC1yZWFkeXN0YXRlaW5kaWNhdG9yPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8ZGl2ICNjb250cm9scGFuZWwgY2xhc3M9XCJjb250cm9scGFuZWxcIiBmeExheW91dD1cInJvd1wiPlxyXG4gICAgICA8ZGl2IGZ4RmxleD1cIjEgMSAzMCVcIiBmeExheW91dEFsaWduPVwic3RhcnQgY2VudGVyXCI+XHJcbiAgICAgICAgPGFwcC1zcHJzdGF0dXNkaXNwbGF5IGZ4SGlkZS54cyBbc3RhdHVzTXNnXT1cInN0YXR1c01zZ1wiIFtzdGF0dXNBbGVydFR5cGVdPVwic3RhdHVzQWxlcnRUeXBlXCIgW3N0YXR1c1dhaXRpbmddPVwic3RhdHVzV2FpdGluZ1wiPjwvYXBwLXNwcnN0YXR1c2Rpc3BsYXk+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPGFwcC1zcHJ0cmFuc3BvcnQgZnhGbGV4PVwiMTAgMCAzMCVcIiBmeExheW91dEFsaWduPVwiY2VudGVyIGNlbnRlclwiIFtyZWFkb25seV09XCJyZWFkb25seVwiIFthY3Rpb25zXT1cInRyYW5zcG9ydEFjdGlvbnNcIiBbbmF2aWdhdGlvbkVuYWJsZWRdPVwiaXRlbXM9PW51bGwgfHwgaXRlbXMubGVuZ3RoPjFcIj48L2FwcC1zcHJ0cmFuc3BvcnQ+XHJcbiAgICA8ZGl2IGZ4RmxleD1cIjEgMSAzMCVcIiBmeExheW91dEFsaWduPVwiZW5kIGNlbnRlclwiIGZ4TGF5b3V0PVwicm93XCI+XHJcbiAgICAgIDxhcHAtdXBsb2Fkc3RhdHVzIGNsYXNzPVwicmljb250cm9sc1wiIGZ4SGlkZS54cyBmeExheW91dEFsaWduPVwiZW5kIGNlbnRlclwiICpuZ0lmPVwiZW5hYmxlVXBsb2FkUmVjb3JkaW5nc1wiIFt2YWx1ZV09XCJ1cGxvYWRQcm9ncmVzc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbc3RhdHVzXT1cInVwbG9hZFN0YXR1c1wiIFthd2FpdE5ld1VwbG9hZF09XCJwcm9jZXNzaW5nUmVjb3JkaW5nXCI+PC9hcHAtdXBsb2Fkc3RhdHVzPlxyXG4gICAgICA8YXBwLXJlYWR5c3RhdGVpbmRpY2F0b3IgY2xhc3M9XCJyaWNvbnRyb2xzXCIgZnhMYXlvdXRBbGlnbj1cImVuZCBjZW50ZXJcIiBmeEhpZGUueHMgW3JlYWR5XT1cImRhdGFTYXZlZCAmJiAhaXNBY3RpdmUoKVwiPjwvYXBwLXJlYWR5c3RhdGVpbmRpY2F0b3I+XHJcbiAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIGAsXHJcbiAgc3R5bGVzOiBbYDpob3N0IHtcclxuICAgIGZsZXg6IDI7XHJcbiAgICBiYWNrZ3JvdW5kOiBsaWdodGdyZXk7XHJcbiAgICBkaXNwbGF5OiBmbGV4OyAvKiBWZXJ0aWNhbCBmbGV4IGNvbnRhaW5lcjogQm90dG9tIHRyYW5zcG9ydCBwYW5lbCwgYWJvdmUgcHJvbXB0aW5nIHBhbmVsICovXHJcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgcGFkZGluZzogMDtcclxuICAgIG1pbi1oZWlnaHQ6IDBweDtcclxuXHJcbiAgICAgIC8qIFByZXZlbnRzIGhvcml6b250YWwgc2Nyb2xsIGJhciBvbiBzd2lwZSByaWdodCAqL1xyXG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1gLGAucmljb250cm9scyB7XHJcbiAgICAgICAgcGFkZGluZzogNHB4O1xyXG4gICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgfWAsYC5kYXJrIHtcclxuICAgIGJhY2tncm91bmQ6IGRhcmtncmF5O1xyXG4gIH1gLGAuY29udHJvbHBhbmVsIHtcclxuICAgIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgICBwYWRkaW5nOiAyMHB4O1xyXG4gICAgbWluLWhlaWdodDogbWluLWNvbnRlbnQ7IC8qIGltcG9ydGFudCAqL1xyXG4gIH1gXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgU2Vzc2lvbk1hbmFnZXIgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LE9uRGVzdHJveSwgQXVkaW9DYXB0dXJlTGlzdGVuZXIge1xyXG5cclxuICBASW5wdXQoKSBwcm9qZWN0TmFtZTpzdHJpbmd8dW5kZWZpbmVkO1xyXG4gIGVuYWJsZVVwbG9hZFJlY29yZGluZ3M6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGVuYWJsZURvd25sb2FkUmVjb3JkaW5nczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHN0YXR1czogU3RhdHVzID0gU3RhdHVzLkJMT0NLRUQ7XHJcblxyXG4gIGFjOiBBdWRpb0NhcHR1cmV8bnVsbD1udWxsO1xyXG4gIHByaXZhdGUgX2NoYW5uZWxDb3VudCA9IDI7IC8vVE9ETyBkZWZpbmUgY29uc3RhbnQgZm9yIGRlZmF1bHQgZm9ybWF0XHJcbiAgcHJpdmF0ZSBfc2VsZWN0ZWREZXZpY2VJZDpzdHJpbmd8dW5kZWZpbmVkPXVuZGVmaW5lZDtcclxuICBAVmlld0NoaWxkKFByb21wdGluZywgeyBzdGF0aWM6IHRydWUgfSkgcHJvbXB0aW5nITogUHJvbXB0aW5nO1xyXG4gIEBWaWV3Q2hpbGQoTGV2ZWxCYXIsIHsgc3RhdGljOiB0cnVlIH0pIGxpdmVMZXZlbERpc3BsYXkhOiBMZXZlbEJhcjtcclxuXHJcbiAgQElucHV0KCkgZGF0YVNhdmVkPXRydWVcclxuXHJcblxyXG4gIHN0YXJ0U3RvcFNpZ25hbFN0YXRlITogU3RhcnRTdG9wU2lnbmFsU3RhdGU7XHJcbiAgLy8gUHJvcGVydHkgYXVkaW9EZXZpY2VzIGZyb20gcHJvamVjdCBjb25maWc6IGxpc3Qgb2YgbmFtZXMgb2YgYWxsb3dlZCBhdWRpbyBkZXZpY2VzLlxyXG4gIHByaXZhdGUgX2F1ZGlvRGV2aWNlczogQXJyYXk8QXVkaW9EZXZpY2U+IHwgbnVsbHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgc2VsQ2FwdHVyZURldmljZUlkOiBDb25zdHJhaW5ET01TdHJpbmcgfCBudWxsO1xyXG5cclxuICBwcml2YXRlIF9hdXRvR2FpbkNvbnRyb2xDb25maWdzOiBBcnJheTxBdXRvR2FpbkNvbnRyb2xDb25maWc+IHwgbnVsbHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIHVwZGF0ZVRpbWVySWQ6IGFueTtcclxuICBwcml2YXRlIHByZVJlY1RpbWVySWQ6IG51bWJlcnxudWxsPW51bGw7XHJcbiAgcHJpdmF0ZSBwcmVSZWNUaW1lclJ1bm5pbmc6IGJvb2xlYW58bnVsbD1udWxsO1xyXG4gIHByaXZhdGUgcG9zdFJlY1RpbWVySWQ6IG51bWJlcnxudWxsPW51bGw7XHJcbiAgcHJpdmF0ZSBwb3N0UmVjVGltZXJSdW5uaW5nOiBib29sZWFufG51bGw9bnVsbDtcclxuICBwcml2YXRlIG1heFJlY1RpbWVySWQ6IG51bWJlcnxudWxsPW51bGw7XHJcbiAgcHJpdmF0ZSBtYXhSZWNUaW1lclJ1bm5pbmc6IGJvb2xlYW58bnVsbD1udWxsO1xyXG5cclxuICB0cmFuc3BvcnRBY3Rpb25zOiBUcmFuc3BvcnRBY3Rpb25zO1xyXG4gIGRubExuayE6IEhUTUxBbmNob3JFbGVtZW50O1xyXG4gIHBsYXlTdGFydEFjdGlvbjogQWN0aW9uPHZvaWQ+O1xyXG4gIGF1ZGlvOiBhbnk7XHJcblxyXG4gIF9zZXNzaW9uOiBTZXNzaW9ufG51bGw9bnVsbDtcclxuICBfc2NyaXB0ITogU2NyaXB0O1xyXG5cclxuICBwcml2YXRlIF9wcm9tcHRJbmRleD0wO1xyXG4gIHByaXZhdGUgc2VjdGlvbiE6IFNlY3Rpb247XHJcbiAgZ3JvdXAhOiBHcm91cDtcclxuICBwcm9tcHRJdGVtITpQcm9tcHRJdGVtO1xyXG4gIHNob3dQcm9tcHQhOiBib29sZWFuO1xyXG5cclxuICAvLyBpbmRleCBvZiBjdXJyZW50IHNlY3Rpb25cclxuICBzZWN0SWR4ITogbnVtYmVyO1xyXG4gIC8vIGluZGV4IG9mIGN1cnJlbnQgZ3JvdXAgaW4gc2VjdGlvblxyXG4gIGdyb3VwSWR4SW5TZWN0aW9uITogbnVtYmVyO1xyXG4gIC8vIGluZGV4IG9mIGN1cnJlbnQgcHJvbXB0IGl0ZW0gaW4gZ3JvdXBcclxuICBwcm9tcHRJdGVtSWR4SW5Hcm91cCE6IG51bWJlcjtcclxuXHJcbiAgcHJpdmF0ZSBhdXRvcmVjb3JkaW5nITogYm9vbGVhbjtcclxuXHJcbiAgaXRlbXM6IEFycmF5PEl0ZW0+fG51bGw9bnVsbDtcclxuICAvL3NlbGVjdGVkSXRlbUlkeDogbnVtYmVyO1xyXG4gIHByaXZhdGUgX2Rpc3BsYXlSZWNGaWxlOiBTcHJSZWNvcmRpbmdGaWxlIHwgbnVsbD1udWxsO1xyXG4gIHByaXZhdGUgZGlzcGxheVJlY0ZpbGVWZXJzaW9uITogbnVtYmVyO1xyXG4gIGRpc3BsYXlBdWRpb0NsaXA6IEF1ZGlvQ2xpcCB8IG51bGw9bnVsbDtcclxuXHJcbiAgZGlzcGxheUxldmVsSW5mb3M6IExldmVsSW5mb3MgfCBudWxsPW51bGw7XHJcblxyXG4gIHBlYWtMZXZlbEluRGI6bnVtYmVyPU1JTl9EQl9MRVZFTDtcclxuXHJcbiAgcHJvbXB0SXRlbUNvdW50ITogbnVtYmVyO1xyXG5cclxuICByZWFkb25seT1mYWxzZVxyXG5cclxuICBzdGF0dXNNc2chOiBzdHJpbmc7XHJcbiAgc3RhdHVzQWxlcnRUeXBlITogc3RyaW5nO1xyXG4gIHN0YXR1c1dhaXRpbmchOiBib29sZWFuO1xyXG5cclxuICBwcm9jZXNzaW5nUmVjb3JkaW5nPWZhbHNlXHJcblxyXG4gIHVwbG9hZFByb2dyZXNzOiBudW1iZXIgPSAxMDA7XHJcbiAgdXBsb2FkU3RhdHVzOiBzdHJpbmcgPSAnb2snXHJcbiAgYXVkaW9TaWduYWxDb2xsYXBzZWQgPSB0cnVlO1xyXG5cclxuICBwcml2YXRlIHN0cmVhbUxldmVsTWVhc3VyZTogU3RyZWFtTGV2ZWxNZWFzdXJlO1xyXG4gIHByaXZhdGUgbGV2ZWxNZWFzdXJlOiBMZXZlbE1lYXN1cmU7XHJcbiAgcHJpdmF0ZSBfY29udHJvbEF1ZGlvUGxheWVyITogQXVkaW9QbGF5ZXI7XHJcblxyXG4gIHByaXZhdGUgYXVkaW9GZXRjaFN1YnNjcmlwdGlvbjpTdWJzY3JpcHRpb258bnVsbD1udWxsO1xyXG5cclxuICBwcml2YXRlIGRlc3Ryb3llZD1mYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBuYXZpZ2F0aW9uRGlzYWJsZWQ9dHJ1ZTtcclxuXHJcbiAgcHJpdmF0ZSB1c2VyQWdlbnQ6VXNlckFnZW50O1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgICAgICAgICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICAgICAgICAgICAgcHVibGljIGRpYWxvZzogTWF0RGlhbG9nLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgc2Vzc2lvblNlcnZpY2U6U2Vzc2lvblNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSByZWNGaWxlU2VydmljZTpSZWNvcmRpbmdTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgdXBsb2FkZXI6IFNwZWVjaFJlY29yZGVyVXBsb2FkZXIsXHJcbiAgICAgICAgICAgICAgQEluamVjdChTUEVFQ0hSRUNPUkRFUl9DT05GSUcpIHB1YmxpYyBjb25maWc/OiBTcGVlY2hSZWNvcmRlckNvbmZpZykge1xyXG4gICAgdGhpcy5zdGF0dXMgPSBTdGF0dXMuSURMRTtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucyA9IG5ldyBUcmFuc3BvcnRBY3Rpb25zKCk7XHJcbiAgICB0aGlzLnBsYXlTdGFydEFjdGlvbiA9IG5ldyBBY3Rpb24oJ1BsYXknKTtcclxuICAgIHRoaXMuYXVkaW8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXVkaW8nKTtcclxuICAgIHRoaXMuc2VsQ2FwdHVyZURldmljZUlkID0gbnVsbDtcclxuICAgIHRoaXMubGV2ZWxNZWFzdXJlID0gbmV3IExldmVsTWVhc3VyZSgpO1xyXG4gICAgdGhpcy5zdHJlYW1MZXZlbE1lYXN1cmUgPSBuZXcgU3RyZWFtTGV2ZWxNZWFzdXJlKCk7XHJcbiAgICB0aGlzLnVzZXJBZ2VudD1Vc2VyQWdlbnRCdWlsZGVyLnVzZXJBZ2VudCgpO1xyXG4gICAgY29uc29sZS5kZWJ1ZyhcIkRldGVjdGVkIHBsYXRmb3JtOiBcIit0aGlzLnVzZXJBZ2VudC5kZXRlY3RlZFBsYXRmb3JtKTtcclxuICAgIGNvbnNvbGUuZGVidWcoXCJEZXRlY3RlZCBicm93c2VyOiBcIit0aGlzLnVzZXJBZ2VudC5kZXRlY3RlZEJyb3dzZXIpO1xyXG5cclxuICAgIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5lbmFibGVVcGxvYWRSZWNvcmRpbmdzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5lbmFibGVVcGxvYWRSZWNvcmRpbmdzID0gdGhpcy5jb25maWcuZW5hYmxlVXBsb2FkUmVjb3JkaW5ncztcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5lbmFibGVEb3dubG9hZFJlY29yZGluZ3MgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmVuYWJsZURvd25sb2FkUmVjb3JkaW5ncyA9IHRoaXMuY29uZmlnLmVuYWJsZURvd25sb2FkUmVjb3JkaW5ncztcclxuICAgIH1cclxuICAgIHRoaXMuaW5pdCgpO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgdGhpcy5zdHJlYW1MZXZlbE1lYXN1cmUubGV2ZWxMaXN0ZW5lciA9IHRoaXMubGl2ZUxldmVsRGlzcGxheTtcclxuICAgIHRoaXMuc3RyZWFtTGV2ZWxNZWFzdXJlLnBlYWtMZXZlbExpc3RlbmVyPShwZWFrTHZsSW5EYik9PntcclxuICAgICAgdGhpcy5wZWFrTGV2ZWxJbkRiPXBlYWtMdmxJbkRiO1xyXG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuICB9XHJcbiAgICBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgIHRoaXMuZGVzdHJveWVkPXRydWU7XHJcbiAgICAgICAvLyBUT0RPIHN0b3AgY2FwdHVyZSAvcGxheWJhY2tcclxuICAgIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0KCkge1xyXG4gICAgdGhpcy5zZWN0SWR4ID0gMDtcclxuICAgIHRoaXMuZ3JvdXBJZHhJblNlY3Rpb24gPSAwO1xyXG4gICAgdGhpcy5wcm9tcHRJdGVtSWR4SW5Hcm91cCA9IDA7XHJcbiAgICB0aGlzLmF1dG9yZWNvcmRpbmcgPSBmYWxzZTtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdGFydEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RvcEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMubmV4dEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMucGF1c2VBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5wbGF5U3RhcnRBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgbGV0IGNvbnRleHQ6QXVkaW9Db250ZXh0fG51bGw9bnVsbDtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnRleHQgPSBBdWRpb0NvbnRleHRQcm92aWRlci5hdWRpb0NvbnRleHRJbnN0YW5jZSgpXHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgdGhpcy5zdGF0dXMgPSBTdGF0dXMuRVJST1I7XHJcbiAgICAgIGxldCBlcnJNc2cgPSAnVW5rbm93biBlcnJvcic7XHJcbiAgICAgIGlmKGVyciBpbnN0YW5jZW9mIEVycm9yKXtcclxuICAgICAgICBlcnJNc2c9ZXJyLm1lc3NhZ2U7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zdGF0dXNNc2cgPSAnRVJST1I6ICcgKyBlcnJNc2c7XHJcbiAgICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJztcclxuICAgICAgdGhpcy5kaWFsb2cub3BlbihNZXNzYWdlRGlhbG9nLCB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgdHlwZTogJ2Vycm9yJyxcclxuICAgICAgICAgIHRpdGxlOiAnRXJyb3InLFxyXG4gICAgICAgICAgbXNnOiBlcnJNc2csXHJcbiAgICAgICAgICBhZHZpc2U6ICdQbGVhc2UgdXNlIGEgc3VwcG9ydGVkIGJyb3dzZXIuJyxcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZihjb250ZXh0KSB7XHJcbiAgICAgIGNvbnNvbGUuaW5mbyhcIlN0YXRlIG9mIGF1ZGlvIGNvbnRleHQ6IFwiICsgY29udGV4dC5zdGF0ZSlcclxuICAgIH1lbHNle1xyXG4gICAgICBjb25zb2xlLmluZm8oXCJObyBhdWRpbyBjb250ZXh0IGF2YWlsYWJsZSFcIik7XHJcbiAgICB9XHJcbiAgICBpZiAoIWNvbnRleHQgfHwgIW5hdmlnYXRvci5tZWRpYURldmljZXMpIHtcclxuICAgICAgdGhpcy5zdGF0dXMgPSBTdGF0dXMuRVJST1I7XHJcbiAgICAgIGxldCBlcnJNc2cgPSAnQnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IE1lZGlhIHN0cmVhbXMhJztcclxuICAgICAgdGhpcy5zdGF0dXNNc2cgPSAnRVJST1I6ICcgKyBlcnJNc2c7XHJcbiAgICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJztcclxuICAgICAgdGhpcy5kaWFsb2cub3BlbihNZXNzYWdlRGlhbG9nLCB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgdHlwZTogJ2Vycm9yJyxcclxuICAgICAgICAgIHRpdGxlOiAnRXJyb3InLFxyXG4gICAgICAgICAgbXNnOiBlcnJNc2csXHJcbiAgICAgICAgICBhZHZpc2U6ICdQbGVhc2UgdXNlIGEgc3VwcG9ydGVkIGJyb3dzZXIuJyxcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmFjID0gbmV3IEF1ZGlvQ2FwdHVyZShjb250ZXh0KTtcclxuICAgICAgaWYgKHRoaXMuYWMpIHtcclxuICAgICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RhcnRBY3Rpb24ub25BY3Rpb24gPSAoKSA9PiB0aGlzLnN0YXJ0SXRlbSgpO1xyXG4gICAgICAgIHRoaXMuYWMubGlzdGVuZXIgPSB0aGlzO1xyXG4gICAgICAgIHRoaXMuYWMuYXVkaW9PdXRTdHJlYW0gPSBuZXcgU2VxdWVuY2VBdWRpb0Zsb2F0MzJDaHVua2VyT3V0U3RyZWFtKHRoaXMuc3RyZWFtTGV2ZWxNZWFzdXJlLCBMRVZFTF9CQVJfSU5URVJWQUxMX1NFQ09ORFMpO1xyXG4gICAgICAgIC8vIERvbid0IGxpc3QgdGhlIGRldmljZXMgaGVyZS4gSWYgd2UgZG8gbm90IGhhdmUgYXVkaW8gcGVybWlzc2lvbnMgd2Ugb25seSBnZXQgYW5vbnltaXplZCBkZXZpY2VzIHdpdGhvdXQgbGFiZWxzLlxyXG4gICAgICAgIC8vdGhpcy5hYy5saXN0RGV2aWNlcygpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdGFydEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgICAgbGV0IGVyck1zZyA9ICdCcm93c2VyIGRvZXMgbm90IHN1cHBvcnQgTWVkaWEvQXVkaW8gQVBJISc7XHJcbiAgICAgICAgdGhpcy5zdGF0dXNNc2cgPSAnRVJST1I6ICcgKyBlcnJNc2c7XHJcbiAgICAgICAgdGhpcy5zdGF0dXNBbGVydFR5cGUgPSAnZXJyb3InO1xyXG4gICAgICAgIHRoaXMuZGlhbG9nLm9wZW4oTWVzc2FnZURpYWxvZywge1xyXG4gICAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxyXG4gICAgICAgICAgICB0aXRsZTogJ0Vycm9yJyxcclxuICAgICAgICAgICAgbXNnOiBlcnJNc2csXHJcbiAgICAgICAgICAgIGFkdmlzZTogJ1BsZWFzZSB1c2UgYSBzdXBwb3J0ZWQgYnJvd3Nlci4nLFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RvcEFjdGlvbi5vbkFjdGlvbiA9ICgpID0+IHRoaXMuc3RvcEl0ZW0oKTtcclxuICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLm5leHRBY3Rpb24ub25BY3Rpb24gPSAoKSA9PiB0aGlzLnN0b3BJdGVtKCk7XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5wYXVzZUFjdGlvbi5vbkFjdGlvbiA9ICgpID0+IHRoaXMucGF1c2VJdGVtKCk7XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5md2RBY3Rpb24ub25BY3Rpb24gPSAoKSA9PiB0aGlzLm5leHRJdGVtKCk7XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5md2ROZXh0QWN0aW9uLm9uQWN0aW9uID0gKCkgPT4gdGhpcy5uZXh0VW5yZWNvcmRlZEl0ZW0oKTtcclxuICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLmJ3ZEFjdGlvbi5vbkFjdGlvbiA9ICgpID0+IHRoaXMucHJldkl0ZW0oKTtcclxuICAgICAgdGhpcy5wbGF5U3RhcnRBY3Rpb24ub25BY3Rpb24gPSAoKSA9PiB0aGlzLmNvbnRyb2xBdWRpb1BsYXllci5zdGFydCgpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnN0YXJ0U3RvcFNpZ25hbFN0YXRlID0gU3RhcnRTdG9wU2lnbmFsU3RhdGUuT0ZGO1xyXG5cclxufVxyXG5cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5cHJlc3MnLCBbJyRldmVudCddKVxyXG4gIG9uS2V5UHJlc3Moa2U6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIGlmIChrZS5rZXkgPT0gJyAnKSB7XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdGFydEFjdGlvbi5wZXJmb3JtKCk7XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5uZXh0QWN0aW9uLnBlcmZvcm0oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXlkb3duJywgWyckZXZlbnQnXSlcclxuICBvbktleURvd24oa2U6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIGlmIChrZS5rZXkgPT0gJyAnIHx8IGtlLmtleSA9PSAnRXNjYXBlJykge1xyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RvcEFjdGlvbi5wZXJmb3JtKCk7XHJcbiAgICB9XHJcbiAgICBpZiAoa2Uua2V5ID09ICdwJyB8fCBrZS5rZXkgPT0gJ0VzY2FwZScpIHtcclxuICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnBhdXNlQWN0aW9uLnBlcmZvcm0oKTtcclxuICAgIH1cclxuICAgIGlmIChrZS5rZXkgPT0gJ01lZGlhUGxheVBhdXNlJykge1xyXG4gICAgICB0aGlzLnBsYXlTdGFydEFjdGlvbi5wZXJmb3JtKCk7XHJcbiAgICB9XHJcbiAgICBpZiAoa2Uua2V5ID09PSAnQXJyb3dSaWdodCcpIHtcclxuICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLmZ3ZEFjdGlvbi5wZXJmb3JtKCk7XHJcbiAgICB9XHJcbiAgICBpZiAoa2Uua2V5ID09PSAnQXJyb3dMZWZ0Jykge1xyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuYndkQWN0aW9uLnBlcmZvcm0oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb2dyZXNzUGVyY2VudFZhbHVlKCk6bnVtYmVyIHtcclxuICAgIGxldCB2PTEwMDtcclxuICAgIGlmKHRoaXMuaXRlbXMpIHtcclxuICAgICAgdj10aGlzLnByb21wdEluZGV4ICogMTAwIC8gKHRoaXMuaXRlbXMubGVuZ3RoIC0gMSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdjtcclxuICB9XHJcbiAgaXNUZXN0U2Vzc2lvbigpOmJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICgodGhpcy5fc2Vzc2lvbiE9bnVsbCkgJiYgKHRoaXMuX3Nlc3Npb24udHlwZSA9PT0gJ1RFU1QnIHx8IHRoaXMuX3Nlc3Npb24udHlwZT09PSdURVNUX0RFRl9BJyB8fCB0aGlzLl9zZXNzaW9uLnR5cGUgPT09ICdTSU5VU19URVNUJykpO1xyXG4gIH1cclxuXHJcbiAgaXNEZWZhdWx0QXVkaW9UZXN0U2Vzc2lvbigpOmJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICgodGhpcy5fc2Vzc2lvbiE9bnVsbCkgJiYgKHRoaXMuX3Nlc3Npb24udHlwZT09PSdURVNUX0RFRl9BJykpO1xyXG4gIH1cclxuXHJcbiAgaXNEZWZhdWx0QXVkaW9UZXN0U2Vzc2lvbk92ZXJ3cml0ZWluZ1Byb2plY3RSZXF1aXJlbWVudHMoKTpib29sZWFuIHtcclxuICAgIHJldHVybiAoKHRoaXMuX3Nlc3Npb24hPW51bGwpICYmICh0aGlzLl9zZXNzaW9uLnR5cGU9PT0nVEVTVF9ERUZfQScpICYmICh0aGlzLmF1ZGlvRGV2aWNlcyE9bnVsbCkgJiYgdGhpcy5hdWRpb0RldmljZXMubGVuZ3RoPjApXHJcbiAgfVxyXG5cclxuXHJcbiAgc2V0IGNvbnRyb2xBdWRpb1BsYXllcihjb250cm9sQXVkaW9QbGF5ZXI6IEF1ZGlvUGxheWVyKSB7XHJcbiAgICBpZiAodGhpcy5fY29udHJvbEF1ZGlvUGxheWVyKSB7XHJcbiAgICAgIC8vdGhpcy5fY29udHJvbEF1ZGlvUGxheWVyLmxpc3RlbmVyPW51bGw7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIgPSBjb250cm9sQXVkaW9QbGF5ZXI7XHJcbiAgICBpZiAodGhpcy5fY29udHJvbEF1ZGlvUGxheWVyKSB7XHJcbiAgICAgIHRoaXMuX2NvbnRyb2xBdWRpb1BsYXllci5saXN0ZW5lciA9IHRoaXM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgY29udHJvbEF1ZGlvUGxheWVyKCk6IEF1ZGlvUGxheWVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXI7XHJcbiAgfVxyXG5cclxuICBzZXQgc2Vzc2lvbihzZXNzaW9uOiBTZXNzaW9uKSB7XHJcbiAgICB0aGlzLl9zZXNzaW9uID0gc2Vzc2lvbjtcclxuICB9XHJcblxyXG4gIHNldCBzY3JpcHQoc2NyaXB0OiBhbnkpIHtcclxuICAgIHRoaXMuX3NjcmlwdCA9IHNjcmlwdDtcclxuICAgIHRoaXMubG9hZFNjcmlwdCgpO1xyXG4gIH1cclxuXHJcbiAgc2V0IGNoYW5uZWxDb3VudChjaGFubmVsQ291bnQ6IG51bWJlcikge1xyXG4gICAgdGhpcy5fY2hhbm5lbENvdW50ID0gY2hhbm5lbENvdW50O1xyXG4gIH1cclxuXHJcbiAgc2V0IGF1ZGlvRGV2aWNlcyhhdWRpb0RldmljZXM6IEFycmF5PEF1ZGlvRGV2aWNlPiB8IG51bGx8dW5kZWZpbmVkKSB7XHJcbiAgICB0aGlzLl9hdWRpb0RldmljZXMgPSBhdWRpb0RldmljZXM7XHJcbiAgfVxyXG5cclxuICBzZXQgYXV0b0dhaW5Db250cm9sQ29uZmlncyhhdXRvR2FpbkNvbnRyb2xDb25maWdzOiBBcnJheTxBdXRvR2FpbkNvbnRyb2xDb25maWc+fG51bGx8dW5kZWZpbmVkKXtcclxuICAgIHRoaXMuX2F1dG9HYWluQ29udHJvbENvbmZpZ3M9YXV0b0dhaW5Db250cm9sQ29uZmlncztcclxuICB9XHJcblxyXG4gIHVwZGF0ZShlOiBBdWRpb1BsYXllckV2ZW50KSB7XHJcbiAgICBpZiAoZS50eXBlID09IEV2ZW50VHlwZS5TVEFSVEVEKSB7XHJcbiAgICAgIHRoaXMucGxheVN0YXJ0QWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgdGhpcy51cGRhdGVUaW1lcklkID0gd2luZG93LnNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgICAvL3RoaXMuYXVkaW9TaWduYWwucGxheUZyYW1lUG9zaXRpb24gPSB0aGlzLmFwLnBsYXlQb3NpdGlvbkZyYW1lcztcclxuICAgICAgfSwgNTApO1xyXG4gICAgfSBlbHNlIGlmIChlLnR5cGUgPT0gRXZlbnRUeXBlLlNUT1BQRUQgfHwgZS50eXBlID09IEV2ZW50VHlwZS5FTkRFRCkge1xyXG4gICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnVwZGF0ZVRpbWVySWQpO1xyXG4gICAgICAvLyB0aGlzLmF1ZGlvU2lnbmFsLnBsYXlGcmFtZVBvc2l0aW9uID0gdGhpcy5hcC5wbGF5UG9zaXRpb25GcmFtZXM7XHJcbiAgICAgIHRoaXMucGxheVN0YXJ0QWN0aW9uLmRpc2FibGVkID0gKCEodGhpcy5kaXNwbGF5UmVjRmlsZSkpO1xyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBwcm9tcHRJbmRleCgpOm51bWJlcntcclxuICAgIHJldHVybiB0aGlzLl9wcm9tcHRJbmRleDtcclxuICB9XHJcblxyXG4gIHNldCBwcm9tcHRJbmRleChwcm9tcHRJbmRleDpudW1iZXIpe1xyXG4gICAgaWYocHJvbXB0SW5kZXg8MCB8fCBwcm9tcHRJbmRleD49dGhpcy5wcm9tcHRJdGVtQ291bnQpe1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQcm9tcHQgaW5kZXggb3V0IG9mIHJhbmdlXCIpXHJcbiAgICB9XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBsZXQgc2VjdGlvbnM9dGhpcy5fc2NyaXB0LnNlY3Rpb25zO1xyXG4gICAgbGV0IGZvdW5kPWZhbHNlO1xyXG4gICAgZm9yIChsZXQgc2kgPSAwOyBzaSA8IHNlY3Rpb25zLmxlbmd0aCAmJiAhZm91bmQ7IHNpKyspIHtcclxuICAgICAgbGV0IHNlY3Rpb24gPSBzZWN0aW9uc1tzaV07XHJcbiAgICAgIGxldCBncyA9IHNlY3Rpb24uX3NodWZmbGVkR3JvdXBzO1xyXG4gICAgICBmb3IgKGxldCBnaSA9IDA7IGdpIDwgZ3MubGVuZ3RoOyBnaSsrKSB7XHJcbiAgICAgICAgbGV0IHBpcz1nc1tnaV0uX3NodWZmbGVkUHJvbXB0SXRlbXM7XHJcblxyXG4gICAgICAgIGxldCBwaXNTaXplID0gcGlzLmxlbmd0aDtcclxuICAgICAgICBpZiAocHJvbXB0SW5kZXggPCBpICsgcGlzU2l6ZSkge1xyXG4gICAgICAgICAgdGhpcy5zZWN0SWR4ID0gc2k7XHJcbiAgICAgICAgICB0aGlzLmdyb3VwSWR4SW5TZWN0aW9uPWdpO1xyXG4gICAgICAgICAgdGhpcy5wcm9tcHRJdGVtSWR4SW5Hcm91cCA9IHByb21wdEluZGV4IC0gaTtcclxuICAgICAgICAgIGZvdW5kPXRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaSArPSBwaXNTaXplO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYoZm91bmQpe1xyXG4gICAgICB0aGlzLl9wcm9tcHRJbmRleD1wcm9tcHRJbmRleDtcclxuICAgIH1lbHNle1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnRlcm5hbCBlcnJvcjogUHJvbXB0IGluZGV4IG5vdCBmb3VuZFwiKVxyXG4gICAgfVxyXG4gICAgdGhpcy5hcHBseUl0ZW0oKTtcclxuICB9XHJcblxyXG4gIGl0ZW1TZWxlY3QoaXRlbUlkeDogbnVtYmVyKSB7XHJcbiAgICBpZiAodGhpcy5zdGF0dXMgPT09IFN0YXR1cy5JRExFKSB7XHJcbiAgICAgIHRoaXMucHJvbXB0SW5kZXg9aXRlbUlkeDtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIHN0YXJ0SXRlbSgpIHtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdGFydEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMucGF1c2VBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgaWYodGhpcy5yZWFkb25seSl7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLmZ3ZEFjdGlvbi5kaXNhYmxlZCA9IHRydWVcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5md2ROZXh0QWN0aW9uLmRpc2FibGVkID0gdHJ1ZVxyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLmJ3ZEFjdGlvbi5kaXNhYmxlZCA9IHRydWVcclxuICAgIHRoaXMuZGlzcGxheVJlY0ZpbGUgPSBudWxsO1xyXG4gICAgdGhpcy5kaXNwbGF5UmVjRmlsZVZlcnNpb24gPSAwO1xyXG4gICAgdGhpcy5kaXNwbGF5QXVkaW9DbGlwID0gbnVsbDtcclxuICAgIHRoaXMuc2hvd1JlY29yZGluZygpO1xyXG4gICAgaWYgKHRoaXMuc2VjdGlvbi5tb2RlID09PSAnQVVUT1JFQ09SRElORycpIHtcclxuICAgICAgdGhpcy5hdXRvcmVjb3JkaW5nID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZih0aGlzLmFjIT1udWxsKSB7XHJcbiAgICAgIGlmICghdGhpcy5hYy5vcGVuZWQpIHtcclxuICAgICAgICBpZiAodGhpcy5fc2VsZWN0ZWREZXZpY2VJZCkge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJPcGVuIHNlc3Npb24gd2l0aCBhdWRpbyBkZXZpY2UgSWQ6IFxcJ1wiICsgdGhpcy5fc2VsZWN0ZWREZXZpY2VJZCArIFwiXFwnIGZvciBcIiArIHRoaXMuX2NoYW5uZWxDb3VudCArIFwiIGNoYW5uZWxzXCIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIk9wZW4gc2Vzc2lvbiB3aXRoIGRlZmF1bHQgYXVkaW8gZGV2aWNlIGZvciBcIiArIHRoaXMuX2NoYW5uZWxDb3VudCArIFwiIGNoYW5uZWxzXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFjLm9wZW4odGhpcy5fY2hhbm5lbENvdW50LCB0aGlzLl9zZWxlY3RlZERldmljZUlkLHRoaXMuX2F1dG9HYWluQ29udHJvbENvbmZpZ3MpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuYWMuc3RhcnQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgbG9hZFNjcmlwdCgpIHtcclxuICAgIHRoaXMucHJvbXB0SXRlbUNvdW50ID0gMDtcclxuXHJcbiAgICB0aGlzLml0ZW1zID0gbmV3IEFycmF5PEl0ZW0+KCk7XHJcbiAgICBsZXQgbG4gPSAwO1xyXG5cclxuICAgIC8vVE9ETyByYW5kb21pemUgbm90IHN1cHBvcnRlZFxyXG4gICAgZm9yIChsZXQgc2kgPSAwOyBzaSA8IHRoaXMuX3NjcmlwdC5zZWN0aW9ucy5sZW5ndGg7IHNpKyspIHtcclxuICAgICAgbGV0IHNlY3Rpb24gPSB0aGlzLl9zY3JpcHQuc2VjdGlvbnNbc2ldO1xyXG4gICAgICBsZXQgZ3MgPSBzZWN0aW9uLl9zaHVmZmxlZEdyb3VwcztcclxuICAgICAgZm9yKGxldCBnaT0wO2dpPGdzLmxlbmd0aDtnaSsrKSB7XHJcblxyXG4gICAgICAgICAgbGV0IHBpcyA9IGdzW2dpXS5fc2h1ZmZsZWRQcm9tcHRJdGVtcztcclxuXHJcbiAgICAgICAgICBsZXQgcGlzTGVuID0gcGlzLmxlbmd0aDtcclxuICAgICAgICAgIHRoaXMucHJvbXB0SXRlbUNvdW50ICs9IHBpc0xlbjtcclxuICAgICAgICAgIGZvciAobGV0IHBpU2VjdElkeCA9IDA7IHBpU2VjdElkeCA8IHBpc0xlbjsgcGlTZWN0SWR4KyspIHtcclxuICAgICAgICAgICAgbGV0IHBpID0gcGlzW3BpU2VjdElkeF07XHJcbiAgICAgICAgICAgIGxldCBwcm9tcHRBc1N0ciA9IFByb21wdGl0ZW1VdGlsLnRvUGxhaW5UZXh0U3RyaW5nKHBpKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBpdCA9IG5ldyBJdGVtKHByb21wdEFzU3RyLCBzZWN0aW9uLnRyYWluaW5nLCghcGkudHlwZSB8fCBwaS50eXBlPT09J3JlY29yZGluZycpKTtcclxuICAgICAgICAgICAgdGhpcy5pdGVtcy5wdXNoKGl0KTtcclxuICAgICAgICAgICAgbG4rKztcclxuICAgICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvbXB0SW5kZXhCeUl0ZW1jb2RlKGl0ZW1jb2RlOnN0cmluZyk6bnVtYmVyfG51bGx7XHJcbiAgICBsZXQgcGl4ID0gMDtcclxuXHJcbiAgICBmb3IgKGxldCBzaSA9IDA7IHNpIDwgdGhpcy5fc2NyaXB0LnNlY3Rpb25zLmxlbmd0aDsgc2krKykge1xyXG4gICAgICBsZXQgc2VjdGlvbiA9IHRoaXMuX3NjcmlwdC5zZWN0aW9uc1tzaV07XHJcbiAgICAgIGxldCBncyA9IHNlY3Rpb24uX3NodWZmbGVkR3JvdXBzO1xyXG4gICAgICBmb3IobGV0IGdpPTA7Z2k8Z3MubGVuZ3RoO2dpKyspIHtcclxuICAgICAgICBsZXQgcGlzPWdzW2dpXS5fc2h1ZmZsZWRQcm9tcHRJdGVtcztcclxuICAgICAgICBsZXQgcGlzTGVuID0gcGlzLmxlbmd0aDtcclxuICAgICAgICBmb3IgKGxldCBwaVNlY3RJZHggPSAwOyBwaVNlY3RJZHggPCBwaXNMZW47IHBpU2VjdElkeCsrKSB7XHJcbiAgICAgICAgICBsZXQgcGkgPSBwaXNbcGlTZWN0SWR4XTtcclxuICAgICAgICAgIGxldCBpYz1waS5pdGVtY29kZTtcclxuICAgICAgICAgIGlmKGljID09PSBpdGVtY29kZSl7XHJcbiAgICAgICAgICAgIHJldHVybiBwaXg7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBwaXgrKztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgY2xlYXJQcm9tcHQoKSB7XHJcbiAgICAvL3RoaXMucHJvbXB0aW5nLnByb21wdENvbnRhaW5lci5wcm9tcHRlci5wcm9tcHRUZXh0PScnO1xyXG4gICAgLy90aGlzLm1lZGlhaXRlbSA9IG51bGw7XHJcbiAgICB0aGlzLnNob3dQcm9tcHQgPSBmYWxzZTtcclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpXHJcbiAgfVxyXG5cclxuICBhcHBseVByb21wdCgpIHtcclxuICAgIC8vdGhpcy5wcm9tcHRpbmcucHJvbXB0Q29udGFpbmVyLnByb21wdGVyLnByb21wdFRleHQ9dGhpcy5wcm9tcHRVbml0Lm1lZGlhaXRlbXNbMF0udGV4dDtcclxuICAgIC8vdGhpcy5wcm9tcHRUZXh0ID0gdGhpcy5wcm9tcHRVbml0Lm1lZGlhaXRlbXNbMF0udGV4dDtcclxuICAgIC8vdGhpcy5tZWRpYWl0ZW09dGhpcy5wcm9tcHRVbml0Lm1lZGlhaXRlbXNbMF07XHJcbiAgICB0aGlzLnNob3dQcm9tcHQgPSB0cnVlO1xyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKClcclxuICB9XHJcblxyXG4gIGRvd25sb2FkUmVjb3JkaW5nKCkge1xyXG4gICAgaWYgKHRoaXMuZGlzcGxheVJlY0ZpbGUpIHtcclxuICAgICAgbGV0IGFiOiBBdWRpb0J1ZmZlcnxudWxsID0gdGhpcy5kaXNwbGF5UmVjRmlsZS5hdWRpb0J1ZmZlcjtcclxuICAgICAgbGV0IHd3ID0gbmV3IFdhdldyaXRlcigpO1xyXG4gICAgICBpZihhYikge1xyXG4gICAgICAgIGxldCB3YXZGaWxlID0gd3cud3JpdGVBc3luYyhhYiwgKHdhdkZpbGUpID0+IHtcclxuICAgICAgICAgIGxldCBibG9iID0gbmV3IEJsb2IoW3dhdkZpbGVdLCB7dHlwZTogJ2F1ZGlvL3dhdid9KTtcclxuICAgICAgICAgIGxldCByZlVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcblxyXG4gICAgICAgICAgbGV0IGRhdGFEbmxMbmsgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgICAgICAgIC8vZGF0YURubExuay5uYW1lID0gJ1JlY29yZGluZyc7XHJcbiAgICAgICAgICBkYXRhRG5sTG5rLmhyZWYgPSByZlVybDtcclxuXHJcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGRvY3VtZW50LmJvZHksIGRhdGFEbmxMbmspO1xyXG5cclxuICAgICAgICAgIC8vIGRvd25sb2FkIHByb3BlcnR5IG5vdCB5ZXQgaW4gVFMgZGVmXHJcbiAgICAgICAgICBpZiAodGhpcy5kaXNwbGF5UmVjRmlsZSkge1xyXG4gICAgICAgICAgICBsZXQgZm4gPSB0aGlzLmRpc3BsYXlSZWNGaWxlLmZpbGVuYW1lU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIGZuICs9ICdfJyArIHRoaXMuZGlzcGxheVJlY0ZpbGVWZXJzaW9uO1xyXG4gICAgICAgICAgICBmbiArPSAnLndhdic7XHJcbiAgICAgICAgICAgIGRhdGFEbmxMbmsuZG93bmxvYWQgPSBmbjtcclxuICAgICAgICAgICAgZGF0YURubExuay5jbGljaygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZChkb2N1bWVudC5ib2R5LCBkYXRhRG5sTG5rKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0IGRpc3BsYXlSZWNGaWxlKGRpc3BsYXlSZWNGaWxlOiBTcHJSZWNvcmRpbmdGaWxlIHwgbnVsbCkge1xyXG4gICAgdGhpcy5fZGlzcGxheVJlY0ZpbGUgPSBkaXNwbGF5UmVjRmlsZTtcclxuICAgIGlmICh0aGlzLl9kaXNwbGF5UmVjRmlsZSkge1xyXG4gICAgICBsZXQgYWI6IEF1ZGlvQnVmZmVyfG51bGwgPSB0aGlzLl9kaXNwbGF5UmVjRmlsZS5hdWRpb0J1ZmZlcjtcclxuICAgICAgaWYoYWIpIHtcclxuICAgICAgICB0aGlzLmRpc3BsYXlBdWRpb0NsaXAgPSBuZXcgQXVkaW9DbGlwKGFiKTtcclxuICAgICAgICB0aGlzLmNvbnRyb2xBdWRpb1BsYXllci5hdWRpb0NsaXAgPSB0aGlzLmRpc3BsYXlBdWRpb0NsaXA7XHJcbiAgICAgIH1lbHNlIHtcclxuICAgICAgICAvLyBjbGVhciBmb3Igbm93IC4uLlxyXG4gICAgICAgIHRoaXMuZGlzcGxheUF1ZGlvQ2xpcCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5jb250cm9sQXVkaW9QbGF5ZXIuYXVkaW9DbGlwID0gbnVsbDtcclxuICAgICAgICBpZiAodGhpcy5fY29udHJvbEF1ZGlvUGxheWVyICYmIHRoaXMuX3Nlc3Npb24pIHtcclxuICAgICAgICAgIC8vLi4uIGFuZCB0cnkgdG8gZmV0Y2ggZnJvbSBzZXJ2ZXJcclxuICAgICAgICAgIHRoaXMuYXVkaW9GZXRjaFN1YnNjcmlwdGlvbiA9IHRoaXMucmVjRmlsZVNlcnZpY2UuZmV0Y2hBbmRBcHBseVNwclJlY29yZGluZ0ZpbGUodGhpcy5fY29udHJvbEF1ZGlvUGxheWVyLmNvbnRleHQsIHRoaXMuX3Nlc3Npb24ucHJvamVjdCwgdGhpcy5fZGlzcGxheVJlY0ZpbGUpLnN1YnNjcmliZSgocmYpID0+IHtcclxuICAgICAgICAgICAgbGV0IGZhYiA9IG51bGw7XHJcbiAgICAgICAgICAgIGlmIChyZiAmJiB0aGlzLl9kaXNwbGF5UmVjRmlsZSkge1xyXG4gICAgICAgICAgICAgIGZhYiA9IHRoaXMuX2Rpc3BsYXlSZWNGaWxlLmF1ZGlvQnVmZmVyO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMuc3RhdHVzTXNnID0gJ1JlY29yZGluZyBmaWxlIGNvdWxkIG5vdCBiZSBsb2FkZWQuJ1xyXG4gICAgICAgICAgICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChmYWIpe1xyXG4gICAgICAgICAgICAgIHRoaXMuZGlzcGxheUF1ZGlvQ2xpcCA9IG5ldyBBdWRpb0NsaXAoZmFiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xBdWRpb1BsYXllci5hdWRpb0NsaXAgPXRoaXMuZGlzcGxheUF1ZGlvQ2xpcFxyXG4gICAgICAgICAgICB0aGlzLnNob3dSZWNvcmRpbmcoKTtcclxuXHJcbiAgICAgICAgICB9LCBlcnIgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQ291bGQgbm90IGxvYWQgcmVjb3JkaW5nIGZpbGUgZnJvbSBzZXJ2ZXI6IFwiICsgZXJyKVxyXG4gICAgICAgICAgICB0aGlzLnN0YXR1c01zZyA9ICdSZWNvcmRpbmcgZmlsZSBjb3VsZCBub3QgYmUgbG9hZGVkOiAnICsgZXJyXHJcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJ1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIHRoaXMuc3RhdHVzTXNnID0gJ1JlY29yZGluZyBmaWxlIGNvdWxkIG5vdCBiZSBkZWNvZGVkLiBBdWRpbyBjb250ZXh0IHVuYXZhaWxhYmxlLidcclxuICAgICAgICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJ1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZGlzcGxheUF1ZGlvQ2xpcCA9IG51bGw7XHJcbiAgICAgIHRoaXMuY29udHJvbEF1ZGlvUGxheWVyLmF1ZGlvQ2xpcCA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgZGlzcGxheVJlY0ZpbGUoKTogU3ByUmVjb3JkaW5nRmlsZSB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Rpc3BsYXlSZWNGaWxlO1xyXG4gIH1cclxuXHJcbiAgc2hvd1JlY29yZGluZygpIHtcclxuICAgIHRoaXMuY29udHJvbEF1ZGlvUGxheWVyLnN0b3AoKTtcclxuXHJcbiAgICBpZiAodGhpcy5kaXNwbGF5QXVkaW9DbGlwKSB7XHJcblxyXG4gICAgICB0aGlzLmxldmVsTWVhc3VyZS5jYWxjQnVmZmVyTGV2ZWxJbmZvcyh0aGlzLmRpc3BsYXlBdWRpb0NsaXAuYnVmZmVyLCBMRVZFTF9CQVJfSU5URVJWQUxMX1NFQ09ORFMpLnRoZW4oKGxldmVsSW5mb3MpID0+IHtcclxuICAgICAgICB0aGlzLmRpc3BsYXlMZXZlbEluZm9zID0gbGV2ZWxJbmZvcztcclxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMucGxheVN0YXJ0QWN0aW9uLmRpc2FibGVkID0gZmFsc2U7XHJcblxyXG4gICAgfSBlbHNlIHtcclxuXHJcbiAgICAgIC8vIFRPRE9cclxuICAgICAgLy8gU2V0dGluZyB0byBudWxsIGRvZXMgbm90IHRyaWdnZXIgYSBjaGFuZ2UgaWYgaXQgd2FzICBudWxsIGJlZm9yZSAoaGFwcGVucyBhZnRlciBuZXh0aXRlbSgpIGluIEFVVE9QUk9HUkVTUyBtb2RlKVxyXG4gICAgICAvLyBUaGUgbGV2ZWwgYmFyIGRpc3BsYXkgZG9lcyBub3QgY2xlYXIsIGl0IHNob3dzIHRoZSBsYXN0IGNhcHR1cmVkIHN0cmVhbVxyXG4gICAgICB0aGlzLmRpc3BsYXlMZXZlbEluZm9zID0gbnVsbDtcclxuXHJcbiAgICAgIHRoaXMucGxheVN0YXJ0QWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgIC8vIENvbGxhcHNlIGF1ZGlvIHNpZ25hbCBkaXNwbGF5IGlmIG9wZW5cclxuICAgICAgaWYgKCF0aGlzLmF1ZGlvU2lnbmFsQ29sbGFwc2VkKSB7XHJcbiAgICAgICAgdGhpcy5hdWRpb1NpZ25hbENvbGxhcHNlZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcblxyXG4gIGlzUmVjb3JkaW5nSXRlbSgpOmJvb2xlYW57XHJcbiAgICByZXR1cm4odGhpcy5wcm9tcHRJdGVtIT1udWxsICYmIHRoaXMucHJvbXB0SXRlbS50eXBlIT09J25vbnJlY29yZGluZycpXHJcbiAgfVxyXG5cclxuICB1cGRhdGVTdGFydEFjdGlvbkRpc2FibGVTdGF0ZSgpe1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0YXJ0QWN0aW9uLmRpc2FibGVkPSEodGhpcy5hYyAgJiYgdGhpcy5pc1JlY29yZGluZ0l0ZW0oKSk7XHJcbiAgfVxyXG5cclxuICBhcHBseUl0ZW0odGVtcG9yYXJ5PWZhbHNlKSB7XHJcblxyXG4gICAgdGhpcy5zZWN0aW9uID0gdGhpcy5fc2NyaXB0LnNlY3Rpb25zW3RoaXMuc2VjdElkeF1cclxuICAgIHRoaXMuZ3JvdXAgPSB0aGlzLnNlY3Rpb24uX3NodWZmbGVkR3JvdXBzW3RoaXMuZ3JvdXBJZHhJblNlY3Rpb25dO1xyXG4gICAgdGhpcy5wcm9tcHRJdGVtID0gdGhpcy5ncm91cC5fc2h1ZmZsZWRQcm9tcHRJdGVtc1t0aGlzLnByb21wdEl0ZW1JZHhJbkdyb3VwXTtcclxuXHJcbiAgICAvL3RoaXMuc2VsZWN0ZWRJdGVtSWR4ID0gdGhpcy5wcm9tcHRJbmRleDtcclxuXHJcbiAgICBpZih0aGlzLmF1ZGlvRmV0Y2hTdWJzY3JpcHRpb24pe1xyXG4gICAgICB0aGlzLmF1ZGlvRmV0Y2hTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2xlYXJQcm9tcHQoKTtcclxuXHJcbiAgICBsZXQgaXNOb25yZWNvcmRpbmc9KHRoaXMucHJvbXB0SXRlbS50eXBlPT09J25vbnJlY29yZGluZycpXHJcblxyXG4gICAgaWYgKGlzTm9ucmVjb3JkaW5nIHx8ICF0aGlzLnNlY3Rpb24ucHJvbXB0cGhhc2UgfHwgdGhpcy5zZWN0aW9uLnByb21wdHBoYXNlID09PSAnSURMRScpIHtcclxuICAgICAgdGhpcy5hcHBseVByb21wdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmKGlzTm9ucmVjb3JkaW5nKXtcclxuICAgICAgdGhpcy5zdGFydFN0b3BTaWduYWxTdGF0ZSA9IFN0YXJ0U3RvcFNpZ25hbFN0YXRlLk9GRjtcclxuICAgIH1lbHNlIHtcclxuICAgICAgaWYgKHRoaXMuaXRlbXMpIHtcclxuICAgICAgICBsZXQgaXQgPSB0aGlzLml0ZW1zW3RoaXMucHJvbXB0SW5kZXhdO1xyXG4gICAgICAgIGlmICghaXQucmVjcykge1xyXG4gICAgICAgICAgaXQucmVjcyA9IG5ldyBBcnJheTxTcHJSZWNvcmRpbmdGaWxlPigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHJlY2VudFJlY0ZpbGU6IFNwclJlY29yZGluZ0ZpbGUgfCBudWxsID0gbnVsbDtcclxuICAgICAgICBsZXQgYXZhaWxSZWNmaWxlczogbnVtYmVyID0gaXQucmVjcy5sZW5ndGg7XHJcbiAgICAgICAgaWYgKGF2YWlsUmVjZmlsZXMgPiAwKSB7XHJcbiAgICAgICAgICBsZXQgcmZWZXJzOiBudW1iZXIgPSBhdmFpbFJlY2ZpbGVzIC0gMTtcclxuICAgICAgICAgIHJlY2VudFJlY0ZpbGUgPSBpdC5yZWNzW3JmVmVyc107XHJcbiAgICAgICAgICB0aGlzLmRpc3BsYXlSZWNGaWxlID0gcmVjZW50UmVjRmlsZTtcclxuICAgICAgICAgIHRoaXMuZGlzcGxheVJlY0ZpbGVWZXJzaW9uID0gcmZWZXJzO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5kaXNwbGF5UmVjRmlsZSA9IG51bGw7XHJcbiAgICAgICAgICB0aGlzLmRpc3BsYXlSZWNGaWxlVmVyc2lvbiA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmICghdGVtcG9yYXJ5KSB7XHJcbiAgICAgICAgdGhpcy5zaG93UmVjb3JkaW5nKCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYoIXRoaXMucmVhZG9ubHkpIHtcclxuICAgICAgICB0aGlzLnN0YXJ0U3RvcFNpZ25hbFN0YXRlID0gU3RhcnRTdG9wU2lnbmFsU3RhdGUuSURMRTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy51cGRhdGVTdGFydEFjdGlvbkRpc2FibGVTdGF0ZSgpXHJcbiAgICB0aGlzLnVwZGF0ZU5hdmlnYXRpb25BY3Rpb25zKClcclxuICB9XHJcblxyXG5cclxuICBzdGFydCgpIHtcclxuICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2luZm8nO1xyXG4gICAgdGhpcy5zdGF0dXNNc2cgPSAnU3RhcnRpbmcgc2Vzc2lvbi4uLic7XHJcbiAgICB0aGlzLnN0YXR1c1dhaXRpbmc9ZmFsc2U7XHJcbiAgICBpZih0aGlzLl9zZXNzaW9uKSB7XHJcbiAgICAgIGlmICh0aGlzLl9zZXNzaW9uLnNlYWxlZCkge1xyXG4gICAgICAgIHRoaXMucmVhZG9ubHkgPSB0cnVlXHJcbiAgICAgICAgdGhpcy5zdGF0dXNNc2cgPSAnU2Vzc2lvbiBzZWFsZWQhJztcclxuICAgICAgICAvL2xldCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKFNlc3Npb25TZWFsZWREaWFsb2csIHt9KTtcclxuICAgICAgICB0aGlzLmRpYWxvZy5vcGVuKE1lc3NhZ2VEaWFsb2csIHtcclxuICAgICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgdHlwZTogJ2Vycm9yJyxcclxuICAgICAgICAgICAgdGl0bGU6ICdFcnJvcicsXHJcbiAgICAgICAgICAgIG1zZzogXCJUaGlzIHNlc3Npb24gaXMgc2VhbGVkLiBSZWNvcmRpbmdzIGNhbm5vdCBiZSBhZGRlZCBhbnltb3JlLlwiLFxyXG4gICAgICAgICAgICBhZHZpc2U6ICdQbGVhc2UgYXNrIHlvdXIgZXhwZXJpbWVudGVyIHdoYXQgdG8gZG8gKGUuZyBzdGFydCBhIG5ldyBzZXNzaW9uKS4nLFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBib2R5OiBhbnkgPSB7fTtcclxuICAgICAgICBpZiAodGhpcy5fc2Vzc2lvbi5zdGF0dXMgPT09IFwiQ1JFQVRFRFwiKSB7XHJcbiAgICAgICAgICB0aGlzLl9zZXNzaW9uLnN0YXR1cyA9IFwiTE9BREVEXCI7XHJcbiAgICAgICAgICBib2R5LnN0YXR1cyA9IHRoaXMuX3Nlc3Npb24uc3RhdHVzO1xyXG4gICAgICAgICAgaWYgKCF0aGlzLl9zZXNzaW9uLmxvYWRlZERhdGUpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2Vzc2lvbi5sb2FkZWREYXRlID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgYm9keS5sb2FkZWREYXRlID0gdGhpcy5fc2Vzc2lvbi5sb2FkZWREYXRlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLl9zZXNzaW9uLnJlc3RhcnRlZERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgYm9keS5yZXN0YXJ0ZWREYXRlID0gdGhpcy5fc2Vzc2lvbi5yZXN0YXJ0ZWREYXRlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNlc3Npb25TZXJ2aWNlLnBhdGNoU2Vzc2lvbk9ic2VydmVyKHRoaXMuX3Nlc3Npb24sIGJvZHkpLnN1YnNjcmliZSgpXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayBicm93c2VyIGNvbXBhdGliaWxpdHlcclxuICAgIGlmKHRoaXMudXNlckFnZW50LmRldGVjdGVkQnJvd3Nlcj09PUJyb3dzZXIuU2FmYXJpICYmIHRoaXMuX2NoYW5uZWxDb3VudD4xKXtcclxuICAgICAgbGV0IGVNc2c9XCJFcnJvcjogU2FmYXJpIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBzdGVyZW8gcmVjb3JkaW5ncy5cIjtcclxuICAgICAgY29uc29sZS5lcnJvcihlTXNnKTtcclxuICAgICAgdGhpcy5kaWFsb2cub3BlbihNZXNzYWdlRGlhbG9nLCB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgdHlwZTogJ2Vycm9yJyxcclxuICAgICAgICAgIHRpdGxlOiAnQnJvd3NlciBub3Qgc3VwcG9ydGVkJyxcclxuICAgICAgICAgIG1zZzogZU1zZyxcclxuICAgICAgICAgIGFkdmljZTogXCJQbGVhc2UgdXNlIGEgc3VwcG9ydGVkIGJyb3dzZXIsIGUuZy4gTW96aWxsYSBGaXJlZm94LlwiXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIC8vY29uc29sZS5sb2coXCJTZXNzaW9uIElEOiBcIit0aGlzLl9zZXNzaW9uLnNlc3Npb24rIFwiIHN0YXR1czogXCIrdGhpcy5fc2Vzc2lvbi5zdGF0dXMpXHJcbiAgICB0aGlzLl9zZWxlY3RlZERldmljZUlkPXVuZGVmaW5lZDtcclxuXHJcbiAgICBpZiAoIXRoaXMucmVhZG9ubHkgJiYgdGhpcy5hYyAmJiAoRk9SQ0VfUkVRVUVTVF9BVURJT19QRVJNSVNTSU9OUyB8fCAodGhpcy5fYXVkaW9EZXZpY2VzICYmIHRoaXMuX2F1ZGlvRGV2aWNlcy5sZW5ndGggPiAwKSkpIHtcclxuICAgICAgdGhpcy5zdGF0dXNNc2cgPSAnUmVxdWVzdGluZyBhdWRpbyBwZXJtaXNzaW9ucy4uLic7XHJcbiAgICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2luZm8nO1xyXG5cclxuICAgICAgdGhpcy5hYy5kZXZpY2VJbmZvcygobWRpcykgPT4ge1xyXG4gICAgICAgIGxldCBhdWRpb0NhcHR1cmVEZXZpY2VBdmFpbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBhdWRpb1BsYXlEZXZpY2VBdmFpbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgIGlmIChtZGlzKSB7XHJcbiAgICAgICAgICBpZih0aGlzLmFjKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWMucHJpbnREZXZpY2VzKG1kaXMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKG1kaXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBtZGlpID0gMDsgbWRpaSA8IG1kaXMubGVuZ3RoOyBtZGlpKyspIHtcclxuICAgICAgICAgICAgICBsZXQgbWRpID0gbWRpc1ttZGlpXTtcclxuICAgICAgICAgICAgICBsZXQga2luZD1tZGkua2luZDtcclxuICAgICAgICAgICAgICBpZihraW5kID09PSBcImF1ZGlvaW5wdXRcIil7XHJcbiAgICAgICAgICAgICAgICBhdWRpb0NhcHR1cmVEZXZpY2VBdmFpbD10cnVlO1xyXG4gICAgICAgICAgICAgIH1lbHNlIGlmKGtpbmQ9PT0gXCJhdWRpb291dHB1dFwiKXtcclxuICAgICAgICAgICAgICAgIGF1ZGlvUGxheURldmljZUF2YWlsPXRydWU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuX3Nlc3Npb24gJiYgdGhpcy5fc2Vzc2lvbi50eXBlICE9PSAnVEVTVF9ERUZfQScgJiYgdGhpcy5fYXVkaW9EZXZpY2VzICYmIHRoaXMuX2F1ZGlvRGV2aWNlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGxldCBmZGk6IE1lZGlhRGV2aWNlSW5mbyB8IG51bGwgPSBudWxsO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBhZEkgPSAwOyBhZEkgPCB0aGlzLl9hdWRpb0RldmljZXMubGVuZ3RoOyBhZEkrKykge1xyXG4gICAgICAgICAgICAgIGxldCBhZCA9IHRoaXMuX2F1ZGlvRGV2aWNlc1thZEldO1xyXG4gICAgICAgICAgICAgIGlmIChhZC5wbGF5YmFjaykge1xyXG4gICAgICAgICAgICAgICAgLy8gcHJvamVjdCBhdWRpbyBkZXZpY2UgY29uZmlnIGZvciBwbGF5YmFjayBkZXZpY2VcclxuICAgICAgICAgICAgICAgIC8vIG5vdCB1c2VkIGZvciBub3dcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBmb3IgKGxldCBtZGlpID0gMDsgbWRpaSA8IG1kaXMubGVuZ3RoOyBtZGlpKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCBtZGkgPSBtZGlzW21kaWldO1xyXG4gICAgICAgICAgICAgICAgbGV0IGtpbmQ9bWRpLmtpbmQ7XHJcbiAgICAgICAgICAgICAgICBpZihraW5kID09PSBcImF1ZGlvaW5wdXRcIil7XHJcbiAgICAgICAgICAgICAgICAgIGF1ZGlvQ2FwdHVyZURldmljZUF2YWlsPXRydWU7XHJcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZihraW5kPT09IFwiYXVkaW9vdXRwdXRcIil7XHJcbiAgICAgICAgICAgICAgICAgIGF1ZGlvUGxheURldmljZUF2YWlsPXRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoYWQucmVnZXgpIHtcclxuICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIk1hdGNoPzogXFwnXCIrbWRpLmxhYmVsK1wiXFwnIFxcJ1wiK2FkLm5hbWUrXCJcXCdcIik7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChtZGkubGFiZWwubWF0Y2goYWQubmFtZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBmZGkgPSBtZGk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIk1hdGNoIVwiKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKG1kaS5sYWJlbC50cmltKCkgPT09IGFkLm5hbWUudHJpbSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmRpID0gbWRpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZmRpKSB7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAoZmRpKSB7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChmZGkpIHtcclxuICAgICAgICAgICAgICAvLyBtYXRjaGluZyBkZXZpY2UgZm91bmRcclxuXHJcbiAgICAgICAgICAgICAgLy8gTm90IGFibGUgdG8gb3BlbiBkZXZpY2UgaGVyZSBzaW5jZSBDaHJvbWUgNzFcclxuICAgICAgICAgICAgICAvLyBDaHJvbWUgNzEgcmVxdWlyZXMgYSB1c2VyIGdlc3R1cmUgYmVmb3JlIHRoZSBBdWRpb0NvbnRleHQgY2FuIGJlIHJlc3VtZWRcclxuICAgICAgICAgICAgICAvLyBzZXNzaW9ubWFuYWdlci50czo3MTIgT3BlbiBzZXNzaW9uIHdpdGggZGVmYXVsdCBhdWRpbyBkZXZpY2UgZm9yIDEgY2hhbm5lbHNcclxuICAgICAgICAgICAgICAvLyBjYXB0dXJlLnRzOjEyOCBUaGUgQXVkaW9Db250ZXh0IHdhcyBub3QgYWxsb3dlZCB0byBzdGFydC4gSXQgbXVzdCBiZSByZXN1bWVkIChvciBjcmVhdGVkKSBhZnRlciBhIHVzZXIgZ2VzdHVyZSBvbiB0aGUgcGFnZS4gaHR0cHM6Ly9nb28uZ2wvN0s3V0x1XHJcbiAgICAgICAgICAgICAgLy8gcHVzaC4uL3Byb2plY3RzL3NwZWVjaHJlY29yZGVybmcvc3JjL2xpYi9hdWRpby9jYXB0dXJlL2NhcHR1cmUudHMuQXVkaW9DYXB0dXJlLm9wZW4gQCBjYXB0dXJlLnRzOjEyOFxyXG5cclxuICAgICAgICAgICAgICAvL3RoaXMuYWMub3Blbih0aGlzLl9jaGFubmVsQ291bnQsIGZkaS5kZXZpY2VJZCk7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5pbmZvKFwiU2V0IHNlbGVjdGVkIGF1ZGlvIGRldmljZTogXFwnXCIgKyBmZGkubGFiZWwgKyBcIlxcJyBJZDogXFwnXCIgKyBmZGkuZGV2aWNlSWQgKyBcIlxcJ1wiKTtcclxuICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZERldmljZUlkID0gZmRpLmRldmljZUlkO1xyXG5cclxuICAgICAgICAgICAgICB0aGlzLmVuYWJsZVN0YXJ0VXNlckdlc3R1cmUoKVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIC8vIGRldmljZSBub3QgZm91bmRcclxuICAgICAgICAgICAgICB0aGlzLnN0YXR1c01zZyA9ICdFUlJPUjogUmVxdWlyZWQgYXVkaW8gZGV2aWNlIG5vdCBhdmFpbGFibGUhJztcclxuICAgICAgICAgICAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZSA9ICdlcnJvcic7XHJcbiAgICAgICAgICAgICAgdGhpcy5yZWFkb25seSA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgIHRoaXMuZGlhbG9nLm9wZW4oTWVzc2FnZURpYWxvZywge1xyXG4gICAgICAgICAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxyXG4gICAgICAgICAgICAgICAgICB0aXRsZTogJ1JlcXVpcmVkIGF1ZGlvIGRldmljZScsXHJcbiAgICAgICAgICAgICAgICAgIG1zZzogXCJSZXF1aXJlZCBhdWRpbyBkZXZpY2Ugbm90IGZvdW5kXCIsXHJcbiAgICAgICAgICAgICAgICAgIGFkdmljZTogXCJQbGVhc2UgY29ubmVjdCBhIHN1aXRhYmxlIGF1ZGlvIGRldmljZSBmb3IgdGhpcyBwcm9qZWN0IGFuZCByZXRyeSAocHJlc3MgdGhlIGJyb3dzZXIgcmVsb2FkIGJ1dHRvbikuXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgaWYoIWF1ZGlvQ2FwdHVyZURldmljZUF2YWlsICYmICFhdWRpb1BsYXlEZXZpY2VBdmFpbCl7XHJcbiAgICAgICAgICAgICAgLy8gbm8gZGV2aWNlIGZvdW5kXHJcbiAgICAgICAgICAgICAgdGhpcy5zdGF0dXNNc2cgPSAnRVJST1I6IE5vIGF1ZGlvIGRldmljZSBhdmFpbGFibGUhJztcclxuICAgICAgICAgICAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZSA9ICd3YXJuJztcclxuICAgICAgICAgICAgICAvL3RoaXMucmVhZG9ubHkgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICB0aGlzLmRpYWxvZy5vcGVuKE1lc3NhZ2VEaWFsb2csIHtcclxuICAgICAgICAgICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgICAgICAgdHlwZTogJ3dhcm4nLFxyXG4gICAgICAgICAgICAgICAgICB0aXRsZTogJ05vIGF1ZGlvIGRldmljZScsXHJcbiAgICAgICAgICAgICAgICAgIG1zZzogXCJObyBhdWRpbyBkZXZpY2UgZm91bmRcIixcclxuICAgICAgICAgICAgICAgICAgYWR2aWNlOiBcIlBsZWFzZSBjb25uZWN0IGFuIGF1ZGlvIGRldmljZSBhbmQgcmV0cnkgKHByZXNzIHRoZSBicm93c2VyIHJlbG9hZCBidXR0b24pIG9yIHRyeSB0byBjb250aW51ZSBhbnl3YXkuXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9ZWxzZSB7XHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLnJlYWRvbmx5ICYmICFhdWRpb0NhcHR1cmVEZXZpY2VBdmFpbCkge1xyXG4gICAgICAgICAgICAgICAgLy8gbm8gZGV2aWNlIGZvdW5kXHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c01zZyA9ICdXQVJOSU5HOiBObyBhdWRpbyBjYXB0dXJlIGRldmljZSBhdmFpbGFibGUhJztcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ3dhcm5pbmcnO1xyXG4gICAgICAgICAgICAgICAgLy90aGlzLnJlYWRvbmx5ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmRpYWxvZy5vcGVuKE1lc3NhZ2VEaWFsb2csIHtcclxuICAgICAgICAgICAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJyxcclxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ05vIGF1ZGlvIGNhcHR1cmUgZGV2aWNlJyxcclxuICAgICAgICAgICAgICAgICAgICBtc2c6IFwiTm8gYXVkaW8gY2FwdHVyZSBkZXZpY2UgZm91bmRcIixcclxuICAgICAgICAgICAgICAgICAgICBhZHZpY2U6IFwiUGxlYXNlIGNvbm5lY3QgYW4gYXVkaW8gY2FwdHVyZSBkZXZpY2UgYW5kIHJldHJ5IChwcmVzcyB0aGUgYnJvd3NlciByZWxvYWQgYnV0dG9uKSBvciB0cnkgdG8gY29udGludWUgYW55d2F5LlwiXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIC8vIFNhZmFyaSBkb2VzIG5vdCBsaXN0IHBsYXliYWNrIGRldmljZXNcclxuICAgICAgICAgICAgICBpZiAoIWF1ZGlvUGxheURldmljZUF2YWlsKSB7XHJcbiAgICAgICAgICAgICAgICAgIC8vIEZpcmVmb3ggZG9lcyBub3QgZW51bWVyYXRlIGF1ZGlvb3V0cHV0IGRldmljZXNcclxuICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IHNob3cgdGhpcyB3YXJuaW5nLCBiZWNhdXNlIGl0IHdvdWxkIGFsd2F5cyBhcHBlYXIgb24gRmlyZWZveFxyXG4gICAgICAgICAgICAgICAgICAvLyBXaGVuIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTE0OTg1MTIgaXMgZml4ZWQgdGhlIHdhcm5pbmcgY2FuIGJlIGVuYWJsZWQgZm9yIEZpcmVmb3ggYXMgd2VsbFxyXG5cclxuICAgICAgICAgICAgICAgICAgLy8gSXQgaXMgYWxyZWFkeSBpbXBsZW1uZXRlZCBidXQga2VwdCBiZWhpbmQgYSBwcmVmZXJlbmNlIHNldHRpbmcgaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTE1MjQwMVxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgIC8vIE91dHB1dCBkZXZpY2VzIGFyZSBsaXN0ZWQgaWYgYWJvdXQ6Y29uZmlnIG1lZGlhLnNldHNpbmtpZC5lbmFibGVkPXRydWVcclxuICAgICAgICAgICAgICAgICAgLy8gYnV0IGRlZmF1bHQgc2V0dGluZyBpcyBmYWxzZVxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgIC8vIFNhbWUgcHJvYmxlbSB3aXRoIFNhZmFyaVxyXG5cclxuICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy51c2VyQWdlbnQuZGV0ZWN0ZWRCcm93c2VyPT09QnJvd3Nlci5TYWZhcmkgfHwgdGhpcy51c2VyQWdlbnQuZGV0ZWN0ZWRCcm93c2VyPT09QnJvd3Nlci5GaXJlZm94KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbm8gZGV2aWNlIGZvdW5kXHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c01zZyA9ICdXQVJOSU5HOiBObyBhdWRpbyBwbGF5YmFjayBkZXZpY2UgYXZhaWxhYmxlISc7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZSA9ICd3YXJuJztcclxuICAgICAgICAgICAgICAgICAgICAgIC8vdGhpcy5yZWFkb25seSA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaWFsb2cub3BlbihNZXNzYWdlRGlhbG9nLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnd2FybicsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnTm8gYXVkaW8gcGxheWJhY2sgZGV2aWNlJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnOiBcIk5vIGF1ZGlvIHBsYXliYWNrIGRldmljZSBmb3VuZFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHZpY2U6IFwiUGxlYXNlIGNvbm5lY3QgYW4gYXVkaW8gcGxheWJhY2sgZGV2aWNlIGFuZCByZXRyeSAocHJlc3MgdGhlIGJyb3dzZXIgcmVsb2FkIGJ1dHRvbikgb3IgdHJ5IHRvIGNvbnRpbnVlIGFueXdheS5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgLy8gTm90IGFibGUgdG8gb3BlbiBkZXZpY2UgaGVyZSBzaW5jZSBDaHJvbWUgNzFcclxuICAgICAgICAgICAgICAvLyBDaHJvbWUgNzEgcmVxdWlyZXMgYSB1c2VyIGdlc3R1cmUgYmVmb3JlIHRoZSBBdWRpb0NvbnRleHQgY2FuIGJlIHJlc3VtZWRcclxuICAgICAgICAgICAgICAvLyBzZXNzaW9ubWFuYWdlci50czo3MTIgT3BlbiBzZXNzaW9uIHdpdGggZGVmYXVsdCBhdWRpbyBkZXZpY2UgZm9yIDEgY2hhbm5lbHNcclxuICAgICAgICAgICAgICAvLyBjYXB0dXJlLnRzOjEyOCBUaGUgQXVkaW9Db250ZXh0IHdhcyBub3QgYWxsb3dlZCB0byBzdGFydC4gSXQgbXVzdCBiZSByZXN1bWVkIChvciBjcmVhdGVkKSBhZnRlciBhIHVzZXIgZ2VzdHVyZSBvbiB0aGUgcGFnZS4gaHR0cHM6Ly9nb28uZ2wvN0s3V0x1XHJcbiAgICAgICAgICAgICAgLy8gcHVzaC4uL3Byb2plY3RzL3NwZWVjaHJlY29yZGVybmcvc3JjL2xpYi9hdWRpby9jYXB0dXJlL2NhcHR1cmUudHMuQXVkaW9DYXB0dXJlLm9wZW4gQCBjYXB0dXJlLnRzOjEyOFxyXG4gICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJPcGVuIHNlc3Npb24gd2l0aCBkZWZhdWx0IGF1ZGlvIGRldmljZSBmb3IgXCIrdGhpcy5fY2hhbm5lbENvdW50K1wiIGNoYW5uZWxzXCIpO1xyXG4gICAgICAgICAgICAgIC8vdGhpcy5hYy5vcGVuKHRoaXMuX2NoYW5uZWxDb3VudCk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIGVuYWJsZSBzdGFydCBnZXN0dXJlIGFueXdheVxyXG4gICAgICAgICAgICAgIHRoaXMuZW5hYmxlU3RhcnRVc2VyR2VzdHVyZSgpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBpZih0aGlzLnByb21wdEl0ZW1Db3VudD4wKSB7XHJcbiAgICAgIHRoaXMucHJvbXB0SW5kZXggPSAwO1xyXG4gICAgfVxyXG4gICAgdGhpcy5lbmFibGVOYXZpZ2F0aW9uKClcclxuICB9XHJcblxyXG4gIGlzUmVjb3JkaW5nKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICh0aGlzLnN0YXR1cyA9PT0gU3RhdHVzLlBSRV9SRUNPUkRJTkcgfHwgdGhpcy5zdGF0dXMgPT09IFN0YXR1cy5SRUNPUkRJTkcpO1xyXG4gIH1cclxuXHJcbiAgaXNBY3RpdmUoKTogYm9vbGVhbntcclxuICAgIHJldHVybiAoISh0aGlzLnN0YXR1cyA9PT0gU3RhdHVzLkJMT0NLRUQgfHwgdGhpcy5zdGF0dXM9PT0gU3RhdHVzLklETEUgfHwgdGhpcy5zdGF0dXM9PT1TdGF0dXMuRVJST1IpIHx8IHRoaXMucHJvY2Vzc2luZ1JlY29yZGluZyB8fCB0aGlzLnNlc3Npb25TZXJ2aWNlLnVwbG9hZENvdW50PjApXHJcbiAgfVxyXG5cclxuICAgIHByZXZJdGVtKCkge1xyXG4gICAgICAgbGV0IG5ld1BySWR4PXRoaXMuX3Byb21wdEluZGV4O1xyXG4gICAgICAgbmV3UHJJZHgtLTtcclxuICAgICAgIGlmKG5ld1BySWR4PDApe1xyXG4gICAgICAgICBuZXdQcklkeD10aGlzLnByb21wdEl0ZW1Db3VudC0xO1xyXG4gICAgICAgfVxyXG4gICAgICAgdGhpcy5wcm9tcHRJbmRleD1uZXdQcklkeDtcclxuICAgICAgLy90aGlzLnVwZGF0ZU5hdmlnYXRpb25BY3Rpb25zKClcclxuICAgIH1cclxuXHJcblxyXG4gIG5leHRJdGVtKCkge1xyXG4gICAgbGV0IG5ld1BySWR4PXRoaXMuX3Byb21wdEluZGV4O1xyXG4gICAgbmV3UHJJZHgrKztcclxuICAgIGlmKG5ld1BySWR4Pj10aGlzLnByb21wdEl0ZW1Db3VudCl7XHJcbiAgICAgIG5ld1BySWR4PTA7XHJcbiAgICB9XHJcbiAgICB0aGlzLnByb21wdEluZGV4PW5ld1BySWR4O1xyXG4gICAgLy90aGlzLnVwZGF0ZU5hdmlnYXRpb25BY3Rpb25zKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZU5hdmlnYXRpb25BY3Rpb25zKCl7XHJcbiAgICBsZXQgZndkTnh0QWN0aW9uRGlzYWJsZWQ9dHJ1ZTtcclxuICAgIGlmKHRoaXMuaXRlbXMpe1xyXG4gICAgICBsZXQgY3VyclJlY3M9dGhpcy5pdGVtc1t0aGlzLl9wcm9tcHRJbmRleF0ucmVjcztcclxuICAgICAgZndkTnh0QWN0aW9uRGlzYWJsZWQ9ICEgKGN1cnJSZWNzIT1udWxsICYmIGN1cnJSZWNzLmxlbmd0aD4wKTtcclxuICAgIH1cclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5md2ROZXh0QWN0aW9uLmRpc2FibGVkID0gdGhpcy5uYXZpZ2F0aW9uRGlzYWJsZWQgfHwgZndkTnh0QWN0aW9uRGlzYWJsZWQ7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuZndkQWN0aW9uLmRpc2FibGVkID0gdGhpcy5uYXZpZ2F0aW9uRGlzYWJsZWQ7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuYndkQWN0aW9uLmRpc2FibGVkID0gdGhpcy5uYXZpZ2F0aW9uRGlzYWJsZWQ7XHJcbiAgfVxyXG5cclxuICBuZXh0VW5yZWNvcmRlZEl0ZW0oKSB7XHJcbiAgICBsZXQgbmV3UHJJZHggPSB0aGlzLl9wcm9tcHRJbmRleDtcclxuICAgIG5ld1BySWR4Kys7XHJcbiAgICBpZiAobmV3UHJJZHggPj0gdGhpcy5wcm9tcHRJdGVtQ291bnQpIHtcclxuICAgICAgbmV3UHJJZHggPSAwO1xyXG4gICAgfVxyXG4gICAgaWYodGhpcy5pdGVtcyE9bnVsbCkge1xyXG4gICAgICBsZXQgaXRSZWNzPXRoaXMuaXRlbXNbbmV3UHJJZHhdLnJlY3M7XHJcbiAgICAgIHdoaWxlIChpdFJlY3MhPW51bGwgJiYgKGl0UmVjcy5sZW5ndGggPiAwKSAmJiBuZXdQcklkeCA8IHRoaXMucHJvbXB0SXRlbUNvdW50KSB7XHJcbiAgICAgICAgbmV3UHJJZHgrKztcclxuICAgICAgICBpdFJlY3M9dGhpcy5pdGVtc1tuZXdQcklkeF0ucmVjcztcclxuICAgICAgfVxyXG4gICAgICBpZiAoIWl0UmVjcyB8fCBpdFJlY3MubGVuZ3RoID09IDApIHtcclxuICAgICAgICB0aGlzLnByb21wdEluZGV4ID0gbmV3UHJJZHg7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGVuYWJsZVN0YXJ0VXNlckdlc3R1cmUoKSB7XHJcbiAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZSA9ICdpbmZvJztcclxuICAgIHRoaXMuc3RhdHVzTXNnID0gJ1JlYWR5Lic7XHJcbiAgICAvL3RoaXMudXBkYXRlU3RhcnRBY3Rpb25EaXNhYmxlU3RhdGUoKVxyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0YXJ0QWN0aW9uLmRpc2FibGVkPSEodGhpcy5hYyAmJiB0aGlzLmlzUmVjb3JkaW5nSXRlbSgpKTtcclxuXHJcbiAgfVxyXG5cclxuICBlbmFibGVOYXZpZ2F0aW9uKCl7XHJcbiAgICB0aGlzLm5hdmlnYXRpb25EaXNhYmxlZD1mYWxzZTtcclxuICAgIHRoaXMudXBkYXRlTmF2aWdhdGlvbkFjdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIG9wZW5lZCgpIHtcclxuICAgIC8vIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2luZm8nO1xyXG4gICAgLy8gdGhpcy5zdGF0dXNNc2cgPSAnUmVhZHkuJztcclxuICAgIC8vIHRoaXMudXBkYXRlU3RhcnRBY3Rpb25EaXNhYmxlU3RhdGUoKVxyXG4gICAgLy8gdGhpcy50cmFuc3BvcnRBY3Rpb25zLmZ3ZEFjdGlvbi5kaXNhYmxlZCA9IGZhbHNlXHJcbiAgICAvLyB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuYndkQWN0aW9uLmRpc2FibGVkID0gZmFsc2VcclxuICAgIGlmKHRoaXMuYWMpIHtcclxuICAgICAgdGhpcy5hYy5zdGFydCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhcnRlZCgpIHtcclxuICAgIHRoaXMuc3RhdHVzID0gU3RhdHVzLlBSRV9SRUNPUkRJTkc7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RhcnRBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5zdGFydFN0b3BTaWduYWxTdGF0ZSA9IFN0YXJ0U3RvcFNpZ25hbFN0YXRlLlBSRVJFQ09SRElORztcclxuICAgIGlmKHRoaXMuX3Nlc3Npb24pIHtcclxuICAgICAgaWYgKHRoaXMuX3Nlc3Npb24uc3RhdHVzID09PSBcIkxPQURFRFwiKSB7XHJcbiAgICAgICAgbGV0IGJvZHk6IGFueSA9IHt9O1xyXG4gICAgICAgIGlmICh0aGlzLnNlY3Rpb24udHJhaW5pbmcpIHtcclxuICAgICAgICAgIHRoaXMuX3Nlc3Npb24uc3RhdHVzID0gXCJTVEFSVEVEX1RSQUlOSU5HXCJcclxuICAgICAgICAgIGJvZHkuc3RhdHVzID0gdGhpcy5fc2Vzc2lvbi5zdGF0dXM7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuX3Nlc3Npb24uc3RhcnRlZFRyYWluaW5nRGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9zZXNzaW9uLnN0YXJ0ZWRUcmFpbmluZ0RhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICBib2R5LnN0YXJ0ZWRUcmFpbmluZ0RhdGUgPSB0aGlzLl9zZXNzaW9uLnN0YXJ0ZWRUcmFpbmluZ0RhdGU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuX3Nlc3Npb24uc3RhdHVzID0gXCJTVEFSVEVEXCJcclxuICAgICAgICAgIGJvZHkuc3RhdHVzID0gdGhpcy5fc2Vzc2lvbi5zdGF0dXM7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuX3Nlc3Npb24uc3RhcnRlZERhdGUpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2Vzc2lvbi5zdGFydGVkRGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgIGJvZHkuc3RhcnRlZERhdGUgPSB0aGlzLl9zZXNzaW9uLnN0YXJ0ZWREYXRlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNlc3Npb25TZXJ2aWNlLnBhdGNoU2Vzc2lvbk9ic2VydmVyKHRoaXMuX3Nlc3Npb24sIGJvZHkpLnN1YnNjcmliZSgpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNlY3Rpb24ucHJvbXB0cGhhc2UgPT09ICdQUkVSRUNPUkRJTkcnKSB7XHJcbiAgICAgIHRoaXMuYXBwbHlQcm9tcHQoKTtcclxuICAgIH1cclxuICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2luZm8nO1xyXG4gICAgdGhpcy5zdGF0dXNNc2cgPSAnUmVjb3JkaW5nLi4uJztcclxuXHJcbiAgICBsZXQgcHJlRGVsYXkgPSBERUZBVUxUX1BSRV9SRUNfREVMQVk7XHJcbiAgICBpZiAodGhpcy5wcm9tcHRJdGVtLnByZXJlY29yZGluZykge1xyXG4gICAgICBwcmVEZWxheSA9IHRoaXMucHJvbXB0SXRlbS5wcmVyZWNvcmRpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHBvc3REZWxheT1ERUZBVUxUX1BPU1RfUkVDX0RFTEFZO1xyXG4gICAgaWYodGhpcy5wcm9tcHRJdGVtLnBvc3RyZWNvcmRpbmcpe1xyXG4gICAgICBwb3N0RGVsYXk9dGhpcy5wcm9tcHRJdGVtLnBvc3RyZWNvcmRpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG1heFJlY29yZGluZ1RpbWVNcyA9IE1BWF9SRUNPUkRJTkdfVElNRV9NUztcclxuICAgIGlmICh0aGlzLnByb21wdEl0ZW0ucmVjZHVyYXRpb24pIHtcclxuICAgICAgbWF4UmVjb3JkaW5nVGltZU1zID0gcHJlRGVsYXkrdGhpcy5wcm9tcHRJdGVtLnJlY2R1cmF0aW9uK3Bvc3REZWxheTtcclxuICAgIH1cclxuICAgIHRoaXMubWF4UmVjVGltZXJJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5zdG9wUmVjb3JkaW5nTWF4UmVjKClcclxuICAgIH0sIG1heFJlY29yZGluZ1RpbWVNcyk7XHJcbiAgICB0aGlzLm1heFJlY1RpbWVyUnVubmluZyA9IHRydWU7XHJcblxyXG5cclxuXHJcbiAgICB0aGlzLnByZVJlY1RpbWVySWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcblxyXG4gICAgICB0aGlzLnByZVJlY1RpbWVyUnVubmluZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnN0YXR1cyA9IFN0YXR1cy5SRUNPUkRJTkc7XHJcbiAgICAgIHRoaXMuc3RhcnRTdG9wU2lnbmFsU3RhdGUgPSBTdGFydFN0b3BTaWduYWxTdGF0ZS5SRUNPUkRJTkc7XHJcbiAgICAgIGlmICh0aGlzLnNlY3Rpb24ubW9kZSA9PT0gJ0FVVE9SRUNPUkRJTkcnKSB7XHJcbiAgICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLm5leHRBY3Rpb24uZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMucGF1c2VBY3Rpb24uZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RvcEFjdGlvbi5kaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLnNlY3Rpb24ucHJvbXB0cGhhc2UgPT09ICdSRUNPUkRJTkcnKSB7XHJcbiAgICAgICAgdGhpcy5hcHBseVByb21wdCgpO1xyXG4gICAgICB9XHJcbiAgICB9LCBwcmVEZWxheSk7XHJcbiAgICB0aGlzLnByZVJlY1RpbWVyUnVubmluZyA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBzdG9wSXRlbSgpIHtcclxuICAgIHRoaXMuc3RhdHVzID0gU3RhdHVzLlBPU1RfUkVDX1NUT1A7XHJcbiAgICB0aGlzLnN0YXJ0U3RvcFNpZ25hbFN0YXRlID0gU3RhcnRTdG9wU2lnbmFsU3RhdGUuUE9TVFJFQ09SRElORztcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdG9wQWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5uZXh0QWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIGxldCBwb3N0RGVsYXkgPSA1MDA7XHJcbiAgICBpZiAodGhpcy5wcm9tcHRJdGVtLnBvc3RyZWNvcmRpbmcpIHtcclxuICAgICAgcG9zdERlbGF5ID0gdGhpcy5wcm9tcHRJdGVtLnBvc3RyZWNvcmRpbmc7XHJcbiAgICB9XHJcbiAgICB0aGlzLnBvc3RSZWNUaW1lcklkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnBvc3RSZWNUaW1lclJ1bm5pbmcgPSBmYWxzZTtcclxuICAgICAgdGhpcy5zdGF0dXMgPSBTdGF0dXMuU1RPUFBJTkdfU1RPUDtcclxuICAgICAgdGhpcy5zdG9wUmVjb3JkaW5nKCk7XHJcbiAgICB9LCBwb3N0RGVsYXkpO1xyXG4gICAgdGhpcy5wb3N0UmVjVGltZXJSdW5uaW5nID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHBhdXNlSXRlbSgpIHtcclxuICAgIHRoaXMuc3RhdHVzID0gU3RhdHVzLlBPU1RfUkVDX1BBVVNFO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnBhdXNlQWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMuc3RhcnRTdG9wU2lnbmFsU3RhdGUgPSBTdGFydFN0b3BTaWduYWxTdGF0ZS5QT1NUUkVDT1JESU5HO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0b3BBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLm5leHRBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnBhdXNlQWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIGxldCBwb3N0RGVsYXkgPSA1MDA7XHJcbiAgICBpZiAodGhpcy5wcm9tcHRJdGVtLnBvc3RyZWNvcmRpbmcpIHtcclxuICAgICAgcG9zdERlbGF5ID0gdGhpcy5wcm9tcHRJdGVtLnBvc3RyZWNvcmRpbmc7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHRoaXMucG9zdFJlY1RpbWVySWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMucG9zdFJlY1RpbWVyUnVubmluZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnN0YXR1cyA9IFN0YXR1cy5TVE9QUElOR19QQVVTRTtcclxuICAgICAgdGhpcy5zdG9wUmVjb3JkaW5nKCk7XHJcbiAgICB9LCBwb3N0RGVsYXkpO1xyXG4gICAgdGhpcy5wb3N0UmVjVGltZXJSdW5uaW5nID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHN0b3BSZWNvcmRpbmcoKSB7XHJcbiAgICBpZiAodGhpcy5tYXhSZWNUaW1lclJ1bm5pbmcpIHtcclxuICAgICAgaWYodGhpcy5tYXhSZWNUaW1lcklkKSB7XHJcbiAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLm1heFJlY1RpbWVySWQpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMubWF4UmVjVGltZXJSdW5uaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZih0aGlzLmFjKSB7XHJcbiAgICAgIHRoaXMuYWMuc3RvcCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RvcFJlY29yZGluZ01heFJlYygpe1xyXG4gICAgaWYodGhpcy5wb3N0UmVjVGltZXJSdW5uaW5nKXtcclxuICAgICAgaWYodGhpcy5wb3N0UmVjVGltZXJJZCkge1xyXG4gICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5wb3N0UmVjVGltZXJJZCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5wb3N0UmVjVGltZXJSdW5uaW5nPWZhbHNlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5tYXhSZWNUaW1lclJ1bm5pbmcgPSBmYWxzZTtcclxuICAgIHRoaXMuc3RhdHVzID0gU3RhdHVzLlNUT1BQSU5HX1NUT1A7XHJcbiAgICBpZih0aGlzLmFjKSB7XHJcbiAgICAgIHRoaXMuYWMuc3RvcCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkUmVjb3JkaW5nRmlsZUJ5RGVzY3JpcHRvcihyZmQ6UmVjb3JkaW5nRmlsZURlc2NyaXB0b3JJbXBsKXtcclxuICAgIGlmKHJmZC5yZWNvcmRpbmcgJiYgcmZkLnJlY29yZGluZy5pdGVtY29kZSkge1xyXG4gICAgICBsZXQgcHJJZHggPSB0aGlzLnByb21wdEluZGV4QnlJdGVtY29kZShyZmQucmVjb3JkaW5nLml0ZW1jb2RlKTtcclxuICAgICAgaWYgKHRoaXMuaXRlbXMhPW51bGwgJiYgcHJJZHggIT09IG51bGwpIHtcclxuICAgICAgICBsZXQgaXQgPSB0aGlzLml0ZW1zW3BySWR4XTtcclxuICAgICAgICBpZiAoaXQgJiYgdGhpcy5fc2Vzc2lvbikge1xyXG4gICAgICAgICAgaWYgKCFpdC5yZWNzKSB7XHJcbiAgICAgICAgICAgIGl0LnJlY3MgPSBuZXcgQXJyYXk8U3ByUmVjb3JkaW5nRmlsZT4oKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGxldCByZiA9IG5ldyBTcHJSZWNvcmRpbmdGaWxlKHRoaXMuX3Nlc3Npb24uc2Vzc2lvbklkLCByZmQucmVjb3JkaW5nLml0ZW1jb2RlLCByZmQudmVyc2lvbiwgbnVsbCk7XHJcbiAgICAgICAgICBpdC5yZWNzW3JmZC52ZXJzaW9uXSA9IHJmO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiV0FSTjogTm8gcmVjb3JkaW5nIGl0ZW0gd2l0aCBjb2RlOiBcXFwiXCIgK3JmZC5yZWNvcmRpbmcuaXRlbWNvZGUrIFwiXFxcIiBmb3VuZC5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIldBUk46IE5vIHJlY29yZGluZyBpdGVtIHdpdGggY29kZTogXFxcIlwiICtyZmQucmVjb3JkaW5nLml0ZW1jb2RlKyBcIlxcXCIgZm91bmQuXCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRSZWNvcmRpbmdGaWxlQnlQcm9tcHRJbmRleChwcm9tcHRJbmRleDpudW1iZXIsIHJmOlNwclJlY29yZGluZ0ZpbGUpe1xyXG5cclxuICB9XHJcblxyXG5cclxuICBzdG9wcGVkKCkge1xyXG4gICAgdGhpcy51cGRhdGVTdGFydEFjdGlvbkRpc2FibGVTdGF0ZSgpXHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RvcEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMubmV4dEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMucGF1c2VBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5zdGF0dXNBbGVydFR5cGUgPSAnaW5mbyc7XHJcbiAgICB0aGlzLnN0YXR1c01zZyA9ICdSZWNvcmRlZC4nO1xyXG4gICAgdGhpcy5zdGFydFN0b3BTaWduYWxTdGF0ZSA9IFN0YXJ0U3RvcFNpZ25hbFN0YXRlLklETEU7XHJcblxyXG4gICAgbGV0IGFkID0gbnVsbDtcclxuICAgIGlmKHRoaXMuYWMhPW51bGwpe1xyXG4gICAgICBhZD10aGlzLmFjLmF1ZGlvQnVmZmVyKCk7XHJcbiAgICB9XHJcbiAgICBsZXQgaWMgPSB0aGlzLnByb21wdEl0ZW0uaXRlbWNvZGU7XHJcbiAgICBsZXQgcmY9bnVsbDtcclxuICAgIGlmICh0aGlzLl9zZXNzaW9uICYmIGljKSB7XHJcbiAgICAgIGxldCBzZXNzSWQ6IHN0cmluZyB8IG51bWJlciA9IHRoaXMuX3Nlc3Npb24uc2Vzc2lvbklkO1xyXG4gICAgICBsZXQgY3BJZHggPSB0aGlzLnByb21wdEluZGV4O1xyXG4gICAgICBpZiAodGhpcy5pdGVtcykge1xyXG4gICAgICAgIGxldCBpdD10aGlzLml0ZW1zW2NwSWR4XTtcclxuICAgICAgICBpZiAoIWl0LnJlY3MpIHtcclxuICAgICAgICAgIGl0LnJlY3MgPSBuZXcgQXJyYXk8U3ByUmVjb3JkaW5nRmlsZT4oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmYgPSBuZXcgU3ByUmVjb3JkaW5nRmlsZShzZXNzSWQsIGljLCBpdC5yZWNzLmxlbmd0aCwgYWQpO1xyXG4gICAgICAgIGl0LnJlY3MucHVzaChyZik7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuZW5hYmxlVXBsb2FkUmVjb3JkaW5ncykge1xyXG4gICAgICAgIC8vIFRPRE8gdXNlIFNwZWVjaFJlY29yZGVyY29uZmlnIHJlc3AuIFJlY2ZpbGVTZXJ2aWNlXHJcbiAgICAgICAgLy8gY29udmVydCBhc3luY2hyb25vdXNseSB0byAxNi1iaXQgaW50ZWdlciBQQ01cclxuICAgICAgICAvLyBUT0RPIGNvdWxkIHdlIGF2b2lkIGNvbnZlcnNpb24gdG8gc2F2ZSBDUFUgcmVzb3VyY2VzIGFuZCB0cmFuc2ZlciBmbG9hdCBQQ00gZGlyZWN0bHk/XHJcbiAgICAgICAgLy8gVE9ETyBkdXBsaWNhdGUgY29udmVyc2lvbiBmb3IgbWFudWFsIGRvd25sb2FkXHJcbiAgICAgICAgLy9jb25zb2xlLmxvZyhcIkJ1aWxkIHdhdiB3cml0ZXIuLi5cIik7XHJcbiAgICAgICAgdGhpcy5wcm9jZXNzaW5nUmVjb3JkaW5nPXRydWVcclxuICAgICAgICBpZihhZCAmJiByZikge1xyXG4gICAgICAgICAgbGV0IHd3ID0gbmV3IFdhdldyaXRlcigpO1xyXG4gICAgICAgICAgLy9uZXcgUkVTVCBBUEkgVVJMXHJcbiAgICAgICAgICBsZXQgYXBpRW5kUG9pbnQgPSAnJztcclxuICAgICAgICAgIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5hcGlFbmRQb2ludCkge1xyXG4gICAgICAgICAgICBhcGlFbmRQb2ludCA9IHRoaXMuY29uZmlnLmFwaUVuZFBvaW50O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGFwaUVuZFBvaW50ICE9PSAnJykge1xyXG4gICAgICAgICAgICBhcGlFbmRQb2ludCA9IGFwaUVuZFBvaW50ICsgJy8nXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBsZXQgc2Vzc2lvbnNVcmwgPSBhcGlFbmRQb2ludCArIFNlc3Npb25TZXJ2aWNlLlNFU1NJT05fQVBJX0NUWDtcclxuICAgICAgICAgIGxldCByZWNVcmw6IHN0cmluZyA9IHNlc3Npb25zVXJsICsgJy8nICsgcmYuc2Vzc2lvbiArICcvJyArIFJFQ0ZJTEVfQVBJX0NUWCArICcvJyArIHJmLml0ZW1Db2RlO1xyXG4gICAgICAgICAgd3cud3JpdGVBc3luYyhhZCwgKHdhdkZpbGUpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5wb3N0UmVjb3JkaW5nKHdhdkZpbGUsIHJlY1VybCk7XHJcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc2luZ1JlY29yZGluZyA9IGZhbHNlXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBjaGVjayBjb21wbGV0ZSBzZXNzaW9uXHJcbiAgICBsZXQgY29tcGxldGUgPSB0cnVlO1xyXG4gICAgaWYodGhpcy5pdGVtcykge1xyXG4gICAgICAvLyBzZWFyY2ggYmFja3dhcmRzLCB0byBnYWluIGZhc3RlciBkZXRlY3Rpb24gb2YgaW5jb21wbGV0ZSBzdGF0ZVxyXG4gICAgICBmb3IgKGxldCByaSA9IHRoaXMuaXRlbXMubGVuZ3RoIC0gMTsgcmkgPj0gMDsgcmktLSkge1xyXG4gICAgICAgIGxldCBpdCA9IHRoaXMuaXRlbXNbcmldO1xyXG4gICAgICAgIGlmIChpdC5yZWNvcmRpbmcgJiYgIWl0LnRyYWluaW5nICYmICghaXQucmVjcyB8fCBpdC5yZWNzLmxlbmd0aCA9PSAwKSkge1xyXG4gICAgICAgICAgY29tcGxldGUgPSBmYWxzZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBhdXRvU3RhcnQgPSAodGhpcy5zdGF0dXMgPT09IFN0YXR1cy5TVE9QUElOR19TVE9QKTtcclxuICAgIHRoaXMuc3RhdHVzID0gU3RhdHVzLklETEU7XHJcbiAgICBsZXQgc3RhcnROZXh0PWZhbHNlO1xyXG4gICAgaWYgKGNvbXBsZXRlKSB7XHJcbiAgICAgIGlmKHRoaXMuX3Nlc3Npb24hPW51bGwpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX3Nlc3Npb24uc2VhbGVkICYmIHRoaXMuX3Nlc3Npb24uc3RhdHVzICE9PSBcIkNPTVBMRVRFRFwiKSB7XHJcbiAgICAgICAgICBsZXQgYm9keTogYW55ID0ge31cclxuICAgICAgICAgIHRoaXMuX3Nlc3Npb24uc3RhdHVzID0gXCJDT01QTEVURURcIjtcclxuICAgICAgICAgIGJvZHkuc3RhdHVzID0gdGhpcy5fc2Vzc2lvbi5zdGF0dXM7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuX3Nlc3Npb24uY29tcGxldGVkRGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9zZXNzaW9uLmNvbXBsZXRlZERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICBib2R5LmNvbXBsZXRlZERhdGUgPSB0aGlzLl9zZXNzaW9uLmNvbXBsZXRlZERhdGU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnNlc3Npb25TZXJ2aWNlLnBhdGNoU2Vzc2lvbk9ic2VydmVyKHRoaXMuX3Nlc3Npb24sIGJvZHkpLnN1YnNjcmliZSgpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc3RhdHVzTXNnID0gJ1Nlc3Npb24gY29tcGxldGUhJztcclxuICAgICAgbGV0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oU2Vzc2lvbkZpbmlzaGVkRGlhbG9nLCB7fSk7XHJcblxyXG4gICAgICAvLyBlbmFibGUgbmF2aWdhdGlvblxyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuZndkQWN0aW9uLmRpc2FibGVkID0gZmFsc2VcclxuICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLmJ3ZEFjdGlvbi5kaXNhYmxlZCA9IGZhbHNlXHJcbiAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgaWYgKHRoaXMuc2VjdGlvbi5tb2RlID09PSAnQVVUT1BST0dSRVNTJyB8fCB0aGlzLnNlY3Rpb24ubW9kZSA9PT0gJ0FVVE9SRUNPUkRJTkcnKSB7XHJcbiAgICAgICAgdGhpcy5uZXh0SXRlbSgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5zZWN0aW9uLm1vZGUgPT09ICdBVVRPUkVDT1JESU5HJyAmJiB0aGlzLmF1dG9yZWNvcmRpbmcgJiYgYXV0b1N0YXJ0KSB7XHJcbiAgICAgICAgc3RhcnROZXh0PXRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uRGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZU5hdmlnYXRpb25BY3Rpb25zKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGFwcGx5IHJlY29yZGVkIGl0ZW1cclxuICAgIHRoaXMuYXBwbHlJdGVtKHN0YXJ0TmV4dCk7XHJcbiAgICBpZihzdGFydE5leHQpe1xyXG4gICAgICB0aGlzLnN0YXJ0SXRlbSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBwb3N0UmVjb3JkaW5nKHdhdkZpbGU6IFVpbnQ4QXJyYXksIHJlY1VybDogc3RyaW5nKSB7XHJcbiAgICBsZXQgd2F2QmxvYiA9IG5ldyBCbG9iKFt3YXZGaWxlXSwge3R5cGU6ICdhdWRpby93YXYnfSk7XHJcbiAgICBsZXQgdWwgPSBuZXcgVXBsb2FkKHdhdkJsb2IsIHJlY1VybCk7XHJcbiAgICB0aGlzLnVwbG9hZGVyLnF1ZXVlVXBsb2FkKHVsKTtcclxuICB9XHJcblxyXG4gIHN0b3AoKSB7XHJcbiAgICBpZih0aGlzLmFjIT1udWxsKXtcclxuICAgICAgdGhpcy5hYy5jbG9zZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVDb250cm9sUGxheWJhY2tQb3NpdGlvbigpIHtcclxuICAgIGlmICh0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIucGxheVBvc2l0aW9uRnJhbWVzKSB7XHJcbiAgICAgIHRoaXMucHJvbXB0aW5nLmF1ZGlvRGlzcGxheS5wbGF5RnJhbWVQb3NpdGlvbiA9IHRoaXMuX2NvbnRyb2xBdWRpb1BsYXllci5wbGF5UG9zaXRpb25GcmFtZXM7XHJcbiAgICAgIHRoaXMubGl2ZUxldmVsRGlzcGxheS5wbGF5RnJhbWVQb3NpdGlvbiA9IHRoaXMuX2NvbnRyb2xBdWRpb1BsYXllci5wbGF5UG9zaXRpb25GcmFtZXM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhdWRpb1BsYXllclVwZGF0ZShlOiBBdWRpb1BsYXllckV2ZW50KSB7XHJcbiAgICBpZiAoRXZlbnRUeXBlLlJFQURZID09PSBlLnR5cGUpIHtcclxuXHJcbiAgICB9IGVsc2UgaWYgKEV2ZW50VHlwZS5TVEFSVEVEID09PSBlLnR5cGUpIHtcclxuICAgICAgLy90aGlzLnN0YXR1cyA9ICdQbGF5YmFjay4uLic7XHJcbiAgICAgIHRoaXMudXBkYXRlVGltZXJJZCA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB0aGlzLnVwZGF0ZUNvbnRyb2xQbGF5YmFja1Bvc2l0aW9uKCksIDUwKTtcclxuXHJcbiAgICB9IGVsc2UgaWYgKEV2ZW50VHlwZS5FTkRFRCA9PT0gZS50eXBlKSB7XHJcbiAgICAgIC8vLnN0YXR1cz0nUmVhZHkuJztcclxuICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy51cGRhdGVUaW1lcklkKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgaWYoIXRoaXMuZGVzdHJveWVkKSB7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgY2xvc2VkKCkge1xyXG4gICAgdGhpcy5zdGF0dXNBbGVydFR5cGUgPSAnaW5mbyc7XHJcbiAgICB0aGlzLnN0YXR1c01zZyA9ICdTZXNzaW9uIGNsb3NlZC4nO1xyXG4gIH1cclxuXHJcblxyXG4gIGVycm9yKG1zZz0nQW4gdW5rbm93biBlcnJvciBvY2N1cmVkIGR1cmluZyByZWNvcmRpbmcuJyxhZHZpY2U6c3RyaW5nPSdQbGVhc2UgcmV0cnkuJykge1xyXG4gICAgdGhpcy5zdGF0dXNNc2cgPSAnRVJST1I6IFJlY29yZGluZy4nO1xyXG4gICAgdGhpcy5zdGF0dXNBbGVydFR5cGUgPSAnZXJyb3InO1xyXG4gICAgdGhpcy5kaWFsb2cub3BlbihNZXNzYWdlRGlhbG9nLCB7XHJcbiAgICAgIGRhdGE6IHtcclxuICAgICAgICB0eXBlOiAnZXJyb3InLFxyXG4gICAgICAgIHRpdGxlOiAnUmVjb3JkaW5nIGVycm9yJyxcclxuICAgICAgICBtc2c6IG1zZyxcclxuICAgICAgICBhZHZpY2U6IGFkdmljZVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbiJdfQ==
1011
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbm1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvc3BlZWNocmVjb3JkZXIvc2Vzc2lvbi9zZXNzaW9ubWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsWUFBWSxFQUF1QixNQUFNLDZCQUE2QixDQUFDO0FBQy9FLE9BQU8sRUFBZ0MsU0FBUyxFQUFDLE1BQU0sNkJBQTZCLENBQUE7QUFDcEYsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLDRCQUE0QixDQUFBO0FBQ3BELE9BQU8sRUFBb0IsY0FBYyxFQUFrQixNQUFNLGtCQUFrQixDQUFDO0FBQ3BGLE9BQU8sRUFBQyxnQkFBZ0IsRUFBOEIsTUFBTSxjQUFjLENBQUE7QUFDMUUsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQzFDLE9BQU8sRUFHTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBR0wsU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUlqRCxPQUFPLEVBQUMscUJBQXFCLEVBQXVCLE1BQU0sa0JBQWtCLENBQUM7QUFDN0UsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUN0QyxPQUFPLEVBQUMsb0NBQW9DLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUMzRSxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUNoRSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFFdEQsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDekQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ2hELE9BQU8sRUFBQyxJQUFJ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VCxRQUFRLHFGQS9FVDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkNUOzJGQTBCVSxjQUFjO2tCQTFFMUIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUseUJBQXlCO29CQUNuQyxTQUFTLEVBQUUsQ0FBQyxjQUFjLENBQUM7b0JBQzNCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkNUO29CQUNELE1BQU0sRUFBRSxDQUFDOzs7Ozs7Ozs7OztJQVdQLEVBQUM7Ozs7TUFJQyxFQUFDOztJQUVILEVBQUM7Ozs7OztJQU1ELENBQUM7aUJBQ0o7OzBCQXVEYyxNQUFNOzJCQUFDLHFCQUFxQjs0Q0FwRGhDLFdBQVc7c0JBQW5CLEtBQUs7Z0JBS2tDLFNBQVM7c0JBQWhELFNBQVM7dUJBQUMsU0FBUyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFDQyxnQkFBZ0I7c0JBQXRELFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFFNUIsU0FBUztzQkFBakIsS0FBSztnQkE2Sk4sVUFBVTtzQkFEVCxZQUFZO3VCQUFDLGlCQUFpQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVMzQyxTQUFTO3NCQURSLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0F1ZGlvQ2FwdHVyZSwgQXVkaW9DYXB0dXJlTGlzdGVuZXJ9IGZyb20gJy4uLy4uL2F1ZGlvL2NhcHR1cmUvY2FwdHVyZSc7XHJcbmltcG9ydCB7QXVkaW9QbGF5ZXIsIEF1ZGlvUGxheWVyRXZlbnQsIEV2ZW50VHlwZX0gZnJvbSAnLi4vLi4vYXVkaW8vcGxheWJhY2svcGxheWVyJ1xyXG5pbXBvcnQge1dhdldyaXRlcn0gZnJvbSAnLi4vLi4vYXVkaW8vaW1wbC93YXZ3cml0ZXInXHJcbmltcG9ydCB7R3JvdXAsIFByb21wdEl0ZW0sIFByb21wdGl0ZW1VdGlsLCBTY3JpcHQsIFNlY3Rpb259IGZyb20gJy4uL3NjcmlwdC9zY3JpcHQnO1xyXG5pbXBvcnQge1NwclJlY29yZGluZ0ZpbGUsIFJlY29yZGluZ0ZpbGVEZXNjcmlwdG9ySW1wbH0gZnJvbSAnLi4vcmVjb3JkaW5nJ1xyXG5pbXBvcnQge1VwbG9hZH0gZnJvbSAnLi4vLi4vbmV0L3VwbG9hZGVyJztcclxuaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgSW5qZWN0LFxyXG4gIElucHV0LFxyXG4gIE9uRGVzdHJveSxcclxuICBSZW5kZXJlcjIsXHJcbiAgVmlld0NoaWxkXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtTZXNzaW9uU2VydmljZX0gZnJvbSBcIi4vc2Vzc2lvbi5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7U3RhdGUgYXMgU3RhcnRTdG9wU2lnbmFsU3RhdGV9IGZyb20gXCIuLi9zdGFydHN0b3BzaWduYWwvc3RhcnRzdG9wc2lnbmFsXCI7XHJcbmltcG9ydCB7TWF0RGlhbG9nfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nXCI7XHJcbmltcG9ydCB7U3BlZWNoUmVjb3JkZXJVcGxvYWRlcn0gZnJvbSBcIi4uL3NwcnVwbG9hZGVyXCI7XHJcbmltcG9ydCB7U1BFRUNIUkVDT1JERVJfQ09ORklHLCBTcGVlY2hSZWNvcmRlckNvbmZpZ30gZnJvbSBcIi4uLy4uL3Nwci5jb25maWdcIjtcclxuaW1wb3J0IHtQcm9tcHRpbmd9IGZyb20gXCIuL3Byb21wdGluZ1wiO1xyXG5pbXBvcnQge1NlcXVlbmNlQXVkaW9GbG9hdDMyQ2h1bmtlck91dFN0cmVhbX0gZnJvbSBcIi4uLy4uL2F1ZGlvL2lvL3N0cmVhbVwiO1xyXG5pbXBvcnQge1Nlc3Npb25GaW5pc2hlZERpYWxvZ30gZnJvbSBcIi4vc2Vzc2lvbl9maW5pc2hlZF9kaWFsb2dcIjtcclxuaW1wb3J0IHtNZXNzYWdlRGlhbG9nfSBmcm9tIFwiLi4vLi4vdWkvbWVzc2FnZV9kaWFsb2dcIjtcclxuaW1wb3J0IHtSZWNvcmRpbmdTZXJ2aWNlfSBmcm9tIFwiLi4vcmVjb3JkaW5ncy9yZWNvcmRpbmdzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHtBdWRpb0NvbnRleHRQcm92aWRlcn0gZnJvbSBcIi4uLy4uL2F1ZGlvL2NvbnRleHRcIjtcclxuaW1wb3J0IHtBdWRpb0NsaXB9IGZyb20gXCIuLi8uLi9hdWRpby9wZXJzaXN0b3JcIjtcclxuaW1wb3J0IHtJdGVtfSBmcm9tIFwiLi9pdGVtXCI7XHJcbmltcG9ydCB7TGV2ZWxCYXJ9IGZyb20gXCIuLi8uLi9hdWRpby91aS9saXZlbGV2ZWxcIjtcclxuaW1wb3J0IHtCYXNpY1JlY29yZGVyLCBMRVZFTF9CQVJfSU5URVJWQUxMX1NFQ09ORFMsIE1BWF9SRUNPUkRJTkdfVElNRV9NUywgUkVDRklMRV9BUElfQ1RYfSBmcm9tIFwiLi9iYXNpY3JlY29yZGVyXCI7XHJcblxyXG5jb25zdCBERUZBVUxUX1BSRV9SRUNfREVMQVk9MTAwMDtcclxuY29uc3QgREVGQVVMVF9QT1NUX1JFQ19ERUxBWT01MDA7XHJcblxyXG5leHBvcnQgY29uc3QgZW51bSBTdGF0dXMge1xyXG4gIEJMT0NLRUQsIElETEUsIFBSRV9SRUNPUkRJTkcsIFJFQ09SRElORywgUE9TVF9SRUNfU1RPUCwgUE9TVF9SRUNfUEFVU0UsIFNUT1BQSU5HX1NUT1AsIFNUT1BQSU5HX1BBVVNFLCBFUlJPUlxyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1zcHJyZWNvcmRpbmdzZXNzaW9uJyxcclxuICBwcm92aWRlcnM6IFtTZXNzaW9uU2VydmljZV0sXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxhcHAtd2FybmluZ2JhciBbc2hvd109XCJpc1Rlc3RTZXNzaW9uKClcIiB3YXJuaW5nVGV4dD1cIlRlc3QgcmVjb3JkaW5nIG9ubHkhXCI+PC9hcHAtd2FybmluZ2Jhcj5cclxuICAgIDxhcHAtd2FybmluZ2JhciBbc2hvd109XCJpc0RlZmF1bHRBdWRpb1Rlc3RTZXNzaW9uKClcIiB3YXJuaW5nVGV4dD1cIlRoaXMgdGVzdCB1c2VzIGRlZmF1bHQgYXVkaW8gZGV2aWNlISBSZWd1bGFyIHNlc3Npb25zIG1heSByZXF1aXJlIGEgcGFydGljdWxhciBhdWRpbyBkZXZpY2UgKG1pY3JvcGhvbmUpIVwiPjwvYXBwLXdhcm5pbmdiYXI+XHJcbiAgICAgIDxhcHAtc3BycHJvbXB0aW5nIFtwcm9qZWN0TmFtZV09XCJwcm9qZWN0TmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdGFydFN0b3BTaWduYWxTdGF0ZV09XCJzdGFydFN0b3BTaWduYWxTdGF0ZVwiIFtwcm9tcHRJdGVtXT1cInByb21wdEl0ZW1cIiBbc2hvd1Byb21wdF09XCJzaG93UHJvbXB0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cIml0ZW1zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3RyYW5zcG9ydEFjdGlvbnNdPVwidHJhbnNwb3J0QWN0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZEl0ZW1JZHhdPVwicHJvbXB0SW5kZXhcIiAob25JdGVtU2VsZWN0KT1cIml0ZW1TZWxlY3QoJGV2ZW50KVwiIChvbk5leHRJdGVtKT1cIm5leHRJdGVtKClcIiAob25QcmV2SXRlbSk9XCJwcmV2SXRlbSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2F1ZGlvU2lnbmFsQ29sbGFwc2VkXT1cImF1ZGlvU2lnbmFsQ29sbGFwc2VkXCIgW2Rpc3BsYXlBdWRpb0NsaXBdPVwiZGlzcGxheUF1ZGlvQ2xpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwbGF5U3RhcnRBY3Rpb25dPVwiY29udHJvbEF1ZGlvUGxheWVyPy5zdGFydEFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwbGF5U2VsZWN0aW9uQWN0aW9uXT1cImNvbnRyb2xBdWRpb1BsYXllcj8uc3RhcnRTZWxlY3Rpb25BY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXV0b1BsYXlPblNlbGVjdFRvZ2dsZUFjdGlvbl09XCJjb250cm9sQXVkaW9QbGF5ZXI/LmF1dG9QbGF5T25TZWxlY3RUb2dnbGVBY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcGxheVN0b3BBY3Rpb25dPVwiY29udHJvbEF1ZGlvUGxheWVyPy5zdG9wQWN0aW9uXCI+XHJcblxyXG4gICAgPC9hcHAtc3BycHJvbXB0aW5nPlxyXG4gICAgPG1hdC1wcm9ncmVzcy1iYXIgW3ZhbHVlXT1cInByb2dyZXNzUGVyY2VudFZhbHVlKClcIiBmeFNob3c9XCJmYWxzZVwiIGZ4U2hvdy54cz1cInRydWVcIiA+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxyXG5cclxuXHJcbiAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXQueHM9XCJjb2x1bW5cIiBbbmdTdHlsZV09XCJ7J2hlaWdodC5weCc6MTAwLCdtaW4taGVpZ2h0LnB4JzogMTAwfVwiIFtuZ1N0eWxlLnhzXT1cInsnaGVpZ2h0LnB4JzoxMjUsJ21pbi1oZWlnaHQucHgnOiAxMjV9XCI+XHJcbiAgICAgIDxhdWRpby1sZXZlbGJhciBmeEZsZXg9XCIxIDAgMVwiIFtzdHJlYW1pbmdNb2RlXT1cImlzUmVjb3JkaW5nKClcIiBbZGlzcGxheUxldmVsSW5mb3NdPVwiZGlzcGxheUxldmVsSW5mb3NcIj48L2F1ZGlvLWxldmVsYmFyPlxyXG4gICAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCI+XHJcbiAgICAgIDxzcHItcmVjb3JkaW5naXRlbWNvbnRyb2xzIGZ4RmxleD1cIjEwIDAgMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdWRpb0xvYWRlZF09XCJkaXNwbGF5QXVkaW9DbGlwPy5idWZmZXIhPT1udWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYXlTdGFydEFjdGlvbl09XCJjb250cm9sQXVkaW9QbGF5ZXI/LnN0YXJ0QWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYXlTdG9wQWN0aW9uXT1cImNvbnRyb2xBdWRpb1BsYXllcj8uc3RvcEFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwZWFrRGJMdmxdPVwicGVha0xldmVsSW5EYlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthZ2NdPVwidGhpcy5hYz8uYWdjU3RhdHVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uU2hvd1JlY29yZGluZ0RldGFpbHMpPVwiYXVkaW9TaWduYWxDb2xsYXBzZWQ9IWF1ZGlvU2lnbmFsQ29sbGFwc2VkXCI+XHJcbiAgICAgIDwvc3ByLXJlY29yZGluZ2l0ZW1jb250cm9scz5cclxuICAgICAgPGFwcC11cGxvYWRzdGF0dXMgY2xhc3M9XCJyaWNvbnRyb2xzIGRhcmtcIiBmeEhpZGUgZnhTaG93LnhzICBmeEZsZXg9XCIwIDAgMFwiICpuZ0lmPVwiZW5hYmxlVXBsb2FkUmVjb3JkaW5nc1wiIFt2YWx1ZV09XCJ1cGxvYWRQcm9ncmVzc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3RhdHVzXT1cInVwbG9hZFN0YXR1c1wiIFthd2FpdE5ld1VwbG9hZF09XCJwcm9jZXNzaW5nUmVjb3JkaW5nXCI+PC9hcHAtdXBsb2Fkc3RhdHVzPlxyXG4gICAgICA8YXBwLXJlYWR5c3RhdGVpbmRpY2F0b3IgY2xhc3M9XCJyaWNvbnRyb2xzIGRhcmtcIiAgZnhIaWRlIGZ4U2hvdy54cyBmeEZsZXg9XCIwIDAgMFwiIFtyZWFkeV09XCJkYXRhU2F2ZWQgJiYgIWlzQWN0aXZlKClcIj48L2FwcC1yZWFkeXN0YXRlaW5kaWNhdG9yPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8ZGl2ICNjb250cm9scGFuZWwgY2xhc3M9XCJjb250cm9scGFuZWxcIiBmeExheW91dD1cInJvd1wiPlxyXG4gICAgICA8ZGl2IGZ4RmxleD1cIjEgMSAzMCVcIiBmeExheW91dEFsaWduPVwic3RhcnQgY2VudGVyXCI+XHJcbiAgICAgICAgPGFwcC1zcHJzdGF0dXNkaXNwbGF5IGZ4SGlkZS54cyBbc3RhdHVzTXNnXT1cInN0YXR1c01zZ1wiIFtzdGF0dXNBbGVydFR5cGVdPVwic3RhdHVzQWxlcnRUeXBlXCIgW3N0YXR1c1dhaXRpbmddPVwic3RhdHVzV2FpdGluZ1wiPjwvYXBwLXNwcnN0YXR1c2Rpc3BsYXk+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPGFwcC1zcHJ0cmFuc3BvcnQgZnhGbGV4PVwiMTAgMCAzMCVcIiBmeExheW91dEFsaWduPVwiY2VudGVyIGNlbnRlclwiIFtyZWFkb25seV09XCJyZWFkb25seVwiIFthY3Rpb25zXT1cInRyYW5zcG9ydEFjdGlvbnNcIiBbbmF2aWdhdGlvbkVuYWJsZWRdPVwiaXRlbXM9PW51bGwgfHwgaXRlbXMubGVuZ3RoPjFcIj48L2FwcC1zcHJ0cmFuc3BvcnQ+XHJcbiAgICA8ZGl2IGZ4RmxleD1cIjEgMSAzMCVcIiBmeExheW91dEFsaWduPVwiZW5kIGNlbnRlclwiIGZ4TGF5b3V0PVwicm93XCI+XHJcbiAgICAgIDxhcHAtdXBsb2Fkc3RhdHVzIGNsYXNzPVwicmljb250cm9sc1wiIGZ4SGlkZS54cyBmeExheW91dEFsaWduPVwiZW5kIGNlbnRlclwiICpuZ0lmPVwiZW5hYmxlVXBsb2FkUmVjb3JkaW5nc1wiIFt2YWx1ZV09XCJ1cGxvYWRQcm9ncmVzc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbc3RhdHVzXT1cInVwbG9hZFN0YXR1c1wiIFthd2FpdE5ld1VwbG9hZF09XCJwcm9jZXNzaW5nUmVjb3JkaW5nXCI+PC9hcHAtdXBsb2Fkc3RhdHVzPlxyXG4gICAgICA8YXBwLXJlYWR5c3RhdGVpbmRpY2F0b3IgY2xhc3M9XCJyaWNvbnRyb2xzXCIgZnhMYXlvdXRBbGlnbj1cImVuZCBjZW50ZXJcIiBmeEhpZGUueHMgW3JlYWR5XT1cImRhdGFTYXZlZCAmJiAhaXNBY3RpdmUoKVwiPjwvYXBwLXJlYWR5c3RhdGVpbmRpY2F0b3I+XHJcbiAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIGAsXHJcbiAgc3R5bGVzOiBbYDpob3N0IHtcclxuICAgIGZsZXg6IDI7XHJcbiAgICBiYWNrZ3JvdW5kOiBsaWdodGdyZXk7XHJcbiAgICBkaXNwbGF5OiBmbGV4OyAvKiBWZXJ0aWNhbCBmbGV4IGNvbnRhaW5lcjogQm90dG9tIHRyYW5zcG9ydCBwYW5lbCwgYWJvdmUgcHJvbXB0aW5nIHBhbmVsICovXHJcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgcGFkZGluZzogMDtcclxuICAgIG1pbi1oZWlnaHQ6IDBweDtcclxuXHJcbiAgICAgIC8qIFByZXZlbnRzIGhvcml6b250YWwgc2Nyb2xsIGJhciBvbiBzd2lwZSByaWdodCAqL1xyXG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1gLGAucmljb250cm9scyB7XHJcbiAgICAgICAgcGFkZGluZzogNHB4O1xyXG4gICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgfWAsYC5kYXJrIHtcclxuICAgIGJhY2tncm91bmQ6IGRhcmtncmF5O1xyXG4gIH1gLGAuY29udHJvbHBhbmVsIHtcclxuICAgIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgICBwYWRkaW5nOiAyMHB4O1xyXG4gICAgbWluLWhlaWdodDogbWluLWNvbnRlbnQ7IC8qIGltcG9ydGFudCAqL1xyXG4gIH1gXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgU2Vzc2lvbk1hbmFnZXIgZXh0ZW5kcyBCYXNpY1JlY29yZGVyIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCxPbkRlc3Ryb3ksIEF1ZGlvQ2FwdHVyZUxpc3RlbmVyIHtcclxuXHJcbiAgQElucHV0KCkgcHJvamVjdE5hbWU6c3RyaW5nfHVuZGVmaW5lZDtcclxuICBlbmFibGVVcGxvYWRSZWNvcmRpbmdzOiBib29sZWFuID0gdHJ1ZTtcclxuICBlbmFibGVEb3dubG9hZFJlY29yZGluZ3M6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBzdGF0dXM6IFN0YXR1cyA9IFN0YXR1cy5CTE9DS0VEO1xyXG5cclxuICBAVmlld0NoaWxkKFByb21wdGluZywgeyBzdGF0aWM6IHRydWUgfSkgcHJvbXB0aW5nITogUHJvbXB0aW5nO1xyXG4gIEBWaWV3Q2hpbGQoTGV2ZWxCYXIsIHsgc3RhdGljOiB0cnVlIH0pIGxpdmVMZXZlbERpc3BsYXkhOiBMZXZlbEJhcjtcclxuXHJcbiAgQElucHV0KCkgZGF0YVNhdmVkPXRydWVcclxuXHJcbiAgc3RhcnRTdG9wU2lnbmFsU3RhdGUhOiBTdGFydFN0b3BTaWduYWxTdGF0ZTtcclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVUaW1lcklkOiBhbnk7XHJcbiAgcHJpdmF0ZSBwcmVSZWNUaW1lcklkOiBudW1iZXJ8bnVsbD1udWxsO1xyXG4gIHByaXZhdGUgcHJlUmVjVGltZXJSdW5uaW5nOiBib29sZWFufG51bGw9bnVsbDtcclxuICBwcml2YXRlIHBvc3RSZWNUaW1lcklkOiBudW1iZXJ8bnVsbD1udWxsO1xyXG4gIHByaXZhdGUgcG9zdFJlY1RpbWVyUnVubmluZzogYm9vbGVhbnxudWxsPW51bGw7XHJcbiAgcHJpdmF0ZSBtYXhSZWNUaW1lcklkOiBudW1iZXJ8bnVsbD1udWxsO1xyXG4gIHByaXZhdGUgbWF4UmVjVGltZXJSdW5uaW5nOiBib29sZWFufG51bGw9bnVsbDtcclxuXHJcbiAgZG5sTG5rITogSFRNTEFuY2hvckVsZW1lbnQ7XHJcblxyXG4gIGF1ZGlvOiBhbnk7XHJcbiAgX3NjcmlwdCE6IFNjcmlwdDtcclxuICBwcml2YXRlIF9wcm9tcHRJbmRleD0wO1xyXG4gIHByaXZhdGUgc2VjdGlvbiE6IFNlY3Rpb247XHJcbiAgZ3JvdXAhOiBHcm91cDtcclxuICBwcm9tcHRJdGVtITpQcm9tcHRJdGVtO1xyXG4gIHNob3dQcm9tcHQhOiBib29sZWFuO1xyXG5cclxuICAvLyBpbmRleCBvZiBjdXJyZW50IHNlY3Rpb25cclxuICBzZWN0SWR4ITogbnVtYmVyO1xyXG4gIC8vIGluZGV4IG9mIGN1cnJlbnQgZ3JvdXAgaW4gc2VjdGlvblxyXG4gIGdyb3VwSWR4SW5TZWN0aW9uITogbnVtYmVyO1xyXG4gIC8vIGluZGV4IG9mIGN1cnJlbnQgcHJvbXB0IGl0ZW0gaW4gZ3JvdXBcclxuICBwcm9tcHRJdGVtSWR4SW5Hcm91cCE6IG51bWJlcjtcclxuXHJcbiAgcHJpdmF0ZSBhdXRvcmVjb3JkaW5nITogYm9vbGVhbjtcclxuXHJcbiAgaXRlbXM6IEFycmF5PEl0ZW0+fG51bGw9bnVsbDtcclxuICAvL3NlbGVjdGVkSXRlbUlkeDogbnVtYmVyO1xyXG4gIHByaXZhdGUgX2Rpc3BsYXlSZWNGaWxlOiBTcHJSZWNvcmRpbmdGaWxlIHwgbnVsbD1udWxsO1xyXG4gIHByaXZhdGUgZGlzcGxheVJlY0ZpbGVWZXJzaW9uITogbnVtYmVyO1xyXG5cclxuICBwcm9tcHRJdGVtQ291bnQhOiBudW1iZXI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgICAgICAgICAgICBwdWJsaWMgZGlhbG9nOiBNYXREaWFsb2csXHJcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIHNlc3Npb25TZXJ2aWNlOlNlc3Npb25TZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgcmVjRmlsZVNlcnZpY2U6UmVjb3JkaW5nU2VydmljZSxcclxuICAgICAgICAgICAgICBwcml2YXRlIHVwbG9hZGVyOiBTcGVlY2hSZWNvcmRlclVwbG9hZGVyLFxyXG4gICAgICAgICAgICAgIEBJbmplY3QoU1BFRUNIUkVDT1JERVJfQ09ORklHKSBwdWJsaWMgY29uZmlnPzogU3BlZWNoUmVjb3JkZXJDb25maWcpIHtcclxuICAgIHN1cGVyKGRpYWxvZyxzZXNzaW9uU2VydmljZSk7XHJcbiAgICB0aGlzLnN0YXR1cyA9IFN0YXR1cy5JRExFO1xyXG4gICAgdGhpcy5hdWRpbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdWRpbycpO1xyXG4gICAgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmVuYWJsZVVwbG9hZFJlY29yZGluZ3MgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmVuYWJsZVVwbG9hZFJlY29yZGluZ3MgPSB0aGlzLmNvbmZpZy5lbmFibGVVcGxvYWRSZWNvcmRpbmdzO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmVuYWJsZURvd25sb2FkUmVjb3JkaW5ncyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuZW5hYmxlRG93bmxvYWRSZWNvcmRpbmdzID0gdGhpcy5jb25maWcuZW5hYmxlRG93bmxvYWRSZWNvcmRpbmdzO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pbml0KCk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLnN0cmVhbUxldmVsTWVhc3VyZS5sZXZlbExpc3RlbmVyID0gdGhpcy5saXZlTGV2ZWxEaXNwbGF5O1xyXG4gICAgdGhpcy5zdHJlYW1MZXZlbE1lYXN1cmUucGVha0xldmVsTGlzdGVuZXI9KHBlYWtMdmxJbkRiKT0+e1xyXG4gICAgICB0aGlzLnBlYWtMZXZlbEluRGI9cGVha0x2bEluRGI7XHJcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG4gIH1cclxuICAgIG5nT25EZXN0cm95KCkge1xyXG4gICAgICAgdGhpcy5kZXN0cm95ZWQ9dHJ1ZTtcclxuICAgICAgIC8vIFRPRE8gc3RvcCBjYXB0dXJlIC9wbGF5YmFja1xyXG4gICAgfVxyXG5cclxuICBwcml2YXRlIGluaXQoKSB7XHJcbiAgICB0aGlzLnNlY3RJZHggPSAwO1xyXG4gICAgdGhpcy5ncm91cElkeEluU2VjdGlvbiA9IDA7XHJcbiAgICB0aGlzLnByb21wdEl0ZW1JZHhJbkdyb3VwID0gMDtcclxuICAgIHRoaXMuYXV0b3JlY29yZGluZyA9IGZhbHNlO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0YXJ0QWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdG9wQWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5uZXh0QWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5wYXVzZUFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLnBsYXlTdGFydEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICBsZXQgY29udGV4dDpBdWRpb0NvbnRleHR8bnVsbD1udWxsO1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29udGV4dCA9IEF1ZGlvQ29udGV4dFByb3ZpZGVyLmF1ZGlvQ29udGV4dEluc3RhbmNlKClcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICB0aGlzLnN0YXR1cyA9IFN0YXR1cy5FUlJPUjtcclxuICAgICAgbGV0IGVyck1zZyA9ICdVbmtub3duIGVycm9yJztcclxuICAgICAgaWYoZXJyIGluc3RhbmNlb2YgRXJyb3Ipe1xyXG4gICAgICAgIGVyck1zZz1lcnIubWVzc2FnZTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnN0YXR1c01zZyA9ICdFUlJPUjogJyArIGVyck1zZztcclxuICAgICAgdGhpcy5zdGF0dXNBbGVydFR5cGUgPSAnZXJyb3InO1xyXG4gICAgICB0aGlzLmRpYWxvZy5vcGVuKE1lc3NhZ2VEaWFsb2csIHtcclxuICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICB0eXBlOiAnZXJyb3InLFxyXG4gICAgICAgICAgdGl0bGU6ICdFcnJvcicsXHJcbiAgICAgICAgICBtc2c6IGVyck1zZyxcclxuICAgICAgICAgIGFkdmlzZTogJ1BsZWFzZSB1c2UgYSBzdXBwb3J0ZWQgYnJvd3Nlci4nLFxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmKGNvbnRleHQpIHtcclxuICAgICAgY29uc29sZS5pbmZvKFwiU3RhdGUgb2YgYXVkaW8gY29udGV4dDogXCIgKyBjb250ZXh0LnN0YXRlKVxyXG4gICAgfWVsc2V7XHJcbiAgICAgIGNvbnNvbGUuaW5mbyhcIk5vIGF1ZGlvIGNvbnRleHQgYXZhaWxhYmxlIVwiKTtcclxuICAgIH1cclxuICAgIGlmICghY29udGV4dCB8fCAhbmF2aWdhdG9yLm1lZGlhRGV2aWNlcykge1xyXG4gICAgICB0aGlzLnN0YXR1cyA9IFN0YXR1cy5FUlJPUjtcclxuICAgICAgbGV0IGVyck1zZyA9ICdCcm93c2VyIGRvZXMgbm90IHN1cHBvcnQgTWVkaWEgc3RyZWFtcyEnO1xyXG4gICAgICB0aGlzLnN0YXR1c01zZyA9ICdFUlJPUjogJyArIGVyck1zZztcclxuICAgICAgdGhpcy5zdGF0dXNBbGVydFR5cGUgPSAnZXJyb3InO1xyXG4gICAgICB0aGlzLmRpYWxvZy5vcGVuKE1lc3NhZ2VEaWFsb2csIHtcclxuICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICB0eXBlOiAnZXJyb3InLFxyXG4gICAgICAgICAgdGl0bGU6ICdFcnJvcicsXHJcbiAgICAgICAgICBtc2c6IGVyck1zZyxcclxuICAgICAgICAgIGFkdmlzZTogJ1BsZWFzZSB1c2UgYSBzdXBwb3J0ZWQgYnJvd3Nlci4nLFxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYWMgPSBuZXcgQXVkaW9DYXB0dXJlKGNvbnRleHQpO1xyXG4gICAgICBpZiAodGhpcy5hYykge1xyXG4gICAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdGFydEFjdGlvbi5vbkFjdGlvbiA9ICgpID0+IHRoaXMuc3RhcnRJdGVtKCk7XHJcbiAgICAgICAgdGhpcy5hYy5saXN0ZW5lciA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5hYy5hdWRpb091dFN0cmVhbSA9IG5ldyBTZXF1ZW5jZUF1ZGlvRmxvYXQzMkNodW5rZXJPdXRTdHJlYW0odGhpcy5zdHJlYW1MZXZlbE1lYXN1cmUsIExFVkVMX0JBUl9JTlRFUlZBTExfU0VDT05EUyk7XHJcbiAgICAgICAgLy8gRG9uJ3QgbGlzdCB0aGUgZGV2aWNlcyBoZXJlLiBJZiB3ZSBkbyBub3QgaGF2ZSBhdWRpbyBwZXJtaXNzaW9ucyB3ZSBvbmx5IGdldCBhbm9ueW1pemVkIGRldmljZXMgd2l0aG91dCBsYWJlbHMuXHJcbiAgICAgICAgLy90aGlzLmFjLmxpc3REZXZpY2VzKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0YXJ0QWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICBsZXQgZXJyTXNnID0gJ0Jyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBNZWRpYS9BdWRpbyBBUEkhJztcclxuICAgICAgICB0aGlzLnN0YXR1c01zZyA9ICdFUlJPUjogJyArIGVyck1zZztcclxuICAgICAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZSA9ICdlcnJvcic7XHJcbiAgICAgICAgdGhpcy5kaWFsb2cub3BlbihNZXNzYWdlRGlhbG9nLCB7XHJcbiAgICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXHJcbiAgICAgICAgICAgIHRpdGxlOiAnRXJyb3InLFxyXG4gICAgICAgICAgICBtc2c6IGVyck1zZyxcclxuICAgICAgICAgICAgYWR2aXNlOiAnUGxlYXNlIHVzZSBhIHN1cHBvcnRlZCBicm93c2VyLicsXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdG9wQWN0aW9uLm9uQWN0aW9uID0gKCkgPT4gdGhpcy5zdG9wSXRlbSgpO1xyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMubmV4dEFjdGlvbi5vbkFjdGlvbiA9ICgpID0+IHRoaXMuc3RvcEl0ZW0oKTtcclxuICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnBhdXNlQWN0aW9uLm9uQWN0aW9uID0gKCkgPT4gdGhpcy5wYXVzZUl0ZW0oKTtcclxuICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLmZ3ZEFjdGlvbi5vbkFjdGlvbiA9ICgpID0+IHRoaXMubmV4dEl0ZW0oKTtcclxuICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLmZ3ZE5leHRBY3Rpb24ub25BY3Rpb24gPSAoKSA9PiB0aGlzLm5leHRVbnJlY29yZGVkSXRlbSgpO1xyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuYndkQWN0aW9uLm9uQWN0aW9uID0gKCkgPT4gdGhpcy5wcmV2SXRlbSgpO1xyXG4gICAgICB0aGlzLnBsYXlTdGFydEFjdGlvbi5vbkFjdGlvbiA9ICgpID0+IHRoaXMuY29udHJvbEF1ZGlvUGxheWVyLnN0YXJ0KCk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc3RhcnRTdG9wU2lnbmFsU3RhdGUgPSBTdGFydFN0b3BTaWduYWxTdGF0ZS5PRkY7XHJcblxyXG59XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXlwcmVzcycsIFsnJGV2ZW50J10pXHJcbiAgb25LZXlQcmVzcyhrZTogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgaWYgKGtlLmtleSA9PSAnICcpIHtcclxuICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0YXJ0QWN0aW9uLnBlcmZvcm0oKTtcclxuICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLm5leHRBY3Rpb24ucGVyZm9ybSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleWRvd24nLCBbJyRldmVudCddKVxyXG4gIG9uS2V5RG93bihrZTogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgaWYgKGtlLmtleSA9PSAnICcpIHtcclxuICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0b3BBY3Rpb24ucGVyZm9ybSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKGtlLmtleSA9PSAncCcpIHtcclxuICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnBhdXNlQWN0aW9uLnBlcmZvcm0oKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoa2Uua2V5ID09ICdFc2NhcGUnKSB7XHJcbiAgICAgIGlmKCF0aGlzLmF1ZGlvU2lnbmFsQ29sbGFwc2VkKXtcclxuICAgICAgICB0aGlzLmF1ZGlvU2lnbmFsQ29sbGFwc2VkPXRydWU7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0b3BBY3Rpb24ucGVyZm9ybSgpO1xyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMucGF1c2VBY3Rpb24ucGVyZm9ybSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChrZS5rZXkgPT0gJ01lZGlhUGxheVBhdXNlJykge1xyXG4gICAgICB0aGlzLnBsYXlTdGFydEFjdGlvbi5wZXJmb3JtKCk7XHJcbiAgICB9XHJcbiAgICBpZiAoa2Uua2V5ID09PSAnQXJyb3dSaWdodCcpIHtcclxuICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLmZ3ZEFjdGlvbi5wZXJmb3JtKCk7XHJcbiAgICB9XHJcbiAgICBpZiAoa2Uua2V5ID09PSAnQXJyb3dMZWZ0Jykge1xyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuYndkQWN0aW9uLnBlcmZvcm0oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb2dyZXNzUGVyY2VudFZhbHVlKCk6bnVtYmVyIHtcclxuICAgIGxldCB2PTEwMDtcclxuICAgIGlmKHRoaXMuaXRlbXMpIHtcclxuICAgICAgdj10aGlzLnByb21wdEluZGV4ICogMTAwIC8gKHRoaXMuaXRlbXMubGVuZ3RoIC0gMSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdjtcclxuICB9XHJcbiAgaXNUZXN0U2Vzc2lvbigpOmJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICgodGhpcy5fc2Vzc2lvbiE9bnVsbCkgJiYgKHRoaXMuX3Nlc3Npb24udHlwZSA9PT0gJ1RFU1QnIHx8IHRoaXMuX3Nlc3Npb24udHlwZT09PSdURVNUX0RFRl9BJyB8fCB0aGlzLl9zZXNzaW9uLnR5cGUgPT09ICdTSU5VU19URVNUJykpO1xyXG4gIH1cclxuXHJcbiAgaXNEZWZhdWx0QXVkaW9UZXN0U2Vzc2lvbigpOmJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICgodGhpcy5fc2Vzc2lvbiE9bnVsbCkgJiYgKHRoaXMuX3Nlc3Npb24udHlwZT09PSdURVNUX0RFRl9BJykpO1xyXG4gIH1cclxuXHJcbiAgaXNEZWZhdWx0QXVkaW9UZXN0U2Vzc2lvbk92ZXJ3cml0ZWluZ1Byb2plY3RSZXF1aXJlbWVudHMoKTpib29sZWFuIHtcclxuICAgIHJldHVybiAoKHRoaXMuX3Nlc3Npb24hPW51bGwpICYmICh0aGlzLl9zZXNzaW9uLnR5cGU9PT0nVEVTVF9ERUZfQScpICYmICh0aGlzLmF1ZGlvRGV2aWNlcyE9bnVsbCkgJiYgdGhpcy5hdWRpb0RldmljZXMubGVuZ3RoPjApXHJcbiAgfVxyXG5cclxuXHJcbiAgc2V0IGNvbnRyb2xBdWRpb1BsYXllcihjb250cm9sQXVkaW9QbGF5ZXI6IEF1ZGlvUGxheWVyKSB7XHJcbiAgICBpZiAodGhpcy5fY29udHJvbEF1ZGlvUGxheWVyKSB7XHJcbiAgICAgIC8vdGhpcy5fY29udHJvbEF1ZGlvUGxheWVyLmxpc3RlbmVyPW51bGw7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIgPSBjb250cm9sQXVkaW9QbGF5ZXI7XHJcbiAgICBpZiAodGhpcy5fY29udHJvbEF1ZGlvUGxheWVyKSB7XHJcbiAgICAgIHRoaXMuX2NvbnRyb2xBdWRpb1BsYXllci5saXN0ZW5lciA9IHRoaXM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgY29udHJvbEF1ZGlvUGxheWVyKCk6IEF1ZGlvUGxheWVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXI7XHJcbiAgfVxyXG5cclxuICBzZXQgc2NyaXB0KHNjcmlwdDogYW55KSB7XHJcbiAgICB0aGlzLl9zY3JpcHQgPSBzY3JpcHQ7XHJcbiAgICB0aGlzLmxvYWRTY3JpcHQoKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZShlOiBBdWRpb1BsYXllckV2ZW50KSB7XHJcbiAgICBpZiAoZS50eXBlID09IEV2ZW50VHlwZS5TVEFSVEVEKSB7XHJcbiAgICAgIHRoaXMucGxheVN0YXJ0QWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgdGhpcy51cGRhdGVUaW1lcklkID0gd2luZG93LnNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgICAvL3RoaXMuYXVkaW9TaWduYWwucGxheUZyYW1lUG9zaXRpb24gPSB0aGlzLmFwLnBsYXlQb3NpdGlvbkZyYW1lcztcclxuICAgICAgfSwgNTApO1xyXG4gICAgfSBlbHNlIGlmIChlLnR5cGUgPT0gRXZlbnRUeXBlLlNUT1BQRUQgfHwgZS50eXBlID09IEV2ZW50VHlwZS5FTkRFRCkge1xyXG4gICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnVwZGF0ZVRpbWVySWQpO1xyXG4gICAgICAvLyB0aGlzLmF1ZGlvU2lnbmFsLnBsYXlGcmFtZVBvc2l0aW9uID0gdGhpcy5hcC5wbGF5UG9zaXRpb25GcmFtZXM7XHJcbiAgICAgIHRoaXMucGxheVN0YXJ0QWN0aW9uLmRpc2FibGVkID0gKCEodGhpcy5kaXNwbGF5UmVjRmlsZSkpO1xyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBwcm9tcHRJbmRleCgpOm51bWJlcntcclxuICAgIHJldHVybiB0aGlzLl9wcm9tcHRJbmRleDtcclxuICB9XHJcblxyXG4gIHNldCBwcm9tcHRJbmRleChwcm9tcHRJbmRleDpudW1iZXIpe1xyXG4gICAgaWYocHJvbXB0SW5kZXg8MCB8fCBwcm9tcHRJbmRleD49dGhpcy5wcm9tcHRJdGVtQ291bnQpe1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQcm9tcHQgaW5kZXggb3V0IG9mIHJhbmdlXCIpXHJcbiAgICB9XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBsZXQgc2VjdGlvbnM9dGhpcy5fc2NyaXB0LnNlY3Rpb25zO1xyXG4gICAgbGV0IGZvdW5kPWZhbHNlO1xyXG4gICAgZm9yIChsZXQgc2kgPSAwOyBzaSA8IHNlY3Rpb25zLmxlbmd0aCAmJiAhZm91bmQ7IHNpKyspIHtcclxuICAgICAgbGV0IHNlY3Rpb24gPSBzZWN0aW9uc1tzaV07XHJcbiAgICAgIGxldCBncyA9IHNlY3Rpb24uX3NodWZmbGVkR3JvdXBzO1xyXG4gICAgICBmb3IgKGxldCBnaSA9IDA7IGdpIDwgZ3MubGVuZ3RoOyBnaSsrKSB7XHJcbiAgICAgICAgbGV0IHBpcz1nc1tnaV0uX3NodWZmbGVkUHJvbXB0SXRlbXM7XHJcblxyXG4gICAgICAgIGxldCBwaXNTaXplID0gcGlzLmxlbmd0aDtcclxuICAgICAgICBpZiAocHJvbXB0SW5kZXggPCBpICsgcGlzU2l6ZSkge1xyXG4gICAgICAgICAgdGhpcy5zZWN0SWR4ID0gc2k7XHJcbiAgICAgICAgICB0aGlzLmdyb3VwSWR4SW5TZWN0aW9uPWdpO1xyXG4gICAgICAgICAgdGhpcy5wcm9tcHRJdGVtSWR4SW5Hcm91cCA9IHByb21wdEluZGV4IC0gaTtcclxuICAgICAgICAgIGZvdW5kPXRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaSArPSBwaXNTaXplO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYoZm91bmQpe1xyXG4gICAgICB0aGlzLl9wcm9tcHRJbmRleD1wcm9tcHRJbmRleDtcclxuICAgIH1lbHNle1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnRlcm5hbCBlcnJvcjogUHJvbXB0IGluZGV4IG5vdCBmb3VuZFwiKVxyXG4gICAgfVxyXG4gICAgdGhpcy5hcHBseUl0ZW0oKTtcclxuICB9XHJcblxyXG4gIGl0ZW1TZWxlY3QoaXRlbUlkeDogbnVtYmVyKSB7XHJcbiAgICBpZiAodGhpcy5zdGF0dXMgPT09IFN0YXR1cy5JRExFKSB7XHJcbiAgICAgIHRoaXMucHJvbXB0SW5kZXg9aXRlbUlkeDtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIHN0YXJ0SXRlbSgpIHtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdGFydEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMucGF1c2VBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgaWYodGhpcy5yZWFkb25seSl7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLmZ3ZEFjdGlvbi5kaXNhYmxlZCA9IHRydWVcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5md2ROZXh0QWN0aW9uLmRpc2FibGVkID0gdHJ1ZVxyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLmJ3ZEFjdGlvbi5kaXNhYmxlZCA9IHRydWVcclxuICAgIHRoaXMuZGlzcGxheVJlY0ZpbGUgPSBudWxsO1xyXG4gICAgdGhpcy5kaXNwbGF5UmVjRmlsZVZlcnNpb24gPSAwO1xyXG4gICAgdGhpcy5kaXNwbGF5QXVkaW9DbGlwID0gbnVsbDtcclxuICAgIHRoaXMuc2hvd1JlY29yZGluZygpO1xyXG4gICAgaWYgKHRoaXMuc2VjdGlvbi5tb2RlID09PSAnQVVUT1JFQ09SRElORycpIHtcclxuICAgICAgdGhpcy5hdXRvcmVjb3JkaW5nID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZih0aGlzLmFjIT1udWxsKSB7XHJcbiAgICAgIGlmICghdGhpcy5hYy5vcGVuZWQpIHtcclxuICAgICAgICBpZiAodGhpcy5fc2VsZWN0ZWREZXZpY2VJZCkge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJPcGVuIHNlc3Npb24gd2l0aCBhdWRpbyBkZXZpY2UgSWQ6IFxcJ1wiICsgdGhpcy5fc2VsZWN0ZWREZXZpY2VJZCArIFwiXFwnIGZvciBcIiArIHRoaXMuX2NoYW5uZWxDb3VudCArIFwiIGNoYW5uZWxzXCIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIk9wZW4gc2Vzc2lvbiB3aXRoIGRlZmF1bHQgYXVkaW8gZGV2aWNlIGZvciBcIiArIHRoaXMuX2NoYW5uZWxDb3VudCArIFwiIGNoYW5uZWxzXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFjLm9wZW4odGhpcy5fY2hhbm5lbENvdW50LCB0aGlzLl9zZWxlY3RlZERldmljZUlkLHRoaXMuX2F1dG9HYWluQ29udHJvbENvbmZpZ3MpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuYWMuc3RhcnQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgbG9hZFNjcmlwdCgpIHtcclxuICAgIHRoaXMucHJvbXB0SXRlbUNvdW50ID0gMDtcclxuXHJcbiAgICB0aGlzLml0ZW1zID0gbmV3IEFycmF5PEl0ZW0+KCk7XHJcbiAgICBsZXQgbG4gPSAwO1xyXG5cclxuICAgIC8vVE9ETyByYW5kb21pemUgbm90IHN1cHBvcnRlZFxyXG4gICAgZm9yIChsZXQgc2kgPSAwOyBzaSA8IHRoaXMuX3NjcmlwdC5zZWN0aW9ucy5sZW5ndGg7IHNpKyspIHtcclxuICAgICAgbGV0IHNlY3Rpb24gPSB0aGlzLl9zY3JpcHQuc2VjdGlvbnNbc2ldO1xyXG4gICAgICBsZXQgZ3MgPSBzZWN0aW9uLl9zaHVmZmxlZEdyb3VwcztcclxuICAgICAgZm9yKGxldCBnaT0wO2dpPGdzLmxlbmd0aDtnaSsrKSB7XHJcblxyXG4gICAgICAgICAgbGV0IHBpcyA9IGdzW2dpXS5fc2h1ZmZsZWRQcm9tcHRJdGVtcztcclxuXHJcbiAgICAgICAgICBsZXQgcGlzTGVuID0gcGlzLmxlbmd0aDtcclxuICAgICAgICAgIHRoaXMucHJvbXB0SXRlbUNvdW50ICs9IHBpc0xlbjtcclxuICAgICAgICAgIGZvciAobGV0IHBpU2VjdElkeCA9IDA7IHBpU2VjdElkeCA8IHBpc0xlbjsgcGlTZWN0SWR4KyspIHtcclxuICAgICAgICAgICAgbGV0IHBpID0gcGlzW3BpU2VjdElkeF07XHJcbiAgICAgICAgICAgIGxldCBwcm9tcHRBc1N0ciA9IFByb21wdGl0ZW1VdGlsLnRvUGxhaW5UZXh0U3RyaW5nKHBpKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBpdCA9IG5ldyBJdGVtKHByb21wdEFzU3RyLCBzZWN0aW9uLnRyYWluaW5nLCghcGkudHlwZSB8fCBwaS50eXBlPT09J3JlY29yZGluZycpKTtcclxuICAgICAgICAgICAgdGhpcy5pdGVtcy5wdXNoKGl0KTtcclxuICAgICAgICAgICAgbG4rKztcclxuICAgICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvbXB0SW5kZXhCeUl0ZW1jb2RlKGl0ZW1jb2RlOnN0cmluZyk6bnVtYmVyfG51bGx7XHJcbiAgICBsZXQgcGl4ID0gMDtcclxuXHJcbiAgICBmb3IgKGxldCBzaSA9IDA7IHNpIDwgdGhpcy5fc2NyaXB0LnNlY3Rpb25zLmxlbmd0aDsgc2krKykge1xyXG4gICAgICBsZXQgc2VjdGlvbiA9IHRoaXMuX3NjcmlwdC5zZWN0aW9uc1tzaV07XHJcbiAgICAgIGxldCBncyA9IHNlY3Rpb24uX3NodWZmbGVkR3JvdXBzO1xyXG4gICAgICBmb3IobGV0IGdpPTA7Z2k8Z3MubGVuZ3RoO2dpKyspIHtcclxuICAgICAgICBsZXQgcGlzPWdzW2dpXS5fc2h1ZmZsZWRQcm9tcHRJdGVtcztcclxuICAgICAgICBsZXQgcGlzTGVuID0gcGlzLmxlbmd0aDtcclxuICAgICAgICBmb3IgKGxldCBwaVNlY3RJZHggPSAwOyBwaVNlY3RJZHggPCBwaXNMZW47IHBpU2VjdElkeCsrKSB7XHJcbiAgICAgICAgICBsZXQgcGkgPSBwaXNbcGlTZWN0SWR4XTtcclxuICAgICAgICAgIGxldCBpYz1waS5pdGVtY29kZTtcclxuICAgICAgICAgIGlmKGljID09PSBpdGVtY29kZSl7XHJcbiAgICAgICAgICAgIHJldHVybiBwaXg7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBwaXgrKztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgY2xlYXJQcm9tcHQoKSB7XHJcbiAgICAvL3RoaXMucHJvbXB0aW5nLnByb21wdENvbnRhaW5lci5wcm9tcHRlci5wcm9tcHRUZXh0PScnO1xyXG4gICAgLy90aGlzLm1lZGlhaXRlbSA9IG51bGw7XHJcbiAgICB0aGlzLnNob3dQcm9tcHQgPSBmYWxzZTtcclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpXHJcbiAgfVxyXG5cclxuICBhcHBseVByb21wdCgpIHtcclxuICAgIC8vdGhpcy5wcm9tcHRpbmcucHJvbXB0Q29udGFpbmVyLnByb21wdGVyLnByb21wdFRleHQ9dGhpcy5wcm9tcHRVbml0Lm1lZGlhaXRlbXNbMF0udGV4dDtcclxuICAgIC8vdGhpcy5wcm9tcHRUZXh0ID0gdGhpcy5wcm9tcHRVbml0Lm1lZGlhaXRlbXNbMF0udGV4dDtcclxuICAgIC8vdGhpcy5tZWRpYWl0ZW09dGhpcy5wcm9tcHRVbml0Lm1lZGlhaXRlbXNbMF07XHJcbiAgICB0aGlzLnNob3dQcm9tcHQgPSB0cnVlO1xyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKClcclxuICB9XHJcblxyXG4gIGRvd25sb2FkUmVjb3JkaW5nKCkge1xyXG4gICAgaWYgKHRoaXMuZGlzcGxheVJlY0ZpbGUpIHtcclxuICAgICAgbGV0IGFiOiBBdWRpb0J1ZmZlcnxudWxsID0gdGhpcy5kaXNwbGF5UmVjRmlsZS5hdWRpb0J1ZmZlcjtcclxuICAgICAgbGV0IHd3ID0gbmV3IFdhdldyaXRlcigpO1xyXG4gICAgICBpZihhYikge1xyXG4gICAgICAgIGxldCB3YXZGaWxlID0gd3cud3JpdGVBc3luYyhhYiwgKHdhdkZpbGUpID0+IHtcclxuICAgICAgICAgIGxldCBibG9iID0gbmV3IEJsb2IoW3dhdkZpbGVdLCB7dHlwZTogJ2F1ZGlvL3dhdid9KTtcclxuICAgICAgICAgIGxldCByZlVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcblxyXG4gICAgICAgICAgbGV0IGRhdGFEbmxMbmsgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgICAgICAgIC8vZGF0YURubExuay5uYW1lID0gJ1JlY29yZGluZyc7XHJcbiAgICAgICAgICBkYXRhRG5sTG5rLmhyZWYgPSByZlVybDtcclxuXHJcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGRvY3VtZW50LmJvZHksIGRhdGFEbmxMbmspO1xyXG5cclxuICAgICAgICAgIC8vIGRvd25sb2FkIHByb3BlcnR5IG5vdCB5ZXQgaW4gVFMgZGVmXHJcbiAgICAgICAgICBpZiAodGhpcy5kaXNwbGF5UmVjRmlsZSkge1xyXG4gICAgICAgICAgICBsZXQgZm4gPSB0aGlzLmRpc3BsYXlSZWNGaWxlLmZpbGVuYW1lU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIGZuICs9ICdfJyArIHRoaXMuZGlzcGxheVJlY0ZpbGVWZXJzaW9uO1xyXG4gICAgICAgICAgICBmbiArPSAnLndhdic7XHJcbiAgICAgICAgICAgIGRhdGFEbmxMbmsuZG93bmxvYWQgPSBmbjtcclxuICAgICAgICAgICAgZGF0YURubExuay5jbGljaygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZChkb2N1bWVudC5ib2R5LCBkYXRhRG5sTG5rKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0IGRpc3BsYXlSZWNGaWxlKGRpc3BsYXlSZWNGaWxlOiBTcHJSZWNvcmRpbmdGaWxlIHwgbnVsbCkge1xyXG4gICAgdGhpcy5fZGlzcGxheVJlY0ZpbGUgPSBkaXNwbGF5UmVjRmlsZTtcclxuICAgIGlmICh0aGlzLl9kaXNwbGF5UmVjRmlsZSkge1xyXG4gICAgICBsZXQgYWI6IEF1ZGlvQnVmZmVyfG51bGwgPSB0aGlzLl9kaXNwbGF5UmVjRmlsZS5hdWRpb0J1ZmZlcjtcclxuICAgICAgaWYoYWIpIHtcclxuICAgICAgICB0aGlzLmRpc3BsYXlBdWRpb0NsaXAgPSBuZXcgQXVkaW9DbGlwKGFiKTtcclxuICAgICAgICB0aGlzLmNvbnRyb2xBdWRpb1BsYXllci5hdWRpb0NsaXAgPSB0aGlzLmRpc3BsYXlBdWRpb0NsaXA7XHJcbiAgICAgIH1lbHNlIHtcclxuICAgICAgICAvLyBjbGVhciBmb3Igbm93IC4uLlxyXG4gICAgICAgIHRoaXMuZGlzcGxheUF1ZGlvQ2xpcCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5jb250cm9sQXVkaW9QbGF5ZXIuYXVkaW9DbGlwID0gbnVsbDtcclxuICAgICAgICBpZiAodGhpcy5fY29udHJvbEF1ZGlvUGxheWVyICYmIHRoaXMuX3Nlc3Npb24pIHtcclxuICAgICAgICAgIC8vLi4uIGFuZCB0cnkgdG8gZmV0Y2ggZnJvbSBzZXJ2ZXJcclxuICAgICAgICAgIHRoaXMuYXVkaW9GZXRjaFN1YnNjcmlwdGlvbiA9IHRoaXMucmVjRmlsZVNlcnZpY2UuZmV0Y2hBbmRBcHBseVNwclJlY29yZGluZ0ZpbGUodGhpcy5fY29udHJvbEF1ZGlvUGxheWVyLmNvbnRleHQsIHRoaXMuX3Nlc3Npb24ucHJvamVjdCwgdGhpcy5fZGlzcGxheVJlY0ZpbGUpLnN1YnNjcmliZSgocmYpID0+IHtcclxuICAgICAgICAgICAgbGV0IGZhYiA9IG51bGw7XHJcbiAgICAgICAgICAgIGlmIChyZiAmJiB0aGlzLl9kaXNwbGF5UmVjRmlsZSkge1xyXG4gICAgICAgICAgICAgIGZhYiA9IHRoaXMuX2Rpc3BsYXlSZWNGaWxlLmF1ZGlvQnVmZmVyO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMuc3RhdHVzTXNnID0gJ1JlY29yZGluZyBmaWxlIGNvdWxkIG5vdCBiZSBsb2FkZWQuJ1xyXG4gICAgICAgICAgICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChmYWIpe1xyXG4gICAgICAgICAgICAgIHRoaXMuZGlzcGxheUF1ZGlvQ2xpcCA9IG5ldyBBdWRpb0NsaXAoZmFiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xBdWRpb1BsYXllci5hdWRpb0NsaXAgPXRoaXMuZGlzcGxheUF1ZGlvQ2xpcFxyXG4gICAgICAgICAgICB0aGlzLnNob3dSZWNvcmRpbmcoKTtcclxuXHJcbiAgICAgICAgICB9LCBlcnIgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQ291bGQgbm90IGxvYWQgcmVjb3JkaW5nIGZpbGUgZnJvbSBzZXJ2ZXI6IFwiICsgZXJyKVxyXG4gICAgICAgICAgICB0aGlzLnN0YXR1c01zZyA9ICdSZWNvcmRpbmcgZmlsZSBjb3VsZCBub3QgYmUgbG9hZGVkOiAnICsgZXJyXHJcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJ1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIHRoaXMuc3RhdHVzTXNnID0gJ1JlY29yZGluZyBmaWxlIGNvdWxkIG5vdCBiZSBkZWNvZGVkLiBBdWRpbyBjb250ZXh0IHVuYXZhaWxhYmxlLidcclxuICAgICAgICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJ1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZGlzcGxheUF1ZGlvQ2xpcCA9IG51bGw7XHJcbiAgICAgIHRoaXMuY29udHJvbEF1ZGlvUGxheWVyLmF1ZGlvQ2xpcCA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgZGlzcGxheVJlY0ZpbGUoKTogU3ByUmVjb3JkaW5nRmlsZSB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Rpc3BsYXlSZWNGaWxlO1xyXG4gIH1cclxuXHJcbiAgc2hvd1JlY29yZGluZygpIHtcclxuICAgIHRoaXMuY29udHJvbEF1ZGlvUGxheWVyLnN0b3AoKTtcclxuXHJcbiAgICBpZiAodGhpcy5kaXNwbGF5QXVkaW9DbGlwKSB7XHJcblxyXG4gICAgICB0aGlzLmxldmVsTWVhc3VyZS5jYWxjQnVmZmVyTGV2ZWxJbmZvcyh0aGlzLmRpc3BsYXlBdWRpb0NsaXAuYnVmZmVyLCBMRVZFTF9CQVJfSU5URVJWQUxMX1NFQ09ORFMpLnRoZW4oKGxldmVsSW5mb3MpID0+IHtcclxuICAgICAgICB0aGlzLmRpc3BsYXlMZXZlbEluZm9zID0gbGV2ZWxJbmZvcztcclxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMucGxheVN0YXJ0QWN0aW9uLmRpc2FibGVkID0gZmFsc2U7XHJcblxyXG4gICAgfSBlbHNlIHtcclxuXHJcbiAgICAgIC8vIFRPRE9cclxuICAgICAgLy8gU2V0dGluZyB0byBudWxsIGRvZXMgbm90IHRyaWdnZXIgYSBjaGFuZ2UgaWYgaXQgd2FzICBudWxsIGJlZm9yZSAoaGFwcGVucyBhZnRlciBuZXh0aXRlbSgpIGluIEFVVE9QUk9HUkVTUyBtb2RlKVxyXG4gICAgICAvLyBUaGUgbGV2ZWwgYmFyIGRpc3BsYXkgZG9lcyBub3QgY2xlYXIsIGl0IHNob3dzIHRoZSBsYXN0IGNhcHR1cmVkIHN0cmVhbVxyXG4gICAgICB0aGlzLmRpc3BsYXlMZXZlbEluZm9zID0gbnVsbDtcclxuXHJcbiAgICAgIHRoaXMucGxheVN0YXJ0QWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgIC8vIENvbGxhcHNlIGF1ZGlvIHNpZ25hbCBkaXNwbGF5IGlmIG9wZW5cclxuICAgICAgaWYgKCF0aGlzLmF1ZGlvU2lnbmFsQ29sbGFwc2VkKSB7XHJcbiAgICAgICAgdGhpcy5hdWRpb1NpZ25hbENvbGxhcHNlZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcblxyXG4gIGlzUmVjb3JkaW5nSXRlbSgpOmJvb2xlYW57XHJcbiAgICByZXR1cm4odGhpcy5wcm9tcHRJdGVtIT1udWxsICYmIHRoaXMucHJvbXB0SXRlbS50eXBlIT09J25vbnJlY29yZGluZycpXHJcbiAgfVxyXG5cclxuICB1cGRhdGVTdGFydEFjdGlvbkRpc2FibGVTdGF0ZSgpe1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0YXJ0QWN0aW9uLmRpc2FibGVkPSEodGhpcy5hYyAgJiYgdGhpcy5pc1JlY29yZGluZ0l0ZW0oKSk7XHJcbiAgfVxyXG5cclxuICBhcHBseUl0ZW0odGVtcG9yYXJ5PWZhbHNlKSB7XHJcblxyXG4gICAgdGhpcy5zZWN0aW9uID0gdGhpcy5fc2NyaXB0LnNlY3Rpb25zW3RoaXMuc2VjdElkeF1cclxuICAgIHRoaXMuZ3JvdXAgPSB0aGlzLnNlY3Rpb24uX3NodWZmbGVkR3JvdXBzW3RoaXMuZ3JvdXBJZHhJblNlY3Rpb25dO1xyXG4gICAgdGhpcy5wcm9tcHRJdGVtID0gdGhpcy5ncm91cC5fc2h1ZmZsZWRQcm9tcHRJdGVtc1t0aGlzLnByb21wdEl0ZW1JZHhJbkdyb3VwXTtcclxuXHJcbiAgICAvL3RoaXMuc2VsZWN0ZWRJdGVtSWR4ID0gdGhpcy5wcm9tcHRJbmRleDtcclxuXHJcbiAgICBpZih0aGlzLmF1ZGlvRmV0Y2hTdWJzY3JpcHRpb24pe1xyXG4gICAgICB0aGlzLmF1ZGlvRmV0Y2hTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2xlYXJQcm9tcHQoKTtcclxuXHJcbiAgICBsZXQgaXNOb25yZWNvcmRpbmc9KHRoaXMucHJvbXB0SXRlbS50eXBlPT09J25vbnJlY29yZGluZycpXHJcblxyXG4gICAgaWYgKGlzTm9ucmVjb3JkaW5nIHx8ICF0aGlzLnNlY3Rpb24ucHJvbXB0cGhhc2UgfHwgdGhpcy5zZWN0aW9uLnByb21wdHBoYXNlID09PSAnSURMRScpIHtcclxuICAgICAgdGhpcy5hcHBseVByb21wdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmKGlzTm9ucmVjb3JkaW5nKXtcclxuICAgICAgdGhpcy5zdGFydFN0b3BTaWduYWxTdGF0ZSA9IFN0YXJ0U3RvcFNpZ25hbFN0YXRlLk9GRjtcclxuICAgIH1lbHNlIHtcclxuICAgICAgaWYgKHRoaXMuaXRlbXMpIHtcclxuICAgICAgICBsZXQgaXQgPSB0aGlzLml0ZW1zW3RoaXMucHJvbXB0SW5kZXhdO1xyXG4gICAgICAgIGlmICghaXQucmVjcykge1xyXG4gICAgICAgICAgaXQucmVjcyA9IG5ldyBBcnJheTxTcHJSZWNvcmRpbmdGaWxlPigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHJlY2VudFJlY0ZpbGU6IFNwclJlY29yZGluZ0ZpbGUgfCBudWxsID0gbnVsbDtcclxuICAgICAgICBsZXQgYXZhaWxSZWNmaWxlczogbnVtYmVyID0gaXQucmVjcy5sZW5ndGg7XHJcbiAgICAgICAgaWYgKGF2YWlsUmVjZmlsZXMgPiAwKSB7XHJcbiAgICAgICAgICBsZXQgcmZWZXJzOiBudW1iZXIgPSBhdmFpbFJlY2ZpbGVzIC0gMTtcclxuICAgICAgICAgIHJlY2VudFJlY0ZpbGUgPSBpdC5yZWNzW3JmVmVyc107XHJcbiAgICAgICAgICB0aGlzLmRpc3BsYXlSZWNGaWxlID0gcmVjZW50UmVjRmlsZTtcclxuICAgICAgICAgIHRoaXMuZGlzcGxheVJlY0ZpbGVWZXJzaW9uID0gcmZWZXJzO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5kaXNwbGF5UmVjRmlsZSA9IG51bGw7XHJcbiAgICAgICAgICB0aGlzLmRpc3BsYXlSZWNGaWxlVmVyc2lvbiA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmICghdGVtcG9yYXJ5KSB7XHJcbiAgICAgICAgdGhpcy5zaG93UmVjb3JkaW5nKCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYoIXRoaXMucmVhZG9ubHkpIHtcclxuICAgICAgICB0aGlzLnN0YXJ0U3RvcFNpZ25hbFN0YXRlID0gU3RhcnRTdG9wU2lnbmFsU3RhdGUuSURMRTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy51cGRhdGVTdGFydEFjdGlvbkRpc2FibGVTdGF0ZSgpXHJcbiAgICB0aGlzLnVwZGF0ZU5hdmlnYXRpb25BY3Rpb25zKClcclxuICB9XHJcblxyXG5cclxuICBzdGFydCgpIHtcclxuICAgIHN1cGVyLnN0YXJ0KCk7XHJcbiAgICBpZih0aGlzLnByb21wdEl0ZW1Db3VudD4wKSB7XHJcbiAgICAgIHRoaXMucHJvbXB0SW5kZXggPSAwO1xyXG4gICAgfVxyXG4gICAgdGhpcy5lbmFibGVOYXZpZ2F0aW9uKClcclxuICB9XHJcblxyXG4gIGlzUmVjb3JkaW5nKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICh0aGlzLnN0YXR1cyA9PT0gU3RhdHVzLlBSRV9SRUNPUkRJTkcgfHwgdGhpcy5zdGF0dXMgPT09IFN0YXR1cy5SRUNPUkRJTkcpO1xyXG4gIH1cclxuXHJcbiAgaXNBY3RpdmUoKTogYm9vbGVhbntcclxuICAgIHJldHVybiAoISh0aGlzLnN0YXR1cyA9PT0gU3RhdHVzLkJMT0NLRUQgfHwgdGhpcy5zdGF0dXM9PT0gU3RhdHVzLklETEUgfHwgdGhpcy5zdGF0dXM9PT1TdGF0dXMuRVJST1IpIHx8IHRoaXMucHJvY2Vzc2luZ1JlY29yZGluZyB8fCB0aGlzLnNlc3Npb25TZXJ2aWNlLnVwbG9hZENvdW50PjApXHJcbiAgfVxyXG5cclxuICAgIHByZXZJdGVtKCkge1xyXG4gICAgICAgbGV0IG5ld1BySWR4PXRoaXMuX3Byb21wdEluZGV4O1xyXG4gICAgICAgbmV3UHJJZHgtLTtcclxuICAgICAgIGlmKG5ld1BySWR4PDApe1xyXG4gICAgICAgICBuZXdQcklkeD10aGlzLnByb21wdEl0ZW1Db3VudC0xO1xyXG4gICAgICAgfVxyXG4gICAgICAgdGhpcy5wcm9tcHRJbmRleD1uZXdQcklkeDtcclxuICAgICAgLy90aGlzLnVwZGF0ZU5hdmlnYXRpb25BY3Rpb25zKClcclxuICAgIH1cclxuXHJcblxyXG4gIG5leHRJdGVtKCkge1xyXG4gICAgbGV0IG5ld1BySWR4PXRoaXMuX3Byb21wdEluZGV4O1xyXG4gICAgbmV3UHJJZHgrKztcclxuICAgIGlmKG5ld1BySWR4Pj10aGlzLnByb21wdEl0ZW1Db3VudCl7XHJcbiAgICAgIG5ld1BySWR4PTA7XHJcbiAgICB9XHJcbiAgICB0aGlzLnByb21wdEluZGV4PW5ld1BySWR4O1xyXG4gICAgLy90aGlzLnVwZGF0ZU5hdmlnYXRpb25BY3Rpb25zKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZU5hdmlnYXRpb25BY3Rpb25zKCl7XHJcbiAgICBsZXQgZndkTnh0QWN0aW9uRGlzYWJsZWQ9dHJ1ZTtcclxuICAgIGlmKHRoaXMuaXRlbXMpe1xyXG4gICAgICBsZXQgY3VyclJlY3M9dGhpcy5pdGVtc1t0aGlzLl9wcm9tcHRJbmRleF0ucmVjcztcclxuICAgICAgZndkTnh0QWN0aW9uRGlzYWJsZWQ9ICEgKGN1cnJSZWNzIT1udWxsICYmIGN1cnJSZWNzLmxlbmd0aD4wKTtcclxuICAgIH1cclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5md2ROZXh0QWN0aW9uLmRpc2FibGVkID0gdGhpcy5uYXZpZ2F0aW9uRGlzYWJsZWQgfHwgZndkTnh0QWN0aW9uRGlzYWJsZWQ7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuZndkQWN0aW9uLmRpc2FibGVkID0gdGhpcy5uYXZpZ2F0aW9uRGlzYWJsZWQ7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuYndkQWN0aW9uLmRpc2FibGVkID0gdGhpcy5uYXZpZ2F0aW9uRGlzYWJsZWQ7XHJcbiAgfVxyXG5cclxuICBuZXh0VW5yZWNvcmRlZEl0ZW0oKSB7XHJcbiAgICBsZXQgbmV3UHJJZHggPSB0aGlzLl9wcm9tcHRJbmRleDtcclxuICAgIG5ld1BySWR4Kys7XHJcbiAgICBpZiAobmV3UHJJZHggPj0gdGhpcy5wcm9tcHRJdGVtQ291bnQpIHtcclxuICAgICAgbmV3UHJJZHggPSAwO1xyXG4gICAgfVxyXG4gICAgaWYodGhpcy5pdGVtcyE9bnVsbCkge1xyXG4gICAgICBsZXQgaXRSZWNzPXRoaXMuaXRlbXNbbmV3UHJJZHhdLnJlY3M7XHJcbiAgICAgIHdoaWxlIChpdFJlY3MhPW51bGwgJiYgKGl0UmVjcy5sZW5ndGggPiAwKSAmJiBuZXdQcklkeCA8IHRoaXMucHJvbXB0SXRlbUNvdW50KSB7XHJcbiAgICAgICAgbmV3UHJJZHgrKztcclxuICAgICAgICBpdFJlY3M9dGhpcy5pdGVtc1tuZXdQcklkeF0ucmVjcztcclxuICAgICAgfVxyXG4gICAgICBpZiAoIWl0UmVjcyB8fCBpdFJlY3MubGVuZ3RoID09IDApIHtcclxuICAgICAgICB0aGlzLnByb21wdEluZGV4ID0gbmV3UHJJZHg7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGVuYWJsZVN0YXJ0VXNlckdlc3R1cmUoKSB7XHJcbiAgICBzdXBlci5lbmFibGVTdGFydFVzZXJHZXN0dXJlKCk7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RhcnRBY3Rpb24uZGlzYWJsZWQ9ISh0aGlzLmFjICYmIHRoaXMuaXNSZWNvcmRpbmdJdGVtKCkpO1xyXG4gIH1cclxuXHJcbiAgZW5hYmxlTmF2aWdhdGlvbigpe1xyXG4gICAgdGhpcy5uYXZpZ2F0aW9uRGlzYWJsZWQ9ZmFsc2U7XHJcbiAgICB0aGlzLnVwZGF0ZU5hdmlnYXRpb25BY3Rpb25zKCk7XHJcbiAgfVxyXG5cclxuICBvcGVuZWQoKSB7XHJcbiAgICBpZih0aGlzLmFjKSB7XHJcbiAgICAgIHRoaXMuYWMuc3RhcnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXJ0ZWQoKSB7XHJcbiAgICB0aGlzLnN0YXR1cyA9IFN0YXR1cy5QUkVfUkVDT1JESU5HO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0YXJ0QWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMuc3RhcnRTdG9wU2lnbmFsU3RhdGUgPSBTdGFydFN0b3BTaWduYWxTdGF0ZS5QUkVSRUNPUkRJTkc7XHJcbiAgICBpZih0aGlzLl9zZXNzaW9uKSB7XHJcbiAgICAgIGlmICh0aGlzLl9zZXNzaW9uLnN0YXR1cyA9PT0gXCJMT0FERURcIikge1xyXG4gICAgICAgIGxldCBib2R5OiBhbnkgPSB7fTtcclxuICAgICAgICBpZiAodGhpcy5zZWN0aW9uLnRyYWluaW5nKSB7XHJcbiAgICAgICAgICB0aGlzLl9zZXNzaW9uLnN0YXR1cyA9IFwiU1RBUlRFRF9UUkFJTklOR1wiXHJcbiAgICAgICAgICBib2R5LnN0YXR1cyA9IHRoaXMuX3Nlc3Npb24uc3RhdHVzO1xyXG4gICAgICAgICAgaWYgKCF0aGlzLl9zZXNzaW9uLnN0YXJ0ZWRUcmFpbmluZ0RhdGUpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2Vzc2lvbi5zdGFydGVkVHJhaW5pbmdEYXRlID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgYm9keS5zdGFydGVkVHJhaW5pbmdEYXRlID0gdGhpcy5fc2Vzc2lvbi5zdGFydGVkVHJhaW5pbmdEYXRlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLl9zZXNzaW9uLnN0YXR1cyA9IFwiU1RBUlRFRFwiXHJcbiAgICAgICAgICBib2R5LnN0YXR1cyA9IHRoaXMuX3Nlc3Npb24uc3RhdHVzO1xyXG4gICAgICAgICAgaWYgKCF0aGlzLl9zZXNzaW9uLnN0YXJ0ZWREYXRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Nlc3Npb24uc3RhcnRlZERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICBib2R5LnN0YXJ0ZWREYXRlID0gdGhpcy5fc2Vzc2lvbi5zdGFydGVkRGF0ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZXNzaW9uU2VydmljZS5wYXRjaFNlc3Npb25PYnNlcnZlcih0aGlzLl9zZXNzaW9uLCBib2R5KS5zdWJzY3JpYmUoKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zZWN0aW9uLnByb21wdHBoYXNlID09PSAnUFJFUkVDT1JESU5HJykge1xyXG4gICAgICB0aGlzLmFwcGx5UHJvbXB0KCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZSA9ICdpbmZvJztcclxuICAgIHRoaXMuc3RhdHVzTXNnID0gJ1JlY29yZGluZy4uLic7XHJcblxyXG4gICAgbGV0IHByZURlbGF5ID0gREVGQVVMVF9QUkVfUkVDX0RFTEFZO1xyXG4gICAgaWYgKHRoaXMucHJvbXB0SXRlbS5wcmVyZWNvcmRpbmcpIHtcclxuICAgICAgcHJlRGVsYXkgPSB0aGlzLnByb21wdEl0ZW0ucHJlcmVjb3JkaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBwb3N0RGVsYXk9REVGQVVMVF9QT1NUX1JFQ19ERUxBWTtcclxuICAgIGlmKHRoaXMucHJvbXB0SXRlbS5wb3N0cmVjb3JkaW5nKXtcclxuICAgICAgcG9zdERlbGF5PXRoaXMucHJvbXB0SXRlbS5wb3N0cmVjb3JkaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBtYXhSZWNvcmRpbmdUaW1lTXMgPSBNQVhfUkVDT1JESU5HX1RJTUVfTVM7XHJcbiAgICBpZiAodGhpcy5wcm9tcHRJdGVtLnJlY2R1cmF0aW9uKSB7XHJcbiAgICAgIG1heFJlY29yZGluZ1RpbWVNcyA9IHByZURlbGF5K3RoaXMucHJvbXB0SXRlbS5yZWNkdXJhdGlvbitwb3N0RGVsYXk7XHJcbiAgICB9XHJcbiAgICB0aGlzLm1heFJlY1RpbWVySWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuc3RvcFJlY29yZGluZ01heFJlYygpXHJcbiAgICB9LCBtYXhSZWNvcmRpbmdUaW1lTXMpO1xyXG4gICAgdGhpcy5tYXhSZWNUaW1lclJ1bm5pbmcgPSB0cnVlO1xyXG5cclxuXHJcblxyXG4gICAgdGhpcy5wcmVSZWNUaW1lcklkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG5cclxuICAgICAgdGhpcy5wcmVSZWNUaW1lclJ1bm5pbmcgPSBmYWxzZTtcclxuICAgICAgdGhpcy5zdGF0dXMgPSBTdGF0dXMuUkVDT1JESU5HO1xyXG4gICAgICB0aGlzLnN0YXJ0U3RvcFNpZ25hbFN0YXRlID0gU3RhcnRTdG9wU2lnbmFsU3RhdGUuUkVDT1JESU5HO1xyXG4gICAgICBpZiAodGhpcy5zZWN0aW9uLm1vZGUgPT09ICdBVVRPUkVDT1JESU5HJykge1xyXG4gICAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5uZXh0QWN0aW9uLmRpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnBhdXNlQWN0aW9uLmRpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0b3BBY3Rpb24uZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5zZWN0aW9uLnByb21wdHBoYXNlID09PSAnUkVDT1JESU5HJykge1xyXG4gICAgICAgIHRoaXMuYXBwbHlQcm9tcHQoKTtcclxuICAgICAgfVxyXG4gICAgfSwgcHJlRGVsYXkpO1xyXG4gICAgdGhpcy5wcmVSZWNUaW1lclJ1bm5pbmcgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgc3RvcEl0ZW0oKSB7XHJcbiAgICB0aGlzLnN0YXR1cyA9IFN0YXR1cy5QT1NUX1JFQ19TVE9QO1xyXG4gICAgdGhpcy5zdGFydFN0b3BTaWduYWxTdGF0ZSA9IFN0YXJ0U3RvcFNpZ25hbFN0YXRlLlBPU1RSRUNPUkRJTkc7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RvcEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMubmV4dEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICBsZXQgcG9zdERlbGF5ID0gNTAwO1xyXG4gICAgaWYgKHRoaXMucHJvbXB0SXRlbS5wb3N0cmVjb3JkaW5nKSB7XHJcbiAgICAgIHBvc3REZWxheSA9IHRoaXMucHJvbXB0SXRlbS5wb3N0cmVjb3JkaW5nO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wb3N0UmVjVGltZXJJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5wb3N0UmVjVGltZXJSdW5uaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuc3RhdHVzID0gU3RhdHVzLlNUT1BQSU5HX1NUT1A7XHJcbiAgICAgIHRoaXMuc3RvcFJlY29yZGluZygpO1xyXG4gICAgfSwgcG9zdERlbGF5KTtcclxuICAgIHRoaXMucG9zdFJlY1RpbWVyUnVubmluZyA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBwYXVzZUl0ZW0oKSB7XHJcbiAgICB0aGlzLnN0YXR1cyA9IFN0YXR1cy5QT1NUX1JFQ19QQVVTRTtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5wYXVzZUFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLnN0YXJ0U3RvcFNpZ25hbFN0YXRlID0gU3RhcnRTdG9wU2lnbmFsU3RhdGUuUE9TVFJFQ09SRElORztcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdG9wQWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5uZXh0QWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5wYXVzZUFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICBsZXQgcG9zdERlbGF5ID0gNTAwO1xyXG4gICAgaWYgKHRoaXMucHJvbXB0SXRlbS5wb3N0cmVjb3JkaW5nKSB7XHJcbiAgICAgIHBvc3REZWxheSA9IHRoaXMucHJvbXB0SXRlbS5wb3N0cmVjb3JkaW5nO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICB0aGlzLnBvc3RSZWNUaW1lcklkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnBvc3RSZWNUaW1lclJ1bm5pbmcgPSBmYWxzZTtcclxuICAgICAgdGhpcy5zdGF0dXMgPSBTdGF0dXMuU1RPUFBJTkdfUEFVU0U7XHJcbiAgICAgIHRoaXMuc3RvcFJlY29yZGluZygpO1xyXG4gICAgfSwgcG9zdERlbGF5KTtcclxuICAgIHRoaXMucG9zdFJlY1RpbWVyUnVubmluZyA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBzdG9wUmVjb3JkaW5nKCkge1xyXG4gICAgaWYgKHRoaXMubWF4UmVjVGltZXJSdW5uaW5nKSB7XHJcbiAgICAgIGlmKHRoaXMubWF4UmVjVGltZXJJZCkge1xyXG4gICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5tYXhSZWNUaW1lcklkKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLm1heFJlY1RpbWVyUnVubmluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYodGhpcy5hYykge1xyXG4gICAgICB0aGlzLmFjLnN0b3AoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0b3BSZWNvcmRpbmdNYXhSZWMoKXtcclxuICAgIGlmKHRoaXMucG9zdFJlY1RpbWVyUnVubmluZyl7XHJcbiAgICAgIGlmKHRoaXMucG9zdFJlY1RpbWVySWQpIHtcclxuICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMucG9zdFJlY1RpbWVySWQpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucG9zdFJlY1RpbWVyUnVubmluZz1mYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMubWF4UmVjVGltZXJSdW5uaW5nID0gZmFsc2U7XHJcbiAgICB0aGlzLnN0YXR1cyA9IFN0YXR1cy5TVE9QUElOR19TVE9QO1xyXG4gICAgaWYodGhpcy5hYykge1xyXG4gICAgICB0aGlzLmFjLnN0b3AoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZFJlY29yZGluZ0ZpbGVCeURlc2NyaXB0b3IocmZkOlJlY29yZGluZ0ZpbGVEZXNjcmlwdG9ySW1wbCl7XHJcbiAgICBpZihyZmQucmVjb3JkaW5nICYmIHJmZC5yZWNvcmRpbmcuaXRlbWNvZGUpIHtcclxuICAgICAgbGV0IHBySWR4ID0gdGhpcy5wcm9tcHRJbmRleEJ5SXRlbWNvZGUocmZkLnJlY29yZGluZy5pdGVtY29kZSk7XHJcbiAgICAgIGlmICh0aGlzLml0ZW1zIT1udWxsICYmIHBySWR4ICE9PSBudWxsKSB7XHJcbiAgICAgICAgbGV0IGl0ID0gdGhpcy5pdGVtc1twcklkeF07XHJcbiAgICAgICAgaWYgKGl0ICYmIHRoaXMuX3Nlc3Npb24pIHtcclxuICAgICAgICAgIGlmICghaXQucmVjcykge1xyXG4gICAgICAgICAgICBpdC5yZWNzID0gbmV3IEFycmF5PFNwclJlY29yZGluZ0ZpbGU+KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBsZXQgcmYgPSBuZXcgU3ByUmVjb3JkaW5nRmlsZSh0aGlzLl9zZXNzaW9uLnNlc3Npb25JZCwgcmZkLnJlY29yZGluZy5pdGVtY29kZSwgcmZkLnZlcnNpb24sIG51bGwpO1xyXG4gICAgICAgICAgaXQucmVjc1tyZmQudmVyc2lvbl0gPSByZjtcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIldBUk46IE5vIHJlY29yZGluZyBpdGVtIHdpdGggY29kZTogXFxcIlwiICtyZmQucmVjb3JkaW5nLml0ZW1jb2RlKyBcIlxcXCIgZm91bmQuXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJXQVJOOiBObyByZWNvcmRpbmcgaXRlbSB3aXRoIGNvZGU6IFxcXCJcIiArcmZkLnJlY29yZGluZy5pdGVtY29kZSsgXCJcXFwiIGZvdW5kLlwiKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkUmVjb3JkaW5nRmlsZUJ5UHJvbXB0SW5kZXgocHJvbXB0SW5kZXg6bnVtYmVyLCByZjpTcHJSZWNvcmRpbmdGaWxlKXtcclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgc3RvcHBlZCgpIHtcclxuICAgIHRoaXMudXBkYXRlU3RhcnRBY3Rpb25EaXNhYmxlU3RhdGUoKVxyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0b3BBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLm5leHRBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnBhdXNlQWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2luZm8nO1xyXG4gICAgdGhpcy5zdGF0dXNNc2cgPSAnUmVjb3JkZWQuJztcclxuICAgIHRoaXMuc3RhcnRTdG9wU2lnbmFsU3RhdGUgPSBTdGFydFN0b3BTaWduYWxTdGF0ZS5JRExFO1xyXG5cclxuICAgIGxldCBhZDpBdWRpb0J1ZmZlcnxudWxsID0gbnVsbDtcclxuICAgIGlmKHRoaXMuYWMhPW51bGwpe1xyXG4gICAgICBhZD10aGlzLmFjLmF1ZGlvQnVmZmVyKCk7XHJcbiAgICB9XHJcbiAgICBsZXQgaWMgPSB0aGlzLnByb21wdEl0ZW0uaXRlbWNvZGU7XHJcbiAgICBsZXQgcmY9bnVsbDtcclxuICAgIGlmICh0aGlzLl9zZXNzaW9uICYmIGljKSB7XHJcbiAgICAgIGxldCBzZXNzSWQ6IHN0cmluZyB8IG51bWJlciA9IHRoaXMuX3Nlc3Npb24uc2Vzc2lvbklkO1xyXG4gICAgICBsZXQgY3BJZHggPSB0aGlzLnByb21wdEluZGV4O1xyXG4gICAgICBpZiAodGhpcy5pdGVtcykge1xyXG4gICAgICAgIGxldCBpdD10aGlzLml0ZW1zW2NwSWR4XTtcclxuICAgICAgICBpZiAoIWl0LnJlY3MpIHtcclxuICAgICAgICAgIGl0LnJlY3MgPSBuZXcgQXJyYXk8U3ByUmVjb3JkaW5nRmlsZT4oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmYgPSBuZXcgU3ByUmVjb3JkaW5nRmlsZShzZXNzSWQsIGljLCBpdC5yZWNzLmxlbmd0aCwgYWQpO1xyXG4gICAgICAgIGl0LnJlY3MucHVzaChyZik7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuZW5hYmxlVXBsb2FkUmVjb3JkaW5ncykge1xyXG4gICAgICAgIC8vIFRPRE8gdXNlIFNwZWVjaFJlY29yZGVyY29uZmlnIHJlc3AuIFJlY2ZpbGVTZXJ2aWNlXHJcbiAgICAgICAgLy8gY29udmVydCBhc3luY2hyb25vdXNseSB0byAxNi1iaXQgaW50ZWdlciBQQ01cclxuICAgICAgICAvLyBUT0RPIGNvdWxkIHdlIGF2b2lkIGNvbnZlcnNpb24gdG8gc2F2ZSBDUFUgcmVzb3VyY2VzIGFuZCB0cmFuc2ZlciBmbG9hdCBQQ00gZGlyZWN0bHk/XHJcbiAgICAgICAgLy8gVE9ETyBkdXBsaWNhdGUgY29udmVyc2lvbiBmb3IgbWFudWFsIGRvd25sb2FkXHJcbiAgICAgICAgLy9jb25zb2xlLmxvZyhcIkJ1aWxkIHdhdiB3cml0ZXIuLi5cIik7XHJcbiAgICAgICAgdGhpcy5wcm9jZXNzaW5nUmVjb3JkaW5nPXRydWVcclxuICAgICAgICBpZihhZCAmJiByZikge1xyXG4gICAgICAgICAgbGV0IHd3ID0gbmV3IFdhdldyaXRlcigpO1xyXG4gICAgICAgICAgLy9uZXcgUkVTVCBBUEkgVVJMXHJcbiAgICAgICAgICBsZXQgYXBpRW5kUG9pbnQgPSAnJztcclxuICAgICAgICAgIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5hcGlFbmRQb2ludCkge1xyXG4gICAgICAgICAgICBhcGlFbmRQb2ludCA9IHRoaXMuY29uZmlnLmFwaUVuZFBvaW50O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGFwaUVuZFBvaW50ICE9PSAnJykge1xyXG4gICAgICAgICAgICBhcGlFbmRQb2ludCA9IGFwaUVuZFBvaW50ICsgJy8nXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBsZXQgc2Vzc2lvbnNVcmwgPSBhcGlFbmRQb2ludCArIFNlc3Npb25TZXJ2aWNlLlNFU1NJT05fQVBJX0NUWDtcclxuICAgICAgICAgIGxldCByZWNVcmw6IHN0cmluZyA9IHNlc3Npb25zVXJsICsgJy8nICsgcmYuc2Vzc2lvbiArICcvJyArIFJFQ0ZJTEVfQVBJX0NUWCArICcvJyArIHJmLml0ZW1Db2RlO1xyXG4gICAgICAgICAgd3cud3JpdGVBc3luYyhhZCwgKHdhdkZpbGUpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5wb3N0UmVjb3JkaW5nKHdhdkZpbGUsIHJlY1VybCk7XHJcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc2luZ1JlY29yZGluZyA9IGZhbHNlXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBjaGVjayBjb21wbGV0ZSBzZXNzaW9uXHJcbiAgICBsZXQgY29tcGxldGUgPSB0cnVlO1xyXG4gICAgaWYodGhpcy5pdGVtcykge1xyXG4gICAgICAvLyBzZWFyY2ggYmFja3dhcmRzLCB0byBnYWluIGZhc3RlciBkZXRlY3Rpb24gb2YgaW5jb21wbGV0ZSBzdGF0ZVxyXG4gICAgICBmb3IgKGxldCByaSA9IHRoaXMuaXRlbXMubGVuZ3RoIC0gMTsgcmkgPj0gMDsgcmktLSkge1xyXG4gICAgICAgIGxldCBpdCA9IHRoaXMuaXRlbXNbcmldO1xyXG4gICAgICAgIGlmIChpdC5yZWNvcmRpbmcgJiYgIWl0LnRyYWluaW5nICYmICghaXQucmVjcyB8fCBpdC5yZWNzLmxlbmd0aCA9PSAwKSkge1xyXG4gICAgICAgICAgY29tcGxldGUgPSBmYWxzZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBhdXRvU3RhcnQgPSAodGhpcy5zdGF0dXMgPT09IFN0YXR1cy5TVE9QUElOR19TVE9QKTtcclxuICAgIHRoaXMuc3RhdHVzID0gU3RhdHVzLklETEU7XHJcbiAgICBsZXQgc3RhcnROZXh0PWZhbHNlO1xyXG4gICAgaWYgKGNvbXBsZXRlKSB7XHJcbiAgICAgIGlmKHRoaXMuX3Nlc3Npb24hPW51bGwpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX3Nlc3Npb24uc2VhbGVkICYmIHRoaXMuX3Nlc3Npb24uc3RhdHVzICE9PSBcIkNPTVBMRVRFRFwiKSB7XHJcbiAgICAgICAgICBsZXQgYm9keTogYW55ID0ge31cclxuICAgICAgICAgIHRoaXMuX3Nlc3Npb24uc3RhdHVzID0gXCJDT01QTEVURURcIjtcclxuICAgICAgICAgIGJvZHkuc3RhdHVzID0gdGhpcy5fc2Vzc2lvbi5zdGF0dXM7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuX3Nlc3Npb24uY29tcGxldGVkRGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9zZXNzaW9uLmNvbXBsZXRlZERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICBib2R5LmNvbXBsZXRlZERhdGUgPSB0aGlzLl9zZXNzaW9uLmNvbXBsZXRlZERhdGU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnNlc3Npb25TZXJ2aWNlLnBhdGNoU2Vzc2lvbk9ic2VydmVyKHRoaXMuX3Nlc3Npb24sIGJvZHkpLnN1YnNjcmliZSgpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc3RhdHVzTXNnID0gJ1Nlc3Npb24gY29tcGxldGUhJztcclxuICAgICAgbGV0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oU2Vzc2lvbkZpbmlzaGVkRGlhbG9nLCB7fSk7XHJcblxyXG4gICAgICAvLyBlbmFibGUgbmF2aWdhdGlvblxyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuZndkQWN0aW9uLmRpc2FibGVkID0gZmFsc2VcclxuICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLmJ3ZEFjdGlvbi5kaXNhYmxlZCA9IGZhbHNlXHJcbiAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgaWYgKHRoaXMuc2VjdGlvbi5tb2RlID09PSAnQVVUT1BST0dSRVNTJyB8fCB0aGlzLnNlY3Rpb24ubW9kZSA9PT0gJ0FVVE9SRUNPUkRJTkcnKSB7XHJcbiAgICAgICAgdGhpcy5uZXh0SXRlbSgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5zZWN0aW9uLm1vZGUgPT09ICdBVVRPUkVDT1JESU5HJyAmJiB0aGlzLmF1dG9yZWNvcmRpbmcgJiYgYXV0b1N0YXJ0KSB7XHJcbiAgICAgICAgc3RhcnROZXh0PXRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uRGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZU5hdmlnYXRpb25BY3Rpb25zKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGFwcGx5IHJlY29yZGVkIGl0ZW1cclxuICAgIHRoaXMuYXBwbHlJdGVtKHN0YXJ0TmV4dCk7XHJcbiAgICBpZihzdGFydE5leHQpe1xyXG4gICAgICB0aGlzLnN0YXJ0SXRlbSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBwb3N0UmVjb3JkaW5nKHdhdkZpbGU6IFVpbnQ4QXJyYXksIHJlY1VybDogc3RyaW5nKSB7XHJcbiAgICBsZXQgd2F2QmxvYiA9IG5ldyBCbG9iKFt3YXZGaWxlXSwge3R5cGU6ICdhdWRpby93YXYnfSk7XHJcbiAgICBsZXQgdWwgPSBuZXcgVXBsb2FkKHdhdkJsb2IsIHJlY1VybCk7XHJcbiAgICB0aGlzLnVwbG9hZGVyLnF1ZXVlVXBsb2FkKHVsKTtcclxuICB9XHJcblxyXG4gIHN0b3AoKSB7XHJcbiAgICBpZih0aGlzLmFjIT1udWxsKXtcclxuICAgICAgdGhpcy5hYy5jbG9zZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVDb250cm9sUGxheWJhY2tQb3NpdGlvbigpIHtcclxuICAgIGlmICh0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIucGxheVBvc2l0aW9uRnJhbWVzKSB7XHJcbiAgICAgIHRoaXMucHJvbXB0aW5nLmF1ZGlvRGlzcGxheS5wbGF5RnJhbWVQb3NpdGlvbiA9IHRoaXMuX2NvbnRyb2xBdWRpb1BsYXllci5wbGF5UG9zaXRpb25GcmFtZXM7XHJcbiAgICAgIHRoaXMubGl2ZUxldmVsRGlzcGxheS5wbGF5RnJhbWVQb3NpdGlvbiA9IHRoaXMuX2NvbnRyb2xBdWRpb1BsYXllci5wbGF5UG9zaXRpb25GcmFtZXM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhdWRpb1BsYXllclVwZGF0ZShlOiBBdWRpb1BsYXllckV2ZW50KSB7XHJcbiAgICBpZiAoRXZlbnRUeXBlLlJFQURZID09PSBlLnR5cGUpIHtcclxuXHJcbiAgICB9IGVsc2UgaWYgKEV2ZW50VHlwZS5TVEFSVEVEID09PSBlLnR5cGUpIHtcclxuICAgICAgLy90aGlzLnN0YXR1cyA9ICdQbGF5YmFjay4uLic7XHJcbiAgICAgIHRoaXMudXBkYXRlVGltZXJJZCA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB0aGlzLnVwZGF0ZUNvbnRyb2xQbGF5YmFja1Bvc2l0aW9uKCksIDUwKTtcclxuXHJcbiAgICB9IGVsc2UgaWYgKEV2ZW50VHlwZS5FTkRFRCA9PT0gZS50eXBlKSB7XHJcbiAgICAgIC8vLnN0YXR1cz0nUmVhZHkuJztcclxuICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy51cGRhdGVUaW1lcklkKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgaWYoIXRoaXMuZGVzdHJveWVkKSB7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxufVxyXG5cclxuIl19