raise-common-lib 0.0.205 → 0.0.207

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 (228) hide show
  1. package/bundles/raise-common-lib.umd.js +28147 -1277
  2. package/bundles/raise-common-lib.umd.js.map +1 -1
  3. package/bundles/raise-common-lib.umd.min.js +1 -1
  4. package/bundles/raise-common-lib.umd.min.js.map +1 -1
  5. package/esm2015/lib/dashboard/api.js +46 -0
  6. package/esm2015/lib/dashboard/bar-charts/bar-charts.component.js +638 -0
  7. package/esm2015/lib/dashboard/bar-charts/utils.js +40 -0
  8. package/esm2015/lib/dashboard/dashboard-properties/data-mart-new/data-mart-new.component.js +700 -0
  9. package/esm2015/lib/dashboard/dashboard.service.js +650 -0
  10. package/esm2015/lib/dashboard/dashboardPorlets.service.js +3107 -0
  11. package/esm2015/lib/dashboard/dialog-group/download/index.component.js +358 -0
  12. package/esm2015/lib/dashboard/dialog-group/empty-icon-prompt/empty-icon-prompt.component.js +67 -0
  13. package/esm2015/lib/dashboard/gadget-group/gadget-pivot/gadget-pivot.component.js +4443 -0
  14. package/esm2015/lib/dashboard/gadget-group/gadget-pivot-chart/gadget-pivot.component.js +4293 -0
  15. package/esm2015/lib/dashboard/gadget-group/gadget-table/gadget-table.component.js +1553 -0
  16. package/esm2015/lib/dashboard/gadget-group/gadget-transpose/gadget-transpose.component.js +857 -0
  17. package/esm2015/lib/dashboard/pane-group-new.component.js +2930 -0
  18. package/esm2015/lib/dashboard/sidebar-iconlist/field-filter/field-filter.component.js +1016 -0
  19. package/esm2015/lib/dashboard/sidebar-iconlist/field-format/field-format.component.js +1003 -0
  20. package/esm2015/lib/dashboard/sidebar-iconlist/portlet-type-new/portlet-type-new.component.js +319 -0
  21. package/esm2015/lib/dashboard/sidebar-iconlist/sidebar-iconlist-new.component.js +1638 -0
  22. package/esm2015/lib/layout/rs-stepper/index.component.js +175 -9
  23. package/esm2015/lib/raise-common-lib.module.js +56 -3
  24. package/esm2015/lib/service/InjectionToken.js +13 -0
  25. package/esm2015/public-api.js +3 -1
  26. package/esm2015/raise-common-lib.js +22 -6
  27. package/esm5/lib/dashboard/api.js +48 -0
  28. package/esm5/lib/dashboard/bar-charts/bar-charts.component.js +733 -0
  29. package/esm5/lib/dashboard/bar-charts/utils.js +45 -0
  30. package/esm5/lib/dashboard/dashboard-properties/data-mart-new/data-mart-new.component.js +772 -0
  31. package/esm5/lib/dashboard/dashboard.service.js +846 -0
  32. package/esm5/lib/dashboard/dashboardPorlets.service.js +3536 -0
  33. package/esm5/lib/dashboard/dialog-group/download/index.component.js +441 -0
  34. package/esm5/lib/dashboard/dialog-group/empty-icon-prompt/empty-icon-prompt.component.js +78 -0
  35. package/esm5/lib/dashboard/gadget-group/gadget-pivot/gadget-pivot.component.js +4940 -0
  36. package/esm5/lib/dashboard/gadget-group/gadget-pivot-chart/gadget-pivot.component.js +4751 -0
  37. package/esm5/lib/dashboard/gadget-group/gadget-table/gadget-table.component.js +1683 -0
  38. package/esm5/lib/dashboard/gadget-group/gadget-transpose/gadget-transpose.component.js +931 -0
  39. package/esm5/lib/dashboard/pane-group-new.component.js +3307 -0
  40. package/esm5/lib/dashboard/sidebar-iconlist/field-filter/field-filter.component.js +1138 -0
  41. package/esm5/lib/dashboard/sidebar-iconlist/field-format/field-format.component.js +1184 -0
  42. package/esm5/lib/dashboard/sidebar-iconlist/portlet-type-new/portlet-type-new.component.js +354 -0
  43. package/esm5/lib/dashboard/sidebar-iconlist/sidebar-iconlist-new.component.js +1792 -0
  44. package/esm5/lib/layout/rs-stepper/index.component.js +206 -12
  45. package/esm5/lib/raise-common-lib.module.js +56 -3
  46. package/esm5/lib/service/InjectionToken.js +13 -0
  47. package/esm5/public-api.js +3 -1
  48. package/esm5/raise-common-lib.js +22 -6
  49. package/fesm2015/raise-common-lib.js +24917 -1169
  50. package/fesm2015/raise-common-lib.js.map +1 -1
  51. package/fesm5/raise-common-lib.js +27944 -1267
  52. package/fesm5/raise-common-lib.js.map +1 -1
  53. package/lib/dashboard/api.d.ts +21 -0
  54. package/lib/dashboard/bar-charts/bar-charts.component.d.ts +60 -0
  55. package/lib/dashboard/bar-charts/utils.d.ts +1 -0
  56. package/lib/dashboard/dashboard-properties/data-mart-new/data-mart-new.component.d.ts +49 -0
  57. package/lib/dashboard/dashboard.service.d.ts +149 -0
  58. package/lib/dashboard/dashboardPorlets.service.d.ts +211 -0
  59. package/lib/dashboard/dialog-group/download/index.component.d.ts +33 -0
  60. package/lib/dashboard/dialog-group/empty-icon-prompt/empty-icon-prompt.component.d.ts +12 -0
  61. package/lib/dashboard/gadget-group/gadget-pivot/gadget-pivot.component.d.ts +125 -0
  62. package/lib/dashboard/gadget-group/gadget-pivot-chart/gadget-pivot.component.d.ts +128 -0
  63. package/lib/dashboard/gadget-group/gadget-table/gadget-table.component.d.ts +74 -0
  64. package/lib/dashboard/gadget-group/gadget-transpose/gadget-transpose.component.d.ts +44 -0
  65. package/lib/dashboard/pane-group-new.component.d.ts +165 -0
  66. package/lib/dashboard/sidebar-iconlist/field-filter/field-filter.component.d.ts +53 -0
  67. package/lib/dashboard/sidebar-iconlist/field-format/field-format.component.d.ts +59 -0
  68. package/lib/dashboard/sidebar-iconlist/portlet-type-new/portlet-type-new.component.d.ts +27 -0
  69. package/lib/dashboard/sidebar-iconlist/sidebar-iconlist-new.component.d.ts +147 -0
  70. package/lib/layout/rs-stepper/index.component.d.ts +17 -4
  71. package/lib/service/InjectionToken.d.ts +4 -0
  72. package/package.json +1 -1
  73. package/public-api.d.ts +2 -0
  74. package/raise-common-lib.d.ts +20 -4
  75. package/raise-common-lib.metadata.json +1 -1
  76. package/src/assets/img/dashboard_icon/AddPerson.svg +4 -0
  77. package/src/assets/img/dashboard_icon/Angle-double-left.svg +12 -0
  78. package/src/assets/img/dashboard_icon/Angle-double-right.svg +12 -0
  79. package/src/assets/img/dashboard_icon/Arrow_collapse.svg +3 -0
  80. package/src/assets/img/dashboard_icon/Arrow_expand.svg +3 -0
  81. package/src/assets/img/dashboard_icon/Close.svg +4 -0
  82. package/src/assets/img/dashboard_icon/Edit_label.svg +3 -0
  83. package/src/assets/img/dashboard_icon/RemoveMini.svg +3 -0
  84. package/src/assets/img/dashboard_icon/ShareTo.svg +3 -0
  85. package/src/assets/img/dashboard_icon/add-dashboard.svg +4 -0
  86. package/src/assets/img/dashboard_icon/add-tab.svg +4 -0
  87. package/src/assets/img/dashboard_icon/angle-left.svg +12 -0
  88. package/src/assets/img/dashboard_icon/angle-right.svg +12 -0
  89. package/src/assets/img/dashboard_icon/area-white.svg +3 -0
  90. package/src/assets/img/dashboard_icon/area.svg +3 -0
  91. package/src/assets/img/dashboard_icon/bar-white.svg +14 -0
  92. package/src/assets/img/dashboard_icon/bar.svg +14 -0
  93. package/src/assets/img/dashboard_icon/basic-icon-filter.svg +14 -0
  94. package/src/assets/img/dashboard_icon/chart-combined-active.svg +7 -0
  95. package/src/assets/img/dashboard_icon/chart-combined.svg +7 -0
  96. package/src/assets/img/dashboard_icon/column-white.svg +14 -0
  97. package/src/assets/img/dashboard_icon/column.svg +26 -0
  98. package/src/assets/img/dashboard_icon/customize.png +0 -0
  99. package/src/assets/img/dashboard_icon/dashboard-description.svg +18 -0
  100. package/src/assets/img/dashboard_icon/dashboard-download.svg +18 -0
  101. package/src/assets/img/dashboard_icon/dashboard-drag.svg +28 -0
  102. package/src/assets/img/dashboard_icon/dashboard-duplicate.svg +24 -0
  103. package/src/assets/img/dashboard_icon/dashboard-icon.svg +12 -0
  104. package/src/assets/img/dashboard_icon/dashboard-properties.svg +18 -0
  105. package/src/assets/img/dashboard_icon/dashboard-rename.svg +18 -0
  106. package/src/assets/img/dashboard_icon/dashboard-share.svg +20 -0
  107. package/src/assets/img/dashboard_icon/dashboard-tab-delete.svg +4 -0
  108. package/src/assets/img/dashboard_icon/dashboard_Share.svg +3 -0
  109. package/src/assets/img/dashboard_icon/dashboard_ToolsHide.svg +4 -0
  110. package/src/assets/img/dashboard_icon/datamart_.svg +5 -0
  111. package/src/assets/img/dashboard_icon/datamart_Admin.svg +3 -0
  112. package/src/assets/img/dashboard_icon/datamart_Asset Portfolio.svg +4 -0
  113. package/src/assets/img/dashboard_icon/datamart_Bank.svg +3 -0
  114. package/src/assets/img/dashboard_icon/datamart_CRM.svg +6 -0
  115. package/src/assets/img/dashboard_icon/datamart_Company.svg +6 -0
  116. package/src/assets/img/dashboard_icon/datamart_Compliance.svg +3 -0
  117. package/src/assets/img/dashboard_icon/datamart_Contact.svg +3 -0
  118. package/src/assets/img/dashboard_icon/datamart_DASHBOARD.svg +4 -0
  119. package/src/assets/img/dashboard_icon/datamart_DOCX.svg +4 -0
  120. package/src/assets/img/dashboard_icon/datamart_ESG.svg +4 -0
  121. package/src/assets/img/dashboard_icon/datamart_Financials - Company.svg +3 -0
  122. package/src/assets/img/dashboard_icon/datamart_Fund.svg +4 -0
  123. package/src/assets/img/dashboard_icon/datamart_FundFinancial.svg +4 -0
  124. package/src/assets/img/dashboard_icon/datamart_HTML.svg +4 -0
  125. package/src/assets/img/dashboard_icon/datamart_Logs.svg +8 -0
  126. package/src/assets/img/dashboard_icon/datamart_PDF.svg +5 -0
  127. package/src/assets/img/dashboard_icon/datamart_Project.svg +3 -0
  128. package/src/assets/img/dashboard_icon/datamart_Templates.svg +7 -0
  129. package/src/assets/img/dashboard_icon/datamart_Track Change.svg +3 -0
  130. package/src/assets/img/dashboard_icon/datamart_VirtualGroup.svg +5 -0
  131. package/src/assets/img/dashboard_icon/datamart_XLS.svg +4 -0
  132. package/src/assets/img/dashboard_icon/desktop_selected.svg +10 -0
  133. package/src/assets/img/dashboard_icon/desktop_unselected.svg +10 -0
  134. package/src/assets/img/dashboard_icon/favourite-grey.svg +3 -0
  135. package/src/assets/img/dashboard_icon/favourite-yellow.svg +3 -0
  136. package/src/assets/img/dashboard_icon/forms-checkbox-square-tick.svg +3 -0
  137. package/src/assets/img/dashboard_icon/ftable-white.svg +24 -0
  138. package/src/assets/img/dashboard_icon/ftable.svg +24 -0
  139. package/src/assets/img/dashboard_icon/gadget-basic-arrow-down.svg +14 -0
  140. package/src/assets/img/dashboard_icon/gadget-basic-format.svg +21 -0
  141. package/src/assets/img/dashboard_icon/gadget-basic-sub-total.svg +18 -0
  142. package/src/assets/img/dashboard_icon/gadget-basic-total-1.svg +9 -0
  143. package/src/assets/img/dashboard_icon/gadget-basic-total.svg +16 -0
  144. package/src/assets/img/dashboard_icon/gadget-columns.svg +12 -0
  145. package/src/assets/img/dashboard_icon/gadget-delete.svg +18 -0
  146. package/src/assets/img/dashboard_icon/gadget-download.svg +18 -0
  147. package/src/assets/img/dashboard_icon/gadget-duplicate.svg +24 -0
  148. package/src/assets/img/dashboard_icon/gadget-edit.svg +18 -0
  149. package/src/assets/img/dashboard_icon/gadget-filters-light.svg +9 -0
  150. package/src/assets/img/dashboard_icon/gadget-filters.svg +9 -0
  151. package/src/assets/img/dashboard_icon/gadget-format-0.svg +8 -0
  152. package/src/assets/img/dashboard_icon/gadget-format-1.svg +8 -0
  153. package/src/assets/img/dashboard_icon/gadget-format.svg +19 -0
  154. package/src/assets/img/dashboard_icon/gadget-fullscreen.svg +30 -0
  155. package/src/assets/img/dashboard_icon/gadget-settings.svg +18 -0
  156. package/src/assets/img/dashboard_icon/gadget-sub-total-0.svg +18 -0
  157. package/src/assets/img/dashboard_icon/gadget-sub-total-1.svg +18 -0
  158. package/src/assets/img/dashboard_icon/gadget-thumbnail.svg +12 -0
  159. package/src/assets/img/dashboard_icon/gadget-type-light.svg +15 -0
  160. package/src/assets/img/dashboard_icon/gadget-type.svg +16 -0
  161. package/src/assets/img/dashboard_icon/geo-white.svg +14 -0
  162. package/src/assets/img/dashboard_icon/geo.svg +14 -0
  163. package/src/assets/img/dashboard_icon/historic-IRR-white.svg +9 -0
  164. package/src/assets/img/dashboard_icon/historic-IRR.svg +5 -0
  165. package/src/assets/img/dashboard_icon/information-1.png +0 -0
  166. package/src/assets/img/dashboard_icon/information-grey.svg +4 -0
  167. package/src/assets/img/dashboard_icon/menu-change-group.svg +3 -0
  168. package/src/assets/img/dashboard_icon/menu-close.svg +20 -0
  169. package/src/assets/img/dashboard_icon/menu-delete.svg +18 -0
  170. package/src/assets/img/dashboard_icon/menu-description.svg +19 -0
  171. package/src/assets/img/dashboard_icon/menu-download.svg +24 -0
  172. package/src/assets/img/dashboard_icon/menu-drag.svg +28 -0
  173. package/src/assets/img/dashboard_icon/menu-duplicate.svg +26 -0
  174. package/src/assets/img/dashboard_icon/menu-properties.svg +18 -0
  175. package/src/assets/img/dashboard_icon/menu-rename.svg +23 -0
  176. package/src/assets/img/dashboard_icon/menu-share.svg +20 -0
  177. package/src/assets/img/dashboard_icon/menu-toolbar.svg +10 -0
  178. package/src/assets/img/dashboard_icon/mobile_selected.svg +10 -0
  179. package/src/assets/img/dashboard_icon/mobile_unselected.svg +10 -0
  180. package/src/assets/img/dashboard_icon/more_Save.svg +3 -0
  181. package/src/assets/img/dashboard_icon/more_View.svg +3 -0
  182. package/src/assets/img/dashboard_icon/multi-series-white.svg +20 -0
  183. package/src/assets/img/dashboard_icon/multi-series.svg +6 -0
  184. package/src/assets/img/dashboard_icon/paint-bucket.svg +6 -0
  185. package/src/assets/img/dashboard_icon/pie-white.svg +16 -0
  186. package/src/assets/img/dashboard_icon/pie.svg +16 -0
  187. package/src/assets/img/dashboard_icon/pivot-chart-active.svg +8 -0
  188. package/src/assets/img/dashboard_icon/pivot-chart.svg +8 -0
  189. package/src/assets/img/dashboard_icon/pivot-white.svg +8 -0
  190. package/src/assets/img/dashboard_icon/pivot.svg +8 -0
  191. package/src/assets/img/dashboard_icon/pivot_column.svg +9 -0
  192. package/src/assets/img/dashboard_icon/pivot_column_active.svg +9 -0
  193. package/src/assets/img/dashboard_icon/pivot_line.svg +12 -0
  194. package/src/assets/img/dashboard_icon/pivot_line_active.svg +12 -0
  195. package/src/assets/img/dashboard_icon/print-A2.svg +3 -0
  196. package/src/assets/img/dashboard_icon/radar-white.svg +19 -0
  197. package/src/assets/img/dashboard_icon/radar.svg +19 -0
  198. package/src/assets/img/dashboard_icon/saveAs.svg +3 -0
  199. package/src/assets/img/dashboard_icon/search_input.svg +4 -0
  200. package/src/assets/img/dashboard_icon/table-3-white.svg +16 -0
  201. package/src/assets/img/dashboard_icon/table-3.svg +16 -0
  202. package/src/assets/img/dashboard_icon/table-filter-off.svg +5 -0
  203. package/src/assets/img/dashboard_icon/table-filter-on.svg +5 -0
  204. package/src/assets/img/dashboard_icon/tag_dashboard_selected.svg +3 -0
  205. package/src/assets/img/dashboard_icon/tag_dashboard_unselected.svg +3 -0
  206. package/src/assets/img/dashboard_icon/tag_share_selected.svg +3 -0
  207. package/src/assets/img/dashboard_icon/tag_share_unselected.svg +3 -0
  208. package/src/assets/img/dashboard_icon/tick.svg +26 -0
  209. package/src/assets/img/dashboard_icon/toolbar_AddDashboard.svg +5 -0
  210. package/src/assets/img/dashboard_icon/toolbar_AddGroup.svg +3 -0
  211. package/src/assets/img/dashboard_icon/toolbar_AddReport.svg +3 -0
  212. package/src/assets/img/dashboard_icon/toolbar_CollapseAll.svg +3 -0
  213. package/src/assets/img/dashboard_icon/toolbar_Customize.svg +3 -0
  214. package/src/assets/img/dashboard_icon/toolbar_DeleteDark.svg +3 -0
  215. package/src/assets/img/dashboard_icon/toolbar_Duplicate.svg +3 -0
  216. package/src/assets/img/dashboard_icon/toolbar_Edit.svg +3 -0
  217. package/src/assets/img/dashboard_icon/toolbar_ExpandAll.svg +3 -0
  218. package/src/assets/img/dashboard_icon/toolbar_Search.svg +3 -0
  219. package/src/assets/img/dashboard_icon/topbar-menu.svg +33 -0
  220. package/src/assets/img/dashboard_icon/topbar-refresh.svg +17 -0
  221. package/src/assets/img/dashboard_icon/topbar-tool-off.svg +12 -0
  222. package/src/assets/img/dashboard_icon/topbar-tool-on.svg +12 -0
  223. package/src/assets/img/dashboard_icon/trade-up-white.svg +14 -0
  224. package/src/assets/img/dashboard_icon/trade-up.svg +14 -0
  225. package/src/assets/img/dashboard_icon/transpose-white.svg +16 -0
  226. package/src/assets/img/dashboard_icon/transpose.svg +16 -0
  227. package/src/assets/style/reset/mat-dialog.scss +11 -5
  228. package/src/assets/style/style.scss +14 -4
@@ -0,0 +1,3536 @@
1
+ /**
2
+ * @fileoverview added by tsickle
3
+ * Generated from: lib/dashboard/dashboardPorlets.service.ts
4
+ * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
5
+ */
6
+ import * as tslib_1 from "tslib";
7
+ import { Inject, Injectable, Optional } from "@angular/core";
8
+ import { ApiList } from "./api";
9
+ import { MatDialog } from "@angular/material";
10
+ import { DashboardService } from "./dashboard.service";
11
+ import { forEach } from "lodash";
12
+ import moment from "moment";
13
+ import { HttpClient, HttpHeaders } from "@angular/common/http";
14
+ import { API_SERVICE_TOKEN, PBF_TOKEN } from "../service/InjectionToken";
15
+ import { DialogService } from "../service/dialog.service";
16
+ import * as i0 from "@angular/core";
17
+ import * as i1 from "./api";
18
+ import * as i2 from "@angular/material/dialog";
19
+ import * as i3 from "../service/dialog.service";
20
+ import * as i4 from "./dashboard.service";
21
+ import * as i5 from "@angular/common/http";
22
+ import * as i6 from "../service/InjectionToken";
23
+ var DashboardPorletsService = /** @class */ (function () {
24
+ function DashboardPorletsService(api, dialog, dialogService, DashboardService, httpClient, pbf, http) {
25
+ this.api = api;
26
+ this.dialog = dialog;
27
+ this.dialogService = dialogService;
28
+ this.DashboardService = DashboardService;
29
+ this.httpClient = httpClient;
30
+ this.pbf = pbf;
31
+ this.http = http;
32
+ // public config;
33
+ this.companyDropdownList = [];
34
+ this.currencyDropdownList = [];
35
+ this.currencyList = [];
36
+ this.portlets = [];
37
+ this.portletsCopy = [];
38
+ this.companyCharts = [];
39
+ this.colorsTotal = [
40
+ "#0b5496",
41
+ "#0081ff",
42
+ "#22cce2",
43
+ "#606ede",
44
+ "#8598f7",
45
+ "#00a744",
46
+ "#12c177",
47
+ "#fdbf5e",
48
+ "#ff8a48",
49
+ "#ea4258",
50
+ ];
51
+ this.fetch_disabled = true;
52
+ this.update_loading = false;
53
+ this.loading_show = false;
54
+ this.sortingPortlet = [];
55
+ this.pagingChanging = [];
56
+ this.selected_enyity_fileds = [];
57
+ this.checkedAll = false;
58
+ this.updated = false;
59
+ this.dataMartTables = {};
60
+ this.length = 0;
61
+ this.templateList = [];
62
+ this.fieldsArr = {};
63
+ this.sourcesData = {};
64
+ // newDashboard
65
+ this.portletResults_New = {}; // 以DataTable为单位 存储新数据
66
+ // 以DataTable为单位 存储新数据
67
+ this.portletData_New = {}; // 以portlet为单位 存储新数据
68
+ // 以portlet为单位 存储新数据
69
+ this.portletFields_Temp = {}; // 存储当前portlet所用到的字段
70
+ // 存储当前portlet所用到的字段
71
+ this.dashboardConfig = {}; // 当前Dashboard的config, 用于获取orderByColumns
72
+ // 当前Dashboard的config, 用于获取orderByColumns
73
+ this.entityIds = [];
74
+ this.entityIdObj = {};
75
+ this.allFieldsObj = {};
76
+ this.GetDataTypes = (/**
77
+ * @return {?}
78
+ */
79
+ function () {
80
+ return [
81
+ { key: "budget", val: this.translation.BUDGET },
82
+ { key: "actual", val: this.translation.ACTUAL },
83
+ { key: "forecast", val: this.translation.FORECAST },
84
+ { key: "rolling", val: "Rolling" },
85
+ ];
86
+ });
87
+ this.ExcelFormulas = {
88
+ DaysBetween: (/**
89
+ * @param {?} date1
90
+ * @param {?} date2
91
+ * @return {?}
92
+ */
93
+ function (date1, date2) {
94
+ /** @type {?} */
95
+ var oneDay = 24 * 60 * 60 * 1000;
96
+ return Math.round(Math.abs((date1.getTime() - date2.getTime()) / oneDay));
97
+ }),
98
+ XNPV: (/**
99
+ * @param {?} rate
100
+ * @param {?} values
101
+ * @return {?}
102
+ */
103
+ function (rate, values) {
104
+ /** @type {?} */
105
+ var xnpv = 0.0;
106
+ /** @type {?} */
107
+ var firstDate = new Date(values[0].date);
108
+ for (var key in values) {
109
+ /** @type {?} */
110
+ var tmp = values[key];
111
+ /** @type {?} */
112
+ var value = tmp.amount;
113
+ /** @type {?} */
114
+ var date = new Date(tmp.date);
115
+ xnpv +=
116
+ value / Math.pow(1 + rate, this.DaysBetween(firstDate, date) / 365);
117
+ }
118
+ return xnpv;
119
+ }),
120
+ XIRR: (/**
121
+ * @param {?} values
122
+ * @param {?} guess
123
+ * @return {?}
124
+ */
125
+ function (values, guess) {
126
+ /** @type {?} */
127
+ var x1 = 0.0;
128
+ /** @type {?} */
129
+ var x2 = guess;
130
+ /** @type {?} */
131
+ var f1 = this.XNPV(x1, values);
132
+ /** @type {?} */
133
+ var f2 = this.XNPV(x2, values);
134
+ for (var i = 0; i < 100; i++) {
135
+ if (f1 * f2 < 0.0)
136
+ break;
137
+ if (Math.abs(f1) < Math.abs(f2)) {
138
+ f1 = this.XNPV((x1 += 1.6 * (x1 - x2)), values);
139
+ }
140
+ else {
141
+ f2 = this.XNPV((x2 += 1.6 * (x2 - x1)), values);
142
+ }
143
+ }
144
+ if (f1 * f2 > 0.0)
145
+ return null;
146
+ /** @type {?} */
147
+ var f = this.XNPV(x1, values);
148
+ if (f < 0.0) {
149
+ /** @type {?} */
150
+ var rtb = x1;
151
+ /** @type {?} */
152
+ var dx = x2 - x1;
153
+ }
154
+ else {
155
+ /** @type {?} */
156
+ var rtb = x2;
157
+ /** @type {?} */
158
+ var dx = x1 - x2;
159
+ }
160
+ for (var i = 0; i < 100; i++) {
161
+ dx *= 0.5;
162
+ /** @type {?} */
163
+ var x_mid = rtb + dx;
164
+ /** @type {?} */
165
+ var f_mid = this.XNPV(x_mid, values);
166
+ if (f_mid <= 0.0)
167
+ rtb = x_mid;
168
+ if (Math.abs(f_mid) < 1.0e-6 || Math.abs(dx) < 1.0e-6)
169
+ return x_mid;
170
+ }
171
+ return null;
172
+ }),
173
+ _DaysBetween: (/**
174
+ * @param {?} date1
175
+ * @param {?} date2
176
+ * @return {?}
177
+ */
178
+ function (date1, date2) {
179
+ //const time1 =new Date(Date.UTC(date1.getUTCFullYear(), date1.getUTCMonth(), date1.getUTCDate(), date1.getUTCHours(), date1.getUTCMinutes(), date1.getUTCSeconds())).getTime();
180
+ //const time2 =new Date(Date.UTC(date2.getUTCFullYear(), date2.getUTCMonth(), date2.getUTCDate(), date2.getUTCHours(), date2.getUTCMinutes(), date2.getUTCSeconds())).getTime();
181
+ /** @type {?} */
182
+ var oneDay = 24 * 60 * 60 * 1000;
183
+ // 一天的毫秒数
184
+ //const time1 = date1.getTime(); // date1的毫秒表示
185
+ //const time2 = date2.getTime(); // date2的毫秒表示
186
+ /** @type {?} */
187
+ var firstDate = new Date(date1);
188
+ /** @type {?} */
189
+ var secondDate = new Date(date2);
190
+ /** @type {?} */
191
+ var diffDays = Math.round(
192
+ // @ts-ignore
193
+ Math.abs((firstDate - secondDate) / oneDay));
194
+ return diffDays;
195
+ }),
196
+ _lcl_sca_XirrResult: (/**
197
+ * @param {?} values
198
+ * @param {?} dates
199
+ * @param {?} fRate
200
+ * @return {?}
201
+ */
202
+ function (values, dates, fRate) {
203
+ /** @type {?} */
204
+ var D_0 = dates[0];
205
+ /** @type {?} */
206
+ var r = fRate + 1.0;
207
+ /** @type {?} */
208
+ var fResult = values[0];
209
+ for (var i = 1, nCount = values.length; i < nCount; ++i) {
210
+ /** @type {?} */
211
+ var temp = Math.pow(r, this._DaysBetween(dates[i], D_0) / 365.0);
212
+ fResult += values[i] / temp;
213
+ }
214
+ return fResult;
215
+ }),
216
+ _lcl_sca_XirrResult_Deriv1: (/**
217
+ * @param {?} values
218
+ * @param {?} dates
219
+ * @param {?} fRate
220
+ * @return {?}
221
+ */
222
+ function (values, dates, fRate) {
223
+ /** @type {?} */
224
+ var D_0 = dates[0];
225
+ /** @type {?} */
226
+ var r = fRate + 1.0;
227
+ /** @type {?} */
228
+ var fResult = 0.0;
229
+ for (var i = 1, nCount = values.length; i < nCount; ++i) {
230
+ /** @type {?} */
231
+ var E_i = this._DaysBetween(dates[i], D_0) / 365.0;
232
+ fResult -= (E_i * values[i]) / Math.pow(r, E_i + 1.0);
233
+ }
234
+ return fResult;
235
+ }),
236
+ _CalculateXirrOpenOffice: (/**
237
+ * @param {?} values
238
+ * @param {?} dates
239
+ * @param {?} guess
240
+ * @return {?}
241
+ */
242
+ function (values, dates, guess) {
243
+ if (values.length < 2 || values.length != dates.length) {
244
+ return null;
245
+ }
246
+ /** @type {?} */
247
+ var fResultRate = guess;
248
+ if (fResultRate <= -1) {
249
+ return null;
250
+ }
251
+ /** @type {?} */
252
+ var fMaxEps = 0.00000001;
253
+ /** @type {?} */
254
+ var nMaxIter = 50;
255
+ /** @type {?} */
256
+ var fNewRate;
257
+ /** @type {?} */
258
+ var fRateEps;
259
+ /** @type {?} */
260
+ var fResultValue;
261
+ /** @type {?} */
262
+ var nIter = 0;
263
+ /** @type {?} */
264
+ var nIterScan = 0;
265
+ /** @type {?} */
266
+ var bContLoop = false;
267
+ /** @type {?} */
268
+ var bResultRateScanEnd = false;
269
+ do {
270
+ if (nIterScan >= 1) {
271
+ fResultRate = -0.99 + (nIterScan - 1) * 0.01;
272
+ }
273
+ do {
274
+ fResultValue = this._lcl_sca_XirrResult(values, dates, fResultRate);
275
+ fNewRate =
276
+ fResultRate -
277
+ fResultValue /
278
+ this._lcl_sca_XirrResult_Deriv1(values, dates, fResultRate);
279
+ fRateEps = Math.abs(fNewRate - fResultRate);
280
+ fResultRate = fNewRate;
281
+ bContLoop = fRateEps > fMaxEps && Math.abs(fResultValue) > fMaxEps;
282
+ } while (bContLoop && ++nIter < nMaxIter);
283
+ nIter = 0;
284
+ if (isNaN(fResultRate) ||
285
+ !isFinite(fResultRate) ||
286
+ isNaN(fResultValue) ||
287
+ !isFinite(fResultValue)) {
288
+ bContLoop = true;
289
+ }
290
+ ++nIterScan;
291
+ bResultRateScanEnd = nIterScan >= 100;
292
+ } while (bContLoop && !bResultRateScanEnd);
293
+ if (bContLoop) {
294
+ return null;
295
+ }
296
+ return fResultRate;
297
+ }),
298
+ _CalculateXirr: (/**
299
+ * @param {?} valueList
300
+ * @param {?} dateList
301
+ * @param {?} navAdjust
302
+ * @param {?} latestDate
303
+ * @return {?}
304
+ */
305
+ function (valueList, dateList, navAdjust, latestDate) {
306
+ /** @type {?} */
307
+ var positiveCashflow = valueList.some((/**
308
+ * @param {?} v
309
+ * @return {?}
310
+ */
311
+ function (v) {
312
+ return v > 0;
313
+ }))
314
+ ? true
315
+ : navAdjust > 0
316
+ ? true
317
+ : false;
318
+ /** @type {?} */
319
+ var negativeCashflow = valueList.some((/**
320
+ * @param {?} v
321
+ * @return {?}
322
+ */
323
+ function (v) {
324
+ return v < 0;
325
+ }))
326
+ ? true
327
+ : navAdjust < 0
328
+ ? true
329
+ : false;
330
+ if (positiveCashflow == false || negativeCashflow == false) {
331
+ return null;
332
+ }
333
+ if (navAdjust != null) {
334
+ valueList.push(navAdjust);
335
+ dateList.push(latestDate);
336
+ }
337
+ /** @type {?} */
338
+ var xirrResult = null;
339
+ try {
340
+ /** @type {?} */
341
+ var excelGuess = valueList.reduce((/**
342
+ * @param {?} sum
343
+ * @param {?} value
344
+ * @return {?}
345
+ */
346
+ function (sum, value) {
347
+ return sum + value;
348
+ }), 0) < 0
349
+ ? -0.1
350
+ : 0.1;
351
+ xirrResult = this._CalculateXirrOpenOffice(valueList, dateList, excelGuess);
352
+ }
353
+ catch (error) {
354
+ return null;
355
+ }
356
+ return xirrResult;
357
+ }),
358
+ };
359
+ }
360
+ /**
361
+ * @private
362
+ * @param {?} res
363
+ * @return {?}
364
+ */
365
+ DashboardPorletsService.prototype.setEntityType = /**
366
+ * @private
367
+ * @param {?} res
368
+ * @return {?}
369
+ */
370
+ function (res) {
371
+ if (res && res.entityList && res.entityList.length) {
372
+ /** @type {?} */
373
+ var entityData = res.entityList[0];
374
+ if (!entityData) {
375
+ return res;
376
+ }
377
+ var _a = entityData.linkedType, linkedType = _a === void 0 ? "" : _a;
378
+ if (!linkedType) {
379
+ return res;
380
+ }
381
+ this.entityType =
382
+ linkedType === "PropertyId"
383
+ ? "Property"
384
+ : linkedType === "portfolioCompId" ||
385
+ linkedType === "assetCompId" ||
386
+ linkedType === "otherCompId"
387
+ ? "Company"
388
+ : linkedType === "portfolioFundId" || linkedType === "assetFundId"
389
+ ? "Fund"
390
+ : "AssetPortfolio";
391
+ res.entityType = this.entityType;
392
+ }
393
+ return res;
394
+ };
395
+ /**
396
+ * @param {?} dashboardId
397
+ * @param {?} roGet
398
+ * @param {?} callback
399
+ * @param {?=} isRefresh
400
+ * @param {?=} callbackForDashboard
401
+ * @return {?}
402
+ */
403
+ DashboardPorletsService.prototype.GetDashboardV1 = /**
404
+ * @param {?} dashboardId
405
+ * @param {?} roGet
406
+ * @param {?} callback
407
+ * @param {?=} isRefresh
408
+ * @param {?=} callbackForDashboard
409
+ * @return {?}
410
+ */
411
+ function (dashboardId, roGet, callback, isRefresh, callbackForDashboard) {
412
+ var _this = this;
413
+ if (isRefresh === void 0) { isRefresh = false; }
414
+ if (!isRefresh) {
415
+ this.portlets = [];
416
+ }
417
+ this.getInfo();
418
+ /** @type {?} */
419
+ var dataObj = { dashboardId: dashboardId, language: this.lang };
420
+ this.http.post(this.api.urlList.GetDashboardV2, dataObj, (/**
421
+ * @param {?} res
422
+ * @return {?}
423
+ */
424
+ function (res) {
425
+ res = _this.pbf.convertKeysToLowerCase(res);
426
+ if (!res) {
427
+ callback(null);
428
+ return;
429
+ }
430
+ res = _this.setEntityType(res);
431
+ // 初始化fromDate
432
+ if (res.fromDate === "1900-01-01T00:00:00Z") {
433
+ res.fromDate = "";
434
+ }
435
+ if (callbackForDashboard) {
436
+ callbackForDashboard(res);
437
+ }
438
+ _this.entityIds =
439
+ res.entityList && res.entityList.length > 0
440
+ ? res.entityList.map((/**
441
+ * @param {?} e
442
+ * @return {?}
443
+ */
444
+ function (e) {
445
+ return e["linkedGuid"];
446
+ }))
447
+ : [];
448
+ if (res.entityList)
449
+ _this.entityList = tslib_1.__spread(res.entityList);
450
+ _this.entityIdObj = {
451
+ id: JSON.stringify(_this.entityIds),
452
+ };
453
+ _this.portletResults_New[res.id] = {};
454
+ _this.portletData_New[res.id] = {};
455
+ _this.DashboardService.dashboardGroupId[res.id] = res.dashboardGroupId;
456
+ _this.DashboardService.dashboardGroupName[res.id] = res.dashboardGroupName;
457
+ _this.DashboardService.RegionDataSetId[res.id] = res.RegionDataSetId;
458
+ _this.DashboardService.dashboardName[res.id] = res.name;
459
+ _this.DashboardService.shareUsers[res.id] = res.sharedUsers;
460
+ _this.dashboardConfig[res.id] = res.config && JSON.parse(res.config);
461
+ if (res) {
462
+ // this.dataMartTables[res.id] = uniqBy(
463
+ // res.dataMartTables,
464
+ // "langCode"
465
+ // );
466
+ _this.dataMartTables[res.id] = tslib_1.__spread(res.dataMartTables);
467
+ _this.sortDataMartTables(_this.dataMartTables[res.id]);
468
+ _this.DashboardService.dashboardDescription = res.description;
469
+ _this.img = res.img;
470
+ // 如果可选开始日期,屏蔽默认的1900-01-01
471
+ _this.currencyCode = res.currencyCode;
472
+ //@ts-ignore
473
+ _this.columnCount = res.columnCount ? res.columnCount : 4;
474
+ if (res.portlets) {
475
+ if (!isRefresh) {
476
+ _this.portlets = JSON.parse(JSON.stringify(res.portlets));
477
+ }
478
+ _this.rowCount =
479
+ res.portlets.length > 0
480
+ ? Math.max.apply(Math, res.portlets.map((/**
481
+ * @param {?} o
482
+ * @return {?}
483
+ */
484
+ function (o) {
485
+ return o.posY;
486
+ }))) + 2
487
+ : 2;
488
+ // new Dashboard
489
+ if (_this.portlets && _this.portlets.length) {
490
+ _this.fieldsArr[res.id] = {};
491
+ _this.portlets.forEach((/**
492
+ * @param {?} el
493
+ * @return {?}
494
+ */
495
+ function (el) {
496
+ if (!Object.keys(_this.fieldsArr[res.id]).includes(el.figureCode)) {
497
+ _this.fieldsArr[res.id][el.figureCode] = JSON.parse(el.config).fields;
498
+ }
499
+ }));
500
+ _this.portlets = _this.portlets.filter((/**
501
+ * @param {?} item
502
+ * @return {?}
503
+ */
504
+ function (item) { return item.figureCode; }));
505
+ _this.getDataByPortletsNew(_this.portlets, (/**
506
+ * @param {?} _res
507
+ * @return {?}
508
+ */
509
+ function (_res) {
510
+ callback(res, _this.portlets);
511
+ }), null, isRefresh, res, roGet);
512
+ }
513
+ else {
514
+ callback(res, _this.portlets);
515
+ }
516
+ }
517
+ else {
518
+ _this.portlets = [];
519
+ _this.columnCount = 4;
520
+ _this.rowCount = 2;
521
+ callback(res, _this.portlets);
522
+ }
523
+ }
524
+ }));
525
+ };
526
+ /**
527
+ * @param {?} portlet
528
+ * @param {?} filterSettings
529
+ * @param {?} dashboard
530
+ * @param {?} callback
531
+ * @return {?}
532
+ */
533
+ DashboardPorletsService.prototype.filterTriggerGetData = /**
534
+ * @param {?} portlet
535
+ * @param {?} filterSettings
536
+ * @param {?} dashboard
537
+ * @param {?} callback
538
+ * @return {?}
539
+ */
540
+ function (portlet, filterSettings, dashboard, callback) {
541
+ var _this = this;
542
+ /** @type {?} */
543
+ var config = portlet.config && JSON.parse(portlet.config);
544
+ /** @type {?} */
545
+ var id = portlet.id === "00000000-0000-0000-0000-000000000000"
546
+ ? portlet.newId
547
+ : portlet.id;
548
+ /** @type {?} */
549
+ var params = this.getParamsByPortlet(portlet, null, null, dashboard);
550
+ /** @type {?} */
551
+ var initFieldsArr;
552
+ /** @type {?} */
553
+ var curFieldsArr;
554
+ if (!params.isTable) {
555
+ // 赋值portletFields_Temp
556
+ initFieldsArr = this.portletFields_Temp[id];
557
+ curFieldsArr = params.displayColumnFilter.split(",");
558
+ if (!initFieldsArr ||
559
+ this.needGetPortletData(initFieldsArr, curFieldsArr)) {
560
+ this.portletFields_Temp[id] = curFieldsArr;
561
+ }
562
+ }
563
+ if (filterSettings && filterSettings.length) {
564
+ if (!params.columnFilter) {
565
+ params.columnFilter = [];
566
+ }
567
+ config.filterSettings = filterSettings;
568
+ filterSettings.forEach((/**
569
+ * @param {?} setting
570
+ * @return {?}
571
+ */
572
+ function (setting) {
573
+ if (config.portletType === "pivot") {
574
+ return;
575
+ }
576
+ /** @type {?} */
577
+ var _field = config.fields.find((/**
578
+ * @param {?} item
579
+ * @return {?}
580
+ */
581
+ function (item) { return item.colName === setting.name; }));
582
+ /** @type {?} */
583
+ var Type = _field && _field.dataType;
584
+ if (setting.items) {
585
+ setting.items.forEach((/**
586
+ * @param {?} item
587
+ * @return {?}
588
+ */
589
+ function (item) {
590
+ params.columnFilter.push({
591
+ Field: setting.name,
592
+ Operator: "equal",
593
+ Type: Type,
594
+ Value: Type === "date"
595
+ ? moment(item).format("yyyy-MM-DD")
596
+ : Type === "datetime"
597
+ ? moment(item).format("yyyy-MM-DD hh:mm:ss")
598
+ : item,
599
+ });
600
+ }));
601
+ }
602
+ else if (setting.operator) {
603
+ params.columnFilter.push({
604
+ Field: setting.field,
605
+ Operator: "equal",
606
+ Type: setting.type,
607
+ Value: setting.type === "date"
608
+ ? moment(setting.value).format("yyyy-MM-DD")
609
+ : setting.type === "datetime"
610
+ ? moment(setting.value).format("yyyy-MM-DD hh:mm:ss")
611
+ : setting.value,
612
+ });
613
+ }
614
+ }));
615
+ }
616
+ else {
617
+ config.filterSettings = [];
618
+ }
619
+ if (params.columnFilter instanceof Array) {
620
+ params.columnFilter = params.columnFilter.filter((/**
621
+ * @param {?} item
622
+ * @return {?}
623
+ */
624
+ function (item) { return item.Field; }));
625
+ }
626
+ // json buffer
627
+ params["dashboardVersion"] = 2;
628
+ // json buffer
629
+ this.httpClient
630
+ .post(this.api.baseurl + this.api.urlList.GetPortletDataOrCreate, params, {
631
+ headers: new HttpHeaders({
632
+ Authorization: "Bearer",
633
+ }),
634
+ })
635
+ .subscribe((/**
636
+ * @param {?} result
637
+ * @return {?}
638
+ */
639
+ function (result) {
640
+ result["data"].forEach((/**
641
+ * @param {?} item
642
+ * @return {?}
643
+ */
644
+ function (item) {
645
+ item.Sector = _this.translation[item.Sector] || item.Sector;
646
+ }));
647
+ _this.portletData_New[dashboard.id][id] = result;
648
+ _this.pbf.triggerDashboardFilterChange.next({
649
+ id: dashboard.id,
650
+ newId: portlet.newId,
651
+ });
652
+ callback({ newId: portlet && portlet.newId, config: config });
653
+ }));
654
+ };
655
+ /**
656
+ * @param {?} str
657
+ * @return {?}
658
+ */
659
+ DashboardPorletsService.prototype.removeParentheses = /**
660
+ * @param {?} str
661
+ * @return {?}
662
+ */
663
+ function (str) {
664
+ return str.split("(").join("").split(")").join("").split('"').join("");
665
+ };
666
+ /**
667
+ * @return {?}
668
+ */
669
+ DashboardPorletsService.prototype.getInfo = /**
670
+ * @return {?}
671
+ */
672
+ function () {
673
+ this.translation = JSON.parse(localStorage.getItem("translation"));
674
+ this.userInfo = JSON.parse(localStorage.getItem("userInfo"));
675
+ this.lang = this.pbf.getLanguageParams();
676
+ this.translation.DASHBOARD_ROLLING = this.translation.DASHBOARD_ROLLING
677
+ ? this.translation.DASHBOARD_ROLLING
678
+ : "DASHBOARD_ROLLING";
679
+ };
680
+ /* Financial Analysis I get select Dropdown */
681
+ /* Financial Analysis I get select Dropdown */
682
+ /**
683
+ * @return {?}
684
+ */
685
+ DashboardPorletsService.prototype.GetChartTypes = /* Financial Analysis I get select Dropdown */
686
+ /**
687
+ * @return {?}
688
+ */
689
+ function () {
690
+ // Chart Type
691
+ return [
692
+ {
693
+ val: "mscombi2d",
694
+ displayVal: this.translation.SINGLEY2D,
695
+ hasSecondaryYAxis: false,
696
+ canSelectStyle: true,
697
+ },
698
+ {
699
+ val: "mscombi3d",
700
+ displayVal: this.translation.SINGLEY3D,
701
+ hasSecondaryYAxis: false,
702
+ canSelectStyle: true,
703
+ },
704
+ {
705
+ val: "mscombidy2d",
706
+ displayVal: this.translation.DUALY2D,
707
+ hasSecondaryYAxis: true,
708
+ canSelectStyle: true,
709
+ },
710
+ {
711
+ val: "msbar2d",
712
+ displayVal: this.translation.BAR2D,
713
+ hasSecondaryYAxis: false,
714
+ canSelectStyle: false,
715
+ },
716
+ {
717
+ val: "msbar3d",
718
+ displayVal: this.translation.BAR3D,
719
+ hasSecondaryYAxis: false,
720
+ canSelectStyle: false,
721
+ },
722
+ {
723
+ val: "stackedcolumn2dline",
724
+ displayVal: this.translation.STACKEDBAR2D,
725
+ hasSecondaryYAxis: false,
726
+ canSelectStyle: true,
727
+ },
728
+ {
729
+ val: "stackedcolumn3dline",
730
+ displayVal: this.translation.STACKEDBAR3D,
731
+ hasSecondaryYAxis: false,
732
+ canSelectStyle: true,
733
+ },
734
+ ];
735
+ };
736
+ /**
737
+ * @return {?}
738
+ */
739
+ DashboardPorletsService.prototype.getCompanyDropdown = /**
740
+ * @return {?}
741
+ */
742
+ function () {
743
+ var _this = this;
744
+ // company
745
+ /** @type {?} */
746
+ var data = {
747
+ accountId: this.userInfo.accountId,
748
+ username: this.userInfo.username,
749
+ language: this.lang,
750
+ companyType: "portfolio",
751
+ };
752
+ this.http.post(this.api.urlList.GetAllCompanyByAccount, data, (/**
753
+ * @param {?} res
754
+ * @return {?}
755
+ */
756
+ function (res) {
757
+ if (res) {
758
+ _this.companyDropdownList = res;
759
+ // return res;
760
+ }
761
+ }));
762
+ };
763
+ /**
764
+ * @return {?}
765
+ */
766
+ DashboardPorletsService.prototype.getCurrencyDropdown = /**
767
+ * @return {?}
768
+ */
769
+ function () {
770
+ var _this = this;
771
+ // Currency
772
+ /** @type {?} */
773
+ var data = {
774
+ accountId: this.userInfo.accountId,
775
+ username: this.userInfo.username,
776
+ language: this.lang,
777
+ alias: "Currency",
778
+ };
779
+ this.http.post(this.api.urlList.GetDropdown, data, (/**
780
+ * @param {?} res
781
+ * @return {?}
782
+ */
783
+ function (res) {
784
+ if (res) {
785
+ _this.currencyDropdownList = res;
786
+ // return res;
787
+ }
788
+ }));
789
+ };
790
+ /**
791
+ * @return {?}
792
+ */
793
+ DashboardPorletsService.prototype.GetTimeMeasure = /**
794
+ * @return {?}
795
+ */
796
+ function () {
797
+ // Time Measure
798
+ return [
799
+ {
800
+ key: "MTD",
801
+ // 月度
802
+ val: this.translation.MONTHLY,
803
+ },
804
+ {
805
+ key: "QTD",
806
+ // 季度
807
+ val: this.translation.QUARTERLY,
808
+ },
809
+ {
810
+ key: "SYTD",
811
+ // 半年度
812
+ val: this.translation.SEMIANNUALLY,
813
+ },
814
+ {
815
+ key: "YTD",
816
+ // 年度
817
+ val: this.translation.ANNUALLY,
818
+ },
819
+ {
820
+ key: "FYTD",
821
+ // 年度(财政年度)
822
+ val: this.translation.ANNUALLYFY,
823
+ },
824
+ {
825
+ key: "LTM",
826
+ // 最近十二个月
827
+ val: this.translation.LAST12MONTH,
828
+ },
829
+ ];
830
+ };
831
+ /**
832
+ * @return {?}
833
+ */
834
+ DashboardPorletsService.prototype.GetPeriods = /**
835
+ * @return {?}
836
+ */
837
+ function () {
838
+ // Previous Period
839
+ return [
840
+ {
841
+ val: 2,
842
+ displayVal: this.translation.LAST2DATA,
843
+ },
844
+ {
845
+ val: 3,
846
+ displayVal: this.translation.LAST3DATA,
847
+ },
848
+ {
849
+ val: 4,
850
+ displayVal: this.translation.LAST4DATA,
851
+ },
852
+ {
853
+ val: 5,
854
+ displayVal: this.translation.LAST5DATA,
855
+ },
856
+ {
857
+ val: 6,
858
+ displayVal: this.translation.LAST6DATA,
859
+ },
860
+ {
861
+ val: 7,
862
+ displayVal: this.translation.LAST7DATA,
863
+ },
864
+ {
865
+ val: 8,
866
+ displayVal: this.translation.LAST8DATA,
867
+ },
868
+ {
869
+ val: 9,
870
+ displayVal: this.translation.LAST9DATA,
871
+ },
872
+ {
873
+ val: 10,
874
+ displayVal: this.translation.LAST10DATA,
875
+ },
876
+ {
877
+ val: 11,
878
+ displayVal: this.translation.LAST11DATA,
879
+ },
880
+ {
881
+ val: 12,
882
+ displayVal: this.translation.LAST12DATA,
883
+ },
884
+ {
885
+ val: 13,
886
+ displayVal: this.translation.LAST13DATA,
887
+ },
888
+ {
889
+ val: 14,
890
+ displayVal: this.translation.LAST14DATA,
891
+ },
892
+ {
893
+ val: 15,
894
+ displayVal: this.translation.LAST15DATA,
895
+ },
896
+ {
897
+ val: 16,
898
+ displayVal: this.translation.LAST16DATA,
899
+ },
900
+ {
901
+ val: 17,
902
+ displayVal: this.translation.LAST17DATA,
903
+ },
904
+ {
905
+ val: 18,
906
+ displayVal: this.translation.LAST18DATA,
907
+ },
908
+ {
909
+ val: 19,
910
+ displayVal: this.translation.LAST19DATA,
911
+ },
912
+ {
913
+ val: 20,
914
+ displayVal: this.translation.LAST20DATA,
915
+ },
916
+ {
917
+ val: 21,
918
+ displayVal: this.translation.LAST21DATA,
919
+ },
920
+ {
921
+ val: 22,
922
+ displayVal: this.translation.LAST22DATA,
923
+ },
924
+ {
925
+ val: 23,
926
+ displayVal: this.translation.LAST23DATA,
927
+ },
928
+ {
929
+ val: 24,
930
+ displayVal: this.translation.LAST24DATA,
931
+ },
932
+ ];
933
+ };
934
+ /**
935
+ * @return {?}
936
+ */
937
+ DashboardPorletsService.prototype.GetFollowingPeriods = /**
938
+ * @return {?}
939
+ */
940
+ function () {
941
+ // Following Period
942
+ return [
943
+ {
944
+ val: 0,
945
+ displayVal: this.translation.NONEXTDATA,
946
+ },
947
+ {
948
+ val: 3,
949
+ displayVal: this.translation.NEXT3DATA,
950
+ },
951
+ {
952
+ val: 4,
953
+ displayVal: this.translation.NEXT4DATA,
954
+ },
955
+ {
956
+ val: 5,
957
+ displayVal: this.translation.NEXT5DATA,
958
+ },
959
+ {
960
+ val: 6,
961
+ displayVal: this.translation.NEXT6DATA,
962
+ },
963
+ {
964
+ val: 7,
965
+ displayVal: this.translation.NEXT7DATA,
966
+ },
967
+ {
968
+ val: 8,
969
+ displayVal: this.translation.NEXT8DATA,
970
+ },
971
+ {
972
+ val: 9,
973
+ displayVal: this.translation.NEXT9DATA,
974
+ },
975
+ {
976
+ val: 10,
977
+ displayVal: this.translation.NEXT10DATA,
978
+ },
979
+ {
980
+ val: 11,
981
+ displayVal: this.translation.NEXT11DATA,
982
+ },
983
+ {
984
+ val: 12,
985
+ displayVal: this.translation.NEXT12DATA,
986
+ },
987
+ ];
988
+ };
989
+ /**
990
+ * @return {?}
991
+ */
992
+ DashboardPorletsService.prototype.GetFinancialFigureCodes = /**
993
+ * @return {?}
994
+ */
995
+ function () {
996
+ // Financial Type
997
+ return [
998
+ {
999
+ key: "accountAssetFigure",
1000
+ val: this.translation.DASHD_ACCOUNTASSETFIGURE,
1001
+ },
1002
+ {
1003
+ key: "accountEquityFigure",
1004
+ val: this.translation.DASHD_ACCOUNTEQUITYFIGURE,
1005
+ },
1006
+ {
1007
+ key: "accountLiabilityFigure",
1008
+ val: this.translation.DASHD_ACCOUNTLIABILITYFIGURE,
1009
+ },
1010
+ {
1011
+ key: "accountPLFigure",
1012
+ val: this.translation.DASHD_ACCOUNTPLFIGURE,
1013
+ },
1014
+ {
1015
+ key: "accountCashflowFigure",
1016
+ val: this.translation.DASHD_ACCOUNTCASHFLOWFIGURE,
1017
+ },
1018
+ {
1019
+ key: "accountOperationKPIFigure",
1020
+ val: this.translation.DASHD_ACCOUNTOPERATIONKPIFIGURE,
1021
+ },
1022
+ {
1023
+ key: "accountRATIOFigure",
1024
+ val: this.translation.DASHD_ACCOUNTRATIOFIGURE,
1025
+ },
1026
+ ];
1027
+ };
1028
+ /**
1029
+ * @param {?} financials
1030
+ * @return {?}
1031
+ */
1032
+ DashboardPorletsService.prototype.GetFinancialSubType = /**
1033
+ * @param {?} financials
1034
+ * @return {?}
1035
+ */
1036
+ function (financials) {
1037
+ /** @type {?} */
1038
+ var financialTypes = [];
1039
+ for (var item in financials) {
1040
+ financialTypes.push({
1041
+ subType: item["subType"],
1042
+ subTypeCode: item["subTypeCode"],
1043
+ });
1044
+ }
1045
+ return financialTypes;
1046
+ };
1047
+ /**
1048
+ * @param {?} id
1049
+ * @param {?} key
1050
+ * @return {?}
1051
+ */
1052
+ DashboardPorletsService.prototype.GetFinancialItems = /**
1053
+ * @param {?} id
1054
+ * @param {?} key
1055
+ * @return {?}
1056
+ */
1057
+ function (id, key) {
1058
+ /** @type {?} */
1059
+ var data = {
1060
+ username: this.userInfo.username,
1061
+ accountId: this.userInfo.accountId,
1062
+ investeeIds: [id],
1063
+ figureCode: key,
1064
+ language: this.lang,
1065
+ };
1066
+ this.http.post(this.api.urlList.GetFinancialItems, data, (/**
1067
+ * @param {?} res
1068
+ * @return {?}
1069
+ */
1070
+ function (res) {
1071
+ if (res) {
1072
+ return res;
1073
+ }
1074
+ }));
1075
+ };
1076
+ /* get toggle */
1077
+ /* get toggle */
1078
+ /**
1079
+ * @return {?}
1080
+ */
1081
+ DashboardPorletsService.prototype.GetTheme = /* get toggle */
1082
+ /**
1083
+ * @return {?}
1084
+ */
1085
+ function () {
1086
+ return [
1087
+ { key: "zune", val: this.translation.CHARTTHEME_ZUNE },
1088
+ { key: "ocean", val: this.translation.CHARTTHEME_OCEAN },
1089
+ { key: "carbon", val: this.translation.CHARTTHEME_CARBON },
1090
+ ];
1091
+ };
1092
+ /**
1093
+ * @return {?}
1094
+ */
1095
+ DashboardPorletsService.prototype.GetFollowingDataType = /**
1096
+ * @return {?}
1097
+ */
1098
+ function () {
1099
+ return [
1100
+ { key: "budget", val: this.translation.BUDGET },
1101
+ { key: "forecast", val: this.translation.FORECAST },
1102
+ // { key: 'rolling', val: this.translation.DASHBOARD_ROLLING },
1103
+ { key: "rolling", val: "Rolling" },
1104
+ ];
1105
+ };
1106
+ /**
1107
+ * @return {?}
1108
+ */
1109
+ DashboardPorletsService.prototype.GetFormat = /**
1110
+ * @return {?}
1111
+ */
1112
+ function () {
1113
+ return [
1114
+ { key: "number", val: this.translation.NUMBER },
1115
+ { key: "percentage", val: this.translation.PERCENTAGE },
1116
+ ];
1117
+ };
1118
+ /**
1119
+ * @return {?}
1120
+ */
1121
+ DashboardPorletsService.prototype.GetChartStyle = /**
1122
+ * @return {?}
1123
+ */
1124
+ function () {
1125
+ return [
1126
+ { key: "bar", val: this.translation.BAR },
1127
+ { key: "line", val: this.translation.LINE },
1128
+ { key: "area", val: this.translation.AREA },
1129
+ ];
1130
+ };
1131
+ /* Fund Operation Summary */
1132
+ /* Fund Operation Summary */
1133
+ /**
1134
+ * @return {?}
1135
+ */
1136
+ DashboardPorletsService.prototype.getFundDropdown = /* Fund Operation Summary */
1137
+ /**
1138
+ * @return {?}
1139
+ */
1140
+ function () {
1141
+ var _this = this;
1142
+ /** @type {?} */
1143
+ var data = {
1144
+ username: this.userInfo.username,
1145
+ accountId: this.userInfo.accountId,
1146
+ investorId: this.userInfo.accountId,
1147
+ language: this.lang,
1148
+ };
1149
+ this.http.post(this.api.urlList.GetFundListByInvestorId, data, (/**
1150
+ * @param {?} res
1151
+ * @return {?}
1152
+ */
1153
+ function (res) {
1154
+ if (res) {
1155
+ _this.fundDropdownList = res;
1156
+ // return res;
1157
+ }
1158
+ }));
1159
+ };
1160
+ /* Fund performance */
1161
+ /* Fund performance */
1162
+ /**
1163
+ * @return {?}
1164
+ */
1165
+ DashboardPorletsService.prototype.GetGrouping = /* Fund performance */
1166
+ /**
1167
+ * @return {?}
1168
+ */
1169
+ function () {
1170
+ return [
1171
+ { key: "null", val: "" },
1172
+ { key: "investor", val: this.translation.DASHD_GP_INVESTOR },
1173
+ { key: "fund", val: this.translation.DASHD_GP_FUND },
1174
+ ];
1175
+ };
1176
+ /* Fund Operation Summary */
1177
+ /* Fund Operation Summary */
1178
+ /**
1179
+ * @param {?} callbake
1180
+ * @return {?}
1181
+ */
1182
+ DashboardPorletsService.prototype.getFundDropdown_ = /* Fund Operation Summary */
1183
+ /**
1184
+ * @param {?} callbake
1185
+ * @return {?}
1186
+ */
1187
+ function (callbake) {
1188
+ var _this = this;
1189
+ /** @type {?} */
1190
+ var data = {
1191
+ username: this.userInfo.username,
1192
+ accountId: this.userInfo.accountId,
1193
+ investorId: this.userInfo.accountId,
1194
+ language: this.lang,
1195
+ };
1196
+ this.http.post(this.api.urlList.GetFundListByInvestorId, data, (/**
1197
+ * @param {?} res
1198
+ * @return {?}
1199
+ */
1200
+ function (res) {
1201
+ if (res) {
1202
+ _this.fundDropdownList = res;
1203
+ // this.GetAllInvestee(res => {
1204
+ callbake();
1205
+ // });
1206
+ }
1207
+ }));
1208
+ };
1209
+ /* Investor position */
1210
+ /* Investor position */
1211
+ /**
1212
+ * @param {?} callbake
1213
+ * @return {?}
1214
+ */
1215
+ DashboardPorletsService.prototype.GetAllInvestee = /* Investor position */
1216
+ /**
1217
+ * @param {?} callbake
1218
+ * @return {?}
1219
+ */
1220
+ function (callbake) {
1221
+ var _this = this;
1222
+ /** @type {?} */
1223
+ var data = {
1224
+ username: this.userInfo.username,
1225
+ accountId: this.userInfo.accountId,
1226
+ language: this.lang,
1227
+ };
1228
+ this.http.post(this.api.urlList.GetAllInvestee, data, (/**
1229
+ * @param {?} res
1230
+ * @return {?}
1231
+ */
1232
+ function (res) {
1233
+ if (res) {
1234
+ _this.allInvesteeList = res;
1235
+ callbake();
1236
+ }
1237
+ }));
1238
+ };
1239
+ /**
1240
+ * @param {?} num
1241
+ * @return {?}
1242
+ */
1243
+ DashboardPorletsService.prototype.pivotTableformatNumber = /**
1244
+ * @param {?} num
1245
+ * @return {?}
1246
+ */
1247
+ function (num) {
1248
+ switch (num) {
1249
+ case 1:
1250
+ case 2:
1251
+ case 3:
1252
+ return "#,###;(#,###)";
1253
+ case 4:
1254
+ case 5:
1255
+ case 6:
1256
+ return "#,###.0;(#,###.0)";
1257
+ case 7:
1258
+ case 8:
1259
+ case 9:
1260
+ return "#,###.00;(#,###.00)";
1261
+ case 10:
1262
+ case 11:
1263
+ case 12:
1264
+ return "#,###,,;(#,###,,)";
1265
+ case 13:
1266
+ case 14:
1267
+ case 15:
1268
+ return "#,###,,.0;(#,###,,.0)";
1269
+ case 16:
1270
+ case 17:
1271
+ case 18:
1272
+ return "#,###,,.00;(#,###,,.00)";
1273
+ default:
1274
+ return "#,###.00;-#,###.00";
1275
+ }
1276
+ };
1277
+ /**
1278
+ * @param {?} num
1279
+ * @return {?}
1280
+ */
1281
+ DashboardPorletsService.prototype.pivotTableformatInteger = /**
1282
+ * @param {?} num
1283
+ * @return {?}
1284
+ */
1285
+ function (num) {
1286
+ switch (num) {
1287
+ case 1:
1288
+ case 3:
1289
+ case 4:
1290
+ return "#,###;(#,###)";
1291
+ case 4:
1292
+ case 5:
1293
+ case 6:
1294
+ return "#,###,,;(#,###,,)";
1295
+ default:
1296
+ return "#,###;(#,###)";
1297
+ }
1298
+ };
1299
+ /**
1300
+ * @param {?} num
1301
+ * @return {?}
1302
+ */
1303
+ DashboardPorletsService.prototype.pivotTableformatPercent = /**
1304
+ * @param {?} num
1305
+ * @return {?}
1306
+ */
1307
+ function (num) {
1308
+ switch (num) {
1309
+ case 1:
1310
+ case 2:
1311
+ case 3:
1312
+ return "P";
1313
+ case 4:
1314
+ case 5:
1315
+ case 6:
1316
+ return "P1";
1317
+ case 7:
1318
+ case 8:
1319
+ case 9:
1320
+ return "P2";
1321
+ case 10:
1322
+ case 11:
1323
+ case 12:
1324
+ return "#,###0.00'x';(#,###0.00'x')";
1325
+ default:
1326
+ return "P2";
1327
+ }
1328
+ };
1329
+ /**
1330
+ * @param {?} num
1331
+ * @return {?}
1332
+ */
1333
+ DashboardPorletsService.prototype.pivotTableformatPercentNum = /**
1334
+ * @param {?} num
1335
+ * @return {?}
1336
+ */
1337
+ function (num) {
1338
+ switch (num) {
1339
+ case 1:
1340
+ return "####'%'";
1341
+ case 2:
1342
+ return "####.0'%'";
1343
+ case 3:
1344
+ return "####.00'%'";
1345
+ default:
1346
+ return "####.00'%'";
1347
+ }
1348
+ };
1349
+ /**
1350
+ * @param {?} num
1351
+ * @return {?}
1352
+ */
1353
+ DashboardPorletsService.prototype.pivotTableformatMultiple = /**
1354
+ * @param {?} num
1355
+ * @return {?}
1356
+ */
1357
+ function (num) {
1358
+ switch (num) {
1359
+ case 1:
1360
+ return "####'x'";
1361
+ case 2:
1362
+ return "###0.0'x'";
1363
+ case 3:
1364
+ return "###0.00'x'";
1365
+ default:
1366
+ return "###0.00'x'";
1367
+ }
1368
+ };
1369
+ /**
1370
+ * @param {?} num
1371
+ * @return {?}
1372
+ */
1373
+ DashboardPorletsService.prototype.formatNumber = /**
1374
+ * @param {?} num
1375
+ * @return {?}
1376
+ */
1377
+ function (num) {
1378
+ switch (num) {
1379
+ case 0:
1380
+ return "N";
1381
+ case 1:
1382
+ return "N1";
1383
+ case 2:
1384
+ return "N2";
1385
+ case 3:
1386
+ return "N3";
1387
+ case 4:
1388
+ return "N4";
1389
+ case 5:
1390
+ return "N5";
1391
+ case 6:
1392
+ return "N6";
1393
+ default:
1394
+ return "N2";
1395
+ }
1396
+ };
1397
+ /**
1398
+ * @param {?} num
1399
+ * @return {?}
1400
+ */
1401
+ DashboardPorletsService.prototype.formatPercent = /**
1402
+ * @param {?} num
1403
+ * @return {?}
1404
+ */
1405
+ function (num) {
1406
+ switch (num) {
1407
+ case 0:
1408
+ return "P";
1409
+ case 1:
1410
+ return "P1";
1411
+ case 2:
1412
+ return "P2";
1413
+ case 3:
1414
+ return "P3";
1415
+ case 4:
1416
+ return "P4";
1417
+ case 5:
1418
+ return "P5";
1419
+ case 6:
1420
+ return "P6";
1421
+ default:
1422
+ return "P2";
1423
+ }
1424
+ };
1425
+ /**
1426
+ * @param {?} num
1427
+ * @return {?}
1428
+ */
1429
+ DashboardPorletsService.prototype.formatPercentNum = /**
1430
+ * @param {?} num
1431
+ * @return {?}
1432
+ */
1433
+ function (num) {
1434
+ switch (num) {
1435
+ case 0:
1436
+ return "####'%'";
1437
+ case 1:
1438
+ return "###0.0'%'";
1439
+ case 2:
1440
+ return "###0.00'%'";
1441
+ default:
1442
+ return "###0.00'%'";
1443
+ }
1444
+ };
1445
+ /**
1446
+ * @param {?} num
1447
+ * @return {?}
1448
+ */
1449
+ DashboardPorletsService.prototype.formatMultiple = /**
1450
+ * @param {?} num
1451
+ * @return {?}
1452
+ */
1453
+ function (num) {
1454
+ switch (num) {
1455
+ case 0:
1456
+ return "####'x'";
1457
+ case 1:
1458
+ return "###0.0'x'";
1459
+ case 2:
1460
+ return "###0.00'x'";
1461
+ default:
1462
+ return "###0.00'x'";
1463
+ }
1464
+ };
1465
+ /**
1466
+ * @return {?}
1467
+ */
1468
+ DashboardPorletsService.prototype.GetFigureFormat = /**
1469
+ * @return {?}
1470
+ */
1471
+ function () {
1472
+ // return [
1473
+ // { key1: "1,234,567", key2: "(1,234,567)", key3: "-", val: 1 }, //
1474
+ // { key1: "1,234,567", key2: "(1,234,567)", key3: "-", val: 2 }, //
1475
+ // { key1: "1,234,567.00", key2: "(1,234,567.00)", key3: "-", val: 3 }, //
1476
+ // { key1: "1,234,567.00", key2: "(1,234,567.00)", key3: "-", val: 4 }, //
1477
+ // { key1: "1", key2: "(1)", key3: "-", val: 5 }, //
1478
+ // { key1: "1", key2: "(1)", key3: "-", val: 6 }, //
1479
+ // { key1: "1.2", key2: "(1.2)", key3: "0.0", val: 7 }, //
1480
+ // { key1: "1.2", key2: "(1.2)", key3: "0.0", val: 8 }, //
1481
+ // { key1: "1.23", key2: "(1.23)", key3: "0.00", val: 9 }, //
1482
+ // { key1: "1.23", key2: "(1.23)", key3: "0.00", val: 10 }, //
1483
+ // ];
1484
+ return [
1485
+ { key: "1,234,567;(1,234,567);0", val: 1 },
1486
+ { key: "1,234,567;(1,234,567);-", val: 2 },
1487
+ { key: "1,234,567;(1,234,567);", val: 3 },
1488
+ { key: "1,234,567.0;(1,234,567.0);0.0", val: 4 },
1489
+ { key: "1,234,567.0;(1,234,567.0);-", val: 5 },
1490
+ { key: "1,234,567.0;(1,234,567.0);", val: 6 },
1491
+ { key: "1,234,567.00;(1,234,567.00);0.00", val: 7 },
1492
+ { key: "1,234,567.00;(1,234,567.00);-", val: 8 },
1493
+ { key: "1,234,567.00;(1,234,567.00);", val: 9 },
1494
+ { key: "1;(1);0", val: 10 },
1495
+ { key: "1;(1);-", val: 11 },
1496
+ { key: "1;(1);", val: 12 },
1497
+ { key: "1.2;(1.2);0.0", val: 13 },
1498
+ { key: "1.2;(1.2);-", val: 14 },
1499
+ { key: "1.2;(1.2);", val: 15 },
1500
+ { key: "1.23;(1.23);0.00", val: 16 },
1501
+ { key: "1.23;(1.23);-", val: 17 },
1502
+ { key: "1.23;(1.23);", val: 18 },
1503
+ ];
1504
+ };
1505
+ // public GetFigureFormat2() {
1506
+ // return [
1507
+ // // 1234567
1508
+ // { key: "1,234,567", val: 11 },
1509
+ // { key: "1,234,567.00", val: 12 },
1510
+ // { key: "1", val: 13 },
1511
+ // { key: "1.2", val: 14 },
1512
+ // { key: "1.23", val: 15 },
1513
+ // ];
1514
+ // };
1515
+ // public GetFigureFormat2() {
1516
+ // return [
1517
+ // // 1234567
1518
+ // { key: "1,234,567", val: 11 },
1519
+ // { key: "1,234,567.00", val: 12 },
1520
+ // { key: "1", val: 13 },
1521
+ // { key: "1.2", val: 14 },
1522
+ // { key: "1.23", val: 15 },
1523
+ // ];
1524
+ // };
1525
+ /**
1526
+ * @return {?}
1527
+ */
1528
+ DashboardPorletsService.prototype.GetFigureFormat3 =
1529
+ // public GetFigureFormat2() {
1530
+ // return [
1531
+ // // 1234567
1532
+ // { key: "1,234,567", val: 11 },
1533
+ // { key: "1,234,567.00", val: 12 },
1534
+ // { key: "1", val: 13 },
1535
+ // { key: "1.2", val: 14 },
1536
+ // { key: "1.23", val: 15 },
1537
+ // ];
1538
+ // };
1539
+ /**
1540
+ * @return {?}
1541
+ */
1542
+ function () {
1543
+ // return [
1544
+ // { key1: "1,234,567", key2: "(1,234,567)", key3: "-", val: 1 }, //
1545
+ // { key1: "1,234,567", key2: "(1,234,567)", key3: "-", val: 2 }, //
1546
+ // { key1: "1", key2: "(1)", key3: "-", val: 3 }, //
1547
+ // { key1: "1", key2: "(1)", key3: "-", val: 4 }, //
1548
+ // { key: "1", val: 5 },
1549
+ // ];
1550
+ return [
1551
+ { key: "1,234,567;(1,234,567);0", val: 1 },
1552
+ { key: "1,234,567;(1,234,567);-", val: 2 },
1553
+ { key: "1,234,567;(1,234,567);", val: 3 },
1554
+ { key: "1;(1);0", val: 4 },
1555
+ { key: "1;(1);-", val: 5 },
1556
+ { key: "1;(1);", val: 6 },
1557
+ ];
1558
+ };
1559
+ /**
1560
+ * @return {?}
1561
+ */
1562
+ DashboardPorletsService.prototype.GetPercentFormats = /**
1563
+ * @return {?}
1564
+ */
1565
+ function () {
1566
+ // return [
1567
+ // { key1: "0%", key2: "0%", key3: "-", val: 1 },
1568
+ // { key1: "0%", key2: "(0%)", key3: "-", val: 2 },
1569
+ // { key1: "0.0%", key2: "0.0%", key3: "-", val: 3 },
1570
+ // { key1: "0.0%", key2: "(0.0%)", key3: "-", val: 4 },
1571
+ // { key1: "0.00%", key2: "0.00%", key3: "-", val: 5 },
1572
+ // { key1: "0.00%", key2: "(0.00%)", key3: "-", val: 6 },
1573
+ // ];
1574
+ return [
1575
+ { key: "1%;(1%);0%", val: 1 },
1576
+ { key: "1%;(1%);-", val: 2 },
1577
+ { key: "1%;(1%);", val: 3 },
1578
+ { key: "1.2%;(1.2%);0.0%", val: 4 },
1579
+ { key: "1.2%;(1.2%);-", val: 5 },
1580
+ { key: "1.2%;(1.2%);", val: 6 },
1581
+ { key: "1.23%;(1.23%);0.00%", val: 7 },
1582
+ { key: "1.23%;(1.23%);-", val: 8 },
1583
+ { key: "1.23%;(1.23%);", val: 9 },
1584
+ { key: "1.23x;(1.23x);0.00x", val: 10 },
1585
+ { key: "1.23x;(1.23x);-", val: 11 },
1586
+ { key: "1.23x;(1.23x);", val: 12 },
1587
+ ];
1588
+ };
1589
+ /**
1590
+ * @return {?}
1591
+ */
1592
+ DashboardPorletsService.prototype.GetMultipleFormats = /**
1593
+ * @return {?}
1594
+ */
1595
+ function () {
1596
+ return [
1597
+ { key: "0x", val: 1 },
1598
+ { key: "0.0x", val: 2 },
1599
+ { key: "0.00x", val: 3 },
1600
+ ];
1601
+ };
1602
+ /**
1603
+ * @param {?} aggregateType
1604
+ * @return {?}
1605
+ */
1606
+ DashboardPorletsService.prototype.getAggregateType = /**
1607
+ * @param {?} aggregateType
1608
+ * @return {?}
1609
+ */
1610
+ function (aggregateType) {
1611
+ switch (aggregateType) {
1612
+ case "CalculateIRR":
1613
+ return "CI";
1614
+ case "CalculateIRRIRRDate":
1615
+ return "CI_IRR";
1616
+ case "CalculateIRRBeforeCarried":
1617
+ return "CI_BEFORE_CARRY";
1618
+ case "CalculateIRRReported":
1619
+ return "CI_REPORTED";
1620
+ case "CalculateIRRActualAudited":
1621
+ return "CI_ACTUAL_AUDITED";
1622
+ case "CalculateIRRMTD":
1623
+ return "CI_MTD";
1624
+ case "CalculateIRRQTD":
1625
+ return "CI_QTD";
1626
+ case "CalculateIRRYTD":
1627
+ return "CI_YTD";
1628
+ case "CalculateTWRMTD":
1629
+ return "CTWR_MTD";
1630
+ case "CalculateTWRQTD":
1631
+ return "CTWR_QTD";
1632
+ case "CalculateTWRYTD":
1633
+ return "CTWR_YTD";
1634
+ case "CalculateVARMTD_99":
1635
+ return "CVAR_MTD_99";
1636
+ case "CalculateVARQTD_99":
1637
+ return "CVAR_QTD_99";
1638
+ case "CalculateVARYTD_99":
1639
+ return "CVAR_YTD_99";
1640
+ case "CalculateVARMTD_95":
1641
+ return "CVAR_MTD_95";
1642
+ case "CalculateVARQTD_95":
1643
+ return "CVAR_QTD_95";
1644
+ case "CalculateVARYTD_95":
1645
+ return "CVAR_YTD_95";
1646
+ case "CalculateMultiple":
1647
+ return "CM";
1648
+ case "CalculatePIC":
1649
+ return "CP";
1650
+ case "CalculateDPI":
1651
+ return "CD";
1652
+ case "CalculateTVPI":
1653
+ return "CT";
1654
+ case "CalculateRVPI":
1655
+ return "CR";
1656
+ case "CalculateMActualAudited":
1657
+ return "CM_ACTUAL_AUDITED";
1658
+ case "CalculateMReported":
1659
+ return "CM_REPORTED";
1660
+ }
1661
+ };
1662
+ /**
1663
+ * @param {?} colName
1664
+ * @return {?}
1665
+ */
1666
+ DashboardPorletsService.prototype.getCalculateMethod = /**
1667
+ * @param {?} colName
1668
+ * @return {?}
1669
+ */
1670
+ function (colName) {
1671
+ switch (colName) {
1672
+ case "CI":
1673
+ return "CalculateIRR";
1674
+ case "CI_IRR":
1675
+ return "CalculateIRRIRRDate";
1676
+ case "CI_BEFORE_CARRY":
1677
+ return "CalculateIRRBeforeCarried";
1678
+ case "CI_REPORTED":
1679
+ return "CalculateIRRReported";
1680
+ case "CI_ACTUAL_AUDITED":
1681
+ return "CalculateIRRActualAudited";
1682
+ case "CI_MTD":
1683
+ return "CalculateIRRMTD";
1684
+ case "CI_QTD":
1685
+ return "CalculateIRRQTD";
1686
+ case "CI_YTD":
1687
+ return "CalculateIRRYTD";
1688
+ case "CTWR_MTD":
1689
+ return "CalculateTWRMTD";
1690
+ case "CTWR_QTD":
1691
+ return "CalculateTWRQTD";
1692
+ case "CTWR_YTD":
1693
+ return "CalculateTWRYTD";
1694
+ case "CVAR_MTD_99":
1695
+ return "CalculateVARMTD_99";
1696
+ case "CVAR_QTD_99":
1697
+ return "CalculateVARQTD_99";
1698
+ case "CVAR_YTD_99":
1699
+ return "CalculateVARYTD_99";
1700
+ case "CVAR_MTD_95":
1701
+ return "CalculateVARMTD_95";
1702
+ case "CVAR_QTD_95":
1703
+ return "CalculateVARQTD_95";
1704
+ case "CVAR_YTD_95":
1705
+ return "CalculateVARYTD_95";
1706
+ case "CM":
1707
+ return "CalculateMultiple";
1708
+ case "CP":
1709
+ return "CalculatePIC";
1710
+ case "CD":
1711
+ return "CalculateDPI";
1712
+ case "CT":
1713
+ return "CalculateTVPI";
1714
+ case "CR":
1715
+ return "CalculateRVPI";
1716
+ case "CM_ACTUAL_AUDITED":
1717
+ return "CalculateMActualAudited";
1718
+ case "CM_REPORTED":
1719
+ return "CalculateMReported";
1720
+ }
1721
+ };
1722
+ // 格式化数字
1723
+ // 格式化数字
1724
+ /**
1725
+ * @param {?} number
1726
+ * @param {?} decimals
1727
+ * @param {?} dec_point
1728
+ * @param {?} thousands_sep
1729
+ * @param {?} roundtag
1730
+ * @return {?}
1731
+ */
1732
+ DashboardPorletsService.prototype.number_format =
1733
+ // 格式化数字
1734
+ /**
1735
+ * @param {?} number
1736
+ * @param {?} decimals
1737
+ * @param {?} dec_point
1738
+ * @param {?} thousands_sep
1739
+ * @param {?} roundtag
1740
+ * @return {?}
1741
+ */
1742
+ function (number, decimals, dec_point, thousands_sep, roundtag) {
1743
+ /*
1744
+ * 参数说明:
1745
+ * number:要格式化的数字
1746
+ * decimals:保留几位小数
1747
+ * dec_point:小数点符号
1748
+ * thousands_sep:千分位符号
1749
+ * roundtag:舍入参数,默认 "ceil" 向上取,"floor"向下取,"round" 四舍五入
1750
+ * */
1751
+ number = (number + "").replace(/[^0-9+-Ee.]/g, "");
1752
+ roundtag = roundtag || "ceil"; //"ceil","floor","round"
1753
+ //"ceil","floor","round"
1754
+ /** @type {?} */
1755
+ var n = !isFinite(+number) ? 0 : +number;
1756
+ /** @type {?} */
1757
+ var prec = !isFinite(+decimals) ? 0 : Math.abs(decimals);
1758
+ /** @type {?} */
1759
+ var sep = typeof thousands_sep === "undefined" ? "," : thousands_sep;
1760
+ /** @type {?} */
1761
+ var dec = typeof dec_point === "undefined" ? "." : dec_point;
1762
+ // let s = '';
1763
+ /** @type {?} */
1764
+ var s = (prec
1765
+ ? this.toFixedFix(n, prec, roundtag)
1766
+ : "" + this.pbf.tofixedNum(n, decimals)).split(".");
1767
+ //this.pbf.tofixedNum(Math.abs(value), decimal)
1768
+ /** @type {?} */
1769
+ var re = /(-?\d+)(\d{3})/;
1770
+ while (re.test(s[0])) {
1771
+ s[0] = s[0].replace(re, "$1" + sep + "$2");
1772
+ }
1773
+ if ((s[1] || "").length < prec) {
1774
+ s[1] = s[1] || "";
1775
+ s[1] += new Array(prec - s[1].length + 1).join("0");
1776
+ }
1777
+ return s.join(dec);
1778
+ };
1779
+ /**
1780
+ * @private
1781
+ * @param {?} n
1782
+ * @param {?} prec
1783
+ * @param {?} roundtag
1784
+ * @return {?}
1785
+ */
1786
+ DashboardPorletsService.prototype.toFixedFix = /**
1787
+ * @private
1788
+ * @param {?} n
1789
+ * @param {?} prec
1790
+ * @param {?} roundtag
1791
+ * @return {?}
1792
+ */
1793
+ function (n, prec, roundtag) {
1794
+ /** @type {?} */
1795
+ var k = Math.pow(10, prec);
1796
+ return ("" +
1797
+ parseFloat(Math[roundtag](parseFloat((n * k).toFixed(prec * 2))).toFixed(prec * 2)) /
1798
+ k);
1799
+ };
1800
+ /**
1801
+ * @param {?} portlet
1802
+ * @param {?=} isGetTotal
1803
+ * @param {?=} copyId
1804
+ * @param {?=} id
1805
+ * @return {?}
1806
+ */
1807
+ DashboardPorletsService.prototype.getResultByDataTable = /**
1808
+ * @param {?} portlet
1809
+ * @param {?=} isGetTotal
1810
+ * @param {?=} copyId
1811
+ * @param {?=} id
1812
+ * @return {?}
1813
+ */
1814
+ function (portlet, isGetTotal, copyId, id) {
1815
+ if (isGetTotal === void 0) { isGetTotal = false; }
1816
+ if (copyId === void 0) { copyId = false; }
1817
+ /** @type {?} */
1818
+ var result = [];
1819
+ /** @type {?} */
1820
+ var datamartCode = portlet.figureCode;
1821
+ /** @type {?} */
1822
+ var identifier = portlet.id === "00000000-0000-0000-0000-000000000000"
1823
+ ? portlet.newId
1824
+ : portlet.id;
1825
+ if (portlet.copyId) {
1826
+ identifier = portlet.copyId;
1827
+ }
1828
+ if (this.portletData_New[id][identifier]) {
1829
+ result = isGetTotal
1830
+ ? this.portletData_New[id][identifier] &&
1831
+ this.portletData_New[id][identifier].total
1832
+ : this.portletData_New[id][identifier] &&
1833
+ this.portletData_New[id][identifier].data;
1834
+ }
1835
+ else {
1836
+ result = isGetTotal
1837
+ ? this.portletResults_New[id][datamartCode] &&
1838
+ this.portletResults_New[id][datamartCode].total
1839
+ : this.portletResults_New[id][datamartCode] &&
1840
+ this.portletResults_New[id][datamartCode].data;
1841
+ }
1842
+ return result;
1843
+ };
1844
+ // SMP2-3708 END
1845
+ // SMP2-3708 END
1846
+ /**
1847
+ * @param {?} datamartCode
1848
+ * @param {?} dashboard
1849
+ * @return {?}
1850
+ */
1851
+ DashboardPorletsService.prototype.getOrderByColumnsNew =
1852
+ // SMP2-3708 END
1853
+ /**
1854
+ * @param {?} datamartCode
1855
+ * @param {?} dashboard
1856
+ * @return {?}
1857
+ */
1858
+ function (datamartCode, dashboard) {
1859
+ var _this = this;
1860
+ return new Promise((/**
1861
+ * @param {?} resolve
1862
+ * @return {?}
1863
+ */
1864
+ function (resolve) {
1865
+ if (_this.sourcesData[dashboard.id] && dashboard) {
1866
+ /** @type {?} */
1867
+ var outputRes_1 = [];
1868
+ if (_this.sourcesData[dashboard.id].length) {
1869
+ /** @type {?} */
1870
+ var config = JSON.parse(dashboard.config);
1871
+ /** @type {?} */
1872
+ var dataViews_1 = config.views;
1873
+ if (dashboard && dashboard.config) {
1874
+ /** @type {?} */
1875
+ var dataMart = _this.sourcesData[dashboard.id].filter((/**
1876
+ * @param {?} item
1877
+ * @return {?}
1878
+ */
1879
+ function (item) { return item.entityType === dashboard.entityType; }));
1880
+ dataMart.forEach((/**
1881
+ * @param {?} _data
1882
+ * @return {?}
1883
+ */
1884
+ function (_data) {
1885
+ _data.views.forEach((/**
1886
+ * @param {?} view
1887
+ * @return {?}
1888
+ */
1889
+ function (view) {
1890
+ if (dataViews_1.find((/**
1891
+ * @param {?} item
1892
+ * @return {?}
1893
+ */
1894
+ function (item) { return item.datamartViewId === view.id; }))) {
1895
+ view.tables.forEach((/**
1896
+ * @param {?} table
1897
+ * @return {?}
1898
+ */
1899
+ function (table) {
1900
+ outputRes_1.push(table);
1901
+ }));
1902
+ }
1903
+ }));
1904
+ }));
1905
+ }
1906
+ }
1907
+ resolve(outputRes_1);
1908
+ }
1909
+ else {
1910
+ // 处理 this.sourcesData 没有值
1911
+ /** @type {?} */
1912
+ var data = {
1913
+ accountId: _this.userInfo.accountId,
1914
+ language: _this.lang,
1915
+ dashboardVersion: 2,
1916
+ };
1917
+ _this.http.post(_this.api.urlList.GetSources, data, (/**
1918
+ * @param {?} res
1919
+ * @return {?}
1920
+ */
1921
+ function (res) {
1922
+ /** @type {?} */
1923
+ var outputRes = [];
1924
+ if (res && res.length) {
1925
+ _this.sourcesData[dashboard.id] = res;
1926
+ /** @type {?} */
1927
+ var config = JSON.parse(dashboard.config);
1928
+ /** @type {?} */
1929
+ var dataViews_2 = config.views;
1930
+ if (dashboard && dashboard.config) {
1931
+ /** @type {?} */
1932
+ var dataMart = res.filter((/**
1933
+ * @param {?} item
1934
+ * @return {?}
1935
+ */
1936
+ function (item) { return item.entityType === dashboard.entityType; }));
1937
+ dataMart.forEach((/**
1938
+ * @param {?} _data
1939
+ * @return {?}
1940
+ */
1941
+ function (_data) {
1942
+ _data.views.forEach((/**
1943
+ * @param {?} view
1944
+ * @return {?}
1945
+ */
1946
+ function (view) {
1947
+ if (dataViews_2.find((/**
1948
+ * @param {?} item
1949
+ * @return {?}
1950
+ */
1951
+ function (item) { return item.datamartViewId === view.id; }))) {
1952
+ view.tables.forEach((/**
1953
+ * @param {?} table
1954
+ * @return {?}
1955
+ */
1956
+ function (table) {
1957
+ outputRes.push(table);
1958
+ }));
1959
+ }
1960
+ }));
1961
+ }));
1962
+ }
1963
+ }
1964
+ resolve(outputRes);
1965
+ }));
1966
+ }
1967
+ }));
1968
+ };
1969
+ /**
1970
+ * @param {?} input
1971
+ * @return {?}
1972
+ */
1973
+ DashboardPorletsService.prototype.decompressArrayBuffer = /**
1974
+ * @param {?} input
1975
+ * @return {?}
1976
+ */
1977
+ function (input) {
1978
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
1979
+ var ds, writer, output, reader, totalSize, _a, value, done, concatenated, offset, output_1, output_1_1, array;
1980
+ var e_1, _b;
1981
+ return tslib_1.__generator(this, function (_c) {
1982
+ switch (_c.label) {
1983
+ case 0:
1984
+ //create the stream
1985
+ ds = new ((/** @type {?} */ (window))).DecompressionStream("deflate-raw");
1986
+ //create the writer
1987
+ writer = ds.writable.getWriter();
1988
+ //write the buffer to the writer thus decompressing it
1989
+ writer.write(input);
1990
+ writer.close();
1991
+ //create the output
1992
+ output = [];
1993
+ //create the reader
1994
+ reader = ds.readable.getReader();
1995
+ totalSize = 0;
1996
+ _c.label = 1;
1997
+ case 1:
1998
+ if (!true) return [3 /*break*/, 3];
1999
+ return [4 /*yield*/, reader.read()];
2000
+ case 2:
2001
+ _a = _c.sent(), value = _a.value, done = _a.done;
2002
+ if (done)
2003
+ return [3 /*break*/, 3];
2004
+ output.push(value);
2005
+ totalSize += value.byteLength;
2006
+ return [3 /*break*/, 1];
2007
+ case 3:
2008
+ concatenated = new Uint8Array(totalSize);
2009
+ offset = 0;
2010
+ try {
2011
+ //finally build the compressed array and return it
2012
+ for (output_1 = tslib_1.__values(output), output_1_1 = output_1.next(); !output_1_1.done; output_1_1 = output_1.next()) {
2013
+ array = output_1_1.value;
2014
+ concatenated.set(array, offset);
2015
+ offset += array.byteLength;
2016
+ }
2017
+ }
2018
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
2019
+ finally {
2020
+ try {
2021
+ if (output_1_1 && !output_1_1.done && (_b = output_1.return)) _b.call(output_1);
2022
+ }
2023
+ finally { if (e_1) throw e_1.error; }
2024
+ }
2025
+ return [2 /*return*/, concatenated];
2026
+ }
2027
+ });
2028
+ });
2029
+ };
2030
+ /**
2031
+ * @private
2032
+ * @param {?} item
2033
+ * @param {?} dashboard
2034
+ * @return {?}
2035
+ */
2036
+ DashboardPorletsService.prototype.getAllFields = /**
2037
+ * @private
2038
+ * @param {?} item
2039
+ * @param {?} dashboard
2040
+ * @return {?}
2041
+ */
2042
+ function (item, dashboard) {
2043
+ var _this = this;
2044
+ /** @type {?} */
2045
+ var lang = this.pbf.getLanguageParams();
2046
+ return new Promise((/**
2047
+ * @param {?} resolve
2048
+ * @param {?} reject
2049
+ * @return {?}
2050
+ */
2051
+ function (resolve, reject) {
2052
+ /** @type {?} */
2053
+ var dataMartCode = item.figureCode;
2054
+ /** @type {?} */
2055
+ var dataObj = {
2056
+ language: lang,
2057
+ dataMartCode: dataMartCode,
2058
+ };
2059
+ _this.setSchemaParams(dataObj, dataMartCode, dashboard);
2060
+ _this.http.post(_this.api.urlList.GetSchema, dataObj, (/**
2061
+ * @param {?} res
2062
+ * @return {?}
2063
+ */
2064
+ function (res) {
2065
+ resolve(res);
2066
+ }));
2067
+ }));
2068
+ };
2069
+ /**
2070
+ * @param {?} dataObj
2071
+ * @param {?} figureCode
2072
+ * @param {?} dashboard
2073
+ * @return {?}
2074
+ */
2075
+ DashboardPorletsService.prototype.setSchemaParams = /**
2076
+ * @param {?} dataObj
2077
+ * @param {?} figureCode
2078
+ * @param {?} dashboard
2079
+ * @return {?}
2080
+ */
2081
+ function (dataObj, figureCode, dashboard) {
2082
+ if (this.checkIsQ2Q(dashboard.dataMartTables)) {
2083
+ dataObj["fromDate"] = dashboard.fromDate;
2084
+ dataObj["asOfDate"] = dashboard.asOfDate;
2085
+ }
2086
+ else if (figureCode.indexOf("FinancialFigure") !== -1) {
2087
+ dataObj["entityType"] = dashboard.entityList.map((/**
2088
+ * @param {?} item
2089
+ * @return {?}
2090
+ */
2091
+ function (item) { return item.linkedType; }));
2092
+ dataObj["fromDate"] = dashboard.fromDate || "";
2093
+ dataObj["asOfDate"] = dashboard.asOfDate;
2094
+ }
2095
+ if (dashboard &&
2096
+ (figureCode === "FundOperations" ||
2097
+ figureCode === "FundOperationTableSequoia" ||
2098
+ figureCode.indexOf("FinancialFigure") !== -1)) {
2099
+ dataObj["entityIds"] = dashboard.entityList.map((/**
2100
+ * @param {?} item
2101
+ * @return {?}
2102
+ */
2103
+ function (item) { return item.linkedGuid; }));
2104
+ }
2105
+ };
2106
+ // 判断是否可选开始日期
2107
+ // 判断是否可选开始日期
2108
+ /**
2109
+ * @param {?} dataMart
2110
+ * @return {?}
2111
+ */
2112
+ DashboardPorletsService.prototype.checkHasFromDate =
2113
+ // 判断是否可选开始日期
2114
+ /**
2115
+ * @param {?} dataMart
2116
+ * @return {?}
2117
+ */
2118
+ function (dataMart) {
2119
+ /** @type {?} */
2120
+ var has = dataMart.find((/**
2121
+ * @param {?} item
2122
+ * @return {?}
2123
+ */
2124
+ function (item) {
2125
+ return !item.isHide && item.datamartCode === "FundOperationTableSequoia";
2126
+ }));
2127
+ return !!has;
2128
+ };
2129
+ // 判断Q2Q,控制顶部日期选择类型
2130
+ // 判断Q2Q,控制顶部日期选择类型
2131
+ /**
2132
+ * @param {?} dataMart
2133
+ * @return {?}
2134
+ */
2135
+ DashboardPorletsService.prototype.checkIsQ2Q =
2136
+ // 判断Q2Q,控制顶部日期选择类型
2137
+ /**
2138
+ * @param {?} dataMart
2139
+ * @return {?}
2140
+ */
2141
+ function (dataMart) {
2142
+ return false;
2143
+ /** @type {?} */
2144
+ var Q2QPatchList = [
2145
+ "SeeThroughHisPosition",
2146
+ "SeeThroughHisPositionByInvestor",
2147
+ ];
2148
+ /** @type {?} */
2149
+ var has = dataMart.find((/**
2150
+ * @param {?} it
2151
+ * @return {?}
2152
+ */
2153
+ function (it) {
2154
+ return !it.isHide && Q2QPatchList.includes(it.datamartCode);
2155
+ }));
2156
+ return !!has;
2157
+ };
2158
+ /**
2159
+ * 使用自定义保存的列数据,覆盖通用列配置数据
2160
+ * @param allFields 自定义数据
2161
+ * @param fields 通用列配置数据
2162
+ * @returns
2163
+ */
2164
+ /**
2165
+ * 使用自定义保存的列数据,覆盖通用列配置数据
2166
+ * @param {?} allFields 自定义数据
2167
+ * @param {?} fields 通用列配置数据
2168
+ * @return {?}
2169
+ */
2170
+ DashboardPorletsService.prototype.setConfigFields = /**
2171
+ * 使用自定义保存的列数据,覆盖通用列配置数据
2172
+ * @param {?} allFields 自定义数据
2173
+ * @param {?} fields 通用列配置数据
2174
+ * @return {?}
2175
+ */
2176
+ function (allFields, fields) {
2177
+ allFields.forEach((/**
2178
+ * @param {?} _field
2179
+ * @return {?}
2180
+ */
2181
+ function (_field) {
2182
+ fields.forEach((/**
2183
+ * @param {?} field
2184
+ * @return {?}
2185
+ */
2186
+ function (field) {
2187
+ if (_field.colName === field.colName) {
2188
+ _field.isHidden = field.isHidden;
2189
+ _field.visible = field.visible;
2190
+ _field.format = field.format;
2191
+ _field.formula = field.formula;
2192
+ if (field.showGrandTotals !== undefined) {
2193
+ _field.showGrandTotals = field.showGrandTotals;
2194
+ }
2195
+ if (field.showSubTotals !== undefined) {
2196
+ _field.showSubTotals = field.showSubTotals;
2197
+ }
2198
+ }
2199
+ }));
2200
+ }));
2201
+ fields.forEach((/**
2202
+ * @param {?} field
2203
+ * @return {?}
2204
+ */
2205
+ function (field) {
2206
+ if (field.isCalculatedField) {
2207
+ allFields.push(field);
2208
+ }
2209
+ }));
2210
+ /** @type {?} */
2211
+ var fieldsName = [];
2212
+ /** @type {?} */
2213
+ var outputFields = [];
2214
+ allFields.forEach((/**
2215
+ * @param {?} field
2216
+ * @return {?}
2217
+ */
2218
+ function (field) {
2219
+ // q2q当中langCode很多相同,去重要多判断一下addtionName
2220
+ // if (!fieldsName.includes(field.langCode) || !!field.addtionName) {
2221
+ if (!fieldsName.includes(field.langCode) &&
2222
+ !fieldsName.includes(field.langValue)) {
2223
+ /** @type {?} */
2224
+ var value = field.langCode || field.langValue;
2225
+ fieldsName.push(value);
2226
+ outputFields.push(field);
2227
+ }
2228
+ }));
2229
+ return outputFields.sort((/**
2230
+ * @param {?} a
2231
+ * @param {?} b
2232
+ * @return {?}
2233
+ */
2234
+ function (a, b) { return (a.seq >= b.seq ? 1 : -1); }));
2235
+ };
2236
+ /**
2237
+ * @param {?} portlets
2238
+ * @param {?} callback
2239
+ * @param {?=} pageSetting
2240
+ * @param {?=} isRefresh
2241
+ * @param {?=} dashboard
2242
+ * @param {?=} roGet
2243
+ * @return {?}
2244
+ */
2245
+ DashboardPorletsService.prototype.getDataByPortletsNew = /**
2246
+ * @param {?} portlets
2247
+ * @param {?} callback
2248
+ * @param {?=} pageSetting
2249
+ * @param {?=} isRefresh
2250
+ * @param {?=} dashboard
2251
+ * @param {?=} roGet
2252
+ * @return {?}
2253
+ */
2254
+ function (portlets, callback, pageSetting, isRefresh, dashboard, roGet) {
2255
+ if (isRefresh === void 0) { isRefresh = false; }
2256
+ if (roGet === void 0) { roGet = false; }
2257
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
2258
+ var length, _loop_1, this_1, portlets_1, portlets_1_1, portlet, e_2_1;
2259
+ var e_2, _a;
2260
+ var _this = this;
2261
+ return tslib_1.__generator(this, function (_b) {
2262
+ switch (_b.label) {
2263
+ case 0:
2264
+ length = 0;
2265
+ if (!(portlets && portlets.length)) return [3 /*break*/, 9];
2266
+ _loop_1 = function (portlet) {
2267
+ var id, allFields, params, initFieldsArr, curFieldsArr, config;
2268
+ return tslib_1.__generator(this, function (_a) {
2269
+ switch (_a.label) {
2270
+ case 0:
2271
+ id = portlet.id === "00000000-0000-0000-0000-000000000000"
2272
+ ? portlet.newId
2273
+ : portlet.id;
2274
+ return [4 /*yield*/, this_1.getAllFields(portlet, dashboard)];
2275
+ case 1:
2276
+ allFields = _a.sent();
2277
+ params = this_1.getParamsByPortlet(portlet, pageSetting, allFields, dashboard);
2278
+ curFieldsArr = void 0;
2279
+ if (!params.isTable && !roGet) {
2280
+ // 赋值portletFields_Temp
2281
+ initFieldsArr = this_1.portletFields_Temp[id];
2282
+ curFieldsArr = params.displayColumnFilter.split(",");
2283
+ if (!initFieldsArr ||
2284
+ this_1.needGetPortletData(initFieldsArr, curFieldsArr)) {
2285
+ this_1.portletFields_Temp[id] = curFieldsArr;
2286
+ }
2287
+ else {
2288
+ length++;
2289
+ if (portlets.length === length) {
2290
+ callback();
2291
+ }
2292
+ return [2 /*return*/, "continue"];
2293
+ }
2294
+ }
2295
+ config = portlet.config && JSON.parse(portlet.config);
2296
+ if (config.filterSettings && config.filterSettings.length) {
2297
+ if (!params.columnFilter) {
2298
+ params.columnFilter = [];
2299
+ }
2300
+ config.filterSettings.forEach((/**
2301
+ * @param {?} setting
2302
+ * @return {?}
2303
+ */
2304
+ function (setting) {
2305
+ if (config.portletType === "pivot") {
2306
+ return;
2307
+ }
2308
+ /** @type {?} */
2309
+ var _field = config.fields.find((/**
2310
+ * @param {?} item
2311
+ * @return {?}
2312
+ */
2313
+ function (item) { return item.colName === setting.name; }));
2314
+ /** @type {?} */
2315
+ var Type = _field && _field.dataType;
2316
+ if (setting.items) {
2317
+ setting.items.forEach((/**
2318
+ * @param {?} item
2319
+ * @return {?}
2320
+ */
2321
+ function (item) {
2322
+ params.columnFilter.push({
2323
+ Field: setting.name,
2324
+ Operator: "equal",
2325
+ Type: Type,
2326
+ Value: Type === "date"
2327
+ ? moment(item).format("yyyy-MM-DD")
2328
+ : Type === "datetime"
2329
+ ? moment(item).format("yyyy-MM-DD hh:mm:ss")
2330
+ : item,
2331
+ });
2332
+ }));
2333
+ }
2334
+ else if (setting.operator) {
2335
+ params.columnFilter.push({
2336
+ Field: setting.field,
2337
+ Operator: "equal",
2338
+ Type: setting.type,
2339
+ Value: setting.type === "date"
2340
+ ? moment(setting.value).format("yyyy-MM-DD")
2341
+ : setting.type === "datetime"
2342
+ ? moment(setting.value).format("yyyy-MM-DD hh:mm:ss")
2343
+ : setting.value,
2344
+ });
2345
+ }
2346
+ }));
2347
+ }
2348
+ if (params.columnFilter instanceof Array) {
2349
+ params.columnFilter = params.columnFilter.filter((/**
2350
+ * @param {?} item
2351
+ * @return {?}
2352
+ */
2353
+ function (item) { return item.Field; }));
2354
+ }
2355
+ // json buffer
2356
+ params["dashboardVersion"] = 2;
2357
+ this_1.httpClient
2358
+ .post(this_1.api.baseurl + this_1.api.urlList.GetPortletDataOrCreate, params, {
2359
+ headers: new HttpHeaders({
2360
+ Authorization: "Bearer",
2361
+ }),
2362
+ })
2363
+ .subscribe((/**
2364
+ * @param {?} result
2365
+ * @return {?}
2366
+ */
2367
+ function (result) {
2368
+ if (!result) {
2369
+ _this.portletData_New[dashboard.id][id] = {
2370
+ total: 0,
2371
+ data: [],
2372
+ };
2373
+ if (isRefresh) {
2374
+ _this.DashboardService.refreshGadget.next({
2375
+ newId: id,
2376
+ });
2377
+ }
2378
+ length++;
2379
+ if (isRefresh) {
2380
+ _this.DashboardService.refreshGadget.next({
2381
+ newId: id,
2382
+ });
2383
+ }
2384
+ if (portlets.length === length) {
2385
+ if (isRefresh) {
2386
+ _this.DashboardService.startRefresh.next(false);
2387
+ }
2388
+ callback();
2389
+ }
2390
+ }
2391
+ else {
2392
+ result["data"].forEach((/**
2393
+ * @param {?} item
2394
+ * @return {?}
2395
+ */
2396
+ function (item) {
2397
+ item.Sector = _this.translation[item.Sector] || item.Sector;
2398
+ }));
2399
+ _this.portletData_New[dashboard.id][id] = result;
2400
+ if (isRefresh) {
2401
+ _this.DashboardService.refreshGadget.next({
2402
+ newId: id,
2403
+ });
2404
+ }
2405
+ length++;
2406
+ if (portlets.length === length) {
2407
+ if (isRefresh) {
2408
+ _this.DashboardService.startRefresh.next(false);
2409
+ }
2410
+ callback();
2411
+ }
2412
+ }
2413
+ }), (/**
2414
+ * @param {?} response
2415
+ * @return {?}
2416
+ */
2417
+ function (response) {
2418
+ _this.portletFields_Temp[id] = initFieldsArr;
2419
+ length++;
2420
+ if (portlets.length === length) {
2421
+ callback();
2422
+ }
2423
+ }), (/**
2424
+ * @return {?}
2425
+ */
2426
+ function () { }));
2427
+ return [2 /*return*/];
2428
+ }
2429
+ });
2430
+ };
2431
+ this_1 = this;
2432
+ _b.label = 1;
2433
+ case 1:
2434
+ _b.trys.push([1, 6, 7, 8]);
2435
+ portlets_1 = tslib_1.__values(portlets), portlets_1_1 = portlets_1.next();
2436
+ _b.label = 2;
2437
+ case 2:
2438
+ if (!!portlets_1_1.done) return [3 /*break*/, 5];
2439
+ portlet = portlets_1_1.value;
2440
+ return [5 /*yield**/, _loop_1(portlet)];
2441
+ case 3:
2442
+ _b.sent();
2443
+ _b.label = 4;
2444
+ case 4:
2445
+ portlets_1_1 = portlets_1.next();
2446
+ return [3 /*break*/, 2];
2447
+ case 5: return [3 /*break*/, 8];
2448
+ case 6:
2449
+ e_2_1 = _b.sent();
2450
+ e_2 = { error: e_2_1 };
2451
+ return [3 /*break*/, 8];
2452
+ case 7:
2453
+ try {
2454
+ if (portlets_1_1 && !portlets_1_1.done && (_a = portlets_1.return)) _a.call(portlets_1);
2455
+ }
2456
+ finally { if (e_2) throw e_2.error; }
2457
+ return [7 /*endfinally*/];
2458
+ case 8: return [3 /*break*/, 10];
2459
+ case 9:
2460
+ callback();
2461
+ _b.label = 10;
2462
+ case 10: return [2 /*return*/];
2463
+ }
2464
+ });
2465
+ });
2466
+ };
2467
+ /**
2468
+ * @param {?} portlet
2469
+ * @return {?}
2470
+ */
2471
+ DashboardPorletsService.prototype.clearFieldsObj = /**
2472
+ * @param {?} portlet
2473
+ * @return {?}
2474
+ */
2475
+ function (portlet) {
2476
+ Reflect.deleteProperty(this.allFieldsObj, portlet.id);
2477
+ };
2478
+ // 根据portlet 解析params
2479
+ // 根据portlet 解析params
2480
+ /**
2481
+ * @param {?} portlet
2482
+ * @param {?=} pageSetting
2483
+ * @param {?=} allFields
2484
+ * @param {?=} dashboard
2485
+ * @return {?}
2486
+ */
2487
+ DashboardPorletsService.prototype.getParamsByPortlet =
2488
+ // 根据portlet 解析params
2489
+ /**
2490
+ * @param {?} portlet
2491
+ * @param {?=} pageSetting
2492
+ * @param {?=} allFields
2493
+ * @param {?=} dashboard
2494
+ * @return {?}
2495
+ */
2496
+ function (portlet, pageSetting, allFields, dashboard) {
2497
+ var e_3, _a, e_4, _b, e_5, _c, e_6, _d;
2498
+ /** @type {?} */
2499
+ var dashboardDataTableId = portlet.dashboardDataTableId;
2500
+ //SMP2-7731 get the dashboardDataTableid from dataMartTables arrary
2501
+ /** @type {?} */
2502
+ var curDataMart = this.dataMartTables[dashboard.id].find((/**
2503
+ * @param {?} d
2504
+ * @return {?}
2505
+ */
2506
+ function (d) { return d.datamartCode === portlet.figureCode; }));
2507
+ if (curDataMart) {
2508
+ dashboardDataTableId = curDataMart.id;
2509
+ }
2510
+ /** @type {?} */
2511
+ var config = portlet.config && JSON.parse(portlet.config);
2512
+ if (portlet.id !== "00000000-0000-0000-0000-000000000000") {
2513
+ this.allFieldsObj[portlet.id] = allFields;
2514
+ }
2515
+ /** @type {?} */
2516
+ var fields = allFields
2517
+ ? this.setConfigFields(allFields, config.fields)
2518
+ : config.fields;
2519
+ if (allFields) {
2520
+ config.fields = fields;
2521
+ portlet.config = JSON.stringify(config);
2522
+ }
2523
+ /** @type {?} */
2524
+ var calculatedFields = config.calculatedFieldSettings;
2525
+ /** @type {?} */
2526
+ var needFields = [];
2527
+ /** @type {?} */
2528
+ var params = {};
2529
+ /** @type {?} */
2530
+ var portletType = config.portletType === "historicalIRR"
2531
+ ? config.selectedVisualType
2532
+ : config.portletType;
2533
+ if (portletType === "table") {
2534
+ fields &&
2535
+ fields.forEach((/**
2536
+ * @param {?} x
2537
+ * @return {?}
2538
+ */
2539
+ function (x) {
2540
+ needFields.push(x.colName);
2541
+ }));
2542
+ params.startIndex = 0;
2543
+ params.pageSize = 10;
2544
+ if (pageSetting && pageSetting.currentPage) {
2545
+ params.startIndex =
2546
+ (pageSetting.currentPage - 1) * pageSetting.pageSize;
2547
+ params.pageSize = pageSetting.pageSize;
2548
+ }
2549
+ // 处理 sort
2550
+ if (pageSetting && pageSetting.sortedColumn) {
2551
+ params.sortedColumn = pageSetting.sortedColumn;
2552
+ params.sort = pageSetting.sort;
2553
+ }
2554
+ // 处理 filter
2555
+ if (config.filterSettings.length) {
2556
+ /** @type {?} */
2557
+ var filterSettings = JSON.parse(JSON.stringify(config.filterSettings));
2558
+ params.columnFilter = filterSettings.map((/**
2559
+ * @param {?} x
2560
+ * @return {?}
2561
+ */
2562
+ function (x) {
2563
+ if (x.type === "date") {
2564
+ /** @type {?} */
2565
+ var date = new Date(x.value);
2566
+ /** @type {?} */
2567
+ var year = date.getFullYear();
2568
+ /** @type {?} */
2569
+ var month = String(date.getMonth() + 1).padStart(2, "0");
2570
+ /** @type {?} */
2571
+ var day = String(date.getDate()).padStart(2, "0");
2572
+ /** @type {?} */
2573
+ var formattedDate = year + "-" + month + "-" + day;
2574
+ x.value = formattedDate;
2575
+ }
2576
+ return x;
2577
+ }));
2578
+ }
2579
+ params.isTable = true;
2580
+ }
2581
+ else if (portletType === "transpose") {
2582
+ fields &&
2583
+ fields.forEach((/**
2584
+ * @param {?} x
2585
+ * @return {?}
2586
+ */
2587
+ function (x) {
2588
+ if (!x.isHidden) {
2589
+ needFields.push(x.colName);
2590
+ }
2591
+ }));
2592
+ }
2593
+ else if (["newcolumn", "newline", "newcolumnline"].includes(portletType)) {
2594
+ if (config.selectedY && config.selectedY.length > 0) {
2595
+ config.selectedY.forEach((/**
2596
+ * @param {?} e
2597
+ * @return {?}
2598
+ */
2599
+ function (e) {
2600
+ needFields.push(e);
2601
+ }));
2602
+ }
2603
+ if (config.selectedSecondY && config.selectedSecondY.length > 0) {
2604
+ config.selectedSecondY.forEach((/**
2605
+ * @param {?} e
2606
+ * @return {?}
2607
+ */
2608
+ function (e) {
2609
+ needFields.push(e);
2610
+ }));
2611
+ }
2612
+ }
2613
+ else {
2614
+ // 处理 filters
2615
+ /** @type {?} */
2616
+ var filters = config.filters;
2617
+ if (filters && filters.length) {
2618
+ try {
2619
+ for (var filters_1 = tslib_1.__values(filters), filters_1_1 = filters_1.next(); !filters_1_1.done; filters_1_1 = filters_1.next()) {
2620
+ var item = filters_1_1.value;
2621
+ needFields.push(item.name);
2622
+ }
2623
+ }
2624
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
2625
+ finally {
2626
+ try {
2627
+ if (filters_1_1 && !filters_1_1.done && (_a = filters_1.return)) _a.call(filters_1);
2628
+ }
2629
+ finally { if (e_3) throw e_3.error; }
2630
+ }
2631
+ }
2632
+ // 处理 values
2633
+ /** @type {?} */
2634
+ var series = config.yaxis.series;
2635
+ if (series && series.length) {
2636
+ var _loop_2 = function (item) {
2637
+ if ([
2638
+ "CalculateIRR",
2639
+ "CalculateIRRMTD",
2640
+ "CalculateIRRQTD",
2641
+ "CalculateIRRYTD",
2642
+ "CalculateTWRMTD",
2643
+ "CalculateTWRQTD",
2644
+ "CalculateTWRYTD",
2645
+ "CalculateVARMTD_99",
2646
+ "CalculateVARQTD_99",
2647
+ "CalculateVARYTD_99",
2648
+ "CalculateVARMTD_95",
2649
+ "CalculateVARQTD_95",
2650
+ "CalculateVARYTD_95",
2651
+ ].includes(item.calMethod)) {
2652
+ needFields.push("IRRAmount", "IRRDate", "IRRAdjValue");
2653
+ }
2654
+ else if (item.calMethod === "CalculateIRRBeforeCarried") {
2655
+ needFields.push("IRRAmount", "IRRDate", "IRRAdjValueBeforeCarry");
2656
+ }
2657
+ else if (item.calMethod === "CalculateIRRIRRDate") {
2658
+ needFields.push("IRRAmount", "CalculateIRRDate", "IRRAdjValue");
2659
+ }
2660
+ else if (item.calMethod === "CalculateIRRActualAudited") {
2661
+ portlet.figureCode === "GrossNet" ||
2662
+ portlet.figureCode === "CombinedInvestmentFundNCompanyCashflow"
2663
+ ? needFields.push("IRRAmount", "IRRDate", "ActualAuditedNAV")
2664
+ : needFields.push("IRRAmount", "IRRDate", "IRRAdjValue");
2665
+ }
2666
+ else if (item.calMethod === "CalculateIRRReported") {
2667
+ portlet.figureCode === "GrossNet" ||
2668
+ portlet.figureCode === "CombinedInvestmentFundNCompanyCashflow"
2669
+ ? needFields.push("IRRAmount", "IRRDate", "ReportedNAV")
2670
+ : needFields.push("IRRAmount", "IRRDate", "IRRAdjValue");
2671
+ }
2672
+ else if (item.calMethod === "CalculatedField") {
2673
+ }
2674
+ else {
2675
+ /** @type {?} */
2676
+ var colName_1 = this_2.getAggregateType(item.calMethod);
2677
+ if (colName_1) {
2678
+ /** @type {?} */
2679
+ var curField = fields.find((/**
2680
+ * @param {?} f
2681
+ * @return {?}
2682
+ */
2683
+ function (f) { return f.colName === colName_1; }));
2684
+ if (curField && curField.formula) {
2685
+ /** @type {?} */
2686
+ var fs = curField.formula.split("/");
2687
+ fs && fs.map((/**
2688
+ * @param {?} f
2689
+ * @return {?}
2690
+ */
2691
+ function (f) { return needFields.push(f); }));
2692
+ }
2693
+ }
2694
+ else {
2695
+ needFields.push(item.colName);
2696
+ }
2697
+ }
2698
+ };
2699
+ var this_2 = this;
2700
+ try {
2701
+ for (var series_1 = tslib_1.__values(series), series_1_1 = series_1.next(); !series_1_1.done; series_1_1 = series_1.next()) {
2702
+ var item = series_1_1.value;
2703
+ _loop_2(item);
2704
+ }
2705
+ }
2706
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
2707
+ finally {
2708
+ try {
2709
+ if (series_1_1 && !series_1_1.done && (_b = series_1.return)) _b.call(series_1);
2710
+ }
2711
+ finally { if (e_4) throw e_4.error; }
2712
+ }
2713
+ }
2714
+ // 处理 rows
2715
+ /** @type {?} */
2716
+ var groups = config.xaxis.groups;
2717
+ if (groups && groups.length) {
2718
+ try {
2719
+ for (var groups_1 = tslib_1.__values(groups), groups_1_1 = groups_1.next(); !groups_1_1.done; groups_1_1 = groups_1.next()) {
2720
+ var gitem = groups_1_1.value;
2721
+ needFields.push(gitem.name);
2722
+ }
2723
+ }
2724
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
2725
+ finally {
2726
+ try {
2727
+ if (groups_1_1 && !groups_1_1.done && (_c = groups_1.return)) _c.call(groups_1);
2728
+ }
2729
+ finally { if (e_5) throw e_5.error; }
2730
+ }
2731
+ }
2732
+ // 处理 colunms
2733
+ /** @type {?} */
2734
+ var columnGroup = config.columnGroup;
2735
+ if (columnGroup && columnGroup.length) {
2736
+ try {
2737
+ for (var columnGroup_1 = tslib_1.__values(columnGroup), columnGroup_1_1 = columnGroup_1.next(); !columnGroup_1_1.done; columnGroup_1_1 = columnGroup_1.next()) {
2738
+ var item = columnGroup_1_1.value;
2739
+ needFields.push(item.name);
2740
+ }
2741
+ }
2742
+ catch (e_6_1) { e_6 = { error: e_6_1 }; }
2743
+ finally {
2744
+ try {
2745
+ if (columnGroup_1_1 && !columnGroup_1_1.done && (_d = columnGroup_1.return)) _d.call(columnGroup_1);
2746
+ }
2747
+ finally { if (e_6) throw e_6.error; }
2748
+ }
2749
+ }
2750
+ // 处理 calculatedField
2751
+ if (calculatedFields && calculatedFields.length) {
2752
+ calculatedFields.map((/**
2753
+ * @param {?} f
2754
+ * @return {?}
2755
+ */
2756
+ function (f) {
2757
+ /** @type {?} */
2758
+ var string = f.formula;
2759
+ /** @type {?} */
2760
+ var regex = /\((.*?)\)/g;
2761
+ /** @type {?} */
2762
+ var matches = string
2763
+ .match(regex)
2764
+ .map((/**
2765
+ * @param {?} match
2766
+ * @return {?}
2767
+ */
2768
+ function (match) { return match.slice(1, -1); }));
2769
+ needFields.push.apply(needFields, tslib_1.__spread(matches));
2770
+ }));
2771
+ }
2772
+ // 处理 orderByColumns
2773
+ if (this.dashboardConfig && this.dashboardConfig[dashboard.id]) {
2774
+ params.datamartViewId =
2775
+ this.dashboardConfig[dashboard.id].datamartViewId;
2776
+ params.datamartId = this.dashboardConfig[dashboard.id].datamartId;
2777
+ params.datamartCode = portlet.figureCode;
2778
+ }
2779
+ // 处理config.fields里的sortColumn
2780
+ /** @type {?} */
2781
+ var fieldSortColumns_1 = [];
2782
+ fields.map((/**
2783
+ * @param {?} x
2784
+ * @return {?}
2785
+ */
2786
+ function (x) {
2787
+ if (x.sortColumn && !fieldSortColumns_1.includes(x.sortColumn)) {
2788
+ fieldSortColumns_1.push(x.sortColumn);
2789
+ }
2790
+ }));
2791
+ if (fieldSortColumns_1.length) {
2792
+ needFields.push.apply(needFields, tslib_1.__spread(fieldSortColumns_1));
2793
+ }
2794
+ }
2795
+ needFields = Array.from(new Set(needFields));
2796
+ // 去除非法字段
2797
+ /** @type {?} */
2798
+ var legalFields = fields.map((/**
2799
+ * @param {?} x
2800
+ * @return {?}
2801
+ */
2802
+ function (x) { return x.colName; }));
2803
+ needFields.map((/**
2804
+ * @param {?} x
2805
+ * @param {?} i
2806
+ * @return {?}
2807
+ */
2808
+ function (x, i) {
2809
+ if (!legalFields.includes(x)) {
2810
+ needFields.splice(i, 1);
2811
+ }
2812
+ }));
2813
+ if (needFields.length === 0) {
2814
+ if (legalFields[0]) {
2815
+ needFields.push(legalFields[0]);
2816
+ }
2817
+ }
2818
+ // 默认获取Seq字段 SMP2-4582 AGIC - Dashboard item sequence
2819
+ needFields.push("Seq");
2820
+ // "newcolumn", "newline", "newcolumnline" 如果是这三种类型默认加 OperationDate 字段
2821
+ if (["newcolumn", "newline", "newcolumnline"].includes(portletType)) {
2822
+ needFields.push(config.selectedX);
2823
+ params["IsOnlyShowDisplayColum"] = true;
2824
+ }
2825
+ if (config.portletType === "historicalIRR") {
2826
+ if (!params.columnFilter) {
2827
+ params.columnFilter = [];
2828
+ }
2829
+ params.columnFilter.push({
2830
+ Field: "Frequencys",
2831
+ Operator: "equal",
2832
+ Type: "string",
2833
+ Value: config.selectedMultiples,
2834
+ }, {
2835
+ Field: "InvestorType",
2836
+ Operator: "equal",
2837
+ Type: "string",
2838
+ Value: config.selectedInvestor,
2839
+ });
2840
+ }
2841
+ params.dashboardDataTableId = dashboardDataTableId;
2842
+ params.displayColumnFilter = needFields.join(",");
2843
+ params.responseType = "json";
2844
+ return params;
2845
+ };
2846
+ // 是否需要重新发起请求
2847
+ // 是否需要重新发起请求
2848
+ /**
2849
+ * @param {?=} origin
2850
+ * @param {?=} compare
2851
+ * @return {?}
2852
+ */
2853
+ DashboardPorletsService.prototype.needGetPortletData =
2854
+ // 是否需要重新发起请求
2855
+ /**
2856
+ * @param {?=} origin
2857
+ * @param {?=} compare
2858
+ * @return {?}
2859
+ */
2860
+ function (origin, compare) {
2861
+ if (origin === void 0) { origin = []; }
2862
+ if (compare === void 0) { compare = []; }
2863
+ return compare.some((/**
2864
+ * @param {?} c
2865
+ * @return {?}
2866
+ */
2867
+ function (c) { return !origin.includes(c); }));
2868
+ };
2869
+ /**
2870
+ * @param {?} figureCodes
2871
+ * @param {?} callback
2872
+ * @param {?=} portletTypes
2873
+ * @param {?=} dashboardId
2874
+ * @param {?=} portlet
2875
+ * @return {?}
2876
+ */
2877
+ DashboardPorletsService.prototype.setDataManager = /**
2878
+ * @param {?} figureCodes
2879
+ * @param {?} callback
2880
+ * @param {?=} portletTypes
2881
+ * @param {?=} dashboardId
2882
+ * @param {?=} portlet
2883
+ * @return {?}
2884
+ */
2885
+ function (figureCodes, callback, portletTypes, dashboardId, portlet) {
2886
+ var _this = this;
2887
+ if (portletTypes === void 0) { portletTypes = []; }
2888
+ /** @type {?} */
2889
+ var length = 0;
2890
+ if (!this.fieldsArr[dashboardId]) {
2891
+ this.fieldsArr[dashboardId] = {};
2892
+ }
2893
+ if (this.dataMartTables[dashboardId] &&
2894
+ this.dataMartTables[dashboardId].length) {
2895
+ this.pbf.pageLoading = true;
2896
+ this.pbf.pageLoading_.next(true);
2897
+ /** @type {?} */
2898
+ var dataMartTables_1 = this.dataMartTables[dashboardId].filter((/**
2899
+ * @param {?} el
2900
+ * @return {?}
2901
+ */
2902
+ function (el) {
2903
+ return figureCodes.includes(el.datamartCode);
2904
+ }));
2905
+ if (dataMartTables_1.length) {
2906
+ forEach(dataMartTables_1, (/**
2907
+ * @param {?} item
2908
+ * @param {?} index
2909
+ * @return {?}
2910
+ */
2911
+ function (item, index) {
2912
+ /** @type {?} */
2913
+ var allFields;
2914
+ /** @type {?} */
2915
+ var config;
2916
+ if (portlet) {
2917
+ config = JSON.parse(portlet.config);
2918
+ }
2919
+ if (["newcolumn", "newline", "newcolumnline"].includes(portletTypes[0])) {
2920
+ allFields = config.selectedY
2921
+ .concat(config.selectedSecondY)
2922
+ .concat([config.selectedX])
2923
+ .map((/**
2924
+ * @param {?} e
2925
+ * @return {?}
2926
+ */
2927
+ function (e) {
2928
+ return {
2929
+ colName: e,
2930
+ };
2931
+ }));
2932
+ }
2933
+ else {
2934
+ allFields =
2935
+ _this.fieldsArr[dashboardId] &&
2936
+ _this.fieldsArr[dashboardId][item.datamartCode]
2937
+ ? _this.fieldsArr[dashboardId][item.datamartCode]
2938
+ : [];
2939
+ }
2940
+ /** @type {?} */
2941
+ var displayColumnFilter = allFields && allFields.map((/**
2942
+ * @param {?} x
2943
+ * @return {?}
2944
+ */
2945
+ function (x) { return x.colName; })).join(",");
2946
+ /** @type {?} */
2947
+ var params = {
2948
+ dashboardDataTableId: item.id,
2949
+ displayColumnFilter: displayColumnFilter,
2950
+ responseType: "json",
2951
+ dashboardVersion: 2,
2952
+ };
2953
+ params.startIndex = 0;
2954
+ params.pageSize = 10;
2955
+ if (portletTypes &&
2956
+ portletTypes.length > 0 &&
2957
+ (portletTypes.includes("newcolumn") ||
2958
+ portletTypes.includes("newline") ||
2959
+ portletTypes.includes("newcolumnline"))) {
2960
+ params.pageSize = 1000000;
2961
+ params["IsOnlyShowDisplayColum"] = true;
2962
+ }
2963
+ if (config) {
2964
+ /** @type {?} */
2965
+ var filterSettings = config.filterSettings;
2966
+ if (filterSettings && filterSettings.length) {
2967
+ if (!params.columnFilter) {
2968
+ params.columnFilter = [];
2969
+ }
2970
+ filterSettings.forEach((/**
2971
+ * @param {?} setting
2972
+ * @return {?}
2973
+ */
2974
+ function (setting) {
2975
+ if (config.portletType === "pivot") {
2976
+ return;
2977
+ }
2978
+ /** @type {?} */
2979
+ var _field = config.fields.find((/**
2980
+ * @param {?} item
2981
+ * @return {?}
2982
+ */
2983
+ function (item) { return item.colName === setting.name; }));
2984
+ /** @type {?} */
2985
+ var Type = _field && _field.dataType;
2986
+ if (setting.items) {
2987
+ setting.items.forEach((/**
2988
+ * @param {?} item
2989
+ * @return {?}
2990
+ */
2991
+ function (item) {
2992
+ params.columnFilter.push({
2993
+ Field: setting.name,
2994
+ Operator: "equal",
2995
+ Type: Type,
2996
+ Value: Type === "date"
2997
+ ? moment(item).format("yyyy-MM-DD")
2998
+ : Type === "datetime"
2999
+ ? moment(item).format("yyyy-MM-DD hh:mm:ss")
3000
+ : item,
3001
+ });
3002
+ }));
3003
+ }
3004
+ else if (setting.operator) {
3005
+ params.columnFilter.push({
3006
+ Field: setting.field,
3007
+ Operator: "equal",
3008
+ Type: setting.type,
3009
+ Value: setting.type === "date"
3010
+ ? moment(setting.value).format("yyyy-MM-DD")
3011
+ : setting.type === "datetime"
3012
+ ? moment(setting.value).format("yyyy-MM-DD hh:mm:ss")
3013
+ : setting.value,
3014
+ });
3015
+ }
3016
+ }));
3017
+ }
3018
+ if (config.portletType === "historicalIRR") {
3019
+ if (!params.columnFilter) {
3020
+ params.columnFilter = [];
3021
+ }
3022
+ params.columnFilter.push({
3023
+ Field: "Frequencys",
3024
+ Operator: "equal",
3025
+ Type: "string",
3026
+ Value: config.selectedMultiples,
3027
+ }, {
3028
+ Field: "InvestorType",
3029
+ Operator: "equal",
3030
+ Type: "string",
3031
+ Value: config.selectedInvestor,
3032
+ });
3033
+ }
3034
+ }
3035
+ if (params.columnFilter instanceof Array) {
3036
+ params.columnFilter = params.columnFilter.filter((/**
3037
+ * @param {?} item
3038
+ * @return {?}
3039
+ */
3040
+ function (item) { return item.Field; }));
3041
+ }
3042
+ // json buffer
3043
+ _this.httpClient
3044
+ .post(_this.api.baseurl + _this.api.urlList.GetPortletDataOrCreate, params, {
3045
+ headers: new HttpHeaders({
3046
+ Authorization: "Bearer",
3047
+ }),
3048
+ })
3049
+ .subscribe((/**
3050
+ * @param {?} result
3051
+ * @return {?}
3052
+ */
3053
+ function (result) {
3054
+ /** @type {?} */
3055
+ var identifier = portlet.id === "00000000-0000-0000-0000-000000000000"
3056
+ ? portlet.newId
3057
+ : portlet.id;
3058
+ if (!result) {
3059
+ _this.portletResults_New[dashboardId][item.datamartCode] = [];
3060
+ if (portlet) {
3061
+ _this.portletData_New[dashboardId][identifier] = {
3062
+ total: 0,
3063
+ data: [],
3064
+ };
3065
+ }
3066
+ /** @type {?} */
3067
+ var message = _this.translation.NO_DATA
3068
+ ? _this.translation.NO_DATA
3069
+ : ".No data, please choose another data type";
3070
+ _this.dialogService.showNotification(message, {
3071
+ status: "Error",
3072
+ });
3073
+ length++;
3074
+ if (dataMartTables_1.length === length) {
3075
+ callback();
3076
+ }
3077
+ }
3078
+ else {
3079
+ result["data"].forEach((/**
3080
+ * @param {?} item
3081
+ * @return {?}
3082
+ */
3083
+ function (item) {
3084
+ item.Sector = _this.translation[item.Sector] || item.Sector;
3085
+ }));
3086
+ if (_this.fieldsArr[dashboardId] &&
3087
+ Object.keys(_this.fieldsArr[dashboardId]).length) {
3088
+ _this.portletResults_New[dashboardId][item.datamartCode] =
3089
+ result;
3090
+ }
3091
+ if (portlet) {
3092
+ _this.portletData_New[dashboardId][identifier] = result;
3093
+ }
3094
+ length++;
3095
+ if (dataMartTables_1.length === length) {
3096
+ callback();
3097
+ }
3098
+ }
3099
+ }), (/**
3100
+ * @param {?} response
3101
+ * @return {?}
3102
+ */
3103
+ function (response) {
3104
+ length++;
3105
+ if (dataMartTables_1.length === length) {
3106
+ callback();
3107
+ }
3108
+ }), (/**
3109
+ * @return {?}
3110
+ */
3111
+ function () { }));
3112
+ }));
3113
+ }
3114
+ else {
3115
+ callback();
3116
+ }
3117
+ }
3118
+ };
3119
+ // 拿到数据后,先遍历config.filterSettings,如果在数据中不存在,就删除这一项
3120
+ // 拿到数据后,先遍历config.filterSettings,如果在数据中不存在,就删除这一项
3121
+ /**
3122
+ * @param {?} config
3123
+ * @param {?} fields
3124
+ * @param {?} data
3125
+ * @return {?}
3126
+ */
3127
+ DashboardPorletsService.prototype.checkFilterSettings =
3128
+ // 拿到数据后,先遍历config.filterSettings,如果在数据中不存在,就删除这一项
3129
+ /**
3130
+ * @param {?} config
3131
+ * @param {?} fields
3132
+ * @param {?} data
3133
+ * @return {?}
3134
+ */
3135
+ function (config, fields, data) {
3136
+ /** @type {?} */
3137
+ var filterSettings = config.filterSettings;
3138
+ if (filterSettings && filterSettings.length) {
3139
+ var _loop_3 = function (i) {
3140
+ /** @type {?} */
3141
+ var element = filterSettings[i];
3142
+ /** @type {?} */
3143
+ var __field = fields.filter((/**
3144
+ * @param {?} field
3145
+ * @return {?}
3146
+ */
3147
+ function (field) { return field.colName == element.name; }))[0];
3148
+ if (!__field) {
3149
+ return out_i_1 = i, "continue";
3150
+ }
3151
+ /** @type {?} */
3152
+ var dataType = __field.dataType;
3153
+ if (element.items && element.items.length) {
3154
+ var _loop_4 = function (r) {
3155
+ /** @type {?} */
3156
+ var item = element.items[r];
3157
+ /** @type {?} */
3158
+ var res = [];
3159
+ if (dataType !== "date" &&
3160
+ dataType !== "datetime" &&
3161
+ data &&
3162
+ data.length) {
3163
+ if (dataType == "string") {
3164
+ res = data.filter((/**
3165
+ * @param {?} obj
3166
+ * @return {?}
3167
+ */
3168
+ function (obj) { return obj[element.name] === item; }));
3169
+ }
3170
+ else {
3171
+ res = data.filter((/**
3172
+ * @param {?} obj
3173
+ * @return {?}
3174
+ */
3175
+ function (obj) { return Number(obj[element.name]) === Number(item); }));
3176
+ }
3177
+ }
3178
+ if (dataType == "date" || dataType == "datetime") {
3179
+ res = data.filter((/**
3180
+ * @param {?} obj
3181
+ * @return {?}
3182
+ */
3183
+ function (obj) {
3184
+ return moment(obj[element.name]).format("YYYY-MM-DD") ==
3185
+ moment(item).format("YYYY-MM-DD");
3186
+ }));
3187
+ }
3188
+ if (!res.length) {
3189
+ element.items.splice(r, 1);
3190
+ r--;
3191
+ }
3192
+ out_r_1 = r;
3193
+ };
3194
+ var out_r_1;
3195
+ for (var r = 0; r < element.items.length; r++) {
3196
+ _loop_4(r);
3197
+ r = out_r_1;
3198
+ }
3199
+ if (!element.items.length) {
3200
+ filterSettings.splice(i, 1);
3201
+ i--;
3202
+ }
3203
+ }
3204
+ out_i_1 = i;
3205
+ };
3206
+ var out_i_1;
3207
+ for (var i = 0; i < filterSettings.length; i++) {
3208
+ _loop_3(i);
3209
+ i = out_i_1;
3210
+ }
3211
+ return filterSettings;
3212
+ }
3213
+ else {
3214
+ return [];
3215
+ }
3216
+ // callback(filterSettings);
3217
+ };
3218
+ /**
3219
+ * @param {?} data
3220
+ * @return {?}
3221
+ */
3222
+ DashboardPorletsService.prototype.sortDataMartTables = /**
3223
+ * @param {?} data
3224
+ * @return {?}
3225
+ */
3226
+ function (data) {
3227
+ data.sort((/**
3228
+ * @param {?} a
3229
+ * @param {?} b
3230
+ * @return {?}
3231
+ */
3232
+ function (a, b) {
3233
+ /** @type {?} */
3234
+ var langValueA = a.langValue.toLowerCase();
3235
+ /** @type {?} */
3236
+ var langValueB = b.langValue.toLowerCase();
3237
+ if (langValueA < langValueB) {
3238
+ return -1;
3239
+ }
3240
+ if (langValueA > langValueB) {
3241
+ return 1;
3242
+ }
3243
+ return 0;
3244
+ }));
3245
+ };
3246
+ /**
3247
+ * @param {?} data
3248
+ * @param {?} id
3249
+ * @param {?} entityType
3250
+ * @return {?}
3251
+ */
3252
+ DashboardPorletsService.prototype.renameDataMartTables = /**
3253
+ * @param {?} data
3254
+ * @param {?} id
3255
+ * @param {?} entityType
3256
+ * @return {?}
3257
+ */
3258
+ function (data, id, entityType) {
3259
+ if (this.sourcesData[id]) {
3260
+ this.sourcesData[id].forEach((/**
3261
+ * @param {?} sources
3262
+ * @return {?}
3263
+ */
3264
+ function (sources) {
3265
+ if (sources.entityType === entityType) {
3266
+ data.forEach((/**
3267
+ * @param {?} _data
3268
+ * @return {?}
3269
+ */
3270
+ function (_data) {
3271
+ sources.views.forEach((/**
3272
+ * @param {?} view
3273
+ * @return {?}
3274
+ */
3275
+ function (view) {
3276
+ view.tables.forEach((/**
3277
+ * @param {?} table
3278
+ * @return {?}
3279
+ */
3280
+ function (table) {
3281
+ if (table.datamartCode === _data.datamartCode) {
3282
+ _data.langValue = table.langValue;
3283
+ _data.langCode = table.langCode;
3284
+ }
3285
+ }));
3286
+ }));
3287
+ }));
3288
+ }
3289
+ }));
3290
+ }
3291
+ else {
3292
+ return data;
3293
+ }
3294
+ };
3295
+ DashboardPorletsService.decorators = [
3296
+ { type: Injectable, args: [{
3297
+ providedIn: "root",
3298
+ },] }
3299
+ ];
3300
+ /** @nocollapse */
3301
+ DashboardPorletsService.ctorParameters = function () { return [
3302
+ { type: ApiList },
3303
+ { type: MatDialog },
3304
+ { type: DialogService },
3305
+ { type: DashboardService },
3306
+ { type: HttpClient },
3307
+ { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [PBF_TOKEN,] }] },
3308
+ { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [API_SERVICE_TOKEN,] }] }
3309
+ ]; };
3310
+ /** @nocollapse */ DashboardPorletsService.ngInjectableDef = i0.ɵɵdefineInjectable({ factory: function DashboardPorletsService_Factory() { return new DashboardPorletsService(i0.ɵɵinject(i1.ApiList), i0.ɵɵinject(i2.MatDialog), i0.ɵɵinject(i3.DialogService), i0.ɵɵinject(i4.DashboardService), i0.ɵɵinject(i5.HttpClient), i0.ɵɵinject(i6.PBF_TOKEN, 8), i0.ɵɵinject(i6.API_SERVICE_TOKEN, 8)); }, token: DashboardPorletsService, providedIn: "root" });
3311
+ return DashboardPorletsService;
3312
+ }());
3313
+ export { DashboardPorletsService };
3314
+ if (false) {
3315
+ /** @type {?} */
3316
+ DashboardPorletsService.prototype.translation;
3317
+ /**
3318
+ * @type {?}
3319
+ * @private
3320
+ */
3321
+ DashboardPorletsService.prototype.userInfo;
3322
+ /**
3323
+ * @type {?}
3324
+ * @private
3325
+ */
3326
+ DashboardPorletsService.prototype.lang;
3327
+ /** @type {?} */
3328
+ DashboardPorletsService.prototype.companyDropdownList;
3329
+ /** @type {?} */
3330
+ DashboardPorletsService.prototype.currencyDropdownList;
3331
+ /** @type {?} */
3332
+ DashboardPorletsService.prototype.currencyList;
3333
+ /** @type {?} */
3334
+ DashboardPorletsService.prototype.portlets;
3335
+ /** @type {?} */
3336
+ DashboardPorletsService.prototype.portletsCopy;
3337
+ /** @type {?} */
3338
+ DashboardPorletsService.prototype.columnCount;
3339
+ /** @type {?} */
3340
+ DashboardPorletsService.prototype.rowCount;
3341
+ /** @type {?} */
3342
+ DashboardPorletsService.prototype.companyCharts;
3343
+ /** @type {?} */
3344
+ DashboardPorletsService.prototype.portletData;
3345
+ /** @type {?} */
3346
+ DashboardPorletsService.prototype.fundDropdownList;
3347
+ /** @type {?} */
3348
+ DashboardPorletsService.prototype.allInvesteeList;
3349
+ /** @type {?} */
3350
+ DashboardPorletsService.prototype.fundInvesteeList;
3351
+ /** @type {?} */
3352
+ DashboardPorletsService.prototype.seletedAllInvestee;
3353
+ /** @type {?} */
3354
+ DashboardPorletsService.prototype.colorsTotal;
3355
+ /** @type {?} */
3356
+ DashboardPorletsService.prototype.fetch_disabled;
3357
+ /** @type {?} */
3358
+ DashboardPorletsService.prototype.update_loading;
3359
+ /** @type {?} */
3360
+ DashboardPorletsService.prototype.currencyCode;
3361
+ /** @type {?} */
3362
+ DashboardPorletsService.prototype.update_config;
3363
+ /** @type {?} */
3364
+ DashboardPorletsService.prototype.loading_show;
3365
+ /** @type {?} */
3366
+ DashboardPorletsService.prototype.img;
3367
+ /** @type {?} */
3368
+ DashboardPorletsService.prototype.sortingPortlet;
3369
+ /** @type {?} */
3370
+ DashboardPorletsService.prototype.pagingChanging;
3371
+ /** @type {?} */
3372
+ DashboardPorletsService.prototype.timeMeasure;
3373
+ /** @type {?} */
3374
+ DashboardPorletsService.prototype.entityList;
3375
+ /** @type {?} */
3376
+ DashboardPorletsService.prototype.entityType;
3377
+ /** @type {?} */
3378
+ DashboardPorletsService.prototype.selected_enyity_fileds;
3379
+ /** @type {?} */
3380
+ DashboardPorletsService.prototype.isEntitySelectAll;
3381
+ /** @type {?} */
3382
+ DashboardPorletsService.prototype.checkedAll;
3383
+ /** @type {?} */
3384
+ DashboardPorletsService.prototype.selectedNum;
3385
+ /** @type {?} */
3386
+ DashboardPorletsService.prototype.updated;
3387
+ /** @type {?} */
3388
+ DashboardPorletsService.prototype.dataMartTables;
3389
+ /** @type {?} */
3390
+ DashboardPorletsService.prototype.length;
3391
+ /** @type {?} */
3392
+ DashboardPorletsService.prototype.GetSourcesRes;
3393
+ /** @type {?} */
3394
+ DashboardPorletsService.prototype.ListEntitiesRes;
3395
+ /** @type {?} */
3396
+ DashboardPorletsService.prototype.templateList;
3397
+ /** @type {?} */
3398
+ DashboardPorletsService.prototype.fieldsArr;
3399
+ /** @type {?} */
3400
+ DashboardPorletsService.prototype.sourcesData;
3401
+ /** @type {?} */
3402
+ DashboardPorletsService.prototype.portletResults_New;
3403
+ /** @type {?} */
3404
+ DashboardPorletsService.prototype.portletData_New;
3405
+ /** @type {?} */
3406
+ DashboardPorletsService.prototype.portletFields_Temp;
3407
+ /** @type {?} */
3408
+ DashboardPorletsService.prototype.dashboardConfig;
3409
+ /** @type {?} */
3410
+ DashboardPorletsService.prototype.entityIds;
3411
+ /** @type {?} */
3412
+ DashboardPorletsService.prototype.entityIdObj;
3413
+ /** @type {?} */
3414
+ DashboardPorletsService.prototype.allFieldsObj;
3415
+ /** @type {?} */
3416
+ DashboardPorletsService.prototype.GetDataTypes;
3417
+ /** @type {?} */
3418
+ DashboardPorletsService.prototype.ExcelFormulas;
3419
+ /**
3420
+ * @type {?}
3421
+ * @private
3422
+ */
3423
+ DashboardPorletsService.prototype.api;
3424
+ /** @type {?} */
3425
+ DashboardPorletsService.prototype.dialog;
3426
+ /**
3427
+ * @type {?}
3428
+ * @private
3429
+ */
3430
+ DashboardPorletsService.prototype.dialogService;
3431
+ /**
3432
+ * @type {?}
3433
+ * @private
3434
+ */
3435
+ DashboardPorletsService.prototype.DashboardService;
3436
+ /**
3437
+ * @type {?}
3438
+ * @private
3439
+ */
3440
+ DashboardPorletsService.prototype.httpClient;
3441
+ /**
3442
+ * @type {?}
3443
+ * @private
3444
+ */
3445
+ DashboardPorletsService.prototype.pbf;
3446
+ /**
3447
+ * @type {?}
3448
+ * @private
3449
+ */
3450
+ DashboardPorletsService.prototype.http;
3451
+ }
3452
+ /** @type {?} */
3453
+ export var ALL_AGGREGATE_TYPES = [
3454
+ "Sum",
3455
+ "First",
3456
+ "Last",
3457
+ "CalculateIRR",
3458
+ "CalculateIRRIRRDate",
3459
+ "CalculateIRRBeforeCarried",
3460
+ "CalculateIRRActualAudited",
3461
+ "CalculateIRRReported",
3462
+ "CalculateIRRMTD",
3463
+ "CalculateIRRQTD",
3464
+ "CalculateIRRYTD",
3465
+ "CalculateTWRMTD",
3466
+ "CalculateTWRQTD",
3467
+ "CalculateTWRYTD",
3468
+ "CalculateVARMTD_99",
3469
+ "CalculateVARQTD_99",
3470
+ "CalculateVARYTD_99",
3471
+ "CalculateVARMTD_95",
3472
+ "CalculateVARQTD_95",
3473
+ "CalculateVARYTD_95",
3474
+ "CalculateMultiple",
3475
+ "CalculatePIC",
3476
+ "CalculateDPI",
3477
+ "CalculateTVPI",
3478
+ "CalculateRVPI",
3479
+ "CalculateMActualAudited",
3480
+ "CalculateMReported",
3481
+ "Count",
3482
+ "DistinctCount",
3483
+ "Product",
3484
+ "Min",
3485
+ "Max",
3486
+ "Avg",
3487
+ "Median",
3488
+ "Index",
3489
+ "PopulationVar",
3490
+ "SampleVar",
3491
+ "PopulationStDev",
3492
+ "SampleStDev",
3493
+ "RunningTotals",
3494
+ "PercentageOfGrandTotal",
3495
+ "PercentageOfColumnTotal",
3496
+ "PercentageOfRowTotal",
3497
+ "PercentageOfParentColumnTotal",
3498
+ "PercentageOfParentRowTotal",
3499
+ "DifferenceFrom",
3500
+ "PercentageOfDifferenceFrom",
3501
+ "PercentageOfParentTotal",
3502
+ ];
3503
+ /** @type {?} */
3504
+ var translation = JSON.parse(localStorage.getItem("translation") || "{}");
3505
+ /** @type {?} */
3506
+ export var AGGREGATE_TYPES_TEXT = {
3507
+ CalculateIRR: translation.CALCULATE_IRR || "Calculate IRR",
3508
+ CalculateIRRIRRDate: translation.CALCULATE_IRR_IRR_DATE || "Calculate IRR (IRR Date)",
3509
+ CalculateIRRBeforeCarried: translation.CALCULATE_IRR_BEFORE_CARRY || "Calculate IRR Before Carried",
3510
+ CalculateIRRActualAudited: translation.CALCULATE_IRR_ACTUAL_AUDITED || "Calculate IRR Actual/Audited",
3511
+ CalculateIRRReported: translation.CI_REPORTED || "Calculate IRR Reported",
3512
+ CalculateIRRMTD: translation.CALCULATE_IRR_MTD || "Calculate IRR (MTD)",
3513
+ CalculateIRRQTD: translation.CALCULATE_IRR_QTD || "Calculate IRR (QTD)",
3514
+ CalculateIRRYTD: translation.CALCULATE_IRR_YTD || "Calculate IRR (YTD)",
3515
+ CalculateTWRMTD: translation.CALCULATE_TWR_MTD || "Calculate TWR (M)",
3516
+ CalculateTWRQTD: translation.CALCULATE_TWR_QTD || "Calculate TWR (Q)",
3517
+ CalculateTWRYTD: translation.CALCULATE_TWR_YTD || "Calculate TWR (Y)",
3518
+ CalculateVARMTD_99: translation.CALCULATE_VAR_MTD_99 || "Calculate VAR (M 99%)",
3519
+ CalculateVARQTD_99: translation.CALCULATE_VAR_QTD_99 || "Calculate VAR (Q 99%)",
3520
+ CalculateVARYTD_99: translation.CALCULATE_VAR_YTD_99 || "Calculate VAR (Y 99%)",
3521
+ CalculateVARMTD_95: translation.CALCULATE_VAR_MTD_95 || "Calculate VAR (M 95%)",
3522
+ CalculateVARQTD_95: translation.CALCULATE_VAR_QTD_95 || "Calculate VAR (Q 95%)",
3523
+ CalculateVARYTD_95: translation.CALCULATE_VAR_YTD_95 || "Calculate VAR (Y 95%)",
3524
+ CalculateMultiple: translation.CALCULATE_MULTIPLE || "Calculate Multiple",
3525
+ CalculatePIC: translation.CALCULATE_PIC || "Calculate PIC",
3526
+ CalculateDPI: translation.CALCULATE_DPI || "Calculate DPI",
3527
+ CalculateTVPI: translation.CALCULATE_TVPI || "Calculate TVPI",
3528
+ CalculateRVPI: translation.CALCULATE_RVPI || "Calculate RVPI",
3529
+ CalculateMActualAudited: translation.CALCULATE_MULTIPLE_ACTUAL_AUDITED ||
3530
+ "Calculate Multiple Actual/Audited",
3531
+ CalculateMReported: translation.CALCULATE_MULTIPLE_REPORTED || "Calculate Multiple Reported",
3532
+ First: translation.FIRST || "First",
3533
+ Last: translation.LAST || "Last",
3534
+ Median: translation.MEDIAN || "Median",
3535
+ };
3536
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFzaGJvYXJkUG9ybGV0cy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vcmFpc2UtY29tbW9uLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9kYXNoYm9hcmQvZGFzaGJvYXJkUG9ybGV0cy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ2pDLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7Ozs7Ozs7O0FBRTFEO0lBaUVFLGlDQUNVLEdBQVksRUFDYixNQUFpQixFQUNoQixhQUE0QixFQUM1QixnQkFBa0MsRUFDbEMsVUFBc0IsRUFDUyxHQUFRLEVBQ0EsSUFBUztRQU5oRCxRQUFHLEdBQUgsR0FBRyxDQUFTO1FBQ2IsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQUNoQixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDUyxRQUFHLEdBQUgsR0FBRyxDQUFLO1FBQ0EsU0FBSSxHQUFKLElBQUksQ0FBSzs7UUFoRW5ELHdCQUFtQixHQUFHLEVBQUUsQ0FBQztR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O0lBQ3JDLGtCQUFrQixFQUNoQixXQUFXLENBQUMsMkJBQTJCLElBQUksNkJBQTZCO0lBQzFFLEtBQUssRUFBRSxXQUFXLENBQUMsS0FBSyxJQUFJLE9BQU87SUFDbkMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxJQUFJLElBQUksTUFBTTtJQUNoQyxNQUFNLEVBQUUsV0FBVyxDQUFDLE1BQU0sSUFBSSxRQUFRO0NBQ3ZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IEFwaUxpc3QgfSBmcm9tIFwiLi9hcGlcIjtcclxuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsXCI7XHJcbmltcG9ydCB7IERhc2hib2FyZFNlcnZpY2UgfSBmcm9tIFwiLi9kYXNoYm9hcmQuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBmb3JFYWNoIH0gZnJvbSBcImxvZGFzaFwiO1xyXG5pbXBvcnQgbW9tZW50IGZyb20gXCJtb21lbnRcIjtcclxuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEhlYWRlcnMgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcclxuaW1wb3J0IHsgQVBJX1NFUlZJQ0VfVE9LRU4sIFBCRl9UT0tFTiB9IGZyb20gXCIuLi9zZXJ2aWNlL0luamVjdGlvblRva2VuXCI7XHJcbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZS9kaWFsb2cuc2VydmljZVwiO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46IFwicm9vdFwiLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkUG9ybGV0c1NlcnZpY2Uge1xyXG4gIHB1YmxpYyB0cmFuc2xhdGlvbjtcclxuICBwcml2YXRlIHVzZXJJbmZvO1xyXG4gIHByaXZhdGUgbGFuZztcclxuICAvLyBwdWJsaWMgY29uZmlnO1xyXG4gIHB1YmxpYyBjb21wYW55RHJvcGRvd25MaXN0ID0gW107XHJcbiAgcHVibGljIGN1cnJlbmN5RHJvcGRvd25MaXN0ID0gW107XHJcbiAgcHVibGljIGN1cnJlbmN5TGlzdCA9IFtdO1xyXG4gIHB1YmxpYyBwb3J0bGV0cyA9IFtdO1xyXG4gIHB1YmxpYyBwb3J0bGV0c0NvcHkgPSBbXTtcclxuICBwdWJsaWMgY29sdW1uQ291bnQ7XHJcbiAgcHVibGljIHJvd0NvdW50O1xyXG4gIHB1YmxpYyBjb21wYW55Q2hhcnRzID0gW107XHJcbiAgcHVibGljIHBvcnRsZXREYXRhO1xyXG4gIHB1YmxpYyBmdW5kRHJvcGRvd25MaXN0O1xyXG4gIHB1YmxpYyBhbGxJbnZlc3RlZUxpc3Q7XHJcbiAgcHVibGljIGZ1bmRJbnZlc3RlZUxpc3Q7XHJcbiAgcHVibGljIHNlbGV0ZWRBbGxJbnZlc3RlZTogYm9vbGVhbjtcclxuICBwdWJsaWMgY29sb3JzVG90YWwgPSBbXHJcbiAgICBcIiMwYjU0OTZcIixcclxuICAgIFwiIzAwODFmZlwiLFxyXG4gICAgXCIjMjJjY2UyXCIsXHJcbiAgICBcIiM2MDZlZGVcIixcclxuICAgIFwiIzg1OThmN1wiLFxyXG4gICAgXCIjMDBhNzQ0XCIsXHJcbiAgICBcIiMxMmMxNzdcIixcclxuICAgIFwiI2ZkYmY1ZVwiLFxyXG4gICAgXCIjZmY4YTQ4XCIsXHJcbiAgICBcIiNlYTQyNThcIixcclxuICBdO1xyXG4gIHB1YmxpYyBmZXRjaF9kaXNhYmxlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHVibGljIHVwZGF0ZV9sb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGN1cnJlbmN5Q29kZTtcclxuICBwdWJsaWMgdXBkYXRlX2NvbmZpZztcclxuICBwdWJsaWMgbG9hZGluZ19zaG93OiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGltZztcclxuICBwdWJsaWMgc29ydGluZ1BvcnRsZXQgPSBbXTtcclxuICBwdWJsaWMgcGFnaW5nQ2hhbmdpbmcgPSBbXTtcclxuICBwdWJsaWMgdGltZU1lYXN1cmU7XHJcbiAgcHVibGljIGVudGl0eUxpc3Q7XHJcbiAgcHVibGljIGVudGl0eVR5cGU7XHJcbiAgcHVibGljIHNlbGVjdGVkX2VueWl0eV9maWxlZHMgPSBbXTtcclxuICBwdWJsaWMgaXNFbnRpdHlTZWxlY3RBbGw7XHJcbiAgcHVibGljIGNoZWNrZWRBbGw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgc2VsZWN0ZWROdW07XHJcbiAgcHVibGljIHVwZGF0ZWQgPSBmYWxzZTtcclxuICBwdWJsaWMgZGF0YU1hcnRUYWJsZXMgPSB7fTtcclxuICBwdWJsaWMgbGVuZ3RoID0gMDtcclxuICBwdWJsaWMgR2V0U291cmNlc1JlcztcclxuICBwdWJsaWMgTGlzdEVudGl0aWVzUmVzO1xyXG4gIHB1YmxpYyB0ZW1wbGF0ZUxpc3QgPSBbXTtcclxuICBwdWJsaWMgZmllbGRzQXJyID0ge307XHJcbiAgcHVibGljIHNvdXJjZXNEYXRhID0ge307XHJcbiAgLy8gbmV3RGFzaGJvYXJkXHJcbiAgcHVibGljIHBvcnRsZXRSZXN1bHRzX05ldyA9IHt9OyAvLyDku6VEYXRhVGFibGXkuLrljZXkvY0g5a2Y5YKo5paw5pWw5o2uXHJcbiAgcHVibGljIHBvcnRsZXREYXRhX05ldyA9IHt9OyAvLyDku6Vwb3J0bGV05Li65Y2V5L2NIOWtmOWCqOaWsOaVsOaNrlxyXG4gIHB1YmxpYyBwb3J0bGV0RmllbGRzX1RlbXAgPSB7fTsgLy8g5a2Y5YKo5b2T5YmNcG9ydGxldOaJgOeUqOWIsOeahOWtl+autVxyXG4gIHB1YmxpYyBkYXNoYm9hcmRDb25maWc6IGFueSA9IHt9OyAvLyDlvZPliY1EYXNoYm9hcmTnmoRjb25maWcsIOeUqOS6juiOt+WPlm9yZGVyQnlDb2x1bW5zXHJcbiAgcHVibGljIGVudGl0eUlkczogYW55ID0gW107XHJcbiAgcHVibGljIGVudGl0eUlkT2JqOiBhbnkgPSB7fTtcclxuICBwdWJsaWMgYWxsRmllbGRzT2JqID0ge307XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBhcGk6IEFwaUxpc3QsXHJcbiAgICBwdWJsaWMgZGlhbG9nOiBNYXREaWFsb2csXHJcbiAgICBwcml2YXRlIGRpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIERhc2hib2FyZFNlcnZpY2U6IERhc2hib2FyZFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGh0dHBDbGllbnQ6IEh0dHBDbGllbnQsXHJcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFBCRl9UT0tFTikgcHJpdmF0ZSBwYmY6IGFueSxcclxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQVBJX1NFUlZJQ0VfVE9LRU4pIHByaXZhdGUgaHR0cDogYW55XHJcbiAgKSB7fVxyXG5cclxuICBwcml2YXRlIHNldEVudGl0eVR5cGUocmVzKSB7XHJcbiAgICBpZiAocmVzICYmIHJlcy5lbnRpdHlMaXN0ICYmIHJlcy5lbnRpdHlMaXN0Lmxlbmd0aCkge1xyXG4gICAgICBjb25zdCBlbnRpdHlEYXRhID0gcmVzLmVudGl0eUxpc3RbMF07XHJcbiAgICAgIGlmICghZW50aXR5RGF0YSkge1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgeyBsaW5rZWRUeXBlID0gXCJcIiB9ID0gZW50aXR5RGF0YTtcclxuICAgICAgaWYgKCFsaW5rZWRUeXBlKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmVudGl0eVR5cGUgPVxyXG4gICAgICAgIGxpbmtlZFR5cGUgPT09IFwiUHJvcGVydHlJZFwiXHJcbiAgICAgICAgICA/IFwiUHJvcGVydHlcIlxyXG4gICAgICAgICAgOiBsaW5rZWRUeXBlID09PSBcInBvcnRmb2xpb0NvbXBJZFwiIHx8XHJcbiAgICAgICAgICAgIGxpbmtlZFR5cGUgPT09IFwiYXNzZXRDb21wSWRcIiB8fFxyXG4gICAgICAgICAgICBsaW5rZWRUeXBlID09PSBcIm90aGVyQ29tcElkXCJcclxuICAgICAgICAgID8gXCJDb21wYW55XCJcclxuICAgICAgICAgIDogbGlua2VkVHlwZSA9PT0gXCJwb3J0Zm9saW9GdW5kSWRcIiB8fCBsaW5rZWRUeXBlID09PSBcImFzc2V0RnVuZElkXCJcclxuICAgICAgICAgID8gXCJGdW5kXCJcclxuICAgICAgICAgIDogXCJBc3NldFBvcnRmb2xpb1wiO1xyXG4gICAgICByZXMuZW50aXR5VHlwZSA9IHRoaXMuZW50aXR5VHlwZTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgR2V0RGFzaGJvYXJkVjEoXHJcbiAgICBkYXNoYm9hcmRJZDogc3RyaW5nLFxyXG4gICAgcm9HZXQsXHJcbiAgICBjYWxsYmFjazogRnVuY3Rpb24sXHJcbiAgICBpc1JlZnJlc2ggPSBmYWxzZSxcclxuICAgIGNhbGxiYWNrRm9yRGFzaGJvYXJkPzogRnVuY3Rpb25cclxuICApIHtcclxuICAgIGlmICghaXNSZWZyZXNoKSB7XHJcbiAgICAgIHRoaXMucG9ydGxldHMgPSBbXTtcclxuICAgIH1cclxuICAgIHRoaXMuZ2V0SW5mbygpO1xyXG4gICAgY29uc3QgZGF0YU9iaiA9IHsgZGFzaGJvYXJkSWQsIGxhbmd1YWdlOiB0aGlzLmxhbmcgfTtcclxuICAgIHRoaXMuaHR0cC5wb3N0KHRoaXMuYXBpLnVybExpc3QuR2V0RGFzaGJvYXJkVjIsIGRhdGFPYmosIChyZXMpID0+IHtcclxuICAgICAgcmVzID0gdGhpcy5wYmYuY29udmVydEtleXNUb0xvd2VyQ2FzZShyZXMpO1xyXG4gICAgICBpZiAoIXJlcykge1xyXG4gICAgICAgIGNhbGxiYWNrKG51bGwpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICByZXMgPSB0aGlzLnNldEVudGl0eVR5cGUocmVzKTtcclxuICAgICAgLy8g5Yid5aeL5YyWZnJvbURhdGVcclxuICAgICAgaWYgKHJlcy5mcm9tRGF0ZSA9PT0gXCIxOTAwLTAxLTAxVDAwOjAwOjAwWlwiKSB7XHJcbiAgICAgICAgcmVzLmZyb21EYXRlID0gXCJcIjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoY2FsbGJhY2tGb3JEYXNoYm9hcmQpIHtcclxuICAgICAgICBjYWxsYmFja0ZvckRhc2hib2FyZChyZXMpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZW50aXR5SWRzID1cclxuICAgICAgICByZXMuZW50aXR5TGlzdCAmJiByZXMuZW50aXR5TGlzdC5sZW5ndGggPiAwXHJcbiAgICAgICAgICA/IHJlcy5lbnRpdHlMaXN0Lm1hcCgoZSkgPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiBlW1wibGlua2VkR3VpZFwiXTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIDogW107XHJcbiAgICAgIGlmIChyZXMuZW50aXR5TGlzdCkgdGhpcy5lbnRpdHlMaXN0ID0gWy4uLnJlcy5lbnRpdHlMaXN0XTtcclxuICAgICAgdGhpcy5lbnRpdHlJZE9iaiA9IHtcclxuICAgICAgICBpZDogSlNPTi5zdHJpbmdpZnkodGhpcy5lbnRpdHlJZHMpLFxyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLnBvcnRsZXRSZXN1bHRzX05ld1tyZXMuaWRdID0ge307XHJcbiAgICAgIHRoaXMucG9ydGxldERhdGFfTmV3W3Jlcy5pZF0gPSB7fTtcclxuICAgICAgdGhpcy5EYXNoYm9hcmRTZXJ2aWNlLmRhc2hib2FyZEdyb3VwSWRbcmVzLmlkXSA9IHJlcy5kYXNoYm9hcmRHcm91cElkO1xyXG4gICAgICB0aGlzLkRhc2hib2FyZFNlcnZpY2UuZGFzaGJvYXJkR3JvdXBOYW1lW3Jlcy5pZF0gPSByZXMuZGFzaGJvYXJkR3JvdXBOYW1lO1xyXG4gICAgICB0aGlzLkRhc2hib2FyZFNlcnZpY2UuUmVnaW9uRGF0YVNldElkW3Jlcy5pZF0gPSByZXMuUmVnaW9uRGF0YVNldElkO1xyXG4gICAgICB0aGlzLkRhc2hib2FyZFNlcnZpY2UuZGFzaGJvYXJkTmFtZVtyZXMuaWRdID0gcmVzLm5hbWU7XHJcbiAgICAgIHRoaXMuRGFzaGJvYXJkU2VydmljZS5zaGFyZVVzZXJzW3Jlcy5pZF0gPSByZXMuc2hhcmVkVXNlcnM7XHJcbiAgICAgIHRoaXMuZGFzaGJvYXJkQ29uZmlnW3Jlcy5pZF0gPSByZXMuY29uZmlnICYmIEpTT04ucGFyc2UocmVzLmNvbmZpZyk7XHJcbiAgICAgIGlmIChyZXMpIHtcclxuICAgICAgICAvLyB0aGlzLmRhdGFNYXJ0VGFibGVzW3Jlcy5pZF0gPSB1bmlxQnkoXHJcbiAgICAgICAgLy8gXHRyZXMuZGF0YU1hcnRUYWJsZXMsXHJcbiAgICAgICAgLy8gXHRcImxhbmdDb2RlXCJcclxuICAgICAgICAvLyApO1xyXG4gICAgICAgIHRoaXMuZGF0YU1hcnRUYWJsZXNbcmVzLmlkXSA9IFsuLi5yZXMuZGF0YU1hcnRUYWJsZXNdO1xyXG4gICAgICAgIHRoaXMuc29ydERhdGFNYXJ0VGFibGVzKHRoaXMuZGF0YU1hcnRUYWJsZXNbcmVzLmlkXSk7XHJcbiAgICAgICAgdGhpcy5EYXNoYm9hcmRTZXJ2aWNlLmRhc2hib2FyZERlc2NyaXB0aW9uID0gcmVzLmRlc2NyaXB0aW9uO1xyXG4gICAgICAgIHRoaXMuaW1nID0gcmVzLmltZztcclxuICAgICAgICAvLyDlpoLmnpzlj6/pgInlvIDlp4vml6XmnJ/vvIzlsY/olL3pu5jorqTnmoQxOTAwLTAxLTAxXHJcbiAgICAgICAgdGhpcy5jdXJyZW5jeUNvZGUgPSByZXMuY3VycmVuY3lDb2RlO1xyXG4gICAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICAgIHRoaXMuY29sdW1uQ291bnQgPSByZXMuY29sdW1uQ291bnQgPyByZXMuY29sdW1uQ291bnQgOiA0O1xyXG4gICAgICAgIGlmIChyZXMucG9ydGxldHMpIHtcclxuICAgICAgICAgIGlmICghaXNSZWZyZXNoKSB7XHJcbiAgICAgICAgICAgIHRoaXMucG9ydGxldHMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlcy5wb3J0bGV0cykpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5yb3dDb3VudCA9XHJcbiAgICAgICAgICAgIHJlcy5wb3J0bGV0cy5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICAgPyBNYXRoLm1heC5hcHBseShcclxuICAgICAgICAgICAgICAgICAgTWF0aCxcclxuICAgICAgICAgICAgICAgICAgcmVzLnBvcnRsZXRzLm1hcChmdW5jdGlvbiAobykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvLnBvc1k7XHJcbiAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICApICsgMlxyXG4gICAgICAgICAgICAgIDogMjtcclxuXHJcbiAgICAgICAgICAvLyBuZXcgRGFzaGJvYXJkXHJcbiAgICAgICAgICBpZiAodGhpcy5wb3J0bGV0cyAmJiB0aGlzLnBvcnRsZXRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLmZpZWxkc0FycltyZXMuaWRdID0ge307XHJcbiAgICAgICAgICAgIHRoaXMucG9ydGxldHMuZm9yRWFjaCgoZWwpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAhT2JqZWN0LmtleXModGhpcy5maWVsZHNBcnJbcmVzLmlkXSkuaW5jbHVkZXMoZWwuZmlndXJlQ29kZSlcclxuICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmllbGRzQXJyW3Jlcy5pZF1bZWwuZmlndXJlQ29kZV0gPSBKU09OLnBhcnNlKFxyXG4gICAgICAgICAgICAgICAgICBlbC5jb25maWdcclxuICAgICAgICAgICAgICAgICkuZmllbGRzO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnBvcnRsZXRzID0gdGhpcy5wb3J0bGV0cy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uZmlndXJlQ29kZSk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0RGF0YUJ5UG9ydGxldHNOZXcoXHJcbiAgICAgICAgICAgICAgdGhpcy5wb3J0bGV0cyxcclxuICAgICAgICAgICAgICAoX3JlcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2socmVzLCB0aGlzLnBvcnRsZXRzKTtcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIG51bGwsXHJcbiAgICAgICAgICAgICAgaXNSZWZyZXNoLFxyXG4gICAgICAgICAgICAgIHJlcyxcclxuICAgICAgICAgICAgICByb0dldFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY2FsbGJhY2socmVzLCB0aGlzLnBvcnRsZXRzKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5wb3J0bGV0cyA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5jb2x1bW5Db3VudCA9IDQ7XHJcbiAgICAgICAgICB0aGlzLnJvd0NvdW50ID0gMjtcclxuICAgICAgICAgIGNhbGxiYWNrKHJlcywgdGhpcy5wb3J0bGV0cyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBmaWx0ZXJUcmlnZ2VyR2V0RGF0YShwb3J0bGV0LCBmaWx0ZXJTZXR0aW5ncywgZGFzaGJvYXJkLCBjYWxsYmFjaykge1xyXG4gICAgY29uc3QgY29uZmlnID0gcG9ydGxldC5jb25maWcgJiYgSlNPTi5wYXJzZShwb3J0bGV0LmNvbmZpZyk7XHJcbiAgICBsZXQgaWQgPVxyXG4gICAgICBwb3J0bGV0LmlkID09PSBcIjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMFwiXHJcbiAgICAgICAgPyBwb3J0bGV0Lm5ld0lkXHJcbiAgICAgICAgOiBwb3J0bGV0LmlkO1xyXG4gICAgbGV0IHBhcmFtcyA9IHRoaXMuZ2V0UGFyYW1zQnlQb3J0bGV0KHBvcnRsZXQsIG51bGwsIG51bGwsIGRhc2hib2FyZCk7XHJcbiAgICBsZXQgaW5pdEZpZWxkc0FycjtcclxuICAgIGxldCBjdXJGaWVsZHNBcnI7XHJcbiAgICBpZiAoIXBhcmFtcy5pc1RhYmxlKSB7XHJcbiAgICAgIC8vIOi1i+WAvHBvcnRsZXRGaWVsZHNfVGVtcFxyXG4gICAgICBpbml0RmllbGRzQXJyID0gdGhpcy5wb3J0bGV0RmllbGRzX1RlbXBbaWRdO1xyXG4gICAgICBjdXJGaWVsZHNBcnIgPSBwYXJhbXMuZGlzcGxheUNvbHVtbkZpbHRlci5zcGxpdChcIixcIik7XHJcbiAgICAgIGlmIChcclxuICAgICAgICAhaW5pdEZpZWxkc0FyciB8fFxyXG4gICAgICAgIHRoaXMubmVlZEdldFBvcnRsZXREYXRhKGluaXRGaWVsZHNBcnIsIGN1ckZpZWxkc0FycilcclxuICAgICAgKSB7XHJcbiAgICAgICAgdGhpcy5wb3J0bGV0RmllbGRzX1RlbXBbaWRdID0gY3VyRmllbGRzQXJyO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoZmlsdGVyU2V0dGluZ3MgJiYgZmlsdGVyU2V0dGluZ3MubGVuZ3RoKSB7XHJcbiAgICAgIGlmICghcGFyYW1zLmNvbHVtbkZpbHRlcikge1xyXG4gICAgICAgIHBhcmFtcy5jb2x1bW5GaWx0ZXIgPSBbXTtcclxuICAgICAgfVxyXG4gICAgICBjb25maWcuZmlsdGVyU2V0dGluZ3MgPSBmaWx0ZXJTZXR0aW5ncztcclxuXHJcbiAgICAgIGZpbHRlclNldHRpbmdzLmZvckVhY2goKHNldHRpbmcpID0+IHtcclxuICAgICAgICBpZiAoY29uZmlnLnBvcnRsZXRUeXBlID09PSBcInBpdm90XCIpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgX2ZpZWxkID0gY29uZmlnLmZpZWxkcy5maW5kKFxyXG4gICAgICAgICAgKGl0ZW0pID0+IGl0ZW0uY29sTmFtZSA9PT0gc2V0dGluZy5uYW1lXHJcbiAgICAgICAgKTtcclxuICAgICAgICBjb25zdCBUeXBlID0gX2ZpZWxkICYmIF9maWVsZC5kYXRhVHlwZTtcclxuICAgICAgICBpZiAoc2V0dGluZy5pdGVtcykge1xyXG4gICAgICAgICAgc2V0dGluZy5pdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgIHBhcmFtcy5jb2x1bW5GaWx0ZXIucHVzaCh7XHJcbiAgICAgICAgICAgICAgRmllbGQ6IHNldHRpbmcubmFtZSxcclxuICAgICAgICAgICAgICBPcGVyYXRvcjogXCJlcXVhbFwiLFxyXG4gICAgICAgICAgICAgIFR5cGUsXHJcbiAgICAgICAgICAgICAgVmFsdWU6XHJcbiAgICAgICAgICAgICAgICBUeXBlID09PSBcImRhdGVcIlxyXG4gICAgICAgICAgICAgICAgICA/IG1vbWVudChpdGVtKS5mb3JtYXQoXCJ5eXl5LU1NLUREXCIpXHJcbiAgICAgICAgICAgICAgICAgIDogVHlwZSA9PT0gXCJkYXRldGltZVwiXHJcbiAgICAgICAgICAgICAgICAgID8gbW9tZW50KGl0ZW0pLmZvcm1hdChcInl5eXktTU0tREQgaGg6bW06c3NcIilcclxuICAgICAgICAgICAgICAgICAgOiBpdGVtLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoc2V0dGluZy5vcGVyYXRvcikge1xyXG4gICAgICAgICAgcGFyYW1zLmNvbHVtbkZpbHRlci5wdXNoKHtcclxuICAgICAgICAgICAgRmllbGQ6IHNldHRpbmcuZmllbGQsXHJcbiAgICAgICAgICAgIE9wZXJhdG9yOiBcImVxdWFsXCIsXHJcbiAgICAgICAgICAgIFR5cGU6IHNldHRpbmcudHlwZSxcclxuICAgICAgICAgICAgVmFsdWU6XHJcbiAgICAgICAgICAgICAgc2V0dGluZy50eXBlID09PSBcImRhdGVcIlxyXG4gICAgICAgICAgICAgICAgPyBtb21lbnQoc2V0dGluZy52YWx1ZSkuZm9ybWF0KFwieXl5eS1NTS1ERFwiKVxyXG4gICAgICAgICAgICAgICAgOiBzZXR0aW5nLnR5cGUgPT09IFwiZGF0ZXRpbWVcIlxyXG4gICAgICAgICAgICAgICAgPyBtb21lbnQoc2V0dGluZy52YWx1ZSkuZm9ybWF0KFwieXl5eS1NTS1ERCBoaDptbTpzc1wiKVxyXG4gICAgICAgICAgICAgICAgOiBzZXR0aW5nLnZhbHVlLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbmZpZy5maWx0ZXJTZXR0aW5ncyA9IFtdO1xyXG4gICAgfVxyXG4gICAgaWYgKHBhcmFtcy5jb2x1bW5GaWx0ZXIgaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICBwYXJhbXMuY29sdW1uRmlsdGVyID0gcGFyYW1zLmNvbHVtbkZpbHRlci5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uRmllbGQpO1xyXG4gICAgfVxyXG4gICAgLy8ganNvbiBidWZmZXJcclxuICAgIHBhcmFtc1tcImRhc2hib2FyZFZlcnNpb25cIl0gPSAyO1xyXG4gICAgLy8ganNvbiBidWZmZXJcclxuICAgIHRoaXMuaHR0cENsaWVudFxyXG4gICAgICAucG9zdChcclxuICAgICAgICB0aGlzLmFwaS5iYXNldXJsICsgdGhpcy5hcGkudXJsTGlzdC5HZXRQb3J0bGV0RGF0YU9yQ3JlYXRlLFxyXG4gICAgICAgIHBhcmFtcyxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xyXG4gICAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyYCxcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgIH1cclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcclxuICAgICAgICByZXN1bHRbXCJkYXRhXCJdLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICAgIGl0ZW0uU2VjdG9yID0gdGhpcy50cmFuc2xhdGlvbltpdGVtLlNlY3Rvcl0gfHwgaXRlbS5TZWN0b3I7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5wb3J0bGV0RGF0YV9OZXdbZGFzaGJvYXJkLmlkXVtpZF0gPSByZXN1bHQ7XHJcbiAgICAgICAgdGhpcy5wYmYudHJpZ2dlckRhc2hib2FyZEZpbHRlckNoYW5nZS5uZXh0KHtcclxuICAgICAgICAgIGlkOiBkYXNoYm9hcmQuaWQsXHJcbiAgICAgICAgICBuZXdJZDogcG9ydGxldC5uZXdJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjYWxsYmFjayh7IG5ld0lkOiBwb3J0bGV0ICYmIHBvcnRsZXQubmV3SWQsIGNvbmZpZyB9KTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVtb3ZlUGFyZW50aGVzZXMoc3RyKSB7XHJcbiAgICByZXR1cm4gc3RyLnNwbGl0KFwiKFwiKS5qb2luKFwiXCIpLnNwbGl0KFwiKVwiKS5qb2luKFwiXCIpLnNwbGl0KCdcIicpLmpvaW4oXCJcIik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0SW5mbygpIHtcclxuICAgIHRoaXMudHJhbnNsYXRpb24gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwidHJhbnNsYXRpb25cIikpO1xyXG4gICAgdGhpcy51c2VySW5mbyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJ1c2VySW5mb1wiKSk7XHJcbiAgICB0aGlzLmxhbmcgPSB0aGlzLnBiZi5nZXRMYW5ndWFnZVBhcmFtcygpO1xyXG4gICAgdGhpcy50cmFuc2xhdGlvbi5EQVNIQk9BUkRfUk9MTElORyA9IHRoaXMudHJhbnNsYXRpb24uREFTSEJPQVJEX1JPTExJTkdcclxuICAgICAgPyB0aGlzLnRyYW5zbGF0aW9uLkRBU0hCT0FSRF9ST0xMSU5HXHJcbiAgICAgIDogXCJEQVNIQk9BUkRfUk9MTElOR1wiO1xyXG4gIH1cclxuXHJcbiAgLyogICAgIEZpbmFuY2lhbCBBbmFseXNpcyBJICAgICAgZ2V0IHNlbGVjdCBEcm9wZG93biAqL1xyXG4gIHB1YmxpYyBHZXRDaGFydFR5cGVzKCkge1xyXG4gICAgLy8gQ2hhcnQgVHlwZVxyXG4gICAgcmV0dXJuIFtcclxuICAgICAge1xyXG4gICAgICAgIHZhbDogXCJtc2NvbWJpMmRcIixcclxuICAgICAgICBkaXNwbGF5VmFsOiB0aGlzLnRyYW5zbGF0aW9uLlNJTkdMRVkyRCxcclxuICAgICAgICBoYXNTZWNvbmRhcnlZQXhpczogZmFsc2UsXHJcbiAgICAgICAgY2FuU2VsZWN0U3R5bGU6IHRydWUsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICB2YWw6IFwibXNjb21iaTNkXCIsXHJcbiAgICAgICAgZGlzcGxheVZhbDogdGhpcy50cmFuc2xhdGlvbi5TSU5HTEVZM0QsXHJcbiAgICAgICAgaGFzU2Vjb25kYXJ5WUF4aXM6IGZhbHNlLFxyXG4gICAgICAgIGNhblNlbGVjdFN0eWxlOiB0cnVlLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdmFsOiBcIm1zY29tYmlkeTJkXCIsXHJcbiAgICAgICAgZGlzcGxheVZhbDogdGhpcy50cmFuc2xhdGlvbi5EVUFMWTJELFxyXG4gICAgICAgIGhhc1NlY29uZGFyeVlBeGlzOiB0cnVlLFxyXG4gICAgICAgIGNhblNlbGVjdFN0eWxlOiB0cnVlLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdmFsOiBcIm1zYmFyMmRcIixcclxuICAgICAgICBkaXNwbGF5VmFsOiB0aGlzLnRyYW5zbGF0aW9uLkJBUjJELFxyXG4gICAgICAgIGhhc1NlY29uZGFyeVlBeGlzOiBmYWxzZSxcclxuICAgICAgICBjYW5TZWxlY3RTdHlsZTogZmFsc2UsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICB2YWw6IFwibXNiYXIzZFwiLFxyXG4gICAgICAgIGRpc3BsYXlWYWw6IHRoaXMudHJhbnNsYXRpb24uQkFSM0QsXHJcbiAgICAgICAgaGFzU2Vjb25kYXJ5WUF4aXM6IGZhbHNlLFxyXG4gICAgICAgIGNhblNlbGVjdFN0eWxlOiBmYWxzZSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHZhbDogXCJzdGFja2VkY29sdW1uMmRsaW5lXCIsXHJcbiAgICAgICAgZGlzcGxheVZhbDogdGhpcy50cmFuc2xhdGlvbi5TVEFDS0VEQkFSMkQsXHJcbiAgICAgICAgaGFzU2Vjb25kYXJ5WUF4aXM6IGZhbHNlLFxyXG4gICAgICAgIGNhblNlbGVjdFN0eWxlOiB0cnVlLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdmFsOiBcInN0YWNrZWRjb2x1bW4zZGxpbmVcIixcclxuICAgICAgICBkaXNwbGF5VmFsOiB0aGlzLnRyYW5zbGF0aW9uLlNUQUNLRURCQVIzRCxcclxuICAgICAgICBoYXNTZWNvbmRhcnlZQXhpczogZmFsc2UsXHJcbiAgICAgICAgY2FuU2VsZWN0U3R5bGU6IHRydWUsXHJcbiAgICAgIH0sXHJcbiAgICBdO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0Q29tcGFueURyb3Bkb3duKCkge1xyXG4gICAgLy8gY29tcGFueVxyXG4gICAgbGV0IGRhdGEgPSB7XHJcbiAgICAgIGFjY291bnRJZDogdGhpcy51c2VySW5mby5hY2NvdW50SWQsXHJcbiAgICAgIHVzZXJuYW1lOiB0aGlzLnVzZXJJbmZvLnVzZXJuYW1lLFxyXG4gICAgICBsYW5ndWFnZTogdGhpcy5sYW5nLFxyXG4gICAgICBjb21wYW55VHlwZTogXCJwb3J0Zm9saW9cIixcclxuICAgIH07XHJcbiAgICB0aGlzLmh0dHAucG9zdCh0aGlzLmFwaS51cmxMaXN0LkdldEFsbENvbXBhbnlCeUFjY291bnQsIGRhdGEsIChyZXMpID0+IHtcclxuICAgICAgaWYgKHJlcykge1xyXG4gICAgICAgIHRoaXMuY29tcGFueURyb3Bkb3duTGlzdCA9IHJlcztcclxuICAgICAgICAvLyByZXR1cm4gcmVzO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgcHVibGljIGdldEN1cnJlbmN5RHJvcGRvd24oKSB7XHJcbiAgICAvLyBDdXJyZW5jeVxyXG4gICAgbGV0IGRhdGEgPSB7XHJcbiAgICAgIGFjY291bnRJZDogdGhpcy51c2VySW5mby5hY2NvdW50SWQsXHJcbiAgICAgIHVzZXJuYW1lOiB0aGlzLnVzZXJJbmZvLnVzZXJuYW1lLFxyXG4gICAgICBsYW5ndWFnZTogdGhpcy5sYW5nLFxyXG4gICAgICBhbGlhczogXCJDdXJyZW5jeVwiLFxyXG4gICAgfTtcclxuICAgIHRoaXMuaHR0cC5wb3N0KHRoaXMuYXBpLnVybExpc3QuR2V0RHJvcGRvd24sIGRhdGEsIChyZXMpID0+IHtcclxuICAgICAgaWYgKHJlcykge1xyXG4gICAgICAgIHRoaXMuY3VycmVuY3lEcm9wZG93bkxpc3QgPSByZXM7XHJcbiAgICAgICAgLy8gcmV0dXJuIHJlcztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHB1YmxpYyBHZXRUaW1lTWVhc3VyZSgpIHtcclxuICAgIC8vIFRpbWUgTWVhc3VyZVxyXG4gICAgcmV0dXJuIFtcclxuICAgICAge1xyXG4gICAgICAgIGtleTogXCJNVERcIiwgLy8g5pyI5bqmXHJcbiAgICAgICAgdmFsOiB0aGlzLnRyYW5zbGF0aW9uLk1PTlRITFksXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBrZXk6IFwiUVREXCIsIC8vIOWto+W6plxyXG4gICAgICAgIHZhbDogdGhpcy50cmFuc2xhdGlvbi5RVUFSVEVSTFksXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBrZXk6IFwiU1lURFwiLCAvLyDljYrlubTluqZcclxuICAgICAgICB2YWw6IHRoaXMudHJhbnNsYXRpb24uU0VNSUFOTlVBTExZLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAga2V5OiBcIllURFwiLCAvLyDlubTluqZcclxuICAgICAgICB2YWw6IHRoaXMudHJhbnNsYXRpb24uQU5OVUFMTFksXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBrZXk6IFwiRllURFwiLCAvLyDlubTluqbvvIjotKLmlL/lubTluqbvvIlcclxuICAgICAgICB2YWw6IHRoaXMudHJhbnNsYXRpb24uQU5OVUFMTFlGWSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGtleTogXCJMVE1cIiwgLy8g5pyA6L+R5Y2B5LqM5Liq5pyIXHJcbiAgICAgICAgdmFsOiB0aGlzLnRyYW5zbGF0aW9uLkxBU1QxMk1PTlRILFxyXG4gICAgICB9LFxyXG4gICAgXTtcclxuICB9XHJcbiAgcHVibGljIEdldFBlcmlvZHMoKSB7XHJcbiAgICAvLyBQcmV2aW91cyBQZXJpb2RcclxuICAgIHJldHVybiBbXHJcbiAgICAgIHtcclxuICAgICAgICB2YWw6IDIsXHJcbiAgICAgICAgZGlzcGxheVZhbDogdGhpcy50cmFuc2xhdGlvbi5MQVNUMkRBVEEsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICB2YWw6IDMsXHJcbiAgICAgICAgZGlzcGxheVZhbDogdGhpcy50cmFuc2xhdGlvbi5MQVNUM0RBVEEsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICB2YWw6IDQsXHJcbiAgICAgICAgZGlzcGxheVZhbDogdGhpcy50cmFuc2xhdGlvbi5MQVNUNERBVEEsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICB2YWw6IDUsXHJcbiAgICAgICAgZGlzcGxheVZhbDogdGhpcy50cmFuc2xhdGlvbi5MQVNUNURBVEEsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICB2YWw6IDYsXHJcbiAgICAgICAgZGlzcGxheVZhbDogdGhpcy50cmFuc2xhdGlvbi5MQVNUNkRBVEEsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICB2YWw6IDcsXHJcbiAgICAgICAgZGlzcGxheVZhbDogdGhpcy50cmFuc2xhdGlvbi5MQVNUN0RBVEEsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICB2YWw6IDgsXHJcbiAgICAgICAgZGlzcGxheVZhbDogdGhpcy50cmFuc2xhdGlvbi5MQVNUOERBVEEsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICB2YWw6IDksXHJcbiAgICAgICAgZGlzcGxheVZhbDogdGhpcy50cmFuc2xhdGlvbi5MQVNUOURBVEEsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICB2YWw6IDEwLFxyXG4gICAgICAgIGRpc3BsYXlWYWw6IHRoaXMudHJhbnNsYXRpb24uTEFTVDEwREFUQSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHZhbDogMTEsXHJcbiAgICAgICAgZGlzcGxheVZhbDogdGhpcy50cmFuc2xhdGlvbi5MQVNUMTFEQVRBLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdmFsOiAxMixcclxuICAgICAgICBkaXNwbGF5VmFsOiB0aGlzLnRyYW5zbGF0aW9uLkxBU1QxMkRBVEEsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICB2YWw6IDEzLFxyXG4gICAgICAgIGRpc3BsYXlWYWw6IHRoaXMudHJhbnNsYXRpb24uTEFTVDEzREFUQSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHZhbDogMTQsXHJcbiAgICAgICAgZGlzcGxheVZhbDogdGhpcy50cmFuc2xhdGlvbi5MQVNUMTREQVRBLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdmFsOiAxNSxcclxuICAgICAgICBkaXNwbGF5VmFsOiB0aGlzLnRyYW5zbGF0aW9uLkxBU1QxNURBVEEsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICB2YWw6IDE2LFxyXG4gICAgICAgIGRpc3BsYXlWYWw6IHRoaXMudHJhbnNsYXRpb24uTEFTVDE2REFUQSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHZhbDogMTcsXHJcbiAgICAgICAgZGlzcGxheVZhbDogdGhpcy50cmFuc2xhdGlvbi5MQVNUMTdEQVRBLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdmFsOiAxOCxcclxuICAgICAgICBkaXNwbGF5VmFsOiB0aGlzLnRyYW5zbGF0aW9uLkxBU1QxOERBVEEsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICB2YWw6IDE5LFxyXG4gICAgICAgIGRpc3BsYXlWYWw6IHRoaXMudHJhbnNsYXRpb24uTEFTVDE5REFUQSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHZhbDogMjAsXHJcbiAgICAgICAgZGlzcGxheVZhbDogdGhpcy50cmFuc2xhdGlvbi5MQVNUMjBEQVRBLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdmFsOiAyMSxcclxuICAgICAgICBkaXNwbGF5VmFsOiB0aGlzLnRyYW5zbGF0aW9uLkxBU1QyMURBVEEsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICB2YWw6IDIyLFxyXG4gICAgICAgIGRpc3BsYXlWYWw6IHRoaXMudHJhbnNsYXRpb24uTEFTVDIyREFUQSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHZhbDogMjMsXHJcbiAgICAgICAgZGlzcGxheVZhbDogdGhpcy50cmFuc2xhdGlvbi5MQVNUMjNEQVRBLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdmFsOiAyNCxcclxuICAgICAgICBkaXNwbGF5VmFsOiB0aGlzLnRyYW5zbGF0aW9uLkxBU1QyNERBVEEsXHJcbiAgICAgIH0sXHJcbiAgICBdO1xyXG4gIH1cclxuICBwdWJsaWMgR2V0Rm9sbG93aW5nUGVyaW9kcygpIHtcclxuICAgIC8vIEZvbGxvd2luZyBQZXJpb2RcclxuICAgIHJldHVybiBbXHJcbiAgICAgIHtcclxuICAgICAgICB2YWw6IDAsXHJcbiAgICAgICAgZGlzcGxheVZhbDogdGhpcy50cmFuc2xhdGlvbi5OT05FWFREQVRBLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdmFsOiAzLFxyXG4gICAgICAgIGRpc3BsYXlWYWw6IHRoaXMudHJhbnNsYXRpb24uTkVYVDNEQVRBLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdmFsOiA0LFxyXG4gICAgICAgIGRpc3BsYXlWYWw6IHRoaXMudHJhbnNsYXRpb24uTkVYVDREQVRBLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdmFsOiA1LFxyXG4gICAgICAgIGRpc3BsYXlWYWw6IHRoaXMudHJhbnNsYXRpb24uTkVYVDVEQVRBLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdmFsOiA2LFxyXG4gICAgICAgIGRpc3BsYXlWYWw6IHRoaXMudHJhbnNsYXRpb24uTkVYVDZEQVRBLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdmFsOiA3LFxyXG4gICAgICAgIGRpc3BsYXlWYWw6IHRoaXMudHJhbnNsYXRpb24uTkVYVDdEQVRBLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdmFsOiA4LFxyXG4gICAgICAgIGRpc3BsYXlWYWw6IHRoaXMudHJhbnNsYXRpb24uTkVYVDhEQVRBLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdmFsOiA5LFxyXG4gICAgICAgIGRpc3BsYXlWYWw6IHRoaXMudHJhbnNsYXRpb24uTkVYVDlEQVRBLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdmFsOiAxMCxcclxuICAgICAgICBkaXNwbGF5VmFsOiB0aGlzLnRyYW5zbGF0aW9uLk5FWFQxMERBVEEsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICB2YWw6IDExLFxyXG4gICAgICAgIGRpc3BsYXlWYWw6IHRoaXMudHJhbnNsYXRpb24uTkVYVDExREFUQSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHZhbDogMTIsXHJcbiAgICAgICAgZGlzcGxheVZhbDogdGhpcy50cmFuc2xhdGlvbi5ORVhUMTJEQVRBLFxyXG4gICAgICB9LFxyXG4gICAgXTtcclxuICB9XHJcbiAgcHVibGljIEdldEZpbmFuY2lhbEZpZ3VyZUNvZGVzKCkge1xyXG4gICAgLy8gRmluYW5jaWFsIFR5cGVcclxuICAgIHJldHVybiBbXHJcbiAgICAgIHtcclxuICAgICAgICBrZXk6IFwiYWNjb3VudEFzc2V0RmlndXJlXCIsXHJcbiAgICAgICAgdmFsOiB0aGlzLnRyYW5zbGF0aW9uLkRBU0hEX0FDQ09VTlRBU1NFVEZJR1VSRSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGtleTogXCJhY2NvdW50RXF1aXR5RmlndXJlXCIsXHJcbiAgICAgICAgdmFsOiB0aGlzLnRyYW5zbGF0aW9uLkRBU0hEX0FDQ09VTlRFUVVJVFlGSUdVUkUsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBrZXk6IFwiYWNjb3VudExpYWJpbGl0eUZpZ3VyZVwiLFxyXG4gICAgICAgIHZhbDogdGhpcy50cmFuc2xhdGlvbi5EQVNIRF9BQ0NPVU5UTElBQklMSVRZRklHVVJFLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAga2V5OiBcImFjY291bnRQTEZpZ3VyZVwiLFxyXG4gICAgICAgIHZhbDogdGhpcy50cmFuc2xhdGlvbi5EQVNIRF9BQ0NPVU5UUExGSUdVUkUsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBrZXk6IFwiYWNjb3VudENhc2hmbG93RmlndXJlXCIsXHJcbiAgICAgICAgdmFsOiB0aGlzLnRyYW5zbGF0aW9uLkRBU0hEX0FDQ09VTlRDQVNIRkxPV0ZJR1VSRSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGtleTogXCJhY2NvdW50T3BlcmF0aW9uS1BJRmlndXJlXCIsXHJcbiAgICAgICAgdmFsOiB0aGlzLnRyYW5zbGF0aW9uLkRBU0hEX0FDQ09VTlRPUEVSQVRJT05LUElGSUdVUkUsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBrZXk6IFwiYWNjb3VudFJBVElPRmlndXJlXCIsXHJcbiAgICAgICAgdmFsOiB0aGlzLnRyYW5zbGF0aW9uLkRBU0hEX0FDQ09VTlRSQVRJT0ZJR1VSRSxcclxuICAgICAgfSxcclxuICAgIF07XHJcbiAgfVxyXG4gIHB1YmxpYyBHZXRGaW5hbmNpYWxTdWJUeXBlKGZpbmFuY2lhbHMpIHtcclxuICAgIHZhciBmaW5hbmNpYWxUeXBlcyA9IFtdO1xyXG4gICAgZm9yICh2YXIgaXRlbSBpbiBmaW5hbmNpYWxzKSB7XHJcbiAgICAgIGZpbmFuY2lhbFR5cGVzLnB1c2goe1xyXG4gICAgICAgIHN1YlR5cGU6IGl0ZW1bXCJzdWJUeXBlXCJdLFxyXG4gICAgICAgIHN1YlR5cGVDb2RlOiBpdGVtW1wic3ViVHlwZUNvZGVcIl0sXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmaW5hbmNpYWxUeXBlcztcclxuICB9XHJcbiAgcHVibGljIEdldEZpbmFuY2lhbEl0ZW1zKGlkLCBrZXkpIHtcclxuICAgIGxldCBkYXRhID0ge1xyXG4gICAgICB1c2VybmFtZTogdGhpcy51c2VySW5mby51c2VybmFtZSxcclxuICAgICAgYWNjb3VudElkOiB0aGlzLnVzZXJJbmZvLmFjY291bnRJZCxcclxuICAgICAgaW52ZXN0ZWVJZHM6IFtpZF0sXHJcbiAgICAgIGZpZ3VyZUNvZGU6IGtleSxcclxuICAgICAgbGFuZ3VhZ2U6IHRoaXMubGFuZyxcclxuICAgIH07XHJcbiAgICB0aGlzLmh0dHAucG9zdCh0aGlzLmFwaS51cmxMaXN0LkdldEZpbmFuY2lhbEl0ZW1zLCBkYXRhLCAocmVzKSA9PiB7XHJcbiAgICAgIGlmIChyZXMpIHtcclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgLyogZ2V0IHRvZ2dsZSAqL1xyXG4gIHB1YmxpYyBHZXRUaGVtZSgpIHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgIHsga2V5OiBcInp1bmVcIiwgdmFsOiB0aGlzLnRyYW5zbGF0aW9uLkNIQVJUVEhFTUVfWlVORSB9LFxyXG4gICAgICB7IGtleTogXCJvY2VhblwiLCB2YWw6IHRoaXMudHJhbnNsYXRpb24uQ0hBUlRUSEVNRV9PQ0VBTiB9LFxyXG4gICAgICB7IGtleTogXCJjYXJib25cIiwgdmFsOiB0aGlzLnRyYW5zbGF0aW9uLkNIQVJUVEhFTUVfQ0FSQk9OIH0sXHJcbiAgICBdO1xyXG4gIH1cclxuICBwdWJsaWMgR2V0Rm9sbG93aW5nRGF0YVR5cGUoKSB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICB7IGtleTogXCJidWRnZXRcIiwgdmFsOiB0aGlzLnRyYW5zbGF0aW9uLkJVREdFVCB9LFxyXG4gICAgICB7IGtleTogXCJmb3JlY2FzdFwiLCB2YWw6IHRoaXMudHJhbnNsYXRpb24uRk9SRUNBU1QgfSxcclxuICAgICAgLy8geyBrZXk6ICdyb2xsaW5nJywgdmFsOiB0aGlzLnRyYW5zbGF0aW9uLkRBU0hCT0FSRF9ST0xMSU5HIH0sXHJcbiAgICAgIHsga2V5OiBcInJvbGxpbmdcIiwgdmFsOiBcIlJvbGxpbmdcIiB9LFxyXG4gICAgXTtcclxuICB9XHJcbiAgcHVibGljIEdldEZvcm1hdCgpIHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgIHsga2V5OiBcIm51bWJlclwiLCB2YWw6IHRoaXMudHJhbnNsYXRpb24uTlVNQkVSIH0sXHJcbiAgICAgIHsga2V5OiBcInBlcmNlbnRhZ2VcIiwgdmFsOiB0aGlzLnRyYW5zbGF0aW9uLlBFUkNFTlRBR0UgfSxcclxuICAgIF07XHJcbiAgfVxyXG4gIHB1YmxpYyBHZXRDaGFydFN0eWxlKCkge1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgeyBrZXk6IFwiYmFyXCIsIHZhbDogdGhpcy50cmFuc2xhdGlvbi5CQVIgfSxcclxuICAgICAgeyBrZXk6IFwibGluZVwiLCB2YWw6IHRoaXMudHJhbnNsYXRpb24uTElORSB9LFxyXG4gICAgICB7IGtleTogXCJhcmVhXCIsIHZhbDogdGhpcy50cmFuc2xhdGlvbi5BUkVBIH0sXHJcbiAgICBdO1xyXG4gIH1cclxuICBwdWJsaWMgR2V0RGF0YVR5cGVzID0gZnVuY3Rpb24gKCkge1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgeyBrZXk6IFwiYnVkZ2V0XCIsIHZhbDogdGhpcy50cmFuc2xhdGlvbi5CVURHRVQgfSxcclxuICAgICAgeyBrZXk6IFwiYWN0dWFsXCIsIHZhbDogdGhpcy50cmFuc2xhdGlvbi5BQ1RVQUwgfSxcclxuICAgICAgeyBrZXk6IFwiZm9yZWNhc3RcIiwgdmFsOiB0aGlzLnRyYW5zbGF0aW9uLkZPUkVDQVNUIH0sXHJcbiAgICAgIHsga2V5OiBcInJvbGxpbmdcIiwgdmFsOiBcIlJvbGxpbmdcIiB9LFxyXG4gICAgXTtcclxuICB9O1xyXG4gIC8qICAgICBGdW5kIE9wZXJhdGlvbiBTdW1tYXJ5ICAgICAgICovXHJcbiAgcHVibGljIGdldEZ1bmREcm9wZG93bigpIHtcclxuICAgIGxldCBkYXRhID0ge1xyXG4gICAgICB1c2VybmFtZTogdGhpcy51c2VySW5mby51c2VybmFtZSxcclxuICAgICAgYWNjb3VudElkOiB0aGlzLnVzZXJJbmZvLmFjY291bnRJZCxcclxuICAgICAgaW52ZXN0b3JJZDogdGhpcy51c2VySW5mby5hY2NvdW50SWQsXHJcbiAgICAgIGxhbmd1YWdlOiB0aGlzLmxhbmcsXHJcbiAgICB9O1xyXG4gICAgdGhpcy5odHRwLnBvc3QodGhpcy5hcGkudXJsTGlzdC5HZXRGdW5kTGlzdEJ5SW52ZXN0b3JJZCwgZGF0YSwgKHJlcykgPT4ge1xyXG4gICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgdGhpcy5mdW5kRHJvcGRvd25MaXN0ID0gcmVzO1xyXG4gICAgICAgIC8vIHJldHVybiByZXM7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuICAvKiAgICAgRnVuZCBwZXJmb3JtYW5jZSAgICAgICAqL1xyXG4gIHB1YmxpYyBHZXRHcm91cGluZygpIHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgIHsga2V5OiBcIm51bGxcIiwgdmFsOiBcIlwiIH0sXHJcbiAgICAgIHsga2V5OiBcImludmVzdG9yXCIsIHZhbDogdGhpcy50cmFuc2xhdGlvbi5EQVNIRF9HUF9JTlZFU1RPUiB9LFxyXG4gICAgICB7IGtleTogXCJmdW5kXCIsIHZhbDogdGhpcy50cmFuc2xhdGlvbi5EQVNIRF9HUF9GVU5EIH0sXHJcbiAgICBdO1xyXG4gIH1cclxuICAvKiAgICAgRnVuZCBPcGVyYXRpb24gU3VtbWFyeSAgICAgICAqL1xyXG4gIHB1YmxpYyBnZXRGdW5kRHJvcGRvd25fKGNhbGxiYWtlOiBGdW5jdGlvbikge1xyXG4gICAgbGV0IGRhdGEgPSB7XHJcbiAgICAgIHVzZXJuYW1lOiB0aGlzLnVzZXJJbmZvLnVzZXJuYW1lLFxyXG4gICAgICBhY2NvdW50SWQ6IHRoaXMudXNlckluZm8uYWNjb3VudElkLFxyXG4gICAgICBpbnZlc3RvcklkOiB0aGlzLnVzZXJJbmZvLmFjY291bnRJZCxcclxuICAgICAgbGFuZ3VhZ2U6IHRoaXMubGFuZyxcclxuICAgIH07XHJcbiAgICB0aGlzLmh0dHAucG9zdCh0aGlzLmFwaS51cmxMaXN0LkdldEZ1bmRMaXN0QnlJbnZlc3RvcklkLCBkYXRhLCAocmVzKSA9PiB7XHJcbiAgICAgIGlmIChyZXMpIHtcclxuICAgICAgICB0aGlzLmZ1bmREcm9wZG93bkxpc3QgPSByZXM7XHJcbiAgICAgICAgLy8gdGhpcy5HZXRBbGxJbnZlc3RlZShyZXMgPT4ge1xyXG4gICAgICAgIGNhbGxiYWtlKCk7XHJcbiAgICAgICAgLy8gfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuICAvKiAgICAgSW52ZXN0b3IgcG9zaXRpb24gICAgICAgKi9cclxuICBwdWJsaWMgR2V0QWxsSW52ZXN0ZWUoY2FsbGJha2U6IEZ1bmN0aW9uKSB7XHJcbiAgICBsZXQgZGF0YSA9IHtcclxuICAgICAgdXNlcm5hbWU6IHRoaXMudXNlckluZm8udXNlcm5hbWUsXHJcbiAgICAgIGFjY291bnRJZDogdGhpcy51c2VySW5mby5hY2NvdW50SWQsXHJcbiAgICAgIGxhbmd1YWdlOiB0aGlzLmxhbmcsXHJcbiAgICB9O1xyXG4gICAgdGhpcy5odHRwLnBvc3QodGhpcy5hcGkudXJsTGlzdC5HZXRBbGxJbnZlc3RlZSwgZGF0YSwgKHJlcykgPT4ge1xyXG4gICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgdGhpcy5hbGxJbnZlc3RlZUxpc3QgPSByZXM7XHJcbiAgICAgICAgY2FsbGJha2UoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHB1YmxpYyBwaXZvdFRhYmxlZm9ybWF0TnVtYmVyKG51bSkge1xyXG4gICAgc3dpdGNoIChudW0pIHtcclxuICAgICAgY2FzZSAxOlxyXG4gICAgICBjYXNlIDI6XHJcbiAgICAgIGNhc2UgMzpcclxuICAgICAgICByZXR1cm4gXCIjLCMjIzsoIywjIyMpXCI7XHJcbiAgICAgIGNhc2UgNDpcclxuICAgICAgY2FzZSA1OlxyXG4gICAgICBjYXNlIDY6XHJcbiAgICAgICAgcmV0dXJuIFwiIywjIyMuMDsoIywjIyMuMClcIjtcclxuICAgICAgY2FzZSA3OlxyXG4gICAgICBjYXNlIDg6XHJcbiAgICAgIGNhc2UgOTpcclxuICAgICAgICByZXR1cm4gXCIjLCMjIy4wMDsoIywjIyMuMDApXCI7XHJcbiAgICAgIGNhc2UgMTA6XHJcbiAgICAgIGNhc2UgMTE6XHJcbiAgICAgIGNhc2UgMTI6XHJcbiAgICAgICAgcmV0dXJuIFwiIywjIyMsLDsoIywjIyMsLClcIjtcclxuICAgICAgY2FzZSAxMzpcclxuICAgICAgY2FzZSAxNDpcclxuICAgICAgY2FzZSAxNTpcclxuICAgICAgICByZXR1cm4gXCIjLCMjIywsLjA7KCMsIyMjLCwuMClcIjtcclxuICAgICAgY2FzZSAxNjpcclxuICAgICAgY2FzZSAxNzpcclxuICAgICAgY2FzZSAxODpcclxuICAgICAgICByZXR1cm4gXCIjLCMjIywsLjAwOygjLCMjIywsLjAwKVwiO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBcIiMsIyMjLjAwOy0jLCMjIy4wMFwiO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHBpdm90VGFibGVmb3JtYXRJbnRlZ2VyKG51bSkge1xyXG4gICAgc3dpdGNoIChudW0pIHtcclxuICAgICAgY2FzZSAxOlxyXG4gICAgICBjYXNlIDM6XHJcbiAgICAgIGNhc2UgNDpcclxuICAgICAgICByZXR1cm4gXCIjLCMjIzsoIywjIyMpXCI7XHJcbiAgICAgIGNhc2UgNDpcclxuICAgICAgY2FzZSA1OlxyXG4gICAgICBjYXNlIDY6XHJcbiAgICAgICAgcmV0dXJuIFwiIywjIyMsLDsoIywjIyMsLClcIjtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gXCIjLCMjIzsoIywjIyMpXCI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcGl2b3RUYWJsZWZvcm1hdFBlcmNlbnQobnVtKSB7XHJcbiAgICBzd2l0Y2ggKG51bSkge1xyXG4gICAgICBjYXNlIDE6XHJcbiAgICAgIGNhc2UgMjpcclxuICAgICAgY2FzZSAzOlxyXG4gICAgICAgIHJldHVybiBcIlBcIjtcclxuICAgICAgY2FzZSA0OlxyXG4gICAgICBjYXNlIDU6XHJcbiAgICAgIGNhc2UgNjpcclxuICAgICAgICByZXR1cm4gXCJQMVwiO1xyXG4gICAgICBjYXNlIDc6XHJcbiAgICAgIGNhc2UgODpcclxuICAgICAgY2FzZSA5OlxyXG4gICAgICAgIHJldHVybiBcIlAyXCI7XHJcbiAgICAgIGNhc2UgMTA6XHJcbiAgICAgIGNhc2UgMTE6XHJcbiAgICAgIGNhc2UgMTI6XHJcbiAgICAgICAgcmV0dXJuIFwiIywjIyMwLjAwJ3gnOygjLCMjIzAuMDAneCcpXCI7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIFwiUDJcIjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBwaXZvdFRhYmxlZm9ybWF0UGVyY2VudE51bShudW0pIHtcclxuICAgIHN3aXRjaCAobnVtKSB7XHJcbiAgICAgIGNhc2UgMTpcclxuICAgICAgICByZXR1cm4gXCIjIyMjJyUnXCI7XHJcbiAgICAgIGNhc2UgMjpcclxuICAgICAgICByZXR1cm4gXCIjIyMjLjAnJSdcIjtcclxuICAgICAgY2FzZSAzOlxyXG4gICAgICAgIHJldHVybiBcIiMjIyMuMDAnJSdcIjtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gXCIjIyMjLjAwJyUnXCI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcGl2b3RUYWJsZWZvcm1hdE11bHRpcGxlKG51bSkge1xyXG4gICAgc3dpdGNoIChudW0pIHtcclxuICAgICAgY2FzZSAxOlxyXG4gICAgICAgIHJldHVybiBcIiMjIyMneCdcIjtcclxuICAgICAgY2FzZSAyOlxyXG4gICAgICAgIHJldHVybiBcIiMjIzAuMCd4J1wiO1xyXG4gICAgICBjYXNlIDM6XHJcbiAgICAgICAgcmV0dXJuIFwiIyMjMC4wMCd4J1wiO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBcIiMjIzAuMDAneCdcIjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBmb3JtYXROdW1iZXIobnVtKSB7XHJcbiAgICBzd2l0Y2ggKG51bSkge1xyXG4gICAgICBjYXNlIDA6XHJcbiAgICAgICAgcmV0dXJuIFwiTlwiO1xyXG4gICAgICBjYXNlIDE6XHJcbiAgICAgICAgcmV0dXJuIFwiTjFcIjtcclxuICAgICAgY2FzZSAyOlxyXG4gICAgICAgIHJldHVybiBcIk4yXCI7XHJcbiAgICAgIGNhc2UgMzpcclxuICAgICAgICByZXR1cm4gXCJOM1wiO1xyXG4gICAgICBjYXNlIDQ6XHJcbiAgICAgICAgcmV0dXJuIFwiTjRcIjtcclxuICAgICAgY2FzZSA1OlxyXG4gICAgICAgIHJldHVybiBcIk41XCI7XHJcbiAgICAgIGNhc2UgNjpcclxuICAgICAgICByZXR1cm4gXCJONlwiO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBcIk4yXCI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZm9ybWF0UGVyY2VudChudW0pIHtcclxuICAgIHN3aXRjaCAobnVtKSB7XHJcbiAgICAgIGNhc2UgMDpcclxuICAgICAgICByZXR1cm4gXCJQXCI7XHJcbiAgICAgIGNhc2UgMTpcclxuICAgICAgICByZXR1cm4gXCJQMVwiO1xyXG4gICAgICBjYXNlIDI6XHJcbiAgICAgICAgcmV0dXJuIFwiUDJcIjtcclxuICAgICAgY2FzZSAzOlxyXG4gICAgICAgIHJldHVybiBcIlAzXCI7XHJcbiAgICAgIGNhc2UgNDpcclxuICAgICAgICByZXR1cm4gXCJQNFwiO1xyXG4gICAgICBjYXNlIDU6XHJcbiAgICAgICAgcmV0dXJuIFwiUDVcIjtcclxuICAgICAgY2FzZSA2OlxyXG4gICAgICAgIHJldHVybiBcIlA2XCI7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIFwiUDJcIjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBmb3JtYXRQZXJjZW50TnVtKG51bSkge1xyXG4gICAgc3dpdGNoIChudW0pIHtcclxuICAgICAgY2FzZSAwOlxyXG4gICAgICAgIHJldHVybiBcIiMjIyMnJSdcIjtcclxuICAgICAgY2FzZSAxOlxyXG4gICAgICAgIHJldHVybiBcIiMjIzAuMCclJ1wiO1xyXG4gICAgICBjYXNlIDI6XHJcbiAgICAgICAgcmV0dXJuIFwiIyMjMC4wMCclJ1wiO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBcIiMjIzAuMDAnJSdcIjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBmb3JtYXRNdWx0aXBsZShudW0pIHtcclxuICAgIHN3aXRjaCAobnVtKSB7XHJcbiAgICAgIGNhc2UgMDpcclxuICAgICAgICByZXR1cm4gXCIjIyMjJ3gnXCI7XHJcbiAgICAgIGNhc2UgMTpcclxuICAgICAgICByZXR1cm4gXCIjIyMwLjAneCdcIjtcclxuICAgICAgY2FzZSAyOlxyXG4gICAgICAgIHJldHVybiBcIiMjIzAuMDAneCdcIjtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gXCIjIyMwLjAwJ3gnXCI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgR2V0RmlndXJlRm9ybWF0KCkge1xyXG4gICAgLy8gcmV0dXJuIFtcclxuICAgIC8vIFx0eyBrZXkxOiBcIjEsMjM0LDU2N1wiLCBrZXkyOiBcIigxLDIzNCw1NjcpXCIsIGtleTM6IFwiLVwiLCB2YWw6IDEgfSwgLy9cclxuICAgIC8vIFx0eyBrZXkxOiBcIjEsMjM0LDU2N1wiLCBrZXkyOiBcIigxLDIzNCw1NjcpXCIsIGtleTM6IFwiLVwiLCB2YWw6IDIgfSwgLy9cclxuICAgIC8vIFx0eyBrZXkxOiBcIjEsMjM0LDU2Ny4wMFwiLCBrZXkyOiBcIigxLDIzNCw1NjcuMDApXCIsIGtleTM6IFwiLVwiLCB2YWw6IDMgfSwgLy9cclxuICAgIC8vIFx0eyBrZXkxOiBcIjEsMjM0LDU2Ny4wMFwiLCBrZXkyOiBcIigxLDIzNCw1NjcuMDApXCIsIGtleTM6IFwiLVwiLCB2YWw6IDQgfSwgLy9cclxuICAgIC8vIFx0eyBrZXkxOiBcIjFcIiwga2V5MjogXCIoMSlcIiwga2V5MzogXCItXCIsIHZhbDogNSB9LCAvL1xyXG4gICAgLy8gXHR7IGtleTE6IFwiMVwiLCBrZXkyOiBcIigxKVwiLCBrZXkzOiBcIi1cIiwgdmFsOiA2IH0sIC8vXHJcbiAgICAvLyBcdHsga2V5MTogXCIxLjJcIiwga2V5MjogXCIoMS4yKVwiLCBrZXkzOiBcIjAuMFwiLCB2YWw6IDcgfSwgLy9cclxuICAgIC8vIFx0eyBrZXkxOiBcIjEuMlwiLCBrZXkyOiBcIigxLjIpXCIsIGtleTM6IFwiMC4wXCIsIHZhbDogOCB9LCAvL1xyXG4gICAgLy8gXHR7IGtleTE6IFwiMS4yM1wiLCBrZXkyOiBcIigxLjIzKVwiLCBrZXkzOiBcIjAuMDBcIiwgdmFsOiA5IH0sIC8vXHJcbiAgICAvLyBcdHsga2V5MTogXCIxLjIzXCIsIGtleTI6IFwiKDEuMjMpXCIsIGtleTM6IFwiMC4wMFwiLCB2YWw6IDEwIH0sIC8vXHJcbiAgICAvLyBdO1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgeyBrZXk6IFwiMSwyMzQsNTY3OygxLDIzNCw1NjcpOzBcIiwgdmFsOiAxIH0sXHJcbiAgICAgIHsga2V5OiBcIjEsMjM0LDU2NzsoMSwyMzQsNTY3KTstXCIsIHZhbDogMiB9LFxyXG4gICAgICB7IGtleTogXCIxLDIzNCw1Njc7KDEsMjM0LDU2Nyk7XCIsIHZhbDogMyB9LFxyXG5cclxuICAgICAgeyBrZXk6IFwiMSwyMzQsNTY3LjA7KDEsMjM0LDU2Ny4wKTswLjBcIiwgdmFsOiA0IH0sXHJcbiAgICAgIHsga2V5OiBcIjEsMjM0LDU2Ny4wOygxLDIzNCw1NjcuMCk7LVwiLCB2YWw6IDUgfSxcclxuICAgICAgeyBrZXk6IFwiMSwyMzQsNTY3LjA7KDEsMjM0LDU2Ny4wKTtcIiwgdmFsOiA2IH0sXHJcblxyXG4gICAgICB7IGtleTogXCIxLDIzNCw1NjcuMDA7KDEsMjM0LDU2Ny4wMCk7MC4wMFwiLCB2YWw6IDcgfSxcclxuICAgICAgeyBrZXk6IFwiMSwyMzQsNTY3LjAwOygxLDIzNCw1NjcuMDApOy1cIiwgdmFsOiA4IH0sXHJcbiAgICAgIHsga2V5OiBcIjEsMjM0LDU2Ny4wMDsoMSwyMzQsNTY3LjAwKTtcIiwgdmFsOiA5IH0sXHJcblxyXG4gICAgICB7IGtleTogXCIxOygxKTswXCIsIHZhbDogMTAgfSxcclxuICAgICAgeyBrZXk6IFwiMTsoMSk7LVwiLCB2YWw6IDExIH0sXHJcbiAgICAgIHsga2V5OiBcIjE7KDEpO1wiLCB2YWw6IDEyIH0sXHJcblxyXG4gICAgICB7IGtleTogXCIxLjI7KDEuMik7MC4wXCIsIHZhbDogMTMgfSxcclxuICAgICAgeyBrZXk6IFwiMS4yOygxLjIpOy1cIiwgdmFsOiAxNCB9LFxyXG4gICAgICB7IGtleTogXCIxLjI7KDEuMik7XCIsIHZhbDogMTUgfSxcclxuXHJcbiAgICAgIHsga2V5OiBcIjEuMjM7KDEuMjMpOzAuMDBcIiwgdmFsOiAxNiB9LFxyXG4gICAgICB7IGtleTogXCIxLjIzOygxLjIzKTstXCIsIHZhbDogMTcgfSxcclxuICAgICAgeyBrZXk6IFwiMS4yMzsoMS4yMyk7XCIsIHZhbDogMTggfSxcclxuICAgIF07XHJcbiAgfVxyXG5cclxuICAvLyBwdWJsaWMgR2V0RmlndXJlRm9ybWF0MigpIHtcclxuICAvLyBcdHJldHVybiBbXHJcbiAgLy8gXHRcdC8vIDEyMzQ1NjdcclxuICAvLyBcdFx0eyBrZXk6IFwiMSwyMzQsNTY3XCIsIHZhbDogMTEgfSxcclxuICAvLyBcdFx0eyBrZXk6IFwiMSwyMzQsNTY3LjAwXCIsIHZhbDogMTIgfSxcclxuICAvLyBcdFx0eyBrZXk6IFwiMVwiLCB2YWw6IDEzIH0sXHJcbiAgLy8gXHRcdHsga2V5OiBcIjEuMlwiLCB2YWw6IDE0IH0sXHJcbiAgLy8gXHRcdHsga2V5OiBcIjEuMjNcIiwgdmFsOiAxNSB9LFxyXG4gIC8vIFx0XTtcclxuICAvLyB9O1xyXG5cclxuICBwdWJsaWMgR2V0RmlndXJlRm9ybWF0MygpIHtcclxuICAgIC8vIHJldHVybiBbXHJcbiAgICAvLyBcdHsga2V5MTogXCIxLDIzNCw1NjdcIiwga2V5MjogXCIoMSwyMzQsNTY3KVwiLCBrZXkzOiBcIi1cIiwgdmFsOiAxIH0sIC8vXHJcbiAgICAvLyBcdHsga2V5MTogXCIxLDIzNCw1NjdcIiwga2V5MjogXCIoMSwyMzQsNTY3KVwiLCBrZXkzOiBcIi1cIiwgdmFsOiAyIH0sIC8vXHJcbiAgICAvLyBcdHsga2V5MTogXCIxXCIsIGtleTI6IFwiKDEpXCIsIGtleTM6IFwiLVwiLCB2YWw6IDMgfSwgLy9cclxuICAgIC8vIFx0eyBrZXkxOiBcIjFcIiwga2V5MjogXCIoMSlcIiwga2V5MzogXCItXCIsIHZhbDogNCB9LCAvL1xyXG4gICAgLy8gXHR7IGtleTogXCIxXCIsIHZhbDogNSB9LFxyXG4gICAgLy8gXTtcclxuICAgIHJldHVybiBbXHJcbiAgICAgIHsga2V5OiBcIjEsMjM0LDU2NzsoMSwyMzQsNTY3KTswXCIsIHZhbDogMSB9LFxyXG4gICAgICB7IGtleTogXCIxLDIzNCw1Njc7KDEsMjM0LDU2Nyk7LVwiLCB2YWw6IDIgfSxcclxuICAgICAgeyBrZXk6IFwiMSwyMzQsNTY3OygxLDIzNCw1NjcpO1wiLCB2YWw6IDMgfSxcclxuICAgICAgeyBrZXk6IFwiMTsoMSk7MFwiLCB2YWw6IDQgfSxcclxuICAgICAgeyBrZXk6IFwiMTsoMSk7LVwiLCB2YWw6IDUgfSxcclxuICAgICAgeyBrZXk6IFwiMTsoMSk7XCIsIHZhbDogNiB9LFxyXG4gICAgXTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBHZXRQZXJjZW50Rm9ybWF0cygpIHtcclxuICAgIC8vIHJldHVybiBbXHJcbiAgICAvLyBcdHsga2V5MTogXCIwJVwiLCBrZXkyOiBcIjAlXCIsIGtleTM6IFwiLVwiLCB2YWw6IDEgfSxcclxuICAgIC8vIFx0eyBrZXkxOiBcIjAlXCIsIGtleTI6IFwiKDAlKVwiLCBrZXkzOiBcIi1cIiwgdmFsOiAyIH0sXHJcbiAgICAvLyBcdHsga2V5MTogXCIwLjAlXCIsIGtleTI6IFwiMC4wJVwiLCBrZXkzOiBcIi1cIiwgdmFsOiAzIH0sXHJcbiAgICAvLyBcdHsga2V5MTogXCIwLjAlXCIsIGtleTI6IFwiKDAuMCUpXCIsIGtleTM6IFwiLVwiLCB2YWw6IDQgfSxcclxuICAgIC8vIFx0eyBrZXkxOiBcIjAuMDAlXCIsIGtleTI6IFwiMC4wMCVcIiwga2V5MzogXCItXCIsIHZhbDogNSB9LFxyXG4gICAgLy8gXHR7IGtleTE6IFwiMC4wMCVcIiwga2V5MjogXCIoMC4wMCUpXCIsIGtleTM6IFwiLVwiLCB2YWw6IDYgfSxcclxuICAgIC8vIF07XHJcblxyXG4gICAgcmV0dXJuIFtcclxuICAgICAgeyBrZXk6IFwiMSU7KDElKTswJVwiLCB2YWw6IDEgfSxcclxuICAgICAgeyBrZXk6IFwiMSU7KDElKTstXCIsIHZhbDogMiB9LFxyXG4gICAgICB7IGtleTogXCIxJTsoMSUpO1wiLCB2YWw6IDMgfSxcclxuXHJcbiAgICAgIHsga2V5OiBcIjEuMiU7KDEuMiUpOzAuMCVcIiwgdmFsOiA0IH0sXHJcbiAgICAgIHsga2V5OiBcIjEuMiU7KDEuMiUpOy1cIiwgdmFsOiA1IH0sXHJcbiAgICAgIHsga2V5OiBcIjEuMiU7KDEuMiUpO1wiLCB2YWw6IDYgfSxcclxuXHJcbiAgICAgIHsga2V5OiBcIjEuMjMlOygxLjIzJSk7MC4wMCVcIiwgdmFsOiA3IH0sXHJcbiAgICAgIHsga2V5OiBcIjEuMjMlOygxLjIzJSk7LVwiLCB2YWw6IDggfSxcclxuICAgICAgeyBrZXk6IFwiMS4yMyU7KDEuMjMlKTtcIiwgdmFsOiA5IH0sXHJcblxyXG4gICAgICB7IGtleTogXCIxLjIzeDsoMS4yM3gpOzAuMDB4XCIsIHZhbDogMTAgfSxcclxuICAgICAgeyBrZXk6IFwiMS4yM3g7KDEuMjN4KTstXCIsIHZhbDogMTEgfSxcclxuICAgICAgeyBrZXk6IFwiMS4yM3g7KDEuMjN4KTtcIiwgdmFsOiAxMiB9LFxyXG4gICAgXTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBHZXRNdWx0aXBsZUZvcm1hdHMoKSB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICB7IGtleTogXCIweFwiLCB2YWw6IDEgfSxcclxuICAgICAgeyBrZXk6IFwiMC4weFwiLCB2YWw6IDIgfSxcclxuICAgICAgeyBrZXk6IFwiMC4wMHhcIiwgdmFsOiAzIH0sXHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEFnZ3JlZ2F0ZVR5cGUoYWdncmVnYXRlVHlwZSkge1xyXG4gICAgc3dpdGNoIChhZ2dyZWdhdGVUeXBlKSB7XHJcbiAgICAgIGNhc2UgXCJDYWxjdWxhdGVJUlJcIjpcclxuICAgICAgICByZXR1cm4gXCJDSVwiO1xyXG4gICAgICBjYXNlIFwiQ2FsY3VsYXRlSVJSSVJSRGF0ZVwiOlxyXG4gICAgICAgIHJldHVybiBcIkNJX0lSUlwiO1xyXG4gICAgICBjYXNlIFwiQ2FsY3VsYXRlSVJSQmVmb3JlQ2FycmllZFwiOlxyXG4gICAgICAgIHJldHVybiBcIkNJX0JFRk9SRV9DQVJSWVwiO1xyXG4gICAgICBjYXNlIFwiQ2FsY3VsYXRlSVJSUmVwb3J0ZWRcIjpcclxuICAgICAgICByZXR1cm4gXCJDSV9SRVBPUlRFRFwiO1xyXG4gICAgICBjYXNlIFwiQ2FsY3VsYXRlSVJSQWN0dWFsQXVkaXRlZFwiOlxyXG4gICAgICAgIHJldHVybiBcIkNJX0FDVFVBTF9BVURJVEVEXCI7XHJcbiAgICAgIGNhc2UgXCJDYWxjdWxhdGVJUlJNVERcIjpcclxuICAgICAgICByZXR1cm4gXCJDSV9NVERcIjtcclxuICAgICAgY2FzZSBcIkNhbGN1bGF0ZUlSUlFURFwiOlxyXG4gICAgICAgIHJldHVybiBcIkNJX1FURFwiO1xyXG4gICAgICBjYXNlIFwiQ2FsY3VsYXRlSVJSWVREXCI6XHJcbiAgICAgICAgcmV0dXJuIFwiQ0lfWVREXCI7XHJcbiAgICAgIGNhc2UgXCJDYWxjdWxhdGVUV1JNVERcIjpcclxuICAgICAgICByZXR1cm4gXCJDVFdSX01URFwiO1xyXG4gICAgICBjYXNlIFwiQ2FsY3VsYXRlVFdSUVREXCI6XHJcbiAgICAgICAgcmV0dXJuIFwiQ1RXUl9RVERcIjtcclxuICAgICAgY2FzZSBcIkNhbGN1bGF0ZVRXUllURFwiOlxyXG4gICAgICAgIHJldHVybiBcIkNUV1JfWVREXCI7XHJcbiAgICAgIGNhc2UgXCJDYWxjdWxhdGVWQVJNVERfOTlcIjpcclxuICAgICAgICByZXR1cm4gXCJDVkFSX01URF85OVwiO1xyXG4gICAgICBjYXNlIFwiQ2FsY3VsYXRlVkFSUVREXzk5XCI6XHJcbiAgICAgICAgcmV0dXJuIFwiQ1ZBUl9RVERfOTlcIjtcclxuICAgICAgY2FzZSBcIkNhbGN1bGF0ZVZBUllURF85OVwiOlxyXG4gICAgICAgIHJldHVybiBcIkNWQVJfWVREXzk5XCI7XHJcbiAgICAgIGNhc2UgXCJDYWxjdWxhdGVWQVJNVERfOTVcIjpcclxuICAgICAgICByZXR1cm4gXCJDVkFSX01URF85NVwiO1xyXG4gICAgICBjYXNlIFwiQ2FsY3VsYXRlVkFSUVREXzk1XCI6XHJcbiAgICAgICAgcmV0dXJuIFwiQ1ZBUl9RVERfOTVcIjtcclxuICAgICAgY2FzZSBcIkNhbGN1bGF0ZVZBUllURF85NVwiOlxyXG4gICAgICAgIHJldHVybiBcIkNWQVJfWVREXzk1XCI7XHJcbiAgICAgIGNhc2UgXCJDYWxjdWxhdGVNdWx0aXBsZVwiOlxyXG4gICAgICAgIHJldHVybiBcIkNNXCI7XHJcbiAgICAgIGNhc2UgXCJDYWxjdWxhdGVQSUNcIjpcclxuICAgICAgICByZXR1cm4gXCJDUFwiO1xyXG4gICAgICBjYXNlIFwiQ2FsY3VsYXRlRFBJXCI6XHJcbiAgICAgICAgcmV0dXJuIFwiQ0RcIjtcclxuICAgICAgY2FzZSBcIkNhbGN1bGF0ZVRWUElcIjpcclxuICAgICAgICByZXR1cm4gXCJDVFwiO1xyXG4gICAgICBjYXNlIFwiQ2FsY3VsYXRlUlZQSVwiOlxyXG4gICAgICAgIHJldHVybiBcIkNSXCI7XHJcbiAgICAgIGNhc2UgXCJDYWxjdWxhdGVNQWN0dWFsQXVkaXRlZFwiOlxyXG4gICAgICAgIHJldHVybiBcIkNNX0FDVFVBTF9BVURJVEVEXCI7XHJcbiAgICAgIGNhc2UgXCJDYWxjdWxhdGVNUmVwb3J0ZWRcIjpcclxuICAgICAgICByZXR1cm4gXCJDTV9SRVBPUlRFRFwiO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldENhbGN1bGF0ZU1ldGhvZChjb2xOYW1lKSB7XHJcbiAgICBzd2l0Y2ggKGNvbE5hbWUpIHtcclxuICAgICAgY2FzZSBcIkNJXCI6XHJcbiAgICAgICAgcmV0dXJuIFwiQ2FsY3VsYXRlSVJSXCI7XHJcbiAgICAgIGNhc2UgXCJDSV9JUlJcIjpcclxuICAgICAgICByZXR1cm4gXCJDYWxjdWxhdGVJUlJJUlJEYXRlXCI7XHJcbiAgICAgIGNhc2UgXCJDSV9CRUZPUkVfQ0FSUllcIjpcclxuICAgICAgICByZXR1cm4gXCJDYWxjdWxhdGVJUlJCZWZvcmVDYXJyaWVkXCI7XHJcbiAgICAgIGNhc2UgXCJDSV9SRVBPUlRFRFwiOlxyXG4gICAgICAgIHJldHVybiBcIkNhbGN1bGF0ZUlSUlJlcG9ydGVkXCI7XHJcbiAgICAgIGNhc2UgXCJDSV9BQ1RVQUxfQVVESVRFRFwiOlxyXG4gICAgICAgIHJldHVybiBcIkNhbGN1bGF0ZUlSUkFjdHVhbEF1ZGl0ZWRcIjtcclxuICAgICAgY2FzZSBcIkNJX01URFwiOlxyXG4gICAgICAgIHJldHVybiBcIkNhbGN1bGF0ZUlSUk1URFwiO1xyXG4gICAgICBjYXNlIFwiQ0lfUVREXCI6XHJcbiAgICAgICAgcmV0dXJuIFwiQ2FsY3VsYXRlSVJSUVREXCI7XHJcbiAgICAgIGNhc2UgXCJDSV9ZVERcIjpcclxuICAgICAgICByZXR1cm4gXCJDYWxjdWxhdGVJUlJZVERcIjtcclxuICAgICAgY2FzZSBcIkNUV1JfTVREXCI6XHJcbiAgICAgICAgcmV0dXJuIFwiQ2FsY3VsYXRlVFdSTVREXCI7XHJcbiAgICAgIGNhc2UgXCJDVFdSX1FURFwiOlxyXG4gICAgICAgIHJldHVybiBcIkNhbGN1bGF0ZVRXUlFURFwiO1xyXG4gICAgICBjYXNlIFwiQ1RXUl9ZVERcIjpcclxuICAgICAgICByZXR1cm4gXCJDYWxjdWxhdGVUV1JZVERcIjtcclxuICAgICAgY2FzZSBcIkNWQVJfTVREXzk5XCI6XHJcbiAgICAgICAgcmV0dXJuIFwiQ2FsY3VsYXRlVkFSTVREXzk5XCI7XHJcbiAgICAgIGNhc2UgXCJDVkFSX1FURF85OVwiOlxyXG4gICAgICAgIHJldHVybiBcIkNhbGN1bGF0ZVZBUlFURF85OVwiO1xyXG4gICAgICBjYXNlIFwiQ1ZBUl9ZVERfOTlcIjpcclxuICAgICAgICByZXR1cm4gXCJDYWxjdWxhdGVWQVJZVERfOTlcIjtcclxuICAgICAgY2FzZSBcIkNWQVJfTVREXzk1XCI6XHJcbiAgICAgICAgcmV0dXJuIFwiQ2FsY3VsYXRlVkFSTVREXzk1XCI7XHJcbiAgICAgIGNhc2UgXCJDVkFSX1FURF85NVwiOlxyXG4gICAgICAgIHJldHVybiBcIkNhbGN1bGF0ZVZBUlFURF85NVwiO1xyXG4gICAgICBjYXNlIFwiQ1ZBUl9ZVERfOTVcIjpcclxuICAgICAgICByZXR1cm4gXCJDYWxjdWxhdGVWQVJZVERfOTVcIjtcclxuICAgICAgY2FzZSBcIkNNXCI6XHJcbiAgICAgICAgcmV0dXJuIFwiQ2FsY3VsYXRlTXVsdGlwbGVcIjtcclxuICAgICAgY2FzZSBcIkNQXCI6XHJcbiAgICAgICAgcmV0dXJuIFwiQ2FsY3VsYXRlUElDXCI7XHJcbiAgICAgIGNhc2UgXCJDRFwiOlxyXG4gICAgICAgIHJldHVybiBcIkNhbGN1bGF0ZURQSVwiO1xyXG4gICAgICBjYXNlIFwiQ1RcIjpcclxuICAgICAgICByZXR1cm4gXCJDYWxjdWxhdGVUVlBJXCI7XHJcbiAgICAgIGNhc2UgXCJDUlwiOlxyXG4gICAgICAgIHJldHVybiBcIkNhbGN1bGF0ZVJWUElcIjtcclxuICAgICAgY2FzZSBcIkNNX0FDVFVBTF9BVURJVEVEXCI6XHJcbiAgICAgICAgcmV0dXJuIFwiQ2FsY3VsYXRlTUFjdHVhbEF1ZGl0ZWRcIjtcclxuICAgICAgY2FzZSBcIkNNX1JFUE9SVEVEXCI6XHJcbiAgICAgICAgcmV0dXJuIFwiQ2FsY3VsYXRlTVJlcG9ydGVkXCI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDmoLzlvI/ljJbmlbDlrZdcclxuICBwdWJsaWMgbnVtYmVyX2Zvcm1hdChudW1iZXIsIGRlY2ltYWxzLCBkZWNfcG9pbnQsIHRob3VzYW5kc19zZXAsIHJvdW5kdGFnKSB7XHJcbiAgICAvKlxyXG4gICAgICog5Y+C5pWw6K+05piO77yaXHJcbiAgICAgKiBudW1iZXLvvJropoHmoLzlvI/ljJbnmoTmlbDlrZdcclxuICAgICAqIGRlY2ltYWxz77ya5L+d55WZ5Yeg5L2N5bCP5pWwXHJcbiAgICAgKiBkZWNfcG9pbnTvvJrlsI/mlbDngrnnrKblj7dcclxuICAgICAqIHRob3VzYW5kc19zZXDvvJrljYPliIbkvY3nrKblj7dcclxuICAgICAqIHJvdW5kdGFnOuiIjeWFpeWPguaVsO+8jOm7mOiupCBcImNlaWxcIiDlkJHkuIrlj5YsXCJmbG9vclwi5ZCR5LiL5Y+WLFwicm91bmRcIiDlm5voiI3kupTlhaVcclxuICAgICAqICovXHJcbiAgICBudW1iZXIgPSAobnVtYmVyICsgXCJcIikucmVwbGFjZSgvW14wLTkrLUVlLl0vZywgXCJcIik7XHJcbiAgICByb3VuZHRhZyA9IHJvdW5kdGFnIHx8IFwiY2VpbFwiOyAvL1wiY2VpbFwiLFwiZmxvb3JcIixcInJvdW5kXCJcclxuICAgIGxldCBuID0gIWlzRmluaXRlKCtudW1iZXIpID8gMCA6ICtudW1iZXI7XHJcbiAgICBsZXQgcHJlYyA9ICFpc0Zpbml0ZSgrZGVjaW1hbHMpID8gMCA6IE1hdGguYWJzKGRlY2ltYWxzKTtcclxuICAgIGxldCBzZXAgPSB0eXBlb2YgdGhvdXNhbmRzX3NlcCA9PT0gXCJ1bmRlZmluZWRcIiA/IFwiLFwiIDogdGhvdXNhbmRzX3NlcDtcclxuICAgIGxldCBkZWMgPSB0eXBlb2YgZGVjX3BvaW50ID09PSBcInVuZGVmaW5lZFwiID8gXCIuXCIgOiBkZWNfcG9pbnQ7XHJcbiAgICAvLyBsZXQgIHMgPSAnJztcclxuICAgIGxldCBzID0gKFxyXG4gICAgICBwcmVjXHJcbiAgICAgICAgPyB0aGlzLnRvRml4ZWRGaXgobiwgcHJlYywgcm91bmR0YWcpXHJcbiAgICAgICAgOiBcIlwiICsgdGhpcy5wYmYudG9maXhlZE51bShuLCBkZWNpbWFscylcclxuICAgICkuc3BsaXQoXCIuXCIpOyAvL3RoaXMucGJmLnRvZml4ZWROdW0oTWF0aC5hYnModmFsdWUpLCBkZWNpbWFsKVxyXG4gICAgdmFyIHJlID0gLygtP1xcZCspKFxcZHszfSkvO1xyXG4gICAgd2hpbGUgKHJlLnRlc3Qoc1swXSkpIHtcclxuICAgICAgc1swXSA9IHNbMF0ucmVwbGFjZShyZSwgXCIkMVwiICsgc2VwICsgXCIkMlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoKHNbMV0gfHwgXCJcIikubGVuZ3RoIDwgcHJlYykge1xyXG4gICAgICBzWzFdID0gc1sxXSB8fCBcIlwiO1xyXG4gICAgICBzWzFdICs9IG5ldyBBcnJheShwcmVjIC0gc1sxXS5sZW5ndGggKyAxKS5qb2luKFwiMFwiKTtcclxuICAgIH1cclxuICAgIHJldHVybiBzLmpvaW4oZGVjKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdG9GaXhlZEZpeChuLCBwcmVjLCByb3VuZHRhZykge1xyXG4gICAgdmFyIGsgPSBNYXRoLnBvdygxMCwgcHJlYyk7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICBcIlwiICtcclxuICAgICAgcGFyc2VGbG9hdChcclxuICAgICAgICBNYXRoW3JvdW5kdGFnXShwYXJzZUZsb2F0KChuICogaykudG9GaXhlZChwcmVjICogMikpKS50b0ZpeGVkKHByZWMgKiAyKVxyXG4gICAgICApIC9cclxuICAgICAgICBrXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFJlc3VsdEJ5RGF0YVRhYmxlKFxyXG4gICAgcG9ydGxldCxcclxuICAgIGlzR2V0VG90YWwgPSBmYWxzZSxcclxuICAgIGNvcHlJZCA9IGZhbHNlLFxyXG4gICAgaWQ6IHN0cmluZ1xyXG4gICkge1xyXG4gICAgbGV0IHJlc3VsdCA9IFtdO1xyXG4gICAgbGV0IGRhdGFtYXJ0Q29kZSA9IHBvcnRsZXQuZmlndXJlQ29kZTtcclxuICAgIGxldCBpZGVudGlmaWVyID1cclxuICAgICAgcG9ydGxldC5pZCA9PT0gXCIwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDBcIlxyXG4gICAgICAgID8gcG9ydGxldC5uZXdJZFxyXG4gICAgICAgIDogcG9ydGxldC5pZDtcclxuICAgIGlmIChwb3J0bGV0LmNvcHlJZCkge1xyXG4gICAgICBpZGVudGlmaWVyID0gcG9ydGxldC5jb3B5SWQ7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5wb3J0bGV0RGF0YV9OZXdbaWRdW2lkZW50aWZpZXJdKSB7XHJcbiAgICAgIHJlc3VsdCA9IGlzR2V0VG90YWxcclxuICAgICAgICA/IHRoaXMucG9ydGxldERhdGFfTmV3W2lkXVtpZGVudGlmaWVyXSAmJlxyXG4gICAgICAgICAgdGhpcy5wb3J0bGV0RGF0YV9OZXdbaWRdW2lkZW50aWZpZXJdLnRvdGFsXHJcbiAgICAgICAgOiB0aGlzLnBvcnRsZXREYXRhX05ld1tpZF1baWRlbnRpZmllcl0gJiZcclxuICAgICAgICAgIHRoaXMucG9ydGxldERhdGFfTmV3W2lkXVtpZGVudGlmaWVyXS5kYXRhO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmVzdWx0ID0gaXNHZXRUb3RhbFxyXG4gICAgICAgID8gdGhpcy5wb3J0bGV0UmVzdWx0c19OZXdbaWRdW2RhdGFtYXJ0Q29kZV0gJiZcclxuICAgICAgICAgIHRoaXMucG9ydGxldFJlc3VsdHNfTmV3W2lkXVtkYXRhbWFydENvZGVdLnRvdGFsXHJcbiAgICAgICAgOiB0aGlzLnBvcnRsZXRSZXN1bHRzX05ld1tpZF1bZGF0YW1hcnRDb2RlXSAmJlxyXG4gICAgICAgICAgdGhpcy5wb3J0bGV0UmVzdWx0c19OZXdbaWRdW2RhdGFtYXJ0Q29kZV0uZGF0YTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLyBTTVAyLTM3MDggRU5EXHJcblxyXG4gIHB1YmxpYyBnZXRPcmRlckJ5Q29sdW1uc05ldyhkYXRhbWFydENvZGUsIGRhc2hib2FyZCk6IFByb21pc2U8YW55W10+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5zb3VyY2VzRGF0YVtkYXNoYm9hcmQuaWRdICYmIGRhc2hib2FyZCkge1xyXG4gICAgICAgIGNvbnN0IG91dHB1dFJlcyA9IFtdO1xyXG4gICAgICAgIGlmICh0aGlzLnNvdXJjZXNEYXRhW2Rhc2hib2FyZC5pZF0ubGVuZ3RoKSB7XHJcbiAgICAgICAgICBsZXQgY29uZmlnID0gSlNPTi5wYXJzZShkYXNoYm9hcmQuY29uZmlnKTtcclxuICAgICAgICAgIGNvbnN0IGRhdGFWaWV3cyA9IGNvbmZpZy52aWV3cztcclxuICAgICAgICAgIGlmIChkYXNoYm9hcmQgJiYgZGFzaGJvYXJkLmNvbmZpZykge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhTWFydCA9IHRoaXMuc291cmNlc0RhdGFbZGFzaGJvYXJkLmlkXS5maWx0ZXIoXHJcbiAgICAgICAgICAgICAgKGl0ZW0pID0+IGl0ZW0uZW50aXR5VHlwZSA9PT0gZGFzaGJvYXJkLmVudGl0eVR5cGVcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgZGF0YU1hcnQuZm9yRWFjaCgoX2RhdGEpID0+IHtcclxuICAgICAgICAgICAgICBfZGF0YS52aWV3cy5mb3JFYWNoKCh2aWV3KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YVZpZXdzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uZGF0YW1hcnRWaWV3SWQgPT09IHZpZXcuaWQpKSB7XHJcbiAgICAgICAgICAgICAgICAgIHZpZXcudGFibGVzLmZvckVhY2goKHRhYmxlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0UmVzLnB1c2godGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlc29sdmUob3V0cHV0UmVzKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyDlpITnkIYgdGhpcy5zb3VyY2VzRGF0YSDmsqHmnInlgLxcclxuICAgICAgICBsZXQgZGF0YSA9IHtcclxuICAgICAgICAgIGFjY291bnRJZDogdGhpcy51c2VySW5mby5hY2NvdW50SWQsXHJcbiAgICAgICAgICBsYW5ndWFnZTogdGhpcy5sYW5nLFxyXG4gICAgICAgICAgZGFzaGJvYXJkVmVyc2lvbjogMixcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuaHR0cC5wb3N0KHRoaXMuYXBpLnVybExpc3QuR2V0U291cmNlcywgZGF0YSwgKHJlcykgPT4ge1xyXG4gICAgICAgICAgY29uc3Qgb3V0cHV0UmVzID0gW107XHJcbiAgICAgICAgICBpZiAocmVzICYmIHJlcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5zb3VyY2VzRGF0YVtkYXNoYm9hcmQuaWRdID0gcmVzO1xyXG4gICAgICAgICAgICBsZXQgY29uZmlnID0gSlNPTi5wYXJzZShkYXNoYm9hcmQuY29uZmlnKTtcclxuICAgICAgICAgICAgY29uc3QgZGF0YVZpZXdzID0gY29uZmlnLnZpZXdzO1xyXG4gICAgICAgICAgICBpZiAoZGFzaGJvYXJkICYmIGRhc2hib2FyZC5jb25maWcpIHtcclxuICAgICAgICAgICAgICBjb25zdCBkYXRhTWFydCA9IHJlcy5maWx0ZXIoXHJcbiAgICAgICAgICAgICAgICAoaXRlbSkgPT4gaXRlbS5lbnRpdHlUeXBlID09PSBkYXNoYm9hcmQuZW50aXR5VHlwZVxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgZGF0YU1hcnQuZm9yRWFjaCgoX2RhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgIF9kYXRhLnZpZXdzLmZvckVhY2goKHZpZXcpID0+IHtcclxuICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGFWaWV3cy5maW5kKChpdGVtKSA9PiBpdGVtLmRhdGFtYXJ0Vmlld0lkID09PSB2aWV3LmlkKVxyXG4gICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICB2aWV3LnRhYmxlcy5mb3JFYWNoKCh0YWJsZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UmVzLnB1c2godGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmVzb2x2ZShvdXRwdXRSZXMpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBkZWNvbXByZXNzQXJyYXlCdWZmZXIoaW5wdXQ6IEFycmF5QnVmZmVyKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XHJcbiAgICAvL2NyZWF0ZSB0aGUgc3RyZWFtXHJcbiAgICBjb25zdCBkcyA9IG5ldyAod2luZG93IGFzIGFueSkuRGVjb21wcmVzc2lvblN0cmVhbShcImRlZmxhdGUtcmF3XCIpO1xyXG4gICAgLy9jcmVhdGUgdGhlIHdyaXRlclxyXG4gICAgY29uc3Qgd3JpdGVyID0gZHMud3JpdGFibGUuZ2V0V3JpdGVyKCk7XHJcbiAgICAvL3dyaXRlIHRoZSBidWZmZXIgdG8gdGhlIHdyaXRlciB0aHVzIGRlY29tcHJlc3NpbmcgaXRcclxuICAgIHdyaXRlci53cml0ZShpbnB1dCk7XHJcbiAgICB3cml0ZXIuY2xvc2UoKTtcclxuICAgIC8vY3JlYXRlIHRoZSBvdXRwdXRcclxuICAgIGNvbnN0IG91dHB1dDogVWludDhBcnJheVtdID0gW107XHJcbiAgICAvL2NyZWF0ZSB0aGUgcmVhZGVyXHJcbiAgICBjb25zdCByZWFkZXIgPSBkcy5yZWFkYWJsZS5nZXRSZWFkZXIoKTtcclxuICAgIGxldCB0b3RhbFNpemUgPSAwO1xyXG4gICAgLy9nbyB0aHJvdWdoIGVhY2ggY2h1bmsgYW5kIGFkZCBpdCB0byB0aGUgb3V0cHV0XHJcbiAgICB3aGlsZSAodHJ1ZSkge1xyXG4gICAgICBjb25zdCB7IHZhbHVlLCBkb25lIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xyXG4gICAgICBpZiAoZG9uZSkgYnJlYWs7XHJcbiAgICAgIG91dHB1dC5wdXNoKHZhbHVlKTtcclxuICAgICAgdG90YWxTaXplICs9IHZhbHVlLmJ5dGVMZW5ndGg7XHJcbiAgICB9XHJcbiAgICBjb25zdCBjb25jYXRlbmF0ZWQgPSBuZXcgVWludDhBcnJheSh0b3RhbFNpemUpO1xyXG4gICAgbGV0IG9mZnNldCA9IDA7XHJcbiAgICAvL2ZpbmFsbHkgYnVpbGQgdGhlIGNvbXByZXNzZWQgYXJyYXkgYW5kIHJldHVybiBpdFxyXG4gICAgZm9yIChjb25zdCBhcnJheSBvZiBvdXRwdXQpIHtcclxuICAgICAgY29uY2F0ZW5hdGVkLnNldChhcnJheSwgb2Zmc2V0KTtcclxuICAgICAgb2Zmc2V0ICs9IGFycmF5LmJ5dGVMZW5ndGg7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY29uY2F0ZW5hdGVkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRBbGxGaWVsZHMoaXRlbSwgZGFzaGJvYXJkKTogUHJvbWlzZTxhbnlbXT4ge1xyXG4gICAgY29uc3QgbGFuZyA9IHRoaXMucGJmLmdldExhbmd1YWdlUGFyYW1zKCk7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCBkYXRhTWFydENvZGUgPSBpdGVtLmZpZ3VyZUNvZGU7XHJcbiAgICAgIGNvbnN0IGRhdGFPYmogPSB7XHJcbiAgICAgICAgbGFuZ3VhZ2U6IGxhbmcsXHJcbiAgICAgICAgZGF0YU1hcnRDb2RlLFxyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLnNldFNjaGVtYVBhcmFtcyhkYXRhT2JqLCBkYXRhTWFydENvZGUsIGRhc2hib2FyZCk7XHJcbiAgICAgIHRoaXMuaHR0cC5wb3N0KHRoaXMuYXBpLnVybExpc3QuR2V0U2NoZW1hLCBkYXRhT2JqLCAocmVzKSA9PiB7XHJcbiAgICAgICAgcmVzb2x2ZShyZXMpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFNjaGVtYVBhcmFtcyhkYXRhT2JqLCBmaWd1cmVDb2RlLCBkYXNoYm9hcmQpIHtcclxuICAgIGlmICh0aGlzLmNoZWNrSXNRMlEoZGFzaGJvYXJkLmRhdGFNYXJ0VGFibGVzKSkge1xyXG4gICAgICBkYXRhT2JqW1wiZnJvbURhdGVcIl0gPSBkYXNoYm9hcmQuZnJvbURhdGU7XHJcbiAgICAgIGRhdGFPYmpbXCJhc09mRGF0ZVwiXSA9IGRhc2hib2FyZC5hc09mRGF0ZTtcclxuICAgIH0gZWxzZSBpZiAoZmlndXJlQ29kZS5pbmRleE9mKFwiRmluYW5jaWFsRmlndXJlXCIpICE9PSAtMSkge1xyXG4gICAgICBkYXRhT2JqW1wiZW50aXR5VHlwZVwiXSA9IGRhc2hib2FyZC5lbnRpdHlMaXN0Lm1hcChcclxuICAgICAgICAoaXRlbSkgPT4gaXRlbS5saW5rZWRUeXBlXHJcbiAgICAgICk7XHJcbiAgICAgIGRhdGFPYmpbXCJmcm9tRGF0ZVwiXSA9IGRhc2hib2FyZC5mcm9tRGF0ZSB8fCBcIlwiO1xyXG4gICAgICBkYXRhT2JqW1wiYXNPZkRhdGVcIl0gPSBkYXNoYm9hcmQuYXNPZkRhdGU7XHJcbiAgICB9XHJcbiAgICBpZiAoXHJcbiAgICAgIGRhc2hib2FyZCAmJlxyXG4gICAgICAoZmlndXJlQ29kZSA9PT0gXCJGdW5kT3BlcmF0aW9uc1wiIHx8XHJcbiAgICAgICAgZmlndXJlQ29kZSA9PT0gXCJGdW5kT3BlcmF0aW9uVGFibGVTZXF1b2lhXCIgfHxcclxuICAgICAgICBmaWd1cmVDb2RlLmluZGV4T2YoXCJGaW5hbmNpYWxGaWd1cmVcIikgIT09IC0xKVxyXG4gICAgKSB7XHJcbiAgICAgIGRhdGFPYmpbXCJlbnRpdHlJZHNcIl0gPSBkYXNoYm9hcmQuZW50aXR5TGlzdC5tYXAoXHJcbiAgICAgICAgKGl0ZW0pID0+IGl0ZW0ubGlua2VkR3VpZFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g5Yik5pat5piv5ZCm5Y+v6YCJ5byA5aeL5pel5pyfXHJcbiAgcHVibGljIGNoZWNrSGFzRnJvbURhdGUoZGF0YU1hcnQpIHtcclxuICAgIGNvbnN0IGhhcyA9IGRhdGFNYXJ0LmZpbmQoXHJcbiAgICAgIChpdGVtKSA9PlxyXG4gICAgICAgICFpdGVtLmlzSGlkZSAmJiBpdGVtLmRhdGFtYXJ0Q29kZSA9PT0gXCJGdW5kT3BlcmF0aW9uVGFibGVTZXF1b2lhXCJcclxuICAgICk7XHJcbiAgICByZXR1cm4gISFoYXM7XHJcbiAgfVxyXG5cclxuICAvLyDliKTmlq1RMlHvvIzmjqfliLbpobbpg6jml6XmnJ/pgInmi6nnsbvlnotcclxuICBwdWJsaWMgY2hlY2tJc1EyUShkYXRhTWFydCkge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgY29uc3QgUTJRUGF0Y2hMaXN0ID0gW1xyXG4gICAgICBcIlNlZVRocm91Z2hIaXNQb3NpdGlvblwiLFxyXG4gICAgICBcIlNlZVRocm91Z2hIaXNQb3NpdGlvbkJ5SW52ZXN0b3JcIixcclxuICAgIF07XHJcbiAgICBjb25zdCBoYXMgPSBkYXRhTWFydC5maW5kKChpdCkgPT4ge1xyXG4gICAgICByZXR1cm4gIWl0LmlzSGlkZSAmJiBRMlFQYXRjaExpc3QuaW5jbHVkZXMoaXQuZGF0YW1hcnRDb2RlKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuICEhaGFzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog5L2/55So6Ieq5a6a5LmJ5L+d5a2Y55qE5YiX5pWw5o2u77yM6KaG55uW6YCa55So5YiX6YWN572u5pWw5o2uXHJcbiAgICogQHBhcmFtIGFsbEZpZWxkcyDoh6rlrprkuYnmlbDmja5cclxuICAgKiBAcGFyYW0gZmllbGRzIOmAmueUqOWIl+mFjee9ruaVsOaNrlxyXG4gICAqIEByZXR1cm5zXHJcbiAgICovXHJcbiAgcHVibGljIHNldENvbmZpZ0ZpZWxkcyhhbGxGaWVsZHMsIGZpZWxkcykge1xyXG4gICAgYWxsRmllbGRzLmZvckVhY2goKF9maWVsZCkgPT4ge1xyXG4gICAgICBmaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcclxuICAgICAgICBpZiAoX2ZpZWxkLmNvbE5hbWUgPT09IGZpZWxkLmNvbE5hbWUpIHtcclxuICAgICAgICAgIF9maWVsZC5pc0hpZGRlbiA9IGZpZWxkLmlzSGlkZGVuO1xyXG4gICAgICAgICAgX2ZpZWxkLnZpc2libGUgPSBmaWVsZC52aXNpYmxlO1xyXG4gICAgICAgICAgX2ZpZWxkLmZvcm1hdCA9IGZpZWxkLmZvcm1hdDtcclxuICAgICAgICAgIF9maWVsZC5mb3JtdWxhID0gZmllbGQuZm9ybXVsYTtcclxuICAgICAgICAgIGlmIChmaWVsZC5zaG93R3JhbmRUb3RhbHMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBfZmllbGQuc2hvd0dyYW5kVG90YWxzID0gZmllbGQuc2hvd0dyYW5kVG90YWxzO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGZpZWxkLnNob3dTdWJUb3RhbHMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBfZmllbGQuc2hvd1N1YlRvdGFscyA9IGZpZWxkLnNob3dTdWJUb3RhbHM7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XHJcbiAgICAgIGlmIChmaWVsZC5pc0NhbGN1bGF0ZWRGaWVsZCkge1xyXG4gICAgICAgIGFsbEZpZWxkcy5wdXNoKGZpZWxkKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBjb25zdCBmaWVsZHNOYW1lID0gW107XHJcbiAgICBjb25zdCBvdXRwdXRGaWVsZHMgPSBbXTtcclxuICAgIGFsbEZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xyXG4gICAgICAvLyBxMnHlvZPkuK1sYW5nQ29kZeW+iOWkmuebuOWQjO+8jOWOu+mHjeimgeWkmuWIpOaWreS4gOS4i2FkZHRpb25OYW1lXHJcbiAgICAgIC8vIGlmICghZmllbGRzTmFtZS5pbmNsdWRlcyhmaWVsZC5sYW5nQ29kZSkgfHwgISFmaWVsZC5hZGR0aW9uTmFtZSkge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgIWZpZWxkc05hbWUuaW5jbHVkZXMoZmllbGQubGFuZ0NvZGUpICYmXHJcbiAgICAgICAgIWZpZWxkc05hbWUuaW5jbHVkZXMoZmllbGQubGFuZ1ZhbHVlKVxyXG4gICAgICApIHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IGZpZWxkLmxhbmdDb2RlIHx8IGZpZWxkLmxhbmdWYWx1ZTtcclxuICAgICAgICBmaWVsZHNOYW1lLnB1c2godmFsdWUpO1xyXG4gICAgICAgIG91dHB1dEZpZWxkcy5wdXNoKGZpZWxkKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gb3V0cHV0RmllbGRzLnNvcnQoKGEsIGIpID0+IChhLnNlcSA+PSBiLnNlcSA/IDEgOiAtMSkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldERhdGFCeVBvcnRsZXRzTmV3KFxyXG4gICAgcG9ydGxldHMsXHJcbiAgICBjYWxsYmFjayxcclxuICAgIHBhZ2VTZXR0aW5nPyxcclxuICAgIGlzUmVmcmVzaCA9IGZhbHNlLFxyXG4gICAgZGFzaGJvYXJkPzogYW55LFxyXG4gICAgcm9HZXQgPSBmYWxzZVxyXG4gICkge1xyXG4gICAgbGV0IGxlbmd0aCA9IDA7XHJcbiAgICBpZiAocG9ydGxldHMgJiYgcG9ydGxldHMubGVuZ3RoKSB7XHJcbiAgICAgIGZvciAobGV0IHBvcnRsZXQgb2YgcG9ydGxldHMpIHtcclxuICAgICAgICBsZXQgaWQgPVxyXG4gICAgICAgICAgcG9ydGxldC5pZCA9PT0gXCIwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDBcIlxyXG4gICAgICAgICAgICA/IHBvcnRsZXQubmV3SWRcclxuICAgICAgICAgICAgOiBwb3J0bGV0LmlkO1xyXG4gICAgICAgIGNvbnN0IGFsbEZpZWxkcyA9IGF3YWl0IHRoaXMuZ2V0QWxsRmllbGRzKHBvcnRsZXQsIGRhc2hib2FyZCk7XHJcbiAgICAgICAgbGV0IHBhcmFtcyA9IHRoaXMuZ2V0UGFyYW1zQnlQb3J0bGV0KFxyXG4gICAgICAgICAgcG9ydGxldCxcclxuICAgICAgICAgIHBhZ2VTZXR0aW5nLFxyXG4gICAgICAgICAgYWxsRmllbGRzLFxyXG4gICAgICAgICAgZGFzaGJvYXJkXHJcbiAgICAgICAgKTtcclxuICAgICAgICBsZXQgaW5pdEZpZWxkc0FycjtcclxuICAgICAgICBsZXQgY3VyRmllbGRzQXJyO1xyXG4gICAgICAgIGlmICghcGFyYW1zLmlzVGFibGUgJiYgIXJvR2V0KSB7XHJcbiAgICAgICAgICAvLyDotYvlgLxwb3J0bGV0RmllbGRzX1RlbXBcclxuICAgICAgICAgIGluaXRGaWVsZHNBcnIgPSB0aGlzLnBvcnRsZXRGaWVsZHNfVGVtcFtpZF07XHJcbiAgICAgICAgICBjdXJGaWVsZHNBcnIgPSBwYXJhbXMuZGlzcGxheUNvbHVtbkZpbHRlci5zcGxpdChcIixcIik7XHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICFpbml0RmllbGRzQXJyIHx8XHJcbiAgICAgICAgICAgIHRoaXMubmVlZEdldFBvcnRsZXREYXRhKGluaXRGaWVsZHNBcnIsIGN1ckZpZWxkc0FycilcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICB0aGlzLnBvcnRsZXRGaWVsZHNfVGVtcFtpZF0gPSBjdXJGaWVsZHNBcnI7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZW5ndGgrKztcclxuICAgICAgICAgICAgaWYgKHBvcnRsZXRzLmxlbmd0aCA9PT0gbGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgY2FsbGJhY2soKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY29uZmlnID0gcG9ydGxldC5jb25maWcgJiYgSlNPTi5wYXJzZShwb3J0bGV0LmNvbmZpZyk7XHJcbiAgICAgICAgaWYgKGNvbmZpZy5maWx0ZXJTZXR0aW5ncyAmJiBjb25maWcuZmlsdGVyU2V0dGluZ3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICBpZiAoIXBhcmFtcy5jb2x1bW5GaWx0ZXIpIHtcclxuICAgICAgICAgICAgcGFyYW1zLmNvbHVtbkZpbHRlciA9IFtdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY29uZmlnLmZpbHRlclNldHRpbmdzLmZvckVhY2goKHNldHRpbmcpID0+IHtcclxuICAgICAgICAgICAgaWYgKGNvbmZpZy5wb3J0bGV0VHlwZSA9PT0gXCJwaXZvdFwiKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IF9maWVsZCA9IGNvbmZpZy5maWVsZHMuZmluZChcclxuICAgICAgICAgICAgICAoaXRlbSkgPT4gaXRlbS5jb2xOYW1lID09PSBzZXR0aW5nLm5hbWVcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgY29uc3QgVHlwZSA9IF9maWVsZCAmJiBfZmllbGQuZGF0YVR5cGU7XHJcbiAgICAgICAgICAgIGlmIChzZXR0aW5nLml0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgc2V0dGluZy5pdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBwYXJhbXMuY29sdW1uRmlsdGVyLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICBGaWVsZDogc2V0dGluZy5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICBPcGVyYXRvcjogXCJlcXVhbFwiLFxyXG4gICAgICAgICAgICAgICAgICBUeXBlLFxyXG4gICAgICAgICAgICAgICAgICBWYWx1ZTpcclxuICAgICAgICAgICAgICAgICAgICBUeXBlID09PSBcImRhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgPyBtb21lbnQoaXRlbSkuZm9ybWF0KFwieXl5eS1NTS1ERFwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgOiBUeXBlID09PSBcImRhdGV0aW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgID8gbW9tZW50KGl0ZW0pLmZvcm1hdChcInl5eXktTU0tREQgaGg6bW06c3NcIilcclxuICAgICAgICAgICAgICAgICAgICAgIDogaXRlbSxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNldHRpbmcub3BlcmF0b3IpIHtcclxuICAgICAgICAgICAgICBwYXJhbXMuY29sdW1uRmlsdGVyLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgRmllbGQ6IHNldHRpbmcuZmllbGQsXHJcbiAgICAgICAgICAgICAgICBPcGVyYXRvcjogXCJlcXVhbFwiLFxyXG4gICAgICAgICAgICAgICAgVHlwZTogc2V0dGluZy50eXBlLFxyXG4gICAgICAgICAgICAgICAgVmFsdWU6XHJcbiAgICAgICAgICAgICAgICAgIHNldHRpbmcudHlwZSA9PT0gXCJkYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICA/IG1vbWVudChzZXR0aW5nLnZhbHVlKS5mb3JtYXQoXCJ5eXl5LU1NLUREXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgOiBzZXR0aW5nLnR5cGUgPT09IFwiZGF0ZXRpbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgID8gbW9tZW50KHNldHRpbmcudmFsdWUpLmZvcm1hdChcInl5eXktTU0tREQgaGg6bW06c3NcIilcclxuICAgICAgICAgICAgICAgICAgICA6IHNldHRpbmcudmFsdWUsXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocGFyYW1zLmNvbHVtbkZpbHRlciBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgICAgICBwYXJhbXMuY29sdW1uRmlsdGVyID0gcGFyYW1zLmNvbHVtbkZpbHRlci5maWx0ZXIoXHJcbiAgICAgICAgICAgIChpdGVtKSA9PiBpdGVtLkZpZWxkXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8ganNvbiBidWZmZXJcclxuICAgICAgICBwYXJhbXNbXCJkYXNoYm9hcmRWZXJzaW9uXCJdID0gMjtcclxuICAgICAgICB0aGlzLmh0dHBDbGllbnRcclxuICAgICAgICAgIC5wb3N0KFxyXG4gICAgICAgICAgICB0aGlzLmFwaS5iYXNldXJsICsgdGhpcy5hcGkudXJsTGlzdC5HZXRQb3J0bGV0RGF0YU9yQ3JlYXRlLFxyXG4gICAgICAgICAgICBwYXJhbXMsXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xyXG4gICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlcmAsXHJcbiAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIClcclxuICAgICAgICAgIC5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAgIChyZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wb3J0bGV0RGF0YV9OZXdbZGFzaGJvYXJkLmlkXVtpZF0gPSB7XHJcbiAgICAgICAgICAgICAgICAgIHRvdGFsOiAwLFxyXG4gICAgICAgICAgICAgICAgICBkYXRhOiBbXSxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNSZWZyZXNoKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuRGFzaGJvYXJkU2VydmljZS5yZWZyZXNoR2FkZ2V0Lm5leHQoe1xyXG4gICAgICAgICAgICAgICAgICAgIG5ld0lkOiBpZCxcclxuICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZW5ndGgrKztcclxuICAgICAgICAgICAgICAgIGlmIChpc1JlZnJlc2gpIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5EYXNoYm9hcmRTZXJ2aWNlLnJlZnJlc2hHYWRnZXQubmV4dCh7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3SWQ6IGlkLFxyXG4gICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChwb3J0bGV0cy5sZW5ndGggPT09IGxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoaXNSZWZyZXNoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5EYXNoYm9hcmRTZXJ2aWNlLnN0YXJ0UmVmcmVzaC5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHRbXCJkYXRhXCJdLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgaXRlbS5TZWN0b3IgPSB0aGlzLnRyYW5zbGF0aW9uW2l0ZW0uU2VjdG9yXSB8fCBpdGVtLlNlY3RvcjtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wb3J0bGV0RGF0YV9OZXdbZGFzaGJvYXJkLmlkXVtpZF0gPSByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNSZWZyZXNoKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuRGFzaGJvYXJkU2VydmljZS5yZWZyZXNoR2FkZ2V0Lm5leHQoe1xyXG4gICAgICAgICAgICAgICAgICAgIG5ld0lkOiBpZCxcclxuICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZW5ndGgrKztcclxuICAgICAgICAgICAgICAgIGlmIChwb3J0bGV0cy5sZW5ndGggPT09IGxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoaXNSZWZyZXNoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5EYXNoYm9hcmRTZXJ2aWNlLnN0YXJ0UmVmcmVzaC5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5wb3J0bGV0RmllbGRzX1RlbXBbaWRdID0gaW5pdEZpZWxkc0FycjtcclxuICAgICAgICAgICAgICBsZW5ndGgrKztcclxuICAgICAgICAgICAgICBpZiAocG9ydGxldHMubGVuZ3RoID09PSBsZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAoKSA9PiB7fVxyXG4gICAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY2FsbGJhY2soKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbGVhckZpZWxkc09iaihwb3J0bGV0KSB7XHJcbiAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KHRoaXMuYWxsRmllbGRzT2JqLCBwb3J0bGV0LmlkKTtcclxuICB9XHJcblxyXG4gIC8vIOagueaNrnBvcnRsZXQg6Kej5p6QcGFyYW1zXHJcbiAgcHVibGljIGdldFBhcmFtc0J5UG9ydGxldChcclxuICAgIHBvcnRsZXQsXHJcbiAgICBwYWdlU2V0dGluZz8sXHJcbiAgICBhbGxGaWVsZHM/OiBhbnlbXSxcclxuICAgIGRhc2hib2FyZD86IGFueVxyXG4gICkge1xyXG4gICAgbGV0IGRhc2hib2FyZERhdGFUYWJsZUlkID0gcG9ydGxldC5kYXNoYm9hcmREYXRhVGFibGVJZDtcclxuICAgIC8vU01QMi03NzMxIGdldCB0aGUgZGFzaGJvYXJkRGF0YVRhYmxlaWQgZnJvbSBkYXRhTWFydFRhYmxlcyBhcnJhcnlcclxuICAgIGxldCBjdXJEYXRhTWFydCA9IHRoaXMuZGF0YU1hcnRUYWJsZXNbZGFzaGJvYXJkLmlkXS5maW5kKFxyXG4gICAgICAoZCkgPT4gZC5kYXRhbWFydENvZGUgPT09IHBvcnRsZXQuZmlndXJlQ29kZVxyXG4gICAgKTtcclxuICAgIGlmIChjdXJEYXRhTWFydCkge1xyXG4gICAgICBkYXNoYm9hcmREYXRhVGFibGVJZCA9IGN1ckRhdGFNYXJ0LmlkO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBjb25maWcgPSBwb3J0bGV0LmNvbmZpZyAmJiBKU09OLnBhcnNlKHBvcnRsZXQuY29uZmlnKTtcclxuICAgIGlmIChwb3J0bGV0LmlkICE9PSBcIjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMFwiKSB7XHJcbiAgICAgIHRoaXMuYWxsRmllbGRzT2JqW3BvcnRsZXQuaWRdID0gYWxsRmllbGRzO1xyXG4gICAgfVxyXG4gICAgbGV0IGZpZWxkcyA9IGFsbEZpZWxkc1xyXG4gICAgICA/IHRoaXMuc2V0Q29uZmlnRmllbGRzKGFsbEZpZWxkcywgY29uZmlnLmZpZWxkcylcclxuICAgICAgOiBjb25maWcuZmllbGRzO1xyXG4gICAgaWYgKGFsbEZpZWxkcykge1xyXG4gICAgICBjb25maWcuZmllbGRzID0gZmllbGRzO1xyXG4gICAgICBwb3J0bGV0LmNvbmZpZyA9IEpTT04uc3RyaW5naWZ5KGNvbmZpZyk7XHJcbiAgICB9XHJcbiAgICBsZXQgY2FsY3VsYXRlZEZpZWxkcyA9IGNvbmZpZy5jYWxjdWxhdGVkRmllbGRTZXR0aW5ncztcclxuICAgIGxldCBuZWVkRmllbGRzID0gW107XHJcbiAgICBsZXQgcGFyYW1zOiBhbnkgPSB7fTtcclxuICAgIGNvbnN0IHBvcnRsZXRUeXBlID1cclxuICAgICAgY29uZmlnLnBvcnRsZXRUeXBlID09PSBcImhpc3RvcmljYWxJUlJcIlxyXG4gICAgICAgID8gY29uZmlnLnNlbGVjdGVkVmlzdWFsVHlwZVxyXG4gICAgICAgIDogY29uZmlnLnBvcnRsZXRUeXBlO1xyXG4gICAgaWYgKHBvcnRsZXRUeXBlID09PSBcInRhYmxlXCIpIHtcclxuICAgICAgZmllbGRzICYmXHJcbiAgICAgICAgZmllbGRzLmZvckVhY2goKHgpID0+IHtcclxuICAgICAgICAgIG5lZWRGaWVsZHMucHVzaCh4LmNvbE5hbWUpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgcGFyYW1zLnN0YXJ0SW5kZXggPSAwO1xyXG4gICAgICBwYXJhbXMucGFnZVNpemUgPSAxMDtcclxuICAgICAgaWYgKHBhZ2VTZXR0aW5nICYmIHBhZ2VTZXR0aW5nLmN1cnJlbnRQYWdlKSB7XHJcbiAgICAgICAgcGFyYW1zLnN0YXJ0SW5kZXggPVxyXG4gICAgICAgICAgKHBhZ2VTZXR0aW5nLmN1cnJlbnRQYWdlIC0gMSkgKiBwYWdlU2V0dGluZy5wYWdlU2l6ZTtcclxuICAgICAgICBwYXJhbXMucGFnZVNpemUgPSBwYWdlU2V0dGluZy5wYWdlU2l6ZTtcclxuICAgICAgfVxyXG4gICAgICAvLyDlpITnkIYgc29ydFxyXG4gICAgICBpZiAocGFnZVNldHRpbmcgJiYgcGFnZVNldHRpbmcuc29ydGVkQ29sdW1uKSB7XHJcbiAgICAgICAgcGFyYW1zLnNvcnRlZENvbHVtbiA9IHBhZ2VTZXR0aW5nLnNvcnRlZENvbHVtbjtcclxuICAgICAgICBwYXJhbXMuc29ydCA9IHBhZ2VTZXR0aW5nLnNvcnQ7XHJcbiAgICAgIH1cclxuICAgICAgLy8g5aSE55CGIGZpbHRlclxyXG4gICAgICBpZiAoY29uZmlnLmZpbHRlclNldHRpbmdzLmxlbmd0aCkge1xyXG4gICAgICAgIGxldCBmaWx0ZXJTZXR0aW5ncyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoY29uZmlnLmZpbHRlclNldHRpbmdzKSk7XHJcbiAgICAgICAgcGFyYW1zLmNvbHVtbkZpbHRlciA9IGZpbHRlclNldHRpbmdzLm1hcCgoeCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHgudHlwZSA9PT0gXCJkYXRlXCIpIHtcclxuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHgudmFsdWUpO1xyXG4gICAgICAgICAgICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xyXG4gICAgICAgICAgICBjb25zdCBtb250aCA9IFN0cmluZyhkYXRlLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCBcIjBcIik7XHJcbiAgICAgICAgICAgIGNvbnN0IGRheSA9IFN0cmluZyhkYXRlLmdldERhdGUoKSkucGFkU3RhcnQoMiwgXCIwXCIpO1xyXG4gICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWREYXRlID0gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9YDtcclxuICAgICAgICAgICAgeC52YWx1ZSA9IGZvcm1hdHRlZERhdGU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4geDtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICBwYXJhbXMuaXNUYWJsZSA9IHRydWU7XHJcbiAgICB9IGVsc2UgaWYgKHBvcnRsZXRUeXBlID09PSBcInRyYW5zcG9zZVwiKSB7XHJcbiAgICAgIGZpZWxkcyAmJlxyXG4gICAgICAgIGZpZWxkcy5mb3JFYWNoKCh4KSA9PiB7XHJcbiAgICAgICAgICBpZiAoIXguaXNIaWRkZW4pIHtcclxuICAgICAgICAgICAgbmVlZEZpZWxkcy5wdXNoKHguY29sTmFtZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICBbXCJuZXdjb2x1bW5cIiwgXCJuZXdsaW5lXCIsIFwibmV3Y29sdW1ubGluZVwiXS5pbmNsdWRlcyhwb3J0bGV0VHlwZSlcclxuICAgICkge1xyXG4gICAgICBpZiAoY29uZmlnLnNlbGVjdGVkWSAmJiBjb25maWcuc2VsZWN0ZWRZLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25maWcuc2VsZWN0ZWRZLmZvckVhY2goKGUpID0+IHtcclxuICAgICAgICAgIG5lZWRGaWVsZHMucHVzaChlKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoY29uZmlnLnNlbGVjdGVkU2Vjb25kWSAmJiBjb25maWcuc2VsZWN0ZWRTZWNvbmRZLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25maWcuc2VsZWN0ZWRTZWNvbmRZLmZvckVhY2goKGUpID0+IHtcclxuICAgICAgICAgIG5lZWRGaWVsZHMucHVzaChlKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8g5aSE55CGIGZpbHRlcnNcclxuICAgICAgbGV0IGZpbHRlcnMgPSBjb25maWcuZmlsdGVycztcclxuICAgICAgaWYgKGZpbHRlcnMgJiYgZmlsdGVycy5sZW5ndGgpIHtcclxuICAgICAgICBmb3IgKGxldCBpdGVtIG9mIGZpbHRlcnMpIHtcclxuICAgICAgICAgIG5lZWRGaWVsZHMucHVzaChpdGVtLm5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8g5aSE55CGIHZhbHVlc1xyXG4gICAgICBsZXQgc2VyaWVzID0gY29uZmlnLnlheGlzLnNlcmllcztcclxuICAgICAgaWYgKHNlcmllcyAmJiBzZXJpZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaXRlbSBvZiBzZXJpZXMpIHtcclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgW1xyXG4gICAgICAgICAgICAgIFwiQ2FsY3VsYXRlSVJSXCIsXHJcbiAgICAgICAgICAgICAgXCJDYWxjdWxhdGVJUlJNVERcIixcclxuICAgICAgICAgICAgICBcIkNhbGN1bGF0ZUlSUlFURFwiLFxyXG4gICAgICAgICAgICAgIFwiQ2FsY3VsYXRlSVJSWVREXCIsXHJcbiAgICAgICAgICAgICAgXCJDYWxjdWxhdGVUV1JNVERcIixcclxuICAgICAgICAgICAgICBcIkNhbGN1bGF0ZVRXUlFURFwiLFxyXG4gICAgICAgICAgICAgIFwiQ2FsY3VsYXRlVFdSWVREXCIsXHJcbiAgICAgICAgICAgICAgXCJDYWxjdWxhdGVWQVJNVERfOTlcIixcclxuICAgICAgICAgICAgICBcIkNhbGN1bGF0ZVZBUlFURF85OVwiLFxyXG4gICAgICAgICAgICAgIFwiQ2FsY3VsYXRlVkFSWVREXzk5XCIsXHJcbiAgICAgICAgICAgICAgXCJDYWxjdWxhdGVWQVJNVERfOTVcIixcclxuICAgICAgICAgICAgICBcIkNhbGN1bGF0ZVZBUlFURF85NVwiLFxyXG4gICAgICAgICAgICAgIFwiQ2FsY3VsYXRlVkFSWVREXzk1XCIsXHJcbiAgICAgICAgICAgIF0uaW5jbHVkZXMoaXRlbS5jYWxNZXRob2QpXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgbmVlZEZpZWxkcy5wdXNoKFwiSVJSQW1vdW50XCIsIFwiSVJSRGF0ZVwiLCBcIklSUkFkalZhbHVlXCIpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChpdGVtLmNhbE1ldGhvZCA9PT0gXCJDYWxjdWxhdGVJUlJCZWZvcmVDYXJyaWVkXCIpIHtcclxuICAgICAgICAgICAgbmVlZEZpZWxkcy5wdXNoKFwiSVJSQW1vdW50XCIsIFwiSVJSRGF0ZVwiLCBcIklSUkFkalZhbHVlQmVmb3JlQ2FycnlcIik7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uY2FsTWV0aG9kID09PSBcIkNhbGN1bGF0ZUlSUklSUkRhdGVcIikge1xyXG4gICAgICAgICAgICBuZWVkRmllbGRzLnB1c2goXCJJUlJBbW91bnRcIiwgXCJDYWxjdWxhdGVJUlJEYXRlXCIsIFwiSVJSQWRqVmFsdWVcIik7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uY2FsTWV0aG9kID09PSBcIkNhbGN1bGF0ZUlSUkFjdHVhbEF1ZGl0ZWRcIikge1xyXG4gICAgICAgICAgICBwb3J0bGV0LmZpZ3VyZUNvZGUgPT09IFwiR3Jvc3NOZXRcIiB8fFxyXG4gICAgICAgICAgICBwb3J0bGV0LmZpZ3VyZUNvZGUgPT09IFwiQ29tYmluZWRJbnZlc3RtZW50RnVuZE5Db21wYW55Q2FzaGZsb3dcIlxyXG4gICAgICAgICAgICAgID8gbmVlZEZpZWxkcy5wdXNoKFwiSVJSQW1vdW50XCIsIFwiSVJSRGF0ZVwiLCBcIkFjdHVhbEF1ZGl0ZWROQVZcIilcclxuICAgICAgICAgICAgICA6IG5lZWRGaWVsZHMucHVzaChcIklSUkFtb3VudFwiLCBcIklSUkRhdGVcIiwgXCJJUlJBZGpWYWx1ZVwiKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbS5jYWxNZXRob2QgPT09IFwiQ2FsY3VsYXRlSVJSUmVwb3J0ZWRcIikge1xyXG4gICAgICAgICAgICBwb3J0bGV0LmZpZ3VyZUNvZGUgPT09IFwiR3Jvc3NOZXRcIiB8fFxyXG4gICAgICAgICAgICBwb3J0bGV0LmZpZ3VyZUNvZGUgPT09IFwiQ29tYmluZWRJbnZlc3RtZW50RnVuZE5Db21wYW55Q2FzaGZsb3dcIlxyXG4gICAgICAgICAgICAgID8gbmVlZEZpZWxkcy5wdXNoKFwiSVJSQW1vdW50XCIsIFwiSVJSRGF0ZVwiLCBcIlJlcG9ydGVkTkFWXCIpXHJcbiAgICAgICAgICAgICAgOiBuZWVkRmllbGRzLnB1c2goXCJJUlJBbW91bnRcIiwgXCJJUlJEYXRlXCIsIFwiSVJSQWRqVmFsdWVcIik7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uY2FsTWV0aG9kID09PSBcIkNhbGN1bGF0ZWRGaWVsZFwiKSB7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgY29sTmFtZSA9IHRoaXMuZ2V0QWdncmVnYXRlVHlwZShpdGVtLmNhbE1ldGhvZCk7XHJcbiAgICAgICAgICAgIGlmIChjb2xOYW1lKSB7XHJcbiAgICAgICAgICAgICAgbGV0IGN1ckZpZWxkID0gZmllbGRzLmZpbmQoKGYpID0+IGYuY29sTmFtZSA9PT0gY29sTmFtZSk7XHJcbiAgICAgICAgICAgICAgaWYgKGN1ckZpZWxkICYmIGN1ckZpZWxkLmZvcm11bGEpIHtcclxuICAgICAgICAgICAgICAgIGxldCBmcyA9IGN1ckZpZWxkLmZvcm11bGEuc3BsaXQoXCIvXCIpO1xyXG4gICAgICAgICAgICAgICAgZnMgJiYgZnMubWFwKChmKSA9PiBuZWVkRmllbGRzLnB1c2goZikpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBuZWVkRmllbGRzLnB1c2goaXRlbS5jb2xOYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyDlpITnkIYgcm93c1xyXG4gICAgICBsZXQgZ3JvdXBzID0gY29uZmlnLnhheGlzLmdyb3VwcztcclxuICAgICAgaWYgKGdyb3VwcyAmJiBncm91cHMubGVuZ3RoKSB7XHJcbiAgICAgICAgZm9yIChsZXQgZ2l0ZW0gb2YgZ3JvdXBzKSB7XHJcbiAgICAgICAgICBuZWVkRmllbGRzLnB1c2goZ2l0ZW0ubmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIOWkhOeQhiBjb2x1bm1zXHJcbiAgICAgIGxldCBjb2x1bW5Hcm91cCA9IGNvbmZpZy5jb2x1bW5Hcm91cDtcclxuICAgICAgaWYgKGNvbHVtbkdyb3VwICYmIGNvbHVtbkdyb3VwLmxlbmd0aCkge1xyXG4gICAgICAgIGZvciAobGV0IGl0ZW0gb2YgY29sdW1uR3JvdXApIHtcclxuICAgICAgICAgIG5lZWRGaWVsZHMucHVzaChpdGVtLm5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyDlpITnkIYgY2FsY3VsYXRlZEZpZWxkXHJcbiAgICAgIGlmIChjYWxjdWxhdGVkRmllbGRzICYmIGNhbGN1bGF0ZWRGaWVsZHMubGVuZ3RoKSB7XHJcbiAgICAgICAgY2FsY3VsYXRlZEZpZWxkcy5tYXAoKGYpID0+IHtcclxuICAgICAgICAgIGxldCBzdHJpbmcgPSBmLmZvcm11bGE7XHJcbiAgICAgICAgICBjb25zdCByZWdleCA9IC9cXCgoLio/KVxcKS9nO1xyXG4gICAgICAgICAgY29uc3QgbWF0Y2hlcyA9IHN0cmluZ1xyXG4gICAgICAgICAgICAubWF0Y2gocmVnZXgpXHJcbiAgICAgICAgICAgIC5tYXAoKG1hdGNoKSA9PiBtYXRjaC5zbGljZSgxLCAtMSkpO1xyXG4gICAgICAgICAgbmVlZEZpZWxkcy5wdXNoKC4uLm1hdGNoZXMpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIOWkhOeQhiBvcmRlckJ5Q29sdW1uc1xyXG4gICAgICBpZiAodGhpcy5kYXNoYm9hcmRDb25maWcgJiYgdGhpcy5kYXNoYm9hcmRDb25maWdbZGFzaGJvYXJkLmlkXSkge1xyXG4gICAgICAgIHBhcmFtcy5kYXRhbWFydFZpZXdJZCA9XHJcbiAgICAgICAgICB0aGlzLmRhc2hib2FyZENvbmZpZ1tkYXNoYm9hcmQuaWRdLmRhdGFtYXJ0Vmlld0lkO1xyXG4gICAgICAgIHBhcmFtcy5kYXRhbWFydElkID0gdGhpcy5kYXNoYm9hcmRDb25maWdbZGFzaGJvYXJkLmlkXS5kYXRhbWFydElkO1xyXG4gICAgICAgIHBhcmFtcy5kYXRhbWFydENvZGUgPSBwb3J0bGV0LmZpZ3VyZUNvZGU7XHJcbiAgICAgIH1cclxuICAgICAgLy8g5aSE55CGY29uZmlnLmZpZWxkc+mHjOeahHNvcnRDb2x1bW5cclxuICAgICAgbGV0IGZpZWxkU29ydENvbHVtbnMgPSBbXTtcclxuICAgICAgZmllbGRzLm1hcCgoeCkgPT4ge1xyXG4gICAgICAgIGlmICh4LnNvcnRDb2x1bW4gJiYgIWZpZWxkU29ydENvbHVtbnMuaW5jbHVkZXMoeC5zb3J0Q29sdW1uKSkge1xyXG4gICAgICAgICAgZmllbGRTb3J0Q29sdW1ucy5wdXNoKHguc29ydENvbHVtbik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgaWYgKGZpZWxkU29ydENvbHVtbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgbmVlZEZpZWxkcy5wdXNoKC4uLmZpZWxkU29ydENvbHVtbnMpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmVlZEZpZWxkcyA9IEFycmF5LmZyb20obmV3IFNldChuZWVkRmllbGRzKSk7XHJcbiAgICAvLyDljrvpmaTpnZ7ms5XlrZfmrrVcclxuICAgIGxldCBsZWdhbEZpZWxkcyA9IGZpZWxkcy5tYXAoKHgpID0+IHguY29sTmFtZSk7XHJcbiAgICBuZWVkRmllbGRzLm1hcCgoeCwgaSkgPT4ge1xyXG4gICAgICBpZiAoIWxlZ2FsRmllbGRzLmluY2x1ZGVzKHgpKSB7XHJcbiAgICAgICAgbmVlZEZpZWxkcy5zcGxpY2UoaSwgMSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgaWYgKG5lZWRGaWVsZHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIGlmIChsZWdhbEZpZWxkc1swXSkge1xyXG4gICAgICAgIG5lZWRGaWVsZHMucHVzaChsZWdhbEZpZWxkc1swXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIOm7mOiupOiOt+WPllNlceWtl+autSBTTVAyLTQ1ODIgQUdJQyAtIERhc2hib2FyZCBpdGVtIHNlcXVlbmNlXHJcbiAgICBuZWVkRmllbGRzLnB1c2goXCJTZXFcIik7XHJcblxyXG4gICAgLy8gXCJuZXdjb2x1bW5cIiwgXCJuZXdsaW5lXCIsIFwibmV3Y29sdW1ubGluZVwiIOWmguaenOaYr+i/meS4ieenjeexu+Wei+m7mOiupOWKoCBPcGVyYXRpb25EYXRlIOWtl+autVxyXG4gICAgaWYgKFtcIm5ld2NvbHVtblwiLCBcIm5ld2xpbmVcIiwgXCJuZXdjb2x1bW5saW5lXCJdLmluY2x1ZGVzKHBvcnRsZXRUeXBlKSkge1xyXG4gICAgICBuZWVkRmllbGRzLnB1c2goY29uZmlnLnNlbGVjdGVkWCk7XHJcbiAgICAgIHBhcmFtc1tcIklzT25seVNob3dEaXNwbGF5Q29sdW1cIl0gPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKGNvbmZpZy5wb3J0bGV0VHlwZSA9PT0gXCJoaXN0b3JpY2FsSVJSXCIpIHtcclxuICAgICAgaWYgKCFwYXJhbXMuY29sdW1uRmlsdGVyKSB7XHJcbiAgICAgICAgcGFyYW1zLmNvbHVtbkZpbHRlciA9IFtdO1xyXG4gICAgICB9XHJcbiAgICAgIHBhcmFtcy5jb2x1bW5GaWx0ZXIucHVzaChcclxuICAgICAgICB7XHJcbiAgICAgICAgICBGaWVsZDogXCJGcmVxdWVuY3lzXCIsXHJcbiAgICAgICAgICBPcGVyYXRvcjogXCJlcXVhbFwiLFxyXG4gICAgICAgICAgVHlwZTogXCJzdHJpbmdcIixcclxuICAgICAgICAgIFZhbHVlOiBjb25maWcuc2VsZWN0ZWRNdWx0aXBsZXMsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBGaWVsZDogXCJJbnZlc3RvclR5cGVcIixcclxuICAgICAgICAgIE9wZXJhdG9yOiBcImVxdWFsXCIsXHJcbiAgICAgICAgICBUeXBlOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgVmFsdWU6IGNvbmZpZy5zZWxlY3RlZEludmVzdG9yLFxyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHBhcmFtcy5kYXNoYm9hcmREYXRhVGFibGVJZCA9IGRhc2hib2FyZERhdGFUYWJsZUlkO1xyXG4gICAgcGFyYW1zLmRpc3BsYXlDb2x1bW5GaWx0ZXIgPSBuZWVkRmllbGRzLmpvaW4oXCIsXCIpO1xyXG4gICAgcGFyYW1zLnJlc3BvbnNlVHlwZSA9IFwianNvblwiO1xyXG4gICAgcmV0dXJuIHBhcmFtcztcclxuICB9XHJcblxyXG4gIC8vIOaYr+WQpumcgOimgemHjeaWsOWPkei1t+ivt+axglxyXG4gIHB1YmxpYyBuZWVkR2V0UG9ydGxldERhdGEob3JpZ2luID0gW10sIGNvbXBhcmUgPSBbXSkge1xyXG4gICAgcmV0dXJuIGNvbXBhcmUuc29tZSgoYykgPT4gIW9yaWdpbi5pbmNsdWRlcyhjKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0RGF0YU1hbmFnZXIoXHJcbiAgICBmaWd1cmVDb2RlcyxcclxuICAgIGNhbGxiYWNrLFxyXG4gICAgcG9ydGxldFR5cGVzID0gW10sXHJcbiAgICBkYXNoYm9hcmRJZCxcclxuICAgIHBvcnRsZXQ/OiBhbnlcclxuICApIHtcclxuICAgIGxldCBsZW5ndGggPSAwO1xyXG4gICAgaWYgKCF0aGlzLmZpZWxkc0FycltkYXNoYm9hcmRJZF0pIHtcclxuICAgICAgdGhpcy5maWVsZHNBcnJbZGFzaGJvYXJkSWRdID0ge307XHJcbiAgICB9XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuZGF0YU1hcnRUYWJsZXNbZGFzaGJvYXJkSWRdICYmXHJcbiAgICAgIHRoaXMuZGF0YU1hcnRUYWJsZXNbZGFzaGJvYXJkSWRdLmxlbmd0aFxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMucGJmLnBhZ2VMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgdGhpcy5wYmYucGFnZUxvYWRpbmdfLm5leHQodHJ1ZSk7XHJcbiAgICAgIGxldCBkYXRhTWFydFRhYmxlcyA9IHRoaXMuZGF0YU1hcnRUYWJsZXNbZGFzaGJvYXJkSWRdLmZpbHRlcigoZWwpID0+XHJcbiAgICAgICAgZmlndXJlQ29kZXMuaW5jbHVkZXMoZWwuZGF0YW1hcnRDb2RlKVxyXG4gICAgICApO1xyXG4gICAgICBpZiAoZGF0YU1hcnRUYWJsZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgZm9yRWFjaChkYXRhTWFydFRhYmxlcywgKGl0ZW0sIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICBsZXQgYWxsRmllbGRzO1xyXG4gICAgICAgICAgbGV0IGNvbmZpZztcclxuICAgICAgICAgIGlmIChwb3J0bGV0KSB7XHJcbiAgICAgICAgICAgIGNvbmZpZyA9IEpTT04ucGFyc2UocG9ydGxldC5jb25maWcpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBbXCJuZXdjb2x1bW5cIiwgXCJuZXdsaW5lXCIsIFwibmV3Y29sdW1ubGluZVwiXS5pbmNsdWRlcyhwb3J0bGV0VHlwZXNbMF0pXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgYWxsRmllbGRzID0gY29uZmlnLnNlbGVjdGVkWVxyXG4gICAgICAgICAgICAgIC5jb25jYXQoY29uZmlnLnNlbGVjdGVkU2Vjb25kWSlcclxuICAgICAgICAgICAgICAuY29uY2F0KFtjb25maWcuc2VsZWN0ZWRYXSlcclxuICAgICAgICAgICAgICAubWFwKChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICBjb2xOYW1lOiBlLFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGFsbEZpZWxkcyA9XHJcbiAgICAgICAgICAgICAgdGhpcy5maWVsZHNBcnJbZGFzaGJvYXJkSWRdICYmXHJcbiAgICAgICAgICAgICAgdGhpcy5maWVsZHNBcnJbZGFzaGJvYXJkSWRdW2l0ZW0uZGF0YW1hcnRDb2RlXVxyXG4gICAgICAgICAgICAgICAgPyB0aGlzLmZpZWxkc0FycltkYXNoYm9hcmRJZF1baXRlbS5kYXRhbWFydENvZGVdXHJcbiAgICAgICAgICAgICAgICA6IFtdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbGV0IGRpc3BsYXlDb2x1bW5GaWx0ZXIgPVxyXG4gICAgICAgICAgICBhbGxGaWVsZHMgJiYgYWxsRmllbGRzLm1hcCgoeCkgPT4geC5jb2xOYW1lKS5qb2luKFwiLFwiKTtcclxuICAgICAgICAgIGxldCBwYXJhbXM6IGFueSA9IHtcclxuICAgICAgICAgICAgZGFzaGJvYXJkRGF0YVRhYmxlSWQ6IGl0ZW0uaWQsXHJcbiAgICAgICAgICAgIGRpc3BsYXlDb2x1bW5GaWx0ZXI6IGRpc3BsYXlDb2x1bW5GaWx0ZXIsXHJcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJqc29uXCIsXHJcbiAgICAgICAgICAgIGRhc2hib2FyZFZlcnNpb246IDIsXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgcGFyYW1zLnN0YXJ0SW5kZXggPSAwO1xyXG4gICAgICAgICAgcGFyYW1zLnBhZ2VTaXplID0gMTA7XHJcblxyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBwb3J0bGV0VHlwZXMgJiZcclxuICAgICAgICAgICAgcG9ydGxldFR5cGVzLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgKHBvcnRsZXRUeXBlcy5pbmNsdWRlcyhcIm5ld2NvbHVtblwiKSB8fFxyXG4gICAgICAgICAgICAgIHBvcnRsZXRUeXBlcy5pbmNsdWRlcyhcIm5ld2xpbmVcIikgfHxcclxuICAgICAgICAgICAgICBwb3J0bGV0VHlwZXMuaW5jbHVkZXMoXCJuZXdjb2x1bW5saW5lXCIpKVxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHBhcmFtcy5wYWdlU2l6ZSA9IDEwMDAwMDA7XHJcbiAgICAgICAgICAgIHBhcmFtc1tcIklzT25seVNob3dEaXNwbGF5Q29sdW1cIl0gPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChjb25maWcpIHtcclxuICAgICAgICAgICAgY29uc3QgZmlsdGVyU2V0dGluZ3MgPSBjb25maWcuZmlsdGVyU2V0dGluZ3M7XHJcblxyXG4gICAgICAgICAgICBpZiAoZmlsdGVyU2V0dGluZ3MgJiYgZmlsdGVyU2V0dGluZ3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgaWYgKCFwYXJhbXMuY29sdW1uRmlsdGVyKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJhbXMuY29sdW1uRmlsdGVyID0gW107XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGZpbHRlclNldHRpbmdzLmZvckVhY2goKHNldHRpbmcpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChjb25maWcucG9ydGxldFR5cGUgPT09IFwicGl2b3RcIikge1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCBfZmllbGQgPSBjb25maWcuZmllbGRzLmZpbmQoXHJcbiAgICAgICAgICAgICAgICAgIChpdGVtKSA9PiBpdGVtLmNvbE5hbWUgPT09IHNldHRpbmcubmFtZVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IFR5cGUgPSBfZmllbGQgJiYgX2ZpZWxkLmRhdGFUeXBlO1xyXG4gICAgICAgICAgICAgICAgaWYgKHNldHRpbmcuaXRlbXMpIHtcclxuICAgICAgICAgICAgICAgICAgc2V0dGluZy5pdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmNvbHVtbkZpbHRlci5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgIEZpZWxkOiBzZXR0aW5nLm5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRvcjogXCJlcXVhbFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICAgIFZhbHVlOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBUeXBlID09PSBcImRhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gbW9tZW50KGl0ZW0pLmZvcm1hdChcInl5eXktTU0tRERcIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IFR5cGUgPT09IFwiZGF0ZXRpbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gbW9tZW50KGl0ZW0pLmZvcm1hdChcInl5eXktTU0tREQgaGg6bW06c3NcIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGl0ZW0sXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZXR0aW5nLm9wZXJhdG9yKSB7XHJcbiAgICAgICAgICAgICAgICAgIHBhcmFtcy5jb2x1bW5GaWx0ZXIucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgRmllbGQ6IHNldHRpbmcuZmllbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3I6IFwiZXF1YWxcIixcclxuICAgICAgICAgICAgICAgICAgICBUeXBlOiBzZXR0aW5nLnR5cGUsXHJcbiAgICAgICAgICAgICAgICAgICAgVmFsdWU6XHJcbiAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nLnR5cGUgPT09IFwiZGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gbW9tZW50KHNldHRpbmcudmFsdWUpLmZvcm1hdChcInl5eXktTU0tRERcIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgOiBzZXR0aW5nLnR5cGUgPT09IFwiZGF0ZXRpbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA/IG1vbWVudChzZXR0aW5nLnZhbHVlKS5mb3JtYXQoXCJ5eXl5LU1NLUREIGhoOm1tOnNzXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogc2V0dGluZy52YWx1ZSxcclxuICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGNvbmZpZy5wb3J0bGV0VHlwZSA9PT0gXCJoaXN0b3JpY2FsSVJSXCIpIHtcclxuICAgICAgICAgICAgICBpZiAoIXBhcmFtcy5jb2x1bW5GaWx0ZXIpIHtcclxuICAgICAgICAgICAgICAgIHBhcmFtcy5jb2x1bW5GaWx0ZXIgPSBbXTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgcGFyYW1zLmNvbHVtbkZpbHRlci5wdXNoKFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBGaWVsZDogXCJGcmVxdWVuY3lzXCIsXHJcbiAgICAgICAgICAgICAgICAgIE9wZXJhdG9yOiBcImVxdWFsXCIsXHJcbiAgICAgICAgICAgICAgICAgIFR5cGU6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgICAgICAgIFZhbHVlOiBjb25maWcuc2VsZWN0ZWRNdWx0aXBsZXMsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBGaWVsZDogXCJJbnZlc3RvclR5cGVcIixcclxuICAgICAgICAgICAgICAgICAgT3BlcmF0b3I6IFwiZXF1YWxcIixcclxuICAgICAgICAgICAgICAgICAgVHlwZTogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgICAgICAgVmFsdWU6IGNvbmZpZy5zZWxlY3RlZEludmVzdG9yLFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChwYXJhbXMuY29sdW1uRmlsdGVyIGluc3RhbmNlb2YgQXJyYXkpIHtcclxuICAgICAgICAgICAgcGFyYW1zLmNvbHVtbkZpbHRlciA9IHBhcmFtcy5jb2x1bW5GaWx0ZXIuZmlsdGVyKFxyXG4gICAgICAgICAgICAgIChpdGVtKSA9PiBpdGVtLkZpZWxkXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8ganNvbiBidWZmZXJcclxuICAgICAgICAgIHRoaXMuaHR0cENsaWVudFxyXG4gICAgICAgICAgICAucG9zdChcclxuICAgICAgICAgICAgICB0aGlzLmFwaS5iYXNldXJsICsgdGhpcy5hcGkudXJsTGlzdC5HZXRQb3J0bGV0RGF0YU9yQ3JlYXRlLFxyXG4gICAgICAgICAgICAgIHBhcmFtcyxcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xyXG4gICAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyYCxcclxuICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKFxyXG4gICAgICAgICAgICAgIChyZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCBpZGVudGlmaWVyID1cclxuICAgICAgICAgICAgICAgICAgcG9ydGxldC5pZCA9PT0gXCIwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDBcIlxyXG4gICAgICAgICAgICAgICAgICAgID8gcG9ydGxldC5uZXdJZFxyXG4gICAgICAgICAgICAgICAgICAgIDogcG9ydGxldC5pZDtcclxuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMucG9ydGxldFJlc3VsdHNfTmV3W2Rhc2hib2FyZElkXVtpdGVtLmRhdGFtYXJ0Q29kZV0gPSBbXTtcclxuICAgICAgICAgICAgICAgICAgaWYgKHBvcnRsZXQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcnRsZXREYXRhX05ld1tkYXNoYm9hcmRJZF1baWRlbnRpZmllcl0gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0b3RhbDogMCxcclxuICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IFtdLFxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSB0aGlzLnRyYW5zbGF0aW9uLk5PX0RBVEFcclxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMudHJhbnNsYXRpb24uTk9fREFUQVxyXG4gICAgICAgICAgICAgICAgICAgIDogXCIuTm8gZGF0YSwgcGxlYXNlIGNob29zZSBhbm90aGVyIGRhdGEgdHlwZVwiO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2Uuc2hvd05vdGlmaWNhdGlvbihtZXNzYWdlLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBcIkVycm9yXCIsXHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICBsZW5ndGgrKztcclxuICAgICAgICAgICAgICAgICAgaWYgKGRhdGFNYXJ0VGFibGVzLmxlbmd0aCA9PT0gbGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgcmVzdWx0W1wiZGF0YVwiXS5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5TZWN0b3IgPSB0aGlzLnRyYW5zbGF0aW9uW2l0ZW0uU2VjdG9yXSB8fCBpdGVtLlNlY3RvcjtcclxuICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpZWxkc0FycltkYXNoYm9hcmRJZF0gJiZcclxuICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmZpZWxkc0FycltkYXNoYm9hcmRJZF0pLmxlbmd0aFxyXG4gICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcnRsZXRSZXN1bHRzX05ld1tkYXNoYm9hcmRJZF1baXRlbS5kYXRhbWFydENvZGVdID1cclxuICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBpZiAocG9ydGxldCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9ydGxldERhdGFfTmV3W2Rhc2hib2FyZElkXVtpZGVudGlmaWVyXSA9IHJlc3VsdDtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBsZW5ndGgrKztcclxuICAgICAgICAgICAgICAgICAgaWYgKGRhdGFNYXJ0VGFibGVzLmxlbmd0aCA9PT0gbGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZW5ndGgrKztcclxuICAgICAgICAgICAgICAgIGlmIChkYXRhTWFydFRhYmxlcy5sZW5ndGggPT09IGxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgKCkgPT4ge31cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjYWxsYmFjaygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgRXhjZWxGb3JtdWxhcyA9IHtcclxuICAgIERheXNCZXR3ZWVuOiBmdW5jdGlvbiAoZGF0ZTEsIGRhdGUyKSB7XHJcbiAgICAgIHZhciBvbmVEYXkgPSAyNCAqIDYwICogNjAgKiAxMDAwO1xyXG4gICAgICByZXR1cm4gTWF0aC5yb3VuZChNYXRoLmFicygoZGF0ZTEuZ2V0VGltZSgpIC0gZGF0ZTIuZ2V0VGltZSgpKSAvIG9uZURheSkpO1xyXG4gICAgfSxcclxuICAgIFhOUFY6IGZ1bmN0aW9uIChyYXRlLCB2YWx1ZXMpIHtcclxuICAgICAgdmFyIHhucHYgPSAwLjA7XHJcbiAgICAgIHZhciBmaXJzdERhdGUgPSBuZXcgRGF0ZSh2YWx1ZXNbMF0uZGF0ZSk7XHJcbiAgICAgIGZvciAodmFyIGtleSBpbiB2YWx1ZXMpIHtcclxuICAgICAgICB2YXIgdG1wID0gdmFsdWVzW2tleV07XHJcbiAgICAgICAgdmFyIHZhbHVlID0gdG1wLmFtb3VudDtcclxuICAgICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHRtcC5kYXRlKTtcclxuICAgICAgICB4bnB2ICs9XHJcbiAgICAgICAgICB2YWx1ZSAvIE1hdGgucG93KDEgKyByYXRlLCB0aGlzLkRheXNCZXR3ZWVuKGZpcnN0RGF0ZSwgZGF0ZSkgLyAzNjUpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB4bnB2O1xyXG4gICAgfSxcclxuICAgIFhJUlI6IGZ1bmN0aW9uICh2YWx1ZXMsIGd1ZXNzKSB7XHJcbiAgICAgIHZhciB4MSA9IDAuMDtcclxuICAgICAgdmFyIHgyOiBudW1iZXIgPSBndWVzcztcclxuICAgICAgdmFyIGYxID0gdGhpcy5YTlBWKHgxLCB2YWx1ZXMpO1xyXG4gICAgICB2YXIgZjIgPSB0aGlzLlhOUFYoeDIsIHZhbHVlcyk7XHJcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTAwOyBpKyspIHtcclxuICAgICAgICBpZiAoZjEgKiBmMiA8IDAuMCkgYnJlYWs7XHJcbiAgICAgICAgaWYgKE1hdGguYWJzKGYxKSA8IE1hdGguYWJzKGYyKSkge1xyXG4gICAgICAgICAgZjEgPSB0aGlzLlhOUFYoKHgxICs9IDEuNiAqICh4MSAtIHgyKSksIHZhbHVlcyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGYyID0gdGhpcy5YTlBWKCh4MiArPSAxLjYgKiAoeDIgLSB4MSkpLCB2YWx1ZXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoZjEgKiBmMiA+IDAuMCkgcmV0dXJuIG51bGw7XHJcbiAgICAgIHZhciBmID0gdGhpcy5YTlBWKHgxLCB2YWx1ZXMpO1xyXG4gICAgICBpZiAoZiA8IDAuMCkge1xyXG4gICAgICAgIHZhciBydGIgPSB4MTtcclxuICAgICAgICB2YXIgZHggPSB4MiAtIHgxO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHZhciBydGIgPSB4MjtcclxuICAgICAgICB2YXIgZHggPSB4MSAtIHgyO1xyXG4gICAgICB9XHJcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTAwOyBpKyspIHtcclxuICAgICAgICBkeCAqPSAwLjU7XHJcbiAgICAgICAgdmFyIHhfbWlkID0gcnRiICsgZHg7XHJcbiAgICAgICAgdmFyIGZfbWlkID0gdGhpcy5YTlBWKHhfbWlkLCB2YWx1ZXMpO1xyXG4gICAgICAgIGlmIChmX21pZCA8PSAwLjApIHJ0YiA9IHhfbWlkO1xyXG4gICAgICAgIGlmIChNYXRoLmFicyhmX21pZCkgPCAxLjBlLTYgfHwgTWF0aC5hYnMoZHgpIDwgMS4wZS02KSByZXR1cm4geF9taWQ7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9LFxyXG4gICAgX0RheXNCZXR3ZWVuOiBmdW5jdGlvbiAoZGF0ZTEsIGRhdGUyKSB7XHJcbiAgICAgIC8vY29uc3QgdGltZTEgPW5ldyBEYXRlKERhdGUuVVRDKGRhdGUxLmdldFVUQ0Z1bGxZZWFyKCksIGRhdGUxLmdldFVUQ01vbnRoKCksIGRhdGUxLmdldFVUQ0RhdGUoKSwgZGF0ZTEuZ2V0VVRDSG91cnMoKSwgZGF0ZTEuZ2V0VVRDTWludXRlcygpLCBkYXRlMS5nZXRVVENTZWNvbmRzKCkpKS5nZXRUaW1lKCk7XHJcbiAgICAgIC8vY29uc3QgdGltZTIgPW5ldyBEYXRlKERhdGUuVVRDKGRhdGUyLmdldFVUQ0Z1bGxZZWFyKCksIGRhdGUyLmdldFVUQ01vbnRoKCksIGRhdGUyLmdldFVUQ0RhdGUoKSwgZGF0ZTIuZ2V0VVRDSG91cnMoKSwgZGF0ZTIuZ2V0VVRDTWludXRlcygpLCBkYXRlMi5nZXRVVENTZWNvbmRzKCkpKS5nZXRUaW1lKCk7XHJcbiAgICAgIGNvbnN0IG9uZURheSA9IDI0ICogNjAgKiA2MCAqIDEwMDA7IC8vIOS4gOWkqeeahOavq+enkuaVsFxyXG4gICAgICAvL2NvbnN0IHRpbWUxID0gZGF0ZTEuZ2V0VGltZSgpOyAvLyBkYXRlMeeahOavq+enkuihqOekulxyXG4gICAgICAvL2NvbnN0IHRpbWUyID0gZGF0ZTIuZ2V0VGltZSgpOyAvLyBkYXRlMueahOavq+enkuihqOekulxyXG4gICAgICBjb25zdCBmaXJzdERhdGUgPSBuZXcgRGF0ZShkYXRlMSk7XHJcbiAgICAgIGNvbnN0IHNlY29uZERhdGUgPSBuZXcgRGF0ZShkYXRlMik7XHJcbiAgICAgIGNvbnN0IGRpZmZEYXlzID0gTWF0aC5yb3VuZChcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgTWF0aC5hYnMoKGZpcnN0RGF0ZSAtIHNlY29uZERhdGUpIC8gb25lRGF5KVxyXG4gICAgICApOyAvLyDorqHnrpflpKnmlbDlt67lubblj5bmlbRcclxuICAgICAgcmV0dXJuIGRpZmZEYXlzO1xyXG4gICAgfSxcclxuXHJcbiAgICBfbGNsX3NjYV9YaXJyUmVzdWx0OiBmdW5jdGlvbiAodmFsdWVzLCBkYXRlcywgZlJhdGUpIHtcclxuICAgICAgdmFyIERfMCA9IGRhdGVzWzBdO1xyXG4gICAgICBsZXQgciA9IGZSYXRlICsgMS4wO1xyXG4gICAgICB2YXIgZlJlc3VsdCA9IHZhbHVlc1swXTtcclxuICAgICAgZm9yICh2YXIgaSA9IDEsIG5Db3VudCA9IHZhbHVlcy5sZW5ndGg7IGkgPCBuQ291bnQ7ICsraSkge1xyXG4gICAgICAgIHZhciB0ZW1wID0gTWF0aC5wb3cociwgdGhpcy5fRGF5c0JldHdlZW4oZGF0ZXNbaV0sIERfMCkgLyAzNjUuMCk7XHJcbiAgICAgICAgZlJlc3VsdCArPSB2YWx1ZXNbaV0gLyB0ZW1wO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBmUmVzdWx0O1xyXG4gICAgfSxcclxuXHJcbiAgICBfbGNsX3NjYV9YaXJyUmVzdWx0X0Rlcml2MTogZnVuY3Rpb24gKHZhbHVlcywgZGF0ZXMsIGZSYXRlKSB7XHJcbiAgICAgIHZhciBEXzAgPSBkYXRlc1swXTtcclxuICAgICAgdmFyIHIgPSBmUmF0ZSArIDEuMDtcclxuICAgICAgdmFyIGZSZXN1bHQgPSAwLjA7XHJcbiAgICAgIGZvciAodmFyIGkgPSAxLCBuQ291bnQgPSB2YWx1ZXMubGVuZ3RoOyBpIDwgbkNvdW50OyArK2kpIHtcclxuICAgICAgICB2YXIgRV9pID0gdGhpcy5fRGF5c0JldHdlZW4oZGF0ZXNbaV0sIERfMCkgLyAzNjUuMDtcclxuICAgICAgICBmUmVzdWx0IC09IChFX2kgKiB2YWx1ZXNbaV0pIC8gTWF0aC5wb3cociwgRV9pICsgMS4wKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZlJlc3VsdDtcclxuICAgIH0sXHJcblxyXG4gICAgX0NhbGN1bGF0ZVhpcnJPcGVuT2ZmaWNlOiBmdW5jdGlvbiAodmFsdWVzLCBkYXRlcywgZ3Vlc3MpIHtcclxuICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPCAyIHx8IHZhbHVlcy5sZW5ndGggIT0gZGF0ZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHZhciBmUmVzdWx0UmF0ZSA9IGd1ZXNzO1xyXG4gICAgICBpZiAoZlJlc3VsdFJhdGUgPD0gLTEpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG5cclxuICAgICAgdmFyIGZNYXhFcHMgPSAwLjAwMDAwMDAxO1xyXG4gICAgICB2YXIgbk1heEl0ZXIgPSA1MDtcclxuXHJcbiAgICAgIHZhciBmTmV3UmF0ZSwgZlJhdGVFcHMsIGZSZXN1bHRWYWx1ZTtcclxuICAgICAgdmFyIG5JdGVyID0gMDtcclxuICAgICAgdmFyIG5JdGVyU2NhbiA9IDA7XHJcbiAgICAgIHZhciBiQ29udExvb3AgPSBmYWxzZTtcclxuICAgICAgdmFyIGJSZXN1bHRSYXRlU2NhbkVuZCA9IGZhbHNlO1xyXG5cclxuICAgICAgZG8ge1xyXG4gICAgICAgIGlmIChuSXRlclNjYW4gPj0gMSkge1xyXG4gICAgICAgICAgZlJlc3VsdFJhdGUgPSAtMC45OSArIChuSXRlclNjYW4gLSAxKSAqIDAuMDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRvIHtcclxuICAgICAgICAgIGZSZXN1bHRWYWx1ZSA9IHRoaXMuX2xjbF9zY2FfWGlyclJlc3VsdCh2YWx1ZXMsIGRhdGVzLCBmUmVzdWx0UmF0ZSk7XHJcbiAgICAgICAgICBmTmV3UmF0ZSA9XHJcbiAgICAgICAgICAgIGZSZXN1bHRSYXRlIC1cclxuICAgICAgICAgICAgZlJlc3VsdFZhbHVlIC9cclxuICAgICAgICAgICAgICB0aGlzLl9sY2xfc2NhX1hpcnJSZXN1bHRfRGVyaXYxKHZhbHVlcywgZGF0ZXMsIGZSZXN1bHRSYXRlKTtcclxuICAgICAgICAgIGZSYXRlRXBzID0gTWF0aC5hYnMoZk5ld1JhdGUgLSBmUmVzdWx0UmF0ZSk7XHJcbiAgICAgICAgICBmUmVzdWx0UmF0ZSA9IGZOZXdSYXRlO1xyXG4gICAgICAgICAgYkNvbnRMb29wID0gZlJhdGVFcHMgPiBmTWF4RXBzICYmIE1hdGguYWJzKGZSZXN1bHRWYWx1ZSkgPiBmTWF4RXBzO1xyXG4gICAgICAgIH0gd2hpbGUgKGJDb250TG9vcCAmJiArK25JdGVyIDwgbk1heEl0ZXIpO1xyXG4gICAgICAgIG5JdGVyID0gMDtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBpc05hTihmUmVzdWx0UmF0ZSkgfHxcclxuICAgICAgICAgICFpc0Zpbml0ZShmUmVzdWx0UmF0ZSkgfHxcclxuICAgICAgICAgIGlzTmFOKGZSZXN1bHRWYWx1ZSkgfHxcclxuICAgICAgICAgICFpc0Zpbml0ZShmUmVzdWx0VmFsdWUpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBiQ29udExvb3AgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgKytuSXRlclNjYW47XHJcbiAgICAgICAgYlJlc3VsdFJhdGVTY2FuRW5kID0gbkl0ZXJTY2FuID49IDEwMDtcclxuICAgICAgfSB3aGlsZSAoYkNvbnRMb29wICYmICFiUmVzdWx0UmF0ZVNjYW5FbmQpO1xyXG5cclxuICAgICAgaWYgKGJDb250TG9vcCkge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBmUmVzdWx0UmF0ZTtcclxuICAgIH0sXHJcblxyXG4gICAgX0NhbGN1bGF0ZVhpcnI6IGZ1bmN0aW9uICh2YWx1ZUxpc3QsIGRhdGVMaXN0LCBuYXZBZGp1c3QsIGxhdGVzdERhdGUpIHtcclxuICAgICAgdmFyIHBvc2l0aXZlQ2FzaGZsb3cgPSB2YWx1ZUxpc3Quc29tZShmdW5jdGlvbiAodikge1xyXG4gICAgICAgIHJldHVybiB2ID4gMDtcclxuICAgICAgfSlcclxuICAgICAgICA/IHRydWVcclxuICAgICAgICA6IG5hdkFkanVzdCA+IDBcclxuICAgICAgICA/IHRydWVcclxuICAgICAgICA6IGZhbHNlO1xyXG4gICAgICB2YXIgbmVnYXRpdmVDYXNoZmxvdyA9IHZhbHVlTGlzdC5zb21lKGZ1bmN0aW9uICh2KSB7XHJcbiAgICAgICAgcmV0dXJuIHYgPCAwO1xyXG4gICAgICB9KVxyXG4gICAgICAgID8gdHJ1ZVxyXG4gICAgICAgIDogbmF2QWRqdXN0IDwgMFxyXG4gICAgICAgID8gdHJ1ZVxyXG4gICAgICAgIDogZmFsc2U7XHJcblxyXG4gICAgICBpZiAocG9zaXRpdmVDYXNoZmxvdyA9PSBmYWxzZSB8fCBuZWdhdGl2ZUNhc2hmbG93ID09IGZhbHNlKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChuYXZBZGp1c3QgIT0gbnVsbCkge1xyXG4gICAgICAgIHZhbHVlTGlzdC5wdXNoKG5hdkFkanVzdCk7XHJcbiAgICAgICAgZGF0ZUxpc3QucHVzaChsYXRlc3REYXRlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdmFyIHhpcnJSZXN1bHQgPSBudWxsO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHZhciBleGNlbEd1ZXNzID1cclxuICAgICAgICAgIHZhbHVlTGlzdC5yZWR1Y2UoZnVuY3Rpb24gKHN1bSwgdmFsdWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHN1bSArIHZhbHVlO1xyXG4gICAgICAgICAgfSwgMCkgPCAwXHJcbiAgICAgICAgICAgID8gLTAuMVxyXG4gICAgICAgICAgICA6IDAuMTtcclxuICAgICAgICB4aXJyUmVzdWx0ID0gdGhpcy5fQ2FsY3VsYXRlWGlyck9wZW5PZmZpY2UoXHJcbiAgICAgICAgICB2YWx1ZUxpc3QsXHJcbiAgICAgICAgICBkYXRlTGlzdCxcclxuICAgICAgICAgIGV4Y2VsR3Vlc3NcclxuICAgICAgICApO1xyXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4geGlyclJlc3VsdDtcclxuICAgIH0sXHJcbiAgfTtcclxuXHJcbiAgLy8g5ou/5Yiw5pWw5o2u5ZCO77yM5YWI6YGN5Y6GY29uZmlnLmZpbHRlclNldHRpbmdzLOWmguaenOWcqOaVsOaNruS4reS4jeWtmOWcqO+8jOWwseWIoOmZpOi/meS4gOmhuVxyXG4gIGNoZWNrRmlsdGVyU2V0dGluZ3MoY29uZmlnLCBmaWVsZHMsIGRhdGEpIHtcclxuICAgIGxldCBmaWx0ZXJTZXR0aW5ncyA9IGNvbmZpZy5maWx0ZXJTZXR0aW5ncztcclxuICAgIGlmIChmaWx0ZXJTZXR0aW5ncyAmJiBmaWx0ZXJTZXR0aW5ncy5sZW5ndGgpIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWx0ZXJTZXR0aW5ncy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBmaWx0ZXJTZXR0aW5nc1tpXTtcclxuICAgICAgICBsZXQgX19maWVsZCA9IGZpZWxkcy5maWx0ZXIoXHJcbiAgICAgICAgICAoZmllbGQpID0+IGZpZWxkLmNvbE5hbWUgPT0gZWxlbWVudC5uYW1lXHJcbiAgICAgICAgKVswXTtcclxuICAgICAgICBpZiAoIV9fZmllbGQpIHtcclxuICAgICAgICAgIC8vIOWkhOeQhuiHquWumuS5iSBHcm91cOeahEZpbHRlclxyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGRhdGFUeXBlID0gX19maWVsZC5kYXRhVHlwZTtcclxuICAgICAgICBpZiAoZWxlbWVudC5pdGVtcyAmJiBlbGVtZW50Lml0ZW1zLmxlbmd0aCkge1xyXG4gICAgICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCBlbGVtZW50Lml0ZW1zLmxlbmd0aDsgcisrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBlbGVtZW50Lml0ZW1zW3JdO1xyXG4gICAgICAgICAgICBsZXQgcmVzID0gW107XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICBkYXRhVHlwZSAhPT0gXCJkYXRlXCIgJiZcclxuICAgICAgICAgICAgICBkYXRhVHlwZSAhPT0gXCJkYXRldGltZVwiICYmXHJcbiAgICAgICAgICAgICAgZGF0YSAmJlxyXG4gICAgICAgICAgICAgIGRhdGEubGVuZ3RoXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgIGlmIChkYXRhVHlwZSA9PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgICAgICAgICByZXMgPSBkYXRhLmZpbHRlcigob2JqKSA9PiBvYmpbZWxlbWVudC5uYW1lXSA9PT0gaXRlbSk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJlcyA9IGRhdGEuZmlsdGVyKFxyXG4gICAgICAgICAgICAgICAgICAob2JqKSA9PiBOdW1iZXIob2JqW2VsZW1lbnQubmFtZV0pID09PSBOdW1iZXIoaXRlbSlcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChkYXRhVHlwZSA9PSBcImRhdGVcIiB8fCBkYXRhVHlwZSA9PSBcImRhdGV0aW1lXCIpIHtcclxuICAgICAgICAgICAgICByZXMgPSBkYXRhLmZpbHRlcihcclxuICAgICAgICAgICAgICAgIChvYmopID0+XHJcbiAgICAgICAgICAgICAgICAgIG1vbWVudChvYmpbZWxlbWVudC5uYW1lXSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKSA9PVxyXG4gICAgICAgICAgICAgICAgICBtb21lbnQoaXRlbSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKVxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFyZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgZWxlbWVudC5pdGVtcy5zcGxpY2UociwgMSk7XHJcbiAgICAgICAgICAgICAgci0tO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoIWVsZW1lbnQuaXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGZpbHRlclNldHRpbmdzLnNwbGljZShpLCAxKTtcclxuICAgICAgICAgICAgaS0tO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZmlsdGVyU2V0dGluZ3M7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcbiAgICAvLyBjYWxsYmFjayhmaWx0ZXJTZXR0aW5ncyk7XHJcbiAgfVxyXG5cclxuICBzb3J0RGF0YU1hcnRUYWJsZXMoZGF0YSkge1xyXG4gICAgZGF0YS5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgIGNvbnN0IGxhbmdWYWx1ZUEgPSBhLmxhbmdWYWx1ZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICBjb25zdCBsYW5nVmFsdWVCID0gYi5sYW5nVmFsdWUudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICAgIGlmIChsYW5nVmFsdWVBIDwgbGFuZ1ZhbHVlQikge1xyXG4gICAgICAgIHJldHVybiAtMTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobGFuZ1ZhbHVlQSA+IGxhbmdWYWx1ZUIpIHtcclxuICAgICAgICByZXR1cm4gMTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcmVuYW1lRGF0YU1hcnRUYWJsZXMoZGF0YSwgaWQsIGVudGl0eVR5cGUpIHtcclxuICAgIGlmICh0aGlzLnNvdXJjZXNEYXRhW2lkXSkge1xyXG4gICAgICB0aGlzLnNvdXJjZXNEYXRhW2lkXS5mb3JFYWNoKChzb3VyY2VzKSA9PiB7XHJcbiAgICAgICAgaWYgKHNvdXJjZXMuZW50aXR5VHlwZSA9PT0gZW50aXR5VHlwZSkge1xyXG4gICAgICAgICAgZGF0YS5mb3JFYWNoKChfZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICBzb3VyY2VzLnZpZXdzLmZvckVhY2goKHZpZXcpID0+IHtcclxuICAgICAgICAgICAgICB2aWV3LnRhYmxlcy5mb3JFYWNoKCh0YWJsZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRhYmxlLmRhdGFtYXJ0Q29kZSA9PT0gX2RhdGEuZGF0YW1hcnRDb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgIF9kYXRhLmxhbmdWYWx1ZSA9IHRhYmxlLmxhbmdWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgX2RhdGEubGFuZ0NvZGUgPSB0YWJsZS5sYW5nQ29kZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbmV4cG9ydCBjb25zdCBBTExfQUdHUkVHQVRFX1RZUEVTID0gW1xyXG4gIFwiU3VtXCIsXHJcbiAgXCJGaXJzdFwiLFxyXG4gIFwiTGFzdFwiLFxyXG4gIFwiQ2FsY3VsYXRlSVJSXCIsXHJcbiAgXCJDYWxjdWxhdGVJUlJJUlJEYXRlXCIsXHJcbiAgXCJDYWxjdWxhdGVJUlJCZWZvcmVDYXJyaWVkXCIsXHJcbiAgXCJDYWxjdWxhdGVJUlJBY3R1YWxBdWRpdGVkXCIsXHJcbiAgXCJDYWxjdWxhdGVJUlJSZXBvcnRlZFwiLFxyXG4gIFwiQ2FsY3VsYXRlSVJSTVREXCIsXHJcbiAgXCJDYWxjdWxhdGVJUlJRVERcIixcclxuICBcIkNhbGN1bGF0ZUlSUllURFwiLFxyXG4gIFwiQ2FsY3VsYXRlVFdSTVREXCIsXHJcbiAgXCJDYWxjdWxhdGVUV1JRVERcIixcclxuICBcIkNhbGN1bGF0ZVRXUllURFwiLFxyXG4gIFwiQ2FsY3VsYXRlVkFSTVREXzk5XCIsXHJcbiAgXCJDYWxjdWxhdGVWQVJRVERfOTlcIixcclxuICBcIkNhbGN1bGF0ZVZBUllURF85OVwiLFxyXG4gIFwiQ2FsY3VsYXRlVkFSTVREXzk1XCIsXHJcbiAgXCJDYWxjdWxhdGVWQVJRVERfOTVcIixcclxuICBcIkNhbGN1bGF0ZVZBUllURF85NVwiLFxyXG4gIFwiQ2FsY3VsYXRlTXVsdGlwbGVcIixcclxuICBcIkNhbGN1bGF0ZVBJQ1wiLFxyXG4gIFwiQ2FsY3VsYXRlRFBJXCIsXHJcbiAgXCJDYWxjdWxhdGVUVlBJXCIsXHJcbiAgXCJDYWxjdWxhdGVSVlBJXCIsXHJcbiAgXCJDYWxjdWxhdGVNQWN0dWFsQXVkaXRlZFwiLFxyXG4gIFwiQ2FsY3VsYXRlTVJlcG9ydGVkXCIsXHJcbiAgXCJDb3VudFwiLFxyXG4gIFwiRGlzdGluY3RDb3VudFwiLFxyXG4gIFwiUHJvZHVjdFwiLFxyXG4gIFwiTWluXCIsXHJcbiAgXCJNYXhcIixcclxuICBcIkF2Z1wiLFxyXG4gIFwiTWVkaWFuXCIsXHJcbiAgXCJJbmRleFwiLFxyXG4gIFwiUG9wdWxhdGlvblZhclwiLFxyXG4gIFwiU2FtcGxlVmFyXCIsXHJcbiAgXCJQb3B1bGF0aW9uU3REZXZcIixcclxuICBcIlNhbXBsZVN0RGV2XCIsXHJcbiAgXCJSdW5uaW5nVG90YWxzXCIsXHJcbiAgXCJQZXJjZW50YWdlT2ZHcmFuZFRvdGFsXCIsXHJcbiAgXCJQZXJjZW50YWdlT2ZDb2x1bW5Ub3RhbFwiLFxyXG4gIFwiUGVyY2VudGFnZU9mUm93VG90YWxcIixcclxuICBcIlBlcmNlbnRhZ2VPZlBhcmVudENvbHVtblRvdGFsXCIsXHJcbiAgXCJQZXJjZW50YWdlT2ZQYXJlbnRSb3dUb3RhbFwiLFxyXG4gIFwiRGlmZmVyZW5jZUZyb21cIixcclxuICBcIlBlcmNlbnRhZ2VPZkRpZmZlcmVuY2VGcm9tXCIsXHJcbiAgXCJQZXJjZW50YWdlT2ZQYXJlbnRUb3RhbFwiLFxyXG5dO1xyXG5cclxubGV0IHRyYW5zbGF0aW9uID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInRyYW5zbGF0aW9uXCIpIHx8IFwie31cIik7XHJcbmV4cG9ydCBjb25zdCBBR0dSRUdBVEVfVFlQRVNfVEVYVCA9IHtcclxuICBDYWxjdWxhdGVJUlI6IHRyYW5zbGF0aW9uLkNBTENVTEFURV9JUlIgfHwgXCJDYWxjdWxhdGUgSVJSXCIsXHJcbiAgQ2FsY3VsYXRlSVJSSVJSRGF0ZTpcclxuICAgIHRyYW5zbGF0aW9uLkNBTENVTEFURV9JUlJfSVJSX0RBVEUgfHwgXCJDYWxjdWxhdGUgSVJSIChJUlIgRGF0ZSlcIixcclxuICBDYWxjdWxhdGVJUlJCZWZvcmVDYXJyaWVkOlxyXG4gICAgdHJhbnNsYXRpb24uQ0FMQ1VMQVRFX0lSUl9CRUZPUkVfQ0FSUlkgfHwgXCJDYWxjdWxhdGUgSVJSIEJlZm9yZSBDYXJyaWVkXCIsXHJcbiAgQ2FsY3VsYXRlSVJSQWN0dWFsQXVkaXRlZDpcclxuICAgIHRyYW5zbGF0aW9uLkNBTENVTEFURV9JUlJfQUNUVUFMX0FVRElURUQgfHwgXCJDYWxjdWxhdGUgSVJSIEFjdHVhbC9BdWRpdGVkXCIsXHJcbiAgQ2FsY3VsYXRlSVJSUmVwb3J0ZWQ6IHRyYW5zbGF0aW9uLkNJX1JFUE9SVEVEIHx8IFwiQ2FsY3VsYXRlIElSUiBSZXBvcnRlZFwiLFxyXG4gIENhbGN1bGF0ZUlSUk1URDogdHJhbnNsYXRpb24uQ0FMQ1VMQVRFX0lSUl9NVEQgfHwgXCJDYWxjdWxhdGUgSVJSIChNVEQpXCIsXHJcbiAgQ2FsY3VsYXRlSVJSUVREOiB0cmFuc2xhdGlvbi5DQUxDVUxBVEVfSVJSX1FURCB8fCBcIkNhbGN1bGF0ZSBJUlIgKFFURClcIixcclxuICBDYWxjdWxhdGVJUlJZVEQ6IHRyYW5zbGF0aW9uLkNBTENVTEFURV9JUlJfWVREIHx8IFwiQ2FsY3VsYXRlIElSUiAoWVREKVwiLFxyXG4gIENhbGN1bGF0ZVRXUk1URDogdHJhbnNsYXRpb24uQ0FMQ1VMQVRFX1RXUl9NVEQgfHwgXCJDYWxjdWxhdGUgVFdSIChNKVwiLFxyXG4gIENhbGN1bGF0ZVRXUlFURDogdHJhbnNsYXRpb24uQ0FMQ1VMQVRFX1RXUl9RVEQgfHwgXCJDYWxjdWxhdGUgVFdSIChRKVwiLFxyXG4gIENhbGN1bGF0ZVRXUllURDogdHJhbnNsYXRpb24uQ0FMQ1VMQVRFX1RXUl9ZVEQgfHwgXCJDYWxjdWxhdGUgVFdSIChZKVwiLFxyXG4gIENhbGN1bGF0ZVZBUk1URF85OTpcclxuICAgIHRyYW5zbGF0aW9uLkNBTENVTEFURV9WQVJfTVREXzk5IHx8IFwiQ2FsY3VsYXRlIFZBUiAoTSA5OSUpXCIsXHJcbiAgQ2FsY3VsYXRlVkFSUVREXzk5OlxyXG4gICAgdHJhbnNsYXRpb24uQ0FMQ1VMQVRFX1ZBUl9RVERfOTkgfHwgXCJDYWxjdWxhdGUgVkFSIChRIDk5JSlcIixcclxuICBDYWxjdWxhdGVWQVJZVERfOTk6XHJcbiAgICB0cmFuc2xhdGlvbi5DQUxDVUxBVEVfVkFSX1lURF85OSB8fCBcIkNhbGN1bGF0ZSBWQVIgKFkgOTklKVwiLFxyXG4gIENhbGN1bGF0ZVZBUk1URF85NTpcclxuICAgIHRyYW5zbGF0aW9uLkNBTENVTEFURV9WQVJfTVREXzk1IHx8IFwiQ2FsY3VsYXRlIFZBUiAoTSA5NSUpXCIsXHJcbiAgQ2FsY3VsYXRlVkFSUVREXzk1OlxyXG4gICAgdHJhbnNsYXRpb24uQ0FMQ1VMQVRFX1ZBUl9RVERfOTUgfHwgXCJDYWxjdWxhdGUgVkFSIChRIDk1JSlcIixcclxuICBDYWxjdWxhdGVWQVJZVERfOTU6XHJcbiAgICB0cmFuc2xhdGlvbi5DQUxDVUxBVEVfVkFSX1lURF85NSB8fCBcIkNhbGN1bGF0ZSBWQVIgKFkgOTUlKVwiLFxyXG4gIENhbGN1bGF0ZU11bHRpcGxlOiB0cmFuc2xhdGlvbi5DQUxDVUxBVEVfTVVMVElQTEUgfHwgXCJDYWxjdWxhdGUgTXVsdGlwbGVcIixcclxuICBDYWxjdWxhdGVQSUM6IHRyYW5zbGF0aW9uLkNBTENVTEFURV9QSUMgfHwgXCJDYWxjdWxhdGUgUElDXCIsXHJcbiAgQ2FsY3VsYXRlRFBJOiB0cmFuc2xhdGlvbi5DQUxDVUxBVEVfRFBJIHx8IFwiQ2FsY3VsYXRlIERQSVwiLFxyXG4gIENhbGN1bGF0ZVRWUEk6IHRyYW5zbGF0aW9uLkNBTENVTEFURV9UVlBJIHx8IFwiQ2FsY3VsYXRlIFRWUElcIixcclxuICBDYWxjdWxhdGVSVlBJOiB0cmFuc2xhdGlvbi5DQUxDVUxBVEVfUlZQSSB8fCBcIkNhbGN1bGF0ZSBSVlBJXCIsXHJcbiAgQ2FsY3VsYXRlTUFjdHVhbEF1ZGl0ZWQ6XHJcbiAgICB0cmFuc2xhdGlvbi5DQUxDVUxBVEVfTVVMVElQTEVfQUNUVUFMX0FVRElURUQgfHxcclxuICAgIFwiQ2FsY3VsYXRlIE11bHRpcGxlIEFjdHVhbC9BdWRpdGVkXCIsXHJcbiAgQ2FsY3VsYXRlTVJlcG9ydGVkOlxyXG4gICAgdHJhbnNsYXRpb24uQ0FMQ1VMQVRFX01VTFRJUExFX1JFUE9SVEVEIHx8IFwiQ2FsY3VsYXRlIE11bHRpcGxlIFJlcG9ydGVkXCIsXHJcbiAgRmlyc3Q6IHRyYW5zbGF0aW9uLkZJUlNUIHx8IFwiRmlyc3RcIixcclxuICBMYXN0OiB0cmFuc2xhdGlvbi5MQVNUIHx8IFwiTGFzdFwiLFxyXG4gIE1lZGlhbjogdHJhbnNsYXRpb24uTUVESUFOIHx8IFwiTWVkaWFuXCIsXHJcbn07XHJcbiJdfQ==