@wavemaker/app-ng-runtime 11.4.0-next.28701 → 11.4.0-rc.5342
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.
- app-ng-runtime/build-task/basic/tree/tree.build.d.ts +1 -2
- app-ng-runtime/build-task/bundles/index.umd.js +7 -9
- app-ng-runtime/build-task/bundles/index.umd.js.map +1 -1
- app-ng-runtime/build-task/esm2015/basic/tree/tree.build.js +3 -4
- app-ng-runtime/build-task/esm2015/navigation/popover/popover.build.js +3 -3
- app-ng-runtime/build-task/fesm2015/index.js +7 -9
- app-ng-runtime/build-task/fesm2015/index.js.map +1 -1
- app-ng-runtime/components/base/bundles/index.umd.js +7 -4
- app-ng-runtime/components/base/bundles/index.umd.js.map +1 -1
- app-ng-runtime/components/base/esm2015/utils/widget-utils.js +7 -4
- app-ng-runtime/components/base/esm2015/widgets/common/dialog/dialog.service.js +3 -3
- app-ng-runtime/components/base/fesm2015/index.js +8 -5
- app-ng-runtime/components/base/fesm2015/index.js.map +1 -1
- app-ng-runtime/components/base/utils/widget-utils.d.ts +1 -1
- app-ng-runtime/components/basic/tree/bundles/index.umd.js +280 -256
- app-ng-runtime/components/basic/tree/bundles/index.umd.js.map +1 -1
- app-ng-runtime/components/basic/tree/esm2015/public_api.js +2 -2
- app-ng-runtime/components/basic/tree/esm2015/tree.component.js +322 -0
- app-ng-runtime/components/basic/tree/esm2015/tree.module.js +3 -3
- app-ng-runtime/components/basic/tree/fesm2015/index.js +260 -248
- app-ng-runtime/components/basic/tree/fesm2015/index.js.map +1 -1
- app-ng-runtime/components/basic/tree/index.metadata.json +1 -1
- app-ng-runtime/components/basic/tree/public_api.d.ts +1 -1
- app-ng-runtime/components/basic/tree/tree.component.d.ts +34 -0
- app-ng-runtime/components/containers/tabs/bundles/index.umd.js +39 -23
- app-ng-runtime/components/containers/tabs/bundles/index.umd.js.map +1 -1
- app-ng-runtime/components/containers/tabs/esm2015/tab-pane/tab-pane.component.js +8 -1
- app-ng-runtime/components/containers/tabs/esm2015/tabs.animator.js +33 -13
- app-ng-runtime/components/containers/tabs/fesm2015/index.js +40 -13
- app-ng-runtime/components/containers/tabs/fesm2015/index.js.map +1 -1
- app-ng-runtime/components/containers/tabs/tabs.animator.d.ts +5 -1
- app-ng-runtime/components/data/list/bundles/index.umd.js +51 -42
- app-ng-runtime/components/data/list/bundles/index.umd.js.map +1 -1
- app-ng-runtime/components/data/list/esm2015/list.component.js +51 -42
- app-ng-runtime/components/data/list/fesm2015/index.js +50 -41
- app-ng-runtime/components/data/list/fesm2015/index.js.map +1 -1
- app-ng-runtime/components/data/list/index.metadata.json +1 -1
- app-ng-runtime/components/data/pagination/bundles/index.umd.js +21 -4
- app-ng-runtime/components/data/pagination/bundles/index.umd.js.map +1 -1
- app-ng-runtime/components/data/pagination/esm2015/pagination.component.js +22 -5
- app-ng-runtime/components/data/pagination/fesm2015/index.js +21 -4
- app-ng-runtime/components/data/pagination/fesm2015/index.js.map +1 -1
- app-ng-runtime/components/data/pagination/index.metadata.json +1 -1
- app-ng-runtime/components/data/pagination/pagination.component.d.ts +1 -0
- app-ng-runtime/components/data/table/bundles/index.umd.js +7 -0
- app-ng-runtime/components/data/table/bundles/index.umd.js.map +1 -1
- app-ng-runtime/components/data/table/esm2015/table.component.js +8 -1
- app-ng-runtime/components/data/table/fesm2015/index.js +7 -0
- app-ng-runtime/components/data/table/fesm2015/index.js.map +1 -1
- app-ng-runtime/components/data/table/index.metadata.json +1 -1
- app-ng-runtime/components/dialogs/default/base-dialog.d.ts +1 -0
- app-ng-runtime/components/dialogs/default/bundles/index.umd.js +13 -4
- app-ng-runtime/components/dialogs/default/bundles/index.umd.js.map +1 -1
- app-ng-runtime/components/dialogs/default/esm2015/base-dialog.js +14 -6
- app-ng-runtime/components/dialogs/default/fesm2015/index.js +13 -5
- app-ng-runtime/components/dialogs/default/fesm2015/index.js.map +1 -1
- app-ng-runtime/components/dialogs/default/index.metadata.json +1 -1
- app-ng-runtime/components/input/epoch/bundles/index.umd.js +66 -29
- app-ng-runtime/components/input/epoch/bundles/index.umd.js.map +1 -1
- app-ng-runtime/components/input/epoch/date-time/date-time-picker.component.d.ts +1 -0
- app-ng-runtime/components/input/epoch/esm2015/base-date-time.component.js +43 -25
- app-ng-runtime/components/input/epoch/esm2015/date/date.component.js +3 -3
- app-ng-runtime/components/input/epoch/esm2015/date-time/date-time-picker.component.js +31 -11
- app-ng-runtime/components/input/epoch/esm2015/date-time/date-time.component.js +2 -2
- app-ng-runtime/components/input/epoch/fesm2015/index.js +75 -37
- app-ng-runtime/components/input/epoch/fesm2015/index.js.map +1 -1
- app-ng-runtime/components/input/epoch/index.metadata.json +1 -1
- app-ng-runtime/components/navigation/popover/bundles/index.umd.js +3 -4
- app-ng-runtime/components/navigation/popover/bundles/index.umd.js.map +1 -1
- app-ng-runtime/components/navigation/popover/esm2015/popover.component.js +5 -6
- app-ng-runtime/components/navigation/popover/fesm2015/index.js +4 -5
- app-ng-runtime/components/navigation/popover/fesm2015/index.js.map +1 -1
- app-ng-runtime/mobile/components/page/default/bundles/index.umd.js +24 -6
- app-ng-runtime/mobile/components/page/default/bundles/index.umd.js.map +1 -1
- app-ng-runtime/mobile/components/page/default/esm2015/page.directive.js +20 -3
- app-ng-runtime/mobile/components/page/default/fesm2015/index.js +19 -2
- app-ng-runtime/mobile/components/page/default/fesm2015/index.js.map +1 -1
- app-ng-runtime/mobile/components/page/default/index.metadata.json +1 -1
- app-ng-runtime/mobile/components/page/default/page.directive.d.ts +4 -1
- app-ng-runtime/package.json +1 -1
- app-ng-runtime/scripts/datatable/datatable.js +23 -23
- app-ng-runtime/scripts/tree-keyboard-navigation/keyboard-navigation.js +251 -0
- app-ng-runtime/variables/bundles/index.umd.js +14 -4
- app-ng-runtime/variables/bundles/index.umd.js.map +1 -1
- app-ng-runtime/variables/esm2015/manager/action/notification-action.manager.js +5 -6
- app-ng-runtime/variables/esm2015/service/variables.service.js +8 -1
- app-ng-runtime/variables/fesm2015/index.js +11 -5
- app-ng-runtime/variables/fesm2015/index.js.map +1 -1
- app-ng-runtime/variables/index.metadata.json +1 -1
- app-ng-runtime/variables/service/variables.service.d.ts +4 -0
- app-ng-runtime/components/basic/tree/esm2015/tree.directive.js +0 -310
- app-ng-runtime/components/basic/tree/tree.directive.d.ts +0 -35
|
@@ -593,9 +593,10 @@ export class ListComponent extends StylableComponent {
|
|
|
593
593
|
}
|
|
594
594
|
}
|
|
595
595
|
// Triggers after the sorting.
|
|
596
|
-
onUpdate(evt, ui) {
|
|
596
|
+
onUpdate(evt, ui, presentIndex) {
|
|
597
597
|
const data = this.fieldDefs;
|
|
598
|
-
|
|
598
|
+
// If ui is not present then it is called from drag and drop using keyboard
|
|
599
|
+
const newIndex = ui === undefined ? presentIndex : ui.item.index();
|
|
599
600
|
const oldIndex = this.$ulEle.data('oldIndex');
|
|
600
601
|
const minIndex = _.min([newIndex, oldIndex]);
|
|
601
602
|
const maxIndex = _.max([newIndex, oldIndex]);
|
|
@@ -741,27 +742,20 @@ export class ListComponent extends StylableComponent {
|
|
|
741
742
|
}
|
|
742
743
|
if (action === 'focusPrev') {
|
|
743
744
|
if (this.isListElementMovable) {
|
|
744
|
-
let prev;
|
|
745
745
|
presentIndex = presentIndex <= 0 ? 0 : (presentIndex);
|
|
746
|
-
this.lastSelectedItem = this.getListItemByIndex(presentIndex);
|
|
747
746
|
if (presentIndex === 0) {
|
|
748
|
-
prev = this.listItems.last;
|
|
749
747
|
return;
|
|
750
748
|
}
|
|
751
|
-
this.
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
this.ariaText = "selected ";
|
|
762
|
-
}
|
|
763
|
-
prev = $liItem;
|
|
764
|
-
});
|
|
749
|
+
this.lastSelectedItem = this.getListItemByIndex(presentIndex);
|
|
750
|
+
const prevElt = this.getListItemByIndex(presentIndex - 1);
|
|
751
|
+
prevElt.nativeElement.before(this.lastSelectedItem.nativeElement);
|
|
752
|
+
this.lastSelectedItem.nativeElement.focus();
|
|
753
|
+
this.statePersistence.removeWidgetState(this, 'selectedItem');
|
|
754
|
+
const arr = this.listItems.toArray();
|
|
755
|
+
[arr[presentIndex - 1], arr[presentIndex]] = [arr[presentIndex], arr[presentIndex - 1]];
|
|
756
|
+
this.listItems.reset(arr);
|
|
757
|
+
this.currentIndex = presentIndex;
|
|
758
|
+
this.ariaText = "selected ";
|
|
765
759
|
}
|
|
766
760
|
else {
|
|
767
761
|
presentIndex = presentIndex <= 0 ? 0 : (presentIndex - 1);
|
|
@@ -773,27 +767,20 @@ export class ListComponent extends StylableComponent {
|
|
|
773
767
|
}
|
|
774
768
|
else if (action === 'focusNext') {
|
|
775
769
|
if (this.isListElementMovable) {
|
|
776
|
-
let prev;
|
|
777
770
|
presentIndex = presentIndex < (listItems.length - 1) ? (presentIndex) : (listItems.length - 1);
|
|
778
|
-
this.lastSelectedItem = this.getListItemByIndex(presentIndex);
|
|
779
771
|
if (presentIndex === this.listItems.length - 1) {
|
|
780
|
-
prev = this.listItems.first;
|
|
781
772
|
return;
|
|
782
773
|
}
|
|
783
|
-
this.
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
this.ariaText = "selected ";
|
|
794
|
-
}
|
|
795
|
-
prev = $liItem;
|
|
796
|
-
});
|
|
774
|
+
this.lastSelectedItem = this.getListItemByIndex(presentIndex);
|
|
775
|
+
const nextElt = this.getListItemByIndex(presentIndex + 1);
|
|
776
|
+
nextElt.nativeElement.after(this.lastSelectedItem.nativeElement);
|
|
777
|
+
this.lastSelectedItem.nativeElement.focus();
|
|
778
|
+
this.statePersistence.removeWidgetState(this, 'selectedItem');
|
|
779
|
+
const arr = this.listItems.toArray();
|
|
780
|
+
[arr[presentIndex], arr[presentIndex + 1]] = [arr[presentIndex + 1], arr[presentIndex]];
|
|
781
|
+
this.listItems.reset(arr);
|
|
782
|
+
this.currentIndex = presentIndex + 2;
|
|
783
|
+
this.ariaText = "selected ";
|
|
797
784
|
}
|
|
798
785
|
else {
|
|
799
786
|
presentIndex = presentIndex < (listItems.length - 1) ? (presentIndex + 1) : (listItems.length - 1);
|
|
@@ -819,12 +806,13 @@ export class ListComponent extends StylableComponent {
|
|
|
819
806
|
this.isListElementMovable = !this.isListElementMovable;
|
|
820
807
|
this.onItemClick($event, this.getListItemByIndex(presentIndex));
|
|
821
808
|
this.currentIndex = presentIndex + 1;
|
|
822
|
-
let name = this.getListItemByIndex(presentIndex).item.name;
|
|
823
809
|
if (this.isListElementMovable) {
|
|
824
|
-
this.ariaText =
|
|
810
|
+
this.ariaText = `Item ${this.currentIndex} grabbed, current position `;
|
|
811
|
+
this.$ulEle.data('oldIndex', presentIndex);
|
|
825
812
|
}
|
|
826
813
|
else {
|
|
827
|
-
this.ariaText =
|
|
814
|
+
this.ariaText = `Item ${this.currentIndex} dropped, final position `;
|
|
815
|
+
this.onUpdate($event, undefined, presentIndex);
|
|
828
816
|
}
|
|
829
817
|
}
|
|
830
818
|
}
|
|
@@ -876,11 +864,13 @@ export class ListComponent extends StylableComponent {
|
|
|
876
864
|
this.dataNavigator.maxResults = nv;
|
|
877
865
|
}
|
|
878
866
|
else if (key === 'enablereorder') {
|
|
879
|
-
if (nv) {
|
|
867
|
+
if (nv && this.$ulEle) {
|
|
868
|
+
this.$ulEle.attr('aria-describedby', this.titleId);
|
|
880
869
|
this.configureDnD();
|
|
881
870
|
this.$ulEle.sortable('enable');
|
|
882
871
|
}
|
|
883
872
|
else if (this.$ulEle && !nv) {
|
|
873
|
+
this.$ulEle.removeAttr('aria-describedby');
|
|
884
874
|
this.$ulEle.sortable('disable');
|
|
885
875
|
}
|
|
886
876
|
}
|
|
@@ -1044,9 +1034,18 @@ export class ListComponent extends StylableComponent {
|
|
|
1044
1034
|
super.ngAfterViewInit();
|
|
1045
1035
|
this.setUpCUDHandlers();
|
|
1046
1036
|
this.selectedItemWidgets = this.multiselect ? [] : {};
|
|
1037
|
+
var ele = $(this.nativeElement).find('.app-livelist-container');
|
|
1047
1038
|
if (this.enablereorder && !this.groupby) {
|
|
1039
|
+
if (ele) {
|
|
1040
|
+
ele.attr('aria-describedby', this.titleId);
|
|
1041
|
+
}
|
|
1048
1042
|
this.configureDnD();
|
|
1049
1043
|
}
|
|
1044
|
+
if (!this.enablereorder) {
|
|
1045
|
+
if (ele) {
|
|
1046
|
+
ele.removeAttr('aria-describedby');
|
|
1047
|
+
}
|
|
1048
|
+
}
|
|
1050
1049
|
if (this.groupby && this.collapsible) {
|
|
1051
1050
|
this.handleHeaderClick = handleHeaderClick;
|
|
1052
1051
|
this.toggleAllHeaders = toggleAllHeaders.bind(undefined, this);
|
|
@@ -1056,6 +1055,16 @@ export class ListComponent extends StylableComponent {
|
|
|
1056
1055
|
this.setupHandlers();
|
|
1057
1056
|
const $ul = this.nativeElement.querySelector('ul.app-livelist-container');
|
|
1058
1057
|
styler($ul, this, APPLY_STYLES_TYPE.SCROLLABLE_CONTAINER);
|
|
1058
|
+
if (this.enablereorder) {
|
|
1059
|
+
if ($ul) {
|
|
1060
|
+
$ul.setAttribute('aria-describedby', this.titleId);
|
|
1061
|
+
}
|
|
1062
|
+
}
|
|
1063
|
+
if (!this.enablereorder) {
|
|
1064
|
+
if ($ul) {
|
|
1065
|
+
$ul.removeAttribute('aria-describedby');
|
|
1066
|
+
}
|
|
1067
|
+
}
|
|
1059
1068
|
if (isMobileApp() && $ul.querySelector('.app-list-item-action-panel')) {
|
|
1060
1069
|
this._listAnimator = new ListAnimator(this);
|
|
1061
1070
|
}
|
|
@@ -1076,7 +1085,7 @@ ListComponent.initializeProps = registerProps();
|
|
|
1076
1085
|
ListComponent.decorators = [
|
|
1077
1086
|
{ type: Component, args: [{
|
|
1078
1087
|
selector: 'div[wmList]',
|
|
1079
|
-
template: "<div class=\"panel-heading\" *ngIf=\"title || subheading || iconclass\">\n <h3 class=\"panel-title\">\n <div class=\"pull-left\">\n <i class=\"app-icon panel-icon {{iconclass}}\" aria-hidden=\"true\" [hidden]=\"!iconclass\"></i>\n </div>\n <div class=\"pull-left\">\n <div class=\"heading\" [innerHTML]=\"title\"></div>\n <div class=\"description\" [innerHTML]=\"subheading\"></div>\n </div>\n </h3>\n</div>\n\n<
|
|
1088
|
+
template: "<div class=\"panel-heading\" *ngIf=\"title || subheading || iconclass\">\n <h3 class=\"panel-title\">\n <div class=\"pull-left\">\n <i class=\"app-icon panel-icon {{iconclass}}\" aria-hidden=\"true\" [hidden]=\"!iconclass\"></i>\n </div>\n <div class=\"pull-left\">\n <div class=\"heading\" [innerHTML]=\"title\"></div>\n <div class=\"description\" [innerHTML]=\"subheading\"></div>\n </div>\n </h3>\n</div>\n\n<div class=\"app-datanavigator\" [attr.aria-disabled]=\"dataNavigator.isDisablePrevious\" aria-label=\"Page navigation\" *ngIf=\"navigation === 'Inline' && !noDataFound\">\n <ul class=\"pager\">\n <li class=\"previous\" [ngClass]=\"{'disabled': (dataNavigator ? dataNavigator.isDisablePrevious : true)}\">\n <a href=\"javascript:void(0);\" (click)=\"dataNavigator.navigatePage('prev', $event)\"\n [attr.aria-disabled]=\"dataNavigator.isDisablePrevious\">\n <i class=\"wi wi-chevron-left\" aria-hidden=\"true\"></i>\n <span class=\"sr-only\">Go to Previous page {{dataNavigator.isDisablePrevious ? ', Disabled' : ''}}</span>\n </a>\n </li>\n </ul>\n</div>\n<div *ngIf=\"navigation === 'Inline' && !noDataFound\" aria-live=\"polite\" aria-atomic=\"true\" class=\"sr-only\"> {{'Page ' + dataNavigator.dn.currentPage + ' of ' + dataNavigator.pageCount }}</div>\n\n<div>\n <div id={{titleId}} class=\"sr-only\" *ngIf=\"enablereorder\">\n Press space bar to toggle drag drop mode, use arrow keys to move selected elements.\n </div>\n\n <div aria-live=\"assertive\" *ngIf=\"listItems && enablereorder && currentIndex\" class=\"sr-only\" >\n {{ariaText + currentIndex + ' of ' + listItems.length}}\n </div>\n</div>\n\n<ul [attr.tabindex]=\"tabindex\" class=\"app-livelist-container clearfix {{direction === 'horizontal' ? 'app-horizontal-list': ''}} {{listclass}}\" role=\"list\"\n (keydown.enter)=\"handleKeyDown($event, 'select')\"\n\n (keydown.space)=\"handleKeyDown($event, 'space')\"\n\n (keydown.arrowup)=\"handleKeyDown($event, 'focusPrev')\"\n (keydown.arrowdown)=\"handleKeyDown($event, 'focusNext')\"\n (keydown.arrowleft)=\"handleKeyDown($event, 'focusPrev')\"\n (keydown.arrowright)=\"handleKeyDown($event, 'focusNext')\"\n\n (keydown.shift.arrowup)=\"handleKeyDown($event, 'selectPrev')\"\n (keydown.shift.arrowdown)=\"handleKeyDown($event, 'selectNext')\"\n (keydown.shift.arrowleft)=\"handleKeyDown($event, 'selectPrev')\"\n (keydown.shift.arrowright)=\"handleKeyDown($event, 'selectNext')\"\n [hidden]=\"noDataFound && !variableInflight\"\n>\n <ng-template [ngIf]=\"!groupby\" [ngIfElse]=\"groupedListTemplate\">\n <li *ngFor=\"let item of fieldDefs; index as $index; first as $first; last as $last;\" class=\"app-list-item {{direction === 'horizontal' ? '' : itemsPerRowClass}}\" [ngClass]=\"listItemRef.itemClass\"\n [wmListItem]=\"item\"\n #listItemRef=\"listItemRef\"\n [attr.tabindex]=\"tabindex\"\n role=\"listitem\">\n <ng-container [ngTemplateOutlet]=\"listTemplate\" [ngTemplateOutletContext]=\"{item: item, $index: $index, itemRef: listItemRef, $first: $first, $last: $last, currentItemWidgets: listItemRef.currentItemWidgets}\"></ng-container>\n </li>\n </ng-template>\n <ng-container [ngTemplateOutlet]=\"listLeftActionTemplate\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"listRightActionTemplate\"></ng-container>\n</ul>\n\n<div class=\"no-data-msg\" *ngIf=\"noDataFound && !variableInflight\" [textContent]=\"nodatamessage\"></div>\n\n<div class=\"loading-data-msg\" *ngIf=\"variableInflight && !pulltorefresh\">\n <span>\n <i class=\"app-icon panel-icon fa-spin\" aria-hidden=\"true\" [ngClass]=\"loadingicon\"></i>\n <span class=\"sr-only\">Loading</span>\n <span class=\"loading-text\" [textContent]=\"loadingdatamsg\"></span>\n </span>\n</div>\n\n<div class=\"app-datanavigator\" [attr.aria-disabled]=\"dataNavigator.isDisableNext\" *ngIf=\"navigation === 'Inline' && !noDataFound\">\n <ul class=\"pager\">\n <li class=\"next\" [ngClass]=\"{'disabled': (dataNavigator ? dataNavigator.isDisableNext : true)}\">\n <a href=\"javascript:void(0);\" (click)=\"dataNavigator.navigatePage('next', $event)\"\n [attr.aria-disabled]=\"dataNavigator.isDisableNext\">\n <i class=\"wi wi-chevron-right\" aria-hidden=\"true\"></i>\n <span class=\"sr-only\">Go to Next page {{dataNavigator.isDisableNext ? ', Disabled' : ''}}</span>\n </a>\n </li>\n </ul>\n</div>\n\n<div class=\"panel-footer\" *ngIf=\"navigation !== 'None'\" [hidden]=\"!showNavigation || (onDemandLoad && dataNavigator.isDisableNext) || (dataNavigator.dataSize <= pagesize) || (!dataNavigator.dataSize && !dataNavigator.datasource?.pagination?.next)\">\n <nav wmPagination\n navigationalign.bind=\"navigationalign\"\n navigation.bind=\"navControls\"\n showrecordcount.bind=\"showrecordcount\"\n maxsize.bind=\"maxsize\"\n boundarylinks.bind=\"boundarylinks\"\n forceellipses.bind=\"forceellipses\"\n directionlinks.bind=\"directionlinks\"\n show.bind=\"!onDemandLoad\"\n paginationchange.event=\"beforePaginationChange($event, $index)\"\n ></nav>\n <a *ngIf=\"onDemandLoad\" href=\"javascript:void(0);\"\n (click)=\"dataNavigator.navigatePage('next', $event)\"\n class=\"app-button btn btn-block\"\n [ngClass]=\"paginationclass\"\n [textContent]=\"ondemandmessage\"\n ></a>\n</div>\n\n<!--This template will be displayed when groupby is specified-->\n<ng-template #groupedListTemplate>\n <li *ngFor=\"let groupObj of groupedData\" class=\"app-list-item-group clearfix\">\n <ul [attr.tabindex]=\"tabindex\" class=\"list-group item-group\" [ngClass]=\"listclass\">\n <li class=\"app-list-item-header list-item list-group-header\" (click)=\"handleHeaderClick($event)\" [ngClass]=\"{'collapsible-content': collapsible}\">\n <h4>{{groupObj.key}}\n <div class=\"header-action\">\n <i class=\"app-icon wi action wi-chevron-up\" *ngIf=\"collapsible\"></i>\n <span *ngIf=\"showcount\" class=\"label label-default\">{{groupObj.data.length}}</span>\n </div>\n </h4>\n </li>\n <ul class=\"list-group clearfix {{direction === 'horizontal' ? 'app-horizontal-list': ''}}\">\n <li *ngFor=\"let item of groupObj.data; index as $index; first as $first; last as $last;\" [attr.tabindex]=\"tabindex\"\n class=\"app-list-item group-list-item {{itemsPerRowClass}}\"\n [ngClass]=\"listItemRef.itemClass\"\n [wmListItem]=\"item\" #listItemRef=\"listItemRef\">\n <ng-container [ngTemplateOutlet]=\"listTemplate\" [ngTemplateOutletContext]=\"{item: item, $index: $index, itemRef: listItemRef, $first: $first, $last: $last, currentItemWidgets: listItemRef.currentItemWidgets}\"></ng-container>\n </li>\n </ul>\n </ul>\n </li>\n</ng-template>\n",
|
|
1080
1089
|
providers: [
|
|
1081
1090
|
provideAsWidgetRef(ListComponent)
|
|
1082
1091
|
]
|
|
@@ -1106,4 +1115,4 @@ ListComponent.propDecorators = {
|
|
|
1106
1115
|
dataNavigator: [{ type: ViewChild, args: [PaginationComponent,] }],
|
|
1107
1116
|
listItems: [{ type: ViewChildren, args: [ListItemDirective,] }]
|
|
1108
1117
|
};
|
|
1109
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3dpZGdldHMvZGF0YS9saXN0L3NyYy9saXN0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBYyxRQUFRLEVBQUUsTUFBTSxFQUFxQixTQUFTLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJeE4sT0FBTyxFQUNILFVBQVUsRUFDVixlQUFlLEVBQ2YsR0FBRyxFQUNILFdBQVcsRUFDWCxVQUFVLEVBQ1YsZUFBZSxFQUNmLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsUUFBUSxFQUNSLFdBQVcsRUFDWCxRQUFRLEVBQ1IsUUFBUSxFQUNSLElBQUksRUFDSixXQUFXLEVBQ1gsZ0JBQWdCLEVBQ2hCLGlCQUFpQixFQUNqQixZQUFZLEVBQ1osWUFBWSxFQUNmLE1BQU0sVUFBVSxDQUFDO0FBQ2xCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsZ0NBQWdDLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBYSxxQkFBcUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3pTLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFE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dCwgQXR0cmlidXRlLCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBDb250ZW50Q2hpbGQsIENvbnRlbnRDaGlsZHJlbiwgRWxlbWVudFJlZiwgSW5qZWN0b3IsIE5nWm9uZSwgT25EZXN0cm95LCBPbkluaXQsIFF1ZXJ5TGlzdCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCwgVmlld0NoaWxkcmVuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge1xuICAgICRhcHBEaWdlc3QsXG4gICAgJGludm9rZVdhdGNoZXJzLFxuICAgIEFwcCxcbiAgICBBcHBEZWZhdWx0cyxcbiAgICBEYXRhU291cmNlLFxuICAgIGdldENsb25lZE9iamVjdCxcbiAgICBpc0RhdGFTb3VyY2VFcXVhbCxcbiAgICBpc0RlZmluZWQsXG4gICAgaXNNb2JpbGUsXG4gICAgaXNNb2JpbGVBcHAsXG4gICAgaXNOdW1iZXIsXG4gICAgaXNPYmplY3QsXG4gICAgbm9vcCxcbiAgICBzd2l0Y2hDbGFzcyxcbiAgICBTdGF0ZVBlcnNpc3RlbmNlLFxuICAgIFBhZ2luYXRpb25TZXJ2aWNlLFxuICAgIHNldExpc3RDbGFzcyxcbiAgICBnZW5lcmF0ZUdVSWRcbn0gZnJvbSAnQHdtL2NvcmUnO1xuaW1wb3J0IHsgQVBQTFlfU1RZTEVTX1RZUEUsIGNvbmZpZ3VyZURuRCwgREVCT1VOQ0VfVElNRVMsIGdldE9yZGVyZWREYXRhc2V0LCBncm91cERhdGEsIGhhbmRsZUhlYWRlckNsaWNrLCBOQVZJR0FUSU9OX1RZUEUsIHVuc3VwcG9ydGVkU3RhdGVQZXJzaXN0ZW5jZVR5cGVzLCBwcm92aWRlQXNXaWRnZXRSZWYsIFN0eWxhYmxlQ29tcG9uZW50LCBzdHlsZXIsIFRvRGF0ZVBpcGUsIHRvZ2dsZUFsbEhlYWRlcnMsIFdpZGdldFJlZiwgZXh0cmFjdERhdGFTb3VyY2VOYW1lIH0gZnJvbSAnQHdtL2NvbXBvbmVudHMvYmFzZSc7XG5pbXBvcnQgeyBQYWdpbmF0aW9uQ29tcG9uZW50IH0gZnJvbSAnQHdtL2NvbXBvbmVudHMvZGF0YS9wYWdpbmF0aW9uJztcbmltcG9ydCB7IEJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJ0B3bS9jb21wb25lbnRzL2lucHV0JztcblxuaW1wb3J0IHsgcmVnaXN0ZXJQcm9wcyB9IGZyb20gJy4vbGlzdC5wcm9wcyc7XG5pbXBvcnQgeyBMaXN0SXRlbURpcmVjdGl2ZSB9IGZyb20gJy4vbGlzdC1pdGVtLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBMaXN0QW5pbWF0b3IgfSBmcm9tICcuL2xpc3QuYW5pbWF0b3InO1xuXG5kZWNsYXJlIGNvbnN0IF87XG5kZWNsYXJlIGNvbnN0ICQ7XG5cbmNvbnN0IERFRkFVTFRfQ0xTID0gJ2FwcC1saXZlbGlzdCBhcHAtcGFuZWwnO1xuY29uc3QgV0lER0VUX0NPTkZJRyA9IHt3aWRnZXRUeXBlOiAnd20tbGlzdCcsIGhvc3RDbGFzczogREVGQVVMVF9DTFN9O1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2Rpdlt3bUxpc3RdJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vbGlzdC5jb21wb25lbnQuaHRtbCcsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHByb3ZpZGVBc1dpZGdldFJlZihMaXN0Q29tcG9uZW50KVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgTGlzdENvbXBvbmVudCBleHRlbmRzIFN0eWxhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAgIHN0YXRpYyBpbml0aWFsaXplUHJvcHMgPSByZWdpc3RlclByb3BzKCk7XG5cbiAgICBAQ29udGVudENoaWxkKCdsaXN0VGVtcGxhdGUnKSBsaXN0VGVtcGxhdGU6IFRlbXBsYXRlUmVmPEVsZW1lbnRSZWY+O1xuXG4gICAgQENvbnRlbnRDaGlsZCgnbGlzdExlZnRBY3Rpb25UZW1wbGF0ZScpIGxpc3RMZWZ0QWN0aW9uVGVtcGxhdGU6ICBUZW1wbGF0ZVJlZjxFbGVtZW50UmVmPjtcbiAgICBAQ29udGVudENoaWxkKCdsaXN0UmlnaHRBY3Rpb25UZW1wbGF0ZScpIGxpc3RSaWdodEFjdGlvblRlbXBsYXRlOiAgVGVtcGxhdGVSZWY8RWxlbWVudFJlZj47XG4gICAgQENvbnRlbnRDaGlsZHJlbihCdXR0b25Db21wb25lbnQpIGJ0bkNvbXBvbmVudHM7XG5cbiAgICBAVmlld0NoaWxkKFBhZ2luYXRpb25Db21wb25lbnQpIGRhdGFOYXZpZ2F0b3I7XG4gICAgQFZpZXdDaGlsZHJlbihMaXN0SXRlbURpcmVjdGl2ZSkgbGlzdEl0ZW1zOiBRdWVyeUxpc3Q8TGlzdEl0ZW1EaXJlY3RpdmU+O1xuXG4gICAgcHJpdmF0ZSBpdGVtc1BlclJvd0NsYXNzOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBmaXJzdFNlbGVjdGVkSXRlbTogTGlzdEl0ZW1EaXJlY3RpdmU7XG4gICAgcHJpdmF0ZSBuYXZpZ2F0b3JNYXhSZXN1bHRXYXRjaDogU3Vic2NyaXB0aW9uO1xuICAgIHByaXZhdGUgbmF2aWdhdG9yUmVzdWx0V2F0Y2g6IFN1YnNjcmlwdGlvbjtcbiAgICBwcml2YXRlIG5hdkNvbnRyb2xzOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBvbkRlbWFuZExvYWQ6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBfaXRlbXM6IEFycmF5PGFueT47XG4gICAgcHJpdmF0ZSBkYXRhTmF2aWdhdG9yV2F0Y2hlZDogYm9vbGVhbjtcbiAgICBwcml2YXRlIGRhdGFzb3VyY2U6IGFueTtcbiAgICBwcml2YXRlIHNob3dOYXZpZ2F0aW9uOiBib29sZWFuO1xuICAgIHB1YmxpYyBub0RhdGFGb3VuZDogYm9vbGVhbjtcbiAgICBwcml2YXRlIHJlb3JkZXJQcm9wczogYW55O1xuICAgIHByaXZhdGUgYXBwOiBhbnk7XG4gICAgcHJpdmF0ZSBhcHBEZWZhdWx0czogYW55O1xuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmU7XG4gICAgcHJpdmF0ZSBzdGF0ZVBlcnNpc3RlbmNlOiBTdGF0ZVBlcnNpc3RlbmNlO1xuICAgIHByaXZhdGUgcGFnaW5hdGlvblNlcnZpY2U6IFBhZ2luYXRpb25TZXJ2aWNlO1xuXG4gICAgcHVibGljIGxhc3RTZWxlY3RlZEl0ZW06IExpc3RJdGVtRGlyZWN0aXZlO1xuICAgIHB1YmxpYyBmaWVsZERlZnM6IEFycmF5PGFueT47XG4gICAgcHVibGljIGRpc2FibGVpdGVtO1xuICAgIHB1YmxpYyBuYXZpZ2F0aW9uOiBzdHJpbmc7XG4gICAgcHVibGljIG5hdmlnYXRpb25hbGlnbjogc3RyaW5nO1xuICAgIHB1YmxpYyBwYWdlc2l6ZTogbnVtYmVyO1xuICAgIHB1YmxpYyBkYXRhc2V0OiBhbnk7XG4gICAgcHVibGljIG11bHRpc2VsZWN0OiBib29sZWFuO1xuICAgIHB1YmxpYyBzZWxlY3RmaXJzdGl0ZW06IGJvb2xlYW47XG4gICAgcHVibGljIG9yZGVyYnk6IHN0cmluZztcbiAgICBwdWJsaWMgbG9hZGluZ2ljb246IHN0cmluZztcbiAgICBwdWJsaWMgcGFnaW5hdGlvbmNsYXNzOiBzdHJpbmc7XG4gICAgcHVibGljIG9uZGVtYW5kbWVzc2FnZTogc3RyaW5nO1xuICAgIHB1YmxpYyBsb2FkaW5nZGF0YW1zZzogc3RyaW5nO1xuICAgIHB1YmxpYyBzZWxlY3Rpb25saW1pdDogbnVtYmVyO1xuICAgIHB1YmxpYyBpbmZTY3JvbGw6IGJvb2xlYW47XG4gICAgcHVibGljIGVuYWJsZXJlb3JkZXI6IGJvb2xlYW47XG4gICAgcHVibGljIGl0ZW1zcGVycm93OiBzdHJpbmc7XG4gICAgcHVibGljIGl0ZW1jbGFzczogc3RyaW5nO1xuICAgIHB1YmxpYyBzZWxlY3RlZEl0ZW1XaWRnZXRzOiBBcnJheTxXaWRnZXRSZWY+IHwgV2lkZ2V0UmVmO1xuICAgIHB1YmxpYyB2YXJpYWJsZUluZmxpZ2h0O1xuICAgIHB1YmxpYyBuYW1lO1xuICAgIHB1YmxpYyBjdXJyZW50UGFnZTtcbiAgICBwdWJsaWMgZGlyZWN0aW9uO1xuICAgIHB1YmxpYyB0YWJpbmRleDtcblxuICAgIHB1YmxpYyBoYW5kbGVIZWFkZXJDbGljazogRnVuY3Rpb247XG4gICAgcHVibGljIHRvZ2dsZUFsbEhlYWRlcnM6IHZvaWQ7XG4gICAgcHVibGljIGdyb3VwYnk6IHN0cmluZztcbiAgICBwdWJsaWMgY29sbGFwc2libGU6IHN0cmluZztcbiAgICBwdWJsaWMgZGF0ZVBpcGU6IFRvRGF0ZVBpcGU7XG4gICAgcHVibGljIGJpbmRpdGVtY2xhc3M6IHN0cmluZztcbiAgICBwdWJsaWMgYmluZGRpc2FibGVpdGVtOiBzdHJpbmc7XG4gICAgcHVibGljIGJpbmRkYXRhc2V0OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBiaW5kZGF0YXNvdXJjZTogc3RyaW5nO1xuICAgIHB1YmxpYyBtb3VzZUVudGVyQ0I6IHN0cmluZztcbiAgICBwdWJsaWMgbW91c2VMZWF2ZUNCOiBzdHJpbmc7XG5cbiAgICBwcml2YXRlIG1hdGNoOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBkYXRlZm9ybWF0OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBncm91cGVkRGF0YTogYW55O1xuICAgIHByaXZhdGUgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmO1xuICAgIHByaXZhdGUgcHJvbWlzZVJlc29sdmVyRm46IEZ1bmN0aW9uO1xuICAgIHByaXZhdGUgcHJvcHNJbml0UHJvbWlzZTogUHJvbWlzZTxhbnk+O1xuICAgIHByaXZhdGUgJHVsRWxlOiBhbnk7XG4gICAgcHJpdmF0ZSBfbGlzdEFuaW1hdG9yOiBMaXN0QW5pbWF0b3I7XG4gICAgcHVibGljIHB1bGx0b3JlZnJlc2g6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBfbGlzdGVuZXJEZXN0cm95ZXJzOiBBcnJheTxhbnk+O1xuICAgIHByaXZhdGUgZGVib3VuY2VkRmV0Y2hOZXh0RGF0YXNldE9uU2Nyb2xsOiBGdW5jdGlvbjtcblxuICAgIHB1YmxpYyB0aXRsZTogc3RyaW5nO1xuICAgIHB1YmxpYyBzdWJoZWFkaW5nOiBzdHJpbmc7XG4gICAgcHVibGljIGljb25jbGFzczogc3RyaW5nO1xuICAgIHB1YmxpYyBsaXN0Y2xhc3M6IGFueTtcbiAgICBwcml2YXRlIGlzRGF0YUNoYW5nZWQ6IGJvb2xlYW47XG4gICAgcHVibGljIHN0YXRlaGFuZGxlcjogYW55O1xuICAgIHByaXZhdGUgaXNMaXN0RWxlbWVudE1vdmFibGUgOiBib29sZWFuO1xuICAgIHB1YmxpYyBjdXJyZW50SW5kZXg6IG51bWJlcjtcbiAgICBwcml2YXRlIGFyaWFUZXh0OiBTdHJpbmc7XG4gICAgcHVibGljIHRpdGxlSWQ6IHN0cmluZyA7XG5cbiAgICBfaXNEZXBlbmRlbnQ7XG4gICAgcHJpdmF0ZSBfcGFnZUxvYWQ7XG4gICAgcHJpdmF0ZSBfc2VsZWN0ZWRJdGVtc0V4aXN0O1xuXG4gICAgcHJpdmF0ZSB0b3VjaGluZztcbiAgICBwcml2YXRlIHRvdWNoZWQ7XG5cbiAgICBwdWJsaWMgZ2V0IHNlbGVjdGVkaXRlbSgpIHtcbiAgICAgICAgaWYgKHRoaXMubXVsdGlzZWxlY3QpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRDbG9uZWRPYmplY3QodGhpcy5faXRlbXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfLmlzRW1wdHkodGhpcy5faXRlbXMpKSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdldENsb25lZE9iamVjdCh0aGlzLl9pdGVtc1swXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBsaXN0IG9mIHdpZGdldHMgcHJlc2VudCBvbiBsaXN0IGl0ZW0gYnkgY29uc2lkZXJpbmcgbmFtZSBhbmQgaW5kZXggb2YgdGhlIHdpZGdldC5cbiAgICAgKiBJZiB3ZSBkaWQnbnQgcGFzcyBpbmRleCwgaXQgcmV0dXJucyBhcnJheSBvZiBhbGwgdGhlIHdpZGdldHMgd2hpY2ggYXJlIG1hdGNoaW5nIHRvIHdpZGdldCBuYW1lXG4gICAgICogQHBhcmFtIHdpZGd0ZU5hbWU6IE5hbWUgb2YgdGhlIHdpZGdldFxuICAgICAqIEBwYXJhbSBpbmRleDogSW5kZXggb2YgdGhlIHdpZGdldFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRXaWRnZXRzKHdpZGd0ZU5hbWU6IHN0cmluZywgaW5kZXg6IG51bWJlcikge1xuICAgICAgICBsZXQgJHRhcmdldDtcbiAgICAgICAgY29uc3QgcmV0VmFsID0gW107XG5cbiAgICAgICAgaWYgKCF3aWRndGVOYW1lKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzRGVmaW5lZChpbmRleCkpIHtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh0aGlzLmxpc3RJdGVtcy50b0FycmF5KCksIChlbCkgPT4ge1xuICAgICAgICAgICAgICAgICR0YXJnZXQgPSBfLmdldChlbC5jdXJyZW50SXRlbVdpZGdldHMsIHdpZGd0ZU5hbWUpO1xuICAgICAgICAgICAgICAgIGlmICgkdGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbC5wdXNoKCR0YXJnZXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICB9XG4gICAgICAgIGluZGV4ID0gK2luZGV4IHx8IDA7XG5cbiAgICAgICAgJHRhcmdldCA9IF8uZ2V0KHRoaXMubGlzdEl0ZW1zLnRvQXJyYXkoKSwgaW5kZXgpO1xuXG4gICAgICAgIGlmICgkdGFyZ2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gW18uZ2V0KCR0YXJnZXQuY3VycmVudEl0ZW1XaWRnZXRzLCB3aWRndGVOYW1lKV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyByZXR1cm5zIGxpc3RpdGVtIHJlZmVyZW5jZSBieSBpbmRleCB2YWx1ZS4gVGhpcyByZWZlcnMgdG8gdGhlIHNhbWUgbWV0aG9kIGdldExpc3RJdGVtQnlJbmRleC5cbiAgICBwdWJsaWMgZ2V0SXRlbShpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldExpc3RJdGVtQnlJbmRleChpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpbmRleCBvZiBsaXN0SXRlbShsaXN0SXRlbURpcmVjdGl2ZSAvIGxpc3RJdGVtT2JqZWN0KVxuICAgICAqIElmIGl0ZW0gaXMgYSBkaXJlY3RpdmUsIGluZGV4IGlzIGZldGNoZWQgZnJvbSBsaXN0SXRlbXNcbiAgICAgKiBJZiBpdGVtIGlzIGFuIG9iamVjdCwgaW5kZXggaXMgZmV0Y2hlZCBmcm9tIGZpZWxkRGVmc1xuICAgICovXG4gICAgcHVibGljIGdldEluZGV4KGl0ZW06IGFueSkge1xuICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIExpc3RJdGVtRGlyZWN0aXZlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRMaXN0SXRlbUluZGV4KGl0ZW0pO1xuICAgICAgICB9IGVsc2UgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpZWxkRGVmcy5maW5kSW5kZXgoKG9iaikgPT4gXy5pc0VxdWFsKG9iaiwgaXRlbSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBzZWxlY3RlZGl0ZW0oaXRlbXMpIHtcbiAgICAgICAgdGhpcy5faXRlbXMubGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy5kZXNlbGVjdExpc3RJdGVtcygpO1xuXG4gICAgICAgIGlmIChfLmlzQXJyYXkoaXRlbXMpKSB7XG4gICAgICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4gdGhpcy5zZWxlY3RJdGVtKGl0ZW0pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbShpdGVtcyk7XG4gICAgICAgIH1cbiAgICAgICAgJGFwcERpZ2VzdCgpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBpbmo6IEluamVjdG9yLFxuICAgICAgICBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIGRhdGVQaXBlOiBUb0RhdGVQaXBlLFxuICAgICAgICBhcHA6IEFwcCxcbiAgICAgICAgYXBwRGVmYXVsdHM6IEFwcERlZmF1bHRzLFxuICAgICAgICBuZ1pvbmU6IE5nWm9uZSxcbiAgICAgICAgQEF0dHJpYnV0ZSgnaXRlbWNsYXNzLmJpbmQnKSBiaW5kaXRlbWNsYXNzOiBzdHJpbmcsXG4gICAgICAgIEBBdHRyaWJ1dGUoJ2Rpc2FibGVpdGVtLmJpbmQnKSBiaW5kZGlzYWJsZWl0ZW06IHN0cmluZyxcbiAgICAgICAgQEF0dHJpYnV0ZSgnZGF0YXNldC5iaW5kJykgYmluZGRhdGFzZXQ6IHN0cmluZyxcbiAgICAgICAgQEF0dHJpYnV0ZSgnZGF0YXNvdXJjZS5iaW5kJykgYmluZGRhdGFzb3VyY2U6IHN0cmluZyxcbiAgICAgICAgQEF0dHJpYnV0ZSgnbW91c2VlbnRlci5ldmVudCcpIG1vdXNlRW50ZXJDQjogc3RyaW5nLFxuICAgICAgICBAQXR0cmlidXRlKCdtb3VzZWxlYXZlLmV2ZW50JykgbW91c2VMZWF2ZUNCOiBzdHJpbmcsXG4gICAgICAgIHN0YXRlUGVyc2lzdGVuY2U6IFN0YXRlUGVyc2lzdGVuY2UsXG4gICAgICAgIHBhZ2luYXRpb25TZXJ2aWNlOiBQYWdpbmF0aW9uU2VydmljZSxcbiAgICApIHtcbiAgICAgICAgbGV0IHJlc29sdmVGbjogRnVuY3Rpb24gPSBub29wO1xuICAgICAgICBjb25zdCBwcm9wc0luaXRQcm9taXNlID0gbmV3IFByb21pc2UocmVzID0+IHJlc29sdmVGbiA9IHJlcyk7XG4gICAgICAgIHN1cGVyKGluaiwgV0lER0VUX0NPTkZJRywgcHJvcHNJbml0UHJvbWlzZSk7XG4gICAgICAgIHRoaXMucHJvcHNJbml0UHJvbWlzZSA9IHByb3BzSW5pdFByb21pc2U7XG4gICAgICAgIHRoaXMucHJvbWlzZVJlc29sdmVyRm4gPSByZXNvbHZlRm47XG4gICAgICAgIHN0eWxlcih0aGlzLm5hdGl2ZUVsZW1lbnQsIHRoaXMsIEFQUExZX1NUWUxFU19UWVBFLlNIRUxMKTtcbiAgICAgICAgdGhpcy5jZFJlZiA9IGNkUmVmO1xuICAgICAgICB0aGlzLm5nWm9uZSA9IG5nWm9uZTtcbiAgICAgICAgdGhpcy5kYXRlUGlwZSA9IGRhdGVQaXBlO1xuICAgICAgICB0aGlzLnN0YXRlUGVyc2lzdGVuY2UgPSBzdGF0ZVBlcnNpc3RlbmNlO1xuICAgICAgICB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlID0gcGFnaW5hdGlvblNlcnZpY2U7XG4gICAgICAgIHRoaXMuX3BhZ2VMb2FkID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLmJpbmRpdGVtY2xhc3MgPSBiaW5kaXRlbWNsYXNzO1xuICAgICAgICB0aGlzLmJpbmRkaXNhYmxlaXRlbSA9IGJpbmRkaXNhYmxlaXRlbTtcbiAgICAgICAgdGhpcy5iaW5kZGF0YXNldCA9IGJpbmRkYXRhc2V0O1xuICAgICAgICB0aGlzLm1vdXNlRW50ZXJDQiA9IG1vdXNlRW50ZXJDQjtcbiAgICAgICAgdGhpcy5tb3VzZUxlYXZlQ0IgPSBtb3VzZUxlYXZlQ0I7XG4gICAgICAgIHRoaXMuYmluZGRhdGFzb3VyY2UgPSBiaW5kZGF0YXNvdXJjZTtcblxuICAgICAgICB0aGlzLmFwcCA9IGFwcDtcbiAgICAgICAgdGhpcy5hcHBEZWZhdWx0cyA9IGFwcERlZmF1bHRzO1xuICAgICAgICB0aGlzLnZhcmlhYmxlSW5mbGlnaHQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLm5vRGF0YUZvdW5kID0gIWJpbmRkYXRhc2V0O1xuICAgICAgICB0aGlzLnRpdGxlSWQgPSAnd21saXN0LScgKyBnZW5lcmF0ZUdVSWQoKTtcblxuICAgICAgICAvLyBVcGRhdGVzIHBhZ2luYXRpb24sIGZpbHRlciwgc29ydCBldGMgb3B0aW9ucyBmb3Igc2VydmljZSBhbmQgY3J1ZCB2YXJpYWJsZXNcbiAgICAgICAgdGhpcy5fbGlzdGVuZXJEZXN0cm95ZXJzID0gW1xuICAgICAgICAgICAgdGhpcy5hcHAuc3Vic2NyaWJlKCdjaGVjay1zdGF0ZS1wZXJzaXN0ZW5jZS1vcHRpb25zJywgb3B0aW9ucyA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGRhdGFTb3VyY2VOYW1lID0gXy5nZXQodGhpcy5kYXRhc291cmNlLCAnbmFtZScpO1xuICAgICAgICAgICAgICAgIC8vIGluIFByZWZhYnMsIHRoaXMuZGF0YXNvdXJjZSBpcyBub3QgcmVzb2x2ZWQgYXQgdGhlIHRpbWUgb2YgdmFyaWFibGUgaW52b2NhdGlvbiwgc28gYWRkaXRpb25hbCBjaGVjayBpcyByZXF1aXJlZC5cbiAgICAgICAgICAgICAgICBpZiAoIWRhdGFTb3VyY2VOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFTb3VyY2VOYW1lID0gZXh0cmFjdERhdGFTb3VyY2VOYW1lKHRoaXMuYmluZGRhdGFzb3VyY2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoXy5nZXQob3B0aW9ucywgJ3ZhcmlhYmxlLm5hbWUnKSAhPT0gZGF0YVNvdXJjZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVN0YXRlUGFyYW1zKG9wdGlvbnMpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAvLyBTaG93IGxvYWRpbmcgc3RhdHVzIGJhc2VkIG9uIHRoZSB2YXJpYWJsZSBsaWZlIGN5Y2xlXG4gICAgICAgICAgICB0aGlzLmFwcC5zdWJzY3JpYmUoJ3RvZ2dsZS12YXJpYWJsZS1zdGF0ZScsIHRoaXMuaGFuZGxlTG9hZGluZy5iaW5kKHRoaXMpKSxcbiAgICAgICAgICAgIHRoaXMuYXBwLnN1YnNjcmliZSgnc2V0dXAtY3VkLWxpc3RlbmVyJywgcGFyYW0gPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCduYW1lJykgIT09IHBhcmFtKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5faXNEZXBlbmRlbnQgPSB0cnVlO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldENvbmZpZ3VyZWRTdGF0ZSgpIHtcbiAgICAgICAgY29uc3QgbW9kZSA9IHRoaXMuc3RhdGVQZXJzaXN0ZW5jZS5jb21wdXRlTW9kZSh0aGlzLnN0YXRlaGFuZGxlcik7XG4gICAgICAgIHJldHVybiBtb2RlICYmIG1vZGUudG9Mb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZVN0YXRlUGFyYW1zKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHRoaXMuX3BhZ2VMb2FkICYmIHRoaXMuZ2V0Q29uZmlndXJlZFN0YXRlKCkgIT09ICdub25lJykge1xuICAgICAgICAgICAgdGhpcy5fcGFnZUxvYWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IHdpZGdldFN0YXRlID0gdGhpcy5zdGF0ZVBlcnNpc3RlbmNlLmdldFdpZGdldFN0YXRlKHRoaXMpO1xuICAgICAgICAgICAgaWYgKF8uZ2V0KHdpZGdldFN0YXRlLCAncGFnaW5hdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5vcHRpb25zID0gb3B0aW9ucy5vcHRpb25zIHx8IHt9O1xuICAgICAgICAgICAgICAgIG9wdGlvbnMub3B0aW9ucy5wYWdlID0gd2lkZ2V0U3RhdGUucGFnaW5hdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChfLmdldCh3aWRnZXRTdGF0ZSwgJ3NlbGVjdGVkSXRlbScpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRJdGVtc0V4aXN0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdHJpZ2dlcldNRXZlbnQoZXZlbnROYW1lLCBpdGVtPykge1xuICAgICAgICAkaW52b2tlV2F0Y2hlcnModHJ1ZSk7XG4gICAgICAgIC8vIElmIHdlIGhhdmUgbXVsdGlzZWxlY3QgZm9yIHRoZSBsaXZlbGlzdChMaXN0IHdpdGggZm9ybSB0ZW1wbGF0ZSksIGluIHJ1biBtb2RlIGRlbGV0aW5nIGEgcmVjb3JkIGlzIGdldHRpbmcgZmFpbGVkLiBCZWN1YXNlIHRoZSBzZWxlY3RlZGl0ZW0gd2lsbCBiZSBhcnJheSBvZiBvYmplY3RzLiBTbyBjb25zaWRlciB0aGUgbGFzdCBvYmplY3QuXG4gICAgICAgIGxldCByb3cgPSB0aGlzLm11bHRpc2VsZWN0ID8gXy5sYXN0KHRoaXMuc2VsZWN0ZWRpdGVtKSA6IHRoaXMuc2VsZWN0ZWRpdGVtO1xuICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgcm93ID0gaXRlbTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcC5ub3RpZnkoJ3dtLWV2ZW50Jywge2V2ZW50TmFtZSwgd2lkZ2V0TmFtZTogdGhpcy5uYW1lLCByb3c6IHJvd30pO1xuICAgIH1cblxuICAgIGNyZWF0ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzRGVwZW5kZW50KSB7XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJXTUV2ZW50KCdpbnNlcnQnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGVkaXRSb3coaXRlbT8pIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzRGVwZW5kZW50KSB7XG4gICAgICAgICAgICBsZXQgbGlzdEl0ZW07XG4gICAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgICAgIGxpc3RJdGVtID0gdGhpcy5nZXRJdGVtUmVmQnlJbmRleE9yTW9kZWwoaXRlbSkuaXRlbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudHJpZ2dlcldNRXZlbnQoJ3VwZGF0ZScsIGxpc3RJdGVtKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZShpdGVtPykge1xuICAgICAgICB0aGlzLmVkaXRSb3coaXRlbSk7XG4gICAgfVxuXG4gICAgZGVsZXRlUm93KGl0ZW0/KSB7XG4gICAgICAgIGlmICh0aGlzLl9pc0RlcGVuZGVudCkge1xuICAgICAgICAgICAgbGV0IGxpc3RJdGVtO1xuICAgICAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICBsaXN0SXRlbSA9IHRoaXMuZ2V0SXRlbVJlZkJ5SW5kZXhPck1vZGVsKGl0ZW0pLml0ZW07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJXTUV2ZW50KCdkZWxldGUnLCBsaXN0SXRlbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZWxldGUoaXRlbT8pIHtcbiAgICAgICAgdGhpcy5kZWxldGVSb3coaXRlbSk7XG4gICAgfVxuICAgIGhhbmRsZUxvYWRpbmcoZGF0YSkge1xuICAgICAgICBjb25zdCBkYXRhU291cmNlID0gdGhpcy5kYXRhc291cmNlO1xuICAgICAgICBpZiAoZGF0YVNvdXJjZSAmJiBkYXRhU291cmNlLmV4ZWN1dGUoRGF0YVNvdXJjZS5PcGVyYXRpb24uSVNfQVBJX0FXQVJFKSAmJiBpc0RhdGFTb3VyY2VFcXVhbChkYXRhLnZhcmlhYmxlLCBkYXRhU291cmNlKSkge1xuICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVN0YXRlUGFyYW1zKGRhdGEpO1xuICAgICAgICAgICAgICAgIHRoaXMudmFyaWFibGVJbmZsaWdodCA9IGRhdGEuYWN0aXZlO1xuICAgICAgICAgICAgICAgIC8vIEZpeCBmb3IgW1dNUy0yMzc3Ml0gVXBkYXRlIG5vZGF0YWZvdW5kIGZsYWcgb25jZSB0aGUgcmVzcG9uc2UgaXMgcmVjaWV2ZWQgZnJvbSB0aGUgc2VydmVyXG4gICAgICAgICAgICAgICAgY29uc3QgdG90YWxFbGUgPSBkYXRhLmRhdGE/LnBhZ2luYXRpb24/LnRvdGFsRWxlbWVudHM7XG4gICAgICAgICAgICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKHRvdGFsRWxlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vRGF0YUZvdW5kID0gdG90YWxFbGUgPT09IDAgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gdG90YWxlbGVtZW50cyBpcyB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub0RhdGFGb3VuZCA9IF8uaXNFbXB0eShkYXRhLmRhdGE/LmRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXNldE5hdmlnYXRpb24oKSB7XG4gICAgICAgIHRoaXMuc2hvd05hdmlnYXRpb24gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5uYXZDb250cm9scyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5pbmZTY3JvbGwgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5vbkRlbWFuZExvYWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGVuYWJsZUJhc2ljTmF2aWdhdGlvbigpIHtcbiAgICAgICAgdGhpcy5uYXZDb250cm9scyA9IE5BVklHQVRJT05fVFlQRS5CQVNJQztcbiAgICAgICAgdGhpcy5zaG93TmF2aWdhdGlvbiA9IHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlbmFibGVJbmxpbmVOYXZpZ2F0aW9uKCkge1xuICAgICAgICB0aGlzLm5hdkNvbnRyb2xzID0gTkFWSUdBVElPTl9UWVBFLklOTElORTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGVuYWJsZUNsYXNzaWNOYXZpZ2F0aW9uKCkge1xuICAgICAgICB0aGlzLm5hdkNvbnRyb2xzID0gTkFWSUdBVElPTl9UWVBFLkNMQVNTSUM7XG4gICAgICAgIHRoaXMuc2hvd05hdmlnYXRpb24gPSB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZW5hYmxlUGFnZXJOYXZpZ2F0aW9uKCkge1xuICAgICAgICB0aGlzLm5hdkNvbnRyb2xzID0gTkFWSUdBVElPTl9UWVBFLlBBR0VSO1xuICAgICAgICB0aGlzLnNob3dOYXZpZ2F0aW9uID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldE5hdmlnYXRpb25UeXBlTm9uZSgpIHtcbiAgICAgICAgdGhpcy5uYXZDb250cm9scyA9IE5BVklHQVRJT05fVFlQRS5OT05FO1xuICAgICAgICB0aGlzLnNob3dOYXZpZ2F0aW9uID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlbmFibGVJbmZpbml0ZVNjcm9sbCgpIHtcbiAgICAgICAgdGhpcy5pbmZTY3JvbGwgPSB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZW5hYmxlT25EZW1hbmRMb2FkKCkge1xuICAgICAgICB0aGlzLm9uRGVtYW5kTG9hZCA9IHRydWU7XG4gICAgICAgIHRoaXMuc2hvd05hdmlnYXRpb24gPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgTmF2aWdhdGlvbiB0eXBlIGZvciB0aGUgbGlzdC5cbiAgICAgKiBAcGFyYW0gdHlwZVxuICAgICAqL1xuICAgIHByaXZhdGUgb25OYXZpZ2F0aW9uVHlwZUNoYW5nZSh0eXBlKSB7XG4gICAgICAgIHRoaXMucmVzZXROYXZpZ2F0aW9uKCk7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSBOQVZJR0FUSU9OX1RZUEUuQkFTSUM6XG4gICAgICAgICAgICAgICAgdGhpcy5lbmFibGVCYXNpY05hdmlnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTkFWSUdBVElPTl9UWVBFLklOTElORTpcbiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZUlubGluZU5hdmlnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTkFWSUdBVElPTl9UWVBFLkFEVkFOQ0VEOlxuICAgICAgICAgICAgY2FzZSBOQVZJR0FUSU9OX1RZUEUuQ0xBU1NJQzpcbiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZUNsYXNzaWNOYXZpZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE5BVklHQVRJT05fVFlQRS5QQUdFUjpcbiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZVBhZ2VyTmF2aWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQVZJR0FUSU9OX1RZUEUuTk9ORSA6XG4gICAgICAgICAgICAgICAgdGhpcy5zZXROYXZpZ2F0aW9uVHlwZU5vbmUoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTkFWSUdBVElPTl9UWVBFLlNDUk9MTDpcbiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZUluZmluaXRlU2Nyb2xsKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE5BVklHQVRJT05fVFlQRS5PTkRFTUFORDpcbiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZU9uRGVtYW5kTG9hZCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIGZpZWxkRGVmcyBwcm9wZXJ0eSwgZmllbGREZWZzIGlzIHRoZSBtb2RlbCBvZiB0aGUgTGlzdCBDb21wb25lbnQuXG4gICAgICogZmllbGREZWZzIGlzIGFuIEFycmF5IHR5cGUuXG4gICAgICogQHBhcmFtIG5ld1ZhbFxuICAgICAqL1xuICAgIHByaXZhdGUgdXBkYXRlRmllbGREZWZzKG5ld1ZhbDogQXJyYXk8YW55Pikge1xuICAgICAgICBpZiAodGhpcy5pbmZTY3JvbGwgfHwgdGhpcy5vbkRlbWFuZExvYWQpIHtcbiAgICAgICAgICAgIFt0aGlzLmZpZWxkRGVmcywgdGhpcy5jdXJyZW50UGFnZV0gPSB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLnVwZGF0ZUZpZWxkc09uUGFnaW5hdGlvbih0aGlzLCBuZXdWYWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5maWVsZERlZnMgPSBuZXdWYWw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vcmRlcmJ5KSB7XG4gICAgICAgICAgICB0aGlzLmZpZWxkRGVmcyA9IGdldE9yZGVyZWREYXRhc2V0KHRoaXMuZmllbGREZWZzLCB0aGlzLm9yZGVyYnkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmdyb3VwYnkpIHtcbiAgICAgICAgICAgIHRoaXMuZ3JvdXBlZERhdGEgPSBncm91cERhdGEodGhpcywgdGhpcy5maWVsZERlZnMsIHRoaXMuZ3JvdXBieSwgdGhpcy5tYXRjaCwgdGhpcy5vcmRlcmJ5LCB0aGlzLmRhdGVmb3JtYXQsIHRoaXMuZGF0ZVBpcGUsIHVuZGVmaW5lZCwgdGhpcy5hcHBEZWZhdWx0cyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuZmllbGREZWZzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5ub0RhdGFGb3VuZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkaXRlbSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAkYXBwRGlnZXN0KCk7XG4gICAgICAgIHRoaXMubGlzdEl0ZW1zLnNldERpcnR5KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkRhdGFDaGFuZ2UobmV3VmFsKSB7XG4gICAgICAgIC8vIENoZWNrIGZvciBuZXdWYWwgaXMgbm90IGVtcHR5XG4gICAgICAgIGlmICghXy5pc0VtcHR5KG5ld1ZhbCkpIHtcblxuICAgICAgICAgICAgdGhpcy5ub0RhdGFGb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5pc0RhdGFDaGFuZ2VkID0gdHJ1ZTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YXNvdXJjZSAmJiB0aGlzLmRhdGFzb3VyY2UuZXhlY3V0ZShEYXRhU291cmNlLk9wZXJhdGlvbi5JU19BUElfQVdBUkUpKSB7XG4gICAgICAgICAgICAgICAgLy8gY2xvbmUgdGhlIHRoZSBkYXRhIGluIGNhc2Ugb2YgbGl2ZSBhbmQgc2VydmljZSB2YXJpYWJsZXMgdG8gcHJldmVudCB0aGUgdHdvLXdheSBiaW5kaW5nIGZvciB0aGVzZSB2YXJpYWJsZXMuXG4gICAgICAgICAgICAgICAgbmV3VmFsID0gXy5jbG9uZURlZXAobmV3VmFsKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzT2JqZWN0KG5ld1ZhbCkgJiYgIV8uaXNBcnJheShuZXdWYWwpKSB7XG4gICAgICAgICAgICAgICAgbmV3VmFsID0gXy5pc0VtcHR5KG5ld1ZhbCkgPyBbXSA6IFtuZXdWYWxdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoXy5pc1N0cmluZyhuZXdWYWwpKSB7XG4gICAgICAgICAgICAgICAgbmV3VmFsID0gbmV3VmFsLnNwbGl0KCcsJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlmIHRoZSBwYWdlIG51bWJlciBpcyBncmVhdGVyIHRoYW4gMSBvbiBpbml0aWFsIGxvYWQgdGhlbiB3ZSByZW5kZXIgdGhlIGZpcnN0IHBhZ2UuXG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhc291cmNlICYmIHRoaXMuZGF0YXNvdXJjZS5vd25lciA9PT0gJ0FwcCcgJiYgKHRoaXMuaW5mU2Nyb2xsIHx8IHRoaXMub25EZW1hbmRMb2FkKSAmJiAhdGhpcy5jdXJyZW50UGFnZSAmJiB0aGlzLmRhdGFzb3VyY2UuZXhlY3V0ZShEYXRhU291cmNlLk9wZXJhdGlvbi5HRVRfUEFHSU5HX09QVElPTlMpLm51bWJlciA+IDApIHtcbiAgICAgICAgICAgICAgICBuZXdWYWwgPSB0aGlzLmRhdGFzb3VyY2UuZXhlY3V0ZShEYXRhU291cmNlLk9wZXJhdGlvbi5MSVNUX1JFQ09SRFMsIHtcbiAgICAgICAgICAgICAgICAgJ3BhZ2UnOiAxXG4gICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoXy5pc0FycmF5KG5ld1ZhbCkpIHtcbiAgICAgICAgICAgICAgICBpZiAobmV3VmFsLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ2JlZm9yZWRhdGFyZW5kZXInLCB7JGRhdGE6IG5ld1ZhbH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZpZWxkRGVmcyhuZXdWYWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVGaWVsZERlZnMoW10pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlcyB0aGUgZGF0YVNvdXJjZSB3aGVuIHBhZ2luYXRpb24gaXMgZW5hYmxlZCBmb3IgdGhlIENvbXBvbmVudC5cbiAgICBwcml2YXRlIHNldHVwRGF0YVNvdXJjZSgpIHtcbiAgICAgICAgY29uc3QgZGF0YU5hdmlnYXRvciA9IHRoaXMuZGF0YU5hdmlnYXRvcjtcblxuICAgICAgICBkYXRhTmF2aWdhdG9yLm9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtYXhSZXN1bHRzOiB0aGlzLnBhZ2VzaXplIHx8IDIwXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5kYXRhTmF2aWdhdG9yV2F0Y2hlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKHRoaXMubmF2aWdhdG9yUmVzdWx0V2F0Y2gpIHtcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdG9yUmVzdWx0V2F0Y2gudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICAvKlJlZ2lzdGVyIGEgd2F0Y2ggb24gdGhlIFwicmVzdWx0XCIgcHJvcGVydHkgb2YgdGhlIFwiZGF0YU5hdmlnYXRvclwiIHNvIHRoYXQgdGhlIHBhZ2luYXRlZCBkYXRhIGlzIGRpc3BsYXllZCBpbiB0aGUgbGl2ZS1saXN0LiovXG4gICAgICAgIHRoaXMubmF2aWdhdG9yUmVzdWx0V2F0Y2ggPSBkYXRhTmF2aWdhdG9yLnJlc3VsdEVtaXR0ZXIuc3Vic2NyaWJlKChuZXdWYWw6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkRhdGFDaGFuZ2UobmV3VmFsKTtcbiAgICAgICAgfSwgdHJ1ZSk7XG4gICAgICAgIC8qRGUtcmVnaXN0ZXIgdGhlIHdhdGNoIGlmIGl0IGlzIGV4aXN0cyAqL1xuICAgICAgICBpZiAodGhpcy5uYXZpZ2F0b3JNYXhSZXN1bHRXYXRjaCkge1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0b3JNYXhSZXN1bHRXYXRjaC51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIC8qUmVnaXN0ZXIgYSB3YXRjaCBvbiB0aGUgXCJtYXhSZXN1bHRzXCIgcHJvcGVydHkgb2YgdGhlIFwiZGF0YU5hdmlnYXRvclwiIHNvIHRoYXQgdGhlIFwicGFnZVNpemVcIiBpcyBkaXNwbGF5ZWQgaW4gdGhlIGxpdmUtbGlzdC4qL1xuICAgICAgICB0aGlzLm5hdmlnYXRvck1heFJlc3VsdFdhdGNoID0gZGF0YU5hdmlnYXRvci5tYXhSZXN1bHRzRW1pdHRlci5zdWJzY3JpYmUoKHZhbCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wYWdlc2l6ZSA9IHZhbDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGF0YU5hdmlnYXRvci5tYXhSZXN1bHRzID0gdGhpcy5wYWdlc2l6ZSB8fCAyMDtcbiAgICAgICAgdGhpcy5yZW1vdmVQcm9wZXJ0eUJpbmRpbmcoJ2RhdGFzZXQnKTtcbiAgICAgICAgLy8gd2hlbiBsaXN0IGhhdmluZyBcImRhdGFzZXRib3VuZGV4cHJcIiBhdHRyIGluZGljYXRlcyB0aGF0IGxpc3QgaXMgYm91bmQgdG8gaXRlbSBjb250ZXh0XG4gICAgICAgIC8vIHdoZW4gZGF0YXNldCBpcyBib3VuZCB0byBcIml0ZW0uRklFTERcIiB0aGVuIGl0ZW0gY29udGV4dCBpcyBwYXNzZWQgYXMgdGhlIGRhdGFzb3VyY2UuXG4gICAgICAgIGNvbnN0IGRhdGFzZXRCb3VuZEV4cHIgPSB0aGlzLmdldEF0dHIoJ2RhdGFzZXRib3VuZGV4cHInKTtcbiAgICAgICAgdGhpcy5kYXRhTmF2aWdhdG9yLnNldEJpbmREYXRhU2V0KFxuICAgICAgICAgICAgdGhpcy5iaW5kZGF0YXNldCxcbiAgICAgICAgICAgIHRoaXMudmlld1BhcmVudCxcbiAgICAgICAgICAgIGRhdGFzZXRCb3VuZEV4cHIgPyB0aGlzLmNvbnRleHQgOiB0aGlzLmRhdGFzb3VyY2UsXG4gICAgICAgICAgICB0aGlzLmRhdGFzZXQsXG4gICAgICAgICAgICB0aGlzLmJpbmRkYXRhc291cmNlLFxuICAgICAgICAgICAgZGF0YXNldEJvdW5kRXhwcixcbiAgICAgICAgICAgIHRoaXMuc3RhdGVoYW5kbGVyXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkRhdGFTZXRDaGFuZ2UobmV3VmFsKSB7XG4gICAgICAgIGlmIChfLmdldCh0aGlzLmRhdGFzb3VyY2UsICdjYXRlZ29yeScpID09PSAnd20uVmFyaWFibGUnICYmIHRoaXMuZ2V0Q29uZmlndXJlZFN0YXRlKCkgIT09ICdub25lJyAmJiB0aGlzLl9wYWdlTG9hZCkge1xuICAgICAgICAgICAgY29uc3Qgd2lkZ2V0U3RhdGUgPSB0aGlzLnN0YXRlUGVyc2lzdGVuY2UuZ2V0V2lkZ2V0U3RhdGUodGhpcyk7XG4gICAgICAgICAgICB0aGlzLl9wYWdlTG9hZCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKF8uZ2V0KHdpZGdldFN0YXRlLCAncGFnaW5hdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhTmF2aWdhdG9yLnBhZ2VDaGFuZ2VkKHtwYWdlOiB3aWRnZXRTdGF0ZS5wYWdpbmF0aW9ufSwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXy5nZXQod2lkZ2V0U3RhdGUsICdzZWxlY3RlZEl0ZW0nKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkSXRlbXNFeGlzdCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmRhdGFOYXZpZ2F0b3JXYXRjaGVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5uYXZpZ2F0aW9uICYmIHRoaXMubmF2aWdhdGlvbiAhPT0gTkFWSUdBVElPTl9UWVBFLk5PTkUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldHVwRGF0YVNvdXJjZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uRGF0YUNoYW5nZShuZXdWYWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubmF2aWdhdGlvbiAmJiB0aGlzLm5hdmlnYXRpb24gIT09IE5BVklHQVRJT05fVFlQRS5OT05FKSB7XG4gICAgICAgICAgICAvLyBJZiBuYXZpZ2F0aW9uIGlzIGFscmVhZHkgc2V0dXAgYW5kIGRhdGFzb3VyY2UgaXMgY2hhbmdlZCwgdXBkYXRlIHRoZSBkYXRhc291cmNlIG9uIG5hdmlnYXRpb25cbiAgICAgICAgICAgIHRoaXMuZGF0YU5hdmlnYXRvci5zZXREYXRhU291cmNlKHRoaXMuZGF0YXNvdXJjZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBbGwgdGhlIExpc3RJdGVtJ3MgQWN0aXZlIHN0YXRlIGlzIHNldCB0byBmYWxzZS5cbiAgICBwcml2YXRlIGRlc2VsZWN0TGlzdEl0ZW1zKCkge1xuICAgICAgICB0aGlzLmxpc3RJdGVtcy5mb3JFYWNoKGl0ZW0gPT4gaXRlbS5pc0FjdGl2ZSA9IGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyBEZXNlbGVjdCBhbGwgdGhlIExpc3RJdGVtcyBhbmQgY2xlYXIgdGhlIHNlbGVjdGVkaXRlbShJbk91dEJvdW5kIFByb3BlcnR5IG1vZGVsKVxuICAgIHByaXZhdGUgY2xlYXJTZWxlY3RlZEl0ZW1zKCkge1xuICAgICAgICB0aGlzLmRlc2VsZWN0TGlzdEl0ZW1zKCk7XG4gICAgICAgIHRoaXMuX2l0ZW1zLmxlbmd0aCA9IDA7XG4gICAgICAgICRhcHBEaWdlc3QoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdGhlIExpc3RJdGVtRGlyZWN0aXZlIGluc3RhbmNlIGJ5IGNoZWNraW5nIHRoZSBlcXVhbGl0eSBvZiB0aGUgbW9kZWwuXG4gICAgICogQHBhcmFtIGxpc3RNb2RlbDogbW9kZWwgdG8gYmUgc2VhcmNoZWQgZm9yXG4gICAgICogQHJldHVybnMgTGlzdEl0ZW0gaWYgdGhlIG1vZGVsIGlzIG1hdGNoZWQgZWxzZSByZXR1cm4gbnVsbC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldExpc3RJdGVtQnlNb2RlbChsaXN0TW9kZWwpOiBMaXN0SXRlbURpcmVjdGl2ZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpc3RJdGVtcy5maW5kKChsaXN0SXRlbSkgPT4ge1xuICAgICAgICAgICAgbGV0IGl0ZW1PYmogPSBsaXN0SXRlbS5pdGVtO1xuICAgICAgICAgICAgaWYgKHRoaXMuZ3JvdXBieSAmJiAhXy5oYXMobGlzdE1vZGVsLCAnX2dyb3VwSW5kZXgnKSkge1xuICAgICAgICAgICAgICAgIC8vIElmIGdyb3VwYnkgaXMgZW5hYmxlZCwgaXRlbSBjb250YWlucyBfZ3JvdXBJbmRleCBwcm9wZXJ0eSB3aGljaCBzaG91bGQgYmUgZXhjbHVkZWQgd2hpbGUgY29tcGFyaW5nIG1vZGVsLlxuICAgICAgICAgICAgICAgIGl0ZW1PYmogPSBfLmNsb25lKGl0ZW1PYmopO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBpdGVtT2JqLl9ncm91cEluZGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKF8uaXNFcXVhbChpdGVtT2JqLCBsaXN0TW9kZWwpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pIHx8IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVTZWxlY3RlZEl0ZW1zV2lkZ2V0cyhzdGF0ZVBlcnNpc3RlbmNlVHJpZ2dlcmVkPykge1xuICAgICAgICBsZXQgb2JqID0ge30sIHdpZGdldFN0YXRlO1xuICAgICAgICBjb25zdCBwYWdlTnVtID0gXy5nZXQodGhpcy5kYXRhTmF2aWdhdG9yLCAnZG4uY3VycmVudFBhZ2UnKSB8fCAxO1xuICAgICAgICBpZiAodGhpcy5nZXRDb25maWd1cmVkU3RhdGUoKSAhPT0gJ25vbmUnKSB7XG4gICAgICAgICAgICAvLyByZW1vdmUgcHJldmlvdXNseSBjb25maWd1cmVkIHNlbGVjdGVkIGl0ZW1zIGZvciBjdXJyZW50IHBhZ2UgYW5kIGNvbnN0cnVjdCBuZXcgb25lcyBsYXRlciBiZWxvdy5cbiAgICAgICAgICAgIHdpZGdldFN0YXRlID0gdGhpcy5zdGF0ZVBlcnNpc3RlbmNlLmdldFdpZGdldFN0YXRlKHRoaXMpIHx8IHt9O1xuICAgICAgICAgICAgaWYgKF8uZ2V0KHdpZGdldFN0YXRlLCAnc2VsZWN0ZWRJdGVtJykpIHtcbiAgICAgICAgICAgICAgICAvLyB3aGVuIG11bHRpc2VsZWN0IGlzIG9uIGFuZCBhbiBpdGVtIGlzIHNlbGVjdGVkIHdpdGhvdXQgcHJlc3NpbmcgQ1RSTCwgcHJldmlvdXNseSBzZWxlY3RlZCBpdGVtcyBpbiBzdGF0ZSBzaG91bGQgYmUgZW1wdHkuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubXVsdGlzZWxlY3QgJiYgdGhpcy5zZWxlY3RlZGl0ZW0ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHdpZGdldFN0YXRlLnNlbGVjdGVkSXRlbSA9IFtdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF8ucmVtb3ZlKHdpZGdldFN0YXRlLnNlbGVjdGVkSXRlbSwgZnVuY3Rpb24oc2VsZWN0ZWRJdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRJdGVtLnBhZ2UgPT09IHBhZ2VOdW07XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tdWx0aXNlbGVjdCkge1xuICAgICAgICAgICAgKHRoaXMuc2VsZWN0ZWRJdGVtV2lkZ2V0cyBhcyBBcnJheTxXaWRnZXRSZWY+KS5sZW5ndGggPSAwO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGlzdEl0ZW1zLmZvckVhY2goKGl0ZW06IExpc3RJdGVtRGlyZWN0aXZlLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKGl0ZW0uaXNBY3RpdmUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tdWx0aXNlbGVjdCkge1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5zZWxlY3RlZEl0ZW1XaWRnZXRzIGFzIEFycmF5PFdpZGdldFJlZj4pLnB1c2goaXRlbS5jdXJyZW50SXRlbVdpZGdldHMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtV2lkZ2V0cyA9IGl0ZW0uY3VycmVudEl0ZW1XaWRnZXRzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvYmogPSB7cGFnZTogcGFnZU51bSwgaW5kZXg6IGluZGV4fTtcbiAgICAgICAgICAgICAgICBpZiAoXy5nZXQod2lkZ2V0U3RhdGUsICdzZWxlY3RlZEl0ZW0nKSAgJiYgdGhpcy5tdWx0aXNlbGVjdCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIV8uc29tZSh3aWRnZXRTdGF0ZS5zZWxlY3RlZEl0ZW0sIG9iaikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZGdldFN0YXRlLnNlbGVjdGVkSXRlbS5wdXNoKG9iaik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3aWRnZXRTdGF0ZS5zZWxlY3RlZEl0ZW0gPSBbb2JqXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGhpcy5nZXRDb25maWd1cmVkU3RhdGUoKSAhPT0gJ25vbmUnICYmICFzdGF0ZVBlcnNpc3RlbmNlVHJpZ2dlcmVkKSB7XG4gICAgICAgICAgICBpZiAodW5zdXBwb3J0ZWRTdGF0ZVBlcnNpc3RlbmNlVHlwZXMuaW5kZXhPZih0aGlzLm5hdmlnYXRpb24pIDwgMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGVQZXJzaXN0ZW5jZS5yZW1vdmVXaWRnZXRTdGF0ZSh0aGlzLCAnc2VsZWN0ZWRJdGVtJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZVBlcnNpc3RlbmNlLnNldFdpZGdldFN0YXRlKHRoaXMsIHsnc2VsZWN0ZWRJdGVtJzogd2lkZ2V0U3RhdGUuc2VsZWN0ZWRJdGVtfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUmV0YWluIFN0YXRlIGhhbmRsaW5nIG9uIFdpZGdldCAnICsgdGhpcy5uYW1lICsgJyBpcyBub3Qgc3VwcG9ydGVkIGZvciBjdXJyZW50IHBhZ2luYXRpb24gdHlwZS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbGVjdHMgdGhlIGxpc3RJdGVtIGFuZCB1cGRhdGVzIHNlbGVjdGVkaXRlbSBwcm9wZXJ0eS5cbiAgICAgKiBJZiB0aGUgbGlzdEl0ZW0gaXMgYWxyZWFkeSBhIHNlbGVjdGVkIGl0ZW0gdGhlbiBkZXNlbGVjdHMgdGhlIGl0ZW0uXG4gICAgICogQHBhcmFtIHtMaXN0SXRlbURpcmVjdGl2ZX0gJGxpc3RJdGVtOiBJdGVtIHRvIGJlIHNlbGVjdGVkIG9mIGRlc2VsZWN0ZWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSB0b2dnbGVMaXN0SXRlbVNlbGVjdGlvbigkbGlzdEl0ZW06IExpc3RJdGVtRGlyZWN0aXZlLCBzdGF0ZVBlcnNpc3RlbmNlVHJpZ2dlcmVkPykge1xuICAgICAgICAvLyBpdGVtIGlzIG5vdCBhbGxvd2VkIHRvIGdldCBzZWxlY3RlZCBpZiBpdCBpcyBkaXNhYmxlZC5cbiAgICAgICAgaWYgKCRsaXN0SXRlbSAmJiAhJGxpc3RJdGVtLmRpc2FibGVJdGVtKSB7XG4gICAgICAgICAgICBsZXQgaXRlbSA9ICRsaXN0SXRlbS5pdGVtO1xuICAgICAgICAgICAgaWYgKHRoaXMuZ3JvdXBieSAmJiBfLmhhcyhpdGVtLCAnX2dyb3VwSW5kZXgnKSkge1xuICAgICAgICAgICAgICAgIC8vIElmIGdyb3VwYnkgaXMgZW5hYmxlZCwgaXRlbSBjb250YWlucyBfZ3JvdXBJbmRleCBwcm9wZXJ0eSB3aGljaCBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSBzZWxlY3RlZGl0ZW0uXG4gICAgICAgICAgICAgICAgaXRlbSA9IF8uY2xvbmUoaXRlbSk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGl0ZW0uX2dyb3VwSW5kZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoJGxpc3RJdGVtLmlzQWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5faXRlbXMgPSBfLnB1bGxBbGxXaXRoKHRoaXMuX2l0ZW1zLCBbaXRlbV0sIF8uaXNFcXVhbCk7XG4gICAgICAgICAgICAgICAgJGxpc3RJdGVtLmlzQWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGlmIG11bHRpc2VsZWN0IGlzIGZhbHNlLCBjbGVhciB0aGUgc2VsZWN0SXRlbSBsaXN0IGJlZm9yZSBhZGRpbmcgYW4gaXRlbSB0byB0aGUgc2VsZWN0SXRlbSBsaXN0LlxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5tdWx0aXNlbGVjdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFyU2VsZWN0ZWRJdGVtcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9pdGVtcy5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnc2VsZWN0Jywge3dpZGdldDogJGxpc3RJdGVtLCAkZGF0YTogaXRlbX0pO1xuICAgICAgICAgICAgICAgICRsaXN0SXRlbS5pc0FjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkSXRlbXNXaWRnZXRzKHN0YXRlUGVyc2lzdGVuY2VUcmlnZ2VyZWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWV0aG9kIGlzIEludm9rZWQgd2hlbiB0aGUgbW9kZWwgZm9yIHRoZSBMaXN0IFdpZGdldCBpcyBjaGFuZ2VkLlxuICAgICAqIEBwYXJhbSB7UXVlcnlMaXN0PExpc3RJdGVtRGlyZWN0aXZlPn0gbGlzdEl0ZW1zXG4gICAgICovXG4gICAgcHJpdmF0ZSBvbkxpc3RSZW5kZXIobGlzdEl0ZW1zOiBRdWVyeUxpc3Q8TGlzdEl0ZW1EaXJlY3RpdmU+KSB7XG4gICAgICAgIC8vIEFkZGVkIHJlbmRlciBjYWxsYmFjayBldmVudC4gVGhpcyBtZXRob2Qob25MaXN0UmVuZGVyKSBpcyBjYWxsaW5nIG11bHRpcGxlIHRpbWVzIHNvIGNoZWNraW5nIGlzRGF0YWNoYW5nZWQgZmxhZyBiZWNhdXNlIHRoaXMgZmFsZyBpcyBjaGFuZ2VkIHdoZW5ldmVyIG5ldyBkYXRhIGlzIHJlbmRlcmVkLlxuICAgICAgICBpZiAodGhpcy5pc0RhdGFDaGFuZ2VkKSB7XG4gICAgICAgICAgICAvLyBXaGVuZXZlciBkYXRhc2V0IGlzIGNoYW5nZWQsIHRyaWdnZXIgd2F0Y2hlcnMgdG8gZXZhbHVhdGUgbGlzdGl0ZW0gYmluZCBleHByZXNzaW9ucy5cbiAgICAgICAgICAgICRpbnZva2VXYXRjaGVycyh0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygncmVuZGVyJywgeyRkYXRhOiB0aGlzLmZpZWxkRGVmc30pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzRGF0YUNoYW5nZWQgJiYgdGhpcy5nZXRDb25maWd1cmVkU3RhdGUoKSAhPT0gJ25vbmUnICYmIGxpc3RJdGVtcy5sZW5ndGggJiYgdGhpcy5fc2VsZWN0ZWRJdGVtc0V4aXN0KSB7XG4gICAgICAgICAgICBjb25zdCB3aWRnZXRTdGF0ZSA9IHRoaXMuc3RhdGVQZXJzaXN0ZW5jZS5nZXRXaWRnZXRTdGF0ZSh0aGlzKTtcbiAgICAgICAgICAgIGlmIChfLmdldCh3aWRnZXRTdGF0ZSwgJ3NlbGVjdGVkSXRlbScpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRJdGVtc0V4aXN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtc0xlbmd0aCA9IF8uaXNBcnJheSh0aGlzLnNlbGVjdGVkaXRlbSkgPyB0aGlzLnNlbGVjdGVkaXRlbS5sZW5ndGggOiBfLnRvTnVtYmVyKCFfLmlzRW1wdHkodGhpcy5zZWxlY3RlZGl0ZW0pKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50UGFnZSA9IF8uZ2V0KHRoaXMuZGF0YU5hdmlnYXRvciwgJ2RuLmN1cnJlbnRQYWdlJykgfHwgMTtcbiAgICAgICAgICAgICAgICB3aWRnZXRTdGF0ZS5wYWdpbmF0aW9uID0gd2lkZ2V0U3RhdGUucGFnaW5hdGlvbiB8fCAxO1xuICAgICAgICAgICAgICAgIC8vIHRvIHByZXZlbnQgaXRlbSBzZWxlY3Rpb24gZnJvbSBiZWluZyB0cmlnZ2VyZWQgbW9yZSB0aGFuIG9uY2VcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRJdGVtc0xlbmd0aCAhPT0gd2lkZ2V0U3RhdGUuc2VsZWN0ZWRJdGVtLmxlbmd0aCAmJiB3aWRnZXRTdGF0ZS5wYWdpbmF0aW9uID09PSBjdXJyZW50UGFnZSkge1xuICAgICAgICAgICAgICAgICAgICB3aWRnZXRTdGF0ZS5zZWxlY3RlZEl0ZW0uZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0ucGFnZSA9PT0gY3VycmVudFBhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEl0ZW0oaXRlbS5pbmRleCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZW1zID0gXy5pc0FycmF5KHRoaXMuc2VsZWN0ZWRpdGVtKSA/IHRoaXMuc2VsZWN0ZWRpdGVtIDogW3RoaXMuc2VsZWN0ZWRpdGVtXTtcblxuICAgICAgICB0aGlzLmZpcnN0U2VsZWN0ZWRJdGVtID0gdGhpcy5sYXN0U2VsZWN0ZWRJdGVtID0gbnVsbDtcblxuICAgICAgICAvLyBkb24ndCBzZWxlY3QgZmlyc3QgaXRlbSBpZiBtdWx0aS1zZWxlY3QgaXMgZW5hYmxlZCBhbmQgYXQgbGVhc3QgaXRlbSBpcyBhbHJlYWR5IHNlbGVjdGVkIGluIHRoZSBsaXN0LlxuICAgICAgICAvLyBkb24ndCBzZWxlY3QgZmlyc3QgaXRlbSBpZiBzdGF0ZSBpbmZvcm1hdGlvbiBoYXMgc2VsZWN0ZWQgaXRlbXNcbiAgICAgICAgaWYgKGxpc3RJdGVtcy5sZW5ndGggJiYgdGhpcy5zZWxlY3RmaXJzdGl0ZW0gJiYgISggdGhpcy5faXRlbXMubGVuZ3RoICYmIHRoaXMubXVsdGlzZWxlY3QpICYmIHRoaXMuX3NlbGVjdGVkSXRlbXNFeGlzdCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGNvbnN0ICRmaXJzdEl0ZW06IExpc3RJdGVtRGlyZWN0aXZlID0gbGlzdEl0ZW1zLmZpcnN0O1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgISRmaXJzdEl0ZW0uZGlzYWJsZUl0ZW0gJiZcbiAgICAgICAgICAgICAgICB0aGlzLmlzRGF0YUNoYW5nZWQgJiZcbiAgICAgICAgICAgICAgICAvLyBcImluZmluaXRlIHNjcm9sbFwiIG9yIFwibG9hZCBvbiBkZW1hbmRcIiBpcyBlbmFibGVkIGFuZCBhdCBsZWFzdCBvbmUgaXRlbSBpcyBzZWxlY3RlZCB0aGVuIGRvbnQgYWx0ZXIgdGhlIHNlbGVjdGVkIGxpc3QgaXRlbXMuXG4gICAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuaW5mU2Nyb2xsIHx8IHRoaXMub25EZW1hbmRMb2FkKSAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pdGVtcy5sZW5ndGhcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyU2VsZWN0ZWRJdGVtcygpO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyc3RTZWxlY3RlZEl0ZW0gPSB0aGlzLmxhc3RTZWxlY3RlZEl0ZW0gPSAkZmlyc3RJdGVtO1xuICAgICAgICAgICAgICAgIC8vIHNlbGVjdGluZyB0aGUgZmlyc3QgcmVjb3JkXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtKDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kZXNlbGVjdExpc3RJdGVtcygpO1xuICAgICAgICAgICAgc2VsZWN0ZWRJdGVtcy5mb3JFYWNoKHNlbGVjdGVkaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGlzdEl0ZW06IExpc3RJdGVtRGlyZWN0aXZlID0gdGhpcy5nZXRMaXN0SXRlbUJ5TW9kZWwoc2VsZWN0ZWRpdGVtKTtcbiAgICAgICAgICAgICAgICBpZiAobGlzdEl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdEl0ZW0uaXNBY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZEl0ZW0gPSBsaXN0SXRlbTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9jdXMgdGhlIGFjdGl2ZSBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgIGxpc3RJdGVtLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmZpZWxkRGVmcy5sZW5ndGggJiYgdGhpcy5pbmZTY3JvbGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHNtb290aFNjcm9sbEVsID0gdGhpcy4kZWxlbWVudC5jbG9zZXN0KCdbd21zbW9vdGhzY3JvbGxdJyk7XG4gICAgICAgICAgICAvLyBpZiBzbW9vdGhzY3JvbGwgaXMgc2V0IHRvIGZhbHNlLCB0aGVuIG5hdGl2ZSBzY3JvbGwgaGFzIHRvIGJlIGFwcGxpZWRcbiAgICAgICAgICAgIC8vIG90aGVyd2lzZSBzbW9vdGhzY3JvbGwgZXZlbnRzIHdpbGwgYmUgYmluZGVkLlxuICAgICAgICAgICAgaWYgKGlzTW9iaWxlQXBwKCkgJiYgc21vb3RoU2Nyb2xsRWwubGVuZ3RoICYmIHNtb290aFNjcm9sbEVsLmF0dHIoJ3dtc21vb3Roc2Nyb2xsJykgPT09ICd0cnVlJykge1xuICAgICAgICAgICAgICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2UuYmluZElTY3JvbGxFdnQodGhpcywgREVCT1VOQ0VfVElNRVMuUEFHSU5BVElPTl9ERUJPVU5DRV9USU1FKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiBtb2JpbGUgYXBwIHdoZW4gbW9kYWwgZXhpc3RzLCBhbmQgbGlzdCBpdGVtcyBoZWlnaHQgaXMgZ3JlYXRlciB0aGFuIHRoZSBtb2RhbCBjb250ZW50IHByb3ZpZGUgY2NvbnRhaW5lciBhIHNjcm9sbGFibGUgaGVpZ2h0XG4gICAgICAgICAgICAgICAgY29uc3QgbW9kYWxCb2R5ID0gdGhpcy4kZWxlbWVudC5jbG9zZXN0KCcubW9kYWwtYm9keScpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RIdCA9IHRoaXMuJGVsZW1lbnQuZmluZCgndWwnKS5oZWlnaHQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtb2RhbEh0ID0gd2luZG93LmlubmVySGVpZ2h0IC0gMTQwO1xuICAgICAgICAgICAgICAgIGlmIChpc01vYmlsZSgpICYmIG1vZGFsQm9keS5sZW5ndGggJiYgbGlzdEh0ID4gbW9kYWxIdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiRlbGVtZW50LmNzcygnaGVpZ2h0JywgbW9kYWxIdCArICdweCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLmJpbmRTY3JvbGxFdnQodGhpcywgJz4gdWwnLCBERUJPVU5DRV9USU1FUy5QQUdJTkFUSU9OX0RFQk9VTkNFX1RJTUUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pc0RhdGFDaGFuZ2VkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHRyaWdnZXJMaXN0SXRlbVNlbGVjdGlvbigkZWw6IEpRdWVyeTxIVE1MRWxlbWVudD4sICRldmVudDogRXZlbnQpIHtcbiAgICAgICAgaWYgKCRlbCAmJiAkZWxbMF0pIHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RJdGVtQ29udGV4dCA9ICRlbC5kYXRhKCdsaXN0SXRlbUNvbnRleHQnKTtcbiAgICAgICAgICAgIC8vIFRyaWdnZXIgY2xpY2sgZXZlbnQgb25seSBpZiB0aGUgbGlzdCBpdGVtIGlzIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgbGlzdC5cbiAgICAgICAgICAgIGlmIChsaXN0SXRlbUNvbnRleHQubGlzdENvbXBvbmVudCA9PT0gdGhpcykge1xuICAgICAgICAgICAgICAgIHRoaXMub25JdGVtQ2xpY2soJGV2ZW50LCBsaXN0SXRlbUNvbnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXR1cEhhbmRsZXJzKCkge1xuICAgICAgICB0aGlzLmxpc3RJdGVtcy5jaGFuZ2VzLnN1YnNjcmliZSggbGlzdEl0ZW1zID0+IHtcbiAgICAgICAgICAgIHRoaXMub25MaXN0UmVuZGVyKGxpc3RJdGVtcyk7XG4gICAgICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGhhbmRsZSBjbGljayBldmVudCBpbiBjYXB0dXJpbmcgcGhhc2UuXG4gICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCd1bC5hcHAtbGl2ZWxpc3QtY29udGFpbmVyJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoJGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gJCgkZXZlbnQudGFyZ2V0KS5jbG9zZXN0KCcuYXBwLWxpc3QtaXRlbScpO1xuICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgZmluZCB0aGUgY3VycmVudCBsaXN0IGl0ZW1cbiAgICAgICAgICAgIHdoaWxlICh0YXJnZXQuZ2V0KDApICYmICh0YXJnZXQuY2xvc2VzdCgndWwuYXBwLWxpdmVsaXN0LWNvbnRhaW5lcicpLmdldCgwKSAhPT0gJGV2ZW50LmN1cnJlbnRUYXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudCgpLmNsb3Nlc3QoJy5hcHAtbGlzdC1pdGVtJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJMaXN0SXRlbVNlbGVjdGlvbih0YXJnZXQsICRldmVudCk7XG4gICAgICAgIH0sIHRydWUpO1xuICAgIH1cblxuICAgIC8vIFRyaWdnZXJzIG9uIGRyYWcgc3RhcnQgd2hpbGUgcmVvcmRlcmluZy5cbiAgICBwcml2YXRlIG9uUmVvcmRlclN0YXJ0KGV2dCwgdWkpIHtcbiAgICAgICAgdWkucGxhY2Vob2xkZXIuaGVpZ2h0KHVpLml0ZW0uaGVpZ2h0KCkpO1xuICAgICAgICB0aGlzLiR1bEVsZS5kYXRhKCdvbGRJbmRleCcsIHVpLml0ZW0uaW5kZXgoKSk7XG4gICAgfVxuXG4gICAgLy8gVHJpZ2dlcnMgZHVyaW5nIHNvcnRpbmdcbiAgICBwcml2YXRlIG9uU29ydChldnQsIHVpKSB7XG4gICAgICAgIC8vIEluIGNhc2Ugb2YgaW5maW5pdGUgc2Nyb2xsLCB3aGVuIHRoZSBlbGVtZW50IGRvZXNuJ3QgaGF2ZSBzY3JvbGwgZW5hYmxlZFxuICAgICAgICAvLyBvbiBkcmFnZ2luZyB0aGUgZWxlbWVudCB0byBsYXN0IGl0ZW0ncyBwb3NpdGlvbiBtYW51YWxseSB0cmlnZ2VyIGxvYWRpbmcgb2YgbmV4dCBpdGVtc1xuICAgICAgICBpZiAodGhpcy5pbmZTY3JvbGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RJdGVtT2Zmc2V0ID0gdGhpcy4kdWxFbGUuZmluZChgW2xpc3RpdGVtaW5kZXg9JHt0aGlzLmZpZWxkRGVmcy5sZW5ndGggLSAxfV1gKS5vZmZzZXQoKTtcbiAgICAgICAgICAgIGlmIChsYXN0SXRlbU9mZnNldCAmJiBsYXN0SXRlbU9mZnNldC50b3AgPCB1aS5vZmZzZXQudG9wKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS5iaW5kU2Nyb2xsRXZ0KHRoaXMsICc+IHVsJywgREVCT1VOQ0VfVElNRVMuUEFHSU5BVElPTl9ERUJPVU5DRV9USU1FKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlYm91bmNlZEZldGNoTmV4dERhdGFzZXRPblNjcm9sbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICAvLyBUcmlnZ2VycyBhZnRlciB0aGUgc29ydGluZy5cbiAgICBwcml2YXRlIG9uVXBkYXRlKGV2dCwgdWkpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZmllbGREZWZzO1xuICAgICAgICBjb25zdCBuZXdJbmRleCA9IHVpLml0ZW0uaW5kZXgoKTtcbiAgICAgICAgY29uc3Qgb2xkSW5kZXggPSB0aGlzLiR1bEVsZS5kYXRhKCdvbGRJbmRleCcpO1xuXG4gICAgICAgIGNvbnN0IG1pbkluZGV4ID0gXy5taW4oW25ld0luZGV4LCBvbGRJbmRleF0pO1xuICAgICAgICBjb25zdCBtYXhJbmRleCA9IF8ubWF4KFtuZXdJbmRleCwgb2xkSW5kZXhdKTtcblxuICAgICAgICBjb25zdCBkcmFnZ2VkSXRlbSA9IF8ucHVsbEF0KGRhdGEsIG9sZEluZGV4KVswXTtcbiAgICAgICAgLy8gTW9kaWZ5IHRoZSBkYXRhIGxpc3Qgb25seSBpZiB3ZSBmaW5kIGEgZHJhZ2dlZEl0ZW1cbiAgICAgICAgaWYgKGRyYWdnZWRJdGVtKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5nZXRDb25maWd1cmVkU3RhdGUoKSAhPT0gJ25vbmUnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZVBlcnNpc3RlbmNlLnJlbW92ZVdpZGdldFN0YXRlKHRoaXMsICdzZWxlY3RlZEl0ZW0nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5yZW9yZGVyUHJvcHMubWluSW5kZXggPSBfLm1pbihbbWluSW5kZXgsIHRoaXMucmVvcmRlclByb3BzLm1pbkluZGV4XSk7XG4gICAgICAgICAgICB0aGlzLnJlb3JkZXJQcm9wcy5tYXhJbmRleCA9IF8ubWF4KFttYXhJbmRleCwgdGhpcy5yZW9yZGVyUHJvcHMubWF4SW5kZXhdKTtcblxuICAgICAgICAgICAgZGF0YS5zcGxpY2UobmV3SW5kZXgsIDAsIGRyYWdnZWRJdGVtKTtcblxuICAgICAgICAgICAgdGhpcy5jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgY29uc3QgJGNoYW5nZWRJdGVtID0ge1xuICAgICAgICAgICAgICAgIG9sZEluZGV4OiBvbGRJbmRleCxcbiAgICAgICAgICAgICAgICBuZXdJbmRleDogbmV3SW5kZXgsXG4gICAgICAgICAgICAgICAgaXRlbTogZGF0YVtuZXdJbmRleF1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ3Jlb3JkZXInLCB7JGV2ZW50OiBldnQsICRkYXRhOiBkYXRhLCAkY2hhbmdlZEl0ZW19KTtcbiAgICAgICAgICAgIHRoaXMuJHVsRWxlLnJlbW92ZURhdGEoJ29sZEluZGV4Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb25maWd1cmVzIHJlb3JkZXJpbmcgdGhlIGxpc3QgaXRlbXMuXG4gICAgcHJpdmF0ZSBjb25maWd1cmVEbkQoKSB7XG4gICAgICAgIGxldCBhcHBlbmRUbztcbiAgICAgICAgY29uc3QgbW9kYWxFbCA9ICQoZG9jdW1lbnQpLmZpbmQoJy5tb2RhbCcpO1xuICAgICAgICBpZiAodGhpcy5nZXRBdHRyKCdoZWlnaHQnKSkgeyAvLyB3aGVuIGhlaWdodCBpcyBhcHBsaWVkIHRvIHRoZSBsaXN0LCBhcHBlbmQgc2hvdWxkIGJlIHRoZSB1bCdzIHBhcmVudCBhcyBzY3JvbGwgaXMgYXBwbGllZCB0byB0aGUgcGFyZW50XG4gICAgICAgICAgYXBwZW5kVG8gPSAncGFyZW50JztcbiAgICAgICAgfSBlbHNlIGlmIChtb2RhbEVsLmxlbmd0aCkgeyAvLyBJbiBjYXNlIG9mIGRpYWxvZywgYXBwZW5kVG8gc2hvdWxkIGJlIHRoZSBtb2RhbCBlbGVcbiAgICAgICAgICAgIGFwcGVuZFRvID0gbW9kYWxFbFttb2RhbEVsLmxlbmd0aCAtIDFdO1xuICAgICAgICB9IGVsc2UgeyAvLyBBcyBkZWZhdWx0IGFwcGVuZCB0byBzaG91bGQgYmUgYm9keVxuICAgICAgICAgICAgYXBwZW5kVG8gPSAnYm9keSc7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvcHRpb25zID0gaXNNb2JpbGVBcHAoKSA/IHt9IDoge1xuICAgICAgICAgICAgYXBwZW5kVG86IGFwcGVuZFRvLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0ICRlbCA9ICQodGhpcy5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgdGhpcy4kdWxFbGUgPSAkZWwuZmluZCgnLmFwcC1saXZlbGlzdC1jb250YWluZXInKTtcblxuICAgICAgICBjb25maWd1cmVEbkQodGhpcy4kdWxFbGUsIG9wdGlvbnMsIHRoaXMub25SZW9yZGVyU3RhcnQuYmluZCh0aGlzKSwgdGhpcy5vblVwZGF0ZS5iaW5kKHRoaXMpLCB0aGlzLm9uU29ydC5iaW5kKHRoaXMpKTtcblxuICAgICAgICB0aGlzLiR1bEVsZS5kcm9wcGFibGUoeydhY2NlcHQnOiAnLmFwcC1saXN0LWl0ZW0nfSk7XG5cbiAgICAgICAgaWYgKGlzTW9iaWxlQXBwKCkpIHtcbiAgICAgICAgICAgIHRoaXMuJHVsRWxlLnNvcnRhYmxlKCdkaXNhYmxlJyk7XG4gICAgICAgICAgICB0aGlzLiR1bEVsZS5vbigndG91Y2hzdGFydCcsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuICAgICAgICAgICAgICAgIGlmICghc2VsZi50b3VjaGluZykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi50b3VjaGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoc2VsZi50b3VjaGVkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vUHJldmVudCBjb250ZXh0IG1lbnUgb24gbW9iaWxlIChJT1MvQU5EUk9JRClcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5jYW5jZWxhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwgNTApO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLnRvdWNoZWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICQoZXZlbnQuY3VycmVudFRhcmdldCkuYWRkQ2xhc3MoJ25vLXNlbGVjdGlvbicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9FbmFibGUgZHJhZ2dhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpLnNvcnRhYmxlKCdlbmFibGUnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9TZXQgaW50ZXJuYWwgZmxhZ1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50b3VjaGluZyA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vdHJpZ2dlciB0b3VjaHN0YXJ0IGFnYWluIHRvIGVuYWJsZSBkcmFnZ2FibGUgdGhyb3VnaCB0b3VjaCBwdW5jaFxuICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmKS50cmlnZ2VyKGV2ZW50KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9DaG9vc2UgcHJlZmVycmVkIGR1cmF0aW9uIGZvciB0YXBob2xkXG4gICAgICAgICAgICAgICAgICAgIH0sIDM1MCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkub24oJ3RvdWNoZW5kJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b3VjaGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICQoZXZlbnQuY3VycmVudFRhcmdldCkucmVtb3ZlQ2xhc3MoJ25vLXNlbGVjdGlvbicpO1xuXG4gICAgICAgICAgICAgICAgLy9EaXNhYmxlIGRyYWdnYWJsZSB0byBlbmFibGUgZGVmYXVsdCBiZWhhdmlvdXJcbiAgICAgICAgICAgICAgICAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpLnNvcnRhYmxlKCdkaXNhYmxlJyk7XG5cbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50b3VjaGVkKTtcbiAgICAgICAgICAgIH0pLm9uKCd0b3VjaG1vdmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudG91Y2hlZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgLy8gcmV0dXJucyB0cnVlIGlmIHRoZSBzZWxlY3Rpb24gbGltaXQgaXMgcmVhY2hlZC5cbiAgICBwcml2YXRlIGNoZWNrU2VsZWN0aW9uTGltaXQoY291bnQ6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gKCF0aGlzLnNlbGVjdGlvbmxpbWl0IHx8IGNvdW50IDwgdGhpcy5zZWxlY3Rpb25saW1pdCk7XG4gICAgfVxuXG4gICAgLy8gcmV0dXJucyBsaXN0aXRlbSByZWZlcmVuY2UgYnkgaW5kZXggdmFsdWUuXG4gICAgcHJpdmF0ZSBnZXRMaXN0SXRlbUJ5SW5kZXgoaW5kZXg6IG51bWJlcik6IExpc3RJdGVtRGlyZWN0aXZlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdEl0ZW1zLnRvQXJyYXkoKVtpbmRleF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIGluZGV4IG9mIGFuIChsaXN0SXRlbURpcmVjdGl2ZSkgaW4gdGhlIGxpc3RJdGVtXG4gICAgICogQHBhcmFtIHtMaXN0SXRlbURpcmVjdGl2ZX0gaXRlbVxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRMaXN0SXRlbUluZGV4KGl0ZW06IExpc3RJdGVtRGlyZWN0aXZlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpc3RJdGVtcy50b0FycmF5KCkuaW5kZXhPZihpdGVtKTtcbiAgICB9XG5cbiAgICAvLyB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgZm9ybSBvdGhlciBkYXRhIHdpZGdldHMgbGlrZSB0YWJsZS5cbiAgICBwdWJsaWMgZXhlY3V0ZShvcGVyYXRpb24sIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKFtEYXRhU291cmNlLk9wZXJhdGlvbi5JU19BUElfQVdBUkUsIERhdGFTb3VyY2UuT3BlcmF0aW9uLklTX1BBR0VBQkxFLCBEYXRhU291cmNlLk9wZXJhdGlvbi5TVVBQT1JUU19TRVJWRVJfRklMVEVSXS5pbmNsdWRlcyhvcGVyYXRpb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YXNvdXJjZS5leGVjdXRlKG9wZXJhdGlvbiwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHVibGljIGhhbmRsZUtleURvd24oJGV2ZW50LCBhY3Rpb246IHN0cmluZykge1xuICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGlmKCRldmVudC5rZXlDb2RlICE9PSAxMyAmJiAkZXZlbnQua2V5Q29kZSAhPT0gOSAmJiAhKCgkZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnZm9ybS1jb250cm9sJykgfHwgJGV2ZW50LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ25vdGUtZWRpdGFibGUnKSkgJiYgJGV2ZW50LmtleUNvZGUgPT09IDMyKSApIHtcbiAgICAgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGlzdEl0ZW1zOiBRdWVyeUxpc3Q8TGlzdEl0ZW1EaXJlY3RpdmU+ID0gdGhpcy5saXN0SXRlbXM7XG5cbiAgICAgICAgbGV0IHByZXNlbnRJbmRleDogbnVtYmVyID0gdGhpcy5nZXRMaXN0SXRlbUluZGV4KHRoaXMubGFzdFNlbGVjdGVkSXRlbSk7XG5cbiAgICAgICAgaWYgKHRoaXMubXVsdGlzZWxlY3QpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0SW5kZXg6IG51bWJlciA9IHRoaXMuZ2V0TGlzdEl0ZW1JbmRleCh0aGlzLmZpcnN0U2VsZWN0ZWRJdGVtKTtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdENvdW50OiBudW1iZXIgPSBfLmlzQXJyYXkodGhpcy5zZWxlY3RlZGl0ZW0pID8gdGhpcy5zZWxlY3RlZGl0ZW0ubGVuZ3RoIDogKF8uaXNPYmplY3QodGhpcy5zZWxlY3RlZGl0ZW0pID8gMSA6IDApO1xuICAgICAgICAgICAgaWYgKGFjdGlvbiA9PT0gJ3NlbGVjdFByZXYnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByZXNlbnRJbmRleCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVzZW50SW5kZXggPD0gZmlyc3RJbmRleCkgJiYgdGhpcy5jaGVja1NlbGVjdGlvbkxpbWl0KHNlbGVjdENvdW50KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWRJdGVtID0gdGhpcy5nZXRMaXN0SXRlbUJ5SW5kZXgoIHByZXNlbnRJbmRleCAtIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGVMaXN0SXRlbVNlbGVjdGlvbih0aGlzLmxhc3RTZWxlY3RlZEl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByZXNlbnRJbmRleCA+IGZpcnN0SW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlTGlzdEl0ZW1TZWxlY3Rpb24odGhpcy5nZXRMaXN0SXRlbUJ5SW5kZXgocHJlc2VudEluZGV4KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZEl0ZW0gPSB0aGlzLmdldExpc3RJdGVtQnlJbmRleChwcmVzZW50SW5kZXggLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnc2VsZWN0aW9ubGltaXRleGNlZWQnLCB7JGV2ZW50fSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gJ3NlbGVjdE5leHQnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByZXNlbnRJbmRleCA8IGxpc3RJdGVtcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgocHJlc2VudEluZGV4ID49IGZpcnN0SW5kZXgpICYmIHRoaXMuY2hlY2tTZWxlY3Rpb25MaW1pdChzZWxlY3RDb3VudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkSXRlbSA9IHRoaXMuZ2V0TGlzdEl0ZW1CeUluZGV4KHByZXNlbnRJbmRleCArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGVMaXN0SXRlbVNlbGVjdGlvbih0aGlzLmxhc3RTZWxlY3RlZEl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByZXNlbnRJbmRleCA8IGZpcnN0SW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlTGlzdEl0ZW1TZWxlY3Rpb24odGhpcy5nZXRMaXN0SXRlbUJ5SW5kZXgocHJlc2VudEluZGV4KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZEl0ZW0gPSB0aGlzLmdldExpc3RJdGVtQnlJbmRleChwcmVzZW50SW5kZXggKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnc2VsZWN0aW9ubGltaXRleGNlZWQnLCB7JGV2ZW50fSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFjdGlvbiA9PT0gJ2ZvY3VzUHJldicpIHtcbiAgICAgICAgICAgIGlmKHRoaXMuaXNMaXN0RWxlbWVudE1vdmFibGUpIHtcbiAgICAgICAgICAgICAgICBsZXQgcHJldjtcbiAgICAgICAgICAgICAgICBwcmVzZW50SW5kZXggPSBwcmVzZW50SW5kZXggPD0gMCA/IDAgOiAocHJlc2VudEluZGV4KTtcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZEl0ZW0gPSB0aGlzLmdldExpc3RJdGVtQnlJbmRleChwcmVzZW50SW5kZXgpO1xuICAgICAgICAgICAgICAgIGlmKHByZXNlbnRJbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBwcmV2ID0gdGhpcy5saXN0SXRlbXMubGFzdDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RJdGVtcy5mb3JFYWNoKCgkbGlJdGVtOiBMaXN0SXRlbURpcmVjdGl2ZSwgaWR4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmKGlkeCA9PT0gcHJlc2VudEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2Lm5hdGl2ZUVsZW1lbnQuYmVmb3JlKCRsaUl0ZW0ubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZEl0ZW0ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyID0gdGhpcy5saXN0SXRlbXMudG9BcnJheSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlbXAgPSBhcnJbcHJlc2VudEluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFycltwcmVzZW50SW5kZXhdID0gYXJyW3ByZXNlbnRJbmRleC0xXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFycltwcmVzZW50SW5kZXgtMV0gPSB0ZW1wO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5saXN0SXRlbXMucmVzZXQoYXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEluZGV4ID0gcHJlc2VudEluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcmlhVGV4dCA9IFwic2VsZWN0ZWQgXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcHJldiA9ICRsaUl0ZW07XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHByZXNlbnRJbmRleCA9IHByZXNlbnRJbmRleCA8PSAwID8gMCA6IChwcmVzZW50SW5kZXggLSAxKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZEl0ZW0gPSB0aGlzLmdldExpc3RJdGVtQnlJbmRleChwcmVzZW50SW5kZXgpO1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkSXRlbS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSBwcmVzZW50SW5kZXggKyAxO1xuICAgICAgICAgICAgICAgIHRoaXMuYXJpYVRleHQgPSBcInNlbGVjdGVkIFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2ZvY3VzTmV4dCcpIHtcbiAgICAgICAgICAgIGlmKHRoaXMuaXNMaXN0RWxlbWVudE1vdmFibGUpIHtcbiAgICAgICAgICAgICAgICBsZXQgcHJldjtcbiAgICAgICAgICAgICAgICBwcmVzZW50SW5kZXggPSBwcmVzZW50SW5kZXggPCAobGlzdEl0ZW1zLmxlbmd0aCAtIDEpID8gKHByZXNlbnRJbmRleCkgOiAobGlzdEl0ZW1zLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkSXRlbSA9IHRoaXMuZ2V0TGlzdEl0ZW1CeUluZGV4KHByZXNlbnRJbmRleCk7XG4gICAgICAgICAgICAgICAgaWYocHJlc2VudEluZGV4ID09PSB0aGlzLmxpc3RJdGVtcy5sZW5ndGggLSAxICkge1xuICAgICAgICAgICAgICAgICAgICBwcmV2ID0gdGhpcy5saXN0SXRlbXMuZmlyc3Q7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5saXN0SXRlbXMuZm9yRWFjaCgoJGxpSXRlbTogTGlzdEl0ZW1EaXJlY3RpdmUsIGlkeCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZihpZHggPT09IHByZXNlbnRJbmRleCArMSApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXYubmF0aXZlRWxlbWVudC5iZWZvcmUoJGxpSXRlbS5uYXRpdmVFbGVtZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWRJdGVtLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyciA9IHRoaXMubGlzdEl0ZW1zLnRvQXJyYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZW1wID0gYXJyW3ByZXNlbnRJbmRleCArMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBhcnJbcHJlc2VudEluZGV4ICsxXSA9IGFycltwcmVzZW50SW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJyW3ByZXNlbnRJbmRleF0gPSB0ZW1wO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5saXN0SXRlbXMucmVzZXQoYXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEluZGV4ID0gaWR4ICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXJpYVRleHQgPSBcInNlbGVjdGVkIFwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHByZXYgPSAkbGlJdGVtO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwcmVzZW50SW5kZXggPSBwcmVzZW50SW5kZXggPCAobGlzdEl0ZW1zLmxlbmd0aCAtIDEpID8gKHByZXNlbnRJbmRleCArIDEpIDogKGxpc3RJdGVtcy5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZEl0ZW0gPSB0aGlzLmdldExpc3RJdGVtQnlJbmRleChwcmVzZW50SW5kZXgpO1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkSXRlbS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSBwcmVzZW50SW5kZXggKyAxO1xuICAgICAgICAgICAgICAgIHRoaXMuYXJpYVRleHQgPSBcInNlbGVjdGVkIFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gJ3NlbGVjdCcpIHtcbiAgICAgICAgICAgIC8vIGlmIHRoZSBlbnRlciBjbGljayBpcyBwcmVzc2VkIG9uIHRoZSBpdGVtIHdoaWNoIGlzIG5vdCB0aGUgbGFzdCBzZWxlY3RlZCBpdGVtLCB0aGUgZmluZCB0aGUgaXRlbSBmcm9tIHdoaWNoIHRoZSBldmVudCBpcyBvcmlnaW5hdGVkLlxuICAgICAgICAgICAgaWYgKHByZXNlbnRJbmRleCA9PT0gLTEgfHwgISQoJGV2ZW50LnRhcmdldCkuY2xvc2VzdCh0aGlzLmxhc3RTZWxlY3RlZEl0ZW0ubmF0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCAkbGkgPSAkKCRldmVudC50YXJnZXQpLmNsb3Nlc3QoJ2xpLmFwcC1saXN0LWl0ZW0nKTtcbiAgICAgICAgICAgICAgICBjb25zdCAkdWwgPSAkbGkuY2xvc2VzdCgndWwuYXBwLWxpdmVsaXN0LWNvbnRhaW5lcicpO1xuICAgICAgICAgICAgICAgIHByZXNlbnRJbmRleCA9ICR1bC5maW5kKCdsaS5hcHAtbGlzdC1pdGVtJykuaW5kZXgoJGxpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub25JdGVtQ2xpY2soJGV2ZW50LCB0aGlzLmdldExpc3RJdGVtQnlJbmRleChwcmVzZW50SW5kZXgpKTtcbiAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT09ICdzcGFjZScpIHtcbiAgICAgICAgICAgIGlmKCF0aGlzLmVuYWJsZXJlb3JkZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmlzTGlzdEVsZW1lbnRNb3ZhYmxlID0gIXRoaXMuaXNMaXN0RWxlbWVudE1vdmFibGU7XG4gICAgICAgICAgICB0aGlzLm9uSXRlbUNsaWNrKCRldmVudCwgdGhpcy5nZXRMaXN0SXRlbUJ5SW5kZXgocHJlc2VudEluZGV4KSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRJbmRleCA9IHByZXNlbnRJbmRleCArIDE7XG4gICAgICAgICAgICBsZXQgbmFtZSA9IHRoaXMuZ2V0TGlzdEl0ZW1CeUluZGV4KHByZXNlbnRJbmRleCkuaXRlbS5uYW1lO1xuICAgICAgICAgICAgaWYodGhpcy5pc0xpc3RFbGVtZW50TW92YWJsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXJpYVRleHQgPSBuYW1lICsgXCIgZ3JhYmJlZCwgY3VycmVudCBwb3NpdGlvbiBcIjtcbiAgICAgICAgICAgIH0gICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFyaWFUZXh0ID0gIG5hbWUgKyAgXCIgZHJvcHBlZCwgZmluYWwgcG9zaXRpb24gXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvblByb3BlcnR5Q2hhbmdlKGtleTogc3RyaW5nLCBudjogYW55LCBvdj86IGFueSkge1xuICAgICAgICBpZiAoa2V5ID09PSAnZGF0YXNldCcpIHtcbiAgICAgICAgICAgIGlmICghbnYgJiYgdGhpcy5iaW5kZGF0YXNvdXJjZSAmJiAhdGhpcy5kYXRhc291cmNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vbkRhdGFTZXRDaGFuZ2UobnYpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2RhdGFzb3VyY2UnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhc2V0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkRhdGFTZXRDaGFuZ2UodGhpcy5kYXRhc2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICduYXZpZ2F0aW9uJykge1xuICAgICAgICAgICAgLy8gU3VwcG9ydCBmb3Igb2xkZXIgcHJvamVjdHMgd2hlcmUgbmF2aWdhdGlvbiB0eXBlIHdhcyBhZHZhbmNlZCBpbnN0ZWFkIG9mIGNsYXNzaWNcbiAgICAgICAgICAgIGlmIChudiA9PT0gJ0FkdmFuY2VkJykge1xuICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvbiA9ICdDbGFzc2ljJztcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzd2l0Y2hDbGFzcyh0aGlzLm5hdGl2ZUVsZW1lbnQsIG52LCBvdik7XG4gICAgICAgICAgICB0aGlzLm9uTmF2aWdhdGlvblR5cGVDaGFuZ2UobnYpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YU5hdmlnYXRvcikge1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YU5hdmlnYXRvci5uYXZpZ2F0aW9uQ2xhc3MgPSB0aGlzLnBhZ2luYXRpb25jbGFzcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdpdGVtc3BlcnJvdycpIHtcbiAgICAgICAgICAgIHNldExpc3RDbGFzcyh0aGlzKTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICd0YWJpbmRleCcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdwdWxsdG9yZWZyZXNoJyAmJiBudikge1xuICAgICAgICAgICAgdGhpcy5hcHAubm90aWZ5KCdwdWxsVG9SZWZyZXNoOmVuYWJsZScpO1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVUb1B1bGxUb1JlZnJlc2goKTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdwYWdpbmF0aW9uY2xhc3MnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhTmF2aWdhdG9yKSB7XG4gICAgICAgICAgICAgICAgLy8gQWRkaW5nIHNldFRpbWVvdXQgYmVjYXVzZSBpbiBwYWdpbmF0aW9uIGNvbXBvbmVudCB1cGRhdGVOYXZTaXplIG1ldGhvZCBpcyBvdmVycmlkaW5nIG5hdmlnYXRpb25jbGFzc1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoICgpID0+IHRoaXMuZGF0YU5hdmlnYXRvci5uYXZpZ2F0aW9uQ2xhc3MgPSBudik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAncGFnZXNpemUnKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGFOYXZpZ2F0b3Iub3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICBtYXhSZXN1bHRzOiBudlxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuZGF0YU5hdmlnYXRvci53aWRnZXQubWF4UmVzdWx0cyA9IG52O1xuICAgICAgICAgICAgdGhpcy5kYXRhTmF2aWdhdG9yLm1heFJlc3VsdHMgPSBudjtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdlbmFibGVyZW9yZGVyJykge1xuICAgICAgICAgICAgaWYgKG52KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmVEbkQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLiR1bEVsZS5zb3J0YWJsZSgnZW5hYmxlJyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuJHVsRWxlICYmICFudikge1xuICAgICAgICAgICAgICAgIHRoaXMuJHVsRWxlLnNvcnRhYmxlKCdkaXNhYmxlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdXBlci5vblByb3BlcnR5Q2hhbmdlKGtleSwgbnYsIG92KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvbkl0ZW1DbGljayhldnQ6IGFueSwgJGxpc3RJdGVtOiBMaXN0SXRlbURpcmVjdGl2ZSkge1xuICAgICAgICBsZXQgc2VsZWN0Q291bnQ6IG51bWJlcjtcblxuICAgICAgICBpZiAoISRsaXN0SXRlbS5kaXNhYmxlSXRlbSkge1xuICAgICAgICAgICAgdGhpcy5maXJzdFNlbGVjdGVkSXRlbSA9IHRoaXMuZmlyc3RTZWxlY3RlZEl0ZW0gfHwgJGxpc3RJdGVtO1xuICAgICAgICAgICAgLy8gU2V0dGluZyBzZWxlY3RDb3VudCB2YWx1ZSBiYXNlZCBudW1iZXIgb2YgaXRlbXMgc2VsZWN0ZWQuXG4gICAgICAgICAgICBzZWxlY3RDb3VudCA9IF8uaXNBcnJheSh0aGlzLnNlbGVjdGVkaXRlbSkgPyB0aGlzLnNlbGVjdGVkaXRlbS5sZW5ndGggOiAoXy5pc09iamVjdCh0aGlzLnNlbGVjdGVkaXRlbSkgPyAxIDogMCk7XG5cbiAgICAgICAgICAgIC8vIEhhbmRsaW5nIG11bHRpc2VsZWN0IGZvciBtb2JpbGUgZGV2aWNlXG4gICAgICAgICAgICBpZiAodGhpcy5tdWx0aXNlbGVjdCAmJiBpc01vYmlsZSgpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tTZWxlY3Rpb25MaW1pdChzZWxlY3RDb3VudCkgfHwgJGxpc3RJdGVtLmlzQWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlTGlzdEl0ZW1TZWxlY3Rpb24oJGxpc3RJdGVtKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ3NlbGVjdGlvbmxpbWl0ZXhjZWVkJywgeyRldmVudDogZXZ0fSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICgoZXZ0LmN0cmxLZXkgfHwgZXZ0Lm1ldGFLZXkpICYmIHRoaXMubXVsdGlzZWxlY3QpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jaGVja1NlbGVjdGlvbkxpbWl0KHNlbGVjdENvdW50KSB8fCAkbGlzdEl0ZW0uaXNBY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJzdFNlbGVjdGVkSXRlbSA9IHRoaXMubGFzdFNlbGVjdGVkSXRlbSA9ICRsaXN0SXRlbTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGVMaXN0SXRlbVNlbGVjdGlvbigkbGlzdEl0ZW0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnc2VsZWN0aW9ubGltaXRleGNlZWQnLCB7JGV2ZW50OiBldnR9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2dC5zaGlmdEtleSAmJiB0aGlzLm11bHRpc2VsZWN0KSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpcnN0ID0gJGxpc3RJdGVtLmNvbnRleHQuaW5kZXg7XG4gICAgICAgICAgICAgICAgbGV0IGxhc3QgPSB0aGlzLmZpcnN0U2VsZWN0ZWRJdGVtLmNvbnRleHQuaW5kZXg7XG5cbiAgICAgICAgICAgICAgICAvLyBpZiBmaXJzdCBpcyBncmVhdGVyIHRoYW4gbGFzdCwgdGhlbiBzd2FwIHZhbHVlc1xuICAgICAgICAgICAgICAgIGlmIChmaXJzdCA+IGxhc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgbGFzdCA9IFtmaXJzdCwgZmlyc3QgPSBsYXN0XVswXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tTZWxlY3Rpb25MaW1pdChsYXN0IC0gZmlyc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJTZWxlY3RlZEl0ZW1zKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGlzdEl0ZW1zLmZvckVhY2goKCRsaUl0ZW06IExpc3RJdGVtRGlyZWN0aXZlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9ICRsaUl0ZW0uY29udGV4dC5pbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSBmaXJzdCAmJiBpbmRleCA8PSBsYXN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGVMaXN0SXRlbVNlbGVjdGlvbigkbGlJdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkSXRlbSA9ICRsaXN0SXRlbTtcbiAgICAgICAgICAgICAgICB9ICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdzZWxlY3Rpb25saW1pdGV4Y2VlZCcsIHskZXZlbnQ6IGV2dH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoISRsaXN0SXRlbS5pc0FjdGl2ZSB8fCBzZWxlY3RDb3VudCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhclNlbGVjdGVkSXRlbXMoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGVMaXN0SXRlbVNlbGVjdGlvbigkbGlzdEl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcnN0U2VsZWN0ZWRJdGVtID0gdGhpcy5sYXN0U2VsZWN0ZWRJdGVtID0gJGxpc3RJdGVtO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICRhcHBEaWdlc3QoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEVtcHR5IHRoZSBsaXN0IGNvbnRlbnQgb24gY2xlYXJcbiAgICBwdWJsaWMgY2xlYXIgKCkge1xuICAgICAgICB0aGlzLnVwZGF0ZUZpZWxkRGVmcyhbXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogIFJldHVybnMgTGlzdEl0ZW0gUmVmZXJlbmNlIGJhc2VkIG9uIHRoZSBpbnB1dCBwcm92aWRlZC5cbiAgICAgKiBAcGFyYW0gdmFsOiBpbmRleCB8IG1vZGVsIG9mIHRoZSBsaXN0IGl0ZW0uXG4gICAgICogQHJldHVybnMge0xpc3RJdGVtRGlyZWN0aXZlfVxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0SXRlbVJlZkJ5SW5kZXhPck1vZGVsKHZhbDogYW55KTogTGlzdEl0ZW1EaXJlY3RpdmUge1xuICAgICAgICBsZXQgbGlzdEl0ZW06IExpc3RJdGVtRGlyZWN0aXZlO1xuICAgICAgICBpZiAoaXNOdW1iZXIodmFsKSkge1xuICAgICAgICAgICAgbGlzdEl0ZW0gPSB0aGlzLmdldExpc3RJdGVtQnlJbmRleCh2YWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGlzdEl0ZW0gPSB0aGlzLmdldExpc3RJdGVtQnlNb2RlbCh2YWwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsaXN0SXRlbTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBkZXNlbGVjdHMgaXRlbSBpbiB0aGUgbGlzdC5cbiAgICAgKiBAcGFyYW0gdmFsOiBpbmRleCB8IG1vZGVsIG9mIHRoZSBsaXN0IGl0ZW0uXG4gICAgICovXG4gICAgcHVibGljIGRlc2VsZWN0SXRlbSAodmFsOiBhbnkpIHtcbiAgICAgICAgY29uc3QgbGlzdEl0ZW0gPSB0aGlzLmdldEl0ZW1SZWZCeUluZGV4T3JNb2RlbCh2YWwpO1xuICAgICAgICBpZiAobGlzdEl0ZW0gJiYgbGlzdEl0ZW0uaXNBY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlTGlzdEl0ZW1TZWxlY3Rpb24obGlzdEl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogc2VsZWN0cyBpdGVtIGluIHRoZSBsaXN0LlxuICAgICAqIEBwYXJhbSB2YWw6IGluZGV4IHwgbW9kZWwgb2YgdGhlIGxpc3QgaXRlbS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0SXRlbSh2YWwsIHN0YXRlUGVyc2lzdGVuY2VUcmlnZ2VyZWQ/KSB7XG4gICAgICAgIGNvbnN0IGxpc3RJdGVtID0gdGhpcy5nZXRJdGVtUmVmQnlJbmRleE9yTW9kZWwodmFsKTtcbiAgICAgICAgaWYgKCFsaXN0SXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbGlzdEl0ZW0uaXNBY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlTGlzdEl0ZW1TZWxlY3Rpb24obGlzdEl0ZW0sIHN0YXRlUGVyc2lzdGVuY2VUcmlnZ2VyZWQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGZvY3VzIHRoZSBlbGVtZW50LlxuICAgICAgICBsaXN0SXRlbS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBiZWZvcmVQYWdpbmF0aW9uQ2hhbmdlKCRldmVudCwgJGluZGV4KSB7XG4gICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygncGFnaW5hdGlvbmNoYW5nZScsIHskZXZlbnQsICRpbmRleH0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBoYW5kbGVFdmVudChub2RlOiBIVE1MRWxlbWVudCwgZXZlbnROYW1lOiBzdHJpbmcsIGV2ZW50Q2FsbGJhY2s6IEZ1bmN0aW9uLCBsb2NhbHM6IGFueSkge1xuICAgICAgICAvLyB0YXAgYW5kIGRvdWJsZVRhcCBldmVudHMgYXJlIG5vdCBnZXR0aW5nIHByb3BhZ2F0ZWQuU28sIHVzaW5nIG1vdXNlIGV2ZW50cyBpbnN0ZWFkLlxuICAgICAgICBjb25zdCB0b3VjaFRvTW91c2UgPSB7XG4gICAgICAgICAgICB0YXA6ICdjbGljaycsXG4gICAgICAgICAgICBkb3VibGV0YXA6ICdkYmxjbGljaydcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKF8uaW5jbHVkZXMoWydjbGljaycsICd0YXAnLCAnZGJsY2xpY2snLCAnZG91YmxldGFwJ10sIGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgICAgICAgIHRvdWNoVG9Nb3VzZVtldmVudE5hbWVdIHx8IGV2ZW50TmFtZSxcbiAgICAgICAgICAgICAgICAoZXZ0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9ICQoZXZ0LnRhcmdldCkuY2xvc2VzdCgnLmFwcC1saXN0LWl0ZW0nKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RJdGVtQ29udGV4dDogTGlzdEl0ZW1EaXJlY3RpdmUgPSB0YXJnZXQuZGF0YSgnbGlzdEl0ZW1Db250ZXh0Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxpc3RJdGVtQ29udGV4dC5kaXNhYmxlSXRlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjayhldmVudE5hbWUsIHt3aWRnZXQ6IGxpc3RJdGVtQ29udGV4dCwgJGV2ZW50OiBldnQsIGl0ZW06IGxpc3RJdGVtQ29udGV4dC5pdGVtfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW52b2tlIHRoZSBkYXRhc291cmNlIHZhcmlhYmxlIGJ5IGRlZmF1bHQgd2hlbiBwdWxsdG9yZWZyZXNoIGV2ZW50IGlzIG5vdCBzcGVjaWZpZWQuXG4gICAgcHJpdmF0ZSBzdWJzY3JpYmVUb1B1bGxUb1JlZnJlc2goKSB7XG4gICAgICAgIHRoaXMuX2xpc3RlbmVyRGVzdHJveWVycy5wdXNoKHRoaXMuYXBwLnN1YnNjcmliZSgncHVsbHRvcmVmcmVzaCcsICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFzb3VyY2UgJiYgdGhpcy5kYXRhc291cmNlLmxpc3RSZWNvcmRzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhc291cmNlLmxpc3RSZWNvcmRzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICAgICAgdGhpcy5oYW5kbGVIZWFkZXJDbGljayA9IG5vb3A7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kZWJvdW5jZWRGZXRjaE5leHREYXRhc2V0T25TY3JvbGwgPSB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLmRlYm91bmNlZEZldGNoTmV4dERhdGFzZXRPblNjcm9sbCh0aGlzLmRhdGFOYXZpZ2F0b3IsIERFQk9VTkNFX1RJTUVTLlBBR0lOQVRJT05fREVCT1VOQ0VfVElNRSwgdGhpcyk7XG4gICAgICAgIH0sIDApO1xuICAgICAgICB0aGlzLl9pdGVtcyA9IFtdO1xuICAgICAgICB0aGlzLmZpZWxkRGVmcyA9IFtdO1xuICAgICAgICB0aGlzLnJlb3JkZXJQcm9wcyA9IHtcbiAgICAgICAgICAgIG1pbkluZGV4OiBudWxsLFxuICAgICAgICAgICAgbWF4SW5kZXg6IG51bGxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldFVwQ1VESGFuZGxlcnMoKSB7XG4gICAgICAgIGNvbnN0ICRhZGRJdGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImFkZC1saXN0LWl0ZW1cIilbMF07XG4gICAgICAgIGlmICgkYWRkSXRlbSkge1xuICAgICAgICAgICAgLy8gVHJpZ2dlcmVkIG9uIGNsaWNrIG9mIGFkZCBhY3Rpb25cbiAgICAgICAgICAgICRhZGRJdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZ0ID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMucHJvbWlzZVJlc29sdmVyRm4oKTtcbiAgICAgICAgdGhpcy5wcm9wc0luaXRQcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgc3VwZXIubmdBZnRlclZpZXdJbml0KCk7XG4gICAgICAgICAgICB0aGlzLnNldFVwQ1VESGFuZGxlcnMoKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtV2lkZ2V0cyA9IHRoaXMubXVsdGlzZWxlY3QgPyBbXSA6IHt9O1xuICAgICAgICAgICAgaWYgKHRoaXMuZW5hYmxlcmVvcmRlciAmJiAhdGhpcy5ncm91cGJ5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmVEbkQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmdyb3VwYnkgJiYgdGhpcy5jb2xsYXBzaWJsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlSGVhZGVyQ2xpY2sgPSBoYW5kbGVIZWFkZXJDbGljaztcbiAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZUFsbEhlYWRlcnMgPSB0b2dnbGVBbGxIZWFkZXJzLmJpbmQodW5kZWZpbmVkLCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNldExpc3RDbGFzcyh0aGlzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2V0dXBIYW5kbGVycygpO1xuICAgICAgICBjb25zdCAkdWwgPSB0aGlzLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcigndWwuYXBwLWxpdmVsaXN0LWNvbnRhaW5lcicpO1xuICAgICAgICBzdHlsZXIoJHVsIGFzIEhUTUxFbGVtZW50LCB0aGlzLCBBUFBMWV9TVFlMRVNfVFlQRS5TQ1JPTExBQkxFX0NPTlRBSU5FUik7XG5cbiAgICAgICAgaWYgKGlzTW9iaWxlQXBwKCkgJiYgJHVsLnF1ZXJ5U2VsZWN0b3IoJy5hcHAtbGlzdC1pdGVtLWFjdGlvbi1wYW5lbCcpKSB7XG4gICAgICAgICAgICB0aGlzLl9saXN0QW5pbWF0b3IgPSBuZXcgTGlzdEFuaW1hdG9yKHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLl9saXN0QW5pbWF0b3IgJiYgdGhpcy5fbGlzdEFuaW1hdG9yLiRidG5TdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX2xpc3RBbmltYXRvci4kYnRuU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbGlzdGVuZXJEZXN0cm95ZXJzLmZvckVhY2goZCA9PiBkICYmIGQoKSk7XG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgfVxuXG4gICAgbmdPbkRldGFjaCgpIHtcbiAgICAgICAgc3VwZXIubmdPbkRldGFjaCgpO1xuICAgICAgICB0aGlzLl9wYWdlTG9hZCA9IHRydWU7XG4gICAgfVxufVxuIl19
|
|
1118
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3dpZGdldHMvZGF0YS9saXN0L3NyYy9saXN0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBYyxRQUFRLEVBQUUsTUFBTSxFQUFxQixTQUFTLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJeE4sT0FBTyxFQUNILFVBQVUsRUFDVixlQUFlLEVBQ2YsR0FBRyxFQUNILFdBQVcsRUFDWCxVQUFVLEVBQ1YsZUFBZSxFQUNmLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsUUFBUSxFQUNSLFdBQVcsRUFDWCxRQUFRLEVBQ1IsUUFBUSxFQUNSLElBQUksRUFDSixXQUFXLEVBQ1gsZ0JBQWdCLEVBQ2hCLGlCQUFpQixFQUNqQixZQUFZLEVBQ1osWUFBWSxFQUNmLE1BQU0sVUFBVSxDQUFDO0FBQ2xCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsZ0NBQWdDLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBYSxxQkFBcUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3pTLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUsvQyxNQUFNLFdBQVcsR0FBRyx3QkFBd0IsQ0FBQztBQUM3QyxNQUFNLGFBQWEsR0FBRyxFQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBQyxDQUFDO0FBU3RFLE1BQU0sT0FBTyxhQUFjLFNBQVEsaUJBQWlCO0lBMktoRCxZQUNJLEdBQWEsRUFDYixLQUF3QixFQUN4QixRQUFvQixFQUNwQixHQUFRLEVBQ1IsV0FBd0IsRUFDeEIsTUFBYyxFQUNlLGFBQXFCLEVBQ25CLGVBQXVCLEVBQzNCLFdBQW1CLEVBQ2hCLGNBQXNCLEVBQ3JCLFlBQW9CLEVBQ3BCLFlBQW9CLEVBQ25ELGdCQUFrQyxFQUNsQyxpQkFBb0M7UUFFcEMsSUFBSSxTQUFTLEdBQWEsSUFBSSxDQUFDO1FBQy9CLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDN0QsS0FBSyxDQUFDLEdBQUcsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7UUFDekMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQztRQUNuQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO1FBQ3pDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQztRQUMzQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUV0QixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNuQyxJQUFJLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQztRQUN2QyxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUMvQixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztRQUNqQyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztRQUNqQyxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztRQUVyQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNmLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFFOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLFdBQVcsQ0FBQztRQUNoQyxJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsR0FBRyxZQUFZLEVBQUUsQ0FBQztRQUUxQyw4RUFBOEU7UUFDOUUsSUFBSSxDQUFDLG1CQUFtQixHQUFHO1lBQ3ZCLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLGlDQUFpQyxFQUFFLE9BQU8sQ0FBQyxFQUFFO2dCQUM1RCxJQUFJLGNBQWMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ3BELG1IQUFtSDtnQkFDbkgsSUFBSSxDQUFDLGNBQWMsRUFBRTtvQkFDakIsY0FBYyxHQUFHLHFCQUFxQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztpQkFDL0Q7Z0JBQ0QsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxlQUFlLENBQUMsS0FBSyxjQUFjLEVBQUU7b0JBQ3BELE9BQU87aUJBQ1Y7Z0JBQ0QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3BDLENBQUMsQ0FBQztZQUNGLHVEQUF1RDtZQUN2RCxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyx1QkFBdUIsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxRSxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLENBQUMsRUFBRTtnQkFDN0MsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxLQUFLLEVBQUU7b0JBQ25ELE9BQU87aUJBQ1Y7Z0JBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDN0IsQ0FBQyxDQUFDO1NBQ0wsQ0FBQztJQUNOLENBQUM7SUExSUQsSUFBVyxZQUFZO1FBQ25CLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNsQixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDdkM7UUFDRCxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3hCLE9BQU8sRUFBRSxDQUFDO1NBQ2I7UUFDRCxPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksVUFBVSxDQUFDLFVBQWtCLEVBQUUsS0FBYTtRQUMvQyxJQUFJLE9BQU8sQ0FBQztRQUNaLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUVsQixJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2IsT0FBTztTQUNWO1FBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNuQixDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRTtnQkFDdkMsT0FBTyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLGtCQUFrQixFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUNuRCxJQUFJLE9BQU8sRUFBRTtvQkFDVCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUN4QjtZQUNMLENBQUMsQ0FBQyxDQUFDO1lBRUgsT0FBTyxNQUFNLENBQUM7U0FDakI7UUFDRCxLQUFLLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO1FBRXBCLE9BQU8sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFakQsSUFBSSxPQUFPLEVBQUU7WUFDVCxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztTQUMxRDtJQUNMLENBQUM7SUFFRCxnR0FBZ0c7SUFDekYsT0FBTyxDQUFDLEtBQWE7UUFDeEIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7O01BSUU7SUFDSyxRQUFRLENBQUMsSUFBUztRQUNyQixJQUFJLElBQUksWUFBWSxpQkFBaUIsRUFBRTtZQUNuQyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN0QzthQUFNLElBQUksSUFBSSxFQUFFO1lBQ2IsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUNsRTtJQUNMLENBQUM7SUFFRCxJQUFXLFlBQVksQ0FBQyxLQUFLO1FBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUV6QixJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDbEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUNoRDthQUFNO1lBQ0gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUMxQjtRQUNELFVBQVUsRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFxRU8sa0JBQWtCO1FBQ3RCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2xFLE9BQU8sSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRU8saUJBQWlCLENBQUMsT0FBTztRQUM3QixJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFLEtBQUssTUFBTSxFQUFFO1lBQ3hELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0QsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsRUFBRTtnQkFDbEMsT0FBTyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztnQkFDeEMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQzthQUNqRDtZQUNELElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsY0FBYyxDQUFDLEVBQUU7Z0JBQ3BDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7YUFDbkM7U0FDSjtJQUNMLENBQUM7SUFFTyxjQUFjLENBQUMsU0FBUyxFQUFFLElBQUs7UUFDbkMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RCLHFNQUFxTTtRQUNyTSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUMzRSxJQUFJLElBQUksRUFBRTtZQUNOLEdBQUcsR0FBRyxJQUFJLENBQUM7U0FDZDtRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxFQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRUQsTUFBTTtRQUNGLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNuQixJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ2pDO0lBQ0wsQ0FBQztJQUVELE9BQU8sQ0FBQyxJQUFLO1FBQ1QsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ25CLElBQUksUUFBUSxDQUFDO1lBQ2IsSUFBSSxJQUFJLEVBQUU7Z0JBQ04sUUFBUSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUM7YUFDdkQ7WUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztTQUMzQztJQUNMLENBQUM7SUFFRCxNQUFNLENBQUMsSUFBSztRQUNSLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUVELFNBQVMsQ0FBQyxJQUFLO1FBQ1gsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ25CLElBQUksUUFBUSxDQUFDO1lBQ2IsSUFBSSxJQUFJLEVBQUU7Z0JBQ04sUUFBUSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUM7YUFDdkQ7WUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztTQUMzQztJQUNMLENBQUM7SUFFRCxNQUFNLENBQUMsSUFBSztRQUNSLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUNELGFBQWEsQ0FBQyxJQUFJO1FBQ2QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNuQyxJQUFJLFVBQVUsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsRUFBRTtZQUNySCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7O2dCQUNqQixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO2dCQUNwQyw0RkFBNEY7Z0JBQzVGLE1BQU0sUUFBUSxHQUFHLE1BQUEsTUFBQSxJQUFJLENBQUMsSUFBSSwwQ0FBRSxVQUFVLDBDQUFFLGFBQWEsQ0FBQztnQkFDdEQsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEVBQUU7b0JBQzFCLElBQUksQ0FBQyxXQUFXLEdBQUcsUUFBUSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7aUJBQ3BEO3FCQUFNLEVBQUUsNkJBQTZCO29CQUNsQyxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBQSxJQUFJLENBQUMsSUFBSSwwQ0FBRSxJQUFJLENBQUMsQ0FBQztpQkFDakQ7WUFDTCxDQUFDLENBQUMsQ0FBQztTQUNOO0lBQ0wsQ0FBQztJQUVPLGVBQWU7UUFDbkIsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7UUFDNUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUM7UUFDN0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7SUFDOUIsQ0FBQztJQUVPLHFCQUFxQjtRQUN6QixJQUFJLENBQUMsV0FBVyxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUM7UUFDekMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7SUFDL0IsQ0FBQztJQUVPLHNCQUFzQjtRQUMxQixJQUFJLENBQUMsV0FBVyxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUM7SUFDOUMsQ0FBQztJQUVPLHVCQUF1QjtRQUMzQixJQUFJLENBQUMsV0FBVyxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUM7UUFDM0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7SUFDL0IsQ0FBQztJQUVPLHFCQUFxQjtRQUN6QixJQUFJLENBQUMsV0FBVyxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUM7UUFDekMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7SUFDL0IsQ0FBQztJQUVPLHFCQUFxQjtRQUN6QixJQUFJLENBQUMsV0FBVyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUM7UUFDeEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFDaEMsQ0FBQztJQUVPLG9CQUFvQjtRQUN4QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztJQUMxQixDQUFDO0lBRU8sa0JBQWtCO1FBQ3RCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO0lBQy9CLENBQUM7SUFFRDs7O09BR0c7SUFDSyxzQkFBc0IsQ0FBQyxJQUFJO1FBQy9CLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixRQUFRLElBQUksRUFBRTtZQUNWLEtBQUssZUFBZSxDQUFDLEtBQUs7Z0JBQ3RCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2dCQUM3QixNQUFNO1lBQ1YsS0FBSyxlQUFlLENBQUMsTUFBTTtnQkFDdkIsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7Z0JBQzlCLE1BQU07WUFDVixLQUFLLGVBQWUsQ0FBQyxRQUFRLENBQUM7WUFDOUIsS0FBSyxlQUFlLENBQUMsT0FBTztnQkFDeEIsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7Z0JBQy9CLE1BQU07WUFDVixLQUFLLGVBQWUsQ0FBQyxLQUFLO2dCQUN0QixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQkFDN0IsTUFBTTtZQUNWLEtBQUssZUFBZSxDQUFDLElBQUk7Z0JBQ3JCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2dCQUM3QixNQUFNO1lBQ1YsS0FBSyxlQUFlLENBQUMsTUFBTTtnQkFDdkIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7Z0JBQzVCLE1BQU07WUFDVixLQUFLLGVBQWUsQ0FBQyxRQUFRO2dCQUN6QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDMUIsTUFBTTtTQUNiO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxlQUFlLENBQUMsTUFBa0I7UUFDdEMsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDckMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsd0JBQXdCLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQ3RHO2FBQU07WUFDSCxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQztTQUMzQjtRQUVELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNkLElBQUksQ0FBQyxTQUFTLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDcEU7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDZCxJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUMzSjtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRTtZQUN4QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztZQUN4QixJQUFJLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQztTQUNqQztRQUNELFVBQVUsRUFBRSxDQUFDO1FBQ2IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRU8sWUFBWSxDQUFDLE1BQU07UUFDdkIsZ0NBQWdDO1FBQ2hDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBRXBCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1lBRTFCLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxFQUFFO2dCQUMvRSwrR0FBK0c7Z0JBQy9HLE1BQU0sR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ2hDO1lBRUQsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUN4QyxNQUFNLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQzlDO1lBRUQsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNwQixNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUM5QjtZQUVELHNGQUFzRjtZQUN0RixJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEtBQUssS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUNqTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUU7b0JBQ25FLE1BQU0sRUFBRSxDQUFDO2lCQUNaLENBQUMsQ0FBQzthQUNGO1lBRUYsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNuQixJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUU7b0JBQ2YsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGtCQUFrQixFQUFFLEVBQUMsS0FBSyxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUM7aUJBQ2pFO2dCQUNELElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDaEM7U0FDSjthQUFNO1lBQ0gsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUM1QjtJQUNMLENBQUM7SUFFRCx1RUFBdUU7SUFDL0QsZUFBZTtRQUNuQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBRXpDLGFBQWEsQ0FBQyxPQUFPLEdBQUc7WUFDcEIsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLElBQUksRUFBRTtTQUNsQyxDQUFDO1FBRUYsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztRQUVqQyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUMzQixJQUFJLENBQUMsb0JBQW9CLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDM0M7UUFDRCw4SEFBOEg7UUFDOUgsSUFBSSxDQUFDLG9CQUFvQixHQUFHLGFBQWEsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBVyxFQUFFLEVBQUU7WUFDOUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QixDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDVCwwQ0FBMEM7UUFDMUMsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEVBQUU7WUFDOUIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQzlDO1FBQ0QsOEhBQThIO1FBQzlILElBQUksQ0FBQyx1QkFBdUIsR0FBRyxhQUFhLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDN0UsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUM7UUFDeEIsQ0FBQyxDQUFDLENBQUM7UUFFSCxhQUFhLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO1FBQy9DLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0Qyx3RkFBd0Y7UUFDeEYsdUZBQXVGO1FBQ3ZGLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUM3QixJQUFJLENBQUMsV0FBVyxFQUNoQixJQUFJLENBQUMsVUFBVSxFQUNmLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUNqRCxJQUFJLENBQUMsT0FBTyxFQUNaLElBQUksQ0FBQyxjQUFjLEVBQ25CLGdCQUFnQixFQUNoQixJQUFJLENBQUMsWUFBWSxDQUNwQixDQUFDO0lBQ04sQ0FBQztJQUVPLGVBQWUsQ0FBQyxNQUFNO1FBQzFCLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxLQUFLLGFBQWEsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxNQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNoSCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9ELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLEVBQUU7Z0JBQ2xDLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLEVBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxVQUFVLEVBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQzthQUN4RTtZQUNELElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsY0FBYyxDQUFDLEVBQUU7Z0JBQ3BDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7YUFDbkM7U0FDSjtRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUU7WUFDNUIsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssZUFBZSxDQUFDLElBQUksRUFBRTtnQkFDN0QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2FBQzFCO2lCQUFNO2dCQUNILElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDN0I7U0FDSjthQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLGVBQWUsQ0FBQyxJQUFJLEVBQUU7WUFDcEUsZ0dBQWdHO1lBQ2hHLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUNyRDtJQUNMLENBQUM7SUFFRCxtREFBbUQ7SUFDM0MsaUJBQWlCO1FBQ3JCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsbUZBQW1GO0lBQzNFLGtCQUFrQjtRQUN0QixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDdkIsVUFBVSxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxrQkFBa0IsQ0FBQyxTQUFTO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUNwQyxJQUFJLE9BQU8sR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQzVCLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxFQUFFO2dCQUNsRCw0R0FBNEc7Z0JBQzVHLE9BQU8sR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMzQixPQUFPLE9BQU8sQ0FBQyxXQUFXLENBQUM7YUFDOUI7WUFDRCxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxFQUFFO2dCQUMvQixPQUFPLElBQUksQ0FBQzthQUNmO1FBQ0wsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDO0lBQ2YsQ0FBQztJQUVPLDBCQUEwQixDQUFDLHlCQUEwQjtRQUN6RCxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsV0FBVyxDQUFDO1FBQzFCLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqRSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLE1BQU0sRUFBRTtZQUN0QyxtR0FBbUc7WUFDbkcsV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQy9ELElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsY0FBYyxDQUFDLEVBQUU7Z0JBQ3BDLDRIQUE0SDtnQkFDNUgsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtvQkFDcEQsV0FBVyxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7aUJBQ2pDO3FCQUFNO29CQUNILENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxVQUFTLFlBQVk7d0JBQ3BELE9BQU8sWUFBWSxDQUFDLElBQUksS0FBSyxPQUFPLENBQUM7b0JBQ3pDLENBQUMsQ0FBQyxDQUFDO2lCQUNOO2FBQ0o7U0FDSjtRQUNELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNqQixJQUFJLENBQUMsbUJBQXdDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztTQUM3RDtRQUNELElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBdUIsRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUN0RCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2YsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO29CQUNqQixJQUFJLENBQUMsbUJBQXdDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2lCQUNoRjtxQkFBTTtvQkFDSCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO2lCQUN0RDtnQkFDRCxHQUFHLEdBQUcsRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUMsQ0FBQztnQkFDcEMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxjQUFjLENBQUMsSUFBSyxJQUFJLENBQUMsV0FBVyxFQUFFO29CQUN6RCxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxFQUFFO3dCQUN4QyxXQUFXLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztxQkFDdEM7aUJBQ0o7cUJBQU07b0JBQ0gsV0FBVyxDQUFDLFlBQVksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUNwQzthQUNKO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixFQUFFO1lBQ3BFLElBQUksZ0NBQWdDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQy9ELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7Z0JBQzlELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLEVBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxZQUFZLEVBQUMsQ0FBQyxDQUFDO2FBQzFGO2lCQUFNO2dCQUNILE9BQU8sQ0FBQyxJQUFJLENBQUMsa0NBQWtDLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxnREFBZ0QsQ0FBQyxDQUFDO2FBQ25IO1NBQ0o7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLHVCQUF1QixDQUFDLFNBQTRCLEVBQUUseUJBQTBCO1FBQ3BGLHlEQUF5RDtRQUN6RCxJQUFJLFNBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUU7WUFDckMsSUFBSSxJQUFJLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztZQUMxQixJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLEVBQUU7Z0JBQzVDLHdHQUF3RztnQkFDeEcsSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3JCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQzthQUMzQjtZQUNELElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRTtnQkFDcEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzVELFNBQVMsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO2FBQzlCO2lCQUFNO2dCQUNILG1HQUFtRztnQkFDbkcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7b0JBQ25CLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2lCQUM3QjtnQkFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdkIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxFQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7Z0JBQ3JFLFNBQVMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO2FBQzdCO1lBQ0QsSUFBSSxDQUFDLDBCQUEwQixDQUFDLHlCQUF5QixDQUFDLENBQUM7U0FDOUQ7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssWUFBWSxDQUFDLFNBQXVDO1FBQ3hELDhLQUE4SztRQUM5SyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDcEIsdUZBQXVGO1lBQ3ZGLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLEVBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUMsQ0FBQyxDQUFDO1NBQy9EO1FBQ0QsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLE1BQU0sSUFBSSxTQUFTLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtZQUM1RyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9ELElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsY0FBYyxDQUFDLEVBQUU7Z0JBQ3BDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7Z0JBQ2pDLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztnQkFDaEksTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNyRSxXQUFXLENBQUMsVUFBVSxHQUFHLFdBQVcsQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDO2dCQUNyRCxnRUFBZ0U7Z0JBQ2hFLElBQUksbUJBQW1CLEtBQUssV0FBVyxDQUFDLFlBQVksQ0FBQyxNQUFNLElBQUksV0FBVyxDQUFDLFVBQVUsS0FBSyxXQUFXLEVBQUU7b0JBQ25HLFdBQVcsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7d0JBQ3RDLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxXQUFXLEVBQUU7NEJBQzNCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQzt5QkFDckM7b0JBQ0wsQ0FBQyxDQUFDLENBQUM7aUJBQ047YUFDSjtTQUNKO1FBQ0QsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRTdGLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBRXRELHdHQUF3RztRQUN4RyxrRUFBa0U7UUFDbEUsSUFBSSxTQUFTLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxDQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEtBQUssS0FBSyxFQUFFO1lBQzlILE1BQU0sVUFBVSxHQUFzQixTQUFTLENBQUMsS0FBSyxDQUFDO1lBRXRELElBQ0ksQ0FBQyxVQUFVLENBQUMsV0FBVztnQkFDdkIsSUFBSSxDQUFDLGFBQWE7Z0JBQ2xCLDhIQUE4SDtnQkFDOUgsQ0FBQyxDQUNHLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDO29CQUNyQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FDckIsRUFDSDtnQkFDRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxVQUFVLENBQUM7Z0JBQzVELDZCQUE2QjtnQkFDN0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN0QjtTQUNKO2FBQU07WUFDSCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN6QixhQUFhLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFO2dCQUNqQyxNQUFNLFFBQVEsR0FBc0IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUMxRSxJQUFJLFFBQVEsRUFBRTtvQkFDVixRQUFRLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztvQkFDekIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFFBQVEsQ0FBQztvQkFDakMsMkJBQTJCO29CQUMzQixRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO2lCQUNsQztZQUNMLENBQUMsQ0FBQyxDQUFDO1NBQ047UUFFRCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDekMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUNqRSx3RUFBd0U7WUFDeEUsZ0RBQWdEO1lBQ2hELElBQUksV0FBVyxFQUFFLElBQUksY0FBYyxDQUFDLE1BQU0sSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssTUFBTSxFQUFFO2dCQUM1RixJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsd0JBQXdCLENBQUMsQ0FBQzthQUN4RjtpQkFBTTtnQkFDSCwwSUFBMEk7Z0JBQzFJLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUN2RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDakQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUM7Z0JBQ3pDLElBQUksUUFBUSxFQUFFLElBQUksU0FBUyxDQUFDLE1BQU0sSUFBSSxNQUFNLEdBQUcsT0FBTyxFQUFFO29CQUNwRCxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsT0FBTyxHQUFHLElBQUksQ0FBQyxDQUFDO2lCQUMvQztnQkFDRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsY0FBYyxDQUFDLHdCQUF3QixDQUFDLENBQUM7YUFDL0Y7U0FDSjtRQUVELElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO0lBQy9CLENBQUM7SUFFTSx3QkFBd0IsQ0FBQyxHQUF3QixFQUFFLE1BQWE7UUFDbkUsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ2YsTUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3BELDRFQUE0RTtZQUM1RSxJQUFJLGVBQWUsQ0FBQyxhQUFhLEtBQUssSUFBSSxFQUFFO2dCQUN4QyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsQ0FBQzthQUM3QztTQUNKO0lBQ0wsQ0FBQztJQUVPLGFBQWE7UUFDakIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFFLFNBQVMsQ0FBQyxFQUFFO1lBQzFDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDN0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQztRQUNILHlDQUF5QztRQUN6QyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQy9GLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDeEQseUNBQXlDO1lBQ3pDLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUNuRyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2FBQ3REO1lBQ0QsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNsRCxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDYixDQUFDO0lBRUQsMkNBQTJDO0lBQ25DLGNBQWMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtRQUMxQixFQUFFLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsMEJBQTBCO0lBQ2xCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRTtRQUNsQiwyRUFBMkU7UUFDM0UseUZBQXlGO1FBQ3pGLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNoQixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqRyxJQUFJLGNBQWMsSUFBSSxjQUFjLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFO2dCQUN0RCxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsY0FBYyxDQUFDLHdCQUF3QixDQUFDLENBQUM7Z0JBQzVGLElBQUksQ0FBQyxpQ0FBaUMsRUFBRSxDQUFDO2FBQzVDO1NBQ0o7SUFDTCxDQUFDO0lBR0QsOEJBQThCO0lBQ3RCLFFBQVEsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLFlBQWE7UUFDbkMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUM1QiwyRUFBMkU7UUFDM0UsTUFBTSxRQUFRLEdBQUcsRUFBRSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ25FLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRTlDLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUM3QyxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFFN0MsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEQscURBQXFEO1FBQ3JELElBQUksV0FBVyxFQUFFO1lBQ2IsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxNQUFNLEVBQUU7Z0JBQ3RDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7YUFDakU7WUFFRCxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUMzRSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUUzRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFFdEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzNCLE1BQU0sWUFBWSxHQUFHO2dCQUNqQixRQUFRLEVBQUUsUUFBUTtnQkFDbEIsUUFBUSxFQUFFLFFBQVE7Z0JBQ2xCLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDO2FBQ3ZCLENBQUM7WUFDRixJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxFQUFFLEVBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBQyxDQUFDLENBQUM7WUFDOUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDdEM7SUFDTCxDQUFDO0lBRUQsd0NBQXdDO0lBQ2hDLFlBQVk7UUFDaEIsSUFBSSxRQUFRLENBQUM7UUFDYixNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzNDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLDBHQUEwRztZQUN0SSxRQUFRLEdBQUcsUUFBUSxDQUFDO1NBQ3JCO2FBQU0sSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsc0RBQXNEO1lBQy9FLFFBQVEsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztTQUMxQzthQUFNLEVBQUUsc0NBQXNDO1lBQzNDLFFBQVEsR0FBRyxNQUFNLENBQUM7U0FDckI7UUFFRCxNQUFNLE9BQU8sR0FBRyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNqQyxRQUFRLEVBQUUsUUFBUTtTQUNyQixDQUFDO1FBRUYsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUVsRCxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUVySCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFDLFFBQVEsRUFBRSxnQkFBZ0IsRUFBQyxDQUFDLENBQUM7UUFFcEQsSUFBSSxXQUFXLEVBQUUsRUFBRTtZQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxVQUFTLEtBQUs7Z0JBQ3ZDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztnQkFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7b0JBQ2hCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTt3QkFDZCxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO3FCQUM5QjtvQkFDRCxVQUFVLENBQUMsR0FBRyxFQUFFO3dCQUNaLDhDQUE4Qzt3QkFDOUMsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFOzRCQUNsQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7eUJBQzFCO29CQUNMLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDUCxJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7d0JBQzNCLENBQUMsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDO3dCQUNoRCxrQkFBa0I7d0JBQ2xCLENBQUMsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUUxQyxtQkFBbUI7d0JBQ25CLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO3dCQUVyQixrRUFBa0U7d0JBQ2xFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBRXZCLHVDQUF1QztvQkFDM0MsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2lCQUNYO1lBQ0wsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxVQUFVLEtBQUs7Z0JBQzdCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO2dCQUN0QixDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFFbkQsK0NBQStDO2dCQUMvQyxDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFFM0MsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMvQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFO2dCQUNmLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDL0IsQ0FBQyxDQUFDLENBQUM7U0FDTjtJQUVMLENBQUM7SUFFRCxrREFBa0Q7SUFDMUMsbUJBQW1CLENBQUMsS0FBYTtRQUNyQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVELDZDQUE2QztJQUNyQyxrQkFBa0IsQ0FBQyxLQUFhO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLGdCQUFnQixDQUFDLElBQXVCO1FBQzVDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELDREQUE0RDtJQUNyRCxPQUFPLENBQUMsU0FBUyxFQUFFLE9BQU87UUFDN0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDeEksT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFDRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRU0sYUFBYSxDQUFDLE1BQU0sRUFBRSxNQUFjO1FBQ3ZDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN6QixJQUFHLE1BQU0sQ0FBQyxPQUFPLEtBQUssRUFBRSxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQyxFQUFHO1lBQ3RMLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUMzQjtRQUVELE1BQU0sU0FBUyxHQUFpQyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBRS9ELElBQUksWUFBWSxHQUFXLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUV4RSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDbEIsTUFBTSxVQUFVLEdBQVcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3pFLE1BQU0sV0FBVyxHQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5SCxJQUFJLE1BQU0sS0FBSyxZQUFZLEVBQUU7Z0JBQ3pCLElBQUksWUFBWSxHQUFHLENBQUMsRUFBRTtvQkFDbEIsSUFBSSxDQUFDLFlBQVksSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLEVBQUU7d0JBQ3ZFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUUsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDO3dCQUNuRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7cUJBQ3ZEO3lCQUFNLElBQUksWUFBWSxHQUFHLFVBQVUsRUFBRTt3QkFDbEMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO3dCQUNwRSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQztxQkFDckU7eUJBQU07d0JBQ0gsSUFBSSxDQUFDLG1CQUFtQixDQUFDLHNCQUFzQixFQUFFLEVBQUMsTUFBTSxFQUFDLENBQUMsQ0FBQztxQkFDOUQ7aUJBQ0o7YUFDSjtpQkFBTSxJQUFJLE1BQU0sS0FBSyxZQUFZLEVBQUU7Z0JBQ2hDLElBQUksWUFBWSxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUNyQyxJQUFJLENBQUMsWUFBWSxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsRUFBRTt3QkFDdkUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUM7d0JBQ2xFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztxQkFDdkQ7eUJBQU0sSUFBSSxZQUFZLEdBQUcsVUFBVSxFQUFFO3dCQUNsQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7d0JBQ3BFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDO3FCQUNyRTt5QkFBTTt3QkFDSCxJQUFJLENBQUMsbUJBQW1CLENBQUMsc0JBQXNCLEVBQUUsRUFBQyxNQUFNLEVBQUMsQ0FBQyxDQUFDO3FCQUM5RDtpQkFDSjthQUNKO1NBQ0o7UUFDRCxJQUFJLE1BQU0sS0FBSyxXQUFXLEVBQUU7WUFDeEIsSUFBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUU7Z0JBQzFCLFlBQVksR0FBRyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ3RELElBQUcsWUFBWSxLQUFLLENBQUMsRUFBRTtvQkFDbkIsT0FBTztpQkFDVjtnQkFFRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUM5RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUMxRCxPQUFPLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ2xFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQzVDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7Z0JBQzlELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3JDLENBQUMsR0FBRyxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRSxHQUFHLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hGLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUMxQixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztnQkFDakMsSUFBSSxDQUFDLFFBQVEsR0FBRyxXQUFXLENBQUM7YUFDL0I7aUJBQU07Z0JBQ0gsWUFBWSxHQUFHLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQzFELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQzlELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQzVDLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxHQUFHLENBQUMsQ0FBQztnQkFDckMsSUFBSSxDQUFDLFFBQVEsR0FBRyxXQUFXLENBQUM7YUFDL0I7U0FDSjthQUFNLElBQUksTUFBTSxLQUFLLFdBQVcsRUFBRTtZQUMvQixJQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtnQkFDMUIsWUFBWSxHQUFHLFlBQVksR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDL0YsSUFBRyxZQUFZLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFHO29CQUM1QyxPQUFPO2lCQUNWO2dCQUVELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQzlELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQzFELE9BQU8sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDakUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDNUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQztnQkFDOUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDckMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsR0FBRyxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztnQkFDeEYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxHQUFHLENBQUMsQ0FBQztnQkFDckMsSUFBSSxDQUFDLFFBQVEsR0FBRyxXQUFXLENBQUM7YUFDL0I7aUJBQU07Z0JBQ0gsWUFBWSxHQUFHLFlBQVksR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ25HLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQzlELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQzVDLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxHQUFHLENBQUMsQ0FBQztnQkFDckMsSUFBSSxDQUFDLFFBQVEsR0FBRyxXQUFXLENBQUM7YUFDL0I7U0FDSjthQUFNLElBQUksTUFBTSxLQUFLLFFBQVEsRUFBRTtZQUM1Qix1SUFBdUk7WUFDdkksSUFBSSxZQUFZLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3ZGLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUM7Z0JBQ3pELE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsMkJBQTJCLENBQUMsQ0FBQztnQkFDckQsWUFBWSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDMUQ7WUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztTQUNuRTthQUFNLElBQUksTUFBTSxLQUFLLE9BQU8sRUFBRTtZQUMzQixJQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRTtnQkFDcEIsT0FBTzthQUNWO1lBQ0QsSUFBSSxDQUFDLG9CQUFvQixHQUFHLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDO1lBQ3ZELElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1lBQ2hFLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxHQUFHLENBQUMsQ0FBQztZQUNyQyxJQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtnQkFDMUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLElBQUksQ0FBQyxZQUFZLDZCQUE2QixDQUFDO2dCQUN2RSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUM7YUFDOUM7aUJBQVE7Z0JBQ0wsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLElBQUksQ0FBQyxZQUFZLDJCQUEyQixDQUFDO2dCQUNyRSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7YUFDbEQ7U0FDSjtJQUNMLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxHQUFXLEVBQUUsRUFBTyxFQUFFLEVBQVE7UUFDM0MsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFO1lBQ25CLElBQUksQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ2hELE9BQU87YUFDVjtZQUNELElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDNUI7YUFBTSxJQUFJLEdBQUcsS0FBSyxZQUFZLEVBQUU7WUFDN0IsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNkLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ3RDO1NBQ0o7YUFBTSxJQUFJLEdBQUcsS0FBSyxZQUFZLEVBQUU7WUFDN0IsbUZBQW1GO1lBQ25GLElBQUksRUFBRSxLQUFLLFVBQVUsRUFBRTtnQkFDbkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7Z0JBQzVCLE9BQU87YUFDVjtZQUNELFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN4QyxJQUFJLENBQUMsc0JBQXNCLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDaEMsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUNwQixJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO2FBQzdEO1NBQ0o7YUFBTSxJQUFJLEdBQUcsS0FBSyxhQUFhLEVBQUU7WUFDOUIsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3RCO2FBQU0sSUFBSSxHQUFHLEtBQUssVUFBVSxFQUFFO1lBQzNCLE9BQU87U0FDVjthQUFNLElBQUksR0FBRyxLQUFLLGVBQWUsSUFBSSxFQUFFLEVBQUU7WUFDdEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQztZQUN4QyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztTQUNuQzthQUFNLElBQUksR0FBRyxLQUFLLGlCQUFpQixFQUFFO1lBQ2xDLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtnQkFDcEIsdUdBQXVHO2dCQUN2RyxVQUFVLENBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDLENBQUM7YUFDOUQ7U0FDSjthQUFNLElBQUksR0FBRyxLQUFLLFVBQVUsRUFBRTtZQUMzQixJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sR0FBRztnQkFDekIsVUFBVSxFQUFFLEVBQUU7YUFDakIsQ0FBQztZQUNGLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1NBQ3RDO2FBQU0sSUFBSSxHQUFHLEtBQUssZUFBZSxFQUFFO1lBQ2hDLElBQUksRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDbkQsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUNwQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUNsQztpQkFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLEVBQUU7Z0JBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQ25DO1NBQ0o7YUFBTTtZQUNILEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ3ZDO0lBQ0wsQ0FBQztJQUVNLFdBQVcsQ0FBQyxHQUFRLEVBQUUsU0FBNEI7UUFDckQsSUFBSSxXQUFtQixDQUFDO1FBRXhCLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFO1lBQ3hCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLElBQUksU0FBUyxDQUFDO1lBQzdELDREQUE0RDtZQUM1RCxXQUFXLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRWhILHlDQUF5QztZQUN6QyxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksUUFBUSxFQUFFLEVBQUU7Z0JBQ2hDLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxRQUFRLEVBQUU7b0JBQzdELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztpQkFDM0M7cUJBQU07b0JBQ0gsSUFBSSxDQUFDLG1CQUFtQixDQUFDLHNCQUFzQixFQUFFLEVBQUMsTUFBTSxFQUFFLEdBQUcsRUFBQyxDQUFDLENBQUM7aUJBQ25FO2FBQ0o7aUJBQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQ3pELElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxRQUFRLEVBQUU7b0JBQzdELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDO29CQUMzRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsU0FBUyxDQUFDLENBQUM7aUJBQzNDO3FCQUFNO29CQUNILElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxzQkFBc0IsRUFBRSxFQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUMsQ0FBQyxDQUFDO2lCQUNuRTthQUNKO2lCQUFNLElBQUksR0FBRyxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUN6QyxJQUFJLEtBQUssR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztnQkFDcEMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7Z0JBRWhELGtEQUFrRDtnQkFDbEQsSUFBSSxLQUFLLEdBQUcsSUFBSSxFQUFFO29CQUNkLElBQUksR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ25DO2dCQUNELElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsRUFBRTtvQkFDeEMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7b0JBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBMEIsRUFBRSxFQUFFO3dCQUNsRCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQzt3QkFDcEMsSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUU7NEJBQ2pDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsQ0FBQzt5QkFDekM7b0JBQ0wsQ0FBQyxDQUFDLENBQUM7b0JBQ0gsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFNBQVMsQ0FBQztpQkFDckM7cUJBQU87b0JBQ0osSUFBSSxDQUFDLG1CQUFtQixDQUFDLHNCQUFzQixFQUFFLEVBQUMsTUFBTSxFQUFFLEdBQUcsRUFBQyxDQUFDLENBQUM7aUJBQ25FO2FBRUo7aUJBQU07Z0JBQ0gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLElBQUksV0FBVyxHQUFHLENBQUMsRUFBRTtvQkFDeEMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7b0JBQzFCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDeEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxTQUFTLENBQUM7aUJBQzlEO2FBQ0o7WUFDRCxVQUFVLEVBQUUsQ0FBQztTQUNoQjtJQUNMLENBQUM7SUFFRCxrQ0FBa0M7SUFDM0IsS0FBSztRQUNSLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyx3QkFBd0IsQ0FBQyxHQUFRO1FBQ3JDLElBQUksUUFBMkIsQ0FBQztRQUNoQyxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNmLFFBQVEsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDM0M7YUFBTTtZQUNILFFBQVEsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDM0M7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNwQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksWUFBWSxDQUFFLEdBQVE7UUFDekIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BELElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxRQUFRLEVBQUU7WUFDL0IsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNJLFVBQVUsQ0FBQyxHQUFHLEVBQUUseUJBQTBCO1FBQzdDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ1gsT0FBTztTQUNWO1FBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUU7WUFDcEIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO1NBQ3JFO1FBQ0QscUJBQXFCO1FBQ3JCLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVPLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxNQUFNO1FBQ3pDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxrQkFBa0IsRUFBRSxFQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUMsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFUyxXQUFXLENBQUMsSUFBaUIsRUFBRSxTQUFpQixFQUFFLGFBQXVCLEVBQUUsTUFBVztRQUM1RixzRkFBc0Y7UUFDdEYsTUFBTSxZQUFZLEdBQUc7WUFDakIsR0FBRyxFQUFFLE9BQU87WUFDWixTQUFTLEVBQUUsVUFBVTtTQUN4QixDQUFDO1FBQ0YsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUU7WUFDbEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FDOUIsSUFBSSxDQUFDLGFBQWEsRUFDbEIsWUFBWSxDQUFDLFNBQVMsQ0FBQyxJQUFJLFNBQVMsRUFDcEMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDSixNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUN2RCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUU7b0JBQ2YsTUFBTSxlQUFlLEdBQXNCLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztvQkFDMUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUU7d0JBQzlCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsRUFBQyxNQUFNLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLGVBQWUsQ0FBQyxJQUFJLEVBQUMsQ0FBQyxDQUFDO3FCQUMzRztpQkFDSjtZQUNMLENBQUMsQ0FDSixDQUFDO1NBQ0w7SUFDTCxDQUFDO0lBRUQsdUZBQXVGO0lBQy9FLHdCQUF3QjtRQUM1QixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLGVBQWUsRUFBRSxHQUFHLEVBQUU7WUFDbkUsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFO2dCQUNoRCxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDO2FBQ2pDO1FBQ0wsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFRCxRQUFRO1FBQ0osS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDOUIsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNaLElBQUksQ0FBQyxpQ0FBaUMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsaUNBQWlDLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxjQUFjLENBQUMsd0JBQXdCLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDekssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ04sSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLFlBQVksR0FBRztZQUNoQixRQUFRLEVBQUUsSUFBSTtZQUNkLFFBQVEsRUFBRSxJQUFJO1NBQ2pCLENBQUM7SUFDTixDQUFDO0lBRU8sZ0JBQWdCO1FBQ3BCLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRSxJQUFJLFFBQVEsRUFBRTtZQUNWLG1DQUFtQztZQUNuQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxFQUFFO2dCQUNyQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbEIsQ0FBQyxDQUFDLENBQUM7U0FDTjtJQUNMLENBQUM7SUFFRCxlQUFlO1FBQ1gsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDNUIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN0RCxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1lBRWhFLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ3JDLElBQUcsR0FBRyxFQUFFO29CQUNKLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUM5QztnQkFDRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7YUFDdkI7WUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRTtnQkFDckIsSUFBSSxHQUFHLEVBQUU7b0JBQ0wsR0FBRyxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2lCQUN0QzthQUNKO1lBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQ2xDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQztnQkFDM0MsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDbEU7WUFDRCxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsMkJBQTJCLENBQUMsQ0FBQztRQUMxRSxNQUFNLENBQUMsR0FBa0IsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUN6RSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDcEIsSUFBSSxHQUFHLEVBQUM7Z0JBQ0osR0FBRyxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDdEQ7U0FDSjtRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFHO1lBQ3RCLElBQUcsR0FBRyxFQUFFO2dCQUNKLEdBQUcsQ0FBQyxlQUFlLENBQUMsa0JBQWtCLENBQUMsQ0FBQzthQUMzQztTQUNKO1FBQ0QsSUFBSSxXQUFXLEVBQUUsSUFBSSxHQUFHLENBQUMsYUFBYSxDQUFDLDZCQUE2QixDQUFDLEVBQUU7WUFDbkUsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMvQztJQUNMLENBQUM7SUFFRCxXQUFXO1FBQ1AsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLEVBQUU7WUFDM0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUNyRDtRQUNELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoRCxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVELFVBQVU7UUFDTixLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDMUIsQ0FBQzs7QUFodkNNLDZCQUFlLEdBQUcsYUFBYSxFQUFFLENBQUM7O1lBUjVDLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUUsYUFBYTtnQkFDdkIsaXBPQUFvQztnQkFDcEMsU0FBUyxFQUFFO29CQUNQLGtCQUFrQixDQUFDLGFBQWEsQ0FBQztpQkFDcEM7YUFDSjs7O1lBNUMyRyxRQUFRO1lBQWpGLGlCQUFpQjtZQXdCeUosVUFBVTtZQWpCbk4sR0FBRztZQUNILFdBQVc7WUFSdUcsTUFBTTt5Q0ErTm5ILFNBQVMsU0FBQyxnQkFBZ0I7eUNBQzFCLFNBQVMsU0FBQyxrQkFBa0I7eUNBQzVCLFNBQVMsU0FBQyxjQUFjO3lDQUN4QixTQUFTLFNBQUMsaUJBQWlCO3lDQUMzQixTQUFTLFNBQUMsa0JBQWtCO3lDQUM1QixTQUFTLFNBQUMsa0JBQWtCO1lBak5qQyxnQkFBZ0I7WUFDaEIsaUJBQWlCOzs7MkJBNEJoQixZQUFZLFNBQUMsY0FBYztxQ0FFM0IsWUFBWSxTQUFDLHdCQUF3QjtzQ0FDckMsWUFBWSxTQUFDLHlCQUF5Qjs0QkFDdEMsZUFBZSxTQUFDLGVBQWU7NEJBRS9CLFNBQVMsU0FBQyxtQkFBbUI7d0JBQzdCLFlBQVksU0FBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBBdHRyaWJ1dGUsIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIENvbnRlbnRDaGlsZCwgQ29udGVudENoaWxkcmVuLCBFbGVtZW50UmVmLCBJbmplY3RvciwgTmdab25lLCBPbkRlc3Ryb3ksIE9uSW5pdCwgUXVlcnlMaXN0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkLCBWaWV3Q2hpbGRyZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7XG4gICAgJGFwcERpZ2VzdCxcbiAgICAkaW52b2tlV2F0Y2hlcnMsXG4gICAgQXBwLFxuICAgIEFwcERlZmF1bHRzLFxuICAgIERhdGFTb3VyY2UsXG4gICAgZ2V0Q2xvbmVkT2JqZWN0LFxuICAgIGlzRGF0YVNvdXJjZUVxdWFsLFxuICAgIGlzRGVmaW5lZCxcbiAgICBpc01vYmlsZSxcbiAgICBpc01vYmlsZUFwcCxcbiAgICBpc051bWJlcixcbiAgICBpc09iamVjdCxcbiAgICBub29wLFxuICAgIHN3aXRjaENsYXNzLFxuICAgIFN0YXRlUGVyc2lzdGVuY2UsXG4gICAgUGFnaW5hdGlvblNlcnZpY2UsXG4gICAgc2V0TGlzdENsYXNzLFxuICAgIGdlbmVyYXRlR1VJZFxufSBmcm9tICdAd20vY29yZSc7XG5pbXBvcnQgeyBBUFBMWV9TVFlMRVNfVFlQRSwgY29uZmlndXJlRG5ELCBERUJPVU5DRV9USU1FUywgZ2V0T3JkZXJlZERhdGFzZXQsIGdyb3VwRGF0YSwgaGFuZGxlSGVhZGVyQ2xpY2ssIE5BVklHQVRJT05fVFlQRSwgdW5zdXBwb3J0ZWRTdGF0ZVBlcnNpc3RlbmNlVHlwZXMsIHByb3ZpZGVBc1dpZGdldFJlZiwgU3R5bGFibGVDb21wb25lbnQsIHN0eWxlciwgVG9EYXRlUGlwZSwgdG9nZ2xlQWxsSGVhZGVycywgV2lkZ2V0UmVmLCBleHRyYWN0RGF0YVNvdXJjZU5hbWUgfSBmcm9tICdAd20vY29tcG9uZW50cy9iYXNlJztcbmltcG9ydCB7IFBhZ2luYXRpb25Db21wb25lbnQgfSBmcm9tICdAd20vY29tcG9uZW50cy9kYXRhL3BhZ2luYXRpb24nO1xuaW1wb3J0IHsgQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnQHdtL2NvbXBvbmVudHMvaW5wdXQnO1xuXG5pbXBvcnQgeyByZWdpc3RlclByb3BzIH0gZnJvbSAnLi9saXN0LnByb3BzJztcbmltcG9ydCB7IExpc3RJdGVtRGlyZWN0aXZlIH0gZnJvbSAnLi9saXN0LWl0ZW0uZGlyZWN0aXZlJztcbmltcG9ydCB7IExpc3RBbmltYXRvciB9IGZyb20gJy4vbGlzdC5hbmltYXRvcic7XG5cbmRlY2xhcmUgY29uc3QgXztcbmRlY2xhcmUgY29uc3QgJDtcblxuY29uc3QgREVGQVVMVF9DTFMgPSAnYXBwLWxpdmVsaXN0IGFwcC1wYW5lbCc7XG5jb25zdCBXSURHRVRfQ09ORklHID0ge3dpZGdldFR5cGU6ICd3bS1saXN0JywgaG9zdENsYXNzOiBERUZBVUxUX0NMU307XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZGl2W3dtTGlzdF0nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgcHJvdmlkZUFzV2lkZ2V0UmVmKExpc3RDb21wb25lbnQpXG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBMaXN0Q29tcG9uZW50IGV4dGVuZHMgU3R5bGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gICAgc3RhdGljIGluaXRpYWxpemVQcm9wcyA9IHJlZ2lzdGVyUHJvcHMoKTtcblxuICAgIEBDb250ZW50Q2hpbGQoJ2xpc3RUZW1wbGF0ZScpIGxpc3RUZW1wbGF0ZTogVGVtcGxhdGVSZWY8RWxlbWVudFJlZj47XG5cbiAgICBAQ29udGVudENoaWxkKCdsaXN0TGVmdEFjdGlvblRlbXBsYXRlJykgbGlzdExlZnRBY3Rpb25UZW1wbGF0ZTogIFRlbXBsYXRlUmVmPEVsZW1lbnRSZWY+O1xuICAgIEBDb250ZW50Q2hpbGQoJ2xpc3RSaWdodEFjdGlvblRlbXBsYXRlJykgbGlzdFJpZ2h0QWN0aW9uVGVtcGxhdGU6ICBUZW1wbGF0ZVJlZjxFbGVtZW50UmVmPjtcbiAgICBAQ29udGVudENoaWxkcmVuKEJ1dHRvbkNvbXBvbmVudCkgYnRuQ29tcG9uZW50cztcblxuICAgIEBWaWV3Q2hpbGQoUGFnaW5hdGlvbkNvbXBvbmVudCkgZGF0YU5hdmlnYXRvcjtcbiAgICBAVmlld0NoaWxkcmVuKExpc3RJdGVtRGlyZWN0aXZlKSBsaXN0SXRlbXM6IFF1ZXJ5TGlzdDxMaXN0SXRlbURpcmVjdGl2ZT47XG5cbiAgICBwcml2YXRlIGl0ZW1zUGVyUm93Q2xhc3M6IHN0cmluZztcbiAgICBwcml2YXRlIGZpcnN0U2VsZWN0ZWRJdGVtOiBMaXN0SXRlbURpcmVjdGl2ZTtcbiAgICBwcml2YXRlIG5hdmlnYXRvck1heFJlc3VsdFdhdGNoOiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSBuYXZpZ2F0b3JSZXN1bHRXYXRjaDogU3Vic2NyaXB0aW9uO1xuICAgIHByaXZhdGUgbmF2Q29udHJvbHM6IHN0cmluZztcbiAgICBwcml2YXRlIG9uRGVtYW5kTG9hZDogYm9vbGVhbjtcbiAgICBwcml2YXRlIF9pdGVtczogQXJyYXk8YW55PjtcbiAgICBwcml2YXRlIGRhdGFOYXZpZ2F0b3JXYXRjaGVkOiBib29sZWFuO1xuICAgIHByaXZhdGUgZGF0YXNvdXJjZTogYW55O1xuICAgIHByaXZhdGUgc2hvd05hdmlnYXRpb246IGJvb2xlYW47XG4gICAgcHVibGljIG5vRGF0YUZvdW5kOiBib29sZWFuO1xuICAgIHByaXZhdGUgcmVvcmRlclByb3BzOiBhbnk7XG4gICAgcHJpdmF0ZSBhcHA6IGFueTtcbiAgICBwcml2YXRlIGFwcERlZmF1bHRzOiBhbnk7XG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZTtcbiAgICBwcml2YXRlIHN0YXRlUGVyc2lzdGVuY2U6IFN0YXRlUGVyc2lzdGVuY2U7XG4gICAgcHJpdmF0ZSBwYWdpbmF0aW9uU2VydmljZTogUGFnaW5hdGlvblNlcnZpY2U7XG5cbiAgICBwdWJsaWMgbGFzdFNlbGVjdGVkSXRlbTogTGlzdEl0ZW1EaXJlY3RpdmU7XG4gICAgcHVibGljIGZpZWxkRGVmczogQXJyYXk8YW55PjtcbiAgICBwdWJsaWMgZGlzYWJsZWl0ZW07XG4gICAgcHVibGljIG5hdmlnYXRpb246IHN0cmluZztcbiAgICBwdWJsaWMgbmF2aWdhdGlvbmFsaWduOiBzdHJpbmc7XG4gICAgcHVibGljIHBhZ2VzaXplOiBudW1iZXI7XG4gICAgcHVibGljIGRhdGFzZXQ6IGFueTtcbiAgICBwdWJsaWMgbXVsdGlzZWxlY3Q6IGJvb2xlYW47XG4gICAgcHVibGljIHNlbGVjdGZpcnN0aXRlbTogYm9vbGVhbjtcbiAgICBwdWJsaWMgb3JkZXJieTogc3RyaW5nO1xuICAgIHB1YmxpYyBsb2FkaW5naWNvbjogc3RyaW5nO1xuICAgIHB1YmxpYyBwYWdpbmF0aW9uY2xhc3M6IHN0cmluZztcbiAgICBwdWJsaWMgb25kZW1hbmRtZXNzYWdlOiBzdHJpbmc7XG4gICAgcHVibGljIGxvYWRpbmdkYXRhbXNnOiBzdHJpbmc7XG4gICAgcHVibGljIHNlbGVjdGlvbmxpbWl0OiBudW1iZXI7XG4gICAgcHVibGljIGluZlNjcm9sbDogYm9vbGVhbjtcbiAgICBwdWJsaWMgZW5hYmxlcmVvcmRlcjogYm9vbGVhbjtcbiAgICBwdWJsaWMgaXRlbXNwZXJyb3c6IHN0cmluZztcbiAgICBwdWJsaWMgaXRlbWNsYXNzOiBzdHJpbmc7XG4gICAgcHVibGljIHNlbGVjdGVkSXRlbVdpZGdldHM6IEFycmF5PFdpZGdldFJlZj4gfCBXaWRnZXRSZWY7XG4gICAgcHVibGljIHZhcmlhYmxlSW5mbGlnaHQ7XG4gICAgcHVibGljIG5hbWU7XG4gICAgcHVibGljIGN1cnJlbnRQYWdlO1xuICAgIHB1YmxpYyBkaXJlY3Rpb247XG4gICAgcHVibGljIHRhYmluZGV4O1xuXG4gICAgcHVibGljIGhhbmRsZUhlYWRlckNsaWNrOiBGdW5jdGlvbjtcbiAgICBwdWJsaWMgdG9nZ2xlQWxsSGVhZGVyczogdm9pZDtcbiAgICBwdWJsaWMgZ3JvdXBieTogc3RyaW5nO1xuICAgIHB1YmxpYyBjb2xsYXBzaWJsZTogc3RyaW5nO1xuICAgIHB1YmxpYyBkYXRlUGlwZTogVG9EYXRlUGlwZTtcbiAgICBwdWJsaWMgYmluZGl0ZW1jbGFzczogc3RyaW5nO1xuICAgIHB1YmxpYyBiaW5kZGlzYWJsZWl0ZW06IHN0cmluZztcbiAgICBwdWJsaWMgYmluZGRhdGFzZXQ6IHN0cmluZztcbiAgICBwcml2YXRlIGJpbmRkYXRhc291cmNlOiBzdHJpbmc7XG4gICAgcHVibGljIG1vdXNlRW50ZXJDQjogc3RyaW5nO1xuICAgIHB1YmxpYyBtb3VzZUxlYXZlQ0I6IHN0cmluZztcblxuICAgIHByaXZhdGUgbWF0Y2g6IHN0cmluZztcbiAgICBwcml2YXRlIGRhdGVmb3JtYXQ6IHN0cmluZztcbiAgICBwcml2YXRlIGdyb3VwZWREYXRhOiBhbnk7XG4gICAgcHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWY7XG4gICAgcHJpdmF0ZSBwcm9taXNlUmVzb2x2ZXJGbjogRnVuY3Rpb247XG4gICAgcHJpdmF0ZSBwcm9wc0luaXRQcm9taXNlOiBQcm9taXNlPGFueT47XG4gICAgcHJpdmF0ZSAkdWxFbGU6IGFueTtcbiAgICBwcml2YXRlIF9saXN0QW5pbWF0b3I6IExpc3RBbmltYXRvcjtcbiAgICBwdWJsaWMgcHVsbHRvcmVmcmVzaDogYm9vbGVhbjtcbiAgICBwcml2YXRlIF9saXN0ZW5lckRlc3Ryb3llcnM6IEFycmF5PGFueT47XG4gICAgcHJpdmF0ZSBkZWJvdW5jZWRGZXRjaE5leHREYXRhc2V0T25TY3JvbGw6IEZ1bmN0aW9uO1xuXG4gICAgcHVibGljIHRpdGxlOiBzdHJpbmc7XG4gICAgcHVibGljIHN1YmhlYWRpbmc6IHN0cmluZztcbiAgICBwdWJsaWMgaWNvbmNsYXNzOiBzdHJpbmc7XG4gICAgcHVibGljIGxpc3RjbGFzczogYW55O1xuICAgIHByaXZhdGUgaXNEYXRhQ2hhbmdlZDogYm9vbGVhbjtcbiAgICBwdWJsaWMgc3RhdGVoYW5kbGVyOiBhbnk7XG4gICAgcHJpdmF0ZSBpc0xpc3RFbGVtZW50TW92YWJsZSA6IGJvb2xlYW47XG4gICAgcHVibGljIGN1cnJlbnRJbmRleDogbnVtYmVyO1xuICAgIHByaXZhdGUgYXJpYVRleHQ6IFN0cmluZztcbiAgICBwdWJsaWMgdGl0bGVJZDogc3RyaW5nIDtcblxuICAgIF9pc0RlcGVuZGVudDtcbiAgICBwcml2YXRlIF9wYWdlTG9hZDtcbiAgICBwcml2YXRlIF9zZWxlY3RlZEl0ZW1zRXhpc3Q7XG5cbiAgICBwcml2YXRlIHRvdWNoaW5nO1xuICAgIHByaXZhdGUgdG91Y2hlZDtcblxuICAgIHB1YmxpYyBnZXQgc2VsZWN0ZWRpdGVtKCkge1xuICAgICAgICBpZiAodGhpcy5tdWx0aXNlbGVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIGdldENsb25lZE9iamVjdCh0aGlzLl9pdGVtcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF8uaXNFbXB0eSh0aGlzLl9pdGVtcykpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2V0Q2xvbmVkT2JqZWN0KHRoaXMuX2l0ZW1zWzBdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGxpc3Qgb2Ygd2lkZ2V0cyBwcmVzZW50IG9uIGxpc3QgaXRlbSBieSBjb25zaWRlcmluZyBuYW1lIGFuZCBpbmRleCBvZiB0aGUgd2lkZ2V0LlxuICAgICAqIElmIHdlIGRpZCdudCBwYXNzIGluZGV4LCBpdCByZXR1cm5zIGFycmF5IG9mIGFsbCB0aGUgd2lkZ2V0cyB3aGljaCBhcmUgbWF0Y2hpbmcgdG8gd2lkZ2V0IG5hbWVcbiAgICAgKiBAcGFyYW0gd2lkZ3RlTmFtZTogTmFtZSBvZiB0aGUgd2lkZ2V0XG4gICAgICogQHBhcmFtIGluZGV4OiBJbmRleCBvZiB0aGUgd2lkZ2V0XG4gICAgICovXG4gICAgcHVibGljIGdldFdpZGdldHMod2lkZ3RlTmFtZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGxldCAkdGFyZ2V0O1xuICAgICAgICBjb25zdCByZXRWYWwgPSBbXTtcblxuICAgICAgICBpZiAoIXdpZGd0ZU5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNEZWZpbmVkKGluZGV4KSkge1xuICAgICAgICAgICAgXy5mb3JFYWNoKHRoaXMubGlzdEl0ZW1zLnRvQXJyYXkoKSwgKGVsKSA9PiB7XG4gICAgICAgICAgICAgICAgJHRhcmdldCA9IF8uZ2V0KGVsLmN1cnJlbnRJdGVtV2lkZ2V0cywgd2lkZ3RlTmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKCR0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnB1c2goJHRhcmdldCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH1cbiAgICAgICAgaW5kZXggPSAraW5kZXggfHwgMDtcblxuICAgICAgICAkdGFyZ2V0ID0gXy5nZXQodGhpcy5saXN0SXRlbXMudG9BcnJheSgpLCBpbmRleCk7XG5cbiAgICAgICAgaWYgKCR0YXJnZXQpIHtcbiAgICAgICAgICAgIHJldHVybiBbXy5nZXQoJHRhcmdldC5jdXJyZW50SXRlbVdpZGdldHMsIHdpZGd0ZU5hbWUpXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHJldHVybnMgbGlzdGl0ZW0gcmVmZXJlbmNlIGJ5IGluZGV4IHZhbHVlLiBUaGlzIHJlZmVycyB0byB0aGUgc2FtZSBtZXRob2QgZ2V0TGlzdEl0ZW1CeUluZGV4LlxuICAgIHB1YmxpYyBnZXRJdGVtKGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGlzdEl0ZW1CeUluZGV4KGluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGluZGV4IG9mIGxpc3RJdGVtKGxpc3RJdGVtRGlyZWN0aXZlIC8gbGlzdEl0ZW1PYmplY3QpXG4gICAgICogSWYgaXRlbSBpcyBhIGRpcmVjdGl2ZSwgaW5kZXggaXMgZmV0Y2hlZCBmcm9tIGxpc3RJdGVtc1xuICAgICAqIElmIGl0ZW0gaXMgYW4gb2JqZWN0LCBpbmRleCBpcyBmZXRjaGVkIGZyb20gZmllbGREZWZzXG4gICAgKi9cbiAgICBwdWJsaWMgZ2V0SW5kZXgoaXRlbTogYW55KSB7XG4gICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgTGlzdEl0ZW1EaXJlY3RpdmUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldExpc3RJdGVtSW5kZXgoaXRlbSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmllbGREZWZzLmZpbmRJbmRleCgob2JqKSA9PiBfLmlzRXF1YWwob2JqLCBpdGVtKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHNlbGVjdGVkaXRlbShpdGVtcykge1xuICAgICAgICB0aGlzLl9pdGVtcy5sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLmRlc2VsZWN0TGlzdEl0ZW1zKCk7XG5cbiAgICAgICAgaWYgKF8uaXNBcnJheShpdGVtcykpIHtcbiAgICAgICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB0aGlzLnNlbGVjdEl0ZW0oaXRlbSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtKGl0ZW1zKTtcbiAgICAgICAgfVxuICAgICAgICAkYXBwRGlnZXN0KCk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGluajogSW5qZWN0b3IsXG4gICAgICAgIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgZGF0ZVBpcGU6IFRvRGF0ZVBpcGUsXG4gICAgICAgIGFwcDogQXBwLFxuICAgICAgICBhcHBEZWZhdWx0czogQXBwRGVmYXVsdHMsXG4gICAgICAgIG5nWm9uZTogTmdab25lLFxuICAgICAgICBAQXR0cmlidXRlKCdpdGVtY2xhc3MuYmluZCcpIGJpbmRpdGVtY2xhc3M6IHN0cmluZyxcbiAgICAgICAgQEF0dHJpYnV0ZSgnZGlzYWJsZWl0ZW0uYmluZCcpIGJpbmRkaXNhYmxlaXRlbTogc3RyaW5nLFxuICAgICAgICBAQXR0cmlidXRlKCdkYXRhc2V0LmJpbmQnKSBiaW5kZGF0YXNldDogc3RyaW5nLFxuICAgICAgICBAQXR0cmlidXRlKCdkYXRhc291cmNlLmJpbmQnKSBiaW5kZGF0YXNvdXJjZTogc3RyaW5nLFxuICAgICAgICBAQXR0cmlidXRlKCdtb3VzZWVudGVyLmV2ZW50JykgbW91c2VFbnRlckNCOiBzdHJpbmcsXG4gICAgICAgIEBBdHRyaWJ1dGUoJ21vdXNlbGVhdmUuZXZlbnQnKSBtb3VzZUxlYXZlQ0I6IHN0cmluZyxcbiAgICAgICAgc3RhdGVQZXJzaXN0ZW5jZTogU3RhdGVQZXJzaXN0ZW5jZSxcbiAgICAgICAgcGFnaW5hdGlvblNlcnZpY2U6IFBhZ2luYXRpb25TZXJ2aWNlLFxuICAgICkge1xuICAgICAgICBsZXQgcmVzb2x2ZUZuOiBGdW5jdGlvbiA9IG5vb3A7XG4gICAgICAgIGNvbnN0IHByb3BzSW5pdFByb21pc2UgPSBuZXcgUHJvbWlzZShyZXMgPT4gcmVzb2x2ZUZuID0gcmVzKTtcbiAgICAgICAgc3VwZXIoaW5qLCBXSURHRVRfQ09ORklHLCBwcm9wc0luaXRQcm9taXNlKTtcbiAgICAgICAgdGhpcy5wcm9wc0luaXRQcm9taXNlID0gcHJvcHNJbml0UHJvbWlzZTtcbiAgICAgICAgdGhpcy5wcm9taXNlUmVzb2x2ZXJGbiA9IHJlc29sdmVGbjtcbiAgICAgICAgc3R5bGVyKHRoaXMubmF0aXZlRWxlbWVudCwgdGhpcywgQVBQTFlfU1RZTEVTX1RZUEUuU0hFTEwpO1xuICAgICAgICB0aGlzLmNkUmVmID0gY2RSZWY7XG4gICAgICAgIHRoaXMubmdab25lID0gbmdab25lO1xuICAgICAgICB0aGlzLmRhdGVQaXBlID0gZGF0ZVBpcGU7XG4gICAgICAgIHRoaXMuc3RhdGVQZXJzaXN0ZW5jZSA9IHN0YXRlUGVyc2lzdGVuY2U7XG4gICAgICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2UgPSBwYWdpbmF0aW9uU2VydmljZTtcbiAgICAgICAgdGhpcy5fcGFnZUxvYWQgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuYmluZGl0ZW1jbGFzcyA9IGJpbmRpdGVtY2xhc3M7XG4gICAgICAgIHRoaXMuYmluZGRpc2FibGVpdGVtID0gYmluZGRpc2FibGVpdGVtO1xuICAgICAgICB0aGlzLmJpbmRkYXRhc2V0ID0gYmluZGRhdGFzZXQ7XG4gICAgICAgIHRoaXMubW91c2VFbnRlckNCID0gbW91c2VFbnRlckNCO1xuICAgICAgICB0aGlzLm1vdXNlTGVhdmVDQiA9IG1vdXNlTGVhdmVDQjtcbiAgICAgICAgdGhpcy5iaW5kZGF0YXNvdXJjZSA9IGJpbmRkYXRhc291cmNlO1xuXG4gICAgICAgIHRoaXMuYXBwID0gYXBwO1xuICAgICAgICB0aGlzLmFwcERlZmF1bHRzID0gYXBwRGVmYXVsdHM7XG4gICAgICAgIHRoaXMudmFyaWFibGVJbmZsaWdodCA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMubm9EYXRhRm91bmQgPSAhYmluZGRhdGFzZXQ7XG4gICAgICAgIHRoaXMudGl0bGVJZCA9ICd3bWxpc3QtJyArIGdlbmVyYXRlR1VJZCgpO1xuXG4gICAgICAgIC8vIFVwZGF0ZXMgcGFnaW5hdGlvbiwgZmlsdGVyLCBzb3J0IGV0YyBvcHRpb25zIGZvciBzZXJ2aWNlIGFuZCBjcnVkIHZhcmlhYmxlc1xuICAgICAgICB0aGlzLl9saXN0ZW5lckRlc3Ryb3llcnMgPSBbXG4gICAgICAgICAgICB0aGlzLmFwcC5zdWJzY3JpYmUoJ2NoZWNrLXN0YXRlLXBlcnNpc3RlbmNlLW9wdGlvbnMnLCBvcHRpb25zID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgZGF0YVNvdXJjZU5hbWUgPSBfLmdldCh0aGlzLmRhdGFzb3VyY2UsICduYW1lJyk7XG4gICAgICAgICAgICAgICAgLy8gaW4gUHJlZmFicywgdGhpcy5kYXRhc291cmNlIGlzIG5vdCByZXNvbHZlZCBhdCB0aGUgdGltZSBvZiB2YXJpYWJsZSBpbnZvY2F0aW9uLCBzbyBhZGRpdGlvbmFsIGNoZWNrIGlzIHJlcXVpcmVkLlxuICAgICAgICAgICAgICAgIGlmICghZGF0YVNvdXJjZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YVNvdXJjZU5hbWUgPSBleHRyYWN0RGF0YVNvdXJjZU5hbWUodGhpcy5iaW5kZGF0YXNvdXJjZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChfLmdldChvcHRpb25zLCAndmFyaWFibGUubmFtZScpICE9PSBkYXRhU291cmNlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU3RhdGVQYXJhbXMob3B0aW9ucyk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIC8vIFNob3cgbG9hZGluZyBzdGF0dXMgYmFzZWQgb24gdGhlIHZhcmlhYmxlIGxpZmUgY3ljbGVcbiAgICAgICAgICAgIHRoaXMuYXBwLnN1YnNjcmliZSgndG9nZ2xlLXZhcmlhYmxlLXN0YXRlJywgdGhpcy5oYW5kbGVMb2FkaW5nLmJpbmQodGhpcykpLFxuICAgICAgICAgICAgdGhpcy5hcHAuc3Vic2NyaWJlKCdzZXR1cC1jdWQtbGlzdGVuZXInLCBwYXJhbSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ25hbWUnKSAhPT0gcGFyYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9pc0RlcGVuZGVudCA9IHRydWU7XG4gICAgICAgICAgICB9KVxuICAgICAgICBdO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Q29uZmlndXJlZFN0YXRlKCkge1xuICAgICAgICBjb25zdCBtb2RlID0gdGhpcy5zdGF0ZVBlcnNpc3RlbmNlLmNvbXB1dGVNb2RlKHRoaXMuc3RhdGVoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIG1vZGUgJiYgbW9kZS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlU3RhdGVQYXJhbXMob3B0aW9ucykge1xuICAgICAgICBpZiAodGhpcy5fcGFnZUxvYWQgJiYgdGhpcy5nZXRDb25maWd1cmVkU3RhdGUoKSAhPT0gJ25vbmUnKSB7XG4gICAgICAgICAgICB0aGlzLl9wYWdlTG9hZCA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3Qgd2lkZ2V0U3RhdGUgPSB0aGlzLnN0YXRlUGVyc2lzdGVuY2UuZ2V0V2lkZ2V0U3RhdGUodGhpcyk7XG4gICAgICAgICAgICBpZiAoXy5nZXQod2lkZ2V0U3RhdGUsICdwYWdpbmF0aW9uJykpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLm9wdGlvbnMgPSBvcHRpb25zLm9wdGlvbnMgfHwge307XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5vcHRpb25zLnBhZ2UgPSB3aWRnZXRTdGF0ZS5wYWdpbmF0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKF8uZ2V0KHdpZGdldFN0YXRlLCAnc2VsZWN0ZWRJdGVtJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZEl0ZW1zRXhpc3QgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0cmlnZ2VyV01FdmVudChldmVudE5hbWUsIGl0ZW0/KSB7XG4gICAgICAgICRpbnZva2VXYXRjaGVycyh0cnVlKTtcbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBtdWx0aXNlbGVjdCBmb3IgdGhlIGxpdmVsaXN0KExpc3Qgd2l0aCBmb3JtIHRlbXBsYXRlKSwgaW4gcnVuIG1vZGUgZGVsZXRpbmcgYSByZWNvcmQgaXMgZ2V0dGluZyBmYWlsZWQuIEJlY3Vhc2UgdGhlIHNlbGVjdGVkaXRlbSB3aWxsIGJlIGFycmF5IG9mIG9iamVjdHMuIFNvIGNvbnNpZGVyIHRoZSBsYXN0IG9iamVjdC5cbiAgICAgICAgbGV0IHJvdyA9IHRoaXMubXVsdGlzZWxlY3QgPyBfLmxhc3QodGhpcy5zZWxlY3RlZGl0ZW0pIDogdGhpcy5zZWxlY3RlZGl0ZW07XG4gICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICByb3cgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwLm5vdGlmeSgnd20tZXZlbnQnLCB7ZXZlbnROYW1lLCB3aWRnZXROYW1lOiB0aGlzLm5hbWUsIHJvdzogcm93fSk7XG4gICAgfVxuXG4gICAgY3JlYXRlKCkge1xuICAgICAgICBpZiAodGhpcy5faXNEZXBlbmRlbnQpIHtcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlcldNRXZlbnQoJ2luc2VydCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZWRpdFJvdyhpdGVtPykge1xuICAgICAgICBpZiAodGhpcy5faXNEZXBlbmRlbnQpIHtcbiAgICAgICAgICAgIGxldCBsaXN0SXRlbTtcbiAgICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgbGlzdEl0ZW0gPSB0aGlzLmdldEl0ZW1SZWZCeUluZGV4T3JNb2RlbChpdGVtKS5pdGVtO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy50cmlnZ2VyV01FdmVudCgndXBkYXRlJywgbGlzdEl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlKGl0ZW0/KSB7XG4gICAgICAgIHRoaXMuZWRpdFJvdyhpdGVtKTtcbiAgICB9XG5cbiAgICBkZWxldGVSb3coaXRlbT8pIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzRGVwZW5kZW50KSB7XG4gICAgICAgICAgICBsZXQgbGlzdEl0ZW07XG4gICAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgICAgIGxpc3RJdGVtID0gdGhpcy5nZXRJdGVtUmVmQnlJbmRleE9yTW9kZWwoaXRlbSkuaXRlbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudHJpZ2dlcldNRXZlbnQoJ2RlbGV0ZScsIGxpc3RJdGVtKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRlbGV0ZShpdGVtPykge1xuICAgICAgICB0aGlzLmRlbGV0ZVJvdyhpdGVtKTtcbiAgICB9XG4gICAgaGFuZGxlTG9hZGluZyhkYXRhKSB7XG4gICAgICAgIGNvbnN0IGRhdGFTb3VyY2UgPSB0aGlzLmRhdGFzb3VyY2U7XG4gICAgICAgIGlmIChkYXRhU291cmNlICYmIGRhdGFTb3VyY2UuZXhlY3V0ZShEYXRhU291cmNlLk9wZXJhdGlvbi5JU19BUElfQVdBUkUpICYmIGlzRGF0YVNvdXJjZUVxdWFsKGRhdGEudmFyaWFibGUsIGRhdGFTb3VyY2UpKSB7XG4gICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU3RhdGVQYXJhbXMoZGF0YSk7XG4gICAgICAgICAgICAgICAgdGhpcy52YXJpYWJsZUluZmxpZ2h0ID0gZGF0YS5hY3RpdmU7XG4gICAgICAgICAgICAgICAgLy8gRml4IGZvciBbV01TLTIzNzcyXSBVcGRhdGUgbm9kYXRhZm91bmQgZmxhZyBvbmNlIHRoZSByZXNwb25zZSBpcyByZWNpZXZlZCBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgICAgICAgICBjb25zdCB0b3RhbEVsZSA9IGRhdGEuZGF0YT8ucGFnaW5hdGlvbj8udG90YWxFbGVtZW50cztcbiAgICAgICAgICAgICAgICBpZiAoIV8uaXNVbmRlZmluZWQodG90YWxFbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9EYXRhRm91bmQgPSB0b3RhbEVsZSA9PT0gMCA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyB0b3RhbGVsZW1lbnRzIGlzIHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vRGF0YUZvdW5kID0gXy5pc0VtcHR5KGRhdGEuZGF0YT8uZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc2V0TmF2aWdhdGlvbigpIHtcbiAgICAgICAgdGhpcy5zaG93TmF2aWdhdGlvbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLm5hdkNvbnRyb2xzID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmluZlNjcm9sbCA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9uRGVtYW5kTG9hZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZW5hYmxlQmFzaWNOYXZpZ2F0aW9uKCkge1xuICAgICAgICB0aGlzLm5hdkNvbnRyb2xzID0gTkFWSUdBVElPTl9UWVBFLkJBU0lDO1xuICAgICAgICB0aGlzLnNob3dOYXZpZ2F0aW9uID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGVuYWJsZUlubGluZU5hdmlnYXRpb24oKSB7XG4gICAgICAgIHRoaXMubmF2Q29udHJvbHMgPSBOQVZJR0FUSU9OX1RZUEUuSU5MSU5FO1xuICAgIH1cblxuICAgIHByaXZhdGUgZW5hYmxlQ2xhc3NpY05hdmlnYXRpb24oKSB7XG4gICAgICAgIHRoaXMubmF2Q29udHJvbHMgPSBOQVZJR0FUSU9OX1RZUEUuQ0xBU1NJQztcbiAgICAgICAgdGhpcy5zaG93TmF2aWdhdGlvbiA9IHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlbmFibGVQYWdlck5hdmlnYXRpb24oKSB7XG4gICAgICAgIHRoaXMubmF2Q29udHJvbHMgPSBOQVZJR0FUSU9OX1RZUEUuUEFHRVI7XG4gICAgICAgIHRoaXMuc2hvd05hdmlnYXRpb24gPSB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0TmF2aWdhdGlvblR5cGVOb25lKCkge1xuICAgICAgICB0aGlzLm5hdkNvbnRyb2xzID0gTkFWSUdBVElPTl9UWVBFLk5PTkU7XG4gICAgICAgIHRoaXMuc2hvd05hdmlnYXRpb24gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGVuYWJsZUluZmluaXRlU2Nyb2xsKCkge1xuICAgICAgICB0aGlzLmluZlNjcm9sbCA9IHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlbmFibGVPbkRlbWFuZExvYWQoKSB7XG4gICAgICAgIHRoaXMub25EZW1hbmRMb2FkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zaG93TmF2aWdhdGlvbiA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBOYXZpZ2F0aW9uIHR5cGUgZm9yIHRoZSBsaXN0LlxuICAgICAqIEBwYXJhbSB0eXBlXG4gICAgICovXG4gICAgcHJpdmF0ZSBvbk5hdmlnYXRpb25UeXBlQ2hhbmdlKHR5cGUpIHtcbiAgICAgICAgdGhpcy5yZXNldE5hdmlnYXRpb24oKTtcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIE5BVklHQVRJT05fVFlQRS5CQVNJQzpcbiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZUJhc2ljTmF2aWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQVZJR0FUSU9OX1RZUEUuSU5MSU5FOlxuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlSW5saW5lTmF2aWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQVZJR0FUSU9OX1RZUEUuQURWQU5DRUQ6XG4gICAgICAgICAgICBjYXNlIE5BVklHQVRJT05fVFlQRS5DTEFTU0lDOlxuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlQ2xhc3NpY05hdmlnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTkFWSUdBVElPTl9UWVBFLlBBR0VSOlxuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlUGFnZXJOYXZpZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE5BVklHQVRJT05fVFlQRS5OT05FIDpcbiAgICAgICAgICAgICAgICB0aGlzLnNldE5hdmlnYXRpb25UeXBlTm9uZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQVZJR0FUSU9OX1RZUEUuU0NST0xMOlxuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlSW5maW5pdGVTY3JvbGwoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTkFWSUdBVElPTl9UWVBFLk9OREVNQU5EOlxuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlT25EZW1hbmRMb2FkKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgZmllbGREZWZzIHByb3BlcnR5LCBmaWVsZERlZnMgaXMgdGhlIG1vZGVsIG9mIHRoZSBMaXN0IENvbXBvbmVudC5cbiAgICAgKiBmaWVsZERlZnMgaXMgYW4gQXJyYXkgdHlwZS5cbiAgICAgKiBAcGFyYW0gbmV3VmFsXG4gICAgICovXG4gICAgcHJpdmF0ZSB1cGRhdGVGaWVsZERlZnMobmV3VmFsOiBBcnJheTxhbnk+KSB7XG4gICAgICAgIGlmICh0aGlzLmluZlNjcm9sbCB8fCB0aGlzLm9uRGVtYW5kTG9hZCkge1xuICAgICAgICAgICAgW3RoaXMuZmllbGREZWZzLCB0aGlzLmN1cnJlbnRQYWdlXSA9IHRoaXMucGFnaW5hdGlvblNlcnZpY2UudXBkYXRlRmllbGRzT25QYWdpbmF0aW9uKHRoaXMsIG5ld1ZhbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZpZWxkRGVmcyA9IG5ld1ZhbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9yZGVyYnkpIHtcbiAgICAgICAgICAgIHRoaXMuZmllbGREZWZzID0gZ2V0T3JkZXJlZERhdGFzZXQodGhpcy5maWVsZERlZnMsIHRoaXMub3JkZXJieSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZ3JvdXBieSkge1xuICAgICAgICAgICAgdGhpcy5ncm91cGVkRGF0YSA9IGdyb3VwRGF0YSh0aGlzLCB0aGlzLmZpZWxkRGVmcywgdGhpcy5ncm91cGJ5LCB0aGlzLm1hdGNoLCB0aGlzLm9yZGVyYnksIHRoaXMuZGF0ZWZvcm1hdCwgdGhpcy5kYXRlUGlwZSwgdW5kZWZpbmVkLCB0aGlzLmFwcERlZmF1bHRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5maWVsZERlZnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLm5vRGF0YUZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRpdGVtID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgICRhcHBEaWdlc3QoKTtcbiAgICAgICAgdGhpcy5saXN0SXRlbXMuc2V0RGlydHkoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uRGF0YUNoYW5nZShuZXdWYWwpIHtcbiAgICAgICAgLy8gQ2hlY2sgZm9yIG5ld1ZhbCBpcyBub3QgZW1wdHlcbiAgICAgICAgaWYgKCFfLmlzRW1wdHkobmV3VmFsKSkge1xuXG4gICAgICAgICAgICB0aGlzLm5vRGF0YUZvdW5kID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmlzRGF0YUNoYW5nZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhc291cmNlICYmIHRoaXMuZGF0YXNvdXJjZS5leGVjdXRlKERhdGFTb3VyY2UuT3BlcmF0aW9uLklTX0FQSV9BV0FSRSkpIHtcbiAgICAgICAgICAgICAgICAvLyBjbG9uZSB0aGUgdGhlIGRhdGEgaW4gY2FzZSBvZiBsaXZlIGFuZCBzZXJ2aWNlIHZhcmlhYmxlcyB0byBwcmV2ZW50IHRoZSB0d28td2F5IGJpbmRpbmcgZm9yIHRoZXNlIHZhcmlhYmxlcy5cbiAgICAgICAgICAgICAgICBuZXdWYWwgPSBfLmNsb25lRGVlcChuZXdWYWwpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNPYmplY3QobmV3VmFsKSAmJiAhXy5pc0FycmF5KG5ld1ZhbCkpIHtcbiAgICAgICAgICAgICAgICBuZXdWYWwgPSBfLmlzRW1wdHkobmV3VmFsKSA/IFtdIDogW25ld1ZhbF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChfLmlzU3RyaW5nKG5ld1ZhbCkpIHtcbiAgICAgICAgICAgICAgICBuZXdWYWwgPSBuZXdWYWwuc3BsaXQoJywnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYgdGhlIHBhZ2UgbnVtYmVyIGlzIGdyZWF0ZXIgdGhhbiAxIG9uIGluaXRpYWwgbG9hZCB0aGVuIHdlIHJlbmRlciB0aGUgZmlyc3QgcGFnZS5cbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFzb3VyY2UgJiYgdGhpcy5kYXRhc291cmNlLm93bmVyID09PSAnQXBwJyAmJiAodGhpcy5pbmZTY3JvbGwgfHwgdGhpcy5vbkRlbWFuZExvYWQpICYmICF0aGlzLmN1cnJlbnRQYWdlICYmIHRoaXMuZGF0YXNvdXJjZS5leGVjdXRlKERhdGFTb3VyY2UuT3BlcmF0aW9uLkdFVF9QQUdJTkdfT1BUSU9OUykubnVtYmVyID4gMCkge1xuICAgICAgICAgICAgICAgIG5ld1ZhbCA9IHRoaXMuZGF0YXNvdXJjZS5leGVjdXRlKERhdGFTb3VyY2UuT3BlcmF0aW9uLkxJU1RfUkVDT1JEUywge1xuICAgICAgICAgICAgICAgICAncGFnZSc6IDFcbiAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChfLmlzQXJyYXkobmV3VmFsKSkge1xuICAgICAgICAgICAgICAgIGlmIChuZXdWYWwubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnYmVmb3JlZGF0YXJlbmRlcicsIHskZGF0YTogbmV3VmFsfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRmllbGREZWZzKG5ld1ZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUZpZWxkRGVmcyhbXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGVzIHRoZSBkYXRhU291cmNlIHdoZW4gcGFnaW5hdGlvbiBpcyBlbmFibGVkIGZvciB0aGUgQ29tcG9uZW50LlxuICAgIHByaXZhdGUgc2V0dXBEYXRhU291cmNlKCkge1xuICAgICAgICBjb25zdCBkYXRhTmF2aWdhdG9yID0gdGhpcy5kYXRhTmF2aWdhdG9yO1xuXG4gICAgICAgIGRhdGFOYXZpZ2F0b3Iub3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1heFJlc3VsdHM6IHRoaXMucGFnZXNpemUgfHwgMjBcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmRhdGFOYXZpZ2F0b3JXYXRjaGVkID0gdHJ1ZTtcblxuICAgICAgICBpZiAodGhpcy5uYXZpZ2F0b3JSZXN1bHRXYXRjaCkge1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0b3JSZXN1bHRXYXRjaC51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIC8qUmVnaXN0ZXIgYSB3YXRjaCBvbiB0aGUgXCJyZXN1bHRcIiBwcm9wZXJ0eSBvZiB0aGUgXCJkYXRhTmF2aWdhdG9yXCIgc28gdGhhdCB0aGUgcGFnaW5hdGVkIGRhdGEgaXMgZGlzcGxheWVkIGluIHRoZSBsaXZlLWxpc3QuKi9cbiAgICAgICAgdGhpcy5uYXZpZ2F0b3JSZXN1bHRXYXRjaCA9IGRhdGFOYXZpZ2F0b3IucmVzdWx0RW1pdHRlci5zdWJzY3JpYmUoKG5ld1ZhbDogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uRGF0YUNoYW5nZShuZXdWYWwpO1xuICAgICAgICB9LCB0cnVlKTtcbiAgICAgICAgLypEZS1yZWdpc3RlciB0aGUgd2F0Y2ggaWYgaXQgaXMgZXhpc3RzICovXG4gICAgICAgIGlmICh0aGlzLm5hdmlnYXRvck1heFJlc3VsdFdhdGNoKSB7XG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRvck1heFJlc3VsdFdhdGNoLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgLypSZWdpc3RlciBhIHdhdGNoIG9uIHRoZSBcIm1heFJlc3VsdHNcIiBwcm9wZXJ0eSBvZiB0aGUgXCJkYXRhTmF2aWdhdG9yXCIgc28gdGhhdCB0aGUgXCJwYWdlU2l6ZVwiIGlzIGRpc3BsYXllZCBpbiB0aGUgbGl2ZS1saXN0LiovXG4gICAgICAgIHRoaXMubmF2aWdhdG9yTWF4UmVzdWx0V2F0Y2ggPSBkYXRhTmF2aWdhdG9yLm1heFJlc3VsdHNFbWl0dGVyLnN1YnNjcmliZSgodmFsKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnBhZ2VzaXplID0gdmFsO1xuICAgICAgICB9KTtcblxuICAgICAgICBkYXRhTmF2aWdhdG9yLm1heFJlc3VsdHMgPSB0aGlzLnBhZ2VzaXplIHx8IDIwO1xuICAgICAgICB0aGlzLnJlbW92ZVByb3BlcnR5QmluZGluZygnZGF0YXNldCcpO1xuICAgICAgICAvLyB3aGVuIGxpc3QgaGF2aW5nIFwiZGF0YXNldGJvdW5kZXhwclwiIGF0dHIgaW5kaWNhdGVzIHRoYXQgbGlzdCBpcyBib3VuZCB0byBpdGVtIGNvbnRleHRcbiAgICAgICAgLy8gd2hlbiBkYXRhc2V0IGlzIGJvdW5kIHRvIFwiaXRlbS5GSUVMRFwiIHRoZW4gaXRlbSBjb250ZXh0IGlzIHBhc3NlZCBhcyB0aGUgZGF0YXNvdXJjZS5cbiAgICAgICAgY29uc3QgZGF0YXNldEJvdW5kRXhwciA9IHRoaXMuZ2V0QXR0cignZGF0YXNldGJvdW5kZXhwcicpO1xuICAgICAgICB0aGlzLmRhdGFOYXZpZ2F0b3Iuc2V0QmluZERhdGFTZXQoXG4gICAgICAgICAgICB0aGlzLmJpbmRkYXRhc2V0LFxuICAgICAgICAgICAgdGhpcy52aWV3UGFyZW50LFxuICAgICAgICAgICAgZGF0YXNldEJvdW5kRXhwciA/IHRoaXMuY29udGV4dCA6IHRoaXMuZGF0YXNvdXJjZSxcbiAgICAgICAgICAgIHRoaXMuZGF0YXNldCxcbiAgICAgICAgICAgIHRoaXMuYmluZGRhdGFzb3VyY2UsXG4gICAgICAgICAgICBkYXRhc2V0Qm91bmRFeHByLFxuICAgICAgICAgICAgdGhpcy5zdGF0ZWhhbmRsZXJcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uRGF0YVNldENoYW5nZShuZXdWYWwpIHtcbiAgICAgICAgaWYgKF8uZ2V0KHRoaXMuZGF0YXNvdXJjZSwgJ2NhdGVnb3J5JykgPT09ICd3bS5WYXJpYWJsZScgJiYgdGhpcy5nZXRDb25maWd1cmVkU3RhdGUoKSAhPT0gJ25vbmUnICYmIHRoaXMuX3BhZ2VMb2FkKSB7XG4gICAgICAgICAgICBjb25zdCB3aWRnZXRTdGF0ZSA9IHRoaXMuc3RhdGVQZXJzaXN0ZW5jZS5nZXRXaWRnZXRTdGF0ZSh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuX3BhZ2VMb2FkID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoXy5nZXQod2lkZ2V0U3RhdGUsICdwYWdpbmF0aW9uJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFOYXZpZ2F0b3IucGFnZUNoYW5nZWQoe3BhZ2U6IHdpZGdldFN0YXRlLnBhZ2luYXRpb259LCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChfLmdldCh3aWRnZXRTdGF0ZSwgJ3NlbGVjdGVkSXRlbScpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRJdGVtc0V4aXN0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuZGF0YU5hdmlnYXRvcldhdGNoZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm5hdmlnYXRpb24gJiYgdGhpcy5uYXZpZ2F0aW9uICE9PSBOQVZJR0FUSU9OX1RZUEUuTk9ORSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0dXBEYXRhU291cmNlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMub25EYXRhQ2hhbmdlKG5ld1ZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5uYXZpZ2F0aW9uICYmIHRoaXMubmF2aWdhdGlvbiAhPT0gTkFWSUdBVElPTl9UWVBFLk5PTkUpIHtcbiAgICAgICAgICAgIC8vIElmIG5hdmlnYXRpb24gaXMgYWxyZWFkeSBzZXR1cCBhbmQgZGF0YXNvdXJjZSBpcyBjaGFuZ2VkLCB1cGRhdGUgdGhlIGRhdGFzb3VyY2Ugb24gbmF2aWdhdGlvblxuICAgICAgICAgICAgdGhpcy5kYXRhTmF2aWdhdG9yLnNldERhdGFTb3VyY2UodGhpcy5kYXRhc291cmNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFsbCB0aGUgTGlzdEl0ZW0ncyBBY3RpdmUgc3RhdGUgaXMgc2V0IHRvIGZhbHNlLlxuICAgIHByaXZhdGUgZGVzZWxlY3RMaXN0SXRlbXMoKSB7XG4gICAgICAgIHRoaXMubGlzdEl0ZW1zLmZvckVhY2goaXRlbSA9PiBpdGVtLmlzQWN0aXZlID0gZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIERlc2VsZWN0IGFsbCB0aGUgTGlzdEl0ZW1zIGFuZCBjbGVhciB0aGUgc2VsZWN0ZWRpdGVtKEluT3V0Qm91bmQgUHJvcGVydHkgbW9kZWwpXG4gICAgcHJpdmF0ZSBjbGVhclNlbGVjdGVkSXRlbXMoKSB7XG4gICAgICAgIHRoaXMuZGVzZWxlY3RMaXN0SXRlbXMoKTtcbiAgICAgICAgdGhpcy5faXRlbXMubGVuZ3RoID0gMDtcbiAgICAgICAgJGFwcERpZ2VzdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybiB0aGUgTGlzdEl0ZW1EaXJlY3RpdmUgaW5zdGFuY2UgYnkgY2hlY2tpbmcgdGhlIGVxdWFsaXR5IG9mIHRoZSBtb2RlbC5cbiAgICAgKiBAcGFyYW0gbGlzdE1vZGVsOiBtb2RlbCB0byBiZSBzZWFyY2hlZCBmb3JcbiAgICAgKiBAcmV0dXJucyBMaXN0SXRlbSBpZiB0aGUgbW9kZWwgaXMgbWF0Y2hlZCBlbHNlIHJldHVybiBudWxsLlxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0TGlzdEl0ZW1CeU1vZGVsKGxpc3RNb2RlbCk6IExpc3RJdGVtRGlyZWN0aXZlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdEl0ZW1zLmZpbmQoKGxpc3RJdGVtKSA9PiB7XG4gICAgICAgICAgICBsZXQgaXRlbU9iaiA9IGxpc3RJdGVtLml0ZW07XG4gICAgICAgICAgICBpZiAodGhpcy5ncm91cGJ5ICYmICFfLmhhcyhsaXN0TW9kZWwsICdfZ3JvdXBJbmRleCcpKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgZ3JvdXBieSBpcyBlbmFibGVkLCBpdGVtIGNvbnRhaW5zIF9ncm91cEluZGV4IHByb3BlcnR5IHdoaWNoIHNob3VsZCBiZSBleGNsdWRlZCB3aGlsZSBjb21wYXJpbmcgbW9kZWwuXG4gICAgICAgICAgICAgICAgaXRlbU9iaiA9IF8uY2xvbmUoaXRlbU9iaik7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGl0ZW1PYmouX2dyb3VwSW5kZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXy5pc0VxdWFsKGl0ZW1PYmosIGxpc3RNb2RlbCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkgfHwgbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVNlbGVjdGVkSXRlbXNXaWRnZXRzKHN0YXRlUGVyc2lzdGVuY2VUcmlnZ2VyZWQ/KSB7XG4gICAgICAgIGxldCBvYmogPSB7fSwgd2lkZ2V0U3RhdGU7XG4gICAgICAgIGNvbnN0IHBhZ2VOdW0gPSBfLmdldCh0aGlzLmRhdGFOYXZpZ2F0b3IsICdkbi5jdXJyZW50UGFnZScpIHx8IDE7XG4gICAgICAgIGlmICh0aGlzLmdldENvbmZpZ3VyZWRTdGF0ZSgpICE9PSAnbm9uZScpIHtcbiAgICAgICAgICAgIC8vIHJlbW92ZSBwcmV2aW91c2x5IGNvbmZpZ3VyZWQgc2VsZWN0ZWQgaXRlbXMgZm9yIGN1cnJlbnQgcGFnZSBhbmQgY29uc3RydWN0IG5ldyBvbmVzIGxhdGVyIGJlbG93LlxuICAgICAgICAgICAgd2lkZ2V0U3RhdGUgPSB0aGlzLnN0YXRlUGVyc2lzdGVuY2UuZ2V0V2lkZ2V0U3RhdGUodGhpcykgfHwge307XG4gICAgICAgICAgICBpZiAoXy5nZXQod2lkZ2V0U3RhdGUsICdzZWxlY3RlZEl0ZW0nKSkge1xuICAgICAgICAgICAgICAgIC8vIHdoZW4gbXVsdGlzZWxlY3QgaXMgb24gYW5kIGFuIGl0ZW0gaXMgc2VsZWN0ZWQgd2l0aG91dCBwcmVzc2luZyBDVFJMLCBwcmV2aW91c2x5IHNlbGVjdGVkIGl0ZW1zIGluIHN0YXRlIHNob3VsZCBiZSBlbXB0eS5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tdWx0aXNlbGVjdCAmJiB0aGlzLnNlbGVjdGVkaXRlbS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgd2lkZ2V0U3RhdGUuc2VsZWN0ZWRJdGVtID0gW107XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgXy5yZW1vdmUod2lkZ2V0U3RhdGUuc2VsZWN0ZWRJdGVtLCBmdW5jdGlvbihzZWxlY3RlZEl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZEl0ZW0ucGFnZSA9PT0gcGFnZU51bTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm11bHRpc2VsZWN0KSB7XG4gICAgICAgICAgICAodGhpcy5zZWxlY3RlZEl0ZW1XaWRnZXRzIGFzIEFycmF5PFdpZGdldFJlZj4pLmxlbmd0aCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5saXN0SXRlbXMuZm9yRWFjaCgoaXRlbTogTGlzdEl0ZW1EaXJlY3RpdmUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAoaXRlbS5pc0FjdGl2ZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm11bHRpc2VsZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLnNlbGVjdGVkSXRlbVdpZGdldHMgYXMgQXJyYXk8V2lkZ2V0UmVmPikucHVzaChpdGVtLmN1cnJlbnRJdGVtV2lkZ2V0cyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1XaWRnZXRzID0gaXRlbS5jdXJyZW50SXRlbVdpZGdldHM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG9iaiA9IHtwYWdlOiBwYWdlTnVtLCBpbmRleDogaW5kZXh9O1xuICAgICAgICAgICAgICAgIGlmIChfLmdldCh3aWRnZXRTdGF0ZSwgJ3NlbGVjdGVkSXRlbScpICAmJiB0aGlzLm11bHRpc2VsZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghXy5zb21lKHdpZGdldFN0YXRlLnNlbGVjdGVkSXRlbSwgb2JqKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2lkZ2V0U3RhdGUuc2VsZWN0ZWRJdGVtLnB1c2gob2JqKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHdpZGdldFN0YXRlLnNlbGVjdGVkSXRlbSA9IFtvYmpdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0aGlzLmdldENvbmZpZ3VyZWRTdGF0ZSgpICE9PSAnbm9uZScgJiYgIXN0YXRlUGVyc2lzdGVuY2VUcmlnZ2VyZWQpIHtcbiAgICAgICAgICAgIGlmICh1bnN1cHBvcnRlZFN0YXRlUGVyc2lzdGVuY2VUeXBlcy5pbmRleE9mKHRoaXMubmF2aWdhdGlvbikgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZVBlcnNpc3RlbmNlLnJlbW92ZVdpZGdldFN0YXRlKHRoaXMsICdzZWxlY3RlZEl0ZW0nKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlUGVyc2lzdGVuY2Uuc2V0V2lkZ2V0U3RhdGUodGhpcywgeydzZWxlY3RlZEl0ZW0nOiB3aWRnZXRTdGF0ZS5zZWxlY3RlZEl0ZW19KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZXRhaW4gU3RhdGUgaGFuZGxpbmcgb24gV2lkZ2V0ICcgKyB0aGlzLm5hbWUgKyAnIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGN1cnJlbnQgcGFnaW5hdGlvbiB0eXBlLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VsZWN0cyB0aGUgbGlzdEl0ZW0gYW5kIHVwZGF0ZXMgc2VsZWN0ZWRpdGVtIHByb3BlcnR5LlxuICAgICAqIElmIHRoZSBsaXN0SXRlbSBpcyBhbHJlYWR5IGEgc2VsZWN0ZWQgaXRlbSB0aGVuIGRlc2VsZWN0cyB0aGUgaXRlbS5cbiAgICAgKiBAcGFyYW0ge0xpc3RJdGVtRGlyZWN0aXZlfSAkbGlzdEl0ZW06IEl0ZW0gdG8gYmUgc2VsZWN0ZWQgb2YgZGVzZWxlY3RlZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHRvZ2dsZUxpc3RJdGVtU2VsZWN0aW9uKCRsaXN0SXRlbTogTGlzdEl0ZW1EaXJlY3RpdmUsIHN0YXRlUGVyc2lzdGVuY2VUcmlnZ2VyZWQ/KSB7XG4gICAgICAgIC8vIGl0ZW0gaXMgbm90IGFsbG93ZWQgdG8gZ2V0IHNlbGVjdGVkIGlmIGl0IGlzIGRpc2FibGVkLlxuICAgICAgICBpZiAoJGxpc3RJdGVtICYmICEkbGlzdEl0ZW0uZGlzYWJsZUl0ZW0pIHtcbiAgICAgICAgICAgIGxldCBpdGVtID0gJGxpc3RJdGVtLml0ZW07XG4gICAgICAgICAgICBpZiAodGhpcy5ncm91cGJ5ICYmIF8uaGFzKGl0ZW0sICdfZ3JvdXBJbmRleCcpKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgZ3JvdXBieSBpcyBlbmFibGVkLCBpdGVtIGNvbnRhaW5zIF9ncm91cEluZGV4IHByb3BlcnR5IHdoaWNoIHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIHNlbGVjdGVkaXRlbS5cbiAgICAgICAgICAgICAgICBpdGVtID0gXy5jbG9uZShpdGVtKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgaXRlbS5fZ3JvdXBJbmRleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgkbGlzdEl0ZW0uaXNBY3RpdmUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9pdGVtcyA9IF8ucHVsbEFsbFdpdGgodGhpcy5faXRlbXMsIFtpdGVtXSwgXy5pc0VxdWFsKTtcbiAgICAgICAgICAgICAgICAkbGlzdEl0ZW0uaXNBY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgbXVsdGlzZWxlY3QgaXMgZmFsc2UsIGNsZWFyIHRoZSBzZWxlY3RJdGVtIGxpc3QgYmVmb3JlIGFkZGluZyBhbiBpdGVtIHRvIHRoZSBzZWxlY3RJdGVtIGxpc3QuXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm11bHRpc2VsZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJTZWxlY3RlZEl0ZW1zKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2l0ZW1zLnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdzZWxlY3QnLCB7d2lkZ2V0OiAkbGlzdEl0ZW0sICRkYXRhOiBpdGVtfSk7XG4gICAgICAgICAgICAgICAgJGxpc3RJdGVtLmlzQWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRJdGVtc1dpZGdldHMoc3RhdGVQZXJzaXN0ZW5jZVRyaWdnZXJlZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNZXRob2QgaXMgSW52b2tlZCB3aGVuIHRoZSBtb2RlbCBmb3IgdGhlIExpc3QgV2lkZ2V0IGlzIGNoYW5nZWQuXG4gICAgICogQHBhcmFtIHtRdWVyeUxpc3Q8TGlzdEl0ZW1EaXJlY3RpdmU+fSBsaXN0SXRlbXNcbiAgICAgKi9cbiAgICBwcml2YXRlIG9uTGlzdFJlbmRlcihsaXN0SXRlbXM6IFF1ZXJ5TGlzdDxMaXN0SXRlbURpcmVjdGl2ZT4pIHtcbiAgICAgICAgLy8gQWRkZWQgcmVuZGVyIGNhbGxiYWNrIGV2ZW50LiBUaGlzIG1ldGhvZChvbkxpc3RSZW5kZXIpIGlzIGNhbGxpbmcgbXVsdGlwbGUgdGltZXMgc28gY2hlY2tpbmcgaXNEYXRhY2hhbmdlZCBmbGFnIGJlY2F1c2UgdGhpcyBmYWxnIGlzIGNoYW5nZWQgd2hlbmV2ZXIgbmV3IGRhdGEgaXMgcmVuZGVyZWQuXG4gICAgICAgIGlmICh0aGlzLmlzRGF0YUNoYW5nZWQpIHtcbiAgICAgICAgICAgIC8vIFdoZW5ldmVyIGRhdGFzZXQgaXMgY2hhbmdlZCwgdHJpZ2dlciB3YXRjaGVycyB0byBldmFsdWF0ZSBsaXN0aXRlbSBiaW5kIGV4cHJlc3Npb25zLlxuICAgICAgICAgICAgJGludm9rZVdhdGNoZXJzKHRydWUpO1xuICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdyZW5kZXInLCB7JGRhdGE6IHRoaXMuZmllbGREZWZzfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNEYXRhQ2hhbmdlZCAmJiB0aGlzLmdldENvbmZpZ3VyZWRTdGF0ZSgpICE9PSAnbm9uZScgJiYgbGlzdEl0ZW1zLmxlbmd0aCAmJiB0aGlzLl9zZWxlY3RlZEl0ZW1zRXhpc3QpIHtcbiAgICAgICAgICAgIGNvbnN0IHdpZGdldFN0YXRlID0gdGhpcy5zdGF0ZVBlcnNpc3RlbmNlLmdldFdpZGdldFN0YXRlKHRoaXMpO1xuICAgICAgICAgICAgaWYgKF8uZ2V0KHdpZGdldFN0YXRlLCAnc2VsZWN0ZWRJdGVtJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZEl0ZW1zRXhpc3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZW1zTGVuZ3RoID0gXy5pc0FycmF5KHRoaXMuc2VsZWN0ZWRpdGVtKSA/IHRoaXMuc2VsZWN0ZWRpdGVtLmxlbmd0aCA6IF8udG9OdW1iZXIoIV8uaXNFbXB0eSh0aGlzLnNlbGVjdGVkaXRlbSkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQYWdlID0gXy5nZXQodGhpcy5kYXRhTmF2aWdhdG9yLCAnZG4uY3VycmVudFBhZ2UnKSB8fCAxO1xuICAgICAgICAgICAgICAgIHdpZGdldFN0YXRlLnBhZ2luYXRpb24gPSB3aWRnZXRTdGF0ZS5wYWdpbmF0aW9uIHx8IDE7XG4gICAgICAgICAgICAgICAgLy8gdG8gcHJldmVudCBpdGVtIHNlbGVjdGlvbiBmcm9tIGJlaW5nIHRyaWdnZXJlZCBtb3JlIHRoYW4gb25jZVxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZEl0ZW1zTGVuZ3RoICE9PSB3aWRnZXRTdGF0ZS5zZWxlY3RlZEl0ZW0ubGVuZ3RoICYmIHdpZGdldFN0YXRlLnBhZ2luYXRpb24gPT09IGN1cnJlbnRQYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIHdpZGdldFN0YXRlLnNlbGVjdGVkSXRlbS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5wYWdlID09PSBjdXJyZW50UGFnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbShpdGVtLmluZGV4LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbXMgPSBfLmlzQXJyYXkodGhpcy5zZWxlY3RlZGl0ZW0pID8gdGhpcy5zZWxlY3RlZGl0ZW0gOiBbdGhpcy5zZWxlY3RlZGl0ZW1dO1xuXG4gICAgICAgIHRoaXMuZmlyc3RTZWxlY3RlZEl0ZW0gPSB0aGlzLmxhc3RTZWxlY3RlZEl0ZW0gPSBudWxsO1xuXG4gICAgICAgIC8vIGRvbid0IHNlbGVjdCBmaXJzdCBpdGVtIGlmIG11bHRpLXNlbGVjdCBpcyBlbmFibGVkIGFuZCBhdCBsZWFzdCBpdGVtIGlzIGFscmVhZHkgc2VsZWN0ZWQgaW4gdGhlIGxpc3QuXG4gICAgICAgIC8vIGRvbid0IHNlbGVjdCBmaXJzdCBpdGVtIGlmIHN0YXRlIGluZm9ybWF0aW9uIGhhcyBzZWxlY3RlZCBpdGVtc1xuICAgICAgICBpZiAobGlzdEl0ZW1zLmxlbmd0aCAmJiB0aGlzLnNlbGVjdGZpcnN0aXRlbSAmJiAhKCB0aGlzLl9pdGVtcy5sZW5ndGggJiYgdGhpcy5tdWx0aXNlbGVjdCkgJiYgdGhpcy5fc2VsZWN0ZWRJdGVtc0V4aXN0ICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgY29uc3QgJGZpcnN0SXRlbTogTGlzdEl0ZW1EaXJlY3RpdmUgPSBsaXN0SXRlbXMuZmlyc3Q7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAhJGZpcnN0SXRlbS5kaXNhYmxlSXRlbSAmJlxuICAgICAgICAgICAgICAgIHRoaXMuaXNEYXRhQ2hhbmdlZCAmJlxuICAgICAgICAgICAgICAgIC8vIFwiaW5maW5pdGUgc2Nyb2xsXCIgb3IgXCJsb2FkIG9uIGRlbWFuZFwiIGlzIGVuYWJsZWQgYW5kIGF0IGxlYXN0IG9uZSBpdGVtIGlzIHNlbGVjdGVkIHRoZW4gZG9udCBhbHRlciB0aGUgc2VsZWN0ZWQgbGlzdCBpdGVtcy5cbiAgICAgICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAgICAgICAodGhpcy5pbmZTY3JvbGwgfHwgdGhpcy5vbkRlbWFuZExvYWQpICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2l0ZW1zLmxlbmd0aFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJTZWxlY3RlZEl0ZW1zKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJzdFNlbGVjdGVkSXRlbSA9IHRoaXMubGFzdFNlbGVjdGVkSXRlbSA9ICRmaXJzdEl0ZW07XG4gICAgICAgICAgICAgICAgLy8gc2VsZWN0aW5nIHRoZSBmaXJzdCByZWNvcmRcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEl0ZW0oMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRlc2VsZWN0TGlzdEl0ZW1zKCk7XG4gICAgICAgICAgICBzZWxlY3RlZEl0ZW1zLmZvckVhY2goc2VsZWN0ZWRpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaXN0SXRlbTogTGlzdEl0ZW1EaXJlY3RpdmUgPSB0aGlzLmdldExpc3RJdGVtQnlNb2RlbChzZWxlY3RlZGl0ZW0pO1xuICAgICAgICAgICAgICAgIGlmIChsaXN0SXRlbSkge1xuICAgICAgICAgICAgICAgICAgICBsaXN0SXRlbS5pc0FjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkSXRlbSA9IGxpc3RJdGVtO1xuICAgICAgICAgICAgICAgICAgICAvLyBmb2N1cyB0aGUgYWN0aXZlIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgbGlzdEl0ZW0ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZmllbGREZWZzLmxlbmd0aCAmJiB0aGlzLmluZlNjcm9sbCkge1xuICAgICAgICAgICAgY29uc3Qgc21vb3RoU2Nyb2xsRWwgPSB0aGlzLiRlbGVtZW50LmNsb3Nlc3QoJ1t3bXNtb290aHNjcm9sbF0nKTtcbiAgICAgICAgICAgIC8vIGlmIHNtb290aHNjcm9sbCBpcyBzZXQgdG8gZmFsc2UsIHRoZW4gbmF0aXZlIHNjcm9sbCBoYXMgdG8gYmUgYXBwbGllZFxuICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIHNtb290aHNjcm9sbCBldmVudHMgd2lsbCBiZSBiaW5kZWQuXG4gICAgICAgICAgICBpZiAoaXNNb2JpbGVBcHAoKSAmJiBzbW9vdGhTY3JvbGxFbC5sZW5ndGggJiYgc21vb3RoU2Nyb2xsRWwuYXR0cignd21zbW9vdGhzY3JvbGwnKSA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS5iaW5kSVNjcm9sbEV2dCh0aGlzLCBERUJPVU5DRV9USU1FUy5QQUdJTkFUSU9OX0RFQk9VTkNFX1RJTUUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIG9mIG1vYmlsZSBhcHAgd2hlbiBtb2RhbCBleGlzdHMsIGFuZCBsaXN0IGl0ZW1zIGhlaWdodCBpcyBncmVhdGVyIHRoYW4gdGhlIG1vZGFsIGNvbnRlbnQgcHJvdmlkZSBjY29udGFpbmVyIGEgc2Nyb2xsYWJsZSBoZWlnaHRcbiAgICAgICAgICAgICAgICBjb25zdCBtb2RhbEJvZHkgPSB0aGlzLiRlbGVtZW50LmNsb3Nlc3QoJy5tb2RhbC1ib2R5Jyk7XG4gICAgICAgICAgICAgICAgY29uc3QgbGlzdEh0ID0gdGhpcy4kZWxlbWVudC5maW5kKCd1bCcpLmhlaWdodCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1vZGFsSHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSAxNDA7XG4gICAgICAgICAgICAgICAgaWYgKGlzTW9iaWxlKCkgJiYgbW9kYWxCb2R5Lmxlbmd0aCAmJiBsaXN0SHQgPiBtb2RhbEh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJGVsZW1lbnQuY3NzKCdoZWlnaHQnLCBtb2RhbEh0ICsgJ3B4Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2UuYmluZFNjcm9sbEV2dCh0aGlzLCAnPiB1bCcsIERFQk9VTkNFX1RJTUVTLlBBR0lOQVRJT05fREVCT1VOQ0VfVElNRSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlzRGF0YUNoYW5nZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdHJpZ2dlckxpc3RJdGVtU2VsZWN0aW9uKCRlbDogSlF1ZXJ5PEhUTUxFbGVtZW50PiwgJGV2ZW50OiBFdmVudCkge1xuICAgICAgICBpZiAoJGVsICYmICRlbFswXSkge1xuICAgICAgICAgICAgY29uc3QgbGlzdEl0ZW1Db250ZXh0ID0gJGVsLmRhdGEoJ2xpc3RJdGVtQ29udGV4dCcpO1xuICAgICAgICAgICAgLy8gVHJpZ2dlciBjbGljayBldmVudCBvbmx5IGlmIHRoZSBsaXN0IGl0ZW0gaXMgZnJvbSB0aGUgY29ycmVzcG9uZGluZyBsaXN0LlxuICAgICAgICAgICAgaWYgKGxpc3RJdGVtQ29udGV4dC5saXN0Q29tcG9uZW50ID09PSB0aGlzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkl0ZW1DbGljaygkZXZlbnQsIGxpc3RJdGVtQ29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwSGFuZGxlcnMoKSB7XG4gICAgICAgIHRoaXMubGlzdEl0ZW1zLmNoYW5nZXMuc3Vic2NyaWJlKCBsaXN0SXRlbXMgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkxpc3RSZW5kZXIobGlzdEl0ZW1zKTtcbiAgICAgICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gaGFuZGxlIGNsaWNrIGV2ZW50IGluIGNhcHR1cmluZyBwaGFzZS5cbiAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3VsLmFwcC1saXZlbGlzdC1jb250YWluZXInKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgkZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSAkKCRldmVudC50YXJnZXQpLmNsb3Nlc3QoJy5hcHAtbGlzdC1pdGVtJyk7XG4gICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBmaW5kIHRoZSBjdXJyZW50IGxpc3QgaXRlbVxuICAgICAgICAgICAgd2hpbGUgKHRhcmdldC5nZXQoMCkgJiYgKHRhcmdldC5jbG9zZXN0KCd1bC5hcHAtbGl2ZWxpc3QtY29udGFpbmVyJykuZ2V0KDApICE9PSAkZXZlbnQuY3VycmVudFRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50KCkuY2xvc2VzdCgnLmFwcC1saXN0LWl0ZW0nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudHJpZ2dlckxpc3RJdGVtU2VsZWN0aW9uKHRhcmdldCwgJGV2ZW50KTtcbiAgICAgICAgfSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLy8gVHJpZ2dlcnMgb24gZHJhZyBzdGFydCB3aGlsZSByZW9yZGVyaW5nLlxuICAgIHByaXZhdGUgb25SZW9yZGVyU3RhcnQoZXZ0LCB1aSkge1xuICAgICAgICB1aS5wbGFjZWhvbGRlci5oZWlnaHQodWkuaXRlbS5oZWlnaHQoKSk7XG4gICAgICAgIHRoaXMuJHVsRWxlLmRhdGEoJ29sZEluZGV4JywgdWkuaXRlbS5pbmRleCgpKTtcbiAgICB9XG5cbiAgICAvLyBUcmlnZ2VycyBkdXJpbmcgc29ydGluZ1xuICAgIHByaXZhdGUgb25Tb3J0KGV2dCwgdWkpIHtcbiAgICAgICAgLy8gSW4gY2FzZSBvZiBpbmZpbml0ZSBzY3JvbGwsIHdoZW4gdGhlIGVsZW1lbnQgZG9lc24ndCBoYXZlIHNjcm9sbCBlbmFibGVkXG4gICAgICAgIC8vIG9uIGRyYWdnaW5nIHRoZSBlbGVtZW50IHRvIGxhc3QgaXRlbSdzIHBvc2l0aW9uIG1hbnVhbGx5IHRyaWdnZXIgbG9hZGluZyBvZiBuZXh0IGl0ZW1zXG4gICAgICAgIGlmICh0aGlzLmluZlNjcm9sbCkge1xuICAgICAgICAgICAgY29uc3QgbGFzdEl0ZW1PZmZzZXQgPSB0aGlzLiR1bEVsZS5maW5kKGBbbGlzdGl0ZW1pbmRleD0ke3RoaXMuZmllbGREZWZzLmxlbmd0aCAtIDF9XWApLm9mZnNldCgpO1xuICAgICAgICAgICAgaWYgKGxhc3RJdGVtT2Zmc2V0ICYmIGxhc3RJdGVtT2Zmc2V0LnRvcCA8IHVpLm9mZnNldC50b3ApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLmJpbmRTY3JvbGxFdnQodGhpcywgJz4gdWwnLCBERUJPVU5DRV9USU1FUy5QQUdJTkFUSU9OX0RFQk9VTkNFX1RJTUUpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVib3VuY2VkRmV0Y2hOZXh0RGF0YXNldE9uU2Nyb2xsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIC8vIFRyaWdnZXJzIGFmdGVyIHRoZSBzb3J0aW5nLlxuICAgIHByaXZhdGUgb25VcGRhdGUoZXZ0LCB1aSwgcHJlc2VudEluZGV4Pykge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5maWVsZERlZnM7XG4gICAgICAgIC8vIElmIHVpIGlzIG5vdCBwcmVzZW50IHRoZW4gaXQgaXMgY2FsbGVkIGZyb20gZHJhZyBhbmQgZHJvcCB1c2luZyBrZXlib2FyZFxuICAgICAgICBjb25zdCBuZXdJbmRleCA9IHVpID09PSB1bmRlZmluZWQgPyBwcmVzZW50SW5kZXggOiB1aS5pdGVtLmluZGV4KCk7XG4gICAgICAgIGNvbnN0IG9sZEluZGV4ID0gdGhpcy4kdWxFbGUuZGF0YSgnb2xkSW5kZXgnKTtcblxuICAgICAgICBjb25zdCBtaW5JbmRleCA9IF8ubWluKFtuZXdJbmRleCwgb2xkSW5kZXhdKTtcbiAgICAgICAgY29uc3QgbWF4SW5kZXggPSBfLm1heChbbmV3SW5kZXgsIG9sZEluZGV4XSk7XG5cbiAgICAgICAgY29uc3QgZHJhZ2dlZEl0ZW0gPSBfLnB1bGxBdChkYXRhLCBvbGRJbmRleClbMF07XG4gICAgICAgIC8vIE1vZGlmeSB0aGUgZGF0YSBsaXN0IG9ubHkgaWYgd2UgZmluZCBhIGRyYWdnZWRJdGVtXG4gICAgICAgIGlmIChkcmFnZ2VkSXRlbSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZ2V0Q29uZmlndXJlZFN0YXRlKCkgIT09ICdub25lJykge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGVQZXJzaXN0ZW5jZS5yZW1vdmVXaWRnZXRTdGF0ZSh0aGlzLCAnc2VsZWN0ZWRJdGVtJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMucmVvcmRlclByb3BzLm1pbkluZGV4ID0gXy5taW4oW21pbkluZGV4LCB0aGlzLnJlb3JkZXJQcm9wcy5taW5JbmRleF0pO1xuICAgICAgICAgICAgdGhpcy5yZW9yZGVyUHJvcHMubWF4SW5kZXggPSBfLm1heChbbWF4SW5kZXgsIHRoaXMucmVvcmRlclByb3BzLm1heEluZGV4XSk7XG5cbiAgICAgICAgICAgIGRhdGEuc3BsaWNlKG5ld0luZGV4LCAwLCBkcmFnZ2VkSXRlbSk7XG5cbiAgICAgICAgICAgIHRoaXMuY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIGNvbnN0ICRjaGFuZ2VkSXRlbSA9IHtcbiAgICAgICAgICAgICAgICBvbGRJbmRleDogb2xkSW5kZXgsXG4gICAgICAgICAgICAgICAgbmV3SW5kZXg6IG5ld0luZGV4LFxuICAgICAgICAgICAgICAgIGl0ZW06IGRhdGFbbmV3SW5kZXhdXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdyZW9yZGVyJywgeyRldmVudDogZXZ0LCAkZGF0YTogZGF0YSwgJGNoYW5nZWRJdGVtfSk7XG4gICAgICAgICAgICB0aGlzLiR1bEVsZS5yZW1vdmVEYXRhKCdvbGRJbmRleCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gY29uZmlndXJlcyByZW9yZGVyaW5nIHRoZSBsaXN0IGl0ZW1zLlxuICAgIHByaXZhdGUgY29uZmlndXJlRG5EKCkge1xuICAgICAgICBsZXQgYXBwZW5kVG87XG4gICAgICAgIGNvbnN0IG1vZGFsRWwgPSAkKGRvY3VtZW50KS5maW5kKCcubW9kYWwnKTtcbiAgICAgICAgaWYgKHRoaXMuZ2V0QXR0cignaGVpZ2h0JykpIHsgLy8gd2hlbiBoZWlnaHQgaXMgYXBwbGllZCB0byB0aGUgbGlzdCwgYXBwZW5kIHNob3VsZCBiZSB0aGUgdWwncyBwYXJlbnQgYXMgc2Nyb2xsIGlzIGFwcGxpZWQgdG8gdGhlIHBhcmVudFxuICAgICAgICAgIGFwcGVuZFRvID0gJ3BhcmVudCc7XG4gICAgICAgIH0gZWxzZSBpZiAobW9kYWxFbC5sZW5ndGgpIHsgLy8gSW4gY2FzZSBvZiBkaWFsb2csIGFwcGVuZFRvIHNob3VsZCBiZSB0aGUgbW9kYWwgZWxlXG4gICAgICAgICAgICBhcHBlbmRUbyA9IG1vZGFsRWxbbW9kYWxFbC5sZW5ndGggLSAxXTtcbiAgICAgICAgfSBlbHNlIHsgLy8gQXMgZGVmYXVsdCBhcHBlbmQgdG8gc2hvdWxkIGJlIGJvZHlcbiAgICAgICAgICAgIGFwcGVuZFRvID0gJ2JvZHknO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGlzTW9iaWxlQXBwKCkgPyB7fSA6IHtcbiAgICAgICAgICAgIGFwcGVuZFRvOiBhcHBlbmRUbyxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCAkZWwgPSAkKHRoaXMubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIHRoaXMuJHVsRWxlID0gJGVsLmZpbmQoJy5hcHAtbGl2ZWxpc3QtY29udGFpbmVyJyk7XG5cbiAgICAgICAgY29uZmlndXJlRG5EKHRoaXMuJHVsRWxlLCBvcHRpb25zLCB0aGlzLm9uUmVvcmRlclN0YXJ0LmJpbmQodGhpcyksIHRoaXMub25VcGRhdGUuYmluZCh0aGlzKSwgdGhpcy5vblNvcnQuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgdGhpcy4kdWxFbGUuZHJvcHBhYmxlKHsnYWNjZXB0JzogJy5hcHAtbGlzdC1pdGVtJ30pO1xuXG4gICAgICAgIGlmIChpc01vYmlsZUFwcCgpKSB7XG4gICAgICAgICAgICB0aGlzLiR1bEVsZS5zb3J0YWJsZSgnZGlzYWJsZScpO1xuICAgICAgICAgICAgdGhpcy4kdWxFbGUub24oJ3RvdWNoc3RhcnQnLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgICAgIGxldCBzZWxmID0gdGhpcztcbiAgICAgICAgICAgICAgICBpZiAoIXNlbGYudG91Y2hpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYudG91Y2hlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHNlbGYudG91Y2hlZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL1ByZXZlbnQgY29udGV4dCBtZW51IG9uIG1vYmlsZSAoSU9TL0FORFJPSUQpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuY2FuY2VsYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sIDUwKTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi50b3VjaGVkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpLmFkZENsYXNzKCduby1zZWxlY3Rpb24nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vRW5hYmxlIGRyYWdnYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgJChldmVudC5jdXJyZW50VGFyZ2V0KS5zb3J0YWJsZSgnZW5hYmxlJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vU2V0IGludGVybmFsIGZsYWdcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudG91Y2hpbmcgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL3RyaWdnZXIgdG91Y2hzdGFydCBhZ2FpbiB0byBlbmFibGUgZHJhZ2dhYmxlIHRocm91Z2ggdG91Y2ggcHVuY2hcbiAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZikudHJpZ2dlcihldmVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vQ2hvb3NlIHByZWZlcnJlZCBkdXJhdGlvbiBmb3IgdGFwaG9sZFxuICAgICAgICAgICAgICAgICAgICB9LCAzNTApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLm9uKCd0b3VjaGVuZCcsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91Y2hpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpLnJlbW92ZUNsYXNzKCduby1zZWxlY3Rpb24nKTtcblxuICAgICAgICAgICAgICAgIC8vRGlzYWJsZSBkcmFnZ2FibGUgdG8gZW5hYmxlIGRlZmF1bHQgYmVoYXZpb3VyXG4gICAgICAgICAgICAgICAgJChldmVudC5jdXJyZW50VGFyZ2V0KS5zb3J0YWJsZSgnZGlzYWJsZScpO1xuXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudG91Y2hlZCk7XG4gICAgICAgICAgICB9KS5vbigndG91Y2htb3ZlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRvdWNoZWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIC8vIHJldHVybnMgdHJ1ZSBpZiB0aGUgc2VsZWN0aW9uIGxpbWl0IGlzIHJlYWNoZWQuXG4gICAgcHJpdmF0ZSBjaGVja1NlbGVjdGlvbkxpbWl0KGNvdW50OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuICghdGhpcy5zZWxlY3Rpb25saW1pdCB8fCBjb3VudCA8IHRoaXMuc2VsZWN0aW9ubGltaXQpO1xuICAgIH1cblxuICAgIC8vIHJldHVybnMgbGlzdGl0ZW0gcmVmZXJlbmNlIGJ5IGluZGV4IHZhbHVlLlxuICAgIHByaXZhdGUgZ2V0TGlzdEl0ZW1CeUluZGV4KGluZGV4OiBudW1iZXIpOiBMaXN0SXRlbURpcmVjdGl2ZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpc3RJdGVtcy50b0FycmF5KClbaW5kZXhdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybiBpbmRleCBvZiBhbiAobGlzdEl0ZW1EaXJlY3RpdmUpIGluIHRoZSBsaXN0SXRlbVxuICAgICAqIEBwYXJhbSB7TGlzdEl0ZW1EaXJlY3RpdmV9IGl0ZW1cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0TGlzdEl0ZW1JbmRleChpdGVtOiBMaXN0SXRlbURpcmVjdGl2ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5saXN0SXRlbXMudG9BcnJheSgpLmluZGV4T2YoaXRlbSk7XG4gICAgfVxuXG4gICAgLy8gdGhpcyBtZXRob2QgaXMgY2FsbGVkIGZvcm0gb3RoZXIgZGF0YSB3aWRnZXRzIGxpa2UgdGFibGUuXG4gICAgcHVibGljIGV4ZWN1dGUob3BlcmF0aW9uLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChbRGF0YVNvdXJjZS5PcGVyYXRpb24uSVNfQVBJX0FXQVJFLCBEYXRhU291cmNlLk9wZXJhdGlvbi5JU19QQUdFQUJMRSwgRGF0YVNvdXJjZS5PcGVyYXRpb24uU1VQUE9SVFNfU0VSVkVSX0ZJTFRFUl0uaW5jbHVkZXMob3BlcmF0aW9uKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFzb3VyY2UuZXhlY3V0ZShvcGVyYXRpb24sIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYW5kbGVLZXlEb3duKCRldmVudCwgYWN0aW9uOiBzdHJpbmcpIHtcbiAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZigkZXZlbnQua2V5Q29kZSAhPT0gMTMgJiYgJGV2ZW50LmtleUNvZGUgIT09IDkgJiYgISgoJGV2ZW50LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2Zvcm0tY29udHJvbCcpIHx8ICRldmVudC50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdub3RlLWVkaXRhYmxlJykpICYmICRldmVudC5rZXlDb2RlID09PSAzMikgKSB7XG4gICAgICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxpc3RJdGVtczogUXVlcnlMaXN0PExpc3RJdGVtRGlyZWN0aXZlPiA9IHRoaXMubGlzdEl0ZW1zO1xuXG4gICAgICAgIGxldCBwcmVzZW50SW5kZXg6IG51bWJlciA9IHRoaXMuZ2V0TGlzdEl0ZW1JbmRleCh0aGlzLmxhc3RTZWxlY3RlZEl0ZW0pO1xuXG4gICAgICAgIGlmICh0aGlzLm11bHRpc2VsZWN0KSB7XG4gICAgICAgICAgICBjb25zdCBmaXJzdEluZGV4OiBudW1iZXIgPSB0aGlzLmdldExpc3RJdGVtSW5kZXgodGhpcy5maXJzdFNlbGVjdGVkSXRlbSk7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RDb3VudDogbnVtYmVyID0gXy5pc0FycmF5KHRoaXMuc2VsZWN0ZWRpdGVtKSA/IHRoaXMuc2VsZWN0ZWRpdGVtLmxlbmd0aCA6IChfLmlzT2JqZWN0KHRoaXMuc2VsZWN0ZWRpdGVtKSA/IDEgOiAwKTtcbiAgICAgICAgICAgIGlmIChhY3Rpb24gPT09ICdzZWxlY3RQcmV2Jykge1xuICAgICAgICAgICAgICAgIGlmIChwcmVzZW50SW5kZXggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgocHJlc2VudEluZGV4IDw9IGZpcnN0SW5kZXgpICYmIHRoaXMuY2hlY2tTZWxlY3Rpb25MaW1pdChzZWxlY3RDb3VudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkSXRlbSA9IHRoaXMuZ2V0TGlzdEl0ZW1CeUluZGV4KCBwcmVzZW50SW5kZXggLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlTGlzdEl0ZW1TZWxlY3Rpb24odGhpcy5sYXN0U2VsZWN0ZWRJdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcmVzZW50SW5kZXggPiBmaXJzdEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZUxpc3RJdGVtU2VsZWN0aW9uKHRoaXMuZ2V0TGlzdEl0ZW1CeUluZGV4KHByZXNlbnRJbmRleCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWRJdGVtID0gdGhpcy5nZXRMaXN0SXRlbUJ5SW5kZXgocHJlc2VudEluZGV4IC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ3NlbGVjdGlvbmxpbWl0ZXhjZWVkJywgeyRldmVudH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT09ICdzZWxlY3ROZXh0Jykge1xuICAgICAgICAgICAgICAgIGlmIChwcmVzZW50SW5kZXggPCBsaXN0SXRlbXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKHByZXNlbnRJbmRleCA+PSBmaXJzdEluZGV4KSAmJiB0aGlzLmNoZWNrU2VsZWN0aW9uTGltaXQoc2VsZWN0Q291bnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZEl0ZW0gPSB0aGlzLmdldExpc3RJdGVtQnlJbmRleChwcmVzZW50SW5kZXggKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlTGlzdEl0ZW1TZWxlY3Rpb24odGhpcy5sYXN0U2VsZWN0ZWRJdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcmVzZW50SW5kZXggPCBmaXJzdEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZUxpc3RJdGVtU2VsZWN0aW9uKHRoaXMuZ2V0TGlzdEl0ZW1CeUluZGV4KHByZXNlbnRJbmRleCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWRJdGVtID0gdGhpcy5nZXRMaXN0SXRlbUJ5SW5kZXgocHJlc2VudEluZGV4ICsgMSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ3NlbGVjdGlvbmxpbWl0ZXhjZWVkJywgeyRldmVudH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChhY3Rpb24gPT09ICdmb2N1c1ByZXYnKSB7XG4gICAgICAgICAgICBpZih0aGlzLmlzTGlzdEVsZW1lbnRNb3ZhYmxlKSB7XG4gICAgICAgICAgICAgICAgcHJlc2VudEluZGV4ID0gcHJlc2VudEluZGV4IDw9IDAgPyAwIDogKHByZXNlbnRJbmRleCk7XG4gICAgICAgICAgICAgICAgaWYocHJlc2VudEluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZEl0ZW0gPSB0aGlzLmdldExpc3RJdGVtQnlJbmRleChwcmVzZW50SW5kZXgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZFbHQgPSB0aGlzLmdldExpc3RJdGVtQnlJbmRleChwcmVzZW50SW5kZXggLSAxKTtcbiAgICAgICAgICAgICAgICBwcmV2RWx0Lm5hdGl2ZUVsZW1lbnQuYmVmb3JlKHRoaXMubGFzdFNlbGVjdGVkSXRlbS5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZEl0ZW0ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGVQZXJzaXN0ZW5jZS5yZW1vdmVXaWRnZXRTdGF0ZSh0aGlzLCAnc2VsZWN0ZWRJdGVtJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgYXJyID0gdGhpcy5saXN0SXRlbXMudG9BcnJheSgpO1xuICAgICAgICAgICAgICAgIFthcnJbcHJlc2VudEluZGV4IC0gMV0sIGFycltwcmVzZW50SW5kZXhdXSA9IFthcnJbcHJlc2VudEluZGV4XSwgYXJyW3ByZXNlbnRJbmRleCAtIDFdXTtcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RJdGVtcy5yZXNldChhcnIpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEluZGV4ID0gcHJlc2VudEluZGV4O1xuICAgICAgICAgICAgICAgIHRoaXMuYXJpYVRleHQgPSBcInNlbGVjdGVkIFwiO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwcmVzZW50SW5kZXggPSBwcmVzZW50SW5kZXggPD0gMCA/IDAgOiAocHJlc2VudEluZGV4IC0gMSk7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWRJdGVtID0gdGhpcy5nZXRMaXN0SXRlbUJ5SW5kZXgocHJlc2VudEluZGV4KTtcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZEl0ZW0ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEluZGV4ID0gcHJlc2VudEluZGV4ICsgMTtcbiAgICAgICAgICAgICAgICB0aGlzLmFyaWFUZXh0ID0gXCJzZWxlY3RlZCBcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT09ICdmb2N1c05leHQnKSB7XG4gICAgICAgICAgICBpZih0aGlzLmlzTGlzdEVsZW1lbnRNb3ZhYmxlKSB7XG4gICAgICAgICAgICAgICAgcHJlc2VudEluZGV4ID0gcHJlc2VudEluZGV4IDwgKGxpc3RJdGVtcy5sZW5ndGggLSAxKSA/IChwcmVzZW50SW5kZXgpIDogKGxpc3RJdGVtcy5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICBpZihwcmVzZW50SW5kZXggPT09IHRoaXMubGlzdEl0ZW1zLmxlbmd0aCAtIDEgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZEl0ZW0gPSB0aGlzLmdldExpc3RJdGVtQnlJbmRleChwcmVzZW50SW5kZXgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5leHRFbHQgPSB0aGlzLmdldExpc3RJdGVtQnlJbmRleChwcmVzZW50SW5kZXggKyAxKTtcbiAgICAgICAgICAgICAgICBuZXh0RWx0Lm5hdGl2ZUVsZW1lbnQuYWZ0ZXIodGhpcy5sYXN0U2VsZWN0ZWRJdGVtLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkSXRlbS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZVBlcnNpc3RlbmNlLnJlbW92ZVdpZGdldFN0YXRlKHRoaXMsICdzZWxlY3RlZEl0ZW0nKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhcnIgPSB0aGlzLmxpc3RJdGVtcy50b0FycmF5KCk7XG4gICAgICAgICAgICAgICAgW2FycltwcmVzZW50SW5kZXhdLCBhcnJbcHJlc2VudEluZGV4ICsgMV1dID0gW2FycltwcmVzZW50SW5kZXggKyAxXSwgYXJyW3ByZXNlbnRJbmRleF1dO1xuICAgICAgICAgICAgICAgIHRoaXMubGlzdEl0ZW1zLnJlc2V0KGFycik7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSBwcmVzZW50SW5kZXggKyAyO1xuICAgICAgICAgICAgICAgIHRoaXMuYXJpYVRleHQgPSBcInNlbGVjdGVkIFwiO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwcmVzZW50SW5kZXggPSBwcmVzZW50SW5kZXggPCAobGlzdEl0ZW1zLmxlbmd0aCAtIDEpID8gKHByZXNlbnRJbmRleCArIDEpIDogKGxpc3RJdGVtcy5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZEl0ZW0gPSB0aGlzLmdldExpc3RJdGVtQnlJbmRleChwcmVzZW50SW5kZXgpO1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkSXRlbS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSBwcmVzZW50SW5kZXggKyAxO1xuICAgICAgICAgICAgICAgIHRoaXMuYXJpYVRleHQgPSBcInNlbGVjdGVkIFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gJ3NlbGVjdCcpIHtcbiAgICAgICAgICAgIC8vIGlmIHRoZSBlbnRlciBjbGljayBpcyBwcmVzc2VkIG9uIHRoZSBpdGVtIHdoaWNoIGlzIG5vdCB0aGUgbGFzdCBzZWxlY3RlZCBpdGVtLCB0aGUgZmluZCB0aGUgaXRlbSBmcm9tIHdoaWNoIHRoZSBldmVudCBpcyBvcmlnaW5hdGVkLlxuICAgICAgICAgICAgaWYgKHByZXNlbnRJbmRleCA9PT0gLTEgfHwgISQoJGV2ZW50LnRhcmdldCkuY2xvc2VzdCh0aGlzLmxhc3RTZWxlY3RlZEl0ZW0ubmF0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCAkbGkgPSAkKCRldmVudC50YXJnZXQpLmNsb3Nlc3QoJ2xpLmFwcC1saXN0LWl0ZW0nKTtcbiAgICAgICAgICAgICAgICBjb25zdCAkdWwgPSAkbGkuY2xvc2VzdCgndWwuYXBwLWxpdmVsaXN0LWNvbnRhaW5lcicpO1xuICAgICAgICAgICAgICAgIHByZXNlbnRJbmRleCA9ICR1bC5maW5kKCdsaS5hcHAtbGlzdC1pdGVtJykuaW5kZXgoJGxpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub25JdGVtQ2xpY2soJGV2ZW50LCB0aGlzLmdldExpc3RJdGVtQnlJbmRleChwcmVzZW50SW5kZXgpKTtcbiAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT09ICdzcGFjZScpIHtcbiAgICAgICAgICAgIGlmKCF0aGlzLmVuYWJsZXJlb3JkZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmlzTGlzdEVsZW1lbnRNb3ZhYmxlID0gIXRoaXMuaXNMaXN0RWxlbWVudE1vdmFibGU7XG4gICAgICAgICAgICB0aGlzLm9uSXRlbUNsaWNrKCRldmVudCwgdGhpcy5nZXRMaXN0SXRlbUJ5SW5kZXgocHJlc2VudEluZGV4KSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRJbmRleCA9IHByZXNlbnRJbmRleCArIDE7XG4gICAgICAgICAgICBpZih0aGlzLmlzTGlzdEVsZW1lbnRNb3ZhYmxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcmlhVGV4dCA9IGBJdGVtICR7dGhpcy5jdXJyZW50SW5kZXh9IGdyYWJiZWQsIGN1cnJlbnQgcG9zaXRpb24gYDtcbiAgICAgICAgICAgICAgICB0aGlzLiR1bEVsZS5kYXRhKCdvbGRJbmRleCcsIHByZXNlbnRJbmRleCk7XG4gICAgICAgICAgICB9ICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcmlhVGV4dCA9IGBJdGVtICR7dGhpcy5jdXJyZW50SW5kZXh9IGRyb3BwZWQsIGZpbmFsIHBvc2l0aW9uIGA7XG4gICAgICAgICAgICAgICAgdGhpcy5vblVwZGF0ZSgkZXZlbnQsIHVuZGVmaW5lZCwgcHJlc2VudEluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uUHJvcGVydHlDaGFuZ2Uoa2V5OiBzdHJpbmcsIG52OiBhbnksIG92PzogYW55KSB7XG4gICAgICAgIGlmIChrZXkgPT09ICdkYXRhc2V0Jykge1xuICAgICAgICAgICAgaWYgKCFudiAmJiB0aGlzLmJpbmRkYXRhc291cmNlICYmICF0aGlzLmRhdGFzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9uRGF0YVNldENoYW5nZShudik7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnZGF0YXNvdXJjZScpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFzZXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uRGF0YVNldENoYW5nZSh0aGlzLmRhdGFzZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ25hdmlnYXRpb24nKSB7XG4gICAgICAgICAgICAvLyBTdXBwb3J0IGZvciBvbGRlciBwcm9qZWN0cyB3aGVyZSBuYXZpZ2F0aW9uIHR5cGUgd2FzIGFkdmFuY2VkIGluc3RlYWQgb2YgY2xhc3NpY1xuICAgICAgICAgICAgaWYgKG52ID09PSAnQWR2YW5jZWQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uID0gJ0NsYXNzaWMnO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN3aXRjaENsYXNzKHRoaXMubmF0aXZlRWxlbWVudCwgbnYsIG92KTtcbiAgICAgICAgICAgIHRoaXMub25OYXZpZ2F0aW9uVHlwZUNoYW5nZShudik7XG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhTmF2aWdhdG9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhTmF2aWdhdG9yLm5hdmlnYXRpb25DbGFzcyA9IHRoaXMucGFnaW5hdGlvbmNsYXNzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2l0ZW1zcGVycm93Jykge1xuICAgICAgICAgICAgc2V0TGlzdENsYXNzKHRoaXMpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ3RhYmluZGV4Jykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ3B1bGx0b3JlZnJlc2gnICYmIG52KSB7XG4gICAgICAgICAgICB0aGlzLmFwcC5ub3RpZnkoJ3B1bGxUb1JlZnJlc2g6ZW5hYmxlJyk7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmliZVRvUHVsbFRvUmVmcmVzaCgpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ3BhZ2luYXRpb25jbGFzcycpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFOYXZpZ2F0b3IpIHtcbiAgICAgICAgICAgICAgICAvLyBBZGRpbmcgc2V0VGltZW91dCBiZWNhdXNlIGluIHBhZ2luYXRpb24gY29tcG9uZW50IHVwZGF0ZU5hdlNpemUgbWV0aG9kIGlzIG92ZXJyaWRpbmcgbmF2aWdhdGlvbmNsYXNzXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCggKCkgPT4gdGhpcy5kYXRhTmF2aWdhdG9yLm5hdmlnYXRpb25DbGFzcyA9IG52KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdwYWdlc2l6ZScpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YU5hdmlnYXRvci5vcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIG1heFJlc3VsdHM6IG52XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5kYXRhTmF2aWdhdG9yLndpZGdldC5tYXhSZXN1bHRzID0gbnY7XG4gICAgICAgICAgICB0aGlzLmRhdGFOYXZpZ2F0b3IubWF4UmVzdWx0cyA9IG52O1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2VuYWJsZXJlb3JkZXInKSB7XG4gICAgICAgICAgICBpZiAobnYgJiYgdGhpcy4kdWxFbGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiR1bEVsZS5hdHRyKCdhcmlhLWRlc2NyaWJlZGJ5JywgdGhpcy50aXRsZUlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyZURuRCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuJHVsRWxlLnNvcnRhYmxlKCdlbmFibGUnKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy4kdWxFbGUgJiYgIW52KSB7XG4gICAgICAgICAgICAgICAgdGhpcy4kdWxFbGUucmVtb3ZlQXR0cignYXJpYS1kZXNjcmliZWRieScpO1xuICAgICAgICAgICAgICAgIHRoaXMuJHVsRWxlLnNvcnRhYmxlKCdkaXNhYmxlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdXBlci5vblByb3BlcnR5Q2hhbmdlKGtleSwgbnYsIG92KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvbkl0ZW1DbGljayhldnQ6IGFueSwgJGxpc3RJdGVtOiBMaXN0SXRlbURpcmVjdGl2ZSkge1xuICAgICAgICBsZXQgc2VsZWN0Q291bnQ6IG51bWJlcjtcblxuICAgICAgICBpZiAoISRsaXN0SXRlbS5kaXNhYmxlSXRlbSkge1xuICAgICAgICAgICAgdGhpcy5maXJzdFNlbGVjdGVkSXRlbSA9IHRoaXMuZmlyc3RTZWxlY3RlZEl0ZW0gfHwgJGxpc3RJdGVtO1xuICAgICAgICAgICAgLy8gU2V0dGluZyBzZWxlY3RDb3VudCB2YWx1ZSBiYXNlZCBudW1iZXIgb2YgaXRlbXMgc2VsZWN0ZWQuXG4gICAgICAgICAgICBzZWxlY3RDb3VudCA9IF8uaXNBcnJheSh0aGlzLnNlbGVjdGVkaXRlbSkgPyB0aGlzLnNlbGVjdGVkaXRlbS5sZW5ndGggOiAoXy5pc09iamVjdCh0aGlzLnNlbGVjdGVkaXRlbSkgPyAxIDogMCk7XG5cbiAgICAgICAgICAgIC8vIEhhbmRsaW5nIG11bHRpc2VsZWN0IGZvciBtb2JpbGUgZGV2aWNlXG4gICAgICAgICAgICBpZiAodGhpcy5tdWx0aXNlbGVjdCAmJiBpc01vYmlsZSgpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tTZWxlY3Rpb25MaW1pdChzZWxlY3RDb3VudCkgfHwgJGxpc3RJdGVtLmlzQWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlTGlzdEl0ZW1TZWxlY3Rpb24oJGxpc3RJdGVtKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ3NlbGVjdGlvbmxpbWl0ZXhjZWVkJywgeyRldmVudDogZXZ0fSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICgoZXZ0LmN0cmxLZXkgfHwgZXZ0Lm1ldGFLZXkpICYmIHRoaXMubXVsdGlzZWxlY3QpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jaGVja1NlbGVjdGlvbkxpbWl0KHNlbGVjdENvdW50KSB8fCAkbGlzdEl0ZW0uaXNBY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJzdFNlbGVjdGVkSXRlbSA9IHRoaXMubGFzdFNlbGVjdGVkSXRlbSA9ICRsaXN0SXRlbTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGVMaXN0SXRlbVNlbGVjdGlvbigkbGlzdEl0ZW0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnc2VsZWN0aW9ubGltaXRleGNlZWQnLCB7JGV2ZW50OiBldnR9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2dC5zaGlmdEtleSAmJiB0aGlzLm11bHRpc2VsZWN0KSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpcnN0ID0gJGxpc3RJdGVtLmNvbnRleHQuaW5kZXg7XG4gICAgICAgICAgICAgICAgbGV0IGxhc3QgPSB0aGlzLmZpcnN0U2VsZWN0ZWRJdGVtLmNvbnRleHQuaW5kZXg7XG5cbiAgICAgICAgICAgICAgICAvLyBpZiBmaXJzdCBpcyBncmVhdGVyIHRoYW4gbGFzdCwgdGhlbiBzd2FwIHZhbHVlc1xuICAgICAgICAgICAgICAgIGlmIChmaXJzdCA+IGxhc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgbGFzdCA9IFtmaXJzdCwgZmlyc3QgPSBsYXN0XVswXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tTZWxlY3Rpb25MaW1pdChsYXN0IC0gZmlyc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJTZWxlY3RlZEl0ZW1zKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGlzdEl0ZW1zLmZvckVhY2goKCRsaUl0ZW06IExpc3RJdGVtRGlyZWN0aXZlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9ICRsaUl0ZW0uY29udGV4dC5pbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSBmaXJzdCAmJiBpbmRleCA8PSBsYXN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGVMaXN0SXRlbVNlbGVjdGlvbigkbGlJdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkSXRlbSA9ICRsaXN0SXRlbTtcbiAgICAgICAgICAgICAgICB9ICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdzZWxlY3Rpb25saW1pdGV4Y2VlZCcsIHskZXZlbnQ6IGV2dH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoISRsaXN0SXRlbS5pc0FjdGl2ZSB8fCBzZWxlY3RDb3VudCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhclNlbGVjdGVkSXRlbXMoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGVMaXN0SXRlbVNlbGVjdGlvbigkbGlzdEl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcnN0U2VsZWN0ZWRJdGVtID0gdGhpcy5sYXN0U2VsZWN0ZWRJdGVtID0gJGxpc3RJdGVtO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICRhcHBEaWdlc3QoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEVtcHR5IHRoZSBsaXN0IGNvbnRlbnQgb24gY2xlYXJcbiAgICBwdWJsaWMgY2xlYXIgKCkge1xuICAgICAgICB0aGlzLnVwZGF0ZUZpZWxkRGVmcyhbXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogIFJldHVybnMgTGlzdEl0ZW0gUmVmZXJlbmNlIGJhc2VkIG9uIHRoZSBpbnB1dCBwcm92aWRlZC5cbiAgICAgKiBAcGFyYW0gdmFsOiBpbmRleCB8IG1vZGVsIG9mIHRoZSBsaXN0IGl0ZW0uXG4gICAgICogQHJldHVybnMge0xpc3RJdGVtRGlyZWN0aXZlfVxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0SXRlbVJlZkJ5SW5kZXhPck1vZGVsKHZhbDogYW55KTogTGlzdEl0ZW1EaXJlY3RpdmUge1xuICAgICAgICBsZXQgbGlzdEl0ZW06IExpc3RJdGVtRGlyZWN0aXZlO1xuICAgICAgICBpZiAoaXNOdW1iZXIodmFsKSkge1xuICAgICAgICAgICAgbGlzdEl0ZW0gPSB0aGlzLmdldExpc3RJdGVtQnlJbmRleCh2YWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGlzdEl0ZW0gPSB0aGlzLmdldExpc3RJdGVtQnlNb2RlbCh2YWwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsaXN0SXRlbTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBkZXNlbGVjdHMgaXRlbSBpbiB0aGUgbGlzdC5cbiAgICAgKiBAcGFyYW0gdmFsOiBpbmRleCB8IG1vZGVsIG9mIHRoZSBsaXN0IGl0ZW0uXG4gICAgICovXG4gICAgcHVibGljIGRlc2VsZWN0SXRlbSAodmFsOiBhbnkpIHtcbiAgICAgICAgY29uc3QgbGlzdEl0ZW0gPSB0aGlzLmdldEl0ZW1SZWZCeUluZGV4T3JNb2RlbCh2YWwpO1xuICAgICAgICBpZiAobGlzdEl0ZW0gJiYgbGlzdEl0ZW0uaXNBY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlTGlzdEl0ZW1TZWxlY3Rpb24obGlzdEl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogc2VsZWN0cyBpdGVtIGluIHRoZSBsaXN0LlxuICAgICAqIEBwYXJhbSB2YWw6IGluZGV4IHwgbW9kZWwgb2YgdGhlIGxpc3QgaXRlbS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0SXRlbSh2YWwsIHN0YXRlUGVyc2lzdGVuY2VUcmlnZ2VyZWQ/KSB7XG4gICAgICAgIGNvbnN0IGxpc3RJdGVtID0gdGhpcy5nZXRJdGVtUmVmQnlJbmRleE9yTW9kZWwodmFsKTtcbiAgICAgICAgaWYgKCFsaXN0SXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbGlzdEl0ZW0uaXNBY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlTGlzdEl0ZW1TZWxlY3Rpb24obGlzdEl0ZW0sIHN0YXRlUGVyc2lzdGVuY2VUcmlnZ2VyZWQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGZvY3VzIHRoZSBlbGVtZW50LlxuICAgICAgICBsaXN0SXRlbS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBiZWZvcmVQYWdpbmF0aW9uQ2hhbmdlKCRldmVudCwgJGluZGV4KSB7XG4gICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygncGFnaW5hdGlvbmNoYW5nZScsIHskZXZlbnQsICRpbmRleH0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBoYW5kbGVFdmVudChub2RlOiBIVE1MRWxlbWVudCwgZXZlbnROYW1lOiBzdHJpbmcsIGV2ZW50Q2FsbGJhY2s6IEZ1bmN0aW9uLCBsb2NhbHM6IGFueSkge1xuICAgICAgICAvLyB0YXAgYW5kIGRvdWJsZVRhcCBldmVudHMgYXJlIG5vdCBnZXR0aW5nIHByb3BhZ2F0ZWQuU28sIHVzaW5nIG1vdXNlIGV2ZW50cyBpbnN0ZWFkLlxuICAgICAgICBjb25zdCB0b3VjaFRvTW91c2UgPSB7XG4gICAgICAgICAgICB0YXA6ICdjbGljaycsXG4gICAgICAgICAgICBkb3VibGV0YXA6ICdkYmxjbGljaydcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKF8uaW5jbHVkZXMoWydjbGljaycsICd0YXAnLCAnZGJsY2xpY2snLCAnZG91YmxldGFwJ10sIGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgICAgICAgIHRvdWNoVG9Nb3VzZVtldmVudE5hbWVdIHx8IGV2ZW50TmFtZSxcbiAgICAgICAgICAgICAgICAoZXZ0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9ICQoZXZ0LnRhcmdldCkuY2xvc2VzdCgnLmFwcC1saXN0LWl0ZW0nKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RJdGVtQ29udGV4dDogTGlzdEl0ZW1EaXJlY3RpdmUgPSB0YXJnZXQuZGF0YSgnbGlzdEl0ZW1Db250ZXh0Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxpc3RJdGVtQ29udGV4dC5kaXNhYmxlSXRlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjayhldmVudE5hbWUsIHt3aWRnZXQ6IGxpc3RJdGVtQ29udGV4dCwgJGV2ZW50OiBldnQsIGl0ZW06IGxpc3RJdGVtQ29udGV4dC5pdGVtfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW52b2tlIHRoZSBkYXRhc291cmNlIHZhcmlhYmxlIGJ5IGRlZmF1bHQgd2hlbiBwdWxsdG9yZWZyZXNoIGV2ZW50IGlzIG5vdCBzcGVjaWZpZWQuXG4gICAgcHJpdmF0ZSBzdWJzY3JpYmVUb1B1bGxUb1JlZnJlc2goKSB7XG4gICAgICAgIHRoaXMuX2xpc3RlbmVyRGVzdHJveWVycy5wdXNoKHRoaXMuYXBwLnN1YnNjcmliZSgncHVsbHRvcmVmcmVzaCcsICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFzb3VyY2UgJiYgdGhpcy5kYXRhc291cmNlLmxpc3RSZWNvcmRzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhc291cmNlLmxpc3RSZWNvcmRzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICAgICAgdGhpcy5oYW5kbGVIZWFkZXJDbGljayA9IG5vb3A7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kZWJvdW5jZWRGZXRjaE5leHREYXRhc2V0T25TY3JvbGwgPSB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLmRlYm91bmNlZEZldGNoTmV4dERhdGFzZXRPblNjcm9sbCh0aGlzLmRhdGFOYXZpZ2F0b3IsIERFQk9VTkNFX1RJTUVTLlBBR0lOQVRJT05fREVCT1VOQ0VfVElNRSwgdGhpcyk7XG4gICAgICAgIH0sIDApO1xuICAgICAgICB0aGlzLl9pdGVtcyA9IFtdO1xuICAgICAgICB0aGlzLmZpZWxkRGVmcyA9IFtdO1xuICAgICAgICB0aGlzLnJlb3JkZXJQcm9wcyA9IHtcbiAgICAgICAgICAgIG1pbkluZGV4OiBudWxsLFxuICAgICAgICAgICAgbWF4SW5kZXg6IG51bGxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldFVwQ1VESGFuZGxlcnMoKSB7XG4gICAgICAgIGNvbnN0ICRhZGRJdGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImFkZC1saXN0LWl0ZW1cIilbMF07XG4gICAgICAgIGlmICgkYWRkSXRlbSkge1xuICAgICAgICAgICAgLy8gVHJpZ2dlcmVkIG9uIGNsaWNrIG9mIGFkZCBhY3Rpb25cbiAgICAgICAgICAgICRhZGRJdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZ0ID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMucHJvbWlzZVJlc29sdmVyRm4oKTtcbiAgICAgICAgdGhpcy5wcm9wc0luaXRQcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgc3VwZXIubmdBZnRlclZpZXdJbml0KCk7XG4gICAgICAgICAgICB0aGlzLnNldFVwQ1VESGFuZGxlcnMoKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtV2lkZ2V0cyA9IHRoaXMubXVsdGlzZWxlY3QgPyBbXSA6IHt9O1xuICAgICAgICAgICAgdmFyIGVsZSA9ICQodGhpcy5uYXRpdmVFbGVtZW50KS5maW5kKCcuYXBwLWxpdmVsaXN0LWNvbnRhaW5lcicpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5lbmFibGVyZW9yZGVyICYmICF0aGlzLmdyb3VwYnkpIHtcbiAgICAgICAgICAgICAgICBpZihlbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlLmF0dHIoJ2FyaWEtZGVzY3JpYmVkYnknLCB0aGlzLnRpdGxlSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyZURuRCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLmVuYWJsZXJlb3JkZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZS5yZW1vdmVBdHRyKCdhcmlhLWRlc2NyaWJlZGJ5Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuZ3JvdXBieSAmJiB0aGlzLmNvbGxhcHNpYmxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVIZWFkZXJDbGljayA9IGhhbmRsZUhlYWRlckNsaWNrO1xuICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlQWxsSGVhZGVycyA9IHRvZ2dsZUFsbEhlYWRlcnMuYmluZCh1bmRlZmluZWQsIHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0TGlzdENsYXNzKHRoaXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zZXR1cEhhbmRsZXJzKCk7XG4gICAgICAgIGNvbnN0ICR1bCA9IHRoaXMubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCd1bC5hcHAtbGl2ZWxpc3QtY29udGFpbmVyJyk7XG4gICAgICAgIHN0eWxlcigkdWwgYXMgSFRNTEVsZW1lbnQsIHRoaXMsIEFQUExZX1NUWUxFU19UWVBFLlNDUk9MTEFCTEVfQ09OVEFJTkVSKTtcbiAgICAgICAgaWYgKHRoaXMuZW5hYmxlcmVvcmRlcikge1xuICAgICAgICAgICAgaWYgKCR1bCl7XG4gICAgICAgICAgICAgICAgJHVsLnNldEF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScsIHRoaXMudGl0bGVJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmVuYWJsZXJlb3JkZXIpICB7XG4gICAgICAgICAgICBpZigkdWwpIHtcbiAgICAgICAgICAgICAgICAkdWwucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWRlc2NyaWJlZGJ5Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzTW9iaWxlQXBwKCkgJiYgJHVsLnF1ZXJ5U2VsZWN0b3IoJy5hcHAtbGlzdC1pdGVtLWFjdGlvbi1wYW5lbCcpKSB7XG4gICAgICAgICAgICB0aGlzLl9saXN0QW5pbWF0b3IgPSBuZXcgTGlzdEFuaW1hdG9yKHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLl9saXN0QW5pbWF0b3IgJiYgdGhpcy5fbGlzdEFuaW1hdG9yLiRidG5TdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX2xpc3RBbmltYXRvci4kYnRuU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbGlzdGVuZXJEZXN0cm95ZXJzLmZvckVhY2goZCA9PiBkICYmIGQoKSk7XG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgfVxuXG4gICAgbmdPbkRldGFjaCgpIHtcbiAgICAgICAgc3VwZXIubmdPbkRldGFjaCgpO1xuICAgICAgICB0aGlzLl9wYWdlTG9hZCA9IHRydWU7XG4gICAgfVxufVxuIl19
|