@cqa-lib/cqa-ui 1.1.196 → 1.1.197
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/execution-screen/ai-action-step/ai-action-step.component.mjs +14 -3
- package/esm2020/lib/execution-screen/ai-agent-step/ai-agent-step.component.mjs +14 -3
- package/esm2020/lib/execution-screen/api-step/api-step.component.mjs +14 -3
- package/esm2020/lib/execution-screen/basic-step/basic-step.component.mjs +18 -3
- package/esm2020/lib/execution-screen/condition-step/condition-step.component.mjs +18 -3
- package/esm2020/lib/execution-screen/db-verification-step/db-verification-step.component.mjs +14 -3
- package/esm2020/lib/execution-screen/document-verification-step/document-verification-step.component.mjs +15 -4
- package/esm2020/lib/execution-screen/file-download-step/file-download-step.component.mjs +14 -3
- package/esm2020/lib/execution-screen/live-execution-step/live-execution-step.component.mjs +15 -4
- package/esm2020/lib/execution-screen/loop-step/loop-step.component.mjs +18 -3
- package/esm2020/lib/execution-screen/step-group/step-group.component.mjs +18 -3
- package/esm2020/lib/execution-screen/step-renderer/step-renderer.component.mjs +47 -2
- package/fesm2015/cqa-lib-cqa-ui.mjs +206 -23
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +205 -23
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/execution-screen/ai-action-step/ai-action-step.component.d.ts +4 -1
- package/lib/execution-screen/ai-agent-step/ai-agent-step.component.d.ts +4 -1
- package/lib/execution-screen/api-step/api-step.component.d.ts +4 -1
- package/lib/execution-screen/basic-step/basic-step.component.d.ts +6 -1
- package/lib/execution-screen/condition-step/condition-step.component.d.ts +6 -1
- package/lib/execution-screen/db-verification-step/db-verification-step.component.d.ts +4 -1
- package/lib/execution-screen/document-verification-step/document-verification-step.component.d.ts +5 -2
- package/lib/execution-screen/file-download-step/file-download-step.component.d.ts +4 -1
- package/lib/execution-screen/live-execution-step/live-execution-step.component.d.ts +5 -2
- package/lib/execution-screen/loop-step/loop-step.component.d.ts +6 -1
- package/lib/execution-screen/step-group/step-group.component.d.ts +6 -1
- package/lib/execution-screen/step-renderer/step-renderer.component.d.ts +4 -1
- package/package.json +1 -1
|
@@ -12,6 +12,7 @@ export class StepRendererComponent {
|
|
|
12
12
|
this.cdr = cdr;
|
|
13
13
|
this.downloadingStepId = null;
|
|
14
14
|
this.isLive = false;
|
|
15
|
+
this.isDebug = false;
|
|
15
16
|
this.componentReady = new EventEmitter(); // Emit when component is loaded and ready
|
|
16
17
|
this.lastStepId = null;
|
|
17
18
|
this.lastStepType = null;
|
|
@@ -313,6 +314,18 @@ export class StepRendererComponent {
|
|
|
313
314
|
}
|
|
314
315
|
}
|
|
315
316
|
});
|
|
317
|
+
// Update isDebug and debugPointSet from step-renderer inputs (parent may have updated after toggle)
|
|
318
|
+
if (this.isDebug !== undefined && instance.isDebug !== this.isDebug) {
|
|
319
|
+
instance.isDebug = this.isDebug;
|
|
320
|
+
hasChanges = true;
|
|
321
|
+
}
|
|
322
|
+
if (this.getDebugPointSetHandler && currentStep) {
|
|
323
|
+
const nextDebugPointSet = this.getDebugPointSetHandler(currentStep);
|
|
324
|
+
if (instance.debugPointSet !== nextDebugPointSet) {
|
|
325
|
+
instance.debugPointSet = nextDebugPointSet;
|
|
326
|
+
hasChanges = true;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
316
329
|
// Also update all other properties
|
|
317
330
|
Object.keys(currentStep).forEach(key => {
|
|
318
331
|
if (key !== 'type' && !importantProperties.includes(key)) {
|
|
@@ -1010,6 +1023,20 @@ export class StepRendererComponent {
|
|
|
1010
1023
|
});
|
|
1011
1024
|
}
|
|
1012
1025
|
}
|
|
1026
|
+
// Wire up debug point toggle for any step that supports it (when isDebug is true)
|
|
1027
|
+
if (this.isDebug && instance.debugPointChange && this.onDebugPointChangeHandler) {
|
|
1028
|
+
let subscribedEvents = StepRendererComponent.subscribedEventEmitters.get(instance);
|
|
1029
|
+
if (!subscribedEvents) {
|
|
1030
|
+
subscribedEvents = new Set();
|
|
1031
|
+
StepRendererComponent.subscribedEventEmitters.set(instance, subscribedEvents);
|
|
1032
|
+
}
|
|
1033
|
+
if (!subscribedEvents.has('debugPointChange')) {
|
|
1034
|
+
instance.debugPointChange.subscribe((value) => {
|
|
1035
|
+
this.onDebugPointChangeHandler?.(this.step, value);
|
|
1036
|
+
});
|
|
1037
|
+
subscribedEvents.add('debugPointChange');
|
|
1038
|
+
}
|
|
1039
|
+
}
|
|
1013
1040
|
// Special handling for condition-step: wire up onExpand event
|
|
1014
1041
|
if (this.step.type === 'condition') {
|
|
1015
1042
|
if (instance.onExpand && this.onExpandHandler) {
|
|
@@ -1089,6 +1116,10 @@ export class StepRendererComponent {
|
|
|
1089
1116
|
instance.onTextCopiedHandler = this.onTextCopiedHandler;
|
|
1090
1117
|
if (this.jumpToTimestampHandler)
|
|
1091
1118
|
instance.jumpToTimestampHandler = this.jumpToTimestampHandler;
|
|
1119
|
+
if (this.getDebugPointSetHandler)
|
|
1120
|
+
instance.getDebugPointSetHandler = this.getDebugPointSetHandler;
|
|
1121
|
+
if (this.onDebugPointChangeHandler)
|
|
1122
|
+
instance.onDebugPointChangeHandler = this.onDebugPointChangeHandler;
|
|
1092
1123
|
if (this.isUploadingBaseline !== undefined)
|
|
1093
1124
|
instance.isUploadingBaseline = this.isUploadingBaseline;
|
|
1094
1125
|
if (this.isMakingCurrentBaseline !== undefined)
|
|
@@ -1097,6 +1128,14 @@ export class StepRendererComponent {
|
|
|
1097
1128
|
instance.selectedIterationId = this.selectedIterationId;
|
|
1098
1129
|
if (this.isLive !== undefined)
|
|
1099
1130
|
instance.isLive = this.isLive;
|
|
1131
|
+
if (this.isDebug !== undefined)
|
|
1132
|
+
instance.isDebug = this.isDebug;
|
|
1133
|
+
if (this.getDebugPointSetHandler && this.step) {
|
|
1134
|
+
instance.debugPointSet = this.getDebugPointSetHandler(this.step);
|
|
1135
|
+
}
|
|
1136
|
+
else {
|
|
1137
|
+
instance.debugPointSet = false;
|
|
1138
|
+
}
|
|
1100
1139
|
// Pass stepNumber input if provided, otherwise use step's stepNumber
|
|
1101
1140
|
if (this.stepNumber !== undefined) {
|
|
1102
1141
|
instance.stepNumber = this.stepNumber;
|
|
@@ -1279,7 +1318,7 @@ StepRendererComponent.componentInstances = new WeakMap();
|
|
|
1279
1318
|
StepRendererComponent.componentRefs = new WeakMap();
|
|
1280
1319
|
StepRendererComponent.subscribedEventEmitters = new WeakMap(); // Track which EventEmitters have been subscribed to
|
|
1281
1320
|
StepRendererComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepRendererComponent, deps: [{ token: STEP_COMPONENT_MAP }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
1282
|
-
StepRendererComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepRendererComponent, selector: "cqa-step-renderer", inputs: { step: "step", onExpandHandler: "onExpandHandler", getConditionBranchesHandler: "getConditionBranchesHandler", isStepLoadingHandler: "isStepLoadingHandler", isStepExpandedHandler: "isStepExpandedHandler", convertMsToSecondsHandler: "convertMsToSecondsHandler", formatFailureDetailsHandler: "formatFailureDetailsHandler", getSelfHealAnalysisHandler: "getSelfHealAnalysisHandler", onMakeCurrentBaselineHandler: "onMakeCurrentBaselineHandler", onUploadBaselineHandler: "onUploadBaselineHandler", onAnalyzeHandler: "onAnalyzeHandler", onViewFullLogsHandler: "onViewFullLogsHandler", onSelfHealActionHandler: "onSelfHealActionHandler", getSelfHealLoadingStatesHandler: "getSelfHealLoadingStatesHandler", isUploadingBaseline: "isUploadingBaseline", isMakingCurrentBaseline: "isMakingCurrentBaseline", selectedIterationId: "selectedIterationId", getLoopIterationsHandler: "getLoopIterationsHandler", getApiAssertionsHandler: "getApiAssertionsHandler", formatActionsHandler: "formatActionsHandler", onViewAllIterationsHandler: "onViewAllIterationsHandler", onConditionBranchClickHandler: "onConditionBranchClickHandler", onStepClickHandler: "onStepClickHandler", onJsonPathCopiedHandler: "onJsonPathCopiedHandler", onDownloadHandler: "onDownloadHandler", onFilePathCopiedHandler: "onFilePathCopiedHandler", onTextCopiedHandler: "onTextCopiedHandler", jumpToTimestampHandler: "jumpToTimestampHandler", downloadingStepId: "downloadingStepId", isLive: "isLive", stepNumber: "stepNumber" }, outputs: { componentReady: "componentReady" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, read: ViewContainerRef }], usesOnChanges: true, ngImport: i0, template: '<ng-container #container></ng-container>', isInline: true });
|
|
1321
|
+
StepRendererComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepRendererComponent, selector: "cqa-step-renderer", inputs: { step: "step", onExpandHandler: "onExpandHandler", getConditionBranchesHandler: "getConditionBranchesHandler", isStepLoadingHandler: "isStepLoadingHandler", isStepExpandedHandler: "isStepExpandedHandler", convertMsToSecondsHandler: "convertMsToSecondsHandler", formatFailureDetailsHandler: "formatFailureDetailsHandler", getSelfHealAnalysisHandler: "getSelfHealAnalysisHandler", onMakeCurrentBaselineHandler: "onMakeCurrentBaselineHandler", onUploadBaselineHandler: "onUploadBaselineHandler", onAnalyzeHandler: "onAnalyzeHandler", onViewFullLogsHandler: "onViewFullLogsHandler", onSelfHealActionHandler: "onSelfHealActionHandler", getSelfHealLoadingStatesHandler: "getSelfHealLoadingStatesHandler", isUploadingBaseline: "isUploadingBaseline", isMakingCurrentBaseline: "isMakingCurrentBaseline", selectedIterationId: "selectedIterationId", getLoopIterationsHandler: "getLoopIterationsHandler", getApiAssertionsHandler: "getApiAssertionsHandler", formatActionsHandler: "formatActionsHandler", onViewAllIterationsHandler: "onViewAllIterationsHandler", onConditionBranchClickHandler: "onConditionBranchClickHandler", onStepClickHandler: "onStepClickHandler", onJsonPathCopiedHandler: "onJsonPathCopiedHandler", onDownloadHandler: "onDownloadHandler", onFilePathCopiedHandler: "onFilePathCopiedHandler", onTextCopiedHandler: "onTextCopiedHandler", jumpToTimestampHandler: "jumpToTimestampHandler", downloadingStepId: "downloadingStepId", isLive: "isLive", isDebug: "isDebug", getDebugPointSetHandler: "getDebugPointSetHandler", onDebugPointChangeHandler: "onDebugPointChangeHandler", stepNumber: "stepNumber" }, outputs: { componentReady: "componentReady" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, read: ViewContainerRef }], usesOnChanges: true, ngImport: i0, template: '<ng-container #container></ng-container>', isInline: true });
|
|
1283
1322
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepRendererComponent, decorators: [{
|
|
1284
1323
|
type: Component,
|
|
1285
1324
|
args: [{
|
|
@@ -1352,9 +1391,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
1352
1391
|
args: ['container', { read: ViewContainerRef }]
|
|
1353
1392
|
}], isLive: [{
|
|
1354
1393
|
type: Input
|
|
1394
|
+
}], isDebug: [{
|
|
1395
|
+
type: Input
|
|
1396
|
+
}], getDebugPointSetHandler: [{
|
|
1397
|
+
type: Input
|
|
1398
|
+
}], onDebugPointChangeHandler: [{
|
|
1399
|
+
type: Input
|
|
1355
1400
|
}], stepNumber: [{
|
|
1356
1401
|
type: Input
|
|
1357
1402
|
}], componentReady: [{
|
|
1358
1403
|
type: Output
|
|
1359
1404
|
}] } });
|
|
1360
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1yZW5kZXJlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2V4ZWN1dGlvbi1zY3JlZW4vc3RlcC1yZW5kZXJlci9zdGVwLXJlbmRlcmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBMEQsTUFBTSxFQUFFLGlCQUFpQixFQUFnQixZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbk4sT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7O0FBRTVEOzs7O0dBSUc7QUFLSCxNQUFNLE9BQU8scUJBQXFCO0lBbURoQyxZQUNzQyxZQUFvQyxFQUNoRSxHQUFzQjtRQURNLGlCQUFZLEdBQVosWUFBWSxDQUF3QjtRQUNoRSxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQXhCdkIsc0JBQWlCLEdBQWtCLElBQUksQ0FBQztRQUV4QyxXQUFNLEdBQVksS0FBSyxDQUFDO1FBRXZCLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQyxDQUFDLDBDQUEwQztRQWN2RixlQUFVLEdBQTJCLElBQUksQ0FBQztRQUMxQyxpQkFBWSxHQUFrQixJQUFJLENBQUM7UUFDbkMsb0JBQWUsR0FBVyxFQUFFLENBQUM7SUFLakMsQ0FBQztJQW5CTCxxR0FBcUc7SUFDN0Ysb0JBQW9CLENBQUMsSUFBNEM7UUFDdkUsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNyQixNQUFNLENBQUMsR0FBSSxJQUFZLENBQUMsWUFBWSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxLQUFLLGtCQUFrQjtZQUFFLE9BQU8sZUFBZSxDQUFDO1FBQ3JELE9BQVEsSUFBWSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7SUFDbEMsQ0FBQztJQWVE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dCwgRXZlbnRFbWl0dGVyLCBWaWV3Q2hpbGQsIFZpZXdDb250YWluZXJSZWYsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgVHlwZSwgQWZ0ZXJWaWV3SW5pdCwgRG9DaGVjaywgSW5qZWN0LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50UmVmLCBTaW1wbGVDaGFuZ2UgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEV4ZWN1dGlvblN0ZXBDb25maWcgfSBmcm9tICcuLi9leGVjdXRpb24tc3RlcC5tb2RlbHMnO1xuaW1wb3J0IHsgU1RFUF9DT01QT05FTlRfTUFQIH0gZnJvbSAnLi4vc3RlcC1yZWdpc3RyeS50b2tlbic7XG5cbi8qKlxuICogQ29tcG9uZW50IHRoYXQgcmVuZGVycyB0aGUgYXBwcm9wcmlhdGUgc3RlcCBjb21wb25lbnQgYmFzZWQgb24gdGhlIHN0ZXAgdHlwZS5cbiAqIFVzZXMgZHluYW1pYyBjb21wb25lbnQgbG9hZGluZyBhbmQgYW4gaW5qZWN0aW9uIHRva2VuIHRvIGJyZWFrIGNpcmN1bGFyIGRlcGVuZGVuY2llc1xuICogYmV0d2VlbiBzdGVwIGNvbXBvbmVudHMgaW4gQW5ndWxhciBJdnkgcGFydGlhbCBjb21waWxhdGlvbiBtb2RlLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtc3RlcC1yZW5kZXJlcicsXG4gIHRlbXBsYXRlOiAnPG5nLWNvbnRhaW5lciAjY29udGFpbmVyPjwvbmctY29udGFpbmVyPidcbn0pXG5leHBvcnQgY2xhc3MgU3RlcFJlbmRlcmVyQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBEb0NoZWNrIHtcbiAgQElucHV0KCkgc3RlcCE6IEV4ZWN1dGlvblN0ZXBDb25maWc7XG4gIEBJbnB1dCgpIG9uRXhwYW5kSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiB2b2lkO1xuICBASW5wdXQoKSBnZXRDb25kaXRpb25CcmFuY2hlc0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYW55O1xuICBASW5wdXQoKSBpc1N0ZXBMb2FkaW5nSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBib29sZWFuO1xuICBASW5wdXQoKSBpc1N0ZXBFeHBhbmRlZEhhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYm9vbGVhbjtcbiAgQElucHV0KCkgY29udmVydE1zVG9TZWNvbmRzSGFuZGxlcj86IChkdXJhdGlvbjogbnVtYmVyKSA9PiBudW1iZXI7XG4gIEBJbnB1dCgpIGZvcm1hdEZhaWx1cmVEZXRhaWxzSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBhbnk7XG4gIEBJbnB1dCgpIGdldFNlbGZIZWFsQW5hbHlzaXNIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGFueTtcbiAgQElucHV0KCkgb25NYWtlQ3VycmVudEJhc2VsaW5lSGFuZGxlcj86IChldmVudDogYW55KSA9PiB2b2lkO1xuICBASW5wdXQoKSBvblVwbG9hZEJhc2VsaW5lSGFuZGxlcj86IChldmVudDogYW55KSA9PiB2b2lkO1xuICBASW5wdXQoKSBvbkFuYWx5emVIYW5kbGVyPzogKCkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25WaWV3RnVsbExvZ3NIYW5kbGVyPzogKCkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25TZWxmSGVhbEFjdGlvbkhhbmRsZXI/OiAoZXZlbnQ6IGFueSkgPT4gdm9pZDtcbiAgQElucHV0KCkgZ2V0U2VsZkhlYWxMb2FkaW5nU3RhdGVzSGFuZGxlcj86ICgpID0+IHsgaXNMb2FkaW5nQWNjZXB0OiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfTsgaXNMb2FkaW5nTW9kaWZ5QWNjZXB0OiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSB9O1xuICBASW5wdXQoKSBpc1VwbG9hZGluZ0Jhc2VsaW5lPzogYW55O1xuICBASW5wdXQoKSBpc01ha2luZ0N1cnJlbnRCYXNlbGluZT86IGFueTtcbiAgQElucHV0KCkgc2VsZWN0ZWRJdGVyYXRpb25JZD86IGFueTtcbiAgQElucHV0KCkgZ2V0TG9vcEl0ZXJhdGlvbnNIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGFueVtdO1xuICBASW5wdXQoKSBnZXRBcGlBc3NlcnRpb25zSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBhbnlbXTtcbiAgQElucHV0KCkgZm9ybWF0QWN0aW9uc0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYW55W107XG4gIEBJbnB1dCgpIG9uVmlld0FsbEl0ZXJhdGlvbnNIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uQ29uZGl0aW9uQnJhbmNoQ2xpY2tIYW5kbGVyPzogKHN0ZXA6IGFueSwgYnJhbmNoOiBhbnkpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uU3RlcENsaWNrSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnLCBldmVudD86IEV2ZW50KSA9PiB2b2lkO1xuICBASW5wdXQoKSBvbkpzb25QYXRoQ29waWVkSGFuZGxlcj86IChldmVudDogeyBwYXRoOiBzdHJpbmc7IHNvdXJjZTogJ3JlcXVlc3RCb2R5JyB8ICdyZXNwb25zZUJvZHknIHwgJ3JlcXVlc3RIZWFkZXJzJyB8ICdyZXNwb25zZUhlYWRlcnMnIH0pID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uRG93bmxvYWRIYW5kbGVyPzogKGV2ZW50OiB7IGZpbGVOYW1lOiBzdHJpbmc7IGZpbGVQYXRoPzogc3RyaW5nOyBmaWxlVHlwZTogc3RyaW5nOyB0ZXN0U3RlcFJlc3VsdElkOiBzdHJpbmcgfSkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25GaWxlUGF0aENvcGllZEhhbmRsZXI/OiAoZXZlbnQ6IHsgZmlsZVBhdGg6IHN0cmluZzsgdGVzdFN0ZXBSZXN1bHRJZDogc3RyaW5nIH0pID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uVGV4dENvcGllZEhhbmRsZXI/OiAoZXZlbnQ6IHsgdGV4dDogc3RyaW5nOyB0ZXN0U3RlcFJlc3VsdElkOiBzdHJpbmcgfSkgPT4gdm9pZDtcbiAgQElucHV0KCkganVtcFRvVGltZXN0YW1wSGFuZGxlcj86ICh0aW1lc3RhbXA6IG51bWJlciwgdGVzdFN0ZXBJZD86IG51bWJlciB8IHN0cmluZykgPT4gdm9pZDtcbiAgQElucHV0KCkgZG93bmxvYWRpbmdTdGVwSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBAVmlld0NoaWxkKCdjb250YWluZXInLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSkgY29udGFpbmVyITogVmlld0NvbnRhaW5lclJlZjtcbiAgQElucHV0KCkgaXNMaXZlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHN0ZXBOdW1iZXI/OiBzdHJpbmc7XG4gIEBPdXRwdXQoKSBjb21wb25lbnRSZWFkeSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTsgLy8gRW1pdCB3aGVuIGNvbXBvbmVudCBpcyBsb2FkZWQgYW5kIHJlYWR5XG5cbiAgLyoqIEVmZmVjdGl2ZSB0eXBlIGZvciBjb21wb25lbnQgbG9va3VwOiAnZmlsZS1kb3dubG9hZCcgd2hlbiB0ZXN0U3RlcFR5cGUgPT09ICdnZW5lcmF0ZURvY3VtZW50Jy4gKi9cbiAgcHJpdmF0ZSBnZXRFZmZlY3RpdmVTdGVwVHlwZShzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgaWYgKCFzdGVwKSByZXR1cm4gJyc7XG4gICAgY29uc3QgdCA9IChzdGVwIGFzIGFueSkudGVzdFN0ZXBUeXBlO1xuICAgIGlmICh0ID09PSAnZ2VuZXJhdGVEb2N1bWVudCcpIHJldHVybiAnZmlsZS1kb3dubG9hZCc7XG4gICAgcmV0dXJuIChzdGVwIGFzIGFueSkudHlwZSB8fCAnJztcbiAgfVxuXG4gIC8vIFVzZSBXZWFrTWFwIHRvIHRyYWNrIGNvbXBvbmVudCBpbnN0YW5jZXMgd2l0aG91dCBzdG9yaW5nIHRoZW0gYXMgY2xhc3MgcHJvcGVydGllc1xuICBwcml2YXRlIHN0YXRpYyBjb21wb25lbnRJbnN0YW5jZXMgPSBuZXcgV2Vha01hcDxWaWV3Q29udGFpbmVyUmVmLCBhbnk+KCk7XG4gIHByaXZhdGUgc3RhdGljIGNvbXBvbmVudFJlZnMgPSBuZXcgV2Vha01hcDxWaWV3Q29udGFpbmVyUmVmLCBDb21wb25lbnRSZWY8YW55Pj4oKTtcbiAgcHJpdmF0ZSBzdGF0aWMgc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMgPSBuZXcgV2Vha01hcDxhbnksIFNldDxzdHJpbmc+PigpOyAvLyBUcmFjayB3aGljaCBFdmVudEVtaXR0ZXJzIGhhdmUgYmVlbiBzdWJzY3JpYmVkIHRvXG4gIHByaXZhdGUgbGFzdFN0ZXBJZDogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbGFzdFN0ZXBUeXBlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwcmV2aW91c1N0ZXBLZXk6IHN0cmluZyA9ICcnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoU1RFUF9DT01QT05FTlRfTUFQKSBwcml2YXRlIGNvbXBvbmVudE1hcDogTWFwPHN0cmluZywgVHlwZTxhbnk+PixcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7IH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbnRhaW5lciB8fCAhdGhpcy5zdGVwKSByZXR1cm47XG5cbiAgICBjb25zdCBjdXJyZW50U3RlcCA9IGNoYW5nZXNbJ3N0ZXAnXT8uY3VycmVudFZhbHVlIHx8IHRoaXMuc3RlcDtcbiAgICBjb25zdCBwcmV2aW91c1N0ZXAgPSBjaGFuZ2VzWydzdGVwJ10/LnByZXZpb3VzVmFsdWU7XG5cbiAgICAvLyBDaGVjayBpZiBzZWxlY3RlZEl0ZXJhdGlvbklkIGlucHV0IGNoYW5nZWQgKGZvciBsb29wIHN0ZXBzKVxuICAgIC8vICYmIFxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0ZXAudHlwZSA9PT0gJ2xvb3AnICYmIFxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIubGVuZ3RoID4gMDtcblxuICAgIC8vIElmIHNlbGVjdGVkSXRlcmF0aW9uSWQgY2hhbmdlZCBmb3IgYSBsb29wIHN0ZXAsIHVwZGF0ZSBpdCBkaXJlY3RseVxuICAgIGlmIChjaGFuZ2VzWydzZWxlY3RlZEl0ZXJhdGlvbklkJ10gJiYgY2hhbmdlc1snc2VsZWN0ZWRJdGVyYXRpb25JZCddLmN1cnJlbnRWYWx1ZSAhPT0gY2hhbmdlc1snc2VsZWN0ZWRJdGVyYXRpb25JZCddLnByZXZpb3VzVmFsdWUpIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlcy5nZXQodGhpcy5jb250YWluZXIpO1xuICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudFJlZnMuZ2V0KHRoaXMuY29udGFpbmVyKTtcblxuICAgICAgaWYgKGluc3RhbmNlICYmIGNvbXBvbmVudFJlZikge1xuICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBjaGFuZ2VzWydzZWxlY3RlZEl0ZXJhdGlvbklkJ10uY3VycmVudFZhbHVlO1xuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gY2hhbmdlc1snc2VsZWN0ZWRJdGVyYXRpb25JZCddLnByZXZpb3VzVmFsdWU7XG5cbiAgICAgICAgLy8gQWx3YXlzIHVwZGF0ZSBzZWxlY3RlZEl0ZXJhdGlvbklkIHdoZW4gaW5wdXQgY2hhbmdlcyBmcm9tIHBhcmVudFxuICAgICAgICBpZiAoY3VycmVudFZhbHVlICE9PSBwcmV2aW91c1ZhbHVlKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb25JZCA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuc2VsZWN0ZWRJdGVyYXRpb25JZCA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBUcnkgdG8gdXBkYXRlIHNlbGVjdGVkSXRlcmF0aW9uIGlmIGl0ZXJhdGlvbnMgYXJlIGF2YWlsYWJsZVxuICAgICAgICAgIHRoaXMudXBkYXRlTG9vcFN0ZXBTZWxlY3RlZEl0ZXJhdGlvbihpbnN0YW5jZSwgY3VycmVudFZhbHVlKTtcblxuICAgICAgICAgIC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiBvbiB0aGUgbG9vcC1zdGVwIGNvbXBvbmVudFxuICAgICAgICAgIGlmIChjb21wb25lbnRSZWYuaW5qZWN0b3IpIHtcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlQ2RyID0gY29tcG9uZW50UmVmLmluamVjdG9yLmdldChDaGFuZ2VEZXRlY3RvclJlZiwgbnVsbCk7XG4gICAgICAgICAgICBpZiAoaW5zdGFuY2VDZHIpIHtcbiAgICAgICAgICAgICAgaW5zdGFuY2VDZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICAgIGluc3RhbmNlQ2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBzdGVwTnVtYmVyIGlucHV0IGNoYW5nZWQsIHVwZGF0ZSBuZXN0ZWQgY29tcG9uZW50IGluc3RhbmNlc1xuICAgIGlmIChjaGFuZ2VzWydzdGVwTnVtYmVyJ10gJiYgY2hhbmdlc1snc3RlcE51bWJlciddLmN1cnJlbnRWYWx1ZSAhPT0gY2hhbmdlc1snc3RlcE51bWJlciddLnByZXZpb3VzVmFsdWUpIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlcy5nZXQodGhpcy5jb250YWluZXIpO1xuICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudFJlZnMuZ2V0KHRoaXMuY29udGFpbmVyKTtcblxuICAgICAgaWYgKGluc3RhbmNlICYmIGNvbXBvbmVudFJlZikge1xuICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBjaGFuZ2VzWydzdGVwTnVtYmVyJ10uY3VycmVudFZhbHVlO1xuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gY2hhbmdlc1snc3RlcE51bWJlciddLnByZXZpb3VzVmFsdWU7XG5cbiAgICAgICAgLy8gQWx3YXlzIHVwZGF0ZSBzdGVwTnVtYmVyIHdoZW4gaW5wdXQgY2hhbmdlcyBmcm9tIHBhcmVudFxuICAgICAgICBpZiAoY3VycmVudFZhbHVlICE9PSBwcmV2aW91c1ZhbHVlKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc3RlcE51bWJlciA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuc3RlcE51bWJlciA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBUcmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZVxuICAgICAgICAgIGlmIChjb21wb25lbnRSZWYuaW5qZWN0b3IpIHtcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlQ2RyID0gY29tcG9uZW50UmVmLmluamVjdG9yLmdldChDaGFuZ2VEZXRlY3RvclJlZiwgbnVsbCk7XG4gICAgICAgICAgICBpZiAoaW5zdGFuY2VDZHIpIHtcbiAgICAgICAgICAgICAgaW5zdGFuY2VDZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICAgIGluc3RhbmNlQ2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBpc1VwbG9hZGluZ0Jhc2VsaW5lIG9yIGlzTWFraW5nQ3VycmVudEJhc2VsaW5lIGNoYW5nZWQsIHVwZGF0ZSBuZXN0ZWQgY29tcG9uZW50IGluc3RhbmNlc1xuICAgIGlmIChjaGFuZ2VzWydpc1VwbG9hZGluZ0Jhc2VsaW5lJ10gfHwgY2hhbmdlc1snaXNNYWtpbmdDdXJyZW50QmFzZWxpbmUnXSkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzLmdldCh0aGlzLmNvbnRhaW5lcik7XG4gICAgICBjb25zdCBjb21wb25lbnRSZWYgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50UmVmcy5nZXQodGhpcy5jb250YWluZXIpO1xuXG4gICAgICBpZiAoaW5zdGFuY2UgJiYgY29tcG9uZW50UmVmKSB7XG4gICAgICAgIC8vIFVwZGF0ZSBpc1VwbG9hZGluZ0Jhc2VsaW5lIGlmIGl0IGNoYW5nZWRcbiAgICAgICAgaWYgKGNoYW5nZXNbJ2lzVXBsb2FkaW5nQmFzZWxpbmUnXSkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmlzVXBsb2FkaW5nQmFzZWxpbmUgPSB0aGlzLmlzVXBsb2FkaW5nQmFzZWxpbmU7XG4gICAgICAgICAgLy8gQWxzbyB1cGRhdGUgaW4gY29uZmlnIGlmIGl0IGV4aXN0c1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5pc1VwbG9hZGluZ0Jhc2VsaW5lID0gdGhpcy5pc1VwbG9hZGluZ0Jhc2VsaW5lO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBpc01ha2luZ0N1cnJlbnRCYXNlbGluZSBpZiBpdCBjaGFuZ2VkXG4gICAgICAgIGlmIChjaGFuZ2VzWydpc01ha2luZ0N1cnJlbnRCYXNlbGluZSddKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuaXNNYWtpbmdDdXJyZW50QmFzZWxpbmUgPSB0aGlzLmlzTWFraW5nQ3VycmVudEJhc2VsaW5lO1xuICAgICAgICAgIC8vIEFsc28gdXBkYXRlIGluIGNvbmZpZyBpZiBpdCBleGlzdHNcbiAgICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuaXNNYWtpbmdDdXJyZW50QmFzZWxpbmUgPSB0aGlzLmlzTWFraW5nQ3VycmVudEJhc2VsaW5lO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiBvbiB0aGUgY29tcG9uZW50IGluc3RhbmNlXG4gICAgICAgIGlmIChjb21wb25lbnRSZWYuaW5qZWN0b3IpIHtcbiAgICAgICAgICBjb25zdCBpbnN0YW5jZUNkciA9IGNvbXBvbmVudFJlZi5pbmplY3Rvci5nZXQoQ2hhbmdlRGV0ZWN0b3JSZWYsIG51bGwpO1xuICAgICAgICAgIGlmIChpbnN0YW5jZUNkcikge1xuICAgICAgICAgICAgaW5zdGFuY2VDZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICBpbnN0YW5jZUNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgZG93bmxvYWRpbmdTdGVwSWQgY2hhbmdlZCwgdXBkYXRlIGZpbGUtZG93bmxvYWQgaW5zdGFuY2UgaXNEb3dubG9hZGluZ1xuICAgIGlmIChjaGFuZ2VzWydkb3dubG9hZGluZ1N0ZXBJZCddKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMuZ2V0KHRoaXMuY29udGFpbmVyKTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRSZWZzLmdldCh0aGlzLmNvbnRhaW5lcik7XG4gICAgICBpZiAoaW5zdGFuY2UgJiYgY29tcG9uZW50UmVmICYmIHRoaXMuZ2V0RWZmZWN0aXZlU3RlcFR5cGUoY3VycmVudFN0ZXApID09PSAnZmlsZS1kb3dubG9hZCcpIHtcbiAgICAgICAgY29uc3QgdGlkID0gKGN1cnJlbnRTdGVwIGFzIGFueSkudGVzdFN0ZXBSZXN1bHRJZDtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuaXNEb3dubG9hZGluZyA9ICEhdGlkICYmIHRoaXMuZG93bmxvYWRpbmdTdGVwSWQgPT09IHRpZDtcbiAgICAgICAgaWYgKGNvbXBvbmVudFJlZi5pbmplY3Rvcikge1xuICAgICAgICAgIGNvbnN0IGluc3RhbmNlQ2RyID0gY29tcG9uZW50UmVmLmluamVjdG9yLmdldChDaGFuZ2VEZXRlY3RvclJlZiwgbnVsbCk7XG4gICAgICAgICAgaWYgKGluc3RhbmNlQ2RyKSB7XG4gICAgICAgICAgICBpbnN0YW5jZUNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIGluc3RhbmNlQ2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZXQgc3RlcCBpZGVudGlmaWVycyAodXNlIGVmZmVjdGl2ZSB0eXBlOiBnZW5lcmF0ZURvY3VtZW50IC0+IGZpbGUtZG93bmxvYWQpXG4gICAgY29uc3QgY3VycmVudFN0ZXBJZCA9IGN1cnJlbnRTdGVwLnRlc3RTdGVwUmVzdWx0SWQgfHwgY3VycmVudFN0ZXAuaWQ7XG4gICAgY29uc3QgY3VycmVudFN0ZXBUeXBlID0gdGhpcy5nZXRFZmZlY3RpdmVTdGVwVHlwZShjdXJyZW50U3RlcCkgfHwgKGN1cnJlbnRTdGVwIGFzIGFueSkudHlwZTtcblxuICAgIC8vIFVzZSBzdG9yZWQgbGFzdFN0ZXBJZCBhbmQgbGFzdFN0ZXBUeXBlIHRvIHByb3Blcmx5IGRldGVjdCBjaGFuZ2VzXG4gICAgLy8gVGhpcyBoYW5kbGVzIHRoZSBjYXNlIHdoZW4gc3RlcCBvYmplY3QgcmVmZXJlbmNlIGRvZXNuJ3QgY2hhbmdlIGJ1dCBwcm9wZXJ0aWVzIGRvXG4gICAgLy8gT25seSBjaGVjayBmb3IgYWN0dWFsIElEL3R5cGUgY2hhbmdlcywgbm90IGp1c3QgcmVmZXJlbmNlIGNoYW5nZXNcbiAgICAvLyBjb25zdCBzdGVwVHlwZUNoYW5nZWQgPSAhcHJldmlvdXNTdGVwIHx8IGN1cnJlbnRTdGVwVHlwZSAhPT0gKHByZXZpb3VzU3RlcC50eXBlIHx8IHRoaXMubGFzdFN0ZXBUeXBlKTtcbiAgICAvLyBjb25zdCBzdGVwSWRDaGFuZ2VkID0gIXByZXZpb3VzU3RlcCB8fCBjdXJyZW50U3RlcElkICE9PSAocHJldmlvdXNTdGVwLnRlc3RTdGVwUmVzdWx0SWQgfHwgcHJldmlvdXNTdGVwLmlkIHx8IHRoaXMubGFzdFN0ZXBJZCk7XG4gICAgY29uc3Qgc3RlcFR5cGVDaGFuZ2VkID0gY3VycmVudFN0ZXBUeXBlICE9PSB0aGlzLmxhc3RTdGVwVHlwZTtcbiAgICBjb25zdCBzdGVwSWRDaGFuZ2VkID0gY3VycmVudFN0ZXBJZCAhPT0gdGhpcy5sYXN0U3RlcElkO1xuICAgIFxuICAgIC8vIE9ubHkgbG9hZCBjb21wb25lbnQgaWYgc3RlcCBJRCBvciB0eXBlIGFjdHVhbGx5IGNoYW5nZWRcbiAgICAvLyBUaGlzIHByZXZlbnRzIHVubmVjZXNzYXJ5IHJlbG9hZHMgd2hlbiBvbmx5IG5lc3RlZCBwcm9wZXJ0aWVzIGNoYW5nZVxuICAgIGlmIChzdGVwVHlwZUNoYW5nZWQgfHwgc3RlcElkQ2hhbmdlZCkge1xuICAgICAgdGhpcy5sYXN0U3RlcElkID0gY3VycmVudFN0ZXBJZDtcbiAgICAgIHRoaXMubGFzdFN0ZXBUeXBlID0gY3VycmVudFN0ZXBUeXBlO1xuICAgICAgaWYgKHRoaXMuY29udGFpbmVyKSB7XG4gICAgICAgIHRoaXMubG9hZENvbXBvbmVudCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGV4cGFuZGVkIHN0YXRlIGNoYW5nZWQgKHVzaW5nIGhhbmRsZXIgaWYgYXZhaWxhYmxlLCBhcyBpdCBtYXkgZGVwZW5kIG9uIHBhcmVudCBzdGF0ZSlcbiAgICBsZXQgZXhwYW5kZWRDaGFuZ2VkID0gZmFsc2U7XG4gICAgaWYgKHByZXZpb3VzU3RlcCAmJiBjdXJyZW50U3RlcCkge1xuICAgICAgbGV0IGN1cnJlbnRFeHBhbmRlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICAgIGxldCBwcmV2aW91c0V4cGFuZGVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgICAgXG4gICAgICBpZiAodGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXIpIHtcbiAgICAgICAgY3VycmVudEV4cGFuZGVkID0gdGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXIoY3VycmVudFN0ZXApO1xuICAgICAgICBwcmV2aW91c0V4cGFuZGVkID0gdGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXIocHJldmlvdXNTdGVwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnJlbnRFeHBhbmRlZCA9IChjdXJyZW50U3RlcCBhcyBhbnkpLmV4cGFuZGVkO1xuICAgICAgICBwcmV2aW91c0V4cGFuZGVkID0gKHByZXZpb3VzU3RlcCBhcyBhbnkpLmV4cGFuZGVkO1xuICAgICAgfVxuICAgICAgXG4gICAgICBleHBhbmRlZENoYW5nZWQgPSBjdXJyZW50RXhwYW5kZWQgIT09IHByZXZpb3VzRXhwYW5kZWQ7XG4gICAgfVxuICAgIFxuICAgIC8vIElmIG9ubHkgbmVzdGVkIGRhdGEgY2hhbmdlZCAoY2hpbGRyZW4sIG5lc3RlZFN0ZXBzLCBzdGVwcywgZXhwYW5kZWQpLCBcbiAgICAvLyB1cGRhdGUgcHJvcGVydGllcyB3aXRob3V0IHJlY3JlYXRpbmcgY29tcG9uZW50IHRvIHByZXZlbnQgYmxpbmtpbmdcbiAgICAvLyBUaGlzIHByZXZlbnRzIHBhcmVudCBzdGVwcyBmcm9tIGJsaW5raW5nIHdoZW4gbmVzdGVkIHN0ZXBzIGV4cGFuZFxuICAgIGNvbnN0IG9ubHlOZXN0ZWREYXRhQ2hhbmdlZCA9IHByZXZpb3VzU3RlcCAmJiAoXG4gICAgICAoY3VycmVudFN0ZXAgYXMgYW55KS5uZXN0ZWRTdGVwcyAhPT0gKHByZXZpb3VzU3RlcCBhcyBhbnkpLm5lc3RlZFN0ZXBzIHx8XG4gICAgICAoY3VycmVudFN0ZXAgYXMgYW55KS5jaGlsZHJlbiAhPT0gKHByZXZpb3VzU3RlcCBhcyBhbnkpLmNoaWxkcmVuIHx8XG4gICAgICAoY3VycmVudFN0ZXAgYXMgYW55KS5zdGVwcyAhPT0gKHByZXZpb3VzU3RlcCBhcyBhbnkpLnN0ZXBzIHx8XG4gICAgICBleHBhbmRlZENoYW5nZWQgfHxcbiAgICAgIChjdXJyZW50U3RlcCBhcyBhbnkpLmFjdGl2ZUJyYW5jaFN0ZXBJZCAhPT0gKHByZXZpb3VzU3RlcCBhcyBhbnkpLmFjdGl2ZUJyYW5jaFN0ZXBJZCB8fFxuICAgICAgKGN1cnJlbnRTdGVwIGFzIGFueSkuYnJhbmNoZXMgIT09IChwcmV2aW91c1N0ZXAgYXMgYW55KS5icmFuY2hlcyB8fFxuICAgICAgKChjdXJyZW50U3RlcCBhcyBhbnkpLmNvbmZpZyAmJiAoY3VycmVudFN0ZXAgYXMgYW55KS5jb25maWcuZXhwYW5kZWQgIT09IChwcmV2aW91c1N0ZXAgYXMgYW55KS5jb25maWc/LmV4cGFuZGVkKVxuICAgICk7XG5cbiAgICAvLyBVcGRhdGUgcHJvcGVydGllcyB3aXRob3V0IHJlY3JlYXRpbmcgY29tcG9uZW50IHRvIHByZXZlbnQgYmxpbmtpbmdcbiAgICBpZiAob25seU5lc3RlZERhdGFDaGFuZ2VkICYmIHRoaXMuY29udGFpbmVyLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIEdldCB0aGUgc3RvcmVkIGNvbXBvbmVudCBpbnN0YW5jZVxuICAgICAgY29uc3QgaW5zdGFuY2UgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzLmdldCh0aGlzLmNvbnRhaW5lcik7XG4gICAgICBjb25zdCBjb21wb25lbnRSZWYgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50UmVmcy5nZXQodGhpcy5jb250YWluZXIpO1xuXG4gICAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgICAgLy8gVXNlIGNvbXByZWhlbnNpdmUgdXBkYXRlIG1ldGhvZCBmcm9tIG9yaWdpbmFsXG4gICAgICAgIHRoaXMudXBkYXRlQ29tcG9uZW50SW5zdGFuY2UoY3VycmVudFN0ZXAsIHByZXZpb3VzU3RlcCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRm9yIG90aGVyIGNoYW5nZXMsIHVzZSBjb21wcmVoZW5zaXZlIHVwZGF0ZSBpZiBjb21wb25lbnQgZXhpc3RzXG4gICAgaWYgKHRoaXMuY29udGFpbmVyLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlcy5nZXQodGhpcy5jb250YWluZXIpO1xuICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudFJlZnMuZ2V0KHRoaXMuY29udGFpbmVyKTtcblxuICAgICAgaWYgKGluc3RhbmNlICYmIHByZXZpb3VzU3RlcCAmJiBjdXJyZW50U3RlcCAmJlxuICAgICAgICBwcmV2aW91c1N0ZXAudHlwZSA9PT0gY3VycmVudFN0ZXAudHlwZSAmJlxuICAgICAgICAocHJldmlvdXNTdGVwLnRlc3RTdGVwUmVzdWx0SWQgfHwgcHJldmlvdXNTdGVwLmlkKSA9PT0gKGN1cnJlbnRTdGVwLnRlc3RTdGVwUmVzdWx0SWQgfHwgY3VycmVudFN0ZXAuaWQpKSB7XG4gICAgICAgIC8vIFVwZGF0ZSBleGlzdGluZyBjb21wb25lbnQgaW5zdGFuY2Ugd2l0aCBuZXcgc3RlcCBwcm9wZXJ0aWVzXG4gICAgICAgIHRoaXMudXBkYXRlQ29tcG9uZW50SW5zdGFuY2UoY3VycmVudFN0ZXAsIHByZXZpb3VzU3RlcCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBPbmx5IGxvYWQgY29tcG9uZW50IGlmIGNvbnRhaW5lciBpcyBlbXB0eSAoY29tcG9uZW50IGRvZXNuJ3QgZXhpc3QgeWV0KVxuICAgIC8vIFRoaXMgcHJldmVudHMgdW5uZWNlc3NhcnkgcmVsb2Fkc1xuICAgIGlmICh0aGlzLmNvbnRhaW5lciAmJiB0aGlzLmNvbnRhaW5lci5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMubG9hZENvbXBvbmVudCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRDb21wb25lbnQoKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ29tcG9uZW50SW5zdGFuY2UoY3VycmVudFN0ZXA6IGFueSwgcHJldmlvdXNTdGVwOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMuZ2V0KHRoaXMuY29udGFpbmVyKTtcbiAgICBjb25zdCBjb21wb25lbnRSZWYgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50UmVmcy5nZXQodGhpcy5jb250YWluZXIpO1xuXG4gICAgaWYgKCFpbnN0YW5jZSB8fCAhY29tcG9uZW50UmVmIHx8ICF0aGlzLmNvbnRhaW5lcikgcmV0dXJuO1xuXG4gICAgbGV0IGhhc0NoYW5nZXMgPSBmYWxzZTtcblxuICAgIC8vIExpc3Qgb2YgcHJvcGVydGllcyB0aGF0IGNvbW1vbmx5IGNoYW5nZSBhbmQgbmVlZCB0byBiZSB1cGRhdGVkXG4gICAgY29uc3QgaW1wb3J0YW50UHJvcGVydGllcyA9IFsnc3RhdHVzJywgJ2R1cmF0aW9uJywgJ2V4cGFuZGVkJywgJ3N1YlN0ZXBzJywgJ2NoaWxkcmVuJywgJ25lc3RlZFN0ZXBzJywgJ3N0ZXBzJyxcbiAgICAgICdleGVjdXRpb25EYXRhJywgJ2FjdGlvbicsICd0aXRsZScsICdyZXN1bHQnLCAnbWV0aG9kJywgJ2VuZHBvaW50JywgJ3N0YXR1c0NvZGUnLCAnYnJhbmNoZXMnLFxuICAgICAgJ3Jlc3BvbnNlVGltZScsICdhY3Rpb25zJywgJ3Byb21wdCcsICdvcHRpbWl6ZWRSdW4nLCAnYWN0aW9uQ291bnQnLCAnaXRlcmF0aW9ucycsICdzZWxlY3RlZEl0ZXJhdGlvbklkJywgJ3N0ZXBOdW1iZXInLFxuICAgICAgJ2lzVXBsb2FkaW5nQmFzZWxpbmUnLCAnaXNNYWtpbmdDdXJyZW50QmFzZWxpbmUnLCAnc2VsZWN0ZWRUYWJJbnB1dCcsICdzdGVwRGVsZXRlZCddO1xuXG4gICAgLy8gVXBkYXRlIGltcG9ydGFudCBwcm9wZXJ0aWVzXG4gICAgaW1wb3J0YW50UHJvcGVydGllcy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAvLyBGb3Igc2VsZWN0ZWRJdGVyYXRpb25JZCBvbiBsb29wIHN0ZXBzLCBwcmlvcml0aXplIHRoZSBpbnB1dCB2YWx1ZSBvdmVyIHN0ZXAgdmFsdWVcbiAgICAgIGlmIChrZXkgPT09ICdzZWxlY3RlZEl0ZXJhdGlvbklkJyAmJiBjdXJyZW50U3RlcC50eXBlID09PSAnbG9vcCcgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkO1xuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gKGluc3RhbmNlIGFzIGFueSlba2V5XTtcbiAgICAgICAgaWYgKHRoaXMuaGFzVmFsdWVDaGFuZ2VkKGN1cnJlbnRWYWx1ZSwgcHJldmlvdXNWYWx1ZSkpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KVtrZXldID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZ1trZXldID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBUcnkgdG8gdXBkYXRlIHNlbGVjdGVkSXRlcmF0aW9uIGlmIGl0ZXJhdGlvbnMgYXJlIGF2YWlsYWJsZVxuICAgICAgICAgIHRoaXMudXBkYXRlTG9vcFN0ZXBTZWxlY3RlZEl0ZXJhdGlvbihpbnN0YW5jZSwgY3VycmVudFZhbHVlKTtcbiAgICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdpdGVyYXRpb25zJyAmJiBjdXJyZW50U3RlcC50eXBlID09PSAnbG9vcCcpIHtcbiAgICAgICAgLy8gV2hlbiBpdGVyYXRpb25zIGFyZSB1cGRhdGVkLCBjaGVjayBpZiB3ZSBuZWVkIHRvIHVwZGF0ZSBzZWxlY3RlZEl0ZXJhdGlvblxuICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSAoY3VycmVudFN0ZXAgYXMgYW55KVtrZXldO1xuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gKHByZXZpb3VzU3RlcCBhcyBhbnkpW2tleV07XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzVmFsdWVDaGFuZ2VkKGN1cnJlbnRWYWx1ZSwgcHJldmlvdXNWYWx1ZSkpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KVtrZXldID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZ1trZXldID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcblxuICAgICAgICAgIC8vIEFmdGVyIGl0ZXJhdGlvbnMgYXJlIHVwZGF0ZWQsIHRyeSB0byB1cGRhdGUgc2VsZWN0ZWRJdGVyYXRpb24gaWYgc2VsZWN0ZWRJdGVyYXRpb25JZCBpcyBzZXRcbiAgICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZXJhdGlvbklkID0gKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb25JZCB8fCB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICAgICAgaWYgKHNlbGVjdGVkSXRlcmF0aW9uSWQpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTG9vcFN0ZXBTZWxlY3RlZEl0ZXJhdGlvbihpbnN0YW5jZSwgc2VsZWN0ZWRJdGVyYXRpb25JZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2lzVXBsb2FkaW5nQmFzZWxpbmUnIHx8IGtleSA9PT0gJ2lzTWFraW5nQ3VycmVudEJhc2VsaW5lJykge1xuICAgICAgICAvLyBGb3IgbG9hZGluZyBzdGF0ZSBvYmplY3RzLCBhbHdheXMgdXNlIHRoZSBpbnB1dCB2YWx1ZSAodGhleSdyZSBwYXNzZWQgZnJvbSBwYXJlbnQpXG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGtleSA9PT0gJ2lzVXBsb2FkaW5nQmFzZWxpbmUnID8gdGhpcy5pc1VwbG9hZGluZ0Jhc2VsaW5lIDogdGhpcy5pc01ha2luZ0N1cnJlbnRCYXNlbGluZTtcbiAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IChpbnN0YW5jZSBhcyBhbnkpW2tleV07XG5cbiAgICAgICAgLy8gQWx3YXlzIHVwZGF0ZSBpZiB0aGUgcmVmZXJlbmNlIGNoYW5nZWQgKG5ldyBvYmplY3QgY3JlYXRlZClcbiAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSAhPT0gcHJldmlvdXNWYWx1ZSkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpW2tleV0gPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnW2tleV0gPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ3N0ZXBOdW1iZXInICYmIHRoaXMuc3RlcE51bWJlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIEZvciBzdGVwTnVtYmVyLCBwcmlvcml0aXplIHRoZSBpbnB1dCB2YWx1ZSBvdmVyIHN0ZXAgdmFsdWVcbiAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy5zdGVwTnVtYmVyO1xuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gKGluc3RhbmNlIGFzIGFueSlba2V5XTtcbiAgICAgICAgaWYgKHRoaXMuaGFzVmFsdWVDaGFuZ2VkKGN1cnJlbnRWYWx1ZSwgcHJldmlvdXNWYWx1ZSkpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KVtrZXldID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZ1trZXldID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdhY3Rpb24nICYmIGN1cnJlbnRTdGVwLnR5cGUgPT09ICdhaS1hZ2VudCcpIHtcbiAgICAgICAgLy8gRm9yIGFpLWFnZW50IHN0ZXBzLCBlbnN1cmUgdGl0bGUgYW5kIHByb21wdCBhcmUgc2V0IGZyb20gYWN0aW9uXG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IChjdXJyZW50U3RlcCBhcyBhbnkpW2tleV07XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSAocHJldmlvdXNTdGVwIGFzIGFueSlba2V5XTtcblxuICAgICAgICBpZiAodGhpcy5oYXNWYWx1ZUNoYW5nZWQoY3VycmVudFZhbHVlLCBwcmV2aW91c1ZhbHVlKSkge1xuICAgICAgICAgIC8vIFVwZGF0ZSBhY3Rpb25cbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KVtrZXldID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuXG4gICAgICAgICAgLy8gQWxzbyB1cGRhdGUgdGl0bGUgYW5kIHByb21wdCBmcm9tIGFjdGlvbiBpZiB0aGV5J3JlIG5vdCBzZXQgb3IgZW1wdHlcbiAgICAgICAgICBpZiAoY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoIShpbnN0YW5jZSBhcyBhbnkpLnRpdGxlIHx8ICEoaW5zdGFuY2UgYXMgYW55KS50aXRsZS50cmltKCkpIHtcbiAgICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkudGl0bGUgPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcudGl0bGUgPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghKGluc3RhbmNlIGFzIGFueSkucHJvbXB0IHx8ICEoaW5zdGFuY2UgYXMgYW55KS5wcm9tcHQudHJpbSgpKSB7XG4gICAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnByb21wdCA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5wcm9tcHQgPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IChjdXJyZW50U3RlcCBhcyBhbnkpW2tleV07XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSAocHJldmlvdXNTdGVwIGFzIGFueSlba2V5XTtcblxuICAgICAgICAvLyBVc2UgZGVlcCBjb21wYXJpc29uIGZvciBvYmplY3RzL2FycmF5cywgc2hhbGxvdyBmb3IgcHJpbWl0aXZlc1xuICAgICAgICBpZiAodGhpcy5oYXNWYWx1ZUNoYW5nZWQoY3VycmVudFZhbHVlLCBwcmV2aW91c1ZhbHVlKSkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpW2tleV0gPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEFsc28gdXBkYXRlIGFsbCBvdGhlciBwcm9wZXJ0aWVzXG4gICAgT2JqZWN0LmtleXMoY3VycmVudFN0ZXApLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmIChrZXkgIT09ICd0eXBlJyAmJiAhaW1wb3J0YW50UHJvcGVydGllcy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IChjdXJyZW50U3RlcCBhcyBhbnkpW2tleV07XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSAocHJldmlvdXNTdGVwIGFzIGFueSlba2V5XTtcblxuICAgICAgICBpZiAodGhpcy5oYXNWYWx1ZUNoYW5nZWQoY3VycmVudFZhbHVlLCBwcmV2aW91c1ZhbHVlKSkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpW2tleV0gPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFVwZGF0ZSBzcGVjaWFsIHByb3BlcnRpZXMgdGhhdCBtaWdodCBuZWVkIHNwZWNpYWwgaGFuZGxpbmdcbiAgICBpZiAoY3VycmVudFN0ZXAudHlwZSA9PT0gJ2xvb3AnICYmIChjdXJyZW50U3RlcCBhcyBhbnkpLmNoaWxkcmVuICYmICEoY3VycmVudFN0ZXAgYXMgYW55KS5uZXN0ZWRTdGVwcykge1xuICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLm5lc3RlZFN0ZXBzICE9PSAoY3VycmVudFN0ZXAgYXMgYW55KS5jaGlsZHJlbikge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5uZXN0ZWRTdGVwcyA9IChjdXJyZW50U3RlcCBhcyBhbnkpLmNoaWxkcmVuO1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLm5lc3RlZFN0ZXBzID0gKGN1cnJlbnRTdGVwIGFzIGFueSkuY2hpbGRyZW47XG4gICAgICAgIH1cbiAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRTdGVwLnR5cGUgPT09ICdzdGVwLWdyb3VwJyAmJiAoY3VycmVudFN0ZXAgYXMgYW55KS5jaGlsZHJlbiAmJiAhKGN1cnJlbnRTdGVwIGFzIGFueSkuc3RlcHMpIHtcbiAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5zdGVwcyAhPT0gKGN1cnJlbnRTdGVwIGFzIGFueSkuY2hpbGRyZW4pIHtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc3RlcHMgPSAoY3VycmVudFN0ZXAgYXMgYW55KS5jaGlsZHJlbjtcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5zdGVwcyA9IChjdXJyZW50U3RlcCBhcyBhbnkpLmNoaWxkcmVuO1xuICAgICAgICB9XG4gICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGNvbmRpdGlvbi1zdGVwOiBlbnN1cmUgYnJhbmNoZXMgaXMgcHJvcGVybHkgdXBkYXRlZFxuICAgIC8vIFVzZSBkZWVwIGNvbXBhcmlzb24gdG8gZGV0ZWN0IGNoYW5nZXMgaW4gbmVzdGVkIHN1YlN0ZXBzXG4gICAgaWYgKGN1cnJlbnRTdGVwLnR5cGUgPT09ICdjb25kaXRpb24nICYmIChjdXJyZW50U3RlcCBhcyBhbnkpLmJyYW5jaGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRCcmFuY2hlcyA9IChjdXJyZW50U3RlcCBhcyBhbnkpLmJyYW5jaGVzIHx8IFtdO1xuICAgICAgY29uc3QgcHJldmlvdXNCcmFuY2hlcyA9IChwcmV2aW91c1N0ZXAgYXMgYW55KS5icmFuY2hlcyB8fCBbXTtcblxuICAgICAgLy8gVXNlIGRlZXAgY29tcGFyaXNvbiB0byBkZXRlY3QgbmVzdGVkIHN1YlN0ZXBzIGNoYW5nZXNcbiAgICAgIGlmICh0aGlzLmhhc0JyYW5jaGVzQ2hhbmdlZChjdXJyZW50QnJhbmNoZXMsIHByZXZpb3VzQnJhbmNoZXMpKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBhcnJheSByZWZlcmVuY2UgdG8gZW5zdXJlIGNoYW5nZSBkZXRlY3Rpb24gdHJpZ2dlcnNcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuYnJhbmNoZXMgPSBbLi4uY3VycmVudEJyYW5jaGVzLm1hcCgoYnJhbmNoOiBhbnkpID0+ICh7XG4gICAgICAgICAgLi4uYnJhbmNoLFxuICAgICAgICAgIHN1YlN0ZXBzOiBicmFuY2guc3ViU3RlcHMgPyBbLi4uYnJhbmNoLnN1YlN0ZXBzXSA6IFtdXG4gICAgICAgIH0pKV07XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuYnJhbmNoZXMgPSAoaW5zdGFuY2UgYXMgYW55KS5icmFuY2hlcztcbiAgICAgICAgfVxuICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBjb25kaXRpb24tc3RlcDogZW5zdXJlIG5lc3RlZFN0ZXBzIGlzIHByb3Blcmx5IHVwZGF0ZWRcbiAgICAvLyBUaGlzIGlzIGltcG9ydGFudCB3aGVuIGNoaWxkcmVuIGFyZSBsb2FkZWQgZnJvbSB0aGUgQVBJIG9yIHdoZW4gc3dpdGNoaW5nIGJyYW5jaGVzXG4gICAgaWYgKGN1cnJlbnRTdGVwLnR5cGUgPT09ICdjb25kaXRpb24nICYmIChjdXJyZW50U3RlcCBhcyBhbnkpLm5lc3RlZFN0ZXBzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnROZXN0ZWRTdGVwcyA9IChjdXJyZW50U3RlcCBhcyBhbnkpLm5lc3RlZFN0ZXBzIHx8IFtdO1xuICAgICAgY29uc3QgcHJldmlvdXNOZXN0ZWRTdGVwcyA9IChwcmV2aW91c1N0ZXAgYXMgYW55KS5uZXN0ZWRTdGVwcyB8fCBbXTtcbiAgICAgIGNvbnNvbGUubG9nKCfwn5SEIHN0ZXAtcmVuZGVyZXI6IGN1cnJlbnROZXN0ZWRTdGVwcycsIGN1cnJlbnROZXN0ZWRTdGVwcyk7XG4gICAgICBjb25zb2xlLmxvZygn8J+UhCBzdGVwLXJlbmRlcmVyOiBwcmV2aW91c05lc3RlZFN0ZXBzJywgcHJldmlvdXNOZXN0ZWRTdGVwcyk7XG4gICAgICAvLyBVc2UgZGVlcCBjb21wYXJpc29uIHRvIGRldGVjdCBjb250ZW50IGNoYW5nZXMsIG5vdCBqdXN0IHJlZmVyZW5jZSBjaGFuZ2VzXG4gICAgICAvLyBUaGlzIGlzIGNyaXRpY2FsIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gSUYgYW5kIEVMU0VfSUYgYnJhbmNoZXNcbiAgICAgIGlmICh0aGlzLmhhc05lc3RlZFN0ZXBzQ2hhbmdlZChjdXJyZW50TmVzdGVkU3RlcHMsIHByZXZpb3VzTmVzdGVkU3RlcHMpKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBhcnJheSByZWZlcmVuY2UgdG8gZW5zdXJlIGNoYW5nZSBkZXRlY3Rpb24gdHJpZ2dlcnNcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkubmVzdGVkU3RlcHMgPSBbLi4uY3VycmVudE5lc3RlZFN0ZXBzXTtcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5uZXN0ZWRTdGVwcyA9IFsuLi5jdXJyZW50TmVzdGVkU3RlcHNdO1xuICAgICAgICB9XG4gICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgICBjb25zb2xlLmxvZygn8J+UhCBzdGVwLXJlbmRlcmVyOiBuZXN0ZWRTdGVwcyB1cGRhdGVkIGZvciBjb25kaXRpb24tc3RlcCcsIHtcbiAgICAgICAgICBzdGVwSWQ6IGN1cnJlbnRTdGVwLmlkLFxuICAgICAgICAgIHByZXZpb3VzQ291bnQ6IHByZXZpb3VzTmVzdGVkU3RlcHMubGVuZ3RoLFxuICAgICAgICAgIGN1cnJlbnRDb3VudDogY3VycmVudE5lc3RlZFN0ZXBzLmxlbmd0aFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBmaWxlLWRvd25sb2FkIChpbmNsdWRpbmcgZ2VuZXJhdGVEb2N1bWVudCk6IHN5bmMgZnJvbSBnZW5lcmF0ZURvY3VtZW50UmVzdWx0XG4gICAgaWYgKHRoaXMuZ2V0RWZmZWN0aXZlU3RlcFR5cGUoY3VycmVudFN0ZXApID09PSAnZmlsZS1kb3dubG9hZCcpIHtcbiAgICAgIGNvbnN0IGdkID0gKGN1cnJlbnRTdGVwIGFzIGFueSkuZXhlY3V0ZWRSZXN1bHQ/LmdlbmVyYXRlRG9jdW1lbnRSZXN1bHQ7XG4gICAgICBjb25zdCBwcmV2R2QgPSAocHJldmlvdXNTdGVwIGFzIGFueSkuZXhlY3V0ZWRSZXN1bHQ/LmdlbmVyYXRlRG9jdW1lbnRSZXN1bHQ7XG4gICAgICBpZiAoZ2QgIT09IHByZXZHZCB8fCBnZD8uZmlsZU5hbWUgIT09IHByZXZHZD8uZmlsZU5hbWUgfHwgZ2Q/LmZpbGVUeXBlICE9PSBwcmV2R2Q/LmZpbGVUeXBlIHx8IGdkPy5zM0ZpbGVOYW1lICE9PSBwcmV2R2Q/LnMzRmlsZU5hbWUpIHtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZmlsZU5hbWUgPSBnZD8uZmlsZU5hbWUgPz8gKGluc3RhbmNlIGFzIGFueSkuZmlsZU5hbWUgPz8gJyc7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmZpbGVUeXBlID0gZ2Q/LmZpbGVUeXBlID8/IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVUeXBlID8/ICcnO1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5maWxlUGF0aCA9IGdkPy5zM0ZpbGVOYW1lID8/IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVQYXRoO1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmZpbGVOYW1lID0gKGluc3RhbmNlIGFzIGFueSkuZmlsZU5hbWU7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmZpbGVUeXBlID0gKGluc3RhbmNlIGFzIGFueSkuZmlsZVR5cGU7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmZpbGVQYXRoID0gKGluc3RhbmNlIGFzIGFueSkuZmlsZVBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCB0aWQgPSAoY3VycmVudFN0ZXAgYXMgYW55KS50ZXN0U3RlcFJlc3VsdElkO1xuICAgICAgY29uc3QgbmV4dERvd25sb2FkaW5nID0gISF0aWQgJiYgdGhpcy5kb3dubG9hZGluZ1N0ZXBJZCA9PT0gdGlkO1xuICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmlzRG93bmxvYWRpbmcgIT09IG5leHREb3dubG9hZGluZykge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5pc0Rvd25sb2FkaW5nID0gbmV4dERvd25sb2FkaW5nO1xuICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBsb29wLXN0ZXA6IGVuc3VyZSBzZWxlY3RlZEl0ZXJhdGlvbklkIGZyb20gaW5wdXQgaXMgdXNlZFxuICAgIGlmIChjdXJyZW50U3RlcC50eXBlID09PSAnbG9vcCcgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRTZWxlY3RlZEl0ZXJhdGlvbklkID0gdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkO1xuICAgICAgY29uc3QgaW5zdGFuY2VTZWxlY3RlZEl0ZXJhdGlvbklkID0gKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb25JZDtcblxuICAgICAgLy8gTm9ybWFsaXplIHZhbHVlcyB0byBoYW5kbGUgbnVsbC91bmRlZmluZWQgY29uc2lzdGVudGx5XG4gICAgICBjb25zdCBub3JtYWxpemVWYWx1ZSA9ICh2YWw6IGFueSkgPT4gdmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkID8gJycgOiBTdHJpbmcodmFsKTtcbiAgICAgIGNvbnN0IGN1cnJlbnROb3JtYWxpemVkID0gbm9ybWFsaXplVmFsdWUoY3VycmVudFNlbGVjdGVkSXRlcmF0aW9uSWQpO1xuICAgICAgY29uc3QgaW5zdGFuY2VOb3JtYWxpemVkID0gbm9ybWFsaXplVmFsdWUoaW5zdGFuY2VTZWxlY3RlZEl0ZXJhdGlvbklkKTtcblxuICAgICAgaWYgKGN1cnJlbnROb3JtYWxpemVkICE9PSBpbnN0YW5jZU5vcm1hbGl6ZWQpIHtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb25JZCA9IGN1cnJlbnRTZWxlY3RlZEl0ZXJhdGlvbklkO1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLnNlbGVjdGVkSXRlcmF0aW9uSWQgPSBjdXJyZW50U2VsZWN0ZWRJdGVyYXRpb25JZDtcbiAgICAgICAgfVxuICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBsb29wLXN0ZXA6IGVuc3VyZSBzZWxlY3RlZEl0ZXJhdGlvbklkIGZyb20gaW5wdXQgaXMgdXNlZFxuICAgIGlmIChjdXJyZW50U3RlcC50eXBlID09PSAnbG9vcCcgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRTZWxlY3RlZEl0ZXJhdGlvbklkID0gdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkO1xuICAgICAgY29uc3QgaW5zdGFuY2VTZWxlY3RlZEl0ZXJhdGlvbklkID0gKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb25JZDtcblxuICAgICAgLy8gTm9ybWFsaXplIHZhbHVlcyB0byBoYW5kbGUgbnVsbC91bmRlZmluZWQgY29uc2lzdGVudGx5XG4gICAgICBjb25zdCBub3JtYWxpemVWYWx1ZSA9ICh2YWw6IGFueSkgPT4gdmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkID8gJycgOiBTdHJpbmcodmFsKTtcbiAgICAgIGNvbnN0IGN1cnJlbnROb3JtYWxpemVkID0gbm9ybWFsaXplVmFsdWUoY3VycmVudFNlbGVjdGVkSXRlcmF0aW9uSWQpO1xuICAgICAgY29uc3QgaW5zdGFuY2VOb3JtYWxpemVkID0gbm9ybWFsaXplVmFsdWUoaW5zdGFuY2VTZWxlY3RlZEl0ZXJhdGlvbklkKTtcblxuICAgICAgaWYgKGN1cnJlbnROb3JtYWxpemVkICE9PSBpbnN0YW5jZU5vcm1hbGl6ZWQpIHtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb25JZCA9IGN1cnJlbnRTZWxlY3RlZEl0ZXJhdGlvbklkO1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLnNlbGVjdGVkSXRlcmF0aW9uSWQgPSBjdXJyZW50U2VsZWN0ZWRJdGVyYXRpb25JZDtcbiAgICAgICAgfVxuICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgZXhwYW5kZWQgc3RhdGUgLSB1c2Ugc2V0SW5wdXQgdG8gcHJvcGVybHkgdHJpZ2dlciBuZ09uQ2hhbmdlc1xuICAgIC8vIEFsd2F5cyByZWNhbGN1bGF0ZSBleHBhbmRlZCBzdGF0ZSB1c2luZyBoYW5kbGVyIGlmIGF2YWlsYWJsZSwgYXMgaXQgbWF5IGRlcGVuZCBvbiBwYXJlbnQgc3RhdGVcbiAgICBsZXQgZXhwYW5kZWRTdGF0ZTogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXIgJiYgY3VycmVudFN0ZXApIHtcbiAgICAgIGV4cGFuZGVkU3RhdGUgPSB0aGlzLmlzU3RlcEV4cGFuZGVkSGFuZGxlcihjdXJyZW50U3RlcCk7XG4gICAgfSBlbHNlIGlmICgoY3VycmVudFN0ZXAgYXMgYW55KS5leHBhbmRlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBleHBhbmRlZFN0YXRlID0gKGN1cnJlbnRTdGVwIGFzIGFueSkuZXhwYW5kZWQ7XG4gICAgfVxuICAgIFxuICAgIC8vIFVwZGF0ZSBleHBhbmRlZCBpZiBpdCBjaGFuZ2VkXG4gICAgaWYgKGV4cGFuZGVkU3RhdGUgIT09IHVuZGVmaW5lZCAmJiAoaW5zdGFuY2UgYXMgYW55KS5leHBhbmRlZCAhPT0gZXhwYW5kZWRTdGF0ZSkge1xuICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IChpbnN0YW5jZSBhcyBhbnkpLmV4cGFuZGVkO1xuICAgICAgLy8gVXNlIHNldElucHV0IHRvIHByb3Blcmx5IHVwZGF0ZSB0aGUgQElucHV0KCkgZXhwYW5kZWQgcHJvcGVydHlcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBuZ09uQ2hhbmdlcyBpcyBjYWxsZWQgaW4gY2hpbGQgY29tcG9uZW50c1xuICAgICAgaWYgKGNvbXBvbmVudFJlZiAmJiB0eXBlb2YgKGNvbXBvbmVudFJlZiBhcyBhbnkpLnNldElucHV0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIChjb21wb25lbnRSZWYgYXMgYW55KS5zZXRJbnB1dCgnZXhwYW5kZWQnLCBleHBhbmRlZFN0YXRlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZhbGxiYWNrIGZvciBvbGRlciBBbmd1bGFyIHZlcnNpb25zOiBtYW51YWxseSB0cmlnZ2VyIG5nT25DaGFuZ2VzXG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmV4cGFuZGVkID0gZXhwYW5kZWRTdGF0ZTtcbiAgICAgICAgLy8gTWFudWFsbHkgY2FsbCBuZ09uQ2hhbmdlcyBpZiB0aGUgY29tcG9uZW50IGltcGxlbWVudHMgaXRcbiAgICAgICAgaWYgKHR5cGVvZiAoaW5zdGFuY2UgYXMgYW55KS5uZ09uQ2hhbmdlcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGNvbnN0IGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMgPSB7XG4gICAgICAgICAgICBleHBhbmRlZDogbmV3IFNpbXBsZUNoYW5nZShwcmV2aW91c1ZhbHVlLCBleHBhbmRlZFN0YXRlLCBwcmV2aW91c1ZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgfTtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5uZ09uQ2hhbmdlcyhjaGFuZ2VzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuZXhwYW5kZWQgPSBleHBhbmRlZFN0YXRlO1xuICAgICAgfVxuICAgICAgLy8gQWxzbyB1cGRhdGUgdGhlIHN0ZXAgb2JqZWN0J3MgZXhwYW5kZWQgcHJvcGVydHkgdG8ga2VlcCBpdCBpbiBzeW5jXG4gICAgICBpZiAoY3VycmVudFN0ZXApIHtcbiAgICAgICAgKGN1cnJlbnRTdGVwIGFzIGFueSkuZXhwYW5kZWQgPSBleHBhbmRlZFN0YXRlO1xuICAgICAgfVxuICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGNvbmZpZyByZWZlcmVuY2UgLSBlbnN1cmUgYWxsIHByb3BlcnRpZXMgaW5jbHVkaW5nIGJyYW5jaGVzIGFyZSBpbmNsdWRlZFxuICAgIGlmICgnY29uZmlnJyBpbiBpbnN0YW5jZSkge1xuICAgICAgLy8gVXBkYXRlIGNvbmZpZyB3aXRoIGN1cnJlbnQgc3RlcCB0byBlbnN1cmUgYWxsIHByb3BlcnRpZXMgaW5jbHVkaW5nIGJyYW5jaGVzIGFyZSBzeW5jZWRcbiAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZyA9IHsgLi4uKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLCAuLi5jdXJyZW50U3RlcCB9O1xuICAgICAgLy8gRXhwbGljaXRseSBlbnN1cmUgYnJhbmNoZXMgaXMgdXBkYXRlZCBmb3IgY29uZGl0aW9uLXN0ZXAgKGluIGNhc2UgaXQgd2FzIG5lc3RlZClcbiAgICAgIC8vIFVzZSB0aGUgYWxyZWFkeSB1cGRhdGVkIGJyYW5jaGVzIGZyb20gaW5zdGFuY2UgdG8gbWFpbnRhaW4gcmVmZXJlbmNlIGNvbnNpc3RlbmN5XG4gICAgICBpZiAoY3VycmVudFN0ZXAudHlwZSA9PT0gJ2NvbmRpdGlvbicgJiYgKGluc3RhbmNlIGFzIGFueSkuYnJhbmNoZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuYnJhbmNoZXMgPSAoaW5zdGFuY2UgYXMgYW55KS5icmFuY2hlcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgc3RlcCBwcm9wZXJ0eSBpZiBpdCBleGlzdHMgb24gdGhlIGluc3RhbmNlXG4gICAgaWYgKCdzdGVwJyBpbiBpbnN0YW5jZSkge1xuICAgICAgKGluc3RhbmNlIGFzIGFueSkuc3RlcCA9IGN1cnJlbnRTdGVwO1xuICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHNlbGZIZWFsQW5hbHlzaXMgdXNpbmcgaGFuZGxlciBpZiBhdmFpbGFibGVcbiAgICBpZiAodGhpcy5nZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlciAmJiBjdXJyZW50U3RlcCkge1xuICAgICAgY29uc3Qgc2VsZkhlYWxBbmFseXNpcyA9IHRoaXMuZ2V0U2VsZkhlYWxBbmFseXNpc0hhbmRsZXIoY3VycmVudFN0ZXApO1xuICAgICAgY29uc3QgcHJldmlvdXNTZWxmSGVhbEFuYWx5c2lzID0gKGluc3RhbmNlIGFzIGFueSkuc2VsZkhlYWxBbmFseXNpcztcbiAgICAgIFxuICAgICAgaWYgKHRoaXMuaGFzVmFsdWVDaGFuZ2VkKHNlbGZIZWFsQW5hbHlzaXMsIHByZXZpb3VzU2VsZkhlYWxBbmFseXNpcykpIHtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZkhlYWxBbmFseXNpcyA9IHNlbGZIZWFsQW5hbHlzaXM7XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuc2VsZkhlYWxBbmFseXNpcyA9IHNlbGZIZWFsQW5hbHlzaXM7XG4gICAgICAgIH1cbiAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgaWYgdGhlcmUgd2VyZSBjaGFuZ2VzXG4gICAgLy8gVGhpcyBlbnN1cmVzIG9ubHkgdGhlIG5lc3RlZCBzdGVwIHVwZGF0ZXMgd2l0aG91dCBhZmZlY3RpbmcgcGFyZW50IHN0ZXBzXG4gICAgaWYgKGhhc0NoYW5nZXMpIHtcbiAgICAgIGlmIChjb21wb25lbnRSZWYuaW5qZWN0b3IpIHtcbiAgICAgICAgY29uc3QgaW5zdGFuY2VDZHIgPSBjb21wb25lbnRSZWYuaW5qZWN0b3IuZ2V0KENoYW5nZURldGVjdG9yUmVmLCBudWxsKTtcbiAgICAgICAgaWYgKGluc3RhbmNlQ2RyKSB7XG4gICAgICAgICAgaW5zdGFuY2VDZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgaW5zdGFuY2VDZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNkcikge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSBlbHNlIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jaGFuZ2VEZXRlY3RvclJlZikge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgICAvLyBEb24ndCBjYWxsIG1hcmtGb3JDaGVjayBvbiB0aGlzIGNvbXBvbmVudCB0byBhdm9pZCB0cmlnZ2VyaW5nIHBhcmVudCByZS1yZW5kZXJzXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2QgdG8gdXBkYXRlIGxvb3Atc3RlcCBzZWxlY3RlZEl0ZXJhdGlvbiB3aGVuIHNlbGVjdGVkSXRlcmF0aW9uSWQgY2hhbmdlc1xuICAgKiBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgaXRlcmF0aW9ucyBtaWdodCBub3QgYmUgbG9hZGVkIHlldFxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVMb29wU3RlcFNlbGVjdGVkSXRlcmF0aW9uKGluc3RhbmNlOiBhbnksIHNlbGVjdGVkSXRlcmF0aW9uSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGlmICghaW5zdGFuY2UpIHJldHVybjtcblxuICAgIGNvbnN0IGl0ZXJhdGlvbnMgPSAoaW5zdGFuY2UgYXMgYW55KS5pdGVyYXRpb25zIHx8IChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZz8uaXRlcmF0aW9ucyB8fCBbXTtcblxuICAgIGlmIChpdGVyYXRpb25zICYmIGl0ZXJhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKHNlbGVjdGVkSXRlcmF0aW9uSWQpIHtcbiAgICAgICAgY29uc3QgZm91bmQgPSBpdGVyYXRpb25zLmZpbmQoKGl0ZXI6IGFueSkgPT4gaXRlci5pZCA9PT0gc2VsZWN0ZWRJdGVyYXRpb25JZCk7XG4gICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uID0gZm91bmQ7XG4gICAgICAgICAgLy8gU3luYyB1c2VyU2VsZWN0ZWRJdGVyYXRpb25JZCB3aXRoIHRoZSBpbnB1dCB2YWx1ZVxuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS51c2VyU2VsZWN0ZWRJdGVyYXRpb25JZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS51c2VyU2VsZWN0ZWRJdGVyYXRpb25JZCA9IHNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIElmIG5vdCBmb3VuZCwgc2VsZWN0IGRlZmF1bHRcbiAgICAgICAgICBpZiAodHlwZW9mIChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdERlZmF1bHRJdGVyYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdERlZmF1bHRJdGVyYXRpb24oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElmIG5vIHZhbHVlIHByb3ZpZGVkLCBzZWxlY3QgZGVmYXVsdFxuICAgICAgICBpZiAodHlwZW9mIChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdERlZmF1bHRJdGVyYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3REZWZhdWx0SXRlcmF0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gSWYgaXRlcmF0aW9ucyBhcmUgbm90IGF2YWlsYWJsZSB5ZXQsIHRoZSBzZWxlY3RlZEl0ZXJhdGlvbklkIGlzIGFscmVhZHkgc2V0XG4gICAgLy8gYW5kIHdpbGwgYmUgdXNlZCB3aGVuIGl0ZXJhdGlvbnMgYmVjb21lIGF2YWlsYWJsZSAoaGFuZGxlZCBpbiB1cGRhdGVDb21wb25lbnRJbnN0YW5jZSBhbmQgbmdEb0NoZWNrKVxuICB9XG5cbiAgcHJpdmF0ZSBoYXNWYWx1ZUNoYW5nZWQoY3VycmVudDogYW55LCBwcmV2aW91czogYW55KTogYm9vbGVhbiB7XG4gICAgLy8gU2hhbGxvdyBjb21wYXJpc29uIGZvciBwcmltaXRpdmVzXG4gICAgaWYgKGN1cnJlbnQgPT09IHByZXZpb3VzKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBIYW5kbGUgbnVsbC91bmRlZmluZWRcbiAgICBpZiAoY3VycmVudCA9PSBudWxsIHx8IHByZXZpb3VzID09IG51bGwpIHJldHVybiBjdXJyZW50ICE9PSBwcmV2aW91cztcblxuICAgIC8vIEZvciBhcnJheXMsIGNoZWNrIGxlbmd0aCBhbmQgcmVmZXJlbmNlXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY3VycmVudCkgfHwgQXJyYXkuaXNBcnJheShwcmV2aW91cykpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGN1cnJlbnQpICE9PSBBcnJheS5pc0FycmF5KHByZXZpb3VzKSkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoY3VycmVudC5sZW5ndGggIT09IHByZXZpb3VzLmxlbmd0aCkgcmV0dXJuIHRydWU7XG4gICAgICByZXR1cm4gY3VycmVudCAhPT0gcHJldmlvdXM7IC8vIFJlZmVyZW5jZSBjaGVja1xuICAgIH1cblxuICAgIC8vIEZvciBvYmplY3RzLCBkbyBzaGFsbG93IGNvbXBhcmlzb24gKGNoZWNrIHJlZmVyZW5jZSlcbiAgICBpZiAodHlwZW9mIGN1cnJlbnQgPT09ICdvYmplY3QnICYmIHR5cGVvZiBwcmV2aW91cyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBjdXJyZW50ICE9PSBwcmV2aW91czsgLy8gUmVmZXJlbmNlIGNoZWNrXG4gICAgfVxuXG4gICAgLy8gRm9yIHByaW1pdGl2ZXNcbiAgICByZXR1cm4gY3VycmVudCAhPT0gcHJldmlvdXM7XG4gIH1cblxuICAvKipcbiAgICogRGVlcCBjb21wYXJpc29uIGZvciBicmFuY2hlcyBhcnJheSB0byBkZXRlY3QgY2hhbmdlcyBpbiBuZXN0ZWQgc3ViU3RlcHNcbiAgICovXG4gIHByaXZhdGUgaGFzQnJhbmNoZXNDaGFuZ2VkKGN1cnJlbnQ6IGFueVtdLCBwcmV2aW91czogYW55W10pOiBib29sZWFuIHtcbiAgICBpZiAoIWN1cnJlbnQgJiYgIXByZXZpb3VzKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFjdXJyZW50IHx8ICFwcmV2aW91cykgcmV0dXJuIHRydWU7XG4gICAgaWYgKGN1cnJlbnQubGVuZ3RoICE9PSBwcmV2aW91cy5sZW5ndGgpIHJldHVybiB0cnVlO1xuICAgIGlmIChjdXJyZW50ID09PSBwcmV2aW91cykgcmV0dXJuIGZhbHNlOyAvLyBTYW1lIHJlZmVyZW5jZVxuXG4gICAgLy8gQ29tcGFyZSBlYWNoIGJyYW5jaCBhbmQgaXRzIHN1YlN0ZXBzXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXJyZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjdXJyZW50QnJhbmNoID0gY3VycmVudFtpXTtcbiAgICAgIGNvbnN0IHByZXZpb3VzQnJhbmNoID0gcHJldmlvdXNbaV07XG5cbiAgICAgIGlmICghcHJldmlvdXNCcmFuY2gpIHJldHVybiB0cnVlO1xuXG4gICAgICAvLyBDaGVjayBpZiBicmFuY2ggcHJvcGVydGllcyBjaGFuZ2VkXG4gICAgICBpZiAoY3VycmVudEJyYW5jaC50eXBlICE9PSBwcmV2aW91c0JyYW5jaC50eXBlIHx8XG4gICAgICAgIGN1cnJlbnRCcmFuY2gubGFiZWwgIT09IHByZXZpb3VzQnJhbmNoLmxhYmVsIHx8XG4gICAgICAgIGN1cnJlbnRCcmFuY2guZXhlY3V0ZWQgIT09IHByZXZpb3VzQnJhbmNoLmV4ZWN1dGVkIHx8XG4gICAgICAgIGN1cnJlbnRCcmFuY2guY29uZGl0aW9uVHlwZSAhPT0gcHJldmlvdXNCcmFuY2guY29uZGl0aW9uVHlwZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgc3ViU3RlcHMgYXJyYXkgY2hhbmdlZCAobGVuZ3RoIG9yIHJlZmVyZW5jZSlcbiAgICAgIGNvbnN0IGN1cnJlbnRTdWJTdGVwcyA9IGN1cnJlbnRCcmFuY2guc3ViU3RlcHMgfHwgW107XG4gICAgICBjb25zdCBwcmV2aW91c1N1YlN0ZXBzID0gcHJldmlvdXNCcmFuY2guc3ViU3RlcHMgfHwgW107XG5cbiAgICAgIGlmIChjdXJyZW50U3ViU3RlcHMubGVuZ3RoICE9PSBwcmV2aW91c1N1YlN0ZXBzLmxlbmd0aCkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoY3VycmVudFN1YlN0ZXBzICE9PSBwcmV2aW91c1N1YlN0ZXBzKSByZXR1cm4gdHJ1ZTsgLy8gUmVmZXJlbmNlIGNoZWNrXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZXAgY29tcGFyaXNvbiBmb3IgbmVzdGVkU3RlcHMgYXJyYXkgdG8gZGV0ZWN0IGNvbnRlbnQgY2hhbmdlc1xuICAgKiBUaGlzIGlzIGltcG9ydGFudCBmb3IgY29uZGl0aW9uIHN0ZXBzIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gYnJhbmNoZXNcbiAgICovXG4gIHByaXZhdGUgaGFzTmVzdGVkU3RlcHNDaGFuZ2VkKGN1cnJlbnQ6IGFueVtdLCBwcmV2aW91czogYW55W10pOiBib29sZWFuIHtcbiAgICBpZiAoIWN1cnJlbnQgJiYgIXByZXZpb3VzKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFjdXJyZW50IHx8ICFwcmV2aW91cykgcmV0dXJuIHRydWU7XG4gICAgaWYgKGN1cnJlbnQubGVuZ3RoICE9PSBwcmV2aW91cy5sZW5ndGgpIHJldHVybiB0cnVlO1xuICAgIGlmIChjdXJyZW50ID09PSBwcmV2aW91cykgcmV0dXJuIGZhbHNlOyAvLyBTYW1lIHJlZmVyZW5jZVxuXG4gICAgLy8gQ29tcGFyZSBlYWNoIHN0ZXAgYnkgSUQgdG8gZGV0ZWN0IGNvbnRlbnQgY2hhbmdlc1xuICAgIC8vIFRoaXMgaGFuZGxlcyBjYXNlcyB3aGVyZSBhcnJheSBsZW5ndGggaXMgc2FtZSBidXQgY29udGVudCBkaWZmZXJzIChlLmcuLCBzd2l0Y2hpbmcgYnJhbmNoZXMpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXJyZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjdXJyZW50U3RlcCA9IGN1cnJlbnRbaV07XG4gICAgICBjb25zdCBwcmV2aW91c1N0ZXAgPSBwcmV2aW91c1tpXTtcblxuICAgICAgaWYgKCFwcmV2aW91c1N0ZXApIHJldHVybiB0cnVlO1xuXG4gICAgICAvLyBDb21wYXJlIHN0ZXAgSURzIC0gaWYgSURzIGRpZmZlciwgY29udGVudCBoYXMgY2hhbmdlZFxuICAgICAgY29uc3QgY3VycmVudFN0ZXBJZCA9IGN1cnJlbnRTdGVwLmlkIHx8IGN1cnJlbnRTdGVwLnRlc3RTdGVwUmVzdWx0SWQ7XG4gICAgICBjb25zdCBwcmV2aW91c1N0ZXBJZCA9IHByZXZpb3VzU3RlcC5pZCB8fCBwcmV2aW91c1N0ZXAudGVzdFN0ZXBSZXN1bHRJZDtcblxuICAgICAgaWYgKGN1cnJlbnRTdGVwSWQgIT09IHByZXZpb3VzU3RlcElkKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBBbHNvIGNoZWNrIGlmIHRoZSBzdGVwIHR5cGUgY2hhbmdlZCAoaW1wb3J0YW50IGZvciBicmFuY2ggc3dpdGNoaW5nKVxuICAgICAgaWYgKGN1cnJlbnRTdGVwLnR5cGUgIT09IHByZXZpb3VzU3RlcC50eXBlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0ZXN0U3RlcFR5cGUgY2hhbmdlZCAoSUYgdnMgRUxTRV9JRiB2cyBFTFNFKVxuICAgICAgaWYgKGN1cnJlbnRTdGVwLnRlc3RTdGVwVHlwZSAhPT0gcHJldmlvdXNTdGVwLnRlc3RTdGVwVHlwZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgZm9yIHVwZGF0ZSB0b2tlbiBpZiBwcmVzZW50ICh1c2VkIHRvIGZvcmNlIHJlLXJlbmRlcilcbiAgICAgIGlmIChjdXJyZW50U3RlcC5fdXBkYXRlVG9rZW4gJiYgY3VycmVudFN0ZXAuX3VwZGF0ZVRva2VuICE9PSBwcmV2aW91c1N0ZXAuX3VwZGF0ZVRva2VuKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3RlcEtleShzdGVwOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmICghc3RlcCkgcmV0dXJuICcnO1xuICAgIC8vIENyZWF0ZSBhIGtleSBmcm9tIGltcG9ydGFudCBwcm9wZXJ0aWVzIHRoYXQgY2hhbmdlXG4gICAgLy8gSW5jbHVkZSBleGVjdXRpb25EYXRhLnN0ZXBTdGF0dXMgZm9yIGxpdmUgZXhlY3V0aW9uIHNjZW5hcmlvc1xuICAgIGNvbnN0IGV4ZWN1dGlvblN0YXR1cyA9IHN0ZXAuZXhlY3V0aW9uRGF0YT8uc3RlcFN0YXR1cyB8fCBzdGVwLnN0YXR1cyB8fCAnJztcbiAgICAvLyBJbmNsdWRlIGJyYW5jaGVzIGxlbmd0aCBmb3IgY29uZGl0aW9uLXN0ZXAgY2hhbmdlIGRldGVjdGlvblxuICAgIGNvbnN0IGJyYW5jaGVzTGVuZ3RoID0gKHN0ZXAuYnJhbmNoZXMgfHwgW10pLmxlbmd0aDtcbiAgICAvLyBJbmNsdWRlIHRvdGFsIHN1YlN0ZXBzIGNvdW50IGFjcm9zcyBhbGwgYnJhbmNoZXMgZm9yIG5lc3RlZCBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgY29uc3QgdG90YWxTdWJTdGVwcyA9IChzdGVwLmJyYW5jaGVzIHx8IFtdKS5yZWR1Y2UoKHN1bTogbnVtYmVyLCBicmFuY2g6IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIHN1bSArIChicmFuY2guc3ViU3RlcHM/Lmxlbmd0aCB8fCAwKTtcbiAgICB9LCAwKTtcbiAgICByZXR1cm4gYCR7c3RlcC5pZCB8fCAnJ31fJHtleGVjdXRpb25TdGF0dXN9XyR7c3RlcC5zdGF0dXMgfHwgJyd9XyR7c3RlcC5kdXJhdGlvbiB8fCAnJ31fJHtzdGVwLmV4cGFuZGVkIHx8IGZhbHNlfV8keyhzdGVwLmNoaWxkcmVuIHx8IFtdKS5sZW5ndGh9XyR7KHN0ZXAubmVzdGVkU3RlcHMgfHwgW10pLmxlbmd0aH1fJHsoc3RlcC5zdGVwcyB8fCBbXSkubGVuZ3RofV8ke2JyYW5jaGVzTGVuZ3RofV8ke3RvdGFsU3ViU3RlcHN9XyR7c3RlcC5zdGVwTnVtYmVyIHx8ICcnfV8ke3N0ZXAuc3RlcERlbGV0ZWQgfHwgZmFsc2V9YDtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZENvbXBvbmVudCgpIHtcbiAgICBcbiAgICBpZiAoIXRoaXMuY29udGFpbmVyIHx8ICF0aGlzLnN0ZXApIHJldHVybjtcblxuICAgIGNvbnN0IGN1cnJlbnRTdGVwSWQgPSAodGhpcy5zdGVwIGFzIGFueSkudGVzdFN0ZXBSZXN1bHRJZCB8fCB0aGlzLnN0ZXAuaWQ7XG4gICAgY29uc3QgY3VycmVudFN0ZXBUeXBlID0gdGhpcy5nZXRFZmZlY3RpdmVTdGVwVHlwZSh0aGlzLnN0ZXApIHx8ICh0aGlzLnN0ZXAgYXMgYW55KS50eXBlO1xuXG4gICAgLy8gT25seSBjbGVhciBhbmQgcmVjcmVhdGUgaWYgc3RlcCBJRCBvciB0eXBlIGFjdHVhbGx5IGNoYW5nZWRcbiAgICBjb25zdCBuZWVkc1JlY3JlYXRpb24gPSB0aGlzLmxhc3RTdGVwSWQgIT09IGN1cnJlbnRTdGVwSWQgfHwgdGhpcy5sYXN0U3RlcFR5cGUgIT09IGN1cnJlbnRTdGVwVHlwZTtcblxuICAgIGlmIChuZWVkc1JlY3JlYXRpb24pIHtcbiAgICAgIHRoaXMuY29udGFpbmVyLmNsZWFyKCk7XG4gICAgICAvLyBDbGVhciBzdG9yZWQgaW5zdGFuY2Ugd2hlbiByZWNyZWF0aW5nXG4gICAgICBjb25zdCBvbGRJbnN0YW5jZSA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMuZ2V0KHRoaXMuY29udGFpbmVyKTtcbiAgICAgIGlmIChvbGRJbnN0YW5jZSkge1xuICAgICAgICBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuZGVsZXRlKG9sZEluc3RhbmNlKTtcbiAgICAgIH1cbiAgICAgIFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMuZGVsZXRlKHRoaXMuY29udGFpbmVyKTtcbiAgICAgIFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRSZWZzLmRlbGV0ZSh0aGlzLmNvbnRhaW5lcik7XG4gICAgICB0aGlzLmxhc3RTdGVwSWQgPSBjdXJyZW50U3RlcElkO1xuICAgICAgdGhpcy5sYXN0U3RlcFR5cGUgPSBjdXJyZW50U3RlcFR5cGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIHNhbWUgc3RlcCwganVzdCB1cGRhdGUgcHJvcGVydGllcyB3aXRob3V0IGNsZWFyaW5nXG4gICAgICBjb25zdCBpbnN0YW5jZSA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMuZ2V0KHRoaXMuY29udGFpbmVyKTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRSZWZzLmdldCh0aGlzLmNvbnRhaW5lcik7XG4gICAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgICAgLy8gVXBkYXRlIGFsbCBwcm9wZXJ0aWVzXG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuc3RlcCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgIGlmIChrZXkgIT09ICd0eXBlJykge1xuICAgICAgICAgICAgLy8gVXNlIHNldElucHV0IGZvciBpbnB1dCBwcm9wZXJ0aWVzIHRvIHRyaWdnZXIgbmdPbkNoYW5nZXNcbiAgICAgICAgICAgIGlmIChrZXkgPT09ICdleHBhbmRlZCcgJiYgY29tcG9uZW50UmVmKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSAoaW5zdGFuY2UgYXMgYW55KVtrZXldO1xuICAgICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9ICh0aGlzLnN0ZXAgYXMgYW55KVtrZXldO1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIChjb21wb25lbnRSZWYgYXMgYW55KS5zZXRJbnB1dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIChjb21wb25lbnRSZWYgYXMgYW55KS5zZXRJbnB1dCgnZXhwYW5kZWQnLCBuZXdWYWx1ZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gRmFsbGJhY2s6IG1hbnVhbGx5IHRyaWdnZXIgbmdPbkNoYW5nZXNcbiAgICAgICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KVtrZXldID0gbmV3VmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAoaW5zdGFuY2UgYXMgYW55KS5uZ09uQ2hhbmdlcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgY2hhbmdlczogU2ltcGxlQ2hhbmdlcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgZXhwYW5kZWQ6IG5ldyBTaW1wbGVDaGFuZ2UocHJldmlvdXNWYWx1ZSwgbmV3VmFsdWUsIHByZXZpb3VzVmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5uZ09uQ2hhbmdlcyhjaGFuZ2VzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpW2tleV0gPSAodGhpcy5zdGVwIGFzIGFueSlba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnID0geyAuLi4oaW5zdGFuY2UgYXMgYW55KS5jb25maWcsIC4uLnRoaXMuc3RlcCB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIFN5bmMgZmlsZS1kb3dubG9hZCAoZ2VuZXJhdGVEb2N1bWVudCkgcHJvcHMgZnJvbSBnZW5lcmF0ZURvY3VtZW50UmVzdWx0XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZVR5cGVGb3JVcGRhdGUgPSB0aGlzLmdldEVmZmVjdGl2ZVN0ZXBUeXBlKHRoaXMuc3RlcCkgfHwgKHRoaXMuc3RlcCBhcyBhbnkpLnR5cGU7XG4gICAgICAgIGlmIChlZmZlY3RpdmVUeXBlRm9yVXBkYXRlID09PSAnZmlsZS1kb3dubG9hZCcpIHtcbiAgICAgICAgICBjb25zdCBnZCA9ICh0aGlzLnN0ZXAgYXMgYW55KS5leGVjdXRlZFJlc3VsdD8uZ2VuZXJhdGVEb2N1bWVudFJlc3VsdDtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5maWxlTmFtZSA9IGdkPy5maWxlTmFtZSA/PyAoaW5zdGFuY2UgYXMgYW55KS5maWxlTmFtZSA/PyAnJztcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5maWxlVHlwZSA9IGdkPy5maWxlVHlwZSA/PyAoaW5zdGFuY2UgYXMgYW55KS5maWxlVHlwZSA/PyAnJztcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5maWxlUGF0aCA9IGdkPy5zM0ZpbGVOYW1lID8/IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVQYXRoO1xuICAgICAgICAgIGNvbnN0IHRpZCA9ICh0aGlzLnN0ZXAgYXMgYW55KS50ZXN0U3RlcFJlc3VsdElkO1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmlzRG93bmxvYWRpbmcgPSAhIXRpZCAmJiB0aGlzLmRvd25sb2FkaW5nU3RlcElkID09PSB0aWQ7XG4gICAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmZpbGVOYW1lID0gKGluc3RhbmNlIGFzIGFueSkuZmlsZU5hbWU7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuZmlsZVR5cGUgPSAoaW5zdGFuY2UgYXMgYW55KS5maWxlVHlwZTtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5maWxlUGF0aCA9IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVQYXRoO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBVcGRhdGUgc2VsZkhlYWxBbmFseXNpcyB1c2luZyBoYW5kbGVyIGlmIGF2YWlsYWJsZVxuICAgICAgICBpZiAodGhpcy5nZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlciAmJiB0aGlzLnN0ZXApIHtcbiAgICAgICAgICBjb25zdCBzZWxmSGVhbEFuYWx5c2lzID0gdGhpcy5nZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlcih0aGlzLnN0ZXApO1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnNlbGZIZWFsQW5hbHlzaXMgPSBzZWxmSGVhbEFuYWx5c2lzO1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5zZWxmSGVhbEFuYWx5c2lzID0gc2VsZkhlYWxBbmFseXNpcztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gRW5zdXJlIGV2ZW50IHN1YnNjcmlwdGlvbnMgYXJlIHN0aWxsIGFjdGl2ZSBmb3Igc2VsZkhlYWxBY3Rpb25cbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLnNlbGZIZWFsQWN0aW9uICYmIHRoaXMub25TZWxmSGVhbEFjdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgICAvLyBUcmFjayBzdWJzY3JpcHRpb25zIHRvIGF2b2lkIGR1cGxpY2F0ZXNcbiAgICAgICAgICBsZXQgc3Vic2NyaWJlZEV2ZW50cyA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5nZXQoaW5zdGFuY2UpO1xuICAgICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cykge1xuICAgICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgICAgU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLnNldChpbnN0YW5jZSwgc3Vic2NyaWJlZEV2ZW50cyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cy5oYXMoJ3NlbGZIZWFsQWN0aW9uJykpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnNlbGZIZWFsQWN0aW9uLnN1YnNjcmliZSgoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLm9uU2VsZkhlYWxBY3Rpb25IYW5kbGVyPy4oZXZlbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzLmFkZCgnc2VsZkhlYWxBY3Rpb24nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVXBkYXRlIGhhbmRsZXIgcmVmZXJlbmNlc1xuICAgICAgICBpZiAodGhpcy5vblNlbGZIZWFsQWN0aW9uSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25TZWxmSGVhbEFjdGlvbkhhbmRsZXIgPSB0aGlzLm9uU2VsZkhlYWxBY3Rpb25IYW5kbGVyO1xuICAgICAgICBpZiAodGhpcy5nZXRTZWxmSGVhbExvYWRpbmdTdGF0ZXNIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5nZXRTZWxmSGVhbExvYWRpbmdTdGF0ZXNIYW5kbGVyID0gdGhpcy5nZXRTZWxmSGVhbExvYWRpbmdTdGF0ZXNIYW5kbGVyO1xuICAgICAgICAvLyBVcGRhdGUga2V5IGZvciBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgICAgIHRoaXMucHJldmlvdXNTdGVwS2V5ID0gdGhpcy5nZXRTdGVwS2V5KHRoaXMuc3RlcCk7XG4gICAgICAgIC8vIENvbXBvbmVudCBhbHJlYWR5IGV4aXN0cyBhbmQgaXMgcmVhZHksIGVtaXQgaW1tZWRpYXRlbHlcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jb21wb25lbnRSZWFkeS5lbWl0KCk7XG4gICAgICAgIH0sIDApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZWZmZWN0aXZlVHlwZSA9IHRoaXMuZ2V0RWZmZWN0aXZlU3RlcFR5cGUodGhpcy5zdGVwKSB8fCAodGhpcy5zdGVwIGFzIGFueSkudHlwZTtcbiAgICBjb25zdCBjb21wb25lbnRUeXBlID0gdGhpcy5jb21wb25lbnRNYXAuZ2V0KGVmZmVjdGl2ZVR5cGUpO1xuXG4gICAgaWYgKGNvbXBvbmVudFR5cGUpIHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHRoaXMuY29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRUeXBlKTtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gY29tcG9uZW50UmVmLmluc3RhbmNlO1xuXG4gICAgICAvLyBTdG9yZSBjb21wb25lbnQgaW5zdGFuY2UgYW5kIHJlZiBpbiBXZWFrTWFwIGZvciBmdXR1cmUgdXBkYXRlc1xuICAgICAgU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlcy5zZXQodGhpcy5jb250YWluZXIsIGluc3RhbmNlKTtcbiAgICAgIFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRSZWZzLnNldCh0aGlzLmNvbnRhaW5lciwgY29tcG9uZW50UmVmKTtcblxuICAgICAgLy8gU3RvcmUgY29tcG9uZW50IHJlZmVyZW5jZSBmb3IgY2xlYW51cFxuICAgICAgKGNvbXBvbmVudFJlZiBhcyBhbnkpLl9jb21wb25lbnRSZWYgPSBjb21wb25lbnRSZWY7XG5cbiAgICAgIC8vIFNwcmVhZCBjb25maWcgcHJvcGVydGllcyBhcyBpbmRpdmlkdWFsIGlucHV0cyBmb3IgY29tcG9uZW50cyB0aGF0IHVzZSBpbmRpdmlkdWFsIGlucHV0c1xuICAgICAgLy8gVGhpcyBzdXBwb3J0cyBib3RoIHBhdHRlcm5zOiBjb21wb25lbnRzIHRoYXQgYWNjZXB0IGNvbmZpZyBkaXJlY3RseSBhbmQgdGhvc2UgdGhhdCB1c2UgaW5kaXZpZHVhbCBpbnB1dHNcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuc3RlcCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBpZiAoa2V5ICE9PSAndHlwZScpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KVtrZXldID0gKHRoaXMuc3RlcCBhcyBhbnkpW2tleV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBsb29wLXN0ZXA6IG1hcCBjaGlsZHJlbiB0byBuZXN0ZWRTdGVwcyBpZiBuZXN0ZWRTdGVwcyBpcyBub3QgcHJlc2VudFxuICAgICAgaWYgKHRoaXMuc3RlcC50eXBlID09PSAnbG9vcCcgJiYgKHRoaXMuc3RlcCBhcyBhbnkpLmNoaWxkcmVuICYmICEodGhpcy5zdGVwIGFzIGFueSkubmVzdGVkU3RlcHMpIHtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkubmVzdGVkU3RlcHMgPSAodGhpcy5zdGVwIGFzIGFueSkuY2hpbGRyZW47XG4gICAgICB9XG5cbiAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGxvb3Atc3RlcDogc2V0IGxvb3BUeXBlIGJhc2VkIG9uIGFjdGlvbk5hbWUgb3IgdGVzdFN0ZXBUeXBlXG4gICAgICBpZiAodGhpcy5zdGVwLnR5cGUgPT09ICdsb29wJykge1xuICAgICAgICAvLyBTZXQgbG9vcFR5cGUgaWYgbm90IGFscmVhZHkgc2V0XG4gICAgICAgIGlmICghKGluc3RhbmNlIGFzIGFueSkubG9vcFR5cGUpIHtcbiAgICAgICAgICBjb25zdCBhY3Rpb25OYW1lID0gKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGlvbk5hbWU7XG4gICAgICAgICAgY29uc3QgdGVzdFN0ZXBUeXBlID0gKHRoaXMuc3RlcCBhcyBhbnkpLnRlc3RTdGVwVHlwZTtcbiAgICAgICAgICBpZiAoYWN0aW9uTmFtZSA9PT0gJ0ZPUl9MT09QJyB8fCB0ZXN0U3RlcFR5cGUgPT09ICdGT1JfTE9PUCcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmxvb3BUeXBlID0gJ2Zvcic7XG4gICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb25OYW1lID09PSAnV0hJTEVfTE9PUCcgfHwgdGVzdFN0ZXBUeXBlID09PSAnV0hJTEVfTE9PUCcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmxvb3BUeXBlID0gJ3doaWxlJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gRW5zdXJlIHRpdGxlIGlzIHNldCBmcm9tIGFjdGlvbiBpZiB0aXRsZSBpcyBub3QgcHJlc2VudCBvciBlbXB0eVxuICAgICAgICBpZiAoKCEoaW5zdGFuY2UgYXMgYW55KS50aXRsZSB8fCAhKGluc3RhbmNlIGFzIGFueSkudGl0bGUudHJpbSgpKSAmJiAodGhpcy5zdGVwIGFzIGFueSkuYWN0aW9uKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkudGl0bGUgPSAodGhpcy5zdGVwIGFzIGFueSkuYWN0aW9uO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGxvb3Atc3RlcDogaW5pdGlhbGl6ZSBpdGVyYXRpb25zIGlmIG5vdCBwcmVzZW50XG4gICAgICBpZiAodGhpcy5zdGVwLnR5cGUgPT09ICdsb29wJyAmJiAhKGluc3RhbmNlIGFzIGFueSkuaXRlcmF0aW9ucykge1xuICAgICAgICBjb25zb2xlLmxvZyhcIiBjaGFuZ2VzWydzZWxlY3RlZEl0ZXJhdGlvbklkJ10gc3RlcFwiLCB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQsIChpbnN0YW5jZSBhcyBhbnkpLml0ZXJhdGlvbnMpXG4gICAgICAgIC8vIFVzZSBoYW5kbGVyIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHRyeSB0byBpbml0aWFsaXplIGZyb20gc3RlcC5leGVjdXRlZFJlc3VsdC5zdGVwUmVzdWx0XG4gICAgICAgIGlmICh0aGlzLmdldExvb3BJdGVyYXRpb25zSGFuZGxlcikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLml0ZXJhdGlvbnMgPSB0aGlzLmdldExvb3BJdGVyYXRpb25zSGFuZGxlcih0aGlzLnN0ZXApO1xuICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLnN0ZXAgYXMgYW55KS5leGVjdXRlZFJlc3VsdD8uc3RlcFJlc3VsdCAmJiBBcnJheS5pc0FycmF5KCh0aGlzLnN0ZXAgYXMgYW55KS5leGVjdXRlZFJlc3VsdC5zdGVwUmVzdWx0KSkge1xuICAgICAgICAgIC8vIEluaXRpYWxpemUgaXRlcmF0aW9ucyBkaXJlY3RseSBmcm9tIHN0ZXBSZXN1bHRcbiAgICAgICAgICBjb25zdCBpdGVyYXRpb25zOiBhbnlbXSA9IFtdO1xuICAgICAgICAgICh0aGlzLnN0ZXAgYXMgYW55KS5leGVjdXRlZFJlc3VsdC5zdGVwUmVzdWx0LmZvckVhY2goKGl0ZXJhdGlvbjogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpdGVyYXRpb25JbmRleCA9IGl0ZXJhdGlvbi5pbmRleCAhPT0gdW5kZWZpbmVkICYmIGl0ZXJhdGlvbi5pbmRleCAhPT0gbnVsbCA/IGl0ZXJhdGlvbi5pbmRleCA6IGl0ZXJhdGlvbnMubGVuZ3RoO1xuICAgICAgICAgICAgbGV0IHN0YXR1czogJ3N1Y2Nlc3MnIHwgJ2ZhaWxlZCcgfCAncGVuZGluZycgfCAncnVubmluZycgPSAncGVuZGluZyc7XG4gICAgICAgICAgICBpZiAoaXRlcmF0aW9uLnN0YXR1cykge1xuICAgICAgICAgICAgICBjb25zdCBzdGF0dXNMb3dlciA9IGl0ZXJhdGlvbi5zdGF0dXMudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgaWYgKHN0YXR1c0xvd2VyID09PSAnc3VjY2VzcycgfHwgc3RhdHVzTG93ZXIgPT09ICdwYXNzZWQnKSB7XG4gICAgICAgICAgICAgICAgc3RhdHVzID0gJ3N1Y2Nlc3MnO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1c0xvd2VyID09PSAnZmFpbHVyZScgfHwgc3RhdHVzTG93ZXIgPT09ICdmYWlsZWQnKSB7XG4gICAgICAgICAgICAgICAgc3RhdHVzID0gJ2ZhaWxlZCc7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzTG93ZXIgPT09ICdydW5uaW5nJyB8fCBzdGF0dXNMb3dlciA9PT0gJ2luX3Byb2dyZXNzJykge1xuICAgICAgICAgICAgICAgIHN0YXR1cyA9ICdydW5uaW5nJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgaWQ6IGBpdGVyLSR7aXRlcmF0aW9uSW5kZXh9YCxcbiAgICAgICAgICAgICAgbGFiZWw6IGBpdGVyICR7aXRlcmF0aW9uSW5kZXh9YCxcbiAgICAgICAgICAgICAgc3RhdHVzOiBzdGF0dXMsXG4gICAgICAgICAgICAgIHN1YlN0ZXBzOiBbXSxcbiAgICAgICAgICAgICAgaW5kZXg6IGl0ZXJhdGlvbkluZGV4XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5pdGVyYXRpb25zID0gaXRlcmF0aW9ucztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBsb29wLXN0ZXA6IHNldCBkZWZhdWx0SXRlcmF0aW9uIGFuZCBzZWxlY3RlZEl0ZXJhdGlvbklkXG4gICAgICBpZiAodGhpcy5zdGVwLnR5cGUgPT09ICdsb29wJykge1xuICAgICAgICBjb25zb2xlLmxvZyhcIiBjaGFuZ2VzWydzZWxlY3RlZEl0ZXJhdGlvbklkJ10gc3RlcCAyXCIsIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZCwgKGluc3RhbmNlIGFzIGFueSkuaXRlcmF0aW9ucylcbiAgICAgICAgLy8gU2V0IGRlZmF1bHRJdGVyYXRpb24gdG8gJ2xhc3QnIGlmIG5vdCBhbHJlYWR5IHNldFxuICAgICAgICBpZiAoIShpbnN0YW5jZSBhcyBhbnkpLmRlZmF1bHRJdGVyYXRpb24pIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5kZWZhdWx0SXRlcmF0aW9uID0gJ2xhc3QnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHNlbGVjdGVkSXRlcmF0aW9uSWQgLSBwcmlvcml0aXplIGlucHV0IHZhbHVlLCB0aGVuIHN0ZXAgdmFsdWUsIHRoZW4gbGFzdCBpdGVyYXRpb25cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb25JZCA9IHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZDtcbiAgICAgICAgfSBlbHNlIGlmICgodGhpcy5zdGVwIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb25JZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb25JZCA9ICh0aGlzLnN0ZXAgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFNldCBzZWxlY3RlZEl0ZXJhdGlvbklkIHRvIGxhc3QgaXRlcmF0aW9uIGlmIG5vdCBhbHJlYWR5IHNldFxuICAgICAgICAgIGNvbnN0IGl0ZXJhdGlvbnMgPSAoaW5zdGFuY2UgYXMgYW55KS5pdGVyYXRpb25zO1xuICAgICAgICAgIGlmIChpdGVyYXRpb25zICYmIEFycmF5LmlzQXJyYXkoaXRlcmF0aW9ucykgJiYgaXRlcmF0aW9ucy5sZW5ndGggPiAwICYmICEoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkKSB7XG4gICAgICAgICAgICBjb25zdCBsYXN0SXRlcmF0aW9uID0gaXRlcmF0aW9uc1tpdGVyYXRpb25zLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb25JZCA9IGxhc3RJdGVyYXRpb24uaWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIHN0ZXAtZ3JvdXA6IG1hcCBjaGlsZHJlbiB0byBzdGVwcyBpZiBzdGVwcyBpcyBub3QgcHJlc2VudFxuICAgICAgaWYgKHRoaXMuc3RlcC50eXBlID09PSAnc3RlcC1ncm91cCcgJiYgKHRoaXMuc3RlcCBhcyBhbnkpLmNoaWxkcmVuICYmICEodGhpcy5zdGVwIGFzIGFueSkuc3RlcHMpIHtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc3RlcHMgPSAodGhpcy5zdGVwIGFzIGFueSkuY2hpbGRyZW47XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmdyb3VwTmFtZSA9ICh0aGlzLnN0ZXAgYXMgYW55KS5hY3Rpb247XG4gICAgICB9XG5cbiAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGZpbGUtZG93bmxvYWQgKGluY2x1ZGluZyBnZW5lcmF0ZURvY3VtZW50KTogc2V0IHByb3BzIGZyb20gZ2VuZXJhdGVEb2N1bWVudFJlc3VsdCBhbmQgd2lyZSBoYW5kbGVyc1xuICAgICAgaWYgKGVmZmVjdGl2ZVR5cGUgPT09ICdmaWxlLWRvd25sb2FkJykge1xuICAgICAgICBjb25zdCBnZCA9ICh0aGlzLnN0ZXAgYXMgYW55KS5leGVjdXRlZFJlc3VsdD8uZ2VuZXJhdGVEb2N1bWVudFJlc3VsdDtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZmlsZU5hbWUgPSBnZD8uZmlsZU5hbWUgPz8gKGluc3RhbmNlIGFzIGFueSkuZmlsZU5hbWUgPz8gJyc7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmZpbGVUeXBlID0gZ2Q/LmZpbGVUeXBlID8/IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVUeXBlID8/ICcnO1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5maWxlUGF0aCA9IGdkPy5zM0ZpbGVOYW1lID8/IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVQYXRoO1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5kb3dubG9hZGVkID0gKGluc3RhbmNlIGFzIGFueSkuZG93bmxvYWRlZCA/PyBmYWxzZTtcbiAgICAgICAgY29uc3QgdGlkID0gKHRoaXMuc3RlcCBhcyBhbnkpLnRlc3RTdGVwUmVzdWx0SWQ7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmlzRG93bmxvYWRpbmcgPSAhIXRpZCAmJiB0aGlzLmRvd25sb2FkaW5nU3RlcElkID09PSB0aWQ7XG4gICAgICAgIGlmICghKGluc3RhbmNlIGFzIGFueSkudGl0bGUgJiYgKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGlvbikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnRpdGxlID0gKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmZpbGVOYW1lID0gKGluc3RhbmNlIGFzIGFueSkuZmlsZU5hbWU7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmZpbGVUeXBlID0gKGluc3RhbmNlIGFzIGFueSkuZmlsZVR5cGU7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmZpbGVQYXRoID0gKGluc3RhbmNlIGFzIGFueSkuZmlsZVBhdGg7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmRvd25sb2FkZWQgPSAoaW5zdGFuY2UgYXMgYW55KS5kb3dubG9hZGVkO1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS50aXRsZSkgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLnRpdGxlID0gKGluc3RhbmNlIGFzIGFueSkudGl0bGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmRvd25sb2FkICYmIHRoaXMub25Eb3dubG9hZEhhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5kb3dubG9hZC5zdWJzY3JpYmUoKGV2OiBhbnkpID0+IHRoaXMub25Eb3dubG9hZEhhbmRsZXIhKGV2KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmZpbGVQYXRoQ29waWVkICYmIHRoaXMub25GaWxlUGF0aENvcGllZEhhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5maWxlUGF0aENvcGllZC5zdWJzY3JpYmUoKGV2OiBhbnkpID0+IHRoaXMub25GaWxlUGF0aENvcGllZEhhbmRsZXIhKGV2KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLnRleHRDb3BpZWQgJiYgdGhpcy5vblRleHRDb3BpZWRIYW5kbGVyKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkudGV4dENvcGllZC5zdWJzY3JpYmUoKGV2OiBhbnkpID0+IHRoaXMub25UZXh0Q29waWVkSGFuZGxlciEoZXYpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBjb25kaXRpb24tc3RlcDogc2V0IGJyYW5jaGVzIGFuZCBjb25kaXRpb25UZXh0XG4gICAgICBpZiAodGhpcy5zdGVwLnR5cGUgPT09ICdjb25kaXRpb24nKSB7XG4gICAgICAgIC8vIFNldCBicmFuY2hlcyAtIHByaW9yaXRpemUgc3RlcC5icmFuY2hlcyBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2UgaGFuZGxlclxuICAgICAgICBpZiAoKHRoaXMuc3RlcCBhcyBhbnkpLmJyYW5jaGVzICYmIEFycmF5LmlzQXJyYXkoKHRoaXMuc3RlcCBhcyBhbnkpLmJyYW5jaGVzKSkge1xuICAgICAgICAgIC8vIENyZWF0ZSBkZWVwIGNvcHkgdG8gZW5zdXJlIHByb3BlciBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuYnJhbmNoZXMgPSAodGhpcy5zdGVwIGFzIGFueSkuYnJhbmNoZXMubWFwKChicmFuY2g6IGFueSkgPT4gKHtcbiAgICAgICAgICAgIC4uLmJyYW5jaCxcbiAgICAgICAgICAgIHN1YlN0ZXBzOiBicmFuY2guc3ViU3RlcHMgPyBbLi4uYnJhbmNoLnN1YlN0ZXBzXSA6IFtdXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKCEoaW5zdGFuY2UgYXMgYW55KS5icmFuY2hlcyAmJiB0aGlzLmdldENvbmRpdGlvbkJyYW5jaGVzSGFuZGxlcikge1xuICAgICAgICAgIGNvbnN0IGhhbmRsZXJCcmFuY2hlcyA9IHRoaXMuZ2V0Q29uZGl0aW9uQnJhbmNoZXNIYW5kbGVyKHRoaXMuc3RlcCk7XG4gICAgICAgICAgLy8gQ3JlYXRlIGRlZXAgY29weSB0byBlbnN1cmUgcHJvcGVyIGNoYW5nZSBkZXRlY3Rpb25cbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5icmFuY2hlcyA9IGhhbmRsZXJCcmFuY2hlcy5tYXAoKGJyYW5jaDogYW55KSA9PiAoe1xuICAgICAgICAgICAgLi4uYnJhbmNoLFxuICAgICAgICAgICAgc3ViU3RlcHM6IGJyYW5jaC5zdWJTdGVwcyA/IFsuLi5icmFuY2guc3ViU3RlcHNdIDogW11cbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2V0IGNvbmRpdGlvblRleHQgZnJvbSBhY3Rpb24gaWYgY29uZGl0aW9uVGV4dCBpcyBub3QgcHJlc2VudFxuICAgICAgICBpZiAoIShpbnN0YW5jZSBhcyBhbnkpLmNvbmRpdGlvblRleHQgJiYgKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGlvbikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmRpdGlvblRleHQgPSAodGhpcy5zdGVwIGFzIGFueSkuYWN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNldCBpc0xvYWRpbmcgdXNpbmcgaGFuZGxlciBpZiBhdmFpbGFibGVcbiAgICAgICAgaWYgKHRoaXMuaXNTdGVwTG9hZGluZ0hhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5pc0xvYWRpbmcgPSB0aGlzLmlzU3RlcExvYWRpbmdIYW5kbGVyKHRoaXMuc3RlcCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUGFzcyBhY3RpdmVCcmFuY2hTdGVwSWQgaWYgcHJlc2VudFxuICAgICAgICBpZiAoKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGl2ZUJyYW5jaFN0ZXBJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuYWN0aXZlQnJhbmNoU3RlcElkID0gKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGl2ZUJyYW5jaFN0ZXBJZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBhaS1hZ2VudC1zdGVwOiBlbnN1cmUgdGl0bGUgYW5kIHByb21wdCBhcmUgc2V0IGZyb20gYWN0aW9uXG4gICAgICBpZiAodGhpcy5zdGVwLnR5cGUgPT09ICdhaS1hZ2VudCcpIHtcbiAgICAgICAgLy8gU2V0IHRpdGxlIGZyb20gYWN0aW9uIGlmIHRpdGxlIGlzIG5vdCBwcmVzZW50IG9yIGVtcHR5XG4gICAgICAgIGlmICgoIShpbnN0YW5jZSBhcyBhbnkpLnRpdGxlIHx8ICEoaW5zdGFuY2UgYXMgYW55KS50aXRsZS50cmltKCkpICYmICh0aGlzLnN0ZXAgYXMgYW55KS5hY3Rpb24pIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS50aXRsZSA9ICh0aGlzLnN0ZXAgYXMgYW55KS5hY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2V0IHByb21wdCBmcm9tIGFjdGlvbiBpZiBwcm9tcHQgaXMgbm90IHByZXNlbnQgb3IgZW1wdHlcbiAgICAgICAgaWYgKCghKGluc3RhbmNlIGFzIGFueSkucHJvbXB0IHx8ICEoaW5zdGFuY2UgYXMgYW55KS5wcm9tcHQudHJpbSgpKSAmJiAodGhpcy5zdGVwIGFzIGFueSkuYWN0aW9uKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkucHJvbXB0ID0gKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICAvLyBFbnN1cmUgYWN0aW9ucyBhcnJheSBpcyBzZXQgaWYgbm90IHByZXNlbnRcbiAgICAgICAgaWYgKCEoaW5zdGFuY2UgYXMgYW55KS5hY3Rpb25zICYmIHRoaXMuZm9ybWF0QWN0aW9uc0hhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5hY3Rpb25zID0gdGhpcy5mb3JtYXRBY3Rpb25zSGFuZGxlcih0aGlzLnN0ZXApO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNldCBhY3Rpb25Db3VudCBpZiBub3QgcHJlc2VudFxuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuYWN0aW9uQ291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IGFjdGlvbnMgPSAoaW5zdGFuY2UgYXMgYW55KS5hY3Rpb25zIHx8IFtdO1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmFjdGlvbkNvdW50ID0gYWN0aW9ucy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2V0IHNlbGVjdGVkVGFiSW5wdXQgaWYgbm90IHByZXNlbnRcbiAgICAgICAgaWYgKCEoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZFRhYklucHV0KSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRUYWJJbnB1dCA9ICdhY3Rpb24tdHJhY2UnO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFdpcmUgdXAgY29tbW9uIGV2ZW50IGVtaXR0ZXJzIGZvciBhcGksIGFpLWFnZW50LCBsb29wLCBjb25kaXRpb24sIGFuZCBiYXNpYyBzdGVwc1xuICAgICAgaWYgKHRoaXMuc3RlcC50eXBlID09PSAnYXBpJyB8fCB0aGlzLnN0ZXAudHlwZSA9PT0gJ2FpLWFnZW50JyB8fCB0aGlzLnN0ZXAudHlwZSA9PT0gJ2xvb3AnIHx8IHRoaXMuc3RlcC50eXBlID09PSAnY29uZGl0aW9uJyB8fCB0aGlzLnN0ZXAudHlwZSA9PT0gJ2Jhc2ljJykge1xuICAgICAgICAvLyBTdWJzY3JpYmUgdG8gY29tbW9uIG91dHB1dCBldmVudHMgYW5kIGNhbGwgaGFuZGxlcnNcbiAgICAgICAgLy8gRXZlbnRFbWl0dGVycyBhcmUgU3ViamVjdHMsIHNvIHdlIGNhbiBzdWJzY3JpYmUgdG8gdGhlbVxuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkubWFrZUN1cnJlbnRCYXNlbGluZSAmJiB0aGlzLm9uTWFrZUN1cnJlbnRCYXNlbGluZUhhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5tYWtlQ3VycmVudEJhc2VsaW5lLnN1YnNjcmliZSgoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbk1ha2VDdXJyZW50QmFzZWxpbmVIYW5kbGVyPy4oZXZlbnQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS51cGxvYWRCYXNlbGluZSAmJiB0aGlzLm9uVXBsb2FkQmFzZWxpbmVIYW5kbGVyKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkudXBsb2FkQmFzZWxpbmUuc3Vic2NyaWJlKChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uVXBsb2FkQmFzZWxpbmVIYW5kbGVyPy4oZXZlbnQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5hbmFseXplICYmIHRoaXMub25BbmFseXplSGFuZGxlcikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmFuYWx5emUuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25BbmFseXplSGFuZGxlcj8uKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLnZpZXdGdWxsTG9ncyAmJiB0aGlzLm9uVmlld0Z1bGxMb2dzSGFuZGxlcikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnZpZXdGdWxsTG9ncy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vblZpZXdGdWxsTG9nc0hhbmRsZXI/LigpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5zZWxmSGVhbEFjdGlvbiAmJiB0aGlzLm9uU2VsZkhlYWxBY3Rpb25IYW5kbGVyKSB7XG4gICAgICAgICAgLy8gVHJhY2sgc3Vic2NyaXB0aW9ucyB0byBhdm9pZCBkdXBsaWNhdGVzXG4gICAgICAgICAgbGV0IHN1YnNjcmliZWRFdmVudHMgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuZ2V0KGluc3RhbmNlKTtcbiAgICAgICAgICBpZiAoIXN1YnNjcmliZWRFdmVudHMpIHtcbiAgICAgICAgICAgIHN1YnNjcmliZWRFdmVudHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICAgIFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5zZXQoaW5zdGFuY2UsIHN1YnNjcmliZWRFdmVudHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXN1YnNjcmliZWRFdmVudHMuaGFzKCdzZWxmSGVhbEFjdGlvbicpKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zZWxmSGVhbEFjdGlvbi5zdWJzY3JpYmUoKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5vblNlbGZIZWFsQWN0aW9uSGFuZGxlcj8uKGV2ZW50KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cy5hZGQoJ3NlbGZIZWFsQWN0aW9uJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIE5vdGU6IG9uSnNvblBhdGhDb3BpZWRIYW5kbGVyIGlzIHNldCBhcyBpbnB1dCBwcm9wZXJ0eSAobGluZSA4MjUpLCBzbyB3ZSBkb24ndCBuZWVkIHRvIHN1YnNjcmliZSB0byBqc29uUGF0aENvcGllZCBldmVudFxuICAgICAgICAvLyBUaGUgQVBJIHN0ZXAgY29tcG9uZW50IGNhbGxzIHRoZSBoYW5kbGVyIGRpcmVjdGx5LCBhdm9pZGluZyBkdXBsaWNhdGUgY2FsbHNcbiAgICAgIH1cblxuICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgbG9vcC1zdGVwOiB3aXJlIHVwIG9uVmlld0FsbEl0ZXJhdGlvbnMgZXZlbnRcbiAgICAgIGlmICh0aGlzLnN0ZXAudHlwZSA9PT0gJ2xvb3AnKSB7XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5vblZpZXdBbGxJdGVyYXRpb25zICYmIHRoaXMub25WaWV3QWxsSXRlcmF0aW9uc0hhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5vblZpZXdBbGxJdGVyYXRpb25zLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uVmlld0FsbEl0ZXJhdGlvbnNIYW5kbGVyPy4odGhpcy5zdGVwKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBjb25kaXRpb24tc3RlcDogd2lyZSB1cCBvbkV4cGFuZCBldmVudFxuICAgICAgaWYgKHRoaXMuc3RlcC50eXBlID09PSAnY29uZGl0aW9uJykge1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkub25FeHBhbmQgJiYgdGhpcy5vbkV4cGFuZEhhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5vbkV4cGFuZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgLy8gQ2FsbCBvbkV4cGFuZEhhbmRsZXIgd2l0aCB0aGUgc3RlcCBjb25maWdcbiAgICAgICAgICAgIHRoaXMub25FeHBhbmRIYW5kbGVyPy4odGhpcy5zdGVwKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXaXJlIHVwIG9uQnJhbmNoQ2xpY2tFdmVudCBmb3IgbmVzdGVkIGNvbmRpdGlvbiBzdGVwc1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkub25CcmFuY2hDbGlja0V2ZW50ICYmIHRoaXMub25Db25kaXRpb25CcmFuY2hDbGlja0hhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5vbkJyYW5jaENsaWNrRXZlbnQuc3Vic2NyaWJlKChicmFuY2g6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkNvbmRpdGlvbkJyYW5jaENsaWNrSGFuZGxlcj8uKHRoaXMuc3RlcCwgYnJhbmNoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBFbnN1cmUgZXhwYW5kZWQgcHJvcGVydHkgaXMgcGFzc2VkIGNvcnJlY3RseVxuICAgICAgLy8gVXNlIGlzU3RlcEV4cGFuZGVkSGFuZGxlciBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2Ugc3RlcC5leHBhbmRlZCBvciBzdGVwLmNvbmZpZy5leHBhbmRlZFxuICAgICAgaWYgKHRoaXMuaXNTdGVwRXhwYW5kZWRIYW5kbGVyICYmIHRoaXMuc3RlcCkge1xuICAgICAgICBjb25zdCBleHBhbmRlZFN0YXRlID0gdGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXIodGhpcy5zdGVwKTtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZXhwYW5kZWQgPSBleHBhbmRlZFN0YXRlO1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmV4cGFuZGVkID0gZXhwYW5kZWRTdGF0ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICgodGhpcy5zdGVwIGFzIGFueSkuZXhwYW5kZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5leHBhbmRlZCA9ICh0aGlzLnN0ZXAgYXMgYW55KS5leHBhbmRlZDtcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5leHBhbmRlZCA9ICh0aGlzLnN0ZXAgYXMgYW55KS5leHBhbmRlZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBQYXNzIGhhbmRsZXIgZnVuY3Rpb25zIHRvIHRoZSBjb21wb25lbnQgaW5zdGFuY2VcbiAgICAgIGlmICh0aGlzLm9uRXhwYW5kSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25FeHBhbmRIYW5kbGVyID0gdGhpcy5vbkV4cGFuZEhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5nZXRDb25kaXRpb25CcmFuY2hlc0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmdldENvbmRpdGlvbkJyYW5jaGVzSGFuZGxlciA9IHRoaXMuZ2V0Q29uZGl0aW9uQnJhbmNoZXNIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMuaXNTdGVwTG9hZGluZ0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmlzU3RlcExvYWRpbmdIYW5kbGVyID0gdGhpcy5pc1N0ZXBMb2FkaW5nSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLmlzU3RlcEV4cGFuZGVkSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkuaXNTdGVwRXhwYW5kZWRIYW5kbGVyID0gdGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5jb252ZXJ0TXNUb1NlY29uZHNIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5jb252ZXJ0TXNUb1NlY29uZHNIYW5kbGVyID0gdGhpcy5jb252ZXJ0TXNUb1NlY29uZHNIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMuZm9ybWF0RmFpbHVyZURldGFpbHNIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5mb3JtYXRGYWlsdXJlRGV0YWlsc0hhbmRsZXIgPSB0aGlzLmZvcm1hdEZhaWx1cmVEZXRhaWxzSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLmdldFNlbGZIZWFsQW5hbHlzaXNIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5nZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlciA9IHRoaXMuZ2V0U2VsZkhlYWxBbmFseXNpc0hhbmRsZXI7XG4gICAgICBpZiAodGhpcy5nZXRMb29wSXRlcmF0aW9uc0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmdldExvb3BJdGVyYXRpb25zSGFuZGxlciA9IHRoaXMuZ2V0TG9vcEl0ZXJhdGlvbnNIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMuZ2V0QXBpQXNzZXJ0aW9uc0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmdldEFwaUFzc2VydGlvbnNIYW5kbGVyID0gdGhpcy5nZXRBcGlBc3NlcnRpb25zSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLmZvcm1hdEFjdGlvbnNIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5mb3JtYXRBY3Rpb25zSGFuZGxlciA9IHRoaXMuZm9ybWF0QWN0aW9uc0hhbmRsZXI7XG4gICAgICBpZiAodGhpcy5vblZpZXdBbGxJdGVyYXRpb25zSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25WaWV3QWxsSXRlcmF0aW9uc0hhbmRsZXIgPSB0aGlzLm9uVmlld0FsbEl0ZXJhdGlvbnNIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMub25NYWtlQ3VycmVudEJhc2VsaW5lSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25NYWtlQ3VycmVudEJhc2VsaW5lSGFuZGxlciA9IHRoaXMub25NYWtlQ3VycmVudEJhc2VsaW5lSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLm9uVXBsb2FkQmFzZWxpbmVIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vblVwbG9hZEJhc2VsaW5lSGFuZGxlciA9IHRoaXMub25VcGxvYWRCYXNlbGluZUhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5vbkFuYWx5emVIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vbkFuYWx5emVIYW5kbGVyID0gdGhpcy5vbkFuYWx5emVIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMub25WaWV3RnVsbExvZ3NIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vblZpZXdGdWxsTG9nc0hhbmRsZXIgPSB0aGlzLm9uVmlld0Z1bGxMb2dzSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLm9uU2VsZkhlYWxBY3Rpb25IYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vblNlbGZIZWFsQWN0aW9uSGFuZGxlciA9IHRoaXMub25TZWxmSGVhbEFjdGlvbkhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5nZXRTZWxmSGVhbExvYWRpbmdTdGF0ZXNIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5nZXRTZWxmSGVhbExvYWRpbmdTdGF0ZXNIYW5kbGVyID0gdGhpcy5nZXRTZWxmSGVhbExvYWRpbmdTdGF0ZXNIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMub25Db25kaXRpb25CcmFuY2hDbGlja0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLm9uQ29uZGl0aW9uQnJhbmNoQ2xpY2tIYW5kbGVyID0gdGhpcy5vbkNvbmRpdGlvbkJyYW5jaENsaWNrSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLm9uU3RlcENsaWNrSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25TdGVwQ2xpY2tIYW5kbGVyID0gdGhpcy5vblN0ZXBDbGlja0hhbmRsZXI7XG4gICAgICBpZiAodGhpcy5vbkpzb25QYXRoQ29waWVkSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25Kc29uUGF0aENvcGllZEhhbmRsZXIgPSB0aGlzLm9uSnNvblBhdGhDb3BpZWRIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMub25Eb3dubG9hZEhhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLm9uRG93bmxvYWRIYW5kbGVyID0gdGhpcy5vbkRvd25sb2FkSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLm9uRmlsZVBhdGhDb3BpZWRIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vbkZpbGVQYXRoQ29waWVkSGFuZGxlciA9IHRoaXMub25GaWxlUGF0aENvcGllZEhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5vblRleHRDb3BpZWRIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vblRleHRDb3BpZWRIYW5kbGVyID0gdGhpcy5vblRleHRDb3BpZWRIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMuanVtcFRvVGltZXN0YW1wSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkuanVtcFRvVGltZXN0YW1wSGFuZGxlciA9IHRoaXMuanVtcFRvVGltZXN0YW1wSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLmlzVXBsb2FkaW5nQmFzZWxpbmUgIT09IHVuZGVmaW5lZCkgKGluc3RhbmNlIGFzIGFueSkuaXNVcGxvYWRpbmdCYXNlbGluZSA9IHRoaXMuaXNVcGxvYWRpbmdCYXNlbGluZTtcbiAgICAgIGlmICh0aGlzLmlzTWFraW5nQ3VycmVudEJhc2VsaW5lICE9PSB1bmRlZmluZWQpIChpbnN0YW5jZSBhcyBhbnkpLmlzTWFraW5nQ3VycmVudEJhc2VsaW5lID0gdGhpcy5pc01ha2luZ0N1cnJlbnRCYXNlbGluZTtcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQgIT09IHVuZGVmaW5lZCkgKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb25JZCA9IHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZDtcbiAgICAgIGlmICh0aGlzLmlzTGl2ZSAhPT0gdW5kZWZpbmVkKSAoaW5zdGFuY2UgYXMgYW55KS5pc0xpdmUgPSB0aGlzLmlzTGl2ZTtcbiAgICAgIC8vIFBhc3Mgc3RlcE51bWJlciBpbnB1dCBpZiBwcm92aWRlZCwgb3RoZXJ3aXNlIHVzZSBzdGVwJ3Mgc3RlcE51bWJlclxuICAgICAgaWYgKHRoaXMuc3RlcE51bWJlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnN0ZXBOdW1iZXIgPSB0aGlzLnN0ZXBOdW1iZXI7XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuc3RlcE51bWJlciA9IHRoaXMuc3RlcE51bWJlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gUGFzcyB0aGUgc3RlcCBvYmplY3Qgc28gdG9nZ2xlSGVhZGVyIGNhbiB1c2UgaXRcbiAgICAgIGlmICh0aGlzLnN0ZXApIChpbnN0YW5jZSBhcyBhbnkpLnN0ZXAgPSB0aGlzLnN0ZXA7XG5cbiAgICAgIC8vIFVwZGF0ZSBjb25kaXRpb24tc3RlcCBzcGVjaWZpYyBwcm9wZXJ0aWVzIGZvciBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgICBpZiAodGhpcy5zdGVwLnR5cGUgPT09ICdjb25kaXRpb24nKSB7XG4gICAgICAgIC8vIFVwZGF0ZSBhY3RpdmVCcmFuY2hTdGVwSWQgaWYgaXQgY2hhbmdlZFxuICAgICAgICBpZiAoKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGl2ZUJyYW5jaFN0ZXBJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuYWN0aXZlQnJhbmNoU3RlcElkID0gKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGl2ZUJyYW5jaFN0ZXBJZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBicmFuY2hlcyBpZiB0aGV5IGNoYW5nZWRcbiAgICAgICAgaWYgKCh0aGlzLnN0ZXAgYXMgYW55KS5icmFuY2hlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuYnJhbmNoZXMgPSAodGhpcy5zdGVwIGFzIGFueSkuYnJhbmNoZXM7XG4gICAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmJyYW5jaGVzID0gKHRoaXMuc3RlcCBhcyBhbnkpLmJyYW5jaGVzO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBuZXN0ZWRTdGVwcyBpZiB0aGV5IGNoYW5nZWRcbiAgICAgICAgaWYgKCh0aGlzLnN0ZXAgYXMgYW55KS5uZXN0ZWRTdGVwcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkubmVzdGVkU3RlcHMgPSAodGhpcy5zdGVwIGFzIGFueSkubmVzdGVkU3RlcHM7XG4gICAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLm5lc3RlZFN0ZXBzID0gKHRoaXMuc3RlcCBhcyBhbnkpLm5lc3RlZFN0ZXBzO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG5cbiAgICAgIC8vIFNldCBzZWxmSGVhbEFuYWx5c2lzIHVzaW5nIGhhbmRsZXIgaWYgYXZhaWxhYmxlXG4gICAgICBpZiAodGhpcy5nZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlciAmJiB0aGlzLnN0ZXApIHtcbiAgICAgICAgY29uc3Qgc2VsZkhlYWxBbmFseXNpcyA9IHRoaXMuZ2V0U2VsZkhlYWxBbmFseXNpc0hhbmRsZXIodGhpcy5zdGVwKTtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZkhlYWxBbmFseXNpcyA9IHNlbGZIZWFsQW5hbHlzaXM7XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuc2VsZkhlYWxBbmFseXNpcyA9IHNlbGZIZWFsQW5hbHlzaXM7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQWxzbyBzZXQgY29uZmlnIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggY29tcG9uZW50cyB0aGF0IHN0aWxsIHVzZSBjb25maWcgaW5wdXRcbiAgICAgIGlmICgnY29uZmlnJyBpbiBpbnN0YW5jZSkge1xuICAgICAgICBpZiAoZWZmZWN0aXZlVHlwZSA9PT0gJ2ZpbGUtZG93bmxvYWQnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnID0ge1xuICAgICAgICAgICAgLi4udGhpcy5zdGVwLFxuICAgICAgICAgICAgdHlwZTogJ2ZpbGUtZG93bmxvYWQnLFxuICAgICAgICAgICAgZmlsZU5hbWU6IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVOYW1lLFxuICAgICAgICAgICAgZmlsZVR5cGU6IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVUeXBlLFxuICAgICAgICAgICAgZmlsZVBhdGg6IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVQYXRoLFxuICAgICAgICAgICAgZG93bmxvYWRlZDogKGluc3RhbmNlIGFzIGFueSkuZG93bmxvYWRlZFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnID0gdGhpcy5zdGVwO1xuICAgICAgICB9XG4gICAgICAgIC8vIEVuc3VyZSBzZWxmSGVhbEFuYWx5c2lzIGlzIGluY2x1ZGVkIGluIGNvbmZpZ1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuc2VsZkhlYWxBbmFseXNpcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLnNlbGZIZWFsQW5hbHlzaXMgPSAoaW5zdGFuY2UgYXMgYW55KS5zZWxmSGVhbEFuYWx5c2lzO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFN0b3JlIGtleSBmb3IgY2hhbmdlIGRldGVjdGlvblxuICAgICAgdGhpcy5wcmV2aW91c1N0ZXBLZXkgPSB0aGlzLmdldFN0ZXBLZXkodGhpcy5zdGVwKTtcblxuICAgICAgLy8gVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2VcbiAgICAgIGlmIChjb21wb25lbnRSZWYuaW5qZWN0b3IpIHtcbiAgICAgICAgY29uc3QgaW5zdGFuY2VDZHIgPSBjb21wb25lbnRSZWYuaW5qZWN0b3IuZ2V0KENoYW5nZURldGVjdG9yUmVmLCBudWxsKTtcbiAgICAgICAgaWYgKGluc3RhbmNlQ2RyKSB7XG4gICAgICAgICAgaW5zdGFuY2VDZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRW1pdCByZWFkeSBldmVudCBhZnRlciBjb21wb25lbnQgaXMgY3JlYXRlZCBhbmQgaW5pdGlhbGl6ZWRcbiAgICAgIC8vIFVzZSBzZXRUaW1lb3V0IHRvIGVuc3VyZSB0aGUgY29tcG9uZW50IGlzIGZ1bGx5IHJlbmRlcmVkXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWFkeS5lbWl0KCk7XG4gICAgICB9LCAwKTtcbiAgICB9XG4gIH1cblxuICBuZ0RvQ2hlY2soKTogdm9pZCB7XG4gICAgLy8gVXNlIG5nRG9DaGVjayB0byBkZXRlY3QgY2hhbmdlcyBpbiBuZXN0ZWQgcHJvcGVydGllcyB0aGF0IG5nT25DaGFuZ2VzIG1pZ2h0IG1pc3NcbiAgICBjb25zdCBpbnN0YW5jZSA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMuZ2V0KHRoaXMuY29udGFpbmVyKTtcbiAgICBjb25zdCBjb21wb25lbnRSZWYgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50UmVmcy5nZXQodGhpcy5jb250YWluZXIpO1xuXG4gICAgaWYgKGluc3RhbmNlICYmIGNvbXBvbmVudFJlZiAmJiB0aGlzLnN0ZXApIHtcbiAgICAgIC8vIENoZWNrIGlmIGV4cGFuZGVkIHN0YXRlIGNoYW5nZWQgKHVzaW5nIGhhbmRsZXIgaWYgYXZhaWxhYmxlLCBhcyBpdCBtYXkgZGVwZW5kIG9uIHBhcmVudCBzdGF0ZSlcbiAgICAgIC8vIFRoaXMgaXMgaW1wb3J0YW50IGZvciBuZXN0ZWQgc3RlcC1ncm91cHMgd2hlcmUgcGFyZW50IGV4cGFuc2lvbiBhZmZlY3RzIGNoaWxkIGV4cGFuc2lvblxuICAgICAgbGV0IGN1cnJlbnRFeHBhbmRlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICh0aGlzLmlzU3RlcEV4cGFuZGVkSGFuZGxlcikge1xuICAgICAgICBjdXJyZW50RXhwYW5kZWQgPSB0aGlzLmlzU3RlcEV4cGFuZGVkSGFuZGxlcih0aGlzLnN0ZXApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3VycmVudEV4cGFuZGVkID0gKHRoaXMuc3RlcCBhcyBhbnkpLmV4cGFuZGVkO1xuICAgICAgfVxuICAgICAgY29uc3QgaW5zdGFuY2VFeHBhbmRlZCA9IChpbnN0YW5jZSBhcyBhbnkpLmV4cGFuZGVkO1xuICAgICAgXG4gICAgICBpZiAoY3VycmVudEV4cGFuZGVkICE9PSB1bmRlZmluZWQgJiYgY3VycmVudEV4cGFuZGVkICE9PSBpbnN0YW5jZUV4cGFuZGVkKSB7XG4gICAgICAgIC8vIEV4cGFuZGVkIHN0YXRlIGNoYW5nZWQsIHVwZGF0ZSBpdCB1c2luZyBzZXRJbnB1dCB0byB0cmlnZ2VyIG5nT25DaGFuZ2VzXG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSBpbnN0YW5jZUV4cGFuZGVkO1xuICAgICAgICBpZiAoY29tcG9uZW50UmVmICYmIHR5cGVvZiAoY29tcG9uZW50UmVmIGFzIGFueSkuc2V0SW5wdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAoY29tcG9uZW50UmVmIGFzIGFueSkuc2V0SW5wdXQoJ2V4cGFuZGVkJywgY3VycmVudEV4cGFuZGVkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGYWxsYmFjazogbWFudWFsbHkgdHJpZ2dlciBuZ09uQ2hhbmdlc1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmV4cGFuZGVkID0gY3VycmVudEV4cGFuZGVkO1xuICAgICAgICAgIGlmICh0eXBlb2YgKGluc3RhbmNlIGFzIGFueSkubmdPbkNoYW5nZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMgPSB7XG4gICAgICAgICAgICAgIGV4cGFuZGVkOiBuZXcgU2ltcGxlQ2hhbmdlKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRFeHBhbmRlZCwgcHJldmlvdXNWYWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLm5nT25DaGFuZ2VzKGNoYW5nZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmV4cGFuZGVkID0gY3VycmVudEV4cGFuZGVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgc3RlcCBvYmplY3QncyBleHBhbmRlZCBwcm9wZXJ0eSB0byBrZWVwIGl0IGluIHN5bmNcbiAgICAgICAgKHRoaXMuc3RlcCBhcyBhbnkpLmV4cGFuZGVkID0gY3VycmVudEV4cGFuZGVkO1xuICAgICAgICBcbiAgICAgICAgLy8gVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgICAgIGlmIChjb21wb25lbnRSZWYuaW5qZWN0b3IpIHtcbiAgICAgICAgICBjb25zdCBpbnN0YW5jZUNkciA9IGNvbXBvbmVudFJlZi5pbmplY3Rvci5nZXQoQ2hhbmdlRGV0ZWN0b3JSZWYsIG51bGwpO1xuICAgICAgICAgIGlmIChpbnN0YW5jZUNkcikge1xuICAgICAgICAgICAgaW5zdGFuY2VDZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICBpbnN0YW5jZUNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGlmIGl0ZXJhdGlvbnMgYXJlIG5vdyBhdmFpbGFibGUgYW5kIHdlIG5lZWQgdG8gdXBkYXRlIHNlbGVjdGVkSXRlcmF0aW9uXG4gICAgICBpZiAodGhpcy5zdGVwLnR5cGUgPT09ICdsb29wJyAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQpIHtcbiAgICAgICAgY29uc3QgaXRlcmF0aW9ucyA9IChpbnN0YW5jZSBhcyBhbnkpLml0ZXJhdGlvbnMgfHwgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnPy5pdGVyYXRpb25zIHx8IFtdO1xuICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZXJhdGlvbklkID0gKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb25JZCB8fCB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTZWxlY3RlZEl0ZXJhdGlvbiA9IChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uO1xuXG4gICAgICAgIC8vIElmIGl0ZXJhdGlvbnMgYXJlIGF2YWlsYWJsZSwgc2VsZWN0ZWRJdGVyYXRpb25JZCBpcyBzZXQsIGJ1dCBzZWxlY3RlZEl0ZXJhdGlvbiBpcyBub3Qgc2V0IG9yIGRvZXNuJ3QgbWF0Y2hcbiAgICAgICAgaWYgKGl0ZXJhdGlvbnMubGVuZ3RoID4gMCAmJiBzZWxlY3RlZEl0ZXJhdGlvbklkKSB7XG4gICAgICAgICAgY29uc3Qgc2hvdWxkQmVTZWxlY3RlZCA9IGl0ZXJhdGlvbnMuZmluZCgoaXRlcjogYW55KSA9PiBpdGVyLmlkID09PSBzZWxlY3RlZEl0ZXJhdGlvbklkKTtcbiAgICAgICAgICBpZiAoc2hvdWxkQmVTZWxlY3RlZCAmJiBjdXJyZW50U2VsZWN0ZWRJdGVyYXRpb24/LmlkICE9PSBzZWxlY3RlZEl0ZXJhdGlvbklkKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUxvb3BTdGVwU2VsZWN0ZWRJdGVyYXRpb24oaW5zdGFuY2UsIHNlbGVjdGVkSXRlcmF0aW9uSWQpO1xuICAgICAgICAgICAgaWYgKGNvbXBvbmVudFJlZi5pbmplY3Rvcikge1xuICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZUNkciA9IGNvbXBvbmVudFJlZi5pbmplY3Rvci5nZXQoQ2hhbmdlRGV0ZWN0b3JSZWYsIG51bGwpO1xuICAgICAgICAgICAgICBpZiAoaW5zdGFuY2VDZHIpIHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZUNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZUNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgY3VycmVudEtleSA9IHRoaXMuZ2V0U3RlcEtleSh0aGlzLnN0ZXApO1xuXG4gICAgICAvLyBJZiBzdGVwIHByb3BlcnRpZXMgY2hhbmdlZCAoZXZlbiBpZiByZWZlcmVuY2UgZGlkbid0KSwgdXBkYXRlIHRoZSBpbnN0YW5jZVxuICAgICAgaWYgKGN1cnJlbnRLZXkgIT09IHRoaXMucHJldmlvdXNTdGVwS2V5KSB7XG4gICAgICAgIC8vIFdlIG5lZWQgdGhlIHByZXZpb3VzIHN0ZXAgdG8gY29tcGFyZSwgc28gd2UnbGwgdXBkYXRlIGJhc2VkIG9uIGN1cnJlbnQgc3RhdGVcbiAgICAgICAgLy8gQ3JlYXRlIGEgbWluaW1hbCBwcmV2aW91cyBzdGVwIGZyb20gdGhlIGluc3RhbmNlJ3MgY3VycmVudCBzdGF0ZVxuICAgICAgICBjb25zdCBwcmV2aW91c1N0ZXA6IGFueSA9IHtcbiAgICAgICAgICBpZDogKGluc3RhbmNlIGFzIGFueSkuaWQsXG4gICAgICAgICAgdHlwZTogKGluc3RhbmNlIGFzIGFueSkudHlwZSxcbiAgICAgICAgICBzdGF0dXM6IChpbnN0YW5jZSBhcyBhbnkpLnN0YXR1cyxcbiAgICAgICAgICBkdXJhdGlvbjogKGluc3RhbmNlIGFzIGFueSkuZHVyYXRpb24sXG4gICAgICAgICAgZXhwYW5kZWQ6IChpbnN0YW5jZSBhcyBhbnkpLmV4cGFuZGVkLFxuICAgICAgICAgIGNoaWxkcmVuOiAoaW5zdGFuY2UgYXMgYW55KS5jaGlsZHJlbixcbiAgICAgICAgICBuZXN0ZWRTdGVwczogKGluc3RhbmNlIGFzIGFueSkubmVzdGVkU3RlcHMsXG4gICAgICAgICAgc3RlcHM6IChpbnN0YW5jZSBhcyBhbnkpLnN0ZXBzLFxuICAgICAgICAgIGV4ZWN1dGlvbkRhdGE6IChpbnN0YW5jZSBhcyBhbnkpLmV4ZWN1dGlvbkRhdGEsXG4gICAgICAgICAgYWN0aW9uOiAoaW5zdGFuY2UgYXMgYW55KS5hY3Rpb24sXG4gICAgICAgICAgdGl0bGU6IChpbnN0YW5jZSBhcyBhbnkpLnRpdGxlLFxuICAgICAgICAgIHJlc3VsdDogKGluc3RhbmNlIGFzIGFueSkucmVzdWx0LFxuICAgICAgICAgIG1ldGhvZDogKGluc3RhbmNlIGFzIGFueSkubWV0aG9kLFxuICAgICAgICAgIGVuZHBvaW50OiAoaW5zdGFuY2UgYXMgYW55KS5lbmRwb2ludCxcbiAgICAgICAgICBzdGF0dXNDb2RlOiAoaW5zdGFuY2UgYXMgYW55KS5zdGF0dXNDb2RlLFxuICAgICAgICAgIHJlc3BvbnNlVGltZTogKGluc3RhbmNlIGFzIGFueSkucmVzcG9uc2VUaW1lLFxuICAgICAgICAgIGFjdGlvbnM6IChpbnN0YW5jZSBhcyBhbnkpLmFjdGlvbnMsXG4gICAgICAgICAgcHJvbXB0OiAoaW5zdGFuY2UgYXMgYW55KS5wcm9tcHQsXG4gICAgICAgICAgb3B0aW1pemVkUnVuOiAoaW5zdGFuY2UgYXMgYW55KS5vcHRpbWl6ZWRSdW4sXG4gICAgICAgICAgYWN0aW9uQ291bnQ6IChpbnN0YW5jZSBhcyBhbnkpLmFjdGlvbkNvdW50LFxuICAgICAgICAgIGl0ZXJhdGlvbnM6IChpbnN0YW5jZSBhcyBhbnkpLml0ZXJhdGlvbnMsXG4gICAgICAgICAgc2VsZWN0ZWRJdGVyYXRpb25JZDogKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb25JZCxcbiAgICAgICAgICBicmFuY2hlczogKGluc3RhbmNlIGFzIGFueSkuYnJhbmNoZXMsXG4gICAgICAgICAgc3RlcE51bWJlcjogKGluc3RhbmNlIGFzIGFueSkuc3RlcE51bWJlcixcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnVwZGF0ZUNvbXBvbmVudEluc3RhbmNlKHRoaXMuc3RlcCwgcHJldmlvdXNTdGVwKTtcbiAgICAgICAgdGhpcy5wcmV2aW91c1N0ZXBLZXkgPSBjdXJyZW50S2V5O1xuICAgICAgfVxuICAgIH1cbiAgfVxufSJdfQ==
|
|
1405
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1yZW5kZXJlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2V4ZWN1dGlvbi1zY3JlZW4vc3RlcC1yZW5kZXJlci9zdGVwLXJlbmRlcmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBMEQsTUFBTSxFQUFFLGlCQUFpQixFQUFnQixZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbk4sT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7O0FBRTVEOzs7O0dBSUc7QUFLSCxNQUFNLE9BQU8scUJBQXFCO0lBc0RoQyxZQUNzQyxZQUFvQyxFQUNoRSxHQUFzQjtRQURNLGlCQUFZLEdBQVosWUFBWSxDQUF3QjtRQUNoRSxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQTNCdkIsc0JBQWlCLEdBQWtCLElBQUksQ0FBQztRQUV4QyxXQUFNLEdBQVksS0FBSyxDQUFDO1FBQ3hCLFlBQU8sR0FBYSxLQUFLLENBQUM7UUFJekIsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDLENBQUMsMENBQTBDO1FBY3ZGLGVBQVUsR0FBMkIsSUFBSSxDQUFDO1FBQzFDLGlCQUFZLEdBQWtCLElBQUksQ0FBQztRQUNuQyxvQkFBZSxHQUFXLEVBQUUsQ0FBQztJQUtqQyxDQUFDO0lBbkJMLHFHQUFxRztJQUM3RixvQkFBb0IsQ0FBQyxJQUE0QztRQUN2RSxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3JCLE1BQU0sQ0FBQyxHQUFJLElBQVksQ0FBQyxZQUFZLENBQUM7UUFDckMsSUFBSSxDQUFDLEtBQUssa0JBQWtCO1lBQUUsT0FBTyxlQUFlLENBQUM7UUFDckQsT0FBUSxJQUFZLENBQUMsSUFBSSxJQUFJ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Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLHdCQUF3QjtzQkFBaEMsS0FBSztnQkFDRyx1QkFBdUI7c0JBQS9CLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUNHLDBCQUEwQjtzQkFBbEMsS0FBSztnQkFDRyw2QkFBNkI7c0JBQXJDLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUM4QyxTQUFTO3NCQUE1RCxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkFDekMsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyx1QkFBdUI7c0JBQS9CLEtBQUs7Z0JBQ0cseUJBQXlCO3NCQUFqQyxLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0ksY0FBYztzQkFBdkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBWaWV3Q2hpbGQsIFZpZXdDb250YWluZXJSZWYsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgVHlwZSwgQWZ0ZXJWaWV3SW5pdCwgRG9DaGVjaywgSW5qZWN0LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50UmVmLCBTaW1wbGVDaGFuZ2UgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEV4ZWN1dGlvblN0ZXBDb25maWcgfSBmcm9tICcuLi9leGVjdXRpb24tc3RlcC5tb2RlbHMnO1xuaW1wb3J0IHsgU1RFUF9DT01QT05FTlRfTUFQIH0gZnJvbSAnLi4vc3RlcC1yZWdpc3RyeS50b2tlbic7XG5cbi8qKlxuICogQ29tcG9uZW50IHRoYXQgcmVuZGVycyB0aGUgYXBwcm9wcmlhdGUgc3RlcCBjb21wb25lbnQgYmFzZWQgb24gdGhlIHN0ZXAgdHlwZS5cbiAqIFVzZXMgZHluYW1pYyBjb21wb25lbnQgbG9hZGluZyBhbmQgYW4gaW5qZWN0aW9uIHRva2VuIHRvIGJyZWFrIGNpcmN1bGFyIGRlcGVuZGVuY2llc1xuICogYmV0d2VlbiBzdGVwIGNvbXBvbmVudHMgaW4gQW5ndWxhciBJdnkgcGFydGlhbCBjb21waWxhdGlvbiBtb2RlLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtc3RlcC1yZW5kZXJlcicsXG4gIHRlbXBsYXRlOiAnPG5nLWNvbnRhaW5lciAjY29udGFpbmVyPjwvbmctY29udGFpbmVyPidcbn0pXG5leHBvcnQgY2xhc3MgU3RlcFJlbmRlcmVyQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBEb0NoZWNrIHtcbiAgQElucHV0KCkgc3RlcCE6IEV4ZWN1dGlvblN0ZXBDb25maWc7XG4gIEBJbnB1dCgpIG9uRXhwYW5kSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiB2b2lkO1xuICBASW5wdXQoKSBnZXRDb25kaXRpb25CcmFuY2hlc0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYW55O1xuICBASW5wdXQoKSBpc1N0ZXBMb2FkaW5nSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBib29sZWFuO1xuICBASW5wdXQoKSBpc1N0ZXBFeHBhbmRlZEhhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYm9vbGVhbjtcbiAgQElucHV0KCkgY29udmVydE1zVG9TZWNvbmRzSGFuZGxlcj86IChkdXJhdGlvbjogbnVtYmVyKSA9PiBudW1iZXI7XG4gIEBJbnB1dCgpIGZvcm1hdEZhaWx1cmVEZXRhaWxzSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBhbnk7XG4gIEBJbnB1dCgpIGdldFNlbGZIZWFsQW5hbHlzaXNIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGFueTtcbiAgQElucHV0KCkgb25NYWtlQ3VycmVudEJhc2VsaW5lSGFuZGxlcj86IChldmVudDogYW55KSA9PiB2b2lkO1xuICBASW5wdXQoKSBvblVwbG9hZEJhc2VsaW5lSGFuZGxlcj86IChldmVudDogYW55KSA9PiB2b2lkO1xuICBASW5wdXQoKSBvbkFuYWx5emVIYW5kbGVyPzogKCkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25WaWV3RnVsbExvZ3NIYW5kbGVyPzogKCkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25TZWxmSGVhbEFjdGlvbkhhbmRsZXI/OiAoZXZlbnQ6IGFueSkgPT4gdm9pZDtcbiAgQElucHV0KCkgZ2V0U2VsZkhlYWxMb2FkaW5nU3RhdGVzSGFuZGxlcj86ICgpID0+IHsgaXNMb2FkaW5nQWNjZXB0OiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfTsgaXNMb2FkaW5nTW9kaWZ5QWNjZXB0OiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSB9O1xuICBASW5wdXQoKSBpc1VwbG9hZGluZ0Jhc2VsaW5lPzogYW55O1xuICBASW5wdXQoKSBpc01ha2luZ0N1cnJlbnRCYXNlbGluZT86IGFueTtcbiAgQElucHV0KCkgc2VsZWN0ZWRJdGVyYXRpb25JZD86IGFueTtcbiAgQElucHV0KCkgZ2V0TG9vcEl0ZXJhdGlvbnNIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGFueVtdO1xuICBASW5wdXQoKSBnZXRBcGlBc3NlcnRpb25zSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBhbnlbXTtcbiAgQElucHV0KCkgZm9ybWF0QWN0aW9uc0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYW55W107XG4gIEBJbnB1dCgpIG9uVmlld0FsbEl0ZXJhdGlvbnNIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uQ29uZGl0aW9uQnJhbmNoQ2xpY2tIYW5kbGVyPzogKHN0ZXA6IGFueSwgYnJhbmNoOiBhbnkpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uU3RlcENsaWNrSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnLCBldmVudD86IEV2ZW50KSA9PiB2b2lkO1xuICBASW5wdXQoKSBvbkpzb25QYXRoQ29waWVkSGFuZGxlcj86IChldmVudDogeyBwYXRoOiBzdHJpbmc7IHNvdXJjZTogJ3JlcXVlc3RCb2R5JyB8ICdyZXNwb25zZUJvZHknIHwgJ3JlcXVlc3RIZWFkZXJzJyB8ICdyZXNwb25zZUhlYWRlcnMnIH0pID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uRG93bmxvYWRIYW5kbGVyPzogKGV2ZW50OiB7IGZpbGVOYW1lOiBzdHJpbmc7IGZpbGVQYXRoPzogc3RyaW5nOyBmaWxlVHlwZTogc3RyaW5nOyB0ZXN0U3RlcFJlc3VsdElkOiBzdHJpbmcgfSkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25GaWxlUGF0aENvcGllZEhhbmRsZXI/OiAoZXZlbnQ6IHsgZmlsZVBhdGg6IHN0cmluZzsgdGVzdFN0ZXBSZXN1bHRJZDogc3RyaW5nIH0pID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uVGV4dENvcGllZEhhbmRsZXI/OiAoZXZlbnQ6IHsgdGV4dDogc3RyaW5nOyB0ZXN0U3RlcFJlc3VsdElkOiBzdHJpbmcgfSkgPT4gdm9pZDtcbiAgQElucHV0KCkganVtcFRvVGltZXN0YW1wSGFuZGxlcj86ICh0aW1lc3RhbXA6IG51bWJlciwgdGVzdFN0ZXBJZD86IG51bWJlciB8IHN0cmluZykgPT4gdm9pZDtcbiAgQElucHV0KCkgZG93bmxvYWRpbmdTdGVwSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBAVmlld0NoaWxkKCdjb250YWluZXInLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSkgY29udGFpbmVyITogVmlld0NvbnRhaW5lclJlZjtcbiAgQElucHV0KCkgaXNMaXZlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzRGVidWc/OiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGdldERlYnVnUG9pbnRTZXRIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGJvb2xlYW47XG4gIEBJbnB1dCgpIG9uRGVidWdQb2ludENoYW5nZUhhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZywgdmFsdWU6IGJvb2xlYW4pID0+IHZvaWQ7XG4gIEBJbnB1dCgpIHN0ZXBOdW1iZXI/OiBzdHJpbmc7XG4gIEBPdXRwdXQoKSBjb21wb25lbnRSZWFkeSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTsgLy8gRW1pdCB3aGVuIGNvbXBvbmVudCBpcyBsb2FkZWQgYW5kIHJlYWR5XG5cbiAgLyoqIEVmZmVjdGl2ZSB0eXBlIGZvciBjb21wb25lbnQgbG9va3VwOiAnZmlsZS1kb3dubG9hZCcgd2hlbiB0ZXN0U3RlcFR5cGUgPT09ICdnZW5lcmF0ZURvY3VtZW50Jy4gKi9cbiAgcHJpdmF0ZSBnZXRFZmZlY3RpdmVTdGVwVHlwZShzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgaWYgKCFzdGVwKSByZXR1cm4gJyc7XG4gICAgY29uc3QgdCA9IChzdGVwIGFzIGFueSkudGVzdFN0ZXBUeXBlO1xuICAgIGlmICh0ID09PSAnZ2VuZXJhdGVEb2N1bWVudCcpIHJldHVybiAnZmlsZS1kb3dubG9hZCc7XG4gICAgcmV0dXJuIChzdGVwIGFzIGFueSkudHlwZSB8fCAnJztcbiAgfVxuXG4gIC8vIFVzZSBXZWFrTWFwIHRvIHRyYWNrIGNvbXBvbmVudCBpbnN0YW5jZXMgd2l0aG91dCBzdG9yaW5nIHRoZW0gYXMgY2xhc3MgcHJvcGVydGllc1xuICBwcml2YXRlIHN0YXRpYyBjb21wb25lbnRJbnN0YW5jZXMgPSBuZXcgV2Vha01hcDxWaWV3Q29udGFpbmVyUmVmLCBhbnk+KCk7XG4gIHByaXZhdGUgc3RhdGljIGNvbXBvbmVudFJlZnMgPSBuZXcgV2Vha01hcDxWaWV3Q29udGFpbmVyUmVmLCBDb21wb25lbnRSZWY8YW55Pj4oKTtcbiAgcHJpdmF0ZSBzdGF0aWMgc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMgPSBuZXcgV2Vha01hcDxhbnksIFNldDxzdHJpbmc+PigpOyAvLyBUcmFjayB3aGljaCBFdmVudEVtaXR0ZXJzIGhhdmUgYmVlbiBzdWJzY3JpYmVkIHRvXG4gIHByaXZhdGUgbGFzdFN0ZXBJZDogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbGFzdFN0ZXBUeXBlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwcmV2aW91c1N0ZXBLZXk6IHN0cmluZyA9ICcnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoU1RFUF9DT01QT05FTlRfTUFQKSBwcml2YXRlIGNvbXBvbmVudE1hcDogTWFwPHN0cmluZywgVHlwZTxhbnk+PixcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7IH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbnRhaW5lciB8fCAhdGhpcy5zdGVwKSByZXR1cm47XG5cbiAgICBjb25zdCBjdXJyZW50U3RlcCA9IGNoYW5nZXNbJ3N0ZXAnXT8uY3VycmVudFZhbHVlIHx8IHRoaXMuc3RlcDtcbiAgICBjb25zdCBwcmV2aW91c1N0ZXAgPSBjaGFuZ2VzWydzdGVwJ10/LnByZXZpb3VzVmFsdWU7XG5cbiAgICAvLyBDaGVjayBpZiBzZWxlY3RlZEl0ZXJhdGlvbklkIGlucHV0IGNoYW5nZWQgKGZvciBsb29wIHN0ZXBzKVxuICAgIC8vICYmIFxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0ZXAudHlwZSA9PT0gJ2xvb3AnICYmIFxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIubGVuZ3RoID4gMDtcblxuICAgIC8vIElmIHNlbGVjdGVkSXRlcmF0aW9uSWQgY2hhbmdlZCBmb3IgYSBsb29wIHN0ZXAsIHVwZGF0ZSBpdCBkaXJlY3RseVxuICAgIGlmIChjaGFuZ2VzWydzZWxlY3RlZEl0ZXJhdGlvbklkJ10gJiYgY2hhbmdlc1snc2VsZWN0ZWRJdGVyYXRpb25JZCddLmN1cnJlbnRWYWx1ZSAhPT0gY2hhbmdlc1snc2VsZWN0ZWRJdGVyYXRpb25JZCddLnByZXZpb3VzVmFsdWUpIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlcy5nZXQodGhpcy5jb250YWluZXIpO1xuICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudFJlZnMuZ2V0KHRoaXMuY29udGFpbmVyKTtcblxuICAgICAgaWYgKGluc3RhbmNlICYmIGNvbXBvbmVudFJlZikge1xuICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBjaGFuZ2VzWydzZWxlY3RlZEl0ZXJhdGlvbklkJ10uY3VycmVudFZhbHVlO1xuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gY2hhbmdlc1snc2VsZWN0ZWRJdGVyYXRpb25JZCddLnByZXZpb3VzVmFsdWU7XG5cbiAgICAgICAgLy8gQWx3YXlzIHVwZGF0ZSBzZWxlY3RlZEl0ZXJhdGlvbklkIHdoZW4gaW5wdXQgY2hhbmdlcyBmcm9tIHBhcmVudFxuICAgICAgICBpZiAoY3VycmVudFZhbHVlICE9PSBwcmV2aW91c1ZhbHVlKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb25JZCA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuc2VsZWN0ZWRJdGVyYXRpb25JZCA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBUcnkgdG8gdXBkYXRlIHNlbGVjdGVkSXRlcmF0aW9uIGlmIGl0ZXJhdGlvbnMgYXJlIGF2YWlsYWJsZVxuICAgICAgICAgIHRoaXMudXBkYXRlTG9vcFN0ZXBTZWxlY3RlZEl0ZXJhdGlvbihpbnN0YW5jZSwgY3VycmVudFZhbHVlKTtcblxuICAgICAgICAgIC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiBvbiB0aGUgbG9vcC1zdGVwIGNvbXBvbmVudFxuICAgICAgICAgIGlmIChjb21wb25lbnRSZWYuaW5qZWN0b3IpIHtcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlQ2RyID0gY29tcG9uZW50UmVmLmluamVjdG9yLmdldChDaGFuZ2VEZXRlY3RvclJlZiwgbnVsbCk7XG4gICAgICAgICAgICBpZiAoaW5zdGFuY2VDZHIpIHtcbiAgICAgICAgICAgICAgaW5zdGFuY2VDZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICAgIGluc3RhbmNlQ2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBzdGVwTnVtYmVyIGlucHV0IGNoYW5nZWQsIHVwZGF0ZSBuZXN0ZWQgY29tcG9uZW50IGluc3RhbmNlc1xuICAgIGlmIChjaGFuZ2VzWydzdGVwTnVtYmVyJ10gJiYgY2hhbmdlc1snc3RlcE51bWJlciddLmN1cnJlbnRWYWx1ZSAhPT0gY2hhbmdlc1snc3RlcE51bWJlciddLnByZXZpb3VzVmFsdWUpIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlcy5nZXQodGhpcy5jb250YWluZXIpO1xuICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudFJlZnMuZ2V0KHRoaXMuY29udGFpbmVyKTtcblxuICAgICAgaWYgKGluc3RhbmNlICYmIGNvbXBvbmVudFJlZikge1xuICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBjaGFuZ2VzWydzdGVwTnVtYmVyJ10uY3VycmVudFZhbHVlO1xuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gY2hhbmdlc1snc3RlcE51bWJlciddLnByZXZpb3VzVmFsdWU7XG5cbiAgICAgICAgLy8gQWx3YXlzIHVwZGF0ZSBzdGVwTnVtYmVyIHdoZW4gaW5wdXQgY2hhbmdlcyBmcm9tIHBhcmVudFxuICAgICAgICBpZiAoY3VycmVudFZhbHVlICE9PSBwcmV2aW91c1ZhbHVlKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc3RlcE51bWJlciA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuc3RlcE51bWJlciA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBUcmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZVxuICAgICAgICAgIGlmIChjb21wb25lbnRSZWYuaW5qZWN0b3IpIHtcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlQ2RyID0gY29tcG9uZW50UmVmLmluamVjdG9yLmdldChDaGFuZ2VEZXRlY3RvclJlZiwgbnVsbCk7XG4gICAgICAgICAgICBpZiAoaW5zdGFuY2VDZHIpIHtcbiAgICAgICAgICAgICAgaW5zdGFuY2VDZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICAgIGluc3RhbmNlQ2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBpc1VwbG9hZGluZ0Jhc2VsaW5lIG9yIGlzTWFraW5nQ3VycmVudEJhc2VsaW5lIGNoYW5nZWQsIHVwZGF0ZSBuZXN0ZWQgY29tcG9uZW50IGluc3RhbmNlc1xuICAgIGlmIChjaGFuZ2VzWydpc1VwbG9hZGluZ0Jhc2VsaW5lJ10gfHwgY2hhbmdlc1snaXNNYWtpbmdDdXJyZW50QmFzZWxpbmUnXSkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzLmdldCh0aGlzLmNvbnRhaW5lcik7XG4gICAgICBjb25zdCBjb21wb25lbnRSZWYgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50UmVmcy5nZXQodGhpcy5jb250YWluZXIpO1xuXG4gICAgICBpZiAoaW5zdGFuY2UgJiYgY29tcG9uZW50UmVmKSB7XG4gICAgICAgIC8vIFVwZGF0ZSBpc1VwbG9hZGluZ0Jhc2VsaW5lIGlmIGl0IGNoYW5nZWRcbiAgICAgICAgaWYgKGNoYW5nZXNbJ2lzVXBsb2FkaW5nQmFzZWxpbmUnXSkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmlzVXBsb2FkaW5nQmFzZWxpbmUgPSB0aGlzLmlzVXBsb2FkaW5nQmFzZWxpbmU7XG4gICAgICAgICAgLy8gQWxzbyB1cGRhdGUgaW4gY29uZmlnIGlmIGl0IGV4aXN0c1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5pc1VwbG9hZGluZ0Jhc2VsaW5lID0gdGhpcy5pc1VwbG9hZGluZ0Jhc2VsaW5lO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBpc01ha2luZ0N1cnJlbnRCYXNlbGluZSBpZiBpdCBjaGFuZ2VkXG4gICAgICAgIGlmIChjaGFuZ2VzWydpc01ha2luZ0N1cnJlbnRCYXNlbGluZSddKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuaXNNYWtpbmdDdXJyZW50QmFzZWxpbmUgPSB0aGlzLmlzTWFraW5nQ3VycmVudEJhc2VsaW5lO1xuICAgICAgICAgIC8vIEFsc28gdXBkYXRlIGluIGNvbmZpZyBpZiBpdCBleGlzdHNcbiAgICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuaXNNYWtpbmdDdXJyZW50QmFzZWxpbmUgPSB0aGlzLmlzTWFraW5nQ3VycmVudEJhc2VsaW5lO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiBvbiB0aGUgY29tcG9uZW50IGluc3RhbmNlXG4gICAgICAgIGlmIChjb21wb25lbnRSZWYuaW5qZWN0b3IpIHtcbiAgICAgICAgICBjb25zdCBpbnN0YW5jZUNkciA9IGNvbXBvbmVudFJlZi5pbmplY3Rvci5nZXQoQ2hhbmdlRGV0ZWN0b3JSZWYsIG51bGwpO1xuICAgICAgICAgIGlmIChpbnN0YW5jZUNkcikge1xuICAgICAgICAgICAgaW5zdGFuY2VDZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICBpbnN0YW5jZUNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgZG93bmxvYWRpbmdTdGVwSWQgY2hhbmdlZCwgdXBkYXRlIGZpbGUtZG93bmxvYWQgaW5zdGFuY2UgaXNEb3dubG9hZGluZ1xuICAgIGlmIChjaGFuZ2VzWydkb3dubG9hZGluZ1N0ZXBJZCddKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMuZ2V0KHRoaXMuY29udGFpbmVyKTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRSZWZzLmdldCh0aGlzLmNvbnRhaW5lcik7XG4gICAgICBpZiAoaW5zdGFuY2UgJiYgY29tcG9uZW50UmVmICYmIHRoaXMuZ2V0RWZmZWN0aXZlU3RlcFR5cGUoY3VycmVudFN0ZXApID09PSAnZmlsZS1kb3dubG9hZCcpIHtcbiAgICAgICAgY29uc3QgdGlkID0gKGN1cnJlbnRTdGVwIGFzIGFueSkudGVzdFN0ZXBSZXN1bHRJZDtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuaXNEb3dubG9hZGluZyA9ICEhdGlkICYmIHRoaXMuZG93bmxvYWRpbmdTdGVwSWQgPT09IHRpZDtcbiAgICAgICAgaWYgKGNvbXBvbmVudFJlZi5pbmplY3Rvcikge1xuICAgICAgICAgIGNvbnN0IGluc3RhbmNlQ2RyID0gY29tcG9uZW50UmVmLmluamVjdG9yLmdldChDaGFuZ2VEZXRlY3RvclJlZiwgbnVsbCk7XG4gICAgICAgICAgaWYgKGluc3RhbmNlQ2RyKSB7XG4gICAgICAgICAgICBpbnN0YW5jZUNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIGluc3RhbmNlQ2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZXQgc3RlcCBpZGVudGlmaWVycyAodXNlIGVmZmVjdGl2ZSB0eXBlOiBnZW5lcmF0ZURvY3VtZW50IC0+IGZpbGUtZG93bmxvYWQpXG4gICAgY29uc3QgY3VycmVudFN0ZXBJZCA9IGN1cnJlbnRTdGVwLnRlc3RTdGVwUmVzdWx0SWQgfHwgY3VycmVudFN0ZXAuaWQ7XG4gICAgY29uc3QgY3VycmVudFN0ZXBUeXBlID0gdGhpcy5nZXRFZmZlY3RpdmVTdGVwVHlwZShjdXJyZW50U3RlcCkgfHwgKGN1cnJlbnRTdGVwIGFzIGFueSkudHlwZTtcblxuICAgIC8vIFVzZSBzdG9yZWQgbGFzdFN0ZXBJZCBhbmQgbGFzdFN0ZXBUeXBlIHRvIHByb3Blcmx5IGRldGVjdCBjaGFuZ2VzXG4gICAgLy8gVGhpcyBoYW5kbGVzIHRoZSBjYXNlIHdoZW4gc3RlcCBvYmplY3QgcmVmZXJlbmNlIGRvZXNuJ3QgY2hhbmdlIGJ1dCBwcm9wZXJ0aWVzIGRvXG4gICAgLy8gT25seSBjaGVjayBmb3IgYWN0dWFsIElEL3R5cGUgY2hhbmdlcywgbm90IGp1c3QgcmVmZXJlbmNlIGNoYW5nZXNcbiAgICAvLyBjb25zdCBzdGVwVHlwZUNoYW5nZWQgPSAhcHJldmlvdXNTdGVwIHx8IGN1cnJlbnRTdGVwVHlwZSAhPT0gKHByZXZpb3VzU3RlcC50eXBlIHx8IHRoaXMubGFzdFN0ZXBUeXBlKTtcbiAgICAvLyBjb25zdCBzdGVwSWRDaGFuZ2VkID0gIXByZXZpb3VzU3RlcCB8fCBjdXJyZW50U3RlcElkICE9PSAocHJldmlvdXNTdGVwLnRlc3RTdGVwUmVzdWx0SWQgfHwgcHJldmlvdXNTdGVwLmlkIHx8IHRoaXMubGFzdFN0ZXBJZCk7XG4gICAgY29uc3Qgc3RlcFR5cGVDaGFuZ2VkID0gY3VycmVudFN0ZXBUeXBlICE9PSB0aGlzLmxhc3RTdGVwVHlwZTtcbiAgICBjb25zdCBzdGVwSWRDaGFuZ2VkID0gY3VycmVudFN0ZXBJZCAhPT0gdGhpcy5sYXN0U3RlcElkO1xuICAgIFxuICAgIC8vIE9ubHkgbG9hZCBjb21wb25lbnQgaWYgc3RlcCBJRCBvciB0eXBlIGFjdHVhbGx5IGNoYW5nZWRcbiAgICAvLyBUaGlzIHByZXZlbnRzIHVubmVjZXNzYXJ5IHJlbG9hZHMgd2hlbiBvbmx5IG5lc3RlZCBwcm9wZXJ0aWVzIGNoYW5nZVxuICAgIGlmIChzdGVwVHlwZUNoYW5nZWQgfHwgc3RlcElkQ2hhbmdlZCkge1xuICAgICAgdGhpcy5sYXN0U3RlcElkID0gY3VycmVudFN0ZXBJZDtcbiAgICAgIHRoaXMubGFzdFN0ZXBUeXBlID0gY3VycmVudFN0ZXBUeXBlO1xuICAgICAgaWYgKHRoaXMuY29udGFpbmVyKSB7XG4gICAgICAgIHRoaXMubG9hZENvbXBvbmVudCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGV4cGFuZGVkIHN0YXRlIGNoYW5nZWQgKHVzaW5nIGhhbmRsZXIgaWYgYXZhaWxhYmxlLCBhcyBpdCBtYXkgZGVwZW5kIG9uIHBhcmVudCBzdGF0ZSlcbiAgICBsZXQgZXhwYW5kZWRDaGFuZ2VkID0gZmFsc2U7XG4gICAgaWYgKHByZXZpb3VzU3RlcCAmJiBjdXJyZW50U3RlcCkge1xuICAgICAgbGV0IGN1cnJlbnRFeHBhbmRlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICAgIGxldCBwcmV2aW91c0V4cGFuZGVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgICAgXG4gICAgICBpZiAodGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXIpIHtcbiAgICAgICAgY3VycmVudEV4cGFuZGVkID0gdGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXIoY3VycmVudFN0ZXApO1xuICAgICAgICBwcmV2aW91c0V4cGFuZGVkID0gdGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXIocHJldmlvdXNTdGVwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnJlbnRFeHBhbmRlZCA9IChjdXJyZW50U3RlcCBhcyBhbnkpLmV4cGFuZGVkO1xuICAgICAgICBwcmV2aW91c0V4cGFuZGVkID0gKHByZXZpb3VzU3RlcCBhcyBhbnkpLmV4cGFuZGVkO1xuICAgICAgfVxuICAgICAgXG4gICAgICBleHBhbmRlZENoYW5nZWQgPSBjdXJyZW50RXhwYW5kZWQgIT09IHByZXZpb3VzRXhwYW5kZWQ7XG4gICAgfVxuICAgIFxuICAgIC8vIElmIG9ubHkgbmVzdGVkIGRhdGEgY2hhbmdlZCAoY2hpbGRyZW4sIG5lc3RlZFN0ZXBzLCBzdGVwcywgZXhwYW5kZWQpLCBcbiAgICAvLyB1cGRhdGUgcHJvcGVydGllcyB3aXRob3V0IHJlY3JlYXRpbmcgY29tcG9uZW50IHRvIHByZXZlbnQgYmxpbmtpbmdcbiAgICAvLyBUaGlzIHByZXZlbnRzIHBhcmVudCBzdGVwcyBmcm9tIGJsaW5raW5nIHdoZW4gbmVzdGVkIHN0ZXBzIGV4cGFuZFxuICAgIGNvbnN0IG9ubHlOZXN0ZWREYXRhQ2hhbmdlZCA9IHByZXZpb3VzU3RlcCAmJiAoXG4gICAgICAoY3VycmVudFN0ZXAgYXMgYW55KS5uZXN0ZWRTdGVwcyAhPT0gKHByZXZpb3VzU3RlcCBhcyBhbnkpLm5lc3RlZFN0ZXBzIHx8XG4gICAgICAoY3VycmVudFN0ZXAgYXMgYW55KS5jaGlsZHJlbiAhPT0gKHByZXZpb3VzU3RlcCBhcyBhbnkpLmNoaWxkcmVuIHx8XG4gICAgICAoY3VycmVudFN0ZXAgYXMgYW55KS5zdGVwcyAhPT0gKHByZXZpb3VzU3RlcCBhcyBhbnkpLnN0ZXBzIHx8XG4gICAgICBleHBhbmRlZENoYW5nZWQgfHxcbiAgICAgIChjdXJyZW50U3RlcCBhcyBhbnkpLmFjdGl2ZUJyYW5jaFN0ZXBJZCAhPT0gKHByZXZpb3VzU3RlcCBhcyBhbnkpLmFjdGl2ZUJyYW5jaFN0ZXBJZCB8fFxuICAgICAgKGN1cnJlbnRTdGVwIGFzIGFueSkuYnJhbmNoZXMgIT09IChwcmV2aW91c1N0ZXAgYXMgYW55KS5icmFuY2hlcyB8fFxuICAgICAgKChjdXJyZW50U3RlcCBhcyBhbnkpLmNvbmZpZyAmJiAoY3VycmVudFN0ZXAgYXMgYW55KS5jb25maWcuZXhwYW5kZWQgIT09IChwcmV2aW91c1N0ZXAgYXMgYW55KS5jb25maWc/LmV4cGFuZGVkKVxuICAgICk7XG5cbiAgICAvLyBVcGRhdGUgcHJvcGVydGllcyB3aXRob3V0IHJlY3JlYXRpbmcgY29tcG9uZW50IHRvIHByZXZlbnQgYmxpbmtpbmdcbiAgICBpZiAob25seU5lc3RlZERhdGFDaGFuZ2VkICYmIHRoaXMuY29udGFpbmVyLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIEdldCB0aGUgc3RvcmVkIGNvbXBvbmVudCBpbnN0YW5jZVxuICAgICAgY29uc3QgaW5zdGFuY2UgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzLmdldCh0aGlzLmNvbnRhaW5lcik7XG4gICAgICBjb25zdCBjb21wb25lbnRSZWYgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50UmVmcy5nZXQodGhpcy5jb250YWluZXIpO1xuXG4gICAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgICAgLy8gVXNlIGNvbXByZWhlbnNpdmUgdXBkYXRlIG1ldGhvZCBmcm9tIG9yaWdpbmFsXG4gICAgICAgIHRoaXMudXBkYXRlQ29tcG9uZW50SW5zdGFuY2UoY3VycmVudFN0ZXAsIHByZXZpb3VzU3RlcCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRm9yIG90aGVyIGNoYW5nZXMsIHVzZSBjb21wcmVoZW5zaXZlIHVwZGF0ZSBpZiBjb21wb25lbnQgZXhpc3RzXG4gICAgaWYgKHRoaXMuY29udGFpbmVyLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlcy5nZXQodGhpcy5jb250YWluZXIpO1xuICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudFJlZnMuZ2V0KHRoaXMuY29udGFpbmVyKTtcblxuICAgICAgaWYgKGluc3RhbmNlICYmIHByZXZpb3VzU3RlcCAmJiBjdXJyZW50U3RlcCAmJlxuICAgICAgICBwcmV2aW91c1N0ZXAudHlwZSA9PT0gY3VycmVudFN0ZXAudHlwZSAmJlxuICAgICAgICAocHJldmlvdXNTdGVwLnRlc3RTdGVwUmVzdWx0SWQgfHwgcHJldmlvdXNTdGVwLmlkKSA9PT0gKGN1cnJlbnRTdGVwLnRlc3RTdGVwUmVzdWx0SWQgfHwgY3VycmVudFN0ZXAuaWQpKSB7XG4gICAgICAgIC8vIFVwZGF0ZSBleGlzdGluZyBjb21wb25lbnQgaW5zdGFuY2Ugd2l0aCBuZXcgc3RlcCBwcm9wZXJ0aWVzXG4gICAgICAgIHRoaXMudXBkYXRlQ29tcG9uZW50SW5zdGFuY2UoY3VycmVudFN0ZXAsIHByZXZpb3VzU3RlcCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBPbmx5IGxvYWQgY29tcG9uZW50IGlmIGNvbnRhaW5lciBpcyBlbXB0eSAoY29tcG9uZW50IGRvZXNuJ3QgZXhpc3QgeWV0KVxuICAgIC8vIFRoaXMgcHJldmVudHMgdW5uZWNlc3NhcnkgcmVsb2Fkc1xuICAgIGlmICh0aGlzLmNvbnRhaW5lciAmJiB0aGlzLmNvbnRhaW5lci5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMubG9hZENvbXBvbmVudCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRDb21wb25lbnQoKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ29tcG9uZW50SW5zdGFuY2UoY3VycmVudFN0ZXA6IGFueSwgcHJldmlvdXNTdGVwOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMuZ2V0KHRoaXMuY29udGFpbmVyKTtcbiAgICBjb25zdCBjb21wb25lbnRSZWYgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50UmVmcy5nZXQodGhpcy5jb250YWluZXIpO1xuXG4gICAgaWYgKCFpbnN0YW5jZSB8fCAhY29tcG9uZW50UmVmIHx8ICF0aGlzLmNvbnRhaW5lcikgcmV0dXJuO1xuXG4gICAgbGV0IGhhc0NoYW5nZXMgPSBmYWxzZTtcblxuICAgIC8vIExpc3Qgb2YgcHJvcGVydGllcyB0aGF0IGNvbW1vbmx5IGNoYW5nZSBhbmQgbmVlZCB0byBiZSB1cGRhdGVkXG4gICAgY29uc3QgaW1wb3J0YW50UHJvcGVydGllcyA9IFsnc3RhdHVzJywgJ2R1cmF0aW9uJywgJ2V4cGFuZGVkJywgJ3N1YlN0ZXBzJywgJ2NoaWxkcmVuJywgJ25lc3RlZFN0ZXBzJywgJ3N0ZXBzJyxcbiAgICAgICdleGVjdXRpb25EYXRhJywgJ2FjdGlvbicsICd0aXRsZScsICdyZXN1bHQnLCAnbWV0aG9kJywgJ2VuZHBvaW50JywgJ3N0YXR1c0NvZGUnLCAnYnJhbmNoZXMnLFxuICAgICAgJ3Jlc3BvbnNlVGltZScsICdhY3Rpb25zJywgJ3Byb21wdCcsICdvcHRpbWl6ZWRSdW4nLCAnYWN0aW9uQ291bnQnLCAnaXRlcmF0aW9ucycsICdzZWxlY3RlZEl0ZXJhdGlvbklkJywgJ3N0ZXBOdW1iZXInLFxuICAgICAgJ2lzVXBsb2FkaW5nQmFzZWxpbmUnLCAnaXNNYWtpbmdDdXJyZW50QmFzZWxpbmUnLCAnc2VsZWN0ZWRUYWJJbnB1dCcsICdzdGVwRGVsZXRlZCddO1xuXG4gICAgLy8gVXBkYXRlIGltcG9ydGFudCBwcm9wZXJ0aWVzXG4gICAgaW1wb3J0YW50UHJvcGVydGllcy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAvLyBGb3Igc2VsZWN0ZWRJdGVyYXRpb25JZCBvbiBsb29wIHN0ZXBzLCBwcmlvcml0aXplIHRoZSBpbnB1dCB2YWx1ZSBvdmVyIHN0ZXAgdmFsdWVcbiAgICAgIGlmIChrZXkgPT09ICdzZWxlY3RlZEl0ZXJhdGlvbklkJyAmJiBjdXJyZW50U3RlcC50eXBlID09PSAnbG9vcCcgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkO1xuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gKGluc3RhbmNlIGFzIGFueSlba2V5XTtcbiAgICAgICAgaWYgKHRoaXMuaGFzVmFsdWVDaGFuZ2VkKGN1cnJlbnRWYWx1ZSwgcHJldmlvdXNWYWx1ZSkpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KVtrZXldID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZ1trZXldID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBUcnkgdG8gdXBkYXRlIHNlbGVjdGVkSXRlcmF0aW9uIGlmIGl0ZXJhdGlvbnMgYXJlIGF2YWlsYWJsZVxuICAgICAgICAgIHRoaXMudXBkYXRlTG9vcFN0ZXBTZWxlY3RlZEl0ZXJhdGlvbihpbnN0YW5jZSwgY3VycmVudFZhbHVlKTtcbiAgICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdpdGVyYXRpb25zJyAmJiBjdXJyZW50U3RlcC50eXBlID09PSAnbG9vcCcpIHtcbiAgICAgICAgLy8gV2hlbiBpdGVyYXRpb25zIGFyZSB1cGRhdGVkLCBjaGVjayBpZiB3ZSBuZWVkIHRvIHVwZGF0ZSBzZWxlY3RlZEl0ZXJhdGlvblxuICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSAoY3VycmVudFN0ZXAgYXMgYW55KVtrZXldO1xuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gKHByZXZpb3VzU3RlcCBhcyBhbnkpW2tleV07XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzVmFsdWVDaGFuZ2VkKGN1cnJlbnRWYWx1ZSwgcHJldmlvdXNWYWx1ZSkpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KVtrZXldID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZ1trZXldID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcblxuICAgICAgICAgIC8vIEFmdGVyIGl0ZXJhdGlvbnMgYXJlIHVwZGF0ZWQsIHRyeSB0byB1cGRhdGUgc2VsZWN0ZWRJdGVyYXRpb24gaWYgc2VsZWN0ZWRJdGVyYXRpb25JZCBpcyBzZXRcbiAgICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZXJhdGlvbklkID0gKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb25JZCB8fCB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICAgICAgaWYgKHNlbGVjdGVkSXRlcmF0aW9uSWQpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTG9vcFN0ZXBTZWxlY3RlZEl0ZXJhdGlvbihpbnN0YW5jZSwgc2VsZWN0ZWRJdGVyYXRpb25JZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2lzVXBsb2FkaW5nQmFzZWxpbmUnIHx8IGtleSA9PT0gJ2lzTWFraW5nQ3VycmVudEJhc2VsaW5lJykge1xuICAgICAgICAvLyBGb3IgbG9hZGluZyBzdGF0ZSBvYmplY3RzLCBhbHdheXMgdXNlIHRoZSBpbnB1dCB2YWx1ZSAodGhleSdyZSBwYXNzZWQgZnJvbSBwYXJlbnQpXG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGtleSA9PT0gJ2lzVXBsb2FkaW5nQmFzZWxpbmUnID8gdGhpcy5pc1VwbG9hZGluZ0Jhc2VsaW5lIDogdGhpcy5pc01ha2luZ0N1cnJlbnRCYXNlbGluZTtcbiAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IChpbnN0YW5jZSBhcyBhbnkpW2tleV07XG5cbiAgICAgICAgLy8gQWx3YXlzIHVwZGF0ZSBpZiB0aGUgcmVmZXJlbmNlIGNoYW5nZWQgKG5ldyBvYmplY3QgY3JlYXRlZClcbiAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSAhPT0gcHJldmlvdXNWYWx1ZSkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpW2tleV0gPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnW2tleV0gPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ3N0ZXBOdW1iZXInICYmIHRoaXMuc3RlcE51bWJlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIEZvciBzdGVwTnVtYmVyLCBwcmlvcml0aXplIHRoZSBpbnB1dCB2YWx1ZSBvdmVyIHN0ZXAgdmFsdWVcbiAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy5zdGVwTnVtYmVyO1xuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gKGluc3RhbmNlIGFzIGFueSlba2V5XTtcbiAgICAgICAgaWYgKHRoaXMuaGFzVmFsdWVDaGFuZ2VkKGN1cnJlbnRWYWx1ZSwgcHJldmlvdXNWYWx1ZSkpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KVtrZXldID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZ1trZXldID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdhY3Rpb24nICYmIGN1cnJlbnRTdGVwLnR5cGUgPT09ICdhaS1hZ2VudCcpIHtcbiAgICAgICAgLy8gRm9yIGFpLWFnZW50IHN0ZXBzLCBlbnN1cmUgdGl0bGUgYW5kIHByb21wdCBhcmUgc2V0IGZyb20gYWN0aW9uXG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IChjdXJyZW50U3RlcCBhcyBhbnkpW2tleV07XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSAocHJldmlvdXNTdGVwIGFzIGFueSlba2V5XTtcblxuICAgICAgICBpZiAodGhpcy5oYXNWYWx1ZUNoYW5nZWQoY3VycmVudFZhbHVlLCBwcmV2aW91c1ZhbHVlKSkge1xuICAgICAgICAgIC8vIFVwZGF0ZSBhY3Rpb25cbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KVtrZXldID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuXG4gICAgICAgICAgLy8gQWxzbyB1cGRhdGUgdGl0bGUgYW5kIHByb21wdCBmcm9tIGFjdGlvbiBpZiB0aGV5J3JlIG5vdCBzZXQgb3IgZW1wdHlcbiAgICAgICAgICBpZiAoY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoIShpbnN0YW5jZSBhcyBhbnkpLnRpdGxlIHx8ICEoaW5zdGFuY2UgYXMgYW55KS50aXRsZS50cmltKCkpIHtcbiAgICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkudGl0bGUgPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcudGl0bGUgPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghKGluc3RhbmNlIGFzIGFueSkucHJvbXB0IHx8ICEoaW5zdGFuY2UgYXMgYW55KS5wcm9tcHQudHJpbSgpKSB7XG4gICAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnByb21wdCA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5wcm9tcHQgPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IChjdXJyZW50U3RlcCBhcyBhbnkpW2tleV07XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSAocHJldmlvdXNTdGVwIGFzIGFueSlba2V5XTtcblxuICAgICAgICAvLyBVc2UgZGVlcCBjb21wYXJpc29uIGZvciBvYmplY3RzL2FycmF5cywgc2hhbGxvdyBmb3IgcHJpbWl0aXZlc1xuICAgICAgICBpZiAodGhpcy5oYXNWYWx1ZUNoYW5nZWQoY3VycmVudFZhbHVlLCBwcmV2aW91c1ZhbHVlKSkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpW2tleV0gPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFVwZGF0ZSBpc0RlYnVnIGFuZCBkZWJ1Z1BvaW50U2V0IGZyb20gc3RlcC1yZW5kZXJlciBpbnB1dHMgKHBhcmVudCBtYXkgaGF2ZSB1cGRhdGVkIGFmdGVyIHRvZ2dsZSlcbiAgICBpZiAodGhpcy5pc0RlYnVnICE9PSB1bmRlZmluZWQgJiYgKGluc3RhbmNlIGFzIGFueSkuaXNEZWJ1ZyAhPT0gdGhpcy5pc0RlYnVnKSB7XG4gICAgICAoaW5zdGFuY2UgYXMgYW55KS5pc0RlYnVnID0gdGhpcy5pc0RlYnVnO1xuICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgfVxuICAgIGlmICh0aGlzLmdldERlYnVnUG9pbnRTZXRIYW5kbGVyICYmIGN1cnJlbnRTdGVwKSB7XG4gICAgICBjb25zdCBuZXh0RGVidWdQb2ludFNldCA9IHRoaXMuZ2V0RGVidWdQb2ludFNldEhhbmRsZXIoY3VycmVudFN0ZXApO1xuICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmRlYnVnUG9pbnRTZXQgIT09IG5leHREZWJ1Z1BvaW50U2V0KSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmRlYnVnUG9pbnRTZXQgPSBuZXh0RGVidWdQb2ludFNldDtcbiAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWxzbyB1cGRhdGUgYWxsIG90aGVyIHByb3BlcnRpZXNcbiAgICBPYmplY3Qua2V5cyhjdXJyZW50U3RlcCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgaWYgKGtleSAhPT0gJ3R5cGUnICYmICFpbXBvcnRhbnRQcm9wZXJ0aWVzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gKGN1cnJlbnRTdGVwIGFzIGFueSlba2V5XTtcbiAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IChwcmV2aW91c1N0ZXAgYXMgYW55KVtrZXldO1xuXG4gICAgICAgIGlmICh0aGlzLmhhc1ZhbHVlQ2hhbmdlZChjdXJyZW50VmFsdWUsIHByZXZpb3VzVmFsdWUpKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSlba2V5XSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gVXBkYXRlIHNwZWNpYWwgcHJvcGVydGllcyB0aGF0IG1pZ2h0IG5lZWQgc3BlY2lhbCBoYW5kbGluZ1xuICAgIGlmIChjdXJyZW50U3RlcC50eXBlID09PSAnbG9vcCcgJiYgKGN1cnJlbnRTdGVwIGFzIGFueSkuY2hpbGRyZW4gJiYgIShjdXJyZW50U3RlcCBhcyBhbnkpLm5lc3RlZFN0ZXBzKSB7XG4gICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkubmVzdGVkU3RlcHMgIT09IChjdXJyZW50U3RlcCBhcyBhbnkpLmNoaWxkcmVuKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLm5lc3RlZFN0ZXBzID0gKGN1cnJlbnRTdGVwIGFzIGFueSkuY2hpbGRyZW47XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcubmVzdGVkU3RlcHMgPSAoY3VycmVudFN0ZXAgYXMgYW55KS5jaGlsZHJlbjtcbiAgICAgICAgfVxuICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFN0ZXAudHlwZSA9PT0gJ3N0ZXAtZ3JvdXAnICYmIChjdXJyZW50U3RlcCBhcyBhbnkpLmNoaWxkcmVuICYmICEoY3VycmVudFN0ZXAgYXMgYW55KS5zdGVwcykge1xuICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLnN0ZXBzICE9PSAoY3VycmVudFN0ZXAgYXMgYW55KS5jaGlsZHJlbikge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zdGVwcyA9IChjdXJyZW50U3RlcCBhcyBhbnkpLmNoaWxkcmVuO1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLnN0ZXBzID0gKGN1cnJlbnRTdGVwIGFzIGFueSkuY2hpbGRyZW47XG4gICAgICAgIH1cbiAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgY29uZGl0aW9uLXN0ZXA6IGVuc3VyZSBicmFuY2hlcyBpcyBwcm9wZXJseSB1cGRhdGVkXG4gICAgLy8gVXNlIGRlZXAgY29tcGFyaXNvbiB0byBkZXRlY3QgY2hhbmdlcyBpbiBuZXN0ZWQgc3ViU3RlcHNcbiAgICBpZiAoY3VycmVudFN0ZXAudHlwZSA9PT0gJ2NvbmRpdGlvbicgJiYgKGN1cnJlbnRTdGVwIGFzIGFueSkuYnJhbmNoZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgY3VycmVudEJyYW5jaGVzID0gKGN1cnJlbnRTdGVwIGFzIGFueSkuYnJhbmNoZXMgfHwgW107XG4gICAgICBjb25zdCBwcmV2aW91c0JyYW5jaGVzID0gKHByZXZpb3VzU3RlcCBhcyBhbnkpLmJyYW5jaGVzIHx8IFtdO1xuXG4gICAgICAvLyBVc2UgZGVlcCBjb21wYXJpc29uIHRvIGRldGVjdCBuZXN0ZWQgc3ViU3RlcHMgY2hhbmdlc1xuICAgICAgaWYgKHRoaXMuaGFzQnJhbmNoZXNDaGFuZ2VkKGN1cnJlbnRCcmFuY2hlcywgcHJldmlvdXNCcmFuY2hlcykpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGFycmF5IHJlZmVyZW5jZSB0byBlbnN1cmUgY2hhbmdlIGRldGVjdGlvbiB0cmlnZ2Vyc1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5icmFuY2hlcyA9IFsuLi5jdXJyZW50QnJhbmNoZXMubWFwKChicmFuY2g6IGFueSkgPT4gKHtcbiAgICAgICAgICAuLi5icmFuY2gsXG4gICAgICAgICAgc3ViU3RlcHM6IGJyYW5jaC5zdWJTdGVwcyA/IFsuLi5icmFuY2guc3ViU3RlcHNdIDogW11cbiAgICAgICAgfSkpXTtcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5icmFuY2hlcyA9IChpbnN0YW5jZSBhcyBhbnkpLmJyYW5jaGVzO1xuICAgICAgICB9XG4gICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGNvbmRpdGlvbi1zdGVwOiBlbnN1cmUgbmVzdGVkU3RlcHMgaXMgcHJvcGVybHkgdXBkYXRlZFxuICAgIC8vIFRoaXMgaXMgaW1wb3J0YW50IHdoZW4gY2hpbGRyZW4gYXJlIGxvYWRlZCBmcm9tIHRoZSBBUEkgb3Igd2hlbiBzd2l0Y2hpbmcgYnJhbmNoZXNcbiAgICBpZiAoY3VycmVudFN0ZXAudHlwZSA9PT0gJ2NvbmRpdGlvbicgJiYgKGN1cnJlbnRTdGVwIGFzIGFueSkubmVzdGVkU3RlcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgY3VycmVudE5lc3RlZFN0ZXBzID0gKGN1cnJlbnRTdGVwIGFzIGFueSkubmVzdGVkU3RlcHMgfHwgW107XG4gICAgICBjb25zdCBwcmV2aW91c05lc3RlZFN0ZXBzID0gKHByZXZpb3VzU3RlcCBhcyBhbnkpLm5lc3RlZFN0ZXBzIHx8IFtdO1xuICAgICAgY29uc29sZS5sb2coJ/CflIQgc3RlcC1yZW5kZXJlcjogY3VycmVudE5lc3RlZFN0ZXBzJywgY3VycmVudE5lc3RlZFN0ZXBzKTtcbiAgICAgIGNvbnNvbGUubG9nKCfwn5SEIHN0ZXAtcmVuZGVyZXI6IHByZXZpb3VzTmVzdGVkU3RlcHMnLCBwcmV2aW91c05lc3RlZFN0ZXBzKTtcbiAgICAgIC8vIFVzZSBkZWVwIGNvbXBhcmlzb24gdG8gZGV0ZWN0IGNvbnRlbnQgY2hhbmdlcywgbm90IGp1c3QgcmVmZXJlbmNlIGNoYW5nZXNcbiAgICAgIC8vIFRoaXMgaXMgY3JpdGljYWwgd2hlbiBzd2l0Y2hpbmcgYmV0d2VlbiBJRiBhbmQgRUxTRV9JRiBicmFuY2hlc1xuICAgICAgaWYgKHRoaXMuaGFzTmVzdGVkU3RlcHNDaGFuZ2VkKGN1cnJlbnROZXN0ZWRTdGVwcywgcHJldmlvdXNOZXN0ZWRTdGVwcykpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGFycmF5IHJlZmVyZW5jZSB0byBlbnN1cmUgY2hhbmdlIGRldGVjdGlvbiB0cmlnZ2Vyc1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5uZXN0ZWRTdGVwcyA9IFsuLi5jdXJyZW50TmVzdGVkU3RlcHNdO1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLm5lc3RlZFN0ZXBzID0gWy4uLmN1cnJlbnROZXN0ZWRTdGVwc107XG4gICAgICAgIH1cbiAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICAgIGNvbnNvbGUubG9nKCfwn5SEIHN0ZXAtcmVuZGVyZXI6IG5lc3RlZFN0ZXBzIHVwZGF0ZWQgZm9yIGNvbmRpdGlvbi1zdGVwJywge1xuICAgICAgICAgIHN0ZXBJZDogY3VycmVudFN0ZXAuaWQsXG4gICAgICAgICAgcHJldmlvdXNDb3VudDogcHJldmlvdXNOZXN0ZWRTdGVwcy5sZW5ndGgsXG4gICAgICAgICAgY3VycmVudENvdW50OiBjdXJyZW50TmVzdGVkU3RlcHMubGVuZ3RoXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGZpbGUtZG93bmxvYWQgKGluY2x1ZGluZyBnZW5lcmF0ZURvY3VtZW50KTogc3luYyBmcm9tIGdlbmVyYXRlRG9jdW1lbnRSZXN1bHRcbiAgICBpZiAodGhpcy5nZXRFZmZlY3RpdmVTdGVwVHlwZShjdXJyZW50U3RlcCkgPT09ICdmaWxlLWRvd25sb2FkJykge1xuICAgICAgY29uc3QgZ2QgPSAoY3VycmVudFN0ZXAgYXMgYW55KS5leGVjdXRlZFJlc3VsdD8uZ2VuZXJhdGVEb2N1bWVudFJlc3VsdDtcbiAgICAgIGNvbnN0IHByZXZHZCA9IChwcmV2aW91c1N0ZXAgYXMgYW55KS5leGVjdXRlZFJlc3VsdD8uZ2VuZXJhdGVEb2N1bWVudFJlc3VsdDtcbiAgICAgIGlmIChnZCAhPT0gcHJldkdkIHx8IGdkPy5maWxlTmFtZSAhPT0gcHJldkdkPy5maWxlTmFtZSB8fCBnZD8uZmlsZVR5cGUgIT09IHByZXZHZD8uZmlsZVR5cGUgfHwgZ2Q/LnMzRmlsZU5hbWUgIT09IHByZXZHZD8uczNGaWxlTmFtZSkge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5maWxlTmFtZSA9IGdkPy5maWxlTmFtZSA/PyAoaW5zdGFuY2UgYXMgYW55KS5maWxlTmFtZSA/PyAnJztcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZmlsZVR5cGUgPSBnZD8uZmlsZVR5cGUgPz8gKGluc3RhbmNlIGFzIGFueSkuZmlsZVR5cGUgPz8gJyc7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmZpbGVQYXRoID0gZ2Q/LnMzRmlsZU5hbWUgPz8gKGluc3RhbmNlIGFzIGFueSkuZmlsZVBhdGg7XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuZmlsZU5hbWUgPSAoaW5zdGFuY2UgYXMgYW55KS5maWxlTmFtZTtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuZmlsZVR5cGUgPSAoaW5zdGFuY2UgYXMgYW55KS5maWxlVHlwZTtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuZmlsZVBhdGggPSAoaW5zdGFuY2UgYXMgYW55KS5maWxlUGF0aDtcbiAgICAgICAgfVxuICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRpZCA9IChjdXJyZW50U3RlcCBhcyBhbnkpLnRlc3RTdGVwUmVzdWx0SWQ7XG4gICAgICBjb25zdCBuZXh0RG93bmxvYWRpbmcgPSAhIXRpZCAmJiB0aGlzLmRvd25sb2FkaW5nU3RlcElkID09PSB0aWQ7XG4gICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuaXNEb3dubG9hZGluZyAhPT0gbmV4dERvd25sb2FkaW5nKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmlzRG93bmxvYWRpbmcgPSBuZXh0RG93bmxvYWRpbmc7XG4gICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGxvb3Atc3RlcDogZW5zdXJlIHNlbGVjdGVkSXRlcmF0aW9uSWQgZnJvbSBpbnB1dCBpcyB1c2VkXG4gICAgaWYgKGN1cnJlbnRTdGVwLnR5cGUgPT09ICdsb29wJyAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgY3VycmVudFNlbGVjdGVkSXRlcmF0aW9uSWQgPSB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICBjb25zdCBpbnN0YW5jZVNlbGVjdGVkSXRlcmF0aW9uSWQgPSAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkO1xuXG4gICAgICAvLyBOb3JtYWxpemUgdmFsdWVzIHRvIGhhbmRsZSBudWxsL3VuZGVmaW5lZCBjb25zaXN0ZW50bHlcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZVZhbHVlID0gKHZhbDogYW55KSA9PiB2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQgPyAnJyA6IFN0cmluZyh2YWwpO1xuICAgICAgY29uc3QgY3VycmVudE5vcm1hbGl6ZWQgPSBub3JtYWxpemVWYWx1ZShjdXJyZW50U2VsZWN0ZWRJdGVyYXRpb25JZCk7XG4gICAgICBjb25zdCBpbnN0YW5jZU5vcm1hbGl6ZWQgPSBub3JtYWxpemVWYWx1ZShpbnN0YW5jZVNlbGVjdGVkSXRlcmF0aW9uSWQpO1xuXG4gICAgICBpZiAoY3VycmVudE5vcm1hbGl6ZWQgIT09IGluc3RhbmNlTm9ybWFsaXplZCkge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkID0gY3VycmVudFNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuc2VsZWN0ZWRJdGVyYXRpb25JZCA9IGN1cnJlbnRTZWxlY3RlZEl0ZXJhdGlvbklkO1xuICAgICAgICB9XG4gICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGxvb3Atc3RlcDogZW5zdXJlIHNlbGVjdGVkSXRlcmF0aW9uSWQgZnJvbSBpbnB1dCBpcyB1c2VkXG4gICAgaWYgKGN1cnJlbnRTdGVwLnR5cGUgPT09ICdsb29wJyAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgY3VycmVudFNlbGVjdGVkSXRlcmF0aW9uSWQgPSB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICBjb25zdCBpbnN0YW5jZVNlbGVjdGVkSXRlcmF0aW9uSWQgPSAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkO1xuXG4gICAgICAvLyBOb3JtYWxpemUgdmFsdWVzIHRvIGhhbmRsZSBudWxsL3VuZGVmaW5lZCBjb25zaXN0ZW50bHlcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZVZhbHVlID0gKHZhbDogYW55KSA9PiB2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQgPyAnJyA6IFN0cmluZyh2YWwpO1xuICAgICAgY29uc3QgY3VycmVudE5vcm1hbGl6ZWQgPSBub3JtYWxpemVWYWx1ZShjdXJyZW50U2VsZWN0ZWRJdGVyYXRpb25JZCk7XG4gICAgICBjb25zdCBpbnN0YW5jZU5vcm1hbGl6ZWQgPSBub3JtYWxpemVWYWx1ZShpbnN0YW5jZVNlbGVjdGVkSXRlcmF0aW9uSWQpO1xuXG4gICAgICBpZiAoY3VycmVudE5vcm1hbGl6ZWQgIT09IGluc3RhbmNlTm9ybWFsaXplZCkge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkID0gY3VycmVudFNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuc2VsZWN0ZWRJdGVyYXRpb25JZCA9IGN1cnJlbnRTZWxlY3RlZEl0ZXJhdGlvbklkO1xuICAgICAgICB9XG4gICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBleHBhbmRlZCBzdGF0ZSAtIHVzZSBzZXRJbnB1dCB0byBwcm9wZXJseSB0cmlnZ2VyIG5nT25DaGFuZ2VzXG4gICAgLy8gQWx3YXlzIHJlY2FsY3VsYXRlIGV4cGFuZGVkIHN0YXRlIHVzaW5nIGhhbmRsZXIgaWYgYXZhaWxhYmxlLCBhcyBpdCBtYXkgZGVwZW5kIG9uIHBhcmVudCBzdGF0ZVxuICAgIGxldCBleHBhbmRlZFN0YXRlOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLmlzU3RlcEV4cGFuZGVkSGFuZGxlciAmJiBjdXJyZW50U3RlcCkge1xuICAgICAgZXhwYW5kZWRTdGF0ZSA9IHRoaXMuaXNTdGVwRXhwYW5kZWRIYW5kbGVyKGN1cnJlbnRTdGVwKTtcbiAgICB9IGVsc2UgaWYgKChjdXJyZW50U3RlcCBhcyBhbnkpLmV4cGFuZGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4cGFuZGVkU3RhdGUgPSAoY3VycmVudFN0ZXAgYXMgYW55KS5leHBhbmRlZDtcbiAgICB9XG4gICAgXG4gICAgLy8gVXBkYXRlIGV4cGFuZGVkIGlmIGl0IGNoYW5nZWRcbiAgICBpZiAoZXhwYW5kZWRTdGF0ZSAhPT0gdW5kZWZpbmVkICYmIChpbnN0YW5jZSBhcyBhbnkpLmV4cGFuZGVkICE9PSBleHBhbmRlZFN0YXRlKSB7XG4gICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gKGluc3RhbmNlIGFzIGFueSkuZXhwYW5kZWQ7XG4gICAgICAvLyBVc2Ugc2V0SW5wdXQgdG8gcHJvcGVybHkgdXBkYXRlIHRoZSBASW5wdXQoKSBleHBhbmRlZCBwcm9wZXJ0eVxuICAgICAgLy8gVGhpcyBlbnN1cmVzIG5nT25DaGFuZ2VzIGlzIGNhbGxlZCBpbiBjaGlsZCBjb21wb25lbnRzXG4gICAgICBpZiAoY29tcG9uZW50UmVmICYmIHR5cGVvZiAoY29tcG9uZW50UmVmIGFzIGFueSkuc2V0SW5wdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgKGNvbXBvbmVudFJlZiBhcyBhbnkpLnNldElucHV0KCdleHBhbmRlZCcsIGV4cGFuZGVkU3RhdGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRmFsbGJhY2sgZm9yIG9sZGVyIEFuZ3VsYXIgdmVyc2lvbnM6IG1hbnVhbGx5IHRyaWdnZXIgbmdPbkNoYW5nZXNcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZXhwYW5kZWQgPSBleHBhbmRlZFN0YXRlO1xuICAgICAgICAvLyBNYW51YWxseSBjYWxsIG5nT25DaGFuZ2VzIGlmIHRoZSBjb21wb25lbnQgaW1wbGVtZW50cyBpdFxuICAgICAgICBpZiAodHlwZW9mIChpbnN0YW5jZSBhcyBhbnkpLm5nT25DaGFuZ2VzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgY29uc3QgY2hhbmdlczogU2ltcGxlQ2hhbmdlcyA9IHtcbiAgICAgICAgICAgIGV4cGFuZGVkOiBuZXcgU2ltcGxlQ2hhbmdlKHByZXZpb3VzVmFsdWUsIGV4cGFuZGVkU3RhdGUsIHByZXZpb3VzVmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICB9O1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLm5nT25DaGFuZ2VzKGNoYW5nZXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5leHBhbmRlZCA9IGV4cGFuZGVkU3RhdGU7XG4gICAgICB9XG4gICAgICAvLyBBbHNvIHVwZGF0ZSB0aGUgc3RlcCBvYmplY3QncyBleHBhbmRlZCBwcm9wZXJ0eSB0byBrZWVwIGl0IGluIHN5bmNcbiAgICAgIGlmIChjdXJyZW50U3RlcCkge1xuICAgICAgICAoY3VycmVudFN0ZXAgYXMgYW55KS5leHBhbmRlZCA9IGV4cGFuZGVkU3RhdGU7XG4gICAgICB9XG4gICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgY29uZmlnIHJlZmVyZW5jZSAtIGVuc3VyZSBhbGwgcHJvcGVydGllcyBpbmNsdWRpbmcgYnJhbmNoZXMgYXJlIGluY2x1ZGVkXG4gICAgaWYgKCdjb25maWcnIGluIGluc3RhbmNlKSB7XG4gICAgICAvLyBVcGRhdGUgY29uZmlnIHdpdGggY3VycmVudCBzdGVwIHRvIGVuc3VyZSBhbGwgcHJvcGVydGllcyBpbmNsdWRpbmcgYnJhbmNoZXMgYXJlIHN5bmNlZFxuICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnID0geyAuLi4oaW5zdGFuY2UgYXMgYW55KS5jb25maWcsIC4uLmN1cnJlbnRTdGVwIH07XG4gICAgICAvLyBFeHBsaWNpdGx5IGVuc3VyZSBicmFuY2hlcyBpcyB1cGRhdGVkIGZvciBjb25kaXRpb24tc3RlcCAoaW4gY2FzZSBpdCB3YXMgbmVzdGVkKVxuICAgICAgLy8gVXNlIHRoZSBhbHJlYWR5IHVwZGF0ZWQgYnJhbmNoZXMgZnJvbSBpbnN0YW5jZSB0byBtYWludGFpbiByZWZlcmVuY2UgY29uc2lzdGVuY3lcbiAgICAgIGlmIChjdXJyZW50U3RlcC50eXBlID09PSAnY29uZGl0aW9uJyAmJiAoaW5zdGFuY2UgYXMgYW55KS5icmFuY2hlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5icmFuY2hlcyA9IChpbnN0YW5jZSBhcyBhbnkpLmJyYW5jaGVzO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBzdGVwIHByb3BlcnR5IGlmIGl0IGV4aXN0cyBvbiB0aGUgaW5zdGFuY2VcbiAgICBpZiAoJ3N0ZXAnIGluIGluc3RhbmNlKSB7XG4gICAgICAoaW5zdGFuY2UgYXMgYW55KS5zdGVwID0gY3VycmVudFN0ZXA7XG4gICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgc2VsZkhlYWxBbmFseXNpcyB1c2luZyBoYW5kbGVyIGlmIGF2YWlsYWJsZVxuICAgIGlmICh0aGlzLmdldFNlbGZIZWFsQW5hbHlzaXNIYW5kbGVyICYmIGN1cnJlbnRTdGVwKSB7XG4gICAgICBjb25zdCBzZWxmSGVhbEFuYWx5c2lzID0gdGhpcy5nZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlcihjdXJyZW50U3RlcCk7XG4gICAgICBjb25zdCBwcmV2aW91c1NlbGZIZWFsQW5hbHlzaXMgPSAoaW5zdGFuY2UgYXMgYW55KS5zZWxmSGVhbEFuYWx5c2lzO1xuICAgICAgXG4gICAgICBpZiAodGhpcy5oYXNWYWx1ZUNoYW5nZWQoc2VsZkhlYWxBbmFseXNpcywgcHJldmlvdXNTZWxmSGVhbEFuYWx5c2lzKSkge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zZWxmSGVhbEFuYWx5c2lzID0gc2VsZkhlYWxBbmFseXNpcztcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5zZWxmSGVhbEFuYWx5c2lzID0gc2VsZkhlYWxBbmFseXNpcztcbiAgICAgICAgfVxuICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUcmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSBpZiB0aGVyZSB3ZXJlIGNoYW5nZXNcbiAgICAvLyBUaGlzIGVuc3VyZXMgb25seSB0aGUgbmVzdGVkIHN0ZXAgdXBkYXRlcyB3aXRob3V0IGFmZmVjdGluZyBwYXJlbnQgc3RlcHNcbiAgICBpZiAoaGFzQ2hhbmdlcykge1xuICAgICAgaWYgKGNvbXBvbmVudFJlZi5pbmplY3Rvcikge1xuICAgICAgICBjb25zdCBpbnN0YW5jZUNkciA9IGNvbXBvbmVudFJlZi5pbmplY3Rvci5nZXQoQ2hhbmdlRGV0ZWN0b3JSZWYsIG51bGwpO1xuICAgICAgICBpZiAoaW5zdGFuY2VDZHIpIHtcbiAgICAgICAgICBpbnN0YW5jZUNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICBpbnN0YW5jZUNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoKGluc3RhbmNlIGFzIGFueSkuY2RyKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9IGVsc2UgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNoYW5nZURldGVjdG9yUmVmKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cbiAgICAgIC8vIERvbid0IGNhbGwgbWFya0ZvckNoZWNrIG9uIHRoaXMgY29tcG9uZW50IHRvIGF2b2lkIHRyaWdnZXJpbmcgcGFyZW50IHJlLXJlbmRlcnNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCB0byB1cGRhdGUgbG9vcC1zdGVwIHNlbGVjdGVkSXRlcmF0aW9uIHdoZW4gc2VsZWN0ZWRJdGVyYXRpb25JZCBjaGFuZ2VzXG4gICAqIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBpdGVyYXRpb25zIG1pZ2h0IG5vdCBiZSBsb2FkZWQgeWV0XG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZUxvb3BTdGVwU2VsZWN0ZWRJdGVyYXRpb24oaW5zdGFuY2U6IGFueSwgc2VsZWN0ZWRJdGVyYXRpb25JZDogc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKCFpbnN0YW5jZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgaXRlcmF0aW9ucyA9IChpbnN0YW5jZSBhcyBhbnkpLml0ZXJhdGlvbnMgfHwgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnPy5pdGVyYXRpb25zIHx8IFtdO1xuXG4gICAgaWYgKGl0ZXJhdGlvbnMgJiYgaXRlcmF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoc2VsZWN0ZWRJdGVyYXRpb25JZCkge1xuICAgICAgICBjb25zdCBmb3VuZCA9IGl0ZXJhdGlvbnMuZmluZCgoaXRlcjogYW55KSA9PiBpdGVyLmlkID09PSBzZWxlY3RlZEl0ZXJhdGlvbklkKTtcbiAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb24gPSBmb3VuZDtcbiAgICAgICAgICAvLyBTeW5jIHVzZXJTZWxlY3RlZEl0ZXJhdGlvbklkIHdpdGggdGhlIGlucHV0IHZhbHVlXG4gICAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLnVzZXJTZWxlY3RlZEl0ZXJhdGlvbklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnVzZXJTZWxlY3RlZEl0ZXJhdGlvbklkID0gc2VsZWN0ZWRJdGVyYXRpb25JZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gSWYgbm90IGZvdW5kLCBzZWxlY3QgZGVmYXVsdFxuICAgICAgICAgIGlmICh0eXBlb2YgKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0RGVmYXVsdEl0ZXJhdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0RGVmYXVsdEl0ZXJhdGlvbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSWYgbm8gdmFsdWUgcHJvdmlkZWQsIHNlbGVjdCBkZWZhdWx0XG4gICAgICAgIGlmICh0eXBlb2YgKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0RGVmYXVsdEl0ZXJhdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdERlZmF1bHRJdGVyYXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBJZiBpdGVyYXRpb25zIGFyZSBub3QgYXZhaWxhYmxlIHlldCwgdGhlIHNlbGVjdGVkSXRlcmF0aW9uSWQgaXMgYWxyZWFkeSBzZXRcbiAgICAvLyBhbmQgd2lsbCBiZSB1c2VkIHdoZW4gaXRlcmF0aW9ucyBiZWNvbWUgYXZhaWxhYmxlIChoYW5kbGVkIGluIHVwZGF0ZUNvbXBvbmVudEluc3RhbmNlIGFuZCBuZ0RvQ2hlY2spXG4gIH1cblxuICBwcml2YXRlIGhhc1ZhbHVlQ2hhbmdlZChjdXJyZW50OiBhbnksIHByZXZpb3VzOiBhbnkpOiBib29sZWFuIHtcbiAgICAvLyBTaGFsbG93IGNvbXBhcmlzb24gZm9yIHByaW1pdGl2ZXNcbiAgICBpZiAoY3VycmVudCA9PT0gcHJldmlvdXMpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIEhhbmRsZSBudWxsL3VuZGVmaW5lZFxuICAgIGlmIChjdXJyZW50ID09IG51bGwgfHwgcHJldmlvdXMgPT0gbnVsbCkgcmV0dXJuIGN1cnJlbnQgIT09IHByZXZpb3VzO1xuXG4gICAgLy8gRm9yIGFycmF5cywgY2hlY2sgbGVuZ3RoIGFuZCByZWZlcmVuY2VcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50KSB8fCBBcnJheS5pc0FycmF5KHByZXZpb3VzKSkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY3VycmVudCkgIT09IEFycmF5LmlzQXJyYXkocHJldmlvdXMpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChjdXJyZW50Lmxlbmd0aCAhPT0gcHJldmlvdXMubGVuZ3RoKSByZXR1cm4gdHJ1ZTtcbiAgICAgIHJldHVybiBjdXJyZW50ICE9PSBwcmV2aW91czsgLy8gUmVmZXJlbmNlIGNoZWNrXG4gICAgfVxuXG4gICAgLy8gRm9yIG9iamVjdHMsIGRvIHNoYWxsb3cgY29tcGFyaXNvbiAoY2hlY2sgcmVmZXJlbmNlKVxuICAgIGlmICh0eXBlb2YgY3VycmVudCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHByZXZpb3VzID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIGN1cnJlbnQgIT09IHByZXZpb3VzOyAvLyBSZWZlcmVuY2UgY2hlY2tcbiAgICB9XG5cbiAgICAvLyBGb3IgcHJpbWl0aXZlc1xuICAgIHJldHVybiBjdXJyZW50ICE9PSBwcmV2aW91cztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWVwIGNvbXBhcmlzb24gZm9yIGJyYW5jaGVzIGFycmF5IHRvIGRldGVjdCBjaGFuZ2VzIGluIG5lc3RlZCBzdWJTdGVwc1xuICAgKi9cbiAgcHJpdmF0ZSBoYXNCcmFuY2hlc0NoYW5nZWQoY3VycmVudDogYW55W10sIHByZXZpb3VzOiBhbnlbXSk6IGJvb2xlYW4ge1xuICAgIGlmICghY3VycmVudCAmJiAhcHJldmlvdXMpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIWN1cnJlbnQgfHwgIXByZXZpb3VzKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoY3VycmVudC5sZW5ndGggIT09IHByZXZpb3VzLmxlbmd0aCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGN1cnJlbnQgPT09IHByZXZpb3VzKSByZXR1cm4gZmFsc2U7IC8vIFNhbWUgcmVmZXJlbmNlXG5cbiAgICAvLyBDb21wYXJlIGVhY2ggYnJhbmNoIGFuZCBpdHMgc3ViU3RlcHNcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN1cnJlbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRCcmFuY2ggPSBjdXJyZW50W2ldO1xuICAgICAgY29uc3QgcHJldmlvdXNCcmFuY2ggPSBwcmV2aW91c1tpXTtcblxuICAgICAgaWYgKCFwcmV2aW91c0JyYW5jaCkgcmV0dXJuIHRydWU7XG5cbiAgICAgIC8vIENoZWNrIGlmIGJyYW5jaCBwcm9wZXJ0aWVzIGNoYW5nZWRcbiAgICAgIGlmIChjdXJyZW50QnJhbmNoLnR5cGUgIT09IHByZXZpb3VzQnJhbmNoLnR5cGUgfHxcbiAgICAgICAgY3VycmVudEJyYW5jaC5sYWJlbCAhPT0gcHJldmlvdXNCcmFuY2gubGFiZWwgfHxcbiAgICAgICAgY3VycmVudEJyYW5jaC5leGVjdXRlZCAhPT0gcHJldmlvdXNCcmFuY2guZXhlY3V0ZWQgfHxcbiAgICAgICAgY3VycmVudEJyYW5jaC5jb25kaXRpb25UeXBlICE9PSBwcmV2aW91c0JyYW5jaC5jb25kaXRpb25UeXBlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiBzdWJTdGVwcyBhcnJheSBjaGFuZ2VkIChsZW5ndGggb3IgcmVmZXJlbmNlKVxuICAgICAgY29uc3QgY3VycmVudFN1YlN0ZXBzID0gY3VycmVudEJyYW5jaC5zdWJTdGVwcyB8fCBbXTtcbiAgICAgIGNvbnN0IHByZXZpb3VzU3ViU3RlcHMgPSBwcmV2aW91c0JyYW5jaC5zdWJTdGVwcyB8fCBbXTtcblxuICAgICAgaWYgKGN1cnJlbnRTdWJTdGVwcy5sZW5ndGggIT09IHByZXZpb3VzU3ViU3RlcHMubGVuZ3RoKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChjdXJyZW50U3ViU3RlcHMgIT09IHByZXZpb3VzU3ViU3RlcHMpIHJldHVybiB0cnVlOyAvLyBSZWZlcmVuY2UgY2hlY2tcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogRGVlcCBjb21wYXJpc29uIGZvciBuZXN0ZWRTdGVwcyBhcnJheSB0byBkZXRlY3QgY29udGVudCBjaGFuZ2VzXG4gICAqIFRoaXMgaXMgaW1wb3J0YW50IGZvciBjb25kaXRpb24gc3RlcHMgd2hlbiBzd2l0Y2hpbmcgYmV0d2VlbiBicmFuY2hlc1xuICAgKi9cbiAgcHJpdmF0ZSBoYXNOZXN0ZWRTdGVwc0NoYW5nZWQoY3VycmVudDogYW55W10sIHByZXZpb3VzOiBhbnlbXSk6IGJvb2xlYW4ge1xuICAgIGlmICghY3VycmVudCAmJiAhcHJldmlvdXMpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIWN1cnJlbnQgfHwgIXByZXZpb3VzKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoY3VycmVudC5sZW5ndGggIT09IHByZXZpb3VzLmxlbmd0aCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGN1cnJlbnQgPT09IHByZXZpb3VzKSByZXR1cm4gZmFsc2U7IC8vIFNhbWUgcmVmZXJlbmNlXG5cbiAgICAvLyBDb21wYXJlIGVhY2ggc3RlcCBieSBJRCB0byBkZXRlY3QgY29udGVudCBjaGFuZ2VzXG4gICAgLy8gVGhpcyBoYW5kbGVzIGNhc2VzIHdoZXJlIGFycmF5IGxlbmd0aCBpcyBzYW1lIGJ1dCBjb250ZW50IGRpZmZlcnMgKGUuZy4sIHN3aXRjaGluZyBicmFuY2hlcylcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN1cnJlbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRTdGVwID0gY3VycmVudFtpXTtcbiAgICAgIGNvbnN0IHByZXZpb3VzU3RlcCA9IHByZXZpb3VzW2ldO1xuXG4gICAgICBpZiAoIXByZXZpb3VzU3RlcCkgcmV0dXJuIHRydWU7XG5cbiAgICAgIC8vIENvbXBhcmUgc3RlcCBJRHMgLSBpZiBJRHMgZGlmZmVyLCBjb250ZW50IGhhcyBjaGFuZ2VkXG4gICAgICBjb25zdCBjdXJyZW50U3RlcElkID0gY3VycmVudFN0ZXAuaWQgfHwgY3VycmVudFN0ZXAudGVzdFN0ZXBSZXN1bHRJZDtcbiAgICAgIGNvbnN0IHByZXZpb3VzU3RlcElkID0gcHJldmlvdXNTdGVwLmlkIHx8IHByZXZpb3VzU3RlcC50ZXN0U3RlcFJlc3VsdElkO1xuXG4gICAgICBpZiAoY3VycmVudFN0ZXBJZCAhPT0gcHJldmlvdXNTdGVwSWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEFsc28gY2hlY2sgaWYgdGhlIHN0ZXAgdHlwZSBjaGFuZ2VkIChpbXBvcnRhbnQgZm9yIGJyYW5jaCBzd2l0Y2hpbmcpXG4gICAgICBpZiAoY3VycmVudFN0ZXAudHlwZSAhPT0gcHJldmlvdXNTdGVwLnR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRlc3RTdGVwVHlwZSBjaGFuZ2VkIChJRiB2cyBFTFNFX0lGIHZzIEVMU0UpXG4gICAgICBpZiAoY3VycmVudFN0ZXAudGVzdFN0ZXBUeXBlICE9PSBwcmV2aW91c1N0ZXAudGVzdFN0ZXBUeXBlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBmb3IgdXBkYXRlIHRva2VuIGlmIHByZXNlbnQgKHVzZWQgdG8gZm9yY2UgcmUtcmVuZGVyKVxuICAgICAgaWYgKGN1cnJlbnRTdGVwLl91cGRhdGVUb2tlbiAmJiBjdXJyZW50U3RlcC5fdXBkYXRlVG9rZW4gIT09IHByZXZpb3VzU3RlcC5fdXBkYXRlVG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTdGVwS2V5KHN0ZXA6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKCFzdGVwKSByZXR1cm4gJyc7XG4gICAgLy8gQ3JlYXRlIGEga2V5IGZyb20gaW1wb3J0YW50IHByb3BlcnRpZXMgdGhhdCBjaGFuZ2VcbiAgICAvLyBJbmNsdWRlIGV4ZWN1dGlvbkRhdGEuc3RlcFN0YXR1cyBmb3IgbGl2ZSBleGVjdXRpb24gc2NlbmFyaW9zXG4gICAgY29uc3QgZXhlY3V0aW9uU3RhdHVzID0gc3RlcC5leGVjdXRpb25EYXRhPy5zdGVwU3RhdHVzIHx8IHN0ZXAuc3RhdHVzIHx8ICcnO1xuICAgIC8vIEluY2x1ZGUgYnJhbmNoZXMgbGVuZ3RoIGZvciBjb25kaXRpb24tc3RlcCBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgY29uc3QgYnJhbmNoZXNMZW5ndGggPSAoc3RlcC5icmFuY2hlcyB8fCBbXSkubGVuZ3RoO1xuICAgIC8vIEluY2x1ZGUgdG90YWwgc3ViU3RlcHMgY291bnQgYWNyb3NzIGFsbCBicmFuY2hlcyBmb3IgbmVzdGVkIGNoYW5nZSBkZXRlY3Rpb25cbiAgICBjb25zdCB0b3RhbFN1YlN0ZXBzID0gKHN0ZXAuYnJhbmNoZXMgfHwgW10pLnJlZHVjZSgoc3VtOiBudW1iZXIsIGJyYW5jaDogYW55KSA9PiB7XG4gICAgICByZXR1cm4gc3VtICsgKGJyYW5jaC5zdWJTdGVwcz8ubGVuZ3RoIHx8IDApO1xuICAgIH0sIDApO1xuICAgIHJldHVybiBgJHtzdGVwLmlkIHx8ICcnfV8ke2V4ZWN1dGlvblN0YXR1c31fJHtzdGVwLnN0YXR1cyB8fCAnJ31fJHtzdGVwLmR1cmF0aW9uIHx8ICcnfV8ke3N0ZXAuZXhwYW5kZWQgfHwgZmFsc2V9XyR7KHN0ZXAuY2hpbGRyZW4gfHwgW10pLmxlbmd0aH1fJHsoc3RlcC5uZXN0ZWRTdGVwcyB8fCBbXSkubGVuZ3RofV8keyhzdGVwLnN0ZXBzIHx8IFtdKS5sZW5ndGh9XyR7YnJhbmNoZXNMZW5ndGh9XyR7dG90YWxTdWJTdGVwc31fJHtzdGVwLnN0ZXBOdW1iZXIgfHwgJyd9XyR7c3RlcC5zdGVwRGVsZXRlZCB8fCBmYWxzZX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkQ29tcG9uZW50KCkge1xuICAgIFxuICAgIGlmICghdGhpcy5jb250YWluZXIgfHwgIXRoaXMuc3RlcCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY3VycmVudFN0ZXBJZCA9ICh0aGlzLnN0ZXAgYXMgYW55KS50ZXN0U3RlcFJlc3VsdElkIHx8IHRoaXMuc3RlcC5pZDtcbiAgICBjb25zdCBjdXJyZW50U3RlcFR5cGUgPSB0aGlzLmdldEVmZmVjdGl2ZVN0ZXBUeXBlKHRoaXMuc3RlcCkgfHwgKHRoaXMuc3RlcCBhcyBhbnkpLnR5cGU7XG5cbiAgICAvLyBPbmx5IGNsZWFyIGFuZCByZWNyZWF0ZSBpZiBzdGVwIElEIG9yIHR5cGUgYWN0dWFsbHkgY2hhbmdlZFxuICAgIGNvbnN0IG5lZWRzUmVjcmVhdGlvbiA9IHRoaXMubGFzdFN0ZXBJZCAhPT0gY3VycmVudFN0ZXBJZCB8fCB0aGlzLmxhc3RTdGVwVHlwZSAhPT0gY3VycmVudFN0ZXBUeXBlO1xuXG4gICAgaWYgKG5lZWRzUmVjcmVhdGlvbikge1xuICAgICAgdGhpcy5jb250YWluZXIuY2xlYXIoKTtcbiAgICAgIC8vIENsZWFyIHN0b3JlZCBpbnN0YW5jZSB3aGVuIHJlY3JlYXRpbmdcbiAgICAgIGNvbnN0IG9sZEluc3RhbmNlID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlcy5nZXQodGhpcy5jb250YWluZXIpO1xuICAgICAgaWYgKG9sZEluc3RhbmNlKSB7XG4gICAgICAgIFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5kZWxldGUob2xkSW5zdGFuY2UpO1xuICAgICAgfVxuICAgICAgU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlcy5kZWxldGUodGhpcy5jb250YWluZXIpO1xuICAgICAgU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudFJlZnMuZGVsZXRlKHRoaXMuY29udGFpbmVyKTtcbiAgICAgIHRoaXMubGFzdFN0ZXBJZCA9IGN1cnJlbnRTdGVwSWQ7XG4gICAgICB0aGlzLmxhc3RTdGVwVHlwZSA9IGN1cnJlbnRTdGVwVHlwZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgc2FtZSBzdGVwLCBqdXN0IHVwZGF0ZSBwcm9wZXJ0aWVzIHdpdGhvdXQgY2xlYXJpbmdcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlcy5nZXQodGhpcy5jb250YWluZXIpO1xuICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudFJlZnMuZ2V0KHRoaXMuY29udGFpbmVyKTtcbiAgICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgICAvLyBVcGRhdGUgYWxsIHByb3BlcnRpZXNcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5zdGVwKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgaWYgKGtleSAhPT0gJ3R5cGUnKSB7XG4gICAgICAgICAgICAvLyBVc2Ugc2V0SW5wdXQgZm9yIGlucHV0IHByb3BlcnRpZXMgdG8gdHJpZ2dlciBuZ09uQ2hhbmdlc1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gJ2V4cGFuZGVkJyAmJiBjb21wb25lbnRSZWYpIHtcbiAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IChpbnN0YW5jZSBhcyBhbnkpW2tleV07XG4gICAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gKHRoaXMuc3RlcCBhcyBhbnkpW2tleV07XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgKGNvbXBvbmVudFJlZiBhcyBhbnkpLnNldElucHV0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgKGNvbXBvbmVudFJlZiBhcyBhbnkpLnNldElucHV0KCdleHBhbmRlZCcsIG5ld1ZhbHVlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBGYWxsYmFjazogbWFudWFsbHkgdHJpZ2dlciBuZ09uQ2hhbmdlc1xuICAgICAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpW2tleV0gPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChpbnN0YW5jZSBhcyBhbnkpLm5nT25DaGFuZ2VzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzID0ge1xuICAgICAgICAgICAgICAgICAgICBleHBhbmRlZDogbmV3IFNpbXBsZUNoYW5nZShwcmV2aW91c1ZhbHVlLCBuZXdWYWx1ZSwgcHJldmlvdXNWYWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLm5nT25DaGFuZ2VzKGNoYW5nZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSlba2V5XSA9ICh0aGlzLnN0ZXAgYXMgYW55KVtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcgPSB7IC4uLihpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZywgLi4udGhpcy5zdGVwIH07XG4gICAgICAgIH1cbiAgICAgICAgLy8gU3luYyBmaWxlLWRvd25sb2FkIChnZW5lcmF0ZURvY3VtZW50KSBwcm9wcyBmcm9tIGdlbmVyYXRlRG9jdW1lbnRSZXN1bHRcbiAgICAgICAgY29uc3QgZWZmZWN0aXZlVHlwZUZvclVwZGF0ZSA9IHRoaXMuZ2V0RWZmZWN0aXZlU3RlcFR5cGUodGhpcy5zdGVwKSB8fCAodGhpcy5zdGVwIGFzIGFueSkudHlwZTtcbiAgICAgICAgaWYgKGVmZmVjdGl2ZVR5cGVGb3JVcGRhdGUgPT09ICdmaWxlLWRvd25sb2FkJykge1xuICAgICAgICAgIGNvbnN0IGdkID0gKHRoaXMuc3RlcCBhcyBhbnkpLmV4ZWN1dGVkUmVzdWx0Py5nZW5lcmF0ZURvY3VtZW50UmVzdWx0O1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmZpbGVOYW1lID0gZ2Q/LmZpbGVOYW1lID8/IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVOYW1lID8/ICcnO1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmZpbGVUeXBlID0gZ2Q/LmZpbGVUeXBlID8/IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVUeXBlID8/ICcnO1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmZpbGVQYXRoID0gZ2Q/LnMzRmlsZU5hbWUgPz8gKGluc3RhbmNlIGFzIGFueSkuZmlsZVBhdGg7XG4gICAgICAgICAgY29uc3QgdGlkID0gKHRoaXMuc3RlcCBhcyBhbnkpLnRlc3RTdGVwUmVzdWx0SWQ7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuaXNEb3dubG9hZGluZyA9ICEhdGlkICYmIHRoaXMuZG93bmxvYWRpbmdTdGVwSWQgPT09IHRpZDtcbiAgICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuZmlsZU5hbWUgPSAoaW5zdGFuY2UgYXMgYW55KS5maWxlTmFtZTtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5maWxlVHlwZSA9IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVUeXBlO1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmZpbGVQYXRoID0gKGluc3RhbmNlIGFzIGFueSkuZmlsZVBhdGg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFVwZGF0ZSBzZWxmSGVhbEFuYWx5c2lzIHVzaW5nIGhhbmRsZXIgaWYgYXZhaWxhYmxlXG4gICAgICAgIGlmICh0aGlzLmdldFNlbGZIZWFsQW5hbHlzaXNIYW5kbGVyICYmIHRoaXMuc3RlcCkge1xuICAgICAgICAgIGNvbnN0IHNlbGZIZWFsQW5hbHlzaXMgPSB0aGlzLmdldFNlbGZIZWFsQW5hbHlzaXNIYW5kbGVyKHRoaXMuc3RlcCk7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZkhlYWxBbmFseXNpcyA9IHNlbGZIZWFsQW5hbHlzaXM7XG4gICAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLnNlbGZIZWFsQW5hbHlzaXMgPSBzZWxmSGVhbEFuYWx5c2lzO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBFbnN1cmUgZXZlbnQgc3Vic2NyaXB0aW9ucyBhcmUgc3RpbGwgYWN0aXZlIGZvciBzZWxmSGVhbEFjdGlvblxuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuc2VsZkhlYWxBY3Rpb24gJiYgdGhpcy5vblNlbGZIZWFsQWN0aW9uSGFuZGxlcikge1xuICAgICAgICAgIC8vIFRyYWNrIHN1YnNjcmlwdGlvbnMgdG8gYXZvaWQgZHVwbGljYXRlc1xuICAgICAgICAgIGxldCBzdWJzY3JpYmVkRXZlbnRzID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLmdldChpbnN0YW5jZSk7XG4gICAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgICBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuc2V0KGluc3RhbmNlLCBzdWJzY3JpYmVkRXZlbnRzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzLmhhcygnc2VsZkhlYWxBY3Rpb24nKSkge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZkhlYWxBY3Rpb24uc3Vic2NyaWJlKChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMub25TZWxmSGVhbEFjdGlvbkhhbmRsZXI/LihldmVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHN1YnNjcmliZWRFdmVudHMuYWRkKCdzZWxmSGVhbEFjdGlvbicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBVcGRhdGUgaGFuZGxlciByZWZlcmVuY2VzXG4gICAgICAgIGlmICh0aGlzLm9uU2VsZkhlYWxBY3Rpb25IYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vblNlbGZIZWFsQWN0aW9uSGFuZGxlciA9IHRoaXMub25TZWxmSGVhbEFjdGlvbkhhbmRsZXI7XG4gICAgICAgIGlmICh0aGlzLmdldFNlbGZIZWFsTG9hZGluZ1N0YXRlc0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmdldFNlbGZIZWFsTG9hZGluZ1N0YXRlc0hhbmRsZXIgPSB0aGlzLmdldFNlbGZIZWFsTG9hZGluZ1N0YXRlc0hhbmRsZXI7XG4gICAgICAgIC8vIFVwZGF0ZSBrZXkgZm9yIGNoYW5nZSBkZXRlY3Rpb25cbiAgICAgICAgdGhpcy5wcmV2aW91c1N0ZXBLZXkgPSB0aGlzLmdldFN0ZXBLZXkodGhpcy5zdGVwKTtcbiAgICAgICAgLy8gQ29tcG9uZW50IGFscmVhZHkgZXhpc3RzIGFuZCBpcyByZWFkeSwgZW1pdCBpbW1lZGlhdGVseVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLmNvbXBvbmVudFJlYWR5LmVtaXQoKTtcbiAgICAgICAgfSwgMCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBlZmZlY3RpdmVUeXBlID0gdGhpcy5nZXRFZmZlY3RpdmVTdGVwVHlwZSh0aGlzLnN0ZXApIHx8ICh0aGlzLnN0ZXAgYXMgYW55KS50eXBlO1xuICAgIGNvbnN0IGNvbXBvbmVudFR5cGUgPSB0aGlzLmNvbXBvbmVudE1hcC5nZXQoZWZmZWN0aXZlVHlwZSk7XG5cbiAgICBpZiAoY29tcG9uZW50VHlwZSkge1xuICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gdGhpcy5jb250YWluZXIuY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudFR5cGUpO1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBjb21wb25lbnRSZWYuaW5zdGFuY2U7XG5cbiAgICAgIC8vIFN0b3JlIGNvbXBvbmVudCBpbnN0YW5jZSBhbmQgcmVmIGluIFdlYWtNYXAgZm9yIGZ1dHVyZSB1cGRhdGVzXG4gICAgICBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzLnNldCh0aGlzLmNvbnRhaW5lciwgaW5zdGFuY2UpO1xuICAgICAgU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudFJlZnMuc2V0KHRoaXMuY29udGFpbmVyLCBjb21wb25lbnRSZWYpO1xuXG4gICAgICAvLyBTdG9yZSBjb21wb25lbnQgcmVmZXJlbmNlIGZvciBjbGVhbnVwXG4gICAgICAoY29tcG9uZW50UmVmIGFzIGFueSkuX2NvbXBvbmVudFJlZiA9IGNvbXBvbmVudFJlZjtcblxuICAgICAgLy8gU3ByZWFkIGNvbmZpZyBwcm9wZXJ0aWVzIGFzIGluZGl2aWR1YWwgaW5wdXRzIGZvciBjb21wb25lbnRzIHRoYXQgdXNlIGluZGl2aWR1YWwgaW5wdXRzXG4gICAgICAvLyBUaGlzIHN1cHBvcnRzIGJvdGggcGF0dGVybnM6IGNvbXBvbmVudHMgdGhhdCBhY2NlcHQgY29uZmlnIGRpcmVjdGx5IGFuZCB0aG9zZSB0aGF0IHVzZSBpbmRpdmlkdWFsIGlucHV0c1xuICAgICAgT2JqZWN0LmtleXModGhpcy5zdGVwKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIGlmIChrZXkgIT09ICd0eXBlJykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpW2tleV0gPSAodGhpcy5zdGVwIGFzIGFueSlba2V5XTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGxvb3Atc3RlcDogbWFwIGNoaWxkcmVuIHRvIG5lc3RlZFN0ZXBzIGlmIG5lc3RlZFN0ZXBzIGlzIG5vdCBwcmVzZW50XG4gICAgICBpZiAodGhpcy5zdGVwLnR5cGUgPT09ICdsb29wJyAmJiAodGhpcy5zdGVwIGFzIGFueSkuY2hpbGRyZW4gJiYgISh0aGlzLnN0ZXAgYXMgYW55KS5uZXN0ZWRTdGVwcykge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5uZXN0ZWRTdGVwcyA9ICh0aGlzLnN0ZXAgYXMgYW55KS5jaGlsZHJlbjtcbiAgICAgIH1cblxuICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgbG9vcC1zdGVwOiBzZXQgbG9vcFR5cGUgYmFzZWQgb24gYWN0aW9uTmFtZSBvciB0ZXN0U3RlcFR5cGVcbiAgICAgIGlmICh0aGlzLnN0ZXAudHlwZSA9PT0gJ2xvb3AnKSB7XG4gICAgICAgIC8vIFNldCBsb29wVHlwZSBpZiBub3QgYWxyZWFkeSBzZXRcbiAgICAgICAgaWYgKCEoaW5zdGFuY2UgYXMgYW55KS5sb29wVHlwZSkge1xuICAgICAgICAgIGNvbnN0IGFjdGlvbk5hbWUgPSAodGhpcy5zdGVwIGFzIGFueSkuYWN0aW9uTmFtZTtcbiAgICAgICAgICBjb25zdCB0ZXN0U3RlcFR5cGUgPSAodGhpcy5zdGVwIGFzIGFueSkudGVzdFN0ZXBUeXBlO1xuICAgICAgICAgIGlmIChhY3Rpb25OYW1lID09PSAnRk9SX0xPT1AnIHx8IHRlc3RTdGVwVHlwZSA9PT0gJ0ZPUl9MT09QJykge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkubG9vcFR5cGUgPSAnZm9yJztcbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbk5hbWUgPT09ICdXSElMRV9MT09QJyB8fCB0ZXN0U3RlcFR5cGUgPT09ICdXSElMRV9MT09QJykge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkubG9vcFR5cGUgPSAnd2hpbGUnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBFbnN1cmUgdGl0bGUgaXMgc2V0IGZyb20gYWN0aW9uIGlmIHRpdGxlIGlzIG5vdCBwcmVzZW50IG9yIGVtcHR5XG4gICAgICAgIGlmICgoIShpbnN0YW5jZSBhcyBhbnkpLnRpdGxlIHx8ICEoaW5zdGFuY2UgYXMgYW55KS50aXRsZS50cmltKCkpICYmICh0aGlzLnN0ZXAgYXMgYW55KS5hY3Rpb24pIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS50aXRsZSA9ICh0aGlzLnN0ZXAgYXMgYW55KS5hY3Rpb247XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgbG9vcC1zdGVwOiBpbml0aWFsaXplIGl0ZXJhdGlvbnMgaWYgbm90IHByZXNlbnRcbiAgICAgIGlmICh0aGlzLnN0ZXAudHlwZSA9PT0gJ2xvb3AnICYmICEoaW5zdGFuY2UgYXMgYW55KS5pdGVyYXRpb25zKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiIGNoYW5nZXNbJ3NlbGVjdGVkSXRlcmF0aW9uSWQnXSBzdGVwXCIsIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZCwgKGluc3RhbmNlIGFzIGFueSkuaXRlcmF0aW9ucylcbiAgICAgICAgLy8gVXNlIGhhbmRsZXIgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdHJ5IHRvIGluaXRpYWxpemUgZnJvbSBzdGVwLmV4ZWN1dGVkUmVzdWx0LnN0ZXBSZXN1bHRcbiAgICAgICAgaWYgKHRoaXMuZ2V0TG9vcEl0ZXJhdGlvbnNIYW5kbGVyKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuaXRlcmF0aW9ucyA9IHRoaXMuZ2V0TG9vcEl0ZXJhdGlvbnNIYW5kbGVyKHRoaXMuc3RlcCk7XG4gICAgICAgIH0gZWxzZSBpZiAoKHRoaXMuc3RlcCBhcyBhbnkpLmV4ZWN1dGVkUmVzdWx0Py5zdGVwUmVzdWx0ICYmIEFycmF5LmlzQXJyYXkoKHRoaXMuc3RlcCBhcyBhbnkpLmV4ZWN1dGVkUmVzdWx0LnN0ZXBSZXN1bHQpKSB7XG4gICAgICAgICAgLy8gSW5pdGlhbGl6ZSBpdGVyYXRpb25zIGRpcmVjdGx5IGZyb20gc3RlcFJlc3VsdFxuICAgICAgICAgIGNvbnN0IGl0ZXJhdGlvbnM6IGFueVtdID0gW107XG4gICAgICAgICAgKHRoaXMuc3RlcCBhcyBhbnkpLmV4ZWN1dGVkUmVzdWx0LnN0ZXBSZXN1bHQuZm9yRWFjaCgoaXRlcmF0aW9uOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZXJhdGlvbkluZGV4ID0gaXRlcmF0aW9uLmluZGV4ICE9PSB1bmRlZmluZWQgJiYgaXRlcmF0aW9uLmluZGV4ICE9PSBudWxsID8gaXRlcmF0aW9uLmluZGV4IDogaXRlcmF0aW9ucy5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgc3RhdHVzOiAnc3VjY2VzcycgfCAnZmFpbGVkJyB8ICdwZW5kaW5nJyB8ICdydW5uaW5nJyA9ICdwZW5kaW5nJztcbiAgICAgICAgICAgIGlmIChpdGVyYXRpb24uc3RhdHVzKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHN0YXR1c0xvd2VyID0gaXRlcmF0aW9uLnN0YXR1cy50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICBpZiAoc3RhdHVzTG93ZXIgPT09ICdzdWNjZXNzJyB8fCBzdGF0dXNMb3dlciA9PT0gJ3Bhc3NlZCcpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMgPSAnc3VjY2Vzcyc7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzTG93ZXIgPT09ICdmYWlsdXJlJyB8fCBzdGF0dXNMb3dlciA9PT0gJ2ZhaWxlZCcpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMgPSAnZmFpbGVkJztcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0dXNMb3dlciA9PT0gJ3J1bm5pbmcnIHx8IHN0YXR1c0xvd2VyID09PSAnaW5fcHJvZ3Jlc3MnKSB7XG4gICAgICAgICAgICAgICAgc3RhdHVzID0gJ3J1bm5pbmcnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpdGVyYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgICBpZDogYGl0ZXItJHtpdGVyYXRpb25JbmRleH1gLFxuICAgICAgICAgICAgICBsYWJlbDogYGl0ZXIgJHtpdGVyYXRpb25JbmRleH1gLFxuICAgICAgICAgICAgICBzdGF0dXM6IHN0YXR1cyxcbiAgICAgICAgICAgICAgc3ViU3RlcHM6IFtdLFxuICAgICAgICAgICAgICBpbmRleDogaXRlcmF0aW9uSW5kZXhcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLml0ZXJhdGlvbnMgPSBpdGVyYXRpb25zO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGxvb3Atc3RlcDogc2V0IGRlZmF1bHRJdGVyYXRpb24gYW5kIHNlbGVjdGVkSXRlcmF0aW9uSWRcbiAgICAgIGlmICh0aGlzLnN0ZXAudHlwZSA9PT0gJ2xvb3AnKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiIGNoYW5nZXNbJ3NlbGVjdGVkSXRlcmF0aW9uSWQnXSBzdGVwIDJcIiwgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkLCAoaW5zdGFuY2UgYXMgYW55KS5pdGVyYXRpb25zKVxuICAgICAgICAvLyBTZXQgZGVmYXVsdEl0ZXJhdGlvbiB0byAnbGFzdCcgaWYgbm90IGFscmVhZHkgc2V0XG4gICAgICAgIGlmICghKGluc3RhbmNlIGFzIGFueSkuZGVmYXVsdEl0ZXJhdGlvbikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmRlZmF1bHRJdGVyYXRpb24gPSAnbGFzdCc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgc2VsZWN0ZWRJdGVyYXRpb25JZCAtIHByaW9yaXRpemUgaW5wdXQgdmFsdWUsIHRoZW4gc3RlcCB2YWx1ZSwgdGhlbiBsYXN0IGl0ZXJhdGlvblxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkID0gdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkO1xuICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLnN0ZXAgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkID0gKHRoaXMuc3RlcCBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU2V0IHNlbGVjdGVkSXRlcmF0aW9uSWQgdG8gbGFzdCBpdGVyYXRpb24gaWYgbm90IGFscmVhZHkgc2V0XG4gICAgICAgICAgY29uc3QgaXRlcmF0aW9ucyA9IChpbnN0YW5jZSBhcyBhbnkpLml0ZXJhdGlvbnM7XG4gICAgICAgICAgaWYgKGl0ZXJhdGlvbnMgJiYgQXJyYXkuaXNBcnJheShpdGVyYXRpb25zKSAmJiBpdGVyYXRpb25zLmxlbmd0aCA+IDAgJiYgIShpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RJdGVyYXRpb24gPSBpdGVyYXRpb25zW2l0ZXJhdGlvbnMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkID0gbGFzdEl0ZXJhdGlvbi5pZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3Igc3RlcC1ncm91cDogbWFwIGNoaWxkcmVuIHRvIHN0ZXBzIGlmIHN0ZXBzIGlzIG5vdCBwcmVzZW50XG4gICAgICBpZiAodGhpcy5zdGVwLnR5cGUgPT09ICdzdGVwLWdyb3VwJyAmJiAodGhpcy5zdGVwIGFzIGFueSkuY2hpbGRyZW4gJiYgISh0aGlzLnN0ZXAgYXMgYW55KS5zdGVwcykge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zdGVwcyA9ICh0aGlzLnN0ZXAgYXMgYW55KS5jaGlsZHJlbjtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZ3JvdXBOYW1lID0gKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGlvbjtcbiAgICAgIH1cblxuICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgZmlsZS1kb3dubG9hZCAoaW5jbHVkaW5nIGdlbmVyYXRlRG9jdW1lbnQpOiBzZXQgcHJvcHMgZnJvbSBnZW5lcmF0ZURvY3VtZW50UmVzdWx0IGFuZCB3aXJlIGhhbmRsZXJzXG4gICAgICBpZiAoZWZmZWN0aXZlVHlwZSA9PT0gJ2ZpbGUtZG93bmxvYWQnKSB7XG4gICAgICAgIGNvbnN0IGdkID0gKHRoaXMuc3RlcCBhcyBhbnkpLmV4ZWN1dGVkUmVzdWx0Py5nZW5lcmF0ZURvY3VtZW50UmVzdWx0O1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5maWxlTmFtZSA9IGdkPy5maWxlTmFtZSA/PyAoaW5zdGFuY2UgYXMgYW55KS5maWxlTmFtZSA/PyAnJztcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZmlsZVR5cGUgPSBnZD8uZmlsZVR5cGUgPz8gKGluc3RhbmNlIGFzIGFueSkuZmlsZVR5cGUgPz8gJyc7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmZpbGVQYXRoID0gZ2Q/LnMzRmlsZU5hbWUgPz8gKGluc3RhbmNlIGFzIGFueSkuZmlsZVBhdGg7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmRvd25sb2FkZWQgPSAoaW5zdGFuY2UgYXMgYW55KS5kb3dubG9hZGVkID8/IGZhbHNlO1xuICAgICAgICBjb25zdCB0aWQgPSAodGhpcy5zdGVwIGFzIGFueSkudGVzdFN0ZXBSZXN1bHRJZDtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuaXNEb3dubG9hZGluZyA9ICEhdGlkICYmIHRoaXMuZG93bmxvYWRpbmdTdGVwSWQgPT09IHRpZDtcbiAgICAgICAgaWYgKCEoaW5zdGFuY2UgYXMgYW55KS50aXRsZSAmJiAodGhpcy5zdGVwIGFzIGFueSkuYWN0aW9uKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkudGl0bGUgPSAodGhpcy5zdGVwIGFzIGFueSkuYWN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuZmlsZU5hbWUgPSAoaW5zdGFuY2UgYXMgYW55KS5maWxlTmFtZTtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuZmlsZVR5cGUgPSAoaW5zdGFuY2UgYXMgYW55KS5maWxlVHlwZTtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuZmlsZVBhdGggPSAoaW5zdGFuY2UgYXMgYW55KS5maWxlUGF0aDtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuZG93bmxvYWRlZCA9IChpbnN0YW5jZSBhcyBhbnkpLmRvd25sb2FkZWQ7XG4gICAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLnRpdGxlKSAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcudGl0bGUgPSAoaW5zdGFuY2UgYXMgYW55KS50aXRsZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuZG93bmxvYWQgJiYgdGhpcy5vbkRvd25sb2FkSGFuZGxlcikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmRvd25sb2FkLnN1YnNjcmliZSgoZXY6IGFueSkgPT4gdGhpcy5vbkRvd25sb2FkSGFuZGxlciEoZXYpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuZmlsZVBhdGhDb3BpZWQgJiYgdGhpcy5vbkZpbGVQYXRoQ29waWVkSGFuZGxlcikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmZpbGVQYXRoQ29waWVkLnN1YnNjcmliZSgoZXY6IGFueSkgPT4gdGhpcy5vbkZpbGVQYXRoQ29waWVkSGFuZGxlciEoZXYpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkudGV4dENvcGllZCAmJiB0aGlzLm9uVGV4dENvcGllZEhhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS50ZXh0Q29waWVkLnN1YnNjcmliZSgoZXY6IGFueSkgPT4gdGhpcy5vblRleHRDb3BpZWRIYW5kbGVyIShldikpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGNvbmRpdGlvbi1zdGVwOiBzZXQgYnJhbmNoZXMgYW5kIGNvbmRpdGlvblRleHRcbiAgICAgIGlmICh0aGlzLnN0ZXAudHlwZSA9PT0gJ2NvbmRpdGlvbicpIHtcbiAgICAgICAgLy8gU2V0IGJyYW5jaGVzIC0gcHJpb3JpdGl6ZSBzdGVwLmJyYW5jaGVzIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHVzZSBoYW5kbGVyXG4gICAgICAgIGlmICgodGhpcy5zdGVwIGFzIGFueSkuYnJhbmNoZXMgJiYgQXJyYXkuaXNBcnJheSgodGhpcy5zdGVwIGFzIGFueSkuYnJhbmNoZXMpKSB7XG4gICAgICAgICAgLy8gQ3JlYXRlIGRlZXAgY29weSB0byBlbnN1cmUgcHJvcGVyIGNoYW5nZSBkZXRlY3Rpb25cbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5icmFuY2hlcyA9ICh0aGlzLnN0ZXAgYXMgYW55KS5icmFuY2hlcy5tYXAoKGJyYW5jaDogYW55KSA9PiAoe1xuICAgICAgICAgICAgLi4uYnJhbmNoLFxuICAgICAgICAgICAgc3ViU3RlcHM6IGJyYW5jaC5zdWJTdGVwcyA/IFsuLi5icmFuY2guc3ViU3RlcHNdIDogW11cbiAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIShpbnN0YW5jZSBhcyBhbnkpLmJyYW5jaGVzICYmIHRoaXMuZ2V0Q29uZGl0aW9uQnJhbmNoZXNIYW5kbGVyKSB7XG4gICAgICAgICAgY29uc3QgaGFuZGxlckJyYW5jaGVzID0gdGhpcy5nZXRDb25kaXRpb25CcmFuY2hlc0hhbmRsZXIodGhpcy5zdGVwKTtcbiAgICAgICAgICAvLyBDcmVhdGUgZGVlcCBjb3B5IHRvIGVuc3VyZSBwcm9wZXIgY2hhbmdlIGRldGVjdGlvblxuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmJyYW5jaGVzID0gaGFuZGxlckJyYW5jaGVzLm1hcCgoYnJhbmNoOiBhbnkpID0+ICh7XG4gICAgICAgICAgICAuLi5icmFuY2gsXG4gICAgICAgICAgICBzdWJTdGVwczogYnJhbmNoLnN1YlN0ZXBzID8gWy4uLmJyYW5jaC5zdWJTdGVwc10gOiBbXVxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZXQgY29uZGl0aW9uVGV4dCBmcm9tIGFjdGlvbiBpZiBjb25kaXRpb25UZXh0IGlzIG5vdCBwcmVzZW50XG4gICAgICAgIGlmICghKGluc3RhbmNlIGFzIGFueSkuY29uZGl0aW9uVGV4dCAmJiAodGhpcy5zdGVwIGFzIGFueSkuYWN0aW9uKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZGl0aW9uVGV4dCA9ICh0aGlzLnN0ZXAgYXMgYW55KS5hY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2V0IGlzTG9hZGluZyB1c2luZyBoYW5kbGVyIGlmIGF2YWlsYWJsZVxuICAgICAgICBpZiAodGhpcy5pc1N0ZXBMb2FkaW5nSGFuZGxlcikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmlzTG9hZGluZyA9IHRoaXMuaXNTdGVwTG9hZGluZ0hhbmRsZXIodGhpcy5zdGVwKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBQYXNzIGFjdGl2ZUJyYW5jaFN0ZXBJZCBpZiBwcmVzZW50XG4gICAgICAgIGlmICgodGhpcy5zdGVwIGFzIGFueSkuYWN0aXZlQnJhbmNoU3RlcElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5hY3RpdmVCcmFuY2hTdGVwSWQgPSAodGhpcy5zdGVwIGFzIGFueSkuYWN0aXZlQnJhbmNoU3RlcElkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGFpLWFnZW50LXN0ZXA6IGVuc3VyZSB0aXRsZSBhbmQgcHJvbXB0IGFyZSBzZXQgZnJvbSBhY3Rpb25cbiAgICAgIGlmICh0aGlzLnN0ZXAudHlwZSA9PT0gJ2FpLWFnZW50Jykge1xuICAgICAgICAvLyBTZXQgdGl0bGUgZnJvbSBhY3Rpb24gaWYgdGl0bGUgaXMgbm90IHByZXNlbnQgb3IgZW1wdHlcbiAgICAgICAgaWYgKCghKGluc3RhbmNlIGFzIGFueSkudGl0bGUgfHwgIShpbnN0YW5jZSBhcyBhbnkpLnRpdGxlLnRyaW0oKSkgJiYgKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGlvbikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnRpdGxlID0gKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZXQgcHJvbXB0IGZyb20gYWN0aW9uIGlmIHByb21wdCBpcyBub3QgcHJlc2VudCBvciBlbXB0eVxuICAgICAgICBpZiAoKCEoaW5zdGFuY2UgYXMgYW55KS5wcm9tcHQgfHwgIShpbnN0YW5jZSBhcyBhbnkpLnByb21wdC50cmltKCkpICYmICh0aGlzLnN0ZXAgYXMgYW55KS5hY3Rpb24pIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5wcm9tcHQgPSAodGhpcy5zdGVwIGFzIGFueSkuYWN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIC8vIEVuc3VyZSBhY3Rpb25zIGFycmF5IGlzIHNldCBpZiBub3QgcHJlc2VudFxuICAgICAgICBpZiAoIShpbnN0YW5jZSBhcyBhbnkpLmFjdGlvbnMgJiYgdGhpcy5mb3JtYXRBY3Rpb25zSGFuZGxlcikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmFjdGlvbnMgPSB0aGlzLmZvcm1hdEFjdGlvbnNIYW5kbGVyKHRoaXMuc3RlcCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2V0IGFjdGlvbkNvdW50IGlmIG5vdCBwcmVzZW50XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5hY3Rpb25Db3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc3QgYWN0aW9ucyA9IChpbnN0YW5jZSBhcyBhbnkpLmFjdGlvbnMgfHwgW107XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuYWN0aW9uQ291bnQgPSBhY3Rpb25zLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZXQgc2VsZWN0ZWRUYWJJbnB1dCBpZiBub3QgcHJlc2VudFxuICAgICAgICBpZiAoIShpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkVGFiSW5wdXQpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZFRhYklucHV0ID0gJ2FjdGlvbi10cmFjZSc7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gV2lyZSB1cCBjb21tb24gZXZlbnQgZW1pdHRlcnMgZm9yIGFwaSwgYWktYWdlbnQsIGxvb3AsIGNvbmRpdGlvbiwgYW5kIGJhc2ljIHN0ZXBzXG4gICAgICBpZiAodGhpcy5zdGVwLnR5cGUgPT09ICdhcGknIHx8IHRoaXMuc3RlcC50eXBlID09PSAnYWktYWdlbnQnIHx8IHRoaXMuc3RlcC50eXBlID09PSAnbG9vcCcgfHwgdGhpcy5zdGVwLnR5cGUgPT09ICdjb25kaXRpb24nIHx8IHRoaXMuc3RlcC50eXBlID09PSAnYmFzaWMnKSB7XG4gICAgICAgIC8vIFN1YnNjcmliZSB0byBjb21tb24gb3V0cHV0IGV2ZW50cyBhbmQgY2FsbCBoYW5kbGVyc1xuICAgICAgICAvLyBFdmVudEVtaXR0ZXJzIGFyZSBTdWJqZWN0cywgc28gd2UgY2FuIHN1YnNjcmliZSB0byB0aGVtXG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5tYWtlQ3VycmVudEJhc2VsaW5lICYmIHRoaXMub25NYWtlQ3VycmVudEJhc2VsaW5lSGFuZGxlcikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLm1ha2VDdXJyZW50QmFzZWxpbmUuc3Vic2NyaWJlKChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uTWFrZUN1cnJlbnRCYXNlbGluZUhhbmRsZXI/LihldmVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLnVwbG9hZEJhc2VsaW5lICYmIHRoaXMub25VcGxvYWRCYXNlbGluZUhhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS51cGxvYWRCYXNlbGluZS5zdWJzY3JpYmUoKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25VcGxvYWRCYXNlbGluZUhhbmRsZXI/LihldmVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmFuYWx5emUgJiYgdGhpcy5vbkFuYWx5emVIYW5kbGVyKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuYW5hbHl6ZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkFuYWx5emVIYW5kbGVyPy4oKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkudmlld0Z1bGxMb2dzICYmIHRoaXMub25WaWV3RnVsbExvZ3NIYW5kbGVyKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkudmlld0Z1bGxMb2dzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uVmlld0Z1bGxMb2dzSGFuZGxlcj8uKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLnNlbGZIZWFsQWN0aW9uICYmIHRoaXMub25TZWxmSGVhbEFjdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgICAvLyBUcmFjayBzdWJzY3JpcHRpb25zIHRvIGF2b2lkIGR1cGxpY2F0ZXNcbiAgICAgICAgICBsZXQgc3Vic2NyaWJlZEV2ZW50cyA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5nZXQoaW5zdGFuY2UpO1xuICAgICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cykge1xuICAgICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgICAgU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLnNldChpbnN0YW5jZSwgc3Vic2NyaWJlZEV2ZW50cyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cy5oYXMoJ3NlbGZIZWFsQWN0aW9uJykpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnNlbGZIZWFsQWN0aW9uLnN1YnNjcmliZSgoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLm9uU2VsZkhlYWxBY3Rpb25IYW5kbGVyPy4oZXZlbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzLmFkZCgnc2VsZkhlYWxBY3Rpb24nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm90ZTogb25Kc29uUGF0aENvcGllZEhhbmRsZXIgaXMgc2V0IGFzIGlucHV0IHByb3BlcnR5IChsaW5lIDgyNSksIHNvIHdlIGRvbid0IG5lZWQgdG8gc3Vic2NyaWJlIHRvIGpzb25QYXRoQ29waWVkIGV2ZW50XG4gICAgICAgIC8vIFRoZSBBUEkgc3RlcCBjb21wb25lbnQgY2FsbHMgdGhlIGhhbmRsZXIgZGlyZWN0bHksIGF2b2lkaW5nIGR1cGxpY2F0ZSBjYWxsc1xuICAgICAgfVxuXG4gICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBsb29wLXN0ZXA6IHdpcmUgdXAgb25WaWV3QWxsSXRlcmF0aW9ucyBldmVudFxuICAgICAgaWYgKHRoaXMuc3RlcC50eXBlID09PSAnbG9vcCcpIHtcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLm9uVmlld0FsbEl0ZXJhdGlvbnMgJiYgdGhpcy5vblZpZXdBbGxJdGVyYXRpb25zSGFuZGxlcikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLm9uVmlld0FsbEl0ZXJhdGlvbnMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25WaWV3QWxsSXRlcmF0aW9uc0hhbmRsZXI/Lih0aGlzLnN0ZXApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFdpcmUgdXAgZGVidWcgcG9pbnQgdG9nZ2xlIGZvciBhbnkgc3RlcCB0aGF0IHN1cHBvcnRzIGl0ICh3aGVuIGlzRGVidWcgaXMgdHJ1ZSlcbiAgICAgIGlmICh0aGlzLmlzRGVidWcgJiYgKGluc3RhbmNlIGFzIGFueSkuZGVidWdQb2ludENoYW5nZSAmJiB0aGlzLm9uRGVidWdQb2ludENoYW5nZUhhbmRsZXIpIHtcbiAgICAgICAgbGV0IHN1YnNjcmliZWRFdmVudHMgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuZ2V0KGluc3RhbmNlKTtcbiAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzKSB7XG4gICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgIFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5zZXQoaW5zdGFuY2UsIHN1YnNjcmliZWRFdmVudHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cy5oYXMoJ2RlYnVnUG9pbnRDaGFuZ2UnKSkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmRlYnVnUG9pbnRDaGFuZ2Uuc3Vic2NyaWJlKCh2YWx1ZTogYm9vbGVhbikgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkRlYnVnUG9pbnRDaGFuZ2VIYW5kbGVyPy4odGhpcy5zdGVwLCB2YWx1ZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cy5hZGQoJ2RlYnVnUG9pbnRDaGFuZ2UnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBjb25kaXRpb24tc3RlcDogd2lyZSB1cCBvbkV4cGFuZCBldmVudFxuICAgICAgaWYgKHRoaXMuc3RlcC50eXBlID09PSAnY29uZGl0aW9uJykge1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkub25FeHBhbmQgJiYgdGhpcy5vbkV4cGFuZEhhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5vbkV4cGFuZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgLy8gQ2FsbCBvbkV4cGFuZEhhbmRsZXIgd2l0aCB0aGUgc3RlcCBjb25maWdcbiAgICAgICAgICAgIHRoaXMub25FeHBhbmRIYW5kbGVyPy4odGhpcy5zdGVwKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXaXJlIHVwIG9uQnJhbmNoQ2xpY2tFdmVudCBmb3IgbmVzdGVkIGNvbmRpdGlvbiBzdGVwc1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkub25CcmFuY2hDbGlja0V2ZW50ICYmIHRoaXMub25Db25kaXRpb25CcmFuY2hDbGlja0hhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5vbkJyYW5jaENsaWNrRXZlbnQuc3Vic2NyaWJlKChicmFuY2g6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkNvbmRpdGlvbkJyYW5jaENsaWNrSGFuZGxlcj8uKHRoaXMuc3RlcCwgYnJhbmNoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBFbnN1cmUgZXhwYW5kZWQgcHJvcGVydHkgaXMgcGFzc2VkIGNvcnJlY3RseVxuICAgICAgLy8gVXNlIGlzU3RlcEV4cGFuZGVkSGFuZGxlciBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2Ugc3RlcC5leHBhbmRlZCBvciBzdGVwLmNvbmZpZy5leHBhbmRlZFxuICAgICAgaWYgKHRoaXMuaXNTdGVwRXhwYW5kZWRIYW5kbGVyICYmIHRoaXMuc3RlcCkge1xuICAgICAgICBjb25zdCBleHBhbmRlZFN0YXRlID0gdGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXIodGhpcy5zdGVwKTtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZXhwYW5kZWQgPSBleHBhbmRlZFN0YXRlO1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmV4cGFuZGVkID0gZXhwYW5kZWRTdGF0ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICgodGhpcy5zdGVwIGFzIGFueSkuZXhwYW5kZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5leHBhbmRlZCA9ICh0aGlzLnN0ZXAgYXMgYW55KS5leHBhbmRlZDtcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5leHBhbmRlZCA9ICh0aGlzLnN0ZXAgYXMgYW55KS5leHBhbmRlZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBQYXNzIGhhbmRsZXIgZnVuY3Rpb25zIHRvIHRoZSBjb21wb25lbnQgaW5zdGFuY2VcbiAgICAgIGlmICh0aGlzLm9uRXhwYW5kSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25FeHBhbmRIYW5kbGVyID0gdGhpcy5vbkV4cGFuZEhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5nZXRDb25kaXRpb25CcmFuY2hlc0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmdldENvbmRpdGlvbkJyYW5jaGVzSGFuZGxlciA9IHRoaXMuZ2V0Q29uZGl0aW9uQnJhbmNoZXNIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMuaXNTdGVwTG9hZGluZ0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmlzU3RlcExvYWRpbmdIYW5kbGVyID0gdGhpcy5pc1N0ZXBMb2FkaW5nSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLmlzU3RlcEV4cGFuZGVkSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkuaXNTdGVwRXhwYW5kZWRIYW5kbGVyID0gdGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5jb252ZXJ0TXNUb1NlY29uZHNIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5jb252ZXJ0TXNUb1NlY29uZHNIYW5kbGVyID0gdGhpcy5jb252ZXJ0TXNUb1NlY29uZHNIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMuZm9ybWF0RmFpbHVyZURldGFpbHNIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5mb3JtYXRGYWlsdXJlRGV0YWlsc0hhbmRsZXIgPSB0aGlzLmZvcm1hdEZhaWx1cmVEZXRhaWxzSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLmdldFNlbGZIZWFsQW5hbHlzaXNIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5nZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlciA9IHRoaXMuZ2V0U2VsZkhlYWxBbmFseXNpc0hhbmRsZXI7XG4gICAgICBpZiAodGhpcy5nZXRMb29wSXRlcmF0aW9uc0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmdldExvb3BJdGVyYXRpb25zSGFuZGxlciA9IHRoaXMuZ2V0TG9vcEl0ZXJhdGlvbnNIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMuZ2V0QXBpQXNzZXJ0aW9uc0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmdldEFwaUFzc2VydGlvbnNIYW5kbGVyID0gdGhpcy5nZXRBcGlBc3NlcnRpb25zSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLmZvcm1hdEFjdGlvbnNIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5mb3JtYXRBY3Rpb25zSGFuZGxlciA9IHRoaXMuZm9ybWF0QWN0aW9uc0hhbmRsZXI7XG4gICAgICBpZiAodGhpcy5vblZpZXdBbGxJdGVyYXRpb25zSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25WaWV3QWxsSXRlcmF0aW9uc0hhbmRsZXIgPSB0aGlzLm9uVmlld0FsbEl0ZXJhdGlvbnNIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMub25NYWtlQ3VycmVudEJhc2VsaW5lSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25NYWtlQ3VycmVudEJhc2VsaW5lSGFuZGxlciA9IHRoaXMub25NYWtlQ3VycmVudEJhc2VsaW5lSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLm9uVXBsb2FkQmFzZWxpbmVIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vblVwbG9hZEJhc2VsaW5lSGFuZGxlciA9IHRoaXMub25VcGxvYWRCYXNlbGluZUhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5vbkFuYWx5emVIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vbkFuYWx5emVIYW5kbGVyID0gdGhpcy5vbkFuYWx5emVIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMub25WaWV3RnVsbExvZ3NIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vblZpZXdGdWxsTG9nc0hhbmRsZXIgPSB0aGlzLm9uVmlld0Z1bGxMb2dzSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLm9uU2VsZkhlYWxBY3Rpb25IYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vblNlbGZIZWFsQWN0aW9uSGFuZGxlciA9IHRoaXMub25TZWxmSGVhbEFjdGlvbkhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5nZXRTZWxmSGVhbExvYWRpbmdTdGF0ZXNIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5nZXRTZWxmSGVhbExvYWRpbmdTdGF0ZXNIYW5kbGVyID0gdGhpcy5nZXRTZWxmSGVhbExvYWRpbmdTdGF0ZXNIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMub25Db25kaXRpb25CcmFuY2hDbGlja0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLm9uQ29uZGl0aW9uQnJhbmNoQ2xpY2tIYW5kbGVyID0gdGhpcy5vbkNvbmRpdGlvbkJyYW5jaENsaWNrSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLm9uU3RlcENsaWNrSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25TdGVwQ2xpY2tIYW5kbGVyID0gdGhpcy5vblN0ZXBDbGlja0hhbmRsZXI7XG4gICAgICBpZiAodGhpcy5vbkpzb25QYXRoQ29waWVkSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25Kc29uUGF0aENvcGllZEhhbmRsZXIgPSB0aGlzLm9uSnNvblBhdGhDb3BpZWRIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMub25Eb3dubG9hZEhhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLm9uRG93bmxvYWRIYW5kbGVyID0gdGhpcy5vbkRvd25sb2FkSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLm9uRmlsZVBhdGhDb3BpZWRIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vbkZpbGVQYXRoQ29waWVkSGFuZGxlciA9IHRoaXMub25GaWxlUGF0aENvcGllZEhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5vblRleHRDb3BpZWRIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vblRleHRDb3BpZWRIYW5kbGVyID0gdGhpcy5vblRleHRDb3BpZWRIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMuanVtcFRvVGltZXN0YW1wSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkuanVtcFRvVGltZXN0YW1wSGFuZGxlciA9IHRoaXMuanVtcFRvVGltZXN0YW1wSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLmdldERlYnVnUG9pbnRTZXRIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5nZXREZWJ1Z1BvaW50U2V0SGFuZGxlciA9IHRoaXMuZ2V0RGVidWdQb2ludFNldEhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5vbkRlYnVnUG9pbnRDaGFuZ2VIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vbkRlYnVnUG9pbnRDaGFuZ2VIYW5kbGVyID0gdGhpcy5vbkRlYnVnUG9pbnRDaGFuZ2VIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMuaXNVcGxvYWRpbmdCYXNlbGluZSAhPT0gdW5kZWZpbmVkKSAoaW5zdGFuY2UgYXMgYW55KS5pc1VwbG9hZGluZ0Jhc2VsaW5lID0gdGhpcy5pc1VwbG9hZGluZ0Jhc2VsaW5lO1xuICAgICAgaWYgKHRoaXMuaXNNYWtpbmdDdXJyZW50QmFzZWxpbmUgIT09IHVuZGVmaW5lZCkgKGluc3RhbmNlIGFzIGFueSkuaXNNYWtpbmdDdXJyZW50QmFzZWxpbmUgPSB0aGlzLmlzTWFraW5nQ3VycmVudEJhc2VsaW5lO1xuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZCAhPT0gdW5kZWZpbmVkKSAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkID0gdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkO1xuICAgICAgaWYgKHRoaXMuaXNMaXZlICE9PSB1bmRlZmluZWQpIChpbnN0YW5jZSBhcyBhbnkpLmlzTGl2ZSA9IHRoaXMuaXNMaXZlO1xuICAgICAgaWYgKHRoaXMuaXNEZWJ1ZyAhPT0gdW5kZWZpbmVkKSAoaW5zdGFuY2UgYXMgYW55KS5pc0RlYnVnID0gdGhpcy5pc0RlYnVnO1xuICAgICAgaWYgKHRoaXMuZ2V0RGVidWdQb2ludFNldEhhbmRsZXIgJiYgdGhpcy5zdGVwKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmRlYnVnUG9pbnRTZXQgPSB0aGlzLmdldERlYnVnUG9pbnRTZXRIYW5kbGVyKHRoaXMuc3RlcCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5kZWJ1Z1BvaW50U2V0ID0gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBQYXNzIHN0ZXBOdW1iZXIgaW5wdXQgaWYgcHJvdmlkZWQsIG90aGVyd2lzZSB1c2Ugc3RlcCdzIHN0ZXBOdW1iZXJcbiAgICAgIGlmICh0aGlzLnN0ZXBOdW1iZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zdGVwTnVtYmVyID0gdGhpcy5zdGVwTnVtYmVyO1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLnN0ZXBOdW1iZXIgPSB0aGlzLnN0ZXBOdW1iZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFBhc3MgdGhlIHN0ZXAgb2JqZWN0IHNvIHRvZ2dsZUhlYWRlciBjYW4gdXNlIGl0XG4gICAgICBpZiAodGhpcy5zdGVwKSAoaW5zdGFuY2UgYXMgYW55KS5zdGVwID0gdGhpcy5zdGVwO1xuXG4gICAgICAvLyBVcGRhdGUgY29uZGl0aW9uLXN0ZXAgc3BlY2lmaWMgcHJvcGVydGllcyBmb3IgY2hhbmdlIGRldGVjdGlvblxuICAgICAgaWYgKHRoaXMuc3RlcC50eXBlID09PSAnY29uZGl0aW9uJykge1xuICAgICAgICAvLyBVcGRhdGUgYWN0aXZlQnJhbmNoU3RlcElkIGlmIGl0IGNoYW5nZWRcbiAgICAgICAgaWYgKCh0aGlzLnN0ZXAgYXMgYW55KS5hY3RpdmVCcmFuY2hTdGVwSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmFjdGl2ZUJyYW5jaFN0ZXBJZCA9ICh0aGlzLnN0ZXAgYXMgYW55KS5hY3RpdmVCcmFuY2hTdGVwSWQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgYnJhbmNoZXMgaWYgdGhleSBjaGFuZ2VkXG4gICAgICAgIGlmICgodGhpcy5zdGVwIGFzIGFueSkuYnJhbmNoZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmJyYW5jaGVzID0gKHRoaXMuc3RlcCBhcyBhbnkpLmJyYW5jaGVzO1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5icmFuY2hlcyA9ICh0aGlzLnN0ZXAgYXMgYW55KS5icmFuY2hlcztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgbmVzdGVkU3RlcHMgaWYgdGhleSBjaGFuZ2VkXG4gICAgICAgIGlmICgodGhpcy5zdGVwIGFzIGFueSkubmVzdGVkU3RlcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLm5lc3RlZFN0ZXBzID0gKHRoaXMuc3RlcCBhcyBhbnkpLm5lc3RlZFN0ZXBzO1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5uZXN0ZWRTdGVwcyA9ICh0aGlzLnN0ZXAgYXMgYW55KS5uZXN0ZWRTdGVwcztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuXG4gICAgICAvLyBTZXQgc2VsZkhlYWxBbmFseXNpcyB1c2luZyBoYW5kbGVyIGlmIGF2YWlsYWJsZVxuICAgICAgaWYgKHRoaXMuZ2V0U2VsZkhlYWxBbmFseXNpc0hhbmRsZXIgJiYgdGhpcy5zdGVwKSB7XG4gICAgICAgIGNvbnN0IHNlbGZIZWFsQW5hbHlzaXMgPSB0aGlzLmdldFNlbGZIZWFsQW5hbHlzaXNIYW5kbGVyKHRoaXMuc3RlcCk7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnNlbGZIZWFsQW5hbHlzaXMgPSBzZWxmSGVhbEFuYWx5c2lzO1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLnNlbGZIZWFsQW5hbHlzaXMgPSBzZWxmSGVhbEFuYWx5c2lzO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEFsc28gc2V0IGNvbmZpZyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGNvbXBvbmVudHMgdGhhdCBzdGlsbCB1c2UgY29uZmlnIGlucHV0XG4gICAgICBpZiAoJ2NvbmZpZycgaW4gaW5zdGFuY2UpIHtcbiAgICAgICAgaWYgKGVmZmVjdGl2ZVR5cGUgPT09ICdmaWxlLWRvd25sb2FkJykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZyA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMuc3RlcCxcbiAgICAgICAgICAgIHR5cGU6ICdmaWxlLWRvd25sb2FkJyxcbiAgICAgICAgICAgIGZpbGVOYW1lOiAoaW5zdGFuY2UgYXMgYW55KS5maWxlTmFtZSxcbiAgICAgICAgICAgIGZpbGVUeXBlOiAoaW5zdGFuY2UgYXMgYW55KS5maWxlVHlwZSxcbiAgICAgICAgICAgIGZpbGVQYXRoOiAoaW5zdGFuY2UgYXMgYW55KS5maWxlUGF0aCxcbiAgICAgICAgICAgIGRvd25sb2FkZWQ6IChpbnN0YW5jZSBhcyBhbnkpLmRvd25sb2FkZWRcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZyA9IHRoaXMuc3RlcDtcbiAgICAgICAgfVxuICAgICAgICAvLyBFbnN1cmUgc2VsZkhlYWxBbmFseXNpcyBpcyBpbmNsdWRlZCBpbiBjb25maWdcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLnNlbGZIZWFsQW5hbHlzaXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5zZWxmSGVhbEFuYWx5c2lzID0gKGluc3RhbmNlIGFzIGFueSkuc2VsZkhlYWxBbmFseXNpcztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTdG9yZSBrZXkgZm9yIGNoYW5nZSBkZXRlY3Rpb25cbiAgICAgIHRoaXMucHJldmlvdXNTdGVwS2V5ID0gdGhpcy5nZXRTdGVwS2V5KHRoaXMuc3RlcCk7XG5cbiAgICAgIC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiBvbiB0aGUgY29tcG9uZW50IGluc3RhbmNlXG4gICAgICBpZiAoY29tcG9uZW50UmVmLmluamVjdG9yKSB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlQ2RyID0gY29tcG9uZW50UmVmLmluamVjdG9yLmdldChDaGFuZ2VEZXRlY3RvclJlZiwgbnVsbCk7XG4gICAgICAgIGlmIChpbnN0YW5jZUNkcikge1xuICAgICAgICAgIGluc3RhbmNlQ2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEVtaXQgcmVhZHkgZXZlbnQgYWZ0ZXIgY29tcG9uZW50IGlzIGNyZWF0ZWQgYW5kIGluaXRpYWxpemVkXG4gICAgICAvLyBVc2Ugc2V0VGltZW91dCB0byBlbnN1cmUgdGhlIGNvbXBvbmVudCBpcyBmdWxseSByZW5kZXJlZFxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuY29tcG9uZW50UmVhZHkuZW1pdCgpO1xuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgbmdEb0NoZWNrKCk6IHZvaWQge1xuICAgIC8vIFVzZSBuZ0RvQ2hlY2sgdG8gZGV0ZWN0IGNoYW5nZXMgaW4gbmVzdGVkIHByb3BlcnRpZXMgdGhhdCBuZ09uQ2hhbmdlcyBtaWdodCBtaXNzXG4gICAgY29uc3QgaW5zdGFuY2UgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzLmdldCh0aGlzLmNvbnRhaW5lcik7XG4gICAgY29uc3QgY29tcG9uZW50UmVmID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudFJlZnMuZ2V0KHRoaXMuY29udGFpbmVyKTtcblxuICAgIGlmIChpbnN0YW5jZSAmJiBjb21wb25lbnRSZWYgJiYgdGhpcy5zdGVwKSB7XG4gICAgICAvLyBDaGVjayBpZiBleHBhbmRlZCBzdGF0ZSBjaGFuZ2VkICh1c2luZyBoYW5kbGVyIGlmIGF2YWlsYWJsZSwgYXMgaXQgbWF5IGRlcGVuZCBvbiBwYXJlbnQgc3RhdGUpXG4gICAgICAvLyBUaGlzIGlzIGltcG9ydGFudCBmb3IgbmVzdGVkIHN0ZXAtZ3JvdXBzIHdoZXJlIHBhcmVudCBleHBhbnNpb24gYWZmZWN0cyBjaGlsZCBleHBhbnNpb25cbiAgICAgIGxldCBjdXJyZW50RXhwYW5kZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgICBpZiAodGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXIpIHtcbiAgICAgICAgY3VycmVudEV4cGFuZGVkID0gdGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXIodGhpcy5zdGVwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnJlbnRFeHBhbmRlZCA9ICh0aGlzLnN0ZXAgYXMgYW55KS5leHBhbmRlZDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGluc3RhbmNlRXhwYW5kZWQgPSAoaW5zdGFuY2UgYXMgYW55KS5leHBhbmRlZDtcbiAgICAgIFxuICAgICAgaWYgKGN1cnJlbnRFeHBhbmRlZCAhPT0gdW5kZWZpbmVkICYmIGN1cnJlbnRFeHBhbmRlZCAhPT0gaW5zdGFuY2VFeHBhbmRlZCkge1xuICAgICAgICAvLyBFeHBhbmRlZCBzdGF0ZSBjaGFuZ2VkLCB1cGRhdGUgaXQgdXNpbmcgc2V0SW5wdXQgdG8gdHJpZ2dlciBuZ09uQ2hhbmdlc1xuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gaW5zdGFuY2VFeHBhbmRlZDtcbiAgICAgICAgaWYgKGNvbXBvbmVudFJlZiAmJiB0eXBlb2YgKGNvbXBvbmVudFJlZiBhcyBhbnkpLnNldElucHV0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgKGNvbXBvbmVudFJlZiBhcyBhbnkpLnNldElucHV0KCdleHBhbmRlZCcsIGN1cnJlbnRFeHBhbmRlZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRmFsbGJhY2s6IG1hbnVhbGx5IHRyaWdnZXIgbmdPbkNoYW5nZXNcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5leHBhbmRlZCA9IGN1cnJlbnRFeHBhbmRlZDtcbiAgICAgICAgICBpZiAodHlwZW9mIChpbnN0YW5jZSBhcyBhbnkpLm5nT25DaGFuZ2VzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjb25zdCBjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzID0ge1xuICAgICAgICAgICAgICBleHBhbmRlZDogbmV3IFNpbXBsZUNoYW5nZShwcmV2aW91c1ZhbHVlLCBjdXJyZW50RXhwYW5kZWQsIHByZXZpb3VzVmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5uZ09uQ2hhbmdlcyhjaGFuZ2VzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5leHBhbmRlZCA9IGN1cnJlbnRFeHBhbmRlZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBVcGRhdGUgdGhlIHN0ZXAgb2JqZWN0J3MgZXhwYW5kZWQgcHJvcGVydHkgdG8ga2VlcCBpdCBpbiBzeW5jXG4gICAgICAgICh0aGlzLnN0ZXAgYXMgYW55KS5leHBhbmRlZCA9IGN1cnJlbnRFeHBhbmRlZDtcbiAgICAgICAgXG4gICAgICAgIC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvblxuICAgICAgICBpZiAoY29tcG9uZW50UmVmLmluamVjdG9yKSB7XG4gICAgICAgICAgY29uc3QgaW5zdGFuY2VDZHIgPSBjb21wb25lbnRSZWYuaW5qZWN0b3IuZ2V0KENoYW5nZURldGVjdG9yUmVmLCBudWxsKTtcbiAgICAgICAgICBpZiAoaW5zdGFuY2VDZHIpIHtcbiAgICAgICAgICAgIGluc3RhbmNlQ2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgaW5zdGFuY2VDZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDaGVjayBpZiBpdGVyYXRpb25zIGFyZSBub3cgYXZhaWxhYmxlIGFuZCB3ZSBuZWVkIHRvIHVwZGF0ZSBzZWxlY3RlZEl0ZXJhdGlvblxuICAgICAgaWYgKHRoaXMuc3RlcC50eXBlID09PSAnbG9vcCcgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkKSB7XG4gICAgICAgIGNvbnN0IGl0ZXJhdGlvbnMgPSAoaW5zdGFuY2UgYXMgYW55KS5pdGVyYXRpb25zIHx8IChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZz8uaXRlcmF0aW9ucyB8fCBbXTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVyYXRpb25JZCA9IChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uSWQgfHwgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkO1xuICAgICAgICBjb25zdCBjdXJyZW50U2VsZWN0ZWRJdGVyYXRpb24gPSAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbjtcblxuICAgICAgICAvLyBJZiBpdGVyYXRpb25zIGFyZSBhdmFpbGFibGUsIHNlbGVjdGVkSXRlcmF0aW9uSWQgaXMgc2V0LCBidXQgc2VsZWN0ZWRJdGVyYXRpb24gaXMgbm90IHNldCBvciBkb2Vzbid0IG1hdGNoXG4gICAgICAgIGlmIChpdGVyYXRpb25zLmxlbmd0aCA+IDAgJiYgc2VsZWN0ZWRJdGVyYXRpb25JZCkge1xuICAgICAgICAgIGNvbnN0IHNob3VsZEJlU2VsZWN0ZWQgPSBpdGVyYXRpb25zLmZpbmQoKGl0ZXI6IGFueSkgPT4gaXRlci5pZCA9PT0gc2VsZWN0ZWRJdGVyYXRpb25JZCk7XG4gICAgICAgICAgaWYgKHNob3VsZEJlU2VsZWN0ZWQgJiYgY3VycmVudFNlbGVjdGVkSXRlcmF0aW9uPy5pZCAhPT0gc2VsZWN0ZWRJdGVyYXRpb25JZCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVMb29wU3RlcFNlbGVjdGVkSXRlcmF0aW9uKGluc3RhbmNlLCBzZWxlY3RlZEl0ZXJhdGlvbklkKTtcbiAgICAgICAgICAgIGlmIChjb21wb25lbnRSZWYuaW5qZWN0b3IpIHtcbiAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VDZHIgPSBjb21wb25lbnRSZWYuaW5qZWN0b3IuZ2V0KENoYW5nZURldGVjdG9yUmVmLCBudWxsKTtcbiAgICAgICAgICAgICAgaWYgKGluc3RhbmNlQ2RyKSB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VDZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VDZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGN1cnJlbnRLZXkgPSB0aGlzLmdldFN0ZXBLZXkodGhpcy5zdGVwKTtcblxuICAgICAgLy8gSWYgc3RlcCBwcm9wZXJ0aWVzIGNoYW5nZWQgKGV2ZW4gaWYgcmVmZXJlbmNlIGRpZG4ndCksIHVwZGF0ZSB0aGUgaW5zdGFuY2VcbiAgICAgIGlmIChjdXJyZW50S2V5ICE9PSB0aGlzLnByZXZpb3VzU3RlcEtleSkge1xuICAgICAgICAvLyBXZSBuZWVkIHRoZSBwcmV2aW91cyBzdGVwIHRvIGNvbXBhcmUsIHNvIHdlJ2xsIHVwZGF0ZSBiYXNlZCBvbiBjdXJyZW50IHN0YXRlXG4gICAgICAgIC8vIENyZWF0ZSBhIG1pbmltYWwgcHJldmlvdXMgc3RlcCBmcm9tIHRoZSBpbnN0YW5jZSdzIGN1cnJlbnQgc3RhdGVcbiAgICAgICAgY29uc3QgcHJldmlvdXNTdGVwOiBhbnkgPSB7XG4gICAgICAgICAgaWQ6IChpbnN0YW5jZSBhcyBhbnkpLmlkLFxuICAgICAgICAgIHR5cGU6IChpbnN0YW5jZSBhcyBhbnkpLnR5cGUsXG4gICAgICAgICAgc3RhdHVzOiAoaW5zdGFuY2UgYXMgYW55KS5zdGF0dXMsXG4gICAgICAgICAgZHVyYXRpb246IChpbnN0YW5jZSBhcyBhbnkpLmR1cmF0aW9uLFxuICAgICAgICAgIGV4cGFuZGVkOiAoaW5zdGFuY2UgYXMgYW55KS5leHBhbmRlZCxcbiAgICAgICAgICBjaGlsZHJlbjogKGluc3RhbmNlIGFzIGFueSkuY2hpbGRyZW4sXG4gICAgICAgICAgbmVzdGVkU3RlcHM6IChpbnN0YW5jZSBhcyBhbnkpLm5lc3RlZFN0ZXBzLFxuICAgICAgICAgIHN0ZXBzOiAoaW5zdGFuY2UgYXMgYW55KS5zdGVwcyxcbiAgICAgICAgICBleGVjdXRpb25EYXRhOiAoaW5zdGFuY2UgYXMgYW55KS5leGVjdXRpb25EYXRhLFxuICAgICAgICAgIGFjdGlvbjogKGluc3RhbmNlIGFzIGFueSkuYWN0aW9uLFxuICAgICAgICAgIHRpdGxlOiAoaW5zdGFuY2UgYXMgYW55KS50aXRsZSxcbiAgICAgICAgICByZXN1bHQ6IChpbnN0YW5jZSBhcyBhbnkpLnJlc3VsdCxcbiAgICAgICAgICBtZXRob2Q6IChpbnN0YW5jZSBhcyBhbnkpLm1ldGhvZCxcbiAgICAgICAgICBlbmRwb2ludDogKGluc3RhbmNlIGFzIGFueSkuZW5kcG9pbnQsXG4gICAgICAgICAgc3RhdHVzQ29kZTogKGluc3RhbmNlIGFzIGFueSkuc3RhdHVzQ29kZSxcbiAgICAgICAgICByZXNwb25zZVRpbWU6IChpbnN0YW5jZSBhcyBhbnkpLnJlc3BvbnNlVGltZSxcbiAgICAgICAgICBhY3Rpb25zOiAoaW5zdGFuY2UgYXMgYW55KS5hY3Rpb25zLFxuICAgICAgICAgIHByb21wdDogKGluc3RhbmNlIGFzIGFueSkucHJvbXB0LFxuICAgICAgICAgIG9wdGltaXplZFJ1bjogKGluc3RhbmNlIGFzIGFueSkub3B0aW1pemVkUnVuLFxuICAgICAgICAgIGFjdGlvbkNvdW50OiAoaW5zdGFuY2UgYXMgYW55KS5hY3Rpb25Db3VudCxcbiAgICAgICAgICBpdGVyYXRpb25zOiAoaW5zdGFuY2UgYXMgYW55KS5pdGVyYXRpb25zLFxuICAgICAgICAgIHNlbGVjdGVkSXRlcmF0aW9uSWQ6IChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uSWQsXG4gICAgICAgICAgYnJhbmNoZXM6IChpbnN0YW5jZSBhcyBhbnkpLmJyYW5jaGVzLFxuICAgICAgICAgIHN0ZXBOdW1iZXI6IChpbnN0YW5jZSBhcyBhbnkpLnN0ZXBOdW1iZXIsXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy51cGRhdGVDb21wb25lbnRJbnN0YW5jZSh0aGlzLnN0ZXAsIHByZXZpb3VzU3RlcCk7XG4gICAgICAgIHRoaXMucHJldmlvdXNTdGVwS2V5ID0gY3VycmVudEtleTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0iXX0=
|