gamma-app-controller 1.1.26 → 1.1.28
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/application-controller.module.mjs +20 -20
- package/esm2020/lib/application-controller/application-dataset-component/application-dataset/application-dataset.component.mjs +1 -1
- package/esm2020/lib/application-controller/application-dataset-component/create-dataset/create-dataset.component.mjs +1 -1
- package/esm2020/lib/application-controller/application-filter/application-filter.component.mjs +1 -1
- package/esm2020/lib/application-controller/application-menu-controller/application-menus/application-menus.component.mjs +1 -1
- package/esm2020/lib/application-controller/application-metric-config/all-metrics-config/all-metrics-config.component.mjs +1 -1
- package/esm2020/lib/application-controller/application-metric-config/create-metrics/create-metrics.component.mjs +1 -1
- package/esm2020/lib/application-controller/application-view-components/application-views/application-views.component.mjs +1 -1
- package/esm2020/lib/application-controller/application-view-components/create-comp-view/create-comp-view.component.mjs +1 -1
- package/esm2020/lib/application-controller/page-controller/page-config/page-config.component.mjs +11 -11
- package/esm2020/lib/application-controller/page-controller/page-config-multi-layout/page-config-multi-layout.component.mjs +10 -10
- package/esm2020/lib/application-controller/page-controller/page-controller/page-controller.component.mjs +1 -1
- package/esm2020/lib/application-controller/support-components/dash-chart/dash-chart.component.mjs +1 -1
- package/esm2020/lib/application-controller/support-components/dash-table/dash-table.component.mjs +1 -1
- package/esm2020/lib/application-controller/support-components/dash-today-previous/dash-today-previous.component.mjs +1 -1
- package/esm2020/lib/application-controller/support-components/geo-map/geo-map.component.mjs +2 -2
- package/esm2020/lib/application-controller/support-components/heat-map/heat-map.component.mjs +1 -1
- package/esm2020/lib/application-controller/support-components/single-card/single-card.component.mjs +1 -1
- package/esm2020/lib/application-controller/support-components/table-with-bar/table-with-bar.component.mjs +2 -2
- package/esm2020/lib/shared/advanced-component/advance-widget-header-filter/advance-widget-header-filter.component.mjs +116 -0
- package/esm2020/lib/shared/advanced-component/app-advance-header/app-header.component.mjs +306 -0
- package/esm2020/lib/shared/advanced-component/gamm-single-number-card/gamm-single-number-card.component.mjs +80 -0
- package/esm2020/lib/shared/advanced-component/gamma-advance-chart/gamma-advance-chart.component.mjs +379 -0
- package/esm2020/lib/shared/advanced-component/gamma-advance-operator-table/gamma-advance-operator-table.component.mjs +188 -0
- package/esm2020/lib/shared/advanced-component/gamma-geo-chart/gamma-geo-chart.component.mjs +435 -0
- package/esm2020/lib/shared/advanced-component/gamma-heatmap/gamma-heatmap.component.mjs +334 -0
- package/esm2020/lib/shared/advanced-component/gamma-table-clumn-bar-chart/gamma-table-clumn-bar-chart.component.mjs +155 -0
- package/esm2020/lib/shared/advanced-component/gamma-table-with-percentage/contentSafeHtml.mjs +20 -0
- package/esm2020/lib/shared/advanced-component/gamma-table-with-percentage/gamma-table-with-percentage.component.mjs +187 -0
- package/esm2020/lib/shared/advanced-component/gamma-today-previous/gamma-today-previous.component.mjs +86 -0
- package/esm2020/lib/shared/advanced-component/google-geo-map/google-geo-map.component.mjs +439 -0
- package/esm2020/lib/shared/app-title/app-title.component.mjs +67 -0
- package/esm2020/lib/shared/gamam-widget/gamam-widget.component.mjs +35 -0
- package/esm2020/lib/shared/gamma-advance-filter/gamma-advance-filter.component.mjs +273 -0
- package/esm2020/lib/shared/gamma-bread-crumbs/bread-crumbs.component.mjs +142 -0
- package/esm2020/lib/shared/kpi-comon-service.mjs +537 -0
- package/esm2020/lib/{application-controller/shared → shared}/loader/loader.component.mjs +1 -1
- package/esm2020/lib/{application-controller/shared → shared}/loading/loading.component.mjs +1 -1
- package/esm2020/lib/shared/loading/loadingModule.mjs +28 -0
- package/esm2020/lib/shared/safeHtmlPipe.mjs +20 -0
- package/esm2020/lib/template-module/KpiCreationModule/create-kpi-tree.component.mjs +1 -1
- package/esm2020/lib/template-module/KpiCreationModule/kpiCreation.module.mjs +2 -2
- package/esm2020/lib/template-module/bookmarked-template/bookmarked-dataset-call.service.mjs +364 -0
- package/esm2020/lib/template-module/bookmarked-template/bookmarked-layout.service.mjs +121 -0
- package/esm2020/lib/template-module/bookmarked-template/bookmarked-template.component.mjs +816 -0
- package/esm2020/lib/template-module/bookmarked-template/bookmarkedTemplate.module.mjs +151 -0
- package/esm2020/lib/template-module/cdrConfigModule/cdr-config.component.mjs +1 -1
- package/esm2020/lib/template-module/cdrConfigModule/cdrConfig.module.mjs +2 -2
- package/esm2020/lib/template-module/defaulLandingComponent/defaultLandingComponent.module.mjs +151 -0
- package/esm2020/lib/template-module/defaulLandingComponent/landing-component.component.mjs +870 -0
- package/esm2020/lib/template-module/defaulLandingComponent/landing-component.service.mjs +121 -0
- package/esm2020/lib/template-module/defaulLandingComponent/landing-dataset-call.service.mjs +364 -0
- package/esm2020/lib/template-module/exceptionConfigModule/exception-operation.component.mjs +1 -1
- package/esm2020/lib/template-module/exceptionConfigModule/exceptionConfig.module.mjs +2 -2
- package/esm2020/lib/template-module/kpiWithMultiLayout/dynamin-modal-multi.component.mjs +180 -0
- package/esm2020/lib/template-module/kpiWithMultiLayout/kpi-multi-layout.service.mjs +121 -0
- package/esm2020/lib/template-module/kpiWithMultiLayout/kpi-with-multilayout.component.mjs +992 -0
- package/esm2020/lib/template-module/kpiWithMultiLayout/kpiWithMultiayout.module.mjs +156 -0
- package/esm2020/lib/template-module/kpiWithMultiLayout/single-layout-dataset-call.service.mjs +364 -0
- package/esm2020/lib/template-module/kpiWithSingleLayout/dynamin-modal.component.mjs +180 -0
- package/esm2020/lib/template-module/kpiWithSingleLayout/kpi-single-layout.service.mjs +121 -0
- package/esm2020/lib/template-module/kpiWithSingleLayout/kpi-with-dataset.component.mjs +1046 -0
- package/esm2020/lib/template-module/kpiWithSingleLayout/kpiWithSingleLayout.module.mjs +156 -0
- package/esm2020/lib/template-module/kpiWithSingleLayout/multi-layout-dataset-call.service.mjs +364 -0
- package/esm2020/public-api.mjs +38 -20
- package/fesm2015/gamma-app-controller.mjs +7025 -399
- package/fesm2015/gamma-app-controller.mjs.map +1 -1
- package/fesm2020/gamma-app-controller.mjs +6970 -399
- package/fesm2020/gamma-app-controller.mjs.map +1 -1
- package/lib/application-controller/application-controller.module.d.ts +19 -19
- package/lib/application-controller/page-controller/page-config/page-config.component.d.ts +9 -9
- package/lib/application-controller/page-controller/page-config-multi-layout/page-config-multi-layout.component.d.ts +8 -8
- package/lib/{application-controller/shared → shared}/advanced-component/app-advance-header/app-header.component.d.ts +18 -2
- package/lib/{application-controller/shared → shared}/advanced-component/gamm-single-number-card/gamm-single-number-card.component.d.ts +3 -5
- package/lib/{application-controller/shared → shared}/advanced-component/gamma-advance-chart/gamma-advance-chart.component.d.ts +3 -1
- package/lib/{application-controller/shared → shared}/advanced-component/gamma-advance-operator-table/gamma-advance-operator-table.component.d.ts +4 -2
- package/lib/{application-controller/shared → shared}/advanced-component/gamma-geo-chart/gamma-geo-chart.component.d.ts +1 -1
- package/lib/{application-controller/shared → shared}/advanced-component/gamma-heatmap/gamma-heatmap.component.d.ts +1 -1
- package/lib/{application-controller/shared → shared}/advanced-component/gamma-table-clumn-bar-chart/gamma-table-clumn-bar-chart.component.d.ts +1 -1
- package/lib/{application-controller/shared → shared}/advanced-component/gamma-table-with-percentage/gamma-table-with-percentage.component.d.ts +6 -2
- package/lib/{application-controller/shared → shared}/advanced-component/gamma-today-previous/gamma-today-previous.component.d.ts +1 -1
- package/lib/{application-controller/shared → shared}/advanced-component/google-geo-map/google-geo-map.component.d.ts +1 -1
- package/lib/{application-controller/shared → shared}/app-title/app-title.component.d.ts +1 -1
- package/lib/{application-controller/shared → shared}/gamam-widget/gamam-widget.component.d.ts +1 -1
- package/lib/{application-controller/shared → shared}/gamma-advance-filter/gamma-advance-filter.component.d.ts +3 -2
- package/lib/{application-controller/shared → shared}/gamma-bread-crumbs/bread-crumbs.component.d.ts +1 -1
- package/lib/{application-controller/shared → shared}/kpi-comon-service.d.ts +1 -1
- package/lib/template-module/KpiCreationModule/kpiCreation.module.d.ts +1 -1
- package/lib/template-module/bookmarked-template/bookmarked-dataset-call.service.d.ts +24 -0
- package/lib/template-module/bookmarked-template/bookmarked-layout.service.d.ts +33 -0
- package/lib/template-module/bookmarked-template/bookmarked-template.component.d.ts +109 -0
- package/lib/template-module/bookmarked-template/bookmarkedTemplate.module.d.ts +16 -0
- package/lib/template-module/cdrConfigModule/cdrConfig.module.d.ts +1 -1
- package/lib/template-module/defaulLandingComponent/defaultLandingComponent.module.d.ts +16 -0
- package/lib/template-module/defaulLandingComponent/landing-component.component.d.ts +109 -0
- package/lib/template-module/defaulLandingComponent/landing-component.service.d.ts +33 -0
- package/lib/template-module/defaulLandingComponent/landing-dataset-call.service.d.ts +24 -0
- package/lib/template-module/exceptionConfigModule/exceptionConfig.module.d.ts +1 -1
- package/lib/template-module/kpiWithMultiLayout/dynamin-modal-multi.component.d.ts +42 -0
- package/lib/template-module/kpiWithMultiLayout/kpi-multi-layout.service.d.ts +33 -0
- package/lib/template-module/kpiWithMultiLayout/kpi-with-multilayout.component.d.ts +117 -0
- package/lib/template-module/kpiWithMultiLayout/kpiWithMultiayout.module.d.ts +17 -0
- package/lib/template-module/kpiWithMultiLayout/single-layout-dataset-call.service.d.ts +24 -0
- package/lib/template-module/kpiWithSingleLayout/dynamin-modal.component.d.ts +42 -0
- package/lib/template-module/kpiWithSingleLayout/kpi-single-layout.service.d.ts +33 -0
- package/lib/template-module/kpiWithSingleLayout/kpi-with-dataset.component.d.ts +122 -0
- package/lib/template-module/kpiWithSingleLayout/kpiWithSingleLayout.module.d.ts +17 -0
- package/lib/template-module/kpiWithSingleLayout/multi-layout-dataset-call.service.d.ts +24 -0
- package/package.json +1 -1
- package/public-api.d.ts +37 -19
- package/esm2020/lib/application-controller/shared/advanced-component/advance-widget-header-filter/advance-widget-header-filter.component.mjs +0 -124
- package/esm2020/lib/application-controller/shared/advanced-component/app-advance-header/app-header.component.mjs +0 -220
- package/esm2020/lib/application-controller/shared/advanced-component/gamm-single-number-card/gamm-single-number-card.component.mjs +0 -95
- package/esm2020/lib/application-controller/shared/advanced-component/gamma-advance-chart/gamma-advance-chart.component.mjs +0 -362
- package/esm2020/lib/application-controller/shared/advanced-component/gamma-advance-operator-table/gamma-advance-operator-table.component.mjs +0 -177
- package/esm2020/lib/application-controller/shared/advanced-component/gamma-geo-chart/gamma-geo-chart.component.mjs +0 -441
- package/esm2020/lib/application-controller/shared/advanced-component/gamma-heatmap/gamma-heatmap.component.mjs +0 -328
- package/esm2020/lib/application-controller/shared/advanced-component/gamma-table-clumn-bar-chart/gamma-table-clumn-bar-chart.component.mjs +0 -155
- package/esm2020/lib/application-controller/shared/advanced-component/gamma-table-with-percentage/contentSafeHtml.mjs +0 -20
- package/esm2020/lib/application-controller/shared/advanced-component/gamma-table-with-percentage/gamma-table-with-percentage.component.mjs +0 -157
- package/esm2020/lib/application-controller/shared/advanced-component/gamma-today-previous/gamma-today-previous.component.mjs +0 -85
- package/esm2020/lib/application-controller/shared/advanced-component/google-geo-map/google-geo-map.component.mjs +0 -439
- package/esm2020/lib/application-controller/shared/app-title/app-title.component.mjs +0 -67
- package/esm2020/lib/application-controller/shared/gamam-widget/gamam-widget.component.mjs +0 -35
- package/esm2020/lib/application-controller/shared/gamma-advance-filter/gamma-advance-filter.component.mjs +0 -237
- package/esm2020/lib/application-controller/shared/gamma-bread-crumbs/bread-crumbs.component.mjs +0 -142
- package/esm2020/lib/application-controller/shared/kpi-comon-service.mjs +0 -537
- package/esm2020/lib/application-controller/shared/loading/loadingModule.mjs +0 -28
- package/esm2020/lib/application-controller/shared/safeHtmlPipe.mjs +0 -20
- /package/lib/{application-controller/shared → shared}/advanced-component/advance-widget-header-filter/advance-widget-header-filter.component.d.ts +0 -0
- /package/lib/{application-controller/shared → shared}/advanced-component/gamma-table-with-percentage/contentSafeHtml.d.ts +0 -0
- /package/lib/{application-controller/shared → shared}/loader/loader.component.d.ts +0 -0
- /package/lib/{application-controller/shared → shared}/loading/loading.component.d.ts +0 -0
- /package/lib/{application-controller/shared → shared}/loading/loadingModule.d.ts +0 -0
- /package/lib/{application-controller/shared → shared}/safeHtmlPipe.d.ts +0 -0
|
@@ -1,441 +0,0 @@
|
|
|
1
|
-
import { Component, EventEmitter, Input, Output, ViewChild, } from "@angular/core";
|
|
2
|
-
import moment from "moment";
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "../../../common";
|
|
5
|
-
import * as i2 from "@angular/common";
|
|
6
|
-
import * as i3 from "../../loader/loader.component";
|
|
7
|
-
export class GammaGeoChartComponent {
|
|
8
|
-
constructor(commonService) {
|
|
9
|
-
this.commonService = commonService;
|
|
10
|
-
this.markers = [];
|
|
11
|
-
this.bounds = new google.maps.LatLngBounds();
|
|
12
|
-
this.getTableConfigOutPut = new EventEmitter();
|
|
13
|
-
this.oRowClick = new EventEmitter();
|
|
14
|
-
this.onrightClickContextSelection = new EventEmitter();
|
|
15
|
-
this.rightClickEnable = true;
|
|
16
|
-
}
|
|
17
|
-
set chartDataSource(value) {
|
|
18
|
-
if (value === undefined || value.length === 0) {
|
|
19
|
-
return;
|
|
20
|
-
}
|
|
21
|
-
else {
|
|
22
|
-
this.isLoader = true;
|
|
23
|
-
this.page_config = value;
|
|
24
|
-
this.page_parms = value.titleParams;
|
|
25
|
-
this.sortBy = value.kpiConfig?.dataConfig?.sortBy;
|
|
26
|
-
if (value.kpiConfig.dataSource &&
|
|
27
|
-
value.kpiConfig.dataSource.length !== 0) {
|
|
28
|
-
if (value.kpiConfig.formate == "monthly") {
|
|
29
|
-
this.mapTYpe = value.kpiConfig.dataConfig.mapType;
|
|
30
|
-
if (this.mapTYpe == "geoMap") {
|
|
31
|
-
this.region = value.kpiConfig.dataConfig.region;
|
|
32
|
-
this.regionCode = value.kpiConfig.dataConfig.regionCode;
|
|
33
|
-
this.tootTipColumn = value.kpiConfig.dataConfig.chart_config;
|
|
34
|
-
let data = value.kpiConfig.dataSource;
|
|
35
|
-
this.chartHeight = `${value.kpiConfig.dataConfig.size}px`;
|
|
36
|
-
this.chartType = value.kpiConfig.dataConfig.chartType;
|
|
37
|
-
this.bacgroundColor = value.kpiConfig.dataConfig.backgroundColor;
|
|
38
|
-
this.mapColors = value.kpiConfig.dataConfig.colors;
|
|
39
|
-
const formattedData = [
|
|
40
|
-
[
|
|
41
|
-
value.kpiConfig.dataConfig["argumentField"],
|
|
42
|
-
value.kpiConfig.dataConfig["chartValueField"],
|
|
43
|
-
{ type: "string", role: "tooltip", p: { html: true } },
|
|
44
|
-
],
|
|
45
|
-
].concat(data.map((item) => {
|
|
46
|
-
const tooltip = this.getTooltip(item);
|
|
47
|
-
return [
|
|
48
|
-
item[value.kpiConfig.dataConfig["argumentField"]],
|
|
49
|
-
item[value.kpiConfig.dataConfig["chartValueField"]],
|
|
50
|
-
tooltip,
|
|
51
|
-
];
|
|
52
|
-
}));
|
|
53
|
-
this.charData = formattedData;
|
|
54
|
-
setTimeout(() => {
|
|
55
|
-
this.isLoader = false;
|
|
56
|
-
}, 200);
|
|
57
|
-
}
|
|
58
|
-
else if (this.mapTYpe == "bubbleMap") {
|
|
59
|
-
this.locations = value.kpiConfig.dataSource;
|
|
60
|
-
this.chartHeight = `${value.kpiConfig.dataConfig.size}px`;
|
|
61
|
-
this.tootTipColumn = value.kpiConfig.dataConfig.chart_config;
|
|
62
|
-
this.mapOptionForHeatMap = {
|
|
63
|
-
zoom: this.zoomValuForAll,
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
else {
|
|
67
|
-
this.locations = value.kpiConfig.dataSource;
|
|
68
|
-
this.tootTipColumn = value.kpiConfig.dataConfig.chart_config;
|
|
69
|
-
this.chartHeight = `${value.kpiConfig.dataConfig.size}px`;
|
|
70
|
-
this.zoomValuForAll = parseFloat(this.page_config.kpiConfig.dataConfig.zoom);
|
|
71
|
-
this.mapOptionForHeatMap = {
|
|
72
|
-
zoom: this.zoomValuForAll,
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
else if (value.kpiConfig.formate == "daily") {
|
|
77
|
-
this.mapTYpe = value.kpiConfig.dataConfig.mapType;
|
|
78
|
-
const sortedData = value.kpiConfig.dataSource
|
|
79
|
-
.filter(record => record[this.sortBy])
|
|
80
|
-
.sort((a, b) => moment(b[this.sortBy]).diff(moment(a[this.sortBy])));
|
|
81
|
-
const mostRecentRecord = sortedData[0];
|
|
82
|
-
if (value.endDate) {
|
|
83
|
-
this.filteredObjects = sortedData.filter(data => data[this.sortBy] === value.endDate);
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
this.filteredObjects = sortedData.filter(data => data[this.sortBy] === mostRecentRecord[this.sortBy]);
|
|
87
|
-
}
|
|
88
|
-
if (this.mapTYpe == "bubbleMap") {
|
|
89
|
-
this.locations = this.filteredObjects;
|
|
90
|
-
this.chartHeight = `${value.kpiConfig.dataConfig.size}px`;
|
|
91
|
-
this.tootTipColumn = value.kpiConfig.dataConfig.chart_config;
|
|
92
|
-
this.mapOptionForHeatMap = {
|
|
93
|
-
zoom: this.zoomValuForAll
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
ngOnInit() { }
|
|
101
|
-
ngAfterViewInit() {
|
|
102
|
-
if (this.mapTYpe == "geoMap") {
|
|
103
|
-
this.loadGoogleCharts();
|
|
104
|
-
}
|
|
105
|
-
else if (this.mapTYpe == "heatMap") {
|
|
106
|
-
if (this.page_config.kpiConfig.dataConfig.heatMapCategory == "heatMapOnly") {
|
|
107
|
-
this.isLoader = false;
|
|
108
|
-
this.loadGoogleHeatOnlyMaps(this.locations);
|
|
109
|
-
}
|
|
110
|
-
else if (this.page_config.kpiConfig.dataConfig.heatMapCategory == "heatMapMarker") {
|
|
111
|
-
this.isLoader = false;
|
|
112
|
-
this.initializeMap();
|
|
113
|
-
this.addMarkers();
|
|
114
|
-
}
|
|
115
|
-
else {
|
|
116
|
-
this.isLoader = false;
|
|
117
|
-
this.initializeHeatWithMarkerMap(this.locations);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
else {
|
|
121
|
-
this.isLoader = false;
|
|
122
|
-
this.initializeMap();
|
|
123
|
-
this.addBubbleMarkers();
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
loadGoogleCharts() {
|
|
127
|
-
google.charts.load("current", {
|
|
128
|
-
packages: [this.chartType],
|
|
129
|
-
});
|
|
130
|
-
google.charts.setOnLoadCallback(this.drawChart.bind(this));
|
|
131
|
-
}
|
|
132
|
-
drawChart() {
|
|
133
|
-
const data = google.visualization.arrayToDataTable(this.charData);
|
|
134
|
-
const options = this.getOptionConfig();
|
|
135
|
-
const chart = new google.visualization.GeoChart(this.googlMap.nativeElement);
|
|
136
|
-
this.googlMap.nativeElement.style.height = this.chartHeight;
|
|
137
|
-
chart.draw(data, options);
|
|
138
|
-
}
|
|
139
|
-
getTooltip(data) {
|
|
140
|
-
let toolTipData = "";
|
|
141
|
-
this.tootTipColumn.forEach((element) => {
|
|
142
|
-
if (typeof data[element.dataField] === "number") {
|
|
143
|
-
toolTipData +=
|
|
144
|
-
"<div class='inline'><b>" +
|
|
145
|
-
element.caption +
|
|
146
|
-
":</b></div> " +
|
|
147
|
-
this.commonService.roundOffTillTwo(data[element.dataField], 2) +
|
|
148
|
-
"<br />";
|
|
149
|
-
}
|
|
150
|
-
else {
|
|
151
|
-
toolTipData +=
|
|
152
|
-
"<div class='inline'><b>" +
|
|
153
|
-
element.caption +
|
|
154
|
-
":</b></div> " +
|
|
155
|
-
data[element.dataField] +
|
|
156
|
-
"<br />";
|
|
157
|
-
}
|
|
158
|
-
});
|
|
159
|
-
return toolTipData;
|
|
160
|
-
}
|
|
161
|
-
getOptionConfig() {
|
|
162
|
-
if (this.region == "city") {
|
|
163
|
-
const options = {
|
|
164
|
-
region: this.regionCode,
|
|
165
|
-
displayMode: "markers",
|
|
166
|
-
backgroundColor: this.bacgroundColor,
|
|
167
|
-
tooltip: { isHtml: true },
|
|
168
|
-
colorAxis: { colors: this.mapColors },
|
|
169
|
-
};
|
|
170
|
-
return options;
|
|
171
|
-
}
|
|
172
|
-
else {
|
|
173
|
-
const options = {
|
|
174
|
-
backgroundColor: this.bacgroundColor,
|
|
175
|
-
tooltip: { isHtml: true },
|
|
176
|
-
colorAxis: { colors: this.mapColors },
|
|
177
|
-
};
|
|
178
|
-
return options;
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
initializeMap() {
|
|
182
|
-
const mapOptions = this.mapOptionForHeatMap;
|
|
183
|
-
if (this.mapTYpe == "bubbleMap") {
|
|
184
|
-
mapOptions["styles"] = [
|
|
185
|
-
{
|
|
186
|
-
featureType: "all",
|
|
187
|
-
stylers: [
|
|
188
|
-
{ saturation: -100 },
|
|
189
|
-
{ lightness: 70 },
|
|
190
|
-
{ visibility: "simplified" },
|
|
191
|
-
],
|
|
192
|
-
},
|
|
193
|
-
{
|
|
194
|
-
featureType: "administrative.country",
|
|
195
|
-
elementType: "labels",
|
|
196
|
-
stylers: [
|
|
197
|
-
{ lightness: -30 },
|
|
198
|
-
{ visibility: "on" },
|
|
199
|
-
{ fontWeight: "bold" },
|
|
200
|
-
{ fontSize: "12px" },
|
|
201
|
-
],
|
|
202
|
-
},
|
|
203
|
-
{
|
|
204
|
-
featureType: "administrative.country",
|
|
205
|
-
elementType: "geometry.stroke",
|
|
206
|
-
stylers: [
|
|
207
|
-
{ lightness: -40 },
|
|
208
|
-
{ weight: 1.5 },
|
|
209
|
-
],
|
|
210
|
-
},
|
|
211
|
-
{
|
|
212
|
-
featureType: "administrative.country",
|
|
213
|
-
elementType: "geometry.fill",
|
|
214
|
-
stylers: [
|
|
215
|
-
{ lightness: 90 },
|
|
216
|
-
],
|
|
217
|
-
},
|
|
218
|
-
];
|
|
219
|
-
}
|
|
220
|
-
this.map = new google.maps.Map(this.googlMap.nativeElement, mapOptions);
|
|
221
|
-
this.googlMap.nativeElement.style.height = this.chartHeight;
|
|
222
|
-
}
|
|
223
|
-
addMarkers() {
|
|
224
|
-
this.locations.forEach((location) => {
|
|
225
|
-
const marker = new google.maps.Marker({
|
|
226
|
-
position: {
|
|
227
|
-
lat: parseFloat(location[this.page_config.kpiConfig.dataConfig.markerLatitude]),
|
|
228
|
-
lng: parseFloat(location[this.page_config.kpiConfig.dataConfig.markerLongitude]),
|
|
229
|
-
},
|
|
230
|
-
icon: this.page_config.kpiConfig.dataConfig.icon
|
|
231
|
-
? {
|
|
232
|
-
url: this.page_config.kpiConfig.dataConfig.icon,
|
|
233
|
-
scaledSize: {
|
|
234
|
-
width: 32,
|
|
235
|
-
height: 32,
|
|
236
|
-
},
|
|
237
|
-
}
|
|
238
|
-
: "",
|
|
239
|
-
map: this.map,
|
|
240
|
-
title: `${location.city}: $${location.total_sales_amount}`,
|
|
241
|
-
});
|
|
242
|
-
this.bounds.extend(marker.getPosition());
|
|
243
|
-
this.markers.push(marker);
|
|
244
|
-
let stringWithoutQuotes = this.getInfoWindoData(location);
|
|
245
|
-
const infoWIndowData = this.getInfoWindoData(location);
|
|
246
|
-
const infoWindow = new google.maps.InfoWindow({
|
|
247
|
-
content: `<div style="height: 100%; width: 100%; color: black; font-size: 20px;">
|
|
248
|
-
${infoWIndowData}
|
|
249
|
-
</div>`,
|
|
250
|
-
});
|
|
251
|
-
marker.addListener("click", () => {
|
|
252
|
-
if (this.currentInfoWindow) {
|
|
253
|
-
this.currentInfoWindow.close();
|
|
254
|
-
}
|
|
255
|
-
infoWindow.open(this.map, marker);
|
|
256
|
-
this.currentInfoWindow = infoWindow;
|
|
257
|
-
});
|
|
258
|
-
});
|
|
259
|
-
this.map.fitBounds(this.bounds);
|
|
260
|
-
}
|
|
261
|
-
getInfoWindoData(data) {
|
|
262
|
-
let toolTipData = ``;
|
|
263
|
-
this.tootTipColumn.forEach((element) => {
|
|
264
|
-
if (typeof data[element.dataField] === "number") {
|
|
265
|
-
toolTipData +=
|
|
266
|
-
`<div class='inline'><b>` +
|
|
267
|
-
element.caption +
|
|
268
|
-
`:</b></div> ` +
|
|
269
|
-
this.commonService.roundOffTillTwo(data[element.dataField], 2) +
|
|
270
|
-
`<br />`;
|
|
271
|
-
}
|
|
272
|
-
else {
|
|
273
|
-
toolTipData +=
|
|
274
|
-
`<div class='inline'><b>` +
|
|
275
|
-
element.caption +
|
|
276
|
-
`:</b></div> ` +
|
|
277
|
-
data[element.dataField] +
|
|
278
|
-
`<br />`;
|
|
279
|
-
}
|
|
280
|
-
});
|
|
281
|
-
return toolTipData;
|
|
282
|
-
}
|
|
283
|
-
loadGoogleHeatOnlyMaps(data) {
|
|
284
|
-
this.heatmapData = [];
|
|
285
|
-
data.forEach((element) => {
|
|
286
|
-
let latitude = parseFloat(element[this.page_config.kpiConfig.dataConfig.markerLatitude]);
|
|
287
|
-
let logtitude = parseFloat(element[this.page_config.kpiConfig.dataConfig.markerLongitude]);
|
|
288
|
-
this.heatmapData.push({
|
|
289
|
-
location: new google.maps.LatLng(latitude, logtitude),
|
|
290
|
-
});
|
|
291
|
-
this.bounds.extend(new google.maps.LatLng(latitude, logtitude));
|
|
292
|
-
});
|
|
293
|
-
const mapOptions = {
|
|
294
|
-
zoom: this.zoomValuForAll,
|
|
295
|
-
};
|
|
296
|
-
this.map = new google.maps.Map(this.googlMap.nativeElement, mapOptions);
|
|
297
|
-
this.googlMap.nativeElement.style.height = this.chartHeight;
|
|
298
|
-
this.map.fitBounds(this.bounds);
|
|
299
|
-
this.heatmap = new google.maps.visualization.HeatmapLayer({
|
|
300
|
-
data: this.heatmapData,
|
|
301
|
-
map: this.map,
|
|
302
|
-
});
|
|
303
|
-
}
|
|
304
|
-
initializeHeatWithMarkerMap(data) {
|
|
305
|
-
this.map = new google.maps.Map(this.googlMap.nativeElement, {
|
|
306
|
-
zoom: parseFloat(this.page_config.kpiConfig.dataConfig.zoom),
|
|
307
|
-
});
|
|
308
|
-
this.googlMap.nativeElement.style.height = this.chartHeight;
|
|
309
|
-
this.heatmapData = [];
|
|
310
|
-
data.forEach((element) => {
|
|
311
|
-
let latitude = parseFloat(element[this.page_config.kpiConfig.dataConfig.markerLatitude]);
|
|
312
|
-
let logtitude = parseFloat(element[this.page_config.kpiConfig.dataConfig.markerLongitude]);
|
|
313
|
-
this.heatmapData.push({
|
|
314
|
-
location: new google.maps.LatLng(latitude, logtitude),
|
|
315
|
-
});
|
|
316
|
-
this.bounds.extend(new google.maps.LatLng(latitude, logtitude));
|
|
317
|
-
});
|
|
318
|
-
this.heatmap = new google.maps.visualization.HeatmapLayer({
|
|
319
|
-
data: this.heatmapData,
|
|
320
|
-
map: this.map,
|
|
321
|
-
});
|
|
322
|
-
this.locations.forEach((location) => {
|
|
323
|
-
const marker = new google.maps.Marker({
|
|
324
|
-
position: {
|
|
325
|
-
lat: parseFloat(location[this.page_config.kpiConfig.dataConfig.markerLatitude]),
|
|
326
|
-
lng: parseFloat(location[this.page_config.kpiConfig.dataConfig.markerLongitude]),
|
|
327
|
-
},
|
|
328
|
-
icon: this.page_config.kpiConfig.dataConfig.icon
|
|
329
|
-
? {
|
|
330
|
-
url: this.page_config.kpiConfig.dataConfig.icon,
|
|
331
|
-
scaledSize: {
|
|
332
|
-
width: 32,
|
|
333
|
-
height: 32,
|
|
334
|
-
},
|
|
335
|
-
}
|
|
336
|
-
: "",
|
|
337
|
-
map: this.map,
|
|
338
|
-
title: `${location.city}: $${location.total_sales_amount}`,
|
|
339
|
-
});
|
|
340
|
-
this.bounds.extend(marker.getPosition());
|
|
341
|
-
this.markers.push(marker);
|
|
342
|
-
const infoWIndowData = this.getInfoWindoData(location);
|
|
343
|
-
const infoWindow = new google.maps.InfoWindow({
|
|
344
|
-
content: `<div style="height: 100%; width: 100%; color: black; font-size: 20px;">
|
|
345
|
-
${infoWIndowData}
|
|
346
|
-
</div>`,
|
|
347
|
-
});
|
|
348
|
-
marker.addListener("click", () => {
|
|
349
|
-
if (this.currentInfoWindow) {
|
|
350
|
-
this.currentInfoWindow.close();
|
|
351
|
-
}
|
|
352
|
-
infoWindow.open(this.map, marker);
|
|
353
|
-
this.currentInfoWindow = infoWindow;
|
|
354
|
-
});
|
|
355
|
-
});
|
|
356
|
-
this.map.fitBounds(this.bounds);
|
|
357
|
-
this.map.addListener("zoom_changed", () => this.handleZoomChange());
|
|
358
|
-
}
|
|
359
|
-
handleZoomChange() {
|
|
360
|
-
const zoomLevel = this.map.getZoom();
|
|
361
|
-
if (zoomLevel < 5) {
|
|
362
|
-
this.heatmap.setMap(this.map);
|
|
363
|
-
this.markers.forEach((marker) => marker.setMap(null));
|
|
364
|
-
}
|
|
365
|
-
else {
|
|
366
|
-
this.heatmap.setMap(null);
|
|
367
|
-
this.markers.forEach((marker) => marker.setMap(this.map));
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
addBubbleMarkers() {
|
|
371
|
-
this.prepareBubbleData();
|
|
372
|
-
this.locations.forEach((location) => {
|
|
373
|
-
const marker = new google.maps.Marker({
|
|
374
|
-
position: {
|
|
375
|
-
lat: parseFloat(location[this.page_config.kpiConfig.dataConfig.markerLatitude]),
|
|
376
|
-
lng: parseFloat(location[this.page_config.kpiConfig.dataConfig.markerLongitude]),
|
|
377
|
-
},
|
|
378
|
-
icon: {
|
|
379
|
-
path: google.maps.SymbolPath.CIRCLE,
|
|
380
|
-
scale: Math.round(location.sales_percentage),
|
|
381
|
-
fillColor: this.page_config.kpiConfig.dataConfig.bubbleColor,
|
|
382
|
-
fillOpacity: 0.6,
|
|
383
|
-
strokeWeight: 0,
|
|
384
|
-
},
|
|
385
|
-
map: this.map,
|
|
386
|
-
title: `${location.city}: $${location[this.page_config.kpiConfig.dataConfig.agrumentValue]}`,
|
|
387
|
-
});
|
|
388
|
-
this.bounds.extend(marker.getPosition());
|
|
389
|
-
this.markers.push(marker);
|
|
390
|
-
let stringWithoutQuotes = this.getInfoWindoData(location);
|
|
391
|
-
const infoWIndowData = this.getInfoWindoData(location);
|
|
392
|
-
const infoWindow = new google.maps.InfoWindow({
|
|
393
|
-
content: `<div style="height: 100%; width: 100%; color: black; font-size: 20px;">
|
|
394
|
-
${infoWIndowData}
|
|
395
|
-
</div>`,
|
|
396
|
-
});
|
|
397
|
-
marker.addListener("click", () => {
|
|
398
|
-
if (this.currentInfoWindow) {
|
|
399
|
-
this.currentInfoWindow.close();
|
|
400
|
-
}
|
|
401
|
-
infoWindow.open(this.map, marker);
|
|
402
|
-
this.currentInfoWindow = infoWindow;
|
|
403
|
-
});
|
|
404
|
-
});
|
|
405
|
-
this.map.fitBounds(this.bounds);
|
|
406
|
-
}
|
|
407
|
-
prepareBubbleData() {
|
|
408
|
-
const minSales = Math.min(...this.locations.map((d) => d[this.page_config.kpiConfig.dataConfig.agrumentValue]));
|
|
409
|
-
const maxSales = Math.max(...this.locations.map((d) => d[this.page_config.kpiConfig.dataConfig.agrumentValue]));
|
|
410
|
-
const minPercentage = this.page_config.kpiConfig.dataConfig.bubbleMinimumSize;
|
|
411
|
-
const maxPercentage = this.page_config.kpiConfig.dataConfig.bubbleMaximumSize;
|
|
412
|
-
const normalize = (value, min, max) => {
|
|
413
|
-
return (((value - min) / (max - min)) * (maxPercentage - minPercentage) +
|
|
414
|
-
minPercentage);
|
|
415
|
-
};
|
|
416
|
-
this.locations.forEach((d) => {
|
|
417
|
-
d.sales_percentage = Math.min(Math.max(normalize(d[this.page_config.kpiConfig.dataConfig.agrumentValue], minSales, maxSales), minPercentage), maxPercentage);
|
|
418
|
-
});
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
GammaGeoChartComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GammaGeoChartComponent, deps: [{ token: i1.CommonService }], target: i0.ɵɵFactoryTarget.Component });
|
|
422
|
-
GammaGeoChartComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: GammaGeoChartComponent, selector: "app-gamma-geo-chart", inputs: { rightClickEnable: "rightClickEnable", chartDataSource: "chartDataSource" }, outputs: { getTableConfigOutPut: "getTableConfigOutPut", oRowClick: "oRowClick", onrightClickContextSelection: "onrightClickContextSelection" }, viewQueries: [{ propertyName: "googlMap", first: true, predicate: ["googlMap"], descendants: true }], ngImport: i0, template: "\n<div class=\"mx-2 bg-gray-800\">\n <ng-container *ngIf=\"isLoader\">\n <div class=\"flex justify-center items-start bg-gray-800 p-2\">\n <app-loader></app-loader>\n </div>\n </ng-container>\n\n <div class=\"mx-2 pb-2\">\n\n <ng-container>\n <div id=\"regions_div\" #googlMap style=\"width: 100%\" ></div> \n </ng-container>\n \n \n\n </div>\n\n\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.LoaderComponent, selector: "app-loader" }] });
|
|
423
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GammaGeoChartComponent, decorators: [{
|
|
424
|
-
type: Component,
|
|
425
|
-
args: [{ selector: "app-gamma-geo-chart", template: "\n<div class=\"mx-2 bg-gray-800\">\n <ng-container *ngIf=\"isLoader\">\n <div class=\"flex justify-center items-start bg-gray-800 p-2\">\n <app-loader></app-loader>\n </div>\n </ng-container>\n\n <div class=\"mx-2 pb-2\">\n\n <ng-container>\n <div id=\"regions_div\" #googlMap style=\"width: 100%\" ></div> \n </ng-container>\n \n \n\n </div>\n\n\n</div>\n" }]
|
|
426
|
-
}], ctorParameters: function () { return [{ type: i1.CommonService }]; }, propDecorators: { googlMap: [{
|
|
427
|
-
type: ViewChild,
|
|
428
|
-
args: ["googlMap"]
|
|
429
|
-
}], getTableConfigOutPut: [{
|
|
430
|
-
type: Output
|
|
431
|
-
}], oRowClick: [{
|
|
432
|
-
type: Output
|
|
433
|
-
}], onrightClickContextSelection: [{
|
|
434
|
-
type: Output
|
|
435
|
-
}], rightClickEnable: [{
|
|
436
|
-
type: Input
|
|
437
|
-
}], chartDataSource: [{
|
|
438
|
-
type: Input,
|
|
439
|
-
args: ["chartDataSource"]
|
|
440
|
-
}] } });
|
|
441
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FtbWEtZ2VvLWNoYXJ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dhbW1hLWFwcC1jb250cm9sbGVyL3NyYy9saWIvYXBwbGljYXRpb24tY29udHJvbGxlci9zaGFyZWQvYWR2YW5jZWQtY29tcG9uZW50L2dhbW1hLWdlby1jaGFydC9nYW1tYS1nZW8tY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL3NoYXJlZC9hZHZhbmNlZC1jb21wb25lbnQvZ2FtbWEtZ2VvLWNoYXJ0L2dhbW1hLWdlby1jaGFydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7Ozs7O0FBUTVCLE1BQU0sT0FBTyxzQkFBc0I7SUFpSWpDLFlBQW1CLGFBQTRCO1FBQTVCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBN0cvQyxZQUFPLEdBQUcsRUFBRSxDQUFDO1FBSWIsV0FBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUV2Qix5QkFBb0IsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUM3RCxjQUFTLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDbEQsaUNBQTRCLEdBQzNDLElBQUksWUFBWSxFQUFFLENBQUM7UUFDWixxQkFBZ0IsR0FBWSxJQUFJLENBQUM7SUFtR1EsQ0FBQztJQTdGbkQsSUFDSSxlQUFlLENBQUMsS0FBSztRQUN2QixJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FB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RUFBRTtZQUNwQyxPQUFPLENBQ0wsQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztnQkFDL0QsYUFBYSxDQUNkLENBQUM7UUFDSixDQUFDLENBQUM7UUFHRixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQzNCLENBQUMsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUMzQixJQUFJLENBQUMsR0FBRyxDQUNOLFNBQVMsQ0FDUCxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxFQUN0RCxRQUFRLEVBQ1IsUUFBUSxDQUNULEVBQ0QsYUFBYSxDQUNkLEVBQ0QsYUFBYSxDQUNkLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7O21IQTNrQlUsc0JBQXNCO3VHQUF0QixzQkFBc0Isd1lDbkJuQywwYUFvQkE7MkZERGEsc0JBQXNCO2tCQUxsQyxTQUFTOytCQUNFLHFCQUFxQjtvR0FLUixRQUFRO3NCQUE5QixTQUFTO3VCQUFDLFVBQVU7Z0JBeUJKLG9CQUFvQjtzQkFBcEMsTUFBTTtnQkFDVSxTQUFTO3NCQUF6QixNQUFNO2dCQUNVLDRCQUE0QjtzQkFBNUMsTUFBTTtnQkFFRSxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBT0YsZUFBZTtzQkFEbEIsS0FBSzt1QkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBDb21tb25TZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IG1vbWVudCBmcm9tIFwibW9tZW50XCI7XG5kZWNsYXJlIHZhciBnb29nbGU6IGFueTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImFwcC1nYW1tYS1nZW8tY2hhcnRcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9nYW1tYS1nZW8tY2hhcnQuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbXCIuL2dhbW1hLWdlby1jaGFydC5jb21wb25lbnQuc2Nzc1wiXSxcbn0pXG5leHBvcnQgY2xhc3MgR2FtbWFHZW9DaGFydENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBWaWV3Q2hpbGQoXCJnb29nbE1hcFwiKSBnb29nbE1hcDogRWxlbWVudFJlZjtcbiAgY2hhckRhdGE6IGFueTtcbiAgY2hhcnRIZWlnaHQ6IGFueTtcbiAgYmFjZ3JvdW5kQ29sb3I6IGFueTtcbiAgbWFwQ29sb3JzOiBhbnk7XG4gIGNoYXJ0VHlwZTogYW55O1xuICB0b290VGlwQ29sdW1uOiBhbnk7XG4gIHJlZ2lvbjogYW55O1xuICByZWdpb25Db2RlOiBhbnk7XG4gIC8vIGhlYXQgTWFwIHN0YXJ0XG4gIG1hcDogYW55O1xuICBsb2NhdGlvbnM7XG4gIG1hcFRZcGU6IGFueTtcbiAgbWFwT3B0aW9uRm9ySGVhdE1hcDoge1xuICAgIHpvb206IG51bWJlcjtcbiAgfTtcbiAgY3VycmVudEluZm9XaW5kb3c6IGFueTtcbiAgLy8gaGVhdCBNYXAgZW5kXG4gIC8vaGVhdCBvbmx5IG1hcCBzdGFydCAvL1xuICBtYXJrZXJzID0gW107XG4gIGhlYXRtYXA6IGFueTtcbiAgaGVhdG1hcERhdGE6IGFueTtcbiAgem9vbVZhbHVGb3JBbGw6IG51bWJlcjtcbiAgYm91bmRzID0gbmV3IGdvb2dsZS5tYXBzLkxhdExuZ0JvdW5kcygpO1xuICAvL2hlYXQgb25seSBtYXAgZW5kIC8vXG4gIEBPdXRwdXQoKSBwdWJsaWMgZ2V0VGFibGVDb25maWdPdXRQdXQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcHVibGljIG9Sb3dDbGljazogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgb25yaWdodENsaWNrQ29udGV4dFNlbGVjdGlvbjogRXZlbnRFbWl0dGVyPGFueT4gPVxuICAgIG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQElucHV0KCkgcmlnaHRDbGlja0VuYWJsZTogYm9vbGVhbiA9IHRydWU7XG4gIGlzTG9hZGVyOiBib29sZWFuO1xuICBwYWdlX2NvbmZpZzogYW55O1xuICBwYWdlX3Bhcm1zOiBhbnk7XG4gIHNvcnRCeTogYW55O1xuICBmaWx0ZXJlZE9iamVjdHM6IGFueTtcbiAgQElucHV0KFwiY2hhcnREYXRhU291cmNlXCIpXG4gIHNldCBjaGFydERhdGFTb3VyY2UodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pc0xvYWRlciA9IHRydWU7XG4gICAgICB0aGlzLnBhZ2VfY29uZmlnID0gdmFsdWU7XG4gICAgICB0aGlzLnBhZ2VfcGFybXMgPSB2YWx1ZS50aXRsZVBhcmFtcztcbiAgICAgIHRoaXMuc29ydEJ5ID0gdmFsdWUua3BpQ29uZmlnPy5kYXRhQ29uZmlnPy5zb3J0Qnk7XG4gICAgICAvLyB0aGlzLmluUm9hbWVyR2VvQ2hhcnQubmF0aXZlRWxlbWVudC5pbm5lckhUTUwgPSAnJztcbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUua3BpQ29uZmlnLmRhdGFTb3VyY2UgJiZcbiAgICAgICAgdmFsdWUua3BpQ29uZmlnLmRhdGFTb3VyY2UubGVuZ3RoICE9PSAwXG4gICAgICApIHtcbiAgICAgICAgaWYgKHZhbHVlLmtwaUNvbmZpZy5mb3JtYXRlID09IFwibW9udGhseVwiKSB7XG4gICAgICAgICAgdGhpcy5tYXBUWXBlID0gdmFsdWUua3BpQ29uZmlnLmRhdGFDb25maWcubWFwVHlwZTtcbiAgICAgICAgICBpZiAodGhpcy5tYXBUWXBlID09IFwiZ2VvTWFwXCIpIHtcbiAgICAgICAgICAgIHRoaXMucmVnaW9uID0gdmFsdWUua3BpQ29uZmlnLmRhdGFDb25maWcucmVnaW9uO1xuICAgICAgICAgICAgdGhpcy5yZWdpb25Db2RlID0gdmFsdWUua3BpQ29uZmlnLmRhdGFDb25maWcucmVnaW9uQ29kZTtcbiAgICAgICAgICAgIHRoaXMudG9vdFRpcENvbHVtbiA9IHZhbHVlLmtwaUNvbmZpZy5kYXRhQ29uZmlnLmNoYXJ0X2NvbmZpZztcbiAgICAgICAgICAgIGxldCBkYXRhID0gdmFsdWUua3BpQ29uZmlnLmRhdGFTb3VyY2U7XG4gICAgICAgICAgICB0aGlzLmNoYXJ0SGVpZ2h0ID0gYCR7dmFsdWUua3BpQ29uZmlnLmRhdGFDb25maWcuc2l6ZX1weGA7XG4gICAgICAgICAgICB0aGlzLmNoYXJ0VHlwZSA9IHZhbHVlLmtwaUNvbmZpZy5kYXRhQ29uZmlnLmNoYXJ0VHlwZTtcbiAgICAgICAgICAgIHRoaXMuYmFjZ3JvdW5kQ29sb3IgPSB2YWx1ZS5rcGlDb25maWcuZGF0YUNvbmZpZy5iYWNrZ3JvdW5kQ29sb3I7XG4gICAgICAgICAgICB0aGlzLm1hcENvbG9ycyA9IHZhbHVlLmtwaUNvbmZpZy5kYXRhQ29uZmlnLmNvbG9ycztcbiAgICAgICAgICAgIC8vIGxldCBjb25maWcgPSB2YWx1ZS5jaGFydENvbmZpZztcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZERhdGEgPSBbXG4gICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICB2YWx1ZS5rcGlDb25maWcuZGF0YUNvbmZpZ1tcImFyZ3VtZW50RmllbGRcIl0sXG4gICAgICAgICAgICAgICAgdmFsdWUua3BpQ29uZmlnLmRhdGFDb25maWdbXCJjaGFydFZhbHVlRmllbGRcIl0sXG4gICAgICAgICAgICAgICAgeyB0eXBlOiBcInN0cmluZ1wiLCByb2xlOiBcInRvb2x0aXBcIiwgcDogeyBodG1sOiB0cnVlIH0gfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIF0uY29uY2F0KFxuICAgICAgICAgICAgICBkYXRhLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvb2x0aXAgPSB0aGlzLmdldFRvb2x0aXAoaXRlbSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgIGl0ZW1bdmFsdWUua3BpQ29uZmlnLmRhdGFDb25maWdbXCJhcmd1bWVudEZpZWxkXCJdXSxcbiAgICAgICAgICAgICAgICAgIGl0ZW1bdmFsdWUua3BpQ29uZmlnLmRhdGFDb25maWdbXCJjaGFydFZhbHVlRmllbGRcIl1dLFxuICAgICAgICAgICAgICAgICAgdG9vbHRpcCxcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuY2hhckRhdGEgPSBmb3JtYXR0ZWREYXRhO1xuICAgICAgICAgICAgLy8gdGhpcy5sb2FkR29vZ2xlQ2hhcnRzKCk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5pc0xvYWRlciA9IGZhbHNlO1xuICAgICAgICAgICAgICAvLyB0aGlzLmxvYWRHb29nbGVDaGFydHMoKTtcbiAgICAgICAgICAgIH0sIDIwMCk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm1hcFRZcGUgPT0gXCJidWJibGVNYXBcIikge1xuICAgICAgICAgICAgdGhpcy5sb2NhdGlvbnMgPSB2YWx1ZS5rcGlDb25maWcuZGF0YVNvdXJjZTtcbiAgICAgICAgICAgIHRoaXMuY2hhcnRIZWlnaHQgPSBgJHt2YWx1ZS5rcGlDb25maWcuZGF0YUNvbmZpZy5zaXplfXB4YDtcbiAgICAgICAgICAgIHRoaXMudG9vdFRpcENvbHVtbiA9IHZhbHVlLmtwaUNvbmZpZy5kYXRhQ29uZmlnLmNoYXJ0X2NvbmZpZztcbiAgICAgICAgICAgIHRoaXMubWFwT3B0aW9uRm9ySGVhdE1hcCA9IHtcbiAgICAgICAgICAgICAgem9vbTogdGhpcy56b29tVmFsdUZvckFsbCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubG9jYXRpb25zID0gdmFsdWUua3BpQ29uZmlnLmRhdGFTb3VyY2U7XG4gICAgICAgICAgICB0aGlzLnRvb3RUaXBDb2x1bW4gPSB2YWx1ZS5rcGlDb25maWcuZGF0YUNvbmZpZy5jaGFydF9jb25maWc7XG4gICAgICAgICAgICB0aGlzLmNoYXJ0SGVpZ2h0ID0gYCR7dmFsdWUua3BpQ29uZmlnLmRhdGFDb25maWcuc2l6ZX1weGA7XG4gICAgICAgICAgICB0aGlzLnpvb21WYWx1Rm9yQWxsID0gcGFyc2VGbG9hdChcbiAgICAgICAgICAgICAgdGhpcy5wYWdlX2NvbmZpZy5rcGlDb25maWcuZGF0YUNvbmZpZy56b29tXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5tYXBPcHRpb25Gb3JIZWF0TWFwID0ge1xuICAgICAgICAgICAgICB6b29tOiB0aGlzLnpvb21WYWx1Rm9yQWxsLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1lbHNlIFxuICAgICAgICAgICAgICAgIGlmKHZhbHVlLmtwaUNvbmZpZy5mb3JtYXRlID09IFwiZGFpbHlcIil7XG4gICAgICAgICAgICAgICAgICB0aGlzLm1hcFRZcGUgPSB2YWx1ZS5rcGlDb25maWcuZGF0YUNvbmZpZy5tYXBUeXBlO1xuICAgICAgICAgICAgICAgICAgY29uc3Qgc29ydGVkRGF0YSA9IHZhbHVlLmtwaUNvbmZpZy5kYXRhU291cmNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIocmVjb3JkID0+IHJlY29yZFt0aGlzLnNvcnRCeV0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBtb21lbnQoYlt0aGlzLnNvcnRCeV0pLmRpZmYobW9tZW50KGFbdGhpcy5zb3J0QnldKSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9zdFJlY2VudFJlY29yZCA9IHNvcnRlZERhdGFbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuZW5kRGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkT2JqZWN0cyA9IHNvcnRlZERhdGEuZmlsdGVyKGRhdGEgPT4gZGF0YVt0aGlzLnNvcnRCeV0gPT09IHZhbHVlLmVuZERhdGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJlZE9iamVjdHMgPSBzb3J0ZWREYXRhLmZpbHRlcihkYXRhID0+IGRhdGFbdGhpcy5zb3J0QnldID09PSBtb3N0UmVjZW50UmVjb3JkW3RoaXMuc29ydEJ5XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5tYXBUWXBlID09IFwiYnViYmxlTWFwXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2F0aW9ucyA9IHRoaXMuZmlsdGVyZWRPYmplY3RzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhcnRIZWlnaHQgPSBgJHt2YWx1ZS5rcGlDb25maWcuZGF0YUNvbmZpZy5zaXplfXB4YDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvb3RUaXBDb2x1bW4gPSB2YWx1ZS5rcGlDb25maWcuZGF0YUNvbmZpZy5jaGFydF9jb25maWc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXBPcHRpb25Gb3JIZWF0TWFwID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogdGhpcy56b29tVmFsdUZvckFsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IocHVibGljIGNvbW1vblNlcnZpY2U6IENvbW1vblNlcnZpY2UpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7fVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tYXBUWXBlID09IFwiZ2VvTWFwXCIpIHtcbiAgICAgIHRoaXMubG9hZEdvb2dsZUNoYXJ0cygpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5tYXBUWXBlID09IFwiaGVhdE1hcFwiKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMucGFnZV9jb25maWcua3BpQ29uZmlnLmRhdGFDb25maWcuaGVhdE1hcENhdGVnb3J5ID09IFwiaGVhdE1hcE9ubHlcIlxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuaXNMb2FkZXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5sb2FkR29vZ2xlSGVhdE9ubHlNYXBzKHRoaXMubG9jYXRpb25zKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHRoaXMucGFnZV9jb25maWcua3BpQ29uZmlnLmRhdGFDb25maWcuaGVhdE1hcENhdGVnb3J5ID09IFwiaGVhdE1hcE1hcmtlclwiXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5pc0xvYWRlciA9IGZhbHNlO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVNYXAoKTtcbiAgICAgICAgdGhpcy5hZGRNYXJrZXJzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmlzTG9hZGVyID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZUhlYXRXaXRoTWFya2VyTWFwKHRoaXMubG9jYXRpb25zKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pc0xvYWRlciA9IGZhbHNlO1xuICAgICAgdGhpcy5pbml0aWFsaXplTWFwKCk7XG4gICAgICB0aGlzLmFkZEJ1YmJsZU1hcmtlcnMoKTtcbiAgICB9XG4gIH1cblxuICBsb2FkR29vZ2xlQ2hhcnRzKCkge1xuICAgIGdvb2dsZS5jaGFydHMubG9hZChcImN1cnJlbnRcIiwge1xuICAgICAgcGFja2FnZXM6IFt0aGlzLmNoYXJ0VHlwZV0sXG4gICAgfSk7XG4gICAgZ29vZ2xlLmNoYXJ0cy5zZXRPbkxvYWRDYWxsYmFjayh0aGlzLmRyYXdDaGFydC5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIGRyYXdDaGFydCgpIHtcbiAgICBjb25zdCBkYXRhID0gZ29vZ2xlLnZpc3VhbGl6YXRpb24uYXJyYXlUb0RhdGFUYWJsZSh0aGlzLmNoYXJEYXRhKTtcblxuICAgIC8vIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgLy8gICByZWdpb246ICdVU0EnLFxuICAgIC8vICAgZGlzcGxheU1vZGU6ICdtYXJrZXJzJyxcbiAgICAvLyAgIGJhY2tncm91bmRDb2xvcjogdGhpcy5iYWNncm91bmRDb2xvcixcbiAgICAvLyAgIHRvb2x0aXA6IHsgaXNIdG1sOiB0cnVlIH0sXG4gICAgLy8gICBjb2xvckF4aXM6IHsgY29sb3JzOiB0aGlzLm1hcENvbG9ycyB9XG4gICAgLy8gfTtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5nZXRPcHRpb25Db25maWcoKTtcblxuICAgIGNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkdlb0NoYXJ0KFxuICAgICAgdGhpcy5nb29nbE1hcC5uYXRpdmVFbGVtZW50XG4gICAgKTtcbiAgICB0aGlzLmdvb2dsTWFwLm5hdGl2ZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gdGhpcy5jaGFydEhlaWdodDtcbiAgICBjaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpO1xuICB9XG5cbiAgZ2V0VG9vbHRpcChkYXRhKSB7XG4gICAgbGV0IHRvb2xUaXBEYXRhID0gXCJcIjtcbiAgICB0aGlzLnRvb3RUaXBDb2x1bW4uZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBkYXRhW2VsZW1lbnQuZGF0YUZpZWxkXSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICB0b29sVGlwRGF0YSArPVxuICAgICAgICAgIFwiPGRpdiBjbGFzcz0naW5saW5lJz48Yj5cIiArXG4gICAgICAgICAgZWxlbWVudC5jYXB0aW9uICtcbiAgICAgICAgICBcIjo8L2I+PC9kaXY+IFwiICtcbiAgICAgICAgICB0aGlzLmNvbW1vblNlcnZpY2Uucm91bmRPZmZUaWxsVHdvKGRhdGFbZWxlbWVudC5kYXRhRmllbGRdLCAyKSArXG4gICAgICAgICAgXCI8YnIgLz5cIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRvb2xUaXBEYXRhICs9XG4gICAgICAgICAgXCI8ZGl2IGNsYXNzPSdpbmxpbmUnPjxiPlwiICtcbiAgICAgICAgICBlbGVtZW50LmNhcHRpb24gK1xuICAgICAgICAgIFwiOjwvYj48L2Rpdj4gXCIgK1xuICAgICAgICAgIGRhdGFbZWxlbWVudC5kYXRhRmllbGRdICtcbiAgICAgICAgICBcIjxiciAvPlwiO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB0b29sVGlwRGF0YTtcbiAgfVxuXG4gIGdldE9wdGlvbkNvbmZpZygpIHtcbiAgICBpZiAodGhpcy5yZWdpb24gPT0gXCJjaXR5XCIpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIHJlZ2lvbjogdGhpcy5yZWdpb25Db2RlLFxuICAgICAgICBkaXNwbGF5TW9kZTogXCJtYXJrZXJzXCIsXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhpcy5iYWNncm91bmRDb2xvcixcbiAgICAgICAgdG9vbHRpcDogeyBpc0h0bWw6IHRydWUgfSxcbiAgICAgICAgY29sb3JBeGlzOiB7IGNvbG9yczogdGhpcy5tYXBDb2xvcnMgfSxcbiAgICAgIH07XG4gICAgICByZXR1cm4gb3B0aW9ucztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGlzLmJhY2dyb3VuZENvbG9yLFxuICAgICAgICB0b29sdGlwOiB7IGlzSHRtbDogdHJ1ZSB9LFxuICAgICAgICBjb2xvckF4aXM6IHsgY29sb3JzOiB0aGlzLm1hcENvbG9ycyB9LFxuICAgICAgfTtcbiAgICAgIHJldHVybiBvcHRpb25zO1xuICAgIH1cbiAgfVxuXG4gIC8vICBHZW8gTWFwIGVuZCAvL1xuXG4gIC8vIEhlYXQgTWFwIHN0YXJ0IC8vXG4gIGluaXRpYWxpemVNYXAoKTogdm9pZCB7XG4gICAgY29uc3QgbWFwT3B0aW9ucyA9IHRoaXMubWFwT3B0aW9uRm9ySGVhdE1hcDtcbiAgICAvLyB7XG4gICAgLy8gICBjZW50ZXI6IHsgbGF0OiAzNy4wOTAyLCBsbmc6IC05NS43MTI5IH0sIC8vIENlbnRlciBvZiB0aGUgVVNBXG4gICAgLy8gICB6b29tOiA1LFxuICAgIC8vIH07XG5cbiAgICBpZiAodGhpcy5tYXBUWXBlID09IFwiYnViYmxlTWFwXCIpIHtcbiAgICAgIG1hcE9wdGlvbnNbXCJzdHlsZXNcIl0gPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBmZWF0dXJlVHlwZTogXCJhbGxcIixcbiAgICAgICAgICBzdHlsZXJzOiBbXG4gICAgICAgICAgICB7IHNhdHVyYXRpb246IC0xMDAgfSxcbiAgICAgICAgICAgIHsgbGlnaHRuZXNzOiA3MCB9LFxuICAgICAgICAgICAgeyB2aXNpYmlsaXR5OiBcInNpbXBsaWZpZWRcIiB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBmZWF0dXJlVHlwZTogXCJhZG1pbmlzdHJhdGl2ZS5jb3VudHJ5XCIsXG4gICAgICAgICAgZWxlbWVudFR5cGU6IFwibGFiZWxzXCIsXG4gICAgICAgICAgc3R5bGVyczogW1xuICAgICAgICAgICAgeyBsaWdodG5lc3M6IC0zMCB9LCAvLyBEYXJrZW4gbGFiZWxzIGZ1cnRoZXJcbiAgICAgICAgICAgIHsgdmlzaWJpbGl0eTogXCJvblwiIH0sXG4gICAgICAgICAgICB7IGZvbnRXZWlnaHQ6IFwiYm9sZFwiIH0sIC8vIE1ha2UgbGFiZWxzIGJvbGRcbiAgICAgICAgICAgIHsgZm9udFNpemU6IFwiMTJweFwiIH0sIC8vIEluY3JlYXNlIGZvbnQgc2l6ZVxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBmZWF0dXJlVHlwZTogXCJhZG1pbmlzdHJhdGl2ZS5jb3VudHJ5XCIsXG4gICAgICAgICAgZWxlbWVudFR5cGU6IFwiZ2VvbWV0cnkuc3Ryb2tlXCIsXG4gICAgICAgICAgc3R5bGVyczogW1xuICAgICAgICAgICAgeyBsaWdodG5lc3M6IC00MCB9LCAvLyBEYXJrZW4gYm9yZGVycyBzaWduaWZpY2FudGx5XG4gICAgICAgICAgICB7IHdlaWdodDogMS41IH0sIC8vIEluY3JlYXNlIGJvcmRlciB0aGlja25lc3NcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZmVhdHVyZVR5cGU6IFwiYWRtaW5pc3RyYXRpdmUuY291bnRyeVwiLFxuICAgICAgICAgIGVsZW1lbnRUeXBlOiBcImdlb21ldHJ5LmZpbGxcIixcbiAgICAgICAgICBzdHlsZXJzOiBbXG4gICAgICAgICAgICB7IGxpZ2h0bmVzczogOTAgfSwgLy8gS2VlcCBmaWxsIHZlcnkgbGlnaHRcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICB9XG5cbiAgICB0aGlzLm1hcCA9IG5ldyBnb29nbGUubWFwcy5NYXAoXG4gICAgICAvLyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJlZ2lvbnNfZGl2XCIpICxcbiAgICAgIHRoaXMuZ29vZ2xNYXAubmF0aXZlRWxlbWVudCxcbiAgICAgIG1hcE9wdGlvbnNcbiAgICApO1xuICAgIHRoaXMuZ29vZ2xNYXAubmF0aXZlRWxlbWVudC5zdHlsZS5oZWlnaHQgPSB0aGlzLmNoYXJ0SGVpZ2h0O1xuICB9XG5cbiAgLy8gQWRkIG1hcmtlcnMgdG8gdGhlIG1hcFxuICBhZGRNYXJrZXJzKCk6IHZvaWQge1xuICAgIHRoaXMubG9jYXRpb25zLmZvckVhY2goKGxvY2F0aW9uKSA9PiB7XG4gICAgICBjb25zdCBtYXJrZXIgPSBuZXcgZ29vZ2xlLm1hcHMuTWFya2VyKHtcbiAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICBsYXQ6IHBhcnNlRmxvYXQoXG4gICAgICAgICAgICBsb2NhdGlvblt0aGlzLnBhZ2VfY29uZmlnLmtwaUNvbmZpZy5kYXRhQ29uZmlnLm1hcmtlckxhdGl0dWRlXVxuICAgICAgICAgICksXG4gICAgICAgICAgbG5nOiBwYXJzZUZsb2F0KFxuICAgICAgICAgICAgbG9jYXRpb25bdGhpcy5wYWdlX2NvbmZpZy5rcGlDb25maWcuZGF0YUNvbmZpZy5tYXJrZXJMb25naXR1ZGVdXG4gICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgICAgaWNvbjogdGhpcy5wYWdlX2NvbmZpZy5rcGlDb25maWcuZGF0YUNvbmZpZy5pY29uXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIHVybDogdGhpcy5wYWdlX2NvbmZpZy5rcGlDb25maWcuZGF0YUNvbmZpZy5pY29uLCAvLyBSZXBsYWNlIHdpdGggeW91ciBpY29uIHBhdGhcbiAgICAgICAgICAgICAgc2NhbGVkU2l6ZToge1xuICAgICAgICAgICAgICAgIHdpZHRoOiAzMixcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDMyLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogXCJcIixcbiAgICAgICAgLy8gdG9vbHRpcFRleHQ6XG4gICAgICAgIG1hcDogdGhpcy5tYXAsXG4gICAgICAgIC8vIHRpdGxlOiBgJHtsb2NhdGlvbi5jaXR5fTogJCR7bG9jYXRpb24udG90YWxfc2FsZXNfYW1vdW50fWAsXG4gICAgICAgIHRpdGxlOiBgJHtsb2NhdGlvbi5jaXR5fTogJCR7bG9jYXRpb24udG90YWxfc2FsZXNfYW1vdW50fWAsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuYm91bmRzLmV4dGVuZChtYXJrZXIuZ2V0UG9zaXRpb24oKSk7XG4gICAgICB0aGlzLm1hcmtlcnMucHVzaChtYXJrZXIpO1xuXG4gICAgICAvLyBBZGQgYW4gaW5mbyB3aW5kb3dcbiAgICAgIGxldCBzdHJpbmdXaXRob3V0UXVvdGVzID0gdGhpcy5nZXRJbmZvV2luZG9EYXRhKGxvY2F0aW9uKTtcbiAgICAgIGNvbnN0IGluZm9XSW5kb3dEYXRhID0gdGhpcy5nZXRJbmZvV2luZG9EYXRhKGxvY2F0aW9uKTtcblxuICAgICAgY29uc3QgaW5mb1dpbmRvdyA9IG5ldyBnb29nbGUubWFwcy5JbmZvV2luZG93KHtcbiAgICAgICAgLy8gY29udGVudDogaW5mb1dJbmRvd0RhdGEsXG4gICAgICAgIGNvbnRlbnQ6IGA8ZGl2IHN0eWxlPVwiaGVpZ2h0OiAxMDAlOyB3aWR0aDogMTAwJTsgY29sb3I6IGJsYWNrOyBmb250LXNpemU6IDIwcHg7XCI+XG4gICAgICAgICR7aW5mb1dJbmRvd0RhdGF9XG4gICAgICA8L2Rpdj5gLFxuICAgICAgfSk7XG4gICAgICAvLyB7XG4gICAgICAvLyAgIGNvbnRlbnQ6IGA8ZGl2IHN0eWxlPVwiICBoZWlnaHQ6IDEwMCU7IHdpZHRoOiAxMDAlO2NvbG9yOiBibGFjazsgZm9udC1zaXplOiAyMHB4O1wiPjxoND4ke1xuICAgICAgLy8gICAgIGxvY2F0aW9uLmNpdHlcbiAgICAgIC8vICAgfTwvaDQ+PHA+VG90YWwgU2FsZXM6ICQke2xvY2F0aW9uLnRvdGFsX3NhbGVzX2Ftb3VudC50b0ZpeGVkKFxuICAgICAgLy8gICAgIDJcbiAgICAgIC8vICAgKX08L3A+PC9kaXY+YCxcbiAgICAgIC8vIH1cblxuICAgICAgbWFya2VyLmFkZExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50SW5mb1dpbmRvdykge1xuICAgICAgICAgIHRoaXMuY3VycmVudEluZm9XaW5kb3cuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBpbmZvV2luZG93Lm9wZW4odGhpcy5tYXAsIG1hcmtlcik7XG4gICAgICAgIHRoaXMuY3VycmVudEluZm9XaW5kb3cgPSBpbmZvV2luZG93O1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5tYXAuZml0Qm91bmRzKHRoaXMuYm91bmRzKTtcbiAgfVxuXG4gIGdldEluZm9XaW5kb0RhdGEoZGF0YSkge1xuICAgIGxldCB0b29sVGlwRGF0YSA9IGBgO1xuICAgIHRoaXMudG9vdFRpcENvbHVtbi5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGRhdGFbZWxlbWVudC5kYXRhRmllbGRdID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHRvb2xUaXBEYXRhICs9XG4gICAgICAgICAgYDxkaXYgY2xhc3M9J2lubGluZSc+PGI+YCArXG4gICAgICAgICAgZWxlbWVudC5jYXB0aW9uICtcbiAgICAgICAgICBgOjwvYj48L2Rpdj4gYCArXG4gICAgICAgICAgdGhpcy5jb21tb25TZXJ2aWNlLnJvdW5kT2ZmVGlsbFR3byhkYXRhW2VsZW1lbnQuZGF0YUZpZWxkXSwgMikgK1xuICAgICAgICAgIGA8YnIgLz5gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdG9vbFRpcERhdGEgKz1cbiAgICAgICAgICBgPGRpdiBjbGFzcz0naW5saW5lJz48Yj5gICtcbiAgICAgICAgICBlbGVtZW50LmNhcHRpb24gK1xuICAgICAgICAgIGA6PC9iPjwvZGl2PiBgICtcbiAgICAgICAgICBkYXRhW2VsZW1lbnQuZGF0YUZpZWxkXSArXG4gICAgICAgICAgYDxiciAvPmA7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRvb2xUaXBEYXRhO1xuICB9XG4gIC8vIEhlYXQgTWFwIEVuZCAvL1xuXG4gIC8vaGVhdCBvbmx5IG1hcCBzdGFydCAvL1xuXG4gIGxvYWRHb29nbGVIZWF0T25seU1hcHMoZGF0YSk6IHZvaWQge1xuICAgIHRoaXMuaGVhdG1hcERhdGEgPSBbXTtcbiAgICBkYXRhLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIGxldCBsYXRpdHVkZSA9IHBhcnNlRmxvYXQoXG4gICAgICAgIGVsZW1lbnRbdGhpcy5wYWdlX2NvbmZpZy5rcGlDb25maWcuZGF0YUNvbmZpZy5tYXJrZXJMYXRpdHVkZV1cbiAgICAgICk7XG4gICAgICBsZXQgbG9ndGl0dWRlID0gcGFyc2VGbG9hdChcbiAgICAgICAgZWxlbWVudFt0aGlzLnBhZ2VfY29uZmlnLmtwaUNvbmZpZy5kYXRhQ29uZmlnLm1hcmtlckxvbmdpdHVkZV1cbiAgICAgICk7XG4gICAgICAvLyBsZXQgd2VpZ2h0ID0gKGNlbGxOb2RlLnByb3BlcnRpZXNbJ1dlaWdodCddICE9IHVuZGVmaW5lZCkgPyBjZWxsTm9kZS5wcm9wZXJ0aWVzWydXZWlnaHQnXSA6IFwiTkFcIjtcbiAgICAgIHRoaXMuaGVhdG1hcERhdGEucHVzaCh7XG4gICAgICAgIGxvY2F0aW9uOiBuZXcgZ29vZ2xlLm1hcHMuTGF0TG5nKGxhdGl0dWRlLCBsb2d0aXR1ZGUpLFxuICAgICAgICAvLyB3ZWlnaHQ6IHBhcnNlRmxvYXQod2VpZ2h0KSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5ib3VuZHMuZXh0ZW5kKG5ldyBnb29nbGUubWFwcy5MYXRMbmcobGF0aXR1ZGUsIGxvZ3RpdHVkZSkpO1xuICAgIH0pO1xuICAgIGNvbnN0IG1hcE9wdGlvbnMgPSB7XG4gICAgICAvLyBjZW50ZXI6IHtcbiAgICAgIC8vICAgbGF0OiBwYXJzZUZsb2F0KHRoaXMucGFnZV9jb25maWcua3BpQ29uZmlnLmRhdGFDb25maWcuY2VudGVyTGF0aXR1ZGUpLFxuICAgICAgLy8gICBsbmc6IHBhcnNlRmxvYXQodGhpcy5wYWdlX2NvbmZpZy5rcGlDb25maWcuZGF0YUNvbmZpZy5jZW50ZXJMb25naXR1ZGUpLFxuICAgICAgLy8gfSxcbiAgICAgIC8vIHpvb206IHBhcnNlRmxvYXQodGhpcy5wYWdlX2NvbmZpZy5rcGlDb25maWcuZGF0YUNvbmZpZy56b29tKVxuICAgICAgem9vbTogdGhpcy56b29tVmFsdUZvckFsbCxcbiAgICB9O1xuXG4gICAgdGhpcy5tYXAgPSBuZXcgZ29vZ2xlLm1hcHMuTWFwKHRoaXMuZ29vZ2xNYXAubmF0aXZlRWxlbWVudCwgbWFwT3B0aW9ucyk7XG4gICAgdGhpcy5nb29nbE1hcC5uYXRpdmVFbGVtZW50LnN0eWxlLmhlaWdodCA9IHRoaXMuY2hhcnRIZWlnaHQ7XG4gICAgdGhpcy5tYXAuZml0Qm91bmRzKHRoaXMuYm91bmRzKTtcbiAgICB0aGlzLmhlYXRtYXAgPSBuZXcgZ29vZ2xlLm1hcHMudmlzdWFsaXphdGlvbi5IZWF0bWFwTGF5ZXIoe1xuICAgICAgZGF0YTogdGhpcy5oZWF0bWFwRGF0YSxcbiAgICAgIG1hcDogdGhpcy5tYXAsXG4gICAgfSk7XG4gIH1cblxuICAvL2hlYXQgb25seSBtYXAgZW5kIC8vXG5cbiAgLy9oZWF0IGFuZCBNYXJrZXIgIG1hcCBTdGFydCAvL1xuICBpbml0aWFsaXplSGVhdFdpdGhNYXJrZXJNYXAoZGF0YSkge1xuICAgIC8vIEluaXRpYWxpemUgbWFwXG4gICAgdGhpcy5tYXAgPSBuZXcgZ29vZ2xlLm1hcHMuTWFwKHRoaXMuZ29vZ2xNYXAubmF0aXZlRWxlbWVudCwge1xuICAgICAgLy8gY2VudGVyOiB7IGxhdDogMzcuNzc0OSwgbG5nOiAtMTIyLjQxOTQgfSxcbiAgICAgIHpvb206IHBhcnNlRmxvYXQodGhpcy5wYWdlX2NvbmZpZy5rcGlDb25maWcuZGF0YUNvbmZpZy56b29tKSxcbiAgICB9KTtcbiAgICB0aGlzLmdvb2dsTWFwLm5hdGl2ZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gdGhpcy5jaGFydEhlaWdodDtcbiAgICAvLyBJbml0aWFsaXplIGhlYXRtYXAgbGF5ZXJcbiAgICB0aGlzLmhlYXRtYXBEYXRhID0gW107XG4gICAgZGF0YS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBsZXQgbGF0aXR1ZGUgPSBwYXJzZUZsb2F0KFxuICAgICAgICBlbGVtZW50W3RoaXMucGFnZV9jb25maWcua3BpQ29uZmlnLmRhdGFDb25maWcubWFya2VyTGF0aXR1ZGVdXG4gICAgICApO1xuICAgICAgbGV0IGxvZ3RpdHVkZSA9IHBhcnNlRmxvYXQoXG4gICAgICAgIGVsZW1lbnRbdGhpcy5wYWdlX2NvbmZpZy5rcGlDb25maWcuZGF0YUNvbmZpZy5tYXJrZXJMb25naXR1ZGVdXG4gICAgICApO1xuICAgICAgdGhpcy5oZWF0bWFwRGF0YS5wdXNoKHtcbiAgICAgICAgbG9jYXRpb246IG5ldyBnb29nbGUubWFwcy5MYXRMbmcobGF0aXR1ZGUsIGxvZ3RpdHVkZSksXG4gICAgICB9KTtcbiAgICAgIHRoaXMuYm91bmRzLmV4dGVuZChuZXcgZ29vZ2xlLm1hcHMuTGF0TG5nKGxhdGl0dWRlLCBsb2d0aXR1ZGUpKTtcbiAgICB9KTtcbiAgICB0aGlzLmhlYXRtYXAgPSBuZXcgZ29vZ2xlLm1hcHMudmlzdWFsaXphdGlvbi5IZWF0bWFwTGF5ZXIoe1xuICAgICAgZGF0YTogdGhpcy5oZWF0bWFwRGF0YSxcbiAgICAgIG1hcDogdGhpcy5tYXAsXG4gICAgfSk7XG4gICAgLy8gSW5pdGlhbGl6ZSBtYXJrZXJzXG4gICAgdGhpcy5sb2NhdGlvbnMuZm9yRWFjaCgobG9jYXRpb24pID0+IHtcbiAgICAgIGNvbnN0IG1hcmtlciA9IG5ldyBnb29nbGUubWFwcy5NYXJrZXIoe1xuICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgIGxhdDogcGFyc2VGbG9hdChcbiAgICAgICAgICAgIGxvY2F0aW9uW3RoaXMucGFnZV9jb25maWcua3BpQ29uZmlnLmRhdGFDb25maWcubWFya2VyTGF0aXR1ZGVdXG4gICAgICAgICAgKSxcbiAgICAgICAgICBsbmc6IHBhcnNlRmxvYXQoXG4gICAgICAgICAgICBsb2NhdGlvblt0aGlzLnBhZ2VfY29uZmlnLmtwaUNvbmZpZy5kYXRhQ29uZmlnLm1hcmtlckxvbmdpdHVkZV1cbiAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgICBpY29uOiB0aGlzLnBhZ2VfY29uZmlnLmtwaUNvbmZpZy5kYXRhQ29uZmlnLmljb25cbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgdXJsOiB0aGlzLnBhZ2VfY29uZmlnLmtwaUNvbmZpZy5kYXRhQ29uZmlnLmljb24sIC8vIFJlcGxhY2Ugd2l0aCB5b3VyIGljb24gcGF0aFxuICAgICAgICAgICAgICBzY2FsZWRTaXplOiB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IDMyLFxuICAgICAgICAgICAgICAgIGhlaWdodDogMzIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiBcIlwiLFxuICAgICAgICAvLyB0b29sdGlwVGV4dDpcbiAgICAgICAgbWFwOiB0aGlzLm1hcCxcbiAgICAgICAgLy8gdGl0bGU6IGAke2xvY2F0aW9uLmNpdHl9OiAkJHtsb2NhdGlvbi50b3RhbF9zYWxlc19hbW91bnR9YCxcbiAgICAgICAgdGl0bGU6IGAke2xvY2F0aW9uLmNpdHl9OiAkJHtsb2NhdGlvbi50b3RhbF9zYWxlc19hbW91bnR9YCxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5ib3VuZHMuZXh0ZW5kKG1hcmtlci5nZXRQb3NpdGlvbigpKTtcbiAgICAgIHRoaXMubWFya2Vycy5wdXNoKG1hcmtlcik7XG5cbiAgICAgIC8vIEFkZCBhbiBpbmZvIHdpbmRvd1xuXG4gICAgICAvLyBBZGQgYW4gaW5mbyB3aW5kb3dcbiAgICAgIGNvbnN0IGluZm9XSW5kb3dEYXRhID0gdGhpcy5nZXRJbmZvV2luZG9EYXRhKGxvY2F0aW9uKTtcbiAgICAgIGNvbnN0IGluZm9XaW5kb3cgPSBuZXcgZ29vZ2xlLm1hcHMuSW5mb1dpbmRvdyh7XG4gICAgICAgIGNvbnRlbnQ6IGA8ZGl2IHN0eWxlPVwiaGVpZ2h0OiAxMDAlOyB3aWR0aDogMTAwJTsgY29sb3I6IGJsYWNrOyBmb250LXNpemU6IDIwcHg7XCI+XG4gICAgICAgICAgICAke2luZm9XSW5kb3dEYXRhfVxuICAgICAgICAgIDwvZGl2PmAsXG4gICAgICB9KTtcblxuICAgICAgbWFya2VyLmFkZExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50SW5mb1dpbmRvdykge1xuICAgICAgICAgIHRoaXMuY3VycmVudEluZm9XaW5kb3cuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBpbmZvV2luZG93Lm9wZW4odGhpcy5tYXAsIG1hcmtlcik7XG4gICAgICAgIHRoaXMuY3VycmVudEluZm9XaW5kb3cgPSBpbmZvV2luZG93O1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5tYXAuZml0Qm91bmRzKHRoaXMuYm91bmRzKTtcblxuICAgIC8vIEFkZCBsaXN0ZW5lciBmb3Igem9vbSBjaGFuZ2VzXG4gICAgdGhpcy5tYXAuYWRkTGlzdGVuZXIoXCJ6b29tX2NoYW5nZWRcIiwgKCkgPT4gdGhpcy5oYW5kbGVab29tQ2hhbmdlKCkpO1xuICB9XG5cbiAgaGFuZGxlWm9vbUNoYW5nZSgpIHtcbiAgICBjb25zdCB6b29tTGV2ZWwgPSB0aGlzLm1hcC5nZXRab29tKCk7XG4gICAgaWYgKHpvb21MZXZlbCA8IDUpIHtcbiAgICAgIC8vIFNob3cgaGVhdG1hcCBhbmQgaGlkZSBtYXJrZXJzXG4gICAgICB0aGlzLmhlYXRtYXAuc2V0TWFwKHRoaXMubWFwKTtcbiAgICAgIHRoaXMubWFya2Vycy5mb3JFYWNoKChtYXJrZXIpID0+IG1hcmtlci5zZXRNYXAobnVsbCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBIaWRlIGhlYXRtYXAgYW5kIHNob3cgbWFya2Vyc1xuICAgICAgdGhpcy5oZWF0bWFwLnNldE1hcChudWxsKTtcbiAgICAgIHRoaXMubWFya2Vycy5mb3JFYWNoKChtYXJrZXIpID0+IG1hcmtlci5zZXRNYXAodGhpcy5tYXApKTtcbiAgICB9XG4gIH1cblxuICAvL2hlYXQgYW5kIE1hcmtlciAgbWFwIEVuZCAvL1xuICAvL0J1YmJsZSBDaGFydCBTdGFydFxuICBhZGRCdWJibGVNYXJrZXJzKCk6IHZvaWQge1xuICAgIHRoaXMucHJlcGFyZUJ1YmJsZURhdGEoKTtcbiAgICB0aGlzLmxvY2F0aW9ucy5mb3JFYWNoKChsb2NhdGlvbikgPT4ge1xuICAgICAgY29uc3QgbWFya2VyID0gbmV3IGdvb2dsZS5tYXBzLk1hcmtlcih7XG4gICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgbGF0OiBwYXJzZUZsb2F0KFxuICAgICAgICAgICAgbG9jYXRpb25bdGhpcy5wYWdlX2NvbmZpZy5rcGlDb25maWcuZGF0YUNvbmZpZy5tYXJrZXJMYXRpdHVkZV1cbiAgICAgICAgICApLFxuICAgICAgICAgIGxuZzogcGFyc2VGbG9hdChcbiAgICAgICAgICAgIGxvY2F0aW9uW3RoaXMucGFnZV9jb25maWcua3BpQ29uZmlnLmRhdGFDb25maWcubWFya2VyTG9uZ2l0dWRlXVxuICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIGljb246IHtcbiAgICAgICAgICBwYXRoOiBnb29nbGUubWFwcy5TeW1ib2xQYXRoLkNJUkNMRSxcbiAgICAgICAgICBzY2FsZTogTWF0aC5yb3VuZChsb2NhdGlvbi5zYWxlc19wZXJjZW50YWdlKSwgLy8gQWRqdXN0IGJ1YmJsZSBzaXplXG4gICAgICAgICAgZmlsbENvbG9yOiB0aGlzLnBhZ2VfY29uZmlnLmtwaUNvbmZpZy5kYXRhQ29uZmlnLmJ1YmJsZUNvbG9yLFxuICAgICAgICAgIGZpbGxPcGFjaXR5OiAwLjYsXG4gICAgICAgICAgc3Ryb2tlV2VpZ2h0OiAwLFxuICAgICAgICB9LFxuICAgICAgICAvLyB0b29sdGlwVGV4dDpcbiAgICAgICAgbWFwOiB0aGlzLm1hcCxcbiAgICAgICAgLy8gdGl0bGU6IGAke2xvY2F0aW9uLmNpdHl9OiAkJHtsb2NhdGlvbi50b3RhbF9zYWxlc19hbW91bnR9YCxcbiAgICAgICAgdGl0bGU6IGAke2xvY2F0aW9uLmNpdHl9OiAkJHtcbiAgICAgICAgICBsb2NhdGlvblt0aGlzLnBhZ2VfY29uZmlnLmtwaUNvbmZpZy5kYXRhQ29uZmlnLmFncnVtZW50VmFsdWVdXG4gICAgICAgIH1gLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmJvdW5kcy5leHRlbmQobWFya2VyLmdldFBvc2l0aW9uKCkpO1xuICAgICAgdGhpcy5tYXJrZXJzLnB1c2gobWFya2VyKTtcblxuICAgICAgLy8gQWRkIGFuIGluZm8gd2luZG93XG4gICAgICBsZXQgc3RyaW5nV2l0aG91dFF1b3RlcyA9IHRoaXMuZ2V0SW5mb1dpbmRvRGF0YShsb2NhdGlvbik7XG4gICAgICBjb25zdCBpbmZvV0luZG93RGF0YSA9IHRoaXMuZ2V0SW5mb1dpbmRvRGF0YShsb2NhdGlvbik7XG5cbiAgICAgIGNvbnN0IGluZm9XaW5kb3cgPSBuZXcgZ29vZ2xlLm1hcHMuSW5mb1dpbmRvdyh7XG4gICAgICAgIC8vIGNvbnRlbnQ6IGluZm9XSW5kb3dEYXRhLFxuICAgICAgICBjb250ZW50OiBgPGRpdiBzdHlsZT1cImhlaWdodDogMTAwJTsgd2lkdGg6IDEwMCU7IGNvbG9yOiBibGFjazsgZm9udC1zaXplOiAyMHB4O1wiPlxuICAgICAgICAgJHtpbmZvV0luZG93RGF0YX1cbiAgICAgICA8L2Rpdj5gLFxuICAgICAgfSk7XG5cbiAgICAgIG1hcmtlci5hZGRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEluZm9XaW5kb3cpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRJbmZvV2luZG93LmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaW5mb1dpbmRvdy5vcGVuKHRoaXMubWFwLCBtYXJrZXIpO1xuICAgICAgICB0aGlzLmN1cnJlbnRJbmZvV2luZG93ID0gaW5mb1dpbmRvdztcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHRoaXMubWFwLmZpdEJvdW5kcyh0aGlzLmJvdW5kcyk7XG4gIH1cblxuICBwcmVwYXJlQnViYmxlRGF0YSgpIHtcbiAgICAvLyBTdGVwIDE6IEZpbmQgbWluIGFuZCBtYXggdG90YWxfc2FsZXNfYW1vdW50XG4gICAgY29uc3QgbWluU2FsZXMgPSBNYXRoLm1pbihcbiAgICAgIC4uLnRoaXMubG9jYXRpb25zLm1hcChcbiAgICAgICAgKGQpID0+IGRbdGhpcy5wYWdlX2NvbmZpZy5rcGlDb25maWcuZGF0YUNvbmZpZy5hZ3J1bWVudFZhbHVlXVxuICAgICAgKVxuICAgICk7XG4gICAgY29uc3QgbWF4U2FsZXMgPSBNYXRoLm1heChcbiAgICAgIC4uLnRoaXMubG9jYXRpb25zLm1hcChcbiAgICAgICAgKGQpID0+IGRbdGhpcy5wYWdlX2NvbmZpZy5rcGlDb25maWcuZGF0YUNvbmZpZy5hZ3J1bWVudFZhbHVlXVxuICAgICAgKVxuICAgICk7XG5cbiAgICAvLyBTdGVwIDI6IERlZmluZSBtaW4gYW5kIG1heCBwZXJjZW50YWdlIHZhbHVlc1xuICAgIGNvbnN0IG1pblBlcmNlbnRhZ2UgPVxuICAgICAgdGhpcy5wYWdlX2NvbmZpZy5rcGlDb25maWcuZGF0YUNvbmZpZy5idWJibGVNaW5pbXVtU2l6ZTtcbiAgICBjb25zdCBtYXhQZXJjZW50YWdlID1cbiAgICAgIHRoaXMucGFnZV9jb25maWcua3BpQ29uZmlnLmRhdGFDb25maWcuYnViYmxlTWF4aW11bVNpemU7XG5cbiAgICAvLyBTdGVwIDM6IE5vcm1hbGl6ZSBmdW5jdGlvblxuICAgIGNvbnN0IG5vcm1hbGl6ZSA9ICh2YWx1ZSwgbWluLCBtYXgpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgICgodmFsdWUgLSBtaW4pIC8gKG1heCAtIG1pbikpICogKG1heFBlcmNlbnRhZ2UgLSBtaW5QZXJjZW50YWdlKSArXG4gICAgICAgIG1pblBlcmNlbnRhZ2VcbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8vIFN0ZXAgNDogQXNzaWduIGNhbGN1bGF0ZWQgcGVyY2VudGFnZSB0byBlYWNoIG9iamVjdFxuICAgIHRoaXMubG9jYXRpb25zLmZvckVhY2goKGQpID0+IHtcbiAgICAgIGQuc2FsZXNfcGVyY2VudGFnZSA9IE1hdGgubWluKFxuICAgICAgICBNYXRoLm1heChcbiAgICAgICAgICBub3JtYWxpemUoXG4gICAgICAgICAgICBkW3RoaXMucGFnZV9jb25maWcua3BpQ29uZmlnLmRhdGFDb25maWcuYWdydW1lbnRWYWx1ZV0sXG4gICAgICAgICAgICBtaW5TYWxlcyxcbiAgICAgICAgICAgIG1heFNhbGVzXG4gICAgICAgICAgKSxcbiAgICAgICAgICBtaW5QZXJjZW50YWdlXG4gICAgICAgICksXG4gICAgICAgIG1heFBlcmNlbnRhZ2VcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICAvL0J1YmJsZSBDaGFydCBFbmRcbn1cbiIsIlxuPGRpdiBjbGFzcz1cIm14LTIgYmctZ3JheS04MDBcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNMb2FkZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtc3RhcnQgYmctZ3JheS04MDAgcC0yXCI+XG4gICAgICAgICAgICA8YXBwLWxvYWRlcj48L2FwcC1sb2FkZXI+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPGRpdiBjbGFzcz1cIm14LTIgcGItMlwiPlxuXG4gICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICA8ZGl2IGlkPVwicmVnaW9uc19kaXZcIiAjZ29vZ2xNYXAgc3R5bGU9XCJ3aWR0aDogMTAwJVwiID48L2Rpdj4gICAgXG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIFxuICAgICAgIFxuXG4gICAgPC9kaXY+XG5cblxuPC9kaXY+XG4iXX0=
|