gamma-app-controller 1.1.26 → 1.1.27

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.
Files changed (119) hide show
  1. package/esm2020/lib/application-controller/application-controller.module.mjs +20 -20
  2. package/esm2020/lib/application-controller/application-dataset-component/application-dataset/application-dataset.component.mjs +1 -1
  3. package/esm2020/lib/application-controller/application-dataset-component/create-dataset/create-dataset.component.mjs +1 -1
  4. package/esm2020/lib/application-controller/application-filter/application-filter.component.mjs +1 -1
  5. package/esm2020/lib/application-controller/application-menu-controller/application-menus/application-menus.component.mjs +1 -1
  6. package/esm2020/lib/application-controller/application-metric-config/all-metrics-config/all-metrics-config.component.mjs +1 -1
  7. package/esm2020/lib/application-controller/application-metric-config/create-metrics/create-metrics.component.mjs +1 -1
  8. package/esm2020/lib/application-controller/application-view-components/application-views/application-views.component.mjs +1 -1
  9. package/esm2020/lib/application-controller/application-view-components/create-comp-view/create-comp-view.component.mjs +1 -1
  10. package/esm2020/lib/application-controller/page-controller/page-config/page-config.component.mjs +11 -11
  11. package/esm2020/lib/application-controller/page-controller/page-config-multi-layout/page-config-multi-layout.component.mjs +10 -10
  12. package/esm2020/lib/application-controller/page-controller/page-controller/page-controller.component.mjs +1 -1
  13. package/esm2020/lib/application-controller/support-components/dash-chart/dash-chart.component.mjs +1 -1
  14. package/esm2020/lib/application-controller/support-components/dash-table/dash-table.component.mjs +1 -1
  15. package/esm2020/lib/application-controller/support-components/dash-today-previous/dash-today-previous.component.mjs +1 -1
  16. package/esm2020/lib/application-controller/support-components/geo-map/geo-map.component.mjs +2 -2
  17. package/esm2020/lib/application-controller/support-components/heat-map/heat-map.component.mjs +1 -1
  18. package/esm2020/lib/application-controller/support-components/single-card/single-card.component.mjs +1 -1
  19. package/esm2020/lib/application-controller/support-components/table-with-bar/table-with-bar.component.mjs +2 -2
  20. package/esm2020/lib/shared/advanced-component/advance-widget-header-filter/advance-widget-header-filter.component.mjs +116 -0
  21. package/esm2020/lib/shared/advanced-component/app-advance-header/app-header.component.mjs +306 -0
  22. package/esm2020/lib/shared/advanced-component/gamm-single-number-card/gamm-single-number-card.component.mjs +80 -0
  23. package/esm2020/lib/shared/advanced-component/gamma-advance-chart/gamma-advance-chart.component.mjs +379 -0
  24. package/esm2020/lib/shared/advanced-component/gamma-advance-operator-table/gamma-advance-operator-table.component.mjs +188 -0
  25. package/esm2020/lib/shared/advanced-component/gamma-geo-chart/gamma-geo-chart.component.mjs +435 -0
  26. package/esm2020/lib/shared/advanced-component/gamma-heatmap/gamma-heatmap.component.mjs +334 -0
  27. package/esm2020/lib/shared/advanced-component/gamma-table-clumn-bar-chart/gamma-table-clumn-bar-chart.component.mjs +155 -0
  28. package/esm2020/lib/shared/advanced-component/gamma-table-with-percentage/contentSafeHtml.mjs +20 -0
  29. package/esm2020/lib/shared/advanced-component/gamma-table-with-percentage/gamma-table-with-percentage.component.mjs +187 -0
  30. package/esm2020/lib/shared/advanced-component/gamma-today-previous/gamma-today-previous.component.mjs +86 -0
  31. package/esm2020/lib/shared/advanced-component/google-geo-map/google-geo-map.component.mjs +439 -0
  32. package/esm2020/lib/shared/app-title/app-title.component.mjs +67 -0
  33. package/esm2020/lib/shared/gamam-widget/gamam-widget.component.mjs +35 -0
  34. package/esm2020/lib/shared/gamma-advance-filter/gamma-advance-filter.component.mjs +273 -0
  35. package/esm2020/lib/shared/gamma-bread-crumbs/bread-crumbs.component.mjs +142 -0
  36. package/esm2020/lib/shared/kpi-comon-service.mjs +537 -0
  37. package/esm2020/lib/{application-controller/shared → shared}/loader/loader.component.mjs +1 -1
  38. package/esm2020/lib/{application-controller/shared → shared}/loading/loading.component.mjs +1 -1
  39. package/esm2020/lib/shared/loading/loadingModule.mjs +28 -0
  40. package/esm2020/lib/shared/safeHtmlPipe.mjs +20 -0
  41. package/esm2020/lib/template-module/KpiCreationModule/create-kpi-tree.component.mjs +1 -1
  42. package/esm2020/lib/template-module/KpiCreationModule/kpiCreation.module.mjs +2 -2
  43. package/esm2020/lib/template-module/bookmarked-template/bookmarked-template.component.mjs +816 -0
  44. package/esm2020/lib/template-module/bookmarked-template/bookmarkedTemplate.module.mjs +149 -0
  45. package/esm2020/lib/template-module/cdrConfigModule/cdr-config.component.mjs +1 -1
  46. package/esm2020/lib/template-module/cdrConfigModule/cdrConfig.module.mjs +2 -2
  47. package/esm2020/lib/template-module/defaulLandingComponent/defaultLandingComponent.module.mjs +149 -0
  48. package/esm2020/lib/template-module/defaulLandingComponent/landing-component.component.mjs +870 -0
  49. package/esm2020/lib/template-module/exceptionConfigModule/exception-operation.component.mjs +1 -1
  50. package/esm2020/lib/template-module/exceptionConfigModule/exceptionConfig.module.mjs +2 -2
  51. package/esm2020/lib/template-module/kpiWithMultiLayout/dynamin-modal-multi.component.mjs +180 -0
  52. package/esm2020/lib/template-module/kpiWithMultiLayout/kpi-with-multilayout.component.mjs +992 -0
  53. package/esm2020/lib/template-module/kpiWithMultiLayout/kpiWithMultiayout.module.mjs +154 -0
  54. package/esm2020/lib/template-module/kpiWithSingleLayout/dynamin-modal.component.mjs +180 -0
  55. package/esm2020/lib/template-module/kpiWithSingleLayout/kpi-with-dataset.component.mjs +1046 -0
  56. package/esm2020/lib/template-module/kpiWithSingleLayout/kpiWithSingleLayout.module.mjs +154 -0
  57. package/esm2020/public-api.mjs +30 -20
  58. package/fesm2015/gamma-app-controller.mjs +5121 -399
  59. package/fesm2015/gamma-app-controller.mjs.map +1 -1
  60. package/fesm2020/gamma-app-controller.mjs +5082 -399
  61. package/fesm2020/gamma-app-controller.mjs.map +1 -1
  62. package/lib/application-controller/application-controller.module.d.ts +19 -19
  63. package/lib/application-controller/page-controller/page-config/page-config.component.d.ts +9 -9
  64. package/lib/application-controller/page-controller/page-config-multi-layout/page-config-multi-layout.component.d.ts +8 -8
  65. package/lib/{application-controller/shared → shared}/advanced-component/app-advance-header/app-header.component.d.ts +18 -2
  66. package/lib/{application-controller/shared → shared}/advanced-component/gamm-single-number-card/gamm-single-number-card.component.d.ts +3 -5
  67. package/lib/{application-controller/shared → shared}/advanced-component/gamma-advance-chart/gamma-advance-chart.component.d.ts +3 -1
  68. package/lib/{application-controller/shared → shared}/advanced-component/gamma-advance-operator-table/gamma-advance-operator-table.component.d.ts +4 -2
  69. package/lib/{application-controller/shared → shared}/advanced-component/gamma-geo-chart/gamma-geo-chart.component.d.ts +1 -1
  70. package/lib/{application-controller/shared → shared}/advanced-component/gamma-heatmap/gamma-heatmap.component.d.ts +1 -1
  71. package/lib/{application-controller/shared → shared}/advanced-component/gamma-table-clumn-bar-chart/gamma-table-clumn-bar-chart.component.d.ts +1 -1
  72. package/lib/{application-controller/shared → shared}/advanced-component/gamma-table-with-percentage/gamma-table-with-percentage.component.d.ts +6 -2
  73. package/lib/{application-controller/shared → shared}/advanced-component/gamma-today-previous/gamma-today-previous.component.d.ts +1 -1
  74. package/lib/{application-controller/shared → shared}/advanced-component/google-geo-map/google-geo-map.component.d.ts +1 -1
  75. package/lib/{application-controller/shared → shared}/app-title/app-title.component.d.ts +1 -1
  76. package/lib/{application-controller/shared → shared}/gamam-widget/gamam-widget.component.d.ts +1 -1
  77. package/lib/{application-controller/shared → shared}/gamma-advance-filter/gamma-advance-filter.component.d.ts +3 -2
  78. package/lib/{application-controller/shared → shared}/gamma-bread-crumbs/bread-crumbs.component.d.ts +1 -1
  79. package/lib/{application-controller/shared → shared}/kpi-comon-service.d.ts +1 -1
  80. package/lib/template-module/KpiCreationModule/kpiCreation.module.d.ts +1 -1
  81. package/lib/template-module/bookmarked-template/bookmarked-template.component.d.ts +109 -0
  82. package/lib/template-module/bookmarked-template/bookmarkedTemplate.module.d.ts +16 -0
  83. package/lib/template-module/cdrConfigModule/cdrConfig.module.d.ts +1 -1
  84. package/lib/template-module/defaulLandingComponent/defaultLandingComponent.module.d.ts +16 -0
  85. package/lib/template-module/defaulLandingComponent/landing-component.component.d.ts +109 -0
  86. package/lib/template-module/exceptionConfigModule/exceptionConfig.module.d.ts +1 -1
  87. package/lib/template-module/kpiWithMultiLayout/dynamin-modal-multi.component.d.ts +42 -0
  88. package/lib/template-module/kpiWithMultiLayout/kpi-with-multilayout.component.d.ts +117 -0
  89. package/lib/template-module/kpiWithMultiLayout/kpiWithMultiayout.module.d.ts +17 -0
  90. package/lib/template-module/kpiWithSingleLayout/dynamin-modal.component.d.ts +42 -0
  91. package/lib/template-module/kpiWithSingleLayout/kpi-with-dataset.component.d.ts +122 -0
  92. package/lib/template-module/kpiWithSingleLayout/kpiWithSingleLayout.module.d.ts +17 -0
  93. package/package.json +1 -1
  94. package/public-api.d.ts +29 -19
  95. package/esm2020/lib/application-controller/shared/advanced-component/advance-widget-header-filter/advance-widget-header-filter.component.mjs +0 -124
  96. package/esm2020/lib/application-controller/shared/advanced-component/app-advance-header/app-header.component.mjs +0 -220
  97. package/esm2020/lib/application-controller/shared/advanced-component/gamm-single-number-card/gamm-single-number-card.component.mjs +0 -95
  98. package/esm2020/lib/application-controller/shared/advanced-component/gamma-advance-chart/gamma-advance-chart.component.mjs +0 -362
  99. package/esm2020/lib/application-controller/shared/advanced-component/gamma-advance-operator-table/gamma-advance-operator-table.component.mjs +0 -177
  100. package/esm2020/lib/application-controller/shared/advanced-component/gamma-geo-chart/gamma-geo-chart.component.mjs +0 -441
  101. package/esm2020/lib/application-controller/shared/advanced-component/gamma-heatmap/gamma-heatmap.component.mjs +0 -328
  102. package/esm2020/lib/application-controller/shared/advanced-component/gamma-table-clumn-bar-chart/gamma-table-clumn-bar-chart.component.mjs +0 -155
  103. package/esm2020/lib/application-controller/shared/advanced-component/gamma-table-with-percentage/contentSafeHtml.mjs +0 -20
  104. package/esm2020/lib/application-controller/shared/advanced-component/gamma-table-with-percentage/gamma-table-with-percentage.component.mjs +0 -157
  105. package/esm2020/lib/application-controller/shared/advanced-component/gamma-today-previous/gamma-today-previous.component.mjs +0 -85
  106. package/esm2020/lib/application-controller/shared/advanced-component/google-geo-map/google-geo-map.component.mjs +0 -439
  107. package/esm2020/lib/application-controller/shared/app-title/app-title.component.mjs +0 -67
  108. package/esm2020/lib/application-controller/shared/gamam-widget/gamam-widget.component.mjs +0 -35
  109. package/esm2020/lib/application-controller/shared/gamma-advance-filter/gamma-advance-filter.component.mjs +0 -237
  110. package/esm2020/lib/application-controller/shared/gamma-bread-crumbs/bread-crumbs.component.mjs +0 -142
  111. package/esm2020/lib/application-controller/shared/kpi-comon-service.mjs +0 -537
  112. package/esm2020/lib/application-controller/shared/loading/loadingModule.mjs +0 -28
  113. package/esm2020/lib/application-controller/shared/safeHtmlPipe.mjs +0 -20
  114. /package/lib/{application-controller/shared → shared}/advanced-component/advance-widget-header-filter/advance-widget-header-filter.component.d.ts +0 -0
  115. /package/lib/{application-controller/shared → shared}/advanced-component/gamma-table-with-percentage/contentSafeHtml.d.ts +0 -0
  116. /package/lib/{application-controller/shared → shared}/loader/loader.component.d.ts +0 -0
  117. /package/lib/{application-controller/shared → shared}/loading/loading.component.d.ts +0 -0
  118. /package/lib/{application-controller/shared → shared}/loading/loadingModule.d.ts +0 -0
  119. /package/lib/{application-controller/shared → shared}/safeHtmlPipe.d.ts +0 -0
