gamma-app-controller 2.0.12 → 2.0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/application-controller/support-components/dash-chart/dash-chart.component.mjs +116 -68
- package/esm2020/lib/application-controller/support-components/geo-map/geo-map.component.mjs +115 -3
- package/esm2020/lib/shared/advanced-component/gamma-advance-chart/gamma-advance-chart.component.mjs +98 -74
- package/esm2020/lib/shared/advanced-component/gamma-geo-chart/gamma-geo-chart.component.mjs +73 -2
- package/fesm2015/gamma-app-controller.mjs +400 -146
- package/fesm2015/gamma-app-controller.mjs.map +1 -1
- package/fesm2020/gamma-app-controller.mjs +400 -145
- package/fesm2020/gamma-app-controller.mjs.map +1 -1
- package/lib/application-controller/support-components/dash-chart/dash-chart.component.d.ts +13 -9
- package/lib/application-controller/support-components/geo-map/geo-map.component.d.ts +13 -0
- package/lib/shared/advanced-component/gamma-advance-chart/gamma-advance-chart.component.d.ts +3 -5
- package/lib/shared/advanced-component/gamma-geo-chart/gamma-geo-chart.component.d.ts +1 -0
- package/package.json +1 -1
|
@@ -109,6 +109,11 @@ export class GeoMapComponent {
|
|
|
109
109
|
zoom: "7",
|
|
110
110
|
isValueFieldRangeSlider: true,
|
|
111
111
|
slideSpeed: 1000,
|
|
112
|
+
isDataAggregation: false,
|
|
113
|
+
dataAggregationConfig: {
|
|
114
|
+
"dataAggregateColumes": [],
|
|
115
|
+
"aggregateFields": []
|
|
116
|
+
},
|
|
112
117
|
sliderValueField: "year",
|
|
113
118
|
centerLat: "1.3733",
|
|
114
119
|
centerLng: "32.2903",
|
|
@@ -130,6 +135,8 @@ export class GeoMapComponent {
|
|
|
130
135
|
this.activeTab = 'basic';
|
|
131
136
|
this.createOtherComponentView = new EventEmitter();
|
|
132
137
|
this.selectedViews = [];
|
|
138
|
+
this.dataAggregationContainer = [];
|
|
139
|
+
this.dataAggregateGroupByColume = [];
|
|
133
140
|
}
|
|
134
141
|
set chartconfigData(value) {
|
|
135
142
|
if (value === undefined || value.length === 0) {
|
|
@@ -140,6 +147,7 @@ export class GeoMapComponent {
|
|
|
140
147
|
this.configColume = Object.keys(value.data[0]);
|
|
141
148
|
this.dataSourseForTable = value.data;
|
|
142
149
|
this.selectedViewConfigs = value;
|
|
150
|
+
this.previewData = value.data;
|
|
143
151
|
this.selectedTableViewType = value.selectedViewType;
|
|
144
152
|
this.userOptionContainer = value.selectedWidgetConfig?.permissions ? value.selectedWidgetConfig.permissions : [];
|
|
145
153
|
if (value.selectedWidgetConfig) {
|
|
@@ -433,16 +441,120 @@ export class GeoMapComponent {
|
|
|
433
441
|
this.choroplethMapConfig['centerLat'] = centerLat.toFixed(6);
|
|
434
442
|
this.choroplethMapConfig['centerLng'] = centerLng.toFixed(6);
|
|
435
443
|
}
|
|
444
|
+
addAggregationColume() {
|
|
445
|
+
this.dataAggregationContainer.push({
|
|
446
|
+
aggregateDataField: "",
|
|
447
|
+
aggregateFunctionType: ""
|
|
448
|
+
});
|
|
449
|
+
}
|
|
450
|
+
deleteAggregationColume(i) {
|
|
451
|
+
this.dataAggregationContainer.splice(i, 1);
|
|
452
|
+
}
|
|
453
|
+
onDataGroupByChange(event) {
|
|
454
|
+
if (this.choroplethMapConfig.isDataAggregation) {
|
|
455
|
+
this.dataAggregationContainer.push({
|
|
456
|
+
aggregateDataField: "",
|
|
457
|
+
aggregateFunctionType: ""
|
|
458
|
+
});
|
|
459
|
+
}
|
|
460
|
+
else {
|
|
461
|
+
this.dataSourseForTable = this.previewData.slice(0, 10);
|
|
462
|
+
this.configColume = (this.previewData[0]) ? Object.keys(this.previewData[0]) : [];
|
|
463
|
+
}
|
|
464
|
+
this.table_columns_config.kpiConfig['dataConfig'] = this.choroplethMapConfig;
|
|
465
|
+
this.table_columns_config.kpiConfig['dataConfig']['chart_config'] = this.tableDataConfig.chart_config;
|
|
466
|
+
this.table_columns_config.kpiConfig['dataConfig']['mapType'] = this.mapType;
|
|
467
|
+
this.chartDataSourceForMap = { ...this.table_columns_config };
|
|
468
|
+
}
|
|
469
|
+
saveAggregationColume() {
|
|
470
|
+
if (this.choroplethMapConfig.isDataAggregation) {
|
|
471
|
+
const aggreationData = this.getGroupDataForChart(this.previewData, this.dataAggregationContainer, this.dataAggregateGroupByColume);
|
|
472
|
+
this.dataSourseForTable = aggreationData;
|
|
473
|
+
this.configColume = (aggreationData[0]) ? Object.keys(aggreationData[0]) : [];
|
|
474
|
+
if (this.choroplethMapConfig.isDataAggregation) {
|
|
475
|
+
this.choroplethMapConfig['dataAggregationConfig'] = {
|
|
476
|
+
"dataAggregateColumes": this.dataAggregationContainer,
|
|
477
|
+
"aggregateFields": this.dataAggregateGroupByColume
|
|
478
|
+
};
|
|
479
|
+
}
|
|
480
|
+
console.log(aggreationData);
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
getGroupDataForChart(data, aggregationConfig, groupByColumns) {
|
|
484
|
+
const groupMap = {};
|
|
485
|
+
data.forEach(row => {
|
|
486
|
+
const groupKey = groupByColumns.map(col => row[col]).join("||");
|
|
487
|
+
if (!groupMap[groupKey]) {
|
|
488
|
+
groupMap[groupKey] = {};
|
|
489
|
+
groupByColumns.forEach(col => {
|
|
490
|
+
groupMap[groupKey][col] = row[col];
|
|
491
|
+
});
|
|
492
|
+
aggregationConfig.forEach(({ aggregateDataField, aggregateFunctionType }) => {
|
|
493
|
+
switch (aggregateFunctionType) {
|
|
494
|
+
case "sum":
|
|
495
|
+
case "avg":
|
|
496
|
+
groupMap[groupKey][aggregateDataField] = 0;
|
|
497
|
+
break;
|
|
498
|
+
case "min":
|
|
499
|
+
groupMap[groupKey][aggregateDataField] = Infinity;
|
|
500
|
+
break;
|
|
501
|
+
case "max":
|
|
502
|
+
groupMap[groupKey][aggregateDataField] = -Infinity;
|
|
503
|
+
break;
|
|
504
|
+
case "count":
|
|
505
|
+
groupMap[groupKey][aggregateDataField] = 0;
|
|
506
|
+
break;
|
|
507
|
+
}
|
|
508
|
+
if (aggregateFunctionType === "avg") {
|
|
509
|
+
groupMap[groupKey][`${aggregateDataField}__count`] = 0;
|
|
510
|
+
}
|
|
511
|
+
});
|
|
512
|
+
}
|
|
513
|
+
aggregationConfig.forEach(({ aggregateDataField, aggregateFunctionType }) => {
|
|
514
|
+
const value = row[aggregateDataField];
|
|
515
|
+
switch (aggregateFunctionType) {
|
|
516
|
+
case "sum":
|
|
517
|
+
groupMap[groupKey][aggregateDataField] += value;
|
|
518
|
+
break;
|
|
519
|
+
case "avg":
|
|
520
|
+
groupMap[groupKey][aggregateDataField] += value;
|
|
521
|
+
groupMap[groupKey][`${aggregateDataField}__count`] += 1;
|
|
522
|
+
break;
|
|
523
|
+
case "min":
|
|
524
|
+
groupMap[groupKey][aggregateDataField] =
|
|
525
|
+
Math.min(groupMap[groupKey][aggregateDataField], value);
|
|
526
|
+
break;
|
|
527
|
+
case "max":
|
|
528
|
+
groupMap[groupKey][aggregateDataField] =
|
|
529
|
+
Math.max(groupMap[groupKey][aggregateDataField], value);
|
|
530
|
+
break;
|
|
531
|
+
case "count":
|
|
532
|
+
groupMap[groupKey][aggregateDataField] += 1;
|
|
533
|
+
break;
|
|
534
|
+
}
|
|
535
|
+
});
|
|
536
|
+
});
|
|
537
|
+
Object.values(groupMap).forEach(group => {
|
|
538
|
+
aggregationConfig.forEach(({ aggregateDataField, aggregateFunctionType }) => {
|
|
539
|
+
if (aggregateFunctionType === "avg") {
|
|
540
|
+
group[aggregateDataField] =
|
|
541
|
+
group[aggregateDataField] / group[`${aggregateDataField}__count`];
|
|
542
|
+
delete group[`${aggregateDataField}__count`];
|
|
543
|
+
}
|
|
544
|
+
});
|
|
545
|
+
});
|
|
546
|
+
return Object.values(groupMap);
|
|
547
|
+
}
|
|
436
548
|
}
|
|
437
549
|
GeoMapComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GeoMapComponent, deps: [{ token: i1.CommonService }, { token: i0.ChangeDetectorRef }, { token: i2.ApplicationContentService }, { token: i3.ToastrService }], target: i0.ɵɵFactoryTarget.Component });
|
|
438
|
-
GeoMapComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: GeoMapComponent, selector: "app-geo-map", inputs: { chartconfigData: ["datasetmodal", "chartconfigData"] }, outputs: { createOtherComponentView: "createOtherComponentView" }, ngImport: i0, template: "<div class=\"flex flex-wrap\">\n <div class=\"w-full mx-2 border-r\">\n <ng-container *ngIf=\"!isJsonPreview\">\n <pre><code>{{jsaonDatasource | json}}</code></pre>\n </ng-container>\n <ng-container *ngIf=\"isJsonPreview\">\n <app-gamma-geo-chart [chartDataSource]=\"chartDataSourceForMap\"></app-gamma-geo-chart>\n <!-- <app-google-geo-map [chartDataSource]=\"chartDataSourceForMap\"></app-google-geo-map> -->\n\n <div #dynamicContainer></div>\n\n </ng-container>\n </div>\n <div class=\"w-full mx-2\">\n\n <div class=\"mb-4 border-b border-gray-200 dark:border-gray-700\">\n <ul class=\"flex flex-wrap -mb-px text-sm font-medium text-center\" role=\"tablist\">\n <li class=\"me-2\" role=\"presentation\">\n <button class=\"inline-block p-4 border-b-2 rounded-t-lg\" [ngClass]=\"{ \n 'text-purple-600 border-purple-600 dark:text-purple-500 dark:border-purple-500': activeTab === 'basic',\n 'text-gray-500 dark:text-gray-400 border-transparent': activeTab !== 'basic' \n }\" (click)=\"setActiveTab('basic')\" type=\"button\" role=\"tab\">\n Basic\n </button>\n </li>\n <li class=\"me-2\" role=\"presentation\">\n <button class=\"inline-block p-4 border-b-2 rounded-t-lg\" [ngClass]=\"{ \n 'text-purple-600 border-purple-600 dark:text-purple-500 dark:border-purple-500': activeTab === 'chart_config',\n 'text-gray-500 dark:text-gray-400 border-transparent': activeTab !== 'chart_config' \n }\" (click)=\"setActiveTab('chart_config')\" type=\"button\" role=\"tab\">\n Chart Columns\n </button>\n </li>\n <li class=\"me-2\" role=\"presentation\">\n <button class=\"inline-block p-4 border-b-2 rounded-t-lg\" [ngClass]=\"{\n 'text-purple-600 border-purple-600 dark:text-purple-500 dark:border-purple-500': activeTab === 'properties',\n 'text-gray-500 dark:text-gray-400 border-transparent': activeTab !== 'properties'\n }\" (click)=\"setActiveTab('properties')\" type=\"button\" role=\"tab\">\n Properties\n </button>\n </li>\n <li class=\"me-2\" role=\"presentation\">\n <button class=\"inline-block p-4 border-b-2 rounded-t-lg\" [ngClass]=\"{\n 'text-purple-600 border-purple-600 dark:text-purple-500 dark:border-purple-500': activeTab === 'permission',\n 'text-gray-500 dark:text-gray-400 border-transparent': activeTab !== 'permission'\n }\" (click)=\"setActiveTab('permission')\" type=\"button\" role=\"tab\">\n Manage Permissions\n </button>\n </li>\n\n </ul>\n </div>\n\n <div id=\"default-styled-tab-content\">\n <div *ngIf=\"activeTab === 'basic'\">\n <div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Filter Title\n Config\n </div>\n <div class=\"flex pt-2 border-x border-b\">\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Map Library </div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"['Google Maps']\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Select Map type </div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"chartViewTypeDataSource\" displayExpr=\"name\"\n valueExpr=\"value\" [(ngModel)]=\"mapType\"\n (onValueChanged)=\"changeMapType($event)\"></dx-select-box>\n </div>\n\n <ng-container *ngIf=\"mapType == 'heatMap'\">\n <div class=\"px-1 mb-1 w-1/3\">\n\n <div class=\"text-md mb-1\"> Heat Map Category </div>\n <dx-select-box [searchEnabled]=\"true\" [dataSource]=\"heatMapTypeDatasource\"\n displayExpr=\"name\" valueExpr=\"value\" [(ngModel)]=\"heatMapConfig.heatMapCategory\"\n (onValueChanged)=\"heatMapCategory($event)\"></dx-select-box>\n </div>\n </ng-container>\n </div>\n <ng-container *ngIf=\"mapType == 'geoMap'\">\n <div class=\"flex pt-2 border-x border-b\">\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Region </div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"regionData\"\n [(ngModel)]=\"tableDataConfig.region\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-1/3\" *ngIf=\"tableDataConfig.region == 'city'\">\n <div class=\"text-md mb-1\"> Type Region Code</div>\n <dx-text-box [(ngModel)]=\"tableDataConfig.regionCode\"></dx-text-box>\n </div>\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 flex justify-between\">\n <!-- <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Title</div>\n <dx-text-box [(ngModel)]=\"tableDataConfig.title\"></dx-text-box>\n </div> -->\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Argument Field</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"tableDataConfig.argumentField\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Chartvalu Field</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"tableDataConfig.chartValueField\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> size</div>\n <dx-text-box [(ngModel)]=\"tableDataConfig.size\"></dx-text-box>\n </div>\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\">Background Color</div>\n <dx-color-box [(ngModel)]=\"tableDataConfig.backgroundColor\"></dx-color-box>\n </div>\n <!-- <div class=\"px-4 mt-6 w-full\">\n <dx-check-box [value]=\"tableDataConfig.commonConfig.isSearchBox\"\n [(ngModel)]=\"tableDataConfig.commonConfig.isSearchBox\"\n text=\"Search Box\"></dx-check-box>\n \n </div> -->\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-2\"> Display Formate </div>\n <dx-select-box [items]=\"['daily','hourly','monthly']\"\n [(ngModel)]=\"table_columns_config.kpiConfig.formate\"\n [readOnly]=\"false\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-2\"> Key To Pass </div>\n <dx-tag-box [items]=\"configColume\"\n [(ngModel)]=\"table_columns_config.kpiConfig.keyToPass\"></dx-tag-box>\n </div>\n </div>\n </div>\n <div class=\" pt-2 border-x border-b \">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Colors\n </div>\n <div class=\"flex flex-wrap px-1 mb-2 mt-2\">\n <div class=\"flex mr-2 mb-2\" *ngFor=\"let color of tableDataConfig.colors; let i = index\">\n <div class=\"mr-2\">\n <dx-color-box [(ngModel)]=\"tableDataConfig.colors[i]\"\n (onValueChanged)=\"onColorChange($event.value, i)\"></dx-color-box>\n </div>\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer px-2\"\n (click)=\"removeColor(i)\"><i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n <!-- <div class=\"px-2\"> <button class=\"{{commonService.btn_danger_sm}}\" (click)=\"removeColor(i)\">Remove</button></div> -->\n </div>\n\n </div>\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_success_sm}}\" (click)=\"addColor()\">Add Color</button>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"mapType == 'choroplethMap'\">\n <div class=\"flex flex-row pt-2 border-x border-b\">\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Map Zoom </div>\n <dx-text-box [(ngModel)]=\"choroplethMapConfig.zoom\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 mt-6 w-full\">\n <dx-check-box [(ngModel)]=\"isCenterdChoroplethMap\"\n text=\"Centerd Position\"></dx-check-box>\n </div>\n\n <ng-container *ngIf=\"isCenterdChoroplethMap\">\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Select Latitude Key</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"centarLaitngObject.latKey\"\n (onValueChanged)=\"onLatLngKeyChange($event)\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Select Longitude Key</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"centarLaitngObject.lngKey\"\n (onValueChanged)=\"onLatLngKeyChange($event)\"></dx-select-box>\n </div>\n\n </ng-container>\n\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Map Center Latitude</div>\n <dx-text-box [(ngModel)]=\"choroplethMapConfig.centerLat\"\n [readOnly]=\"isCenterdChoroplethMap\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Map Center Longitude</div>\n <dx-text-box [(ngModel)]=\"choroplethMapConfig.centerLng\"\n [readOnly]=\"isCenterdChoroplethMap\"></dx-text-box>\n </div>\n\n\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 flex flex-row justify-between\">\n\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Argument Field</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"choroplethMapConfig.argumentField\"></dx-select-box>\n </div>\n\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> size</div>\n <dx-text-box [(ngModel)]=\"choroplethMapConfig.size\"></dx-text-box>\n </div>\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\">Color One</div>\n <dx-color-box [(ngModel)]=\"choroplethMapConfig.colorOne\"></dx-color-box>\n </div>\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\">Color Two</div>\n <dx-color-box [(ngModel)]=\"choroplethMapConfig.colorTwo\"></dx-color-box>\n </div>\n\n\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-2\"> Display Formate </div>\n <dx-select-box [items]=\"['daily','hourly','monthly']\"\n [(ngModel)]=\"table_columns_config.kpiConfig.formate\"\n [readOnly]=\"false\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-2\"> Key To Pass </div>\n <dx-tag-box [items]=\"configColume\"\n [(ngModel)]=\"table_columns_config.kpiConfig.keyToPass\"></dx-tag-box>\n </div>\n </div>\n <div class=\"my-2 flex-row justify-between\">\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Gjson File Path</div>\n <dx-text-box [(ngModel)]=\"choroplethMapConfig.gjsonFilePath\"></dx-text-box>\n </div>\n </div>\n <div class=\"my-2 flex flex-row justify-between\">\n <div class=\"px-1 mb-2 mt-6 w-full\">\n <dx-check-box [(ngModel)]=\"choroplethMapConfig.isValueFieldRangeSlider\"\n text=\"Range Slider\"></dx-check-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Slider Speed</div>\n <dx-number-box [(ngModel)]=\"choroplethMapConfig.slideSpeed\"></dx-number-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Value For Slider</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"choroplethMapConfig.sliderValueField\"></dx-select-box>\n </div>\n </div>\n </div>\n\n </ng-container>\n\n <ng-container\n *ngIf=\"heatMapConfig.heatMapCategory == 'heatMapOnly' || heatMapConfig.heatMapCategory == 'heatMapMarker' || heatMapConfig.heatMapCategory == 'heatMapAndMarker'\">\n <div class=\"flex-col\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\">\n Center Location Config\n </div>\n <div>\n <div class=\"flex pt-2 border-x border-b\">\n <!-- <div class=\"px-1 mb-1 w-1/4\">\n <div class=\"text-md mb-1\"> Latitude </div>\n <dx-text-box [(ngModel)]=\"heatMapConfig.centerLatitude\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-1 w-1/4\">\n <div class=\"text-md mb-1\"> Longitude </div>\n <dx-text-box [(ngModel)]=\"heatMapConfig.centerLongitude\"></dx-text-box>\n </div> -->\n <div class=\"px-1 mb-1 w-1/4\"\n *ngIf=\"heatMapConfig.heatMapCategory != 'heatMapAndMarker'\">\n <div class=\"text-md mb-1\"> Zoom Label </div>\n <dx-text-box [(ngModel)]=\"heatMapConfig.zoom\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-1 w-1/4\">\n <div class=\"text-md mb-1\"> Custom Icons </div>\n <dx-text-box [(ngModel)]=\"heatMapConfig.icon\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-1 w-1/4\">\n <div class=\"text-md mb-1\"> size</div>\n <dx-text-box [(ngModel)]=\"heatMapConfig.size\"></dx-text-box>\n </div>\n </div>\n </div>\n </div>\n <div class=\"flex-col\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\">\n Location Marker Config\n </div>\n <div>\n <div class=\"flex pt-2 border-x border-b\">\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Latitude </div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"heatMapConfig.markerLatitude\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Longitude </div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"heatMapConfig.markerLongitude\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-2\"> Display Formate </div>\n <dx-select-box [items]=\"['daily','hourly','monthly']\"\n [(ngModel)]=\"table_columns_config.kpiConfig.formate\"\n [readOnly]=\"false\"></dx-select-box>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"mapType == 'bubbleMap'\">\n <div class=\"flex-col\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\">\n Bubble Map Config\n </div>\n <div>\n <div class=\"flex pt-2 border-x border-b\">\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Argument Value </div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"bubbleMapConfig.agrumentValue\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-1/4\">\n <div class=\"text-md mb-1\"> Bubble Color </div>\n <dx-color-box [(ngModel)]=\"bubbleMapConfig.bubbleColor\"></dx-color-box>\n </div>\n <div class=\"px-1 mb-1 w-1/4\">\n <div class=\"text-md mb-1\">Bubble Minimum size</div>\n <dx-text-box [(ngModel)]=\"bubbleMapConfig.bubbleMinimumSize\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-1 w-1/4\">\n <div class=\"text-md mb-1\">Bubble Maximum size</div>\n <dx-text-box [(ngModel)]=\"bubbleMapConfig.bubbleMaximumSize\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-1 w-1/4\">\n <div class=\"text-md mb-1\"> size</div>\n <dx-text-box [(ngModel)]=\"bubbleMapConfig.size\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-1 w-1/4\">\n <div class=\"text-md mb-1\"> Short By</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"bubbleMapConfig.sortBy\"></dx-select-box>\n </div>\n <!-- <div class=\"px-1 mb-1 w-1/4\" *ngIf=\"heatMapConfig.heatMapCategory != 'heatMapAndMarker'\">\n <div class=\"text-md mb-1\"> Zoom Label </div>\n <dx-text-box [(ngModel)]=\"heatMapConfig.zoom\"></dx-text-box>\n </div> -->\n </div>\n </div>\n </div>\n <div class=\"flex-col\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\">\n Location Marker Config\n </div>\n <div>\n <div class=\"flex pt-2 border-x border-b\">\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Latitude </div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"bubbleMapConfig.markerLatitude\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Longitude </div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"bubbleMapConfig.markerLongitude\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-2\"> Display Formate </div>\n <dx-select-box [items]=\"['daily','hourly','monthly']\"\n [(ngModel)]=\"table_columns_config.kpiConfig.formate\"\n [readOnly]=\"false\"></dx-select-box>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n\n </div>\n\n\n\n </div>\n <div *ngIf=\"activeTab === 'chart_config'\">\n <div class=\"h-full overflow-x-auto\">\n <div class=\"flex flex-col flex-auto min-w-0\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\">\n Tooltip Columns\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 border-b flex flex-row\"\n *ngFor=\"let item of tableDataConfig.chart_config; let i = index;\">\n <!-- <div class=\"px-1 mb-2 mt-6 w-full\">\n <dx-check-box [value]=\"item.visible\" [(ngModel)]=\"item.visible\"\n text=\"Visiblity\"></dx-check-box>\n </div> -->\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Value Field</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"item.dataField\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Caption</div>\n <dx-text-box [(ngModel)]=\"item.caption\"></dx-text-box>\n </div>\n\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\">Display For</div>\n <dx-select-box [items]=\"['map', 'tooltip']\"\n [(ngModel)]=\"item.displayFor\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2 w-full\">\n <div class=\"text-md mb-2\"> UI Function</div>\n <dx-select-box [items]=\"enrichNameList\" [(ngModel)]=\"item.enrichName\"\n [searchEnabled]=\"true\"></dx-select-box>\n </div>\n\n <div class=\"text-center mt-8 w-full\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== tableDataConfig.chart_config.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\"\n (click)=\"deleteColumns(i)\"><i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n </div>\n </div>\n </div>\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\" (click)=\"addColumns()\">Add\n Columns</button>\n </div>\n </div>\n </div>\n <div *ngIf=\"activeTab === 'properties'\">\n <div class=\"h-full overflow-x-auto\">\n <app-loader *ngIf=\"isLoader\"></app-loader>\n <ng-container *ngIf=\"!isLoader\">\n <div class=\"flex flex-row justify-between border-b py-3\">\n <div class=\"mx-2\">\n <dx-check-box [value]=\"viewProperties.enableClickEvent\"\n [(ngModel)]=\"viewProperties.enableClickEvent\"\n text=\"Enable Click Event\"></dx-check-box>\n </div>\n <div class=\"mx-2\">\n <dx-check-box [value]=\"viewProperties.enableRightClickEvent\"\n [(ngModel)]=\"viewProperties.enableRightClickEvent\"\n text=\"Enable Right Click\"></dx-check-box>\n </div>\n </div>\n <div class=\"w-full p-2\" *ngIf=\"viewProperties.enableClickEvent\">\n\n <div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Event\n Type\n Option\n </div>\n <div class=\"w-full p-3 border-x border-b \">\n <div class=\"flex flex-row\">\n <div class=\"w-full\">\n <div class=\"text-md mb-2\"> Event Type</div>\n </div>\n <div class=\"w-full\">\n <dx-select-box [items]=\"['drilldown','optionalDrillDown']\"\n (onValueChanged)=\"getSelectedEventType($event)\"\n [(ngModel)]=\"viewProperties.clickEventOptions.eventType\"></dx-select-box>\n </div>\n </div>\n <ng-container *ngIf=\"viewProperties.clickEventOptions.eventType == 'drilldown'\">\n <div class=\"flex flex-row justify-between mt-3\">\n <div class=\"w-full\">\n <div class=\"text-md mb-2\"> Associated Views</div>\n <dx-tag-box [items]=\"allConfiguredViews\"\n [(ngModel)]=\"viewProperties.clickEventOptions.associatedViews\"\n valueExpr=\"viewId\" displayExpr=\"viewName\"\n [showSelectionControls]=\"true\" [searchEnabled]=\"true\"></dx-tag-box>\n </div>\n </div>\n </ng-container>\n <ng-container\n *ngIf=\"viewProperties.clickEventOptions.eventType == 'optionalDrillDown'\">\n <div class=\"flex flex-row justify-between mt-3\">\n <div class=\"w-full\">\n <ng-container\n *ngFor=\"let item of optionalDrilDownDataSource;let i = index;\">\n\n <div class=\"flex flex-row justify-between\">\n <div class=\"mx-2 w-full\">\n <div class=\"text-md mb-2\"> Associated Views</div>\n <dx-tag-box [items]=\"allConfiguredViews\"\n [(ngModel)]=\"item.viewId\" valueExpr=\"viewId\"\n displayExpr=\"viewName\" [showSelectionControls]=\"true\"\n [maxDisplayedTags]=\"2\"\n [searchEnabled]=\"true\"></dx-tag-box>\n\n </div>\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\"> Associated Params</div>\n <dx-text-box\n [(ngModel)]=\"item.filterCondition\"></dx-text-box>\n </div>\n <div class=\"mx-2\">\n <button\n class=\"{{commonService.btn_danger_sm}} cursor-pointer mt-8\"\n (click)=\"deleteAssociatedParams(i)\"><i\n class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </ng-container>\n <div class=\"flex flex-row justify-end mt-4\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\"\n (click)=\"addAssociatedParams()\">Add\n Params</button>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n </div>\n\n </div>\n </ng-container>\n <button class=\"{{commonService.btn_light_md}} cursor-pointer mt-2\"\n (click)=\"resetViewProprstise()\">Reset All</button>\n </div>\n </div>\n <div *ngIf=\"activeTab === 'permission'\">\n <div class=\"h-full overflow-x-auto\">\n <app-user-access [(userOptionContainer)]=\"userOptionContainer\">\n </app-user-access>\n </div>\n </div>\n\n </div>\n\n\n </div>\n</div>\n\n<div class=\"flex flex-row border-t pl-3\">\n <div class=\"flex justify-start mx-1\">\n <button class=\"{{commonService.btn_warning_md}} cursor-pointer mt-2\" (click)=\"viewMapForTest()\">\n Preview</button>\n <button class=\"{{commonService.btn_primary_md}} cursor-pointer mt-2\" (click)=\"isJsonPreview = false\">Data\n Preview</button>\n </div>\n <div class=\"flex justify-end mx-1 flex-grow\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mt-2\"\n (click)=\"getSaveChartConfig()\">Submit</button>\n </div>\n</div>", styles: [""], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.DxCheckBoxComponent, selector: "dx-check-box", inputs: ["accessKey", "activeStateEnabled", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "iconSize", "isValid", "name", "readOnly", "rtlEnabled", "tabIndex", "text", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "visible", "width"], outputs: ["onContentReady", "onDisposing", "onInitialized", "onOptionChanged", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "iconSizeChange", "isValidChange", "nameChange", "readOnlyChange", "rtlEnabledChange", "tabIndexChange", "textChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "component", type: i6.DxColorBoxComponent, selector: "dx-color-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "applyButtonText", "applyValueMode", "buttons", "cancelButtonText", "deferRendering", "disabled", "dropDownButtonTemplate", "dropDownOptions", "editAlphaChannel", "elementAttr", "fieldTemplate", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "keyStep", "label", "labelMode", "name", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "showClearButton", "showDropDownButton", "stylingMode", "tabIndex", "text", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "visible", "width"], outputs: ["onChange", "onClosed", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOpened", "onOptionChanged", "onPaste", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "applyButtonTextChange", "applyValueModeChange", "buttonsChange", "cancelButtonTextChange", "deferRenderingChange", "disabledChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "editAlphaChannelChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "keyStepChange", "labelChange", "labelModeChange", "nameChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showClearButtonChange", "showDropDownButtonChange", "stylingModeChange", "tabIndexChange", "textChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "component", type: i7.DxNumberBoxComponent, selector: "dx-number-box", inputs: ["accessKey", "activeStateEnabled", "buttons", "disabled", "elementAttr", "focusStateEnabled", "format", "height", "hint", "hoverStateEnabled", "inputAttr", "invalidValueMessage", "isValid", "label", "labelMode", "max", "min", "mode", "name", "placeholder", "readOnly", "rtlEnabled", "showClearButton", "showSpinButtons", "step", "stylingMode", "tabIndex", "text", "useLargeSpinButtons", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOptionChanged", "onPaste", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "formatChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "invalidValueMessageChange", "isValidChange", "labelChange", "labelModeChange", "maxChange", "minChange", "modeChange", "nameChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showClearButtonChange", "showSpinButtonsChange", "stepChange", "stylingModeChange", "tabIndexChange", "textChange", "useLargeSpinButtonsChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "component", type: i8.DxSelectBoxComponent, selector: "dx-select-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "buttons", "dataSource", "deferRendering", "disabled", "displayExpr", "displayValue", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "items", "itemTemplate", "label", "labelMode", "maxLength", "minSearchLength", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectedItem", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showSelectionControls", "spellcheck", "stylingMode", "tabIndex", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCopy", "onCustomItemCreating", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onOpened", "onOptionChanged", "onPaste", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "displayValueChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxLengthChange", "minSearchLengthChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectedItemChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showSelectionControlsChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "component", type: i9.DxTagBoxComponent, selector: "dx-tag-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "applyValueMode", "buttons", "dataSource", "deferRendering", "disabled", "displayExpr", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hideSelectedItems", "hint", "hoverStateEnabled", "inputAttr", "isValid", "items", "itemTemplate", "label", "labelMode", "maxDisplayedTags", "maxFilterQueryLength", "maxLength", "minSearchLength", "multiline", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectAllMode", "selectAllText", "selectedItems", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showMultiTagOnly", "showSelectionControls", "stylingMode", "tabIndex", "tagTemplate", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCustomItemCreating", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onMultiTagPreparing", "onOpened", "onOptionChanged", "onSelectAllValueChanged", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "applyValueModeChange", "buttonsChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hideSelectedItemsChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxDisplayedTagsChange", "maxFilterQueryLengthChange", "maxLengthChange", "minSearchLengthChange", "multilineChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectAllModeChange", "selectAllTextChange", "selectedItemsChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showMultiTagOnlyChange", "showSelectionControlsChange", "stylingModeChange", "tabIndexChange", "tagTemplateChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "component", type: i10.DxTextBoxComponent, selector: "dx-text-box", inputs: ["accessKey", "activeStateEnabled", "buttons", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "label", "labelMode", "mask", "maskChar", "maskInvalidMessage", "maskRules", "maxLength", "mode", "name", "placeholder", "readOnly", "rtlEnabled", "showClearButton", "showMaskMode", "spellcheck", "stylingMode", "tabIndex", "text", "useMaskedValue", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOptionChanged", "onPaste", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "labelChange", "labelModeChange", "maskChange", "maskCharChange", "maskInvalidMessageChange", "maskRulesChange", "maxLengthChange", "modeChange", "nameChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showClearButtonChange", "showMaskModeChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useMaskedValueChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "directive", type: i11.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i11.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i12.UserAccessComponent, selector: "app-user-access", inputs: ["userOptionContainer"], outputs: ["userOptionContainerChange"] }, { kind: "component", type: i13.LoaderComponent, selector: "app-loader" }, { kind: "component", type: i14.GammaGeoChartComponent, selector: "app-gamma-geo-chart", inputs: ["rightClickEnable", "chartDataSource"], outputs: ["getTableConfigOutPut", "oRowClick", "onrightClickContextSelection"] }, { kind: "pipe", type: i4.JsonPipe, name: "json" }] });
|
|
550
|
+
GeoMapComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: GeoMapComponent, selector: "app-geo-map", inputs: { chartconfigData: ["datasetmodal", "chartconfigData"] }, outputs: { createOtherComponentView: "createOtherComponentView" }, ngImport: i0, template: "<div class=\"flex flex-wrap\">\n <div class=\"w-full mx-2 border-r\">\n <ng-container *ngIf=\"!isJsonPreview\">\n <pre><code>{{jsaonDatasource | json}}</code></pre>\n </ng-container>\n <ng-container *ngIf=\"isJsonPreview\">\n <app-gamma-geo-chart [chartDataSource]=\"chartDataSourceForMap\"></app-gamma-geo-chart>\n <!-- <app-google-geo-map [chartDataSource]=\"chartDataSourceForMap\"></app-google-geo-map> -->\n\n <div #dynamicContainer></div>\n\n </ng-container>\n </div>\n <div class=\"w-full mx-2\">\n\n <div class=\"mb-4 border-b border-gray-200 dark:border-gray-700\">\n <ul class=\"flex flex-wrap -mb-px text-sm font-medium text-center\" role=\"tablist\">\n <li class=\"me-2\" role=\"presentation\">\n <button class=\"inline-block p-4 border-b-2 rounded-t-lg\" [ngClass]=\"{ \n 'text-purple-600 border-purple-600 dark:text-purple-500 dark:border-purple-500': activeTab === 'basic',\n 'text-gray-500 dark:text-gray-400 border-transparent': activeTab !== 'basic' \n }\" (click)=\"setActiveTab('basic')\" type=\"button\" role=\"tab\">\n Basic\n </button>\n </li>\n <li class=\"me-2\" role=\"presentation\">\n <button class=\"inline-block p-4 border-b-2 rounded-t-lg\" [ngClass]=\"{ \n 'text-purple-600 border-purple-600 dark:text-purple-500 dark:border-purple-500': activeTab === 'chart_config',\n 'text-gray-500 dark:text-gray-400 border-transparent': activeTab !== 'chart_config' \n }\" (click)=\"setActiveTab('chart_config')\" type=\"button\" role=\"tab\">\n Chart Columns\n </button>\n </li>\n <li class=\"me-2\" role=\"presentation\">\n <button class=\"inline-block p-4 border-b-2 rounded-t-lg\" [ngClass]=\"{\n 'text-purple-600 border-purple-600 dark:text-purple-500 dark:border-purple-500': activeTab === 'properties',\n 'text-gray-500 dark:text-gray-400 border-transparent': activeTab !== 'properties'\n }\" (click)=\"setActiveTab('properties')\" type=\"button\" role=\"tab\">\n Properties\n </button>\n </li>\n <li class=\"me-2\" role=\"presentation\">\n <button class=\"inline-block p-4 border-b-2 rounded-t-lg\" [ngClass]=\"{\n 'text-purple-600 border-purple-600 dark:text-purple-500 dark:border-purple-500': activeTab === 'permission',\n 'text-gray-500 dark:text-gray-400 border-transparent': activeTab !== 'permission'\n }\" (click)=\"setActiveTab('permission')\" type=\"button\" role=\"tab\">\n Manage Permissions\n </button>\n </li>\n\n </ul>\n </div>\n\n <div id=\"default-styled-tab-content\">\n <div *ngIf=\"activeTab === 'basic'\">\n <div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Filter Title\n Config\n </div>\n <div class=\"flex pt-2 border-x border-b\">\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Map Library </div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"['Google Maps']\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Select Map type </div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"chartViewTypeDataSource\" displayExpr=\"name\"\n valueExpr=\"value\" [(ngModel)]=\"mapType\"\n (onValueChanged)=\"changeMapType($event)\"></dx-select-box>\n </div>\n\n <ng-container *ngIf=\"mapType == 'heatMap'\">\n <div class=\"px-1 mb-1 w-1/3\">\n\n <div class=\"text-md mb-1\"> Heat Map Category </div>\n <dx-select-box [searchEnabled]=\"true\" [dataSource]=\"heatMapTypeDatasource\"\n displayExpr=\"name\" valueExpr=\"value\" [(ngModel)]=\"heatMapConfig.heatMapCategory\"\n (onValueChanged)=\"heatMapCategory($event)\"></dx-select-box>\n </div>\n </ng-container>\n </div>\n <ng-container *ngIf=\"mapType == 'geoMap'\">\n <div class=\"flex pt-2 border-x border-b\">\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Region </div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"regionData\"\n [(ngModel)]=\"tableDataConfig.region\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-1/3\" *ngIf=\"tableDataConfig.region == 'city'\">\n <div class=\"text-md mb-1\"> Type Region Code</div>\n <dx-text-box [(ngModel)]=\"tableDataConfig.regionCode\"></dx-text-box>\n </div>\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 flex justify-between\">\n <!-- <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Title</div>\n <dx-text-box [(ngModel)]=\"tableDataConfig.title\"></dx-text-box>\n </div> -->\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Argument Field</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"tableDataConfig.argumentField\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Chartvalu Field</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"tableDataConfig.chartValueField\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> size</div>\n <dx-text-box [(ngModel)]=\"tableDataConfig.size\"></dx-text-box>\n </div>\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\">Background Color</div>\n <dx-color-box [(ngModel)]=\"tableDataConfig.backgroundColor\"></dx-color-box>\n </div>\n <!-- <div class=\"px-4 mt-6 w-full\">\n <dx-check-box [value]=\"tableDataConfig.commonConfig.isSearchBox\"\n [(ngModel)]=\"tableDataConfig.commonConfig.isSearchBox\"\n text=\"Search Box\"></dx-check-box>\n \n </div> -->\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-2\"> Display Formate </div>\n <dx-select-box [items]=\"['daily','hourly','monthly']\"\n [(ngModel)]=\"table_columns_config.kpiConfig.formate\"\n [readOnly]=\"false\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-2\"> Key To Pass </div>\n <dx-tag-box [items]=\"configColume\"\n [(ngModel)]=\"table_columns_config.kpiConfig.keyToPass\"></dx-tag-box>\n </div>\n </div>\n </div>\n <div class=\" pt-2 border-x border-b \">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Colors\n </div>\n <div class=\"flex flex-wrap px-1 mb-2 mt-2\">\n <div class=\"flex mr-2 mb-2\" *ngFor=\"let color of tableDataConfig.colors; let i = index\">\n <div class=\"mr-2\">\n <dx-color-box [(ngModel)]=\"tableDataConfig.colors[i]\"\n (onValueChanged)=\"onColorChange($event.value, i)\"></dx-color-box>\n </div>\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer px-2\"\n (click)=\"removeColor(i)\"><i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n <!-- <div class=\"px-2\"> <button class=\"{{commonService.btn_danger_sm}}\" (click)=\"removeColor(i)\">Remove</button></div> -->\n </div>\n\n </div>\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_success_sm}}\" (click)=\"addColor()\">Add Color</button>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"mapType == 'choroplethMap'\">\n <div class=\"flex flex-row pt-2 border-x border-b\">\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Map Zoom </div>\n <dx-text-box [(ngModel)]=\"choroplethMapConfig.zoom\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 mt-6 w-full\">\n <dx-check-box [(ngModel)]=\"isCenterdChoroplethMap\"\n text=\"Centerd Position\"></dx-check-box>\n </div>\n\n <ng-container *ngIf=\"isCenterdChoroplethMap\">\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Select Latitude Key</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"centarLaitngObject.latKey\"\n (onValueChanged)=\"onLatLngKeyChange($event)\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Select Longitude Key</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"centarLaitngObject.lngKey\"\n (onValueChanged)=\"onLatLngKeyChange($event)\"></dx-select-box>\n </div>\n\n </ng-container>\n\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Map Center Latitude</div>\n <dx-text-box [(ngModel)]=\"choroplethMapConfig.centerLat\"\n [readOnly]=\"isCenterdChoroplethMap\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Map Center Longitude</div>\n <dx-text-box [(ngModel)]=\"choroplethMapConfig.centerLng\"\n [readOnly]=\"isCenterdChoroplethMap\"></dx-text-box>\n </div>\n\n\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 flex flex-row justify-between\">\n\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Argument Field</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"choroplethMapConfig.argumentField\"></dx-select-box>\n </div>\n\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> size</div>\n <dx-text-box [(ngModel)]=\"choroplethMapConfig.size\"></dx-text-box>\n </div>\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\">Color One</div>\n <dx-color-box [(ngModel)]=\"choroplethMapConfig.colorOne\"></dx-color-box>\n </div>\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\">Color Two</div>\n <dx-color-box [(ngModel)]=\"choroplethMapConfig.colorTwo\"></dx-color-box>\n </div>\n\n\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-2\"> Display Formate </div>\n <dx-select-box [items]=\"['daily','hourly','monthly']\"\n [(ngModel)]=\"table_columns_config.kpiConfig.formate\"\n [readOnly]=\"false\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-2\"> Key To Pass </div>\n <dx-tag-box [items]=\"configColume\"\n [(ngModel)]=\"table_columns_config.kpiConfig.keyToPass\"></dx-tag-box>\n </div>\n\n </div>\n <div class=\"my-2 flex-row justify-between\">\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Gjson File Path</div>\n <dx-text-box [(ngModel)]=\"choroplethMapConfig.gjsonFilePath\"></dx-text-box>\n </div>\n\n </div>\n <div class=\"my-2 flex flex-row justify-between\">\n <div class=\"px-1 mb-2 mt-6 w-full\">\n <dx-check-box [(ngModel)]=\"choroplethMapConfig.isValueFieldRangeSlider\"\n text=\"Range Slider\"></dx-check-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Slider Speed</div>\n <dx-number-box [(ngModel)]=\"choroplethMapConfig.slideSpeed\"></dx-number-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Value For Slider</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"choroplethMapConfig.sliderValueField\"></dx-select-box>\n </div>\n </div>\n </div>\n\n <div class=\"w-1/4 px-2 m-3\">\n <div class=\"text-md mb-1 mt-8\"></div>\n <dx-check-box [(ngModel)]=\"choroplethMapConfig.isDataAggregation\"\n (ngModelChange)=\"onDataGroupByChange($event)\"\n text=\"Apply Data Aggregation\"></dx-check-box>\n </div>\n\n <div class=\"flex flex-col rounded border p-3 m-6\" *ngIf=\"choroplethMapConfig.isDataAggregation\">\n <div class=\"px-1 my-4 w-1/3\">\n <div class=\"text-md mb-2\">Group By Columns</div>\n <dx-tag-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"dataAggregateGroupByColume\"></dx-tag-box>\n </div>\n <div class=\"border p-2\">\n <div class=\"my-2 flex flex-row border-b\"\n *ngFor=\"let item of dataAggregationContainer; let i = index\">\n\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-2\">Aggregation Columns</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"item.aggregateDataField\"></dx-select-box>\n </div>\n <div class=\" px-2 mb-1 w-full\">\n <div class=\"text-md mb-2\">Function Type</div>\n <dx-select-box [searchEnabled]=\"true\"\n [items]=\"['sum','avg','min','max','count']\"\n [(ngModel)]=\"item.aggregateFunctionType\"></dx-select-box>\n </div>\n\n <div class=\"text-center mt-6 w-1/6\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\"\n (click)=\"deleteAggregationColume(i)\"><i class=\"fa fa-trash-o\"\n aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\"\n (click)=\"addAggregationColume()\">Add\n Colume</button>\n <button class=\"{{commonService.btn_success_sm}} cursor-pointer\"\n (click)=\"saveAggregationColume()\">Save Aggregation</button>\n </div>\n </div>\n\n </div>\n\n </ng-container>\n\n <ng-container\n *ngIf=\"heatMapConfig.heatMapCategory == 'heatMapOnly' || heatMapConfig.heatMapCategory == 'heatMapMarker' || heatMapConfig.heatMapCategory == 'heatMapAndMarker'\">\n <div class=\"flex-col\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\">\n Center Location Config\n </div>\n <div>\n <div class=\"flex pt-2 border-x border-b\">\n <!-- <div class=\"px-1 mb-1 w-1/4\">\n <div class=\"text-md mb-1\"> Latitude </div>\n <dx-text-box [(ngModel)]=\"heatMapConfig.centerLatitude\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-1 w-1/4\">\n <div class=\"text-md mb-1\"> Longitude </div>\n <dx-text-box [(ngModel)]=\"heatMapConfig.centerLongitude\"></dx-text-box>\n </div> -->\n <div class=\"px-1 mb-1 w-1/4\"\n *ngIf=\"heatMapConfig.heatMapCategory != 'heatMapAndMarker'\">\n <div class=\"text-md mb-1\"> Zoom Label </div>\n <dx-text-box [(ngModel)]=\"heatMapConfig.zoom\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-1 w-1/4\">\n <div class=\"text-md mb-1\"> Custom Icons </div>\n <dx-text-box [(ngModel)]=\"heatMapConfig.icon\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-1 w-1/4\">\n <div class=\"text-md mb-1\"> size</div>\n <dx-text-box [(ngModel)]=\"heatMapConfig.size\"></dx-text-box>\n </div>\n </div>\n </div>\n </div>\n <div class=\"flex-col\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\">\n Location Marker Config\n </div>\n <div>\n <div class=\"flex pt-2 border-x border-b\">\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Latitude </div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"heatMapConfig.markerLatitude\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Longitude </div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"heatMapConfig.markerLongitude\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-2\"> Display Formate </div>\n <dx-select-box [items]=\"['daily','hourly','monthly']\"\n [(ngModel)]=\"table_columns_config.kpiConfig.formate\"\n [readOnly]=\"false\"></dx-select-box>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"mapType == 'bubbleMap'\">\n <div class=\"flex-col\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\">\n Bubble Map Config\n </div>\n <div>\n <div class=\"flex pt-2 border-x border-b\">\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Argument Value </div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"bubbleMapConfig.agrumentValue\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-1/4\">\n <div class=\"text-md mb-1\"> Bubble Color </div>\n <dx-color-box [(ngModel)]=\"bubbleMapConfig.bubbleColor\"></dx-color-box>\n </div>\n <div class=\"px-1 mb-1 w-1/4\">\n <div class=\"text-md mb-1\">Bubble Minimum size</div>\n <dx-text-box [(ngModel)]=\"bubbleMapConfig.bubbleMinimumSize\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-1 w-1/4\">\n <div class=\"text-md mb-1\">Bubble Maximum size</div>\n <dx-text-box [(ngModel)]=\"bubbleMapConfig.bubbleMaximumSize\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-1 w-1/4\">\n <div class=\"text-md mb-1\"> size</div>\n <dx-text-box [(ngModel)]=\"bubbleMapConfig.size\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-1 w-1/4\">\n <div class=\"text-md mb-1\"> Short By</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"bubbleMapConfig.sortBy\"></dx-select-box>\n </div>\n <!-- <div class=\"px-1 mb-1 w-1/4\" *ngIf=\"heatMapConfig.heatMapCategory != 'heatMapAndMarker'\">\n <div class=\"text-md mb-1\"> Zoom Label </div>\n <dx-text-box [(ngModel)]=\"heatMapConfig.zoom\"></dx-text-box>\n </div> -->\n </div>\n </div>\n </div>\n <div class=\"flex-col\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\">\n Location Marker Config\n </div>\n <div>\n <div class=\"flex pt-2 border-x border-b\">\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Latitude </div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"bubbleMapConfig.markerLatitude\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Longitude </div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"bubbleMapConfig.markerLongitude\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-2\"> Display Formate </div>\n <dx-select-box [items]=\"['daily','hourly','monthly']\"\n [(ngModel)]=\"table_columns_config.kpiConfig.formate\"\n [readOnly]=\"false\"></dx-select-box>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n\n </div>\n\n\n\n </div>\n <div *ngIf=\"activeTab === 'chart_config'\">\n <div class=\"h-full overflow-x-auto\">\n <div class=\"flex flex-col flex-auto min-w-0\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\">\n Tooltip Columns\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 border-b flex flex-row\"\n *ngFor=\"let item of tableDataConfig.chart_config; let i = index;\">\n <!-- <div class=\"px-1 mb-2 mt-6 w-full\">\n <dx-check-box [value]=\"item.visible\" [(ngModel)]=\"item.visible\"\n text=\"Visiblity\"></dx-check-box>\n </div> -->\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Value Field</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"item.dataField\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Caption</div>\n <dx-text-box [(ngModel)]=\"item.caption\"></dx-text-box>\n </div>\n\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\">Display For</div>\n <dx-select-box [items]=\"['map', 'tooltip']\"\n [(ngModel)]=\"item.displayFor\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2 w-full\">\n <div class=\"text-md mb-2\"> UI Function</div>\n <dx-select-box [items]=\"enrichNameList\" [(ngModel)]=\"item.enrichName\"\n [searchEnabled]=\"true\"></dx-select-box>\n </div>\n\n <div class=\"text-center mt-8 w-full\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== tableDataConfig.chart_config.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\"\n (click)=\"deleteColumns(i)\"><i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n </div>\n </div>\n </div>\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\" (click)=\"addColumns()\">Add\n Columns</button>\n </div>\n </div>\n </div>\n <div *ngIf=\"activeTab === 'properties'\">\n <div class=\"h-full overflow-x-auto\">\n <app-loader *ngIf=\"isLoader\"></app-loader>\n <ng-container *ngIf=\"!isLoader\">\n <div class=\"flex flex-row justify-between border-b py-3\">\n <div class=\"mx-2\">\n <dx-check-box [value]=\"viewProperties.enableClickEvent\"\n [(ngModel)]=\"viewProperties.enableClickEvent\"\n text=\"Enable Click Event\"></dx-check-box>\n </div>\n <div class=\"mx-2\">\n <dx-check-box [value]=\"viewProperties.enableRightClickEvent\"\n [(ngModel)]=\"viewProperties.enableRightClickEvent\"\n text=\"Enable Right Click\"></dx-check-box>\n </div>\n </div>\n <div class=\"w-full p-2\" *ngIf=\"viewProperties.enableClickEvent\">\n\n <div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Event\n Type\n Option\n </div>\n <div class=\"w-full p-3 border-x border-b \">\n <div class=\"flex flex-row\">\n <div class=\"w-full\">\n <div class=\"text-md mb-2\"> Event Type</div>\n </div>\n <div class=\"w-full\">\n <dx-select-box [items]=\"['drilldown','optionalDrillDown']\"\n (onValueChanged)=\"getSelectedEventType($event)\"\n [(ngModel)]=\"viewProperties.clickEventOptions.eventType\"></dx-select-box>\n </div>\n </div>\n <ng-container *ngIf=\"viewProperties.clickEventOptions.eventType == 'drilldown'\">\n <div class=\"flex flex-row justify-between mt-3\">\n <div class=\"w-full\">\n <div class=\"text-md mb-2\"> Associated Views</div>\n <dx-tag-box [items]=\"allConfiguredViews\"\n [(ngModel)]=\"viewProperties.clickEventOptions.associatedViews\"\n valueExpr=\"viewId\" displayExpr=\"viewName\"\n [showSelectionControls]=\"true\" [searchEnabled]=\"true\"></dx-tag-box>\n </div>\n </div>\n </ng-container>\n <ng-container\n *ngIf=\"viewProperties.clickEventOptions.eventType == 'optionalDrillDown'\">\n <div class=\"flex flex-row justify-between mt-3\">\n <div class=\"w-full\">\n <ng-container\n *ngFor=\"let item of optionalDrilDownDataSource;let i = index;\">\n\n <div class=\"flex flex-row justify-between\">\n <div class=\"mx-2 w-full\">\n <div class=\"text-md mb-2\"> Associated Views</div>\n <dx-tag-box [items]=\"allConfiguredViews\"\n [(ngModel)]=\"item.viewId\" valueExpr=\"viewId\"\n displayExpr=\"viewName\" [showSelectionControls]=\"true\"\n [maxDisplayedTags]=\"2\"\n [searchEnabled]=\"true\"></dx-tag-box>\n\n </div>\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\"> Associated Params</div>\n <dx-text-box\n [(ngModel)]=\"item.filterCondition\"></dx-text-box>\n </div>\n <div class=\"mx-2\">\n <button\n class=\"{{commonService.btn_danger_sm}} cursor-pointer mt-8\"\n (click)=\"deleteAssociatedParams(i)\"><i\n class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </ng-container>\n <div class=\"flex flex-row justify-end mt-4\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\"\n (click)=\"addAssociatedParams()\">Add\n Params</button>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n </div>\n\n </div>\n </ng-container>\n <button class=\"{{commonService.btn_light_md}} cursor-pointer mt-2\"\n (click)=\"resetViewProprstise()\">Reset All</button>\n </div>\n </div>\n <div *ngIf=\"activeTab === 'permission'\">\n <div class=\"h-full overflow-x-auto\">\n <app-user-access [(userOptionContainer)]=\"userOptionContainer\">\n </app-user-access>\n </div>\n </div>\n\n </div>\n\n\n </div>\n</div>\n\n<div class=\"flex flex-row border-t pl-3\">\n <div class=\"flex justify-start mx-1\">\n <button class=\"{{commonService.btn_warning_md}} cursor-pointer mt-2\" (click)=\"viewMapForTest()\">\n Preview</button>\n <button class=\"{{commonService.btn_primary_md}} cursor-pointer mt-2\" (click)=\"isJsonPreview = false\">Data\n Preview</button>\n </div>\n <div class=\"flex justify-end mx-1 flex-grow\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mt-2\"\n (click)=\"getSaveChartConfig()\">Submit</button>\n </div>\n</div>", styles: [""], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.DxCheckBoxComponent, selector: "dx-check-box", inputs: ["accessKey", "activeStateEnabled", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "iconSize", "isValid", "name", "readOnly", "rtlEnabled", "tabIndex", "text", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "visible", "width"], outputs: ["onContentReady", "onDisposing", "onInitialized", "onOptionChanged", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "iconSizeChange", "isValidChange", "nameChange", "readOnlyChange", "rtlEnabledChange", "tabIndexChange", "textChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "component", type: i6.DxColorBoxComponent, selector: "dx-color-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "applyButtonText", "applyValueMode", "buttons", "cancelButtonText", "deferRendering", "disabled", "dropDownButtonTemplate", "dropDownOptions", "editAlphaChannel", "elementAttr", "fieldTemplate", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "keyStep", "label", "labelMode", "name", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "showClearButton", "showDropDownButton", "stylingMode", "tabIndex", "text", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "visible", "width"], outputs: ["onChange", "onClosed", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOpened", "onOptionChanged", "onPaste", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "applyButtonTextChange", "applyValueModeChange", "buttonsChange", "cancelButtonTextChange", "deferRenderingChange", "disabledChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "editAlphaChannelChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "keyStepChange", "labelChange", "labelModeChange", "nameChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showClearButtonChange", "showDropDownButtonChange", "stylingModeChange", "tabIndexChange", "textChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "component", type: i7.DxNumberBoxComponent, selector: "dx-number-box", inputs: ["accessKey", "activeStateEnabled", "buttons", "disabled", "elementAttr", "focusStateEnabled", "format", "height", "hint", "hoverStateEnabled", "inputAttr", "invalidValueMessage", "isValid", "label", "labelMode", "max", "min", "mode", "name", "placeholder", "readOnly", "rtlEnabled", "showClearButton", "showSpinButtons", "step", "stylingMode", "tabIndex", "text", "useLargeSpinButtons", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOptionChanged", "onPaste", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "formatChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "invalidValueMessageChange", "isValidChange", "labelChange", "labelModeChange", "maxChange", "minChange", "modeChange", "nameChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showClearButtonChange", "showSpinButtonsChange", "stepChange", "stylingModeChange", "tabIndexChange", "textChange", "useLargeSpinButtonsChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "component", type: i8.DxSelectBoxComponent, selector: "dx-select-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "buttons", "dataSource", "deferRendering", "disabled", "displayExpr", "displayValue", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "items", "itemTemplate", "label", "labelMode", "maxLength", "minSearchLength", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectedItem", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showSelectionControls", "spellcheck", "stylingMode", "tabIndex", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCopy", "onCustomItemCreating", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onOpened", "onOptionChanged", "onPaste", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "displayValueChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxLengthChange", "minSearchLengthChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectedItemChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showSelectionControlsChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "component", type: i9.DxTagBoxComponent, selector: "dx-tag-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "applyValueMode", "buttons", "dataSource", "deferRendering", "disabled", "displayExpr", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hideSelectedItems", "hint", "hoverStateEnabled", "inputAttr", "isValid", "items", "itemTemplate", "label", "labelMode", "maxDisplayedTags", "maxFilterQueryLength", "maxLength", "minSearchLength", "multiline", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectAllMode", "selectAllText", "selectedItems", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showMultiTagOnly", "showSelectionControls", "stylingMode", "tabIndex", "tagTemplate", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCustomItemCreating", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onMultiTagPreparing", "onOpened", "onOptionChanged", "onSelectAllValueChanged", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "applyValueModeChange", "buttonsChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hideSelectedItemsChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxDisplayedTagsChange", "maxFilterQueryLengthChange", "maxLengthChange", "minSearchLengthChange", "multilineChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectAllModeChange", "selectAllTextChange", "selectedItemsChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showMultiTagOnlyChange", "showSelectionControlsChange", "stylingModeChange", "tabIndexChange", "tagTemplateChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "component", type: i10.DxTextBoxComponent, selector: "dx-text-box", inputs: ["accessKey", "activeStateEnabled", "buttons", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "label", "labelMode", "mask", "maskChar", "maskInvalidMessage", "maskRules", "maxLength", "mode", "name", "placeholder", "readOnly", "rtlEnabled", "showClearButton", "showMaskMode", "spellcheck", "stylingMode", "tabIndex", "text", "useMaskedValue", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOptionChanged", "onPaste", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "labelChange", "labelModeChange", "maskChange", "maskCharChange", "maskInvalidMessageChange", "maskRulesChange", "maxLengthChange", "modeChange", "nameChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showClearButtonChange", "showMaskModeChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useMaskedValueChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "directive", type: i11.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i11.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i12.UserAccessComponent, selector: "app-user-access", inputs: ["userOptionContainer"], outputs: ["userOptionContainerChange"] }, { kind: "component", type: i13.LoaderComponent, selector: "app-loader" }, { kind: "component", type: i14.GammaGeoChartComponent, selector: "app-gamma-geo-chart", inputs: ["rightClickEnable", "chartDataSource"], outputs: ["getTableConfigOutPut", "oRowClick", "onrightClickContextSelection"] }, { kind: "pipe", type: i4.JsonPipe, name: "json" }] });
|
|
439
551
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GeoMapComponent, decorators: [{
|
|
440
552
|
type: Component,
|
|
441
|
-
args: [{ selector: 'app-geo-map', template: "<div class=\"flex flex-wrap\">\n <div class=\"w-full mx-2 border-r\">\n <ng-container *ngIf=\"!isJsonPreview\">\n <pre><code>{{jsaonDatasource | json}}</code></pre>\n </ng-container>\n <ng-container *ngIf=\"isJsonPreview\">\n <app-gamma-geo-chart [chartDataSource]=\"chartDataSourceForMap\"></app-gamma-geo-chart>\n <!-- <app-google-geo-map [chartDataSource]=\"chartDataSourceForMap\"></app-google-geo-map> -->\n\n <div #dynamicContainer></div>\n\n </ng-container>\n </div>\n <div class=\"w-full mx-2\">\n\n <div class=\"mb-4 border-b border-gray-200 dark:border-gray-700\">\n <ul class=\"flex flex-wrap -mb-px text-sm font-medium text-center\" role=\"tablist\">\n <li class=\"me-2\" role=\"presentation\">\n <button class=\"inline-block p-4 border-b-2 rounded-t-lg\" [ngClass]=\"{ \n 'text-purple-600 border-purple-600 dark:text-purple-500 dark:border-purple-500': activeTab === 'basic',\n 'text-gray-500 dark:text-gray-400 border-transparent': activeTab !== 'basic' \n }\" (click)=\"setActiveTab('basic')\" type=\"button\" role=\"tab\">\n Basic\n </button>\n </li>\n <li class=\"me-2\" role=\"presentation\">\n <button class=\"inline-block p-4 border-b-2 rounded-t-lg\" [ngClass]=\"{ \n 'text-purple-600 border-purple-600 dark:text-purple-500 dark:border-purple-500': activeTab === 'chart_config',\n 'text-gray-500 dark:text-gray-400 border-transparent': activeTab !== 'chart_config' \n }\" (click)=\"setActiveTab('chart_config')\" type=\"button\" role=\"tab\">\n Chart Columns\n </button>\n </li>\n <li class=\"me-2\" role=\"presentation\">\n <button class=\"inline-block p-4 border-b-2 rounded-t-lg\" [ngClass]=\"{\n 'text-purple-600 border-purple-600 dark:text-purple-500 dark:border-purple-500': activeTab === 'properties',\n 'text-gray-500 dark:text-gray-400 border-transparent': activeTab !== 'properties'\n }\" (click)=\"setActiveTab('properties')\" type=\"button\" role=\"tab\">\n Properties\n </button>\n </li>\n <li class=\"me-2\" role=\"presentation\">\n <button class=\"inline-block p-4 border-b-2 rounded-t-lg\" [ngClass]=\"{\n 'text-purple-600 border-purple-600 dark:text-purple-500 dark:border-purple-500': activeTab === 'permission',\n 'text-gray-500 dark:text-gray-400 border-transparent': activeTab !== 'permission'\n }\" (click)=\"setActiveTab('permission')\" type=\"button\" role=\"tab\">\n Manage Permissions\n </button>\n </li>\n\n </ul>\n </div>\n\n <div id=\"default-styled-tab-content\">\n <div *ngIf=\"activeTab === 'basic'\">\n <div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Filter Title\n Config\n </div>\n <div class=\"flex pt-2 border-x border-b\">\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Map Library </div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"['Google Maps']\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Select Map type </div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"chartViewTypeDataSource\" displayExpr=\"name\"\n valueExpr=\"value\" [(ngModel)]=\"mapType\"\n (onValueChanged)=\"changeMapType($event)\"></dx-select-box>\n </div>\n\n <ng-container *ngIf=\"mapType == 'heatMap'\">\n <div class=\"px-1 mb-1 w-1/3\">\n\n <div class=\"text-md mb-1\"> Heat Map Category </div>\n <dx-select-box [searchEnabled]=\"true\" [dataSource]=\"heatMapTypeDatasource\"\n displayExpr=\"name\" valueExpr=\"value\" [(ngModel)]=\"heatMapConfig.heatMapCategory\"\n (onValueChanged)=\"heatMapCategory($event)\"></dx-select-box>\n </div>\n </ng-container>\n </div>\n <ng-container *ngIf=\"mapType == 'geoMap'\">\n <div class=\"flex pt-2 border-x border-b\">\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Region </div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"regionData\"\n [(ngModel)]=\"tableDataConfig.region\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-1/3\" *ngIf=\"tableDataConfig.region == 'city'\">\n <div class=\"text-md mb-1\"> Type Region Code</div>\n <dx-text-box [(ngModel)]=\"tableDataConfig.regionCode\"></dx-text-box>\n </div>\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 flex justify-between\">\n <!-- <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Title</div>\n <dx-text-box [(ngModel)]=\"tableDataConfig.title\"></dx-text-box>\n </div> -->\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Argument Field</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"tableDataConfig.argumentField\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Chartvalu Field</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"tableDataConfig.chartValueField\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> size</div>\n <dx-text-box [(ngModel)]=\"tableDataConfig.size\"></dx-text-box>\n </div>\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\">Background Color</div>\n <dx-color-box [(ngModel)]=\"tableDataConfig.backgroundColor\"></dx-color-box>\n </div>\n <!-- <div class=\"px-4 mt-6 w-full\">\n <dx-check-box [value]=\"tableDataConfig.commonConfig.isSearchBox\"\n [(ngModel)]=\"tableDataConfig.commonConfig.isSearchBox\"\n text=\"Search Box\"></dx-check-box>\n \n </div> -->\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-2\"> Display Formate </div>\n <dx-select-box [items]=\"['daily','hourly','monthly']\"\n [(ngModel)]=\"table_columns_config.kpiConfig.formate\"\n [readOnly]=\"false\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-2\"> Key To Pass </div>\n <dx-tag-box [items]=\"configColume\"\n [(ngModel)]=\"table_columns_config.kpiConfig.keyToPass\"></dx-tag-box>\n </div>\n </div>\n </div>\n <div class=\" pt-2 border-x border-b \">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Colors\n </div>\n <div class=\"flex flex-wrap px-1 mb-2 mt-2\">\n <div class=\"flex mr-2 mb-2\" *ngFor=\"let color of tableDataConfig.colors; let i = index\">\n <div class=\"mr-2\">\n <dx-color-box [(ngModel)]=\"tableDataConfig.colors[i]\"\n (onValueChanged)=\"onColorChange($event.value, i)\"></dx-color-box>\n </div>\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer px-2\"\n (click)=\"removeColor(i)\"><i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n <!-- <div class=\"px-2\"> <button class=\"{{commonService.btn_danger_sm}}\" (click)=\"removeColor(i)\">Remove</button></div> -->\n </div>\n\n </div>\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_success_sm}}\" (click)=\"addColor()\">Add Color</button>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"mapType == 'choroplethMap'\">\n <div class=\"flex flex-row pt-2 border-x border-b\">\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Map Zoom </div>\n <dx-text-box [(ngModel)]=\"choroplethMapConfig.zoom\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 mt-6 w-full\">\n <dx-check-box [(ngModel)]=\"isCenterdChoroplethMap\"\n text=\"Centerd Position\"></dx-check-box>\n </div>\n\n <ng-container *ngIf=\"isCenterdChoroplethMap\">\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Select Latitude Key</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"centarLaitngObject.latKey\"\n (onValueChanged)=\"onLatLngKeyChange($event)\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Select Longitude Key</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"centarLaitngObject.lngKey\"\n (onValueChanged)=\"onLatLngKeyChange($event)\"></dx-select-box>\n </div>\n\n </ng-container>\n\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Map Center Latitude</div>\n <dx-text-box [(ngModel)]=\"choroplethMapConfig.centerLat\"\n [readOnly]=\"isCenterdChoroplethMap\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Map Center Longitude</div>\n <dx-text-box [(ngModel)]=\"choroplethMapConfig.centerLng\"\n [readOnly]=\"isCenterdChoroplethMap\"></dx-text-box>\n </div>\n\n\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 flex flex-row justify-between\">\n\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Argument Field</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"choroplethMapConfig.argumentField\"></dx-select-box>\n </div>\n\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> size</div>\n <dx-text-box [(ngModel)]=\"choroplethMapConfig.size\"></dx-text-box>\n </div>\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\">Color One</div>\n <dx-color-box [(ngModel)]=\"choroplethMapConfig.colorOne\"></dx-color-box>\n </div>\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\">Color Two</div>\n <dx-color-box [(ngModel)]=\"choroplethMapConfig.colorTwo\"></dx-color-box>\n </div>\n\n\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-2\"> Display Formate </div>\n <dx-select-box [items]=\"['daily','hourly','monthly']\"\n [(ngModel)]=\"table_columns_config.kpiConfig.formate\"\n [readOnly]=\"false\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-2\"> Key To Pass </div>\n <dx-tag-box [items]=\"configColume\"\n [(ngModel)]=\"table_columns_config.kpiConfig.keyToPass\"></dx-tag-box>\n </div>\n </div>\n <div class=\"my-2 flex-row justify-between\">\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Gjson File Path</div>\n <dx-text-box [(ngModel)]=\"choroplethMapConfig.gjsonFilePath\"></dx-text-box>\n </div>\n </div>\n <div class=\"my-2 flex flex-row justify-between\">\n <div class=\"px-1 mb-2 mt-6 w-full\">\n <dx-check-box [(ngModel)]=\"choroplethMapConfig.isValueFieldRangeSlider\"\n text=\"Range Slider\"></dx-check-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Slider Speed</div>\n <dx-number-box [(ngModel)]=\"choroplethMapConfig.slideSpeed\"></dx-number-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Value For Slider</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"choroplethMapConfig.sliderValueField\"></dx-select-box>\n </div>\n </div>\n </div>\n\n </ng-container>\n\n <ng-container\n *ngIf=\"heatMapConfig.heatMapCategory == 'heatMapOnly' || heatMapConfig.heatMapCategory == 'heatMapMarker' || heatMapConfig.heatMapCategory == 'heatMapAndMarker'\">\n <div class=\"flex-col\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\">\n Center Location Config\n </div>\n <div>\n <div class=\"flex pt-2 border-x border-b\">\n <!-- <div class=\"px-1 mb-1 w-1/4\">\n <div class=\"text-md mb-1\"> Latitude </div>\n <dx-text-box [(ngModel)]=\"heatMapConfig.centerLatitude\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-1 w-1/4\">\n <div class=\"text-md mb-1\"> Longitude </div>\n <dx-text-box [(ngModel)]=\"heatMapConfig.centerLongitude\"></dx-text-box>\n </div> -->\n <div class=\"px-1 mb-1 w-1/4\"\n *ngIf=\"heatMapConfig.heatMapCategory != 'heatMapAndMarker'\">\n <div class=\"text-md mb-1\"> Zoom Label </div>\n <dx-text-box [(ngModel)]=\"heatMapConfig.zoom\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-1 w-1/4\">\n <div class=\"text-md mb-1\"> Custom Icons </div>\n <dx-text-box [(ngModel)]=\"heatMapConfig.icon\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-1 w-1/4\">\n <div class=\"text-md mb-1\"> size</div>\n <dx-text-box [(ngModel)]=\"heatMapConfig.size\"></dx-text-box>\n </div>\n </div>\n </div>\n </div>\n <div class=\"flex-col\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\">\n Location Marker Config\n </div>\n <div>\n <div class=\"flex pt-2 border-x border-b\">\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Latitude </div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"heatMapConfig.markerLatitude\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Longitude </div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"heatMapConfig.markerLongitude\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-2\"> Display Formate </div>\n <dx-select-box [items]=\"['daily','hourly','monthly']\"\n [(ngModel)]=\"table_columns_config.kpiConfig.formate\"\n [readOnly]=\"false\"></dx-select-box>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"mapType == 'bubbleMap'\">\n <div class=\"flex-col\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\">\n Bubble Map Config\n </div>\n <div>\n <div class=\"flex pt-2 border-x border-b\">\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Argument Value </div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"bubbleMapConfig.agrumentValue\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-1/4\">\n <div class=\"text-md mb-1\"> Bubble Color </div>\n <dx-color-box [(ngModel)]=\"bubbleMapConfig.bubbleColor\"></dx-color-box>\n </div>\n <div class=\"px-1 mb-1 w-1/4\">\n <div class=\"text-md mb-1\">Bubble Minimum size</div>\n <dx-text-box [(ngModel)]=\"bubbleMapConfig.bubbleMinimumSize\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-1 w-1/4\">\n <div class=\"text-md mb-1\">Bubble Maximum size</div>\n <dx-text-box [(ngModel)]=\"bubbleMapConfig.bubbleMaximumSize\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-1 w-1/4\">\n <div class=\"text-md mb-1\"> size</div>\n <dx-text-box [(ngModel)]=\"bubbleMapConfig.size\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-1 w-1/4\">\n <div class=\"text-md mb-1\"> Short By</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"bubbleMapConfig.sortBy\"></dx-select-box>\n </div>\n <!-- <div class=\"px-1 mb-1 w-1/4\" *ngIf=\"heatMapConfig.heatMapCategory != 'heatMapAndMarker'\">\n <div class=\"text-md mb-1\"> Zoom Label </div>\n <dx-text-box [(ngModel)]=\"heatMapConfig.zoom\"></dx-text-box>\n </div> -->\n </div>\n </div>\n </div>\n <div class=\"flex-col\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\">\n Location Marker Config\n </div>\n <div>\n <div class=\"flex pt-2 border-x border-b\">\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Latitude </div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"bubbleMapConfig.markerLatitude\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Longitude </div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"bubbleMapConfig.markerLongitude\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-2\"> Display Formate </div>\n <dx-select-box [items]=\"['daily','hourly','monthly']\"\n [(ngModel)]=\"table_columns_config.kpiConfig.formate\"\n [readOnly]=\"false\"></dx-select-box>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n\n </div>\n\n\n\n </div>\n <div *ngIf=\"activeTab === 'chart_config'\">\n <div class=\"h-full overflow-x-auto\">\n <div class=\"flex flex-col flex-auto min-w-0\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\">\n Tooltip Columns\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 border-b flex flex-row\"\n *ngFor=\"let item of tableDataConfig.chart_config; let i = index;\">\n <!-- <div class=\"px-1 mb-2 mt-6 w-full\">\n <dx-check-box [value]=\"item.visible\" [(ngModel)]=\"item.visible\"\n text=\"Visiblity\"></dx-check-box>\n </div> -->\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Value Field</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"item.dataField\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Caption</div>\n <dx-text-box [(ngModel)]=\"item.caption\"></dx-text-box>\n </div>\n\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\">Display For</div>\n <dx-select-box [items]=\"['map', 'tooltip']\"\n [(ngModel)]=\"item.displayFor\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2 w-full\">\n <div class=\"text-md mb-2\"> UI Function</div>\n <dx-select-box [items]=\"enrichNameList\" [(ngModel)]=\"item.enrichName\"\n [searchEnabled]=\"true\"></dx-select-box>\n </div>\n\n <div class=\"text-center mt-8 w-full\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== tableDataConfig.chart_config.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\"\n (click)=\"deleteColumns(i)\"><i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n </div>\n </div>\n </div>\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\" (click)=\"addColumns()\">Add\n Columns</button>\n </div>\n </div>\n </div>\n <div *ngIf=\"activeTab === 'properties'\">\n <div class=\"h-full overflow-x-auto\">\n <app-loader *ngIf=\"isLoader\"></app-loader>\n <ng-container *ngIf=\"!isLoader\">\n <div class=\"flex flex-row justify-between border-b py-3\">\n <div class=\"mx-2\">\n <dx-check-box [value]=\"viewProperties.enableClickEvent\"\n [(ngModel)]=\"viewProperties.enableClickEvent\"\n text=\"Enable Click Event\"></dx-check-box>\n </div>\n <div class=\"mx-2\">\n <dx-check-box [value]=\"viewProperties.enableRightClickEvent\"\n [(ngModel)]=\"viewProperties.enableRightClickEvent\"\n text=\"Enable Right Click\"></dx-check-box>\n </div>\n </div>\n <div class=\"w-full p-2\" *ngIf=\"viewProperties.enableClickEvent\">\n\n <div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Event\n Type\n Option\n </div>\n <div class=\"w-full p-3 border-x border-b \">\n <div class=\"flex flex-row\">\n <div class=\"w-full\">\n <div class=\"text-md mb-2\"> Event Type</div>\n </div>\n <div class=\"w-full\">\n <dx-select-box [items]=\"['drilldown','optionalDrillDown']\"\n (onValueChanged)=\"getSelectedEventType($event)\"\n [(ngModel)]=\"viewProperties.clickEventOptions.eventType\"></dx-select-box>\n </div>\n </div>\n <ng-container *ngIf=\"viewProperties.clickEventOptions.eventType == 'drilldown'\">\n <div class=\"flex flex-row justify-between mt-3\">\n <div class=\"w-full\">\n <div class=\"text-md mb-2\"> Associated Views</div>\n <dx-tag-box [items]=\"allConfiguredViews\"\n [(ngModel)]=\"viewProperties.clickEventOptions.associatedViews\"\n valueExpr=\"viewId\" displayExpr=\"viewName\"\n [showSelectionControls]=\"true\" [searchEnabled]=\"true\"></dx-tag-box>\n </div>\n </div>\n </ng-container>\n <ng-container\n *ngIf=\"viewProperties.clickEventOptions.eventType == 'optionalDrillDown'\">\n <div class=\"flex flex-row justify-between mt-3\">\n <div class=\"w-full\">\n <ng-container\n *ngFor=\"let item of optionalDrilDownDataSource;let i = index;\">\n\n <div class=\"flex flex-row justify-between\">\n <div class=\"mx-2 w-full\">\n <div class=\"text-md mb-2\"> Associated Views</div>\n <dx-tag-box [items]=\"allConfiguredViews\"\n [(ngModel)]=\"item.viewId\" valueExpr=\"viewId\"\n displayExpr=\"viewName\" [showSelectionControls]=\"true\"\n [maxDisplayedTags]=\"2\"\n [searchEnabled]=\"true\"></dx-tag-box>\n\n </div>\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\"> Associated Params</div>\n <dx-text-box\n [(ngModel)]=\"item.filterCondition\"></dx-text-box>\n </div>\n <div class=\"mx-2\">\n <button\n class=\"{{commonService.btn_danger_sm}} cursor-pointer mt-8\"\n (click)=\"deleteAssociatedParams(i)\"><i\n class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </ng-container>\n <div class=\"flex flex-row justify-end mt-4\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\"\n (click)=\"addAssociatedParams()\">Add\n Params</button>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n </div>\n\n </div>\n </ng-container>\n <button class=\"{{commonService.btn_light_md}} cursor-pointer mt-2\"\n (click)=\"resetViewProprstise()\">Reset All</button>\n </div>\n </div>\n <div *ngIf=\"activeTab === 'permission'\">\n <div class=\"h-full overflow-x-auto\">\n <app-user-access [(userOptionContainer)]=\"userOptionContainer\">\n </app-user-access>\n </div>\n </div>\n\n </div>\n\n\n </div>\n</div>\n\n<div class=\"flex flex-row border-t pl-3\">\n <div class=\"flex justify-start mx-1\">\n <button class=\"{{commonService.btn_warning_md}} cursor-pointer mt-2\" (click)=\"viewMapForTest()\">\n Preview</button>\n <button class=\"{{commonService.btn_primary_md}} cursor-pointer mt-2\" (click)=\"isJsonPreview = false\">Data\n Preview</button>\n </div>\n <div class=\"flex justify-end mx-1 flex-grow\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mt-2\"\n (click)=\"getSaveChartConfig()\">Submit</button>\n </div>\n</div>" }]
|
|
553
|
+
args: [{ selector: 'app-geo-map', template: "<div class=\"flex flex-wrap\">\n <div class=\"w-full mx-2 border-r\">\n <ng-container *ngIf=\"!isJsonPreview\">\n <pre><code>{{jsaonDatasource | json}}</code></pre>\n </ng-container>\n <ng-container *ngIf=\"isJsonPreview\">\n <app-gamma-geo-chart [chartDataSource]=\"chartDataSourceForMap\"></app-gamma-geo-chart>\n <!-- <app-google-geo-map [chartDataSource]=\"chartDataSourceForMap\"></app-google-geo-map> -->\n\n <div #dynamicContainer></div>\n\n </ng-container>\n </div>\n <div class=\"w-full mx-2\">\n\n <div class=\"mb-4 border-b border-gray-200 dark:border-gray-700\">\n <ul class=\"flex flex-wrap -mb-px text-sm font-medium text-center\" role=\"tablist\">\n <li class=\"me-2\" role=\"presentation\">\n <button class=\"inline-block p-4 border-b-2 rounded-t-lg\" [ngClass]=\"{ \n 'text-purple-600 border-purple-600 dark:text-purple-500 dark:border-purple-500': activeTab === 'basic',\n 'text-gray-500 dark:text-gray-400 border-transparent': activeTab !== 'basic' \n }\" (click)=\"setActiveTab('basic')\" type=\"button\" role=\"tab\">\n Basic\n </button>\n </li>\n <li class=\"me-2\" role=\"presentation\">\n <button class=\"inline-block p-4 border-b-2 rounded-t-lg\" [ngClass]=\"{ \n 'text-purple-600 border-purple-600 dark:text-purple-500 dark:border-purple-500': activeTab === 'chart_config',\n 'text-gray-500 dark:text-gray-400 border-transparent': activeTab !== 'chart_config' \n }\" (click)=\"setActiveTab('chart_config')\" type=\"button\" role=\"tab\">\n Chart Columns\n </button>\n </li>\n <li class=\"me-2\" role=\"presentation\">\n <button class=\"inline-block p-4 border-b-2 rounded-t-lg\" [ngClass]=\"{\n 'text-purple-600 border-purple-600 dark:text-purple-500 dark:border-purple-500': activeTab === 'properties',\n 'text-gray-500 dark:text-gray-400 border-transparent': activeTab !== 'properties'\n }\" (click)=\"setActiveTab('properties')\" type=\"button\" role=\"tab\">\n Properties\n </button>\n </li>\n <li class=\"me-2\" role=\"presentation\">\n <button class=\"inline-block p-4 border-b-2 rounded-t-lg\" [ngClass]=\"{\n 'text-purple-600 border-purple-600 dark:text-purple-500 dark:border-purple-500': activeTab === 'permission',\n 'text-gray-500 dark:text-gray-400 border-transparent': activeTab !== 'permission'\n }\" (click)=\"setActiveTab('permission')\" type=\"button\" role=\"tab\">\n Manage Permissions\n </button>\n </li>\n\n </ul>\n </div>\n\n <div id=\"default-styled-tab-content\">\n <div *ngIf=\"activeTab === 'basic'\">\n <div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Filter Title\n Config\n </div>\n <div class=\"flex pt-2 border-x border-b\">\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Map Library </div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"['Google Maps']\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Select Map type </div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"chartViewTypeDataSource\" displayExpr=\"name\"\n valueExpr=\"value\" [(ngModel)]=\"mapType\"\n (onValueChanged)=\"changeMapType($event)\"></dx-select-box>\n </div>\n\n <ng-container *ngIf=\"mapType == 'heatMap'\">\n <div class=\"px-1 mb-1 w-1/3\">\n\n <div class=\"text-md mb-1\"> Heat Map Category </div>\n <dx-select-box [searchEnabled]=\"true\" [dataSource]=\"heatMapTypeDatasource\"\n displayExpr=\"name\" valueExpr=\"value\" [(ngModel)]=\"heatMapConfig.heatMapCategory\"\n (onValueChanged)=\"heatMapCategory($event)\"></dx-select-box>\n </div>\n </ng-container>\n </div>\n <ng-container *ngIf=\"mapType == 'geoMap'\">\n <div class=\"flex pt-2 border-x border-b\">\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Region </div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"regionData\"\n [(ngModel)]=\"tableDataConfig.region\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-1/3\" *ngIf=\"tableDataConfig.region == 'city'\">\n <div class=\"text-md mb-1\"> Type Region Code</div>\n <dx-text-box [(ngModel)]=\"tableDataConfig.regionCode\"></dx-text-box>\n </div>\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 flex justify-between\">\n <!-- <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Title</div>\n <dx-text-box [(ngModel)]=\"tableDataConfig.title\"></dx-text-box>\n </div> -->\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Argument Field</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"tableDataConfig.argumentField\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Chartvalu Field</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"tableDataConfig.chartValueField\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> size</div>\n <dx-text-box [(ngModel)]=\"tableDataConfig.size\"></dx-text-box>\n </div>\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\">Background Color</div>\n <dx-color-box [(ngModel)]=\"tableDataConfig.backgroundColor\"></dx-color-box>\n </div>\n <!-- <div class=\"px-4 mt-6 w-full\">\n <dx-check-box [value]=\"tableDataConfig.commonConfig.isSearchBox\"\n [(ngModel)]=\"tableDataConfig.commonConfig.isSearchBox\"\n text=\"Search Box\"></dx-check-box>\n \n </div> -->\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-2\"> Display Formate </div>\n <dx-select-box [items]=\"['daily','hourly','monthly']\"\n [(ngModel)]=\"table_columns_config.kpiConfig.formate\"\n [readOnly]=\"false\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-2\"> Key To Pass </div>\n <dx-tag-box [items]=\"configColume\"\n [(ngModel)]=\"table_columns_config.kpiConfig.keyToPass\"></dx-tag-box>\n </div>\n </div>\n </div>\n <div class=\" pt-2 border-x border-b \">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Colors\n </div>\n <div class=\"flex flex-wrap px-1 mb-2 mt-2\">\n <div class=\"flex mr-2 mb-2\" *ngFor=\"let color of tableDataConfig.colors; let i = index\">\n <div class=\"mr-2\">\n <dx-color-box [(ngModel)]=\"tableDataConfig.colors[i]\"\n (onValueChanged)=\"onColorChange($event.value, i)\"></dx-color-box>\n </div>\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer px-2\"\n (click)=\"removeColor(i)\"><i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n <!-- <div class=\"px-2\"> <button class=\"{{commonService.btn_danger_sm}}\" (click)=\"removeColor(i)\">Remove</button></div> -->\n </div>\n\n </div>\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_success_sm}}\" (click)=\"addColor()\">Add Color</button>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"mapType == 'choroplethMap'\">\n <div class=\"flex flex-row pt-2 border-x border-b\">\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Map Zoom </div>\n <dx-text-box [(ngModel)]=\"choroplethMapConfig.zoom\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 mt-6 w-full\">\n <dx-check-box [(ngModel)]=\"isCenterdChoroplethMap\"\n text=\"Centerd Position\"></dx-check-box>\n </div>\n\n <ng-container *ngIf=\"isCenterdChoroplethMap\">\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Select Latitude Key</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"centarLaitngObject.latKey\"\n (onValueChanged)=\"onLatLngKeyChange($event)\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Select Longitude Key</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"centarLaitngObject.lngKey\"\n (onValueChanged)=\"onLatLngKeyChange($event)\"></dx-select-box>\n </div>\n\n </ng-container>\n\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Map Center Latitude</div>\n <dx-text-box [(ngModel)]=\"choroplethMapConfig.centerLat\"\n [readOnly]=\"isCenterdChoroplethMap\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Map Center Longitude</div>\n <dx-text-box [(ngModel)]=\"choroplethMapConfig.centerLng\"\n [readOnly]=\"isCenterdChoroplethMap\"></dx-text-box>\n </div>\n\n\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 flex flex-row justify-between\">\n\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Argument Field</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"choroplethMapConfig.argumentField\"></dx-select-box>\n </div>\n\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> size</div>\n <dx-text-box [(ngModel)]=\"choroplethMapConfig.size\"></dx-text-box>\n </div>\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\">Color One</div>\n <dx-color-box [(ngModel)]=\"choroplethMapConfig.colorOne\"></dx-color-box>\n </div>\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\">Color Two</div>\n <dx-color-box [(ngModel)]=\"choroplethMapConfig.colorTwo\"></dx-color-box>\n </div>\n\n\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-2\"> Display Formate </div>\n <dx-select-box [items]=\"['daily','hourly','monthly']\"\n [(ngModel)]=\"table_columns_config.kpiConfig.formate\"\n [readOnly]=\"false\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-2\"> Key To Pass </div>\n <dx-tag-box [items]=\"configColume\"\n [(ngModel)]=\"table_columns_config.kpiConfig.keyToPass\"></dx-tag-box>\n </div>\n\n </div>\n <div class=\"my-2 flex-row justify-between\">\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Gjson File Path</div>\n <dx-text-box [(ngModel)]=\"choroplethMapConfig.gjsonFilePath\"></dx-text-box>\n </div>\n\n </div>\n <div class=\"my-2 flex flex-row justify-between\">\n <div class=\"px-1 mb-2 mt-6 w-full\">\n <dx-check-box [(ngModel)]=\"choroplethMapConfig.isValueFieldRangeSlider\"\n text=\"Range Slider\"></dx-check-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Slider Speed</div>\n <dx-number-box [(ngModel)]=\"choroplethMapConfig.slideSpeed\"></dx-number-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Value For Slider</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"choroplethMapConfig.sliderValueField\"></dx-select-box>\n </div>\n </div>\n </div>\n\n <div class=\"w-1/4 px-2 m-3\">\n <div class=\"text-md mb-1 mt-8\"></div>\n <dx-check-box [(ngModel)]=\"choroplethMapConfig.isDataAggregation\"\n (ngModelChange)=\"onDataGroupByChange($event)\"\n text=\"Apply Data Aggregation\"></dx-check-box>\n </div>\n\n <div class=\"flex flex-col rounded border p-3 m-6\" *ngIf=\"choroplethMapConfig.isDataAggregation\">\n <div class=\"px-1 my-4 w-1/3\">\n <div class=\"text-md mb-2\">Group By Columns</div>\n <dx-tag-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"dataAggregateGroupByColume\"></dx-tag-box>\n </div>\n <div class=\"border p-2\">\n <div class=\"my-2 flex flex-row border-b\"\n *ngFor=\"let item of dataAggregationContainer; let i = index\">\n\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-2\">Aggregation Columns</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"item.aggregateDataField\"></dx-select-box>\n </div>\n <div class=\" px-2 mb-1 w-full\">\n <div class=\"text-md mb-2\">Function Type</div>\n <dx-select-box [searchEnabled]=\"true\"\n [items]=\"['sum','avg','min','max','count']\"\n [(ngModel)]=\"item.aggregateFunctionType\"></dx-select-box>\n </div>\n\n <div class=\"text-center mt-6 w-1/6\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\"\n (click)=\"deleteAggregationColume(i)\"><i class=\"fa fa-trash-o\"\n aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\"\n (click)=\"addAggregationColume()\">Add\n Colume</button>\n <button class=\"{{commonService.btn_success_sm}} cursor-pointer\"\n (click)=\"saveAggregationColume()\">Save Aggregation</button>\n </div>\n </div>\n\n </div>\n\n </ng-container>\n\n <ng-container\n *ngIf=\"heatMapConfig.heatMapCategory == 'heatMapOnly' || heatMapConfig.heatMapCategory == 'heatMapMarker' || heatMapConfig.heatMapCategory == 'heatMapAndMarker'\">\n <div class=\"flex-col\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\">\n Center Location Config\n </div>\n <div>\n <div class=\"flex pt-2 border-x border-b\">\n <!-- <div class=\"px-1 mb-1 w-1/4\">\n <div class=\"text-md mb-1\"> Latitude </div>\n <dx-text-box [(ngModel)]=\"heatMapConfig.centerLatitude\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-1 w-1/4\">\n <div class=\"text-md mb-1\"> Longitude </div>\n <dx-text-box [(ngModel)]=\"heatMapConfig.centerLongitude\"></dx-text-box>\n </div> -->\n <div class=\"px-1 mb-1 w-1/4\"\n *ngIf=\"heatMapConfig.heatMapCategory != 'heatMapAndMarker'\">\n <div class=\"text-md mb-1\"> Zoom Label </div>\n <dx-text-box [(ngModel)]=\"heatMapConfig.zoom\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-1 w-1/4\">\n <div class=\"text-md mb-1\"> Custom Icons </div>\n <dx-text-box [(ngModel)]=\"heatMapConfig.icon\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-1 w-1/4\">\n <div class=\"text-md mb-1\"> size</div>\n <dx-text-box [(ngModel)]=\"heatMapConfig.size\"></dx-text-box>\n </div>\n </div>\n </div>\n </div>\n <div class=\"flex-col\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\">\n Location Marker Config\n </div>\n <div>\n <div class=\"flex pt-2 border-x border-b\">\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Latitude </div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"heatMapConfig.markerLatitude\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Longitude </div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"heatMapConfig.markerLongitude\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-2\"> Display Formate </div>\n <dx-select-box [items]=\"['daily','hourly','monthly']\"\n [(ngModel)]=\"table_columns_config.kpiConfig.formate\"\n [readOnly]=\"false\"></dx-select-box>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"mapType == 'bubbleMap'\">\n <div class=\"flex-col\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\">\n Bubble Map Config\n </div>\n <div>\n <div class=\"flex pt-2 border-x border-b\">\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Argument Value </div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"bubbleMapConfig.agrumentValue\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-1/4\">\n <div class=\"text-md mb-1\"> Bubble Color </div>\n <dx-color-box [(ngModel)]=\"bubbleMapConfig.bubbleColor\"></dx-color-box>\n </div>\n <div class=\"px-1 mb-1 w-1/4\">\n <div class=\"text-md mb-1\">Bubble Minimum size</div>\n <dx-text-box [(ngModel)]=\"bubbleMapConfig.bubbleMinimumSize\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-1 w-1/4\">\n <div class=\"text-md mb-1\">Bubble Maximum size</div>\n <dx-text-box [(ngModel)]=\"bubbleMapConfig.bubbleMaximumSize\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-1 w-1/4\">\n <div class=\"text-md mb-1\"> size</div>\n <dx-text-box [(ngModel)]=\"bubbleMapConfig.size\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-1 w-1/4\">\n <div class=\"text-md mb-1\"> Short By</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"bubbleMapConfig.sortBy\"></dx-select-box>\n </div>\n <!-- <div class=\"px-1 mb-1 w-1/4\" *ngIf=\"heatMapConfig.heatMapCategory != 'heatMapAndMarker'\">\n <div class=\"text-md mb-1\"> Zoom Label </div>\n <dx-text-box [(ngModel)]=\"heatMapConfig.zoom\"></dx-text-box>\n </div> -->\n </div>\n </div>\n </div>\n <div class=\"flex-col\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\">\n Location Marker Config\n </div>\n <div>\n <div class=\"flex pt-2 border-x border-b\">\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Latitude </div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"bubbleMapConfig.markerLatitude\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-1/3\">\n <div class=\"text-md mb-1\"> Longitude </div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"bubbleMapConfig.markerLongitude\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-2\"> Display Formate </div>\n <dx-select-box [items]=\"['daily','hourly','monthly']\"\n [(ngModel)]=\"table_columns_config.kpiConfig.formate\"\n [readOnly]=\"false\"></dx-select-box>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n\n </div>\n\n\n\n </div>\n <div *ngIf=\"activeTab === 'chart_config'\">\n <div class=\"h-full overflow-x-auto\">\n <div class=\"flex flex-col flex-auto min-w-0\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\">\n Tooltip Columns\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 border-b flex flex-row\"\n *ngFor=\"let item of tableDataConfig.chart_config; let i = index;\">\n <!-- <div class=\"px-1 mb-2 mt-6 w-full\">\n <dx-check-box [value]=\"item.visible\" [(ngModel)]=\"item.visible\"\n text=\"Visiblity\"></dx-check-box>\n </div> -->\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Value Field</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"item.dataField\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Caption</div>\n <dx-text-box [(ngModel)]=\"item.caption\"></dx-text-box>\n </div>\n\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\">Display For</div>\n <dx-select-box [items]=\"['map', 'tooltip']\"\n [(ngModel)]=\"item.displayFor\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2 w-full\">\n <div class=\"text-md mb-2\"> UI Function</div>\n <dx-select-box [items]=\"enrichNameList\" [(ngModel)]=\"item.enrichName\"\n [searchEnabled]=\"true\"></dx-select-box>\n </div>\n\n <div class=\"text-center mt-8 w-full\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== tableDataConfig.chart_config.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\"\n (click)=\"deleteColumns(i)\"><i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n </div>\n </div>\n </div>\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\" (click)=\"addColumns()\">Add\n Columns</button>\n </div>\n </div>\n </div>\n <div *ngIf=\"activeTab === 'properties'\">\n <div class=\"h-full overflow-x-auto\">\n <app-loader *ngIf=\"isLoader\"></app-loader>\n <ng-container *ngIf=\"!isLoader\">\n <div class=\"flex flex-row justify-between border-b py-3\">\n <div class=\"mx-2\">\n <dx-check-box [value]=\"viewProperties.enableClickEvent\"\n [(ngModel)]=\"viewProperties.enableClickEvent\"\n text=\"Enable Click Event\"></dx-check-box>\n </div>\n <div class=\"mx-2\">\n <dx-check-box [value]=\"viewProperties.enableRightClickEvent\"\n [(ngModel)]=\"viewProperties.enableRightClickEvent\"\n text=\"Enable Right Click\"></dx-check-box>\n </div>\n </div>\n <div class=\"w-full p-2\" *ngIf=\"viewProperties.enableClickEvent\">\n\n <div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Event\n Type\n Option\n </div>\n <div class=\"w-full p-3 border-x border-b \">\n <div class=\"flex flex-row\">\n <div class=\"w-full\">\n <div class=\"text-md mb-2\"> Event Type</div>\n </div>\n <div class=\"w-full\">\n <dx-select-box [items]=\"['drilldown','optionalDrillDown']\"\n (onValueChanged)=\"getSelectedEventType($event)\"\n [(ngModel)]=\"viewProperties.clickEventOptions.eventType\"></dx-select-box>\n </div>\n </div>\n <ng-container *ngIf=\"viewProperties.clickEventOptions.eventType == 'drilldown'\">\n <div class=\"flex flex-row justify-between mt-3\">\n <div class=\"w-full\">\n <div class=\"text-md mb-2\"> Associated Views</div>\n <dx-tag-box [items]=\"allConfiguredViews\"\n [(ngModel)]=\"viewProperties.clickEventOptions.associatedViews\"\n valueExpr=\"viewId\" displayExpr=\"viewName\"\n [showSelectionControls]=\"true\" [searchEnabled]=\"true\"></dx-tag-box>\n </div>\n </div>\n </ng-container>\n <ng-container\n *ngIf=\"viewProperties.clickEventOptions.eventType == 'optionalDrillDown'\">\n <div class=\"flex flex-row justify-between mt-3\">\n <div class=\"w-full\">\n <ng-container\n *ngFor=\"let item of optionalDrilDownDataSource;let i = index;\">\n\n <div class=\"flex flex-row justify-between\">\n <div class=\"mx-2 w-full\">\n <div class=\"text-md mb-2\"> Associated Views</div>\n <dx-tag-box [items]=\"allConfiguredViews\"\n [(ngModel)]=\"item.viewId\" valueExpr=\"viewId\"\n displayExpr=\"viewName\" [showSelectionControls]=\"true\"\n [maxDisplayedTags]=\"2\"\n [searchEnabled]=\"true\"></dx-tag-box>\n\n </div>\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\"> Associated Params</div>\n <dx-text-box\n [(ngModel)]=\"item.filterCondition\"></dx-text-box>\n </div>\n <div class=\"mx-2\">\n <button\n class=\"{{commonService.btn_danger_sm}} cursor-pointer mt-8\"\n (click)=\"deleteAssociatedParams(i)\"><i\n class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </ng-container>\n <div class=\"flex flex-row justify-end mt-4\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\"\n (click)=\"addAssociatedParams()\">Add\n Params</button>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n </div>\n\n </div>\n </ng-container>\n <button class=\"{{commonService.btn_light_md}} cursor-pointer mt-2\"\n (click)=\"resetViewProprstise()\">Reset All</button>\n </div>\n </div>\n <div *ngIf=\"activeTab === 'permission'\">\n <div class=\"h-full overflow-x-auto\">\n <app-user-access [(userOptionContainer)]=\"userOptionContainer\">\n </app-user-access>\n </div>\n </div>\n\n </div>\n\n\n </div>\n</div>\n\n<div class=\"flex flex-row border-t pl-3\">\n <div class=\"flex justify-start mx-1\">\n <button class=\"{{commonService.btn_warning_md}} cursor-pointer mt-2\" (click)=\"viewMapForTest()\">\n Preview</button>\n <button class=\"{{commonService.btn_primary_md}} cursor-pointer mt-2\" (click)=\"isJsonPreview = false\">Data\n Preview</button>\n </div>\n <div class=\"flex justify-end mx-1 flex-grow\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mt-2\"\n (click)=\"getSaveChartConfig()\">Submit</button>\n </div>\n</div>" }]
|
|
442
554
|
}], ctorParameters: function () { return [{ type: i1.CommonService }, { type: i0.ChangeDetectorRef }, { type: i2.ApplicationContentService }, { type: i3.ToastrService }]; }, propDecorators: { createOtherComponentView: [{
|
|
443
555
|
type: Output
|
|
444
556
|
}], chartconfigData: [{
|
|
445
557
|
type: Input,
|
|
446
558
|
args: ['datasetmodal']
|
|
447
559
|
}] } });
|
|
448
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvLW1hcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nYW1tYS1hcHAtY29udHJvbGxlci9zcmMvbGliL2FwcGxpY2F0aW9uLWNvbnRyb2xsZXIvc3VwcG9ydC1jb21wb25lbnRzL2dlby1tYXAvZ2VvLW1hcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nYW1tYS1hcHAtY29udHJvbGxlci9zcmMvbGliL2FwcGxpY2F0aW9uLWNvbnRyb2xsZXIvc3VwcG9ydC1jb21wb25lbnRzL2dlby1tYXAvZ2VvLW1hcC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQXFCLFNBQVMsRUFBNEIsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQStCLE1BQU0sZUFBZSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FBV3pKLE1BQU0sT0FBTyxlQUFlO0lBNEkxQixZQUFtQixhQUE0QixFQUFVLEdBQXNCLEVBQVUsT0FBa0MsRUFBVSxNQUFxQjtRQUF2SSxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUFVLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQVUsWUFBTyxHQUFQLE9BQU8sQ0FBMkI7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFlO1FBM0kxSiwwQkFBcUIsR0FBRztZQUN0QjtnQkFDRSxNQUFNLEVBQUUsZUFBZTtnQkFDdkIsT0FBTyxFQUFFLGFBQWE7YUFDdkI7WUFDRDtnQkFDRSxNQUFNLEVBQUUsaUJBQWlCO2dCQUN6QixPQUFPLEVBQUUsZUFBZTthQUN6QjtZQUNEO2dCQUNFLE1BQU0sRUFBRSwwQkFBMEI7Z0JBQ2xDLE9BQU8sRUFBRSxrQkFBa0I7YUFDNUI7U0FDRixDQUFBO1FBRUQsdUJBQWtCLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBQ3BELFlBQU8sR0FBUSxFQUFFLENBQUM7UUFFbEIsNEJBQXVC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QUFDLENBQUM7Z0JBQy9CLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDL0IsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUMvQixNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7YUFDaEM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sU0FBUyxHQUFHLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QyxNQUFNLFNBQVMsR0FBRyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFHeEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0QsQ0FBQzs7NEdBemdCVSxlQUFlO2dHQUFmLGVBQWUsd0xDWjVCLHNscUNBMGpCTTsyRkQ5aUJPLGVBQWU7a0JBTDNCLFNBQVM7K0JBQ0UsYUFBYTt3TUFtSk4sd0JBQXdCO3NCQUF4QyxNQUFNO2dCQUlILGVBQWU7c0JBRGxCLEtBQUs7dUJBQUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgQ29tcG9uZW50UmVmLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBcHBsaWNhdGlvbkNvbnRlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vYXBwbGljYXRpb24tY29udGVudC5zZXJ2aWNlJztcbmltcG9ydCB7IFRvYXN0clNlcnZpY2UgfSBmcm9tICduZ3gtdG9hc3RyJztcbmltcG9ydCB7IENvbW1vblNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb21tb24nO1xuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1nZW8tbWFwJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2dlby1tYXAuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9nZW8tbWFwLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgR2VvTWFwQ29tcG9uZW50IHtcbiAgaGVhdE1hcFR5cGVEYXRhc291cmNlID0gW1xuICAgIHtcbiAgICAgIFwibmFtZVwiOiBcIkhlYXQgTWFwIE9ubHlcIixcbiAgICAgIFwidmFsdWVcIjogXCJoZWF0TWFwT25seVwiXG4gICAgfSxcbiAgICB7XG4gICAgICBcIm5hbWVcIjogXCJIZWF0IE1hcCBNYXJrZXJcIixcbiAgICAgIFwidmFsdWVcIjogXCJoZWF0TWFwTWFya2VyXCJcbiAgICB9LFxuICAgIHtcbiAgICAgIFwibmFtZVwiOiBcIkhlYXQgTWFwIEFuZCBIZWF0IE1hcmtlclwiLFxuICAgICAgXCJ2YWx1ZVwiOiBcImhlYXRNYXBBbmRNYXJrZXJcIlxuICAgIH1cbiAgXVxuICBjaGFydFZpZXdUeXBlOiBhbnk7XG4gIG1hcEljb25zRGF0YVNvdXJjZSA9IFtcImFzc2V0cy9jdXN0b20tbWFya2VyLi5qcGVnXCJdO1xuICBtYXBUeXBlOiBhbnkgPSAnJztcblxuICBjaGFydFZpZXdUeXBlRGF0YVNvdXJjZSA9IFtcbiAgICB7IG5hbWU6ICdHRU8gTWFwJywgdmFsdWU6ICdnZW9NYXAnIH0sXG4gICAgeyBuYW1lOiAnSGVhdCBNYXAnLCB2YWx1ZTogJ2hlYXRNYXAnIH0sXG4gICAgeyBuYW1lOiAnQnViYmxlIE1hcCcsIHZhbHVlOiAnYnViYmxlTWFwJyB9LFxuICAgIHsgbmFtZTogJ0Nob3JvcGxldGggTWFwJywgdmFsdWU6ICdjaG9yb3BsZXRoTWFwJyB9XG4gIF07XG5cbiAgcmVnaW9uRGF0YSA9IFtcImNvdW50cnlcIiwgXCJjaXR5XCJdO1xuICBjaGFydERhdGFTb3VyY2VGb3JNYXA6IGFueTtcbiAgY29sb3JzOiBzdHJpbmdbXSA9IFtdOyAvLyBBcnJheSB0byBob2xkIHNlbGVjdGVkIGNvbG9yc1xuICBpc0pzb25QcmV2aWV3OiBib29sZWFuO1xuICBkYXRhU291cnNlRm9yVGFibGU6IGFueSA9IFtdO1xuICBqc2FvbkRhdGFzb3VyY2U6IGFueTtcbiAgY29uZmlnQ29sdW1lOiBhbnk7XG4gIGFsbENvbmZpZ3VyZWRWaWV3czogYW55ID0gW107XG4gIC8vIGdyb3VwT2ZWaWV3czogYW55O1xuICB2aWV3UHJvcGVydGllczogYW55ID0ge1xuICAgIGVuYWJsZUNsaWNrRXZlbnQ6IGZhbHNlLFxuICAgIGVuYWJsZVJpZ2h0Q2xpY2tFdmVudDogdHJ1ZSxcbiAgICBjbGlja0V2ZW50T3B0aW9uczoge1xuICAgICAgYXNzb2NpYXRlZFZpZXdzOiBbXSxcbiAgICAgIGV2ZW50VHlwZTogXCJcIlxuICAgIH1cbiAgfTtcbiAgb3B0aW9uYWxEcmlsRG93bkRhdGFTb3VyY2U6IGFueSA9IFtdO1xuICB0YWJsZV9jb2x1bW5zX2NvbmZpZyA9IHtcbiAgICBcImtwaUNvbmZpZ1wiOiB7XG4gICAgICBcInNlcnZpY2VJZFwiOiBcIlwiLFxuICAgICAgXCJhcGlcIjogXCIva3BpL3RyZW5kcy9uZXR3b3JrL2dldC1tZXRyaWMtZGF0YVwiLFxuICAgICAgXCJkaXNwbGF5VHlwZVwiOiBcImdvb2dsZUNoYXJ0XCIsXG4gICAgICBcImZvcm1hdGVcIjogXCJcIixcbiAgICAgIFwia2V5VG9QYXNzXCI6IFtdLFxuICAgICAgXCJjb21wb25lbnROYW1lXCI6IFwiR2FtbWFHZW9DaGFydENvbXBvbmVudFwiLFxuICAgICAgXCJkYXRhQ29uZmlnXCI6IHt9XG4gICAgfSxcbiAgfTtcbiAgaGVhdE1hcENvbmZpZyA9IHtcbiAgICBcImNoYXJ0X2NvbmZpZ1wiOiBbXG5cbiAgICBdLFxuICAgIFwiaGVhdE1hcENhdGVnb3J5XCI6IFwiXCIsXG4gICAgLy8gXCJjZW50ZXJMYXRpdHVkZVwiOlwiXCIsXG4gICAgLy8gXCJjZW50ZXJMb25naXR1ZGVcIjpcIlwiLFxuICAgIFwiaWNvblwiOiBcImFzc2V0cy9jdXN0b20tbWFya2VyLi5qcGVnXCIsXG4gICAgXCJtYXJrZXJMYXRpdHVkZVwiOiBcIlwiLFxuICAgIFwibWFya2VyTG9uZ2l0dWRlXCI6IFwiXCIsXG4gICAgXCJzaXplXCI6ICc0NTAnLFxuICAgIFwiem9vbVwiOiBcIlwiXG4gIH1cbiAgYnViYmxlTWFwQ29uZmlnID0ge1xuICAgIFwiY2hhcnRfY29uZmlnXCI6IFtcblxuICAgIF0sXG4gICAgXCJhZ3J1bWVudFZhbHVlXCI6IFwiXCIsXG4gICAgXCJidWJibGVDb2xvclwiOiBcIiMyODVlMDhcIixcbiAgICBcInNpemVcIjogJzQ1MCcsXG4gICAgXCJidWJibGVNaW5pbXVtU2l6ZVwiOiBcIjVcIixcbiAgICBcImJ1YmJsZU1heGltdW1TaXplXCI6IFwiMTVcIixcbiAgICBcIm1hcmtlckxhdGl0dWRlXCI6IFwiXCIsXG4gICAgXCJtYXJrZXJMb25naXR1ZGVcIjogXCJcIixcbiAgICBcInNvcnRCeVwiOiBcIlwiXG4gICAgLy8gIFwiem9vbVwiOlwiXCJcbiAgfVxuICB0YWJsZURhdGFDb25maWcgPSB7XG5cbiAgICBcImNoYXJ0X2NvbmZpZ1wiOiBbXG5cbiAgICBdLFxuICAgIFwicmVnaW9uXCI6IFwiXCIsXG4gICAgXCJyZWdpb25Db2RlXCI6IFwiVVNcIixcbiAgICAvLyBcInRpdGxlXCI6IFwiXCIsXG4gICAgXCJhcmd1bWVudEZpZWxkXCI6IFwiXCIsXG4gICAgXCJjaGFydFZhbHVlRmllbGRcIjogXCJcIixcbiAgICBcInNpemVcIjogXCI0NTBcIixcbiAgICBcImNoYXJ0VHlwZVwiOiBcImdlb2NoYXJ0XCIsXG4gICAgXCJiYWNrZ3JvdW5kQ29sb3JcIjogXCIjNmM5OGUwXCIsXG4gICAgXCJjb2xvcnNcIjogWycjMDAzNTY2JywgJyNmZDAwMDAnXVxuXG4gIH1cblxuXG4gIC8vIGZvciBjaG9yb3BsZXRoTWFwXG5cblxuICBjaG9yb3BsZXRoTWFwQ29uZmlnID0ge1xuICAgIGNoYXJ0X2NvbmZpZzogW1xuICAgICAge1xuICAgICAgICBkYXRhRmllbGQ6IFwiY250XCIsXG4gICAgICAgIGNhcHRpb246IFwiQ291bnRcIixcbiAgICAgICAgZGlzcGxheUZvcjogXCJtYXBcIixcbiAgICAgICAgZW5yaWNoTmFtZTogXCJcIlxuICAgICAgfVxuICAgIF0sXG4gICAgem9vbTogXCI3XCIsXG4gICAgaXNWYWx1ZUZpZWxkUmFuZ2VTbGlkZXI6IHRydWUsXG4gICAgc2xpZGVTcGVlZDogMTAwMCxcbiAgICBzbGlkZXJWYWx1ZUZpZWxkOiBcInllYXJcIixcbiAgICBjZW50ZXJMYXQ6IFwiMS4zNzMzXCIsXG4gICAgY2VudGVyTG5nOiBcIjMyLjI5MDNcIixcbiAgICBhcmd1bWVudEZpZWxkOiBcImRpc3RyaWN0XCIsXG4gICAgZ2pzb25GaWxlUGF0aDogXCIvYXNzZXRzL2FwaS1kYXRhL3VnYW5kYV9kaXN0cmljdHMuZ2VvanNvblwiLFxuICAgIHNpemU6IFwiNDUwXCIsXG4gICAgY2hhcnRUeXBlOiBcImNob3JvcGxldGhNYXBcIixcbiAgICBjb2xvck9uZTogJyMwODkyNzQnLFxuICAgIGNvbG9yVHdvOiAnI2YwZjkyMScsXG4gIH1cblxuICBpc0NlbnRlcmRDaG9yb3BsZXRoTWFwOiBib29sZWFuID0gZmFsc2U7XG4gIGNlbnRhckxhaXRuZ09iamVjdCA9IHtcbiAgICBsYXRLZXk6IFwiXCIsXG4gICAgbG5nS2V5OiBcIlwiXG4gIH1cblxuICBlbnJpY2hOYW1lTGlzdCA9IFtcImFiYnJldmlhdGVOdW1iZXJcIiwgXCJnZXRDb2xvckNvZGVTcGFuXCIsIFwiVGhvdXNhbmRTZXBhcmF0b3JcIiwgXCJmb3JtYXRCeXRlc3YyXCJdXG4gIHNlbGVjdGVkVGFibGVWaWV3VHlwZTogYW55O1xuICBpc0xvYWRlcjogYm9vbGVhbiA9IHRydWU7XG5cbiAgc2VsZWN0ZWRWaWV3Q29uZmlnczogYW55O1xuICB1c2VyT3B0aW9uQ29udGFpbmVyOiBhbnkgPSBbXTtcblxuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBjb21tb25TZXJ2aWNlOiBDb21tb25TZXJ2aWNlLCBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgc2VydmljZTogQXBwbGljYXRpb25Db250ZW50U2VydmljZSwgcHJpdmF0ZSB0YW9zdHI6IFRvYXN0clNlcnZpY2UpIHsgfVxuXG4gIGFjdGl2ZVRhYjogc3RyaW5nID0gJ2Jhc2ljJztcbiAgQE91dHB1dCgpIHB1YmxpYyBjcmVhdGVPdGhlckNvbXBvbmVudFZpZXc6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBzZWxlY3RlZFZpZXdzID0gW107XG5cbiAgQElucHV0KCdkYXRhc2V0bW9kYWwnKVxuICBzZXQgY2hhcnRjb25maWdEYXRhKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuanNhb25EYXRhc291cmNlID0gdmFsdWUuZGF0YVswXTtcbiAgICAgIHRoaXMuY29uZmlnQ29sdW1lID0gT2JqZWN0LmtleXModmFsdWUuZGF0YVswXSk7XG4gICAgICB0aGlzLmRhdGFTb3Vyc2VGb3JUYWJsZSA9IHZhbHVlLmRhdGE7XG4gICAgICB0aGlzLnNlbGVjdGVkVmlld0NvbmZpZ3MgPSB2YWx1ZTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYWJsZVZpZXdUeXBlID0gdmFsdWUuc2VsZWN0ZWRWaWV3VHlwZTtcbiAgICAgIHRoaXMudXNlck9wdGlvbkNvbnRhaW5lciA9IHZhbHVlLnNlbGVjdGVkV2lkZ2V0Q29uZmlnPy5wZXJtaXNzaW9ucyA/IHZhbHVlLnNlbGVjdGVkV2lkZ2V0Q29uZmlnLnBlcm1pc3Npb25zIDogW107XG4gICAgICBpZiAodmFsdWUuc2VsZWN0ZWRXaWRnZXRDb25maWcpIHtcblxuICAgICAgICB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnWydrcGlDb25maWcnXSA9IHZhbHVlLnNlbGVjdGVkV2lkZ2V0Q29uZmlnO1xuICAgICAgICB0aGlzLm1hcFR5cGUgPSB2YWx1ZS5zZWxlY3RlZFdpZGdldENvbmZpZy5kYXRhQ29uZmlnLm1hcFR5cGU7XG4gICAgICAgIGlmICh0aGlzLm1hcFR5cGUgPT0gXCJnZW9NYXBcIikge1xuICAgICAgICAgIHRoaXMudGFibGVEYXRhQ29uZmlnID0gdmFsdWUuc2VsZWN0ZWRXaWRnZXRDb25maWcuZGF0YUNvbmZpZztcbiAgICAgICAgICB0aGlzLnRhYmxlRGF0YUNvbmZpZy5jaGFydF9jb25maWcgPSB2YWx1ZS5zZWxlY3RlZFdpZGdldENvbmZpZy5kYXRhQ29uZmlnLmNoYXJ0X2NvbmZpZztcblxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubWFwVHlwZSA9PSAnYnViYmxlTWFwJykge1xuICAgICAgICAgIHRoaXMuYnViYmxlTWFwQ29uZmlnID0gdmFsdWUuc2VsZWN0ZWRXaWRnZXRDb25maWcuZGF0YUNvbmZpZztcbiAgICAgICAgICB0aGlzLmJ1YmJsZU1hcENvbmZpZy5jaGFydF9jb25maWcgPSB2YWx1ZS5zZWxlY3RlZFdpZGdldENvbmZpZy5kYXRhQ29uZmlnLmNoYXJ0X2NvbmZpZztcbiAgICAgICAgICB0aGlzLnRhYmxlRGF0YUNvbmZpZy5jaGFydF9jb25maWcgPSB2YWx1ZS5zZWxlY3RlZFdpZGdldENvbmZpZy5kYXRhQ29uZmlnLmNoYXJ0X2NvbmZpZztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm1hcFR5cGUgPT0gJ2Nob3JvcGxldGhNYXAnKSB7XG4gICAgICAgICAgdGhpcy5jaG9yb3BsZXRoTWFwQ29uZmlnID0gdmFsdWUuc2VsZWN0ZWRXaWRnZXRDb25maWcuZGF0YUNvbmZpZztcbiAgICAgICAgICB0aGlzLmNob3JvcGxldGhNYXBDb25maWcuY2hhcnRfY29uZmlnID0gdmFsdWUuc2VsZWN0ZWRXaWRnZXRDb25maWcuZGF0YUNvbmZpZy5jaGFydF9jb25maWc7XG4gICAgICAgICAgdGhpcy50YWJsZURhdGFDb25maWcuY2hhcnRfY29uZmlnID0gdmFsdWUuc2VsZWN0ZWRXaWRnZXRDb25maWcuZGF0YUNvbmZpZy5jaGFydF9jb25maWc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdGhpcy5oZWF0TWFwQ29uZmlnID0gdmFsdWUuc2VsZWN0ZWRXaWRnZXRDb25maWcuZGF0YUNvbmZpZztcbiAgICAgICAgICB0aGlzLmhlYXRNYXBDb25maWcuY2hhcnRfY29uZmlnID0gdmFsdWUuc2VsZWN0ZWRXaWRnZXRDb25maWcuZGF0YUNvbmZpZy5jaGFydF9jb25maWc7XG4gICAgICAgICAgdGhpcy50YWJsZURhdGFDb25maWcuY2hhcnRfY29uZmlnID0gdmFsdWUuc2VsZWN0ZWRXaWRnZXRDb25maWcuZGF0YUNvbmZpZy5jaGFydF9jb25maWc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlLnNlbGVjdGVkV2lkZ2V0Q29uZmlnLnZpZXdQcm9wZXJ0aWVzICYmIHZhbHVlLnNlbGVjdGVkV2lkZ2V0Q29uZmlnLnZpZXdQcm9wZXJ0aWVzLmNsaWNrRXZlbnRPcHRpb25zLmFzc29jaWF0ZWRWaWV3cykge1xuICAgICAgICAgIHRoaXMudmlld1Byb3BlcnRpZXMgPSB2YWx1ZS5zZWxlY3RlZFdpZGdldENvbmZpZy52aWV3UHJvcGVydGllcztcbiAgICAgICAgICB0aGlzLnZpZXdQcm9wZXJ0aWVzID0ge1xuICAgICAgICAgICAgXCJlbmFibGVDbGlja0V2ZW50XCI6IHZhbHVlLnNlbGVjdGVkV2lkZ2V0Q29uZmlnLnZpZXdQcm9wZXJ0aWVzLmVuYWJsZUNsaWNrRXZlbnQsXG4gICAgICAgICAgICBcImVuYWJsZVJpZ2h0Q2xpY2tFdmVudFwiOiB2YWx1ZS5zZWxlY3RlZFdpZGdldENvbmZpZy52aWV3UHJvcGVydGllcy5lbmFibGVSaWdodENsaWNrRXZlbnRcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWUuc2VsZWN0ZWRXaWRnZXRDb25maWcudmlld1Byb3BlcnRpZXMuZW5hYmxlQ2xpY2tFdmVudCkge1xuICAgICAgICAgICAgdGhpcy52aWV3UHJvcGVydGllc1snY2xpY2tFdmVudE9wdGlvbnMnXSA9IHtcbiAgICAgICAgICAgICAgXCJldmVudFR5cGVcIjogdmFsdWUuc2VsZWN0ZWRXaWRnZXRDb25maWcudmlld1Byb3BlcnRpZXMuY2xpY2tFdmVudE9wdGlvbnMuZXZlbnRUeXBlLFxuICAgICAgICAgICAgICBcImFzc29jaWF0ZWRWaWV3c1wiOiB2YWx1ZS5zZWxlY3RlZFdpZGdldENvbmZpZy52aWV3UHJvcGVydGllcy5jbGlja0V2ZW50T3B0aW9ucy5hc3NvY2lhdGVkVmlld3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52aWV3UHJvcGVydGllc1snY2xpY2tFdmVudE9wdGlvbnMnXSA9IHt9XG4gICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRhYmxlRGF0YUNvbmZpZy5jaGFydF9jb25maWcgPSB2YWx1ZS5jb2x1bW5EYXRhO1xuICAgICAgICBpZiAodGhpcy50YWJsZURhdGFDb25maWcuY2hhcnRfY29uZmlnKSB7XG4gICAgICAgICAgdGhpcy50YWJsZURhdGFDb25maWcuY2hhcnRfY29uZmlnLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAvLyBlbGVtZW50Wydjb2xvciddID0gJyc7XG4gICAgICAgICAgICAvLyBlbGVtZW50Wydpc1Nob3dCYXInXSA9IHRydWU7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnRhYmxlRGF0YUNvbmZpZy5jaGFydF9jb25maWcgPSBbXTtcbiAgICAgICAgICB0aGlzLmNvbmZpZ0NvbHVtZS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgbGV0IG9iaiA9IHtcbiAgICAgICAgICAgICAgLy8gXCJ2aXNpYmxlXCI6IHRydWUsXG4gICAgICAgICAgICAgIC8vIFwiaXNTaG93QmFyXCI6IHRydWUsXG4gICAgICAgICAgICAgIFwiZGF0YUZpZWxkXCI6IGVsZW1lbnQsXG4gICAgICAgICAgICAgIFwiY2FwdGlvblwiOiB0aGlzLmNvbW1vblNlcnZpY2UuY29udmVydFN0cmluZyhlbGVtZW50KSxcbiAgICAgICAgICAgICAgXCJlbnJpY2hOYW1lXCI6IFwiXCIsXG4gICAgICAgICAgICAgIFwiZGlzcGxheUZvclwiOiBcIm1hcFwiLFxuICAgICAgICAgICAgICAvLyBcImNvbG9yXCI6IFwiXCIsXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudGFibGVEYXRhQ29uZmlnLmNoYXJ0X2NvbmZpZy5wdXNoKG9iaik7XG5cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaXNMb2FkZXIgPSB0cnVlO1xuICAgIHRoaXMuc2VydmljZS5nZXRBcHBWaWV3Q29uZmlncygpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuYWxsQ29uZmlndXJlZFZpZXdzID0gZGF0YTtcblxuICAgICAgICB0aGlzLmlzTG9hZGVyID0gZmFsc2U7XG4gICAgICB9LCBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMudGFvc3RyLmVycm9yKCdVbmV4cGVjdGVkIFNlcnZlciBFeGNlcHRpb24uIFBsZWFzZSBjb250YWN0IFN5c3RlbSBBZG1pbi4nLCAnQWxsIFZpZXdzJylcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgdGhpcy5vcHRpb25hbERyaWxEb3duRGF0YVNvdXJjZSA9IFtcbiAgICAgIHtcbiAgICAgICAgJ3ZpZXdJZCc6IFwiXCIsXG4gICAgICAgICdmaWx0ZXJDb25kaXRpb24nOiBcIlwiXG4gICAgICB9XG4gICAgXVxuICB9XG4gIGFkZENvbHVtbnMoKSB7XG4gICAgbGV0IG9iaiA9IHtcbiAgICAgIFwiZGF0YUZpZWxkXCI6IFwiXCIsXG4gICAgICBcImNhcHRpb25cIjogXCJcIixcbiAgICAgIFwiZW5yaWNoTmFtZVwiOiBcIlwiLFxuICAgICAgXCJkaXNwbGF5Rm9yXCI6IFwiXCIsXG4gICAgfVxuXG4gICAgdGhpcy50YWJsZURhdGFDb25maWcuY2hhcnRfY29uZmlnLnB1c2gob2JqKTtcbiAgfVxuXG4gIGRlbGV0ZUNvbHVtbnMoaSkge1xuICAgIHRoaXMudGFibGVEYXRhQ29uZmlnLmNoYXJ0X2NvbmZpZy5zcGxpY2UoaSwgMSlcbiAgfVxuXG4gIGdldEVucmljaENsYXNzTmFtZShlLCBpdGVtKSB7XG4gICAgaXRlbS5lbnJpY2hOYW1lID0gZS52YWx1ZTtcblxuICB9XG5cblxuICBtb3ZlSXRlbUZvckNvbHVtbnMoaW5kZXg6IG51bWJlciwgZGlyZWN0aW9uOiAndXAnIHwgJ2Rvd24nKTogdm9pZCB7XG4gICAgLy8gUHJldmVudCBtb3ZpbmcgYmV5b25kIGFycmF5IGJvdW5kc1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy50YWJsZURhdGFDb25maWcuY2hhcnRfY29uZmlnLmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IG5ld1Bvc2l0aW9uID0gZGlyZWN0aW9uID09PSAndXAnID8gaW5kZXggLSAxIDogaW5kZXggKyAxO1xuICAgIC8vIFByZXZlbnQgbW92aW5nIGJleW9uZCBhcnJheSBib3VuZHNcbiAgICBpZiAobmV3UG9zaXRpb24gPCAwIHx8IG5ld1Bvc2l0aW9uID49IHRoaXMudGFibGVEYXRhQ29uZmlnLmNoYXJ0X2NvbmZpZy5sZW5ndGgpIHJldHVybjtcblxuICAgIC8vIE1vdmUgaXRlbVxuICAgIGNvbnN0IGl0ZW1Ub01vdmUgPSB0aGlzLnRhYmxlRGF0YUNvbmZpZy5jaGFydF9jb25maWdbaW5kZXhdO1xuICAgIHRoaXMudGFibGVEYXRhQ29uZmlnLmNoYXJ0X2NvbmZpZy5zcGxpY2UoaW5kZXgsIDEpOyAvLyBSZW1vdmUgaXRlbSBmcm9tIGN1cnJlbnQgcG9zaXRpb25cbiAgICB0aGlzLnRhYmxlRGF0YUNvbmZpZy5jaGFydF9jb25maWcuc3BsaWNlKG5ld1Bvc2l0aW9uLCAwLCBpdGVtVG9Nb3ZlKTsgLy8gSW5zZXJ0IGl0ZW0gaW4gbmV3IHBvc2l0aW9uXG4gIH1cblxuICBnZXRPYmplY3RLZXlzKG9iajogYW55KTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmopO1xuICB9XG4gIHNldEFjdGl2ZVRhYih0YWI6IHN0cmluZykge1xuICAgIHRoaXMuYWN0aXZlVGFiID0gdGFiO1xuICB9XG5cbiAgZ2V0R3JvdXBDb2x1bW5zKGNvbHVtbnMpIHtcbiAgICBjb25zdCBncm91cGVkQ29sdW1ucyA9IGNvbHVtbnMucmVkdWNlKChhY2MsIGNvbHVtbikgPT4ge1xuICAgICAgbGV0IGdyb3VwID0gYWNjLmZpbmQoaXRlbSA9PiBpdGVtLmNhcHRpb24gPT09IGNvbHVtbi5ncm91cCk7XG4gICAgICBpZiAoIWdyb3VwKSB7XG4gICAgICAgIGdyb3VwID0ge1xuICAgICAgICAgIGNhcHRpb246IGNvbHVtbi5ncm91cCxcbiAgICAgICAgICBjb2x1bW5zOiBbXVxuICAgICAgICB9O1xuICAgICAgICBhY2MucHVzaChncm91cCk7XG4gICAgICB9XG4gICAgICBncm91cC5jb2x1bW5zLnB1c2goe1xuICAgICAgICBkYXRhRmllbGQ6IGNvbHVtbi5kYXRhRmllbGQsXG4gICAgICAgIC8vIHZpc2libGU6IGNvbHVtbi52aXNpYmxlLFxuICAgICAgICBjYXB0aW9uOiBjb2x1bW4uY2FwdGlvblxuICAgICAgfSk7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIFtdKTtcbiAgICByZXR1cm4gZ3JvdXBlZENvbHVtbnM7XG4gIH1cbiAgZ2VDb2x1bW5zRnJvbUdyb3VwKGNvbHVtbnMpIHtcbiAgICBjb25zdCBuZXdDb2x1bW5zID0gW107XG5cbiAgICBjb2x1bW5zLmZvckVhY2goZ3JvdXAgPT4ge1xuICAgICAgZ3JvdXAuY29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XG4gICAgICAgIG5ld0NvbHVtbnMucHVzaCh7XG4gICAgICAgICAgZGF0YUZpZWxkOiBjb2wuZGF0YUZpZWxkLFxuICAgICAgICAgIC8vIHZpc2libGU6IGNvbC52aXNpYmxlLFxuICAgICAgICAgIGNhcHRpb246IGNvbC5jYXB0aW9uLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBuZXdDb2x1bW5zO1xuICB9XG5cblxuICBnZXRTYXZlQ2hhcnRDb25maWcoKSB7XG5cbiAgICBpZiAodGhpcy5tYXBUeXBlID09ICdnZW9NYXAnKSB7XG4gICAgICB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnLmtwaUNvbmZpZ1snZGF0YUNvbmZpZyddID0gdGhpcy50YWJsZURhdGFDb25maWc7XG4gICAgICB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnLmtwaUNvbmZpZ1snZGF0YUNvbmZpZyddWydtYXBUeXBlJ10gPSB0aGlzLm1hcFR5cGU7XG4gICAgICBpZiAodGhpcy52aWV3UHJvcGVydGllcy5jbGlja0V2ZW50T3B0aW9ucy5ldmVudFR5cGUgPT0gJ29wdGlvbmFsRHJpbGxEb3duJykge1xuICAgICAgICB0aGlzLnZpZXdQcm9wZXJ0aWVzWydjbGlja0V2ZW50T3B0aW9ucyddWydhc3NvY2lhdGVkVmlld3MnXSA9IHRoaXMub3B0aW9uYWxEcmlsRG93bkRhdGFTb3VyY2U7XG4gICAgICB9XG4gICAgICB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnLmtwaUNvbmZpZ1sndmlld1Byb3BlcnRpZXMnXSA9IHRoaXMudmlld1Byb3BlcnRpZXM7XG4gICAgICB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnWydwZXJtaXNzaW9ucyddID0gdGhpcy51c2VyT3B0aW9uQ29udGFpbmVyO1xuXG4gICAgICB0aGlzLmNyZWF0ZU90aGVyQ29tcG9uZW50Vmlldy5lbWl0KHRoaXMudGFibGVfY29sdW1uc19jb25maWcpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5tYXBUeXBlID09ICdidWJibGVNYXAnKSB7XG4gICAgICB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnLmtwaUNvbmZpZ1snZGF0YUNvbmZpZyddID0gdGhpcy5idWJibGVNYXBDb25maWc7XG4gICAgICB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnLmtwaUNvbmZpZ1snZGF0YUNvbmZpZyddWydjaGFydF9jb25maWcnXSA9IHRoaXMudGFibGVEYXRhQ29uZmlnLmNoYXJ0X2NvbmZpZztcbiAgICAgIHRoaXMudGFibGVfY29sdW1uc19jb25maWcua3BpQ29uZmlnWydkYXRhQ29uZmlnJ11bJ21hcFR5cGUnXSA9IHRoaXMubWFwVHlwZTtcblxuICAgICAgaWYgKHRoaXMudmlld1Byb3BlcnRpZXMuY2xpY2tFdmVudE9wdGlvbnMuZXZlbnRUeXBlID09ICdvcHRpb25hbERyaWxsRG93bicpIHtcbiAgICAgICAgdGhpcy52aWV3UHJvcGVydGllc1snY2xpY2tFdmVudE9wdGlvbnMnXVsnYXNzb2NpYXRlZFZpZXdzJ10gPSB0aGlzLm9wdGlvbmFsRHJpbERvd25EYXRhU291cmNlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnLmtwaUNvbmZpZ1sndmlld1Byb3BlcnRpZXMnXSA9IHRoaXMudmlld1Byb3BlcnRpZXM7XG4gICAgICB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnLmtwaUNvbmZpZ1snZGF0YVNvdXJjZSddID0gJyc7XG4gICAgICB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnWydwZXJtaXNzaW9ucyddID0gdGhpcy51c2VyT3B0aW9uQ29udGFpbmVyO1xuXG4gICAgICB0aGlzLmNyZWF0ZU90aGVyQ29tcG9uZW50Vmlldy5lbWl0KHRoaXMudGFibGVfY29sdW1uc19jb25maWcpO1xuXG4gICAgfSBlbHNlIGlmICh0aGlzLm1hcFR5cGUgPT0gJ2Nob3JvcGxldGhNYXAnKSB7XG4gICAgICB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnLmtwaUNvbmZpZ1snZGF0YUNvbmZpZyddID0gdGhpcy5jaG9yb3BsZXRoTWFwQ29uZmlnO1xuICAgICAgdGhpcy50YWJsZV9jb2x1bW5zX2NvbmZpZy5rcGlDb25maWdbJ2RhdGFDb25maWcnXVsnY2hhcnRfY29uZmlnJ10gPSB0aGlzLnRhYmxlRGF0YUNvbmZpZy5jaGFydF9jb25maWc7XG4gICAgICB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnLmtwaUNvbmZpZ1snZGF0YUNvbmZpZyddWydtYXBUeXBlJ10gPSB0aGlzLm1hcFR5cGU7XG4gICAgICBpZiAodGhpcy52aWV3UHJvcGVydGllcy5jbGlja0V2ZW50T3B0aW9ucy5ldmVudFR5cGUgPT0gJ29wdGlvbmFsRHJpbGxEb3duJykge1xuICAgICAgICB0aGlzLnZpZXdQcm9wZXJ0aWVzWydjbGlja0V2ZW50T3B0aW9ucyddWydhc3NvY2lhdGVkVmlld3MnXSA9IHRoaXMub3B0aW9uYWxEcmlsRG93bkRhdGFTb3VyY2U7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudGFibGVfY29sdW1uc19jb25maWcua3BpQ29uZmlnWyd2aWV3UHJvcGVydGllcyddID0gdGhpcy52aWV3UHJvcGVydGllcztcbiAgICAgIHRoaXMudGFibGVfY29sdW1uc19jb25maWcua3BpQ29uZmlnWydkYXRhU291cmNlJ10gPSAnJztcbiAgICAgIHRoaXMudGFibGVfY29sdW1uc19jb25maWdbJ3Blcm1pc3Npb25zJ10gPSB0aGlzLnVzZXJPcHRpb25Db250YWluZXI7XG5cbiAgICAgIHRoaXMuY3JlYXRlT3RoZXJDb21wb25lbnRWaWV3LmVtaXQodGhpcy50YWJsZV9jb2x1bW5zX2NvbmZpZyk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50YWJsZV9jb2x1bW5zX2NvbmZpZy5rcGlDb25maWdbJ2RhdGFDb25maWcnXSA9IHRoaXMuaGVhdE1hcENvbmZpZztcbiAgICAgIHRoaXMudGFibGVfY29sdW1uc19jb25maWcua3BpQ29uZmlnWydkYXRhQ29uZmlnJ11bJ2NoYXJ0X2NvbmZpZyddID0gdGhpcy50YWJsZURhdGFDb25maWcuY2hhcnRfY29uZmlnO1xuICAgICAgdGhpcy50YWJsZV9jb2x1bW5zX2NvbmZpZy5rcGlDb25maWdbJ2RhdGFDb25maWcnXVsnbWFwVHlwZSddID0gdGhpcy5tYXBUeXBlO1xuICAgICAgaWYgKHRoaXMudmlld1Byb3BlcnRpZXMuY2xpY2tFdmVudE9wdGlvbnMuZXZlbnRUeXBlID09ICdvcHRpb25hbERyaWxsRG93bicpIHtcbiAgICAgICAgdGhpcy52aWV3UHJvcGVydGllc1snY2xpY2tFdmVudE9wdGlvbnMnXVsnYXNzb2NpYXRlZFZpZXdzJ10gPSB0aGlzLm9wdGlvbmFsRHJpbERvd25EYXRhU291cmNlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnLmtwaUNvbmZpZ1sndmlld1Byb3BlcnRpZXMnXSA9IHRoaXMudmlld1Byb3BlcnRpZXM7XG4gICAgICB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnWydwZXJtaXNzaW9ucyddID0gdGhpcy51c2VyT3B0aW9uQ29udGFpbmVyO1xuXG4gICAgICB0aGlzLmNyZWF0ZU90aGVyQ29tcG9uZW50Vmlldy5lbWl0KHRoaXMudGFibGVfY29sdW1uc19jb25maWcpO1xuICAgIH1cblxuICAgIC8vIGFsZXJ0KEpTT04uc3RyaW5naWZ5KHRoaXMudGFibGVfY29sdW1uc19jb25maWcsIG51bGwsIDIpKTtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnKTtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnKTtcblxuICAgIC8vIHRoaXMuY3JlYXRlT3RoZXJDb21wb25lbnRWaWV3LmVtaXQodGhpcy50YWJsZV9jb2x1bW5zX2NvbmZpZyk7XG4gICAgLy8gdGhpcy50YWJsZV9jb2x1bW5zX2NvbmZpZy5rcGlDb25maWdbJ2RhdGFTb3VyY2UnXT0gdGhpcy5kYXRhU291cnNlRm9yVGFibGU7XG4gICAgLy8gdGhpcy5jaGFydERhdGFTb3VyY2VGb3JNYXAgPSB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnO1xuXG4gIH1cblxuICBkZWxldGVBc3NvY2lhdGVkUGFyYW1zKGluZGV4KSB7XG4gICAgdGhpcy5vcHRpb25hbERyaWxEb3duRGF0YVNvdXJjZS5zcGxpY2UoaW5kZXgsIDEpXG4gIH1cblxuICBhZGRBc3NvY2lhdGVkUGFyYW1zKCkge1xuICAgIHRoaXMub3B0aW9uYWxEcmlsRG93bkRhdGFTb3VyY2UucHVzaCh7XG4gICAgICAndmlld0lkJzogXCJcIixcbiAgICAgICdmaWx0ZXJDb25kaXRpb24nOiBcIlwiXG4gICAgfSlcbiAgfVxuXG4gIGdldFNlbGVjdGVkRXZlbnRUeXBlKGUpIHtcblxuICAgIGlmIChlLmV2ZW50KSB7XG4gICAgICB0aGlzLm9wdGlvbmFsRHJpbERvd25EYXRhU291cmNlID0gW107XG4gICAgICBpZiAodGhpcy52aWV3UHJvcGVydGllcy5jbGlja0V2ZW50T3B0aW9ucy5ldmVudFR5cGUgPT0gJ2RyaWxsZG93bicpIHtcbiAgICAgICAgdGhpcy50YWJsZV9jb2x1bW5zX2NvbmZpZy5rcGlDb25maWdbJ3ZpZXdQcm9wZXJ0aWVzJ11bJ2Fzc29jaWF0ZWRWaWV3cyddID0gW107XG4gICAgICB9XG4gICAgfVxuXG5cbiAgfVxuXG4gIHJlc2V0Vmlld1Byb3Byc3Rpc2UoKSB7XG4gICAgdGhpcy52aWV3UHJvcGVydGllcyA9IHtcbiAgICAgIGVuYWJsZUNsaWNrRXZlbnQ6IGZhbHNlLFxuICAgICAgZW5hYmxlUmlnaHRDbGlja0V2ZW50OiB0cnVlLFxuICAgICAgY2xpY2tFdmVudE9wdGlvbnM6IHtcbiAgICAgICAgYXNzb2NpYXRlZFZpZXdzOiBbXSxcbiAgICAgICAgZXZlbnRUeXBlOiBcIlwiXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGFkZENvbG9yKCkge1xuICAgIHRoaXMudGFibGVEYXRhQ29uZmlnLmNvbG9ycy5wdXNoKCcjMDAwMDAwJyk7IC8vIEFkZCBkZWZhdWx0IGNvbG9yXG4gIH1cblxuICByZW1vdmVDb2xvcihpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy50YWJsZURhdGFDb25maWcuY29sb3JzLnNwbGljZShpbmRleCwgMSk7XG4gIH1cblxuICBvbkNvbG9yQ2hhbmdlKHZhbHVlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLnRhYmxlRGF0YUNvbmZpZy5jb2xvcnNbaW5kZXhdID0gdmFsdWU7IC8vIFVwZGF0ZSBjb2xvciBhdCBpbmRleFxuICB9XG5cbiAgdmlld01hcEZvclRlc3QoKSB7XG4gICAgaWYgKHRoaXMubWFwVHlwZSA9PSAnZ2VvTWFwJykge1xuICAgICAgdGhpcy50YWJsZV9jb2x1bW5zX2NvbmZpZy5rcGlDb25maWdbJ2RhdGFDb25maWcnXSA9IHRoaXMudGFibGVEYXRhQ29uZmlnO1xuICAgICAgdGhpcy50YWJsZV9jb2x1bW5zX2NvbmZpZy5rcGlDb25maWdbJ2RhdGFDb25maWcnXVsnbWFwVHlwZSddID0gdGhpcy5tYXBUeXBlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5tYXBUeXBlID09ICdidWJibGVNYXAnKSB7XG4gICAgICB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnLmtwaUNvbmZpZ1snZGF0YUNvbmZpZyddID0gdGhpcy5idWJibGVNYXBDb25maWc7XG4gICAgICB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnLmtwaUNvbmZpZ1snZGF0YUNvbmZpZyddWydjaGFydF9jb25maWcnXSA9IHRoaXMudGFibGVEYXRhQ29uZmlnLmNoYXJ0X2NvbmZpZztcbiAgICAgIHRoaXMudGFibGVfY29sdW1uc19jb25maWcua3BpQ29uZmlnWydkYXRhQ29uZmlnJ11bJ21hcFR5cGUnXSA9IHRoaXMubWFwVHlwZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubWFwVHlwZSA9PSAnY2hvcm9wbGV0aE1hcCcpIHtcbiAgICAgIHRoaXMudGFibGVfY29sdW1uc19jb25maWcua3BpQ29uZmlnWydkYXRhQ29uZmlnJ10gPSB0aGlzLmNob3JvcGxldGhNYXBDb25maWc7XG4gICAgICB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnLmtwaUNvbmZpZ1snZGF0YUNvbmZpZyddWydjaGFydF9jb25maWcnXSA9IHRoaXMudGFibGVEYXRhQ29uZmlnLmNoYXJ0X2NvbmZpZztcbiAgICAgIHRoaXMudGFibGVfY29sdW1uc19jb25maWcua3BpQ29uZmlnWydkYXRhQ29uZmlnJ11bJ21hcFR5cGUnXSA9IHRoaXMubWFwVHlwZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnLmtwaUNvbmZpZ1snZGF0YUNvbmZpZyddID0gdGhpcy5oZWF0TWFwQ29uZmlnO1xuICAgICAgdGhpcy50YWJsZV9jb2x1bW5zX2NvbmZpZy5rcGlDb25maWdbJ2RhdGFDb25maWcnXVsnY2hhcnRfY29uZmlnJ10gPSB0aGlzLnRhYmxlRGF0YUNvbmZpZy5jaGFydF9jb25maWc7XG4gICAgICB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnLmtwaUNvbmZpZ1snZGF0YUNvbmZpZyddWydtYXBUeXBlJ10gPSB0aGlzLm1hcFR5cGU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudmlld1Byb3BlcnRpZXMuY2xpY2tFdmVudE9wdGlvbnMuZXZlbnRUeXBlID09ICdvcHRpb25hbERyaWxsRG93bicpIHtcbiAgICAgIHRoaXMudmlld1Byb3BlcnRpZXNbJ2NsaWNrRXZlbnRPcHRpb25zJ11bJ2Fzc29jaWF0ZWRWaWV3cyddID0gdGhpcy5vcHRpb25hbERyaWxEb3duRGF0YVNvdXJjZTtcbiAgICB9XG5cbiAgICB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnLmtwaUNvbmZpZ1sndmlld1Byb3BlcnRpZXMnXSA9IHRoaXMudmlld1Byb3BlcnRpZXM7XG5cbiAgICB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnLmtwaUNvbmZpZ1snZGF0YVNvdXJjZSddID0gdGhpcy5kYXRhU291cnNlRm9yVGFibGU7XG4gICAgdGhpcy5jaGFydERhdGFTb3VyY2VGb3JNYXAgPSB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnO1xuXG4gICAgdGhpcy5pc0pzb25QcmV2aWV3ID0gdHJ1ZTtcblxuICB9XG5cbiAgaGVhdE1hcENhdGVnb3J5KGUpIHtcbiAgICB0aGlzLmhlYXRNYXBDb25maWcuaGVhdE1hcENhdGVnb3J5ID0gZS52YWx1ZTtcbiAgfVxuXG4gIGNoYW5nZU1hcFR5cGUoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQuZXZlbnQpIHtcbiAgICAgIHRoaXMuaGVhdE1hcENvbmZpZy5oZWF0TWFwQ2F0ZWdvcnkgPSAnJztcbiAgICB9XG4gIH1cblxuXG5cbiAgb25MYXRMbmdLZXlDaGFuZ2UoZXZlbnQpIHtcbiAgICBjb25zdCB7IGxhdEtleSwgbG5nS2V5IH0gPSB0aGlzLmNlbnRhckxhaXRuZ09iamVjdDtcblxuICAgIGlmICghbGF0S2V5IHx8ICFsbmdLZXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNhbGN1bGF0ZUNlbnRlckZyb21EYXRhc291cmNlKCk7XG4gIH1cblxuICBjYWxjdWxhdGVDZW50ZXJGcm9tRGF0YXNvdXJjZSgpIHtcbiAgICBjb25zdCBsYXRLZXkgPSB0aGlzLmNlbnRhckxhaXRuZ09iamVjdC5sYXRLZXk7XG4gICAgY29uc3QgbG5nS2V5ID0gdGhpcy5jZW50YXJMYWl0bmdPYmplY3QubG5nS2V5O1xuXG4gICAgaWYgKCFsYXRLZXkgfHwgIWxuZ0tleSB8fCAhdGhpcy5kYXRhU291cnNlRm9yVGFibGU/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBtaW5MYXQgPSBJbmZpbml0eTtcbiAgICBsZXQgbWF4TGF0ID0gLUluZmluaXR5O1xuICAgIGxldCBtaW5MbmcgPSBJbmZpbml0eTtcbiAgICBsZXQgbWF4TG5nID0gLUluZmluaXR5O1xuXG4gICAgdGhpcy5kYXRhU291cnNlRm9yVGFibGUuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGNvbnN0IGxhdCA9IE51bWJlcihpdGVtW2xhdEtleV0pO1xuICAgICAgY29uc3QgbG5nID0gTnVtYmVyKGl0ZW1bbG5nS2V5XSk7XG5cbiAgICAgIGlmICghaXNOYU4obGF0KSAmJiAhaXNOYU4obG5nKSkge1xuICAgICAgICBtaW5MYXQgPSBNYXRoLm1pbihtaW5MYXQsIGxhdCk7XG4gICAgICAgIG1heExhdCA9IE1hdGgubWF4KG1heExhdCwgbGF0KTtcbiAgICAgICAgbWluTG5nID0gTWF0aC5taW4obWluTG5nLCBsbmcpO1xuICAgICAgICBtYXhMbmcgPSBNYXRoLm1heChtYXhMbmcsIGxuZyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBjZW50ZXJMYXQgPSAobWluTGF0ICsgbWF4TGF0KSAvIDI7XG4gICAgY29uc3QgY2VudGVyTG5nID0gKG1pbkxuZyArIG1heExuZykgLyAyO1xuXG4gICAgLy8g4pyFIHN0b3JlIGFzIFNUUklOR1xuICAgIHRoaXMuY2hvcm9wbGV0aE1hcENvbmZpZ1snY2VudGVyTGF0J10gPSBjZW50ZXJMYXQudG9GaXhlZCg2KTtcbiAgICB0aGlzLmNob3JvcGxldGhNYXBDb25maWdbJ2NlbnRlckxuZyddID0gY2VudGVyTG5nLnRvRml4ZWQoNik7XG4gIH1cblxuXG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgbXgtMiBib3JkZXItclwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzSnNvblByZXZpZXdcIj5cbiAgICAgICAgICAgIDxwcmU+PGNvZGU+e3tqc2FvbkRhdGFzb3VyY2UgfCBqc29ufX08L2NvZGU+PC9wcmU+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNKc29uUHJldmlld1wiPlxuICAgICAgICAgICAgPGFwcC1nYW1tYS1nZW8tY2hhcnQgW2NoYXJ0RGF0YVNvdXJjZV09XCJjaGFydERhdGFTb3VyY2VGb3JNYXBcIj48L2FwcC1nYW1tYS1nZW8tY2hhcnQ+XG4gICAgICAgICAgICA8IS0tIDxhcHAtZ29vZ2xlLWdlby1tYXAgW2NoYXJ0RGF0YVNvdXJjZV09XCJjaGFydERhdGFTb3VyY2VGb3JNYXBcIj48L2FwcC1nb29nbGUtZ2VvLW1hcD4gLS0+XG5cbiAgICAgICAgICAgIDxkaXYgI2R5bmFtaWNDb250YWluZXI+PC9kaXY+XG5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInctZnVsbCBteC0yXCI+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTQgYm9yZGVyLWIgYm9yZGVyLWdyYXktMjAwIGRhcms6Ym9yZGVyLWdyYXktNzAwXCI+XG4gICAgICAgICAgICA8dWwgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCAtbWItcHggdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWNlbnRlclwiIHJvbGU9XCJ0YWJsaXN0XCI+XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibWUtMlwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImlubGluZS1ibG9jayBwLTQgYm9yZGVyLWItMiByb3VuZGVkLXQtbGdcIiBbbmdDbGFzc109XCJ7IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LXB1cnBsZS02MDAgYm9yZGVyLXB1cnBsZS02MDAgZGFyazp0ZXh0LXB1cnBsZS01MDAgZGFyazpib3JkZXItcHVycGxlLTUwMCc6IGFjdGl2ZVRhYiA9PT0gJ2Jhc2ljJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1ncmF5LTUwMCBkYXJrOnRleHQtZ3JheS00MDAgYm9yZGVyLXRyYW5zcGFyZW50JzogYWN0aXZlVGFiICE9PSAnYmFzaWMnIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiIChjbGljayk9XCJzZXRBY3RpdmVUYWIoJ2Jhc2ljJylcIiB0eXBlPVwiYnV0dG9uXCIgcm9sZT1cInRhYlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJtZS0yXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaW5saW5lLWJsb2NrIHAtNCBib3JkZXItYi0yIHJvdW5kZWQtdC1sZ1wiIFtuZ0NsYXNzXT1cInsgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtcHVycGxlLTYwMCBib3JkZXItcHVycGxlLTYwMCBkYXJrOnRleHQtcHVycGxlLTUwMCBkYXJrOmJvcmRlci1wdXJwbGUtNTAwJzogYWN0aXZlVGFiID09PSAnY2hhcnRfY29uZmlnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1ncmF5LTUwMCBkYXJrOnRleHQtZ3JheS00MDAgYm9yZGVyLXRyYW5zcGFyZW50JzogYWN0aXZlVGFiICE9PSAnY2hhcnRfY29uZmlnJyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIiAoY2xpY2spPVwic2V0QWN0aXZlVGFiKCdjaGFydF9jb25maWcnKVwiIHR5cGU9XCJidXR0b25cIiByb2xlPVwidGFiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBDaGFydCBDb2x1bW5zXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibWUtMlwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImlubGluZS1ibG9jayBwLTQgYm9yZGVyLWItMiByb3VuZGVkLXQtbGdcIiBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LXB1cnBsZS02MDAgYm9yZGVyLXB1cnBsZS02MDAgZGFyazp0ZXh0LXB1cnBsZS01MDAgZGFyazpib3JkZXItcHVycGxlLTUwMCc6IGFjdGl2ZVRhYiA9PT0gJ3Byb3BlcnRpZXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1ncmF5LTUwMCBkYXJrOnRleHQtZ3JheS00MDAgYm9yZGVyLXRyYW5zcGFyZW50JzogYWN0aXZlVGFiICE9PSAncHJvcGVydGllcydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCIgKGNsaWNrKT1cInNldEFjdGl2ZVRhYigncHJvcGVydGllcycpXCIgdHlwZT1cImJ1dHRvblwiIHJvbGU9XCJ0YWJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnRpZXNcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJtZS0yXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaW5saW5lLWJsb2NrIHAtNCBib3JkZXItYi0yIHJvdW5kZWQtdC1sZ1wiIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1wdXJwbGUtNjAwIGJvcmRlci1wdXJwbGUtNjAwIGRhcms6dGV4dC1wdXJwbGUtNTAwIGRhcms6Ym9yZGVyLXB1cnBsZS01MDAnOiBhY3RpdmVUYWIgPT09ICdwZXJtaXNzaW9uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1ncmF5LTUwMCBkYXJrOnRleHQtZ3JheS00MDAgYm9yZGVyLXRyYW5zcGFyZW50JzogYWN0aXZlVGFiICE9PSAncGVybWlzc2lvbidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIiAoY2xpY2spPVwic2V0QWN0aXZlVGFiKCdwZXJtaXNzaW9uJylcIiB0eXBlPVwiYnV0dG9uXCIgcm9sZT1cInRhYlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgTWFuYWdlIFBlcm1pc3Npb25zXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvbGk+XG5cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgaWQ9XCJkZWZhdWx0LXN0eWxlZC10YWItY29udGVudFwiPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFjdGl2ZVRhYiA9PT0gJ2Jhc2ljJ1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtYXV0byBtaW4tdy0wIG15LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtc20gcHktMSBmb250LWV4dHJhYm9sZCBib3JkZXItYiBiZy1ncmF5LTcwMCB0ZXh0LXdoaXRlIHB4LTJcIj4gRmlsdGVyIFRpdGxlXG4gICAgICAgICAgICAgICAgICAgICAgICBDb25maWdcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHB0LTIgYm9yZGVyLXggYm9yZGVyLWJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTEgdy0xLzNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0xXCI+IE1hcCBMaWJyYXJ5IDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtzZWFyY2hFbmFibGVkXT1cInRydWVcIiBbaXRlbXNdPVwiWydHb29nbGUgTWFwcyddXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0xIHctMS8zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPiBTZWxlY3QgTWFwIHR5cGUgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiIFtpdGVtc109XCJjaGFydFZpZXdUeXBlRGF0YVNvdXJjZVwiIGRpc3BsYXlFeHByPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlRXhwcj1cInZhbHVlXCIgWyhuZ01vZGVsKV09XCJtYXBUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uVmFsdWVDaGFuZ2VkKT1cImNoYW5nZU1hcFR5cGUoJGV2ZW50KVwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibWFwVHlwZSA9PSAnaGVhdE1hcCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0xIHctMS8zXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPiBIZWF0IE1hcCBDYXRlZ29yeSA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiIFtkYXRhU291cmNlXT1cImhlYXRNYXBUeXBlRGF0YXNvdXJjZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5RXhwcj1cIm5hbWVcIiB2YWx1ZUV4cHI9XCJ2YWx1ZVwiIFsobmdNb2RlbCldPVwiaGVhdE1hcENvbmZpZy5oZWF0TWFwQ2F0ZWdvcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uVmFsdWVDaGFuZ2VkKT1cImhlYXRNYXBDYXRlZ29yeSgkZXZlbnQpXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibWFwVHlwZSA9PSAnZ2VvTWFwJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggcHQtMiBib3JkZXIteCBib3JkZXItYlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTEgdy0xLzNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPiBSZWdpb24gPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtzZWFyY2hFbmFibGVkXT1cInRydWVcIiBbaXRlbXNdPVwicmVnaW9uRGF0YVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInRhYmxlRGF0YUNvbmZpZy5yZWdpb25cIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMSB3LTEvM1wiICpuZ0lmPVwidGFibGVEYXRhQ29uZmlnLnJlZ2lvbiA9PSAnY2l0eSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPiBUeXBlIFJlZ2lvbiBDb2RlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cInRhYmxlRGF0YUNvbmZpZy5yZWdpb25Db2RlXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB0LTIgYm9yZGVyLXggYm9yZGVyLWIgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm15LTIgZmxleCBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwicHgtMSBtYi0xIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPiBUaXRsZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwidGFibGVEYXRhQ29uZmlnLnRpdGxlXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0xIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPiBBcmd1bWVudCBGaWVsZDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiIFtpdGVtc109XCJjb25maWdDb2x1bWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidGFibGVEYXRhQ29uZmlnLmFyZ3VtZW50RmllbGRcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0xIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPiBDaGFydHZhbHUgRmllbGQ8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtzZWFyY2hFbmFibGVkXT1cInRydWVcIiBbaXRlbXNdPVwiY29uZmlnQ29sdW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInRhYmxlRGF0YUNvbmZpZy5jaGFydFZhbHVlRmllbGRcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0xIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPiBzaXplPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJ0YWJsZURhdGFDb25maWcuc2l6ZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTIgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+QmFja2dyb3VuZCBDb2xvcjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LWNvbG9yLWJveCBbKG5nTW9kZWwpXT1cInRhYmxlRGF0YUNvbmZpZy5iYWNrZ3JvdW5kQ29sb3JcIj48L2R4LWNvbG9yLWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInB4LTQgbXQtNiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1jaGVjay1ib3ggW3ZhbHVlXT1cInRhYmxlRGF0YUNvbmZpZy5jb21tb25Db25maWcuaXNTZWFyY2hCb3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidGFibGVEYXRhQ29uZmlnLmNvbW1vbkNvbmZpZy5pc1NlYXJjaEJveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD1cIlNlYXJjaCBCb3hcIj48L2R4LWNoZWNrLWJveD5cbiAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0xIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBEaXNwbGF5IEZvcm1hdGUgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbaXRlbXNdPVwiWydkYWlseScsJ2hvdXJseScsJ21vbnRobHknXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ0YWJsZV9jb2x1bW5zX2NvbmZpZy5rcGlDb25maWcuZm9ybWF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cImZhbHNlXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMSB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gS2V5IFRvIFBhc3MgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGFnLWJveCBbaXRlbXNdPVwiY29uZmlnQ29sdW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInRhYmxlX2NvbHVtbnNfY29uZmlnLmtwaUNvbmZpZy5rZXlUb1Bhc3NcIj48L2R4LXRhZy1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiIHB0LTIgYm9yZGVyLXggYm9yZGVyLWIgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtc20gcHktMSBmb250LWV4dHJhYm9sZCBib3JkZXItYiBiZy1ncmF5LTcwMCB0ZXh0LXdoaXRlIHB4LTJcIj4gQ29sb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggIGZsZXgtd3JhcCBweC0xIG1iLTIgbXQtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBtci0yIG1iLTJcIiAqbmdGb3I9XCJsZXQgY29sb3Igb2YgdGFibGVEYXRhQ29uZmlnLmNvbG9yczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1yLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtY29sb3ItYm94IFsobmdNb2RlbCldPVwidGFibGVEYXRhQ29uZmlnLmNvbG9yc1tpXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblZhbHVlQ2hhbmdlZCk9XCJvbkNvbG9yQ2hhbmdlKCRldmVudC52YWx1ZSwgaSlcIj48L2R4LWNvbG9yLWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fZGFuZ2VyX3NtfX0gY3Vyc29yLXBvaW50ZXIgcHgtMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUNvbG9yKGkpXCI+PGkgY2xhc3M9XCJmYSBmYS10cmFzaC1vXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJweC0yXCI+IDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2Rhbmdlcl9zbX19XCIgKGNsaWNrKT1cInJlbW92ZUNvbG9yKGkpXCI+UmVtb3ZlPC9idXR0b24+PC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktZW5kIG15LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fc3VjY2Vzc19zbX19XCIgKGNsaWNrKT1cImFkZENvbG9yKClcIj5BZGQgQ29sb3I8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1hcFR5cGUgPT0gJ2Nob3JvcGxldGhNYXAnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBwdC0yIGJvcmRlci14IGJvcmRlci1iXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMSB3LTEvM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0xXCI+IE1hcCBab29tIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJjaG9yb3BsZXRoTWFwQ29uZmlnLnpvb21cIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTIgbXQtNiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LWNoZWNrLWJveCBbKG5nTW9kZWwpXT1cImlzQ2VudGVyZENob3JvcGxldGhNYXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD1cIkNlbnRlcmQgUG9zaXRpb25cIj48L2R4LWNoZWNrLWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0NlbnRlcmRDaG9yb3BsZXRoTWFwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTEgdy0xLzNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTFcIj4gU2VsZWN0IExhdGl0dWRlIEtleTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiIFtpdGVtc109XCJjb25maWdDb2x1bWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY2VudGFyTGFpdG5nT2JqZWN0LmxhdEtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uVmFsdWVDaGFuZ2VkKT1cIm9uTGF0TG5nS2V5Q2hhbmdlKCRldmVudClcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0xIHctMS8zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0xXCI+IFNlbGVjdCBMb25naXR1ZGUgS2V5PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCIgW2l0ZW1zXT1cImNvbmZpZ0NvbHVtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjZW50YXJMYWl0bmdPYmplY3QubG5nS2V5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25WYWx1ZUNoYW5nZWQpPVwib25MYXRMbmdLZXlDaGFuZ2UoJGV2ZW50KVwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTEgdy0xLzNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPiBNYXAgQ2VudGVyIExhdGl0dWRlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cImNob3JvcGxldGhNYXBDb25maWcuY2VudGVyTGF0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJpc0NlbnRlcmRDaG9yb3BsZXRoTWFwXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0xIHctMS8zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTFcIj4gTWFwIENlbnRlciBMb25naXR1ZGU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiY2hvcm9wbGV0aE1hcENvbmZpZy5jZW50ZXJMbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cImlzQ2VudGVyZENob3JvcGxldGhNYXBcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB0LTIgYm9yZGVyLXggYm9yZGVyLWIgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm15LTIgZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW5cIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0xIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPiBBcmd1bWVudCBGaWVsZDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiIFtpdGVtc109XCJjb25maWdDb2x1bWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY2hvcm9wbGV0aE1hcENvbmZpZy5hcmd1bWVudEZpZWxkXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0xIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPiBzaXplPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJjaG9yb3BsZXRoTWFwQ29uZmlnLnNpemVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPkNvbG9yIE9uZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LWNvbG9yLWJveCBbKG5nTW9kZWwpXT1cImNob3JvcGxldGhNYXBDb25maWcuY29sb3JPbmVcIj48L2R4LWNvbG9yLWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj5Db2xvciBUd288L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1jb2xvci1ib3ggWyhuZ01vZGVsKV09XCJjaG9yb3BsZXRoTWFwQ29uZmlnLmNvbG9yVHdvXCI+PC9keC1jb2xvci1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMSB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gRGlzcGxheSBGb3JtYXRlIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW2l0ZW1zXT1cIlsnZGFpbHknLCdob3VybHknLCdtb250aGx5J11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidGFibGVfY29sdW1uc19jb25maWcua3BpQ29uZmlnLmZvcm1hdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJmYWxzZVwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTEgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IEtleSBUbyBQYXNzIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRhZy1ib3ggW2l0ZW1zXT1cImNvbmZpZ0NvbHVtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ0YWJsZV9jb2x1bW5zX2NvbmZpZy5rcGlDb25maWcua2V5VG9QYXNzXCI+PC9keC10YWctYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXktMiBmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMSB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTFcIj4gR2pzb24gRmlsZSBQYXRoPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJjaG9yb3BsZXRoTWFwQ29uZmlnLmdqc29uRmlsZVBhdGhcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXktMiBmbGV4IGZsZXgtcm93IGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yIG10LTYgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtY2hlY2stYm94IFsobmdNb2RlbCldPVwiY2hvcm9wbGV0aE1hcENvbmZpZy5pc1ZhbHVlRmllbGRSYW5nZVNsaWRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD1cIlJhbmdlIFNsaWRlclwiPjwvZHgtY2hlY2stYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMSB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTFcIj4gU2xpZGVyIFNwZWVkPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtbnVtYmVyLWJveCBbKG5nTW9kZWwpXT1cImNob3JvcGxldGhNYXBDb25maWcuc2xpZGVTcGVlZFwiPjwvZHgtbnVtYmVyLWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTEgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0xXCI+IFZhbHVlIEZvciBTbGlkZXI8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtzZWFyY2hFbmFibGVkXT1cInRydWVcIiBbaXRlbXNdPVwiY29uZmlnQ29sdW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNob3JvcGxldGhNYXBDb25maWcuc2xpZGVyVmFsdWVGaWVsZFwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImhlYXRNYXBDb25maWcuaGVhdE1hcENhdGVnb3J5ID09ICdoZWF0TWFwT25seScgfHwgaGVhdE1hcENvbmZpZy5oZWF0TWFwQ2F0ZWdvcnkgPT0gJ2hlYXRNYXBNYXJrZXInIHx8IGhlYXRNYXBDb25maWcuaGVhdE1hcENhdGVnb3J5ID09ICdoZWF0TWFwQW5kTWFya2VyJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtY29sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtc20gcHktMSBmb250LWV4dHJhYm9sZCBib3JkZXItYiBiZy1ncmF5LTcwMCB0ZXh0LXdoaXRlIHB4LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VudGVyIExvY2F0aW9uIENvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHB0LTIgYm9yZGVyLXggYm9yZGVyLWJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInB4LTEgbWItMSB3LTEvNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTFcIj4gTGF0aXR1ZGUgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cImhlYXRNYXBDb25maWcuY2VudGVyTGF0aXR1ZGVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0xIHctMS80XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPiBMb25naXR1ZGUgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaGVhdE1hcENvbmZpZy5jZW50ZXJMb25naXR1ZGVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMSB3LTEvNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJoZWF0TWFwQ29uZmlnLmhlYXRNYXBDYXRlZ29yeSAhPSAnaGVhdE1hcEFuZE1hcmtlcidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0xXCI+IFpvb20gTGFiZWwgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaGVhdE1hcENvbmZpZy56b29tXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMSB3LTEvNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTFcIj4gQ3VzdG9tIEljb25zIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cImhlYXRNYXBDb25maWcuaWNvblwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTEgdy0xLzRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0xXCI+IHNpemU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJoZWF0TWFwQ29uZmlnLnNpemVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zbSBweS0xIGZvbnQtZXh0cmFib2xkIGJvcmRlci1iIGJnLWdyYXktNzAwIHRleHQtd2hpdGUgcHgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhdGlvbiBNYXJrZXIgQ29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggcHQtMiBib3JkZXIteCBib3JkZXItYlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMSB3LTEvM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTFcIj4gTGF0aXR1ZGUgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiIFtpdGVtc109XCJjb25maWdDb2x1bWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImhlYXRNYXBDb25maWcubWFya2VyTGF0aXR1ZGVcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTEgdy0xLzNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0xXCI+IExvbmdpdHVkZSA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCIgW2l0ZW1zXT1cImNvbmZpZ0NvbHVtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaGVhdE1hcENvbmZpZy5tYXJrZXJMb25naXR1ZGVcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTEgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBEaXNwbGF5IEZvcm1hdGUgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW2l0ZW1zXT1cIlsnZGFpbHknLCdob3VybHknLCdtb250aGx5J11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInRhYmxlX2NvbHVtbnNfY29uZmlnLmtwaUNvbmZpZy5mb3JtYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cImZhbHNlXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibWFwVHlwZSA9PSAnYnViYmxlTWFwJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtY29sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtc20gcHktMSBmb250LWV4dHJhYm9sZCBib3JkZXItYiBiZy1ncmF5LTcwMCB0ZXh0LXdoaXRlIHB4LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnViYmxlIE1hcCBDb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBwdC0yIGJvcmRlci14IGJvcmRlci1iXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0xIHctMS8zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPiBBcmd1bWVudCBWYWx1ZSA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCIgW2l0ZW1zXT1cImNvbmZpZ0NvbHVtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiYnViYmxlTWFwQ29uZmlnLmFncnVtZW50VmFsdWVcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTEgdy0xLzRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0xXCI+IEJ1YmJsZSBDb2xvciA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtY29sb3ItYm94IFsobmdNb2RlbCldPVwiYnViYmxlTWFwQ29uZmlnLmJ1YmJsZUNvbG9yXCI+PC9keC1jb2xvci1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTEgdy0xLzRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0xXCI+QnViYmxlIE1pbmltdW0gc2l6ZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cImJ1YmJsZU1hcENvbmZpZy5idWJibGVNaW5pbXVtU2l6ZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTEgdy0xLzRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0xXCI+QnViYmxlIE1heGltdW0gc2l6ZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cImJ1YmJsZU1hcENvbmZpZy5idWJibGVNYXhpbXVtU2l6ZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTEgdy0xLzRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0xXCI+IHNpemU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJidWJibGVNYXBDb25maWcuc2l6ZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTEgdy0xLzRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0xXCI+IFNob3J0IEJ5PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiIFtpdGVtc109XCJjb25maWdDb2x1bWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImJ1YmJsZU1hcENvbmZpZy5zb3J0QnlcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInB4LTEgbWItMSB3LTEvNFwiICpuZ0lmPVwiaGVhdE1hcENvbmZpZy5oZWF0TWFwQ2F0ZWdvcnkgIT0gJ2hlYXRNYXBBbmRNYXJrZXInXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPiBab29tIExhYmVsICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJoZWF0TWFwQ29uZmlnLnpvb21cIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtY29sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtc20gcHktMSBmb250LWV4dHJhYm9sZCBib3JkZXItYiBiZy1ncmF5LTcwMCB0ZXh0LXdoaXRlIHB4LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYXRpb24gTWFya2VyIENvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHB0LTIgYm9yZGVyLXggYm9yZGVyLWJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTEgdy0xLzNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0xXCI+IExhdGl0dWRlIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtzZWFyY2hFbmFibGVkXT1cInRydWVcIiBbaXRlbXNdPVwiY29uZmlnQ29sdW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJidWJibGVNYXBDb25maWcubWFya2VyTGF0aXR1ZGVcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTEgdy0xLzNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0xXCI+IExvbmdpdHVkZSA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCIgW2l0ZW1zXT1cImNvbmZpZ0NvbHVtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiYnViYmxlTWFwQ29uZmlnLm1hcmtlckxvbmdpdHVkZVwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMSB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IERpc3BsYXkgRm9ybWF0ZSA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbaXRlbXNdPVwiWydkYWlseScsJ2hvdXJseScsJ21vbnRobHknXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidGFibGVfY29sdW1uc19jb25maWcua3BpQ29uZmlnLmZvcm1hdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZE9ubHldPVwiZmFsc2VcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cblxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG5cblxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYWN0aXZlVGFiID09PSAnY2hhcnRfY29uZmlnJ1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoLWZ1bGwgb3ZlcmZsb3cteC1hdXRvXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtYXV0byBtaW4tdy0wXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zbSBweS0xIGZvbnQtZXh0cmFib2xkIGJvcmRlci1iIGJnLWdyYXktNzAwIHRleHQtd2hpdGUgcHgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvb2x0aXAgQ29sdW1uc1xuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHQtMiBib3JkZXIteCBib3JkZXItYiBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXktMiBib3JkZXItYiBmbGV4IGZsZXgtcm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgdGFibGVEYXRhQ29uZmlnLmNoYXJ0X2NvbmZpZzsgbGV0IGkgPSBpbmRleDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yIG10LTYgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtY2hlY2stYm94IFt2YWx1ZV09XCJpdGVtLnZpc2libGVcIiBbKG5nTW9kZWwpXT1cIml0ZW0udmlzaWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD1cIlZpc2libGl0eVwiPjwvZHgtY2hlY2stYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gVmFsdWUgRmllbGQ8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtzZWFyY2hFbmFibGVkXT1cInRydWVcIiBbaXRlbXNdPVwiY29uZmlnQ29sdW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIml0ZW0uZGF0YUZpZWxkXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gQ2FwdGlvbjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaXRlbS5jYXB0aW9uXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPkRpc3BsYXkgRm9yPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbaXRlbXNdPVwiWydtYXAnLCAndG9vbHRpcCddXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIml0ZW0uZGlzcGxheUZvclwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIG1iLTIgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IFVJIEZ1bmN0aW9uPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbaXRlbXNdPVwiZW5yaWNoTmFtZUxpc3RcIiBbKG5nTW9kZWwpXT1cIml0ZW0uZW5yaWNoTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyIG10LTggdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaSAhPT0gMFwiIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9saWdodF9zbX19IGN1cnNvci1wb2ludGVyIG14LTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJtb3ZlSXRlbUZvckNvbHVtbnMoaSwgJ3VwJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWFycm93LXVwXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJpICE9PSB0YWJsZURhdGFDb25maWcuY2hhcnRfY29uZmlnLmxlbmd0aCAtIDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9saWdodF9zbX19IGN1cnNvci1wb2ludGVyIG14LTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJtb3ZlSXRlbUZvckNvbHVtbnMoaSwgJ2Rvd24nKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYXJyb3ctZG93blwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fZGFuZ2VyX3NtfX0gY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVDb2x1bW5zKGkpXCI+PGkgY2xhc3M9XCJmYSBmYS10cmFzaC1vXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktZW5kIG15LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3ByaW1hcnlfc219fSBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJhZGRDb2x1bW5zKClcIj5BZGRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5zPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYWN0aXZlVGFiID09PSAncHJvcGVydGllcydcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaC1mdWxsIG92ZXJmbG93LXgtYXV0b1wiPlxuICAgICAgICAgICAgICAgICAgICA8YXBwLWxvYWRlciAqbmdJZj1cImlzTG9hZGVyXCI+PC9hcHAtbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTG9hZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW4gYm9yZGVyLWIgcHktM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1jaGVjay1ib3ggW3ZhbHVlXT1cInZpZXdQcm9wZXJ0aWVzLmVuYWJsZUNsaWNrRXZlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ2aWV3UHJvcGVydGllcy5lbmFibGVDbGlja0V2ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9XCJFbmFibGUgQ2xpY2sgRXZlbnRcIj48L2R4LWNoZWNrLWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtY2hlY2stYm94IFt2YWx1ZV09XCJ2aWV3UHJvcGVydGllcy5lbmFibGVSaWdodENsaWNrRXZlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ2aWV3UHJvcGVydGllcy5lbmFibGVSaWdodENsaWNrRXZlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD1cIkVuYWJsZSBSaWdodCBDbGlja1wiPjwvZHgtY2hlY2stYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIHAtMlwiICpuZ0lmPVwidmlld1Byb3BlcnRpZXMuZW5hYmxlQ2xpY2tFdmVudFwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZmxleC1hdXRvIG1pbi13LTAgbXktMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zbSBweS0xIGZvbnQtZXh0cmFib2xkIGJvcmRlci1iIGJnLWdyYXktNzAwIHRleHQtd2hpdGUgcHgtMlwiPiBFdmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIHAtMyBib3JkZXIteCBib3JkZXItYiBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IEV2ZW50IFR5cGU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtpdGVtc109XCJbJ2RyaWxsZG93bicsJ29wdGlvbmFsRHJpbGxEb3duJ11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uVmFsdWVDaGFuZ2VkKT1cImdldFNlbGVjdGVkRXZlbnRUeXBlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ2aWV3UHJvcGVydGllcy5jbGlja0V2ZW50T3B0aW9ucy5ldmVudFR5cGVcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2aWV3UHJvcGVydGllcy5jbGlja0V2ZW50T3B0aW9ucy5ldmVudFR5cGUgPT0gJ2RyaWxsZG93bidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW4gbXQtM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IEFzc29jaWF0ZWQgVmlld3M8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10YWctYm94IFtpdGVtc109XCJhbGxDb25maWd1cmVkVmlld3NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidmlld1Byb3BlcnRpZXMuY2xpY2tFdmVudE9wdGlvbnMuYXNzb2NpYXRlZFZpZXdzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUV4cHI9XCJ2aWV3SWRcIiBkaXNwbGF5RXhwcj1cInZpZXdOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1NlbGVjdGlvbkNvbnRyb2xzXT1cInRydWVcIiBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCI+PC9keC10YWctYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwidmlld1Byb3BlcnRpZXMuY2xpY2tFdmVudE9wdGlvbnMuZXZlbnRUeXBlID09ICdvcHRpb25hbERyaWxsRG93bidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW4gbXQtM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygb3B0aW9uYWxEcmlsRG93bkRhdGFTb3VyY2U7bGV0IGkgPSBpbmRleDtcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gQXNzb2NpYXRlZCBWaWV3czwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRhZy1ib3ggW2l0ZW1zXT1cImFsbENvbmZpZ3VyZWRWaWV3c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtLnZpZXdJZFwiIHZhbHVlRXhwcj1cInZpZXdJZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUV4cHI9XCJ2aWV3TmFtZVwiIFtzaG93U2VsZWN0aW9uQ29udHJvbHNdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21heERpc3BsYXllZFRhZ3NdPVwiMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiPjwvZHgtdGFnLWJveD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gQXNzb2NpYXRlZCBQYXJhbXM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaXRlbS5maWx0ZXJDb25kaXRpb25cIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fZGFuZ2VyX3NtfX0gY3Vyc29yLXBvaW50ZXIgbXQtOFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZUFzc29jaWF0ZWRQYXJhbXMoaSlcIj48aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhIGZhLXRyYXNoLW9cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktZW5kIG10LTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9wcmltYXJ5X3NtfX0gY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkQXNzb2NpYXRlZFBhcmFtcygpXCI+QWRkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtczwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fbGlnaHRfbWR9fSBjdXJzb3ItcG9pbnRlciBtdC0yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZXNldFZpZXdQcm9wcnN0aXNlKClcIj5SZXNldCBBbGw8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVUYWIgPT09ICdwZXJtaXNzaW9uJ1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoLWZ1bGwgb3ZlcmZsb3cteC1hdXRvXCI+XG4gICAgICAgICAgICAgICAgICAgIDxhcHAtdXNlci1hY2Nlc3MgWyh1c2VyT3B0aW9uQ29udGFpbmVyKV09XCJ1c2VyT3B0aW9uQ29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvYXBwLXVzZXItYWNjZXNzPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPC9kaXY+XG5cblxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGJvcmRlci10IHBsLTNcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LXN0YXJ0IG14LTFcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fd2FybmluZ19tZH19IGN1cnNvci1wb2ludGVyIG10LTJcIiAoY2xpY2spPVwidmlld01hcEZvclRlc3QoKVwiPlxuICAgICAgICAgICAgUHJldmlldzwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9wcmltYXJ5X21kfX0gY3Vyc29yLXBvaW50ZXIgbXQtMlwiIChjbGljayk9XCJpc0pzb25QcmV2aWV3ID0gZmFsc2VcIj5EYXRhXG4gICAgICAgICAgICBQcmV2aWV3PC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1lbmQgbXgtMSBmbGV4LWdyb3dcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fc3VjY2Vzc19tZH19IGN1cnNvci1wb2ludGVyIG10LTJcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImdldFNhdmVDaGFydENvbmZpZygpXCI+U3VibWl0PC9idXR0b24+XG4gICAgPC9kaXY+XG48L2Rpdj4iXX0=
|
|
560
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvLW1hcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nYW1tYS1hcHAtY29udHJvbGxlci9zcmMvbGliL2FwcGxpY2F0aW9uLWNvbnRyb2xsZXIvc3VwcG9ydC1jb21wb25lbnRzL2dlby1tYXAvZ2VvLW1hcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nYW1tYS1hcHAtY29udHJvbGxlci9zcmMvbGliL2FwcGxpY2F0aW9uLWNvbnRyb2xsZXIvc3VwcG9ydC1jb21wb25lbnRzL2dlby1tYXAvZ2VvLW1hcC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQXFCLFNBQVMsRUFBNEIsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQStCLE1BQU0sZUFBZSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FBV3pKLE1BQU0sT0FBTyxlQUFlO0lBaUoxQixZQUFtQixhQUE0QixFQUFVLEdBQXNCLEVBQVUsT0FBa0MsRUFBVSxNQUFxQjtRQUF2SSxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUFVLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQVUsWUFBTyxHQUFQLE9BQU8sQ0FBMkI7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFlO1FBaEoxSiwwQkFBcUIsR0FBRztZQUN0QjtnQkFDRSxNQUFNLEVBQUUsZUFBZTtnQkFDdkIsT0FBTyxFQUFFLGFBQWE7YUFDdkI7WUFDRDtnQkFDRSxNQUFNLEVBQUUsaUJBQWlCO2dCQUN6QixPQUFPLEVBQUUsZUFBZTthQUN6QjtZQUNEO2dCQUNFLE1BQU0sRUFBRSwwQkFBMEI7Z0JBQ2xDLE9BQU8sRUFBRSxrQkFBa0I7YUFDNUI7U0FDRixDQUFBO1FBRUQsdUJBQWtCLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBQ3BELFlBQU8sR0FBUSxFQUFFLENBQUM7UUFFbEIsNEJBQXVC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QyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakMsQ0FBQzs7NEdBM3BCVSxlQUFlO2dHQUFmLGVBQWUsd0xDWjVCLCtzd0NBMm1CTTsyRkQvbEJPLGVBQWU7a0JBTDNCLFNBQVM7K0JBQ0UsYUFBYTt3TUF3Sk4sd0JBQXdCO3NCQUF4QyxNQUFNO2dCQUlILGVBQWU7c0JBRGxCLEtBQUs7dUJBQUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgQ29tcG9uZW50UmVmLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBcHBsaWNhdGlvbkNvbnRlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vYXBwbGljYXRpb24tY29udGVudC5zZXJ2aWNlJztcbmltcG9ydCB7IFRvYXN0clNlcnZpY2UgfSBmcm9tICduZ3gtdG9hc3RyJztcbmltcG9ydCB7IENvbW1vblNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb21tb24nO1xuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1nZW8tbWFwJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2dlby1tYXAuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9nZW8tbWFwLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgR2VvTWFwQ29tcG9uZW50IHtcbiAgaGVhdE1hcFR5cGVEYXRhc291cmNlID0gW1xuICAgIHtcbiAgICAgIFwibmFtZVwiOiBcIkhlYXQgTWFwIE9ubHlcIixcbiAgICAgIFwidmFsdWVcIjogXCJoZWF0TWFwT25seVwiXG4gICAgfSxcbiAgICB7XG4gICAgICBcIm5hbWVcIjogXCJIZWF0IE1hcCBNYXJrZXJcIixcbiAgICAgIFwidmFsdWVcIjogXCJoZWF0TWFwTWFya2VyXCJcbiAgICB9LFxuICAgIHtcbiAgICAgIFwibmFtZVwiOiBcIkhlYXQgTWFwIEFuZCBIZWF0IE1hcmtlclwiLFxuICAgICAgXCJ2YWx1ZVwiOiBcImhlYXRNYXBBbmRNYXJrZXJcIlxuICAgIH1cbiAgXVxuICBjaGFydFZpZXdUeXBlOiBhbnk7XG4gIG1hcEljb25zRGF0YVNvdXJjZSA9IFtcImFzc2V0cy9jdXN0b20tbWFya2VyLi5qcGVnXCJdO1xuICBtYXBUeXBlOiBhbnkgPSAnJztcblxuICBjaGFydFZpZXdUeXBlRGF0YVNvdXJjZSA9IFtcbiAgICB7IG5hbWU6ICdHRU8gTWFwJywgdmFsdWU6ICdnZW9NYXAnIH0sXG4gICAgeyBuYW1lOiAnSGVhdCBNYXAnLCB2YWx1ZTogJ2hlYXRNYXAnIH0sXG4gICAgeyBuYW1lOiAnQnViYmxlIE1hcCcsIHZhbHVlOiAnYnViYmxlTWFwJyB9LFxuICAgIHsgbmFtZTogJ0Nob3JvcGxldGggTWFwJywgdmFsdWU6ICdjaG9yb3BsZXRoTWFwJyB9XG4gIF07XG5cbiAgcmVnaW9uRGF0YSA9IFtcImNvdW50cnlcIiwgXCJjaXR5XCJdO1xuICBjaGFydERhdGFTb3VyY2VGb3JNYXA6IGFueTtcbiAgY29sb3JzOiBzdHJpbmdbXSA9IFtdOyAvLyBBcnJheSB0byBob2xkIHNlbGVjdGVkIGNvbG9yc1xuICBpc0pzb25QcmV2aWV3OiBib29sZWFuO1xuICBkYXRhU291cnNlRm9yVGFibGU6IGFueSA9IFtdO1xuICBqc2FvbkRhdGFzb3VyY2U6IGFueTtcbiAgY29uZmlnQ29sdW1lOiBhbnk7XG4gIGFsbENvbmZpZ3VyZWRWaWV3czogYW55ID0gW107XG4gIC8vIGdyb3VwT2ZWaWV3czogYW55O1xuICB2aWV3UHJvcGVydGllczogYW55ID0ge1xuICAgIGVuYWJsZUNsaWNrRXZlbnQ6IGZhbHNlLFxuICAgIGVuYWJsZVJpZ2h0Q2xpY2tFdmVudDogdHJ1ZSxcbiAgICBjbGlja0V2ZW50T3B0aW9uczoge1xuICAgICAgYXNzb2NpYXRlZFZpZXdzOiBbXSxcbiAgICAgIGV2ZW50VHlwZTogXCJcIlxuICAgIH1cbiAgfTtcbiAgb3B0aW9uYWxEcmlsRG93bkRhdGFTb3VyY2U6IGFueSA9IFtdO1xuICB0YWJsZV9jb2x1bW5zX2NvbmZpZyA9IHtcbiAgICBcImtwaUNvbmZpZ1wiOiB7XG4gICAgICBcInNlcnZpY2VJZFwiOiBcIlwiLFxuICAgICAgXCJhcGlcIjogXCIva3BpL3RyZW5kcy9uZXR3b3JrL2dldC1tZXRyaWMtZGF0YVwiLFxuICAgICAgXCJkaXNwbGF5VHlwZVwiOiBcImdvb2dsZUNoYXJ0XCIsXG4gICAgICBcImZvcm1hdGVcIjogXCJcIixcbiAgICAgIFwia2V5VG9QYXNzXCI6IFtdLFxuICAgICAgXCJjb21wb25lbnROYW1lXCI6IFwiR2FtbWFHZW9DaGFydENvbXBvbmVudFwiLFxuICAgICAgXCJkYXRhQ29uZmlnXCI6IHt9XG4gICAgfSxcbiAgfTtcbiAgaGVhdE1hcENvbmZpZyA9IHtcbiAgICBcImNoYXJ0X2NvbmZpZ1wiOiBbXG5cbiAgICBdLFxuICAgIFwiaGVhdE1hcENhdGVnb3J5XCI6IFwiXCIsXG4gICAgLy8gXCJjZW50ZXJMYXRpdHVkZVwiOlwiXCIsXG4gICAgLy8gXCJjZW50ZXJMb25naXR1ZGVcIjpcIlwiLFxuICAgIFwiaWNvblwiOiBcImFzc2V0cy9jdXN0b20tbWFya2VyLi5qcGVnXCIsXG4gICAgXCJtYXJrZXJMYXRpdHVkZVwiOiBcIlwiLFxuICAgIFwibWFya2VyTG9uZ2l0dWRlXCI6IFwiXCIsXG4gICAgXCJzaXplXCI6ICc0NTAnLFxuICAgIFwiem9vbVwiOiBcIlwiXG4gIH1cbiAgYnViYmxlTWFwQ29uZmlnID0ge1xuICAgIFwiY2hhcnRfY29uZmlnXCI6IFtcblxuICAgIF0sXG4gICAgXCJhZ3J1bWVudFZhbHVlXCI6IFwiXCIsXG4gICAgXCJidWJibGVDb2xvclwiOiBcIiMyODVlMDhcIixcbiAgICBcInNpemVcIjogJzQ1MCcsXG4gICAgXCJidWJibGVNaW5pbXVtU2l6ZVwiOiBcIjVcIixcbiAgICBcImJ1YmJsZU1heGltdW1TaXplXCI6IFwiMTVcIixcbiAgICBcIm1hcmtlckxhdGl0dWRlXCI6IFwiXCIsXG4gICAgXCJtYXJrZXJMb25naXR1ZGVcIjogXCJcIixcbiAgICBcInNvcnRCeVwiOiBcIlwiXG4gICAgLy8gIFwiem9vbVwiOlwiXCJcbiAgfVxuICB0YWJsZURhdGFDb25maWcgPSB7XG5cbiAgICBcImNoYXJ0X2NvbmZpZ1wiOiBbXG5cbiAgICBdLFxuICAgIFwicmVnaW9uXCI6IFwiXCIsXG4gICAgXCJyZWdpb25Db2RlXCI6IFwiVVNcIixcbiAgICAvLyBcInRpdGxlXCI6IFwiXCIsXG4gICAgXCJhcmd1bWVudEZpZWxkXCI6IFwiXCIsXG4gICAgXCJjaGFydFZhbHVlRmllbGRcIjogXCJcIixcbiAgICBcInNpemVcIjogXCI0NTBcIixcbiAgICBcImNoYXJ0VHlwZVwiOiBcImdlb2NoYXJ0XCIsXG4gICAgXCJiYWNrZ3JvdW5kQ29sb3JcIjogXCIjNmM5OGUwXCIsXG4gICAgXCJjb2xvcnNcIjogWycjMDAzNTY2JywgJyNmZDAwMDAnXVxuXG4gIH1cblxuXG4gIC8vIGZvciBjaG9yb3BsZXRoTWFwXG5cblxuICBjaG9yb3BsZXRoTWFwQ29uZmlnID0ge1xuICAgIGNoYXJ0X2NvbmZpZzogW1xuICAgICAge1xuICAgICAgICBkYXRhRmllbGQ6IFwiY250XCIsXG4gICAgICAgIGNhcHRpb246IFwiQ291bnRcIixcbiAgICAgICAgZGlzcGxheUZvcjogXCJtYXBcIixcbiAgICAgICAgZW5yaWNoTmFtZTogXCJcIlxuICAgICAgfVxuICAgIF0sXG4gICAgem9vbTogXCI3XCIsXG4gICAgaXNWYWx1ZUZpZWxkUmFuZ2VTbGlkZXI6IHRydWUsXG4gICAgc2xpZGVTcGVlZDogMTAwMCxcbiAgICBpc0RhdGFBZ2dyZWdhdGlvbjogZmFsc2UsXG4gICAgZGF0YUFnZ3JlZ2F0aW9uQ29uZmlnOiB7XG4gICAgICBcImRhdGFBZ2dyZWdhdGVDb2x1bWVzXCI6IFtdLFxuICAgICAgXCJhZ2dyZWdhdGVGaWVsZHNcIjogW11cbiAgICB9LFxuICAgIHNsaWRlclZhbHVlRmllbGQ6IFwieWVhclwiLFxuICAgIGNlbnRlckxhdDogXCIxLjM3MzNcIixcbiAgICBjZW50ZXJMbmc6IFwiMzIuMjkwM1wiLFxuICAgIGFyZ3VtZW50RmllbGQ6IFwiZGlzdHJpY3RcIixcbiAgICBnanNvbkZpbGVQYXRoOiBcIi9hc3NldHMvYXBpLWRhdGEvdWdhbmRhX2Rpc3RyaWN0cy5nZW9qc29uXCIsXG4gICAgc2l6ZTogXCI0NTBcIixcbiAgICBjaGFydFR5cGU6IFwiY2hvcm9wbGV0aE1hcFwiLFxuICAgIGNvbG9yT25lOiAnIzA4OTI3NCcsXG4gICAgY29sb3JUd286ICcjZjBmOTIxJyxcbiAgfVxuXG4gIGlzQ2VudGVyZENob3JvcGxldGhNYXA6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY2VudGFyTGFpdG5nT2JqZWN0ID0ge1xuICAgIGxhdEtleTogXCJcIixcbiAgICBsbmdLZXk6IFwiXCJcbiAgfVxuXG4gIGVucmljaE5hbWVMaXN0ID0gW1wiYWJicmV2aWF0ZU51bWJlclwiLCBcImdldENvbG9yQ29kZVNwYW5cIiwgXCJUaG91c2FuZFNlcGFyYXRvclwiLCBcImZvcm1hdEJ5dGVzdjJcIl1cbiAgc2VsZWN0ZWRUYWJsZVZpZXdUeXBlOiBhbnk7XG4gIGlzTG9hZGVyOiBib29sZWFuID0gdHJ1ZTtcblxuICBzZWxlY3RlZFZpZXdDb25maWdzOiBhbnk7XG4gIHVzZXJPcHRpb25Db250YWluZXI6IGFueSA9IFtdO1xuICBwcmV2aWV3RGF0YTogYW55O1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBjb21tb25TZXJ2aWNlOiBDb21tb25TZXJ2aWNlLCBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgc2VydmljZTogQXBwbGljYXRpb25Db250ZW50U2VydmljZSwgcHJpdmF0ZSB0YW9zdHI6IFRvYXN0clNlcnZpY2UpIHsgfVxuXG4gIGFjdGl2ZVRhYjogc3RyaW5nID0gJ2Jhc2ljJztcbiAgQE91dHB1dCgpIHB1YmxpYyBjcmVhdGVPdGhlckNvbXBvbmVudFZpZXc6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBzZWxlY3RlZFZpZXdzID0gW107XG5cbiAgQElucHV0KCdkYXRhc2V0bW9kYWwnKVxuICBzZXQgY2hhcnRjb25maWdEYXRhKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuanNhb25EYXRhc291cmNlID0gdmFsdWUuZGF0YVswXTtcbiAgICAgIHRoaXMuY29uZmlnQ29sdW1lID0gT2JqZWN0LmtleXModmFsdWUuZGF0YVswXSk7XG4gICAgICB0aGlzLmRhdGFTb3Vyc2VGb3JUYWJsZSA9IHZhbHVlLmRhdGE7XG4gICAgICB0aGlzLnNlbGVjdGVkVmlld0NvbmZpZ3MgPSB2YWx1ZTtcbiAgICAgIHRoaXMucHJldmlld0RhdGEgPSB2YWx1ZS5kYXRhO1xuXG4gICAgICB0aGlzLnNlbGVjdGVkVGFibGVWaWV3VHlwZSA9IHZhbHVlLnNlbGVjdGVkVmlld1R5cGU7XG4gICAgICB0aGlzLnVzZXJPcHRpb25Db250YWluZXIgPSB2YWx1ZS5zZWxlY3RlZFdpZGdldENvbmZpZz8ucGVybWlzc2lvbnMgPyB2YWx1ZS5zZWxlY3RlZFdpZGdldENvbmZpZy5wZXJtaXNzaW9ucyA6IFtdO1xuICAgICAgaWYgKHZhbHVlLnNlbGVjdGVkV2lkZ2V0Q29uZmlnKSB7XG5cbiAgICAgICAgdGhpcy50YWJsZV9jb2x1bW5zX2NvbmZpZ1sna3BpQ29uZmlnJ10gPSB2YWx1ZS5zZWxlY3RlZFdpZGdldENvbmZpZztcbiAgICAgICAgdGhpcy5tYXBUeXBlID0gdmFsdWUuc2VsZWN0ZWRXaWRnZXRDb25maWcuZGF0YUNvbmZpZy5tYXBUeXBlO1xuICAgICAgICBpZiAodGhpcy5tYXBUeXBlID09IFwiZ2VvTWFwXCIpIHtcbiAgICAgICAgICB0aGlzLnRhYmxlRGF0YUNvbmZpZyA9IHZhbHVlLnNlbGVjdGVkV2lkZ2V0Q29uZmlnLmRhdGFDb25maWc7XG4gICAgICAgICAgdGhpcy50YWJsZURhdGFDb25maWcuY2hhcnRfY29uZmlnID0gdmFsdWUuc2VsZWN0ZWRXaWRnZXRDb25maWcuZGF0YUNvbmZpZy5jaGFydF9jb25maWc7XG5cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm1hcFR5cGUgPT0gJ2J1YmJsZU1hcCcpIHtcbiAgICAgICAgICB0aGlzLmJ1YmJsZU1hcENvbmZpZyA9IHZhbHVlLnNlbGVjdGVkV2lkZ2V0Q29uZmlnLmRhdGFDb25maWc7XG4gICAgICAgICAgdGhpcy5idWJibGVNYXBDb25maWcuY2hhcnRfY29uZmlnID0gdmFsdWUuc2VsZWN0ZWRXaWRnZXRDb25maWcuZGF0YUNvbmZpZy5jaGFydF9jb25maWc7XG4gICAgICAgICAgdGhpcy50YWJsZURhdGFDb25maWcuY2hhcnRfY29uZmlnID0gdmFsdWUuc2VsZWN0ZWRXaWRnZXRDb25maWcuZGF0YUNvbmZpZy5jaGFydF9jb25maWc7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5tYXBUeXBlID09ICdjaG9yb3BsZXRoTWFwJykge1xuICAgICAgICAgIHRoaXMuY2hvcm9wbGV0aE1hcENvbmZpZyA9IHZhbHVlLnNlbGVjdGVkV2lkZ2V0Q29uZmlnLmRhdGFDb25maWc7XG4gICAgICAgICAgdGhpcy5jaG9yb3BsZXRoTWFwQ29uZmlnLmNoYXJ0X2NvbmZpZyA9IHZhbHVlLnNlbGVjdGVkV2lkZ2V0Q29uZmlnLmRhdGFDb25maWcuY2hhcnRfY29uZmlnO1xuICAgICAgICAgIHRoaXMudGFibGVEYXRhQ29uZmlnLmNoYXJ0X2NvbmZpZyA9IHZhbHVlLnNlbGVjdGVkV2lkZ2V0Q29uZmlnLmRhdGFDb25maWcuY2hhcnRfY29uZmlnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHRoaXMuaGVhdE1hcENvbmZpZyA9IHZhbHVlLnNlbGVjdGVkV2lkZ2V0Q29uZmlnLmRhdGFDb25maWc7XG4gICAgICAgICAgdGhpcy5oZWF0TWFwQ29uZmlnLmNoYXJ0X2NvbmZpZyA9IHZhbHVlLnNlbGVjdGVkV2lkZ2V0Q29uZmlnLmRhdGFDb25maWcuY2hhcnRfY29uZmlnO1xuICAgICAgICAgIHRoaXMudGFibGVEYXRhQ29uZmlnLmNoYXJ0X2NvbmZpZyA9IHZhbHVlLnNlbGVjdGVkV2lkZ2V0Q29uZmlnLmRhdGFDb25maWcuY2hhcnRfY29uZmlnO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZS5zZWxlY3RlZFdpZGdldENvbmZpZy52aWV3UHJvcGVydGllcyAmJiB2YWx1ZS5zZWxlY3RlZFdpZGdldENvbmZpZy52aWV3UHJvcGVydGllcy5jbGlja0V2ZW50T3B0aW9ucy5hc3NvY2lhdGVkVmlld3MpIHtcbiAgICAgICAgICB0aGlzLnZpZXdQcm9wZXJ0aWVzID0gdmFsdWUuc2VsZWN0ZWRXaWRnZXRDb25maWcudmlld1Byb3BlcnRpZXM7XG4gICAgICAgICAgdGhpcy52aWV3UHJvcGVydGllcyA9IHtcbiAgICAgICAgICAgIFwiZW5hYmxlQ2xpY2tFdmVudFwiOiB2YWx1ZS5zZWxlY3RlZFdpZGdldENvbmZpZy52aWV3UHJvcGVydGllcy5lbmFibGVDbGlja0V2ZW50LFxuICAgICAgICAgICAgXCJlbmFibGVSaWdodENsaWNrRXZlbnRcIjogdmFsdWUuc2VsZWN0ZWRXaWRnZXRDb25maWcudmlld1Byb3BlcnRpZXMuZW5hYmxlUmlnaHRDbGlja0V2ZW50XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHZhbHVlLnNlbGVjdGVkV2lkZ2V0Q29uZmlnLnZpZXdQcm9wZXJ0aWVzLmVuYWJsZUNsaWNrRXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMudmlld1Byb3BlcnRpZXNbJ2NsaWNrRXZlbnRPcHRpb25zJ10gPSB7XG4gICAgICAgICAgICAgIFwiZXZlbnRUeXBlXCI6IHZhbHVlLnNlbGVjdGVkV2lkZ2V0Q29uZmlnLnZpZXdQcm9wZXJ0aWVzLmNsaWNrRXZlbnRPcHRpb25zLmV2ZW50VHlwZSxcbiAgICAgICAgICAgICAgXCJhc3NvY2lhdGVkVmlld3NcIjogdmFsdWUuc2VsZWN0ZWRXaWRnZXRDb25maWcudmlld1Byb3BlcnRpZXMuY2xpY2tFdmVudE9wdGlvbnMuYXNzb2NpYXRlZFZpZXdzXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmlld1Byb3BlcnRpZXNbJ2NsaWNrRXZlbnRPcHRpb25zJ10gPSB7fVxuICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50YWJsZURhdGFDb25maWcuY2hhcnRfY29uZmlnID0gdmFsdWUuY29sdW1uRGF0YTtcbiAgICAgICAgaWYgKHRoaXMudGFibGVEYXRhQ29uZmlnLmNoYXJ0X2NvbmZpZykge1xuICAgICAgICAgIHRoaXMudGFibGVEYXRhQ29uZmlnLmNoYXJ0X2NvbmZpZy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgLy8gZWxlbWVudFsnY29sb3InXSA9ICcnO1xuICAgICAgICAgICAgLy8gZWxlbWVudFsnaXNTaG93QmFyJ10gPSB0cnVlO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy50YWJsZURhdGFDb25maWcuY2hhcnRfY29uZmlnID0gW107XG4gICAgICAgICAgdGhpcy5jb25maWdDb2x1bWUuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgIGxldCBvYmogPSB7XG4gICAgICAgICAgICAgIC8vIFwidmlzaWJsZVwiOiB0cnVlLFxuICAgICAgICAgICAgICAvLyBcImlzU2hvd0JhclwiOiB0cnVlLFxuICAgICAgICAgICAgICBcImRhdGFGaWVsZFwiOiBlbGVtZW50LFxuICAgICAgICAgICAgICBcImNhcHRpb25cIjogdGhpcy5jb21tb25TZXJ2aWNlLmNvbnZlcnRTdHJpbmcoZWxlbWVudCksXG4gICAgICAgICAgICAgIFwiZW5yaWNoTmFtZVwiOiBcIlwiLFxuICAgICAgICAgICAgICBcImRpc3BsYXlGb3JcIjogXCJtYXBcIixcbiAgICAgICAgICAgICAgLy8gXCJjb2xvclwiOiBcIlwiLFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnRhYmxlRGF0YUNvbmZpZy5jaGFydF9jb25maWcucHVzaChvYmopO1xuXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzTG9hZGVyID0gdHJ1ZTtcbiAgICB0aGlzLnNlcnZpY2UuZ2V0QXBwVmlld0NvbmZpZ3MoKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmFsbENvbmZpZ3VyZWRWaWV3cyA9IGRhdGE7XG5cbiAgICAgICAgdGhpcy5pc0xvYWRlciA9IGZhbHNlO1xuICAgICAgfSwgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnRhb3N0ci5lcnJvcignVW5leHBlY3RlZCBTZXJ2ZXIgRXhjZXB0aW9uLiBQbGVhc2UgY29udGFjdCBTeXN0ZW0gQWRtaW4uJywgJ0FsbCBWaWV3cycpXG4gICAgICB9XG4gICAgfSlcblxuICAgIHRoaXMub3B0aW9uYWxEcmlsRG93bkRhdGFTb3VyY2UgPSBbXG4gICAgICB7XG4gICAgICAgICd2aWV3SWQnOiBcIlwiLFxuICAgICAgICAnZmlsdGVyQ29uZGl0aW9uJzogXCJcIlxuICAgICAgfVxuICAgIF1cbiAgfVxuICBhZGRDb2x1bW5zKCkge1xuICAgIGxldCBvYmogPSB7XG4gICAgICBcImRhdGFGaWVsZFwiOiBcIlwiLFxuICAgICAgXCJjYXB0aW9uXCI6IFwiXCIsXG4gICAgICBcImVucmljaE5hbWVcIjogXCJcIixcbiAgICAgIFwiZGlzcGxheUZvclwiOiBcIlwiLFxuICAgIH1cblxuICAgIHRoaXMudGFibGVEYXRhQ29uZmlnLmNoYXJ0X2NvbmZpZy5wdXNoKG9iaik7XG4gIH1cblxuICBkZWxldGVDb2x1bW5zKGkpIHtcbiAgICB0aGlzLnRhYmxlRGF0YUNvbmZpZy5jaGFydF9jb25maWcuc3BsaWNlKGksIDEpXG4gIH1cblxuICBnZXRFbnJpY2hDbGFzc05hbWUoZSwgaXRlbSkge1xuICAgIGl0ZW0uZW5yaWNoTmFtZSA9IGUudmFsdWU7XG5cbiAgfVxuXG5cbiAgbW92ZUl0ZW1Gb3JDb2x1bW5zKGluZGV4OiBudW1iZXIsIGRpcmVjdGlvbjogJ3VwJyB8ICdkb3duJyk6IHZvaWQge1xuICAgIC8vIFByZXZlbnQgbW92aW5nIGJleW9uZCBhcnJheSBib3VuZHNcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMudGFibGVEYXRhQ29uZmlnLmNoYXJ0X2NvbmZpZy5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBuZXdQb3NpdGlvbiA9IGRpcmVjdGlvbiA9PT0gJ3VwJyA/IGluZGV4IC0gMSA6IGluZGV4ICsgMTtcbiAgICAvLyBQcmV2ZW50IG1vdmluZyBiZXlvbmQgYXJyYXkgYm91bmRzXG4gICAgaWYgKG5ld1Bvc2l0aW9uIDwgMCB8fCBuZXdQb3NpdGlvbiA+PSB0aGlzLnRhYmxlRGF0YUNvbmZpZy5jaGFydF9jb25maWcubGVuZ3RoKSByZXR1cm47XG5cbiAgICAvLyBNb3ZlIGl0ZW1cbiAgICBjb25zdCBpdGVtVG9Nb3ZlID0gdGhpcy50YWJsZURhdGFDb25maWcuY2hhcnRfY29uZmlnW2luZGV4XTtcbiAgICB0aGlzLnRhYmxlRGF0YUNvbmZpZy5jaGFydF9jb25maWcuc3BsaWNlKGluZGV4LCAxKTsgLy8gUmVtb3ZlIGl0ZW0gZnJvbSBjdXJyZW50IHBvc2l0aW9uXG4gICAgdGhpcy50YWJsZURhdGFDb25maWcuY2hhcnRfY29uZmlnLnNwbGljZShuZXdQb3NpdGlvbiwgMCwgaXRlbVRvTW92ZSk7IC8vIEluc2VydCBpdGVtIGluIG5ldyBwb3NpdGlvblxuICB9XG5cbiAgZ2V0T2JqZWN0S2V5cyhvYmo6IGFueSk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKTtcbiAgfVxuICBzZXRBY3RpdmVUYWIodGFiOiBzdHJpbmcpIHtcbiAgICB0aGlzLmFjdGl2ZVRhYiA9IHRhYjtcbiAgfVxuXG4gIGdldEdyb3VwQ29sdW1ucyhjb2x1bW5zKSB7XG4gICAgY29uc3QgZ3JvdXBlZENvbHVtbnMgPSBjb2x1bW5zLnJlZHVjZSgoYWNjLCBjb2x1bW4pID0+IHtcbiAgICAgIGxldCBncm91cCA9IGFjYy5maW5kKGl0ZW0gPT4gaXRlbS5jYXB0aW9uID09PSBjb2x1bW4uZ3JvdXApO1xuICAgICAgaWYgKCFncm91cCkge1xuICAgICAgICBncm91cCA9IHtcbiAgICAgICAgICBjYXB0aW9uOiBjb2x1bW4uZ3JvdXAsXG4gICAgICAgICAgY29sdW1uczogW11cbiAgICAgICAgfTtcbiAgICAgICAgYWNjLnB1c2goZ3JvdXApO1xuICAgICAgfVxuICAgICAgZ3JvdXAuY29sdW1ucy5wdXNoKHtcbiAgICAgICAgZGF0YUZpZWxkOiBjb2x1bW4uZGF0YUZpZWxkLFxuICAgICAgICAvLyB2aXNpYmxlOiBjb2x1bW4udmlzaWJsZSxcbiAgICAgICAgY2FwdGlvbjogY29sdW1uLmNhcHRpb25cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBbXSk7XG4gICAgcmV0dXJuIGdyb3VwZWRDb2x1bW5zO1xuICB9XG4gIGdlQ29sdW1uc0Zyb21Hcm91cChjb2x1bW5zKSB7XG4gICAgY29uc3QgbmV3Q29sdW1ucyA9IFtdO1xuXG4gICAgY29sdW1ucy5mb3JFYWNoKGdyb3VwID0+IHtcbiAgICAgIGdyb3VwLmNvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xuICAgICAgICBuZXdDb2x1bW5zLnB1c2goe1xuICAgICAgICAgIGRhdGFGaWVsZDogY29sLmRhdGFGaWVsZCxcbiAgICAgICAgICAvLyB2aXNpYmxlOiBjb2wudmlzaWJsZSxcbiAgICAgICAgICBjYXB0aW9uOiBjb2wuY2FwdGlvbixcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gbmV3Q29sdW1ucztcbiAgfVxuXG5cbiAgZ2V0U2F2ZUNoYXJ0Q29uZmlnKCkge1xuXG4gICAgaWYgKHRoaXMubWFwVHlwZSA9PSAnZ2VvTWFwJykge1xuICAgICAgdGhpcy50YWJsZV9jb2x1bW5zX2NvbmZpZy5rcGlDb25maWdbJ2RhdGFDb25maWcnXSA9IHRoaXMudGFibGVEYXRhQ29uZmlnO1xuICAgICAgdGhpcy50YWJsZV9jb2x1bW5zX2NvbmZpZy5rcGlDb25maWdbJ2RhdGFDb25maWcnXVsnbWFwVHlwZSddID0gdGhpcy5tYXBUeXBlO1xuICAgICAgaWYgKHRoaXMudmlld1Byb3BlcnRpZXMuY2xpY2tFdmVudE9wdGlvbnMuZXZlbnRUeXBlID09ICdvcHRpb25hbERyaWxsRG93bicpIHtcbiAgICAgICAgdGhpcy52aWV3UHJvcGVydGllc1snY2xpY2tFdmVudE9wdGlvbnMnXVsnYXNzb2NpYXRlZFZpZXdzJ10gPSB0aGlzLm9wdGlvbmFsRHJpbERvd25EYXRhU291cmNlO1xuICAgICAgfVxuICAgICAgdGhpcy50YWJsZV9jb2x1bW5zX2NvbmZpZy5rcGlDb25maWdbJ3ZpZXdQcm9wZXJ0aWVzJ10gPSB0aGlzLnZpZXdQcm9wZXJ0aWVzO1xuICAgICAgdGhpcy50YWJsZV9jb2x1bW5zX2NvbmZpZ1sncGVybWlzc2lvbnMnXSA9IHRoaXMudXNlck9wdGlvbkNvbnRhaW5lcjtcblxuICAgICAgdGhpcy5jcmVhdGVPdGhlckNvbXBvbmVudFZpZXcuZW1pdCh0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubWFwVHlwZSA9PSAnYnViYmxlTWFwJykge1xuICAgICAgdGhpcy50YWJsZV9jb2x1bW5zX2NvbmZpZy5rcGlDb25maWdbJ2RhdGFDb25maWcnXSA9IHRoaXMuYnViYmxlTWFwQ29uZmlnO1xuICAgICAgdGhpcy50YWJsZV9jb2x1bW5zX2NvbmZpZy5rcGlDb25maWdbJ2RhdGFDb25maWcnXVsnY2hhcnRfY29uZmlnJ10gPSB0aGlzLnRhYmxlRGF0YUNvbmZpZy5jaGFydF9jb25maWc7XG4gICAgICB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnLmtwaUNvbmZpZ1snZGF0YUNvbmZpZyddWydtYXBUeXBlJ10gPSB0aGlzLm1hcFR5cGU7XG5cbiAgICAgIGlmICh0aGlzLnZpZXdQcm9wZXJ0aWVzLmNsaWNrRXZlbnRPcHRpb25zLmV2ZW50VHlwZSA9PSAnb3B0aW9uYWxEcmlsbERvd24nKSB7XG4gICAgICAgIHRoaXMudmlld1Byb3BlcnRpZXNbJ2NsaWNrRXZlbnRPcHRpb25zJ11bJ2Fzc29jaWF0ZWRWaWV3cyddID0gdGhpcy5vcHRpb25hbERyaWxEb3duRGF0YVNvdXJjZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy50YWJsZV9jb2x1bW5zX2NvbmZpZy5rcGlDb25maWdbJ3ZpZXdQcm9wZXJ0aWVzJ10gPSB0aGlzLnZpZXdQcm9wZXJ0aWVzO1xuICAgICAgdGhpcy50YWJsZV9jb2x1bW5zX2NvbmZpZy5rcGlDb25maWdbJ2RhdGFTb3VyY2UnXSA9ICcnO1xuICAgICAgdGhpcy50YWJsZV9jb2x1bW5zX2NvbmZpZ1sncGVybWlzc2lvbnMnXSA9IHRoaXMudXNlck9wdGlvbkNvbnRhaW5lcjtcblxuICAgICAgdGhpcy5jcmVhdGVPdGhlckNvbXBvbmVudFZpZXcuZW1pdCh0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnKTtcblxuICAgIH0gZWxzZSBpZiAodGhpcy5tYXBUeXBlID09ICdjaG9yb3BsZXRoTWFwJykge1xuICAgICAgdGhpcy50YWJsZV9jb2x1bW5zX2NvbmZpZy5rcGlDb25maWdbJ2RhdGFDb25maWcnXSA9IHRoaXMuY2hvcm9wbGV0aE1hcENvbmZpZztcbiAgICAgIHRoaXMudGFibGVfY29sdW1uc19jb25maWcua3BpQ29uZmlnWydkYXRhQ29uZmlnJ11bJ2NoYXJ0X2NvbmZpZyddID0gdGhpcy50YWJsZURhdGFDb25maWcuY2hhcnRfY29uZmlnO1xuICAgICAgdGhpcy50YWJsZV9jb2x1bW5zX2NvbmZpZy5rcGlDb25maWdbJ2RhdGFDb25maWcnXVsnbWFwVHlwZSddID0gdGhpcy5tYXBUeXBlO1xuICAgICAgaWYgKHRoaXMudmlld1Byb3BlcnRpZXMuY2xpY2tFdmVudE9wdGlvbnMuZXZlbnRUeXBlID09ICdvcHRpb25hbERyaWxsRG93bicpIHtcbiAgICAgICAgdGhpcy52aWV3UHJvcGVydGllc1snY2xpY2tFdmVudE9wdGlvbnMnXVsnYXNzb2NpYXRlZFZpZXdzJ10gPSB0aGlzLm9wdGlvbmFsRHJpbERvd25EYXRhU291cmNlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnLmtwaUNvbmZpZ1sndmlld1Byb3BlcnRpZXMnXSA9IHRoaXMudmlld1Byb3BlcnRpZXM7XG4gICAgICB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnLmtwaUNvbmZpZ1snZGF0YVNvdXJjZSddID0gJyc7XG4gICAgICB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnWydwZXJtaXNzaW9ucyddID0gdGhpcy51c2VyT3B0aW9uQ29udGFpbmVyO1xuXG4gICAgICB0aGlzLmNyZWF0ZU90aGVyQ29tcG9uZW50Vmlldy5lbWl0KHRoaXMudGFibGVfY29sdW1uc19jb25maWcpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGFibGVfY29sdW1uc19jb25maWcua3BpQ29uZmlnWydkYXRhQ29uZmlnJ10gPSB0aGlzLmhlYXRNYXBDb25maWc7XG4gICAgICB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnLmtwaUNvbmZpZ1snZGF0YUNvbmZpZyddWydjaGFydF9jb25maWcnXSA9IHRoaXMudGFibGVEYXRhQ29uZmlnLmNoYXJ0X2NvbmZpZztcbiAgICAgIHRoaXMudGFibGVfY29sdW1uc19jb25maWcua3BpQ29uZmlnWydkYXRhQ29uZmlnJ11bJ21hcFR5cGUnXSA9IHRoaXMubWFwVHlwZTtcbiAgICAgIGlmICh0aGlzLnZpZXdQcm9wZXJ0aWVzLmNsaWNrRXZlbnRPcHRpb25zLmV2ZW50VHlwZSA9PSAnb3B0aW9uYWxEcmlsbERvd24nKSB7XG4gICAgICAgIHRoaXMudmlld1Byb3BlcnRpZXNbJ2NsaWNrRXZlbnRPcHRpb25zJ11bJ2Fzc29jaWF0ZWRWaWV3cyddID0gdGhpcy5vcHRpb25hbERyaWxEb3duRGF0YVNvdXJjZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy50YWJsZV9jb2x1bW5zX2NvbmZpZy5rcGlDb25maWdbJ3ZpZXdQcm9wZXJ0aWVzJ10gPSB0aGlzLnZpZXdQcm9wZXJ0aWVzO1xuICAgICAgdGhpcy50YWJsZV9jb2x1bW5zX2NvbmZpZ1sncGVybWlzc2lvbnMnXSA9IHRoaXMudXNlck9wdGlvbkNvbnRhaW5lcjtcblxuICAgICAgdGhpcy5jcmVhdGVPdGhlckNvbXBvbmVudFZpZXcuZW1pdCh0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnKTtcbiAgICB9XG5cbiAgICAvLyBhbGVydChKU09OLnN0cmluZ2lmeSh0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnLCBudWxsLCAyKSk7XG4gICAgLy8gY29uc29sZS5sb2codGhpcy50YWJsZV9jb2x1bW5zX2NvbmZpZyk7XG4gICAgLy8gY29uc29sZS5sb2codGhpcy50YWJsZV9jb2x1bW5zX2NvbmZpZyk7XG5cbiAgICAvLyB0aGlzLmNyZWF0ZU90aGVyQ29tcG9uZW50Vmlldy5lbWl0KHRoaXMudGFibGVfY29sdW1uc19jb25maWcpO1xuICAgIC8vIHRoaXMudGFibGVfY29sdW1uc19jb25maWcua3BpQ29uZmlnWydkYXRhU291cmNlJ109IHRoaXMuZGF0YVNvdXJzZUZvclRhYmxlO1xuICAgIC8vIHRoaXMuY2hhcnREYXRhU291cmNlRm9yTWFwID0gdGhpcy50YWJsZV9jb2x1bW5zX2NvbmZpZztcblxuICB9XG5cbiAgZGVsZXRlQXNzb2NpYXRlZFBhcmFtcyhpbmRleCkge1xuICAgIHRoaXMub3B0aW9uYWxEcmlsRG93bkRhdGFTb3VyY2Uuc3BsaWNlKGluZGV4LCAxKVxuICB9XG5cbiAgYWRkQXNzb2NpYXRlZFBhcmFtcygpIHtcbiAgICB0aGlzLm9wdGlvbmFsRHJpbERvd25EYXRhU291cmNlLnB1c2goe1xuICAgICAgJ3ZpZXdJZCc6IFwiXCIsXG4gICAgICAnZmlsdGVyQ29uZGl0aW9uJzogXCJcIlxuICAgIH0pXG4gIH1cblxuICBnZXRTZWxlY3RlZEV2ZW50VHlwZShlKSB7XG5cbiAgICBpZiAoZS5ldmVudCkge1xuICAgICAgdGhpcy5vcHRpb25hbERyaWxEb3duRGF0YVNvdXJjZSA9IFtdO1xuICAgICAgaWYgKHRoaXMudmlld1Byb3BlcnRpZXMuY2xpY2tFdmVudE9wdGlvbnMuZXZlbnRUeXBlID09ICdkcmlsbGRvd24nKSB7XG4gICAgICAgIHRoaXMudGFibGVfY29sdW1uc19jb25maWcua3BpQ29uZmlnWyd2aWV3UHJvcGVydGllcyddWydhc3NvY2lhdGVkVmlld3MnXSA9IFtdO1xuICAgICAgfVxuICAgIH1cblxuXG4gIH1cblxuICByZXNldFZpZXdQcm9wcnN0aXNlKCkge1xuICAgIHRoaXMudmlld1Byb3BlcnRpZXMgPSB7XG4gICAgICBlbmFibGVDbGlja0V2ZW50OiBmYWxzZSxcbiAgICAgIGVuYWJsZVJpZ2h0Q2xpY2tFdmVudDogdHJ1ZSxcbiAgICAgIGNsaWNrRXZlbnRPcHRpb25zOiB7XG4gICAgICAgIGFzc29jaWF0ZWRWaWV3czogW10sXG4gICAgICAgIGV2ZW50VHlwZTogXCJcIlxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBhZGRDb2xvcigpIHtcbiAgICB0aGlzLnRhYmxlRGF0YUNvbmZpZy5jb2xvcnMucHVzaCgnIzAwMDAwMCcpOyAvLyBBZGQgZGVmYXVsdCBjb2xvclxuICB9XG5cbiAgcmVtb3ZlQ29sb3IoaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMudGFibGVEYXRhQ29uZmlnLmNvbG9ycy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG5cbiAgb25Db2xvckNoYW5nZSh2YWx1ZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy50YWJsZURhdGFDb25maWcuY29sb3JzW2luZGV4XSA9IHZhbHVlOyAvLyBVcGRhdGUgY29sb3IgYXQgaW5kZXhcbiAgfVxuXG4gIHZpZXdNYXBGb3JUZXN0KCkge1xuICAgIGlmICh0aGlzLm1hcFR5cGUgPT0gJ2dlb01hcCcpIHtcbiAgICAgIHRoaXMudGFibGVfY29sdW1uc19jb25maWcua3BpQ29uZmlnWydkYXRhQ29uZmlnJ10gPSB0aGlzLnRhYmxlRGF0YUNvbmZpZztcbiAgICAgIHRoaXMudGFibGVfY29sdW1uc19jb25maWcua3BpQ29uZmlnWydkYXRhQ29uZmlnJ11bJ21hcFR5cGUnXSA9IHRoaXMubWFwVHlwZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubWFwVHlwZSA9PSAnYnViYmxlTWFwJykge1xuICAgICAgdGhpcy50YWJsZV9jb2x1bW5zX2NvbmZpZy5rcGlDb25maWdbJ2RhdGFDb25maWcnXSA9IHRoaXMuYnViYmxlTWFwQ29uZmlnO1xuICAgICAgdGhpcy50YWJsZV9jb2x1bW5zX2NvbmZpZy5rcGlDb25maWdbJ2RhdGFDb25maWcnXVsnY2hhcnRfY29uZmlnJ10gPSB0aGlzLnRhYmxlRGF0YUNvbmZpZy5jaGFydF9jb25maWc7XG4gICAgICB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnLmtwaUNvbmZpZ1snZGF0YUNvbmZpZyddWydtYXBUeXBlJ10gPSB0aGlzLm1hcFR5cGU7XG4gICAgfSBlbHNlIGlmICh0aGlzLm1hcFR5cGUgPT0gJ2Nob3JvcGxldGhNYXAnKSB7XG4gICAgICB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnLmtwaUNvbmZpZ1snZGF0YUNvbmZpZyddID0gdGhpcy5jaG9yb3BsZXRoTWFwQ29uZmlnO1xuICAgICAgdGhpcy50YWJsZV9jb2x1bW5zX2NvbmZpZy5rcGlDb25maWdbJ2RhdGFDb25maWcnXVsnY2hhcnRfY29uZmlnJ10gPSB0aGlzLnRhYmxlRGF0YUNvbmZpZy5jaGFydF9jb25maWc7XG4gICAgICB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnLmtwaUNvbmZpZ1snZGF0YUNvbmZpZyddWydtYXBUeXBlJ10gPSB0aGlzLm1hcFR5cGU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy50YWJsZV9jb2x1bW5zX2NvbmZpZy5rcGlDb25maWdbJ2RhdGFDb25maWcnXSA9IHRoaXMuaGVhdE1hcENvbmZpZztcbiAgICAgIHRoaXMudGFibGVfY29sdW1uc19jb25maWcua3BpQ29uZmlnWydkYXRhQ29uZmlnJ11bJ2NoYXJ0X2NvbmZpZyddID0gdGhpcy50YWJsZURhdGFDb25maWcuY2hhcnRfY29uZmlnO1xuICAgICAgdGhpcy50YWJsZV9jb2x1bW5zX2NvbmZpZy5rcGlDb25maWdbJ2RhdGFDb25maWcnXVsnbWFwVHlwZSddID0gdGhpcy5tYXBUeXBlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnZpZXdQcm9wZXJ0aWVzLmNsaWNrRXZlbnRPcHRpb25zLmV2ZW50VHlwZSA9PSAnb3B0aW9uYWxEcmlsbERvd24nKSB7XG4gICAgICB0aGlzLnZpZXdQcm9wZXJ0aWVzWydjbGlja0V2ZW50T3B0aW9ucyddWydhc3NvY2lhdGVkVmlld3MnXSA9IHRoaXMub3B0aW9uYWxEcmlsRG93bkRhdGFTb3VyY2U7XG4gICAgfVxuXG4gICAgdGhpcy50YWJsZV9jb2x1bW5zX2NvbmZpZy5rcGlDb25maWdbJ3ZpZXdQcm9wZXJ0aWVzJ10gPSB0aGlzLnZpZXdQcm9wZXJ0aWVzO1xuXG4gICAgdGhpcy50YWJsZV9jb2x1bW5zX2NvbmZpZy5rcGlDb25maWdbJ2RhdGFTb3VyY2UnXSA9IHRoaXMuZGF0YVNvdXJzZUZvclRhYmxlO1xuICAgIHRoaXMuY2hhcnREYXRhU291cmNlRm9yTWFwID0gdGhpcy50YWJsZV9jb2x1bW5zX2NvbmZpZztcblxuICAgIHRoaXMuaXNKc29uUHJldmlldyA9IHRydWU7XG5cbiAgfVxuXG4gIGhlYXRNYXBDYXRlZ29yeShlKSB7XG4gICAgdGhpcy5oZWF0TWFwQ29uZmlnLmhlYXRNYXBDYXRlZ29yeSA9IGUudmFsdWU7XG4gIH1cblxuICBjaGFuZ2VNYXBUeXBlKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmV2ZW50KSB7XG4gICAgICB0aGlzLmhlYXRNYXBDb25maWcuaGVhdE1hcENhdGVnb3J5ID0gJyc7XG4gICAgfVxuICB9XG5cblxuXG4gIG9uTGF0TG5nS2V5Q2hhbmdlKGV2ZW50KSB7XG4gICAgY29uc3QgeyBsYXRLZXksIGxuZ0tleSB9ID0gdGhpcy5jZW50YXJMYWl0bmdPYmplY3Q7XG5cbiAgICBpZiAoIWxhdEtleSB8fCAhbG5nS2V5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jYWxjdWxhdGVDZW50ZXJGcm9tRGF0YXNvdXJjZSgpO1xuICB9XG5cbiAgY2FsY3VsYXRlQ2VudGVyRnJvbURhdGFzb3VyY2UoKSB7XG4gICAgY29uc3QgbGF0S2V5ID0gdGhpcy5jZW50YXJMYWl0bmdPYmplY3QubGF0S2V5O1xuICAgIGNvbnN0IGxuZ0tleSA9IHRoaXMuY2VudGFyTGFpdG5nT2JqZWN0LmxuZ0tleTtcblxuICAgIGlmICghbGF0S2V5IHx8ICFsbmdLZXkgfHwgIXRoaXMuZGF0YVNvdXJzZUZvclRhYmxlPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbWluTGF0ID0gSW5maW5pdHk7XG4gICAgbGV0IG1heExhdCA9IC1JbmZpbml0eTtcbiAgICBsZXQgbWluTG5nID0gSW5maW5pdHk7XG4gICAgbGV0IG1heExuZyA9IC1JbmZpbml0eTtcblxuICAgIHRoaXMuZGF0YVNvdXJzZUZvclRhYmxlLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBjb25zdCBsYXQgPSBOdW1iZXIoaXRlbVtsYXRLZXldKTtcbiAgICAgIGNvbnN0IGxuZyA9IE51bWJlcihpdGVtW2xuZ0tleV0pO1xuXG4gICAgICBpZiAoIWlzTmFOKGxhdCkgJiYgIWlzTmFOKGxuZykpIHtcbiAgICAgICAgbWluTGF0ID0gTWF0aC5taW4obWluTGF0LCBsYXQpO1xuICAgICAgICBtYXhMYXQgPSBNYXRoLm1heChtYXhMYXQsIGxhdCk7XG4gICAgICAgIG1pbkxuZyA9IE1hdGgubWluKG1pbkxuZywgbG5nKTtcbiAgICAgICAgbWF4TG5nID0gTWF0aC5tYXgobWF4TG5nLCBsbmcpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgY2VudGVyTGF0ID0gKG1pbkxhdCArIG1heExhdCkgLyAyO1xuICAgIGNvbnN0IGNlbnRlckxuZyA9IChtaW5MbmcgKyBtYXhMbmcpIC8gMjtcblxuICAgIC8vIOKchSBzdG9yZSBhcyBTVFJJTkdcbiAgICB0aGlzLmNob3JvcGxldGhNYXBDb25maWdbJ2NlbnRlckxhdCddID0gY2VudGVyTGF0LnRvRml4ZWQoNik7XG4gICAgdGhpcy5jaG9yb3BsZXRoTWFwQ29uZmlnWydjZW50ZXJMbmcnXSA9IGNlbnRlckxuZy50b0ZpeGVkKDYpO1xuICB9XG5cblxuXG5cblxuICAvLyBkYXRhIGFnZ3JlZ2F0aW9uIGNvZGVcblxuICBkYXRhQWdncmVnYXRpb25Db250YWluZXIgPSBbXTtcbiAgZGF0YUFnZ3JlZ2F0ZUdyb3VwQnlDb2x1bWU6IGFueSA9IFtdO1xuICBhZGRBZ2dyZWdhdGlvbkNvbHVtZSgpIHtcbiAgICB0aGlzLmRhdGFBZ2dyZWdhdGlvbkNvbnRhaW5lci5wdXNoKHtcbiAgICAgIGFnZ3JlZ2F0ZURhdGFGaWVsZDogXCJcIixcbiAgICAgIGFnZ3JlZ2F0ZUZ1bmN0aW9uVHlwZTogXCJcIlxuICAgIH0pXG4gIH1cblxuICBkZWxldGVBZ2dyZWdhdGlvbkNvbHVtZShpKSB7XG4gICAgdGhpcy5kYXRhQWdncmVnYXRpb25Db250YWluZXIuc3BsaWNlKGksIDEpXG4gIH1cblxuXG5cbiAgb25EYXRhR3JvdXBCeUNoYW5nZShldmVudDogYW55KSB7XG4gICAgaWYgKHRoaXMuY2hvcm9wbGV0aE1hcENvbmZpZy5pc0RhdGFBZ2dyZWdhdGlvbikge1xuXG4gICAgICB0aGlzLmRhdGFBZ2dyZWdhdGlvbkNvbnRhaW5lci5wdXNoKHtcbiAgICAgICAgYWdncmVnYXRlRGF0YUZpZWxkOiBcIlwiLFxuICAgICAgICBhZ2dyZWdhdGVGdW5jdGlvblR5cGU6IFwiXCJcbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGF0YVNvdXJzZUZvclRhYmxlID0gdGhpcy5wcmV2aWV3RGF0YS5zbGljZSgwLCAxMCk7XG4gICAgICB0aGlzLmNvbmZpZ0NvbHVtZSA9ICh0aGlzLnByZXZpZXdEYXRhWzBdKSA/IE9iamVjdC5rZXlzKHRoaXMucHJldmlld0RhdGFbMF0pIDogW107XG4gICAgfVxuXG4gICAgdGhpcy50YWJsZV9jb2x1bW5zX2NvbmZpZy5rcGlDb25maWdbJ2RhdGFDb25maWcnXSA9IHRoaXMuY2hvcm9wbGV0aE1hcENvbmZpZztcbiAgICB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnLmtwaUNvbmZpZ1snZGF0YUNvbmZpZyddWydjaGFydF9jb25maWcnXSA9IHRoaXMudGFibGVEYXRhQ29uZmlnLmNoYXJ0X2NvbmZpZztcbiAgICB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnLmtwaUNvbmZpZ1snZGF0YUNvbmZpZyddWydtYXBUeXBlJ10gPSB0aGlzLm1hcFR5cGU7XG5cbiAgICB0aGlzLmNoYXJ0RGF0YVNvdXJjZUZvck1hcCA9IHsgLi4udGhpcy50YWJsZV9jb2x1bW5zX2NvbmZpZyB9O1xuICB9XG5cbiAgc2F2ZUFnZ3JlZ2F0aW9uQ29sdW1lKCkge1xuICAgIGlmICh0aGlzLmNob3JvcGxldGhNYXBDb25maWcuaXNEYXRhQWdncmVnYXRpb24pIHtcbiAgICAgIGNvbnN0IGFnZ3JlYXRpb25EYXRhID0gdGhpcy5nZXRHcm91cERhdGFGb3JDaGFydCh0aGlzLnByZXZpZXdEYXRhLCB0aGlzLmRhdGFBZ2dyZWdhdGlvbkNvbnRhaW5lciwgdGhpcy5kYXRhQWdncmVnYXRlR3JvdXBCeUNvbHVtZSk7XG4gICAgICB0aGlzLmRhdGFTb3Vyc2VGb3JUYWJsZSA9IGFnZ3JlYXRpb25EYXRhO1xuICAgICAgdGhpcy5jb25maWdDb2x1bWUgPSAoYWdncmVhdGlvbkRhdGFbMF0pID8gT2JqZWN0LmtleXMoYWdncmVhdGlvbkRhdGFbMF0pIDogW107XG5cbiAgICAgIGlmICh0aGlzLmNob3JvcGxldGhNYXBDb25maWcuaXNEYXRhQWdncmVnYXRpb24pIHtcbiAgICAgICAgdGhpcy5jaG9yb3BsZXRoTWFwQ29uZmlnWydkYXRhQWdncmVnYXRpb25Db25maWcnXSA9IHtcbiAgICAgICAgICBcImRhdGFBZ2dyZWdhdGVDb2x1bWVzXCI6IHRoaXMuZGF0YUFnZ3JlZ2F0aW9uQ29udGFpbmVyLFxuICAgICAgICAgIFwiYWdncmVnYXRlRmllbGRzXCI6IHRoaXMuZGF0YUFnZ3JlZ2F0ZUdyb3VwQnlDb2x1bWVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zb2xlLmxvZyhhZ2dyZWF0aW9uRGF0YSk7XG4gICAgfVxuICB9XG5cblxuICBnZXRHcm91cERhdGFGb3JDaGFydChkYXRhLCBhZ2dyZWdhdGlvbkNvbmZpZywgZ3JvdXBCeUNvbHVtbnMpIHtcbiAgICBjb25zdCBncm91cE1hcCA9IHt9O1xuXG4gICAgZGF0YS5mb3JFYWNoKHJvdyA9PiB7XG4gICAgICBjb25zdCBncm91cEtleSA9IGdyb3VwQnlDb2x1bW5zLm1hcChjb2wgPT4gcm93W2NvbF0pLmpvaW4oXCJ8fFwiKTtcblxuICAgICAgaWYgKCFncm91cE1hcFtncm91cEtleV0pIHtcbiAgICAgICAgZ3JvdXBNYXBbZ3JvdXBLZXldID0ge307XG5cbiAgICAgICAgZ3JvdXBCeUNvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xuICAgICAgICAgIGdyb3VwTWFwW2dyb3VwS2V5XVtjb2xdID0gcm93W2NvbF07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGFnZ3JlZ2F0aW9uQ29uZmlnLmZvckVhY2goKHsgYWdncmVnYXRlRGF0YUZpZWxkLCBhZ2dyZWdhdGVGdW5jdGlvblR5cGUgfSkgPT4ge1xuICAgICAgICAgIHN3aXRjaCAoYWdncmVnYXRlRnVuY3Rpb25UeXBlKSB7XG4gICAgICAgICAgICBjYXNlIFwic3VtXCI6XG4gICAgICAgICAgICBjYXNlIFwiYXZnXCI6XG4gICAgICAgICAgICAgIGdyb3VwTWFwW2dyb3VwS2V5XVthZ2dyZWdhdGVEYXRhRmllbGRdID0gMDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwibWluXCI6XG4gICAgICAgICAgICAgIGdyb3VwTWFwW2dyb3VwS2V5XVthZ2dyZWdhdGVEYXRhRmllbGRdID0gSW5maW5pdHk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm1heFwiOlxuICAgICAgICAgICAgICBncm91cE1hcFtncm91cEtleV1bYWdncmVnYXRlRGF0YUZpZWxkXSA9IC1JbmZpbml0eTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiY291bnRcIjpcbiAgICAgICAgICAgICAgZ3JvdXBNYXBbZ3JvdXBLZXldW2FnZ3JlZ2F0ZURhdGFGaWVsZF0gPSAwO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoYWdncmVnYXRlRnVuY3Rpb25UeXBlID09PSBcImF2Z1wiKSB7XG4gICAgICAgICAgICBncm91cE1hcFtncm91cEtleV1bYCR7YWdncmVnYXRlRGF0YUZpZWxkfV9fY291bnRgXSA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gQXBwbHkgYWdncmVnYXRpb25zXG4gICAgICBhZ2dyZWdhdGlvbkNvbmZpZy5mb3JFYWNoKCh7IGFnZ3JlZ2F0ZURhdGFGaWVsZCwgYWdncmVnYXRlRnVuY3Rpb25UeXBlIH0pID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSByb3dbYWdncmVnYXRlRGF0YUZpZWxkXTtcblxuICAgICAgICBzd2l0Y2ggKGFnZ3JlZ2F0ZUZ1bmN0aW9uVHlwZSkge1xuICAgICAgICAgIGNhc2UgXCJzdW1cIjpcbiAgICAgICAgICAgIGdyb3VwTWFwW2dyb3VwS2V5XVthZ2dyZWdhdGVEYXRhRmllbGRdICs9IHZhbHVlO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiYXZnXCI6XG4gICAgICAgICAgICBncm91cE1hcFtncm91cEtleV1bYWdncmVnYXRlRGF0YUZpZWxkXSArPSB2YWx1ZTtcbiAgICAgICAgICAgIGdyb3VwTWFwW2dyb3VwS2V5XVtgJHthZ2dyZWdhdGVEYXRhRmllbGR9X19jb3VudGBdICs9IDE7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgXCJtaW5cIjpcbiAgICAgICAgICAgIGdyb3VwTWFwW2dyb3VwS2V5XVthZ2dyZWdhdGVEYXRhRmllbGRdID1cbiAgICAgICAgICAgICAgTWF0aC5taW4oZ3JvdXBNYXBbZ3JvdXBLZXldW2FnZ3JlZ2F0ZURhdGFGaWVsZF0sIHZhbHVlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcIm1heFwiOlxuICAgICAgICAgICAgZ3JvdXBNYXBbZ3JvdXBLZXldW2FnZ3JlZ2F0ZURhdGFGaWVsZF0gPVxuICAgICAgICAgICAgICBNYXRoLm1heChncm91cE1hcFtncm91cEtleV1bYWdncmVnYXRlRGF0YUZpZWxkXSwgdmFsdWUpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiY291bnRcIjpcbiAgICAgICAgICAgIGdyb3VwTWFwW2dyb3VwS2V5XVthZ2dyZWdhdGVEYXRhRmllbGRdICs9IDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBGaW5hbGl6ZSBhdmVyYWdlc1xuICAgIE9iamVjdC52YWx1ZXMoZ3JvdXBNYXApLmZvckVhY2goZ3JvdXAgPT4ge1xuICAgICAgYWdncmVnYXRpb25Db25maWcuZm9yRWFjaCgoeyBhZ2dyZWdhdGVEYXRhRmllbGQsIGFnZ3JlZ2F0ZUZ1bmN0aW9uVHlwZSB9KSA9PiB7XG4gICAgICAgIGlmIChhZ2dyZWdhdGVGdW5jdGlvblR5cGUgPT09IFwiYXZnXCIpIHtcbiAgICAgICAgICBncm91cFthZ2dyZWdhdGVEYXRhRmllbGRdID1cbiAgICAgICAgICAgIGdyb3VwW2FnZ3JlZ2F0ZURhdGFGaWVsZF0gLyBncm91cFtgJHthZ2dyZWdhdGVEYXRhRmllbGR9X19jb3VudGBdO1xuICAgICAgICAgIGRlbGV0ZSBncm91cFtgJHthZ2dyZWdhdGVEYXRhRmllbGR9X19jb3VudGBdO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBPYmplY3QudmFsdWVzKGdyb3VwTWFwKTtcbiAgfVxuXG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgbXgtMiBib3JkZXItclwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzSnNvblByZXZpZXdcIj5cbiAgICAgICAgICAgIDxwcmU+PGNvZGU+e3tqc2FvbkRhdGFzb3VyY2UgfCBqc29ufX08L2NvZGU+PC9wcmU+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNKc29uUHJldmlld1wiPlxuICAgICAgICAgICAgPGFwcC1nYW1tYS1nZW8tY2hhcnQgW2NoYXJ0RGF0YVNvdXJjZV09XCJjaGFydERhdGFTb3VyY2VGb3JNYXBcIj48L2FwcC1nYW1tYS1nZW8tY2hhcnQ+XG4gICAgICAgICAgICA8IS0tIDxhcHAtZ29vZ2xlLWdlby1tYXAgW2NoYXJ0RGF0YVNvdXJjZV09XCJjaGFydERhdGFTb3VyY2VGb3JNYXBcIj48L2FwcC1nb29nbGUtZ2VvLW1hcD4gLS0+XG5cbiAgICAgICAgICAgIDxkaXYgI2R5bmFtaWNDb250YWluZXI+PC9kaXY+XG5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInctZnVsbCBteC0yXCI+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTQgYm9yZGVyLWIgYm9yZGVyLWdyYXktMjAwIGRhcms6Ym9yZGVyLWdyYXktNzAwXCI+XG4gICAgICAgICAgICA8dWwgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCAtbWItcHggdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWNlbnRlclwiIHJvbGU9XCJ0YWJsaXN0XCI+XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibWUtMlwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImlubGluZS1ibG9jayBwLTQgYm9yZGVyLWItMiByb3VuZGVkLXQtbGdcIiBbbmdDbGFzc109XCJ7IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LXB1cnBsZS02MDAgYm9yZGVyLXB1cnBsZS02MDAgZGFyazp0ZXh0LXB1cnBsZS01MDAgZGFyazpib3JkZXItcHVycGxlLTUwMCc6IGFjdGl2ZVRhYiA9PT0gJ2Jhc2ljJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1ncmF5LTUwMCBkYXJrOnRleHQtZ3JheS00MDAgYm9yZGVyLXRyYW5zcGFyZW50JzogYWN0aXZlVGFiICE9PSAnYmFzaWMnIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiIChjbGljayk9XCJzZXRBY3RpdmVUYWIoJ2Jhc2ljJylcIiB0eXBlPVwiYnV0dG9uXCIgcm9sZT1cInRhYlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJtZS0yXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaW5saW5lLWJsb2NrIHAtNCBib3JkZXItYi0yIHJvdW5kZWQtdC1sZ1wiIFtuZ0NsYXNzXT1cInsgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtcHVycGxlLTYwMCBib3JkZXItcHVycGxlLTYwMCBkYXJrOnRleHQtcHVycGxlLTUwMCBkYXJrOmJvcmRlci1wdXJwbGUtNTAwJzogYWN0aXZlVGFiID09PSAnY2hhcnRfY29uZmlnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1ncmF5LTUwMCBkYXJrOnRleHQtZ3JheS00MDAgYm9yZGVyLXRyYW5zcGFyZW50JzogYWN0aXZlVGFiICE9PSAnY2hhcnRfY29uZmlnJyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIiAoY2xpY2spPVwic2V0QWN0aXZlVGFiKCdjaGFydF9jb25maWcnKVwiIHR5cGU9XCJidXR0b25cIiByb2xlPVwidGFiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBDaGFydCBDb2x1bW5zXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibWUtMlwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImlubGluZS1ibG9jayBwLTQgYm9yZGVyLWItMiByb3VuZGVkLXQtbGdcIiBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LXB1cnBsZS02MDAgYm9yZGVyLXB1cnBsZS02MDAgZGFyazp0ZXh0LXB1cnBsZS01MDAgZGFyazpib3JkZXItcHVycGxlLTUwMCc6IGFjdGl2ZVRhYiA9PT0gJ3Byb3BlcnRpZXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1ncmF5LTUwMCBkYXJrOnRleHQtZ3JheS00MDAgYm9yZGVyLXRyYW5zcGFyZW50JzogYWN0aXZlVGFiICE9PSAncHJvcGVydGllcydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCIgKGNsaWNrKT1cInNldEFjdGl2ZVRhYigncHJvcGVydGllcycpXCIgdHlwZT1cImJ1dHRvblwiIHJvbGU9XCJ0YWJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnRpZXNcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJtZS0yXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaW5saW5lLWJsb2NrIHAtNCBib3JkZXItYi0yIHJvdW5kZWQtdC1sZ1wiIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1wdXJwbGUtNjAwIGJvcmRlci1wdXJwbGUtNjAwIGRhcms6dGV4dC1wdXJwbGUtNTAwIGRhcms6Ym9yZGVyLXB1cnBsZS01MDAnOiBhY3RpdmVUYWIgPT09ICdwZXJtaXNzaW9uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1ncmF5LTUwMCBkYXJrOnRleHQtZ3JheS00MDAgYm9yZGVyLXRyYW5zcGFyZW50JzogYWN0aXZlVGFiICE9PSAncGVybWlzc2lvbidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIiAoY2xpY2spPVwic2V0QWN0aXZlVGFiKCdwZXJtaXNzaW9uJylcIiB0eXBlPVwiYnV0dG9uXCIgcm9sZT1cInRhYlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgTWFuYWdlIFBlcm1pc3Npb25zXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvbGk+XG5cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgaWQ9XCJkZWZhdWx0LXN0eWxlZC10YWItY29udGVudFwiPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFjdGl2ZVRhYiA9PT0gJ2Jhc2ljJ1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtYXV0byBtaW4tdy0wIG15LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtc20gcHktMSBmb250LWV4dHJhYm9sZCBib3JkZXItYiBiZy1ncmF5LTcwMCB0ZXh0LXdoaXRlIHB4LTJcIj4gRmlsdGVyIFRpdGxlXG4gICAgICAgICAgICAgICAgICAgICAgICBDb25maWdcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHB0LTIgYm9yZGVyLXggYm9yZGVyLWJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTEgdy0xLzNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0xXCI+IE1hcCBMaWJyYXJ5IDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtzZWFyY2hFbmFibGVkXT1cInRydWVcIiBbaXRlbXNdPVwiWydHb29nbGUgTWFwcyddXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0xIHctMS8zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPiBTZWxlY3QgTWFwIHR5cGUgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiIFtpdGVtc109XCJjaGFydFZpZXdUeXBlRGF0YVNvdXJjZVwiIGRpc3BsYXlFeHByPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlRXhwcj1cInZhbHVlXCIgWyhuZ01vZGVsKV09XCJtYXBUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uVmFsdWVDaGFuZ2VkKT1cImNoYW5nZU1hcFR5cGUoJGV2ZW50KVwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibWFwVHlwZSA9PSAnaGVhdE1hcCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0xIHctMS8zXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPiBIZWF0IE1hcCBDYXRlZ29yeSA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiIFtkYXRhU291cmNlXT1cImhlYXRNYXBUeXBlRGF0YXNvdXJjZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5RXhwcj1cIm5hbWVcIiB2YWx1ZUV4cHI9XCJ2YWx1ZVwiIFsobmdNb2RlbCldPVwiaGVhdE1hcENvbmZpZy5oZWF0TWFwQ2F0ZWdvcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uVmFsdWVDaGFuZ2VkKT1cImhlYXRNYXBDYXRlZ29yeSgkZXZlbnQpXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibWFwVHlwZSA9PSAnZ2VvTWFwJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggcHQtMiBib3JkZXIteCBib3JkZXItYlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTEgdy0xLzNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPiBSZWdpb24gPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtzZWFyY2hFbmFibGVkXT1cInRydWVcIiBbaXRlbXNdPVwicmVnaW9uRGF0YVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInRhYmxlRGF0YUNvbmZpZy5yZWdpb25cIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMSB3LTEvM1wiICpuZ0lmPVwidGFibGVEYXRhQ29uZmlnLnJlZ2lvbiA9PSAnY2l0eSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPiBUeXBlIFJlZ2lvbiBDb2RlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cInRhYmxlRGF0YUNvbmZpZy5yZWdpb25Db2RlXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB0LTIgYm9yZGVyLXggYm9yZGVyLWIgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm15LTIgZmxleCBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwicHgtMSBtYi0xIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPiBUaXRsZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwidGFibGVEYXRhQ29uZmlnLnRpdGxlXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0xIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPiBBcmd1bWVudCBGaWVsZDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiIFtpdGVtc109XCJjb25maWdDb2x1bWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidGFibGVEYXRhQ29uZmlnLmFyZ3VtZW50RmllbGRcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0xIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPiBDaGFydHZhbHUgRmllbGQ8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtzZWFyY2hFbmFibGVkXT1cInRydWVcIiBbaXRlbXNdPVwiY29uZmlnQ29sdW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInRhYmxlRGF0YUNvbmZpZy5jaGFydFZhbHVlRmllbGRcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0xIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPiBzaXplPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJ0YWJsZURhdGFDb25maWcuc2l6ZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTIgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+QmFja2dyb3VuZCBDb2xvcjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LWNvbG9yLWJveCBbKG5nTW9kZWwpXT1cInRhYmxlRGF0YUNvbmZpZy5iYWNrZ3JvdW5kQ29sb3JcIj48L2R4LWNvbG9yLWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInB4LTQgbXQtNiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1jaGVjay1ib3ggW3ZhbHVlXT1cInRhYmxlRGF0YUNvbmZpZy5jb21tb25Db25maWcuaXNTZWFyY2hCb3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidGFibGVEYXRhQ29uZmlnLmNvbW1vbkNvbmZpZy5pc1NlYXJjaEJveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD1cIlNlYXJjaCBCb3hcIj48L2R4LWNoZWNrLWJveD5cbiAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0xIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBEaXNwbGF5IEZvcm1hdGUgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbaXRlbXNdPVwiWydkYWlseScsJ2hvdXJseScsJ21vbnRobHknXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ0YWJsZV9jb2x1bW5zX2NvbmZpZy5rcGlDb25maWcuZm9ybWF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cImZhbHNlXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMSB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gS2V5IFRvIFBhc3MgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGFnLWJveCBbaXRlbXNdPVwiY29uZmlnQ29sdW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInRhYmxlX2NvbHVtbnNfY29uZmlnLmtwaUNvbmZpZy5rZXlUb1Bhc3NcIj48L2R4LXRhZy1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiIHB0LTIgYm9yZGVyLXggYm9yZGVyLWIgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtc20gcHktMSBmb250LWV4dHJhYm9sZCBib3JkZXItYiBiZy1ncmF5LTcwMCB0ZXh0LXdoaXRlIHB4LTJcIj4gQ29sb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggIGZsZXgtd3JhcCBweC0xIG1iLTIgbXQtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBtci0yIG1iLTJcIiAqbmdGb3I9XCJsZXQgY29sb3Igb2YgdGFibGVEYXRhQ29uZmlnLmNvbG9yczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1yLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtY29sb3ItYm94IFsobmdNb2RlbCldPVwidGFibGVEYXRhQ29uZmlnLmNvbG9yc1tpXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblZhbHVlQ2hhbmdlZCk9XCJvbkNvbG9yQ2hhbmdlKCRldmVudC52YWx1ZSwgaSlcIj48L2R4LWNvbG9yLWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fZGFuZ2VyX3NtfX0gY3Vyc29yLXBvaW50ZXIgcHgtMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUNvbG9yKGkpXCI+PGkgY2xhc3M9XCJmYSBmYS10cmFzaC1vXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJweC0yXCI+IDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2Rhbmdlcl9zbX19XCIgKGNsaWNrKT1cInJlbW92ZUNvbG9yKGkpXCI+UmVtb3ZlPC9idXR0b24+PC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktZW5kIG15LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fc3VjY2Vzc19zbX19XCIgKGNsaWNrKT1cImFkZENvbG9yKClcIj5BZGQgQ29sb3I8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1hcFR5cGUgPT0gJ2Nob3JvcGxldGhNYXAnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBwdC0yIGJvcmRlci14IGJvcmRlci1iXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMSB3LTEvM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0xXCI+IE1hcCBab29tIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJjaG9yb3BsZXRoTWFwQ29uZmlnLnpvb21cIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTIgbXQtNiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LWNoZWNrLWJveCBbKG5nTW9kZWwpXT1cImlzQ2VudGVyZENob3JvcGxldGhNYXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD1cIkNlbnRlcmQgUG9zaXRpb25cIj48L2R4LWNoZWNrLWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0NlbnRlcmRDaG9yb3BsZXRoTWFwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTEgdy0xLzNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTFcIj4gU2VsZWN0IExhdGl0dWRlIEtleTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiIFtpdGVtc109XCJjb25maWdDb2x1bWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY2VudGFyTGFpdG5nT2JqZWN0LmxhdEtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uVmFsdWVDaGFuZ2VkKT1cIm9uTGF0TG5nS2V5Q2hhbmdlKCRldmVudClcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0xIHctMS8zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0xXCI+IFNlbGVjdCBMb25naXR1ZGUgS2V5PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCIgW2l0ZW1zXT1cImNvbmZpZ0NvbHVtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjZW50YXJMYWl0bmdPYmplY3QubG5nS2V5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25WYWx1ZUNoYW5nZWQpPVwib25MYXRMbmdLZXlDaGFuZ2UoJGV2ZW50KVwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTEgdy0xLzNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPiBNYXAgQ2VudGVyIExhdGl0dWRlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cImNob3JvcGxldGhNYXBDb25maWcuY2VudGVyTGF0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJpc0NlbnRlcmRDaG9yb3BsZXRoTWFwXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0xIHctMS8zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTFcIj4gTWFwIENlbnRlciBMb25naXR1ZGU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiY2hvcm9wbGV0aE1hcENvbmZpZy5jZW50ZXJMbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cImlzQ2VudGVyZENob3JvcGxldGhNYXBcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB0LTIgYm9yZGVyLXggYm9yZGVyLWIgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm15LTIgZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW5cIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0xIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPiBBcmd1bWVudCBGaWVsZDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiIFtpdGVtc109XCJjb25maWdDb2x1bWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY2hvcm9wbGV0aE1hcENvbmZpZy5hcmd1bWVudEZpZWxkXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0xIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPiBzaXplPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJjaG9yb3BsZXRoTWFwQ29uZmlnLnNpemVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPkNvbG9yIE9uZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LWNvbG9yLWJveCBbKG5nTW9kZWwpXT1cImNob3JvcGxldGhNYXBDb25maWcuY29sb3JPbmVcIj48L2R4LWNvbG9yLWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj5Db2xvciBUd288L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1jb2xvci1ib3ggWyhuZ01vZGVsKV09XCJjaG9yb3BsZXRoTWFwQ29uZmlnLmNvbG9yVHdvXCI+PC9keC1jb2xvci1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMSB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gRGlzcGxheSBGb3JtYXRlIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW2l0ZW1zXT1cIlsnZGFpbHknLCdob3VybHknLCdtb250aGx5J11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidGFibGVfY29sdW1uc19jb25maWcua3BpQ29uZmlnLmZvcm1hdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJmYWxzZVwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTEgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IEtleSBUbyBQYXNzIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRhZy1ib3ggW2l0ZW1zXT1cImNvbmZpZ0NvbHVtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ0YWJsZV9jb2x1bW5zX2NvbmZpZy5rcGlDb25maWcua2V5VG9QYXNzXCI+PC9keC10YWctYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteS0yIGZsZXgtcm93IGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0xIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPiBHanNvbiBGaWxlIFBhdGg8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cImNob3JvcGxldGhNYXBDb25maWcuZ2pzb25GaWxlUGF0aFwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm15LTIgZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMiBtdC02IHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LWNoZWNrLWJveCBbKG5nTW9kZWwpXT1cImNob3JvcGxldGhNYXBDb25maWcuaXNWYWx1ZUZpZWxkUmFuZ2VTbGlkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9XCJSYW5nZSBTbGlkZXJcIj48L2R4LWNoZWNrLWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTEgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0xXCI+IFNsaWRlciBTcGVlZDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LW51bWJlci1ib3ggWyhuZ01vZGVsKV09XCJjaG9yb3BsZXRoTWFwQ29uZmlnLnNsaWRlU3BlZWRcIj48L2R4LW51bWJlci1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0xIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPiBWYWx1ZSBGb3IgU2xpZGVyPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCIgW2l0ZW1zXT1cImNvbmZpZ0NvbHVtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjaG9yb3BsZXRoTWFwQ29uZmlnLnNsaWRlclZhbHVlRmllbGRcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEvNCBweC0yIG0tM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTEgbXQtOFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1jaGVjay1ib3ggWyhuZ01vZGVsKV09XCJjaG9yb3BsZXRoTWFwQ29uZmlnLmlzRGF0YUFnZ3JlZ2F0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25EYXRhR3JvdXBCeUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD1cIkFwcGx5IERhdGEgQWdncmVnYXRpb25cIj48L2R4LWNoZWNrLWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCByb3VuZGVkIGJvcmRlciBwLTMgbS02XCIgKm5nSWY9XCJjaG9yb3BsZXRoTWFwQ29uZmlnLmlzRGF0YUFnZ3JlZ2F0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbXktNCB3LTEvM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+R3JvdXAgQnkgQ29sdW1uczwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGFnLWJveCBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCIgW2l0ZW1zXT1cImNvbmZpZ0NvbHVtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImRhdGFBZ2dyZWdhdGVHcm91cEJ5Q29sdW1lXCI+PC9keC10YWctYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3JkZXIgcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteS0yIGZsZXggZmxleC1yb3cgYm9yZGVyLWJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZGF0YUFnZ3JlZ2F0aW9uQ29udGFpbmVyOyBsZXQgaSA9IGluZGV4XCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTEgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPkFnZ3JlZ2F0aW9uIENvbHVtbnM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCIgW2l0ZW1zXT1cImNvbmZpZ0NvbHVtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaXRlbS5hZ2dyZWdhdGVEYXRhRmllbGRcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCIgcHgtMiBtYi0xIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj5GdW5jdGlvbiBUeXBlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJbJ3N1bScsJ2F2ZycsJ21pbicsJ21heCcsJ2NvdW50J11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIml0ZW0uYWdncmVnYXRlRnVuY3Rpb25UeXBlXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlciBtdC02IHctMS82XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fZGFuZ2VyX3NtfX0gY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlQWdncmVnYXRpb25Db2x1bWUoaSlcIj48aSBjbGFzcz1cImZhIGZhLXRyYXNoLW9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWVuZCBteS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9wcmltYXJ5X3NtfX0gY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRBZ2dyZWdhdGlvbkNvbHVtZSgpXCI+QWRkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1lPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9zdWNjZXNzX3NtfX0gY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzYXZlQWdncmVnYXRpb25Db2x1bWUoKVwiPlNhdmUgQWdncmVnYXRpb248L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaGVhdE1hcENvbmZpZy5oZWF0TWFwQ2F0ZWdvcnkgPT0gJ2hlYXRNYXBPbmx5JyB8fCBoZWF0TWFwQ29uZmlnLmhlYXRNYXBDYXRlZ29yeSA9PSAnaGVhdE1hcE1hcmtlcicgfHwgaGVhdE1hcENvbmZpZy5oZWF0TWFwQ2F0ZWdvcnkgPT0gJ2hlYXRNYXBBbmRNYXJrZXInXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zbSBweS0xIGZvbnQtZXh0cmFib2xkIGJvcmRlci1iIGJnLWdyYXktNzAwIHRleHQtd2hpdGUgcHgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZW50ZXIgTG9jYXRpb24gQ29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggcHQtMiBib3JkZXIteCBib3JkZXItYlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwicHgtMSBtYi0xIHctMS80XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPiBMYXRpdHVkZSAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaGVhdE1hcENvbmZpZy5jZW50ZXJMYXRpdHVkZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTEgdy0xLzRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0xXCI+IExvbmdpdHVkZSA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJoZWF0TWFwQ29uZmlnLmNlbnRlckxvbmdpdHVkZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0xIHctMS80XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImhlYXRNYXBDb25maWcuaGVhdE1hcENhdGVnb3J5ICE9ICdoZWF0TWFwQW5kTWFya2VyJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTFcIj4gWm9vbSBMYWJlbCA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJoZWF0TWFwQ29uZmlnLnpvb21cIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0xIHctMS80XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPiBDdXN0b20gSWNvbnMgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaGVhdE1hcENvbmZpZy5pY29uXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMSB3LTEvNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTFcIj4gc2l6ZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cImhlYXRNYXBDb25maWcuc2l6ZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWNvbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXNtIHB5LTEgZm9udC1leHRyYWJvbGQgYm9yZGVyLWIgYmctZ3JheS03MDAgdGV4dC13aGl0ZSBweC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2F0aW9uIE1hcmtlciBDb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBwdC0yIGJvcmRlci14IGJvcmRlci1iXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0xIHctMS8zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPiBMYXRpdHVkZSA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCIgW2l0ZW1zXT1cImNvbmZpZ0NvbHVtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaGVhdE1hcENvbmZpZy5tYXJrZXJMYXRpdHVkZVwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMSB3LTEvM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTFcIj4gTG9uZ2l0dWRlIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtzZWFyY2hFbmFibGVkXT1cInRydWVcIiBbaXRlbXNdPVwiY29uZmlnQ29sdW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJoZWF0TWFwQ29uZmlnLm1hcmtlckxvbmdpdHVkZVwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMSB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IERpc3BsYXkgRm9ybWF0ZSA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbaXRlbXNdPVwiWydkYWlseScsJ2hvdXJseScsJ21vbnRobHknXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidGFibGVfY29sdW1uc19jb25maWcua3BpQ29uZmlnLmZvcm1hdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZE9ubHldPVwiZmFsc2VcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtYXBUeXBlID09ICdidWJibGVNYXAnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zbSBweS0xIGZvbnQtZXh0cmFib2xkIGJvcmRlci1iIGJnLWdyYXktNzAwIHRleHQtd2hpdGUgcHgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWJibGUgTWFwIENvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHB0LTIgYm9yZGVyLXggYm9yZGVyLWJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTEgdy0xLzNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0xXCI+IEFyZ3VtZW50IFZhbHVlIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtzZWFyY2hFbmFibGVkXT1cInRydWVcIiBbaXRlbXNdPVwiY29uZmlnQ29sdW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJidWJibGVNYXBDb25maWcuYWdydW1lbnRWYWx1ZVwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMSB3LTEvNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTFcIj4gQnViYmxlIENvbG9yIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1jb2xvci1ib3ggWyhuZ01vZGVsKV09XCJidWJibGVNYXBDb25maWcuYnViYmxlQ29sb3JcIj48L2R4LWNvbG9yLWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMSB3LTEvNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTFcIj5CdWJibGUgTWluaW11bSBzaXplPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiYnViYmxlTWFwQ29uZmlnLmJ1YmJsZU1pbmltdW1TaXplXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMSB3LTEvNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTFcIj5CdWJibGUgTWF4aW11bSBzaXplPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiYnViYmxlTWFwQ29uZmlnLmJ1YmJsZU1heGltdW1TaXplXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMSB3LTEvNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTFcIj4gc2l6ZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cImJ1YmJsZU1hcENvbmZpZy5zaXplXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMSB3LTEvNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTFcIj4gU2hvcnQgQnk8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCIgW2l0ZW1zXT1cImNvbmZpZ0NvbHVtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiYnViYmxlTWFwQ29uZmlnLnNvcnRCeVwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwicHgtMSBtYi0xIHctMS80XCIgKm5nSWY9XCJoZWF0TWFwQ29uZmlnLmhlYXRNYXBDYXRlZ29yeSAhPSAnaGVhdE1hcEFuZE1hcmtlcidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0xXCI+IFpvb20gTGFiZWwgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cImhlYXRNYXBDb25maWcuem9vbVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zbSBweS0xIGZvbnQtZXh0cmFib2xkIGJvcmRlci1iIGJnLWdyYXktNzAwIHRleHQtd2hpdGUgcHgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhdGlvbiBNYXJrZXIgQ29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggcHQtMiBib3JkZXIteCBib3JkZXItYlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMSB3LTEvM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTFcIj4gTGF0aXR1ZGUgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiIFtpdGVtc109XCJjb25maWdDb2x1bWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImJ1YmJsZU1hcENvbmZpZy5tYXJrZXJMYXRpdHVkZVwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMSB3LTEvM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTFcIj4gTG9uZ2l0dWRlIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtzZWFyY2hFbmFibGVkXT1cInRydWVcIiBbaXRlbXNdPVwiY29uZmlnQ29sdW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJidWJibGVNYXBDb25maWcubWFya2VyTG9uZ2l0dWRlXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0xIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gRGlzcGxheSBGb3JtYXRlIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtpdGVtc109XCJbJ2RhaWx5JywnaG91cmx5JywnbW9udGhseSddXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ0YWJsZV9jb2x1bW5zX2NvbmZpZy5rcGlDb25maWcuZm9ybWF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJmYWxzZVwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuXG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cblxuXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVUYWIgPT09ICdjaGFydF9jb25maWcnXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImgtZnVsbCBvdmVyZmxvdy14LWF1dG9cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZmxleC1hdXRvIG1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXNtIHB5LTEgZm9udC1leHRyYWJvbGQgYm9yZGVyLWIgYmctZ3JheS03MDAgdGV4dC13aGl0ZSBweC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9vbHRpcCBDb2x1bW5zXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdC0yIGJvcmRlci14IGJvcmRlci1iIFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteS0yIGJvcmRlci1iIGZsZXggZmxleC1yb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiB0YWJsZURhdGFDb25maWcuY2hhcnRfY29uZmlnOyBsZXQgaSA9IGluZGV4O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJweC0xIG1iLTIgbXQtNiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1jaGVjay1ib3ggW3ZhbHVlXT1cIml0ZW0udmlzaWJsZVwiIFsobmdNb2RlbCldPVwiaXRlbS52aXNpYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PVwiVmlzaWJsaXR5XCI+PC9keC1jaGVjay1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBWYWx1ZSBGaWVsZDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiIFtpdGVtc109XCJjb25maWdDb2x1bWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaXRlbS5kYXRhRmllbGRcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBDYXB0aW9uPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJpdGVtLmNhcHRpb25cIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTIgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+RGlzcGxheSBGb3I8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtpdGVtc109XCJbJ21hcCcsICd0b29sdGlwJ11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaXRlbS5kaXNwbGF5Rm9yXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgbWItMiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gVUkgRnVuY3Rpb248L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtpdGVtc109XCJlbnJpY2hOYW1lTGlzdFwiIFsobmdNb2RlbCldPVwiaXRlbS5lbnJpY2hOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXIgbXQtOCB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJpICE9PSAwXCIgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2xpZ2h0X3NtfX0gY3Vyc29yLXBvaW50ZXIgbXgtMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm1vdmVJdGVtRm9yQ29sdW1ucyhpLCAndXAnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYXJyb3ctdXBcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImkgIT09IHRhYmxlRGF0YUNvbmZpZy5jaGFydF9jb25maWcubGVuZ3RoIC0gMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2xpZ2h0X3NtfX0gY3Vyc29yLXBvaW50ZXIgbXgtMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm1vdmVJdGVtRm9yQ29sdW1ucyhpLCAnZG93bicpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1hcnJvdy1kb3duXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9kYW5nZXJfc219fSBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZUNvbHVtbnMoaSlcIj48aSBjbGFzcz1cImZhIGZhLXRyYXNoLW9cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cganVzdGlmeS1lbmQgbXktMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fcHJpbWFyeV9zbX19IGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImFkZENvbHVtbnMoKVwiPkFkZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbnM8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVUYWIgPT09ICdwcm9wZXJ0aWVzJ1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoLWZ1bGwgb3ZlcmZsb3cteC1hdXRvXCI+XG4gICAgICAgICAgICAgICAgICAgIDxhcHAtbG9hZGVyICpuZ0lmPVwiaXNMb2FkZXJcIj48L2FwcC1sb2FkZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNMb2FkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktYmV0d2VlbiBib3JkZXItYiBweS0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LWNoZWNrLWJveCBbdmFsdWVdPVwidmlld1Byb3BlcnRpZXMuZW5hYmxlQ2xpY2tFdmVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInZpZXdQcm9wZXJ0aWVzLmVuYWJsZUNsaWNrRXZlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD1cIkVuYWJsZSBDbGljayBFdmVudFwiPjwvZHgtY2hlY2stYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1jaGVjay1ib3ggW3ZhbHVlXT1cInZpZXdQcm9wZXJ0aWVzLmVuYWJsZVJpZ2h0Q2xpY2tFdmVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInZpZXdQcm9wZXJ0aWVzLmVuYWJsZVJpZ2h0Q2xpY2tFdmVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PVwiRW5hYmxlIFJpZ2h0IENsaWNrXCI+PC9keC1jaGVjay1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgcC0yXCIgKm5nSWY9XCJ2aWV3UHJvcGVydGllcy5lbmFibGVDbGlja0V2ZW50XCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBmbGV4LWF1dG8gbWluLXctMCBteS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXNtIHB5LTEgZm9udC1leHRyYWJvbGQgYm9yZGVyLWIgYmctZ3JheS03MDAgdGV4dC13aGl0ZSBweC0yXCI+IEV2ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgcC0zIGJvcmRlci14IGJvcmRlci1iIFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gRXZlbnQgVHlwZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW2l0ZW1zXT1cIlsnZHJpbGxkb3duJywnb3B0aW9uYWxEcmlsbERvd24nXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25WYWx1ZUNoYW5nZWQpPVwiZ2V0U2VsZWN0ZWRFdmVudFR5cGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInZpZXdQcm9wZXJ0aWVzLmNsaWNrRXZlbnRPcHRpb25zLmV2ZW50VHlwZVwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZpZXdQcm9wZXJ0aWVzLmNsaWNrRXZlbnRPcHRpb25zLmV2ZW50VHlwZSA9PSAnZHJpbGxkb3duJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktYmV0d2VlbiBtdC0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gQXNzb2NpYXRlZCBWaWV3czwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRhZy1ib3ggW2l0ZW1zXT1cImFsbENvbmZpZ3VyZWRWaWV3c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ2aWV3UHJvcGVydGllcy5jbGlja0V2ZW50T3B0aW9ucy5hc3NvY2lhdGVkVmlld3NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlRXhwcj1cInZpZXdJZFwiIGRpc3BsYXlFeHByPVwidmlld05hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93U2VsZWN0aW9uQ29udHJvbHNdPVwidHJ1ZVwiIFtzZWFyY2hFbmFibGVkXT1cInRydWVcIj48L2R4LXRhZy1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ2aWV3UHJvcGVydGllcy5jbGlja0V2ZW50T3B0aW9ucy5ldmVudFR5cGUgPT0gJ29wdGlvbmFsRHJpbGxEb3duJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktYmV0d2VlbiBtdC0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBvcHRpb25hbERyaWxEb3duRGF0YVNvdXJjZTtsZXQgaSA9IGluZGV4O1wiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0yIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBBc3NvY2lhdGVkIFZpZXdzPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGFnLWJveCBbaXRlbXNdPVwiYWxsQ29uZmlndXJlZFZpZXdzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIml0ZW0udmlld0lkXCIgdmFsdWVFeHByPVwidmlld0lkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5RXhwcj1cInZpZXdOYW1lXCIgW3Nob3dTZWxlY3Rpb25Db250cm9sc109XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4RGlzcGxheWVkVGFnc109XCIyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCI+PC9keC10YWctYm94PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBBc3NvY2lhdGVkIFBhcmFtczwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtLmZpbHRlckNvbmRpdGlvblwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9kYW5nZXJfc219fSBjdXJzb3ItcG9pbnRlciBtdC04XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlQXNzb2NpYXRlZFBhcmFtcyhpKVwiPjxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmEgZmEtdHJhc2gtb1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cganVzdGlmeS1lbmQgbXQtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3ByaW1hcnlfc219fSBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRBc3NvY2lhdGVkUGFyYW1zKClcIj5BZGRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9saWdodF9tZH19IGN1cnNvci1wb2ludGVyIG10LTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlc2V0Vmlld1Byb3Byc3Rpc2UoKVwiPlJlc2V0IEFsbDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYWN0aXZlVGFiID09PSAncGVybWlzc2lvbidcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaC1mdWxsIG92ZXJmbG93LXgtYXV0b1wiPlxuICAgICAgICAgICAgICAgICAgICA8YXBwLXVzZXItYWNjZXNzIFsodXNlck9wdGlvbkNvbnRhaW5lcildPVwidXNlck9wdGlvbkNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8L2FwcC11c2VyLWFjY2Vzcz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwvZGl2PlxuXG5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBib3JkZXItdCBwbC0zXCI+XG4gICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1zdGFydCBteC0xXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3dhcm5pbmdfbWR9fSBjdXJzb3ItcG9pbnRlciBtdC0yXCIgKGNsaWNrKT1cInZpZXdNYXBGb3JUZXN0KClcIj5cbiAgICAgICAgICAgIFByZXZpZXc8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fcHJpbWFyeV9tZH19IGN1cnNvci1wb2ludGVyIG10LTJcIiAoY2xpY2spPVwiaXNKc29uUHJldmlldyA9IGZhbHNlXCI+RGF0YVxuICAgICAgICAgICAgUHJldmlldzwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktZW5kIG14LTEgZmxleC1ncm93XCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3N1Y2Nlc3NfbWR9fSBjdXJzb3ItcG9pbnRlciBtdC0yXCJcbiAgICAgICAgICAgIChjbGljayk9XCJnZXRTYXZlQ2hhcnRDb25maWcoKVwiPlN1Ym1pdDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuPC9kaXY+Il19
|