gamma-app-controller 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -0
- package/esm2020/gamma-app-controller.mjs +2 -0
- package/esm2020/lib/application-controller/app.http.service.mjs +24 -0
- package/esm2020/lib/application-controller/application-content.service.mjs +482 -0
- package/esm2020/lib/application-controller/application-controller.module.mjs +324 -0
- package/esm2020/lib/application-controller/application-dataset-call.service.mjs +321 -0
- package/esm2020/lib/application-controller/application-dataset-component/application-dataset/application-dataset.component.mjs +390 -0
- package/esm2020/lib/application-controller/application-dataset-component/create-dataset/create-dataset.component.mjs +349 -0
- package/esm2020/lib/application-controller/application-dataset-component/create-dataset-json/create-dataset-json.component.mjs +148 -0
- package/esm2020/lib/application-controller/application-dataset-component/create-dataset-sql/create-dataset-sql.component.mjs +167 -0
- package/esm2020/lib/application-controller/application-dataset-component/create-dataset-sql/sqlFormatter.mjs +17 -0
- package/esm2020/lib/application-controller/application-dataset-component/dataset-mongo/dataset-mongo.component.mjs +57 -0
- package/esm2020/lib/application-controller/application-dataset-component/dataset-query-bulder/dataset-query-bulder.component.mjs +409 -0
- package/esm2020/lib/application-controller/application-dataset-component/dataset-rest-api/dataset-rest-api.component.mjs +61 -0
- package/esm2020/lib/application-controller/application-filter/application-filter.component.mjs +186 -0
- package/esm2020/lib/application-controller/application-view-components/application-views/application-views.component.mjs +134 -0
- package/esm2020/lib/application-controller/application-view-components/create-comp-view/create-comp-view.component.mjs +559 -0
- package/esm2020/lib/application-controller/common-header/common-header.component.mjs +33 -0
- package/esm2020/lib/application-controller/common.mjs +1207 -0
- package/esm2020/lib/application-controller/environment.mjs +26 -0
- package/esm2020/lib/application-controller/kpi-comon-service.mjs +537 -0
- package/esm2020/lib/application-controller/kpi-service.mjs +108 -0
- package/esm2020/lib/application-controller/loading/loading.component.mjs +16 -0
- package/esm2020/lib/application-controller/loading/loadingModule.mjs +28 -0
- package/esm2020/lib/application-controller/moment-helper.mjs +4 -0
- package/esm2020/lib/application-controller/page-controller/page-config/page-config.component.mjs +977 -0
- package/esm2020/lib/application-controller/page-controller/page-controller/page-controller.component.mjs +172 -0
- package/esm2020/lib/application-controller/page-templates/cdr-config/cdr-config.component.mjs +227 -0
- package/esm2020/lib/application-controller/page-templates/dynamic-route-service.mjs +22 -0
- package/esm2020/lib/application-controller/shared/advanced-component/advance-widget-header-filter/advance-widget-header-filter.component.mjs +118 -0
- package/esm2020/lib/application-controller/shared/advanced-component/app-advance-header/app-header.component.mjs +181 -0
- package/esm2020/lib/application-controller/shared/advanced-component/gamm-single-number-card/gamm-single-number-card.component.mjs +71 -0
- package/esm2020/lib/application-controller/shared/advanced-component/gamma-advance-chart/gamma-advance-chart.component.mjs +266 -0
- package/esm2020/lib/application-controller/shared/advanced-component/gamma-advance-operator-table/gamma-advance-operator-table.component.mjs +159 -0
- package/esm2020/lib/application-controller/shared/advanced-component/gamma-table-clumn-bar-chart/gamma-table-clumn-bar-chart.component.mjs +144 -0
- package/esm2020/lib/application-controller/shared/advanced-component/gamma-table-with-percentage/contentSafeHtml.mjs +20 -0
- package/esm2020/lib/application-controller/shared/advanced-component/gamma-table-with-percentage/gamma-table-with-percentage.component.mjs +168 -0
- package/esm2020/lib/application-controller/shared/advanced-component/gamma-today-previous/gamma-today-previous.component.mjs +74 -0
- package/esm2020/lib/application-controller/shared/advanced-component/google-geo-map/google-geo-map.component.mjs +118 -0
- package/esm2020/lib/application-controller/shared/api.service.mjs +117 -0
- package/esm2020/lib/application-controller/shared/app-title/app-title.component.mjs +67 -0
- package/esm2020/lib/application-controller/shared/gamam-widget/gamam-widget.component.mjs +37 -0
- package/esm2020/lib/application-controller/shared/gamma-advance-filter/gamma-advance-filter.component.mjs +229 -0
- package/esm2020/lib/application-controller/shared/gamma-bread-crumbs/bread-crumbs.component.mjs +144 -0
- package/esm2020/lib/application-controller/shared/kpi-comon-service.mjs +537 -0
- package/esm2020/lib/application-controller/shared/loader/loader.component.mjs +14 -0
- package/esm2020/lib/application-controller/shared/loading/loading.component.mjs +16 -0
- package/esm2020/lib/application-controller/shared/loading/loadingModule.mjs +28 -0
- package/esm2020/lib/application-controller/shared/safeHtmlPipe.mjs +20 -0
- package/esm2020/lib/application-controller/support-components/dash-chart/dash-chart.component.mjs +294 -0
- package/esm2020/lib/application-controller/support-components/dash-table/dash-table.component.mjs +287 -0
- package/esm2020/lib/application-controller/support-components/geo-map/geo-map.component.mjs +255 -0
- package/esm2020/lib/application-controller/support-components/table-with-bar/table-with-bar.component.mjs +269 -0
- package/esm2020/lib/gamma-app-controller.component.mjs +16 -0
- package/esm2020/lib/gamma-app-controller.module.mjs +43 -0
- package/esm2020/lib/gamma-app-controller.service.mjs +20 -0
- package/esm2020/lib/icons.module.mjs +23 -0
- package/esm2020/public-api.mjs +49 -0
- package/fesm2015/gamma-app-controller.mjs +10250 -0
- package/fesm2015/gamma-app-controller.mjs.map +1 -0
- package/fesm2020/gamma-app-controller.mjs +10248 -0
- package/fesm2020/gamma-app-controller.mjs.map +1 -0
- package/index.d.ts +2 -0
- package/lib/application-controller/app.http.service.d.ts +15 -0
- package/lib/application-controller/application-content.service.d.ts +79 -0
- package/lib/application-controller/application-controller.module.d.ts +51 -0
- package/lib/application-controller/application-dataset-call.service.d.ts +20 -0
- package/lib/application-controller/application-dataset-component/application-dataset/application-dataset.component.d.ts +55 -0
- package/lib/application-controller/application-dataset-component/create-dataset/create-dataset.component.d.ts +121 -0
- package/lib/application-controller/application-dataset-component/create-dataset-json/create-dataset-json.component.d.ts +38 -0
- package/lib/application-controller/application-dataset-component/create-dataset-sql/create-dataset-sql.component.d.ts +42 -0
- package/lib/application-controller/application-dataset-component/create-dataset-sql/sqlFormatter.d.ts +7 -0
- package/lib/application-controller/application-dataset-component/dataset-mongo/dataset-mongo.component.d.ts +21 -0
- package/lib/application-controller/application-dataset-component/dataset-query-bulder/dataset-query-bulder.component.d.ts +62 -0
- package/lib/application-controller/application-dataset-component/dataset-rest-api/dataset-rest-api.component.d.ts +22 -0
- package/lib/application-controller/application-filter/application-filter.component.d.ts +36 -0
- package/lib/application-controller/application-view-components/application-views/application-views.component.d.ts +47 -0
- package/lib/application-controller/application-view-components/create-comp-view/create-comp-view.component.d.ts +73 -0
- package/lib/application-controller/common-header/common-header.component.d.ts +15 -0
- package/lib/application-controller/common.d.ts +148 -0
- package/lib/application-controller/environment.d.ts +25 -0
- package/lib/application-controller/kpi-comon-service.d.ts +14 -0
- package/lib/application-controller/kpi-service.d.ts +6 -0
- package/lib/application-controller/loading/loading.component.d.ts +9 -0
- package/lib/application-controller/loading/loadingModule.d.ts +10 -0
- package/lib/application-controller/moment-helper.d.ts +3 -0
- package/lib/application-controller/page-controller/page-config/page-config.component.d.ts +188 -0
- package/lib/application-controller/page-controller/page-controller/page-controller.component.d.ts +47 -0
- package/lib/application-controller/page-templates/cdr-config/cdr-config.component.d.ts +44 -0
- package/lib/application-controller/page-templates/dynamic-route-service.d.ts +8 -0
- package/lib/application-controller/shared/advanced-component/advance-widget-header-filter/advance-widget-header-filter.component.d.ts +33 -0
- package/lib/application-controller/shared/advanced-component/app-advance-header/app-header.component.d.ts +43 -0
- package/lib/application-controller/shared/advanced-component/gamm-single-number-card/gamm-single-number-card.component.d.ts +20 -0
- package/lib/application-controller/shared/advanced-component/gamma-advance-chart/gamma-advance-chart.component.d.ts +51 -0
- package/lib/application-controller/shared/advanced-component/gamma-advance-operator-table/gamma-advance-operator-table.component.d.ts +32 -0
- package/lib/application-controller/shared/advanced-component/gamma-table-clumn-bar-chart/gamma-table-clumn-bar-chart.component.d.ts +31 -0
- package/lib/application-controller/shared/advanced-component/gamma-table-with-percentage/contentSafeHtml.d.ts +10 -0
- package/lib/application-controller/shared/advanced-component/gamma-table-with-percentage/gamma-table-with-percentage.component.d.ts +26 -0
- package/lib/application-controller/shared/advanced-component/gamma-today-previous/gamma-today-previous.component.d.ts +21 -0
- package/lib/application-controller/shared/advanced-component/google-geo-map/google-geo-map.component.d.ts +29 -0
- package/lib/application-controller/shared/api.service.d.ts +26 -0
- package/lib/application-controller/shared/app-title/app-title.component.d.ts +28 -0
- package/lib/application-controller/shared/gamam-widget/gamam-widget.component.d.ts +20 -0
- package/lib/application-controller/shared/gamma-advance-filter/gamma-advance-filter.component.d.ts +45 -0
- package/lib/application-controller/shared/gamma-bread-crumbs/bread-crumbs.component.d.ts +32 -0
- package/lib/application-controller/shared/kpi-comon-service.d.ts +14 -0
- package/lib/application-controller/shared/loader/loader.component.d.ts +8 -0
- package/lib/application-controller/shared/loading/loading.component.d.ts +9 -0
- package/lib/application-controller/shared/loading/loadingModule.d.ts +10 -0
- package/lib/application-controller/shared/safeHtmlPipe.d.ts +10 -0
- package/lib/application-controller/support-components/dash-chart/dash-chart.component.d.ts +83 -0
- package/lib/application-controller/support-components/dash-table/dash-table.component.d.ts +67 -0
- package/lib/application-controller/support-components/geo-map/geo-map.component.d.ts +70 -0
- package/lib/application-controller/support-components/table-with-bar/table-with-bar.component.d.ts +70 -0
- package/lib/gamma-app-controller.component.d.ts +5 -0
- package/lib/gamma-app-controller.module.d.ts +10 -0
- package/lib/gamma-app-controller.service.d.ts +7 -0
- package/lib/icons.module.d.ts +11 -0
- package/package.json +33 -0
- package/public-api.d.ts +48 -0
package/esm2020/lib/application-controller/shared/gamma-bread-crumbs/bread-crumbs.component.mjs
ADDED
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { Component, Input } from "@angular/core";
|
|
2
|
+
import { environment } from "../../environment";
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/common";
|
|
5
|
+
import * as i2 from "@angular/router";
|
|
6
|
+
import * as i3 from "@angular/common/http";
|
|
7
|
+
import * as i4 from "../../common";
|
|
8
|
+
export class BreadCrumbsComponent {
|
|
9
|
+
constructor(location, router, http, activatedRoute, commonService) {
|
|
10
|
+
this.location = location;
|
|
11
|
+
this.router = router;
|
|
12
|
+
this.http = http;
|
|
13
|
+
this.activatedRoute = activatedRoute;
|
|
14
|
+
this.commonService = commonService;
|
|
15
|
+
this.kpiListData = [];
|
|
16
|
+
this.kpi_structures = {};
|
|
17
|
+
this.kpi_names = {};
|
|
18
|
+
this.data = [];
|
|
19
|
+
}
|
|
20
|
+
set kpi_data_container(value) {
|
|
21
|
+
if (value === undefined || value.length === 0) {
|
|
22
|
+
this.isBreadCrumbs = false;
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
let relativePath = 'rakpiBrowser';
|
|
27
|
+
this.getKpiName(value, relativePath);
|
|
28
|
+
setTimeout(() => {
|
|
29
|
+
this.loadBreadCrumbs();
|
|
30
|
+
}, 500);
|
|
31
|
+
this.isBreadCrumbs = true;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
ngOnInit() {
|
|
35
|
+
}
|
|
36
|
+
getKpiName(data, relativePath) {
|
|
37
|
+
data.forEach(result => {
|
|
38
|
+
const item = {};
|
|
39
|
+
let obj;
|
|
40
|
+
item['relativePath'] = relativePath;
|
|
41
|
+
if (result['nodes'] !== undefined) {
|
|
42
|
+
let childRelativePath = relativePath + '/' + result['name'];
|
|
43
|
+
this.getKpiName(result['nodes'], childRelativePath);
|
|
44
|
+
}
|
|
45
|
+
if (result['id']) {
|
|
46
|
+
obj = {
|
|
47
|
+
'name': result['name'],
|
|
48
|
+
'desc': result['desc'],
|
|
49
|
+
'relativePath': result['relativePath'],
|
|
50
|
+
'kpiId': result['id'],
|
|
51
|
+
'kpiGifUrl': environment.appUrl + environment.apiVersion + '/kpi/gif?id=' + result['id'],
|
|
52
|
+
'isBookmarked': result['isBookmarked'],
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
item['externalLink'] = relativePath + '/' + result['name'];
|
|
56
|
+
item['tid'] = result['tid'];
|
|
57
|
+
item['id'] = result['id'];
|
|
58
|
+
item['name'] = result['name'];
|
|
59
|
+
this.kpiListData.push(item);
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
getBreadCrumbsData(data) {
|
|
63
|
+
let structures = {};
|
|
64
|
+
data.forEach(result => {
|
|
65
|
+
const item = {};
|
|
66
|
+
item["relativePath"] = result.relativePath;
|
|
67
|
+
item["name"] = result["name"];
|
|
68
|
+
item["tid"] = result["tid"].trim();
|
|
69
|
+
if (result["nodes"] !== undefined) {
|
|
70
|
+
item["nodes"] = this.getBreadCrumbsData(result["nodes"]);
|
|
71
|
+
}
|
|
72
|
+
this.kpi_names[result["id"]] = item["tid"];
|
|
73
|
+
structures[result["tid"]] = item;
|
|
74
|
+
this.kpi_structures[result["tid"]] = item;
|
|
75
|
+
});
|
|
76
|
+
return structures;
|
|
77
|
+
}
|
|
78
|
+
loadBreadCrumbs() {
|
|
79
|
+
let kpiRoot = this.kpiBrowserName ? "fmskpi" : "rakpi";
|
|
80
|
+
let kpiContainer;
|
|
81
|
+
if (this.kpiListData.length > 0 || this.kpiListData != undefined) {
|
|
82
|
+
kpiContainer = this.getBreadCrumbsData(this.kpiListData);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
kpiContainer = this.getBreadCrumbsData(this.commonService.allKpibrowserDetailContainer);
|
|
86
|
+
}
|
|
87
|
+
const kpiId = this.activatedRoute.snapshot.queryParams['id'];
|
|
88
|
+
const kpiTid = this.kpi_names[kpiId];
|
|
89
|
+
const props = this.kpi_structures[kpiTid];
|
|
90
|
+
const propsList = props["relativePath"] + "/" + props["name"];
|
|
91
|
+
this.breadcrumbList = propsList.split("/");
|
|
92
|
+
if (this.location.path() !== "") {
|
|
93
|
+
let link = {};
|
|
94
|
+
this.breadcrumbLinksList = [];
|
|
95
|
+
for (let i = 0; i < this.breadcrumbList.length; i++) {
|
|
96
|
+
if (i == 0) {
|
|
97
|
+
if (!this.kpiBrowserName) {
|
|
98
|
+
link = {
|
|
99
|
+
name: this.breadcrumbList[i],
|
|
100
|
+
url: "/apps/raKpi/rakpiBrowser",
|
|
101
|
+
kpiName: "RA KPI Browser",
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
link = {
|
|
106
|
+
name: this.breadcrumbList[i],
|
|
107
|
+
url: "/apps/fmsKpi",
|
|
108
|
+
kpiName: "FMS KPI Browser",
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
let returnId = "";
|
|
114
|
+
for (let j = 0; j <= i; j++) {
|
|
115
|
+
if (j != 0) {
|
|
116
|
+
returnId += "/";
|
|
117
|
+
}
|
|
118
|
+
returnId += this.breadcrumbList[j];
|
|
119
|
+
}
|
|
120
|
+
link = {
|
|
121
|
+
name: this.breadcrumbList[i],
|
|
122
|
+
url: this.breadcrumbLinksList[i - 1]["url"],
|
|
123
|
+
id: this.breadcrumbList[i],
|
|
124
|
+
kpiName: this.breadcrumbList[i],
|
|
125
|
+
returnId: returnId,
|
|
126
|
+
};
|
|
127
|
+
this.commonService.global_kpi_name = this.breadcrumbList[i];
|
|
128
|
+
}
|
|
129
|
+
this.breadcrumbLinksList.push(link);
|
|
130
|
+
}
|
|
131
|
+
this.count = this.breadcrumbList.length;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
BreadCrumbsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: BreadCrumbsComponent, deps: [{ token: i1.Location }, { token: i2.Router }, { token: i3.HttpClient }, { token: i2.ActivatedRoute }, { token: i4.CommonService }], target: i0.ɵɵFactoryTarget.Component });
|
|
136
|
+
BreadCrumbsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.3", type: BreadCrumbsComponent, selector: "gamma-bread-crumbs", inputs: { kpi_data_container: "kpi_data_container" }, ngImport: i0, template: "<nav class=\"flex mt-1\" aria-label=\"Breadcrumb\" *ngIf=\"isBreadCrumbs\">\n <ol class=\"inline-flex items-center space-x-1 md:space-x-3\">\n <li class=\"inline-flex items-center cursor-pointer\" *ngFor=\"let breadcrumbLabel of breadcrumbLinksList;\">\n <a [routerLink]=\"breadcrumbLabel.url\" [queryParams]=\"{returnId: breadcrumbLabel.returnId }\"\n class=\"inline-flex items-center text-sm font-medium text-gray-700 hover:text-gray-900 dark:text-gray-400 dark:hover:text-white\">\n <svg class=\"w-6 h-6 text-gray-400\" fill=\"currentColor\" viewBox=\"0 0 20 20\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path fill-rule=\"evenodd\"\n d=\"M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z\"\n clip-rule=\"evenodd\"></path>\n </svg>\n {{breadcrumbLabel.kpiName}}\n </a>\n </li>\n </ol>\n</nav>", styles: [".breadcrumb{padding:0!important;margin-bottom:0!important;font-weight:400;font-size:12px}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }] });
|
|
137
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: BreadCrumbsComponent, decorators: [{
|
|
138
|
+
type: Component,
|
|
139
|
+
args: [{ selector: "gamma-bread-crumbs", template: "<nav class=\"flex mt-1\" aria-label=\"Breadcrumb\" *ngIf=\"isBreadCrumbs\">\n <ol class=\"inline-flex items-center space-x-1 md:space-x-3\">\n <li class=\"inline-flex items-center cursor-pointer\" *ngFor=\"let breadcrumbLabel of breadcrumbLinksList;\">\n <a [routerLink]=\"breadcrumbLabel.url\" [queryParams]=\"{returnId: breadcrumbLabel.returnId }\"\n class=\"inline-flex items-center text-sm font-medium text-gray-700 hover:text-gray-900 dark:text-gray-400 dark:hover:text-white\">\n <svg class=\"w-6 h-6 text-gray-400\" fill=\"currentColor\" viewBox=\"0 0 20 20\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path fill-rule=\"evenodd\"\n d=\"M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z\"\n clip-rule=\"evenodd\"></path>\n </svg>\n {{breadcrumbLabel.kpiName}}\n </a>\n </li>\n </ol>\n</nav>", styles: [".breadcrumb{padding:0!important;margin-bottom:0!important;font-weight:400;font-size:12px}\n"] }]
|
|
140
|
+
}], ctorParameters: function () { return [{ type: i1.Location }, { type: i2.Router }, { type: i3.HttpClient }, { type: i2.ActivatedRoute }, { type: i4.CommonService }]; }, propDecorators: { kpi_data_container: [{
|
|
141
|
+
type: Input,
|
|
142
|
+
args: ['kpi_data_container']
|
|
143
|
+
}] } });
|
|
144
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJlYWQtY3J1bWJzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dhbW1hLWFwcC1jb250cm9sbGVyL3NyYy9saWIvYXBwbGljYXRpb24tY29udHJvbGxlci9zaGFyZWQvZ2FtbWEtYnJlYWQtY3J1bWJzL2JyZWFkLWNydW1icy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nYW1tYS1hcHAtY29udHJvbGxlci9zcmMvbGliL2FwcGxpY2F0aW9uLWNvbnRyb2xsZXIvc2hhcmVkL2dhbW1hLWJyZWFkLWNydW1icy9icmVhZC1jcnVtYnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFLekQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDOzs7Ozs7QUFRaEQsTUFBTSxPQUFPLG9CQUFvQjtJQWdDL0IsWUFDVSxRQUFrQixFQUNsQixNQUFjLEVBQ2QsSUFBZ0IsRUFDaEIsY0FBOEIsRUFDOUIsYUFBNEI7UUFKNUIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNoQixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUEvQnRDLGdCQUFXLEdBQVEsRUFBRSxDQUFDO1FBQ3RCLG1CQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLGNBQVMsR0FBRyxFQUFFLENBQUM7UUFFZixTQUFJLEdBQUcsRUFBRSxDQUFDO0lBNEJOLENBQUM7SUF2QkwsSUFDSSxrQkFBa0IsQ0FBQyxLQUFLO1FBQzFCLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUM3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QkFDM0MsRUFBRSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO3dCQUMxQixPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7d0JBQy9CLFFBQVEsRUFBRSxRQUFRO3FCQUNuQixDQUFDO29CQUNGLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzdEO2dCQUNELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDckM7WUFDRCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDO1NBQ3pDO0lBQ0gsQ0FBQzs7aUhBOUpVLG9CQUFvQjtxR0FBcEIsb0JBQW9CLGdIQ2JqQyx5aENBZU07MkZERk8sb0JBQW9CO2tCQUxoQyxTQUFTOytCQUNFLG9CQUFvQjtzTUFvQjFCLGtCQUFrQjtzQkFEckIsS0FBSzt1QkFBQyxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgUm91dGVyLCBOYXZpZ2F0aW9uRXh0cmFzLCBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEhlYWRlcnMgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcbmltcG9ydCB7IENvbW1vblNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQgeyBlbnZpcm9ubWVudCB9IGZyb20gXCIuLi8uLi9lbnZpcm9ubWVudFwiO1xuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJnYW1tYS1icmVhZC1jcnVtYnNcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9icmVhZC1jcnVtYnMuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbXCIuL2JyZWFkLWNydW1icy5jb21wb25lbnQuc2Nzc1wiXSxcbn0pXG5leHBvcnQgY2xhc3MgQnJlYWRDcnVtYnNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIGJyZWFkY3J1bWJMaXN0O1xuICBicmVhZGNydW1iTGlua3NMaXN0O1xuICByb3V0ZTogc3RyaW5nO1xuICBjb3VudDogbnVtYmVyO1xuICBrcGlMaXN0RGF0YTogYW55ID0gW107XG4gIGtwaV9zdHJ1Y3R1cmVzID0ge307XG4gIGtwaV9uYW1lcyA9IHt9O1xuICBrcGlVcmxJRDtcbiAgZGF0YSA9IFtdO1xuXG4gIGtwaUJyb3dzZXJOYW1lOiBCb29sZWFuO1xuICBpc0JyZWFkQ3J1bWJzOiBCb29sZWFuO1xuXG4gIEBJbnB1dCgna3BpX2RhdGFfY29udGFpbmVyJylcbiAgc2V0IGtwaV9kYXRhX2NvbnRhaW5lcih2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5pc0JyZWFkQ3J1bWJzID0gZmFsc2U7XG4gICAgICAvLyB0aGlzLmFkZFJvbGVDb250YWluZXIgPSBbeyBcInR5cGVcIjogXCJ0ZXh0XCIsIFwidmFsdWVcIjogJycsIFwicm9sZWlkXCI6IFwicm93SWQwXCIgfV07XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoaXMua3BpTGlzdERhdGEgPSB2YWx1ZTtcbiAgICAgIGxldCByZWxhdGl2ZVBhdGggPSAncmFrcGlCcm93c2VyJztcbiAgICAgIHRoaXMuZ2V0S3BpTmFtZSh2YWx1ZSwgcmVsYXRpdmVQYXRoKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmxvYWRCcmVhZENydW1icygpO1xuICAgICAgfSwgNTAwKTtcbiAgICAgIHRoaXMuaXNCcmVhZENydW1icyA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBsb2NhdGlvbjogTG9jYXRpb24sXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSBjb21tb25TZXJ2aWNlOiBDb21tb25TZXJ2aWNlLFxuICApIHsgfVxuXG4gIG5nT25Jbml0KCkge1xuXG5cbiAgfVxuXG4gIGdldEtwaU5hbWUoZGF0YSwgcmVsYXRpdmVQYXRoKSB7XG5cbiAgICBkYXRhLmZvckVhY2gocmVzdWx0ID0+IHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB7fTtcbiAgICAgIGxldCBvYmo7XG4gICAgICBpdGVtWydyZWxhdGl2ZVBhdGgnXSA9IHJlbGF0aXZlUGF0aDtcblxuICAgICAgaWYgKHJlc3VsdFsnbm9kZXMnXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxldCBjaGlsZFJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlUGF0aCArICcvJyArIHJlc3VsdFsnbmFtZSddO1xuICAgICAgICB0aGlzLmdldEtwaU5hbWUocmVzdWx0Wydub2RlcyddLCBjaGlsZFJlbGF0aXZlUGF0aCk7XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0WydpZCddKSB7XG4gICAgICAgIG9iaiA9IHtcbiAgICAgICAgICAnbmFtZSc6IHJlc3VsdFsnbmFtZSddLFxuICAgICAgICAgICdkZXNjJzogcmVzdWx0WydkZXNjJ10sXG4gICAgICAgICAgJ3JlbGF0aXZlUGF0aCc6IHJlc3VsdFsncmVsYXRpdmVQYXRoJ10sXG4gICAgICAgICAgJ2twaUlkJzogcmVzdWx0WydpZCddLFxuICAgICAgICAgICdrcGlHaWZVcmwnOiBlbnZpcm9ubWVudC5hcHBVcmwgKyBlbnZpcm9ubWVudC5hcGlWZXJzaW9uICsgJy9rcGkvZ2lmP2lkPScgKyByZXN1bHRbJ2lkJ10sXG4gICAgICAgICAgJ2lzQm9va21hcmtlZCc6IHJlc3VsdFsnaXNCb29rbWFya2VkJ10sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpdGVtWydleHRlcm5hbExpbmsnXSA9IHJlbGF0aXZlUGF0aCArICcvJyArIHJlc3VsdFsnbmFtZSddXG4gICAgICBpdGVtWyd0aWQnXSA9IHJlc3VsdFsndGlkJ107XG4gICAgICBpdGVtWydpZCddID0gcmVzdWx0WydpZCddO1xuICAgICAgaXRlbVsnbmFtZSddID0gcmVzdWx0WyduYW1lJ107XG5cbiAgICAgIHRoaXMua3BpTGlzdERhdGEucHVzaChpdGVtKTtcbiAgICB9KTtcblxuICB9XG5cblxuICBnZXRCcmVhZENydW1ic0RhdGEoZGF0YSkge1xuICAgIGxldCBzdHJ1Y3R1cmVzID0ge307XG4gICAgZGF0YS5mb3JFYWNoKHJlc3VsdCA9PiB7XG4gICAgICBjb25zdCBpdGVtOiBvYmplY3QgPSB7fTtcbiAgICAgIGl0ZW1bXCJyZWxhdGl2ZVBhdGhcIl0gPSByZXN1bHQucmVsYXRpdmVQYXRoO1xuICAgICAgaXRlbVtcIm5hbWVcIl0gPSByZXN1bHRbXCJuYW1lXCJdO1xuICAgICAgaXRlbVtcInRpZFwiXSA9IHJlc3VsdFtcInRpZFwiXS50cmltKCk7XG4gICAgICBpZiAocmVzdWx0W1wibm9kZXNcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpdGVtW1wibm9kZXNcIl0gPSB0aGlzLmdldEJyZWFkQ3J1bWJzRGF0YShcbiAgICAgICAgICByZXN1bHRbXCJub2Rlc1wiXVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5rcGlfbmFtZXNbcmVzdWx0W1wiaWRcIl1dID0gaXRlbVtcInRpZFwiXTtcblxuICAgICAgc3RydWN0dXJlc1tyZXN1bHRbXCJ0aWRcIl1dID0gaXRlbTtcbiAgICAgIHRoaXMua3BpX3N0cnVjdHVyZXNbcmVzdWx0W1widGlkXCJdXSA9IGl0ZW07XG4gICAgfSk7XG4gICAgcmV0dXJuIHN0cnVjdHVyZXM7XG4gIH1cblxuICBsb2FkQnJlYWRDcnVtYnMoKSB7XG5cbiAgICBsZXQga3BpUm9vdCA9IHRoaXMua3BpQnJvd3Nlck5hbWUgPyBcImZtc2twaVwiIDogXCJyYWtwaVwiO1xuICAgIGxldCBrcGlDb250YWluZXI7XG4gICAgLy8gY29uc3QgbmF2dXJsID0gdGhpcy5yb3V0ZXIudXJsLnNwbGl0KFwiP1wiKTtcbiAgICAvLyBsZXQgdXJsID0gbmF2dXJsWzBdLnNwbGl0KFwiL1wiKTtcbiAgICAvLyB0aGlzLmtwaVVybElEID0gdXJsLnNsaWNlKC0xKS5wb3AoKTtcblxuICAgIGlmICh0aGlzLmtwaUxpc3REYXRhLmxlbmd0aCA+IDAgfHwgdGhpcy5rcGlMaXN0RGF0YSAhPSB1bmRlZmluZWQpIHtcbiAgICAgIGtwaUNvbnRhaW5lciA9IHRoaXMuZ2V0QnJlYWRDcnVtYnNEYXRhKHRoaXMua3BpTGlzdERhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBrcGlDb250YWluZXIgPSB0aGlzLmdldEJyZWFkQ3J1bWJzRGF0YShcbiAgICAgICAgdGhpcy5jb21tb25TZXJ2aWNlLmFsbEtwaWJyb3dzZXJEZXRhaWxDb250YWluZXIsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBrcGlJZCA9IHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXNbJ2lkJ107XG4gICAgY29uc3Qga3BpVGlkID0gdGhpcy5rcGlfbmFtZXNba3BpSWRdO1xuICAgIGNvbnN0IHByb3BzID0gdGhpcy5rcGlfc3RydWN0dXJlc1trcGlUaWRdO1xuICAgIGNvbnN0IHByb3BzTGlzdCA9IHByb3BzW1wicmVsYXRpdmVQYXRoXCJdICsgXCIvXCIgKyBwcm9wc1tcIm5hbWVcIl07XG4gICAgdGhpcy5icmVhZGNydW1iTGlzdCA9IHByb3BzTGlzdC5zcGxpdChcIi9cIik7XG5cbiAgICBpZiAodGhpcy5sb2NhdGlvbi5wYXRoKCkgIT09IFwiXCIpIHtcbiAgICAgIGxldCBsaW5rID0ge307XG4gICAgICB0aGlzLmJyZWFkY3J1bWJMaW5rc0xpc3QgPSBbXTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmJyZWFkY3J1bWJMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChpID09IDApIHtcbiAgICAgICAgICBpZiAoIXRoaXMua3BpQnJvd3Nlck5hbWUpIHtcbiAgICAgICAgICAgIGxpbmsgPSB7XG4gICAgICAgICAgICAgIG5hbWU6IHRoaXMuYnJlYWRjcnVtYkxpc3RbaV0sXG4gICAgICAgICAgICAgIHVybDogXCIvYXBwcy9yYUtwaS9yYWtwaUJyb3dzZXJcIixcbiAgICAgICAgICAgICAga3BpTmFtZTogXCJSQSBLUEkgQnJvd3NlclwiLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGluayA9IHtcbiAgICAgICAgICAgICAgbmFtZTogdGhpcy5icmVhZGNydW1iTGlzdFtpXSxcbiAgICAgICAgICAgICAgdXJsOiBcIi9hcHBzL2Ztc0twaVwiLFxuICAgICAgICAgICAgICBrcGlOYW1lOiBcIkZNUyBLUEkgQnJvd3NlclwiLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGV0IHJldHVybklkID0gXCJcIjtcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8PSBpOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChqICE9IDApIHtcbiAgICAgICAgICAgICAgcmV0dXJuSWQgKz0gXCIvXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm5JZCArPSB0aGlzLmJyZWFkY3J1bWJMaXN0W2pdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsaW5rID0ge1xuICAgICAgICAgICAgbmFtZTogdGhpcy5icmVhZGNydW1iTGlzdFtpXSxcbiAgICAgICAgICAgIHVybDogdGhpcy5icmVhZGNydW1iTGlua3NMaXN0W2kgLSAxXVtcInVybFwiXSxcbiAgICAgICAgICAgIGlkOiB0aGlzLmJyZWFkY3J1bWJMaXN0W2ldLFxuICAgICAgICAgICAga3BpTmFtZTogdGhpcy5icmVhZGNydW1iTGlzdFtpXSxcbiAgICAgICAgICAgIHJldHVybklkOiByZXR1cm5JZCxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMuY29tbW9uU2VydmljZS5nbG9iYWxfa3BpX25hbWUgPSB0aGlzLmJyZWFkY3J1bWJMaXN0W2ldO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYnJlYWRjcnVtYkxpbmtzTGlzdC5wdXNoKGxpbmspO1xuICAgICAgfVxuICAgICAgdGhpcy5jb3VudCA9IHRoaXMuYnJlYWRjcnVtYkxpc3QubGVuZ3RoO1xuICAgIH1cbiAgfVxufVxuIiwiPG5hdiBjbGFzcz1cImZsZXggbXQtMVwiIGFyaWEtbGFiZWw9XCJCcmVhZGNydW1iXCIgKm5nSWY9XCJpc0JyZWFkQ3J1bWJzXCI+XG4gICAgPG9sIGNsYXNzPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIHNwYWNlLXgtMSBtZDpzcGFjZS14LTNcIj5cbiAgICAgICAgPGxpIGNsYXNzPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGN1cnNvci1wb2ludGVyXCIgKm5nRm9yPVwibGV0IGJyZWFkY3J1bWJMYWJlbCBvZiBicmVhZGNydW1iTGlua3NMaXN0O1wiPlxuICAgICAgICAgICAgPGEgW3JvdXRlckxpbmtdPVwiYnJlYWRjcnVtYkxhYmVsLnVybFwiIFtxdWVyeVBhcmFtc109XCJ7cmV0dXJuSWQ6IGJyZWFkY3J1bWJMYWJlbC5yZXR1cm5JZCB9XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheS03MDAgaG92ZXI6dGV4dC1ncmF5LTkwMCBkYXJrOnRleHQtZ3JheS00MDAgZGFyazpob3Zlcjp0ZXh0LXdoaXRlXCI+XG4gICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cInctNiBoLTYgdGV4dC1ncmF5LTQwMFwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcbiAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNy4yOTMgMTQuNzA3YTEgMSAwIDAxMC0xLjQxNEwxMC41ODYgMTAgNy4yOTMgNi43MDdhMSAxIDAgMDExLjQxNC0xLjQxNGw0IDRhMSAxIDAgMDEwIDEuNDE0bC00IDRhMSAxIDAgMDEtMS40MTQgMHpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xpcC1ydWxlPVwiZXZlbm9kZFwiPjwvcGF0aD5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICB7e2JyZWFkY3J1bWJMYWJlbC5rcGlOYW1lfX1cbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgPC9saT5cbiAgICA8L29sPlxuPC9uYXY+Il19
|