@@ -0,0 +1,142 @@
1
+ import { Component, Input } from "@angular/core";
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common";
4
+ import * as i2 from "@angular/router";
5
+ import * as i3 from "@angular/common/http";
6
+ import * as i4 from "../../application-controller/common";
7
+ export class BreadCrumbsComponent {
8
+ constructor(location, router, http, activatedRoute, commonService) {
9
+ this.location = location;
10
+ this.router = router;
11
+ this.http = http;
12
+ this.activatedRoute = activatedRoute;
13
+ this.commonService = commonService;
14
+ this.kpiListData = [];
15
+ this.kpi_structures = {};
16
+ this.kpi_names = {};
17
+ this.data = [];
18
+ }
19
+ set kpi_data_container(value) {
20
+ if (value === undefined || value.length === 0) {
21
+ this.isBreadCrumbs = false;
22
+ return;
23
+ }
24
+ else {
25
+ let relativePath = 'rakpiBrowser';
26
+ this.getKpiName(value, relativePath);
27
+ setTimeout(() => {
28
+ this.loadBreadCrumbs();
29
+ }, 500);
30
+ this.isBreadCrumbs = true;
31
+ }
32
+ }
33
+ ngOnInit() {
34
+ }
35
+ getKpiName(data, relativePath) {
36
+ data.forEach(result => {
37
+ const item = {};
38
+ let obj;
39
+ item['relativePath'] = relativePath;
40
+ if (result['nodes'] !== undefined) {
41
+ let childRelativePath = relativePath + '/' + result['name'];
42
+ this.getKpiName(result['nodes'], childRelativePath);
43
+ }
44
+ if (result['id']) {
45
+ obj = {
46
+ 'name': result['name'],
47
+ 'desc': result['desc'],
48
+ 'relativePath': result['relativePath'],
49
+ 'kpiId': result['id'],
50
+ 'isBookmarked': result['isBookmarked'],
51
+ };
52
+ }
53
+ item['externalLink'] = relativePath + '/' + result['name'];
54
+ item['tid'] = result['tid'];
55
+ item['id'] = result['id'];
56
+ item['name'] = result['name'];
57
+ this.kpiListData.push(item);
58
+ });
59
+ }
60
+ getBreadCrumbsData(data) {
61
+ let structures = {};
62
+ data.forEach(result => {
63
+ const item = {};
64
+ item["relativePath"] = result.relativePath;
65
+ item["name"] = result["name"];
66
+ item["tid"] = result["tid"].trim();
67
+ if (result["nodes"] !== undefined) {
68
+ item["nodes"] = this.getBreadCrumbsData(result["nodes"]);
69
+ }
70
+ this.kpi_names[result["id"]] = item["tid"];
71
+ structures[result["tid"]] = item;
72
+ this.kpi_structures[result["tid"]] = item;
73
+ });
74
+ return structures;
75
+ }
76
+ loadBreadCrumbs() {
77
+ let kpiRoot = this.kpiBrowserName ? "fmskpi" : "rakpi";
78
+ let kpiContainer;
79
+ if (this.kpiListData.length > 0 || this.kpiListData != undefined) {
80
+ kpiContainer = this.getBreadCrumbsData(this.kpiListData);
81
+ }
82
+ else {
83
+ kpiContainer = this.getBreadCrumbsData(this.commonService.allKpibrowserDetailContainer);
84
+ }
85
+ const kpiId = this.activatedRoute.snapshot.queryParams['id'];
86
+ const kpiTid = this.kpi_names[kpiId];
87
+ const props = this.kpi_structures[kpiTid];
88
+ const propsList = props["relativePath"] + "/" + props["name"];
89
+ this.breadcrumbList = propsList.split("/");
90
+ if (this.location.path() !== "") {
91
+ let link = {};
92
+ this.breadcrumbLinksList = [];
93
+ for (let i = 0; i < this.breadcrumbList.length; i++) {
94
+ if (i == 0) {
95
+ if (!this.kpiBrowserName) {
96
+ link = {
97
+ name: this.breadcrumbList[i],
98
+ url: "/apps/raKpi/rakpiBrowser",
99
+ kpiName: "RA KPI Browser",
100
+ };
101
+ }
102
+ else {
103
+ link = {
104
+ name: this.breadcrumbList[i],
105
+ url: "/apps/fmsKpi",
106
+ kpiName: "FMS KPI Browser",
107
+ };
108
+ }
109
+ }
110
+ else {
111
+ let returnId = "";
112
+ for (let j = 0; j <= i; j++) {
113
+ if (j != 0) {
114
+ returnId += "/";
115
+ }
116
+ returnId += this.breadcrumbList[j];
117
+ }
118
+ link = {
119
+ name: this.breadcrumbList[i],
120
+ url: this.breadcrumbLinksList[i - 1]["url"],
121
+ id: this.breadcrumbList[i],
122
+ kpiName: this.breadcrumbList[i],
123
+ returnId: returnId,
124
+ };
125
+ this.commonService.global_kpi_name = this.breadcrumbList[i];
126
+ }
127
+ this.breadcrumbLinksList.push(link);
128
+ }
129
+ this.count = this.breadcrumbList.length;
130
+ }
131
+ }
132
+ }
133
+ BreadCrumbsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BreadCrumbsComponent, deps: [{ token: i1.Location }, { token: i2.Router }, { token: i3.HttpClient }, { token: i2.ActivatedRoute }, { token: i4.CommonService }], target: i0.ɵɵFactoryTarget.Component });
134
+ BreadCrumbsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", 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"] }] });
135
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BreadCrumbsComponent, decorators: [{
136
+ type: Component,
137
+ 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"] }]
138
+ }], ctorParameters: function () { return [{ type: i1.Location }, { type: i2.Router }, { type: i3.HttpClient }, { type: i2.ActivatedRoute }, { type: i4.CommonService }]; }, propDecorators: { kpi_data_container: [{
139
+ type: Input,
140
+ args: ['kpi_data_container']
141
+ }] } });
142
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJlYWQtY3J1bWJzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dhbW1hLWFwcC1jb250cm9sbGVyL3NyYy9saWIvc2hhcmVkL2dhbW1hLWJyZWFkLWNydW1icy9icmVhZC1jcnVtYnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9zaGFyZWQvZ2FtbWEtYnJlYWQtY3J1bWJzL2JyZWFkLWNydW1icy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQzs7Ozs7O0FBWXpELE1BQU0sT0FBTyxvQkFBb0I7SUFnQy9CLFlBQ1UsUUFBa0IsRUFDbEIsTUFBYyxFQUNkLElBQWdCLEVBQ2hCLGNBQThCLEVBQzlCLGFBQTRCO1FBSjVCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBL0J0QyxnQkFBVyxHQUFRLEVBQUUsQ0FBQztRQUN0QixtQkFBYyxHQUFHLEVBQUUsQ0FBQztRQUNwQixjQUFTLEdBQUcsRUFBRSxDQUFDO1FBRWYsU0FBSSxHQUFHLEVBQUUsQ0FBQztJQTRCTixDQUFDO0lBdkJMLElBQ0ksa0JBQWtCLENBQUMsS0FBSztRQUMxQixJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDN0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7WUFFM0IsT0FBTztTQUNSO2FBQU07WUFFTCxJQUFJLFlBQVksR0FBRyxjQUFjLENBQUM7WUFDbEMsSUFBSSxD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LENBQUMsQ0FBQyxDQUFDO2lCQUM3RDtnQkFDRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3JDO1lBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQztTQUN6QztJQUNILENBQUM7O2lIQTdKVSxvQkFBb0I7cUdBQXBCLG9CQUFvQixnSENaakMseWhDQWVNOzJGREhPLG9CQUFvQjtrQkFMaEMsU0FBUzsrQkFDRSxvQkFBb0I7c01Bb0IxQixrQkFBa0I7c0JBRHJCLEtBQUs7dUJBQUMsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IFJvdXRlciwgTmF2aWdhdGlvbkV4dHJhcywgQWN0aXZhdGVkUm91dGUgfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XG5pbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XG5pbXBvcnQgeyBDb21tb25TZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL2FwcGxpY2F0aW9uLWNvbnRyb2xsZXIvY29tbW9uXCI7XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImdhbW1hLWJyZWFkLWNydW1ic1wiLFxuICB0ZW1wbGF0ZVVybDogXCIuL2JyZWFkLWNydW1icy5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vYnJlYWQtY3J1bWJzLmNvbXBvbmVudC5zY3NzXCJdLFxufSlcbmV4cG9ydCBjbGFzcyBCcmVhZENydW1ic0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbmJyZWFkY3J1bWJMaXN0O1xuICBicmVhZGNydW1iTGlua3NMaXN0O1xuICByb3V0ZTogc3RyaW5nO1xuICBjb3VudDogbnVtYmVyO1xuICBrcGlMaXN0RGF0YTogYW55ID0gW107XG4gIGtwaV9zdHJ1Y3R1cmVzID0ge307XG4gIGtwaV9uYW1lcyA9IHt9O1xuICBrcGlVcmxJRDtcbiAgZGF0YSA9IFtdO1xuXG4gIGtwaUJyb3dzZXJOYW1lOiBCb29sZWFuO1xuICBpc0JyZWFkQ3J1bWJzOiBCb29sZWFuO1xuXG4gIEBJbnB1dCgna3BpX2RhdGFfY29udGFpbmVyJylcbiAgc2V0IGtwaV9kYXRhX2NvbnRhaW5lcih2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5pc0JyZWFkQ3J1bWJzID0gZmFsc2U7XG4gICAgICAvLyB0aGlzLmFkZFJvbGVDb250YWluZXIgPSBbeyBcInR5cGVcIjogXCJ0ZXh0XCIsIFwidmFsdWVcIjogJycsIFwicm9sZWlkXCI6IFwicm93SWQwXCIgfV07XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoaXMua3BpTGlzdERhdGEgPSB2YWx1ZTtcbiAgICAgIGxldCByZWxhdGl2ZVBhdGggPSAncmFrcGlCcm93c2VyJztcbiAgICAgIHRoaXMuZ2V0S3BpTmFtZSh2YWx1ZSwgcmVsYXRpdmVQYXRoKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmxvYWRCcmVhZENydW1icygpO1xuICAgICAgfSwgNTAwKTtcbiAgICAgIHRoaXMuaXNCcmVhZENydW1icyA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBsb2NhdGlvbjogTG9jYXRpb24sXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSBjb21tb25TZXJ2aWNlOiBDb21tb25TZXJ2aWNlLFxuICApIHsgfVxuXG4gIG5nT25Jbml0KCkge1xuXG5cbiAgfVxuXG4gIGdldEtwaU5hbWUoZGF0YSwgcmVsYXRpdmVQYXRoKSB7XG5cbiAgICBkYXRhLmZvckVhY2gocmVzdWx0ID0+IHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB7fTtcbiAgICAgIGxldCBvYmo7XG4gICAgICBpdGVtWydyZWxhdGl2ZVBhdGgnXSA9IHJlbGF0aXZlUGF0aDtcblxuICAgICAgaWYgKHJlc3VsdFsnbm9kZXMnXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxldCBjaGlsZFJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlUGF0aCArICcvJyArIHJlc3VsdFsnbmFtZSddO1xuICAgICAgICB0aGlzLmdldEtwaU5hbWUocmVzdWx0Wydub2RlcyddLCBjaGlsZFJlbGF0aXZlUGF0aCk7XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0WydpZCddKSB7XG4gICAgICAgIG9iaiA9IHtcbiAgICAgICAgICAnbmFtZSc6IHJlc3VsdFsnbmFtZSddLFxuICAgICAgICAgICdkZXNjJzogcmVzdWx0WydkZXNjJ10sXG4gICAgICAgICAgJ3JlbGF0aXZlUGF0aCc6IHJlc3VsdFsncmVsYXRpdmVQYXRoJ10sXG4gICAgICAgICAgJ2twaUlkJzogcmVzdWx0WydpZCddLFxuICAgICAgICAgICdpc0Jvb2ttYXJrZWQnOiByZXN1bHRbJ2lzQm9va21hcmtlZCddLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaXRlbVsnZXh0ZXJuYWxMaW5rJ10gPSByZWxhdGl2ZVBhdGggKyAnLycgKyByZXN1bHRbJ25hbWUnXVxuICAgICAgaXRlbVsndGlkJ10gPSByZXN1bHRbJ3RpZCddO1xuICAgICAgaXRlbVsnaWQnXSA9IHJlc3VsdFsnaWQnXTtcbiAgICAgIGl0ZW1bJ25hbWUnXSA9IHJlc3VsdFsnbmFtZSddO1xuXG4gICAgICB0aGlzLmtwaUxpc3REYXRhLnB1c2goaXRlbSk7XG4gICAgfSk7XG5cbiAgfVxuXG5cbiAgZ2V0QnJlYWRDcnVtYnNEYXRhKGRhdGEpIHtcbiAgICBsZXQgc3RydWN0dXJlcyA9IHt9O1xuICAgIGRhdGEuZm9yRWFjaChyZXN1bHQgPT4ge1xuICAgICAgY29uc3QgaXRlbTogb2JqZWN0ID0ge307XG4gICAgICBpdGVtW1wicmVsYXRpdmVQYXRoXCJdID0gcmVzdWx0LnJlbGF0aXZlUGF0aDtcbiAgICAgIGl0ZW1bXCJuYW1lXCJdID0gcmVzdWx0W1wibmFtZVwiXTtcbiAgICAgIGl0ZW1bXCJ0aWRcIl0gPSByZXN1bHRbXCJ0aWRcIl0udHJpbSgpO1xuICAgICAgaWYgKHJlc3VsdFtcIm5vZGVzXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaXRlbVtcIm5vZGVzXCJdID0gdGhpcy5nZXRCcmVhZENydW1ic0RhdGEoXG4gICAgICAgICAgcmVzdWx0W1wibm9kZXNcIl1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMua3BpX25hbWVzW3Jlc3VsdFtcImlkXCJdXSA9IGl0ZW1bXCJ0aWRcIl07XG5cbiAgICAgIHN0cnVjdHVyZXNbcmVzdWx0W1widGlkXCJdXSA9IGl0ZW07XG4gICAgICB0aGlzLmtwaV9zdHJ1Y3R1cmVzW3Jlc3VsdFtcInRpZFwiXV0gPSBpdGVtO1xuICAgIH0pO1xuICAgIHJldHVybiBzdHJ1Y3R1cmVzO1xuICB9XG5cbiAgbG9hZEJyZWFkQ3J1bWJzKCkge1xuXG4gICAgbGV0IGtwaVJvb3QgPSB0aGlzLmtwaUJyb3dzZXJOYW1lID8gXCJmbXNrcGlcIiA6IFwicmFrcGlcIjtcbiAgICBsZXQga3BpQ29udGFpbmVyO1xuICAgIC8vIGNvbnN0IG5hdnVybCA9IHRoaXMucm91dGVyLnVybC5zcGxpdChcIj9cIik7XG4gICAgLy8gbGV0IHVybCA9IG5hdnVybFswXS5zcGxpdChcIi9cIik7XG4gICAgLy8gdGhpcy5rcGlVcmxJRCA9IHVybC5zbGljZSgtMSkucG9wKCk7XG5cbiAgICBpZiAodGhpcy5rcGlMaXN0RGF0YS5sZW5ndGggPiAwIHx8IHRoaXMua3BpTGlzdERhdGEgIT0gdW5kZWZpbmVkKSB7XG4gICAgICBrcGlDb250YWluZXIgPSB0aGlzLmdldEJyZWFkQ3J1bWJzRGF0YSh0aGlzLmtwaUxpc3REYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAga3BpQ29udGFpbmVyID0gdGhpcy5nZXRCcmVhZENydW1ic0RhdGEoXG4gICAgICAgIHRoaXMuY29tbW9uU2VydmljZS5hbGxLcGlicm93c2VyRGV0YWlsQ29udGFpbmVyLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qga3BpSWQgPSB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zWydpZCddO1xuICAgIGNvbnN0IGtwaVRpZCA9IHRoaXMua3BpX25hbWVzW2twaUlkXTtcbiAgICBjb25zdCBwcm9wcyA9IHRoaXMua3BpX3N0cnVjdHVyZXNba3BpVGlkXTtcbiAgICBjb25zdCBwcm9wc0xpc3QgPSBwcm9wc1tcInJlbGF0aXZlUGF0aFwiXSArIFwiL1wiICsgcHJvcHNbXCJuYW1lXCJdO1xuICAgIHRoaXMuYnJlYWRjcnVtYkxpc3QgPSBwcm9wc0xpc3Quc3BsaXQoXCIvXCIpO1xuXG4gICAgaWYgKHRoaXMubG9jYXRpb24ucGF0aCgpICE9PSBcIlwiKSB7XG4gICAgICBsZXQgbGluayA9IHt9O1xuICAgICAgdGhpcy5icmVhZGNydW1iTGlua3NMaXN0ID0gW107XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5icmVhZGNydW1iTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaSA9PSAwKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmtwaUJyb3dzZXJOYW1lKSB7XG4gICAgICAgICAgICBsaW5rID0ge1xuICAgICAgICAgICAgICBuYW1lOiB0aGlzLmJyZWFkY3J1bWJMaXN0W2ldLFxuICAgICAgICAgICAgICB1cmw6IFwiL2FwcHMvcmFLcGkvcmFrcGlCcm93c2VyXCIsXG4gICAgICAgICAgICAgIGtwaU5hbWU6IFwiUkEgS1BJIEJyb3dzZXJcIixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxpbmsgPSB7XG4gICAgICAgICAgICAgIG5hbWU6IHRoaXMuYnJlYWRjcnVtYkxpc3RbaV0sXG4gICAgICAgICAgICAgIHVybDogXCIvYXBwcy9mbXNLcGlcIixcbiAgICAgICAgICAgICAga3BpTmFtZTogXCJGTVMgS1BJIEJyb3dzZXJcIixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCByZXR1cm5JZCA9IFwiXCI7XG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPD0gaTsgaisrKSB7XG4gICAgICAgICAgICBpZiAoaiAhPSAwKSB7XG4gICAgICAgICAgICAgIHJldHVybklkICs9IFwiL1wiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuSWQgKz0gdGhpcy5icmVhZGNydW1iTGlzdFtqXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGluayA9IHtcbiAgICAgICAgICAgIG5hbWU6IHRoaXMuYnJlYWRjcnVtYkxpc3RbaV0sXG4gICAgICAgICAgICB1cmw6IHRoaXMuYnJlYWRjcnVtYkxpbmtzTGlzdFtpIC0gMV1bXCJ1cmxcIl0sXG4gICAgICAgICAgICBpZDogdGhpcy5icmVhZGNydW1iTGlzdFtpXSxcbiAgICAgICAgICAgIGtwaU5hbWU6IHRoaXMuYnJlYWRjcnVtYkxpc3RbaV0sXG4gICAgICAgICAgICByZXR1cm5JZDogcmV0dXJuSWQsXG4gICAgICAgICAgfTtcbiAgICAgICAgICB0aGlzLmNvbW1vblNlcnZpY2UuZ2xvYmFsX2twaV9uYW1lID0gdGhpcy5icmVhZGNydW1iTGlzdFtpXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJyZWFkY3J1bWJMaW5rc0xpc3QucHVzaChsaW5rKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY291bnQgPSB0aGlzLmJyZWFkY3J1bWJMaXN0Lmxlbmd0aDtcbiAgICB9XG4gIH1cbn1cbiIsIjxuYXYgY2xhc3M9XCJmbGV4IG10LTFcIiBhcmlhLWxhYmVsPVwiQnJlYWRjcnVtYlwiICpuZ0lmPVwiaXNCcmVhZENydW1ic1wiPlxuICAgIDxvbCBjbGFzcz1cImlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBzcGFjZS14LTEgbWQ6c3BhY2UteC0zXCI+XG4gICAgICAgIDxsaSBjbGFzcz1cImlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBjdXJzb3ItcG9pbnRlclwiICpuZ0Zvcj1cImxldCBicmVhZGNydW1iTGFiZWwgb2YgYnJlYWRjcnVtYkxpbmtzTGlzdDtcIj5cbiAgICAgICAgICAgIDxhIFtyb3V0ZXJMaW5rXT1cImJyZWFkY3J1bWJMYWJlbC51cmxcIiBbcXVlcnlQYXJhbXNdPVwie3JldHVybklkOiBicmVhZGNydW1iTGFiZWwucmV0dXJuSWQgfVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktNzAwIGhvdmVyOnRleHQtZ3JheS05MDAgZGFyazp0ZXh0LWdyYXktNDAwIGRhcms6aG92ZXI6dGV4dC13aGl0ZVwiPlxuICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJ3LTYgaC02IHRleHQtZ3JheS00MDBcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiXG4gICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTcuMjkzIDE0LjcwN2ExIDEgMCAwMTAtMS40MTRMMTAuNTg2IDEwIDcuMjkzIDYuNzA3YTEgMSAwIDAxMS40MTQtMS40MTRsNCA0YTEgMSAwIDAxMCAxLjQxNGwtNCA0YTEgMSAwIDAxLTEuNDE0IDB6XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAtcnVsZT1cImV2ZW5vZGRcIj48L3BhdGg+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAge3ticmVhZGNydW1iTGFiZWwua3BpTmFtZX19XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgIDwvbGk+XG4gICAgPC9vbD5cbjwvbmF2PiJdfQ==