raise-common-lib-new 0.0.63 → 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.
Files changed (221) hide show
  1. package/esm2022/lib/actions/toolbar/index.component.mjs +4 -3
  2. package/esm2022/lib/actions/toolbar-item/index.component.mjs +2 -2
  3. package/esm2022/lib/common-grid/grid-action/grid-action-item/grid-action-item.component.mjs +1 -1
  4. package/esm2022/lib/common-grid/grid-action/grid-action.component.mjs +3 -2
  5. package/esm2022/lib/common-grid/index.component.mjs +6 -3
  6. package/esm2022/lib/dashboard/api.mjs +33 -0
  7. package/esm2022/lib/dashboard/bar-charts/bar-charts.component.mjs +430 -0
  8. package/esm2022/lib/dashboard/bar-charts/utils.mjs +18 -0
  9. package/esm2022/lib/dashboard/dashboard-properties/data-mart-new/data-mart-new.component.mjs +442 -0
  10. package/esm2022/lib/dashboard/dashboard.service.mjs +295 -0
  11. package/esm2022/lib/dashboard/dashboardPorlets.service.mjs +2169 -0
  12. package/esm2022/lib/dashboard/dialog-group/download/index.component.mjs +212 -0
  13. package/esm2022/lib/dashboard/dialog-group/empty-icon-prompt/empty-icon-prompt.component.mjs +36 -0
  14. package/esm2022/lib/dashboard/gadget-group/gadget-pivot/gadget-pivot.component.mjs +3211 -0
  15. package/esm2022/lib/dashboard/gadget-group/gadget-pivot-chart/gadget-pivot.component.mjs +3117 -0
  16. package/esm2022/lib/dashboard/gadget-group/gadget-table/gadget-table.component.mjs +1099 -0
  17. package/esm2022/lib/dashboard/gadget-group/gadget-transpose/gadget-transpose.component.mjs +583 -0
  18. package/esm2022/lib/dashboard/pane-group-new.component.mjs +2031 -0
  19. package/esm2022/lib/dashboard/sidebar-iconlist/field-filter/field-filter.component.mjs +637 -0
  20. package/esm2022/lib/dashboard/sidebar-iconlist/field-format/field-format.component.mjs +753 -0
  21. package/esm2022/lib/dashboard/sidebar-iconlist/portlet-type-new/portlet-type-new.component.mjs +216 -0
  22. package/esm2022/lib/dashboard/sidebar-iconlist/sidebar-iconlist-new.component.mjs +1239 -0
  23. package/esm2022/lib/dialog/common-delete-dialog/index.component.mjs +1 -1
  24. package/esm2022/lib/dialog/common-dialog/index.component.mjs +16 -5
  25. package/esm2022/lib/float-box/index.component.mjs +18 -4
  26. package/esm2022/lib/form/checkbox-group/index.component.mjs +35 -5
  27. package/esm2022/lib/form/drawer-form/drawer-form.component.mjs +177 -76
  28. package/esm2022/lib/layout/drawer/index.component.mjs +2 -2
  29. package/esm2022/lib/layout/page-list/index.component.mjs +9 -3
  30. package/esm2022/lib/layout/page-tab/index.component.mjs +5 -3
  31. package/esm2022/lib/layout/rs-stepper/constants.mjs +2 -0
  32. package/esm2022/lib/layout/rs-stepper/index.component.mjs +148 -0
  33. package/esm2022/lib/raise-common-lib.module.mjs +114 -7
  34. package/esm2022/lib/service/InjectionToken.mjs +5 -0
  35. package/esm2022/lib/service/keep-alive.service.mjs +2 -2
  36. package/esm2022/lib/smart-popup/index.component.mjs +1084 -0
  37. package/esm2022/public-api.mjs +19 -1
  38. package/fesm2022/raise-common-lib-new.mjs +18037 -220
  39. package/fesm2022/raise-common-lib-new.mjs.map +1 -1
  40. package/lib/common-grid/index.component.d.ts +2 -1
  41. package/lib/dashboard/api.d.ts +24 -0
  42. package/lib/dashboard/bar-charts/bar-charts.component.d.ts +63 -0
  43. package/lib/dashboard/bar-charts/utils.d.ts +1 -0
  44. package/lib/dashboard/dashboard-properties/data-mart-new/data-mart-new.component.d.ts +52 -0
  45. package/lib/dashboard/dashboard.service.d.ts +152 -0
  46. package/lib/dashboard/dashboardPorlets.service.d.ts +214 -0
  47. package/lib/dashboard/dialog-group/download/index.component.d.ts +36 -0
  48. package/lib/dashboard/dialog-group/empty-icon-prompt/empty-icon-prompt.component.d.ts +15 -0
  49. package/lib/dashboard/gadget-group/gadget-pivot/gadget-pivot.component.d.ts +128 -0
  50. package/lib/dashboard/gadget-group/gadget-pivot-chart/gadget-pivot.component.d.ts +131 -0
  51. package/lib/dashboard/gadget-group/gadget-table/gadget-table.component.d.ts +77 -0
  52. package/lib/dashboard/gadget-group/gadget-transpose/gadget-transpose.component.d.ts +47 -0
  53. package/lib/dashboard/pane-group-new.component.d.ts +169 -0
  54. package/lib/dashboard/sidebar-iconlist/field-filter/field-filter.component.d.ts +56 -0
  55. package/lib/dashboard/sidebar-iconlist/field-format/field-format.component.d.ts +62 -0
  56. package/lib/dashboard/sidebar-iconlist/portlet-type-new/portlet-type-new.component.d.ts +30 -0
  57. package/lib/dashboard/sidebar-iconlist/sidebar-iconlist-new.component.d.ts +150 -0
  58. package/lib/dialog/common-dialog/index.component.d.ts +3 -1
  59. package/lib/float-box/index.component.d.ts +4 -3
  60. package/lib/form/checkbox-group/index.component.d.ts +5 -0
  61. package/lib/form/drawer-form/drawer-form.component.d.ts +21 -8
  62. package/lib/layout/page-list/index.component.d.ts +3 -1
  63. package/lib/layout/page-tab/index.component.d.ts +1 -0
  64. package/lib/layout/rs-stepper/constants.d.ts +5 -0
  65. package/lib/layout/rs-stepper/index.component.d.ts +31 -0
  66. package/lib/raise-common-lib.module.d.ts +61 -40
  67. package/lib/service/InjectionToken.d.ts +4 -0
  68. package/lib/smart-popup/index.component.d.ts +60 -0
  69. package/package.json +1 -1
  70. package/public-api.d.ts +18 -0
  71. package/src/assets/img/dashboard_icon/AddPerson.svg +4 -0
  72. package/src/assets/img/dashboard_icon/Angle-double-left.svg +12 -0
  73. package/src/assets/img/dashboard_icon/Angle-double-right.svg +12 -0
  74. package/src/assets/img/dashboard_icon/Arrow_collapse.svg +3 -0
  75. package/src/assets/img/dashboard_icon/Arrow_expand.svg +3 -0
  76. package/src/assets/img/dashboard_icon/Close.svg +4 -0
  77. package/src/assets/img/dashboard_icon/Edit_label.svg +3 -0
  78. package/src/assets/img/dashboard_icon/RemoveMini.svg +3 -0
  79. package/src/assets/img/dashboard_icon/ShareTo.svg +3 -0
  80. package/src/assets/img/dashboard_icon/add-dashboard.svg +4 -0
  81. package/src/assets/img/dashboard_icon/add-tab.svg +4 -0
  82. package/src/assets/img/dashboard_icon/angle-left.svg +12 -0
  83. package/src/assets/img/dashboard_icon/angle-right.svg +12 -0
  84. package/src/assets/img/dashboard_icon/area-white.svg +3 -0
  85. package/src/assets/img/dashboard_icon/area.svg +3 -0
  86. package/src/assets/img/dashboard_icon/bar-white.svg +14 -0
  87. package/src/assets/img/dashboard_icon/bar.svg +14 -0
  88. package/src/assets/img/dashboard_icon/basic-icon-filter.svg +14 -0
  89. package/src/assets/img/dashboard_icon/chart-combined-active.svg +7 -0
  90. package/src/assets/img/dashboard_icon/chart-combined.svg +7 -0
  91. package/src/assets/img/dashboard_icon/column-white.svg +14 -0
  92. package/src/assets/img/dashboard_icon/column.svg +26 -0
  93. package/src/assets/img/dashboard_icon/customize.png +0 -0
  94. package/src/assets/img/dashboard_icon/dashboard-description.svg +18 -0
  95. package/src/assets/img/dashboard_icon/dashboard-download.svg +18 -0
  96. package/src/assets/img/dashboard_icon/dashboard-drag.svg +28 -0
  97. package/src/assets/img/dashboard_icon/dashboard-duplicate.svg +24 -0
  98. package/src/assets/img/dashboard_icon/dashboard-icon.svg +12 -0
  99. package/src/assets/img/dashboard_icon/dashboard-properties.svg +18 -0
  100. package/src/assets/img/dashboard_icon/dashboard-rename.svg +18 -0
  101. package/src/assets/img/dashboard_icon/dashboard-share.svg +20 -0
  102. package/src/assets/img/dashboard_icon/dashboard-tab-delete.svg +4 -0
  103. package/src/assets/img/dashboard_icon/dashboard_Share.svg +3 -0
  104. package/src/assets/img/dashboard_icon/dashboard_ToolsHide.svg +4 -0
  105. package/src/assets/img/dashboard_icon/datamart_.svg +5 -0
  106. package/src/assets/img/dashboard_icon/datamart_Admin.svg +3 -0
  107. package/src/assets/img/dashboard_icon/datamart_Asset Portfolio.svg +4 -0
  108. package/src/assets/img/dashboard_icon/datamart_Bank.svg +3 -0
  109. package/src/assets/img/dashboard_icon/datamart_CRM.svg +6 -0
  110. package/src/assets/img/dashboard_icon/datamart_Company.svg +6 -0
  111. package/src/assets/img/dashboard_icon/datamart_Compliance.svg +3 -0
  112. package/src/assets/img/dashboard_icon/datamart_Contact.svg +3 -0
  113. package/src/assets/img/dashboard_icon/datamart_DASHBOARD.svg +4 -0
  114. package/src/assets/img/dashboard_icon/datamart_DOCX.svg +4 -0
  115. package/src/assets/img/dashboard_icon/datamart_ESG.svg +4 -0
  116. package/src/assets/img/dashboard_icon/datamart_Financials - Company.svg +3 -0
  117. package/src/assets/img/dashboard_icon/datamart_Fund.svg +4 -0
  118. package/src/assets/img/dashboard_icon/datamart_FundFinancial.svg +4 -0
  119. package/src/assets/img/dashboard_icon/datamart_HTML.svg +4 -0
  120. package/src/assets/img/dashboard_icon/datamart_Logs.svg +8 -0
  121. package/src/assets/img/dashboard_icon/datamart_PDF.svg +5 -0
  122. package/src/assets/img/dashboard_icon/datamart_Project.svg +3 -0
  123. package/src/assets/img/dashboard_icon/datamart_Templates.svg +7 -0
  124. package/src/assets/img/dashboard_icon/datamart_Track Change.svg +3 -0
  125. package/src/assets/img/dashboard_icon/datamart_VirtualGroup.svg +5 -0
  126. package/src/assets/img/dashboard_icon/datamart_XLS.svg +4 -0
  127. package/src/assets/img/dashboard_icon/desktop_selected.svg +10 -0
  128. package/src/assets/img/dashboard_icon/desktop_unselected.svg +10 -0
  129. package/src/assets/img/dashboard_icon/favourite-grey.svg +3 -0
  130. package/src/assets/img/dashboard_icon/favourite-yellow.svg +3 -0
  131. package/src/assets/img/dashboard_icon/forms-checkbox-square-tick.svg +3 -0
  132. package/src/assets/img/dashboard_icon/ftable-white.svg +24 -0
  133. package/src/assets/img/dashboard_icon/ftable.svg +24 -0
  134. package/src/assets/img/dashboard_icon/gadget-basic-arrow-down.svg +14 -0
  135. package/src/assets/img/dashboard_icon/gadget-basic-format.svg +21 -0
  136. package/src/assets/img/dashboard_icon/gadget-basic-sub-total.svg +18 -0
  137. package/src/assets/img/dashboard_icon/gadget-basic-total-1.svg +9 -0
  138. package/src/assets/img/dashboard_icon/gadget-basic-total.svg +16 -0
  139. package/src/assets/img/dashboard_icon/gadget-columns.svg +12 -0
  140. package/src/assets/img/dashboard_icon/gadget-delete.svg +18 -0
  141. package/src/assets/img/dashboard_icon/gadget-download.svg +18 -0
  142. package/src/assets/img/dashboard_icon/gadget-duplicate.svg +24 -0
  143. package/src/assets/img/dashboard_icon/gadget-edit.svg +18 -0
  144. package/src/assets/img/dashboard_icon/gadget-filters-light.svg +9 -0
  145. package/src/assets/img/dashboard_icon/gadget-filters.svg +9 -0
  146. package/src/assets/img/dashboard_icon/gadget-format-0.svg +8 -0
  147. package/src/assets/img/dashboard_icon/gadget-format-1.svg +8 -0
  148. package/src/assets/img/dashboard_icon/gadget-format.svg +19 -0
  149. package/src/assets/img/dashboard_icon/gadget-fullscreen.svg +30 -0
  150. package/src/assets/img/dashboard_icon/gadget-settings.svg +18 -0
  151. package/src/assets/img/dashboard_icon/gadget-sub-total-0.svg +18 -0
  152. package/src/assets/img/dashboard_icon/gadget-sub-total-1.svg +18 -0
  153. package/src/assets/img/dashboard_icon/gadget-thumbnail.svg +12 -0
  154. package/src/assets/img/dashboard_icon/gadget-type-light.svg +15 -0
  155. package/src/assets/img/dashboard_icon/gadget-type.svg +16 -0
  156. package/src/assets/img/dashboard_icon/geo-white.svg +14 -0
  157. package/src/assets/img/dashboard_icon/geo.svg +14 -0
  158. package/src/assets/img/dashboard_icon/historic-IRR-white.svg +9 -0
  159. package/src/assets/img/dashboard_icon/historic-IRR.svg +5 -0
  160. package/src/assets/img/dashboard_icon/information-1.png +0 -0
  161. package/src/assets/img/dashboard_icon/information-grey.svg +4 -0
  162. package/src/assets/img/dashboard_icon/menu-change-group.svg +3 -0
  163. package/src/assets/img/dashboard_icon/menu-close.svg +20 -0
  164. package/src/assets/img/dashboard_icon/menu-delete.svg +18 -0
  165. package/src/assets/img/dashboard_icon/menu-description.svg +19 -0
  166. package/src/assets/img/dashboard_icon/menu-download.svg +24 -0
  167. package/src/assets/img/dashboard_icon/menu-drag.svg +28 -0
  168. package/src/assets/img/dashboard_icon/menu-duplicate.svg +26 -0
  169. package/src/assets/img/dashboard_icon/menu-properties.svg +18 -0
  170. package/src/assets/img/dashboard_icon/menu-rename.svg +23 -0
  171. package/src/assets/img/dashboard_icon/menu-share.svg +20 -0
  172. package/src/assets/img/dashboard_icon/menu-toolbar.svg +10 -0
  173. package/src/assets/img/dashboard_icon/mobile_selected.svg +10 -0
  174. package/src/assets/img/dashboard_icon/mobile_unselected.svg +10 -0
  175. package/src/assets/img/dashboard_icon/more_Save.svg +3 -0
  176. package/src/assets/img/dashboard_icon/more_View.svg +3 -0
  177. package/src/assets/img/dashboard_icon/multi-series-white.svg +20 -0
  178. package/src/assets/img/dashboard_icon/multi-series.svg +6 -0
  179. package/src/assets/img/dashboard_icon/paint-bucket.svg +6 -0
  180. package/src/assets/img/dashboard_icon/pie-white.svg +16 -0
  181. package/src/assets/img/dashboard_icon/pie.svg +16 -0
  182. package/src/assets/img/dashboard_icon/pivot-chart-active.svg +8 -0
  183. package/src/assets/img/dashboard_icon/pivot-chart.svg +8 -0
  184. package/src/assets/img/dashboard_icon/pivot-white.svg +8 -0
  185. package/src/assets/img/dashboard_icon/pivot.svg +8 -0
  186. package/src/assets/img/dashboard_icon/pivot_column.svg +9 -0
  187. package/src/assets/img/dashboard_icon/pivot_column_active.svg +9 -0
  188. package/src/assets/img/dashboard_icon/pivot_line.svg +12 -0
  189. package/src/assets/img/dashboard_icon/pivot_line_active.svg +12 -0
  190. package/src/assets/img/dashboard_icon/print-A2.svg +3 -0
  191. package/src/assets/img/dashboard_icon/radar-white.svg +19 -0
  192. package/src/assets/img/dashboard_icon/radar.svg +19 -0
  193. package/src/assets/img/dashboard_icon/saveAs.svg +3 -0
  194. package/src/assets/img/dashboard_icon/search_input.svg +4 -0
  195. package/src/assets/img/dashboard_icon/table-3-white.svg +16 -0
  196. package/src/assets/img/dashboard_icon/table-3.svg +16 -0
  197. package/src/assets/img/dashboard_icon/table-filter-off.svg +5 -0
  198. package/src/assets/img/dashboard_icon/table-filter-on.svg +5 -0
  199. package/src/assets/img/dashboard_icon/tag_dashboard_selected.svg +3 -0
  200. package/src/assets/img/dashboard_icon/tag_dashboard_unselected.svg +3 -0
  201. package/src/assets/img/dashboard_icon/tag_share_selected.svg +3 -0
  202. package/src/assets/img/dashboard_icon/tag_share_unselected.svg +3 -0
  203. package/src/assets/img/dashboard_icon/tick.svg +26 -0
  204. package/src/assets/img/dashboard_icon/toolbar_AddDashboard.svg +5 -0
  205. package/src/assets/img/dashboard_icon/toolbar_AddGroup.svg +3 -0
  206. package/src/assets/img/dashboard_icon/toolbar_AddReport.svg +3 -0
  207. package/src/assets/img/dashboard_icon/toolbar_CollapseAll.svg +3 -0
  208. package/src/assets/img/dashboard_icon/toolbar_Customize.svg +3 -0
  209. package/src/assets/img/dashboard_icon/toolbar_DeleteDark.svg +3 -0
  210. package/src/assets/img/dashboard_icon/toolbar_Duplicate.svg +3 -0
  211. package/src/assets/img/dashboard_icon/toolbar_Edit.svg +3 -0
  212. package/src/assets/img/dashboard_icon/toolbar_ExpandAll.svg +3 -0
  213. package/src/assets/img/dashboard_icon/toolbar_Search.svg +3 -0
  214. package/src/assets/img/dashboard_icon/topbar-menu.svg +33 -0
  215. package/src/assets/img/dashboard_icon/topbar-refresh.svg +17 -0
  216. package/src/assets/img/dashboard_icon/topbar-tool-off.svg +12 -0
  217. package/src/assets/img/dashboard_icon/topbar-tool-on.svg +12 -0
  218. package/src/assets/img/dashboard_icon/trade-up-white.svg +14 -0
  219. package/src/assets/img/dashboard_icon/trade-up.svg +14 -0
  220. package/src/assets/img/dashboard_icon/transpose-white.svg +16 -0
  221. package/src/assets/img/dashboard_icon/transpose.svg +16 -0
@@ -0,0 +1,3211 @@
1
+ import { Component, Input, ViewChild, ChangeDetectionStrategy, Inject, Optional, } from "@angular/core";
2
+ import { ToolbarService, FieldListService, NumberFormattingService, CalculatedFieldService, GroupingBarService, VirtualScrollService, DrillThroughService, } from "@syncfusion/ej2-angular-pivotview";
3
+ import { L10n, enableRipple, Browser, } from "@syncfusion/ej2-base";
4
+ import { sortBy, differenceWith, startsWith, cloneDeep, uniqBy, filter as _filter, maxBy, minBy, sumBy, meanBy, } from "lodash";
5
+ import { AGGREGATE_TYPES_TEXT, ALL_AGGREGATE_TYPES, } from "../../dashboardPorlets.service";
6
+ import { Observable } from "rxjs";
7
+ import { MaskedTextBox } from "@syncfusion/ej2-inputs/src/maskedtextbox/maskedtextbox";
8
+ import { DataManager } from "@syncfusion/ej2-data/src/manager";
9
+ import { Predicate, Query } from "@syncfusion/ej2-data/src/query";
10
+ import { DataUtil } from "@syncfusion/ej2-data";
11
+ import moment from "moment";
12
+ import { PBF_TOKEN } from "../../../service/InjectionToken";
13
+ import * as i0 from "@angular/core";
14
+ import * as i1 from "../../dashboardPorlets.service";
15
+ import * as i2 from "../../dashboard.service";
16
+ import * as i3 from "@angular/common";
17
+ import * as i4 from "@syncfusion/ej2-angular-pivotview";
18
+ enableRipple(false);
19
+ export class GadgetPivotComponent {
20
+ dashboardPorletsService;
21
+ dashboardService;
22
+ ref;
23
+ pbf;
24
+ portlet;
25
+ dashboard;
26
+ portlets;
27
+ Pivot_Data;
28
+ config;
29
+ dataSourceSettings;
30
+ gridSettings;
31
+ excludeFields = [];
32
+ filterSettings = [];
33
+ datePipeFormat;
34
+ translation;
35
+ pivotObj;
36
+ fieldlistObj;
37
+ observable = new Observable();
38
+ grandTotals = {};
39
+ subTotals = {};
40
+ flag = false;
41
+ previousSort;
42
+ subscriptions = [];
43
+ allDataValue;
44
+ // private calculatedFieldSettings;
45
+ isInit = true;
46
+ pivotSearchBox;
47
+ tooltipSettings = {
48
+ enable: false,
49
+ };
50
+ columnTexts = [];
51
+ configFields = [];
52
+ quarterFormat = [
53
+ { value: "03/2021", format: "MM/yyyy" },
54
+ { value: "03/21", format: "MM/dd" },
55
+ { value: "3/2021", format: "M/yyyy" },
56
+ { value: "3/21", format: "M/yy" },
57
+ { value: "March 2021", format: "MMMM yyyy" },
58
+ { value: "Mar, 2021", format: "MMM, yyyy" },
59
+ { value: "March, 2021", format: "MMMM, yyyy" },
60
+ { value: "2021", format: "yyyy" },
61
+ ];
62
+ zoomSettings = {
63
+ enable: false,
64
+ };
65
+ itemDataTypeSortArr = [
66
+ "Assets",
67
+ "Liabilities",
68
+ "Equity",
69
+ "P&L",
70
+ "Cashflow",
71
+ ];
72
+ formatDates = [];
73
+ customCalculatedFields = []; // 自定义计算列
74
+ allowedCalculatedFields = []; // 允许自定义算法的字段
75
+ zeroFormatData = {
76
+ emptyList: [],
77
+ hgList: [],
78
+ };
79
+ millionFields = [];
80
+ tempSubtotals = [];
81
+ orderByColumns; // Eg: "DueDate, Sequence"
82
+ isApplyIRR = false;
83
+ calcIRRData;
84
+ percentNumFields = [];
85
+ pageLoading;
86
+ constructor(dashboardPorletsService, dashboardService, ref, pbf) {
87
+ this.dashboardPorletsService = dashboardPorletsService;
88
+ this.dashboardService = dashboardService;
89
+ this.ref = ref;
90
+ this.pbf = pbf;
91
+ }
92
+ ngOnInit() {
93
+ this.getInfo();
94
+ L10n.load({
95
+ "en-US": {
96
+ pivotview: AGGREGATE_TYPES_TEXT,
97
+ pivotfieldlist: AGGREGATE_TYPES_TEXT,
98
+ },
99
+ zh: {
100
+ pivotview: AGGREGATE_TYPES_TEXT,
101
+ pivotfieldlist: AGGREGATE_TYPES_TEXT,
102
+ },
103
+ "zh-Hant-HK": {
104
+ pivotview: AGGREGATE_TYPES_TEXT,
105
+ pivotfieldlist: AGGREGATE_TYPES_TEXT,
106
+ },
107
+ ja: {
108
+ pivotview: AGGREGATE_TYPES_TEXT,
109
+ pivotfieldlist: AGGREGATE_TYPES_TEXT,
110
+ },
111
+ ko: {
112
+ pivotview: AGGREGATE_TYPES_TEXT,
113
+ pivotfieldlist: AGGREGATE_TYPES_TEXT,
114
+ },
115
+ fr: {
116
+ pivotview: AGGREGATE_TYPES_TEXT,
117
+ pivotfieldlist: AGGREGATE_TYPES_TEXT,
118
+ },
119
+ });
120
+ this.getData();
121
+ }
122
+ ngAfterViewInit() {
123
+ this.subscriptions.push(this.dashboardService.getchangePivot().subscribe((updated) => {
124
+ if (updated === this.portlet.newId) {
125
+ this.getData();
126
+ }
127
+ }));
128
+ this.subscriptions.push(this.dashboardService.getStartRefresh().subscribe((dashboardId) => {
129
+ if (dashboardId === this.dashboard.id) {
130
+ this.pageLoading = true;
131
+ this.ref.markForCheck();
132
+ }
133
+ }));
134
+ this.subscriptions.push(this.dashboardService.getUpdated().subscribe((newId) => {
135
+ if (newId === this.portlet.newId || newId === this.portlet.id) {
136
+ this.getData();
137
+ if (this.pivotObj)
138
+ this.pivotObj.refreshData();
139
+ }
140
+ }));
141
+ this.subscriptions.push(this.dashboardService.getRefreshGadget().subscribe((e) => {
142
+ if (!e) {
143
+ return;
144
+ }
145
+ const id = e["newId"];
146
+ if (id === this.portlet.newId || id === this.portlet.id) {
147
+ this.pageLoading = false;
148
+ this.getData();
149
+ }
150
+ }));
151
+ this.subscriptions.push(this.dashboardService.getTableFormat().subscribe((updated) => {
152
+ if (updated === this.portlet.newId) {
153
+ this.getData();
154
+ if (this.pivotObj)
155
+ this.pivotObj.refreshData();
156
+ }
157
+ }));
158
+ this.subscriptions.push(this.dashboardService
159
+ .clearFieldListObservable()
160
+ .subscribe((updated) => {
161
+ if (updated === this.portlet.newId) {
162
+ this.pivotObj.dataSourceSettings.dataSource = [];
163
+ if (this.pivotObj)
164
+ this.pivotObj.refreshData();
165
+ if (this.fieldlistObj)
166
+ this.fieldlistObj.updateDataSource();
167
+ this.ref.markForCheck();
168
+ this.ref.detectChanges();
169
+ }
170
+ }));
171
+ // title change
172
+ this.subscriptions.push(this.dashboardService.updatePortletTitle().subscribe((updated) => {
173
+ if (updated) {
174
+ this.config = JSON.parse(this.portlet.config);
175
+ }
176
+ }));
177
+ }
178
+ ngOnDestroy() {
179
+ this.subscriptions.forEach((sub) => sub.unsubscribe());
180
+ }
181
+ onMemberEditorOpen(args) {
182
+ // 你可以在这里根据需要修改args来自定义过滤窗口的行为
183
+ // 11247 专门为item data type而设置
184
+ if (args.fieldName === "AccountTypeCode") {
185
+ let res = new Array(5).fill(null);
186
+ const fieldMembers = [...args.fieldMembers];
187
+ for (let i = fieldMembers.length - 1; i >= 0; i--) {
188
+ let index = -1;
189
+ const item = this.itemDataTypeSortArr.find((name, ind) => {
190
+ if (fieldMembers[i].actualText === name) {
191
+ index = ind;
192
+ }
193
+ return fieldMembers[i].actualText === name;
194
+ });
195
+ if (!item) {
196
+ continue;
197
+ }
198
+ const fillItem = fieldMembers.splice(i, 1);
199
+ res[index] = fillItem[0];
200
+ }
201
+ res = res.filter((item) => item) || [];
202
+ args.fieldMembers = [...res, ...fieldMembers];
203
+ setTimeout(() => {
204
+ const ele = document.querySelector(".e-member-editor-dialog");
205
+ if (ele) {
206
+ ele.querySelector(".e-filter-sort").setAttribute("style", "display: none");
207
+ }
208
+ });
209
+ }
210
+ }
211
+ setGridSettings() {
212
+ this.gridSettings = {
213
+ columnWidth: 140,
214
+ rowHeight: 40,
215
+ allowSelection: true,
216
+ selectionSettings: {
217
+ mode: "Cell",
218
+ type: "Multiple",
219
+ cellSelectionMode: "Box",
220
+ },
221
+ columnRender: this.observable.subscribe((args) => {
222
+ this.setColumnsRender(args);
223
+ }),
224
+ // 升级后 默认会有导出样式覆盖,需要手动设置导出标题样式
225
+ excelHeaderQueryCellInfo: this.observable.subscribe((args) => {
226
+ // args.style是个ExcelStyle类型
227
+ args.style = {
228
+ bold: true,
229
+ vAlign: "Center",
230
+ wrapText: false,
231
+ indent: 0,
232
+ borders: null, // 不需要border
233
+ };
234
+ }),
235
+ // 升级后 默认会有导出样式覆盖,需要手动设置导出内容样式
236
+ excelQueryCellInfo: this.observable.subscribe((args) => {
237
+ // #f486cfff 这里输出的是RGBA 颜色格式, xlsx里不需要透明度,去掉尾部ff
238
+ if (args.style && args.style.backColor) {
239
+ args.style.backColor = args.style.backColor.substring(0, 7);
240
+ }
241
+ let _style = {
242
+ bold: false,
243
+ wrapText: false,
244
+ borders: null,
245
+ fontColor: args.style.fontColor,
246
+ backColor: args.style.backColor,
247
+ };
248
+ let colIndex = args.cell.colIndex;
249
+ let rowIndex = args.cell.rowIndex;
250
+ if (this.config.showGrandTotals) {
251
+ // GrandTotal不需要颜色
252
+ if (args.data.length === rowIndex + 1) {
253
+ delete _style.fontColor;
254
+ delete _style.backColor;
255
+ }
256
+ }
257
+ if (args.data[rowIndex][colIndex].formattedText == "") {
258
+ args.value = "";
259
+ }
260
+ args.style = Object.assign(args.style, _style);
261
+ if (args.value === "" && args.style.numberFormat) {
262
+ args.style.numberFormat = null;
263
+ }
264
+ if (this.formatDates && this.formatDates.length) {
265
+ let dateFields = this.formatDates.map((el) => {
266
+ return el.name;
267
+ });
268
+ if (args.value &&
269
+ (args.cell.colIndex === 0
270
+ ? dateFields.includes(args.cell.valueSort.axis)
271
+ : dateFields.includes(args.cell.actualText))) {
272
+ //Customize the Row headers/Column headers based on your needs
273
+ let headers;
274
+ if (args.cell.colIndex === 0) {
275
+ headers = args.cell.actualText;
276
+ }
277
+ else {
278
+ // headers = pivotValues[k][j].formattedText;
279
+ headers = args.value;
280
+ }
281
+ if (headers) {
282
+ let date = new Date(headers);
283
+ let quarter = Math.floor(date.getMonth() / 3) + 1;
284
+ let format;
285
+ this.formatDates.map((el) => {
286
+ if (args.cell.colIndex == 0) {
287
+ if (el.name ==
288
+ args.cell.valueSort.axis)
289
+ format = el.format;
290
+ }
291
+ else {
292
+ if (el.name == args.cell.actualText)
293
+ format = el.format;
294
+ }
295
+ });
296
+ args.value = this.getQuarterValue(format, date, quarter);
297
+ }
298
+ }
299
+ }
300
+ }),
301
+ };
302
+ }
303
+ beforeExport(exportData) {
304
+ if (exportData) {
305
+ const keyMap = {};
306
+ this.dataSourceSettings.formatSettings.forEach((data) => {
307
+ if (data.format === "#,###,,.0;(#,###,,.0)" ||
308
+ data.format === "#,###,,;(#,###,,)" ||
309
+ data.format === "#,###,,.00;(#,###,,.00)") {
310
+ keyMap[data.name] = true;
311
+ }
312
+ });
313
+ if (exportData.dataCollections &&
314
+ exportData.dataCollections.length) {
315
+ exportData.dataCollections[0].forEach((row) => {
316
+ row.forEach((cell) => {
317
+ if (keyMap[cell.actualText]) {
318
+ cell.value = cell.actualValue;
319
+ }
320
+ if (typeof cell.value === "object" &&
321
+ typeof cell.formattedText === "string") {
322
+ cell.value = cell.formattedText;
323
+ }
324
+ });
325
+ });
326
+ }
327
+ }
328
+ }
329
+ async getData() {
330
+ this.pageLoading = false;
331
+ let columns = [];
332
+ let values = [];
333
+ let formatSettings = [];
334
+ let rows = [];
335
+ let fieldMapping = [];
336
+ // 清空grandTotals和subTotals
337
+ this.grandTotals = {};
338
+ this.subTotals = {};
339
+ this.config = JSON.parse(this.portlet.config);
340
+ this.setGridSettings();
341
+ if (this.config.fields) {
342
+ if (this.dashboardPorletsService.allFieldsObj[this.portlet.id]) {
343
+ this.configFields =
344
+ this.dashboardPorletsService.setConfigFields(this.dashboardPorletsService.allFieldsObj[this.portlet.id], this.config.fields);
345
+ }
346
+ else {
347
+ this.configFields = [...this.config.fields];
348
+ }
349
+ }
350
+ this.Pivot_Data = this.dashboardPorletsService.getResultByDataTable(this.portlet, false, false, this.dashboard.id);
351
+ this.orderByColumns = this.dashboardPorletsService.getOrderByColumnsNew(this.portlet.figureCode, this.dashboard);
352
+ this.Pivot_Data = DataUtil.parse.parseJson(this.Pivot_Data);
353
+ if (this.Pivot_Data && this.Pivot_Data.length > 0) {
354
+ // 移除列名和数据key不匹配的项
355
+ this.getexcludeFields(this.configFields, this.Pivot_Data[0]);
356
+ if (!this.allowedCalculatedFields.length) {
357
+ this.allowedCalculatedFields = Object.keys(this.Pivot_Data[0]);
358
+ }
359
+ for (let item of this.configFields) {
360
+ // 字段分组 https://ej2.syncfusion.com/angular/documentation/pivotview/field-list?search=fieldMapping#group-fields-under-desired-folder-name
361
+ fieldMapping.push({
362
+ name: item.colName,
363
+ caption: item.addtionName
364
+ ? `${item.langValue} ${item.addtionName}`
365
+ : item.langValue
366
+ ? item.langValue
367
+ : this.translation[item.langCode] || item.langCode,
368
+ dataType: item.dataType,
369
+ });
370
+ }
371
+ }
372
+ if (this.configFields) {
373
+ this.percentNumFields = [];
374
+ this.formatDates = [];
375
+ this.zeroFormatData.hgList = [];
376
+ this.zeroFormatData.emptyList = [];
377
+ this.millionFields = [];
378
+ this.configFields.map((el) => {
379
+ // SMP2-2486 & percentNum的format问题
380
+ if (el.dataType == "percentNum") {
381
+ this.percentNumFields.push(el.colName);
382
+ }
383
+ if (el.format &&
384
+ el.format.length &&
385
+ el.format[0].formatChecked &&
386
+ [2, 5, 8, 11, 14, 17].includes(el.format[0].selectedFormat))
387
+ this.zeroFormatData.hgList.push(el.colName);
388
+ if (el.format &&
389
+ el.format.length &&
390
+ el.format[0].formatChecked &&
391
+ [3, 6, 9, 12, 15, 18].includes(el.format[0].selectedFormat))
392
+ this.zeroFormatData.emptyList.push(el.colName);
393
+ // pivotTableformatPercent 百分比也有10,11,12 但是它是显示0.00x的格式,所以得排除
394
+ if (el.dataType !== "percent" &&
395
+ el.format &&
396
+ el.format.length &&
397
+ el.format[0].formatChecked &&
398
+ [10, 11, 12, 13, 14, 15, 16, 17, 18].includes(el.format[0].selectedFormat))
399
+ this.millionFields.push(el.colName);
400
+ if (el.dataType === "number" &&
401
+ (!el.format ||
402
+ (el.format &&
403
+ el.format.length &&
404
+ !el.format[0].formatChecked))) {
405
+ const formatData = {
406
+ name: el.colName,
407
+ //SMP2-3026 and SMP2-3059
408
+ format: el.colName !== "PortInvStk" &&
409
+ el.colName !== "PortFdInvStk"
410
+ ? this.dashboardPorletsService.formatNumber(el.dp)
411
+ : "##0.#######0",
412
+ useGrouping: true,
413
+ };
414
+ formatSettings.push(formatData);
415
+ }
416
+ if ((el.dataType === "percent" ||
417
+ el.dataType === "percentNum") &&
418
+ (!el.format ||
419
+ (el.format &&
420
+ el.format.length &&
421
+ !el.format[0].formatChecked))) {
422
+ const formatData = {
423
+ name: el.colName,
424
+ format: this.dashboardPorletsService.formatPercent(el.dp),
425
+ };
426
+ formatSettings.push(formatData);
427
+ }
428
+ if (el.dataType === "multiple" &&
429
+ (!el.format ||
430
+ (el.format &&
431
+ el.format.length &&
432
+ !el.format[0].formatChecked))) {
433
+ const formatData = {
434
+ name: el.colName,
435
+ format: this.dashboardPorletsService.formatMultiple(el.dp),
436
+ };
437
+ formatSettings.push(formatData);
438
+ }
439
+ if (el.dataType === "datetime" || el.dataType === "date") {
440
+ let format = "";
441
+ if (el.format &&
442
+ el.format.length &&
443
+ el.format[0].formatChecked) {
444
+ if (el.format[0].dateType == "Quarter") {
445
+ let format_ = el.format[0].selectedFormatDisplay;
446
+ let formatInfo = this.quarterFormat.filter((qur) => qur.value == format_);
447
+ if (formatInfo.length) {
448
+ format = formatInfo[0].format;
449
+ }
450
+ else {
451
+ const formatData = {
452
+ name: el.colName,
453
+ format: format_,
454
+ type: "date",
455
+ };
456
+ this.formatDates.push(formatData);
457
+ }
458
+ }
459
+ else if (el.format[0].dateType == "Date") {
460
+ let fromIdx = el.format[0].selectedFormatDisplay.indexOf("(");
461
+ let toIdx = el.format[0].selectedFormatDisplay.indexOf(")");
462
+ let format_ = el.format[0].selectedFormatDisplay.slice(fromIdx + 1, toIdx);
463
+ switch (format_) {
464
+ case "DD/MM/YYYY":
465
+ format = "dd/MM/yyyy";
466
+ break;
467
+ case "DD/MM/YY":
468
+ format = "dd/MM/yy";
469
+ break;
470
+ case "MM/DD/YYYY":
471
+ format = "MM/dd/yyyy";
472
+ break;
473
+ case "MM/DD/YY":
474
+ format = "MM/dd/yy";
475
+ break;
476
+ case "YYYY-MM-DD":
477
+ format = "yyyy-MM-dd";
478
+ break;
479
+ case "YY-MM-DD":
480
+ format = "yy-MM-dd";
481
+ break;
482
+ case "DD-MM-YYYY":
483
+ format = "dd-MM-yyyy";
484
+ break;
485
+ case "DD-MM-YY":
486
+ format = "dd-MM-yy";
487
+ break;
488
+ case "MM-DD-YYYY":
489
+ format = "MM-dd-yyyy";
490
+ break;
491
+ case "MM-DD-YY":
492
+ format = "MM-dd-yy";
493
+ break;
494
+ case "MMM DD, YYYY":
495
+ format = "MMM dd, yyyy";
496
+ break;
497
+ case "DD-MMM-YYYY":
498
+ format = "dd-MMM-yyyy";
499
+ break;
500
+ default:
501
+ break;
502
+ }
503
+ }
504
+ }
505
+ if (!format) {
506
+ const formatData = {
507
+ name: el.colName,
508
+ format: this.datePipeFormat,
509
+ type: "date",
510
+ };
511
+ formatSettings.push(formatData);
512
+ }
513
+ else {
514
+ const formatData = {
515
+ name: el.colName,
516
+ format: format,
517
+ type: "date",
518
+ };
519
+ formatSettings.push(formatData);
520
+ }
521
+ }
522
+ });
523
+ }
524
+ //calculatedFieldSettings format push to formatSettings
525
+ if (this.config.calculatedFieldSettings &&
526
+ this.config.calculatedFieldSettings.length > 0) {
527
+ this.config.calculatedFieldSettings.map((el) => {
528
+ if (el.formatString !== "") {
529
+ for (let i = formatSettings.length - 1; i >= 0; i--) {
530
+ if (formatSettings[i].name === el.name) {
531
+ formatSettings.splice(i, 1);
532
+ }
533
+ }
534
+ formatSettings.push({
535
+ name: el.name,
536
+ format: el.formatString,
537
+ });
538
+ }
539
+ });
540
+ }
541
+ let series = this.config.yaxis.series;
542
+ if (series) {
543
+ for (let item of series) {
544
+ const value = {
545
+ name: item.colName,
546
+ caption: this.getCaptionByName(item.colName) || item.title,
547
+ type: item.calMethod,
548
+ };
549
+ values.push(value);
550
+ }
551
+ }
552
+ let groups = this.config.xaxis.groups;
553
+ if (groups) {
554
+ for (let gitem of groups) {
555
+ const field = this.configFields.filter((el) => el.colName === gitem.name);
556
+ if (field.length > 0) {
557
+ gitem.showSubTotals = field[0].showSubTotals;
558
+ gitem.caption =
559
+ field[0].langValue ||
560
+ this.translation[field[0].langCode] ||
561
+ gitem.caption ||
562
+ field[0].langCode;
563
+ }
564
+ rows.push(gitem);
565
+ }
566
+ }
567
+ if (this.config.columnGroup && this.config.columnGroup.length) {
568
+ for (let item of this.config.columnGroup) {
569
+ const field = this.configFields.filter((el) => el.colName === item.name);
570
+ if (field.length > 0) {
571
+ item.showSubTotals = field[0].showSubTotals;
572
+ item.caption =
573
+ field[0].langValue ||
574
+ this.translation[field[0].langCode] ||
575
+ field[0].langCode ||
576
+ item.caption;
577
+ }
578
+ columns.push(item);
579
+ }
580
+ }
581
+ let conditionalFormatSettings = [];
582
+ this.configFields.forEach((field) => {
583
+ if (field.format && field.format.length) {
584
+ if (field.format[0].fontSettingChecked) {
585
+ let conditionalFormatObj = {
586
+ applyGrandTotals: true,
587
+ measure: "",
588
+ value1: null,
589
+ value2: null,
590
+ conditions: "",
591
+ style: {
592
+ backgroundColor: "",
593
+ color: "",
594
+ fontFamily: "",
595
+ fontSize: "",
596
+ },
597
+ };
598
+ let negaConditionalFormatObj = {
599
+ applyGrandTotals: true,
600
+ measure: "",
601
+ value1: null,
602
+ value2: null,
603
+ conditions: "",
604
+ style: {
605
+ backgroundColor: "",
606
+ color: "",
607
+ fontFamily: "",
608
+ fontSize: "",
609
+ },
610
+ };
611
+ // font setting start
612
+ negaConditionalFormatObj.measure =
613
+ field.format[0].selectedField;
614
+ conditionalFormatObj.measure =
615
+ field.format[0].selectedField;
616
+ if (field.format[0].formatChecked &&
617
+ field.format[0].compareSelect) {
618
+ this.setCompareConditional(negaConditionalFormatObj, conditionalFormatObj, field.format[0]);
619
+ }
620
+ else {
621
+ delete conditionalFormatObj.value2;
622
+ delete negaConditionalFormatObj.value2;
623
+ negaConditionalFormatObj.value1 = 0;
624
+ negaConditionalFormatObj.conditions = "LessThan";
625
+ conditionalFormatObj.value1 = 0;
626
+ conditionalFormatObj.conditions = "GreaterThan";
627
+ this.setFontSettingConditional(negaConditionalFormatObj, field.format[0], -1);
628
+ this.setFontSettingConditional(conditionalFormatObj, field.format[0], 1);
629
+ }
630
+ conditionalFormatSettings.push(negaConditionalFormatObj);
631
+ conditionalFormatSettings.unshift(conditionalFormatObj);
632
+ // font setting end
633
+ }
634
+ let formatSettingsObj = {
635
+ name: "",
636
+ format: "",
637
+ };
638
+ if (field.format[0].formatChecked) {
639
+ formatSettingsObj.name = field.format[0].selectedField;
640
+ formatSettingsObj.format =
641
+ this.dashboardPorletsService.pivotTableformatNumber(field.format[0].selectedFormat);
642
+ switch (field.format[0].dataType) {
643
+ case "number":
644
+ formatSettingsObj.format =
645
+ this.dashboardPorletsService.pivotTableformatNumber(field.format[0].selectedFormat);
646
+ break;
647
+ case "integer":
648
+ formatSettingsObj.format =
649
+ this.dashboardPorletsService.pivotTableformatInteger(field.format[0].selectedFormat);
650
+ break;
651
+ case "percentNum":
652
+ case "percent":
653
+ formatSettingsObj.format =
654
+ this.dashboardPorletsService.pivotTableformatPercent(field.format[0].selectedFormat);
655
+ break;
656
+ case "multiple":
657
+ formatSettingsObj.format =
658
+ this.dashboardPorletsService.pivotTableformatMultiple(field.format[0].selectedFormat);
659
+ break;
660
+ case "date":
661
+ case "datetime":
662
+ let format = "";
663
+ if (field.format && field.format.length) {
664
+ if (field.format[0].dateType == "Quarter") {
665
+ format =
666
+ field.format[0].selectedFormatDisplay;
667
+ }
668
+ else if (field.format[0].dateType == "Date") {
669
+ let fromIdx = field.format[0].selectedFormatDisplay.indexOf("(");
670
+ let toIdx = field.format[0].selectedFormatDisplay.indexOf(")");
671
+ format =
672
+ field.format[0].selectedFormatDisplay.slice(fromIdx + 1, toIdx);
673
+ }
674
+ }
675
+ if (format) {
676
+ formatSettingsObj = {
677
+ name: field.colName,
678
+ format: "",
679
+ };
680
+ // field.dataType = "string";
681
+ }
682
+ else {
683
+ formatSettingsObj.format = this.datePipeFormat;
684
+ formatSettingsObj["type"] = "date";
685
+ }
686
+ break;
687
+ default:
688
+ break;
689
+ }
690
+ }
691
+ if (field.format[0].dataType !== "string" &&
692
+ formatSettingsObj.format) {
693
+ formatSettings.push(formatSettingsObj);
694
+ }
695
+ }
696
+ });
697
+ this.customCalculatedFields = this.config.customCalculatedFields
698
+ ? this.config.customCalculatedFields
699
+ : [];
700
+ // SMP2-4582 AGIC - Dashboard item sequence
701
+ let isExistSeq = false;
702
+ let sortSettings = this.config.sortSettings || [];
703
+ if (this.Pivot_Data &&
704
+ this.Pivot_Data[0] &&
705
+ this.Pivot_Data[0].Seq !== null) {
706
+ // 取消Name的默认排序,根据Seq来排序
707
+ sortSettings.push({ name: "Name", order: "None" });
708
+ isExistSeq = true;
709
+ }
710
+ let filterSettings = this.dashboardPorletsService.checkFilterSettings(this.config, this.configFields, this.Pivot_Data);
711
+ let nameFilter = filterSettings.find((x) => x.name === "Name");
712
+ // 存在 Name的filter时,会按照默认排序,需要对Name进行Seq排序处理
713
+ if (isExistSeq && nameFilter && rows.some((x) => x.name === "Name")) {
714
+ let items = nameFilter.items; // 拿到当前排序,默认A-Z
715
+ let seqArr = [];
716
+ items.forEach((name) => {
717
+ let obj = this.Pivot_Data.find((x) => x.Name === name);
718
+ let item = {
719
+ name: name,
720
+ seq: obj.Seq,
721
+ };
722
+ seqArr.push(item);
723
+ });
724
+ seqArr.sort((a, b) => a.seq - b.seq);
725
+ nameFilter.items = seqArr.map((x) => x.name);
726
+ }
727
+ const allFields = this.dashboardPorletsService.allFieldsObj[this.portlet.id];
728
+ if (allFields) {
729
+ values.forEach((value) => {
730
+ const item = allFields.find((field) => field.colName === value.name);
731
+ if (item) {
732
+ value.caption =
733
+ (item.format &&
734
+ item.format.length &&
735
+ item.format[0].displayName) ||
736
+ item.langValue ||
737
+ this.translation[item.langCode] ||
738
+ item.langCode;
739
+ }
740
+ });
741
+ }
742
+ let hasItemDataType = false;
743
+ if (this.Pivot_Data) {
744
+ this.Pivot_Data.map((data) => {
745
+ if (data["AccountTypeCode"]) {
746
+ hasItemDataType = true;
747
+ }
748
+ rows.forEach((row) => {
749
+ if (data[row.name] === "") {
750
+ data[row.name] = "null";
751
+ }
752
+ });
753
+ });
754
+ }
755
+ if (hasItemDataType) {
756
+ sortSettings.push({
757
+ name: "AccountTypeCode",
758
+ order: "Ascending",
759
+ membersOrder: [...this.itemDataTypeSortArr],
760
+ });
761
+ }
762
+ this.config.filters.forEach((filter) => {
763
+ filter.caption =
764
+ this.getCaptionByName(filter.name) || filter.caption;
765
+ });
766
+ this.dataSourceSettings = {
767
+ dataSource: this.Pivot_Data || [],
768
+ rows: rows || [],
769
+ columns: columns || [],
770
+ values: values || [],
771
+ filters: this.config.filters,
772
+ filterSettings: filterSettings,
773
+ excludeFields: this.excludeFields,
774
+ formatSettings: formatSettings,
775
+ conditionalFormatSettings: conditionalFormatSettings,
776
+ // 用于收起展开指定层级, 这玩意只能展开第一层,
777
+ // 必须设定expandAll 为false(默认是false), 这样子才能实现只展开两层
778
+ // drilledMembers,
779
+ expandAll: true,
780
+ enableSorting: true,
781
+ fieldMapping: fieldMapping,
782
+ calculatedFieldSettings: this.config.calculatedFieldSettings,
783
+ sortSettings: sortSettings,
784
+ // groupSettings: this.config.groupSettings,
785
+ valueSortSettings: this.config.valueSortSettings,
786
+ showGrandTotals: this.config.showGrandTotals,
787
+ showRowGrandTotals: this.config.showRowGrandTotals,
788
+ showColumnGrandTotals: this.config.showColumnGrandTotals,
789
+ showSubTotals: this.config.showSubTotals,
790
+ showRowSubTotals: this.config.showRowSubTotals,
791
+ showColumnSubTotals: this.config.showColumnSubTotals,
792
+ };
793
+ console.log("this.dataSourceSettings", this.dataSourceSettings);
794
+ this.ref.markForCheck();
795
+ }
796
+ getCaptionByName(nameString) {
797
+ if (!nameString)
798
+ return "";
799
+ const field = this.configFields.find((el) => el.colName === nameString);
800
+ return field
801
+ ? field.langValue ||
802
+ this.translation[field && field.langCode] ||
803
+ field.langCode
804
+ : "";
805
+ }
806
+ afterPopulate(args) {
807
+ this.tempSubtotals = [];
808
+ this.grandTotals = {};
809
+ this.subTotals = {};
810
+ let tempshowArray = [];
811
+ this.config.yaxis.series.forEach((item) => {
812
+ if (item.hasOwnProperty("showSubTotals") &&
813
+ item.hasOwnProperty("showGrandTotals")) {
814
+ tempshowArray.push({
815
+ name: item.colName,
816
+ calMethod: item.calMethod,
817
+ showSubTotals: item.showSubTotals,
818
+ showGrandTotals: item.showGrandTotals,
819
+ });
820
+ }
821
+ else {
822
+ if (item.hasOwnProperty("showGrandTotals")) {
823
+ tempshowArray.push({
824
+ name: item.colName,
825
+ calMethod: item.calMethod,
826
+ showGrandTotals: item.showGrandTotals,
827
+ });
828
+ }
829
+ if (item.hasOwnProperty("showSubTotals")) {
830
+ tempshowArray.push({
831
+ name: item.colName,
832
+ calMethod: item.calMethod,
833
+ showSubTotals: item.showSubTotals,
834
+ });
835
+ }
836
+ }
837
+ });
838
+ if (this.fieldlistObj && this.pivotObj) {
839
+ this.config.columnGroup = [];
840
+ this.config.xaxis.groups = [];
841
+ this.config.yaxis.series = [];
842
+ this.config.filters = [];
843
+ this.config.filterSettings = [];
844
+ this.config.calculatedFieldSettings = [];
845
+ let groupSettings = this.getDataSourceSettingsProp(this.fieldlistObj, "groupSettings");
846
+ let columns = this.getDataSourceSettingsProp(this.fieldlistObj, "columns");
847
+ let rows = this.getDataSourceSettingsProp(this.fieldlistObj, "rows");
848
+ let filters = this.getDataSourceSettingsProp(this.fieldlistObj, "filters");
849
+ let filterSettings = this.getDataSourceSettingsProp(this.fieldlistObj, "filterSettings");
850
+ let values = this.getDataSourceSettingsProp(this.fieldlistObj, "values");
851
+ let sortSettings = this.getDataSourceSettingsProp(this.fieldlistObj, "sortSettings");
852
+ let calculatedFieldSettings = this.getDataSourceSettingsProp(this.fieldlistObj, "calculatedFieldSettings");
853
+ if (groupSettings.length === 0) {
854
+ for (let column of columns) {
855
+ this.config.columnGroup.push({
856
+ name: column.name,
857
+ caption: this.getCaptionByName(column.name) ||
858
+ column.caption,
859
+ });
860
+ }
861
+ }
862
+ else {
863
+ //If there is a group, first filter the columns of the group field, and then only save the last one
864
+ for (let column of columns) {
865
+ if (!startsWith(column.name, groupSettings[0].name + "_")) {
866
+ this.config.columnGroup.push({
867
+ name: column.name,
868
+ caption: column.name === groupSettings[0].name
869
+ ? ""
870
+ : this.getCaptionByName(column.name) ||
871
+ column.caption,
872
+ });
873
+ }
874
+ }
875
+ }
876
+ for (let row of rows) {
877
+ this.config.xaxis.groups.push({
878
+ name: row.name,
879
+ caption: this.getCaptionByName(row.name) || row.caption,
880
+ });
881
+ }
882
+ for (let filter of filters) {
883
+ this.config.filters.push({
884
+ name: filter.name,
885
+ caption: this.getCaptionByName(filter.name) || filter.caption,
886
+ });
887
+ }
888
+ if (this.filterSettings && this.filterSettings.length > 0) {
889
+ args.dataSourceSettings.filterSettings = this.filterSettings;
890
+ this.config.filterSettings = this.filterSettings;
891
+ delete this.filterSettings;
892
+ }
893
+ else {
894
+ this.config.filterSettings = filterSettings;
895
+ }
896
+ for (let value of values) {
897
+ let seriesData;
898
+ let tempShowObj;
899
+ let filterTempshowArray = [];
900
+ if (tempshowArray.length) {
901
+ filterTempshowArray = tempshowArray.filter((item) => item.name === value.name &&
902
+ item.calMethod === value.type);
903
+ if (filterTempshowArray.length) {
904
+ tempShowObj = filterTempshowArray[0];
905
+ if (tempShowObj.hasOwnProperty("showSubTotals") &&
906
+ tempShowObj.hasOwnProperty("showGrandTotals")) {
907
+ seriesData = {
908
+ colName: value.name,
909
+ calMethod: value.type,
910
+ title: value.caption,
911
+ showSubTotals: tempShowObj.showSubTotals,
912
+ showGrandTotals: tempShowObj.showGrandTotals,
913
+ };
914
+ }
915
+ else {
916
+ if (tempShowObj.hasOwnProperty("showGrandTotals")) {
917
+ seriesData = {
918
+ colName: value.name,
919
+ calMethod: value.type,
920
+ title: value.caption,
921
+ showGrandTotals: tempShowObj.showGrandTotals,
922
+ };
923
+ }
924
+ if (tempShowObj.hasOwnProperty("showSubTotals")) {
925
+ seriesData = {
926
+ colName: value.name,
927
+ calMethod: value.type,
928
+ title: value.caption,
929
+ showSubTotals: tempShowObj.showSubTotals,
930
+ };
931
+ }
932
+ }
933
+ }
934
+ }
935
+ if (!seriesData) {
936
+ seriesData = {
937
+ colName: value.name,
938
+ title: value.caption,
939
+ calMethod: value.type,
940
+ };
941
+ }
942
+ this.config.yaxis.series.push(seriesData);
943
+ }
944
+ for (let calculate of calculatedFieldSettings) {
945
+ const calculateData = {
946
+ name: calculate.name,
947
+ formula: calculate.formula,
948
+ formatString: calculate.formatString === ""
949
+ ? "N2"
950
+ : calculate.formatString,
951
+ };
952
+ this.config.calculatedFieldSettings.push(calculateData);
953
+ }
954
+ this.config.customCalculatedFields = this.customCalculatedFields;
955
+ this.config.sortSettings = sortSettings;
956
+ this.config.groupSettings = groupSettings;
957
+ this.fieldlistObj.updateView(this.pivotObj);
958
+ }
959
+ this.portlet.config = JSON.stringify(this.config);
960
+ //remove the sort
961
+ if (this.pivotObj.dataSourceSettings.sortSettings.length > 0) {
962
+ this.previousSort = this.fieldlistObj.lastSortInfo;
963
+ this.fieldlistObj.lastSortInfo = [];
964
+ }
965
+ }
966
+ afterEnginePopulate(args) {
967
+ if (!Browser.isDevice && this.fieldlistObj && this.pivotObj) {
968
+ this.config.groupSettings = this.getDataSourceSettingsProp(this.pivotObj, "groupSettings");
969
+ this.portlet.config = JSON.stringify(this.config);
970
+ if (this.fieldlistObj)
971
+ this.fieldlistObj.update(this.pivotObj);
972
+ this.pivotObj.grid.queryCellInfo = this.queryCell.bind(this);
973
+ this.pivotObj.grid.headerCellInfo = this.headerCell.bind(this);
974
+ // SMP2-3929 rollback
975
+ // if (!this.isApplyIRR)
976
+ // this.getCalculationResultByDashboardDataTableId();
977
+ }
978
+ if (this.Pivot_Data && this.Pivot_Data.length) {
979
+ setTimeout(() => {
980
+ this.enginePopulated(args);
981
+ }, 1500);
982
+ }
983
+ }
984
+ getDataSourceSettingsProp(obj, key) {
985
+ let prop = null;
986
+ if (obj && obj.dataSourceSettings) {
987
+ prop = obj.dataSourceSettings[key];
988
+ if (Object.prototype.toString.call(prop) === "[object Array]" &&
989
+ prop.length > 0) {
990
+ prop = prop.map((item) => item.properties || item);
991
+ }
992
+ }
993
+ return prop;
994
+ }
995
+ enginePopulating(args) {
996
+ this.grandTotals = {};
997
+ this.subTotals = {};
998
+ this.allDataValue = [];
999
+ // if (args.dataSourceSettings.sortSettings.length) {
1000
+ // for (
1001
+ // let i = 0;
1002
+ // i < args.dataSourceSettings.sortSettings.length;
1003
+ // i++
1004
+ // ) {
1005
+ // if (
1006
+ // this.fieldlistObj.lastSortInfo &&
1007
+ // this.fieldlistObj.lastSortInfo.name ===
1008
+ // args.dataSourceSettings.sortSettings[i].name &&
1009
+ // this.fieldlistObj.lastSortInfo.order === "Ascending" &&
1010
+ // !(
1011
+ // this.fieldlistObj.lastSortInfo.name ===
1012
+ // this.previousSort.name &&
1013
+ // this.previousSort.order === "None"
1014
+ // )
1015
+ // ) {
1016
+ // args.dataSourceSettings.sortSettings[i].order = "None";
1017
+ // } else if (
1018
+ // this.previousSort &&
1019
+ // this.fieldlistObj.lastSortInfo &&
1020
+ // this.fieldlistObj.lastSortInfo.name ===
1021
+ // this.previousSort.name &&
1022
+ // this.previousSort.order === "Ascending"
1023
+ // ) {
1024
+ // args.dataSourceSettings.sortSettings[i].order = "Ascending";
1025
+ // }
1026
+ // }
1027
+ // }
1028
+ }
1029
+ cellClick(args) {
1030
+ if (args.currentCell.classList.contains("e-headercell")) {
1031
+ this.flag = true;
1032
+ }
1033
+ // 清除排序
1034
+ if (this.pivotObj.dataSourceSettings.valueSortSettings.sortOrder &&
1035
+ this.pivotObj.dataSourceSettings.valueSortSettings.headerText &&
1036
+ this.pivotObj.dataSourceSettings.valueSortSettings.sortOrder ===
1037
+ "Descending" &&
1038
+ args.data.valueSort &&
1039
+ this.pivotObj.dataSourceSettings.valueSortSettings.headerText ===
1040
+ args.data.valueSort.levelName) {
1041
+ this.pivotObj.setProperties({
1042
+ dataSourceSettings: {
1043
+ valueSortSettings: {
1044
+ sortOrder: "Descending",
1045
+ headerText: "",
1046
+ },
1047
+ },
1048
+ }, true);
1049
+ if (this.pivotObj)
1050
+ this.pivotObj.refreshData();
1051
+ this.flag = false;
1052
+ this.config.valueSortSettings = {};
1053
+ this.portlet.config = JSON.stringify(this.config);
1054
+ }
1055
+ }
1056
+ queryCell(args) {
1057
+ this.pivotObj.renderModule.rowCellBoundEvent(args);
1058
+ let rowIndex = Number(args.cell.getAttribute("index"));
1059
+ // 新版本26.x中 aria-colindex 会比旧版本v20.x 多1
1060
+ let colIndex = parseInt(args.cell.getAttribute("aria-colindex")) - 1;
1061
+ if (!this.pivotObj.dataSourceSettings.conditionalFormatSettings.length) {
1062
+ if (args.data && args.data[0].formattedText === "Grand Total") {
1063
+ args.cell.classList.add("grand-class");
1064
+ }
1065
+ else {
1066
+ args.cell.classList.add(rowIndex % 2 ? "odd-class" : "even-class");
1067
+ }
1068
+ }
1069
+ else {
1070
+ let measureArr = this.pivotObj.dataSourceSettings.conditionalFormatSettings.map((obj) => {
1071
+ return obj.measure;
1072
+ });
1073
+ if (measureArr.includes(args.data[colIndex].actualText) &&
1074
+ args.data[colIndex].style) {
1075
+ args.cell.style.cssText += `background-color: ${args.data[colIndex].style.backgroundColor} !important`;
1076
+ }
1077
+ if (args.data && args.data[0].formattedText === "Grand Total")
1078
+ args.cell.classList.add("e-customclass");
1079
+ }
1080
+ if (args.data && args.data[0].formattedText === "Grand Total") {
1081
+ args.cell.classList.add("grand-class");
1082
+ }
1083
+ else {
1084
+ if (rowIndex % 2) {
1085
+ args.cell.classList.add("odd-class");
1086
+ }
1087
+ else {
1088
+ args.cell.classList.add("even-class");
1089
+ }
1090
+ }
1091
+ //get sorting data
1092
+ if (this.flag) {
1093
+ this.flag = false;
1094
+ this.config.valueSortSettings =
1095
+ this.pivotObj.dataSourceSettings.valueSortSettings["properties"];
1096
+ this.portlet.config = JSON.stringify(this.config);
1097
+ }
1098
+ //customize the header text
1099
+ if (this.pivotObj.dataSourceSettings.rows.length === 0) {
1100
+ if (args.data &&
1101
+ args.data[colIndex] &&
1102
+ args.data[colIndex].axis === "row") {
1103
+ args.cell.querySelector(".e-cellvalue").innerText =
1104
+ args.data[colIndex].formattedText;
1105
+ }
1106
+ }
1107
+ // SMP2-2912 subtotal字体加粗
1108
+ if (this.pivotObj.dataSourceSettings.rows.length &&
1109
+ args.data[colIndex] &&
1110
+ args.data[0].level !==
1111
+ this.pivotObj.dataSourceSettings.rows.length - 1 &&
1112
+ args.data[colIndex].rowHeaders !== "" &&
1113
+ args.data[colIndex].axis == "value") {
1114
+ args.cell.classList.add("e-customclass");
1115
+ }
1116
+ }
1117
+ headerCell(args) {
1118
+ this.pivotObj.renderModule.columnCellBoundEvent(args);
1119
+ if (this.pivotObj.dataSourceSettings.columns.length === 0) {
1120
+ let node = args.node.querySelector(".e-headercelldiv .e-headertext");
1121
+ if (node)
1122
+ node.innerText = args.cell.column.headerText;
1123
+ }
1124
+ const textAlign = args.cell.column.textAlign;
1125
+ args.cell.column.headerTextAlign = textAlign;
1126
+ args.node.style.textAlign = textAlign === "Right" ? "right" : "left"; // Align right for numeric columns
1127
+ if (textAlign === "Right") {
1128
+ args.node.classList.add("header-align-right");
1129
+ }
1130
+ this.ref.markForCheck();
1131
+ }
1132
+ dataBound(e) {
1133
+ if (this.isInit) {
1134
+ this.isInit = false;
1135
+ }
1136
+ this.grandTotals = {};
1137
+ this.subTotals = {};
1138
+ if (this.pivotObj.grid) {
1139
+ this.pivotObj.grid.resizeStop = this.resizeStop.bind(this);
1140
+ }
1141
+ if (this.pivotObj) {
1142
+ var index = [];
1143
+ // Get the empty row headers here.
1144
+ var emptyRowHeader = document.querySelectorAll('td[aria-label=" column header "]');
1145
+ for (var ele of emptyRowHeader) {
1146
+ if (ele) {
1147
+ index.push(ele.getAttribute("index"));
1148
+ // Remove all the empty row headers here.
1149
+ ele.closest("tr").remove();
1150
+ }
1151
+ }
1152
+ for (var i = 0; i < index.length; i++) {
1153
+ // Get the empty values here.
1154
+ var emptyValues = this.pivotObj.element.querySelectorAll(`td[index="${index[i]}"]`);
1155
+ if (emptyValues[0]) {
1156
+ // Remove all the empty value rows here.
1157
+ emptyValues[0].closest("tr").remove();
1158
+ }
1159
+ }
1160
+ }
1161
+ if (this.fieldlistObj &&
1162
+ this.fieldlistObj.pivotButtonModule &&
1163
+ this.fieldlistObj.pivotButtonModule.menuOption) {
1164
+ this.fieldlistObj.pivotButtonModule.menuOption.stringAggregateTypes = [
1165
+ "Count",
1166
+ "DistinctCount",
1167
+ "First",
1168
+ "Last",
1169
+ ];
1170
+ }
1171
+ if (this.pivotObj.pivotButtonModule &&
1172
+ this.pivotObj.pivotButtonModule.menuOption) {
1173
+ this.pivotObj.pivotButtonModule.menuOption.stringAggregateTypes = [
1174
+ "Count",
1175
+ "DistinctCount",
1176
+ "First",
1177
+ "Last",
1178
+ ];
1179
+ }
1180
+ let allSummaryType = ALL_AGGREGATE_TYPES;
1181
+ this.pivotObj.getAllSummaryType = function () {
1182
+ return allSummaryType;
1183
+ };
1184
+ if (this.fieldlistObj) {
1185
+ this.fieldlistObj.aggregateTypes = allSummaryType;
1186
+ this.fieldlistObj.getAllSummaryType = function () {
1187
+ return allSummaryType;
1188
+ };
1189
+ }
1190
+ this.setValueItemData();
1191
+ }
1192
+ setValueItemData() {
1193
+ setTimeout(() => {
1194
+ const fieldDom = this.fieldlistObj.fieldListSpinnerElement;
1195
+ this.dataSourceSettings.values.forEach((value) => {
1196
+ if (value.type !== "First" && value.type !== "Last") {
1197
+ return;
1198
+ }
1199
+ const valuesDom = fieldDom.querySelector(`.e-values .${value.name} .e-pvt-btn-content`);
1200
+ if (valuesDom.innerHTML !== `${value.type} of ${value.caption}`) {
1201
+ valuesDom.innerHTML = `${value.type} of ${value.caption}`;
1202
+ }
1203
+ });
1204
+ });
1205
+ }
1206
+ calculatedCellSets(args, curFields) {
1207
+ let matchFields = curFields["matchFields"];
1208
+ let formula = curFields["formula"];
1209
+ let value = 0;
1210
+ let rows = this.pivotObj.dataSourceSettings.rows;
1211
+ let invalidTypes = ["string", "nvarchar", "date", "datetime"];
1212
+ let isInvalid = matchFields.some((f) => invalidTypes.includes(this.configFields.filter((el) => el.colName === f.matchWord)[0]["dataType"]));
1213
+ let currentrowCellType = args.rowCellType;
1214
+ if (isInvalid)
1215
+ return "-";
1216
+ if (args.rowCellType === "subTotal" ||
1217
+ args.rowCellType === "grandTotal") {
1218
+ let childHeaders = [];
1219
+ let sum = 0;
1220
+ let cloneCellSets = cloneDeep(args.cellSets);
1221
+ let groupNameArrays = [];
1222
+ for (let index = args.row.level; index < rows.length; index++) {
1223
+ groupNameArrays.push(rows[index].name);
1224
+ }
1225
+ for (let i = 0; i < cloneCellSets.length; i++) {
1226
+ let values = [];
1227
+ let header = groupNameArrays
1228
+ .map((name) => {
1229
+ values.push(cloneCellSets[i][name]);
1230
+ return cloneCellSets[i][name];
1231
+ })
1232
+ .join("-");
1233
+ if (!childHeaders.includes(header)) {
1234
+ childHeaders.push(header);
1235
+ let filterObj = {};
1236
+ groupNameArrays.map((name, i) => (filterObj[name] = values[i]));
1237
+ args.cellSets = _filter(cloneCellSets, filterObj);
1238
+ args.rowCellType = "value";
1239
+ sum += this.calculatedValues(args, matchFields, formula);
1240
+ }
1241
+ }
1242
+ args.rowCellType = currentrowCellType;
1243
+ // 暂存当前SubTotal, 用于收缩时读取
1244
+ let prefixHeader = this.getCalcHeader(args, formula);
1245
+ this.updateTempSubtotals(prefixHeader, sum);
1246
+ return sum;
1247
+ }
1248
+ else if (args.rowCellType === "value") {
1249
+ if (args.row.hasChild) {
1250
+ // collapse 读取SubTotal
1251
+ let header = this.getCalcHeader(args, formula);
1252
+ let index = this.tempSubtotals.findIndex((item) => item.rowName === header);
1253
+ if (index > -1) {
1254
+ value = this.tempSubtotals[index].rowValue;
1255
+ }
1256
+ }
1257
+ else {
1258
+ // expand
1259
+ value = this.calculatedValues(args, matchFields, formula);
1260
+ }
1261
+ }
1262
+ return value;
1263
+ }
1264
+ actionFailure(args) {
1265
+ if (args.actionName == "Drill down" || args.actionName == "Drill up") {
1266
+ // Triggers when the current UI action fails to achieve the desired result.
1267
+ }
1268
+ }
1269
+ getCalcHeader(args, formula) {
1270
+ let header = "";
1271
+ let rows = this.pivotObj.dataSourceSettings.rows;
1272
+ let groupNameArrays = [];
1273
+ for (let index = 0; index < args.row.level; index++) {
1274
+ groupNameArrays.push(rows[index].name);
1275
+ }
1276
+ header = groupNameArrays.length
1277
+ ? groupNameArrays
1278
+ .map((name) => {
1279
+ return args.cellSets[0][name];
1280
+ })
1281
+ .join("-") +
1282
+ "-" +
1283
+ args.row.actualText
1284
+ : args.row.actualText;
1285
+ if (formula)
1286
+ header += "___" + formula;
1287
+ return header;
1288
+ }
1289
+ updateTempSubtotals(rowName, rowValue) {
1290
+ let index = this.tempSubtotals.findIndex((item) => item.rowName === rowName);
1291
+ let temp = {};
1292
+ temp.rowName = rowName;
1293
+ temp.rowValue = rowValue;
1294
+ if (index > -1) {
1295
+ this.tempSubtotals.splice(index, 1, temp);
1296
+ }
1297
+ else {
1298
+ this.tempSubtotals.push(temp);
1299
+ }
1300
+ }
1301
+ calculatedValues(args, matchFields, formula) {
1302
+ if (matchFields.length) {
1303
+ let calculedMatchFields = matchFields.map((f) => {
1304
+ switch (f.matchMethod) {
1305
+ case "First":
1306
+ case "Last":
1307
+ f.replaceValue = this.calculatedFistLast(args, f.matchMethod, f.matchWord);
1308
+ break;
1309
+ case "Max":
1310
+ f.replaceValue = maxBy(args.cellSets, (o) => Number(o[f.matchWord]))[f.matchWord];
1311
+ break;
1312
+ case "Min":
1313
+ f.replaceValue = minBy(args.cellSets, (o) => Number(o[f.matchWord]))[f.matchWord];
1314
+ break;
1315
+ case "Sum":
1316
+ f.replaceValue = sumBy(args.cellSets, (o) => Number(o[f.matchWord]));
1317
+ // SMP2-4094 Unicorn - L3 Adjusted NAV value issues
1318
+ f.replaceValue =
1319
+ f.replaceValue && f.replaceValue.toFixed(10);
1320
+ break;
1321
+ case "Avg":
1322
+ f.replaceValue = meanBy(args.cellSets, (o) => Number(o[f.matchWord]));
1323
+ break;
1324
+ default:
1325
+ break;
1326
+ }
1327
+ return f;
1328
+ });
1329
+ let resultFormula = formula;
1330
+ if (calculedMatchFields.length) {
1331
+ for (let i = 0; i < calculedMatchFields.length; i++) {
1332
+ resultFormula = resultFormula.replace(calculedMatchFields[i].matchStr, "(" + calculedMatchFields[i].replaceValue + ")");
1333
+ }
1334
+ }
1335
+ try {
1336
+ let result = new Function("return " + resultFormula.replace(/[^-<>?:()\d/*+.]/g, ""))();
1337
+ if (isNaN(result) || !isFinite(result)) {
1338
+ return 0;
1339
+ }
1340
+ else {
1341
+ return result;
1342
+ }
1343
+ }
1344
+ catch (error) {
1345
+ return NaN;
1346
+ }
1347
+ }
1348
+ return 0;
1349
+ }
1350
+ totalFormatted = {};
1351
+ aggregateCellInfo(args) {
1352
+ let asOfDate = this.pbf.time(this.dashboard.asOfDate);
1353
+ // if calculated field
1354
+ if (args.aggregateType == "CalculatedField") {
1355
+ for (let i = 0; i < this.customCalculatedFields.length; i++) {
1356
+ if (args.fieldName == this.customCalculatedFields[i].name) {
1357
+ args.value = this.calculatedCellSets(args, this.customCalculatedFields[i]);
1358
+ }
1359
+ }
1360
+ }
1361
+ if ([
1362
+ "CalculateIRR",
1363
+ "CalculateIRRBeforeCarried",
1364
+ "CalculateIRRIRRDate",
1365
+ "CalculateIRRMTD",
1366
+ "CalculateIRRQTD",
1367
+ "CalculateIRRYTD",
1368
+ ].includes(args.aggregateType)) {
1369
+ // console.log("==========================");
1370
+ // console.log("args:", args);
1371
+ let valueField;
1372
+ let dateField;
1373
+ let startDate;
1374
+ let endDate;
1375
+ switch (args.aggregateType) {
1376
+ case "CalculateIRR":
1377
+ valueField = "IRRAdjValue";
1378
+ dateField = "IRRDate";
1379
+ break;
1380
+ case "CalculateIRRMTD":
1381
+ startDate = moment(asOfDate)
1382
+ .startOf("month")
1383
+ .format("YYYY-MM-DD");
1384
+ endDate = moment(asOfDate).format("YYYY-MM-DD");
1385
+ valueField = "IRRAdjValue";
1386
+ dateField = "IRRDate";
1387
+ break;
1388
+ case "CalculateIRRQTD":
1389
+ startDate = moment(asOfDate)
1390
+ .startOf("quarter")
1391
+ .format("YYYY-MM-DD");
1392
+ endDate = moment(asOfDate).format("YYYY-MM-DD");
1393
+ valueField = "IRRAdjValue";
1394
+ dateField = "IRRDate";
1395
+ break;
1396
+ case "CalculateIRRYTD":
1397
+ startDate = moment(asOfDate)
1398
+ .startOf("year")
1399
+ .format("YYYY-MM-DD");
1400
+ endDate = moment(asOfDate).format("YYYY-MM-DD");
1401
+ valueField = "IRRAdjValue";
1402
+ dateField = "IRRDate";
1403
+ break;
1404
+ case "CalculateIRRIRRDate":
1405
+ valueField = "IRRAdjValue";
1406
+ dateField = "CalculateIRRDate";
1407
+ break;
1408
+ case "CalculateIRRBeforeCarried":
1409
+ valueField = "IRRAdjValueBeforeCarry";
1410
+ dateField = "IRRDate";
1411
+ break;
1412
+ default:
1413
+ break;
1414
+ }
1415
+ let NAVAdj = 0;
1416
+ let values = [];
1417
+ let beforeStartNAVAdj = 0; // 存储上一个阶段的NAVAdj总和
1418
+ let beforeStartValues = []; // 存储上一个阶段的累计集合 (只是为了打印,没有实际用途)
1419
+ let field = this.configFields.filter((el) => el.colName ===
1420
+ this.dashboardPorletsService.getAggregateType(args.aggregateType));
1421
+ for (let i = 0; i < args.cellSets.length; i++) {
1422
+ const data = {
1423
+ amount: args.cellSets[i]["IRRAmount"],
1424
+ date: this.pbf.time(args.cellSets[i][dateField]) ===
1425
+ "Invalid date"
1426
+ ? asOfDate
1427
+ : this.pbf.time(args.cellSets[i][dateField]),
1428
+ };
1429
+ // SMP2-16920
1430
+ // If IRR Date > Dashboard report date = Takes as of dashboard report date
1431
+ if (args.aggregateType === "CalculateIRRIRRDate" &&
1432
+ asOfDate < this.pbf.time(args.cellSets[i][dateField])) {
1433
+ data.date = asOfDate;
1434
+ }
1435
+ NAVAdj += args.cellSets[i][valueField];
1436
+ // SMP2-17219 MTD QTD YTD IRR
1437
+ if (startDate && endDate) {
1438
+ if (moment(data.date).isBefore(startDate)) {
1439
+ data[valueField] = args.cellSets[i][valueField];
1440
+ beforeStartValues.push(data);
1441
+ beforeStartNAVAdj += data[valueField];
1442
+ }
1443
+ if (!moment(data.date).isBetween(startDate, endDate, null, "[]")) {
1444
+ continue;
1445
+ }
1446
+ }
1447
+ if (data.amount != 0) {
1448
+ values.push(data);
1449
+ }
1450
+ }
1451
+ if (NAVAdj > 0.0001 || NAVAdj < -0.0001) {
1452
+ values.push({
1453
+ amount: NAVAdj,
1454
+ date: asOfDate,
1455
+ });
1456
+ }
1457
+ values = sortBy(values, "date");
1458
+ // 如果是MTD,QTD,YTD 则需要把当前阶段以前的所有数据进行汇总,加入计算
1459
+ if (startDate && endDate) {
1460
+ values.unshift({
1461
+ amount: -beforeStartNAVAdj,
1462
+ date: this.pbf.time(startDate),
1463
+ });
1464
+ }
1465
+ // console.log("beforeStartValues:", beforeStartValues);
1466
+ // console.log("values:", values);
1467
+ if (values.length > 0) {
1468
+ let guess = 0.1;
1469
+ const sumAmount = values
1470
+ .map((item) => item.amount)
1471
+ .reduce((prev, curr) => prev + curr, 0);
1472
+ if (sumAmount < 0) {
1473
+ guess = -0.1;
1474
+ }
1475
+ //SMP2-2249 fixed the big irr issue
1476
+ if (sumAmount === 0) {
1477
+ args.value = 0;
1478
+ }
1479
+ else {
1480
+ const valueItems = values.slice(0, values.length - 1);
1481
+ const valueList = valueItems.map((item) => item.amount);
1482
+ const dateList = valueItems.map((item) => item.date);
1483
+ const lastItem = values[values.length - 1];
1484
+ const navAdjust = lastItem.amount;
1485
+ const latestDate = lastItem.date;
1486
+ let irr = this.dashboardPorletsService.ExcelFormulas._CalculateXirr(valueList, dateList, navAdjust, latestDate);
1487
+ args.value = irr === null ? "" : irr;
1488
+ }
1489
+ }
1490
+ else {
1491
+ args.value = "";
1492
+ }
1493
+ // console.log("args.value:", args.value);
1494
+ if (this.pivotObj.engineModule &&
1495
+ this.pivotObj.engineModule.formatFields[args.fieldName]) {
1496
+ delete this.pivotObj.engineModule.formatFields[args.fieldName];
1497
+ this.pivotObj.engineModule.formatFields[args.fieldName] = {
1498
+ name: args.fieldName,
1499
+ format: field.length > 0
1500
+ ? field[0].format &&
1501
+ field[0].format.length &&
1502
+ field[0].format[0].formatChecked
1503
+ ? this.dashboardPorletsService.pivotTableformatPercent(field[0].format[0].selectedFormat)
1504
+ : this.dashboardPorletsService.formatPercent(field[0].dp)
1505
+ : "P2",
1506
+ };
1507
+ }
1508
+ }
1509
+ // SMP2-16520 TWR 月/季/年 && SMP2-16683 VAR
1510
+ if ([
1511
+ "CalculateTWRMTD",
1512
+ "CalculateTWRQTD",
1513
+ "CalculateTWRYTD",
1514
+ "CalculateVARMTD_99",
1515
+ "CalculateVARQTD_99",
1516
+ "CalculateVARYTD_99",
1517
+ "CalculateVARMTD_95",
1518
+ "CalculateVARQTD_95",
1519
+ "CalculateVARYTD_95",
1520
+ ].includes(args.aggregateType)) {
1521
+ // console.log("==========================");
1522
+ // console.log("args:", args);
1523
+ let valueField = "IRRAdjValue";
1524
+ let dateField = "IRRDate";
1525
+ let timeRange;
1526
+ switch (args.aggregateType) {
1527
+ case "CalculateTWRMTD":
1528
+ case "CalculateVARMTD_99":
1529
+ case "CalculateVARMTD_95":
1530
+ timeRange = "month";
1531
+ break;
1532
+ case "CalculateTWRQTD":
1533
+ case "CalculateVARQTD_99":
1534
+ case "CalculateVARQTD_95":
1535
+ timeRange = "quarter";
1536
+ break;
1537
+ case "CalculateTWRYTD":
1538
+ case "CalculateVARYTD_99":
1539
+ case "CalculateVARYTD_95":
1540
+ timeRange = "year";
1541
+ break;
1542
+ default:
1543
+ break;
1544
+ }
1545
+ let values = []; // 这个阶段的累计集合
1546
+ let field = this.configFields.filter((el) => el.colName ===
1547
+ this.dashboardPorletsService.getAggregateType(args.aggregateType));
1548
+ for (let i = 0; i < args.cellSets.length; i++) {
1549
+ const data = {
1550
+ [valueField]: args.cellSets[i][valueField],
1551
+ date: this.pbf.time(args.cellSets[i][dateField]) ===
1552
+ "Invalid date"
1553
+ ? asOfDate
1554
+ : this.pbf.time(args.cellSets[i][dateField]),
1555
+ };
1556
+ values.push(data);
1557
+ }
1558
+ // 如果asOfDate不是 本月/季度/年 的最后一天,都是截至 上个月/季度/年 的最后一天的数据去计算
1559
+ let _asOfDate = moment(asOfDate);
1560
+ // console.log("_asOfDate:", _asOfDate);
1561
+ let isEndOfPeriod = (unit) => {
1562
+ return (_asOfDate.format("YYYY-MM-DD") ===
1563
+ _asOfDate.endOf(unit).format("YYYY-MM-DD"));
1564
+ };
1565
+ let endDate = isEndOfPeriod(timeRange)
1566
+ ? moment(asOfDate).format("YYYY-MM-DD")
1567
+ : moment(asOfDate)
1568
+ .subtract(1, timeRange)
1569
+ .endOf(timeRange)
1570
+ .format("YYYY-MM-DD");
1571
+ // console.log("endDate:", endDate);
1572
+ values = values.filter((item) => moment(item.date).isSameOrBefore(endDate));
1573
+ values = sortBy(values, "date");
1574
+ // console.log("values:", values);
1575
+ if (values.length > 0) {
1576
+ let result = this.getTimeRanges(values, endDate, timeRange, "date"); // 各个阶段的数据
1577
+ let resultTotal = {}; // 各个阶段总和
1578
+ for (const prop in result) {
1579
+ resultTotal[prop] = result[prop].reduce((acc, cur) => {
1580
+ return acc + (cur[valueField] || 0);
1581
+ }, 0);
1582
+ }
1583
+ // console.log("result:", result);
1584
+ // console.log("resultTotal:", resultTotal);
1585
+ const cumulativeSum = {}; // 各个阶段累计和
1586
+ let sum = 0;
1587
+ for (const key of Object.keys(resultTotal)) {
1588
+ sum += resultTotal[key];
1589
+ cumulativeSum[`${key}`] = sum;
1590
+ }
1591
+ // console.log("cumulativeSum:", cumulativeSum);
1592
+ const keys = Object.keys(cumulativeSum);
1593
+ let twrList = [];
1594
+ // 遍历每两个阶段 计算TWR
1595
+ for (let i = 0; i < keys.length - 1; i++) {
1596
+ const key1 = keys[i];
1597
+ const key2 = keys[i + 1];
1598
+ // 计算两个阶段之间的递增量, 出数不能为0
1599
+ if (cumulativeSum[key1] != 0) {
1600
+ const increment = cumulativeSum[key2] - cumulativeSum[key1];
1601
+ let twr = increment / cumulativeSum[key1];
1602
+ twrList.push({
1603
+ date: key2,
1604
+ twr: twr,
1605
+ });
1606
+ }
1607
+ }
1608
+ // 计算Average TWR
1609
+ // console.log("twrList:", twrList);
1610
+ let averageTWR = this.calculateGrowthRate(twrList.map((x) => x.twr));
1611
+ // console.log("计算Average TWR:", averageTWR);
1612
+ if ([
1613
+ "CalculateTWRMTD",
1614
+ "CalculateTWRQTD",
1615
+ "CalculateTWRYTD",
1616
+ ].includes(args.aggregateType)) {
1617
+ // SMP2-16520 TWR 月/季/年
1618
+ args.value =
1619
+ isNaN(averageTWR) || averageTWR == null
1620
+ ? ""
1621
+ : Number(averageTWR);
1622
+ }
1623
+ else {
1624
+ if (isNaN(averageTWR) || averageTWR == null) {
1625
+ args.value = "";
1626
+ }
1627
+ else {
1628
+ // SMP2-16683 VAR 区分99%和95%
1629
+ let ZScore = [
1630
+ "CalculateVARMTD_99",
1631
+ "CalculateVARQTD_99",
1632
+ "CalculateVARYTD_99",
1633
+ ].includes(args.aggregateType)
1634
+ ? 2.33
1635
+ : 1.65;
1636
+ if (twrList.length < 2) {
1637
+ args.value = "";
1638
+ }
1639
+ else {
1640
+ let SD = this.calculateStandardDeviation(twrList.map((x) => x.twr));
1641
+ // console.log("calculateStandardDeviation:", SD);
1642
+ let VAR = averageTWR - SD * ZScore;
1643
+ args.value = Number(VAR);
1644
+ }
1645
+ }
1646
+ }
1647
+ // console.log("args.value:", args.value);
1648
+ }
1649
+ if (this.pivotObj.engineModule &&
1650
+ this.pivotObj.engineModule.formatFields[args.fieldName]) {
1651
+ delete this.pivotObj.engineModule.formatFields[args.fieldName];
1652
+ this.pivotObj.engineModule.formatFields[args.fieldName] = {
1653
+ name: args.fieldName,
1654
+ format: field.length > 0
1655
+ ? field[0].format &&
1656
+ field[0].format.length &&
1657
+ field[0].format[0].formatChecked
1658
+ ? this.dashboardPorletsService.pivotTableformatPercent(field[0].format[0].selectedFormat)
1659
+ : this.dashboardPorletsService.formatPercent(field[0].dp)
1660
+ : "P2",
1661
+ };
1662
+ }
1663
+ }
1664
+ //SMP2-2701
1665
+ if (args.aggregateType === "CalculateIRRActualAudited") {
1666
+ let NAVAdj = 0;
1667
+ let values = [];
1668
+ let field = this.configFields.filter((el) => el.colName ===
1669
+ this.dashboardPorletsService.getAggregateType(args.aggregateType));
1670
+ //SMP2-2713 only judge for this dataMart(GrossNet)
1671
+ if (this.portlet.figureCode === "GrossNet" ||
1672
+ this.portlet.figureCode ===
1673
+ "CombinedInvestmentFundNCompanyCashflow") {
1674
+ for (let i = 0; i < args.cellSets.length; i++) {
1675
+ const data = {
1676
+ amount: args.cellSets[i]["IRRAmount"],
1677
+ date: this.pbf.time(args.cellSets[i]["IRRDate"]) ===
1678
+ "Invalid date"
1679
+ ? asOfDate
1680
+ : this.pbf.time(args.cellSets[i]["IRRDate"]),
1681
+ };
1682
+ NAVAdj += args.cellSets[i]["ActualAuditedNAV"];
1683
+ if (data.amount != 0) {
1684
+ values.push(data);
1685
+ }
1686
+ }
1687
+ }
1688
+ //filter the data by the DataType(Actual Reported Audited)
1689
+ else {
1690
+ let argsdata = args.cellSets.filter((el) => el.DataType === "ACTUAL_AUDITED" ||
1691
+ el.DataType === "REPORTED");
1692
+ for (let i = 0; i < argsdata.length; i++) {
1693
+ const data = {
1694
+ amount: argsdata[i]["IRRAmount"],
1695
+ date: this.pbf.time(argsdata[i]["IRRDate"]) ===
1696
+ "Invalid date"
1697
+ ? asOfDate
1698
+ : this.pbf.time(argsdata[i]["IRRDate"]),
1699
+ };
1700
+ NAVAdj += argsdata[i]["IRRAdjValue"];
1701
+ if (data.amount != 0) {
1702
+ values.push(data);
1703
+ }
1704
+ }
1705
+ }
1706
+ if (NAVAdj > 0.0001 || NAVAdj < -0.0001) {
1707
+ values.push({
1708
+ amount: NAVAdj,
1709
+ date: asOfDate,
1710
+ });
1711
+ }
1712
+ values = sortBy(values, "date");
1713
+ if (values.length > 0) {
1714
+ let guess = 0.1;
1715
+ const sumAmount = values
1716
+ .map((item) => item.amount)
1717
+ .reduce((prev, curr) => prev + curr, 0);
1718
+ if (sumAmount < 0) {
1719
+ guess = -0.1;
1720
+ }
1721
+ //SMP2-2249 fixed the big irr issue
1722
+ if (sumAmount === 0) {
1723
+ args.value = 0;
1724
+ }
1725
+ else {
1726
+ const valueItems = values.slice(0, values.length - 1);
1727
+ const valueList = valueItems.map((item) => item.amount);
1728
+ const dateList = valueItems.map((item) => item.date);
1729
+ const lastItem = values[values.length - 1];
1730
+ const navAdjust = lastItem.amount;
1731
+ const latestDate = lastItem.date;
1732
+ let irr = this.dashboardPorletsService.ExcelFormulas._CalculateXirr(valueList, dateList, navAdjust, latestDate);
1733
+ args.value = irr === null ? 0 : irr;
1734
+ }
1735
+ }
1736
+ else {
1737
+ args.value = 0;
1738
+ }
1739
+ if (this.pivotObj.engineModule &&
1740
+ this.pivotObj.engineModule.formatFields[args.fieldName]) {
1741
+ delete this.pivotObj.engineModule.formatFields[args.fieldName];
1742
+ this.pivotObj.engineModule.formatFields[args.fieldName] = {
1743
+ name: args.fieldName,
1744
+ format: field.length > 0
1745
+ ? field[0].format &&
1746
+ field[0].format.length &&
1747
+ field[0].format[0].formatChecked
1748
+ ? this.dashboardPorletsService.pivotTableformatPercent(field[0].format[0].selectedFormat)
1749
+ : this.dashboardPorletsService.formatPercent(field[0].dp)
1750
+ : "P2",
1751
+ };
1752
+ }
1753
+ }
1754
+ //SMP2-3411
1755
+ if (args.aggregateType === "CalculateIRRReported") {
1756
+ let NAVAdj = 0;
1757
+ let values = [];
1758
+ let field = this.configFields.filter((el) => el.colName ===
1759
+ this.dashboardPorletsService.getAggregateType(args.aggregateType));
1760
+ if (this.portlet.figureCode === "GrossNet" ||
1761
+ this.portlet.figureCode ===
1762
+ "CombinedInvestmentFundNCompanyCashflow") {
1763
+ for (let i = 0; i < args.cellSets.length; i++) {
1764
+ const data = {
1765
+ amount: args.cellSets[i]["IRRAmount"],
1766
+ date: this.pbf.time(args.cellSets[i]["IRRDate"]) ===
1767
+ "Invalid date"
1768
+ ? asOfDate
1769
+ : this.pbf.time(args.cellSets[i]["IRRDate"]),
1770
+ };
1771
+ NAVAdj += args.cellSets[i]["ReportedNAV"];
1772
+ if (data.amount != 0) {
1773
+ values.push(data);
1774
+ }
1775
+ }
1776
+ }
1777
+ else {
1778
+ for (let i = 0; i < args.cellSets.length; i++) {
1779
+ const data = {
1780
+ amount: args.cellSets[i]["IRRAmount"],
1781
+ date: this.pbf.time(args.cellSets[i]["IRRDate"]) ===
1782
+ "Invalid date"
1783
+ ? asOfDate
1784
+ : this.pbf.time(args.cellSets[i]["IRRDate"]),
1785
+ };
1786
+ NAVAdj += args.cellSets[i]["IRRAdjValue"];
1787
+ if (data.amount != 0) {
1788
+ values.push(data);
1789
+ }
1790
+ }
1791
+ }
1792
+ if (NAVAdj > 0.0001 || NAVAdj < -0.0001) {
1793
+ values.push({
1794
+ amount: NAVAdj,
1795
+ date: asOfDate,
1796
+ });
1797
+ }
1798
+ values = sortBy(values, "date");
1799
+ if (values.length > 0) {
1800
+ let guess = 0.1;
1801
+ const sumAmount = values
1802
+ .map((item) => item.amount)
1803
+ .reduce((prev, curr) => prev + curr, 0);
1804
+ if (sumAmount < 0) {
1805
+ guess = -0.1;
1806
+ }
1807
+ //SMP2-2249 fixed the big irr issue
1808
+ if (sumAmount === 0) {
1809
+ args.value = 0;
1810
+ }
1811
+ else {
1812
+ const valueItems = values.slice(0, values.length - 1);
1813
+ const valueList = valueItems.map((item) => item.amount);
1814
+ const dateList = valueItems.map((item) => item.date);
1815
+ const lastItem = values[values.length - 1];
1816
+ const navAdjust = lastItem.amount;
1817
+ const latestDate = lastItem.date;
1818
+ let irr = this.dashboardPorletsService.ExcelFormulas._CalculateXirr(valueList, dateList, navAdjust, latestDate);
1819
+ args.value = irr === null ? 0 : irr;
1820
+ }
1821
+ }
1822
+ else {
1823
+ args.value = 0;
1824
+ }
1825
+ if (this.pivotObj.engineModule &&
1826
+ this.pivotObj.engineModule.formatFields[args.fieldName]) {
1827
+ delete this.pivotObj.engineModule.formatFields[args.fieldName];
1828
+ this.pivotObj.engineModule.formatFields[args.fieldName] = {
1829
+ name: args.fieldName,
1830
+ format: field.length > 0
1831
+ ? field[0].format &&
1832
+ field[0].format.length &&
1833
+ field[0].format[0].formatChecked
1834
+ ? this.dashboardPorletsService.pivotTableformatPercent(field[0].format[0].selectedFormat)
1835
+ : this.dashboardPorletsService.formatPercent(field[0].dp)
1836
+ : "P2",
1837
+ };
1838
+ }
1839
+ }
1840
+ if (args.aggregateType === "CalculateMultiple" ||
1841
+ args.aggregateType === "CalculatePIC" ||
1842
+ args.aggregateType === "CalculateDPI" ||
1843
+ args.aggregateType === "CalculateTVPI" ||
1844
+ args.aggregateType === "CalculateRVPI" ||
1845
+ args.aggregateType === "CalculateMActualAudited" ||
1846
+ args.aggregateType === "CalculateMReported") {
1847
+ let totalNumerator = 0;
1848
+ let totalDenominator = 0;
1849
+ let numeratorName;
1850
+ let denominatorName;
1851
+ let field = this.configFields.filter((el) => el.colName ===
1852
+ this.dashboardPorletsService.getAggregateType(args.aggregateType));
1853
+ if (field.length > 0) {
1854
+ const formulaArray = field[0].formula.split("/");
1855
+ numeratorName = formulaArray[0];
1856
+ denominatorName = formulaArray[1];
1857
+ }
1858
+ for (let j = 0; j < args.cellSets.length; j++) {
1859
+ totalNumerator += args.cellSets[j][numeratorName];
1860
+ totalDenominator += args.cellSets[j][denominatorName];
1861
+ }
1862
+ if (totalDenominator !== 0) {
1863
+ args.value = totalNumerator / totalDenominator;
1864
+ if (this.pivotObj.engineModule &&
1865
+ this.pivotObj.engineModule.formatFields[args.fieldName]) {
1866
+ delete this.pivotObj.engineModule.formatFields[args.fieldName];
1867
+ this.pivotObj.engineModule.formatFields[args.fieldName] = {
1868
+ name: args.fieldName,
1869
+ format: field.length > 0
1870
+ ? field[0].format &&
1871
+ field[0].format.length &&
1872
+ field[0].format[0].formatChecked
1873
+ ? this.dashboardPorletsService.pivotTableformatMultiple(field[0].format[0].selectedFormat)
1874
+ : this.dashboardPorletsService.formatMultiple(field[0].dp)
1875
+ : "###0.00'x'",
1876
+ };
1877
+ }
1878
+ }
1879
+ else {
1880
+ args.value = "";
1881
+ }
1882
+ }
1883
+ if (args.aggregateType === "First" || args.aggregateType === "Last") {
1884
+ args.value = this.calculatedFistLast(args, args.aggregateType, args.fieldName);
1885
+ }
1886
+ if (args.aggregateType === "Count" ||
1887
+ args.aggregateType === "DistinctCount") {
1888
+ if (args.value) {
1889
+ args.value = args.value.toFixed(2);
1890
+ }
1891
+ }
1892
+ if (!args.value &&
1893
+ args.value !== 0 &&
1894
+ args.value !== false &&
1895
+ args.value !== "false") {
1896
+ args.skipFormatting = true;
1897
+ args.value = "";
1898
+ }
1899
+ // 新建pivot table, 还没有设置row, 选了column之后grandtotal会有值
1900
+ if (args.rowCellType === "grandTotal" &&
1901
+ !this.pivotObj.dataSourceSettings.rows.length) {
1902
+ args.value = "";
1903
+ }
1904
+ //SMP2-2889
1905
+ if (args.rowCellType === "subTotal") {
1906
+ const valueField_data = this.config.yaxis.series.filter((el) => el.colName === args.fieldName);
1907
+ if (valueField_data.length > 0) {
1908
+ if (valueField_data[0].showSubTotals === false) {
1909
+ args.value = "";
1910
+ args.skipFormatting = true;
1911
+ }
1912
+ }
1913
+ }
1914
+ if (args.rowCellType === "grandTotal") {
1915
+ const valueField_data = this.config.yaxis.series.filter((el) => el.colName === args.fieldName);
1916
+ if (valueField_data.length > 0) {
1917
+ if (valueField_data[0].showGrandTotals === false) {
1918
+ args.value = "";
1919
+ args.skipFormatting = true;
1920
+ }
1921
+ }
1922
+ }
1923
+ // SMP2-3416 start
1924
+ if (this.zeroFormatData.hgList.includes(args.fieldName) &&
1925
+ args.value === 0) {
1926
+ args.value = "-";
1927
+ args.skipFormatting = true;
1928
+ }
1929
+ if (this.zeroFormatData.emptyList.includes(args.fieldName) &&
1930
+ args.value === 0) {
1931
+ args.value = "";
1932
+ args.skipFormatting = true;
1933
+ }
1934
+ if (this.millionFields.includes(args.fieldName) &&
1935
+ !isNaN(Number(args.value)) &&
1936
+ args.value !== 0 &&
1937
+ args.value !== "" &&
1938
+ args.value !== null) {
1939
+ if (args.columnCellType == "grandTotal" &&
1940
+ args.rowCellType == "grandTotal") {
1941
+ if (!this.totalFormatted[args.fieldName]) {
1942
+ this.totalFormatted[args.fieldName] = true;
1943
+ args.value = args.value / 1000000;
1944
+ }
1945
+ }
1946
+ else {
1947
+ args.value = args.value / 1000000;
1948
+ }
1949
+ }
1950
+ // SMP2-2486 & percentNum的format问题
1951
+ if (this.percentNumFields.length &&
1952
+ this.percentNumFields.includes(args.fieldName) &&
1953
+ !isNaN(Number(args.value)) &&
1954
+ args.value !== 0 &&
1955
+ args.value !== "" &&
1956
+ args.value !== null) {
1957
+ if (args.columnCellType == "grandTotal" &&
1958
+ args.rowCellType == "grandTotal") {
1959
+ if (!this.totalFormatted[args.fieldName]) {
1960
+ this.totalFormatted[args.fieldName] = true;
1961
+ args.value = args.value / 100;
1962
+ }
1963
+ }
1964
+ else {
1965
+ args.value = args.value / 100;
1966
+ }
1967
+ }
1968
+ if (args.aggregateType == "CalculatedField" &&
1969
+ !isNaN(Number(args.value)) &&
1970
+ !this.pivotObj.engineModule.formatFields[args.fieldName].format) {
1971
+ args.value = Number(args.value).toFixed(2);
1972
+ }
1973
+ // SMP2-3416 end
1974
+ this.ref.markForCheck();
1975
+ this.ref.detectChanges();
1976
+ }
1977
+ calculatedFistLast(args, aggregateType, fieldName) {
1978
+ if (!args.row.actualText)
1979
+ args.row.actualText = args.row.formattedText;
1980
+ if (!args.column.actualText)
1981
+ args.column.actualText = args.column.formattedText;
1982
+ let field = this.configFields.filter((el) => el.colName === fieldName)[0];
1983
+ if (args.rowCellType === "value" && !args.row.hasChild) {
1984
+ if (args.cellSets[0]) {
1985
+ if (aggregateType === "First") {
1986
+ for (let firstIndex = 0; firstIndex < args.cellSets.length; firstIndex++) {
1987
+ if (this.pivotObj.dataSourceSettings.columns.length ==
1988
+ 1 &&
1989
+ args.columnCellType == "grandTotal") {
1990
+ if (field.dataType == "string" ||
1991
+ field.dataType == "nvarchar" ||
1992
+ field.dataType == "date" ||
1993
+ field.dataType == "datetime") {
1994
+ args.value = "";
1995
+ }
1996
+ else {
1997
+ if (this.allDataValue &&
1998
+ this.allDataValue.length) {
1999
+ let rowObjs = this.allDataValue[args.row.rowIndex];
2000
+ if (rowObjs) {
2001
+ let rowObjsArr = JSON.parse(JSON.stringify(rowObjs));
2002
+ let obj = rowObjsArr.filter((el) => el.actualText == fieldName &&
2003
+ el.isGrandSum)[0];
2004
+ if (obj)
2005
+ args.value = obj.value;
2006
+ }
2007
+ }
2008
+ else {
2009
+ args.value = isNaN(Number(this.grandTotals["row" +
2010
+ args.row.actualText +
2011
+ fieldName]))
2012
+ ? null
2013
+ : Number(this.grandTotals["row" +
2014
+ args.row.actualText +
2015
+ fieldName]);
2016
+ }
2017
+ }
2018
+ }
2019
+ else {
2020
+ args.value = args.cellSets[firstIndex][fieldName];
2021
+ }
2022
+ if (field.dataType == "number" ||
2023
+ field.dataType == "multiple" ||
2024
+ field.dataType == "percent" ||
2025
+ field.dataType == "percentNum") {
2026
+ if (args.value != null)
2027
+ break;
2028
+ }
2029
+ else if (field.dataType == "date" ||
2030
+ field.dataType == "datetime") {
2031
+ if (this.pbf.time(args.value) > "1900-01-01")
2032
+ break;
2033
+ }
2034
+ else if (args.value)
2035
+ break;
2036
+ }
2037
+ }
2038
+ if (aggregateType === "Last") {
2039
+ for (let lastIndex = args.cellSets.length - 1; lastIndex >= 0; lastIndex--) {
2040
+ if (this.pivotObj.dataSourceSettings.columns.length ==
2041
+ 1 &&
2042
+ args.columnCellType == "grandTotal") {
2043
+ if (field.dataType == "string" ||
2044
+ field.dataType == "nvarchar" ||
2045
+ field.dataType == "date" ||
2046
+ field.dataType == "datetime") {
2047
+ args.value = "";
2048
+ }
2049
+ else {
2050
+ if (this.allDataValue &&
2051
+ this.allDataValue.length) {
2052
+ let rowObjs = this.allDataValue[args.row.rowIndex];
2053
+ if (rowObjs) {
2054
+ let rowObjsArr = JSON.parse(JSON.stringify(rowObjs));
2055
+ let obj = rowObjsArr.filter((el) => el.actualText == fieldName &&
2056
+ el.isGrandSum)[0];
2057
+ if (obj)
2058
+ args.value = obj.value;
2059
+ }
2060
+ }
2061
+ else {
2062
+ args.value = isNaN(Number(this.grandTotals["row" +
2063
+ args.row.actualText +
2064
+ fieldName]))
2065
+ ? null
2066
+ : Number(this.grandTotals["row" +
2067
+ args.row.actualText +
2068
+ fieldName]);
2069
+ }
2070
+ }
2071
+ }
2072
+ else {
2073
+ args.value = args.cellSets[lastIndex][fieldName];
2074
+ }
2075
+ if (field.dataType == "number" ||
2076
+ field.dataType == "multiple" ||
2077
+ field.dataType == "percent" ||
2078
+ field.dataType == "percentNum") {
2079
+ if (args.value != null)
2080
+ break;
2081
+ }
2082
+ else if (field.dataType == "date" ||
2083
+ field.dataType == "datetime") {
2084
+ if (this.pbf.time(args.value) > "1900-01-01")
2085
+ break;
2086
+ }
2087
+ else if (args.value)
2088
+ break;
2089
+ }
2090
+ }
2091
+ if (field.dataType == "number" ||
2092
+ field.dataType == "multiple" ||
2093
+ field.dataType == "percent" ||
2094
+ field.dataType == "percentNum") {
2095
+ if (this.pivotObj.dataSourceSettings.rows.length) {
2096
+ if (!this.pivotObj.dataSourceSettings.columns.length) {
2097
+ if (!Number(this.grandTotals[fieldName]) ||
2098
+ isNaN(Number(this.grandTotals[fieldName]))) {
2099
+ this.grandTotals[fieldName] = 0;
2100
+ }
2101
+ if (args.aggregateType !== "CalculatedField") {
2102
+ this.grandTotals[fieldName] += Number(args.value);
2103
+ }
2104
+ }
2105
+ else if (this.pivotObj.dataSourceSettings.columns.length == 1) {
2106
+ // "row" + args.row.actualText + fieldName 表示(cell: args.rowCellType === "value" && args.columnCellType === "grandTotal")
2107
+ if (!Number(this.grandTotals["row" + args.row.actualText + fieldName]) ||
2108
+ isNaN(Number(this.grandTotals["row" +
2109
+ args.row.actualText +
2110
+ fieldName]))) {
2111
+ this.grandTotals["row" + args.row.actualText + fieldName] = 0;
2112
+ }
2113
+ this.grandTotals["row" + args.row.actualText + fieldName] += Number(args.value);
2114
+ // "col" + args.column.actualText + fieldName 表示(cell: args.rowCellType === "grandTotal" && args.columnCellType === "value")
2115
+ if (!Number(this.grandTotals["col" +
2116
+ args.column.actualText +
2117
+ fieldName]) ||
2118
+ isNaN(Number(this.grandTotals["col" +
2119
+ args.column.actualText +
2120
+ fieldName]))) {
2121
+ this.grandTotals["col" + args.column.actualText + fieldName] = 0;
2122
+ }
2123
+ this.grandTotals["col" + args.column.actualText + fieldName] += Number(args.value);
2124
+ }
2125
+ }
2126
+ }
2127
+ }
2128
+ }
2129
+ else if (args.rowCellType === "subTotal" || args.row.hasChild) {
2130
+ const dataType = field.dataType;
2131
+ if (dataType === "string" ||
2132
+ dataType === "nvarchar" ||
2133
+ dataType == "date" ||
2134
+ dataType == "datetime") {
2135
+ args.value = "";
2136
+ }
2137
+ else {
2138
+ let value = 0;
2139
+ let childHeaders = [];
2140
+ if (aggregateType === "First") {
2141
+ let groupNameArrays = [];
2142
+ let rows = this.pivotObj.dataSourceSettings.rows;
2143
+ for (let index = args.row.level; index < rows.length; index++) {
2144
+ groupNameArrays.push(rows[index].name);
2145
+ }
2146
+ for (let i = 0; i < args.cellSets.length; i++) {
2147
+ let values = [];
2148
+ let header = groupNameArrays
2149
+ .map((name) => {
2150
+ values.push(args.cellSets[i][name]);
2151
+ return args.cellSets[i][name];
2152
+ })
2153
+ .join("-");
2154
+ if (!childHeaders.includes(header)) {
2155
+ let filterObj = {};
2156
+ groupNameArrays.map((name, x) => (filterObj[name] = values[x]));
2157
+ let _CellSets = _filter(args.cellSets, filterObj);
2158
+ childHeaders.push(header);
2159
+ value += Number(_CellSets[0][fieldName]) || 0;
2160
+ }
2161
+ }
2162
+ }
2163
+ if (aggregateType === "Last") {
2164
+ let groupNameArrays = [];
2165
+ let rows = this.pivotObj.dataSourceSettings.rows;
2166
+ for (let index = args.row.level; index < rows.length; index++) {
2167
+ groupNameArrays.push(rows[index].name);
2168
+ }
2169
+ for (let i = args.cellSets.length - 1; i >= 0; i--) {
2170
+ let values = [];
2171
+ let header = groupNameArrays
2172
+ .map((name) => {
2173
+ values.push(args.cellSets[i][name]);
2174
+ return args.cellSets[i][name];
2175
+ })
2176
+ .join("-");
2177
+ if (!childHeaders.includes(header)) {
2178
+ let filterObj = {};
2179
+ groupNameArrays.map((name, x) => (filterObj[name] = values[x]));
2180
+ let _CellSets = _filter(args.cellSets, filterObj);
2181
+ childHeaders.push(header);
2182
+ value +=
2183
+ Number(_CellSets[_CellSets.length - 1][fieldName]) || 0;
2184
+ }
2185
+ }
2186
+ }
2187
+ if (args.column.actualText !== "Grand Total")
2188
+ this.columnTexts.push(args.column.actualText);
2189
+ if (!this.pivotObj.dataSourceSettings.columns.length) {
2190
+ if (!Number(this.subTotals[fieldName]) ||
2191
+ isNaN(Number(this.subTotals[fieldName]))) {
2192
+ this.subTotals[fieldName] = 0;
2193
+ }
2194
+ this.subTotals[fieldName] += Number(value);
2195
+ }
2196
+ else if (this.pivotObj.dataSourceSettings.columns.length == 1) {
2197
+ if (!Number(this.subTotals[args.row.actualText +
2198
+ args.column.actualText +
2199
+ fieldName]) ||
2200
+ isNaN(Number(this.subTotals[args.row.actualText +
2201
+ args.column.actualText +
2202
+ fieldName]))) {
2203
+ this.subTotals[args.row.actualText +
2204
+ args.column.actualText +
2205
+ fieldName] = 0;
2206
+ }
2207
+ this.subTotals[args.row.actualText + args.column.actualText + fieldName] += Number(value);
2208
+ }
2209
+ // ---> allDataValue中这个单元格的值不正确
2210
+ if (args.columnCellType === "grandTotal" &&
2211
+ this.pivotObj.dataSourceSettings.columns.length == 1) {
2212
+ if (this.allDataValue && this.allDataValue.length) {
2213
+ args.value =
2214
+ this.subTotals[args.row.actualText + "Grand Total" + fieldName];
2215
+ }
2216
+ else {
2217
+ this.columnTexts = uniqBy(this.columnTexts, (el) => el);
2218
+ let val = 0;
2219
+ for (let i = 0; i < this.columnTexts.length; i++) {
2220
+ const element = this.columnTexts[i];
2221
+ val +=
2222
+ this.subTotals[args.row.actualText + element + fieldName];
2223
+ }
2224
+ args.value = val;
2225
+ }
2226
+ }
2227
+ else {
2228
+ args.value = value;
2229
+ }
2230
+ }
2231
+ }
2232
+ else if (args.rowCellType === "grandTotal") {
2233
+ const dataType = field.dataType;
2234
+ if (dataType == "string" ||
2235
+ dataType == "nvarchar" ||
2236
+ dataType == "date" ||
2237
+ dataType == "datetime") {
2238
+ args.value = "";
2239
+ }
2240
+ else {
2241
+ if (!this.pivotObj.dataSourceSettings.columns.length) {
2242
+ if (this.allDataValue && this.allDataValue.length) {
2243
+ let rowObjs = this.allDataValue[this.allDataValue.length - 1];
2244
+ if (rowObjs) {
2245
+ let rowObjsArr = JSON.parse(JSON.stringify(rowObjs));
2246
+ let objArr = rowObjsArr.filter((el) => el.actualText == fieldName && el.isGrandSum);
2247
+ if (objArr && objArr.length) {
2248
+ args.value = objArr[objArr.length - 1].value;
2249
+ }
2250
+ else if (Object.keys(this.grandTotals).includes(fieldName)) {
2251
+ args.value = this.grandTotals[fieldName];
2252
+ }
2253
+ }
2254
+ }
2255
+ else {
2256
+ args.value = this.grandTotals[fieldName];
2257
+ }
2258
+ }
2259
+ else {
2260
+ if (args.columnCellType === "grandTotal") {
2261
+ if (this.allDataValue && this.allDataValue.length) {
2262
+ let rowObjs = this.allDataValue[this.allDataValue.length - 1];
2263
+ if (rowObjs) {
2264
+ let rowObjsArr = JSON.parse(JSON.stringify(rowObjs));
2265
+ let objArr = rowObjsArr.filter((el) => el.actualText == fieldName &&
2266
+ el.isGrandSum);
2267
+ if (objArr && objArr.length) {
2268
+ args.value =
2269
+ objArr[objArr.length - 1].value;
2270
+ }
2271
+ else if (Object.keys(this.grandTotals).includes("col" +
2272
+ args.column.actualText +
2273
+ fieldName)) {
2274
+ args.value =
2275
+ this.grandTotals["col" +
2276
+ args.column.actualText +
2277
+ fieldName];
2278
+ }
2279
+ }
2280
+ }
2281
+ else {
2282
+ args.value =
2283
+ this.grandTotals["col" + args.column.actualText + fieldName];
2284
+ }
2285
+ }
2286
+ else {
2287
+ if (this.allDataValue && this.allDataValue.length) {
2288
+ let rowObjs = this.allDataValue[this.allDataValue.length - 1];
2289
+ let rowObjsArr = JSON.parse(JSON.stringify(rowObjs));
2290
+ let objArr = rowObjsArr.filter((el) => el.actualText == fieldName &&
2291
+ el.isGrandSum &&
2292
+ el.columnHeaders == args.column.actualText);
2293
+ if (objArr && objArr.length) {
2294
+ args.value = objArr[objArr.length - 1].value;
2295
+ }
2296
+ else if (Object.keys(this.grandTotals).includes("col" + args.column.actualText + fieldName)) {
2297
+ args.value =
2298
+ this.grandTotals["col" +
2299
+ args.column.actualText +
2300
+ fieldName];
2301
+ }
2302
+ }
2303
+ else {
2304
+ args.value =
2305
+ this.grandTotals["col" + args.column.actualText + fieldName];
2306
+ }
2307
+ }
2308
+ }
2309
+ }
2310
+ }
2311
+ this.formatVal(args, fieldName);
2312
+ return args.value;
2313
+ }
2314
+ formatVal(args, fieldName) {
2315
+ this.configFields.forEach((field) => {
2316
+ if (field.colName == fieldName) {
2317
+ switch (field.dataType) {
2318
+ case "date":
2319
+ case "datetime":
2320
+ if (args.value)
2321
+ args.value = new Date(args.value);
2322
+ break;
2323
+ default:
2324
+ break;
2325
+ }
2326
+ }
2327
+ });
2328
+ }
2329
+ getexcludeFields(fields, data) {
2330
+ let namearray = [];
2331
+ let array = [];
2332
+ for (let prop in data) {
2333
+ array.push(prop);
2334
+ }
2335
+ for (let item of fields) {
2336
+ namearray.push(item.colName);
2337
+ }
2338
+ this.excludeFields = differenceWith(array, namearray);
2339
+ if (this.excludeFields.length &&
2340
+ this.config.groupSettings &&
2341
+ this.config.groupSettings.length) {
2342
+ for (let i = 0; i < this.excludeFields.length; i++) {
2343
+ const el = this.excludeFields[i];
2344
+ if (startsWith(el, this.config.groupSettings[0].name + "_")) {
2345
+ this.excludeFields.splice(i, 1);
2346
+ i--;
2347
+ }
2348
+ }
2349
+ }
2350
+ }
2351
+ getInfo() {
2352
+ this.datePipeFormat = localStorage.getItem("datePipe");
2353
+ this.translation = JSON.parse(localStorage.getItem("translation"));
2354
+ }
2355
+ onFieldDrop(args) {
2356
+ this.dataSourceSettings.values = [...args.dataSourceSettings.values];
2357
+ //change the calcualteField method use the corresponding calculate
2358
+ const calcualteField = this.configFields.filter((el) => el.colName === args.fieldName && el.isCalculatedField);
2359
+ if (calcualteField.length > 0) {
2360
+ args.dropField.type =
2361
+ this.dashboardPorletsService.getCalculateMethod(calcualteField[0].colName);
2362
+ args.dropField.caption = args.dropField.caption
2363
+ .replace("Calculate", "")
2364
+ .trim();
2365
+ }
2366
+ for (let i = 0; i < args.dataSourceSettings.filterSettings.length; i++) {
2367
+ if (args.dataSourceSettings.filterSettings[i].name ===
2368
+ args.fieldName &&
2369
+ args.dropAxis === "") {
2370
+ args.dataSourceSettings.filterSettings.splice(i, 1);
2371
+ this.filterSettings = args.dataSourceSettings.filterSettings;
2372
+ break;
2373
+ }
2374
+ }
2375
+ }
2376
+ // Calculated field事件:创建
2377
+ calculatedFieldCreate(args) {
2378
+ if (args.calculatedField.name !== "" &&
2379
+ args.calculatedField.name.trim() !== "") {
2380
+ let index = this.fieldlistObj.dataSourceSettings.calculatedFieldSettings.findIndex((el) => el.name === args.calculatedField.name);
2381
+ if (index !== -1) {
2382
+ if (args.calculatedField.formatString === "") {
2383
+ this.fieldlistObj.dataSourceSettings.calculatedFieldSettings[index].formatString = "N2";
2384
+ }
2385
+ else {
2386
+ this.fieldlistObj.dataSourceSettings.calculatedFieldSettings[index].formatString = args.calculatedField.formatString;
2387
+ }
2388
+ }
2389
+ else {
2390
+ if (args.calculatedField.formatString === "") {
2391
+ args.calculatedField.formatString = "N2";
2392
+ }
2393
+ }
2394
+ // 移除重复
2395
+ let fIndex = this.customCalculatedFields.findIndex((f) => f.name === args.calculatedField.name);
2396
+ if (fIndex > -1) {
2397
+ this.customCalculatedFields.splice(fIndex, 1);
2398
+ }
2399
+ // 匹配运算符 First || Last
2400
+ let formulaStr = args.calculatedField.formula;
2401
+ let reg1 = /"First\((.+?)\)"/g;
2402
+ let reg2 = /"Last\((.+?)\)"/g;
2403
+ if (reg1.test(formulaStr) || reg2.test(formulaStr)) {
2404
+ // 判断是否存在First || Last 表达式
2405
+ let matchFirstFields = Array.from(formulaStr["matchAll"](/"First\((.+?)\)"/g), (m) => {
2406
+ return {
2407
+ matchStr: m[0],
2408
+ matchWord: m[1],
2409
+ replaceValue: "",
2410
+ matchMethod: "First",
2411
+ };
2412
+ });
2413
+ let matchLastFields = Array.from(formulaStr["matchAll"](/"Last\((.+?)\)"/g), (m) => {
2414
+ return {
2415
+ matchStr: m[0],
2416
+ matchWord: m[1],
2417
+ replaceValue: "",
2418
+ matchMethod: "Last",
2419
+ };
2420
+ });
2421
+ let matchMaxFields = Array.from(formulaStr["matchAll"](/"Max\((.+?)\)"/g), (m) => {
2422
+ return {
2423
+ matchStr: m[0],
2424
+ matchWord: m[1],
2425
+ replaceValue: "",
2426
+ matchMethod: "Max",
2427
+ };
2428
+ });
2429
+ let matchMinFields = Array.from(formulaStr["matchAll"](/"Min\((.+?)\)"/g), (m) => {
2430
+ return {
2431
+ matchStr: m[0],
2432
+ matchWord: m[1],
2433
+ replaceValue: "",
2434
+ matchMethod: "Min",
2435
+ };
2436
+ });
2437
+ let matchSumFields = Array.from(formulaStr["matchAll"](/"Sum\((.+?)\)"/g), (m) => {
2438
+ return {
2439
+ matchStr: m[0],
2440
+ matchWord: m[1],
2441
+ replaceValue: "",
2442
+ matchMethod: "Sum",
2443
+ };
2444
+ });
2445
+ let matchAvgFields = Array.from(formulaStr["matchAll"](/"Avg\((.+?)\)"/g), (m) => {
2446
+ return {
2447
+ matchStr: m[0],
2448
+ matchWord: m[1],
2449
+ replaceValue: "",
2450
+ matchMethod: "Avg",
2451
+ };
2452
+ });
2453
+ if (matchFirstFields.every((x) => this.allowedCalculatedFields.includes(x.matchWord)) &&
2454
+ matchLastFields.every((x) => this.allowedCalculatedFields.includes(x.matchWord))) {
2455
+ // 判断First和Last表达式内的字段是否合法
2456
+ this.customCalculatedFields.push({
2457
+ name: args.calculatedField.name,
2458
+ formula: args.calculatedField.formula,
2459
+ matchFields: [
2460
+ // @ts-ignore
2461
+ ...matchFirstFields,
2462
+ ...matchLastFields,
2463
+ ...matchMaxFields,
2464
+ ...matchMinFields,
2465
+ ...matchSumFields,
2466
+ ...matchAvgFields,
2467
+ ],
2468
+ grandTotal: 0,
2469
+ });
2470
+ let fieldName = (formulaStr.split("First(")[1] ||
2471
+ formulaStr.split("Last(")[1]).split(")")[0];
2472
+ args.calculatedField.formula =
2473
+ "'\"" + "Sum(" + fieldName + ')"=' + formulaStr + "'";
2474
+ }
2475
+ }
2476
+ }
2477
+ }
2478
+ // Calculated field事件:完成
2479
+ actionComplete(args) {
2480
+ if (args.actionName === "Field aggregated" ||
2481
+ args.actionName === "Field list closed") {
2482
+ this.dataSourceSettings.values = [
2483
+ ...args.dataSourceSettings.values,
2484
+ ];
2485
+ this.setValueItemData();
2486
+ }
2487
+ if (args.actionName == "Field removed") {
2488
+ if (args.fieldInfo &&
2489
+ args.fieldInfo.fieldItem &&
2490
+ args.fieldInfo.fieldItem.type == "CalculatedField") {
2491
+ let field = args.fieldInfo.fieldName;
2492
+ // Remove the deleted calculated field from an stored array.
2493
+ this.customCalculatedFields =
2494
+ this.customCalculatedFields.filter(function (obj) {
2495
+ return obj.name !== field;
2496
+ });
2497
+ }
2498
+ }
2499
+ }
2500
+ // Calculated field事件:开始
2501
+ actionBegin(args) {
2502
+ if (args.actionName === "Edit calculated field") {
2503
+ for (let i = 0; i < this.customCalculatedFields.length; i++) {
2504
+ if (this.customCalculatedFields[i].name &&
2505
+ this.pivotObj.engineModule.fieldList[this.customCalculatedFields[i].name]) {
2506
+ this.pivotObj.engineModule.fieldList[this.customCalculatedFields[i].name].formula = this.customCalculatedFields[i].formula;
2507
+ }
2508
+ }
2509
+ }
2510
+ }
2511
+ resizeStop(args) {
2512
+ if (this.config.columnsWidth) {
2513
+ const header_field = this.config.columnsWidth.filter((el) => el.headerText === args.column.headerText);
2514
+ if (header_field.length > 0) {
2515
+ header_field[0].width = parseInt(args.column.width);
2516
+ }
2517
+ else {
2518
+ this.config.columnsWidth.push({
2519
+ headerText: args.column.headerText,
2520
+ width: parseInt(args.column.width),
2521
+ });
2522
+ }
2523
+ }
2524
+ else {
2525
+ this.config.columnsWidth = [];
2526
+ this.config.columnsWidth.push({
2527
+ headerText: args.column.headerText,
2528
+ width: parseInt(args.column.width),
2529
+ });
2530
+ }
2531
+ const portlet = this.portlet;
2532
+ portlet.config = JSON.stringify(this.config);
2533
+ const index = this.portlets.findIndex((x) => x.newId === portlet.newId);
2534
+ if (index > -1)
2535
+ this.portlets[index] = portlet;
2536
+ }
2537
+ setColumnsRender(args) {
2538
+ if (args.stackedColumns) {
2539
+ args.stackedColumns.forEach((col) => {
2540
+ if (col.format &&
2541
+ (col.format.indexOf("N") !== -1 ||
2542
+ col.format === "percent" ||
2543
+ col.format.indexOf("P") !== -1)) {
2544
+ col.textAlign = "Right";
2545
+ }
2546
+ });
2547
+ }
2548
+ if (this.config.columnsWidth) {
2549
+ for (let i = 0; i < args.columns.length; i++) {
2550
+ if (args.columns[i].headerText === "" ||
2551
+ !args.columns[i].headerText) {
2552
+ const column_row = this.config.columnsWidth.filter((el) => el.headerText === args.columns[i].headerText);
2553
+ if (column_row.length > 0) {
2554
+ args.columns[i].width = column_row[0].width;
2555
+ }
2556
+ }
2557
+ else {
2558
+ const headerText = args.columns[i].headerText
2559
+ .replace(/\s+/g, "")
2560
+ .split(".");
2561
+ if (headerText && headerText.length > 0) {
2562
+ const column = this.config.columnsWidth.filter((el) => el.headerText
2563
+ .replace(/\s+/g, "")
2564
+ .toLowerCase() ===
2565
+ headerText[headerText.length - 1].toLowerCase());
2566
+ if (column.length > 0) {
2567
+ args.columns[i].width = column[0].width;
2568
+ }
2569
+ }
2570
+ }
2571
+ // date format about quarterly
2572
+ let pivotValues = this.pivotObj.pivotValues;
2573
+ if (this.formatDates && this.formatDates.length) {
2574
+ let dateFields = this.formatDates.map((el) => {
2575
+ return el.name;
2576
+ });
2577
+ for (let k = 1; k < pivotValues.length; k++) {
2578
+ for (let j = 0; pivotValues[k] != null && j < pivotValues[k].length; j++) {
2579
+ if (pivotValues[k][j] != null &&
2580
+ (j == 0
2581
+ ? dateFields.includes(pivotValues[k][j].valueSort.axis)
2582
+ : dateFields.includes(pivotValues[k][j].actualText))) {
2583
+ //Customize the Row headers/Column headers based on your needs
2584
+ let headers;
2585
+ if (j === 0) {
2586
+ headers = pivotValues[k][j].actualText;
2587
+ }
2588
+ else {
2589
+ // headers = pivotValues[k][j].formattedText;
2590
+ headers = pivotValues[k][j].value;
2591
+ }
2592
+ if (headers) {
2593
+ let date = new Date(headers);
2594
+ let quarter = Math.floor(date.getMonth() / 3) + 1;
2595
+ let format;
2596
+ this.formatDates.map((el) => {
2597
+ if (j == 0) {
2598
+ if (el.name ==
2599
+ pivotValues[k][j].valueSort.axis)
2600
+ format = el.format;
2601
+ }
2602
+ else {
2603
+ if (el.name ==
2604
+ pivotValues[k][j].actualText)
2605
+ format = el.format;
2606
+ }
2607
+ });
2608
+ pivotValues[k][j].formattedText =
2609
+ this.getQuarterValue(format, date, quarter);
2610
+ }
2611
+ }
2612
+ }
2613
+ }
2614
+ }
2615
+ }
2616
+ // if(this.pivotObj) this.pivotObj.refreshData();
2617
+ }
2618
+ }
2619
+ onLoad() {
2620
+ // SMP2-15651 开启虚拟滚动并sort列后,来回滚动会导致数据空白
2621
+ // 官方链接 https://ej2.syncfusion.com/angular/documentation/pivotview/virtual-scrolling#virtual-scrolling-for-static-field-list
2622
+ // Demo链接 https://stackblitz.com/edit/github-7ggk2u-4rkzb3?file=src%2Fapp.component.ts
2623
+ this.fieldlistObj.pivotGridModule = this
2624
+ .pivotObj;
2625
+ }
2626
+ ondataBound() {
2627
+ if (Browser.isDevice) {
2628
+ this.pivotObj.element.style.width = '100%';
2629
+ this.pivotObj.allowCalculatedField = true;
2630
+ this.pivotObj.showFieldList = true;
2631
+ }
2632
+ }
2633
+ enginePopulated(args) {
2634
+ let clonedValues;
2635
+ let currentPivotValues = this.getClonedPivotValues(this.pivotObj.engineModule.pivotValues);
2636
+ let pageSettings = this.pivotObj.engineModule.pageSettings;
2637
+ if (this.pivotObj.engineModule.generateGridData) {
2638
+ // 没法复现 https://raiselp.atlassian.net/browse/SMP2-1724 处理的这个问题情况, 直接注释掉
2639
+ // 下面这段代码会影响 https://raiselp.atlassian.net/browse/SMP2-12139
2640
+ // this.pivotObj.engineModule.generateGridData(
2641
+ // this.pivotObj.dataSourceSettings,
2642
+ // true
2643
+ // );
2644
+ clonedValues = this.getClonedPivotValues(this.pivotObj.engineModule.pivotValues);
2645
+ this.pivotObj.engineModule.pivotValues = currentPivotValues;
2646
+ this.pivotObj.engineModule.pageSettings = pageSettings;
2647
+ // Here "clonedValues" contains the whole pivot values.
2648
+ this.allDataValue = clonedValues;
2649
+ }
2650
+ }
2651
+ getClonedPivotValues(pivotValues) {
2652
+ let clonedSets = [];
2653
+ if (pivotValues && pivotValues.length) {
2654
+ for (let i = 0; i < pivotValues.length; i++) {
2655
+ if (pivotValues[i]) {
2656
+ clonedSets[i] = [];
2657
+ for (let j = 0; j < pivotValues[i].length; j++) {
2658
+ if (pivotValues[i][j]) {
2659
+ /* eslint-disable */
2660
+ clonedSets[i][j] = this.getClonedPivotValueObj(pivotValues[i][j]);
2661
+ /* eslint-enable */
2662
+ }
2663
+ }
2664
+ }
2665
+ }
2666
+ }
2667
+ return clonedSets;
2668
+ }
2669
+ getClonedPivotValueObj(data) {
2670
+ let keyPos = 0;
2671
+ let framedSet = {};
2672
+ if (!(data === null || data === undefined)) {
2673
+ let fields = Object.keys(data);
2674
+ while (keyPos < fields.length) {
2675
+ framedSet[fields[keyPos]] = data[fields[keyPos]];
2676
+ keyPos++;
2677
+ }
2678
+ }
2679
+ else {
2680
+ framedSet = data;
2681
+ }
2682
+ return framedSet;
2683
+ }
2684
+ //#region Filtering the TreeNodes
2685
+ searchNodes(args) {
2686
+ let _text = args.maskedValue;
2687
+ let predicats = [], _array = [], _filter = [];
2688
+ if (_text == "") {
2689
+ this.changeDataSource(this.fieldlistObj.treeViewModule.getTreeData());
2690
+ }
2691
+ else {
2692
+ let predicate = new Predicate("caption", "contains", _text, true);
2693
+ let filteredList = new DataManager(this.fieldlistObj.treeViewModule.getTreeData()).executeLocal(new Query().where(predicate));
2694
+ for (let j = 0; j < filteredList.length; j++) {
2695
+ _filter.push(filteredList[j]["id"]);
2696
+ let filters = this.getFilterItems(filteredList[j], this.fieldlistObj.treeViewModule.getTreeData());
2697
+ for (let i = 0; i < filters.length; i++) {
2698
+ if (_array.indexOf(filters[i]) == -1 &&
2699
+ filters[i] != null) {
2700
+ _array.push(filters[i]);
2701
+ predicats.push(new Predicate("id", "equal", filters[i], false));
2702
+ }
2703
+ }
2704
+ }
2705
+ if (predicats.length == 0) {
2706
+ this.changeDataSource([]);
2707
+ }
2708
+ else {
2709
+ let query = new Query().where(Predicate.or(predicats));
2710
+ let newList = new DataManager(this.fieldlistObj.treeViewModule.getTreeData()).executeLocal(query);
2711
+ this.changeDataSource(newList);
2712
+ }
2713
+ }
2714
+ }
2715
+ //Find the Parent Nodes for corresponding childs
2716
+ getFilterItems(fList, list) {
2717
+ let nodes = [];
2718
+ nodes.push(fList["id"]);
2719
+ let query2 = new Query().where("id", "equal", fList["pid"], false);
2720
+ let fList1 = new DataManager(list).executeLocal(query2);
2721
+ if (fList1.length != 0) {
2722
+ let pNode = this.getFilterItems(fList1[0], list);
2723
+ for (let i = 0; i < pNode.length; i++) {
2724
+ if (nodes.indexOf(pNode[i]) == -1 && pNode[i] != null)
2725
+ nodes.push(pNode[i]);
2726
+ }
2727
+ return nodes;
2728
+ }
2729
+ return nodes;
2730
+ }
2731
+ created(args) {
2732
+ if (this.fieldlistObj && !this.fieldlistObj.engineModule.fields) {
2733
+ this.fieldlistObj.engineModule.fields = [];
2734
+ }
2735
+ let search = document.createElement("input");
2736
+ search.id = "pivotSearchBox" + this.fieldlistObj.element.id;
2737
+ let el = document.querySelector("#" + this.fieldlistObj.element.id + "_Container .e-field-table");
2738
+ if (el)
2739
+ el.prepend(search);
2740
+ this.pivotSearchBox = new MaskedTextBox({
2741
+ placeholder: this.translation.SEARCH || ".SEARCH",
2742
+ cssClass: "pivot-search",
2743
+ change: this.searchNodes.bind(this),
2744
+ });
2745
+ this.pivotSearchBox.appendTo("#pivotSearchBox" + this.fieldlistObj.element.id);
2746
+ // NEW Dashboard 点击"apply"时,请求新数据
2747
+ let applyBtn = document.getElementById(this.fieldlistObj.element.id + "_DeferUpdateButton1");
2748
+ applyBtn &&
2749
+ applyBtn.addEventListener("click", () => {
2750
+ this.pageLoading = true;
2751
+ this.dashboardPorletsService.getDataByPortletsNew([this.portlet], () => {
2752
+ this.pageLoading = false;
2753
+ this.Pivot_Data =
2754
+ this.dashboardPorletsService.getResultByDataTable(this.portlet, false, false, this.dashboard.id);
2755
+ this.pivotObj.dataSourceSettings.dataSource =
2756
+ this.Pivot_Data;
2757
+ if (this.Pivot_Data) {
2758
+ let groups = this.config.xaxis.groups;
2759
+ let rows = [];
2760
+ if (groups) {
2761
+ for (let gitem of groups) {
2762
+ const field = this.configFields.filter((el) => el.colName === gitem.name);
2763
+ if (field.length > 0) {
2764
+ gitem.showSubTotals =
2765
+ field[0].showSubTotals;
2766
+ gitem.caption =
2767
+ field[0].langValue ||
2768
+ this.translation[field[0].langCode] ||
2769
+ field[0].langCode ||
2770
+ gitem.caption;
2771
+ }
2772
+ rows.push(gitem);
2773
+ }
2774
+ }
2775
+ this.Pivot_Data.map((data) => {
2776
+ rows.forEach((row) => {
2777
+ if (data[row.name] === "") {
2778
+ data[row.name] = "null";
2779
+ }
2780
+ });
2781
+ });
2782
+ }
2783
+ if (this.pivotObj)
2784
+ this.pivotObj.refreshData();
2785
+ this.ref.markForCheck();
2786
+ this.ref.detectChanges();
2787
+ }, null, false, this.dashboard, false);
2788
+ });
2789
+ // 点击"cancel"时,恢复原始数据
2790
+ let cancelBtn = document.getElementById(this.fieldlistObj.element.id + "_DeferUpdateButton2");
2791
+ cancelBtn &&
2792
+ cancelBtn.addEventListener("click", () => {
2793
+ this.pivotObj.dataSourceSettings.dataSource =
2794
+ [...this.Pivot_Data];
2795
+ if (this.pivotObj)
2796
+ this.pivotObj.refreshData();
2797
+ this.ref.markForCheck();
2798
+ this.ref.detectChanges();
2799
+ });
2800
+ }
2801
+ fieldListRefreshed(args) {
2802
+ if (this.pivotSearchBox) {
2803
+ this.pivotSearchBox.value = "";
2804
+ this.changeDataSource(this.fieldlistObj.treeViewModule.getTreeData());
2805
+ }
2806
+ }
2807
+ changeDataSource(data) {
2808
+ let fieldTable = this.fieldlistObj.treeViewModule.fieldTable;
2809
+ if (fieldTable) {
2810
+ fieldTable.fields = {
2811
+ dataSource: data,
2812
+ id: "id",
2813
+ text: "caption",
2814
+ isChecked: "isSelected",
2815
+ parentID: "pid",
2816
+ iconCss: "spriteCssClass",
2817
+ };
2818
+ }
2819
+ }
2820
+ //SMP2-2957 fix the date issue on the raw data
2821
+ drillThrough(args) {
2822
+ for (let i = 0; i < args.gridColumns.length; i++) {
2823
+ const data = this.configFields.filter((el) => el.colName === args.gridColumns[i].field);
2824
+ if (data && data.length > 0) {
2825
+ if (data[0].dataType === "date" ||
2826
+ data[0].dataType === "datetime") {
2827
+ args.gridColumns[i].type = "date";
2828
+ }
2829
+ }
2830
+ }
2831
+ }
2832
+ //#endregion
2833
+ setFontSettingConditional(obj, data, code) {
2834
+ if (code === -1) {
2835
+ obj.style.color = data.negaFontColor;
2836
+ obj.style.fontFamily = data.negaFontFamilyValue;
2837
+ obj.style.fontSize = data.negaFontSizeValue;
2838
+ obj.style.backgroundColor = data.negaBackgroundColor;
2839
+ }
2840
+ else {
2841
+ obj.style.color = data.fontColor;
2842
+ obj.style.fontFamily = data.fontFamilyValue;
2843
+ obj.style.fontSize = data.fontSizeValue;
2844
+ obj.style.backgroundColor = data.backgroundColor;
2845
+ }
2846
+ }
2847
+ setCompareConditional(negaConditionalFormatObj, conditionalFormatObj, data) {
2848
+ if (Math.sign(data.compareValue1) == 0) {
2849
+ switch (data.compareSelect) {
2850
+ case "LessThan": // 小于
2851
+ case "LessThanOrEqualTo": // 小于等于
2852
+ negaConditionalFormatObj.value1 = 0;
2853
+ negaConditionalFormatObj.conditions = "LessThan";
2854
+ this.setFontSettingConditional(negaConditionalFormatObj, data, -1);
2855
+ break;
2856
+ case "GreaterThan": // 大于
2857
+ case "GreaterThanOrEqualTo": // 大于等于
2858
+ conditionalFormatObj.value1 = 0;
2859
+ conditionalFormatObj.conditions = "GreaterThan";
2860
+ this.setFontSettingConditional(conditionalFormatObj, data, 1);
2861
+ break;
2862
+ case "NotEquals": // 不等于
2863
+ negaConditionalFormatObj.value1 = 0;
2864
+ negaConditionalFormatObj.conditions = "LessThan";
2865
+ this.setFontSettingConditional(negaConditionalFormatObj, data, -1);
2866
+ conditionalFormatObj.value1 = 0;
2867
+ conditionalFormatObj.conditions = "GreaterThan";
2868
+ this.setFontSettingConditional(conditionalFormatObj, data, 1);
2869
+ break;
2870
+ case "Between": // value1<= val <=value2
2871
+ if (Math.sign(data.compareValue2) === 1) {
2872
+ conditionalFormatObj.value1 = 0;
2873
+ conditionalFormatObj.value2 = Number(data.compareValue2);
2874
+ conditionalFormatObj.conditions = "Between";
2875
+ this.setFontSettingConditional(conditionalFormatObj, data, 1);
2876
+ }
2877
+ break;
2878
+ case "NotBetween": // val >= value2, val <= value1
2879
+ if (Math.sign(data.compareValue2) === 1) {
2880
+ conditionalFormatObj.value1 = Number(data.compareValue2);
2881
+ conditionalFormatObj.conditions = "GreaterThan";
2882
+ this.setFontSettingConditional(conditionalFormatObj, data, 1);
2883
+ negaConditionalFormatObj.value1 = 0;
2884
+ negaConditionalFormatObj.conditions = "LessThan";
2885
+ this.setFontSettingConditional(negaConditionalFormatObj, data, -1);
2886
+ }
2887
+ break;
2888
+ default:
2889
+ break;
2890
+ }
2891
+ }
2892
+ else if (Math.sign(data.compareValue1) === 1) {
2893
+ switch (data.compareSelect) {
2894
+ case "LessThan": // 小于
2895
+ case "LessThanOrEqualTo": // 小于等于
2896
+ conditionalFormatObj.value1 = 0;
2897
+ conditionalFormatObj.value2 = Number(data.compareValue1);
2898
+ conditionalFormatObj.conditions = "Between";
2899
+ this.setFontSettingConditional(conditionalFormatObj, data, 1);
2900
+ negaConditionalFormatObj.value1 = 0;
2901
+ negaConditionalFormatObj.conditions = "LessThan";
2902
+ this.setFontSettingConditional(negaConditionalFormatObj, data, -1);
2903
+ break;
2904
+ case "GreaterThan": // 大于
2905
+ case "GreaterThanOrEqualTo": // 大于等于
2906
+ conditionalFormatObj.value1 = Number(data.compareValue1);
2907
+ conditionalFormatObj.conditions = "GreaterThan";
2908
+ this.setFontSettingConditional(conditionalFormatObj, data, 1);
2909
+ break;
2910
+ case "Equals": // 等于
2911
+ conditionalFormatObj.value1 = Number(data.compareValue1);
2912
+ conditionalFormatObj.conditions = "Equals";
2913
+ this.setFontSettingConditional(conditionalFormatObj, data, 1);
2914
+ break;
2915
+ case "NotEquals": // 不等于
2916
+ conditionalFormatObj.value1 = 0;
2917
+ conditionalFormatObj.value2 = Number(data.compareValue1);
2918
+ conditionalFormatObj.conditions = "Between";
2919
+ // push进数组
2920
+ conditionalFormatObj.value1 = Number(data.compareValue1);
2921
+ conditionalFormatObj.conditions = "GreaterThan";
2922
+ // push进数组
2923
+ negaConditionalFormatObj.value1 = 0;
2924
+ negaConditionalFormatObj.conditions = "LessThanOrEqualTo";
2925
+ this.setFontSettingConditional(negaConditionalFormatObj, data, -1);
2926
+ this.setFontSettingConditional(conditionalFormatObj, data, 1);
2927
+ break;
2928
+ case "Between": // value1<= val <=value2
2929
+ if (Math.sign(data.compareValue2) === 1) {
2930
+ conditionalFormatObj.value1 = Number(data.compareValue1);
2931
+ conditionalFormatObj.value2 = Number(data.compareValue2);
2932
+ conditionalFormatObj.conditions = "Between";
2933
+ this.setFontSettingConditional(conditionalFormatObj, data, 1);
2934
+ }
2935
+ break;
2936
+ case "NotBetween": // val >= value2, val <= value1
2937
+ if (Math.sign(data.compareValue2) === 1) {
2938
+ conditionalFormatObj.value1 = 0;
2939
+ conditionalFormatObj.value2 = Number(data.compareValue1);
2940
+ conditionalFormatObj.conditions = "Between";
2941
+ // push进数组
2942
+ conditionalFormatObj.value1 = Number(data.compareValue2);
2943
+ conditionalFormatObj.conditions = "GreaterThan";
2944
+ // push进数组
2945
+ this.setFontSettingConditional(conditionalFormatObj, data, 1);
2946
+ }
2947
+ break;
2948
+ default:
2949
+ break;
2950
+ }
2951
+ }
2952
+ else if (Math.sign(data.compareValue1) === -1) {
2953
+ switch (data.compareSelect) {
2954
+ case "LessThan": // 小于
2955
+ case "LessThanOrEqualTo": // 小于等于
2956
+ negaConditionalFormatObj.value1 = data.compareValue1;
2957
+ negaConditionalFormatObj.conditions = data.compareSelect;
2958
+ this.setFontSettingConditional(negaConditionalFormatObj, data, -1);
2959
+ break;
2960
+ case "GreaterThan": // 大于
2961
+ case "GreaterThanOrEqualTo": // 大于等于
2962
+ conditionalFormatObj.value1 = 0;
2963
+ conditionalFormatObj.conditions = "GreaterThanOrEqualTo";
2964
+ negaConditionalFormatObj.value1 = 0;
2965
+ negaConditionalFormatObj.value2 = data.compareValue1;
2966
+ negaConditionalFormatObj.conditions = "Between";
2967
+ this.setFontSettingConditional(conditionalFormatObj, data, 1);
2968
+ this.setFontSettingConditional(negaConditionalFormatObj, data, -1);
2969
+ break;
2970
+ case "Equals": // 等于
2971
+ negaConditionalFormatObj.value1 = data.compareValue1;
2972
+ negaConditionalFormatObj.conditions = "Equals";
2973
+ this.setFontSettingConditional(negaConditionalFormatObj, data, -1);
2974
+ case "NotEquals": // 不等于
2975
+ negaConditionalFormatObj.value1 = data.compareValue1;
2976
+ negaConditionalFormatObj.conditions = "NotEquals";
2977
+ this.setFontSettingConditional(negaConditionalFormatObj, data, -1);
2978
+ conditionalFormatObj.value1 = 0;
2979
+ conditionalFormatObj.conditions = "GreaterThan";
2980
+ this.setFontSettingConditional(conditionalFormatObj, data, 1);
2981
+ break;
2982
+ case "Between": // value1<= val <=value2
2983
+ if (Math.sign(data.compareValue2)) {
2984
+ negaConditionalFormatObj.value1 = 0;
2985
+ negaConditionalFormatObj.value2 = data.compareValue1;
2986
+ negaConditionalFormatObj.conditions = "Between";
2987
+ this.setFontSettingConditional(negaConditionalFormatObj, data, -1);
2988
+ conditionalFormatObj.value1 = 0;
2989
+ conditionalFormatObj.value2 = data.compareValue2;
2990
+ conditionalFormatObj.conditions = "Between";
2991
+ this.setFontSettingConditional(conditionalFormatObj, data, 1);
2992
+ }
2993
+ else {
2994
+ negaConditionalFormatObj.value1 = data.compareValue1;
2995
+ negaConditionalFormatObj.value2 = data.compareValue2;
2996
+ negaConditionalFormatObj.conditions = "Between";
2997
+ this.setFontSettingConditional(negaConditionalFormatObj, data, -1);
2998
+ }
2999
+ break;
3000
+ case "NotBetween": // val >= value2, val <= value1
3001
+ if (Math.sign(data.compareValue2)) {
3002
+ negaConditionalFormatObj.value1 = data.compareValue1;
3003
+ negaConditionalFormatObj.conditions = "LessThan";
3004
+ this.setFontSettingConditional(negaConditionalFormatObj, data, -1);
3005
+ conditionalFormatObj.value1 = data.compareValue2;
3006
+ conditionalFormatObj.conditions = "GreaterThan";
3007
+ this.setFontSettingConditional(conditionalFormatObj, data, 1);
3008
+ }
3009
+ else {
3010
+ negaConditionalFormatObj.value1 = data.compareValue1;
3011
+ negaConditionalFormatObj.value2 = data.compareValue2;
3012
+ negaConditionalFormatObj.conditions = "NotBetween";
3013
+ this.setFontSettingConditional(negaConditionalFormatObj, data, -1);
3014
+ conditionalFormatObj.value1 = 0;
3015
+ conditionalFormatObj.conditions = "GreaterThan";
3016
+ this.setFontSettingConditional(conditionalFormatObj, data, 1);
3017
+ }
3018
+ break;
3019
+ default:
3020
+ break;
3021
+ }
3022
+ }
3023
+ }
3024
+ getQuarterValue(format, date, quarter) {
3025
+ let year;
3026
+ switch (format) {
3027
+ case "Q1 2021":
3028
+ year = date.getFullYear();
3029
+ return "Q" + quarter + " " + year;
3030
+ case "Q1 21":
3031
+ year = date.getYear() - 100;
3032
+ return "Q" + quarter + " " + year;
3033
+ case "2021 Q1":
3034
+ year = date.getFullYear();
3035
+ return year + " " + "Q" + quarter;
3036
+ case "21 Q1":
3037
+ year = date.getYear() - 100;
3038
+ return year + " " + "Q" + quarter;
3039
+ }
3040
+ }
3041
+ customiseCell(args) {
3042
+ if (args.column.type === "date" || args.column.type === "dateTime") {
3043
+ const { field } = args.column;
3044
+ if (!args.data[field]) {
3045
+ args.column.type = "string";
3046
+ args.column.format = "";
3047
+ }
3048
+ }
3049
+ }
3050
+ /**
3051
+ * @param timeArray 数组对象 [{"date":"2021-01-01"},{"date":"2021-02-01"}]
3052
+ * @param endDate 截至时间
3053
+ * @param interval 时间间隔 year / quarter / month
3054
+ * @param timeKey 时间字段名 date
3055
+ * @returns 划分后的时间分组对象
3056
+ */
3057
+ getTimeRanges(timeArray, endDate, interval, timeKey) {
3058
+ // 将时间字符串转换为 moment 对象
3059
+ const dates = timeArray.map((item) => moment(item[timeKey || "date"]));
3060
+ // 分隔符
3061
+ const delimiter = "-";
3062
+ // 找到最小时间和最大时间
3063
+ const minDate = moment.min(dates);
3064
+ const maxDate = moment(endDate);
3065
+ // 初始化结果对象
3066
+ const result = {};
3067
+ // 根据入参进行划分
3068
+ if (interval === "year") {
3069
+ const startYear = minDate.year();
3070
+ const endYear = maxDate.year();
3071
+ for (let year = startYear; year <= endYear; year++) {
3072
+ result[year] = [];
3073
+ }
3074
+ dates.forEach((date, index) => {
3075
+ const year = date.year();
3076
+ result[year].push(timeArray[index]);
3077
+ });
3078
+ }
3079
+ else if (interval === "quarter") {
3080
+ // 存储季度字符串
3081
+ const quarters = [];
3082
+ // 逐一遍历每个季度
3083
+ for (let currentDate = minDate.clone(); currentDate.isSameOrBefore(maxDate); currentDate.add(3, "months")) {
3084
+ const year = currentDate.year();
3085
+ const quarter = Math.ceil((currentDate.month() + 1) / 3); // 计算季度
3086
+ quarters.push(`${year}${delimiter}Q${quarter}`); // 格式化并添加到数组
3087
+ }
3088
+ // 输出所有季度
3089
+ quarters.forEach((quarter, index) => {
3090
+ result[quarter] = [];
3091
+ });
3092
+ dates.forEach((date, index) => {
3093
+ const year = date.year();
3094
+ const quarter = date.quarter(); // 获取季度
3095
+ if (quarter === 1)
3096
+ result[year + delimiter + "Q1"].push(timeArray[index]);
3097
+ else if (quarter === 2)
3098
+ result[year + delimiter + "Q2"].push(timeArray[index]);
3099
+ else if (quarter === 3)
3100
+ result[year + delimiter + "Q3"].push(timeArray[index]);
3101
+ else if (quarter === 4)
3102
+ result[year + delimiter + "Q4"].push(timeArray[index]);
3103
+ });
3104
+ }
3105
+ else if (interval === "month") {
3106
+ // 存储月份字符串
3107
+ const months = [];
3108
+ // 逐一遍历每个月
3109
+ for (let currentDate = minDate.clone(); currentDate.isSameOrBefore(maxDate); currentDate.add(1, "months")) {
3110
+ months.push(currentDate.format(`YYYY${delimiter}MM`)); // 格式化并添加到数组
3111
+ }
3112
+ // 输出所有月份
3113
+ months.forEach((month, index) => {
3114
+ result[month] = [];
3115
+ });
3116
+ dates.forEach((date, index) => {
3117
+ const year = date.year();
3118
+ const month = (date.month() + 1).toString().padStart(2, "0"); // 0-11
3119
+ result[year + delimiter + month].push(timeArray[index]);
3120
+ });
3121
+ }
3122
+ return result;
3123
+ }
3124
+ /**
3125
+ * 计算几何算数平方更
3126
+ * @param values 数组 [0, 0, 0.2575]
3127
+ * @returns
3128
+ */
3129
+ calculateGrowthRate(values) {
3130
+ const product = values.reduce((acc, val) => acc * (1 + val), 1);
3131
+ if (product >= 0) {
3132
+ return Math.pow(product, 1 / values.length) - 1;
3133
+ }
3134
+ else if (product < 0) {
3135
+ if (values.length % 2 == 0) {
3136
+ return null;
3137
+ }
3138
+ else {
3139
+ return this.nthroot(product, values.length) - 1;
3140
+ }
3141
+ }
3142
+ }
3143
+ nthroot(x, n) {
3144
+ let ng = n % 2;
3145
+ if (ng == 1 || x < 0)
3146
+ x = -x;
3147
+ var r = Math.pow(x, 1 / n);
3148
+ n = Math.pow(r, n);
3149
+ if (Math.abs(x - n) < 1 && x > 0 === n > 0)
3150
+ return ng ? -r : r;
3151
+ }
3152
+ /**
3153
+ * 标准偏差
3154
+ * @param values 数组 [0, 0, -0.4775]
3155
+ * @returns 0.2756847535380463
3156
+ */
3157
+ calculateStandardDeviation(values) {
3158
+ const n = values.length;
3159
+ // 检查数据点数量
3160
+ if (n < 2) {
3161
+ throw new Error("至少需要两个数据点来计算样本标准偏差");
3162
+ }
3163
+ // 计算均值
3164
+ const mean = values.reduce((acc, val) => acc + val, 0) / n;
3165
+ // 计算方差
3166
+ const variance = values.reduce((acc, val) => acc + Math.pow(val - mean, 2), 0) /
3167
+ (n - 1);
3168
+ // 返回标准偏差
3169
+ return Math.sqrt(variance);
3170
+ }
3171
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GadgetPivotComponent, deps: [{ token: i1.DashboardPorletsService }, { token: i2.DashboardService }, { token: i0.ChangeDetectorRef }, { token: PBF_TOKEN, optional: true }], target: i0.ɵɵFactoryTarget.Component });
3172
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: GadgetPivotComponent, selector: "rs-gadget-pivot", inputs: { portlet: "portlet", dashboard: "dashboard", portlets: "portlets" }, providers: [
3173
+ ToolbarService,
3174
+ FieldListService,
3175
+ NumberFormattingService,
3176
+ CalculatedFieldService,
3177
+ GroupingBarService,
3178
+ VirtualScrollService,
3179
+ DrillThroughService,
3180
+ ], viewQueries: [{ propertyName: "pivotObj", first: true, predicate: ["pivotview"], descendants: true }, { propertyName: "fieldlistObj", first: true, predicate: ["pivotfieldlist"], descendants: true }], ngImport: i0, template: "<div class=\"control-section\" style=\"overflow: hidden; height: 100%\">\r\n\t<ejs-pivotview\r\n\t\twidth=\"100%\"\r\n\t\theight=\"100%\"\r\n\t\tstyle=\"display: block\"\r\n\t\t[dataSourceSettings]=\"dataSourceSettings\"\r\n\t\t#pivotview\r\n\t\t(dataBound)=\"dataBound($event)\"\r\n\t\tenableValueSorting=\"true\"\r\n\t\tallowConditionalFormatting=\"true\"\r\n\t\t[allowDeferLayoutUpdate]=\"true\"\r\n\t\t[gridSettings]=\"gridSettings\"\r\n\t\tallowExcelExport=\"true\"\r\n\t\tallowGrouping=\"true\"\r\n\t\t[zoomSettings]=\"zoomSettings\"\r\n\t\tenableVirtualization=\"true\"\r\n\t\t(enginePopulated)=\"afterEnginePopulate($event)\"\r\n\t\t(aggregateCellInfo)=\"aggregateCellInfo($event)\"\r\n\t\t(cellClick)=\"cellClick($event)\"\r\n\t\tallowDrillThrough=\"true\"\r\n\t\t(actionFailure)=\"actionFailure($event)\"\r\n\t\t(actionComplete)=\"actionComplete($event)\"\r\n\t\t(actionBegin)=\"actionBegin($event)\"\r\n\t\t(fieldListRefreshed)=\"fieldListRefreshed($event)\"\r\n\t\t(drillThrough)=\"drillThrough($event)\"\r\n\t\t[showTooltip]=\"false\"\r\n\t\t(queryCellInfo)=\"customiseCell($event)\"\r\n\t\t(beforeExport)=\"beforeExport($event)\"\r\n\t>\r\n\t</ejs-pivotview>\r\n\r\n\t<div class=\"pivotfieldlist-control\">\r\n\t\t<ejs-pivotfieldlist\r\n\t\t\t[id]=\"portlet.newId\"\r\n\t\t\t#pivotfieldlist\r\n\t\t\t[allowDeferLayoutUpdate]=\"true\"\r\n\t\t\trenderMode=\"Popup\"\r\n\t\t\t(enginePopulated)=\"afterPopulate($event)\"\r\n\t\t\t(memberEditorOpen)=\"onMemberEditorOpen($event)\"\r\n\t\t\t(enginePopulating)=\"enginePopulating($event)\"\r\n\t\t\t(aggregateCellInfo)=\"aggregateCellInfo($event)\"\r\n\t\t\t(fieldDrop)=\"onFieldDrop($event)\"\r\n\t\t\t(actionComplete)=\"actionComplete($event)\"\r\n\t\t\t(actionBegin)=\"actionBegin($event)\"\r\n\t\t\t(calculatedFieldCreate)=\"calculatedFieldCreate($event)\"\r\n\t\t\t(load)=\"onLoad()\"\r\n\t\t\t(created)=\"created($event)\"\r\n\t\t\t(dataBound)='ondataBound()'\r\n\t\t>\r\n\t\t</ejs-pivotfieldlist>\r\n\t</div>\r\n\r\n\t<div class=\"full-box-mask\" *ngIf=\"pageLoading\">\r\n\t\t<mat-spinner\r\n\t\t\tstyle=\"z-index: 999\"\r\n\t\t\tmode=\"indeterminate\"\r\n\t\t\t[diameter]=\"24\"\r\n\t\t></mat-spinner>\r\n\t</div>\r\n</div>\r\n", styles: ["::ng-deep .e-pivotview .e-gridcontent tr:nth-child(2n) .e-leftfreeze.e-freezeleftborder:not(.e-gtot){background-color:#fff}.gadgetBar ul{margin:0;padding:0;list-style:none;display:inline-block;background:#fff;border-radius:5px}.gadgetBar ul li{display:inline-block;width:45px;height:39px;line-height:39px;text-align:center;cursor:pointer}:host::ng-deep .e-cellvalue{color:unset!important}:host ::ng-deep .e-pivotview .e-gtot{font-weight:400!important}:host ::ng-deep .e-pivotview .grand-class{background-color:#fff!important}:host ::ng-deep .e-pivotview .grand-class .e-cellvalue{font-size:12px;font-weight:700!important}:host ::ng-deep .e-headercell{background-color:#eaedf0!important}:host ::ng-deep .e-headercell .e-headertext{font-size:12px!important}:host ::ng-deep .e-columnsheader{background-color:#f8fafb!important}.logoImg{position:absolute!important;left:10px!important}:host ::ng-deep .image-{height:55px;width:55px;border-radius:50px;overflow:hidden;margin:5px 5px 5px 0;display:inline-flex;justify-content:center;align-items:center}:host ::ng-deep .image- img{width:55px}:host::ng-deep .e-pivotview .e-customclass .e-cellvalue{font-weight:700!important}:host::ng-deep .e-gridcontent .e-rowcell .e-cellvalue{background-color:transparent!important}::ng-deep .e-pivotfieldlist-container #AccountTypeCode .e-sort{opacity:0;pointer-events:none}::ng-deep .e-pivotfieldlist-container .e-footer-content .e-checkbox-layout{display:none}:host ::ng-deep .control-section .e-spin-show,:host ::ng-deep .control-section .e-spinner-pane{display:none!important}:host ::ng-deep .control-section .e-grid .e-gridheader .e-headercell .e-sortfilterdiv,:host ::ng-deep .control-section .e-treegrid .e-gridheader .e-headercell .e-sortfilterdiv{right:0}:host ::ng-deep .control-section .header-align-right .e-headercelldiv{text-align:right!important;justify-content:flex-end!important;padding-right:28px!important}:host ::ng-deep .control-section .header-align-right .e-headercelldiv .e-pivotcell-container{width:100%}:host ::ng-deep .control-section .e-pivotview{border:none!important}:host ::ng-deep .control-section .e-pivotview tr{height:32px!important}:host ::ng-deep .control-section .e-pivotview tr th{height:40px!important;background:#fff!important}:host ::ng-deep .control-section .e-pivotview .e-grid.e-default.e-bothlines .e-headercell{border-right:none!important;border-left:none!important}:host ::ng-deep .control-section .e-pivotview .e-table{border-right:none!important}:host ::ng-deep .control-section .e-pivotview svg{outline:none!important}:host ::ng-deep .control-section .e-pivotview svg>g>rect{stroke-width:0!important}:host ::ng-deep .control-section .e-pivotview .e-gridcontent .e-rowcell{border-right:none!important;border-left:none!important;border-color:#eff1f3!important}:host ::ng-deep .control-section .e-gridheader{border-top:none!important;border-color:#eff1f3!important;background-color:#fff!important}:host ::ng-deep .control-section .e-headertext{font-weight:400!important;color:#43566c!important}::ng-deep .e-pivot-treeview-outer li .e-text-content .e-list-text{margin-bottom:0!important}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.PivotViewComponent, selector: "ejs-pivotview", inputs: ["aggregateTypes", "allowCalculatedField", "allowConditionalFormatting", "allowDataCompression", "allowDeferLayoutUpdate", "allowDrillThrough", "allowExcelExport", "allowGrouping", "allowNumberFormatting", "allowPdfExport", "cellTemplate", "chartSettings", "chartTypes", "cssClass", "dataSourceSettings", "displayOption", "editSettings", "enableFieldSearching", "enableHtmlSanitizer", "enablePaging", "enablePersistence", "enableRtl", "enableValueSorting", "enableVirtualization", "exportAllPages", "gridSettings", "groupingBarSettings", "height", "hyperlinkSettings", "loadOnDemandInMemberEditor", "locale", "maxNodeLimitInMemberEditor", "maxRowsInDrillThrough", "pageSettings", "pagerSettings", "pivotValues", "showFieldList", "showGroupingBar", "showToolbar", "showTooltip", "showValuesButton", "spinnerTemplate", "toolbar", "toolbarTemplate", "tooltipTemplate", "virtualScrollSettings", "width"], outputs: ["actionBegin", "actionComplete", "actionFailure", "afterServiceInvoke", "aggregateCellInfo", "aggregateMenuOpen", "beforeExport", "beforeServiceInvoke", "beginDrillThrough", "calculatedFieldCreate", "cellClick", "cellSelected", "cellSelecting", "chartSeriesCreated", "conditionalFormatting", "created", "dataBound", "destroyed", "drill", "drillThrough", "editCompleted", "enginePopulated", "enginePopulating", "exportComplete", "fetchReport", "fieldDragStart", "fieldDrop", "fieldListRefreshed", "fieldRemove", "hyperlinkCellClick", "load", "loadReport", "memberEditorOpen", "memberFiltering", "newReport", "numberFormatting", "onFieldDropped", "onHeadersSort", "onPdfCellRender", "removeReport", "renameReport", "saveReport", "toolbarClick", "toolbarRender"] }, { kind: "component", type: i4.PivotFieldListComponent, selector: "ejs-pivotfieldlist", inputs: ["aggregateTypes", "allowCalculatedField", "allowDeferLayoutUpdate", "cssClass", "currencyCode", "dataSourceSettings", "enableFieldSearching", "enableHtmlSanitizer", "enablePersistence", "enableRtl", "loadOnDemandInMemberEditor", "locale", "maxNodeLimitInMemberEditor", "renderMode", "showValuesButton", "spinnerTemplate", "target"], outputs: ["actionBegin", "actionComplete", "actionFailure", "afterServiceInvoke", "aggregateCellInfo", "aggregateMenuOpen", "beforeServiceInvoke", "calculatedFieldCreate", "created", "dataBound", "destroyed", "enginePopulated", "enginePopulating", "fieldDragStart", "fieldDrop", "fieldRemove", "load", "memberEditorOpen", "memberFiltering", "onFieldDropped", "onHeadersSort"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3181
+ }
3182
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GadgetPivotComponent, decorators: [{
3183
+ type: Component,
3184
+ args: [{ selector: "rs-gadget-pivot", providers: [
3185
+ ToolbarService,
3186
+ FieldListService,
3187
+ NumberFormattingService,
3188
+ CalculatedFieldService,
3189
+ GroupingBarService,
3190
+ VirtualScrollService,
3191
+ DrillThroughService,
3192
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"control-section\" style=\"overflow: hidden; height: 100%\">\r\n\t<ejs-pivotview\r\n\t\twidth=\"100%\"\r\n\t\theight=\"100%\"\r\n\t\tstyle=\"display: block\"\r\n\t\t[dataSourceSettings]=\"dataSourceSettings\"\r\n\t\t#pivotview\r\n\t\t(dataBound)=\"dataBound($event)\"\r\n\t\tenableValueSorting=\"true\"\r\n\t\tallowConditionalFormatting=\"true\"\r\n\t\t[allowDeferLayoutUpdate]=\"true\"\r\n\t\t[gridSettings]=\"gridSettings\"\r\n\t\tallowExcelExport=\"true\"\r\n\t\tallowGrouping=\"true\"\r\n\t\t[zoomSettings]=\"zoomSettings\"\r\n\t\tenableVirtualization=\"true\"\r\n\t\t(enginePopulated)=\"afterEnginePopulate($event)\"\r\n\t\t(aggregateCellInfo)=\"aggregateCellInfo($event)\"\r\n\t\t(cellClick)=\"cellClick($event)\"\r\n\t\tallowDrillThrough=\"true\"\r\n\t\t(actionFailure)=\"actionFailure($event)\"\r\n\t\t(actionComplete)=\"actionComplete($event)\"\r\n\t\t(actionBegin)=\"actionBegin($event)\"\r\n\t\t(fieldListRefreshed)=\"fieldListRefreshed($event)\"\r\n\t\t(drillThrough)=\"drillThrough($event)\"\r\n\t\t[showTooltip]=\"false\"\r\n\t\t(queryCellInfo)=\"customiseCell($event)\"\r\n\t\t(beforeExport)=\"beforeExport($event)\"\r\n\t>\r\n\t</ejs-pivotview>\r\n\r\n\t<div class=\"pivotfieldlist-control\">\r\n\t\t<ejs-pivotfieldlist\r\n\t\t\t[id]=\"portlet.newId\"\r\n\t\t\t#pivotfieldlist\r\n\t\t\t[allowDeferLayoutUpdate]=\"true\"\r\n\t\t\trenderMode=\"Popup\"\r\n\t\t\t(enginePopulated)=\"afterPopulate($event)\"\r\n\t\t\t(memberEditorOpen)=\"onMemberEditorOpen($event)\"\r\n\t\t\t(enginePopulating)=\"enginePopulating($event)\"\r\n\t\t\t(aggregateCellInfo)=\"aggregateCellInfo($event)\"\r\n\t\t\t(fieldDrop)=\"onFieldDrop($event)\"\r\n\t\t\t(actionComplete)=\"actionComplete($event)\"\r\n\t\t\t(actionBegin)=\"actionBegin($event)\"\r\n\t\t\t(calculatedFieldCreate)=\"calculatedFieldCreate($event)\"\r\n\t\t\t(load)=\"onLoad()\"\r\n\t\t\t(created)=\"created($event)\"\r\n\t\t\t(dataBound)='ondataBound()'\r\n\t\t>\r\n\t\t</ejs-pivotfieldlist>\r\n\t</div>\r\n\r\n\t<div class=\"full-box-mask\" *ngIf=\"pageLoading\">\r\n\t\t<mat-spinner\r\n\t\t\tstyle=\"z-index: 999\"\r\n\t\t\tmode=\"indeterminate\"\r\n\t\t\t[diameter]=\"24\"\r\n\t\t></mat-spinner>\r\n\t</div>\r\n</div>\r\n", styles: ["::ng-deep .e-pivotview .e-gridcontent tr:nth-child(2n) .e-leftfreeze.e-freezeleftborder:not(.e-gtot){background-color:#fff}.gadgetBar ul{margin:0;padding:0;list-style:none;display:inline-block;background:#fff;border-radius:5px}.gadgetBar ul li{display:inline-block;width:45px;height:39px;line-height:39px;text-align:center;cursor:pointer}:host::ng-deep .e-cellvalue{color:unset!important}:host ::ng-deep .e-pivotview .e-gtot{font-weight:400!important}:host ::ng-deep .e-pivotview .grand-class{background-color:#fff!important}:host ::ng-deep .e-pivotview .grand-class .e-cellvalue{font-size:12px;font-weight:700!important}:host ::ng-deep .e-headercell{background-color:#eaedf0!important}:host ::ng-deep .e-headercell .e-headertext{font-size:12px!important}:host ::ng-deep .e-columnsheader{background-color:#f8fafb!important}.logoImg{position:absolute!important;left:10px!important}:host ::ng-deep .image-{height:55px;width:55px;border-radius:50px;overflow:hidden;margin:5px 5px 5px 0;display:inline-flex;justify-content:center;align-items:center}:host ::ng-deep .image- img{width:55px}:host::ng-deep .e-pivotview .e-customclass .e-cellvalue{font-weight:700!important}:host::ng-deep .e-gridcontent .e-rowcell .e-cellvalue{background-color:transparent!important}::ng-deep .e-pivotfieldlist-container #AccountTypeCode .e-sort{opacity:0;pointer-events:none}::ng-deep .e-pivotfieldlist-container .e-footer-content .e-checkbox-layout{display:none}:host ::ng-deep .control-section .e-spin-show,:host ::ng-deep .control-section .e-spinner-pane{display:none!important}:host ::ng-deep .control-section .e-grid .e-gridheader .e-headercell .e-sortfilterdiv,:host ::ng-deep .control-section .e-treegrid .e-gridheader .e-headercell .e-sortfilterdiv{right:0}:host ::ng-deep .control-section .header-align-right .e-headercelldiv{text-align:right!important;justify-content:flex-end!important;padding-right:28px!important}:host ::ng-deep .control-section .header-align-right .e-headercelldiv .e-pivotcell-container{width:100%}:host ::ng-deep .control-section .e-pivotview{border:none!important}:host ::ng-deep .control-section .e-pivotview tr{height:32px!important}:host ::ng-deep .control-section .e-pivotview tr th{height:40px!important;background:#fff!important}:host ::ng-deep .control-section .e-pivotview .e-grid.e-default.e-bothlines .e-headercell{border-right:none!important;border-left:none!important}:host ::ng-deep .control-section .e-pivotview .e-table{border-right:none!important}:host ::ng-deep .control-section .e-pivotview svg{outline:none!important}:host ::ng-deep .control-section .e-pivotview svg>g>rect{stroke-width:0!important}:host ::ng-deep .control-section .e-pivotview .e-gridcontent .e-rowcell{border-right:none!important;border-left:none!important;border-color:#eff1f3!important}:host ::ng-deep .control-section .e-gridheader{border-top:none!important;border-color:#eff1f3!important;background-color:#fff!important}:host ::ng-deep .control-section .e-headertext{font-weight:400!important;color:#43566c!important}::ng-deep .e-pivot-treeview-outer li .e-text-content .e-list-text{margin-bottom:0!important}\n"] }]
3193
+ }], ctorParameters: function () { return [{ type: i1.DashboardPorletsService }, { type: i2.DashboardService }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{
3194
+ type: Optional
3195
+ }, {
3196
+ type: Inject,
3197
+ args: [PBF_TOKEN]
3198
+ }] }]; }, propDecorators: { portlet: [{
3199
+ type: Input
3200
+ }], dashboard: [{
3201
+ type: Input
3202
+ }], portlets: [{
3203
+ type: Input
3204
+ }], pivotObj: [{
3205
+ type: ViewChild,
3206
+ args: ["pivotview", { static: false }]
3207
+ }], fieldlistObj: [{
3208
+ type: ViewChild,
3209
+ args: ["pivotfieldlist", { static: false }]
3210
+ }] } });
3211
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FkZ2V0LXBpdm90LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JhaXNlLWNvbW1vbi1saWIvc3JjL2xpYi9kYXNoYm9hcmQvZ2FkZ2V0LWdyb3VwL2dhZGdldC1waXZvdC9nYWRnZXQtcGl2b3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmFpc2UtY29tbW9uLWxpYi9zcmMvbGliL2Rhc2hib2FyZC9nYWRnZXQtZ3JvdXAvZ2FkZ2V0LXBpdm90L2dhZGdldC1waXZvdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRU4sU0FBUyxFQUNULEtBQUssRUFFTCxTQUFTLEVBQ1QsdUJBQXVCLEVBQ3ZCLE1BQU0sRUFDTixRQUFRLEdBQ1IsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQU1OLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsdUJBQXVCLEVBQ3ZCLHNCQUFzQixFQUV0QixrQkFBa0IsRUFHbEIsb0JBQW9CLEVBSXBCLG1CQUFtQixHQUduQixNQUFNLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sRUFDTixJQUFJLEVBQ0osWUFBWSxFQUNaLE9BQU8sR0FDUCxNQUFNLHNCQUFzQixDQUFDO0FBRTlCLE9BQU8sRUFDTixNQUFNLEVBQ04sY0FBYyxFQUNkLFVBQVUsRUFDVixTQUFTLEVBQ1QsTUFBTSxFQUNOLE1BQU0sSUFBSSxPQUFPLEVBQ2pCLEtBQUssRUFDTCxLQUFLLEVBQ0wsS0FBSyxFQUNMLE1BQU0sR0FDTixNQUFNLFFBQVEsQ0FBQztBQUVoQixPQUFPLEVBQ04sb0JBQW9CLEVBQ3BCLG1CQUFtQixHQUVuQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxVQUFVLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3REFBd0QsQ0FB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SztnQkFVRSxRQUFRO3NCQURmLFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFHbEMsWUFBWTtzQkFEbEIsU0FBUzt1QkFBQyxnQkFBZ0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG5cdENoYW5nZURldGVjdG9yUmVmLFxyXG5cdENvbXBvbmVudCxcclxuXHRJbnB1dCxcclxuXHRPbkluaXQsXHJcblx0Vmlld0NoaWxkLFxyXG5cdENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG5cdEluamVjdCxcclxuXHRPcHRpb25hbCxcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuaW1wb3J0IHtcclxuXHRJRGF0YU9wdGlvbnMsXHJcblx0UGl2b3RGaWVsZExpc3RDb21wb25lbnQsXHJcblx0UGl2b3RWaWV3Q29tcG9uZW50LFxyXG5cdEVuZ2luZVBvcHVsYXRlZEV2ZW50QXJncyxcclxuXHRJRGF0YVNldCxcclxuXHRUb29sYmFyU2VydmljZSxcclxuXHRGaWVsZExpc3RTZXJ2aWNlLFxyXG5cdE51bWJlckZvcm1hdHRpbmdTZXJ2aWNlLFxyXG5cdENhbGN1bGF0ZWRGaWVsZFNlcnZpY2UsXHJcblx0Q2FsY3VsYXRlZEZpZWxkQ3JlYXRlRXZlbnRBcmdzLFxyXG5cdEdyb3VwaW5nQmFyU2VydmljZSxcclxuXHRGaWVsZERyb3BFdmVudEFyZ3MsXHJcblx0SVNvcnQsXHJcblx0VmlydHVhbFNjcm9sbFNlcnZpY2UsXHJcblx0SVBpdm90VmFsdWVzLFxyXG5cdElQYWdlU2V0dGluZ3MsXHJcblx0RHJpbGxUaHJvdWdoRXZlbnRBcmdzLFxyXG5cdERyaWxsVGhyb3VnaFNlcnZpY2UsXHJcblx0UGl2b3RBY3Rpb25GYWlsdXJlRXZlbnRBcmdzLFxyXG5cdFF1ZXJ5Q2VsbEluZm9FdmVudEFyZ3MsXHJcbn0gZnJvbSBcIkBzeW5jZnVzaW9uL2VqMi1hbmd1bGFyLXBpdm90dmlld1wiO1xyXG5pbXBvcnQge1xyXG5cdEwxMG4sXHJcblx0ZW5hYmxlUmlwcGxlLFxyXG5cdEJyb3dzZXIsXHJcbn0gZnJvbSBcIkBzeW5jZnVzaW9uL2VqMi1iYXNlXCI7XHJcbmltcG9ydCB7IEdyaWRTZXR0aW5ncyB9IGZyb20gXCJAc3luY2Z1c2lvbi9lajItcGl2b3R2aWV3L3NyYy9waXZvdHZpZXcvbW9kZWwvZ3JpZHNldHRpbmdzXCI7XHJcbmltcG9ydCB7XHJcblx0c29ydEJ5LFxyXG5cdGRpZmZlcmVuY2VXaXRoLFxyXG5cdHN0YXJ0c1dpdGgsXHJcblx0Y2xvbmVEZWVwLFxyXG5cdHVuaXFCeSxcclxuXHRmaWx0ZXIgYXMgX2ZpbHRlcixcclxuXHRtYXhCeSxcclxuXHRtaW5CeSxcclxuXHRzdW1CeSxcclxuXHRtZWFuQnksXHJcbn0gZnJvbSBcImxvZGFzaFwiO1xyXG5pbXBvcnQgeyBEYXNoYm9hcmRTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL2Rhc2hib2FyZC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7XHJcblx0QUdHUkVHQVRFX1RZUEVTX1RFWFQsXHJcblx0QUxMX0FHR1JFR0FURV9UWVBFUyxcclxuXHREYXNoYm9hcmRQb3JsZXRzU2VydmljZSxcclxufSBmcm9tIFwiLi4vLi4vZGFzaGJvYXJkUG9ybGV0cy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IE1hc2tlZFRleHRCb3ggfSBmcm9tIFwiQHN5bmNmdXNpb24vZWoyLWlucHV0cy9zcmMvbWFza2VkdGV4dGJveC9tYXNrZWR0ZXh0Ym94XCI7XHJcbmltcG9ydCB7IERhdGFNYW5hZ2VyIH0gZnJvbSBcIkBzeW5jZnVzaW9uL2VqMi1kYXRhL3NyYy9tYW5hZ2VyXCI7XHJcbmltcG9ydCB7IFByZWRpY2F0ZSwgUXVlcnkgfSBmcm9tIFwiQHN5bmNmdXNpb24vZWoyLWRhdGEvc3JjL3F1ZXJ5XCI7XHJcbmltcG9ydCB7IERhdGFVdGlsIH0gZnJvbSBcIkBzeW5jZnVzaW9uL2VqMi1kYXRhXCI7XHJcbmltcG9ydCBtb21lbnQgZnJvbSBcIm1vbWVudFwiO1xyXG5pbXBvcnQgeyBQQkZfVE9LRU4gfSBmcm9tIFwiLi4vLi4vLi4vc2VydmljZS9JbmplY3Rpb25Ub2tlblwiO1xyXG5cclxuZW5hYmxlUmlwcGxlKGZhbHNlKTtcclxuXHJcbkBDb21wb25lbnQoe1xyXG5cdHNlbGVjdG9yOiBcInJzLWdhZGdldC1waXZvdFwiLFxyXG5cdHRlbXBsYXRlVXJsOiBcIi4vZ2FkZ2V0LXBpdm90LmNvbXBvbmVudC5odG1sXCIsXHJcblx0c3R5bGVVcmxzOiBbXCIuL2dhZGdldC1waXZvdC5jb21wb25lbnQuc2Nzc1wiXSxcclxuXHRwcm92aWRlcnM6IFtcclxuXHRcdFRvb2xiYXJTZXJ2aWNlLFxyXG5cdFx0RmllbGRMaXN0U2VydmljZSxcclxuXHRcdE51bWJlckZvcm1hdHRpbmdTZXJ2aWNlLFxyXG5cdFx0Q2FsY3VsYXRlZEZpZWxkU2VydmljZSxcclxuXHRcdEdyb3VwaW5nQmFyU2VydmljZSxcclxuXHRcdFZpcnR1YWxTY3JvbGxTZXJ2aWNlLFxyXG5cdFx0RHJpbGxUaHJvdWdoU2VydmljZSxcclxuXHRdLFxyXG5cdGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgR2FkZ2V0UGl2b3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cdEBJbnB1dCgpIHBvcnRsZXQ7XHJcblx0QElucHV0KCkgZGFzaGJvYXJkO1xyXG5cdEBJbnB1dCgpIHBvcnRsZXRzO1xyXG5cdHByaXZhdGUgUGl2b3RfRGF0YTogSURhdGFTZXRbXTtcclxuXHRwcml2YXRlIGNvbmZpZztcclxuXHRwdWJsaWMgZGF0YVNvdXJjZVNldHRpbmdzOiBJRGF0YU9wdGlvbnM7XHJcblx0cHVibGljIGdyaWRTZXR0aW5nczogR3JpZFNldHRpbmdzO1xyXG5cdHByaXZhdGUgZXhjbHVkZUZpZWxkcyA9IFtdO1xyXG5cdHByaXZhdGUgZmlsdGVyU2V0dGluZ3MgPSBbXTtcclxuXHRwcml2YXRlIGRhdGVQaXBlRm9ybWF0O1xyXG5cdHB1YmxpYyB0cmFuc2xhdGlvbjtcclxuXHRAVmlld0NoaWxkKFwicGl2b3R2aWV3XCIsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG5cdHByaXZhdGUgcGl2b3RPYmo6IFBpdm90Vmlld0NvbXBvbmVudDtcclxuXHRAVmlld0NoaWxkKFwicGl2b3RmaWVsZGxpc3RcIiwgeyBzdGF0aWM6IGZhbHNlIH0pXHJcblx0cHVibGljIGZpZWxkbGlzdE9iajogUGl2b3RGaWVsZExpc3RDb21wb25lbnQ7XHJcblx0cHJpdmF0ZSBvYnNlcnZhYmxlID0gbmV3IE9ic2VydmFibGUoKTtcclxuXHRwcml2YXRlIGdyYW5kVG90YWxzID0ge307XHJcblx0cHJpdmF0ZSBzdWJUb3RhbHMgPSB7fTtcclxuXHRwcml2YXRlIGZsYWc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHRwcml2YXRlIHByZXZpb3VzU29ydDogSVNvcnQ7XHJcblx0cHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xyXG5cdHByaXZhdGUgYWxsRGF0YVZhbHVlO1xyXG5cdC8vIHByaXZhdGUgY2FsY3VsYXRlZEZpZWxkU2V0dGluZ3M7XHJcblx0cHJpdmF0ZSBpc0luaXQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cdHByaXZhdGUgcGl2b3RTZWFyY2hCb3g6IE1hc2tlZFRleHRCb3g7XHJcblx0cHVibGljIHRvb2x0aXBTZXR0aW5ncyA9IHtcclxuXHRcdGVuYWJsZTogZmFsc2UsXHJcblx0fTtcclxuXHRwcml2YXRlIGNvbHVtblRleHRzID0gW107XHJcblx0cHJpdmF0ZSBjb25maWdGaWVsZHMgPSBbXTtcclxuXHRwcml2YXRlIHF1YXJ0ZXJGb3JtYXQgPSBbXHJcblx0XHR7IHZhbHVlOiBcIjAzLzIwMjFcIiwgZm9ybWF0OiBcIk1NL3l5eXlcIiB9LFxyXG5cdFx0eyB2YWx1ZTogXCIwMy8yMVwiLCBmb3JtYXQ6IFwiTU0vZGRcIiB9LFxyXG5cdFx0eyB2YWx1ZTogXCIzLzIwMjFcIiwgZm9ybWF0OiBcIk0veXl5eVwiIH0sXHJcblx0XHR7IHZhbHVlOiBcIjMvMjFcIiwgZm9ybWF0OiBcIk0veXlcIiB9LFxyXG5cdFx0eyB2YWx1ZTogXCJNYXJjaCAyMDIxXCIsIGZvcm1hdDogXCJNTU1NIHl5eXlcIiB9LFxyXG5cdFx0eyB2YWx1ZTogXCJNYXIsIDIwMjFcIiwgZm9ybWF0OiBcIk1NTSwgeXl5eVwiIH0sXHJcblx0XHR7IHZhbHVlOiBcIk1hcmNoLCAyMDIxXCIsIGZvcm1hdDogXCJNTU1NLCB5eXl5XCIgfSxcclxuXHRcdHsgdmFsdWU6IFwiMjAyMVwiLCBmb3JtYXQ6IFwieXl5eVwiIH0sXHJcblx0XTtcclxuXHR6b29tU2V0dGluZ3MgPSB7XHJcblx0XHRlbmFibGU6IGZhbHNlLFxyXG5cdH07XHJcblx0aXRlbURhdGFUeXBlU29ydEFyciA9IFtcclxuXHRcdFwiQXNzZXRzXCIsXHJcblx0XHRcIkxpYWJpbGl0aWVzXCIsXHJcblx0XHRcIkVxdWl0eVwiLFxyXG5cdFx0XCJQJkxcIixcclxuXHRcdFwiQ2FzaGZsb3dcIixcclxuXHRdO1xyXG5cdHByaXZhdGUgZm9ybWF0RGF0ZXMgPSBbXTtcclxuXHRwcml2YXRlIGN1c3RvbUNhbGN1bGF0ZWRGaWVsZHM6IGFueVtdID0gW107IC8vIOiHquWumuS5ieiuoeeul+WIl1xyXG5cdHByaXZhdGUgYWxsb3dlZENhbGN1bGF0ZWRGaWVsZHM6IGFueVtdID0gW107IC8vIOWFgeiuuOiHquWumuS5ieeul+azleeahOWtl+autVxyXG5cdHByaXZhdGUgemVyb0Zvcm1hdERhdGEgPSB7XHJcblx0XHRlbXB0eUxpc3Q6IFtdLFxyXG5cdFx0aGdMaXN0OiBbXSxcclxuXHR9O1xyXG5cdHByaXZhdGUgbWlsbGlvbkZpZWxkcyA9IFtdO1xyXG5cdHByaXZhdGUgdGVtcFN1YnRvdGFscyA9IFtdO1xyXG5cdHB1YmxpYyBvcmRlckJ5Q29sdW1uczsgLy8gRWc6IFwiRHVlRGF0ZSwgU2VxdWVuY2VcIlxyXG5cdHB1YmxpYyBpc0FwcGx5SVJSOiBib29sZWFuID0gZmFsc2U7XHJcblx0cHVibGljIGNhbGNJUlJEYXRhOiBhbnk7XHJcblx0cHJpdmF0ZSBwZXJjZW50TnVtRmllbGRzID0gW107XHJcblx0cHVibGljIHBhZ2VMb2FkaW5nO1xyXG5cclxuXHRjb25zdHJ1Y3RvcihcclxuXHRcdHByaXZhdGUgZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2U6IERhc2hib2FyZFBvcmxldHNTZXJ2aWNlLFxyXG5cdFx0cHJpdmF0ZSBkYXNoYm9hcmRTZXJ2aWNlOiBEYXNoYm9hcmRTZXJ2aWNlLFxyXG5cdFx0cHJpdmF0ZSByZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG5cdFx0QE9wdGlvbmFsKCkgQEluamVjdChQQkZfVE9LRU4pIHByaXZhdGUgcGJmOiBhbnksXHJcblxyXG5cdCkge31cclxuXHJcblx0bmdPbkluaXQoKSB7XHJcblx0XHR0aGlzLmdldEluZm8oKTtcclxuXHRcdEwxMG4ubG9hZCh7XHJcblx0XHRcdFwiZW4tVVNcIjoge1xyXG5cdFx0XHRcdHBpdm90dmlldzogQUdHUkVHQVRFX1RZUEVTX1RFWFQsXHJcblx0XHRcdFx0cGl2b3RmaWVsZGxpc3Q6IEFHR1JFR0FURV9UWVBFU19URVhULFxyXG5cdFx0XHR9LFxyXG5cdFx0XHR6aDoge1xyXG5cdFx0XHRcdHBpdm90dmlldzogQUdHUkVHQVRFX1RZUEVTX1RFWFQsXHJcblx0XHRcdFx0cGl2b3RmaWVsZGxpc3Q6IEFHR1JFR0FURV9UWVBFU19URVhULFxyXG5cdFx0XHR9LFxyXG5cdFx0XHRcInpoLUhhbnQtSEtcIjoge1xyXG5cdFx0XHRcdHBpdm90dmlldzogQUdHUkVHQVRFX1RZUEVTX1RFWFQsXHJcblx0XHRcdFx0cGl2b3RmaWVsZGxpc3Q6IEFHR1JFR0FURV9UWVBFU19URVhULFxyXG5cdFx0XHR9LFxyXG5cdFx0XHRqYToge1xyXG5cdFx0XHRcdHBpdm90dmlldzogQUdHUkVHQVRFX1RZUEVTX1RFWFQsXHJcblx0XHRcdFx0cGl2b3RmaWVsZGxpc3Q6IEFHR1JFR0FURV9UWVBFU19URVhULFxyXG5cdFx0XHR9LFxyXG5cdFx0XHRrbzoge1xyXG5cdFx0XHRcdHBpdm90dmlldzogQUdHUkVHQVRFX1RZUEVTX1RFWFQsXHJcblx0XHRcdFx0cGl2b3RmaWVsZGxpc3Q6IEFHR1JFR0FURV9UWVBFU19URVhULFxyXG5cdFx0XHR9LFxyXG5cdFx0XHRmcjoge1xyXG5cdFx0XHRcdHBpdm90dmlldzogQUdHUkVHQVRFX1RZUEVTX1RFWFQsXHJcblx0XHRcdFx0cGl2b3RmaWVsZGxpc3Q6IEFHR1JFR0FURV9UWVBFU19URVhULFxyXG5cdFx0XHR9LFxyXG5cdFx0fSk7XHJcblx0XHR0aGlzLmdldERhdGEoKTtcclxuXHR9XHJcblxyXG5cdG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuXHRcdHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxyXG5cdFx0XHR0aGlzLmRhc2hib2FyZFNlcnZpY2UuZ2V0Y2hhbmdlUGl2b3QoKS5zdWJzY3JpYmUoKHVwZGF0ZWQpID0+IHtcclxuXHRcdFx0XHRpZiAodXBkYXRlZCA9PT0gdGhpcy5wb3J0bGV0Lm5ld0lkKSB7XHJcblx0XHRcdFx0XHR0aGlzLmdldERhdGEoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pXHJcblx0XHQpO1xyXG5cclxuXHRcdHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxyXG5cdFx0XHR0aGlzLmRhc2hib2FyZFNlcnZpY2UuZ2V0U3RhcnRSZWZyZXNoKCkuc3Vic2NyaWJlKChkYXNoYm9hcmRJZCkgPT4ge1xyXG5cdFx0XHRcdGlmIChkYXNoYm9hcmRJZCA9PT0gdGhpcy5kYXNoYm9hcmQuaWQpIHtcclxuXHRcdFx0XHRcdHRoaXMucGFnZUxvYWRpbmcgPSB0cnVlO1xyXG5cdFx0XHRcdFx0dGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KVxyXG5cdFx0KTtcclxuXHJcblx0XHR0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcclxuXHRcdFx0dGhpcy5kYXNoYm9hcmRTZXJ2aWNlLmdldFVwZGF0ZWQoKS5zdWJzY3JpYmUoKG5ld0lkKSA9PiB7XHJcblx0XHRcdFx0aWYgKG5ld0lkID09PSB0aGlzLnBvcnRsZXQubmV3SWQgfHwgbmV3SWQgPT09IHRoaXMucG9ydGxldC5pZCkge1xyXG5cdFx0XHRcdFx0dGhpcy5nZXREYXRhKCk7XHJcblx0XHRcdFx0XHRpZiAodGhpcy5waXZvdE9iaikgdGhpcy5waXZvdE9iai5yZWZyZXNoRGF0YSgpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSlcclxuXHRcdCk7XHJcblxyXG5cdFx0dGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXHJcblx0XHRcdHRoaXMuZGFzaGJvYXJkU2VydmljZS5nZXRSZWZyZXNoR2FkZ2V0KCkuc3Vic2NyaWJlKChlKSA9PiB7XHJcblx0XHRcdFx0aWYgKCFlKSB7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGNvbnN0IGlkID0gZVtcIm5ld0lkXCJdO1xyXG5cdFx0XHRcdGlmIChpZCA9PT0gdGhpcy5wb3J0bGV0Lm5ld0lkIHx8IGlkID09PSB0aGlzLnBvcnRsZXQuaWQpIHtcclxuXHRcdFx0XHRcdHRoaXMucGFnZUxvYWRpbmcgPSBmYWxzZTtcclxuXHRcdFx0XHRcdHRoaXMuZ2V0RGF0YSgpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSlcclxuXHRcdCk7XHJcblxyXG5cdFx0dGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXHJcblx0XHRcdHRoaXMuZGFzaGJvYXJkU2VydmljZS5nZXRUYWJsZUZvcm1hdCgpLnN1YnNjcmliZSgodXBkYXRlZCkgPT4ge1xyXG5cdFx0XHRcdGlmICh1cGRhdGVkID09PSB0aGlzLnBvcnRsZXQubmV3SWQpIHtcclxuXHRcdFx0XHRcdHRoaXMuZ2V0RGF0YSgpO1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMucGl2b3RPYmopIHRoaXMucGl2b3RPYmoucmVmcmVzaERhdGEoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pXHJcblx0XHQpO1xyXG5cclxuXHRcdHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxyXG5cdFx0XHR0aGlzLmRhc2hib2FyZFNlcnZpY2VcclxuXHRcdFx0XHQuY2xlYXJGaWVsZExpc3RPYnNlcnZhYmxlKClcclxuXHRcdFx0XHQuc3Vic2NyaWJlKCh1cGRhdGVkKSA9PiB7XHJcblx0XHRcdFx0XHRpZiAodXBkYXRlZCA9PT0gdGhpcy5wb3J0bGV0Lm5ld0lkKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMucGl2b3RPYmouZGF0YVNvdXJjZVNldHRpbmdzLmRhdGFTb3VyY2UgPSBbXTtcclxuXHRcdFx0XHRcdFx0aWYgKHRoaXMucGl2b3RPYmopIHRoaXMucGl2b3RPYmoucmVmcmVzaERhdGEoKTtcclxuXHRcdFx0XHRcdFx0aWYgKHRoaXMuZmllbGRsaXN0T2JqKVxyXG5cdFx0XHRcdFx0XHRcdHRoaXMuZmllbGRsaXN0T2JqLnVwZGF0ZURhdGFTb3VyY2UoKTtcclxuXHRcdFx0XHRcdFx0dGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XHJcblx0XHRcdFx0XHRcdHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KVxyXG5cdFx0KTtcclxuXHJcblx0XHQvLyB0aXRsZSBjaGFuZ2VcclxuXHRcdHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxyXG5cdFx0XHR0aGlzLmRhc2hib2FyZFNlcnZpY2UudXBkYXRlUG9ydGxldFRpdGxlKCkuc3Vic2NyaWJlKCh1cGRhdGVkKSA9PiB7XHJcblx0XHRcdFx0aWYgKHVwZGF0ZWQpIHtcclxuXHRcdFx0XHRcdHRoaXMuY29uZmlnID0gSlNPTi5wYXJzZSh0aGlzLnBvcnRsZXQuY29uZmlnKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0bmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcblx0XHR0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaCgoc3ViKSA9PiBzdWIudW5zdWJzY3JpYmUoKSk7XHJcblx0fVxyXG5cclxuXHRvbk1lbWJlckVkaXRvck9wZW4oYXJnczogYW55KTogdm9pZCB7XHJcblx0XHQvLyDkvaDlj6/ku6XlnKjov5nph4zmoLnmja7pnIDopoHkv67mlLlhcmdz5p2l6Ieq5a6a5LmJ6L+H5ruk56qX5Y+j55qE6KGM5Li6XHJcblx0XHQvLyAxMTI0NyDkuJPpl6jkuLppdGVtIGRhdGEgdHlwZeiAjOiuvue9rlxyXG5cdFx0aWYgKGFyZ3MuZmllbGROYW1lID09PSBcIkFjY291bnRUeXBlQ29kZVwiKSB7XHJcblx0XHRcdGxldCByZXMgPSBuZXcgQXJyYXkoNSkuZmlsbChudWxsKTtcclxuXHRcdFx0Y29uc3QgZmllbGRNZW1iZXJzID0gWy4uLmFyZ3MuZmllbGRNZW1iZXJzXTtcclxuXHJcblx0XHRcdGZvciAobGV0IGkgPSBmaWVsZE1lbWJlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuXHRcdFx0XHRsZXQgaW5kZXggPSAtMTtcclxuXHRcdFx0XHRjb25zdCBpdGVtID0gdGhpcy5pdGVtRGF0YVR5cGVTb3J0QXJyLmZpbmQoKG5hbWUsIGluZCkgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKGZpZWxkTWVtYmVyc1tpXS5hY3R1YWxUZXh0ID09PSBuYW1lKSB7XHJcblx0XHRcdFx0XHRcdGluZGV4ID0gaW5kO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0cmV0dXJuIGZpZWxkTWVtYmVyc1tpXS5hY3R1YWxUZXh0ID09PSBuYW1lO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHRcdGlmICghaXRlbSkge1xyXG5cdFx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGNvbnN0IGZpbGxJdGVtID0gZmllbGRNZW1iZXJzLnNwbGljZShpLCAxKTtcclxuXHRcdFx0XHRyZXNbaW5kZXhdID0gZmlsbEl0ZW1bMF07XHJcblx0XHRcdH1cclxuXHRcdFx0cmVzID0gcmVzLmZpbHRlcigoaXRlbSkgPT4gaXRlbSkgfHwgW107XHJcblx0XHRcdGFyZ3MuZmllbGRNZW1iZXJzID0gWy4uLnJlcywgLi4uZmllbGRNZW1iZXJzXTtcclxuXHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgZWxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5lLW1lbWJlci1lZGl0b3ItZGlhbG9nXCIpO1xyXG5cdFx0XHRcdGlmIChlbGUpIHtcclxuXHRcdFx0XHRcdGVsZS5xdWVyeVNlbGVjdG9yKFwiLmUtZmlsdGVyLXNvcnRcIikuc2V0QXR0cmlidXRlKFxyXG5cdFx0XHRcdFx0XHRcInN0eWxlXCIsXHJcblx0XHRcdFx0XHRcdFwiZGlzcGxheTogbm9uZVwiXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIHNldEdyaWRTZXR0aW5ncygpIHtcclxuXHRcdHRoaXMuZ3JpZFNldHRpbmdzID0ge1xyXG5cdFx0XHRjb2x1bW5XaWR0aDogMTQwLFxyXG5cdFx0XHRyb3dIZWlnaHQ6IDQwLFxyXG5cdFx0XHRhbGxvd1NlbGVjdGlvbjogdHJ1ZSxcclxuXHRcdFx0c2VsZWN0aW9uU2V0dGluZ3M6IHtcclxuXHRcdFx0XHRtb2RlOiBcIkNlbGxcIixcclxuXHRcdFx0XHR0eXBlOiBcIk11bHRpcGxlXCIsXHJcblx0XHRcdFx0Y2VsbFNlbGVjdGlvbk1vZGU6IFwiQm94XCIsXHJcblx0XHRcdH0sXHJcblx0XHRcdGNvbHVtblJlbmRlcjogdGhpcy5vYnNlcnZhYmxlLnN1YnNjcmliZSgoYXJncykgPT4ge1xyXG5cdFx0XHRcdHRoaXMuc2V0Q29sdW1uc1JlbmRlcihhcmdzKTtcclxuXHRcdFx0fSkgYXMgYW55LFxyXG5cdFx0XHQvLyDljYfnuqflkI4g6buY6K6k5Lya5pyJ5a+85Ye65qC35byP6KaG55uW77yM6ZyA6KaB5omL5Yqo6K6+572u5a+85Ye65qCH6aKY5qC35byPXHJcblx0XHRcdGV4Y2VsSGVhZGVyUXVlcnlDZWxsSW5mbzogdGhpcy5vYnNlcnZhYmxlLnN1YnNjcmliZSgoYXJnczogYW55KSA9PiB7XHJcblx0XHRcdFx0Ly8gYXJncy5zdHlsZeaYr+S4qkV4Y2VsU3R5bGXnsbvlnotcclxuXHRcdFx0XHRhcmdzLnN0eWxlID0ge1xyXG5cdFx0XHRcdFx0Ym9sZDogdHJ1ZSwgLy8g5a2X5L2T5Yqg57KXXHJcblx0XHRcdFx0XHR2QWxpZ246IFwiQ2VudGVyXCIsXHJcblx0XHRcdFx0XHR3cmFwVGV4dDogZmFsc2UsIC8vIOS4jeaNouihjFxyXG5cdFx0XHRcdFx0aW5kZW50OiAwLFxyXG5cdFx0XHRcdFx0Ym9yZGVyczogbnVsbCwgLy8g5LiN6ZyA6KaBYm9yZGVyXHJcblx0XHRcdFx0fTtcclxuXHRcdFx0fSkgYXMgYW55LFxyXG5cdFx0XHQvLyDljYfnuqflkI4g6buY6K6k5Lya5pyJ5a+85Ye65qC35byP6KaG55uW77yM6ZyA6KaB5omL5Yqo6K6+572u5a+85Ye65YaF5a655qC35byPXHJcblx0XHRcdGV4Y2VsUXVlcnlDZWxsSW5mbzogdGhpcy5vYnNlcnZhYmxlLnN1YnNjcmliZSgoYXJnczogYW55KSA9PiB7XHJcblx0XHRcdFx0Ly8gI2Y0ODZjZmZmIOi/memHjOi+k+WHuueahOaYr1JHQkEg6aKc6Imy5qC85byP77yMIHhsc3jph4zkuI3pnIDopoHpgI/mmI7luqYs5Y675o6J5bC+6YOoZmZcclxuXHRcdFx0XHRpZiAoYXJncy5zdHlsZSAmJiBhcmdzLnN0eWxlLmJhY2tDb2xvcikge1xyXG5cdFx0XHRcdFx0YXJncy5zdHlsZS5iYWNrQ29sb3IgPSBhcmdzLnN0eWxlLmJhY2tDb2xvci5zdWJzdHJpbmcoMCwgNyk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGxldCBfc3R5bGU6IGFueSA9IHtcclxuXHRcdFx0XHRcdGJvbGQ6IGZhbHNlLFxyXG5cdFx0XHRcdFx0d3JhcFRleHQ6IGZhbHNlLFxyXG5cdFx0XHRcdFx0Ym9yZGVyczogbnVsbCxcclxuXHRcdFx0XHRcdGZvbnRDb2xvcjogYXJncy5zdHlsZS5mb250Q29sb3IsXHJcblx0XHRcdFx0XHRiYWNrQ29sb3I6IGFyZ3Muc3R5bGUuYmFja0NvbG9yLFxyXG5cdFx0XHRcdH07XHJcblx0XHRcdFx0bGV0IGNvbEluZGV4ID0gYXJncy5jZWxsLmNvbEluZGV4O1xyXG5cdFx0XHRcdGxldCByb3dJbmRleCA9IGFyZ3MuY2VsbC5yb3dJbmRleDtcclxuXHRcdFx0XHRpZiAodGhpcy5jb25maWcuc2hvd0dyYW5kVG90YWxzKSB7XHJcblx0XHRcdFx0XHQvLyBHcmFuZFRvdGFs5LiN6ZyA6KaB6aKc6ImyXHJcblx0XHRcdFx0XHRpZiAoYXJncy5kYXRhLmxlbmd0aCA9PT0gcm93SW5kZXggKyAxKSB7XHJcblx0XHRcdFx0XHRcdGRlbGV0ZSBfc3R5bGUuZm9udENvbG9yO1xyXG5cdFx0XHRcdFx0XHRkZWxldGUgX3N0eWxlLmJhY2tDb2xvcjtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKGFyZ3MuZGF0YVtyb3dJbmRleF1bY29sSW5kZXhdLmZvcm1hdHRlZFRleHQgPT0gXCJcIikge1xyXG5cdFx0XHRcdFx0YXJncy52YWx1ZSA9IFwiXCI7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGFyZ3Muc3R5bGUgPSBPYmplY3QuYXNzaWduKGFyZ3Muc3R5bGUsIF9zdHlsZSk7XHJcblx0XHRcdFx0aWYgKGFyZ3MudmFsdWUgPT09IFwiXCIgJiYgYXJncy5zdHlsZS5udW1iZXJGb3JtYXQpIHtcclxuXHRcdFx0XHRcdGFyZ3Muc3R5bGUubnVtYmVyRm9ybWF0ID0gbnVsbDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKHRoaXMuZm9ybWF0RGF0ZXMgJiYgdGhpcy5mb3JtYXREYXRlcy5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdGxldCBkYXRlRmllbGRzID0gdGhpcy5mb3JtYXREYXRlcy5tYXAoKGVsKSA9PiB7XHJcblx0XHRcdFx0XHRcdHJldHVybiBlbC5uYW1lO1xyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdChhcmdzIGFzIGFueSkudmFsdWUgJiZcclxuXHRcdFx0XHRcdFx0KChhcmdzIGFzIGFueSkuY2VsbC5jb2xJbmRleCA9PT0gMFxyXG5cdFx0XHRcdFx0XHRcdD8gZGF0ZUZpZWxkcy5pbmNsdWRlcyhcclxuXHRcdFx0XHRcdFx0XHRcdFx0KGFyZ3MgYXMgYW55KS5jZWxsLnZhbHVlU29ydC5heGlzXHJcblx0XHRcdFx0XHRcdFx0ICApXHJcblx0XHRcdFx0XHRcdFx0OiBkYXRlRmllbGRzLmluY2x1ZGVzKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHQoYXJncyBhcyBhbnkpLmNlbGwuYWN0dWFsVGV4dFxyXG5cdFx0XHRcdFx0XHRcdCAgKSlcclxuXHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHQvL0N1c3RvbWl6ZSB0aGUgUm93IGhlYWRlcnMvQ29sdW1uIGhlYWRlcnMgYmFzZWQgb24geW91ciBuZWVkc1xyXG5cdFx0XHRcdFx0XHRsZXQgaGVhZGVycztcclxuXHRcdFx0XHRcdFx0aWYgKChhcmdzIGFzIGFueSkuY2VsbC5jb2xJbmRleCA9PT0gMCkge1xyXG5cdFx0XHRcdFx0XHRcdGhlYWRlcnMgPSAoYXJncyBhcyBhbnkpLmNlbGwuYWN0dWFsVGV4dDtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHQvLyBoZWFkZXJzID0gcGl2b3RWYWx1ZXNba11bal0uZm9ybWF0dGVkVGV4dDtcclxuXHRcdFx0XHRcdFx0XHRoZWFkZXJzID0gKGFyZ3MgYXMgYW55KS52YWx1ZTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRpZiAoaGVhZGVycykge1xyXG5cdFx0XHRcdFx0XHRcdGxldCBkYXRlID0gbmV3IERhdGUoaGVhZGVycyk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGxldCBxdWFydGVyID0gTWF0aC5mbG9vcihkYXRlLmdldE1vbnRoKCkgLyAzKSArIDE7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGxldCBmb3JtYXQ7XHJcblxyXG5cdFx0XHRcdFx0XHRcdHRoaXMuZm9ybWF0RGF0ZXMubWFwKChlbCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKChhcmdzIGFzIGFueSkuY2VsbC5jb2xJbmRleCA9PSAwKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRlbC5uYW1lID09XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0KGFyZ3MgYXMgYW55KS5jZWxsLnZhbHVlU29ydC5heGlzXHJcblx0XHRcdFx0XHRcdFx0XHRcdClcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmb3JtYXQgPSBlbC5mb3JtYXQ7XHJcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZWwubmFtZSA9PSAoYXJncyBhcyBhbnkpLmNlbGwuYWN0dWFsVGV4dFxyXG5cdFx0XHRcdFx0XHRcdFx0XHQpXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9ybWF0ID0gZWwuZm9ybWF0O1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdChhcmdzIGFzIGFueSkudmFsdWUgPSB0aGlzLmdldFF1YXJ0ZXJWYWx1ZShcclxuXHRcdFx0XHRcdFx0XHRcdGZvcm1hdCxcclxuXHRcdFx0XHRcdFx0XHRcdGRhdGUsXHJcblx0XHRcdFx0XHRcdFx0XHRxdWFydGVyXHJcblx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSkgYXMgYW55LFxyXG5cdFx0fSBhcyBHcmlkU2V0dGluZ3M7XHJcblx0fVxyXG5cclxuXHRiZWZvcmVFeHBvcnQoZXhwb3J0RGF0YSkge1xyXG5cdFx0aWYgKGV4cG9ydERhdGEpIHtcclxuXHRcdFx0Y29uc3Qga2V5TWFwID0ge307XHJcblx0XHRcdHRoaXMuZGF0YVNvdXJjZVNldHRpbmdzLmZvcm1hdFNldHRpbmdzLmZvckVhY2goKGRhdGEpID0+IHtcclxuXHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRkYXRhLmZvcm1hdCA9PT0gXCIjLCMjIywsLjA7KCMsIyMjLCwuMClcIiB8fFxyXG5cdFx0XHRcdFx0ZGF0YS5mb3JtYXQgPT09IFwiIywjIyMsLDsoIywjIyMsLClcIiB8fFxyXG5cdFx0XHRcdFx0ZGF0YS5mb3JtYXQgPT09IFwiIywjIyMsLC4wMDsoIywjIyMsLC4wMClcIlxyXG5cdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0a2V5TWFwW2RhdGEubmFtZV0gPSB0cnVlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHRleHBvcnREYXRhLmRhdGFDb2xsZWN0aW9ucyAmJlxyXG5cdFx0XHRcdGV4cG9ydERhdGEuZGF0YUNvbGxlY3Rpb25zLmxlbmd0aFxyXG5cdFx0XHQpIHtcclxuXHRcdFx0XHRleHBvcnREYXRhLmRhdGFDb2xsZWN0aW9uc1swXS5mb3JFYWNoKChyb3cpID0+IHtcclxuXHRcdFx0XHRcdHJvdy5mb3JFYWNoKChjZWxsKSA9PiB7XHJcblx0XHRcdFx0XHRcdGlmIChrZXlNYXBbY2VsbC5hY3R1YWxUZXh0XSkge1xyXG5cdFx0XHRcdFx0XHRcdGNlbGwudmFsdWUgPSBjZWxsLmFjdHVhbFZhbHVlO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdFx0dHlwZW9mIGNlbGwudmFsdWUgPT09IFwib2JqZWN0XCIgJiZcclxuXHRcdFx0XHRcdFx0XHR0eXBlb2YgY2VsbC5mb3JtYXR0ZWRUZXh0ID09PSBcInN0cmluZ1wiXHJcblx0XHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRcdGNlbGwudmFsdWUgPSBjZWxsLmZvcm1hdHRlZFRleHQ7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGFzeW5jIGdldERhdGEoKSB7XHJcblx0XHR0aGlzLnBhZ2VMb2FkaW5nID0gZmFsc2U7XHJcblx0XHRsZXQgY29sdW1ucyA9IFtdO1xyXG5cdFx0bGV0IHZhbHVlcyA9IFtdO1xyXG5cdFx0bGV0IGZvcm1hdFNldHRpbmdzID0gW107XHJcblx0XHRsZXQgcm93cyA9IFtdO1xyXG5cdFx0bGV0IGZpZWxkTWFwcGluZyA9IFtdO1xyXG5cdFx0Ly8g5riF56m6Z3JhbmRUb3RhbHPlkoxzdWJUb3RhbHNcclxuXHRcdHRoaXMuZ3JhbmRUb3RhbHMgPSB7fTtcclxuXHRcdHRoaXMuc3ViVG90YWxzID0ge307XHJcblx0XHR0aGlzLmNvbmZpZyA9IEpTT04ucGFyc2UodGhpcy5wb3J0bGV0LmNvbmZpZyk7XHJcblx0XHR0aGlzLnNldEdyaWRTZXR0aW5ncygpO1xyXG5cdFx0aWYgKHRoaXMuY29uZmlnLmZpZWxkcykge1xyXG5cdFx0XHRpZiAodGhpcy5kYXNoYm9hcmRQb3JsZXRzU2VydmljZS5hbGxGaWVsZHNPYmpbdGhpcy5wb3J0bGV0LmlkXSkge1xyXG5cdFx0XHRcdHRoaXMuY29uZmlnRmllbGRzID1cclxuXHRcdFx0XHRcdHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2Uuc2V0Q29uZmlnRmllbGRzKFxyXG5cdFx0XHRcdFx0XHR0aGlzLmRhc2hib2FyZFBvcmxldHNTZXJ2aWNlLmFsbEZpZWxkc09ialtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLnBvcnRsZXQuaWRcclxuXHRcdFx0XHRcdFx0XSxcclxuXHRcdFx0XHRcdFx0dGhpcy5jb25maWcuZmllbGRzXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHRoaXMuY29uZmlnRmllbGRzID0gWy4uLnRoaXMuY29uZmlnLmZpZWxkc107XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLlBpdm90X0RhdGEgPSB0aGlzLmRhc2hib2FyZFBvcmxldHNTZXJ2aWNlLmdldFJlc3VsdEJ5RGF0YVRhYmxlKFxyXG5cdFx0XHR0aGlzLnBvcnRsZXQsXHJcblx0XHRcdGZhbHNlLFxyXG5cdFx0XHRmYWxzZSxcclxuXHRcdFx0dGhpcy5kYXNoYm9hcmQuaWRcclxuXHRcdCk7XHJcblxyXG5cdFx0dGhpcy5vcmRlckJ5Q29sdW1ucyA9IHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UuZ2V0T3JkZXJCeUNvbHVtbnNOZXcoXHJcblx0XHRcdHRoaXMucG9ydGxldC5maWd1cmVDb2RlLFxyXG5cdFx0XHR0aGlzLmRhc2hib2FyZFxyXG5cdFx0KTtcclxuXHJcblx0XHR0aGlzLlBpdm90X0RhdGEgPSBEYXRhVXRpbC5wYXJzZS5wYXJzZUpzb24odGhpcy5QaXZvdF9EYXRhKTtcclxuXHRcdGlmICh0aGlzLlBpdm90X0RhdGEgJiYgdGhpcy5QaXZvdF9EYXRhLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0Ly8g56e76Zmk5YiX5ZCN5ZKM5pWw5o2ua2V55LiN5Yy56YWN55qE6aG5XHJcblx0XHRcdHRoaXMuZ2V0ZXhjbHVkZUZpZWxkcyh0aGlzLmNvbmZpZ0ZpZWxkcywgdGhpcy5QaXZvdF9EYXRhWzBdKTtcclxuXHRcdFx0aWYgKCF0aGlzLmFsbG93ZWRDYWxjdWxhdGVkRmllbGRzLmxlbmd0aCkge1xyXG5cdFx0XHRcdHRoaXMuYWxsb3dlZENhbGN1bGF0ZWRGaWVsZHMgPSBPYmplY3Qua2V5cyh0aGlzLlBpdm90X0RhdGFbMF0pO1xyXG5cdFx0XHR9XHJcblx0XHRcdGZvciAobGV0IGl0ZW0gb2YgdGhpcy5jb25maWdGaWVsZHMpIHtcclxuXHRcdFx0XHQvLyDlrZfmrrXliIbnu4QgaHR0cHM6Ly9lajIuc3luY2Z1c2lvbi5jb20vYW5ndWxhci9kb2N1bWVudGF0aW9uL3Bpdm90dmlldy9maWVsZC1saXN0P3NlYXJjaD1maWVsZE1hcHBpbmcjZ3JvdXAtZmllbGRzLXVuZGVyLWRlc2lyZWQtZm9sZGVyLW5hbWVcclxuXHRcdFx0XHRmaWVsZE1hcHBpbmcucHVzaCh7XHJcblx0XHRcdFx0XHRuYW1lOiBpdGVtLmNvbE5hbWUsXHJcblx0XHRcdFx0XHRjYXB0aW9uOiBpdGVtLmFkZHRpb25OYW1lXHJcblx0XHRcdFx0XHRcdD8gYCR7aXRlbS5sYW5nVmFsdWV9ICR7aXRlbS5hZGR0aW9uTmFtZX1gXHJcblx0XHRcdFx0XHRcdDogaXRlbS5sYW5nVmFsdWVcclxuXHRcdFx0XHRcdFx0PyBpdGVtLmxhbmdWYWx1ZVxyXG5cdFx0XHRcdFx0XHQ6IHRoaXMudHJhbnNsYXRpb25baXRlbS5sYW5nQ29kZV0gfHwgaXRlbS5sYW5nQ29kZSxcclxuXHJcblx0XHRcdFx0XHRkYXRhVHlwZTogaXRlbS5kYXRhVHlwZSxcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0aWYgKHRoaXMuY29uZmlnRmllbGRzKSB7XHJcblx0XHRcdHRoaXMucGVyY2VudE51bUZpZWxkcyA9IFtdO1xyXG5cdFx0XHR0aGlzLmZvcm1hdERhdGVzID0gW107XHJcblx0XHRcdHRoaXMuemVyb0Zvcm1hdERhdGEuaGdMaXN0ID0gW107XHJcblx0XHRcdHRoaXMuemVyb0Zvcm1hdERhdGEuZW1wdHlMaXN0ID0gW107XHJcblx0XHRcdHRoaXMubWlsbGlvbkZpZWxkcyA9IFtdO1xyXG5cdFx0XHR0aGlzLmNvbmZpZ0ZpZWxkcy5tYXAoKGVsKSA9PiB7XHJcblx0XHRcdFx0Ly8gU01QMi0yNDg2ICYgcGVyY2VudE51beeahGZvcm1hdOmXrumimFxyXG5cdFx0XHRcdGlmIChlbC5kYXRhVHlwZSA9PSBcInBlcmNlbnROdW1cIikge1xyXG5cdFx0XHRcdFx0dGhpcy5wZXJjZW50TnVtRmllbGRzLnB1c2goZWwuY29sTmFtZSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdGVsLmZvcm1hdCAmJlxyXG5cdFx0XHRcdFx0ZWwuZm9ybWF0Lmxlbmd0aCAmJlxyXG5cdFx0XHRcdFx0ZWwuZm9ybWF0WzBdLmZvcm1hdENoZWNrZWQgJiZcclxuXHRcdFx0XHRcdFsyLCA1LCA4LCAxMSwgMTQsIDE3XS5pbmNsdWRlcyhlbC5mb3JtYXRbMF0uc2VsZWN0ZWRGb3JtYXQpXHJcblx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0dGhpcy56ZXJvRm9ybWF0RGF0YS5oZ0xpc3QucHVzaChlbC5jb2xOYW1lKTtcclxuXHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRlbC5mb3JtYXQgJiZcclxuXHRcdFx0XHRcdGVsLmZvcm1hdC5sZW5ndGggJiZcclxuXHRcdFx0XHRcdGVsLmZvcm1hdFswXS5mb3JtYXRDaGVja2VkICYmXHJcblx0XHRcdFx0XHRbMywgNiwgOSwgMTIsIDE1LCAxOF0uaW5jbHVkZXMoZWwuZm9ybWF0WzBdLnNlbGVjdGVkRm9ybWF0KVxyXG5cdFx0XHRcdClcclxuXHRcdFx0XHRcdHRoaXMuemVyb0Zvcm1hdERhdGEuZW1wdHlMaXN0LnB1c2goZWwuY29sTmFtZSk7XHJcblx0XHRcdFx0Ly8gIHBpdm90VGFibGVmb3JtYXRQZXJjZW50IOeZvuWIhuavlOS5n+aciTEwLDExLDEyIOS9huaYr+Wug+aYr+aYvuekujAuMDB455qE5qC85byP77yM5omA5Lul5b6X5o6S6ZmkXHJcblx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0ZWwuZGF0YVR5cGUgIT09IFwicGVyY2VudFwiICYmXHJcblx0XHRcdFx0XHRlbC5mb3JtYXQgJiZcclxuXHRcdFx0XHRcdGVsLmZvcm1hdC5sZW5ndGggJiZcclxuXHRcdFx0XHRcdGVsLmZvcm1hdFswXS5mb3JtYXRDaGVja2VkICYmXHJcblx0XHRcdFx0XHRbMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOF0uaW5jbHVkZXMoXHJcblx0XHRcdFx0XHRcdGVsLmZvcm1hdFswXS5zZWxlY3RlZEZvcm1hdFxyXG5cdFx0XHRcdFx0KVxyXG5cdFx0XHRcdClcclxuXHRcdFx0XHRcdHRoaXMubWlsbGlvbkZpZWxkcy5wdXNoKGVsLmNvbE5hbWUpO1xyXG5cdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdGVsLmRhdGFUeXBlID09PSBcIm51bWJlclwiICYmXHJcblx0XHRcdFx0XHQoIWVsLmZvcm1hdCB8fFxyXG5cdFx0XHRcdFx0XHQoZWwuZm9ybWF0ICYmXHJcblx0XHRcdFx0XHRcdFx0ZWwuZm9ybWF0Lmxlbmd0aCAmJlxyXG5cdFx0XHRcdFx0XHRcdCFlbC5mb3JtYXRbMF0uZm9ybWF0Q2hlY2tlZCkpXHJcblx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRjb25zdCBmb3JtYXREYXRhID0ge1xyXG5cdFx0XHRcdFx0XHRuYW1lOiBlbC5jb2xOYW1lLFxyXG5cdFx0XHRcdFx0XHQvL1NNUDItMzAyNiBhbmQgU01QMi0zMDU5XHJcblx0XHRcdFx0XHRcdGZvcm1hdDpcclxuXHRcdFx0XHRcdFx0XHRlbC5jb2xOYW1lICE9PSBcIlBvcnRJbnZTdGtcIiAmJlxyXG5cdFx0XHRcdFx0XHRcdGVsLmNvbE5hbWUgIT09IFwiUG9ydEZkSW52U3RrXCJcclxuXHRcdFx0XHRcdFx0XHRcdD8gdGhpcy5kYXNoYm9hcmRQb3JsZXRzU2VydmljZS5mb3JtYXROdW1iZXIoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZWwuZHBcclxuXHRcdFx0XHRcdFx0XHRcdCAgKVxyXG5cdFx0XHRcdFx0XHRcdFx0OiBcIiMjMC4jIyMjIyMjMFwiLFxyXG5cdFx0XHRcdFx0XHR1c2VHcm91cGluZzogdHJ1ZSxcclxuXHRcdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdFx0Zm9ybWF0U2V0dGluZ3MucHVzaChmb3JtYXREYXRhKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0KGVsLmRhdGFUeXBlID09PSBcInBlcmNlbnRcIiB8fFxyXG5cdFx0XHRcdFx0XHRlbC5kYXRhVHlwZSA9PT0gXCJwZXJjZW50TnVtXCIpICYmXHJcblx0XHRcdFx0XHQoIWVsLmZvcm1hdCB8fFxyXG5cdFx0XHRcdFx0XHQoZWwuZm9ybWF0ICYmXHJcblx0XHRcdFx0XHRcdFx0ZWwuZm9ybWF0Lmxlbmd0aCAmJlxyXG5cdFx0XHRcdFx0XHRcdCFlbC5mb3JtYXRbMF0uZm9ybWF0Q2hlY2tlZCkpXHJcblx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRjb25zdCBmb3JtYXREYXRhID0ge1xyXG5cdFx0XHRcdFx0XHRuYW1lOiBlbC5jb2xOYW1lLFxyXG5cdFx0XHRcdFx0XHRmb3JtYXQ6IHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UuZm9ybWF0UGVyY2VudChcclxuXHRcdFx0XHRcdFx0XHRlbC5kcFxyXG5cdFx0XHRcdFx0XHQpLFxyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdGZvcm1hdFNldHRpbmdzLnB1c2goZm9ybWF0RGF0YSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdGVsLmRhdGFUeXBlID09PSBcIm11bHRpcGxlXCIgJiZcclxuXHRcdFx0XHRcdCghZWwuZm9ybWF0IHx8XHJcblx0XHRcdFx0XHRcdChlbC5mb3JtYXQgJiZcclxuXHRcdFx0XHRcdFx0XHRlbC5mb3JtYXQubGVuZ3RoICYmXHJcblx0XHRcdFx0XHRcdFx0IWVsLmZvcm1hdFswXS5mb3JtYXRDaGVja2VkKSlcclxuXHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdGNvbnN0IGZvcm1hdERhdGEgPSB7XHJcblx0XHRcdFx0XHRcdG5hbWU6IGVsLmNvbE5hbWUsXHJcblx0XHRcdFx0XHRcdGZvcm1hdDogdGhpcy5kYXNoYm9hcmRQb3JsZXRzU2VydmljZS5mb3JtYXRNdWx0aXBsZShcclxuXHRcdFx0XHRcdFx0XHRlbC5kcFxyXG5cdFx0XHRcdFx0XHQpLFxyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdGZvcm1hdFNldHRpbmdzLnB1c2goZm9ybWF0RGF0YSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmIChlbC5kYXRhVHlwZSA9PT0gXCJkYXRldGltZVwiIHx8IGVsLmRhdGFUeXBlID09PSBcImRhdGVcIikge1xyXG5cdFx0XHRcdFx0bGV0IGZvcm1hdCA9IFwiXCI7XHJcblx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdGVsLmZvcm1hdCAmJlxyXG5cdFx0XHRcdFx0XHRlbC5mb3JtYXQubGVuZ3RoICYmXHJcblx0XHRcdFx0XHRcdGVsLmZvcm1hdFswXS5mb3JtYXRDaGVja2VkXHJcblx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0aWYgKGVsLmZvcm1hdFswXS5kYXRlVHlwZSA9PSBcIlF1YXJ0ZXJcIikge1xyXG5cdFx0XHRcdFx0XHRcdGxldCBmb3JtYXRfID0gZWwuZm9ybWF0WzBdLnNlbGVjdGVkRm9ybWF0RGlzcGxheTtcclxuXHRcdFx0XHRcdFx0XHRsZXQgZm9ybWF0SW5mbyA9IHRoaXMucXVhcnRlckZvcm1hdC5maWx0ZXIoXHJcblx0XHRcdFx0XHRcdFx0XHQocXVyKSA9PiBxdXIudmFsdWUgPT0gZm9ybWF0X1xyXG5cdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0aWYgKGZvcm1hdEluZm8ubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRmb3JtYXQgPSBmb3JtYXRJbmZvWzBdLmZvcm1hdDtcclxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgZm9ybWF0RGF0YSA9IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0bmFtZTogZWwuY29sTmFtZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0Zm9ybWF0OiBmb3JtYXRfLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHR0eXBlOiBcImRhdGVcIixcclxuXHRcdFx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmZvcm1hdERhdGVzLnB1c2goZm9ybWF0RGF0YSk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGVsLmZvcm1hdFswXS5kYXRlVHlwZSA9PSBcIkRhdGVcIikge1xyXG5cdFx0XHRcdFx0XHRcdGxldCBmcm9tSWR4ID1cclxuXHRcdFx0XHRcdFx0XHRcdGVsLmZvcm1hdFswXS5zZWxlY3RlZEZvcm1hdERpc3BsYXkuaW5kZXhPZihcIihcIik7XHJcblx0XHRcdFx0XHRcdFx0bGV0IHRvSWR4ID1cclxuXHRcdFx0XHRcdFx0XHRcdGVsLmZvcm1hdFswXS5zZWxlY3RlZEZvcm1hdERpc3BsYXkuaW5kZXhPZihcIilcIik7XHJcblx0XHRcdFx0XHRcdFx0bGV0IGZvcm1hdF8gPVxyXG5cdFx0XHRcdFx0XHRcdFx0ZWwuZm9ybWF0WzBdLnNlbGVjdGVkRm9ybWF0RGlzcGxheS5zbGljZShcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZnJvbUlkeCArIDEsXHJcblx0XHRcdFx0XHRcdFx0XHRcdHRvSWR4XHJcblx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdHN3aXRjaCAoZm9ybWF0Xykge1xyXG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcIkREL01NL1lZWVlcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0Zm9ybWF0ID0gXCJkZC9NTS95eXl5XCI7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcIkREL01NL1lZXCI6XHJcblx0XHRcdFx0XHRcdFx0XHRcdGZvcm1hdCA9IFwiZGQvTU0veXlcIjtcclxuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0XHRjYXNlIFwiTU0vREQvWVlZWVwiOlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRmb3JtYXQgPSBcIk1NL2RkL3l5eXlcIjtcclxuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0XHRjYXNlIFwiTU0vREQvWVlcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0Zm9ybWF0ID0gXCJNTS9kZC95eVwiO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJZWVlZLU1NLUREXCI6XHJcblx0XHRcdFx0XHRcdFx0XHRcdGZvcm1hdCA9IFwieXl5eS1NTS1kZFwiO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJZWS1NTS1ERFwiOlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRmb3JtYXQgPSBcInl5LU1NLWRkXCI7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcIkRELU1NLVlZWVlcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0Zm9ybWF0ID0gXCJkZC1NTS15eXl5XCI7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcIkRELU1NLVlZXCI6XHJcblx0XHRcdFx0XHRcdFx0XHRcdGZvcm1hdCA9IFwiZGQtTU0teXlcIjtcclxuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0XHRjYXNlIFwiTU0tREQtWVlZWVwiOlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRmb3JtYXQgPSBcIk1NLWRkLXl5eXlcIjtcclxuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0XHRjYXNlIFwiTU0tREQtWVlcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0Zm9ybWF0ID0gXCJNTS1kZC15eVwiO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJNTU0gREQsIFlZWVlcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0Zm9ybWF0ID0gXCJNTU0gZGQsIHl5eXlcIjtcclxuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0XHRjYXNlIFwiREQtTU1NLVlZWVlcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0Zm9ybWF0ID0gXCJkZC1NTU0teXl5eVwiO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYgKCFmb3JtYXQpIHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgZm9ybWF0RGF0YSA9IHtcclxuXHRcdFx0XHRcdFx0XHRuYW1lOiBlbC5jb2xOYW1lLFxyXG5cdFx0XHRcdFx0XHRcdGZvcm1hdDogdGhpcy5kYXRlUGlwZUZvcm1hdCxcclxuXHRcdFx0XHRcdFx0XHR0eXBlOiBcImRhdGVcIixcclxuXHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdFx0Zm9ybWF0U2V0dGluZ3MucHVzaChmb3JtYXREYXRhKTtcclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGZvcm1hdERhdGEgPSB7XHJcblx0XHRcdFx0XHRcdFx0bmFtZTogZWwuY29sTmFtZSxcclxuXHRcdFx0XHRcdFx0XHRmb3JtYXQ6IGZvcm1hdCxcclxuXHRcdFx0XHRcdFx0XHR0eXBlOiBcImRhdGVcIixcclxuXHRcdFx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0XHRcdGZvcm1hdFNldHRpbmdzLnB1c2goZm9ybWF0RGF0YSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHRcdC8vY2FsY3VsYXRlZEZpZWxkU2V0dGluZ3MgZm9ybWF0IHB1c2ggdG8gZm9ybWF0U2V0dGluZ3NcclxuXHRcdGlmIChcclxuXHRcdFx0dGhpcy5jb25maWcuY2FsY3VsYXRlZEZpZWxkU2V0dGluZ3MgJiZcclxuXHRcdFx0dGhpcy5jb25maWcuY2FsY3VsYXRlZEZpZWxkU2V0dGluZ3MubGVuZ3RoID4gMFxyXG5cdFx0KSB7XHJcblx0XHRcdHRoaXMuY29uZmlnLmNhbGN1bGF0ZWRGaWVsZFNldHRpbmdzLm1hcCgoZWwpID0+IHtcclxuXHRcdFx0XHRpZiAoZWwuZm9ybWF0U3RyaW5nICE9PSBcIlwiKSB7XHJcblx0XHRcdFx0XHRmb3IgKGxldCBpID0gZm9ybWF0U2V0dGluZ3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuXHRcdFx0XHRcdFx0aWYgKGZvcm1hdFNldHRpbmdzW2ldLm5hbWUgPT09IGVsLm5hbWUpIHtcclxuXHRcdFx0XHRcdFx0XHRmb3JtYXRTZXR0aW5ncy5zcGxpY2UoaSwgMSk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGZvcm1hdFNldHRpbmdzLnB1c2goe1xyXG5cdFx0XHRcdFx0XHRuYW1lOiBlbC5uYW1lLFxyXG5cdFx0XHRcdFx0XHRmb3JtYXQ6IGVsLmZvcm1hdFN0cmluZyxcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0XHRsZXQgc2VyaWVzID0gdGhpcy5jb25maWcueWF4aXMuc2VyaWVzO1xyXG5cdFx0aWYgKHNlcmllcykge1xyXG5cdFx0XHRmb3IgKGxldCBpdGVtIG9mIHNlcmllcykge1xyXG5cdFx0XHRcdGNvbnN0IHZhbHVlID0ge1xyXG5cdFx0XHRcdFx0bmFtZTogaXRlbS5jb2xOYW1lLFxyXG5cdFx0XHRcdFx0Y2FwdGlvbjogdGhpcy5nZXRDYXB0aW9uQnlOYW1lKGl0ZW0uY29sTmFtZSkgfHwgaXRlbS50aXRsZSxcclxuXHRcdFx0XHRcdHR5cGU6IGl0ZW0uY2FsTWV0aG9kLFxyXG5cdFx0XHRcdH07XHJcblx0XHRcdFx0dmFsdWVzLnB1c2godmFsdWUpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRsZXQgZ3JvdXBzID0gdGhpcy5jb25maWcueGF4aXMuZ3JvdXBzO1xyXG5cdFx0aWYgKGdyb3Vwcykge1xyXG5cdFx0XHRmb3IgKGxldCBnaXRlbSBvZiBncm91cHMpIHtcclxuXHRcdFx0XHRjb25zdCBmaWVsZCA9IHRoaXMuY29uZmlnRmllbGRzLmZpbHRlcihcclxuXHRcdFx0XHRcdChlbCkgPT4gZWwuY29sTmFtZSA9PT0gZ2l0ZW0ubmFtZVxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdFx0aWYgKGZpZWxkLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdGdpdGVtLnNob3dTdWJUb3RhbHMgPSBmaWVsZFswXS5zaG93U3ViVG90YWxzO1xyXG5cdFx0XHRcdFx0Z2l0ZW0uY2FwdGlvbiA9XHJcblx0XHRcdFx0XHRcdGZpZWxkWzBdLmxhbmdWYWx1ZSB8fFxyXG5cdFx0XHRcdFx0XHR0aGlzLnRyYW5zbGF0aW9uW2ZpZWxkWzBdLmxhbmdDb2RlXSB8fFxyXG5cdFx0XHRcdFx0XHRnaXRlbS5jYXB0aW9uIHx8XHJcblx0XHRcdFx0XHRcdGZpZWxkWzBdLmxhbmdDb2RlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyb3dzLnB1c2goZ2l0ZW0pO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRpZiAodGhpcy5jb25maWcuY29sdW1uR3JvdXAgJiYgdGhpcy5jb25maWcuY29sdW1uR3JvdXAubGVuZ3RoKSB7XHJcblx0XHRcdGZvciAobGV0IGl0ZW0gb2YgdGhpcy5jb25maWcuY29sdW1uR3JvdXApIHtcclxuXHRcdFx0XHRjb25zdCBmaWVsZCA9IHRoaXMuY29uZmlnRmllbGRzLmZpbHRlcihcclxuXHRcdFx0XHRcdChlbCkgPT4gZWwuY29sTmFtZSA9PT0gaXRlbS5uYW1lXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0XHRpZiAoZmllbGQubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdFx0aXRlbS5zaG93U3ViVG90YWxzID0gZmllbGRbMF0uc2hvd1N1YlRvdGFscztcclxuXHRcdFx0XHRcdGl0ZW0uY2FwdGlvbiA9XHJcblx0XHRcdFx0XHRcdGZpZWxkWzBdLmxhbmdWYWx1ZSB8fFxyXG5cdFx0XHRcdFx0XHR0aGlzLnRyYW5zbGF0aW9uW2ZpZWxkWzBdLmxhbmdDb2RlXSB8fFxyXG5cdFx0XHRcdFx0XHRmaWVsZFswXS5sYW5nQ29kZSB8fFxyXG5cdFx0XHRcdFx0XHRpdGVtLmNhcHRpb247XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGNvbHVtbnMucHVzaChpdGVtKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0bGV0IGNvbmRpdGlvbmFsRm9ybWF0U2V0dGluZ3MgPSBbXTtcclxuXHRcdHRoaXMuY29uZmlnRmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XHJcblx0XHRcdGlmIChmaWVsZC5mb3JtYXQgJiYgZmllbGQuZm9ybWF0Lmxlbmd0aCkge1xyXG5cdFx0XHRcdGlmIChmaWVsZC5mb3JtYXRbMF0uZm9udFNldHRpbmdDaGVja2VkKSB7XHJcblx0XHRcdFx0XHRsZXQgY29uZGl0aW9uYWxGb3JtYXRPYmogPSB7XHJcblx0XHRcdFx0XHRcdGFwcGx5R3JhbmRUb3RhbHM6IHRydWUsXHJcblx0XHRcdFx0XHRcdG1lYXN1cmU6IFwiXCIsXHJcblx0XHRcdFx0XHRcdHZhbHVlMTogbnVsbCxcclxuXHRcdFx0XHRcdFx0dmFsdWUyOiBudWxsLFxyXG5cdFx0XHRcdFx0XHRjb25kaXRpb25zOiBcIlwiLFxyXG5cdFx0XHRcdFx0XHRzdHlsZToge1xyXG5cdFx0XHRcdFx0XHRcdGJhY2tncm91bmRDb2xvcjogXCJcIixcclxuXHRcdFx0XHRcdFx0XHRjb2xvcjogXCJcIixcclxuXHRcdFx0XHRcdFx0XHRmb250RmFtaWx5OiBcIlwiLFxyXG5cdFx0XHRcdFx0XHRcdGZvbnRTaXplOiBcIlwiLFxyXG5cdFx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdGxldCBuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmogPSB7XHJcblx0XHRcdFx0XHRcdGFwcGx5R3JhbmRUb3RhbHM6IHRydWUsXHJcblx0XHRcdFx0XHRcdG1lYXN1cmU6IFwiXCIsXHJcblx0XHRcdFx0XHRcdHZhbHVlMTogbnVsbCxcclxuXHRcdFx0XHRcdFx0dmFsdWUyOiBudWxsLFxyXG5cdFx0XHRcdFx0XHRjb25kaXRpb25zOiBcIlwiLFxyXG5cdFx0XHRcdFx0XHRzdHlsZToge1xyXG5cdFx0XHRcdFx0XHRcdGJhY2tncm91bmRDb2xvcjogXCJcIixcclxuXHRcdFx0XHRcdFx0XHRjb2xvcjogXCJcIixcclxuXHRcdFx0XHRcdFx0XHRmb250RmFtaWx5OiBcIlwiLFxyXG5cdFx0XHRcdFx0XHRcdGZvbnRTaXplOiBcIlwiLFxyXG5cdFx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdC8vIGZvbnQgc2V0dGluZyBzdGFydFxyXG5cdFx0XHRcdFx0bmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqLm1lYXN1cmUgPVxyXG5cdFx0XHRcdFx0XHRmaWVsZC5mb3JtYXRbMF0uc2VsZWN0ZWRGaWVsZDtcclxuXHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLm1lYXN1cmUgPVxyXG5cdFx0XHRcdFx0XHRmaWVsZC5mb3JtYXRbMF0uc2VsZWN0ZWRGaWVsZDtcclxuXHJcblx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdGZpZWxkLmZvcm1hdFswXS5mb3JtYXRDaGVja2VkICYmXHJcblx0XHRcdFx0XHRcdGZpZWxkLmZvcm1hdFswXS5jb21wYXJlU2VsZWN0XHJcblx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5zZXRDb21wYXJlQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdFx0bmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqLFxyXG5cdFx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLFxyXG5cdFx0XHRcdFx0XHRcdGZpZWxkLmZvcm1hdFswXVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0ZGVsZXRlIGNvbmRpdGlvbmFsRm9ybWF0T2JqLnZhbHVlMjtcclxuXHRcdFx0XHRcdFx0ZGVsZXRlIG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTI7XHJcblx0XHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTEgPSAwO1xyXG5cdFx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmouY29uZGl0aW9ucyA9IFwiTGVzc1RoYW5cIjtcclxuXHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUxID0gMDtcclxuXHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmouY29uZGl0aW9ucyA9IFwiR3JlYXRlclRoYW5cIjtcclxuXHRcdFx0XHRcdFx0dGhpcy5zZXRGb250U2V0dGluZ0NvbmRpdGlvbmFsKFxyXG5cdFx0XHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iaixcclxuXHRcdFx0XHRcdFx0XHRmaWVsZC5mb3JtYXRbMF0sXHJcblx0XHRcdFx0XHRcdFx0LTFcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0dGhpcy5zZXRGb250U2V0dGluZ0NvbmRpdGlvbmFsKFxyXG5cdFx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLFxyXG5cdFx0XHRcdFx0XHRcdGZpZWxkLmZvcm1hdFswXSxcclxuXHRcdFx0XHRcdFx0XHQxXHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdFNldHRpbmdzLnB1c2gobmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqKTtcclxuXHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0U2V0dGluZ3MudW5zaGlmdChjb25kaXRpb25hbEZvcm1hdE9iaik7XHJcblx0XHRcdFx0XHQvLyBmb250IHNldHRpbmcgZW5kXHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGxldCBmb3JtYXRTZXR0aW5nc09iaiA9IHtcclxuXHRcdFx0XHRcdG5hbWU6IFwiXCIsXHJcblx0XHRcdFx0XHRmb3JtYXQ6IFwiXCIsXHJcblx0XHRcdFx0fTtcclxuXHRcdFx0XHRpZiAoZmllbGQuZm9ybWF0WzBdLmZvcm1hdENoZWNrZWQpIHtcclxuXHRcdFx0XHRcdGZvcm1hdFNldHRpbmdzT2JqLm5hbWUgPSBmaWVsZC5mb3JtYXRbMF0uc2VsZWN0ZWRGaWVsZDtcclxuXHRcdFx0XHRcdGZvcm1hdFNldHRpbmdzT2JqLmZvcm1hdCA9XHJcblx0XHRcdFx0XHRcdHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UucGl2b3RUYWJsZWZvcm1hdE51bWJlcihcclxuXHRcdFx0XHRcdFx0XHRmaWVsZC5mb3JtYXRbMF0uc2VsZWN0ZWRGb3JtYXRcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdHN3aXRjaCAoZmllbGQuZm9ybWF0WzBdLmRhdGFUeXBlKSB7XHJcblx0XHRcdFx0XHRcdGNhc2UgXCJudW1iZXJcIjpcclxuXHRcdFx0XHRcdFx0XHRmb3JtYXRTZXR0aW5nc09iai5mb3JtYXQgPVxyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5kYXNoYm9hcmRQb3JsZXRzU2VydmljZS5waXZvdFRhYmxlZm9ybWF0TnVtYmVyKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRmaWVsZC5mb3JtYXRbMF0uc2VsZWN0ZWRGb3JtYXRcclxuXHRcdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdGNhc2UgXCJpbnRlZ2VyXCI6XHJcblx0XHRcdFx0XHRcdFx0Zm9ybWF0U2V0dGluZ3NPYmouZm9ybWF0ID1cclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UucGl2b3RUYWJsZWZvcm1hdEludGVnZXIoXHJcblx0XHRcdFx0XHRcdFx0XHRcdGZpZWxkLmZvcm1hdFswXS5zZWxlY3RlZEZvcm1hdFxyXG5cdFx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0Y2FzZSBcInBlcmNlbnROdW1cIjpcclxuXHRcdFx0XHRcdFx0Y2FzZSBcInBlcmNlbnRcIjpcclxuXHRcdFx0XHRcdFx0XHRmb3JtYXRTZXR0aW5nc09iai5mb3JtYXQgPVxyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5kYXNoYm9hcmRQb3JsZXRzU2VydmljZS5waXZvdFRhYmxlZm9ybWF0UGVyY2VudChcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZmllbGQuZm9ybWF0WzBdLnNlbGVjdGVkRm9ybWF0XHJcblx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRjYXNlIFwibXVsdGlwbGVcIjpcclxuXHRcdFx0XHRcdFx0XHRmb3JtYXRTZXR0aW5nc09iai5mb3JtYXQgPVxyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5kYXNoYm9hcmRQb3JsZXRzU2VydmljZS5waXZvdFRhYmxlZm9ybWF0TXVsdGlwbGUoXHJcblx0XHRcdFx0XHRcdFx0XHRcdGZpZWxkLmZvcm1hdFswXS5zZWxlY3RlZEZvcm1hdFxyXG5cdFx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0Y2FzZSBcImRhdGVcIjpcclxuXHRcdFx0XHRcdFx0Y2FzZSBcImRhdGV0aW1lXCI6XHJcblx0XHRcdFx0XHRcdFx0bGV0IGZvcm1hdCA9IFwiXCI7XHJcblx0XHRcdFx0XHRcdFx0aWYgKGZpZWxkLmZvcm1hdCAmJiBmaWVsZC5mb3JtYXQubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoZmllbGQuZm9ybWF0WzBdLmRhdGVUeXBlID09IFwiUXVhcnRlclwiKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGZvcm1hdCA9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZmllbGQuZm9ybWF0WzBdLnNlbGVjdGVkRm9ybWF0RGlzcGxheTtcclxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoZmllbGQuZm9ybWF0WzBdLmRhdGVUeXBlID09IFwiRGF0ZVwiKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGxldCBmcm9tSWR4ID1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmaWVsZC5mb3JtYXRbMF0uc2VsZWN0ZWRGb3JtYXREaXNwbGF5LmluZGV4T2YoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIihcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGxldCB0b0lkeCA9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZmllbGQuZm9ybWF0WzBdLnNlbGVjdGVkRm9ybWF0RGlzcGxheS5pbmRleE9mKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCIpXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRmb3JtYXQgPVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZpZWxkLmZvcm1hdFswXS5zZWxlY3RlZEZvcm1hdERpc3BsYXkuc2xpY2UoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmcm9tSWR4ICsgMSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRvSWR4XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0aWYgKGZvcm1hdCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0Zm9ybWF0U2V0dGluZ3NPYmogPSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdG5hbWU6IGZpZWxkLmNvbE5hbWUsXHJcblx0XHRcdFx0XHRcdFx0XHRcdGZvcm1hdDogXCJcIixcclxuXHRcdFx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRcdFx0XHQvLyBmaWVsZC5kYXRhVHlwZSA9IFwic3RyaW5nXCI7XHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdGZvcm1hdFNldHRpbmdzT2JqLmZvcm1hdCA9IHRoaXMuZGF0ZVBpcGVGb3JtYXQ7XHJcblx0XHRcdFx0XHRcdFx0XHRmb3JtYXRTZXR0aW5nc09ialtcInR5cGVcIl0gPSBcImRhdGVcIjtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdGZpZWxkLmZvcm1hdFswXS5kYXRhVHlwZSAhPT0gXCJzdHJpbmdcIiAmJlxyXG5cdFx0XHRcdFx0Zm9ybWF0U2V0dGluZ3NPYmouZm9ybWF0XHJcblx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRmb3JtYXRTZXR0aW5ncy5wdXNoKGZvcm1hdFNldHRpbmdzT2JqKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdFx0dGhpcy5jdXN0b21DYWxjdWxhdGVkRmllbGRzID0gdGhpcy5jb25maWcuY3VzdG9tQ2FsY3VsYXRlZEZpZWxkc1xyXG5cdFx0XHQ/IHRoaXMuY29uZmlnLmN1c3RvbUNhbGN1bGF0ZWRGaWVsZHNcclxuXHRcdFx0OiBbXTtcclxuXHJcblx0XHQvLyBTTVAyLTQ1ODIgQUdJQyAtIERhc2hib2FyZCBpdGVtIHNlcXVlbmNlXHJcblx0XHRsZXQgaXNFeGlzdFNlcSA9IGZhbHNlO1xyXG5cdFx0bGV0IHNvcnRTZXR0aW5ncyA9IHRoaXMuY29uZmlnLnNvcnRTZXR0aW5ncyB8fCBbXTtcclxuXHRcdGlmIChcclxuXHRcdFx0dGhpcy5QaXZvdF9EYXRhICYmXHJcblx0XHRcdHRoaXMuUGl2b3RfRGF0YVswXSAmJlxyXG5cdFx0XHR0aGlzLlBpdm90X0RhdGFbMF0uU2VxICE9PSBudWxsXHJcblx0XHQpIHtcclxuXHRcdFx0Ly8g5Y+W5raITmFtZeeahOm7mOiupOaOkuW6j++8jOagueaNrlNlceadpeaOkuW6j1xyXG5cdFx0XHRzb3J0U2V0dGluZ3MucHVzaCh7IG5hbWU6IFwiTmFtZVwiLCBvcmRlcjogXCJOb25lXCIgfSk7XHJcblx0XHRcdGlzRXhpc3RTZXEgPSB0cnVlO1xyXG5cdFx0fVxyXG5cdFx0bGV0IGZpbHRlclNldHRpbmdzID0gdGhpcy5kYXNoYm9hcmRQb3JsZXRzU2VydmljZS5jaGVja0ZpbHRlclNldHRpbmdzKFxyXG5cdFx0XHR0aGlzLmNvbmZpZyxcclxuXHRcdFx0dGhpcy5jb25maWdGaWVsZHMsXHJcblx0XHRcdHRoaXMuUGl2b3RfRGF0YVxyXG5cdFx0KTtcclxuXHRcdGxldCBuYW1lRmlsdGVyID0gZmlsdGVyU2V0dGluZ3MuZmluZCgoeCkgPT4geC5uYW1lID09PSBcIk5hbWVcIik7XHJcblx0XHQvLyDlrZjlnKggTmFtZeeahGZpbHRlcuaXtu+8jOS8muaMieeFp+m7mOiupOaOkuW6j++8jOmcgOimgeWvuU5hbWXov5vooYxTZXHmjpLluo/lpITnkIZcclxuXHRcdGlmIChpc0V4aXN0U2VxICYmIG5hbWVGaWx0ZXIgJiYgcm93cy5zb21lKCh4KSA9PiB4Lm5hbWUgPT09IFwiTmFtZVwiKSkge1xyXG5cdFx0XHRsZXQgaXRlbXMgPSBuYW1lRmlsdGVyLml0ZW1zOyAvLyDmi7/liLDlvZPliY3mjpLluo/vvIzpu5jorqRBLVpcclxuXHRcdFx0bGV0IHNlcUFyciA9IFtdO1xyXG5cdFx0XHRpdGVtcy5mb3JFYWNoKChuYW1lKSA9PiB7XHJcblx0XHRcdFx0bGV0IG9iaiA9IHRoaXMuUGl2b3RfRGF0YS5maW5kKCh4KSA9PiB4Lk5hbWUgPT09IG5hbWUpO1xyXG5cdFx0XHRcdGxldCBpdGVtOiBhbnkgPSB7XHJcblx0XHRcdFx0XHRuYW1lOiBuYW1lLFxyXG5cdFx0XHRcdFx0c2VxOiBvYmouU2VxLFxyXG5cdFx0XHRcdH07XHJcblx0XHRcdFx0c2VxQXJyLnB1c2goaXRlbSk7XHJcblx0XHRcdH0pO1xyXG5cdFx0XHRzZXFBcnIuc29ydCgoYSwgYikgPT4gYS5zZXEgLSBiLnNlcSk7XHJcblx0XHRcdG5hbWVGaWx0ZXIuaXRlbXMgPSBzZXFBcnIubWFwKCh4KSA9PiB4Lm5hbWUpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGFsbEZpZWxkcyA9XHJcblx0XHRcdHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UuYWxsRmllbGRzT2JqW3RoaXMucG9ydGxldC5pZF07XHJcblx0XHRpZiAoYWxsRmllbGRzKSB7XHJcblx0XHRcdHZhbHVlcy5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IGl0ZW0gPSBhbGxGaWVsZHMuZmluZChcclxuXHRcdFx0XHRcdChmaWVsZCkgPT4gZmllbGQuY29sTmFtZSA9PT0gdmFsdWUubmFtZVxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdFx0aWYgKGl0ZW0pIHtcclxuXHRcdFx0XHRcdHZhbHVlLmNhcHRpb24gPVxyXG5cdFx0XHRcdFx0XHQoaXRlbS5mb3JtYXQgJiZcclxuXHRcdFx0XHRcdFx0XHRpdGVtLmZvcm1hdC5sZW5ndGggJiZcclxuXHRcdFx0XHRcdFx0XHRpdGVtLmZvcm1hdFswXS5kaXNwbGF5TmFtZSkgfHxcclxuXHRcdFx0XHRcdFx0aXRlbS5sYW5nVmFsdWUgfHxcclxuXHRcdFx0XHRcdFx0dGhpcy50cmFuc2xhdGlvbltpdGVtLmxhbmdDb2RlXSB8fFxyXG5cdFx0XHRcdFx0XHRpdGVtLmxhbmdDb2RlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0XHRsZXQgaGFzSXRlbURhdGFUeXBlID0gZmFsc2U7XHJcblx0XHRpZiAodGhpcy5QaXZvdF9EYXRhKSB7XHJcblx0XHRcdHRoaXMuUGl2b3RfRGF0YS5tYXAoKGRhdGEpID0+IHtcclxuXHRcdFx0XHRpZiAoZGF0YVtcIkFjY291bnRUeXBlQ29kZVwiXSkge1xyXG5cdFx0XHRcdFx0aGFzSXRlbURhdGFUeXBlID0gdHJ1ZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cm93cy5mb3JFYWNoKChyb3cpID0+IHtcclxuXHRcdFx0XHRcdGlmIChkYXRhW3Jvdy5uYW1lXSA9PT0gXCJcIikge1xyXG5cdFx0XHRcdFx0XHRkYXRhW3Jvdy5uYW1lXSA9IFwibnVsbFwiO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHRcdGlmIChoYXNJdGVtRGF0YVR5cGUpIHtcclxuXHRcdFx0c29ydFNldHRpbmdzLnB1c2goe1xyXG5cdFx0XHRcdG5hbWU6IFwiQWNjb3VudFR5cGVDb2RlXCIsXHJcblx0XHRcdFx0b3JkZXI6IFwiQXNjZW5kaW5nXCIsXHJcblx0XHRcdFx0bWVtYmVyc09yZGVyOiBbLi4udGhpcy5pdGVtRGF0YVR5cGVTb3J0QXJyXSxcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0XHR0aGlzLmNvbmZpZy5maWx0ZXJzLmZvckVhY2goKGZpbHRlcikgPT4ge1xyXG5cdFx0XHRmaWx0ZXIuY2FwdGlvbiA9XHJcblx0XHRcdFx0dGhpcy5nZXRDYXB0aW9uQnlOYW1lKGZpbHRlci5uYW1lKSB8fCBmaWx0ZXIuY2FwdGlvbjtcclxuXHRcdH0pO1xyXG5cdFx0dGhpcy5kYXRhU291cmNlU2V0dGluZ3MgPSB7XHJcblx0XHRcdGRhdGFTb3VyY2U6IHRoaXMuUGl2b3RfRGF0YSB8fCBbXSxcclxuXHRcdFx0cm93czogcm93cyB8fCBbXSxcclxuXHRcdFx0Y29sdW1uczogY29sdW1ucyB8fCBbXSxcclxuXHRcdFx0dmFsdWVzOiB2YWx1ZXMgfHwgW10sXHJcblx0XHRcdGZpbHRlcnM6IHRoaXMuY29uZmlnLmZpbHRlcnMsXHJcblx0XHRcdGZpbHRlclNldHRpbmdzOiBmaWx0ZXJTZXR0aW5ncyxcclxuXHRcdFx0ZXhjbHVkZUZpZWxkczogdGhpcy5leGNsdWRlRmllbGRzLFxyXG5cdFx0XHRmb3JtYXRTZXR0aW5nczogZm9ybWF0U2V0dGluZ3MsXHJcblx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0U2V0dGluZ3M6IGNvbmRpdGlvbmFsRm9ybWF0U2V0dGluZ3MsXHJcblx0XHRcdC8vIOeUqOS6juaUtui1t+WxleW8gOaMh+WumuWxgue6pywg6L+Z546p5oSP5Y+q6IO95bGV5byA56ys5LiA5bGCLFxyXG5cdFx0XHQvLyDlv4Xpobvorr7lrppleHBhbmRBbGwg5Li6ZmFsc2XvvIjpu5jorqTmmK9mYWxzZe+8ie+8jCDov5nmoLflrZDmiY3og73lrp7njrDlj6rlsZXlvIDkuKTlsYJcclxuXHRcdFx0Ly8gZHJpbGxlZE1lbWJlcnMsXHJcblx0XHRcdGV4cGFuZEFsbDogdHJ1ZSxcclxuXHRcdFx0ZW5hYmxlU29ydGluZzogdHJ1ZSxcclxuXHRcdFx0ZmllbGRNYXBwaW5nOiBmaWVsZE1hcHBpbmcsXHJcblx0XHRcdGNhbGN1bGF0ZWRGaWVsZFNldHRpbmdzOiB0aGlzLmNvbmZpZy5jYWxjdWxhdGVkRmllbGRTZXR0aW5ncyxcclxuXHRcdFx0c29ydFNldHRpbmdzOiBzb3J0U2V0dGluZ3MsXHJcblx0XHRcdC8vIGdyb3VwU2V0dGluZ3M6IHRoaXMuY29uZmlnLmdyb3VwU2V0dGluZ3MsXHJcblx0XHRcdHZhbHVlU29ydFNldHRpbmdzOiB0aGlzLmNvbmZpZy52YWx1ZVNvcnRTZXR0aW5ncyxcclxuXHRcdFx0c2hvd0dyYW5kVG90YWxzOiB0aGlzLmNvbmZpZy5zaG93R3JhbmRUb3RhbHMsXHJcblx0XHRcdHNob3dSb3dHcmFuZFRvdGFsczogdGhpcy5jb25maWcuc2hvd1Jvd0dyYW5kVG90YWxzLFxyXG5cdFx0XHRzaG93Q29sdW1uR3JhbmRUb3RhbHM6IHRoaXMuY29uZmlnLnNob3dDb2x1bW5HcmFuZFRvdGFscyxcclxuXHRcdFx0c2hvd1N1YlRvdGFsczogdGhpcy5jb25maWcuc2hvd1N1YlRvdGFscyxcclxuXHRcdFx0c2hvd1Jvd1N1YlRvdGFsczogdGhpcy5jb25maWcuc2hvd1Jvd1N1YlRvdGFscyxcclxuXHRcdFx0c2hvd0NvbHVtblN1YlRvdGFsczogdGhpcy5jb25maWcuc2hvd0NvbHVtblN1YlRvdGFscyxcclxuXHRcdH07XHJcblx0XHRjb25zb2xlLmxvZyhcInRoaXMuZGF0YVNvdXJjZVNldHRpbmdzXCIsIHRoaXMuZGF0YVNvdXJjZVNldHRpbmdzKTtcclxuXHJcblx0XHR0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuXHR9XHJcblxyXG5cdGdldENhcHRpb25CeU5hbWUobmFtZVN0cmluZykge1xyXG5cdFx0aWYgKCFuYW1lU3RyaW5nKSByZXR1cm4gXCJcIjtcclxuXHRcdGNvbnN0IGZpZWxkID0gdGhpcy5jb25maWdGaWVsZHMuZmluZCgoZWwpID0+IGVsLmNvbE5hbWUgPT09IG5hbWVTdHJpbmcpO1xyXG5cclxuXHRcdHJldHVybiBmaWVsZFxyXG5cdFx0XHQ/IGZpZWxkLmxhbmdWYWx1ZSB8fFxyXG5cdFx0XHRcdFx0dGhpcy50cmFuc2xhdGlvbltmaWVsZCAmJiBmaWVsZC5sYW5nQ29kZV0gfHxcclxuXHRcdFx0XHRcdGZpZWxkLmxhbmdDb2RlXHJcblx0XHRcdDogXCJcIjtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBhZnRlclBvcHVsYXRlKGFyZ3M6IEVuZ2luZVBvcHVsYXRlZEV2ZW50QXJncyk6IHZvaWQge1xyXG5cdFx0dGhpcy50ZW1wU3VidG90YWxzID0gW107XHJcblx0XHR0aGlzLmdyYW5kVG90YWxzID0ge307XHJcblx0XHR0aGlzLnN1YlRvdGFscyA9IHt9O1xyXG5cdFx0bGV0IHRlbXBzaG93QXJyYXkgPSBbXTtcclxuXHRcdHRoaXMuY29uZmlnLnlheGlzLnNlcmllcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHRpdGVtLmhhc093blByb3BlcnR5KFwic2hvd1N1YlRvdGFsc1wiKSAmJlxyXG5cdFx0XHRcdGl0ZW0uaGFzT3duUHJvcGVydHkoXCJzaG93R3JhbmRUb3RhbHNcIilcclxuXHRcdFx0KSB7XHJcblx0XHRcdFx0dGVtcHNob3dBcnJheS5wdXNoKHtcclxuXHRcdFx0XHRcdG5hbWU6IGl0ZW0uY29sTmFtZSxcclxuXHRcdFx0XHRcdGNhbE1ldGhvZDogaXRlbS5jYWxNZXRob2QsXHJcblx0XHRcdFx0XHRzaG93U3ViVG90YWxzOiBpdGVtLnNob3dTdWJUb3RhbHMsXHJcblx0XHRcdFx0XHRzaG93R3JhbmRUb3RhbHM6IGl0ZW0uc2hvd0dyYW5kVG90YWxzLFxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGlmIChpdGVtLmhhc093blByb3BlcnR5KFwic2hvd0dyYW5kVG90YWxzXCIpKSB7XHJcblx0XHRcdFx0XHR0ZW1wc2hvd0FycmF5LnB1c2goe1xyXG5cdFx0XHRcdFx0XHRuYW1lOiBpdGVtLmNvbE5hbWUsXHJcblx0XHRcdFx0XHRcdGNhbE1ldGhvZDogaXRlbS5jYWxNZXRob2QsXHJcblx0XHRcdFx0XHRcdHNob3dHcmFuZFRvdGFsczogaXRlbS5zaG93R3JhbmRUb3RhbHMsXHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKGl0ZW0uaGFzT3duUHJvcGVydHkoXCJzaG93U3ViVG90YWxzXCIpKSB7XHJcblx0XHRcdFx0XHR0ZW1wc2hvd0FycmF5LnB1c2goe1xyXG5cdFx0XHRcdFx0XHRuYW1lOiBpdGVtLmNvbE5hbWUsXHJcblx0XHRcdFx0XHRcdGNhbE1ldGhvZDogaXRlbS5jYWxNZXRob2QsXHJcblx0XHRcdFx0XHRcdHNob3dTdWJUb3RhbHM6IGl0ZW0uc2hvd1N1YlRvdGFscyxcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0aWYgKHRoaXMuZmllbGRsaXN0T2JqICYmIHRoaXMucGl2b3RPYmopIHtcclxuXHRcdFx0dGhpcy5jb25maWcuY29sdW1uR3JvdXAgPSBbXTtcclxuXHRcdFx0dGhpcy5jb25maWcueGF4aXMuZ3JvdXBzID0gW107XHJcblx0XHRcdHRoaXMuY29uZmlnLnlheGlzLnNlcmllcyA9IFtdO1xyXG5cdFx0XHR0aGlzLmNvbmZpZy5maWx0ZXJzID0gW107XHJcblx0XHRcdHRoaXMuY29uZmlnLmZpbHRlclNldHRpbmdzID0gW107XHJcblx0XHRcdHRoaXMuY29uZmlnLmNhbGN1bGF0ZWRGaWVsZFNldHRpbmdzID0gW107XHJcblx0XHRcdGxldCBncm91cFNldHRpbmdzID0gdGhpcy5nZXREYXRhU291cmNlU2V0dGluZ3NQcm9wKFxyXG5cdFx0XHRcdHRoaXMuZmllbGRsaXN0T2JqLFxyXG5cdFx0XHRcdFwiZ3JvdXBTZXR0aW5nc1wiXHJcblx0XHRcdCk7XHJcblx0XHRcdGxldCBjb2x1bW5zID0gdGhpcy5nZXREYXRhU291cmNlU2V0dGluZ3NQcm9wKFxyXG5cdFx0XHRcdHRoaXMuZmllbGRsaXN0T2JqLFxyXG5cdFx0XHRcdFwiY29sdW1uc1wiXHJcblx0XHRcdCk7XHJcblx0XHRcdGxldCByb3dzID0gdGhpcy5nZXREYXRhU291cmNlU2V0dGluZ3NQcm9wKFxyXG5cdFx0XHRcdHRoaXMuZmllbGRsaXN0T2JqLFxyXG5cdFx0XHRcdFwicm93c1wiXHJcblx0XHRcdCk7XHJcblx0XHRcdGxldCBmaWx0ZXJzID0gdGhpcy5nZXREYXRhU291cmNlU2V0dGluZ3NQcm9wKFxyXG5cdFx0XHRcdHRoaXMuZmllbGRsaXN0T2JqLFxyXG5cdFx0XHRcdFwiZmlsdGVyc1wiXHJcblx0XHRcdCk7XHJcblx0XHRcdGxldCBmaWx0ZXJTZXR0aW5ncyA9IHRoaXMuZ2V0RGF0YVNvdXJjZVNldHRpbmdzUHJvcChcclxuXHRcdFx0XHR0aGlzLmZpZWxkbGlzdE9iaixcclxuXHRcdFx0XHRcImZpbHRlclNldHRpbmdzXCJcclxuXHRcdFx0KTtcclxuXHRcdFx0bGV0IHZhbHVlcyA9IHRoaXMuZ2V0RGF0YVNvdXJjZVNldHRpbmdzUHJvcChcclxuXHRcdFx0XHR0aGlzLmZpZWxkbGlzdE9iaixcclxuXHRcdFx0XHRcInZhbHVlc1wiXHJcblx0XHRcdCk7XHJcblx0XHRcdGxldCBzb3J0U2V0dGluZ3MgPSB0aGlzLmdldERhdGFTb3VyY2VTZXR0aW5nc1Byb3AoXHJcblx0XHRcdFx0dGhpcy5maWVsZGxpc3RPYmosXHJcblx0XHRcdFx0XCJzb3J0U2V0dGluZ3NcIlxyXG5cdFx0XHQpO1xyXG5cdFx0XHRsZXQgY2FsY3VsYXRlZEZpZWxkU2V0dGluZ3MgPSB0aGlzLmdldERhdGFTb3VyY2VTZXR0aW5nc1Byb3AoXHJcblx0XHRcdFx0dGhpcy5maWVsZGxpc3RPYmosXHJcblx0XHRcdFx0XCJjYWxjdWxhdGVkRmllbGRTZXR0aW5nc1wiXHJcblx0XHRcdCk7XHJcblx0XHRcdGlmIChncm91cFNldHRpbmdzLmxlbmd0aCA9PT0gMCkge1xyXG5cdFx0XHRcdGZvciAobGV0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XHJcblx0XHRcdFx0XHR0aGlzLmNvbmZpZy5jb2x1bW5Hcm91cC5wdXNoKHtcclxuXHRcdFx0XHRcdFx0bmFtZTogY29sdW1uLm5hbWUsXHJcblx0XHRcdFx0XHRcdGNhcHRpb246XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRDYXB0aW9uQnlOYW1lKGNvbHVtbi5uYW1lKSB8fFxyXG5cdFx0XHRcdFx0XHRcdGNvbHVtbi5jYXB0aW9uLFxyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdC8vSWYgdGhlcmUgaXMgYSBncm91cCwgZmlyc3QgZmlsdGVyIHRoZSBjb2x1bW5zIG9mIHRoZSBncm91cCBmaWVsZCwgYW5kIHRoZW4gb25seSBzYXZlIHRoZSBsYXN0IG9uZVxyXG5cdFx0XHRcdGZvciAobGV0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XHJcblx0XHRcdFx0XHRpZiAoIXN0YXJ0c1dpdGgoY29sdW1uLm5hbWUsIGdyb3VwU2V0dGluZ3NbMF0ubmFtZSArIFwiX1wiKSkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLmNvbmZpZy5jb2x1bW5Hcm91cC5wdXNoKHtcclxuXHRcdFx0XHRcdFx0XHRuYW1lOiBjb2x1bW4ubmFtZSxcclxuXHRcdFx0XHRcdFx0XHRjYXB0aW9uOlxyXG5cdFx0XHRcdFx0XHRcdFx0Y29sdW1uLm5hbWUgPT09IGdyb3VwU2V0dGluZ3NbMF0ubmFtZVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ/IFwiXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0OiB0aGlzLmdldENhcHRpb25CeU5hbWUoY29sdW1uLm5hbWUpIHx8XHJcblx0XHRcdFx0XHRcdFx0XHRcdCAgY29sdW1uLmNhcHRpb24sXHJcblx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRmb3IgKGxldCByb3cgb2Ygcm93cykge1xyXG5cdFx0XHRcdHRoaXMuY29uZmlnLnhheGlzLmdyb3Vwcy5wdXNoKHtcclxuXHRcdFx0XHRcdG5hbWU6IHJvdy5uYW1lLFxyXG5cdFx0XHRcdFx0Y2FwdGlvbjogdGhpcy5nZXRDYXB0aW9uQnlOYW1lKHJvdy5uYW1lKSB8fCByb3cuY2FwdGlvbixcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cdFx0XHRmb3IgKGxldCBmaWx0ZXIgb2YgZmlsdGVycykge1xyXG5cdFx0XHRcdHRoaXMuY29uZmlnLmZpbHRlcnMucHVzaCh7XHJcblx0XHRcdFx0XHRuYW1lOiBmaWx0ZXIubmFtZSxcclxuXHRcdFx0XHRcdGNhcHRpb246XHJcblx0XHRcdFx0XHRcdHRoaXMuZ2V0Q2FwdGlvbkJ5TmFtZShmaWx0ZXIubmFtZSkgfHwgZmlsdGVyLmNhcHRpb24sXHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKHRoaXMuZmlsdGVyU2V0dGluZ3MgJiYgdGhpcy5maWx0ZXJTZXR0aW5ncy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0YXJncy5kYXRhU291cmNlU2V0dGluZ3MuZmlsdGVyU2V0dGluZ3MgPSB0aGlzLmZpbHRlclNldHRpbmdzO1xyXG5cdFx0XHRcdHRoaXMuY29uZmlnLmZpbHRlclNldHRpbmdzID0gdGhpcy5maWx0ZXJTZXR0aW5ncztcclxuXHRcdFx0XHRkZWxldGUgdGhpcy5maWx0ZXJTZXR0aW5ncztcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aGlzLmNvbmZpZy5maWx0ZXJTZXR0aW5ncyA9IGZpbHRlclNldHRpbmdzO1xyXG5cdFx0XHR9XHJcblx0XHRcdGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xyXG5cdFx0XHRcdGxldCBzZXJpZXNEYXRhO1xyXG5cdFx0XHRcdGxldCB0ZW1wU2hvd09iajtcclxuXHRcdFx0XHRsZXQgZmlsdGVyVGVtcHNob3dBcnJheSA9IFtdO1xyXG5cdFx0XHRcdGlmICh0ZW1wc2hvd0FycmF5Lmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0ZmlsdGVyVGVtcHNob3dBcnJheSA9IHRlbXBzaG93QXJyYXkuZmlsdGVyKFxyXG5cdFx0XHRcdFx0XHQoaXRlbSkgPT5cclxuXHRcdFx0XHRcdFx0XHRpdGVtLm5hbWUgPT09IHZhbHVlLm5hbWUgJiZcclxuXHRcdFx0XHRcdFx0XHRpdGVtLmNhbE1ldGhvZCA9PT0gdmFsdWUudHlwZVxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdGlmIChmaWx0ZXJUZW1wc2hvd0FycmF5Lmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0XHR0ZW1wU2hvd09iaiA9IGZpbHRlclRlbXBzaG93QXJyYXlbMF07XHJcblx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHR0ZW1wU2hvd09iai5oYXNPd25Qcm9wZXJ0eShcInNob3dTdWJUb3RhbHNcIikgJiZcclxuXHRcdFx0XHRcdFx0XHR0ZW1wU2hvd09iai5oYXNPd25Qcm9wZXJ0eShcInNob3dHcmFuZFRvdGFsc1wiKVxyXG5cdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHRzZXJpZXNEYXRhID0ge1xyXG5cdFx0XHRcdFx0XHRcdFx0Y29sTmFtZTogdmFsdWUubmFtZSxcclxuXHRcdFx0XHRcdFx0XHRcdGNhbE1ldGhvZDogdmFsdWUudHlwZSxcclxuXHRcdFx0XHRcdFx0XHRcdHRpdGxlOiB2YWx1ZS5jYXB0aW9uLFxyXG5cdFx0XHRcdFx0XHRcdFx0c2hvd1N1YlRvdGFsczogdGVtcFNob3dPYmouc2hvd1N1YlRvdGFscyxcclxuXHRcdFx0XHRcdFx0XHRcdHNob3dHcmFuZFRvdGFsczogdGVtcFNob3dPYmouc2hvd0dyYW5kVG90YWxzLFxyXG5cdFx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0aWYgKHRlbXBTaG93T2JqLmhhc093blByb3BlcnR5KFwic2hvd0dyYW5kVG90YWxzXCIpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRzZXJpZXNEYXRhID0ge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRjb2xOYW1lOiB2YWx1ZS5uYW1lLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRjYWxNZXRob2Q6IHZhbHVlLnR5cGUsXHJcblx0XHRcdFx0XHRcdFx0XHRcdHRpdGxlOiB2YWx1ZS5jYXB0aW9uLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRzaG93R3JhbmRUb3RhbHM6XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGVtcFNob3dPYmouc2hvd0dyYW5kVG90YWxzLFxyXG5cdFx0XHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0aWYgKHRlbXBTaG93T2JqLmhhc093blByb3BlcnR5KFwic2hvd1N1YlRvdGFsc1wiKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0c2VyaWVzRGF0YSA9IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y29sTmFtZTogdmFsdWUubmFtZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y2FsTWV0aG9kOiB2YWx1ZS50eXBlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHR0aXRsZTogdmFsdWUuY2FwdGlvbixcclxuXHRcdFx0XHRcdFx0XHRcdFx0c2hvd1N1YlRvdGFsczogdGVtcFNob3dPYmouc2hvd1N1YlRvdGFscyxcclxuXHRcdFx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmICghc2VyaWVzRGF0YSkge1xyXG5cdFx0XHRcdFx0c2VyaWVzRGF0YSA9IHtcclxuXHRcdFx0XHRcdFx0Y29sTmFtZTogdmFsdWUubmFtZSxcclxuXHRcdFx0XHRcdFx0dGl0bGU6IHZhbHVlLmNhcHRpb24sXHJcblx0XHRcdFx0XHRcdGNhbE1ldGhvZDogdmFsdWUudHlwZSxcclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHRoaXMuY29uZmlnLnlheGlzLnNlcmllcy5wdXNoKHNlcmllc0RhdGEpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGZvciAobGV0IGNhbGN1bGF0ZSBvZiBjYWxjdWxhdGVkRmllbGRTZXR0aW5ncykge1xyXG5cdFx0XHRcdGNvbnN0IGNhbGN1bGF0ZURhdGEgPSB7XHJcblx0XHRcdFx0XHRuYW1lOiBjYWxjdWxhdGUubmFtZSxcclxuXHRcdFx0XHRcdGZvcm11bGE6IGNhbGN1bGF0ZS5mb3JtdWxhLFxyXG5cdFx0XHRcdFx0Zm9ybWF0U3RyaW5nOlxyXG5cdFx0XHRcdFx0XHRjYWxjdWxhdGUuZm9ybWF0U3RyaW5nID09PSBcIlwiXHJcblx0XHRcdFx0XHRcdFx0PyBcIk4yXCJcclxuXHRcdFx0XHRcdFx0XHQ6IGNhbGN1bGF0ZS5mb3JtYXRTdHJpbmcsXHJcblx0XHRcdFx0fTtcclxuXHRcdFx0XHR0aGlzLmNvbmZpZy5jYWxjdWxhdGVkRmllbGRTZXR0aW5ncy5wdXNoKGNhbGN1bGF0ZURhdGEpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHRoaXMuY29uZmlnLmN1c3RvbUNhbGN1bGF0ZWRGaWVsZHMgPSB0aGlzLmN1c3RvbUNhbGN1bGF0ZWRGaWVsZHM7XHJcblx0XHRcdHRoaXMuY29uZmlnLnNvcnRTZXR0aW5ncyA9IHNvcnRTZXR0aW5ncztcclxuXHRcdFx0dGhpcy5jb25maWcuZ3JvdXBTZXR0aW5ncyA9IGdyb3VwU2V0dGluZ3M7XHJcblx0XHRcdHRoaXMuZmllbGRsaXN0T2JqLnVwZGF0ZVZpZXcodGhpcy5waXZvdE9iaik7XHJcblx0XHR9XHJcblx0XHR0aGlzLnBvcnRsZXQuY29uZmlnID0gSlNPTi5zdHJpbmdpZnkodGhpcy5jb25maWcpO1xyXG5cdFx0Ly9yZW1vdmUgdGhlIHNvcnRcclxuXHRcdGlmICh0aGlzLnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy5zb3J0U2V0dGluZ3MubGVuZ3RoID4gMCkge1xyXG5cdFx0XHR0aGlzLnByZXZpb3VzU29ydCA9IHRoaXMuZmllbGRsaXN0T2JqLmxhc3RTb3J0SW5mbztcclxuXHRcdFx0KHRoaXMuZmllbGRsaXN0T2JqIGFzIGFueSkubGFzdFNvcnRJbmZvID0gW107XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgYWZ0ZXJFbmdpbmVQb3B1bGF0ZShhcmdzOiBhbnkpIHtcclxuXHRcdGlmICghQnJvd3Nlci5pc0RldmljZSAmJiB0aGlzLmZpZWxkbGlzdE9iaiAmJiB0aGlzLnBpdm90T2JqKSB7XHJcblx0XHRcdHRoaXMuY29uZmlnLmdyb3VwU2V0dGluZ3MgPSB0aGlzLmdldERhdGFTb3VyY2VTZXR0aW5nc1Byb3AoXHJcblx0XHRcdFx0dGhpcy5waXZvdE9iaixcclxuXHRcdFx0XHRcImdyb3VwU2V0dGluZ3NcIlxyXG5cdFx0XHQpO1xyXG5cdFx0XHR0aGlzLnBvcnRsZXQuY29uZmlnID0gSlNPTi5zdHJpbmdpZnkodGhpcy5jb25maWcpO1xyXG5cdFx0XHRpZiAodGhpcy5maWVsZGxpc3RPYmopIHRoaXMuZmllbGRsaXN0T2JqLnVwZGF0ZSh0aGlzLnBpdm90T2JqKTtcclxuXHRcdFx0dGhpcy5waXZvdE9iai5ncmlkLnF1ZXJ5Q2VsbEluZm8gPSB0aGlzLnF1ZXJ5Q2VsbC5iaW5kKHRoaXMpO1xyXG5cdFx0XHR0aGlzLnBpdm90T2JqLmdyaWQuaGVhZGVyQ2VsbEluZm8gPSB0aGlzLmhlYWRlckNlbGwuYmluZCh0aGlzKTtcclxuXHRcdFx0Ly8gU01QMi0zOTI5IHJvbGxiYWNrXHJcblx0XHRcdC8vIGlmICghdGhpcy5pc0FwcGx5SVJSKVxyXG5cdFx0XHQvLyBcdHRoaXMuZ2V0Q2FsY3VsYXRpb25SZXN1bHRCeURhc2hib2FyZERhdGFUYWJsZUlkKCk7XHJcblx0XHR9XHJcblx0XHRpZiAodGhpcy5QaXZvdF9EYXRhICYmIHRoaXMuUGl2b3RfRGF0YS5sZW5ndGgpIHtcclxuXHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5lbmdpbmVQb3B1bGF0ZWQoYXJncyk7XHJcblx0XHRcdH0sIDE1MDApO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBnZXREYXRhU291cmNlU2V0dGluZ3NQcm9wKG9iaiwga2V5KSB7XHJcblx0XHRsZXQgcHJvcCA9IG51bGw7XHJcblx0XHRpZiAob2JqICYmIG9iai5kYXRhU291cmNlU2V0dGluZ3MpIHtcclxuXHRcdFx0cHJvcCA9IG9iai5kYXRhU291cmNlU2V0dGluZ3Nba2V5XTtcclxuXHRcdFx0aWYgKFxyXG5cdFx0XHRcdE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChwcm9wKSA9PT0gXCJbb2JqZWN0IEFycmF5XVwiICYmXHJcblx0XHRcdFx0cHJvcC5sZW5ndGggPiAwXHJcblx0XHRcdCkge1xyXG5cdFx0XHRcdHByb3AgPSBwcm9wLm1hcCgoaXRlbSkgPT4gaXRlbS5wcm9wZXJ0aWVzIHx8IGl0ZW0pO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gcHJvcDtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBlbmdpbmVQb3B1bGF0aW5nKGFyZ3MpIHtcclxuXHRcdHRoaXMuZ3JhbmRUb3RhbHMgPSB7fTtcclxuXHRcdHRoaXMuc3ViVG90YWxzID0ge307XHJcblx0XHR0aGlzLmFsbERhdGFWYWx1ZSA9IFtdO1xyXG5cdFx0Ly8gaWYgKGFyZ3MuZGF0YVNvdXJjZVNldHRpbmdzLnNvcnRTZXR0aW5ncy5sZW5ndGgpIHtcclxuXHRcdC8vIFx0Zm9yIChcclxuXHRcdC8vIFx0XHRsZXQgaSA9IDA7XHJcblx0XHQvLyBcdFx0aSA8IGFyZ3MuZGF0YVNvdXJjZVNldHRpbmdzLnNvcnRTZXR0aW5ncy5sZW5ndGg7XHJcblx0XHQvLyBcdFx0aSsrXHJcblx0XHQvLyBcdCkge1xyXG5cdFx0Ly8gXHRcdGlmIChcclxuXHRcdC8vIFx0XHRcdHRoaXMuZmllbGRsaXN0T2JqLmxhc3RTb3J0SW5mbyAmJlxyXG5cdFx0Ly8gXHRcdFx0dGhpcy5maWVsZGxpc3RPYmoubGFzdFNvcnRJbmZvLm5hbWUgPT09XHJcblx0XHQvLyBcdFx0XHRcdGFyZ3MuZGF0YVNvdXJjZVNldHRpbmdzLnNvcnRTZXR0aW5nc1tpXS5uYW1lICYmXHJcblx0XHQvLyBcdFx0XHR0aGlzLmZpZWxkbGlzdE9iai5sYXN0U29ydEluZm8ub3JkZXIgPT09IFwiQXNjZW5kaW5nXCIgJiZcclxuXHRcdC8vIFx0XHRcdCEoXHJcblx0XHQvLyBcdFx0XHRcdHRoaXMuZmllbGRsaXN0T2JqLmxhc3RTb3J0SW5mby5uYW1lID09PVxyXG5cdFx0Ly8gXHRcdFx0XHRcdHRoaXMucHJldmlvdXNTb3J0Lm5hbWUgJiZcclxuXHRcdC8vIFx0XHRcdFx0dGhpcy5wcmV2aW91c1NvcnQub3JkZXIgPT09IFwiTm9uZVwiXHJcblx0XHQvLyBcdFx0XHQpXHJcblx0XHQvLyBcdFx0KSB7XHJcblx0XHQvLyBcdFx0XHRhcmdzLmRhdGFTb3VyY2VTZXR0aW5ncy5zb3J0U2V0dGluZ3NbaV0ub3JkZXIgPSBcIk5vbmVcIjtcclxuXHRcdC8vIFx0XHR9IGVsc2UgaWYgKFxyXG5cdFx0Ly8gXHRcdFx0dGhpcy5wcmV2aW91c1NvcnQgJiZcclxuXHRcdC8vIFx0XHRcdHRoaXMuZmllbGRsaXN0T2JqLmxhc3RTb3J0SW5mbyAmJlxyXG5cdFx0Ly8gXHRcdFx0dGhpcy5maWVsZGxpc3RPYmoubGFzdFNvcnRJbmZvLm5hbWUgPT09XHJcblx0XHQvLyBcdFx0XHRcdHRoaXMucHJldmlvdXNTb3J0Lm5hbWUgJiZcclxuXHRcdC8vIFx0XHRcdHRoaXMucHJldmlvdXNTb3J0Lm9yZGVyID09PSBcIkFzY2VuZGluZ1wiXHJcblx0XHQvLyBcdFx0KSB7XHJcblx0XHQvLyBcdFx0XHRhcmdzLmRhdGFTb3VyY2VTZXR0aW5ncy5zb3J0U2V0dGluZ3NbaV0ub3JkZXIgPSBcIkFzY2VuZGluZ1wiO1xyXG5cdFx0Ly8gXHRcdH1cclxuXHRcdC8vIFx0fVxyXG5cdFx0Ly8gfVxyXG5cdH1cclxuXHJcblx0cHVibGljIGNlbGxDbGljayhhcmdzKSB7XHJcblx0XHRpZiAoYXJncy5jdXJyZW50Q2VsbC5jbGFzc0xpc3QuY29udGFpbnMoXCJlLWhlYWRlcmNlbGxcIikpIHtcclxuXHRcdFx0dGhpcy5mbGFnID0gdHJ1ZTtcclxuXHRcdH1cclxuXHRcdC8vIOa4hemZpOaOkuW6j1xyXG5cdFx0aWYgKFxyXG5cdFx0XHR0aGlzLnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy52YWx1ZVNvcnRTZXR0aW5ncy5zb3J0T3JkZXIgJiZcclxuXHRcdFx0dGhpcy5waXZvdE9iai5kYXRhU291cmNlU2V0dGluZ3MudmFsdWVTb3J0U2V0dGluZ3MuaGVhZGVyVGV4dCAmJlxyXG5cdFx0XHR0aGlzLnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy52YWx1ZVNvcnRTZXR0aW5ncy5zb3J0T3JkZXIgPT09XHJcblx0XHRcdFx0XCJEZXNjZW5kaW5nXCIgJiZcclxuXHRcdFx0YXJncy5kYXRhLnZhbHVlU29ydCAmJlxyXG5cdFx0XHR0aGlzLnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy52YWx1ZVNvcnRTZXR0aW5ncy5oZWFkZXJUZXh0ID09PVxyXG5cdFx0XHRcdGFyZ3MuZGF0YS52YWx1ZVNvcnQubGV2ZWxOYW1lXHJcblx0XHQpIHtcclxuXHRcdFx0dGhpcy5waXZvdE9iai5zZXRQcm9wZXJ0aWVzKFxyXG5cdFx0XHRcdHtcclxuXHRcdFx0XHRcdGRhdGFTb3VyY2VTZXR0aW5nczoge1xyXG5cdFx0XHRcdFx0XHR2YWx1ZVNvcnRTZXR0aW5nczoge1xyXG5cdFx0XHRcdFx0XHRcdHNvcnRPcmRlcjogXCJEZXNjZW5kaW5nXCIsXHJcblx0XHRcdFx0XHRcdFx0aGVhZGVyVGV4dDogXCJcIixcclxuXHRcdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHR0cnVlXHJcblx0XHRcdCk7XHJcblx0XHRcdGlmICh0aGlzLnBpdm90T2JqKSB0aGlzLnBpdm90T2JqLnJlZnJlc2hEYXRhKCk7XHJcblx0XHRcdHRoaXMuZmxhZyA9IGZhbHNlO1xyXG5cdFx0XHR0aGlzLmNvbmZpZy52YWx1ZVNvcnRTZXR0aW5ncyA9IHt9O1xyXG5cdFx0XHR0aGlzLnBvcnRsZXQuY29uZmlnID0gSlNPTi5zdHJpbmdpZnkodGhpcy5jb25maWcpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBxdWVyeUNlbGwoYXJnczogYW55KTogdm9pZCB7XHJcblx0XHQodGhpcy5waXZvdE9iai5yZW5kZXJNb2R1bGUgYXMgYW55KS5yb3dDZWxsQm91bmRFdmVudChhcmdzKTtcclxuXHRcdGxldCByb3dJbmRleCA9IE51bWJlcihhcmdzLmNlbGwuZ2V0QXR0cmlidXRlKFwiaW5kZXhcIikpO1xyXG5cdFx0Ly8g5paw54mI5pysMjYueOS4rSBhcmlhLWNvbGluZGV4IOS8muavlOaXp+eJiOacrHYyMC54IOWkmjFcclxuXHRcdGxldCBjb2xJbmRleCA9IHBhcnNlSW50KGFyZ3MuY2VsbC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWNvbGluZGV4XCIpKSAtIDE7XHJcblx0XHRpZiAoXHJcblx0XHRcdCF0aGlzLnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy5jb25kaXRpb25hbEZvcm1hdFNldHRpbmdzLmxlbmd0aFxyXG5cdFx0KSB7XHJcblx0XHRcdGlmIChhcmdzLmRhdGEgJiYgYXJncy5kYXRhWzBdLmZvcm1hdHRlZFRleHQgPT09IFwiR3JhbmQgVG90YWxcIikge1xyXG5cdFx0XHRcdGFyZ3MuY2VsbC5jbGFzc0xpc3QuYWRkKFwiZ3JhbmQtY2xhc3NcIik7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0YXJncy5jZWxsLmNsYXNzTGlzdC5hZGQoXHJcblx0XHRcdFx0XHRyb3dJbmRleCAlIDIgPyBcIm9kZC1jbGFzc1wiIDogXCJldmVuLWNsYXNzXCJcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRsZXQgbWVhc3VyZUFyciA9XHJcblx0XHRcdFx0dGhpcy5waXZvdE9iai5kYXRhU291cmNlU2V0dGluZ3MuY29uZGl0aW9uYWxGb3JtYXRTZXR0aW5ncy5tYXAoXHJcblx0XHRcdFx0XHQob2JqKSA9PiB7XHJcblx0XHRcdFx0XHRcdHJldHVybiBvYmoubWVhc3VyZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHQpO1xyXG5cdFx0XHRpZiAoXHJcblx0XHRcdFx0bWVhc3VyZUFyci5pbmNsdWRlcyhhcmdzLmRhdGFbY29sSW5kZXhdLmFjdHVhbFRleHQpICYmXHJcblx0XHRcdFx0YXJncy5kYXRhW2NvbEluZGV4XS5zdHlsZVxyXG5cdFx0XHQpIHtcclxuXHRcdFx0XHRhcmdzLmNlbGwuc3R5bGUuY3NzVGV4dCArPSBgYmFja2dyb3VuZC1jb2xvcjogJHthcmdzLmRhdGFbY29sSW5kZXhdLnN0eWxlLmJhY2tncm91bmRDb2xvcn0gIWltcG9ydGFudGA7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKGFyZ3MuZGF0YSAmJiBhcmdzLmRhdGFbMF0uZm9ybWF0dGVkVGV4dCA9PT0gXCJHcmFuZCBUb3RhbFwiKVxyXG5cdFx0XHRcdGFyZ3MuY2VsbC5jbGFzc0xpc3QuYWRkKFwiZS1jdXN0b21jbGFzc1wiKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoYXJncy5kYXRhICYmIGFyZ3MuZGF0YVswXS5mb3JtYXR0ZWRUZXh0ID09PSBcIkdyYW5kIFRvdGFsXCIpIHtcclxuXHRcdFx0YXJncy5jZWxsLmNsYXNzTGlzdC5hZGQoXCJncmFuZC1jbGFzc1wiKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGlmIChyb3dJbmRleCAlIDIpIHtcclxuXHRcdFx0XHRhcmdzLmNlbGwuY2xhc3NMaXN0LmFkZChcIm9kZC1jbGFzc1wiKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRhcmdzLmNlbGwuY2xhc3NMaXN0LmFkZChcImV2ZW4tY2xhc3NcIik7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvL2dldCBzb3J0aW5nIGRhdGFcclxuXHRcdGlmICh0aGlzLmZsYWcpIHtcclxuXHRcdFx0dGhpcy5mbGFnID0gZmFsc2U7XHJcblx0XHRcdHRoaXMuY29uZmlnLnZhbHVlU29ydFNldHRpbmdzID1cclxuXHRcdFx0XHR0aGlzLnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy52YWx1ZVNvcnRTZXR0aW5nc1tcclxuXHRcdFx0XHRcdFwicHJvcGVydGllc1wiXHJcblx0XHRcdFx0XTtcclxuXHRcdFx0dGhpcy5wb3J0bGV0LmNvbmZpZyA9IEpTT04uc3RyaW5naWZ5KHRoaXMuY29uZmlnKTtcclxuXHRcdH1cclxuXHRcdC8vY3VzdG9taXplIHRoZSBoZWFkZXIgdGV4dFxyXG5cdFx0aWYgKHRoaXMucGl2b3RPYmouZGF0YVNvdXJjZVNldHRpbmdzLnJvd3MubGVuZ3RoID09PSAwKSB7XHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHRhcmdzLmRhdGEgJiZcclxuXHRcdFx0XHRhcmdzLmRhdGFbY29sSW5kZXhdICYmXHJcblx0XHRcdFx0YXJncy5kYXRhW2NvbEluZGV4XS5heGlzID09PSBcInJvd1wiXHJcblx0XHRcdCkge1xyXG5cdFx0XHRcdGFyZ3MuY2VsbC5xdWVyeVNlbGVjdG9yKFwiLmUtY2VsbHZhbHVlXCIpLmlubmVyVGV4dCA9XHJcblx0XHRcdFx0XHRhcmdzLmRhdGFbY29sSW5kZXhdLmZvcm1hdHRlZFRleHQ7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvLyBTTVAyLTI5MTIgc3VidG90YWzlrZfkvZPliqDnspdcclxuXHRcdGlmIChcclxuXHRcdFx0dGhpcy5waXZvdE9iai5kYXRhU291cmNlU2V0dGluZ3Mucm93cy5sZW5ndGggJiZcclxuXHRcdFx0YXJncy5kYXRhW2NvbEluZGV4XSAmJlxyXG5cdFx0XHRhcmdzLmRhdGFbMF0ubGV2ZWwgIT09XHJcblx0XHRcdFx0dGhpcy5waXZvdE9iai5kYXRhU291cmNlU2V0dGluZ3Mucm93cy5sZW5ndGggLSAxICYmXHJcblx0XHRcdGFyZ3MuZGF0YVtjb2xJbmRleF0ucm93SGVhZGVycyAhPT0gXCJcIiAmJlxyXG5cdFx0XHRhcmdzLmRhdGFbY29sSW5kZXhdLmF4aXMgPT0gXCJ2YWx1ZVwiXHJcblx0XHQpIHtcclxuXHRcdFx0YXJncy5jZWxsLmNsYXNzTGlzdC5hZGQoXCJlLWN1c3RvbWNsYXNzXCIpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBoZWFkZXJDZWxsKGFyZ3M6IGFueSk6IHZvaWQge1xyXG5cdFx0KHRoaXMucGl2b3RPYmoucmVuZGVyTW9kdWxlIGFzIGFueSkuY29sdW1uQ2VsbEJvdW5kRXZlbnQoYXJncyk7XHJcblx0XHRpZiAodGhpcy5waXZvdE9iai5kYXRhU291cmNlU2V0dGluZ3MuY29sdW1ucy5sZW5ndGggPT09IDApIHtcclxuXHRcdFx0bGV0IG5vZGUgPSBhcmdzLm5vZGUucXVlcnlTZWxlY3RvcihcclxuXHRcdFx0XHRcIi5lLWhlYWRlcmNlbGxkaXYgLmUtaGVhZGVydGV4dFwiXHJcblx0XHRcdCk7XHJcblx0XHRcdGlmIChub2RlKSBub2RlLmlubmVyVGV4dCA9IGFyZ3MuY2VsbC5jb2x1bW4uaGVhZGVyVGV4dDtcclxuXHRcdH1cclxuXHRcdGNvbnN0IHRleHRBbGlnbiA9IGFyZ3MuY2VsbC5jb2x1bW4udGV4dEFsaWduO1xyXG5cdFx0YXJncy5jZWxsLmNvbHVtbi5oZWFkZXJUZXh0QWxpZ24gPSB0ZXh0QWxpZ247XHJcblx0XHRhcmdzLm5vZGUuc3R5bGUudGV4dEFsaWduID0gdGV4dEFsaWduID09PSBcIlJpZ2h0XCIgPyBcInJpZ2h0XCIgOiBcImxlZnRcIjsgLy8gQWxpZ24gcmlnaHQgZm9yIG51bWVyaWMgY29sdW1uc1xyXG5cdFx0aWYgKHRleHRBbGlnbiA9PT0gXCJSaWdodFwiKSB7XHJcblx0XHRcdGFyZ3Mubm9kZS5jbGFzc0xpc3QuYWRkKFwiaGVhZGVyLWFsaWduLXJpZ2h0XCIpO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgZGF0YUJvdW5kKGUpIHtcclxuXHRcdGlmICh0aGlzLmlzSW5pdCkge1xyXG5cdFx0XHR0aGlzLmlzSW5pdCA9IGZhbHNlO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy5ncmFuZFRvdGFscyA9IHt9O1xyXG5cdFx0dGhpcy5zdWJUb3RhbHMgPSB7fTtcclxuXHRcdGlmICh0aGlzLnBpdm90T2JqLmdyaWQpIHtcclxuXHRcdFx0dGhpcy5waXZvdE9iai5ncmlkLnJlc2l6ZVN0b3AgPSB0aGlzLnJlc2l6ZVN0b3AuYmluZCh0aGlzKTtcclxuXHRcdH1cclxuXHRcdGlmICh0aGlzLnBpdm90T2JqKSB7XHJcblx0XHRcdHZhciBpbmRleCA9IFtdO1xyXG5cdFx0XHQvLyBHZXQgdGhlIGVtcHR5IHJvdyBoZWFkZXJzIGhlcmUuXHJcblx0XHRcdHZhciBlbXB0eVJvd0hlYWRlcjogYW55ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcclxuXHRcdFx0XHQndGRbYXJpYS1sYWJlbD1cIiBjb2x1bW4gaGVhZGVyIFwiXSdcclxuXHRcdFx0KTtcclxuXHRcdFx0Zm9yICh2YXIgZWxlIG9mIGVtcHR5Um93SGVhZGVyKSB7XHJcblx0XHRcdFx0aWYgKGVsZSkge1xyXG5cdFx0XHRcdFx0aW5kZXgucHVzaChlbGUuZ2V0QXR0cmlidXRlKFwiaW5kZXhcIikpO1xyXG5cdFx0XHRcdFx0Ly8gUmVtb3ZlIGFsbCB0aGUgZW1wdHkgcm93IGhlYWRlcnMgaGVyZS5cclxuXHRcdFx0XHRcdGVsZS5jbG9zZXN0KFwidHJcIikucmVtb3ZlKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgaW5kZXgubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHQvLyBHZXQgdGhlIGVtcHR5IHZhbHVlcyBoZXJlLlxyXG5cdFx0XHRcdHZhciBlbXB0eVZhbHVlcyA9IHRoaXMucGl2b3RPYmouZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFxyXG5cdFx0XHRcdFx0YHRkW2luZGV4PVwiJHtpbmRleFtpXX1cIl1gXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0XHRpZiAoZW1wdHlWYWx1ZXNbMF0pIHtcclxuXHRcdFx0XHRcdC8vIFJlbW92ZSBhbGwgdGhlIGVtcHR5IHZhbHVlIHJvd3MgaGVyZS5cclxuXHRcdFx0XHRcdGVtcHR5VmFsdWVzWzBdLmNsb3Nlc3QoXCJ0clwiKS5yZW1vdmUoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdGlmIChcclxuXHRcdFx0dGhpcy5maWVsZGxpc3RPYmogJiZcclxuXHRcdFx0dGhpcy5maWVsZGxpc3RPYmoucGl2b3RCdXR0b25Nb2R1bGUgJiZcclxuXHRcdFx0dGhpcy5maWVsZGxpc3RPYmoucGl2b3RCdXR0b25Nb2R1bGUubWVudU9wdGlvblxyXG5cdFx0KSB7XHJcblx0XHRcdChcclxuXHRcdFx0XHR0aGlzLmZpZWxkbGlzdE9iai5waXZvdEJ1dHRvbk1vZHVsZS5tZW51T3B0aW9uIGFzIGFueVxyXG5cdFx0XHQpLnN0cmluZ0FnZ3JlZ2F0ZVR5cGVzID0gW1xyXG5cdFx0XHRcdFwiQ291bnRcIixcclxuXHRcdFx0XHRcIkRpc3RpbmN0Q291bnRcIixcclxuXHRcdFx0XHRcIkZpcnN0XCIsXHJcblx0XHRcdFx0XCJMYXN0XCIsXHJcblx0XHRcdF07XHJcblx0XHR9XHJcblx0XHRpZiAoXHJcblx0XHRcdHRoaXMucGl2b3RPYmoucGl2b3RCdXR0b25Nb2R1bGUgJiZcclxuXHRcdFx0dGhpcy5waXZvdE9iai5waXZvdEJ1dHRvbk1vZHVsZS5tZW51T3B0aW9uXHJcblx0XHQpIHtcclxuXHRcdFx0KFxyXG5cdFx0XHRcdHRoaXMucGl2b3RPYmoucGl2b3RCdXR0b25Nb2R1bGUubWVudU9wdGlvbiBhcyBhbnlcclxuXHRcdFx0KS5zdHJpbmdBZ2dyZWdhdGVUeXBlcyA9IFtcclxuXHRcdFx0XHRcIkNvdW50XCIsXHJcblx0XHRcdFx0XCJEaXN0aW5jdENvdW50XCIsXHJcblx0XHRcdFx0XCJGaXJzdFwiLFxyXG5cdFx0XHRcdFwiTGFzdFwiLFxyXG5cdFx0XHRdO1xyXG5cdFx0fVxyXG5cdFx0bGV0IGFsbFN1bW1hcnlUeXBlID0gQUxMX0FHR1JFR0FURV9UWVBFUyBhcyBhbnk7XHJcblx0XHR0aGlzLnBpdm90T2JqLmdldEFsbFN1bW1hcnlUeXBlID0gZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRyZXR1cm4gYWxsU3VtbWFyeVR5cGU7XHJcblx0XHR9O1xyXG5cdFx0aWYgKHRoaXMuZmllbGRsaXN0T2JqKSB7XHJcblx0XHRcdHRoaXMuZmllbGRsaXN0T2JqLmFnZ3JlZ2F0ZVR5cGVzID0gYWxsU3VtbWFyeVR5cGU7XHJcblx0XHRcdHRoaXMuZmllbGRsaXN0T2JqLmdldEFsbFN1bW1hcnlUeXBlID0gZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdHJldHVybiBhbGxTdW1tYXJ5VHlwZTtcclxuXHRcdFx0fTtcclxuXHRcdH1cclxuXHRcdHRoaXMuc2V0VmFsdWVJdGVtRGF0YSgpO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBzZXRWYWx1ZUl0ZW1EYXRhKCkge1xyXG5cdFx0c2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdGNvbnN0IGZpZWxkRG9tID0gdGhpcy5maWVsZGxpc3RPYmouZmllbGRMaXN0U3Bpbm5lckVsZW1lbnQ7XHJcblx0XHRcdHRoaXMuZGF0YVNvdXJjZVNldHRpbmdzLnZhbHVlcy5mb3JFYWNoKCh2YWx1ZTogYW55KSA9PiB7XHJcblx0XHRcdFx0aWYgKHZhbHVlLnR5cGUgIT09IFwiRmlyc3RcIiAmJiB2YWx1ZS50eXBlICE9PSBcIkxhc3RcIikge1xyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRjb25zdCB2YWx1ZXNEb20gPSBmaWVsZERvbS5xdWVyeVNlbGVjdG9yKFxyXG5cdFx0XHRcdFx0YC5lLXZhbHVlcyAuJHt2YWx1ZS5uYW1lfSAuZS1wdnQtYnRuLWNvbnRlbnRgXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHR2YWx1ZXNEb20uaW5uZXJIVE1MICE9PSBgJHt2YWx1ZS50eXBlfSBvZiAke3ZhbHVlLmNhcHRpb259YFxyXG5cdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0dmFsdWVzRG9tLmlubmVySFRNTCA9IGAke3ZhbHVlLnR5cGV9IG9mICR7dmFsdWUuY2FwdGlvbn1gO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgY2FsY3VsYXRlZENlbGxTZXRzKGFyZ3MsIGN1ckZpZWxkcykge1xyXG5cdFx0bGV0IG1hdGNoRmllbGRzID0gY3VyRmllbGRzW1wibWF0Y2hGaWVsZHNcIl07XHJcblx0XHRsZXQgZm9ybXVsYSA9IGN1ckZpZWxkc1tcImZvcm11bGFcIl07XHJcblx0XHRsZXQgdmFsdWUgPSAwO1xyXG5cdFx0bGV0IHJvd3MgPSB0aGlzLnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy5yb3dzO1xyXG5cdFx0bGV0IGludmFsaWRUeXBlcyA9IFtcInN0cmluZ1wiLCBcIm52YXJjaGFyXCIsIFwiZGF0ZVwiLCBcImRhdGV0aW1lXCJdO1xyXG5cdFx0bGV0IGlzSW52YWxpZCA9IG1hdGNoRmllbGRzLnNvbWUoKGYpID0+XHJcblx0XHRcdGludmFsaWRUeXBlcy5pbmNsdWRlcyhcclxuXHRcdFx0XHR0aGlzLmNvbmZpZ0ZpZWxkcy5maWx0ZXIoKGVsKSA9PiBlbC5jb2xOYW1lID09PSBmLm1hdGNoV29yZClbMF1bXHJcblx0XHRcdFx0XHRcImRhdGFUeXBlXCJcclxuXHRcdFx0XHRdXHJcblx0XHRcdClcclxuXHRcdCk7XHJcblx0XHRsZXQgY3VycmVudHJvd0NlbGxUeXBlID0gYXJncy5yb3dDZWxsVHlwZTtcclxuXHRcdGlmIChpc0ludmFsaWQpIHJldHVybiBcIi1cIjtcclxuXHRcdGlmIChcclxuXHRcdFx0YXJncy5yb3dDZWxsVHlwZSA9PT0gXCJzdWJUb3RhbFwiIHx8XHJcblx0XHRcdGFyZ3Mucm93Q2VsbFR5cGUgPT09IFwiZ3JhbmRUb3RhbFwiXHJcblx0XHQpIHtcclxuXHRcdFx0bGV0IGNoaWxkSGVhZGVycyA9IFtdO1xyXG5cdFx0XHRsZXQgc3VtID0gMDtcclxuXHRcdFx0bGV0IGNsb25lQ2VsbFNldHMgPSBjbG9uZURlZXAoYXJncy5jZWxsU2V0cyk7XHJcblx0XHRcdGxldCBncm91cE5hbWVBcnJheXMgPSBbXTtcclxuXHRcdFx0Zm9yIChsZXQgaW5kZXggPSBhcmdzLnJvdy5sZXZlbDsgaW5kZXggPCByb3dzLmxlbmd0aDsgaW5kZXgrKykge1xyXG5cdFx0XHRcdGdyb3VwTmFtZUFycmF5cy5wdXNoKHJvd3NbaW5kZXhdLm5hbWUpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgY2xvbmVDZWxsU2V0cy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdGxldCB2YWx1ZXMgPSBbXTtcclxuXHRcdFx0XHRsZXQgaGVhZGVyID0gZ3JvdXBOYW1lQXJyYXlzXHJcblx0XHRcdFx0XHQubWFwKChuYW1lKSA9PiB7XHJcblx0XHRcdFx0XHRcdHZhbHVlcy5wdXNoKGNsb25lQ2VsbFNldHNbaV1bbmFtZV0pO1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gY2xvbmVDZWxsU2V0c1tpXVtuYW1lXTtcclxuXHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0XHQuam9pbihcIi1cIik7XHJcblx0XHRcdFx0aWYgKCEoY2hpbGRIZWFkZXJzIGFzIGFueSkuaW5jbHVkZXMoaGVhZGVyKSkge1xyXG5cdFx0XHRcdFx0Y2hpbGRIZWFkZXJzLnB1c2goaGVhZGVyKTtcclxuXHRcdFx0XHRcdGxldCBmaWx0ZXJPYmo6IGFueSA9IHt9O1xyXG5cdFx0XHRcdFx0Z3JvdXBOYW1lQXJyYXlzLm1hcChcclxuXHRcdFx0XHRcdFx0KG5hbWUsIGkpID0+IChmaWx0ZXJPYmpbbmFtZV0gPSB2YWx1ZXNbaV0pXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0YXJncy5jZWxsU2V0cyA9IF9maWx0ZXIoY2xvbmVDZWxsU2V0cywgZmlsdGVyT2JqKTtcclxuXHRcdFx0XHRcdGFyZ3Mucm93Q2VsbFR5cGUgPSBcInZhbHVlXCI7XHJcblx0XHRcdFx0XHRzdW0gKz0gdGhpcy5jYWxjdWxhdGVkVmFsdWVzKGFyZ3MsIG1hdGNoRmllbGRzLCBmb3JtdWxhKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0YXJncy5yb3dDZWxsVHlwZSA9IGN1cnJlbnRyb3dDZWxsVHlwZTtcclxuXHJcblx0XHRcdC8vIOaaguWtmOW9k+WJjVN1YlRvdGFs77yMIOeUqOS6juaUtue8qeaXtuivu+WPllxyXG5cdFx0XHRsZXQgcHJlZml4SGVhZGVyID0gdGhpcy5nZXRDYWxjSGVhZGVyKGFyZ3MsIGZvcm11bGEpO1xyXG5cdFx0XHR0aGlzLnVwZGF0ZVRlbXBTdWJ0b3RhbHMocHJlZml4SGVhZGVyLCBzdW0pO1xyXG5cdFx0XHRyZXR1cm4gc3VtO1xyXG5cdFx0fSBlbHNlIGlmIChhcmdzLnJvd0NlbGxUeXBlID09PSBcInZhbHVlXCIpIHtcclxuXHRcdFx0aWYgKGFyZ3Mucm93Lmhhc0NoaWxkKSB7XHJcblx0XHRcdFx0Ly8gY29sbGFwc2Ug6K+75Y+WU3ViVG90YWxcclxuXHRcdFx0XHRsZXQgaGVhZGVyID0gdGhpcy5nZXRDYWxjSGVhZGVyKGFyZ3MsIGZvcm11bGEpO1xyXG5cdFx0XHRcdGxldCBpbmRleCA9IHRoaXMudGVtcFN1YnRvdGFscy5maW5kSW5kZXgoXHJcblx0XHRcdFx0XHQoaXRlbSkgPT4gaXRlbS5yb3dOYW1lID09PSBoZWFkZXJcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHRcdGlmIChpbmRleCA+IC0xKSB7XHJcblx0XHRcdFx0XHR2YWx1ZSA9IHRoaXMudGVtcFN1YnRvdGFsc1tpbmRleF0ucm93VmFsdWU7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdC8vIGV4cGFuZFxyXG5cdFx0XHRcdHZhbHVlID0gdGhpcy5jYWxjdWxhdGVkVmFsdWVzKGFyZ3MsIG1hdGNoRmllbGRzLCBmb3JtdWxhKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHZhbHVlO1xyXG5cdH1cclxuXHJcblx0YWN0aW9uRmFpbHVyZShhcmdzOiBQaXZvdEFjdGlvbkZhaWx1cmVFdmVudEFyZ3MpOiB2b2lkIHtcclxuXHRcdGlmIChhcmdzLmFjdGlvbk5hbWUgPT0gXCJEcmlsbCBkb3duXCIgfHwgYXJncy5hY3Rpb25OYW1lID09IFwiRHJpbGwgdXBcIikge1xyXG5cdFx0XHQvLyBUcmlnZ2VycyB3aGVuIHRoZSBjdXJyZW50IFVJIGFjdGlvbiBmYWlscyB0byBhY2hpZXZlIHRoZSBkZXNpcmVkIHJlc3VsdC5cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHByaXZhdGUgZ2V0Q2FsY0hlYWRlcihhcmdzLCBmb3JtdWxhPykge1xyXG5cdFx0bGV0IGhlYWRlciA9IFwiXCI7XHJcblx0XHRsZXQgcm93cyA9IHRoaXMucGl2b3RPYmouZGF0YVNvdXJjZVNldHRpbmdzLnJvd3M7XHJcblx0XHRsZXQgZ3JvdXBOYW1lQXJyYXlzID0gW107XHJcblx0XHRmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYXJncy5yb3cubGV2ZWw7IGluZGV4KyspIHtcclxuXHRcdFx0Z3JvdXBOYW1lQXJyYXlzLnB1c2gocm93c1tpbmRleF0ubmFtZSk7XHJcblx0XHR9XHJcblx0XHRoZWFkZXIgPSBncm91cE5hbWVBcnJheXMubGVuZ3RoXHJcblx0XHRcdD8gZ3JvdXBOYW1lQXJyYXlzXHJcblx0XHRcdFx0XHQubWFwKChuYW1lKSA9PiB7XHJcblx0XHRcdFx0XHRcdHJldHVybiBhcmdzLmNlbGxTZXRzWzBdW25hbWVdO1xyXG5cdFx0XHRcdFx0fSlcclxuXHRcdFx0XHRcdC5qb2luKFwiLVwiKSArXHJcblx0XHRcdCAgXCItXCIgK1xyXG5cdFx0XHQgIGFyZ3Mucm93LmFjdHVhbFRleHRcclxuXHRcdFx0OiBhcmdzLnJvdy5hY3R1YWxUZXh0O1xyXG5cdFx0aWYgKGZvcm11bGEpIGhlYWRlciArPSBcIl9fX1wiICsgZm9ybXVsYTtcclxuXHRcdHJldHVybiBoZWFkZXI7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIHVwZGF0ZVRlbXBTdWJ0b3RhbHMocm93TmFtZSwgcm93VmFsdWUpIHtcclxuXHRcdGxldCBpbmRleCA9IHRoaXMudGVtcFN1YnRvdGFscy5maW5kSW5kZXgoXHJcblx0XHRcdChpdGVtKSA9PiBpdGVtLnJvd05hbWUgPT09IHJvd05hbWVcclxuXHRcdCk7XHJcblx0XHRsZXQgdGVtcDogYW55ID0ge307XHJcblx0XHR0ZW1wLnJvd05hbWUgPSByb3dOYW1lO1xyXG5cdFx0dGVtcC5yb3dWYWx1ZSA9IHJvd1ZhbHVlO1xyXG5cdFx0aWYgKGluZGV4ID4gLTEpIHtcclxuXHRcdFx0dGhpcy50ZW1wU3VidG90YWxzLnNwbGljZShpbmRleCwgMSwgdGVtcCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLnRlbXBTdWJ0b3RhbHMucHVzaCh0ZW1wKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHByaXZhdGUgY2FsY3VsYXRlZFZhbHVlcyhhcmdzLCBtYXRjaEZpZWxkcywgZm9ybXVsYSkge1xyXG5cdFx0aWYgKG1hdGNoRmllbGRzLmxlbmd0aCkge1xyXG5cdFx0XHRsZXQgY2FsY3VsZWRNYXRjaEZpZWxkcyA9IG1hdGNoRmllbGRzLm1hcCgoZikgPT4ge1xyXG5cdFx0XHRcdHN3aXRjaCAoZi5tYXRjaE1ldGhvZCkge1xyXG5cdFx0XHRcdFx0Y2FzZSBcIkZpcnN0XCI6XHJcblx0XHRcdFx0XHRjYXNlIFwiTGFzdFwiOlxyXG5cdFx0XHRcdFx0XHRmLnJlcGxhY2VWYWx1ZSA9IHRoaXMuY2FsY3VsYXRlZEZpc3RMYXN0KFxyXG5cdFx0XHRcdFx0XHRcdGFyZ3MsXHJcblx0XHRcdFx0XHRcdFx0Zi5tYXRjaE1ldGhvZCxcclxuXHRcdFx0XHRcdFx0XHRmLm1hdGNoV29yZFxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdGNhc2UgXCJNYXhcIjpcclxuXHRcdFx0XHRcdFx0Zi5yZXBsYWNlVmFsdWUgPSBtYXhCeShhcmdzLmNlbGxTZXRzLCAobykgPT5cclxuXHRcdFx0XHRcdFx0XHROdW1iZXIob1tmLm1hdGNoV29yZF0pXHJcblx0XHRcdFx0XHRcdClbZi5tYXRjaFdvcmRdO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdGNhc2UgXCJNaW5cIjpcclxuXHRcdFx0XHRcdFx0Zi5yZXBsYWNlVmFsdWUgPSBtaW5CeShhcmdzLmNlbGxTZXRzLCAobykgPT5cclxuXHRcdFx0XHRcdFx0XHROdW1iZXIob1tmLm1hdGNoV29yZF0pXHJcblx0XHRcdFx0XHRcdClbZi5tYXRjaFdvcmRdO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdGNhc2UgXCJTdW1cIjpcclxuXHRcdFx0XHRcdFx0Zi5yZXBsYWNlVmFsdWUgPSBzdW1CeShhcmdzLmNlbGxTZXRzLCAobykgPT5cclxuXHRcdFx0XHRcdFx0XHROdW1iZXIob1tmLm1hdGNoV29yZF0pXHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdC8vIFNNUDItNDA5NCBVbmljb3JuIC0gTDMgQWRqdXN0ZWQgTkFWIHZhbHVlIGlzc3Vlc1xyXG5cdFx0XHRcdFx0XHRmLnJlcGxhY2VWYWx1ZSA9XHJcblx0XHRcdFx0XHRcdFx0Zi5yZXBsYWNlVmFsdWUgJiYgZi5yZXBsYWNlVmFsdWUudG9GaXhlZCgxMCk7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0Y2FzZSBcIkF2Z1wiOlxyXG5cdFx0XHRcdFx0XHRmLnJlcGxhY2VWYWx1ZSA9IG1lYW5CeShhcmdzLmNlbGxTZXRzLCAobykgPT5cclxuXHRcdFx0XHRcdFx0XHROdW1iZXIob1tmLm1hdGNoV29yZF0pXHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJldHVybiBmO1xyXG5cdFx0XHR9KTtcclxuXHRcdFx0bGV0IHJlc3VsdEZvcm11bGEgPSBmb3JtdWxhO1xyXG5cdFx0XHRpZiAoY2FsY3VsZWRNYXRjaEZpZWxkcy5sZW5ndGgpIHtcclxuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGNhbGN1bGVkTWF0Y2hGaWVsZHMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRcdHJlc3VsdEZvcm11bGEgPSByZXN1bHRGb3JtdWxhLnJlcGxhY2UoXHJcblx0XHRcdFx0XHRcdGNhbGN1bGVkTWF0Y2hGaWVsZHNbaV0ubWF0Y2hTdHIsXHJcblx0XHRcdFx0XHRcdFwiKFwiICsgY2FsY3VsZWRNYXRjaEZpZWxkc1tpXS5yZXBsYWNlVmFsdWUgKyBcIilcIlxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRsZXQgcmVzdWx0ID0gbmV3IEZ1bmN0aW9uKFxyXG5cdFx0XHRcdFx0XCJyZXR1cm4gXCIgKyByZXN1bHRGb3JtdWxhLnJlcGxhY2UoL1teLTw+PzooKVxcZC8qKy5dL2csIFwiXCIpXHJcblx0XHRcdFx0KSgpO1xyXG5cdFx0XHRcdGlmIChpc05hTihyZXN1bHQpIHx8ICFpc0Zpbml0ZShyZXN1bHQpKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gMDtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XHJcblx0XHRcdFx0cmV0dXJuIE5hTjtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIDA7XHJcblx0fVxyXG5cclxuXHR0b3RhbEZvcm1hdHRlZCA9IHt9O1xyXG5cdHB1YmxpYyBhZ2dyZWdhdGVDZWxsSW5mbyhhcmdzKSB7XHJcblx0XHRsZXQgYXNPZkRhdGUgPSB0aGlzLnBiZi50aW1lKHRoaXMuZGFzaGJvYXJkLmFzT2ZEYXRlKTtcclxuXHRcdC8vIGlmIGNhbGN1bGF0ZWQgZmllbGRcclxuXHRcdGlmIChhcmdzLmFnZ3JlZ2F0ZVR5cGUgPT0gXCJDYWxjdWxhdGVkRmllbGRcIikge1xyXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY3VzdG9tQ2FsY3VsYXRlZEZpZWxkcy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdGlmIChhcmdzLmZpZWxkTmFtZSA9PSB0aGlzLmN1c3RvbUNhbGN1bGF0ZWRGaWVsZHNbaV0ubmFtZSkge1xyXG5cdFx0XHRcdFx0YXJncy52YWx1ZSA9IHRoaXMuY2FsY3VsYXRlZENlbGxTZXRzKFxyXG5cdFx0XHRcdFx0XHRhcmdzLFxyXG5cdFx0XHRcdFx0XHR0aGlzLmN1c3RvbUNhbGN1bGF0ZWRGaWVsZHNbaV1cclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKFxyXG5cdFx0XHRbXHJcblx0XHRcdFx0XCJDYWxjdWxhdGVJUlJcIixcclxuXHRcdFx0XHRcIkNhbGN1bGF0ZUlSUkJlZm9yZUNhcnJpZWRcIixcclxuXHRcdFx0XHRcIkNhbGN1bGF0ZUlSUklSUkRhdGVcIixcclxuXHRcdFx0XHRcIkNhbGN1bGF0ZUlSUk1URFwiLFxyXG5cdFx0XHRcdFwiQ2FsY3VsYXRlSVJSUVREXCIsXHJcblx0XHRcdFx0XCJDYWxjdWxhdGVJUlJZVERcIixcclxuXHRcdFx0XS5pbmNsdWRlcyhhcmdzLmFnZ3JlZ2F0ZVR5cGUpXHJcblx0XHQpIHtcclxuXHRcdFx0Ly8gY29uc29sZS5sb2coXCI9PT09PT09PT09PT09PT09PT09PT09PT09PVwiKTtcclxuXHRcdFx0Ly8gY29uc29sZS5sb2coXCJhcmdzOlwiLCBhcmdzKTtcclxuXHRcdFx0bGV0IHZhbHVlRmllbGQ7XHJcblx0XHRcdGxldCBkYXRlRmllbGQ7XHJcblx0XHRcdGxldCBzdGFydERhdGU7XHJcblx0XHRcdGxldCBlbmREYXRlO1xyXG5cdFx0XHRzd2l0Y2ggKGFyZ3MuYWdncmVnYXRlVHlwZSkge1xyXG5cdFx0XHRcdGNhc2UgXCJDYWxjdWxhdGVJUlJcIjpcclxuXHRcdFx0XHRcdHZhbHVlRmllbGQgPSBcIklSUkFkalZhbHVlXCI7XHJcblx0XHRcdFx0XHRkYXRlRmllbGQgPSBcIklSUkRhdGVcIjtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdGNhc2UgXCJDYWxjdWxhdGVJUlJNVERcIjpcclxuXHRcdFx0XHRcdHN0YXJ0RGF0ZSA9IG1vbWVudChhc09mRGF0ZSlcclxuXHRcdFx0XHRcdFx0LnN0YXJ0T2YoXCJtb250aFwiKVxyXG5cdFx0XHRcdFx0XHQuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcclxuXHRcdFx0XHRcdGVuZERhdGUgPSBtb21lbnQoYXNPZkRhdGUpLmZvcm1hdChcIllZWVktTU0tRERcIik7XHJcblx0XHRcdFx0XHR2YWx1ZUZpZWxkID0gXCJJUlJBZGpWYWx1ZVwiO1xyXG5cdFx0XHRcdFx0ZGF0ZUZpZWxkID0gXCJJUlJEYXRlXCI7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRjYXNlIFwiQ2FsY3VsYXRlSVJSUVREXCI6XHJcblx0XHRcdFx0XHRzdGFydERhdGUgPSBtb21lbnQoYXNPZkRhdGUpXHJcblx0XHRcdFx0XHRcdC5zdGFydE9mKFwicXVhcnRlclwiKVxyXG5cdFx0XHRcdFx0XHQuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcclxuXHRcdFx0XHRcdGVuZERhdGUgPSBtb21lbnQoYXNPZkRhdGUpLmZvcm1hdChcIllZWVktTU0tRERcIik7XHJcblx0XHRcdFx0XHR2YWx1ZUZpZWxkID0gXCJJUlJBZGpWYWx1ZVwiO1xyXG5cdFx0XHRcdFx0ZGF0ZUZpZWxkID0gXCJJUlJEYXRlXCI7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRjYXNlIFwiQ2FsY3VsYXRlSVJSWVREXCI6XHJcblx0XHRcdFx0XHRzdGFydERhdGUgPSBtb21lbnQoYXNPZkRhdGUpXHJcblx0XHRcdFx0XHRcdC5zdGFydE9mKFwieWVhclwiKVxyXG5cdFx0XHRcdFx0XHQuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcclxuXHRcdFx0XHRcdGVuZERhdGUgPSBtb21lbnQoYXNPZkRhdGUpLmZvcm1hdChcIllZWVktTU0tRERcIik7XHJcblx0XHRcdFx0XHR2YWx1ZUZpZWxkID0gXCJJUlJBZGpWYWx1ZVwiO1xyXG5cdFx0XHRcdFx0ZGF0ZUZpZWxkID0gXCJJUlJEYXRlXCI7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRjYXNlIFwiQ2FsY3VsYXRlSVJSSVJSRGF0ZVwiOlxyXG5cdFx0XHRcdFx0dmFsdWVGaWVsZCA9IFwiSVJSQWRqVmFsdWVcIjtcclxuXHRcdFx0XHRcdGRhdGVGaWVsZCA9IFwiQ2FsY3VsYXRlSVJSRGF0ZVwiO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0Y2FzZSBcIkNhbGN1bGF0ZUlSUkJlZm9yZUNhcnJpZWRcIjpcclxuXHRcdFx0XHRcdHZhbHVlRmllbGQgPSBcIklSUkFkalZhbHVlQmVmb3JlQ2FycnlcIjtcclxuXHRcdFx0XHRcdGRhdGVGaWVsZCA9IFwiSVJSRGF0ZVwiO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHR9XHJcblx0XHRcdGxldCBOQVZBZGogPSAwO1xyXG5cdFx0XHRsZXQgdmFsdWVzID0gW107XHJcblx0XHRcdGxldCBiZWZvcmVTdGFydE5BVkFkaiA9IDA7IC8vIOWtmOWCqOS4iuS4gOS4qumYtuauteeahE5BVkFkauaAu+WSjFxyXG5cdFx0XHRsZXQgYmVmb3JlU3RhcnRWYWx1ZXMgPSBbXTsgLy8g5a2Y5YKo5LiK5LiA5Liq6Zi25q6155qE57Sv6K6h6ZuG5ZCIICjlj6rmmK/kuLrkuobmiZPljbDvvIzmsqHmnInlrp7pmYXnlKjpgJQpXHJcblx0XHRcdGxldCBmaWVsZCA9IHRoaXMuY29uZmlnRmllbGRzLmZpbHRlcihcclxuXHRcdFx0XHQoZWwpID0+XHJcblx0XHRcdFx0XHRlbC5jb2xOYW1lID09PVxyXG5cdFx0XHRcdFx0dGhpcy5kYXNoYm9hcmRQb3JsZXRzU2VydmljZS5nZXRBZ2dyZWdhdGVUeXBlKFxyXG5cdFx0XHRcdFx0XHRhcmdzLmFnZ3JlZ2F0ZVR5cGVcclxuXHRcdFx0XHRcdClcclxuXHRcdFx0KTtcclxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzLmNlbGxTZXRzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0Y29uc3QgZGF0YSA9IHtcclxuXHRcdFx0XHRcdGFtb3VudDogYXJncy5jZWxsU2V0c1tpXVtcIklSUkFtb3VudFwiXSxcclxuXHRcdFx0XHRcdGRhdGU6XHJcblx0XHRcdFx0XHRcdHRoaXMucGJmLnRpbWUoYXJncy5jZWxsU2V0c1tpXVtkYXRlRmllbGRdKSA9PT1cclxuXHRcdFx0XHRcdFx0XCJJbnZhbGlkIGRhdGVcIlxyXG5cdFx0XHRcdFx0XHRcdD8gYXNPZkRhdGVcclxuXHRcdFx0XHRcdFx0XHQ6IHRoaXMucGJmLnRpbWUoYXJncy5jZWxsU2V0c1tpXVtkYXRlRmllbGRdKSxcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHRcdC8vIFNNUDItMTY5MjBcclxuXHRcdFx0XHQvLyBJZiBJUlIgRGF0ZSA+IERhc2hib2FyZCByZXBvcnQgZGF0ZSA9IFRha2VzIGFzIG9mIGRhc2hib2FyZCByZXBvcnQgZGF0ZVxyXG5cdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdGFyZ3MuYWdncmVnYXRlVHlwZSA9PT0gXCJDYWxjdWxhdGVJUlJJUlJEYXRlXCIgJiZcclxuXHRcdFx0XHRcdGFzT2ZEYXRlIDwgdGhpcy5wYmYudGltZShhcmdzLmNlbGxTZXRzW2ldW2RhdGVGaWVsZF0pXHJcblx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRkYXRhLmRhdGUgPSBhc09mRGF0ZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0TkFWQWRqICs9IGFyZ3MuY2VsbFNldHNbaV1bdmFsdWVGaWVsZF07XHJcblx0XHRcdFx0Ly8gU01QMi0xNzIxOSBNVEQgUVREIFlURCBJUlJcclxuXHRcdFx0XHRpZiAoc3RhcnREYXRlICYmIGVuZERhdGUpIHtcclxuXHRcdFx0XHRcdGlmIChtb21lbnQoZGF0YS5kYXRlKS5pc0JlZm9yZShzdGFydERhdGUpKSB7XHJcblx0XHRcdFx0XHRcdGRhdGFbdmFsdWVGaWVsZF0gPSBhcmdzLmNlbGxTZXRzW2ldW3ZhbHVlRmllbGRdO1xyXG5cdFx0XHRcdFx0XHRiZWZvcmVTdGFydFZhbHVlcy5wdXNoKGRhdGEpO1xyXG5cdFx0XHRcdFx0XHRiZWZvcmVTdGFydE5BVkFkaiArPSBkYXRhW3ZhbHVlRmllbGRdO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHQhbW9tZW50KGRhdGEuZGF0ZSkuaXNCZXR3ZWVuKFxyXG5cdFx0XHRcdFx0XHRcdHN0YXJ0RGF0ZSxcclxuXHRcdFx0XHRcdFx0XHRlbmREYXRlLFxyXG5cdFx0XHRcdFx0XHRcdG51bGwsXHJcblx0XHRcdFx0XHRcdFx0XCJbXVwiXHJcblx0XHRcdFx0XHRcdClcclxuXHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKGRhdGEuYW1vdW50ICE9IDApIHtcclxuXHRcdFx0XHRcdHZhbHVlcy5wdXNoKGRhdGEpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoTkFWQWRqID4gMC4wMDAxIHx8IE5BVkFkaiA8IC0wLjAwMDEpIHtcclxuXHRcdFx0XHR2YWx1ZXMucHVzaCh7XHJcblx0XHRcdFx0XHRhbW91bnQ6IE5BVkFkaixcclxuXHRcdFx0XHRcdGRhdGU6IGFzT2ZEYXRlLFxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblx0XHRcdHZhbHVlcyA9IHNvcnRCeSh2YWx1ZXMsIFwiZGF0ZVwiKTtcclxuXHRcdFx0Ly8g5aaC5p6c5pivTVRELFFURCxZVEQg5YiZ6ZyA6KaB5oqK5b2T5YmN6Zi25q615Lul5YmN55qE5omA5pyJ5pWw5o2u6L+b6KGM5rGH5oC777yM5Yqg5YWl6K6h566XXHJcblx0XHRcdGlmIChzdGFydERhdGUgJiYgZW5kRGF0ZSkge1xyXG5cdFx0XHRcdHZhbHVlcy51bnNoaWZ0KHtcclxuXHRcdFx0XHRcdGFtb3VudDogLWJlZm9yZVN0YXJ0TkFWQWRqLCAvLyDlvIDlp4vnmoTmlbDmja7pnIDopoHlj5blj41cclxuXHRcdFx0XHRcdGRhdGU6IHRoaXMucGJmLnRpbWUoc3RhcnREYXRlKSxcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cdFx0XHQvLyBjb25zb2xlLmxvZyhcImJlZm9yZVN0YXJ0VmFsdWVzOlwiLCBiZWZvcmVTdGFydFZhbHVlcyk7XHJcblx0XHRcdC8vIGNvbnNvbGUubG9nKFwidmFsdWVzOlwiLCB2YWx1ZXMpO1xyXG5cdFx0XHRpZiAodmFsdWVzLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRsZXQgZ3Vlc3MgPSAwLjE7XHJcblx0XHRcdFx0Y29uc3Qgc3VtQW1vdW50ID0gdmFsdWVzXHJcblx0XHRcdFx0XHQubWFwKChpdGVtKSA9PiBpdGVtLmFtb3VudClcclxuXHRcdFx0XHRcdC5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IHByZXYgKyBjdXJyLCAwKTtcclxuXHRcdFx0XHRpZiAoc3VtQW1vdW50IDwgMCkge1xyXG5cdFx0XHRcdFx0Z3Vlc3MgPSAtMC4xO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHQvL1NNUDItMjI0OSBmaXhlZCB0aGUgYmlnIGlyciBpc3N1ZVxyXG5cdFx0XHRcdGlmIChzdW1BbW91bnQgPT09IDApIHtcclxuXHRcdFx0XHRcdGFyZ3MudmFsdWUgPSAwO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRjb25zdCB2YWx1ZUl0ZW1zID0gdmFsdWVzLnNsaWNlKDAsIHZhbHVlcy5sZW5ndGggLSAxKTtcclxuXHRcdFx0XHRcdGNvbnN0IHZhbHVlTGlzdCA9IHZhbHVlSXRlbXMubWFwKChpdGVtKSA9PiBpdGVtLmFtb3VudCk7XHJcblx0XHRcdFx0XHRjb25zdCBkYXRlTGlzdCA9IHZhbHVlSXRlbXMubWFwKChpdGVtKSA9PiBpdGVtLmRhdGUpO1xyXG5cdFx0XHRcdFx0Y29uc3QgbGFzdEl0ZW0gPSB2YWx1ZXNbdmFsdWVzLmxlbmd0aCAtIDFdO1xyXG5cdFx0XHRcdFx0Y29uc3QgbmF2QWRqdXN0ID0gbGFzdEl0ZW0uYW1vdW50O1xyXG5cdFx0XHRcdFx0Y29uc3QgbGF0ZXN0RGF0ZSA9IGxhc3RJdGVtLmRhdGU7XHJcblx0XHRcdFx0XHRsZXQgaXJyID1cclxuXHRcdFx0XHRcdFx0dGhpcy5kYXNoYm9hcmRQb3JsZXRzU2VydmljZS5FeGNlbEZvcm11bGFzLl9DYWxjdWxhdGVYaXJyKFxyXG5cdFx0XHRcdFx0XHRcdHZhbHVlTGlzdCxcclxuXHRcdFx0XHRcdFx0XHRkYXRlTGlzdCxcclxuXHRcdFx0XHRcdFx0XHRuYXZBZGp1c3QsXHJcblx0XHRcdFx0XHRcdFx0bGF0ZXN0RGF0ZVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0YXJncy52YWx1ZSA9IGlyciA9PT0gbnVsbCA/IFwiXCIgOiBpcnI7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGFyZ3MudmFsdWUgPSBcIlwiO1xyXG5cdFx0XHR9XHJcblx0XHRcdC8vIGNvbnNvbGUubG9nKFwiYXJncy52YWx1ZTpcIiwgYXJncy52YWx1ZSk7XHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHR0aGlzLnBpdm90T2JqLmVuZ2luZU1vZHVsZSAmJlxyXG5cdFx0XHRcdHRoaXMucGl2b3RPYmouZW5naW5lTW9kdWxlLmZvcm1hdEZpZWxkc1thcmdzLmZpZWxkTmFtZV1cclxuXHRcdFx0KSB7XHJcblx0XHRcdFx0ZGVsZXRlIHRoaXMucGl2b3RPYmouZW5naW5lTW9kdWxlLmZvcm1hdEZpZWxkc1thcmdzLmZpZWxkTmFtZV07XHJcblx0XHRcdFx0dGhpcy5waXZvdE9iai5lbmdpbmVNb2R1bGUuZm9ybWF0RmllbGRzW2FyZ3MuZmllbGROYW1lXSA9IHtcclxuXHRcdFx0XHRcdG5hbWU6IGFyZ3MuZmllbGROYW1lLFxyXG5cdFx0XHRcdFx0Zm9ybWF0OlxyXG5cdFx0XHRcdFx0XHRmaWVsZC5sZW5ndGggPiAwXHJcblx0XHRcdFx0XHRcdFx0PyBmaWVsZFswXS5mb3JtYXQgJiZcclxuXHRcdFx0XHRcdFx0XHQgIGZpZWxkWzBdLmZvcm1hdC5sZW5ndGggJiZcclxuXHRcdFx0XHRcdFx0XHQgIGZpZWxkWzBdLmZvcm1hdFswXS5mb3JtYXRDaGVja2VkXHJcblx0XHRcdFx0XHRcdFx0XHQ/IHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UucGl2b3RUYWJsZWZvcm1hdFBlcmNlbnQoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZmllbGRbMF0uZm9ybWF0WzBdLnNlbGVjdGVkRm9ybWF0XHJcblx0XHRcdFx0XHRcdFx0XHQgIClcclxuXHRcdFx0XHRcdFx0XHRcdDogdGhpcy5kYXNoYm9hcmRQb3JsZXRzU2VydmljZS5mb3JtYXRQZXJjZW50KFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZpZWxkWzBdLmRwXHJcblx0XHRcdFx0XHRcdFx0XHQgIClcclxuXHRcdFx0XHRcdFx0XHQ6IFwiUDJcIixcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gIFNNUDItMTY1MjAgVFdSIOaciC/lraMv5bm0ICYmIFNNUDItMTY2ODMgVkFSXHJcblx0XHRpZiAoXHJcblx0XHRcdFtcclxuXHRcdFx0XHRcIkNhbGN1bGF0ZVRXUk1URFwiLFxyXG5cdFx0XHRcdFwiQ2FsY3VsYXRlVFdSUVREXCIsXHJcblx0XHRcdFx0XCJDYWxjdWxhdGVUV1JZVERcIixcclxuXHRcdFx0XHRcIkNhbGN1bGF0ZVZBUk1URF85OVwiLFxyXG5cdFx0XHRcdFwiQ2FsY3VsYXRlVkFSUVREXzk5XCIsXHJcblx0XHRcdFx0XCJDYWxjdWxhdGVWQVJZVERfOTlcIixcclxuXHRcdFx0XHRcIkNhbGN1bGF0ZVZBUk1URF85NVwiLFxyXG5cdFx0XHRcdFwiQ2FsY3VsYXRlVkFSUVREXzk1XCIsXHJcblx0XHRcdFx0XCJDYWxjdWxhdGVWQVJZVERfOTVcIixcclxuXHRcdFx0XS5pbmNsdWRlcyhhcmdzLmFnZ3JlZ2F0ZVR5cGUpXHJcblx0XHQpIHtcclxuXHRcdFx0Ly8gY29uc29sZS5sb2coXCI9PT09PT09PT09PT09PT09PT09PT09PT09PVwiKTtcclxuXHRcdFx0Ly8gY29uc29sZS5sb2coXCJhcmdzOlwiLCBhcmdzKTtcclxuXHRcdFx0bGV0IHZhbHVlRmllbGQgPSBcIklSUkFkalZhbHVlXCI7XHJcblx0XHRcdGxldCBkYXRlRmllbGQgPSBcIklSUkRhdGVcIjtcclxuXHRcdFx0bGV0IHRpbWVSYW5nZTtcclxuXHRcdFx0c3dpdGNoIChhcmdzLmFnZ3JlZ2F0ZVR5cGUpIHtcclxuXHRcdFx0XHRjYXNlIFwiQ2FsY3VsYXRlVFdSTVREXCI6XHJcblx0XHRcdFx0Y2FzZSBcIkNhbGN1bGF0ZVZBUk1URF85OVwiOlxyXG5cdFx0XHRcdGNhc2UgXCJDYWxjdWxhdGVWQVJNVERfOTVcIjpcclxuXHRcdFx0XHRcdHRpbWVSYW5nZSA9IFwibW9udGhcIjtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdGNhc2UgXCJDYWxjdWxhdGVUV1JRVERcIjpcclxuXHRcdFx0XHRjYXNlIFwiQ2FsY3VsYXRlVkFSUVREXzk5XCI6XHJcblx0XHRcdFx0Y2FzZSBcIkNhbGN1bGF0ZVZBUlFURF85NVwiOlxyXG5cdFx0XHRcdFx0dGltZVJhbmdlID0gXCJxdWFydGVyXCI7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRjYXNlIFwiQ2FsY3VsYXRlVFdSWVREXCI6XHJcblx0XHRcdFx0Y2FzZSBcIkNhbGN1bGF0ZVZBUllURF85OVwiOlxyXG5cdFx0XHRcdGNhc2UgXCJDYWxjdWxhdGVWQVJZVERfOTVcIjpcclxuXHRcdFx0XHRcdHRpbWVSYW5nZSA9IFwieWVhclwiO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHR9XHJcblx0XHRcdGxldCB2YWx1ZXMgPSBbXTsgLy8g6L+Z5Liq6Zi25q6155qE57Sv6K6h6ZuG5ZCIXHJcblx0XHRcdGxldCBmaWVsZCA9IHRoaXMuY29uZmlnRmllbGRzLmZpbHRlcihcclxuXHRcdFx0XHQoZWwpID0+XHJcblx0XHRcdFx0XHRlbC5jb2xOYW1lID09PVxyXG5cdFx0XHRcdFx0dGhpcy5kYXNoYm9hcmRQb3JsZXRzU2VydmljZS5nZXRBZ2dyZWdhdGVUeXBlKFxyXG5cdFx0XHRcdFx0XHRhcmdzLmFnZ3JlZ2F0ZVR5cGVcclxuXHRcdFx0XHRcdClcclxuXHRcdFx0KTtcclxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzLmNlbGxTZXRzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0Y29uc3QgZGF0YSA9IHtcclxuXHRcdFx0XHRcdFt2YWx1ZUZpZWxkXTogYXJncy5jZWxsU2V0c1tpXVt2YWx1ZUZpZWxkXSxcclxuXHRcdFx0XHRcdGRhdGU6XHJcblx0XHRcdFx0XHRcdHRoaXMucGJmLnRpbWUoYXJncy5jZWxsU2V0c1tpXVtkYXRlRmllbGRdKSA9PT1cclxuXHRcdFx0XHRcdFx0XCJJbnZhbGlkIGRhdGVcIlxyXG5cdFx0XHRcdFx0XHRcdD8gYXNPZkRhdGVcclxuXHRcdFx0XHRcdFx0XHQ6IHRoaXMucGJmLnRpbWUoYXJncy5jZWxsU2V0c1tpXVtkYXRlRmllbGRdKSxcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHRcdHZhbHVlcy5wdXNoKGRhdGEpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyDlpoLmnpxhc09mRGF0ZeS4jeaYryDmnKzmnIgv5a2j5bqmL+W5tCDnmoTmnIDlkI7kuIDlpKnvvIzpg73mmK/miKroh7Mg5LiK5Liq5pyIL+Wto+W6pi/lubQg55qE5pyA5ZCO5LiA5aSp55qE5pWw5o2u5Y676K6h566XXHJcblx0XHRcdGxldCBfYXNPZkRhdGUgPSBtb21lbnQoYXNPZkRhdGUpO1xyXG5cdFx0XHQvLyBjb25zb2xlLmxvZyhcIl9hc09mRGF0ZTpcIiwgX2FzT2ZEYXRlKTtcclxuXHRcdFx0bGV0IGlzRW5kT2ZQZXJpb2QgPSAodW5pdCkgPT4ge1xyXG5cdFx0XHRcdHJldHVybiAoXHJcblx0XHRcdFx0XHRfYXNPZkRhdGUuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKSA9PT1cclxuXHRcdFx0XHRcdF9hc09mRGF0ZS5lbmRPZih1bml0KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0fTtcclxuXHRcdFx0bGV0IGVuZERhdGUgPSBpc0VuZE9mUGVyaW9kKHRpbWVSYW5nZSlcclxuXHRcdFx0XHQ/IG1vbWVudChhc09mRGF0ZSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKVxyXG5cdFx0XHRcdDogbW9tZW50KGFzT2ZEYXRlKVxyXG5cdFx0XHRcdFx0XHQuc3VidHJhY3QoMSwgdGltZVJhbmdlKVxyXG5cdFx0XHRcdFx0XHQuZW5kT2YodGltZVJhbmdlKVxyXG5cdFx0XHRcdFx0XHQuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcclxuXHJcblx0XHRcdC8vIGNvbnNvbGUubG9nKFwiZW5kRGF0ZTpcIiwgZW5kRGF0ZSk7XHJcblx0XHRcdHZhbHVlcyA9IHZhbHVlcy5maWx0ZXIoKGl0ZW0pID0+XHJcblx0XHRcdFx0bW9tZW50KGl0ZW0uZGF0ZSkuaXNTYW1lT3JCZWZvcmUoZW5kRGF0ZSlcclxuXHRcdFx0KTtcclxuXHRcdFx0dmFsdWVzID0gc29ydEJ5KHZhbHVlcywgXCJkYXRlXCIpO1xyXG5cdFx0XHQvLyBjb25zb2xlLmxvZyhcInZhbHVlczpcIiwgdmFsdWVzKTtcclxuXHJcblx0XHRcdGlmICh2YWx1ZXMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdGxldCByZXN1bHQgPSB0aGlzLmdldFRpbWVSYW5nZXMoXHJcblx0XHRcdFx0XHR2YWx1ZXMsXHJcblx0XHRcdFx0XHRlbmREYXRlLFxyXG5cdFx0XHRcdFx0dGltZVJhbmdlLFxyXG5cdFx0XHRcdFx0XCJkYXRlXCJcclxuXHRcdFx0XHQpOyAvLyDlkITkuKrpmLbmrrXnmoTmlbDmja5cclxuXHRcdFx0XHRsZXQgcmVzdWx0VG90YWwgPSB7fTsgLy8g5ZCE5Liq6Zi25q615oC75ZKMXHJcblx0XHRcdFx0Zm9yIChjb25zdCBwcm9wIGluIHJlc3VsdCkge1xyXG5cdFx0XHRcdFx0cmVzdWx0VG90YWxbcHJvcF0gPSByZXN1bHRbcHJvcF0ucmVkdWNlKChhY2MsIGN1cikgPT4ge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gYWNjICsgKGN1clt2YWx1ZUZpZWxkXSB8fCAwKTtcclxuXHRcdFx0XHRcdH0sIDApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHQvLyBjb25zb2xlLmxvZyhcInJlc3VsdDpcIiwgcmVzdWx0KTtcclxuXHRcdFx0XHQvLyBjb25zb2xlLmxvZyhcInJlc3VsdFRvdGFsOlwiLCByZXN1bHRUb3RhbCk7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGN1bXVsYXRpdmVTdW0gPSB7fTsgLy8g5ZCE5Liq6Zi25q6157Sv6K6h5ZKMXHJcblx0XHRcdFx0bGV0IHN1bSA9IDA7XHJcblx0XHRcdFx0Zm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocmVzdWx0VG90YWwpKSB7XHJcblx0XHRcdFx0XHRzdW0gKz0gcmVzdWx0VG90YWxba2V5XTtcclxuXHRcdFx0XHRcdGN1bXVsYXRpdmVTdW1bYCR7a2V5fWBdID0gc3VtO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHQvLyBjb25zb2xlLmxvZyhcImN1bXVsYXRpdmVTdW06XCIsIGN1bXVsYXRpdmVTdW0pO1xyXG5cclxuXHRcdFx0XHRjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoY3VtdWxhdGl2ZVN1bSk7XHJcblx0XHRcdFx0bGV0IHR3ckxpc3QgPSBbXTtcclxuXHRcdFx0XHQvLyDpgY3ljobmr4/kuKTkuKrpmLbmrrUg6K6h566XVFdSXHJcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aCAtIDE7IGkrKykge1xyXG5cdFx0XHRcdFx0Y29uc3Qga2V5MSA9IGtleXNbaV07XHJcblx0XHRcdFx0XHRjb25zdCBrZXkyID0ga2V5c1tpICsgMV07XHJcblxyXG5cdFx0XHRcdFx0Ly8g6K6h566X5Lik5Liq6Zi25q615LmL6Ze055qE6YCS5aKe6YePLCDlh7rmlbDkuI3og73kuLowXHJcblx0XHRcdFx0XHRpZiAoY3VtdWxhdGl2ZVN1bVtrZXkxXSAhPSAwKSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGluY3JlbWVudCA9XHJcblx0XHRcdFx0XHRcdFx0Y3VtdWxhdGl2ZVN1bVtrZXkyXSAtIGN1bXVsYXRpdmVTdW1ba2V5MV07XHJcblx0XHRcdFx0XHRcdGxldCB0d3IgPSBpbmNyZW1lbnQgLyBjdW11bGF0aXZlU3VtW2tleTFdO1xyXG5cdFx0XHRcdFx0XHR0d3JMaXN0LnB1c2goe1xyXG5cdFx0XHRcdFx0XHRcdGRhdGU6IGtleTIsXHJcblx0XHRcdFx0XHRcdFx0dHdyOiB0d3IsXHJcblx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHQvLyDorqHnrpdBdmVyYWdlIFRXUlxyXG5cdFx0XHRcdC8vIGNvbnNvbGUubG9nKFwidHdyTGlzdDpcIiwgdHdyTGlzdCk7XHJcblx0XHRcdFx0bGV0IGF2ZXJhZ2VUV1IgPSB0aGlzLmNhbGN1bGF0ZUdyb3d0aFJhdGUoXHJcblx0XHRcdFx0XHR0d3JMaXN0Lm1hcCgoeCkgPT4geC50d3IpXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0XHQvLyBjb25zb2xlLmxvZyhcIuiuoeeul0F2ZXJhZ2UgVFdSOlwiLCBhdmVyYWdlVFdSKTtcclxuXHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRbXHJcblx0XHRcdFx0XHRcdFwiQ2FsY3VsYXRlVFdSTVREXCIsXHJcblx0XHRcdFx0XHRcdFwiQ2FsY3VsYXRlVFdSUVREXCIsXHJcblx0XHRcdFx0XHRcdFwiQ2FsY3VsYXRlVFdSWVREXCIsXHJcblx0XHRcdFx0XHRdLmluY2x1ZGVzKGFyZ3MuYWdncmVnYXRlVHlwZSlcclxuXHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdC8vIFNNUDItMTY1MjAgVFdSIOaciC/lraMv5bm0XHJcblx0XHRcdFx0XHRhcmdzLnZhbHVlID1cclxuXHRcdFx0XHRcdFx0aXNOYU4oYXZlcmFnZVRXUikgfHwgYXZlcmFnZVRXUiA9PSBudWxsXHJcblx0XHRcdFx0XHRcdFx0PyBcIlwiXHJcblx0XHRcdFx0XHRcdFx0OiBOdW1iZXIoYXZlcmFnZVRXUik7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdGlmIChpc05hTihhdmVyYWdlVFdSKSB8fCBhdmVyYWdlVFdSID09IG51bGwpIHtcclxuXHRcdFx0XHRcdFx0YXJncy52YWx1ZSA9IFwiXCI7XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHQvLyBTTVAyLTE2NjgzIFZBUiDljLrliIY5OSXlkow5NSVcclxuXHRcdFx0XHRcdFx0bGV0IFpTY29yZSA9IFtcclxuXHRcdFx0XHRcdFx0XHRcIkNhbGN1bGF0ZVZBUk1URF85OVwiLFxyXG5cdFx0XHRcdFx0XHRcdFwiQ2FsY3VsYXRlVkFSUVREXzk5XCIsXHJcblx0XHRcdFx0XHRcdFx0XCJDYWxjdWxhdGVWQVJZVERfOTlcIixcclxuXHRcdFx0XHRcdFx0XS5pbmNsdWRlcyhhcmdzLmFnZ3JlZ2F0ZVR5cGUpXHJcblx0XHRcdFx0XHRcdFx0PyAyLjMzXHJcblx0XHRcdFx0XHRcdFx0OiAxLjY1O1xyXG5cdFx0XHRcdFx0XHRpZiAodHdyTGlzdC5sZW5ndGggPCAyKSB7XHJcblx0XHRcdFx0XHRcdFx0YXJncy52YWx1ZSA9IFwiXCI7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0bGV0IFNEID0gdGhpcy5jYWxjdWxhdGVTdGFuZGFyZERldmlhdGlvbihcclxuXHRcdFx0XHRcdFx0XHRcdHR3ckxpc3QubWFwKCh4KSA9PiB4LnR3cilcclxuXHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKFwiY2FsY3VsYXRlU3RhbmRhcmREZXZpYXRpb246XCIsIFNEKTtcclxuXHRcdFx0XHRcdFx0XHRsZXQgVkFSID0gYXZlcmFnZVRXUiAtIFNEICogWlNjb3JlO1xyXG5cdFx0XHRcdFx0XHRcdGFyZ3MudmFsdWUgPSBOdW1iZXIoVkFSKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHQvLyBjb25zb2xlLmxvZyhcImFyZ3MudmFsdWU6XCIsIGFyZ3MudmFsdWUpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoXHJcblx0XHRcdFx0dGhpcy5waXZvdE9iai5lbmdpbmVNb2R1bGUgJiZcclxuXHRcdFx0XHR0aGlzLnBpdm90T2JqLmVuZ2luZU1vZHVsZS5mb3JtYXRGaWVsZHNbYXJncy5maWVsZE5hbWVdXHJcblx0XHRcdCkge1xyXG5cdFx0XHRcdGRlbGV0ZSB0aGlzLnBpdm90T2JqLmVuZ2luZU1vZHVsZS5mb3JtYXRGaWVsZHNbYXJncy5maWVsZE5hbWVdO1xyXG5cdFx0XHRcdHRoaXMucGl2b3RPYmouZW5naW5lTW9kdWxlLmZvcm1hdEZpZWxkc1thcmdzLmZpZWxkTmFtZV0gPSB7XHJcblx0XHRcdFx0XHRuYW1lOiBhcmdzLmZpZWxkTmFtZSxcclxuXHRcdFx0XHRcdGZvcm1hdDpcclxuXHRcdFx0XHRcdFx0ZmllbGQubGVuZ3RoID4gMFxyXG5cdFx0XHRcdFx0XHRcdD8gZmllbGRbMF0uZm9ybWF0ICYmXHJcblx0XHRcdFx0XHRcdFx0ICBmaWVsZFswXS5mb3JtYXQubGVuZ3RoICYmXHJcblx0XHRcdFx0XHRcdFx0ICBmaWVsZFswXS5mb3JtYXRbMF0uZm9ybWF0Q2hlY2tlZFxyXG5cdFx0XHRcdFx0XHRcdFx0PyB0aGlzLmRhc2hib2FyZFBvcmxldHNTZXJ2aWNlLnBpdm90VGFibGVmb3JtYXRQZXJjZW50KFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZpZWxkWzBdLmZvcm1hdFswXS5zZWxlY3RlZEZvcm1hdFxyXG5cdFx0XHRcdFx0XHRcdFx0ICApXHJcblx0XHRcdFx0XHRcdFx0XHQ6IHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UuZm9ybWF0UGVyY2VudChcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmaWVsZFswXS5kcFxyXG5cdFx0XHRcdFx0XHRcdFx0ICApXHJcblx0XHRcdFx0XHRcdFx0OiBcIlAyXCIsXHJcblx0XHRcdFx0fTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vU01QMi0yNzAxXHJcblx0XHRpZiAoYXJncy5hZ2dyZWdhdGVUeXBlID09PSBcIkNhbGN1bGF0ZUlSUkFjdHVhbEF1ZGl0ZWRcIikge1xyXG5cdFx0XHRsZXQgTkFWQWRqID0gMDtcclxuXHRcdFx0bGV0IHZhbHVlcyA9IFtdO1xyXG5cdFx0XHRsZXQgZmllbGQgPSB0aGlzLmNvbmZpZ0ZpZWxkcy5maWx0ZXIoXHJcblx0XHRcdFx0KGVsKSA9PlxyXG5cdFx0XHRcdFx0ZWwuY29sTmFtZSA9PT1cclxuXHRcdFx0XHRcdHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UuZ2V0QWdncmVnYXRlVHlwZShcclxuXHRcdFx0XHRcdFx0YXJncy5hZ2dyZWdhdGVUeXBlXHJcblx0XHRcdFx0XHQpXHJcblx0XHRcdCk7XHJcblx0XHRcdC8vU01QMi0yNzEzIG9ubHkganVkZ2UgZm9yIHRoaXMgZGF0YU1hcnQoR3Jvc3NOZXQpXHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHR0aGlzLnBvcnRsZXQuZmlndXJlQ29kZSA9PT0gXCJHcm9zc05ldFwiIHx8XHJcblx0XHRcdFx0dGhpcy5wb3J0bGV0LmZpZ3VyZUNvZGUgPT09XHJcblx0XHRcdFx0XHRcIkNvbWJpbmVkSW52ZXN0bWVudEZ1bmROQ29tcGFueUNhc2hmbG93XCJcclxuXHRcdFx0KSB7XHJcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzLmNlbGxTZXRzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0XHRjb25zdCBkYXRhID0ge1xyXG5cdFx0XHRcdFx0XHRhbW91bnQ6IGFyZ3MuY2VsbFNldHNbaV1bXCJJUlJBbW91bnRcIl0sXHJcblx0XHRcdFx0XHRcdGRhdGU6XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5wYmYudGltZShhcmdzLmNlbGxTZXRzW2ldW1wiSVJSRGF0ZVwiXSkgPT09XHJcblx0XHRcdFx0XHRcdFx0XCJJbnZhbGlkIGRhdGVcIlxyXG5cdFx0XHRcdFx0XHRcdFx0PyBhc09mRGF0ZVxyXG5cdFx0XHRcdFx0XHRcdFx0OiB0aGlzLnBiZi50aW1lKGFyZ3MuY2VsbFNldHNbaV1bXCJJUlJEYXRlXCJdKSxcclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHROQVZBZGogKz0gYXJncy5jZWxsU2V0c1tpXVtcIkFjdHVhbEF1ZGl0ZWROQVZcIl07XHJcblx0XHRcdFx0XHRpZiAoZGF0YS5hbW91bnQgIT0gMCkge1xyXG5cdFx0XHRcdFx0XHR2YWx1ZXMucHVzaChkYXRhKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0Ly9maWx0ZXIgdGhlIGRhdGEgYnkgdGhlIERhdGFUeXBlKEFjdHVhbCBSZXBvcnRlZCBBdWRpdGVkKVxyXG5cdFx0XHRlbHNlIHtcclxuXHRcdFx0XHRsZXQgYXJnc2RhdGEgPSBhcmdzLmNlbGxTZXRzLmZpbHRlcihcclxuXHRcdFx0XHRcdChlbCkgPT5cclxuXHRcdFx0XHRcdFx0ZWwuRGF0YVR5cGUgPT09IFwiQUNUVUFMX0FVRElURURcIiB8fFxyXG5cdFx0XHRcdFx0XHRlbC5EYXRhVHlwZSA9PT0gXCJSRVBPUlRFRFwiXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3NkYXRhLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0XHRjb25zdCBkYXRhID0ge1xyXG5cdFx0XHRcdFx0XHRhbW91bnQ6IGFyZ3NkYXRhW2ldW1wiSVJSQW1vdW50XCJdLFxyXG5cdFx0XHRcdFx0XHRkYXRlOlxyXG5cdFx0XHRcdFx0XHRcdHRoaXMucGJmLnRpbWUoYXJnc2RhdGFbaV1bXCJJUlJEYXRlXCJdKSA9PT1cclxuXHRcdFx0XHRcdFx0XHRcIkludmFsaWQgZGF0ZVwiXHJcblx0XHRcdFx0XHRcdFx0XHQ/IGFzT2ZEYXRlXHJcblx0XHRcdFx0XHRcdFx0XHQ6IHRoaXMucGJmLnRpbWUoYXJnc2RhdGFbaV1bXCJJUlJEYXRlXCJdKSxcclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHROQVZBZGogKz0gYXJnc2RhdGFbaV1bXCJJUlJBZGpWYWx1ZVwiXTtcclxuXHRcdFx0XHRcdGlmIChkYXRhLmFtb3VudCAhPSAwKSB7XHJcblx0XHRcdFx0XHRcdHZhbHVlcy5wdXNoKGRhdGEpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoTkFWQWRqID4gMC4wMDAxIHx8IE5BVkFkaiA8IC0wLjAwMDEpIHtcclxuXHRcdFx0XHR2YWx1ZXMucHVzaCh7XHJcblx0XHRcdFx0XHRhbW91bnQ6IE5BVkFkaixcclxuXHRcdFx0XHRcdGRhdGU6IGFzT2ZEYXRlLFxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblx0XHRcdHZhbHVlcyA9IHNvcnRCeSh2YWx1ZXMsIFwiZGF0ZVwiKTtcclxuXHRcdFx0aWYgKHZhbHVlcy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0bGV0IGd1ZXNzID0gMC4xO1xyXG5cdFx0XHRcdGNvbnN0IHN1bUFtb3VudCA9IHZhbHVlc1xyXG5cdFx0XHRcdFx0Lm1hcCgoaXRlbSkgPT4gaXRlbS5hbW91bnQpXHJcblx0XHRcdFx0XHQucmVkdWNlKChwcmV2LCBjdXJyKSA9PiBwcmV2ICsgY3VyciwgMCk7XHJcblx0XHRcdFx0aWYgKHN1bUFtb3VudCA8IDApIHtcclxuXHRcdFx0XHRcdGd1ZXNzID0gLTAuMTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Ly9TTVAyLTIyNDkgZml4ZWQgdGhlIGJpZyBpcnIgaXNzdWVcclxuXHRcdFx0XHRpZiAoc3VtQW1vdW50ID09PSAwKSB7XHJcblx0XHRcdFx0XHRhcmdzLnZhbHVlID0gMDtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0Y29uc3QgdmFsdWVJdGVtcyA9IHZhbHVlcy5zbGljZSgwLCB2YWx1ZXMubGVuZ3RoIC0gMSk7XHJcblx0XHRcdFx0XHRjb25zdCB2YWx1ZUxpc3QgPSB2YWx1ZUl0ZW1zLm1hcCgoaXRlbSkgPT4gaXRlbS5hbW91bnQpO1xyXG5cdFx0XHRcdFx0Y29uc3QgZGF0ZUxpc3QgPSB2YWx1ZUl0ZW1zLm1hcCgoaXRlbSkgPT4gaXRlbS5kYXRlKTtcclxuXHRcdFx0XHRcdGNvbnN0IGxhc3RJdGVtID0gdmFsdWVzW3ZhbHVlcy5sZW5ndGggLSAxXTtcclxuXHRcdFx0XHRcdGNvbnN0IG5hdkFkanVzdCA9IGxhc3RJdGVtLmFtb3VudDtcclxuXHRcdFx0XHRcdGNvbnN0IGxhdGVzdERhdGUgPSBsYXN0SXRlbS5kYXRlO1xyXG5cdFx0XHRcdFx0bGV0IGlyciA9XHJcblx0XHRcdFx0XHRcdHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UuRXhjZWxGb3JtdWxhcy5fQ2FsY3VsYXRlWGlycihcclxuXHRcdFx0XHRcdFx0XHR2YWx1ZUxpc3QsXHJcblx0XHRcdFx0XHRcdFx0ZGF0ZUxpc3QsXHJcblx0XHRcdFx0XHRcdFx0bmF2QWRqdXN0LFxyXG5cdFx0XHRcdFx0XHRcdGxhdGVzdERhdGVcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdGFyZ3MudmFsdWUgPSBpcnIgPT09IG51bGwgPyAwIDogaXJyO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRhcmdzLnZhbHVlID0gMDtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoXHJcblx0XHRcdFx0dGhpcy5waXZvdE9iai5lbmdpbmVNb2R1bGUgJiZcclxuXHRcdFx0XHR0aGlzLnBpdm90T2JqLmVuZ2luZU1vZHVsZS5mb3JtYXRGaWVsZHNbYXJncy5maWVsZE5hbWVdXHJcblx0XHRcdCkge1xyXG5cdFx0XHRcdGRlbGV0ZSB0aGlzLnBpdm90T2JqLmVuZ2luZU1vZHVsZS5mb3JtYXRGaWVsZHNbYXJncy5maWVsZE5hbWVdO1xyXG5cdFx0XHRcdHRoaXMucGl2b3RPYmouZW5naW5lTW9kdWxlLmZvcm1hdEZpZWxkc1thcmdzLmZpZWxkTmFtZV0gPSB7XHJcblx0XHRcdFx0XHRuYW1lOiBhcmdzLmZpZWxkTmFtZSxcclxuXHRcdFx0XHRcdGZvcm1hdDpcclxuXHRcdFx0XHRcdFx0ZmllbGQubGVuZ3RoID4gMFxyXG5cdFx0XHRcdFx0XHRcdD8gZmllbGRbMF0uZm9ybWF0ICYmXHJcblx0XHRcdFx0XHRcdFx0ICBmaWVsZFswXS5mb3JtYXQubGVuZ3RoICYmXHJcblx0XHRcdFx0XHRcdFx0ICBmaWVsZFswXS5mb3JtYXRbMF0uZm9ybWF0Q2hlY2tlZFxyXG5cdFx0XHRcdFx0XHRcdFx0PyB0aGlzLmRhc2hib2FyZFBvcmxldHNTZXJ2aWNlLnBpdm90VGFibGVmb3JtYXRQZXJjZW50KFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZpZWxkWzBdLmZvcm1hdFswXS5zZWxlY3RlZEZvcm1hdFxyXG5cdFx0XHRcdFx0XHRcdFx0ICApXHJcblx0XHRcdFx0XHRcdFx0XHQ6IHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UuZm9ybWF0UGVyY2VudChcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmaWVsZFswXS5kcFxyXG5cdFx0XHRcdFx0XHRcdFx0ICApXHJcblx0XHRcdFx0XHRcdFx0OiBcIlAyXCIsXHJcblx0XHRcdFx0fTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0Ly9TTVAyLTM0MTFcclxuXHRcdGlmIChhcmdzLmFnZ3JlZ2F0ZVR5cGUgPT09IFwiQ2FsY3VsYXRlSVJSUmVwb3J0ZWRcIikge1xyXG5cdFx0XHRsZXQgTkFWQWRqID0gMDtcclxuXHRcdFx0bGV0IHZhbHVlcyA9IFtdO1xyXG5cdFx0XHRsZXQgZmllbGQgPSB0aGlzLmNvbmZpZ0ZpZWxkcy5maWx0ZXIoXHJcblx0XHRcdFx0KGVsKSA9PlxyXG5cdFx0XHRcdFx0ZWwuY29sTmFtZSA9PT1cclxuXHRcdFx0XHRcdHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UuZ2V0QWdncmVnYXRlVHlwZShcclxuXHRcdFx0XHRcdFx0YXJncy5hZ2dyZWdhdGVUeXBlXHJcblx0XHRcdFx0XHQpXHJcblx0XHRcdCk7XHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHR0aGlzLnBvcnRsZXQuZmlndXJlQ29kZSA9PT0gXCJHcm9zc05ldFwiIHx8XHJcblx0XHRcdFx0dGhpcy5wb3J0bGV0LmZpZ3VyZUNvZGUgPT09XHJcblx0XHRcdFx0XHRcIkNvbWJpbmVkSW52ZXN0bWVudEZ1bmROQ29tcGFueUNhc2hmbG93XCJcclxuXHRcdFx0KSB7XHJcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzLmNlbGxTZXRzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0XHRjb25zdCBkYXRhID0ge1xyXG5cdFx0XHRcdFx0XHRhbW91bnQ6IGFyZ3MuY2VsbFNldHNbaV1bXCJJUlJBbW91bnRcIl0sXHJcblx0XHRcdFx0XHRcdGRhdGU6XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5wYmYudGltZShhcmdzLmNlbGxTZXRzW2ldW1wiSVJSRGF0ZVwiXSkgPT09XHJcblx0XHRcdFx0XHRcdFx0XCJJbnZhbGlkIGRhdGVcIlxyXG5cdFx0XHRcdFx0XHRcdFx0PyBhc09mRGF0ZVxyXG5cdFx0XHRcdFx0XHRcdFx0OiB0aGlzLnBiZi50aW1lKGFyZ3MuY2VsbFNldHNbaV1bXCJJUlJEYXRlXCJdKSxcclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHROQVZBZGogKz0gYXJncy5jZWxsU2V0c1tpXVtcIlJlcG9ydGVkTkFWXCJdO1xyXG5cdFx0XHRcdFx0aWYgKGRhdGEuYW1vdW50ICE9IDApIHtcclxuXHRcdFx0XHRcdFx0dmFsdWVzLnB1c2goZGF0YSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYXJncy5jZWxsU2V0cy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0Y29uc3QgZGF0YSA9IHtcclxuXHRcdFx0XHRcdFx0YW1vdW50OiBhcmdzLmNlbGxTZXRzW2ldW1wiSVJSQW1vdW50XCJdLFxyXG5cdFx0XHRcdFx0XHRkYXRlOlxyXG5cdFx0XHRcdFx0XHRcdHRoaXMucGJmLnRpbWUoYXJncy5jZWxsU2V0c1tpXVtcIklSUkRhdGVcIl0pID09PVxyXG5cdFx0XHRcdFx0XHRcdFwiSW52YWxpZCBkYXRlXCJcclxuXHRcdFx0XHRcdFx0XHRcdD8gYXNPZkRhdGVcclxuXHRcdFx0XHRcdFx0XHRcdDogdGhpcy5wYmYudGltZShhcmdzLmNlbGxTZXRzW2ldW1wiSVJSRGF0ZVwiXSksXHJcblx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0TkFWQWRqICs9IGFyZ3MuY2VsbFNldHNbaV1bXCJJUlJBZGpWYWx1ZVwiXTtcclxuXHRcdFx0XHRcdGlmIChkYXRhLmFtb3VudCAhPSAwKSB7XHJcblx0XHRcdFx0XHRcdHZhbHVlcy5wdXNoKGRhdGEpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoTkFWQWRqID4gMC4wMDAxIHx8IE5BVkFkaiA8IC0wLjAwMDEpIHtcclxuXHRcdFx0XHR2YWx1ZXMucHVzaCh7XHJcblx0XHRcdFx0XHRhbW91bnQ6IE5BVkFkaixcclxuXHRcdFx0XHRcdGRhdGU6IGFzT2ZEYXRlLFxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblx0XHRcdHZhbHVlcyA9IHNvcnRCeSh2YWx1ZXMsIFwiZGF0ZVwiKTtcclxuXHRcdFx0aWYgKHZhbHVlcy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0bGV0IGd1ZXNzID0gMC4xO1xyXG5cdFx0XHRcdGNvbnN0IHN1bUFtb3VudCA9IHZhbHVlc1xyXG5cdFx0XHRcdFx0Lm1hcCgoaXRlbSkgPT4gaXRlbS5hbW91bnQpXHJcblx0XHRcdFx0XHQucmVkdWNlKChwcmV2LCBjdXJyKSA9PiBwcmV2ICsgY3VyciwgMCk7XHJcblx0XHRcdFx0aWYgKHN1bUFtb3VudCA8IDApIHtcclxuXHRcdFx0XHRcdGd1ZXNzID0gLTAuMTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Ly9TTVAyLTIyNDkgZml4ZWQgdGhlIGJpZyBpcnIgaXNzdWVcclxuXHRcdFx0XHRpZiAoc3VtQW1vdW50ID09PSAwKSB7XHJcblx0XHRcdFx0XHRhcmdzLnZhbHVlID0gMDtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0Y29uc3QgdmFsdWVJdGVtcyA9IHZhbHVlcy5zbGljZSgwLCB2YWx1ZXMubGVuZ3RoIC0gMSk7XHJcblx0XHRcdFx0XHRjb25zdCB2YWx1ZUxpc3QgPSB2YWx1ZUl0ZW1zLm1hcCgoaXRlbSkgPT4gaXRlbS5hbW91bnQpO1xyXG5cdFx0XHRcdFx0Y29uc3QgZGF0ZUxpc3QgPSB2YWx1ZUl0ZW1zLm1hcCgoaXRlbSkgPT4gaXRlbS5kYXRlKTtcclxuXHRcdFx0XHRcdGNvbnN0IGxhc3RJdGVtID0gdmFsdWVzW3ZhbHVlcy5sZW5ndGggLSAxXTtcclxuXHRcdFx0XHRcdGNvbnN0IG5hdkFkanVzdCA9IGxhc3RJdGVtLmFtb3VudDtcclxuXHRcdFx0XHRcdGNvbnN0IGxhdGVzdERhdGUgPSBsYXN0SXRlbS5kYXRlO1xyXG5cdFx0XHRcdFx0bGV0IGlyciA9XHJcblx0XHRcdFx0XHRcdHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UuRXhjZWxGb3JtdWxhcy5fQ2FsY3VsYXRlWGlycihcclxuXHRcdFx0XHRcdFx0XHR2YWx1ZUxpc3QsXHJcblx0XHRcdFx0XHRcdFx0ZGF0ZUxpc3QsXHJcblx0XHRcdFx0XHRcdFx0bmF2QWRqdXN0LFxyXG5cdFx0XHRcdFx0XHRcdGxhdGVzdERhdGVcclxuXHRcdFx0XHRcdFx0KTtcclxuXHJcblx0XHRcdFx0XHRhcmdzLnZhbHVlID0gaXJyID09PSBudWxsID8gMCA6IGlycjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0YXJncy52YWx1ZSA9IDA7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKFxyXG5cdFx0XHRcdHRoaXMucGl2b3RPYmouZW5naW5lTW9kdWxlICYmXHJcblx0XHRcdFx0dGhpcy5waXZvdE9iai5lbmdpbmVNb2R1bGUuZm9ybWF0RmllbGRzW2FyZ3MuZmllbGROYW1lXVxyXG5cdFx0XHQpIHtcclxuXHRcdFx0XHRkZWxldGUgdGhpcy5waXZvdE9iai5lbmdpbmVNb2R1bGUuZm9ybWF0RmllbGRzW2FyZ3MuZmllbGROYW1lXTtcclxuXHRcdFx0XHR0aGlzLnBpdm90T2JqLmVuZ2luZU1vZHVsZS5mb3JtYXRGaWVsZHNbYXJncy5maWVsZE5hbWVdID0ge1xyXG5cdFx0XHRcdFx0bmFtZTogYXJncy5maWVsZE5hbWUsXHJcblx0XHRcdFx0XHRmb3JtYXQ6XHJcblx0XHRcdFx0XHRcdGZpZWxkLmxlbmd0aCA+IDBcclxuXHRcdFx0XHRcdFx0XHQ/IGZpZWxkWzBdLmZvcm1hdCAmJlxyXG5cdFx0XHRcdFx0XHRcdCAgZmllbGRbMF0uZm9ybWF0Lmxlbmd0aCAmJlxyXG5cdFx0XHRcdFx0XHRcdCAgZmllbGRbMF0uZm9ybWF0WzBdLmZvcm1hdENoZWNrZWRcclxuXHRcdFx0XHRcdFx0XHRcdD8gdGhpcy5kYXNoYm9hcmRQb3JsZXRzU2VydmljZS5waXZvdFRhYmxlZm9ybWF0UGVyY2VudChcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmaWVsZFswXS5mb3JtYXRbMF0uc2VsZWN0ZWRGb3JtYXRcclxuXHRcdFx0XHRcdFx0XHRcdCAgKVxyXG5cdFx0XHRcdFx0XHRcdFx0OiB0aGlzLmRhc2hib2FyZFBvcmxldHNTZXJ2aWNlLmZvcm1hdFBlcmNlbnQoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZmllbGRbMF0uZHBcclxuXHRcdFx0XHRcdFx0XHRcdCAgKVxyXG5cdFx0XHRcdFx0XHRcdDogXCJQMlwiLFxyXG5cdFx0XHRcdH07XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdGlmIChcclxuXHRcdFx0YXJncy5hZ2dyZWdhdGVUeXBlID09PSBcIkNhbGN1bGF0ZU11bHRpcGxlXCIgfHxcclxuXHRcdFx0YXJncy5hZ2dyZWdhdGVUeXBlID09PSBcIkNhbGN1bGF0ZVBJQ1wiIHx8XHJcblx0XHRcdGFyZ3MuYWdncmVnYXRlVHlwZSA9PT0gXCJDYWxjdWxhdGVEUElcIiB8fFxyXG5cdFx0XHRhcmdzLmFnZ3JlZ2F0ZVR5cGUgPT09IFwiQ2FsY3VsYXRlVFZQSVwiIHx8XHJcblx0XHRcdGFyZ3MuYWdncmVnYXRlVHlwZSA9PT0gXCJDYWxjdWxhdGVSVlBJXCIgfHxcclxuXHRcdFx0YXJncy5hZ2dyZWdhdGVUeXBlID09PSBcIkNhbGN1bGF0ZU1BY3R1YWxBdWRpdGVkXCIgfHxcclxuXHRcdFx0YXJncy5hZ2dyZWdhdGVUeXBlID09PSBcIkNhbGN1bGF0ZU1SZXBvcnRlZFwiXHJcblx0XHQpIHtcclxuXHRcdFx0bGV0IHRvdGFsTnVtZXJhdG9yID0gMDtcclxuXHRcdFx0bGV0IHRvdGFsRGVub21pbmF0b3IgPSAwO1xyXG5cdFx0XHRsZXQgbnVtZXJhdG9yTmFtZTtcclxuXHRcdFx0bGV0IGRlbm9taW5hdG9yTmFtZTtcclxuXHRcdFx0bGV0IGZpZWxkID0gdGhpcy5jb25maWdGaWVsZHMuZmlsdGVyKFxyXG5cdFx0XHRcdChlbCkgPT5cclxuXHRcdFx0XHRcdGVsLmNvbE5hbWUgPT09XHJcblx0XHRcdFx0XHR0aGlzLmRhc2hib2FyZFBvcmxldHNTZXJ2aWNlLmdldEFnZ3JlZ2F0ZVR5cGUoXHJcblx0XHRcdFx0XHRcdGFyZ3MuYWdncmVnYXRlVHlwZVxyXG5cdFx0XHRcdFx0KVxyXG5cdFx0XHQpO1xyXG5cdFx0XHRpZiAoZmllbGQubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdGNvbnN0IGZvcm11bGFBcnJheSA9IGZpZWxkWzBdLmZvcm11bGEuc3BsaXQoXCIvXCIpO1xyXG5cdFx0XHRcdG51bWVyYXRvck5hbWUgPSBmb3JtdWxhQXJyYXlbMF07XHJcblx0XHRcdFx0ZGVub21pbmF0b3JOYW1lID0gZm9ybXVsYUFycmF5WzFdO1xyXG5cdFx0XHR9XHJcblx0XHRcdGZvciAobGV0IGogPSAwOyBqIDwgYXJncy5jZWxsU2V0cy5sZW5ndGg7IGorKykge1xyXG5cdFx0XHRcdHRvdGFsTnVtZXJhdG9yICs9IGFyZ3MuY2VsbFNldHNbal1bbnVtZXJhdG9yTmFtZV07XHJcblx0XHRcdFx0dG90YWxEZW5vbWluYXRvciArPSBhcmdzLmNlbGxTZXRzW2pdW2Rlbm9taW5hdG9yTmFtZV07XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKHRvdGFsRGVub21pbmF0b3IgIT09IDApIHtcclxuXHRcdFx0XHRhcmdzLnZhbHVlID0gdG90YWxOdW1lcmF0b3IgLyB0b3RhbERlbm9taW5hdG9yO1xyXG5cdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdHRoaXMucGl2b3RPYmouZW5naW5lTW9kdWxlICYmXHJcblx0XHRcdFx0XHR0aGlzLnBpdm90T2JqLmVuZ2luZU1vZHVsZS5mb3JtYXRGaWVsZHNbYXJncy5maWVsZE5hbWVdXHJcblx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRkZWxldGUgdGhpcy5waXZvdE9iai5lbmdpbmVNb2R1bGUuZm9ybWF0RmllbGRzW1xyXG5cdFx0XHRcdFx0XHRhcmdzLmZpZWxkTmFtZVxyXG5cdFx0XHRcdFx0XTtcclxuXHRcdFx0XHRcdHRoaXMucGl2b3RPYmouZW5naW5lTW9kdWxlLmZvcm1hdEZpZWxkc1thcmdzLmZpZWxkTmFtZV0gPSB7XHJcblx0XHRcdFx0XHRcdG5hbWU6IGFyZ3MuZmllbGROYW1lLFxyXG5cdFx0XHRcdFx0XHRmb3JtYXQ6XHJcblx0XHRcdFx0XHRcdFx0ZmllbGQubGVuZ3RoID4gMFxyXG5cdFx0XHRcdFx0XHRcdFx0PyBmaWVsZFswXS5mb3JtYXQgJiZcclxuXHRcdFx0XHRcdFx0XHRcdCAgZmllbGRbMF0uZm9ybWF0Lmxlbmd0aCAmJlxyXG5cdFx0XHRcdFx0XHRcdFx0ICBmaWVsZFswXS5mb3JtYXRbMF0uZm9ybWF0Q2hlY2tlZFxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ/IHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UucGl2b3RUYWJsZWZvcm1hdE11bHRpcGxlKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZmllbGRbMF0uZm9ybWF0WzBdLnNlbGVjdGVkRm9ybWF0XHJcblx0XHRcdFx0XHRcdFx0XHRcdCAgKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ6IHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UuZm9ybWF0TXVsdGlwbGUoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmaWVsZFswXS5kcFxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgIClcclxuXHRcdFx0XHRcdFx0XHRcdDogXCIjIyMwLjAwJ3gnXCIsXHJcblx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRhcmdzLnZhbHVlID0gXCJcIjtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChhcmdzLmFnZ3JlZ2F0ZVR5cGUgPT09IFwiRmlyc3RcIiB8fCBhcmdzLmFnZ3JlZ2F0ZVR5cGUgPT09IFwiTGFzdFwiKSB7XHJcblx0XHRcdGFyZ3MudmFsdWUgPSB0aGlzLmNhbGN1bGF0ZWRGaXN0TGFzdChcclxuXHRcdFx0XHRhcmdzLFxyXG5cdFx0XHRcdGFyZ3MuYWdncmVnYXRlVHlwZSxcclxuXHRcdFx0XHRhcmdzLmZpZWxkTmFtZVxyXG5cdFx0XHQpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChcclxuXHRcdFx0YXJncy5hZ2dyZWdhdGVUeXBlID09PSBcIkNvdW50XCIgfHxcclxuXHRcdFx0YXJncy5hZ2dyZWdhdGVUeXBlID09PSBcIkRpc3RpbmN0Q291bnRcIlxyXG5cdFx0KSB7XHJcblx0XHRcdGlmIChhcmdzLnZhbHVlKSB7XHJcblx0XHRcdFx0YXJncy52YWx1ZSA9IGFyZ3MudmFsdWUudG9GaXhlZCgyKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChcclxuXHRcdFx0IWFyZ3MudmFsdWUgJiZcclxuXHRcdFx0YXJncy52YWx1ZSAhPT0gMCAmJlxyXG5cdFx0XHRhcmdzLnZhbHVlICE9PSBmYWxzZSAmJlxyXG5cdFx0XHRhcmdzLnZhbHVlICE9PSBcImZhbHNlXCJcclxuXHRcdCkge1xyXG5cdFx0XHRhcmdzLnNraXBGb3JtYXR0aW5nID0gdHJ1ZTtcclxuXHRcdFx0YXJncy52YWx1ZSA9IFwiXCI7XHJcblx0XHR9XHJcblx0XHQvLyDmlrDlu7pwaXZvdCB0YWJsZSwg6L+Y5rKh5pyJ6K6+572ucm93LCDpgInkuoZjb2x1bW7kuYvlkI5ncmFuZHRvdGFs5Lya5pyJ5YC8XHJcblx0XHRpZiAoXHJcblx0XHRcdGFyZ3Mucm93Q2VsbFR5cGUgPT09IFwiZ3JhbmRUb3RhbFwiICYmXHJcblx0XHRcdCF0aGlzLnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy5yb3dzLmxlbmd0aFxyXG5cdFx0KSB7XHJcblx0XHRcdGFyZ3MudmFsdWUgPSBcIlwiO1xyXG5cdFx0fVxyXG5cdFx0Ly9TTVAyLTI4ODlcclxuXHRcdGlmIChhcmdzLnJvd0NlbGxUeXBlID09PSBcInN1YlRvdGFsXCIpIHtcclxuXHRcdFx0Y29uc3QgdmFsdWVGaWVsZF9kYXRhID0gdGhpcy5jb25maWcueWF4aXMuc2VyaWVzLmZpbHRlcihcclxuXHRcdFx0XHQoZWwpID0+IGVsLmNvbE5hbWUgPT09IGFyZ3MuZmllbGROYW1lXHJcblx0XHRcdCk7XHJcblx0XHRcdGlmICh2YWx1ZUZpZWxkX2RhdGEubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdGlmICh2YWx1ZUZpZWxkX2RhdGFbMF0uc2hvd1N1YlRvdGFscyA9PT0gZmFsc2UpIHtcclxuXHRcdFx0XHRcdGFyZ3MudmFsdWUgPSBcIlwiO1xyXG5cdFx0XHRcdFx0YXJncy5za2lwRm9ybWF0dGluZyA9IHRydWU7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRpZiAoYXJncy5yb3dDZWxsVHlwZSA9PT0gXCJncmFuZFRvdGFsXCIpIHtcclxuXHRcdFx0Y29uc3QgdmFsdWVGaWVsZF9kYXRhID0gdGhpcy5jb25maWcueWF4aXMuc2VyaWVzLmZpbHRlcihcclxuXHRcdFx0XHQoZWwpID0+IGVsLmNvbE5hbWUgPT09IGFyZ3MuZmllbGROYW1lXHJcblx0XHRcdCk7XHJcblx0XHRcdGlmICh2YWx1ZUZpZWxkX2RhdGEubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdGlmICh2YWx1ZUZpZWxkX2RhdGFbMF0uc2hvd0dyYW5kVG90YWxzID09PSBmYWxzZSkge1xyXG5cdFx0XHRcdFx0YXJncy52YWx1ZSA9IFwiXCI7XHJcblx0XHRcdFx0XHRhcmdzLnNraXBGb3JtYXR0aW5nID0gdHJ1ZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdC8vIFNNUDItMzQxNiBzdGFydFxyXG5cdFx0aWYgKFxyXG5cdFx0XHR0aGlzLnplcm9Gb3JtYXREYXRhLmhnTGlzdC5pbmNsdWRlcyhhcmdzLmZpZWxkTmFtZSkgJiZcclxuXHRcdFx0YXJncy52YWx1ZSA9PT0gMFxyXG5cdFx0KSB7XHJcblx0XHRcdGFyZ3MudmFsdWUgPSBcIi1cIjtcclxuXHRcdFx0YXJncy5za2lwRm9ybWF0dGluZyA9IHRydWU7XHJcblx0XHR9XHJcblx0XHRpZiAoXHJcblx0XHRcdHRoaXMuemVyb0Zvcm1hdERhdGEuZW1wdHlMaXN0LmluY2x1ZGVzKGFyZ3MuZmllbGROYW1lKSAmJlxyXG5cdFx0XHRhcmdzLnZhbHVlID09PSAwXHJcblx0XHQpIHtcclxuXHRcdFx0YXJncy52YWx1ZSA9IFwiXCI7XHJcblx0XHRcdGFyZ3Muc2tpcEZvcm1hdHRpbmcgPSB0cnVlO1xyXG5cdFx0fVxyXG5cdFx0aWYgKFxyXG5cdFx0XHR0aGlzLm1pbGxpb25GaWVsZHMuaW5jbHVkZXMoYXJncy5maWVsZE5hbWUpICYmXHJcblx0XHRcdCFpc05hTihOdW1iZXIoYXJncy52YWx1ZSkpICYmXHJcblx0XHRcdGFyZ3MudmFsdWUgIT09IDAgJiZcclxuXHRcdFx0YXJncy52YWx1ZSAhPT0gXCJcIiAmJlxyXG5cdFx0XHRhcmdzLnZhbHVlICE9PSBudWxsXHJcblx0XHQpIHtcclxuXHRcdFx0aWYgKFxyXG5cdFx0XHRcdGFyZ3MuY29sdW1uQ2VsbFR5cGUgPT0gXCJncmFuZFRvdGFsXCIgJiZcclxuXHRcdFx0XHRhcmdzLnJvd0NlbGxUeXBlID09IFwiZ3JhbmRUb3RhbFwiXHJcblx0XHRcdCkge1xyXG5cdFx0XHRcdGlmICghdGhpcy50b3RhbEZvcm1hdHRlZFthcmdzLmZpZWxkTmFtZV0pIHtcclxuXHRcdFx0XHRcdHRoaXMudG90YWxGb3JtYXR0ZWRbYXJncy5maWVsZE5hbWVdID0gdHJ1ZTtcclxuXHRcdFx0XHRcdGFyZ3MudmFsdWUgPSBhcmdzLnZhbHVlIC8gMTAwMDAwMDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0YXJncy52YWx1ZSA9IGFyZ3MudmFsdWUgLyAxMDAwMDAwO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gU01QMi0yNDg2ICYgcGVyY2VudE51beeahGZvcm1hdOmXrumimFxyXG5cdFx0aWYgKFxyXG5cdFx0XHR0aGlzLnBlcmNlbnROdW1GaWVsZHMubGVuZ3RoICYmXHJcblx0XHRcdHRoaXMucGVyY2VudE51bUZpZWxkcy5pbmNsdWRlcyhhcmdzLmZpZWxkTmFtZSkgJiZcclxuXHRcdFx0IWlzTmFOKE51bWJlcihhcmdzLnZhbHVlKSkgJiZcclxuXHRcdFx0YXJncy52YWx1ZSAhPT0gMCAmJlxyXG5cdFx0XHRhcmdzLnZhbHVlICE9PSBcIlwiICYmXHJcblx0XHRcdGFyZ3MudmFsdWUgIT09IG51bGxcclxuXHRcdCkge1xyXG5cdFx0XHRpZiAoXHJcblx0XHRcdFx0YXJncy5jb2x1bW5DZWxsVHlwZSA9PSBcImdyYW5kVG90YWxcIiAmJlxyXG5cdFx0XHRcdGFyZ3Mucm93Q2VsbFR5cGUgPT0gXCJncmFuZFRvdGFsXCJcclxuXHRcdFx0KSB7XHJcblx0XHRcdFx0aWYgKCF0aGlzLnRvdGFsRm9ybWF0dGVkW2FyZ3MuZmllbGROYW1lXSkge1xyXG5cdFx0XHRcdFx0dGhpcy50b3RhbEZvcm1hdHRlZFthcmdzLmZpZWxkTmFtZV0gPSB0cnVlO1xyXG5cdFx0XHRcdFx0YXJncy52YWx1ZSA9IGFyZ3MudmFsdWUgLyAxMDA7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGFyZ3MudmFsdWUgPSBhcmdzLnZhbHVlIC8gMTAwO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRpZiAoXHJcblx0XHRcdGFyZ3MuYWdncmVnYXRlVHlwZSA9PSBcIkNhbGN1bGF0ZWRGaWVsZFwiICYmXHJcblx0XHRcdCFpc05hTihOdW1iZXIoYXJncy52YWx1ZSkpICYmXHJcblx0XHRcdCF0aGlzLnBpdm90T2JqLmVuZ2luZU1vZHVsZS5mb3JtYXRGaWVsZHNbYXJncy5maWVsZE5hbWVdLmZvcm1hdFxyXG5cdFx0KSB7XHJcblx0XHRcdGFyZ3MudmFsdWUgPSBOdW1iZXIoYXJncy52YWx1ZSkudG9GaXhlZCgyKTtcclxuXHRcdH1cclxuXHRcdC8vIFNNUDItMzQxNiBlbmRcclxuXHRcdHRoaXMucmVmLm1hcmtGb3JDaGVjaygpO1xyXG5cdFx0dGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBjYWxjdWxhdGVkRmlzdExhc3QoYXJncywgYWdncmVnYXRlVHlwZSwgZmllbGROYW1lKSB7XHJcblx0XHRpZiAoIWFyZ3Mucm93LmFjdHVhbFRleHQpIGFyZ3Mucm93LmFjdHVhbFRleHQgPSBhcmdzLnJvdy5mb3JtYXR0ZWRUZXh0O1xyXG5cdFx0aWYgKCFhcmdzLmNvbHVtbi5hY3R1YWxUZXh0KVxyXG5cdFx0XHRhcmdzLmNvbHVtbi5hY3R1YWxUZXh0ID0gYXJncy5jb2x1bW4uZm9ybWF0dGVkVGV4dDtcclxuXHRcdGxldCBmaWVsZCA9IHRoaXMuY29uZmlnRmllbGRzLmZpbHRlcihcclxuXHRcdFx0KGVsKSA9PiBlbC5jb2xOYW1lID09PSBmaWVsZE5hbWVcclxuXHRcdClbMF07XHJcblx0XHRpZiAoYXJncy5yb3dDZWxsVHlwZSA9PT0gXCJ2YWx1ZVwiICYmICFhcmdzLnJvdy5oYXNDaGlsZCkge1xyXG5cdFx0XHRpZiAoYXJncy5jZWxsU2V0c1swXSkge1xyXG5cdFx0XHRcdGlmIChhZ2dyZWdhdGVUeXBlID09PSBcIkZpcnN0XCIpIHtcclxuXHRcdFx0XHRcdGZvciAoXHJcblx0XHRcdFx0XHRcdGxldCBmaXJzdEluZGV4ID0gMDtcclxuXHRcdFx0XHRcdFx0Zmlyc3RJbmRleCA8IGFyZ3MuY2VsbFNldHMubGVuZ3RoO1xyXG5cdFx0XHRcdFx0XHRmaXJzdEluZGV4KytcclxuXHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdFx0dGhpcy5waXZvdE9iai5kYXRhU291cmNlU2V0dGluZ3MuY29sdW1ucy5sZW5ndGggPT1cclxuXHRcdFx0XHRcdFx0XHRcdDEgJiZcclxuXHRcdFx0XHRcdFx0XHRhcmdzLmNvbHVtbkNlbGxUeXBlID09IFwiZ3JhbmRUb3RhbFwiXHJcblx0XHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHRcdGZpZWxkLmRhdGFUeXBlID09IFwic3RyaW5nXCIgfHxcclxuXHRcdFx0XHRcdFx0XHRcdGZpZWxkLmRhdGFUeXBlID09IFwibnZhcmNoYXJcIiB8fFxyXG5cdFx0XHRcdFx0XHRcdFx0ZmllbGQuZGF0YVR5cGUgPT0gXCJkYXRlXCIgfHxcclxuXHRcdFx0XHRcdFx0XHRcdGZpZWxkLmRhdGFUeXBlID09IFwiZGF0ZXRpbWVcIlxyXG5cdFx0XHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0YXJncy52YWx1ZSA9IFwiXCI7XHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5hbGxEYXRhVmFsdWUgJiZcclxuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5hbGxEYXRhVmFsdWUubGVuZ3RoXHJcblx0XHRcdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IHJvd09ianMgPVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuYWxsRGF0YVZhbHVlW2FyZ3Mucm93LnJvd0luZGV4XTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHJvd09ianMpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgcm93T2Jqc0FyciA9IEpTT04ucGFyc2UoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRKU09OLnN0cmluZ2lmeShyb3dPYmpzKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IG9iaiA9IHJvd09ianNBcnIuZmlsdGVyKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KGVsKSA9PlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlbC5hY3R1YWxUZXh0ID09IGZpZWxkTmFtZSAmJlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlbC5pc0dyYW5kU3VtXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0KVswXTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob2JqKSBhcmdzLnZhbHVlID0gb2JqLnZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRhcmdzLnZhbHVlID0gaXNOYU4oXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0TnVtYmVyKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5ncmFuZFRvdGFsc1tcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJyb3dcIiArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YXJncy5yb3cuYWN0dWFsVGV4dCArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZmllbGROYW1lXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRdXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQpXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PyBudWxsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0OiBOdW1iZXIoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuZ3JhbmRUb3RhbHNbXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJyb3dcIiArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhcmdzLnJvdy5hY3R1YWxUZXh0ICtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZpZWxkTmFtZVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRdXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ICApO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRhcmdzLnZhbHVlID0gYXJncy5jZWxsU2V0c1tmaXJzdEluZGV4XVtmaWVsZE5hbWVdO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHRmaWVsZC5kYXRhVHlwZSA9PSBcIm51bWJlclwiIHx8XHJcblx0XHRcdFx0XHRcdFx0ZmllbGQuZGF0YVR5cGUgPT0gXCJtdWx0aXBsZVwiIHx8XHJcblx0XHRcdFx0XHRcdFx0ZmllbGQuZGF0YVR5cGUgPT0gXCJwZXJjZW50XCIgfHxcclxuXHRcdFx0XHRcdFx0XHRmaWVsZC5kYXRhVHlwZSA9PSBcInBlcmNlbnROdW1cIlxyXG5cdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAoYXJncy52YWx1ZSAhPSBudWxsKSBicmVhaztcclxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChcclxuXHRcdFx0XHRcdFx0XHRmaWVsZC5kYXRhVHlwZSA9PSBcImRhdGVcIiB8fFxyXG5cdFx0XHRcdFx0XHRcdGZpZWxkLmRhdGFUeXBlID09IFwiZGF0ZXRpbWVcIlxyXG5cdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5wYmYudGltZShhcmdzLnZhbHVlKSA+IFwiMTkwMC0wMS0wMVwiKSBicmVhaztcclxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChhcmdzLnZhbHVlKSBicmVhaztcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKGFnZ3JlZ2F0ZVR5cGUgPT09IFwiTGFzdFwiKSB7XHJcblx0XHRcdFx0XHRmb3IgKFxyXG5cdFx0XHRcdFx0XHRsZXQgbGFzdEluZGV4ID0gYXJncy5jZWxsU2V0cy5sZW5ndGggLSAxO1xyXG5cdFx0XHRcdFx0XHRsYXN0SW5kZXggPj0gMDtcclxuXHRcdFx0XHRcdFx0bGFzdEluZGV4LS1cclxuXHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdFx0dGhpcy5waXZvdE9iai5kYXRhU291cmNlU2V0dGluZ3MuY29sdW1ucy5sZW5ndGggPT1cclxuXHRcdFx0XHRcdFx0XHRcdDEgJiZcclxuXHRcdFx0XHRcdFx0XHRhcmdzLmNvbHVtbkNlbGxUeXBlID09IFwiZ3JhbmRUb3RhbFwiXHJcblx0XHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHRcdGZpZWxkLmRhdGFUeXBlID09IFwic3RyaW5nXCIgfHxcclxuXHRcdFx0XHRcdFx0XHRcdGZpZWxkLmRhdGFUeXBlID09IFwibnZhcmNoYXJcIiB8fFxyXG5cdFx0XHRcdFx0XHRcdFx0ZmllbGQuZGF0YVR5cGUgPT0gXCJkYXRlXCIgfHxcclxuXHRcdFx0XHRcdFx0XHRcdGZpZWxkLmRhdGFUeXBlID09IFwiZGF0ZXRpbWVcIlxyXG5cdFx0XHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0YXJncy52YWx1ZSA9IFwiXCI7XHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5hbGxEYXRhVmFsdWUgJiZcclxuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5hbGxEYXRhVmFsdWUubGVuZ3RoXHJcblx0XHRcdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IHJvd09ianMgPVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuYWxsRGF0YVZhbHVlW2FyZ3Mucm93LnJvd0luZGV4XTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHJvd09ianMpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgcm93T2Jqc0FyciA9IEpTT04ucGFyc2UoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRKU09OLnN0cmluZ2lmeShyb3dPYmpzKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IG9iaiA9IHJvd09ianNBcnIuZmlsdGVyKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KGVsKSA9PlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlbC5hY3R1YWxUZXh0ID09IGZpZWxkTmFtZSAmJlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlbC5pc0dyYW5kU3VtXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0KVswXTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob2JqKSBhcmdzLnZhbHVlID0gb2JqLnZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRhcmdzLnZhbHVlID0gaXNOYU4oXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0TnVtYmVyKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5ncmFuZFRvdGFsc1tcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJyb3dcIiArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YXJncy5yb3cuYWN0dWFsVGV4dCArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZmllbGROYW1lXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRdXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQpXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PyBudWxsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0OiBOdW1iZXIoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuZ3JhbmRUb3RhbHNbXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJyb3dcIiArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhcmdzLnJvdy5hY3R1YWxUZXh0ICtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZpZWxkTmFtZVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRdXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ICApO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRhcmdzLnZhbHVlID0gYXJncy5jZWxsU2V0c1tsYXN0SW5kZXhdW2ZpZWxkTmFtZV07XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHRmaWVsZC5kYXRhVHlwZSA9PSBcIm51bWJlclwiIHx8XHJcblx0XHRcdFx0XHRcdFx0ZmllbGQuZGF0YVR5cGUgPT0gXCJtdWx0aXBsZVwiIHx8XHJcblx0XHRcdFx0XHRcdFx0ZmllbGQuZGF0YVR5cGUgPT0gXCJwZXJjZW50XCIgfHxcclxuXHRcdFx0XHRcdFx0XHRmaWVsZC5kYXRhVHlwZSA9PSBcInBlcmNlbnROdW1cIlxyXG5cdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAoYXJncy52YWx1ZSAhPSBudWxsKSBicmVhaztcclxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChcclxuXHRcdFx0XHRcdFx0XHRmaWVsZC5kYXRhVHlwZSA9PSBcImRhdGVcIiB8fFxyXG5cdFx0XHRcdFx0XHRcdGZpZWxkLmRhdGFUeXBlID09IFwiZGF0ZXRpbWVcIlxyXG5cdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5wYmYudGltZShhcmdzLnZhbHVlKSA+IFwiMTkwMC0wMS0wMVwiKSBicmVhaztcclxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChhcmdzLnZhbHVlKSBicmVhaztcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdGZpZWxkLmRhdGFUeXBlID09IFwibnVtYmVyXCIgfHxcclxuXHRcdFx0XHRcdGZpZWxkLmRhdGFUeXBlID09IFwibXVsdGlwbGVcIiB8fFxyXG5cdFx0XHRcdFx0ZmllbGQuZGF0YVR5cGUgPT0gXCJwZXJjZW50XCIgfHxcclxuXHRcdFx0XHRcdGZpZWxkLmRhdGFUeXBlID09IFwicGVyY2VudE51bVwiXHJcblx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRpZiAodGhpcy5waXZvdE9iai5kYXRhU291cmNlU2V0dGluZ3Mucm93cy5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdFx0aWYgKCF0aGlzLnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy5jb2x1bW5zLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHRcdCFOdW1iZXIodGhpcy5ncmFuZFRvdGFsc1tmaWVsZE5hbWVdKSB8fFxyXG5cdFx0XHRcdFx0XHRcdFx0aXNOYU4oTnVtYmVyKHRoaXMuZ3JhbmRUb3RhbHNbZmllbGROYW1lXSkpXHJcblx0XHRcdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmdyYW5kVG90YWxzW2ZpZWxkTmFtZV0gPSAwO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRpZiAoYXJncy5hZ2dyZWdhdGVUeXBlICE9PSBcIkNhbGN1bGF0ZWRGaWVsZFwiKSB7XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmdyYW5kVG90YWxzW2ZpZWxkTmFtZV0gKz0gTnVtYmVyKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRhcmdzLnZhbHVlXHJcblx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChcclxuXHRcdFx0XHRcdFx0XHR0aGlzLnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy5jb2x1bW5zLmxlbmd0aCA9PSAxXHJcblx0XHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRcdC8vIFwicm93XCIgKyBhcmdzLnJvdy5hY3R1YWxUZXh0ICsgZmllbGROYW1lIOihqOekuihjZWxsOiBhcmdzLnJvd0NlbGxUeXBlID09PSBcInZhbHVlXCIgJiYgYXJncy5jb2x1bW5DZWxsVHlwZSA9PT0gXCJncmFuZFRvdGFsXCIpXHJcblx0XHRcdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHRcdFx0IU51bWJlcihcclxuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5ncmFuZFRvdGFsc1tcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcInJvd1wiICsgYXJncy5yb3cuYWN0dWFsVGV4dCArIGZpZWxkTmFtZVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRdXHJcblx0XHRcdFx0XHRcdFx0XHQpIHx8XHJcblx0XHRcdFx0XHRcdFx0XHRpc05hTihcclxuXHRcdFx0XHRcdFx0XHRcdFx0TnVtYmVyKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuZ3JhbmRUb3RhbHNbXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcInJvd1wiICtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YXJncy5yb3cuYWN0dWFsVGV4dCArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZpZWxkTmFtZVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdF1cclxuXHRcdFx0XHRcdFx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5ncmFuZFRvdGFsc1tcclxuXHRcdFx0XHRcdFx0XHRcdFx0XCJyb3dcIiArIGFyZ3Mucm93LmFjdHVhbFRleHQgKyBmaWVsZE5hbWVcclxuXHRcdFx0XHRcdFx0XHRcdF0gPSAwO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR0aGlzLmdyYW5kVG90YWxzW1xyXG5cdFx0XHRcdFx0XHRcdFx0XCJyb3dcIiArIGFyZ3Mucm93LmFjdHVhbFRleHQgKyBmaWVsZE5hbWVcclxuXHRcdFx0XHRcdFx0XHRdICs9IE51bWJlcihhcmdzLnZhbHVlKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0Ly8gXCJjb2xcIiArIGFyZ3MuY29sdW1uLmFjdHVhbFRleHQgKyBmaWVsZE5hbWUg6KGo56S6KGNlbGw6IGFyZ3Mucm93Q2VsbFR5cGUgPT09IFwiZ3JhbmRUb3RhbFwiICYmIGFyZ3MuY29sdW1uQ2VsbFR5cGUgPT09IFwidmFsdWVcIilcclxuXHRcdFx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdFx0XHQhTnVtYmVyKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLmdyYW5kVG90YWxzW1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwiY29sXCIgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YXJncy5jb2x1bW4uYWN0dWFsVGV4dCArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmaWVsZE5hbWVcclxuXHRcdFx0XHRcdFx0XHRcdFx0XVxyXG5cdFx0XHRcdFx0XHRcdFx0KSB8fFxyXG5cdFx0XHRcdFx0XHRcdFx0aXNOYU4oXHJcblx0XHRcdFx0XHRcdFx0XHRcdE51bWJlcihcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLmdyYW5kVG90YWxzW1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJjb2xcIiArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFyZ3MuY29sdW1uLmFjdHVhbFRleHQgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmaWVsZE5hbWVcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRdXHJcblx0XHRcdFx0XHRcdFx0XHRcdClcclxuXHRcdFx0XHRcdFx0XHRcdClcclxuXHRcdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuZ3JhbmRUb3RhbHNbXHJcblx0XHRcdFx0XHRcdFx0XHRcdFwiY29sXCIgKyBhcmdzLmNvbHVtbi5hY3R1YWxUZXh0ICsgZmllbGROYW1lXHJcblx0XHRcdFx0XHRcdFx0XHRdID0gMDtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5ncmFuZFRvdGFsc1tcclxuXHRcdFx0XHRcdFx0XHRcdFwiY29sXCIgKyBhcmdzLmNvbHVtbi5hY3R1YWxUZXh0ICsgZmllbGROYW1lXHJcblx0XHRcdFx0XHRcdFx0XSArPSBOdW1iZXIoYXJncy52YWx1ZSk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSBpZiAoYXJncy5yb3dDZWxsVHlwZSA9PT0gXCJzdWJUb3RhbFwiIHx8IGFyZ3Mucm93Lmhhc0NoaWxkKSB7XHJcblx0XHRcdGNvbnN0IGRhdGFUeXBlID0gZmllbGQuZGF0YVR5cGU7XHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHRkYXRhVHlwZSA9PT0gXCJzdHJpbmdcIiB8fFxyXG5cdFx0XHRcdGRhdGFUeXBlID09PSBcIm52YXJjaGFyXCIgfHxcclxuXHRcdFx0XHRkYXRhVHlwZSA9PSBcImRhdGVcIiB8fFxyXG5cdFx0XHRcdGRhdGFUeXBlID09IFwiZGF0ZXRpbWVcIlxyXG5cdFx0XHQpIHtcclxuXHRcdFx0XHRhcmdzLnZhbHVlID0gXCJcIjtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRsZXQgdmFsdWUgPSAwO1xyXG5cdFx0XHRcdGxldCBjaGlsZEhlYWRlcnMgPSBbXTtcclxuXHRcdFx0XHRpZiAoYWdncmVnYXRlVHlwZSA9PT0gXCJGaXJzdFwiKSB7XHJcblx0XHRcdFx0XHRsZXQgZ3JvdXBOYW1lQXJyYXlzID0gW107XHJcblx0XHRcdFx0XHRsZXQgcm93cyA9IHRoaXMucGl2b3RPYmouZGF0YVNvdXJjZVNldHRpbmdzLnJvd3M7XHJcblx0XHRcdFx0XHRmb3IgKFxyXG5cdFx0XHRcdFx0XHRsZXQgaW5kZXggPSBhcmdzLnJvdy5sZXZlbDtcclxuXHRcdFx0XHRcdFx0aW5kZXggPCByb3dzLmxlbmd0aDtcclxuXHRcdFx0XHRcdFx0aW5kZXgrK1xyXG5cdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdGdyb3VwTmFtZUFycmF5cy5wdXNoKHJvd3NbaW5kZXhdLm5hbWUpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzLmNlbGxTZXRzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0XHRcdGxldCB2YWx1ZXMgPSBbXTtcclxuXHRcdFx0XHRcdFx0bGV0IGhlYWRlciA9IGdyb3VwTmFtZUFycmF5c1xyXG5cdFx0XHRcdFx0XHRcdC5tYXAoKG5hbWUpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlcy5wdXNoKGFyZ3MuY2VsbFNldHNbaV1bbmFtZV0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGFyZ3MuY2VsbFNldHNbaV1bbmFtZV07XHJcblx0XHRcdFx0XHRcdFx0fSlcclxuXHRcdFx0XHRcdFx0XHQuam9pbihcIi1cIik7XHJcblx0XHRcdFx0XHRcdGlmICghKGNoaWxkSGVhZGVycyBhcyBhbnkpLmluY2x1ZGVzKGhlYWRlcikpIHtcclxuXHRcdFx0XHRcdFx0XHRsZXQgZmlsdGVyT2JqOiBhbnkgPSB7fTtcclxuXHRcdFx0XHRcdFx0XHRncm91cE5hbWVBcnJheXMubWFwKFxyXG5cdFx0XHRcdFx0XHRcdFx0KG5hbWUsIHgpID0+IChmaWx0ZXJPYmpbbmFtZV0gPSB2YWx1ZXNbeF0pXHJcblx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0XHRsZXQgX0NlbGxTZXRzID0gX2ZpbHRlcihhcmdzLmNlbGxTZXRzLCBmaWx0ZXJPYmopO1xyXG5cdFx0XHRcdFx0XHRcdGNoaWxkSGVhZGVycy5wdXNoKGhlYWRlcik7XHJcblx0XHRcdFx0XHRcdFx0dmFsdWUgKz0gTnVtYmVyKF9DZWxsU2V0c1swXVtmaWVsZE5hbWVdKSB8fCAwO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmIChhZ2dyZWdhdGVUeXBlID09PSBcIkxhc3RcIikge1xyXG5cdFx0XHRcdFx0bGV0IGdyb3VwTmFtZUFycmF5cyA9IFtdO1xyXG5cdFx0XHRcdFx0bGV0IHJvd3MgPSB0aGlzLnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy5yb3dzO1xyXG5cdFx0XHRcdFx0Zm9yIChcclxuXHRcdFx0XHRcdFx0bGV0IGluZGV4ID0gYXJncy5yb3cubGV2ZWw7XHJcblx0XHRcdFx0XHRcdGluZGV4IDwgcm93cy5sZW5ndGg7XHJcblx0XHRcdFx0XHRcdGluZGV4KytcclxuXHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRncm91cE5hbWVBcnJheXMucHVzaChyb3dzW2luZGV4XS5uYW1lKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGZvciAobGV0IGkgPSBhcmdzLmNlbGxTZXRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcblx0XHRcdFx0XHRcdGxldCB2YWx1ZXMgPSBbXTtcclxuXHRcdFx0XHRcdFx0bGV0IGhlYWRlciA9IGdyb3VwTmFtZUFycmF5c1xyXG5cdFx0XHRcdFx0XHRcdC5tYXAoKG5hbWUpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlcy5wdXNoKGFyZ3MuY2VsbFNldHNbaV1bbmFtZV0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGFyZ3MuY2VsbFNldHNbaV1bbmFtZV07XHJcblx0XHRcdFx0XHRcdFx0fSlcclxuXHRcdFx0XHRcdFx0XHQuam9pbihcIi1cIik7XHJcblx0XHRcdFx0XHRcdGlmICghKGNoaWxkSGVhZGVycyBhcyBhbnkpLmluY2x1ZGVzKGhlYWRlcikpIHtcclxuXHRcdFx0XHRcdFx0XHRsZXQgZmlsdGVyT2JqOiBhbnkgPSB7fTtcclxuXHRcdFx0XHRcdFx0XHRncm91cE5hbWVBcnJheXMubWFwKFxyXG5cdFx0XHRcdFx0XHRcdFx0KG5hbWUsIHgpID0+IChmaWx0ZXJPYmpbbmFtZV0gPSB2YWx1ZXNbeF0pXHJcblx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0XHRsZXQgX0NlbGxTZXRzID0gX2ZpbHRlcihhcmdzLmNlbGxTZXRzLCBmaWx0ZXJPYmopO1xyXG5cdFx0XHRcdFx0XHRcdGNoaWxkSGVhZGVycy5wdXNoKGhlYWRlcik7XHJcblx0XHRcdFx0XHRcdFx0dmFsdWUgKz1cclxuXHRcdFx0XHRcdFx0XHRcdE51bWJlcihcclxuXHRcdFx0XHRcdFx0XHRcdFx0X0NlbGxTZXRzW19DZWxsU2V0cy5sZW5ndGggLSAxXVtmaWVsZE5hbWVdXHJcblx0XHRcdFx0XHRcdFx0XHQpIHx8IDA7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmIChhcmdzLmNvbHVtbi5hY3R1YWxUZXh0ICE9PSBcIkdyYW5kIFRvdGFsXCIpXHJcblx0XHRcdFx0XHR0aGlzLmNvbHVtblRleHRzLnB1c2goYXJncy5jb2x1bW4uYWN0dWFsVGV4dCk7XHJcblxyXG5cdFx0XHRcdGlmICghdGhpcy5waXZvdE9iai5kYXRhU291cmNlU2V0dGluZ3MuY29sdW1ucy5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0IU51bWJlcih0aGlzLnN1YlRvdGFsc1tmaWVsZE5hbWVdKSB8fFxyXG5cdFx0XHRcdFx0XHRpc05hTihOdW1iZXIodGhpcy5zdWJUb3RhbHNbZmllbGROYW1lXSkpXHJcblx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5zdWJUb3RhbHNbZmllbGROYW1lXSA9IDA7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR0aGlzLnN1YlRvdGFsc1tmaWVsZE5hbWVdICs9IE51bWJlcih2YWx1ZSk7XHJcblx0XHRcdFx0fSBlbHNlIGlmIChcclxuXHRcdFx0XHRcdHRoaXMucGl2b3RPYmouZGF0YVNvdXJjZVNldHRpbmdzLmNvbHVtbnMubGVuZ3RoID09IDFcclxuXHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0IU51bWJlcihcclxuXHRcdFx0XHRcdFx0XHR0aGlzLnN1YlRvdGFsc1tcclxuXHRcdFx0XHRcdFx0XHRcdGFyZ3Mucm93LmFjdHVhbFRleHQgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRhcmdzLmNvbHVtbi5hY3R1YWxUZXh0ICtcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZmllbGROYW1lXHJcblx0XHRcdFx0XHRcdFx0XVxyXG5cdFx0XHRcdFx0XHQpIHx8XHJcblx0XHRcdFx0XHRcdGlzTmFOKFxyXG5cdFx0XHRcdFx0XHRcdE51bWJlcihcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuc3ViVG90YWxzW1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRhcmdzLnJvdy5hY3R1YWxUZXh0ICtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRhcmdzLmNvbHVtbi5hY3R1YWxUZXh0ICtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmaWVsZE5hbWVcclxuXHRcdFx0XHRcdFx0XHRcdF1cclxuXHRcdFx0XHRcdFx0XHQpXHJcblx0XHRcdFx0XHRcdClcclxuXHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnN1YlRvdGFsc1tcclxuXHRcdFx0XHRcdFx0XHRhcmdzLnJvdy5hY3R1YWxUZXh0ICtcclxuXHRcdFx0XHRcdFx0XHRcdGFyZ3MuY29sdW1uLmFjdHVhbFRleHQgK1xyXG5cdFx0XHRcdFx0XHRcdFx0ZmllbGROYW1lXHJcblx0XHRcdFx0XHRcdF0gPSAwO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0dGhpcy5zdWJUb3RhbHNbXHJcblx0XHRcdFx0XHRcdGFyZ3Mucm93LmFjdHVhbFRleHQgKyBhcmdzLmNvbHVtbi5hY3R1YWxUZXh0ICsgZmllbGROYW1lXHJcblx0XHRcdFx0XHRdICs9IE51bWJlcih2YWx1ZSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdC8vIC0tLT4gYWxsRGF0YVZhbHVl5Lit6L+Z5Liq5Y2V5YWD5qC855qE5YC85LiN5q2j56GuXHJcblx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0YXJncy5jb2x1bW5DZWxsVHlwZSA9PT0gXCJncmFuZFRvdGFsXCIgJiZcclxuXHRcdFx0XHRcdHRoaXMucGl2b3RPYmouZGF0YVNvdXJjZVNldHRpbmdzLmNvbHVtbnMubGVuZ3RoID09IDFcclxuXHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdGlmICh0aGlzLmFsbERhdGFWYWx1ZSAmJiB0aGlzLmFsbERhdGFWYWx1ZS5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdFx0YXJncy52YWx1ZSA9XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5zdWJUb3RhbHNbXHJcblx0XHRcdFx0XHRcdFx0XHRhcmdzLnJvdy5hY3R1YWxUZXh0ICsgXCJHcmFuZCBUb3RhbFwiICsgZmllbGROYW1lXHJcblx0XHRcdFx0XHRcdFx0XTtcclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuY29sdW1uVGV4dHMgPSB1bmlxQnkodGhpcy5jb2x1bW5UZXh0cywgKGVsKSA9PiBlbCk7XHJcblx0XHRcdFx0XHRcdGxldCB2YWwgPSAwO1xyXG5cdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29sdW1uVGV4dHMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBlbGVtZW50ID0gdGhpcy5jb2x1bW5UZXh0c1tpXTtcclxuXHRcdFx0XHRcdFx0XHR2YWwgKz1cclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuc3ViVG90YWxzW1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRhcmdzLnJvdy5hY3R1YWxUZXh0ICsgZWxlbWVudCArIGZpZWxkTmFtZVxyXG5cdFx0XHRcdFx0XHRcdFx0XTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRhcmdzLnZhbHVlID0gdmFsO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRhcmdzLnZhbHVlID0gdmFsdWU7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2UgaWYgKGFyZ3Mucm93Q2VsbFR5cGUgPT09IFwiZ3JhbmRUb3RhbFwiKSB7XHJcblx0XHRcdGNvbnN0IGRhdGFUeXBlID0gZmllbGQuZGF0YVR5cGU7XHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHRkYXRhVHlwZSA9PSBcInN0cmluZ1wiIHx8XHJcblx0XHRcdFx0ZGF0YVR5cGUgPT0gXCJudmFyY2hhclwiIHx8XHJcblx0XHRcdFx0ZGF0YVR5cGUgPT0gXCJkYXRlXCIgfHxcclxuXHRcdFx0XHRkYXRhVHlwZSA9PSBcImRhdGV0aW1lXCJcclxuXHRcdFx0KSB7XHJcblx0XHRcdFx0YXJncy52YWx1ZSA9IFwiXCI7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0aWYgKCF0aGlzLnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy5jb2x1bW5zLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMuYWxsRGF0YVZhbHVlICYmIHRoaXMuYWxsRGF0YVZhbHVlLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0XHRsZXQgcm93T2JqcyA9XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5hbGxEYXRhVmFsdWVbdGhpcy5hbGxEYXRhVmFsdWUubGVuZ3RoIC0gMV07XHJcblx0XHRcdFx0XHRcdGlmIChyb3dPYmpzKSB7XHJcblx0XHRcdFx0XHRcdFx0bGV0IHJvd09ianNBcnIgPSBKU09OLnBhcnNlKFxyXG5cdFx0XHRcdFx0XHRcdFx0SlNPTi5zdHJpbmdpZnkocm93T2JqcylcclxuXHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdGxldCBvYmpBcnIgPSByb3dPYmpzQXJyLmZpbHRlcihcclxuXHRcdFx0XHRcdFx0XHRcdChlbCkgPT5cclxuXHRcdFx0XHRcdFx0XHRcdFx0ZWwuYWN0dWFsVGV4dCA9PSBmaWVsZE5hbWUgJiYgZWwuaXNHcmFuZFN1bVxyXG5cdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0aWYgKG9iakFyciAmJiBvYmpBcnIubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRhcmdzLnZhbHVlID0gb2JqQXJyW29iakFyci5sZW5ndGggLSAxXS52YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKFxyXG5cdFx0XHRcdFx0XHRcdFx0T2JqZWN0LmtleXModGhpcy5ncmFuZFRvdGFscykuaW5jbHVkZXMoXHJcblx0XHRcdFx0XHRcdFx0XHRcdGZpZWxkTmFtZVxyXG5cdFx0XHRcdFx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0YXJncy52YWx1ZSA9IHRoaXMuZ3JhbmRUb3RhbHNbZmllbGROYW1lXTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdGFyZ3MudmFsdWUgPSB0aGlzLmdyYW5kVG90YWxzW2ZpZWxkTmFtZV07XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdGlmIChhcmdzLmNvbHVtbkNlbGxUeXBlID09PSBcImdyYW5kVG90YWxcIikge1xyXG5cdFx0XHRcdFx0XHRpZiAodGhpcy5hbGxEYXRhVmFsdWUgJiYgdGhpcy5hbGxEYXRhVmFsdWUubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRcdFx0bGV0IHJvd09ianMgPVxyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5hbGxEYXRhVmFsdWVbdGhpcy5hbGxEYXRhVmFsdWUubGVuZ3RoIC0gMV07XHJcblx0XHRcdFx0XHRcdFx0aWYgKHJvd09ianMpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGxldCByb3dPYmpzQXJyID0gSlNPTi5wYXJzZShcclxuXHRcdFx0XHRcdFx0XHRcdFx0SlNPTi5zdHJpbmdpZnkocm93T2JqcylcclxuXHRcdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0XHRsZXQgb2JqQXJyID0gcm93T2Jqc0Fyci5maWx0ZXIoXHJcblx0XHRcdFx0XHRcdFx0XHRcdChlbCkgPT5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRlbC5hY3R1YWxUZXh0ID09IGZpZWxkTmFtZSAmJlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGVsLmlzR3JhbmRTdW1cclxuXHRcdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAob2JqQXJyICYmIG9iakFyci5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0YXJncy52YWx1ZSA9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0b2JqQXJyW29iakFyci5sZW5ndGggLSAxXS52YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdFx0XHRcdFx0XHRcdE9iamVjdC5rZXlzKHRoaXMuZ3JhbmRUb3RhbHMpLmluY2x1ZGVzKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwiY29sXCIgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YXJncy5jb2x1bW4uYWN0dWFsVGV4dCArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmaWVsZE5hbWVcclxuXHRcdFx0XHRcdFx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGFyZ3MudmFsdWUgPVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuZ3JhbmRUb3RhbHNbXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcImNvbFwiICtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YXJncy5jb2x1bW4uYWN0dWFsVGV4dCArXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZpZWxkTmFtZVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdF07XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdGFyZ3MudmFsdWUgPVxyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5ncmFuZFRvdGFsc1tcclxuXHRcdFx0XHRcdFx0XHRcdFx0XCJjb2xcIiArIGFyZ3MuY29sdW1uLmFjdHVhbFRleHQgKyBmaWVsZE5hbWVcclxuXHRcdFx0XHRcdFx0XHRcdF07XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdGlmICh0aGlzLmFsbERhdGFWYWx1ZSAmJiB0aGlzLmFsbERhdGFWYWx1ZS5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdFx0XHRsZXQgcm93T2JqcyA9XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmFsbERhdGFWYWx1ZVt0aGlzLmFsbERhdGFWYWx1ZS5sZW5ndGggLSAxXTtcclxuXHRcdFx0XHRcdFx0XHRsZXQgcm93T2Jqc0FyciA9IEpTT04ucGFyc2UoXHJcblx0XHRcdFx0XHRcdFx0XHRKU09OLnN0cmluZ2lmeShyb3dPYmpzKVxyXG5cdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0bGV0IG9iakFyciA9IHJvd09ianNBcnIuZmlsdGVyKFxyXG5cdFx0XHRcdFx0XHRcdFx0KGVsKSA9PlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRlbC5hY3R1YWxUZXh0ID09IGZpZWxkTmFtZSAmJlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRlbC5pc0dyYW5kU3VtICYmXHJcblx0XHRcdFx0XHRcdFx0XHRcdGVsLmNvbHVtbkhlYWRlcnMgPT0gYXJncy5jb2x1bW4uYWN0dWFsVGV4dFxyXG5cdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0aWYgKG9iakFyciAmJiBvYmpBcnIubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRhcmdzLnZhbHVlID0gb2JqQXJyW29iakFyci5sZW5ndGggLSAxXS52YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKFxyXG5cdFx0XHRcdFx0XHRcdFx0T2JqZWN0LmtleXModGhpcy5ncmFuZFRvdGFscykuaW5jbHVkZXMoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFwiY29sXCIgKyBhcmdzLmNvbHVtbi5hY3R1YWxUZXh0ICsgZmllbGROYW1lXHJcblx0XHRcdFx0XHRcdFx0XHQpXHJcblx0XHRcdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRhcmdzLnZhbHVlID1cclxuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5ncmFuZFRvdGFsc1tcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcImNvbFwiICtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFyZ3MuY29sdW1uLmFjdHVhbFRleHQgK1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZmllbGROYW1lXHJcblx0XHRcdFx0XHRcdFx0XHRcdF07XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdGFyZ3MudmFsdWUgPVxyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5ncmFuZFRvdGFsc1tcclxuXHRcdFx0XHRcdFx0XHRcdFx0XCJjb2xcIiArIGFyZ3MuY29sdW1uLmFjdHVhbFRleHQgKyBmaWVsZE5hbWVcclxuXHRcdFx0XHRcdFx0XHRcdF07XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHRoaXMuZm9ybWF0VmFsKGFyZ3MsIGZpZWxkTmFtZSk7XHJcblx0XHRyZXR1cm4gYXJncy52YWx1ZTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgZm9ybWF0VmFsKGFyZ3MsIGZpZWxkTmFtZSkge1xyXG5cdFx0dGhpcy5jb25maWdGaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcclxuXHRcdFx0aWYgKGZpZWxkLmNvbE5hbWUgPT0gZmllbGROYW1lKSB7XHJcblx0XHRcdFx0c3dpdGNoIChmaWVsZC5kYXRhVHlwZSkge1xyXG5cdFx0XHRcdFx0Y2FzZSBcImRhdGVcIjpcclxuXHRcdFx0XHRcdGNhc2UgXCJkYXRldGltZVwiOlxyXG5cdFx0XHRcdFx0XHRpZiAoYXJncy52YWx1ZSkgYXJncy52YWx1ZSA9IG5ldyBEYXRlKGFyZ3MudmFsdWUpO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGdldGV4Y2x1ZGVGaWVsZHMoZmllbGRzLCBkYXRhKSB7XHJcblx0XHRsZXQgbmFtZWFycmF5ID0gW107XHJcblx0XHRsZXQgYXJyYXkgPSBbXTtcclxuXHRcdGZvciAobGV0IHByb3AgaW4gZGF0YSkge1xyXG5cdFx0XHRhcnJheS5wdXNoKHByb3ApO1xyXG5cdFx0fVxyXG5cdFx0Zm9yIChsZXQgaXRlbSBvZiBmaWVsZHMpIHtcclxuXHRcdFx0bmFtZWFycmF5LnB1c2goaXRlbS5jb2xOYW1lKTtcclxuXHRcdH1cclxuXHRcdHRoaXMuZXhjbHVkZUZpZWxkcyA9IGRpZmZlcmVuY2VXaXRoKGFycmF5LCBuYW1lYXJyYXkpO1xyXG5cdFx0aWYgKFxyXG5cdFx0XHR0aGlzLmV4Y2x1ZGVGaWVsZHMubGVuZ3RoICYmXHJcblx0XHRcdHRoaXMuY29uZmlnLmdyb3VwU2V0dGluZ3MgJiZcclxuXHRcdFx0dGhpcy5jb25maWcuZ3JvdXBTZXR0aW5ncy5sZW5ndGhcclxuXHRcdCkge1xyXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZXhjbHVkZUZpZWxkcy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdGNvbnN0IGVsID0gdGhpcy5leGNsdWRlRmllbGRzW2ldO1xyXG5cdFx0XHRcdGlmIChzdGFydHNXaXRoKGVsLCB0aGlzLmNvbmZpZy5ncm91cFNldHRpbmdzWzBdLm5hbWUgKyBcIl9cIikpIHtcclxuXHRcdFx0XHRcdHRoaXMuZXhjbHVkZUZpZWxkcy5zcGxpY2UoaSwgMSk7XHJcblx0XHRcdFx0XHRpLS07XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGdldEluZm8oKSB7XHJcblx0XHR0aGlzLmRhdGVQaXBlRm9ybWF0ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJkYXRlUGlwZVwiKTtcclxuXHRcdHRoaXMudHJhbnNsYXRpb24gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwidHJhbnNsYXRpb25cIikpO1xyXG5cdH1cclxuXHJcblx0cHVibGljIG9uRmllbGREcm9wKGFyZ3M6IEZpZWxkRHJvcEV2ZW50QXJncykge1xyXG5cdFx0dGhpcy5kYXRhU291cmNlU2V0dGluZ3MudmFsdWVzID0gWy4uLmFyZ3MuZGF0YVNvdXJjZVNldHRpbmdzLnZhbHVlc107XHJcblx0XHQvL2NoYW5nZSB0aGUgY2FsY3VhbHRlRmllbGQgbWV0aG9kIHVzZSB0aGUgY29ycmVzcG9uZGluZyBjYWxjdWxhdGVcclxuXHRcdGNvbnN0IGNhbGN1YWx0ZUZpZWxkID0gdGhpcy5jb25maWdGaWVsZHMuZmlsdGVyKFxyXG5cdFx0XHQoZWwpID0+IGVsLmNvbE5hbWUgPT09IGFyZ3MuZmllbGROYW1lICYmIGVsLmlzQ2FsY3VsYXRlZEZpZWxkXHJcblx0XHQpO1xyXG5cdFx0aWYgKGNhbGN1YWx0ZUZpZWxkLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0YXJncy5kcm9wRmllbGQudHlwZSA9XHJcblx0XHRcdFx0dGhpcy5kYXNoYm9hcmRQb3JsZXRzU2VydmljZS5nZXRDYWxjdWxhdGVNZXRob2QoXHJcblx0XHRcdFx0XHRjYWxjdWFsdGVGaWVsZFswXS5jb2xOYW1lXHJcblx0XHRcdFx0KSBhcyBhbnk7XHJcblx0XHRcdGFyZ3MuZHJvcEZpZWxkLmNhcHRpb24gPSBhcmdzLmRyb3BGaWVsZC5jYXB0aW9uXHJcblx0XHRcdFx0LnJlcGxhY2UoXCJDYWxjdWxhdGVcIiwgXCJcIilcclxuXHRcdFx0XHQudHJpbSgpO1xyXG5cdFx0fVxyXG5cdFx0Zm9yIChcclxuXHRcdFx0bGV0IGkgPSAwO1xyXG5cdFx0XHRpIDwgYXJncy5kYXRhU291cmNlU2V0dGluZ3MuZmlsdGVyU2V0dGluZ3MubGVuZ3RoO1xyXG5cdFx0XHRpKytcclxuXHRcdCkge1xyXG5cdFx0XHRpZiAoXHJcblx0XHRcdFx0YXJncy5kYXRhU291cmNlU2V0dGluZ3MuZmlsdGVyU2V0dGluZ3NbaV0ubmFtZSA9PT1cclxuXHRcdFx0XHRcdGFyZ3MuZmllbGROYW1lICYmXHJcblx0XHRcdFx0YXJncy5kcm9wQXhpcyA9PT0gXCJcIlxyXG5cdFx0XHQpIHtcclxuXHRcdFx0XHRhcmdzLmRhdGFTb3VyY2VTZXR0aW5ncy5maWx0ZXJTZXR0aW5ncy5zcGxpY2UoaSwgMSk7XHJcblx0XHRcdFx0dGhpcy5maWx0ZXJTZXR0aW5ncyA9IGFyZ3MuZGF0YVNvdXJjZVNldHRpbmdzLmZpbHRlclNldHRpbmdzO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvLyBDYWxjdWxhdGVkIGZpZWxk5LqL5Lu277ya5Yib5bu6XHJcblx0cHVibGljIGNhbGN1bGF0ZWRGaWVsZENyZWF0ZShhcmdzOiBDYWxjdWxhdGVkRmllbGRDcmVhdGVFdmVudEFyZ3MpIHtcclxuXHRcdGlmIChcclxuXHRcdFx0YXJncy5jYWxjdWxhdGVkRmllbGQubmFtZSAhPT0gXCJcIiAmJlxyXG5cdFx0XHRhcmdzLmNhbGN1bGF0ZWRGaWVsZC5uYW1lLnRyaW0oKSAhPT0gXCJcIlxyXG5cdFx0KSB7XHJcblx0XHRcdGxldCBpbmRleCA9XHJcblx0XHRcdFx0dGhpcy5maWVsZGxpc3RPYmouZGF0YVNvdXJjZVNldHRpbmdzLmNhbGN1bGF0ZWRGaWVsZFNldHRpbmdzLmZpbmRJbmRleChcclxuXHRcdFx0XHRcdChlbCkgPT4gZWwubmFtZSA9PT0gYXJncy5jYWxjdWxhdGVkRmllbGQubmFtZVxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdGlmIChpbmRleCAhPT0gLTEpIHtcclxuXHRcdFx0XHRpZiAoYXJncy5jYWxjdWxhdGVkRmllbGQuZm9ybWF0U3RyaW5nID09PSBcIlwiKSB7XHJcblx0XHRcdFx0XHR0aGlzLmZpZWxkbGlzdE9iai5kYXRhU291cmNlU2V0dGluZ3MuY2FsY3VsYXRlZEZpZWxkU2V0dGluZ3NbXHJcblx0XHRcdFx0XHRcdGluZGV4XHJcblx0XHRcdFx0XHRdLmZvcm1hdFN0cmluZyA9IFwiTjJcIjtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0dGhpcy5maWVsZGxpc3RPYmouZGF0YVNvdXJjZVNldHRpbmdzLmNhbGN1bGF0ZWRGaWVsZFNldHRpbmdzW1xyXG5cdFx0XHRcdFx0XHRpbmRleFxyXG5cdFx0XHRcdFx0XS5mb3JtYXRTdHJpbmcgPSBhcmdzLmNhbGN1bGF0ZWRGaWVsZC5mb3JtYXRTdHJpbmc7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGlmIChhcmdzLmNhbGN1bGF0ZWRGaWVsZC5mb3JtYXRTdHJpbmcgPT09IFwiXCIpIHtcclxuXHRcdFx0XHRcdGFyZ3MuY2FsY3VsYXRlZEZpZWxkLmZvcm1hdFN0cmluZyA9IFwiTjJcIjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0Ly8g56e76Zmk6YeN5aSNXHJcblx0XHRcdGxldCBmSW5kZXggPSB0aGlzLmN1c3RvbUNhbGN1bGF0ZWRGaWVsZHMuZmluZEluZGV4KFxyXG5cdFx0XHRcdChmKSA9PiBmLm5hbWUgPT09IGFyZ3MuY2FsY3VsYXRlZEZpZWxkLm5hbWVcclxuXHRcdFx0KTtcclxuXHRcdFx0aWYgKGZJbmRleCA+IC0xKSB7XHJcblx0XHRcdFx0dGhpcy5jdXN0b21DYWxjdWxhdGVkRmllbGRzLnNwbGljZShmSW5kZXgsIDEpO1xyXG5cdFx0XHR9XHJcblx0XHRcdC8vIOWMuemFjei/kOeul+espiBGaXJzdCB8fCBMYXN0XHJcblx0XHRcdGxldCBmb3JtdWxhU3RyID0gYXJncy5jYWxjdWxhdGVkRmllbGQuZm9ybXVsYTtcclxuXHRcdFx0bGV0IHJlZzEgPSAvXCJGaXJzdFxcKCguKz8pXFwpXCIvZztcclxuXHRcdFx0bGV0IHJlZzIgPSAvXCJMYXN0XFwoKC4rPylcXClcIi9nO1xyXG5cdFx0XHRpZiAocmVnMS50ZXN0KGZvcm11bGFTdHIpIHx8IHJlZzIudGVzdChmb3JtdWxhU3RyKSkge1xyXG5cdFx0XHRcdC8vIOWIpOaWreaYr+WQpuWtmOWcqEZpcnN0IHx8IExhc3Qg6KGo6L6+5byPXHJcblx0XHRcdFx0bGV0IG1hdGNoRmlyc3RGaWVsZHMgPSBBcnJheS5mcm9tKFxyXG5cdFx0XHRcdFx0Zm9ybXVsYVN0cltcIm1hdGNoQWxsXCJdKC9cIkZpcnN0XFwoKC4rPylcXClcIi9nKSxcclxuXHRcdFx0XHRcdChtKSA9PiB7XHJcblx0XHRcdFx0XHRcdHJldHVybiB7XHJcblx0XHRcdFx0XHRcdFx0bWF0Y2hTdHI6IG1bMF0sXHJcblx0XHRcdFx0XHRcdFx0bWF0Y2hXb3JkOiBtWzFdLFxyXG5cdFx0XHRcdFx0XHRcdHJlcGxhY2VWYWx1ZTogXCJcIixcclxuXHRcdFx0XHRcdFx0XHRtYXRjaE1ldGhvZDogXCJGaXJzdFwiLFxyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdFx0bGV0IG1hdGNoTGFzdEZpZWxkcyA9IEFycmF5LmZyb20oXHJcblx0XHRcdFx0XHRmb3JtdWxhU3RyW1wibWF0Y2hBbGxcIl0oL1wiTGFzdFxcKCguKz8pXFwpXCIvZyksXHJcblx0XHRcdFx0XHQobSkgPT4ge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdFx0XHRcdG1hdGNoU3RyOiBtWzBdLFxyXG5cdFx0XHRcdFx0XHRcdG1hdGNoV29yZDogbVsxXSxcclxuXHRcdFx0XHRcdFx0XHRyZXBsYWNlVmFsdWU6IFwiXCIsXHJcblx0XHRcdFx0XHRcdFx0bWF0Y2hNZXRob2Q6IFwiTGFzdFwiLFxyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdFx0bGV0IG1hdGNoTWF4RmllbGRzID0gQXJyYXkuZnJvbShcclxuXHRcdFx0XHRcdGZvcm11bGFTdHJbXCJtYXRjaEFsbFwiXSgvXCJNYXhcXCgoLis/KVxcKVwiL2cpLFxyXG5cdFx0XHRcdFx0KG0pID0+IHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRcdFx0XHRtYXRjaFN0cjogbVswXSxcclxuXHRcdFx0XHRcdFx0XHRtYXRjaFdvcmQ6IG1bMV0sXHJcblx0XHRcdFx0XHRcdFx0cmVwbGFjZVZhbHVlOiBcIlwiLFxyXG5cdFx0XHRcdFx0XHRcdG1hdGNoTWV0aG9kOiBcIk1heFwiLFxyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdFx0bGV0IG1hdGNoTWluRmllbGRzID0gQXJyYXkuZnJvbShcclxuXHRcdFx0XHRcdGZvcm11bGFTdHJbXCJtYXRjaEFsbFwiXSgvXCJNaW5cXCgoLis/KVxcKVwiL2cpLFxyXG5cdFx0XHRcdFx0KG0pID0+IHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRcdFx0XHRtYXRjaFN0cjogbVswXSxcclxuXHRcdFx0XHRcdFx0XHRtYXRjaFdvcmQ6IG1bMV0sXHJcblx0XHRcdFx0XHRcdFx0cmVwbGFjZVZhbHVlOiBcIlwiLFxyXG5cdFx0XHRcdFx0XHRcdG1hdGNoTWV0aG9kOiBcIk1pblwiLFxyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdFx0bGV0IG1hdGNoU3VtRmllbGRzID0gQXJyYXkuZnJvbShcclxuXHRcdFx0XHRcdGZvcm11bGFTdHJbXCJtYXRjaEFsbFwiXSgvXCJTdW1cXCgoLis/KVxcKVwiL2cpLFxyXG5cdFx0XHRcdFx0KG0pID0+IHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRcdFx0XHRtYXRjaFN0cjogbVswXSxcclxuXHRcdFx0XHRcdFx0XHRtYXRjaFdvcmQ6IG1bMV0sXHJcblx0XHRcdFx0XHRcdFx0cmVwbGFjZVZhbHVlOiBcIlwiLFxyXG5cdFx0XHRcdFx0XHRcdG1hdGNoTWV0aG9kOiBcIlN1bVwiLFxyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdFx0bGV0IG1hdGNoQXZnRmllbGRzID0gQXJyYXkuZnJvbShcclxuXHRcdFx0XHRcdGZvcm11bGFTdHJbXCJtYXRjaEFsbFwiXSgvXCJBdmdcXCgoLis/KVxcKVwiL2cpLFxyXG5cdFx0XHRcdFx0KG0pID0+IHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRcdFx0XHRtYXRjaFN0cjogbVswXSxcclxuXHRcdFx0XHRcdFx0XHRtYXRjaFdvcmQ6IG1bMV0sXHJcblx0XHRcdFx0XHRcdFx0cmVwbGFjZVZhbHVlOiBcIlwiLFxyXG5cdFx0XHRcdFx0XHRcdG1hdGNoTWV0aG9kOiBcIkF2Z1wiLFxyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0bWF0Y2hGaXJzdEZpZWxkcy5ldmVyeSgoeCkgPT5cclxuXHRcdFx0XHRcdFx0dGhpcy5hbGxvd2VkQ2FsY3VsYXRlZEZpZWxkcy5pbmNsdWRlcyh4Lm1hdGNoV29yZClcclxuXHRcdFx0XHRcdCkgJiZcclxuXHRcdFx0XHRcdG1hdGNoTGFzdEZpZWxkcy5ldmVyeSgoeCkgPT5cclxuXHRcdFx0XHRcdFx0dGhpcy5hbGxvd2VkQ2FsY3VsYXRlZEZpZWxkcy5pbmNsdWRlcyh4Lm1hdGNoV29yZClcclxuXHRcdFx0XHRcdClcclxuXHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdC8vIOWIpOaWrUZpcnN05ZKMTGFzdOihqOi+vuW8j+WGheeahOWtl+auteaYr+WQpuWQiOazlVxyXG5cdFx0XHRcdFx0dGhpcy5jdXN0b21DYWxjdWxhdGVkRmllbGRzLnB1c2goe1xyXG5cdFx0XHRcdFx0XHRuYW1lOiBhcmdzLmNhbGN1bGF0ZWRGaWVsZC5uYW1lLFxyXG5cdFx0XHRcdFx0XHRmb3JtdWxhOiBhcmdzLmNhbGN1bGF0ZWRGaWVsZC5mb3JtdWxhLFxyXG5cdFx0XHRcdFx0XHRtYXRjaEZpZWxkczogW1xyXG5cdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcclxuXHRcdFx0XHRcdFx0XHQuLi5tYXRjaEZpcnN0RmllbGRzLFxyXG5cdFx0XHRcdFx0XHRcdC4uLm1hdGNoTGFzdEZpZWxkcyxcclxuXHRcdFx0XHRcdFx0XHQuLi5tYXRjaE1heEZpZWxkcyxcclxuXHRcdFx0XHRcdFx0XHQuLi5tYXRjaE1pbkZpZWxkcyxcclxuXHRcdFx0XHRcdFx0XHQuLi5tYXRjaFN1bUZpZWxkcyxcclxuXHRcdFx0XHRcdFx0XHQuLi5tYXRjaEF2Z0ZpZWxkcyxcclxuXHRcdFx0XHRcdFx0XSxcclxuXHRcdFx0XHRcdFx0Z3JhbmRUb3RhbDogMCxcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0bGV0IGZpZWxkTmFtZSA9IChcclxuXHRcdFx0XHRcdFx0Zm9ybXVsYVN0ci5zcGxpdChcIkZpcnN0KFwiKVsxXSB8fFxyXG5cdFx0XHRcdFx0XHRmb3JtdWxhU3RyLnNwbGl0KFwiTGFzdChcIilbMV1cclxuXHRcdFx0XHRcdCkuc3BsaXQoXCIpXCIpWzBdO1xyXG5cdFx0XHRcdFx0YXJncy5jYWxjdWxhdGVkRmllbGQuZm9ybXVsYSA9XHJcblx0XHRcdFx0XHRcdFwiJ1xcXCJcIiArIFwiU3VtKFwiICsgZmllbGROYW1lICsgJylcIj0nICsgZm9ybXVsYVN0ciArIFwiJ1wiO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Ly8gQ2FsY3VsYXRlZCBmaWVsZOS6i+S7tu+8muWujOaIkFxyXG5cdHB1YmxpYyBhY3Rpb25Db21wbGV0ZShhcmdzKSB7XHJcblx0XHRpZiAoXHJcblx0XHRcdGFyZ3MuYWN0aW9uTmFtZSA9PT0gXCJGaWVsZCBhZ2dyZWdhdGVkXCIgfHxcclxuXHRcdFx0YXJncy5hY3Rpb25OYW1lID09PSBcIkZpZWxkIGxpc3QgY2xvc2VkXCJcclxuXHRcdCkge1xyXG5cdFx0XHR0aGlzLmRhdGFTb3VyY2VTZXR0aW5ncy52YWx1ZXMgPSBbXHJcblx0XHRcdFx0Li4uYXJncy5kYXRhU291cmNlU2V0dGluZ3MudmFsdWVzLFxyXG5cdFx0XHRdO1xyXG5cdFx0XHR0aGlzLnNldFZhbHVlSXRlbURhdGEoKTtcclxuXHRcdH1cclxuXHRcdGlmIChhcmdzLmFjdGlvbk5hbWUgPT0gXCJGaWVsZCByZW1vdmVkXCIpIHtcclxuXHRcdFx0aWYgKFxyXG5cdFx0XHRcdGFyZ3MuZmllbGRJbmZvICYmXHJcblx0XHRcdFx0YXJncy5maWVsZEluZm8uZmllbGRJdGVtICYmXHJcblx0XHRcdFx0YXJncy5maWVsZEluZm8uZmllbGRJdGVtLnR5cGUgPT0gXCJDYWxjdWxhdGVkRmllbGRcIlxyXG5cdFx0XHQpIHtcclxuXHRcdFx0XHRsZXQgZmllbGQgPSBhcmdzLmZpZWxkSW5mby5maWVsZE5hbWU7XHJcblx0XHRcdFx0Ly8gUmVtb3ZlIHRoZSBkZWxldGVkIGNhbGN1bGF0ZWQgZmllbGQgZnJvbSBhbiBzdG9yZWQgYXJyYXkuXHJcblx0XHRcdFx0dGhpcy5jdXN0b21DYWxjdWxhdGVkRmllbGRzID1cclxuXHRcdFx0XHRcdHRoaXMuY3VzdG9tQ2FsY3VsYXRlZEZpZWxkcy5maWx0ZXIoZnVuY3Rpb24gKG9iaikge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gb2JqLm5hbWUgIT09IGZpZWxkO1xyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8vIENhbGN1bGF0ZWQgZmllbGTkuovku7bvvJrlvIDlp4tcclxuXHRwdWJsaWMgYWN0aW9uQmVnaW4oYXJncykge1xyXG5cdFx0aWYgKGFyZ3MuYWN0aW9uTmFtZSA9PT0gXCJFZGl0IGNhbGN1bGF0ZWQgZmllbGRcIikge1xyXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY3VzdG9tQ2FsY3VsYXRlZEZpZWxkcy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdHRoaXMuY3VzdG9tQ2FsY3VsYXRlZEZpZWxkc1tpXS5uYW1lICYmXHJcblx0XHRcdFx0XHR0aGlzLnBpdm90T2JqLmVuZ2luZU1vZHVsZS5maWVsZExpc3RbXHJcblx0XHRcdFx0XHRcdHRoaXMuY3VzdG9tQ2FsY3VsYXRlZEZpZWxkc1tpXS5uYW1lXHJcblx0XHRcdFx0XHRdXHJcblx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHR0aGlzLnBpdm90T2JqLmVuZ2luZU1vZHVsZS5maWVsZExpc3RbXHJcblx0XHRcdFx0XHRcdHRoaXMuY3VzdG9tQ2FsY3VsYXRlZEZpZWxkc1tpXS5uYW1lXHJcblx0XHRcdFx0XHRdLmZvcm11bGEgPSB0aGlzLmN1c3RvbUNhbGN1bGF0ZWRGaWVsZHNbaV0uZm9ybXVsYTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHByaXZhdGUgcmVzaXplU3RvcChhcmdzKSB7XHJcblx0XHRpZiAodGhpcy5jb25maWcuY29sdW1uc1dpZHRoKSB7XHJcblx0XHRcdGNvbnN0IGhlYWRlcl9maWVsZCA9IHRoaXMuY29uZmlnLmNvbHVtbnNXaWR0aC5maWx0ZXIoXHJcblx0XHRcdFx0KGVsKSA9PiBlbC5oZWFkZXJUZXh0ID09PSBhcmdzLmNvbHVtbi5oZWFkZXJUZXh0XHJcblx0XHRcdCk7XHJcblx0XHRcdGlmIChoZWFkZXJfZmllbGQubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdGhlYWRlcl9maWVsZFswXS53aWR0aCA9IHBhcnNlSW50KGFyZ3MuY29sdW1uLndpZHRoKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aGlzLmNvbmZpZy5jb2x1bW5zV2lkdGgucHVzaCh7XHJcblx0XHRcdFx0XHRoZWFkZXJUZXh0OiBhcmdzLmNvbHVtbi5oZWFkZXJUZXh0LFxyXG5cdFx0XHRcdFx0d2lkdGg6IHBhcnNlSW50KGFyZ3MuY29sdW1uLndpZHRoKSxcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5jb25maWcuY29sdW1uc1dpZHRoID0gW107XHJcblx0XHRcdHRoaXMuY29uZmlnLmNvbHVtbnNXaWR0aC5wdXNoKHtcclxuXHRcdFx0XHRoZWFkZXJUZXh0OiBhcmdzLmNvbHVtbi5oZWFkZXJUZXh0LFxyXG5cdFx0XHRcdHdpZHRoOiBwYXJzZUludChhcmdzLmNvbHVtbi53aWR0aCksXHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cdFx0Y29uc3QgcG9ydGxldCA9IHRoaXMucG9ydGxldDtcclxuXHRcdHBvcnRsZXQuY29uZmlnID0gSlNPTi5zdHJpbmdpZnkodGhpcy5jb25maWcpO1xyXG5cdFx0Y29uc3QgaW5kZXggPSB0aGlzLnBvcnRsZXRzLmZpbmRJbmRleCgoeCkgPT4geC5uZXdJZCA9PT0gcG9ydGxldC5uZXdJZCk7XHJcblx0XHRpZiAoaW5kZXggPiAtMSkgdGhpcy5wb3J0bGV0c1tpbmRleF0gPSBwb3J0bGV0O1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBzZXRDb2x1bW5zUmVuZGVyKGFyZ3MpIHtcclxuXHRcdGlmIChhcmdzLnN0YWNrZWRDb2x1bW5zKSB7XHJcblx0XHRcdGFyZ3Muc3RhY2tlZENvbHVtbnMuZm9yRWFjaCgoY29sKSA9PiB7XHJcblx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0Y29sLmZvcm1hdCAmJlxyXG5cdFx0XHRcdFx0KGNvbC5mb3JtYXQuaW5kZXhPZihcIk5cIikgIT09IC0xIHx8XHJcblx0XHRcdFx0XHRcdGNvbC5mb3JtYXQgPT09IFwicGVyY2VudFwiIHx8XHJcblx0XHRcdFx0XHRcdGNvbC5mb3JtYXQuaW5kZXhPZihcIlBcIikgIT09IC0xKVxyXG5cdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0Y29sLnRleHRBbGlnbiA9IFwiUmlnaHRcIjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGlzLmNvbmZpZy5jb2x1bW5zV2lkdGgpIHtcclxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCAoYXJncyBhcyBhbnkpLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRhcmdzLmNvbHVtbnNbaV0uaGVhZGVyVGV4dCA9PT0gXCJcIiB8fFxyXG5cdFx0XHRcdFx0IWFyZ3MuY29sdW1uc1tpXS5oZWFkZXJUZXh0XHJcblx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRjb25zdCBjb2x1bW5fcm93ID0gdGhpcy5jb25maWcuY29sdW1uc1dpZHRoLmZpbHRlcihcclxuXHRcdFx0XHRcdFx0KGVsKSA9PiBlbC5oZWFkZXJUZXh0ID09PSBhcmdzLmNvbHVtbnNbaV0uaGVhZGVyVGV4dFxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdGlmIChjb2x1bW5fcm93Lmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdFx0YXJncy5jb2x1bW5zW2ldLndpZHRoID0gY29sdW1uX3Jvd1swXS53aWR0aDtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0Y29uc3QgaGVhZGVyVGV4dCA9IGFyZ3MuY29sdW1uc1tpXS5oZWFkZXJUZXh0XHJcblx0XHRcdFx0XHRcdC5yZXBsYWNlKC9cXHMrL2csIFwiXCIpXHJcblx0XHRcdFx0XHRcdC5zcGxpdChcIi5cIik7XHJcblx0XHRcdFx0XHRpZiAoaGVhZGVyVGV4dCAmJiBoZWFkZXJUZXh0Lmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgY29sdW1uID0gdGhpcy5jb25maWcuY29sdW1uc1dpZHRoLmZpbHRlcihcclxuXHRcdFx0XHRcdFx0XHQoZWwpID0+XHJcblx0XHRcdFx0XHRcdFx0XHRlbC5oZWFkZXJUZXh0XHJcblx0XHRcdFx0XHRcdFx0XHRcdC5yZXBsYWNlKC9cXHMrL2csIFwiXCIpXHJcblx0XHRcdFx0XHRcdFx0XHRcdC50b0xvd2VyQ2FzZSgpID09PVxyXG5cdFx0XHRcdFx0XHRcdFx0aGVhZGVyVGV4dFtoZWFkZXJUZXh0Lmxlbmd0aCAtIDFdLnRvTG93ZXJDYXNlKClcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0aWYgKGNvbHVtbi5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0XHRcdFx0KGFyZ3MgYXMgYW55KS5jb2x1bW5zW2ldLndpZHRoID0gY29sdW1uWzBdLndpZHRoO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdC8vIGRhdGUgZm9ybWF0IGFib3V0IHF1YXJ0ZXJseVxyXG5cdFx0XHRcdGxldCBwaXZvdFZhbHVlczogYW55ID0gdGhpcy5waXZvdE9iai5waXZvdFZhbHVlcztcclxuXHRcdFx0XHRpZiAodGhpcy5mb3JtYXREYXRlcyAmJiB0aGlzLmZvcm1hdERhdGVzLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0bGV0IGRhdGVGaWVsZHMgPSB0aGlzLmZvcm1hdERhdGVzLm1hcCgoZWwpID0+IHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGVsLm5hbWU7XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdGZvciAobGV0IGsgPSAxOyBrIDwgcGl2b3RWYWx1ZXMubGVuZ3RoOyBrKyspIHtcclxuXHRcdFx0XHRcdFx0Zm9yIChcclxuXHRcdFx0XHRcdFx0XHRsZXQgaiA9IDA7XHJcblx0XHRcdFx0XHRcdFx0cGl2b3RWYWx1ZXNba10gIT0gbnVsbCAmJiBqIDwgcGl2b3RWYWx1ZXNba10ubGVuZ3RoO1xyXG5cdFx0XHRcdFx0XHRcdGorK1xyXG5cdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdFx0XHRwaXZvdFZhbHVlc1trXVtqXSAhPSBudWxsICYmXHJcblx0XHRcdFx0XHRcdFx0XHQoaiA9PSAwXHJcblx0XHRcdFx0XHRcdFx0XHRcdD8gZGF0ZUZpZWxkcy5pbmNsdWRlcyhcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHBpdm90VmFsdWVzW2tdW2pdLnZhbHVlU29ydC5heGlzXHJcblx0XHRcdFx0XHRcdFx0XHRcdCAgKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ6IGRhdGVGaWVsZHMuaW5jbHVkZXMoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwaXZvdFZhbHVlc1trXVtqXS5hY3R1YWxUZXh0XHJcblx0XHRcdFx0XHRcdFx0XHRcdCAgKSlcclxuXHRcdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdC8vQ3VzdG9taXplIHRoZSBSb3cgaGVhZGVycy9Db2x1bW4gaGVhZGVycyBiYXNlZCBvbiB5b3VyIG5lZWRzXHJcblx0XHRcdFx0XHRcdFx0XHRsZXQgaGVhZGVycztcclxuXHRcdFx0XHRcdFx0XHRcdGlmIChqID09PSAwKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGhlYWRlcnMgPSBwaXZvdFZhbHVlc1trXVtqXS5hY3R1YWxUZXh0O1xyXG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gaGVhZGVycyA9IHBpdm90VmFsdWVzW2tdW2pdLmZvcm1hdHRlZFRleHQ7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGhlYWRlcnMgPSBwaXZvdFZhbHVlc1trXVtqXS52YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdGlmIChoZWFkZXJzKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGxldCBkYXRlID0gbmV3IERhdGUoaGVhZGVycyk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgcXVhcnRlciA9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0TWF0aC5mbG9vcihkYXRlLmdldE1vbnRoKCkgLyAzKSArIDE7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgZm9ybWF0O1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5mb3JtYXREYXRlcy5tYXAoKGVsKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGogPT0gMCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlbC5uYW1lID09XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHBpdm90VmFsdWVzW2tdW2pdLnZhbHVlU29ydC5heGlzXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZvcm1hdCA9IGVsLmZvcm1hdDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlbC5uYW1lID09XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHBpdm90VmFsdWVzW2tdW2pdLmFjdHVhbFRleHRcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdClcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9ybWF0ID0gZWwuZm9ybWF0O1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHBpdm90VmFsdWVzW2tdW2pdLmZvcm1hdHRlZFRleHQgPVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuZ2V0UXVhcnRlclZhbHVlKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9ybWF0LFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGF0ZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHF1YXJ0ZXJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHQvLyBpZih0aGlzLnBpdm90T2JqKSB0aGlzLnBpdm90T2JqLnJlZnJlc2hEYXRhKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgb25Mb2FkKCk6IHZvaWQge1xyXG5cdFx0Ly8gU01QMi0xNTY1MSDlvIDlkK/omZrmi5/mu5rliqjlubZzb3J05YiX5ZCO77yM5p2l5Zue5rua5Yqo5Lya5a+86Ie05pWw5o2u56m655m9XHJcblx0XHQvLyDlrpjmlrnpk77mjqUgaHR0cHM6Ly9lajIuc3luY2Z1c2lvbi5jb20vYW5ndWxhci9kb2N1bWVudGF0aW9uL3Bpdm90dmlldy92aXJ0dWFsLXNjcm9sbGluZyN2aXJ0dWFsLXNjcm9sbGluZy1mb3Itc3RhdGljLWZpZWxkLWxpc3RcclxuXHRcdC8vIERlbW/pk77mjqUgaHR0cHM6Ly9zdGFja2JsaXR6LmNvbS9lZGl0L2dpdGh1Yi03Z2drMnUtNHJremIzP2ZpbGU9c3JjJTJGYXBwLmNvbXBvbmVudC50c1xyXG5cdFx0KHRoaXMuZmllbGRsaXN0T2JqIGFzIFBpdm90RmllbGRMaXN0Q29tcG9uZW50KS5waXZvdEdyaWRNb2R1bGUgPSB0aGlzXHJcblx0XHRcdC5waXZvdE9iaiBhcyBQaXZvdFZpZXdDb21wb25lbnQ7XHJcblx0fVxyXG5cclxuXHRvbmRhdGFCb3VuZCgpe1xyXG5cdFx0aWYgKEJyb3dzZXIuaXNEZXZpY2UpIHtcclxuICAgICAgICAgICAgdGhpcy5waXZvdE9iai5lbGVtZW50LnN0eWxlLndpZHRoID0gJzEwMCUnO1xyXG4gICAgICAgICAgICB0aGlzLnBpdm90T2JqLmFsbG93Q2FsY3VsYXRlZEZpZWxkID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5waXZvdE9iai5zaG93RmllbGRMaXN0ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGVuZ2luZVBvcHVsYXRlZChhcmdzKSB7XHJcblx0XHRsZXQgY2xvbmVkVmFsdWVzOiBJUGl2b3RWYWx1ZXM7XHJcblx0XHRsZXQgY3VycmVudFBpdm90VmFsdWVzOiBhbnkgPSB0aGlzLmdldENsb25lZFBpdm90VmFsdWVzKFxyXG5cdFx0XHR0aGlzLnBpdm90T2JqLmVuZ2luZU1vZHVsZS5waXZvdFZhbHVlc1xyXG5cdFx0KTtcclxuXHRcdGxldCBwYWdlU2V0dGluZ3M6IElQYWdlU2V0dGluZ3MgPVxyXG5cdFx0XHR0aGlzLnBpdm90T2JqLmVuZ2luZU1vZHVsZS5wYWdlU2V0dGluZ3M7XHJcblxyXG5cdFx0aWYgKHRoaXMucGl2b3RPYmouZW5naW5lTW9kdWxlLmdlbmVyYXRlR3JpZERhdGEpIHtcclxuXHRcdFx0Ly8g5rKh5rOV5aSN546wIGh0dHBzOi8vcmFpc2VscC5hdGxhc3NpYW4ubmV0L2Jyb3dzZS9TTVAyLTE3MjQg5aSE55CG55qE6L+Z5Liq6Zeu6aKY5oOF5Ya1LCDnm7TmjqXms6jph4rmjolcclxuXHRcdFx0Ly8g5LiL6Z2i6L+Z5q615Luj56CB5Lya5b2x5ZONIGh0dHBzOi8vcmFpc2VscC5hdGxhc3NpYW4ubmV0L2Jyb3dzZS9TTVAyLTEyMTM5XHJcblx0XHRcdC8vIHRoaXMucGl2b3RPYmouZW5naW5lTW9kdWxlLmdlbmVyYXRlR3JpZERhdGEoXHJcblx0XHRcdC8vIFx0dGhpcy5waXZvdE9iai5kYXRhU291cmNlU2V0dGluZ3MsXHJcblx0XHRcdC8vIFx0dHJ1ZVxyXG5cdFx0XHQvLyApO1xyXG5cdFx0XHRjbG9uZWRWYWx1ZXMgPSB0aGlzLmdldENsb25lZFBpdm90VmFsdWVzKFxyXG5cdFx0XHRcdHRoaXMucGl2b3RPYmouZW5naW5lTW9kdWxlLnBpdm90VmFsdWVzXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0XHR0aGlzLnBpdm90T2JqLmVuZ2luZU1vZHVsZS5waXZvdFZhbHVlcyA9IGN1cnJlbnRQaXZvdFZhbHVlcztcclxuXHJcblx0XHRcdHRoaXMucGl2b3RPYmouZW5naW5lTW9kdWxlLnBhZ2VTZXR0aW5ncyA9IHBhZ2VTZXR0aW5ncztcclxuXHJcblx0XHRcdC8vIEhlcmUgXCJjbG9uZWRWYWx1ZXNcIiBjb250YWlucyB0aGUgd2hvbGUgcGl2b3QgdmFsdWVzLlxyXG5cdFx0XHR0aGlzLmFsbERhdGFWYWx1ZSA9IGNsb25lZFZhbHVlcztcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHByaXZhdGUgZ2V0Q2xvbmVkUGl2b3RWYWx1ZXMocGl2b3RWYWx1ZXM6IElQaXZvdFZhbHVlcyk6IElQaXZvdFZhbHVlcyB7XHJcblx0XHRsZXQgY2xvbmVkU2V0czogSVBpdm90VmFsdWVzID0gW107XHJcblx0XHRpZiAocGl2b3RWYWx1ZXMgJiYgcGl2b3RWYWx1ZXMubGVuZ3RoKSB7XHJcblx0XHRcdGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBwaXZvdFZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdGlmIChwaXZvdFZhbHVlc1tpXSkge1xyXG5cdFx0XHRcdFx0Y2xvbmVkU2V0c1tpXSA9IFtdO1xyXG5cdFx0XHRcdFx0Zm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IHBpdm90VmFsdWVzW2ldLmxlbmd0aDsgaisrKSB7XHJcblx0XHRcdFx0XHRcdGlmIChwaXZvdFZhbHVlc1tpXVtqXSkge1xyXG5cdFx0XHRcdFx0XHRcdC8qIGVzbGludC1kaXNhYmxlICovXHJcblx0XHRcdFx0XHRcdFx0Y2xvbmVkU2V0c1tpXVtqXSA9IHRoaXMuZ2V0Q2xvbmVkUGl2b3RWYWx1ZU9iaihcclxuXHRcdFx0XHRcdFx0XHRcdHBpdm90VmFsdWVzW2ldW2pdIGFzIHsgW2tleTogc3RyaW5nXTogT2JqZWN0IH1cclxuXHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdC8qIGVzbGludC1lbmFibGUgKi9cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIGNsb25lZFNldHM7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGdldENsb25lZFBpdm90VmFsdWVPYmooZGF0YTogeyBba2V5OiBzdHJpbmddOiBPYmplY3QgfSk6IHtcclxuXHRcdFtrZXk6IHN0cmluZ106IE9iamVjdDtcclxuXHR9IHtcclxuXHRcdGxldCBrZXlQb3M6IG51bWJlciA9IDA7XHJcblx0XHRsZXQgZnJhbWVkU2V0OiBhbnkgPSB7fTtcclxuXHRcdGlmICghKGRhdGEgPT09IG51bGwgfHwgZGF0YSA9PT0gdW5kZWZpbmVkKSkge1xyXG5cdFx0XHRsZXQgZmllbGRzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKGRhdGEpO1xyXG5cdFx0XHR3aGlsZSAoa2V5UG9zIDwgZmllbGRzLmxlbmd0aCkge1xyXG5cdFx0XHRcdGZyYW1lZFNldFtmaWVsZHNba2V5UG9zXV0gPSBkYXRhW2ZpZWxkc1trZXlQb3NdXTtcclxuXHRcdFx0XHRrZXlQb3MrKztcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0ZnJhbWVkU2V0ID0gZGF0YTtcclxuXHRcdH1cclxuXHRcdHJldHVybiBmcmFtZWRTZXQ7XHJcblx0fVxyXG5cclxuXHQvLyNyZWdpb24gRmlsdGVyaW5nIHRoZSBUcmVlTm9kZXNcclxuXHRwcml2YXRlIHNlYXJjaE5vZGVzKGFyZ3MpIHtcclxuXHRcdGxldCBfdGV4dCA9IGFyZ3MubWFza2VkVmFsdWU7XHJcblx0XHRsZXQgcHJlZGljYXRzID0gW10sXHJcblx0XHRcdF9hcnJheSA9IFtdLFxyXG5cdFx0XHRfZmlsdGVyID0gW107XHJcblx0XHRpZiAoX3RleHQgPT0gXCJcIikge1xyXG5cdFx0XHR0aGlzLmNoYW5nZURhdGFTb3VyY2UoXHJcblx0XHRcdFx0KCh0aGlzIGFzIGFueSkuZmllbGRsaXN0T2JqLnRyZWVWaWV3TW9kdWxlIGFzIGFueSkuZ2V0VHJlZURhdGEoKVxyXG5cdFx0XHQpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0bGV0IHByZWRpY2F0ZSA9IG5ldyBQcmVkaWNhdGUoXCJjYXB0aW9uXCIsIFwiY29udGFpbnNcIiwgX3RleHQsIHRydWUpO1xyXG5cdFx0XHRsZXQgZmlsdGVyZWRMaXN0ID0gbmV3IERhdGFNYW5hZ2VyKFxyXG5cdFx0XHRcdCgodGhpcyBhcyBhbnkpLmZpZWxkbGlzdE9iai50cmVlVmlld01vZHVsZSBhcyBhbnkpLmdldFRyZWVEYXRhKClcclxuXHRcdFx0KS5leGVjdXRlTG9jYWwobmV3IFF1ZXJ5KCkud2hlcmUocHJlZGljYXRlKSk7XHJcblx0XHRcdGZvciAobGV0IGogPSAwOyBqIDwgZmlsdGVyZWRMaXN0Lmxlbmd0aDsgaisrKSB7XHJcblx0XHRcdFx0X2ZpbHRlci5wdXNoKGZpbHRlcmVkTGlzdFtqXVtcImlkXCJdKTtcclxuXHRcdFx0XHRsZXQgZmlsdGVycyA9IHRoaXMuZ2V0RmlsdGVySXRlbXMoXHJcblx0XHRcdFx0XHRmaWx0ZXJlZExpc3Rbal0sXHJcblx0XHRcdFx0XHQoXHJcblx0XHRcdFx0XHRcdCh0aGlzIGFzIGFueSkuZmllbGRsaXN0T2JqLnRyZWVWaWV3TW9kdWxlIGFzIGFueVxyXG5cdFx0XHRcdFx0KS5nZXRUcmVlRGF0YSgpXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGZpbHRlcnMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0X2FycmF5LmluZGV4T2YoZmlsdGVyc1tpXSkgPT0gLTEgJiZcclxuXHRcdFx0XHRcdFx0ZmlsdGVyc1tpXSAhPSBudWxsXHJcblx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0X2FycmF5LnB1c2goZmlsdGVyc1tpXSk7XHJcblx0XHRcdFx0XHRcdHByZWRpY2F0cy5wdXNoKFxyXG5cdFx0XHRcdFx0XHRcdG5ldyBQcmVkaWNhdGUoXCJpZFwiLCBcImVxdWFsXCIsIGZpbHRlcnNbaV0sIGZhbHNlKVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAocHJlZGljYXRzLmxlbmd0aCA9PSAwKSB7XHJcblx0XHRcdFx0dGhpcy5jaGFuZ2VEYXRhU291cmNlKFtdKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRsZXQgcXVlcnkgPSBuZXcgUXVlcnkoKS53aGVyZShQcmVkaWNhdGUub3IocHJlZGljYXRzKSk7XHJcblx0XHRcdFx0bGV0IG5ld0xpc3QgPSBuZXcgRGF0YU1hbmFnZXIoXHJcblx0XHRcdFx0XHQoXHJcblx0XHRcdFx0XHRcdCh0aGlzIGFzIGFueSkuZmllbGRsaXN0T2JqLnRyZWVWaWV3TW9kdWxlIGFzIGFueVxyXG5cdFx0XHRcdFx0KS5nZXRUcmVlRGF0YSgpXHJcblx0XHRcdFx0KS5leGVjdXRlTG9jYWwocXVlcnkpO1xyXG5cdFx0XHRcdHRoaXMuY2hhbmdlRGF0YVNvdXJjZShuZXdMaXN0KTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Ly9GaW5kIHRoZSBQYXJlbnQgTm9kZXMgZm9yIGNvcnJlc3BvbmRpbmcgY2hpbGRzXHJcblx0cHVibGljIGdldEZpbHRlckl0ZW1zKGZMaXN0LCBsaXN0KSB7XHJcblx0XHRsZXQgbm9kZXMgPSBbXTtcclxuXHRcdG5vZGVzLnB1c2goZkxpc3RbXCJpZFwiXSk7XHJcblx0XHRsZXQgcXVlcnkyID0gbmV3IFF1ZXJ5KCkud2hlcmUoXCJpZFwiLCBcImVxdWFsXCIsIGZMaXN0W1wicGlkXCJdLCBmYWxzZSk7XHJcblx0XHRsZXQgZkxpc3QxID0gbmV3IERhdGFNYW5hZ2VyKGxpc3QpLmV4ZWN1dGVMb2NhbChxdWVyeTIpO1xyXG5cdFx0aWYgKGZMaXN0MS5sZW5ndGggIT0gMCkge1xyXG5cdFx0XHRsZXQgcE5vZGUgPSB0aGlzLmdldEZpbHRlckl0ZW1zKGZMaXN0MVswXSwgbGlzdCk7XHJcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcE5vZGUubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRpZiAobm9kZXMuaW5kZXhPZihwTm9kZVtpXSkgPT0gLTEgJiYgcE5vZGVbaV0gIT0gbnVsbClcclxuXHRcdFx0XHRcdG5vZGVzLnB1c2gocE5vZGVbaV0pO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBub2RlcztcclxuXHRcdH1cclxuXHRcdHJldHVybiBub2RlcztcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBjcmVhdGVkKGFyZ3M6IGFueSkge1xyXG5cdFx0aWYgKHRoaXMuZmllbGRsaXN0T2JqICYmICF0aGlzLmZpZWxkbGlzdE9iai5lbmdpbmVNb2R1bGUuZmllbGRzKSB7XHJcblx0XHRcdHRoaXMuZmllbGRsaXN0T2JqLmVuZ2luZU1vZHVsZS5maWVsZHMgPSBbXTtcclxuXHRcdH1cclxuXHRcdGxldCBzZWFyY2ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XHJcblx0XHRzZWFyY2guaWQgPSBcInBpdm90U2VhcmNoQm94XCIgKyB0aGlzLmZpZWxkbGlzdE9iai5lbGVtZW50LmlkO1xyXG5cdFx0bGV0IGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcclxuXHRcdFx0XCIjXCIgKyB0aGlzLmZpZWxkbGlzdE9iai5lbGVtZW50LmlkICsgXCJfQ29udGFpbmVyIC5lLWZpZWxkLXRhYmxlXCJcclxuXHRcdCk7XHJcblx0XHRpZiAoZWwpIGVsLnByZXBlbmQoc2VhcmNoKTtcclxuXHRcdHRoaXMucGl2b3RTZWFyY2hCb3ggPSBuZXcgTWFza2VkVGV4dEJveCh7XHJcblx0XHRcdHBsYWNlaG9sZGVyOiB0aGlzLnRyYW5zbGF0aW9uLlNFQVJDSCB8fCBcIi5TRUFSQ0hcIixcclxuXHRcdFx0Y3NzQ2xhc3M6IFwicGl2b3Qtc2VhcmNoXCIsXHJcblx0XHRcdGNoYW5nZTogdGhpcy5zZWFyY2hOb2Rlcy5iaW5kKHRoaXMpLFxyXG5cdFx0fSk7XHJcblx0XHR0aGlzLnBpdm90U2VhcmNoQm94LmFwcGVuZFRvKFxyXG5cdFx0XHRcIiNwaXZvdFNlYXJjaEJveFwiICsgdGhpcy5maWVsZGxpc3RPYmouZWxlbWVudC5pZFxyXG5cdFx0KTtcclxuXHJcblx0XHQvLyBORVcgRGFzaGJvYXJkIOeCueWHu1wiYXBwbHlcIuaXtu+8jOivt+axguaWsOaVsOaNrlxyXG5cdFx0bGV0IGFwcGx5QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXHJcblx0XHRcdHRoaXMuZmllbGRsaXN0T2JqLmVsZW1lbnQuaWQgKyBcIl9EZWZlclVwZGF0ZUJ1dHRvbjFcIlxyXG5cdFx0KTtcclxuXHJcblx0XHRhcHBseUJ0biAmJlxyXG5cdFx0XHRhcHBseUJ0bi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG5cdFx0XHRcdHRoaXMucGFnZUxvYWRpbmcgPSB0cnVlO1xyXG5cdFx0XHRcdHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UuZ2V0RGF0YUJ5UG9ydGxldHNOZXcoXHJcblx0XHRcdFx0XHRbdGhpcy5wb3J0bGV0XSxcclxuXHRcdFx0XHRcdCgpID0+IHtcclxuXHRcdFx0XHRcdFx0dGhpcy5wYWdlTG9hZGluZyA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0XHR0aGlzLlBpdm90X0RhdGEgPVxyXG5cdFx0XHRcdFx0XHRcdHRoaXMuZGFzaGJvYXJkUG9ybGV0c1NlcnZpY2UuZ2V0UmVzdWx0QnlEYXRhVGFibGUoXHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLnBvcnRsZXQsXHJcblx0XHRcdFx0XHRcdFx0XHRmYWxzZSxcclxuXHRcdFx0XHRcdFx0XHRcdGZhbHNlLFxyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5kYXNoYm9hcmQuaWRcclxuXHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHR0aGlzLnBpdm90T2JqLmRhdGFTb3VyY2VTZXR0aW5ncy5kYXRhU291cmNlID1cclxuXHRcdFx0XHRcdFx0XHR0aGlzLlBpdm90X0RhdGE7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAodGhpcy5QaXZvdF9EYXRhKSB7XHJcblx0XHRcdFx0XHRcdFx0bGV0IGdyb3VwcyA9IHRoaXMuY29uZmlnLnhheGlzLmdyb3VwcztcclxuXHRcdFx0XHRcdFx0XHRsZXQgcm93cyA9IFtdO1xyXG5cdFx0XHRcdFx0XHRcdGlmIChncm91cHMpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGZvciAobGV0IGdpdGVtIG9mIGdyb3Vwcykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBmaWVsZCA9IHRoaXMuY29uZmlnRmllbGRzLmZpbHRlcihcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQoZWwpID0+IGVsLmNvbE5hbWUgPT09IGdpdGVtLm5hbWVcclxuXHRcdFx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGZpZWxkLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRnaXRlbS5zaG93U3ViVG90YWxzID1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZpZWxkWzBdLnNob3dTdWJUb3RhbHM7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Z2l0ZW0uY2FwdGlvbiA9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmaWVsZFswXS5sYW5nVmFsdWUgfHxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMudHJhbnNsYXRpb25bXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZpZWxkWzBdLmxhbmdDb2RlXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRdIHx8XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmaWVsZFswXS5sYW5nQ29kZSB8fFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Z2l0ZW0uY2FwdGlvbjtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRyb3dzLnB1c2goZ2l0ZW0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR0aGlzLlBpdm90X0RhdGEubWFwKChkYXRhKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHRyb3dzLmZvckVhY2goKHJvdykgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoZGF0YVtyb3cubmFtZV0gPT09IFwiXCIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRhW3Jvdy5uYW1lXSA9IFwibnVsbFwiO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRpZiAodGhpcy5waXZvdE9iaikgdGhpcy5waXZvdE9iai5yZWZyZXNoRGF0YSgpO1xyXG5cdFx0XHRcdFx0XHR0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTtcclxuXHRcdFx0XHRcdFx0dGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdG51bGwsXHJcblx0XHRcdFx0XHRmYWxzZSxcclxuXHRcdFx0XHRcdHRoaXMuZGFzaGJvYXJkLFxyXG5cdFx0XHRcdFx0ZmFsc2VcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHR9KTtcclxuXHRcdFx0XHJcblx0XHQvLyDngrnlh7tcImNhbmNlbFwi5pe277yM5oGi5aSN5Y6f5aeL5pWw5o2uXHJcblx0XHRsZXQgY2FuY2VsQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXHJcblx0XHRcdHRoaXMuZmllbGRsaXN0T2JqLmVsZW1lbnQuaWQgKyBcIl9EZWZlclVwZGF0ZUJ1dHRvbjJcIlxyXG5cdFx0KTtcclxuXHJcblx0XHRjYW5jZWxCdG4gJiZcclxuXHRcdFx0Y2FuY2VsQnRuLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5waXZvdE9iai5kYXRhU291cmNlU2V0dGluZ3MuZGF0YVNvdXJjZSA9XHJcblx0XHRcdFx0XHRbLi4udGhpcy5QaXZvdF9EYXRhXTtcclxuXHRcdFx0XHRpZiAodGhpcy5waXZvdE9iaikgdGhpcy5waXZvdE9iai5yZWZyZXNoRGF0YSgpO1xyXG5cdFx0XHRcdHRoaXMucmVmLm1hcmtGb3JDaGVjaygpO1xyXG5cdFx0XHRcdHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcclxuXHRcdFx0fSk7XHRcdFxyXG5cdH1cclxuXHJcblx0cHVibGljIGZpZWxkTGlzdFJlZnJlc2hlZChhcmdzKSB7XHJcblx0XHRpZiAodGhpcy5waXZvdFNlYXJjaEJveCkge1xyXG5cdFx0XHR0aGlzLnBpdm90U2VhcmNoQm94LnZhbHVlID0gXCJcIjtcclxuXHRcdFx0dGhpcy5jaGFuZ2VEYXRhU291cmNlKFxyXG5cdFx0XHRcdCh0aGlzLmZpZWxkbGlzdE9iai50cmVlVmlld01vZHVsZSBhcyBhbnkpLmdldFRyZWVEYXRhKClcclxuXHRcdFx0KTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHByaXZhdGUgY2hhbmdlRGF0YVNvdXJjZShkYXRhKSB7XHJcblx0XHRsZXQgZmllbGRUYWJsZSA9ICh0aGlzIGFzIGFueSkuZmllbGRsaXN0T2JqLnRyZWVWaWV3TW9kdWxlLmZpZWxkVGFibGU7XHJcblx0XHRpZiAoZmllbGRUYWJsZSkge1xyXG5cdFx0XHRmaWVsZFRhYmxlLmZpZWxkcyA9IHtcclxuXHRcdFx0XHRkYXRhU291cmNlOiBkYXRhLFxyXG5cdFx0XHRcdGlkOiBcImlkXCIsXHJcblx0XHRcdFx0dGV4dDogXCJjYXB0aW9uXCIsXHJcblx0XHRcdFx0aXNDaGVja2VkOiBcImlzU2VsZWN0ZWRcIixcclxuXHRcdFx0XHRwYXJlbnRJRDogXCJwaWRcIixcclxuXHRcdFx0XHRpY29uQ3NzOiBcInNwcml0ZUNzc0NsYXNzXCIsXHJcblx0XHRcdH07XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvL1NNUDItMjk1NyBmaXggdGhlIGRhdGUgaXNzdWUgb24gdGhlIHJhdyBkYXRhXHJcblx0cHVibGljIGRyaWxsVGhyb3VnaChhcmdzOiBEcmlsbFRocm91Z2hFdmVudEFyZ3MpIHtcclxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYXJncy5ncmlkQ29sdW1ucy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRjb25zdCBkYXRhID0gdGhpcy5jb25maWdGaWVsZHMuZmlsdGVyKFxyXG5cdFx0XHRcdChlbCkgPT4gZWwuY29sTmFtZSA9PT0gYXJncy5ncmlkQ29sdW1uc1tpXS5maWVsZFxyXG5cdFx0XHQpO1xyXG5cdFx0XHRpZiAoZGF0YSAmJiBkYXRhLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRkYXRhWzBdLmRhdGFUeXBlID09PSBcImRhdGVcIiB8fFxyXG5cdFx0XHRcdFx0ZGF0YVswXS5kYXRhVHlwZSA9PT0gXCJkYXRldGltZVwiXHJcblx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRhcmdzLmdyaWRDb2x1bW5zW2ldLnR5cGUgPSBcImRhdGVcIjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblx0Ly8jZW5kcmVnaW9uXHJcblxyXG5cdHByaXZhdGUgc2V0Rm9udFNldHRpbmdDb25kaXRpb25hbChvYmosIGRhdGEsIGNvZGUpIHtcclxuXHRcdGlmIChjb2RlID09PSAtMSkge1xyXG5cdFx0XHRvYmouc3R5bGUuY29sb3IgPSBkYXRhLm5lZ2FGb250Q29sb3I7XHJcblx0XHRcdG9iai5zdHlsZS5mb250RmFtaWx5ID0gZGF0YS5uZWdhRm9udEZhbWlseVZhbHVlO1xyXG5cdFx0XHRvYmouc3R5bGUuZm9udFNpemUgPSBkYXRhLm5lZ2FGb250U2l6ZVZhbHVlO1xyXG5cdFx0XHRvYmouc3R5bGUuYmFja2dyb3VuZENvbG9yID0gZGF0YS5uZWdhQmFja2dyb3VuZENvbG9yO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0b2JqLnN0eWxlLmNvbG9yID0gZGF0YS5mb250Q29sb3I7XHJcblx0XHRcdG9iai5zdHlsZS5mb250RmFtaWx5ID0gZGF0YS5mb250RmFtaWx5VmFsdWU7XHJcblx0XHRcdG9iai5zdHlsZS5mb250U2l6ZSA9IGRhdGEuZm9udFNpemVWYWx1ZTtcclxuXHRcdFx0b2JqLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGRhdGEuYmFja2dyb3VuZENvbG9yO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBzZXRDb21wYXJlQ29uZGl0aW9uYWwoXHJcblx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmosXHJcblx0XHRjb25kaXRpb25hbEZvcm1hdE9iaixcclxuXHRcdGRhdGFcclxuXHQpIHtcclxuXHRcdGlmIChNYXRoLnNpZ24oZGF0YS5jb21wYXJlVmFsdWUxKSA9PSAwKSB7XHJcblx0XHRcdHN3aXRjaCAoZGF0YS5jb21wYXJlU2VsZWN0KSB7XHJcblx0XHRcdFx0Y2FzZSBcIkxlc3NUaGFuXCI6IC8vIOWwj+S6jlxyXG5cdFx0XHRcdGNhc2UgXCJMZXNzVGhhbk9yRXF1YWxUb1wiOiAvLyDlsI/kuo7nrYnkuo5cclxuXHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTEgPSAwO1xyXG5cdFx0XHRcdFx0bmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqLmNvbmRpdGlvbnMgPSBcIkxlc3NUaGFuXCI7XHJcblx0XHRcdFx0XHR0aGlzLnNldEZvbnRTZXR0aW5nQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iaixcclxuXHRcdFx0XHRcdFx0ZGF0YSxcclxuXHRcdFx0XHRcdFx0LTFcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRjYXNlIFwiR3JlYXRlclRoYW5cIjogLy8g5aSn5LqOXHJcblx0XHRcdFx0Y2FzZSBcIkdyZWF0ZXJUaGFuT3JFcXVhbFRvXCI6IC8vIOWkp+S6juetieS6jlxyXG5cdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUxID0gMDtcclxuXHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLmNvbmRpdGlvbnMgPSBcIkdyZWF0ZXJUaGFuXCI7XHJcblx0XHRcdFx0XHR0aGlzLnNldEZvbnRTZXR0aW5nQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLFxyXG5cdFx0XHRcdFx0XHRkYXRhLFxyXG5cdFx0XHRcdFx0XHQxXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0Y2FzZSBcIk5vdEVxdWFsc1wiOiAvLyDkuI3nrYnkuo5cclxuXHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTEgPSAwO1xyXG5cdFx0XHRcdFx0bmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqLmNvbmRpdGlvbnMgPSBcIkxlc3NUaGFuXCI7XHJcblx0XHRcdFx0XHR0aGlzLnNldEZvbnRTZXR0aW5nQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iaixcclxuXHRcdFx0XHRcdFx0ZGF0YSxcclxuXHRcdFx0XHRcdFx0LTFcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTEgPSAwO1xyXG5cdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmouY29uZGl0aW9ucyA9IFwiR3JlYXRlclRoYW5cIjtcclxuXHRcdFx0XHRcdHRoaXMuc2V0Rm9udFNldHRpbmdDb25kaXRpb25hbChcclxuXHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmosXHJcblx0XHRcdFx0XHRcdGRhdGEsXHJcblx0XHRcdFx0XHRcdDFcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRjYXNlIFwiQmV0d2VlblwiOiAvLyB2YWx1ZTE8PSB2YWwgPD12YWx1ZTJcclxuXHRcdFx0XHRcdGlmIChNYXRoLnNpZ24oZGF0YS5jb21wYXJlVmFsdWUyKSA9PT0gMSkge1xyXG5cdFx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTEgPSAwO1xyXG5cdFx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTIgPSBOdW1iZXIoXHJcblx0XHRcdFx0XHRcdFx0ZGF0YS5jb21wYXJlVmFsdWUyXHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLmNvbmRpdGlvbnMgPSBcIkJldHdlZW5cIjtcclxuXHRcdFx0XHRcdFx0dGhpcy5zZXRGb250U2V0dGluZ0NvbmRpdGlvbmFsKFxyXG5cdFx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLFxyXG5cdFx0XHRcdFx0XHRcdGRhdGEsXHJcblx0XHRcdFx0XHRcdFx0MVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0Y2FzZSBcIk5vdEJldHdlZW5cIjogLy8gdmFsID49IHZhbHVlMiwgdmFsIDw9IHZhbHVlMVxyXG5cdFx0XHRcdFx0aWYgKE1hdGguc2lnbihkYXRhLmNvbXBhcmVWYWx1ZTIpID09PSAxKSB7XHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLnZhbHVlMSA9IE51bWJlcihcclxuXHRcdFx0XHRcdFx0XHRkYXRhLmNvbXBhcmVWYWx1ZTJcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmouY29uZGl0aW9ucyA9IFwiR3JlYXRlclRoYW5cIjtcclxuXHRcdFx0XHRcdFx0dGhpcy5zZXRGb250U2V0dGluZ0NvbmRpdGlvbmFsKFxyXG5cdFx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLFxyXG5cdFx0XHRcdFx0XHRcdGRhdGEsXHJcblx0XHRcdFx0XHRcdFx0MVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUxID0gMDtcclxuXHRcdFx0XHRcdFx0bmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqLmNvbmRpdGlvbnMgPSBcIkxlc3NUaGFuXCI7XHJcblx0XHRcdFx0XHRcdHRoaXMuc2V0Rm9udFNldHRpbmdDb25kaXRpb25hbChcclxuXHRcdFx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmosXHJcblx0XHRcdFx0XHRcdFx0ZGF0YSxcclxuXHRcdFx0XHRcdFx0XHQtMVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2UgaWYgKE1hdGguc2lnbihkYXRhLmNvbXBhcmVWYWx1ZTEpID09PSAxKSB7XHJcblx0XHRcdHN3aXRjaCAoZGF0YS5jb21wYXJlU2VsZWN0KSB7XHJcblx0XHRcdFx0Y2FzZSBcIkxlc3NUaGFuXCI6IC8vIOWwj+S6jlxyXG5cdFx0XHRcdGNhc2UgXCJMZXNzVGhhbk9yRXF1YWxUb1wiOiAvLyDlsI/kuo7nrYnkuo5cclxuXHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLnZhbHVlMSA9IDA7XHJcblx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTIgPSBOdW1iZXIoZGF0YS5jb21wYXJlVmFsdWUxKTtcclxuXHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLmNvbmRpdGlvbnMgPSBcIkJldHdlZW5cIjtcclxuXHRcdFx0XHRcdHRoaXMuc2V0Rm9udFNldHRpbmdDb25kaXRpb25hbChcclxuXHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmosXHJcblx0XHRcdFx0XHRcdGRhdGEsXHJcblx0XHRcdFx0XHRcdDFcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUxID0gMDtcclxuXHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iai5jb25kaXRpb25zID0gXCJMZXNzVGhhblwiO1xyXG5cdFx0XHRcdFx0dGhpcy5zZXRGb250U2V0dGluZ0NvbmRpdGlvbmFsKFxyXG5cdFx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmosXHJcblx0XHRcdFx0XHRcdGRhdGEsXHJcblx0XHRcdFx0XHRcdC0xXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0Y2FzZSBcIkdyZWF0ZXJUaGFuXCI6IC8vIOWkp+S6jlxyXG5cdFx0XHRcdGNhc2UgXCJHcmVhdGVyVGhhbk9yRXF1YWxUb1wiOiAvLyDlpKfkuo7nrYnkuo5cclxuXHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLnZhbHVlMSA9IE51bWJlcihkYXRhLmNvbXBhcmVWYWx1ZTEpO1xyXG5cdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmouY29uZGl0aW9ucyA9IFwiR3JlYXRlclRoYW5cIjtcclxuXHRcdFx0XHRcdHRoaXMuc2V0Rm9udFNldHRpbmdDb25kaXRpb25hbChcclxuXHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmosXHJcblx0XHRcdFx0XHRcdGRhdGEsXHJcblx0XHRcdFx0XHRcdDFcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRjYXNlIFwiRXF1YWxzXCI6IC8vIOetieS6jlxyXG5cdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUxID0gTnVtYmVyKGRhdGEuY29tcGFyZVZhbHVlMSk7XHJcblx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iai5jb25kaXRpb25zID0gXCJFcXVhbHNcIjtcclxuXHRcdFx0XHRcdHRoaXMuc2V0Rm9udFNldHRpbmdDb25kaXRpb25hbChcclxuXHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmosXHJcblx0XHRcdFx0XHRcdGRhdGEsXHJcblx0XHRcdFx0XHRcdDFcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRjYXNlIFwiTm90RXF1YWxzXCI6IC8vIOS4jeetieS6jlxyXG5cdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUxID0gMDtcclxuXHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLnZhbHVlMiA9IE51bWJlcihkYXRhLmNvbXBhcmVWYWx1ZTEpO1xyXG5cdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmouY29uZGl0aW9ucyA9IFwiQmV0d2VlblwiO1xyXG5cdFx0XHRcdFx0Ly8gcHVzaOi/m+aVsOe7hFxyXG5cdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUxID0gTnVtYmVyKGRhdGEuY29tcGFyZVZhbHVlMSk7XHJcblx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iai5jb25kaXRpb25zID0gXCJHcmVhdGVyVGhhblwiO1xyXG5cdFx0XHRcdFx0Ly8gcHVzaOi/m+aVsOe7hFxyXG5cclxuXHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTEgPSAwO1xyXG5cdFx0XHRcdFx0bmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqLmNvbmRpdGlvbnMgPSBcIkxlc3NUaGFuT3JFcXVhbFRvXCI7XHJcblx0XHRcdFx0XHR0aGlzLnNldEZvbnRTZXR0aW5nQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iaixcclxuXHRcdFx0XHRcdFx0ZGF0YSxcclxuXHRcdFx0XHRcdFx0LTFcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHR0aGlzLnNldEZvbnRTZXR0aW5nQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLFxyXG5cdFx0XHRcdFx0XHRkYXRhLFxyXG5cdFx0XHRcdFx0XHQxXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0Y2FzZSBcIkJldHdlZW5cIjogLy8gdmFsdWUxPD0gdmFsIDw9dmFsdWUyXHJcblx0XHRcdFx0XHRpZiAoTWF0aC5zaWduKGRhdGEuY29tcGFyZVZhbHVlMikgPT09IDEpIHtcclxuXHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUxID0gTnVtYmVyKFxyXG5cdFx0XHRcdFx0XHRcdGRhdGEuY29tcGFyZVZhbHVlMVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTIgPSBOdW1iZXIoXHJcblx0XHRcdFx0XHRcdFx0ZGF0YS5jb21wYXJlVmFsdWUyXHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLmNvbmRpdGlvbnMgPSBcIkJldHdlZW5cIjtcclxuXHRcdFx0XHRcdFx0dGhpcy5zZXRGb250U2V0dGluZ0NvbmRpdGlvbmFsKFxyXG5cdFx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLFxyXG5cdFx0XHRcdFx0XHRcdGRhdGEsXHJcblx0XHRcdFx0XHRcdFx0MVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0Y2FzZSBcIk5vdEJldHdlZW5cIjogLy8gdmFsID49IHZhbHVlMiwgdmFsIDw9IHZhbHVlMVxyXG5cdFx0XHRcdFx0aWYgKE1hdGguc2lnbihkYXRhLmNvbXBhcmVWYWx1ZTIpID09PSAxKSB7XHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLnZhbHVlMSA9IDA7XHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLnZhbHVlMiA9IE51bWJlcihcclxuXHRcdFx0XHRcdFx0XHRkYXRhLmNvbXBhcmVWYWx1ZTFcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmouY29uZGl0aW9ucyA9IFwiQmV0d2VlblwiO1xyXG5cdFx0XHRcdFx0XHQvLyBwdXNo6L+b5pWw57uEXHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLnZhbHVlMSA9IE51bWJlcihcclxuXHRcdFx0XHRcdFx0XHRkYXRhLmNvbXBhcmVWYWx1ZTJcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmouY29uZGl0aW9ucyA9IFwiR3JlYXRlclRoYW5cIjtcclxuXHRcdFx0XHRcdFx0Ly8gcHVzaOi/m+aVsOe7hFxyXG5cdFx0XHRcdFx0XHR0aGlzLnNldEZvbnRTZXR0aW5nQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmosXHJcblx0XHRcdFx0XHRcdFx0ZGF0YSxcclxuXHRcdFx0XHRcdFx0XHQxXHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSBpZiAoTWF0aC5zaWduKGRhdGEuY29tcGFyZVZhbHVlMSkgPT09IC0xKSB7XHJcblx0XHRcdHN3aXRjaCAoZGF0YS5jb21wYXJlU2VsZWN0KSB7XHJcblx0XHRcdFx0Y2FzZSBcIkxlc3NUaGFuXCI6IC8vIOWwj+S6jlxyXG5cdFx0XHRcdGNhc2UgXCJMZXNzVGhhbk9yRXF1YWxUb1wiOiAvLyDlsI/kuo7nrYnkuo5cclxuXHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTEgPSBkYXRhLmNvbXBhcmVWYWx1ZTE7XHJcblx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmouY29uZGl0aW9ucyA9IGRhdGEuY29tcGFyZVNlbGVjdDtcclxuXHRcdFx0XHRcdHRoaXMuc2V0Rm9udFNldHRpbmdDb25kaXRpb25hbChcclxuXHRcdFx0XHRcdFx0bmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqLFxyXG5cdFx0XHRcdFx0XHRkYXRhLFxyXG5cdFx0XHRcdFx0XHQtMVxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdGNhc2UgXCJHcmVhdGVyVGhhblwiOiAvLyDlpKfkuo5cclxuXHRcdFx0XHRjYXNlIFwiR3JlYXRlclRoYW5PckVxdWFsVG9cIjogLy8g5aSn5LqO562J5LqOXHJcblx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTEgPSAwO1xyXG5cdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmouY29uZGl0aW9ucyA9IFwiR3JlYXRlclRoYW5PckVxdWFsVG9cIjtcclxuXHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTEgPSAwO1xyXG5cdFx0XHRcdFx0bmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqLnZhbHVlMiA9IGRhdGEuY29tcGFyZVZhbHVlMTtcclxuXHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iai5jb25kaXRpb25zID0gXCJCZXR3ZWVuXCI7XHJcblx0XHRcdFx0XHR0aGlzLnNldEZvbnRTZXR0aW5nQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLFxyXG5cdFx0XHRcdFx0XHRkYXRhLFxyXG5cdFx0XHRcdFx0XHQxXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0dGhpcy5zZXRGb250U2V0dGluZ0NvbmRpdGlvbmFsKFxyXG5cdFx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmosXHJcblx0XHRcdFx0XHRcdGRhdGEsXHJcblx0XHRcdFx0XHRcdC0xXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0Y2FzZSBcIkVxdWFsc1wiOiAvLyDnrYnkuo5cclxuXHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTEgPSBkYXRhLmNvbXBhcmVWYWx1ZTE7XHJcblx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmouY29uZGl0aW9ucyA9IFwiRXF1YWxzXCI7XHJcblx0XHRcdFx0XHR0aGlzLnNldEZvbnRTZXR0aW5nQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iaixcclxuXHRcdFx0XHRcdFx0ZGF0YSxcclxuXHRcdFx0XHRcdFx0LTFcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0Y2FzZSBcIk5vdEVxdWFsc1wiOiAvLyDkuI3nrYnkuo5cclxuXHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTEgPSBkYXRhLmNvbXBhcmVWYWx1ZTE7XHJcblx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmouY29uZGl0aW9ucyA9IFwiTm90RXF1YWxzXCI7XHJcblx0XHRcdFx0XHR0aGlzLnNldEZvbnRTZXR0aW5nQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iaixcclxuXHRcdFx0XHRcdFx0ZGF0YSxcclxuXHRcdFx0XHRcdFx0LTFcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTEgPSAwO1xyXG5cdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmouY29uZGl0aW9ucyA9IFwiR3JlYXRlclRoYW5cIjtcclxuXHRcdFx0XHRcdHRoaXMuc2V0Rm9udFNldHRpbmdDb25kaXRpb25hbChcclxuXHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmosXHJcblx0XHRcdFx0XHRcdGRhdGEsXHJcblx0XHRcdFx0XHRcdDFcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRjYXNlIFwiQmV0d2VlblwiOiAvLyB2YWx1ZTE8PSB2YWwgPD12YWx1ZTJcclxuXHRcdFx0XHRcdGlmIChNYXRoLnNpZ24oZGF0YS5jb21wYXJlVmFsdWUyKSkge1xyXG5cdFx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUxID0gMDtcclxuXHRcdFx0XHRcdFx0bmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqLnZhbHVlMiA9IGRhdGEuY29tcGFyZVZhbHVlMTtcclxuXHRcdFx0XHRcdFx0bmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqLmNvbmRpdGlvbnMgPSBcIkJldHdlZW5cIjtcclxuXHRcdFx0XHRcdFx0dGhpcy5zZXRGb250U2V0dGluZ0NvbmRpdGlvbmFsKFxyXG5cdFx0XHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iaixcclxuXHRcdFx0XHRcdFx0XHRkYXRhLFxyXG5cdFx0XHRcdFx0XHRcdC0xXHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLnZhbHVlMSA9IDA7XHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLnZhbHVlMiA9IGRhdGEuY29tcGFyZVZhbHVlMjtcclxuXHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmouY29uZGl0aW9ucyA9IFwiQmV0d2VlblwiO1xyXG5cdFx0XHRcdFx0XHR0aGlzLnNldEZvbnRTZXR0aW5nQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmosXHJcblx0XHRcdFx0XHRcdFx0ZGF0YSxcclxuXHRcdFx0XHRcdFx0XHQxXHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUxID0gZGF0YS5jb21wYXJlVmFsdWUxO1xyXG5cdFx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUyID0gZGF0YS5jb21wYXJlVmFsdWUyO1xyXG5cdFx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmouY29uZGl0aW9ucyA9IFwiQmV0d2VlblwiO1xyXG5cdFx0XHRcdFx0XHR0aGlzLnNldEZvbnRTZXR0aW5nQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdFx0bmVnYUNvbmRpdGlvbmFsRm9ybWF0T2JqLFxyXG5cdFx0XHRcdFx0XHRcdGRhdGEsXHJcblx0XHRcdFx0XHRcdFx0LTFcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdGNhc2UgXCJOb3RCZXR3ZWVuXCI6IC8vIHZhbCA+PSB2YWx1ZTIsIHZhbCA8PSB2YWx1ZTFcclxuXHRcdFx0XHRcdGlmIChNYXRoLnNpZ24oZGF0YS5jb21wYXJlVmFsdWUyKSkge1xyXG5cdFx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUxID0gZGF0YS5jb21wYXJlVmFsdWUxO1xyXG5cdFx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmouY29uZGl0aW9ucyA9IFwiTGVzc1RoYW5cIjtcclxuXHRcdFx0XHRcdFx0dGhpcy5zZXRGb250U2V0dGluZ0NvbmRpdGlvbmFsKFxyXG5cdFx0XHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iaixcclxuXHRcdFx0XHRcdFx0XHRkYXRhLFxyXG5cdFx0XHRcdFx0XHRcdC0xXHJcblx0XHRcdFx0XHRcdCk7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTEgPSBkYXRhLmNvbXBhcmVWYWx1ZTI7XHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLmNvbmRpdGlvbnMgPSBcIkdyZWF0ZXJUaGFuXCI7XHJcblx0XHRcdFx0XHRcdHRoaXMuc2V0Rm9udFNldHRpbmdDb25kaXRpb25hbChcclxuXHRcdFx0XHRcdFx0XHRjb25kaXRpb25hbEZvcm1hdE9iaixcclxuXHRcdFx0XHRcdFx0XHRkYXRhLFxyXG5cdFx0XHRcdFx0XHRcdDFcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTEgPSBkYXRhLmNvbXBhcmVWYWx1ZTE7XHJcblx0XHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iai52YWx1ZTIgPSBkYXRhLmNvbXBhcmVWYWx1ZTI7XHJcblx0XHRcdFx0XHRcdG5lZ2FDb25kaXRpb25hbEZvcm1hdE9iai5jb25kaXRpb25zID0gXCJOb3RCZXR3ZWVuXCI7XHJcblx0XHRcdFx0XHRcdHRoaXMuc2V0Rm9udFNldHRpbmdDb25kaXRpb25hbChcclxuXHRcdFx0XHRcdFx0XHRuZWdhQ29uZGl0aW9uYWxGb3JtYXRPYmosXHJcblx0XHRcdFx0XHRcdFx0ZGF0YSxcclxuXHRcdFx0XHRcdFx0XHQtMVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmoudmFsdWUxID0gMDtcclxuXHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxGb3JtYXRPYmouY29uZGl0aW9ucyA9IFwiR3JlYXRlclRoYW5cIjtcclxuXHRcdFx0XHRcdFx0dGhpcy5zZXRGb250U2V0dGluZ0NvbmRpdGlvbmFsKFxyXG5cdFx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsRm9ybWF0T2JqLFxyXG5cdFx0XHRcdFx0XHRcdGRhdGEsXHJcblx0XHRcdFx0XHRcdFx0MVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGdldFF1YXJ0ZXJWYWx1ZShmb3JtYXQsIGRhdGUsIHF1YXJ0ZXIpIHtcclxuXHRcdGxldCB5ZWFyOiBhbnk7XHJcblx0XHRzd2l0Y2ggKGZvcm1hdCkge1xyXG5cdFx0XHRjYXNlIFwiUTEgMjAyMVwiOlxyXG5cdFx0XHRcdHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XHJcblx0XHRcdFx0cmV0dXJuIFwiUVwiICsgcXVhcnRlciArIFwiIFwiICsgeWVhcjtcclxuXHRcdFx0Y2FzZSBcIlExIDIxXCI6XHJcblx0XHRcdFx0eWVhciA9IChkYXRlIGFzIGFueSkuZ2V0WWVhcigpIC0gMTAwO1xyXG5cdFx0XHRcdHJldHVybiBcIlFcIiArIHF1YXJ0ZXIgKyBcIiBcIiArIHllYXI7XHJcblx0XHRcdGNhc2UgXCIyMDIxIFExXCI6XHJcblx0XHRcdFx0eWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcclxuXHRcdFx0XHRyZXR1cm4geWVhciArIFwiIFwiICsgXCJRXCIgKyBxdWFydGVyO1xyXG5cdFx0XHRjYXNlIFwiMjEgUTFcIjpcclxuXHRcdFx0XHR5ZWFyID0gKGRhdGUgYXMgYW55KS5nZXRZZWFyKCkgLSAxMDA7XHJcblx0XHRcdFx0cmV0dXJuIHllYXIgKyBcIiBcIiArIFwiUVwiICsgcXVhcnRlcjtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGN1c3RvbWlzZUNlbGwoYXJnczogUXVlcnlDZWxsSW5mb0V2ZW50QXJncykge1xyXG5cdFx0aWYgKGFyZ3MuY29sdW1uLnR5cGUgPT09IFwiZGF0ZVwiIHx8IGFyZ3MuY29sdW1uLnR5cGUgPT09IFwiZGF0ZVRpbWVcIikge1xyXG5cdFx0XHRjb25zdCB7IGZpZWxkIH0gPSBhcmdzLmNvbHVtbjtcclxuXHRcdFx0aWYgKCFhcmdzLmRhdGFbZmllbGRdKSB7XHJcblx0XHRcdFx0YXJncy5jb2x1bW4udHlwZSA9IFwic3RyaW5nXCI7XHJcblx0XHRcdFx0YXJncy5jb2x1bW4uZm9ybWF0ID0gXCJcIjtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQHBhcmFtIHRpbWVBcnJheSDmlbDnu4Tlr7nosaEgW3tcImRhdGVcIjpcIjIwMjEtMDEtMDFcIn0se1wiZGF0ZVwiOlwiMjAyMS0wMi0wMVwifV1cclxuXHQgKiBAcGFyYW0gZW5kRGF0ZSDmiKroh7Pml7bpl7RcclxuXHQgKiBAcGFyYW0gaW50ZXJ2YWwg5pe26Ze06Ze06ZqUIHllYXIgLyBxdWFydGVyIC8gbW9udGhcclxuXHQgKiBAcGFyYW0gdGltZUtleSDml7bpl7TlrZfmrrXlkI0gZGF0ZVxyXG5cdCAqIEByZXR1cm5zIOWIkuWIhuWQjueahOaXtumXtOWIhue7hOWvueixoVxyXG5cdCAqL1xyXG5cdGdldFRpbWVSYW5nZXModGltZUFycmF5LCBlbmREYXRlLCBpbnRlcnZhbCwgdGltZUtleSkge1xyXG5cdFx0Ly8g5bCG5pe26Ze05a2X56ym5Liy6L2s5o2i5Li6IG1vbWVudCDlr7nosaFcclxuXHRcdGNvbnN0IGRhdGVzID0gdGltZUFycmF5Lm1hcCgoaXRlbSkgPT4gbW9tZW50KGl0ZW1bdGltZUtleSB8fCBcImRhdGVcIl0pKTtcclxuXHJcblx0XHQvLyDliIbpmpTnrKZcclxuXHRcdGNvbnN0IGRlbGltaXRlciA9IFwiLVwiO1xyXG5cclxuXHRcdC8vIOaJvuWIsOacgOWwj+aXtumXtOWSjOacgOWkp+aXtumXtFxyXG5cdFx0Y29uc3QgbWluRGF0ZSA9IG1vbWVudC5taW4oZGF0ZXMpO1xyXG5cdFx0Y29uc3QgbWF4RGF0ZSA9IG1vbWVudChlbmREYXRlKTtcclxuXHJcblx0XHQvLyDliJ3lp4vljJbnu5Pmnpzlr7nosaFcclxuXHRcdGNvbnN0IHJlc3VsdCA9IHt9O1xyXG5cclxuXHRcdC8vIOagueaNruWFpeWPgui/m+ihjOWIkuWIhlxyXG5cdFx0aWYgKGludGVydmFsID09PSBcInllYXJcIikge1xyXG5cdFx0XHRjb25zdCBzdGFydFllYXIgPSBtaW5EYXRlLnllYXIoKTtcclxuXHRcdFx0Y29uc3QgZW5kWWVhciA9IG1heERhdGUueWVhcigpO1xyXG5cclxuXHRcdFx0Zm9yIChsZXQgeWVhciA9IHN0YXJ0WWVhcjsgeWVhciA8PSBlbmRZZWFyOyB5ZWFyKyspIHtcclxuXHRcdFx0XHRyZXN1bHRbeWVhcl0gPSBbXTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZGF0ZXMuZm9yRWFjaCgoZGF0ZSwgaW5kZXgpID0+IHtcclxuXHRcdFx0XHRjb25zdCB5ZWFyID0gZGF0ZS55ZWFyKCk7XHJcblx0XHRcdFx0cmVzdWx0W3llYXJdLnB1c2godGltZUFycmF5W2luZGV4XSk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fSBlbHNlIGlmIChpbnRlcnZhbCA9PT0gXCJxdWFydGVyXCIpIHtcclxuXHRcdFx0Ly8g5a2Y5YKo5a2j5bqm5a2X56ym5LiyXHJcblx0XHRcdGNvbnN0IHF1YXJ0ZXJzID0gW107XHJcblxyXG5cdFx0XHQvLyDpgJDkuIDpgY3ljobmr4/kuKrlraPluqZcclxuXHRcdFx0Zm9yIChcclxuXHRcdFx0XHRsZXQgY3VycmVudERhdGUgPSBtaW5EYXRlLmNsb25lKCk7XHJcblx0XHRcdFx0Y3VycmVudERhdGUuaXNTYW1lT3JCZWZvcmUobWF4RGF0ZSk7XHJcblx0XHRcdFx0Y3VycmVudERhdGUuYWRkKDMsIFwibW9udGhzXCIpXHJcblx0XHRcdCkge1xyXG5cdFx0XHRcdGNvbnN0IHllYXIgPSBjdXJyZW50RGF0ZS55ZWFyKCk7XHJcblx0XHRcdFx0Y29uc3QgcXVhcnRlciA9IE1hdGguY2VpbCgoY3VycmVudERhdGUubW9udGgoKSArIDEpIC8gMyk7IC8vIOiuoeeul+Wto+W6plxyXG5cdFx0XHRcdHF1YXJ0ZXJzLnB1c2goYCR7eWVhcn0ke2RlbGltaXRlcn1RJHtxdWFydGVyfWApOyAvLyDmoLzlvI/ljJblubbmt7vliqDliLDmlbDnu4RcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8g6L6T5Ye65omA5pyJ5a2j5bqmXHJcblx0XHRcdHF1YXJ0ZXJzLmZvckVhY2goKHF1YXJ0ZXIsIGluZGV4KSA9PiB7XHJcblx0XHRcdFx0cmVzdWx0W3F1YXJ0ZXJdID0gW107XHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0ZGF0ZXMuZm9yRWFjaCgoZGF0ZSwgaW5kZXgpID0+IHtcclxuXHRcdFx0XHRjb25zdCB5ZWFyID0gZGF0ZS55ZWFyKCk7XHJcblx0XHRcdFx0Y29uc3QgcXVhcnRlciA9IGRhdGUucXVhcnRlcigpOyAvLyDojrflj5blraPluqZcclxuXHRcdFx0XHRpZiAocXVhcnRlciA9PT0gMSlcclxuXHRcdFx0XHRcdHJlc3VsdFt5ZWFyICsgZGVsaW1pdGVyICsgXCJRMVwiXS5wdXNoKHRpbWVBcnJheVtpbmRleF0pO1xyXG5cdFx0XHRcdGVsc2UgaWYgKHF1YXJ0ZXIgPT09IDIpXHJcblx0XHRcdFx0XHRyZXN1bHRbeWVhciArIGRlbGltaXRlciArIFwiUTJcIl0ucHVzaCh0aW1lQXJyYXlbaW5kZXhdKTtcclxuXHRcdFx0XHRlbHNlIGlmIChxdWFydGVyID09PSAzKVxyXG5cdFx0XHRcdFx0cmVzdWx0W3llYXIgKyBkZWxpbWl0ZXIgKyBcIlEzXCJdLnB1c2godGltZUFycmF5W2luZGV4XSk7XHJcblx0XHRcdFx0ZWxzZSBpZiAocXVhcnRlciA9PT0gNClcclxuXHRcdFx0XHRcdHJlc3VsdFt5ZWFyICsgZGVsaW1pdGVyICsgXCJRNFwiXS5wdXNoKHRpbWVBcnJheVtpbmRleF0pO1xyXG5cdFx0XHR9KTtcclxuXHRcdH0gZWxzZSBpZiAoaW50ZXJ2YWwgPT09IFwibW9udGhcIikge1xyXG5cdFx0XHQvLyDlrZjlgqjmnIjku73lrZfnrKbkuLJcclxuXHRcdFx0Y29uc3QgbW9udGhzID0gW107XHJcblxyXG5cdFx0XHQvLyDpgJDkuIDpgY3ljobmr4/kuKrmnIhcclxuXHRcdFx0Zm9yIChcclxuXHRcdFx0XHRsZXQgY3VycmVudERhdGUgPSBtaW5EYXRlLmNsb25lKCk7XHJcblx0XHRcdFx0Y3VycmVudERhdGUuaXNTYW1lT3JCZWZvcmUobWF4RGF0ZSk7XHJcblx0XHRcdFx0Y3VycmVudERhdGUuYWRkKDEsIFwibW9udGhzXCIpXHJcblx0XHRcdCkge1xyXG5cdFx0XHRcdG1vbnRocy5wdXNoKGN1cnJlbnREYXRlLmZvcm1hdChgWVlZWSR7ZGVsaW1pdGVyfU1NYCkpOyAvLyDmoLzlvI/ljJblubbmt7vliqDliLDmlbDnu4RcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8g6L6T5Ye65omA5pyJ5pyI5Lu9XHJcblx0XHRcdG1vbnRocy5mb3JFYWNoKChtb250aCwgaW5kZXgpID0+IHtcclxuXHRcdFx0XHRyZXN1bHRbbW9udGhdID0gW107XHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0ZGF0ZXMuZm9yRWFjaCgoZGF0ZSwgaW5kZXgpID0+IHtcclxuXHRcdFx0XHRjb25zdCB5ZWFyID0gZGF0ZS55ZWFyKCk7XHJcblx0XHRcdFx0Y29uc3QgbW9udGggPSAoZGF0ZS5tb250aCgpICsgMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIik7IC8vIDAtMTFcclxuXHRcdFx0XHRyZXN1bHRbeWVhciArIGRlbGltaXRlciArIG1vbnRoXS5wdXNoKHRpbWVBcnJheVtpbmRleF0pO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICog6K6h566X5Yeg5L2V566X5pWw5bmz5pa55pu0XHJcblx0ICogQHBhcmFtIHZhbHVlcyDmlbDnu4QgWzAsIDAsIDAuMjU3NV1cclxuXHQgKiBAcmV0dXJuc1xyXG5cdCAqL1xyXG5cdGNhbGN1bGF0ZUdyb3d0aFJhdGUodmFsdWVzKSB7XHJcblx0XHRjb25zdCBwcm9kdWN0ID0gdmFsdWVzLnJlZHVjZSgoYWNjLCB2YWwpID0+IGFjYyAqICgxICsgdmFsKSwgMSk7XHJcblx0XHRpZiAocHJvZHVjdCA+PSAwKSB7XHJcblx0XHRcdHJldHVybiBNYXRoLnBvdyhwcm9kdWN0LCAxIC8gdmFsdWVzLmxlbmd0aCkgLSAxO1xyXG5cdFx0fSBlbHNlIGlmIChwcm9kdWN0IDwgMCkge1xyXG5cdFx0XHRpZiAodmFsdWVzLmxlbmd0aCAlIDIgPT0gMCkge1xyXG5cdFx0XHRcdHJldHVybiBudWxsO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHJldHVybiB0aGlzLm50aHJvb3QocHJvZHVjdCwgdmFsdWVzLmxlbmd0aCkgLSAxO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cdG50aHJvb3QoeCwgbikge1xyXG5cdFx0bGV0IG5nID0gbiAlIDI7XHJcblx0XHRpZiAobmcgPT0gMSB8fCB4IDwgMCkgeCA9IC14O1xyXG5cdFx0dmFyIHIgPSBNYXRoLnBvdyh4LCAxIC8gbik7XHJcblx0XHRuID0gTWF0aC5wb3cociwgbik7XHJcblxyXG5cdFx0aWYgKE1hdGguYWJzKHggLSBuKSA8IDEgJiYgeCA+IDAgPT09IG4gPiAwKSByZXR1cm4gbmcgPyAtciA6IHI7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiDmoIflh4blgY/lt65cclxuXHQgKiBAcGFyYW0gdmFsdWVzIOaVsOe7hCBbMCwgMCwgLTAuNDc3NV1cclxuXHQgKiBAcmV0dXJucyAwLjI3NTY4NDc1MzUzODA0NjNcclxuXHQgKi9cclxuXHRjYWxjdWxhdGVTdGFuZGFyZERldmlhdGlvbih2YWx1ZXMpIHtcclxuXHRcdGNvbnN0IG4gPSB2YWx1ZXMubGVuZ3RoO1xyXG5cclxuXHRcdC8vIOajgOafpeaVsOaNrueCueaVsOmHj1xyXG5cdFx0aWYgKG4gPCAyKSB7XHJcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIuiHs+WwkemcgOimgeS4pOS4quaVsOaNrueCueadpeiuoeeul+agt+acrOagh+WHhuWBj+W3rlwiKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyDorqHnrpflnYflgLxcclxuXHRcdGNvbnN0IG1lYW4gPSB2YWx1ZXMucmVkdWNlKChhY2MsIHZhbCkgPT4gYWNjICsgdmFsLCAwKSAvIG47XHJcblxyXG5cdFx0Ly8g6K6h566X5pa55beuXHJcblx0XHRjb25zdCB2YXJpYW5jZSA9XHJcblx0XHRcdHZhbHVlcy5yZWR1Y2UoKGFjYywgdmFsKSA9PiBhY2MgKyBNYXRoLnBvdyh2YWwgLSBtZWFuLCAyKSwgMCkgL1xyXG5cdFx0XHQobiAtIDEpO1xyXG5cclxuXHRcdC8vIOi/lOWbnuagh+WHhuWBj+W3rlxyXG5cdFx0cmV0dXJuIE1hdGguc3FydCh2YXJpYW5jZSk7XHJcblx0fVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJjb250cm9sLXNlY3Rpb25cIiBzdHlsZT1cIm92ZXJmbG93OiBoaWRkZW47IGhlaWdodDogMTAwJVwiPlxyXG5cdDxlanMtcGl2b3R2aWV3XHJcblx0XHR3aWR0aD1cIjEwMCVcIlxyXG5cdFx0aGVpZ2h0PVwiMTAwJVwiXHJcblx0XHRzdHlsZT1cImRpc3BsYXk6IGJsb2NrXCJcclxuXHRcdFtkYXRhU291cmNlU2V0dGluZ3NdPVwiZGF0YVNvdXJjZVNldHRpbmdzXCJcclxuXHRcdCNwaXZvdHZpZXdcclxuXHRcdChkYXRhQm91bmQpPVwiZGF0YUJvdW5kKCRldmVudClcIlxyXG5cdFx0ZW5hYmxlVmFsdWVTb3J0aW5nPVwidHJ1ZVwiXHJcblx0XHRhbGxvd0NvbmRpdGlvbmFsRm9ybWF0dGluZz1cInRydWVcIlxyXG5cdFx0W2FsbG93RGVmZXJMYXlvdXRVcGRhdGVdPVwidHJ1ZVwiXHJcblx0XHRbZ3JpZFNldHRpbmdzXT1cImdyaWRTZXR0aW5nc1wiXHJcblx0XHRhbGxvd0V4Y2VsRXhwb3J0PVwidHJ1ZVwiXHJcblx0XHRhbGxvd0dyb3VwaW5nPVwidHJ1ZVwiXHJcblx0XHRbem9vbVNldHRpbmdzXT1cInpvb21TZXR0aW5nc1wiXHJcblx0XHRlbmFibGVWaXJ0dWFsaXphdGlvbj1cInRydWVcIlxyXG5cdFx0KGVuZ2luZVBvcHVsYXRlZCk9XCJhZnRlckVuZ2luZVBvcHVsYXRlKCRldmVudClcIlxyXG5cdFx0KGFnZ3JlZ2F0ZUNlbGxJbmZvKT1cImFnZ3JlZ2F0ZUNlbGxJbmZvKCRldmVudClcIlxyXG5cdFx0KGNlbGxDbGljayk9XCJjZWxsQ2xpY2soJGV2ZW50KVwiXHJcblx0XHRhbGxvd0RyaWxsVGhyb3VnaD1cInRydWVcIlxyXG5cdFx0KGFjdGlvbkZhaWx1cmUpPVwiYWN0aW9uRmFpbHVyZSgkZXZlbnQpXCJcclxuXHRcdChhY3Rpb25Db21wbGV0ZSk9XCJhY3Rpb25Db21wbGV0ZSgkZXZlbnQpXCJcclxuXHRcdChhY3Rpb25CZWdpbik9XCJhY3Rpb25CZWdpbigkZXZlbnQpXCJcclxuXHRcdChmaWVsZExpc3RSZWZyZXNoZWQpPVwiZmllbGRMaXN0UmVmcmVzaGVkKCRldmVudClcIlxyXG5cdFx0KGRyaWxsVGhyb3VnaCk9XCJkcmlsbFRocm91Z2goJGV2ZW50KVwiXHJcblx0XHRbc2hvd1Rvb2x0aXBdPVwiZmFsc2VcIlxyXG5cdFx0KHF1ZXJ5Q2VsbEluZm8pPVwiY3VzdG9taXNlQ2VsbCgkZXZlbnQpXCJcclxuXHRcdChiZWZvcmVFeHBvcnQpPVwiYmVmb3JlRXhwb3J0KCRldmVudClcIlxyXG5cdD5cclxuXHQ8L2Vqcy1waXZvdHZpZXc+XHJcblxyXG5cdDxkaXYgY2xhc3M9XCJwaXZvdGZpZWxkbGlzdC1jb250cm9sXCI+XHJcblx0XHQ8ZWpzLXBpdm90ZmllbGRsaXN0XHJcblx0XHRcdFtpZF09XCJwb3J0bGV0Lm5ld0lkXCJcclxuXHRcdFx0I3Bpdm90ZmllbGRsaXN0XHJcblx0XHRcdFthbGxvd0RlZmVyTGF5b3V0VXBkYXRlXT1cInRydWVcIlxyXG5cdFx0XHRyZW5kZXJNb2RlPVwiUG9wdXBcIlxyXG5cdFx0XHQoZW5naW5lUG9wdWxhdGVkKT1cImFmdGVyUG9wdWxhdGUoJGV2ZW50KVwiXHJcblx0XHRcdChtZW1iZXJFZGl0b3JPcGVuKT1cIm9uTWVtYmVyRWRpdG9yT3BlbigkZXZlbnQpXCJcclxuXHRcdFx0KGVuZ2luZVBvcHVsYXRpbmcpPVwiZW5naW5lUG9wdWxhdGluZygkZXZlbnQpXCJcclxuXHRcdFx0KGFnZ3JlZ2F0ZUNlbGxJbmZvKT1cImFnZ3JlZ2F0ZUNlbGxJbmZvKCRldmVudClcIlxyXG5cdFx0XHQoZmllbGREcm9wKT1cIm9uRmllbGREcm9wKCRldmVudClcIlxyXG5cdFx0XHQoYWN0aW9uQ29tcGxldGUpPVwiYWN0aW9uQ29tcGxldGUoJGV2ZW50KVwiXHJcblx0XHRcdChhY3Rpb25CZWdpbik9XCJhY3Rpb25CZWdpbigkZXZlbnQpXCJcclxuXHRcdFx0KGNhbGN1bGF0ZWRGaWVsZENyZWF0ZSk9XCJjYWxjdWxhdGVkRmllbGRDcmVhdGUoJGV2ZW50KVwiXHJcblx0XHRcdChsb2FkKT1cIm9uTG9hZCgpXCJcclxuXHRcdFx0KGNyZWF0ZWQpPVwiY3JlYXRlZCgkZXZlbnQpXCJcclxuXHRcdFx0KGRhdGFCb3VuZCk9J29uZGF0YUJvdW5kKCknXHJcblx0XHQ+XHJcblx0XHQ8L2Vqcy1waXZvdGZpZWxkbGlzdD5cclxuXHQ8L2Rpdj5cclxuXHJcblx0PGRpdiBjbGFzcz1cImZ1bGwtYm94LW1hc2tcIiAqbmdJZj1cInBhZ2VMb2FkaW5nXCI+XHJcblx0XHQ8bWF0LXNwaW5uZXJcclxuXHRcdFx0c3R5bGU9XCJ6LWluZGV4OiA5OTlcIlxyXG5cdFx0XHRtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiXHJcblx0XHRcdFtkaWFtZXRlcl09XCIyNFwiXHJcblx0XHQ+PC9tYXQtc3Bpbm5lcj5cclxuXHQ8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==