@annalib/anna-core 32.0.0 → 33.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/fesm2022/annalib-anna-core.mjs +139 -139
  2. package/fesm2022/annalib-anna-core.mjs.map +1 -1
  3. package/lib/anna-core-shared-lib/services/anna-date-time-format.service.d.ts +2 -2
  4. package/package.json +4 -6
  5. package/src/lib/anna-common-scss/_bootstrap-tooltip.scss +2 -0
  6. package/src/lib/anna-common-scss/_button.scss +1 -1
  7. package/src/lib/anna-common-scss/_customDropdown.scss +2 -1
  8. package/src/lib/anna-common-scss/_date-picker-form.scss +1 -1
  9. package/src/lib/anna-common-scss/_filters.scss +2 -1
  10. package/src/lib/anna-common-scss/_mat-button-toggle.scss +1 -1
  11. package/src/lib/anna-common-scss/_popup-filter-toggle-button.scss +1 -1
  12. package/src/lib/anna-common-scss/_sort.scss +1 -1
  13. package/src/lib/anna-common-scss/style.scss +7 -1
  14. package/esm2022/annalib-anna-core.mjs +0 -5
  15. package/esm2022/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.mjs +0 -12
  16. package/esm2022/lib/anna-core-shared-lib/components/anna-circular-progress/anna-circular-progress.component.mjs +0 -52
  17. package/esm2022/lib/anna-core-shared-lib/components/anna-deleted-order-icon-template/anna-deleted-order-icon-template.component.mjs +0 -11
  18. package/esm2022/lib/anna-core-shared-lib/components/anna-est-icon-template/anna-est-icon-template.component.mjs +0 -11
  19. package/esm2022/lib/anna-core-shared-lib/components/anna-icon-column/anna-icon-column.component.mjs +0 -49
  20. package/esm2022/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.mjs +0 -12
  21. package/esm2022/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.mjs +0 -22
  22. package/esm2022/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.mjs +0 -11
  23. package/esm2022/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.mjs +0 -20
  24. package/esm2022/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.mjs +0 -12
  25. package/esm2022/lib/anna-core-shared-lib/components/anna-spinner-loader/anna-spinner-loader.component.mjs +0 -26
  26. package/esm2022/lib/anna-core-shared-lib/constants/anna-application.constants.mjs +0 -5
  27. package/esm2022/lib/anna-core-shared-lib/constants/shared.constant.mjs +0 -49
  28. package/esm2022/lib/anna-core-shared-lib/directives/digits-only/digits-only.directive.mjs +0 -266
  29. package/esm2022/lib/anna-core-shared-lib/directives/fixed-rows-popup-table/fixed-rows-popup-table.directive.mjs +0 -46
  30. package/esm2022/lib/anna-core-shared-lib/directives/show-ellipsis-text/show-ellipsis-text.directive.mjs +0 -41
  31. package/esm2022/lib/anna-core-shared-lib/models/anna-generic-data-type.model.mjs +0 -2
  32. package/esm2022/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.mjs +0 -2
  33. package/esm2022/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.mjs +0 -67
  34. package/esm2022/lib/anna-core-shared-lib/models/anna-sort.model.mjs +0 -7
  35. package/esm2022/lib/anna-core-shared-lib/models/anna-tooltip.model.mjs +0 -32
  36. package/esm2022/lib/anna-core-shared-lib/pipes/annaConvertArrayToCommaSeperatedValue.pipe.mjs +0 -39
  37. package/esm2022/lib/anna-core-shared-lib/pipes/annaConvertZeroOrNullOrUndefined.pipe.mjs +0 -27
  38. package/esm2022/lib/anna-core-shared-lib/pipes/annaDateFormatter.pipe.mjs +0 -21
  39. package/esm2022/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.mjs +0 -53
  40. package/esm2022/lib/anna-core-shared-lib/pipes/annaReplaceChar.pipe.mjs +0 -27
  41. package/esm2022/lib/anna-core-shared-lib/pipes/annaTypeOfData.pipe.mjs +0 -17
  42. package/esm2022/lib/anna-core-shared-lib/services/anna-date-time-format.service.mjs +0 -240
  43. package/esm2022/lib/anna-core-shared-lib/services/anna-filter.service.mjs +0 -1521
  44. package/esm2022/lib/anna-core-shared-lib/services/anna-generic-table.service.mjs +0 -149
  45. package/esm2022/lib/anna-core-shared-lib/services/anna-generic-tooltip-html.services.mjs +0 -60
  46. package/esm2022/lib/anna-core-shared-lib/services/anna-global-config.service.mjs +0 -94
  47. package/esm2022/lib/anna-core-shared-lib/services/anna-number-format.service.mjs +0 -67
  48. package/esm2022/lib/anna-core-shared-lib/services/anna-persisting-filter.service.mjs +0 -68
  49. package/esm2022/lib/anna-core-shared-lib/services/anna-regex-patterns.service.mjs +0 -20
  50. package/esm2022/lib/anna-core-shared-lib/services/anna-sort.service.mjs +0 -177
  51. package/esm2022/lib/anna-core-shared-lib/services/anna-spinner-loader.service.mjs +0 -24
  52. package/esm2022/lib/anna-core.module.mjs +0 -215
  53. package/esm2022/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.mjs +0 -160
  54. package/esm2022/lib/anna-dropdown-lib/components/anna-single-select/anna-single-select.component.mjs +0 -155
  55. package/esm2022/lib/anna-dropdown-lib/components/anna-single-select/models/anna-single-select.model.mjs +0 -12
  56. package/esm2022/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.mjs +0 -359
  57. package/esm2022/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-checkbox-filter/anna-column-checkbox-filter.component.mjs +0 -264
  58. package/esm2022/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-date-range-filter/anna-column-date-range-filter.component.mjs +0 -189
  59. package/esm2022/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-slider-filter/anna-column-slider-filter.component.mjs +0 -319
  60. package/esm2022/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-time-filter/anna-column-time-filter.component.mjs +0 -302
  61. package/esm2022/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.mjs +0 -1088
  62. package/esm2022/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.mjs +0 -69
  63. package/esm2022/public-api.mjs +0 -61
