mmhglobal-dynamicform 2.5.0 → 2.5.2
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/README.md +7 -0
- package/esm2020/lib/services/main.service.mjs +6 -6
- package/esm2020/lib/zgrid/zgrid.binding.directive.mjs +39 -32
- package/esm2020/lib/zgrid/zgrid.component.mjs +6 -1
- package/esm2020/lib/zudf/zudf.component.mjs +10 -4
- package/fesm2015/mmhglobal-dynamicform.mjs +57 -39
- package/fesm2015/mmhglobal-dynamicform.mjs.map +1 -1
- package/fesm2020/mmhglobal-dynamicform.mjs +57 -39
- package/fesm2020/mmhglobal-dynamicform.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -3,6 +3,13 @@
|
|
|
3
3
|
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 11.2.13.
|
|
4
4
|
|
|
5
5
|
## Changelog
|
|
6
|
+
`2.5.2`<br/>
|
|
7
|
+
[mainservice] - rephrased no changes made message to base on zmodel default message.<br/>
|
|
8
|
+
[zgrid] - log console if generatecolumn is undefined.
|
|
9
|
+
|
|
10
|
+
`2.5.1`<br/>
|
|
11
|
+
[zudf] - added check for formcontrol when looping for cascading.
|
|
12
|
+
|
|
6
13
|
`2.5.0`<br/>
|
|
7
14
|
[zgrid] - Handle GridCellReplaceValue.
|
|
8
15
|
[zudf] - change fieldsequence index to 1.1 instead of 1_1.
|
|
@@ -5,7 +5,7 @@ import { NavigationStart, NavigationEnd, NavigationError } from '@angular/router
|
|
|
5
5
|
import { BehaviorSubject, of, forkJoin } from 'rxjs';
|
|
6
6
|
import { tap, switchMap, map } from 'rxjs/operators';
|
|
7
7
|
/********** Component & Service **********/
|
|
8
|
-
import { MESSAGETYPE, ZComponentHelper, ZGroup } from 'mmhglobal-zcore';
|
|
8
|
+
import { MESSAGETYPE, ZComponentHelper, ZGroup, DefaultMessage, DefaultDialogTitle } from 'mmhglobal-zcore';
|
|
9
9
|
import { ZmodalComponent } from '../zmodal/zmodal.component';
|
|
10
10
|
import { ZmodalMobileComponent } from '../zmodal/zmodal-mobile.component';
|
|
11
11
|
import * as i0 from "@angular/core";
|
|
@@ -849,8 +849,8 @@ export class MainService {
|
|
|
849
849
|
isFormDirtyAndValid(fg, group, isSkipDirty = false, event) {
|
|
850
850
|
if (!isSkipDirty && !fg.dirty) {
|
|
851
851
|
console.warn("Form is not dirty hence record is not save.");
|
|
852
|
-
const message = event && event.data && event.data[`FormNotDirtyMessage`] ? event.data[`FormNotDirtyMessage`] :
|
|
853
|
-
this.alertService.showOkay(
|
|
852
|
+
const message = event && event.data && event.data[`FormNotDirtyMessage`] ? event.data[`FormNotDirtyMessage`] : DefaultMessage.notDirtyMessage;
|
|
853
|
+
this.alertService.showOkay(DefaultDialogTitle.nothingToUpdate, message, ["col-5"]);
|
|
854
854
|
return false;
|
|
855
855
|
}
|
|
856
856
|
if (!fg.valid) {
|
|
@@ -870,7 +870,7 @@ export class MainService {
|
|
|
870
870
|
}
|
|
871
871
|
beforeDeleteModel(group) {
|
|
872
872
|
if (!group.beforeDeleteModel) {
|
|
873
|
-
console.warn("group.
|
|
873
|
+
console.warn("group.beforeDeleteModel is undefined");
|
|
874
874
|
return of({});
|
|
875
875
|
}
|
|
876
876
|
return group.beforeDeleteModel(group);
|
|
@@ -884,7 +884,7 @@ export class MainService {
|
|
|
884
884
|
}
|
|
885
885
|
beforeCreateModel(group) {
|
|
886
886
|
if (!group.beforeCreateModel) {
|
|
887
|
-
console.warn("group.
|
|
887
|
+
console.warn("group.beforeCreateModel is undefined");
|
|
888
888
|
return of({});
|
|
889
889
|
}
|
|
890
890
|
return group.beforeCreateModel(group);
|
|
@@ -1101,4 +1101,4 @@ export function refreshGrid(group) {
|
|
|
1101
1101
|
}
|
|
1102
1102
|
group.isTriggered = false;
|
|
1103
1103
|
}
|
|
1104
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvc2VydmljZXMvbWFpbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtCQUErQjtBQUMvQixPQUFPLEVBQWdCLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQW1ELE1BQU0saUJBQWlCLENBQUM7QUFLbkksOEJBQThCO0FBQzlCLE9BQU8sRUFBYyxlQUFlLEVBQWdCLEVBQUUsRUFBUSxRQUFRLEVBQWlCLE1BQU0sTUFBTSxDQUFDO0FBQ3BHLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFRLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNELDJDQUEyQztBQUMzQyxPQUFPLEVBQ1EsV0FBVyxFQUFpQyxnQkFBZ0IsRUFFWixNQUFNLEVBQ3BFLE1BQU0saUJBQWlCLENBQUM7QUFJekIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzdELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDOzs7Ozs7OztBQUcxRSxzREFBc0Q7QUFFdEQscUhBQXFIO0FBQ3JILDBEQUEwRDtBQU0xRCxNQUFNLE9BQU8sV0FBVztJQWdCdEIsWUFDVSxNQUFjLEVBQ2QsY0FBOEIsRUFDOUIsU0FBMEIsRUFDMUIsYUFBNEIsRUFDNUIsWUFBMEIsRUFDMUIsWUFBMEIsRUFDMUIsWUFBMEIsRUFDMUIsa0JBQXNDLEVBQ3RDLHFCQUFtRCxFQUNuRCxhQUE0QixFQUM1QixZQUEwQixFQUMxQixZQUEwQixFQUMxQixjQUFxQyxFQUNyQyxZQUFvQyxFQUNwQyxrQkFBc0M7UUFkdEMsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLG1CQUFjLEdBQWQsY0FBYyxDQUFn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VSxXQUFXLENBQUMsS0FBYTtJQUN2QyxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFVLENBQUM7SUFDbkQsSUFBSSxZQUFZLEVBQUU7UUFDaEIsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO0tBQ3hCO0lBQ0QsS0FBSyxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7QUFDNUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqIEFuZ3VsYXIgKioqKioqKioqKi9cclxuaW1wb3J0IHsgQ29tcG9uZW50UmVmLCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTmF2aWdhdGlvblN0YXJ0LCBOYXZpZ2F0aW9uRW5kLCBOYXZpZ2F0aW9uRXJyb3IsIFJvdXRlciwgRXZlbnQsIEFjdGl2YXRlZFJvdXRlLCBOYXZpZ2F0aW9uRXh0cmFzIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuXHJcbi8qKioqKioqKioqIElvbmljICoqKioqKioqKiovXHJcbmltcG9ydCB7IE1vZGFsQ29udHJvbGxlciwgTmF2Q29udHJvbGxlciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcclxuXHJcbi8qKioqKioqKioqIFBsdWdpbiAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBCZWhhdmlvclN1YmplY3QsIFN1YnNjcmlwdGlvbiwgb2YsIGZyb20sIGZvcmtKb2luLCBSZXBsYXlTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHRhcCwgc3dpdGNoTWFwLCB0YWtlLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG4vKioqKioqKioqKiBDb21wb25lbnQgJiBTZXJ2aWNlICoqKioqKioqKiovXHJcbmltcG9ydCB7XHJcbiAgQWxlcnRCdXR0b24sIE1FU1NBR0VUWVBFLCBNb2RhbFBhZ2VQYXJhbXMsIEFsZXJ0U2VydmljZSwgWkNvbXBvbmVudEhlbHBlcixcclxuICBDYWNoZVNlcnZpY2UsIEZpZWxkU2VydmljZSwgUmVzb3VyY2VBcGlTZXJ2aWNlLCBUcmFuc2xhdGlvblNlcnZpY2UsIFdlYkFwaVNlcnZpY2UsIFN0b3JhZ2VTZXNzaW9uU2VydmljZSxcclxuICBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIFpDb21wb25lbnRTaXplLCBaQ29yZVNlcnZpY2UsIFpGaWVsZCwgWkdyb3VwXHJcbn0gZnJvbSAnbW1oZ2xvYmFsLXpjb3JlJztcclxuaW1wb3J0IHsgTW9kYWxTZXJ2aWNlLCBNb2RhbFJlc3BvbnNlIH0gZnJvbSAnbW1oZ2xvYmFsLXptb2RhbCc7XHJcbi8vIGltcG9ydCB7IE1vZGFsU2VydmljZSB9IGZyb20gJy4uL3ptb2RhbC9tb2RhbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgWkNvbXBvbmVudERlYnVnU2VydmljZSB9IGZyb20gJy4vemNvbXBvbmVudC5kZWJ1Zy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgWm1vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi4vem1vZGFsL3ptb2RhbC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBabW9kYWxNb2JpbGVDb21wb25lbnQgfSBmcm9tICcuLi96bW9kYWwvem1vZGFsLW1vYmlsZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBaR3JpZCB9IGZyb20gJy4uL3pncmlkL3pncmlkLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENvbXBvbmVudEVycm9ySGFuZGxlclNlcnZpY2UgfSBmcm9tICcuL2NvbXBvbmVudC1lcnJvci1oYW5kbGVyLnNlcnZpY2UnO1xyXG4vLyBpbXBvcnQgeyBabW9kYWxQYWdlIH0gZnJvbSAnLi4vem1vZGFsL3ptb2RhbC5wYWdlJztcclxuXHJcbi8vIGltcG9ydCB7IFpDb21wb25lbnRIZWxwZXIsIFpDb21wb25lbnRPdXRwdXRFdmVudCwgTW9kYWxQYWdlUGFyYW1zLCBaR3JpZCB9IGZyb20gJy4uL2R5bmFtaWNmb3JtL3pjb21wb25lbnQubW9kZWwnO1xyXG4vLyBpbXBvcnQgeyBaR3JvdXAsIFpGaWVsZCB9IGZyb20gJy4uL21vZGVsL3pncm91cC5tb2RlbCc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIE1haW5TZXJ2aWNlIHtcclxuICBwcml2YXRlIGdyb3VwOiBaR3JvdXA7XHJcbiAgcHJpdmF0ZSBvYXV0aEVudmlyb25tZW50VXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBlbnZpcm9ubWVudDtcclxuICBwcml2YXRlIGJhY2tOYXZpZ2F0aW9uUGF0aDogc3RyaW5nW10gPSBbXTtcclxuICBwcml2YXRlIHJvdXRlUGFyYW06IHN0cmluZ1tdID0gW107XHJcbiAgcHJpdmF0ZSBwcmV2aW91c1JvdXRlUGFyYW06IHN0cmluZztcclxuXHJcbiAgcHJpdmF0ZSBOQVZJR0FUSU9OX1BBUkFNU19TVE9SQUdFX0tFWSA9ICdyb3V0ZVBhcmFtJztcclxuICBwcml2YXRlIFBSRVZJT1VTX1BBR0VfUk9VVEVfUEFSQU1fU1RPUkFHRV9LRVkgPSAncHJldmlvdXNQYWdlUm91dGVQYXJhbSc7XHJcbiAgcHJpdmF0ZSBCQUNLX05BVklHQVRJT05fUEFUSF9TVE9SQUdFX0tFWSA9ICdiYWNrTmF2aWdhdGlvblBhdGgnO1xyXG4gIHByaXZhdGUgTkFWSUdBVEVEX1JFTE9BRF9HUklEX1NUT1JBR0VfS0VZID0gJ25hdmlnYXRlZFJlbG9hZEdyaWQnO1xyXG4gIHByaXZhdGUgQ0xPTkVfTkVXX01PREVMX0NBQ0hFX0tFWSA9ICdjbG9uZU5ld01vZGVsJztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBzZWNyZXRLZXkgPSAnbXktc2VjcmV0LWtleSc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgcHJpdmF0ZSBtb2RhbEN0cmw6IE1vZGFsQ29udHJvbGxlcixcclxuICAgIHByaXZhdGUgbmF2Q29udHJvbGxlcjogTmF2Q29udHJvbGxlcixcclxuICAgIHByaXZhdGUgYWxlcnRTZXJ2aWNlOiBBbGVydFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNhY2hlU2VydmljZTogQ2FjaGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBmaWVsZFNlcnZpY2U6IEZpZWxkU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVzb3VyY2VBcGlTZXJ2aWNlOiBSZXNvdXJjZUFwaVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNvbXBvbmVudEVycm9ySGFuZGxlcjogQ29tcG9uZW50RXJyb3JIYW5kbGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgd2ViQXBpU2VydmljZTogV2ViQXBpU2VydmljZSxcclxuICAgIHByaXZhdGUgemNvcmVTZXJ2aWNlOiBaQ29yZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG1vZGFsU2VydmljZTogTW9kYWxTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzdG9yYWdlU2VydmljZTogU3RvcmFnZVNlc3Npb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBkZWJ1Z1NlcnZpY2U6IFpDb21wb25lbnREZWJ1Z1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRyYW5zbGF0aW9uU2VydmljZTogVHJhbnNsYXRpb25TZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICBjb25zb2xlLmxvZygnTWFpblNlcnZpY2UgY29uc3RydWN0b3InKTtcclxuICAgIHRoaXMuZW52aXJvbm1lbnQgPSB0aGlzLnpjb3JlU2VydmljZS5nZXRFbnZpcm9ubWVudCgpO1xyXG4gICAgdGhpcy5vYXV0aEVudmlyb25tZW50VXJsID0gdGhpcy5lbnZpcm9ubWVudC5lMU9hdXRoVXJsICsgJy8nO1xyXG4gICAgdGhpcy5yb3V0ZXIuZXZlbnRzLnN1YnNjcmliZSgoZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25TdGFydCkge1xyXG4gICAgICAgIC8vIFNob3cgcHJvZ3Jlc3Mgc3Bpbm5lciBvciBwcm9ncmVzcyBiYXJcclxuICAgICAgICBjb25zb2xlLmxvZyhldmVudCk7XHJcbiAgICAgICAgLy8gUmVzZXQgdGhlIHJvdXRlUGFyYW0sYmFja05hdmlnYXRpb25QYXRoIGFuZCByZWxhdGVkIHNlc3Npb25TdG9yYWdlIGN1cnJlbnQgcGFnZSBpcyBzdGFydHVwIHBhZ2VcclxuICAgICAgICBpZiAodGhpcy5nZXRTdGFydHVwUGFnZSgpID09PSBldmVudC51cmwpIHtcclxuICAgICAgICAgIHRoaXMucm91dGVQYXJhbSA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5iYWNrTmF2aWdhdGlvblBhdGggPSBbXTtcclxuICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0KHRoaXMuTkFWSUdBVElPTl9QQVJBTVNfU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KHRoaXMucm91dGVQYXJhbSkpO1xyXG4gICAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQodGhpcy5CQUNLX05BVklHQVRJT05fUEFUSF9TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkodGhpcy5iYWNrTmF2aWdhdGlvblBhdGgpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpIHtcclxuICAgICAgICAvLyBIaWRlIHByb2dyZXNzIHNwaW5uZXIgb3IgcHJvZ3Jlc3MgYmFyXHJcbiAgICAgICAgY29uc29sZS5sb2coZXZlbnQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRXJyb3IpIHtcclxuICAgICAgICAvLyBIaWRlIHByb2dyZXNzIHNwaW5uZXIgb3IgcHJvZ3Jlc3MgYmFyXHJcbiAgICAgICAgLy8gUHJlc2VudCBlcnJvciB0byB1c2VyXHJcbiAgICAgICAgY29uc29sZS5sb2coZXZlbnQuZXJyb3IpO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlTGFzdE5hdmlnYXRlUmVjb3JkKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc3RhcnRVcCgpIHtcclxuICAgIGNvbnNvbGUubG9nKCdBdCBtYWluLnNlcnZpY2UgKFN0YXJ0VXApIC4uLicpO1xyXG4gIH1cclxuXHJcbiAgc2V0R3JvdXAoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgdGhpcy5ncm91cCA9IGdyb3VwO1xyXG4gICAgdGhpcy5maWVsZFNlcnZpY2Uuc2V0R3JvdXAoZ3JvdXApO1xyXG4gICAgdGhpcy5yZXNvdXJjZUFwaVNlcnZpY2Uuc2V0R3JvdXAoZ3JvdXApO1xyXG4gICAgdGhpcy53ZWJBcGlTZXJ2aWNlLnNldEdyb3VwKGdyb3VwKTtcclxuICAgIHRoaXMuc2V0R3JvdXBGb3JEZWJ1Z2dlcihncm91cCk7XHJcbiAgfVxyXG5cclxuICBnZXRSZXNvdXJjZVNlcnZlckRhdGEoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZUFwaVNlcnZpY2UubG9hZERhdGEoKTtcclxuICB9XHJcblxyXG4gIGdldEdyb3VwRmllbGRzKFxyXG4gICAgY3RybE5hbWU6IHN0cmluZyxcclxuICAgIGZvcm1UeXBlOiBcIkxpc3RGaWVsZFwiIHwgXCJGb3JtRmllbGRcIixcclxuICAgIGdyb3VwOiBaR3JvdXAsXHJcbiAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZ1xyXG4gICkge1xyXG4gICAgcmV0dXJuIHRoaXMuZmllbGRTZXJ2aWNlLmdldEZvcm1GaWVsZENvZGUoXHJcbiAgICAgIGN0cmxOYW1lLFxyXG4gICAgICBmb3JtVHlwZSxcclxuICAgICAgZ3JvdXAsXHJcbiAgICAgIHByb3BlcnR5TmFtZVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGluaXRpYWxpemVHcm91cChcclxuICAgIGdyb3VwOiBaR3JvdXAsXHJcbiAgICBjdHJsTmFtZTogc3RyaW5nLFxyXG4gICAgcGFnZU5hbWU6IHN0cmluZyxcclxuICAgIG1lOiBhbnlcclxuICApOiBTdWJzY3JpcHRpb24ge1xyXG4gICAgaWYgKG1lLnN1YnNjcmlwdGlvbikge1xyXG4gICAgICBtZS5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHJlc291cmNlTmFtZSA9IGdyb3VwLnJlc291cmNlVVJMTmFtZSB8fCBjdHJsTmFtZTtcclxuICAgIGdyb3VwLnJlc291cmNlVVJMTmFtZSA9IHJlc291cmNlTmFtZTtcclxuXHJcbiAgICBPYmplY3QuYXNzaWduKGdyb3VwLCB7XHJcbiAgICAgIHJlc291cmNlVVJMOiB0aGlzLnJlc291cmNlQXBpU2VydmljZS5nZXRVUkwocmVzb3VyY2VOYW1lKSxcclxuICAgICAgZ3JpZENvbHVtbkZpZWxkczogdGhpcy5maWVsZFNlcnZpY2UuZ2V0Rm9ybUZpZWxkQ29kZShcclxuICAgICAgICBjdHJsTmFtZSxcclxuICAgICAgICBcIkZvcm1GaWVsZFwiLFxyXG4gICAgICAgIG51bGwsXHJcbiAgICAgICAgbnVsbFxyXG4gICAgICApLFxyXG4gICAgICBjdHJsU2NvcGU6IG1lLFxyXG4gICAgICBwYWdlTmFtZSxcclxuICAgICAgY3RybE5hbWUsXHJcbiAgICAgIC8vIGNyZWF0ZU1vZGVsVVJMOiBcIi9jcmVhdGVcIiArIGN0cmxOYW1lLnRvTG93ZXJDYXNlKCksXHJcbiAgICAgIGVkaXRNb2RlbFVSTDogY3RybE5hbWUudG9Mb3dlckNhc2UoKSxcclxuICAgICAgLy8gbGlzdE1vZGVsVVJMOiBcIi9saXN0XCIgKyBjdHJsTmFtZS50b0xvd2VyQ2FzZSgpLFxyXG4gICAgICAvLyBmb3JtSGVhZGVyOiBcIi4uLlwiLFxyXG4gICAgICBpc0xvYWRpbmc6IHRydWUsXHJcbiAgICAgIGZpZWxkczogW10sXHJcbiAgICAgIHpNb2RlbDoge30sXHJcbiAgICAgIHpDb21wb25lbnRzOiB7fSxcclxuICAgICAgekRhdGE6IHt9LFxyXG4gICAgICBzdWJqZWN0OiBuZXcgQmVoYXZpb3JTdWJqZWN0PFpDb21wb25lbnRPdXRwdXRFdmVudD4obnVsbCksXHJcbiAgICAgIC8vIGZvcm06IG51bGwgYXMgRm9ybUdyb3VwLCAvLyByZW1vdmVkIGZvciBidWcgZml4LlxyXG4gICAgICBjYW5jZWxCdXR0b25OYW1lOiBcIkNsb3NlXCIsXHJcbiAgICAgIHpCdXR0b25zQ291bnQ6IDAsXHJcbiAgICAgIC8vIHRvcFJpZ2h0QWN0aW9uQnV0dG9uOiBbXSxcclxuICAgICAgLy8gb25BY3Rpb246IHRoaXMub25BY3Rpb24uYmluZCh0aGlzKSxcclxuICAgICAgYmFja05hdmlnYXRpb246IHRoaXMuYmFja05hdmlnYXRpb24uYmluZCh0aGlzKSxcclxuICAgICAgaGlzdG9yeUJhY2s6IHRoaXMuaGlzdG9yeUJhY2suYmluZCh0aGlzKSxcclxuICAgICAgcmVmcmVzaFBhZ2U6IHRoaXMucmVmcmVzaFBhZ2UuYmluZCh0aGlzKSxcclxuICAgICAgcmVmcmVzaEdyaWQ6IHRoaXMucmVmcmVzaEdyaWQuYmluZCh0aGlzKSxcclxuICAgICAgdXBkYXRlTW9kZWw6IHRoaXMudXBkYXRlTW9kZWwuYmluZCh0aGlzKSxcclxuICAgICAgY3JlYXRlTW9kZWw6IHRoaXMuY3JlYXRlTW9kZWwuYmluZCh0aGlzKSxcclxuICAgICAgY2xvbmVOZXdNb2RlbDogdGhpcy5jbG9uZU5ld01vZGVsLmJpbmQodGhpcyksXHJcbiAgICAgIGRlbGV0ZU1vZGVsOiB0aGlzLmRlbGV0ZU1vZGVsLmJpbmQodGhpcyksXHJcbiAgICAgIG5ld01vZGVsOiB0aGlzLm5ld01vZGVsLmJpbmQodGhpcyksXHJcbiAgICAgIC8vIHVwZGF0ZUVkaXRNb2RlOiB0aGlzLnVwZGF0ZUVkaXRNb2RlLmJpbmQodGhpcyksXHJcbiAgICAgIC8vIF9pc0RlYnVnZ2luZzogZW52aXJvbm1lbnQuZGVidWdTZXNzaW9uIHx8IGZhbHNlLFxyXG4gICAgICAvLyBfZGVidWc6IHtcclxuICAgICAgLy8gICB6RGF0YTogIHsgY29sbGVjdGVkQWN0aXZpdGllczogW10sIGFjdGl2aXR5Q291bnQ6IDAgfVxyXG4gICAgICAvLyB9XHJcbiAgICAgIC8vIGFmdGVyR2V0TW9kZWxTdWNjZXNzOiBudWxsLFxyXG4gICAgICAvLyBiZWZvcmVVcGRhdGVNb2RlbDogbnVsbCxcclxuICAgICAgLy8gaXNFZGl0OiBmYWxzZVxyXG4gICAgfSk7XHJcblxyXG4gICAgbWUuc3Vic2NyaXB0aW9uID0gZ3JvdXAuc3ViamVjdC5zdWJzY3JpYmUoKGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQpID0+XHJcbiAgICAgIHRoaXMuc3ViamVjdEV2ZW50KGV2ZW50LCBncm91cCwgbWUpXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiBtZS5zdWJzY3JpcHRpb247XHJcbiAgfVxyXG5cclxuICBnZXRNb2RlbCQoZ3JvdXA6IFpHcm91cCwgaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBjb25zdCByZWNJZCA9IGlkIHx8IGdyb3VwLnJlZmVyZW5jZUlkO1xyXG4gICAgcmV0dXJuIHRoaXMud2ViQXBpU2VydmljZVxyXG4gICAgICAuaHR0cEdldCQoZ3JvdXAucmVzb3VyY2VVUkwgKyBcIi9cIiArIHJlY0lkLCBudWxsKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YXAoKHptb2RlbCkgPT4ge1xyXG4gICAgICAgICAgZ3JvdXAuek1vZGVsID0gem1vZGVsO1xyXG4gICAgICAgICAgLy9pZiAoXHJcbiAgICAgICAgICAvLyAgZ3JvdXAucGFyZW50UmVmZXJlbmNlRmllbGQgJiZcclxuICAgICAgICAgIC8vICBPYmplY3Qua2V5cyh6bW9kZWwpLmluZGV4T2YoZ3JvdXAucGFyZW50UmVmZXJlbmNlRmllbGQpICE9PSAtMSAmJlxyXG4gICAgICAgICAgLy8gICFncm91cC5iYWNrTmF2aWdhdGlvblBhZ2UuZW5kc1dpdGgoXCIuZWRpdFwiKVxyXG4gICAgICAgICAgLy8pIHtcclxuICAgICAgICAgIC8vICBncm91cC5iYWNrTmF2aWdhdGlvblBhZ2UgPVxyXG4gICAgICAgICAgLy8gICAgZ3JvdXAuYmFja05hdmlnYXRpb25QYWdlICtcclxuICAgICAgICAgIC8vICAgIFwiL1wiICtcclxuICAgICAgICAgIC8vICAgIHptb2RlbFtncm91cC5wYXJlbnRSZWZlcmVuY2VGaWVsZF0udG9TdHJpbmcoKSArXHJcbiAgICAgICAgICAvLyAgICBcIi9lZGl0XCI7XHJcbiAgICAgICAgICAvL31cclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKGdyb3VwLmFmdGVyR2V0TW9kZWxTdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFmdGVyR2V0TW9kZWxTdWNjZXNzKGdyb3VwKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBvZihbXSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIGNhbkV4aXQoZm9ybTogRm9ybUdyb3VwKTogYm9vbGVhbiB8IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKCFmb3JtIHx8ICFmb3JtLmRpcnR5KSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChmb3JtWydza2lwRGlydHlDaGVjayddKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmFsZXJ0U2VydmljZVxyXG4gICAgICAuc2hvdyhcIkRhdGEgbm90IHNhdmUgeWV0XCIsIFwiQXJlIHlvdSBzdXJlIHdhbnQgdG8gZGlzY2FyZCB0aGUgY2hhbmdlcz9cIiwgW1xyXG4gICAgICAgIFwiQ2FuY2VsXCIsXHJcbiAgICAgICAgXCJEaXNjYXJkIENoYW5nZXNcIixcclxuICAgICAgXSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKChyZXBseSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcGx5ID09PSBcIkRpc2NhcmQgQ2hhbmdlc1wiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvZih0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBvZihmYWxzZSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIC8vIGNvbnN0IHJlcGx5U3ViID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuICAgIC8vIHRoaXMuYWxlcnRDdHJsXHJcbiAgICAvLyAgIC5jcmVhdGUoe1xyXG4gICAgLy8gICAgIGhlYWRlcjogXCJEYXRhIG5vdCBzYXZlIHlldFwiLFxyXG4gICAgLy8gICAgIC8vIHN1YkhlYWRlcjogJ1N1YkhlYWRlciBzdGF0ZW1lbnQgaGVyZScsXHJcbiAgICAvLyAgICAgbWVzc2FnZTogXCJBcmUgeW91IHN1cmUgd2FudCB0byBkaXNjYXJkIHRoZSBjaGFuZ2VzP1wiLFxyXG4gICAgLy8gICAgIGJ1dHRvbnM6IFtcclxuICAgIC8vICAgICAgIHtcclxuICAgIC8vICAgICAgICAgdGV4dDogXCJDYW5jZWxcIixcclxuICAgIC8vICAgICAgICAgcm9sZTogXCJjYW5jZWxcIixcclxuICAgIC8vICAgICAgICAgY3NzQ2xhc3M6IFwic2Vjb25kYXJ5XCIsXHJcbiAgICAvLyAgICAgICAgIGhhbmRsZXI6ICgpID0+IHtcclxuICAgIC8vICAgICAgICAgICByZXBseVN1Yi5uZXh0KGZhbHNlKTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgfSxcclxuICAgIC8vICAgICAgIHtcclxuICAgIC8vICAgICAgICAgdGV4dDogXCJEaXNjYXJkIENoYW5nZXNcIixcclxuICAgIC8vICAgICAgICAgY3NzQ2xhc3M6IFwid2FybmluZ1wiLFxyXG4gICAgLy8gICAgICAgICBoYW5kbGVyOiAoKSA9PiB7XHJcbiAgICAvLyAgICAgICAgICAgcmVwbHlTdWIubmV4dCh0cnVlKTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgfVxyXG4gICAgLy8gICAgIF1cclxuICAgIC8vICAgfSlcclxuICAgIC8vICAgLnRoZW4oYWxlcnRFbGVtZW50ID0+IHtcclxuICAgIC8vICAgICBhbGVydEVsZW1lbnQucHJlc2VudCgpO1xyXG4gICAgLy8gICB9KTtcclxuICAgIC8vIHJldHVybiByZXBseVN1Yi5hc09ic2VydmFibGUoKS5waXBlKHRha2UoMSkpO1xyXG4gIH1cclxuXHJcbiAgLy8gYXN5bmMgb3Blbk1vZGFsRm9ybShtb2RhbFBhcmFtczogTW9kYWxQYWdlUGFyYW1zKSB7XHJcbiAgLy8gICAvLyBjb25zb2xlLmxvZyhcIm9wZW5Nb2RhbEZvcm1cIik7XHJcbiAgLy8gICBjb25zb2xlLmVycm9yKFxyXG4gIC8vICAgICBcIlBsZWFzZSB1c2UgTW9kYWxTZXJ2aWNlLnNob3cgaW5zdGVhZCBvZiBNYWluU2VydmljZS5vcGVuTW9kYWxGb3JtIVwiXHJcbiAgLy8gICApO1xyXG4gIC8vICAgLy8gY29uc3QgbW9kYWwgPSB0aGlzLm1vZGFsU2VydmljZS5zaG93KG1vZGFsUGFyYW1zLmNvbEZpZWxkcyQgfHwgbW9kYWxQYXJhbXMuY29udHJvbGxlck5hbWUsIG1vZGFsUGFyYW1zLnBhcmVudEdyb3VwLFxyXG4gIC8vICAgLy8gICBtb2RhbFBhcmFtcy5mb3JtSGVhZGVyLCBtb2RhbFBhcmFtcy56TW9kZWwsIG1vZGFsUGFyYW1zLnJlZmVySWQpO1xyXG4gIC8vICAgY29uc3QgbW9kYWwgPSBhd2FpdCB0aGlzLm1vZGFsQ3RybC5jcmVhdGUoe1xyXG4gIC8vICAgICBjb21wb25lbnQ6IFptb2RhbFBhZ2UsXHJcbiAgLy8gICAgIGJhY2tkcm9wRGlzbWlzczogdHJ1ZSxcclxuICAvLyAgICAgY29tcG9uZW50UHJvcHM6IHtcclxuICAvLyAgICAgICBtb2RhbFBhcmFtcyxcclxuICAvLyAgICAgfSxcclxuICAvLyAgIH0pO1xyXG4gIC8vICAgbW9kYWwucHJlc2VudCgpO1xyXG4gIC8vICAgcmV0dXJuIG1vZGFsO1xyXG4gIC8vICAgLy8gLm9uV2lsbERpc21pc3MoKHptb2RlbDogYW55KSA9PiB7XHJcbiAgLy8gICAvLyAgIHRoaXMuXHJcbiAgLy8gICAvLyB9KTtcclxuICAvLyB9XHJcblxyXG4gIGNsb3NlTW9kYWxGb3JtKGdyb3VwPzogWkdyb3VwKSB7XHJcbiAgICBpZiAoZ3JvdXAgJiYgZ3JvdXAuc3ViamVjdCkge1xyXG4gICAgICBncm91cC5zdWJqZWN0Lm5leHQoe1xyXG4gICAgICAgIHR5cGU6IFwiTW9kYWxTZXJ2aWNlLmNsb3NlXCIsXHJcbiAgICAgICAgdGFyZ2V0OiBcIm1vZGFsR3JvdXAubW9kYWxDYW5jZWwoKVwiXHJcbiAgICAgIH0gYXMgWkNvbXBvbmVudE91dHB1dEV2ZW50KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLm1vZGFsQ3RybC5kaXNtaXNzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdWJqZWN0RXZlbnQoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCwgbWU6IGFueSkge1xyXG4gICAgaWYgKCFldmVudCB8fCAhZXZlbnQudGFyZ2V0IHx8IGV2ZW50LnRhcmdldC5zdGFydHNXaXRoKFwibW9kYWxHcm91cC5cIikpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc29sZS5sb2coXCI+PiBTdWJqZWN0RXZlbnRcIiwgZXZlbnQpO1xyXG4gICAgbGV0IGNhbGxGdW5jO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGNhbGxGdW5jID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cEV2YWxWYWx1ZS5jYWxsKFxyXG4gICAgICAgIGdyb3VwLmN0cmxTY29wZSxcclxuICAgICAgICBldmVudC50YXJnZXQsXHJcbiAgICAgICAgZ3JvdXBcclxuICAgICAgKTtcclxuICAgICAgLy8gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKGV2ZW50LlRhcmdldCwgZ3JvdXApO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgIFwiRXJyb3Igd2hlbiBnZXRHcm91cFZhbHVlOiBcIixcclxuICAgICAgICBldmVudC50YXJnZXQsXHJcbiAgICAgICAgXCIgPiBFcnJvcjogXCIsXHJcbiAgICAgICAgZXJyb3JcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjYWxsRnVuYyhldmVudCk7XHJcbiAgICBpZiAodHlwZW9mIGNhbGxGdW5jID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgY29uc3QgbmV3RnVuYyA9IGNhbGxGdW5jLmJpbmQobWUpO1xyXG4gICAgICBuZXdGdW5jKGV2ZW50LCBncm91cCwgbWUpO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgY2FsbEZ1bmMgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgaWYgKGV2ZW50LnR5cGUuZW5kc1dpdGgoXCJvbk5hdmlnYXRlVG9cIikpIHtcclxuICAgICAgICBjb25zdCBuVXJsID0gZXZlbnQudGFyZ2V0LnJlcGxhY2UoXCIvOmlkXCIsIFwiL1wiICsgZXZlbnQuZGF0YSk7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW25VcmxdKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChldmVudC50eXBlID09PSBcInpncmlkLWNlbGxDbGlja1wiKSB7XHJcbiAgICAgICAgLy8gKGNhbGxGdW5jLnN0YXJ0c1dpdGgoJ2VkaXQnKSkgeyAgemdyaWQtY2VsbENsaWNrXHJcbiAgICAgICAgY29uc3QgY05hbWUgPSBjYWxsRnVuYy5zbGljZSg0KTtcclxuICAgICAgICAvLyAvLyBkZWJ1Z2dlcjtcclxuICAgICAgICAvLyBjb25zdCBtb2RhbEdyb3VwUGFyYW06IE1vZGFsUGFnZVBhcmFtcyA9IHt9O1xyXG4gICAgICAgIC8vIG1vZGFsR3JvdXBQYXJhbS5jb250cm9sbGVyTmFtZSA9IGNOYW1lO1xyXG4gICAgICAgIC8vIG1vZGFsR3JvdXBQYXJhbS5yZWZlcklkID0gZXZlbnQuZGF0YS5JZDtcclxuICAgICAgICAvLyBtb2RhbEdyb3VwUGFyYW0uY29sRmllbGRzJCA9IGV2ZW50LmNvbHVtbkZpZWxkcyQ7XHJcbiAgICAgICAgLy8gbW9kYWxHcm91cFBhcmFtLnBhcmVudEdyb3VwID0gbWUuZ3JvdXA7XHJcblxyXG4gICAgICAgIC8vIHRoaXMub3Blbk1vZGFsRm9ybShtb2RhbEdyb3VwUGFyYW0pO1xyXG4gICAgICAgIHRoaXMubW9kYWxTZXJ2aWNlLnNob3coXHJcbiAgICAgICAgICBldmVudC5jb2x1bW5GaWVsZHMkIHx8IGNOYW1lLFxyXG4gICAgICAgICAgZ3JvdXAsXHJcbiAgICAgICAgICBcIlwiLFxyXG4gICAgICAgICAge30sXHJcbiAgICAgICAgICBldmVudC5kYXRhLklkXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgY2FsbEZ1bmMgPT09IFwib2JqZWN0XCIpIHtcclxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IFwiemdyaWQtY2VsbENsaWNrXCIpIHtcclxuICAgICAgICBpZiAoY2FsbEZ1bmMubmF2aWdhdGVVcmwpIHtcclxuICAgICAgICAgIGNvbnN0IHVybCA9IGNhbGxGdW5jLm5hdmlnYXRlVXJsLnJlcGxhY2UoXCI6aWRcIiwgZXZlbnQuZGF0YS5JZCk7XHJcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdXJsXSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBtb2RhbEdyb3VwUGFyYW06IE1vZGFsUGFnZVBhcmFtcyA9IHt9O1xyXG4gICAgICAgIG1vZGFsR3JvdXBQYXJhbS5jb250cm9sbGVyTmFtZSA9IGNhbGxGdW5jLmN0cmxOYW1lO1xyXG4gICAgICAgIG1vZGFsR3JvdXBQYXJhbS5yZWZlcklkID0gZXZlbnQuZGF0YS5JZDtcclxuICAgICAgICBtb2RhbEdyb3VwUGFyYW0uY29sRmllbGRzJCA9IGV2ZW50LmNvbHVtbkZpZWxkcyQ7XHJcbiAgICAgICAgbW9kYWxHcm91cFBhcmFtLnBhcmVudEdyb3VwID0gbWUuZ3JvdXA7XHJcbiAgICAgICAgbW9kYWxHcm91cFBhcmFtLmZvcm1IZWFkZXIgPSBjYWxsRnVuYy5mb3JtSGVhZGVyO1xyXG5cclxuICAgICAgICBpZiAoY2FsbEZ1bmMuZm9ybUhlYWRlcikge1xyXG4gICAgICAgICAgLy8gdGhpcy5vcGVuTW9kYWxGb3JtKG1vZGFsR3JvdXBQYXJhbSk7XHJcbiAgICAgICAgICB0aGlzLm1vZGFsU2VydmljZS5zaG93KFxyXG4gICAgICAgICAgICBldmVudC5jb2x1bW5GaWVsZHMkIHx8IGNhbGxGdW5jLmN0cmxOYW1lLFxyXG4gICAgICAgICAgICBncm91cCxcclxuICAgICAgICAgICAgY2FsbEZ1bmMuZm9ybUhlYWRlcixcclxuICAgICAgICAgICAge30sXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEuSWRcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICAgIFwiSW52YWxpZCBjYWxsRnVuYyB0eXBlOiBcIixcclxuICAgICAgICAgIGNhbGxGdW5jLFxyXG4gICAgICAgICAgXCIgZXZlbnQuVGFyZ2V0OiBcIixcclxuICAgICAgICAgIGV2ZW50LnRhcmdldFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gdGhpcy5vcGVuTW9kYWxGb3JtQnlDb21wb25lbnQoY2FsbEZ1bmMudHlwZSwgZXZlbnQuRGF0YS5JZCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgXCJGdW5jdGlvbiBub3QgZGVmaW5lZCBpbiBncm91cCBmb3I6IFwiLFxyXG4gICAgICAgIGV2ZW50LnRhcmdldCxcclxuICAgICAgICBcIiwgRXZlbnQ6IFwiLFxyXG4gICAgICAgIGV2ZW50XHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVTdWNjZXNzKHJlczogUmVzcG9uc2UgfCBhbnksIHN1Y2Nlc3NNc2c6IHN0cmluZyk6IFJlc3BvbnNlIHtcclxuICAgIGlmICh0aGlzLmdyb3VwKSB7XHJcbiAgICAgIHRoaXMudHJ5VXBkYXRlR3JvdXBUcmlnZ2VyKGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVzICYmIHJlcy5Qcm9jZXNzaW5nU3RhdHVzKSB7XHJcbiAgICAgIGlmICh0aGlzLmdyb3VwPy5kaXNhYmxlU3VjY2Vzc0NyZWF0ZU1zZyB8fCB0aGlzLmdyb3VwPy5kaXNhYmxlU3VjY2Vzc1VwZGF0ZU1zZyB8fCB0aGlzLmdyb3VwPy5kaXNhYmxlU3VjY2Vzc0RlbGV0ZU1zZykge1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHNldCBzZXNzaW9uc3RvcmFnZSB0byB0cmlnZ2VyIHVwZGF0ZSB1cG9uIGNyZWF0ZWRcclxuXHJcbiAgICAgIC8vIEFsZXJ0IHVzZXIgdXBkYXRlL3NhdmUgc3VjY2Vzc1xyXG4gICAgICB0aGlzLndlYkFwaVNlcnZpY2Uuc2hvd0h0dHBSZXNwb25zZU1lc3NhZ2UoTUVTU0FHRVRZUEUuU3VjY2Vzcywgc3VjY2Vzc01zZywgbnVsbCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0cnlVcGRhdGVHcm91cFRyaWdnZXIodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIGlmICh0aGlzLmdyb3VwKSB7XHJcbiAgICAgIHRoaXMuZ3JvdXAuaXNUcmlnZ2VyZWQgPSB2YWx1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZUVycm9yKHJlczogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHRoaXMudHJ5VXBkYXRlR3JvdXBUcmlnZ2VyKGZhbHNlKTtcclxuICAgIHJldHVybiB0aGlzLndlYkFwaVNlcnZpY2UuaGFuZGxlRXJyb3IocmVzKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByb3V0ZU5hdmlnYXRlKHBhZ2VOYW1lOiBzdHJpbmcsIHBhZ2VQYXJhbXM6IHN0cmluZ1tdLCByb3V0ZVJlbGF0aXZlOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgdGhpcy5zZXROYXZpZ2F0aW9uUGFyYW1zKHBhZ2VQYXJhbXMpO1xyXG4gICAgY29uc3Qgc25hcHNob3RVcmwgPSB0aGlzLmFjdGl2YXRlZFJvdXRlWydfcm91dGVyU3RhdGUnXS5zbmFwc2hvdC51cmwuc3BsaXQoJz8nKVswXTtcclxuICAgIGNvbnN0IHBhZ2VVcmwgPSByb3V0ZVJlbGF0aXZlID8gc25hcHNob3RVcmwgKyAnLycgKyBwYWdlTmFtZSA6IHBhZ2VOYW1lO1xyXG5cclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtwYWdlVXJsXSwgeyByZXBsYWNlVXJsOiB0cnVlIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldE5hdmlnYXRpb25QYXJhbXModXJsUGFyYW1zOiBzdHJpbmdbXSkge1xyXG4gICAgLy8gSWYgaXQgaXMgbnVsbCBvciB1bmRlZmluZWRcclxuICAgIGlmICghdGhpcy5iYWNrTmF2aWdhdGlvblBhdGgpIHtcclxuICAgICAgdGhpcy5iYWNrTmF2aWdhdGlvblBhdGggPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuaXNWYWx1ZUluTGFzdEVsZW1lbnQodGhpcy5iYWNrTmF2aWdhdGlvblBhdGgsIHRoaXMucm91dGVyLnVybCkpIHtcclxuICAgICAgdGhpcy5iYWNrTmF2aWdhdGlvblBhdGgucHVzaCh0aGlzLnJvdXRlci51cmwpO1xyXG4gICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldCh0aGlzLkJBQ0tfTkFWSUdBVElPTl9QQVRIX1NUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeSh0aGlzLmJhY2tOYXZpZ2F0aW9uUGF0aCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2V0Um91dGVQYXJhbSh1cmxQYXJhbXMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFJvdXRlUGFyYW0ocm91dGVQYXJhbXM6IHN0cmluZ1tdKSB7XHJcbiAgICAvLyBJZiBpdCBpcyBudWxsIG9yIHVuZGVmaW5lZFxyXG4gICAgaWYgKCF0aGlzLnJvdXRlUGFyYW0pIHtcclxuICAgICAgdGhpcy5yb3V0ZVBhcmFtID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRmlsdGVyIG91dCBhbnkgZW1wdHkgc3RyaW5nIHJvdXRlIHBhcmFtcyBhbmQgam9pbiB0aGVtIGludG8gYSBzaW5nbGUgc3RyaW5nXHJcbiAgICBjb25zdCBuZXdSb3V0ZVBhcmFtID0gJy8nICsgT2JqZWN0LnZhbHVlcyhyb3V0ZVBhcmFtcykuZmlsdGVyKGVsID0+IGVsICE9PSAnJykuam9pbignLycpO1xyXG5cclxuICAgIGlmICghdGhpcy5pc1ZhbHVlSW5MYXN0RWxlbWVudCh0aGlzLnJvdXRlUGFyYW0sIG5ld1JvdXRlUGFyYW0pKSB7XHJcbiAgICAgIGlmIChyb3V0ZVBhcmFtcykge1xyXG4gICAgICAgIC8vIENhcHR1cmUgdGhlIHByZXZpb3VzIHBhZ2UncyByb3V0ZSBwYXJhbSB0byBiZSB1c2VkIGZvciBiYWNrbmF2aWdhdGlvbiBjaGVja2luZ1xyXG4gICAgICAgIHRoaXMucHJldmlvdXNSb3V0ZVBhcmFtID0gdGhpcy5yb3V0ZVBhcmFtW3RoaXMucm91dGVQYXJhbS5sZW5ndGggLSAxXTtcclxuXHJcbiAgICAgICAgLy8gSWYgdGhlIHByZXZpb3VzIHJvdXRlIHBhcmFtIGV4aXN0cywgY2hlY2sgaWYgdGhlIGxhc3Qgc2VnbWVudCBpcyAnbmV3JyBvciAndXBkYXRlJ1xyXG4gICAgICAgIGlmICh0aGlzLnByZXZpb3VzUm91dGVQYXJhbSkge1xyXG4gICAgICAgICAgY29uc3QgcGFyYW1TZWdtZW50ID0gdGhpcy5wcmV2aW91c1JvdXRlUGFyYW0uc3BsaXQoXCIvXCIpO1xyXG4gICAgICAgICAgY29uc3QgYWN0aW9uU2VnbWVudCA9IHBhcmFtU2VnbWVudFtwYXJhbVNlZ21lbnQubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAvLyBJZiB0aGUgbGFzdCBzZWdtZW50IGlzICduZXcnIG9yICd1cGRhdGUnLCBzdG9yZSB0aGUgcHJldmlvdXMgcm91dGUgcGFyYW0gaW4gc2Vzc2lvbiBzdG9yYWdlXHJcbiAgICAgICAgICBpZiAoYWN0aW9uU2VnbWVudCA9PT0gJ25ldycgfHwgYWN0aW9uU2VnbWVudCA9PT0gJ2VkaXQnIHx8IGFjdGlvblNlZ21lbnQgPT09ICd1cGRhdGUnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0KHRoaXMuUFJFVklPVVNfUEFHRV9ST1VURV9QQVJBTV9TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkodGhpcy5wcmV2aW91c1JvdXRlUGFyYW0pKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEFkZCB0aGUgbmV3IHJvdXRlIHBhcmFtIHRvIHRoZSByb3V0ZVBhcmFtIGFycmF5IGFuZCBzdG9yZSBpdCBpbiBzZXNzaW9uIHN0b3JhZ2VcclxuICAgICAgICB0aGlzLnJvdXRlUGFyYW0ucHVzaChuZXdSb3V0ZVBhcmFtKTtcclxuICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldCh0aGlzLk5BVklHQVRJT05fUEFSQU1TX1NUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeSh0aGlzLnJvdXRlUGFyYW0pKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc1ZhbHVlSW5MYXN0RWxlbWVudChhcnJheTogYW55W10sIHRhcmdldFZhbHVlOiBhbnkpIHtcclxuICAgIGlmIChhcnJheVthcnJheS5sZW5ndGggLSAxXSA9PT0gdGFyZ2V0VmFsdWUpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldE5hdmlnYXRpb25QYXJhbXMoKTogYW55W10ge1xyXG4gICAgdGhpcy5yb3V0ZVBhcmFtID0gdGhpcy5yb3V0ZVBhcmFtIHx8IFtdO1xyXG5cclxuICAgIGlmICh0aGlzLnJvdXRlUGFyYW0ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIGNvbnN0IHN0b3JlZFBhcmFtcyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5OQVZJR0FUSU9OX1BBUkFNU19TVE9SQUdFX0tFWSk7XHJcbiAgICAgIGlmIChzdG9yZWRQYXJhbXMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgdGhpcy5yb3V0ZVBhcmFtID0gSlNPTi5wYXJzZShzdG9yZWRQYXJhbXMpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIHN0b3JlZCByb3V0ZVBhcmFtOicsIGVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBjb25zb2xlLmxvZygnTm8gc3RvcmVkIG5hdmlnYXRpb24gcGFyYW1zIGZvdW5kLicpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLnJvdXRlUGFyYW07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0TmF2aWdhdGlvblBhcmVudFBhcmFtKCk6IGFueSB7XHJcbiAgICBjb25zdCBuYXZpZ2F0aW9uUGFyZW50UGFyYW1zID0gdGhpcy5nZXROYXZpZ2F0aW9uUGFyYW1zKCk7XHJcblxyXG4gICAgaWYgKG5hdmlnYXRpb25QYXJlbnRQYXJhbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICByZXR1cm4gbmF2aWdhdGlvblBhcmVudFBhcmFtc1tuYXZpZ2F0aW9uUGFyZW50UGFyYW1zLmxlbmd0aCAtIDJdO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnNvbGUud2FybignTmF2aWdhdGlvbiBwYXJlbnQgcGFyYW1zIG5vdCBmb3VuZC4nKTtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldE5hdmlnYXRpb25DdXJyZW50UGFyYW0oKTogYW55IHtcclxuICAgIGNvbnN0IG5hdmlnYXRpb25DdXJyZW50UGFyYW1zID0gdGhpcy5nZXROYXZpZ2F0aW9uUGFyYW1zKCk7XHJcblxyXG4gICAgaWYgKG5hdmlnYXRpb25DdXJyZW50UGFyYW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgcmV0dXJuIG5hdmlnYXRpb25DdXJyZW50UGFyYW1zW25hdmlnYXRpb25DdXJyZW50UGFyYW1zLmxlbmd0aCAtIDFdO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnNvbGUud2FybignTmF2aWdhdGlvbiBjdXJyZW50IHBhcmFtcyBub3QgZm91bmQuJyk7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0UHJldmlvdXNQYWdlUm91dGVQYXJhbSgpOiBhbnkge1xyXG4gICAgaWYgKHRoaXMucHJldmlvdXNSb3V0ZVBhcmFtICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgLy8gUmV0dXJuIHRoZSBjYWNoZWQgdmFsdWUgaWYgaXQgZXhpc3RzXHJcbiAgICAgIHJldHVybiB0aGlzLnByZXZpb3VzUm91dGVQYXJhbTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBwcmV2aW91c1JvdXRlUGFyYW1TdHIgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuUFJFVklPVVNfUEFHRV9ST1VURV9QQVJBTV9TVE9SQUdFX0tFWSk7XHJcbiAgICBpZiAocHJldmlvdXNSb3V0ZVBhcmFtU3RyKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXNSb3V0ZVBhcmFtID0gSlNPTi5wYXJzZShwcmV2aW91c1JvdXRlUGFyYW1TdHIpO1xyXG4gICAgICAgIHRoaXMucHJldmlvdXNSb3V0ZVBhcmFtID0gcHJldmlvdXNSb3V0ZVBhcmFtO1xyXG4gICAgICAgIHJldHVybiBwcmV2aW91c1JvdXRlUGFyYW07XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKGBVbmFibGUgdG8gcGFyc2UgcHJldmlvdXMgcm91dGUgcGFyYW0gZnJvbSBzZXNzaW9uIHN0b3JhZ2U6ICR7ZXJyb3J9YCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignTm8gcHJldmlvdXMgcGFnZSByb3V0ZSBwYXJhbSBmb3VuZCBpbiBzZXNzaW9uIHN0b3JhZ2UuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVtb3ZlUHJldmlvdXNQYWdlUm91dGVQYXJhbSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2UucmVtb3ZlKHRoaXMuUFJFVklPVVNfUEFHRV9ST1VURV9QQVJBTV9TVE9SQUdFX0tFWSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVtb3ZlTGFzdE5hdmlnYXRlUmVjb3JkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5yZW1vdmVMYXN0TmF2aWdhdGlvblBhdGgoKTtcclxuICAgIHRoaXMucmVtb3ZlTGFzdFJvdXRlUGFyYW0oKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW1vdmVMYXN0TmF2aWdhdGlvblBhdGgoKTogdm9pZCB7XHJcbiAgICB0aGlzLmJhY2tOYXZpZ2F0aW9uUGF0aCA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkJBQ0tfTkFWSUdBVElPTl9QQVRIX1NUT1JBR0VfS0VZKSB8fCBcIm51bGxcIik7XHJcbiAgICBpZiAodGhpcy5iYWNrTmF2aWdhdGlvblBhdGgpIHtcclxuICAgICAgdGhpcy5iYWNrTmF2aWdhdGlvblBhdGgucG9wKCk7XHJcbiAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0KHRoaXMuQkFDS19OQVZJR0FUSU9OX1BBVEhfU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KHRoaXMuYmFja05hdmlnYXRpb25QYXRoKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJObyBiYWNrIG5hdmlnYXRpb24gcGF0aCBmb3VuZCBpbiBzZXNzaW9uLlwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW1vdmVMYXN0Um91dGVQYXJhbSgpOiB2b2lkIHtcclxuICAgIHRoaXMucm91dGVQYXJhbSA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLk5BVklHQVRJT05fUEFSQU1TX1NUT1JBR0VfS0VZKSB8fCBcIm51bGxcIik7XHJcbiAgICBpZiAodGhpcy5yb3V0ZVBhcmFtKSB7XHJcbiAgICAgIHRoaXMucm91dGVQYXJhbS5wb3AoKTtcclxuICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQodGhpcy5OQVZJR0FUSU9OX1BBUkFNU19TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkodGhpcy5yb3V0ZVBhcmFtKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJyb3V0ZVBhcmFtIHNlc3Npb24gaXMgbnVsbC5cIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYmFja05hdmlnYXRpb24oZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCwgbWU6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKGdyb3VwWydpc0VtYmVkZGVkUGFnZSddKSB7XHJcbiAgICAgIGdyb3VwWydpc1RyaWdnZXJlZCddID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuY2xvc2VDb250YWluZXJWaWV3KGdyb3VwKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChncm91cC5iZWZvcmVCYWNrTmF2aWdhdGlvblBhZ2UpIHtcclxuICAgICAgZ3JvdXAuYmVmb3JlQmFja05hdmlnYXRpb25QYWdlKGdyb3VwKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubmF2aWdhdGVCYWNrVG9QcmV2aW91c1BhZ2UoZ3JvdXApO1xyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMubmF2aWdhdGVCYWNrVG9QcmV2aW91c1BhZ2UoZ3JvdXApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBuYXZpZ2F0ZUJhY2tUb1ByZXZpb3VzUGFnZShncm91cDogWkdyb3VwKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLnRyeVVwZGF0ZUdyb3VwVHJpZ2dlcihmYWxzZSk7XHJcblxyXG4gICAgY29uc3QgYmFja05hdmlnYXRpb25QYXRoOiBzdHJpbmdbXSA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkJBQ0tfTkFWSUdBVElPTl9QQVRIX1NUT1JBR0VfS0VZKSk7XHJcbiAgICBjb25zdCBiYWNrTmF2aWdhdGlvblVSTCA9IGdyb3VwLmJhY2tOYXZpZ2F0aW9uUGFnZSB8fCBiYWNrTmF2aWdhdGlvblBhdGhbYmFja05hdmlnYXRpb25QYXRoLmxlbmd0aCAtIDFdO1xyXG5cclxuICAgIGlmICghYmFja05hdmlnYXRpb25VUkwpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIG5hdmlnYXRpbmcgYmFjayB0byBwcmV2aW91cyBwYWdlOiBiYWNrTmF2aWdhdGlvblVSTCBpcyBub3Qgc2V0LlwiKTtcclxuICAgICAgLy90aHJvdyBuZXcgRXJyb3IoXCJCYWNrTmF2aWdhdGlvblBhdGggbm90IHNldC5cIik7XHJcbiAgICAgIGF3YWl0IHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwodGhpcy5nZXRTdGFydHVwUGFnZSgpLCB7IHJlcGxhY2VVcmw6IHRydWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFncm91cC5iYWNrTmF2aWdhdGlvblBhZ2UpIHtcclxuICAgICAgY29uc3QgcHJldmlvdXNSb3V0ZVBhcmFtID0gdGhpcy5nZXRQcmV2aW91c1BhZ2VSb3V0ZVBhcmFtKCk7XHJcbiAgICAgIGNvbnN0IHByZXZpb3VzQ3VycmVudFJvdXRlUGFyYW0gPSB0aGlzLmdldE5hdmlnYXRpb25DdXJyZW50UGFyYW0oKTtcclxuICAgICAgaWYgKHByZXZpb3VzUm91dGVQYXJhbSAmJiBwcmV2aW91c1JvdXRlUGFyYW0gPT09IHByZXZpb3VzQ3VycmVudFJvdXRlUGFyYW0pIHtcclxuICAgICAgICB0aGlzLnJlbW92ZVByZXZpb3VzUGFnZVJvdXRlUGFyYW0oKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnJlbW92ZUxhc3RSb3V0ZVBhcmFtKCk7XHJcbiAgICAgIHRoaXMucmVtb3ZlTGFzdE5hdmlnYXRpb25QYXRoKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQodGhpcy5OQVZJR0FURURfUkVMT0FEX0dSSURfU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KHRydWUpKTtcclxuXHJcbiAgICBpZiAodGhpcy5jYWNoZVNlcnZpY2UuZ2V0Q2FjaGUodGhpcy5DTE9ORV9ORVdfTU9ERUxfQ0FDSEVfS0VZKSkge1xyXG4gICAgICB0aGlzLmNhY2hlU2VydmljZS5jbGVhckNhY2hlKHRoaXMuQ0xPTkVfTkVXX01PREVMX0NBQ0hFX0tFWSk7XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgYXdhaXQgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChiYWNrTmF2aWdhdGlvblVSTCwgeyByZXBsYWNlVXJsOiB0cnVlIH0pO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgbmF2aWdhdGluZyBiYWNrIHRvIHByZXZpb3VzIHBhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKTtcclxuICAgICAgLy90aHJvdyBlcnJvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U3RhcnR1cFBhZ2UoKSB7XHJcbiAgICBjb25zdCB7IHN0YXJ0VXBQYWdlIH0gPSB0aGlzLmVudmlyb25tZW50O1xyXG5cclxuICAgIC8vIENoZWNrIGlmIHRoZSBzdGFydHVwIHBhZ2Ugc3RhcnRzIHdpdGggYSB1bmRlcnNjb3JlLlxyXG4gICAgaWYgKHN0YXJ0VXBQYWdlLnN0YXJ0c1dpdGgoJ18nKSkge1xyXG4gICAgICByZXR1cm4gYC8ke3N0YXJ0VXBQYWdlLnNsaWNlKDEpfWA7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgbm90LCBwcmVwZW5kIGEgZm9yd2FyZCBzbGFzaCBhbmQgcmV0dXJuLlxyXG4gICAgcmV0dXJuIGAvJHtzdGFydFVwUGFnZX1gO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoaXN0b3J5QmFjaygpIHtcclxuICAgIHRoaXMudHJ5VXBkYXRlR3JvdXBUcmlnZ2VyKGZhbHNlKTtcclxuXHJcbiAgICBpZiAodGhpcy5ncm91cFsnaXNFbWJlZGRlZFBhZ2UnXSkge1xyXG4gICAgICB0aGlzLmNsb3NlQ29udGFpbmVyVmlldyh0aGlzLmdyb3VwKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubmF2Q29udHJvbGxlci5wb3AoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWZyZXNoR3JpZChcclxuICAgIGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQsXHJcbiAgICBncm91cDogWkdyb3VwLFxyXG4gICAgbWU6IGFueSxcclxuICAgIGdyaWRPcHRpb25OYW1lPzogc3RyaW5nXHJcbiAgKSB7XHJcbiAgICBncmlkT3B0aW9uTmFtZSA9IGdyaWRPcHRpb25OYW1lIHx8IFwiZ3JpZE9wdGlvbnNcIjtcclxuICAgIGlmIChldmVudCAmJiBldmVudC50YXJnZXQpIHtcclxuICAgICAgY29uc3QgZ3JpZE9wdGlvbiA9IGV2ZW50LnRhcmdldFxyXG4gICAgICAgIC50cmltKClcclxuICAgICAgICAucmVwbGFjZShcIihcIiwgXCJcIilcclxuICAgICAgICAucmVwbGFjZShcIilcIiwgXCJcIilcclxuICAgICAgICAucmVwbGFjZShcImdyb3VwLnJlZnJlc2hHcmlkXCIsIFwiXCIpO1xyXG4gICAgICBpZiAoZ3JpZE9wdGlvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgZ3JpZE9wdGlvbk5hbWUgPSBncmlkT3B0aW9uO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgemdyaWRDb250cm9sID0gZ3JvdXBbZ3JpZE9wdGlvbk5hbWVdIGFzIFpHcmlkO1xyXG4gICAgaWYgKHpncmlkQ29udHJvbCkge1xyXG4gICAgICB6Z3JpZENvbnRyb2wuZ2V0RGF0YSgpO1xyXG4gICAgfVxyXG4gICAgZ3JvdXBbJ2lzVHJpZ2dlcmVkJ10gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVmcmVzaFBhZ2UoKSB7XHJcbiAgICBpZiAodGhpcy5ncm91cCkge1xyXG4gICAgICB0aGlzLnRyeVVwZGF0ZUdyb3VwVHJpZ2dlcihmYWxzZSk7XHJcbiAgICB9XHJcbiAgICBsb2NhdGlvbi5yZWxvYWQoKTtcclxuICAgIC8vIHRoaXMucm91dGVyLnJvdXRlUmV1c2VTdHJhdGVneS5zaG91bGRSZXVzZVJvdXRlID0gKCkgPT4gZmFsc2U7XHJcbiAgICAvLyB0aGlzLnJvdXRlci5vblNhbWVVcmxOYXZpZ2F0aW9uID0gJ3JlbG9hZCc7XHJcbiAgICAvLyBjb25zb2xlLmxvZygnUGF0aDogJywgdGhpcy5hY3RpdmF0ZWRSb3V0ZVsnX3JvdXRlclN0YXRlJ10uc25hcHNob3QudXJsKTtcclxuICAgIC8vIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2NybS9jdXN0b21lciddKTtcclxuICB9XHJcblxyXG4gIGdldENsb25lTmV3Q2FjaGVaTW9kZWwoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgY29uc3QgY2FjaGVaTW9kZWwgPSB0aGlzLmNhY2hlU2VydmljZS5nZXRDYWNoZSh0aGlzLkNMT05FX05FV19NT0RFTF9DQUNIRV9LRVkpO1xyXG4gICAgaWYgKGNhY2hlWk1vZGVsKSB7XHJcbiAgICAgIHRoaXMuY2FjaGVTZXJ2aWNlLmNsZWFyQ2FjaGUodGhpcy5DTE9ORV9ORVdfTU9ERUxfQ0FDSEVfS0VZKTtcclxuICAgICAgZ3JvdXAuek1vZGVsID0gY2FjaGVaTW9kZWw7XHJcbiAgICAgIGdyb3VwLnpNb2RlbC5JZCA9IDA7XHJcbiAgICB9XHJcbiAgICBncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBuZXdNb2RlbChldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50LCBncm91cDogWkdyb3VwKSB7XHJcbiAgICBvZihbXSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKCh6bW9kZWwpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiQmVmb3JlIG5ldywgek1vZGVsOlwiLCB6bW9kZWwpO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYmVmb3JlTmV3TW9kZWwoZ3JvdXApO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcImN1cnJlbnQgdXJsOiBcIiwgdGhpcy5yb3V0ZXIudXJsKTtcclxuXHJcbiAgICAgICAgICBjb25zdCByZWZlcmVuY2VJZCA9IGdyb3VwLnBhcmVudFJlZmVyZW5jZUlkIHx8IFwiMFwiO1xyXG4gICAgICAgICAgLy9jb25zdCBwYXRoU2VnbWVudCA9IHRoaXMucm91dGVyLnVybC5zcGxpdChcIi9cIik7XHJcbiAgICAgICAgICAvL2NvbnN0IGxhc3RTZWdtZW50ID0gcGF0aFNlZ21lbnRbcGF0aFNlZ21lbnQubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICBjb25zdCBjdXJyZW50TmF2aWdhdGlvblBhcmFtID0gdGhpcy5nZXROYXZpZ2F0aW9uQ3VycmVudFBhcmFtKCk7XHJcbiAgICAgICAgICBjb25zdCBuYXZpZ2F0aW9uU2VnbWVudHMgPSBjdXJyZW50TmF2aWdhdGlvblBhcmFtID8gY3VycmVudE5hdmlnYXRpb25QYXJhbS5zcGxpdCgnLycpIDogbnVsbDtcclxuICAgICAgICAgIGNvbnN0IGRlZmF1bHRBY3Rpb24gPSBncm91cC5pc0Nsb25lTmV3ID8gJ25ldycgOiAnZWRpdCc7XHJcbiAgICAgICAgICBjb25zdCBhY3Rpb25TZWdtZW50ID0gZ3JvdXAuaXNDbG9uZU5ldyA/IChuYXZpZ2F0aW9uU2VnbWVudHMgPyBuYXZpZ2F0aW9uU2VnbWVudHNbbmF2aWdhdGlvblNlZ21lbnRzLmxlbmd0aCAtIDFdIDogJ25ldycpIDogZGVmYXVsdEFjdGlvbjtcclxuXHJcbiAgICAgICAgICBpZiAoZ3JvdXAuaXNMaXN0Rm9ybSkge1xyXG4gICAgICAgICAgICB0aGlzLnRyeVVwZGF0ZUdyb3VwVHJpZ2dlcihmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNldE5hdmlnYXRpb25QYXJhbXMoW3JlZmVyZW5jZUlkLCAnbmV3J10pO1xyXG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbZ3JvdXAuZWRpdE1vZGVsVVJMXSwge1xyXG4gICAgICAgICAgICAgIHJlbGF0aXZlVG86IGdyb3VwLmN0cmxTY29wZS5hY3RpdmF0ZWRSb3V0ZSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gU2NlbmFyaW8gMTogRnJvbSBMaXN0IE5ldyhhY3Rpb246IG5ldykgPT0+IENsZWFyIGZvcm1cclxuICAgICAgICAgICAgLy8gU2NlbmFyaW8gMjogRnJvbSBGb3JtIE5ldyhhY3Rpb246IG5ldykgPT0+IENsZWFyIGZvcm1cclxuICAgICAgICAgICAgLy8gU2NlbmFyaW8gMzogRnJvbSBGb3JtIE5ldyhhY3Rpb246IG5ldyksIGlzQ2xvbmVOZXcgPT0+IERPTlQgQ2xlYXIgZm9ybVxyXG4gICAgICAgICAgICAvLyBTY2VuYXJpbyA0OiBGcm9tIEZvcm0gTmV3KGFjdGlvbjogbmV3KSwgaXNDbG9uZU5ldywgU2F2ZSwgQ2xpY2sgTmV3ID09PiBDbGVhciBmb3JtIChXaGVuIENyZWF0ZU1vZGVsLCBuZWVkIGNoYW5nZSBpc0Nsb25lTmV3ID0gZmFsc2UpXHJcbiAgICAgICAgICAgIC8vIFNjZW5hcmlvIDU6IEZyb20gTGlzdCBvcGVuIHJlY29yZChhY3Rpb246IGVkaXQpLCBpc0Nsb25lTmV3ID09PiBET05UIENsZWFyIGZvcm1cclxuICAgICAgICAgICAgLy8gU2NlbmFyaW8gNjogRnJvbSBMaXN0IG9wZW4gcmVjb3JkKGFjdGlvbjogZWRpdCksIGlzQ2xvbmVOZXcsIFNhdmUsIENsaWNrIE5ldyA9PT4gQ2xlYXIgZm9ybSAoV2hlbiBVcGRhdGVNb2RlbCwgbmVlZCBjaGFuZ2UgaXNDbG9uZU5ldyA9IGZhbHNlKVxyXG4gICAgICAgICAgICAvLyBTY2VuYXJpbyA3OiBGcm9tIExpc3Qgb3BlbiByZWNvcmQoYWN0aW9uOiBlZGl0KSwgQ2xpY2sgTmV3ID09PiBDbGVhciBmb3JtXHJcbiAgICAgICAgICAgIC8vIFNjZW5hcmlvIDg6IEZyb20gTGlzdCBvcGVuIHJlY29yZChhY3Rpb246IGVkaXQpLCBDbGljayBOZXcsIFNhdmUsIGlzQ2xvbmVOZXcgPT0+IERPTlQgQ2xlYXIgZm9ybVxyXG5cclxuICAgICAgICAgICAgaWYgKGFjdGlvblNlZ21lbnQgPT09IFwiZWRpdFwiIHx8IGFjdGlvblNlZ21lbnQgPT09IFwibmV3XCIpIHtcclxuICAgICAgICAgICAgICBpZiAoIWdyb3VwLmlzQ2xvbmVOZXcpIHtcclxuICAgICAgICAgICAgICAgIGdyb3VwLnpNb2RlbCA9IHt9O1xyXG4gICAgICAgICAgICAgICAgZ3JvdXAuZm9ybS5yZXNldCgpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFJlbG9hZCB0aGUgd29ya2Zsb3cgYnV0dG9uIGlmIHRoZSBUeXBlQ29kZSBpcyAnRlVOQ1RJT04nXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1R5cGVDb2RlRnVuY3Rpb24oZXZlbnQpKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMucmVsb2FkV29ya2Zsb3dCdXR0b24oZ3JvdXAsIGV2ZW50LmRhdGEuekJ1dHRvbk5hbWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAoYWN0aW9uU2VnbWVudCA9PT0gXCJlZGl0XCIpIHtcclxuICAgICAgICAgICAgICAgIC8vIGNsZWFyIGNsb25lTmV3TW9kZWwgY2FjaGUoaWYgaGF2ZSlcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhY2hlU2VydmljZS5nZXRDYWNoZSh0aGlzLkNMT05FX05FV19NT0RFTF9DQUNIRV9LRVkpKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVTZXJ2aWNlLmNsZWFyQ2FjaGUodGhpcy5DTE9ORV9ORVdfTU9ERUxfQ0FDSEVfS0VZKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvL3RoaXMuc2V0TmF2aWdhdGlvblBhcmFtcyhbcmVmZXJlbmNlSWQsICduZXcnXSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUxhc3RSb3V0ZVBhcmFtKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFJvdXRlUGFyYW0oW3JlZmVyZW5jZUlkLCAnbmV3J10pO1xyXG5cclxuICAgICAgICAgICAgICAgIGdyb3VwLnpNb2RlbFtncm91cC5wYXJlbnRSZWZlcmVuY2VGaWVsZF0gPSByZWZlcmVuY2VJZDtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZ3JvdXAuaXNFZGl0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgZ3JvdXAuaXNOZXcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIGdyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy50cnlVcGRhdGVHcm91cFRyaWdnZXIoZmFsc2UpO1xyXG4gICAgICAgICAgICAgIHRoaXMuc2V0TmF2aWdhdGlvblBhcmFtcyhbcmVmZXJlbmNlSWQsICduZXcnXSk7XHJcblxyXG4gICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtncm91cC5lZGl0TW9kZWxVUkxdLCB7XHJcbiAgICAgICAgICAgICAgICByZWxhdGl2ZVRvOiBncm91cC5jdHJsU2NvcGUuYWN0aXZhdGVkUm91dGUsXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChncm91cC5pc0Nsb25lTmV3KSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5hZnRlckNsb25lTmV3TW9kZWwoZ3JvdXAsIGdyb3VwLnpNb2RlbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5hZnRlck5ld01vZGVsKGdyb3VwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNyZWF0ZU1vZGVsKGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGNvbnN0IGZnOiBGb3JtR3JvdXAgPSBncm91cC5mb3JtIGFzIEZvcm1Hcm91cDtcclxuICAgIGNvbnN0IHJlc01lc3NhZ2UgPSBncm91cC5TdWNjZXNzQ3JlYXRlZE1lc3NhZ2UgfHwgXCJSZWNvcmQgaXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkuXCI7XHJcbiAgICBsZXQgY3JlYXRlTW9kZWxyZXMgPSBudWxsO1xyXG5cclxuICAgIGlmICghZmcuZGlydHkpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiRm9ybSBpcyBub3QgZGlydHkgaGVuY2UgcmVjb3JkIGlzIG5vdCBzYXZlLlwiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghZmcudmFsaWQpIHtcclxuICAgICAgdGhpcy5jb21wb25lbnRFcnJvckhhbmRsZXIuc2hvd0Zvcm1Hcm91cEVycm9yTWVzc2FnZShncm91cCwgZmcpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgb2YoZ3JvdXAuek1vZGVsKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBzd2l0Y2hNYXAoKHptb2RlbCkgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJCZWZvcmUgY3JlYXRlLCB6TW9kZWw6XCIsIHptb2RlbCk7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5iZWZvcmVDcmVhdGVNb2RlbChncm91cCk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICAgIGlmICghdGhpcy5ncm91cC5za2lwQ3JlYXRlVXNpbmdGb3JtVmFsdWUpIHtcclxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihncm91cC56TW9kZWwsIGZnLnZhbHVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgbmV3TW9kZWwgPSBPYmplY3QuYXNzaWduKHt9LCBncm91cC56TW9kZWwpO1xyXG4gICAgICAgICAgWkNvbXBvbmVudEhlbHBlci5yZW1vdmVOdWxsRmllbGRzKG5ld01vZGVsKTtcclxuXHJcbiAgICAgICAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlXHJcbiAgICAgICAgICAgIC5odHRwUG9zdCQoZ3JvdXAucmVzb3VyY2VVUkwsIG5ld01vZGVsKVxyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICB0YXAoKHJlc3ApID0+IHtcclxuICAgICAgICAgICAgICAgIGNyZWF0ZU1vZGVscmVzID0gcmVzcDtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXNwO1xyXG4gICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgIHRhcCgocmVzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVTdWNjZXNzKHJlcywgcmVzTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKHptb2RlbDogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkFmdGVyIGNyZWF0ZWQsIHpNb2RlbDpcIiwgem1vZGVsKTtcclxuICAgICAgICAgIHRoaXMucGF0Y2hVcGRhdGVkek1vZGVsKGZnLCB6bW9kZWwsIGdyb3VwKTtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmFmdGVyQ3JlYXRlTW9kZWwoZ3JvdXAsIHptb2RlbCk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgdGFwKChyZXNwKSA9PiB7XHJcbiAgICAgICAgICBpZiAoY3JlYXRlTW9kZWxyZXMuUHJvY2Vzc2luZ1N0YXR1cyA9PSBudWxsIHx8IGNyZWF0ZU1vZGVscmVzLlByb2Nlc3NpbmdTdGF0dXMgPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBpZiAocmVzcCAmJiBncm91cC56TW9kZWwuSWQgIT09IDApIHtcclxuICAgICAgICAgICAgICBncm91cC5pc05ldyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIGdyb3VwLmlzRWRpdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgZ3JvdXAuaXNDbG9uZU5ldyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIGdyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgZ3JvdXAuY2FuY2VsQnV0dG9uTmFtZSA9IFwiQ2xvc2VcIjtcclxuICAgICAgICAgICAgICAvLyBPYmplY3QuYXNzaWduKGdyb3VwLnpNb2RlbCwgcmVzcCk7XHJcbiAgICAgICAgICAgICAgLy8gZmcucGF0Y2hWYWx1ZShyZXNwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBmZy5tYXJrQXNQcmlzdGluZSgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKChncm91cC5pc0Nsb3NlQWZ0ZXJTdWNjZXNzIHx8IGdyb3VwLmlzQ2xvc2VBZnRlckNyZWF0ZWQpICYmICFncm91cC5pc0Nsb25lTmV3KSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5iYWNrTmF2aWdhdGlvbihudWxsLCBncm91cCwgdGhpcyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZmcubWFya0FzRGlydHkoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiRG9uZSB1cGRhdGVNb2RlbCB1cGRhdGVkIHpNb2RlbDpcIiwgZmcudmFsdWUpO1xyXG4gICAgICAgICAgLy8gdGhpcy50b2FzdFNlcnZpY2Uuc2hvdyhcIlJlY29yZCBpcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseS5cIik7XHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlTW9kZWwoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgdGhpcy51cGRhdGVNb2RlbE9ic2VydmFibGUoZXZlbnQsIGdyb3VwKS5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVNb2RlbE9ic2VydmFibGUoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCwgZm9ybTogRm9ybUdyb3VwID0gbnVsbCwgdXBkYXRlQVBJT2JzZXJ2YWJsZTogT2JzZXJ2YWJsZTxhbnk+ID0gbnVsbCwgaXNTa2lwRGlydHkgPSBmYWxzZSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBjb25zdCBmZyA9IGZvcm0gfHwgZ3JvdXAuZm9ybSBhcyBGb3JtR3JvdXA7XHJcbiAgICBjb25zdCByZXNNZXNzYWdlID0gZ3JvdXAuU3VjY2Vzc1VwZGF0ZWRNZXNzYWdlIHx8IFwiUmVjb3JkIGlzIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LlwiO1xyXG4gICAgbGV0IHVwZGF0ZU1vZGVscmVzID0gbnVsbDtcclxuXHJcbiAgICBpZiAoIXRoaXMuaXNGb3JtRGlydHlBbmRWYWxpZChmZywgZ3JvdXAsIGlzU2tpcERpcnR5LCBldmVudCkpIHtcclxuICAgICAgaWYgKGlzU2tpcERpcnR5KSB7XHJcbiAgICAgICAgZmcubWFya0FsbEFzVG91Y2hlZCgpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBvZihmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlQVBJT2JzZXJ2YWJsZSA9IHVwZGF0ZUFQSU9ic2VydmFibGUgfHwgdGhpcy53ZWJBcGlTZXJ2aWNlLmh0dHBQdXQkKGdyb3VwLnJlc291cmNlVVJMICsgXCIvXCIgKyBncm91cC56TW9kZWwuSWQsIGdyb3VwLnpNb2RlbClcclxuICAgICAgLnBpcGUodGFwKChyZXMpID0+IHtcclxuICAgICAgICB0aGlzLmhhbmRsZVN1Y2Nlc3MocmVzLCByZXNNZXNzYWdlKTtcclxuICAgICAgfVxyXG4gICAgICAgIC8vdGhpcy5oYW5kbGVTdWNjZXNzKHJlcywgXCJSZWNvcmQgaXMgdXBkYXRlZCBzdWNjZXNzZnVsbHkuXCIpXHJcbiAgICAgICkpO1xyXG5cclxuICAgIHJldHVybiBvZihncm91cC56TW9kZWwpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHN3aXRjaE1hcCgoem1vZGVsKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkJlZm9yZSB1cGRhdGUsIHpNb2RlbDpcIiwgem1vZGVsKTtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmJlZm9yZVVwZGF0ZU1vZGVsKGdyb3VwKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKCFncm91cC5za2lwVXBkYXRlVXNpbmdGb3JtVmFsdWUpIHtcclxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihncm91cC56TW9kZWwsIGZnLnZhbHVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZUFQSU9ic2VydmFibGU7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgc3dpdGNoTWFwKChyZXNwOiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiQWZ0ZXIgdXBkYXRlZCwgcmVzcG9uc2U6XCIsIHJlc3ApO1xyXG4gICAgICAgICAgdXBkYXRlTW9kZWxyZXMgPSByZXNwO1xyXG4gICAgICAgICAgZ3JvdXAuaXNDbG9uZU5ldyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5wYXRjaFVwZGF0ZWR6TW9kZWwoZmcsIHJlc3AsIGdyb3VwKTtcclxuICAgICAgICAgIGZnLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5hZnRlclVwZGF0ZU1vZGVsKGdyb3VwLCByZXNwKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICB0YXAoKHJlc3ApID0+IHtcclxuICAgICAgICAgIGlmICh1cGRhdGVNb2RlbHJlcyAmJiB1cGRhdGVNb2RlbHJlcy5Qcm9jZXNzaW5nU3RhdHVzKSB7XHJcbiAgICAgICAgICAgIGlmIChncm91cC5pc0Nsb3NlQWZ0ZXJTdWNjZXNzIHx8IGdyb3VwLmlzQ2xvc2VBZnRlclVwZGF0ZWQpIHtcclxuICAgICAgICAgICAgICB0aGlzLmJhY2tOYXZpZ2F0aW9uKG51bGwsIGdyb3VwLCB0aGlzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbG9uZXMgYSBuZXcgbW9kZWwgZm9yIGEgWkdyb3VwIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBaQ29tcG9uZW50T3V0cHV0RXZlbnQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1pDb21wb25lbnRPdXRwdXRFdmVudH0gZXZlbnQgLSBUaGUgWkNvbXBvbmVudE91dHB1dEV2ZW50IHRyaWdnZXJpbmcgdGhlIGNsb25lLlxyXG4gICAqIEBwYXJhbSB7Wkdyb3VwfSBncm91cCAtIFRoZSBaR3JvdXAgdG8gY2xvbmUgdGhlIG5ldyBtb2RlbCBmb3IuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjbG9uZU5ld01vZGVsKGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIGdyb3VwOiBaR3JvdXApIHtcclxuICAgIC8vIFNldCBmbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgbW9kZWwgaXMgYmVpbmcgY2xvbmVkXHJcbiAgICBncm91cC5pc0Nsb25lTmV3ID0gdHJ1ZTtcclxuXHJcbiAgICAvLyBFeHRyYWN0IHRoZSBmdW5jdGlvbiB2YWx1ZSBmcm9tIHRoZSB0YXJnZXQgb2YgdGhlIGV2ZW50XHJcbiAgICBjb25zdCB7IHRhcmdldCB9ID0gZXZlbnQ7XHJcbiAgICBjb25zdCBmdW5jdGlvblZhbHVlID0gdGFyZ2V0Py5tYXRjaCgvXFwoKFteKV0rKVxcKS8pPy5bMV07XHJcblxyXG4gICAgLy8gSWYgdGhlIGZ1bmN0aW9uIHZhbHVlIGlzICd0cnVlJywgcmVzZXQgdGhlIGZvcm0gYW5kIG1vZGVsXHJcbiAgICBpZiAoZnVuY3Rpb25WYWx1ZSA9PT0gJ3RydWUnKSB7XHJcbiAgICAgIGdyb3VwLnpNb2RlbCA9IHt9O1xyXG4gICAgICBncm91cC5mb3JtLnJlc2V0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRGVmaW5lIHRoZSB2YWx1ZXMgZm9yIHRoZSBXRlMgbW9kZWxcclxuICAgIGNvbnN0IG5ld01vZGVsVmFsdWVzID0ge1xyXG4gICAgICBJZDogMCxcclxuICAgICAgV0ZTX0RvY3VtZW50SWQ6IG51bGwsXHJcbiAgICAgIFdGU19TdGF0dXNDb2RlOiBudWxsLFxyXG4gICAgICBXRlNfU3RhdHVzSWQ6IG51bGwsXHJcbiAgICAgIFdGU19TdGF0dXNOYW1lOiBudWxsLFxyXG4gICAgfTtcclxuXHJcbiAgICAvLyBBc3NpZ24gdGhlIFdGUyBtb2RlbCB2YWx1ZXMgdG8gdGhlIGZvcm0gdmFsdWUgYW5kIFpNb2RlbFxyXG4gICAgT2JqZWN0LmFzc2lnbihncm91cC5mb3JtLnZhbHVlLCBuZXdNb2RlbFZhbHVlcyk7XHJcbiAgICBPYmplY3QuYXNzaWduKGdyb3VwLnpNb2RlbCwgZ3JvdXAuZm9ybS52YWx1ZSk7XHJcblxyXG4gICAgLy8gUGF0Y2ggdGhlIGZvcm0gd2l0aCB0aGUgWk1vZGVsLCBtYXJrIGl0IGFzIGRpcnR5LCBhbmQgY2FjaGUgdGhlIFpNb2RlbFxyXG4gICAgY29uc3QgZmcgPSBncm91cC5mb3JtIGFzIEZvcm1Hcm91cDtcclxuICAgIGZnLnBhdGNoVmFsdWUoZ3JvdXAuek1vZGVsKTtcclxuICAgIGZnLm1hcmtBc0RpcnR5KCk7XHJcbiAgICB0aGlzLmNhY2hlU2VydmljZS5zZXRDYWNoZSh0aGlzLkNMT05FX05FV19NT0RFTF9DQUNIRV9LRVksIGdyb3VwLnpNb2RlbCk7XHJcblxyXG4gICAgLy8gQ2FsbCB0aGUgbmV3TW9kZWwgZnVuY3Rpb24gZm9yIHRoZSBncm91cFxyXG4gICAgdGhpcy5uZXdNb2RlbChudWxsLCBncm91cCk7XHJcblxyXG4gICAgLy8gUmVsb2FkIHRoZSB3b3JrZmxvdyBidXR0b24gaWYgdGhlIFR5cGVDb2RlIGlzICdGVU5DVElPTidcclxuICAgIGlmICh0aGlzLmlzVHlwZUNvZGVGdW5jdGlvbihldmVudCkpIHtcclxuICAgICAgdGhpcy5yZWxvYWRXb3JrZmxvd0J1dHRvbihncm91cCwgZXZlbnQuZGF0YS56QnV0dG9uTmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2xlYXIgdGhlIHRyaWdnZXIgZmxhZ1xyXG4gICAgZ3JvdXAuaXNUcmlnZ2VyZWQgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZGVsZXRlTW9kZWwoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgY29uc3QgZmc6IEZvcm1Hcm91cCA9IGdyb3VwLmZvcm0gYXMgRm9ybUdyb3VwO1xyXG4gICAgY29uc3QgcmVzTWVzc2FnZSA9IGdyb3VwLlN1Y2Nlc3NEZWxldGVkTWVzc2FnZSB8fCBcIlJlY29yZCBpcyBkZWxldGVkIHN1Y2Nlc3NmdWxseS5cIlxyXG5cclxuICAgIG9mKGdyb3VwLnpNb2RlbClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKCh6bW9kZWwpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiQmVmb3JlIGRlbGV0ZSwgek1vZGVsOlwiLCB6bW9kZWwpO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYmVmb3JlRGVsZXRlTW9kZWwoZ3JvdXApO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgICAgICBncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYWxlcnRTZXJ2aWNlLnNob3coXCJEZWxldGUgUmVjb3JkXCIsIFwiQXJlIHlvdSBzdXJlP1wiLFxyXG4gICAgICAgICAgICBbXHJcbiAgICAgICAgICAgICAgeyB0ZXh0OiBcIk5vXCIsIGNzc0NsYXNzOiBcInNlY29uZGFyeVwiIH0gYXMgQWxlcnRCdXR0b24sXHJcbiAgICAgICAgICAgICAgeyB0ZXh0OiBcIlllc1wiLCBjc3NDbGFzczogXCJwcmltYXJ5XCIgfSBhcyBBbGVydEJ1dHRvblxyXG4gICAgICAgICAgICBdKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKHJlcGx5OiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIGlmIChyZXBseSA9PT0gXCJZZXNcIikge1xyXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGdyb3VwLnpNb2RlbCwgZmcudmFsdWUpO1xyXG4gICAgICAgICAgICBncm91cC56TW9kZWwuRGlzYWJsZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgbGV0IHRlbXBSZXNwb25zZSA9IHt9O1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlXHJcbiAgICAgICAgICAgICAgLmh0dHBQdXQkKGdyb3VwLnJlc291cmNlVVJMICsgXCIvXCIgKyBncm91cC56TW9kZWwuSWQsIGdyb3VwLnpNb2RlbClcclxuICAgICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIHRhcCgocmVzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIHRlbXBSZXNwb25zZSA9IE9iamVjdC5hc3NpZ24oe30sIHJlcyk7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU3VjY2VzcyhyZXMsIHJlc01lc3NhZ2UpXHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoem1vZGVsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQWZ0ZXIgZGVsZXRlZCwgek1vZGVsOlwiLCB6bW9kZWwpO1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hZnRlckRlbGV0ZU1vZGVsKGdyb3VwLCB6bW9kZWwpO1xyXG4gICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICB0YXAoKHJlc3ApID0+IHtcclxuICAgICAgICAgICAgICAgICAgLy90aGlzLmhpc3RvcnlCYWNrKCk7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh0ZW1wUmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGVtcFJlc3BvbnNlWydQcm9jZXNzaW5nU3RhdHVzJ10pIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGZnLnJlc2V0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJhY2tOYXZpZ2F0aW9uKG51bGwsIGdyb3VwLCB0aGlzKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgZ3JvdXAuek1vZGVsLkRpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gb2YoW10pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwYXRjaFVwZGF0ZWR6TW9kZWwoZmc6IEZvcm1Hcm91cCwgcmVzcDogYW55LCBncm91cDogWkdyb3VwKSB7XHJcbiAgICBpZiAocmVzcCkge1xyXG4gICAgICBpZiAocmVzcC5EYXRhKSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihncm91cC56TW9kZWwsIHJlc3AuRGF0YSk7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0RGF0YSA9IHRoaXMucmVtb3ZlVGV4dEVkaXRvclZhbHVlRnJvbUZvcm1QYXRjaGluZyhyZXNwLkRhdGEsIGdyb3VwKTtcclxuICAgICAgICBmZy5wYXRjaFZhbHVlKHJlc3VsdERhdGEpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHJlc3BbXCJJZFwiXSkge1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24oZ3JvdXAuek1vZGVsLCByZXNwKTtcclxuICAgICAgICBjb25zdCByZXN1bHREYXRhID0gdGhpcy5yZW1vdmVUZXh0RWRpdG9yVmFsdWVGcm9tRm9ybVBhdGNoaW5nKHJlc3AsIGdyb3VwKTtcclxuICAgICAgICBmZy5wYXRjaFZhbHVlKHJlc3VsdERhdGEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ3JvdXAucmVmZXJlbmNlSWQgPSBncm91cC56TW9kZWwuSWQ7XHJcbiAgICB0aGlzLnRyeVVwZGF0ZUdyb3VwVHJpZ2dlcihmYWxzZSk7XHJcbiAgICBncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG5cclxuICAgIGZnLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbW92ZVRleHRFZGl0b3JWYWx1ZUZyb21Gb3JtUGF0Y2hpbmcoZGF0YSwgZ3JvdXA6IFpHcm91cCk6IGFueSB7XHJcbiAgICBjb25zdCByZXN1bHREYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkYXRhKSk7XHJcbiAgICBjb25zdCBhbGxGaWVsZHMgPSBaQ29tcG9uZW50SGVscGVyLmdldEZpZWxkTGlzdEZyb21GaWVsZHNXaXRob3V0SGllcmFyY2h5KGdyb3VwLmZpZWxkcyk7XHJcblxyXG4gICAgY29uc3QgdGV4dEVkaXRvcnMgPSBhbGxGaWVsZHMuZmlsdGVyKHggPT4geC5UeXBlID09PSAnenRleHRlZGl0b3InKTtcclxuICAgIGlmICh0ZXh0RWRpdG9ycyAmJiB0ZXh0RWRpdG9ycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGZvciAoY29uc3QgY29tcCBvZiB0ZXh0RWRpdG9ycykge1xyXG4gICAgICAgIGRlbGV0ZSByZXN1bHREYXRhW2NvbXAuVmFsdWVdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdERhdGE7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzVHlwZUNvZGVGdW5jdGlvbihldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50KSB7XHJcbiAgICByZXR1cm4gZXZlbnQ/LmRhdGE/LlR5cGVDb2RlID09PSAnRlVOQ1RJT04nO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWxvYWRXb3JrZmxvd0J1dHRvbihncm91cDogWkdyb3VwLCB6QnV0dG9uTmFtZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCB3b3JrZmxvd0J1dHRvbnMgPSBaQ29tcG9uZW50SGVscGVyLmdldENvbXBvbmVudChncm91cCwgYHp3b3JrZmxvd2J1dHRvbnNfJHt6QnV0dG9uTmFtZX1gKTtcclxuICAgIHdvcmtmbG93QnV0dG9ucz8uWydsb2FkQnV0dG9uJ10/LigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzRm9ybURpcnR5QW5kVmFsaWQoZmc6IEZvcm1Hcm91cCwgZ3JvdXA6IFpHcm91cCwgaXNTa2lwRGlydHkgPSBmYWxzZSwgZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFpc1NraXBEaXJ0eSAmJiAhZmcuZGlydHkpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiRm9ybSBpcyBub3QgZGlydHkgaGVuY2UgcmVjb3JkIGlzIG5vdCBzYXZlLlwiKTtcclxuICAgICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50ICYmIGV2ZW50LmRhdGEgJiYgZXZlbnQuZGF0YVtgRm9ybU5vdERpcnR5TWVzc2FnZWBdID8gZXZlbnQuZGF0YVtgRm9ybU5vdERpcnR5TWVzc2FnZWBdIDogXCJEYXRhIGhhcyBub3QgYmVlbiBjaGFuZ2VkIHNpbmNlIGl0IHdhcyBsYXN0IHNhdmVkLlwiO1xyXG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5zaG93T2theShcIk5vdGhpbmcgdG8gdXBkYXRlXCIsIG1lc3NhZ2UpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFmZy52YWxpZCkge1xyXG4gICAgICB0aGlzLmNvbXBvbmVudEVycm9ySGFuZGxlci5zaG93Rm9ybUdyb3VwRXJyb3JNZXNzYWdlKGdyb3VwLCBmZyk7XHJcbiAgICAgIGZnLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgZmcubWFya0FsbEFzVG91Y2hlZCgpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJlZm9yZVVwZGF0ZU1vZGVsKGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGlmICghZ3JvdXAuYmVmb3JlVXBkYXRlTW9kZWwpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYmVmb3JlVXBkYXRlTW9kZWwgaXMgdW5kZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmJlZm9yZVVwZGF0ZU1vZGVsKGdyb3VwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmVmb3JlRGVsZXRlTW9kZWwoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgaWYgKCFncm91cC5iZWZvcmVEZWxldGVNb2RlbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5iZWZvcmVVcGRhdGVNb2RlbCBpcyB1bmRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYmVmb3JlRGVsZXRlTW9kZWwoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBiZWZvcmVOZXdNb2RlbChncm91cDogWkdyb3VwKSB7XHJcbiAgICBpZiAoIWdyb3VwLmJlZm9yZU5ld01vZGVsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmJlZm9yZU5ld29kZWwgaXMgdW5kZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmJlZm9yZU5ld01vZGVsKGdyb3VwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmVmb3JlQ3JlYXRlTW9kZWwoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgaWYgKCFncm91cC5iZWZvcmVDcmVhdGVNb2RlbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5iZWZvcmVVcGRhdGVNb2RlbCBpcyB1bmRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYmVmb3JlQ3JlYXRlTW9kZWwoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgYmVmb3JlUGFnZUluaXRpYWxpc2UoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgaWYgKCFncm91cC5iZWZvcmVQYWdlSW5pdGlhbGlzZSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5iZWZvcmVQYWdlSW5pdGlhbGlzZSBpcyB1bmRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYmVmb3JlUGFnZUluaXRpYWxpc2UoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZnRlckdldE1vZGVsU3VjY2Vzcyhncm91cDogWkdyb3VwKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGlmICghZ3JvdXAuek1vZGVsLklkKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcInpNb2RlbC5JZCBpcyBub3QgZGVmaW5lZFwiLCBncm91cC56TW9kZWwpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgaWYgKCFncm91cC5hZnRlckdldE1vZGVsU3VjY2Vzcykge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5hZnRlckdldE1vZGVsU3VjY2VzcyBpcyBub3QgZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5hZnRlckdldE1vZGVsU3VjY2Vzcyhncm91cCk7XHJcbiAgfVxyXG5cclxuICBhZnRlck5ld01vZGVsKGdyb3VwOiBaR3JvdXApOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKCFncm91cC5hZnRlck5ld01vZGVsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmFmdGVyTmV3TW9kZWwgaXMgbm90IGRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYWZ0ZXJOZXdNb2RlbChncm91cCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFmdGVyQ3JlYXRlTW9kZWwoZ3JvdXA6IFpHcm91cCwgem1vZGVsOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKCFncm91cC5hZnRlckNyZWF0ZU1vZGVsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmFmdGVyQ3JlYXRlTW9kZWwgaXMgbm90IGRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYWZ0ZXJDcmVhdGVNb2RlbChncm91cCwgem1vZGVsKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWZ0ZXJVcGRhdGVNb2RlbChncm91cDogWkdyb3VwLCB6bW9kZWw6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAoIWdyb3VwLmFmdGVyVXBkYXRlTW9kZWwpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYWZ0ZXJVcGRhdGVNb2RlbCBpcyBub3QgZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5hZnRlclVwZGF0ZU1vZGVsKGdyb3VwLCB6bW9kZWwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZnRlckRlbGV0ZU1vZGVsKGdyb3VwOiBaR3JvdXAsIHptb2RlbDogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGlmICghZ3JvdXAuYWZ0ZXJEZWxldGVNb2RlbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5hZnRlckRlbGV0ZU1vZGVsIGlzIG5vdCBkZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmFmdGVyRGVsZXRlTW9kZWwoZ3JvdXAsIHptb2RlbCk7XHJcbiAgfVxyXG5cclxuICBhZnRlckNsb25lTmV3TW9kZWwoZ3JvdXA6IFpHcm91cCwgem1vZGVsOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKCFncm91cC5hZnRlckNsb25lTmV3TW9kZWwpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYWZ0ZXJDbG9uZU5ld01vZGVsIGlzIG5vdCBkZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmFmdGVyQ2xvbmVOZXdNb2RlbChncm91cCwgem1vZGVsKTtcclxuICB9XHJcblxyXG4gIGFmdGVyUGFnZUluaXRpYWxpc2UoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgaWYgKCFncm91cC5hZnRlclBhZ2VJbml0aWFsaXNlKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmFmdGVyUGFnZUluaXRpYWxpc2UgaXMgdW5kZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmFmdGVyUGFnZUluaXRpYWxpc2UoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgLy8gcHJpdmF0ZSBvbkFjdGlvbihncm91cDogWkdyb3VwKSB7XHJcbiAgLy8gICB0aGlzLmFjdGlvblNoZWV0Q3RybFxyXG4gIC8vICAgICAuY3JlYXRlKHtcclxuICAvLyAgICAgICBoZWFkZXI6IFwiQ2hvb3NlIGFuIEFjdGlvblwiLFxyXG4gIC8vICAgICAgIGJ1dHRvbnM6IGdyb3VwLnRvcFJpZ2h0QWN0aW9uQnV0dG9uXHJcbiAgLy8gICAgIH0pXHJcbiAgLy8gICAgIC50aGVuKGFjdGlvblNoZWV0RWwgPT4ge1xyXG4gIC8vICAgICAgIGFjdGlvblNoZWV0RWwucHJlc2VudCgpO1xyXG4gIC8vICAgICB9KTtcclxuICAvLyB9XHJcblxyXG4gIC8vIHNldE1vZGVsVmFsdWUocHJvcGVydHlOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIGdyb3VwOiBaR3JvdXApIHtcclxuICAvLyAgIGdyb3VwLnpNb2RlbFtwcm9wZXJ0eU5hbWVdID0gdmFsdWU7XHJcbiAgLy8gICBpZiAoZ3JvdXAuaXNMb2FkaW5nKSB7XHJcbiAgLy8gICAgIHJldHVybjtcclxuICAvLyAgIH1cclxuICAvLyAgIGNvbnN0IGZnID0gZ3JvdXAuZm9ybSBhcyBGb3JtR3JvdXA7XHJcbiAgLy8gICBpZiAoIWZnKSB7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lICwgbm8tZGVidWdnZXJcclxuICAvLyAgICAgZGVidWdnZXI7XHJcbiAgLy8gICB9XHJcbiAgLy8gICBjb25zdCBmYyA9IGZnLmNvbnRyb2xzW3Byb3BlcnR5TmFtZV07XHJcbiAgLy8gICBpZiAoIWZjKSB7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWRlYnVnZ2VyXHJcbiAgLy8gICAgIGRlYnVnZ2VyO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgZmMuc2V0VmFsdWUodmFsdWUpO1xyXG4gIC8vICAgZmMubWFya0FzRGlydHkoKTtcclxuICAvLyB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBzaG93ek1vZGFsKFxyXG4gICAgY29sRmllbGRzJDogc3RyaW5nIHwgT2JzZXJ2YWJsZTxBcnJheTxaRmllbGQ+PixcclxuICAgIHBhcmVudEdyb3VwOiBaR3JvdXAsXHJcbiAgICBmb3JtSGVhZGVyOiBzdHJpbmcsXHJcbiAgICB6TW9kZWw/OiBhbnksXHJcbiAgICByZWZlcklkPzogc3RyaW5nLFxyXG4gICAgY29tcG9uZW50U2l6ZT86IFpDb21wb25lbnRTaXplLFxyXG4gICAgc2tpcElzRGlydHlDaGVjaz86IGJvb2xlYW4sXHJcbiAgICB2YWxpZGF0ZUlzUmVxdWlyZWQ/OiBib29sZWFuXHJcbiAgKSB7XHJcbiAgICBjb25zdCBtb2RhbGNvbXBvbmVudCA9IFptb2RhbENvbXBvbmVudDtcclxuICAgIGNvbnN0IG1vZGFsbW9iaWxlY29tcG9uZW50ID0gWm1vZGFsTW9iaWxlQ29tcG9uZW50O1xyXG5cclxuICAgIGlmIChwYXJlbnRHcm91cCkge1xyXG4gICAgICAvLyBkaXNhYmxlIGlzVHJpZ2dlcmVkIGJlZm9yZSBkaXNwbGF5IHRoZSBwb3B1cC5cclxuICAgICAgcGFyZW50R3JvdXAuaXNUcmlnZ2VyZWQgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiBhd2FpdCB0aGlzLm1vZGFsU2VydmljZS5zaG93KGNvbEZpZWxkcyQsIHBhcmVudEdyb3VwLCBmb3JtSGVhZGVyLCBtb2RhbGNvbXBvbmVudCwgbW9kYWxtb2JpbGVjb21wb25lbnQsIHpNb2RlbCwgcmVmZXJJZCwgY29tcG9uZW50U2l6ZSwgc2tpcElzRGlydHlDaGVjaywgdmFsaWRhdGVJc1JlcXVpcmVkKTtcclxuICAgIC8vY29uc3QgbW9kYWwgPSBhd2FpdCB0aGlzLm1vZGFsU2VydmljZS5zaG93KCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHVibGljIGNvb2tpZVN0b3JlUG9zdChuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgLy8gZm9yIFBvc3QgdG8gQ29va2llU3RvcmVcclxuICAgIGNvbnN0IGNvb2tpZVN0b3JlVVJMID0gdGhpcy5vYXV0aEVudmlyb25tZW50VXJsICsgXCJhcGkvQ29va2llU3RvcmVzXCI7XHJcbiAgICBjb25zdCBjb29raWVTdG9yZVZhbHVlID0ge1xyXG4gICAgICAnTmFtZSc6IG5hbWUsXHJcbiAgICAgICdWYWx1ZSc6IEpTT04uc3RyaW5naWZ5KHZhbHVlKVxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlLmh0dHBQb3N0JChjb29raWVTdG9yZVVSTCwgY29va2llU3RvcmVWYWx1ZSkucGlwZShtYXAocmVzID0+IHtcclxuICAgICAgaWYgKHJlcykge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiZ3JpZCBjb25maWcgc2F2ZWQoXCIgKyByZXMuc3RhdHVzICsgXCIpOiBcIiwgcmVzKTtcclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICB9XHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY29va2llU3RvcmVHZXQobmFtZTogc3RyaW5nLCBhY2Nlc3NUb2tlbjogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGNvbnN0IGNvb2tpZVN0b3JlVVJMID0gdGhpcy5vYXV0aEVudmlyb25tZW50VXJsICsgXCJhcGkvQ29va2llU3RvcmVzLz9uYW1lPVwiICsgbmFtZTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlLmh0dHBHZXQkKGNvb2tpZVN0b3JlVVJMLCB7IGhlYWRlcnM6IGFjY2Vzc1Rva2VuIH0pLnBpcGUobWFwKHJlcyA9PiB7XHJcbiAgICAgIGlmIChyZXMpIHtcclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICB9XHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY29va2llU3RvcmVEZWxldGVNdWx0aXBsZShuYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgLy8gZm9yIFBvc3QgdG8gQ29va2llU3RvcmVcclxuICAgIGNvbnN0IGNvb2tpZVN0b3JlVVJMID0gdGhpcy5vYXV0aEVudmlyb25tZW50VXJsICsgXCJBZG1pbi9EZWxldGVNdWx0aXBsZUNvb2tpZXNcIjtcclxuICAgIGNvbnN0IGNvb2tpZVN0b3JlVmFsdWUgPSB7XHJcbiAgICAgICdjb250YWluTmFtZSc6IG5hbWVcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHRoaXMud2ViQXBpU2VydmljZS5odHRwUG9zdCQoY29va2llU3RvcmVVUkwsIGNvb2tpZVN0b3JlVmFsdWUpLnBpcGUobWFwKHJlcyA9PiB7XHJcbiAgICAgIGlmIChyZXMpIHtcclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICB9XHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2Nyb2xsVG9FbGVtZW50QnlJZChpZDogc3RyaW5nLCBiZWhhdmlvcjogJ3Ntb290aCcgfCAnYXV0bycgPSAnc21vb3RoJykge1xyXG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XHJcbiAgICBlbC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHRyYW5zbGF0aW9uUGFnZUVsZW1lbnQoZ3JvdXA6IFpHcm91cCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBjb25zdCBvYnNMaXN0ID0gbmV3IEFycmF5PE9ic2VydmFibGU8YW55Pj4oKTtcclxuICAgIGlmIChncm91cC5mb3JtSGVhZGVyKSB7XHJcbiAgICAgIG9ic0xpc3QucHVzaCh0aGlzLnRyYW5zbGF0aW9uU2VydmljZS4kdHJhbnNsYXRlU2luZ2xlSXRlbShncm91cCwgXCJmb3JtSGVhZGVyXCIpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZ3JvdXAubmF2SXRlbXMgJiYgZ3JvdXAubmF2SXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICBvYnNMaXN0LnB1c2godGhpcy50cmFuc2xhdGlvblNlcnZpY2UuJHRyYW5zbGF0ZUl0ZW1MaXN0KGdyb3VwLm5hdkl0ZW1zLCBcInRleHRcIikpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChvYnNMaXN0Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmb3JrSm9pbihvYnNMaXN0KTtcclxuICB9XHJcblxyXG4gIC8vICNyZWdpb24gREVDXHJcbiAgcHVibGljIGFzeW5jIGxvYWRDb250YWluZXJWaWV3KGVsZW1lbnRDb250YWluZXI6IGFueSwgY29udGFpbmVyUGFnZTogYW55LCBkYXRhOiBaRmllbGQsIGdyb3VwPzogWkdyb3VwKSB7XHJcbiAgICBpZiAoIWVsZW1lbnRDb250YWluZXIpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJFbGVtZW50Q29udGFpbmVyIGlzIG51bGwuXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFjb250YWluZXJQYWdlKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiQ29udGFpbmVyUGFnZSBpcyBudWxsLlwiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHZpZXdDb250YWluZXJSZWYgPSBlbGVtZW50Q29udGFpbmVyLnZpZXdDb250YWluZXJSZWY7XHJcbiAgICB2aWV3Q29udGFpbmVyUmVmLmNsZWFyKCk7XHJcblxyXG4gICAgY29uc3QgZW1iZWRkZWRncm91cCA9IG5ldyBaR3JvdXAoKTtcclxuICAgIHRoaXMuc2V0R3JvdXBGb3JEZWJ1Z2dlcihlbWJlZGRlZGdyb3VwKTtcclxuICAgIGNvbnN0IGNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPGFueT4gPSB2aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChjb250YWluZXJQYWdlKTtcclxuXHJcbiAgICBlbWJlZGRlZGdyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7IC8vIGVuYWJsZSBiYWNrIHRoZSBidXR0b24gZm9yIHRyaWdnZXJpbmcuXHJcblxyXG4gICAgLy8gT2JqZWN0LmFzc2lnbihjb21wb25lbnRSZWYuaW5zdGFuY2VbXCJncm91cFwiXSwgZ3JvdXApO1xyXG4gICAgT2JqZWN0LmFzc2lnbihjb21wb25lbnRSZWYuaW5zdGFuY2VbXCJncm91cFwiXSwgZW1iZWRkZWRncm91cCk7XHJcblxyXG4gICAgT2JqZWN0LmFzc2lnbihjb21wb25lbnRSZWYuaW5zdGFuY2VbXCJncm91cFwiXSwgeyBwYXJlbnRHcm91cDogZ3JvdXAsIGlzRW1iZWRkZWRQYWdlOiB0cnVlLCBlbGVtZW50Q29udGFpbmVyOiBlbGVtZW50Q29udGFpbmVyLCBDb250YWluZXJGb3JtQXV0b1Njcm9sbDogZGF0YS5Db250YWluZXJGb3JtQXV0b1Njcm9sbCB9KTtcclxuXHJcbiAgICAvLyB0b2RvOiBhZGQgaW4gcHJvcFxyXG4gICAgaWYgKGRhdGEgJiYgZGF0YS5Db250YWluZXJGb3JtQXV0b1Njcm9sbCkge1xyXG4gICAgICB0aGlzLnNjcm9sbFRvRW1iYmVkQ29tcG9uZW50UGFnZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNjcm9sbFRvRW1iYmVkQ29tcG9uZW50UGFnZShtaWxsaVNlY29uZHM6IG51bWJlciA9IDE1MDApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGVuZE9mR3JpZERpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZW5kLW9mLWdyaWRcIik7XHJcbiAgICBjb25zdCBlbmRPZkdyaWRQb3NpdGlvbkluZm8gPSBlbmRPZkdyaWREaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBjb25zdCB5Q29vciA9IChlbmRPZkdyaWRQb3NpdGlvbkluZm8/LnkgfHwgNjMwKSAtIDEwO1xyXG5cclxuICAgIGNvbnN0IG1haW5Jb25Db250ZW50OiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImlvbi1jb250ZW50LW1haW4tcGFnZVwiKTtcclxuICAgIHJldHVybiBtYWluSW9uQ29udGVudC5zY3JvbGxCeVBvaW50KDAsIHlDb29yLCBtaWxsaVNlY29uZHMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNjcm9sbFRvVG9wT2ZQYWdlKG1pbGxpU2Vjb25kczogbnVtYmVyID0gMTUwMCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgbWFpbklvbkNvbnRlbnQ6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaW9uLWNvbnRlbnQtbWFpbi1wYWdlXCIpO1xyXG4gICAgcmV0dXJuIG1haW5Jb25Db250ZW50LnNjcm9sbFRvUG9pbnQoMCwgMCwgbWlsbGlTZWNvbmRzKSBhcyBQcm9taXNlPHZvaWQ+O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGNsb3NlQ29udGFpbmVyVmlldyhncm91cDogWkdyb3VwKSB7XHJcbiAgICBpZiAoZ3JvdXBbYHBhcmVudEdyb3VwYF0gJiYgZ3JvdXBbYHBhcmVudEdyb3VwYF1bYGUxQ2xvc2VHcmlkQ29udGFpbmVyYF0gJiYgdHlwZW9mIGdyb3VwW2BwYXJlbnRHcm91cGBdW2BlMUNsb3NlR3JpZENvbnRhaW5lcmBdID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgZ3JvdXBbYHBhcmVudEdyb3VwYF1bYGUxQ2xvc2VHcmlkQ29udGFpbmVyYF0oZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgcHJpdmF0ZSBzZXRHcm91cEZvckRlYnVnZ2VyKGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGNvbnN0IGlzRGVidWdnaW5nID0gdGhpcy56Y29yZVNlcnZpY2UuaXNEZWJ1Z1Nlc3Npb24oKSB8fCBmYWxzZTtcclxuICAgIGlmIChpc0RlYnVnZ2luZykge1xyXG4gICAgICB0aGlzLmRlYnVnU2VydmljZS5vbkluaXREZWJ1Z2dlcihncm91cCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmVmcmVzaEdyaWQoZ3JvdXA6IFpHcm91cCkge1xyXG4gIGNvbnN0IHpncmlkQ29udHJvbCA9IGdyb3VwW1wiZ3JpZE9wdGlvbnNcIl0gYXMgWkdyaWQ7XHJcbiAgaWYgKHpncmlkQ29udHJvbCkge1xyXG4gICAgemdyaWRDb250cm9sLmdldERhdGEoKTtcclxuICB9XHJcbiAgZ3JvdXAuaXNUcmlnZ2VyZWQgPSBmYWxzZTtcclxufVxyXG4iXX0=
|
|
1104
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvc2VydmljZXMvbWFpbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtCQUErQjtBQUMvQixPQUFPLEVBQWdCLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQW1ELE1BQU0saUJBQWlCLENBQUM7QUFLbkksOEJBQThCO0FBQzlCLE9BQU8sRUFBYyxlQUFlLEVBQWdCLEVBQUUsRUFBUSxRQUFRLEVBQWlCLE1BQU0sTUFBTSxDQUFDO0FBQ3BHLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFRLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNELDJDQUEyQztBQUMzQyxPQUFPLEVBQ1EsV0FBVyxFQUFpQyxnQkFBZ0IsRUFFWixNQUFNLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUN4RyxNQUFNLGlCQUFpQixDQUFDO0FBSXpCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQzs7Ozs7Ozs7QUFHMUUsc0RBQXNEO0FBRXRELHFIQUFxSDtBQUNySCwwREFBMEQ7QUFNMUQsTUFBTSxPQUFPLFdBQVc7SUFnQnRCLFlBQ1UsTUFBYyxFQUNkLGNBQThCLEVBQzlCLFNBQTBCLEVBQzFCLGFBQTRCLEVBQzVCLFlBQTBCLEVBQzFCLFlBQTBCLEVBQzFCLFlBQTBCLEVBQzFCLGtCQUFzQyxFQUN0QyxxQkFBbUQsRUFDbkQsYUFBNEIsRUFDNUIsWUFBMEIsRUFDMUIsWUFBMEIsRUFDMUIsY0FBcUMsRUFDckMsWUFBb0MsRUFDcEMsa0JBQXNDO1FBZHRDLFdBQU0sR0FBTixNQUFNLENBQVE7UUFD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QUp2QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7QUFnekNELE1BQU0sVUFBVSxXQUFXLENBQUMsS0FBYTtJQUN2QyxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFVLENBQUM7SUFDbkQsSUFBSSxZQUFZLEVBQUU7UUFDaEIsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO0tBQ3hCO0lBQ0QsS0FBSyxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7QUFDNUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqIEFuZ3VsYXIgKioqKioqKioqKi9cclxuaW1wb3J0IHsgQ29tcG9uZW50UmVmLCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTmF2aWdhdGlvblN0YXJ0LCBOYXZpZ2F0aW9uRW5kLCBOYXZpZ2F0aW9uRXJyb3IsIFJvdXRlciwgRXZlbnQsIEFjdGl2YXRlZFJvdXRlLCBOYXZpZ2F0aW9uRXh0cmFzIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuXHJcbi8qKioqKioqKioqIElvbmljICoqKioqKioqKiovXHJcbmltcG9ydCB7IE1vZGFsQ29udHJvbGxlciwgTmF2Q29udHJvbGxlciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcclxuXHJcbi8qKioqKioqKioqIFBsdWdpbiAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBCZWhhdmlvclN1YmplY3QsIFN1YnNjcmlwdGlvbiwgb2YsIGZyb20sIGZvcmtKb2luLCBSZXBsYXlTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHRhcCwgc3dpdGNoTWFwLCB0YWtlLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG4vKioqKioqKioqKiBDb21wb25lbnQgJiBTZXJ2aWNlICoqKioqKioqKiovXHJcbmltcG9ydCB7XHJcbiAgQWxlcnRCdXR0b24sIE1FU1NBR0VUWVBFLCBNb2RhbFBhZ2VQYXJhbXMsIEFsZXJ0U2VydmljZSwgWkNvbXBvbmVudEhlbHBlcixcclxuICBDYWNoZVNlcnZpY2UsIEZpZWxkU2VydmljZSwgUmVzb3VyY2VBcGlTZXJ2aWNlLCBUcmFuc2xhdGlvblNlcnZpY2UsIFdlYkFwaVNlcnZpY2UsIFN0b3JhZ2VTZXNzaW9uU2VydmljZSxcclxuICBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIFpDb21wb25lbnRTaXplLCBaQ29yZVNlcnZpY2UsIFpGaWVsZCwgWkdyb3VwLCBEZWZhdWx0TWVzc2FnZSwgRGVmYXVsdERpYWxvZ1RpdGxlXHJcbn0gZnJvbSAnbW1oZ2xvYmFsLXpjb3JlJztcclxuaW1wb3J0IHsgTW9kYWxTZXJ2aWNlLCBNb2RhbFJlc3BvbnNlIH0gZnJvbSAnbW1oZ2xvYmFsLXptb2RhbCc7XHJcbi8vIGltcG9ydCB7IE1vZGFsU2VydmljZSB9IGZyb20gJy4uL3ptb2RhbC9tb2RhbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgWkNvbXBvbmVudERlYnVnU2VydmljZSB9IGZyb20gJy4vemNvbXBvbmVudC5kZWJ1Zy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgWm1vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi4vem1vZGFsL3ptb2RhbC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBabW9kYWxNb2JpbGVDb21wb25lbnQgfSBmcm9tICcuLi96bW9kYWwvem1vZGFsLW1vYmlsZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBaR3JpZCB9IGZyb20gJy4uL3pncmlkL3pncmlkLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENvbXBvbmVudEVycm9ySGFuZGxlclNlcnZpY2UgfSBmcm9tICcuL2NvbXBvbmVudC1lcnJvci1oYW5kbGVyLnNlcnZpY2UnO1xyXG4vLyBpbXBvcnQgeyBabW9kYWxQYWdlIH0gZnJvbSAnLi4vem1vZGFsL3ptb2RhbC5wYWdlJztcclxuXHJcbi8vIGltcG9ydCB7IFpDb21wb25lbnRIZWxwZXIsIFpDb21wb25lbnRPdXRwdXRFdmVudCwgTW9kYWxQYWdlUGFyYW1zLCBaR3JpZCB9IGZyb20gJy4uL2R5bmFtaWNmb3JtL3pjb21wb25lbnQubW9kZWwnO1xyXG4vLyBpbXBvcnQgeyBaR3JvdXAsIFpGaWVsZCB9IGZyb20gJy4uL21vZGVsL3pncm91cC5tb2RlbCc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIE1haW5TZXJ2aWNlIHtcclxuICBwcml2YXRlIGdyb3VwOiBaR3JvdXA7XHJcbiAgcHJpdmF0ZSBvYXV0aEVudmlyb25tZW50VXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBlbnZpcm9ubWVudDtcclxuICBwcml2YXRlIGJhY2tOYXZpZ2F0aW9uUGF0aDogc3RyaW5nW10gPSBbXTtcclxuICBwcml2YXRlIHJvdXRlUGFyYW06IHN0cmluZ1tdID0gW107XHJcbiAgcHJpdmF0ZSBwcmV2aW91c1JvdXRlUGFyYW06IHN0cmluZztcclxuXHJcbiAgcHJpdmF0ZSBOQVZJR0FUSU9OX1BBUkFNU19TVE9SQUdFX0tFWSA9ICdyb3V0ZVBhcmFtJztcclxuICBwcml2YXRlIFBSRVZJT1VTX1BBR0VfUk9VVEVfUEFSQU1fU1RPUkFHRV9LRVkgPSAncHJldmlvdXNQYWdlUm91dGVQYXJhbSc7XHJcbiAgcHJpdmF0ZSBCQUNLX05BVklHQVRJT05fUEFUSF9TVE9SQUdFX0tFWSA9ICdiYWNrTmF2aWdhdGlvblBhdGgnO1xyXG4gIHByaXZhdGUgTkFWSUdBVEVEX1JFTE9BRF9HUklEX1NUT1JBR0VfS0VZID0gJ25hdmlnYXRlZFJlbG9hZEdyaWQnO1xyXG4gIHByaXZhdGUgQ0xPTkVfTkVXX01PREVMX0NBQ0hFX0tFWSA9ICdjbG9uZU5ld01vZGVsJztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBzZWNyZXRLZXkgPSAnbXktc2VjcmV0LWtleSc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgcHJpdmF0ZSBtb2RhbEN0cmw6IE1vZGFsQ29udHJvbGxlcixcclxuICAgIHByaXZhdGUgbmF2Q29udHJvbGxlcjogTmF2Q29udHJvbGxlcixcclxuICAgIHByaXZhdGUgYWxlcnRTZXJ2aWNlOiBBbGVydFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNhY2hlU2VydmljZTogQ2FjaGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBmaWVsZFNlcnZpY2U6IEZpZWxkU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVzb3VyY2VBcGlTZXJ2aWNlOiBSZXNvdXJjZUFwaVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNvbXBvbmVudEVycm9ySGFuZGxlcjogQ29tcG9uZW50RXJyb3JIYW5kbGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgd2ViQXBpU2VydmljZTogV2ViQXBpU2VydmljZSxcclxuICAgIHByaXZhdGUgemNvcmVTZXJ2aWNlOiBaQ29yZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG1vZGFsU2VydmljZTogTW9kYWxTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzdG9yYWdlU2VydmljZTogU3RvcmFnZVNlc3Npb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBkZWJ1Z1NlcnZpY2U6IFpDb21wb25lbnREZWJ1Z1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRyYW5zbGF0aW9uU2VydmljZTogVHJhbnNsYXRpb25TZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICBjb25zb2xlLmxvZygnTWFpblNlcnZpY2UgY29uc3RydWN0b3InKTtcclxuICAgIHRoaXMuZW52aXJvbm1lbnQgPSB0aGlzLnpjb3JlU2VydmljZS5nZXRFbnZpcm9ubWVudCgpO1xyXG4gICAgdGhpcy5vYXV0aEVudmlyb25tZW50VXJsID0gdGhpcy5lbnZpcm9ubWVudC5lMU9hdXRoVXJsICsgJy8nO1xyXG4gICAgdGhpcy5yb3V0ZXIuZXZlbnRzLnN1YnNjcmliZSgoZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25TdGFydCkge1xyXG4gICAgICAgIC8vIFNob3cgcHJvZ3Jlc3Mgc3Bpbm5lciBvciBwcm9ncmVzcyBiYXJcclxuICAgICAgICBjb25zb2xlLmxvZyhldmVudCk7XHJcbiAgICAgICAgLy8gUmVzZXQgdGhlIHJvdXRlUGFyYW0sYmFja05hdmlnYXRpb25QYXRoIGFuZCByZWxhdGVkIHNlc3Npb25TdG9yYWdlIGN1cnJlbnQgcGFnZSBpcyBzdGFydHVwIHBhZ2VcclxuICAgICAgICBpZiAodGhpcy5nZXRTdGFydHVwUGFnZSgpID09PSBldmVudC51cmwpIHtcclxuICAgICAgICAgIHRoaXMucm91dGVQYXJhbSA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5iYWNrTmF2aWdhdGlvblBhdGggPSBbXTtcclxuICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0KHRoaXMuTkFWSUdBVElPTl9QQVJBTVNfU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KHRoaXMucm91dGVQYXJhbSkpO1xyXG4gICAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQodGhpcy5CQUNLX05BVklHQVRJT05fUEFUSF9TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkodGhpcy5iYWNrTmF2aWdhdGlvblBhdGgpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpIHtcclxuICAgICAgICAvLyBIaWRlIHByb2dyZXNzIHNwaW5uZXIgb3IgcHJvZ3Jlc3MgYmFyXHJcbiAgICAgICAgY29uc29sZS5sb2coZXZlbnQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRXJyb3IpIHtcclxuICAgICAgICAvLyBIaWRlIHByb2dyZXNzIHNwaW5uZXIgb3IgcHJvZ3Jlc3MgYmFyXHJcbiAgICAgICAgLy8gUHJlc2VudCBlcnJvciB0byB1c2VyXHJcbiAgICAgICAgY29uc29sZS5sb2coZXZlbnQuZXJyb3IpO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlTGFzdE5hdmlnYXRlUmVjb3JkKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc3RhcnRVcCgpIHtcclxuICAgIGNvbnNvbGUubG9nKCdBdCBtYWluLnNlcnZpY2UgKFN0YXJ0VXApIC4uLicpO1xyXG4gIH1cclxuXHJcbiAgc2V0R3JvdXAoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgdGhpcy5ncm91cCA9IGdyb3VwO1xyXG4gICAgdGhpcy5maWVsZFNlcnZpY2Uuc2V0R3JvdXAoZ3JvdXApO1xyXG4gICAgdGhpcy5yZXNvdXJjZUFwaVNlcnZpY2Uuc2V0R3JvdXAoZ3JvdXApO1xyXG4gICAgdGhpcy53ZWJBcGlTZXJ2aWNlLnNldEdyb3VwKGdyb3VwKTtcclxuICAgIHRoaXMuc2V0R3JvdXBGb3JEZWJ1Z2dlcihncm91cCk7XHJcbiAgfVxyXG5cclxuICBnZXRSZXNvdXJjZVNlcnZlckRhdGEoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZUFwaVNlcnZpY2UubG9hZERhdGEoKTtcclxuICB9XHJcblxyXG4gIGdldEdyb3VwRmllbGRzKFxyXG4gICAgY3RybE5hbWU6IHN0cmluZyxcclxuICAgIGZvcm1UeXBlOiBcIkxpc3RGaWVsZFwiIHwgXCJGb3JtRmllbGRcIixcclxuICAgIGdyb3VwOiBaR3JvdXAsXHJcbiAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZ1xyXG4gICkge1xyXG4gICAgcmV0dXJuIHRoaXMuZmllbGRTZXJ2aWNlLmdldEZvcm1GaWVsZENvZGUoXHJcbiAgICAgIGN0cmxOYW1lLFxyXG4gICAgICBmb3JtVHlwZSxcclxuICAgICAgZ3JvdXAsXHJcbiAgICAgIHByb3BlcnR5TmFtZVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGluaXRpYWxpemVHcm91cChcclxuICAgIGdyb3VwOiBaR3JvdXAsXHJcbiAgICBjdHJsTmFtZTogc3RyaW5nLFxyXG4gICAgcGFnZU5hbWU6IHN0cmluZyxcclxuICAgIG1lOiBhbnlcclxuICApOiBTdWJzY3JpcHRpb24ge1xyXG4gICAgaWYgKG1lLnN1YnNjcmlwdGlvbikge1xyXG4gICAgICBtZS5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHJlc291cmNlTmFtZSA9IGdyb3VwLnJlc291cmNlVVJMTmFtZSB8fCBjdHJsTmFtZTtcclxuICAgIGdyb3VwLnJlc291cmNlVVJMTmFtZSA9IHJlc291cmNlTmFtZTtcclxuXHJcbiAgICBPYmplY3QuYXNzaWduKGdyb3VwLCB7XHJcbiAgICAgIHJlc291cmNlVVJMOiB0aGlzLnJlc291cmNlQXBpU2VydmljZS5nZXRVUkwocmVzb3VyY2VOYW1lKSxcclxuICAgICAgZ3JpZENvbHVtbkZpZWxkczogdGhpcy5maWVsZFNlcnZpY2UuZ2V0Rm9ybUZpZWxkQ29kZShcclxuICAgICAgICBjdHJsTmFtZSxcclxuICAgICAgICBcIkZvcm1GaWVsZFwiLFxyXG4gICAgICAgIG51bGwsXHJcbiAgICAgICAgbnVsbFxyXG4gICAgICApLFxyXG4gICAgICBjdHJsU2NvcGU6IG1lLFxyXG4gICAgICBwYWdlTmFtZSxcclxuICAgICAgY3RybE5hbWUsXHJcbiAgICAgIC8vIGNyZWF0ZU1vZGVsVVJMOiBcIi9jcmVhdGVcIiArIGN0cmxOYW1lLnRvTG93ZXJDYXNlKCksXHJcbiAgICAgIGVkaXRNb2RlbFVSTDogY3RybE5hbWUudG9Mb3dlckNhc2UoKSxcclxuICAgICAgLy8gbGlzdE1vZGVsVVJMOiBcIi9saXN0XCIgKyBjdHJsTmFtZS50b0xvd2VyQ2FzZSgpLFxyXG4gICAgICAvLyBmb3JtSGVhZGVyOiBcIi4uLlwiLFxyXG4gICAgICBpc0xvYWRpbmc6IHRydWUsXHJcbiAgICAgIGZpZWxkczogW10sXHJcbiAgICAgIHpNb2RlbDoge30sXHJcbiAgICAgIHpDb21wb25lbnRzOiB7fSxcclxuICAgICAgekRhdGE6IHt9LFxyXG4gICAgICBzdWJqZWN0OiBuZXcgQmVoYXZpb3JTdWJqZWN0PFpDb21wb25lbnRPdXRwdXRFdmVudD4obnVsbCksXHJcbiAgICAgIC8vIGZvcm06IG51bGwgYXMgRm9ybUdyb3VwLCAvLyByZW1vdmVkIGZvciBidWcgZml4LlxyXG4gICAgICBjYW5jZWxCdXR0b25OYW1lOiBcIkNsb3NlXCIsXHJcbiAgICAgIHpCdXR0b25zQ291bnQ6IDAsXHJcbiAgICAgIC8vIHRvcFJpZ2h0QWN0aW9uQnV0dG9uOiBbXSxcclxuICAgICAgLy8gb25BY3Rpb246IHRoaXMub25BY3Rpb24uYmluZCh0aGlzKSxcclxuICAgICAgYmFja05hdmlnYXRpb246IHRoaXMuYmFja05hdmlnYXRpb24uYmluZCh0aGlzKSxcclxuICAgICAgaGlzdG9yeUJhY2s6IHRoaXMuaGlzdG9yeUJhY2suYmluZCh0aGlzKSxcclxuICAgICAgcmVmcmVzaFBhZ2U6IHRoaXMucmVmcmVzaFBhZ2UuYmluZCh0aGlzKSxcclxuICAgICAgcmVmcmVzaEdyaWQ6IHRoaXMucmVmcmVzaEdyaWQuYmluZCh0aGlzKSxcclxuICAgICAgdXBkYXRlTW9kZWw6IHRoaXMudXBkYXRlTW9kZWwuYmluZCh0aGlzKSxcclxuICAgICAgY3JlYXRlTW9kZWw6IHRoaXMuY3JlYXRlTW9kZWwuYmluZCh0aGlzKSxcclxuICAgICAgY2xvbmVOZXdNb2RlbDogdGhpcy5jbG9uZU5ld01vZGVsLmJpbmQodGhpcyksXHJcbiAgICAgIGRlbGV0ZU1vZGVsOiB0aGlzLmRlbGV0ZU1vZGVsLmJpbmQodGhpcyksXHJcbiAgICAgIG5ld01vZGVsOiB0aGlzLm5ld01vZGVsLmJpbmQodGhpcyksXHJcbiAgICAgIC8vIHVwZGF0ZUVkaXRNb2RlOiB0aGlzLnVwZGF0ZUVkaXRNb2RlLmJpbmQodGhpcyksXHJcbiAgICAgIC8vIF9pc0RlYnVnZ2luZzogZW52aXJvbm1lbnQuZGVidWdTZXNzaW9uIHx8IGZhbHNlLFxyXG4gICAgICAvLyBfZGVidWc6IHtcclxuICAgICAgLy8gICB6RGF0YTogIHsgY29sbGVjdGVkQWN0aXZpdGllczogW10sIGFjdGl2aXR5Q291bnQ6IDAgfVxyXG4gICAgICAvLyB9XHJcbiAgICAgIC8vIGFmdGVyR2V0TW9kZWxTdWNjZXNzOiBudWxsLFxyXG4gICAgICAvLyBiZWZvcmVVcGRhdGVNb2RlbDogbnVsbCxcclxuICAgICAgLy8gaXNFZGl0OiBmYWxzZVxyXG4gICAgfSk7XHJcblxyXG4gICAgbWUuc3Vic2NyaXB0aW9uID0gZ3JvdXAuc3ViamVjdC5zdWJzY3JpYmUoKGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQpID0+XHJcbiAgICAgIHRoaXMuc3ViamVjdEV2ZW50KGV2ZW50LCBncm91cCwgbWUpXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiBtZS5zdWJzY3JpcHRpb247XHJcbiAgfVxyXG5cclxuICBnZXRNb2RlbCQoZ3JvdXA6IFpHcm91cCwgaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBjb25zdCByZWNJZCA9IGlkIHx8IGdyb3VwLnJlZmVyZW5jZUlkO1xyXG4gICAgcmV0dXJuIHRoaXMud2ViQXBpU2VydmljZVxyXG4gICAgICAuaHR0cEdldCQoZ3JvdXAucmVzb3VyY2VVUkwgKyBcIi9cIiArIHJlY0lkLCBudWxsKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YXAoKHptb2RlbCkgPT4ge1xyXG4gICAgICAgICAgZ3JvdXAuek1vZGVsID0gem1vZGVsO1xyXG4gICAgICAgICAgLy9pZiAoXHJcbiAgICAgICAgICAvLyAgZ3JvdXAucGFyZW50UmVmZXJlbmNlRmllbGQgJiZcclxuICAgICAgICAgIC8vICBPYmplY3Qua2V5cyh6bW9kZWwpLmluZGV4T2YoZ3JvdXAucGFyZW50UmVmZXJlbmNlRmllbGQpICE9PSAtMSAmJlxyXG4gICAgICAgICAgLy8gICFncm91cC5iYWNrTmF2aWdhdGlvblBhZ2UuZW5kc1dpdGgoXCIuZWRpdFwiKVxyXG4gICAgICAgICAgLy8pIHtcclxuICAgICAgICAgIC8vICBncm91cC5iYWNrTmF2aWdhdGlvblBhZ2UgPVxyXG4gICAgICAgICAgLy8gICAgZ3JvdXAuYmFja05hdmlnYXRpb25QYWdlICtcclxuICAgICAgICAgIC8vICAgIFwiL1wiICtcclxuICAgICAgICAgIC8vICAgIHptb2RlbFtncm91cC5wYXJlbnRSZWZlcmVuY2VGaWVsZF0udG9TdHJpbmcoKSArXHJcbiAgICAgICAgICAvLyAgICBcIi9lZGl0XCI7XHJcbiAgICAgICAgICAvL31cclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKGdyb3VwLmFmdGVyR2V0TW9kZWxTdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFmdGVyR2V0TW9kZWxTdWNjZXNzKGdyb3VwKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBvZihbXSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIGNhbkV4aXQoZm9ybTogRm9ybUdyb3VwKTogYm9vbGVhbiB8IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKCFmb3JtIHx8ICFmb3JtLmRpcnR5KSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChmb3JtWydza2lwRGlydHlDaGVjayddKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmFsZXJ0U2VydmljZVxyXG4gICAgICAuc2hvdyhcIkRhdGEgbm90IHNhdmUgeWV0XCIsIFwiQXJlIHlvdSBzdXJlIHdhbnQgdG8gZGlzY2FyZCB0aGUgY2hhbmdlcz9cIiwgW1xyXG4gICAgICAgIFwiQ2FuY2VsXCIsXHJcbiAgICAgICAgXCJEaXNjYXJkIENoYW5nZXNcIixcclxuICAgICAgXSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKChyZXBseSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcGx5ID09PSBcIkRpc2NhcmQgQ2hhbmdlc1wiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvZih0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBvZihmYWxzZSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIC8vIGNvbnN0IHJlcGx5U3ViID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuICAgIC8vIHRoaXMuYWxlcnRDdHJsXHJcbiAgICAvLyAgIC5jcmVhdGUoe1xyXG4gICAgLy8gICAgIGhlYWRlcjogXCJEYXRhIG5vdCBzYXZlIHlldFwiLFxyXG4gICAgLy8gICAgIC8vIHN1YkhlYWRlcjogJ1N1YkhlYWRlciBzdGF0ZW1lbnQgaGVyZScsXHJcbiAgICAvLyAgICAgbWVzc2FnZTogXCJBcmUgeW91IHN1cmUgd2FudCB0byBkaXNjYXJkIHRoZSBjaGFuZ2VzP1wiLFxyXG4gICAgLy8gICAgIGJ1dHRvbnM6IFtcclxuICAgIC8vICAgICAgIHtcclxuICAgIC8vICAgICAgICAgdGV4dDogXCJDYW5jZWxcIixcclxuICAgIC8vICAgICAgICAgcm9sZTogXCJjYW5jZWxcIixcclxuICAgIC8vICAgICAgICAgY3NzQ2xhc3M6IFwic2Vjb25kYXJ5XCIsXHJcbiAgICAvLyAgICAgICAgIGhhbmRsZXI6ICgpID0+IHtcclxuICAgIC8vICAgICAgICAgICByZXBseVN1Yi5uZXh0KGZhbHNlKTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgfSxcclxuICAgIC8vICAgICAgIHtcclxuICAgIC8vICAgICAgICAgdGV4dDogXCJEaXNjYXJkIENoYW5nZXNcIixcclxuICAgIC8vICAgICAgICAgY3NzQ2xhc3M6IFwid2FybmluZ1wiLFxyXG4gICAgLy8gICAgICAgICBoYW5kbGVyOiAoKSA9PiB7XHJcbiAgICAvLyAgICAgICAgICAgcmVwbHlTdWIubmV4dCh0cnVlKTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgfVxyXG4gICAgLy8gICAgIF1cclxuICAgIC8vICAgfSlcclxuICAgIC8vICAgLnRoZW4oYWxlcnRFbGVtZW50ID0+IHtcclxuICAgIC8vICAgICBhbGVydEVsZW1lbnQucHJlc2VudCgpO1xyXG4gICAgLy8gICB9KTtcclxuICAgIC8vIHJldHVybiByZXBseVN1Yi5hc09ic2VydmFibGUoKS5waXBlKHRha2UoMSkpO1xyXG4gIH1cclxuXHJcbiAgLy8gYXN5bmMgb3Blbk1vZGFsRm9ybShtb2RhbFBhcmFtczogTW9kYWxQYWdlUGFyYW1zKSB7XHJcbiAgLy8gICAvLyBjb25zb2xlLmxvZyhcIm9wZW5Nb2RhbEZvcm1cIik7XHJcbiAgLy8gICBjb25zb2xlLmVycm9yKFxyXG4gIC8vICAgICBcIlBsZWFzZSB1c2UgTW9kYWxTZXJ2aWNlLnNob3cgaW5zdGVhZCBvZiBNYWluU2VydmljZS5vcGVuTW9kYWxGb3JtIVwiXHJcbiAgLy8gICApO1xyXG4gIC8vICAgLy8gY29uc3QgbW9kYWwgPSB0aGlzLm1vZGFsU2VydmljZS5zaG93KG1vZGFsUGFyYW1zLmNvbEZpZWxkcyQgfHwgbW9kYWxQYXJhbXMuY29udHJvbGxlck5hbWUsIG1vZGFsUGFyYW1zLnBhcmVudEdyb3VwLFxyXG4gIC8vICAgLy8gICBtb2RhbFBhcmFtcy5mb3JtSGVhZGVyLCBtb2RhbFBhcmFtcy56TW9kZWwsIG1vZGFsUGFyYW1zLnJlZmVySWQpO1xyXG4gIC8vICAgY29uc3QgbW9kYWwgPSBhd2FpdCB0aGlzLm1vZGFsQ3RybC5jcmVhdGUoe1xyXG4gIC8vICAgICBjb21wb25lbnQ6IFptb2RhbFBhZ2UsXHJcbiAgLy8gICAgIGJhY2tkcm9wRGlzbWlzczogdHJ1ZSxcclxuICAvLyAgICAgY29tcG9uZW50UHJvcHM6IHtcclxuICAvLyAgICAgICBtb2RhbFBhcmFtcyxcclxuICAvLyAgICAgfSxcclxuICAvLyAgIH0pO1xyXG4gIC8vICAgbW9kYWwucHJlc2VudCgpO1xyXG4gIC8vICAgcmV0dXJuIG1vZGFsO1xyXG4gIC8vICAgLy8gLm9uV2lsbERpc21pc3MoKHptb2RlbDogYW55KSA9PiB7XHJcbiAgLy8gICAvLyAgIHRoaXMuXHJcbiAgLy8gICAvLyB9KTtcclxuICAvLyB9XHJcblxyXG4gIGNsb3NlTW9kYWxGb3JtKGdyb3VwPzogWkdyb3VwKSB7XHJcbiAgICBpZiAoZ3JvdXAgJiYgZ3JvdXAuc3ViamVjdCkge1xyXG4gICAgICBncm91cC5zdWJqZWN0Lm5leHQoe1xyXG4gICAgICAgIHR5cGU6IFwiTW9kYWxTZXJ2aWNlLmNsb3NlXCIsXHJcbiAgICAgICAgdGFyZ2V0OiBcIm1vZGFsR3JvdXAubW9kYWxDYW5jZWwoKVwiXHJcbiAgICAgIH0gYXMgWkNvbXBvbmVudE91dHB1dEV2ZW50KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLm1vZGFsQ3RybC5kaXNtaXNzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdWJqZWN0RXZlbnQoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCwgbWU6IGFueSkge1xyXG4gICAgaWYgKCFldmVudCB8fCAhZXZlbnQudGFyZ2V0IHx8IGV2ZW50LnRhcmdldC5zdGFydHNXaXRoKFwibW9kYWxHcm91cC5cIikpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc29sZS5sb2coXCI+PiBTdWJqZWN0RXZlbnRcIiwgZXZlbnQpO1xyXG4gICAgbGV0IGNhbGxGdW5jO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGNhbGxGdW5jID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cEV2YWxWYWx1ZS5jYWxsKFxyXG4gICAgICAgIGdyb3VwLmN0cmxTY29wZSxcclxuICAgICAgICBldmVudC50YXJnZXQsXHJcbiAgICAgICAgZ3JvdXBcclxuICAgICAgKTtcclxuICAgICAgLy8gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKGV2ZW50LlRhcmdldCwgZ3JvdXApO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgIFwiRXJyb3Igd2hlbiBnZXRHcm91cFZhbHVlOiBcIixcclxuICAgICAgICBldmVudC50YXJnZXQsXHJcbiAgICAgICAgXCIgPiBFcnJvcjogXCIsXHJcbiAgICAgICAgZXJyb3JcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjYWxsRnVuYyhldmVudCk7XHJcbiAgICBpZiAodHlwZW9mIGNhbGxGdW5jID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgY29uc3QgbmV3RnVuYyA9IGNhbGxGdW5jLmJpbmQobWUpO1xyXG4gICAgICBuZXdGdW5jKGV2ZW50LCBncm91cCwgbWUpO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgY2FsbEZ1bmMgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgaWYgKGV2ZW50LnR5cGUuZW5kc1dpdGgoXCJvbk5hdmlnYXRlVG9cIikpIHtcclxuICAgICAgICBjb25zdCBuVXJsID0gZXZlbnQudGFyZ2V0LnJlcGxhY2UoXCIvOmlkXCIsIFwiL1wiICsgZXZlbnQuZGF0YSk7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW25VcmxdKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChldmVudC50eXBlID09PSBcInpncmlkLWNlbGxDbGlja1wiKSB7XHJcbiAgICAgICAgLy8gKGNhbGxGdW5jLnN0YXJ0c1dpdGgoJ2VkaXQnKSkgeyAgemdyaWQtY2VsbENsaWNrXHJcbiAgICAgICAgY29uc3QgY05hbWUgPSBjYWxsRnVuYy5zbGljZSg0KTtcclxuICAgICAgICAvLyAvLyBkZWJ1Z2dlcjtcclxuICAgICAgICAvLyBjb25zdCBtb2RhbEdyb3VwUGFyYW06IE1vZGFsUGFnZVBhcmFtcyA9IHt9O1xyXG4gICAgICAgIC8vIG1vZGFsR3JvdXBQYXJhbS5jb250cm9sbGVyTmFtZSA9IGNOYW1lO1xyXG4gICAgICAgIC8vIG1vZGFsR3JvdXBQYXJhbS5yZWZlcklkID0gZXZlbnQuZGF0YS5JZDtcclxuICAgICAgICAvLyBtb2RhbEdyb3VwUGFyYW0uY29sRmllbGRzJCA9IGV2ZW50LmNvbHVtbkZpZWxkcyQ7XHJcbiAgICAgICAgLy8gbW9kYWxHcm91cFBhcmFtLnBhcmVudEdyb3VwID0gbWUuZ3JvdXA7XHJcblxyXG4gICAgICAgIC8vIHRoaXMub3Blbk1vZGFsRm9ybShtb2RhbEdyb3VwUGFyYW0pO1xyXG4gICAgICAgIHRoaXMubW9kYWxTZXJ2aWNlLnNob3coXHJcbiAgICAgICAgICBldmVudC5jb2x1bW5GaWVsZHMkIHx8IGNOYW1lLFxyXG4gICAgICAgICAgZ3JvdXAsXHJcbiAgICAgICAgICBcIlwiLFxyXG4gICAgICAgICAge30sXHJcbiAgICAgICAgICBldmVudC5kYXRhLklkXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgY2FsbEZ1bmMgPT09IFwib2JqZWN0XCIpIHtcclxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IFwiemdyaWQtY2VsbENsaWNrXCIpIHtcclxuICAgICAgICBpZiAoY2FsbEZ1bmMubmF2aWdhdGVVcmwpIHtcclxuICAgICAgICAgIGNvbnN0IHVybCA9IGNhbGxGdW5jLm5hdmlnYXRlVXJsLnJlcGxhY2UoXCI6aWRcIiwgZXZlbnQuZGF0YS5JZCk7XHJcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdXJsXSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBtb2RhbEdyb3VwUGFyYW06IE1vZGFsUGFnZVBhcmFtcyA9IHt9O1xyXG4gICAgICAgIG1vZGFsR3JvdXBQYXJhbS5jb250cm9sbGVyTmFtZSA9IGNhbGxGdW5jLmN0cmxOYW1lO1xyXG4gICAgICAgIG1vZGFsR3JvdXBQYXJhbS5yZWZlcklkID0gZXZlbnQuZGF0YS5JZDtcclxuICAgICAgICBtb2RhbEdyb3VwUGFyYW0uY29sRmllbGRzJCA9IGV2ZW50LmNvbHVtbkZpZWxkcyQ7XHJcbiAgICAgICAgbW9kYWxHcm91cFBhcmFtLnBhcmVudEdyb3VwID0gbWUuZ3JvdXA7XHJcbiAgICAgICAgbW9kYWxHcm91cFBhcmFtLmZvcm1IZWFkZXIgPSBjYWxsRnVuYy5mb3JtSGVhZGVyO1xyXG5cclxuICAgICAgICBpZiAoY2FsbEZ1bmMuZm9ybUhlYWRlcikge1xyXG4gICAgICAgICAgLy8gdGhpcy5vcGVuTW9kYWxGb3JtKG1vZGFsR3JvdXBQYXJhbSk7XHJcbiAgICAgICAgICB0aGlzLm1vZGFsU2VydmljZS5zaG93KFxyXG4gICAgICAgICAgICBldmVudC5jb2x1bW5GaWVsZHMkIHx8IGNhbGxGdW5jLmN0cmxOYW1lLFxyXG4gICAgICAgICAgICBncm91cCxcclxuICAgICAgICAgICAgY2FsbEZ1bmMuZm9ybUhlYWRlcixcclxuICAgICAgICAgICAge30sXHJcbiAgICAgICAgICAgIGV2ZW50LmRhdGEuSWRcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICAgIFwiSW52YWxpZCBjYWxsRnVuYyB0eXBlOiBcIixcclxuICAgICAgICAgIGNhbGxGdW5jLFxyXG4gICAgICAgICAgXCIgZXZlbnQuVGFyZ2V0OiBcIixcclxuICAgICAgICAgIGV2ZW50LnRhcmdldFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gdGhpcy5vcGVuTW9kYWxGb3JtQnlDb21wb25lbnQoY2FsbEZ1bmMudHlwZSwgZXZlbnQuRGF0YS5JZCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgXCJGdW5jdGlvbiBub3QgZGVmaW5lZCBpbiBncm91cCBmb3I6IFwiLFxyXG4gICAgICAgIGV2ZW50LnRhcmdldCxcclxuICAgICAgICBcIiwgRXZlbnQ6IFwiLFxyXG4gICAgICAgIGV2ZW50XHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVTdWNjZXNzKHJlczogUmVzcG9uc2UgfCBhbnksIHN1Y2Nlc3NNc2c6IHN0cmluZyk6IFJlc3BvbnNlIHtcclxuICAgIGlmICh0aGlzLmdyb3VwKSB7XHJcbiAgICAgIHRoaXMudHJ5VXBkYXRlR3JvdXBUcmlnZ2VyKGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVzICYmIHJlcy5Qcm9jZXNzaW5nU3RhdHVzKSB7XHJcbiAgICAgIGlmICh0aGlzLmdyb3VwPy5kaXNhYmxlU3VjY2Vzc0NyZWF0ZU1zZyB8fCB0aGlzLmdyb3VwPy5kaXNhYmxlU3VjY2Vzc1VwZGF0ZU1zZyB8fCB0aGlzLmdyb3VwPy5kaXNhYmxlU3VjY2Vzc0RlbGV0ZU1zZykge1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHNldCBzZXNzaW9uc3RvcmFnZSB0byB0cmlnZ2VyIHVwZGF0ZSB1cG9uIGNyZWF0ZWRcclxuXHJcbiAgICAgIC8vIEFsZXJ0IHVzZXIgdXBkYXRlL3NhdmUgc3VjY2Vzc1xyXG4gICAgICB0aGlzLndlYkFwaVNlcnZpY2Uuc2hvd0h0dHBSZXNwb25zZU1lc3NhZ2UoTUVTU0FHRVRZUEUuU3VjY2Vzcywgc3VjY2Vzc01zZywgbnVsbCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0cnlVcGRhdGVHcm91cFRyaWdnZXIodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIGlmICh0aGlzLmdyb3VwKSB7XHJcbiAgICAgIHRoaXMuZ3JvdXAuaXNUcmlnZ2VyZWQgPSB2YWx1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZUVycm9yKHJlczogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHRoaXMudHJ5VXBkYXRlR3JvdXBUcmlnZ2VyKGZhbHNlKTtcclxuICAgIHJldHVybiB0aGlzLndlYkFwaVNlcnZpY2UuaGFuZGxlRXJyb3IocmVzKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByb3V0ZU5hdmlnYXRlKHBhZ2VOYW1lOiBzdHJpbmcsIHBhZ2VQYXJhbXM6IHN0cmluZ1tdLCByb3V0ZVJlbGF0aXZlOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgdGhpcy5zZXROYXZpZ2F0aW9uUGFyYW1zKHBhZ2VQYXJhbXMpO1xyXG4gICAgY29uc3Qgc25hcHNob3RVcmwgPSB0aGlzLmFjdGl2YXRlZFJvdXRlWydfcm91dGVyU3RhdGUnXS5zbmFwc2hvdC51cmwuc3BsaXQoJz8nKVswXTtcclxuICAgIGNvbnN0IHBhZ2VVcmwgPSByb3V0ZVJlbGF0aXZlID8gc25hcHNob3RVcmwgKyAnLycgKyBwYWdlTmFtZSA6IHBhZ2VOYW1lO1xyXG5cclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtwYWdlVXJsXSwgeyByZXBsYWNlVXJsOiB0cnVlIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldE5hdmlnYXRpb25QYXJhbXModXJsUGFyYW1zOiBzdHJpbmdbXSkge1xyXG4gICAgLy8gSWYgaXQgaXMgbnVsbCBvciB1bmRlZmluZWRcclxuICAgIGlmICghdGhpcy5iYWNrTmF2aWdhdGlvblBhdGgpIHtcclxuICAgICAgdGhpcy5iYWNrTmF2aWdhdGlvblBhdGggPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuaXNWYWx1ZUluTGFzdEVsZW1lbnQodGhpcy5iYWNrTmF2aWdhdGlvblBhdGgsIHRoaXMucm91dGVyLnVybCkpIHtcclxuICAgICAgdGhpcy5iYWNrTmF2aWdhdGlvblBhdGgucHVzaCh0aGlzLnJvdXRlci51cmwpO1xyXG4gICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldCh0aGlzLkJBQ0tfTkFWSUdBVElPTl9QQVRIX1NUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeSh0aGlzLmJhY2tOYXZpZ2F0aW9uUGF0aCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2V0Um91dGVQYXJhbSh1cmxQYXJhbXMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFJvdXRlUGFyYW0ocm91dGVQYXJhbXM6IHN0cmluZ1tdKSB7XHJcbiAgICAvLyBJZiBpdCBpcyBudWxsIG9yIHVuZGVmaW5lZFxyXG4gICAgaWYgKCF0aGlzLnJvdXRlUGFyYW0pIHtcclxuICAgICAgdGhpcy5yb3V0ZVBhcmFtID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRmlsdGVyIG91dCBhbnkgZW1wdHkgc3RyaW5nIHJvdXRlIHBhcmFtcyBhbmQgam9pbiB0aGVtIGludG8gYSBzaW5nbGUgc3RyaW5nXHJcbiAgICBjb25zdCBuZXdSb3V0ZVBhcmFtID0gJy8nICsgT2JqZWN0LnZhbHVlcyhyb3V0ZVBhcmFtcykuZmlsdGVyKGVsID0+IGVsICE9PSAnJykuam9pbignLycpO1xyXG5cclxuICAgIGlmICghdGhpcy5pc1ZhbHVlSW5MYXN0RWxlbWVudCh0aGlzLnJvdXRlUGFyYW0sIG5ld1JvdXRlUGFyYW0pKSB7XHJcbiAgICAgIGlmIChyb3V0ZVBhcmFtcykge1xyXG4gICAgICAgIC8vIENhcHR1cmUgdGhlIHByZXZpb3VzIHBhZ2UncyByb3V0ZSBwYXJhbSB0byBiZSB1c2VkIGZvciBiYWNrbmF2aWdhdGlvbiBjaGVja2luZ1xyXG4gICAgICAgIHRoaXMucHJldmlvdXNSb3V0ZVBhcmFtID0gdGhpcy5yb3V0ZVBhcmFtW3RoaXMucm91dGVQYXJhbS5sZW5ndGggLSAxXTtcclxuXHJcbiAgICAgICAgLy8gSWYgdGhlIHByZXZpb3VzIHJvdXRlIHBhcmFtIGV4aXN0cywgY2hlY2sgaWYgdGhlIGxhc3Qgc2VnbWVudCBpcyAnbmV3JyBvciAndXBkYXRlJ1xyXG4gICAgICAgIGlmICh0aGlzLnByZXZpb3VzUm91dGVQYXJhbSkge1xyXG4gICAgICAgICAgY29uc3QgcGFyYW1TZWdtZW50ID0gdGhpcy5wcmV2aW91c1JvdXRlUGFyYW0uc3BsaXQoXCIvXCIpO1xyXG4gICAgICAgICAgY29uc3QgYWN0aW9uU2VnbWVudCA9IHBhcmFtU2VnbWVudFtwYXJhbVNlZ21lbnQubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAvLyBJZiB0aGUgbGFzdCBzZWdtZW50IGlzICduZXcnIG9yICd1cGRhdGUnLCBzdG9yZSB0aGUgcHJldmlvdXMgcm91dGUgcGFyYW0gaW4gc2Vzc2lvbiBzdG9yYWdlXHJcbiAgICAgICAgICBpZiAoYWN0aW9uU2VnbWVudCA9PT0gJ25ldycgfHwgYWN0aW9uU2VnbWVudCA9PT0gJ2VkaXQnIHx8IGFjdGlvblNlZ21lbnQgPT09ICd1cGRhdGUnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0KHRoaXMuUFJFVklPVVNfUEFHRV9ST1VURV9QQVJBTV9TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkodGhpcy5wcmV2aW91c1JvdXRlUGFyYW0pKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEFkZCB0aGUgbmV3IHJvdXRlIHBhcmFtIHRvIHRoZSByb3V0ZVBhcmFtIGFycmF5IGFuZCBzdG9yZSBpdCBpbiBzZXNzaW9uIHN0b3JhZ2VcclxuICAgICAgICB0aGlzLnJvdXRlUGFyYW0ucHVzaChuZXdSb3V0ZVBhcmFtKTtcclxuICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldCh0aGlzLk5BVklHQVRJT05fUEFSQU1TX1NUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeSh0aGlzLnJvdXRlUGFyYW0pKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc1ZhbHVlSW5MYXN0RWxlbWVudChhcnJheTogYW55W10sIHRhcmdldFZhbHVlOiBhbnkpIHtcclxuICAgIGlmIChhcnJheVthcnJheS5sZW5ndGggLSAxXSA9PT0gdGFyZ2V0VmFsdWUpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldE5hdmlnYXRpb25QYXJhbXMoKTogYW55W10ge1xyXG4gICAgdGhpcy5yb3V0ZVBhcmFtID0gdGhpcy5yb3V0ZVBhcmFtIHx8IFtdO1xyXG5cclxuICAgIGlmICh0aGlzLnJvdXRlUGFyYW0ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIGNvbnN0IHN0b3JlZFBhcmFtcyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5OQVZJR0FUSU9OX1BBUkFNU19TVE9SQUdFX0tFWSk7XHJcbiAgICAgIGlmIChzdG9yZWRQYXJhbXMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgdGhpcy5yb3V0ZVBhcmFtID0gSlNPTi5wYXJzZShzdG9yZWRQYXJhbXMpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIHN0b3JlZCByb3V0ZVBhcmFtOicsIGVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBjb25zb2xlLmxvZygnTm8gc3RvcmVkIG5hdmlnYXRpb24gcGFyYW1zIGZvdW5kLicpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLnJvdXRlUGFyYW07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0TmF2aWdhdGlvblBhcmVudFBhcmFtKCk6IGFueSB7XHJcbiAgICBjb25zdCBuYXZpZ2F0aW9uUGFyZW50UGFyYW1zID0gdGhpcy5nZXROYXZpZ2F0aW9uUGFyYW1zKCk7XHJcblxyXG4gICAgaWYgKG5hdmlnYXRpb25QYXJlbnRQYXJhbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICByZXR1cm4gbmF2aWdhdGlvblBhcmVudFBhcmFtc1tuYXZpZ2F0aW9uUGFyZW50UGFyYW1zLmxlbmd0aCAtIDJdO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnNvbGUud2FybignTmF2aWdhdGlvbiBwYXJlbnQgcGFyYW1zIG5vdCBmb3VuZC4nKTtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldE5hdmlnYXRpb25DdXJyZW50UGFyYW0oKTogYW55IHtcclxuICAgIGNvbnN0IG5hdmlnYXRpb25DdXJyZW50UGFyYW1zID0gdGhpcy5nZXROYXZpZ2F0aW9uUGFyYW1zKCk7XHJcblxyXG4gICAgaWYgKG5hdmlnYXRpb25DdXJyZW50UGFyYW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgcmV0dXJuIG5hdmlnYXRpb25DdXJyZW50UGFyYW1zW25hdmlnYXRpb25DdXJyZW50UGFyYW1zLmxlbmd0aCAtIDFdO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnNvbGUud2FybignTmF2aWdhdGlvbiBjdXJyZW50IHBhcmFtcyBub3QgZm91bmQuJyk7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0UHJldmlvdXNQYWdlUm91dGVQYXJhbSgpOiBhbnkge1xyXG4gICAgaWYgKHRoaXMucHJldmlvdXNSb3V0ZVBhcmFtICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgLy8gUmV0dXJuIHRoZSBjYWNoZWQgdmFsdWUgaWYgaXQgZXhpc3RzXHJcbiAgICAgIHJldHVybiB0aGlzLnByZXZpb3VzUm91dGVQYXJhbTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBwcmV2aW91c1JvdXRlUGFyYW1TdHIgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuUFJFVklPVVNfUEFHRV9ST1VURV9QQVJBTV9TVE9SQUdFX0tFWSk7XHJcbiAgICBpZiAocHJldmlvdXNSb3V0ZVBhcmFtU3RyKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXNSb3V0ZVBhcmFtID0gSlNPTi5wYXJzZShwcmV2aW91c1JvdXRlUGFyYW1TdHIpO1xyXG4gICAgICAgIHRoaXMucHJldmlvdXNSb3V0ZVBhcmFtID0gcHJldmlvdXNSb3V0ZVBhcmFtO1xyXG4gICAgICAgIHJldHVybiBwcmV2aW91c1JvdXRlUGFyYW07XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKGBVbmFibGUgdG8gcGFyc2UgcHJldmlvdXMgcm91dGUgcGFyYW0gZnJvbSBzZXNzaW9uIHN0b3JhZ2U6ICR7ZXJyb3J9YCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignTm8gcHJldmlvdXMgcGFnZSByb3V0ZSBwYXJhbSBmb3VuZCBpbiBzZXNzaW9uIHN0b3JhZ2UuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVtb3ZlUHJldmlvdXNQYWdlUm91dGVQYXJhbSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2UucmVtb3ZlKHRoaXMuUFJFVklPVVNfUEFHRV9ST1VURV9QQVJBTV9TVE9SQUdFX0tFWSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVtb3ZlTGFzdE5hdmlnYXRlUmVjb3JkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5yZW1vdmVMYXN0TmF2aWdhdGlvblBhdGgoKTtcclxuICAgIHRoaXMucmVtb3ZlTGFzdFJvdXRlUGFyYW0oKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW1vdmVMYXN0TmF2aWdhdGlvblBhdGgoKTogdm9pZCB7XHJcbiAgICB0aGlzLmJhY2tOYXZpZ2F0aW9uUGF0aCA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkJBQ0tfTkFWSUdBVElPTl9QQVRIX1NUT1JBR0VfS0VZKSB8fCBcIm51bGxcIik7XHJcbiAgICBpZiAodGhpcy5iYWNrTmF2aWdhdGlvblBhdGgpIHtcclxuICAgICAgdGhpcy5iYWNrTmF2aWdhdGlvblBhdGgucG9wKCk7XHJcbiAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0KHRoaXMuQkFDS19OQVZJR0FUSU9OX1BBVEhfU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KHRoaXMuYmFja05hdmlnYXRpb25QYXRoKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJObyBiYWNrIG5hdmlnYXRpb24gcGF0aCBmb3VuZCBpbiBzZXNzaW9uLlwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW1vdmVMYXN0Um91dGVQYXJhbSgpOiB2b2lkIHtcclxuICAgIHRoaXMucm91dGVQYXJhbSA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLk5BVklHQVRJT05fUEFSQU1TX1NUT1JBR0VfS0VZKSB8fCBcIm51bGxcIik7XHJcbiAgICBpZiAodGhpcy5yb3V0ZVBhcmFtKSB7XHJcbiAgICAgIHRoaXMucm91dGVQYXJhbS5wb3AoKTtcclxuICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQodGhpcy5OQVZJR0FUSU9OX1BBUkFNU19TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkodGhpcy5yb3V0ZVBhcmFtKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJyb3V0ZVBhcmFtIHNlc3Npb24gaXMgbnVsbC5cIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYmFja05hdmlnYXRpb24oZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCwgbWU6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKGdyb3VwWydpc0VtYmVkZGVkUGFnZSddKSB7XHJcbiAgICAgIGdyb3VwWydpc1RyaWdnZXJlZCddID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuY2xvc2VDb250YWluZXJWaWV3KGdyb3VwKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChncm91cC5iZWZvcmVCYWNrTmF2aWdhdGlvblBhZ2UpIHtcclxuICAgICAgZ3JvdXAuYmVmb3JlQmFja05hdmlnYXRpb25QYWdlKGdyb3VwKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubmF2aWdhdGVCYWNrVG9QcmV2aW91c1BhZ2UoZ3JvdXApO1xyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMubmF2aWdhdGVCYWNrVG9QcmV2aW91c1BhZ2UoZ3JvdXApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBuYXZpZ2F0ZUJhY2tUb1ByZXZpb3VzUGFnZShncm91cDogWkdyb3VwKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLnRyeVVwZGF0ZUdyb3VwVHJpZ2dlcihmYWxzZSk7XHJcblxyXG4gICAgY29uc3QgYmFja05hdmlnYXRpb25QYXRoOiBzdHJpbmdbXSA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkJBQ0tfTkFWSUdBVElPTl9QQVRIX1NUT1JBR0VfS0VZKSk7XHJcbiAgICBjb25zdCBiYWNrTmF2aWdhdGlvblVSTCA9IGdyb3VwLmJhY2tOYXZpZ2F0aW9uUGFnZSB8fCBiYWNrTmF2aWdhdGlvblBhdGhbYmFja05hdmlnYXRpb25QYXRoLmxlbmd0aCAtIDFdO1xyXG5cclxuICAgIGlmICghYmFja05hdmlnYXRpb25VUkwpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIG5hdmlnYXRpbmcgYmFjayB0byBwcmV2aW91cyBwYWdlOiBiYWNrTmF2aWdhdGlvblVSTCBpcyBub3Qgc2V0LlwiKTtcclxuICAgICAgLy90aHJvdyBuZXcgRXJyb3IoXCJCYWNrTmF2aWdhdGlvblBhdGggbm90IHNldC5cIik7XHJcbiAgICAgIGF3YWl0IHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwodGhpcy5nZXRTdGFydHVwUGFnZSgpLCB7IHJlcGxhY2VVcmw6IHRydWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFncm91cC5iYWNrTmF2aWdhdGlvblBhZ2UpIHtcclxuICAgICAgY29uc3QgcHJldmlvdXNSb3V0ZVBhcmFtID0gdGhpcy5nZXRQcmV2aW91c1BhZ2VSb3V0ZVBhcmFtKCk7XHJcbiAgICAgIGNvbnN0IHByZXZpb3VzQ3VycmVudFJvdXRlUGFyYW0gPSB0aGlzLmdldE5hdmlnYXRpb25DdXJyZW50UGFyYW0oKTtcclxuICAgICAgaWYgKHByZXZpb3VzUm91dGVQYXJhbSAmJiBwcmV2aW91c1JvdXRlUGFyYW0gPT09IHByZXZpb3VzQ3VycmVudFJvdXRlUGFyYW0pIHtcclxuICAgICAgICB0aGlzLnJlbW92ZVByZXZpb3VzUGFnZVJvdXRlUGFyYW0oKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnJlbW92ZUxhc3RSb3V0ZVBhcmFtKCk7XHJcbiAgICAgIHRoaXMucmVtb3ZlTGFzdE5hdmlnYXRpb25QYXRoKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQodGhpcy5OQVZJR0FURURfUkVMT0FEX0dSSURfU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KHRydWUpKTtcclxuXHJcbiAgICBpZiAodGhpcy5jYWNoZVNlcnZpY2UuZ2V0Q2FjaGUodGhpcy5DTE9ORV9ORVdfTU9ERUxfQ0FDSEVfS0VZKSkge1xyXG4gICAgICB0aGlzLmNhY2hlU2VydmljZS5jbGVhckNhY2hlKHRoaXMuQ0xPTkVfTkVXX01PREVMX0NBQ0hFX0tFWSk7XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgYXdhaXQgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChiYWNrTmF2aWdhdGlvblVSTCwgeyByZXBsYWNlVXJsOiB0cnVlIH0pO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgbmF2aWdhdGluZyBiYWNrIHRvIHByZXZpb3VzIHBhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKTtcclxuICAgICAgLy90aHJvdyBlcnJvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U3RhcnR1cFBhZ2UoKSB7XHJcbiAgICBjb25zdCB7IHN0YXJ0VXBQYWdlIH0gPSB0aGlzLmVudmlyb25tZW50O1xyXG5cclxuICAgIC8vIENoZWNrIGlmIHRoZSBzdGFydHVwIHBhZ2Ugc3RhcnRzIHdpdGggYSB1bmRlcnNjb3JlLlxyXG4gICAgaWYgKHN0YXJ0VXBQYWdlLnN0YXJ0c1dpdGgoJ18nKSkge1xyXG4gICAgICByZXR1cm4gYC8ke3N0YXJ0VXBQYWdlLnNsaWNlKDEpfWA7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgbm90LCBwcmVwZW5kIGEgZm9yd2FyZCBzbGFzaCBhbmQgcmV0dXJuLlxyXG4gICAgcmV0dXJuIGAvJHtzdGFydFVwUGFnZX1gO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoaXN0b3J5QmFjaygpIHtcclxuICAgIHRoaXMudHJ5VXBkYXRlR3JvdXBUcmlnZ2VyKGZhbHNlKTtcclxuXHJcbiAgICBpZiAodGhpcy5ncm91cFsnaXNFbWJlZGRlZFBhZ2UnXSkge1xyXG4gICAgICB0aGlzLmNsb3NlQ29udGFpbmVyVmlldyh0aGlzLmdyb3VwKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubmF2Q29udHJvbGxlci5wb3AoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWZyZXNoR3JpZChcclxuICAgIGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQsXHJcbiAgICBncm91cDogWkdyb3VwLFxyXG4gICAgbWU6IGFueSxcclxuICAgIGdyaWRPcHRpb25OYW1lPzogc3RyaW5nXHJcbiAgKSB7XHJcbiAgICBncmlkT3B0aW9uTmFtZSA9IGdyaWRPcHRpb25OYW1lIHx8IFwiZ3JpZE9wdGlvbnNcIjtcclxuICAgIGlmIChldmVudCAmJiBldmVudC50YXJnZXQpIHtcclxuICAgICAgY29uc3QgZ3JpZE9wdGlvbiA9IGV2ZW50LnRhcmdldFxyXG4gICAgICAgIC50cmltKClcclxuICAgICAgICAucmVwbGFjZShcIihcIiwgXCJcIilcclxuICAgICAgICAucmVwbGFjZShcIilcIiwgXCJcIilcclxuICAgICAgICAucmVwbGFjZShcImdyb3VwLnJlZnJlc2hHcmlkXCIsIFwiXCIpO1xyXG4gICAgICBpZiAoZ3JpZE9wdGlvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgZ3JpZE9wdGlvbk5hbWUgPSBncmlkT3B0aW9uO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgemdyaWRDb250cm9sID0gZ3JvdXBbZ3JpZE9wdGlvbk5hbWVdIGFzIFpHcmlkO1xyXG4gICAgaWYgKHpncmlkQ29udHJvbCkge1xyXG4gICAgICB6Z3JpZENvbnRyb2wuZ2V0RGF0YSgpO1xyXG4gICAgfVxyXG4gICAgZ3JvdXBbJ2lzVHJpZ2dlcmVkJ10gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVmcmVzaFBhZ2UoKSB7XHJcbiAgICBpZiAodGhpcy5ncm91cCkge1xyXG4gICAgICB0aGlzLnRyeVVwZGF0ZUdyb3VwVHJpZ2dlcihmYWxzZSk7XHJcbiAgICB9XHJcbiAgICBsb2NhdGlvbi5yZWxvYWQoKTtcclxuICAgIC8vIHRoaXMucm91dGVyLnJvdXRlUmV1c2VTdHJhdGVneS5zaG91bGRSZXVzZVJvdXRlID0gKCkgPT4gZmFsc2U7XHJcbiAgICAvLyB0aGlzLnJvdXRlci5vblNhbWVVcmxOYXZpZ2F0aW9uID0gJ3JlbG9hZCc7XHJcbiAgICAvLyBjb25zb2xlLmxvZygnUGF0aDogJywgdGhpcy5hY3RpdmF0ZWRSb3V0ZVsnX3JvdXRlclN0YXRlJ10uc25hcHNob3QudXJsKTtcclxuICAgIC8vIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2NybS9jdXN0b21lciddKTtcclxuICB9XHJcblxyXG4gIGdldENsb25lTmV3Q2FjaGVaTW9kZWwoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgY29uc3QgY2FjaGVaTW9kZWwgPSB0aGlzLmNhY2hlU2VydmljZS5nZXRDYWNoZSh0aGlzLkNMT05FX05FV19NT0RFTF9DQUNIRV9LRVkpO1xyXG4gICAgaWYgKGNhY2hlWk1vZGVsKSB7XHJcbiAgICAgIHRoaXMuY2FjaGVTZXJ2aWNlLmNsZWFyQ2FjaGUodGhpcy5DTE9ORV9ORVdfTU9ERUxfQ0FDSEVfS0VZKTtcclxuICAgICAgZ3JvdXAuek1vZGVsID0gY2FjaGVaTW9kZWw7XHJcbiAgICAgIGdyb3VwLnpNb2RlbC5JZCA9IDA7XHJcbiAgICB9XHJcbiAgICBncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBuZXdNb2RlbChldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50LCBncm91cDogWkdyb3VwKSB7XHJcbiAgICBvZihbXSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKCh6bW9kZWwpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiQmVmb3JlIG5ldywgek1vZGVsOlwiLCB6bW9kZWwpO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYmVmb3JlTmV3TW9kZWwoZ3JvdXApO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcImN1cnJlbnQgdXJsOiBcIiwgdGhpcy5yb3V0ZXIudXJsKTtcclxuXHJcbiAgICAgICAgICBjb25zdCByZWZlcmVuY2VJZCA9IGdyb3VwLnBhcmVudFJlZmVyZW5jZUlkIHx8IFwiMFwiO1xyXG4gICAgICAgICAgLy9jb25zdCBwYXRoU2VnbWVudCA9IHRoaXMucm91dGVyLnVybC5zcGxpdChcIi9cIik7XHJcbiAgICAgICAgICAvL2NvbnN0IGxhc3RTZWdtZW50ID0gcGF0aFNlZ21lbnRbcGF0aFNlZ21lbnQubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICBjb25zdCBjdXJyZW50TmF2aWdhdGlvblBhcmFtID0gdGhpcy5nZXROYXZpZ2F0aW9uQ3VycmVudFBhcmFtKCk7XHJcbiAgICAgICAgICBjb25zdCBuYXZpZ2F0aW9uU2VnbWVudHMgPSBjdXJyZW50TmF2aWdhdGlvblBhcmFtID8gY3VycmVudE5hdmlnYXRpb25QYXJhbS5zcGxpdCgnLycpIDogbnVsbDtcclxuICAgICAgICAgIGNvbnN0IGRlZmF1bHRBY3Rpb24gPSBncm91cC5pc0Nsb25lTmV3ID8gJ25ldycgOiAnZWRpdCc7XHJcbiAgICAgICAgICBjb25zdCBhY3Rpb25TZWdtZW50ID0gZ3JvdXAuaXNDbG9uZU5ldyA/IChuYXZpZ2F0aW9uU2VnbWVudHMgPyBuYXZpZ2F0aW9uU2VnbWVudHNbbmF2aWdhdGlvblNlZ21lbnRzLmxlbmd0aCAtIDFdIDogJ25ldycpIDogZGVmYXVsdEFjdGlvbjtcclxuXHJcbiAgICAgICAgICBpZiAoZ3JvdXAuaXNMaXN0Rm9ybSkge1xyXG4gICAgICAgICAgICB0aGlzLnRyeVVwZGF0ZUdyb3VwVHJpZ2dlcihmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNldE5hdmlnYXRpb25QYXJhbXMoW3JlZmVyZW5jZUlkLCAnbmV3J10pO1xyXG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbZ3JvdXAuZWRpdE1vZGVsVVJMXSwge1xyXG4gICAgICAgICAgICAgIHJlbGF0aXZlVG86IGdyb3VwLmN0cmxTY29wZS5hY3RpdmF0ZWRSb3V0ZSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gU2NlbmFyaW8gMTogRnJvbSBMaXN0IE5ldyhhY3Rpb246IG5ldykgPT0+IENsZWFyIGZvcm1cclxuICAgICAgICAgICAgLy8gU2NlbmFyaW8gMjogRnJvbSBGb3JtIE5ldyhhY3Rpb246IG5ldykgPT0+IENsZWFyIGZvcm1cclxuICAgICAgICAgICAgLy8gU2NlbmFyaW8gMzogRnJvbSBGb3JtIE5ldyhhY3Rpb246IG5ldyksIGlzQ2xvbmVOZXcgPT0+IERPTlQgQ2xlYXIgZm9ybVxyXG4gICAgICAgICAgICAvLyBTY2VuYXJpbyA0OiBGcm9tIEZvcm0gTmV3KGFjdGlvbjogbmV3KSwgaXNDbG9uZU5ldywgU2F2ZSwgQ2xpY2sgTmV3ID09PiBDbGVhciBmb3JtIChXaGVuIENyZWF0ZU1vZGVsLCBuZWVkIGNoYW5nZSBpc0Nsb25lTmV3ID0gZmFsc2UpXHJcbiAgICAgICAgICAgIC8vIFNjZW5hcmlvIDU6IEZyb20gTGlzdCBvcGVuIHJlY29yZChhY3Rpb246IGVkaXQpLCBpc0Nsb25lTmV3ID09PiBET05UIENsZWFyIGZvcm1cclxuICAgICAgICAgICAgLy8gU2NlbmFyaW8gNjogRnJvbSBMaXN0IG9wZW4gcmVjb3JkKGFjdGlvbjogZWRpdCksIGlzQ2xvbmVOZXcsIFNhdmUsIENsaWNrIE5ldyA9PT4gQ2xlYXIgZm9ybSAoV2hlbiBVcGRhdGVNb2RlbCwgbmVlZCBjaGFuZ2UgaXNDbG9uZU5ldyA9IGZhbHNlKVxyXG4gICAgICAgICAgICAvLyBTY2VuYXJpbyA3OiBGcm9tIExpc3Qgb3BlbiByZWNvcmQoYWN0aW9uOiBlZGl0KSwgQ2xpY2sgTmV3ID09PiBDbGVhciBmb3JtXHJcbiAgICAgICAgICAgIC8vIFNjZW5hcmlvIDg6IEZyb20gTGlzdCBvcGVuIHJlY29yZChhY3Rpb246IGVkaXQpLCBDbGljayBOZXcsIFNhdmUsIGlzQ2xvbmVOZXcgPT0+IERPTlQgQ2xlYXIgZm9ybVxyXG5cclxuICAgICAgICAgICAgaWYgKGFjdGlvblNlZ21lbnQgPT09IFwiZWRpdFwiIHx8IGFjdGlvblNlZ21lbnQgPT09IFwibmV3XCIpIHtcclxuICAgICAgICAgICAgICBpZiAoIWdyb3VwLmlzQ2xvbmVOZXcpIHtcclxuICAgICAgICAgICAgICAgIGdyb3VwLnpNb2RlbCA9IHt9O1xyXG4gICAgICAgICAgICAgICAgZ3JvdXAuZm9ybS5yZXNldCgpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFJlbG9hZCB0aGUgd29ya2Zsb3cgYnV0dG9uIGlmIHRoZSBUeXBlQ29kZSBpcyAnRlVOQ1RJT04nXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1R5cGVDb2RlRnVuY3Rpb24oZXZlbnQpKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMucmVsb2FkV29ya2Zsb3dCdXR0b24oZ3JvdXAsIGV2ZW50LmRhdGEuekJ1dHRvbk5hbWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAoYWN0aW9uU2VnbWVudCA9PT0gXCJlZGl0XCIpIHtcclxuICAgICAgICAgICAgICAgIC8vIGNsZWFyIGNsb25lTmV3TW9kZWwgY2FjaGUoaWYgaGF2ZSlcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhY2hlU2VydmljZS5nZXRDYWNoZSh0aGlzLkNMT05FX05FV19NT0RFTF9DQUNIRV9LRVkpKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVTZXJ2aWNlLmNsZWFyQ2FjaGUodGhpcy5DTE9ORV9ORVdfTU9ERUxfQ0FDSEVfS0VZKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvL3RoaXMuc2V0TmF2aWdhdGlvblBhcmFtcyhbcmVmZXJlbmNlSWQsICduZXcnXSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUxhc3RSb3V0ZVBhcmFtKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFJvdXRlUGFyYW0oW3JlZmVyZW5jZUlkLCAnbmV3J10pO1xyXG5cclxuICAgICAgICAgICAgICAgIGdyb3VwLnpNb2RlbFtncm91cC5wYXJlbnRSZWZlcmVuY2VGaWVsZF0gPSByZWZlcmVuY2VJZDtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZ3JvdXAuaXNFZGl0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgZ3JvdXAuaXNOZXcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIGdyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy50cnlVcGRhdGVHcm91cFRyaWdnZXIoZmFsc2UpO1xyXG4gICAgICAgICAgICAgIHRoaXMuc2V0TmF2aWdhdGlvblBhcmFtcyhbcmVmZXJlbmNlSWQsICduZXcnXSk7XHJcblxyXG4gICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtncm91cC5lZGl0TW9kZWxVUkxdLCB7XHJcbiAgICAgICAgICAgICAgICByZWxhdGl2ZVRvOiBncm91cC5jdHJsU2NvcGUuYWN0aXZhdGVkUm91dGUsXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChncm91cC5pc0Nsb25lTmV3KSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5hZnRlckNsb25lTmV3TW9kZWwoZ3JvdXAsIGdyb3VwLnpNb2RlbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5hZnRlck5ld01vZGVsKGdyb3VwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNyZWF0ZU1vZGVsKGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGNvbnN0IGZnOiBGb3JtR3JvdXAgPSBncm91cC5mb3JtIGFzIEZvcm1Hcm91cDtcclxuICAgIGNvbnN0IHJlc01lc3NhZ2UgPSBncm91cC5TdWNjZXNzQ3JlYXRlZE1lc3NhZ2UgfHwgXCJSZWNvcmQgaXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkuXCI7XHJcbiAgICBsZXQgY3JlYXRlTW9kZWxyZXMgPSBudWxsO1xyXG5cclxuICAgIGlmICghZmcuZGlydHkpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiRm9ybSBpcyBub3QgZGlydHkgaGVuY2UgcmVjb3JkIGlzIG5vdCBzYXZlLlwiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghZmcudmFsaWQpIHtcclxuICAgICAgdGhpcy5jb21wb25lbnRFcnJvckhhbmRsZXIuc2hvd0Zvcm1Hcm91cEVycm9yTWVzc2FnZShncm91cCwgZmcpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgb2YoZ3JvdXAuek1vZGVsKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBzd2l0Y2hNYXAoKHptb2RlbCkgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJCZWZvcmUgY3JlYXRlLCB6TW9kZWw6XCIsIHptb2RlbCk7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5iZWZvcmVDcmVhdGVNb2RlbChncm91cCk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICAgIGlmICghdGhpcy5ncm91cC5za2lwQ3JlYXRlVXNpbmdGb3JtVmFsdWUpIHtcclxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihncm91cC56TW9kZWwsIGZnLnZhbHVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgbmV3TW9kZWwgPSBPYmplY3QuYXNzaWduKHt9LCBncm91cC56TW9kZWwpO1xyXG4gICAgICAgICAgWkNvbXBvbmVudEhlbHBlci5yZW1vdmVOdWxsRmllbGRzKG5ld01vZGVsKTtcclxuXHJcbiAgICAgICAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlXHJcbiAgICAgICAgICAgIC5odHRwUG9zdCQoZ3JvdXAucmVzb3VyY2VVUkwsIG5ld01vZGVsKVxyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICB0YXAoKHJlc3ApID0+IHtcclxuICAgICAgICAgICAgICAgIGNyZWF0ZU1vZGVscmVzID0gcmVzcDtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXNwO1xyXG4gICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgIHRhcCgocmVzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVTdWNjZXNzKHJlcywgcmVzTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKHptb2RlbDogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkFmdGVyIGNyZWF0ZWQsIHpNb2RlbDpcIiwgem1vZGVsKTtcclxuICAgICAgICAgIHRoaXMucGF0Y2hVcGRhdGVkek1vZGVsKGZnLCB6bW9kZWwsIGdyb3VwKTtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmFmdGVyQ3JlYXRlTW9kZWwoZ3JvdXAsIHptb2RlbCk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgdGFwKChyZXNwKSA9PiB7XHJcbiAgICAgICAgICBpZiAoY3JlYXRlTW9kZWxyZXMuUHJvY2Vzc2luZ1N0YXR1cyA9PSBudWxsIHx8IGNyZWF0ZU1vZGVscmVzLlByb2Nlc3NpbmdTdGF0dXMgPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBpZiAocmVzcCAmJiBncm91cC56TW9kZWwuSWQgIT09IDApIHtcclxuICAgICAgICAgICAgICBncm91cC5pc05ldyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIGdyb3VwLmlzRWRpdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgZ3JvdXAuaXNDbG9uZU5ldyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIGdyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgZ3JvdXAuY2FuY2VsQnV0dG9uTmFtZSA9IFwiQ2xvc2VcIjtcclxuICAgICAgICAgICAgICAvLyBPYmplY3QuYXNzaWduKGdyb3VwLnpNb2RlbCwgcmVzcCk7XHJcbiAgICAgICAgICAgICAgLy8gZmcucGF0Y2hWYWx1ZShyZXNwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBmZy5tYXJrQXNQcmlzdGluZSgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKChncm91cC5pc0Nsb3NlQWZ0ZXJTdWNjZXNzIHx8IGdyb3VwLmlzQ2xvc2VBZnRlckNyZWF0ZWQpICYmICFncm91cC5pc0Nsb25lTmV3KSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5iYWNrTmF2aWdhdGlvbihudWxsLCBncm91cCwgdGhpcyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZmcubWFya0FzRGlydHkoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiRG9uZSB1cGRhdGVNb2RlbCB1cGRhdGVkIHpNb2RlbDpcIiwgZmcudmFsdWUpO1xyXG4gICAgICAgICAgLy8gdGhpcy50b2FzdFNlcnZpY2Uuc2hvdyhcIlJlY29yZCBpcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseS5cIik7XHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlTW9kZWwoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgdGhpcy51cGRhdGVNb2RlbE9ic2VydmFibGUoZXZlbnQsIGdyb3VwKS5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVNb2RlbE9ic2VydmFibGUoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCwgZm9ybTogRm9ybUdyb3VwID0gbnVsbCwgdXBkYXRlQVBJT2JzZXJ2YWJsZTogT2JzZXJ2YWJsZTxhbnk+ID0gbnVsbCwgaXNTa2lwRGlydHkgPSBmYWxzZSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBjb25zdCBmZyA9IGZvcm0gfHwgZ3JvdXAuZm9ybSBhcyBGb3JtR3JvdXA7XHJcbiAgICBjb25zdCByZXNNZXNzYWdlID0gZ3JvdXAuU3VjY2Vzc1VwZGF0ZWRNZXNzYWdlIHx8IFwiUmVjb3JkIGlzIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LlwiO1xyXG4gICAgbGV0IHVwZGF0ZU1vZGVscmVzID0gbnVsbDtcclxuXHJcbiAgICBpZiAoIXRoaXMuaXNGb3JtRGlydHlBbmRWYWxpZChmZywgZ3JvdXAsIGlzU2tpcERpcnR5LCBldmVudCkpIHtcclxuICAgICAgaWYgKGlzU2tpcERpcnR5KSB7XHJcbiAgICAgICAgZmcubWFya0FsbEFzVG91Y2hlZCgpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBvZihmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlQVBJT2JzZXJ2YWJsZSA9IHVwZGF0ZUFQSU9ic2VydmFibGUgfHwgdGhpcy53ZWJBcGlTZXJ2aWNlLmh0dHBQdXQkKGdyb3VwLnJlc291cmNlVVJMICsgXCIvXCIgKyBncm91cC56TW9kZWwuSWQsIGdyb3VwLnpNb2RlbClcclxuICAgICAgLnBpcGUodGFwKChyZXMpID0+IHtcclxuICAgICAgICB0aGlzLmhhbmRsZVN1Y2Nlc3MocmVzLCByZXNNZXNzYWdlKTtcclxuICAgICAgfVxyXG4gICAgICAgIC8vdGhpcy5oYW5kbGVTdWNjZXNzKHJlcywgXCJSZWNvcmQgaXMgdXBkYXRlZCBzdWNjZXNzZnVsbHkuXCIpXHJcbiAgICAgICkpO1xyXG5cclxuICAgIHJldHVybiBvZihncm91cC56TW9kZWwpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHN3aXRjaE1hcCgoem1vZGVsKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkJlZm9yZSB1cGRhdGUsIHpNb2RlbDpcIiwgem1vZGVsKTtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmJlZm9yZVVwZGF0ZU1vZGVsKGdyb3VwKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKCFncm91cC5za2lwVXBkYXRlVXNpbmdGb3JtVmFsdWUpIHtcclxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihncm91cC56TW9kZWwsIGZnLnZhbHVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZUFQSU9ic2VydmFibGU7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgc3dpdGNoTWFwKChyZXNwOiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiQWZ0ZXIgdXBkYXRlZCwgcmVzcG9uc2U6XCIsIHJlc3ApO1xyXG4gICAgICAgICAgdXBkYXRlTW9kZWxyZXMgPSByZXNwO1xyXG4gICAgICAgICAgZ3JvdXAuaXNDbG9uZU5ldyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5wYXRjaFVwZGF0ZWR6TW9kZWwoZmcsIHJlc3AsIGdyb3VwKTtcclxuICAgICAgICAgIGZnLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5hZnRlclVwZGF0ZU1vZGVsKGdyb3VwLCByZXNwKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICB0YXAoKHJlc3ApID0+IHtcclxuICAgICAgICAgIGlmICh1cGRhdGVNb2RlbHJlcyAmJiB1cGRhdGVNb2RlbHJlcy5Qcm9jZXNzaW5nU3RhdHVzKSB7XHJcbiAgICAgICAgICAgIGlmIChncm91cC5pc0Nsb3NlQWZ0ZXJTdWNjZXNzIHx8IGdyb3VwLmlzQ2xvc2VBZnRlclVwZGF0ZWQpIHtcclxuICAgICAgICAgICAgICB0aGlzLmJhY2tOYXZpZ2F0aW9uKG51bGwsIGdyb3VwLCB0aGlzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbG9uZXMgYSBuZXcgbW9kZWwgZm9yIGEgWkdyb3VwIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBaQ29tcG9uZW50T3V0cHV0RXZlbnQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1pDb21wb25lbnRPdXRwdXRFdmVudH0gZXZlbnQgLSBUaGUgWkNvbXBvbmVudE91dHB1dEV2ZW50IHRyaWdnZXJpbmcgdGhlIGNsb25lLlxyXG4gICAqIEBwYXJhbSB7Wkdyb3VwfSBncm91cCAtIFRoZSBaR3JvdXAgdG8gY2xvbmUgdGhlIG5ldyBtb2RlbCBmb3IuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjbG9uZU5ld01vZGVsKGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIGdyb3VwOiBaR3JvdXApIHtcclxuICAgIC8vIFNldCBmbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgbW9kZWwgaXMgYmVpbmcgY2xvbmVkXHJcbiAgICBncm91cC5pc0Nsb25lTmV3ID0gdHJ1ZTtcclxuXHJcbiAgICAvLyBFeHRyYWN0IHRoZSBmdW5jdGlvbiB2YWx1ZSBmcm9tIHRoZSB0YXJnZXQgb2YgdGhlIGV2ZW50XHJcbiAgICBjb25zdCB7IHRhcmdldCB9ID0gZXZlbnQ7XHJcbiAgICBjb25zdCBmdW5jdGlvblZhbHVlID0gdGFyZ2V0Py5tYXRjaCgvXFwoKFteKV0rKVxcKS8pPy5bMV07XHJcblxyXG4gICAgLy8gSWYgdGhlIGZ1bmN0aW9uIHZhbHVlIGlzICd0cnVlJywgcmVzZXQgdGhlIGZvcm0gYW5kIG1vZGVsXHJcbiAgICBpZiAoZnVuY3Rpb25WYWx1ZSA9PT0gJ3RydWUnKSB7XHJcbiAgICAgIGdyb3VwLnpNb2RlbCA9IHt9O1xyXG4gICAgICBncm91cC5mb3JtLnJlc2V0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRGVmaW5lIHRoZSB2YWx1ZXMgZm9yIHRoZSBXRlMgbW9kZWxcclxuICAgIGNvbnN0IG5ld01vZGVsVmFsdWVzID0ge1xyXG4gICAgICBJZDogMCxcclxuICAgICAgV0ZTX0RvY3VtZW50SWQ6IG51bGwsXHJcbiAgICAgIFdGU19TdGF0dXNDb2RlOiBudWxsLFxyXG4gICAgICBXRlNfU3RhdHVzSWQ6IG51bGwsXHJcbiAgICAgIFdGU19TdGF0dXNOYW1lOiBudWxsLFxyXG4gICAgfTtcclxuXHJcbiAgICAvLyBBc3NpZ24gdGhlIFdGUyBtb2RlbCB2YWx1ZXMgdG8gdGhlIGZvcm0gdmFsdWUgYW5kIFpNb2RlbFxyXG4gICAgT2JqZWN0LmFzc2lnbihncm91cC5mb3JtLnZhbHVlLCBuZXdNb2RlbFZhbHVlcyk7XHJcbiAgICBPYmplY3QuYXNzaWduKGdyb3VwLnpNb2RlbCwgZ3JvdXAuZm9ybS52YWx1ZSk7XHJcblxyXG4gICAgLy8gUGF0Y2ggdGhlIGZvcm0gd2l0aCB0aGUgWk1vZGVsLCBtYXJrIGl0IGFzIGRpcnR5LCBhbmQgY2FjaGUgdGhlIFpNb2RlbFxyXG4gICAgY29uc3QgZmcgPSBncm91cC5mb3JtIGFzIEZvcm1Hcm91cDtcclxuICAgIGZnLnBhdGNoVmFsdWUoZ3JvdXAuek1vZGVsKTtcclxuICAgIGZnLm1hcmtBc0RpcnR5KCk7XHJcbiAgICB0aGlzLmNhY2hlU2VydmljZS5zZXRDYWNoZSh0aGlzLkNMT05FX05FV19NT0RFTF9DQUNIRV9LRVksIGdyb3VwLnpNb2RlbCk7XHJcblxyXG4gICAgLy8gQ2FsbCB0aGUgbmV3TW9kZWwgZnVuY3Rpb24gZm9yIHRoZSBncm91cFxyXG4gICAgdGhpcy5uZXdNb2RlbChudWxsLCBncm91cCk7XHJcblxyXG4gICAgLy8gUmVsb2FkIHRoZSB3b3JrZmxvdyBidXR0b24gaWYgdGhlIFR5cGVDb2RlIGlzICdGVU5DVElPTidcclxuICAgIGlmICh0aGlzLmlzVHlwZUNvZGVGdW5jdGlvbihldmVudCkpIHtcclxuICAgICAgdGhpcy5yZWxvYWRXb3JrZmxvd0J1dHRvbihncm91cCwgZXZlbnQuZGF0YS56QnV0dG9uTmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2xlYXIgdGhlIHRyaWdnZXIgZmxhZ1xyXG4gICAgZ3JvdXAuaXNUcmlnZ2VyZWQgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZGVsZXRlTW9kZWwoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgY29uc3QgZmc6IEZvcm1Hcm91cCA9IGdyb3VwLmZvcm0gYXMgRm9ybUdyb3VwO1xyXG4gICAgY29uc3QgcmVzTWVzc2FnZSA9IGdyb3VwLlN1Y2Nlc3NEZWxldGVkTWVzc2FnZSB8fCBcIlJlY29yZCBpcyBkZWxldGVkIHN1Y2Nlc3NmdWxseS5cIlxyXG5cclxuICAgIG9mKGdyb3VwLnpNb2RlbClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKCh6bW9kZWwpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiQmVmb3JlIGRlbGV0ZSwgek1vZGVsOlwiLCB6bW9kZWwpO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYmVmb3JlRGVsZXRlTW9kZWwoZ3JvdXApO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgICAgICBncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYWxlcnRTZXJ2aWNlLnNob3coXCJEZWxldGUgUmVjb3JkXCIsIFwiQXJlIHlvdSBzdXJlP1wiLFxyXG4gICAgICAgICAgICBbXHJcbiAgICAgICAgICAgICAgeyB0ZXh0OiBcIk5vXCIsIGNzc0NsYXNzOiBcInNlY29uZGFyeVwiIH0gYXMgQWxlcnRCdXR0b24sXHJcbiAgICAgICAgICAgICAgeyB0ZXh0OiBcIlllc1wiLCBjc3NDbGFzczogXCJwcmltYXJ5XCIgfSBhcyBBbGVydEJ1dHRvblxyXG4gICAgICAgICAgICBdKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKHJlcGx5OiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIGlmIChyZXBseSA9PT0gXCJZZXNcIikge1xyXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGdyb3VwLnpNb2RlbCwgZmcudmFsdWUpO1xyXG4gICAgICAgICAgICBncm91cC56TW9kZWwuRGlzYWJsZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgbGV0IHRlbXBSZXNwb25zZSA9IHt9O1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlXHJcbiAgICAgICAgICAgICAgLmh0dHBQdXQkKGdyb3VwLnJlc291cmNlVVJMICsgXCIvXCIgKyBncm91cC56TW9kZWwuSWQsIGdyb3VwLnpNb2RlbClcclxuICAgICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIHRhcCgocmVzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIHRlbXBSZXNwb25zZSA9IE9iamVjdC5hc3NpZ24oe30sIHJlcyk7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU3VjY2VzcyhyZXMsIHJlc01lc3NhZ2UpXHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoem1vZGVsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQWZ0ZXIgZGVsZXRlZCwgek1vZGVsOlwiLCB6bW9kZWwpO1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hZnRlckRlbGV0ZU1vZGVsKGdyb3VwLCB6bW9kZWwpO1xyXG4gICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICB0YXAoKHJlc3ApID0+IHtcclxuICAgICAgICAgICAgICAgICAgLy90aGlzLmhpc3RvcnlCYWNrKCk7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh0ZW1wUmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGVtcFJlc3BvbnNlWydQcm9jZXNzaW5nU3RhdHVzJ10pIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGZnLnJlc2V0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJhY2tOYXZpZ2F0aW9uKG51bGwsIGdyb3VwLCB0aGlzKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgZ3JvdXAuek1vZGVsLkRpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gb2YoW10pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwYXRjaFVwZGF0ZWR6TW9kZWwoZmc6IEZvcm1Hcm91cCwgcmVzcDogYW55LCBncm91cDogWkdyb3VwKSB7XHJcbiAgICBpZiAocmVzcCkge1xyXG4gICAgICBpZiAocmVzcC5EYXRhKSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihncm91cC56TW9kZWwsIHJlc3AuRGF0YSk7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0RGF0YSA9IHRoaXMucmVtb3ZlVGV4dEVkaXRvclZhbHVlRnJvbUZvcm1QYXRjaGluZyhyZXNwLkRhdGEsIGdyb3VwKTtcclxuICAgICAgICBmZy5wYXRjaFZhbHVlKHJlc3VsdERhdGEpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHJlc3BbXCJJZFwiXSkge1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24oZ3JvdXAuek1vZGVsLCByZXNwKTtcclxuICAgICAgICBjb25zdCByZXN1bHREYXRhID0gdGhpcy5yZW1vdmVUZXh0RWRpdG9yVmFsdWVGcm9tRm9ybVBhdGNoaW5nKHJlc3AsIGdyb3VwKTtcclxuICAgICAgICBmZy5wYXRjaFZhbHVlKHJlc3VsdERhdGEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ3JvdXAucmVmZXJlbmNlSWQgPSBncm91cC56TW9kZWwuSWQ7XHJcbiAgICB0aGlzLnRyeVVwZGF0ZUdyb3VwVHJpZ2dlcihmYWxzZSk7XHJcbiAgICBncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG5cclxuICAgIGZnLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbW92ZVRleHRFZGl0b3JWYWx1ZUZyb21Gb3JtUGF0Y2hpbmcoZGF0YSwgZ3JvdXA6IFpHcm91cCk6IGFueSB7XHJcbiAgICBjb25zdCByZXN1bHREYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkYXRhKSk7XHJcbiAgICBjb25zdCBhbGxGaWVsZHMgPSBaQ29tcG9uZW50SGVscGVyLmdldEZpZWxkTGlzdEZyb21GaWVsZHNXaXRob3V0SGllcmFyY2h5KGdyb3VwLmZpZWxkcyk7XHJcblxyXG4gICAgY29uc3QgdGV4dEVkaXRvcnMgPSBhbGxGaWVsZHMuZmlsdGVyKHggPT4geC5UeXBlID09PSAnenRleHRlZGl0b3InKTtcclxuICAgIGlmICh0ZXh0RWRpdG9ycyAmJiB0ZXh0RWRpdG9ycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGZvciAoY29uc3QgY29tcCBvZiB0ZXh0RWRpdG9ycykge1xyXG4gICAgICAgIGRlbGV0ZSByZXN1bHREYXRhW2NvbXAuVmFsdWVdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdERhdGE7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzVHlwZUNvZGVGdW5jdGlvbihldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50KSB7XHJcbiAgICByZXR1cm4gZXZlbnQ/LmRhdGE/LlR5cGVDb2RlID09PSAnRlVOQ1RJT04nO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWxvYWRXb3JrZmxvd0J1dHRvbihncm91cDogWkdyb3VwLCB6QnV0dG9uTmFtZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCB3b3JrZmxvd0J1dHRvbnMgPSBaQ29tcG9uZW50SGVscGVyLmdldENvbXBvbmVudChncm91cCwgYHp3b3JrZmxvd2J1dHRvbnNfJHt6QnV0dG9uTmFtZX1gKTtcclxuICAgIHdvcmtmbG93QnV0dG9ucz8uWydsb2FkQnV0dG9uJ10/LigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzRm9ybURpcnR5QW5kVmFsaWQoZmc6IEZvcm1Hcm91cCwgZ3JvdXA6IFpHcm91cCwgaXNTa2lwRGlydHkgPSBmYWxzZSwgZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFpc1NraXBEaXJ0eSAmJiAhZmcuZGlydHkpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiRm9ybSBpcyBub3QgZGlydHkgaGVuY2UgcmVjb3JkIGlzIG5vdCBzYXZlLlwiKTtcclxuICAgICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50ICYmIGV2ZW50LmRhdGEgJiYgZXZlbnQuZGF0YVtgRm9ybU5vdERpcnR5TWVzc2FnZWBdID8gZXZlbnQuZGF0YVtgRm9ybU5vdERpcnR5TWVzc2FnZWBdIDogRGVmYXVsdE1lc3NhZ2Uubm90RGlydHlNZXNzYWdlO1xyXG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5zaG93T2theShEZWZhdWx0RGlhbG9nVGl0bGUubm90aGluZ1RvVXBkYXRlLCBtZXNzYWdlLCBbXCJjb2wtNVwiXSk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWZnLnZhbGlkKSB7XHJcbiAgICAgIHRoaXMuY29tcG9uZW50RXJyb3JIYW5kbGVyLnNob3dGb3JtR3JvdXBFcnJvck1lc3NhZ2UoZ3JvdXAsIGZnKTtcclxuICAgICAgZmcubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgICBmZy5tYXJrQWxsQXNUb3VjaGVkKCk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmVmb3JlVXBkYXRlTW9kZWwoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgaWYgKCFncm91cC5iZWZvcmVVcGRhdGVNb2RlbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5iZWZvcmVVcGRhdGVNb2RlbCBpcyB1bmRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYmVmb3JlVXBkYXRlTW9kZWwoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBiZWZvcmVEZWxldGVNb2RlbChncm91cDogWkdyb3VwKSB7XHJcbiAgICBpZiAoIWdyb3VwLmJlZm9yZURlbGV0ZU1vZGVsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmJlZm9yZURlbGV0ZU1vZGVsIGlzIHVuZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5iZWZvcmVEZWxldGVNb2RlbChncm91cCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJlZm9yZU5ld01vZGVsKGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGlmICghZ3JvdXAuYmVmb3JlTmV3TW9kZWwpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYmVmb3JlTmV3b2RlbCBpcyB1bmRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYmVmb3JlTmV3TW9kZWwoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBiZWZvcmVDcmVhdGVNb2RlbChncm91cDogWkdyb3VwKSB7XHJcbiAgICBpZiAoIWdyb3VwLmJlZm9yZUNyZWF0ZU1vZGVsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmJlZm9yZUNyZWF0ZU1vZGVsIGlzIHVuZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5iZWZvcmVDcmVhdGVNb2RlbChncm91cCk7XHJcbiAgfVxyXG5cclxuICBiZWZvcmVQYWdlSW5pdGlhbGlzZShncm91cDogWkdyb3VwKSB7XHJcbiAgICBpZiAoIWdyb3VwLmJlZm9yZVBhZ2VJbml0aWFsaXNlKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmJlZm9yZVBhZ2VJbml0aWFsaXNlIGlzIHVuZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5iZWZvcmVQYWdlSW5pdGlhbGlzZShncm91cCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFmdGVyR2V0TW9kZWxTdWNjZXNzKGdyb3VwOiBaR3JvdXApOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKCFncm91cC56TW9kZWwuSWQpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiek1vZGVsLklkIGlzIG5vdCBkZWZpbmVkXCIsIGdyb3VwLnpNb2RlbCk7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICBpZiAoIWdyb3VwLmFmdGVyR2V0TW9kZWxTdWNjZXNzKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmFmdGVyR2V0TW9kZWxTdWNjZXNzIGlzIG5vdCBkZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmFmdGVyR2V0TW9kZWxTdWNjZXNzKGdyb3VwKTtcclxuICB9XHJcblxyXG4gIGFmdGVyTmV3TW9kZWwoZ3JvdXA6IFpHcm91cCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAoIWdyb3VwLmFmdGVyTmV3TW9kZWwpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYWZ0ZXJOZXdNb2RlbCBpcyBub3QgZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5hZnRlck5ld01vZGVsKGdyb3VwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWZ0ZXJDcmVhdGVNb2RlbChncm91cDogWkdyb3VwLCB6bW9kZWw6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAoIWdyb3VwLmFmdGVyQ3JlYXRlTW9kZWwpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYWZ0ZXJDcmVhdGVNb2RlbCBpcyBub3QgZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5hZnRlckNyZWF0ZU1vZGVsKGdyb3VwLCB6bW9kZWwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZnRlclVwZGF0ZU1vZGVsKGdyb3VwOiBaR3JvdXAsIHptb2RlbDogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGlmICghZ3JvdXAuYWZ0ZXJVcGRhdGVNb2RlbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5hZnRlclVwZGF0ZU1vZGVsIGlzIG5vdCBkZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmFmdGVyVXBkYXRlTW9kZWwoZ3JvdXAsIHptb2RlbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFmdGVyRGVsZXRlTW9kZWwoZ3JvdXA6IFpHcm91cCwgem1vZGVsOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKCFncm91cC5hZnRlckRlbGV0ZU1vZGVsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmFmdGVyRGVsZXRlTW9kZWwgaXMgbm90IGRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYWZ0ZXJEZWxldGVNb2RlbChncm91cCwgem1vZGVsKTtcclxuICB9XHJcblxyXG4gIGFmdGVyQ2xvbmVOZXdNb2RlbChncm91cDogWkdyb3VwLCB6bW9kZWw6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAoIWdyb3VwLmFmdGVyQ2xvbmVOZXdNb2RlbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5hZnRlckNsb25lTmV3TW9kZWwgaXMgbm90IGRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYWZ0ZXJDbG9uZU5ld01vZGVsKGdyb3VwLCB6bW9kZWwpO1xyXG4gIH1cclxuXHJcbiAgYWZ0ZXJQYWdlSW5pdGlhbGlzZShncm91cDogWkdyb3VwKSB7XHJcbiAgICBpZiAoIWdyb3VwLmFmdGVyUGFnZUluaXRpYWxpc2UpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYWZ0ZXJQYWdlSW5pdGlhbGlzZSBpcyB1bmRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYWZ0ZXJQYWdlSW5pdGlhbGlzZShncm91cCk7XHJcbiAgfVxyXG5cclxuICAvLyBwcml2YXRlIG9uQWN0aW9uKGdyb3VwOiBaR3JvdXApIHtcclxuICAvLyAgIHRoaXMuYWN0aW9uU2hlZXRDdHJsXHJcbiAgLy8gICAgIC5jcmVhdGUoe1xyXG4gIC8vICAgICAgIGhlYWRlcjogXCJDaG9vc2UgYW4gQWN0aW9uXCIsXHJcbiAgLy8gICAgICAgYnV0dG9uczogZ3JvdXAudG9wUmlnaHRBY3Rpb25CdXR0b25cclxuICAvLyAgICAgfSlcclxuICAvLyAgICAgLnRoZW4oYWN0aW9uU2hlZXRFbCA9PiB7XHJcbiAgLy8gICAgICAgYWN0aW9uU2hlZXRFbC5wcmVzZW50KCk7XHJcbiAgLy8gICAgIH0pO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gc2V0TW9kZWxWYWx1ZShwcm9wZXJ0eU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwgZ3JvdXA6IFpHcm91cCkge1xyXG4gIC8vICAgZ3JvdXAuek1vZGVsW3Byb3BlcnR5TmFtZV0gPSB2YWx1ZTtcclxuICAvLyAgIGlmIChncm91cC5pc0xvYWRpbmcpIHtcclxuICAvLyAgICAgcmV0dXJuO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgY29uc3QgZmcgPSBncm91cC5mb3JtIGFzIEZvcm1Hcm91cDtcclxuICAvLyAgIGlmICghZmcpIHtcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgLCBuby1kZWJ1Z2dlclxyXG4gIC8vICAgICBkZWJ1Z2dlcjtcclxuICAvLyAgIH1cclxuICAvLyAgIGNvbnN0IGZjID0gZmcuY29udHJvbHNbcHJvcGVydHlOYW1lXTtcclxuICAvLyAgIGlmICghZmMpIHtcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZGVidWdnZXJcclxuICAvLyAgICAgZGVidWdnZXI7XHJcbiAgLy8gICB9XHJcbiAgLy8gICBmYy5zZXRWYWx1ZSh2YWx1ZSk7XHJcbiAgLy8gICBmYy5tYXJrQXNEaXJ0eSgpO1xyXG4gIC8vIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHNob3d6TW9kYWwoXHJcbiAgICBjb2xGaWVsZHMkOiBzdHJpbmcgfCBPYnNlcnZhYmxlPEFycmF5PFpGaWVsZD4+LFxyXG4gICAgcGFyZW50R3JvdXA6IFpHcm91cCxcclxuICAgIGZvcm1IZWFkZXI6IHN0cmluZyxcclxuICAgIHpNb2RlbD86IGFueSxcclxuICAgIHJlZmVySWQ/OiBzdHJpbmcsXHJcbiAgICBjb21wb25lbnRTaXplPzogWkNvbXBvbmVudFNpemUsXHJcbiAgICBza2lwSXNEaXJ0eUNoZWNrPzogYm9vbGVhbixcclxuICAgIHZhbGlkYXRlSXNSZXF1aXJlZD86IGJvb2xlYW5cclxuICApIHtcclxuICAgIGNvbnN0IG1vZGFsY29tcG9uZW50ID0gWm1vZGFsQ29tcG9uZW50O1xyXG4gICAgY29uc3QgbW9kYWxtb2JpbGVjb21wb25lbnQgPSBabW9kYWxNb2JpbGVDb21wb25lbnQ7XHJcblxyXG4gICAgaWYgKHBhcmVudEdyb3VwKSB7XHJcbiAgICAgIC8vIGRpc2FibGUgaXNUcmlnZ2VyZWQgYmVmb3JlIGRpc3BsYXkgdGhlIHBvcHVwLlxyXG4gICAgICBwYXJlbnRHcm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMubW9kYWxTZXJ2aWNlLnNob3coY29sRmllbGRzJCwgcGFyZW50R3JvdXAsIGZvcm1IZWFkZXIsIG1vZGFsY29tcG9uZW50LCBtb2RhbG1vYmlsZWNvbXBvbmVudCwgek1vZGVsLCByZWZlcklkLCBjb21wb25lbnRTaXplLCBza2lwSXNEaXJ0eUNoZWNrLCB2YWxpZGF0ZUlzUmVxdWlyZWQpO1xyXG4gICAgLy9jb25zdCBtb2RhbCA9IGF3YWl0IHRoaXMubW9kYWxTZXJ2aWNlLnNob3coKTtcclxuICB9XHJcblxyXG5cclxuICBwdWJsaWMgY29va2llU3RvcmVQb3N0KG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAvLyBmb3IgUG9zdCB0byBDb29raWVTdG9yZVxyXG4gICAgY29uc3QgY29va2llU3RvcmVVUkwgPSB0aGlzLm9hdXRoRW52aXJvbm1lbnRVcmwgKyBcImFwaS9Db29raWVTdG9yZXNcIjtcclxuICAgIGNvbnN0IGNvb2tpZVN0b3JlVmFsdWUgPSB7XHJcbiAgICAgICdOYW1lJzogbmFtZSxcclxuICAgICAgJ1ZhbHVlJzogSlNPTi5zdHJpbmdpZnkodmFsdWUpXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB0aGlzLndlYkFwaVNlcnZpY2UuaHR0cFBvc3QkKGNvb2tpZVN0b3JlVVJMLCBjb29raWVTdG9yZVZhbHVlKS5waXBlKG1hcChyZXMgPT4ge1xyXG4gICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJncmlkIGNvbmZpZyBzYXZlZChcIiArIHJlcy5zdGF0dXMgKyBcIik6IFwiLCByZXMpO1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjb29raWVTdG9yZUdldChuYW1lOiBzdHJpbmcsIGFjY2Vzc1Rva2VuOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgY29uc3QgY29va2llU3RvcmVVUkwgPSB0aGlzLm9hdXRoRW52aXJvbm1lbnRVcmwgKyBcImFwaS9Db29raWVTdG9yZXMvP25hbWU9XCIgKyBuYW1lO1xyXG5cclxuICAgIHJldHVybiB0aGlzLndlYkFwaVNlcnZpY2UuaHR0cEdldCQoY29va2llU3RvcmVVUkwsIHsgaGVhZGVyczogYWNjZXNzVG9rZW4gfSkucGlwZShtYXAocmVzID0+IHtcclxuICAgICAgaWYgKHJlcykge1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjb29raWVTdG9yZURlbGV0ZU11bHRpcGxlKG5hbWU6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAvLyBmb3IgUG9zdCB0byBDb29raWVTdG9yZVxyXG4gICAgY29uc3QgY29va2llU3RvcmVVUkwgPSB0aGlzLm9hdXRoRW52aXJvbm1lbnRVcmwgKyBcIkFkbWluL0RlbGV0ZU11bHRpcGxlQ29va2llc1wiO1xyXG4gICAgY29uc3QgY29va2llU3RvcmVWYWx1ZSA9IHtcclxuICAgICAgJ2NvbnRhaW5OYW1lJzogbmFtZVxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlLmh0dHBQb3N0JChjb29raWVTdG9yZVVSTCwgY29va2llU3RvcmVWYWx1ZSkucGlwZShtYXAocmVzID0+IHtcclxuICAgICAgaWYgKHJlcykge1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzY3JvbGxUb0VsZW1lbnRCeUlkKGlkOiBzdHJpbmcsIGJlaGF2aW9yOiAnc21vb3RoJyB8ICdhdXRvJyA9ICdzbW9vdGgnKSB7XHJcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcclxuICAgIGVsLnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3IgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdHJhbnNsYXRpb25QYWdlRWxlbWVudChncm91cDogWkdyb3VwKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGNvbnN0IG9ic0xpc3QgPSBuZXcgQXJyYXk8T2JzZXJ2YWJsZTxhbnk+PigpO1xyXG4gICAgaWYgKGdyb3VwLmZvcm1IZWFkZXIpIHtcclxuICAgICAgb2JzTGlzdC5wdXNoKHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLiR0cmFuc2xhdGVTaW5nbGVJdGVtKGdyb3VwLCBcImZvcm1IZWFkZXJcIikpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChncm91cC5uYXZJdGVtcyAmJiBncm91cC5uYXZJdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIG9ic0xpc3QucHVzaCh0aGlzLnRyYW5zbGF0aW9uU2VydmljZS4kdHJhbnNsYXRlSXRlbUxpc3QoZ3JvdXAubmF2SXRlbXMsIFwidGV4dFwiKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG9ic0xpc3QubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZvcmtKb2luKG9ic0xpc3QpO1xyXG4gIH1cclxuXHJcbiAgLy8gI3JlZ2lvbiBERUNcclxuICBwdWJsaWMgYXN5bmMgbG9hZENvbnRhaW5lclZpZXcoZWxlbWVudENvbnRhaW5lcjogYW55LCBjb250YWluZXJQYWdlOiBhbnksIGRhdGE6IFpGaWVsZCwgZ3JvdXA/OiBaR3JvdXApIHtcclxuICAgIGlmICghZWxlbWVudENvbnRhaW5lcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkVsZW1lbnRDb250YWluZXIgaXMgbnVsbC5cIik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWNvbnRhaW5lclBhZ2UpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJDb250YWluZXJQYWdlIGlzIG51bGwuXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgdmlld0NvbnRhaW5lclJlZiA9IGVsZW1lbnRDb250YWluZXIudmlld0NvbnRhaW5lclJlZjtcclxuICAgIHZpZXdDb250YWluZXJSZWYuY2xlYXIoKTtcclxuXHJcbiAgICBjb25zdCBlbWJlZGRlZGdyb3VwID0gbmV3IFpHcm91cCgpO1xyXG4gICAgdGhpcy5zZXRHcm91cEZvckRlYnVnZ2VyKGVtYmVkZGVkZ3JvdXApO1xyXG4gICAgY29uc3QgY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8YW55PiA9IHZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KGNvbnRhaW5lclBhZ2UpO1xyXG5cclxuICAgIGVtYmVkZGVkZ3JvdXAuaXNUcmlnZ2VyZWQgPSBmYWxzZTsgLy8gZW5hYmxlIGJhY2sgdGhlIGJ1dHRvbiBmb3IgdHJpZ2dlcmluZy5cclxuXHJcbiAgICAvLyBPYmplY3QuYXNzaWduKGNvbXBvbmVudFJlZi5pbnN0YW5jZVtcImdyb3VwXCJdLCBncm91cCk7XHJcbiAgICBPYmplY3QuYXNzaWduKGNvbXBvbmVudFJlZi5pbnN0YW5jZVtcImdyb3VwXCJdLCBlbWJlZGRlZGdyb3VwKTtcclxuXHJcbiAgICBPYmplY3QuYXNzaWduKGNvbXBvbmVudFJlZi5pbnN0YW5jZVtcImdyb3VwXCJdLCB7IHBhcmVudEdyb3VwOiBncm91cCwgaXNFbWJlZGRlZFBhZ2U6IHRydWUsIGVsZW1lbnRDb250YWluZXI6IGVsZW1lbnRDb250YWluZXIsIENvbnRhaW5lckZvcm1BdXRvU2Nyb2xsOiBkYXRhLkNvbnRhaW5lckZvcm1BdXRvU2Nyb2xsIH0pO1xyXG5cclxuICAgIC8vIHRvZG86IGFkZCBpbiBwcm9wXHJcbiAgICBpZiAoZGF0YSAmJiBkYXRhLkNvbnRhaW5lckZvcm1BdXRvU2Nyb2xsKSB7XHJcbiAgICAgIHRoaXMuc2Nyb2xsVG9FbWJiZWRDb21wb25lbnRQYWdlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2Nyb2xsVG9FbWJiZWRDb21wb25lbnRQYWdlKG1pbGxpU2Vjb25kczogbnVtYmVyID0gMTUwMCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgZW5kT2ZHcmlkRGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJlbmQtb2YtZ3JpZFwiKTtcclxuICAgIGNvbnN0IGVuZE9mR3JpZFBvc2l0aW9uSW5mbyA9IGVuZE9mR3JpZERpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGNvbnN0IHlDb29yID0gKGVuZE9mR3JpZFBvc2l0aW9uSW5mbz8ueSB8fCA2MzApIC0gMTA7XHJcblxyXG4gICAgY29uc3QgbWFpbklvbkNvbnRlbnQ6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaW9uLWNvbnRlbnQtbWFpbi1wYWdlXCIpO1xyXG4gICAgcmV0dXJuIG1haW5Jb25Db250ZW50LnNjcm9sbEJ5UG9pbnQoMCwgeUNvb3IsIG1pbGxpU2Vjb25kcyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2Nyb2xsVG9Ub3BPZlBhZ2UobWlsbGlTZWNvbmRzOiBudW1iZXIgPSAxNTAwKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBtYWluSW9uQ29udGVudDogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJpb24tY29udGVudC1tYWluLXBhZ2VcIik7XHJcbiAgICByZXR1cm4gbWFpbklvbkNvbnRlbnQuc2Nyb2xsVG9Qb2ludCgwLCAwLCBtaWxsaVNlY29uZHMpIGFzIFByb21pc2U8dm9pZD47XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgY2xvc2VDb250YWluZXJWaWV3KGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGlmIChncm91cFtgcGFyZW50R3JvdXBgXSAmJiBncm91cFtgcGFyZW50R3JvdXBgXVtgZTFDbG9zZUdyaWRDb250YWluZXJgXSAmJiB0eXBlb2YgZ3JvdXBbYHBhcmVudEdyb3VwYF1bYGUxQ2xvc2VHcmlkQ29udGFpbmVyYF0gPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICBncm91cFtgcGFyZW50R3JvdXBgXVtgZTFDbG9zZUdyaWRDb250YWluZXJgXShmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBwcml2YXRlIHNldEdyb3VwRm9yRGVidWdnZXIoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgY29uc3QgaXNEZWJ1Z2dpbmcgPSB0aGlzLnpjb3JlU2VydmljZS5pc0RlYnVnU2Vzc2lvbigpIHx8IGZhbHNlO1xyXG4gICAgaWYgKGlzRGVidWdnaW5nKSB7XHJcbiAgICAgIHRoaXMuZGVidWdTZXJ2aWNlLm9uSW5pdERlYnVnZ2VyKGdyb3VwKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByZWZyZXNoR3JpZChncm91cDogWkdyb3VwKSB7XHJcbiAgY29uc3QgemdyaWRDb250cm9sID0gZ3JvdXBbXCJncmlkT3B0aW9uc1wiXSBhcyBaR3JpZDtcclxuICBpZiAoemdyaWRDb250cm9sKSB7XHJcbiAgICB6Z3JpZENvbnRyb2wuZ2V0RGF0YSgpO1xyXG4gIH1cclxuICBncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG59XHJcbiJdfQ==
|