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,439 +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 GoogleGeoMapComponent {
|
|
8
|
-
constructor(commonService) {
|
|
9
|
-
this.commonService = commonService;
|
|
10
|
-
this.getTableConfigOutPut = new EventEmitter();
|
|
11
|
-
this.oRowClick = new EventEmitter();
|
|
12
|
-
this.onrightClickContextSelection = new EventEmitter();
|
|
13
|
-
this.rightClickEnable = true;
|
|
14
|
-
this.markers = [];
|
|
15
|
-
this.bounds = new google.maps.LatLngBounds();
|
|
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.chartHeight = `${value.kpiConfig.dataConfig.size}px`;
|
|
69
|
-
this.tootTipColumn = value.kpiConfig.dataConfig.chart_config;
|
|
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
|
-
}
|
|
102
|
-
ngAfterViewInit() {
|
|
103
|
-
if (this.mapTYpe == "geoMap") {
|
|
104
|
-
this.loadGoogleCharts();
|
|
105
|
-
}
|
|
106
|
-
else if (this.mapTYpe == "heatMap") {
|
|
107
|
-
if (this.page_config.kpiConfig.dataConfig.heatMapCategory == "heatMapOnly") {
|
|
108
|
-
this.isLoader = false;
|
|
109
|
-
this.loadGoogleHeatOnlyMaps(this.locations);
|
|
110
|
-
}
|
|
111
|
-
else if (this.page_config.kpiConfig.dataConfig.heatMapCategory == "heatMapMarker") {
|
|
112
|
-
this.isLoader = false;
|
|
113
|
-
this.initializeMap();
|
|
114
|
-
this.addMarkers();
|
|
115
|
-
}
|
|
116
|
-
else {
|
|
117
|
-
this.isLoader = false;
|
|
118
|
-
this.initializeHeatWithMarkerMap(this.locations);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
else {
|
|
122
|
-
this.isLoader = false;
|
|
123
|
-
this.initializeMap();
|
|
124
|
-
this.addBubbleMarkers();
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
loadGoogleCharts() {
|
|
128
|
-
google.charts.load("current", {
|
|
129
|
-
packages: [this.chartType],
|
|
130
|
-
});
|
|
131
|
-
google.charts.setOnLoadCallback(this.drawChart.bind(this));
|
|
132
|
-
}
|
|
133
|
-
drawChart() {
|
|
134
|
-
const data = google.visualization.arrayToDataTable(this.charData);
|
|
135
|
-
const options = this.getOptionConfig();
|
|
136
|
-
const chart = new google.visualization.GeoChart(this.googlMap.nativeElement);
|
|
137
|
-
this.googlMap.nativeElement.style.height = this.chartHeight;
|
|
138
|
-
chart.draw(data, options);
|
|
139
|
-
}
|
|
140
|
-
getTooltip(data) {
|
|
141
|
-
let toolTipData = "";
|
|
142
|
-
this.tootTipColumn.forEach((element) => {
|
|
143
|
-
if (typeof data[element.dataField] === "number") {
|
|
144
|
-
toolTipData +=
|
|
145
|
-
"<div class='inline'><b>" +
|
|
146
|
-
element.caption +
|
|
147
|
-
":</b></div> " +
|
|
148
|
-
this.commonService.roundOffTillTwo(data[element.dataField], 2) +
|
|
149
|
-
"<br />";
|
|
150
|
-
}
|
|
151
|
-
else {
|
|
152
|
-
toolTipData +=
|
|
153
|
-
"<div class='inline'><b>" +
|
|
154
|
-
element.caption +
|
|
155
|
-
":</b></div> " +
|
|
156
|
-
data[element.dataField] +
|
|
157
|
-
"<br />";
|
|
158
|
-
}
|
|
159
|
-
});
|
|
160
|
-
return toolTipData;
|
|
161
|
-
}
|
|
162
|
-
getOptionConfig() {
|
|
163
|
-
if (this.region == "city") {
|
|
164
|
-
const options = {
|
|
165
|
-
region: this.regionCode,
|
|
166
|
-
displayMode: "markers",
|
|
167
|
-
backgroundColor: this.bacgroundColor,
|
|
168
|
-
tooltip: { isHtml: true },
|
|
169
|
-
colorAxis: { colors: this.mapColors },
|
|
170
|
-
};
|
|
171
|
-
return options;
|
|
172
|
-
}
|
|
173
|
-
else {
|
|
174
|
-
const options = {
|
|
175
|
-
backgroundColor: this.bacgroundColor,
|
|
176
|
-
tooltip: { isHtml: true },
|
|
177
|
-
colorAxis: { colors: this.mapColors },
|
|
178
|
-
};
|
|
179
|
-
return options;
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
initializeMap() {
|
|
183
|
-
const mapOptions = this.mapOptionForHeatMap;
|
|
184
|
-
if (this.mapTYpe == "bubbleMap") {
|
|
185
|
-
mapOptions['styles'] = [
|
|
186
|
-
{
|
|
187
|
-
featureType: 'all',
|
|
188
|
-
stylers: [
|
|
189
|
-
{ saturation: -100 },
|
|
190
|
-
{ lightness: 70 },
|
|
191
|
-
{ visibility: 'simplified' },
|
|
192
|
-
],
|
|
193
|
-
},
|
|
194
|
-
{
|
|
195
|
-
featureType: 'administrative.country',
|
|
196
|
-
elementType: 'labels',
|
|
197
|
-
stylers: [
|
|
198
|
-
{ lightness: -30 },
|
|
199
|
-
{ visibility: 'on' },
|
|
200
|
-
{ fontWeight: 'bold' },
|
|
201
|
-
{ fontSize: '12px' }
|
|
202
|
-
],
|
|
203
|
-
},
|
|
204
|
-
{
|
|
205
|
-
featureType: "administrative.country",
|
|
206
|
-
elementType: "geometry.stroke",
|
|
207
|
-
stylers: [
|
|
208
|
-
{ lightness: -40 },
|
|
209
|
-
{ weight: 1.5 },
|
|
210
|
-
],
|
|
211
|
-
},
|
|
212
|
-
{
|
|
213
|
-
featureType: "administrative.country",
|
|
214
|
-
elementType: "geometry.fill",
|
|
215
|
-
stylers: [
|
|
216
|
-
{ lightness: 90 }
|
|
217
|
-
]
|
|
218
|
-
}
|
|
219
|
-
];
|
|
220
|
-
}
|
|
221
|
-
this.map = new google.maps.Map(this.googlMap.nativeElement, mapOptions);
|
|
222
|
-
this.googlMap.nativeElement.style.height = this.chartHeight;
|
|
223
|
-
}
|
|
224
|
-
addMarkers() {
|
|
225
|
-
if (this.page_config.kpiConfig.dataConfig.icon) {
|
|
226
|
-
}
|
|
227
|
-
this.locations.forEach((location) => {
|
|
228
|
-
const marker = new google.maps.Marker({
|
|
229
|
-
position: {
|
|
230
|
-
lat: parseFloat(location[this.page_config.kpiConfig.dataConfig.markerLatitude]),
|
|
231
|
-
lng: parseFloat(location[this.page_config.kpiConfig.dataConfig.markerLongitude]),
|
|
232
|
-
},
|
|
233
|
-
icon: this.page_config.kpiConfig.dataConfig.icon ? {
|
|
234
|
-
url: this.page_config.kpiConfig.dataConfig.icon,
|
|
235
|
-
scaledSize: {
|
|
236
|
-
width: 32,
|
|
237
|
-
height: 32,
|
|
238
|
-
},
|
|
239
|
-
} : "",
|
|
240
|
-
map: this.map,
|
|
241
|
-
title: `${location.city}: $${location.total_sales_amount}`,
|
|
242
|
-
});
|
|
243
|
-
this.bounds.extend(marker.getPosition());
|
|
244
|
-
this.markers.push(marker);
|
|
245
|
-
let stringWithoutQuotes = this.getInfoWindoData(location);
|
|
246
|
-
const infoWIndowData = this.getInfoWindoData(location);
|
|
247
|
-
const infoWindow = new google.maps.InfoWindow({
|
|
248
|
-
content: `<div style="height: 100%; width: 100%; color: black; font-size: 20px;">
|
|
249
|
-
${infoWIndowData}
|
|
250
|
-
</div>`,
|
|
251
|
-
});
|
|
252
|
-
marker.addListener("click", () => {
|
|
253
|
-
if (this.currentInfoWindow) {
|
|
254
|
-
this.currentInfoWindow.close();
|
|
255
|
-
}
|
|
256
|
-
infoWindow.open(this.map, marker);
|
|
257
|
-
this.currentInfoWindow = infoWindow;
|
|
258
|
-
});
|
|
259
|
-
});
|
|
260
|
-
this.map.fitBounds(this.bounds);
|
|
261
|
-
}
|
|
262
|
-
getInfoWindoData(data) {
|
|
263
|
-
let toolTipData = ``;
|
|
264
|
-
this.tootTipColumn.forEach((element) => {
|
|
265
|
-
if (typeof data[element.dataField] === "number") {
|
|
266
|
-
toolTipData +=
|
|
267
|
-
`<div class='inline'><b>` +
|
|
268
|
-
element.caption +
|
|
269
|
-
`:</b></div> ` +
|
|
270
|
-
this.commonService.roundOffTillTwo(data[element.dataField], 2) +
|
|
271
|
-
`<br />`;
|
|
272
|
-
}
|
|
273
|
-
else {
|
|
274
|
-
toolTipData +=
|
|
275
|
-
`<div class='inline'><b>` +
|
|
276
|
-
element.caption +
|
|
277
|
-
`:</b></div> ` +
|
|
278
|
-
data[element.dataField] +
|
|
279
|
-
`<br />`;
|
|
280
|
-
}
|
|
281
|
-
});
|
|
282
|
-
return toolTipData;
|
|
283
|
-
}
|
|
284
|
-
loadGoogleHeatOnlyMaps(data) {
|
|
285
|
-
this.heatmapData = [];
|
|
286
|
-
data.forEach((element) => {
|
|
287
|
-
let latitude = parseFloat(element[this.page_config.kpiConfig.dataConfig.markerLatitude]);
|
|
288
|
-
let logtitude = parseFloat(element[this.page_config.kpiConfig.dataConfig.markerLongitude]);
|
|
289
|
-
this.heatmapData.push({
|
|
290
|
-
location: new google.maps.LatLng(latitude, logtitude)
|
|
291
|
-
});
|
|
292
|
-
this.bounds.extend(new google.maps.LatLng(latitude, logtitude));
|
|
293
|
-
});
|
|
294
|
-
const mapOptions = {
|
|
295
|
-
zoom: this.zoomValuForAll
|
|
296
|
-
};
|
|
297
|
-
this.map = new google.maps.Map(this.googlMap.nativeElement, mapOptions);
|
|
298
|
-
this.googlMap.nativeElement.style.height = this.chartHeight;
|
|
299
|
-
this.map.fitBounds(this.bounds);
|
|
300
|
-
this.heatmap = new google.maps.visualization.HeatmapLayer({
|
|
301
|
-
data: this.heatmapData,
|
|
302
|
-
map: this.map,
|
|
303
|
-
});
|
|
304
|
-
}
|
|
305
|
-
initializeHeatWithMarkerMap(data) {
|
|
306
|
-
this.map = new google.maps.Map(this.googlMap.nativeElement, {
|
|
307
|
-
zoom: parseFloat(this.page_config.kpiConfig.dataConfig.zoom),
|
|
308
|
-
});
|
|
309
|
-
this.googlMap.nativeElement.style.height = this.chartHeight;
|
|
310
|
-
this.heatmapData = [];
|
|
311
|
-
data.forEach(element => {
|
|
312
|
-
let latitude = parseFloat(element[this.page_config.kpiConfig.dataConfig.markerLatitude]);
|
|
313
|
-
let logtitude = parseFloat(element[this.page_config.kpiConfig.dataConfig.markerLongitude]);
|
|
314
|
-
this.heatmapData.push({
|
|
315
|
-
location: new google.maps.LatLng(latitude, logtitude)
|
|
316
|
-
});
|
|
317
|
-
this.bounds.extend(new google.maps.LatLng(latitude, logtitude));
|
|
318
|
-
});
|
|
319
|
-
this.heatmap = new google.maps.visualization.HeatmapLayer({
|
|
320
|
-
data: this.heatmapData,
|
|
321
|
-
map: this.map,
|
|
322
|
-
});
|
|
323
|
-
this.locations.forEach((location) => {
|
|
324
|
-
const marker = new google.maps.Marker({
|
|
325
|
-
position: {
|
|
326
|
-
lat: parseFloat(location[this.page_config.kpiConfig.dataConfig.markerLatitude]),
|
|
327
|
-
lng: parseFloat(location[this.page_config.kpiConfig.dataConfig.markerLongitude]),
|
|
328
|
-
},
|
|
329
|
-
icon: this.page_config.kpiConfig.dataConfig.icon ? {
|
|
330
|
-
url: this.page_config.kpiConfig.dataConfig.icon,
|
|
331
|
-
scaledSize: {
|
|
332
|
-
width: 32,
|
|
333
|
-
height: 32,
|
|
334
|
-
},
|
|
335
|
-
} : '',
|
|
336
|
-
map: this.map,
|
|
337
|
-
title: `${location.city}: $${location.total_sales_amount}`,
|
|
338
|
-
});
|
|
339
|
-
this.bounds.extend(marker.getPosition());
|
|
340
|
-
this.markers.push(marker);
|
|
341
|
-
const infoWIndowData = this.getInfoWindoData(location);
|
|
342
|
-
const infoWindow = new google.maps.InfoWindow({
|
|
343
|
-
content: `<div style="height: 100%; width: 100%; color: black; font-size: 20px;">
|
|
344
|
-
${infoWIndowData}
|
|
345
|
-
</div>`,
|
|
346
|
-
});
|
|
347
|
-
marker.addListener("click", () => {
|
|
348
|
-
if (this.currentInfoWindow) {
|
|
349
|
-
this.currentInfoWindow.close();
|
|
350
|
-
}
|
|
351
|
-
infoWindow.open(this.map, marker);
|
|
352
|
-
this.currentInfoWindow = infoWindow;
|
|
353
|
-
});
|
|
354
|
-
});
|
|
355
|
-
this.map.fitBounds(this.bounds);
|
|
356
|
-
this.map.addListener('zoom_changed', () => this.handleZoomChange());
|
|
357
|
-
}
|
|
358
|
-
handleZoomChange() {
|
|
359
|
-
const zoomLevel = this.map.getZoom();
|
|
360
|
-
if (zoomLevel < 5) {
|
|
361
|
-
this.heatmap.setMap(this.map);
|
|
362
|
-
this.markers.forEach((marker) => marker.setMap(null));
|
|
363
|
-
}
|
|
364
|
-
else {
|
|
365
|
-
this.heatmap.setMap(null);
|
|
366
|
-
this.markers.forEach((marker) => marker.setMap(this.map));
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
addBubbleMarkers() {
|
|
370
|
-
this.prepareBubbleData();
|
|
371
|
-
this.locations.forEach((location) => {
|
|
372
|
-
const marker = new google.maps.Marker({
|
|
373
|
-
position: {
|
|
374
|
-
lat: parseFloat(location[this.page_config.kpiConfig.dataConfig.markerLatitude]),
|
|
375
|
-
lng: parseFloat(location[this.page_config.kpiConfig.dataConfig.markerLongitude]),
|
|
376
|
-
},
|
|
377
|
-
icon: {
|
|
378
|
-
path: google.maps.SymbolPath.CIRCLE,
|
|
379
|
-
scale: Math.round(location.sales_percentage),
|
|
380
|
-
fillColor: this.page_config.kpiConfig.dataConfig.bubbleColor,
|
|
381
|
-
fillOpacity: 0.6,
|
|
382
|
-
strokeWeight: 0,
|
|
383
|
-
},
|
|
384
|
-
map: this.map,
|
|
385
|
-
title: `${location.city}: $${location[this.page_config.kpiConfig.dataConfig.agrumentValue]}`,
|
|
386
|
-
});
|
|
387
|
-
this.bounds.extend(marker.getPosition());
|
|
388
|
-
this.markers.push(marker);
|
|
389
|
-
let stringWithoutQuotes = this.getInfoWindoData(location);
|
|
390
|
-
const infoWIndowData = this.getInfoWindoData(location);
|
|
391
|
-
const infoWindow = new google.maps.InfoWindow({
|
|
392
|
-
content: `<div style="height: 100%; width: 100%; color: black; font-size: 20px;">
|
|
393
|
-
${infoWIndowData}
|
|
394
|
-
</div>`,
|
|
395
|
-
});
|
|
396
|
-
marker.addListener("click", () => {
|
|
397
|
-
if (this.currentInfoWindow) {
|
|
398
|
-
this.currentInfoWindow.close();
|
|
399
|
-
}
|
|
400
|
-
infoWindow.open(this.map, marker);
|
|
401
|
-
this.currentInfoWindow = infoWindow;
|
|
402
|
-
});
|
|
403
|
-
});
|
|
404
|
-
this.map.fitBounds(this.bounds);
|
|
405
|
-
}
|
|
406
|
-
prepareBubbleData() {
|
|
407
|
-
const minSales = Math.min(...this.locations.map(d => d[this.page_config.kpiConfig.dataConfig.agrumentValue]));
|
|
408
|
-
const maxSales = Math.max(...this.locations.map(d => d[this.page_config.kpiConfig.dataConfig.agrumentValue]));
|
|
409
|
-
const minPercentage = this.page_config.kpiConfig.dataConfig.bubbleMinimumSize;
|
|
410
|
-
const maxPercentage = this.page_config.kpiConfig.dataConfig.bubbleMaximumSize;
|
|
411
|
-
const normalize = (value, min, max) => {
|
|
412
|
-
return ((value - min) / (max - min)) * (maxPercentage - minPercentage) + minPercentage;
|
|
413
|
-
};
|
|
414
|
-
this.locations.forEach(d => {
|
|
415
|
-
d.sales_percentage = Math.min(Math.max(normalize(d[this.page_config.kpiConfig.dataConfig.agrumentValue], minSales, maxSales), minPercentage), maxPercentage);
|
|
416
|
-
});
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
|
-
GoogleGeoMapComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GoogleGeoMapComponent, deps: [{ token: i1.CommonService }], target: i0.ɵɵFactoryTarget.Component });
|
|
420
|
-
GoogleGeoMapComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: GoogleGeoMapComponent, selector: "app-google-geo-map", 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\" style=\"width: 100%\" ></div> -->\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" }] });
|
|
421
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GoogleGeoMapComponent, decorators: [{
|
|
422
|
-
type: Component,
|
|
423
|
-
args: [{ selector: "app-google-geo-map", 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\" style=\"width: 100%\" ></div> -->\n <div id=\"regions_div\" #googlMap style=\"width: 100%\" ></div> \n </ng-container>\n \n \n\n </div>\n\n\n</div>\n" }]
|
|
424
|
-
}], ctorParameters: function () { return [{ type: i1.CommonService }]; }, propDecorators: { googlMap: [{
|
|
425
|
-
type: ViewChild,
|
|
426
|
-
args: ["googlMap"]
|
|
427
|
-
}], getTableConfigOutPut: [{
|
|
428
|
-
type: Output
|
|
429
|
-
}], oRowClick: [{
|
|
430
|
-
type: Output
|
|
431
|
-
}], onrightClickContextSelection: [{
|
|
432
|
-
type: Output
|
|
433
|
-
}], rightClickEnable: [{
|
|
434
|
-
type: Input
|
|
435
|
-
}], chartDataSource: [{
|
|
436
|
-
type: Input,
|
|
437
|
-
args: ["chartDataSource"]
|
|
438
|
-
}] } });
|
|
439
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ29vZ2xlLWdlby1tYXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL3NoYXJlZC9hZHZhbmNlZC1jb21wb25lbnQvZ29vZ2xlLWdlby1tYXAvZ29vZ2xlLWdlby1tYXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL3NoYXJlZC9hZHZhbmNlZC1jb21wb25lbnQvZ29vZ2xlLWdlby1tYXAvZ29vZ2xlLWdlby1tYXAuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDOzs7OztBQVE1QixNQUFNLE9BQU8scUJBQXFCO0lBbUloQyxZQUFtQixhQUE0QjtRQUE1QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQTFIOUIseUJBQW9CLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDN0QsY0FBUyxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2xELGlDQUE0QixHQUMzQyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ1oscUJBQWdCLEdBQVksSUFBSSxDQUFDO1FBZTFDLFlBQU8sR0FBRyxFQUFFLENBQUM7UUFJYixXQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBbUdXLENBQUM7SUEvRnBELElBQ0ksZUFBZSxDQUFDLEtBQUs7UUFDdkIsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FB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Q0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQ3BDLE9BQU8sQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQyxHQUFHLGFBQWEsQ0FBQztRQUN6RixDQUFDLENBQUM7UUFHRixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUN6QixDQUFDLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUMvSixDQUFDLENBQUMsQ0FBQztJQUVELENBQUM7O2tIQTdqQlUscUJBQXFCO3NHQUFyQixxQkFBcUIsdVlDbkJsQyxvZkFxQkE7MkZERmEscUJBQXFCO2tCQUxqQyxTQUFTOytCQUNFLG9CQUFvQjtvR0FLUCxRQUFRO3NCQUE5QixTQUFTO3VCQUFDLFVBQVU7Z0JBUUosb0JBQW9CO3NCQUFwQyxNQUFNO2dCQUNVLFNBQVM7c0JBQXpCLE1BQU07Z0JBQ1UsNEJBQTRCO3NCQUE1QyxNQUFNO2dCQUVFLGdCQUFnQjtzQkFBeEIsS0FBSztnQkF3QkYsZUFBZTtzQkFEbEIsS0FBSzt1QkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBDb21tb25TZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IG1vbWVudCBmcm9tIFwibW9tZW50XCI7XG5kZWNsYXJlIHZhciBnb29nbGU6IGFueTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImFwcC1nb29nbGUtZ2VvLW1hcFwiLFxuICB0ZW1wbGF0ZVVybDogXCIuL2dvb2dsZS1nZW8tbWFwLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogW1wiLi9nb29nbGUtZ2VvLW1hcC5jb21wb25lbnQuc2Nzc1wiXSxcbn0pXG5leHBvcnQgY2xhc3MgR29vZ2xlR2VvTWFwQ29tcG9uZW50IHtcbiAgQFZpZXdDaGlsZChcImdvb2dsTWFwXCIpIGdvb2dsTWFwOiBFbGVtZW50UmVmO1xuICBjaGFyRGF0YTogYW55O1xuICBjaGFydEhlaWdodDogYW55O1xuICBiYWNncm91bmRDb2xvcjogYW55O1xuICBtYXBDb2xvcnM6IGFueTtcbiAgY2hhcnRUeXBlOiBhbnk7XG4gIHRvb3RUaXBDb2x1bW46IGFueTtcbiAgcmVnaW9uOiBhbnk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgZ2V0VGFibGVDb25maWdPdXRQdXQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcHVibGljIG9Sb3dDbGljazogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgb25yaWdodENsaWNrQ29udGV4dFNlbGVjdGlvbjogRXZlbnRFbWl0dGVyPGFueT4gPVxuICAgIG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQElucHV0KCkgcmlnaHRDbGlja0VuYWJsZTogYm9vbGVhbiA9IHRydWU7XG4gIGlzTG9hZGVyOiBib29sZWFuO1xuICBwYWdlX2NvbmZpZzogYW55O1xuICBwYWdlX3Bhcm1zOiBhbnk7XG4gIHJlZ2lvbkNvZGU6IGFueTtcbiAgLy8gaGVhdCBNYXAgc3RhcnRcbiAgbWFwOiBhbnk7XG4gIGxvY2F0aW9ucztcbiAgbWFwVFlwZTogYW55O1xuICBtYXBPcHRpb25Gb3JIZWF0TWFwOiB7XG4gICAgem9vbTogbnVtYmVyO1xuICB9O1xuICBjdXJyZW50SW5mb1dpbmRvdzogYW55OyAvLyBUcmFjayB0aGUgb3BlbiBJbmZvV2luZG93XG4gIC8vIGhlYXQgTWFwIGVuZFxuICAvL2hlYXQgb25seSBtYXAgc3RhcnQgLy9cbiAgbWFya2VycyA9IFtdO1xuICBoZWF0bWFwOiBhbnk7XG4gIGhlYXRtYXBEYXRhOiBhbnk7XG4gIHpvb21WYWx1Rm9yQWxsOiBudW1iZXI7XG4gIGJvdW5kcyA9IG5ldyBnb29nbGUubWFwcy5MYXRMbmdCb3VuZHMoKTtcbiAgLy9oZWF0IG9ubHkgbWFwIGVuZCAvL1xuICBzb3J0Qnk6IGFueTtcbiAgZmlsdGVyZWRPYmplY3RzOiBhbnk7XG4gIEBJbnB1dChcImNoYXJ0RGF0YVNvdXJjZVwiKVxuICBzZXQgY2hhcnREYXRhU291cmNlKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNMb2FkZXIgPSB0cnVlO1xuICAgICAgdGhpcy5wYWdlX2NvbmZpZyA9IHZhbHVlO1xuICAgICAgdGhpcy5wYWdlX3Bhcm1zID0gdmFsdWUudGl0bGVQYXJhbXM7XG4gICAgICB0aGlzLnNvcnRCeSA9IHZhbHVlLmtwaUNvbmZpZz8uZGF0YUNvbmZpZz8uc29ydEJ5O1xuXG4gICAgICAvLyB0aGlzLmluUm9hbWVyR2VvQ2hhcnQubmF0aXZlRWxlbWVudC5pbm5lckhUTUwgPSAnJztcbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUua3BpQ29uZmlnLmRhdGFTb3VyY2UgJiZcbiAgICAgICAgdmFsdWUua3BpQ29uZmlnLmRhdGFTb3VyY2UubGVuZ3RoICE9PSAwXG4gICAgICApIHtcbiAgICAgICAgaWYgKHZhbHVlLmtwaUNvbmZpZy5mb3JtYXRlID09IFwibW9udGhseVwiKSB7XG4gICAgICAgICAgdGhpcy5tYXBUWXBlID0gdmFsdWUua3BpQ29uZmlnLmRhdGFDb25maWcubWFwVHlwZTtcbiAgICAgICAgICBpZiAodGhpcy5tYXBUWXBlID09IFwiZ2VvTWFwXCIpIHtcbiAgICAgICAgICAgIHRoaXMucmVnaW9uID0gdmFsdWUua3BpQ29uZmlnLmRhdGFDb25maWcucmVnaW9uO1xuICAgICAgICAgICAgdGhpcy5yZWdpb25Db2RlID0gdmFsdWUua3BpQ29uZmlnLmRhdGFDb25maWcucmVnaW9uQ29kZTtcbiAgICAgICAgICAgIHRoaXMudG9vdFRpcENvbHVtbiA9IHZhbHVlLmtwaUNvbmZpZy5kYXRhQ29uZmlnLmNoYXJ0X2NvbmZpZztcbiAgICAgICAgICAgIGxldCBkYXRhID0gdmFsdWUua3BpQ29uZmlnLmRhdGFTb3VyY2U7XG4gICAgICAgICAgICB0aGlzLmNoYXJ0SGVpZ2h0ID0gYCR7dmFsdWUua3BpQ29uZmlnLmRhdGFDb25maWcuc2l6ZX1weGA7XG4gICAgICAgICAgICB0aGlzLmNoYXJ0VHlwZSA9IHZhbHVlLmtwaUNvbmZpZy5kYXRhQ29uZmlnLmNoYXJ0VHlwZTtcbiAgICAgICAgICAgIHRoaXMuYmFjZ3JvdW5kQ29sb3IgPSB2YWx1ZS5rcGlDb25maWcuZGF0YUNvbmZpZy5iYWNrZ3JvdW5kQ29sb3I7XG4gICAgICAgICAgICB0aGlzLm1hcENvbG9ycyA9IHZhbHVlLmtwaUNvbmZpZy5kYXRhQ29uZmlnLmNvbG9ycztcbiAgICAgICAgICAgIC8vIGxldCBjb25maWcgPSB2YWx1ZS5jaGFydENvbmZpZztcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZERhdGEgPSBbXG4gICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICB2YWx1ZS5rcGlDb25maWcuZGF0YUNvbmZpZ1tcImFyZ3VtZW50RmllbGRcIl0sXG4gICAgICAgICAgICAgICAgdmFsdWUua3BpQ29uZmlnLmRhdGFDb25maWdbXCJjaGFydFZhbHVlRmllbGRcIl0sXG4gICAgICAgICAgICAgICAgeyB0eXBlOiBcInN0cmluZ1wiLCByb2xlOiBcInRvb2x0aXBcIiwgcDogeyBodG1sOiB0cnVlIH0gfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIF0uY29uY2F0KFxuICAgICAgICAgICAgICBkYXRhLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvb2x0aXAgPSB0aGlzLmdldFRvb2x0aXAoaXRlbSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgIGl0ZW1bdmFsdWUua3BpQ29uZmlnLmRhdGFDb25maWdbXCJhcmd1bWVudEZpZWxkXCJdXSxcbiAgICAgICAgICAgICAgICAgIGl0ZW1bdmFsdWUua3BpQ29uZmlnLmRhdGFDb25maWdbXCJjaGFydFZhbHVlRmllbGRcIl1dLFxuICAgICAgICAgICAgICAgICAgdG9vbHRpcCxcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuY2hhckRhdGEgPSBmb3JtYXR0ZWREYXRhO1xuICAgICAgICAgICAgLy8gdGhpcy5sb2FkR29vZ2xlQ2hhcnRzKCk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5pc0xvYWRlciA9IGZhbHNlO1xuICAgICAgICAgICAgICAvLyB0aGlzLmxvYWRHb29nbGVDaGFydHMoKTtcbiAgICAgICAgICAgIH0sIDIwMCk7XG4gICAgICAgICAgfSBlbHNlIGlmKHRoaXMubWFwVFlwZSA9PSBcImJ1YmJsZU1hcFwiKSB7XG4gICAgICAgICAgICB0aGlzLmxvY2F0aW9ucyA9IHZhbHVlLmtwaUNvbmZpZy5kYXRhU291cmNlO1xuICAgICAgICAgICAgdGhpcy5jaGFydEhlaWdodCA9IGAke3ZhbHVlLmtwaUNvbmZpZy5kYXRhQ29uZmlnLnNpemV9cHhgO1xuICAgICAgICAgICAgdGhpcy50b290VGlwQ29sdW1uID0gdmFsdWUua3BpQ29uZmlnLmRhdGFDb25maWcuY2hhcnRfY29uZmlnO1xuICAgICAgICAgICAgdGhpcy5tYXBPcHRpb25Gb3JIZWF0TWFwID0ge1xuICAgICAgICAgICAgICB6b29tOiB0aGlzLnpvb21WYWx1Rm9yQWxsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgdGhpcy5sb2NhdGlvbnMgPSB2YWx1ZS5rcGlDb25maWcuZGF0YVNvdXJjZTtcbiAgICAgICAgICAgIHRoaXMuY2hhcnRIZWlnaHQgPSBgJHt2YWx1ZS5rcGlDb25maWcuZGF0YUNvbmZpZy5zaXplfXB4YDtcbiAgICAgICAgICAgIHRoaXMudG9vdFRpcENvbHVtbiA9IHZhbHVlLmtwaUNvbmZpZy5kYXRhQ29uZmlnLmNoYXJ0X2NvbmZpZztcbiAgICAgICAgICAgIHRoaXMuem9vbVZhbHVGb3JBbGwgPSBwYXJzZUZsb2F0KFxuICAgICAgICAgICAgICB0aGlzLnBhZ2VfY29uZmlnLmtwaUNvbmZpZy5kYXRhQ29uZmlnLnpvb21cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLm1hcE9wdGlvbkZvckhlYXRNYXAgPSB7XG4gICAgICAgICAgICAgIHpvb206IHRoaXMuem9vbVZhbHVGb3JBbGxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICB9XG4gICAgICAgIH1lbHNlIFxuICAgICAgICBpZih2YWx1ZS5rcGlDb25maWcuZm9ybWF0ZSA9PSBcImRhaWx5XCIpe1xuICAgICAgICAgIHRoaXMubWFwVFlwZSA9IHZhbHVlLmtwaUNvbmZpZy5kYXRhQ29uZmlnLm1hcFR5cGU7XG4gICAgICAgICAgY29uc3Qgc29ydGVkRGF0YSA9IHZhbHVlLmtwaUNvbmZpZy5kYXRhU291cmNlXG4gICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKHJlY29yZCA9PiByZWNvcmRbdGhpcy5zb3J0QnldKVxuICAgICAgICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IG1vbWVudChiW3RoaXMuc29ydEJ5XSkuZGlmZihtb21lbnQoYVt0aGlzLnNvcnRCeV0pKSk7XG4gICAgICAgICAgICAgICAgICAgY29uc3QgbW9zdFJlY2VudFJlY29yZCA9IHNvcnRlZERhdGFbMF07XG4gICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5lbmREYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkT2JqZWN0cyA9IHNvcnRlZERhdGEuZmlsdGVyKGRhdGEgPT4gZGF0YVt0aGlzLnNvcnRCeV0gPT09IHZhbHVlLmVuZERhdGUpO1xuICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkT2JqZWN0cyA9IHNvcnRlZERhdGEuZmlsdGVyKGRhdGEgPT4gZGF0YVt0aGlzLnNvcnRCeV0gPT09IG1vc3RSZWNlbnRSZWNvcmRbdGhpcy5zb3J0QnldKTtcbiAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICBpZih0aGlzLm1hcFRZcGUgPT0gXCJidWJibGVNYXBcIikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2F0aW9ucyA9IHRoaXMuZmlsdGVyZWRPYmplY3RzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYXJ0SGVpZ2h0ID0gYCR7dmFsdWUua3BpQ29uZmlnLmRhdGFDb25maWcuc2l6ZX1weGA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9vdFRpcENvbHVtbiA9IHZhbHVlLmtwaUNvbmZpZy5kYXRhQ29uZmlnLmNoYXJ0X2NvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXBPcHRpb25Gb3JIZWF0TWFwID0ge1xuICAgICAgICAgICAgICAgICAgICAgIHpvb206IHRoaXMuem9vbVZhbHVGb3JBbGxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBjb21tb25TZXJ2aWNlOiBDb21tb25TZXJ2aWNlKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyB0aGlzLmxvYWRHb29nbGVIZWF0T25seU1hcHModGhpcy5sb2NhdGlvbnMpO1xuXG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubWFwVFlwZSA9PSBcImdlb01hcFwiKSB7XG4gICAgICB0aGlzLmxvYWRHb29nbGVDaGFydHMoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubWFwVFlwZSA9PSBcImhlYXRNYXBcIikge1xuICAgICAgaWYgKHRoaXMucGFnZV9jb25maWcua3BpQ29uZmlnLmRhdGFDb25maWcuaGVhdE1hcENhdGVnb3J5ID09IFwiaGVhdE1hcE9ubHlcIikge1xuICAgICAgICB0aGlzLmlzTG9hZGVyID0gZmFsc2U7XG4gICAgICAgIHRoaXMubG9hZEdvb2dsZUhlYXRPbmx5TWFwcyh0aGlzLmxvY2F0aW9ucyk7XG4gICAgICAgIFxuICAgICAgfSBlbHNlIGlmICh0aGlzLnBhZ2VfY29uZmlnLmtwaUNvbmZpZy5kYXRhQ29uZmlnLmhlYXRNYXBDYXRlZ29yeSA9PSBcImhlYXRNYXBNYXJrZXJcIikge1xuICAgICAgICB0aGlzLmlzTG9hZGVyID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZU1hcCgpO1xuICAgICAgICB0aGlzLmFkZE1hcmtlcnMoKTtcbiAgICAgICAgLy8gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIC8vICAgdGhpcy5sb2FkTWFwKCk7XG4gICAgICAgIC8vIH0sIDApO1xuICAgICAgICBcblxuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmlzTG9hZGVyID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZUhlYXRXaXRoTWFya2VyTWFwKHRoaXMubG9jYXRpb25zKTtcblxuICAgICAgfVxuXG4gICAgfWVsc2V7XG4gICAgICB0aGlzLmlzTG9hZGVyID0gZmFsc2U7XG4gICAgICB0aGlzLmluaXRpYWxpemVNYXAoKTtcbiAgICAgIHRoaXMuYWRkQnViYmxlTWFya2VycygpO1xuICAgIH1cbiAgfVxuICAvLyAgR2VvIE1hcCBzdGFydCAvL1xuICBsb2FkR29vZ2xlQ2hhcnRzKCkge1xuICAgIGdvb2dsZS5jaGFydHMubG9hZChcImN1cnJlbnRcIiwge1xuICAgICAgcGFja2FnZXM6IFt0aGlzLmNoYXJ0VHlwZV0sXG4gICAgfSk7XG4gICAgZ29vZ2xlLmNoYXJ0cy5zZXRPbkxvYWRDYWxsYmFjayh0aGlzLmRyYXdDaGFydC5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIGRyYXdDaGFydCgpIHtcbiAgICBjb25zdCBkYXRhID0gZ29vZ2xlLnZpc3VhbGl6YXRpb24uYXJyYXlUb0RhdGFUYWJsZSh0aGlzLmNoYXJEYXRhKTtcblxuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmdldE9wdGlvbkNvbmZpZygpO1xuXG4gICAgLy8gb3B0aW9uc1snZGF0YU1vZGUnXSA9ICdyZWdpb25zJztcblxuICAgIGNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkdlb0NoYXJ0KFxuICAgICAgdGhpcy5nb29nbE1hcC5uYXRpdmVFbGVtZW50XG4gICAgKTtcbiAgICB0aGlzLmdvb2dsTWFwLm5hdGl2ZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gdGhpcy5jaGFydEhlaWdodDtcblxuICAgIGNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7XG4gIH1cblxuICBnZXRUb29sdGlwKGRhdGEpIHtcbiAgICBsZXQgdG9vbFRpcERhdGEgPSBcIlwiO1xuICAgIHRoaXMudG9vdFRpcENvbHVtbi5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGRhdGFbZWxlbWVudC5kYXRhRmllbGRdID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHRvb2xUaXBEYXRhICs9XG4gICAgICAgICAgXCI8ZGl2IGNsYXNzPSdpbmxpbmUnPjxiPlwiICtcbiAgICAgICAgICBlbGVtZW50LmNhcHRpb24gK1xuICAgICAgICAgIFwiOjwvYj48L2Rpdj4gXCIgK1xuICAgICAgICAgIHRoaXMuY29tbW9uU2VydmljZS5yb3VuZE9mZlRpbGxUd28oZGF0YVtlbGVtZW50LmRhdGFGaWVsZF0sIDIpICtcbiAgICAgICAgICBcIjxiciAvPlwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdG9vbFRpcERhdGEgKz1cbiAgICAgICAgICBcIjxkaXYgY2xhc3M9J2lubGluZSc+PGI+XCIgK1xuICAgICAgICAgIGVsZW1lbnQuY2FwdGlvbiArXG4gICAgICAgICAgXCI6PC9iPjwvZGl2PiBcIiArXG4gICAgICAgICAgZGF0YVtlbGVtZW50LmRhdGFGaWVsZF0gK1xuICAgICAgICAgIFwiPGJyIC8+XCI7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRvb2xUaXBEYXRhO1xuICB9XG5cbiAgZ2V0T3B0aW9uQ29uZmlnKCkge1xuICAgIGlmICh0aGlzLnJlZ2lvbiA9PSBcImNpdHlcIikge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgcmVnaW9uOiB0aGlzLnJlZ2lvbkNvZGUsXG4gICAgICAgIGRpc3BsYXlNb2RlOiBcIm1hcmtlcnNcIixcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGlzLmJhY2dyb3VuZENvbG9yLFxuICAgICAgICB0b29sdGlwOiB7IGlzSHRtbDogdHJ1ZSB9LFxuICAgICAgICBjb2xvckF4aXM6IHsgY29sb3JzOiB0aGlzLm1hcENvbG9ycyB9LFxuICAgICAgfTtcbiAgICAgIHJldHVybiBvcHRpb25zO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuYmFjZ3JvdW5kQ29sb3IsXG4gICAgICAgIHRvb2x0aXA6IHsgaXNIdG1sOiB0cnVlIH0sXG4gICAgICAgIGNvbG9yQXhpczogeyBjb2xvcnM6IHRoaXMubWFwQ29sb3JzIH0sXG4gICAgICB9O1xuICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfVxuICB9XG5cbiAgLy8gIEdlbyBNYXAgZW5kIC8vXG5cbiAgLy8gSGVhdCBNYXAgc3RhcnQgLy9cbiAgaW5pdGlhbGl6ZU1hcCgpOiB2b2lkIHtcbiAgICBjb25zdCBtYXBPcHRpb25zID0gdGhpcy5tYXBPcHRpb25Gb3JIZWF0TWFwO1xuICAgIC8vIHtcbiAgICAvLyAgIGNlbnRlcjogeyBsYXQ6IDM3LjA5MDIsIGxuZzogLTk1LjcxMjkgfSwgLy8gQ2VudGVyIG9mIHRoZSBVU0FcbiAgICAvLyAgIHpvb206IDUsXG4gICAgLy8gfTtcblxuICAgIGlmKHRoaXMubWFwVFlwZSA9PSBcImJ1YmJsZU1hcFwiKXtcbiAgICAgIG1hcE9wdGlvbnNbJ3N0eWxlcyddID0gIFtcbiAgICAgICAge1xuICAgICAgICAgIGZlYXR1cmVUeXBlOiAnYWxsJyxcbiAgICAgICAgICBzdHlsZXJzOiBbXG4gICAgICAgICAgICB7IHNhdHVyYXRpb246IC0xMDAgfSxcbiAgICAgICAgICAgIHsgbGlnaHRuZXNzOiA3MCB9LFxuICAgICAgICAgICAgeyB2aXNpYmlsaXR5OiAnc2ltcGxpZmllZCcgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZmVhdHVyZVR5cGU6ICdhZG1pbmlzdHJhdGl2ZS5jb3VudHJ5JyxcbiAgICAgICAgICBlbGVtZW50VHlwZTogJ2xhYmVscycsXG4gICAgICAgICAgc3R5bGVyczogW1xuICAgICAgICAgICAgeyBsaWdodG5lc3M6IC0zMCB9LCAvLyBEYXJrZW4gbGFiZWxzIGZ1cnRoZXJcbiAgICAgICAgICAgIHsgdmlzaWJpbGl0eTogJ29uJyB9LFxuICAgICAgICAgICAgeyBmb250V2VpZ2h0OiAnYm9sZCcgfSwgLy8gTWFrZSBsYWJlbHMgYm9sZFxuICAgICAgICAgICAgeyBmb250U2l6ZTogJzEycHgnIH0gLy8gSW5jcmVhc2UgZm9udCBzaXplXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGZlYXR1cmVUeXBlOiBcImFkbWluaXN0cmF0aXZlLmNvdW50cnlcIixcbiAgICAgICAgICBlbGVtZW50VHlwZTogXCJnZW9tZXRyeS5zdHJva2VcIixcbiAgICAgICAgICBzdHlsZXJzOiBbXG4gICAgICAgICAgICB7IGxpZ2h0bmVzczogLTQwIH0sIC8vIERhcmtlbiBib3JkZXJzIHNpZ25pZmljYW50bHlcbiAgICAgICAgICAgIHsgd2VpZ2h0OiAxLjUgfSwgLy8gSW5jcmVhc2UgYm9yZGVyIHRoaWNrbmVzc1xuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBmZWF0dXJlVHlwZTogXCJhZG1pbmlzdHJhdGl2ZS5jb3VudHJ5XCIsXG4gICAgICAgICAgZWxlbWVudFR5cGU6IFwiZ2VvbWV0cnkuZmlsbFwiLFxuICAgICAgICAgIHN0eWxlcnM6IFtcbiAgICAgICAgICAgIHsgbGlnaHRuZXNzOiA5MCB9IC8vIEtlZXAgZmlsbCB2ZXJ5IGxpZ2h0XG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfVxuICAgXG5cbiAgICB0aGlzLm1hcCA9IG5ldyBnb29nbGUubWFwcy5NYXAoXG4gICAgICAvLyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJlZ2lvbnNfZGl2XCIpICxcbiAgICAgIHRoaXMuZ29vZ2xNYXAubmF0aXZlRWxlbWVudCxcbiAgICAgIG1hcE9wdGlvbnNcbiAgICApO1xuICAgIHRoaXMuZ29vZ2xNYXAubmF0aXZlRWxlbWVudC5zdHlsZS5oZWlnaHQgPSB0aGlzLmNoYXJ0SGVpZ2h0O1xuICB9XG5cbiAgLy8gQWRkIG1hcmtlcnMgdG8gdGhlIG1hcFxuICBhZGRNYXJrZXJzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBhZ2VfY29uZmlnLmtwaUNvbmZpZy5kYXRhQ29uZmlnLmljb24pIHtcblxuICAgIH1cbiAgICB0aGlzLmxvY2F0aW9ucy5mb3JFYWNoKChsb2NhdGlvbikgPT4ge1xuICAgICAgY29uc3QgbWFya2VyID0gbmV3IGdvb2dsZS5tYXBzLk1hcmtlcih7XG4gICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgbGF0OiBwYXJzZUZsb2F0KFxuICAgICAgICAgICAgbG9jYXRpb25bdGhpcy5wYWdlX2NvbmZpZy5rcGlDb25maWcuZGF0YUNvbmZpZy5tYXJrZXJMYXRpdHVkZV1cbiAgICAgICAgICApLFxuICAgICAgICAgIGxuZzogcGFyc2VGbG9hdChcbiAgICAgICAgICAgIGxvY2F0aW9uW3RoaXMucGFnZV9jb25maWcua3BpQ29uZmlnLmRhdGFDb25maWcubWFya2VyTG9uZ2l0dWRlXVxuICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIGljb246IHRoaXMucGFnZV9jb25maWcua3BpQ29uZmlnLmRhdGFDb25maWcuaWNvbiA/IHtcbiAgICAgICAgICB1cmw6IHRoaXMucGFnZV9jb25maWcua3BpQ29uZmlnLmRhdGFDb25maWcuaWNvbiwgLy8gUmVwbGFjZSB3aXRoIHlvdXIgaWNvbiBwYXRoXG4gICAgICAgICAgc2NhbGVkU2l6ZToge1xuICAgICAgICAgICAgd2lkdGg6IDMyLFxuICAgICAgICAgICAgaGVpZ2h0OiAzMixcbiAgICAgICAgICB9LFxuICAgICAgICB9IDogXCJcIixcbiAgICAgICAgLy8gdG9vbHRpcFRleHQ6XG4gICAgICAgIG1hcDogdGhpcy5tYXAsXG4gICAgICAgIC8vIHRpdGxlOiBgJHtsb2NhdGlvbi5jaXR5fTogJCR7bG9jYXRpb24udG90YWxfc2FsZXNfYW1vdW50fWAsXG4gICAgICAgIHRpdGxlOiBgJHtsb2NhdGlvbi5jaXR5fTogJCR7bG9jYXRpb24udG90YWxfc2FsZXNfYW1vdW50fWAsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuYm91bmRzLmV4dGVuZChtYXJrZXIuZ2V0UG9zaXRpb24oKSk7XG4gICAgICB0aGlzLm1hcmtlcnMucHVzaChtYXJrZXIpO1xuXG4gICAgICAvLyBBZGQgYW4gaW5mbyB3aW5kb3dcbiAgICAgIGxldCBzdHJpbmdXaXRob3V0UXVvdGVzID0gdGhpcy5nZXRJbmZvV2luZG9EYXRhKGxvY2F0aW9uKTtcbiAgICAgIGNvbnN0IGluZm9XSW5kb3dEYXRhID0gdGhpcy5nZXRJbmZvV2luZG9EYXRhKGxvY2F0aW9uKTtcblxuICAgICAgY29uc3QgaW5mb1dpbmRvdyA9IG5ldyBnb29nbGUubWFwcy5JbmZvV2luZG93KHtcbiAgICAgICAgLy8gY29udGVudDogaW5mb1dJbmRvd0RhdGEsXG4gICAgICAgIGNvbnRlbnQ6IGA8ZGl2IHN0eWxlPVwiaGVpZ2h0OiAxMDAlOyB3aWR0aDogMTAwJTsgY29sb3I6IGJsYWNrOyBmb250LXNpemU6IDIwcHg7XCI+XG4gICAgICAgICR7aW5mb1dJbmRvd0RhdGF9XG4gICAgICA8L2Rpdj5gLFxuICAgICAgfSk7XG5cbiAgICAgIG1hcmtlci5hZGRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEluZm9XaW5kb3cpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRJbmZvV2luZG93LmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaW5mb1dpbmRvdy5vcGVuKHRoaXMubWFwLCBtYXJrZXIpO1xuICAgICAgICB0aGlzLmN1cnJlbnRJbmZvV2luZG93ID0gaW5mb1dpbmRvdztcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHRoaXMubWFwLmZpdEJvdW5kcyh0aGlzLmJvdW5kcyk7XG5cblxuICB9XG5cbiAgZ2V0SW5mb1dpbmRvRGF0YShkYXRhKSB7XG4gICAgbGV0IHRvb2xUaXBEYXRhID0gYGA7XG4gICAgdGhpcy50b290VGlwQ29sdW1uLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgZGF0YVtlbGVtZW50LmRhdGFGaWVsZF0gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgdG9vbFRpcERhdGEgKz1cbiAgICAgICAgICBgPGRpdiBjbGFzcz0naW5saW5lJz48Yj5gICtcbiAgICAgICAgICBlbGVtZW50LmNhcHRpb24gK1xuICAgICAgICAgIGA6PC9iPjwvZGl2PiBgICtcbiAgICAgICAgICB0aGlzLmNvbW1vblNlcnZpY2Uucm91bmRPZmZUaWxsVHdvKGRhdGFbZWxlbWVudC5kYXRhRmllbGRdLCAyKSArXG4gICAgICAgICAgYDxiciAvPmA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0b29sVGlwRGF0YSArPVxuICAgICAgICAgIGA8ZGl2IGNsYXNzPSdpbmxpbmUnPjxiPmAgK1xuICAgICAgICAgIGVsZW1lbnQuY2FwdGlvbiArXG4gICAgICAgICAgYDo8L2I+PC9kaXY+IGAgK1xuICAgICAgICAgIGRhdGFbZWxlbWVudC5kYXRhRmllbGRdICtcbiAgICAgICAgICBgPGJyIC8+YDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdG9vbFRpcERhdGE7XG4gIH1cbiAgLy8gSGVhdCBNYXAgRW5kIC8vXG5cbiAgLy9oZWF0IG9ubHkgbWFwIHN0YXJ0IC8vXG5cbiAgbG9hZEdvb2dsZUhlYXRPbmx5TWFwcyhkYXRhKTogdm9pZCB7XG4gICAgdGhpcy5oZWF0bWFwRGF0YSA9IFtdO1xuICAgIGRhdGEuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgbGV0IGxhdGl0dWRlID0gcGFyc2VGbG9hdChcbiAgICAgICAgZWxlbWVudFt0aGlzLnBhZ2VfY29uZmlnLmtwaUNvbmZpZy5kYXRhQ29uZmlnLm1hcmtlckxhdGl0dWRlXVxuICAgICAgKTtcbiAgICAgIGxldCBsb2d0aXR1ZGUgPSBwYXJzZUZsb2F0KFxuICAgICAgICBlbGVtZW50W3RoaXMucGFnZV9jb25maWcua3BpQ29uZmlnLmRhdGFDb25maWcubWFya2VyTG9uZ2l0dWRlXVxuICAgICAgKTtcbiAgICAgIC8vIGxldCB3ZWlnaHQgPSAoY2VsbE5vZGUucHJvcGVydGllc1snV2VpZ2h0J10gIT0gdW5kZWZpbmVkKSA/IGNlbGxOb2RlLnByb3BlcnRpZXNbJ1dlaWdodCddIDogXCJOQVwiO1xuICAgICAgdGhpcy5oZWF0bWFwRGF0YS5wdXNoKHtcbiAgICAgICAgbG9jYXRpb246IG5ldyBnb29nbGUubWFwcy5MYXRMbmcobGF0aXR1ZGUsIGxvZ3RpdHVkZSlcbiAgICAgICAgLy8gd2VpZ2h0OiBwYXJzZUZsb2F0KHdlaWdodCksXG5cbiAgICAgIH0pO1xuICAgICAgdGhpcy5ib3VuZHMuZXh0ZW5kKG5ldyBnb29nbGUubWFwcy5MYXRMbmcobGF0aXR1ZGUsIGxvZ3RpdHVkZSkpO1xuICAgIH0pO1xuICAgIGNvbnN0IG1hcE9wdGlvbnMgPSB7XG4gICAgICB6b29tOiB0aGlzLnpvb21WYWx1Rm9yQWxsXG4gICAgfTtcblxuXG5cblxuICAgIHRoaXMubWFwID0gbmV3IGdvb2dsZS5tYXBzLk1hcCh0aGlzLmdvb2dsTWFwLm5hdGl2ZUVsZW1lbnQsIG1hcE9wdGlvbnMpO1xuICAgIHRoaXMuZ29vZ2xNYXAubmF0aXZlRWxlbWVudC5zdHlsZS5oZWlnaHQgPSB0aGlzLmNoYXJ0SGVpZ2h0O1xuICAgIHRoaXMubWFwLmZpdEJvdW5kcyh0aGlzLmJvdW5kcyk7XG4gICAgdGhpcy5oZWF0bWFwID0gbmV3IGdvb2dsZS5tYXBzLnZpc3VhbGl6YXRpb24uSGVhdG1hcExheWVyKHtcbiAgICAgIGRhdGE6IHRoaXMuaGVhdG1hcERhdGEsXG4gICAgICBtYXA6IHRoaXMubWFwLFxuICAgIH0pO1xuXG5cbiAgfVxuXG5cbiAgLy9oZWF0IG9ubHkgbWFwIGVuZCAvL1xuXG4gIC8vaGVhdCBhbmQgTWFya2VyICBtYXAgU3RhcnQgLy9cbiAgaW5pdGlhbGl6ZUhlYXRXaXRoTWFya2VyTWFwKGRhdGEpIHtcbiAgICAvLyBJbml0aWFsaXplIG1hcFxuICAgIHRoaXMubWFwID0gbmV3IGdvb2dsZS5tYXBzLk1hcCh0aGlzLmdvb2dsTWFwLm5hdGl2ZUVsZW1lbnQsIHtcbiAgICAgIC8vIGNlbnRlcjogeyBsYXQ6IDM3Ljc3NDksIGxuZzogLTEyMi40MTk0IH0sXG4gICAgICB6b29tOiBwYXJzZUZsb2F0KFxuICAgICAgICB0aGlzLnBhZ2VfY29uZmlnLmtwaUNvbmZpZy5kYXRhQ29uZmlnLnpvb21cbiAgICAgICksXG4gICAgfSk7XG4gICAgdGhpcy5nb29nbE1hcC5uYXRpdmVFbGVtZW50LnN0eWxlLmhlaWdodCA9IHRoaXMuY2hhcnRIZWlnaHQ7XG4gICAgLy8gSW5pdGlhbGl6ZSBoZWF0bWFwIGxheWVyXG4gICAgdGhpcy5oZWF0bWFwRGF0YSA9IFtdO1xuICAgIGRhdGEuZm9yRWFjaChlbGVtZW50ID0+IHtcblxuICAgICAgbGV0IGxhdGl0dWRlID0gcGFyc2VGbG9hdChcbiAgICAgICAgZWxlbWVudFt0aGlzLnBhZ2VfY29uZmlnLmtwaUNvbmZpZy5kYXRhQ29uZmlnLm1hcmtlckxhdGl0dWRlXVxuICAgICAgKTtcbiAgICAgIGxldCBsb2d0aXR1ZGUgPSBwYXJzZUZsb2F0KFxuICAgICAgICBlbGVtZW50W3RoaXMucGFnZV9jb25maWcua3BpQ29uZmlnLmRhdGFDb25maWcubWFya2VyTG9uZ2l0dWRlXVxuICAgICAgKTtcbiAgICAgIHRoaXMuaGVhdG1hcERhdGEucHVzaCh7XG4gICAgICAgIGxvY2F0aW9uOiBuZXcgZ29vZ2xlLm1hcHMuTGF0TG5nKGxhdGl0dWRlLCBsb2d0aXR1ZGUpXG4gICAgICB9KTtcbiAgICAgIHRoaXMuYm91bmRzLmV4dGVuZChuZXcgZ29vZ2xlLm1hcHMuTGF0TG5nKGxhdGl0dWRlLCBsb2d0aXR1ZGUpKTtcbiAgICB9KTtcbiAgICB0aGlzLmhlYXRtYXAgPSBuZXcgZ29vZ2xlLm1hcHMudmlzdWFsaXphdGlvbi5IZWF0bWFwTGF5ZXIoe1xuICAgICAgZGF0YTogdGhpcy5oZWF0bWFwRGF0YSxcbiAgICAgIG1hcDogdGhpcy5tYXAsXG4gICAgfSk7XG4gICAgLy8gSW5pdGlhbGl6ZSBtYXJrZXJzXG4gICAgdGhpcy5sb2NhdGlvbnMuZm9yRWFjaCgobG9jYXRpb24pID0+IHtcbiAgICAgIGNvbnN0IG1hcmtlciA9IG5ldyBnb29nbGUubWFwcy5NYXJrZXIoe1xuICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgIGxhdDogcGFyc2VGbG9hdChcbiAgICAgICAgICAgIGxvY2F0aW9uW3RoaXMucGFnZV9jb25maWcua3BpQ29uZmlnLmRhdGFDb25maWcubWFya2VyTGF0aXR1ZGVdXG4gICAgICAgICAgKSxcbiAgICAgICAgICBsbmc6IHBhcnNlRmxvYXQoXG4gICAgICAgICAgICBsb2NhdGlvblt0aGlzLnBhZ2VfY29uZmlnLmtwaUNvbmZpZy5kYXRhQ29uZmlnLm1hcmtlckxvbmdpdHVkZV1cbiAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgICBpY29uOiB0aGlzLnBhZ2VfY29uZmlnLmtwaUNvbmZpZy5kYXRhQ29uZmlnLmljb24gPyB7XG4gICAgICAgICAgdXJsOiB0aGlzLnBhZ2VfY29uZmlnLmtwaUNvbmZpZy5kYXRhQ29uZmlnLmljb24sIC8vIFJlcGxhY2Ugd2l0aCB5b3VyIGljb24gcGF0aFxuICAgICAgICAgIHNjYWxlZFNpemU6IHtcbiAgICAgICAgICAgIHdpZHRoOiAzMixcbiAgICAgICAgICAgIGhlaWdodDogMzIsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSA6ICcnLFxuICAgICAgICAvLyB0b29sdGlwVGV4dDpcbiAgICAgICAgbWFwOiB0aGlzLm1hcCxcbiAgICAgICAgLy8gdGl0bGU6IGAke2xvY2F0aW9uLmNpdHl9OiAkJHtsb2NhdGlvbi50b3RhbF9zYWxlc19hbW91bnR9YCxcbiAgICAgICAgdGl0bGU6IGAke2xvY2F0aW9uLmNpdHl9OiAkJHtsb2NhdGlvbi50b3RhbF9zYWxlc19hbW91bnR9YCxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5ib3VuZHMuZXh0ZW5kKG1hcmtlci5nZXRQb3NpdGlvbigpKTtcbiAgICAgIHRoaXMubWFya2Vycy5wdXNoKG1hcmtlcik7XG5cbiAgICAgIC8vIEFkZCBhbiBpbmZvIHdpbmRvd1xuXG4gICAgICAvLyBBZGQgYW4gaW5mbyB3aW5kb3dcbiAgICAgIGNvbnN0IGluZm9XSW5kb3dEYXRhID0gdGhpcy5nZXRJbmZvV2luZG9EYXRhKGxvY2F0aW9uKTtcbiAgICAgIGNvbnN0IGluZm9XaW5kb3cgPSBuZXcgZ29vZ2xlLm1hcHMuSW5mb1dpbmRvdyh7XG4gICAgICAgIGNvbnRlbnQ6IGA8ZGl2IHN0eWxlPVwiaGVpZ2h0OiAxMDAlOyB3aWR0aDogMTAwJTsgY29sb3I6IGJsYWNrOyBmb250LXNpemU6IDIwcHg7XCI+XG4gICAgICAgICAgICAke2luZm9XSW5kb3dEYXRhfVxuICAgICAgICAgIDwvZGl2PmAsXG4gICAgICB9KTtcblxuXG4gICAgICBtYXJrZXIuYWRkTGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRJbmZvV2luZG93KSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50SW5mb1dpbmRvdy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIGluZm9XaW5kb3cub3Blbih0aGlzLm1hcCwgbWFya2VyKTtcbiAgICAgICAgdGhpcy5jdXJyZW50SW5mb1dpbmRvdyA9IGluZm9XaW5kb3c7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB0aGlzLm1hcC5maXRCb3VuZHModGhpcy5ib3VuZHMpO1xuXG4gICAgLy8gQWRkIGxpc3RlbmVyIGZvciB6b29tIGNoYW5nZXNcbiAgICB0aGlzLm1hcC5hZGRMaXN0ZW5lcignem9vbV9jaGFuZ2VkJywgKCkgPT4gdGhpcy5oYW5kbGVab29tQ2hhbmdlKCkpO1xuICB9XG5cbiAgaGFuZGxlWm9vbUNoYW5nZSgpIHtcbiAgICBjb25zdCB6b29tTGV2ZWwgPSB0aGlzLm1hcC5nZXRab29tKCk7XG4gICAgaWYgKHpvb21MZXZlbCA8IDUpIHtcbiAgICAgIC8vIFNob3cgaGVhdG1hcCBhbmQgaGlkZSBtYXJrZXJzXG4gICAgICB0aGlzLmhlYXRtYXAuc2V0TWFwKHRoaXMubWFwKTtcbiAgICAgIHRoaXMubWFya2Vycy5mb3JFYWNoKChtYXJrZXIpID0+IG1hcmtlci5zZXRNYXAobnVsbCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBIaWRlIGhlYXRtYXAgYW5kIHNob3cgbWFya2Vyc1xuICAgICAgdGhpcy5oZWF0bWFwLnNldE1hcChudWxsKTtcbiAgICAgIHRoaXMubWFya2Vycy5mb3JFYWNoKChtYXJrZXIpID0+IG1hcmtlci5zZXRNYXAodGhpcy5tYXApKTtcbiAgICB9XG4gIH1cblxuICAvL2hlYXQgYW5kIE1hcmtlciAgbWFwIEVuZCAvL1xuXG4gIC8vQnViYmxlIENoYXJ0IFN0YXJ0XG4gIGFkZEJ1YmJsZU1hcmtlcnMoKTogdm9pZCB7XG4gICB0aGlzLnByZXBhcmVCdWJibGVEYXRhKCk7XG4gICAgdGhpcy5sb2NhdGlvbnMuZm9yRWFjaCgobG9jYXRpb24pID0+IHtcbiAgICAgIGNvbnN0IG1hcmtlciA9IG5ldyBnb29nbGUubWFwcy5NYXJrZXIoe1xuICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgIGxhdDogcGFyc2VGbG9hdChcbiAgICAgICAgICAgIGxvY2F0aW9uW3RoaXMucGFnZV9jb25maWcua3BpQ29uZmlnLmRhdGFDb25maWcubWFya2VyTGF0aXR1ZGVdXG4gICAgICAgICAgKSxcbiAgICAgICAgICBsbmc6IHBhcnNlRmxvYXQoXG4gICAgICAgICAgICBsb2NhdGlvblt0aGlzLnBhZ2VfY29uZmlnLmtwaUNvbmZpZy5kYXRhQ29uZmlnLm1hcmtlckxvbmdpdHVkZV1cbiAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgICBpY29uOiB7XG4gICAgICAgICAgcGF0aDogZ29vZ2xlLm1hcHMuU3ltYm9sUGF0aC5DSVJDTEUsXG4gICAgICAgICAgc2NhbGU6IE1hdGgucm91bmQobG9jYXRpb24uc2FsZXNfcGVyY2VudGFnZSksIC8vIEFkanVzdCBidWJibGUgc2l6ZVxuICAgICAgICAgIGZpbGxDb2xvcjogdGhpcy5wYWdlX2NvbmZpZy5rcGlDb25maWcuZGF0YUNvbmZpZy5idWJibGVDb2xvcixcbiAgICAgICAgICBmaWxsT3BhY2l0eTogMC42LFxuICAgICAgICAgIHN0cm9rZVdlaWdodDogMCxcbiAgICAgICAgfSxcbiAgICAgICAgLy8gdG9vbHRpcFRleHQ6XG4gICAgICAgIG1hcDogdGhpcy5tYXAsXG4gICAgICAgIC8vIHRpdGxlOiBgJHtsb2NhdGlvbi5jaXR5fTogJCR7bG9jYXRpb24udG90YWxfc2FsZXNfYW1vdW50fWAsXG4gICAgICAgIHRpdGxlOiBgJHtsb2NhdGlvbi5jaXR5fTogJCR7bG9jYXRpb25bdGhpcy5wYWdlX2NvbmZpZy5rcGlDb25maWcuZGF0YUNvbmZpZy5hZ3J1bWVudFZhbHVlXX1gLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmJvdW5kcy5leHRlbmQobWFya2VyLmdldFBvc2l0aW9uKCkpO1xuICAgICAgdGhpcy5tYXJrZXJzLnB1c2gobWFya2VyKTtcblxuICAgICAgLy8gQWRkIGFuIGluZm8gd2luZG93XG4gICAgICBsZXQgc3RyaW5nV2l0aG91dFF1b3RlcyA9IHRoaXMuZ2V0SW5mb1dpbmRvRGF0YShsb2NhdGlvbik7XG4gICAgICBjb25zdCBpbmZvV0luZG93RGF0YSA9IHRoaXMuZ2V0SW5mb1dpbmRvRGF0YShsb2NhdGlvbik7XG5cbiAgICAgIGNvbnN0IGluZm9XaW5kb3cgPSBuZXcgZ29vZ2xlLm1hcHMuSW5mb1dpbmRvdyh7XG4gICAgICAgIC8vIGNvbnRlbnQ6IGluZm9XSW5kb3dEYXRhLFxuICAgICAgICBjb250ZW50OiBgPGRpdiBzdHlsZT1cImhlaWdodDogMTAwJTsgd2lkdGg6IDEwMCU7IGNvbG9yOiBibGFjazsgZm9udC1zaXplOiAyMHB4O1wiPlxuICAgICAgICAke2luZm9XSW5kb3dEYXRhfVxuICAgICAgPC9kaXY+YCxcbiAgICAgIH0pO1xuXG4gICAgICBtYXJrZXIuYWRkTGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRJbmZvV2luZG93KSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50SW5mb1dpbmRvdy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIGluZm9XaW5kb3cub3Blbih0aGlzLm1hcCwgbWFya2VyKTtcbiAgICAgICAgdGhpcy5jdXJyZW50SW5mb1dpbmRvdyA9IGluZm9XaW5kb3c7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB0aGlzLm1hcC5maXRCb3VuZHModGhpcy5ib3VuZHMpO1xuXG5cbiAgfVxuXG4gIHByZXBhcmVCdWJibGVEYXRhKCl7XG4gICAgLy8gU3RlcCAxOiBGaW5kIG1pbiBhbmQgbWF4IHRvdGFsX3NhbGVzX2Ftb3VudFxuY29uc3QgbWluU2FsZXMgPSBNYXRoLm1pbiguLi50aGlzLmxvY2F0aW9ucy5tYXAoZCA9PiBkW3RoaXMucGFnZV9jb25maWcua3BpQ29uZmlnLmRhdGFDb25maWcuYWdydW1lbnRWYWx1ZV0pKTtcbmNvbnN0IG1heFNhbGVzID0gTWF0aC5tYXgoLi4udGhpcy5sb2NhdGlvbnMubWFwKGQgPT4gZFt0aGlzLnBhZ2VfY29uZmlnLmtwaUNvbmZpZy5kYXRhQ29uZmlnLmFncnVtZW50VmFsdWVdKSk7XG5cbi8vIFN0ZXAgMjogRGVmaW5lIG1pbiBhbmQgbWF4IHBlcmNlbnRhZ2UgdmFsdWVzXG5jb25zdCBtaW5QZXJjZW50YWdlID0gdGhpcy5wYWdlX2NvbmZpZy5rcGlDb25maWcuZGF0YUNvbmZpZy5idWJibGVNaW5pbXVtU2l6ZTtcbmNvbnN0IG1heFBlcmNlbnRhZ2UgPSB0aGlzLnBhZ2VfY29uZmlnLmtwaUNvbmZpZy5kYXRhQ29uZmlnLmJ1YmJsZU1heGltdW1TaXplO1xuXG4vLyBTdGVwIDM6IE5vcm1hbGl6ZSBmdW5jdGlvblxuY29uc3Qgbm9ybWFsaXplID0gKHZhbHVlLCBtaW4sIG1heCkgPT4ge1xuICByZXR1cm4gKCh2YWx1ZSAtIG1pbikgLyAobWF4IC0gbWluKSkgKiAobWF4UGVyY2VudGFnZSAtIG1pblBlcmNlbnRhZ2UpICsgbWluUGVyY2VudGFnZTtcbn07XG5cbi8vIFN0ZXAgNDogQXNzaWduIGNhbGN1bGF0ZWQgcGVyY2VudGFnZSB0byBlYWNoIG9iamVjdFxudGhpcy5sb2NhdGlvbnMuZm9yRWFjaChkID0+IHtcbiAgZC5zYWxlc19wZXJjZW50YWdlID0gTWF0aC5taW4oTWF0aC5tYXgobm9ybWFsaXplKGRbdGhpcy5wYWdlX2NvbmZpZy5rcGlDb25maWcuZGF0YUNvbmZpZy5hZ3J1bWVudFZhbHVlXSwgbWluU2FsZXMsIG1heFNhbGVzKSwgbWluUGVyY2VudGFnZSksIG1heFBlcmNlbnRhZ2UpO1xufSk7XG5cbiAgfVxuIFxuXG5cbiAgLy9CdWJibGUgQ2hhcnQgRW5kXG59XG4iLCJcbjxkaXYgY2xhc3M9XCJteC0yIGJnLWdyYXktODAwXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTG9hZGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLXN0YXJ0IGJnLWdyYXktODAwIHAtMlwiPlxuICAgICAgICAgICAgPGFwcC1sb2FkZXI+PC9hcHAtbG9hZGVyPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxkaXYgY2xhc3M9XCJteC0yIHBiLTJcIj5cblxuICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgPCEtLSA8ZGl2IGlkPVwicmVnaW9uc19kaXZcIiBzdHlsZT1cIndpZHRoOiAxMDAlXCIgPjwvZGl2PiAgIC0tPlxuICAgICAgICA8ZGl2IGlkPVwicmVnaW9uc19kaXZcIiAjZ29vZ2xNYXAgc3R5bGU9XCJ3aWR0aDogMTAwJVwiID48L2Rpdj4gICAgXG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIFxuICAgICAgIFxuXG4gICAgPC9kaXY+XG5cblxuPC9kaXY+XG4iXX0=
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
import * as i1 from "../../common";
|
|
4
|
-
import * as i2 from "@angular/common";
|
|
5
|
-
import * as i3 from "devextreme-angular/core";
|
|
6
|
-
import * as i4 from "devextreme-angular/ui/popup";
|
|
7
|
-
export class AppTitleComponent {
|
|
8
|
-
constructor(commonService) {
|
|
9
|
-
this.commonService = commonService;
|
|
10
|
-
this.title = undefined;
|
|
11
|
-
this.multiple = false;
|
|
12
|
-
this.icon = false;
|
|
13
|
-
this.onOperatorClick = new EventEmitter();
|
|
14
|
-
this.isSearchModal = false;
|
|
15
|
-
}
|
|
16
|
-
set operators(value) {
|
|
17
|
-
if (value === undefined || value.length === 0) {
|
|
18
|
-
this.isOperatorsvisible = false;
|
|
19
|
-
return;
|
|
20
|
-
}
|
|
21
|
-
else {
|
|
22
|
-
this.operatorsDatasource = value.operators;
|
|
23
|
-
this.operator_display = value.display;
|
|
24
|
-
this.fixoperationValue = value.filterOperatorData;
|
|
25
|
-
this.isOperatorsvisible = true;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
ngOnInit() {
|
|
29
|
-
}
|
|
30
|
-
getCapitalize(item) {
|
|
31
|
-
return this.commonService.convertToSpaceSeparatedCapitalized(item);
|
|
32
|
-
}
|
|
33
|
-
getOperator(item) {
|
|
34
|
-
this.onOperatorClick.emit(item);
|
|
35
|
-
}
|
|
36
|
-
openSearchFilter() {
|
|
37
|
-
this.isSearchModal = true;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
AppTitleComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: AppTitleComponent, deps: [{ token: i1.CommonService }], target: i0.ɵɵFactoryTarget.Component });
|
|
41
|
-
AppTitleComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: AppTitleComponent, selector: "app-title", inputs: { title: "title", multiple: "multiple", isFilterDisplay: "isFilterDisplay", icon: "icon", iconName: "iconName", displayType: "displayType", keyToPass: "keyToPass", fixOperationLevles: "fixOperationLevles", operators: "operators" }, outputs: { onOperatorClick: "onOperatorClick" }, ngImport: i0, template: "<div class=\"p-4 rounded-t-lg shadow-md dark:bg-gray-800 mx-2 mt-2 bg-sky-900\" *ngIf=\"displayType == 'chart'\">\n <h5 class=\"text-md font-bold tracking-tight text-white dark:border-b dark:pb-2 dark:border-gray-700 \">\n <i class=\"{{iconName}}\" *ngIf=\"icon\"></i> {{title}}\n </h5>\n</div>\n\n<!-- <app-card-header [title]=\"'Administration Highlights'\"></app-card-header>\n<div class=\"flex bg-white dark:bg-gray-800 p-4 rounded-b-lg mx-2 mb-2 \">\n</div> -->\n\n<div class=\"p-4 rounded-t-lg shadow-md dark:bg-gray-800 mx-2 mt-2 bg-sky-900\" *ngIf=\"displayType !== 'chart'\">\n <div class=\"flex justify-between dark:border-b\">\n <div class=\"flex items-center float-start\">\n <h5 class=\"text-md font-bold tracking-tight text-white dark:pb-2\">\n <i class=\"{{iconName}}\" *ngIf=\"icon\"></i> {{title}}\n </h5>\n </div>\n <div class=\"flex items-center float-end mb-2\" *ngIf=\"operator_display\">\n <!-- <div class=\"{{commonService.btn_primary_sm}} cursor-pointer\" (click)=\"getOperator(item)\">Advance Search</div> -->\n <ng-container *ngIf=\"isFilterDisplay\">\n <div class=\"{{commonService.badge_primary_sm}} cursor-pointer\" (click)=\"openSearchFilter()\">Search Filter</div>\n </ng-container>\n <ng-container *ngFor=\"let item of operatorsDatasource\">\n <div class=\"{{commonService.badge_primary_sm}} cursor-pointer\" (click)=\"getOperator(item)\">\n {{getCapitalize(item)}}\n </div>\n </ng-container>\n </div>\n </div>\n</div>\n\n\n\n<dx-popup [(visible)]=\"isSearchModal\" [closeOnOutsideClick]=\"true\" [dragEnabled]=\"false\" [height]=\"'32rem'\"\n [showTitle]=\"true\" [width]=\"1100\" class=\"popup \" title=\"Search\">\n <div *dxTemplate=\"let data of 'content' \">\n <!-- <app-gamma-filter-component [operators]=\"operatorsDatasource\"\n [fixOperationLevles]=\"fixoperationValue\"></app-gamma-filter-component> -->\n\n </div>\n</dx-popup>", styles: [""], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.DxTemplateDirective, selector: "[dxTemplate]", inputs: ["dxTemplateOf"] }, { kind: "component", type: i4.DxPopupComponent, selector: "dx-popup", inputs: ["accessKey", "animation", "closeOnOutsideClick", "container", "contentTemplate", "copyRootClassesToWrapper", "deferRendering", "disabled", "dragAndResizeArea", "dragEnabled", "dragOutsideBoundary", "elementAttr", "focusStateEnabled", "fullScreen", "height", "hideOnOutsideClick", "hideOnParentScroll", "hint", "hoverStateEnabled", "maxHeight", "maxWidth", "minHeight", "minWidth", "position", "resizeEnabled", "restorePosition", "rtlEnabled", "shading", "shadingColor", "showCloseButton", "showTitle", "tabIndex", "title", "titleTemplate", "toolbarItems", "visible", "width", "wrapperAttr"], outputs: ["onContentReady", "onDisposing", "onHidden", "onHiding", "onInitialized", "onOptionChanged", "onResize", "onResizeEnd", "onResizeStart", "onShowing", "onShown", "onTitleRendered", "accessKeyChange", "animationChange", "closeOnOutsideClickChange", "containerChange", "contentTemplateChange", "copyRootClassesToWrapperChange", "deferRenderingChange", "disabledChange", "dragAndResizeAreaChange", "dragEnabledChange", "dragOutsideBoundaryChange", "elementAttrChange", "focusStateEnabledChange", "fullScreenChange", "heightChange", "hideOnOutsideClickChange", "hideOnParentScrollChange", "hintChange", "hoverStateEnabledChange", "maxHeightChange", "maxWidthChange", "minHeightChange", "minWidthChange", "positionChange", "resizeEnabledChange", "restorePositionChange", "rtlEnabledChange", "shadingChange", "shadingColorChange", "showCloseButtonChange", "showTitleChange", "tabIndexChange", "titleChange", "titleTemplateChange", "toolbarItemsChange", "visibleChange", "widthChange", "wrapperAttrChange"] }] });
|
|
42
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: AppTitleComponent, decorators: [{
|
|
43
|
-
type: Component,
|
|
44
|
-
args: [{ selector: 'app-title', template: "<div class=\"p-4 rounded-t-lg shadow-md dark:bg-gray-800 mx-2 mt-2 bg-sky-900\" *ngIf=\"displayType == 'chart'\">\n <h5 class=\"text-md font-bold tracking-tight text-white dark:border-b dark:pb-2 dark:border-gray-700 \">\n <i class=\"{{iconName}}\" *ngIf=\"icon\"></i> {{title}}\n </h5>\n</div>\n\n<!-- <app-card-header [title]=\"'Administration Highlights'\"></app-card-header>\n<div class=\"flex bg-white dark:bg-gray-800 p-4 rounded-b-lg mx-2 mb-2 \">\n</div> -->\n\n<div class=\"p-4 rounded-t-lg shadow-md dark:bg-gray-800 mx-2 mt-2 bg-sky-900\" *ngIf=\"displayType !== 'chart'\">\n <div class=\"flex justify-between dark:border-b\">\n <div class=\"flex items-center float-start\">\n <h5 class=\"text-md font-bold tracking-tight text-white dark:pb-2\">\n <i class=\"{{iconName}}\" *ngIf=\"icon\"></i> {{title}}\n </h5>\n </div>\n <div class=\"flex items-center float-end mb-2\" *ngIf=\"operator_display\">\n <!-- <div class=\"{{commonService.btn_primary_sm}} cursor-pointer\" (click)=\"getOperator(item)\">Advance Search</div> -->\n <ng-container *ngIf=\"isFilterDisplay\">\n <div class=\"{{commonService.badge_primary_sm}} cursor-pointer\" (click)=\"openSearchFilter()\">Search Filter</div>\n </ng-container>\n <ng-container *ngFor=\"let item of operatorsDatasource\">\n <div class=\"{{commonService.badge_primary_sm}} cursor-pointer\" (click)=\"getOperator(item)\">\n {{getCapitalize(item)}}\n </div>\n </ng-container>\n </div>\n </div>\n</div>\n\n\n\n<dx-popup [(visible)]=\"isSearchModal\" [closeOnOutsideClick]=\"true\" [dragEnabled]=\"false\" [height]=\"'32rem'\"\n [showTitle]=\"true\" [width]=\"1100\" class=\"popup \" title=\"Search\">\n <div *dxTemplate=\"let data of 'content' \">\n <!-- <app-gamma-filter-component [operators]=\"operatorsDatasource\"\n [fixOperationLevles]=\"fixoperationValue\"></app-gamma-filter-component> -->\n\n </div>\n</dx-popup>" }]
|
|
45
|
-
}], ctorParameters: function () { return [{ type: i1.CommonService }]; }, propDecorators: { title: [{
|
|
46
|
-
type: Input
|
|
47
|
-
}], multiple: [{
|
|
48
|
-
type: Input
|
|
49
|
-
}], isFilterDisplay: [{
|
|
50
|
-
type: Input
|
|
51
|
-
}], icon: [{
|
|
52
|
-
type: Input
|
|
53
|
-
}], iconName: [{
|
|
54
|
-
type: Input
|
|
55
|
-
}], displayType: [{
|
|
56
|
-
type: Input
|
|
57
|
-
}], keyToPass: [{
|
|
58
|
-
type: Input
|
|
59
|
-
}], fixOperationLevles: [{
|
|
60
|
-
type: Input
|
|
61
|
-
}], onOperatorClick: [{
|
|
62
|
-
type: Output
|
|
63
|
-
}], operators: [{
|
|
64
|
-
type: Input,
|
|
65
|
-
args: ['operators']
|
|
66
|
-
}] } });
|
|
67
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRpdGxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dhbW1hLWFwcC1jb250cm9sbGVyL3NyYy9saWIvYXBwbGljYXRpb24tY29udHJvbGxlci9zaGFyZWQvYXBwLXRpdGxlL2FwcC10aXRsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nYW1tYS1hcHAtY29udHJvbGxlci9zcmMvbGliL2FwcGxpY2F0aW9uLWNvbnRyb2xsZXIvc2hhcmVkL2FwcC10aXRsZS9hcHAtdGl0bGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBeUIsTUFBTSxlQUFlLENBQUM7Ozs7OztBQVF0RyxNQUFNLE9BQU8saUJBQWlCO0lBd0M1QixZQUNTLGFBQTRCO1FBQTVCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBdEM1QixVQUFLLEdBQUcsU0FBUyxDQUFDO1FBQ2xCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFFMUIsU0FBSSxHQUFZLEtBQUssQ0FBQztRQU1kLG9CQUFlLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFLekUsa0JBQWEsR0FBWSxLQUFLLENBQUM7SUE0Qi9CLENBQUM7SUExQkQsSUFDSSxTQUFTLENBQUMsS0FBSztRQUNqQixJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDN0MsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztZQUNoQyxPQUFPO1NBQ1I7YUFBTTtZQUNMLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO1lBQzNDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFBO1lBQ3JDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUMsa0JBQWtCLENBQUE7WUFNakQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztTQUVoQztJQUVILENBQUM7SUFVRCxRQUFRO0lBQ1IsQ0FBQztJQXlCRCxhQUFhLENBQUMsSUFBWTtRQUN4QixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsa0NBQWtDLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDcEUsQ0FBQztJQUdELFdBQVcsQ0FBQyxJQUFJO1FBQ2QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELGdCQUFnQjtRQUNkLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO0lBQzVCLENBQUM7OzhHQXBGVSxpQkFBaUI7a0dBQWpCLGlCQUFpQixrVkNSOUIsbThEQXdDVzsyRkRoQ0UsaUJBQWlCO2tCQUw3QixTQUFTOytCQUNFLFdBQVc7b0dBT1osS0FBSztzQkFBYixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUVXLGVBQWU7c0JBQS9CLE1BQU07Z0JBUUgsU0FBUztzQkFEWixLQUFLO3VCQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBSZW5kZXJlcjIsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vblNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb21tb24nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtdGl0bGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vYXBwLXRpdGxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYXBwLXRpdGxlLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQXBwVGl0bGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBpc09wZXJhdG9yc3Zpc2libGU6IGJvb2xlYW47XG5cbiAgQElucHV0KCkgdGl0bGUgPSB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIG11bHRpcGxlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzRmlsdGVyRGlzcGxheTogYm9vbGVhbjtcbiAgQElucHV0KCkgaWNvbjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpY29uTmFtZTtcbiAgQElucHV0KCkgZGlzcGxheVR5cGU6IHN0cmluZztcbiAgQElucHV0KCkga2V5VG9QYXNzOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGZpeE9wZXJhdGlvbkxldmxlczogc3RyaW5nO1xuXG4gIEBPdXRwdXQoKSBwdWJsaWMgb25PcGVyYXRvckNsaWNrOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBvcGVyYXRvcnNEYXRhc291cmNlO1xuICBvcGVyYXRvcl9kaXNwbGF5O1xuICBmaXhvcGVyYXRpb25WYWx1ZTtcbiAgaXNTZWFyY2hNb2RhbDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgnb3BlcmF0b3JzJylcbiAgc2V0IG9wZXJhdG9ycyh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5pc09wZXJhdG9yc3Zpc2libGUgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vcGVyYXRvcnNEYXRhc291cmNlID0gdmFsdWUub3BlcmF0b3JzO1xuICAgICAgdGhpcy5vcGVyYXRvcl9kaXNwbGF5ID0gdmFsdWUuZGlzcGxheVxuICAgICAgdGhpcy5maXhvcGVyYXRpb25WYWx1ZSA9IHZhbHVlLmZpbHRlck9wZXJhdG9yRGF0YVxuICAgICAgLy8gdGhpcy5vcGVyYXRvcnNEYXRhc291cmNlID0gdmFsdWUuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgLy8gICBjb25zdCBrZXlzVG9SZW1vdmUgPSBPYmplY3Qua2V5cyhpdGVtKS5maWx0ZXIoa2V5ID0+IHRoaXMua2V5VG9QYXNzLmluY2x1ZGVzKGtleSkpO1xuICAgICAgLy8gICByZXR1cm4ga2V5c1RvUmVtb3ZlLmxlbmd0aCA9PT0gMDtcbiAgICAgIC8vIH0pO1xuXG4gICAgICB0aGlzLmlzT3BlcmF0b3JzdmlzaWJsZSA9IHRydWU7XG5cbiAgICB9XG5cbiAgfVxuXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGNvbW1vblNlcnZpY2U6IENvbW1vblNlcnZpY2VcbiAgKSB7XG4gICAgLy8gY29uc29sZS5sb2codGhpcy50aXRsZSk7XG5cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICB9XG5cbiAgLy8gZ2V0T2JqZWN0S2V5cyhvYmo6IGFueSk6IHN0cmluZ1tdIHtcbiAgLy8gICBsZXQga2V5cyA9ICBPYmplY3Qua2V5cyhvYmopO1xuICAvLyAgIGNvbnN0IGZpbHRlcmVkQXJyYXkgPSBrZXlzLmZpbHRlcihpdGVtID0+ICF0aGlzLmtleVRvUGFzcy5pbmNsdWRlcyhpdGVtKSk7XG5cbiAgLy8gICByZXR1cm4gZmlsdGVyZWRBcnJheTtcbiAgLy8gfVxuXG4gIC8vIGdldE9iamVjdEtleXMob2JqKSB7XG4gIC8vICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuXG4gIC8vICAgY29uc3QgZmlsdGVyZWRBcnJheSA9IGtleXMuZmlsdGVyKGl0ZW0gPT4gIXRoaXMua2V5VG9QYXNzLmluY2x1ZGVzKGl0ZW0pKTtcblxuICAvLyAgIC8vIENoZWNrIGlmIGFueSBrZXkncyB2YWx1ZSBpcyBudWxsXG4gIC8vICAgZm9yIChsZXQga2V5IG9mIGtleXMpIHtcbiAgLy8gICAgIGlmIChvYmpba2V5XSA9PT0gbnVsbCkge1xuICAvLyAgICAgICByZXR1cm4gZmlsdGVyZWRBcnJheTsgIC8vIFJldHVybiB0aGUgZmlsdGVyZWQgYXJyYXkgaWYgYW55IGtleSdzIHZhbHVlIGlzIG51bGxcbiAgLy8gICAgIH1cbiAgLy8gICB9XG5cbiAgLy8gICByZXR1cm4gW107ICAvLyBSZXR1cm4gZmFsc2UgaWYgbm8ga2V5J3MgdmFsdWUgaXMgbnVsbFxuICAvLyB9XG5cblxuICBnZXRDYXBpdGFsaXplKGl0ZW06IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmNvbW1vblNlcnZpY2UuY29udmVydFRvU3BhY2VTZXBhcmF0ZWRDYXBpdGFsaXplZChpdGVtKVxuICB9XG5cblxuICBnZXRPcGVyYXRvcihpdGVtKSB7XG4gICAgdGhpcy5vbk9wZXJhdG9yQ2xpY2suZW1pdChpdGVtKTtcbiAgfVxuXG4gIG9wZW5TZWFyY2hGaWx0ZXIoKSB7XG4gICAgdGhpcy5pc1NlYXJjaE1vZGFsID0gdHJ1ZTtcbiAgfVxuXG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJwLTQgcm91bmRlZC10LWxnIHNoYWRvdy1tZCBkYXJrOmJnLWdyYXktODAwICBteC0yIG10LTIgYmctc2t5LTkwMFwiICpuZ0lmPVwiZGlzcGxheVR5cGUgPT0gJ2NoYXJ0J1wiPlxuICA8aDUgY2xhc3M9XCJ0ZXh0LW1kIGZvbnQtYm9sZCB0cmFja2luZy10aWdodCB0ZXh0LXdoaXRlIGRhcms6Ym9yZGVyLWIgZGFyazpwYi0yIGRhcms6Ym9yZGVyLWdyYXktNzAwIFwiPlxuICAgIDxpIGNsYXNzPVwie3tpY29uTmFtZX19XCIgKm5nSWY9XCJpY29uXCI+PC9pPiAmbmJzcDt7e3RpdGxlfX1cbiAgPC9oNT5cbjwvZGl2PlxuXG48IS0tIDxhcHAtY2FyZC1oZWFkZXIgW3RpdGxlXT1cIidBZG1pbmlzdHJhdGlvbiBIaWdobGlnaHRzJ1wiPjwvYXBwLWNhcmQtaGVhZGVyPlxuPGRpdiBjbGFzcz1cImZsZXggYmctd2hpdGUgZGFyazpiZy1ncmF5LTgwMCBwLTQgcm91bmRlZC1iLWxnIG14LTIgbWItMiBcIj5cbjwvZGl2PiAtLT5cblxuPGRpdiBjbGFzcz1cInAtNCByb3VuZGVkLXQtbGcgc2hhZG93LW1kIGRhcms6YmctZ3JheS04MDAgIG14LTIgbXQtMiBiZy1za3ktOTAwXCIgKm5nSWY9XCJkaXNwbGF5VHlwZSAhPT0gJ2NoYXJ0J1wiPlxuICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWJldHdlZW4gZGFyazpib3JkZXItYlwiPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBmbG9hdC1zdGFydFwiPlxuICAgICAgPGg1IGNsYXNzPVwidGV4dC1tZCBmb250LWJvbGQgdHJhY2tpbmctdGlnaHQgdGV4dC13aGl0ZSBkYXJrOnBiLTJcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJ7e2ljb25OYW1lfX1cIiAqbmdJZj1cImljb25cIj48L2k+ICZuYnNwO3t7dGl0bGV9fVxuICAgICAgPC9oNT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZmxvYXQtZW5kIG1iLTJcIiAqbmdJZj1cIm9wZXJhdG9yX2Rpc3BsYXlcIj5cbiAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fcHJpbWFyeV9zbX19IGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImdldE9wZXJhdG9yKGl0ZW0pXCI+QWR2YW5jZSBTZWFyY2g8L2Rpdj4gLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNGaWx0ZXJEaXNwbGF5XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYmFkZ2VfcHJpbWFyeV9zbX19IGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cIm9wZW5TZWFyY2hGaWx0ZXIoKVwiPlNlYXJjaCBGaWx0ZXI8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBvcGVyYXRvcnNEYXRhc291cmNlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYmFkZ2VfcHJpbWFyeV9zbX19IGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImdldE9wZXJhdG9yKGl0ZW0pXCI+XG4gICAgICAgICAge3tnZXRDYXBpdGFsaXplKGl0ZW0pfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuXG5cbjxkeC1wb3B1cCBbKHZpc2libGUpXT1cImlzU2VhcmNoTW9kYWxcIiBbY2xvc2VPbk91dHNpZGVDbGlja109XCJ0cnVlXCIgW2RyYWdFbmFibGVkXT1cImZhbHNlXCIgW2hlaWdodF09XCInMzJyZW0nXCJcbiAgW3Nob3dUaXRsZV09XCJ0cnVlXCIgW3dpZHRoXT1cIjExMDBcIiBjbGFzcz1cInBvcHVwIFwiIHRpdGxlPVwiU2VhcmNoXCI+XG4gIDxkaXYgKmR4VGVtcGxhdGU9XCJsZXQgZGF0YSBvZiAnY29udGVudCcgXCI+XG4gICAgPCEtLSA8YXBwLWdhbW1hLWZpbHRlci1jb21wb25lbnQgW29wZXJhdG9yc109XCJvcGVyYXRvcnNEYXRhc291cmNlXCJcbiAgICAgIFtmaXhPcGVyYXRpb25MZXZsZXNdPVwiZml4b3BlcmF0aW9uVmFsdWVcIj48L2FwcC1nYW1tYS1maWx0ZXItY29tcG9uZW50PiAtLT5cblxuICA8L2Rpdj5cbjwvZHgtcG9wdXA+Il19
|