speechrecorderng 2.25.6 → 2.25.7
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.
- package/esm2020/lib/audio/audio_display.mjs +6 -6
- package/esm2020/lib/audio/audio_player.mjs +6 -6
- package/esm2020/lib/audio/format.mjs +1 -1
- package/esm2020/lib/audio/ui/audio_canvas_layer_comp.mjs +7 -7
- package/esm2020/lib/audio/ui/audio_display_control.mjs +4 -4
- package/esm2020/lib/audio/ui/audio_display_scroll_pane.mjs +4 -4
- package/esm2020/lib/audio/ui/audiosignal.mjs +4 -4
- package/esm2020/lib/audio/ui/container.mjs +4 -4
- package/esm2020/lib/audio/ui/livelevel.mjs +4 -4
- package/esm2020/lib/audio/ui/scroll_pane_horizontal.mjs +4 -4
- package/esm2020/lib/audio/ui/sonagram.mjs +4 -4
- package/esm2020/lib/dsp/utils.mjs +1 -1
- package/esm2020/lib/io/BinaryWriter.mjs +1 -1
- package/esm2020/lib/math/complex.mjs +1 -1
- package/esm2020/lib/math/dft.mjs +1 -1
- package/esm2020/lib/math/utils.mjs +1 -1
- package/esm2020/lib/speechrecorder/project/project.service.mjs +4 -4
- package/esm2020/lib/speechrecorder/recordings/recordings.service.mjs +4 -4
- package/esm2020/lib/speechrecorder/script/script.service.mjs +4 -4
- package/esm2020/lib/speechrecorder/session/audiorecorder.mjs +82 -77
- package/esm2020/lib/speechrecorder/session/basicrecorder.mjs +10 -5
- package/esm2020/lib/speechrecorder/session/controlpanel.mjs +67 -54
- package/esm2020/lib/speechrecorder/session/progress.mjs +4 -4
- package/esm2020/lib/speechrecorder/session/prompting.mjs +33 -29
- package/esm2020/lib/speechrecorder/session/recorder_combi_pane.mjs +15 -12
- package/esm2020/lib/speechrecorder/session/recording_list.mjs +4 -4
- package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +4 -4
- package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +12 -12
- package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +4 -4
- package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +7 -6
- package/esm2020/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +4 -4
- package/esm2020/lib/speechrecorder/session/session.service.mjs +4 -4
- package/esm2020/lib/speechrecorder/session/session_finished_dialog.mjs +4 -4
- package/esm2020/lib/speechrecorder/session/sessionmanager.mjs +76 -72
- package/esm2020/lib/speechrecorder/session/warning_bar.mjs +4 -4
- package/esm2020/lib/speechrecorder/spruploader.mjs +4 -4
- package/esm2020/lib/speechrecorder/startstopsignal/startstopsignal.mjs +1 -1
- package/esm2020/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +4 -4
- package/esm2020/lib/speechrecorderng.component.mjs +4 -4
- package/esm2020/lib/speechrecorderng.module.mjs +8 -8
- package/esm2020/lib/spr.config.mjs +4 -4
- package/esm2020/lib/spr.module.version.mjs +2 -2
- package/esm2020/lib/ui/canvas_layer_comp.mjs +4 -4
- package/esm2020/lib/ui/message_dialog.mjs +4 -4
- package/esm2020/lib/ui/recordingitem_display.mjs +31 -27
- package/esm2020/lib/ui/responsive_component.mjs +24 -0
- package/esm2020/lib/utils/css_utils.mjs +1 -1
- package/esm2020/lib/utils/scrollIntoViewToBottom.mjs +4 -4
- package/fesm2015/speechrecorderng.mjs +401 -345
- package/fesm2015/speechrecorderng.mjs.map +1 -1
- package/fesm2020/speechrecorderng.mjs +401 -345
- package/fesm2020/speechrecorderng.mjs.map +1 -1
- package/lib/speechrecorder/session/audiorecorder.d.ts +6 -4
- package/lib/speechrecorder/session/basicrecorder.d.ts +8 -3
- package/lib/speechrecorder/session/controlpanel.d.ts +9 -3
- package/lib/speechrecorder/session/prompting.d.ts +5 -1
- package/lib/speechrecorder/session/recorder_combi_pane.d.ts +5 -2
- package/lib/speechrecorder/session/recordingfile/recording-file-view.component.d.ts +1 -1
- package/lib/speechrecorder/session/sessionmanager.d.ts +6 -6
- package/lib/speechrecorderng.module.d.ts +17 -18
- package/lib/spr.module.version.d.ts +1 -1
- package/lib/ui/recordingitem_display.d.ts +8 -4
- package/lib/ui/responsive_component.d.ts +9 -0
- package/package.json +1 -1
|
@@ -16,32 +16,30 @@ import { Item } from "./item";
|
|
|
16
16
|
import { LevelBar } from "../../audio/ui/livelevel";
|
|
17
17
|
import { BasicRecorder, LEVEL_BAR_INTERVALL_SECONDS, MAX_RECORDING_TIME_MS, RECFILE_API_CTX } from "./basicrecorder";
|
|
18
18
|
import * as i0 from "@angular/core";
|
|
19
|
-
import * as i1 from "@angular/
|
|
20
|
-
import * as i2 from "
|
|
21
|
-
import * as i3 from "
|
|
22
|
-
import * as i4 from "../
|
|
23
|
-
import * as i5 from "
|
|
24
|
-
import * as i6 from "@angular/
|
|
25
|
-
import * as i7 from "@angular/
|
|
26
|
-
import * as i8 from "
|
|
27
|
-
import * as i9 from "
|
|
28
|
-
import * as i10 from "./
|
|
29
|
-
import * as i11 from "
|
|
30
|
-
import * as i12 from "
|
|
31
|
-
import * as i13 from "
|
|
32
|
-
import * as i14 from "../../spr.config";
|
|
19
|
+
import * as i1 from "@angular/cdk/layout";
|
|
20
|
+
import * as i2 from "@angular/material/dialog";
|
|
21
|
+
import * as i3 from "./session.service";
|
|
22
|
+
import * as i4 from "../recordings/recordings.service";
|
|
23
|
+
import * as i5 from "../spruploader";
|
|
24
|
+
import * as i6 from "@angular/common";
|
|
25
|
+
import * as i7 from "@angular/material/progress-bar";
|
|
26
|
+
import * as i8 from "../../audio/ui/livelevel";
|
|
27
|
+
import * as i9 from "./prompting";
|
|
28
|
+
import * as i10 from "./controlpanel";
|
|
29
|
+
import * as i11 from "../../ui/recordingitem_display";
|
|
30
|
+
import * as i12 from "./warning_bar";
|
|
31
|
+
import * as i13 from "../../spr.config";
|
|
33
32
|
const DEFAULT_PRE_REC_DELAY = 1000;
|
|
34
33
|
const DEFAULT_POST_REC_DELAY = 500;
|
|
35
34
|
export class SessionManager extends BasicRecorder {
|
|
36
|
-
constructor(changeDetectorRef, renderer, dialog, sessionService, recFileService, uploader, config) {
|
|
37
|
-
super(dialog, sessionService, uploader, config);
|
|
35
|
+
constructor(bpo, changeDetectorRef, renderer, dialog, sessionService, recFileService, uploader, config) {
|
|
36
|
+
super(bpo, changeDetectorRef, dialog, sessionService, uploader, config);
|
|
37
|
+
this.bpo = bpo;
|
|
38
38
|
this.changeDetectorRef = changeDetectorRef;
|
|
39
39
|
this.renderer = renderer;
|
|
40
40
|
this.dialog = dialog;
|
|
41
41
|
this.sessionService = sessionService;
|
|
42
42
|
this.recFileService = recFileService;
|
|
43
|
-
this.uploader = uploader;
|
|
44
|
-
this.config = config;
|
|
45
43
|
this.enableUploadRecordings = true;
|
|
46
44
|
this.enableDownloadRecordings = false;
|
|
47
45
|
this.status = 0 /* BLOCKED */;
|
|
@@ -75,7 +73,7 @@ export class SessionManager extends BasicRecorder {
|
|
|
75
73
|
};
|
|
76
74
|
}
|
|
77
75
|
ngOnDestroy() {
|
|
78
|
-
console.debug("Com destroy, disable wake lock.")
|
|
76
|
+
//console.debug("Com destroy, disable wake lock.")
|
|
79
77
|
this.disableWakeLockCond();
|
|
80
78
|
this.destroyed = true;
|
|
81
79
|
// TODO stop capture /playback
|
|
@@ -107,7 +105,7 @@ export class SessionManager extends BasicRecorder {
|
|
|
107
105
|
type: 'error',
|
|
108
106
|
title: 'Error',
|
|
109
107
|
msg: errMsg,
|
|
110
|
-
|
|
108
|
+
advice: 'Please use a supported browser.',
|
|
111
109
|
}
|
|
112
110
|
});
|
|
113
111
|
return;
|
|
@@ -128,7 +126,7 @@ export class SessionManager extends BasicRecorder {
|
|
|
128
126
|
type: 'error',
|
|
129
127
|
title: 'Error',
|
|
130
128
|
msg: errMsg,
|
|
131
|
-
|
|
129
|
+
advice: 'Please use a supported browser.',
|
|
132
130
|
}
|
|
133
131
|
});
|
|
134
132
|
return;
|
|
@@ -152,7 +150,7 @@ export class SessionManager extends BasicRecorder {
|
|
|
152
150
|
type: 'error',
|
|
153
151
|
title: 'Error',
|
|
154
152
|
msg: errMsg,
|
|
155
|
-
|
|
153
|
+
advice: 'Please use a supported browser.',
|
|
156
154
|
}
|
|
157
155
|
});
|
|
158
156
|
return;
|
|
@@ -163,7 +161,7 @@ export class SessionManager extends BasicRecorder {
|
|
|
163
161
|
this.transportActions.fwdAction.onAction = () => this.nextItem();
|
|
164
162
|
this.transportActions.fwdNextAction.onAction = () => this.nextUnrecordedItem();
|
|
165
163
|
this.transportActions.bwdAction.onAction = () => this.prevItem();
|
|
166
|
-
this.playStartAction.onAction = () => this.controlAudioPlayer
|
|
164
|
+
this.playStartAction.onAction = () => this.controlAudioPlayer?.start();
|
|
167
165
|
}
|
|
168
166
|
this.startStopSignalState = 4 /* OFF */;
|
|
169
167
|
}
|
|
@@ -220,9 +218,6 @@ export class SessionManager extends BasicRecorder {
|
|
|
220
218
|
return ((this._session != null) && (this._session.type === 'TEST_DEF_A') && (this.audioDevices != null) && this.audioDevices.length > 0);
|
|
221
219
|
}
|
|
222
220
|
set controlAudioPlayer(controlAudioPlayer) {
|
|
223
|
-
if (this._controlAudioPlayer) {
|
|
224
|
-
//this._controlAudioPlayer.listener=null;
|
|
225
|
-
}
|
|
226
221
|
this._controlAudioPlayer = controlAudioPlayer;
|
|
227
222
|
if (this._controlAudioPlayer) {
|
|
228
223
|
this._controlAudioPlayer.listener = this;
|
|
@@ -412,12 +407,16 @@ export class SessionManager extends BasicRecorder {
|
|
|
412
407
|
let ab = this._displayRecFile.audioBuffer;
|
|
413
408
|
if (ab) {
|
|
414
409
|
this.displayAudioClip = new AudioClip(ab);
|
|
415
|
-
this.
|
|
410
|
+
if (this._controlAudioPlayer) {
|
|
411
|
+
this._controlAudioPlayer.audioClip = this.displayAudioClip;
|
|
412
|
+
}
|
|
416
413
|
}
|
|
417
414
|
else {
|
|
418
415
|
// clear for now ...
|
|
419
416
|
this.displayAudioClip = null;
|
|
420
|
-
this.
|
|
417
|
+
if (this._controlAudioPlayer) {
|
|
418
|
+
this._controlAudioPlayer.audioClip = null;
|
|
419
|
+
}
|
|
421
420
|
if (fetchAndApplyRecordingFile) {
|
|
422
421
|
if (this._controlAudioPlayer && this._session) {
|
|
423
422
|
//... and try to fetch from server
|
|
@@ -436,7 +435,9 @@ export class SessionManager extends BasicRecorder {
|
|
|
436
435
|
// TODO Async will set the previous file with autorecording
|
|
437
436
|
this.displayAudioClip = new AudioClip(fab);
|
|
438
437
|
}
|
|
439
|
-
this.
|
|
438
|
+
if (this._controlAudioPlayer) {
|
|
439
|
+
this._controlAudioPlayer.audioClip = this.displayAudioClip;
|
|
440
|
+
}
|
|
440
441
|
this.showRecording();
|
|
441
442
|
}, err => {
|
|
442
443
|
console.error("Could not load recording file from server: " + err);
|
|
@@ -453,14 +454,18 @@ export class SessionManager extends BasicRecorder {
|
|
|
453
454
|
}
|
|
454
455
|
else {
|
|
455
456
|
this.displayAudioClip = null;
|
|
456
|
-
this.
|
|
457
|
+
if (this._controlAudioPlayer) {
|
|
458
|
+
this._controlAudioPlayer.audioClip = null;
|
|
459
|
+
}
|
|
457
460
|
}
|
|
458
461
|
}
|
|
459
462
|
get displayRecFile() {
|
|
460
463
|
return this._displayRecFile;
|
|
461
464
|
}
|
|
462
465
|
showRecording() {
|
|
463
|
-
this.
|
|
466
|
+
if (this._controlAudioPlayer) {
|
|
467
|
+
this._controlAudioPlayer.stop();
|
|
468
|
+
}
|
|
464
469
|
if (this.displayAudioClip) {
|
|
465
470
|
let dap = this.displayAudioClip;
|
|
466
471
|
this.levelMeasure.calcBufferLevelInfos(dap.buffer, LEVEL_BAR_INTERVALL_SECONDS).then((levelInfos) => {
|
|
@@ -849,7 +854,6 @@ export class SessionManager extends BasicRecorder {
|
|
|
849
854
|
}
|
|
850
855
|
}
|
|
851
856
|
// apply recorded item
|
|
852
|
-
console.debug("Apply item: startNext: " + startNext);
|
|
853
857
|
this.applyItem(startNext);
|
|
854
858
|
if (startNext) {
|
|
855
859
|
this.startItem();
|
|
@@ -885,7 +889,7 @@ export class SessionManager extends BasicRecorder {
|
|
|
885
889
|
}
|
|
886
890
|
}
|
|
887
891
|
updateControlPlaybackPosition() {
|
|
888
|
-
if (this._controlAudioPlayer.playPositionFrames) {
|
|
892
|
+
if (this._controlAudioPlayer && this._controlAudioPlayer.playPositionFrames) {
|
|
889
893
|
this.prompting.audioDisplay.playFramePosition = this._controlAudioPlayer.playPositionFrames;
|
|
890
894
|
this.liveLevelDisplay.playFramePosition = this._controlAudioPlayer.playPositionFrames;
|
|
891
895
|
}
|
|
@@ -906,8 +910,8 @@ export class SessionManager extends BasicRecorder {
|
|
|
906
910
|
}
|
|
907
911
|
}
|
|
908
912
|
}
|
|
909
|
-
SessionManager.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.
|
|
910
|
-
SessionManager.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.
|
|
913
|
+
SessionManager.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: SessionManager, deps: [{ token: i1.BreakpointObserver }, { token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }, { token: i2.MatDialog }, { token: i3.SessionService }, { token: i4.RecordingService }, { token: i5.SpeechRecorderUploader }, { token: SPEECHRECORDER_CONFIG }], target: i0.ɵɵFactoryTarget.Component });
|
|
914
|
+
SessionManager.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", 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: `
|
|
911
915
|
<app-warningbar [show]="isTestSession()" warningText="Test recording only!"></app-warningbar>
|
|
912
916
|
<app-warningbar [show]="isDefaultAudioTestSession()" warningText="This test uses default audio device! Regular sessions may require a particular audio device (microphone)!"></app-warningbar>
|
|
913
917
|
<app-sprprompting [projectName]="projectName"
|
|
@@ -922,13 +926,13 @@ SessionManager.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version
|
|
|
922
926
|
[playStopAction]="controlAudioPlayer?.stopAction">
|
|
923
927
|
|
|
924
928
|
</app-sprprompting>
|
|
925
|
-
<mat-progress-bar [value]="progressPercentValue()"
|
|
929
|
+
<mat-progress-bar [value]="progressPercentValue()" *ngIf="screenXs" ></mat-progress-bar>
|
|
926
930
|
|
|
927
931
|
|
|
928
|
-
<div
|
|
929
|
-
<audio-levelbar
|
|
930
|
-
<div
|
|
931
|
-
<spr-recordingitemcontrols
|
|
932
|
+
<div [class]="{audioStatusDisplay:!screenXs,audioStatusDisplayXs:screenXs}">
|
|
933
|
+
<audio-levelbar style="flex:1 0 1%" [streamingMode]="isRecording()" [displayLevelInfos]="displayAudioClip?.levelInfos"></audio-levelbar>
|
|
934
|
+
<div style="display:flex;flex-direction: row">
|
|
935
|
+
<spr-recordingitemcontrols style="display:flex;flex:10 0 1px"
|
|
932
936
|
[audioLoaded]="displayAudioClip?.buffer!==null"
|
|
933
937
|
[playStartAction]="controlAudioPlayer?.startAction"
|
|
934
938
|
[playStopAction]="controlAudioPlayer?.stopAction"
|
|
@@ -937,26 +941,26 @@ SessionManager.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version
|
|
|
937
941
|
(onShowRecordingDetails)="audioSignalCollapsed=!audioSignalCollapsed">
|
|
938
942
|
</spr-recordingitemcontrols>
|
|
939
943
|
|
|
940
|
-
<app-uploadstatus class="ricontrols dark"
|
|
944
|
+
<app-uploadstatus *ngIf="screenXs && enableUploadRecordings" class="ricontrols dark" style="flex:0 0 0" [value]="uploadProgress"
|
|
941
945
|
[status]="uploadStatus" [awaitNewUpload]="processingRecording"></app-uploadstatus>
|
|
942
|
-
<app-wakelockindicator class="ricontrols dark"
|
|
943
|
-
<app-readystateindicator class="ricontrols dark"
|
|
946
|
+
<app-wakelockindicator *ngIf="screenXs" class="ricontrols dark" style="flex:0 0 0" [screenLocked]="screenLocked"></app-wakelockindicator>
|
|
947
|
+
<app-readystateindicator *ngIf="screenXs" class="ricontrols dark" style="flex:0 0 0" [ready]="dataSaved && !isActive()"></app-readystateindicator>
|
|
944
948
|
</div>
|
|
945
949
|
</div>
|
|
946
|
-
<div #controlpanel class="controlpanel"
|
|
947
|
-
<div
|
|
948
|
-
<app-sprstatusdisplay
|
|
950
|
+
<div #controlpanel class="controlpanel">
|
|
951
|
+
<div style="flex:1 1 30%;justify-content: flex-start;align-items: center; align-content: center">
|
|
952
|
+
<app-sprstatusdisplay *ngIf="!screenXs" [statusMsg]="statusMsg" [statusAlertType]="statusAlertType" [statusWaiting]="statusWaiting"></app-sprstatusdisplay>
|
|
949
953
|
</div>
|
|
950
|
-
<app-sprtransport
|
|
951
|
-
<div
|
|
952
|
-
<app-uploadstatus
|
|
954
|
+
<app-sprtransport style="display:flex;flex:10 0 30%;justify-content: center;align-items: center; align-content: center" [readonly]="readonly" [actions]="transportActions" [navigationEnabled]="!items || items.length>1"></app-sprtransport>
|
|
955
|
+
<div style="display:flex;flex:1 1 30%;flex-direction:row;justify-content: flex-end;align-items: center; align-content: center">
|
|
956
|
+
<app-uploadstatus *ngIf="!screenXs && enableUploadRecordings" class="ricontrols" [value]="uploadProgress"
|
|
953
957
|
[status]="uploadStatus" [awaitNewUpload]="processingRecording"></app-uploadstatus>
|
|
954
|
-
<app-wakelockindicator
|
|
955
|
-
<app-readystateindicator
|
|
958
|
+
<app-wakelockindicator *ngIf="!screenXs" class="ricontrols" [screenLocked]="screenLocked"></app-wakelockindicator>
|
|
959
|
+
<app-readystateindicator *ngIf="!screenXs" class="ricontrols" [ready]="dataSaved && !isActive()"></app-readystateindicator>
|
|
956
960
|
</div>
|
|
957
961
|
</div>
|
|
958
|
-
`, isInline: true, styles: [":host{flex:2;background:lightgrey;display:flex;flex-direction:column;margin:0;padding:0;min-height:0px;overflow:hidden}\n", ".ricontrols{padding:4px;box-sizing:border-box;height:100
|
|
959
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.
|
|
962
|
+
`, isInline: true, styles: [":host{flex:2;background:lightgrey;display:flex;flex-direction:column;margin:0;padding:0;min-height:0px;overflow:hidden}\n", ".ricontrols{display:flex;padding:4px;box-sizing:border-box;height:100%;flex-direction:row;justify-content:flex-end;align-items:center;align-content:center}\n", ".dark{background:darkgray}\n", ".controlpanel{display:flex;flex-direction:row;align-content:center;align-items:center;margin:0;padding:20px;min-height:min-content}\n", ".audioStatusDisplay{display:flex;flex-direction:row;height:100px;min-height:100px}\n", ".audioStatusDisplayXs{display:flex;flex-direction:column;height:125px;min-height:125px}\n"], dependencies: [{ kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i7.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i8.LevelBar, selector: "audio-levelbar", inputs: ["streamingMode", "displayLevelInfos"] }, { kind: "component", type: i9.Prompting, selector: "app-sprprompting", inputs: ["projectName", "startStopSignalState", "promptItem", "showPrompt", "items", "selectedItemIdx", "transportActions", "enableDownload", "audioSignalCollapsed", "displayAudioClip", "playStartAction", "playSelectionAction", "autoPlayOnSelectToggleAction", "playStopAction"], outputs: ["onItemSelect", "onNextItem", "onPrevItem"] }, { kind: "component", type: i10.StatusDisplay, selector: "app-sprstatusdisplay", inputs: ["statusAlertType", "statusMsg", "statusWaiting"] }, { kind: "component", type: i11.RecordingItemControls, selector: "spr-recordingitemcontrols", inputs: ["audioSignalCollapsed", "enableDownload", "peakDbLvl", "agc", "audioLoaded", "playStartAction", "playStopAction", "displayLevelInfos"], outputs: ["onShowRecordingDetails", "onDownloadRecording"] }, { kind: "component", type: i10.UploadStatus, selector: "app-uploadstatus", inputs: ["value", "awaitNewUpload", "status"] }, { kind: "component", type: i10.TransportPanel, selector: "app-sprtransport", inputs: ["readonly", "actions", "navigationEnabled", "pausingEnabled"] }, { kind: "component", type: i10.WakeLockIndicator, selector: "app-wakelockindicator", inputs: ["screenLocked"] }, { kind: "component", type: i10.ReadyStateIndicator, selector: "app-readystateindicator", inputs: ["ready"] }, { kind: "component", type: i12.WarningBar, selector: "app-warningbar", inputs: ["warningText", "show"] }] });
|
|
963
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: SessionManager, decorators: [{
|
|
960
964
|
type: Component,
|
|
961
965
|
args: [{ selector: 'app-sprrecordingsession', providers: [SessionService], template: `
|
|
962
966
|
<app-warningbar [show]="isTestSession()" warningText="Test recording only!"></app-warningbar>
|
|
@@ -973,13 +977,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
|
|
|
973
977
|
[playStopAction]="controlAudioPlayer?.stopAction">
|
|
974
978
|
|
|
975
979
|
</app-sprprompting>
|
|
976
|
-
<mat-progress-bar [value]="progressPercentValue()"
|
|
980
|
+
<mat-progress-bar [value]="progressPercentValue()" *ngIf="screenXs" ></mat-progress-bar>
|
|
977
981
|
|
|
978
982
|
|
|
979
|
-
<div
|
|
980
|
-
<audio-levelbar
|
|
981
|
-
<div
|
|
982
|
-
<spr-recordingitemcontrols
|
|
983
|
+
<div [class]="{audioStatusDisplay:!screenXs,audioStatusDisplayXs:screenXs}">
|
|
984
|
+
<audio-levelbar style="flex:1 0 1%" [streamingMode]="isRecording()" [displayLevelInfos]="displayAudioClip?.levelInfos"></audio-levelbar>
|
|
985
|
+
<div style="display:flex;flex-direction: row">
|
|
986
|
+
<spr-recordingitemcontrols style="display:flex;flex:10 0 1px"
|
|
983
987
|
[audioLoaded]="displayAudioClip?.buffer!==null"
|
|
984
988
|
[playStartAction]="controlAudioPlayer?.startAction"
|
|
985
989
|
[playStopAction]="controlAudioPlayer?.stopAction"
|
|
@@ -988,26 +992,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
|
|
|
988
992
|
(onShowRecordingDetails)="audioSignalCollapsed=!audioSignalCollapsed">
|
|
989
993
|
</spr-recordingitemcontrols>
|
|
990
994
|
|
|
991
|
-
<app-uploadstatus class="ricontrols dark"
|
|
995
|
+
<app-uploadstatus *ngIf="screenXs && enableUploadRecordings" class="ricontrols dark" style="flex:0 0 0" [value]="uploadProgress"
|
|
992
996
|
[status]="uploadStatus" [awaitNewUpload]="processingRecording"></app-uploadstatus>
|
|
993
|
-
<app-wakelockindicator class="ricontrols dark"
|
|
994
|
-
<app-readystateindicator class="ricontrols dark"
|
|
997
|
+
<app-wakelockindicator *ngIf="screenXs" class="ricontrols dark" style="flex:0 0 0" [screenLocked]="screenLocked"></app-wakelockindicator>
|
|
998
|
+
<app-readystateindicator *ngIf="screenXs" class="ricontrols dark" style="flex:0 0 0" [ready]="dataSaved && !isActive()"></app-readystateindicator>
|
|
995
999
|
</div>
|
|
996
1000
|
</div>
|
|
997
|
-
<div #controlpanel class="controlpanel"
|
|
998
|
-
<div
|
|
999
|
-
<app-sprstatusdisplay
|
|
1001
|
+
<div #controlpanel class="controlpanel">
|
|
1002
|
+
<div style="flex:1 1 30%;justify-content: flex-start;align-items: center; align-content: center">
|
|
1003
|
+
<app-sprstatusdisplay *ngIf="!screenXs" [statusMsg]="statusMsg" [statusAlertType]="statusAlertType" [statusWaiting]="statusWaiting"></app-sprstatusdisplay>
|
|
1000
1004
|
</div>
|
|
1001
|
-
<app-sprtransport
|
|
1002
|
-
<div
|
|
1003
|
-
<app-uploadstatus
|
|
1005
|
+
<app-sprtransport style="display:flex;flex:10 0 30%;justify-content: center;align-items: center; align-content: center" [readonly]="readonly" [actions]="transportActions" [navigationEnabled]="!items || items.length>1"></app-sprtransport>
|
|
1006
|
+
<div style="display:flex;flex:1 1 30%;flex-direction:row;justify-content: flex-end;align-items: center; align-content: center">
|
|
1007
|
+
<app-uploadstatus *ngIf="!screenXs && enableUploadRecordings" class="ricontrols" [value]="uploadProgress"
|
|
1004
1008
|
[status]="uploadStatus" [awaitNewUpload]="processingRecording"></app-uploadstatus>
|
|
1005
|
-
<app-wakelockindicator
|
|
1006
|
-
<app-readystateindicator
|
|
1009
|
+
<app-wakelockindicator *ngIf="!screenXs" class="ricontrols" [screenLocked]="screenLocked"></app-wakelockindicator>
|
|
1010
|
+
<app-readystateindicator *ngIf="!screenXs" class="ricontrols" [ready]="dataSaved && !isActive()"></app-readystateindicator>
|
|
1007
1011
|
</div>
|
|
1008
1012
|
</div>
|
|
1009
|
-
`, styles: [":host{flex:2;background:lightgrey;display:flex;flex-direction:column;margin:0;padding:0;min-height:0px;overflow:hidden}\n", ".ricontrols{padding:4px;box-sizing:border-box;height:100
|
|
1010
|
-
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }, { type:
|
|
1013
|
+
`, styles: [":host{flex:2;background:lightgrey;display:flex;flex-direction:column;margin:0;padding:0;min-height:0px;overflow:hidden}\n", ".ricontrols{display:flex;padding:4px;box-sizing:border-box;height:100%;flex-direction:row;justify-content:flex-end;align-items:center;align-content:center}\n", ".dark{background:darkgray}\n", ".controlpanel{display:flex;flex-direction:row;align-content:center;align-items:center;margin:0;padding:20px;min-height:min-content}\n", ".audioStatusDisplay{display:flex;flex-direction:row;height:100px;min-height:100px}\n", ".audioStatusDisplayXs{display:flex;flex-direction:column;height:125px;min-height:125px}\n"] }]
|
|
1014
|
+
}], ctorParameters: function () { return [{ type: i1.BreakpointObserver }, { type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }, { type: i2.MatDialog }, { type: i3.SessionService }, { type: i4.RecordingService }, { type: i5.SpeechRecorderUploader }, { type: i13.SpeechRecorderConfig, decorators: [{
|
|
1011
1015
|
type: Inject,
|
|
1012
1016
|
args: [SPEECHRECORDER_CONFIG]
|
|
1013
1017
|
}] }]; }, propDecorators: { projectName: [{
|
|
@@ -1027,4 +1031,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
|
|
|
1027
1031
|
type: HostListener,
|
|
1028
1032
|
args: ['window:keydown', ['$event']]
|
|
1029
1033
|
}] } });
|
|
1030
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbm1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvc3BlZWNocmVjb3JkZXIvc2Vzc2lvbi9zZXNzaW9ubWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsWUFBWSxFQUF1QixNQUFNLDZCQUE2QixDQUFDO0FBQy9FLE9BQU8sRUFBZ0MsU0FBUyxFQUFDLE1BQU0sNkJBQTZCLENBQUE7QUFDcEYsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLDRCQUE0QixDQUFBO0FBQ3BELE9BQU8sRUFBb0IsY0FBYyxFQUFrQixNQUFNLGtCQUFrQixDQUFDO0FBQ3BGLE9BQU8sRUFBQyxnQkFBZ0IsRUFBNkMsTUFBTSxjQUFjLENBQUE7QUFDekYsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQzFDLE9BQU8sRUFHTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBR0wsU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUlqRCxPQUFPLEVBQUMscUJBQXFCLEVBQXVCLE1BQU0sa0JBQWtCLENBQUM7QUFDN0UsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQU10QyxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUNoRSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFFdEQsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDekQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ2hELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLFFBQVEsRUFB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QUksRUFBRTtnQkFDQyxnQkFBZ0I7c0JBQXRELFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFFNUIsU0FBUztzQkFBakIsS0FBSztnQkFzS04sVUFBVTtzQkFEVCxZQUFZO3VCQUFDLGlCQUFpQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVMzQyxTQUFTO3NCQURSLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0F1ZGlvQ2FwdHVyZSwgQXVkaW9DYXB0dXJlTGlzdGVuZXJ9IGZyb20gJy4uLy4uL2F1ZGlvL2NhcHR1cmUvY2FwdHVyZSc7XHJcbmltcG9ydCB7QXVkaW9QbGF5ZXIsIEF1ZGlvUGxheWVyRXZlbnQsIEV2ZW50VHlwZX0gZnJvbSAnLi4vLi4vYXVkaW8vcGxheWJhY2svcGxheWVyJ1xyXG5pbXBvcnQge1dhdldyaXRlcn0gZnJvbSAnLi4vLi4vYXVkaW8vaW1wbC93YXZ3cml0ZXInXHJcbmltcG9ydCB7R3JvdXAsIFByb21wdEl0ZW0sIFByb21wdGl0ZW1VdGlsLCBTY3JpcHQsIFNlY3Rpb259IGZyb20gJy4uL3NjcmlwdC9zY3JpcHQnO1xyXG5pbXBvcnQge1NwclJlY29yZGluZ0ZpbGUsIFJlY29yZGluZ0ZpbGVEZXNjcmlwdG9ySW1wbCwgUmVjb3JkaW5nRmlsZX0gZnJvbSAnLi4vcmVjb3JkaW5nJ1xyXG5pbXBvcnQge1VwbG9hZH0gZnJvbSAnLi4vLi4vbmV0L3VwbG9hZGVyJztcclxuaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgSW5qZWN0LFxyXG4gIElucHV0LFxyXG4gIE9uRGVzdHJveSxcclxuICBSZW5kZXJlcjIsXHJcbiAgVmlld0NoaWxkXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtTZXNzaW9uU2VydmljZX0gZnJvbSBcIi4vc2Vzc2lvbi5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7U3RhdGUgYXMgU3RhcnRTdG9wU2lnbmFsU3RhdGV9IGZyb20gXCIuLi9zdGFydHN0b3BzaWduYWwvc3RhcnRzdG9wc2lnbmFsXCI7XHJcbmltcG9ydCB7TWF0RGlhbG9nfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nXCI7XHJcbmltcG9ydCB7U3BlZWNoUmVjb3JkZXJVcGxvYWRlcn0gZnJvbSBcIi4uL3NwcnVwbG9hZGVyXCI7XHJcbmltcG9ydCB7U1BFRUNIUkVDT1JERVJfQ09ORklHLCBTcGVlY2hSZWNvcmRlckNvbmZpZ30gZnJvbSBcIi4uLy4uL3Nwci5jb25maWdcIjtcclxuaW1wb3J0IHtQcm9tcHRpbmd9IGZyb20gXCIuL3Byb21wdGluZ1wiO1xyXG5pbXBvcnQge1xyXG4gIFNlcXVlbmNlQXVkaW9GbG9hdDMyQ2h1bmtlck91dFN0cmVhbSxcclxuICBTZXF1ZW5jZUF1ZGlvRmxvYXQzMk91dFN0cmVhbSxcclxuICBTZXF1ZW5jZUF1ZGlvRmxvYXQzMk91dFN0cmVhbU11bHRpcGxpZXJcclxufSBmcm9tIFwiLi4vLi4vYXVkaW8vaW8vc3RyZWFtXCI7XHJcbmltcG9ydCB7U2Vzc2lvbkZpbmlzaGVkRGlhbG9nfSBmcm9tIFwiLi9zZXNzaW9uX2ZpbmlzaGVkX2RpYWxvZ1wiO1xyXG5pbXBvcnQge01lc3NhZ2VEaWFsb2d9IGZyb20gXCIuLi8uLi91aS9tZXNzYWdlX2RpYWxvZ1wiO1xyXG5pbXBvcnQge1JlY29yZGluZ1NlcnZpY2V9IGZyb20gXCIuLi9yZWNvcmRpbmdzL3JlY29yZGluZ3Muc2VydmljZVwiO1xyXG5pbXBvcnQge0F1ZGlvQ29udGV4dFByb3ZpZGVyfSBmcm9tIFwiLi4vLi4vYXVkaW8vY29udGV4dFwiO1xyXG5pbXBvcnQge0F1ZGlvQ2xpcH0gZnJvbSBcIi4uLy4uL2F1ZGlvL3BlcnNpc3RvclwiO1xyXG5pbXBvcnQge0l0ZW19IGZyb20gXCIuL2l0ZW1cIjtcclxuaW1wb3J0IHtMZXZlbEJhcn0gZnJvbSBcIi4uLy4uL2F1ZGlvL3VpL2xpdmVsZXZlbFwiO1xyXG5pbXBvcnQge1xyXG4gIEJhc2ljUmVjb3JkZXIsXHJcbiAgQ2h1bmtBdWRpb0J1ZmZlclJlY2VpdmVyLFxyXG4gIExFVkVMX0JBUl9JTlRFUlZBTExfU0VDT05EUyxcclxuICBNQVhfUkVDT1JESU5HX1RJTUVfTVMsXHJcbiAgUkVDRklMRV9BUElfQ1RYXHJcbn0gZnJvbSBcIi4vYmFzaWNyZWNvcmRlclwiO1xyXG5pbXBvcnQge1VVSUR9IGZyb20gXCIuLi8uLi91dGlscy91dGlsc1wiO1xyXG5cclxuY29uc3QgREVGQVVMVF9QUkVfUkVDX0RFTEFZPTEwMDA7XHJcbmNvbnN0IERFRkFVTFRfUE9TVF9SRUNfREVMQVk9NTAwO1xyXG5cclxuZXhwb3J0IGNvbnN0IGVudW0gU3RhdHVzIHtcclxuICBCTE9DS0VELCBJRExFLCBTVEFSVElORywgUFJFX1JFQ09SRElORywgUkVDT1JESU5HLCBQT1NUX1JFQ19TVE9QLCBQT1NUX1JFQ19QQVVTRSwgU1RPUFBJTkdfU1RPUCwgU1RPUFBJTkdfUEFVU0UsIEVSUk9SXHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLXNwcnJlY29yZGluZ3Nlc3Npb24nLFxyXG4gIHByb3ZpZGVyczogW1Nlc3Npb25TZXJ2aWNlXSxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGFwcC13YXJuaW5nYmFyIFtzaG93XT1cImlzVGVzdFNlc3Npb24oKVwiIHdhcm5pbmdUZXh0PVwiVGVzdCByZWNvcmRpbmcgb25seSFcIj48L2FwcC13YXJuaW5nYmFyPlxyXG4gICAgPGFwcC13YXJuaW5nYmFyIFtzaG93XT1cImlzRGVmYXVsdEF1ZGlvVGVzdFNlc3Npb24oKVwiIHdhcm5pbmdUZXh0PVwiVGhpcyB0ZXN0IHVzZXMgZGVmYXVsdCBhdWRpbyBkZXZpY2UhIFJlZ3VsYXIgc2Vzc2lvbnMgbWF5IHJlcXVpcmUgYSBwYXJ0aWN1bGFyIGF1ZGlvIGRldmljZSAobWljcm9waG9uZSkhXCI+PC9hcHAtd2FybmluZ2Jhcj5cclxuICAgICAgPGFwcC1zcHJwcm9tcHRpbmcgW3Byb2plY3ROYW1lXT1cInByb2plY3ROYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0YXJ0U3RvcFNpZ25hbFN0YXRlXT1cInN0YXJ0U3RvcFNpZ25hbFN0YXRlXCIgW3Byb21wdEl0ZW1dPVwicHJvbXB0SXRlbVwiIFtzaG93UHJvbXB0XT1cInNob3dQcm9tcHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXRlbXNdPVwiaXRlbXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdHJhbnNwb3J0QWN0aW9uc109XCJ0cmFuc3BvcnRBY3Rpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkSXRlbUlkeF09XCJwcm9tcHRJbmRleFwiIChvbkl0ZW1TZWxlY3QpPVwiaXRlbVNlbGVjdCgkZXZlbnQpXCIgKG9uTmV4dEl0ZW0pPVwibmV4dEl0ZW0oKVwiIChvblByZXZJdGVtKT1cInByZXZJdGVtKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXVkaW9TaWduYWxDb2xsYXBzZWRdPVwiYXVkaW9TaWduYWxDb2xsYXBzZWRcIiBbZGlzcGxheUF1ZGlvQ2xpcF09XCJkaXNwbGF5QXVkaW9DbGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BsYXlTdGFydEFjdGlvbl09XCJjb250cm9sQXVkaW9QbGF5ZXI/LnN0YXJ0QWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BsYXlTZWxlY3Rpb25BY3Rpb25dPVwiY29udHJvbEF1ZGlvUGxheWVyPy5zdGFydFNlbGVjdGlvbkFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdXRvUGxheU9uU2VsZWN0VG9nZ2xlQWN0aW9uXT1cImNvbnRyb2xBdWRpb1BsYXllcj8uYXV0b1BsYXlPblNlbGVjdFRvZ2dsZUFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwbGF5U3RvcEFjdGlvbl09XCJjb250cm9sQXVkaW9QbGF5ZXI/LnN0b3BBY3Rpb25cIj5cclxuXHJcbiAgICA8L2FwcC1zcHJwcm9tcHRpbmc+XHJcbiAgICA8bWF0LXByb2dyZXNzLWJhciBbdmFsdWVdPVwicHJvZ3Jlc3NQZXJjZW50VmFsdWUoKVwiIGZ4U2hvdz1cImZhbHNlXCIgZnhTaG93LnhzPVwidHJ1ZVwiID48L21hdC1wcm9ncmVzcy1iYXI+XHJcblxyXG5cclxuICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dC54cz1cImNvbHVtblwiIFtuZ1N0eWxlXT1cInsnaGVpZ2h0LnB4JzoxMDAsJ21pbi1oZWlnaHQucHgnOiAxMDB9XCIgW25nU3R5bGUueHNdPVwieydoZWlnaHQucHgnOjEyNSwnbWluLWhlaWdodC5weCc6IDEyNX1cIj5cclxuICAgICAgPGF1ZGlvLWxldmVsYmFyIGZ4RmxleD1cIjEgMCAxXCIgW3N0cmVhbWluZ01vZGVdPVwiaXNSZWNvcmRpbmcoKVwiIFtkaXNwbGF5TGV2ZWxJbmZvc109XCJkaXNwbGF5QXVkaW9DbGlwPy5sZXZlbEluZm9zXCI+PC9hdWRpby1sZXZlbGJhcj5cclxuICAgICAgPGRpdiBmeExheW91dD1cInJvd1wiPlxyXG4gICAgICAgIDxzcHItcmVjb3JkaW5naXRlbWNvbnRyb2xzIGZ4RmxleD1cIjEwIDAgMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F1ZGlvTG9hZGVkXT1cImRpc3BsYXlBdWRpb0NsaXA/LmJ1ZmZlciE9PW51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGF5U3RhcnRBY3Rpb25dPVwiY29udHJvbEF1ZGlvUGxheWVyPy5zdGFydEFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYXlTdG9wQWN0aW9uXT1cImNvbnRyb2xBdWRpb1BsYXllcj8uc3RvcEFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BlYWtEYkx2bF09XCJwZWFrTGV2ZWxJbkRiXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWdjXT1cInRoaXMuYWM/LmFnY1N0YXR1c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uU2hvd1JlY29yZGluZ0RldGFpbHMpPVwiYXVkaW9TaWduYWxDb2xsYXBzZWQ9IWF1ZGlvU2lnbmFsQ29sbGFwc2VkXCI+XHJcbiAgICAgICAgPC9zcHItcmVjb3JkaW5naXRlbWNvbnRyb2xzPlxyXG5cclxuICAgICAgICA8YXBwLXVwbG9hZHN0YXR1cyBjbGFzcz1cInJpY29udHJvbHMgZGFya1wiIGZ4SGlkZSBmeFNob3cueHMgIGZ4RmxleD1cIjAgMCAwXCIgKm5nSWY9XCJlbmFibGVVcGxvYWRSZWNvcmRpbmdzXCIgW3ZhbHVlXT1cInVwbG9hZFByb2dyZXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc3RhdHVzXT1cInVwbG9hZFN0YXR1c1wiIFthd2FpdE5ld1VwbG9hZF09XCJwcm9jZXNzaW5nUmVjb3JkaW5nXCI+PC9hcHAtdXBsb2Fkc3RhdHVzPlxyXG4gICAgICAgIDxhcHAtd2FrZWxvY2tpbmRpY2F0b3IgY2xhc3M9XCJyaWNvbnRyb2xzIGRhcmtcIiBmeEhpZGUgZnhTaG93LnhzIGZ4RmxleD1cIjAgMCAwXCIgW3NjcmVlbkxvY2tlZF09XCJzY3JlZW5Mb2NrZWRcIj48L2FwcC13YWtlbG9ja2luZGljYXRvcj5cclxuICAgICAgICA8YXBwLXJlYWR5c3RhdGVpbmRpY2F0b3IgY2xhc3M9XCJyaWNvbnRyb2xzIGRhcmtcIiBmeEhpZGUgZnhTaG93LnhzIGZ4RmxleD1cIjAgMCAwXCIgW3JlYWR5XT1cImRhdGFTYXZlZCAmJiAhaXNBY3RpdmUoKVwiPjwvYXBwLXJlYWR5c3RhdGVpbmRpY2F0b3I+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2ICNjb250cm9scGFuZWwgY2xhc3M9XCJjb250cm9scGFuZWxcIiBmeExheW91dD1cInJvd1wiPlxyXG4gICAgICA8ZGl2IGZ4RmxleD1cIjEgMSAzMCVcIiBmeExheW91dEFsaWduPVwic3RhcnQgY2VudGVyXCI+XHJcbiAgICAgICAgPGFwcC1zcHJzdGF0dXNkaXNwbGF5IGZ4SGlkZS54cyBbc3RhdHVzTXNnXT1cInN0YXR1c01zZ1wiIFtzdGF0dXNBbGVydFR5cGVdPVwic3RhdHVzQWxlcnRUeXBlXCIgW3N0YXR1c1dhaXRpbmddPVwic3RhdHVzV2FpdGluZ1wiPjwvYXBwLXNwcnN0YXR1c2Rpc3BsYXk+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8YXBwLXNwcnRyYW5zcG9ydCBmeEZsZXg9XCIxMCAwIDMwJVwiIGZ4TGF5b3V0QWxpZ249XCJjZW50ZXIgY2VudGVyXCIgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCIgW2FjdGlvbnNdPVwidHJhbnNwb3J0QWN0aW9uc1wiIFtuYXZpZ2F0aW9uRW5hYmxlZF09XCJpdGVtcz09bnVsbCB8fCBpdGVtcy5sZW5ndGg+MVwiPjwvYXBwLXNwcnRyYW5zcG9ydD5cclxuICAgICAgPGRpdiBmeEZsZXg9XCIxIDEgMzAlXCIgZnhMYXlvdXRBbGlnbj1cImVuZCBjZW50ZXJcIiBmeExheW91dD1cInJvd1wiPlxyXG4gICAgICAgIDxhcHAtdXBsb2Fkc3RhdHVzIGNsYXNzPVwicmljb250cm9sc1wiIGZ4SGlkZS54cyBmeExheW91dEFsaWduPVwiZW5kIGNlbnRlclwiICpuZ0lmPVwiZW5hYmxlVXBsb2FkUmVjb3JkaW5nc1wiIFt2YWx1ZV09XCJ1cGxvYWRQcm9ncmVzc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0YXR1c109XCJ1cGxvYWRTdGF0dXNcIiBbYXdhaXROZXdVcGxvYWRdPVwicHJvY2Vzc2luZ1JlY29yZGluZ1wiPjwvYXBwLXVwbG9hZHN0YXR1cz5cclxuICAgICAgICA8YXBwLXdha2Vsb2NraW5kaWNhdG9yIGNsYXNzPVwicmljb250cm9sc1wiIGZ4TGF5b3V0QWxpZ249XCJlbmQgY2VudGVyXCIgZnhIaWRlLnhzIFtzY3JlZW5Mb2NrZWRdPVwic2NyZWVuTG9ja2VkXCI+PC9hcHAtd2FrZWxvY2tpbmRpY2F0b3I+XHJcbiAgICAgICAgPGFwcC1yZWFkeXN0YXRlaW5kaWNhdG9yIGNsYXNzPVwicmljb250cm9sc1wiIGZ4TGF5b3V0QWxpZ249XCJlbmQgY2VudGVyXCIgZnhIaWRlLnhzIFtyZWFkeV09XCJkYXRhU2F2ZWQgJiYgIWlzQWN0aXZlKClcIj48L2FwcC1yZWFkeXN0YXRlaW5kaWNhdG9yPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIGAsXHJcbiAgc3R5bGVzOiBbYDpob3N0IHtcclxuICAgIGZsZXg6IDI7XHJcbiAgICBiYWNrZ3JvdW5kOiBsaWdodGdyZXk7XHJcbiAgICBkaXNwbGF5OiBmbGV4OyAvKiBWZXJ0aWNhbCBmbGV4IGNvbnRhaW5lcjogQm90dG9tIHRyYW5zcG9ydCBwYW5lbCwgYWJvdmUgcHJvbXB0aW5nIHBhbmVsICovXHJcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgcGFkZGluZzogMDtcclxuICAgIG1pbi1oZWlnaHQ6IDBweDtcclxuXHJcbiAgICAgIC8qIFByZXZlbnRzIGhvcml6b250YWwgc2Nyb2xsIGJhciBvbiBzd2lwZSByaWdodCAqL1xyXG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1gLGAucmljb250cm9scyB7XHJcbiAgICAgICAgcGFkZGluZzogNHB4O1xyXG4gICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgfWAsYC5kYXJrIHtcclxuICAgIGJhY2tncm91bmQ6IGRhcmtncmF5O1xyXG4gIH1gLGAuY29udHJvbHBhbmVsIHtcclxuICAgIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgICBwYWRkaW5nOiAyMHB4O1xyXG4gICAgbWluLWhlaWdodDogbWluLWNvbnRlbnQ7IC8qIGltcG9ydGFudCAqL1xyXG4gIH1gXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgU2Vzc2lvbk1hbmFnZXIgZXh0ZW5kcyBCYXNpY1JlY29yZGVyIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCxPbkRlc3Ryb3ksIEF1ZGlvQ2FwdHVyZUxpc3RlbmVyLENodW5rQXVkaW9CdWZmZXJSZWNlaXZlciB7XHJcblxyXG4gIEBJbnB1dCgpIHByb2plY3ROYW1lOnN0cmluZ3x1bmRlZmluZWQ7XHJcbiAgZW5hYmxlVXBsb2FkUmVjb3JkaW5nczogYm9vbGVhbiA9IHRydWU7XHJcbiAgZW5hYmxlRG93bmxvYWRSZWNvcmRpbmdzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgc3RhdHVzOiBTdGF0dXMgPSBTdGF0dXMuQkxPQ0tFRDtcclxuXHJcbiAgQFZpZXdDaGlsZChQcm9tcHRpbmcsIHsgc3RhdGljOiB0cnVlIH0pIHByb21wdGluZyE6IFByb21wdGluZztcclxuICBAVmlld0NoaWxkKExldmVsQmFyLCB7IHN0YXRpYzogdHJ1ZSB9KSBsaXZlTGV2ZWxEaXNwbGF5ITogTGV2ZWxCYXI7XHJcblxyXG4gIEBJbnB1dCgpIGRhdGFTYXZlZD10cnVlXHJcblxyXG4gIHN0YXJ0U3RvcFNpZ25hbFN0YXRlITogU3RhcnRTdG9wU2lnbmFsU3RhdGU7XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlVGltZXJJZDogYW55O1xyXG4gIHByaXZhdGUgcHJlUmVjVGltZXJJZDogbnVtYmVyfG51bGw9bnVsbDtcclxuICBwcml2YXRlIHByZVJlY1RpbWVyUnVubmluZzogYm9vbGVhbnxudWxsPW51bGw7XHJcbiAgcHJpdmF0ZSBwb3N0RGVsYXk6bnVtYmVyPURFRkFVTFRfUE9TVF9SRUNfREVMQVk7XHJcbiAgcHJpdmF0ZSBwb3N0UmVjVGltZXJJZDogbnVtYmVyfG51bGw9bnVsbDtcclxuICBwcml2YXRlIHBvc3RSZWNUaW1lclJ1bm5pbmc6IGJvb2xlYW58bnVsbD1udWxsO1xyXG4gIHByaXZhdGUgbWF4UmVjVGltZXJJZDogbnVtYmVyfG51bGw9bnVsbDtcclxuICBwcml2YXRlIG1heFJlY1RpbWVyUnVubmluZzogYm9vbGVhbnxudWxsPW51bGw7XHJcblxyXG4gIGRubExuayE6IEhUTUxBbmNob3JFbGVtZW50O1xyXG5cclxuICBhdWRpbzogYW55O1xyXG4gIF9zY3JpcHQhOiBTY3JpcHQ7XHJcbiAgcHJpdmF0ZSBfcHJvbXB0SW5kZXg9MDtcclxuICBwcml2YXRlIHNlY3Rpb24hOiBTZWN0aW9uO1xyXG4gIGdyb3VwITogR3JvdXA7XHJcbiAgcHJvbXB0SXRlbSE6UHJvbXB0SXRlbTtcclxuICBzaG93UHJvbXB0ITogYm9vbGVhbjtcclxuXHJcbiAgLy8gaW5kZXggb2YgY3VycmVudCBzZWN0aW9uXHJcbiAgc2VjdElkeCE6IG51bWJlcjtcclxuICAvLyBpbmRleCBvZiBjdXJyZW50IGdyb3VwIGluIHNlY3Rpb25cclxuICBncm91cElkeEluU2VjdGlvbiE6IG51bWJlcjtcclxuICAvLyBpbmRleCBvZiBjdXJyZW50IHByb21wdCBpdGVtIGluIGdyb3VwXHJcbiAgcHJvbXB0SXRlbUlkeEluR3JvdXAhOiBudW1iZXI7XHJcblxyXG4gIHByaXZhdGUgYXV0b3JlY29yZGluZyE6IGJvb2xlYW47XHJcblxyXG4gIGl0ZW1zOiBBcnJheTxJdGVtPnxudWxsPW51bGw7XHJcbiAgLy9zZWxlY3RlZEl0ZW1JZHg6IG51bWJlcjtcclxuICBwcml2YXRlIF9kaXNwbGF5UmVjRmlsZTogU3ByUmVjb3JkaW5nRmlsZSB8IG51bGw9bnVsbDtcclxuICBwcml2YXRlIGRpc3BsYXlSZWNGaWxlVmVyc2lvbiE6IG51bWJlcjtcclxuXHJcbiAgcHJvbXB0SXRlbUNvdW50ITogbnVtYmVyO1xyXG5cclxuXHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgICAgICAgICAgICBwdWJsaWMgZGlhbG9nOiBNYXREaWFsb2csXHJcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIHNlc3Npb25TZXJ2aWNlOlNlc3Npb25TZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgcmVjRmlsZVNlcnZpY2U6UmVjb3JkaW5nU2VydmljZSxcclxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgdXBsb2FkZXI6IFNwZWVjaFJlY29yZGVyVXBsb2FkZXIsXHJcbiAgICAgICAgICAgICAgQEluamVjdChTUEVFQ0hSRUNPUkRFUl9DT05GSUcpIHB1YmxpYyBjb25maWc/OiBTcGVlY2hSZWNvcmRlckNvbmZpZykge1xyXG4gICAgc3VwZXIoZGlhbG9nLHNlc3Npb25TZXJ2aWNlLHVwbG9hZGVyLGNvbmZpZyk7XHJcbiAgICB0aGlzLnN0YXR1cyA9IFN0YXR1cy5JRExFO1xyXG4gICAgdGhpcy5hdWRpbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdWRpbycpO1xyXG4gICAgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmVuYWJsZVVwbG9hZFJlY29yZGluZ3MgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmVuYWJsZVVwbG9hZFJlY29yZGluZ3MgPSB0aGlzLmNvbmZpZy5lbmFibGVVcGxvYWRSZWNvcmRpbmdzO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmVuYWJsZURvd25sb2FkUmVjb3JkaW5ncyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuZW5hYmxlRG93bmxvYWRSZWNvcmRpbmdzID0gdGhpcy5jb25maWcuZW5hYmxlRG93bmxvYWRSZWNvcmRpbmdzO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pbml0KCk7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIHRoaXMuc3RyZWFtTGV2ZWxNZWFzdXJlLmxldmVsTGlzdGVuZXIgPSB0aGlzLmxpdmVMZXZlbERpc3BsYXk7XHJcbiAgICB0aGlzLnN0cmVhbUxldmVsTWVhc3VyZS5wZWFrTGV2ZWxMaXN0ZW5lcj0ocGVha0x2bEluRGIpPT57XHJcbiAgICAgIHRoaXMucGVha0xldmVsSW5EYj1wZWFrTHZsSW5EYjtcclxuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gICAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJDb20gZGVzdHJveSwgZGlzYWJsZSB3YWtlIGxvY2suXCIpXHJcbiAgICAgIHRoaXMuZGlzYWJsZVdha2VMb2NrQ29uZCgpO1xyXG4gICAgICAgdGhpcy5kZXN0cm95ZWQ9dHJ1ZTtcclxuICAgICAgIC8vIFRPRE8gc3RvcCBjYXB0dXJlIC9wbGF5YmFja1xyXG4gICAgfVxyXG5cclxuICBwcml2YXRlIGluaXQoKSB7XHJcbiAgICB0aGlzLnNlY3RJZHggPSAwO1xyXG4gICAgdGhpcy5ncm91cElkeEluU2VjdGlvbiA9IDA7XHJcbiAgICB0aGlzLnByb21wdEl0ZW1JZHhJbkdyb3VwID0gMDtcclxuICAgIHRoaXMuYXV0b3JlY29yZGluZyA9IGZhbHNlO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0YXJ0QWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdG9wQWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5uZXh0QWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5wYXVzZUFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLnBsYXlTdGFydEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICBsZXQgY29udGV4dDpBdWRpb0NvbnRleHR8bnVsbD1udWxsO1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29udGV4dCA9IEF1ZGlvQ29udGV4dFByb3ZpZGVyLmF1ZGlvQ29udGV4dEluc3RhbmNlKClcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICB0aGlzLnN0YXR1cyA9IFN0YXR1cy5FUlJPUjtcclxuICAgICAgbGV0IGVyck1zZyA9ICdVbmtub3duIGVycm9yJztcclxuICAgICAgaWYoZXJyIGluc3RhbmNlb2YgRXJyb3Ipe1xyXG4gICAgICAgIGVyck1zZz1lcnIubWVzc2FnZTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnN0YXR1c01zZyA9ICdFUlJPUjogJyArIGVyck1zZztcclxuICAgICAgdGhpcy5zdGF0dXNBbGVydFR5cGUgPSAnZXJyb3InO1xyXG4gICAgICB0aGlzLmRpYWxvZy5vcGVuKE1lc3NhZ2VEaWFsb2csIHtcclxuICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICB0eXBlOiAnZXJyb3InLFxyXG4gICAgICAgICAgdGl0bGU6ICdFcnJvcicsXHJcbiAgICAgICAgICBtc2c6IGVyck1zZyxcclxuICAgICAgICAgIGFkdmlzZTogJ1BsZWFzZSB1c2UgYSBzdXBwb3J0ZWQgYnJvd3Nlci4nLFxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmKGNvbnRleHQpIHtcclxuICAgICAgY29uc29sZS5pbmZvKFwiU3RhdGUgb2YgYXVkaW8gY29udGV4dDogXCIgKyBjb250ZXh0LnN0YXRlKVxyXG4gICAgfWVsc2V7XHJcbiAgICAgIGNvbnNvbGUuaW5mbyhcIk5vIGF1ZGlvIGNvbnRleHQgYXZhaWxhYmxlIVwiKTtcclxuICAgIH1cclxuICAgIGlmICghY29udGV4dCB8fCAhbmF2aWdhdG9yLm1lZGlhRGV2aWNlcykge1xyXG4gICAgICB0aGlzLnN0YXR1cyA9IFN0YXR1cy5FUlJPUjtcclxuICAgICAgbGV0IGVyck1zZyA9ICdCcm93c2VyIGRvZXMgbm90IHN1cHBvcnQgTWVkaWEgc3RyZWFtcyEnO1xyXG4gICAgICB0aGlzLnN0YXR1c01zZyA9ICdFUlJPUjogJyArIGVyck1zZztcclxuICAgICAgdGhpcy5zdGF0dXNBbGVydFR5cGUgPSAnZXJyb3InO1xyXG4gICAgICB0aGlzLmRpYWxvZy5vcGVuKE1lc3NhZ2VEaWFsb2csIHtcclxuICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICB0eXBlOiAnZXJyb3InLFxyXG4gICAgICAgICAgdGl0bGU6ICdFcnJvcicsXHJcbiAgICAgICAgICBtc2c6IGVyck1zZyxcclxuICAgICAgICAgIGFkdmlzZTogJ1BsZWFzZSB1c2UgYSBzdXBwb3J0ZWQgYnJvd3Nlci4nLFxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYWMgPSBuZXcgQXVkaW9DYXB0dXJlKGNvbnRleHQpO1xyXG4gICAgICBpZiAodGhpcy5hYykge1xyXG4gICAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdGFydEFjdGlvbi5vbkFjdGlvbiA9ICgpID0+IHRoaXMuc3RhcnRJdGVtKCk7XHJcbiAgICAgICAgdGhpcy5hYy5saXN0ZW5lciA9IHRoaXM7XHJcblxyXG4gICAgICAgIHRoaXMuY29uZmlndXJlU3RyZWFtQ2FwdHVyZVN0cmVhbSgpO1xyXG5cclxuICAgICAgICAvLyBEb24ndCBsaXN0IHRoZSBkZXZpY2VzIGhlcmUuIElmIHdlIGRvIG5vdCBoYXZlIGF1ZGlvIHBlcm1pc3Npb25zIHdlIG9ubHkgZ2V0IGFub255bWl6ZWQgZGV2aWNlcyB3aXRob3V0IGxhYmVscy5cclxuICAgICAgICAvL3RoaXMuYWMubGlzdERldmljZXMoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RhcnRBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgIGxldCBlcnJNc2cgPSAnQnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IE1lZGlhL0F1ZGlvIEFQSSEnO1xyXG4gICAgICAgIHRoaXMuc3RhdHVzTXNnID0gJ0VSUk9SOiAnICsgZXJyTXNnO1xyXG4gICAgICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJztcclxuICAgICAgICB0aGlzLmRpYWxvZy5vcGVuKE1lc3NhZ2VEaWFsb2csIHtcclxuICAgICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgdHlwZTogJ2Vycm9yJyxcclxuICAgICAgICAgICAgdGl0bGU6ICdFcnJvcicsXHJcbiAgICAgICAgICAgIG1zZzogZXJyTXNnLFxyXG4gICAgICAgICAgICBhZHZpc2U6ICdQbGVhc2UgdXNlIGEgc3VwcG9ydGVkIGJyb3dzZXIuJyxcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0b3BBY3Rpb24ub25BY3Rpb24gPSAoKSA9PiB0aGlzLnN0b3BJdGVtKCk7XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5uZXh0QWN0aW9uLm9uQWN0aW9uID0gKCkgPT4gdGhpcy5zdG9wSXRlbSgpO1xyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMucGF1c2VBY3Rpb24ub25BY3Rpb24gPSAoKSA9PiB0aGlzLnBhdXNlSXRlbSgpO1xyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuZndkQWN0aW9uLm9uQWN0aW9uID0gKCkgPT4gdGhpcy5uZXh0SXRlbSgpO1xyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuZndkTmV4dEFjdGlvbi5vbkFjdGlvbiA9ICgpID0+IHRoaXMubmV4dFVucmVjb3JkZWRJdGVtKCk7XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5id2RBY3Rpb24ub25BY3Rpb24gPSAoKSA9PiB0aGlzLnByZXZJdGVtKCk7XHJcbiAgICAgIHRoaXMucGxheVN0YXJ0QWN0aW9uLm9uQWN0aW9uID0gKCkgPT4gdGhpcy5jb250cm9sQXVkaW9QbGF5ZXIuc3RhcnQoKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zdGFydFN0b3BTaWduYWxTdGF0ZSA9IFN0YXJ0U3RvcFNpZ25hbFN0YXRlLk9GRjtcclxuXHJcbn1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleXByZXNzJywgWyckZXZlbnQnXSlcclxuICBvbktleVByZXNzKGtlOiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICBpZiAoa2Uua2V5ID09ICcgJykge1xyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RhcnRBY3Rpb24ucGVyZm9ybSgpO1xyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMubmV4dEFjdGlvbi5wZXJmb3JtKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5ZG93bicsIFsnJGV2ZW50J10pXHJcbiAgb25LZXlEb3duKGtlOiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICBpZiAoa2Uua2V5ID09ICcgJykge1xyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RvcEFjdGlvbi5wZXJmb3JtKCk7XHJcbiAgICB9XHJcbiAgICBpZiAoa2Uua2V5ID09ICdwJykge1xyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMucGF1c2VBY3Rpb24ucGVyZm9ybSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChrZS5rZXkgPT0gJ0VzY2FwZScpIHtcclxuICAgICAgaWYoIXRoaXMuYXVkaW9TaWduYWxDb2xsYXBzZWQpe1xyXG4gICAgICAgIHRoaXMuYXVkaW9TaWduYWxDb2xsYXBzZWQ9dHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RvcEFjdGlvbi5wZXJmb3JtKCk7XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5wYXVzZUFjdGlvbi5wZXJmb3JtKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGtlLmtleSA9PSAnTWVkaWFQbGF5UGF1c2UnKSB7XHJcbiAgICAgIHRoaXMucGxheVN0YXJ0QWN0aW9uLnBlcmZvcm0oKTtcclxuICAgIH1cclxuICAgIGlmIChrZS5rZXkgPT09ICdBcnJvd1JpZ2h0Jykge1xyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuZndkQWN0aW9uLnBlcmZvcm0oKTtcclxuICAgIH1cclxuICAgIGlmIChrZS5rZXkgPT09ICdBcnJvd0xlZnQnKSB7XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5id2RBY3Rpb24ucGVyZm9ybSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXBkYXRlV2FrZUxvY2soZGF0YVNhdmVkOmJvb2xlYW49dGhpcy5kYXRhU2F2ZWQpe1xyXG4gICAgLy9jb25zb2xlLmRlYnVnKFwiVXBkYXRlIHdha2UgbG9jazogZGF0YVNhdmVkOiBcIitkYXRhU2F2ZWQrXCIsIG5vdCBhY3RpdmU6IFwiKyEgdGhpcy5pc0FjdGl2ZSgpKVxyXG4gICAgaWYoZGF0YVNhdmVkICYmICEgdGhpcy5pc0FjdGl2ZSgpKXtcclxuICAgICAgdGhpcy5kaXNhYmxlV2FrZUxvY2tDb25kKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm9ncmVzc1BlcmNlbnRWYWx1ZSgpOm51bWJlciB7XHJcbiAgICBsZXQgdj0xMDA7XHJcbiAgICBpZih0aGlzLml0ZW1zKSB7XHJcbiAgICAgIHY9dGhpcy5wcm9tcHRJbmRleCAqIDEwMCAvICh0aGlzLml0ZW1zLmxlbmd0aCAtIDEpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHY7XHJcbiAgfVxyXG4gIGlzVGVzdFNlc3Npb24oKTpib29sZWFuIHtcclxuICAgIHJldHVybiAoKHRoaXMuX3Nlc3Npb24hPW51bGwpICYmICh0aGlzLl9zZXNzaW9uLnR5cGUgPT09ICdURVNUJyB8fCB0aGlzLl9zZXNzaW9uLnR5cGU9PT0nVEVTVF9ERUZfQScgfHwgdGhpcy5fc2Vzc2lvbi50eXBlID09PSAnU0lOVVNfVEVTVCcpKTtcclxuICB9XHJcblxyXG4gIGlzRGVmYXVsdEF1ZGlvVGVzdFNlc3Npb24oKTpib29sZWFuIHtcclxuICAgIHJldHVybiAoKHRoaXMuX3Nlc3Npb24hPW51bGwpICYmICh0aGlzLl9zZXNzaW9uLnR5cGU9PT0nVEVTVF9ERUZfQScpKTtcclxuICB9XHJcblxyXG4gIGlzRGVmYXVsdEF1ZGlvVGVzdFNlc3Npb25PdmVyd3JpdGVpbmdQcm9qZWN0UmVxdWlyZW1lbnRzKCk6Ym9vbGVhbiB7XHJcbiAgICByZXR1cm4gKCh0aGlzLl9zZXNzaW9uIT1udWxsKSAmJiAodGhpcy5fc2Vzc2lvbi50eXBlPT09J1RFU1RfREVGX0EnKSAmJiAodGhpcy5hdWRpb0RldmljZXMhPW51bGwpICYmIHRoaXMuYXVkaW9EZXZpY2VzLmxlbmd0aD4wKVxyXG4gIH1cclxuXHJcblxyXG4gIHNldCBjb250cm9sQXVkaW9QbGF5ZXIoY29udHJvbEF1ZGlvUGxheWVyOiBBdWRpb1BsYXllcikge1xyXG4gICAgaWYgKHRoaXMuX2NvbnRyb2xBdWRpb1BsYXllcikge1xyXG4gICAgICAvL3RoaXMuX2NvbnRyb2xBdWRpb1BsYXllci5saXN0ZW5lcj1udWxsO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fY29udHJvbEF1ZGlvUGxheWVyID0gY29udHJvbEF1ZGlvUGxheWVyO1xyXG4gICAgaWYgKHRoaXMuX2NvbnRyb2xBdWRpb1BsYXllcikge1xyXG4gICAgICB0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIubGlzdGVuZXIgPSB0aGlzO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGNvbnRyb2xBdWRpb1BsYXllcigpOiBBdWRpb1BsYXllciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29udHJvbEF1ZGlvUGxheWVyO1xyXG4gIH1cclxuXHJcbiAgc2V0IHNjcmlwdChzY3JpcHQ6IGFueSkge1xyXG4gICAgdGhpcy5fc2NyaXB0ID0gc2NyaXB0O1xyXG4gICAgdGhpcy5sb2FkU2NyaXB0KCk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGUoZTogQXVkaW9QbGF5ZXJFdmVudCkge1xyXG4gICAgaWYgKGUudHlwZSA9PSBFdmVudFR5cGUuU1RBUlRFRCkge1xyXG4gICAgICB0aGlzLnBsYXlTdGFydEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMudXBkYXRlVGltZXJJZCA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgICAgLy90aGlzLmF1ZGlvU2lnbmFsLnBsYXlGcmFtZVBvc2l0aW9uID0gdGhpcy5hcC5wbGF5UG9zaXRpb25GcmFtZXM7XHJcbiAgICAgIH0sIDUwKTtcclxuICAgIH0gZWxzZSBpZiAoZS50eXBlID09IEV2ZW50VHlwZS5TVE9QUEVEIHx8IGUudHlwZSA9PSBFdmVudFR5cGUuRU5ERUQpIHtcclxuICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy51cGRhdGVUaW1lcklkKTtcclxuICAgICAgLy8gdGhpcy5hdWRpb1NpZ25hbC5wbGF5RnJhbWVQb3NpdGlvbiA9IHRoaXMuYXAucGxheVBvc2l0aW9uRnJhbWVzO1xyXG4gICAgICB0aGlzLnBsYXlTdGFydEFjdGlvbi5kaXNhYmxlZCA9ICghKHRoaXMuZGlzcGxheVJlY0ZpbGUpKTtcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgcHJvbXB0SW5kZXgoKTpudW1iZXJ7XHJcbiAgICByZXR1cm4gdGhpcy5fcHJvbXB0SW5kZXg7XHJcbiAgfVxyXG5cclxuICBzZXQgcHJvbXB0SW5kZXgocHJvbXB0SW5kZXg6bnVtYmVyKXtcclxuICAgIGlmKHByb21wdEluZGV4PDAgfHwgcHJvbXB0SW5kZXg+PXRoaXMucHJvbXB0SXRlbUNvdW50KXtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUHJvbXB0IGluZGV4IG91dCBvZiByYW5nZVwiKVxyXG4gICAgfVxyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgbGV0IHNlY3Rpb25zPXRoaXMuX3NjcmlwdC5zZWN0aW9ucztcclxuICAgIGxldCBmb3VuZD1mYWxzZTtcclxuICAgIGZvciAobGV0IHNpID0gMDsgc2kgPCBzZWN0aW9ucy5sZW5ndGggJiYgIWZvdW5kOyBzaSsrKSB7XHJcbiAgICAgIGxldCBzZWN0aW9uID0gc2VjdGlvbnNbc2ldO1xyXG4gICAgICBsZXQgZ3MgPSBzZWN0aW9uLl9zaHVmZmxlZEdyb3VwcztcclxuICAgICAgZm9yIChsZXQgZ2kgPSAwOyBnaSA8IGdzLmxlbmd0aDsgZ2krKykge1xyXG4gICAgICAgIGxldCBwaXM9Z3NbZ2ldLl9zaHVmZmxlZFByb21wdEl0ZW1zO1xyXG5cclxuICAgICAgICBsZXQgcGlzU2l6ZSA9IHBpcy5sZW5ndGg7XHJcbiAgICAgICAgaWYgKHByb21wdEluZGV4IDwgaSArIHBpc1NpemUpIHtcclxuICAgICAgICAgIHRoaXMuc2VjdElkeCA9IHNpO1xyXG4gICAgICAgICAgdGhpcy5ncm91cElkeEluU2VjdGlvbj1naTtcclxuICAgICAgICAgIHRoaXMucHJvbXB0SXRlbUlkeEluR3JvdXAgPSBwcm9tcHRJbmRleCAtIGk7XHJcbiAgICAgICAgICBmb3VuZD10cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGkgKz0gcGlzU2l6ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmKGZvdW5kKXtcclxuICAgICAgdGhpcy5fcHJvbXB0SW5kZXg9cHJvbXB0SW5kZXg7XHJcbiAgICB9ZWxzZXtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW50ZXJuYWwgZXJyb3I6IFByb21wdCBpbmRleCBub3QgZm91bmRcIilcclxuICAgIH1cclxuICAgIHRoaXMuYXBwbHlJdGVtKCk7XHJcbiAgfVxyXG5cclxuICBpdGVtU2VsZWN0KGl0ZW1JZHg6IG51bWJlcikge1xyXG4gICAgaWYgKHRoaXMuc3RhdHVzID09PSBTdGF0dXMuSURMRSkge1xyXG4gICAgICB0aGlzLnByb21wdEluZGV4PWl0ZW1JZHg7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcblxyXG5cclxuICBzdGFydEl0ZW0oKSB7XHJcbiAgICB0aGlzLnN0YXR1cz1TdGF0dXMuU1RBUlRJTkc7XHJcbiAgICBzdXBlci5zdGFydEl0ZW0oKTtcclxuICAgIGlmICh0aGlzLnJlYWRvbmx5KSB7XHJcbiAgICAgIHRoaXMuc3RhdHVzPVN0YXR1cy5JRExFO1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5md2RBY3Rpb24uZGlzYWJsZWQgPSB0cnVlXHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuZndkTmV4dEFjdGlvbi5kaXNhYmxlZCA9IHRydWVcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5id2RBY3Rpb24uZGlzYWJsZWQgPSB0cnVlXHJcbiAgICB0aGlzLnVwZGF0ZURpc3BsYXlSZWNGaWxlKG51bGwpO1xyXG4gICAgdGhpcy5kaXNwbGF5UmVjRmlsZVZlcnNpb24gPSAwO1xyXG4gICAgdGhpcy5kaXNwbGF5QXVkaW9DbGlwID0gbnVsbDtcclxuICAgIHRoaXMuc2hvd1JlY29yZGluZygpO1xyXG4gICAgaWYgKHRoaXMuc2VjdGlvbi5tb2RlID09PSAnQVVUT1JFQ09SRElORycpIHtcclxuICAgICAgdGhpcy5hdXRvcmVjb3JkaW5nID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZih0aGlzLmFjIT1udWxsKSB7XHJcbiAgICAgIGlmICghdGhpcy5hYy5vcGVuZWQpIHtcclxuICAgICAgICBpZiAodGhpcy5fc2VsZWN0ZWREZXZpY2VJZCkge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJPcGVuIHNlc3Npb24gd2l0aCBhdWRpbyBkZXZpY2UgSWQ6IFxcJ1wiICsgdGhpcy5fc2VsZWN0ZWREZXZpY2VJZCArIFwiXFwnIGZvciBcIiArIHRoaXMuX2NoYW5uZWxDb3VudCArIFwiIGNoYW5uZWxzXCIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIk9wZW4gc2Vzc2lvbiB3aXRoIGRlZmF1bHQgYXVkaW8gZGV2aWNlIGZvciBcIiArIHRoaXMuX2NoYW5uZWxDb3VudCArIFwiIGNoYW5uZWxzXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFjLm9wZW4odGhpcy5fY2hhbm5lbENvdW50LCB0aGlzLl9zZWxlY3RlZERldmljZUlkLHRoaXMuX2F1dG9HYWluQ29udHJvbENvbmZpZ3MpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuYWMuc3RhcnQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgbG9hZFNjcmlwdCgpIHtcclxuICAgIHRoaXMucHJvbXB0SXRlbUNvdW50ID0gMDtcclxuXHJcbiAgICB0aGlzLml0ZW1zID0gbmV3IEFycmF5PEl0ZW0+KCk7XHJcbiAgICBsZXQgbG4gPSAwO1xyXG5cclxuICAgIC8vVE9ETyByYW5kb21pemUgbm90IHN1cHBvcnRlZFxyXG4gICAgZm9yIChsZXQgc2kgPSAwOyBzaSA8IHRoaXMuX3NjcmlwdC5zZWN0aW9ucy5sZW5ndGg7IHNpKyspIHtcclxuICAgICAgbGV0IHNlY3Rpb24gPSB0aGlzLl9zY3JpcHQuc2VjdGlvbnNbc2ldO1xyXG4gICAgICBsZXQgZ3MgPSBzZWN0aW9uLl9zaHVmZmxlZEdyb3VwcztcclxuICAgICAgZm9yKGxldCBnaT0wO2dpPGdzLmxlbmd0aDtnaSsrKSB7XHJcblxyXG4gICAgICAgICAgbGV0IHBpcyA9IGdzW2dpXS5fc2h1ZmZsZWRQcm9tcHRJdGVtcztcclxuXHJcbiAgICAgICAgICBsZXQgcGlzTGVuID0gcGlzLmxlbmd0aDtcclxuICAgICAgICAgIHRoaXMucHJvbXB0SXRlbUNvdW50ICs9IHBpc0xlbjtcclxuICAgICAgICAgIGZvciAobGV0IHBpU2VjdElkeCA9IDA7IHBpU2VjdElkeCA8IHBpc0xlbjsgcGlTZWN0SWR4KyspIHtcclxuICAgICAgICAgICAgbGV0IHBpID0gcGlzW3BpU2VjdElkeF07XHJcbiAgICAgICAgICAgIGxldCBwcm9tcHRBc1N0ciA9IFByb21wdGl0ZW1VdGlsLnRvUGxhaW5UZXh0U3RyaW5nKHBpKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBpdCA9IG5ldyBJdGVtKHByb21wdEFzU3RyLCBzZWN0aW9uLnRyYWluaW5nLCghcGkudHlwZSB8fCBwaS50eXBlPT09J3JlY29yZGluZycpKTtcclxuICAgICAgICAgICAgdGhpcy5pdGVtcy5wdXNoKGl0KTtcclxuICAgICAgICAgICAgbG4rKztcclxuICAgICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvbXB0SW5kZXhCeUl0ZW1jb2RlKGl0ZW1jb2RlOnN0cmluZyk6bnVtYmVyfG51bGx7XHJcbiAgICBsZXQgcGl4ID0gMDtcclxuXHJcbiAgICBmb3IgKGxldCBzaSA9IDA7IHNpIDwgdGhpcy5fc2NyaXB0LnNlY3Rpb25zLmxlbmd0aDsgc2krKykge1xyXG4gICAgICBsZXQgc2VjdGlvbiA9IHRoaXMuX3NjcmlwdC5zZWN0aW9uc1tzaV07XHJcbiAgICAgIGxldCBncyA9IHNlY3Rpb24uX3NodWZmbGVkR3JvdXBzO1xyXG4gICAgICBmb3IobGV0IGdpPTA7Z2k8Z3MubGVuZ3RoO2dpKyspIHtcclxuICAgICAgICBsZXQgcGlzPWdzW2dpXS5fc2h1ZmZsZWRQcm9tcHRJdGVtcztcclxuICAgICAgICBsZXQgcGlzTGVuID0gcGlzLmxlbmd0aDtcclxuICAgICAgICBmb3IgKGxldCBwaVNlY3RJZHggPSAwOyBwaVNlY3RJZHggPCBwaXNMZW47IHBpU2VjdElkeCsrKSB7XHJcbiAgICAgICAgICBsZXQgcGkgPSBwaXNbcGlTZWN0SWR4XTtcclxuICAgICAgICAgIGxldCBpYz1waS5pdGVtY29kZTtcclxuICAgICAgICAgIGlmKGljID09PSBpdGVtY29kZSl7XHJcbiAgICAgICAgICAgIHJldHVybiBwaXg7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBwaXgrKztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgY2xlYXJQcm9tcHQoKSB7XHJcbiAgICAvL3RoaXMucHJvbXB0aW5nLnByb21wdENvbnRhaW5lci5wcm9tcHRlci5wcm9tcHRUZXh0PScnO1xyXG4gICAgLy90aGlzLm1lZGlhaXRlbSA9IG51bGw7XHJcbiAgICB0aGlzLnNob3dQcm9tcHQgPSBmYWxzZTtcclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpXHJcbiAgfVxyXG5cclxuICBhcHBseVByb21wdCgpIHtcclxuICAgIC8vdGhpcy5wcm9tcHRpbmcucHJvbXB0Q29udGFpbmVyLnByb21wdGVyLnByb21wdFRleHQ9dGhpcy5wcm9tcHRVbml0Lm1lZGlhaXRlbXNbMF0udGV4dDtcclxuICAgIC8vdGhpcy5wcm9tcHRUZXh0ID0gdGhpcy5wcm9tcHRVbml0Lm1lZGlhaXRlbXNbMF0udGV4dDtcclxuICAgIC8vdGhpcy5tZWRpYWl0ZW09dGhpcy5wcm9tcHRVbml0Lm1lZGlhaXRlbXNbMF07XHJcbiAgICB0aGlzLnNob3dQcm9tcHQgPSB0cnVlO1xyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKClcclxuICB9XHJcblxyXG4gIGRvd25sb2FkUmVjb3JkaW5nKCkge1xyXG4gICAgaWYgKHRoaXMuZGlzcGxheVJlY0ZpbGUpIHtcclxuICAgICAgbGV0IGFiOiBBdWRpb0J1ZmZlcnxudWxsID0gdGhpcy5kaXNwbGF5UmVjRmlsZS5hdWRpb0J1ZmZlcjtcclxuICAgICAgbGV0IHd3ID0gbmV3IFdhdldyaXRlcigpO1xyXG4gICAgICBpZihhYikge1xyXG4gICAgICAgIGxldCB3YXZGaWxlID0gd3cud3JpdGVBc3luYyhhYiwgKHdhdkZpbGUpID0+IHtcclxuICAgICAgICAgIGxldCBibG9iID0gbmV3IEJsb2IoW3dhdkZpbGVdLCB7dHlwZTogJ2F1ZGlvL3dhdid9KTtcclxuICAgICAgICAgIGxldCByZlVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcblxyXG4gICAgICAgICAgbGV0IGRhdGFEbmxMbmsgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgICAgICAgIC8vZGF0YURubExuay5uYW1lID0gJ1JlY29yZGluZyc7XHJcbiAgICAgICAgICBkYXRhRG5sTG5rLmhyZWYgPSByZlVybDtcclxuXHJcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGRvY3VtZW50LmJvZHksIGRhdGFEbmxMbmspO1xyXG5cclxuICAgICAgICAgIC8vIGRvd25sb2FkIHByb3BlcnR5IG5vdCB5ZXQgaW4gVFMgZGVmXHJcbiAgICAgICAgICBpZiAodGhpcy5kaXNwbGF5UmVjRmlsZSkge1xyXG4gICAgICAgICAgICBsZXQgZm4gPSB0aGlzLmRpc3BsYXlSZWNGaWxlLmZpbGVuYW1lU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIGZuICs9ICdfJyArIHRoaXMuZGlzcGxheVJlY0ZpbGVWZXJzaW9uO1xyXG4gICAgICAgICAgICBmbiArPSAnLndhdic7XHJcbiAgICAgICAgICAgIGRhdGFEbmxMbmsuZG93bmxvYWQgPSBmbjtcclxuICAgICAgICAgICAgZGF0YURubExuay5jbGljaygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZChkb2N1bWVudC5ib2R5LCBkYXRhRG5sTG5rKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkQW5kU2hvd0Rpc3BsYXlSZWNvcmRpbmdGaWxlKCl7XHJcblxyXG4gIH1cclxuXHJcbiAgc2V0IGRpc3BsYXlSZWNGaWxlKGRpc3BsYXlSZWNGaWxlOiBTcHJSZWNvcmRpbmdGaWxlIHwgbnVsbCkge1xyXG4gICAgdGhpcy5fZGlzcGxheVJlY0ZpbGUgPSBkaXNwbGF5UmVjRmlsZTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZURpc3BsYXlSZWNGaWxlKGRpc3BsYXlSZWNGaWxlOiBTcHJSZWNvcmRpbmdGaWxlIHwgbnVsbCxmZXRjaEFuZEFwcGx5UmVjb3JkaW5nRmlsZTpib29sZWFuPXRydWUpIHtcclxuICAgIHRoaXMuZGlzcGxheVJlY0ZpbGU9ZGlzcGxheVJlY0ZpbGU7XHJcbiAgICBpZiAodGhpcy5fZGlzcGxheVJlY0ZpbGUpIHtcclxuICAgICAgbGV0IGFiOiBBdWRpb0J1ZmZlcnxudWxsID0gdGhpcy5fZGlzcGxheVJlY0ZpbGUuYXVkaW9CdWZmZXI7XHJcbiAgICAgIGlmKGFiKSB7XHJcbiAgICAgICAgdGhpcy5kaXNwbGF5QXVkaW9DbGlwID0gbmV3IEF1ZGlvQ2xpcChhYik7XHJcbiAgICAgICAgdGhpcy5jb250cm9sQXVkaW9QbGF5ZXIuYXVkaW9DbGlwID0gdGhpcy5kaXNwbGF5QXVkaW9DbGlwO1xyXG4gICAgICB9ZWxzZSB7XHJcbiAgICAgICAgLy8gY2xlYXIgZm9yIG5vdyAuLi5cclxuICAgICAgICB0aGlzLmRpc3BsYXlBdWRpb0NsaXAgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuY29udHJvbEF1ZGlvUGxheWVyLmF1ZGlvQ2xpcCA9IG51bGw7XHJcbiAgICAgICAgaWYoZmV0Y2hBbmRBcHBseVJlY29yZGluZ0ZpbGUpIHtcclxuICAgICAgICAgIGlmICh0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIgJiYgdGhpcy5fc2Vzc2lvbikge1xyXG4gICAgICAgICAgICAvLy4uLiBhbmQgdHJ5IHRvIGZldGNoIGZyb20gc2VydmVyXHJcbiAgICAgICAgICAgIGNvbnN0IGRSZiA9IHRoaXMuX2Rpc3BsYXlSZWNGaWxlO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5hdWRpb0ZldGNoU3Vic2NyaXB0aW9uID0gdGhpcy5yZWNGaWxlU2VydmljZS5mZXRjaEFuZEFwcGx5U3ByUmVjb3JkaW5nRmlsZSh0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIuY29udGV4dCwgdGhpcy5fc2Vzc2lvbi5wcm9qZWN0LCBkUmYpLnN1YnNjcmliZSgocmYpID0+IHtcclxuICAgICAgICAgICAgICBsZXQgZmFiID0gbnVsbDtcclxuICAgICAgICAgICAgICBpZiAocmYpIHtcclxuICAgICAgICAgICAgICAgIGZhYiA9IGRSZi5hdWRpb0J1ZmZlcjtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiUmVjb3JkaW5nIGZpbGUgY291bGQgbm90IGJlIGxvYWRlZC4gcmY6IFwiK3JmK1wiLCBfZGlzcGxheVJlY0ZpbGU6IFwiK3RoaXMuX2Rpc3BsYXlSZWNGaWxlK1wiLCBkUmY6IFwiK2RSZik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c01zZyA9ICdSZWNvcmRpbmcgZmlsZSBjb3VsZCBub3QgYmUgbG9hZGVkLidcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJ1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAoZmFiKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gVE9ETyBBc3luYyB3aWxsIHNldCB0aGUgcHJldmlvdXMgZmlsZSB3aXRoIGF1dG9yZWNvcmRpbmdcclxuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheUF1ZGlvQ2xpcCA9IG5ldyBBdWRpb0NsaXAoZmFiKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgdGhpcy5jb250cm9sQXVkaW9QbGF5ZXIuYXVkaW9DbGlwID0gdGhpcy5kaXNwbGF5QXVkaW9DbGlwXHJcbiAgICAgICAgICAgICAgdGhpcy5zaG93UmVjb3JkaW5nKCk7XHJcblxyXG4gICAgICAgICAgICB9LCBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJDb3VsZCBub3QgbG9hZCByZWNvcmRpbmcgZmlsZSBmcm9tIHNlcnZlcjogXCIgKyBlcnIpXHJcbiAgICAgICAgICAgICAgdGhpcy5zdGF0dXNNc2cgPSAnUmVjb3JkaW5nIGZpbGUgY291bGQgbm90IGJlIGxvYWRlZDogJyArIGVyclxyXG4gICAgICAgICAgICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJ1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zdGF0dXNNc2cgPSAnUmVjb3JkaW5nIGZpbGUgY291bGQgbm90IGJlIGRlY29kZWQuIEF1ZGlvIGNvbnRleHQgdW5hdmFpbGFibGUuJ1xyXG4gICAgICAgICAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZSA9ICdlcnJvcidcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmRpc3BsYXlBdWRpb0NsaXAgPSBudWxsO1xyXG4gICAgICB0aGlzLmNvbnRyb2xBdWRpb1BsYXllci5hdWRpb0NsaXAgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGRpc3BsYXlSZWNGaWxlKCk6IFNwclJlY29yZGluZ0ZpbGUgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLl9kaXNwbGF5UmVjRmlsZTtcclxuICB9XHJcblxyXG4gIHNob3dSZWNvcmRpbmcoKSB7XHJcbiAgICB0aGlzLmNvbnRyb2xBdWRpb1BsYXllci5zdG9wKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuZGlzcGxheUF1ZGlvQ2xpcCkge1xyXG4gICAgICBsZXQgZGFwPXRoaXMuZGlzcGxheUF1ZGlvQ2xpcDtcclxuICAgICAgdGhpcy5sZXZlbE1lYXN1cmUuY2FsY0J1ZmZlckxldmVsSW5mb3MoZGFwLmJ1ZmZlciwgTEVWRUxfQkFSX0lOVEVSVkFMTF9TRUNPTkRTKS50aGVuKChsZXZlbEluZm9zKSA9PiB7XHJcbiAgICAgICAgICBkYXAubGV2ZWxJbmZvcyA9IGxldmVsSW5mb3M7XHJcbiAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMucGxheVN0YXJ0QWN0aW9uLmRpc2FibGVkID0gZmFsc2U7XHJcblxyXG4gICAgfSBlbHNlIHtcclxuXHJcbiAgICAgIHRoaXMucGxheVN0YXJ0QWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgIC8vIENvbGxhcHNlIGF1ZGlvIHNpZ25hbCBkaXNwbGF5IGlmIG9wZW5cclxuICAgICAgaWYgKCF0aGlzLmF1ZGlvU2lnbmFsQ29sbGFwc2VkKSB7XHJcbiAgICAgICAgdGhpcy5hdWRpb1NpZ25hbENvbGxhcHNlZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcblxyXG4gIGlzUmVjb3JkaW5nSXRlbSgpOmJvb2xlYW57XHJcbiAgICByZXR1cm4odGhpcy5wcm9tcHRJdGVtIT1udWxsICYmIHRoaXMucHJvbXB0SXRlbS50eXBlIT09J25vbnJlY29yZGluZycpXHJcbiAgfVxyXG5cclxuICB1cGRhdGVTdGFydEFjdGlvbkRpc2FibGVTdGF0ZSgpe1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0YXJ0QWN0aW9uLmRpc2FibGVkPSEodGhpcy5hYyAgJiYgdGhpcy5pc1JlY29yZGluZ0l0ZW0oKSk7XHJcbiAgfVxyXG5cclxuICBhcHBseUl0ZW0odGVtcG9yYXJ5PWZhbHNlKSB7XHJcblxyXG4gICAgdGhpcy5zZWN0aW9uID0gdGhpcy5fc2NyaXB0LnNlY3Rpb25zW3RoaXMuc2VjdElkeF1cclxuICAgIHRoaXMuZ3JvdXAgPSB0aGlzLnNlY3Rpb24uX3NodWZmbGVkR3JvdXBzW3RoaXMuZ3JvdXBJZHhJblNlY3Rpb25dO1xyXG4gICAgdGhpcy5wcm9tcHRJdGVtID0gdGhpcy5ncm91cC5fc2h1ZmZsZWRQcm9tcHRJdGVtc1t0aGlzLnByb21wdEl0ZW1JZHhJbkdyb3VwXTtcclxuXHJcbiAgICAvL3RoaXMuc2VsZWN0ZWRJdGVtSWR4ID0gdGhpcy5wcm9tcHRJbmRleDtcclxuXHJcbiAgICBpZih0aGlzLmF1ZGlvRmV0Y2hTdWJzY3JpcHRpb24pe1xyXG4gICAgICB0aGlzLmF1ZGlvRmV0Y2hTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2xlYXJQcm9tcHQoKTtcclxuXHJcbiAgICBsZXQgaXNOb25yZWNvcmRpbmc9KHRoaXMucHJvbXB0SXRlbS50eXBlPT09J25vbnJlY29yZGluZycpXHJcblxyXG4gICAgaWYgKGlzTm9ucmVjb3JkaW5nIHx8ICF0aGlzLnNlY3Rpb24ucHJvbXB0cGhhc2UgfHwgdGhpcy5zZWN0aW9uLnByb21wdHBoYXNlID09PSAnSURMRScpIHtcclxuICAgICAgdGhpcy5hcHBseVByb21wdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmKGlzTm9ucmVjb3JkaW5nKXtcclxuICAgICAgdGhpcy51cGRhdGVEaXNwbGF5UmVjRmlsZShudWxsKTtcclxuICAgICAgdGhpcy5kaXNwbGF5UmVjRmlsZVZlcnNpb24gPSAwO1xyXG4gICAgICB0aGlzLnN0YXJ0U3RvcFNpZ25hbFN0YXRlID0gU3RhcnRTdG9wU2lnbmFsU3RhdGUuT0ZGO1xyXG4gICAgfWVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5pdGVtcykge1xyXG4gICAgICAgIGxldCBpdCA9IHRoaXMuaXRlbXNbdGhpcy5wcm9tcHRJbmRleF07XHJcbiAgICAgICAgaWYgKCFpdC5yZWNzKSB7XHJcbiAgICAgICAgICBpdC5yZWNzID0gbmV3IEFycmF5PFNwclJlY29yZGluZ0ZpbGU+KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgcmVjZW50UmVjRmlsZTogU3ByUmVjb3JkaW5nRmlsZSB8IG51bGwgPSBudWxsO1xyXG4gICAgICAgIGxldCBhdmFpbFJlY2ZpbGVzOiBudW1iZXIgPSBpdC5yZWNzLmxlbmd0aDtcclxuICAgICAgICBpZiAoYXZhaWxSZWNmaWxlcyA+IDApIHtcclxuICAgICAgICAgIGxldCByZlZlcnM6IG51bWJlciA9IGF2YWlsUmVjZmlsZXMgLSAxO1xyXG4gICAgICAgICAgcmVjZW50UmVjRmlsZSA9IGl0LnJlY3NbcmZWZXJzXTtcclxuICAgICAgICAgIHRoaXMudXBkYXRlRGlzcGxheVJlY0ZpbGUocmVjZW50UmVjRmlsZSwhdGVtcG9yYXJ5KTtcclxuICAgICAgICAgIHRoaXMuZGlzcGxheVJlY0ZpbGVWZXJzaW9uID0gcmZWZXJzO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVEaXNwbGF5UmVjRmlsZShudWxsKTtcclxuICAgICAgICAgIHRoaXMuZGlzcGxheVJlY0ZpbGVWZXJzaW9uID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYoIXRoaXMucmVhZG9ubHkpIHtcclxuICAgICAgICB0aGlzLnN0YXJ0U3RvcFNpZ25hbFN0YXRlID0gU3RhcnRTdG9wU2lnbmFsU3RhdGUuSURMRTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKCF0ZW1wb3JhcnkpIHtcclxuICAgICAgdGhpcy5zaG93UmVjb3JkaW5nKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnVwZGF0ZVN0YXJ0QWN0aW9uRGlzYWJsZVN0YXRlKClcclxuICAgIHRoaXMudXBkYXRlTmF2aWdhdGlvbkFjdGlvbnMoKVxyXG4gIH1cclxuXHJcblxyXG4gIHN0YXJ0KCkge1xyXG4gICAgc3VwZXIuc3RhcnQoKTtcclxuICAgIGlmKHRoaXMucHJvbXB0SXRlbUNvdW50PjApIHtcclxuICAgICAgdGhpcy5wcm9tcHRJbmRleCA9IDA7XHJcbiAgICB9XHJcbiAgICB0aGlzLmVuYWJsZU5hdmlnYXRpb24oKVxyXG4gIH1cclxuXHJcbiAgaXNSZWNvcmRpbmcoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKHRoaXMuc3RhdHVzID09PSBTdGF0dXMuUFJFX1JFQ09SRElORyB8fCB0aGlzLnN0YXR1cyA9PT0gU3RhdHVzLlJFQ09SRElORyk7XHJcbiAgfVxyXG5cclxuICBpc0FjdGl2ZSgpOiBib29sZWFue1xyXG4gICAgcmV0dXJuICghKHRoaXMuc3RhdHVzID09PSBTdGF0dXMuQkxPQ0tFRCB8fCB0aGlzLnN0YXR1cz09PSBTdGF0dXMuSURMRSB8fCB0aGlzLnN0YXR1cz09PVN0YXR1cy5FUlJPUikgfHwgdGhpcy5wcm9jZXNzaW5nUmVjb3JkaW5nIHx8IHRoaXMuc2Vzc2lvblNlcnZpY2UudXBsb2FkQ291bnQ+MClcclxuICB9XHJcblxyXG4gICAgcHJldkl0ZW0oKSB7XHJcbiAgICAgICBsZXQgbmV3UHJJZHg9dGhpcy5fcHJvbXB0SW5kZXg7XHJcbiAgICAgICBuZXdQcklkeC0tO1xyXG4gICAgICAgaWYobmV3UHJJZHg8MCl7XHJcbiAgICAgICAgIG5ld1BySWR4PXRoaXMucHJvbXB0SXRlbUNvdW50LTE7XHJcbiAgICAgICB9XHJcbiAgICAgICB0aGlzLnByb21wdEluZGV4PW5ld1BySWR4O1xyXG4gICAgICAvL3RoaXMudXBkYXRlTmF2aWdhdGlvbkFjdGlvbnMoKVxyXG4gICAgfVxyXG5cclxuXHJcbiAgbmV4dEl0ZW0oKSB7XHJcbiAgICBsZXQgbmV3UHJJZHg9dGhpcy5fcHJvbXB0SW5kZXg7XHJcbiAgICBuZXdQcklkeCsrO1xyXG4gICAgaWYobmV3UHJJZHg+PXRoaXMucHJvbXB0SXRlbUNvdW50KXtcclxuICAgICAgbmV3UHJJZHg9MDtcclxuICAgIH1cclxuICAgIHRoaXMucHJvbXB0SW5kZXg9bmV3UHJJZHg7XHJcbiAgICAvL3RoaXMudXBkYXRlTmF2aWdhdGlvbkFjdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlTmF2aWdhdGlvbkFjdGlvbnMoKXtcclxuICAgIGxldCBmd2ROeHRBY3Rpb25EaXNhYmxlZD10cnVlO1xyXG4gICAgaWYodGhpcy5pdGVtcyl7XHJcbiAgICAgIGxldCBjdXJyUmVjcz10aGlzLml0ZW1zW3RoaXMuX3Byb21wdEluZGV4XS5yZWNzO1xyXG4gICAgICBmd2ROeHRBY3Rpb25EaXNhYmxlZD0gISAoY3VyclJlY3MhPW51bGwgJiYgY3VyclJlY3MubGVuZ3RoPjApO1xyXG4gICAgfVxyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLmZ3ZE5leHRBY3Rpb24uZGlzYWJsZWQgPSB0aGlzLm5hdmlnYXRpb25EaXNhYmxlZCB8fCBmd2ROeHRBY3Rpb25EaXNhYmxlZDtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5md2RBY3Rpb24uZGlzYWJsZWQgPSB0aGlzLm5hdmlnYXRpb25EaXNhYmxlZDtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5id2RBY3Rpb24uZGlzYWJsZWQgPSB0aGlzLm5hdmlnYXRpb25EaXNhYmxlZDtcclxuICB9XHJcblxyXG4gIG5leHRVbnJlY29yZGVkSXRlbSgpIHtcclxuICAgIGxldCBuZXdQcklkeCA9IHRoaXMuX3Byb21wdEluZGV4O1xyXG4gICAgbmV3UHJJZHgrKztcclxuICAgIGlmIChuZXdQcklkeCA+PSB0aGlzLnByb21wdEl0ZW1Db3VudCkge1xyXG4gICAgICBuZXdQcklkeCA9IDA7XHJcbiAgICB9XHJcbiAgICBpZih0aGlzLml0ZW1zIT1udWxsKSB7XHJcbiAgICAgIGxldCBpdFJlY3M9dGhpcy5pdGVtc1tuZXdQcklkeF0ucmVjcztcclxuICAgICAgd2hpbGUgKGl0UmVjcyE9bnVsbCAmJiAoaXRSZWNzLmxlbmd0aCA+IDApICYmIG5ld1BySWR4IDwgdGhpcy5wcm9tcHRJdGVtQ291bnQpIHtcclxuICAgICAgICBuZXdQcklkeCsrO1xyXG4gICAgICAgIGl0UmVjcz10aGlzLml0ZW1zW25ld1BySWR4XS5yZWNzO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghaXRSZWNzIHx8IGl0UmVjcy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgIHRoaXMucHJvbXB0SW5kZXggPSBuZXdQcklkeDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZW5hYmxlU3RhcnRVc2VyR2VzdHVyZSgpIHtcclxuICAgIHN1cGVyLmVuYWJsZVN0YXJ0VXNlckdlc3R1cmUoKTtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdGFydEFjdGlvbi5kaXNhYmxlZD0hKHRoaXMuYWMgJiYgdGhpcy5pc1JlY29yZGluZ0l0ZW0oKSk7XHJcbiAgfVxyXG5cclxuICBlbmFibGVOYXZpZ2F0aW9uKCl7XHJcbiAgICB0aGlzLm5hdmlnYXRpb25EaXNhYmxlZD1mYWxzZTtcclxuICAgIHRoaXMudXBkYXRlTmF2aWdhdGlvbkFjdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIG9wZW5lZCgpIHtcclxuICAgIGlmKHRoaXMuYWMpIHtcclxuICAgICAgdGhpcy5hYy5zdGFydCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhcnRlZCgpIHtcclxuICAgIHRoaXMuc3RhdHVzID0gU3RhdHVzLlBSRV9SRUNPUkRJTkc7XHJcbiAgICBzdXBlci5zdGFydGVkKCk7XHJcbiAgICB0aGlzLnN0YXJ0U3RvcFNpZ25hbFN0YXRlID0gU3RhcnRTdG9wU2lnbmFsU3RhdGUuUFJFUkVDT1JESU5HO1xyXG4gICAgaWYodGhpcy5fc2Vzc2lvbikge1xyXG4gICAgICBpZiAodGhpcy5fc2Vzc2lvbi5zdGF0dXMgPT09IFwiTE9BREVEXCIpIHtcclxuICAgICAgICBsZXQgYm9keTogYW55ID0ge307XHJcbiAgICAgICAgaWYgKHRoaXMuc2VjdGlvbi50cmFpbmluZykge1xyXG4gICAgICAgICAgdGhpcy5fc2Vzc2lvbi5zdGF0dXMgPSBcIlNUQVJURURfVFJBSU5JTkdcIlxyXG4gICAgICAgICAgYm9keS5zdGF0dXMgPSB0aGlzLl9zZXNzaW9uLnN0YXR1cztcclxuICAgICAgICAgIGlmICghdGhpcy5fc2Vzc2lvbi5zdGFydGVkVHJhaW5pbmdEYXRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Nlc3Npb24uc3RhcnRlZFRyYWluaW5nRGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgIGJvZHkuc3RhcnRlZFRyYWluaW5nRGF0ZSA9IHRoaXMuX3Nlc3Npb24uc3RhcnRlZFRyYWluaW5nRGF0ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5fc2Vzc2lvbi5zdGF0dXMgPSBcIlNUQVJURURcIlxyXG4gICAgICAgICAgYm9keS5zdGF0dXMgPSB0aGlzLl9zZXNzaW9uLnN0YXR1cztcclxuICAgICAgICAgIGlmICghdGhpcy5fc2Vzc2lvbi5zdGFydGVkRGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9zZXNzaW9uLnN0YXJ0ZWREYXRlID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgYm9keS5zdGFydGVkRGF0ZSA9IHRoaXMuX3Nlc3Npb24uc3RhcnRlZERhdGU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2Vzc2lvblNlcnZpY2UucGF0Y2hTZXNzaW9uT2JzZXJ2ZXIodGhpcy5fc2Vzc2lvbiwgYm9keSkuc3Vic2NyaWJlKClcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc2VjdGlvbi5wcm9tcHRwaGFzZSA9PT0gJ1BSRVJFQ09SRElORycgfHwgdGhpcy5zZWN0aW9uLnByb21wdHBoYXNlID09PSAnUFJFUkVDT1JESU5HT05MWScpIHtcclxuICAgICAgdGhpcy5hcHBseVByb21wdCgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zdGF0dXNBbGVydFR5cGUgPSAnaW5mbyc7XHJcbiAgICB0aGlzLnN0YXR1c01zZyA9ICdSZWNvcmRpbmcuLi4nO1xyXG5cclxuICAgIGxldCBwcmVEZWxheSA9IERFRkFVTFRfUFJFX1JFQ19ERUxBWTtcclxuICAgIGlmICh0aGlzLnByb21wdEl0ZW0ucHJlcmVjZGVsYXkhPW51bGwpIHtcclxuICAgICAgcHJlRGVsYXkgPSB0aGlzLnByb21wdEl0ZW0ucHJlcmVjZGVsYXk7XHJcbiAgICB9ZWxzZSBpZiAodGhpcy5wcm9tcHRJdGVtLnByZXJlY29yZGluZyE9bnVsbCkge1xyXG4gICAgICBwcmVEZWxheSA9IHRoaXMucHJvbXB0SXRlbS5wcmVyZWNvcmRpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5wb3N0RGVsYXk9REVGQVVMVF9QT1NUX1JFQ19ERUxBWTtcclxuICAgIGlmKHRoaXMucHJvbXB0SXRlbS5wb3N0cmVjZGVsYXkhPW51bGwpe1xyXG4gICAgICB0aGlzLnBvc3REZWxheT10aGlzLnByb21wdEl0ZW0ucG9zdHJlY2RlbGF5O1xyXG4gICAgfWVsc2UgaWYodGhpcy5wcm9tcHRJdGVtLnBvc3RyZWNvcmRpbmchPW51bGwpe1xyXG4gICAgICB0aGlzLnBvc3REZWxheT10aGlzLnByb21wdEl0ZW0ucG9zdHJlY29yZGluZztcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbWF4UmVjb3JkaW5nVGltZU1zID0gTUFYX1JFQ09SRElOR19USU1FX01TO1xyXG4gICAgaWYgKHRoaXMucHJvbXB0SXRlbS5yZWNkdXJhdGlvbiE9PW51bGwgJiYgdGhpcy5wcm9tcHRJdGVtLnJlY2R1cmF0aW9uIT09dW5kZWZpbmVkKSB7XHJcbiAgICAgIG1heFJlY29yZGluZ1RpbWVNcyA9IHByZURlbGF5K3RoaXMucHJvbXB0SXRlbS5yZWNkdXJhdGlvbit0aGlzLnBvc3REZWxheTtcclxuICAgIH1cclxuICAgIHRoaXMubWF4UmVjVGltZXJJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5zdG9wUmVjb3JkaW5nTWF4UmVjKClcclxuICAgIH0sIG1heFJlY29yZGluZ1RpbWVNcyk7XHJcbiAgICB0aGlzLm1heFJlY1RpbWVyUnVubmluZyA9IHRydWU7XHJcblxyXG5cclxuXHJcbiAgICB0aGlzLnByZVJlY1RpbWVySWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcblxyXG4gICAgICB0aGlzLnByZVJlY1RpbWVyUnVubmluZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnN0YXR1cyA9IFN0YXR1cy5SRUNPUkRJTkc7XHJcbiAgICAgIHRoaXMuc3RhcnRTdG9wU2lnbmFsU3RhdGUgPSBTdGFydFN0b3BTaWduYWxTdGF0ZS5SRUNPUkRJTkc7XHJcbiAgICAgIGlmICh0aGlzLnNlY3Rpb24ubW9kZSA9PT0gJ0FVVE9SRUNPUkRJTkcnKSB7XHJcbiAgICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLm5leHRBY3Rpb24uZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMucGF1c2VBY3Rpb24uZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RvcEFjdGlvbi5kaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLnNlY3Rpb24ucHJvbXB0cGhhc2UgPT09ICdSRUNPUkRJTkcnKSB7XHJcbiAgICAgICAgdGhpcy5hcHBseVByb21wdCgpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLnNlY3Rpb24ucHJvbXB0cGhhc2UgPT09ICdQUkVSRUNPUkRJTkdPTkxZJyl7XHJcbiAgICAgICAgdGhpcy5jbGVhclByb21wdCgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfSwgcHJlRGVsYXkpO1xyXG4gICAgdGhpcy5wcmVSZWNUaW1lclJ1bm5pbmcgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgc3RvcEl0ZW0oKSB7XHJcbiAgICB0aGlzLnN0YXR1cyA9IFN0YXR1cy5QT1NUX1JFQ19TVE9QO1xyXG4gICAgdGhpcy5zdGFydFN0b3BTaWduYWxTdGF0ZSA9IFN0YXJ0U3RvcFNpZ25hbFN0YXRlLlBPU1RSRUNPUkRJTkc7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RvcEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMubmV4dEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcblxyXG4gICAgdGhpcy5wb3N0UmVjVGltZXJJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5wb3N0UmVjVGltZXJSdW5uaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuc3RhdHVzID0gU3RhdHVzLlNUT1BQSU5HX1NUT1A7XHJcbiAgICAgIHRoaXMuc3RvcFJlY29yZGluZygpO1xyXG4gICAgfSwgdGhpcy5wb3N0RGVsYXkpO1xyXG4gICAgdGhpcy5wb3N0UmVjVGltZXJSdW5uaW5nID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHBhdXNlSXRlbSgpIHtcclxuICAgIHRoaXMuc3RhdHVzID0gU3RhdHVzLlBPU1RfUkVDX1BBVVNFO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnBhdXNlQWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMuc3RhcnRTdG9wU2lnbmFsU3RhdGUgPSBTdGFydFN0b3BTaWduYWxTdGF0ZS5QT1NUUkVDT1JESU5HO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0b3BBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLm5leHRBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnBhdXNlQWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuXHJcbiAgICB0aGlzLnBvc3RSZWNUaW1lcklkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnBvc3RSZWNUaW1lclJ1bm5pbmcgPSBmYWxzZTtcclxuICAgICAgdGhpcy5zdGF0dXMgPSBTdGF0dXMuU1RPUFBJTkdfUEFVU0U7XHJcbiAgICAgIHRoaXMuc3RvcFJlY29yZGluZygpO1xyXG4gICAgfSwgdGhpcy5wb3N0RGVsYXkpO1xyXG4gICAgdGhpcy5wb3N0UmVjVGltZXJSdW5uaW5nID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHN0b3BSZWNvcmRpbmcoKSB7XHJcbiAgICBpZiAodGhpcy5tYXhSZWNUaW1lclJ1bm5pbmcpIHtcclxuICAgICAgaWYodGhpcy5tYXhSZWNUaW1lcklkKSB7XHJcbiAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLm1heFJlY1RpbWVySWQpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMubWF4UmVjVGltZXJSdW5uaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZih0aGlzLmFjKSB7XHJcbiAgICAgIHRoaXMuYWMuc3RvcCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RvcFJlY29yZGluZ01heFJlYygpe1xyXG4gICAgaWYodGhpcy5wb3N0UmVjVGltZXJSdW5uaW5nKXtcclxuICAgICAgaWYodGhpcy5wb3N0UmVjVGltZXJJZCkge1xyXG4gICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5wb3N0UmVjVGltZXJJZCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5wb3N0UmVjVGltZXJSdW5uaW5nPWZhbHNlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5tYXhSZWNUaW1lclJ1bm5pbmcgPSBmYWxzZTtcclxuICAgIHRoaXMuc3RhdHVzID0gU3RhdHVzLlNUT1BQSU5HX1NUT1A7XHJcbiAgICBpZih0aGlzLmFjKSB7XHJcbiAgICAgIHRoaXMuYWMuc3RvcCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkUmVjb3JkaW5nRmlsZUJ5RGVzY3JpcHRvcihyZmQ6UmVjb3JkaW5nRmlsZURlc2NyaXB0b3JJbXBsKXtcclxuICAgIGlmKHJmZC5yZWNvcmRpbmcgJiYgcmZkLnJlY29yZGluZy5pdGVtY29kZSkge1xyXG4gICAgICBsZXQgcHJJZHggPSB0aGlzLnByb21wdEluZGV4QnlJdGVtY29kZShyZmQucmVjb3JkaW5nLml0ZW1jb2RlKTtcclxuICAgICAgaWYgKHRoaXMuaXRlbXMhPW51bGwgJiYgcHJJZHggIT09IG51bGwpIHtcclxuICAgICAgICBsZXQgaXQgPSB0aGlzLml0ZW1zW3BySWR4XTtcclxuICAgICAgICBpZiAoaXQgJiYgdGhpcy5fc2Vzc2lvbikge1xyXG4gICAgICAgICAgaWYgKCFpdC5yZWNzKSB7XHJcbiAgICAgICAgICAgIGl0LnJlY3MgPSBuZXcgQXJyYXk8U3ByUmVjb3JkaW5nRmlsZT4oKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGxldCByZiA9IG5ldyBTcHJSZWNvcmRpbmdGaWxlKHRoaXMuX3Nlc3Npb24uc2Vzc2lvbklkLCByZmQucmVjb3JkaW5nLml0ZW1jb2RlLCByZmQudmVyc2lvbiwgbnVsbCk7XHJcbiAgICAgICAgICBpdC5yZWNzW3JmZC52ZXJzaW9uXSA9IHJmO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiV0FSTjogTm8gcmVjb3JkaW5nIGl0ZW0gd2l0aCBjb2RlOiBcXFwiXCIgK3JmZC5yZWNvcmRpbmcuaXRlbWNvZGUrIFwiXFxcIiBmb3VuZC5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIldBUk46IE5vIHJlY29yZGluZyBpdGVtIHdpdGggY29kZTogXFxcIlwiICtyZmQucmVjb3JkaW5nLml0ZW1jb2RlKyBcIlxcXCIgZm91bmQuXCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRSZWNvcmRpbmdGaWxlQnlQcm9tcHRJbmRleChwcm9tcHRJbmRleDpudW1iZXIsIHJmOlNwclJlY29yZGluZ0ZpbGUpe1xyXG5cclxuICB9XHJcblxyXG5cclxuICBzdG9wcGVkKCkge1xyXG4gICAgdGhpcy51cGRhdGVTdGFydEFjdGlvbkRpc2FibGVTdGF0ZSgpXHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RvcEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMubmV4dEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMucGF1c2VBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5zdGF0dXNBbGVydFR5cGUgPSAnaW5mbyc7XHJcbiAgICB0aGlzLnN0YXR1c01zZyA9ICdSZWNvcmRlZC4nO1xyXG4gICAgdGhpcy5zdGFydFN0b3BTaWduYWxTdGF0ZSA9IFN0YXJ0U3RvcFNpZ25hbFN0YXRlLklETEU7XHJcblxyXG4gICAgbGV0IGFkOkF1ZGlvQnVmZmVyfG51bGwgPSBudWxsO1xyXG4gICAgaWYodGhpcy5hYyE9bnVsbCl7XHJcbiAgICAgIGFkPXRoaXMuYWMuYXVkaW9CdWZmZXIoKTtcclxuICAgIH1cclxuICAgIGxldCBpYyA9IHRoaXMucHJvbXB0SXRlbS5pdGVtY29kZTtcclxuICAgIGxldCByZj1udWxsO1xyXG4gICAgaWYgKHRoaXMuX3Nlc3Npb24gJiYgaWMpIHtcclxuICAgICAgbGV0IHNlc3NJZDogc3RyaW5nIHwgbnVtYmVyID0gdGhpcy5fc2Vzc2lvbi5zZXNzaW9uSWQ7XHJcbiAgICAgIGxldCBjcElkeCA9IHRoaXMucHJvbXB0SW5kZXg7XHJcbiAgICAgIGlmICh0aGlzLml0ZW1zKSB7XHJcbiAgICAgICAgbGV0IGl0PXRoaXMuaXRlbXNbY3BJZHhdO1xyXG4gICAgICAgIGlmICghaXQucmVjcykge1xyXG4gICAgICAgICAgaXQucmVjcyA9IG5ldyBBcnJheTxTcHJSZWNvcmRpbmdGaWxlPigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZiA9IG5ldyBTcHJSZWNvcmRpbmdGaWxlKHNlc3NJZCwgaWMsIGl0LnJlY3MubGVuZ3RoLCBhZCk7XHJcbiAgICAgICAgaXQucmVjcy5wdXNoKHJmKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5lbmFibGVVcGxvYWRSZWNvcmRpbmdzICYmICF0aGlzLnVwbG9hZENodW5rU2l6ZVNlY29uZHMpIHtcclxuICAgICAgICAvLyBUT0RPIHVzZSBTcGVlY2hSZWNvcmRlcmNvbmZpZyByZXNwLiBSZWNmaWxlU2VydmljZVxyXG4gICAgICAgIC8vIGNvbnZlcnQgYXN5bmNocm9ub3VzbHkgdG8gMTYtYml0IGludGVnZXIgUENNXHJcbiAgICAgICAgLy8gVE9ETyBjb3VsZCB3ZSBhdm9pZCBjb252ZXJzaW9uIHRvIHNhdmUgQ1BVIHJlc291cmNlcyBhbmQgdHJhbnNmZXIgZmxvYXQgUENNIGRpcmVjdGx5P1xyXG4gICAgICAgIC8vIFRPRE8gZHVwbGljYXRlIGNvbnZlcnNpb24gZm9yIG1hbnVhbCBkb3dubG9hZFxyXG4gICAgICAgIC8vY29uc29sZS5sb2coXCJCdWlsZCB3YXYgd3JpdGVyLi4uXCIpO1xyXG4gICAgICAgIHRoaXMucHJvY2Vzc2luZ1JlY29yZGluZz10cnVlXHJcbiAgICAgICAgaWYoYWQgJiYgcmYpIHtcclxuICAgICAgICAgIGxldCB3dyA9IG5ldyBXYXZXcml0ZXIoKTtcclxuICAgICAgICAgIC8vbmV3IFJFU1QgQVBJIFVSTFxyXG4gICAgICAgICAgbGV0IGFwaUVuZFBvaW50ID0gJyc7XHJcbiAgICAgICAgICBpZiAodGhpcy5jb25maWcgJiYgdGhpcy5jb25maWcuYXBpRW5kUG9pbnQpIHtcclxuICAgICAgICAgICAgYXBpRW5kUG9pbnQgPSB0aGlzLmNvbmZpZy5hcGlFbmRQb2ludDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChhcGlFbmRQb2ludCAhPT0gJycpIHtcclxuICAgICAgICAgICAgYXBpRW5kUG9pbnQgPSBhcGlFbmRQb2ludCArICcvJ1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbGV0IHNlc3Npb25zVXJsID0gYXBpRW5kUG9pbnQgKyBTZXNzaW9uU2VydmljZS5TRVNTSU9OX0FQSV9DVFg7XHJcbiAgICAgICAgICBsZXQgcmVjVXJsOiBzdHJpbmcgPSBzZXNzaW9uc1VybCArICcvJyArIHJmLnNlc3Npb24gKyAnLycgKyBSRUNGSUxFX0FQSV9DVFggKyAnLycgKyByZi5pdGVtQ29kZTtcclxuICAgICAgICAgIHd3LndyaXRlQXN5bmMoYWQsICh3YXZGaWxlKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucG9zdFJlY29yZGluZyh3YXZGaWxlLCByZWNVcmwpO1xyXG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NpbmdSZWNvcmRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVdha2VMb2NrKCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBjaGVjayBjb21wbGV0ZSBzZXNzaW9uXHJcbiAgICBsZXQgY29tcGxldGUgPSB0cnVlO1xyXG4gICAgaWYodGhpcy5pdGVtcykge1xyXG4gICAgICAvLyBzZWFyY2ggYmFja3dhcmRzLCB0byBnYWluIGZhc3RlciBkZXRlY3Rpb24gb2YgaW5jb21wbGV0ZSBzdGF0ZVxyXG4gICAgICBmb3IgKGxldCByaSA9IHRoaXMuaXRlbXMubGVuZ3RoIC0gMTsgcmkgPj0gMDsgcmktLSkge1xyXG4gICAgICAgIGxldCBpdCA9IHRoaXMuaXRlbXNbcmldO1xyXG4gICAgICAgIGlmIChpdC5yZWNvcmRpbmcgJiYgIWl0LnRyYWluaW5nICYmICghaXQucmVjcyB8fCBpdC5yZWNzLmxlbmd0aCA9PSAwKSkge1xyXG4gICAgICAgICAgY29tcGxldGUgPSBmYWxzZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBhdXRvU3RhcnQgPSAodGhpcy5zdGF0dXMgPT09IFN0YXR1cy5TVE9QUElOR19TVE9QKTtcclxuICAgIHRoaXMuc3RhdHVzID0gU3RhdHVzLklETEU7XHJcbiAgICBsZXQgc3RhcnROZXh0PWZhbHNlO1xyXG4gICAgaWYgKGNvbXBsZXRlKSB7XHJcbiAgICAgIGlmKHRoaXMuX3Nlc3Npb24hPW51bGwpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX3Nlc3Npb24uc2VhbGVkICYmIHRoaXMuX3Nlc3Npb24uc3RhdHVzICE9PSBcIkNPTVBMRVRFRFwiKSB7XHJcbiAgICAgICAgICBsZXQgYm9keTogYW55ID0ge31cclxuICAgICAgICAgIHRoaXMuX3Nlc3Npb24uc3RhdHVzID0gXCJDT01QTEVURURcIjtcclxuICAgICAgICAgIGJvZHkuc3RhdHVzID0gdGhpcy5fc2Vzc2lvbi5zdGF0dXM7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuX3Nlc3Npb24uY29tcGxldGVkRGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9zZXNzaW9uLmNvbXBsZXRlZERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICBib2R5LmNvbXBsZXRlZERhdGUgPSB0aGlzLl9zZXNzaW9uLmNvbXBsZXRlZERhdGU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnNlc3Npb25TZXJ2aWNlLnBhdGNoU2Vzc2lvbk9ic2VydmVyKHRoaXMuX3Nlc3Npb24sIGJvZHkpLnN1YnNjcmliZSgpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc3RhdHVzTXNnID0gJ1Nlc3Npb24gY29tcGxldGUhJztcclxuICAgICAgdGhpcy51cGRhdGVXYWtlTG9jaygpO1xyXG4gICAgICBsZXQgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihTZXNzaW9uRmluaXNoZWREaWFsb2csIHt9KTtcclxuXHJcbiAgICAgIC8vIGVuYWJsZSBuYXZpZ2F0aW9uXHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5md2RBY3Rpb24uZGlzYWJsZWQgPSBmYWxzZVxyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuYndkQWN0aW9uLmRpc2FibGVkID0gZmFsc2VcclxuXHJcbiAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgaWYgKHRoaXMuc2VjdGlvbi5tb2RlID09PSAnQVVUT1BST0dSRVNTJyB8fCB0aGlzLnNlY3Rpb24ubW9kZSA9PT0gJ0FVVE9SRUNPUkRJTkcnKSB7XHJcbiAgICAgICAgdGhpcy5uZXh0SXRlbSgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5zZWN0aW9uLm1vZGUgPT09ICdBVVRPUkVDT1JESU5HJyAmJiB0aGlzLmF1dG9yZWNvcmRpbmcgJiYgYXV0b1N0YXJ0KSB7XHJcbiAgICAgICAgc3RhcnROZXh0PXRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uRGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZU5hdmlnYXRpb25BY3Rpb25zKCk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVXYWtlTG9jaygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBhcHBseSByZWNvcmRlZCBpdGVtXHJcbiAgICBjb25zb2xlLmRlYnVnKFwiQXBwbHkgaXRlbTogc3RhcnROZXh0OiBcIitzdGFydE5leHQpO1xyXG4gICAgdGhpcy5hcHBseUl0ZW0oc3RhcnROZXh0KTtcclxuICAgIGlmKHN0YXJ0TmV4dCl7XHJcbiAgICAgIHRoaXMuc3RhcnRJdGVtKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIHBvc3RDaHVua0F1ZGlvQnVmZmVyKGF1ZGlvQnVmZmVyOiBBdWRpb0J1ZmZlciwgY2h1bmtJZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5wcm9jZXNzaW5nUmVjb3JkaW5nID0gdHJ1ZTtcclxuICAgIGxldCB3dyA9IG5ldyBXYXZXcml0ZXIoKTtcclxuICAgIC8vbmV3IFJFU1QgQVBJIFVSTFxyXG4gICAgbGV0IGFwaUVuZFBvaW50ID0gJyc7XHJcbiAgICBpZiAodGhpcy5jb25maWcgJiYgdGhpcy5jb25maWcuYXBpRW5kUG9pbnQpIHtcclxuICAgICAgYXBpRW5kUG9pbnQgPSB0aGlzLmNvbmZpZy5hcGlFbmRQb2ludDtcclxuICAgIH1cclxuICAgIGlmIChhcGlFbmRQb2ludCAhPT0gJycpIHtcclxuICAgICAgYXBpRW5kUG9pbnQgPSBhcGlFbmRQb2ludCArICcvJ1xyXG4gICAgfVxyXG4gICAgbGV0IHNlc3Npb25zVXJsID0gYXBpRW5kUG9pbnQgKyBTZXNzaW9uU2VydmljZS5TRVNTSU9OX0FQSV9DVFg7XHJcbiAgICBsZXQgcmVjVXJsOiBzdHJpbmcgPSBzZXNzaW9uc1VybCArICcvJyArIHRoaXMuc2Vzc2lvbj8uc2Vzc2lvbklkICsgJy8nICsgUkVDRklMRV9BUElfQ1RYICsgJy8nICsgdGhpcy5wcm9tcHRJdGVtLml0ZW1jb2RlKycvJyt0aGlzLnJmVXVpZCsnLycrY2h1bmtJZHg7XHJcbiAgICB3dy53cml0ZUFzeW5jKGF1ZGlvQnVmZmVyLCAod2F2RmlsZSkgPT4ge1xyXG4gICAgICB0aGlzLnBvc3RSZWNvcmRpbmcod2F2RmlsZSwgcmVjVXJsKTtcclxuICAgICAgdGhpcy5wcm9jZXNzaW5nUmVjb3JkaW5nID0gZmFsc2VcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIHBvc3RSZWNvcmRpbmcod2F2RmlsZTogVWludDhBcnJheSwgcmVjVXJsOiBzdHJpbmcpIHtcclxuICAgIGxldCB3YXZCbG9iID0gbmV3IEJsb2IoW3dhdkZpbGVdLCB7dHlwZTogJ2F1ZGlvL3dhdid9KTtcclxuICAgIGxldCB1bCA9IG5ldyBVcGxvYWQod2F2QmxvYiwgcmVjVXJsKTtcclxuICAgIHRoaXMudXBsb2FkZXIucXVldWVVcGxvYWQodWwpO1xyXG4gIH1cclxuXHJcbiAgc3RvcCgpIHtcclxuICAgIGlmKHRoaXMuYWMhPW51bGwpe1xyXG4gICAgICB0aGlzLmFjLmNsb3NlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUNvbnRyb2xQbGF5YmFja1Bvc2l0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMuX2NvbnRyb2xBdWRpb1BsYXllci5wbGF5UG9zaXRpb25GcmFtZXMpIHtcclxuICAgICAgdGhpcy5wcm9tcHRpbmcuYXVkaW9EaXNwbGF5LnBsYXlGcmFtZVBvc2l0aW9uID0gdGhpcy5fY29udHJvbEF1ZGlvUGxheWVyLnBsYXlQb3NpdGlvbkZyYW1lcztcclxuICAgICAgdGhpcy5saXZlTGV2ZWxEaXNwbGF5LnBsYXlGcmFtZVBvc2l0aW9uID0gdGhpcy5fY29udHJvbEF1ZGlvUGxheWVyLnBsYXlQb3NpdGlvbkZyYW1lcztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGF1ZGlvUGxheWVyVXBkYXRlKGU6IEF1ZGlvUGxheWVyRXZlbnQpIHtcclxuICAgIGlmIChFdmVudFR5cGUuUkVBRFkgPT09IGUudHlwZSkge1xyXG5cclxuICAgIH0gZWxzZSBpZiAoRXZlbnRUeXBlLlNUQVJURUQgPT09IGUudHlwZSkge1xyXG4gICAgICAvL3RoaXMuc3RhdHVzID0gJ1BsYXliYWNrLi4uJztcclxuICAgICAgdGhpcy51cGRhdGVUaW1lcklkID0gd2luZG93LnNldEludGVydmFsKCgpID0+IHRoaXMudXBkYXRlQ29udHJvbFBsYXliYWNrUG9zaXRpb24oKSwgNTApO1xyXG5cclxuICAgIH0gZWxzZSBpZiAoRXZlbnRUeXBlLkVOREVEID09PSBlLnR5cGUpIHtcclxuICAgICAgLy8uc3RhdHVzPSdSZWFkeS4nO1xyXG4gICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnVwZGF0ZVRpbWVySWQpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBpZighdGhpcy5kZXN0cm95ZWQpIHtcclxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG59XHJcblxyXG4iXX0=
|
|
1034
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbm1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvc3BlZWNocmVjb3JkZXIvc2Vzc2lvbi9zZXNzaW9ubWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsWUFBWSxFQUF1QixNQUFNLDZCQUE2QixDQUFDO0FBQy9FLE9BQU8sRUFBZ0MsU0FBUyxFQUFDLE1BQU0sNkJBQTZCLENBQUE7QUFDcEYsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLDRCQUE0QixDQUFBO0FBQ3BELE9BQU8sRUFBb0IsY0FBYyxFQUFrQixNQUFNLGtCQUFrQixDQUFDO0FBQ3BGLE9BQU8sRUFBQyxnQkFBZ0IsRUFBNkMsTUFBTSxjQUFjLENBQUE7QUFDekYsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQzFDLE9BQU8sRUFHTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBR0wsU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUlqRCxPQUFPLEVBQUMscUJBQXFCLEVBQXVCLE1BQU0sa0JBQWtCLENBQUM7QUFDN0UsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQU10QyxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUNoRSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFFdEQsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDekQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ2hELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLFFBQVEsRUFB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QUMscUJBQXFCOzRDQXREaEMsV0FBVztzQkFBbkIsS0FBSztnQkFLa0MsU0FBUztzQkFBaEQsU0FBUzt1QkFBQyxTQUFTLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNDLGdCQUFnQjtzQkFBdEQsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUU1QixTQUFTO3NCQUFqQixLQUFLO2dCQXFLTixVQUFVO3NCQURULFlBQVk7dUJBQUMsaUJBQWlCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBUzNDLFNBQVM7c0JBRFIsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QXVkaW9DYXB0dXJlLCBBdWRpb0NhcHR1cmVMaXN0ZW5lcn0gZnJvbSAnLi4vLi4vYXVkaW8vY2FwdHVyZS9jYXB0dXJlJztcclxuaW1wb3J0IHtBdWRpb1BsYXllciwgQXVkaW9QbGF5ZXJFdmVudCwgRXZlbnRUeXBlfSBmcm9tICcuLi8uLi9hdWRpby9wbGF5YmFjay9wbGF5ZXInXHJcbmltcG9ydCB7V2F2V3JpdGVyfSBmcm9tICcuLi8uLi9hdWRpby9pbXBsL3dhdndyaXRlcidcclxuaW1wb3J0IHtHcm91cCwgUHJvbXB0SXRlbSwgUHJvbXB0aXRlbVV0aWwsIFNjcmlwdCwgU2VjdGlvbn0gZnJvbSAnLi4vc2NyaXB0L3NjcmlwdCc7XHJcbmltcG9ydCB7U3ByUmVjb3JkaW5nRmlsZSwgUmVjb3JkaW5nRmlsZURlc2NyaXB0b3JJbXBsLCBSZWNvcmRpbmdGaWxlfSBmcm9tICcuLi9yZWNvcmRpbmcnXHJcbmltcG9ydCB7VXBsb2FkfSBmcm9tICcuLi8uLi9uZXQvdXBsb2FkZXInO1xyXG5pbXBvcnQge1xyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbmplY3QsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIFJlbmRlcmVyMixcclxuICBWaWV3Q2hpbGRcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge1Nlc3Npb25TZXJ2aWNlfSBmcm9tIFwiLi9zZXNzaW9uLnNlcnZpY2VcIjtcclxuaW1wb3J0IHtTdGF0ZSBhcyBTdGFydFN0b3BTaWduYWxTdGF0ZX0gZnJvbSBcIi4uL3N0YXJ0c3RvcHNpZ25hbC9zdGFydHN0b3BzaWduYWxcIjtcclxuaW1wb3J0IHtNYXREaWFsb2d9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2dcIjtcclxuaW1wb3J0IHtTcGVlY2hSZWNvcmRlclVwbG9hZGVyfSBmcm9tIFwiLi4vc3BydXBsb2FkZXJcIjtcclxuaW1wb3J0IHtTUEVFQ0hSRUNPUkRFUl9DT05GSUcsIFNwZWVjaFJlY29yZGVyQ29uZmlnfSBmcm9tIFwiLi4vLi4vc3ByLmNvbmZpZ1wiO1xyXG5pbXBvcnQge1Byb21wdGluZ30gZnJvbSBcIi4vcHJvbXB0aW5nXCI7XHJcbmltcG9ydCB7XHJcbiAgU2VxdWVuY2VBdWRpb0Zsb2F0MzJDaHVua2VyT3V0U3RyZWFtLFxyXG4gIFNlcXVlbmNlQXVkaW9GbG9hdDMyT3V0U3RyZWFtLFxyXG4gIFNlcXVlbmNlQXVkaW9GbG9hdDMyT3V0U3RyZWFtTXVsdGlwbGllclxyXG59IGZyb20gXCIuLi8uLi9hdWRpby9pby9zdHJlYW1cIjtcclxuaW1wb3J0IHtTZXNzaW9uRmluaXNoZWREaWFsb2d9IGZyb20gXCIuL3Nlc3Npb25fZmluaXNoZWRfZGlhbG9nXCI7XHJcbmltcG9ydCB7TWVzc2FnZURpYWxvZ30gZnJvbSBcIi4uLy4uL3VpL21lc3NhZ2VfZGlhbG9nXCI7XHJcbmltcG9ydCB7UmVjb3JkaW5nU2VydmljZX0gZnJvbSBcIi4uL3JlY29yZGluZ3MvcmVjb3JkaW5ncy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7QXVkaW9Db250ZXh0UHJvdmlkZXJ9IGZyb20gXCIuLi8uLi9hdWRpby9jb250ZXh0XCI7XHJcbmltcG9ydCB7QXVkaW9DbGlwfSBmcm9tIFwiLi4vLi4vYXVkaW8vcGVyc2lzdG9yXCI7XHJcbmltcG9ydCB7SXRlbX0gZnJvbSBcIi4vaXRlbVwiO1xyXG5pbXBvcnQge0xldmVsQmFyfSBmcm9tIFwiLi4vLi4vYXVkaW8vdWkvbGl2ZWxldmVsXCI7XHJcbmltcG9ydCB7XHJcbiAgQmFzaWNSZWNvcmRlcixcclxuICBDaHVua0F1ZGlvQnVmZmVyUmVjZWl2ZXIsXHJcbiAgTEVWRUxfQkFSX0lOVEVSVkFMTF9TRUNPTkRTLFxyXG4gIE1BWF9SRUNPUkRJTkdfVElNRV9NUyxcclxuICBSRUNGSUxFX0FQSV9DVFhcclxufSBmcm9tIFwiLi9iYXNpY3JlY29yZGVyXCI7XHJcbmltcG9ydCB7VVVJRH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWxzXCI7XHJcbmltcG9ydCB7QnJlYWtwb2ludE9ic2VydmVyfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL2xheW91dFwiO1xyXG5cclxuY29uc3QgREVGQVVMVF9QUkVfUkVDX0RFTEFZPTEwMDA7XHJcbmNvbnN0IERFRkFVTFRfUE9TVF9SRUNfREVMQVk9NTAwO1xyXG5cclxuZXhwb3J0IGNvbnN0IGVudW0gU3RhdHVzIHtcclxuICBCTE9DS0VELCBJRExFLCBTVEFSVElORywgUFJFX1JFQ09SRElORywgUkVDT1JESU5HLCBQT1NUX1JFQ19TVE9QLCBQT1NUX1JFQ19QQVVTRSwgU1RPUFBJTkdfU1RPUCwgU1RPUFBJTkdfUEFVU0UsIEVSUk9SXHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLXNwcnJlY29yZGluZ3Nlc3Npb24nLFxyXG4gIHByb3ZpZGVyczogW1Nlc3Npb25TZXJ2aWNlXSxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGFwcC13YXJuaW5nYmFyIFtzaG93XT1cImlzVGVzdFNlc3Npb24oKVwiIHdhcm5pbmdUZXh0PVwiVGVzdCByZWNvcmRpbmcgb25seSFcIj48L2FwcC13YXJuaW5nYmFyPlxyXG4gICAgPGFwcC13YXJuaW5nYmFyIFtzaG93XT1cImlzRGVmYXVsdEF1ZGlvVGVzdFNlc3Npb24oKVwiIHdhcm5pbmdUZXh0PVwiVGhpcyB0ZXN0IHVzZXMgZGVmYXVsdCBhdWRpbyBkZXZpY2UhIFJlZ3VsYXIgc2Vzc2lvbnMgbWF5IHJlcXVpcmUgYSBwYXJ0aWN1bGFyIGF1ZGlvIGRldmljZSAobWljcm9waG9uZSkhXCI+PC9hcHAtd2FybmluZ2Jhcj5cclxuICAgICAgPGFwcC1zcHJwcm9tcHRpbmcgW3Byb2plY3ROYW1lXT1cInByb2plY3ROYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0YXJ0U3RvcFNpZ25hbFN0YXRlXT1cInN0YXJ0U3RvcFNpZ25hbFN0YXRlXCIgW3Byb21wdEl0ZW1dPVwicHJvbXB0SXRlbVwiIFtzaG93UHJvbXB0XT1cInNob3dQcm9tcHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXRlbXNdPVwiaXRlbXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdHJhbnNwb3J0QWN0aW9uc109XCJ0cmFuc3BvcnRBY3Rpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkSXRlbUlkeF09XCJwcm9tcHRJbmRleFwiIChvbkl0ZW1TZWxlY3QpPVwiaXRlbVNlbGVjdCgkZXZlbnQpXCIgKG9uTmV4dEl0ZW0pPVwibmV4dEl0ZW0oKVwiIChvblByZXZJdGVtKT1cInByZXZJdGVtKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXVkaW9TaWduYWxDb2xsYXBzZWRdPVwiYXVkaW9TaWduYWxDb2xsYXBzZWRcIiBbZGlzcGxheUF1ZGlvQ2xpcF09XCJkaXNwbGF5QXVkaW9DbGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BsYXlTdGFydEFjdGlvbl09XCJjb250cm9sQXVkaW9QbGF5ZXI/LnN0YXJ0QWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BsYXlTZWxlY3Rpb25BY3Rpb25dPVwiY29udHJvbEF1ZGlvUGxheWVyPy5zdGFydFNlbGVjdGlvbkFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdXRvUGxheU9uU2VsZWN0VG9nZ2xlQWN0aW9uXT1cImNvbnRyb2xBdWRpb1BsYXllcj8uYXV0b1BsYXlPblNlbGVjdFRvZ2dsZUFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwbGF5U3RvcEFjdGlvbl09XCJjb250cm9sQXVkaW9QbGF5ZXI/LnN0b3BBY3Rpb25cIj5cclxuXHJcbiAgICA8L2FwcC1zcHJwcm9tcHRpbmc+XHJcbiAgICA8bWF0LXByb2dyZXNzLWJhciBbdmFsdWVdPVwicHJvZ3Jlc3NQZXJjZW50VmFsdWUoKVwiICpuZ0lmPVwic2NyZWVuWHNcIiA+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxyXG5cclxuXHJcbiAgICA8ZGl2IFtjbGFzc109XCJ7YXVkaW9TdGF0dXNEaXNwbGF5OiFzY3JlZW5YcyxhdWRpb1N0YXR1c0Rpc3BsYXlYczpzY3JlZW5Yc31cIj5cclxuICAgICAgPGF1ZGlvLWxldmVsYmFyIHN0eWxlPVwiZmxleDoxIDAgMSVcIiBbc3RyZWFtaW5nTW9kZV09XCJpc1JlY29yZGluZygpXCIgW2Rpc3BsYXlMZXZlbEluZm9zXT1cImRpc3BsYXlBdWRpb0NsaXA/LmxldmVsSW5mb3NcIj48L2F1ZGlvLWxldmVsYmFyPlxyXG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOiByb3dcIj5cclxuICAgICAgICA8c3ByLXJlY29yZGluZ2l0ZW1jb250cm9scyBzdHlsZT1cImRpc3BsYXk6ZmxleDtmbGV4OjEwIDAgMXB4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXVkaW9Mb2FkZWRdPVwiZGlzcGxheUF1ZGlvQ2xpcD8uYnVmZmVyIT09bnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYXlTdGFydEFjdGlvbl09XCJjb250cm9sQXVkaW9QbGF5ZXI/LnN0YXJ0QWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxheVN0b3BBY3Rpb25dPVwiY29udHJvbEF1ZGlvUGxheWVyPy5zdG9wQWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGVha0RiTHZsXT1cInBlYWtMZXZlbEluRGJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthZ2NdPVwidGhpcy5hYz8uYWdjU3RhdHVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25TaG93UmVjb3JkaW5nRGV0YWlscyk9XCJhdWRpb1NpZ25hbENvbGxhcHNlZD0hYXVkaW9TaWduYWxDb2xsYXBzZWRcIj5cclxuICAgICAgICA8L3Nwci1yZWNvcmRpbmdpdGVtY29udHJvbHM+XHJcblxyXG4gICAgICAgIDxhcHAtdXBsb2Fkc3RhdHVzICpuZ0lmPVwic2NyZWVuWHMgJiYgZW5hYmxlVXBsb2FkUmVjb3JkaW5nc1wiIGNsYXNzPVwicmljb250cm9scyBkYXJrXCIgIHN0eWxlPVwiZmxleDowIDAgMFwiIFt2YWx1ZV09XCJ1cGxvYWRQcm9ncmVzc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0YXR1c109XCJ1cGxvYWRTdGF0dXNcIiBbYXdhaXROZXdVcGxvYWRdPVwicHJvY2Vzc2luZ1JlY29yZGluZ1wiPjwvYXBwLXVwbG9hZHN0YXR1cz5cclxuICAgICAgICA8YXBwLXdha2Vsb2NraW5kaWNhdG9yICpuZ0lmPVwic2NyZWVuWHNcIiBjbGFzcz1cInJpY29udHJvbHMgZGFya1wiIHN0eWxlPVwiZmxleDowIDAgMFwiIFtzY3JlZW5Mb2NrZWRdPVwic2NyZWVuTG9ja2VkXCI+PC9hcHAtd2FrZWxvY2tpbmRpY2F0b3I+XHJcbiAgICAgICAgPGFwcC1yZWFkeXN0YXRlaW5kaWNhdG9yICpuZ0lmPVwic2NyZWVuWHNcIiBjbGFzcz1cInJpY29udHJvbHMgZGFya1wiIHN0eWxlPVwiZmxleDowIDAgMFwiIFtyZWFkeV09XCJkYXRhU2F2ZWQgJiYgIWlzQWN0aXZlKClcIj48L2FwcC1yZWFkeXN0YXRlaW5kaWNhdG9yPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiAjY29udHJvbHBhbmVsIGNsYXNzPVwiY29udHJvbHBhbmVsXCI+XHJcbiAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OjEgMSAzMCU7anVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O2FsaWduLWl0ZW1zOiBjZW50ZXI7IGFsaWduLWNvbnRlbnQ6IGNlbnRlclwiPlxyXG4gICAgICAgIDxhcHAtc3Byc3RhdHVzZGlzcGxheSAqbmdJZj1cIiFzY3JlZW5Yc1wiIFtzdGF0dXNNc2ddPVwic3RhdHVzTXNnXCIgW3N0YXR1c0FsZXJ0VHlwZV09XCJzdGF0dXNBbGVydFR5cGVcIiBbc3RhdHVzV2FpdGluZ109XCJzdGF0dXNXYWl0aW5nXCI+PC9hcHAtc3Byc3RhdHVzZGlzcGxheT5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxhcHAtc3BydHJhbnNwb3J0IHN0eWxlPVwiZGlzcGxheTpmbGV4O2ZsZXg6MTAgMCAzMCU7anVzdGlmeS1jb250ZW50OiBjZW50ZXI7YWxpZ24taXRlbXM6IGNlbnRlcjsgYWxpZ24tY29udGVudDogY2VudGVyXCIgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCIgW2FjdGlvbnNdPVwidHJhbnNwb3J0QWN0aW9uc1wiIFtuYXZpZ2F0aW9uRW5hYmxlZF09XCIhaXRlbXMgfHwgaXRlbXMubGVuZ3RoPjFcIj48L2FwcC1zcHJ0cmFuc3BvcnQ+XHJcbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7ZmxleDoxIDEgMzAlO2ZsZXgtZGlyZWN0aW9uOnJvdztqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO2FsaWduLWl0ZW1zOiBjZW50ZXI7IGFsaWduLWNvbnRlbnQ6IGNlbnRlclwiPlxyXG4gICAgICAgIDxhcHAtdXBsb2Fkc3RhdHVzICpuZ0lmPVwiIXNjcmVlblhzICYmIGVuYWJsZVVwbG9hZFJlY29yZGluZ3NcIiAgY2xhc3M9XCJyaWNvbnRyb2xzXCIgIFt2YWx1ZV09XCJ1cGxvYWRQcm9ncmVzc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0YXR1c109XCJ1cGxvYWRTdGF0dXNcIiBbYXdhaXROZXdVcGxvYWRdPVwicHJvY2Vzc2luZ1JlY29yZGluZ1wiPjwvYXBwLXVwbG9hZHN0YXR1cz5cclxuICAgICAgICA8YXBwLXdha2Vsb2NraW5kaWNhdG9yICpuZ0lmPVwiIXNjcmVlblhzXCIgY2xhc3M9XCJyaWNvbnRyb2xzXCIgW3NjcmVlbkxvY2tlZF09XCJzY3JlZW5Mb2NrZWRcIj48L2FwcC13YWtlbG9ja2luZGljYXRvcj5cclxuICAgICAgICA8YXBwLXJlYWR5c3RhdGVpbmRpY2F0b3IgKm5nSWY9XCIhc2NyZWVuWHNcIiBjbGFzcz1cInJpY29udHJvbHNcIiBbcmVhZHldPVwiZGF0YVNhdmVkICYmICFpc0FjdGl2ZSgpXCI+PC9hcHAtcmVhZHlzdGF0ZWluZGljYXRvcj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICBgLFxyXG4gIHN0eWxlczogW2A6aG9zdCB7XHJcbiAgICBmbGV4OiAyO1xyXG4gICAgYmFja2dyb3VuZDogbGlnaHRncmV5O1xyXG4gICAgZGlzcGxheTogZmxleDsgLyogVmVydGljYWwgZmxleCBjb250YWluZXI6IEJvdHRvbSB0cmFuc3BvcnQgcGFuZWwsIGFib3ZlIHByb21wdGluZyBwYW5lbCAqL1xyXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIHBhZGRpbmc6IDA7XHJcbiAgICBtaW4taGVpZ2h0OiAwcHg7XHJcblxyXG4gICAgICAvKiBQcmV2ZW50cyBob3Jpem9udGFsIHNjcm9sbCBiYXIgb24gc3dpcGUgcmlnaHQgKi9cclxuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9YCxgLnJpY29udHJvbHMge1xyXG4gICAgICAgIGRpc3BsYXk6ZmxleDtcclxuICAgICAgICBwYWRkaW5nOiA0cHg7XHJcbiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgICAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcclxuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO2FsaWduLWl0ZW1zOiBjZW50ZXI7IGFsaWduLWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgIH1gLGAuZGFyayB7XHJcbiAgICBiYWNrZ3JvdW5kOiBkYXJrZ3JheTtcclxuICB9YCxgLmNvbnRyb2xwYW5lbCB7XHJcbiAgICBkaXNwbGF5OmZsZXg7XHJcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xyXG4gICAgYWxpZ24tY29udGVudDogY2VudGVyO1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIHBhZGRpbmc6IDIwcHg7XHJcbiAgICBtaW4taGVpZ2h0OiBtaW4tY29udGVudDsgLyogaW1wb3J0YW50ICovXHJcbiAgfWAsYC5hdWRpb1N0YXR1c0Rpc3BsYXl7XHJcbiAgICBkaXNwbGF5OmZsZXg7XHJcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xyXG4gICAgaGVpZ2h0OjEwMHB4O1xyXG4gICAgbWluLWhlaWdodDogMTAwcHg7XHJcbiAgfWAsYC5hdWRpb1N0YXR1c0Rpc3BsYXlYc3tcclxuICAgIGRpc3BsYXk6ZmxleDtcclxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICBoZWlnaHQ6MTI1cHg7XHJcbiAgICBtaW4taGVpZ2h0OiAxMjVweDtcclxuICB9YFxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIFNlc3Npb25NYW5hZ2VyIGV4dGVuZHMgQmFzaWNSZWNvcmRlciBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsT25EZXN0cm95LCBBdWRpb0NhcHR1cmVMaXN0ZW5lcixDaHVua0F1ZGlvQnVmZmVyUmVjZWl2ZXIge1xyXG5cclxuICBASW5wdXQoKSBwcm9qZWN0TmFtZTpzdHJpbmd8dW5kZWZpbmVkO1xyXG4gIGVuYWJsZVVwbG9hZFJlY29yZGluZ3M6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGVuYWJsZURvd25sb2FkUmVjb3JkaW5nczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHN0YXR1czogU3RhdHVzID0gU3RhdHVzLkJMT0NLRUQ7XHJcblxyXG4gIEBWaWV3Q2hpbGQoUHJvbXB0aW5nLCB7IHN0YXRpYzogdHJ1ZSB9KSBwcm9tcHRpbmchOiBQcm9tcHRpbmc7XHJcbiAgQFZpZXdDaGlsZChMZXZlbEJhciwgeyBzdGF0aWM6IHRydWUgfSkgbGl2ZUxldmVsRGlzcGxheSE6IExldmVsQmFyO1xyXG5cclxuICBASW5wdXQoKSBkYXRhU2F2ZWQ9dHJ1ZVxyXG5cclxuICBzdGFydFN0b3BTaWduYWxTdGF0ZSE6IFN0YXJ0U3RvcFNpZ25hbFN0YXRlO1xyXG5cclxuICBwcml2YXRlIHVwZGF0ZVRpbWVySWQ6IGFueTtcclxuICBwcml2YXRlIHByZVJlY1RpbWVySWQ6IG51bWJlcnxudWxsPW51bGw7XHJcbiAgcHJpdmF0ZSBwcmVSZWNUaW1lclJ1bm5pbmc6IGJvb2xlYW58bnVsbD1udWxsO1xyXG4gIHByaXZhdGUgcG9zdERlbGF5Om51bWJlcj1ERUZBVUxUX1BPU1RfUkVDX0RFTEFZO1xyXG4gIHByaXZhdGUgcG9zdFJlY1RpbWVySWQ6IG51bWJlcnxudWxsPW51bGw7XHJcbiAgcHJpdmF0ZSBwb3N0UmVjVGltZXJSdW5uaW5nOiBib29sZWFufG51bGw9bnVsbDtcclxuICBwcml2YXRlIG1heFJlY1RpbWVySWQ6IG51bWJlcnxudWxsPW51bGw7XHJcbiAgcHJpdmF0ZSBtYXhSZWNUaW1lclJ1bm5pbmc6IGJvb2xlYW58bnVsbD1udWxsO1xyXG5cclxuICBkbmxMbmshOiBIVE1MQW5jaG9yRWxlbWVudDtcclxuXHJcbiAgYXVkaW86IGFueTtcclxuICBfc2NyaXB0ITogU2NyaXB0O1xyXG4gIHByaXZhdGUgX3Byb21wdEluZGV4PTA7XHJcbiAgcHJpdmF0ZSBzZWN0aW9uITogU2VjdGlvbjtcclxuICBncm91cCE6IEdyb3VwO1xyXG4gIHByb21wdEl0ZW0hOlByb21wdEl0ZW07XHJcbiAgc2hvd1Byb21wdCE6IGJvb2xlYW47XHJcblxyXG4gIC8vIGluZGV4IG9mIGN1cnJlbnQgc2VjdGlvblxyXG4gIHNlY3RJZHghOiBudW1iZXI7XHJcbiAgLy8gaW5kZXggb2YgY3VycmVudCBncm91cCBpbiBzZWN0aW9uXHJcbiAgZ3JvdXBJZHhJblNlY3Rpb24hOiBudW1iZXI7XHJcbiAgLy8gaW5kZXggb2YgY3VycmVudCBwcm9tcHQgaXRlbSBpbiBncm91cFxyXG4gIHByb21wdEl0ZW1JZHhJbkdyb3VwITogbnVtYmVyO1xyXG5cclxuICBwcml2YXRlIGF1dG9yZWNvcmRpbmchOiBib29sZWFuO1xyXG5cclxuICBpdGVtczogQXJyYXk8SXRlbT58bnVsbD1udWxsO1xyXG4gIC8vc2VsZWN0ZWRJdGVtSWR4OiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBfZGlzcGxheVJlY0ZpbGU6IFNwclJlY29yZGluZ0ZpbGUgfCBudWxsPW51bGw7XHJcbiAgcHJpdmF0ZSBkaXNwbGF5UmVjRmlsZVZlcnNpb24hOiBudW1iZXI7XHJcblxyXG4gIHByb21wdEl0ZW1Db3VudCE6IG51bWJlcjtcclxuXHJcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGJwbzpCcmVha3BvaW50T2JzZXJ2ZXIsXHJcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgICAgICAgICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICAgICAgICAgICAgcHVibGljIGRpYWxvZzogTWF0RGlhbG9nLFxyXG4gICAgICAgICAgICAgIHByb3RlY3RlZCBzZXNzaW9uU2VydmljZTpTZXNzaW9uU2VydmljZSxcclxuICAgICAgICAgICAgICBwcml2YXRlIHJlY0ZpbGVTZXJ2aWNlOlJlY29yZGluZ1NlcnZpY2UsXHJcbiAgICAgICAgICAgICAgdXBsb2FkZXI6IFNwZWVjaFJlY29yZGVyVXBsb2FkZXIsXHJcbiAgICAgICAgICAgICAgQEluamVjdChTUEVFQ0hSRUNPUkRFUl9DT05GSUcpIGNvbmZpZz86IFNwZWVjaFJlY29yZGVyQ29uZmlnKSB7XHJcbiAgICBzdXBlcihicG8sY2hhbmdlRGV0ZWN0b3JSZWYsZGlhbG9nLHNlc3Npb25TZXJ2aWNlLHVwbG9hZGVyLGNvbmZpZyk7XHJcbiAgICB0aGlzLnN0YXR1cyA9IFN0YXR1cy5JRExFO1xyXG4gICAgdGhpcy5hdWRpbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdWRpbycpO1xyXG4gICAgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmVuYWJsZVVwbG9hZFJlY29yZGluZ3MgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmVuYWJsZVVwbG9hZFJlY29yZGluZ3MgPSB0aGlzLmNvbmZpZy5lbmFibGVVcGxvYWRSZWNvcmRpbmdzO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmVuYWJsZURvd25sb2FkUmVjb3JkaW5ncyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuZW5hYmxlRG93bmxvYWRSZWNvcmRpbmdzID0gdGhpcy5jb25maWcuZW5hYmxlRG93bmxvYWRSZWNvcmRpbmdzO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pbml0KCk7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIHRoaXMuc3RyZWFtTGV2ZWxNZWFzdXJlLmxldmVsTGlzdGVuZXIgPSB0aGlzLmxpdmVMZXZlbERpc3BsYXk7XHJcbiAgICB0aGlzLnN0cmVhbUxldmVsTWVhc3VyZS5wZWFrTGV2ZWxMaXN0ZW5lcj0ocGVha0x2bEluRGIpPT57XHJcbiAgICAgIHRoaXMucGVha0xldmVsSW5EYj1wZWFrTHZsSW5EYjtcclxuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gICAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkNvbSBkZXN0cm95LCBkaXNhYmxlIHdha2UgbG9jay5cIilcclxuICAgICAgdGhpcy5kaXNhYmxlV2FrZUxvY2tDb25kKCk7XHJcbiAgICAgICB0aGlzLmRlc3Ryb3llZD10cnVlO1xyXG4gICAgICAgLy8gVE9ETyBzdG9wIGNhcHR1cmUgL3BsYXliYWNrXHJcbiAgICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdCgpIHtcclxuICAgIHRoaXMuc2VjdElkeCA9IDA7XHJcbiAgICB0aGlzLmdyb3VwSWR4SW5TZWN0aW9uID0gMDtcclxuICAgIHRoaXMucHJvbXB0SXRlbUlkeEluR3JvdXAgPSAwO1xyXG4gICAgdGhpcy5hdXRvcmVjb3JkaW5nID0gZmFsc2U7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RhcnRBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0b3BBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLm5leHRBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnBhdXNlQWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMucGxheVN0YXJ0QWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIGxldCBjb250ZXh0OkF1ZGlvQ29udGV4dHxudWxsPW51bGw7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb250ZXh0ID0gQXVkaW9Db250ZXh0UHJvdmlkZXIuYXVkaW9Db250ZXh0SW5zdGFuY2UoKVxyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIHRoaXMuc3RhdHVzID0gU3RhdHVzLkVSUk9SO1xyXG4gICAgICBsZXQgZXJyTXNnID0gJ1Vua25vd24gZXJyb3InO1xyXG4gICAgICBpZihlcnIgaW5zdGFuY2VvZiBFcnJvcil7XHJcbiAgICAgICAgZXJyTXNnPWVyci5tZXNzYWdlO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc3RhdHVzTXNnID0gJ0VSUk9SOiAnICsgZXJyTXNnO1xyXG4gICAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZSA9ICdlcnJvcic7XHJcbiAgICAgIHRoaXMuZGlhbG9nLm9wZW4oTWVzc2FnZURpYWxvZywge1xyXG4gICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgIHR5cGU6ICdlcnJvcicsXHJcbiAgICAgICAgICB0aXRsZTogJ0Vycm9yJyxcclxuICAgICAgICAgIG1zZzogZXJyTXNnLFxyXG4gICAgICAgICAgYWR2aWNlOiAnUGxlYXNlIHVzZSBhIHN1cHBvcnRlZCBicm93c2VyLicsXHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYoY29udGV4dCkge1xyXG4gICAgICBjb25zb2xlLmluZm8oXCJTdGF0ZSBvZiBhdWRpbyBjb250ZXh0OiBcIiArIGNvbnRleHQuc3RhdGUpXHJcbiAgICB9ZWxzZXtcclxuICAgICAgY29uc29sZS5pbmZvKFwiTm8gYXVkaW8gY29udGV4dCBhdmFpbGFibGUhXCIpO1xyXG4gICAgfVxyXG4gICAgaWYgKCFjb250ZXh0IHx8ICFuYXZpZ2F0b3IubWVkaWFEZXZpY2VzKSB7XHJcbiAgICAgIHRoaXMuc3RhdHVzID0gU3RhdHVzLkVSUk9SO1xyXG4gICAgICBsZXQgZXJyTXNnID0gJ0Jyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBNZWRpYSBzdHJlYW1zISc7XHJcbiAgICAgIHRoaXMuc3RhdHVzTXNnID0gJ0VSUk9SOiAnICsgZXJyTXNnO1xyXG4gICAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZSA9ICdlcnJvcic7XHJcbiAgICAgIHRoaXMuZGlhbG9nLm9wZW4oTWVzc2FnZURpYWxvZywge1xyXG4gICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgIHR5cGU6ICdlcnJvcicsXHJcbiAgICAgICAgICB0aXRsZTogJ0Vycm9yJyxcclxuICAgICAgICAgIG1zZzogZXJyTXNnLFxyXG4gICAgICAgICAgYWR2aWNlOiAnUGxlYXNlIHVzZSBhIHN1cHBvcnRlZCBicm93c2VyLicsXHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hYyA9IG5ldyBBdWRpb0NhcHR1cmUoY29udGV4dCk7XHJcbiAgICAgIGlmICh0aGlzLmFjKSB7XHJcbiAgICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0YXJ0QWN0aW9uLm9uQWN0aW9uID0gKCkgPT4gdGhpcy5zdGFydEl0ZW0oKTtcclxuICAgICAgICB0aGlzLmFjLmxpc3RlbmVyID0gdGhpcztcclxuXHJcbiAgICAgICAgdGhpcy5jb25maWd1cmVTdHJlYW1DYXB0dXJlU3RyZWFtKCk7XHJcblxyXG4gICAgICAgIC8vIERvbid0IGxpc3QgdGhlIGRldmljZXMgaGVyZS4gSWYgd2UgZG8gbm90IGhhdmUgYXVkaW8gcGVybWlzc2lvbnMgd2Ugb25seSBnZXQgYW5vbnltaXplZCBkZXZpY2VzIHdpdGhvdXQgbGFiZWxzLlxyXG4gICAgICAgIC8vdGhpcy5hYy5saXN0RGV2aWNlcygpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdGFydEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgICAgbGV0IGVyck1zZyA9ICdCcm93c2VyIGRvZXMgbm90IHN1cHBvcnQgTWVkaWEvQXVkaW8gQVBJISc7XHJcbiAgICAgICAgdGhpcy5zdGF0dXNNc2cgPSAnRVJST1I6ICcgKyBlcnJNc2c7XHJcbiAgICAgICAgdGhpcy5zdGF0dXNBbGVydFR5cGUgPSAnZXJyb3InO1xyXG4gICAgICAgIHRoaXMuZGlhbG9nLm9wZW4oTWVzc2FnZURpYWxvZywge1xyXG4gICAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxyXG4gICAgICAgICAgICB0aXRsZTogJ0Vycm9yJyxcclxuICAgICAgICAgICAgbXNnOiBlcnJNc2csXHJcbiAgICAgICAgICAgIGFkdmljZTogJ1BsZWFzZSB1c2UgYSBzdXBwb3J0ZWQgYnJvd3Nlci4nLFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RvcEFjdGlvbi5vbkFjdGlvbiA9ICgpID0+IHRoaXMuc3RvcEl0ZW0oKTtcclxuICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLm5leHRBY3Rpb24ub25BY3Rpb24gPSAoKSA9PiB0aGlzLnN0b3BJdGVtKCk7XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5wYXVzZUFjdGlvbi5vbkFjdGlvbiA9ICgpID0+IHRoaXMucGF1c2VJdGVtKCk7XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5md2RBY3Rpb24ub25BY3Rpb24gPSAoKSA9PiB0aGlzLm5leHRJdGVtKCk7XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5md2ROZXh0QWN0aW9uLm9uQWN0aW9uID0gKCkgPT4gdGhpcy5uZXh0VW5yZWNvcmRlZEl0ZW0oKTtcclxuICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLmJ3ZEFjdGlvbi5vbkFjdGlvbiA9ICgpID0+IHRoaXMucHJldkl0ZW0oKTtcclxuICAgICAgdGhpcy5wbGF5U3RhcnRBY3Rpb24ub25BY3Rpb24gPSAoKSA9PiB0aGlzLmNvbnRyb2xBdWRpb1BsYXllcj8uc3RhcnQoKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zdGFydFN0b3BTaWduYWxTdGF0ZSA9IFN0YXJ0U3RvcFNpZ25hbFN0YXRlLk9GRjtcclxuXHJcbn1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleXByZXNzJywgWyckZXZlbnQnXSlcclxuICBvbktleVByZXNzKGtlOiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICBpZiAoa2Uua2V5ID09ICcgJykge1xyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RhcnRBY3Rpb24ucGVyZm9ybSgpO1xyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMubmV4dEFjdGlvbi5wZXJmb3JtKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5ZG93bicsIFsnJGV2ZW50J10pXHJcbiAgb25LZXlEb3duKGtlOiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICBpZiAoa2Uua2V5ID09ICcgJykge1xyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RvcEFjdGlvbi5wZXJmb3JtKCk7XHJcbiAgICB9XHJcbiAgICBpZiAoa2Uua2V5ID09ICdwJykge1xyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMucGF1c2VBY3Rpb24ucGVyZm9ybSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChrZS5rZXkgPT0gJ0VzY2FwZScpIHtcclxuICAgICAgaWYoIXRoaXMuYXVkaW9TaWduYWxDb2xsYXBzZWQpe1xyXG4gICAgICAgIHRoaXMuYXVkaW9TaWduYWxDb2xsYXBzZWQ9dHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RvcEFjdGlvbi5wZXJmb3JtKCk7XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5wYXVzZUFjdGlvbi5wZXJmb3JtKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGtlLmtleSA9PSAnTWVkaWFQbGF5UGF1c2UnKSB7XHJcbiAgICAgIHRoaXMucGxheVN0YXJ0QWN0aW9uLnBlcmZvcm0oKTtcclxuICAgIH1cclxuICAgIGlmIChrZS5rZXkgPT09ICdBcnJvd1JpZ2h0Jykge1xyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuZndkQWN0aW9uLnBlcmZvcm0oKTtcclxuICAgIH1cclxuICAgIGlmIChrZS5rZXkgPT09ICdBcnJvd0xlZnQnKSB7XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5id2RBY3Rpb24ucGVyZm9ybSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXBkYXRlV2FrZUxvY2soZGF0YVNhdmVkOmJvb2xlYW49dGhpcy5kYXRhU2F2ZWQpe1xyXG4gICAgLy9jb25zb2xlLmRlYnVnKFwiVXBkYXRlIHdha2UgbG9jazogZGF0YVNhdmVkOiBcIitkYXRhU2F2ZWQrXCIsIG5vdCBhY3RpdmU6IFwiKyEgdGhpcy5pc0FjdGl2ZSgpKVxyXG4gICAgaWYoZGF0YVNhdmVkICYmICEgdGhpcy5pc0FjdGl2ZSgpKXtcclxuICAgICAgdGhpcy5kaXNhYmxlV2FrZUxvY2tDb25kKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm9ncmVzc1BlcmNlbnRWYWx1ZSgpOm51bWJlciB7XHJcbiAgICBsZXQgdj0xMDA7XHJcbiAgICBpZih0aGlzLml0ZW1zKSB7XHJcbiAgICAgIHY9dGhpcy5wcm9tcHRJbmRleCAqIDEwMCAvICh0aGlzLml0ZW1zLmxlbmd0aCAtIDEpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHY7XHJcbiAgfVxyXG4gIGlzVGVzdFNlc3Npb24oKTpib29sZWFuIHtcclxuICAgIHJldHVybiAoKHRoaXMuX3Nlc3Npb24hPW51bGwpICYmICh0aGlzLl9zZXNzaW9uLnR5cGUgPT09ICdURVNUJyB8fCB0aGlzLl9zZXNzaW9uLnR5cGU9PT0nVEVTVF9ERUZfQScgfHwgdGhpcy5fc2Vzc2lvbi50eXBlID09PSAnU0lOVVNfVEVTVCcpKTtcclxuICB9XHJcblxyXG4gIGlzRGVmYXVsdEF1ZGlvVGVzdFNlc3Npb24oKTpib29sZWFuIHtcclxuICAgIHJldHVybiAoKHRoaXMuX3Nlc3Npb24hPW51bGwpICYmICh0aGlzLl9zZXNzaW9uLnR5cGU9PT0nVEVTVF9ERUZfQScpKTtcclxuICB9XHJcblxyXG4gIGlzRGVmYXVsdEF1ZGlvVGVzdFNlc3Npb25PdmVyd3JpdGVpbmdQcm9qZWN0UmVxdWlyZW1lbnRzKCk6Ym9vbGVhbiB7XHJcbiAgICByZXR1cm4gKCh0aGlzLl9zZXNzaW9uIT1udWxsKSAmJiAodGhpcy5fc2Vzc2lvbi50eXBlPT09J1RFU1RfREVGX0EnKSAmJiAodGhpcy5hdWRpb0RldmljZXMhPW51bGwpICYmIHRoaXMuYXVkaW9EZXZpY2VzLmxlbmd0aD4wKVxyXG4gIH1cclxuXHJcbiAgc2V0IGNvbnRyb2xBdWRpb1BsYXllcihjb250cm9sQXVkaW9QbGF5ZXI6IEF1ZGlvUGxheWVyfG51bGwpIHtcclxuICAgIHRoaXMuX2NvbnRyb2xBdWRpb1BsYXllciA9IGNvbnRyb2xBdWRpb1BsYXllcjtcclxuICAgIGlmICh0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIpIHtcclxuICAgICAgdGhpcy5fY29udHJvbEF1ZGlvUGxheWVyLmxpc3RlbmVyID0gdGhpcztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBjb250cm9sQXVkaW9QbGF5ZXIoKTogQXVkaW9QbGF5ZXJ8bnVsbHtcclxuICAgIHJldHVybiB0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXI7XHJcbiAgfVxyXG5cclxuICBzZXQgc2NyaXB0KHNjcmlwdDogYW55KSB7XHJcbiAgICB0aGlzLl9zY3JpcHQgPSBzY3JpcHQ7XHJcbiAgICB0aGlzLmxvYWRTY3JpcHQoKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZShlOiBBdWRpb1BsYXllckV2ZW50KSB7XHJcbiAgICBpZiAoZS50eXBlID09IEV2ZW50VHlwZS5TVEFSVEVEKSB7XHJcbiAgICAgIHRoaXMucGxheVN0YXJ0QWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgdGhpcy51cGRhdGVUaW1lcklkID0gd2luZG93LnNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgICAvL3RoaXMuYXVkaW9TaWduYWwucGxheUZyYW1lUG9zaXRpb24gPSB0aGlzLmFwLnBsYXlQb3NpdGlvbkZyYW1lcztcclxuICAgICAgfSwgNTApO1xyXG4gICAgfSBlbHNlIGlmIChlLnR5cGUgPT0gRXZlbnRUeXBlLlNUT1BQRUQgfHwgZS50eXBlID09IEV2ZW50VHlwZS5FTkRFRCkge1xyXG4gICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnVwZGF0ZVRpbWVySWQpO1xyXG4gICAgICAvLyB0aGlzLmF1ZGlvU2lnbmFsLnBsYXlGcmFtZVBvc2l0aW9uID0gdGhpcy5hcC5wbGF5UG9zaXRpb25GcmFtZXM7XHJcbiAgICAgIHRoaXMucGxheVN0YXJ0QWN0aW9uLmRpc2FibGVkID0gKCEodGhpcy5kaXNwbGF5UmVjRmlsZSkpO1xyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBwcm9tcHRJbmRleCgpOm51bWJlcntcclxuICAgIHJldHVybiB0aGlzLl9wcm9tcHRJbmRleDtcclxuICB9XHJcblxyXG4gIHNldCBwcm9tcHRJbmRleChwcm9tcHRJbmRleDpudW1iZXIpe1xyXG4gICAgaWYocHJvbXB0SW5kZXg8MCB8fCBwcm9tcHRJbmRleD49dGhpcy5wcm9tcHRJdGVtQ291bnQpe1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQcm9tcHQgaW5kZXggb3V0IG9mIHJhbmdlXCIpXHJcbiAgICB9XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBsZXQgc2VjdGlvbnM9dGhpcy5fc2NyaXB0LnNlY3Rpb25zO1xyXG4gICAgbGV0IGZvdW5kPWZhbHNlO1xyXG4gICAgZm9yIChsZXQgc2kgPSAwOyBzaSA8IHNlY3Rpb25zLmxlbmd0aCAmJiAhZm91bmQ7IHNpKyspIHtcclxuICAgICAgbGV0IHNlY3Rpb24gPSBzZWN0aW9uc1tzaV07XHJcbiAgICAgIGxldCBncyA9IHNlY3Rpb24uX3NodWZmbGVkR3JvdXBzO1xyXG4gICAgICBmb3IgKGxldCBnaSA9IDA7IGdpIDwgZ3MubGVuZ3RoOyBnaSsrKSB7XHJcbiAgICAgICAgbGV0IHBpcz1nc1tnaV0uX3NodWZmbGVkUHJvbXB0SXRlbXM7XHJcblxyXG4gICAgICAgIGxldCBwaXNTaXplID0gcGlzLmxlbmd0aDtcclxuICAgICAgICBpZiAocHJvbXB0SW5kZXggPCBpICsgcGlzU2l6ZSkge1xyXG4gICAgICAgICAgdGhpcy5zZWN0SWR4ID0gc2k7XHJcbiAgICAgICAgICB0aGlzLmdyb3VwSWR4SW5TZWN0aW9uPWdpO1xyXG4gICAgICAgICAgdGhpcy5wcm9tcHRJdGVtSWR4SW5Hcm91cCA9IHByb21wdEluZGV4IC0gaTtcclxuICAgICAgICAgIGZvdW5kPXRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaSArPSBwaXNTaXplO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYoZm91bmQpe1xyXG4gICAgICB0aGlzLl9wcm9tcHRJbmRleD1wcm9tcHRJbmRleDtcclxuICAgIH1lbHNle1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnRlcm5hbCBlcnJvcjogUHJvbXB0IGluZGV4IG5vdCBmb3VuZFwiKVxyXG4gICAgfVxyXG4gICAgdGhpcy5hcHBseUl0ZW0oKTtcclxuICB9XHJcblxyXG4gIGl0ZW1TZWxlY3QoaXRlbUlkeDogbnVtYmVyKSB7XHJcbiAgICBpZiAodGhpcy5zdGF0dXMgPT09IFN0YXR1cy5JRExFKSB7XHJcbiAgICAgIHRoaXMucHJvbXB0SW5kZXg9aXRlbUlkeDtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIHN0YXJ0SXRlbSgpIHtcclxuICAgIHRoaXMuc3RhdHVzPVN0YXR1cy5TVEFSVElORztcclxuICAgIHN1cGVyLnN0YXJ0SXRlbSgpO1xyXG4gICAgaWYgKHRoaXMucmVhZG9ubHkpIHtcclxuICAgICAgdGhpcy5zdGF0dXM9U3RhdHVzLklETEU7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLmZ3ZEFjdGlvbi5kaXNhYmxlZCA9IHRydWVcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5md2ROZXh0QWN0aW9uLmRpc2FibGVkID0gdHJ1ZVxyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLmJ3ZEFjdGlvbi5kaXNhYmxlZCA9IHRydWVcclxuICAgIHRoaXMudXBkYXRlRGlzcGxheVJlY0ZpbGUobnVsbCk7XHJcbiAgICB0aGlzLmRpc3BsYXlSZWNGaWxlVmVyc2lvbiA9IDA7XHJcbiAgICB0aGlzLmRpc3BsYXlBdWRpb0NsaXAgPSBudWxsO1xyXG4gICAgdGhpcy5zaG93UmVjb3JkaW5nKCk7XHJcbiAgICBpZiAodGhpcy5zZWN0aW9uLm1vZGUgPT09ICdBVVRPUkVDT1JESU5HJykge1xyXG4gICAgICB0aGlzLmF1dG9yZWNvcmRpbmcgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmKHRoaXMuYWMhPW51bGwpIHtcclxuICAgICAgaWYgKCF0aGlzLmFjLm9wZW5lZCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9zZWxlY3RlZERldmljZUlkKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIk9wZW4gc2Vzc2lvbiB3aXRoIGF1ZGlvIGRldmljZSBJZDogXFwnXCIgKyB0aGlzLl9zZWxlY3RlZERldmljZUlkICsgXCJcXCcgZm9yIFwiICsgdGhpcy5fY2hhbm5lbENvdW50ICsgXCIgY2hhbm5lbHNcIik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiT3BlbiBzZXNzaW9uIHdpdGggZGVmYXVsdCBhdWRpbyBkZXZpY2UgZm9yIFwiICsgdGhpcy5fY2hhbm5lbENvdW50ICsgXCIgY2hhbm5lbHNcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYWMub3Blbih0aGlzLl9jaGFubmVsQ291bnQsIHRoaXMuX3NlbGVjdGVkRGV2aWNlSWQsdGhpcy5fYXV0b0dhaW5Db250cm9sQ29uZmlncyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5hYy5zdGFydCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBsb2FkU2NyaXB0KCkge1xyXG4gICAgdGhpcy5wcm9tcHRJdGVtQ291bnQgPSAwO1xyXG5cclxuICAgIHRoaXMuaXRlbXMgPSBuZXcgQXJyYXk8SXRlbT4oKTtcclxuICAgIGxldCBsbiA9IDA7XHJcblxyXG4gICAgLy9UT0RPIHJhbmRvbWl6ZSBub3Qgc3VwcG9ydGVkXHJcbiAgICBmb3IgKGxldCBzaSA9IDA7IHNpIDwgdGhpcy5fc2NyaXB0LnNlY3Rpb25zLmxlbmd0aDsgc2krKykge1xyXG4gICAgICBsZXQgc2VjdGlvbiA9IHRoaXMuX3NjcmlwdC5zZWN0aW9uc1tzaV07XHJcbiAgICAgIGxldCBncyA9IHNlY3Rpb24uX3NodWZmbGVkR3JvdXBzO1xyXG4gICAgICBmb3IobGV0IGdpPTA7Z2k8Z3MubGVuZ3RoO2dpKyspIHtcclxuXHJcbiAgICAgICAgICBsZXQgcGlzID0gZ3NbZ2ldLl9zaHVmZmxlZFByb21wdEl0ZW1zO1xyXG5cclxuICAgICAgICAgIGxldCBwaXNMZW4gPSBwaXMubGVuZ3RoO1xyXG4gICAgICAgICAgdGhpcy5wcm9tcHRJdGVtQ291bnQgKz0gcGlzTGVuO1xyXG4gICAgICAgICAgZm9yIChsZXQgcGlTZWN0SWR4ID0gMDsgcGlTZWN0SWR4IDwgcGlzTGVuOyBwaVNlY3RJZHgrKykge1xyXG4gICAgICAgICAgICBsZXQgcGkgPSBwaXNbcGlTZWN0SWR4XTtcclxuICAgICAgICAgICAgbGV0IHByb21wdEFzU3RyID0gUHJvbXB0aXRlbVV0aWwudG9QbGFpblRleHRTdHJpbmcocGkpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGl0ID0gbmV3IEl0ZW0ocHJvbXB0QXNTdHIsIHNlY3Rpb24udHJhaW5pbmcsKCFwaS50eXBlIHx8IHBpLnR5cGU9PT0ncmVjb3JkaW5nJykpO1xyXG4gICAgICAgICAgICB0aGlzLml0ZW1zLnB1c2goaXQpO1xyXG4gICAgICAgICAgICBsbisrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm9tcHRJbmRleEJ5SXRlbWNvZGUoaXRlbWNvZGU6c3RyaW5nKTpudW1iZXJ8bnVsbHtcclxuICAgIGxldCBwaXggPSAwO1xyXG5cclxuICAgIGZvciAobGV0IHNpID0gMDsgc2kgPCB0aGlzLl9zY3JpcHQuc2VjdGlvbnMubGVuZ3RoOyBzaSsrKSB7XHJcbiAgICAgIGxldCBzZWN0aW9uID0gdGhpcy5fc2NyaXB0LnNlY3Rpb25zW3NpXTtcclxuICAgICAgbGV0IGdzID0gc2VjdGlvbi5fc2h1ZmZsZWRHcm91cHM7XHJcbiAgICAgIGZvcihsZXQgZ2k9MDtnaTxncy5sZW5ndGg7Z2krKykge1xyXG4gICAgICAgIGxldCBwaXM9Z3NbZ2ldLl9zaHVmZmxlZFByb21wdEl0ZW1zO1xyXG4gICAgICAgIGxldCBwaXNMZW4gPSBwaXMubGVuZ3RoO1xyXG4gICAgICAgIGZvciAobGV0IHBpU2VjdElkeCA9IDA7IHBpU2VjdElkeCA8IHBpc0xlbjsgcGlTZWN0SWR4KyspIHtcclxuICAgICAgICAgIGxldCBwaSA9IHBpc1twaVNlY3RJZHhdO1xyXG4gICAgICAgICAgbGV0IGljPXBpLml0ZW1jb2RlO1xyXG4gICAgICAgICAgaWYoaWMgPT09IGl0ZW1jb2RlKXtcclxuICAgICAgICAgICAgcmV0dXJuIHBpeDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHBpeCsrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBjbGVhclByb21wdCgpIHtcclxuICAgIC8vdGhpcy5wcm9tcHRpbmcucHJvbXB0Q29udGFpbmVyLnByb21wdGVyLnByb21wdFRleHQ9Jyc7XHJcbiAgICAvL3RoaXMubWVkaWFpdGVtID0gbnVsbDtcclxuICAgIHRoaXMuc2hvd1Byb21wdCA9IGZhbHNlO1xyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKClcclxuICB9XHJcblxyXG4gIGFwcGx5UHJvbXB0KCkge1xyXG4gICAgLy90aGlzLnByb21wdGluZy5wcm9tcHRDb250YWluZXIucHJvbXB0ZXIucHJvbXB0VGV4dD10aGlzLnByb21wdFVuaXQubWVkaWFpdGVtc1swXS50ZXh0O1xyXG4gICAgLy90aGlzLnByb21wdFRleHQgPSB0aGlzLnByb21wdFVuaXQubWVkaWFpdGVtc1swXS50ZXh0O1xyXG4gICAgLy90aGlzLm1lZGlhaXRlbT10aGlzLnByb21wdFVuaXQubWVkaWFpdGVtc1swXTtcclxuICAgIHRoaXMuc2hvd1Byb21wdCA9IHRydWU7XHJcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKVxyXG4gIH1cclxuXHJcbiAgZG93bmxvYWRSZWNvcmRpbmcoKSB7XHJcbiAgICBpZiAodGhpcy5kaXNwbGF5UmVjRmlsZSkge1xyXG4gICAgICBsZXQgYWI6IEF1ZGlvQnVmZmVyfG51bGwgPSB0aGlzLmRpc3BsYXlSZWNGaWxlLmF1ZGlvQnVmZmVyO1xyXG4gICAgICBsZXQgd3cgPSBuZXcgV2F2V3JpdGVyKCk7XHJcbiAgICAgIGlmKGFiKSB7XHJcbiAgICAgICAgbGV0IHdhdkZpbGUgPSB3dy53cml0ZUFzeW5jKGFiLCAod2F2RmlsZSkgPT4ge1xyXG4gICAgICAgICAgbGV0IGJsb2IgPSBuZXcgQmxvYihbd2F2RmlsZV0sIHt0eXBlOiAnYXVkaW8vd2F2J30pO1xyXG4gICAgICAgICAgbGV0IHJmVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuXHJcbiAgICAgICAgICBsZXQgZGF0YURubExuayA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgICAgICAgLy9kYXRhRG5sTG5rLm5hbWUgPSAnUmVjb3JkaW5nJztcclxuICAgICAgICAgIGRhdGFEbmxMbmsuaHJlZiA9IHJmVXJsO1xyXG5cclxuICAgICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuYm9keSwgZGF0YURubExuayk7XHJcblxyXG4gICAgICAgICAgLy8gZG93bmxvYWQgcHJvcGVydHkgbm90IHlldCBpbiBUUyBkZWZcclxuICAgICAgICAgIGlmICh0aGlzLmRpc3BsYXlSZWNGaWxlKSB7XHJcbiAgICAgICAgICAgIGxldCBmbiA9IHRoaXMuZGlzcGxheVJlY0ZpbGUuZmlsZW5hbWVTdHJpbmcoKTtcclxuICAgICAgICAgICAgZm4gKz0gJ18nICsgdGhpcy5kaXNwbGF5UmVjRmlsZVZlcnNpb247XHJcbiAgICAgICAgICAgIGZuICs9ICcud2F2JztcclxuICAgICAgICAgICAgZGF0YURubExuay5kb3dubG9hZCA9IGZuO1xyXG4gICAgICAgICAgICBkYXRhRG5sTG5rLmNsaWNrKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKGRvY3VtZW50LmJvZHksIGRhdGFEbmxMbmspO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvYWRBbmRTaG93RGlzcGxheVJlY29yZGluZ0ZpbGUoKXtcclxuXHJcbiAgfVxyXG5cclxuICBzZXQgZGlzcGxheVJlY0ZpbGUoZGlzcGxheVJlY0ZpbGU6IFNwclJlY29yZGluZ0ZpbGUgfCBudWxsKSB7XHJcbiAgICB0aGlzLl9kaXNwbGF5UmVjRmlsZSA9IGRpc3BsYXlSZWNGaWxlO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlRGlzcGxheVJlY0ZpbGUoZGlzcGxheVJlY0ZpbGU6IFNwclJlY29yZGluZ0ZpbGUgfCBudWxsLGZldGNoQW5kQXBwbHlSZWNvcmRpbmdGaWxlOmJvb2xlYW49dHJ1ZSkge1xyXG4gICAgdGhpcy5kaXNwbGF5UmVjRmlsZT1kaXNwbGF5UmVjRmlsZTtcclxuICAgIGlmICh0aGlzLl9kaXNwbGF5UmVjRmlsZSkge1xyXG4gICAgICBsZXQgYWI6IEF1ZGlvQnVmZmVyfG51bGwgPSB0aGlzLl9kaXNwbGF5UmVjRmlsZS5hdWRpb0J1ZmZlcjtcclxuICAgICAgaWYoYWIpIHtcclxuICAgICAgICB0aGlzLmRpc3BsYXlBdWRpb0NsaXAgPSBuZXcgQXVkaW9DbGlwKGFiKTtcclxuICAgICAgICBpZih0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIpIHtcclxuICAgICAgICAgIHRoaXMuX2NvbnRyb2xBdWRpb1BsYXllci5hdWRpb0NsaXAgPSB0aGlzLmRpc3BsYXlBdWRpb0NsaXA7XHJcbiAgICAgICAgfVxyXG4gICAgICB9ZWxzZSB7XHJcbiAgICAgICAgLy8gY2xlYXIgZm9yIG5vdyAuLi5cclxuICAgICAgICB0aGlzLmRpc3BsYXlBdWRpb0NsaXAgPSBudWxsO1xyXG4gICAgICAgIGlmKHRoaXMuX2NvbnRyb2xBdWRpb1BsYXllcikge1xyXG4gICAgICAgICAgdGhpcy5fY29udHJvbEF1ZGlvUGxheWVyLmF1ZGlvQ2xpcCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKGZldGNoQW5kQXBwbHlSZWNvcmRpbmdGaWxlKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5fY29udHJvbEF1ZGlvUGxheWVyICYmIHRoaXMuX3Nlc3Npb24pIHtcclxuICAgICAgICAgICAgLy8uLi4gYW5kIHRyeSB0byBmZXRjaCBmcm9tIHNlcnZlclxyXG4gICAgICAgICAgICBjb25zdCBkUmYgPSB0aGlzLl9kaXNwbGF5UmVjRmlsZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuYXVkaW9GZXRjaFN1YnNjcmlwdGlvbiA9IHRoaXMucmVjRmlsZVNlcnZpY2UuZmV0Y2hBbmRBcHBseVNwclJlY29yZGluZ0ZpbGUodGhpcy5fY29udHJvbEF1ZGlvUGxheWVyLmNvbnRleHQsIHRoaXMuX3Nlc3Npb24ucHJvamVjdCwgZFJmKS5zdWJzY3JpYmUoKHJmKSA9PiB7XHJcbiAgICAgICAgICAgICAgbGV0IGZhYiA9IG51bGw7XHJcbiAgICAgICAgICAgICAgaWYgKHJmKSB7XHJcbiAgICAgICAgICAgICAgICBmYWIgPSBkUmYuYXVkaW9CdWZmZXI7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlJlY29yZGluZyBmaWxlIGNvdWxkIG5vdCBiZSBsb2FkZWQuIHJmOiBcIityZitcIiwgX2Rpc3BsYXlSZWNGaWxlOiBcIit0aGlzLl9kaXNwbGF5UmVjRmlsZStcIiwgZFJmOiBcIitkUmYpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNNc2cgPSAnUmVjb3JkaW5nIGZpbGUgY291bGQgbm90IGJlIGxvYWRlZC4nXHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZSA9ICdlcnJvcidcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKGZhYikge1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFRPRE8gQXN5bmMgd2lsbCBzZXQgdGhlIHByZXZpb3VzIGZpbGUgd2l0aCBhdXRvcmVjb3JkaW5nXHJcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlBdWRpb0NsaXAgPSBuZXcgQXVkaW9DbGlwKGZhYik7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmKHRoaXMuX2NvbnRyb2xBdWRpb1BsYXllcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY29udHJvbEF1ZGlvUGxheWVyLmF1ZGlvQ2xpcCA9IHRoaXMuZGlzcGxheUF1ZGlvQ2xpcDtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgdGhpcy5zaG93UmVjb3JkaW5nKCk7XHJcblxyXG4gICAgICAgICAgICB9LCBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJDb3VsZCBub3QgbG9hZCByZWNvcmRpbmcgZmlsZSBmcm9tIHNlcnZlcjogXCIgKyBlcnIpXHJcbiAgICAgICAgICAgICAgdGhpcy5zdGF0dXNNc2cgPSAnUmVjb3JkaW5nIGZpbGUgY291bGQgbm90IGJlIGxvYWRlZDogJyArIGVyclxyXG4gICAgICAgICAgICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJ1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zdGF0dXNNc2cgPSAnUmVjb3JkaW5nIGZpbGUgY291bGQgbm90IGJlIGRlY29kZWQuIEF1ZGlvIGNvbnRleHQgdW5hdmFpbGFibGUuJ1xyXG4gICAgICAgICAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZSA9ICdlcnJvcidcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmRpc3BsYXlBdWRpb0NsaXAgPSBudWxsO1xyXG4gICAgICBpZih0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIpIHtcclxuICAgICAgICB0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIuYXVkaW9DbGlwID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGRpc3BsYXlSZWNGaWxlKCk6IFNwclJlY29yZGluZ0ZpbGUgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLl9kaXNwbGF5UmVjRmlsZTtcclxuICB9XHJcblxyXG4gIHNob3dSZWNvcmRpbmcoKSB7XHJcbiAgICBpZih0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIpIHtcclxuICAgICAgdGhpcy5fY29udHJvbEF1ZGlvUGxheWVyLnN0b3AoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5kaXNwbGF5QXVkaW9DbGlwKSB7XHJcbiAgICAgIGxldCBkYXA9dGhpcy5kaXNwbGF5QXVkaW9DbGlwO1xyXG4gICAgICB0aGlzLmxldmVsTWVhc3VyZS5jYWxjQnVmZmVyTGV2ZWxJbmZvcyhkYXAuYnVmZmVyLCBMRVZFTF9CQVJfSU5URVJWQUxMX1NFQ09ORFMpLnRoZW4oKGxldmVsSW5mb3MpID0+IHtcclxuICAgICAgICAgIGRhcC5sZXZlbEluZm9zID0gbGV2ZWxJbmZvcztcclxuICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5wbGF5U3RhcnRBY3Rpb24uZGlzYWJsZWQgPSBmYWxzZTtcclxuXHJcbiAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgdGhpcy5wbGF5U3RhcnRBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG5cclxuICAgICAgLy8gQ29sbGFwc2UgYXVkaW8gc2lnbmFsIGRpc3BsYXkgaWYgb3BlblxyXG4gICAgICBpZiAoIXRoaXMuYXVkaW9TaWduYWxDb2xsYXBzZWQpIHtcclxuICAgICAgICB0aGlzLmF1ZGlvU2lnbmFsQ29sbGFwc2VkID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgaXNSZWNvcmRpbmdJdGVtKCk6Ym9vbGVhbntcclxuICAgIHJldHVybih0aGlzLnByb21wdEl0ZW0hPW51bGwgJiYgdGhpcy5wcm9tcHRJdGVtLnR5cGUhPT0nbm9ucmVjb3JkaW5nJylcclxuICB9XHJcblxyXG4gIHVwZGF0ZVN0YXJ0QWN0aW9uRGlzYWJsZVN0YXRlKCl7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RhcnRBY3Rpb24uZGlzYWJsZWQ9ISh0aGlzLmFjICAmJiB0aGlzLmlzUmVjb3JkaW5nSXRlbSgpKTtcclxuICB9XHJcblxyXG4gIGFwcGx5SXRlbSh0ZW1wb3Jhcnk9ZmFsc2UpIHtcclxuXHJcbiAgICB0aGlzLnNlY3Rpb24gPSB0aGlzLl9zY3JpcHQuc2VjdGlvbnNbdGhpcy5zZWN0SWR4XVxyXG4gICAgdGhpcy5ncm91cCA9IHRoaXMuc2VjdGlvbi5fc2h1ZmZsZWRHcm91cHNbdGhpcy5ncm91cElkeEluU2VjdGlvbl07XHJcbiAgICB0aGlzLnByb21wdEl0ZW0gPSB0aGlzLmdyb3VwLl9zaHVmZmxlZFByb21wdEl0ZW1zW3RoaXMucHJvbXB0SXRlbUlkeEluR3JvdXBdO1xyXG5cclxuICAgIC8vdGhpcy5zZWxlY3RlZEl0ZW1JZHggPSB0aGlzLnByb21wdEluZGV4O1xyXG5cclxuICAgIGlmKHRoaXMuYXVkaW9GZXRjaFN1YnNjcmlwdGlvbil7XHJcbiAgICAgIHRoaXMuYXVkaW9GZXRjaFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jbGVhclByb21wdCgpO1xyXG5cclxuICAgIGxldCBpc05vbnJlY29yZGluZz0odGhpcy5wcm9tcHRJdGVtLnR5cGU9PT0nbm9ucmVjb3JkaW5nJylcclxuXHJcbiAgICBpZiAoaXNOb25yZWNvcmRpbmcgfHwgIXRoaXMuc2VjdGlvbi5wcm9tcHRwaGFzZSB8fCB0aGlzLnNlY3Rpb24ucHJvbXB0cGhhc2UgPT09ICdJRExFJykge1xyXG4gICAgICB0aGlzLmFwcGx5UHJvbXB0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYoaXNOb25yZWNvcmRpbmcpe1xyXG4gICAgICB0aGlzLnVwZGF0ZURpc3BsYXlSZWNGaWxlKG51bGwpO1xyXG4gICAgICB0aGlzLmRpc3BsYXlSZWNGaWxlVmVyc2lvbiA9IDA7XHJcbiAgICAgIHRoaXMuc3RhcnRTdG9wU2lnbmFsU3RhdGUgPSBTdGFydFN0b3BTaWduYWxTdGF0ZS5PRkY7XHJcbiAgICB9ZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLml0ZW1zKSB7XHJcbiAgICAgICAgbGV0IGl0ID0gdGhpcy5pdGVtc1t0aGlzLnByb21wdEluZGV4XTtcclxuICAgICAgICBpZiAoIWl0LnJlY3MpIHtcclxuICAgICAgICAgIGl0LnJlY3MgPSBuZXcgQXJyYXk8U3ByUmVjb3JkaW5nRmlsZT4oKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCByZWNlbnRSZWNGaWxlOiBTcHJSZWNvcmRpbmdGaWxlIHwgbnVsbCA9IG51bGw7XHJcbiAgICAgICAgbGV0IGF2YWlsUmVjZmlsZXM6IG51bWJlciA9IGl0LnJlY3MubGVuZ3RoO1xyXG4gICAgICAgIGlmIChhdmFpbFJlY2ZpbGVzID4gMCkge1xyXG4gICAgICAgICAgbGV0IHJmVmVyczogbnVtYmVyID0gYXZhaWxSZWNmaWxlcyAtIDE7XHJcbiAgICAgICAgICByZWNlbnRSZWNGaWxlID0gaXQucmVjc1tyZlZlcnNdO1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVEaXNwbGF5UmVjRmlsZShyZWNlbnRSZWNGaWxlLCF0ZW1wb3JhcnkpO1xyXG4gICAgICAgICAgdGhpcy5kaXNwbGF5UmVjRmlsZVZlcnNpb24gPSByZlZlcnM7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZURpc3BsYXlSZWNGaWxlKG51bGwpO1xyXG4gICAgICAgICAgdGhpcy5kaXNwbGF5UmVjRmlsZVZlcnNpb24gPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZighdGhpcy5yZWFkb25seSkge1xyXG4gICAgICAgIHRoaXMuc3RhcnRTdG9wU2lnbmFsU3RhdGUgPSBTdGFydFN0b3BTaWduYWxTdGF0ZS5JRExFO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoIXRlbXBvcmFyeSkge1xyXG4gICAgICB0aGlzLnNob3dSZWNvcmRpbmcoKTtcclxuICAgIH1cclxuICAgIHRoaXMudXBkYXRlU3RhcnRBY3Rpb25EaXNhYmxlU3RhdGUoKVxyXG4gICAgdGhpcy51cGRhdGVOYXZpZ2F0aW9uQWN0aW9ucygpXHJcbiAgfVxyXG5cclxuXHJcbiAgc3RhcnQoKSB7XHJcbiAgICBzdXBlci5zdGFydCgpO1xyXG4gICAgaWYodGhpcy5wcm9tcHRJdGVtQ291bnQ+MCkge1xyXG4gICAgICB0aGlzLnByb21wdEluZGV4ID0gMDtcclxuICAgIH1cclxuICAgIHRoaXMuZW5hYmxlTmF2aWdhdGlvbigpXHJcbiAgfVxyXG5cclxuICBpc1JlY29yZGluZygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAodGhpcy5zdGF0dXMgPT09IFN0YXR1cy5QUkVfUkVDT1JESU5HIHx8IHRoaXMuc3RhdHVzID09PSBTdGF0dXMuUkVDT1JESU5HKTtcclxuICB9XHJcblxyXG4gIGlzQWN0aXZlKCk6IGJvb2xlYW57XHJcbiAgICByZXR1cm4gKCEodGhpcy5zdGF0dXMgPT09IFN0YXR1cy5CTE9DS0VEIHx8IHRoaXMuc3RhdHVzPT09IFN0YXR1cy5JRExFIHx8IHRoaXMuc3RhdHVzPT09U3RhdHVzLkVSUk9SKSB8fCB0aGlzLnByb2Nlc3NpbmdSZWNvcmRpbmcgfHwgdGhpcy5zZXNzaW9uU2VydmljZS51cGxvYWRDb3VudD4wKVxyXG4gIH1cclxuXHJcbiAgICBwcmV2SXRlbSgpIHtcclxuICAgICAgIGxldCBuZXdQcklkeD10aGlzLl9wcm9tcHRJbmRleDtcclxuICAgICAgIG5ld1BySWR4LS07XHJcbiAgICAgICBpZihuZXdQcklkeDwwKXtcclxuICAgICAgICAgbmV3UHJJZHg9dGhpcy5wcm9tcHRJdGVtQ291bnQtMTtcclxuICAgICAgIH1cclxuICAgICAgIHRoaXMucHJvbXB0SW5kZXg9bmV3UHJJZHg7XHJcbiAgICAgIC8vdGhpcy51cGRhdGVOYXZpZ2F0aW9uQWN0aW9ucygpXHJcbiAgICB9XHJcblxyXG5cclxuICBuZXh0SXRlbSgpIHtcclxuICAgIGxldCBuZXdQcklkeD10aGlzLl9wcm9tcHRJbmRleDtcclxuICAgIG5ld1BySWR4Kys7XHJcbiAgICBpZihuZXdQcklkeD49dGhpcy5wcm9tcHRJdGVtQ291bnQpe1xyXG4gICAgICBuZXdQcklkeD0wO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wcm9tcHRJbmRleD1uZXdQcklkeDtcclxuICAgIC8vdGhpcy51cGRhdGVOYXZpZ2F0aW9uQWN0aW9ucygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVOYXZpZ2F0aW9uQWN0aW9ucygpe1xyXG4gICAgbGV0IGZ3ZE54dEFjdGlvbkRpc2FibGVkPXRydWU7XHJcbiAgICBpZih0aGlzLml0ZW1zKXtcclxuICAgICAgbGV0IGN1cnJSZWNzPXRoaXMuaXRlbXNbdGhpcy5fcHJvbXB0SW5kZXhdLnJlY3M7XHJcbiAgICAgIGZ3ZE54dEFjdGlvbkRpc2FibGVkPSAhIChjdXJyUmVjcyE9bnVsbCAmJiBjdXJyUmVjcy5sZW5ndGg+MCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuZndkTmV4dEFjdGlvbi5kaXNhYmxlZCA9IHRoaXMubmF2aWdhdGlvbkRpc2FibGVkIHx8IGZ3ZE54dEFjdGlvbkRpc2FibGVkO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLmZ3ZEFjdGlvbi5kaXNhYmxlZCA9IHRoaXMubmF2aWdhdGlvbkRpc2FibGVkO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLmJ3ZEFjdGlvbi5kaXNhYmxlZCA9IHRoaXMubmF2aWdhdGlvbkRpc2FibGVkO1xyXG4gIH1cclxuXHJcbiAgbmV4dFVucmVjb3JkZWRJdGVtKCkge1xyXG4gICAgbGV0IG5ld1BySWR4ID0gdGhpcy5fcHJvbXB0SW5kZXg7XHJcbiAgICBuZXdQcklkeCsrO1xyXG4gICAgaWYgKG5ld1BySWR4ID49IHRoaXMucHJvbXB0SXRlbUNvdW50KSB7XHJcbiAgICAgIG5ld1BySWR4ID0gMDtcclxuICAgIH1cclxuICAgIGlmKHRoaXMuaXRlbXMhPW51bGwpIHtcclxuICAgICAgbGV0IGl0UmVjcz10aGlzLml0ZW1zW25ld1BySWR4XS5yZWNzO1xyXG4gICAgICB3aGlsZSAoaXRSZWNzIT1udWxsICYmIChpdFJlY3MubGVuZ3RoID4gMCkgJiYgbmV3UHJJZHggPCB0aGlzLnByb21wdEl0ZW1Db3VudCkge1xyXG4gICAgICAgIG5ld1BySWR4Kys7XHJcbiAgICAgICAgaXRSZWNzPXRoaXMuaXRlbXNbbmV3UHJJZHhdLnJlY3M7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFpdFJlY3MgfHwgaXRSZWNzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgdGhpcy5wcm9tcHRJbmRleCA9IG5ld1BySWR4O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBlbmFibGVTdGFydFVzZXJHZXN0dXJlKCkge1xyXG4gICAgc3VwZXIuZW5hYmxlU3RhcnRVc2VyR2VzdHVyZSgpO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0YXJ0QWN0aW9uLmRpc2FibGVkPSEodGhpcy5hYyAmJiB0aGlzLmlzUmVjb3JkaW5nSXRlbSgpKTtcclxuICB9XHJcblxyXG4gIGVuYWJsZU5hdmlnYXRpb24oKXtcclxuICAgIHRoaXMubmF2aWdhdGlvbkRpc2FibGVkPWZhbHNlO1xyXG4gICAgdGhpcy51cGRhdGVOYXZpZ2F0aW9uQWN0aW9ucygpO1xyXG4gIH1cclxuXHJcbiAgb3BlbmVkKCkge1xyXG4gICAgaWYodGhpcy5hYykge1xyXG4gICAgICB0aGlzLmFjLnN0YXJ0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGFydGVkKCkge1xyXG4gICAgdGhpcy5zdGF0dXMgPSBTdGF0dXMuUFJFX1JFQ09SRElORztcclxuICAgIHN1cGVyLnN0YXJ0ZWQoKTtcclxuICAgIHRoaXMuc3RhcnRTdG9wU2lnbmFsU3RhdGUgPSBTdGFydFN0b3BTaWduYWxTdGF0ZS5QUkVSRUNPUkRJTkc7XHJcbiAgICBpZih0aGlzLl9zZXNzaW9uKSB7XHJcbiAgICAgIGlmICh0aGlzLl9zZXNzaW9uLnN0YXR1cyA9PT0gXCJMT0FERURcIikge1xyXG4gICAgICAgIGxldCBib2R5OiBhbnkgPSB7fTtcclxuICAgICAgICBpZiAodGhpcy5zZWN0aW9uLnRyYWluaW5nKSB7XHJcbiAgICAgICAgICB0aGlzLl9zZXNzaW9uLnN0YXR1cyA9IFwiU1RBUlRFRF9UUkFJTklOR1wiXHJcbiAgICAgICAgICBib2R5LnN0YXR1cyA9IHRoaXMuX3Nlc3Npb24uc3RhdHVzO1xyXG4gICAgICAgICAgaWYgKCF0aGlzLl9zZXNzaW9uLnN0YXJ0ZWRUcmFpbmluZ0RhdGUpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2Vzc2lvbi5zdGFydGVkVHJhaW5pbmdEYXRlID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgYm9keS5zdGFydGVkVHJhaW5pbmdEYXRlID0gdGhpcy5fc2Vzc2lvbi5zdGFydGVkVHJhaW5pbmdEYXRlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLl9zZXNzaW9uLnN0YXR1cyA9IFwiU1RBUlRFRFwiXHJcbiAgICAgICAgICBib2R5LnN0YXR1cyA9IHRoaXMuX3Nlc3Npb24uc3RhdHVzO1xyXG4gICAgICAgICAgaWYgKCF0aGlzLl9zZXNzaW9uLnN0YXJ0ZWREYXRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Nlc3Npb24uc3RhcnRlZERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICBib2R5LnN0YXJ0ZWREYXRlID0gdGhpcy5fc2Vzc2lvbi5zdGFydGVkRGF0ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZXNzaW9uU2VydmljZS5wYXRjaFNlc3Npb25PYnNlcnZlcih0aGlzLl9zZXNzaW9uLCBib2R5KS5zdWJzY3JpYmUoKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zZWN0aW9uLnByb21wdHBoYXNlID09PSAnUFJFUkVDT1JESU5HJyB8fCB0aGlzLnNlY3Rpb24ucHJvbXB0cGhhc2UgPT09ICdQUkVSRUNPUkRJTkdPTkxZJykge1xyXG4gICAgICB0aGlzLmFwcGx5UHJvbXB0KCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZSA9ICdpbmZvJztcclxuICAgIHRoaXMuc3RhdHVzTXNnID0gJ1JlY29yZGluZy4uLic7XHJcblxyXG4gICAgbGV0IHByZURlbGF5ID0gREVGQVVMVF9QUkVfUkVDX0RFTEFZO1xyXG4gICAgaWYgKHRoaXMucHJvbXB0SXRlbS5wcmVyZWNkZWxheSE9bnVsbCkge1xyXG4gICAgICBwcmVEZWxheSA9IHRoaXMucHJvbXB0SXRlbS5wcmVyZWNkZWxheTtcclxuICAgIH1lbHNlIGlmICh0aGlzLnByb21wdEl0ZW0ucHJlcmVjb3JkaW5nIT1udWxsKSB7XHJcbiAgICAgIHByZURlbGF5ID0gdGhpcy5wcm9tcHRJdGVtLnByZXJlY29yZGluZztcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnBvc3REZWxheT1ERUZBVUxUX1BPU1RfUkVDX0RFTEFZO1xyXG4gICAgaWYodGhpcy5wcm9tcHRJdGVtLnBvc3RyZWNkZWxheSE9bnVsbCl7XHJcbiAgICAgIHRoaXMucG9zdERlbGF5PXRoaXMucHJvbXB0SXRlbS5wb3N0cmVjZGVsYXk7XHJcbiAgICB9ZWxzZSBpZih0aGlzLnByb21wdEl0ZW0ucG9zdHJlY29yZGluZyE9bnVsbCl7XHJcbiAgICAgIHRoaXMucG9zdERlbGF5PXRoaXMucHJvbXB0SXRlbS5wb3N0cmVjb3JkaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBtYXhSZWNvcmRpbmdUaW1lTXMgPSBNQVhfUkVDT1JESU5HX1RJTUVfTVM7XHJcbiAgICBpZiAodGhpcy5wcm9tcHRJdGVtLnJlY2R1cmF0aW9uIT09bnVsbCAmJiB0aGlzLnByb21wdEl0ZW0ucmVjZHVyYXRpb24hPT11bmRlZmluZWQpIHtcclxuICAgICAgbWF4UmVjb3JkaW5nVGltZU1zID0gcHJlRGVsYXkrdGhpcy5wcm9tcHRJdGVtLnJlY2R1cmF0aW9uK3RoaXMucG9zdERlbGF5O1xyXG4gICAgfVxyXG4gICAgdGhpcy5tYXhSZWNUaW1lcklkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnN0b3BSZWNvcmRpbmdNYXhSZWMoKVxyXG4gICAgfSwgbWF4UmVjb3JkaW5nVGltZU1zKTtcclxuICAgIHRoaXMubWF4UmVjVGltZXJSdW5uaW5nID0gdHJ1ZTtcclxuXHJcblxyXG5cclxuICAgIHRoaXMucHJlUmVjVGltZXJJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuXHJcbiAgICAgIHRoaXMucHJlUmVjVGltZXJSdW5uaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuc3RhdHVzID0gU3RhdHVzLlJFQ09SRElORztcclxuICAgICAgdGhpcy5zdGFydFN0b3BTaWduYWxTdGF0ZSA9IFN0YXJ0U3RvcFNpZ25hbFN0YXRlLlJFQ09SRElORztcclxuICAgICAgaWYgKHRoaXMuc2VjdGlvbi5tb2RlID09PSAnQVVUT1JFQ09SRElORycpIHtcclxuICAgICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMubmV4dEFjdGlvbi5kaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5wYXVzZUFjdGlvbi5kaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdG9wQWN0aW9uLmRpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuc2VjdGlvbi5wcm9tcHRwaGFzZSA9PT0gJ1JFQ09SRElORycpIHtcclxuICAgICAgICB0aGlzLmFwcGx5UHJvbXB0KCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuc2VjdGlvbi5wcm9tcHRwaGFzZSA9PT0gJ1BSRVJFQ09SRElOR09OTFknKXtcclxuICAgICAgICB0aGlzLmNsZWFyUHJvbXB0KCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9LCBwcmVEZWxheSk7XHJcbiAgICB0aGlzLnByZVJlY1RpbWVyUnVubmluZyA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBzdG9wSXRlbSgpIHtcclxuICAgIHRoaXMuc3RhdHVzID0gU3RhdHVzLlBPU1RfUkVDX1NUT1A7XHJcbiAgICB0aGlzLnN0YXJ0U3RvcFNpZ25hbFN0YXRlID0gU3RhcnRTdG9wU2lnbmFsU3RhdGUuUE9TVFJFQ09SRElORztcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdG9wQWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5uZXh0QWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuXHJcbiAgICB0aGlzLnBvc3RSZWNUaW1lcklkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnBvc3RSZWNUaW1lclJ1bm5pbmcgPSBmYWxzZTtcclxuICAgICAgdGhpcy5zdGF0dXMgPSBTdGF0dXMuU1RPUFBJTkdfU1RPUDtcclxuICAgICAgdGhpcy5zdG9wUmVjb3JkaW5nKCk7XHJcbiAgICB9LCB0aGlzLnBvc3REZWxheSk7XHJcbiAgICB0aGlzLnBvc3RSZWNUaW1lclJ1bm5pbmcgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcGF1c2VJdGVtKCkge1xyXG4gICAgdGhpcy5zdGF0dXMgPSBTdGF0dXMuUE9TVF9SRUNfUEFVU0U7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMucGF1c2VBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5zdGFydFN0b3BTaWduYWxTdGF0ZSA9IFN0YXJ0U3RvcFNpZ25hbFN0YXRlLlBPU1RSRUNPUkRJTkc7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RvcEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMubmV4dEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMucGF1c2VBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG5cclxuICAgIHRoaXMucG9zdFJlY1RpbWVySWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMucG9zdFJlY1RpbWVyUnVubmluZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnN0YXR1cyA9IFN0YXR1cy5TVE9QUElOR19QQVVTRTtcclxuICAgICAgdGhpcy5zdG9wUmVjb3JkaW5nKCk7XHJcbiAgICB9LCB0aGlzLnBvc3REZWxheSk7XHJcbiAgICB0aGlzLnBvc3RSZWNUaW1lclJ1bm5pbmcgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgc3RvcFJlY29yZGluZygpIHtcclxuICAgIGlmICh0aGlzLm1heFJlY1RpbWVyUnVubmluZykge1xyXG4gICAgICBpZih0aGlzLm1heFJlY1RpbWVySWQpIHtcclxuICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMubWF4UmVjVGltZXJJZCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5tYXhSZWNUaW1lclJ1bm5pbmcgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmKHRoaXMuYWMpIHtcclxuICAgICAgdGhpcy5hYy5zdG9wKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdG9wUmVjb3JkaW5nTWF4UmVjKCl7XHJcbiAgICBpZih0aGlzLnBvc3RSZWNUaW1lclJ1bm5pbmcpe1xyXG4gICAgICBpZih0aGlzLnBvc3RSZWNUaW1lcklkKSB7XHJcbiAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnBvc3RSZWNUaW1lcklkKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnBvc3RSZWNUaW1lclJ1bm5pbmc9ZmFsc2U7XHJcbiAgICB9XHJcbiAgICB0aGlzLm1heFJlY1RpbWVyUnVubmluZyA9IGZhbHNlO1xyXG4gICAgdGhpcy5zdGF0dXMgPSBTdGF0dXMuU1RPUFBJTkdfU1RPUDtcclxuICAgIGlmKHRoaXMuYWMpIHtcclxuICAgICAgdGhpcy5hYy5zdG9wKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRSZWNvcmRpbmdGaWxlQnlEZXNjcmlwdG9yKHJmZDpSZWNvcmRpbmdGaWxlRGVzY3JpcHRvckltcGwpe1xyXG4gICAgaWYocmZkLnJlY29yZGluZyAmJiByZmQucmVjb3JkaW5nLml0ZW1jb2RlKSB7XHJcbiAgICAgIGxldCBwcklkeCA9IHRoaXMucHJvbXB0SW5kZXhCeUl0ZW1jb2RlKHJmZC5yZWNvcmRpbmcuaXRlbWNvZGUpO1xyXG4gICAgICBpZiAodGhpcy5pdGVtcyE9bnVsbCAmJiBwcklkeCAhPT0gbnVsbCkge1xyXG4gICAgICAgIGxldCBpdCA9IHRoaXMuaXRlbXNbcHJJZHhdO1xyXG4gICAgICAgIGlmIChpdCAmJiB0aGlzLl9zZXNzaW9uKSB7XHJcbiAgICAgICAgICBpZiAoIWl0LnJlY3MpIHtcclxuICAgICAgICAgICAgaXQucmVjcyA9IG5ldyBBcnJheTxTcHJSZWNvcmRpbmdGaWxlPigpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbGV0IHJmID0gbmV3IFNwclJlY29yZGluZ0ZpbGUodGhpcy5fc2Vzc2lvbi5zZXNzaW9uSWQsIHJmZC5yZWNvcmRpbmcuaXRlbWNvZGUsIHJmZC52ZXJzaW9uLCBudWxsKTtcclxuICAgICAgICAgIGl0LnJlY3NbcmZkLnZlcnNpb25dID0gcmY7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJXQVJOOiBObyByZWNvcmRpbmcgaXRlbSB3aXRoIGNvZGU6IFxcXCJcIiArcmZkLnJlY29yZGluZy5pdGVtY29kZSsgXCJcXFwiIGZvdW5kLlwiKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiV0FSTjogTm8gcmVjb3JkaW5nIGl0ZW0gd2l0aCBjb2RlOiBcXFwiXCIgK3JmZC5yZWNvcmRpbmcuaXRlbWNvZGUrIFwiXFxcIiBmb3VuZC5cIik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZFJlY29yZGluZ0ZpbGVCeVByb21wdEluZGV4KHByb21wdEluZGV4Om51bWJlciwgcmY6U3ByUmVjb3JkaW5nRmlsZSl7XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIHN0b3BwZWQoKSB7XHJcbiAgICB0aGlzLnVwZGF0ZVN0YXJ0QWN0aW9uRGlzYWJsZVN0YXRlKClcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdG9wQWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5uZXh0QWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5wYXVzZUFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZSA9ICdpbmZvJztcclxuICAgIHRoaXMuc3RhdHVzTXNnID0gJ1JlY29yZGVkLic7XHJcbiAgICB0aGlzLnN0YXJ0U3RvcFNpZ25hbFN0YXRlID0gU3RhcnRTdG9wU2lnbmFsU3RhdGUuSURMRTtcclxuXHJcbiAgICBsZXQgYWQ6QXVkaW9CdWZmZXJ8bnVsbCA9IG51bGw7XHJcbiAgICBpZih0aGlzLmFjIT1udWxsKXtcclxuICAgICAgYWQ9dGhpcy5hYy5hdWRpb0J1ZmZlcigpO1xyXG4gICAgfVxyXG4gICAgbGV0IGljID0gdGhpcy5wcm9tcHRJdGVtLml0ZW1jb2RlO1xyXG4gICAgbGV0IHJmPW51bGw7XHJcbiAgICBpZiAodGhpcy5fc2Vzc2lvbiAmJiBpYykge1xyXG4gICAgICBsZXQgc2Vzc0lkOiBzdHJpbmcgfCBudW1iZXIgPSB0aGlzLl9zZXNzaW9uLnNlc3Npb25JZDtcclxuICAgICAgbGV0IGNwSWR4ID0gdGhpcy5wcm9tcHRJbmRleDtcclxuICAgICAgaWYgKHRoaXMuaXRlbXMpIHtcclxuICAgICAgICBsZXQgaXQ9dGhpcy5pdGVtc1tjcElkeF07XHJcbiAgICAgICAgaWYgKCFpdC5yZWNzKSB7XHJcbiAgICAgICAgICBpdC5yZWNzID0gbmV3IEFycmF5PFNwclJlY29yZGluZ0ZpbGU+KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJmID0gbmV3IFNwclJlY29yZGluZ0ZpbGUoc2Vzc0lkLCBpYywgaXQucmVjcy5sZW5ndGgsIGFkKTtcclxuICAgICAgICBpdC5yZWNzLnB1c2gocmYpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLmVuYWJsZVVwbG9hZFJlY29yZGluZ3MgJiYgIXRoaXMudXBsb2FkQ2h1bmtTaXplU2Vjb25kcykge1xyXG4gICAgICAgIC8vIFRPRE8gdXNlIFNwZWVjaFJlY29yZGVyY29uZmlnIHJlc3AuIFJlY2ZpbGVTZXJ2aWNlXHJcbiAgICAgICAgLy8gY29udmVydCBhc3luY2hyb25vdXNseSB0byAxNi1iaXQgaW50ZWdlciBQQ01cclxuICAgICAgICAvLyBUT0RPIGNvdWxkIHdlIGF2b2lkIGNvbnZlcnNpb24gdG8gc2F2ZSBDUFUgcmVzb3VyY2VzIGFuZCB0cmFuc2ZlciBmbG9hdCBQQ00gZGlyZWN0bHk/XHJcbiAgICAgICAgLy8gVE9ETyBkdXBsaWNhdGUgY29udmVyc2lvbiBmb3IgbWFudWFsIGRvd25sb2FkXHJcbiAgICAgICAgLy9jb25zb2xlLmxvZyhcIkJ1aWxkIHdhdiB3cml0ZXIuLi5cIik7XHJcbiAgICAgICAgdGhpcy5wcm9jZXNzaW5nUmVjb3JkaW5nPXRydWVcclxuICAgICAgICBpZihhZCAmJiByZikge1xyXG4gICAgICAgICAgbGV0IHd3ID0gbmV3IFdhdldyaXRlcigpO1xyXG4gICAgICAgICAgLy9uZXcgUkVTVCBBUEkgVVJMXHJcbiAgICAgICAgICBsZXQgYXBpRW5kUG9pbnQgPSAnJztcclxuICAgICAgICAgIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5hcGlFbmRQb2ludCkge1xyXG4gICAgICAgICAgICBhcGlFbmRQb2ludCA9IHRoaXMuY29uZmlnLmFwaUVuZFBvaW50O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGFwaUVuZFBvaW50ICE9PSAnJykge1xyXG4gICAgICAgICAgICBhcGlFbmRQb2ludCA9IGFwaUVuZFBvaW50ICsgJy8nXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBsZXQgc2Vzc2lvbnNVcmwgPSBhcGlFbmRQb2ludCArIFNlc3Npb25TZXJ2aWNlLlNFU1NJT05fQVBJX0NUWDtcclxuICAgICAgICAgIGxldCByZWNVcmw6IHN0cmluZyA9IHNlc3Npb25zVXJsICsgJy8nICsgcmYuc2Vzc2lvbiArICcvJyArIFJFQ0ZJTEVfQVBJX0NUWCArICcvJyArIHJmLml0ZW1Db2RlO1xyXG4gICAgICAgICAgd3cud3JpdGVBc3luYyhhZCwgKHdhdkZpbGUpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5wb3N0UmVjb3JkaW5nKHdhdkZpbGUsIHJlY1VybCk7XHJcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc2luZ1JlY29yZGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlV2FrZUxvY2soKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGNoZWNrIGNvbXBsZXRlIHNlc3Npb25cclxuICAgIGxldCBjb21wbGV0ZSA9IHRydWU7XHJcbiAgICBpZih0aGlzLml0ZW1zKSB7XHJcbiAgICAgIC8vIHNlYXJjaCBiYWNrd2FyZHMsIHRvIGdhaW4gZmFzdGVyIGRldGVjdGlvbiBvZiBpbmNvbXBsZXRlIHN0YXRlXHJcbiAgICAgIGZvciAobGV0IHJpID0gdGhpcy5pdGVtcy5sZW5ndGggLSAxOyByaSA+PSAwOyByaS0tKSB7XHJcbiAgICAgICAgbGV0IGl0ID0gdGhpcy5pdGVtc1tyaV07XHJcbiAgICAgICAgaWYgKGl0LnJlY29yZGluZyAmJiAhaXQudHJhaW5pbmcgJiYgKCFpdC5yZWNzIHx8IGl0LnJlY3MubGVuZ3RoID09IDApKSB7XHJcbiAgICAgICAgICBjb21wbGV0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGF1dG9TdGFydCA9ICh0aGlzLnN0YXR1cyA9PT0gU3RhdHVzLlNUT1BQSU5HX1NUT1ApO1xyXG4gICAgdGhpcy5zdGF0dXMgPSBTdGF0dXMuSURMRTtcclxuICAgIGxldCBzdGFydE5leHQ9ZmFsc2U7XHJcbiAgICBpZiAoY29tcGxldGUpIHtcclxuICAgICAgaWYodGhpcy5fc2Vzc2lvbiE9bnVsbCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fc2Vzc2lvbi5zZWFsZWQgJiYgdGhpcy5fc2Vzc2lvbi5zdGF0dXMgIT09IFwiQ09NUExFVEVEXCIpIHtcclxuICAgICAgICAgIGxldCBib2R5OiBhbnkgPSB7fVxyXG4gICAgICAgICAgdGhpcy5fc2Vzc2lvbi5zdGF0dXMgPSBcIkNPTVBMRVRFRFwiO1xyXG4gICAgICAgICAgYm9keS5zdGF0dXMgPSB0aGlzLl9zZXNzaW9uLnN0YXR1cztcclxuICAgICAgICAgIGlmICghdGhpcy5fc2Vzc2lvbi5jb21wbGV0ZWREYXRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Nlc3Npb24uY29tcGxldGVkRGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgIGJvZHkuY29tcGxldGVkRGF0ZSA9IHRoaXMuX3Nlc3Npb24uY29tcGxldGVkRGF0ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuc2Vzc2lvblNlcnZpY2UucGF0Y2hTZXNzaW9uT2JzZXJ2ZXIodGhpcy5fc2Vzc2lvbiwgYm9keSkuc3Vic2NyaWJlKClcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zdGF0dXNNc2cgPSAnU2Vzc2lvbiBjb21wbGV0ZSEnO1xyXG4gICAgICB0aGlzLnVwZGF0ZVdha2VMb2NrKCk7XHJcbiAgICAgIGxldCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKFNlc3Npb25GaW5pc2hlZERpYWxvZywge30pO1xyXG5cclxuICAgICAgLy8gZW5hYmxlIG5hdmlnYXRpb25cclxuICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLmZ3ZEFjdGlvbi5kaXNhYmxlZCA9IGZhbHNlXHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5id2RBY3Rpb24uZGlzYWJsZWQgPSBmYWxzZVxyXG5cclxuICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICBpZiAodGhpcy5zZWN0aW9uLm1vZGUgPT09ICdBVVRPUFJPR1JFU1MnIHx8IHRoaXMuc2VjdGlvbi5tb2RlID09PSAnQVVUT1JFQ09SRElORycpIHtcclxuICAgICAgICB0aGlzLm5leHRJdGVtKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLnNlY3Rpb24ubW9kZSA9PT0gJ0FVVE9SRUNPUkRJTkcnICYmIHRoaXMuYXV0b3JlY29yZGluZyAmJiBhdXRvU3RhcnQpIHtcclxuICAgICAgICBzdGFydE5leHQ9dHJ1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLm5hdmlnYXRpb25EaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlTmF2aWdhdGlvbkFjdGlvbnMoKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVdha2VMb2NrKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGFwcGx5IHJlY29yZGVkIGl0ZW1cclxuICAgIHRoaXMuYXBwbHlJdGVtKHN0YXJ0TmV4dCk7XHJcbiAgICBpZihzdGFydE5leHQpe1xyXG4gICAgICB0aGlzLnN0YXJ0SXRlbSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBwb3N0Q2h1bmtBdWRpb0J1ZmZlcihhdWRpb0J1ZmZlcjogQXVkaW9CdWZmZXIsIGNodW5rSWR4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMucHJvY2Vzc2luZ1JlY29yZGluZyA9IHRydWU7XHJcbiAgICBsZXQgd3cgPSBuZXcgV2F2V3JpdGVyKCk7XHJcbiAgICAvL25ldyBSRVNUIEFQSSBVUkxcclxuICAgIGxldCBhcGlFbmRQb2ludCA9ICcnO1xyXG4gICAgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmFwaUVuZFBvaW50KSB7XHJcbiAgICAgIGFwaUVuZFBvaW50ID0gdGhpcy5jb25maWcuYXBpRW5kUG9pbnQ7XHJcbiAgICB9XHJcbiAgICBpZiAoYXBpRW5kUG9pbnQgIT09ICcnKSB7XHJcbiAgICAgIGFwaUVuZFBvaW50ID0gYXBpRW5kUG9pbnQgKyAnLydcclxuICAgIH1cclxuICAgIGxldCBzZXNzaW9uc1VybCA9IGFwaUVuZFBvaW50ICsgU2Vzc2lvblNlcnZpY2UuU0VTU0lPTl9BUElfQ1RYO1xyXG4gICAgbGV0IHJlY1VybDogc3RyaW5nID0gc2Vzc2lvbnNVcmwgKyAnLycgKyB0aGlzLnNlc3Npb24/LnNlc3Npb25JZCArICcvJyArIFJFQ0ZJTEVfQVBJX0NUWCArICcvJyArIHRoaXMucHJvbXB0SXRlbS5pdGVtY29kZSsnLycrdGhpcy5yZlV1aWQrJy8nK2NodW5rSWR4O1xyXG4gICAgd3cud3JpdGVBc3luYyhhdWRpb0J1ZmZlciwgKHdhdkZpbGUpID0+IHtcclxuICAgICAgdGhpcy5wb3N0UmVjb3JkaW5nKHdhdkZpbGUsIHJlY1VybCk7XHJcbiAgICAgIHRoaXMucHJvY2Vzc2luZ1JlY29yZGluZyA9IGZhbHNlXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuICBwb3N0UmVjb3JkaW5nKHdhdkZpbGU6IFVpbnQ4QXJyYXksIHJlY1VybDogc3RyaW5nKSB7XHJcbiAgICBsZXQgd2F2QmxvYiA9IG5ldyBCbG9iKFt3YXZGaWxlXSwge3R5cGU6ICdhdWRpby93YXYnfSk7XHJcbiAgICBsZXQgdWwgPSBuZXcgVXBsb2FkKHdhdkJsb2IsIHJlY1VybCk7XHJcbiAgICB0aGlzLnVwbG9hZGVyLnF1ZXVlVXBsb2FkKHVsKTtcclxuICB9XHJcblxyXG4gIHN0b3AoKSB7XHJcbiAgICBpZih0aGlzLmFjIT1udWxsKXtcclxuICAgICAgdGhpcy5hYy5jbG9zZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVDb250cm9sUGxheWJhY2tQb3NpdGlvbigpIHtcclxuICAgIGlmICh0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIgJiYgdGhpcy5fY29udHJvbEF1ZGlvUGxheWVyLnBsYXlQb3NpdGlvbkZyYW1lcykge1xyXG4gICAgICB0aGlzLnByb21wdGluZy5hdWRpb0Rpc3BsYXkucGxheUZyYW1lUG9zaXRpb24gPSB0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIucGxheVBvc2l0aW9uRnJhbWVzO1xyXG4gICAgICB0aGlzLmxpdmVMZXZlbERpc3BsYXkucGxheUZyYW1lUG9zaXRpb24gPSB0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIucGxheVBvc2l0aW9uRnJhbWVzO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXVkaW9QbGF5ZXJVcGRhdGUoZTogQXVkaW9QbGF5ZXJFdmVudCkge1xyXG4gICAgaWYgKEV2ZW50VHlwZS5SRUFEWSA9PT0gZS50eXBlKSB7XHJcblxyXG4gICAgfSBlbHNlIGlmIChFdmVudFR5cGUuU1RBUlRFRCA9PT0gZS50eXBlKSB7XHJcbiAgICAgIC8vdGhpcy5zdGF0dXMgPSAnUGxheWJhY2suLi4nO1xyXG4gICAgICB0aGlzLnVwZGF0ZVRpbWVySWQgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy51cGRhdGVDb250cm9sUGxheWJhY2tQb3NpdGlvbigpLCA1MCk7XHJcblxyXG4gICAgfSBlbHNlIGlmIChFdmVudFR5cGUuRU5ERUQgPT09IGUudHlwZSkge1xyXG4gICAgICAvLy5zdGF0dXM9J1JlYWR5Lic7XHJcbiAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMudXBkYXRlVGltZXJJZCk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGlmKCF0aGlzLmRlc3Ryb3llZCkge1xyXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG5cclxuICB9XHJcbn1cclxuXHJcbiJdfQ==
|