@@ -1,1521 +0,0 @@
1
- // Angular import statements
2
- import { Injectable } from "@angular/core";
3
- import dayjs from "dayjs";
4
- import CustomParseFormat from "dayjs/plugin/customParseFormat";
5
- import isBetween from "dayjs/plugin/isBetween";
6
- import minMax from "dayjs/plugin/minMax";
7
- // Third party import statements
8
- import { cloneDeep, isEqual, map, max, min, sortBy, uniq } from "lodash-es";
9
- import { SortTypeEnum } from "../models/anna-sort.model";
10
- import { TooltipModel } from "../models/anna-tooltip.model";
11
- // User defined import statements
12
- import { AnnaDateTimeFormatService } from "./anna-date-time-format.service";
13
- import { AnnaSortService } from "./anna-sort.service";
14
- import * as i0 from "@angular/core";
15
- import * as i1 from "./anna-date-time-format.service";
16
- import * as i2 from "./anna-sort.service";
17
- export class AnnaFilterService {
18
- static { this.bufferSize = 20; }
19
- constructor(dateTimeFormatService, annaSortService) {
20
- this.dateTimeFormatService = dateTimeFormatService;
21
- this.annaSortService = annaSortService;
22
- this.tooltipMap = new Map();
23
- this.tooltipSelectedMap = new Map();
24
- this.appliedFiltersArray = [];
25
- this.SPLITED_CHECKBOX_FILTER_KEY = "_SplitedCheckBoxOptions";
26
- this.DEFAULT_SPLIT_SEPARATOR = ", ";
27
- this.sliderCurrencySet = new Set([
28
- "booked",
29
- "cpp",
30
- "cpm",
31
- "rcvPreempt",
32
- "osPreempt",
33
- "postedAdu",
34
- "scheduledAdu",
35
- "audienceDeficit",
36
- "Rate",
37
- "userADUs",
38
- "buyerChanges",
39
- "userChanges",
40
- "userMG",
41
- "udValue",
42
- "odValue",
43
- "buyerBookedValue",
44
- "trafficBookedValue",
45
- "bookedVal",
46
- ]);
47
- this.isFilterSortActive = {};
48
- this.resetFilterSortActiveStatus = true;
49
- this.nullToBeFormatedIntoString = "-";
50
- this.percentTranslateFunction = (data) => {
51
- const formatNumber = (num) => parseFloat(num.toFixed(2));
52
- if (Math.abs(data) >= 1000) {
53
- const formatted = formatNumber(Math.abs(data) / 1000);
54
- return `${data < 0 ? '-' : ''}${formatted}k%`;
55
- }
56
- return `${formatNumber(data)}%`;
57
- };
58
- this.currencyTranslateFunction = (data) => {
59
- const formatNumber = (num) => parseFloat(num.toFixed(2));
60
- if (Math.abs(data) >= 1000) {
61
- const formatted = formatNumber(Math.abs(data) / 1000);
62
- return `${data < 0 ? '-' : ''}$${formatted}k`;
63
- }
64
- return `${data < 0 ? '-' : ''}$${formatNumber(Math.abs(data))}`;
65
- };
66
- this.normalTranslateFunction = (data) => {
67
- const formatNumber = (num) => parseFloat(num.toFixed(2));
68
- if (data >= 1000) {
69
- return `${formatNumber(data / 1000)}k`;
70
- }
71
- return formatNumber(data).toString();
72
- };
73
- dayjs.extend(minMax);
74
- dayjs.extend(isBetween);
75
- dayjs.extend(CustomParseFormat);
76
- const sliderArr = [
77
- "rcvPreempt",
78
- "osPreempt",
79
- "rcvUnderDly",
80
- "postedAudPercent",
81
- "booked",
82
- "spots",
83
- "grp",
84
- "averageRateThisYear",
85
- "averageRateLastYear",
86
- "averageCPP",
87
- "averageCPM",
88
- "IMPSDiff",
89
- "RTGDiff",
90
- "cpp",
91
- "imps",
92
- "cpm",
93
- "osUnderDly",
94
- "totalWeeks",
95
- "WeekNumber",
96
- "Rate",
97
- "OrderedRatingsOrImpressions",
98
- "PostedRatingsOrImpressions",
99
- "postedAudPercent",
100
- "postedAdu",
101
- "scheduledAdu",
102
- "audienceDeficit",
103
- "offeredMGs",
104
- "outstandingPE",
105
- "offeredADUs",
106
- "udDeficitValue",
107
- "bookedValue",
108
- "bookedSpots",
109
- "userChanges",
110
- "UDGrp",
111
- "UDImps",
112
- "ODGrp",
113
- "ODImps",
114
- "udImpsPercent",
115
- "udGrpPercent",
116
- "odImpsPercent",
117
- "odGrpPercent",
118
- "userADUs",
119
- "buyerChanges",
120
- "userChanges",
121
- "userMG",
122
- "WeeklyAUR",
123
- "WeeklyAURatingOrImpressions",
124
- "MGsValue",
125
- "ADUsValue",
126
- "audienceDeficitValue",
127
- "userADUValue",
128
- "userChangesValue",
129
- "buyerChangesValue",
130
- "UserCreditedValue",
131
- "UserUnresolvedValue",
132
- "BuyerAddedValue",
133
- "BuyerDeletedValue",
134
- "BuyerChangesValue",
135
- "UserChangesValue",
136
- "BookedGRPOrIMPS",
137
- "BookedCPPOrCPM",
138
- "BookedValue",
139
- "BookedSpots",
140
- "BookedRate",
141
- "averageRate",
142
- "projectedIMPS",
143
- "projectedRTG",
144
- "desiredCPM",
145
- "desiredCPP",
146
- "inventoryFillPercentageSameWeek",
147
- "inventoryFillPercentageFinal",
148
- "inventoryFillPercentageTillDate",
149
- "dollarRateImpact",
150
- "dollarIMPSImpact",
151
- "IMPSImpact",
152
- "dollarRTGImpact",
153
- "RTGImpact",
154
- "BookedRTG",
155
- "BookedIMPS",
156
- "AURTG",
157
- "AURTG",
158
- "PostedRating",
159
- "PostedImpressions",
160
- "NormalizedOrderedRating",
161
- "NormalizedOrderedImpressions",
162
- "NormalizedPostedRating",
163
- "NormalizedPostedImpressions",
164
- "BookedGRP",
165
- "BookedIMPSRevTab",
166
- "BookedCPP",
167
- "BookedCPM",
168
- "AUIMPS",
169
- "bookedAmountValue",
170
- "equivalizedBookedAmountValue",
171
- "IMPS",
172
- "udValue",
173
- "odValue",
174
- "ViolatedBookedValue",
175
- "ViolatedBookedEURValue",
176
- "ViolatingBookedEURValue",
177
- "ViolatingBookedValue",
178
- "Rebate",
179
- "WeeklyAUR",
180
- "OtherAvailableSpotsTableWeeklyAUR",
181
- "parentRowAnnaEstimatesRtg",
182
- "parentRowPostedRtg",
183
- "parentRowRollingAverageRtg",
184
- "parentRowStationEstimatesRtg",
185
- "parentRowAnnaEstimatesImps",
186
- "parentRowPostedImps",
187
- "parentRowRollingAverageImps",
188
- "parentRowStationEstimatesImps",
189
- "parentRowAnnaEstimatesShare",
190
- "parentRowPostedShare",
191
- "parentRowRollingAverageShare",
192
- "parentRowAnnaEstimatesPutPer",
193
- "parentRowPostedPutPer",
194
- "parentRowRollingAveragePutPer",
195
- "parentRowAnnaEstimatesPut",
196
- "parentRowPostedPut",
197
- "parentRowRollingAveragePut",
198
- "ProjectedImpressions",
199
- "ProjectedRtg",
200
- "projectedCPM",
201
- "projectedCPP",
202
- "bookedEqCpmValue",
203
- "bookedEqCppValue",
204
- "Rating",
205
- "ActualRate",
206
- "Impressions",
207
- "AURKeyLY",
208
- "SellOutPercentLY",
209
- "AURKeyTY",
210
- "SellOutPercentTY",
211
- "offerCount",
212
- "offeredMGsValue",
213
- "outstandingSpotsValue",
214
- "offeredADUsValue",
215
- "uDProjectionValue",
216
- "totalBookedGrp",
217
- "totalBookedImps",
218
- "bookedGrpToDate",
219
- "bookedImpsToDate",
220
- "deliveryThresholdPercentage",
221
- "goalGrpToDate",
222
- "goalImpsToDate",
223
- "postedGrpToDate",
224
- "postedImpsToDate",
225
- "deliveredPercentage",
226
- "udGrpToDate",
227
- "udImpsToDate",
228
- "odGrpToDate",
229
- "odImpsToDate",
230
- "scheduledADUsProjGrp",
231
- "scheduledADUsProjImps",
232
- "postedADUsGrp",
233
- "postedADUsImps",
234
- "bookedVal",
235
- "userMGValue",
236
- "rating",
237
- "IMPS",
238
- "rate",
239
- "amount",
240
- "bookedGRP",
241
- "bookedGI",
242
- "projectedGRP",
243
- "projectedGI",
244
- "budget",
245
- "bookedImps",
246
- "postedImps",
247
- "projectedImps",
248
- ];
249
- const calendarArr = [
250
- "period",
251
- "AirDate",
252
- "flightStartDate",
253
- "flightEndDate",
254
- "date",
255
- "startDate",
256
- "endDate",
257
- "revisionStartDate",
258
- "GeneratedOn",
259
- "Week",
260
- "scheduledDate",
261
- "timeoutDate",
262
- "ViolatingSpotDate",
263
- "ViolatedSpotDate",
264
- "ActualWeekStartDate",
265
- "LastFetchedDate",
266
- "createdOn",
267
- "airDate",
268
- "scheduledWeek",
269
- ];
270
- const timeArr = [
271
- "StartTimeForFilter",
272
- "EndTimeForFilter",
273
- "time",
274
- "startTimeForFilter",
275
- "endTimeForFilter",
276
- "start_time_for_filter",
277
- "end_time_for_filter",
278
- "startEndTimeMulti",
279
- "startEndTime",
280
- "timeoutTime",
281
- "OtherAvailableSpotsTableStartTime",
282
- "OtherAvailableSpotsTableEndTime",
283
- "StartTime",
284
- "EndTime",
285
- ];
286
- this.sliderSet = new Set(sliderArr);
287
- this.calendarSet = new Set(calendarArr);
288
- this.timeSet = new Set(timeArr);
289
- }
290
- returnMaxAndMinValue(data, key, isMin) {
291
- const filteredData = data.filter((obj) => !["", "-", null].includes(obj[key]));
292
- const values = filteredData.map((x) => x[key]);
293
- const valueToReturn = isMin ? min(values) : max(values);
294
- return valueToReturn;
295
- }
296
- returnMinAndMaxDate(data, key) {
297
- const filteredData = data.filter((obj) => !["", "-", null].includes(obj[key]));
298
- const DateArr = filteredData.map((obj) => dayjs(obj[key]));
299
- const minDate = dayjs.min(DateArr);
300
- const maxDate = dayjs.max(DateArr);
301
- return [minDate, maxDate];
302
- }
303
- isTooltipActive(header, sortMap) {
304
- const set = new Set(this.appliedFiltersArray);
305
- const isSortMapForHeader0Active = sortMap.has(header[0]) && sortMap.get(header[0]) !== SortTypeEnum.DEFAULT;
306
- const isSortMapForHeader1Active = sortMap.has(header[1]) && sortMap.get(header[1]) !== SortTypeEnum.DEFAULT;
307
- if (header.length === 1) {
308
- return (sortMap.size > 0 && isSortMapForHeader0Active) || set.has(header[0]);
309
- }
310
- return ((sortMap.size > 0 && sortMap.has(header[0]) && isSortMapForHeader0Active) ||
311
- (sortMap.size > 0 && sortMap.has(header[1]) && isSortMapForHeader1Active) ||
312
- set.has(header[0]) ||
313
- set.has(header[1]));
314
- }
315
- clearColumnFilter() {
316
- if (this.tooltipSelectedMap.has(this.selectedRadio)) {
317
- this.tooltipSelectedMap.delete(this.selectedRadio);
318
- const appliedFilterSet = new Set(this.appliedFiltersArray);
319
- appliedFilterSet.delete(this.selectedRadio);
320
- this.appliedFiltersArray = [...appliedFilterSet];
321
- }
322
- if (this.annaSortService.columnSortState.has(this.selectedRadio)) {
323
- this.annaSortService.columnSortState.delete(this.selectedRadio);
324
- }
325
- }
326
- setOptionValues(minValue, maxValue) {
327
- return {
328
- floor: minValue,
329
- ceil: maxValue,
330
- disabled: true,
331
- translate: this.normalTranslateFunction,
332
- };
333
- }
334
- findUniqueDatesWithData(data) {
335
- const uniqueDates = uniq(data.map((u) => u.date));
336
- const uniqueDatesInNgbDateFormat = [];
337
- uniqueDates.forEach((date) => {
338
- uniqueDatesInNgbDateFormat.push(this.dateTimeFormatService.convertToNgbDateStandardFormat(dayjs(date, "MM/DD/YY").format("MM/DD/YYYY")));
339
- });
340
- return uniqueDatesInNgbDateFormat;
341
- }
342
- reOrderAppliedFiltersArray(isHierarchialUserFiltered, date) {
343
- let isFiltered = true;
344
- isFiltered = this.checkIfDataIsFiltered(isFiltered, isHierarchialUserFiltered, date);
345
- this.removeOrChangeLatestFilterIndex(isFiltered);
346
- }
347
- checkIfDataIsFiltered(isFiltered, isHierarchialUserFiltered, date) {
348
- let isDataFiltered = isFiltered;
349
- if (this.selectedRadio === "user" && !this.tooltipMap.has("user")) {
350
- isDataFiltered = cloneDeep(isHierarchialUserFiltered);
351
- }
352
- else if (this.selectedRadio === "StartTimeForFilter" ||
353
- this.selectedRadio === "EndTimeForFilter" ||
354
- this.selectedRadio === "startTimeForFilter" ||
355
- this.selectedRadio === "endTimeForFilter" ||
356
- this.selectedRadio === "time" ||
357
- this.selectedRadio === "timeoutTime" ||
358
- this.selectedRadio === "OtherAvailableSpotsTableStartTime" ||
359
- this.selectedRadio === "OtherAvailableSpotsTableEndTime" ||
360
- this.selectedRadio === "start_time_for_filter" ||
361
- this.selectedRadio === "end_time_for_filter" ||
362
- this.selectedRadio === "startEndTimeMulti") {
363
- isDataFiltered =
364
- !isEqual(this.initialValueMap.get(this.selectedRadio), this.tooltipSelectedMap.get(this.selectedRadio)) ||
365
- !this.includeZeroTime ||
366
- !this.includeMultiTime;
367
- }
368
- else if (this.selectedRadio === "startEndTime" || this.selectedRadio === "TimeBand") {
369
- isDataFiltered =
370
- !isEqual(this.initialValueMap.get(this.selectedRadio), this.tooltipSelectedMap.get(this.selectedRadio)) ||
371
- !this.includeZeroTime ||
372
- !this.includeMultiTime;
373
- }
374
- else if (this.sliderSet.has(this.selectedRadio)) {
375
- isDataFiltered =
376
- !isEqual(this.initialValueMap.get(this.selectedRadio), this.tooltipSelectedMap.get(this.selectedRadio)) && !isEqual(this.tooltipSelectedMap.get(this.selectedRadio), this.sliderData);
377
- if (this.selectedRadio === "postedAdu" && this.subRadioButton === "notRequired") {
378
- isDataFiltered = true;
379
- }
380
- if (!isDataFiltered && this.tooltipSelectedMap.has(this.selectedRadio)) {
381
- this.tooltipSelectedMap.delete(this.selectedRadio);
382
- }
383
- }
384
- else if (this.selectedRadio === "startDate" ||
385
- this.selectedRadio === "endDate" ||
386
- this.selectedRadio === "period" ||
387
- this.selectedRadio === "AirDate" ||
388
- this.selectedRadio === "timeoutDate" ||
389
- this.selectedRadio === "flightStartDate" ||
390
- this.selectedRadio === "flightEndDate" ||
391
- this.selectedRadio === "date" ||
392
- this.selectedRadio === "revisionStartDate" ||
393
- this.selectedRadio === "GeneratedOn" ||
394
- this.selectedRadio === "Week" ||
395
- this.selectedRadio === "ActualWeekStartDate" ||
396
- this.selectedRadio === "scheduledDate" ||
397
- this.selectedRadio === "LastFetchedDate" ||
398
- this.selectedRadio === "airDate" ||
399
- this.selectedRadio === "scheduledWeek") {
400
- isDataFiltered =
401
- !isEqual(this.initialValueMap.get(this.selectedRadio), this.tooltipSelectedMap.get(this.selectedRadio)) && !isEqual(this.tooltipSelectedMap.get(this.selectedRadio), this.flightDateRange);
402
- if (!isDataFiltered && this.tooltipSelectedMap.has(this.selectedRadio)) {
403
- this.tooltipSelectedMap.delete(this.selectedRadio);
404
- }
405
- }
406
- else {
407
- const totalOptionsCount = this.tooltipMap.get(this.selectedRadio).filter((x) => !x.isHidden).length;
408
- const selectedOptionsCount = this.tooltipMap
409
- .get(this.selectedRadio)
410
- .filter((x) => !x.isHidden && x.isSelected).length;
411
- isDataFiltered = selectedOptionsCount > 0 && selectedOptionsCount !== totalOptionsCount;
412
- }
413
- return isDataFiltered;
414
- }
415
- removeOrChangeLatestFilterIndex(isFiltered) {
416
- const set = new Set(this.appliedFiltersArray);
417
- if (isFiltered && !set.has(this.selectedRadio)) {
418
- set.add(this.selectedRadio);
419
- }
420
- else if (isFiltered && set.has(this.selectedRadio)) {
421
- set.delete(this.selectedRadio);
422
- set.add(this.selectedRadio);
423
- }
424
- else {
425
- set.delete(this.selectedRadio);
426
- }
427
- this.appliedFiltersArray = [...set];
428
- }
429
- checkIfSortingIsAppliedThenSortTheData(originalData) {
430
- let sortedData = originalData;
431
- if (!this.annaSortService?.columnSortState)
432
- return sortedData;
433
- this.annaSortService.columnSortState.forEach((value, key) => {
434
- if (value === "ASC") {
435
- sortedData = cloneDeep(this.annaSortService.sortDataForComponentOtherThanLurAndCsrPage(true, originalData, key));
436
- }
437
- else if (value === "DESC") {
438
- sortedData = cloneDeep(this.annaSortService.sortDataForComponentOtherThanLurAndCsrPage(false, originalData, key));
439
- }
440
- });
441
- return sortedData;
442
- }
443
- filterData(originalData, keyToSkip, isLurCsrPage = false) {
444
- let filteredData = [...originalData];
445
- if (!isLurCsrPage) {
446
- filteredData = this.checkIfSortingIsAppliedThenSortTheData(originalData);
447
- }
448
- this.tooltipSelectedMap.forEach((value, key) => {
449
- const filterSplitedValues = key.includes(this.SPLITED_CHECKBOX_FILTER_KEY);
450
- if (filterSplitedValues) {
451
- // eslint-disable-next-line no-param-reassign
452
- key = key.split(this.SPLITED_CHECKBOX_FILTER_KEY)[0];
453
- }
454
- if (key !== keyToSkip && originalData.length > 0 && this.nestedKeyExists(originalData[0], key)) {
455
- if (this.sliderSet.has(key)) {
456
- filteredData = filteredData.filter((obj) => obj[key] >= value.min && obj[key] <= value.max);
457
- }
458
- else if (key === "startDate" ||
459
- key === "endDate" ||
460
- key === "StartDate" ||
461
- key === "EndDate" ||
462
- key === "AirDate" ||
463
- key === "timeoutDate" ||
464
- key === "flightStartDate" ||
465
- key === "flightEndDate" ||
466
- key === "date" ||
467
- key === "Date" ||
468
- key === "revisionStartDate" ||
469
- key === "GeneratedOn" ||
470
- key === "Week" ||
471
- key === "ActualWeekStartDate" ||
472
- key === "ViolatedSpotDate" ||
473
- key === "ViolatingSpotDate" ||
474
- key === "scheduledDate" ||
475
- key === "LastFetchedDate" ||
476
- key === "createdOn" ||
477
- key === "airDate" ||
478
- key === "scheduledWeek") {
479
- filteredData = filteredData.filter((obj) => this.isObjectInTheRange(obj, value, key));
480
- }
481
- else if (key === "period") {
482
- filteredData = filteredData.filter((obj) => this.getDataInTheDateRange(obj, value, key));
483
- }
484
- else if (key === "StartTimeForFilter" ||
485
- key === "EndTimeForFilter" ||
486
- key === "timeoutTime" ||
487
- key === "startTimeForFilter" ||
488
- key === "endTimeForFilter" ||
489
- key === "StartTime" ||
490
- key === "EndTime" ||
491
- key === "start_time_for_filter" ||
492
- key === "end_time_for_filter" ||
493
- key === "time") {
494
- filteredData = filteredData.filter((obj) => this.returnDataForFromAndToTimeRange(obj, value, key));
495
- }
496
- else if (key === "startEndTimeMulti" || key === "startEndTime" || key === "TimeBand") {
497
- filteredData = filteredData.filter((obj) => this.returnDataForStartAndEndTimeRange(obj, value, key));
498
- }
499
- else if (value.length > 0) {
500
- filteredData = filteredData.filter((u) => filterSplitedValues
501
- ? value.find((val) => u[key].includes(val))
502
- : value.includes(this.getValueFromObject(u, key)));
503
- }
504
- }
505
- });
506
- return filteredData;
507
- }
508
- getValueFromObject(obj, key) {
509
- return key.split(".").reduce((res, currentKey) => res && res[currentKey], obj);
510
- }
511
- nestedKeyExists(obj, key) {
512
- return (key.split(".").reduce((acc, currentKey) => {
513
- if (acc && currentKey in acc) {
514
- return acc[currentKey];
515
- }
516
- return undefined;
517
- }, obj) !== undefined);
518
- }
519
- returnOrdersInTheRange(order, range, key) {
520
- const isDateBetweenTheSelectedRange = dayjs(order[key]).isBetween(range.minSelectedDate, range.maxSelectedDate);
521
- const isDateSameAsTheMinSelectedDate = dayjs(order[key]).isSame(range.minSelectedDate);
522
- const isDateSameAsTheMaxSelectedDate = dayjs(order[key]).isSame(range.maxSelectedDate);
523
- return isDateBetweenTheSelectedRange || isDateSameAsTheMinSelectedDate || isDateSameAsTheMaxSelectedDate;
524
- }
525
- returnDataForTimeRange(obj, selectedData) {
526
- const format = "HH:mm:ss";
527
- const selectedStartDate = dayjs(selectedData.startTime, format);
528
- const selectedEndDate = dayjs(selectedData.endTime, format);
529
- const startTime = dayjs(obj.startTime, format);
530
- const endTime = dayjs(obj.endTime, format);
531
- const isStartTimeSameAsSelectedStartTime = startTime.isSame(selectedStartDate);
532
- const isStartTimeBetweenSelectedStartAndEndTime = startTime.isBetween(selectedStartDate, selectedEndDate);
533
- const isEndTimeSameAsSelectedEndTime = endTime.isSame(selectedEndDate);
534
- const isEndTimeBetweenSelectedStartAndEndTime = endTime.isBetween(selectedStartDate, selectedEndDate);
535
- return ((isStartTimeBetweenSelectedStartAndEndTime && isEndTimeBetweenSelectedStartAndEndTime) ||
536
- (isStartTimeSameAsSelectedStartTime && isEndTimeSameAsSelectedEndTime) ||
537
- (isStartTimeSameAsSelectedStartTime && isEndTimeBetweenSelectedStartAndEndTime) ||
538
- (isStartTimeBetweenSelectedStartAndEndTime && isEndTimeSameAsSelectedEndTime));
539
- }
540
- returnDataForFromAndToTimeRange(obj, selectedData, key) {
541
- const format = "MM/DD/YYYY HH:mm:ss";
542
- const selectedFromTime = dayjs(`01/01/2001 ${selectedData.fromTime}`, format);
543
- const selectedToTime = dayjs(`01/01/2001 ${selectedData.toTime}`, format);
544
- const objTime = obj[key];
545
- if (["", "-", null].includes(objTime)) {
546
- return false;
547
- }
548
- if (selectedData.includeMulti && obj[key] === "<multi>") {
549
- return true;
550
- }
551
- if (!selectedData.includeMulti && obj[key] === "<multi>") {
552
- return false;
553
- }
554
- if (selectedData.includeZero && obj[key] === "0") {
555
- return true;
556
- }
557
- if (!selectedData.includeZero && obj[key] === "0") {
558
- return false;
559
- }
560
- if (!selectedData.includeTimeRange) {
561
- return false;
562
- }
563
- const dayjsTime = dayjs(`01/01/2001 ${objTime}`, format);
564
- const isObjTimeSameAsSelectedFromTime = dayjsTime.isSame(selectedFromTime);
565
- const isObjTimeSameAsSelectedToTime = dayjsTime.isSame(selectedToTime);
566
- const isObjTimeBetweenSelectedFromTimeAndToTime = dayjsTime.isBetween(selectedFromTime, selectedToTime);
567
- return (isObjTimeSameAsSelectedFromTime ||
568
- isObjTimeSameAsSelectedToTime ||
569
- isObjTimeBetweenSelectedFromTimeAndToTime);
570
- }
571
- returnDataForStartAndEndTimeRange(obj, selectedData, key) {
572
- const format = "MM/DD/YYYY HH:mm:ss";
573
- const selectedFromTime = dayjs(`01/01/2001 ${selectedData.fromTime}`, format);
574
- const selectedToTime = dayjs(`01/01/2001 ${selectedData.toTime}`, format);
575
- if (selectedData.includeMulti && obj[key][0] === "<multi>") {
576
- return true;
577
- }
578
- if (!selectedData.includeMulti && obj[key][0] === "<multi>") {
579
- return false;
580
- }
581
- if (selectedData.includeZero && obj[key][0] === "0") {
582
- return true;
583
- }
584
- if (!selectedData.includeZero && obj[key][0] === "0") {
585
- return false;
586
- }
587
- if (!selectedData.includeTimeRange) {
588
- return false;
589
- }
590
- const startTime = dayjs(`01/01/2001 ${obj[key][1]}`, format);
591
- const endTime = dayjs(`01/01/2001 ${obj[key][2]}`, format);
592
- const isStartTimeSameAsSelectedStartTime = startTime.isSame(selectedFromTime);
593
- const isStartTimeBetweenSelectedStartAndEndTime = startTime.isBetween(selectedFromTime, selectedToTime);
594
- const isEndTimeSameAsSelectedEndTime = endTime.isSame(selectedToTime);
595
- const isEndTimeBetweenSelectedStartAndEndTime = endTime.isBetween(selectedFromTime, selectedToTime);
596
- // previous condition to apply timband filtter
597
- // return (
598
- // (isStartTimeBetweenSelectedStartAndEndTime && isEndTimeBetweenSelectedStartAndEndTime) ||
599
- // (isStartTimeSameAsSelectedStartTime && isEndTimeSameAsSelectedEndTime) ||
600
- // (isStartTimeSameAsSelectedStartTime && isEndTimeBetweenSelectedStartAndEndTime) ||
601
- // (isStartTimeBetweenSelectedStartAndEndTime && isEndTimeSameAsSelectedEndTime)
602
- // );
603
- return (isStartTimeSameAsSelectedStartTime ||
604
- isStartTimeBetweenSelectedStartAndEndTime ||
605
- isEndTimeSameAsSelectedEndTime ||
606
- isEndTimeBetweenSelectedStartAndEndTime);
607
- }
608
- getDataInTheDateRange(obj, value, key) {
609
- let parsingFormat;
610
- if (key === "period") {
611
- parsingFormat = "YYYY-MM-DD";
612
- const dayjsStartDate = dayjs(obj.startDate);
613
- const dayjsEndDate = dayjs(obj.endDate);
614
- const startDateIsBetweenSelDate = dayjsStartDate.isBetween(value.fromDate, value.toDate);
615
- const endDateIsBetweenSelDate = dayjsEndDate.isBetween(value.fromDate, value.toDate);
616
- const startDateIsSameAsSelStartDate = value.fromDate.isSame(dayjsStartDate);
617
- const endDateIsSameAsSelEndDate = value.toDate.isSame(dayjsEndDate);
618
- return ((startDateIsBetweenSelDate || startDateIsSameAsSelStartDate) &&
619
- (endDateIsBetweenSelDate || endDateIsSameAsSelEndDate));
620
- }
621
- else if (key === "AirDate" ||
622
- key === "flightStartDate" ||
623
- key === "flightEndDate" ||
624
- key === "Week" ||
625
- key === "ActualWeekStartDate" ||
626
- key === "timeoutDate" ||
627
- key === "scheduledDate" ||
628
- key === "airDate" ||
629
- key === "scheduledWeek") {
630
- parsingFormat = "MM/DD/YYYY";
631
- const dateIsBetweenSelDate = dayjs(obj[key], parsingFormat).isBetween(value.minSelectedDate, value.maxSelectedDate);
632
- const dateIsSameAsSelStartDate = dayjs(obj[key], parsingFormat).isSame(value.minSelectedDate);
633
- const dateIsSameAsSelEndDate = dayjs(obj[key], parsingFormat).isSame(value.maxSelectedDate);
634
- return dateIsBetweenSelDate || dateIsSameAsSelStartDate || dateIsSameAsSelEndDate;
635
- }
636
- return false;
637
- }
638
- initializeTimeFilterData(clonedData, key = "startEndTime") {
639
- const startTimeArr = map(clonedData, "startTime");
640
- const endTimeArr = map(clonedData, "endTime");
641
- startTimeArr.sort((a, b) => this.dateTimeFormatService.sortByTimeAscending(a, b));
642
- endTimeArr.sort((a, b) => this.dateTimeFormatService.sortByTimeDescending(a, b));
643
- const initialStartEndTime = {
644
- startTime: startTimeArr[0],
645
- endTime: endTimeArr[0],
646
- };
647
- this.initialValueMap.set(key, initialStartEndTime);
648
- }
649
- returnColumnFilterStatus(data, headerName) {
650
- if (headerName === "startEndTime") {
651
- const time = data.map((u) => u[headerName][0]);
652
- const uniqTime = uniq(time);
653
- return uniqTime.length === 0;
654
- }
655
- return !(uniq(data.map((u) => u[headerName])).length > 1);
656
- }
657
- getFilterOptionsData(data, clonedData, key) {
658
- const appliedFilterSet = new Set(this.appliedFiltersArray);
659
- const keyToCheck = key || this.selectedRadio;
660
- if (appliedFilterSet.has(keyToCheck)) {
661
- return this.filterData(clonedData, keyToCheck);
662
- }
663
- return data;
664
- }
665
- reOrderAppliedFiltersState(clonedData, value) {
666
- let isFiltered = true;
667
- isFiltered = this.checkIfFilterIsApplied(clonedData, value);
668
- this.removeOrChangeLatestFilterIndex(isFiltered);
669
- return isFiltered;
670
- }
671
- checkIfFilterIsApplied(clonedData, value) {
672
- const initialValueOfColumn = sortBy(clonedData.map((item) => item[this.selectedRadio]));
673
- const currentValueOfColumn = sortBy(this.applyFilter(clonedData, value).map((item) => item[this.selectedRadio]));
674
- return !isEqual(initialValueOfColumn, currentValueOfColumn);
675
- }
676
- applyFilter(data, value) {
677
- let filteredData = data;
678
- const key = this.selectedRadio;
679
- if (this.sliderSet.has(key)) {
680
- filteredData = filteredData.filter((obj) => obj[key] >= value.min && obj[key] <= value.max);
681
- }
682
- else if (key === "startDate" ||
683
- key === "endDate" ||
684
- key === "StartDate" ||
685
- key === "EndDate" ||
686
- key === "AirDate" ||
687
- key === "timeoutDate" ||
688
- key === "flightStartDate" ||
689
- key === "flightEndDate" ||
690
- key === "date" ||
691
- key === "Date" ||
692
- key === "revisionStartDate" ||
693
- key === "GeneratedOn" ||
694
- key === "Week" ||
695
- key === "ActualWeekStartDate" ||
696
- key === "ViolatedSpotDate" ||
697
- key === "ViolatingSpotDate" ||
698
- key === "scheduledDate" ||
699
- key === "LastFetchedDate" ||
700
- key === "createdOn" ||
701
- key === "airDate" ||
702
- key === "scheduledWeek") {
703
- filteredData = filteredData.filter((obj) => this.isObjectInTheRange(obj, value, key));
704
- }
705
- else if (key === "period") {
706
- filteredData = filteredData.filter((obj) => this.getDataInTheDateRange(obj, value, key));
707
- }
708
- else if (key === "StartTimeForFilter" ||
709
- key === "EndTimeForFilter" ||
710
- key === "timeoutTime" ||
711
- key === "startTimeForFilter" ||
712
- key === "endTimeForFilter" ||
713
- key === "start_time_for_filter" ||
714
- key === "end_time_for_filter" ||
715
- key === "time" ||
716
- key === "StartTime" ||
717
- key === "EndTime" ||
718
- key === "OtherAvailableSpotsTableStartTime" ||
719
- key === "OtherAvailableSpotsTableEndTime") {
720
- filteredData = filteredData.filter((obj) => this.returnDataForFromAndToTimeRange(obj, value, key));
721
- }
722
- else if (key === "startEndTimeMulti" || key === "startEndTime" || key === "TimeBand") {
723
- filteredData = filteredData.filter((obj) => this.returnDataForStartAndEndTimeRange(obj, value, key));
724
- }
725
- else if (value.length > 0) {
726
- filteredData = filteredData.filter((u) => value.includes(u[key]));
727
- }
728
- return filteredData;
729
- }
730
- isObjectInTheRange(obj, value, key) {
731
- const objVal = obj[key];
732
- const dayjsDate = dayjs(objVal);
733
- if (typeof value.fromDate === "string" && typeof value.toDate === "string") {
734
- value.fromDate = dayjs(this.dateTimeFormatService.convertNgbDateToMoment(this.dateTimeFormatService.convertToNgbDate(value.fromDate, "DD/MM/YYYY")));
735
- value.toDate = dayjs(this.dateTimeFormatService.convertNgbDateToMoment(this.dateTimeFormatService.convertToNgbDate(value.toDate, "DD/MM/YYYY")));
736
- }
737
- const isDateSameAsStartOfTheRange = value.fromDate.isSame(objVal);
738
- const isDateSameAsEndOfTheRange = value.toDate.isSame(objVal);
739
- const isDateBetweenTheStartAndEndOfRange = dayjsDate.isBetween(value.fromDate, value.toDate);
740
- return isDateSameAsStartOfTheRange || isDateSameAsEndOfTheRange || isDateBetweenTheStartAndEndOfRange;
741
- }
742
- updateStateOfTheCurrentFilterTab(sortMap) {
743
- const activeKey = this.selectedRadio;
744
- let keyArr = [];
745
- Object.keys(this.isFilterSortActive).forEach((key) => {
746
- if (key.includes(activeKey)) {
747
- keyArr = key.split(",");
748
- this.isFilterSortActive[key] = this.isTooltipActive(keyArr, sortMap);
749
- }
750
- });
751
- }
752
- updateStateOfAllTheKeys(sortMap) {
753
- Object.keys(this.isFilterSortActive).forEach((key) => {
754
- const keyArr = key.split(",");
755
- this.isFilterSortActive[key] = this.isTooltipActive(keyArr, sortMap);
756
- });
757
- }
758
- incrementHour(value) {
759
- if (value === "") {
760
- return 1;
761
- }
762
- else if (parseInt(value, 10) < 12) {
763
- return parseInt(value, 10) + 1;
764
- }
765
- return 1;
766
- }
767
- decrementHour(value) {
768
- if (value === "") {
769
- return 12;
770
- }
771
- else if (parseInt(value, 10) > 1) {
772
- return parseInt(value, 10) - 1;
773
- }
774
- return 12;
775
- }
776
- incrementMinute(value) {
777
- // increment to nearest proper interval(15,30,45)
778
- const minute = parseInt(value, 10);
779
- if (minute <= 14) {
780
- return "15";
781
- }
782
- else if (minute >= 15 && minute <= 29) {
783
- return "30";
784
- }
785
- else if (minute >= 30 && minute <= 44) {
786
- return "45";
787
- }
788
- else if (minute >= 45) {
789
- return "00";
790
- }
791
- return value;
792
- }
793
- decrementMinute(value) {
794
- const minute = parseInt(value, 10);
795
- if (minute > 0 && minute <= 15) {
796
- return "00";
797
- }
798
- else if (minute >= 16 && minute <= 30) {
799
- return "15";
800
- }
801
- else if (minute >= 31 && minute <= 45) {
802
- return "30";
803
- }
804
- else if (minute > 45 || minute === 0) {
805
- return "45";
806
- }
807
- return value;
808
- }
809
- // ========================================Checkbox method====================================================//
810
- disableActiveFilterClearButton() {
811
- const selectedFilterSet = new Set(this.appliedFiltersArray);
812
- const currentColumnSortFilter = this.getColumnSortStateForSelectedRadio();
813
- const isSortPresent = this.annaSortService.columnSortState &&
814
- this.annaSortService.columnSortState.size > 0 &&
815
- currentColumnSortFilter !== SortTypeEnum.DEFAULT;
816
- return !(selectedFilterSet.has(this.selectedRadio) || isSortPresent);
817
- }
818
- getColumnSortStateForSelectedRadio() {
819
- let currentColumnSortFilter = this.annaSortService.columnSortState &&
820
- this.annaSortService.columnSortState.has(this.selectedRadio) &&
821
- this.annaSortService.columnSortState.get(this.selectedRadio);
822
- currentColumnSortFilter = currentColumnSortFilter || SortTypeEnum.DEFAULT;
823
- return currentColumnSortFilter;
824
- }
825
- createListForCheckboxFilter(header, optionData, showSplitedOptions = false, splitDelimiter = this.DEFAULT_SPLIT_SEPARATOR) {
826
- const tooltipOptions = this.getTooltipModelFromOptionData(optionData, header, showSplitedOptions, splitDelimiter);
827
- this.selectUnselectListCheckbox(tooltipOptions, header);
828
- this.formatNullOptionToSpecifiedString(tooltipOptions, this.nullToBeFormatedIntoString);
829
- return tooltipOptions;
830
- }
831
- getTooltipModelFromOptionData(optionData, header, showSplitedOptions = false, splitDelimiter = this.DEFAULT_SPLIT_SEPARATOR) {
832
- let uniqOptionData = [];
833
- if (showSplitedOptions) {
834
- let splittedOptions = [];
835
- optionData.forEach((option) => {
836
- splittedOptions = [...splittedOptions, ...option[header].split(splitDelimiter)];
837
- });
838
- uniqOptionData = uniq(splittedOptions);
839
- }
840
- else {
841
- uniqOptionData = uniq(optionData.map((item) => item[header]));
842
- }
843
- return uniqOptionData.map((item, index) => new TooltipModel(item, index + 1));
844
- }
845
- selectUnselectListCheckbox(tooltipOptions, header) {
846
- const tooltipSelectedMapWithOriginalKeys = new Map();
847
- this.tooltipSelectedMap.forEach((value, key) => {
848
- tooltipSelectedMapWithOriginalKeys.set(key.split(this.SPLITED_CHECKBOX_FILTER_KEY)[0], value);
849
- });
850
- if (tooltipSelectedMapWithOriginalKeys.has(header)) {
851
- const selectedValueSet = new Set(tooltipSelectedMapWithOriginalKeys.get(header));
852
- tooltipOptions.forEach((item) => {
853
- item.isSelected = selectedValueSet.has(item.value);
854
- });
855
- }
856
- else {
857
- tooltipOptions.forEach((item) => {
858
- item.isSelected = true;
859
- });
860
- }
861
- }
862
- formatNullOptionToSpecifiedString(tooltipOptions, formattedString) {
863
- const index = tooltipOptions.findIndex((item) => item.value == null);
864
- if (index !== -1) {
865
- tooltipOptions[index].label = formattedString;
866
- }
867
- }
868
- getClonedTooltipAndTooltipOption(tooltipOptions, sortByString) {
869
- const [selectedItems, unselectedItems] = this.getSelectedAndUnselectedItems(tooltipOptions);
870
- const sortedSelectedItems = sortBy(selectedItems, sortByString);
871
- const sortedUnselectedItems = sortBy(unselectedItems, sortByString);
872
- const clonedTooltipOptions = [...sortedSelectedItems, ...sortedUnselectedItems];
873
- const updatedTooltipOptions = cloneDeep(clonedTooltipOptions);
874
- return [clonedTooltipOptions, updatedTooltipOptions, selectedItems, unselectedItems];
875
- }
876
- getHeightOfCheckboxTooltipFilter(dataLength, margin) {
877
- return dataLength > 6 ? 180 : 22.31 * dataLength + margin * dataLength + margin;
878
- }
879
- unCheckAllCheckbox(tooltipOptions, clonedTooltipOptions) {
880
- tooltipOptions.forEach((item) => {
881
- item.isSelected = false;
882
- const index = clonedTooltipOptions.findIndex((opt) => opt.id === item.id);
883
- clonedTooltipOptions[index].isSelected = false;
884
- });
885
- }
886
- selectAllCheckbox(tooltipOptions, clonedTooltipOptions) {
887
- tooltipOptions.forEach((item) => {
888
- item.isSelected = true;
889
- const index = clonedTooltipOptions.findIndex((opt) => opt.id === item.id);
890
- clonedTooltipOptions[index].isSelected = true;
891
- });
892
- }
893
- selectUnselectCheckbox(data, clonedTooltipOptions) {
894
- data.isSelected = !data.isSelected;
895
- const index = clonedTooltipOptions.findIndex((item) => item.id === data.id);
896
- clonedTooltipOptions[index].isSelected = data.isSelected;
897
- }
898
- getSelectedAndUnselectedItems(tooltipOptions) {
899
- const selectedItems = tooltipOptions.filter((item) => item.isSelected);
900
- const unselectedItems = tooltipOptions.filter((item) => !item.isSelected);
901
- return [selectedItems, unselectedItems];
902
- }
903
- getCheckboxPreviousSelectedValue(clonedTableData) {
904
- let previousSelectedValue = [];
905
- if (this.tooltipSelectedMap.has(this.selectedRadio)) {
906
- previousSelectedValue = this.tooltipSelectedMap.get(this.selectedRadio);
907
- if (!this.initialValueMap.has(this.selectedRadio)) {
908
- const initialValue = sortBy(uniq(clonedTableData.map((item) => item[this.selectedRadio])));
909
- this.initialValueMap.set(this.selectedRadio, initialValue);
910
- }
911
- }
912
- else if (this.initialValueMap.has(this.selectedRadio)) {
913
- previousSelectedValue = this.initialValueMap.get(this.selectedRadio);
914
- }
915
- else {
916
- previousSelectedValue = sortBy(uniq(clonedTableData.map((item) => item[this.selectedRadio])));
917
- this.initialValueMap.set(this.selectedRadio, previousSelectedValue);
918
- }
919
- return previousSelectedValue;
920
- }
921
- getCheckboxCurrentSelectedValue(searchedString, tooltipOptions) {
922
- let currentSelectedValue = [];
923
- if (tooltipOptions) {
924
- currentSelectedValue = sortBy(tooltipOptions.filter((item) => item.isSelected).map((item) => item.value));
925
- if (!searchedString &&
926
- currentSelectedValue.length === tooltipOptions.length &&
927
- this.initialValueMap.has(this.selectedRadio)) {
928
- currentSelectedValue = this.initialValueMap.get(this.selectedRadio);
929
- }
930
- }
931
- const blankIndex = currentSelectedValue.findIndex((item) => item == null);
932
- if (blankIndex !== -1) {
933
- currentSelectedValue = sortBy(currentSelectedValue);
934
- }
935
- return currentSelectedValue;
936
- }
937
- checkIfSortingChanged(tempSortOrder) {
938
- const currentColumnSortFilter = this.getColumnSortStateForSelectedRadio();
939
- const isSortChanged = tempSortOrder != null && tempSortOrder !== currentColumnSortFilter;
940
- return isSortChanged;
941
- }
942
- getFilteredOptionAsBoldString(str, clonedTooltipOptions) {
943
- const tooltipOptions = cloneDeep(clonedTooltipOptions.filter((item) => item.label.toString().toLowerCase().includes(str.toLowerCase())));
944
- tooltipOptions.forEach((element) => {
945
- element.label = this.boldString(element.label, str);
946
- });
947
- return tooltipOptions;
948
- }
949
- boldString(str, find) {
950
- let updatedString = str;
951
- const findString = find.replace("<", "&lt;").replace(">", "&gt;");
952
- updatedString = updatedString.replace("<", "&lt;").replace(">", "&gt;");
953
- const indexes = this.getIndicesOf(findString, updatedString, false);
954
- indexes.forEach((item, index) => {
955
- const startIndex = item + index * 7; // Multiplying by 7 as there are 7char: <b></b>
956
- const endIndex = startIndex + findString.length;
957
- const strToBeReplaced = updatedString.substring(startIndex, endIndex);
958
- updatedString = updatedString.replace(strToBeReplaced, `<b>${strToBeReplaced}</b>`);
959
- });
960
- return updatedString;
961
- }
962
- getIndicesOf(searchStr, str, caseSensitive) {
963
- const searchStrLen = searchStr.length;
964
- if (searchStrLen === 0) {
965
- return [];
966
- }
967
- let startIndex = 0;
968
- let index;
969
- const indices = [];
970
- let updatedStr = str;
971
- let updatedSearchStr = searchStr;
972
- if (!caseSensitive) {
973
- updatedStr = str.toLowerCase();
974
- updatedSearchStr = searchStr.toLowerCase();
975
- }
976
- index = updatedStr.indexOf(updatedSearchStr, startIndex);
977
- while (index > -1) {
978
- indices.push(index);
979
- startIndex = index + searchStrLen;
980
- index = updatedStr.indexOf(updatedSearchStr, startIndex);
981
- }
982
- return indices;
983
- }
984
- disableAllBtnsWhenThereAreNoFilteredResults() {
985
- // [selectedCheckboxOptionsCount, disableCheckboxApply, disableClearAll, disableSelectAll];
986
- return [0, true, true, true];
987
- }
988
- // ========================================Calendar filter===============================================//
989
- createRangeForTheDateFilter(optionData) {
990
- let minMaxDate;
991
- // When you want to use startDate and endDate combined as single column then use Period.
992
- if (this.selectedRadio === "period" ||
993
- this.selectedRadio === "buyerFlightDates" ||
994
- this.selectedRadio === "trafficFlightDates") {
995
- minMaxDate = this.createStartEndDateRange(optionData);
996
- }
997
- else {
998
- minMaxDate = this.returnMinAndMaxDate(optionData, this.selectedRadio);
999
- }
1000
- return minMaxDate;
1001
- }
1002
- createStartEndDateRange(optionData) {
1003
- const minStartDate = this.returnMinAndMaxDate(optionData, "startDate");
1004
- const maxEndDate = this.returnMinAndMaxDate(optionData, "endDate");
1005
- return [minStartDate[0], maxEndDate[1]];
1006
- }
1007
- getMinAndMaxDateRangeForCalendar(minMaxDate, parsingFormat) {
1008
- const calendarMinEnabledDate = this.dateTimeFormatService.convertToNgbDate(minMaxDate[0], parsingFormat);
1009
- const calendarMaxEnabledDate = this.dateTimeFormatService.convertToNgbDate(minMaxDate[1], parsingFormat);
1010
- return [calendarMinEnabledDate, calendarMaxEnabledDate];
1011
- }
1012
- getSelectedDateForCalendar(minMaxDate, parsingFormat, minDate, maxDate) {
1013
- let selectedMinDate;
1014
- let selectedMaxDate;
1015
- if (this.tooltipSelectedMap.has(this.selectedRadio)) {
1016
- const selectedDateObj = this.tooltipSelectedMap.get(this.selectedRadio);
1017
- if (selectedDateObj.fromDate.isAfter(minMaxDate[0])) {
1018
- selectedMinDate = this.dateTimeFormatService.convertToNgbDate(selectedDateObj.fromDate, parsingFormat);
1019
- }
1020
- else {
1021
- selectedMinDate = this.dateTimeFormatService.convertToNgbDate(minMaxDate[0], parsingFormat);
1022
- }
1023
- if (selectedDateObj.toDate.isAfter(minMaxDate[1])) {
1024
- selectedMaxDate = this.dateTimeFormatService.convertToNgbDate(minMaxDate[1], parsingFormat);
1025
- }
1026
- else {
1027
- selectedMaxDate = this.dateTimeFormatService.convertToNgbDate(selectedDateObj.toDate, parsingFormat);
1028
- }
1029
- }
1030
- else {
1031
- selectedMinDate = cloneDeep(minDate);
1032
- selectedMaxDate = cloneDeep(maxDate);
1033
- }
1034
- return [selectedMinDate, selectedMaxDate];
1035
- }
1036
- getPreviousSelectedDatesForCalendar(optionData) {
1037
- let previousSelectedDate = { fromDate: null, toDate: null };
1038
- if (this.tooltipSelectedMap.has(this.selectedRadio)) {
1039
- previousSelectedDate = this.tooltipSelectedMap.get(this.selectedRadio);
1040
- if (!this.initialValueMap.has(this.selectedRadio)) {
1041
- this.setInitialValueMapForDateFilter(optionData);
1042
- }
1043
- }
1044
- else if (this.initialValueMap.has(this.selectedRadio)) {
1045
- previousSelectedDate = this.initialValueMap.get(this.selectedRadio);
1046
- }
1047
- else {
1048
- this.setInitialValueMapForDateFilter(optionData);
1049
- previousSelectedDate = this.initialValueMap.get(this.selectedRadio);
1050
- }
1051
- return previousSelectedDate;
1052
- }
1053
- setInitialValueMapForDateFilter(optionData) {
1054
- const minMaxDate = this.createRangeForTheDateFilter(optionData);
1055
- const selectedDate = { fromDate: minMaxDate[0], toDate: minMaxDate[1] };
1056
- this.initialValueMap.set(this.selectedRadio, selectedDate);
1057
- }
1058
- getCurrentSelectedDatesForCalendar(currentSelectedDate, minDate, maxDate) {
1059
- let currentSelectedDateToBeUpdated = currentSelectedDate;
1060
- const fromDate = {
1061
- year: currentSelectedDateToBeUpdated.fromDate.year,
1062
- month: currentSelectedDateToBeUpdated.fromDate.month,
1063
- day: currentSelectedDateToBeUpdated.fromDate.day,
1064
- };
1065
- const toDate = {
1066
- year: currentSelectedDateToBeUpdated.toDate.year,
1067
- month: currentSelectedDateToBeUpdated.toDate.month,
1068
- day: currentSelectedDateToBeUpdated.toDate.day,
1069
- };
1070
- if (isEqual(minDate, fromDate) && isEqual(maxDate, toDate) && this.initialValueMap.has(this.selectedRadio)) {
1071
- currentSelectedDateToBeUpdated = this.initialValueMap.get(this.selectedRadio);
1072
- }
1073
- else {
1074
- currentSelectedDateToBeUpdated.fromDate = dayjs(this.dateTimeFormatService.convertNgbDateToMoment(currentSelectedDateToBeUpdated.fromDate));
1075
- currentSelectedDateToBeUpdated.toDate = dayjs(this.dateTimeFormatService.convertNgbDateToMoment(currentSelectedDateToBeUpdated.toDate));
1076
- }
1077
- return currentSelectedDateToBeUpdated;
1078
- }
1079
- // ====================================SLIDER===================================//
1080
- getSliderTranslateFuncVal(header, currencySet) {
1081
- let translateFunc;
1082
- if (currencySet.has(header)) {
1083
- translateFunc = "currency";
1084
- }
1085
- else if (header === "postedAudPercent" || header === "parentRowShares" || header === "parentRowPutPercent") {
1086
- translateFunc = "percent";
1087
- }
1088
- else {
1089
- translateFunc = "normal";
1090
- }
1091
- return translateFunc;
1092
- }
1093
- getSliderOptions(optionsData, translateFunc, header) {
1094
- const minValue = this.returnMaxAndMinValue(optionsData, header, true);
1095
- const maxValue = this.returnMaxAndMinValue(optionsData, header, false);
1096
- const obj = this.setOptionValues(minValue, maxValue);
1097
- if (translateFunc === "normal") {
1098
- obj.translate = this.normalTranslateFunction;
1099
- }
1100
- else if (translateFunc === "percent") {
1101
- obj.translate = this.percentTranslateFunction;
1102
- }
1103
- else if (translateFunc === "currency") {
1104
- obj.translate = this.currencyTranslateFunction;
1105
- }
1106
- return obj;
1107
- }
1108
- setSelectedRangeForSlider(header, options) {
1109
- let sliderMinValue;
1110
- let sliderMaxValue;
1111
- if (this.tooltipSelectedMap.has(header)) {
1112
- const selectedObj = this.tooltipSelectedMap.get(header);
1113
- sliderMinValue = selectedObj.min < options.floor ? options.floor : selectedObj.min;
1114
- sliderMaxValue = selectedObj.max < options.ceil ? selectedObj.max : options.ceil;
1115
- }
1116
- else {
1117
- sliderMinValue = options.floor;
1118
- sliderMaxValue = options.ceil;
1119
- }
1120
- return [sliderMinValue, sliderMaxValue];
1121
- }
1122
- isValueInRange(options, val) {
1123
- return options.floor <= val && val <= options.ceil;
1124
- }
1125
- getPreviousSelectedValueForSlider(clonedData) {
1126
- let previousSliderData = { min: "", max: "" };
1127
- if (this.tooltipSelectedMap.has(this.selectedRadio)) {
1128
- previousSliderData = this.tooltipSelectedMap.get(this.selectedRadio);
1129
- if (!this.initialValueMap.has(this.selectedRadio)) {
1130
- this.setInitialValueMapForSliderFilter(clonedData);
1131
- }
1132
- }
1133
- else if (this.initialValueMap.has(this.selectedRadio)) {
1134
- previousSliderData = this.initialValueMap.get(this.selectedRadio);
1135
- }
1136
- else {
1137
- this.setInitialValueMapForSliderFilter(clonedData);
1138
- previousSliderData = this.initialValueMap.get(this.selectedRadio);
1139
- }
1140
- return previousSliderData;
1141
- }
1142
- setInitialValueMapForSliderFilter(clonedData) {
1143
- const minValue = this.returnMaxAndMinValue(clonedData, this.selectedRadio, true);
1144
- const maxValue = this.returnMaxAndMinValue(clonedData, this.selectedRadio, false);
1145
- const sliderData = { min: minValue, max: maxValue };
1146
- this.initialValueMap.set(this.selectedRadio, sliderData);
1147
- }
1148
- getCurrentSelectedValueForSlider(minEnteredVal, maxEnteredVal, options) {
1149
- let currentSliderData = { min: null, max: null };
1150
- if (maxEnteredVal || maxEnteredVal === 0) {
1151
- currentSliderData.max = maxEnteredVal;
1152
- }
1153
- else {
1154
- currentSliderData.max = options.ceil;
1155
- }
1156
- if (minEnteredVal || minEnteredVal === 0) {
1157
- currentSliderData.min = minEnteredVal;
1158
- }
1159
- else {
1160
- currentSliderData.min = options.floor;
1161
- }
1162
- if (currentSliderData.min === options.floor &&
1163
- currentSliderData.max === options.ceil &&
1164
- this.initialValueMap.has(this.selectedRadio)) {
1165
- currentSliderData = this.initialValueMap.get(this.selectedRadio);
1166
- }
1167
- return currentSliderData;
1168
- }
1169
- // =================================================TIME=========================================================//
1170
- getSelectedTimeRange(header, clonedData) {
1171
- let selectedFromTime;
1172
- let selectedToTime;
1173
- if (this.tooltipSelectedMap.has(header)) {
1174
- selectedFromTime = this.tooltipSelectedMap.get(header).fromTime;
1175
- selectedToTime = this.tooltipSelectedMap.get(header).toTime;
1176
- }
1177
- else {
1178
- this.setInitialValueMapForTimeFilter(clonedData, header);
1179
- selectedFromTime = this.initialValueMap.get(header).fromTime;
1180
- selectedToTime = this.initialValueMap.get(header).toTime;
1181
- }
1182
- if (selectedFromTime !== undefined || selectedToTime !== undefined) {
1183
- selectedFromTime = AnnaDateTimeFormatService.formatToTwelveHrs(selectedFromTime, true);
1184
- selectedToTime = AnnaDateTimeFormatService.formatToTwelveHrs(selectedToTime, true);
1185
- }
1186
- else {
1187
- selectedFromTime = ["-", "-", "-"];
1188
- selectedToTime = ["-", "-", "-"];
1189
- }
1190
- return [selectedFromTime, selectedToTime];
1191
- }
1192
- setInitialValueMapForTimeFilter(clonedData, key) {
1193
- if (key === "startEndTime" || key === "TimeBand") {
1194
- this.setInitialValueForStartAndEndTimeRange(clonedData, key);
1195
- }
1196
- else {
1197
- this.setInitialValueForStartOrEndTimeRange(clonedData, key);
1198
- }
1199
- }
1200
- // use for filter where we have start and end time range in one filter
1201
- // startEndTime: ["6 - 7A", "06: 00 : 00" , "07:00:00"]
1202
- setInitialValueForStartAndEndTimeRange(clonedData, key) {
1203
- const includeMulti = clonedData.findIndex((obj) => obj[key][0] === "<multi>") !== -1;
1204
- const includeZero = clonedData.findIndex((obj) => obj[key][0] === "0") !== -1;
1205
- const includeTimeRange = clonedData.findIndex((obj) => obj[key][0] !== "0" && obj[key][0] !== "<multi>") !== -1;
1206
- const filteredStartTime = clonedData.filter((obj) => !["", "-", null, "0", "<multi>"].includes(obj.startTime));
1207
- const filteredEndTime = clonedData.filter((obj) => !["", "-", null, "0", "<multi>"].includes(obj.endTime));
1208
- const startTimeArr = map(filteredStartTime, "startTime");
1209
- const endTimeArr = map(filteredEndTime, "endTime");
1210
- startTimeArr.sort((a, b) => this.dateTimeFormatService.sortByTimeAscending(a, b));
1211
- endTimeArr.sort((a, b) => this.dateTimeFormatService.sortByTimeDescending(a, b));
1212
- const obj = {
1213
- fromTime: startTimeArr[0],
1214
- toTime: endTimeArr[0],
1215
- includeMulti,
1216
- includeZero,
1217
- includeTimeRange,
1218
- };
1219
- this.initialValueMap.set(key, obj);
1220
- }
1221
- // use for the filters where we have different filter for start and end time
1222
- // startTime: "06:00:00"
1223
- setInitialValueForStartOrEndTimeRange(clonedData, key) {
1224
- const includeMulti = clonedData.findIndex((obj) => obj[key] === "<multi>") !== -1;
1225
- const includeZero = clonedData.findIndex((obj) => obj[key] === "0") !== -1;
1226
- const includeTimeRange = clonedData.findIndex((obj) => obj[key] !== "0" && obj[key] !== "<multi>") !== -1;
1227
- const data = clonedData.filter((obj) => !["", "-", null, "0", "<multi>"].includes(obj[key]));
1228
- const timeArr = map(data, key);
1229
- timeArr.sort((a, b) => this.dateTimeFormatService.sortByTimeAscending(a, b));
1230
- const obj = {
1231
- fromTime: timeArr[0],
1232
- toTime: timeArr[timeArr.length - 1],
1233
- includeMulti,
1234
- includeZero,
1235
- includeTimeRange,
1236
- };
1237
- this.initialValueMap.set(key, obj);
1238
- }
1239
- selectUnselectTimeFilterCheckbox(key, optionsData) {
1240
- let showMultiTimeCheckbox = false;
1241
- let showZeroTimeCheckbox = false;
1242
- let showEnterTimeCheckbox = false;
1243
- let multiTimeCheckboxChecked = false;
1244
- let zeroTimeCheckboxChecked = false;
1245
- let enterTimeCheckboxChecked = false;
1246
- let selectedTimeObj;
1247
- if (this.tooltipSelectedMap.has(key)) {
1248
- selectedTimeObj = this.tooltipSelectedMap.get(key);
1249
- }
1250
- else {
1251
- selectedTimeObj = this.initialValueMap.get(key);
1252
- }
1253
- let timeArr;
1254
- if (key === "startEndTime" || key === "TimeBand") {
1255
- timeArr = optionsData.map((item) => item[key][0]);
1256
- }
1257
- else {
1258
- timeArr = optionsData.map((item) => item[key]);
1259
- }
1260
- if (timeArr.findIndex((val) => val === "0") !== -1) {
1261
- showZeroTimeCheckbox = true;
1262
- zeroTimeCheckboxChecked = selectedTimeObj.includeZero;
1263
- }
1264
- if (timeArr.findIndex((val) => val === "<multi>") !== -1) {
1265
- showMultiTimeCheckbox = true;
1266
- multiTimeCheckboxChecked = selectedTimeObj.includeMulti;
1267
- }
1268
- if (showZeroTimeCheckbox || showMultiTimeCheckbox) {
1269
- showEnterTimeCheckbox = true;
1270
- }
1271
- if (timeArr.findIndex((val) => val !== "<multi>" && val !== "0") !== -1) {
1272
- enterTimeCheckboxChecked = selectedTimeObj?.includeTimeRange;
1273
- }
1274
- return {
1275
- showMultiTimeCheckbox,
1276
- showZeroTimeCheckbox,
1277
- showEnterTimeCheckbox,
1278
- multiTimeCheckboxChecked,
1279
- zeroTimeCheckboxChecked,
1280
- enterTimeCheckboxChecked,
1281
- };
1282
- }
1283
- checkIfStartTimeIsAfterEndTime(startTime, endTime) {
1284
- const timeFormat = "HH:mm:ss";
1285
- const startTime24HrFormatArr = this.dateTimeFormatService.convertTotwentyFourHrsFormat(`${startTime[0]}:${startTime[1]} ${startTime[2]}`, true);
1286
- const startTime24HrFormat = `${startTime24HrFormatArr[0]}:${startTime24HrFormatArr[1]}:00`;
1287
- const endTime24HrFormatArr = this.dateTimeFormatService.convertTotwentyFourHrsFormat(`${endTime[0]}:${endTime[1]} ${endTime[2]}`, true);
1288
- const endTime24HrFormat = `${endTime24HrFormatArr[0]}:${endTime24HrFormatArr[1]}:00`;
1289
- return dayjs(startTime24HrFormat, timeFormat).isAfter(dayjs(endTime24HrFormat, timeFormat));
1290
- }
1291
- getPreviousSelectedTimeFilter() {
1292
- let previousSelectedTimeFilter;
1293
- if (this.tooltipSelectedMap.has(this.selectedRadio)) {
1294
- previousSelectedTimeFilter = this.tooltipSelectedMap.get(this.selectedRadio);
1295
- }
1296
- else if (this.initialValueMap.has(this.selectedRadio)) {
1297
- previousSelectedTimeFilter = this.initialValueMap.get(this.selectedRadio);
1298
- }
1299
- return previousSelectedTimeFilter;
1300
- }
1301
- getCurrentSelectedTimeFilter(startTime, endTime, includeMulti, includeZero, includeTimeRange) {
1302
- const fromTime24HrFormatArr = this.dateTimeFormatService.convertTotwentyFourHrsFormat(`${startTime[0]}:${startTime[1]} ${startTime[2]}`, true);
1303
- const fromTime24HrFormat = `${fromTime24HrFormatArr[0]}:${fromTime24HrFormatArr[1]}:00`;
1304
- const toTime24HrFormatArr = this.dateTimeFormatService.convertTotwentyFourHrsFormat(`${endTime[0]}:${endTime[1]} ${endTime[2]}`, true);
1305
- const toTime24HrFormat = `${toTime24HrFormatArr[0]}:${toTime24HrFormatArr[1]}:00`;
1306
- const currentSelectedTimeFilter = {
1307
- fromTime: fromTime24HrFormat,
1308
- toTime: toTime24HrFormat,
1309
- includeMulti,
1310
- includeZero,
1311
- includeTimeRange,
1312
- };
1313
- return currentSelectedTimeFilter;
1314
- }
1315
- incrementHourInput(arr) {
1316
- if (arr[0] === "") {
1317
- arr[0] = 1;
1318
- }
1319
- else if (parseInt(arr[0], 10) < 12) {
1320
- arr[0] = parseInt(arr[0], 10) + 1;
1321
- }
1322
- else {
1323
- arr[0] = 1;
1324
- }
1325
- }
1326
- decrementHourInput(arr) {
1327
- if (arr[0] === "") {
1328
- arr[0] = 12;
1329
- }
1330
- else if (parseInt(arr[0], 10) > 1) {
1331
- arr[0] = parseInt(arr[0], 10) - 1;
1332
- }
1333
- else {
1334
- arr[0] = 12;
1335
- }
1336
- }
1337
- incrementMinuteInput(arr) {
1338
- // increment to nearest proper interval(15,30,45)
1339
- const minute = parseInt(arr[1], 10);
1340
- if (minute <= 14) {
1341
- arr[1] = "15";
1342
- }
1343
- else if (minute >= 15 && minute <= 29) {
1344
- arr[1] = "30";
1345
- }
1346
- else if (minute >= 30 && minute <= 44) {
1347
- arr[1] = "45";
1348
- }
1349
- else if (minute >= 45) {
1350
- arr[1] = "00";
1351
- }
1352
- }
1353
- decrementMinuteInput(arr) {
1354
- const minute = parseInt(arr[1], 10);
1355
- if (minute > 0 && minute <= 15) {
1356
- arr[1] = "00";
1357
- }
1358
- else if (minute >= 16 && minute <= 30) {
1359
- arr[1] = "15";
1360
- }
1361
- else if (minute >= 31 && minute <= 45) {
1362
- arr[1] = "30";
1363
- }
1364
- else if (minute > 45 || minute === 0) {
1365
- arr[1] = "45";
1366
- }
1367
- }
1368
- incrementOrDecrementHour(increment, time) {
1369
- if (increment) {
1370
- this.incrementHourInput(time);
1371
- }
1372
- else {
1373
- this.decrementHourInput(time);
1374
- }
1375
- }
1376
- incrementOrDecrementMin(increment, time) {
1377
- if (increment) {
1378
- this.incrementMinuteInput(time);
1379
- }
1380
- else {
1381
- this.decrementMinuteInput(time);
1382
- }
1383
- }
1384
- isHourValueInvalid(hr) {
1385
- return hr.length === 0 || !+hr || parseInt(hr, 10) < 1 || parseInt(hr, 10) > 12 || hr.includes(".");
1386
- }
1387
- isMinuteValueInvalid(minute) {
1388
- return (minute.length !== 2 ||
1389
- (!+minute && minute !== "00") ||
1390
- parseInt(minute, 10) < 0 ||
1391
- parseInt(minute, 10) > 59 ||
1392
- minute.includes("."));
1393
- }
1394
- // ===========================================SORT=========================================================//
1395
- updateSortMap(tempSortOrder, tableData, isLurAndCsrComponent) {
1396
- this.annaSortService.columnSortState = new Map();
1397
- this.annaSortService.columnSortState.set(this.selectedRadio, tempSortOrder);
1398
- const sortedTableData = this.annaSortService.applySorting(this.selectedRadio, tempSortOrder, tableData, isLurAndCsrComponent);
1399
- return sortedTableData;
1400
- }
1401
- // Filter icon alignment to bigger element in uppar and lower header
1402
- setMarginLeftForFilterIcon(thElements) {
1403
- const elementArr = thElements.toArray();
1404
- elementArr.forEach((item) => {
1405
- const childDivElements = item.nativeElement.children;
1406
- if (childDivElements.length === 2) {
1407
- const firstParagraphOffsetWidth = childDivElements[0]?.children[0]?.offsetWidth
1408
- ? childDivElements[0]?.children[0]?.offsetWidth
1409
- : 0;
1410
- const secondParagraphOffsetWidth = childDivElements[1].children[0]?.offsetWidth
1411
- ? childDivElements[1].children[0]?.offsetWidth
1412
- : 0;
1413
- if (firstParagraphOffsetWidth > secondParagraphOffsetWidth) {
1414
- const diff = firstParagraphOffsetWidth - secondParagraphOffsetWidth;
1415
- if (childDivElements[0].children.length === 2) {
1416
- childDivElements[0].children[1].style.marginLeft = `${4}px`;
1417
- }
1418
- if (childDivElements[1].children.length === 2) {
1419
- childDivElements[1].children[1].style.marginLeft = `${diff + 4}px`;
1420
- }
1421
- }
1422
- else {
1423
- const diff = secondParagraphOffsetWidth - firstParagraphOffsetWidth;
1424
- if (childDivElements[0].children.length === 2) {
1425
- childDivElements[0].children[1].style.marginLeft = `${diff + 4}px`;
1426
- }
1427
- if (childDivElements[1].children.length === 2) {
1428
- childDivElements[1].children[1].style.marginLeft = `${4}px`;
1429
- }
1430
- }
1431
- }
1432
- });
1433
- }
1434
- checkIfUniqueValuePresentForTheHeader(header, enabledHeaders, tableData, clonedTableData) {
1435
- header.filterSortObjectKeys.forEach((item) => {
1436
- const dataToCheck = this.getFilterOptionsData(tableData, clonedTableData, item);
1437
- if (item === "period") {
1438
- const uniqStartDate = uniq(dataToCheck.map((u) => u.startDate));
1439
- const uniqEndDate = uniq(dataToCheck.map((u) => u.endDate));
1440
- if (uniqStartDate.length > 1 ||
1441
- uniqEndDate.length > 1 ||
1442
- this.isTooltipActive([item], this.annaSortService.columnSortState)) {
1443
- enabledHeaders.push(item);
1444
- }
1445
- }
1446
- else {
1447
- const values = dataToCheck.map((u) => u[item]);
1448
- // if last applied filter is this header, push it alos as enabledHeader
1449
- let activeAndLastlyAppliedHeader = false;
1450
- if (this.appliedFiltersArray.length > 0 &&
1451
- this.appliedFiltersArray[this.appliedFiltersArray.length - 1] === item) {
1452
- activeAndLastlyAppliedHeader = true;
1453
- }
1454
- if (header.filter === "CHECKBOX" && (uniq(values).length > 1 || activeAndLastlyAppliedHeader)) {
1455
- enabledHeaders.push(item);
1456
- }
1457
- else if (header.filter !== "CHECKBOX" &&
1458
- (uniq(values).filter((n) => n != null && n !== "-").length > 1 || activeAndLastlyAppliedHeader)) {
1459
- enabledHeaders.push(item);
1460
- }
1461
- }
1462
- });
1463
- }
1464
- disableEnableEachColumnTooltipIcon(tableHeaders, tableData, clonedTableData) {
1465
- tableHeaders.forEach((header) => {
1466
- header.headerInfo.forEach((item) => {
1467
- if (item.showTooltipIcon) {
1468
- let values = [];
1469
- item.disableTooltipIcon = true;
1470
- item.filterSortObjectKeys.forEach((key) => {
1471
- const latestFilters = this.appliedFiltersArray;
1472
- if (latestFilters.length > 0 &&
1473
- item.disableTooltipIcon &&
1474
- latestFilters[latestFilters.length - 1] === key) {
1475
- item.disableTooltipIcon = false;
1476
- }
1477
- if (item.disableTooltipIcon) {
1478
- if (key === "period") {
1479
- const uniqStartDate = uniq(tableData.map((u) => u.startDate));
1480
- const uniqEndDate = uniq(tableData.map((u) => u.endDate));
1481
- item.disableTooltipIcon = !(uniqStartDate.length > 1 || uniqEndDate.length > 1);
1482
- }
1483
- else {
1484
- values = tableData.map((u) => u[key]);
1485
- if ((item.filter === "CHECKBOX" && uniq(values).length > 1) ||
1486
- (item.filter !== "CHECKBOX" &&
1487
- uniq(values).filter((n) => n != null && n !== "-").length > 1)) {
1488
- item.disableTooltipIcon = false;
1489
- }
1490
- }
1491
- }
1492
- });
1493
- }
1494
- });
1495
- });
1496
- }
1497
- // for date type of filters we need to update tooltip selected map start and end date values to dayjs object.
1498
- updateDateFilterTooltipSelectedMap(keys) {
1499
- keys.forEach((key) => {
1500
- if (this.tooltipSelectedMap?.has(key)) {
1501
- const dateRange = this.tooltipSelectedMap.get(key);
1502
- if (dateRange?.fromDate && dateRange?.toDate) {
1503
- const selectedDateObj = {
1504
- fromDate: dayjs(dateRange.fromDate),
1505
- toDate: dayjs(dateRange.toDate),
1506
- };
1507
- this.tooltipSelectedMap.set(key, selectedDateObj);
1508
- }
1509
- }
1510
- });
1511
- }
1512
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AnnaFilterService, deps: [{ token: i1.AnnaDateTimeFormatService }, { token: i2.AnnaSortService }], target: i0.ɵɵFactoryTarget.Injectable }); }
1513
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AnnaFilterService, providedIn: "root" }); }
1514
- }
1515
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AnnaFilterService, decorators: [{
1516
- type: Injectable,
1517
- args: [{
1518
- providedIn: "root",
1519
- }]
1520
- }], ctorParameters: () => [{ type: i1.AnnaDateTimeFormatService }, { type: i2.AnnaSortService }] });
1521
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5uYS1maWx0ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FubmEtY29yZS9zcmMvbGliL2FubmEtY29yZS1zaGFyZWQtbGliL3NlcnZpY2VzL2FubmEtZmlsdGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsNEJBQTRCO0FBQzVCLE9BQU8sRUFBYyxVQUFVLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFFbEUsT0FBTyxLQUFnQixNQUFNLE9BQU8sQ0FBQztBQUNyQyxPQUFPLGlCQUFpQixNQUFNLGdDQUFnQyxDQUFDO0FBQy9ELE9BQU8sU0FBUyxNQUFNLHdCQUF3QixDQUFDO0FBQy9DLE9BQU8sTUFBTSxNQUFNLHFCQUFxQixDQUFDO0FBQ3pDLGdDQUFnQztBQUNoQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRzVFLE9BQU8sRUFBWSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDNUQsaUNBQWlDO0FBQ2pDLE9BQU8sRUFBRSx5QkFBeUIsRUFBZSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7OztBQUt0RCxNQUFNLE9BQU8saUJBQWlCO2FBNkNaLGVBQVUsR0FBRyxFQUFFLEFBQUwsQ0FBTTtJQUs5QixZQUNZLHFCQUFnRCxFQUNoRCxlQUFnQztRQURoQywwQkFBcUIsR0FBckIscUJBQXFCLENBQTJCO1FBQ2hELG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQW5ENUMsZUFBVSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDdkIsdUJBQWtCLEdBQUcsSUFBSSxHQUFHLEVBQUUs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QUM7Z0NBQ3BDLENBQUM7NEJBQ0wsQ0FBQzt3QkFDTCxDQUFDO29CQUNMLENBQUMsQ0FBQyxDQUFDO2dCQUNQLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELDZHQUE2RztJQUM3RyxrQ0FBa0MsQ0FBQyxJQUFjO1FBQzdDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNqQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDcEMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFFbkQsSUFBSSxTQUFTLEVBQUUsUUFBUSxJQUFJLFNBQVMsRUFBRSxNQUFNLEVBQUUsQ0FBQztvQkFDM0MsTUFBTSxlQUFlLEdBQXVDO3dCQUN4RCxRQUFRLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUM7d0JBQ25DLE1BQU0sRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztxQkFDbEMsQ0FBQztvQkFFRixJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxlQUFlLENBQUMsQ0FBQztnQkFDdEQsQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7K0dBdnZEUSxpQkFBaUI7bUhBQWpCLGlCQUFpQixjQUZkLE1BQU07OzRGQUVULGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBbmd1bGFyIGltcG9ydCBzdGF0ZW1lbnRzXHJcbmltcG9ydCB7IEVsZW1lbnRSZWYsIEluamVjdGFibGUsIFF1ZXJ5TGlzdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IE9wdGlvbnMgfSBmcm9tIFwiQGFuZ3VsYXItc2xpZGVyL25neC1zbGlkZXJcIjtcclxuaW1wb3J0IGRheWpzLCB7IERheWpzIH0gZnJvbSBcImRheWpzXCI7XHJcbmltcG9ydCBDdXN0b21QYXJzZUZvcm1hdCBmcm9tIFwiZGF5anMvcGx1Z2luL2N1c3RvbVBhcnNlRm9ybWF0XCI7XHJcbmltcG9ydCBpc0JldHdlZW4gZnJvbSBcImRheWpzL3BsdWdpbi9pc0JldHdlZW5cIjtcclxuaW1wb3J0IG1pbk1heCBmcm9tIFwiZGF5anMvcGx1Z2luL21pbk1heFwiO1xyXG4vLyBUaGlyZCBwYXJ0eSBpbXBvcnQgc3RhdGVtZW50c1xyXG5pbXBvcnQgeyBjbG9uZURlZXAsIGlzRXF1YWwsIG1hcCwgbWF4LCBtaW4sIHNvcnRCeSwgdW5pcSB9IGZyb20gXCJsb2Rhc2gtZXNcIjtcclxuXHJcbmltcG9ydCB7IElHdFRhYmxlSGVhZGVyLCBJSGVhZGVySW5mbyB9IGZyb20gXCIuLi9tb2RlbHMvYW5uYS1ub24tZWRpdGFibGUtZ3QtbW9kZWxzXCI7XHJcbmltcG9ydCB7IFNvcnRUeXBlLCBTb3J0VHlwZUVudW0gfSBmcm9tIFwiLi4vbW9kZWxzL2FubmEtc29ydC5tb2RlbFwiO1xyXG5pbXBvcnQgeyBUb29sdGlwTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWxzL2FubmEtdG9vbHRpcC5tb2RlbFwiO1xyXG4vLyBVc2VyIGRlZmluZWQgaW1wb3J0IHN0YXRlbWVudHNcclxuaW1wb3J0IHsgQW5uYURhdGVUaW1lRm9ybWF0U2VydmljZSwgTmdiRGF0ZVR5cGUgfSBmcm9tIFwiLi9hbm5hLWRhdGUtdGltZS1mb3JtYXQuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBBbm5hU29ydFNlcnZpY2UgfSBmcm9tIFwiLi9hbm5hLXNvcnQuc2VydmljZVwiO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogXCJyb290XCIsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBbm5hRmlsdGVyU2VydmljZSB7XHJcbiAgICB0b29sdGlwTWFwID0gbmV3IE1hcCgpO1xyXG4gICAgdG9vbHRpcFNlbGVjdGVkTWFwID0gbmV3IE1hcCgpO1xyXG4gICAgaW5pdGlhbFZhbHVlTWFwOiBNYXA8c3RyaW5nLCBhbnk+O1xyXG4gICAgdHJhbnNsYXRlRnVuYzogc3RyaW5nO1xyXG4gICAgc2VsZWN0ZWRSYWRpbzogc3RyaW5nO1xyXG4gICAgc3ViUmFkaW9CdXR0b246IHN0cmluZztcclxuXHJcbiAgICBjYWxlbmRhclNldDogU2V0PHN0cmluZz47XHJcbiAgICBzbGlkZXJTZXQ6IFNldDxzdHJpbmc+O1xyXG4gICAgdGltZVNldDogU2V0PHN0cmluZz47XHJcblxyXG4gICAgaW5jbHVkZU11bHRpVGltZTogYm9vbGVhbjtcclxuICAgIGluY2x1ZGVaZXJvVGltZTogYm9vbGVhbjtcclxuICAgIGluY2x1ZGVUaW1lUmFuZ2U6IGJvb2xlYW47XHJcblxyXG4gICAgYXBwbGllZEZpbHRlcnNBcnJheTogc3RyaW5nW10gPSBbXTtcclxuICAgIGZsaWdodERhdGVSYW5nZTogeyBtaW5TZWxlY3RlZERhdGU6IGFueTsgbWF4U2VsZWN0ZWREYXRlOiBhbnkgfTtcclxuICAgIHNsaWRlckRhdGE6IHsgbWluOiBhbnk7IG1heDogYW55IH07XHJcbiAgICBuZ3hTbGlkZXJPYmo6IE9wdGlvbnM7XHJcblxyXG4gICAgU1BMSVRFRF9DSEVDS0JPWF9GSUxURVJfS0VZID0gXCJfU3BsaXRlZENoZWNrQm94T3B0aW9uc1wiO1xyXG4gICAgREVGQVVMVF9TUExJVF9TRVBBUkFUT1IgPSBcIiwgXCI7XHJcblxyXG4gICAgc2xpZGVyQ3VycmVuY3lTZXQgPSBuZXcgU2V0KFtcclxuICAgICAgICBcImJvb2tlZFwiLFxyXG4gICAgICAgIFwiY3BwXCIsXHJcbiAgICAgICAgXCJjcG1cIixcclxuICAgICAgICBcInJjdlByZWVtcHRcIixcclxuICAgICAgICBcIm9zUHJlZW1wdFwiLFxyXG4gICAgICAgIFwicG9zdGVkQWR1XCIsXHJcbiAgICAgICAgXCJzY2hlZHVsZWRBZHVcIixcclxuICAgICAgICBcImF1ZGllbmNlRGVmaWNpdFwiLFxyXG4gICAgICAgIFwiUmF0ZVwiLFxyXG4gICAgICAgIFwidXNlckFEVXNcIixcclxuICAgICAgICBcImJ1eWVyQ2hhbmdlc1wiLFxyXG4gICAgICAgIFwidXNlckNoYW5nZXNcIixcclxuICAgICAgICBcInVzZXJNR1wiLFxyXG4gICAgICAgIFwidWRWYWx1ZVwiLFxyXG4gICAgICAgIFwib2RWYWx1ZVwiLFxyXG4gICAgICAgIFwiYnV5ZXJCb29rZWRWYWx1ZVwiLFxyXG4gICAgICAgIFwidHJhZmZpY0Jvb2tlZFZhbHVlXCIsXHJcbiAgICAgICAgXCJib29rZWRWYWxcIixcclxuICAgIF0pO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgYnVmZmVyU2l6ZSA9IDIwO1xyXG4gICAgaXNGaWx0ZXJTb3J0QWN0aXZlOiBhbnkgPSB7fTtcclxuICAgIHJlc2V0RmlsdGVyU29ydEFjdGl2ZVN0YXR1czogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBudWxsVG9CZUZvcm1hdGVkSW50b1N0cmluZyA9IFwiLVwiO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlOiBBbm5hRGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgYW5uYVNvcnRTZXJ2aWNlOiBBbm5hU29ydFNlcnZpY2UsXHJcbiAgICApIHtcclxuICAgICAgICBkYXlqcy5leHRlbmQobWluTWF4KTtcclxuICAgICAgICBkYXlqcy5leHRlbmQoaXNCZXR3ZWVuKTtcclxuICAgICAgICBkYXlqcy5leHRlbmQoQ3VzdG9tUGFyc2VGb3JtYXQpO1xyXG4gICAgICAgIGNvbnN0IHNsaWRlckFyciA9IFtcclxuICAgICAgICAgICAgXCJyY3ZQcmVlbXB0XCIsXHJcbiAgICAgICAgICAgIFwib3NQcmVlbXB0XCIsXHJcbiAgICAgICAgICAgIFwicmN2VW5kZXJEbHlcIixcclxuICAgICAgICAgICAgXCJwb3N0ZWRBdWRQZXJjZW50XCIsXHJcbiAgICAgICAgICAgIFwiYm9va2VkXCIsXHJcbiAgICAgICAgICAgIFwic3BvdHNcIixcclxuICAgICAgICAgICAgXCJncnBcIixcclxuICAgICAgICAgICAgXCJhdmVyYWdlUmF0ZVRoaXNZZWFyXCIsXHJcbiAgICAgICAgICAgIFwiYXZlcmFnZVJhdGVMYXN0WWVhclwiLFxyXG4gICAgICAgICAgICBcImF2ZXJhZ2VDUFBcIixcclxuICAgICAgICAgICAgXCJhdmVyYWdlQ1BNXCIsXHJcbiAgICAgICAgICAgIFwiSU1QU0RpZmZcIixcclxuICAgICAgICAgICAgXCJSVEdEaWZmXCIsXHJcbiAgICAgICAgICAgIFwiY3BwXCIsXHJcbiAgICAgICAgICAgIFwiaW1wc1wiLFxyXG4gICAgICAgICAgICBcImNwbVwiLFxyXG4gICAgICAgICAgICBcIm9zVW5kZXJEbHlcIixcclxuICAgICAgICAgICAgXCJ0b3RhbFdlZWtzXCIsXHJcbiAgICAgICAgICAgIFwiV2Vla051bWJlclwiLFxyXG4gICAgICAgICAgICBcIlJhdGVcIixcclxuICAgICAgICAgICAgXCJPcmRlcmVkUmF0aW5nc09ySW1wcmVzc2lvbnNcIixcclxuICAgICAgICAgICAgXCJQb3N0ZWRSYXRpbmdzT3JJbXByZXNzaW9uc1wiLFxyXG4gICAgICAgICAgICBcInBvc3RlZEF1ZFBlcmNlbnRcIixcclxuICAgICAgICAgICAgXCJwb3N0ZWRBZHVcIixcclxuICAgICAgICAgICAgXCJzY2hlZHVsZWRBZHVcIixcclxuICAgICAgICAgICAgXCJhdWRpZW5jZURlZmljaXRcIixcclxuICAgICAgICAgICAgXCJvZmZlcmVkTUdzXCIsXHJcbiAgICAgICAgICAgIFwib3V0c3RhbmRpbmdQRVwiLFxyXG4gICAgICAgICAgICBcIm9mZmVyZWRBRFVzXCIsXHJcbiAgICAgICAgICAgIFwidWREZWZpY2l0VmFsdWVcIixcclxuICAgICAgICAgICAgXCJib29rZWRWYWx1ZVwiLFxyXG4gICAgICAgICAgICBcImJvb2tlZFNwb3RzXCIsXHJcbiAgICAgICAgICAgIFwidXNlckNoYW5nZXNcIixcclxuICAgICAgICAgICAgXCJVREdycFwiLFxyXG4gICAgICAgICAgICBcIlVESW1wc1wiLFxyXG4gICAgICAgICAgICBcIk9ER3JwXCIsXHJcbiAgICAgICAgICAgIFwiT0RJbXBzXCIsXHJcbiAgICAgICAgICAgIFwidWRJbXBzUGVyY2VudFwiLFxyXG4gICAgICAgICAgICBcInVkR3JwUGVyY2VudFwiLFxyXG4gICAgICAgICAgICBcIm9kSW1wc1BlcmNlbnRcIixcclxuICAgICAgICAgICAgXCJvZEdycFBlcmNlbnRcIixcclxuICAgICAgICAgICAgXCJ1c2VyQURVc1wiLFxyXG4gICAgICAgICAgICBcImJ1eWVyQ2hhbmdlc1wiLFxyXG4gICAgICAgICAgICBcInVzZXJDaGFuZ2VzXCIsXHJcbiAgICAgICAgICAgIFwidXNlck1HXCIsXHJcbiAgICAgICAgICAgIFwiV2Vla2x5QVVSXCIsXHJcbiAgICAgICAgICAgIFwiV2Vla2x5QVVSYXRpbmdPckltcHJlc3Npb25zXCIsXHJcbiAgICAgICAgICAgIFwiTUdzVmFsdWVcIixcclxuICAgICAgICAgICAgXCJBRFVzVmFsdWVcIixcclxuICAgICAgICAgICAgXCJhdWRpZW5jZURlZmljaXRWYWx1ZVwiLFxyXG4gICAgICAgICAgICBcInVzZXJBRFVWYWx1ZVwiLFxyXG4gICAgICAgICAgICBcInVzZXJDaGFuZ2VzVmFsdWVcIixcclxuICAgICAgICAgICAgXCJidXllckNoYW5nZXNWYWx1ZVwiLFxyXG4gICAgICAgICAgICBcIlVzZXJDcmVkaXRlZFZhbHVlXCIsXHJcbiAgICAgICAgICAgIFwiVXNlclVucmVzb2x2ZWRWYWx1ZVwiLFxyXG4gICAgICAgICAgICBcIkJ1eWVyQWRkZWRWYWx1ZVwiLFxyXG4gICAgICAgICAgICBcIkJ1eWVyRGVsZXRlZFZhbHVlXCIsXHJcbiAgICAgICAgICAgIFwiQnV5ZXJDaGFuZ2VzVmFsdWVcIixcclxuICAgICAgICAgICAgXCJVc2VyQ2hhbmdlc1ZhbHVlXCIsXHJcbiAgICAgICAgICAgIFwiQm9va2VkR1JQT3JJTVBTXCIsXHJcbiAgICAgICAgICAgIFwiQm9va2VkQ1BQT3JDUE1cIixcclxuICAgICAgICAgICAgXCJCb29rZWRWYWx1ZVwiLFxyXG4gICAgICAgICAgICBcIkJvb2tlZFNwb3RzXCIsXHJcbiAgICAgICAgICAgIFwiQm9va2VkUmF0ZVwiLFxyXG4gICAgICAgICAgICBcImF2ZXJhZ2VSYXRlXCIsXHJcbiAgICAgICAgICAgIFwicHJvamVjdGVkSU1QU1wiLFxyXG4gICAgICAgICAgICBcInByb2plY3RlZFJUR1wiLFxyXG4gICAgICAgICAgICBcImRlc2lyZWRDUE1cIixcclxuICAgICAgICAgICAgXCJkZXNpcmVkQ1BQXCIsXHJcbiAgICAgICAgICAgIFwiaW52ZW50b3J5RmlsbFBlcmNlbnRhZ2VTYW1lV2Vla1wiLFxyXG4gICAgICAgICAgICBcImludmVudG9yeUZpbGxQZXJjZW50YWdlRmluYWxcIixcclxuICAgICAgICAgICAgXCJpbnZlbnRvcnlGaWxsUGVyY2VudGFnZVRpbGxEYXRlXCIsXHJcbiAgICAgICAgICAgIFwiZG9sbGFyUmF0ZUltcGFjdFwiLFxyXG4gICAgICAgICAgICBcImRvbGxhcklNUFNJbXBhY3RcIixcclxuICAgICAgICAgICAgXCJJTVBTSW1wYWN0XCIsXHJcbiAgICAgICAgICAgIFwiZG9sbGFyUlRHSW1wYWN0XCIsXHJcbiAgICAgICAgICAgIFwiUlRHSW1wYWN0XCIsXHJcbiAgICAgICAgICAgIFwiQm9va2VkUlRHXCIsXHJcbiAgICAgICAgICAgIFwiQm9va2VkSU1QU1wiLFxyXG4gICAgICAgICAgICBcIkFVUlRHXCIsXHJcbiAgICAgICAgICAgIFwiQVVSVEdcIixcclxuICAgICAgICAgICAgXCJQb3N0ZWRSYXRpbmdcIixcclxuICAgICAgICAgICAgXCJQb3N0ZWRJbXByZXNzaW9uc1wiLFxyXG4gICAgICAgICAgICBcIk5vcm1hbGl6ZWRPcmRlcmVkUmF0aW5nXCIsXHJcbiAgICAgICAgICAgIFwiTm9ybWFsaXplZE9yZGVyZWRJbXByZXNzaW9uc1wiLFxyXG4gICAgICAgICAgICBcIk5vcm1hbGl6ZWRQb3N0ZWRSYXRpbmdcIixcclxuICAgICAgICAgICAgXCJOb3JtYWxpemVkUG9zdGVkSW1wcmVzc2lvbnNcIixcclxuICAgICAgICAgICAgXCJCb29rZWRHUlBcIixcclxuICAgICAgICAgICAgXCJCb29rZWRJTVBTUmV2VGFiXCIsXHJcbiAgICAgICAgICAgIFwiQm9va2VkQ1BQXCIsXHJcbiAgICAgICAgICAgIFwiQm9va2VkQ1BNXCIsXHJcbiAgICAgICAgICAgIFwiQVVJTVBTXCIsXHJcbiAgICAgICAgICAgIFwiYm9va2VkQW1vdW50VmFsdWVcIixcclxuICAgICAgICAgICAgXCJlcXVpdmFsaXplZEJvb2tlZEFtb3VudFZhbHVlXCIsXHJcbiAgICAgICAgICAgIFwiSU1QU1wiLFxyXG4gICAgICAgICAgICBcInVkVmFsdWVcIixcclxuICAgICAgICAgICAgXCJvZFZhbHVlXCIsXHJcbiAgICAgICAgICAgIFwiVmlvbGF0ZWRCb29rZWRWYWx1ZVwiLFxyXG4gICAgICAgICAgICBcIlZpb2xhdGVkQm9va2VkRVVSVmFsdWVcIixcclxuICAgICAgICAgICAgXCJWaW9sYXRpbmdCb29rZWRFVVJWYWx1ZVwiLFxyXG4gICAgICAgICAgICBcIlZpb2xhdGluZ0Jvb2tlZFZhbHVlXCIsXHJcbiAgICAgICAgICAgIFwiUmViYXRlXCIsXHJcbiAgICAgICAgICAgIFwiV2Vla2x5QVVSXCIsXHJcbiAgICAgICAgICAgIFwiT3RoZXJBdmFpbGFibGVTcG90c1RhYmxlV2Vla2x5QVVSXCIsXHJcbiAgICAgICAgICAgIFwicGFyZW50Um93QW5uYUVzdGltYXRlc1J0Z1wiLFxyXG4gICAgICAgICAgICBcInBhcmVudFJvd1Bvc3RlZFJ0Z1wiLFxyXG4gICAgICAgICAgICBcInBhcmVudFJvd1JvbGxpbmdBdmVyYWdlUnRnXCIsXHJcbiAgICAgICAgICAgIFwicGFyZW50Um93U3RhdGlvbkVzdGltYXRlc1J0Z1wiLFxyXG4gICAgICAgICAgICBcInBhcmVudFJvd0FubmFFc3RpbWF0ZXNJbXBzXCIsXHJcbiAgICAgICAgICAgIFwicGFyZW50Um93UG9zdGVkSW1wc1wiLFxyXG4gICAgICAgICAgICBcInBhcmVudFJvd1JvbGxpbmdBdmVyYWdlSW1wc1wiLFxyXG4gICAgICAgICAgICBcInBhcmVudFJvd1N0YXRpb25Fc3RpbWF0ZXNJbXBzXCIsXHJcbiAgICAgICAgICAgIFwicGFyZW50Um93QW5uYUVzdGltYXRlc1NoYXJlXCIsXHJcbiAgICAgICAgICAgIFwicGFyZW50Um93UG9zdGVkU2hhcmVcIixcclxuICAgICAgICAgICAgXCJwYXJlbnRSb3dSb2xsaW5nQXZlcmFnZVNoYXJlXCIsXHJcbiAgICAgICAgICAgIFwicGFyZW50Um93QW5uYUVzdGltYXRlc1B1dFBlclwiLFxyXG4gICAgICAgICAgICBcInBhcmVudFJvd1Bvc3RlZFB1dFBlclwiLFxyXG4gICAgICAgICAgICBcInBhcmVudFJvd1JvbGxpbmdBdmVyYWdlUHV0UGVyXCIsXHJcbiAgICAgICAgICAgIFwicGFyZW50Um93QW5uYUVzdGltYXRlc1B1dFwiLFxyXG4gICAgICAgICAgICBcInBhcmVudFJvd1Bvc3RlZFB1dFwiLFxyXG4gICAgICAgICAgICBcInBhcmVudFJvd1JvbGxpbmdBdmVyYWdlUHV0XCIsXHJcbiAgICAgICAgICAgIFwiUHJvamVjdGVkSW1wcmVzc2lvbnNcIixcclxuICAgICAgICAgICAgXCJQcm9qZWN0ZWRSdGdcIixcclxuICAgICAgICAgICAgXCJwcm9qZWN0ZWRDUE1cIixcclxuICAgICAgICAgICAgXCJwcm9qZWN0ZWRDUFBcIixcclxuICAgICAgICAgICAgXCJib29rZWRFcUNwbVZhbHVlXCIsXHJcbiAgICAgICAgICAgIFwiYm9va2VkRXFDcHBWYWx1ZVwiLFxyXG4gICAgICAgICAgICBcIlJhdGluZ1wiLFxyXG4gICAgICAgICAgICBcIkFjdHVhbFJhdGVcIixcclxuICAgICAgICAgICAgXCJJbXByZXNzaW9uc1wiLFxyXG4gICAgICAgICAgICBcIkFVUktleUxZXCIsXHJcbiAgICAgICAgICAgIFwiU2VsbE91dFBlcmNlbnRMWVwiLFxyXG4gICAgICAgICAgICBcIkFVUktleVRZXCIsXHJcbiAgICAgICAgICAgIFwiU2VsbE91dFBlcmNlbnRUWVwiLFxyXG4gICAgICAgICAgICBcIm9mZmVyQ291bnRcIixcclxuICAgICAgICAgICAgXCJvZmZlcmVkTUdzVmFsdWVcIixcclxuICAgICAgICAgICAgXCJvdXRzdGFuZGluZ1Nwb3RzVmFsdWVcIixcclxuICAgICAgICAgICAgXCJvZmZlcmVkQURVc1ZhbHVlXCIsXHJcbiAgICAgICAgICAgIFwidURQcm9qZWN0aW9uVmFsdWVcIixcclxuICAgICAgICAgICAgXCJ0b3RhbEJvb2tlZEdycFwiLFxyXG4gICAgICAgICAgICBcInRvdGFsQm9va2VkSW1wc1wiLFxyXG4gICAgICAgICAgICBcImJvb2tlZEdycFRvRGF0ZVwiLFxyXG4gICAgICAgICAgICBcImJvb2tlZEltcHNUb0RhdGVcIixcclxuICAgICAgICAgICAgXCJkZWxpdmVyeVRocmVzaG9sZFBlcmNlbnRhZ2VcIixcclxuICAgICAgICAgICAgXCJnb2FsR3JwVG9EYXRlXCIsXHJcbiAgICAgICAgICAgIFwiZ29hbEltcHNUb0RhdGVcIixcclxuICAgICAgICAgICAgXCJwb3N0ZWRHcnBUb0RhdGVcIixcclxuICAgICAgICAgICAgXCJwb3N0ZWRJbXBzVG9EYXRlXCIsXHJcbiAgICAgICAgICAgIFwiZGVsaXZlcmVkUGVyY2VudGFnZVwiLFxyXG4gICAgICAgICAgICBcInVkR3JwVG9EYXRlXCIsXHJcbiAgICAgICAgICAgIFwidWRJbXBzVG9EYXRlXCIsXHJcbiAgICAgICAgICAgIFwib2RHcnBUb0RhdGVcIixcclxuICAgICAgICAgICAgXCJvZEltcHNUb0RhdGVcIixcclxuICAgICAgICAgICAgXCJzY2hlZHVsZWRBRFVzUHJvakdycFwiLFxyXG4gICAgICAgICAgICBcInNjaGVkdWxlZEFEVXNQcm9qSW1wc1wiLFxyXG4gICAgICAgICAgICBcInBvc3RlZEFEVXNHcnBcIixcclxuICAgICAgICAgICAgXCJwb3N0ZWRBRFVzSW1wc1wiLFxyXG4gICAgICAgICAgICBcImJvb2tlZFZhbFwiLFxyXG4gICAgICAgICAgICBcInVzZXJNR1ZhbHVlXCIsXHJcbiAgICAgICAgICAgIFwicmF0aW5nXCIsXHJcbiAgICAgICAgICAgIFwiSU1QU1wiLFxyXG4gICAgICAgICAgICBcInJhdGVcIixcclxuICAgICAgICAgICAgXCJhbW91bnRcIixcclxuICAgICAgICAgICAgXCJib29rZWRHUlBcIixcclxuICAgICAgICAgICAgXCJib29rZWRHSVwiLFxyXG4gICAgICAgICAgICBcInByb2plY3RlZEdSUFwiLFxyXG4gICAgICAgICAgICBcInByb2plY3RlZEdJXCIsXHJcbiAgICAgICAgICAgIFwiYnVkZ2V0XCIsXHJcbiAgICAgICAgICAgIFwiYm9va2VkSW1wc1wiLFxyXG4gICAgICAgICAgICBcInBvc3RlZEltcHNcIixcclxuICAgICAgICAgICAgXCJwcm9qZWN0ZWRJbXBzXCIsXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgY29uc3QgY2FsZW5kYXJBcnIgPSBbXHJcbiAgICAgICAgICAgIFwicGVyaW9kXCIsXHJcbiAgICAgICAgICAgIFwiQWlyRGF0ZVwiLFxyXG4gICAgICAgICAgICBcImZsaWdodFN0YXJ0RGF0ZVwiLFxyXG4gICAgICAgICAgICBcImZsaWdodEVuZERhdGVcIixcclxuICAgICAgICAgICAgXCJkYXRlXCIsXHJcbiAgICAgICAgICAgIFwic3RhcnREYXRlXCIsXHJcbiAgICAgICAgICAgIFwiZW5kRGF0ZVwiLFxyXG4gICAgICAgICAgICBcInJldmlzaW9uU3RhcnREYXRlXCIsXHJcbiAgICAgICAgICAgIFwiR2VuZXJhdGVkT25cIixcclxuICAgICAgICAgICAgXCJXZWVrXCIsXHJcbiAgICAgICAgICAgIFwic2NoZWR1bGVkRGF0ZVwiLFxyXG4gICAgICAgICAgICBcInRpbWVvdXREYXRlXCIsXHJcbiAgICAgICAgICAgIFwiVmlvbGF0aW5nU3BvdERhdGVcIixcclxuICAgICAgICAgICAgXCJWaW9sYXRlZFNwb3REYXRlXCIsXHJcbiAgICAgICAgICAgIFwiQWN0dWFsV2Vla1N0YXJ0RGF0ZVwiLFxyXG4gICAgICAgICAgICBcIkxhc3RGZXRjaGVkRGF0ZVwiLFxyXG4gICAgICAgICAgICBcImNyZWF0ZWRPblwiLFxyXG4gICAgICAgICAgICBcImFpckRhdGVcIixcclxuICAgICAgICAgICAgXCJzY2hlZHVsZWRXZWVrXCIsXHJcbiAgICAgICAgXTtcclxuICAgICAgICBjb25zdCB0aW1lQXJyID0gW1xyXG4gICAgICAgICAgICBcIlN0YXJ0VGltZUZvckZpbHRlclwiLFxyXG4gICAgICAgICAgICBcIkVuZFRpbWVGb3JGaWx0ZXJcIixcclxuICAgICAgICAgICAgXCJ0aW1lXCIsXHJcbiAgICAgICAgICAgIFwic3RhcnRUaW1lRm9yRmlsdGVyXCIsXHJcbiAgICAgICAgICAgIFwiZW5kVGltZUZvckZpbHRlclwiLFxyXG4gICAgICAgICAgICBcInN0YXJ0X3RpbWVfZm9yX2ZpbHRlclwiLFxyXG4gICAgICAgICAgICBcImVuZF90aW1lX2Zvcl9maWx0ZXJcIixcclxuICAgICAgICAgICAgXCJzdGFydEVuZFRpbWVNdWx0aVwiLFxyXG4gICAgICAgICAgICBcInN0YXJ0RW5kVGltZVwiLFxyXG4gICAgICAgICAgICBcInRpbWVvdXRUaW1lXCIsXHJcbiAgICAgICAgICAgIFwiT3RoZXJBdmFpbGFibGVTcG90c1RhYmxlU3RhcnRUaW1lXCIsXHJcbiAgICAgICAgICAgIFwiT3RoZXJBdmFpbGFibGVTcG90c1RhYmxlRW5kVGltZVwiLFxyXG4gICAgICAgICAgICBcIlN0YXJ0VGltZVwiLFxyXG4gICAgICAgICAgICBcIkVuZFRpbWVcIixcclxuICAgICAgICBdO1xyXG4gICAgICAgIHRoaXMuc2xpZGVyU2V0ID0gbmV3IFNldChzbGlkZXJBcnIpO1xyXG4gICAgICAgIHRoaXMuY2FsZW5kYXJTZXQgPSBuZXcgU2V0KGNhbGVuZGFyQXJyKTtcclxuICAgICAgICB0aGlzLnRpbWVTZXQgPSBuZXcgU2V0KHRpbWVBcnIpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybk1heEFuZE1pblZhbHVlKGRhdGE6IGFueVtdLCBrZXk6IHN0cmluZywgaXNNaW46IGJvb2xlYW4pIHtcclxuICAgICAgICBjb25zdCBmaWx0ZXJlZERhdGEgPSBkYXRhLmZpbHRlcigob2JqKSA9PiAhW1wiXCIsIFwiLVwiLCBudWxsXS5pbmNsdWRlcyhvYmpba2V5XSkpO1xyXG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IGZpbHRlcmVkRGF0YS5tYXAoKHgpID0+IHhba2V5XSk7XHJcbiAgICAgICAgY29uc3QgdmFsdWVUb1JldHVybiA9IGlzTWluID8gbWluKHZhbHVlcykgOiBtYXgodmFsdWVzKTtcclxuICAgICAgICByZXR1cm4gdmFsdWVUb1JldHVybjtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm5NaW5BbmRNYXhEYXRlKGRhdGE6IGFueVtdLCBrZXk6IHN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IGZpbHRlcmVkRGF0YSA9IGRhdGEuZmlsdGVyKChvYmopID0+ICFbXCJcIiwgXCItXCIsIG51bGxdLmluY2x1ZGVzKG9ialtrZXldKSk7XHJcbiAgICAgICAgY29uc3QgRGF0ZUFyciA9IGZpbHRlcmVkRGF0YS5tYXAoKG9iaikgPT4gZGF5anMob2JqW2tleV0pKTtcclxuICAgICAgICBjb25zdCBtaW5EYXRlID0gZGF5anMubWluKERhdGVBcnIpO1xyXG4gICAgICAgIGNvbnN0IG1heERhdGUgPSBkYXlqcy5tYXgoRGF0ZUFycik7XHJcblxyXG4gICAgICAgIHJldHVybiBbbWluRGF0ZSwgbWF4RGF0ZV07XHJcbiAgICB9XHJcblxyXG4gICAgaXNUb29sdGlwQWN0aXZlKGhlYWRlcjogc3RyaW5nW10sIHNvcnRNYXA6IE1hcDxzdHJpbmcsIFNvcnRUeXBlPik6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IHNldDogU2V0PHN0cmluZz4gPSBuZXcgU2V0KHRoaXMuYXBwbGllZEZpbHRlcnNBcnJheSk7XHJcbiAgICAgICAgY29uc3QgaXNTb3J0TWFwRm9ySGVhZGVyMEFjdGl2ZSA9IHNvcnRNYXAuaGFzKGhlYWRlclswXSkgJiYgc29ydE1hcC5nZXQoaGVhZGVyWzBdKSAhPT0gU29ydFR5cGVFbnVtLkRFRkFVTFQ7XHJcbiAgICAgICAgY29uc3QgaXNTb3J0TWFwRm9ySGVhZGVyMUFjdGl2ZSA9IHNvcnRNYXAuaGFzKGhlYWRlclsxXSkgJiYgc29ydE1hcC5nZXQoaGVhZGVyWzFdKSAhPT0gU29ydFR5cGVFbnVtLkRFRkFVTFQ7XHJcblxyXG4gICAgICAgIGlmIChoZWFkZXIubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAoc29ydE1hcC5zaXplID4gMCAmJiBpc1NvcnRNYXBGb3JIZWFkZXIwQWN0aXZlKSB8fCBzZXQuaGFzKGhlYWRlclswXSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAoc29ydE1hcC5zaXplID4gMCAmJiBzb3J0TWFwLmhhcyhoZWFkZXJbMF0pICYmIGlzU29ydE1hcEZvckhlYWRlcjBBY3RpdmUpIHx8XHJcbiAgICAgICAgICAgIChzb3J0TWFwLnNpemUgPiAwICYmIHNvcnRNYXAuaGFzKGhlYWRlclsxXSkgJiYgaXNTb3J0TWFwRm9ySGVhZGVyMUFjdGl2ZSkgfHxcclxuICAgICAgICAgICAgc2V0LmhhcyhoZWFkZXJbMF0pIHx8XHJcbiAgICAgICAgICAgIHNldC5oYXMoaGVhZGVyWzFdKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgY2xlYXJDb2x1bW5GaWx0ZXIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmRlbGV0ZSh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgICAgICBjb25zdCBhcHBsaWVkRmlsdGVyU2V0OiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQodGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5KTtcclxuICAgICAgICAgICAgYXBwbGllZEZpbHRlclNldC5kZWxldGUodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICAgICAgdGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5ID0gWy4uLmFwcGxpZWRGaWx0ZXJTZXRdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZS5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS5jb2x1bW5Tb3J0U3RhdGUuZGVsZXRlKHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNldE9wdGlvblZhbHVlcyhtaW5WYWx1ZTogbnVtYmVyLCBtYXhWYWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgZmxvb3I6IG1pblZhbHVlLFxyXG4gICAgICAgICAgICBjZWlsOiBtYXhWYWx1ZSxcclxuICAgICAgICAgICAgZGlzYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgICAgIHRyYW5zbGF0ZTogdGhpcy5ub3JtYWxUcmFuc2xhdGVGdW5jdGlvbixcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHBlcmNlbnRUcmFuc2xhdGVGdW5jdGlvbiA9IChkYXRhOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xyXG4gICAgICAgIGNvbnN0IGZvcm1hdE51bWJlciA9IChudW06IG51bWJlcikgPT4gcGFyc2VGbG9hdChudW0udG9GaXhlZCgyKSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKE1hdGguYWJzKGRhdGEpID49IDEwMDApIHtcclxuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkID0gZm9ybWF0TnVtYmVyKE1hdGguYWJzKGRhdGEpIC8gMTAwMCk7XHJcbiAgICAgICAgICAgIHJldHVybiBgJHtkYXRhIDwgMCA/ICctJyA6ICcnfSR7Zm9ybWF0dGVkfWslYDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGAke2Zvcm1hdE51bWJlcihkYXRhKX0lYDtcclxuICAgIH07XHJcbiAgICBcclxuICAgIGN1cnJlbmN5VHJhbnNsYXRlRnVuY3Rpb24gPSAoZGF0YTogbnVtYmVyKTogc3RyaW5nID0+IHtcclxuICAgICAgICBjb25zdCBmb3JtYXROdW1iZXIgPSAobnVtOiBudW1iZXIpID0+IHBhcnNlRmxvYXQobnVtLnRvRml4ZWQoMikpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChNYXRoLmFicyhkYXRhKSA+PSAxMDAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZCA9IGZvcm1hdE51bWJlcihNYXRoLmFicyhkYXRhKSAvIDEwMDApO1xyXG4gICAgICAgICAgICByZXR1cm4gYCR7ZGF0YSA8IDAgPyAnLScgOiAnJ30kJHtmb3JtYXR0ZWR9a2A7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBgJHtkYXRhIDwgMCA/ICctJyA6ICcnfSQke2Zvcm1hdE51bWJlcihNYXRoLmFicyhkYXRhKSl9YDtcclxuICAgIH07XHJcbiAgICBcclxuICAgIG5vcm1hbFRyYW5zbGF0ZUZ1bmN0aW9uID0gKGRhdGE6IG51bWJlcik6IHN0cmluZyA9PiB7XHJcbiAgICAgICAgY29uc3QgZm9ybWF0TnVtYmVyID0gKG51bTogbnVtYmVyKSA9PiBwYXJzZUZsb2F0KG51bS50b0ZpeGVkKDIpKTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAoZGF0YSA+PSAxMDAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBgJHtmb3JtYXROdW1iZXIoZGF0YSAvIDEwMDApfWtgO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZm9ybWF0TnVtYmVyKGRhdGEpLnRvU3RyaW5nKCk7XHJcbiAgICB9O1xyXG5cclxuICAgIGZpbmRVbmlxdWVEYXRlc1dpdGhEYXRhKGRhdGE6IGFueVtdKSB7XHJcbiAgICAgICAgY29uc3QgdW5pcXVlRGF0ZXMgPSB1bmlxKGRhdGEubWFwKCh1KSA9PiB1LmRhdGUpKTtcclxuICAgICAgICBjb25zdCB1bmlxdWVEYXRlc0luTmdiRGF0ZUZvcm1hdDogTmdiRGF0ZVR5cGVbXSA9IFtdO1xyXG4gICAgICAgIHVuaXF1ZURhdGVzLmZvckVhY2goKGRhdGU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICB1bmlxdWVEYXRlc0luTmdiRGF0ZUZvcm1hdC5wdXNoKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydFRvTmdiRGF0ZVN0YW5kYXJkRm9ybWF0KGRheWpzKGRhdGUsIFwiTU0vREQvWVlcIikuZm9ybWF0KFwiTU0vREQvWVlZWVwiKSksXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHVuaXF1ZURhdGVzSW5OZ2JEYXRlRm9ybWF0O1xyXG4gICAgfVxyXG5cclxuICAgIHJlT3JkZXJBcHBsaWVkRmlsdGVyc0FycmF5KGlzSGllcmFyY2hpYWxVc2VyRmlsdGVyZWQ6IGJvb2xlYW4sIGRhdGU/OiBhbnkpIHtcclxuICAgICAgICBsZXQgaXNGaWx0ZXJlZCA9IHRydWU7XHJcbiAgICAgICAgaXNGaWx0ZXJlZCA9IHRoaXMuY2hlY2tJZkRhdGFJc0ZpbHRlcmVkKGlzRmlsdGVyZWQsIGlzSGllcmFyY2hpYWxVc2VyRmlsdGVyZWQsIGRhdGUpO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlT3JDaGFuZ2VMYXRlc3RGaWx0ZXJJbmRleChpc0ZpbHRlcmVkKTtcclxuICAgIH1cclxuXHJcbiAgICBjaGVja0lmRGF0YUlzRmlsdGVyZWQoaXNGaWx0ZXJlZDogYm9vbGVhbiwgaXNIaWVyYXJjaGlhbFVzZXJGaWx0ZXJlZDogYm9vbGVhbiwgZGF0ZT86IGFueSkge1xyXG4gICAgICAgIGxldCBpc0RhdGFGaWx0ZXJlZCA9IGlzRmlsdGVyZWQ7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gXCJ1c2VyXCIgJiYgIXRoaXMudG9vbHRpcE1hcC5oYXMoXCJ1c2VyXCIpKSB7XHJcbiAgICAgICAgICAgIGlzRGF0YUZpbHRlcmVkID0gY2xvbmVEZWVwKGlzSGllcmFyY2hpYWxVc2VyRmlsdGVyZWQpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gXCJTdGFydFRpbWVGb3JGaWx0ZXJcIiB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT09IFwiRW5kVGltZUZvckZpbHRlclwiIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gXCJzdGFydFRpbWVGb3JGaWx0ZXJcIiB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT09IFwiZW5kVGltZUZvckZpbHRlclwiIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gXCJ0aW1lXCIgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09PSBcInRpbWVvdXRUaW1lXCIgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09PSBcIk90aGVyQXZhaWxhYmxlU3BvdHNUYWJsZVN0YXJ0VGltZVwiIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gXCJPdGhlckF2YWlsYWJsZVNwb3RzVGFibGVFbmRUaW1lXCIgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09PSBcInN0YXJ0X3RpbWVfZm9yX2ZpbHRlclwiIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gXCJlbmRfdGltZV9mb3JfZmlsdGVyXCIgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09PSBcInN0YXJ0RW5kVGltZU11bHRpXCJcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgaXNEYXRhRmlsdGVyZWQgPVxyXG4gICAgICAgICAgICAgICAgIWlzRXF1YWwoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyksXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyksXHJcbiAgICAgICAgICAgICAgICApIHx8XHJcbiAgICAgICAgICAgICAgICAhdGhpcy5pbmNsdWRlWmVyb1RpbWUgfHxcclxuICAgICAgICAgICAgICAgICF0aGlzLmluY2x1ZGVNdWx0aVRpbWU7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkUmFkaW8gPT09IFwic3RhcnRFbmRUaW1lXCIgfHwgdGhpcy5zZWxlY3RlZFJhZGlvID09PSBcIlRpbWVCYW5kXCIpIHtcclxuICAgICAgICAgICAgaXNEYXRhRmlsdGVyZWQgPVxyXG4gICAgICAgICAgICAgICAgIWlzRXF1YWwoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyksXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyksXHJcbiAgICAgICAgICAgICAgICApIHx8XHJcbiAgICAgICAgICAgICAgICAhdGhpcy5pbmNsdWRlWmVyb1RpbWUgfHxcclxuICAgICAgICAgICAgICAgICF0aGlzLmluY2x1ZGVNdWx0aVRpbWU7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNsaWRlclNldC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICBpc0RhdGFGaWx0ZXJlZCA9XHJcbiAgICAgICAgICAgICAgICAhaXNFcXVhbChcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKSxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKSxcclxuICAgICAgICAgICAgICAgICkgJiYgIWlzRXF1YWwodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyksIHRoaXMuc2xpZGVyRGF0YSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkUmFkaW8gPT09IFwicG9zdGVkQWR1XCIgJiYgdGhpcy5zdWJSYWRpb0J1dHRvbiA9PT0gXCJub3RSZXF1aXJlZFwiKSB7XHJcbiAgICAgICAgICAgICAgICBpc0RhdGFGaWx0ZXJlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFpc0RhdGFGaWx0ZXJlZCAmJiB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZGVsZXRlKHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT09IFwic3RhcnREYXRlXCIgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09PSBcImVuZERhdGVcIiB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT09IFwicGVyaW9kXCIgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09PSBcIkFpckRhdGVcIiB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT09IFwidGltZW91dERhdGVcIiB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT09IFwiZmxpZ2h0U3RhcnREYXRlXCIgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09PSBcImZsaWdodEVuZERhdGVcIiB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT09IFwiZGF0ZVwiIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gXCJyZXZpc2lvblN0YXJ0RGF0ZVwiIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gXCJHZW5lcmF0ZWRPblwiIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gXCJXZWVrXCIgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09PSBcIkFjdHVhbFdlZWtTdGFydERhdGVcIiB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT09IFwic2NoZWR1bGVkRGF0ZVwiIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gXCJMYXN0RmV0Y2hlZERhdGVcIiB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT09IFwiYWlyRGF0ZVwiIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gXCJzY2hlZHVsZWRXZWVrXCJcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgaXNEYXRhRmlsdGVyZWQgPVxyXG4gICAgICAgICAgICAgICAgIWlzRXF1YWwoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyksXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyksXHJcbiAgICAgICAgICAgICAgICApICYmICFpc0VxdWFsKHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLCB0aGlzLmZsaWdodERhdGVSYW5nZSk7XHJcbiAgICAgICAgICAgIGlmICghaXNEYXRhRmlsdGVyZWQgJiYgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmRlbGV0ZSh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgdG90YWxPcHRpb25zQ291bnQgPSB0aGlzLnRvb2x0aXBNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbykuZmlsdGVyKCh4OiBhbnkpID0+ICF4LmlzSGlkZGVuKS5sZW5ndGg7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9uc0NvdW50ID0gdGhpcy50b29sdGlwTWFwXHJcbiAgICAgICAgICAgICAgICAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbylcclxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKHg6IGFueSkgPT4gIXguaXNIaWRkZW4gJiYgeC5pc1NlbGVjdGVkKS5sZW5ndGg7XHJcbiAgICAgICAgICAgIGlzRGF0YUZpbHRlcmVkID0gc2VsZWN0ZWRPcHRpb25zQ291bnQgPiAwICYmIHNlbGVjdGVkT3B0aW9uc0NvdW50ICE9PSB0b3RhbE9wdGlvbnNDb3VudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGlzRGF0YUZpbHRlcmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZU9yQ2hhbmdlTGF0ZXN0RmlsdGVySW5kZXgoaXNGaWx0ZXJlZDogYm9vbGVhbikge1xyXG4gICAgICAgIGNvbnN0IHNldCA9IG5ldyBTZXQodGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5KTtcclxuXHJcbiAgICAgICAgaWYgKGlzRmlsdGVyZWQgJiYgIXNldC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICBzZXQuYWRkKHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChpc0ZpbHRlcmVkICYmIHNldC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICBzZXQuZGVsZXRlKHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgICAgIHNldC5hZGQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzZXQuZGVsZXRlKHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYXBwbGllZEZpbHRlcnNBcnJheSA9IFsuLi5zZXRdO1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrSWZTb3J0aW5nSXNBcHBsaWVkVGhlblNvcnRUaGVEYXRhKG9yaWdpbmFsRGF0YTogYW55W10pIHtcclxuICAgICAgICBsZXQgc29ydGVkRGF0YSA9IG9yaWdpbmFsRGF0YTtcclxuICAgICAgICBpZiAoIXRoaXMuYW5uYVNvcnRTZXJ2aWNlPy5jb2x1bW5Tb3J0U3RhdGUpIHJldHVybiBzb3J0ZWREYXRhO1xyXG4gICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZS5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gXCJBU0NcIikge1xyXG4gICAgICAgICAgICAgICAgc29ydGVkRGF0YSA9IGNsb25lRGVlcChcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS5zb3J0RGF0YUZvckNvbXBvbmVudE90aGVyVGhhbkx1ckFuZENzclBhZ2UodHJ1ZSwgb3JpZ2luYWxEYXRhLCBrZXkpLFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gXCJERVNDXCIpIHtcclxuICAgICAgICAgICAgICAgIHNvcnRlZERhdGEgPSBjbG9uZURlZXAoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbm5hU29ydFNlcnZpY2Uuc29ydERhdGFGb3JDb21wb25lbnRPdGhlclRoYW5MdXJBbmRDc3JQYWdlKGZhbHNlLCBvcmlnaW5hbERhdGEsIGtleSksXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBzb3J0ZWREYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIGZpbHRlckRhdGEob3JpZ2luYWxEYXRhOiBhbnlbXSwga2V5VG9Ta2lwOiBzdHJpbmcsIGlzTHVyQ3NyUGFnZTogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgbGV0IGZpbHRlcmVkRGF0YSA9IFsuLi5vcmlnaW5hbERhdGFdO1xyXG4gICAgICAgIGlmICghaXNMdXJDc3JQYWdlKSB7XHJcbiAgICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IHRoaXMuY2hlY2tJZlNvcnRpbmdJc0FwcGxpZWRUaGVuU29ydFRoZURhdGEob3JpZ2luYWxEYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZm9yRWFjaCgodmFsdWUsIGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlclNwbGl0ZWRWYWx1ZXM6IGJvb2xlYW4gPSBrZXkuaW5jbHVkZXModGhpcy5TUExJVEVEX0NIRUNLQk9YX0ZJTFRFUl9LRVkpO1xyXG4gICAgICAgICAgICBpZiAoZmlsdGVyU3BsaXRlZFZhbHVlcykge1xyXG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXHJcbiAgICAgICAgICAgICAgICBrZXkgPSBrZXkuc3BsaXQodGhpcy5TUExJVEVEX0NIRUNLQk9YX0ZJTFRFUl9LRVkpWzBdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChrZXkgIT09IGtleVRvU2tpcCAmJiBvcmlnaW5hbERhdGEubGVuZ3RoID4gMCAmJiB0aGlzLm5lc3RlZEtleUV4aXN0cyhvcmlnaW5hbERhdGFbMF0sIGtleSkpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNsaWRlclNldC5oYXMoa2V5KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gb2JqW2tleV0gPj0gdmFsdWUubWluICYmIG9ialtrZXldIDw9IHZhbHVlLm1heCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gXCJzdGFydERhdGVcIiB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gXCJlbmREYXRlXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09IFwiU3RhcnREYXRlXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09IFwiRW5kRGF0ZVwiIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSBcIkFpckRhdGVcIiB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gXCJ0aW1lb3V0RGF0ZVwiIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSBcImZsaWdodFN0YXJ0RGF0ZVwiIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSBcImZsaWdodEVuZERhdGVcIiB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gXCJkYXRlXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09IFwiRGF0ZVwiIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSBcInJldmlzaW9uU3RhcnREYXRlXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09IFwiR2VuZXJhdGVkT25cIiB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gXCJXZWVrXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09IFwiQWN0dWFsV2Vla1N0YXJ0RGF0ZVwiIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSBcIlZpb2xhdGVkU3BvdERhdGVcIiB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gXCJWaW9sYXRpbmdTcG90RGF0ZVwiIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSBcInNjaGVkdWxlZERhdGVcIiB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gXCJMYXN0RmV0Y2hlZERhdGVcIiB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gXCJjcmVhdGVkT25cIiB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gXCJhaXJEYXRlXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09IFwic2NoZWR1bGVkV2Vla1wiXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKChvYmopID0+IHRoaXMuaXNPYmplY3RJblRoZVJhbmdlKG9iaiwgdmFsdWUsIGtleSkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09IFwicGVyaW9kXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKChvYmopID0+IHRoaXMuZ2V0RGF0YUluVGhlRGF0ZVJhbmdlKG9iaiwgdmFsdWUsIGtleSkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09IFwiU3RhcnRUaW1lRm9yRmlsdGVyXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09IFwiRW5kVGltZUZvckZpbHRlclwiIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSBcInRpbWVvdXRUaW1lXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09IFwic3RhcnRUaW1lRm9yRmlsdGVyXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09IFwiZW5kVGltZUZvckZpbHRlclwiIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSBcIlN0YXJ0VGltZVwiIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSBcIkVuZFRpbWVcIiB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gXCJzdGFydF90aW1lX2Zvcl9maWx0ZXJcIiB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gXCJlbmRfdGltZV9mb3JfZmlsdGVyXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09IFwidGltZVwiXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKChvYmopID0+IHRoaXMucmV0dXJuRGF0YUZvckZyb21BbmRUb1RpbWVSYW5nZShvYmosIHZhbHVlLCBrZXkpKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcInN0YXJ0RW5kVGltZU11bHRpXCIgfHwga2V5ID09PSBcInN0YXJ0RW5kVGltZVwiIHx8IGtleSA9PT0gXCJUaW1lQmFuZFwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJldHVybkRhdGFGb3JTdGFydEFuZEVuZFRpbWVSYW5nZShvYmosIHZhbHVlLCBrZXkpLFxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKCh1KSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJTcGxpdGVkVmFsdWVzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHZhbHVlLmZpbmQoKHZhbDogYW55KSA9PiB1W2tleV0uaW5jbHVkZXModmFsKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdmFsdWUuaW5jbHVkZXModGhpcy5nZXRWYWx1ZUZyb21PYmplY3QodSwga2V5KSksXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBmaWx0ZXJlZERhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VmFsdWVGcm9tT2JqZWN0KG9iajogYW55LCBrZXk6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiBrZXkuc3BsaXQoXCIuXCIpLnJlZHVjZSgocmVzLCBjdXJyZW50S2V5KSA9PiByZXMgJiYgcmVzW2N1cnJlbnRLZXldLCBvYmopO1xyXG4gICAgfVxyXG5cclxuICAgIG5lc3RlZEtleUV4aXN0cyhvYmo6IGFueSwga2V5OiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICBrZXkuc3BsaXQoXCIuXCIpLnJlZHVjZSgoYWNjLCBjdXJyZW50S2V5KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYWNjICYmIGN1cnJlbnRLZXkgaW4gYWNjKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjY1tjdXJyZW50S2V5XTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH0sIG9iaikgIT09IHVuZGVmaW5lZFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuT3JkZXJzSW5UaGVSYW5nZShvcmRlcjogYW55LCByYW5nZTogYW55LCBrZXk6IGFueSkge1xyXG4gICAgICAgIGNvbnN0IGlzRGF0ZUJldHdlZW5UaGVTZWxlY3RlZFJhbmdlID0gZGF5anMob3JkZXJba2V5XSkuaXNCZXR3ZWVuKHJhbmdlLm1pblNlbGVjdGVkRGF0ZSwgcmFuZ2UubWF4U2VsZWN0ZWREYXRlKTtcclxuICAgICAgICBjb25zdCBpc0RhdGVTYW1lQXNUaGVNaW5TZWxlY3RlZERhdGUgPSBkYXlqcyhvcmRlcltrZXldKS5pc1NhbWUocmFuZ2UubWluU2VsZWN0ZWREYXRlKTtcclxuICAgICAgICBjb25zdCBpc0RhdGVTYW1lQXNUaGVNYXhTZWxlY3RlZERhdGUgPSBkYXlqcyhvcmRlcltrZXldKS5pc1NhbWUocmFuZ2UubWF4U2VsZWN0ZWREYXRlKTtcclxuICAgICAgICByZXR1cm4gaXNEYXRlQmV0d2VlblRoZVNlbGVjdGVkUmFuZ2UgfHwgaXNEYXRlU2FtZUFzVGhlTWluU2VsZWN0ZWREYXRlIHx8IGlzRGF0ZVNhbWVBc1RoZU1heFNlbGVjdGVkRGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm5EYXRhRm9yVGltZVJhbmdlKG9iajogYW55LCBzZWxlY3RlZERhdGE6IGFueSkge1xyXG4gICAgICAgIGNvbnN0IGZvcm1hdCA9IFwiSEg6bW06c3NcIjtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFN0YXJ0RGF0ZSA9IGRheWpzKHNlbGVjdGVkRGF0YS5zdGFydFRpbWUsIGZvcm1hdCk7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbmREYXRlID0gZGF5anMoc2VsZWN0ZWREYXRhLmVuZFRpbWUsIGZvcm1hdCk7XHJcbiAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gZGF5anMob2JqLnN0YXJ0VGltZSwgZm9ybWF0KTtcclxuICAgICAgICBjb25zdCBlbmRUaW1lID0gZGF5anMob2JqLmVuZFRpbWUsIGZvcm1hdCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGlzU3RhcnRUaW1lU2FtZUFzU2VsZWN0ZWRTdGFydFRpbWUgPSBzdGFydFRpbWUuaXNTYW1lKHNlbGVjdGVkU3RhcnREYXRlKTtcclxuICAgICAgICBjb25zdCBpc1N0YXJ0VGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSA9IHN0YXJ0VGltZS5pc0JldHdlZW4oc2VsZWN0ZWRTdGFydERhdGUsIHNlbGVjdGVkRW5kRGF0ZSk7XHJcbiAgICAgICAgY29uc3QgaXNFbmRUaW1lU2FtZUFzU2VsZWN0ZWRFbmRUaW1lID0gZW5kVGltZS5pc1NhbWUoc2VsZWN0ZWRFbmREYXRlKTtcclxuICAgICAgICBjb25zdCBpc0VuZFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUgPSBlbmRUaW1lLmlzQmV0d2VlbihzZWxlY3RlZFN0YXJ0RGF0ZSwgc2VsZWN0ZWRFbmREYXRlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgKGlzU3RhcnRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lICYmIGlzRW5kVGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSkgfHxcclxuICAgICAgICAgICAgKGlzU3RhcnRUaW1lU2FtZUFzU2VsZWN0ZWRTdGFydFRpbWUgJiYgaXNFbmRUaW1lU2FtZUFzU2VsZWN0ZWRFbmRUaW1lKSB8fFxyXG4gICAgICAgICAgICAoaXNTdGFydFRpbWVTYW1lQXNTZWxlY3RlZFN0YXJ0VGltZSAmJiBpc0VuZFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUpIHx8XHJcbiAgICAgICAgICAgIChpc1N0YXJ0VGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSAmJiBpc0VuZFRpbWVTYW1lQXNTZWxlY3RlZEVuZFRpbWUpXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm5EYXRhRm9yRnJvbUFuZFRvVGltZVJhbmdlKG9iajogYW55LCBzZWxlY3RlZERhdGE6IGFueSwga2V5OiBhbnkpIHtcclxuICAgICAgICBjb25zdCBmb3JtYXQgPSBcIk1NL0REL1lZWVkgSEg6bW06c3NcIjtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZEZyb21UaW1lID0gZGF5anMoYDAxLzAxLzIwMDEgJHtzZWxlY3RlZERhdGEuZnJvbVRpbWV9YCwgZm9ybWF0KTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvVGltZSA9IGRheWpzKGAwMS8wMS8yMDAxICR7c2VsZWN0ZWREYXRhLnRvVGltZX1gLCBmb3JtYXQpO1xyXG4gICAgICAgIGNvbnN0IG9ialRpbWUgPSBvYmpba2V5XTtcclxuXHJcbiAgICAgICAgaWYgKFtcIlwiLCBcIi1cIiwgbnVsbF0uaW5jbHVkZXMob2JqVGltZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc2VsZWN0ZWREYXRhLmluY2x1ZGVNdWx0aSAmJiBvYmpba2V5XSA9PT0gXCI8bXVsdGk+XCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghc2VsZWN0ZWREYXRhLmluY2x1ZGVNdWx0aSAmJiBvYmpba2V5XSA9PT0gXCI8bXVsdGk+XCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc2VsZWN0ZWREYXRhLmluY2x1ZGVaZXJvICYmIG9ialtrZXldID09PSBcIjBcIikge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFzZWxlY3RlZERhdGEuaW5jbHVkZVplcm8gJiYgb2JqW2tleV0gPT09IFwiMFwiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFzZWxlY3RlZERhdGEuaW5jbHVkZVRpbWVSYW5nZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBkYXlqc1RpbWUgPSBkYXlqcyhgMDEvMDEvMjAwMSAke29ialRpbWV9YCwgZm9ybWF0KTtcclxuXHJcbiAgICAgICAgY29uc3QgaXNPYmpUaW1lU2FtZUFzU2VsZWN0ZWRGcm9tVGltZSA9IGRheWpzVGltZS5pc1NhbWUoc2VsZWN0ZWRGcm9tVGltZSk7XHJcbiAgICAgICAgY29uc3QgaXNPYmpUaW1lU2FtZUFzU2VsZWN0ZWRUb1RpbWUgPSBkYXlqc1RpbWUuaXNTYW1lKHNlbGVjdGVkVG9UaW1lKTtcclxuICAgICAgICBjb25zdCBpc09ialRpbWVCZXR3ZWVuU2VsZWN0ZWRGcm9tVGltZUFuZFRvVGltZSA9IGRheWpzVGltZS5pc0JldHdlZW4oc2VsZWN0ZWRGcm9tVGltZSwgc2VsZWN0ZWRUb1RpbWUpO1xyXG5cclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICBpc09ialRpbWVTYW1lQXNTZWxlY3RlZEZyb21UaW1lIHx8XHJcbiAgICAgICAgICAgIGlzT2JqVGltZVNhbWVBc1NlbGVjdGVkVG9UaW1lIHx8XHJcbiAgICAgICAgICAgIGlzT2JqVGltZUJldHdlZW5TZWxlY3RlZEZyb21UaW1lQW5kVG9UaW1lXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm5EYXRhRm9yU3RhcnRBbmRFbmRUaW1lUmFuZ2Uob2JqOiBhbnksIHNlbGVjdGVkRGF0YTogYW55LCBrZXk6IHN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IGZvcm1hdCA9IFwiTU0vREQvWVlZWSBISDptbTpzc1wiO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkRnJvbVRpbWUgPSBkYXlqcyhgMDEvMDEvMjAwMSAke3NlbGVjdGVkRGF0YS5mcm9tVGltZX1gLCBmb3JtYXQpO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkVG9UaW1lID0gZGF5anMoYDAxLzAxLzIwMDEgJHtzZWxlY3RlZERhdGEudG9UaW1lfWAsIGZvcm1hdCk7XHJcblxyXG4gICAgICAgIGlmIChzZWxlY3RlZERhdGEuaW5jbHVkZU11bHRpICYmIG9ialtrZXldWzBdID09PSBcIjxtdWx0aT5cIikge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghc2VsZWN0ZWREYXRhLmluY2x1ZGVNdWx0aSAmJiBvYmpba2V5XVswXSA9PT0gXCI8bXVsdGk+XCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNlbGVjdGVkRGF0YS5pbmNsdWRlWmVybyAmJiBvYmpba2V5XVswXSA9PT0gXCIwXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXNlbGVjdGVkRGF0YS5pbmNsdWRlWmVybyAmJiBvYmpba2V5XVswXSA9PT0gXCIwXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFzZWxlY3RlZERhdGEuaW5jbHVkZVRpbWVSYW5nZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBkYXlqcyhgMDEvMDEvMjAwMSAke29ialtrZXldWzFdfWAsIGZvcm1hdCk7XHJcbiAgICAgICAgY29uc3QgZW5kVGltZSA9IGRheWpzKGAwMS8wMS8yMDAxICR7b2JqW2tleV1bMl19YCwgZm9ybWF0KTtcclxuXHJcbiAgICAgICAgY29uc3QgaXNTdGFydFRpbWVTYW1lQXNTZWxlY3RlZFN0YXJ0VGltZSA9IHN0YXJ0VGltZS5pc1NhbWUoc2VsZWN0ZWRGcm9tVGltZSk7XHJcbiAgICAgICAgY29uc3QgaXNTdGFydFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUgPSBzdGFydFRpbWUuaXNCZXR3ZWVuKHNlbGVjdGVkRnJvbVRpbWUsIHNlbGVjdGVkVG9UaW1lKTtcclxuICAgICAgICBjb25zdCBpc0VuZFRpbWVTYW1lQXNTZWxlY3RlZEVuZFRpbWUgPSBlbmRUaW1lLmlzU2FtZShzZWxlY3RlZFRvVGltZSk7XHJcbiAgICAgICAgY29uc3QgaXNFbmRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lID0gZW5kVGltZS5pc0JldHdlZW4oc2VsZWN0ZWRGcm9tVGltZSwgc2VsZWN0ZWRUb1RpbWUpO1xyXG5cclxuICAgICAgICAvLyBwcmV2aW91cyBjb25kaXRpb24gdG8gYXBwbHkgdGltYmFuZCBmaWx0dGVyXHJcbiAgICAgICAgLy8gcmV0dXJuIChcclxuICAgICAgICAvLyAgICAgKGlzU3RhcnRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lICYmIGlzRW5kVGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSkgfHxcclxuICAgICAgICAvLyAgICAgKGlzU3RhcnRUaW1lU2FtZUFzU2VsZWN0ZWRTdGFydFRpbWUgJiYgaXNFbmRUaW1lU2FtZUFzU2VsZWN0ZWRFbmRUaW1lKSB8fFxyXG4gICAgICAgIC8vICAgICAoaXNTdGFydFRpbWVTYW1lQXNTZWxlY3RlZFN0YXJ0VGltZSAmJiBpc0VuZFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUpIHx8XHJcbiAgICAgICAgLy8gICAgIChpc1N0YXJ0VGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSAmJiBpc0VuZFRpbWVTYW1lQXNTZWxlY3RlZEVuZFRpbWUpXHJcbiAgICAgICAgLy8gKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgaXNTdGFydFRpbWVTYW1lQXNTZWxlY3RlZFN0YXJ0VGltZSB8fFxyXG4gICAgICAgICAgICBpc1N0YXJ0VGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSB8fFxyXG4gICAgICAgICAgICBpc0VuZFRpbWVTYW1lQXNTZWxlY3RlZEVuZFRpbWUgfHxcclxuICAgICAgICAgICAgaXNFbmRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXREYXRhSW5UaGVEYXRlUmFuZ2Uob2JqOiBhbnksIHZhbHVlOiBhbnksIGtleTogYW55KSB7XHJcbiAgICAgICAgbGV0IHBhcnNpbmdGb3JtYXQ6IHN0cmluZztcclxuICAgICAgICBpZiAoa2V5ID09PSBcInBlcmlvZFwiKSB7XHJcbiAgICAgICAgICAgIHBhcnNpbmdGb3JtYXQgPSBcIllZWVktTU0tRERcIjtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGRheWpzU3RhcnREYXRlID0gZGF5anMob2JqLnN0YXJ0RGF0ZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGRheWpzRW5kRGF0ZSA9IGRheWpzKG9iai5lbmREYXRlKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0RGF0ZUlzQmV0d2VlblNlbERhdGUgPSBkYXlqc1N0YXJ0RGF0ZS5pc0JldHdlZW4odmFsdWUuZnJvbURhdGUsIHZhbHVlLnRvRGF0ZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZERhdGVJc0JldHdlZW5TZWxEYXRlID0gZGF5anNFbmREYXRlLmlzQmV0d2Vlbih2YWx1ZS5mcm9tRGF0ZSwgdmFsdWUudG9EYXRlKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0RGF0ZUlzU2FtZUFzU2VsU3RhcnREYXRlID0gdmFsdWUuZnJvbURhdGUuaXNTYW1lKGRheWpzU3RhcnREYXRlKTtcclxuICAgICAgICAgICAgY29uc3QgZW5kRGF0ZUlzU2FtZUFzU2VsRW5kRGF0ZSA9IHZhbHVlLnRvRGF0ZS5pc1NhbWUoZGF5anNFbmREYXRlKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICAoc3RhcnREYXRlSXNCZXR3ZWVuU2VsRGF0ZSB8fCBzdGFydERhdGVJc1NhbWVBc1NlbFN0YXJ0RGF0ZSkgJiZcclxuICAgICAgICAgICAgICAgIChlbmREYXRlSXNCZXR3ZWVuU2VsRGF0ZSB8fCBlbmREYXRlSXNTYW1lQXNTZWxFbmREYXRlKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICAgIGtleSA9PT0gXCJBaXJEYXRlXCIgfHxcclxuICAgICAgICAgICAga2V5ID09PSBcImZsaWdodFN0YXJ0RGF0ZVwiIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gXCJmbGlnaHRFbmREYXRlXCIgfHxcclxuICAgICAgICAgICAga2V5ID09PSBcIldlZWtcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT09IFwiQWN0dWFsV2Vla1N0YXJ0RGF0ZVwiIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gXCJ0aW1lb3V0RGF0ZVwiIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gXCJzY2hlZHVsZWREYXRlXCIgfHxcclxuICAgICAgICAgICAga2V5ID09PSBcImFpckRhdGVcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT09IFwic2NoZWR1bGVkV2Vla1wiXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHBhcnNpbmdGb3JtYXQgPSBcIk1NL0REL1lZWVlcIjtcclxuICAgICAgICAgICAgY29uc3QgZGF0ZUlzQmV0d2VlblNlbERhdGUgPSBkYXlqcyhvYmpba2V5XSwgcGFyc2luZ0Zvcm1hdCkuaXNCZXR3ZWVuKFxyXG4gICAgICAgICAgICAgICAgdmFsdWUubWluU2VsZWN0ZWREYXRlLFxyXG4gICAgICAgICAgICAgICAgdmFsdWUubWF4U2VsZWN0ZWREYXRlLFxyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZGF0ZUlzU2FtZUFzU2VsU3RhcnREYXRlID0gZGF5anMob2JqW2tleV0sIHBhcnNpbmdGb3JtYXQpLmlzU2FtZSh2YWx1ZS5taW5TZWxlY3RlZERhdGUpO1xyXG4gICAgICAgICAgICBjb25zdCBkYXRlSXNTYW1lQXNTZWxFbmREYXRlID0gZGF5anMob2JqW2tleV0sIHBhcnNpbmdGb3JtYXQpLmlzU2FtZSh2YWx1ZS5tYXhTZWxlY3RlZERhdGUpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGRhdGVJc0JldHdlZW5TZWxEYXRlIHx8IGRhdGVJc1NhbWVBc1NlbFN0YXJ0RGF0ZSB8fCBkYXRlSXNTYW1lQXNTZWxFbmREYXRlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbml0aWFsaXplVGltZUZpbHRlckRhdGEoY2xvbmVkRGF0YTogYW55W10sIGtleSA9IFwic3RhcnRFbmRUaW1lXCIpIHtcclxuICAgICAgICBjb25zdCBzdGFydFRpbWVBcnIgPSBtYXAoY2xvbmVkRGF0YSwgXCJzdGFydFRpbWVcIik7XHJcbiAgICAgICAgY29uc3QgZW5kVGltZUFyciA9IG1hcChjbG9uZWREYXRhLCBcImVuZFRpbWVcIik7XHJcblxyXG4gICAgICAgIHN0YXJ0VGltZUFyci5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4gdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2Uuc29ydEJ5VGltZUFzY2VuZGluZyhhLCBiKSk7XHJcblxyXG4gICAgICAgIGVuZFRpbWVBcnIuc29ydCgoYTogYW55LCBiOiBhbnkpID0+IHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLnNvcnRCeVRpbWVEZXNjZW5kaW5nKGEsIGIpKTtcclxuXHJcbiAgICAgICAgY29uc3QgaW5pdGlhbFN0YXJ0RW5kVGltZSA9IHtcclxuICAgICAgICAgICAgc3RhcnRUaW1lOiBzdGFydFRpbWVBcnJbMF0sXHJcbiAgICAgICAgICAgIGVuZFRpbWU6IGVuZFRpbWVBcnJbMF0sXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmluaXRpYWxWYWx1ZU1hcC5zZXQoa2V5LCBpbml0aWFsU3RhcnRFbmRUaW1lKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm5Db2x1bW5GaWx0ZXJTdGF0dXMoZGF0YTogYW55W10sIGhlYWRlck5hbWU6IHN0cmluZyB8IG51bWJlcikge1xyXG4gICAgICAgIGlmIChoZWFkZXJOYW1lID09PSBcInN0YXJ0RW5kVGltZVwiKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRpbWUgPSBkYXRhLm1hcCgodSkgPT4gdVtoZWFkZXJOYW1lXVswXSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHVuaXFUaW1lID0gdW5pcSh0aW1lKTtcclxuICAgICAgICAgICAgcmV0dXJuIHVuaXFUaW1lLmxlbmd0aCA9PT0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiAhKHVuaXEoZGF0YS5tYXAoKHUpID0+IHVbaGVhZGVyTmFtZV0pKS5sZW5ndGggPiAxKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRGaWx0ZXJPcHRpb25zRGF0YShkYXRhOiBhbnlbXSwgY2xvbmVkRGF0YTogYW55W10sIGtleT86IHN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IGFwcGxpZWRGaWx0ZXJTZXQgPSBuZXcgU2V0KHRoaXMuYXBwbGllZEZpbHRlcnNBcnJheSk7XHJcbiAgICAgICAgY29uc3Qga2V5VG9DaGVjayA9IGtleSB8fCB0aGlzLnNlbGVjdGVkUmFkaW87XHJcbiAgICAgICAgaWYgKGFwcGxpZWRGaWx0ZXJTZXQuaGFzKGtleVRvQ2hlY2spKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbHRlckRhdGEoY2xvbmVkRGF0YSwga2V5VG9DaGVjayk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIHJlT3JkZXJBcHBsaWVkRmlsdGVyc1N0YXRlKGNsb25lZERhdGE6IGFueVtdLCB2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgbGV0IGlzRmlsdGVyZWQgPSB0cnVlO1xyXG4gICAgICAgIGlzRmlsdGVyZWQgPSB0aGlzLmNoZWNrSWZGaWx0ZXJJc0FwcGxpZWQoY2xvbmVkRGF0YSwgdmFsdWUpO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlT3JDaGFuZ2VMYXRlc3RGaWx0ZXJJbmRleChpc0ZpbHRlcmVkKTtcclxuICAgICAgICByZXR1cm4gaXNGaWx0ZXJlZDtcclxuICAgIH1cclxuXHJcbiAgICBjaGVja0lmRmlsdGVySXNBcHBsaWVkKGNsb25lZERhdGE6IGFueVtdLCB2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgY29uc3QgaW5pdGlhbFZhbHVlT2ZDb2x1bW4gPSBzb3J0QnkoY2xvbmVkRGF0YS5tYXAoKGl0ZW0pID0+IGl0ZW1bdGhpcy5zZWxlY3RlZFJhZGlvXSkpO1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZU9mQ29sdW1uID0gc29ydEJ5KFxyXG4gICAgICAgICAgICB0aGlzLmFwcGx5RmlsdGVyKGNsb25lZERhdGEsIHZhbHVlKS5tYXAoKGl0ZW0pID0+IGl0ZW1bdGhpcy5zZWxlY3RlZFJhZGlvXSksXHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gIWlzRXF1YWwoaW5pdGlhbFZhbHVlT2ZDb2x1bW4sIGN1cnJlbnRWYWx1ZU9mQ29sdW1uKTtcclxuICAgIH1cclxuXHJcbiAgICBhcHBseUZpbHRlcihkYXRhOiBhbnlbXSwgdmFsdWU6IGFueSkge1xyXG4gICAgICAgIGxldCBmaWx0ZXJlZERhdGEgPSBkYXRhO1xyXG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuc2VsZWN0ZWRSYWRpbztcclxuICAgICAgICBpZiAodGhpcy5zbGlkZXJTZXQuaGFzKGtleSkpIHtcclxuICAgICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PiBvYmpba2V5XSA+PSB2YWx1ZS5taW4gJiYgb2JqW2tleV0gPD0gdmFsdWUubWF4KTtcclxuICAgICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgICAgICBrZXkgPT09IFwic3RhcnREYXRlXCIgfHxcclxuICAgICAgICAgICAga2V5ID09PSBcImVuZERhdGVcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT09IFwiU3RhcnREYXRlXCIgfHxcclxuICAgICAgICAgICAga2V5ID09PSBcIkVuZERhdGVcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT09IFwiQWlyRGF0ZVwiIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gXCJ0aW1lb3V0RGF0ZVwiIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gXCJmbGlnaHRTdGFydERhdGVcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT09IFwiZmxpZ2h0RW5kRGF0ZVwiIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gXCJkYXRlXCIgfHxcclxuICAgICAgICAgICAga2V5ID09PSBcIkRhdGVcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT09IFwicmV2aXNpb25TdGFydERhdGVcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT09IFwiR2VuZXJhdGVkT25cIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT09IFwiV2Vla1wiIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gXCJBY3R1YWxXZWVrU3RhcnREYXRlXCIgfHxcclxuICAgICAgICAgICAga2V5ID09PSBcIlZpb2xhdGVkU3BvdERhdGVcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT09IFwiVmlvbGF0aW5nU3BvdERhdGVcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT09IFwic2NoZWR1bGVkRGF0ZVwiIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gXCJMYXN0RmV0Y2hlZERhdGVcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT09IFwiY3JlYXRlZE9uXCIgfHxcclxuICAgICAgICAgICAga2V5ID09PSBcImFpckRhdGVcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT09IFwic2NoZWR1bGVkV2Vla1wiXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gdGhpcy5pc09iamVjdEluVGhlUmFuZ2Uob2JqLCB2YWx1ZSwga2V5KSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09IFwicGVyaW9kXCIpIHtcclxuICAgICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PiB0aGlzLmdldERhdGFJblRoZURhdGVSYW5nZShvYmosIHZhbHVlLCBrZXkpKTtcclxuICAgICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgICAgICBrZXkgPT09IFwiU3RhcnRUaW1lRm9yRmlsdGVyXCIgfHxcclxuICAgICAgICAgICAga2V5ID09PSBcIkVuZFRpbWVGb3JGaWx0ZXJcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT09IFwidGltZW91dFRpbWVcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT09IFwic3RhcnRUaW1lRm9yRmlsdGVyXCIgfHxcclxuICAgICAgICAgICAga2V5ID09PSBcImVuZFRpbWVGb3JGaWx0ZXJcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT09IFwic3RhcnRfdGltZV9mb3JfZmlsdGVyXCIgfHxcclxuICAgICAgICAgICAga2V5ID09PSBcImVuZF90aW1lX2Zvcl9maWx0ZXJcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT09IFwidGltZVwiIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gXCJTdGFydFRpbWVcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT09IFwiRW5kVGltZVwiIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gXCJPdGhlckF2YWlsYWJsZVNwb3RzVGFibGVTdGFydFRpbWVcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT09IFwiT3RoZXJBdmFpbGFibGVTcG90c1RhYmxlRW5kVGltZVwiXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gdGhpcy5yZXR1cm5EYXRhRm9yRnJvbUFuZFRvVGltZVJhbmdlKG9iaiwgdmFsdWUsIGtleSkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcInN0YXJ0RW5kVGltZU11bHRpXCIgfHwga2V5ID09PSBcInN0YXJ0RW5kVGltZVwiIHx8IGtleSA9PT0gXCJUaW1lQmFuZFwiKSB7XHJcbiAgICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gdGhpcy5yZXR1cm5EYXRhRm9yU3RhcnRBbmRFbmRUaW1lUmFuZ2Uob2JqLCB2YWx1ZSwga2V5KSk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKHUpID0+IHZhbHVlLmluY2x1ZGVzKHVba2V5XSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmlsdGVyZWREYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIGlzT2JqZWN0SW5UaGVSYW5nZShvYmo6IGFueSwgdmFsdWU6IGFueSwga2V5OiBzdHJpbmcpIHtcclxuICAgICAgICBjb25zdCBvYmpWYWwgPSBvYmpba2V5XTtcclxuICAgICAgICBjb25zdCBkYXlqc0RhdGUgPSBkYXlqcyhvYmpWYWwpO1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUuZnJvbURhdGUgPT09IFwic3RyaW5nXCIgJiYgdHlwZW9mIHZhbHVlLnRvRGF0ZSA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICB2YWx1ZS5mcm9tRGF0ZSA9IGRheWpzKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydE5nYkRhdGVUb01vbWVudChcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG9OZ2JEYXRlKHZhbHVlLmZyb21EYXRlLCBcIkREL01NL1lZWVlcIiksXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB2YWx1ZS50b0RhdGUgPSBkYXlqcyhcclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnROZ2JEYXRlVG9Nb21lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydFRvTmdiRGF0ZSh2YWx1ZS50b0RhdGUsIFwiREQvTU0vWVlZWVwiKSxcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGlzRGF0ZVNhbWVBc1N0YXJ0T2ZUaGVSYW5nZSA9IHZhbHVlLmZyb21EYXRlLmlzU2FtZShvYmpWYWwpO1xyXG4gICAgICAgIGNvbnN0IGlzRGF0ZVNhbWVBc0VuZE9mVGhlUmFuZ2UgPSB2YWx1ZS50b0RhdGUuaXNTYW1lKG9ialZhbCk7XHJcbiAgICAgICAgY29uc3QgaXNEYXRlQmV0d2VlblRoZVN0YXJ0QW5kRW5kT2ZSYW5nZSA9IGRheWpzRGF0ZS5pc0JldHdlZW4odmFsdWUuZnJvbURhdGUsIHZhbHVlLnRvRGF0ZSk7XHJcbiAgICAgICAgcmV0dXJuIGlzRGF0ZVNhbWVBc1N0YXJ0T2ZUaGVSYW5nZSB8fCBpc0RhdGVTYW1lQXNFbmRPZlRoZVJhbmdlIHx8IGlzRGF0ZUJldHdlZW5UaGVTdGFydEFuZEVuZE9mUmFuZ2U7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlU3RhdGVPZlRoZUN1cnJlbnRGaWx0ZXJUYWIoc29ydE1hcDogTWFwPHN0cmluZywgU29ydFR5cGU+KSB7XHJcbiAgICAgICAgY29uc3QgYWN0aXZlS2V5ID0gdGhpcy5zZWxlY3RlZFJhZGlvO1xyXG4gICAgICAgIGxldCBrZXlBcnI6IHN0cmluZ1tdID0gW107XHJcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5pc0ZpbHRlclNvcnRBY3RpdmUpLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoa2V5LmluY2x1ZGVzKGFjdGl2ZUtleSkpIHtcclxuICAgICAgICAgICAgICAgIGtleUFyciA9IGtleS5zcGxpdChcIixcIik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzRmlsdGVyU29ydEFjdGl2ZVtrZXldID0gdGhpcy5pc1Rvb2x0aXBBY3RpdmUoa2V5QXJyLCBzb3J0TWFwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZVN0YXRlT2ZBbGxUaGVLZXlzKHNvcnRNYXA6IE1hcDxzdHJpbmcsIFNvcnRUeXBlPikge1xyXG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuaXNGaWx0ZXJTb3J0QWN0aXZlKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICAgICAgY29uc3Qga2V5QXJyID0ga2V5LnNwbGl0KFwiLFwiKTtcclxuICAgICAgICAgICAgdGhpcy5pc0ZpbHRlclNvcnRBY3RpdmVba2V5XSA9IHRoaXMuaXNUb29sdGlwQWN0aXZlKGtleUFyciwgc29ydE1hcCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5jcmVtZW50SG91cih2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgaWYgKHZhbHVlID09PSBcIlwiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgIH0gZWxzZSBpZiAocGFyc2VJbnQodmFsdWUsIDEwKSA8IDEyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludCh2YWx1ZSwgMTApICsgMTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiAxO1xyXG4gICAgfVxyXG5cclxuICAgIGRlY3JlbWVudEhvdXIodmFsdWU6IGFueSkge1xyXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gXCJcIikge1xyXG4gICAgICAgICAgICByZXR1cm4gMTI7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwYXJzZUludCh2YWx1ZSwgMTApID4gMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQodmFsdWUsIDEwKSAtIDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAxMjtcclxuICAgIH1cclxuXHJcbiAgICBpbmNyZW1lbnRNaW51dGUodmFsdWU6IGFueSkge1xyXG4gICAgICAgIC8vIGluY3JlbWVudCB0byBuZWFyZXN0IHByb3BlciBpbnRlcnZhbCgxNSwzMCw0NSlcclxuICAgICAgICBjb25zdCBtaW51dGUgPSBwYXJzZUludCh2YWx1ZSwgMTApO1xyXG4gICAgICAgIGlmIChtaW51dGUgPD0gMTQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFwiMTVcIjtcclxuICAgICAgICB9IGVsc2UgaWYgKG1pbnV0ZSA+PSAxNSAmJiBtaW51dGUgPD0gMjkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFwiMzBcIjtcclxuICAgICAgICB9IGVsc2UgaWYgKG1pbnV0ZSA+PSAzMCAmJiBtaW51dGUgPD0gNDQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFwiNDVcIjtcclxuICAgICAgICB9IGVsc2UgaWYgKG1pbnV0ZSA+PSA0NSkge1xyXG4gICAgICAgICAgICByZXR1cm4gXCIwMFwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgZGVjcmVtZW50TWludXRlKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICBjb25zdCBtaW51dGUgPSBwYXJzZUludCh2YWx1ZSwgMTApO1xyXG4gICAgICAgIGlmIChtaW51dGUgPiAwICYmIG1pbnV0ZSA8PSAxNSkge1xyXG4gICAgICAgICAgICByZXR1cm4gXCIwMFwiO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobWludXRlID49IDE2ICYmIG1pbnV0ZSA8PSAzMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gXCIxNVwiO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobWludXRlID49IDMxICYmIG1pbnV0ZSA8PSA0NSkge1xyXG4gICAgICAgICAgICByZXR1cm4gXCIzMFwiO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobWludXRlID4gNDUgfHwgbWludXRlID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBcIjQ1XCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Q2hlY2tib3ggbWV0aG9kPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vXHJcblxyXG4gICAgZGlzYWJsZUFjdGl2ZUZpbHRlckNsZWFyQnV0dG9uKCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkRmlsdGVyU2V0ID0gbmV3IFNldCh0aGlzLmFwcGxpZWRGaWx0ZXJzQXJyYXkpO1xyXG5cclxuICAgICAgICBjb25zdCBjdXJyZW50Q29sdW1uU29ydEZpbHRlciA9IHRoaXMuZ2V0Q29sdW1uU29ydFN0YXRlRm9yU2VsZWN0ZWRSYWRpbygpO1xyXG4gICAgICAgIGNvbnN0IGlzU29ydFByZXNlbnQgPVxyXG4gICAgICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS5jb2x1bW5Tb3J0U3RhdGUgJiZcclxuICAgICAgICAgICAgdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlLnNpemUgPiAwICYmXHJcbiAgICAgICAgICAgIGN1cnJlbnRDb2x1bW5Tb3J0RmlsdGVyICE9PSBTb3J0VHlwZUVudW0uREVGQVVMVDtcclxuXHJcbiAgICAgICAgcmV0dXJuICEoc2VsZWN0ZWRGaWx0ZXJTZXQuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykgfHwgaXNTb3J0UHJlc2VudCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q29sdW1uU29ydFN0YXRlRm9yU2VsZWN0ZWRSYWRpbygpOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCBjdXJyZW50Q29sdW1uU29ydEZpbHRlciA9XHJcbiAgICAgICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZSAmJlxyXG4gICAgICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS5jb2x1bW5Tb3J0U3RhdGUuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykgJiZcclxuICAgICAgICAgICAgdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgIGN1cnJlbnRDb2x1bW5Tb3J0RmlsdGVyID0gY3VycmVudENvbHVtblNvcnRGaWx0ZXIgfHwgU29ydFR5cGVFbnVtLkRFRkFVTFQ7XHJcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRDb2x1bW5Tb3J0RmlsdGVyO1xyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZUxpc3RGb3JDaGVja2JveEZpbHRlcihcclxuICAgICAgICBoZWFkZXI6IHN0cmluZyxcclxuICAgICAgICBvcHRpb25EYXRhOiBhbnlbXSxcclxuICAgICAgICBzaG93U3BsaXRlZE9wdGlvbnM6IGJvb2xlYW4gPSBmYWxzZSxcclxuICAgICAgICBzcGxpdERlbGltaXRlcjogc3RyaW5nID0gdGhpcy5ERUZBVUxUX1NQTElUX1NFUEFSQVRPUixcclxuICAgICkge1xyXG4gICAgICAgIGNvbnN0IHRvb2x0aXBPcHRpb25zID0gdGhpcy5nZXRUb29sdGlwTW9kZWxGcm9tT3B0aW9uRGF0YShcclxuICAgICAgICAgICAgb3B0aW9uRGF0YSxcclxuICAgICAgICAgICAgaGVhZGVyLFxyXG4gICAgICAgICAgICBzaG93U3BsaXRlZE9wdGlvbnMsXHJcbiAgICAgICAgICAgIHNwbGl0RGVsaW1pdGVyLFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHRoaXMuc2VsZWN0VW5zZWxlY3RMaXN0Q2hlY2tib3godG9vbHRpcE9wdGlvbnMsIGhlYWRlcik7XHJcbiAgICAgICAgdGhpcy5mb3JtYXROdWxsT3B0aW9uVG9TcGVjaWZpZWRTdHJpbmcodG9vbHRpcE9wdGlvbnMsIHRoaXMubnVsbFRvQmVGb3JtYXRlZEludG9TdHJpbmcpO1xyXG5cclxuICAgICAgICByZXR1cm4gdG9vbHRpcE9wdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VG9vbHRpcE1vZGVsRnJvbU9wdGlvbkRhdGEoXHJcbiAgICAgICAgb3B0aW9uRGF0YTogYW55W10sXHJcbiAgICAgICAgaGVhZGVyOiBzdHJpbmcsXHJcbiAgICAgICAgc2hvd1NwbGl0ZWRPcHRpb25zOiBib29sZWFuID0gZmFsc2UsXHJcbiAgICAgICAgc3BsaXREZWxpbWl0ZXI6IHN0cmluZyA9IHRoaXMuREVGQVVMVF9TUExJVF9TRVBBUkFUT1IsXHJcbiAgICApIHtcclxuICAgICAgICBsZXQgdW5pcU9wdGlvbkRhdGEgPSBbXTtcclxuICAgICAgICBpZiAoc2hvd1NwbGl0ZWRPcHRpb25zKSB7XHJcbiAgICAgICAgICAgIGxldCBzcGxpdHRlZE9wdGlvbnM6IHN0cmluZ1tdID0gW107XHJcbiAgICAgICAgICAgIG9wdGlvbkRhdGEuZm9yRWFjaCgob3B0aW9uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBzcGxpdHRlZE9wdGlvbnMgPSBbLi4uc3BsaXR0ZWRPcHRpb25zLCAuLi5vcHRpb25baGVhZGVyXS5zcGxpdChzcGxpdERlbGltaXRlcildO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdW5pcU9wdGlvbkRhdGEgPSB1bmlxKHNwbGl0dGVkT3B0aW9ucyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdW5pcU9wdGlvbkRhdGEgPSB1bmlxKG9wdGlvbkRhdGEubWFwKChpdGVtKSA9PiBpdGVtW2hlYWRlcl0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHVuaXFPcHRpb25EYXRhLm1hcCgoaXRlbSwgaW5kZXgpID0+IG5ldyBUb29sdGlwTW9kZWwoaXRlbSwgaW5kZXggKyAxKSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2VsZWN0VW5zZWxlY3RMaXN0Q2hlY2tib3godG9vbHRpcE9wdGlvbnM6IFRvb2x0aXBNb2RlbFtdLCBoZWFkZXI6IHN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IHRvb2x0aXBTZWxlY3RlZE1hcFdpdGhPcmlnaW5hbEtleXMgPSBuZXcgTWFwKCk7XHJcbiAgICAgICAgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xyXG4gICAgICAgICAgICB0b29sdGlwU2VsZWN0ZWRNYXBXaXRoT3JpZ2luYWxLZXlzLnNldChrZXkuc3BsaXQodGhpcy5TUExJVEVEX0NIRUNLQk9YX0ZJTFRFUl9LRVkpWzBdLCB2YWx1ZSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmICh0b29sdGlwU2VsZWN0ZWRNYXBXaXRoT3JpZ2luYWxLZXlzLmhhcyhoZWFkZXIpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkVmFsdWVTZXQgPSBuZXcgU2V0KHRvb2x0aXBTZWxlY3RlZE1hcFdpdGhPcmlnaW5hbEtleXMuZ2V0KGhlYWRlcikpO1xyXG4gICAgICAgICAgICB0b29sdGlwT3B0aW9ucy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpdGVtLmlzU2VsZWN0ZWQgPSBzZWxlY3RlZFZhbHVlU2V0LmhhcyhpdGVtLnZhbHVlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdG9vbHRpcE9wdGlvbnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaXRlbS5pc1NlbGVjdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZvcm1hdE51bGxPcHRpb25Ub1NwZWNpZmllZFN0cmluZyh0b29sdGlwT3B0aW9uczogVG9vbHRpcE1vZGVsW10sIGZvcm1hdHRlZFN0cmluZzogc3RyaW5nKSB7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSB0b29sdGlwT3B0aW9ucy5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0udmFsdWUgPT0gbnVsbCk7XHJcblxyXG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgdG9vbHRpcE9wdGlvbnNbaW5kZXhdLmxhYmVsID0gZm9ybWF0dGVkU3RyaW5nO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRDbG9uZWRUb29sdGlwQW5kVG9vbHRpcE9wdGlvbih0b29sdGlwT3B0aW9uczogVG9vbHRpcE1vZGVsW10sIHNvcnRCeVN0cmluZzogc3RyaW5nKSB7XHJcbiAgICAgICAgY29uc3QgW3NlbGVjdGVkSXRlbXMsIHVuc2VsZWN0ZWRJdGVtc10gPSB0aGlzLmdldFNlbGVjdGVkQW5kVW5zZWxlY3RlZEl0ZW1zKHRvb2x0aXBPcHRpb25zKTtcclxuICAgICAgICBjb25zdCBzb3J0ZWRTZWxlY3RlZEl0ZW1zID0gc29ydEJ5KHNlbGVjdGVkSXRlbXMsIHNvcnRCeVN0cmluZyk7XHJcbiAgICAgICAgY29uc3Qgc29ydGVkVW5zZWxlY3RlZEl0ZW1zID0gc29ydEJ5KHVuc2VsZWN0ZWRJdGVtcywgc29ydEJ5U3RyaW5nKTtcclxuXHJcbiAgICAgICAgY29uc3QgY2xvbmVkVG9vbHRpcE9wdGlvbnMgPSBbLi4uc29ydGVkU2VsZWN0ZWRJdGVtcywgLi4uc29ydGVkVW5zZWxlY3RlZEl0ZW1zXTtcclxuICAgICAgICBjb25zdCB1cGRhdGVkVG9vbHRpcE9wdGlvbnMgPSBjbG9uZURlZXAoY2xvbmVkVG9vbHRpcE9wdGlvbnMpO1xyXG5cclxuICAgICAgICByZXR1cm4gW2Nsb25lZFRvb2x0aXBPcHRpb25zLCB1cGRhdGVkVG9vbHRpcE9wdGlvbnMsIHNlbGVjdGVkSXRlbXMsIHVuc2VsZWN0ZWRJdGVtc107XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0SGVpZ2h0T2ZDaGVja2JveFRvb2x0aXBGaWx0ZXIoZGF0YUxlbmd0aDogbnVtYmVyLCBtYXJnaW46IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiBkYXRhTGVuZ3RoID4gNiA/IDE4MCA6IDIyLjMxICogZGF0YUxlbmd0aCArIG1hcmdpbiAqIGRhdGFMZW5ndGggKyBtYXJnaW47XHJcbiAgICB9XHJcblxyXG4gICAgdW5DaGVja0FsbENoZWNrYm94KHRvb2x0aXBPcHRpb25zOiBUb29sdGlwTW9kZWxbXSwgY2xvbmVkVG9vbHRpcE9wdGlvbnM6IFRvb2x0aXBNb2RlbFtdKSB7XHJcbiAgICAgICAgdG9vbHRpcE9wdGlvbnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICBpdGVtLmlzU2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBjbG9uZWRUb29sdGlwT3B0aW9ucy5maW5kSW5kZXgoKG9wdCkgPT4gb3B0LmlkID09PSBpdGVtLmlkKTtcclxuICAgICAgICAgICAgY2xvbmVkVG9vbHRpcE9wdGlvbnNbaW5kZXhdLmlzU2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3RBbGxDaGVja2JveCh0b29sdGlwT3B0aW9uczogVG9vbHRpcE1vZGVsW10sIGNsb25lZFRvb2x0aXBPcHRpb25zOiBUb29sdGlwTW9kZWxbXSkge1xyXG4gICAgICAgIHRvb2x0aXBPcHRpb25zLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgaXRlbS5pc1NlbGVjdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBjbG9uZWRUb29sdGlwT3B0aW9ucy5maW5kSW5kZXgoKG9wdCkgPT4gb3B0LmlkID09PSBpdGVtLmlkKTtcclxuICAgICAgICAgICAgY2xvbmVkVG9vbHRpcE9wdGlvbnNbaW5kZXhdLmlzU2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdFVuc2VsZWN0Q2hlY2tib3goZGF0YTogVG9vbHRpcE1vZGVsLCBjbG9uZWRUb29sdGlwT3B0aW9uczogVG9vbHRpcE1vZGVsW10pIHtcclxuICAgICAgICBkYXRhLmlzU2VsZWN0ZWQgPSAhZGF0YS5pc1NlbGVjdGVkO1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gY2xvbmVkVG9vbHRpcE9wdGlvbnMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLmlkID09PSBkYXRhLmlkKTtcclxuICAgICAgICBjbG9uZWRUb29sdGlwT3B0aW9uc1tpbmRleF0uaXNTZWxlY3RlZCA9IGRhdGEuaXNTZWxlY3RlZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRTZWxlY3RlZEFuZFVuc2VsZWN0ZWRJdGVtcyh0b29sdGlwT3B0aW9uczogVG9vbHRpcE1vZGVsW10pIHtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZW1zID0gdG9vbHRpcE9wdGlvbnMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmlzU2VsZWN0ZWQpO1xyXG4gICAgICAgIGNvbnN0IHVuc2VsZWN0ZWRJdGVtcyA9IHRvb2x0aXBPcHRpb25zLmZpbHRlcigoaXRlbSkgPT4gIWl0ZW0uaXNTZWxlY3RlZCk7XHJcblxyXG4gICAgICAgIHJldHVybiBbc2VsZWN0ZWRJdGVtcywgdW5zZWxlY3RlZEl0ZW1zXTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDaGVja2JveFByZXZpb3VzU2VsZWN0ZWRWYWx1ZShjbG9uZWRUYWJsZURhdGE6IGFueVtdKSB7XHJcbiAgICAgICAgbGV0IHByZXZpb3VzU2VsZWN0ZWRWYWx1ZSA9IFtdO1xyXG5cclxuICAgICAgICBpZiAodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgcHJldmlvdXNTZWxlY3RlZFZhbHVlID0gdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaW5pdGlhbFZhbHVlTWFwLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbml0aWFsVmFsdWUgPSBzb3J0QnkodW5pcShjbG9uZWRUYWJsZURhdGEubWFwKChpdGVtKSA9PiBpdGVtW3RoaXMuc2VsZWN0ZWRSYWRpb10pKSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxWYWx1ZU1hcC5zZXQodGhpcy5zZWxlY3RlZFJhZGlvLCBpbml0aWFsVmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmluaXRpYWxWYWx1ZU1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkVmFsdWUgPSB0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkVmFsdWUgPSBzb3J0QnkodW5pcShjbG9uZWRUYWJsZURhdGEubWFwKChpdGVtKSA9PiBpdGVtW3RoaXMuc2VsZWN0ZWRSYWRpb10pKSk7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLnNldCh0aGlzLnNlbGVjdGVkUmFkaW8sIHByZXZpb3VzU2VsZWN0ZWRWYWx1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcHJldmlvdXNTZWxlY3RlZFZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldENoZWNrYm94Q3VycmVudFNlbGVjdGVkVmFsdWUoc2VhcmNoZWRTdHJpbmc6IHN0cmluZywgdG9vbHRpcE9wdGlvbnM6IFRvb2x0aXBNb2RlbFtdKSB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnRTZWxlY3RlZFZhbHVlID0gW107XHJcblxyXG4gICAgICAgIGlmICh0b29sdGlwT3B0aW9ucykge1xyXG4gICAgICAgICAgICBjdXJyZW50U2VsZWN0ZWRWYWx1ZSA9IHNvcnRCeSh0b29sdGlwT3B0aW9ucy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uaXNTZWxlY3RlZCkubWFwKChpdGVtKSA9PiBpdGVtLnZhbHVlKSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAhc2VhcmNoZWRTdHJpbmcgJiZcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRTZWxlY3RlZFZhbHVlLmxlbmd0aCA9PT0gdG9vbHRpcE9wdGlvbnMubGVuZ3RoICYmXHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxWYWx1ZU1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRTZWxlY3RlZFZhbHVlID0gdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGJsYW5rSW5kZXggPSBjdXJyZW50U2VsZWN0ZWRWYWx1ZS5maW5kSW5kZXgoKGl0ZW06IHN0cmluZykgPT4gaXRlbSA9PSBudWxsKTtcclxuICAgICAgICBpZiAoYmxhbmtJbmRleCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgY3VycmVudFNlbGVjdGVkVmFsdWUgPSBzb3J0QnkoY3VycmVudFNlbGVjdGVkVmFsdWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRTZWxlY3RlZFZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrSWZTb3J0aW5nQ2hhbmdlZCh0ZW1wU29ydE9yZGVyOiBTb3J0VHlwZSkge1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRDb2x1bW5Tb3J0RmlsdGVyID0gdGhpcy5nZXRDb2x1bW5Tb3J0U3RhdGVGb3JTZWxlY3RlZFJhZGlvKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGlzU29ydENoYW5nZWQgPSB0ZW1wU29ydE9yZGVyICE9IG51bGwgJiYgdGVtcFNvcnRPcmRlciAhPT0gY3VycmVudENvbHVtblNvcnRGaWx0ZXI7XHJcbiAgICAgICAgcmV0dXJuIGlzU29ydENoYW5nZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RmlsdGVyZWRPcHRpb25Bc0JvbGRTdHJpbmcoc3RyOiBzdHJpbmcsIGNsb25lZFRvb2x0aXBPcHRpb25zOiBUb29sdGlwTW9kZWxbXSkge1xyXG4gICAgICAgIGNvbnN0IHRvb2x0aXBPcHRpb25zID0gY2xvbmVEZWVwKFxyXG4gICAgICAgICAgICBjbG9uZWRUb29sdGlwT3B0aW9ucy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0ubGFiZWwudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHN0ci50b0xvd2VyQ2FzZSgpKSksXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0b29sdGlwT3B0aW9ucy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGVsZW1lbnQubGFiZWwgPSB0aGlzLmJvbGRTdHJpbmcoZWxlbWVudC5sYWJlbCwgc3RyKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRvb2x0aXBPcHRpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIGJvbGRTdHJpbmcoc3RyOiBzdHJpbmcsIGZpbmQ6IHN0cmluZykge1xyXG4gICAgICAgIGxldCB1cGRhdGVkU3RyaW5nID0gc3RyO1xyXG4gICAgICAgIGNvbnN0IGZpbmRTdHJpbmcgPSBmaW5kLnJlcGxhY2UoXCI8XCIsIFwiJmx0O1wiKS5yZXBsYWNlKFwiPlwiLCBcIiZndDtcIik7XHJcbiAgICAgICAgdXBkYXRlZFN0cmluZyA9IHVwZGF0ZWRTdHJpbmcucmVwbGFjZShcIjxcIiwgXCImbHQ7XCIpLnJlcGxhY2UoXCI+XCIsIFwiJmd0O1wiKTtcclxuICAgICAgICBjb25zdCBpbmRleGVzID0gdGhpcy5nZXRJbmRpY2VzT2YoZmluZFN0cmluZywgdXBkYXRlZFN0cmluZywgZmFsc2UpO1xyXG5cclxuICAgICAgICBpbmRleGVzLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBpdGVtICsgaW5kZXggKiA3OyAvLyBNdWx0aXBseWluZyBieSA3IGFzIHRoZXJlIGFyZSA3Y2hhcjogPGI+PC9iPlxyXG4gICAgICAgICAgICBjb25zdCBlbmRJbmRleCA9IHN0YXJ0SW5kZXggKyBmaW5kU3RyaW5nLmxlbmd0aDtcclxuICAgICAgICAgICAgY29uc3Qgc3RyVG9CZVJlcGxhY2VkID0gdXBkYXRlZFN0cmluZy5zdWJzdHJpbmcoc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xyXG4gICAgICAgICAgICB1cGRhdGVkU3RyaW5nID0gdXBkYXRlZFN0cmluZy5yZXBsYWNlKHN0clRvQmVSZXBsYWNlZCwgYDxiPiR7c3RyVG9CZVJlcGxhY2VkfTwvYj5gKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gdXBkYXRlZFN0cmluZztcclxuICAgIH1cclxuXHJcbiAgICBnZXRJbmRpY2VzT2Yoc2VhcmNoU3RyOiBzdHJpbmcsIHN0cjogc3RyaW5nLCBjYXNlU2Vuc2l0aXZlOiBib29sZWFuKSB7XHJcbiAgICAgICAgY29uc3Qgc2VhcmNoU3RyTGVuID0gc2VhcmNoU3RyLmxlbmd0aDtcclxuICAgICAgICBpZiAoc2VhcmNoU3RyTGVuID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSAwO1xyXG4gICAgICAgIGxldCBpbmRleDtcclxuICAgICAgICBjb25zdCBpbmRpY2VzID0gW107XHJcbiAgICAgICAgbGV0IHVwZGF0ZWRTdHIgPSBzdHI7XHJcbiAgICAgICAgbGV0IHVwZGF0ZWRTZWFyY2hTdHIgPSBzZWFyY2hTdHI7XHJcbiAgICAgICAgaWYgKCFjYXNlU2Vuc2l0aXZlKSB7XHJcbiAgICAgICAgICAgIHVwZGF0ZWRTdHIgPSBzdHIudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgdXBkYXRlZFNlYXJjaFN0ciA9IHNlYXJjaFN0ci50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaW5kZXggPSB1cGRhdGVkU3RyLmluZGV4T2YodXBkYXRlZFNlYXJjaFN0ciwgc3RhcnRJbmRleCk7XHJcbiAgICAgICAgd2hpbGUgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICAgICAgaW5kaWNlcy5wdXNoKGluZGV4KTtcclxuICAgICAgICAgICAgc3RhcnRJbmRleCA9IGluZGV4ICsgc2VhcmNoU3RyTGVuO1xyXG4gICAgICAgICAgICBpbmRleCA9IHVwZGF0ZWRTdHIuaW5kZXhPZih1cGRhdGVkU2VhcmNoU3RyLCBzdGFydEluZGV4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGluZGljZXM7XHJcbiAgICB9XHJcblxyXG4gICAgZGlzYWJsZUFsbEJ0bnNXaGVuVGhlcmVBcmVOb0ZpbHRlcmVkUmVzdWx0cygpOiBbbnVtYmVyLCBib29sZWFuLCBib29sZWFuLCBib29sZWFuXSB7XHJcbiAgICAgICAgLy8gW3NlbGVjdGVkQ2hlY2tib3hPcHRpb25zQ291bnQsIGRpc2FibGVDaGVja2JveEFwcGx5LCBkaXNhYmxlQ2xlYXJBbGwsIGRpc2FibGVTZWxlY3RBbGxdO1xyXG4gICAgICAgIHJldHVybiBbMCwgdHJ1ZSwgdHJ1ZSwgdHJ1ZV07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PUNhbGVuZGFyIGZpbHRlcj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly9cclxuICAgIGNyZWF0ZVJhbmdlRm9yVGhlRGF0ZUZpbHRlcihvcHRpb25EYXRhOiBhbnlbXSkge1xyXG4gICAgICAgIGxldCBtaW5NYXhEYXRlO1xyXG4gICAgICAgIC8vIFdoZW4geW91IHdhbnQgdG8gdXNlIHN0YXJ0RGF0ZSBhbmQgZW5kRGF0ZSBjb21iaW5lZCBhcyBzaW5nbGUgY29sdW1uIHRoZW4gdXNlIFBlcmlvZC5cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gXCJwZXJpb2RcIiB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT09IFwiYnV5ZXJGbGlnaHREYXRlc1wiIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gXCJ0cmFmZmljRmxpZ2h0RGF0ZXNcIlxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBtaW5NYXhEYXRlID0gdGhpcy5jcmVhdGVTdGFydEVuZERhdGVSYW5nZShvcHRpb25EYXRhKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBtaW5NYXhEYXRlID0gdGhpcy5yZXR1cm5NaW5BbmRNYXhEYXRlKG9wdGlvbkRhdGEsIHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbWluTWF4RGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICBjcmVhdGVTdGFydEVuZERhdGVSYW5nZShvcHRpb25EYXRhOiBhbnlbXSkge1xyXG4gICAgICAgIGNvbnN0IG1pblN0YXJ0RGF0ZSA9IHRoaXMucmV0dXJuTWluQW5kTWF4RGF0ZShvcHRpb25EYXRhLCBcInN0YXJ0RGF0ZVwiKTtcclxuICAgICAgICBjb25zdCBtYXhFbmREYXRlID0gdGhpcy5yZXR1cm5NaW5BbmRNYXhEYXRlKG9wdGlvbkRhdGEsIFwiZW5kRGF0ZVwiKTtcclxuICAgICAgICByZXR1cm4gW21pblN0YXJ0RGF0ZVswXSwgbWF4RW5kRGF0ZVsxXV07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TWluQW5kTWF4RGF0ZVJhbmdlRm9yQ2FsZW5kYXIobWluTWF4RGF0ZTogYW55W10sIHBhcnNpbmdGb3JtYXQ6IHN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IGNhbGVuZGFyTWluRW5hYmxlZERhdGUgPSB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG9OZ2JEYXRlKG1pbk1heERhdGVbMF0sIHBhcnNpbmdGb3JtYXQpO1xyXG4gICAgICAgIGNvbnN0IGNhbGVuZGFyTWF4RW5hYmxlZERhdGUgPSB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG9OZ2JEYXRlKG1pbk1heERhdGVbMV0sIHBhcnNpbmdGb3JtYXQpO1xyXG4gICAgICAgIHJldHVybiBbY2FsZW5kYXJNaW5FbmFibGVkRGF0ZSwgY2FsZW5kYXJNYXhFbmFibGVkRGF0ZV07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U2VsZWN0ZWREYXRlRm9yQ2FsZW5kYXIobWluTWF4RGF0ZTogYW55W10sIHBhcnNpbmdGb3JtYXQ6IHN0cmluZywgbWluRGF0ZTogTmdiRGF0ZVR5cGUsIG1heERhdGU6IE5nYkRhdGVUeXBlKSB7XHJcbiAgICAgICAgbGV0IHNlbGVjdGVkTWluRGF0ZTtcclxuICAgICAgICBsZXQgc2VsZWN0ZWRNYXhEYXRlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWREYXRlT2JqID0gdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWREYXRlT2JqLmZyb21EYXRlLmlzQWZ0ZXIobWluTWF4RGF0ZVswXSkpIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkTWluRGF0ZSA9IHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb05nYkRhdGUoc2VsZWN0ZWREYXRlT2JqLmZyb21EYXRlLCBwYXJzaW5nRm9ybWF0KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkTWluRGF0ZSA9IHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb05nYkRhdGUobWluTWF4RGF0ZVswXSwgcGFyc2luZ0Zvcm1hdCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZERhdGVPYmoudG9EYXRlLmlzQWZ0ZXIobWluTWF4RGF0ZVsxXSkpIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkTWF4RGF0ZSA9IHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb05nYkRhdGUobWluTWF4RGF0ZVsxXSwgcGFyc2luZ0Zvcm1hdCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZE1heERhdGUgPSB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG9OZ2JEYXRlKHNlbGVjdGVkRGF0ZU9iai50b0RhdGUsIHBhcnNpbmdGb3JtYXQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc2VsZWN0ZWRNaW5EYXRlID0gY2xvbmVEZWVwKG1pbkRhdGUpO1xyXG4gICAgICAgICAgICBzZWxlY3RlZE1heERhdGUgPSBjbG9uZURlZXAobWF4RGF0ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gW3NlbGVjdGVkTWluRGF0ZSwgc2VsZWN0ZWRNYXhEYXRlXTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQcmV2aW91c1NlbGVjdGVkRGF0ZXNGb3JDYWxlbmRhcihvcHRpb25EYXRhOiBhbnlbXSkge1xyXG4gICAgICAgIGxldCBwcmV2aW91c1NlbGVjdGVkRGF0ZTogeyBmcm9tRGF0ZTogYW55OyB0b0RhdGU6IGFueSB9ID0geyBmcm9tRGF0ZTogbnVsbCwgdG9EYXRlOiBudWxsIH07XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkRGF0ZSA9IHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxWYWx1ZU1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRJbml0aWFsVmFsdWVNYXBGb3JEYXRlRmlsdGVyKG9wdGlvbkRhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmluaXRpYWxWYWx1ZU1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkRGF0ZSA9IHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0SW5pdGlhbFZhbHVlTWFwRm9yRGF0ZUZpbHRlcihvcHRpb25EYXRhKTtcclxuICAgICAgICAgICAgcHJldmlvdXNTZWxlY3RlZERhdGUgPSB0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBwcmV2aW91c1NlbGVjdGVkRGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRJbml0aWFsVmFsdWVNYXBGb3JEYXRlRmlsdGVyKG9wdGlvbkRhdGE6IGFueVtdKSB7XHJcbiAgICAgICAgY29uc3QgbWluTWF4RGF0ZSA9IHRoaXMuY3JlYXRlUmFuZ2VGb3JUaGVEYXRlRmlsdGVyKG9wdGlvbkRhdGEpO1xyXG5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZERhdGUgPSB7IGZyb21EYXRlOiBtaW5NYXhEYXRlWzBdLCB0b0RhdGU6IG1pbk1heERhdGVbMV0gfTtcclxuICAgICAgICB0aGlzLmluaXRpYWxWYWx1ZU1hcC5zZXQodGhpcy5zZWxlY3RlZFJhZGlvLCBzZWxlY3RlZERhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEN1cnJlbnRTZWxlY3RlZERhdGVzRm9yQ2FsZW5kYXIoY3VycmVudFNlbGVjdGVkRGF0ZTogYW55LCBtaW5EYXRlOiBOZ2JEYXRlVHlwZSwgbWF4RGF0ZTogTmdiRGF0ZVR5cGUpIHtcclxuICAgICAgICBsZXQgY3VycmVudFNlbGVjdGVkRGF0ZVRvQmVVcGRhdGVkID0gY3VycmVudFNlbGVjdGVkRGF0ZTtcclxuICAgICAgICBjb25zdCBmcm9tRGF0ZSA9IHtcclxuICAgICAgICAgICAgeWVhcjogY3VycmVudFNlbGVjdGVkRGF0ZVRvQmVVcGRhdGVkLmZyb21EYXRlLnllYXIsXHJcbiAgICAgICAgICAgIG1vbnRoOiBjdXJyZW50U2VsZWN0ZWREYXRlVG9CZVVwZGF0ZWQuZnJvbURhdGUubW9udGgsXHJcbiAgICAgICAgICAgIGRheTogY3VycmVudFNlbGVjdGVkRGF0ZVRvQmVVcGRhdGVkLmZyb21EYXRlLmRheSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHRvRGF0ZSA9IHtcclxuICAgICAgICAgICAgeWVhcjogY3VycmVudFNlbGVjdGVkRGF0ZVRvQmVVcGRhdGVkLnRvRGF0ZS55ZWFyLFxyXG4gICAgICAgICAgICBtb250aDogY3VycmVudFNlbGVjdGVkRGF0ZVRvQmVVcGRhdGVkLnRvRGF0ZS5tb250aCxcclxuICAgICAgICAgICAgZGF5OiBjdXJyZW50U2VsZWN0ZWREYXRlVG9CZVVwZGF0ZWQudG9EYXRlLmRheSxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAoaXNFcXVhbChtaW5EYXRlLCBmcm9tRGF0ZSkgJiYgaXNFcXVhbChtYXhEYXRlLCB0b0RhdGUpICYmIHRoaXMuaW5pdGlhbFZhbHVlTWFwLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRTZWxlY3RlZERhdGVUb0JlVXBkYXRlZCA9IHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRTZWxlY3RlZERhdGVUb0JlVXBkYXRlZC5mcm9tRGF0ZSA9IGRheWpzKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydE5nYkRhdGVUb01vbWVudChjdXJyZW50U2VsZWN0ZWREYXRlVG9CZVVwZGF0ZWQuZnJvbURhdGUpLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBjdXJyZW50U2VsZWN0ZWREYXRlVG9CZVVwZGF0ZWQudG9EYXRlID0gZGF5anMoXHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0TmdiRGF0ZVRvTW9tZW50KGN1cnJlbnRTZWxlY3RlZERhdGVUb0JlVXBkYXRlZC50b0RhdGUpLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRTZWxlY3RlZERhdGVUb0JlVXBkYXRlZDtcclxuICAgIH1cclxuXHJcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1TTElERVI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vXHJcblxyXG4gICAgZ2V0U2xpZGVyVHJhbnNsYXRlRnVuY1ZhbChoZWFkZXI6IHN0cmluZywgY3VycmVuY3lTZXQ6IFNldDxzdHJpbmc+KSB7XHJcbiAgICAgICAgbGV0IHRyYW5zbGF0ZUZ1bmM7XHJcblxyXG4gICAgICAgIGlmIChjdXJyZW5jeVNldC5oYXMoaGVhZGVyKSkge1xyXG4gICAgICAgICAgICB0cmFuc2xhdGVGdW5jID0gXCJjdXJyZW5jeVwiO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoaGVhZGVyID09PSBcInBvc3RlZEF1ZFBlcmNlbnRcIiB8fCBoZWFkZXIgPT09IFwicGFyZW50Um93U2hhcmVzXCIgfHwgaGVhZGVyID09PSBcInBhcmVudFJvd1B1dFBlcmNlbnRcIikge1xyXG4gICAgICAgICAgICB0cmFuc2xhdGVGdW5jID0gXCJwZXJjZW50XCI7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdHJhbnNsYXRlRnVuYyA9IFwibm9ybWFsXCI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdHJhbnNsYXRlRnVuYztcclxuICAgIH1cclxuXHJcbiAgICBnZXRTbGlkZXJPcHRpb25zKG9wdGlvbnNEYXRhOiBhbnlbXSwgdHJhbnNsYXRlRnVuYzogc3RyaW5nLCBoZWFkZXI6IHN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IG1pblZhbHVlID0gdGhpcy5yZXR1cm5NYXhBbmRNaW5WYWx1ZShvcHRpb25zRGF0YSwgaGVhZGVyLCB0cnVlKTtcclxuICAgICAgICBjb25zdCBtYXhWYWx1ZSA9IHRoaXMucmV0dXJuTWF4QW5kTWluVmFsdWUob3B0aW9uc0RhdGEsIGhlYWRlciwgZmFsc2UpO1xyXG5cclxuICAgICAgICBjb25zdCBvYmogPSB0aGlzLnNldE9wdGlvblZhbHVlcyhtaW5WYWx1ZSwgbWF4VmFsdWUpO1xyXG5cclxuICAgICAgICBpZiAodHJhbnNsYXRlRnVuYyA9PT0gXCJub3JtYWxcIikge1xyXG4gICAgICAgICAgICBvYmoudHJhbnNsYXRlID0gdGhpcy5ub3JtYWxUcmFuc2xhdGVGdW5jdGlvbjtcclxuICAgICAgICB9IGVsc2UgaWYgKHRyYW5zbGF0ZUZ1bmMgPT09IFwicGVyY2VudFwiKSB7XHJcbiAgICAgICAgICAgIG9iai50cmFuc2xhdGUgPSB0aGlzLnBlcmNlbnRUcmFuc2xhdGVGdW5jdGlvbjtcclxuICAgICAgICB9IGVsc2UgaWYgKHRyYW5zbGF0ZUZ1bmMgPT09IFwiY3VycmVuY3lcIikge1xyXG4gICAgICAgICAgICBvYmoudHJhbnNsYXRlID0gdGhpcy5jdXJyZW5jeVRyYW5zbGF0ZUZ1bmN0aW9uO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG9iajtcclxuICAgIH1cclxuXHJcbiAgICBzZXRTZWxlY3RlZFJhbmdlRm9yU2xpZGVyKGhlYWRlcjogc3RyaW5nLCBvcHRpb25zOiBPcHRpb25zKSB7XHJcbiAgICAgICAgbGV0IHNsaWRlck1pblZhbHVlO1xyXG4gICAgICAgIGxldCBzbGlkZXJNYXhWYWx1ZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmhhcyhoZWFkZXIpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkT2JqID0gdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KGhlYWRlcik7XHJcbiAgICAgICAgICAgIHNsaWRlck1pblZhbHVlID0gc2VsZWN0ZWRPYmoubWluIDwgb3B0aW9ucy5mbG9vciA/IG9wdGlvbnMuZmxvb3IgOiBzZWxlY3RlZE9iai5taW47XHJcbiAgICAgICAgICAgIHNsaWRlck1heFZhbHVlID0gc2VsZWN0ZWRPYmoubWF4IDwgb3B0aW9ucy5jZWlsID8gc2VsZWN0ZWRPYmoubWF4IDogb3B0aW9ucy5jZWlsO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNsaWRlck1pblZhbHVlID0gb3B0aW9ucy5mbG9vcjtcclxuICAgICAgICAgICAgc2xpZGVyTWF4VmFsdWUgPSBvcHRpb25zLmNlaWw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gW3NsaWRlck1pblZhbHVlLCBzbGlkZXJNYXhWYWx1ZV07XHJcbiAgICB9XHJcblxyXG4gICAgaXNWYWx1ZUluUmFuZ2Uob3B0aW9uczogT3B0aW9ucywgdmFsOiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gb3B0aW9ucy5mbG9vciA8PSB2YWwgJiYgdmFsIDw9IG9wdGlvbnMuY2VpbDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQcmV2aW91c1NlbGVjdGVkVmFsdWVGb3JTbGlkZXIoY2xvbmVkRGF0YTogYW55W10pIHtcclxuICAgICAgICBsZXQgcHJldmlvdXNTbGlkZXJEYXRhOiB7IG1pbjogYW55OyBtYXg6IGFueSB9ID0geyBtaW46IFwiXCIsIG1heDogXCJcIiB9O1xyXG5cclxuICAgICAgICBpZiAodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgcHJldmlvdXNTbGlkZXJEYXRhID0gdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pbml0aWFsVmFsdWVNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0SW5pdGlhbFZhbHVlTWFwRm9yU2xpZGVyRmlsdGVyKGNsb25lZERhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmluaXRpYWxWYWx1ZU1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICBwcmV2aW91c1NsaWRlckRhdGEgPSB0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNldEluaXRpYWxWYWx1ZU1hcEZvclNsaWRlckZpbHRlcihjbG9uZWREYXRhKTtcclxuICAgICAgICAgICAgcHJldmlvdXNTbGlkZXJEYXRhID0gdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcHJldmlvdXNTbGlkZXJEYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEluaXRpYWxWYWx1ZU1hcEZvclNsaWRlckZpbHRlcihjbG9uZWREYXRhOiBhbnlbXSkge1xyXG4gICAgICAgIGNvbnN0IG1pblZhbHVlID0gdGhpcy5yZXR1cm5NYXhBbmRNaW5WYWx1ZShjbG9uZWREYXRhLCB0aGlzLnNlbGVjdGVkUmFkaW8sIHRydWUpO1xyXG4gICAgICAgIGNvbnN0IG1heFZhbHVlID0gdGhpcy5yZXR1cm5NYXhBbmRNaW5WYWx1ZShjbG9uZWREYXRhLCB0aGlzLnNlbGVjdGVkUmFkaW8sIGZhbHNlKTtcclxuICAgICAgICBjb25zdCBzbGlkZXJEYXRhID0geyBtaW46IG1pblZhbHVlLCBtYXg6IG1heFZhbHVlIH07XHJcbiAgICAgICAgdGhpcy5pbml0aWFsVmFsdWVNYXAuc2V0KHRoaXMuc2VsZWN0ZWRSYWRpbywgc2xpZGVyRGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q3VycmVudFNlbGVjdGVkVmFsdWVGb3JTbGlkZXIobWluRW50ZXJlZFZhbDogbnVtYmVyLCBtYXhFbnRlcmVkVmFsOiBudW1iZXIsIG9wdGlvbnM6IE9wdGlvbnMpIHtcclxuICAgICAgICBsZXQgY3VycmVudFNsaWRlckRhdGE6IHsgbWluOiBhbnk7IG1heDogYW55IH0gPSB7IG1pbjogbnVsbCwgbWF4OiBudWxsIH07XHJcbiAgICAgICAgaWYgKG1heEVudGVyZWRWYWwgfHwgbWF4RW50ZXJlZFZhbCA9PT0gMCkge1xyXG4gICAgICAgICAgICBjdXJyZW50U2xpZGVyRGF0YS5tYXggPSBtYXhFbnRlcmVkVmFsO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRTbGlkZXJEYXRhLm1heCA9IG9wdGlvbnMuY2VpbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChtaW5FbnRlcmVkVmFsIHx8IG1pbkVudGVyZWRWYWwgPT09IDApIHtcclxuICAgICAgICAgICAgY3VycmVudFNsaWRlckRhdGEubWluID0gbWluRW50ZXJlZFZhbDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjdXJyZW50U2xpZGVyRGF0YS5taW4gPSBvcHRpb25zLmZsb29yO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBjdXJyZW50U2xpZGVyRGF0YS5taW4gPT09IG9wdGlvbnMuZmxvb3IgJiZcclxuICAgICAgICAgICAgY3VycmVudFNsaWRlckRhdGEubWF4ID09PSBvcHRpb25zLmNlaWwgJiZcclxuICAgICAgICAgICAgdGhpcy5pbml0aWFsVmFsdWVNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbylcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgY3VycmVudFNsaWRlckRhdGEgPSB0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBjdXJyZW50U2xpZGVyRGF0YTtcclxuICAgIH1cclxuXHJcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09VElNRT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vXHJcbiAgICBnZXRTZWxlY3RlZFRpbWVSYW5nZShoZWFkZXI6IHN0cmluZywgY2xvbmVkRGF0YTogYW55W10pIHtcclxuICAgICAgICBsZXQgc2VsZWN0ZWRGcm9tVGltZTogYW55W107XHJcbiAgICAgICAgbGV0IHNlbGVjdGVkVG9UaW1lOiBhbnlbXTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmhhcyhoZWFkZXIpKSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkRnJvbVRpbWUgPSB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQoaGVhZGVyKS5mcm9tVGltZTtcclxuICAgICAgICAgICAgc2VsZWN0ZWRUb1RpbWUgPSB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQoaGVhZGVyKS50b1RpbWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRJbml0aWFsVmFsdWVNYXBGb3JUaW1lRmlsdGVyKGNsb25lZERhdGEsIGhlYWRlcik7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkRnJvbVRpbWUgPSB0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQoaGVhZGVyKS5mcm9tVGltZTtcclxuICAgICAgICAgICAgc2VsZWN0ZWRUb1RpbWUgPSB0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQoaGVhZGVyKS50b1RpbWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2VsZWN0ZWRGcm9tVGltZSAhPT0gdW5kZWZpbmVkIHx8IHNlbGVjdGVkVG9UaW1lICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgc2VsZWN0ZWRGcm9tVGltZSA9IEFubmFEYXRlVGltZUZvcm1hdFNlcnZpY2UuZm9ybWF0VG9Ud2VsdmVIcnMoc2VsZWN0ZWRGcm9tVGltZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkVG9UaW1lID0gQW5uYURhdGVUaW1lRm9ybWF0U2VydmljZS5mb3JtYXRUb1R3ZWx2ZUhycyhzZWxlY3RlZFRvVGltZSwgdHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc2VsZWN0ZWRGcm9tVGltZSA9IFtcIi1cIiwgXCItXCIsIFwiLVwiXTtcclxuICAgICAgICAgICAgc2VsZWN0ZWRUb1RpbWUgPSBbXCItXCIsIFwiLVwiLCBcIi1cIl07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gW3NlbGVjdGVkRnJvbVRpbWUsIHNlbGVjdGVkVG9UaW1lXTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRJbml0aWFsVmFsdWVNYXBGb3JUaW1lRmlsdGVyKGNsb25lZERhdGE6IGFueVtdLCBrZXk6IHN0cmluZykge1xyXG4gICAgICAgIGlmIChrZXkgPT09IFwic3RhcnRFbmRUaW1lXCIgfHwga2V5ID09PSBcIlRpbWVCYW5kXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRJbml0aWFsVmFsdWVGb3JTdGFydEFuZEVuZFRpbWVSYW5nZShjbG9uZWREYXRhLCBrZXkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0SW5pdGlhbFZhbHVlRm9yU3RhcnRPckVuZFRpbWVSYW5nZShjbG9uZWREYXRhLCBrZXkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyB1c2UgZm9yIGZpbHRlciB3aGVyZSB3ZSBoYXZlIHN0YXJ0IGFuZCBlbmQgdGltZSByYW5nZSBpbiBvbmUgZmlsdGVyXHJcbiAgICAvLyBzdGFydEVuZFRpbWU6IFtcIjYgLSA3QVwiLCBcIjA2OiAwMCA6IDAwXCIgLCBcIjA3OjAwOjAwXCJdXHJcbiAgICBzZXRJbml0aWFsVmFsdWVGb3JTdGFydEFuZEVuZFRpbWVSYW5nZShjbG9uZWREYXRhOiBhbnlbXSwga2V5OiBzdHJpbmcpIHtcclxuICAgICAgICBjb25zdCBpbmNsdWRlTXVsdGkgPSBjbG9uZWREYXRhLmZpbmRJbmRleCgob2JqKSA9PiBvYmpba2V5XVswXSA9PT0gXCI8bXVsdGk+XCIpICE9PSAtMTtcclxuICAgICAgICBjb25zdCBpbmNsdWRlWmVybyA9IGNsb25lZERhdGEuZmluZEluZGV4KChvYmopID0+IG9ialtrZXldWzBdID09PSBcIjBcIikgIT09IC0xO1xyXG4gICAgICAgIGNvbnN0IGluY2x1ZGVUaW1lUmFuZ2UgPSBjbG9uZWREYXRhLmZpbmRJbmRleCgob2JqKSA9PiBvYmpba2V5XVswXSAhPT0gXCIwXCIgJiYgb2JqW2tleV1bMF0gIT09IFwiPG11bHRpPlwiKSAhPT0gLTE7XHJcblxyXG4gICAgICAgIGNvbnN0IGZpbHRlcmVkU3RhcnRUaW1lID0gY2xvbmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gIVtcIlwiLCBcIi1cIiwgbnVsbCwgXCIwXCIsIFwiPG11bHRpPlwiXS5pbmNsdWRlcyhvYmouc3RhcnRUaW1lKSk7XHJcbiAgICAgICAgY29uc3QgZmlsdGVyZWRFbmRUaW1lID0gY2xvbmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gIVtcIlwiLCBcIi1cIiwgbnVsbCwgXCIwXCIsIFwiPG11bHRpPlwiXS5pbmNsdWRlcyhvYmouZW5kVGltZSkpO1xyXG5cclxuICAgICAgICBjb25zdCBzdGFydFRpbWVBcnIgPSBtYXAoZmlsdGVyZWRTdGFydFRpbWUsIFwic3RhcnRUaW1lXCIpO1xyXG4gICAgICAgIGNvbnN0IGVuZFRpbWVBcnIgPSBtYXAoZmlsdGVyZWRFbmRUaW1lLCBcImVuZFRpbWVcIik7XHJcblxyXG4gICAgICAgIHN0YXJ0VGltZUFyci5zb3J0KChhLCBiKSA9PiB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5zb3J0QnlUaW1lQXNjZW5kaW5nKGEsIGIpKTtcclxuXHJcbiAgICAgICAgZW5kVGltZUFyci5zb3J0KChhLCBiKSA9PiB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5zb3J0QnlUaW1lRGVzY2VuZGluZyhhLCBiKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IG9iaiA9IHtcclxuICAgICAgICAgICAgZnJvbVRpbWU6IHN0YXJ0VGltZUFyclswXSxcclxuICAgICAgICAgICAgdG9UaW1lOiBlbmRUaW1lQXJyWzBdLFxyXG4gICAgICAgICAgICBpbmNsdWRlTXVsdGksXHJcbiAgICAgICAgICAgIGluY2x1ZGVaZXJvLFxyXG4gICAgICAgICAgICBpbmNsdWRlVGltZVJhbmdlLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLnNldChrZXksIG9iaik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdXNlIGZvciB0aGUgZmlsdGVycyB3aGVyZSB3ZSBoYXZlIGRpZmZlcmVudCBmaWx0ZXIgZm9yIHN0YXJ0IGFuZCBlbmQgdGltZVxyXG4gICAgLy8gc3RhcnRUaW1lOiBcIjA2OjAwOjAwXCJcclxuICAgIHNldEluaXRpYWxWYWx1ZUZvclN0YXJ0T3JFbmRUaW1lUmFuZ2UoY2xvbmVkRGF0YTogYW55W10sIGtleTogc3RyaW5nKSB7XHJcbiAgICAgICAgY29uc3QgaW5jbHVkZU11bHRpID0gY2xvbmVkRGF0YS5maW5kSW5kZXgoKG9iaikgPT4gb2JqW2tleV0gPT09IFwiPG11bHRpPlwiKSAhPT0gLTE7XHJcbiAgICAgICAgY29uc3QgaW5jbHVkZVplcm8gPSBjbG9uZWREYXRhLmZpbmRJbmRleCgob2JqKSA9PiBvYmpba2V5XSA9PT0gXCIwXCIpICE9PSAtMTtcclxuICAgICAgICBjb25zdCBpbmNsdWRlVGltZVJhbmdlID0gY2xvbmVkRGF0YS5maW5kSW5kZXgoKG9iaikgPT4gb2JqW2tleV0gIT09IFwiMFwiICYmIG9ialtrZXldICE9PSBcIjxtdWx0aT5cIikgIT09IC0xO1xyXG5cclxuICAgICAgICBjb25zdCBkYXRhID0gY2xvbmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gIVtcIlwiLCBcIi1cIiwgbnVsbCwgXCIwXCIsIFwiPG11bHRpPlwiXS5pbmNsdWRlcyhvYmpba2V5XSkpO1xyXG5cclxuICAgICAgICBjb25zdCB0aW1lQXJyID0gbWFwKGRhdGEsIGtleSk7XHJcbiAgICAgICAgdGltZUFyci5zb3J0KChhLCBiKSA9PiB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5zb3J0QnlUaW1lQXNjZW5kaW5nKGEsIGIpKTtcclxuXHJcbiAgICAgICAgY29uc3Qgb2JqID0ge1xyXG4gICAgICAgICAgICBmcm9tVGltZTogdGltZUFyclswXSxcclxuICAgICAgICAgICAgdG9UaW1lOiB0aW1lQXJyW3RpbWVBcnIubGVuZ3RoIC0gMV0sXHJcbiAgICAgICAgICAgIGluY2x1ZGVNdWx0aSxcclxuICAgICAgICAgICAgaW5jbHVkZVplcm8sXHJcbiAgICAgICAgICAgIGluY2x1ZGVUaW1lUmFuZ2UsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0aWFsVmFsdWVNYXAuc2V0KGtleSwgb2JqKTtcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3RVbnNlbGVjdFRpbWVGaWx0ZXJDaGVja2JveChrZXk6IHN0cmluZywgb3B0aW9uc0RhdGE6IGFueVtdKSB7XHJcbiAgICAgICAgbGV0IHNob3dNdWx0aVRpbWVDaGVja2JveCA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBzaG93WmVyb1RpbWVDaGVja2JveCA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBzaG93RW50ZXJUaW1lQ2hlY2tib3ggPSBmYWxzZTtcclxuICAgICAgICBsZXQgbXVsdGlUaW1lQ2hlY2tib3hDaGVja2VkID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IHplcm9UaW1lQ2hlY2tib3hDaGVja2VkID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IGVudGVyVGltZUNoZWNrYm94Q2hlY2tlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICBsZXQgc2VsZWN0ZWRUaW1lT2JqO1xyXG5cclxuICAgICAgICBpZiAodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKGtleSkpIHtcclxuICAgICAgICAgICAgc2VsZWN0ZWRUaW1lT2JqID0gdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KGtleSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc2VsZWN0ZWRUaW1lT2JqID0gdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KGtleSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgdGltZUFycjogc3RyaW5nW107XHJcbiAgICAgICAgaWYgKGtleSA9PT0gXCJzdGFydEVuZFRpbWVcIiB8fCBrZXkgPT09IFwiVGltZUJhbmRcIikge1xyXG4gICAgICAgICAgICB0aW1lQXJyID0gb3B0aW9uc0RhdGEubWFwKChpdGVtKSA9PiBpdGVtW2tleV1bMF0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRpbWVBcnIgPSBvcHRpb25zRGF0YS5tYXAoKGl0ZW0pID0+IGl0ZW1ba2V5XSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGltZUFyci5maW5kSW5kZXgoKHZhbCkgPT4gdmFsID09PSBcIjBcIikgIT09IC0xKSB7XHJcbiAgICAgICAgICAgIHNob3daZXJvVGltZUNoZWNrYm94ID0gdHJ1ZTtcclxuICAgICAgICAgICAgemVyb1RpbWVDaGVja2JveENoZWNrZWQgPSBzZWxlY3RlZFRpbWVPYmouaW5jbHVkZVplcm87XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGltZUFyci5maW5kSW5kZXgoKHZhbCkgPT4gdmFsID09PSBcIjxtdWx0aT5cIikgIT09IC0xKSB7XHJcbiAgICAgICAgICAgIHNob3dNdWx0aVRpbWVDaGVja2JveCA9IHRydWU7XHJcbiAgICAgICAgICAgIG11bHRpVGltZUNoZWNrYm94Q2hlY2tlZCA9IHNlbGVjdGVkVGltZU9iai5pbmNsdWRlTXVsdGk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2hvd1plcm9UaW1lQ2hlY2tib3ggfHwgc2hvd011bHRpVGltZUNoZWNrYm94KSB7XHJcbiAgICAgICAgICAgIHNob3dFbnRlclRpbWVDaGVja2JveCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGltZUFyci5maW5kSW5kZXgoKHZhbCkgPT4gdmFsICE9PSBcIjxtdWx0aT5cIiAmJiB2YWwgIT09IFwiMFwiKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgZW50ZXJUaW1lQ2hlY2tib3hDaGVja2VkID0gc2VsZWN0ZWRUaW1lT2JqPy5pbmNsdWRlVGltZVJhbmdlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgc2hvd011bHRpVGltZUNoZWNrYm94LFxyXG4gICAgICAgICAgICBzaG93WmVyb1RpbWVDaGVja2JveCxcclxuICAgICAgICAgICAgc2hvd0VudGVyVGltZUNoZWNrYm94LFxyXG4gICAgICAgICAgICBtdWx0aVRpbWVDaGVja2JveENoZWNrZWQsXHJcbiAgICAgICAgICAgIHplcm9UaW1lQ2hlY2tib3hDaGVja2VkLFxyXG4gICAgICAgICAgICBlbnRlclRpbWVDaGVja2JveENoZWNrZWQsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBjaGVja0lmU3RhcnRUaW1lSXNBZnRlckVuZFRpbWUoc3RhcnRUaW1lOiBzdHJpbmdbXSwgZW5kVGltZTogc3RyaW5nW10pIHtcclxuICAgICAgICBjb25zdCB0aW1lRm9ybWF0ID0gXCJISDptbTpzc1wiO1xyXG5cclxuICAgICAgICBjb25zdCBzdGFydFRpbWUyNEhyRm9ybWF0QXJyID0gdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydFRvdHdlbnR5Rm91ckhyc0Zvcm1hdChcclxuICAgICAgICAgICAgYCR7c3RhcnRUaW1lWzBdfToke3N0YXJ0VGltZVsxXX0gJHtzdGFydFRpbWVbMl19YCxcclxuICAgICAgICAgICAgdHJ1ZSxcclxuICAgICAgICApO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZTI0SHJGb3JtYXQgPSBgJHtzdGFydFRpbWUyNEhyRm9ybWF0QXJyWzBdfToke3N0YXJ0VGltZTI0SHJGb3JtYXRBcnJbMV19OjAwYDtcclxuICAgICAgICBjb25zdCBlbmRUaW1lMjRIckZvcm1hdEFyciA9IHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb3R3ZW50eUZvdXJIcnNGb3JtYXQoXHJcbiAgICAgICAgICAgIGAke2VuZFRpbWVbMF19OiR7ZW5kVGltZVsxXX0gJHtlbmRUaW1lWzJdfWAsXHJcbiAgICAgICAgICAgIHRydWUsXHJcbiAgICAgICAgKTtcclxuICAgICAgICBjb25zdCBlbmRUaW1lMjRIckZvcm1hdCA9IGAke2VuZFRpbWUyNEhyRm9ybWF0QXJyWzBdfToke2VuZFRpbWUyNEhyRm9ybWF0QXJyWzFdfTowMGA7XHJcbiAgICAgICAgcmV0dXJuIGRheWpzKHN0YXJ0VGltZTI0SHJGb3JtYXQsIHRpbWVGb3JtYXQpLmlzQWZ0ZXIoZGF5anMoZW5kVGltZTI0SHJGb3JtYXQsIHRpbWVGb3JtYXQpKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQcmV2aW91c1NlbGVjdGVkVGltZUZpbHRlcigpIHtcclxuICAgICAgICBsZXQgcHJldmlvdXNTZWxlY3RlZFRpbWVGaWx0ZXI7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkVGltZUZpbHRlciA9IHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pbml0aWFsVmFsdWVNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgcHJldmlvdXNTZWxlY3RlZFRpbWVGaWx0ZXIgPSB0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBwcmV2aW91c1NlbGVjdGVkVGltZUZpbHRlcjtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDdXJyZW50U2VsZWN0ZWRUaW1lRmlsdGVyKFxyXG4gICAgICAgIHN0YXJ0VGltZTogc3RyaW5nW10sXHJcbiAgICAgICAgZW5kVGltZTogc3RyaW5nW10sXHJcbiAgICAgICAgaW5jbHVkZU11bHRpOiBib29sZWFuLFxyXG4gICAgICAgIGluY2x1ZGVaZXJvOiBib29sZWFuLFxyXG4gICAgICAgIGluY2x1ZGVUaW1lUmFuZ2U6IGJvb2xlYW4sXHJcbiAgICApIHtcclxuICAgICAgICBjb25zdCBmcm9tVGltZTI0SHJGb3JtYXRBcnIgPSB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG90d2VudHlGb3VySHJzRm9ybWF0KFxyXG4gICAgICAgICAgICBgJHtzdGFydFRpbWVbMF19OiR7c3RhcnRUaW1lWzFdfSAke3N0YXJ0VGltZVsyXX1gLFxyXG4gICAgICAgICAgICB0cnVlLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY29uc3QgZnJvbVRpbWUyNEhyRm9ybWF0ID0gYCR7ZnJvbVRpbWUyNEhyRm9ybWF0QXJyWzBdfToke2Zyb21UaW1lMjRIckZvcm1hdEFyclsxXX06MDBgO1xyXG5cclxuICAgICAgICBjb25zdCB0b1RpbWUyNEhyRm9ybWF0QXJyID0gdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydFRvdHdlbnR5Rm91ckhyc0Zvcm1hdChcclxuICAgICAgICAgICAgYCR7ZW5kVGltZVswXX06JHtlbmRUaW1lWzFdfSAke2VuZFRpbWVbMl19YCxcclxuICAgICAgICAgICAgdHJ1ZSxcclxuICAgICAgICApO1xyXG4gICAgICAgIGNvbnN0IHRvVGltZTI0SHJGb3JtYXQgPSBgJHt0b1RpbWUyNEhyRm9ybWF0QXJyWzBdfToke3RvVGltZTI0SHJGb3JtYXRBcnJbMV19OjAwYDtcclxuXHJcbiAgICAgICAgY29uc3QgY3VycmVudFNlbGVjdGVkVGltZUZpbHRlciA9IHtcclxuICAgICAgICAgICAgZnJvbVRpbWU6IGZyb21UaW1lMjRIckZvcm1hdCxcclxuICAgICAgICAgICAgdG9UaW1lOiB0b1RpbWUyNEhyRm9ybWF0LFxyXG4gICAgICAgICAgICBpbmNsdWRlTXVsdGksXHJcbiAgICAgICAgICAgIGluY2x1ZGVaZXJvLFxyXG4gICAgICAgICAgICBpbmNsdWRlVGltZVJhbmdlLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJldHVybiBjdXJyZW50U2VsZWN0ZWRUaW1lRmlsdGVyO1xyXG4gICAgfVxyXG5cclxuICAgIGluY3JlbWVudEhvdXJJbnB1dChhcnI6IGFueVtdKSB7XHJcbiAgICAgICAgaWYgKGFyclswXSA9PT0gXCJcIikge1xyXG4gICAgICAgICAgICBhcnJbMF0gPSAxO1xyXG4gICAgICAgIH0gZWxzZSBpZiAocGFyc2VJbnQoYXJyWzBdLCAxMCkgPCAxMikge1xyXG4gICAgICAgICAgICBhcnJbMF0gPSBwYXJzZUludChhcnJbMF0sIDEwKSArIDE7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYXJyWzBdID0gMTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZGVjcmVtZW50SG91cklucHV0KGFycjogYW55W10pIHtcclxuICAgICAgICBpZiAoYXJyWzBdID09PSBcIlwiKSB7XHJcbiAgICAgICAgICAgIGFyclswXSA9IDEyO1xyXG4gICAgICAgIH0gZWxzZSBpZiAocGFyc2VJbnQoYXJyWzBdLCAxMCkgPiAxKSB7XHJcbiAgICAgICAgICAgIGFyclswXSA9IHBhcnNlSW50KGFyclswXSwgMTApIC0gMTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBhcnJbMF0gPSAxMjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaW5jcmVtZW50TWludXRlSW5wdXQoYXJyOiBhbnlbXSkge1xyXG4gICAgICAgIC8vIGluY3JlbWVudCB0byBuZWFyZXN0IHByb3BlciBpbnRlcnZhbCgxNSwzMCw0NSlcclxuICAgICAgICBjb25zdCBtaW51dGUgPSBwYXJzZUludChhcnJbMV0sIDEwKTtcclxuICAgICAgICBpZiAobWludXRlIDw9IDE0KSB7XHJcbiAgICAgICAgICAgIGFyclsxXSA9IFwiMTVcIjtcclxuICAgICAgICB9IGVsc2UgaWYgKG1pbnV0ZSA+PSAxNSAmJiBtaW51dGUgPD0gMjkpIHtcclxuICAgICAgICAgICAgYXJyWzFdID0gXCIzMFwiO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobWludXRlID49IDMwICYmIG1pbnV0ZSA8PSA0NCkge1xyXG4gICAgICAgICAgICBhcnJbMV0gPSBcIjQ1XCI7XHJcbiAgICAgICAgfSBlbHNlIGlmIChtaW51dGUgPj0gNDUpIHtcclxuICAgICAgICAgICAgYXJyWzFdID0gXCIwMFwiO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBkZWNyZW1lbnRNaW51dGVJbnB1dChhcnI6IGFueSkge1xyXG4gICAgICAgIGNvbnN0IG1pbnV0ZSA9IHBhcnNlSW50KGFyclsxXSwgMTApO1xyXG4gICAgICAgIGlmIChtaW51dGUgPiAwICYmIG1pbnV0ZSA8PSAxNSkge1xyXG4gICAgICAgICAgICBhcnJbMV0gPSBcIjAwXCI7XHJcbiAgICAgICAgfSBlbHNlIGlmIChtaW51dGUgPj0gMTYgJiYgbWludXRlIDw9IDMwKSB7XHJcbiAgICAgICAgICAgIGFyclsxXSA9IFwiMTVcIjtcclxuICAgICAgICB9IGVsc2UgaWYgKG1pbnV0ZSA+PSAzMSAmJiBtaW51dGUgPD0gNDUpIHtcclxuICAgICAgICAgICAgYXJyWzFdID0gXCIzMFwiO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobWludXRlID4gNDUgfHwgbWludXRlID09PSAwKSB7XHJcbiAgICAgICAgICAgIGFyclsxXSA9IFwiNDVcIjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaW5jcmVtZW50T3JEZWNyZW1lbnRIb3VyKGluY3JlbWVudDogYm9vbGVhbiwgdGltZTogc3RyaW5nW10pIHtcclxuICAgICAgICBpZiAoaW5jcmVtZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5jcmVtZW50SG91cklucHV0KHRpbWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGVjcmVtZW50SG91cklucHV0KHRpbWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpbmNyZW1lbnRPckRlY3JlbWVudE1pbihpbmNyZW1lbnQ6IGJvb2xlYW4sIHRpbWU6IHN0cmluZ1tdKSB7XHJcbiAgICAgICAgaWYgKGluY3JlbWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLmluY3JlbWVudE1pbnV0ZUlucHV0KHRpbWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGVjcmVtZW50TWludXRlSW5wdXQodGltZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlzSG91clZhbHVlSW52YWxpZChocjogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIGhyLmxlbmd0aCA9PT0gMCB8fCAhK2hyIHx8IHBhcnNlSW50KGhyLCAxMCkgPCAxIHx8IHBhcnNlSW50KGhyLCAxMCkgPiAxMiB8fCBoci5pbmNsdWRlcyhcIi5cIik7XHJcbiAgICB9XHJcblxyXG4gICAgaXNNaW51dGVWYWx1ZUludmFsaWQobWludXRlOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICBtaW51dGUubGVuZ3RoICE9PSAyIHx8XHJcbiAgICAgICAgICAgICghK21pbnV0ZSAmJiBtaW51dGUgIT09IFwiMDBcIikgfHxcclxuICAgICAgICAgICAgcGFyc2VJbnQobWludXRlLCAxMCkgPCAwIHx8XHJcbiAgICAgICAgICAgIHBhcnNlSW50KG1pbnV0ZSwgMTApID4gNTkgfHxcclxuICAgICAgICAgICAgbWludXRlLmluY2x1ZGVzKFwiLlwiKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVNPUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vL1xyXG4gICAgdXBkYXRlU29ydE1hcCh0ZW1wU29ydE9yZGVyOiBTb3J0VHlwZSwgdGFibGVEYXRhOiBhbnlbXSwgaXNMdXJBbmRDc3JDb21wb25lbnQ6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS5jb2x1bW5Tb3J0U3RhdGUgPSBuZXcgTWFwKCk7XHJcbiAgICAgICAgdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlLnNldCh0aGlzLnNlbGVjdGVkUmFkaW8sIHRlbXBTb3J0T3JkZXIpO1xyXG4gICAgICAgIGNvbnN0IHNvcnRlZFRhYmxlRGF0YSA9IHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmFwcGx5U29ydGluZyhcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvLFxyXG4gICAgICAgICAgICB0ZW1wU29ydE9yZGVyLFxyXG4gICAgICAgICAgICB0YWJsZURhdGEsXHJcbiAgICAgICAgICAgIGlzTHVyQW5kQ3NyQ29tcG9uZW50LFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgcmV0dXJuIHNvcnRlZFRhYmxlRGF0YTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBGaWx0ZXIgaWNvbiBhbGlnbm1lbnQgdG8gYmlnZ2VyIGVsZW1lbnQgaW4gdXBwYXIgYW5kIGxvd2VyIGhlYWRlclxyXG4gICAgc2V0TWFyZ2luTGVmdEZvckZpbHRlckljb24odGhFbGVtZW50czogUXVlcnlMaXN0PEVsZW1lbnRSZWY+KSB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudEFyciA9IHRoRWxlbWVudHMudG9BcnJheSgpO1xyXG4gICAgICAgIGVsZW1lbnRBcnIuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjaGlsZERpdkVsZW1lbnRzID0gaXRlbS5uYXRpdmVFbGVtZW50LmNoaWxkcmVuO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNoaWxkRGl2RWxlbWVudHMubGVuZ3RoID09PSAyKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdFBhcmFncmFwaE9mZnNldFdpZHRoOiBudW1iZXIgPSBjaGlsZERpdkVsZW1lbnRzWzBdPy5jaGlsZHJlblswXT8ub2Zmc2V0V2lkdGhcclxuICAgICAgICAgICAgICAgICAgICA/IGNoaWxkRGl2RWxlbWVudHNbMF0/LmNoaWxkcmVuWzBdPy5vZmZzZXRXaWR0aFxyXG4gICAgICAgICAgICAgICAgICAgIDogMDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNlY29uZFBhcmFncmFwaE9mZnNldFdpZHRoOiBudW1iZXIgPSBjaGlsZERpdkVsZW1lbnRzWzFdLmNoaWxkcmVuWzBdPy5vZmZzZXRXaWR0aFxyXG4gICAgICAgICAgICAgICAgICAgID8gY2hpbGREaXZFbGVtZW50c1sxXS5jaGlsZHJlblswXT8ub2Zmc2V0V2lkdGhcclxuICAgICAgICAgICAgICAgICAgICA6IDA7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0UGFyYWdyYXBoT2Zmc2V0V2lkdGggPiBzZWNvbmRQYXJhZ3JhcGhPZmZzZXRXaWR0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpZmYgPSBmaXJzdFBhcmFncmFwaE9mZnNldFdpZHRoIC0gc2Vjb25kUGFyYWdyYXBoT2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkRGl2RWxlbWVudHNbMF0uY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkRGl2RWxlbWVudHNbMF0uY2hpbGRyZW5bMV0uc3R5bGUubWFyZ2luTGVmdCA9IGAkezR9cHhgO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkRGl2RWxlbWVudHNbMV0uY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkRGl2RWxlbWVudHNbMV0uY2hpbGRyZW5bMV0uc3R5bGUubWFyZ2luTGVmdCA9IGAke2RpZmYgKyA0fXB4YDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpZmYgPSBzZWNvbmRQYXJhZ3JhcGhPZmZzZXRXaWR0aCAtIGZpcnN0UGFyYWdyYXBoT2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkRGl2RWxlbWVudHNbMF0uY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkRGl2RWxlbWVudHNbMF0uY2hpbGRyZW5bMV0uc3R5bGUubWFyZ2luTGVmdCA9IGAke2RpZmYgKyA0fXB4YDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZERpdkVsZW1lbnRzWzFdLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZERpdkVsZW1lbnRzWzFdLmNoaWxkcmVuWzFdLnN0eWxlLm1hcmdpbkxlZnQgPSBgJHs0fXB4YDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBjaGVja0lmVW5pcXVlVmFsdWVQcmVzZW50Rm9yVGhlSGVhZGVyKFxyXG4gICAgICAgIGhlYWRlcjogSUhlYWRlckluZm8sXHJcbiAgICAgICAgZW5hYmxlZEhlYWRlcnM6IGFueVtdLFxyXG4gICAgICAgIHRhYmxlRGF0YTogYW55W10sXHJcbiAgICAgICAgY2xvbmVkVGFibGVEYXRhOiBhbnlbXSxcclxuICAgICkge1xyXG4gICAgICAgIGhlYWRlci5maWx0ZXJTb3J0T2JqZWN0S2V5cy5mb3JFYWNoKChpdGVtOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZGF0YVRvQ2hlY2sgPSB0aGlzLmdldEZpbHRlck9wdGlvbnNEYXRhKHRhYmxlRGF0YSwgY2xvbmVkVGFibGVEYXRhLCBpdGVtKTtcclxuICAgICAgICAgICAgaWYgKGl0ZW0gPT09IFwicGVyaW9kXCIpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHVuaXFTdGFydERhdGUgPSB1bmlxKGRhdGFUb0NoZWNrLm1hcCgodTogeyBbeDogc3RyaW5nXTogYW55IH0pID0+IHUuc3RhcnREYXRlKSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB1bmlxRW5kRGF0ZSA9IHVuaXEoZGF0YVRvQ2hlY2subWFwKCh1OiB7IFt4OiBzdHJpbmddOiBhbnkgfSkgPT4gdS5lbmREYXRlKSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgdW5pcVN0YXJ0RGF0ZS5sZW5ndGggPiAxIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgdW5pcUVuZERhdGUubGVuZ3RoID4gMSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNUb29sdGlwQWN0aXZlKFtpdGVtXSwgdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlKVxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5hYmxlZEhlYWRlcnMucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IGRhdGFUb0NoZWNrLm1hcCgodTogeyBbeDogc3RyaW5nXTogYW55IH0pID0+IHVbaXRlbV0pO1xyXG4gICAgICAgICAgICAgICAgLy8gaWYgbGFzdCBhcHBsaWVkIGZpbHRlciBpcyB0aGlzIGhlYWRlciwgcHVzaCBpdCBhbG9zIGFzIGVuYWJsZWRIZWFkZXJcclxuICAgICAgICAgICAgICAgIGxldCBhY3RpdmVBbmRMYXN0bHlBcHBsaWVkSGVhZGVyID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbGllZEZpbHRlcnNBcnJheS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5W3RoaXMuYXBwbGllZEZpbHRlcnNBcnJheS5sZW5ndGggLSAxXSA9PT0gaXRlbVxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlQW5kTGFzdGx5QXBwbGllZEhlYWRlciA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoaGVhZGVyLmZpbHRlciA9PT0gXCJDSEVDS0JPWFwiICYmICh1bmlxKHZhbHVlcykubGVuZ3RoID4gMSB8fCBhY3RpdmVBbmRMYXN0bHlBcHBsaWVkSGVhZGVyKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYWJsZWRIZWFkZXJzLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlci5maWx0ZXIgIT09IFwiQ0hFQ0tCT1hcIiAmJlxyXG4gICAgICAgICAgICAgICAgICAgICh1bmlxKHZhbHVlcykuZmlsdGVyKChuKSA9PiBuICE9IG51bGwgJiYgbiAhPT0gXCItXCIpLmxlbmd0aCA+IDEgfHwgYWN0aXZlQW5kTGFzdGx5QXBwbGllZEhlYWRlcilcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYWJsZWRIZWFkZXJzLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBkaXNhYmxlRW5hYmxlRWFjaENvbHVtblRvb2x0aXBJY29uKHRhYmxlSGVhZGVyczogSUd0VGFibGVIZWFkZXJbXSwgdGFibGVEYXRhOiBhbnlbXSwgY2xvbmVkVGFibGVEYXRhOiBhbnlbXSkge1xyXG4gICAgICAgIHRhYmxlSGVhZGVycy5mb3JFYWNoKChoZWFkZXIpID0+IHtcclxuICAgICAgICAgICAgaGVhZGVyLmhlYWRlckluZm8uZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0uc2hvd1Rvb2x0aXBJY29uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uZGlzYWJsZVRvb2x0aXBJY29uID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5maWx0ZXJTb3J0T2JqZWN0S2V5cy5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGF0ZXN0RmlsdGVycyA9IHRoaXMuYXBwbGllZEZpbHRlcnNBcnJheTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVzdEZpbHRlcnMubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5kaXNhYmxlVG9vbHRpcEljb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVzdEZpbHRlcnNbbGF0ZXN0RmlsdGVycy5sZW5ndGggLSAxXSA9PT0ga2V5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5kaXNhYmxlVG9vbHRpcEljb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uZGlzYWJsZVRvb2x0aXBJY29uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ID09PSBcInBlcmlvZFwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5pcVN0YXJ0RGF0ZSA9IHVuaXEodGFibGVEYXRhLm1hcCgodTogeyBbeDogc3RyaW5nXTogYW55IH0pID0+IHUuc3RhcnREYXRlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5pcUVuZERhdGUgPSB1bmlxKHRhYmxlRGF0YS5tYXAoKHU6IHsgW3g6IHN0cmluZ106IGFueSB9KSA9PiB1LmVuZERhdGUpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5kaXNhYmxlVG9vbHRpcEljb24gPSAhKHVuaXFTdGFydERhdGUubGVuZ3RoID4gMSB8fCB1bmlxRW5kRGF0ZS5sZW5ndGggPiAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gdGFibGVEYXRhLm1hcCgodTogeyBbeDogc3RyaW5nXTogYW55IH0pID0+IHVba2V5XSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXRlbS5maWx0ZXIgPT09IFwiQ0hFQ0tCT1hcIiAmJiB1bmlxKHZhbHVlcykubGVuZ3RoID4gMSkgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGl0ZW0uZmlsdGVyICE9PSBcIkNIRUNLQk9YXCIgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXEodmFsdWVzKS5maWx0ZXIoKG4pID0+IG4gIT0gbnVsbCAmJiBuICE9PSBcIi1cIikubGVuZ3RoID4gMSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5kaXNhYmxlVG9vbHRpcEljb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZm9yIGRhdGUgdHlwZSBvZiBmaWx0ZXJzIHdlIG5lZWQgdG8gdXBkYXRlIHRvb2x0aXAgc2VsZWN0ZWQgbWFwIHN0YXJ0IGFuZCBlbmQgZGF0ZSB2YWx1ZXMgdG8gZGF5anMgb2JqZWN0LlxyXG4gICAgdXBkYXRlRGF0ZUZpbHRlclRvb2x0aXBTZWxlY3RlZE1hcChrZXlzOiBzdHJpbmdbXSkge1xyXG4gICAgICAgIGtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcD8uaGFzKGtleSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGVSYW5nZSA9IHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldChrZXkpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChkYXRlUmFuZ2U/LmZyb21EYXRlICYmIGRhdGVSYW5nZT8udG9EYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWREYXRlT2JqOiB7IGZyb21EYXRlOiBEYXlqczsgdG9EYXRlOiBEYXlqcyB9ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmcm9tRGF0ZTogZGF5anMoZGF0ZVJhbmdlLmZyb21EYXRlKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG9EYXRlOiBkYXlqcyhkYXRlUmFuZ2UudG9EYXRlKSxcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5zZXQoa2V5LCBzZWxlY3RlZERhdGVPYmopO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuIl19