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
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { Component, ViewChild } from '@angular/core';
|
|
2
|
+
import { confirm } from 'devextreme/ui/dialog';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/router";
|
|
5
|
+
import * as i2 from "../../common";
|
|
6
|
+
import * as i3 from "../../application-content.service";
|
|
7
|
+
import * as i4 from "ngx-toastr";
|
|
8
|
+
import * as i5 from "../../page-templates/dynamic-route-service";
|
|
9
|
+
import * as i6 from "@angular/common";
|
|
10
|
+
import * as i7 from "devextreme-angular/core";
|
|
11
|
+
import * as i8 from "devextreme-angular/ui/nested";
|
|
12
|
+
import * as i9 from "devextreme-angular/ui/data-grid";
|
|
13
|
+
import * as i10 from "devextreme-angular/ui/select-box";
|
|
14
|
+
import * as i11 from "devextreme-angular/ui/text-box";
|
|
15
|
+
import * as i12 from "@angular/forms";
|
|
16
|
+
import * as i13 from "../../shared/loader/loader.component";
|
|
17
|
+
import * as i14 from "../../common-header/common-header.component";
|
|
18
|
+
export class PageControlerComponent {
|
|
19
|
+
constructor(router, commonService, service, toastr, dynamicRouteService) {
|
|
20
|
+
this.router = router;
|
|
21
|
+
this.commonService = commonService;
|
|
22
|
+
this.service = service;
|
|
23
|
+
this.toastr = toastr;
|
|
24
|
+
this.dynamicRouteService = dynamicRouteService;
|
|
25
|
+
this.dashboardConfig = {
|
|
26
|
+
pageName: "",
|
|
27
|
+
pageTitle: "",
|
|
28
|
+
pageUrl: "",
|
|
29
|
+
pageTemplate: "",
|
|
30
|
+
pageDocumentationUrl: "",
|
|
31
|
+
widgets: [],
|
|
32
|
+
filterId: ""
|
|
33
|
+
};
|
|
34
|
+
this.isNewTampleteCreate = false;
|
|
35
|
+
this.isLoader = false;
|
|
36
|
+
this.templateDataSource = [];
|
|
37
|
+
this.componentTemplates = [
|
|
38
|
+
{ "compName": "KpiWithDataSetTestComponent", "item": "Default KPI Layout" },
|
|
39
|
+
{ "compName": "LandingComponentComponent", "item": "Default Page" },
|
|
40
|
+
{ "compName": "CdrConfigComponent", "item": "CDR Config" },
|
|
41
|
+
{ "compName": "CreateKpiTreeComponent", "item": "Create KPI Config" },
|
|
42
|
+
];
|
|
43
|
+
}
|
|
44
|
+
ngOnInit() {
|
|
45
|
+
this.getAppPageConfigs();
|
|
46
|
+
this.getFilterDataSet();
|
|
47
|
+
}
|
|
48
|
+
getFilterDataSet() {
|
|
49
|
+
this.service.getAppFilterConfigs().subscribe({
|
|
50
|
+
next: (data) => {
|
|
51
|
+
this.filterDataSource = data;
|
|
52
|
+
this.isLoader = false;
|
|
53
|
+
}, error: (err) => {
|
|
54
|
+
this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'Page Creation');
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
getAppPageConfigs() {
|
|
59
|
+
this.service.getAppPageConfigs().subscribe({
|
|
60
|
+
next: (data) => {
|
|
61
|
+
this.templateDataSource = data;
|
|
62
|
+
this.isLoader = false;
|
|
63
|
+
}, error: (err) => {
|
|
64
|
+
this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'Page Creation');
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
createNewTamplete() {
|
|
69
|
+
this.isNewTampleteCreate = true;
|
|
70
|
+
this.dashboardConfig = {
|
|
71
|
+
pageName: "",
|
|
72
|
+
pageTitle: "",
|
|
73
|
+
pageUrl: "",
|
|
74
|
+
pageTemplate: "",
|
|
75
|
+
pageDocumentationUrl: "",
|
|
76
|
+
widgets: [],
|
|
77
|
+
filterId: ""
|
|
78
|
+
};
|
|
79
|
+
setTimeout(() => {
|
|
80
|
+
this.scrollToBottom();
|
|
81
|
+
}, 100);
|
|
82
|
+
}
|
|
83
|
+
viewsPage(item) {
|
|
84
|
+
let navigationExtras = {
|
|
85
|
+
queryParams: {
|
|
86
|
+
"pageId": item.pageId
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
this.router.navigate([item.pageUrl], navigationExtras);
|
|
90
|
+
}
|
|
91
|
+
deleteTamplete(item) {
|
|
92
|
+
let result = confirm("<i>Are You Sure?</i>", "Delete Filter");
|
|
93
|
+
result.then((dialogResult) => {
|
|
94
|
+
if (dialogResult) {
|
|
95
|
+
this.isLoader = true;
|
|
96
|
+
this.service.deleteAppPageConfig(item.pageId).subscribe((val) => {
|
|
97
|
+
this.getAppPageConfigs();
|
|
98
|
+
this.isLoader = false;
|
|
99
|
+
this.toastr.success('Page Deleted Successfully');
|
|
100
|
+
}, err => {
|
|
101
|
+
console.log(err);
|
|
102
|
+
this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'Rule Module');
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
editTemplate(item) {
|
|
108
|
+
this.dashboardConfig = item;
|
|
109
|
+
this.isNewTampleteCreate = true;
|
|
110
|
+
this.scrollToBottom();
|
|
111
|
+
}
|
|
112
|
+
getSaveChartConfig() {
|
|
113
|
+
if (this.dashboardConfig['pageId']) {
|
|
114
|
+
this.service.editAppPageConfig(this.dashboardConfig).subscribe({
|
|
115
|
+
next: (data) => {
|
|
116
|
+
this.isNewTampleteCreate = false;
|
|
117
|
+
this.getAppPageConfigs();
|
|
118
|
+
this.toastr.success('Page Update Successfully');
|
|
119
|
+
}, error: (err) => {
|
|
120
|
+
this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'Page Creation');
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
this.service.createAppPageConfig(this.dashboardConfig).subscribe({
|
|
126
|
+
next: (data) => {
|
|
127
|
+
this.isNewTampleteCreate = false;
|
|
128
|
+
this.getAppPageConfigs();
|
|
129
|
+
this.toastr.success('Page Created Successfully');
|
|
130
|
+
}, error: (err) => {
|
|
131
|
+
this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'Page Creation');
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
viewConfiguredTemplate(item) {
|
|
137
|
+
let navigation = {
|
|
138
|
+
queryParams: {
|
|
139
|
+
'pageId': item.pageId,
|
|
140
|
+
'contentType': "view",
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
this.router.navigate(['/apps/controlPanel/pageConfigController'], navigation);
|
|
144
|
+
}
|
|
145
|
+
configuredTemplate(item) {
|
|
146
|
+
let navigation = {
|
|
147
|
+
queryParams: {
|
|
148
|
+
'pageId': item.pageId,
|
|
149
|
+
'contentType': "edit",
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
this.router.navigate(['/apps/controlPanel/pageConfigController'], navigation);
|
|
153
|
+
}
|
|
154
|
+
getCreateDashboard() {
|
|
155
|
+
this.router.navigateByUrl('/apps/controlPanel/pageConfigController');
|
|
156
|
+
}
|
|
157
|
+
scrollToBottom() {
|
|
158
|
+
setTimeout(() => {
|
|
159
|
+
this.scrollContainer.nativeElement.scrollIntoView({ behavior: 'smooth', block: 'end' });
|
|
160
|
+
}, 0);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
PageControlerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: PageControlerComponent, deps: [{ token: i1.Router }, { token: i2.CommonService }, { token: i3.ApplicationContentService }, { token: i4.ToastrService }, { token: i5.DynamicRouteService }], target: i0.ɵɵFactoryTarget.Component });
|
|
164
|
+
PageControlerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.3", type: PageControlerComponent, selector: "app-dashbord-controller", viewQueries: [{ propertyName: "scrollContainer", first: true, predicate: ["scrollContainer"], descendants: true }], ngImport: i0, template: "<div class=\"flex flex-col flex-auto min-w-0\">\n\n <lib-common-header [pageTitle]=\"' Application Pages'\"></lib-common-header>\n\n\n\n <div class=\"p-4 w-full\">\n <div class=\"m-3 p-4 bg-white border border-gray-200 rounded-lg shadow-md dark:bg-gray-800 dark:border-gray-700\">\n <h6 class=\"mb-2 text-lg tracking-tight text-gray-900 dark:text-white border-b pb-3 flex items-center\">\n <i class=\"fa fa-table mr-2\"></i> Manage Pages\n <div class=\"ml-auto\">\n <button class=\"{{commonService.btn_primary_md}}\" (click)=\"createNewTamplete()\">\n Create New Page\n </button>\n </div>\n </h6>\n <app-loader *ngIf=\"isLoader\"></app-loader>\n <dx-data-grid [columnAutoWidth]=\"true\" [dataSource]=\"templateDataSource\" [hoverStateEnabled]=\"true\"\n *ngIf=\"!isLoader\" [selectedRowKeys]=\"[]\" [showBorders]=\"true\" [showColumnLines]=\"true\"\n [showRowLines]=\"true\">\n <dxo-paging [pageSize]=\"10\"></dxo-paging>\n <dxo-export [enabled]=\"true\"></dxo-export>\n <dxo-search-panel [highlightCaseSensitive]=\"true\" [visible]=\"true\">\n </dxo-search-panel>\n\n <dxi-column dataField=\"pageName\"></dxi-column>\n <dxi-column dataField=\"pageTitle\"></dxi-column>\n <!-- <dxi-column dataField=\"pageTemplate\"></dxi-column> -->\n <dxi-column dataField=\"pageId\"></dxi-column>\n <dxi-column dataField=\"pageUrl\"></dxi-column>\n <!-- <dxi-column dataField=\"createdBy\"></dxi-column> -->\n <!-- <dxi-column dataField=\"creationDate\"></dxi-column> -->\n <dxi-column dataField=\"Configured\" cellTemplate=\"cellTemplate2\"></dxi-column>\n <dxi-column dataField=\"action\" cellTemplate=\"cellTemplate\"></dxi-column>\n <div *dxTemplate=\"let data of 'cellTemplate'\">\n <button class=\"{{commonService.btn_primary_md}}\" (click)=\"editTemplate(data.data)\">\n Edit\n </button>\n <button class=\"{{commonService.btn_success_md}}\" (click)=\"viewsPage(data.data)\">\n View Page\n </button>\n <button class=\"{{commonService.btn_danger_md}}\" (click)=\"deleteTamplete(data.data)\">\n Delete\n </button>\n </div>\n <div *dxTemplate=\"let data of 'cellTemplate2'\">\n\n <button class=\"{{commonService.btn_success_md}}\" (click)=\"configuredTemplate(data.data)\">\n Configure\n </button>\n\n </div>\n\n\n\n </dx-data-grid>\n </div>\n </div>\n\n <div #scrollContainer>\n <div class=\"p-2\" *ngIf=\"isNewTampleteCreate\">\n <div\n class=\"m-3 p-4 bg-white border border-gray-200 rounded-lg shadow-md dark:bg-gray-800 dark:border-gray-700\">\n <h6\n class=\"mb-2 font-bold text-lg tracking-tight text-gray-900 dark:text-white border-b pb-3 flex items-center\">\n <i class=\"fa fa-table mr-2\"></i> Create Page\n </h6>\n\n <!-- Flex container for form fields -->\n <!-- <div class=\"flex flex-wrap w-full\">\n <div class=\"w-1/2 px-2 mb-2\">\n <div class=\"text-md mb-1\">Page Name</div>\n <dx-text-box [(ngModel)]=\"dashboardConfig.pageName\"></dx-text-box>\n </div>\n <div class=\"w-1/2 px-2 mb-2\">\n <div class=\"text-md mb-1\">Page Title</div>\n <dx-text-box [(ngModel)]=\"dashboardConfig.pageTitle\"></dx-text-box>\n </div>\n <div class=\"w-1/2 px-2 mb-2\">\n <div class=\"text-md mb-1\">Page URL</div>\n <dx-text-box [(ngModel)]=\"dashboardConfig.pageUrl\"></dx-text-box>\n </div>\n <div class=\"w-1/2 px-2 mb-2\">\n <div class=\"text-md mb-1\">Page Template</div>\n <dx-select-box [items]=\"componentTemplates\" displayExpr=\"item\" valueExpr=\"compName\"\n [(ngModel)]=\"dashboardConfig.pageTemplate\" searchEnabled=\"true\"></dx-select-box>\n </div>\n <div class=\"w-1/2 px-2 mb-2\">\n <div class=\"text-md mb-1\">Page Documentation Url</div>\n <dx-text-box [(ngModel)]=\"dashboardConfig.pageDocumentationUrl\"></dx-text-box>\n </div>\n <div class=\"w-1/2 px-2 mb-2\">\n <div class=\"text-md mb-1\">Page Filter</div>\n <dx-select-box [items]=\"filterDataSource\" displayExpr=\"filterName\" valueExpr=\"filterId\"\n [(ngModel)]=\"dashboardConfig.filterId\"></dx-select-box>\n </div>\n </div> -->\n <div class=\"grid grid-cols-2 gap-4 w-full\">\n <div class=\"px-2 mb-2\">\n <div class=\"text-md mb-1\">Page Name</div>\n <dx-text-box [(ngModel)]=\"dashboardConfig.pageName\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2\">\n <div class=\"text-md mb-1\">Page Title</div>\n <dx-text-box [(ngModel)]=\"dashboardConfig.pageTitle\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2\">\n <div class=\"text-md mb-1\">Page URL</div>\n <dx-text-box [(ngModel)]=\"dashboardConfig.pageUrl\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2\">\n <div class=\"text-md mb-1\">Page Template</div>\n <dx-select-box [items]=\"componentTemplates\" displayExpr=\"item\" valueExpr=\"compName\"\n [(ngModel)]=\"dashboardConfig.pageTemplate\" [searchEnabled]=\"true\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2\">\n <div class=\"text-md mb-1\">Page Documentation Url</div>\n <dx-text-box [(ngModel)]=\"dashboardConfig.pageDocumentationUrl\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2\">\n <div class=\"text-md mb-1\">Page Filter</div>\n <dx-select-box [items]=\"filterDataSource\" displayExpr=\"filterName\" valueExpr=\"filterId\"\n [(ngModel)]=\"dashboardConfig.filterId\"></dx-select-box>\n </div>\n </div>\n\n <!-- Submit button -->\n <div class=\"flex justify-end mx-1 flex-grow\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mt-2\"\n (click)=\"getSaveChartConfig()\">Submit Template</button>\n </div>\n </div>\n </div>\n </div>\n\n\n\n</div>", styles: [""], dependencies: [{ kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.DxTemplateDirective, selector: "[dxTemplate]", inputs: ["dxTemplateOf"] }, { kind: "component", type: i8.DxoExportComponent, selector: "dxo-export", inputs: ["backgroundColor", "enabled", "fileName", "formats", "margin", "printingEnabled", "proxyUrl", "svgToCanvas", "allowExportSelectedData", "customizeExcelCell", "excelFilterEnabled", "excelWrapTextEnabled", "ignoreExcelErrors", "texts"] }, { kind: "component", type: i9.DxDataGridComponent, selector: "dx-data-grid", inputs: ["accessKey", "activeStateEnabled", "allowColumnReordering", "allowColumnResizing", "autoNavigateToFocusedRow", "cacheEnabled", "cellHintEnabled", "columnAutoWidth", "columnChooser", "columnFixing", "columnHidingEnabled", "columnMinWidth", "columnResizingMode", "columns", "columnWidth", "customizeColumns", "customizeExportData", "dataRowTemplate", "dataSource", "dateSerializationFormat", "disabled", "editing", "elementAttr", "errorRowEnabled", "export", "filterBuilder", "filterBuilderPopup", "filterPanel", "filterRow", "filterSyncEnabled", "filterValue", "focusedColumnIndex", "focusedRowEnabled", "focusedRowIndex", "focusedRowKey", "focusStateEnabled", "grouping", "groupPanel", "headerFilter", "height", "highlightChanges", "hint", "hoverStateEnabled", "keyboardNavigation", "keyExpr", "loadPanel", "masterDetail", "noDataText", "pager", "paging", "remoteOperations", "renderAsync", "repaintChangesOnly", "rowAlternationEnabled", "rowDragging", "rowTemplate", "rtlEnabled", "scrolling", "searchPanel", "selectedRowKeys", "selection", "selectionFilter", "showBorders", "showColumnHeaders", "showColumnLines", "showRowLines", "sortByGroupSummaryInfo", "sorting", "stateStoring", "summary", "syncLookupFilterValues", "tabIndex", "toolbar", "twoWayBindingEnabled", "visible", "width", "wordWrapEnabled"], outputs: ["onAdaptiveDetailRowPreparing", "onCellClick", "onCellDblClick", "onCellHoverChanged", "onCellPrepared", "onContentReady", "onContextMenuPreparing", "onDataErrorOccurred", "onDisposing", "onEditCanceled", "onEditCanceling", "onEditingStart", "onEditorPrepared", "onEditorPreparing", "onExported", "onExporting", "onFileSaving", "onFocusedCellChanged", "onFocusedCellChanging", "onFocusedRowChanged", "onFocusedRowChanging", "onInitialized", "onInitNewRow", "onKeyDown", "onOptionChanged", "onRowClick", "onRowCollapsed", "onRowCollapsing", "onRowDblClick", "onRowExpanded", "onRowExpanding", "onRowInserted", "onRowInserting", "onRowPrepared", "onRowRemoved", "onRowRemoving", "onRowUpdated", "onRowUpdating", "onRowValidating", "onSaved", "onSaving", "onSelectionChanged", "onToolbarPreparing", "accessKeyChange", "activeStateEnabledChange", "allowColumnReorderingChange", "allowColumnResizingChange", "autoNavigateToFocusedRowChange", "cacheEnabledChange", "cellHintEnabledChange", "columnAutoWidthChange", "columnChooserChange", "columnFixingChange", "columnHidingEnabledChange", "columnMinWidthChange", "columnResizingModeChange", "columnsChange", "columnWidthChange", "customizeColumnsChange", "customizeExportDataChange", "dataRowTemplateChange", "dataSourceChange", "dateSerializationFormatChange", "disabledChange", "editingChange", "elementAttrChange", "errorRowEnabledChange", "exportChange", "filterBuilderChange", "filterBuilderPopupChange", "filterPanelChange", "filterRowChange", "filterSyncEnabledChange", "filterValueChange", "focusedColumnIndexChange", "focusedRowEnabledChange", "focusedRowIndexChange", "focusedRowKeyChange", "focusStateEnabledChange", "groupingChange", "groupPanelChange", "headerFilterChange", "heightChange", "highlightChangesChange", "hintChange", "hoverStateEnabledChange", "keyboardNavigationChange", "keyExprChange", "loadPanelChange", "masterDetailChange", "noDataTextChange", "pagerChange", "pagingChange", "remoteOperationsChange", "renderAsyncChange", "repaintChangesOnlyChange", "rowAlternationEnabledChange", "rowDraggingChange", "rowTemplateChange", "rtlEnabledChange", "scrollingChange", "searchPanelChange", "selectedRowKeysChange", "selectionChange", "selectionFilterChange", "showBordersChange", "showColumnHeadersChange", "showColumnLinesChange", "showRowLinesChange", "sortByGroupSummaryInfoChange", "sortingChange", "stateStoringChange", "summaryChange", "syncLookupFilterValuesChange", "tabIndexChange", "toolbarChange", "twoWayBindingEnabledChange", "visibleChange", "widthChange", "wordWrapEnabledChange"] }, { kind: "component", type: i8.DxiColumnComponent, selector: "dxi-column", inputs: ["alignment", "allowEditing", "allowExporting", "allowFiltering", "allowFixing", "allowGrouping", "allowHeaderFiltering", "allowHiding", "allowReordering", "allowResizing", "allowSearch", "allowSorting", "autoExpandGroup", "buttons", "calculateCellValue", "calculateDisplayValue", "calculateFilterExpression", "calculateGroupValue", "calculateSortValue", "caption", "cellTemplate", "columns", "cssClass", "customizeText", "dataField", "dataType", "editCellTemplate", "editorOptions", "encodeHtml", "falseText", "filterOperations", "filterType", "filterValue", "filterValues", "fixed", "fixedPosition", "format", "formItem", "groupCellTemplate", "groupIndex", "headerCellTemplate", "headerFilter", "hidingPriority", "isBand", "lookup", "minWidth", "name", "ownerBand", "renderAsync", "selectedFilterOperation", "setCellValue", "showEditorAlways", "showInColumnChooser", "showWhenGrouped", "sortIndex", "sortingMethod", "sortOrder", "trueText", "type", "validationRules", "visible", "visibleIndex", "width"], outputs: ["filterValueChange", "filterValuesChange", "groupIndexChange", "selectedFilterOperationChange", "sortIndexChange", "sortOrderChange", "visibleChange", "visibleIndexChange"] }, { kind: "component", type: i8.DxoPagingComponent, selector: "dxo-paging", inputs: ["enabled", "pageIndex", "pageSize"], outputs: ["pageIndexChange", "pageSizeChange"] }, { kind: "component", type: i8.DxoSearchPanelComponent, selector: "dxo-search-panel", inputs: ["highlightCaseSensitive", "highlightSearchText", "placeholder", "searchVisibleColumnsOnly", "text", "visible", "width"], outputs: ["textChange"] }, { kind: "component", type: i10.DxSelectBoxComponent, selector: "dx-select-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "buttons", "dataSource", "deferRendering", "disabled", "displayExpr", "displayValue", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "items", "itemTemplate", "label", "labelMode", "maxLength", "minSearchLength", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectedItem", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showSelectionControls", "spellcheck", "stylingMode", "tabIndex", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCopy", "onCustomItemCreating", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onOpened", "onOptionChanged", "onPaste", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "displayValueChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxLengthChange", "minSearchLengthChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectedItemChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showSelectionControlsChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "component", type: i11.DxTextBoxComponent, selector: "dx-text-box", inputs: ["accessKey", "activeStateEnabled", "buttons", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "label", "labelMode", "mask", "maskChar", "maskInvalidMessage", "maskRules", "maxLength", "mode", "name", "placeholder", "readOnly", "rtlEnabled", "showClearButton", "showMaskMode", "spellcheck", "stylingMode", "tabIndex", "text", "useMaskedValue", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOptionChanged", "onPaste", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "labelChange", "labelModeChange", "maskChange", "maskCharChange", "maskInvalidMessageChange", "maskRulesChange", "maxLengthChange", "modeChange", "nameChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showClearButtonChange", "showMaskModeChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useMaskedValueChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "directive", type: i12.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i12.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i13.LoaderComponent, selector: "app-loader" }, { kind: "component", type: i14.CommonHeaderComponent, selector: "lib-common-header", inputs: ["pageTitle"] }] });
|
|
165
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: PageControlerComponent, decorators: [{
|
|
166
|
+
type: Component,
|
|
167
|
+
args: [{ selector: 'app-dashbord-controller', template: "<div class=\"flex flex-col flex-auto min-w-0\">\n\n <lib-common-header [pageTitle]=\"' Application Pages'\"></lib-common-header>\n\n\n\n <div class=\"p-4 w-full\">\n <div class=\"m-3 p-4 bg-white border border-gray-200 rounded-lg shadow-md dark:bg-gray-800 dark:border-gray-700\">\n <h6 class=\"mb-2 text-lg tracking-tight text-gray-900 dark:text-white border-b pb-3 flex items-center\">\n <i class=\"fa fa-table mr-2\"></i> Manage Pages\n <div class=\"ml-auto\">\n <button class=\"{{commonService.btn_primary_md}}\" (click)=\"createNewTamplete()\">\n Create New Page\n </button>\n </div>\n </h6>\n <app-loader *ngIf=\"isLoader\"></app-loader>\n <dx-data-grid [columnAutoWidth]=\"true\" [dataSource]=\"templateDataSource\" [hoverStateEnabled]=\"true\"\n *ngIf=\"!isLoader\" [selectedRowKeys]=\"[]\" [showBorders]=\"true\" [showColumnLines]=\"true\"\n [showRowLines]=\"true\">\n <dxo-paging [pageSize]=\"10\"></dxo-paging>\n <dxo-export [enabled]=\"true\"></dxo-export>\n <dxo-search-panel [highlightCaseSensitive]=\"true\" [visible]=\"true\">\n </dxo-search-panel>\n\n <dxi-column dataField=\"pageName\"></dxi-column>\n <dxi-column dataField=\"pageTitle\"></dxi-column>\n <!-- <dxi-column dataField=\"pageTemplate\"></dxi-column> -->\n <dxi-column dataField=\"pageId\"></dxi-column>\n <dxi-column dataField=\"pageUrl\"></dxi-column>\n <!-- <dxi-column dataField=\"createdBy\"></dxi-column> -->\n <!-- <dxi-column dataField=\"creationDate\"></dxi-column> -->\n <dxi-column dataField=\"Configured\" cellTemplate=\"cellTemplate2\"></dxi-column>\n <dxi-column dataField=\"action\" cellTemplate=\"cellTemplate\"></dxi-column>\n <div *dxTemplate=\"let data of 'cellTemplate'\">\n <button class=\"{{commonService.btn_primary_md}}\" (click)=\"editTemplate(data.data)\">\n Edit\n </button>\n <button class=\"{{commonService.btn_success_md}}\" (click)=\"viewsPage(data.data)\">\n View Page\n </button>\n <button class=\"{{commonService.btn_danger_md}}\" (click)=\"deleteTamplete(data.data)\">\n Delete\n </button>\n </div>\n <div *dxTemplate=\"let data of 'cellTemplate2'\">\n\n <button class=\"{{commonService.btn_success_md}}\" (click)=\"configuredTemplate(data.data)\">\n Configure\n </button>\n\n </div>\n\n\n\n </dx-data-grid>\n </div>\n </div>\n\n <div #scrollContainer>\n <div class=\"p-2\" *ngIf=\"isNewTampleteCreate\">\n <div\n class=\"m-3 p-4 bg-white border border-gray-200 rounded-lg shadow-md dark:bg-gray-800 dark:border-gray-700\">\n <h6\n class=\"mb-2 font-bold text-lg tracking-tight text-gray-900 dark:text-white border-b pb-3 flex items-center\">\n <i class=\"fa fa-table mr-2\"></i> Create Page\n </h6>\n\n <!-- Flex container for form fields -->\n <!-- <div class=\"flex flex-wrap w-full\">\n <div class=\"w-1/2 px-2 mb-2\">\n <div class=\"text-md mb-1\">Page Name</div>\n <dx-text-box [(ngModel)]=\"dashboardConfig.pageName\"></dx-text-box>\n </div>\n <div class=\"w-1/2 px-2 mb-2\">\n <div class=\"text-md mb-1\">Page Title</div>\n <dx-text-box [(ngModel)]=\"dashboardConfig.pageTitle\"></dx-text-box>\n </div>\n <div class=\"w-1/2 px-2 mb-2\">\n <div class=\"text-md mb-1\">Page URL</div>\n <dx-text-box [(ngModel)]=\"dashboardConfig.pageUrl\"></dx-text-box>\n </div>\n <div class=\"w-1/2 px-2 mb-2\">\n <div class=\"text-md mb-1\">Page Template</div>\n <dx-select-box [items]=\"componentTemplates\" displayExpr=\"item\" valueExpr=\"compName\"\n [(ngModel)]=\"dashboardConfig.pageTemplate\" searchEnabled=\"true\"></dx-select-box>\n </div>\n <div class=\"w-1/2 px-2 mb-2\">\n <div class=\"text-md mb-1\">Page Documentation Url</div>\n <dx-text-box [(ngModel)]=\"dashboardConfig.pageDocumentationUrl\"></dx-text-box>\n </div>\n <div class=\"w-1/2 px-2 mb-2\">\n <div class=\"text-md mb-1\">Page Filter</div>\n <dx-select-box [items]=\"filterDataSource\" displayExpr=\"filterName\" valueExpr=\"filterId\"\n [(ngModel)]=\"dashboardConfig.filterId\"></dx-select-box>\n </div>\n </div> -->\n <div class=\"grid grid-cols-2 gap-4 w-full\">\n <div class=\"px-2 mb-2\">\n <div class=\"text-md mb-1\">Page Name</div>\n <dx-text-box [(ngModel)]=\"dashboardConfig.pageName\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2\">\n <div class=\"text-md mb-1\">Page Title</div>\n <dx-text-box [(ngModel)]=\"dashboardConfig.pageTitle\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2\">\n <div class=\"text-md mb-1\">Page URL</div>\n <dx-text-box [(ngModel)]=\"dashboardConfig.pageUrl\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2\">\n <div class=\"text-md mb-1\">Page Template</div>\n <dx-select-box [items]=\"componentTemplates\" displayExpr=\"item\" valueExpr=\"compName\"\n [(ngModel)]=\"dashboardConfig.pageTemplate\" [searchEnabled]=\"true\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2\">\n <div class=\"text-md mb-1\">Page Documentation Url</div>\n <dx-text-box [(ngModel)]=\"dashboardConfig.pageDocumentationUrl\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2\">\n <div class=\"text-md mb-1\">Page Filter</div>\n <dx-select-box [items]=\"filterDataSource\" displayExpr=\"filterName\" valueExpr=\"filterId\"\n [(ngModel)]=\"dashboardConfig.filterId\"></dx-select-box>\n </div>\n </div>\n\n <!-- Submit button -->\n <div class=\"flex justify-end mx-1 flex-grow\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mt-2\"\n (click)=\"getSaveChartConfig()\">Submit Template</button>\n </div>\n </div>\n </div>\n </div>\n\n\n\n</div>" }]
|
|
168
|
+
}], ctorParameters: function () { return [{ type: i1.Router }, { type: i2.CommonService }, { type: i3.ApplicationContentService }, { type: i4.ToastrService }, { type: i5.DynamicRouteService }]; }, propDecorators: { scrollContainer: [{
|
|
169
|
+
type: ViewChild,
|
|
170
|
+
args: ['scrollContainer']
|
|
171
|
+
}] } });
|
|
172
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZS1jb250cm9sbGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dhbW1hLWFwcC1jb250cm9sbGVyL3NyYy9saWIvYXBwbGljYXRpb24tY29udHJvbGxlci9wYWdlLWNvbnRyb2xsZXIvcGFnZS1jb250cm9sbGVyL3BhZ2UtY29udHJvbGxlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nYW1tYS1hcHAtY29udHJvbGxlci9zcmMvbGliL2FwcGxpY2F0aW9uLWNvbnRyb2xsZXIvcGFnZS1jb250cm9sbGVyL3BhZ2UtY29udHJvbGxlci9wYWdlLWNvbnRyb2xsZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBc0IsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR3pFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztBQVcvQyxNQUFNLE9BQU8sc0JBQXNCO0lBMEJqQyxZQUNVLE1BQWMsRUFBUyxhQUE0QixFQUFVLE9BQWtDLEVBQy9GLE1BQXFCLEVBQVUsbUJBQXdDO1FBRHZFLFdBQU0sR0FBTixNQUFNLENBQVE7UUFBUyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUFVLFlBQU8sR0FBUCxPQUFPLENBQTJCO1FBQy9GLFdBQU0sR0FBTixNQUFNLENBQWU7UUFBVSx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBM0JqRixvQkFBZSxHQUFHO1lBQ2hCLFFBQVEsRUFBRSxFQUFFO1lBQ1osU0FBUyxFQUFFLEVBQUU7WUFDYixPQUFPLEVBQUUsRUFBRTtZQUNYLFlBQVksRUFBRSxFQUFFO1lBQ2hCLG9CQUFvQixFQUFFLEVBQUU7WUFDeEIsT0FBTyxFQUFFLEVBQUU7WUFDWCxRQUFRLEVBQUUsRUFBRTtTQUNiLENBQUE7UUFD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QyxNQUFNLENBQUMsYUFBYSxDQUFDLHlDQUF5QyxDQUFDLENBQUE7SUFDdEUsQ0FBQztJQUVELGNBQWM7UUFDWixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUMxRixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDOzttSEFuS1Usc0JBQXNCO3VHQUF0QixzQkFBc0IsbUxDZG5DLDR6T0F5SU07MkZEM0hPLHNCQUFzQjtrQkFMbEMsU0FBUzsrQkFDRSx5QkFBeUI7K05BNEJHLGVBQWU7c0JBQXBELFNBQVM7dUJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmF2aWdhdGlvbkV4dHJhcywgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFRvYXN0clNlcnZpY2UgfSBmcm9tICduZ3gtdG9hc3RyJztcbmltcG9ydCB7IGNvbmZpcm0gfSBmcm9tICdkZXZleHRyZW1lL3VpL2RpYWxvZyc7XG5pbXBvcnQgeyBBcHBsaWNhdGlvbkNvbnRlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vYXBwbGljYXRpb24tY29udGVudC5zZXJ2aWNlJztcbmltcG9ydCB7IER5bmFtaWNSb3V0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9wYWdlLXRlbXBsYXRlcy9keW5hbWljLXJvdXRlLXNlcnZpY2UnO1xuaW1wb3J0IHsgQ29tbW9uU2VydmljZSB9IGZyb20gJy4uLy4uL2NvbW1vbic7XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWRhc2hib3JkLWNvbnRyb2xsZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vcGFnZS1jb250cm9sbGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcGFnZS1jb250cm9sbGVyLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgUGFnZUNvbnRyb2xlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGRhc2hib2FyZENvbmZpZyA9IHtcbiAgICBwYWdlTmFtZTogXCJcIixcbiAgICBwYWdlVGl0bGU6IFwiXCIsXG4gICAgcGFnZVVybDogXCJcIixcbiAgICBwYWdlVGVtcGxhdGU6IFwiXCIsXG4gICAgcGFnZURvY3VtZW50YXRpb25Vcmw6IFwiXCIsXG4gICAgd2lkZ2V0czogW10sXG4gICAgZmlsdGVySWQ6IFwiXCJcbiAgfVxuICBpc05ld1RhbXBsZXRlQ3JlYXRlOiBib29sZWFuID0gZmFsc2U7XG4gIGlzTG9hZGVyOiBib29sZWFuID0gZmFsc2U7XG5cbiAgdGVtcGxhdGVEYXRhU291cmNlOiBhbnkgPSBbXTtcblxuICBmaWx0ZXJEYXRhU291cmNlOiBhbnk7XG5cbiAgY29tcG9uZW50VGVtcGxhdGVzID0gW1xuICAgIHsgXCJjb21wTmFtZVwiOiBcIktwaVdpdGhEYXRhU2V0VGVzdENvbXBvbmVudFwiLCBcIml0ZW1cIjogXCJEZWZhdWx0IEtQSSBMYXlvdXRcIiB9LFxuICAgIHsgXCJjb21wTmFtZVwiOiBcIkxhbmRpbmdDb21wb25lbnRDb21wb25lbnRcIiwgXCJpdGVtXCI6IFwiRGVmYXVsdCBQYWdlXCIgfSxcbiAgICB7IFwiY29tcE5hbWVcIjogXCJDZHJDb25maWdDb21wb25lbnRcIiwgXCJpdGVtXCI6IFwiQ0RSIENvbmZpZ1wiIH0sXG4gICAgeyBcImNvbXBOYW1lXCI6IFwiQ3JlYXRlS3BpVHJlZUNvbXBvbmVudFwiLCBcIml0ZW1cIjogXCJDcmVhdGUgS1BJIENvbmZpZ1wiIH0sXG4gIF1cblxuICBAVmlld0NoaWxkKCdzY3JvbGxDb250YWluZXInKSBwcml2YXRlIHNjcm9sbENvbnRhaW5lcjogRWxlbWVudFJlZjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLCBwdWJsaWMgY29tbW9uU2VydmljZTogQ29tbW9uU2VydmljZSwgcHJpdmF0ZSBzZXJ2aWNlOiBBcHBsaWNhdGlvbkNvbnRlbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgdG9hc3RyOiBUb2FzdHJTZXJ2aWNlLCBwcml2YXRlIGR5bmFtaWNSb3V0ZVNlcnZpY2U6IER5bmFtaWNSb3V0ZVNlcnZpY2VcbiAgKSB7XG5cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZ2V0QXBwUGFnZUNvbmZpZ3MoKTtcbiAgICB0aGlzLmdldEZpbHRlckRhdGFTZXQoKTtcbiAgfVxuICBnZXRGaWx0ZXJEYXRhU2V0KCkge1xuICAgIHRoaXMuc2VydmljZS5nZXRBcHBGaWx0ZXJDb25maWdzKCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5maWx0ZXJEYXRhU291cmNlID0gZGF0YTtcbiAgICAgICAgdGhpcy5pc0xvYWRlciA9IGZhbHNlO1xuICAgICAgfSwgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcignVW5leHBlY3RlZCBTZXJ2ZXIgRXhjZXB0aW9uLiBQbGVhc2UgY29udGFjdCBTeXN0ZW0gQWRtaW4uJywgJ1BhZ2UgQ3JlYXRpb24nKVxuXG4gICAgICB9XG4gICAgfSlcbiAgfVxuICBnZXRBcHBQYWdlQ29uZmlncygpIHtcbiAgICB0aGlzLnNlcnZpY2UuZ2V0QXBwUGFnZUNvbmZpZ3MoKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnRlbXBsYXRlRGF0YVNvdXJjZSA9IGRhdGE7XG4gICAgICAgIHRoaXMuaXNMb2FkZXIgPSBmYWxzZTtcbiAgICAgIH0sIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdQYWdlIENyZWF0aW9uJylcblxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBjcmVhdGVOZXdUYW1wbGV0ZSgpIHtcbiAgICB0aGlzLmlzTmV3VGFtcGxldGVDcmVhdGUgPSB0cnVlO1xuICAgIHRoaXMuZGFzaGJvYXJkQ29uZmlnID0ge1xuICAgICAgcGFnZU5hbWU6IFwiXCIsXG4gICAgICBwYWdlVGl0bGU6IFwiXCIsXG4gICAgICBwYWdlVXJsOiBcIlwiLFxuICAgICAgcGFnZVRlbXBsYXRlOiBcIlwiLFxuICAgICAgcGFnZURvY3VtZW50YXRpb25Vcmw6IFwiXCIsXG4gICAgICB3aWRnZXRzOiBbXSxcbiAgICAgIGZpbHRlcklkOiBcIlwiXG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xuICAgIH0sIDEwMCk7XG4gIH1cblxuICB2aWV3c1BhZ2UoaXRlbSkge1xuICAgIGxldCBuYXZpZ2F0aW9uRXh0cmFzOiBOYXZpZ2F0aW9uRXh0cmFzID0ge1xuICAgICAgcXVlcnlQYXJhbXM6IHtcbiAgICAgICAgXCJwYWdlSWRcIjogaXRlbS5wYWdlSWRcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2l0ZW0ucGFnZVVybF0sIG5hdmlnYXRpb25FeHRyYXMpXG4gIH1cbiAgZGVsZXRlVGFtcGxldGUoaXRlbSkge1xuICAgIGxldCByZXN1bHQgPSBjb25maXJtKFwiPGk+QXJlIFlvdSBTdXJlPzwvaT5cIiwgXCJEZWxldGUgRmlsdGVyXCIpO1xuICAgIHJlc3VsdC50aGVuKChkaWFsb2dSZXN1bHQpID0+IHtcbiAgICAgIGlmIChkaWFsb2dSZXN1bHQpIHtcbiAgICAgICAgdGhpcy5pc0xvYWRlciA9IHRydWU7XG4gICAgICAgIHRoaXMuc2VydmljZS5kZWxldGVBcHBQYWdlQ29uZmlnKGl0ZW0ucGFnZUlkKS5zdWJzY3JpYmUoKHZhbDogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5nZXRBcHBQYWdlQ29uZmlncygpO1xuICAgICAgICAgIHRoaXMuaXNMb2FkZXIgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnRvYXN0ci5zdWNjZXNzKCdQYWdlIERlbGV0ZWQgU3VjY2Vzc2Z1bGx5JylcbiAgICAgICAgfSwgZXJyID0+IHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAgICAgIHRoaXMudG9hc3RyLmVycm9yKCdVbmV4cGVjdGVkIFNlcnZlciBFeGNlcHRpb24uIFBsZWFzZSBjb250YWN0IFN5c3RlbSBBZG1pbi4nLCAnUnVsZSBNb2R1bGUnKTtcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGVkaXRUZW1wbGF0ZShpdGVtKSB7XG4gICAgdGhpcy5kYXNoYm9hcmRDb25maWcgPSBpdGVtO1xuICAgIHRoaXMuaXNOZXdUYW1wbGV0ZUNyZWF0ZSA9IHRydWU7XG4gICAgdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xuICB9XG5cbiAgZ2V0U2F2ZUNoYXJ0Q29uZmlnKCkge1xuXG4gICAgaWYgKHRoaXMuZGFzaGJvYXJkQ29uZmlnWydwYWdlSWQnXSkge1xuICAgICAgdGhpcy5zZXJ2aWNlLmVkaXRBcHBQYWdlQ29uZmlnKHRoaXMuZGFzaGJvYXJkQ29uZmlnKS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5pc05ld1RhbXBsZXRlQ3JlYXRlID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5nZXRBcHBQYWdlQ29uZmlncygpO1xuICAgICAgICAgIHRoaXMudG9hc3RyLnN1Y2Nlc3MoJ1BhZ2UgVXBkYXRlIFN1Y2Nlc3NmdWxseScpXG4gICAgICAgIH0sIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcignVW5leHBlY3RlZCBTZXJ2ZXIgRXhjZXB0aW9uLiBQbGVhc2UgY29udGFjdCBTeXN0ZW0gQWRtaW4uJywgJ1BhZ2UgQ3JlYXRpb24nKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlcnZpY2UuY3JlYXRlQXBwUGFnZUNvbmZpZyh0aGlzLmRhc2hib2FyZENvbmZpZykuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuaXNOZXdUYW1wbGV0ZUNyZWF0ZSA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuZ2V0QXBwUGFnZUNvbmZpZ3MoKTtcbiAgICAgICAgICB0aGlzLnRvYXN0ci5zdWNjZXNzKCdQYWdlIENyZWF0ZWQgU3VjY2Vzc2Z1bGx5JylcbiAgICAgICAgfSwgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMudG9hc3RyLmVycm9yKCdVbmV4cGVjdGVkIFNlcnZlciBFeGNlcHRpb24uIFBsZWFzZSBjb250YWN0IFN5c3RlbSBBZG1pbi4nLCAnUGFnZSBDcmVhdGlvbicpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgdmlld0NvbmZpZ3VyZWRUZW1wbGF0ZShpdGVtKSB7XG4gICAgbGV0IG5hdmlnYXRpb246IE5hdmlnYXRpb25FeHRyYXMgPSB7XG4gICAgICBxdWVyeVBhcmFtczoge1xuICAgICAgICAncGFnZUlkJzogaXRlbS5wYWdlSWQsXG4gICAgICAgICdjb250ZW50VHlwZSc6IFwidmlld1wiLFxuXG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9hcHBzL2NvbnRyb2xQYW5lbC9wYWdlQ29uZmlnQ29udHJvbGxlciddLCBuYXZpZ2F0aW9uKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZWRUZW1wbGF0ZShpdGVtKSB7XG4gICAgbGV0IG5hdmlnYXRpb246IE5hdmlnYXRpb25FeHRyYXMgPSB7XG4gICAgICBxdWVyeVBhcmFtczoge1xuICAgICAgICAncGFnZUlkJzogaXRlbS5wYWdlSWQsXG4gICAgICAgICdjb250ZW50VHlwZSc6IFwiZWRpdFwiLFxuXG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9hcHBzL2NvbnRyb2xQYW5lbC9wYWdlQ29uZmlnQ29udHJvbGxlciddLCBuYXZpZ2F0aW9uKTtcbiAgfVxuXG5cbiAgZ2V0Q3JlYXRlRGFzaGJvYXJkKCkge1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwoJy9hcHBzL2NvbnRyb2xQYW5lbC9wYWdlQ29uZmlnQ29udHJvbGxlcicpXG4gIH1cblxuICBzY3JvbGxUb0JvdHRvbSgpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnZW5kJyB9KTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8vIHNjcm9sbFRvQm90dG9tKCk6IHZvaWQge1xuICAvLyAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHQ7XG4gIC8vIH1cblxuXG5cbiAgLy8gYWRkUm91dGVzQW5kTmF2aWdhdGUocm91dGVDb25maWcpIHtcbiAgLy8gICBjb25zdCBjb21wb25lbnRNYXAgPSB7XG4gIC8vICAgICAnS3BpVHJlZVZpZXdDb21wb25lbnQnOiBLcGlUcmVlVmlld0NvbXBvbmVudCxcbiAgLy8gICAgICdCb29rbWFya2VkVGVtcGxhdGVDb21wb25lbnQnOiBCb29rbWFya2VkVGVtcGxhdGVDb21wb25lbnRcbiAgLy8gICB9O1xuICAvLyAgIGNvbnN0IGR5bmFtaWNSb3V0ZSA9IHtcbiAgLy8gICAgIHBhdGg6IHJvdXRlQ29uZmlnLnBhdGgsXG4gIC8vICAgICBjb21wb25lbnQ6IGNvbXBvbmVudE1hcFtyb3V0ZUNvbmZpZy5jb21wTmFtZV0sXG4gIC8vICAgfTtcblxuICAvLyAgIC8vIEZpbmQgdGhlIHBhcmVudCByb3V0ZSAoZS5nLiwgTWFpbkxheW91dENvbXBvbmVudClcbiAgLy8gICBjb25zdCBtYWluTGF5b3V0Um91dGUgPSB0aGlzLnJvdXRlci5jb25maWcuZmluZChyb3V0ZSA9PiByb3V0ZS5jb21wb25lbnQgPT09IExheW91dENvbXBvbmVudCk7XG5cbiAgLy8gICBpZiAobWFpbkxheW91dFJvdXRlKSB7XG4gIC8vICAgICBpZiAoIW1haW5MYXlvdXRSb3V0ZS5jaGlsZHJlbikge1xuICAvLyAgICAgICBtYWluTGF5b3V0Um91dGUuY2hpbGRyZW4gPSBbXTtcbiAgLy8gICAgIH1cblxuICAvLyAgICAgLy8gQWRkIHRoZSBkeW5hbWljIHJvdXRlIGFzIGEgY2hpbGQgb2YgdGhlIG1haW4gbGF5b3V0IHJvdXRlXG4gIC8vICAgICBtYWluTGF5b3V0Um91dGUuY2hpbGRyZW4ucHVzaChkeW5hbWljUm91dGUpO1xuICAvLyAgIH0gZWxzZSB7XG4gIC8vICAgICAvLyBGYWxsYmFjazogQWRkIHRoZSByb3V0ZSBkaXJlY3RseSAodGhpcyBtYXkgY2F1c2UgaXNzdWVzIGlmIHRoZSBsYXlvdXQgaXMgbWlzc2luZylcbiAgLy8gICAgIHRoaXMucm91dGVyLmNvbmZpZy5wdXNoKGR5bmFtaWNSb3V0ZSk7XG4gIC8vICAgfVxuXG4gIC8vICAgLy8gTmF2aWdhdGUgdG8gdGhlIG5ld2x5IGFkZGVkIHJvdXRlXG4gIC8vICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3JvdXRlQ29uZmlnLnBhdGhdKTtcbiAgLy8gfVxuXG59XG4iLCI8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBmbGV4LWF1dG8gbWluLXctMFwiPlxuXG4gICAgPGxpYi1jb21tb24taGVhZGVyIFtwYWdlVGl0bGVdPVwiJyBBcHBsaWNhdGlvbiBQYWdlcydcIj48L2xpYi1jb21tb24taGVhZGVyPlxuXG5cblxuICAgIDxkaXYgY2xhc3M9XCJwLTQgdy1mdWxsXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtLTMgcC00IGJnLXdoaXRlIGJvcmRlciBib3JkZXItZ3JheS0yMDAgcm91bmRlZC1sZyBzaGFkb3ctbWQgZGFyazpiZy1ncmF5LTgwMCBkYXJrOmJvcmRlci1ncmF5LTcwMFwiPlxuICAgICAgICAgICAgPGg2IGNsYXNzPVwibWItMiB0ZXh0LWxnIHRyYWNraW5nLXRpZ2h0IHRleHQtZ3JheS05MDAgZGFyazp0ZXh0LXdoaXRlIGJvcmRlci1iIHBiLTMgZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXRhYmxlIG1yLTJcIj48L2k+IE1hbmFnZSBQYWdlc1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtbC1hdXRvXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3ByaW1hcnlfbWR9fVwiIChjbGljayk9XCJjcmVhdGVOZXdUYW1wbGV0ZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUgTmV3IFBhZ2VcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2g2PlxuICAgICAgICAgICAgPGFwcC1sb2FkZXIgKm5nSWY9XCJpc0xvYWRlclwiPjwvYXBwLWxvYWRlcj5cbiAgICAgICAgICAgIDxkeC1kYXRhLWdyaWQgW2NvbHVtbkF1dG9XaWR0aF09XCJ0cnVlXCIgW2RhdGFTb3VyY2VdPVwidGVtcGxhdGVEYXRhU291cmNlXCIgW2hvdmVyU3RhdGVFbmFibGVkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiIWlzTG9hZGVyXCIgW3NlbGVjdGVkUm93S2V5c109XCJbXVwiIFtzaG93Qm9yZGVyc109XCJ0cnVlXCIgW3Nob3dDb2x1bW5MaW5lc109XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbc2hvd1Jvd0xpbmVzXT1cInRydWVcIj5cbiAgICAgICAgICAgICAgICA8ZHhvLXBhZ2luZyBbcGFnZVNpemVdPVwiMTBcIj48L2R4by1wYWdpbmc+XG4gICAgICAgICAgICAgICAgPGR4by1leHBvcnQgW2VuYWJsZWRdPVwidHJ1ZVwiPjwvZHhvLWV4cG9ydD5cbiAgICAgICAgICAgICAgICA8ZHhvLXNlYXJjaC1wYW5lbCBbaGlnaGxpZ2h0Q2FzZVNlbnNpdGl2ZV09XCJ0cnVlXCIgW3Zpc2libGVdPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgIDwvZHhvLXNlYXJjaC1wYW5lbD5cblxuICAgICAgICAgICAgICAgIDxkeGktY29sdW1uIGRhdGFGaWVsZD1cInBhZ2VOYW1lXCI+PC9keGktY29sdW1uPlxuICAgICAgICAgICAgICAgIDxkeGktY29sdW1uIGRhdGFGaWVsZD1cInBhZ2VUaXRsZVwiPjwvZHhpLWNvbHVtbj5cbiAgICAgICAgICAgICAgICA8IS0tIDxkeGktY29sdW1uIGRhdGFGaWVsZD1cInBhZ2VUZW1wbGF0ZVwiPjwvZHhpLWNvbHVtbj4gLS0+XG4gICAgICAgICAgICAgICAgPGR4aS1jb2x1bW4gZGF0YUZpZWxkPVwicGFnZUlkXCI+PC9keGktY29sdW1uPlxuICAgICAgICAgICAgICAgIDxkeGktY29sdW1uIGRhdGFGaWVsZD1cInBhZ2VVcmxcIj48L2R4aS1jb2x1bW4+XG4gICAgICAgICAgICAgICAgPCEtLSA8ZHhpLWNvbHVtbiBkYXRhRmllbGQ9XCJjcmVhdGVkQnlcIj48L2R4aS1jb2x1bW4+IC0tPlxuICAgICAgICAgICAgICAgIDwhLS0gPGR4aS1jb2x1bW4gZGF0YUZpZWxkPVwiY3JlYXRpb25EYXRlXCI+PC9keGktY29sdW1uPiAtLT5cbiAgICAgICAgICAgICAgICA8ZHhpLWNvbHVtbiBkYXRhRmllbGQ9XCJDb25maWd1cmVkXCIgY2VsbFRlbXBsYXRlPVwiY2VsbFRlbXBsYXRlMlwiPjwvZHhpLWNvbHVtbj5cbiAgICAgICAgICAgICAgICA8ZHhpLWNvbHVtbiBkYXRhRmllbGQ9XCJhY3Rpb25cIiBjZWxsVGVtcGxhdGU9XCJjZWxsVGVtcGxhdGVcIj48L2R4aS1jb2x1bW4+XG4gICAgICAgICAgICAgICAgPGRpdiAqZHhUZW1wbGF0ZT1cImxldCBkYXRhIG9mICdjZWxsVGVtcGxhdGUnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3ByaW1hcnlfbWR9fVwiIChjbGljayk9XCJlZGl0VGVtcGxhdGUoZGF0YS5kYXRhKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgRWRpdFxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fc3VjY2Vzc19tZH19XCIgKGNsaWNrKT1cInZpZXdzUGFnZShkYXRhLmRhdGEpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBWaWV3IFBhZ2VcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2Rhbmdlcl9tZH19XCIgKGNsaWNrKT1cImRlbGV0ZVRhbXBsZXRlKGRhdGEuZGF0YSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0ZVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpkeFRlbXBsYXRlPVwibGV0IGRhdGEgb2YgJ2NlbGxUZW1wbGF0ZTInXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fc3VjY2Vzc19tZH19XCIgKGNsaWNrKT1cImNvbmZpZ3VyZWRUZW1wbGF0ZShkYXRhLmRhdGEpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmVcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuXG5cbiAgICAgICAgICAgIDwvZHgtZGF0YS1ncmlkPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgI3Njcm9sbENvbnRhaW5lcj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInAtMlwiICpuZ0lmPVwiaXNOZXdUYW1wbGV0ZUNyZWF0ZVwiPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwibS0zIHAtNCBiZy13aGl0ZSBib3JkZXIgYm9yZGVyLWdyYXktMjAwIHJvdW5kZWQtbGcgc2hhZG93LW1kIGRhcms6YmctZ3JheS04MDAgZGFyazpib3JkZXItZ3JheS03MDBcIj5cbiAgICAgICAgICAgICAgICA8aDZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtYi0yIGZvbnQtYm9sZCB0ZXh0LWxnIHRyYWNraW5nLXRpZ2h0IHRleHQtZ3JheS05MDAgZGFyazp0ZXh0LXdoaXRlIGJvcmRlci1iIHBiLTMgZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS10YWJsZSBtci0yXCI+PC9pPiBDcmVhdGUgUGFnZVxuICAgICAgICAgICAgICAgIDwvaDY+XG5cbiAgICAgICAgICAgICAgICA8IS0tIEZsZXggY29udGFpbmVyIGZvciBmb3JtIGZpZWxkcyAtLT5cbiAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMS8yIHB4LTIgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPlBhZ2UgTmFtZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiZGFzaGJvYXJkQ29uZmlnLnBhZ2VOYW1lXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEvMiBweC0yIG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTFcIj5QYWdlIFRpdGxlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJkYXNoYm9hcmRDb25maWcucGFnZVRpdGxlXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEvMiBweC0yIG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTFcIj5QYWdlIFVSTDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiZGFzaGJvYXJkQ29uZmlnLnBhZ2VVcmxcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMS8yIHB4LTIgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPlBhZ2UgVGVtcGxhdGU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtpdGVtc109XCJjb21wb25lbnRUZW1wbGF0ZXNcIiBkaXNwbGF5RXhwcj1cIml0ZW1cIiB2YWx1ZUV4cHI9XCJjb21wTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJkYXNoYm9hcmRDb25maWcucGFnZVRlbXBsYXRlXCIgc2VhcmNoRW5hYmxlZD1cInRydWVcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xLzIgcHgtMiBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0xXCI+UGFnZSBEb2N1bWVudGF0aW9uIFVybDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiZGFzaGJvYXJkQ29uZmlnLnBhZ2VEb2N1bWVudGF0aW9uVXJsXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEvMiBweC0yIG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTFcIj5QYWdlIEZpbHRlcjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW2l0ZW1zXT1cImZpbHRlckRhdGFTb3VyY2VcIiBkaXNwbGF5RXhwcj1cImZpbHRlck5hbWVcIiB2YWx1ZUV4cHI9XCJmaWx0ZXJJZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJkYXNoYm9hcmRDb25maWcuZmlsdGVySWRcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZCBncmlkLWNvbHMtMiBnYXAtNCB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPlBhZ2UgTmFtZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiZGFzaGJvYXJkQ29uZmlnLnBhZ2VOYW1lXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTFcIj5QYWdlIFRpdGxlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJkYXNoYm9hcmRDb25maWcucGFnZVRpdGxlXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTFcIj5QYWdlIFVSTDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiZGFzaGJvYXJkQ29uZmlnLnBhZ2VVcmxcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPlBhZ2UgVGVtcGxhdGU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtpdGVtc109XCJjb21wb25lbnRUZW1wbGF0ZXNcIiBkaXNwbGF5RXhwcj1cIml0ZW1cIiB2YWx1ZUV4cHI9XCJjb21wTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJkYXNoYm9hcmRDb25maWcucGFnZVRlbXBsYXRlXCIgW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTFcIj5QYWdlIERvY3VtZW50YXRpb24gVXJsPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJkYXNoYm9hcmRDb25maWcucGFnZURvY3VtZW50YXRpb25VcmxcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPlBhZ2UgRmlsdGVyPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbaXRlbXNdPVwiZmlsdGVyRGF0YVNvdXJjZVwiIGRpc3BsYXlFeHByPVwiZmlsdGVyTmFtZVwiIHZhbHVlRXhwcj1cImZpbHRlcklkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImRhc2hib2FyZENvbmZpZy5maWx0ZXJJZFwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8IS0tIFN1Ym1pdCBidXR0b24gLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1lbmQgbXgtMSBmbGV4LWdyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fc3VjY2Vzc19tZH19IGN1cnNvci1wb2ludGVyIG10LTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImdldFNhdmVDaGFydENvbmZpZygpXCI+U3VibWl0IFRlbXBsYXRlPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cblxuXG48L2Rpdj4iXX0=
|