raise-common-lib-new 0.0.62 → 0.0.64
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/esm2022/lib/actions/toolbar/index.component.mjs +4 -3
- package/esm2022/lib/actions/toolbar-item/index.component.mjs +2 -2
- package/esm2022/lib/common-grid/grid-action/grid-action-item/grid-action-item.component.mjs +1 -1
- package/esm2022/lib/common-grid/grid-action/grid-action.component.mjs +3 -2
- package/esm2022/lib/common-grid/index.component.mjs +6 -3
- package/esm2022/lib/dashboard/api.mjs +33 -0
- package/esm2022/lib/dashboard/bar-charts/bar-charts.component.mjs +430 -0
- package/esm2022/lib/dashboard/bar-charts/utils.mjs +18 -0
- package/esm2022/lib/dashboard/dashboard-properties/data-mart-new/data-mart-new.component.mjs +442 -0
- package/esm2022/lib/dashboard/dashboard.service.mjs +295 -0
- package/esm2022/lib/dashboard/dashboardPorlets.service.mjs +2169 -0
- package/esm2022/lib/dashboard/dialog-group/download/index.component.mjs +212 -0
- package/esm2022/lib/dashboard/dialog-group/empty-icon-prompt/empty-icon-prompt.component.mjs +36 -0
- package/esm2022/lib/dashboard/gadget-group/gadget-pivot/gadget-pivot.component.mjs +3211 -0
- package/esm2022/lib/dashboard/gadget-group/gadget-pivot-chart/gadget-pivot.component.mjs +3117 -0
- package/esm2022/lib/dashboard/gadget-group/gadget-table/gadget-table.component.mjs +1099 -0
- package/esm2022/lib/dashboard/gadget-group/gadget-transpose/gadget-transpose.component.mjs +583 -0
- package/esm2022/lib/dashboard/pane-group-new.component.mjs +2031 -0
- package/esm2022/lib/dashboard/sidebar-iconlist/field-filter/field-filter.component.mjs +637 -0
- package/esm2022/lib/dashboard/sidebar-iconlist/field-format/field-format.component.mjs +753 -0
- package/esm2022/lib/dashboard/sidebar-iconlist/portlet-type-new/portlet-type-new.component.mjs +216 -0
- package/esm2022/lib/dashboard/sidebar-iconlist/sidebar-iconlist-new.component.mjs +1239 -0
- package/esm2022/lib/dialog/common-delete-dialog/index.component.mjs +1 -1
- package/esm2022/lib/dialog/common-dialog/index.component.mjs +16 -5
- package/esm2022/lib/float-box/index.component.mjs +18 -4
- package/esm2022/lib/form/checkbox-group/index.component.mjs +35 -5
- package/esm2022/lib/form/drawer-form/drawer-form.component.mjs +177 -76
- package/esm2022/lib/form/richtexteditor/index.component.mjs +7 -9
- package/esm2022/lib/layout/drawer/index.component.mjs +2 -2
- package/esm2022/lib/layout/page-list/index.component.mjs +9 -3
- package/esm2022/lib/layout/page-tab/index.component.mjs +5 -3
- package/esm2022/lib/layout/rs-stepper/constants.mjs +2 -0
- package/esm2022/lib/layout/rs-stepper/index.component.mjs +148 -0
- package/esm2022/lib/raise-common-lib.module.mjs +114 -7
- package/esm2022/lib/service/InjectionToken.mjs +5 -0
- package/esm2022/lib/service/keep-alive.service.mjs +2 -2
- package/esm2022/lib/smart-popup/index.component.mjs +1084 -0
- package/esm2022/public-api.mjs +19 -1
- package/fesm2022/raise-common-lib-new.mjs +18042 -227
- package/fesm2022/raise-common-lib-new.mjs.map +1 -1
- package/lib/common-grid/index.component.d.ts +2 -1
- package/lib/dashboard/api.d.ts +24 -0
- package/lib/dashboard/bar-charts/bar-charts.component.d.ts +63 -0
- package/lib/dashboard/bar-charts/utils.d.ts +1 -0
- package/lib/dashboard/dashboard-properties/data-mart-new/data-mart-new.component.d.ts +52 -0
- package/lib/dashboard/dashboard.service.d.ts +152 -0
- package/lib/dashboard/dashboardPorlets.service.d.ts +214 -0
- package/lib/dashboard/dialog-group/download/index.component.d.ts +36 -0
- package/lib/dashboard/dialog-group/empty-icon-prompt/empty-icon-prompt.component.d.ts +15 -0
- package/lib/dashboard/gadget-group/gadget-pivot/gadget-pivot.component.d.ts +128 -0
- package/lib/dashboard/gadget-group/gadget-pivot-chart/gadget-pivot.component.d.ts +131 -0
- package/lib/dashboard/gadget-group/gadget-table/gadget-table.component.d.ts +77 -0
- package/lib/dashboard/gadget-group/gadget-transpose/gadget-transpose.component.d.ts +47 -0
- package/lib/dashboard/pane-group-new.component.d.ts +169 -0
- package/lib/dashboard/sidebar-iconlist/field-filter/field-filter.component.d.ts +56 -0
- package/lib/dashboard/sidebar-iconlist/field-format/field-format.component.d.ts +62 -0
- package/lib/dashboard/sidebar-iconlist/portlet-type-new/portlet-type-new.component.d.ts +30 -0
- package/lib/dashboard/sidebar-iconlist/sidebar-iconlist-new.component.d.ts +150 -0
- package/lib/dialog/common-dialog/index.component.d.ts +3 -1
- package/lib/float-box/index.component.d.ts +4 -3
- package/lib/form/checkbox-group/index.component.d.ts +5 -0
- package/lib/form/drawer-form/drawer-form.component.d.ts +21 -8
- package/lib/form/richtexteditor/index.component.d.ts +1 -3
- package/lib/layout/page-list/index.component.d.ts +3 -1
- package/lib/layout/page-tab/index.component.d.ts +1 -0
- package/lib/layout/rs-stepper/constants.d.ts +5 -0
- package/lib/layout/rs-stepper/index.component.d.ts +31 -0
- package/lib/raise-common-lib.module.d.ts +61 -40
- package/lib/service/InjectionToken.d.ts +4 -0
- package/lib/smart-popup/index.component.d.ts +60 -0
- package/package.json +1 -1
- package/public-api.d.ts +18 -0
- package/src/assets/img/dashboard_icon/AddPerson.svg +4 -0
- package/src/assets/img/dashboard_icon/Angle-double-left.svg +12 -0
- package/src/assets/img/dashboard_icon/Angle-double-right.svg +12 -0
- package/src/assets/img/dashboard_icon/Arrow_collapse.svg +3 -0
- package/src/assets/img/dashboard_icon/Arrow_expand.svg +3 -0
- package/src/assets/img/dashboard_icon/Close.svg +4 -0
- package/src/assets/img/dashboard_icon/Edit_label.svg +3 -0
- package/src/assets/img/dashboard_icon/RemoveMini.svg +3 -0
- package/src/assets/img/dashboard_icon/ShareTo.svg +3 -0
- package/src/assets/img/dashboard_icon/add-dashboard.svg +4 -0
- package/src/assets/img/dashboard_icon/add-tab.svg +4 -0
- package/src/assets/img/dashboard_icon/angle-left.svg +12 -0
- package/src/assets/img/dashboard_icon/angle-right.svg +12 -0
- package/src/assets/img/dashboard_icon/area-white.svg +3 -0
- package/src/assets/img/dashboard_icon/area.svg +3 -0
- package/src/assets/img/dashboard_icon/bar-white.svg +14 -0
- package/src/assets/img/dashboard_icon/bar.svg +14 -0
- package/src/assets/img/dashboard_icon/basic-icon-filter.svg +14 -0
- package/src/assets/img/dashboard_icon/chart-combined-active.svg +7 -0
- package/src/assets/img/dashboard_icon/chart-combined.svg +7 -0
- package/src/assets/img/dashboard_icon/column-white.svg +14 -0
- package/src/assets/img/dashboard_icon/column.svg +26 -0
- package/src/assets/img/dashboard_icon/customize.png +0 -0
- package/src/assets/img/dashboard_icon/dashboard-description.svg +18 -0
- package/src/assets/img/dashboard_icon/dashboard-download.svg +18 -0
- package/src/assets/img/dashboard_icon/dashboard-drag.svg +28 -0
- package/src/assets/img/dashboard_icon/dashboard-duplicate.svg +24 -0
- package/src/assets/img/dashboard_icon/dashboard-icon.svg +12 -0
- package/src/assets/img/dashboard_icon/dashboard-properties.svg +18 -0
- package/src/assets/img/dashboard_icon/dashboard-rename.svg +18 -0
- package/src/assets/img/dashboard_icon/dashboard-share.svg +20 -0
- package/src/assets/img/dashboard_icon/dashboard-tab-delete.svg +4 -0
- package/src/assets/img/dashboard_icon/dashboard_Share.svg +3 -0
- package/src/assets/img/dashboard_icon/dashboard_ToolsHide.svg +4 -0
- package/src/assets/img/dashboard_icon/datamart_.svg +5 -0
- package/src/assets/img/dashboard_icon/datamart_Admin.svg +3 -0
- package/src/assets/img/dashboard_icon/datamart_Asset Portfolio.svg +4 -0
- package/src/assets/img/dashboard_icon/datamart_Bank.svg +3 -0
- package/src/assets/img/dashboard_icon/datamart_CRM.svg +6 -0
- package/src/assets/img/dashboard_icon/datamart_Company.svg +6 -0
- package/src/assets/img/dashboard_icon/datamart_Compliance.svg +3 -0
- package/src/assets/img/dashboard_icon/datamart_Contact.svg +3 -0
- package/src/assets/img/dashboard_icon/datamart_DASHBOARD.svg +4 -0
- package/src/assets/img/dashboard_icon/datamart_DOCX.svg +4 -0
- package/src/assets/img/dashboard_icon/datamart_ESG.svg +4 -0
- package/src/assets/img/dashboard_icon/datamart_Financials - Company.svg +3 -0
- package/src/assets/img/dashboard_icon/datamart_Fund.svg +4 -0
- package/src/assets/img/dashboard_icon/datamart_FundFinancial.svg +4 -0
- package/src/assets/img/dashboard_icon/datamart_HTML.svg +4 -0
- package/src/assets/img/dashboard_icon/datamart_Logs.svg +8 -0
- package/src/assets/img/dashboard_icon/datamart_PDF.svg +5 -0
- package/src/assets/img/dashboard_icon/datamart_Project.svg +3 -0
- package/src/assets/img/dashboard_icon/datamart_Templates.svg +7 -0
- package/src/assets/img/dashboard_icon/datamart_Track Change.svg +3 -0
- package/src/assets/img/dashboard_icon/datamart_VirtualGroup.svg +5 -0
- package/src/assets/img/dashboard_icon/datamart_XLS.svg +4 -0
- package/src/assets/img/dashboard_icon/desktop_selected.svg +10 -0
- package/src/assets/img/dashboard_icon/desktop_unselected.svg +10 -0
- package/src/assets/img/dashboard_icon/favourite-grey.svg +3 -0
- package/src/assets/img/dashboard_icon/favourite-yellow.svg +3 -0
- package/src/assets/img/dashboard_icon/forms-checkbox-square-tick.svg +3 -0
- package/src/assets/img/dashboard_icon/ftable-white.svg +24 -0
- package/src/assets/img/dashboard_icon/ftable.svg +24 -0
- package/src/assets/img/dashboard_icon/gadget-basic-arrow-down.svg +14 -0
- package/src/assets/img/dashboard_icon/gadget-basic-format.svg +21 -0
- package/src/assets/img/dashboard_icon/gadget-basic-sub-total.svg +18 -0
- package/src/assets/img/dashboard_icon/gadget-basic-total-1.svg +9 -0
- package/src/assets/img/dashboard_icon/gadget-basic-total.svg +16 -0
- package/src/assets/img/dashboard_icon/gadget-columns.svg +12 -0
- package/src/assets/img/dashboard_icon/gadget-delete.svg +18 -0
- package/src/assets/img/dashboard_icon/gadget-download.svg +18 -0
- package/src/assets/img/dashboard_icon/gadget-duplicate.svg +24 -0
- package/src/assets/img/dashboard_icon/gadget-edit.svg +18 -0
- package/src/assets/img/dashboard_icon/gadget-filters-light.svg +9 -0
- package/src/assets/img/dashboard_icon/gadget-filters.svg +9 -0
- package/src/assets/img/dashboard_icon/gadget-format-0.svg +8 -0
- package/src/assets/img/dashboard_icon/gadget-format-1.svg +8 -0
- package/src/assets/img/dashboard_icon/gadget-format.svg +19 -0
- package/src/assets/img/dashboard_icon/gadget-fullscreen.svg +30 -0
- package/src/assets/img/dashboard_icon/gadget-settings.svg +18 -0
- package/src/assets/img/dashboard_icon/gadget-sub-total-0.svg +18 -0
- package/src/assets/img/dashboard_icon/gadget-sub-total-1.svg +18 -0
- package/src/assets/img/dashboard_icon/gadget-thumbnail.svg +12 -0
- package/src/assets/img/dashboard_icon/gadget-type-light.svg +15 -0
- package/src/assets/img/dashboard_icon/gadget-type.svg +16 -0
- package/src/assets/img/dashboard_icon/geo-white.svg +14 -0
- package/src/assets/img/dashboard_icon/geo.svg +14 -0
- package/src/assets/img/dashboard_icon/historic-IRR-white.svg +9 -0
- package/src/assets/img/dashboard_icon/historic-IRR.svg +5 -0
- package/src/assets/img/dashboard_icon/information-1.png +0 -0
- package/src/assets/img/dashboard_icon/information-grey.svg +4 -0
- package/src/assets/img/dashboard_icon/menu-change-group.svg +3 -0
- package/src/assets/img/dashboard_icon/menu-close.svg +20 -0
- package/src/assets/img/dashboard_icon/menu-delete.svg +18 -0
- package/src/assets/img/dashboard_icon/menu-description.svg +19 -0
- package/src/assets/img/dashboard_icon/menu-download.svg +24 -0
- package/src/assets/img/dashboard_icon/menu-drag.svg +28 -0
- package/src/assets/img/dashboard_icon/menu-duplicate.svg +26 -0
- package/src/assets/img/dashboard_icon/menu-properties.svg +18 -0
- package/src/assets/img/dashboard_icon/menu-rename.svg +23 -0
- package/src/assets/img/dashboard_icon/menu-share.svg +20 -0
- package/src/assets/img/dashboard_icon/menu-toolbar.svg +10 -0
- package/src/assets/img/dashboard_icon/mobile_selected.svg +10 -0
- package/src/assets/img/dashboard_icon/mobile_unselected.svg +10 -0
- package/src/assets/img/dashboard_icon/more_Save.svg +3 -0
- package/src/assets/img/dashboard_icon/more_View.svg +3 -0
- package/src/assets/img/dashboard_icon/multi-series-white.svg +20 -0
- package/src/assets/img/dashboard_icon/multi-series.svg +6 -0
- package/src/assets/img/dashboard_icon/paint-bucket.svg +6 -0
- package/src/assets/img/dashboard_icon/pie-white.svg +16 -0
- package/src/assets/img/dashboard_icon/pie.svg +16 -0
- package/src/assets/img/dashboard_icon/pivot-chart-active.svg +8 -0
- package/src/assets/img/dashboard_icon/pivot-chart.svg +8 -0
- package/src/assets/img/dashboard_icon/pivot-white.svg +8 -0
- package/src/assets/img/dashboard_icon/pivot.svg +8 -0
- package/src/assets/img/dashboard_icon/pivot_column.svg +9 -0
- package/src/assets/img/dashboard_icon/pivot_column_active.svg +9 -0
- package/src/assets/img/dashboard_icon/pivot_line.svg +12 -0
- package/src/assets/img/dashboard_icon/pivot_line_active.svg +12 -0
- package/src/assets/img/dashboard_icon/print-A2.svg +3 -0
- package/src/assets/img/dashboard_icon/radar-white.svg +19 -0
- package/src/assets/img/dashboard_icon/radar.svg +19 -0
- package/src/assets/img/dashboard_icon/saveAs.svg +3 -0
- package/src/assets/img/dashboard_icon/search_input.svg +4 -0
- package/src/assets/img/dashboard_icon/table-3-white.svg +16 -0
- package/src/assets/img/dashboard_icon/table-3.svg +16 -0
- package/src/assets/img/dashboard_icon/table-filter-off.svg +5 -0
- package/src/assets/img/dashboard_icon/table-filter-on.svg +5 -0
- package/src/assets/img/dashboard_icon/tag_dashboard_selected.svg +3 -0
- package/src/assets/img/dashboard_icon/tag_dashboard_unselected.svg +3 -0
- package/src/assets/img/dashboard_icon/tag_share_selected.svg +3 -0
- package/src/assets/img/dashboard_icon/tag_share_unselected.svg +3 -0
- package/src/assets/img/dashboard_icon/tick.svg +26 -0
- package/src/assets/img/dashboard_icon/toolbar_AddDashboard.svg +5 -0
- package/src/assets/img/dashboard_icon/toolbar_AddGroup.svg +3 -0
- package/src/assets/img/dashboard_icon/toolbar_AddReport.svg +3 -0
- package/src/assets/img/dashboard_icon/toolbar_CollapseAll.svg +3 -0
- package/src/assets/img/dashboard_icon/toolbar_Customize.svg +3 -0
- package/src/assets/img/dashboard_icon/toolbar_DeleteDark.svg +3 -0
- package/src/assets/img/dashboard_icon/toolbar_Duplicate.svg +3 -0
- package/src/assets/img/dashboard_icon/toolbar_Edit.svg +3 -0
- package/src/assets/img/dashboard_icon/toolbar_ExpandAll.svg +3 -0
- package/src/assets/img/dashboard_icon/toolbar_Search.svg +3 -0
- package/src/assets/img/dashboard_icon/topbar-menu.svg +33 -0
- package/src/assets/img/dashboard_icon/topbar-refresh.svg +17 -0
- package/src/assets/img/dashboard_icon/topbar-tool-off.svg +12 -0
- package/src/assets/img/dashboard_icon/topbar-tool-on.svg +12 -0
- package/src/assets/img/dashboard_icon/trade-up-white.svg +14 -0
- package/src/assets/img/dashboard_icon/trade-up.svg +14 -0
- package/src/assets/img/dashboard_icon/transpose-white.svg +16 -0
- package/src/assets/img/dashboard_icon/transpose.svg +16 -0
|
@@ -0,0 +1,2031 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { Component, ViewChild, Output, ViewChildren, HostListener, Input, Optional, Inject, } from "@angular/core";
|
|
3
|
+
import { NavigationEnd } from "@angular/router";
|
|
4
|
+
import { API_SERVICE_TOKEN, PBF_TOKEN, ROLE_SERVICE_TOKEN, } from "../service/InjectionToken";
|
|
5
|
+
import CircularJSON from "circular-json";
|
|
6
|
+
import { MAT_DATE_FORMATS } from "@angular/material/core";
|
|
7
|
+
import { cloneDeep, find } from "lodash";
|
|
8
|
+
import { FieldFormatComponent } from "./sidebar-iconlist/field-format/field-format.component";
|
|
9
|
+
import { DataMartNewComponent } from "./dashboard-properties/data-mart-new/data-mart-new.component";
|
|
10
|
+
import { debounce } from "./bar-charts/utils";
|
|
11
|
+
import { DatePipe } from "@angular/common";
|
|
12
|
+
import { PaneDownloadComponent } from "./dialog-group/download/index.component";
|
|
13
|
+
import { filter } from "rxjs/operators";
|
|
14
|
+
import * as i0 from "@angular/core";
|
|
15
|
+
import * as i1 from "@angular/material/dialog";
|
|
16
|
+
import * as i2 from "../service/dialog.service";
|
|
17
|
+
import * as i3 from "./dashboard.service";
|
|
18
|
+
import * as i4 from "./api";
|
|
19
|
+
import * as i5 from "@angular/router";
|
|
20
|
+
import * as i6 from "./dashboardPorlets.service";
|
|
21
|
+
import * as i7 from "@angular/common/http";
|
|
22
|
+
import * as i8 from "@angular/common";
|
|
23
|
+
import * as i9 from "@angular/forms";
|
|
24
|
+
import * as i10 from "@angular/cdk/drag-drop";
|
|
25
|
+
import * as i11 from "@angular/material/tooltip";
|
|
26
|
+
import * as i12 from "@angular/material/button";
|
|
27
|
+
import * as i13 from "@syncfusion/ej2-angular-layouts";
|
|
28
|
+
import * as i14 from "ng-inline-svg-2";
|
|
29
|
+
import * as i15 from "./sidebar-iconlist/sidebar-iconlist-new.component";
|
|
30
|
+
import * as i16 from "./dialog-group/empty-icon-prompt/empty-icon-prompt.component";
|
|
31
|
+
import * as i17 from "./gadget-group/gadget-table/gadget-table.component";
|
|
32
|
+
import * as i18 from "./gadget-group/gadget-pivot/gadget-pivot.component";
|
|
33
|
+
import * as i19 from "./gadget-group/gadget-pivot-chart/gadget-pivot.component";
|
|
34
|
+
import * as i20 from "./gadget-group/gadget-transpose/gadget-transpose.component";
|
|
35
|
+
import * as i21 from "./bar-charts/bar-charts.component";
|
|
36
|
+
let dateFormat = "DD-MM-YYYY";
|
|
37
|
+
if (localStorage["setting"]) {
|
|
38
|
+
const dateArray = find(JSON.parse(localStorage.getItem("setting") || "{}"), (item) => item && item["parameter"] === "DATE_FORMAT");
|
|
39
|
+
if (dateArray) {
|
|
40
|
+
dateFormat = dateArray.value;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const MY_FORMATS = {
|
|
44
|
+
parse: {
|
|
45
|
+
dateInput: "DD-MM-YYYY",
|
|
46
|
+
},
|
|
47
|
+
display: {
|
|
48
|
+
dateInput: dateFormat,
|
|
49
|
+
monthYearLabel: "YYYY",
|
|
50
|
+
dateA11yLabel: "LL",
|
|
51
|
+
monthYearA11yLabel: "YYYY",
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
export class PaneGroupNewComponent {
|
|
55
|
+
dialog;
|
|
56
|
+
dialogService;
|
|
57
|
+
dashboardService;
|
|
58
|
+
api;
|
|
59
|
+
activatedRoute;
|
|
60
|
+
DashboardPorletsService;
|
|
61
|
+
ref;
|
|
62
|
+
router;
|
|
63
|
+
httpClient;
|
|
64
|
+
datePipe;
|
|
65
|
+
pbf;
|
|
66
|
+
http;
|
|
67
|
+
rs;
|
|
68
|
+
dateChange;
|
|
69
|
+
appCode = "PMS";
|
|
70
|
+
sidebar;
|
|
71
|
+
unclick;
|
|
72
|
+
unclickGrand;
|
|
73
|
+
newChart;
|
|
74
|
+
portlet;
|
|
75
|
+
tabactive;
|
|
76
|
+
dashboard;
|
|
77
|
+
selectedY = [];
|
|
78
|
+
selectedSecondY = [];
|
|
79
|
+
selectedX = [];
|
|
80
|
+
selectedMultiples;
|
|
81
|
+
selectTheme;
|
|
82
|
+
hasInit = true;
|
|
83
|
+
activeTabId;
|
|
84
|
+
hasChangeDataTable = false;
|
|
85
|
+
activeTabLabel = "";
|
|
86
|
+
stayActiveTab;
|
|
87
|
+
bodyClick(e) {
|
|
88
|
+
if (this.unclick &&
|
|
89
|
+
this.unclick.first &&
|
|
90
|
+
e.target.tagName !== "IMG" &&
|
|
91
|
+
!this.unclick.first.nativeElement.contains(e.target)) {
|
|
92
|
+
this.showSubTotalGroup = false;
|
|
93
|
+
}
|
|
94
|
+
if (this.unclickGrand.first &&
|
|
95
|
+
e.target.tagName !== "IMG" &&
|
|
96
|
+
!this.unclickGrand.first.nativeElement.contains(e.target)) {
|
|
97
|
+
this.showgrandTotalGroup = false;
|
|
98
|
+
this.showTableGrandTotalGroup = false;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
translation = JSON.parse(localStorage.getItem("translation") || "{}");
|
|
102
|
+
lang;
|
|
103
|
+
push_btn = false;
|
|
104
|
+
dashboardLayout;
|
|
105
|
+
canvas;
|
|
106
|
+
config;
|
|
107
|
+
draggableHandle = ".gadget-title";
|
|
108
|
+
subscriptions = [];
|
|
109
|
+
url;
|
|
110
|
+
url_id;
|
|
111
|
+
url_type;
|
|
112
|
+
// private img;
|
|
113
|
+
datePipeFormat;
|
|
114
|
+
haveFullScreen = [];
|
|
115
|
+
// private clientHeight_;
|
|
116
|
+
cellSpacing = [20, 20];
|
|
117
|
+
cellAspectRatio;
|
|
118
|
+
resizableHandles;
|
|
119
|
+
newPosition = [];
|
|
120
|
+
mediaQuery;
|
|
121
|
+
figureCode;
|
|
122
|
+
customized = false;
|
|
123
|
+
chartTypeList = ["Column", "Bar", "Line", "Area", "Scatter", "Polar"];
|
|
124
|
+
table;
|
|
125
|
+
pivot;
|
|
126
|
+
transpose;
|
|
127
|
+
pivotTableSubTotalList = [
|
|
128
|
+
{
|
|
129
|
+
selected: false,
|
|
130
|
+
value: this.translation.SHOW_SUB_TOTALS || "Show sub totals",
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
selected: false,
|
|
134
|
+
value: this.translation.HIDE_SUB_TOTALS || "Hide sub totals",
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
selected: false,
|
|
138
|
+
value: this.translation.SHOW_SUB_TOTALS_ROWS_ONLY ||
|
|
139
|
+
"Show sub totals rows only",
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
selected: false,
|
|
143
|
+
value: this.translation.SHOW_SUB_TOTALS_COLUMNS_ONLY ||
|
|
144
|
+
"Show sub totals columns only",
|
|
145
|
+
},
|
|
146
|
+
];
|
|
147
|
+
pivotTableGrandTotalList = [
|
|
148
|
+
{
|
|
149
|
+
selected: false,
|
|
150
|
+
value: this.translation.SHOW_GRAND_TOTALS || "Show grand totals",
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
selected: false,
|
|
154
|
+
value: this.translation.HIDE_GRAND_TOTALS || "Hide grand totals",
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
selected: false,
|
|
158
|
+
value: this.translation.SHOW_GRAND_TOTALS_ROWS_ONLY ||
|
|
159
|
+
"Show grand totals rows only",
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
selected: false,
|
|
163
|
+
value: this.translation.SHOW_GRAND_TOTALS_COLUMNS_ONLY ||
|
|
164
|
+
"Show grand totals columns only",
|
|
165
|
+
},
|
|
166
|
+
];
|
|
167
|
+
tableGrandTotalList = [
|
|
168
|
+
{
|
|
169
|
+
selected: false,
|
|
170
|
+
value: this.translation.SHOW_GRAND_TOTALS || "Show grand totals",
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
selected: false,
|
|
174
|
+
value: this.translation.HIDE_GRAND_TOTALS || "Hide grand totals",
|
|
175
|
+
},
|
|
176
|
+
];
|
|
177
|
+
themeData = [
|
|
178
|
+
{
|
|
179
|
+
id: "theme13",
|
|
180
|
+
value: ["#1C3484", "#35B9FC"],
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
id: "theme14",
|
|
184
|
+
value: ["#04578F", "#3EBBCE"],
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
id: "theme15",
|
|
188
|
+
value: ["#1C3484", "#136BBB", "#35B9FC"],
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
id: "theme16",
|
|
192
|
+
value: ["#04578F", "#0082AF", "#3EBBCE"],
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
id: "theme17",
|
|
196
|
+
value: ["#1C3484", "#1659A9", "#1D97E1", "#35B9FC"],
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
id: "theme18",
|
|
200
|
+
value: ["#04578F", "#0070A3", "#16A2C2", "#3EBBCE"],
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
id: "theme19",
|
|
204
|
+
value: ["#1C3484", "#1659A9", "#1375C4", "#1D97E1", "#35B9FC"],
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
id: "theme20",
|
|
208
|
+
value: ["#04578F", "#0070A3", "#0089B4", "#16A2C2", "#3EBBCE"],
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
id: "theme21",
|
|
212
|
+
value: ["#1C3484", "#1659A9", "#1368B8", "#1375C4", "#1D97E1", "#35B9FC"],
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
id: "theme22",
|
|
216
|
+
value: ["#04578F", "#0070A3", "#007FAD", "#0089B4", "#16A2C2", "#3EBBCE"],
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
id: "theme23",
|
|
220
|
+
value: [
|
|
221
|
+
"#1C3484",
|
|
222
|
+
"#1659A9",
|
|
223
|
+
"#145FAF",
|
|
224
|
+
"#1368B8",
|
|
225
|
+
"#1375C4",
|
|
226
|
+
"#1D97E1",
|
|
227
|
+
"#35B9FC",
|
|
228
|
+
],
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
id: "theme24",
|
|
232
|
+
value: [
|
|
233
|
+
"#04578F",
|
|
234
|
+
"#0070A3",
|
|
235
|
+
"#0078A9",
|
|
236
|
+
"#007FAD",
|
|
237
|
+
"#0089B4",
|
|
238
|
+
"#16A2C2",
|
|
239
|
+
"#3EBBCE",
|
|
240
|
+
],
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
id: "theme11",
|
|
244
|
+
value: [
|
|
245
|
+
"#1C3484",
|
|
246
|
+
"#194697",
|
|
247
|
+
"#1659A9",
|
|
248
|
+
"#136BBB",
|
|
249
|
+
"#147ECC",
|
|
250
|
+
"#1B92DD",
|
|
251
|
+
"#26A5ED",
|
|
252
|
+
"#35B9FC",
|
|
253
|
+
],
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
id: "theme12",
|
|
257
|
+
value: [
|
|
258
|
+
"#04578F",
|
|
259
|
+
"#00659B",
|
|
260
|
+
"#0073A6",
|
|
261
|
+
"#0082AF",
|
|
262
|
+
"#0090B8",
|
|
263
|
+
"#0F9EC0",
|
|
264
|
+
"#29ADC7",
|
|
265
|
+
"#3EBBCE",
|
|
266
|
+
],
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
id: "theme1",
|
|
270
|
+
value: [
|
|
271
|
+
"#594bb9",
|
|
272
|
+
"#f1af32",
|
|
273
|
+
"#4688ed",
|
|
274
|
+
"#e0563e",
|
|
275
|
+
"#803a63",
|
|
276
|
+
"#6dd8b5",
|
|
277
|
+
"#e87225",
|
|
278
|
+
"#c5df42",
|
|
279
|
+
"#c6437d",
|
|
280
|
+
],
|
|
281
|
+
},
|
|
282
|
+
{
|
|
283
|
+
id: "theme2",
|
|
284
|
+
value: [
|
|
285
|
+
"#4688ed",
|
|
286
|
+
"#f1af32",
|
|
287
|
+
"#e0563e",
|
|
288
|
+
"#803a63",
|
|
289
|
+
"#6dd8b5",
|
|
290
|
+
"#e87225",
|
|
291
|
+
"#c5df42",
|
|
292
|
+
"#c6437d",
|
|
293
|
+
"#594bb9",
|
|
294
|
+
],
|
|
295
|
+
},
|
|
296
|
+
{
|
|
297
|
+
id: "theme3",
|
|
298
|
+
value: [
|
|
299
|
+
"#c6437d",
|
|
300
|
+
"#c5df42",
|
|
301
|
+
"#e87225",
|
|
302
|
+
"#6dd8b5",
|
|
303
|
+
"#e0563e",
|
|
304
|
+
"#803a63",
|
|
305
|
+
"#f1af32",
|
|
306
|
+
"#594bb9",
|
|
307
|
+
"#4688ed",
|
|
308
|
+
],
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
id: "theme4",
|
|
312
|
+
value: [
|
|
313
|
+
"#2f499f",
|
|
314
|
+
"#8d1d2e",
|
|
315
|
+
"#e9bf35",
|
|
316
|
+
"#51772f",
|
|
317
|
+
"#469bd8",
|
|
318
|
+
"#5c448f",
|
|
319
|
+
"#da732f",
|
|
320
|
+
"#245353",
|
|
321
|
+
"#43a245",
|
|
322
|
+
],
|
|
323
|
+
},
|
|
324
|
+
{
|
|
325
|
+
id: "theme5",
|
|
326
|
+
value: [
|
|
327
|
+
"#383839",
|
|
328
|
+
"#446ec6",
|
|
329
|
+
"#cf6384",
|
|
330
|
+
"#ebb37e",
|
|
331
|
+
"#71a249",
|
|
332
|
+
"#4bb1a5",
|
|
333
|
+
"#e87225",
|
|
334
|
+
"#c5df42",
|
|
335
|
+
"#c6437d",
|
|
336
|
+
],
|
|
337
|
+
},
|
|
338
|
+
{
|
|
339
|
+
id: "theme6",
|
|
340
|
+
value: [
|
|
341
|
+
"#517ae1",
|
|
342
|
+
"#6386e5",
|
|
343
|
+
"#7491e9",
|
|
344
|
+
"#849dec",
|
|
345
|
+
"#94a9ef",
|
|
346
|
+
"#a4b6f2",
|
|
347
|
+
"#b4c3f6",
|
|
348
|
+
"#c4cff9",
|
|
349
|
+
"#d4ddfd",
|
|
350
|
+
],
|
|
351
|
+
},
|
|
352
|
+
{
|
|
353
|
+
id: "theme7",
|
|
354
|
+
value: [
|
|
355
|
+
"#39828e",
|
|
356
|
+
"#488e99",
|
|
357
|
+
"#579aa5",
|
|
358
|
+
"#66a6b0",
|
|
359
|
+
"#75b3bd",
|
|
360
|
+
"#85bfc9",
|
|
361
|
+
"#95cdd6",
|
|
362
|
+
"#a4dae2",
|
|
363
|
+
"#b5e8f0",
|
|
364
|
+
],
|
|
365
|
+
},
|
|
366
|
+
{
|
|
367
|
+
id: "theme8",
|
|
368
|
+
value: [
|
|
369
|
+
"#e7963d",
|
|
370
|
+
"#ea9e4b",
|
|
371
|
+
"#eea659",
|
|
372
|
+
"#f0ae68",
|
|
373
|
+
"#f2b678",
|
|
374
|
+
"#f3bf87",
|
|
375
|
+
"#f5c798",
|
|
376
|
+
"#f6d0aa",
|
|
377
|
+
"#f7d9bb",
|
|
378
|
+
],
|
|
379
|
+
},
|
|
380
|
+
{
|
|
381
|
+
id: "theme9",
|
|
382
|
+
value: [
|
|
383
|
+
"#64a8b4",
|
|
384
|
+
"#7ebec0",
|
|
385
|
+
"#9cc9ca",
|
|
386
|
+
"#b8d4d4",
|
|
387
|
+
"#d9d6cd",
|
|
388
|
+
"#d8b7a7",
|
|
389
|
+
"#ce8f93",
|
|
390
|
+
"#c1627f",
|
|
391
|
+
"#ad2458",
|
|
392
|
+
],
|
|
393
|
+
},
|
|
394
|
+
{
|
|
395
|
+
id: "theme10",
|
|
396
|
+
value: [
|
|
397
|
+
"#4176ba",
|
|
398
|
+
"#559ae8",
|
|
399
|
+
"#70b3e8",
|
|
400
|
+
"#a7cce7",
|
|
401
|
+
"#dfdfdf",
|
|
402
|
+
"#d2a08b",
|
|
403
|
+
"#c76a50",
|
|
404
|
+
"#ca4e34",
|
|
405
|
+
"#aa3c29",
|
|
406
|
+
],
|
|
407
|
+
},
|
|
408
|
+
];
|
|
409
|
+
startEdit = false;
|
|
410
|
+
showSubTotalGroup = false;
|
|
411
|
+
showgrandTotalGroup = false;
|
|
412
|
+
showTableGrandTotalGroup = false;
|
|
413
|
+
Current_PortletId;
|
|
414
|
+
restoreModel = [];
|
|
415
|
+
themeObj = {};
|
|
416
|
+
enableMultipleAxis = false;
|
|
417
|
+
showLegend = false;
|
|
418
|
+
timer;
|
|
419
|
+
tabList;
|
|
420
|
+
activeTab = 1;
|
|
421
|
+
prevId = null;
|
|
422
|
+
dashboard_sidebar = false;
|
|
423
|
+
ActiveDashboardPortlets = [];
|
|
424
|
+
portlets = [];
|
|
425
|
+
hasResize = false;
|
|
426
|
+
panesList;
|
|
427
|
+
constructor(dialog, dialogService, dashboardService, api, activatedRoute, DashboardPorletsService, ref, router, httpClient, datePipe, pbf, http, rs) {
|
|
428
|
+
this.dialog = dialog;
|
|
429
|
+
this.dialogService = dialogService;
|
|
430
|
+
this.dashboardService = dashboardService;
|
|
431
|
+
this.api = api;
|
|
432
|
+
this.activatedRoute = activatedRoute;
|
|
433
|
+
this.DashboardPorletsService = DashboardPorletsService;
|
|
434
|
+
this.ref = ref;
|
|
435
|
+
this.router = router;
|
|
436
|
+
this.httpClient = httpClient;
|
|
437
|
+
this.datePipe = datePipe;
|
|
438
|
+
this.pbf = pbf;
|
|
439
|
+
this.http = http;
|
|
440
|
+
this.rs = rs;
|
|
441
|
+
this.router.events
|
|
442
|
+
.pipe(filter((event) => event instanceof NavigationEnd))
|
|
443
|
+
.subscribe((e) => {
|
|
444
|
+
if (this.hasResize &&
|
|
445
|
+
e.url === this.activatedRoute["_routerState"].snapshot.url) {
|
|
446
|
+
if (this.dashboardLayout) {
|
|
447
|
+
this.ActiveDashboardPortlets = [];
|
|
448
|
+
this.hasResize = false;
|
|
449
|
+
this.pbf.pageLoading = true;
|
|
450
|
+
this.pbf.pageLoading_.next(true);
|
|
451
|
+
this.dashboardLayout.removeAll();
|
|
452
|
+
this.ref.markForCheck();
|
|
453
|
+
setTimeout(() => {
|
|
454
|
+
this.setActiveDashboardPortlets();
|
|
455
|
+
}, 500);
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
});
|
|
459
|
+
}
|
|
460
|
+
ngOnInit() {
|
|
461
|
+
this.pbf.pageLoading = true;
|
|
462
|
+
this.pbf.pageLoading_.next(true);
|
|
463
|
+
this.ref.markForCheck();
|
|
464
|
+
this.ref.detectChanges();
|
|
465
|
+
if (this.themeData && this.themeData.length > 0) {
|
|
466
|
+
this.themeData.forEach((e) => {
|
|
467
|
+
this.themeObj[e.id] = e["value"];
|
|
468
|
+
});
|
|
469
|
+
}
|
|
470
|
+
this.getInfo();
|
|
471
|
+
this.getDashboard();
|
|
472
|
+
this.subscriptions.push(this.pbf.pub$.subscribe((res) => {
|
|
473
|
+
if (res.refreshUrl &&
|
|
474
|
+
res.refreshUrl === this.activatedRoute["_routerState"].snapshot.url) {
|
|
475
|
+
this.pbf.pageLoading = true;
|
|
476
|
+
this.pbf.pageLoading_.next(true);
|
|
477
|
+
setTimeout(() => {
|
|
478
|
+
this.getDashboard();
|
|
479
|
+
}, 500);
|
|
480
|
+
}
|
|
481
|
+
}));
|
|
482
|
+
this.subscriptions.push(this.dashboardService.getDashboardRename().subscribe((res) => {
|
|
483
|
+
if (this.dashboard && this.dashboard.id === res.id) {
|
|
484
|
+
this.dashboard.dashboardGroupName = res.dashboardGroupName;
|
|
485
|
+
this.dashboard.dashboardGroupId = res.dashboardGroupId;
|
|
486
|
+
this.dashboard.description = res.description;
|
|
487
|
+
this.dashboard.name = res.name;
|
|
488
|
+
this.updateDashboardLastUpdateDate();
|
|
489
|
+
}
|
|
490
|
+
}));
|
|
491
|
+
this.subscriptions.push(this.dashboardService.getCustomizeStatus().subscribe((id) => {
|
|
492
|
+
if (this.dashboard && this.dashboard.id === id) {
|
|
493
|
+
this.ref.markForCheck();
|
|
494
|
+
this.ref.detectChanges();
|
|
495
|
+
}
|
|
496
|
+
}));
|
|
497
|
+
this.subscriptions.push(this.pbf.getHasResize().subscribe((url) => {
|
|
498
|
+
if (url) {
|
|
499
|
+
if (this.activatedRoute["_routerState"].snapshot.url === url) {
|
|
500
|
+
if (this.dashboardLayout) {
|
|
501
|
+
this.ActiveDashboardPortlets = [];
|
|
502
|
+
this.dashboardLayout.removeAll();
|
|
503
|
+
this.pbf.pageLoading = true;
|
|
504
|
+
this.pbf.pageLoading_.next(true);
|
|
505
|
+
this.ref.markForCheck();
|
|
506
|
+
setTimeout(() => {
|
|
507
|
+
this.setActiveDashboardPortlets();
|
|
508
|
+
}, 500);
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
else {
|
|
512
|
+
this.hasResize = true;
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
}));
|
|
516
|
+
}
|
|
517
|
+
getAllFields(item, noDetect = false) {
|
|
518
|
+
if (!noDetect) {
|
|
519
|
+
this.pbf.pageLoading = true;
|
|
520
|
+
}
|
|
521
|
+
return new Promise((resolve, reject) => {
|
|
522
|
+
const dataMartCode = item.figureCode;
|
|
523
|
+
const dataObj = {
|
|
524
|
+
language: this.lang,
|
|
525
|
+
dataMartCode,
|
|
526
|
+
};
|
|
527
|
+
this.DashboardPorletsService.setSchemaParams(dataObj, dataMartCode, this.dashboard);
|
|
528
|
+
this.http.post(this.api.urlList.GetSchema, dataObj, (res) => {
|
|
529
|
+
if (!noDetect) {
|
|
530
|
+
this.pbf.pageLoading = false;
|
|
531
|
+
this.pbf.pageLoading_.next(true);
|
|
532
|
+
}
|
|
533
|
+
resolve(res);
|
|
534
|
+
});
|
|
535
|
+
});
|
|
536
|
+
}
|
|
537
|
+
onCloseRight(e) {
|
|
538
|
+
this.push_btn = false;
|
|
539
|
+
this.ref.detectChanges();
|
|
540
|
+
}
|
|
541
|
+
setActiveDashboardPortlets(noDetect = false) {
|
|
542
|
+
if (this.hasChangeDataTable) {
|
|
543
|
+
this.ActiveDashboardPortlets = [];
|
|
544
|
+
this.ref.markForCheck();
|
|
545
|
+
}
|
|
546
|
+
const portlets = this.portlets.filter((portlet) => {
|
|
547
|
+
if (!portlet || !portlet.config) {
|
|
548
|
+
return;
|
|
549
|
+
}
|
|
550
|
+
const config = JSON.parse(portlet.config);
|
|
551
|
+
const tabId = config.tabId || 1;
|
|
552
|
+
if (tabId === this.activeTab) {
|
|
553
|
+
return portlet;
|
|
554
|
+
}
|
|
555
|
+
}) || [];
|
|
556
|
+
setTimeout(() => {
|
|
557
|
+
this.ActiveDashboardPortlets = [...portlets];
|
|
558
|
+
if (!this.ActiveDashboardPortlets.length &&
|
|
559
|
+
this.dashboardLayout &&
|
|
560
|
+
this.dashboardLayout.panels &&
|
|
561
|
+
this.dashboardLayout.panels.length) {
|
|
562
|
+
this.dashboardLayout.removeAll();
|
|
563
|
+
}
|
|
564
|
+
this.hasChangeDataTable = false;
|
|
565
|
+
if (!noDetect) {
|
|
566
|
+
this.pbf.pageLoading = false;
|
|
567
|
+
this.pbf.pageLoading_.next(true);
|
|
568
|
+
}
|
|
569
|
+
this.ref.detectChanges();
|
|
570
|
+
});
|
|
571
|
+
}
|
|
572
|
+
onActiveTab(tab, index) {
|
|
573
|
+
this.dashboard_sidebar = false;
|
|
574
|
+
this.push_btn = false;
|
|
575
|
+
const { id, label } = tab;
|
|
576
|
+
if (tab.id === this.activeTab) {
|
|
577
|
+
return;
|
|
578
|
+
}
|
|
579
|
+
this.activeTabId = id;
|
|
580
|
+
this.activeTabLabel = label;
|
|
581
|
+
if (index !== 0) {
|
|
582
|
+
this.prevId = this.tabList[index - 1].id;
|
|
583
|
+
}
|
|
584
|
+
this.startEdit = false;
|
|
585
|
+
this.activeTab = id;
|
|
586
|
+
this.setActiveDashboardPortlets();
|
|
587
|
+
}
|
|
588
|
+
onDeleteTab(item) {
|
|
589
|
+
let _title = this.translation.ARE_YOU_SURE_TO_DELETE_DASHBOARD_TAB_WARNING_MESSAGE ||
|
|
590
|
+
".ARE_YOU_SURE_TO_DELETE_DASHBOARD_TAB_WARNING_MESSAGE";
|
|
591
|
+
_title = _title.replace("{Tab Name}", item.label);
|
|
592
|
+
const dialogRef = this.dialogService.showCommonDilaog({
|
|
593
|
+
title: this.translation.DELETE_RECORD || ".DELETE_RECORD",
|
|
594
|
+
description: _title,
|
|
595
|
+
});
|
|
596
|
+
dialogRef.afterClosed().subscribe((res) => {
|
|
597
|
+
if (res === "save") {
|
|
598
|
+
const isActive = this.activeTab === item.id;
|
|
599
|
+
let index = 0;
|
|
600
|
+
for (let i = this.portlets.length - 1; i >= 0; i--) {
|
|
601
|
+
const config = JSON.parse(this.portlets[i].config);
|
|
602
|
+
if (config.tabId === this.activeTab) {
|
|
603
|
+
this.portlets.splice(i, 1);
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
this.tabList.forEach((tab, i) => {
|
|
607
|
+
if (tab.id === item.id) {
|
|
608
|
+
this.tabList.splice(i, 1);
|
|
609
|
+
index = i;
|
|
610
|
+
this.ref.markForCheck();
|
|
611
|
+
this.ref.detectChanges();
|
|
612
|
+
}
|
|
613
|
+
});
|
|
614
|
+
if (isActive) {
|
|
615
|
+
if (!this.tabList[index]) {
|
|
616
|
+
index -= 1;
|
|
617
|
+
}
|
|
618
|
+
this.activeTab = this.tabList[index].id;
|
|
619
|
+
this.activeTabId = this.activeTab;
|
|
620
|
+
this.portlets.forEach((portlet) => {
|
|
621
|
+
const config = JSON.parse(portlet.config);
|
|
622
|
+
config.activeTab = this.activeTab;
|
|
623
|
+
portlet.config = CircularJSON.stringify(config);
|
|
624
|
+
});
|
|
625
|
+
this.ref.detectChanges();
|
|
626
|
+
this.onActiveTab(this.tabList[index], index);
|
|
627
|
+
}
|
|
628
|
+
this.savedashboard("true");
|
|
629
|
+
}
|
|
630
|
+
});
|
|
631
|
+
}
|
|
632
|
+
onAddTab() {
|
|
633
|
+
const label = `Tab ${this.tabList.length + 1}`;
|
|
634
|
+
this.prevId = this.tabList[this.tabList.length - 1].id;
|
|
635
|
+
let newId = 1;
|
|
636
|
+
this.tabList.forEach((tab) => {
|
|
637
|
+
newId = Math.max(newId, tab.id);
|
|
638
|
+
});
|
|
639
|
+
this.activeTab = newId + 1;
|
|
640
|
+
this.tabList.push({
|
|
641
|
+
id: this.activeTab,
|
|
642
|
+
label,
|
|
643
|
+
displayLabel: `${this.translation.TAB || "Tab"} ${this.tabList.length + 1}`,
|
|
644
|
+
});
|
|
645
|
+
this.activeTabId = this.activeTab;
|
|
646
|
+
this.activeTabLabel = label;
|
|
647
|
+
// 隐藏右侧菜单,清除当前选中的portlet
|
|
648
|
+
this.portlet = null;
|
|
649
|
+
this.dashboard_sidebar = false;
|
|
650
|
+
this.hasChangeDataTable = true;
|
|
651
|
+
this.push_btn = false;
|
|
652
|
+
this.setActiveDashboardPortlets();
|
|
653
|
+
}
|
|
654
|
+
setTabInput(e) {
|
|
655
|
+
this.portlets.forEach((portlet) => {
|
|
656
|
+
const _config = JSON.parse(portlet.config);
|
|
657
|
+
const _tabId = _config.tabId || 1;
|
|
658
|
+
if (_tabId === this.activeTab) {
|
|
659
|
+
_config.tabLabel = e.target.value;
|
|
660
|
+
portlet.config = CircularJSON.stringify(_config);
|
|
661
|
+
}
|
|
662
|
+
});
|
|
663
|
+
this.ref.markForCheck();
|
|
664
|
+
this.ref.detectChanges();
|
|
665
|
+
}
|
|
666
|
+
saveTabInput(item) {
|
|
667
|
+
this.startEdit = false;
|
|
668
|
+
item.displayLabel = this.truncateText(item.label);
|
|
669
|
+
this.ref.markForCheck();
|
|
670
|
+
this.ref.detectChanges();
|
|
671
|
+
}
|
|
672
|
+
onStartEdit(id) {
|
|
673
|
+
if (!this.customized) {
|
|
674
|
+
return;
|
|
675
|
+
}
|
|
676
|
+
if (this.activeTab !== id) {
|
|
677
|
+
return;
|
|
678
|
+
}
|
|
679
|
+
this.startEdit = true;
|
|
680
|
+
}
|
|
681
|
+
initTabList(noDetect = false) {
|
|
682
|
+
this.tabList = [];
|
|
683
|
+
if (!this.activeTab || !this.stayActiveTab) {
|
|
684
|
+
this.activeTab = 1;
|
|
685
|
+
}
|
|
686
|
+
this.prevId = null;
|
|
687
|
+
const tabMap = {};
|
|
688
|
+
this.portlets.forEach((portlet, idx) => {
|
|
689
|
+
if (portlet.config) {
|
|
690
|
+
const config = JSON.parse(portlet.config);
|
|
691
|
+
const txt = this.translation["TAB"] || "Tab";
|
|
692
|
+
if (config.activeTab && !this.stayActiveTab) {
|
|
693
|
+
this.activeTab = config.activeTab;
|
|
694
|
+
}
|
|
695
|
+
const tabId = config.tabId || 1;
|
|
696
|
+
const tabLabel = config.tabLabel || "Tab 1";
|
|
697
|
+
let displayLabel = config.tabLabel || `${txt} 1`;
|
|
698
|
+
if (config.tabLabel && config.tabLabel.startsWith("Tab")) {
|
|
699
|
+
displayLabel = txt + config.tabLabel.slice(3);
|
|
700
|
+
}
|
|
701
|
+
if (!tabMap[tabId]) {
|
|
702
|
+
this.tabList.push({
|
|
703
|
+
id: tabId,
|
|
704
|
+
label: tabLabel,
|
|
705
|
+
displayLabel: tabLabel
|
|
706
|
+
? this.truncateText(displayLabel)
|
|
707
|
+
: `${this.translation.TAB || "Tab"} 1`,
|
|
708
|
+
});
|
|
709
|
+
tabMap[tabId] = true;
|
|
710
|
+
}
|
|
711
|
+
// if (!this.activeTabId) {
|
|
712
|
+
// this.activeTab = tabId;
|
|
713
|
+
// this.activeTabId = tabId;
|
|
714
|
+
// this.activeTabLabel = tabLabel;
|
|
715
|
+
// }
|
|
716
|
+
}
|
|
717
|
+
});
|
|
718
|
+
if (!this.tabList.length) {
|
|
719
|
+
this.tabList = [
|
|
720
|
+
{
|
|
721
|
+
id: 1,
|
|
722
|
+
label: "Tab 1",
|
|
723
|
+
displayLabel: `${this.translation.TAB || "Tab"} 1`,
|
|
724
|
+
},
|
|
725
|
+
];
|
|
726
|
+
this.activeTabId = 1;
|
|
727
|
+
this.activeTabLabel = "Tab 1";
|
|
728
|
+
}
|
|
729
|
+
this.tabList = this.tabList.sort((a, b) => a.id - b.id);
|
|
730
|
+
const activeTab = this.tabList.find((i) => i.id === this.activeTab) || this.tabList[0];
|
|
731
|
+
if (activeTab.id) {
|
|
732
|
+
this.activeTabId = activeTab.id;
|
|
733
|
+
this.activeTabLabel = activeTab.label;
|
|
734
|
+
}
|
|
735
|
+
this.stayActiveTab = false;
|
|
736
|
+
this.setPrevId();
|
|
737
|
+
if (!noDetect) {
|
|
738
|
+
this.setActiveDashboardPortlets();
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
async initlayout(shouldGetFields = false, noDetect = false) {
|
|
742
|
+
if (!shouldGetFields) {
|
|
743
|
+
this.initTabList(noDetect);
|
|
744
|
+
}
|
|
745
|
+
if (this.portlets && this.portlets.length > 0) {
|
|
746
|
+
for (let portlet of this.portlets) {
|
|
747
|
+
const config = JSON.parse(portlet.config);
|
|
748
|
+
if (shouldGetFields) {
|
|
749
|
+
// GetSchema配置的列数据源
|
|
750
|
+
const fields = await this.getAllFields(portlet);
|
|
751
|
+
// 每个portlet自定义的数据
|
|
752
|
+
config.fields.forEach((field) => {
|
|
753
|
+
if (field.format) {
|
|
754
|
+
fields.forEach((_f) => {
|
|
755
|
+
if (_f.colName === field.colName) {
|
|
756
|
+
_f.format = field.format;
|
|
757
|
+
}
|
|
758
|
+
});
|
|
759
|
+
}
|
|
760
|
+
const item = fields.find((_f) => _f.colName === field.colName);
|
|
761
|
+
if (!item) {
|
|
762
|
+
fields.push(field);
|
|
763
|
+
}
|
|
764
|
+
});
|
|
765
|
+
if (config.portletType === "pivot") {
|
|
766
|
+
// @ts-ignore
|
|
767
|
+
config.fields = fields;
|
|
768
|
+
portlet.config = CircularJSON.stringify(config);
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
portlet.newId = "portlet_" + this.pbf.Guid();
|
|
772
|
+
portlet.col = portlet.posX;
|
|
773
|
+
portlet.row = portlet.posY;
|
|
774
|
+
portlet.sizeX = portlet.width;
|
|
775
|
+
portlet.sizeY = portlet.height;
|
|
776
|
+
}
|
|
777
|
+
this.initCharData(noDetect);
|
|
778
|
+
this.setActiveDashboardPortlets(noDetect);
|
|
779
|
+
}
|
|
780
|
+
else {
|
|
781
|
+
this.ActiveDashboardPortlets = [];
|
|
782
|
+
this.dashboardLayout.removeAll();
|
|
783
|
+
}
|
|
784
|
+
}
|
|
785
|
+
ngAfterViewInit() {
|
|
786
|
+
this.subscriptions.push(this.pbf.getTriggerDashboardFilterChange().subscribe((e) => {
|
|
787
|
+
const dashboarId = e["id"];
|
|
788
|
+
const newId = e["newId"];
|
|
789
|
+
if (dashboarId !== this.dashboard.id) {
|
|
790
|
+
return;
|
|
791
|
+
}
|
|
792
|
+
this.filterData(newId);
|
|
793
|
+
}));
|
|
794
|
+
this.subscriptions.push(this.dashboardService
|
|
795
|
+
.getchangelayout()
|
|
796
|
+
.subscribe(({ status, id = "" }) => {
|
|
797
|
+
if (this.dashboard && this.dashboard.id === id) {
|
|
798
|
+
const params = status === "true" ? false : true;
|
|
799
|
+
this.initlayout(params);
|
|
800
|
+
}
|
|
801
|
+
}));
|
|
802
|
+
this.subscriptions.push(this.dashboardService.editProperties().subscribe(({ status, id }) => {
|
|
803
|
+
if (!this.dashboard || this.dashboard.id !== id || this.timer) {
|
|
804
|
+
return;
|
|
805
|
+
}
|
|
806
|
+
this.timer = setTimeout(() => {
|
|
807
|
+
this.timer = null;
|
|
808
|
+
}, 200);
|
|
809
|
+
this.dialog.closeAll();
|
|
810
|
+
this.dialog
|
|
811
|
+
.open(DataMartNewComponent, {
|
|
812
|
+
data: {
|
|
813
|
+
edit: status,
|
|
814
|
+
dashboardId: this.url_id,
|
|
815
|
+
dashboard: this.dashboard,
|
|
816
|
+
},
|
|
817
|
+
height: "85%",
|
|
818
|
+
width: "55%",
|
|
819
|
+
disableClose: true,
|
|
820
|
+
panelClass: "report-dialog",
|
|
821
|
+
})
|
|
822
|
+
.afterClosed()
|
|
823
|
+
.subscribe((e) => {
|
|
824
|
+
if (!e) {
|
|
825
|
+
return;
|
|
826
|
+
}
|
|
827
|
+
const { push_btn, portlet, dashboard } = e;
|
|
828
|
+
this.dashboard = cloneDeep(dashboard);
|
|
829
|
+
this.portlet = cloneDeep(portlet);
|
|
830
|
+
this.push_btn = push_btn;
|
|
831
|
+
this.dashboardService.updateDatamartEntity.next(this.dashboard);
|
|
832
|
+
this.ref.markForCheck();
|
|
833
|
+
this.ref.detectChanges();
|
|
834
|
+
});
|
|
835
|
+
}));
|
|
836
|
+
this.subscriptions.push(this.dashboardService.getDownloadDashbord().subscribe((id) => {
|
|
837
|
+
if (this.dashboard && this.dashboard.id === id) {
|
|
838
|
+
// this.downloadAll();
|
|
839
|
+
for (let item of this.ActiveDashboardPortlets) {
|
|
840
|
+
this.download(item);
|
|
841
|
+
}
|
|
842
|
+
}
|
|
843
|
+
}));
|
|
844
|
+
this.subscriptions.push(this.dashboardService.getaddportlet().subscribe((id) => {
|
|
845
|
+
if (this.dashboard && this.dashboard.id === id) {
|
|
846
|
+
if (this.portlet) {
|
|
847
|
+
this.portlets.push(this.portlet);
|
|
848
|
+
}
|
|
849
|
+
let config = this.portlet.config instanceof String
|
|
850
|
+
? JSON.parse(this.portlet.config)
|
|
851
|
+
: this.portlet.config;
|
|
852
|
+
if (typeof config === "string") {
|
|
853
|
+
config = JSON.parse(config);
|
|
854
|
+
}
|
|
855
|
+
const portletType = config.portletType === "historicalIRR"
|
|
856
|
+
? config.selectedVisualType
|
|
857
|
+
: config.portletType;
|
|
858
|
+
// 只有新增的Porlet是图表类才需要初始化
|
|
859
|
+
if (this.portlet &&
|
|
860
|
+
this.portlet.config &&
|
|
861
|
+
["newcolumn", "newline", "newcolumnline"].includes(portletType)) {
|
|
862
|
+
this.initCharData(); // 拼接Chart需要用的数据源
|
|
863
|
+
}
|
|
864
|
+
this.getNewPosition();
|
|
865
|
+
this.setActiveDashboardPortlets();
|
|
866
|
+
}
|
|
867
|
+
}));
|
|
868
|
+
this.subscriptions.push(this.dashboardService.getLeftMenuBar().subscribe((open) => {
|
|
869
|
+
let width = this.panesList.nativeElement.offsetWidth;
|
|
870
|
+
if (open) {
|
|
871
|
+
this.panesList.nativeElement.style.width = width - 195 + "px";
|
|
872
|
+
}
|
|
873
|
+
else {
|
|
874
|
+
this.panesList.nativeElement.style.width = width + 195 + "px";
|
|
875
|
+
}
|
|
876
|
+
}));
|
|
877
|
+
}
|
|
878
|
+
filterData(id) {
|
|
879
|
+
this.chartUpdate(id);
|
|
880
|
+
}
|
|
881
|
+
chartUpdate(id) {
|
|
882
|
+
this.hasChangeDataTable = true;
|
|
883
|
+
if (id) {
|
|
884
|
+
this.dashboardService.chartUpdate.next(id);
|
|
885
|
+
}
|
|
886
|
+
this.initCharData(); // 拼接Chart需要用的数据源
|
|
887
|
+
}
|
|
888
|
+
ngOnDestroy() {
|
|
889
|
+
this.subscriptions.forEach((sub) => {
|
|
890
|
+
sub.unsubscribe();
|
|
891
|
+
});
|
|
892
|
+
}
|
|
893
|
+
getInfo() {
|
|
894
|
+
this.translation = JSON.parse(localStorage.getItem("translation"));
|
|
895
|
+
this.lang = this.pbf.getLanguageParams();
|
|
896
|
+
this.datePipeFormat = localStorage.getItem("datePipe");
|
|
897
|
+
}
|
|
898
|
+
getPorletConfig(portlet) {
|
|
899
|
+
if (!portlet.config) {
|
|
900
|
+
return;
|
|
901
|
+
}
|
|
902
|
+
const config = JSON.parse(portlet.config);
|
|
903
|
+
if (!config.pvtableChartSetting) {
|
|
904
|
+
return;
|
|
905
|
+
}
|
|
906
|
+
this.showLegend =
|
|
907
|
+
!!config.pvtableChartSetting.chartSettings.legendSettings.visible;
|
|
908
|
+
this.enableMultipleAxis =
|
|
909
|
+
config.pvtableChartSetting.chartSettings.enableMultipleAxis;
|
|
910
|
+
this.ref.markForCheck();
|
|
911
|
+
this.ref.detectChanges();
|
|
912
|
+
}
|
|
913
|
+
updateTheme(e) {
|
|
914
|
+
const { selectedX, selectedY, selectedSecondY, selectedMultiples, selectTheme, } = e;
|
|
915
|
+
this.selectedX = selectedX;
|
|
916
|
+
this.selectedY = selectedY;
|
|
917
|
+
this.selectedSecondY = selectedSecondY;
|
|
918
|
+
this.selectedMultiples = selectedMultiples;
|
|
919
|
+
this.selectTheme = selectTheme;
|
|
920
|
+
}
|
|
921
|
+
updateDashboard(e) {
|
|
922
|
+
const { portlets, dashboard, noDetect, stayActiveTab } = e;
|
|
923
|
+
this.stayActiveTab = stayActiveTab;
|
|
924
|
+
this.dashboard = cloneDeep(dashboard);
|
|
925
|
+
this.portlets = [...portlets];
|
|
926
|
+
if (!noDetect) {
|
|
927
|
+
this.ref.markForCheck();
|
|
928
|
+
}
|
|
929
|
+
setTimeout(() => {
|
|
930
|
+
this.dashboardService.updateDatamartEntity.next(dashboard);
|
|
931
|
+
});
|
|
932
|
+
}
|
|
933
|
+
updatePorletConfig(e) {
|
|
934
|
+
const { newId, config } = e;
|
|
935
|
+
const _config = Object.assign({}, config);
|
|
936
|
+
this.portlet.config = CircularJSON.stringify(_config);
|
|
937
|
+
this.portlets.forEach((portlet, i) => {
|
|
938
|
+
if (portlet.newId === newId) {
|
|
939
|
+
this.portlets[i].config = CircularJSON.stringify(_config);
|
|
940
|
+
}
|
|
941
|
+
});
|
|
942
|
+
this.portlets = [...this.portlets];
|
|
943
|
+
this.setActiveDashboardPortlets();
|
|
944
|
+
}
|
|
945
|
+
edit(item) {
|
|
946
|
+
const config = JSON.parse(item.config);
|
|
947
|
+
const portletType = config.portletType === "historicalIRR"
|
|
948
|
+
? config.selectedVisualType
|
|
949
|
+
: config.portletType;
|
|
950
|
+
if (["newcolumn", "newline", "newcolumnline"].includes(portletType)) {
|
|
951
|
+
this.selectedY = config["selectedY"];
|
|
952
|
+
this.selectedSecondY = config.selectedSecondY;
|
|
953
|
+
this.selectedX = config["selectedX"];
|
|
954
|
+
this.selectedMultiples = config["selectedMultiples"];
|
|
955
|
+
this.selectTheme = config["selectTheme"];
|
|
956
|
+
}
|
|
957
|
+
this.portlet = cloneDeep(item);
|
|
958
|
+
if (this.push_btn) {
|
|
959
|
+
this.sidebar.portlet = this.portlet;
|
|
960
|
+
}
|
|
961
|
+
this.dashboard_sidebar = true;
|
|
962
|
+
this.push_btn = true;
|
|
963
|
+
this.figureCode = item.figureCode;
|
|
964
|
+
this.tabactive = false;
|
|
965
|
+
this.ref.detectChanges();
|
|
966
|
+
this.dashboardService.portletEdit.next(this.url_id);
|
|
967
|
+
}
|
|
968
|
+
GetgadgetTitle(config) {
|
|
969
|
+
if (config && config !== "null") {
|
|
970
|
+
let config_ = JSON.parse(config);
|
|
971
|
+
return config_.gadgetTitle;
|
|
972
|
+
}
|
|
973
|
+
else {
|
|
974
|
+
return "";
|
|
975
|
+
}
|
|
976
|
+
}
|
|
977
|
+
getPortletType(item) {
|
|
978
|
+
const config = item && item.config ? JSON.parse(item.config) : {};
|
|
979
|
+
if (config.portletType) {
|
|
980
|
+
if (config.portletType === "historicalIRR") {
|
|
981
|
+
return config.selectedVisualType;
|
|
982
|
+
}
|
|
983
|
+
return config.portletType;
|
|
984
|
+
}
|
|
985
|
+
}
|
|
986
|
+
delete(item) {
|
|
987
|
+
const index = this.portlets.findIndex((x) => x.newId === item.newId);
|
|
988
|
+
this.dashboardLayout.removePanel(item.newId);
|
|
989
|
+
this.portlets.splice(index, 1);
|
|
990
|
+
this.setActiveDashboardPortlets();
|
|
991
|
+
this.getNewPosition();
|
|
992
|
+
}
|
|
993
|
+
copyPortlet(item) {
|
|
994
|
+
const portlet = { ...item };
|
|
995
|
+
portlet.id = "00000000-0000-0000-0000-000000000000";
|
|
996
|
+
portlet.newId = "portlet_" + this.pbf.Guid();
|
|
997
|
+
// 处理 1.复制别的复制体 2.新建的个体 3.已存在的个体
|
|
998
|
+
portlet.copyId = portlet.copyId
|
|
999
|
+
? portlet.copyId
|
|
1000
|
+
: item.id === "00000000-0000-0000-0000-000000000000"
|
|
1001
|
+
? item.newId
|
|
1002
|
+
: item.id;
|
|
1003
|
+
this.DashboardPorletsService.portletData_New[this.dashboard.id][portlet.newId] = cloneDeep(this.DashboardPorletsService.portletData_New[this.dashboard.id][portlet.copyId]);
|
|
1004
|
+
this.portlets.push(portlet);
|
|
1005
|
+
this.setActiveDashboardPortlets();
|
|
1006
|
+
this.getNewPosition();
|
|
1007
|
+
}
|
|
1008
|
+
getAsofdate(item) {
|
|
1009
|
+
return JSON.parse(item.config).asOfDate;
|
|
1010
|
+
}
|
|
1011
|
+
getCurrency(config) {
|
|
1012
|
+
return JSON.parse(config).currencyCode;
|
|
1013
|
+
}
|
|
1014
|
+
getFigurecode(figureCode) {
|
|
1015
|
+
switch (figureCode) {
|
|
1016
|
+
case "Tasks":
|
|
1017
|
+
return 1;
|
|
1018
|
+
case "FundList":
|
|
1019
|
+
return 2;
|
|
1020
|
+
case "IRR":
|
|
1021
|
+
return 3;
|
|
1022
|
+
case "Notes":
|
|
1023
|
+
return 4;
|
|
1024
|
+
default:
|
|
1025
|
+
return 0;
|
|
1026
|
+
}
|
|
1027
|
+
}
|
|
1028
|
+
getTableName(item) {
|
|
1029
|
+
let config = item.config ? JSON.parse(item.config) : {};
|
|
1030
|
+
if (config.portletType) {
|
|
1031
|
+
let typeList = ["table", "financialTable", "transpose", "pivot"];
|
|
1032
|
+
let idx = typeList.indexOf(config.portletType);
|
|
1033
|
+
return idx > -1 ? true : false;
|
|
1034
|
+
}
|
|
1035
|
+
}
|
|
1036
|
+
pushSlider() {
|
|
1037
|
+
this.push_btn = !this.push_btn;
|
|
1038
|
+
}
|
|
1039
|
+
getFigureCode(figureCode) {
|
|
1040
|
+
let codeArr = ["Tasks", "FundList", "IRR", "Notes"];
|
|
1041
|
+
let i = codeArr.indexOf(figureCode);
|
|
1042
|
+
return i > -1 ? true : false;
|
|
1043
|
+
}
|
|
1044
|
+
x;
|
|
1045
|
+
y;
|
|
1046
|
+
getDashboard() {
|
|
1047
|
+
this.url = "dashboardDetail";
|
|
1048
|
+
let url_arr = this.pbf.getRouterUrl().split("?");
|
|
1049
|
+
this.url_id = this.pbf.getUrlId(url_arr[0]);
|
|
1050
|
+
this.url_type =
|
|
1051
|
+
url_arr[1] == "dashboardType=customizedBeta"
|
|
1052
|
+
? "customizedBeta"
|
|
1053
|
+
: url_arr[1] == "dashboardType=sharedBeta"
|
|
1054
|
+
? "sharedBeta"
|
|
1055
|
+
: "";
|
|
1056
|
+
this.DashboardPorletsService.GetDashboardV1(this.url_id, true, (res, portlets = []) => {
|
|
1057
|
+
this.hasInit = true;
|
|
1058
|
+
if (!res) {
|
|
1059
|
+
this.pbf.pageLoading = false;
|
|
1060
|
+
this.pbf.pageLoading_.next(true);
|
|
1061
|
+
return;
|
|
1062
|
+
}
|
|
1063
|
+
this.portlets = [...portlets];
|
|
1064
|
+
this.initlayout(false, true);
|
|
1065
|
+
setTimeout(() => {
|
|
1066
|
+
this.dashboardService.updateDatamartEntity.next(this.dashboard);
|
|
1067
|
+
// this.chartUpdate();
|
|
1068
|
+
this.pbf.pageLoading = false;
|
|
1069
|
+
this.pbf.pageLoading_.next(true);
|
|
1070
|
+
}, 500);
|
|
1071
|
+
}, false, (res) => {
|
|
1072
|
+
this.dashboard = Object.assign({}, res);
|
|
1073
|
+
if (this.dashboardLayout) {
|
|
1074
|
+
this.dashboardLayout.refresh();
|
|
1075
|
+
}
|
|
1076
|
+
this.ref.markForCheck();
|
|
1077
|
+
this.ref.detectChanges();
|
|
1078
|
+
});
|
|
1079
|
+
}
|
|
1080
|
+
routerPage() {
|
|
1081
|
+
this.router.navigateByUrl("/pages/dashboard/dashboardlist");
|
|
1082
|
+
}
|
|
1083
|
+
displayIconPrompt(item) {
|
|
1084
|
+
return JSON.parse(item.config).portletType ||
|
|
1085
|
+
this.getFigureCode(item.figureCode)
|
|
1086
|
+
? false
|
|
1087
|
+
: true;
|
|
1088
|
+
}
|
|
1089
|
+
async configurations(item, event) {
|
|
1090
|
+
const portletType = this.getPortletType(item);
|
|
1091
|
+
switch (portletType) {
|
|
1092
|
+
case "table":
|
|
1093
|
+
const table = find(this.table._results, (el) => el.portlet.newId === item.newId);
|
|
1094
|
+
if (table.grid &&
|
|
1095
|
+
table.grid.getCurrentViewRecords() &&
|
|
1096
|
+
table.grid.getCurrentViewRecords().length) {
|
|
1097
|
+
// let mask: any = document.querySelector("#pivot-table-mask");
|
|
1098
|
+
// if (mask) mask.style.display = "block";
|
|
1099
|
+
let _y = 0;
|
|
1100
|
+
if (event && event.target) {
|
|
1101
|
+
const { y } = event.target.getBoundingClientRect();
|
|
1102
|
+
if (document.body.clientHeight - y < 400) {
|
|
1103
|
+
_y = -415;
|
|
1104
|
+
}
|
|
1105
|
+
}
|
|
1106
|
+
table.grid &&
|
|
1107
|
+
table.grid.columnChooserModule &&
|
|
1108
|
+
table.grid.columnChooserModule.openColumnChooser(200, _y);
|
|
1109
|
+
}
|
|
1110
|
+
break;
|
|
1111
|
+
case "newchart":
|
|
1112
|
+
case "pivot":
|
|
1113
|
+
const pivot = find(this.pivot._results, (el) => el.portlet.newId === item.newId);
|
|
1114
|
+
if (pivot.fieldlistObj.dialogRenderer &&
|
|
1115
|
+
pivot.fieldlistObj.dialogRenderer.fieldListDialog) {
|
|
1116
|
+
pivot.fieldlistObj.dialogRenderer.fieldListDialog.show();
|
|
1117
|
+
}
|
|
1118
|
+
break;
|
|
1119
|
+
case "transpose":
|
|
1120
|
+
const transpose = find(this.transpose._results, (el) => el.portlet.newId === item.newId);
|
|
1121
|
+
// 开启适配 手动缩小
|
|
1122
|
+
transpose.grid.columnChooserModule.showCustomColumnChooser();
|
|
1123
|
+
setTimeout(() => {
|
|
1124
|
+
let dlg = document.querySelector(".e-rescolumnchooserdiv.e-responsive-dialog");
|
|
1125
|
+
if (dlg) {
|
|
1126
|
+
dlg.style.opacity = 1;
|
|
1127
|
+
dlg.style.setProperty("width", "300px", "important");
|
|
1128
|
+
dlg.style.setProperty("height", "350px", "important");
|
|
1129
|
+
dlg.style.setProperty("position", "absolute", "important");
|
|
1130
|
+
dlg.style.setProperty("left", event.clientX - 135 + "px", "important");
|
|
1131
|
+
dlg.style.setProperty("top", event.clientY + 30 + "px", "important");
|
|
1132
|
+
}
|
|
1133
|
+
}, 0);
|
|
1134
|
+
break;
|
|
1135
|
+
}
|
|
1136
|
+
}
|
|
1137
|
+
setPrevId() {
|
|
1138
|
+
this.tabList.forEach((tab, i) => {
|
|
1139
|
+
if (tab.id === this.activeTab) {
|
|
1140
|
+
if (this.tabList[i - 1]) {
|
|
1141
|
+
this.prevId = this.tabList[i - 1].id;
|
|
1142
|
+
}
|
|
1143
|
+
}
|
|
1144
|
+
});
|
|
1145
|
+
}
|
|
1146
|
+
drop(e) {
|
|
1147
|
+
const { previousIndex, currentIndex } = e;
|
|
1148
|
+
const prevId = this.tabList[previousIndex].id;
|
|
1149
|
+
const currId = this.tabList[currentIndex].id;
|
|
1150
|
+
for (let i = this.tabList.length - 1; i >= 0; i--) {
|
|
1151
|
+
const tabId = this.tabList[i].id;
|
|
1152
|
+
if (tabId === prevId) {
|
|
1153
|
+
this.tabList[i].id = currId;
|
|
1154
|
+
}
|
|
1155
|
+
if (tabId === currId) {
|
|
1156
|
+
this.tabList[i].id = prevId;
|
|
1157
|
+
}
|
|
1158
|
+
}
|
|
1159
|
+
for (let i = this.portlets.length - 1; i >= 0; i--) {
|
|
1160
|
+
const config = JSON.parse(this.portlets[i].config);
|
|
1161
|
+
const tabId = config.tabId;
|
|
1162
|
+
if (tabId === prevId) {
|
|
1163
|
+
config.tabId = currId;
|
|
1164
|
+
this.portlets[i].config = JSON.stringify(config);
|
|
1165
|
+
}
|
|
1166
|
+
if (tabId === currId) {
|
|
1167
|
+
config.tabId = prevId;
|
|
1168
|
+
this.portlets[i].config = JSON.stringify(config);
|
|
1169
|
+
}
|
|
1170
|
+
}
|
|
1171
|
+
if (this.activeTab === currId) {
|
|
1172
|
+
this.activeTab = prevId;
|
|
1173
|
+
}
|
|
1174
|
+
else if (this.activeTab === prevId) {
|
|
1175
|
+
this.activeTab = currId;
|
|
1176
|
+
}
|
|
1177
|
+
this.setPrevId();
|
|
1178
|
+
[this.tabList[previousIndex], this.tabList[currentIndex]] = [
|
|
1179
|
+
this.tabList[currentIndex],
|
|
1180
|
+
this.tabList[previousIndex],
|
|
1181
|
+
];
|
|
1182
|
+
this.tabList = [...this.tabList];
|
|
1183
|
+
this.ref.markForCheck();
|
|
1184
|
+
}
|
|
1185
|
+
closeAll() {
|
|
1186
|
+
this.pbf.pageLoading = true;
|
|
1187
|
+
this.pbf.pageLoading_.next(true);
|
|
1188
|
+
this.ref.markForCheck();
|
|
1189
|
+
let hasConfig = false;
|
|
1190
|
+
this.ActiveDashboardPortlets.forEach((portlet) => {
|
|
1191
|
+
const portletType = this.getPortletType(portlet);
|
|
1192
|
+
switch (portletType) {
|
|
1193
|
+
case "pivot":
|
|
1194
|
+
case "newchart":
|
|
1195
|
+
const dom = document.getElementById(`${portlet.newId}_DeferUpdateButton2`);
|
|
1196
|
+
if (dom) {
|
|
1197
|
+
hasConfig = true;
|
|
1198
|
+
dom.click();
|
|
1199
|
+
}
|
|
1200
|
+
break;
|
|
1201
|
+
case "table":
|
|
1202
|
+
const cancelBtn = document.querySelector(".e-cc-cnbtn");
|
|
1203
|
+
if (cancelBtn) {
|
|
1204
|
+
hasConfig = true;
|
|
1205
|
+
// @ts-ignore
|
|
1206
|
+
cancelBtn.click();
|
|
1207
|
+
}
|
|
1208
|
+
break;
|
|
1209
|
+
}
|
|
1210
|
+
});
|
|
1211
|
+
if (hasConfig) {
|
|
1212
|
+
setTimeout(() => {
|
|
1213
|
+
this.pbf.pageLoading = false;
|
|
1214
|
+
this.pbf.pageLoading_.next(true);
|
|
1215
|
+
this.ref.markForCheck();
|
|
1216
|
+
}, 400);
|
|
1217
|
+
}
|
|
1218
|
+
else {
|
|
1219
|
+
this.pbf.pageLoading = false;
|
|
1220
|
+
this.pbf.pageLoading_.next(true);
|
|
1221
|
+
}
|
|
1222
|
+
return hasConfig;
|
|
1223
|
+
}
|
|
1224
|
+
downloadAll() {
|
|
1225
|
+
const dialogRef = this.dialog.open(PaneDownloadComponent, {
|
|
1226
|
+
data: {
|
|
1227
|
+
portlets: this.portlets,
|
|
1228
|
+
dashboard: this.dashboard,
|
|
1229
|
+
},
|
|
1230
|
+
height: "850px",
|
|
1231
|
+
width: "562px",
|
|
1232
|
+
});
|
|
1233
|
+
dialogRef.afterClosed().subscribe((res) => { });
|
|
1234
|
+
}
|
|
1235
|
+
download(item) {
|
|
1236
|
+
const portletType = this.getPortletType(item);
|
|
1237
|
+
const title = this.GetgadgetTitle(item.config);
|
|
1238
|
+
switch (portletType) {
|
|
1239
|
+
case "table":
|
|
1240
|
+
this.downloadTable(item, title);
|
|
1241
|
+
break;
|
|
1242
|
+
case "newchart":
|
|
1243
|
+
case "pivot":
|
|
1244
|
+
const pivot = find(this.pivot._results, (el) => el.portlet.newId === item.newId);
|
|
1245
|
+
pivot.headRowSpan = 0; //重置导出header处理
|
|
1246
|
+
pivot.headRowCount = 0; //重置导出header处理
|
|
1247
|
+
const excelExportProperties_pivot = {
|
|
1248
|
+
fileName: title
|
|
1249
|
+
? title + ".xlsx"
|
|
1250
|
+
: "Pivot-" + new Date().toISOString() + ".xlsx",
|
|
1251
|
+
};
|
|
1252
|
+
if (pivot.pivotObj.dataSourceSettings.formatSettings) {
|
|
1253
|
+
pivot.pivotObj.dataSourceSettings.formatSettings.forEach((setting) => {
|
|
1254
|
+
// syncfusion format transform to excel format
|
|
1255
|
+
const map = {
|
|
1256
|
+
"#,###,,.0;(#,###,,.0)": '0.0,,"";(0.0,,)',
|
|
1257
|
+
'0.0,,"";(0.0,,)': "#,###,,.0;(#,###,,.0)",
|
|
1258
|
+
"#,###,,;(#,###,,)": '0,,"";(0,,)',
|
|
1259
|
+
'0,,"";(0,,)': "#,###,,;(#,###,,)",
|
|
1260
|
+
"#,###,,.00;(#,###,,.00)": '0.00,,"";(0.00,,)',
|
|
1261
|
+
'0.00,,"";(0.00,,)': "#,###,,.00;(#,###,,.00)",
|
|
1262
|
+
};
|
|
1263
|
+
if (map[setting.format]) {
|
|
1264
|
+
setting.format = map[setting.format];
|
|
1265
|
+
setTimeout(() => {
|
|
1266
|
+
setting.format = map[setting.format];
|
|
1267
|
+
this.ref.markForCheck();
|
|
1268
|
+
this.ref.detectChanges();
|
|
1269
|
+
});
|
|
1270
|
+
}
|
|
1271
|
+
});
|
|
1272
|
+
}
|
|
1273
|
+
this.updateFormat(pivot.pivotObj.grid.columns, pivot.pivotObj);
|
|
1274
|
+
pivot.pivotObj.excelExport(excelExportProperties_pivot);
|
|
1275
|
+
break;
|
|
1276
|
+
// case "transpose":
|
|
1277
|
+
// // const transpose = find(
|
|
1278
|
+
// // (this.transpose as any)._results,
|
|
1279
|
+
// // (el) => el.portlet.newId === item.newId
|
|
1280
|
+
// // );
|
|
1281
|
+
// break;
|
|
1282
|
+
case "newcolumn":
|
|
1283
|
+
case "newline":
|
|
1284
|
+
case "newcolumnline":
|
|
1285
|
+
const chartIdx = this.getChartIndexInAll(item);
|
|
1286
|
+
const selectedComponent = this.newChart.toArray()[chartIdx];
|
|
1287
|
+
selectedComponent.exportChart();
|
|
1288
|
+
break;
|
|
1289
|
+
}
|
|
1290
|
+
}
|
|
1291
|
+
// 根据idx获取点击图表在图表列表里的真正顺序
|
|
1292
|
+
getChartIndexInAll(item) {
|
|
1293
|
+
const charArr = this.ActiveDashboardPortlets.filter((e) => {
|
|
1294
|
+
return ["newcolumn", "newline", "newcolumnline"].includes(JSON.parse(e.config).portletType);
|
|
1295
|
+
});
|
|
1296
|
+
let resultIdx = 0;
|
|
1297
|
+
if (charArr.length > 0) {
|
|
1298
|
+
charArr.forEach((e, idx) => {
|
|
1299
|
+
if (e.newId == item.newId) {
|
|
1300
|
+
resultIdx = idx;
|
|
1301
|
+
}
|
|
1302
|
+
});
|
|
1303
|
+
}
|
|
1304
|
+
return resultIdx;
|
|
1305
|
+
}
|
|
1306
|
+
downloadTable(item, title) {
|
|
1307
|
+
// Table 下载全部数据
|
|
1308
|
+
let config = JSON.parse(item.config);
|
|
1309
|
+
let pageSetting = Object.assign({
|
|
1310
|
+
currentPage: 1,
|
|
1311
|
+
pageSize: 9999999,
|
|
1312
|
+
}, config && config.tableSortSetting);
|
|
1313
|
+
let params = this.DashboardPorletsService.getParamsByPortlet(item, pageSetting, null, this.dashboard);
|
|
1314
|
+
// json buffer
|
|
1315
|
+
this.httpClient
|
|
1316
|
+
.post(this.api.baseurl + this.api.urlList.GetPortletDataV2, params)
|
|
1317
|
+
.subscribe((result) => {
|
|
1318
|
+
if (result) {
|
|
1319
|
+
const table = find(this.table._results, (el) => el.portlet.newId === item.newId);
|
|
1320
|
+
const excelExportProperties = {
|
|
1321
|
+
fileName: title
|
|
1322
|
+
? title + ".xlsx"
|
|
1323
|
+
: "Table-" + new Date().toISOString() + ".xlsx",
|
|
1324
|
+
// @ts-ignore
|
|
1325
|
+
dataSource: result.data,
|
|
1326
|
+
};
|
|
1327
|
+
if (table) {
|
|
1328
|
+
table.grid.excelExport(excelExportProperties);
|
|
1329
|
+
}
|
|
1330
|
+
}
|
|
1331
|
+
}, (response) => { }, () => { });
|
|
1332
|
+
}
|
|
1333
|
+
updateFormat(columns, pivotObj) {
|
|
1334
|
+
var fList = pivotObj.renderModule.getFormatList();
|
|
1335
|
+
for (var i = 0; i < columns.length; i++) {
|
|
1336
|
+
if (columns[i].columns &&
|
|
1337
|
+
columns[i].columns.length > 0) {
|
|
1338
|
+
this.updateFormat(columns[i].columns, pivotObj);
|
|
1339
|
+
}
|
|
1340
|
+
else {
|
|
1341
|
+
if (columns[i].customAttributes &&
|
|
1342
|
+
fList[columns[i].customAttributes.cell.actualText] ===
|
|
1343
|
+
"N") {
|
|
1344
|
+
columns[i].format = undefined;
|
|
1345
|
+
}
|
|
1346
|
+
}
|
|
1347
|
+
}
|
|
1348
|
+
}
|
|
1349
|
+
fieldFormat(item) {
|
|
1350
|
+
this.portlet = cloneDeep(item);
|
|
1351
|
+
const dialogRef = this.dialog.open(FieldFormatComponent, {
|
|
1352
|
+
data: {
|
|
1353
|
+
portletData: item,
|
|
1354
|
+
portlets: this.portlets,
|
|
1355
|
+
},
|
|
1356
|
+
height: "850px",
|
|
1357
|
+
minWidth: "562px",
|
|
1358
|
+
autoFocus: false,
|
|
1359
|
+
disableClose: true,
|
|
1360
|
+
panelClass: "dialog-position",
|
|
1361
|
+
});
|
|
1362
|
+
dialogRef.afterClosed().subscribe((res) => { });
|
|
1363
|
+
}
|
|
1364
|
+
openFilter(item) {
|
|
1365
|
+
this.portlet = cloneDeep(item);
|
|
1366
|
+
this.dashboard_sidebar = true;
|
|
1367
|
+
this.push_btn = true;
|
|
1368
|
+
this.figureCode = item.figureCode;
|
|
1369
|
+
this.tabactive = true;
|
|
1370
|
+
this.dashboardService.portletEdit.next(this.url_id);
|
|
1371
|
+
}
|
|
1372
|
+
updatePushBtn(e) {
|
|
1373
|
+
this.push_btn = e;
|
|
1374
|
+
this.ref.markForCheck();
|
|
1375
|
+
}
|
|
1376
|
+
toggleCustomize(customized) {
|
|
1377
|
+
this.customized = customized;
|
|
1378
|
+
this.ref.markForCheck();
|
|
1379
|
+
}
|
|
1380
|
+
toggleSidebar(bool) {
|
|
1381
|
+
this.dashboard_sidebar = bool;
|
|
1382
|
+
this.ref.markForCheck();
|
|
1383
|
+
}
|
|
1384
|
+
onToggleTabactive(bool) {
|
|
1385
|
+
this.tabactive = bool;
|
|
1386
|
+
this.ref.markForCheck();
|
|
1387
|
+
}
|
|
1388
|
+
updatePorlet(portlet) {
|
|
1389
|
+
if (!portlet) {
|
|
1390
|
+
this.portlet = null;
|
|
1391
|
+
return;
|
|
1392
|
+
}
|
|
1393
|
+
this.portlet = cloneDeep(portlet);
|
|
1394
|
+
this.portlets.forEach((_portlet, i) => {
|
|
1395
|
+
if (_portlet.newId === portlet.newId) {
|
|
1396
|
+
this.portlets[i] = Object.assign({}, portlet);
|
|
1397
|
+
}
|
|
1398
|
+
});
|
|
1399
|
+
this.portlets = [...this.portlets];
|
|
1400
|
+
}
|
|
1401
|
+
addPorlet() {
|
|
1402
|
+
this.push_btn = true;
|
|
1403
|
+
this.dashboard_sidebar = true;
|
|
1404
|
+
this.portlet = null;
|
|
1405
|
+
this.tabactive = false;
|
|
1406
|
+
this.dashboardService.create_btn.next(this.url_id);
|
|
1407
|
+
}
|
|
1408
|
+
closeSidebar(e) {
|
|
1409
|
+
this.dashboard_sidebar = false;
|
|
1410
|
+
this.ref.markForCheck();
|
|
1411
|
+
}
|
|
1412
|
+
resizeStop(args) {
|
|
1413
|
+
this.getNewPosition();
|
|
1414
|
+
if (args.element.querySelector(".e-grid")) {
|
|
1415
|
+
const table = find(this.table._results, (el) => el.portlet.newId === args.element.id);
|
|
1416
|
+
if (table) {
|
|
1417
|
+
table.grid.height = parseInt(args.element.style.height) - 80;
|
|
1418
|
+
table.grid.refreshColumns();
|
|
1419
|
+
}
|
|
1420
|
+
}
|
|
1421
|
+
if (args.element.querySelector(".e-pivotview")) {
|
|
1422
|
+
const pivot = find(this.pivot._results, (el) => el.portlet.newId === args.element.id);
|
|
1423
|
+
if (pivot) {
|
|
1424
|
+
pivot.pivotObj.layoutRefresh();
|
|
1425
|
+
}
|
|
1426
|
+
}
|
|
1427
|
+
}
|
|
1428
|
+
dragStop(e) {
|
|
1429
|
+
this.getNewPosition();
|
|
1430
|
+
}
|
|
1431
|
+
getNewPosition() {
|
|
1432
|
+
const pdata = this.dashboardLayout.serialize();
|
|
1433
|
+
this.newPosition = [...pdata];
|
|
1434
|
+
this.portlets.forEach((portlet) => {
|
|
1435
|
+
pdata.forEach((p) => {
|
|
1436
|
+
if (portlet.newId === p.id) {
|
|
1437
|
+
portlet = {
|
|
1438
|
+
...portlet,
|
|
1439
|
+
posX: p.col,
|
|
1440
|
+
posY: p.row,
|
|
1441
|
+
col: p.col,
|
|
1442
|
+
row: p.row,
|
|
1443
|
+
width: p.sizeX,
|
|
1444
|
+
height: p.sizeY,
|
|
1445
|
+
sizeX: p.sizeX,
|
|
1446
|
+
sizeY: p.sizeY,
|
|
1447
|
+
};
|
|
1448
|
+
}
|
|
1449
|
+
});
|
|
1450
|
+
});
|
|
1451
|
+
this.ref.markForCheck();
|
|
1452
|
+
this.ref.detectChanges();
|
|
1453
|
+
}
|
|
1454
|
+
openSubtotal(item) {
|
|
1455
|
+
this.Current_PortletId = item.newId;
|
|
1456
|
+
this.config = item.config ? JSON.parse(item.config) : {};
|
|
1457
|
+
this.pivotTableSubTotalList.map((el) => {
|
|
1458
|
+
el.selected = false;
|
|
1459
|
+
});
|
|
1460
|
+
this.getSelectTotalGroupStatus("sub");
|
|
1461
|
+
this.showSubTotalGroup = !this.showSubTotalGroup;
|
|
1462
|
+
this.showgrandTotalGroup = false;
|
|
1463
|
+
}
|
|
1464
|
+
openGrandtotal(item) {
|
|
1465
|
+
this.Current_PortletId = item.newId;
|
|
1466
|
+
this.config = item.config ? JSON.parse(item.config) : {};
|
|
1467
|
+
this.pivotTableGrandTotalList.map((el) => {
|
|
1468
|
+
el.selected = false;
|
|
1469
|
+
});
|
|
1470
|
+
if (this.getPortletType(item) === "table") {
|
|
1471
|
+
this.getSelectTotalGroupStatus("tableGrand");
|
|
1472
|
+
this.showTableGrandTotalGroup = !this.showTableGrandTotalGroup;
|
|
1473
|
+
}
|
|
1474
|
+
else {
|
|
1475
|
+
this.getSelectTotalGroupStatus();
|
|
1476
|
+
this.showgrandTotalGroup = !this.showgrandTotalGroup;
|
|
1477
|
+
this.showSubTotalGroup = false;
|
|
1478
|
+
}
|
|
1479
|
+
}
|
|
1480
|
+
selectTotalGroup(index, type, item) {
|
|
1481
|
+
if (this.getPortletType(item) === "pivot") {
|
|
1482
|
+
const pivot = find(this.pivot._results, (el) => el.portlet.newId === item.newId);
|
|
1483
|
+
if (type === "sub") {
|
|
1484
|
+
this.showSubTotalGroup = false;
|
|
1485
|
+
this.pivotTableSubTotalList.forEach((subtotal) => {
|
|
1486
|
+
subtotal.selected = false;
|
|
1487
|
+
});
|
|
1488
|
+
this.pivotTableSubTotalList[index].selected = true;
|
|
1489
|
+
if (pivot.pivotObj) {
|
|
1490
|
+
switch (index) {
|
|
1491
|
+
case 0:
|
|
1492
|
+
this.config.fields.map((el) => {
|
|
1493
|
+
el.showSubTotals = true;
|
|
1494
|
+
});
|
|
1495
|
+
pivot.pivotObj.dataSourceSettings.showSubTotals = true;
|
|
1496
|
+
pivot.pivotObj.dataSourceSettings.showRowSubTotals = true;
|
|
1497
|
+
pivot.pivotObj.dataSourceSettings.showColumnSubTotals = true;
|
|
1498
|
+
this.config.showSubTotals = true;
|
|
1499
|
+
this.config.showRowSubTotals = true;
|
|
1500
|
+
this.config.showColumnSubTotals = true;
|
|
1501
|
+
break;
|
|
1502
|
+
case 1:
|
|
1503
|
+
this.config.fields.map((el) => {
|
|
1504
|
+
el.showSubTotals = false;
|
|
1505
|
+
});
|
|
1506
|
+
pivot.pivotObj.dataSourceSettings.showSubTotals = false;
|
|
1507
|
+
pivot.pivotObj.dataSourceSettings.showRowSubTotals = true;
|
|
1508
|
+
pivot.pivotObj.dataSourceSettings.showColumnSubTotals = true;
|
|
1509
|
+
this.config.showSubTotals = false;
|
|
1510
|
+
this.config.showRowSubTotals = true;
|
|
1511
|
+
this.config.showColumnSubTotals = true;
|
|
1512
|
+
break;
|
|
1513
|
+
case 2:
|
|
1514
|
+
this.config.fields.map((el) => {
|
|
1515
|
+
el.showSubTotals = false;
|
|
1516
|
+
});
|
|
1517
|
+
for (let gitem of this.config.xaxis.groups) {
|
|
1518
|
+
const field = this.config.fields.filter((fl) => fl.colName === gitem.name);
|
|
1519
|
+
if (field.length > 0) {
|
|
1520
|
+
field[0].showSubTotals = true;
|
|
1521
|
+
}
|
|
1522
|
+
}
|
|
1523
|
+
pivot.pivotObj.dataSourceSettings.showSubTotals = true;
|
|
1524
|
+
pivot.pivotObj.dataSourceSettings.showRowSubTotals = true;
|
|
1525
|
+
pivot.pivotObj.dataSourceSettings.showColumnSubTotals = false;
|
|
1526
|
+
this.config.showSubTotals = true;
|
|
1527
|
+
this.config.showRowSubTotals = true;
|
|
1528
|
+
this.config.showColumnSubTotals = false;
|
|
1529
|
+
break;
|
|
1530
|
+
case 3:
|
|
1531
|
+
this.config.fields.map((el) => {
|
|
1532
|
+
el.showSubTotals = false;
|
|
1533
|
+
});
|
|
1534
|
+
for (let item of this.config.columnGroup) {
|
|
1535
|
+
const field = this.config.fields.filter((fl) => fl.colName === item.name);
|
|
1536
|
+
if (field.length > 0) {
|
|
1537
|
+
field[0].showSubTotals = true;
|
|
1538
|
+
}
|
|
1539
|
+
}
|
|
1540
|
+
pivot.pivotObj.dataSourceSettings.showSubTotals = true;
|
|
1541
|
+
pivot.pivotObj.dataSourceSettings.showRowSubTotals = false;
|
|
1542
|
+
pivot.pivotObj.dataSourceSettings.showColumnSubTotals = true;
|
|
1543
|
+
this.config.showSubTotals = true;
|
|
1544
|
+
this.config.showRowSubTotals = false;
|
|
1545
|
+
this.config.showColumnSubTotals = true;
|
|
1546
|
+
break;
|
|
1547
|
+
default:
|
|
1548
|
+
break;
|
|
1549
|
+
}
|
|
1550
|
+
}
|
|
1551
|
+
}
|
|
1552
|
+
else {
|
|
1553
|
+
this.showgrandTotalGroup = false;
|
|
1554
|
+
this.pivotTableGrandTotalList.forEach((grandtotal) => {
|
|
1555
|
+
grandtotal.selected = false;
|
|
1556
|
+
});
|
|
1557
|
+
this.pivotTableGrandTotalList[index].selected = true;
|
|
1558
|
+
if (pivot.pivotObj) {
|
|
1559
|
+
switch (index) {
|
|
1560
|
+
case 0:
|
|
1561
|
+
pivot.pivotObj.dataSourceSettings.showGrandTotals = true;
|
|
1562
|
+
pivot.pivotObj.dataSourceSettings.showRowGrandTotals = true;
|
|
1563
|
+
pivot.pivotObj.dataSourceSettings.showColumnGrandTotals = true;
|
|
1564
|
+
this.config.showGrandTotals = true;
|
|
1565
|
+
this.config.showRowGrandTotals = true;
|
|
1566
|
+
this.config.showColumnGrandTotals = true;
|
|
1567
|
+
break;
|
|
1568
|
+
case 1:
|
|
1569
|
+
pivot.pivotObj.dataSourceSettings.showGrandTotals = false;
|
|
1570
|
+
pivot.pivotObj.dataSourceSettings.showRowGrandTotals = true;
|
|
1571
|
+
pivot.pivotObj.dataSourceSettings.showColumnGrandTotals = true;
|
|
1572
|
+
this.config.showGrandTotals = false;
|
|
1573
|
+
this.config.showRowGrandTotals = true;
|
|
1574
|
+
this.config.showColumnGrandTotals = true;
|
|
1575
|
+
break;
|
|
1576
|
+
case 2:
|
|
1577
|
+
pivot.pivotObj.dataSourceSettings.showGrandTotals = true;
|
|
1578
|
+
pivot.pivotObj.dataSourceSettings.showRowGrandTotals = true;
|
|
1579
|
+
pivot.pivotObj.dataSourceSettings.showColumnGrandTotals = false;
|
|
1580
|
+
this.config.showGrandTotals = true;
|
|
1581
|
+
this.config.showRowGrandTotals = true;
|
|
1582
|
+
this.config.showColumnGrandTotals = false;
|
|
1583
|
+
break;
|
|
1584
|
+
case 3:
|
|
1585
|
+
pivot.pivotObj.dataSourceSettings.showGrandTotals = true;
|
|
1586
|
+
pivot.pivotObj.dataSourceSettings.showRowGrandTotals = false;
|
|
1587
|
+
pivot.pivotObj.dataSourceSettings.showColumnGrandTotals = true;
|
|
1588
|
+
this.config.showGrandTotals = true;
|
|
1589
|
+
this.config.showRowGrandTotals = false;
|
|
1590
|
+
this.config.showColumnGrandTotals = true;
|
|
1591
|
+
break;
|
|
1592
|
+
default:
|
|
1593
|
+
break;
|
|
1594
|
+
}
|
|
1595
|
+
}
|
|
1596
|
+
}
|
|
1597
|
+
if (pivot.pivotObj) {
|
|
1598
|
+
pivot.pivotObj.render();
|
|
1599
|
+
item.config = CircularJSON.stringify(this.config);
|
|
1600
|
+
const portletIndex = this.portlets.findIndex((x) => x.newId === item.newId);
|
|
1601
|
+
this.portlets[portletIndex] = item;
|
|
1602
|
+
this.dashboardService.changePivot.next(item.newId);
|
|
1603
|
+
}
|
|
1604
|
+
}
|
|
1605
|
+
else {
|
|
1606
|
+
const table = find(this.table._results, (el) => el.portlet.newId === item.newId);
|
|
1607
|
+
this.showTableGrandTotalGroup = false;
|
|
1608
|
+
this.tableGrandTotalList.forEach((grandtotal) => {
|
|
1609
|
+
grandtotal.selected = false;
|
|
1610
|
+
});
|
|
1611
|
+
this.tableGrandTotalList[index].selected = true;
|
|
1612
|
+
if (table) {
|
|
1613
|
+
switch (index) {
|
|
1614
|
+
case 0:
|
|
1615
|
+
this.config.showGrandTotals = true;
|
|
1616
|
+
table.grid.element
|
|
1617
|
+
.querySelector(".e-gridfooter")
|
|
1618
|
+
.classList.remove("hidesummary");
|
|
1619
|
+
break;
|
|
1620
|
+
case 1:
|
|
1621
|
+
this.config.showGrandTotals = false;
|
|
1622
|
+
table.grid.element
|
|
1623
|
+
.querySelector(".e-gridfooter")
|
|
1624
|
+
.classList.add("hidesummary");
|
|
1625
|
+
break;
|
|
1626
|
+
}
|
|
1627
|
+
item.config = CircularJSON.stringify(this.config);
|
|
1628
|
+
const portletIndex = this.portlets.findIndex((x) => x.newId === item.newId);
|
|
1629
|
+
this.portlets[portletIndex] = item;
|
|
1630
|
+
}
|
|
1631
|
+
}
|
|
1632
|
+
}
|
|
1633
|
+
getSelectTotalGroupStatus(type) {
|
|
1634
|
+
if (type === "sub") {
|
|
1635
|
+
if (this.config.showSubTotals &&
|
|
1636
|
+
this.config.showRowSubTotals &&
|
|
1637
|
+
this.config.showColumnSubTotals) {
|
|
1638
|
+
this.pivotTableSubTotalList[0].selected = true;
|
|
1639
|
+
}
|
|
1640
|
+
if (!this.config.showSubTotals &&
|
|
1641
|
+
this.config.showRowSubTotals &&
|
|
1642
|
+
this.config.showColumnSubTotals) {
|
|
1643
|
+
this.pivotTableSubTotalList[1].selected = true;
|
|
1644
|
+
}
|
|
1645
|
+
if (this.config.showSubTotals &&
|
|
1646
|
+
this.config.showRowSubTotals &&
|
|
1647
|
+
!this.config.showColumnSubTotals) {
|
|
1648
|
+
this.pivotTableSubTotalList[2].selected = true;
|
|
1649
|
+
}
|
|
1650
|
+
if (this.config.showSubTotals &&
|
|
1651
|
+
!this.config.showRowSubTotals &&
|
|
1652
|
+
this.config.showColumnSubTotals) {
|
|
1653
|
+
this.pivotTableSubTotalList[3].selected = true;
|
|
1654
|
+
}
|
|
1655
|
+
}
|
|
1656
|
+
else if (type === "tableGrand") {
|
|
1657
|
+
if (this.config && this.config.showGrandTotals) {
|
|
1658
|
+
this.tableGrandTotalList[0].selected = true;
|
|
1659
|
+
}
|
|
1660
|
+
if (!this.config.showGrandTotals) {
|
|
1661
|
+
this.tableGrandTotalList[1].selected = true;
|
|
1662
|
+
}
|
|
1663
|
+
}
|
|
1664
|
+
else {
|
|
1665
|
+
if (this.config.showGrandTotals &&
|
|
1666
|
+
this.config.showRowGrandTotals &&
|
|
1667
|
+
this.config.showColumnGrandTotals) {
|
|
1668
|
+
this.pivotTableGrandTotalList[0].selected = true;
|
|
1669
|
+
}
|
|
1670
|
+
if (!this.config.showGrandTotals &&
|
|
1671
|
+
this.config.showRowGrandTotals &&
|
|
1672
|
+
this.config.showColumnGrandTotals) {
|
|
1673
|
+
this.pivotTableGrandTotalList[1].selected = true;
|
|
1674
|
+
}
|
|
1675
|
+
if (this.config.showGrandTotals &&
|
|
1676
|
+
this.config.showRowGrandTotals &&
|
|
1677
|
+
!this.config.showColumnGrandTotals) {
|
|
1678
|
+
this.pivotTableGrandTotalList[2].selected = true;
|
|
1679
|
+
}
|
|
1680
|
+
if (this.config.showGrandTotals &&
|
|
1681
|
+
!this.config.showRowGrandTotals &&
|
|
1682
|
+
this.config.showColumnGrandTotals) {
|
|
1683
|
+
this.pivotTableGrandTotalList[3].selected = true;
|
|
1684
|
+
}
|
|
1685
|
+
}
|
|
1686
|
+
}
|
|
1687
|
+
initCharData(noDetect = false) {
|
|
1688
|
+
if (!this.dashboard) {
|
|
1689
|
+
return;
|
|
1690
|
+
}
|
|
1691
|
+
let filesObj = {}; // 用来翻译
|
|
1692
|
+
for (var i in this.DashboardPorletsService.fieldsArr[this.dashboard.id]) {
|
|
1693
|
+
if (this.DashboardPorletsService.fieldsArr[this.dashboard.id][i]) {
|
|
1694
|
+
this.DashboardPorletsService.fieldsArr[this.dashboard.id][i].forEach((t) => {
|
|
1695
|
+
filesObj[t.colName] = t["langCode"];
|
|
1696
|
+
});
|
|
1697
|
+
}
|
|
1698
|
+
}
|
|
1699
|
+
this.portlets.forEach((e) => {
|
|
1700
|
+
if (!e.config) {
|
|
1701
|
+
return;
|
|
1702
|
+
}
|
|
1703
|
+
const config = JSON.parse(e.config);
|
|
1704
|
+
// 如果是 historicalIRR,根据 visualType 进行渲染
|
|
1705
|
+
const portletType = config.portletType === "historicalIRR"
|
|
1706
|
+
? config.selectedVisualType
|
|
1707
|
+
: config.portletType;
|
|
1708
|
+
let isNewChart = ["newcolumn", "newline", "newcolumnline"].includes(portletType);
|
|
1709
|
+
if (isNewChart) {
|
|
1710
|
+
let dataColumn = [];
|
|
1711
|
+
let dataLine = [];
|
|
1712
|
+
let yXias = [];
|
|
1713
|
+
let secondYXias = [];
|
|
1714
|
+
// const config = JSON.parse(e.config);
|
|
1715
|
+
if (config.selectedY && config.selectedY.length > 0) {
|
|
1716
|
+
yXias = config.selectedY;
|
|
1717
|
+
}
|
|
1718
|
+
if (config.selectedSecondY && config.selectedSecondY.length > 0) {
|
|
1719
|
+
secondYXias = config.selectedSecondY;
|
|
1720
|
+
}
|
|
1721
|
+
let dataItem;
|
|
1722
|
+
if (e.id && e.id != "00000000-0000-0000-0000-000000000000") {
|
|
1723
|
+
dataItem =
|
|
1724
|
+
this.DashboardPorletsService.portletData_New[this.dashboard.id][e.id] || [];
|
|
1725
|
+
}
|
|
1726
|
+
else if (e.newId) {
|
|
1727
|
+
dataItem =
|
|
1728
|
+
this.DashboardPorletsService.portletData_New[this.dashboard.id][e.newId] || [];
|
|
1729
|
+
}
|
|
1730
|
+
if (dataItem && dataItem.data && dataItem.data.length > 0) {
|
|
1731
|
+
const xAxisField = config.fields.find((field) => field.colName === config.selectedX);
|
|
1732
|
+
dataItem.data.forEach((item) => {
|
|
1733
|
+
const period = xAxisField && xAxisField.dataType === "date"
|
|
1734
|
+
? this.datePipe.transform(item[config.selectedX], "yyyy-MM-dd")
|
|
1735
|
+
: item[config.selectedX];
|
|
1736
|
+
if (portletType == "newline") {
|
|
1737
|
+
if (yXias.length > 0) {
|
|
1738
|
+
let obj = { period };
|
|
1739
|
+
yXias.forEach((y) => {
|
|
1740
|
+
obj[this.translation[filesObj[y]] || y] = item[y];
|
|
1741
|
+
});
|
|
1742
|
+
dataLine.push(obj);
|
|
1743
|
+
}
|
|
1744
|
+
}
|
|
1745
|
+
else {
|
|
1746
|
+
if (yXias.length > 0) {
|
|
1747
|
+
let obj = { period };
|
|
1748
|
+
yXias.forEach((y) => {
|
|
1749
|
+
obj[this.translation[filesObj[y]] || y] = item[y];
|
|
1750
|
+
});
|
|
1751
|
+
dataColumn.push(obj);
|
|
1752
|
+
}
|
|
1753
|
+
if (secondYXias.length > 0) {
|
|
1754
|
+
let obj = { period };
|
|
1755
|
+
secondYXias.forEach((y) => {
|
|
1756
|
+
obj[this.translation[filesObj[y]] || y] = item[y];
|
|
1757
|
+
});
|
|
1758
|
+
dataLine.push(obj);
|
|
1759
|
+
}
|
|
1760
|
+
}
|
|
1761
|
+
});
|
|
1762
|
+
}
|
|
1763
|
+
// 时间排序
|
|
1764
|
+
if (config.selectedX == "Date") {
|
|
1765
|
+
dataColumn && dataColumn.sort(this.compareDates);
|
|
1766
|
+
dataLine && dataLine.sort(this.compareDates);
|
|
1767
|
+
}
|
|
1768
|
+
// 赋值dataColumn和dataLine对应的Type
|
|
1769
|
+
config.fields.forEach((t) => {
|
|
1770
|
+
if (config.selectedY && config.selectedY.length > 0) {
|
|
1771
|
+
if (t["colName"] == config.selectedY[0]) {
|
|
1772
|
+
e["columnType"] = t["dataType"];
|
|
1773
|
+
}
|
|
1774
|
+
}
|
|
1775
|
+
if (config.selectedSecondY && config.selectedSecondY.length > 0) {
|
|
1776
|
+
if (t["colName"] == config.selectedSecondY[0]) {
|
|
1777
|
+
e["lineType"] = t["dataType"];
|
|
1778
|
+
}
|
|
1779
|
+
}
|
|
1780
|
+
});
|
|
1781
|
+
e["dataColumn"] = dataColumn;
|
|
1782
|
+
e["dataLine"] = dataLine;
|
|
1783
|
+
if (config["selectTheme"]) {
|
|
1784
|
+
e["themeColor"] = this.themeObj[config["selectTheme"]];
|
|
1785
|
+
}
|
|
1786
|
+
}
|
|
1787
|
+
});
|
|
1788
|
+
if (!noDetect) {
|
|
1789
|
+
this.setActiveDashboardPortlets();
|
|
1790
|
+
}
|
|
1791
|
+
}
|
|
1792
|
+
compareDates(a, b) {
|
|
1793
|
+
const dateA = new Date(a.period);
|
|
1794
|
+
const dateB = new Date(b.period);
|
|
1795
|
+
if (dateA < dateB) {
|
|
1796
|
+
return -1;
|
|
1797
|
+
}
|
|
1798
|
+
else if (dateA > dateB) {
|
|
1799
|
+
return 1;
|
|
1800
|
+
}
|
|
1801
|
+
else {
|
|
1802
|
+
return 0;
|
|
1803
|
+
}
|
|
1804
|
+
}
|
|
1805
|
+
truncateText(text, maxWidth = 70, fontSize = 11) {
|
|
1806
|
+
// 创建一个隐形的 span 来测量文本宽度
|
|
1807
|
+
const measureSpan = document.createElement("div");
|
|
1808
|
+
measureSpan.style.visibility = "hidden";
|
|
1809
|
+
measureSpan.style.position = "absolute";
|
|
1810
|
+
measureSpan.style.fontSize = fontSize + "px";
|
|
1811
|
+
measureSpan.style.whiteSpace = "nowrap";
|
|
1812
|
+
measureSpan.innerText = text;
|
|
1813
|
+
document.body.appendChild(measureSpan);
|
|
1814
|
+
// 二分查找来找到最佳截断点
|
|
1815
|
+
let left = 1;
|
|
1816
|
+
let right = text.length - 1;
|
|
1817
|
+
let leftOrRight = "left";
|
|
1818
|
+
let isBigger = false;
|
|
1819
|
+
if (measureSpan.offsetWidth > maxWidth) {
|
|
1820
|
+
while (!isBigger) {
|
|
1821
|
+
measureSpan.innerText = `${text.slice(0, left)}...${text.slice(right)}`;
|
|
1822
|
+
if (measureSpan.offsetWidth > maxWidth) {
|
|
1823
|
+
isBigger = true;
|
|
1824
|
+
}
|
|
1825
|
+
else {
|
|
1826
|
+
if (leftOrRight === "left") {
|
|
1827
|
+
leftOrRight = "right";
|
|
1828
|
+
left = left + 1;
|
|
1829
|
+
}
|
|
1830
|
+
else {
|
|
1831
|
+
leftOrRight = "left";
|
|
1832
|
+
right = right - 1;
|
|
1833
|
+
}
|
|
1834
|
+
}
|
|
1835
|
+
}
|
|
1836
|
+
}
|
|
1837
|
+
else {
|
|
1838
|
+
document.body.removeChild(measureSpan);
|
|
1839
|
+
return text;
|
|
1840
|
+
}
|
|
1841
|
+
// 清理并返回结果
|
|
1842
|
+
document.body.removeChild(measureSpan);
|
|
1843
|
+
return `${text.slice(0, left - 1)}${left !== 1 ? "..." : ""}${text.slice(right + 1)}`;
|
|
1844
|
+
}
|
|
1845
|
+
getPaddingBottom() {
|
|
1846
|
+
let paddingBotto = 50;
|
|
1847
|
+
// 存在Title 或者 Description占位置时
|
|
1848
|
+
if (this.dashboard &&
|
|
1849
|
+
(this.dashboard.title || this.dashboard.description)) {
|
|
1850
|
+
let gap = 0;
|
|
1851
|
+
if (this.dashboard.title) {
|
|
1852
|
+
gap += 5;
|
|
1853
|
+
}
|
|
1854
|
+
if (this.dashboard.description) {
|
|
1855
|
+
gap += 20;
|
|
1856
|
+
}
|
|
1857
|
+
const element = document.querySelector(".portlets-description");
|
|
1858
|
+
paddingBotto = element ? element.offsetHeight + gap + 50 : 50;
|
|
1859
|
+
}
|
|
1860
|
+
return paddingBotto + "px";
|
|
1861
|
+
}
|
|
1862
|
+
updateDashboardLastUpdateDate() {
|
|
1863
|
+
this.pbf.pageLoading = true;
|
|
1864
|
+
this.pbf.pageLoading_.next(true);
|
|
1865
|
+
const _dataObj = { dashboardId: this.url_id, language: this.lang };
|
|
1866
|
+
this.http.post(this.api.urlList.GetDashboardV2, _dataObj, (res) => {
|
|
1867
|
+
res = this.pbf.convertKeysToLowerCase(res);
|
|
1868
|
+
this.dashboard.UpdatedDate = res.UpdatedDate;
|
|
1869
|
+
this.pbf.pageLoading = false;
|
|
1870
|
+
this.pbf.pageLoading_.next(true);
|
|
1871
|
+
});
|
|
1872
|
+
}
|
|
1873
|
+
savedashboard(shouldUpdate = "false") {
|
|
1874
|
+
this.pbf.pageLoading = true;
|
|
1875
|
+
this.pbf.pageLoading_.next(true);
|
|
1876
|
+
const pdata = this.dashboardLayout.serialize();
|
|
1877
|
+
this.newPosition = [...pdata];
|
|
1878
|
+
const portlets = [...this.portlets];
|
|
1879
|
+
if (portlets && portlets.length) {
|
|
1880
|
+
let activeTabHasPortlet = false;
|
|
1881
|
+
const tabIds = [];
|
|
1882
|
+
portlets.map((el) => {
|
|
1883
|
+
const data = find(this.newPosition, (item) => item.id === el.newId);
|
|
1884
|
+
if (data) {
|
|
1885
|
+
el.col = data.col;
|
|
1886
|
+
el.posX = data.col;
|
|
1887
|
+
el.row = data.row;
|
|
1888
|
+
el.posY = data.row;
|
|
1889
|
+
el.sizeX = data.sizeX;
|
|
1890
|
+
el.width = data.sizeX;
|
|
1891
|
+
el.sizeY = data.sizeY;
|
|
1892
|
+
el.height = data.sizeY;
|
|
1893
|
+
}
|
|
1894
|
+
let config = el.config ? JSON.parse(el.config) : null;
|
|
1895
|
+
if (config) {
|
|
1896
|
+
config = {
|
|
1897
|
+
...config,
|
|
1898
|
+
prevDashboarId: el.id,
|
|
1899
|
+
activeTab: this.activeTab,
|
|
1900
|
+
};
|
|
1901
|
+
tabIds.push(config.tabId);
|
|
1902
|
+
if (config.tabId === this.activeTab) {
|
|
1903
|
+
activeTabHasPortlet = true;
|
|
1904
|
+
}
|
|
1905
|
+
el.config = CircularJSON.stringify(config);
|
|
1906
|
+
}
|
|
1907
|
+
});
|
|
1908
|
+
if (!activeTabHasPortlet) {
|
|
1909
|
+
portlets.forEach((el) => {
|
|
1910
|
+
let config = el.config ? JSON.parse(el.config) : null;
|
|
1911
|
+
if (config) {
|
|
1912
|
+
config = {
|
|
1913
|
+
...config,
|
|
1914
|
+
prevDashboarId: el.id,
|
|
1915
|
+
activeTab: tabIds[0],
|
|
1916
|
+
};
|
|
1917
|
+
}
|
|
1918
|
+
el.config = CircularJSON.stringify(config);
|
|
1919
|
+
});
|
|
1920
|
+
}
|
|
1921
|
+
}
|
|
1922
|
+
let dataObj = {
|
|
1923
|
+
portlets,
|
|
1924
|
+
dashboardId: this.url_id,
|
|
1925
|
+
lastUpdateDate: this.dashboard.UpdatedDate,
|
|
1926
|
+
};
|
|
1927
|
+
this.http.post(this.api.urlList.SaveDashboardPortlets, dataObj, (res) => {
|
|
1928
|
+
if (res.status == "SUCCESS") {
|
|
1929
|
+
this.DashboardPorletsService.GetDashboardV1(this.url_id, false, (_res, _portlets = []) => {
|
|
1930
|
+
this.pbf.pageLoading = false;
|
|
1931
|
+
this.pbf.pageLoading_.next(true);
|
|
1932
|
+
if (!_res) {
|
|
1933
|
+
return;
|
|
1934
|
+
}
|
|
1935
|
+
const _saveMessage = this.translation.DASHBOARD_SAVE_MESSAGE ||
|
|
1936
|
+
"Dashboard has been updated";
|
|
1937
|
+
this.dialogService.showSucMsg(_saveMessage);
|
|
1938
|
+
if (shouldUpdate !== "true") {
|
|
1939
|
+
this.toggleCustomize(false);
|
|
1940
|
+
this.toggleSidebar(false);
|
|
1941
|
+
this.updatePushBtn(false);
|
|
1942
|
+
}
|
|
1943
|
+
this.updateDashboard({
|
|
1944
|
+
dashboard: _res,
|
|
1945
|
+
portlets: _portlets,
|
|
1946
|
+
noDetect: true,
|
|
1947
|
+
});
|
|
1948
|
+
this.initlayout(true);
|
|
1949
|
+
this.ref.markForCheck();
|
|
1950
|
+
this.ref.detectChanges();
|
|
1951
|
+
});
|
|
1952
|
+
}
|
|
1953
|
+
else {
|
|
1954
|
+
let errorMessage = "Dashboard save failed";
|
|
1955
|
+
if (Array.isArray(res.messages)) {
|
|
1956
|
+
errorMessage = res.messages[0].message;
|
|
1957
|
+
}
|
|
1958
|
+
this.dialogService.showNotification(errorMessage, {
|
|
1959
|
+
status: "Error",
|
|
1960
|
+
});
|
|
1961
|
+
this.pbf.pageLoading = false;
|
|
1962
|
+
this.pbf.pageLoading_.next(true);
|
|
1963
|
+
}
|
|
1964
|
+
});
|
|
1965
|
+
}
|
|
1966
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PaneGroupNewComponent, deps: [{ token: i1.MatDialog }, { token: i2.DialogService }, { token: i3.DashboardService }, { token: i4.ApiList }, { token: i5.ActivatedRoute }, { token: i6.DashboardPorletsService }, { token: i0.ChangeDetectorRef }, { token: i5.Router }, { token: i7.HttpClient }, { token: i8.DatePipe }, { token: PBF_TOKEN, optional: true }, { token: API_SERVICE_TOKEN, optional: true }, { token: ROLE_SERVICE_TOKEN, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
1967
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: PaneGroupNewComponent, selector: "rs-dashboard", inputs: { appCode: "appCode" }, outputs: { dateChange: "dateChange" }, host: { listeners: { "document:click": "bodyClick($event)" } }, providers: [DatePipe, { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }], viewQueries: [{ propertyName: "sidebar", first: true, predicate: ["sidebar"], descendants: true }, { propertyName: "dashboardLayout", first: true, predicate: ["defaultLayout"], descendants: true }, { propertyName: "canvas", first: true, predicate: ["canvas"], descendants: true, static: true }, { propertyName: "panesList", first: true, predicate: ["panesList"], descendants: true, static: true }, { propertyName: "unclick", predicate: ["unclick"], descendants: true }, { propertyName: "unclickGrand", predicate: ["unclickGrand"], descendants: true }, { propertyName: "newChart", predicate: ["newChart"], descendants: true }, { propertyName: "table", predicate: ["table"], descendants: true }, { propertyName: "pivot", predicate: ["pivot"], descendants: true }, { propertyName: "transpose", predicate: ["transpose"], descendants: true }], ngImport: i0, template: "<div id=\"kt-dashboard-container\" class=\"content-portlets\">\r\n <div\r\n *ngIf=\"\r\n dashboard &&\r\n (dashboard.title || dashboard.description) &&\r\n !haveFullScreen.length\r\n \"\r\n class=\"portlets-description\"\r\n >\r\n <h4 *ngIf=\"dashboard && dashboard.title && !haveFullScreen.length\">\r\n {{ dashboard ? dashboard.title : \"\" }}\r\n </h4>\r\n <p *ngIf=\"dashboard && dashboard.description && !haveFullScreen.length\">\r\n {{ dashboard ? dashboard.description : \"\" }}\r\n </p>\r\n </div>\r\n <div class=\"panes-list\" id=\"kt-dashboard-layout\" #panesList>\r\n <div style=\"width: 100%\">\r\n <ejs-dashboardlayout\r\n id=\"defaultLayout\"\r\n #defaultLayout\r\n [columns]=\"4\"\r\n [cellSpacing]=\"cellSpacing\"\r\n [cellAspectRatio]=\"cellAspectRatio\"\r\n [allowDragging]=\"customized\"\r\n [allowResizing]=\"customized\"\r\n [resizableHandles]=\"resizableHandles\"\r\n [draggableHandle]=\"draggableHandle\"\r\n [mediaQuery]=\"mediaQuery\"\r\n (resizeStop)=\"resizeStop($event)\"\r\n (dragStop)=\"dragStop($event)\"\r\n >\r\n <e-panels\r\n *ngIf=\"ActiveDashboardPortlets && ActiveDashboardPortlets.length\"\r\n >\r\n <e-panel\r\n *ngFor=\"let item of ActiveDashboardPortlets; let i = index\"\r\n [sizeX]=\"item.sizeX\"\r\n [id]=\"item.newId\"\r\n [sizeY]=\"item.sizeY\"\r\n [row]=\"item.row\"\r\n [col]=\"item.col\"\r\n >\r\n <ng-template #header>\r\n <div class=\"gadget-title\">\r\n {{ GetgadgetTitle(item.config) }}\r\n </div>\r\n <div class=\"gadgetBar pane-group-gadget\">\r\n <ul class=\"pane-gadget-container\">\r\n <li\r\n *ngIf=\"customized\"\r\n [matTooltip]=\"\r\n translation.DUPLICATE\r\n ? translation.DUPLICATE\r\n : '.DUPLICATE'\r\n \"\r\n (click)=\"copyPortlet(item)\"\r\n >\r\n <img\r\n src=\"../../assets/img/dashboard_icon/menu-duplicate.svg\"\r\n />\r\n </li>\r\n <li\r\n *ngIf=\"customized && rs.hasPermission('DELETE')\"\r\n [matTooltip]=\"\r\n translation.DELETE ? translation.DELETE : '.DELETE'\r\n \"\r\n (click)=\"delete(item)\"\r\n >\r\n <img\r\n src=\"../../assets/img/dashboard_icon/gadget-delete.svg\"\r\n />\r\n </li>\r\n <li\r\n *ngIf=\"getPortletType(item) !== 'transpose'\"\r\n [matTooltip]=\"\r\n translation.DOWNLOAD ? translation.DOWNLOAD : '.DOWNLOAD'\r\n \"\r\n >\r\n <img\r\n src=\"../../assets/img/dashboard_icon/menu-download.svg\"\r\n (click)=\"download(item)\"\r\n />\r\n </li>\r\n <li\r\n *ngIf=\"\r\n customized &&\r\n !['newcolumn', 'newline', 'newcolumnline'].includes(\r\n getPortletType(item)\r\n )\r\n \"\r\n [matTooltip]=\"\r\n translation.FILTER ? translation.FILTER : '.FILTER'\r\n \"\r\n >\r\n <img\r\n src=\"../../assets/img/dashboard_icon/gadget-filters.svg\"\r\n (click)=\"openFilter(item)\"\r\n />\r\n </li>\r\n\r\n <li\r\n #unclick\r\n *ngIf=\"customized && getPortletType(item) === 'pivot'\"\r\n style=\"margin-right: 18px\"\r\n >\r\n <img\r\n src=\"../../assets/img/dashboard_icon/gadget-basic-sub-total.svg\"\r\n (click)=\"openSubtotal(item)\"\r\n />\r\n <img\r\n src=\"../../assets/img/dashboard_icon/gadget-basic-arrow-down.svg\"\r\n (click)=\"openSubtotal(item)\"\r\n />\r\n </li>\r\n <div\r\n #unclick\r\n class=\"pivotTable-sub-grand-group\"\r\n *ngIf=\"\r\n showSubTotalGroup &&\r\n getPortletType(item) === 'pivot' &&\r\n Current_PortletId === item.newId\r\n \"\r\n >\r\n <ul>\r\n <li\r\n class=\"sub-grand-group\"\r\n [ngStyle]=\"{\r\n 'background-color': subtotal.selected\r\n ? '#f8fafb'\r\n : '#fff'\r\n }\"\r\n *ngFor=\"\r\n let subtotal of pivotTableSubTotalList;\r\n let idx = index\r\n \"\r\n (click)=\"selectTotalGroup(idx, 'sub', item)\"\r\n >\r\n <div style=\"display: flex\">\r\n <div\r\n style=\"\r\n height: 33px;\r\n width: 34px;\r\n text-align: center;\r\n \"\r\n >\r\n <img\r\n *ngIf=\"subtotal.selected\"\r\n src=\"../../assets/img/dashboard_icon/forms-checkbox-square-tick.svg\"\r\n />\r\n </div>\r\n <span>{{ subtotal.value }}</span>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n <li\r\n #unclickGrand\r\n *ngIf=\"\r\n customized &&\r\n (getPortletType(item) === 'pivot' ||\r\n getPortletType(item) === 'table')\r\n \"\r\n style=\"margin-right: 18px\"\r\n >\r\n <img\r\n src=\"../../assets/img/dashboard_icon/gadget-basic-total.svg\"\r\n (click)=\"openGrandtotal(item)\"\r\n />\r\n <img\r\n src=\"../../assets/img/dashboard_icon/gadget-basic-arrow-down.svg\"\r\n (click)=\"openGrandtotal(item)\"\r\n />\r\n </li>\r\n <div\r\n #unclickGrand\r\n class=\"pivotTable-sub-grand-group\"\r\n style=\"left: 230px\"\r\n *ngIf=\"\r\n showgrandTotalGroup &&\r\n getPortletType(item) === 'pivot' &&\r\n Current_PortletId === item.newId\r\n \"\r\n >\r\n <ul>\r\n <li\r\n class=\"sub-grand-group\"\r\n [ngStyle]=\"{\r\n 'background-color': grandtotal.selected\r\n ? '#f8fafb'\r\n : '#fff'\r\n }\"\r\n *ngFor=\"\r\n let grandtotal of pivotTableGrandTotalList;\r\n let idx = index\r\n \"\r\n (click)=\"selectTotalGroup(idx, 'grand', item)\"\r\n >\r\n <div style=\"display: flex\">\r\n <div\r\n style=\"\r\n height: 33px;\r\n width: 34px;\r\n text-align: center;\r\n \"\r\n >\r\n <img\r\n *ngIf=\"grandtotal.selected\"\r\n src=\"../../assets/img/dashboard_icon/forms-checkbox-square-tick.svg\"\r\n />\r\n </div>\r\n <span>{{ grandtotal.value }}</span>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n <div\r\n #unclickGrand\r\n class=\"pivotTable-sub-grand-group\"\r\n style=\"left: 210px; height: 76px\"\r\n *ngIf=\"\r\n showTableGrandTotalGroup &&\r\n getPortletType(item) === 'table' &&\r\n Current_PortletId === item.newId\r\n \"\r\n >\r\n <ul>\r\n <li\r\n class=\"sub-grand-group\"\r\n [ngStyle]=\"{\r\n 'background-color': grandtotal.selected\r\n ? '#f8fafb'\r\n : '#fff'\r\n }\"\r\n *ngFor=\"\r\n let grandtotal of tableGrandTotalList;\r\n let idx = index\r\n \"\r\n (click)=\"selectTotalGroup(idx, 'tableGrand', item)\"\r\n >\r\n <div style=\"display: flex\">\r\n <div\r\n style=\"\r\n height: 33px;\r\n width: 34px;\r\n text-align: center;\r\n \"\r\n >\r\n <img\r\n *ngIf=\"grandtotal.selected\"\r\n src=\"../../assets/img/dashboard_icon/forms-checkbox-square-tick.svg\"\r\n />\r\n </div>\r\n <span>{{ grandtotal.value }}</span>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n <li\r\n *ngIf=\"\r\n customized &&\r\n !['newcolumn', 'newline', 'newcolumnline'].includes(\r\n getPortletType(item)\r\n )\r\n \"\r\n [matTooltip]=\"\r\n translation.FORMAT ? translation.FORMAT : '.FORMAT'\r\n \"\r\n >\r\n <img\r\n src=\"../../assets/img/dashboard_icon/gadget-basic-format.svg\"\r\n (click)=\"fieldFormat(item)\"\r\n />\r\n </li>\r\n <li\r\n *ngIf=\"\r\n (customized || url_type === 'sharedbeta') &&\r\n !['newcolumn', 'newline', 'newcolumnline'].includes(\r\n getPortletType(item)\r\n )\r\n \"\r\n [matTooltip]=\"\r\n translation.CONFIGURATIONS || '.CONFIGURATIONS'\r\n \"\r\n (click)=\"configurations(item, $event)\"\r\n >\r\n <img\r\n src=\"../../assets/img/dashboard_icon/gadget-settings.svg\"\r\n />\r\n </li>\r\n <li\r\n *ngIf=\"customized\"\r\n [matTooltip]=\"translation.EDIT ? translation.EDIT : '.EDIT'\"\r\n (click)=\"edit(item)\"\r\n >\r\n <img\r\n src=\"../../assets/img/dashboard_icon/gadget-edit.svg\"\r\n />\r\n </li>\r\n </ul>\r\n </div>\r\n </ng-template>\r\n <ng-template #content>\r\n <rs-gadget-table\r\n #table\r\n *ngIf=\"getPortletType(item) == 'table'\"\r\n [portlets]=\"portlets\"\r\n [dashboard]=\"dashboard\"\r\n [portlet]=\"item\"\r\n >\r\n </rs-gadget-table>\r\n <rs-gadget-pivot\r\n #pivot\r\n *ngIf=\"getPortletType(item) == 'pivot'\"\r\n [portlet]=\"item\"\r\n [dashboard]=\"dashboard\"\r\n [portlets]=\"portlets\"\r\n [themeColor]=\"item.themeColor\"\r\n >\r\n </rs-gadget-pivot>\r\n <rs-gadget-pivot-chart\r\n #pivot\r\n *ngIf=\"getPortletType(item) == 'newchart'\"\r\n [portlet]=\"item\"\r\n [dashboard]=\"dashboard\"\r\n (updatePorletConfig)=\"updatePorletConfig($event)\"\r\n [portlets]=\"portlets\"\r\n [themeColor]=\"item.themeColor\"\r\n >\r\n </rs-gadget-pivot-chart>\r\n <rs-gadget-transpose\r\n #transpose\r\n *ngIf=\"getPortletType(item) == 'transpose'\"\r\n [portlets]=\"portlets\"\r\n [dashboard]=\"dashboard\"\r\n [portlet]=\"item\"\r\n >\r\n </rs-gadget-transpose>\r\n <rs-bar-charts\r\n *ngIf=\"\r\n ['newcolumn', 'newline', 'newcolumnline'].includes(\r\n getPortletType(item)\r\n )\r\n \"\r\n #newChart\r\n [dashboard]=\"dashboard\"\r\n [dataColumn]=\"item.dataColumn\"\r\n [dataLine]=\"item.dataLine\"\r\n [columnType]=\"item.columnType\"\r\n [lineType]=\"item.lineType\"\r\n [themeColor]=\"item.themeColor\"\r\n [portlet]=\"item\"\r\n ></rs-bar-charts>\r\n </ng-template>\r\n </e-panel>\r\n </e-panels>\r\n </ejs-dashboardlayout>\r\n </div>\r\n </div>\r\n <rs-empty-icon-prompt\r\n [displayCode]=\"'customize'\"\r\n [dashboard]=\"dashboard\"\r\n hidden\r\n >\r\n </rs-empty-icon-prompt>\r\n <div\r\n id=\"kt-dashboard-tabs\"\r\n class=\"dashboard-tab-list\"\r\n cdkDropList\r\n cdkDropListOrientation=\"horizontal\"\r\n (cdkDropListDropped)=\"drop($event)\"\r\n >\r\n <div\r\n class=\"tab-item\"\r\n *ngFor=\"let item of tabList; let i = index\"\r\n [ngClass]=\"{\r\n active: item.id === activeTab,\r\n prev: prevId === item.id && i !== tabList.length - 1\r\n }\"\r\n (click)=\"onActiveTab(item, i)\"\r\n (dblclick)=\"onStartEdit(item.id)\"\r\n cdkDrag\r\n >\r\n <div\r\n *ngIf=\"!startEdit || item.id !== activeTab\"\r\n [matTooltip]=\"\r\n item.label === item.displayLabel ? null : item.displayLabel\r\n \"\r\n >\r\n {{ item.displayLabel }}\r\n <img\r\n *ngIf=\"tabList.length > 1\"\r\n src=\"../../assets/img/dashboard_icon/dashboard-tab-delete.svg\"\r\n alt=\"\"\r\n (click)=\"onDeleteTab(item)\"\r\n />\r\n </div>\r\n <input\r\n *ngIf=\"startEdit && item.id === activeTab\"\r\n type=\"text\"\r\n [(ngModel)]=\"item.label\"\r\n (input)=\"setTabInput($event)\"\r\n (blur)=\"saveTabInput(item)\"\r\n />\r\n </div>\r\n <img\r\n class=\"add-tab-icon\"\r\n src=\"../../assets/img/dashboard_icon/add-tab.svg\"\r\n (click)=\"onAddTab()\"\r\n />\r\n </div>\r\n</div>\r\n\r\n<div class=\"sidebar\" [ngClass]=\"{ gone: !push_btn }\" *ngIf=\"dashboard_sidebar\">\r\n <span class=\"push-btn\" (click)=\"pushSlider()\" [class.left-place]=\"!push_btn\">\r\n <span\r\n class=\"sidebar-btn\"\r\n *ngIf=\"push_btn\"\r\n [inlineSVG]=\"'../../assets/img/dashboard_icon/Angle-double-right.svg'\"\r\n ></span>\r\n <span\r\n class=\"sidebar-btn\"\r\n *ngIf=\"!push_btn\"\r\n [inlineSVG]=\"'../../assets/img/dashboard_icon/Angle-double-left.svg'\"\r\n ></span>\r\n </span>\r\n <rs-sidebar-iconlist-new\r\n #sidebar\r\n *ngIf=\"push_btn\"\r\n [dashboard_sidebar]=\"dashboard_sidebar\"\r\n [dashboard]=\"dashboard\"\r\n [dashboardId]=\"url_id\"\r\n [portlet]=\"portlet\"\r\n [portlets]=\"portlets\"\r\n [activeTabId]=\"activeTabId\"\r\n [activeTabLabel]=\"activeTabLabel\"\r\n [figureCode]=\"figureCode\"\r\n [tabactive]=\"tabactive\"\r\n [_selectedY]=\"selectedY\"\r\n [_selectedSecondY]=\"selectedSecondY\"\r\n [_selectedX]=\"selectedX\"\r\n [_selectedMultiples]=\"selectedMultiples\"\r\n [_selectTheme]=\"selectTheme\"\r\n [appCode]=\"appCode\"\r\n (updatePorlet)=\"updatePorlet($event)\"\r\n (chartUpdate)=\"chartUpdate($event)\"\r\n (closeSidebar)=\"closeSidebar($event)\"\r\n (updatePushBtn)=\"updatePushBtn($event)\"\r\n (updateTheme)=\"updateTheme($event)\"\r\n (updatePorletConfig)=\"updatePorletConfig($event)\"\r\n (onToggleTabactive)=\"onToggleTabactive($event)\"\r\n >\r\n </rs-sidebar-iconlist-new>\r\n</div>\r\n<button\r\n class=\"addPorlet\"\r\n *ngIf=\"customized && !push_btn\"\r\n mat-mini-fab\r\n color=\"primary\"\r\n (click)=\"addPorlet()\"\r\n>\r\n +\r\n</button>\r\n", styles: ["@charset \"UTF-8\";.kt-portlet.kt-portlet--mobile.kt-portlet--sortable{position:relative;overflow-x:auto;overflow-y:hidden;height:100%!important}.kt-portlet .kt-portlet__body{height:100%;overflow:hidden;padding:0 0 30px!important}.pane{margin-bottom:30px}i.la.la-compress{font-size:20px!important}.dropdown-menu.dropdown-menu-right.dropdown-menu-md.dropdown-menu-fit{z-index:102}h3.kt-portlet__head-title{font-size:18px!important;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}::ng-deep .date-portlet .mat-form-field-wrapper{width:100px;margin-left:15px}.table-none-padding{padding:0}.kt-portlet__head-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.btn-bordered{height:30px;width:40px;border-radius:5px;border:1px #6c757d solid;color:#44566c;padding:0}.btn-bordered.date{padding-top:4px;padding-left:8px;width:160px;font-size:15px}.btn-bordered .mat-datepicker-toggle{color:#00000080}.btn-bordered svg.mat-datepicker-toggle-default-icon.ng-star-inserted{width:20px!important}:host::ng-deep button.mat-icon-button.mat-button-base{transform:translateY(-10px)!important}gridster.scrollVertical{width:auto!important;background:#f2f2f8!important;padding-left:2px!important}.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col,.col-auto,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm,.col-sm-auto,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md,.col-md-auto,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg,.col-lg-auto,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl,.col-xl-auto{padding-right:15px!important;padding-left:15px!important}.kt-portlet__head-group.show{position:relative!important}.dropdown-menu.dropdown-menu-right.dropdown-menu-md.dropdown-menu-fit.show{top:48px!important;left:-230px!important;transform:none!important}span.top-date{font-family:Arial;font-size:15px;color:#6c757d}svg.bi.bi-arrows-angle-contract{color:#a2a5b9;margin-right:10px}li.full-svg:hover svg.bi.bi-arrows-angle-contract{color:#0081ff}.pdf-size{width:666px;height:999px}.portlets-description{padding:12px 8px 12px 20px;display:flex;flex-flow:column;gap:12px}.portlets-description h4,.portlets-description p{margin:0;color:#44566c;font-family:Arial;font-size:11px!important;font-style:normal;font-weight:400;line-height:14px}.edit-portlet{border:2px solid #0181ff;border-radius:10px}.kt-form__path{margin-bottom:23px;font-size:13px}.kt-form__path .lastspan,.kt-form__path .fa-angle-right{color:#8697a8}::ng-deep rs-dashboard{height:100%;display:flex;flex-direction:column;position:relative}::ng-deep rs-dashboard .panes-list{width:100%!important;margin-bottom:70px!important}::ng-deep rs-dashboard .panes-list .kt-portlet{border-radius:5px;border-top:10px solid #fff}::ng-deep rs-dashboard button.addPorlet{font-size:32px;position:fixed;bottom:100px;right:20px;z-index:1003;background-color:#0081ff!important}::ng-deep rs-dashboard .sidebar{right:0;top:0;bottom:0;position:absolute;z-index:1000;width:400px;background:#fff!important;transition:width .3s}::ng-deep rs-dashboard .sidebar .push-btn{position:absolute;left:0;top:0;z-index:1}::ng-deep rs-dashboard .sidebar.gone{width:0}::ng-deep rs-dashboard .sidebar .sidebar-btn svg g polygon{fill-opacity:0}::ng-deep rs-dashboard .sidebar .sidebar-btn:hover svg g path{fill:#0081ff;transition:fill .3s ease}.panes-list{height:100%;width:100%;margin:0!important;overflow:auto;padding-bottom:50px;background:#f2f2f8}.panes-list ::ng-deep .e-panel{border-radius:10px;overflow:auto}.panes-list ::ng-deep .e-panel .e-panel-container{min-width:340px;min-height:340px}.panes-list-dashboard{top:-20px!important}.panes-list-desktop{left:-25px!important;top:-36px!important}:host ::ng-deep .e-panel-header{padding:0!important;height:auto!important;border:0!important}.gadgetBar{height:24px;background-color:#fff!important}.gadgetBar .pane-gadget-container{padding:0 12px}.gadgetBar .pivotTable-sub-grand-group ul{width:100%;display:block}.gadgetBar .pivotTable-sub-grand-group ul li{width:24px;height:24px;display:flex;align-items:center;cursor:pointer;padding:4px}.gadgetBar ul{margin:0;padding:0;list-style:none;display:flex;width:100%;gap:12px}.gadgetBar ul li{width:24px;height:24px;display:flex;align-items:center;cursor:pointer;padding:4px}.gadget-title{height:36px;padding:10px 12px 8px;color:#43566c;font-family:Arial;font-size:15px;font-weight:700;line-height:18px}.pivotTable-sub-grand-group{width:241px;height:142px;z-index:999;position:absolute;left:180px;top:80px;border-radius:10px;border:solid 1px #eaedf0;background-color:#fff}.sub-grand-group{width:100%!important;display:block!important;height:33px!important;margin:0!important;line-height:33px!important;text-align:left!important}.sub-grand-group span{font-family:Arial;font-size:14px;color:#44566c;font-weight:400}.sub-grand-group:hover{background-color:#f8fafb!important}::ng-deep .e-pivotfieldlist-container .e-field-list-container .e-field-table .e-field-list-tree-outer-div{height:278px!important}.content-portlets{height:100%;position:relative;overflow:hidden}.content-portlets .dashboard-tab-list{position:absolute;bottom:0;left:0;z-index:1000;width:100%;border-top:1px solid #dbe1e7;border-bottom:1px solid #dbe1e7;background:#f8fafb;box-shadow:0 -1px 4px #0000000d;display:flex;align-items:center;height:28px}.content-portlets .dashboard-tab-list img{margin-left:10px;cursor:pointer}.content-portlets .dashboard-tab-list .tab-item{cursor:pointer;padding-bottom:4px;border-left:0;color:#43566c}.content-portlets .dashboard-tab-list .tab-item:hover img{display:block!important}.content-portlets .dashboard-tab-list .tab-item div{border-right:1px solid #d0d6dd;border-left:1px solid transparent;border-bottom:1px solid transparent;font-size:11px;line-height:16px;min-height:16px;padding:5px 12px 2px;display:flex;width:114px;align-items:center;justify-content:space-between;gap:6px}.content-portlets .dashboard-tab-list .tab-item div img{display:none;cursor:pointer;margin-left:0}.content-portlets .dashboard-tab-list .tab-item:first-child div{border-left:1px solid #d0d6dd}.content-portlets .dashboard-tab-list .tab-item:first-child.active div{border-right:1px solid #d6dce2}.content-portlets .dashboard-tab-list .tab-item.active div{background-color:#fff;border-bottom-color:#d6dce2;font-weight:700;border-radius:0 0 6px 6px;border-left-color:#d6dce2}.content-portlets .dashboard-tab-list .tab-item.prev div{border-right-color:transparent}.content-portlets .dashboard-tab-list .tab-item input{border:none;text-shadow:none;border-bottom:1px solid #43566c;outline:none;height:16px;width:150px;font-size:11px!important}::ng-deep .mat-menu-content .options{padding:4px 0}::ng-deep .mat-menu-content .options .option-item{padding:4px 8px;font-size:13px;cursor:pointer}::ng-deep .mat-menu-content .options .option-item:hover{background:#0000000d}::ng-deep .mat-menu-content .options .option-checkbox{padding:8px}::ng-deep .mat-menu-content .options .option-checkbox.first{border-top:1px solid rgba(0,0,0,.1)}::ng-deep .mat-menu-content .options .option-checkbox .e-icons{height:18px;width:18px}::ng-deep .mat-menu-content .options .option-checkbox .e-icons:before{font-size:12px}::ng-deep #vegetables_popup{width:400px!important}#kt-dashboard-container{display:flex;flex-flow:column nowrap}#kt-dashboard-tabs{flex:none;position:static;height:30px;padding:0 20px;display:flex;flex-flow:row nowrap;align-items:flex-start}#kt-dashboard-tabs .tab-item.active>div{padding-bottom:4px}#kt-dashboard-tabs .tab-item>div{color:#1f3f5c;font-family:Arial;font-size:11px;font-style:normal;font-weight:400;line-height:14px}#kt-dashboard-tabs .add-tab-icon{width:16px;height:16px;margin:5px 12px auto}#kt-dashboard-layout{flex:auto;height:0;padding:20px;background-color:#44566c1a}.left-place{left:-24px!important}\n"], dependencies: [{ kind: "directive", type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i9.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i9.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i10.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i10.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i11.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i12.MatMiniFabButton, selector: "button[mat-mini-fab]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i13.DashboardLayoutComponent, selector: "ejs-dashboardlayout", inputs: ["allowDragging", "allowFloating", "allowPushing", "allowResizing", "cellAspectRatio", "cellSpacing", "columns", "draggableHandle", "enableHtmlSanitizer", "enablePersistence", "enableRtl", "locale", "mediaQuery", "panels", "resizableHandles", "showGridLines"], outputs: ["change", "created", "destroyed", "drag", "dragStart", "dragStop", "resize", "resizeStart", "resizeStop"] }, { kind: "directive", type: i13.PanelDirective, selector: "e-panels>e-panel", inputs: ["col", "content", "cssClass", "enabled", "header", "id", "maxSizeX", "maxSizeY", "minSizeX", "minSizeY", "row", "sizeX", "sizeY", "zIndex"] }, { kind: "directive", type: i13.PanelsDirective, selector: "ejs-dashboardlayout>e-panels" }, { kind: "directive", type: i14.InlineSVGDirective, selector: "[inlineSVG]", inputs: ["inlineSVG", "resolveSVGUrl", "replaceContents", "prepend", "injectComponent", "cacheSVG", "setSVGAttributes", "removeSVGAttributes", "forceEvalStyles", "evalScripts", "fallbackImgUrl", "fallbackSVG", "onSVGLoaded"], outputs: ["onSVGInserted", "onSVGFailed"] }, { kind: "component", type: i15.SidebarIconlistNewComponent, selector: "rs-sidebar-iconlist-new", inputs: ["dashboard_sidebar", "dashboard", "dashboardId", "activeTabId", "activeTabLabel", "portlets", "tabactive", "portlet", "figureCode", "_selectedX", "_selectedY", "_selectedMultiples", "_selectedSecondY", "_selectTheme", "appCode"], outputs: ["closeSidebar", "updatePorletConfig", "onToggleTabactive", "updatePorlet", "updatePushBtn", "chartUpdate", "updateTheme"] }, { kind: "component", type: i16.EmptyIconPromptComponent, selector: "rs-empty-icon-prompt", inputs: ["displayCode", "dashboard"] }, { kind: "component", type: i17.GadgetTableComponent, selector: "rs-gadget-table", inputs: ["portlet", "dashboard", "portlets"] }, { kind: "component", type: i18.GadgetPivotComponent, selector: "rs-gadget-pivot", inputs: ["portlet", "dashboard", "portlets"] }, { kind: "component", type: i19.GadgetPivotChartComponent, selector: "rs-gadget-pivot-chart", inputs: ["portlet", "dashboard", "portlets"], outputs: ["updatePorletConfig"] }, { kind: "component", type: i20.GadgetTransposeComponent, selector: "rs-gadget-transpose", inputs: ["portlet", "portlets", "dashboard"] }, { kind: "component", type: i21.BarChartsComponent, selector: "rs-bar-charts", inputs: ["dataColumn", "dataLine", "dataStackingColumn", "columnType", "lineType", "themeColor", "portlet", "dashboard"] }] });
|
|
1968
|
+
}
|
|
1969
|
+
__decorate([
|
|
1970
|
+
debounce(100)
|
|
1971
|
+
], PaneGroupNewComponent.prototype, "filterData", null);
|
|
1972
|
+
__decorate([
|
|
1973
|
+
debounce(300)
|
|
1974
|
+
], PaneGroupNewComponent.prototype, "GetgadgetTitle", null);
|
|
1975
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PaneGroupNewComponent, decorators: [{
|
|
1976
|
+
type: Component,
|
|
1977
|
+
args: [{ selector: "rs-dashboard", providers: [DatePipe, { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }], template: "<div id=\"kt-dashboard-container\" class=\"content-portlets\">\r\n <div\r\n *ngIf=\"\r\n dashboard &&\r\n (dashboard.title || dashboard.description) &&\r\n !haveFullScreen.length\r\n \"\r\n class=\"portlets-description\"\r\n >\r\n <h4 *ngIf=\"dashboard && dashboard.title && !haveFullScreen.length\">\r\n {{ dashboard ? dashboard.title : \"\" }}\r\n </h4>\r\n <p *ngIf=\"dashboard && dashboard.description && !haveFullScreen.length\">\r\n {{ dashboard ? dashboard.description : \"\" }}\r\n </p>\r\n </div>\r\n <div class=\"panes-list\" id=\"kt-dashboard-layout\" #panesList>\r\n <div style=\"width: 100%\">\r\n <ejs-dashboardlayout\r\n id=\"defaultLayout\"\r\n #defaultLayout\r\n [columns]=\"4\"\r\n [cellSpacing]=\"cellSpacing\"\r\n [cellAspectRatio]=\"cellAspectRatio\"\r\n [allowDragging]=\"customized\"\r\n [allowResizing]=\"customized\"\r\n [resizableHandles]=\"resizableHandles\"\r\n [draggableHandle]=\"draggableHandle\"\r\n [mediaQuery]=\"mediaQuery\"\r\n (resizeStop)=\"resizeStop($event)\"\r\n (dragStop)=\"dragStop($event)\"\r\n >\r\n <e-panels\r\n *ngIf=\"ActiveDashboardPortlets && ActiveDashboardPortlets.length\"\r\n >\r\n <e-panel\r\n *ngFor=\"let item of ActiveDashboardPortlets; let i = index\"\r\n [sizeX]=\"item.sizeX\"\r\n [id]=\"item.newId\"\r\n [sizeY]=\"item.sizeY\"\r\n [row]=\"item.row\"\r\n [col]=\"item.col\"\r\n >\r\n <ng-template #header>\r\n <div class=\"gadget-title\">\r\n {{ GetgadgetTitle(item.config) }}\r\n </div>\r\n <div class=\"gadgetBar pane-group-gadget\">\r\n <ul class=\"pane-gadget-container\">\r\n <li\r\n *ngIf=\"customized\"\r\n [matTooltip]=\"\r\n translation.DUPLICATE\r\n ? translation.DUPLICATE\r\n : '.DUPLICATE'\r\n \"\r\n (click)=\"copyPortlet(item)\"\r\n >\r\n <img\r\n src=\"../../assets/img/dashboard_icon/menu-duplicate.svg\"\r\n />\r\n </li>\r\n <li\r\n *ngIf=\"customized && rs.hasPermission('DELETE')\"\r\n [matTooltip]=\"\r\n translation.DELETE ? translation.DELETE : '.DELETE'\r\n \"\r\n (click)=\"delete(item)\"\r\n >\r\n <img\r\n src=\"../../assets/img/dashboard_icon/gadget-delete.svg\"\r\n />\r\n </li>\r\n <li\r\n *ngIf=\"getPortletType(item) !== 'transpose'\"\r\n [matTooltip]=\"\r\n translation.DOWNLOAD ? translation.DOWNLOAD : '.DOWNLOAD'\r\n \"\r\n >\r\n <img\r\n src=\"../../assets/img/dashboard_icon/menu-download.svg\"\r\n (click)=\"download(item)\"\r\n />\r\n </li>\r\n <li\r\n *ngIf=\"\r\n customized &&\r\n !['newcolumn', 'newline', 'newcolumnline'].includes(\r\n getPortletType(item)\r\n )\r\n \"\r\n [matTooltip]=\"\r\n translation.FILTER ? translation.FILTER : '.FILTER'\r\n \"\r\n >\r\n <img\r\n src=\"../../assets/img/dashboard_icon/gadget-filters.svg\"\r\n (click)=\"openFilter(item)\"\r\n />\r\n </li>\r\n\r\n <li\r\n #unclick\r\n *ngIf=\"customized && getPortletType(item) === 'pivot'\"\r\n style=\"margin-right: 18px\"\r\n >\r\n <img\r\n src=\"../../assets/img/dashboard_icon/gadget-basic-sub-total.svg\"\r\n (click)=\"openSubtotal(item)\"\r\n />\r\n <img\r\n src=\"../../assets/img/dashboard_icon/gadget-basic-arrow-down.svg\"\r\n (click)=\"openSubtotal(item)\"\r\n />\r\n </li>\r\n <div\r\n #unclick\r\n class=\"pivotTable-sub-grand-group\"\r\n *ngIf=\"\r\n showSubTotalGroup &&\r\n getPortletType(item) === 'pivot' &&\r\n Current_PortletId === item.newId\r\n \"\r\n >\r\n <ul>\r\n <li\r\n class=\"sub-grand-group\"\r\n [ngStyle]=\"{\r\n 'background-color': subtotal.selected\r\n ? '#f8fafb'\r\n : '#fff'\r\n }\"\r\n *ngFor=\"\r\n let subtotal of pivotTableSubTotalList;\r\n let idx = index\r\n \"\r\n (click)=\"selectTotalGroup(idx, 'sub', item)\"\r\n >\r\n <div style=\"display: flex\">\r\n <div\r\n style=\"\r\n height: 33px;\r\n width: 34px;\r\n text-align: center;\r\n \"\r\n >\r\n <img\r\n *ngIf=\"subtotal.selected\"\r\n src=\"../../assets/img/dashboard_icon/forms-checkbox-square-tick.svg\"\r\n />\r\n </div>\r\n <span>{{ subtotal.value }}</span>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n <li\r\n #unclickGrand\r\n *ngIf=\"\r\n customized &&\r\n (getPortletType(item) === 'pivot' ||\r\n getPortletType(item) === 'table')\r\n \"\r\n style=\"margin-right: 18px\"\r\n >\r\n <img\r\n src=\"../../assets/img/dashboard_icon/gadget-basic-total.svg\"\r\n (click)=\"openGrandtotal(item)\"\r\n />\r\n <img\r\n src=\"../../assets/img/dashboard_icon/gadget-basic-arrow-down.svg\"\r\n (click)=\"openGrandtotal(item)\"\r\n />\r\n </li>\r\n <div\r\n #unclickGrand\r\n class=\"pivotTable-sub-grand-group\"\r\n style=\"left: 230px\"\r\n *ngIf=\"\r\n showgrandTotalGroup &&\r\n getPortletType(item) === 'pivot' &&\r\n Current_PortletId === item.newId\r\n \"\r\n >\r\n <ul>\r\n <li\r\n class=\"sub-grand-group\"\r\n [ngStyle]=\"{\r\n 'background-color': grandtotal.selected\r\n ? '#f8fafb'\r\n : '#fff'\r\n }\"\r\n *ngFor=\"\r\n let grandtotal of pivotTableGrandTotalList;\r\n let idx = index\r\n \"\r\n (click)=\"selectTotalGroup(idx, 'grand', item)\"\r\n >\r\n <div style=\"display: flex\">\r\n <div\r\n style=\"\r\n height: 33px;\r\n width: 34px;\r\n text-align: center;\r\n \"\r\n >\r\n <img\r\n *ngIf=\"grandtotal.selected\"\r\n src=\"../../assets/img/dashboard_icon/forms-checkbox-square-tick.svg\"\r\n />\r\n </div>\r\n <span>{{ grandtotal.value }}</span>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n <div\r\n #unclickGrand\r\n class=\"pivotTable-sub-grand-group\"\r\n style=\"left: 210px; height: 76px\"\r\n *ngIf=\"\r\n showTableGrandTotalGroup &&\r\n getPortletType(item) === 'table' &&\r\n Current_PortletId === item.newId\r\n \"\r\n >\r\n <ul>\r\n <li\r\n class=\"sub-grand-group\"\r\n [ngStyle]=\"{\r\n 'background-color': grandtotal.selected\r\n ? '#f8fafb'\r\n : '#fff'\r\n }\"\r\n *ngFor=\"\r\n let grandtotal of tableGrandTotalList;\r\n let idx = index\r\n \"\r\n (click)=\"selectTotalGroup(idx, 'tableGrand', item)\"\r\n >\r\n <div style=\"display: flex\">\r\n <div\r\n style=\"\r\n height: 33px;\r\n width: 34px;\r\n text-align: center;\r\n \"\r\n >\r\n <img\r\n *ngIf=\"grandtotal.selected\"\r\n src=\"../../assets/img/dashboard_icon/forms-checkbox-square-tick.svg\"\r\n />\r\n </div>\r\n <span>{{ grandtotal.value }}</span>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n <li\r\n *ngIf=\"\r\n customized &&\r\n !['newcolumn', 'newline', 'newcolumnline'].includes(\r\n getPortletType(item)\r\n )\r\n \"\r\n [matTooltip]=\"\r\n translation.FORMAT ? translation.FORMAT : '.FORMAT'\r\n \"\r\n >\r\n <img\r\n src=\"../../assets/img/dashboard_icon/gadget-basic-format.svg\"\r\n (click)=\"fieldFormat(item)\"\r\n />\r\n </li>\r\n <li\r\n *ngIf=\"\r\n (customized || url_type === 'sharedbeta') &&\r\n !['newcolumn', 'newline', 'newcolumnline'].includes(\r\n getPortletType(item)\r\n )\r\n \"\r\n [matTooltip]=\"\r\n translation.CONFIGURATIONS || '.CONFIGURATIONS'\r\n \"\r\n (click)=\"configurations(item, $event)\"\r\n >\r\n <img\r\n src=\"../../assets/img/dashboard_icon/gadget-settings.svg\"\r\n />\r\n </li>\r\n <li\r\n *ngIf=\"customized\"\r\n [matTooltip]=\"translation.EDIT ? translation.EDIT : '.EDIT'\"\r\n (click)=\"edit(item)\"\r\n >\r\n <img\r\n src=\"../../assets/img/dashboard_icon/gadget-edit.svg\"\r\n />\r\n </li>\r\n </ul>\r\n </div>\r\n </ng-template>\r\n <ng-template #content>\r\n <rs-gadget-table\r\n #table\r\n *ngIf=\"getPortletType(item) == 'table'\"\r\n [portlets]=\"portlets\"\r\n [dashboard]=\"dashboard\"\r\n [portlet]=\"item\"\r\n >\r\n </rs-gadget-table>\r\n <rs-gadget-pivot\r\n #pivot\r\n *ngIf=\"getPortletType(item) == 'pivot'\"\r\n [portlet]=\"item\"\r\n [dashboard]=\"dashboard\"\r\n [portlets]=\"portlets\"\r\n [themeColor]=\"item.themeColor\"\r\n >\r\n </rs-gadget-pivot>\r\n <rs-gadget-pivot-chart\r\n #pivot\r\n *ngIf=\"getPortletType(item) == 'newchart'\"\r\n [portlet]=\"item\"\r\n [dashboard]=\"dashboard\"\r\n (updatePorletConfig)=\"updatePorletConfig($event)\"\r\n [portlets]=\"portlets\"\r\n [themeColor]=\"item.themeColor\"\r\n >\r\n </rs-gadget-pivot-chart>\r\n <rs-gadget-transpose\r\n #transpose\r\n *ngIf=\"getPortletType(item) == 'transpose'\"\r\n [portlets]=\"portlets\"\r\n [dashboard]=\"dashboard\"\r\n [portlet]=\"item\"\r\n >\r\n </rs-gadget-transpose>\r\n <rs-bar-charts\r\n *ngIf=\"\r\n ['newcolumn', 'newline', 'newcolumnline'].includes(\r\n getPortletType(item)\r\n )\r\n \"\r\n #newChart\r\n [dashboard]=\"dashboard\"\r\n [dataColumn]=\"item.dataColumn\"\r\n [dataLine]=\"item.dataLine\"\r\n [columnType]=\"item.columnType\"\r\n [lineType]=\"item.lineType\"\r\n [themeColor]=\"item.themeColor\"\r\n [portlet]=\"item\"\r\n ></rs-bar-charts>\r\n </ng-template>\r\n </e-panel>\r\n </e-panels>\r\n </ejs-dashboardlayout>\r\n </div>\r\n </div>\r\n <rs-empty-icon-prompt\r\n [displayCode]=\"'customize'\"\r\n [dashboard]=\"dashboard\"\r\n hidden\r\n >\r\n </rs-empty-icon-prompt>\r\n <div\r\n id=\"kt-dashboard-tabs\"\r\n class=\"dashboard-tab-list\"\r\n cdkDropList\r\n cdkDropListOrientation=\"horizontal\"\r\n (cdkDropListDropped)=\"drop($event)\"\r\n >\r\n <div\r\n class=\"tab-item\"\r\n *ngFor=\"let item of tabList; let i = index\"\r\n [ngClass]=\"{\r\n active: item.id === activeTab,\r\n prev: prevId === item.id && i !== tabList.length - 1\r\n }\"\r\n (click)=\"onActiveTab(item, i)\"\r\n (dblclick)=\"onStartEdit(item.id)\"\r\n cdkDrag\r\n >\r\n <div\r\n *ngIf=\"!startEdit || item.id !== activeTab\"\r\n [matTooltip]=\"\r\n item.label === item.displayLabel ? null : item.displayLabel\r\n \"\r\n >\r\n {{ item.displayLabel }}\r\n <img\r\n *ngIf=\"tabList.length > 1\"\r\n src=\"../../assets/img/dashboard_icon/dashboard-tab-delete.svg\"\r\n alt=\"\"\r\n (click)=\"onDeleteTab(item)\"\r\n />\r\n </div>\r\n <input\r\n *ngIf=\"startEdit && item.id === activeTab\"\r\n type=\"text\"\r\n [(ngModel)]=\"item.label\"\r\n (input)=\"setTabInput($event)\"\r\n (blur)=\"saveTabInput(item)\"\r\n />\r\n </div>\r\n <img\r\n class=\"add-tab-icon\"\r\n src=\"../../assets/img/dashboard_icon/add-tab.svg\"\r\n (click)=\"onAddTab()\"\r\n />\r\n </div>\r\n</div>\r\n\r\n<div class=\"sidebar\" [ngClass]=\"{ gone: !push_btn }\" *ngIf=\"dashboard_sidebar\">\r\n <span class=\"push-btn\" (click)=\"pushSlider()\" [class.left-place]=\"!push_btn\">\r\n <span\r\n class=\"sidebar-btn\"\r\n *ngIf=\"push_btn\"\r\n [inlineSVG]=\"'../../assets/img/dashboard_icon/Angle-double-right.svg'\"\r\n ></span>\r\n <span\r\n class=\"sidebar-btn\"\r\n *ngIf=\"!push_btn\"\r\n [inlineSVG]=\"'../../assets/img/dashboard_icon/Angle-double-left.svg'\"\r\n ></span>\r\n </span>\r\n <rs-sidebar-iconlist-new\r\n #sidebar\r\n *ngIf=\"push_btn\"\r\n [dashboard_sidebar]=\"dashboard_sidebar\"\r\n [dashboard]=\"dashboard\"\r\n [dashboardId]=\"url_id\"\r\n [portlet]=\"portlet\"\r\n [portlets]=\"portlets\"\r\n [activeTabId]=\"activeTabId\"\r\n [activeTabLabel]=\"activeTabLabel\"\r\n [figureCode]=\"figureCode\"\r\n [tabactive]=\"tabactive\"\r\n [_selectedY]=\"selectedY\"\r\n [_selectedSecondY]=\"selectedSecondY\"\r\n [_selectedX]=\"selectedX\"\r\n [_selectedMultiples]=\"selectedMultiples\"\r\n [_selectTheme]=\"selectTheme\"\r\n [appCode]=\"appCode\"\r\n (updatePorlet)=\"updatePorlet($event)\"\r\n (chartUpdate)=\"chartUpdate($event)\"\r\n (closeSidebar)=\"closeSidebar($event)\"\r\n (updatePushBtn)=\"updatePushBtn($event)\"\r\n (updateTheme)=\"updateTheme($event)\"\r\n (updatePorletConfig)=\"updatePorletConfig($event)\"\r\n (onToggleTabactive)=\"onToggleTabactive($event)\"\r\n >\r\n </rs-sidebar-iconlist-new>\r\n</div>\r\n<button\r\n class=\"addPorlet\"\r\n *ngIf=\"customized && !push_btn\"\r\n mat-mini-fab\r\n color=\"primary\"\r\n (click)=\"addPorlet()\"\r\n>\r\n +\r\n</button>\r\n", styles: ["@charset \"UTF-8\";.kt-portlet.kt-portlet--mobile.kt-portlet--sortable{position:relative;overflow-x:auto;overflow-y:hidden;height:100%!important}.kt-portlet .kt-portlet__body{height:100%;overflow:hidden;padding:0 0 30px!important}.pane{margin-bottom:30px}i.la.la-compress{font-size:20px!important}.dropdown-menu.dropdown-menu-right.dropdown-menu-md.dropdown-menu-fit{z-index:102}h3.kt-portlet__head-title{font-size:18px!important;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}::ng-deep .date-portlet .mat-form-field-wrapper{width:100px;margin-left:15px}.table-none-padding{padding:0}.kt-portlet__head-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.btn-bordered{height:30px;width:40px;border-radius:5px;border:1px #6c757d solid;color:#44566c;padding:0}.btn-bordered.date{padding-top:4px;padding-left:8px;width:160px;font-size:15px}.btn-bordered .mat-datepicker-toggle{color:#00000080}.btn-bordered svg.mat-datepicker-toggle-default-icon.ng-star-inserted{width:20px!important}:host::ng-deep button.mat-icon-button.mat-button-base{transform:translateY(-10px)!important}gridster.scrollVertical{width:auto!important;background:#f2f2f8!important;padding-left:2px!important}.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col,.col-auto,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm,.col-sm-auto,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md,.col-md-auto,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg,.col-lg-auto,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl,.col-xl-auto{padding-right:15px!important;padding-left:15px!important}.kt-portlet__head-group.show{position:relative!important}.dropdown-menu.dropdown-menu-right.dropdown-menu-md.dropdown-menu-fit.show{top:48px!important;left:-230px!important;transform:none!important}span.top-date{font-family:Arial;font-size:15px;color:#6c757d}svg.bi.bi-arrows-angle-contract{color:#a2a5b9;margin-right:10px}li.full-svg:hover svg.bi.bi-arrows-angle-contract{color:#0081ff}.pdf-size{width:666px;height:999px}.portlets-description{padding:12px 8px 12px 20px;display:flex;flex-flow:column;gap:12px}.portlets-description h4,.portlets-description p{margin:0;color:#44566c;font-family:Arial;font-size:11px!important;font-style:normal;font-weight:400;line-height:14px}.edit-portlet{border:2px solid #0181ff;border-radius:10px}.kt-form__path{margin-bottom:23px;font-size:13px}.kt-form__path .lastspan,.kt-form__path .fa-angle-right{color:#8697a8}::ng-deep rs-dashboard{height:100%;display:flex;flex-direction:column;position:relative}::ng-deep rs-dashboard .panes-list{width:100%!important;margin-bottom:70px!important}::ng-deep rs-dashboard .panes-list .kt-portlet{border-radius:5px;border-top:10px solid #fff}::ng-deep rs-dashboard button.addPorlet{font-size:32px;position:fixed;bottom:100px;right:20px;z-index:1003;background-color:#0081ff!important}::ng-deep rs-dashboard .sidebar{right:0;top:0;bottom:0;position:absolute;z-index:1000;width:400px;background:#fff!important;transition:width .3s}::ng-deep rs-dashboard .sidebar .push-btn{position:absolute;left:0;top:0;z-index:1}::ng-deep rs-dashboard .sidebar.gone{width:0}::ng-deep rs-dashboard .sidebar .sidebar-btn svg g polygon{fill-opacity:0}::ng-deep rs-dashboard .sidebar .sidebar-btn:hover svg g path{fill:#0081ff;transition:fill .3s ease}.panes-list{height:100%;width:100%;margin:0!important;overflow:auto;padding-bottom:50px;background:#f2f2f8}.panes-list ::ng-deep .e-panel{border-radius:10px;overflow:auto}.panes-list ::ng-deep .e-panel .e-panel-container{min-width:340px;min-height:340px}.panes-list-dashboard{top:-20px!important}.panes-list-desktop{left:-25px!important;top:-36px!important}:host ::ng-deep .e-panel-header{padding:0!important;height:auto!important;border:0!important}.gadgetBar{height:24px;background-color:#fff!important}.gadgetBar .pane-gadget-container{padding:0 12px}.gadgetBar .pivotTable-sub-grand-group ul{width:100%;display:block}.gadgetBar .pivotTable-sub-grand-group ul li{width:24px;height:24px;display:flex;align-items:center;cursor:pointer;padding:4px}.gadgetBar ul{margin:0;padding:0;list-style:none;display:flex;width:100%;gap:12px}.gadgetBar ul li{width:24px;height:24px;display:flex;align-items:center;cursor:pointer;padding:4px}.gadget-title{height:36px;padding:10px 12px 8px;color:#43566c;font-family:Arial;font-size:15px;font-weight:700;line-height:18px}.pivotTable-sub-grand-group{width:241px;height:142px;z-index:999;position:absolute;left:180px;top:80px;border-radius:10px;border:solid 1px #eaedf0;background-color:#fff}.sub-grand-group{width:100%!important;display:block!important;height:33px!important;margin:0!important;line-height:33px!important;text-align:left!important}.sub-grand-group span{font-family:Arial;font-size:14px;color:#44566c;font-weight:400}.sub-grand-group:hover{background-color:#f8fafb!important}::ng-deep .e-pivotfieldlist-container .e-field-list-container .e-field-table .e-field-list-tree-outer-div{height:278px!important}.content-portlets{height:100%;position:relative;overflow:hidden}.content-portlets .dashboard-tab-list{position:absolute;bottom:0;left:0;z-index:1000;width:100%;border-top:1px solid #dbe1e7;border-bottom:1px solid #dbe1e7;background:#f8fafb;box-shadow:0 -1px 4px #0000000d;display:flex;align-items:center;height:28px}.content-portlets .dashboard-tab-list img{margin-left:10px;cursor:pointer}.content-portlets .dashboard-tab-list .tab-item{cursor:pointer;padding-bottom:4px;border-left:0;color:#43566c}.content-portlets .dashboard-tab-list .tab-item:hover img{display:block!important}.content-portlets .dashboard-tab-list .tab-item div{border-right:1px solid #d0d6dd;border-left:1px solid transparent;border-bottom:1px solid transparent;font-size:11px;line-height:16px;min-height:16px;padding:5px 12px 2px;display:flex;width:114px;align-items:center;justify-content:space-between;gap:6px}.content-portlets .dashboard-tab-list .tab-item div img{display:none;cursor:pointer;margin-left:0}.content-portlets .dashboard-tab-list .tab-item:first-child div{border-left:1px solid #d0d6dd}.content-portlets .dashboard-tab-list .tab-item:first-child.active div{border-right:1px solid #d6dce2}.content-portlets .dashboard-tab-list .tab-item.active div{background-color:#fff;border-bottom-color:#d6dce2;font-weight:700;border-radius:0 0 6px 6px;border-left-color:#d6dce2}.content-portlets .dashboard-tab-list .tab-item.prev div{border-right-color:transparent}.content-portlets .dashboard-tab-list .tab-item input{border:none;text-shadow:none;border-bottom:1px solid #43566c;outline:none;height:16px;width:150px;font-size:11px!important}::ng-deep .mat-menu-content .options{padding:4px 0}::ng-deep .mat-menu-content .options .option-item{padding:4px 8px;font-size:13px;cursor:pointer}::ng-deep .mat-menu-content .options .option-item:hover{background:#0000000d}::ng-deep .mat-menu-content .options .option-checkbox{padding:8px}::ng-deep .mat-menu-content .options .option-checkbox.first{border-top:1px solid rgba(0,0,0,.1)}::ng-deep .mat-menu-content .options .option-checkbox .e-icons{height:18px;width:18px}::ng-deep .mat-menu-content .options .option-checkbox .e-icons:before{font-size:12px}::ng-deep #vegetables_popup{width:400px!important}#kt-dashboard-container{display:flex;flex-flow:column nowrap}#kt-dashboard-tabs{flex:none;position:static;height:30px;padding:0 20px;display:flex;flex-flow:row nowrap;align-items:flex-start}#kt-dashboard-tabs .tab-item.active>div{padding-bottom:4px}#kt-dashboard-tabs .tab-item>div{color:#1f3f5c;font-family:Arial;font-size:11px;font-style:normal;font-weight:400;line-height:14px}#kt-dashboard-tabs .add-tab-icon{width:16px;height:16px;margin:5px 12px auto}#kt-dashboard-layout{flex:auto;height:0;padding:20px;background-color:#44566c1a}.left-place{left:-24px!important}\n"] }]
|
|
1978
|
+
}], ctorParameters: function () { return [{ type: i1.MatDialog }, { type: i2.DialogService }, { type: i3.DashboardService }, { type: i4.ApiList }, { type: i5.ActivatedRoute }, { type: i6.DashboardPorletsService }, { type: i0.ChangeDetectorRef }, { type: i5.Router }, { type: i7.HttpClient }, { type: i8.DatePipe }, { type: undefined, decorators: [{
|
|
1979
|
+
type: Optional
|
|
1980
|
+
}, {
|
|
1981
|
+
type: Inject,
|
|
1982
|
+
args: [PBF_TOKEN]
|
|
1983
|
+
}] }, { type: undefined, decorators: [{
|
|
1984
|
+
type: Optional
|
|
1985
|
+
}, {
|
|
1986
|
+
type: Inject,
|
|
1987
|
+
args: [API_SERVICE_TOKEN]
|
|
1988
|
+
}] }, { type: undefined, decorators: [{
|
|
1989
|
+
type: Optional
|
|
1990
|
+
}, {
|
|
1991
|
+
type: Inject,
|
|
1992
|
+
args: [ROLE_SERVICE_TOKEN]
|
|
1993
|
+
}] }]; }, propDecorators: { dateChange: [{
|
|
1994
|
+
type: Output
|
|
1995
|
+
}], appCode: [{
|
|
1996
|
+
type: Input
|
|
1997
|
+
}], sidebar: [{
|
|
1998
|
+
type: ViewChild,
|
|
1999
|
+
args: ["sidebar", { static: false }]
|
|
2000
|
+
}], unclick: [{
|
|
2001
|
+
type: ViewChildren,
|
|
2002
|
+
args: ["unclick"]
|
|
2003
|
+
}], unclickGrand: [{
|
|
2004
|
+
type: ViewChildren,
|
|
2005
|
+
args: ["unclickGrand"]
|
|
2006
|
+
}], newChart: [{
|
|
2007
|
+
type: ViewChildren,
|
|
2008
|
+
args: ["newChart"]
|
|
2009
|
+
}], bodyClick: [{
|
|
2010
|
+
type: HostListener,
|
|
2011
|
+
args: ["document:click", ["$event"]]
|
|
2012
|
+
}], dashboardLayout: [{
|
|
2013
|
+
type: ViewChild,
|
|
2014
|
+
args: ["defaultLayout", { static: false }]
|
|
2015
|
+
}], canvas: [{
|
|
2016
|
+
type: ViewChild,
|
|
2017
|
+
args: ["canvas", { static: true }]
|
|
2018
|
+
}], table: [{
|
|
2019
|
+
type: ViewChildren,
|
|
2020
|
+
args: ["table"]
|
|
2021
|
+
}], pivot: [{
|
|
2022
|
+
type: ViewChildren,
|
|
2023
|
+
args: ["pivot"]
|
|
2024
|
+
}], transpose: [{
|
|
2025
|
+
type: ViewChildren,
|
|
2026
|
+
args: ["transpose"]
|
|
2027
|
+
}], panesList: [{
|
|
2028
|
+
type: ViewChild,
|
|
2029
|
+
args: ["panesList", { static: true }]
|
|
2030
|
+
}], filterData: [], GetgadgetTitle: [] } });
|
|
2031
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFuZS1ncm91cC1uZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmFpc2UtY29tbW9uLWxpYi9zcmMvbGliL2Rhc2hib2FyZC9wYW5lLWdyb3VwLW5ldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yYWlzZS1jb21tb24tbGliL3NyYy9saWIvZGFzaGJvYXJkL3BhbmUtZ3JvdXAtbmV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFNBQVMsRUFFVCxNQUFNLEVBR04sWUFBWSxFQUVaLFlBQVksRUFDWixLQUFLLEVBQ0wsUUFBUSxFQUNSLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQWtCLGFBQWEsRUFBVSxNQUFNLGlCQUFpQixDQUFDO0FBR3hFLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULGtCQUFrQixHQUNuQixNQUFNLDJCQUEyQixDQUFDO0FBR25DLE9BQU8sWUFBWSxNQUFNLGVBQWUsQ0FBQztBQUV6QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUV6QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQVk5RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4REFBOEQsQ0FBQztBQUVwRyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDOUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7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UyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQztTQUMvRDtRQUNEO1lBQ0UsRUFBRSxFQUFFLFNBQVM7WUFDYixLQUFLLEVBQUUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDO1NBQy9EO1FBQ0Q7WUFDRSxFQUFFLEVBQUUsU0FBUztZQUNiLEtBQUssRUFBRSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDO1NBQzFFO1FBQ0Q7WUFDRSxFQUFFLEVBQUUsU0FBUztZQUNiLEtBQUssRUFBRSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDO1NBQzFFO1FBQ0Q7WUFDRSxFQUFFLEVBQUUsU0FBUztZQUNiLEtBQUssRUFBRTtnQkFDTCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2FBQ1Y7U0FDRjtRQUNEO1lBQ0UsRUFBRSxFQUFFLFNBQVM7WUFDYixLQUFLLEVBQUU7Z0JBQ0wsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUzthQUNWO1NBQ0Y7UUFDRDtZQUNFLEVBQUUsRUFBRSxTQUFTO1lBQ2IsS0FBSyxFQUFFO2dCQUNMLFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUzthQUNWO1NBQ0Y7UUFDRDtZQUNFLEVBQUUsRUFBRSxTQUFTO1lBQ2IsS0FBSyxFQUFFO2dCQUNMLFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUzthQUNWO1NBQ0Y7UUFDRDtZQUNFLEVBQUUsRUFBRSxRQUFRO1lBQ1osS0FBSyxFQUFFO2dCQUNMLFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2FBQ1Y7U0FDRjtRQUNEO1lBQ0UsRUFBRSxFQUFFLFFBQVE7WUFDWixLQUFLLEVBQUU7Z0JBQ0wsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7YUFDVjtTQUNGO1FBQ0Q7WUFDRSxFQUFFLEVBQUUsUUFBUTtZQUNaLEtBQUssRUFBRTtnQkFDTCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUzthQUNWO1NBQ0Y7UUFDRDtZQUNFLEVBQUUsRUFBRSxRQUFRO1lBQ1osS0FBSyxFQUFFO2dCQUNMLFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2FBQ1Y7U0FDRjtRQUNEO1lBQ0UsRUFBRSxFQUFFLFFBQVE7WUFDWixLQUFLLEVBQUU7Z0JBQ0wsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7YUFDVjtTQUNGO1FBQ0Q7WUFDRSxFQUFFLEVBQUUsUUFBUTtZQUNaLEtBQUssRUFBRTtnQkFDTCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUztnQkFDVCxTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsU0FBUzthQUNWO1NBQ0Y7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d0NoaWxkLFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIE91dHB1dCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgRWxlbWVudFJlZixcclxuICBWaWV3Q2hpbGRyZW4sXHJcbiAgUXVlcnlMaXN0LFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbnB1dCxcclxuICBPcHRpb25hbCxcclxuICBJbmplY3QsXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2RpYWxvZ1wiO1xyXG5pbXBvcnQgeyBNYXREYXRlcGlja2VySW5wdXRFdmVudCB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyXCI7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBOYXZpZ2F0aW9uRW5kLCBSb3V0ZXIgfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcbmltcG9ydCB7IERhc2hib2FyZFNlcnZpY2UgfSBmcm9tIFwiLi9kYXNoYm9hcmQuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBBcGlMaXN0IH0gZnJvbSBcIi4vYXBpXCI7XHJcbmltcG9ydCB7XHJcbiAgQVBJX1NFUlZJQ0VfVE9LRU4sXHJcbiAgUEJGX1RPS0VOLFxyXG4gIFJPTEVfU0VSVklDRV9UT0tFTixcclxufSBmcm9tIFwiLi4vc2VydmljZS9JbmplY3Rpb25Ub2tlblwiO1xyXG5pbXBvcnQgeyBEYXNoYm9hcmRQb3JsZXRzU2VydmljZSB9IGZyb20gXCIuL2Rhc2hib2FyZFBvcmxldHMuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgQ2lyY3VsYXJKU09OIGZyb20gXCJjaXJjdWxhci1qc29uXCI7XHJcblxyXG5pbXBvcnQgeyBNQVRfREFURV9GT1JNQVRTIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2NvcmVcIjtcclxuaW1wb3J0IHsgY2xvbmVEZWVwLCBmaW5kIH0gZnJvbSBcImxvZGFzaFwiO1xyXG5pbXBvcnQgeyBEYXNoYm9hcmRMYXlvdXRDb21wb25lbnQgfSBmcm9tIFwiQHN5bmNmdXNpb24vZWoyLWFuZ3VsYXItbGF5b3V0c1wiO1xyXG5pbXBvcnQgeyBGaWVsZEZvcm1hdENvbXBvbmVudCB9IGZyb20gXCIuL3NpZGViYXItaWNvbmxpc3QvZmllbGQtZm9ybWF0L2ZpZWxkLWZvcm1hdC5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgR2FkZ2V0VGFibGVDb21wb25lbnQgfSBmcm9tIFwiLi9nYWRnZXQtZ3JvdXAvZ2FkZ2V0LXRhYmxlL2dhZGdldC10YWJsZS5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgR2FkZ2V0UGl2b3RDb21wb25lbnQgfSBmcm9tIFwiLi9nYWRnZXQtZ3JvdXAvZ2FkZ2V0LXBpdm90L2dhZGdldC1waXZvdC5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgR2FkZ2V0UGl2b3RDaGFydENvbXBvbmVudCB9IGZyb20gXCIuL2dhZGdldC1ncm91cC9nYWRnZXQtcGl2b3QtY2hhcnQvZ2FkZ2V0LXBpdm90LmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBHYWRnZXRUcmFuc3Bvc2VDb21wb25lbnQgfSBmcm9tIFwiLi9nYWRnZXQtZ3JvdXAvZ2FkZ2V0LXRyYW5zcG9zZS9nYWRnZXQtdHJhbnNwb3NlLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge1xyXG4gIC8vIFBkZkV4cG9ydFByb3BlcnRpZXMsXHJcbiAgRXhjZWxFeHBvcnRQcm9wZXJ0aWVzLFxyXG4gIENvbHVtbk1vZGVsLFxyXG59IGZyb20gXCJAc3luY2Z1c2lvbi9lajItYW5ndWxhci1ncmlkc1wiO1xyXG5pbXBvcnQgeyBJQXhpc1NldCB9IGZyb20gXCJAc3luY2Z1c2lvbi9lajItYW5ndWxhci1waXZvdHZpZXdcIjtcclxuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xyXG5pbXBvcnQgeyBEYXRhTWFydE5ld0NvbXBvbmVudCB9IGZyb20gXCIuL2Rhc2hib2FyZC1wcm9wZXJ0aWVzL2RhdGEtbWFydC1uZXcvZGF0YS1tYXJ0LW5ldy5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgQmFyQ2hhcnRzQ29tcG9uZW50IH0gZnJvbSBcIi4vYmFyLWNoYXJ0cy9iYXItY2hhcnRzLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBkZWJvdW5jZSB9IGZyb20gXCIuL2Jhci1jaGFydHMvdXRpbHNcIjtcclxuaW1wb3J0IHsgRGF0ZVBpcGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XHJcbmltcG9ydCB7IFBhbmVEb3dubG9hZENvbXBvbmVudCB9IGZyb20gXCIuL2RpYWxvZy1ncm91cC9kb3dubG9hZC9pbmRleC5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZS9kaWFsb2cuc2VydmljZVwiO1xyXG5cclxubGV0IGRhdGVGb3JtYXQgPSBcIkRELU1NLVlZWVlcIjtcclxuaWYgKGxvY2FsU3RvcmFnZVtcInNldHRpbmdcIl0pIHtcclxuICBjb25zdCBkYXRlQXJyYXkgPSBmaW5kKFxyXG4gICAgSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInNldHRpbmdcIikgfHwgXCJ7fVwiKSxcclxuICAgIChpdGVtKSA9PiBpdGVtICYmIGl0ZW1bXCJwYXJhbWV0ZXJcIl0gPT09IFwiREFURV9GT1JNQVRcIlxyXG4gICk7XHJcbiAgaWYgKGRhdGVBcnJheSkge1xyXG4gICAgZGF0ZUZvcm1hdCA9IGRhdGVBcnJheS52YWx1ZTtcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IE1ZX0ZPUk1BVFMgPSB7XHJcbiAgcGFyc2U6IHtcclxuICAgIGRhdGVJbnB1dDogXCJERC1NTS1ZWVlZXCIsXHJcbiAgfSxcclxuICBkaXNwbGF5OiB7XHJcbiAgICBkYXRlSW5wdXQ6IGRhdGVGb3JtYXQsXHJcbiAgICBtb250aFllYXJMYWJlbDogXCJZWVlZXCIsXHJcbiAgICBkYXRlQTExeUxhYmVsOiBcIkxMXCIsXHJcbiAgICBtb250aFllYXJBMTF5TGFiZWw6IFwiWVlZWVwiLFxyXG4gIH0sXHJcbn07XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJycy1kYXNoYm9hcmRcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL3BhbmUtZ3JvdXAtbmV3LmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmxzOiBbXCIuL3BhbmUtZ3JvdXAtbmV3LmNvbXBvbmVudC5zY3NzXCJdLFxyXG4gIC8vIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIHByb3ZpZGVyczogW0RhdGVQaXBlLCB7IHByb3ZpZGU6IE1BVF9EQVRFX0ZPUk1BVFMsIHVzZVZhbHVlOiBNWV9GT1JNQVRTIH1dLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgUGFuZUdyb3VwTmV3Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBAT3V0cHV0KCkgZGF0ZUNoYW5nZTogRXZlbnRFbWl0dGVyPE1hdERhdGVwaWNrZXJJbnB1dEV2ZW50PGFueT4+O1xyXG4gIEBJbnB1dCgpIGFwcENvZGUgPSBcIlBNU1wiO1xyXG4gIEBWaWV3Q2hpbGQoXCJzaWRlYmFyXCIsIHsgc3RhdGljOiBmYWxzZSB9KSBzaWRlYmFyOiBhbnk7XHJcbiAgQFZpZXdDaGlsZHJlbihcInVuY2xpY2tcIikgdW5jbGljazogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xyXG4gIEBWaWV3Q2hpbGRyZW4oXCJ1bmNsaWNrR3JhbmRcIikgdW5jbGlja0dyYW5kOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XHJcbiAgQFZpZXdDaGlsZHJlbihcIm5ld0NoYXJ0XCIpIG5ld0NoYXJ0OiBRdWVyeUxpc3Q8QmFyQ2hhcnRzQ29tcG9uZW50PjtcclxuICBwb3J0bGV0O1xyXG4gIHRhYmFjdGl2ZTogYm9vbGVhbjtcclxuICBkYXNoYm9hcmQ7XHJcbiAgc2VsZWN0ZWRZID0gW107XHJcbiAgc2VsZWN0ZWRTZWNvbmRZID0gW107XHJcbiAgc2VsZWN0ZWRYID0gW107XHJcbiAgc2VsZWN0ZWRNdWx0aXBsZXM6IGFueTtcclxuICBzZWxlY3RUaGVtZTogYW55O1xyXG4gIGhhc0luaXQgPSB0cnVlO1xyXG4gIGFjdGl2ZVRhYklkOiBhbnk7XHJcbiAgaGFzQ2hhbmdlRGF0YVRhYmxlID0gZmFsc2U7XHJcbiAgYWN0aXZlVGFiTGFiZWwgPSBcIlwiO1xyXG4gIHN0YXlBY3RpdmVUYWI6IGJvb2xlYW47XHJcbiAgQEhvc3RMaXN0ZW5lcihcImRvY3VtZW50OmNsaWNrXCIsIFtcIiRldmVudFwiXSkgYm9keUNsaWNrKGUpIHtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy51bmNsaWNrICYmXHJcbiAgICAgIHRoaXMudW5jbGljay5maXJzdCAmJlxyXG4gICAgICBlLnRhcmdldC50YWdOYW1lICE9PSBcIklNR1wiICYmXHJcbiAgICAgICF0aGlzLnVuY2xpY2suZmlyc3QubmF0aXZlRWxlbWVudC5jb250YWlucyhlLnRhcmdldClcclxuICAgICkge1xyXG4gICAgICB0aGlzLnNob3dTdWJUb3RhbEdyb3VwID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLnVuY2xpY2tHcmFuZC5maXJzdCAmJlxyXG4gICAgICBlLnRhcmdldC50YWdOYW1lICE9PSBcIklNR1wiICYmXHJcbiAgICAgICF0aGlzLnVuY2xpY2tHcmFuZC5maXJzdC5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGUudGFyZ2V0KVxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuc2hvd2dyYW5kVG90YWxHcm91cCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnNob3dUYWJsZUdyYW5kVG90YWxHcm91cCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuICBwdWJsaWMgdHJhbnNsYXRpb24gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwidHJhbnNsYXRpb25cIikgfHwgXCJ7fVwiKTtcclxuICBwcml2YXRlIGxhbmc7XHJcbiAgcHVzaF9idG4gPSBmYWxzZTtcclxuICBAVmlld0NoaWxkKFwiZGVmYXVsdExheW91dFwiLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICBkYXNoYm9hcmRMYXlvdXQ6IERhc2hib2FyZExheW91dENvbXBvbmVudDtcclxuICBAVmlld0NoaWxkKFwiY2FudmFzXCIsIHsgc3RhdGljOiB0cnVlIH0pIGNhbnZhczogRWxlbWVudFJlZjtcclxuICBwcml2YXRlIGNvbmZpZztcclxuICBwdWJsaWMgZHJhZ2dhYmxlSGFuZGxlOiBzdHJpbmcgPSBcIi5nYWRnZXQtdGl0bGVcIjtcclxuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XHJcbiAgcHVibGljIHVybDtcclxuICBwdWJsaWMgdXJsX2lkO1xyXG4gIHB1YmxpYyB1cmxfdHlwZTtcclxuICAvLyBwcml2YXRlIGltZztcclxuICBwdWJsaWMgZGF0ZVBpcGVGb3JtYXQ7XHJcbiAgcHVibGljIGhhdmVGdWxsU2NyZWVuID0gW107XHJcbiAgLy8gcHJpdmF0ZSBjbGllbnRIZWlnaHRfO1xyXG4gIHB1YmxpYyBjZWxsU3BhY2luZzogbnVtYmVyW10gPSBbMjAsIDIwXTtcclxuICBwdWJsaWMgY2VsbEFzcGVjdFJhdGlvO1xyXG4gIHB1YmxpYyByZXNpemFibGVIYW5kbGVzO1xyXG4gIG5ld1Bvc2l0aW9uID0gW107XHJcblxyXG4gIHB1YmxpYyBtZWRpYVF1ZXJ5O1xyXG4gIGZpZ3VyZUNvZGU7XHJcbiAgY3VzdG9taXplZCA9IGZhbHNlO1xyXG4gIHB1YmxpYyBjaGFydFR5cGVMaXN0ID0gW1wiQ29sdW1uXCIsIFwiQmFyXCIsIFwiTGluZVwiLCBcIkFyZWFcIiwgXCJTY2F0dGVyXCIsIFwiUG9sYXJcIl07XHJcbiAgQFZpZXdDaGlsZHJlbihcInRhYmxlXCIpXHJcbiAgcHVibGljIHRhYmxlOiBRdWVyeUxpc3Q8R2FkZ2V0VGFibGVDb21wb25lbnQ+O1xyXG4gIEBWaWV3Q2hpbGRyZW4oXCJwaXZvdFwiKVxyXG4gIHB1YmxpYyBwaXZvdDogUXVlcnlMaXN0PEdhZGdldFBpdm90Q29tcG9uZW50IHwgR2FkZ2V0UGl2b3RDaGFydENvbXBvbmVudD47XHJcbiAgQFZpZXdDaGlsZHJlbihcInRyYW5zcG9zZVwiKVxyXG4gIHB1YmxpYyB0cmFuc3Bvc2U6IFF1ZXJ5TGlzdDxHYWRnZXRUcmFuc3Bvc2VDb21wb25lbnQ+O1xyXG4gIHB1YmxpYyBwaXZvdFRhYmxlU3ViVG90YWxMaXN0OiBBcnJheTxhbnk+ID0gW1xyXG4gICAge1xyXG4gICAgICBzZWxlY3RlZDogZmFsc2UsXHJcbiAgICAgIHZhbHVlOiB0aGlzLnRyYW5zbGF0aW9uLlNIT1dfU1VCX1RPVEFMUyB8fCBcIlNob3cgc3ViIHRvdGFsc1wiLFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgc2VsZWN0ZWQ6IGZhbHNlLFxyXG4gICAgICB2YWx1ZTogdGhpcy50cmFuc2xhdGlvbi5ISURFX1NVQl9UT1RBTFMgfHwgXCJIaWRlIHN1YiB0b3RhbHNcIixcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHNlbGVjdGVkOiBmYWxzZSxcclxuICAgICAgdmFsdWU6XHJcbiAgICAgICAgdGhpcy50cmFuc2xhdGlvbi5TSE9XX1NVQl9UT1RBTFNfUk9XU19PTkxZIHx8XHJcbiAgICAgICAgXCJTaG93IHN1YiB0b3RhbHMgcm93cyBvbmx5XCIsXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBzZWxlY3RlZDogZmFsc2UsXHJcbiAgICAgIHZhbHVlOlxyXG4gICAgICAgIHRoaXMudHJhbnNsYXRpb24uU0hPV19TVUJfVE9UQUxTX0NPTFVNTlNfT05MWSB8fFxyXG4gICAgICAgIFwiU2hvdyBzdWIgdG90YWxzIGNvbHVtbnMgb25seVwiLFxyXG4gICAgfSxcclxuICBdO1xyXG4gIHB1YmxpYyBwaXZvdFRhYmxlR3JhbmRUb3RhbExpc3Q6IEFycmF5PGFueT4gPSBbXHJcbiAgICB7XHJcbiAgICAgIHNlbGVjdGVkOiBmYWxzZSxcclxuICAgICAgdmFsdWU6IHRoaXMudHJhbnNsYXRpb24uU0hPV19HUkFORF9UT1RBTFMgfHwgXCJTaG93IGdyYW5kIHRvdGFsc1wiLFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgc2VsZWN0ZWQ6IGZhbHNlLFxyXG4gICAgICB2YWx1ZTogdGhpcy50cmFuc2xhdGlvbi5ISURFX0dSQU5EX1RPVEFMUyB8fCBcIkhpZGUgZ3JhbmQgdG90YWxzXCIsXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBzZWxlY3RlZDogZmFsc2UsXHJcbiAgICAgIHZhbHVlOlxyXG4gICAgICAgIHRoaXMudHJhbnNsYXRpb24uU0hPV19HUkFORF9UT1RBTFNfUk9XU19PTkxZIHx8XHJcbiAgICAgICAgXCJTaG93IGdyYW5kIHRvdGFscyByb3dzIG9ubHlcIixcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHNlbGVjdGVkOiBmYWxzZSxcclxuICAgICAgdmFsdWU6XHJcbiAgICAgICAgdGhpcy50cmFuc2xhdGlvbi5TSE9XX0dSQU5EX1RPVEFMU19DT0xVTU5TX09OTFkgfHxcclxuICAgICAgICBcIlNob3cgZ3JhbmQgdG90YWxzIGNvbHVtbnMgb25seVwiLFxyXG4gICAgfSxcclxuICBdO1xyXG4gIHB1YmxpYyB0YWJsZUdyYW5kVG90YWxMaXN0OiBBcnJheTxhbnk+ID0gW1xyXG4gICAge1xyXG4gICAgICBzZWxlY3RlZDogZmFsc2UsXHJcbiAgICAgIHZhbHVlOiB0aGlzLnRyYW5zbGF0aW9uLlNIT1dfR1JBTkRfVE9UQUxTIHx8IFwiU2hvdyBncmFuZCB0b3RhbHNcIixcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHNlbGVjdGVkOiBmYWxzZSxcclxuICAgICAgdmFsdWU6IHRoaXMudHJhbnNsYXRpb24uSElERV9HUkFORF9UT1RBTFMgfHwgXCJIaWRlIGdyYW5kIHRvdGFsc1wiLFxyXG4gICAgfSxcclxuICBdO1xyXG5cclxuICB0aGVtZURhdGE6IGFueSA9IFtcclxuICAgIHtcclxuICAgICAgaWQ6IFwidGhlbWUxM1wiLFxyXG4gICAgICB2YWx1ZTogW1wiIzFDMzQ4NFwiLCBcIiMzNUI5RkNcIl0sXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBpZDogXCJ0aGVtZTE0XCIsXHJcbiAgICAgIHZhbHVlOiBbXCIjMDQ1NzhGXCIsIFwiIzNFQkJDRVwiXSxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGlkOiBcInRoZW1lMTVcIixcclxuICAgICAgdmFsdWU6IFtcIiMxQzM0ODRcIiwgXCIjMTM2QkJCXCIsIFwiIzM1QjlGQ1wiXSxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGlkOiBcInRoZW1lMTZcIixcclxuICAgICAgdmFsdWU6IFtcIiMwNDU3OEZcIiwgXCIjMDA4MkFGXCIsIFwiIzNFQkJDRVwiXSxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGlkOiBcInRoZW1lMTdcIixcclxuICAgICAgdmFsdWU6IFtcIiMxQzM0ODRcIiwgXCIjMTY1OUE5XCIsIFwiIzFEOTdFMVwiLCBcIiMzNUI5RkNcIl0sXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBpZDogXCJ0aGVtZTE4XCIsXHJcbiAgICAgIHZhbHVlOiBbXCIjMDQ1NzhGXCIsIFwiIzAwNzBBM1wiLCBcIiMxNkEyQzJcIiwgXCIjM0VCQkNFXCJdLFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgaWQ6IFwidGhlbWUxOVwiLFxyXG4gICAgICB2YWx1ZTogW1wiIzFDMzQ4NFwiLCBcIiMxNjU5QTlcIiwgXCIjMTM3NUM0XCIsIFwiIzFEOTdFMVwiLCBcIiMzNUI5RkNcIl0sXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBpZDogXCJ0aGVtZTIwXCIsXHJcbiAgICAgIHZhbHVlOiBbXCIjMDQ1NzhGXCIsIFwiIzAwNzBBM1wiLCBcIiMwMDg5QjRcIiwgXCIjMTZBMkMyXCIsIFwiIzNFQkJDRVwiXSxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGlkOiBcInRoZW1lMjFcIixcclxuICAgICAgdmFsdWU6IFtcIiMxQzM0ODRcIiwgXCIjMTY1OUE5XCIsIFwiIzEzNjhCOFwiLCBcIiMxMzc1QzRcIiwgXCIjMUQ5N0UxXCIsIFwiIzM1QjlGQ1wiXSxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGlkOiBcInRoZW1lMjJcIixcclxuICAgICAgdmFsdWU6IFtcIiMwNDU3OEZcIiwgXCIjMDA3MEEzXCIsIFwiIzAwN0ZBRFwiLCBcIiMwMDg5QjRcIiwgXCIjMTZBMkMyXCIsIFwiIzNFQkJDRVwiXSxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGlkOiBcInRoZW1lMjNcIixcclxuICAgICAgdmFsdWU6IFtcclxuICAgICAgICBcIiMxQzM0ODRcIixcclxuICAgICAgICBcIiMxNjU5QTlcIixcclxuICAgICAgICBcIiMxNDVGQUZcIixcclxuICAgICAgICBcIiMxMzY4QjhcIixcclxuICAgICAgICBcIiMxMzc1QzRcIixcclxuICAgICAgICBcIiMxRDk3RTFcIixcclxuICAgICAgICBcIiMzNUI5RkNcIixcclxuICAgICAgXSxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGlkOiBcInRoZW1lMjRcIixcclxuICAgICAgdmFsdWU6IFtcclxuICAgICAgICBcIiMwNDU3OEZcIixcclxuICAgICAgICBcIiMwMDcwQTNcIixcclxuICAgICAgICBcIiMwMDc4QTlcIixcclxuICAgICAgICBcIiMwMDdGQURcIixcclxuICAgICAgICBcIiMwMDg5QjRcIixcclxuICAgICAgICBcIiMxNkEyQzJcIixcclxuICAgICAgICBcIiMzRUJCQ0VcIixcclxuICAgICAgXSxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGlkOiBcInRoZW1lMTFcIixcclxuICAgICAgdmFsdWU6IFtcclxuICAgICAgICBcIiMxQzM0ODRcIixcclxuICAgICAgICBcIiMxOTQ2OTdcIixcclxuICAgICAgICBcIiMxNjU5QTlcIixcclxuICAgICAgICBcIiMxMzZCQkJcIixcclxuICAgICAgICBcIiMxNDdFQ0NcIixcclxuICAgICAgICBcIiMxQjkyRERcIixcclxuICAgICAgICBcIiMyNkE1RURcIixcclxuICAgICAgICBcIiMzNUI5RkNcIixcclxuICAgICAgXSxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGlkOiBcInRoZW1lMTJcIixcclxuICAgICAgdmFsdWU6IFtcclxuICAgICAgICBcIiMwNDU3OEZcIixcclxuICAgICAgICBcIiMwMDY1OUJcIixcclxuICAgICAgICBcIiMwMDczQTZcIixcclxuICAgICAgICBcIiMwMDgyQUZcIixcclxuICAgICAgICBcIiMwMDkwQjhcIixcclxuICAgICAgICBcIiMwRjlFQzBcIixcclxuICAgICAgICBcIiMyOUFEQzdcIixcclxuICAgICAgICBcIiMzRUJCQ0VcIixcclxuICAgICAgXSxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGlkOiBcInRoZW1lMVwiLFxyXG4gICAgICB2YWx1ZTogW1xyXG4gICAgICAgIFwiIzU5NGJiOVwiLFxyXG4gICAgICAgIFwiI2YxYWYzMlwiLFxyXG4gICAgICAgIFwiIzQ2ODhlZFwiLFxyXG4gICAgICAgIFwiI2UwNTYzZVwiLFxyXG4gICAgICAgIFwiIzgwM2E2M1wiLFxyXG4gICAgICAgIFwiIzZkZDhiNVwiLFxyXG4gICAgICAgIFwiI2U4NzIyNVwiLFxyXG4gICAgICAgIFwiI2M1ZGY0MlwiLFxyXG4gICAgICAgIFwiI2M2NDM3ZFwiLFxyXG4gICAgICBdLFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgaWQ6IFwidGhlbWUyXCIsXHJcbiAgICAgIHZhbHVlOiBbXHJcbiAgICAgICAgXCIjNDY4OGVkXCIsXHJcbiAgICAgICAgXCIjZjFhZjMyXCIsXHJcbiAgICAgICAgXCIjZTA1NjNlXCIsXHJcbiAgICAgICAgXCIjODAzYTYzXCIsXHJcbiAgICAgICAgXCIjNmRkOGI1XCIsXHJcbiAgICAgICAgXCIjZTg3MjI1XCIsXHJcbiAgICAgICAgXCIjYzVkZjQyXCIsXHJcbiAgICAgICAgXCIjYzY0MzdkXCIsXHJcbiAgICAgICAgXCIjNTk0YmI5XCIsXHJcbiAgICAgIF0sXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBpZDogXCJ0aGVtZTNcIixcclxuICAgICAgdmFsdWU6IFtcclxuICAgICAgICBcIiNjNjQzN2RcIixcclxuICAgICAgICBcIiNjNWRmNDJcIixcclxuICAgICAgICBcIiNlODcyMjVcIixcclxuICAgICAgICBcIiM2ZGQ4YjVcIixcclxuICAgICAgICBcIiNlMDU2M2VcIixcclxuICAgICAgICBcIiM4MDNhNjNcIixcclxuICAgICAgICBcIiNmMWFmMzJcIixcclxuICAgICAgICBcIiM1OTRiYjlcIixcclxuICAgICAgICBcIiM0Njg4ZWRcIixcclxuICAgICAgXSxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGlkOiBcInRoZW1lNFwiLFxyXG4gICAgICB2YWx1ZTogW1xyXG4gICAgICAgIFwiIzJmNDk5ZlwiLFxyXG4gICAgICAgIFwiIzhkMWQyZVwiLFxyXG4gICAgICAgIFwiI2U5YmYzNVwiLFxyXG4gICAgICAgIFwiIzUxNzcyZlwiLFxyXG4gICAgICAgIFwiIzQ2OWJkOFwiLFxyXG4gICAgICAgIFwiIzVjNDQ4ZlwiLFxyXG4gICAgICAgIFwiI2RhNzMyZlwiLFxyXG4gICAgICAgIFwiIzI0NTM1M1wiLFxyXG4gICAgICAgIFwiIzQzYTI0NVwiLFxyXG4gICAgICBdLFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgaWQ6IFwidGhlbWU1XCIsXHJcbiAgICAgIHZhbHVlOiBbXHJcbiAgICAgICAgXCIjMzgzODM5XCIsXHJcbiAgICAgICAgXCIjNDQ2ZWM2XCIsXHJcbiAgICAgICAgXCIjY2Y2Mzg0XCIsXHJcbiAgICAgICAgXCIjZWJiMzdlXCIsXHJcbiAgICAgICAgXCIjNzFhMjQ5XCIsXHJcbiAgICAgICAgXCIjNGJiMWE1XCIsXHJcbiAgICAgICAgXCIjZTg3MjI1XCIsXHJcbiAgICAgICAgXCIjYzVkZjQyXCIsXHJcbiAgICAgICAgXCIjYzY0MzdkXCIsXHJcbiAgICAgIF0sXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBpZDogXCJ0aGVtZTZcIixcclxuICAgICAgdmFsdWU6IFtcclxuICAgICAgICBcIiM1MTdhZTFcIixcclxuICAgICAgICBcIiM2Mzg2ZTVcIixcclxuICAgICAgICBcIiM3NDkxZTlcIixcclxuICAgICAgICBcIiM4NDlkZWNcIixcclxuICAgICAgICBcIiM5NGE5ZWZcIixcclxuICAgICAgICBcIiNhNGI2ZjJcIixcclxuICAgICAgICBcIiNiNGMzZjZcIixcclxuICAgICAgICBcIiNjNGNmZjlcIixcclxuICAgICAgICBcIiNkNGRkZmRcIixcclxuICAgICAgXSxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGlkOiBcInRoZW1lN1wiLFxyXG4gICAgICB2YWx1ZTogW1xyXG4gICAgICAgIFwiIzM5ODI4ZVwiLFxyXG4gICAgICAgIFwiIzQ4OGU5OVwiLFxyXG4gICAgICAgIFwiIzU3OWFhNVwiLFxyXG4gICAgICAgIFwiIzY2YTZiMFwiLFxyXG4gICAgICAgIFwiIzc1YjNiZFwiLFxyXG4gICAgICAgIFwiIzg1YmZjOVwiLFxyXG4gICAgICAgIFwiIzk1Y2RkNlwiLFxyXG4gICAgICAgIFwiI2E0ZGFlMlwiLFxyXG4gICAgICAgIFwiI2I1ZThmMFwiLFxyXG4gICAgICBdLFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgaWQ6IFwidGhlbWU4XCIsXHJcbiAgICAgIHZhbHVlOiBbXHJcbiAgICAgICAgXCIjZTc5NjNkXCIsXHJcbiAgICAgICAgXCIjZWE5ZTRiXCIsXHJcbiAgICAgICAgXCIjZWVhNjU5XCIsXHJcbiAgICAgICAgXCIjZjBhZTY4XCIsXHJcbiAgICAgICAgXCIjZjJiNjc4XCIsXHJcbiAgICAgICAgXCIjZjNiZjg3XCIsXHJcbiAgICAgICAgXCIjZjVjNzk4XCIsXHJcbiAgICAgICAgXCIjZjZkMGFhXCIsXHJcbiAgICAgICAgXCIjZjdkOWJiXCIsXHJcbiAgICAgIF0sXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBpZDogXCJ0aGVtZTlcIixcclxuICAgICAgdmFsdWU6IFtcclxuICAgICAgICBcIiM2NGE4YjRcIixcclxuICAgICAgICBcIiM3ZWJlYzBcIixcclxuICAgICAgICBcIiM5Y2M5Y2FcIixcclxuICAgICAgICBcIiNiOGQ0ZDRcIixcclxuICAgICAgICBcIiNkOWQ2Y2RcIixcclxuICAgICAgICBcIiNkOGI3YTdcIixcclxuICAgICAgICBcIiNjZThmOTNcIixcclxuICAgICAgICBcIiNjMTYyN2ZcIixcclxuICAgICAgICBcIiNhZDI0NThcIixcclxuICAgICAgXSxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGlkOiBcInRoZW1lMTBcIixcclxuICAgICAgdmFsdWU6IFtcclxuICAgICAgICBcIiM0MTc2YmFcIixcclxuICAgICAgICBcIiM1NTlhZThcIixcclxuICAgICAgICBcIiM3MGIzZThcIixcclxuICAgICAgICBcIiNhN2NjZTdcIixcclxuICAgICAgICBcIiNkZmRmZGZcIixcclxuICAgICAgICBcIiNkMmEwOGJcIixcclxuICAgICAgICBcIiNjNzZhNTBcIixcclxuICAgICAgICBcIiNjYTRlMzRcIixcclxuICAgICAgICBcIiNhYTNjMjlcIixcclxuICAgICAgXSxcclxuICAgIH0sXHJcbiAgXTtcclxuICBzdGFydEVkaXQgPSBmYWxzZTtcclxuICBwdWJsaWMgc2hvd1N1YlRvdGFsR3JvdXA6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgc2hvd2dyYW5kVG90YWxHcm91cDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBzaG93VGFibGVHcmFuZFRvdGFsR3JvdXA6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgQ3VycmVudF9Qb3J0bGV0SWQ7XHJcbiAgcHVibGljIHJlc3RvcmVNb2RlbDogYW55ID0gW107XHJcbiAgcHVibGljIHRoZW1lT2JqID0ge307XHJcbiAgZW5hYmxlTXVsdGlwbGVBeGlzID0gZmFsc2U7XHJcbiAgc2hvd0xlZ2VuZCA9IGZhbHNlO1xyXG4gIHRpbWVyO1xyXG4gIHRhYkxpc3Q7XHJcbiAgYWN0aXZlVGFiID0gMTtcclxuICBwcmV2SWQgPSBudWxsO1xyXG4gIGRhc2hib2FyZF9zaWRlYmFyID0gZmFsc2U7XHJcbiAgQWN0aXZlRGFzaGJvYXJkUG9ydGxldHMgPSBbXTtcclxuICBwb3J0bGV0cyA9IFtdO1xyXG4gIGhhc1Jlc2l6ZSA9IGZhbHNlO1xyXG5cclxuICBAVmlld0NoaWxkKFwicGFuZXNMaXN0XCIsIHsgc3RhdGljOiB0cnVlIH0pIHBhbmVzTGlzdDogRWxlbWVudFJlZjtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBkaWFsb2c6IE1hdERpYWxvZyxcclxuICAgIHByaXZhdGUgZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSxcclxuICAgIHB1YmxpYyBkYXNoYm9hcmRTZXJ2aWNlOiBEYXNoYm9hcmRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBhcGk6IEFwaUxpc3QsXHJcbiAgICBwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgIHB1YmxpYyBEYXNoYm9hcmRQb3JsZXRzU2VydmljZTogRGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSBodHRwQ2xpZW50OiBIdHRwQ2xpZW50LFxyXG4gICAgcHJpdmF0ZSBkYXRlUGlwZTogRGF0ZVBpcGUsXHJcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFBCRl9UT0tFTikgcHJpdmF0ZSBwYmY6IGFueSxcclxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQVBJX1NFUlZJQ0VfVE9LRU4pIHByaXZhdGUgaHR0cDogYW55LFxyXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChST0xFX1NFUlZJQ0VfVE9LRU4pIHB1YmxpYyByczogYW55XHJcbiAgKSB7XHJcbiAgICB0aGlzLnJvdXRlci5ldmVudHNcclxuICAgICAgLnBpcGUoZmlsdGVyKChldmVudCkgPT4gZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSlcclxuICAgICAgLnN1YnNjcmliZSgoZTogTmF2aWdhdGlvbkVuZCkgPT4ge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIHRoaXMuaGFzUmVzaXplICYmXHJcbiAgICAgICAgICBlLnVybCA9PT0gdGhpcy5hY3RpdmF0ZWRSb3V0ZVtcIl9yb3V0ZXJTdGF0ZVwiXS5zbmFwc2hvdC51cmxcclxuICAgICAgICApIHtcclxuICAgICAgICAgIGlmICh0aGlzLmRhc2hib2FyZExheW91dCkge1xyXG4gICAgICAgICAgICB0aGlzLkFjdGl2ZURhc2hib2FyZFBvcnRsZXRzID0gW107XHJcbiAgICAgICAgICAgIHRoaXMuaGFzUmVzaXplID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMucGJmLnBhZ2VMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5wYmYucGFnZUxvYWRpbmdfLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuZGFzaGJvYXJkTGF5b3V0LnJlbW92ZUFsbCgpO1xyXG4gICAgICAgICAgICB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVEYXNoYm9hcmRQb3J0bGV0cygpO1xyXG4gICAgICAgICAgICB9LCA1MDApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMucGJmLnBhZ2VMb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMucGJmLnBhZ2VMb2FkaW5nXy5uZXh0KHRydWUpO1xyXG4gICAgdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gICAgaWYgKHRoaXMudGhlbWVEYXRhICYmIHRoaXMudGhlbWVEYXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy50aGVtZURhdGEuZm9yRWFjaCgoZSkgPT4ge1xyXG4gICAgICAgIHRoaXMudGhlbWVPYmpbZS5pZF0gPSBlW1widmFsdWVcIl07XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5nZXRJbmZvKCk7XHJcbiAgICB0aGlzLmdldERhc2hib2FyZCgpO1xyXG5cclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxyXG4gICAgICB0aGlzLnBiZi5wdWIkLnN1YnNjcmliZSgocmVzKSA9PiB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgcmVzLnJlZnJlc2hVcmwgJiZcclxuICAgICAgICAgIHJlcy5yZWZyZXNoVXJsID09PSB0aGlzLmFjdGl2YXRlZFJvdXRlW1wiX3JvdXRlclN0YXRlXCJdLnNuYXBzaG90LnVybFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdGhpcy5wYmYucGFnZUxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5wYmYucGFnZUxvYWRpbmdfLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5nZXREYXNoYm9hcmQoKTtcclxuICAgICAgICAgIH0sIDUwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcclxuICAgICAgdGhpcy5kYXNoYm9hcmRTZXJ2aWNlLmdldERhc2hib2FyZFJlbmFtZSgpLnN1YnNjcmliZSgocmVzKSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuZGFzaGJvYXJkICYmIHRoaXMuZGFzaGJvYXJkLmlkID09PSByZXMuaWQpIHtcclxuICAgICAgICAgIHRoaXMuZGFzaGJvYXJkLmRhc2hib2FyZEdyb3VwTmFtZSA9IHJlcy5kYXNoYm9hcmRHcm91cE5hbWU7XHJcbiAgICAgICAgICB0aGlzLmRhc2hib2FyZC5kYXNoYm9hcmRHcm91cElkID0gcmVzLmRhc2hib2FyZEdyb3VwSWQ7XHJcbiAgICAgICAgICB0aGlzLmRhc2hib2FyZC5kZXNjcmlwdGlvbiA9IHJlcy5kZXNjcmlwdGlvbjtcclxuICAgICAgICAgIHRoaXMuZGFzaGJvYXJkLm5hbWUgPSByZXMubmFtZTtcclxuICAgICAgICAgIHRoaXMudXBkYXRlRGFzaGJvYXJkTGFzdFVwZGF0ZURhdGUoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxyXG4gICAgICB0aGlzLmRhc2hib2FyZFNlcnZpY2UuZ2V0Q3VzdG9taXplU3RhdHVzKCkuc3Vic2NyaWJlKChpZCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmRhc2hib2FyZCAmJiB0aGlzLmRhc2hib2FyZC5pZCA9PT0gaWQpIHtcclxuICAgICAgICAgIHRoaXMucmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXHJcbiAgICAgIHRoaXMucGJmLmdldEhhc1Jlc2l6ZSgpLnN1YnNjcmliZSgodXJsKSA9PiB7XHJcbiAgICAgICAgaWYgKHVybCkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuYWN0aXZhdGVkUm91dGVbXCJfcm91dGVyU3RhdGVcIl0uc25hcHNob3QudXJsID09PSB1cmwpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZGFzaGJvYXJkTGF5b3V0KSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5BY3RpdmVEYXNoYm9hcmRQb3J0bGV0cyA9IFtdO1xyXG4gICAgICAgICAgICAgIHRoaXMuZGFzaGJvYXJkTGF5b3V0LnJlbW92ZUFsbCgpO1xyXG4gICAgICAgICAgICAgIHRoaXMucGJmLnBhZ2VMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB0aGlzLnBiZi5wYWdlTG9hZGluZ18ubmV4dCh0cnVlKTtcclxuICAgICAgICAgICAgICB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlRGFzaGJvYXJkUG9ydGxldHMoKTtcclxuICAgICAgICAgICAgICB9LCA1MDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmhhc1Jlc2l6ZSA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0QWxsRmllbGRzKGl0ZW0sIG5vRGV0ZWN0ID0gZmFsc2UpOiBQcm9taXNlPGFueVtdPiB7XHJcbiAgICBpZiAoIW5vRGV0ZWN0KSB7XHJcbiAgICAgIHRoaXMucGJmLnBhZ2VMb2FkaW5nID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnN0IGRhdGFNYXJ0Q29kZSA9IGl0ZW0uZmlndXJlQ29kZTtcclxuICAgICAgY29uc3QgZGF0YU9iaiA9IHtcclxuICAgICAgICBsYW5ndWFnZTogdGhpcy5sYW5nLFxyXG4gICAgICAgIGRhdGFNYXJ0Q29kZSxcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5EYXNoYm9hcmRQb3JsZXRzU2VydmljZS5zZXRTY2hlbWFQYXJhbXMoXHJcbiAgICAgICAgZGF0YU9iaixcclxuICAgICAgICBkYXRhTWFydENvZGUsXHJcbiAgICAgICAgdGhpcy5kYXNoYm9hcmRcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5odHRwLnBvc3QodGhpcy5hcGkudXJsTGlzdC5HZXRTY2hlbWEsIGRhdGFPYmosIChyZXMpID0+IHtcclxuICAgICAgICBpZiAoIW5vRGV0ZWN0KSB7XHJcbiAgICAgICAgICB0aGlzLnBiZi5wYWdlTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5wYmYucGFnZUxvYWRpbmdfLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlc29sdmUocmVzKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uQ2xvc2VSaWdodChlKSB7XHJcbiAgICB0aGlzLnB1c2hfYnRuID0gZmFsc2U7XHJcbiAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBzZXRBY3RpdmVEYXNoYm9hcmRQb3J0bGV0cyhub0RldGVjdCA9IGZhbHNlKSB7XHJcbiAgICBpZiAodGhpcy5oYXNDaGFuZ2VEYXRhVGFibGUpIHtcclxuICAgICAgdGhpcy5BY3RpdmVEYXNoYm9hcmRQb3J0bGV0cyA9IFtdO1xyXG4gICAgICB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHBvcnRsZXRzID1cclxuICAgICAgdGhpcy5wb3J0bGV0cy5maWx0ZXIoKHBvcnRsZXQpID0+IHtcclxuICAgICAgICBpZiAoIXBvcnRsZXQgfHwgIXBvcnRsZXQuY29uZmlnKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IEpTT04ucGFyc2UocG9ydGxldC5jb25maWcpO1xyXG4gICAgICAgIGNvbnN0IHRhYklkID0gY29uZmlnLnRhYklkIHx8IDE7XHJcbiAgICAgICAgaWYgKHRhYklkID09PSB0aGlzLmFjdGl2ZVRhYikge1xyXG4gICAgICAgICAgcmV0dXJuIHBvcnRsZXQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSB8fCBbXTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLkFjdGl2ZURhc2hib2FyZFBvcnRsZXRzID0gWy4uLnBvcnRsZXRzXTtcclxuICAgICAgaWYgKFxyXG4gICAgICAgICF0aGlzLkFjdGl2ZURhc2hib2FyZFBvcnRsZXRzLmxlbmd0aCAmJlxyXG4gICAgICAgIHRoaXMuZGFzaGJvYXJkTGF5b3V0ICYmXHJcbiAgICAgICAgdGhpcy5kYXNoYm9hcmRMYXlvdXQucGFuZWxzICYmXHJcbiAgICAgICAgdGhpcy5kYXNoYm9hcmRMYXlvdXQucGFuZWxzLmxlbmd0aFxyXG4gICAgICApIHtcclxuICAgICAgICB0aGlzLmRhc2hib2FyZExheW91dC5yZW1vdmVBbGwoKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmhhc0NoYW5nZURhdGFUYWJsZSA9IGZhbHNlO1xyXG4gICAgICBpZiAoIW5vRGV0ZWN0KSB7XHJcbiAgICAgICAgdGhpcy5wYmYucGFnZUxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnBiZi5wYWdlTG9hZGluZ18ubmV4dCh0cnVlKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uQWN0aXZlVGFiKHRhYiwgaW5kZXgpIHtcclxuICAgIHRoaXMuZGFzaGJvYXJkX3NpZGViYXIgPSBmYWxzZTtcclxuICAgIHRoaXMucHVzaF9idG4gPSBmYWxzZTtcclxuICAgIGNvbnN0IHsgaWQsIGxhYmVsIH0gPSB0YWI7XHJcbiAgICBpZiAodGFiLmlkID09PSB0aGlzLmFjdGl2ZVRhYikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmFjdGl2ZVRhYklkID0gaWQ7XHJcbiAgICB0aGlzLmFjdGl2ZVRhYkxhYmVsID0gbGFiZWw7XHJcbiAgICBpZiAoaW5kZXggIT09IDApIHtcclxuICAgICAgdGhpcy5wcmV2SWQgPSB0aGlzLnRhYkxpc3RbaW5kZXggLSAxXS5pZDtcclxuICAgIH1cclxuICAgIHRoaXMuc3RhcnRFZGl0ID0gZmFsc2U7XHJcbiAgICB0aGlzLmFjdGl2ZVRhYiA9IGlkO1xyXG4gICAgdGhpcy5zZXRBY3RpdmVEYXNoYm9hcmRQb3J0bGV0cygpO1xyXG4gIH1cclxuXHJcbiAgb25EZWxldGVUYWIoaXRlbSkge1xyXG4gICAgbGV0IF90aXRsZSA9XHJcbiAgICAgIHRoaXMudHJhbnNsYXRpb24uQVJFX1lPVV9TVVJFX1RPX0RFTEVURV9EQVNIQk9BUkRfVEFCX1dBUk5JTkdfTUVTU0FHRSB8fFxyXG4gICAgICBcIi5BUkVfWU9VX1NVUkVfVE9fREVMRVRFX0RBU0hCT0FSRF9UQUJfV0FSTklOR19NRVNTQUdFXCI7XHJcbiAgICBfdGl0bGUgPSBfdGl0bGUucmVwbGFjZShcIntUYWIgTmFtZX1cIiwgaXRlbS5sYWJlbCk7XHJcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZ1NlcnZpY2Uuc2hvd0NvbW1vbkRpbGFvZyh7XHJcbiAgICAgIHRpdGxlOiB0aGlzLnRyYW5zbGF0aW9uLkRFTEVURV9SRUNPUkQgfHwgXCIuREVMRVRFX1JFQ09SRFwiLFxyXG4gICAgICBkZXNjcmlwdGlvbjogX3RpdGxlLFxyXG4gICAgfSk7XHJcbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKHJlcykgPT4ge1xyXG4gICAgICBpZiAocmVzID09PSBcInNhdmVcIikge1xyXG4gICAgICAgIGNvbnN0IGlzQWN0aXZlID0gdGhpcy5hY3RpdmVUYWIgPT09IGl0ZW0uaWQ7XHJcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcclxuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5wb3J0bGV0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgY29uc3QgY29uZmlnID0gSlNPTi5wYXJzZSh0aGlzLnBvcnRsZXRzW2ldLmNvbmZpZyk7XHJcbiAgICAgICAgICBpZiAoY29uZmlnLnRhYklkID09PSB0aGlzLmFjdGl2ZVRhYikge1xyXG4gICAgICAgICAgICB0aGlzLnBvcnRsZXRzLnNwbGljZShpLCAxKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy50YWJMaXN0LmZvckVhY2goKHRhYiwgaSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRhYi5pZCA9PT0gaXRlbS5pZCkge1xyXG4gICAgICAgICAgICB0aGlzLnRhYkxpc3Quc3BsaWNlKGksIDEpO1xyXG4gICAgICAgICAgICBpbmRleCA9IGk7XHJcbiAgICAgICAgICAgIHRoaXMucmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGlzQWN0aXZlKSB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMudGFiTGlzdFtpbmRleF0pIHtcclxuICAgICAgICAgICAgaW5kZXggLT0gMTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuYWN0aXZlVGFiID0gdGhpcy50YWJMaXN0W2luZGV4XS5pZDtcclxuICAgICAgICAgIHRoaXMuYWN0aXZlVGFiSWQgPSB0aGlzLmFjdGl2ZVRhYjtcclxuICAgICAgICAgIHRoaXMucG9ydGxldHMuZm9yRWFjaCgocG9ydGxldCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjb25maWcgPSBKU09OLnBhcnNlKHBvcnRsZXQuY29uZmlnKTtcclxuICAgICAgICAgICAgY29uZmlnLmFjdGl2ZVRhYiA9IHRoaXMuYWN0aXZlVGFiO1xyXG4gICAgICAgICAgICBwb3J0bGV0LmNvbmZpZyA9IENpcmN1bGFySlNPTi5zdHJpbmdpZnkoY29uZmlnKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgICAgdGhpcy5vbkFjdGl2ZVRhYih0aGlzLnRhYkxpc3RbaW5kZXhdLCBpbmRleCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2F2ZWRhc2hib2FyZChcInRydWVcIik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25BZGRUYWIoKSB7XHJcbiAgICBjb25zdCBsYWJlbCA9IGBUYWIgJHt0aGlzLnRhYkxpc3QubGVuZ3RoICsgMX1gO1xyXG4gICAgdGhpcy5wcmV2SWQgPSB0aGlzLnRhYkxpc3RbdGhpcy50YWJMaXN0Lmxlbmd0aCAtIDFdLmlkO1xyXG4gICAgbGV0IG5ld0lkID0gMTtcclxuICAgIHRoaXMudGFiTGlzdC5mb3JFYWNoKCh0YWIpID0+IHtcclxuICAgICAgbmV3SWQgPSBNYXRoLm1heChuZXdJZCwgdGFiLmlkKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5hY3RpdmVUYWIgPSBuZXdJZCArIDE7XHJcbiAgICB0aGlzLnRhYkxpc3QucHVzaCh7XHJcbiAgICAgIGlkOiB0aGlzLmFjdGl2ZVRhYixcclxuICAgICAgbGFiZWwsXHJcbiAgICAgIGRpc3BsYXlMYWJlbDogYCR7dGhpcy50cmFuc2xhdGlvbi5UQUIgfHwgXCJUYWJcIn0gJHtcclxuICAgICAgICB0aGlzLnRhYkxpc3QubGVuZ3RoICsgMVxyXG4gICAgICB9YCxcclxuICAgIH0pO1xyXG4gICAgdGhpcy5hY3RpdmVUYWJJZCA9IHRoaXMuYWN0aXZlVGFiO1xyXG4gICAgdGhpcy5hY3RpdmVUYWJMYWJlbCA9IGxhYmVsO1xyXG4gICAgLy8g6ZqQ6JeP5Y+z5L6n6I+c5Y2V77yM5riF6Zmk5b2T5YmN6YCJ5Lit55qEcG9ydGxldFxyXG4gICAgdGhpcy5wb3J0bGV0ID0gbnVsbDtcclxuICAgIHRoaXMuZGFzaGJvYXJkX3NpZGViYXIgPSBmYWxzZTtcclxuICAgIHRoaXMuaGFzQ2hhbmdlRGF0YVRhYmxlID0gdHJ1ZTtcclxuICAgIHRoaXMucHVzaF9idG4gPSBmYWxzZTtcclxuICAgIHRoaXMuc2V0QWN0aXZlRGFzaGJvYXJkUG9ydGxldHMoKTtcclxuICB9XHJcblxyXG4gIHNldFRhYklucHV0KGUpIHtcclxuICAgIHRoaXMucG9ydGxldHMuZm9yRWFjaCgocG9ydGxldCkgPT4ge1xyXG4gICAgICBjb25zdCBfY29uZmlnID0gSlNPTi5wYXJzZShwb3J0bGV0LmNvbmZpZyk7XHJcbiAgICAgIGNvbnN0IF90YWJJZCA9IF9jb25maWcudGFiSWQgfHwgMTtcclxuICAgICAgaWYgKF90YWJJZCA9PT0gdGhpcy5hY3RpdmVUYWIpIHtcclxuICAgICAgICBfY29uZmlnLnRhYkxhYmVsID0gZS50YXJnZXQudmFsdWU7XHJcbiAgICAgICAgcG9ydGxldC5jb25maWcgPSBDaXJjdWxhckpTT04uc3RyaW5naWZ5KF9jb25maWcpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMucmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgc2F2ZVRhYklucHV0KGl0ZW0pIHtcclxuICAgIHRoaXMuc3RhcnRFZGl0ID0gZmFsc2U7XHJcbiAgICBpdGVtLmRpc3BsYXlMYWJlbCA9IHRoaXMudHJ1bmNhdGVUZXh0KGl0ZW0ubGFiZWwpO1xyXG4gICAgdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBvblN0YXJ0RWRpdChpZCkge1xyXG4gICAgaWYgKCF0aGlzLmN1c3RvbWl6ZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuYWN0aXZlVGFiICE9PSBpZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnN0YXJ0RWRpdCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRUYWJMaXN0KG5vRGV0ZWN0ID0gZmFsc2UpIHtcclxuICAgIHRoaXMudGFiTGlzdCA9IFtdO1xyXG4gICAgaWYgKCF0aGlzLmFjdGl2ZVRhYiB8fCAhdGhpcy5zdGF5QWN0aXZlVGFiKSB7XHJcbiAgICAgIHRoaXMuYWN0aXZlVGFiID0gMTtcclxuICAgIH1cclxuICAgIHRoaXMucHJldklkID0gbnVsbDtcclxuICAgIGNvbnN0IHRhYk1hcCA9IHt9O1xyXG4gICAgdGhpcy5wb3J0bGV0cy5mb3JFYWNoKChwb3J0bGV0LCBpZHgpID0+IHtcclxuICAgICAgaWYgKHBvcnRsZXQuY29uZmlnKSB7XHJcbiAgICAgICAgY29uc3QgY29uZmlnID0gSlNPTi5wYXJzZShwb3J0bGV0LmNvbmZpZyk7XHJcbiAgICAgICAgY29uc3QgdHh0ID0gdGhpcy50cmFuc2xhdGlvbltcIlRBQlwiXSB8fCBcIlRhYlwiO1xyXG4gICAgICAgIGlmIChjb25maWcuYWN0aXZlVGFiICYmICF0aGlzLnN0YXlBY3RpdmVUYWIpIHtcclxuICAgICAgICAgIHRoaXMuYWN0aXZlVGFiID0gY29uZmlnLmFjdGl2ZVRhYjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdGFiSWQgPSBjb25maWcudGFiSWQgfHwgMTtcclxuICAgICAgICBjb25zdCB0YWJMYWJlbCA9IGNvbmZpZy50YWJMYWJlbCB8fCBcIlRhYiAxXCI7XHJcbiAgICAgICAgbGV0IGRpc3BsYXlMYWJlbCA9IGNvbmZpZy50YWJMYWJlbCB8fCBgJHt0eHR9IDFgO1xyXG4gICAgICAgIGlmIChjb25maWcudGFiTGFiZWwgJiYgY29uZmlnLnRhYkxhYmVsLnN0YXJ0c1dpdGgoXCJUYWJcIikpIHtcclxuICAgICAgICAgIGRpc3BsYXlMYWJlbCA9IHR4dCArIGNvbmZpZy50YWJMYWJlbC5zbGljZSgzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0YWJNYXBbdGFiSWRdKSB7XHJcbiAgICAgICAgICB0aGlzLnRhYkxpc3QucHVzaCh7XHJcbiAgICAgICAgICAgIGlkOiB0YWJJZCxcclxuICAgICAgICAgICAgbGFiZWw6IHRhYkxhYmVsLFxyXG4gICAgICAgICAgICBkaXNwbGF5TGFiZWw6IHRhYkxhYmVsXHJcbiAgICAgICAgICAgICAgPyB0aGlzLnRydW5jYXRlVGV4dChkaXNwbGF5TGFiZWwpXHJcbiAgICAgICAgICAgICAgOiBgJHt0aGlzLnRyYW5zbGF0aW9uLlRBQiB8fCBcIlRhYlwifSAxYCxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdGFiTWFwW3RhYklkXSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBpZiAoIXRoaXMuYWN0aXZlVGFiSWQpIHtcclxuICAgICAgICAvLyBcdHRoaXMuYWN0aXZlVGFiID0gdGFiSWQ7XHJcbiAgICAgICAgLy8gXHR0aGlzLmFjdGl2ZVRhYklkID0gdGFiSWQ7XHJcbiAgICAgICAgLy8gXHR0aGlzLmFjdGl2ZVRhYkxhYmVsID0gdGFiTGFiZWw7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoIXRoaXMudGFiTGlzdC5sZW5ndGgpIHtcclxuICAgICAgdGhpcy50YWJMaXN0ID0gW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGlkOiAxLFxyXG4gICAgICAgICAgbGFiZWw6IFwiVGFiIDFcIixcclxuICAgICAgICAgIGRpc3BsYXlMYWJlbDogYCR7dGhpcy50cmFuc2xhdGlvbi5UQUIgfHwgXCJUYWJcIn0gMWAsXHJcbiAgICAgICAgfSxcclxuICAgICAgXTtcclxuICAgICAgdGhpcy5hY3RpdmVUYWJJZCA9IDE7XHJcbiAgICAgIHRoaXMuYWN0aXZlVGFiTGFiZWwgPSBcIlRhYiAxXCI7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy50YWJMaXN0ID0gdGhpcy50YWJMaXN0LnNvcnQoKGEsIGIpID0+IGEuaWQgLSBiLmlkKTtcclxuICAgIGNvbnN0IGFjdGl2ZVRhYiA9XHJcbiAgICAgIHRoaXMudGFiTGlzdC5maW5kKChpKSA9PiBpLmlkID09PSB0aGlzLmFjdGl2ZVRhYikgfHwgdGhpcy50YWJMaXN0WzBdO1xyXG4gICAgaWYgKGFjdGl2ZVRhYi5pZCkge1xyXG4gICAgICB0aGlzLmFjdGl2ZVRhYklkID0gYWN0aXZlVGFiLmlkO1xyXG4gICAgICB0aGlzLmFjdGl2ZVRhYkxhYmVsID0gYWN0aXZlVGFiLmxhYmVsO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zdGF5QWN0aXZlVGFiID0gZmFsc2U7XHJcbiAgICB0aGlzLnNldFByZXZJZCgpO1xyXG4gICAgaWYgKCFub0RldGVjdCkge1xyXG4gICAgICB0aGlzLnNldEFjdGl2ZURhc2hib2FyZFBvcnRsZXRzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBpbml0bGF5b3V0KHNob3VsZEdldEZpZWxkcyA9IGZhbHNlLCBub0RldGVjdCA9IGZhbHNlKSB7XHJcbiAgICBpZiAoIXNob3VsZEdldEZpZWxkcykge1xyXG4gICAgICB0aGlzLmluaXRUYWJMaXN0KG5vRGV0ZWN0KTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnBvcnRsZXRzICYmIHRoaXMucG9ydGxldHMubGVuZ3RoID4gMCkge1xyXG4gICAgICBmb3IgKGxldCBwb3J0bGV0IG9mIHRoaXMucG9ydGxldHMpIHtcclxuICAgICAgICBjb25zdCBjb25maWc6IGFueSA9IEpTT04ucGFyc2UocG9ydGxldC5jb25maWcpO1xyXG4gICAgICAgIGlmIChzaG91bGRHZXRGaWVsZHMpIHtcclxuICAgICAgICAgIC8vIEdldFNjaGVtYemFjee9rueahOWIl+aVsOaNrua6kFxyXG4gICAgICAgICAgY29uc3QgZmllbGRzOiBhbnlbXSA9IGF3YWl0IHRoaXMuZ2V0QWxsRmllbGRzKHBvcnRsZXQpO1xyXG4gICAgICAgICAgLy8g5q+P5LiqcG9ydGxldOiHquWumuS5ieeahOaVsOaNrlxyXG4gICAgICAgICAgY29uZmlnLmZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZmllbGQuZm9ybWF0KSB7XHJcbiAgICAgICAgICAgICAgZmllbGRzLmZvckVhY2goKF9mKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoX2YuY29sTmFtZSA9PT0gZmllbGQuY29sTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICBfZi5mb3JtYXQgPSBmaWVsZC5mb3JtYXQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgaXRlbSA9IGZpZWxkcy5maW5kKChfZikgPT4gX2YuY29sTmFtZSA9PT0gZmllbGQuY29sTmFtZSk7XHJcbiAgICAgICAgICAgIGlmICghaXRlbSkge1xyXG4gICAgICAgICAgICAgIGZpZWxkcy5wdXNoKGZpZWxkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBpZiAoY29uZmlnLnBvcnRsZXRUeXBlID09PSBcInBpdm90XCIpIHtcclxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICBjb25maWcuZmllbGRzID0gZmllbGRzO1xyXG4gICAgICAgICAgICBwb3J0bGV0LmNvbmZpZyA9IENpcmN1bGFySlNPTi5zdHJpbmdpZnkoY29uZmlnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcG9ydGxldC5uZXdJZCA9IFwicG9ydGxldF9cIiArIHRoaXMucGJmLkd1aWQoKTtcclxuICAgICAgICBwb3J0bGV0LmNvbCA9IHBvcnRsZXQucG9zWDtcclxuICAgICAgICBwb3J0bGV0LnJvdyA9IHBvcnRsZXQucG9zWTtcclxuICAgICAgICBwb3J0bGV0LnNpemVYID0gcG9ydGxldC53aWR0aDtcclxuICAgICAgICBwb3J0bGV0LnNpemVZID0gcG9ydGxldC5oZWlnaHQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuaW5pdENoYXJEYXRhKG5vRGV0ZWN0KTtcclxuICAgICAgdGhpcy5zZXRBY3RpdmVEYXNoYm9hcmRQb3J0bGV0cyhub0RldGVjdCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLkFjdGl2ZURhc2hib2FyZFBvcnRsZXRzID0gW107XHJcbiAgICAgIHRoaXMuZGFzaGJvYXJkTGF5b3V0LnJlbW92ZUFsbCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXHJcbiAgICAgIHRoaXMucGJmLmdldFRyaWdnZXJEYXNoYm9hcmRGaWx0ZXJDaGFuZ2UoKS5zdWJzY3JpYmUoKGUpID0+IHtcclxuICAgICAgICBjb25zdCBkYXNoYm9hcklkID0gZVtcImlkXCJdO1xyXG4gICAgICAgIGNvbnN0IG5ld0lkID0gZVtcIm5ld0lkXCJdO1xyXG4gICAgICAgIGlmIChkYXNoYm9hcklkICE9PSB0aGlzLmRhc2hib2FyZC5pZCkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmZpbHRlckRhdGEobmV3SWQpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcclxuICAgICAgdGhpcy5kYXNoYm9hcmRTZXJ2aWNlXHJcbiAgICAgICAgLmdldGNoYW5nZWxheW91dCgpXHJcbiAgICAgICAgLnN1YnNjcmliZSgoeyBzdGF0dXMsIGlkID0gXCJcIiB9KSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5kYXNoYm9hcmQgJiYgdGhpcy5kYXNoYm9hcmQuaWQgPT09IGlkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHN0YXR1cyA9PT0gXCJ0cnVlXCIgPyBmYWxzZSA6IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdGxheW91dChwYXJhbXMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxyXG4gICAgICB0aGlzLmRhc2hib2FyZFNlcnZpY2UuZWRpdFByb3BlcnRpZXMoKS5zdWJzY3JpYmUoKHsgc3RhdHVzLCBpZCB9KSA9PiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmRhc2hib2FyZCB8fCB0aGlzLmRhc2hib2FyZC5pZCAhPT0gaWQgfHwgdGhpcy50aW1lcikge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnRpbWVyID0gbnVsbDtcclxuICAgICAgICB9LCAyMDApO1xyXG4gICAgICAgIHRoaXMuZGlhbG9nLmNsb3NlQWxsKCk7XHJcbiAgICAgICAgdGhpcy5kaWFsb2dcclxuICAgICAgICAgIC5vcGVuKERhdGFNYXJ0TmV3Q29tcG9uZW50LCB7XHJcbiAgICAgICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgICBlZGl0OiBzdGF0dXMsXHJcbiAgICAgICAgICAgICAgZGFzaGJvYXJkSWQ6IHRoaXMudXJsX2lkLFxyXG4gICAgICAgICAgICAgIGRhc2hib2FyZDogdGhpcy5kYXNoYm9hcmQsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGhlaWdodDogXCI4NSVcIixcclxuICAgICAgICAgICAgd2lkdGg6IFwiNTUlXCIsXHJcbiAgICAgICAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSxcclxuICAgICAgICAgICAgcGFuZWxDbGFzczogXCJyZXBvcnQtZGlhbG9nXCIsXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgLmFmdGVyQ2xvc2VkKClcclxuICAgICAgICAgIC5zdWJzY3JpYmUoKGUpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFlKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHsgcHVzaF9idG4sIHBvcnRsZXQsIGRhc2hib2FyZCB9ID0gZTtcclxuICAgICAgICAgICAgdGhpcy5kYXNoYm9hcmQgPSBjbG9uZURlZXAoZGFzaGJvYXJkKTtcclxuICAgICAgICAgICAgdGhpcy5wb3J0bGV0ID0gY2xvbmVEZWVwKHBvcnRsZXQpO1xyXG4gICAgICAgICAgICB0aGlzLnB1c2hfYnRuID0gcHVzaF9idG47XHJcbiAgICAgICAgICAgIHRoaXMuZGFzaGJvYXJkU2VydmljZS51cGRhdGVEYXRhbWFydEVudGl0eS5uZXh0KHRoaXMuZGFzaGJvYXJkKTtcclxuICAgICAgICAgICAgdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcclxuICAgICAgdGhpcy5kYXNoYm9hcmRTZXJ2aWNlLmdldERvd25sb2FkRGFzaGJvcmQoKS5zdWJzY3JpYmUoKGlkKSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuZGFzaGJvYXJkICYmIHRoaXMuZGFzaGJvYXJkLmlkID09PSBpZCkge1xyXG4gICAgICAgICAgLy8gdGhpcy5kb3dubG9hZEFsbCgpO1xyXG4gICAgICAgICAgZm9yIChsZXQgaXRlbSBvZiB0aGlzLkFjdGl2ZURhc2hib2FyZFBvcnRsZXRzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZG93bmxvYWQoaXRlbSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxyXG4gICAgICB0aGlzLmRhc2hib2FyZFNlcnZpY2UuZ2V0YWRkcG9ydGxldCgpLnN1YnNjcmliZSgoaWQpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5kYXNoYm9hcmQgJiYgdGhpcy5kYXNoYm9hcmQuaWQgPT09IGlkKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5wb3J0bGV0KSB7XHJcbiAgICAgICAgICAgIHRoaXMucG9ydGxldHMucHVzaCh0aGlzLnBvcnRsZXQpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGxldCBjb25maWc6IGFueSA9XHJcbiAgICAgICAgICAgIHRoaXMucG9ydGxldC5jb25maWcgaW5zdGFuY2VvZiBTdHJpbmdcclxuICAgICAgICAgICAgICA/IEpTT04ucGFyc2UodGhpcy5wb3J0bGV0LmNvbmZpZylcclxuICAgICAgICAgICAgICA6IHRoaXMucG9ydGxldC5jb25maWc7XHJcbiAgICAgICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICBjb25maWcgPSBKU09OLnBhcnNlKGNvbmZpZyk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgcG9ydGxldFR5cGUgPVxyXG4gICAgICAgICAgICBjb25maWcucG9ydGxldFR5cGUgPT09IFwiaGlzdG9yaWNhbElSUlwiXHJcbiAgICAgICAgICAgICAgPyBjb25maWcuc2VsZWN0ZWRWaXN1YWxUeXBlXHJcbiAgICAgICAgICAgICAgOiBjb25maWcucG9ydGxldFR5cGU7XHJcblxyXG4gICAgICAgICAgLy8g5Y+q5pyJ5paw5aKe55qEUG9ybGV05piv5Zu+6KGo57G75omN6ZyA6KaB5Yid5aeL5YyWXHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHRoaXMucG9ydGxldCAmJlxyXG4gICAgICAgICAgICB0aGlzLnBvcnRsZXQuY29uZmlnICYmXHJcbiAgICAgICAgICAgIFtcIm5ld2NvbHVtblwiLCBcIm5ld2xpbmVcIiwgXCJuZXdjb2x1bW5saW5lXCJdLmluY2x1ZGVzKHBvcnRsZXRUeXBlKVxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdENoYXJEYXRhKCk7IC8vIOaLvOaOpUNoYXJ06ZyA6KaB55So55qE5pWw5o2u5rqQXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmdldE5ld1Bvc2l0aW9uKCk7XHJcbiAgICAgICAgICB0aGlzLnNldEFjdGl2ZURhc2hib2FyZFBvcnRsZXRzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxyXG4gICAgICB0aGlzLmRhc2hib2FyZFNlcnZpY2UuZ2V0TGVmdE1lbnVCYXIoKS5zdWJzY3JpYmUoKG9wZW4pID0+IHtcclxuICAgICAgICBsZXQgd2lkdGggPSB0aGlzLnBhbmVzTGlzdC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgICAgIGlmIChvcGVuKSB7XHJcbiAgICAgICAgICB0aGlzLnBhbmVzTGlzdC5uYXRpdmVFbGVtZW50LnN0eWxlLndpZHRoID0gd2lkdGggLSAxOTUgKyBcInB4XCI7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMucGFuZXNMaXN0Lm5hdGl2ZUVsZW1lbnQuc3R5bGUud2lkdGggPSB3aWR0aCArIDE5NSArIFwicHhcIjtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgQGRlYm91bmNlKDEwMClcclxuICBwcml2YXRlIGZpbHRlckRhdGEoaWQpIHtcclxuICAgIHRoaXMuY2hhcnRVcGRhdGUoaWQpO1xyXG4gIH1cclxuXHJcbiAgY2hhcnRVcGRhdGUoaWQ/OiBzdHJpbmcpIHtcclxuICAgIHRoaXMuaGFzQ2hhbmdlRGF0YVRhYmxlID0gdHJ1ZTtcclxuICAgIGlmIChpZCkge1xyXG4gICAgICB0aGlzLmRhc2hib2FyZFNlcnZpY2UuY2hhcnRVcGRhdGUubmV4dChpZCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmluaXRDaGFyRGF0YSgpOyAvLyDmi7zmjqVDaGFydOmcgOimgeeUqOeahOaVsOaNrua6kFxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaCgoc3ViKSA9PiB7XHJcbiAgICAgIHN1Yi51bnN1YnNjcmliZSgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHByaXZhdGUgZ2V0SW5mbygpIHtcclxuICAgIHRoaXMudHJhbnNsYXRpb24gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwidHJhbnNsYXRpb25cIikpO1xyXG4gICAgdGhpcy5sYW5nID0gdGhpcy5wYmYuZ2V0TGFuZ3VhZ2VQYXJhbXMoKTtcclxuICAgIHRoaXMuZGF0ZVBpcGVGb3JtYXQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImRhdGVQaXBlXCIpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFBvcmxldENvbmZpZyhwb3J0bGV0KSB7XHJcbiAgICBpZiAoIXBvcnRsZXQuY29uZmlnKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGNvbmZpZyA9IEpTT04ucGFyc2UocG9ydGxldC5jb25maWcpO1xyXG4gICAgaWYgKCFjb25maWcucHZ0YWJsZUNoYXJ0U2V0dGluZykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnNob3dMZWdlbmQgPVxyXG4gICAgICAhIWNvbmZpZy5wdnRhYmxlQ2hhcnRTZXR0aW5nLmNoYXJ0U2V0dGluZ3MubGVnZW5kU2V0dGluZ3MudmlzaWJsZTtcclxuICAgIHRoaXMuZW5hYmxlTXVsdGlwbGVBeGlzID1cclxuICAgICAgY29uZmlnLnB2dGFibGVDaGFydFNldHRpbmcuY2hhcnRTZXR0aW5ncy5lbmFibGVNdWx0aXBsZUF4aXM7XHJcbiAgICB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZVRoZW1lKGUpIHtcclxuICAgIGNvbnN0IHtcclxuICAgICAgc2VsZWN0ZWRYLFxyXG4gICAgICBzZWxlY3RlZFksXHJcbiAgICAgIHNlbGVjdGVkU2Vjb25kWSxcclxuICAgICAgc2VsZWN0ZWRNdWx0aXBsZXMsXHJcbiAgICAgIHNlbGVjdFRoZW1lLFxyXG4gICAgfSA9IGU7XHJcbiAgICB0aGlzLnNlbGVjdGVkWCA9IHNlbGVjdGVkWDtcclxuICAgIHRoaXMuc2VsZWN0ZWRZID0gc2VsZWN0ZWRZO1xyXG4gICAgdGhpcy5zZWxlY3RlZFNlY29uZFkgPSBzZWxlY3RlZFNlY29uZFk7XHJcbiAgICB0aGlzLnNlbGVjdGVkTXVsdGlwbGVzID0gc2VsZWN0ZWRNdWx0aXBsZXM7XHJcbiAgICB0aGlzLnNlbGVjdFRoZW1lID0gc2VsZWN0VGhlbWU7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVEYXNoYm9hcmQoZSkge1xyXG4gICAgY29uc3QgeyBwb3J0bGV0cywgZGFzaGJvYXJkLCBub0RldGVjdCwgc3RheUFjdGl2ZVRhYiB9ID0gZTtcclxuICAgIHRoaXMuc3RheUFjdGl2ZVRhYiA9IHN0YXlBY3RpdmVUYWI7XHJcbiAgICB0aGlzLmRhc2hib2FyZCA9IGNsb25lRGVlcChkYXNoYm9hcmQpO1xyXG4gICAgdGhpcy5wb3J0bGV0cyA9IFsuLi5wb3J0bGV0c107XHJcbiAgICBpZiAoIW5vRGV0ZWN0KSB7XHJcbiAgICAgIHRoaXMucmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgfVxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuZGFzaGJvYXJkU2VydmljZS51cGRhdGVEYXRhbWFydEVudGl0eS5uZXh0KGRhc2hib2FyZCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZVBvcmxldENvbmZpZyhlKSB7XHJcbiAgICBjb25zdCB7IG5ld0lkLCBjb25maWcgfSA9IGU7XHJcbiAgICBjb25zdCBfY29uZmlnID0gT2JqZWN0LmFzc2lnbih7fSwgY29uZmlnKTtcclxuICAgIHRoaXMucG9ydGxldC5jb25maWcgPSBDaXJjdWxhckpTT04uc3RyaW5naWZ5KF9jb25maWcpO1xyXG4gICAgdGhpcy5wb3J0bGV0cy5mb3JFYWNoKChwb3J0bGV0LCBpKSA9PiB7XHJcbiAgICAgIGlmIChwb3J0bGV0Lm5ld0lkID09PSBuZXdJZCkge1xyXG4gICAgICAgIHRoaXMucG9ydGxldHNbaV0uY29uZmlnID0gQ2lyY3VsYXJKU09OLnN0cmluZ2lmeShfY29uZmlnKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnBvcnRsZXRzID0gWy4uLnRoaXMucG9ydGxldHNdO1xyXG4gICAgdGhpcy5zZXRBY3RpdmVEYXNoYm9hcmRQb3J0bGV0cygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGVkaXQoaXRlbSkge1xyXG4gICAgY29uc3QgY29uZmlnID0gSlNPTi5wYXJzZShpdGVtLmNvbmZpZyk7XHJcbiAgICBjb25zdCBwb3J0bGV0VHlwZSA9XHJcbiAgICAgIGNvbmZpZy5wb3J0bGV0VHlwZSA9PT0gXCJoaXN0b3JpY2FsSVJSXCJcclxuICAgICAgICA/IGNvbmZpZy5zZWxlY3RlZFZpc3VhbFR5cGVcclxuICAgICAgICA6IGNvbmZpZy5wb3J0bGV0VHlwZTtcclxuICAgIGlmIChbXCJuZXdjb2x1bW5cIiwgXCJuZXdsaW5lXCIsIFwibmV3Y29sdW1ubGluZVwiXS5pbmNsdWRlcyhwb3J0bGV0VHlwZSkpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZFkgPSBjb25maWdbXCJzZWxlY3RlZFlcIl07XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRTZWNvbmRZID0gY29uZmlnLnNlbGVjdGVkU2Vjb25kWTtcclxuICAgICAgdGhpcy5zZWxlY3RlZFggPSBjb25maWdbXCJzZWxlY3RlZFhcIl07XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRNdWx0aXBsZXMgPSBjb25maWdbXCJzZWxlY3RlZE11bHRpcGxlc1wiXTtcclxuICAgICAgdGhpcy5zZWxlY3RUaGVtZSA9IGNvbmZpZ1tcInNlbGVjdFRoZW1lXCJdO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wb3J0bGV0ID0gY2xvbmVEZWVwKGl0ZW0pO1xyXG4gICAgaWYgKHRoaXMucHVzaF9idG4pIHtcclxuICAgICAgdGhpcy5zaWRlYmFyLnBvcnRsZXQgPSB0aGlzLnBvcnRsZXQ7XHJcbiAgICB9XHJcbiAgICB0aGlzLmRhc2hib2FyZF9zaWRlYmFyID0gdHJ1ZTtcclxuICAgIHRoaXMucHVzaF9idG4gPSB0cnVlO1xyXG4gICAgdGhpcy5maWd1cmVDb2RlID0gaXRlbS5maWd1cmVDb2RlO1xyXG4gICAgdGhpcy50YWJhY3RpdmUgPSBmYWxzZTtcclxuICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgIHRoaXMuZGFzaGJvYXJkU2VydmljZS5wb3J0bGV0RWRpdC5uZXh0KHRoaXMudXJsX2lkKTtcclxuICB9XHJcblxyXG4gIEBkZWJvdW5jZSgzMDApXHJcbiAgR2V0Z2FkZ2V0VGl0bGUoY29uZmlnKSB7XHJcbiAgICBpZiAoY29uZmlnICYmIGNvbmZpZyAhPT0gXCJudWxsXCIpIHtcclxuICAgICAgbGV0IGNvbmZpZ18gPSBKU09OLnBhcnNlKGNvbmZpZyk7XHJcbiAgICAgIHJldHVybiBjb25maWdfLmdhZGdldFRpdGxlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0UG9ydGxldFR5cGUoaXRlbSkge1xyXG4gICAgY29uc3QgY29uZmlnID0gaXRlbSAmJiBpdGVtLmNvbmZpZyA/IEpTT04ucGFyc2UoaXRlbS5jb25maWcpIDoge307XHJcbiAgICBpZiAoY29uZmlnLnBvcnRsZXRUeXBlKSB7XHJcbiAgICAgIGlmIChjb25maWcucG9ydGxldFR5cGUgPT09IFwiaGlzdG9yaWNhbElSUlwiKSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbmZpZy5zZWxlY3RlZFZpc3VhbFR5cGU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGNvbmZpZy5wb3J0bGV0VHlwZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBkZWxldGUoaXRlbSkge1xyXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnBvcnRsZXRzLmZpbmRJbmRleCgoeCkgPT4geC5uZXdJZCA9PT0gaXRlbS5uZXdJZCk7XHJcbiAgICB0aGlzLmRhc2hib2FyZExheW91dC5yZW1vdmVQYW5lbChpdGVtLm5ld0lkKTtcclxuICAgIHRoaXMucG9ydGxldHMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgIHRoaXMuc2V0QWN0aXZlRGFzaGJvYXJkUG9ydGxldHMoKTtcclxuICAgIHRoaXMuZ2V0TmV3UG9zaXRpb24oKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjb3B5UG9ydGxldChpdGVtKSB7XHJcbiAgICBjb25zdCBwb3J0bGV0ID0geyAuLi5pdGVtIH07XHJcbiAgICBwb3J0bGV0LmlkID0gXCIwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDBcIjtcclxuICAgIHBvcnRsZXQubmV3SWQgPSBcInBvcnRsZXRfXCIgKyB0aGlzLnBiZi5HdWlkKCk7XHJcbiAgICAvLyDlpITnkIYgMS7lpI3liLbliKvnmoTlpI3liLbkvZMgIDIu5paw5bu655qE5Liq5L2TIDMu5bey5a2Y5Zyo55qE5Liq5L2TXHJcbiAgICBwb3J0bGV0LmNvcHlJZCA9IHBvcnRsZXQuY29weUlkXHJcbiAgICAgID8gcG9ydGxldC5jb3B5SWRcclxuICAgICAgOiBpdGVtLmlkID09PSBcIjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMFwiXHJcbiAgICAgID8gaXRlbS5uZXdJZFxyXG4gICAgICA6IGl0ZW0uaWQ7XHJcbiAgICB0aGlzLkRhc2hib2FyZFBvcmxldHNTZXJ2aWNlLnBvcnRsZXREYXRhX05ld1t0aGlzLmRhc2hib2FyZC5pZF1bXHJcbiAgICAgIHBvcnRsZXQubmV3SWRcclxuICAgIF0gPSBjbG9uZURlZXAoXHJcbiAgICAgIHRoaXMuRGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UucG9ydGxldERhdGFfTmV3W3RoaXMuZGFzaGJvYXJkLmlkXVtcclxuICAgICAgICBwb3J0bGV0LmNvcHlJZFxyXG4gICAgICBdXHJcbiAgICApO1xyXG4gICAgdGhpcy5wb3J0bGV0cy5wdXNoKHBvcnRsZXQpO1xyXG4gICAgdGhpcy5zZXRBY3RpdmVEYXNoYm9hcmRQb3J0bGV0cygpO1xyXG4gICAgdGhpcy5nZXROZXdQb3NpdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEFzb2ZkYXRlKGl0ZW0pIHtcclxuICAgIHJldHVybiBKU09OLnBhcnNlKGl0ZW0uY29uZmlnKS5hc09mRGF0ZTtcclxuICB9XHJcbiAgcHVibGljIGdldEN1cnJlbmN5KGNvbmZpZykge1xyXG4gICAgcmV0dXJuIEpTT04ucGFyc2UoY29uZmlnKS5jdXJyZW5jeUNvZGU7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXRGaWd1cmVjb2RlKGZpZ3VyZUNvZGUpIHtcclxuICAgIHN3aXRjaCAoZmlndXJlQ29kZSkge1xyXG4gICAgICBjYXNlIFwiVGFza3NcIjpcclxuICAgICAgICByZXR1cm4gMTtcclxuICAgICAgY2FzZSBcIkZ1bmRMaXN0XCI6XHJcbiAgICAgICAgcmV0dXJuIDI7XHJcbiAgICAgIGNhc2UgXCJJUlJcIjpcclxuICAgICAgICByZXR1cm4gMztcclxuICAgICAgY2FzZSBcIk5vdGVzXCI6XHJcbiAgICAgICAgcmV0dXJuIDQ7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXRUYWJsZU5hbWUoaXRlbSkge1xyXG4gICAgbGV0IGNvbmZpZyA9IGl0ZW0uY29uZmlnID8gSlNPTi5wYXJzZShpdGVtLmNvbmZpZykgOiB7fTtcclxuICAgIGlmIChjb25maWcucG9ydGxldFR5cGUpIHtcclxuICAgICAgbGV0IHR5cGVMaXN0ID0gW1widGFibGVcIiwgXCJmaW5hbmNpYWxUYWJsZVwiLCBcInRyYW5zcG9zZVwiLCBcInBpdm90XCJdO1xyXG4gICAgICBsZXQgaWR4ID0gdHlwZUxpc3QuaW5kZXhPZihjb25maWcucG9ydGxldFR5cGUpO1xyXG4gICAgICByZXR1cm4gaWR4ID4gLTEgPyB0cnVlIDogZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcHVzaFNsaWRlcigpIHtcclxuICAgIHRoaXMucHVzaF9idG4gPSAhdGhpcy5wdXNoX2J0bjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RmlndXJlQ29kZShmaWd1cmVDb2RlKSB7XHJcbiAgICBsZXQgY29kZUFyciA9IFtcIlRhc2tzXCIsIFwiRnVuZExpc3RcIiwgXCJJUlJcIiwgXCJOb3Rlc1wiXTtcclxuICAgIGxldCBpID0gY29kZUFyci5pbmRleE9mKGZpZ3VyZUNvZGUpO1xyXG4gICAgcmV0dXJuIGkgPiAtMSA/IHRydWUgOiBmYWxzZTtcclxuICB9XHJcbiAgeDtcclxuICB5O1xyXG5cclxuICBwdWJsaWMgZ2V0RGFzaGJvYXJkKCkge1xyXG4gICAgdGhpcy51cmwgPSBcImRhc2hib2FyZERldGFpbFwiO1xyXG4gICAgbGV0IHVybF9hcnIgPSB0aGlzLnBiZi5nZXRSb3V0ZXJVcmwoKS5zcGxpdChcIj9cIik7XHJcbiAgICB0aGlzLnVybF9pZCA9IHRoaXMucGJmLmdldFVybElkKHVybF9hcnJbMF0pO1xyXG4gICAgdGhpcy51cmxfdHlwZSA9XHJcbiAgICAgIHVybF9hcnJbMV0gPT0gXCJkYXNoYm9hcmRUeXBlPWN1c3RvbWl6ZWRCZXRhXCJcclxuICAgICAgICA/IFwiY3VzdG9taXplZEJldGFcIlxyXG4gICAgICAgIDogdXJsX2FyclsxXSA9PSBcImRhc2hib2FyZFR5cGU9c2hhcmVkQmV0YVwiXHJcbiAgICAgICAgPyBcInNoYXJlZEJldGFcIlxyXG4gICAgICAgIDogXCJcIjtcclxuICAgIHRoaXMuRGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UuR2V0RGFzaGJvYXJkVjEoXHJcbiAgICAgIHRoaXMudXJsX2lkLFxyXG4gICAgICB0cnVlLFxyXG4gICAgICAocmVzLCBwb3J0bGV0cyA9IFtdKSA9PiB7XHJcbiAgICAgICAgdGhpcy5oYXNJbml0ID0gdHJ1ZTtcclxuICAgICAgICBpZiAoIXJlcykge1xyXG4gICAgICAgICAgdGhpcy5wYmYucGFnZUxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMucGJmLnBhZ2VMb2FkaW5nXy5uZXh0KHRydWUpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnBvcnRsZXRzID0gWy4uLnBvcnRsZXRzXTtcclxuICAgICAgICB0aGlzLmluaXRsYXlvdXQoZmFsc2UsIHRydWUpO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5kYXNoYm9hcmRTZXJ2aWNlLnVwZGF0ZURhdGFtYXJ0RW50aXR5Lm5leHQodGhpcy5kYXNoYm9hcmQpO1xyXG4gICAgICAgICAgLy8gdGhpcy5jaGFydFVwZGF0ZSgpO1xyXG4gICAgICAgICAgdGhpcy5wYmYucGFnZUxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMucGJmLnBhZ2VMb2FkaW5nXy5uZXh0KHRydWUpO1xyXG4gICAgICAgIH0sIDUwMCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGZhbHNlLFxyXG4gICAgICAocmVzKSA9PiB7XHJcbiAgICAgICAgdGhpcy5kYXNoYm9hcmQgPSBPYmplY3QuYXNzaWduKHt9LCByZXMpO1xyXG4gICAgICAgIGlmICh0aGlzLmRhc2hib2FyZExheW91dCkge1xyXG4gICAgICAgICAgdGhpcy5kYXNoYm9hcmRMYXlvdXQucmVmcmVzaCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG4gIHB1YmxpYyByb3V0ZXJQYWdlKCkge1xyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChcIi9wYWdlcy9kYXNoYm9hcmQvZGFzaGJvYXJkbGlzdFwiKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkaXNwbGF5SWNvblByb21wdChpdGVtKSB7XHJcbiAgICByZXR1cm4gSlNPTi5wYXJzZShpdGVtLmNvbmZpZykucG9ydGxldFR5cGUgfHxcclxuICAgICAgdGhpcy5nZXRGaWd1cmVDb2RlKGl0ZW0uZmlndXJlQ29kZSlcclxuICAgICAgPyBmYWxzZVxyXG4gICAgICA6IHRydWU7XHJcbiAgfVxyXG4gIHB1YmxpYyBhc3luYyBjb25maWd1cmF0aW9ucyhpdGVtLCBldmVudCkge1xyXG4gICAgY29uc3QgcG9ydGxldFR5cGUgPSB0aGlzLmdldFBvcnRsZXRUeXBlKGl0ZW0pO1xyXG4gICAgc3dpdGNoIChwb3J0bGV0VHlwZSkge1xyXG4gICAgICBjYXNlIFwidGFibGVcIjpcclxuICAgICAgICBjb25zdCB0YWJsZSA9IGZpbmQoXHJcbiAgICAgICAgICAodGhpcy50YWJsZSBhcyBhbnkpLl9yZXN1bHRzLFxyXG4gICAgICAgICAgKGVsKSA9PiBlbC5wb3J0bGV0Lm5ld0lkID09PSBpdGVtLm5ld0lkXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICB0YWJsZS5ncmlkICYmXHJcbiAgICAgICAgICB0YWJsZS5ncmlkLmdldEN1cnJlbnRWaWV3UmVjb3JkcygpICYmXHJcbiAgICAgICAgICB0YWJsZS5ncmlkLmdldEN1cnJlbnRWaWV3UmVjb3JkcygpLmxlbmd0aFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgLy8gbGV0IG1hc2s6IGFueSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjcGl2b3QtdGFibGUtbWFza1wiKTtcclxuICAgICAgICAgIC8vIGlmIChtYXNrKSBtYXNrLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XHJcbiAgICAgICAgICBsZXQgX3kgPSAwO1xyXG4gICAgICAgICAgaWYgKGV2ZW50ICYmIGV2ZW50LnRhcmdldCkge1xyXG4gICAgICAgICAgICBjb25zdCB7IHkgfSA9IGV2ZW50LnRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgaWYgKGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0IC0geSA8IDQwMCkge1xyXG4gICAgICAgICAgICAgIF95ID0gLTQxNTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGFibGUuZ3JpZCAmJlxyXG4gICAgICAgICAgICB0YWJsZS5ncmlkLmNvbHVtbkNob29zZXJNb2R1bGUgJiZcclxuICAgICAgICAgICAgdGFibGUuZ3JpZC5jb2x1bW5DaG9vc2VyTW9kdWxlLm9wZW5Db2x1bW5DaG9vc2VyKDIwMCwgX3kpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcIm5ld2NoYXJ0XCI6XHJcbiAgICAgIGNhc2UgXCJwaXZvdFwiOlxyXG4gICAgICAgIGNvbnN0IHBpdm90ID0gZmluZChcclxuICAgICAgICAgICh0aGlzLnBpdm90IGFzIGFueSkuX3Jlc3VsdHMsXHJcbiAgICAgICAgICAoZWwpID0+IGVsLnBvcnRsZXQubmV3SWQgPT09IGl0ZW0ubmV3SWRcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIHBpdm90LmZpZWxkbGlzdE9iai5kaWFsb2dSZW5kZXJlciAmJlxyXG4gICAgICAgICAgcGl2b3QuZmllbGRsaXN0T2JqLmRpYWxvZ1JlbmRlcmVyLmZpZWxkTGlzdERpYWxvZ1xyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgcGl2b3QuZmllbGRsaXN0T2JqLmRpYWxvZ1JlbmRlcmVyLmZpZWxkTGlzdERpYWxvZy5zaG93KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFwidHJhbnNwb3NlXCI6XHJcbiAgICAgICAgY29uc3QgdHJhbnNwb3NlID0gZmluZChcclxuICAgICAgICAgICh0aGlzLnRyYW5zcG9zZSBhcyBhbnkpLl9yZXN1bHRzLFxyXG4gICAgICAgICAgKGVsKSA9PiBlbC5wb3J0bGV0Lm5ld0lkID09PSBpdGVtLm5ld0lkXHJcbiAgICAgICAgKTtcclxuICAgICAgICAvLyDlvIDlkK/pgILphY0g5omL5Yqo57yp5bCPXHJcbiAgICAgICAgdHJhbnNwb3NlLmdyaWQuY29sdW1uQ2hvb3Nlck1vZHVsZS5zaG93Q3VzdG9tQ29sdW1uQ2hvb3NlcigpO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgbGV0IGRsZzogYW55ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcclxuICAgICAgICAgICAgXCIuZS1yZXNjb2x1bW5jaG9vc2VyZGl2LmUtcmVzcG9uc2l2ZS1kaWFsb2dcIlxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGlmIChkbGcpIHtcclxuICAgICAgICAgICAgZGxnLnN0eWxlLm9wYWNpdHkgPSAxO1xyXG4gICAgICAgICAgICBkbGcuc3R5bGUuc2V0UHJvcGVydHkoXCJ3aWR0aFwiLCBcIjMwMHB4XCIsIFwiaW1wb3J0YW50XCIpO1xyXG4gICAgICAgICAgICBkbGcuc3R5bGUuc2V0UHJvcGVydHkoXCJoZWlnaHRcIiwgXCIzNTBweFwiLCBcImltcG9ydGFudFwiKTtcclxuICAgICAgICAgICAgZGxnLnN0eWxlLnNldFByb3BlcnR5KFwicG9zaXRpb25cIiwgXCJhYnNvbHV0ZVwiLCBcImltcG9ydGFudFwiKTtcclxuICAgICAgICAgICAgZGxnLnN0eWxlLnNldFByb3BlcnR5KFxyXG4gICAgICAgICAgICAgIFwibGVmdFwiLFxyXG4gICAgICAgICAgICAgIGV2ZW50LmNsaWVudFggLSAxMzUgKyBcInB4XCIsXHJcbiAgICAgICAgICAgICAgXCJpbXBvcnRhbnRcIlxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBkbGcuc3R5bGUuc2V0UHJvcGVydHkoXHJcbiAgICAgICAgICAgICAgXCJ0b3BcIixcclxuICAgICAgICAgICAgICBldmVudC5jbGllbnRZICsgMzAgKyBcInB4XCIsXHJcbiAgICAgICAgICAgICAgXCJpbXBvcnRhbnRcIlxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sIDApO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRQcmV2SWQoKSB7XHJcbiAgICB0aGlzLnRhYkxpc3QuZm9yRWFjaCgodGFiLCBpKSA9PiB7XHJcbiAgICAgIGlmICh0YWIuaWQgPT09IHRoaXMuYWN0aXZlVGFiKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudGFiTGlzdFtpIC0gMV0pIHtcclxuICAgICAgICAgIHRoaXMucHJldklkID0gdGhpcy50YWJMaXN0W2kgLSAxXS5pZDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZHJvcChlKSB7XHJcbiAgICBjb25zdCB7IHByZXZpb3VzSW5kZXgsIGN1cnJlbnRJbmRleCB9ID0gZTtcclxuICAgIGNvbnN0IHByZXZJZCA9IHRoaXMudGFiTGlzdFtwcmV2aW91c0luZGV4XS5pZDtcclxuICAgIGNvbnN0IGN1cnJJZCA9IHRoaXMudGFiTGlzdFtjdXJyZW50SW5kZXhdLmlkO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSB0aGlzLnRhYkxpc3QubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgY29uc3QgdGFiSWQgPSB0aGlzLnRhYkxpc3RbaV0uaWQ7XHJcbiAgICAgIGlmICh0YWJJZCA9PT0gcHJldklkKSB7XHJcbiAgICAgICAgdGhpcy50YWJMaXN0W2ldLmlkID0gY3VycklkO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0YWJJZCA9PT0gY3VycklkKSB7XHJcbiAgICAgICAgdGhpcy50YWJMaXN0W2ldLmlkID0gcHJldklkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBmb3IgKGxldCBpID0gdGhpcy5wb3J0bGV0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICBjb25zdCBjb25maWcgPSBKU09OLnBhcnNlKHRoaXMucG9ydGxldHNbaV0uY29uZmlnKTtcclxuICAgICAgY29uc3QgdGFiSWQgPSBjb25maWcudGFiSWQ7XHJcbiAgICAgIGlmICh0YWJJZCA9PT0gcHJldklkKSB7XHJcbiAgICAgICAgY29uZmlnLnRhYklkID0gY3VycklkO1xyXG4gICAgICAgIHRoaXMucG9ydGxldHNbaV0uY29uZmlnID0gSlNPTi5zdHJpbmdpZnkoY29uZmlnKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGFiSWQgPT09IGN1cnJJZCkge1xyXG4gICAgICAgIGNvbmZpZy50YWJJZCA9IHByZXZJZDtcclxuICAgICAgICB0aGlzLnBvcnRsZXRzW2ldLmNvbmZpZyA9IEpTT04uc3RyaW5naWZ5KGNvbmZpZyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLmFjdGl2ZVRhYiA9PT0gY3VycklkKSB7XHJcbiAgICAgIHRoaXMuYWN0aXZlVGFiID0gcHJldklkO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmFjdGl2ZVRhYiA9PT0gcHJldklkKSB7XHJcbiAgICAgIHRoaXMuYWN0aXZlVGFiID0gY3VycklkO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZXRQcmV2SWQoKTtcclxuICAgIFt0aGlzLnRhYkxpc3RbcHJldmlvdXNJbmRleF0sIHRoaXMudGFiTGlzdFtjdXJyZW50SW5kZXhdXSA9IFtcclxuICAgICAgdGhpcy50YWJMaXN0W2N1cnJlbnRJbmRleF0sXHJcbiAgICAgIHRoaXMudGFiTGlzdFtwcmV2aW91c0luZGV4XSxcclxuICAgIF07XHJcbiAgICB0aGlzLnRhYkxpc3QgPSBbLi4udGhpcy50YWJMaXN0XTtcclxuXHJcbiAgICB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcbiAgY2xvc2VBbGwoKSB7XHJcbiAgICB0aGlzLnBiZi5wYWdlTG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLnBiZi5wYWdlTG9hZGluZ18ubmV4dCh0cnVlKTtcclxuICAgIHRoaXMucmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgbGV0IGhhc0NvbmZpZyA9IGZhbHNlO1xyXG4gICAgdGhpcy5BY3RpdmVEYXNoYm9hcmRQb3J0bGV0cy5mb3JFYWNoKChwb3J0bGV0KSA9PiB7XHJcbiAgICAgIGNvbnN0IHBvcnRsZXRUeXBlID0gdGhpcy5nZXRQb3J0bGV0VHlwZShwb3J0bGV0KTtcclxuICAgICAgc3dpdGNoIChwb3J0bGV0VHlwZSkge1xyXG4gICAgICAgIGNhc2UgXCJwaXZvdFwiOlxyXG4gICAgICAgIGNhc2UgXCJuZXdjaGFydFwiOlxyXG4gICAgICAgICAgY29uc3QgZG9tID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXHJcbiAgICAgICAgICAgIGAke3BvcnRsZXQubmV3SWR9X0RlZmVyVXBkYXRlQnV0dG9uMmBcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBpZiAoZG9tKSB7XHJcbiAgICAgICAgICAgIGhhc0NvbmZpZyA9IHRydWU7XHJcbiAgICAgICAgICAgIGRvbS5jbGljaygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcInRhYmxlXCI6XHJcbiAgICAgICAgICBjb25zdCBjYW5jZWxCdG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLmUtY2MtY25idG5cIik7XHJcbiAgICAgICAgICBpZiAoY2FuY2VsQnRuKSB7XHJcbiAgICAgICAgICAgIGhhc0NvbmZpZyA9IHRydWU7XHJcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICAgY2FuY2VsQnRuLmNsaWNrKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBpZiAoaGFzQ29uZmlnKSB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMucGJmLnBhZ2VMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5wYmYucGFnZUxvYWRpbmdfLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgIH0sIDQwMCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnBiZi5wYWdlTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnBiZi5wYWdlTG9hZGluZ18ubmV4dCh0cnVlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBoYXNDb25maWc7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZG93bmxvYWRBbGwoKSB7XHJcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKFBhbmVEb3dubG9hZENvbXBvbmVudCwge1xyXG4gICAgICBkYXRhOiB7XHJcbiAgICAgICAgcG9ydGxldHM6IHRoaXMucG9ydGxldHMsXHJcbiAgICAgICAgZGFzaGJvYXJkOiB0aGlzLmRhc2hib2FyZCxcclxuICAgICAgfSxcclxuICAgICAgaGVpZ2h0OiBcIjg1MHB4XCIsXHJcbiAgICAgIHdpZHRoOiBcIjU2MnB4XCIsXHJcbiAgICB9KTtcclxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzKSA9PiB7fSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZG93bmxvYWQoaXRlbSkge1xyXG4gICAgY29uc3QgcG9ydGxldFR5cGUgPSB0aGlzLmdldFBvcnRsZXRUeXBlKGl0ZW0pO1xyXG4gICAgY29uc3QgdGl0bGUgPSB0aGlzLkdldGdhZGdldFRpdGxlKGl0ZW0uY29uZmlnKTtcclxuICAgIHN3aXRjaCAocG9ydGxldFR5cGUpIHtcclxuICAgICAgY2FzZSBcInRhYmxlXCI6XHJcbiAgICAgICAgdGhpcy5kb3dubG9hZFRhYmxlKGl0ZW0sIHRpdGxlKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcIm5ld2NoYXJ0XCI6XHJcbiAgICAgIGNhc2UgXCJwaXZvdFwiOlxyXG4gICAgICAgIGNvbnN0IHBpdm90ID0gZmluZChcclxuICAgICAgICAgICh0aGlzLnBpdm90IGFzIGFueSkuX3Jlc3VsdHMsXHJcbiAgICAgICAgICAoZWwpID0+IGVsLnBvcnRsZXQubmV3SWQgPT09IGl0ZW0ubmV3SWRcclxuICAgICAgICApO1xyXG4gICAgICAgIHBpdm90LmhlYWRSb3dTcGFuID0gMDsgLy/ph43nva7lr7zlh7poZWFkZXLlpITnkIZcclxuICAgICAgICBwaXZvdC5oZWFkUm93Q291bnQgPSAwOyAvL+mHjee9ruWvvOWHumhlYWRlcuWkhOeQhlxyXG4gICAgICAgIGNvbnN0IGV4Y2VsRXhwb3J0UHJvcGVydGllc19waXZvdDogRXhjZWxFeHBvcnRQcm9wZXJ0aWVzID0ge1xyXG4gICAgICAgICAgZmlsZU5hbWU6IHRpdGxlXHJcbiAgICAgICAgICAgID8gdGl0bGUgKyBcIi54bHN4XCJcclxuICAgICAgICAgICAgOiBcIlBpdm90LVwiICsgbmV3IERhdGUoKS50b0lTT1N0cmluZygpICsgXCIueGxzeFwiLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKHBpdm90LnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy5mb3JtYXRTZXR0aW5ncykge1xyXG4gICAgICAgICAgcGl2b3QucGl2b3RPYmouZGF0YVNvdXJjZVNldHRpbmdzLmZvcm1hdFNldHRpbmdzLmZvckVhY2goXHJcbiAgICAgICAgICAgIChzZXR0aW5nKSA9PiB7XHJcbiAgICAgICAgICAgICAgLy8gc3luY2Z1c2lvbiBmb3JtYXQgdHJhbnNmb3JtIHRvIGV4Y2VsIGZvcm1hdFxyXG4gICAgICAgICAgICAgIGNvbnN0IG1hcCA9IHtcclxuICAgICAgICAgICAgICAgIFwiIywjIyMsLC4wOygjLCMjIywsLjApXCI6ICcwLjAsLFwiXCI7KDAuMCwsKScsXHJcbiAgICAgICAgICAgICAgICAnMC4wLCxcIlwiOygwLjAsLCknOiBcIiMsIyMjLCwuMDsoIywjIyMsLC4wKVwiLFxyXG4gICAgICAgICAgICAgICAgXCIjLCMjIywsOygjLCMjIywsKVwiOiAnMCwsXCJcIjsoMCwsKScsXHJcbiAgICAgICAgICAgICAgICAnMCwsXCJcIjsoMCwsKSc6IFwiIywjIyMsLDsoIywjIyMsLClcIixcclxuICAgICAgICAgICAgICAgIFwiIywjIyMsLC4wMDsoIywjIyMsLC4wMClcIjogJzAuMDAsLFwiXCI7KDAuMDAsLCknLFxyXG4gICAgICAgICAgICAgICAgJzAuMDAsLFwiXCI7KDAuMDAsLCknOiBcIiMsIyMjLCwuMDA7KCMsIyMjLCwuMDApXCIsXHJcbiAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKG1hcFtzZXR0aW5nLmZvcm1hdF0pIHtcclxuICAgICAgICAgICAgICAgIHNldHRpbmcuZm9ybWF0ID0gbWFwW3NldHRpbmcuZm9ybWF0XTtcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBzZXR0aW5nLmZvcm1hdCA9IG1hcFtzZXR0aW5nLmZvcm1hdF07XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMucmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudXBkYXRlRm9ybWF0KFxyXG4gICAgICAgICAgcGl2b3QucGl2b3RPYmouZ3JpZC5jb2x1bW5zIGFzIENvbHVtbk1vZGVsW10sXHJcbiAgICAgICAgICBwaXZvdC5waXZvdE9ialxyXG4gICAgICAgICk7XHJcbiAgICAgICAgcGl2b3QucGl2b3RPYmouZXhjZWxFeHBvcnQoZXhjZWxFeHBvcnRQcm9wZXJ0aWVzX3Bpdm90KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgLy8gY2FzZSBcInRyYW5zcG9zZVwiOlxyXG4gICAgICAvLyBcdC8vIGNvbnN0IHRyYW5zcG9zZSA9IGZpbmQoXHJcbiAgICAgIC8vIFx0Ly8gXHQodGhpcy50cmFuc3Bvc2UgYXMgYW55KS5fcmVzdWx0cyxcclxuICAgICAgLy8gXHQvLyBcdChlbCkgPT4gZWwucG9ydGxldC5uZXdJZCA9PT0gaXRlbS5uZXdJZFxyXG4gICAgICAvLyBcdC8vICk7XHJcbiAgICAgIC8vIFx0YnJlYWs7XHJcbiAgICAgIGNhc2UgXCJuZXdjb2x1bW5cIjpcclxuICAgICAgY2FzZSBcIm5ld2xpbmVcIjpcclxuICAgICAgY2FzZSBcIm5ld2NvbHVtbmxpbmVcIjpcclxuICAgICAgICBjb25zdCBjaGFydElkeCA9IHRoaXMuZ2V0Q2hhcnRJbmRleEluQWxsKGl0ZW0pO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkQ29tcG9uZW50ID0gdGhpcy5uZXdDaGFydC50b0FycmF5KClbY2hhcnRJZHhdO1xyXG4gICAgICAgIHNlbGVjdGVkQ29tcG9uZW50LmV4cG9ydENoYXJ0KCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDmoLnmja5pZHjojrflj5bngrnlh7vlm77ooajlnKjlm77ooajliJfooajph4znmoTnnJ/mraPpobrluo9cclxuICBnZXRDaGFydEluZGV4SW5BbGwoaXRlbSkge1xyXG4gICAgY29uc3QgY2hhckFyciA9IHRoaXMuQWN0aXZlRGFzaGJvYXJkUG9ydGxldHMuZmlsdGVyKChlKSA9PiB7XHJcbiAgICAgIHJldHVybiBbXCJuZXdjb2x1bW5cIiwgXCJuZXdsaW5lXCIsIFwibmV3Y29sdW1ubGluZVwiXS5pbmNsdWRlcyhcclxuICAgICAgICBKU09OLnBhcnNlKGUuY29uZmlnKS5wb3J0bGV0VHlwZVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgICBsZXQgcmVzdWx0SWR4ID0gMDtcclxuICAgIGlmIChjaGFyQXJyLmxlbmd0aCA+IDApIHtcclxuICAgICAgY2hhckFyci5mb3JFYWNoKChlLCBpZHgpID0+IHtcclxuICAgICAgICBpZiAoZS5uZXdJZCA9PSBpdGVtLm5ld0lkKSB7XHJcbiAgICAgICAgICByZXN1bHRJZHggPSBpZHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHRJZHg7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZG93bmxvYWRUYWJsZShpdGVtLCB0aXRsZSkge1xyXG4gICAgLy8gVGFibGUg5LiL6L295YWo6YOo5pWw5o2uXHJcbiAgICBsZXQgY29uZmlnID0gSlNPTi5wYXJzZShpdGVtLmNvbmZpZyk7XHJcbiAgICBsZXQgcGFnZVNldHRpbmcgPSBPYmplY3QuYXNzaWduKFxyXG4gICAgICB7XHJcbiAgICAgICAgY3VycmVudFBhZ2U6IDEsXHJcbiAgICAgICAgcGFnZVNpemU6IDk5OTk5OTksXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbmZpZyAmJiBjb25maWcudGFibGVTb3J0U2V0dGluZ1xyXG4gICAgKTtcclxuICAgIGxldCBwYXJhbXMgPSB0aGlzLkRhc2hib2FyZFBvcmxldHNTZXJ2aWNlLmdldFBhcmFtc0J5UG9ydGxldChcclxuICAgICAgaXRlbSxcclxuICAgICAgcGFnZVNldHRpbmcsXHJcbiAgICAgIG51bGwsXHJcbiAgICAgIHRoaXMuZGFzaGJvYXJkXHJcbiAgICApO1xyXG4gICAgLy8ganNvbiBidWZmZXJcclxuICAgIHRoaXMuaHR0cENsaWVudFxyXG4gICAgICAucG9zdCh0aGlzLmFwaS5iYXNldXJsICsgdGhpcy5hcGkudXJsTGlzdC5HZXRQb3J0bGV0RGF0YVYyLCBwYXJhbXMpXHJcbiAgICAgIC5zdWJzY3JpYmUoXHJcbiAgICAgICAgKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICBjb25zdCB0YWJsZSA9IGZpbmQoXHJcbiAgICAgICAgICAgICAgKHRoaXMudGFibGUgYXMgYW55KS5fcmVzdWx0cyxcclxuICAgICAgICAgICAgICAoZWwpID0+IGVsLnBvcnRsZXQubmV3SWQgPT09IGl0ZW0ubmV3SWRcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgY29uc3QgZXhjZWxFeHBvcnRQcm9wZXJ0aWVzOiBFeGNlbEV4cG9ydFByb3BlcnRpZXMgPSB7XHJcbiAgICAgICAgICAgICAgZmlsZU5hbWU6IHRpdGxlXHJcbiAgICAgICAgICAgICAgICA/IHRpdGxlICsgXCIueGxzeFwiXHJcbiAgICAgICAgICAgICAgICA6IFwiVGFibGUtXCIgKyBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgKyBcIi54bHN4XCIsXHJcbiAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICAgIGRhdGFTb3VyY2U6IHJlc3VsdC5kYXRhLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBpZiAodGFibGUpIHtcclxuICAgICAgICAgICAgICB0YWJsZS5ncmlkLmV4Y2VsRXhwb3J0KGV4Y2VsRXhwb3J0UHJvcGVydGllcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIChyZXNwb25zZSkgPT4ge30sXHJcbiAgICAgICAgKCkgPT4ge31cclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlRm9ybWF0KGNvbHVtbnM6IENvbHVtbk1vZGVsW10sIHBpdm90T2JqKSB7XHJcbiAgICB2YXIgZkxpc3QgPSBwaXZvdE9iai5yZW5kZXJNb2R1bGUuZ2V0Rm9ybWF0TGlzdCgpO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmIChcclxuICAgICAgICAoY29sdW1uc1tpXSBhcyBDb2x1bW5Nb2RlbCkuY29sdW1ucyAmJlxyXG4gICAgICAgIChjb2x1bW5zW2ldIGFzIENvbHVtbk1vZGVsKS5jb2x1bW5zLmxlbmd0aCA+IDBcclxuICAgICAgKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVGb3JtYXQoXHJcbiAgICAgICAgICAoY29sdW1uc1tpXSBhcyBDb2x1bW5Nb2RlbCkuY29sdW1ucyBhcyBDb2x1bW5Nb2RlbFtdLFxyXG4gICAgICAgICAgcGl2b3RPYmpcclxuICAgICAgICApO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIGNvbHVtbnNbaV0uY3VzdG9tQXR0cmlidXRlcyAmJlxyXG4gICAgICAgICAgZkxpc3RbKGNvbHVtbnNbaV0uY3VzdG9tQXR0cmlidXRlcy5jZWxsIGFzIElBeGlzU2V0KS5hY3R1YWxUZXh0XSA9PT1cclxuICAgICAgICAgICAgXCJOXCJcclxuICAgICAgICApIHtcclxuICAgICAgICAgIChjb2x1bW5zW2ldIGFzIENvbHVtbk1vZGVsKS5mb3JtYXQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZmllbGRGb3JtYXQoaXRlbSkge1xyXG4gICAgdGhpcy5wb3J0bGV0ID0gY2xvbmVEZWVwKGl0ZW0pO1xyXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihGaWVsZEZvcm1hdENvbXBvbmVudCwge1xyXG4gICAgICBkYXRhOiB7XHJcbiAgICAgICAgcG9ydGxldERhdGE6IGl0ZW0sXHJcbiAgICAgICAgcG9ydGxldHM6IHRoaXMucG9ydGxldHMsXHJcbiAgICAgIH0sXHJcbiAgICAgIGhlaWdodDogXCI4NTBweFwiLFxyXG4gICAgICBtaW5XaWR0aDogXCI1NjJweFwiLFxyXG4gICAgICBhdXRvRm9jdXM6IGZhbHNlLFxyXG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXHJcbiAgICAgIHBhbmVsQ2xhc3M6IFwiZGlhbG9nLXBvc2l0aW9uXCIsXHJcbiAgICB9KTtcclxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzKSA9PiB7fSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb3BlbkZpbHRlcihpdGVtKSB7XHJcbiAgICB0aGlzLnBvcnRsZXQgPSBjbG9uZURlZXAoaXRlbSk7XHJcbiAgICB0aGlzLmRhc2hib2FyZF9zaWRlYmFyID0gdHJ1ZTtcclxuICAgIHRoaXMucHVzaF9idG4gPSB0cnVlO1xyXG4gICAgdGhpcy5maWd1cmVDb2RlID0gaXRlbS5maWd1cmVDb2RlO1xyXG4gICAgdGhpcy50YWJhY3RpdmUgPSB0cnVlO1xyXG4gICAgdGhpcy5kYXNoYm9hcmRTZXJ2aWNlLnBvcnRsZXRFZGl0Lm5leHQodGhpcy51cmxfaWQpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlUHVzaEJ0bihlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnB1c2hfYnRuID0gZTtcclxuICAgIHRoaXMucmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlQ3VzdG9taXplKGN1c3RvbWl6ZWQpIHtcclxuICAgIHRoaXMuY3VzdG9taXplZCA9IGN1c3RvbWl6ZWQ7XHJcbiAgICB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVNpZGViYXIoYm9vbCkge1xyXG4gICAgdGhpcy5kYXNoYm9hcmRfc2lkZWJhciA9IGJvb2w7XHJcbiAgICB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIG9uVG9nZ2xlVGFiYWN0aXZlKGJvb2wpIHtcclxuICAgIHRoaXMudGFiYWN0aXZlID0gYm9vbDtcclxuICAgIHRoaXMucmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlUG9ybGV0KHBvcnRsZXQpIHtcclxuICAgIGlmICghcG9ydGxldCkge1xyXG4gICAgICB0aGlzLnBvcnRsZXQgPSBudWxsO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnBvcnRsZXQgPSBjbG9uZURlZXAocG9ydGxldCk7XHJcbiAgICB0aGlzLnBvcnRsZXRzLmZvckVhY2goKF9wb3J0bGV0LCBpKSA9PiB7XHJcbiAgICAgIGlmIChfcG9ydGxldC5uZXdJZCA9PT0gcG9ydGxldC5uZXdJZCkge1xyXG4gICAgICAgIHRoaXMucG9ydGxldHNbaV0gPSBPYmplY3QuYXNzaWduKHt9LCBwb3J0bGV0KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnBvcnRsZXRzID0gWy4uLnRoaXMucG9ydGxldHNdO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFkZFBvcmxldCgpIHtcclxuICAgIHRoaXMucHVzaF9idG4gPSB0cnVlO1xyXG4gICAgdGhpcy5kYXNoYm9hcmRfc2lkZWJhciA9IHRydWU7XHJcbiAgICB0aGlzLnBvcnRsZXQgPSBudWxsO1xyXG4gICAgdGhpcy50YWJhY3RpdmUgPSBmYWxzZTtcclxuICAgIHRoaXMuZGFzaGJvYXJkU2VydmljZS5jcmVhdGVfYnRuLm5leHQodGhpcy51cmxfaWQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsb3NlU2lkZWJhcihlKSB7XHJcbiAgICB0aGlzLmRhc2hib2FyZF9zaWRlYmFyID0gZmFsc2U7XHJcbiAgICB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIHJlc2l6ZVN0b3AoYXJncykge1xyXG4gICAgdGhpcy5nZXROZXdQb3NpdGlvbigpO1xyXG4gICAgaWYgKGFyZ3MuZWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiLmUtZ3JpZFwiKSkge1xyXG4gICAgICBjb25zdCB0YWJsZSA9IGZpbmQoXHJcbiAgICAgICAgKHRoaXMudGFibGUgYXMgYW55KS5fcmVzdWx0cyxcclxuICAgICAgICAoZWwpID0+IGVsLnBvcnRsZXQubmV3SWQgPT09IGFyZ3MuZWxlbWVudC5pZFxyXG4gICAgICApO1xyXG4gICAgICBpZiAodGFibGUpIHtcclxuICAgICAgICB0YWJsZS5ncmlkLmhlaWdodCA9IHBhcnNlSW50KGFyZ3MuZWxlbWVudC5zdHlsZS5oZWlnaHQpIC0gODA7XHJcbiAgICAgICAgdGFibGUuZ3JpZC5yZWZyZXNoQ29sdW1ucygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGFyZ3MuZWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiLmUtcGl2b3R2aWV3XCIpKSB7XHJcbiAgICAgIGNvbnN0IHBpdm90ID0gZmluZChcclxuICAgICAgICAodGhpcy5waXZvdCBhcyBhbnkpLl9yZXN1bHRzLFxyXG4gICAgICAgIChlbCkgPT4gZWwucG9ydGxldC5uZXdJZCA9PT0gYXJncy5lbGVtZW50LmlkXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChwaXZvdCkge1xyXG4gICAgICAgIHBpdm90LnBpdm90T2JqLmxheW91dFJlZnJlc2goKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZHJhZ1N0b3AoZSkge1xyXG4gICAgdGhpcy5nZXROZXdQb3NpdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgZ2V0TmV3UG9zaXRpb24oKSB7XHJcbiAgICBjb25zdCBwZGF0YSA9IHRoaXMuZGFzaGJvYXJkTGF5b3V0LnNlcmlhbGl6ZSgpO1xyXG4gICAgdGhpcy5uZXdQb3NpdGlvbiA9IFsuLi5wZGF0YV07XHJcbiAgICB0aGlzLnBvcnRsZXRzLmZvckVhY2goKHBvcnRsZXQpID0+IHtcclxuICAgICAgcGRhdGEuZm9yRWFjaCgocCkgPT4ge1xyXG4gICAgICAgIGlmIChwb3J0bGV0Lm5ld0lkID09PSBwLmlkKSB7XHJcbiAgICAgICAgICBwb3J0bGV0ID0ge1xyXG4gICAgICAgICAgICAuLi5wb3J0bGV0LFxyXG4gICAgICAgICAgICBwb3NYOiBwLmNvbCxcclxuICAgICAgICAgICAgcG9zWTogcC5yb3csXHJcbiAgICAgICAgICAgIGNvbDogcC5jb2wsXHJcbiAgICAgICAgICAgIHJvdzogcC5yb3csXHJcbiAgICAgICAgICAgIHdpZHRoOiBwLnNpemVYLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IHAuc2l6ZVksXHJcbiAgICAgICAgICAgIHNpemVYOiBwLnNpemVYLFxyXG4gICAgICAgICAgICBzaXplWTogcC5zaXplWSxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBvcGVuU3VidG90YWwoaXRlbSkge1xyXG4gICAgdGhpcy5DdXJyZW50X1BvcnRsZXRJZCA9IGl0ZW0ubmV3SWQ7XHJcbiAgICB0aGlzLmNvbmZpZyA9IGl0ZW0uY29uZmlnID8gSlNPTi5wYXJzZShpdGVtLmNvbmZpZykgOiB7fTtcclxuICAgIHRoaXMucGl2b3RUYWJsZVN1YlRvdGFsTGlzdC5tYXAoKGVsKSA9PiB7XHJcbiAgICAgIGVsLnNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuZ2V0U2VsZWN0VG90YWxHcm91cFN0YXR1cyhcInN1YlwiKTtcclxuICAgIHRoaXMuc2hvd1N1YlRvdGFsR3JvdXAgPSAhdGhpcy5zaG93U3ViVG90YWxHcm91cDtcclxuICAgIHRoaXMuc2hvd2dyYW5kVG90YWxHcm91cCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgb3BlbkdyYW5kdG90YWwoaXRlbSkge1xyXG4gICAgdGhpcy5DdXJyZW50X1BvcnRsZXRJZCA9IGl0ZW0ubmV3SWQ7XHJcbiAgICB0aGlzLmNvbmZpZyA9IGl0ZW0uY29uZmlnID8gSlNPTi5wYXJzZShpdGVtLmNvbmZpZykgOiB7fTtcclxuICAgIHRoaXMucGl2b3RUYWJsZUdyYW5kVG90YWxMaXN0Lm1hcCgoZWwpID0+IHtcclxuICAgICAgZWwuc2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgIH0pO1xyXG4gICAgaWYgKHRoaXMuZ2V0UG9ydGxldFR5cGUoaXRlbSkgPT09IFwidGFibGVcIikge1xyXG4gICAgICB0aGlzLmdldFNlbGVjdFRvdGFsR3JvdXBTdGF0dXMoXCJ0YWJsZUdyYW5kXCIpO1xyXG4gICAgICB0aGlzLnNob3dUYWJsZUdyYW5kVG90YWxHcm91cCA9ICF0aGlzLnNob3dUYWJsZUdyYW5kVG90YWxHcm91cDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZ2V0U2VsZWN0VG90YWxHcm91cFN0YXR1cygpO1xyXG4gICAgICB0aGlzLnNob3dncmFuZFRvdGFsR3JvdXAgPSAhdGhpcy5zaG93Z3JhbmRUb3RhbEdyb3VwO1xyXG4gICAgICB0aGlzLnNob3dTdWJUb3RhbEdyb3VwID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZWxlY3RUb3RhbEdyb3VwKGluZGV4LCB0eXBlLCBpdGVtKSB7XHJcbiAgICBpZiAodGhpcy5nZXRQb3J0bGV0VHlwZShpdGVtKSA9PT0gXCJwaXZvdFwiKSB7XHJcbiAgICAgIGNvbnN0IHBpdm90ID0gZmluZChcclxuICAgICAgICAodGhpcy5waXZvdCBhcyBhbnkpLl9yZXN1bHRzLFxyXG4gICAgICAgIChlbCkgPT4gZWwucG9ydGxldC5uZXdJZCA9PT0gaXRlbS5uZXdJZFxyXG4gICAgICApO1xyXG4gICAgICBpZiAodHlwZSA9PT0gXCJzdWJcIikge1xyXG4gICAgICAgIHRoaXMuc2hvd1N1YlRvdGFsR3JvdXAgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnBpdm90VGFibGVTdWJUb3RhbExpc3QuZm9yRWFjaCgoc3VidG90YWwpID0+IHtcclxuICAgICAgICAgIHN1YnRvdGFsLnNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5waXZvdFRhYmxlU3ViVG90YWxMaXN0W2luZGV4XS5zZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgaWYgKHBpdm90LnBpdm90T2JqKSB7XHJcbiAgICAgICAgICBzd2l0Y2ggKGluZGV4KSB7XHJcbiAgICAgICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5maWVsZHMubWFwKChlbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZWwuc2hvd1N1YlRvdGFscyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgcGl2b3QucGl2b3RPYmouZGF0YVNvdXJjZVNldHRpbmdzLnNob3dTdWJUb3RhbHMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHBpdm90LnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy5zaG93Um93U3ViVG90YWxzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICBwaXZvdC5waXZvdE9iai5kYXRhU291cmNlU2V0dGluZ3Muc2hvd0NvbHVtblN1YlRvdGFscyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgdGhpcy5jb25maWcuc2hvd1N1YlRvdGFscyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgdGhpcy5jb25maWcuc2hvd1Jvd1N1YlRvdGFscyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgdGhpcy5jb25maWcuc2hvd0NvbHVtblN1YlRvdGFscyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5maWVsZHMubWFwKChlbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZWwuc2hvd1N1YlRvdGFscyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIHBpdm90LnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy5zaG93U3ViVG90YWxzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgcGl2b3QucGl2b3RPYmouZGF0YVNvdXJjZVNldHRpbmdzLnNob3dSb3dTdWJUb3RhbHMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHBpdm90LnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy5zaG93Q29sdW1uU3ViVG90YWxzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zaG93U3ViVG90YWxzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgdGhpcy5jb25maWcuc2hvd1Jvd1N1YlRvdGFscyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgdGhpcy5jb25maWcuc2hvd0NvbHVtblN1YlRvdGFscyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5maWVsZHMubWFwKChlbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZWwuc2hvd1N1YlRvdGFscyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIGZvciAobGV0IGdpdGVtIG9mIHRoaXMuY29uZmlnLnhheGlzLmdyb3Vwcykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmNvbmZpZy5maWVsZHMuZmlsdGVyKFxyXG4gICAgICAgICAgICAgICAgICAoZmwpID0+IGZsLmNvbE5hbWUgPT09IGdpdGVtLm5hbWVcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZmllbGQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICBmaWVsZFswXS5zaG93U3ViVG90YWxzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgcGl2b3QucGl2b3RPYmouZGF0YVNvdXJjZVNldHRpbmdzLnNob3dTdWJUb3RhbHMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHBpdm90LnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy5zaG93Um93U3ViVG90YWxzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICBwaXZvdC5waXZvdE9iai5kYXRhU291cmNlU2V0dGluZ3Muc2hvd0NvbHVtblN1YlRvdGFscyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIHRoaXMuY29uZmlnLnNob3dTdWJUb3RhbHMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHRoaXMuY29uZmlnLnNob3dSb3dTdWJUb3RhbHMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHRoaXMuY29uZmlnLnNob3dDb2x1bW5TdWJUb3RhbHMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAzOlxyXG4gICAgICAgICAgICAgIHRoaXMuY29uZmlnLmZpZWxkcy5tYXAoKGVsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBlbC5zaG93U3ViVG90YWxzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgaXRlbSBvZiB0aGlzLmNvbmZpZy5jb2x1bW5Hcm91cCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmNvbmZpZy5maWVsZHMuZmlsdGVyKFxyXG4gICAgICAgICAgICAgICAgICAoZmwpID0+IGZsLmNvbE5hbWUgPT09IGl0ZW0ubmFtZVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIGlmIChmaWVsZC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIGZpZWxkWzBdLnNob3dTdWJUb3RhbHMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBwaXZvdC5waXZvdE9iai5kYXRhU291cmNlU2V0dGluZ3Muc2hvd1N1YlRvdGFscyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgcGl2b3QucGl2b3RPYmouZGF0YVNvdXJjZVNldHRpbmdzLnNob3dSb3dTdWJUb3RhbHMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICBwaXZvdC5waXZvdE9iai5kYXRhU291cmNlU2V0dGluZ3Muc2hvd0NvbHVtblN1YlRvdGFscyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgdGhpcy5jb25maWcuc2hvd1N1YlRvdGFscyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgdGhpcy5jb25maWcuc2hvd1Jvd1N1YlRvdGFscyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIHRoaXMuY29uZmlnLnNob3dDb2x1bW5TdWJUb3RhbHMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNob3dncmFuZFRvdGFsR3JvdXAgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnBpdm90VGFibGVHcmFuZFRvdGFsTGlzdC5mb3JFYWNoKChncmFuZHRvdGFsKSA9PiB7XHJcbiAgICAgICAgICBncmFuZHRvdGFsLnNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5waXZvdFRhYmxlR3JhbmRUb3RhbExpc3RbaW5kZXhdLnNlbGVjdGVkID0gdHJ1ZTtcclxuICAgICAgICBpZiAocGl2b3QucGl2b3RPYmopIHtcclxuICAgICAgICAgIHN3aXRjaCAoaW5kZXgpIHtcclxuICAgICAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgICAgIHBpdm90LnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy5zaG93R3JhbmRUb3RhbHMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHBpdm90LnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy5zaG93Um93R3JhbmRUb3RhbHMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHBpdm90LnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy5zaG93Q29sdW1uR3JhbmRUb3RhbHMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHRoaXMuY29uZmlnLnNob3dHcmFuZFRvdGFscyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgdGhpcy5jb25maWcuc2hvd1Jvd0dyYW5kVG90YWxzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zaG93Q29sdW1uR3JhbmRUb3RhbHMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgICAgcGl2b3QucGl2b3RPYmouZGF0YVNvdXJjZVNldHRpbmdzLnNob3dHcmFuZFRvdGFscyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIHBpdm90LnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy5zaG93Um93R3JhbmRUb3RhbHMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHBpdm90LnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy5zaG93Q29sdW1uR3JhbmRUb3RhbHMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHRoaXMuY29uZmlnLnNob3dHcmFuZFRvdGFscyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIHRoaXMuY29uZmlnLnNob3dSb3dHcmFuZFRvdGFscyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgdGhpcy5jb25maWcuc2hvd0NvbHVtbkdyYW5kVG90YWxzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICAgIHBpdm90LnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy5zaG93R3JhbmRUb3RhbHMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHBpdm90LnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy5zaG93Um93R3JhbmRUb3RhbHMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHBpdm90LnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy5zaG93Q29sdW1uR3JhbmRUb3RhbHMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zaG93R3JhbmRUb3RhbHMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHRoaXMuY29uZmlnLnNob3dSb3dHcmFuZFRvdGFscyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgdGhpcy5jb25maWcuc2hvd0NvbHVtbkdyYW5kVG90YWxzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgMzpcclxuICAgICAgICAgICAgICBwaXZvdC5waXZvdE9iai5kYXRhU291cmNlU2V0dGluZ3Muc2hvd0dyYW5kVG90YWxzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICBwaXZvdC5waXZvdE9iai5kYXRhU291cmNlU2V0dGluZ3Muc2hvd1Jvd0dyYW5kVG90YWxzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgcGl2b3QucGl2b3RPYmouZGF0YVNvdXJjZVNldHRpbmdzLnNob3dDb2x1bW5HcmFuZFRvdGFscyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgdGhpcy5jb25maWcuc2hvd0dyYW5kVG90YWxzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zaG93Um93R3JhbmRUb3RhbHMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zaG93Q29sdW1uR3JhbmRUb3RhbHMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAocGl2b3QucGl2b3RPYmopIHtcclxuICAgICAgICBwaXZvdC5waXZvdE9iai5yZW5kZXIoKTtcclxuICAgICAgICBpdGVtLmNvbmZpZyA9IENpcmN1bGFySlNPTi5zdHJpbmdpZnkodGhpcy5jb25maWcpO1xyXG4gICAgICAgIGNvbnN0IHBvcnRsZXRJbmRleCA9IHRoaXMucG9ydGxldHMuZmluZEluZGV4KFxyXG4gICAgICAgICAgKHgpID0+IHgubmV3SWQgPT09IGl0ZW0ubmV3SWRcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMucG9ydGxldHNbcG9ydGxldEluZGV4XSA9IGl0ZW07XHJcbiAgICAgICAgdGhpcy5kYXNoYm9hcmRTZXJ2aWNlLmNoYW5nZVBpdm90Lm5leHQoaXRlbS5uZXdJZCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHRhYmxlID0gZmluZChcclxuICAgICAgICAodGhpcy50YWJsZSBhcyBhbnkpLl9yZXN1bHRzLFxyXG4gICAgICAgIChlbCkgPT4gZWwucG9ydGxldC5uZXdJZCA9PT0gaXRlbS5uZXdJZFxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLnNob3dUYWJsZUdyYW5kVG90YWxHcm91cCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnRhYmxlR3JhbmRUb3RhbExpc3QuZm9yRWFjaCgoZ3JhbmR0b3RhbCkgPT4ge1xyXG4gICAgICAgIGdyYW5kdG90YWwuc2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMudGFibGVHcmFuZFRvdGFsTGlzdFtpbmRleF0uc2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICBpZiAodGFibGUpIHtcclxuICAgICAgICBzd2l0Y2ggKGluZGV4KSB7XHJcbiAgICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLnNob3dHcmFuZFRvdGFscyA9IHRydWU7XHJcbiAgICAgICAgICAgIHRhYmxlLmdyaWQuZWxlbWVudFxyXG4gICAgICAgICAgICAgIC5xdWVyeVNlbGVjdG9yKFwiLmUtZ3JpZGZvb3RlclwiKVxyXG4gICAgICAgICAgICAgIC5jbGFzc0xpc3QucmVtb3ZlKFwiaGlkZXN1bW1hcnlcIik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5zaG93R3JhbmRUb3RhbHMgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGFibGUuZ3JpZC5lbGVtZW50XHJcbiAgICAgICAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoXCIuZS1ncmlkZm9vdGVyXCIpXHJcbiAgICAgICAgICAgICAgLmNsYXNzTGlzdC5hZGQoXCJoaWRlc3VtbWFyeVwiKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGl0ZW0uY29uZmlnID0gQ2lyY3VsYXJKU09OLnN0cmluZ2lmeSh0aGlzLmNvbmZpZyk7XHJcbiAgICAgICAgY29uc3QgcG9ydGxldEluZGV4ID0gdGhpcy5wb3J0bGV0cy5maW5kSW5kZXgoXHJcbiAgICAgICAgICAoeCkgPT4geC5uZXdJZCA9PT0gaXRlbS5uZXdJZFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5wb3J0bGV0c1twb3J0bGV0SW5kZXhdID0gaXRlbTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0U2VsZWN0VG90YWxHcm91cFN0YXR1cyh0eXBlPykge1xyXG4gICAgaWYgKHR5cGUgPT09IFwic3ViXCIpIHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMuY29uZmlnLnNob3dTdWJUb3RhbHMgJiZcclxuICAgICAgICB0aGlzLmNvbmZpZy5zaG93Um93U3ViVG90YWxzICYmXHJcbiAgICAgICAgdGhpcy5jb25maWcuc2hvd0NvbHVtblN1YlRvdGFsc1xyXG4gICAgICApIHtcclxuICAgICAgICB0aGlzLnBpdm90VGFibGVTdWJUb3RhbExpc3RbMF0uc2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChcclxuICAgICAgICAhdGhpcy5jb25maWcuc2hvd1N1YlRvdGFscyAmJlxyXG4gICAgICAgIHRoaXMuY29uZmlnLnNob3dSb3dTdWJUb3RhbHMgJiZcclxuICAgICAgICB0aGlzLmNvbmZpZy5zaG93Q29sdW1uU3ViVG90YWxzXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRoaXMucGl2b3RUYWJsZVN1YlRvdGFsTGlzdFsxXS5zZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMuY29uZmlnLnNob3dTdWJUb3RhbHMgJiZcclxuICAgICAgICB0aGlzLmNvbmZpZy5zaG93Um93U3ViVG90YWxzICYmXHJcbiAgICAgICAgIXRoaXMuY29uZmlnLnNob3dDb2x1bW5TdWJUb3RhbHNcclxuICAgICAgKSB7XHJcbiAgICAgICAgdGhpcy5waXZvdFRhYmxlU3ViVG90YWxMaXN0WzJdLnNlbGVjdGVkID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy5jb25maWcuc2hvd1N1YlRvdGFscyAmJlxyXG4gICAgICAgICF0aGlzLmNvbmZpZy5zaG93Um93U3ViVG90YWxzICYmXHJcbiAgICAgICAgdGhpcy5jb25maWcuc2hvd0NvbHVtblN1YlRvdGFsc1xyXG4gICAgICApIHtcclxuICAgICAgICB0aGlzLnBpdm90VGFibGVTdWJUb3RhbExpc3RbM10uc2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwidGFibGVHcmFuZFwiKSB7XHJcbiAgICAgIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5zaG93R3JhbmRUb3RhbHMpIHtcclxuICAgICAgICB0aGlzLnRhYmxlR3JhbmRUb3RhbExpc3RbMF0uc2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghdGhpcy5jb25maWcuc2hvd0dyYW5kVG90YWxzKSB7XHJcbiAgICAgICAgdGhpcy50YWJsZUdyYW5kVG90YWxMaXN0WzFdLnNlbGVjdGVkID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMuY29uZmlnLnNob3dHcmFuZFRvdGFscyAmJlxyXG4gICAgICAgIHRoaXMuY29uZmlnLnNob3dSb3dHcmFuZFRvdGFscyAmJlxyXG4gICAgICAgIHRoaXMuY29uZmlnLnNob3dDb2x1bW5HcmFuZFRvdGFsc1xyXG4gICAgICApIHtcclxuICAgICAgICB0aGlzLnBpdm90VGFibGVHcmFuZFRvdGFsTGlzdFswXS5zZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKFxyXG4gICAgICAgICF0aGlzLmNvbmZpZy5zaG93R3JhbmRUb3RhbHMgJiZcclxuICAgICAgICB0aGlzLmNvbmZpZy5zaG93Um93R3JhbmRUb3RhbHMgJiZcclxuICAgICAgICB0aGlzLmNvbmZpZy5zaG93Q29sdW1uR3JhbmRUb3RhbHNcclxuICAgICAgKSB7XHJcbiAgICAgICAgdGhpcy5waXZvdFRhYmxlR3JhbmRUb3RhbExpc3RbMV0uc2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChcclxuICAgICAgICB0aGlzLmNvbmZpZy5zaG93R3JhbmRUb3RhbHMgJiZcclxuICAgICAgICB0aGlzLmNvbmZpZy5zaG93Um93R3JhbmRUb3RhbHMgJiZcclxuICAgICAgICAhdGhpcy5jb25maWcuc2hvd0NvbHVtbkdyYW5kVG90YWxzXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRoaXMucGl2b3RUYWJsZUdyYW5kVG90YWxMaXN0WzJdLnNlbGVjdGVkID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy5jb25maWcuc2hvd0dyYW5kVG90YWxzICYmXHJcbiAgICAgICAgIXRoaXMuY29uZmlnLnNob3dSb3dHcmFuZFRvdGFscyAmJlxyXG4gICAgICAgIHRoaXMuY29uZmlnLnNob3dDb2x1bW5HcmFuZFRvdGFsc1xyXG4gICAgICApIHtcclxuICAgICAgICB0aGlzLnBpdm90VGFibGVHcmFuZFRvdGFsTGlzdFszXS5zZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGluaXRDaGFyRGF0YShub0RldGVjdCA9IGZhbHNlKSB7XHJcbiAgICBpZiAoIXRoaXMuZGFzaGJvYXJkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGxldCBmaWxlc09iaiA9IHt9OyAvLyDnlKjmnaXnv7vor5FcclxuICAgIGZvciAodmFyIGkgaW4gdGhpcy5EYXNoYm9hcmRQb3JsZXRzU2VydmljZS5maWVsZHNBcnJbdGhpcy5kYXNoYm9hcmQuaWRdKSB7XHJcbiAgICAgIGlmICh0aGlzLkRhc2hib2FyZFBvcmxldHNTZXJ2aWNlLmZpZWxkc0Fyclt0aGlzLmRhc2hib2FyZC5pZF1baV0pIHtcclxuICAgICAgICB0aGlzLkRhc2hib2FyZFBvcmxldHNTZXJ2aWNlLmZpZWxkc0Fyclt0aGlzLmRhc2hib2FyZC5pZF1baV0uZm9yRWFjaChcclxuICAgICAgICAgICh0KSA9PiB7XHJcbiAgICAgICAgICAgIGZpbGVzT2JqW3QuY29sTmFtZV0gPSB0W1wibGFuZ0NvZGVcIl07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5wb3J0bGV0cy5mb3JFYWNoKChlKSA9PiB7XHJcbiAgICAgIGlmICghZS5jb25maWcpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgY29uZmlnID0gSlNPTi5wYXJzZShlLmNvbmZpZyk7XHJcbiAgICAgIC8vIOWmguaenOaYryBoaXN0b3JpY2FsSVJS77yM5qC55o2uIHZpc3VhbFR5cGUg6L+b6KGM5riy5p+TXHJcbiAgICAgIGNvbnN0IHBvcnRsZXRUeXBlID1cclxuICAgICAgICBjb25maWcucG9ydGxldFR5cGUgPT09IFwiaGlzdG9yaWNhbElSUlwiXHJcbiAgICAgICAgICA/IGNvbmZpZy5zZWxlY3RlZFZpc3VhbFR5cGVcclxuICAgICAgICAgIDogY29uZmlnLnBvcnRsZXRUeXBlO1xyXG4gICAgICBsZXQgaXNOZXdDaGFydCA9IFtcIm5ld2NvbHVtblwiLCBcIm5ld2xpbmVcIiwgXCJuZXdjb2x1bW5saW5lXCJdLmluY2x1ZGVzKFxyXG4gICAgICAgIHBvcnRsZXRUeXBlXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBpZiAoaXNOZXdDaGFydCkge1xyXG4gICAgICAgIGxldCBkYXRhQ29sdW1uID0gW107XHJcbiAgICAgICAgbGV0IGRhdGFMaW5lID0gW107XHJcbiAgICAgICAgbGV0IHlYaWFzID0gW107XHJcbiAgICAgICAgbGV0IHNlY29uZFlYaWFzID0gW107XHJcbiAgICAgICAgLy8gY29uc3QgY29uZmlnID0gSlNPTi5wYXJzZShlLmNvbmZpZyk7XHJcbiAgICAgICAgaWYgKGNvbmZpZy5zZWxlY3RlZFkgJiYgY29uZmlnLnNlbGVjdGVkWS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICB5WGlhcyA9IGNvbmZpZy5zZWxlY3RlZFk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY29uZmlnLnNlbGVjdGVkU2Vjb25kWSAmJiBjb25maWcuc2VsZWN0ZWRTZWNvbmRZLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHNlY29uZFlYaWFzID0gY29uZmlnLnNlbGVjdGVkU2Vjb25kWTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBkYXRhSXRlbTtcclxuICAgICAgICBpZiAoZS5pZCAmJiBlLmlkICE9IFwiMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCIpIHtcclxuICAgICAgICAgIGRhdGFJdGVtID1cclxuICAgICAgICAgICAgdGhpcy5EYXNoYm9hcmRQb3JsZXRzU2VydmljZS5wb3J0bGV0RGF0YV9OZXdbdGhpcy5kYXNoYm9hcmQuaWRdW1xyXG4gICAgICAgICAgICAgIGUuaWRcclxuICAgICAgICAgICAgXSB8fCBbXTtcclxuICAgICAgICB9IGVsc2UgaWYgKGUubmV3SWQpIHtcclxuICAgICAgICAgIGRhdGFJdGVtID1cclxuICAgICAgICAgICAgdGhpcy5EYXNoYm9hcmRQb3JsZXRzU2VydmljZS5wb3J0bGV0RGF0YV9OZXdbdGhpcy5kYXNoYm9hcmQuaWRdW1xyXG4gICAgICAgICAgICAgIGUubmV3SWRcclxuICAgICAgICAgICAgXSB8fCBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRhdGFJdGVtICYmIGRhdGFJdGVtLmRhdGEgJiYgZGF0YUl0ZW0uZGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBjb25zdCB4QXhpc0ZpZWxkID0gY29uZmlnLmZpZWxkcy5maW5kKFxyXG4gICAgICAgICAgICAoZmllbGQpID0+IGZpZWxkLmNvbE5hbWUgPT09IGNvbmZpZy5zZWxlY3RlZFhcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBkYXRhSXRlbS5kYXRhLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcGVyaW9kID1cclxuICAgICAgICAgICAgICB4QXhpc0ZpZWxkICYmIHhBeGlzRmllbGQuZGF0YVR5cGUgPT09IFwiZGF0ZVwiXHJcbiAgICAgICAgICAgICAgICA/IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKGl0ZW1bY29uZmlnLnNlbGVjdGVkWF0sIFwieXl5eS1NTS1kZFwiKVxyXG4gICAgICAgICAgICAgICAgOiBpdGVtW2NvbmZpZy5zZWxlY3RlZFhdO1xyXG4gICAgICAgICAgICBpZiAocG9ydGxldFR5cGUgPT0gXCJuZXdsaW5lXCIpIHtcclxuICAgICAgICAgICAgICBpZiAoeVhpYXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IG9iaiA9IHsgcGVyaW9kIH07XHJcbiAgICAgICAgICAgICAgICB5WGlhcy5mb3JFYWNoKCh5KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIG9ialt0aGlzLnRyYW5zbGF0aW9uW2ZpbGVzT2JqW3ldXSB8fCB5XSA9IGl0ZW1beV07XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGRhdGFMaW5lLnB1c2gob2JqKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgaWYgKHlYaWFzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGxldCBvYmogPSB7IHBlcmlvZCB9O1xyXG4gICAgICAgICAgICAgICAgeVhpYXMuZm9yRWFjaCgoeSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBvYmpbdGhpcy50cmFuc2xhdGlvbltmaWxlc09ialt5XV0gfHwgeV0gPSBpdGVtW3ldO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBkYXRhQ29sdW1uLnB1c2gob2JqKTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGlmIChzZWNvbmRZWGlhcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgb2JqID0geyBwZXJpb2QgfTtcclxuICAgICAgICAgICAgICAgIHNlY29uZFlYaWFzLmZvckVhY2goKHkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgb2JqW3RoaXMudHJhbnNsYXRpb25bZmlsZXNPYmpbeV1dIHx8IHldID0gaXRlbVt5XTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgZGF0YUxpbmUucHVzaChvYmopO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyDml7bpl7TmjpLluo9cclxuICAgICAgICBpZiAoY29uZmlnLnNlbGVjdGVkWCA9PSBcIkRhdGVcIikge1xyXG4gICAgICAgICAgZGF0YUNvbHVtbiAmJiBkYXRhQ29sdW1uLnNvcnQodGhpcy5jb21wYXJlRGF0ZXMpO1xyXG4gICAgICAgICAgZGF0YUxpbmUgJiYgZGF0YUxpbmUuc29ydCh0aGlzLmNvbXBhcmVEYXRlcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyDotYvlgLxkYXRhQ29sdW1u5ZKMZGF0YUxpbmXlr7nlupTnmoRUeXBlXHJcbiAgICAgICAgY29uZmlnLmZpZWxkcy5mb3JFYWNoKCh0KSA9PiB7XHJcbiAgICAgICAgICBpZiAoY29uZmlnLnNlbGVjdGVkWSAmJiBjb25maWcuc2VsZWN0ZWRZLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgaWYgKHRbXCJjb2xOYW1lXCJdID09IGNvbmZpZy5zZWxlY3RlZFlbMF0pIHtcclxuICAgICAgICAgICAgICBlW1wiY29sdW1uVHlwZVwiXSA9IHRbXCJkYXRhVHlwZVwiXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChjb25maWcuc2VsZWN0ZWRTZWNvbmRZICYmIGNvbmZpZy5zZWxlY3RlZFNlY29uZFkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBpZiAodFtcImNvbE5hbWVcIl0gPT0gY29uZmlnLnNlbGVjdGVkU2Vjb25kWVswXSkge1xyXG4gICAgICAgICAgICAgIGVbXCJsaW5lVHlwZVwiXSA9IHRbXCJkYXRhVHlwZVwiXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBlW1wiZGF0YUNvbHVtblwiXSA9IGRhdGFDb2x1bW47XHJcbiAgICAgICAgZVtcImRhdGFMaW5lXCJdID0gZGF0YUxpbmU7XHJcbiAgICAgICAgaWYgKGNvbmZpZ1tcInNlbGVjdFRoZW1lXCJdKSB7XHJcbiAgICAgICAgICBlW1widGhlbWVDb2xvclwiXSA9IHRoaXMudGhlbWVPYmpbY29uZmlnW1wic2VsZWN0VGhlbWVcIl1dO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBpZiAoIW5vRGV0ZWN0KSB7XHJcbiAgICAgIHRoaXMuc2V0QWN0aXZlRGFzaGJvYXJkUG9ydGxldHMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbXBhcmVEYXRlcyhhLCBiKSB7XHJcbiAgICBjb25zdCBkYXRlQSA9IG5ldyBEYXRlKGEucGVyaW9kKTtcclxuICAgIGNvbnN0IGRhdGVCID0gbmV3IERhdGUoYi5wZXJpb2QpO1xyXG5cclxuICAgIGlmIChkYXRlQSA8IGRhdGVCKSB7XHJcbiAgICAgIHJldHVybiAtMTtcclxuICAgIH0gZWxzZSBpZiAoZGF0ZUEgPiBkYXRlQikge1xyXG4gICAgICByZXR1cm4gMTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdHJ1bmNhdGVUZXh0KHRleHQsIG1heFdpZHRoID0gNzAsIGZvbnRTaXplID0gMTEpIHtcclxuICAgIC8vIOWIm+W7uuS4gOS4qumakOW9oueahCBzcGFuIOadpea1i+mHj+aWh+acrOWuveW6plxyXG4gICAgY29uc3QgbWVhc3VyZVNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgbWVhc3VyZVNwYW4uc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XHJcbiAgICBtZWFzdXJlU3Bhbi5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcclxuICAgIG1lYXN1cmVTcGFuLnN0eWxlLmZvbnRTaXplID0gZm9udFNpemUgKyBcInB4XCI7XHJcbiAgICBtZWFzdXJlU3Bhbi5zdHlsZS53aGl0ZVNwYWNlID0gXCJub3dyYXBcIjtcclxuICAgIG1lYXN1cmVTcGFuLmlubmVyVGV4dCA9IHRleHQ7XHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG1lYXN1cmVTcGFuKTtcclxuXHJcbiAgICAvLyDkuozliIbmn6Xmib7mnaXmib7liLDmnIDkvbPmiKrmlq3ngrlcclxuICAgIGxldCBsZWZ0ID0gMTtcclxuICAgIGxldCByaWdodCA9IHRleHQubGVuZ3RoIC0gMTtcclxuICAgIGxldCBsZWZ0T3JSaWdodCA9IFwibGVmdFwiO1xyXG4gICAgbGV0IGlzQmlnZ2VyID0gZmFsc2U7XHJcbiAgICBpZiAobWVhc3VyZVNwYW4ub2Zmc2V0V2lkdGggPiBtYXhXaWR0aCkge1xyXG4gICAgICB3aGlsZSAoIWlzQmlnZ2VyKSB7XHJcbiAgICAgICAgbWVhc3VyZVNwYW4uaW5uZXJUZXh0ID0gYCR7dGV4dC5zbGljZSgwLCBsZWZ0KX0uLi4ke3RleHQuc2xpY2UocmlnaHQpfWA7XHJcbiAgICAgICAgaWYgKG1lYXN1cmVTcGFuLm9mZnNldFdpZHRoID4gbWF4V2lkdGgpIHtcclxuICAgICAgICAgIGlzQmlnZ2VyID0gdHJ1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKGxlZnRPclJpZ2h0ID09PSBcImxlZnRcIikge1xyXG4gICAgICAgICAgICBsZWZ0T3JSaWdodCA9IFwicmlnaHRcIjtcclxuICAgICAgICAgICAgbGVmdCA9IGxlZnQgKyAxO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGVmdE9yUmlnaHQgPSBcImxlZnRcIjtcclxuICAgICAgICAgICAgcmlnaHQgPSByaWdodCAtIDE7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKG1lYXN1cmVTcGFuKTtcclxuICAgICAgcmV0dXJuIHRleHQ7XHJcbiAgICB9XHJcbiAgICAvLyDmuIXnkIblubbov5Tlm57nu5PmnpxcclxuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobWVhc3VyZVNwYW4pO1xyXG4gICAgcmV0dXJuIGAke3RleHQuc2xpY2UoMCwgbGVmdCAtIDEpfSR7bGVmdCAhPT0gMSA/IFwiLi4uXCIgOiBcIlwifSR7dGV4dC5zbGljZShcclxuICAgICAgcmlnaHQgKyAxXHJcbiAgICApfWA7XHJcbiAgfVxyXG5cclxuICBnZXRQYWRkaW5nQm90dG9tKCkge1xyXG4gICAgbGV0IHBhZGRpbmdCb3R0byA9IDUwO1xyXG4gICAgLy8g5a2Y5ZyoVGl0bGUg5oiW6ICFIERlc2NyaXB0aW9u5Y2g5L2N572u5pe2XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuZGFzaGJvYXJkICYmXHJcbiAgICAgICh0aGlzLmRhc2hib2FyZC50aXRsZSB8fCB0aGlzLmRhc2hib2FyZC5kZXNjcmlwdGlvbilcclxuICAgICkge1xyXG4gICAgICBsZXQgZ2FwID0gMDtcclxuICAgICAgaWYgKHRoaXMuZGFzaGJvYXJkLnRpdGxlKSB7XHJcbiAgICAgICAgZ2FwICs9IDU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuZGFzaGJvYXJkLmRlc2NyaXB0aW9uKSB7XHJcbiAgICAgICAgZ2FwICs9IDIwO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGVsZW1lbnQ6IGFueSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIucG9ydGxldHMtZGVzY3JpcHRpb25cIik7XHJcbiAgICAgIHBhZGRpbmdCb3R0byA9IGVsZW1lbnQgPyBlbGVtZW50Lm9mZnNldEhlaWdodCArIGdhcCArIDUwIDogNTA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGFkZGluZ0JvdHRvICsgXCJweFwiO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlRGFzaGJvYXJkTGFzdFVwZGF0ZURhdGUoKSB7XHJcbiAgICB0aGlzLnBiZi5wYWdlTG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLnBiZi5wYWdlTG9hZGluZ18ubmV4dCh0cnVlKTtcclxuICAgIGNvbnN0IF9kYXRhT2JqID0geyBkYXNoYm9hcmRJZDogdGhpcy51cmxfaWQsIGxhbmd1YWdlOiB0aGlzLmxhbmcgfTtcclxuICAgIHRoaXMuaHR0cC5wb3N0KHRoaXMuYXBpLnVybExpc3QuR2V0RGFzaGJvYXJkVjIsIF9kYXRhT2JqLCAocmVzKSA9PiB7XHJcbiAgICAgIHJlcyA9IHRoaXMucGJmLmNvbnZlcnRLZXlzVG9Mb3dlckNhc2UocmVzKTtcclxuICAgICAgdGhpcy5kYXNoYm9hcmQuVXBkYXRlZERhdGUgPSByZXMuVXBkYXRlZERhdGU7XHJcbiAgICAgIHRoaXMucGJmLnBhZ2VMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMucGJmLnBhZ2VMb2FkaW5nXy5uZXh0KHRydWUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzYXZlZGFzaGJvYXJkKHNob3VsZFVwZGF0ZSA9IFwiZmFsc2VcIikge1xyXG4gICAgdGhpcy5wYmYucGFnZUxvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5wYmYucGFnZUxvYWRpbmdfLm5leHQodHJ1ZSk7XHJcbiAgICBjb25zdCBwZGF0YSA9IHRoaXMuZGFzaGJvYXJkTGF5b3V0LnNlcmlhbGl6ZSgpO1xyXG4gICAgdGhpcy5uZXdQb3NpdGlvbiA9IFsuLi5wZGF0YV07XHJcbiAgICBjb25zdCBwb3J0bGV0cyA9IFsuLi50aGlzLnBvcnRsZXRzXTtcclxuXHJcbiAgICBpZiAocG9ydGxldHMgJiYgcG9ydGxldHMubGVuZ3RoKSB7XHJcbiAgICAgIGxldCBhY3RpdmVUYWJIYXNQb3J0bGV0ID0gZmFsc2U7XHJcbiAgICAgIGNvbnN0IHRhYklkcyA9IFtdO1xyXG4gICAgICBwb3J0bGV0cy5tYXAoKGVsKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZGF0YSA9IGZpbmQodGhpcy5uZXdQb3NpdGlvbiwgKGl0ZW0pID0+IGl0ZW0uaWQgPT09IGVsLm5ld0lkKTtcclxuICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgZWwuY29sID0gZGF0YS5jb2w7XHJcbiAgICAgICAgICBlbC5wb3NYID0gZGF0YS5jb2w7XHJcbiAgICAgICAgICBlbC5yb3cgPSBkYXRhLnJvdztcclxuICAgICAgICAgIGVsLnBvc1kgPSBkYXRhLnJvdztcclxuICAgICAgICAgIGVsLnNpemVYID0gZGF0YS5zaXplWDtcclxuICAgICAgICAgIGVsLndpZHRoID0gZGF0YS5zaXplWDtcclxuICAgICAgICAgIGVsLnNpemVZID0gZGF0YS5zaXplWTtcclxuICAgICAgICAgIGVsLmhlaWdodCA9IGRhdGEuc2l6ZVk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBjb25maWcgPSBlbC5jb25maWcgPyBKU09OLnBhcnNlKGVsLmNvbmZpZykgOiBudWxsO1xyXG4gICAgICAgIGlmIChjb25maWcpIHtcclxuICAgICAgICAgIGNvbmZpZyA9IHtcclxuICAgICAgICAgICAgLi4uY29uZmlnLFxyXG4gICAgICAgICAgICBwcmV2RGFzaGJvYXJJZDogZWwuaWQsXHJcbiAgICAgICAgICAgIGFjdGl2ZVRhYjogdGhpcy5hY3RpdmVUYWIsXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgdGFiSWRzLnB1c2goY29uZmlnLnRhYklkKTtcclxuICAgICAgICAgIGlmIChjb25maWcudGFiSWQgPT09IHRoaXMuYWN0aXZlVGFiKSB7XHJcbiAgICAgICAgICAgIGFjdGl2ZVRhYkhhc1BvcnRsZXQgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWwuY29uZmlnID0gQ2lyY3VsYXJKU09OLnN0cmluZ2lmeShjb25maWcpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIGlmICghYWN0aXZlVGFiSGFzUG9ydGxldCkge1xyXG4gICAgICAgIHBvcnRsZXRzLmZvckVhY2goKGVsKSA9PiB7XHJcbiAgICAgICAgICBsZXQgY29uZmlnID0gZWwuY29uZmlnID8gSlNPTi5wYXJzZShlbC5jb25maWcpIDogbnVsbDtcclxuICAgICAgICAgIGlmIChjb25maWcpIHtcclxuICAgICAgICAgICAgY29uZmlnID0ge1xyXG4gICAgICAgICAgICAgIC4uLmNvbmZpZyxcclxuICAgICAgICAgICAgICBwcmV2RGFzaGJvYXJJZDogZWwuaWQsXHJcbiAgICAgICAgICAgICAgYWN0aXZlVGFiOiB0YWJJZHNbMF0sXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbC5jb25maWcgPSBDaXJjdWxhckpTT04uc3RyaW5naWZ5KGNvbmZpZyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGxldCBkYXRhT2JqID0ge1xyXG4gICAgICBwb3J0bGV0cyxcclxuICAgICAgZGFzaGJvYXJkSWQ6IHRoaXMudXJsX2lkLFxyXG4gICAgICBsYXN0VXBkYXRlRGF0ZTogdGhpcy5kYXNoYm9hcmQuVXBkYXRlZERhdGUsXHJcbiAgICB9O1xyXG4gICAgdGhpcy5odHRwLnBvc3QodGhpcy5hcGkudXJsTGlzdC5TYXZlRGFzaGJvYXJkUG9ydGxldHMsIGRhdGFPYmosIChyZXMpID0+IHtcclxuICAgICAgaWYgKHJlcy5zdGF0dXMgPT0gXCJTVUNDRVNTXCIpIHtcclxuICAgICAgICB0aGlzLkRhc2hib2FyZFBvcmxldHNTZXJ2aWNlLkdldERhc2hib2FyZFYxKFxyXG4gICAgICAgICAgdGhpcy51cmxfaWQsXHJcbiAgICAgICAgICBmYWxzZSxcclxuICAgICAgICAgIChfcmVzLCBfcG9ydGxldHMgPSBbXSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnBiZi5wYWdlTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnBiZi5wYWdlTG9hZGluZ18ubmV4dCh0cnVlKTtcclxuICAgICAgICAgICAgaWYgKCFfcmVzKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IF9zYXZlTWVzc2FnZSA9XHJcbiAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGlvbi5EQVNIQk9BUkRfU0FWRV9NRVNTQUdFIHx8XHJcbiAgICAgICAgICAgICAgXCJEYXNoYm9hcmQgaGFzIGJlZW4gdXBkYXRlZFwiO1xyXG4gICAgICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2Uuc2hvd1N1Y01zZyhfc2F2ZU1lc3NhZ2UpO1xyXG4gICAgICAgICAgICBpZiAoc2hvdWxkVXBkYXRlICE9PSBcInRydWVcIikge1xyXG4gICAgICAgICAgICAgIHRoaXMudG9nZ2xlQ3VzdG9taXplKGZhbHNlKTtcclxuICAgICAgICAgICAgICB0aGlzLnRvZ2dsZVNpZGViYXIoZmFsc2UpO1xyXG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlUHVzaEJ0bihmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy51cGRhdGVEYXNoYm9hcmQoe1xyXG4gICAgICAgICAgICAgIGRhc2hib2FyZDogX3JlcyxcclxuICAgICAgICAgICAgICBwb3J0bGV0czogX3BvcnRsZXRzLFxyXG4gICAgICAgICAgICAgIG5vRGV0ZWN0OiB0cnVlLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5pbml0bGF5b3V0KHRydWUpO1xyXG4gICAgICAgICAgICB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGV0IGVycm9yTWVzc2FnZSA9IFwiRGFzaGJvYXJkIHNhdmUgZmFpbGVkXCI7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzLm1lc3NhZ2VzKSkge1xyXG4gICAgICAgICAgZXJyb3JNZXNzYWdlID0gcmVzLm1lc3NhZ2VzWzBdLm1lc3NhZ2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5zaG93Tm90aWZpY2F0aW9uKGVycm9yTWVzc2FnZSwge1xyXG4gICAgICAgICAgc3RhdHVzOiBcIkVycm9yXCIsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5wYmYucGFnZUxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnBiZi5wYWdlTG9hZGluZ18ubmV4dCh0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgaWQ9XCJrdC1kYXNoYm9hcmQtY29udGFpbmVyXCIgY2xhc3M9XCJjb250ZW50LXBvcnRsZXRzXCI+XHJcbiAgPGRpdlxyXG4gICAgKm5nSWY9XCJcclxuICAgICAgZGFzaGJvYXJkICYmXHJcbiAgICAgIChkYXNoYm9hcmQudGl0bGUgfHwgZGFzaGJvYXJkLmRlc2NyaXB0aW9uKSAmJlxyXG4gICAgICAhaGF2ZUZ1bGxTY3JlZW4ubGVuZ3RoXHJcbiAgICBcIlxyXG4gICAgY2xhc3M9XCJwb3J0bGV0cy1kZXNjcmlwdGlvblwiXHJcbiAgPlxyXG4gICAgPGg0ICpuZ0lmPVwiZGFzaGJvYXJkICYmIGRhc2hib2FyZC50aXRsZSAmJiAhaGF2ZUZ1bGxTY3JlZW4ubGVuZ3RoXCI+XHJcbiAgICAgIHt7IGRhc2hib2FyZCA/IGRhc2hib2FyZC50aXRsZSA6IFwiXCIgfX1cclxuICAgIDwvaDQ+XHJcbiAgICA8cCAqbmdJZj1cImRhc2hib2FyZCAmJiBkYXNoYm9hcmQuZGVzY3JpcHRpb24gJiYgIWhhdmVGdWxsU2NyZWVuLmxlbmd0aFwiPlxyXG4gICAgICB7eyBkYXNoYm9hcmQgPyBkYXNoYm9hcmQuZGVzY3JpcHRpb24gOiBcIlwiIH19XHJcbiAgICA8L3A+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cInBhbmVzLWxpc3RcIiBpZD1cImt0LWRhc2hib2FyZC1sYXlvdXRcIiAjcGFuZXNMaXN0PlxyXG4gICAgPGRpdiBzdHlsZT1cIndpZHRoOiAxMDAlXCI+XHJcbiAgICAgIDxlanMtZGFzaGJvYXJkbGF5b3V0XHJcbiAgICAgICAgaWQ9XCJkZWZhdWx0TGF5b3V0XCJcclxuICAgICAgICAjZGVmYXVsdExheW91dFxyXG4gICAgICAgIFtjb2x1bW5zXT1cIjRcIlxyXG4gICAgICAgIFtjZWxsU3BhY2luZ109XCJjZWxsU3BhY2luZ1wiXHJcbiAgICAgICAgW2NlbGxBc3BlY3RSYXRpb109XCJjZWxsQXNwZWN0UmF0aW9cIlxyXG4gICAgICAgIFthbGxvd0RyYWdnaW5nXT1cImN1c3RvbWl6ZWRcIlxyXG4gICAgICAgIFthbGxvd1Jlc2l6aW5nXT1cImN1c3RvbWl6ZWRcIlxyXG4gICAgICAgIFtyZXNpemFibGVIYW5kbGVzXT1cInJlc2l6YWJsZUhhbmRsZXNcIlxyXG4gICAgICAgIFtkcmFnZ2FibGVIYW5kbGVdPVwiZHJhZ2dhYmxlSGFuZGxlXCJcclxuICAgICAgICBbbWVkaWFRdWVyeV09XCJtZWRpYVF1ZXJ5XCJcclxuICAgICAgICAocmVzaXplU3RvcCk9XCJyZXNpemVTdG9wKCRldmVudClcIlxyXG4gICAgICAgIChkcmFnU3RvcCk9XCJkcmFnU3RvcCgkZXZlbnQpXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxlLXBhbmVsc1xyXG4gICAgICAgICAgKm5nSWY9XCJBY3RpdmVEYXNoYm9hcmRQb3J0bGV0cyAmJiBBY3RpdmVEYXNoYm9hcmRQb3J0bGV0cy5sZW5ndGhcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxlLXBhbmVsXHJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIEFjdGl2ZURhc2hib2FyZFBvcnRsZXRzOyBsZXQgaSA9IGluZGV4XCJcclxuICAgICAgICAgICAgW3NpemVYXT1cIml0ZW0uc2l6ZVhcIlxyXG4gICAgICAgICAgICBbaWRdPVwiaXRlbS5uZXdJZFwiXHJcbiAgICAgICAgICAgIFtzaXplWV09XCJpdGVtLnNpemVZXCJcclxuICAgICAgICAgICAgW3Jvd109XCJpdGVtLnJvd1wiXHJcbiAgICAgICAgICAgIFtjb2xdPVwiaXRlbS5jb2xcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2hlYWRlcj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ2FkZ2V0LXRpdGxlXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBHZXRnYWRnZXRUaXRsZShpdGVtLmNvbmZpZykgfX1cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ2FkZ2V0QmFyIHBhbmUtZ3JvdXAtZ2FkZ2V0XCI+XHJcbiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJwYW5lLWdhZGdldC1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgPGxpXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjdXN0b21pemVkXCJcclxuICAgICAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJcclxuICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uLkRVUExJQ0FURVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHRyYW5zbGF0aW9uLkRVUExJQ0FURVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICcuRFVQTElDQVRFJ1xyXG4gICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvcHlQb3J0bGV0KGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbWdcclxuICAgICAgICAgICAgICAgICAgICAgIHNyYz1cIi4uLy4uL2Fzc2V0cy9pbWcvZGFzaGJvYXJkX2ljb24vbWVudS1kdXBsaWNhdGUuc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICA8bGlcclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImN1c3RvbWl6ZWQgJiYgcnMuaGFzUGVybWlzc2lvbignREVMRVRFJylcIlxyXG4gICAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb24uREVMRVRFID8gdHJhbnNsYXRpb24uREVMRVRFIDogJy5ERUxFVEUnXHJcbiAgICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlKGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbWdcclxuICAgICAgICAgICAgICAgICAgICAgIHNyYz1cIi4uLy4uL2Fzc2V0cy9pbWcvZGFzaGJvYXJkX2ljb24vZ2FkZ2V0LWRlbGV0ZS5zdmdcIlxyXG4gICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgIDxsaVxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ2V0UG9ydGxldFR5cGUoaXRlbSkgIT09ICd0cmFuc3Bvc2UnXCJcclxuICAgICAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJcclxuICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uLkRPV05MT0FEID8gdHJhbnNsYXRpb24uRE9XTkxPQUQgOiAnLkRPV05MT0FEJ1xyXG4gICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8aW1nXHJcbiAgICAgICAgICAgICAgICAgICAgICBzcmM9XCIuLi8uLi9hc3NldHMvaW1nL2Rhc2hib2FyZF9pY29uL21lbnUtZG93bmxvYWQuc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkb3dubG9hZChpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgPGxpXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbWl6ZWQgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICFbJ25ld2NvbHVtbicsICduZXdsaW5lJywgJ25ld2NvbHVtbmxpbmUnXS5pbmNsdWRlcyhcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UG9ydGxldFR5cGUoaXRlbSlcclxuICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb24uRklMVEVSID8gdHJhbnNsYXRpb24uRklMVEVSIDogJy5GSUxURVInXHJcbiAgICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbWdcclxuICAgICAgICAgICAgICAgICAgICAgIHNyYz1cIi4uLy4uL2Fzc2V0cy9pbWcvZGFzaGJvYXJkX2ljb24vZ2FkZ2V0LWZpbHRlcnMuc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuRmlsdGVyKGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICA8L2xpPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPGxpXHJcbiAgICAgICAgICAgICAgICAgICAgI3VuY2xpY2tcclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImN1c3RvbWl6ZWQgJiYgZ2V0UG9ydGxldFR5cGUoaXRlbSkgPT09ICdwaXZvdCdcIlxyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiAxOHB4XCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbWdcclxuICAgICAgICAgICAgICAgICAgICAgIHNyYz1cIi4uLy4uL2Fzc2V0cy9pbWcvZGFzaGJvYXJkX2ljb24vZ2FkZ2V0LWJhc2ljLXN1Yi10b3RhbC5zdmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5TdWJ0b3RhbChpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICA8aW1nXHJcbiAgICAgICAgICAgICAgICAgICAgICBzcmM9XCIuLi8uLi9hc3NldHMvaW1nL2Rhc2hib2FyZF9pY29uL2dhZGdldC1iYXNpYy1hcnJvdy1kb3duLnN2Z1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlblN1YnRvdGFsKGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgI3VuY2xpY2tcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInBpdm90VGFibGUtc3ViLWdyYW5kLWdyb3VwXCJcclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgc2hvd1N1YlRvdGFsR3JvdXAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgIGdldFBvcnRsZXRUeXBlKGl0ZW0pID09PSAncGl2b3QnICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICBDdXJyZW50X1BvcnRsZXRJZCA9PT0gaXRlbS5uZXdJZFxyXG4gICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8dWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzdWItZ3JhbmQtZ3JvdXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiBzdWJ0b3RhbC5zZWxlY3RlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnI2Y4ZmFmYidcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJyNmZmYnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VidG90YWwgb2YgcGl2b3RUYWJsZVN1YlRvdGFsTGlzdDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWR4ID0gaW5kZXhcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFRvdGFsR3JvdXAoaWR4LCAnc3ViJywgaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogMzNweDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDM0cHg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInN1YnRvdGFsLnNlbGVjdGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiLi4vLi4vYXNzZXRzL2ltZy9kYXNoYm9hcmRfaWNvbi9mb3Jtcy1jaGVja2JveC1zcXVhcmUtdGljay5zdmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBzdWJ0b3RhbC52YWx1ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8bGlcclxuICAgICAgICAgICAgICAgICAgICAjdW5jbGlja0dyYW5kXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbWl6ZWQgJiZcclxuICAgICAgICAgICAgICAgICAgICAgIChnZXRQb3J0bGV0VHlwZShpdGVtKSA9PT0gJ3Bpdm90JyB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRQb3J0bGV0VHlwZShpdGVtKSA9PT0gJ3RhYmxlJylcclxuICAgICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiAxOHB4XCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbWdcclxuICAgICAgICAgICAgICAgICAgICAgIHNyYz1cIi4uLy4uL2Fzc2V0cy9pbWcvZGFzaGJvYXJkX2ljb24vZ2FkZ2V0LWJhc2ljLXRvdGFsLnN2Z1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkdyYW5kdG90YWwoaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPGltZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgc3JjPVwiLi4vLi4vYXNzZXRzL2ltZy9kYXNoYm9hcmRfaWNvbi9nYWRnZXQtYmFzaWMtYXJyb3ctZG93bi5zdmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5HcmFuZHRvdGFsKGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgI3VuY2xpY2tHcmFuZFxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicGl2b3RUYWJsZS1zdWItZ3JhbmQtZ3JvdXBcIlxyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwibGVmdDogMjMwcHhcIlxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBzaG93Z3JhbmRUb3RhbEdyb3VwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICBnZXRQb3J0bGV0VHlwZShpdGVtKSA9PT0gJ3Bpdm90JyAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgQ3VycmVudF9Qb3J0bGV0SWQgPT09IGl0ZW0ubmV3SWRcclxuICAgICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPHVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGxpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3ViLWdyYW5kLWdyb3VwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogZ3JhbmR0b3RhbC5zZWxlY3RlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnI2Y4ZmFmYidcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJyNmZmYnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZ3JhbmR0b3RhbCBvZiBwaXZvdFRhYmxlR3JhbmRUb3RhbExpc3Q7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlkeCA9IGluZGV4XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RUb3RhbEdyb3VwKGlkeCwgJ2dyYW5kJywgaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogMzNweDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDM0cHg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImdyYW5kdG90YWwuc2VsZWN0ZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCIuLi8uLi9hc3NldHMvaW1nL2Rhc2hib2FyZF9pY29uL2Zvcm1zLWNoZWNrYm94LXNxdWFyZS10aWNrLnN2Z1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGdyYW5kdG90YWwudmFsdWUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICN1bmNsaWNrR3JhbmRcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInBpdm90VGFibGUtc3ViLWdyYW5kLWdyb3VwXCJcclxuICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImxlZnQ6IDIxMHB4OyBoZWlnaHQ6IDc2cHhcIlxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBzaG93VGFibGVHcmFuZFRvdGFsR3JvdXAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgIGdldFBvcnRsZXRUeXBlKGl0ZW0pID09PSAndGFibGUnICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICBDdXJyZW50X1BvcnRsZXRJZCA9PT0gaXRlbS5uZXdJZFxyXG4gICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8dWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzdWItZ3JhbmQtZ3JvdXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiBncmFuZHRvdGFsLnNlbGVjdGVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICcjZjhmYWZiJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnI2ZmZidcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBncmFuZHRvdGFsIG9mIHRhYmxlR3JhbmRUb3RhbExpc3Q7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlkeCA9IGluZGV4XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RUb3RhbEdyb3VwKGlkeCwgJ3RhYmxlR3JhbmQnLCBpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAzM3B4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMzRweDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ3JhbmR0b3RhbC5zZWxlY3RlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYz1cIi4uLy4uL2Fzc2V0cy9pbWcvZGFzaGJvYXJkX2ljb24vZm9ybXMtY2hlY2tib3gtc3F1YXJlLXRpY2suc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgZ3JhbmR0b3RhbC52YWx1ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8bGlcclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgY3VzdG9taXplZCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgIVsnbmV3Y29sdW1uJywgJ25ld2xpbmUnLCAnbmV3Y29sdW1ubGluZSddLmluY2x1ZGVzKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRQb3J0bGV0VHlwZShpdGVtKVxyXG4gICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbi5GT1JNQVQgPyB0cmFuc2xhdGlvbi5GT1JNQVQgOiAnLkZPUk1BVCdcclxuICAgICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPGltZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgc3JjPVwiLi4vLi4vYXNzZXRzL2ltZy9kYXNoYm9hcmRfaWNvbi9nYWRnZXQtYmFzaWMtZm9ybWF0LnN2Z1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZmllbGRGb3JtYXQoaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgIDxsaVxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY3VzdG9taXplZCB8fCB1cmxfdHlwZSA9PT0gJ3NoYXJlZGJldGEnKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgIVsnbmV3Y29sdW1uJywgJ25ld2xpbmUnLCAnbmV3Y29sdW1ubGluZSddLmluY2x1ZGVzKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRQb3J0bGV0VHlwZShpdGVtKVxyXG4gICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbi5DT05GSUdVUkFUSU9OUyB8fCAnLkNPTkZJR1VSQVRJT05TJ1xyXG4gICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbmZpZ3VyYXRpb25zKGl0ZW0sICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPGltZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgc3JjPVwiLi4vLi4vYXNzZXRzL2ltZy9kYXNoYm9hcmRfaWNvbi9nYWRnZXQtc2V0dGluZ3Muc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICA8bGlcclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImN1c3RvbWl6ZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cInRyYW5zbGF0aW9uLkVESVQgPyB0cmFuc2xhdGlvbi5FRElUIDogJy5FRElUJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVkaXQoaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPGltZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgc3JjPVwiLi4vLi4vYXNzZXRzL2ltZy9kYXNoYm9hcmRfaWNvbi9nYWRnZXQtZWRpdC5zdmdcIlxyXG4gICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NvbnRlbnQ+XHJcbiAgICAgICAgICAgICAgPHJzLWdhZGdldC10YWJsZVxyXG4gICAgICAgICAgICAgICAgI3RhYmxlXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImdldFBvcnRsZXRUeXBlKGl0ZW0pID09ICd0YWJsZSdcIlxyXG4gICAgICAgICAgICAgICAgW3BvcnRsZXRzXT1cInBvcnRsZXRzXCJcclxuICAgICAgICAgICAgICAgIFtkYXNoYm9hcmRdPVwiZGFzaGJvYXJkXCJcclxuICAgICAgICAgICAgICAgIFtwb3J0bGV0XT1cIml0ZW1cIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8L3JzLWdhZGdldC10YWJsZT5cclxuICAgICAgICAgICAgICA8cnMtZ2FkZ2V0LXBpdm90XHJcbiAgICAgICAgICAgICAgICAjcGl2b3RcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiZ2V0UG9ydGxldFR5cGUoaXRlbSkgPT0gJ3Bpdm90J1wiXHJcbiAgICAgICAgICAgICAgICBbcG9ydGxldF09XCJpdGVtXCJcclxuICAgICAgICAgICAgICAgIFtkYXNoYm9hcmRdPVwiZGFzaGJvYXJkXCJcclxuICAgICAgICAgICAgICAgIFtwb3J0bGV0c109XCJwb3J0bGV0c1wiXHJcbiAgICAgICAgICAgICAgICBbdGhlbWVDb2xvcl09XCJpdGVtLnRoZW1lQ29sb3JcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8L3JzLWdhZGdldC1waXZvdD5cclxuICAgICAgICAgICAgICA8cnMtZ2FkZ2V0LXBpdm90LWNoYXJ0XHJcbiAgICAgICAgICAgICAgICAjcGl2b3RcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiZ2V0UG9ydGxldFR5cGUoaXRlbSkgPT0gJ25ld2NoYXJ0J1wiXHJcbiAgICAgICAgICAgICAgICBbcG9ydGxldF09XCJpdGVtXCJcclxuICAgICAgICAgICAgICAgIFtkYXNoYm9hcmRdPVwiZGFzaGJvYXJkXCJcclxuICAgICAgICAgICAgICAgICh1cGRhdGVQb3JsZXRDb25maWcpPVwidXBkYXRlUG9ybGV0Q29uZmlnKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgW3BvcnRsZXRzXT1cInBvcnRsZXRzXCJcclxuICAgICAgICAgICAgICAgIFt0aGVtZUNvbG9yXT1cIml0ZW0udGhlbWVDb2xvclwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDwvcnMtZ2FkZ2V0LXBpdm90LWNoYXJ0PlxyXG4gICAgICAgICAgICAgIDxycy1nYWRnZXQtdHJhbnNwb3NlXHJcbiAgICAgICAgICAgICAgICAjdHJhbnNwb3NlXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImdldFBvcnRsZXRUeXBlKGl0ZW0pID09ICd0cmFuc3Bvc2UnXCJcclxuICAgICAgICAgICAgICAgIFtwb3J0bGV0c109XCJwb3J0bGV0c1wiXHJcbiAgICAgICAgICAgICAgICBbZGFzaGJvYXJkXT1cImRhc2hib2FyZFwiXHJcbiAgICAgICAgICAgICAgICBbcG9ydGxldF09XCJpdGVtXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPC9ycy1nYWRnZXQtdHJhbnNwb3NlPlxyXG4gICAgICAgICAgICAgIDxycy1iYXItY2hhcnRzXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICBbJ25ld2NvbHVtbicsICduZXdsaW5lJywgJ25ld2NvbHVtbmxpbmUnXS5pbmNsdWRlcyhcclxuICAgICAgICAgICAgICAgICAgICBnZXRQb3J0bGV0VHlwZShpdGVtKVxyXG4gICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgI25ld0NoYXJ0XHJcbiAgICAgICAgICAgICAgICBbZGFzaGJvYXJkXT1cImRhc2hib2FyZFwiXHJcbiAgICAgICAgICAgICAgICBbZGF0YUNvbHVtbl09XCJpdGVtLmRhdGFDb2x1bW5cIlxyXG4gICAgICAgICAgICAgICAgW2RhdGFMaW5lXT1cIml0ZW0uZGF0YUxpbmVcIlxyXG4gICAgICAgICAgICAgICAgW2NvbHVtblR5cGVdPVwiaXRlbS5jb2x1bW5UeXBlXCJcclxuICAgICAgICAgICAgICAgIFtsaW5lVHlwZV09XCJpdGVtLmxpbmVUeXBlXCJcclxuICAgICAgICAgICAgICAgIFt0aGVtZUNvbG9yXT1cIml0ZW0udGhlbWVDb2xvclwiXHJcbiAgICAgICAgICAgICAgICBbcG9ydGxldF09XCJpdGVtXCJcclxuICAgICAgICAgICAgICA+PC9ycy1iYXItY2hhcnRzPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC9lLXBhbmVsPlxyXG4gICAgICAgIDwvZS1wYW5lbHM+XHJcbiAgICAgIDwvZWpzLWRhc2hib2FyZGxheW91dD5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDxycy1lbXB0eS1pY29uLXByb21wdFxyXG4gICAgW2Rpc3BsYXlDb2RlXT1cIidjdXN0b21pemUnXCJcclxuICAgIFtkYXNoYm9hcmRdPVwiZGFzaGJvYXJkXCJcclxuICAgIGhpZGRlblxyXG4gID5cclxuICA8L3JzLWVtcHR5LWljb24tcHJvbXB0PlxyXG4gIDxkaXZcclxuICAgIGlkPVwia3QtZGFzaGJvYXJkLXRhYnNcIlxyXG4gICAgY2xhc3M9XCJkYXNoYm9hcmQtdGFiLWxpc3RcIlxyXG4gICAgY2RrRHJvcExpc3RcclxuICAgIGNka0Ryb3BMaXN0T3JpZW50YXRpb249XCJob3Jpem9udGFsXCJcclxuICAgIChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcCgkZXZlbnQpXCJcclxuICA+XHJcbiAgICA8ZGl2XHJcbiAgICAgIGNsYXNzPVwidGFiLWl0ZW1cIlxyXG4gICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiB0YWJMaXN0OyBsZXQgaSA9IGluZGV4XCJcclxuICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgIGFjdGl2ZTogaXRlbS5pZCA9PT0gYWN0aXZlVGFiLFxyXG4gICAgICAgIHByZXY6IHByZXZJZCA9PT0gaXRlbS5pZCAmJiBpICE9PSB0YWJMaXN0Lmxlbmd0aCAtIDFcclxuICAgICAgfVwiXHJcbiAgICAgIChjbGljayk9XCJvbkFjdGl2ZVRhYihpdGVtLCBpKVwiXHJcbiAgICAgIChkYmxjbGljayk9XCJvblN0YXJ0RWRpdChpdGVtLmlkKVwiXHJcbiAgICAgIGNka0RyYWdcclxuICAgID5cclxuICAgICAgPGRpdlxyXG4gICAgICAgICpuZ0lmPVwiIXN0YXJ0RWRpdCB8fCBpdGVtLmlkICE9PSBhY3RpdmVUYWJcIlxyXG4gICAgICAgIFttYXRUb29sdGlwXT1cIlxyXG4gICAgICAgICAgaXRlbS5sYWJlbCA9PT0gaXRlbS5kaXNwbGF5TGFiZWwgPyBudWxsIDogaXRlbS5kaXNwbGF5TGFiZWxcclxuICAgICAgICBcIlxyXG4gICAgICA+XHJcbiAgICAgICAge3sgaXRlbS5kaXNwbGF5TGFiZWwgfX1cclxuICAgICAgICA8aW1nXHJcbiAgICAgICAgICAqbmdJZj1cInRhYkxpc3QubGVuZ3RoID4gMVwiXHJcbiAgICAgICAgICBzcmM9XCIuLi8uLi9hc3NldHMvaW1nL2Rhc2hib2FyZF9pY29uL2Rhc2hib2FyZC10YWItZGVsZXRlLnN2Z1wiXHJcbiAgICAgICAgICBhbHQ9XCJcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cIm9uRGVsZXRlVGFiKGl0ZW0pXCJcclxuICAgICAgICAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGlucHV0XHJcbiAgICAgICAgKm5nSWY9XCJzdGFydEVkaXQgJiYgaXRlbS5pZCA9PT0gYWN0aXZlVGFiXCJcclxuICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtLmxhYmVsXCJcclxuICAgICAgICAoaW5wdXQpPVwic2V0VGFiSW5wdXQoJGV2ZW50KVwiXHJcbiAgICAgICAgKGJsdXIpPVwic2F2ZVRhYklucHV0KGl0ZW0pXCJcclxuICAgICAgLz5cclxuICAgIDwvZGl2PlxyXG4gICAgPGltZ1xyXG4gICAgICBjbGFzcz1cImFkZC10YWItaWNvblwiXHJcbiAgICAgIHNyYz1cIi4uLy4uL2Fzc2V0cy9pbWcvZGFzaGJvYXJkX2ljb24vYWRkLXRhYi5zdmdcIlxyXG4gICAgICAoY2xpY2spPVwib25BZGRUYWIoKVwiXHJcbiAgICAvPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgY2xhc3M9XCJzaWRlYmFyXCIgW25nQ2xhc3NdPVwieyBnb25lOiAhcHVzaF9idG4gfVwiICpuZ0lmPVwiZGFzaGJvYXJkX3NpZGViYXJcIj5cclxuICA8c3BhbiBjbGFzcz1cInB1c2gtYnRuXCIgKGNsaWNrKT1cInB1c2hTbGlkZXIoKVwiIFtjbGFzcy5sZWZ0LXBsYWNlXT1cIiFwdXNoX2J0blwiPlxyXG4gICAgPHNwYW5cclxuICAgICAgY2xhc3M9XCJzaWRlYmFyLWJ0blwiXHJcbiAgICAgICpuZ0lmPVwicHVzaF9idG5cIlxyXG4gICAgICBbaW5saW5lU1ZHXT1cIicuLi8uLi9hc3NldHMvaW1nL2Rhc2hib2FyZF9pY29uL0FuZ2xlLWRvdWJsZS1yaWdodC5zdmcnXCJcclxuICAgID48L3NwYW4+XHJcbiAgICA8c3BhblxyXG4gICAgICBjbGFzcz1cInNpZGViYXItYnRuXCJcclxuICAgICAgKm5nSWY9XCIhcHVzaF9idG5cIlxyXG4gICAgICBbaW5saW5lU1ZHXT1cIicuLi8uLi9hc3NldHMvaW1nL2Rhc2hib2FyZF9pY29uL0FuZ2xlLWRvdWJsZS1sZWZ0LnN2ZydcIlxyXG4gICAgPjwvc3Bhbj5cclxuICA8L3NwYW4+XHJcbiAgPHJzLXNpZGViYXItaWNvbmxpc3QtbmV3XHJcbiAgICAjc2lkZWJhclxyXG4gICAgKm5nSWY9XCJwdXNoX2J0blwiXHJcbiAgICBbZGFzaGJvYXJkX3NpZGViYXJdPVwiZGFzaGJvYXJkX3NpZGViYXJcIlxyXG4gICAgW2Rhc2hib2FyZF09XCJkYXNoYm9hcmRcIlxyXG4gICAgW2Rhc2hib2FyZElkXT1cInVybF9pZFwiXHJcbiAgICBbcG9ydGxldF09XCJwb3J0bGV0XCJcclxuICAgIFtwb3J0bGV0c109XCJwb3J0bGV0c1wiXHJcbiAgICBbYWN0aXZlVGFiSWRdPVwiYWN0aXZlVGFiSWRcIlxyXG4gICAgW2FjdGl2ZVRhYkxhYmVsXT1cImFjdGl2ZVRhYkxhYmVsXCJcclxuICAgIFtmaWd1cmVDb2RlXT1cImZpZ3VyZUNvZGVcIlxyXG4gICAgW3RhYmFjdGl2ZV09XCJ0YWJhY3RpdmVcIlxyXG4gICAgW19zZWxlY3RlZFldPVwic2VsZWN0ZWRZXCJcclxuICAgIFtfc2VsZWN0ZWRTZWNvbmRZXT1cInNlbGVjdGVkU2Vjb25kWVwiXHJcbiAgICBbX3NlbGVjdGVkWF09XCJzZWxlY3RlZFhcIlxyXG4gICAgW19zZWxlY3RlZE11bHRpcGxlc109XCJzZWxlY3RlZE11bHRpcGxlc1wiXHJcbiAgICBbX3NlbGVjdFRoZW1lXT1cInNlbGVjdFRoZW1lXCJcclxuICAgIFthcHBDb2RlXT1cImFwcENvZGVcIlxyXG4gICAgKHVwZGF0ZVBvcmxldCk9XCJ1cGRhdGVQb3JsZXQoJGV2ZW50KVwiXHJcbiAgICAoY2hhcnRVcGRhdGUpPVwiY2hhcnRVcGRhdGUoJGV2ZW50KVwiXHJcbiAgICAoY2xvc2VTaWRlYmFyKT1cImNsb3NlU2lkZWJhcigkZXZlbnQpXCJcclxuICAgICh1cGRhdGVQdXNoQnRuKT1cInVwZGF0ZVB1c2hCdG4oJGV2ZW50KVwiXHJcbiAgICAodXBkYXRlVGhlbWUpPVwidXBkYXRlVGhlbWUoJGV2ZW50KVwiXHJcbiAgICAodXBkYXRlUG9ybGV0Q29uZmlnKT1cInVwZGF0ZVBvcmxldENvbmZpZygkZXZlbnQpXCJcclxuICAgIChvblRvZ2dsZVRhYmFjdGl2ZSk9XCJvblRvZ2dsZVRhYmFjdGl2ZSgkZXZlbnQpXCJcclxuICA+XHJcbiAgPC9ycy1zaWRlYmFyLWljb25saXN0LW5ldz5cclxuPC9kaXY+XHJcbjxidXR0b25cclxuICBjbGFzcz1cImFkZFBvcmxldFwiXHJcbiAgKm5nSWY9XCJjdXN0b21pemVkICYmICFwdXNoX2J0blwiXHJcbiAgbWF0LW1pbmktZmFiXHJcbiAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAoY2xpY2spPVwiYWRkUG9ybGV0KClcIlxyXG4+XHJcbiAgK1xyXG48L2J1dHRvbj5cclxuIl19
|